astrometry.net-0.67/000755 000765 000024 00000000000 12651446356 014573 5ustar00dstnstaff000000 000000 astrometry.net-0.67/.gitignore000644 000765 000024 00000003057 12651445460 016563 0ustar00dstnstaff000000 000000 */*.dep */*.o */*.so */deps */lib*.a */test_*-main.c gsl-an/*/*.o gsl-an/*.dSYM util/os-features-test-* */*.pyc blind/astrometry-engine blind/augment-xylist blind/build-astrometry-index blind/fits-guess-scale blind/fitscopy blind/fitsverify blind/get-wcs blind/image2xy blind/imarith blind/imcopy blind/imstat blind/listhead blind/liststruc blind/modhead blind/new-wcs blind/plot-constellations blind/plotquad blind/plotstuff blind/plotstuff_c.py blind/plotstuff_wrap.c blind/plotxy blind/solve-field blind/tablist blind/tabmerge blind/test.c blind/wcs-grab catalogs/2masstofits catalogs/build-hd-tree catalogs/ngc2000.py catalogs/ngc2000accurate.py catalogs/ngc2000entries.c catalogs/ngc2000entries.py catalogs/ngc2000names.c catalogs/ngcic-accurate-entries.c catalogs/nomadtofits catalogs/tycho2tofits catalogs/ucac3tofits catalogs/ucac4tofits catalogs/usnobtofits gsl-an/cc-out.tmp gsl-an/config.h gsl-an/config.log gsl-an/config.status gsl-an/gsl-config gsl-an/gsl.pc gsl-an/gsl.spec gsl-an/gsl_version.h gsl-an/stamp-h1 include/astrometry/os-features-config.h libkd/checktree libkd/deps libkd/fix-bb sdss/cutils.py sdss/cutils_wrap.c util/an-fitstopnm util/an-pnmtofits util/an_build_ext.pyc util/downsample-fits util/fit-wcs util/fits-column-merge util/fits-flip-endian util/fitsgetext util/get-healpix util/hpsplit util/makefile.os-features util/os-features-makefile.log util/os-features.log util/pad-file util/query-starkd util/search-index util/subtable util/tabsort util/util.py util/util_wrap.c util/wcs-rd2xy util/wcs-resample util/wcs-to-tan util/wcs-xy2rd util/wcsinfo astrometry.net-0.67/.travis.yml000644 000765 000024 00000001555 12651445460 016705 0ustar00dstnstaff000000 000000 # Travis-CI.org build script # use the new containerized infrastructure sudo: false language: c compiler: - gcc - clang # Apparently the wcslib version they have (4.8.3) doesn't use pkg-config # And netpbm include files are right in /usr/include, not in /usr/include/netpbm script: - export WCSLIB_INC="-I/usr/include/wcslib-4.8.3" - export WCSLIB_LIB="-lwcs" - make - make py - make extra - make test - (cd util; ./test) - (cd blind; ./test) - (cd libkd; ./test) # install: # - sudo apt-get update -qq # - sudo apt-get install -y libnetpbm10 libnetpbm10-dev wcslib-dev libcfitsio3 libcfitsio3-dev python-numpy swig gsl-bin libgsl0-dev addons: apt: packages: - libnetpbm10 - libnetpbm10-dev - wcslib-dev - libcfitsio3 - libcfitsio3-dev - python-numpy - swig - gsl-bin - libgsl10-dev astrometry.net-0.67/__init__.py000644 000765 000024 00000000000 12651445460 016665 0ustar00dstnstaff000000 000000 astrometry.net-0.67/astrometry000755 000765 000024 00000000000 12651445460 016773 2.ustar00dstnstaff000000 000000 astrometry.net-0.67/blind/000755 000765 000024 00000000000 12651446354 015661 5ustar00dstnstaff000000 000000 astrometry.net-0.67/catalogs/000755 000765 000024 00000000000 12651445460 016363 5ustar00dstnstaff000000 000000 astrometry.net-0.67/Changelog000644 000765 000024 00000002317 12651445460 016403 0ustar00dstnstaff000000 000000 0.64: Minor; add sip_scale. Tag for legacysurvey.org Data Release 2. 0.63: Additional minor changes for Debian packaging. 0.62: More relicensing with permission from contributors; remove radix.c 0.61: Minor changes for Debian packaging. 0.60: Relicense most of the Astrometry.net code proper under a BSD-3 license. Whole package still under GPL-3+ thanks to GNU gsl. 0.57: Makefile fixes: create dirs before install; propagate build flags Add man pages from Ole Streicher Some py3 friendliness Add timingpool.py 0.56: implement anwcs_write_to Makefile files for install-indexes add -std=gnu89 to default CFLAGS add clip_wcs() method 0.55: Fix bug in WCS numpy array iterators 0.54: Try importing pyfits and then astropy.io.fits 0.53: Update wcs-pv2sip and include in default build Fixes for git version strings Read and write linear SIP distortion terms multiindex: don't assert when reloading already-loaded file 0.52: Fix release version strings in released versions. 0.51: Fix half-pixel bug in "solve-field --crpix-center": the center was set to 1 + {W,H}/2, not 0.5 + {W,H}/2. (The WCS was still correct, the CRPIX was set to a half pixel in each dimension away from the center pixel. astrometry.net-0.67/configure000755 000765 000024 00000000030 12651445460 016466 0ustar00dstnstaff000000 000000 #! /bin/bash echo "Ok" astrometry.net-0.67/CREDITS000644 000765 000024 00000005174 12651445460 015615 0ustar00dstnstaff000000 000000 This file lists some of the code we've imported from elsewhere. First, the obvious ones: -gsl-an/ GSL (the GNU Scientific Library) v1.11 Licensed under the GPL v3+. -qfits-an/ QFITS library v6.2, licensed under the GPL v2+. Heavily modified by us. Now, some miscellaneous files: -util/EXIF.py 3-clause BSD license. https://github.com/ianare/exif-py -util/ctmf.c (c) Simon Perreault, licensed under the GPL v3+. -util/bt.c AVL code was yoinked from GNU libavl which is under the GPL. -util/cutest.{c,h} and util/make-tests.sh Imported from cutest-1.4. Patches sent upstream 24-01-2008. http://cutest.sourceforge.net/ zlib/libpng license. -util/md5.{c,h} (c) Christophe Devine, licensed under the GPL v2+. -util/qsort_reentrant.{c,h} From FreeBSD. Distributed under the BSD license, big surprise. -sdss/sqlcl.py (c) Tamas Budavari -sdss/yanny.py (c) Ben Weaver -blind/an_mm_malloc.h (c) FSF, from GCC. GPL v3+. Imported for use by ctmf.c -blind/anet.py (c) Josh Bloom, licensed under GPL v3. -blind/{tablist,modhead,fitscopy,tabmerge,fitstomatlab,liststruc,listhead, imcopy,imarith,imstat}.c From the CFITSIO utilities web page. http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html "You may freely modify, reuse, and redistribute these programs as you wish." (fitstomatlab.c is just a modified version of tablist.c) -blind/fitsverify.c From the "fitsverify" tool, http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ -blind/pnpoly.c (c) Wm. Randolph Franklin, MIT license From http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html -libkd/an-fls.h (c) Linus Torvalds, GPL v2 Data files: -catalogs/constellation-boundaries.c IAU Constellation boundaries, in J2000, from http://vizier.cfa.harvard.edu/viz-bin/VizieR-3?-source=VI/49/bound_20 -catalogs/ngc2000{,names}.dat Imported from ftp://cdsarc.u-strasbg.fr/cats/VII/118/ NGC 2000.0, The Complete New General Catalogue and Index Catalogue of Nebulae and Star Clusters by J.L.E. Dreyer Sinnott, R.W. (edited by) Sky Publishing Corporation and Cambridge University Press (1988) Copyright Notice: This catalog is copyrighted by Sky Publishing Corporation, which has kindly deposited the machine version in the data centers for permanent archiving and dissemination to astronomers for scientific research purposes only. The data should not be used for commercial purposes without the explicit permission of Sky Publishing Corporation. -catalogs/{ic,ngc}2000_pos.txt Imported from http://www.ngcic.org/corwin/default.htm Dr. Harold G. Corwin Jr (hgcjr@ipac.caltech.edu) astrometry.net-0.67/doc/000755 000765 000024 00000000000 12651445460 015333 5ustar00dstnstaff000000 000000 astrometry.net-0.67/etc/000755 000765 000024 00000000000 12651445460 015341 5ustar00dstnstaff000000 000000 astrometry.net-0.67/include/000755 000765 000024 00000000000 12651445460 016211 5ustar00dstnstaff000000 000000 astrometry.net-0.67/libkd/000755 000765 000024 00000000000 12651445460 015653 5ustar00dstnstaff000000 000000 astrometry.net-0.67/LICENSE000644 000765 000024 00000002750 12651445460 015577 0ustar00dstnstaff000000 000000 Copyright (c) 2006-2015, Astrometry.net Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astrometry.net Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. astrometry.net-0.67/Makefile000644 000765 000024 00000030524 12651446356 016237 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Copyright 2006-2008 Dustin Lang, Keir Mierle and Sam Roweis. # Copyright 2010, 2011, 2012, 2013 Dustin Lang. # # The Astrometry.net suite 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, version 2. # # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # To set the install directory: # make install INSTALL_DIR=/path/to/dir # or see util/makefile.common # Turn off optimisation? If the following line is commented-out, the default # is to turn optimization on. See util/makefile.common for details. #export OPTIMIZE = no all: BASEDIR := . COMMON := $(BASEDIR)/util # The internal Astrometry.net dependency stack, top to bottom, is: # # blind/libastrometry.a -- astrometry.net core # catalogs/libcatalogs.a # util/libanfiles.a -- astrometry.net index files, etc # libkd/libkd.a -- kd-trees # util/libanutils.a -- utilities # gsl-an/libgsl-an.a OR system gsl -- GNU scientific library # [wcslib] -- optional # qfits-an/libqfits.a -- FITS files # util/libanbase.a -- basic stuff include $(COMMON)/makefile.common #include $(COMMON)/makefile.qfits #include $(COMMON)/makefile.cfitsio .PHONY: all all: subdirs check: pkgconfig .PHONY: check # Just check that we have pkg-config, since it's needed to get # wcslib, cfitsio, cairo, etc config information. pkgconfig: pkg-config --version || (echo -e "\nWe require the pkg-config package.\nGet it from http://www.freedesktop.org/wiki/Software/pkg-config" && false) pkg-config --modversion cfitsio || (echo -e "\nWe require cfitsio but it was not found.\nGet it from http://heasarc.gsfc.nasa.gov/fitsio/\nOr on Ubuntu/Debian, apt-get install cfitsio-dev\nOr on Mac OS / Homebrew, brew install cfitsio\n" && false) .PHONY: pkgconfig subdirs: thirdparty $(MAKE) -C util $(MAKE) -C catalogs $(MAKE) -C libkd $(MAKE) -C blind thirdparty: qfits-an # Detect GSL -- this minimum version was chosen to match the version in gsl-an. # Earlier versions would probably work fine. SYSTEM_GSL ?= $(shell (pkg-config --atleast-version=1.14 gsl && echo "yes") || echo "no") ifneq ($(SYSTEM_GSL),yes) thirdparty: gsl-an endif doc: $(MAKE) -C doc html .PHONY: doc html: .PHONY: html $(MAKE) -C doc html qfits-an: $(MAKE) -C qfits-an gsl-an: $(MAKE) -C gsl-an .PHONY: subdirs thirdparty qfits-an gsl-an # Targets that require extra libraries extra: $(MAKE) -C qfits-an $(MAKE) -C util $(MAKE) -C catalogs $(MAKE) -C blind cairo # Targets that create python bindings (requiring swig) py: thirdparty $(MAKE) -C catalogs $(MAKE) -C util pyutil $(MAKE) -C util cairoutils.o $(MAKE) -C blind pyplotstuff $(MAKE) -C libkd pyspherematch $(MAKE) -C sdss pyutil: thirdparty $(MAKE) -C util pyutil install: all report.txt $(MAKE) install-core @echo @echo The following command may fail if you don\'t have the cairo, netpbm, and @echo png libraries and headers installed. You will lose out on some eye-candy @echo but will still be able to solve images. @echo -$(MAKE) extra -($(MAKE) -C util install || echo "\nErrors in the previous make command are not fatal -- we try to build and install some optional code.\n\n") -($(MAKE) -C blind install-extra || echo "\nErrors in the previous make command are not fatal -- we try to build and install some optional code.\n\n") @echo install-core: mkdir -p '$(DATA_INSTALL_DIR)' mkdir -p '$(BIN_INSTALL_DIR)' mkdir -p '$(DOC_INSTALL_DIR)' mkdir -p '$(INCLUDE_INSTALL_DIR)' mkdir -p '$(LIB_INSTALL_DIR)' mkdir -p '$(EXAMPLE_INSTALL_DIR)' mkdir -p '$(PY_BASE_INSTALL_DIR)' mkdir -p '$(MAN1_INSTALL_DIR)' cp __init__.py '$(PY_BASE_INSTALL_DIR)' cp CREDITS LICENSE README.md report.txt '$(DOC_INSTALL_DIR)' cp demo/* '$(EXAMPLE_INSTALL_DIR)' cp man/*.1 '$(MAN1_INSTALL_DIR)' $(MAKE) -C util install-core $(MAKE) -C catalogs install $(MAKE) -C libkd install $(MAKE) -C qfits-an install $(MAKE) -C blind install $(MAKE) -C sdss install install-indexes: mkdir -p '$(DATA_INSTALL_DIR)' @for x in `ls index-*.tar.bz2 2>/dev/null`; do \ echo Installing $$x in '$(DATA_INSTALL_DIR)'...; \ echo tar xvjf $$x -C '$(DATA_INSTALL_DIR)'; \ tar xvjf $$x -C '$(DATA_INSTALL_DIR)'; \ done @for x in `ls index-*.bz2 2>/dev/null | grep -v tar.bz2 2>/dev/null`; do \ echo Installing $$x in '$(DATA_INSTALL_DIR)'...; \ echo "cp $$x '$(DATA_INSTALL_DIR)' && bunzip2 --force '$(DATA_INSTALL_DIR)/'$$x;"; \ cp $$x '$(DATA_INSTALL_DIR)' && bunzip2 --force '$(DATA_INSTALL_DIR)/'$$x; \ done @for x in `ls index-*.tar.gz 2>/dev/null`; do \ echo Installing $$x in '$(DATA_INSTALL_DIR)'...; \ echo tar xvzf $$x -C '$(DATA_INSTALL_DIR)'; \ tar xvzf $$x -C '$(DATA_INSTALL_DIR)'; \ done @for x in `ls index-*.fits 2>/dev/null`; do \ echo Installing $$x in '$(DATA_INSTALL_DIR)'...; \ echo "cp $$x '$(DATA_INSTALL_DIR)'"; \ cp $$x '$(DATA_INSTALL_DIR)'; \ done reconfig: -rm -f $(INCLUDE_DIR)/os-features-config.h util/makefile.os-features $(MAKE) -C util config .PHONY: reconfig config: util/os-features-config.h util/makefile.os-features $(MAKE) -C util config .PHONY: config RELEASE_VER := 0.67 RELEASE_DIR := astrometry.net-$(RELEASE_VER) RELEASE_RMDIRS := net release: -rm -R $(RELEASE_DIR) $(RELEASE_DIR).tar $(RELEASE_DIR).tar.gz $(RELEASE_DIR).tar.bz2 git archive --prefix $(RELEASE_DIR)/ $(RELEASE_VER) | tar x for x in $(RELEASE_RMDIRS); do \ rm -R $(RELEASE_DIR)/$$x; \ done (cd $(RELEASE_DIR)/util && swig -python -I. -I../include/astrometry util.i) (cd $(RELEASE_DIR)/blind && swig -python -I. -I../util -I../include/astrometry plotstuff.i) (cd $(RELEASE_DIR)/sdss && swig -python -I. cutils.i) cat $(RELEASE_DIR)/util/makefile.common | sed "s/AN_GIT_REVISION .=.*/AN_GIT_REVISION := $$(git describe)/" | sed "s/AN_GIT_DATE .=.*/AN_GIT_DATE := $$(git log -n 1 --format=%cd | sed 's/ /_/g')/" > $(RELEASE_DIR)/util/makefile.common.x && mv $(RELEASE_DIR)/util/makefile.common.x $(RELEASE_DIR)/util/makefile.common cat $(RELEASE_DIR)/Makefile | sed "s/RELEASE_VER := 0.67 tar cf $(RELEASE_DIR).tar $(RELEASE_DIR) gzip --best -c $(RELEASE_DIR).tar > $(RELEASE_DIR).tar.gz bzip2 --best $(RELEASE_DIR).tar tag-release: git tag -a -m "Tag version $(RELEASE_VER)" $(RELEASE_VER) git push origin $(RELEASE_VER) retag-release: -git tag -d $(RELEASE_VER) git tag -a -m "Re-tag version $(RELEASE_VER)" $(RELEASE_VER) git push origin $(RELEASE_VER) SNAPSHOT_RMDIRS := $(RELEASE_RMDIRS) .PHONY: snapshot snapshot: -rm -R snapshot snapshot.tar snapshot.tar.gz snapshot.tar.bz2 git archive --prefix snapshot/ HEAD | tar x for x in $(SNAPSHOT_RMDIRS); do \ rm -R snapshot/$$x; \ done (cd snapshot/util && swig -python -I. -I../include/astrometry util.i) (cd snapshot/blind && swig -python -I. -I../util -I../include/astrometry plotstuff.i) (cd snapshot/sdss && swig -python -I. cutils.i) SSD=astrometry.net-$(shell date -u "+%Y-%m-%d-%H:%M:%S")-$(shell git describe); \ mv snapshot $$SSD; \ tar cf snapshot.tar $$SSD; \ gzip --best -c snapshot.tar > $$SSD.tar.gz; \ bzip2 --best -c snapshot.tar > $$SSD.tar.bz2 LIBKD_RELEASE_TEMP := libkd-$(RELEASE_VER)-temp LIBKD_RELEASE_DIR := libkd-$(RELEASE_VER) LIBKD_RELEASE_SUBDIRS := qfits-an libkd doc \ CREDITS LICENSE __init__.py setup-libkd.py Makefile \ util/ioutils.c util/mathutil.c util/fitsioutils.c \ util/fitsbin.c util/an-endian.c util/fitsfile.c util/log.c util/errors.c \ util/tic.c util/bl.c util/bl-nl.c \ util/__init__.py util/starutil_numpy.py util/makefile.common \ util/makefile.anbase util/makefile.deps \ include/astrometry/anqfits.h include/astrometry/qfits_header.h \ include/astrometry/qfits_table.h include/astrometry/qfits_keywords.h \ include/astrometry/qfits_std.h include/astrometry/qfits_image.h \ include/astrometry/qfits_tools.h include/astrometry/qfits_time.h \ include/astrometry/qfits_error.h include/astrometry/qfits_memory.h \ include/astrometry/qfits_rw.h include/astrometry/qfits_card.h \ include/astrometry/qfits_convert.h include/astrometry/qfits_byteswap.h \ include/astrometry/qfits_config.h include/astrometry/qfits_md5.h \ include/astrometry/qfits_float.h \ include/astrometry/kdtree.h include/astrometry/kdtree_fits_io.h \ include/astrometry/dualtree.h include/astrometry/dualtree_rangesearch.h \ include/astrometry/dualtree_nearestneighbour.h \ include/astrometry/fitsbin.h include/astrometry/ioutils.h \ include/astrometry/mathutil.h include/astrometry/fitsioutils.h \ include/astrometry/an-endian.h include/astrometry/fitsfile.h \ include/astrometry/log.h include/astrometry/errors.h \ include/astrometry/tic.h include/astrometry/bl.inc \ include/astrometry/bl-nl.inc include/astrometry/bl.h \ include/astrometry/bl.ph include/astrometry/bl-nl.h \ include/astrometry/bl-nl.ph include/astrometry/keywords.h \ include/astrometry/an-bool.h include/astrometry/mathutil.inc \ include/astrometry/starutil.h include/astrometry/starutil.inc \ include/astrometry/an-thread.h include/astrometry/an-thread-pthreads.h \ include/astrometry/thread-specific.inc release-libkd: -rm -R $(LIBKD_RELEASE_DIR) $(LIBKD_RELEASE_DIR).tar $(LIBKD_RELEASE_DIR).tar.gz $(LIBKD_RELEASE_DIR).tar.bz2 $(LIBKD_RELEASE_TEMP) -mkdir -p $(LIBKD_RELEASE_DIR) git archive --prefix $(LIBKD_RELEASE_TEMP)/ $(RELEASE_VER) | tar x for x in $(LIBKD_RELEASE_SUBDIRS); do \ tar c -C '$(LIBKD_RELEASE_TEMP)' $$x | tar x -C $(LIBKD_RELEASE_DIR); \ done tar cf $(LIBKD_RELEASE_DIR).tar $(LIBKD_RELEASE_DIR) gzip --best -c $(LIBKD_RELEASE_DIR).tar > $(LIBKD_RELEASE_DIR).tar.gz bzip2 --best $(LIBKD_RELEASE_DIR).tar LIBKD_SNAPSHOT_DIR := snapshot-libkd LIBKD_SNAPSHOT_TEMP := libkd-snapshot-temp LIBKD_SNAPSHOT_SUBDIRS := $(LIBKD_RELEASE_SUBDIRS) snapshot-libkd: -rm -R $(LIBKD_SNAPSHOT_DIR) $(LIBKD_SNAPSHOT_DIR).tar $(LIBKD_SNAPSHOT_DIR).tar.gz $(LIBKD_SNAPSHOT_DIR).tar.bz2 $(LIBKD_SNAPSHOT_TEMP) -mkdir -p $(LIBKD_SNAPSHOT_DIR) git archive --prefix $(LIBKD_SNAPSHOT_TEMP)/ HEAD | tar x for x in $(LIBKD_SNAPSHOT_SUBDIRS); do \ tar c -C '$(LIBKD_SNAPSHOT_TEMP)' $$x | tar x -C $(LIBKD_SNAPSHOT_DIR); \ done SSD=libkd-$(shell date -u "+%Y-%m-%d-%H:%M:%S")-$(shell git describe); \ rm -R $$SSD || true; \ mv $(LIBKD_SNAPSHOT_DIR) $$SSD; \ tar cf $(LIBKD_SNAPSHOT_DIR).tar $$SSD; \ gzip --best -c $(LIBKD_SNAPSHOT_DIR).tar > $$SSD.tar.gz; \ bzip2 --best -c $(LIBKD_SNAPSHOT_DIR).tar > $$SSD.tar.bz2 .PHONY: snapshot-libkd test: $(MAKE) -C blind test $(MAKE) -C util test $(MAKE) -C catalogs test $(MAKE) -C libkd test clean: $(MAKE) -C util clean $(MAKE) -C catalogs clean -$(MAKE) -C qfits-an clean -rm __init__.pyc $(MAKE) -C gsl-an clean -rm gsl-an/config.h $(MAKE) -C libkd clean $(MAKE) -C blind clean $(MAKE) -C sdss clean realclean: clean TAGS: etags -I `find . -name "*.c" -o -name "*.h"` tags: ctags-exuberant --fields=+aiKS --c++-kinds=+p --extra=+q -I --file-scope=no -R * report: -uname -m -uname -a -uname -p -uname -s @echo "CC is $(CC)" -which $(CC) -$(CC) --version -$(MAKE) --version -$(CC) -dM -E - < /dev/null -cat /proc/cpuinfo -sysctl -a kern.ostype kern.osrelease kern.version kern.osversion hw.machine hw.model hw.ncpu hw.byteorder hw.physmem hw.cpufrequency hw.memsize hw.optional.x86_64 hw.cpu64bit_capable machdep.cpu.brand_string -free @echo "SHAREDLIBFLAGS_DEF: $(SHAREDLIBFLAGS_DEF)" @echo "FLAGS_DEF: $(FLAGS_DEF)" @echo "CFLAGS_DEF: $(CFLAGS_DEF)" @echo "LDFLAGS_DEF: $(LDFLAGS_DEF)" -python -V @echo "PYTHONPATH: $${PYTHONPATH}" @echo "PATH: $${PATH}" @echo "pkg-config --cflags cfitsio:" -pkg-config --cflags cfitsio @echo "pkg-config --libs cfitsio:" -pkg-config --libs cfitsio @echo "pkg-config --cflags cairo:" -pkg-config --cflags cairo @echo "pkg-config --libs cairo: " -pkg-config --libs cairo @echo "SYSTEM_GSL: xxx$(SYSTEM_GSL)xxx" @echo "pkg-config --modversion gsl" -pkg-config --modversion gsl @echo "pkg-config --atleast-version=1.14 gsl && echo \"yes\"" -pkg-config --atleast-version=1.14 gsl && echo yes report.txt: Makefile $(MAKE) report > $@ .SUFFIXES: # Delete the default suffixes astrometry.net-0.67/man/000755 000765 000024 00000000000 12651445460 015341 5ustar00dstnstaff000000 000000 astrometry.net-0.67/qfits-an/000755 000765 000024 00000000000 12651445460 016310 5ustar00dstnstaff000000 000000 astrometry.net-0.67/README.md000644 000765 000024 00000004742 12651445460 016054 0ustar00dstnstaff000000 000000 Astrometry.net ============== [![Build Status](https://travis-ci.org/dstndstn/astrometry.net.png?branch=master)](https://travis-ci.org/dstndstn/astrometry.net) Automatic recognition of astronomical images; or standards-compliant astrometric metadata from data. Latest release: http://astrometry.net/downloads/astrometry.net-latest.tar.gz > If you have astronomical imaging of the sky with celestial coordinates > you do not know—or do not trust—then Astrometry.net is for you. Input > an image and we'll give you back astrometric calibration meta-data, > plus lists of known objects falling inside the field of view. > We have built this astrometric calibration service to create correct, > standards-compliant astrometric meta-data for every useful > astronomical image ever taken, past and future, in any state of > archival disarray. We hope this will help organize, annotate and make > searchable all the world's astronomical information. Copyright 2006-2015 Michael Blanton, David W. Hogg, Dustin Lang, Keir Mierle and Sam Roweis (the Astrometry.net Team). Contributions from Sjoert van Velzen, Themos Tsikas, Andrew Hood, Thomas Stibor, Denis Vida, Ole Streicher, David Warde-Farley, Jon Barron, Christopher Stumm, Michal Kočer (Klet Observatory) and others. Parts of the code written by the Astrometry.net Team are licensed under a 3-clause BSD-style license. See the file LICENSE for the full license text. However, since this code uses libraries licensed under the GNU GPL, the whole work is distributed under the GPL version 3 or later. Code development happens at http://github.com/dstndstn/astrometry.net The documentation is at http://astrometry.net/doc There is a (google group) forum at http://astrometry.net/group Additional stuff at http://astrometry.net Code snapshots and releases are at http://astrometry.net/downloads The web service is at http://nova.astrometry.net For academic use, please cite the paper: > Lang, D., Hogg, D.W., Mierle, K., Blanton, M., & Roweis, S., > 2010, > *Astrometry.net: Blind astrometric calibration of arbitrary astronomical images*, > **The Astronomical Journal** 139, 1782--1800. [Bibtex](http://astrometry.net/lang2010.bib.txt) | [Bibtex@ADS](http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2010AJ....139.1782L&data_type=BIBTEX&db_key=AST&nocookieset=1) | [arXiv](http://arxiv.org/abs/0910.2233) | [AJ](http://iopscience.iop.org/1538-3881/139/5/1782/article) | [doi:10.1088/0004-6256/139/5/1782](http://dx.doi.org/10.1088/0004-6256/139/5/1782) astrometry.net-0.67/sdss/000755 000765 000024 00000000000 12651446356 015547 5ustar00dstnstaff000000 000000 astrometry.net-0.67/setup-libkd.py000644 000765 000024 00000003372 12651445460 017370 0ustar00dstnstaff000000 000000 import os from distutils.core import setup, Extension from numpy.distutils.misc_util import get_numpy_include_dirs numpy_inc = get_numpy_include_dirs() inc = ['include', 'include/astrometry', 'util', 'qfits-an'] libkd_srcs = [ 'pyspherematch.c', 'dualtree.c', 'dualtree_rangesearch.c', 'dualtree_nearestneighbour.c', 'kdtree.c', 'kdtree_dim.c', 'kdtree_mem.c', 'kdtree_fits_io.c', 'kdint_ddd.c', 'kdint_fff.c', 'kdint_ddu.c', 'kdint_duu.c', 'kdint_dds.c', 'kdint_dss.c', ] util_srcs = [ 'ioutils.c', 'bl.c', 'mathutil.c', 'fitsioutils.c', 'fitsbin.c', 'an-endian.c', 'fitsfile.c', 'log.c', 'errors.c', 'tic.c', ] qfits_srcs = [ 'anqfits.c', 'qfits_tools.c', 'qfits_table.c', 'qfits_float.c', 'qfits_error.c', 'qfits_time.c', 'qfits_card.c', 'qfits_header.c', 'qfits_rw.c', 'qfits_memory.c', 'qfits_convert.c', 'qfits_byteswap.c', ] srcs = ([os.path.join('libkd',x) for x in libkd_srcs] + [os.path.join('util', x) for x in util_srcs] + [os.path.join('qfits-an', x) for x in qfits_srcs] ) ext = Extension('astrometry.libkd.spherematch_c', sources = srcs, include_dirs = numpy_inc + inc, ) setup(name='libkd', version='1.0', author='Dustin Lang, Keir Mierle', author_email='dstndstn@gmail.com', url='http://astrometry.net', ext_modules=[ext], py_modules=['astrometry.libkd.spherematch', 'astrometry.util.starutil_numpy', 'astrometry.__init__', 'astrometry.util.__init__', 'astrometry.libkd.__init__', ], package_dir={'astrometry':''}, data_files=[('tests', ['libkd/test_spherematch.py']),], ) astrometry.net-0.67/util/000755 000765 000024 00000000000 12651446356 015550 5ustar00dstnstaff000000 000000 astrometry.net-0.67/util/2mass_catalog.py000755 000765 000024 00000004733 12651445460 020646 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE import sys from optparse import OptionParser try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from astrometry.util.fits import * from astrometry.util.healpix import * from astrometry.util.starutil_numpy import * def get_2mass_sources(ra, dec, radius=1, basefn=None): twomass_nside = 9 if basefn is None: twomass_pat = '2mass_hp%03i.fits' else: twomass_pat = basefn hps = healpix_rangesearch(ra, dec, radius, twomass_nside) print '2MASS healpixes in range:', hps allU = None for hp in hps: fn = twomass_pat % hp print '2MASS filename:', fn U = fits_table(fn) print len(U), 'sources' I = (degrees_between(ra, dec, U.ra, U.dec) < radius) print '%i 2MASS stars within range.' % sum(I) U = U[I] if allU is None: allU = U else: allU.append(U) return allU if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-r', dest='radius', type='float', help='Search radius, in deg (default 1 deg)') parser.add_option('-b', dest='basefn', help='Base filename of 2MASS FITS files (default: 2mass_hp%03i.fits)') parser.add_option('-B', dest='band', help='Band (J, H, or K) to use for cuts') parser.set_defaults(radius=1.0, basefn=None, band='J') (opt, args) = parser.parse_args() if len(args) != 3: parser.print_help() print print 'Got extra arguments:', args sys.exit(-1) # parse RA,Dec. ra = float(args[0]) dec = float(args[1]) outfn = args[2] band = opt.band.lower() # ugh! opts = {} for k in ['radius', 'basefn']: opts[k] = getattr(opt, k) X = get_2mass_sources(ra, dec, **opts) print 'Got %i 2MASS sources.' % len(X) #print X.about() print 'Applying cuts...' I = logical_not(X.minor_planet) print 'not minor planet:', sum(I) qual = X.get(band + '_quality') # work around dumb bug where it's a single-char column rather than a byte. nobrightness = chr(0) I = logical_and(I, (qual != nobrightness)) print 'not NO_BRIGHTNESS', sum(I) print len(X) print len(X.j_cc) cc = array(X.getcolumn(band + '_cc')) ccnone = chr(0) #print 'cc shape', cc.shape #print cc[:10] #print ccnone I = logical_and(I, (cc == ccnone)) print 'CC_NONE', sum(I) X = X[I] print '%i pass cuts' % len(X) print 'Writing to', outfn X.write_to(outfn) astrometry.net-0.67/util/2mass_get.py000755 000765 000024 00000010232 12651445460 020002 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import re import sys import socket import time from urllib2 import urlopen, URLError from urllib import urlencode from urlparse import urlparse, urljoin from os.path import basename from optparse import OptionParser from xml.dom import minidom from astrometry.util.starutil_numpy import * from astrometry.util.file import * from astrometry.util.run_command import run_command # args: radius in deg # returns list of local filenames to which images were written def get_2mass_images(ra, dec, radius=1, basefn=None, band='A'): formvals = { 'type': 'at', # Atlas images (not quicklook) 'INTERSECT': 'OVERLAPS', # Images overlapping region 'asky': 'asky', # All-sky release 'POS': '%g %g' % (ra,dec), # RA,Dec position 'SIZE': '%g' % radius, # Search radius (deg) # scan, coadd, hem, date 'band': band, # 'A'=All bands; alternatives: J,H,K } if basefn is None: #basefn = '2mass-%g-%g-' % (ra,dec) basefn = '2mass-' queryurl = 'http://irsa.ipac.caltech.edu/cgi-bin/2MASS/IM/nph-im_inv' print 'submitting form values:' for k,v in formvals.items(): print ' ',k,'=',v print 'encoded as:' print ' ' + urlencode(formvals) print print 'waiting for results...' socket.setdefaulttimeout(300) f = urlopen(queryurl, urlencode(formvals)) doc = f.read() write_file(doc, 'res.html') m = re.search(r'', doc) if not m: raise 'no results page: server output written to file' resurl = m.group(1) print 'result base url', resurl resurl += 'found.xml' print 'requesting result url', resurl res = urlopen(resurl) print doc = res.read() write_file(doc, 'res2.xml') xmldoc = minidom.parseString(doc) imgs = xmldoc.getElementsByTagName('TR') if len(imgs) == 0: print 'no tags found' return None urlfns = [] for imgtag in imgs: print if not imgtag.hasChildNodes(): print ' tag has no child node:', imgtag return None #print 'Image:', imgtag tds = imgtag.getElementsByTagName('TD') if not len(tds): print ' tag has no child nodes:', imgtag return None print 'Image:', tds[0].firstChild.data print ' URL:', tds[1].firstChild.data print ' Band:', tds[11].firstChild.data print ' dataset (asky):', tds[18].firstChild.data print ' date (yymmdd):', tds[22].firstChild.data print ' hem (n/s):', tds[23].firstChild.data print ' scan:', tds[24].firstChild.data print ' image num:', tds[25].firstChild.data url = tds[1].firstChild.data band = tds[11].firstChild.data dataset = tds[18].firstChild.data date = tds[22].firstChild.data hem = tds[23].firstChild.data scan = int(tds[24].firstChild.data) imgnum = int(tds[25].firstChild.data) fn = basefn + '%s_%s_%s%s%03i%04i.fits.gz' % (band, dataset, date, hem, scan, imgnum) urlfns.append((url,fn)) fns = [] for i,(url,fn) in enumerate(urlfns): print print 'Retrieving file %i of %i' % (i+1, len(urlfns)) print # -t: num retries cmd = "wget -t 1 -c '%s' -O %s" % (url, fn) print 'Running command:', cmd rtn = os.system(cmd) # ctrl-C caught: quit, or continue? if os.WIFSIGNALED(rtn): print 'wget exited with signal', os.WTERMSIG(rtn) break if os.WIFEXITED(rtn) and os.WEXITSTATUS(rtn): # returned non-zero. print 'wget exited with value', os.WEXITSTATUS(rtn) continue fns.append(fn) return fns if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') # See http://irsa.ipac.caltech.edu/applications/2MASS/IM/inventory.html#pos parser.add_option('-r', dest='radius', type='float', help='Search radius, in deg (default 1 deg)') parser.add_option('-b', dest='basefn', help='Base filename (default: 2mass-)') parser.add_option('-B', dest='band', help='Band (J, H, K); default: all three') parser.set_defaults(radius=1.0, band='A') (opt, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Got extra arguments:', args sys.exit(-1) # parse RA,Dec. ra = float(args[0]) dec = float(args[1]) # ugh! opts = {} for k in ['radius', 'basefn', 'band']: opts[k] = getattr(opt, k) get_2mass_images(ra, dec, **opts) astrometry.net-0.67/util/__init__.py000644 000765 000024 00000000001 12651445460 017643 0ustar00dstnstaff000000 000000 astrometry.net-0.67/util/addpath.py000644 000765 000024 00000001452 12651445460 017524 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys import os def addpath(): try: import astrometry from astrometry.util.shell import shell_escape from astrometry.util.filetype import filetype_short except ImportError: me = __file__ path = os.path.realpath(me) utildir = os.path.dirname(path) assert(os.path.basename(utildir) == 'util') andir = os.path.dirname(utildir) if os.path.basename(andir) == 'astrometry': rootdir = os.path.dirname(andir) sys.path.insert(1, andir) else: # assume there's a symlink astrometry -> . rootdir = andir #sys.path += [rootdir] sys.path.insert(1, rootdir) astrometry.net-0.67/util/an-endian.c000644 000765 000024 00000004567 12651445460 017555 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "an-endian.h" /* #if IS_BIG_ENDIAN #warning "Big endian" #else #warning "Little endian" #endif */ int is_big_endian() { return IS_BIG_ENDIAN; } uint16_t u16_letoh(uint16_t i) { #if IS_BIG_ENDIAN return ( ((i & 0x00ff) << 8) | ((i & 0xff00) >> 8)); #else return i; #endif } uint16_t u16_htole(uint16_t i) { return u16_letoh(i); } // convert a u32 from little-endian to local. inline uint32_t u32_letoh(uint32_t i) { #if IS_BIG_ENDIAN return ( ((i & 0x000000ff) << 24) | ((i & 0x0000ff00) << 8) | ((i & 0x00ff0000) >> 8) | ((i & 0xff000000) >> 24)); #else return i; #endif } // convert a u32 from local to little-endian. inline uint32_t u32_htole(uint32_t i) { return u32_letoh(i); } static inline void v_swap(void* p, int nbytes) { int i; unsigned char* c = p; for (i=0; i<(nbytes/2); i++) { unsigned char tmp = c[i]; c[i] = c[nbytes-(i+1)]; c[nbytes-(i+1)] = tmp; } } void endian_swap(void* p, int nbytes) { v_swap(p, nbytes); } static inline void v_htole(void* p, int nbytes) { #if IS_BIG_ENDIAN return v_swap(p, nbytes); #else // nop. #endif } static inline void v_ntoh(void* p, int nbytes) { #if IS_BIG_ENDIAN // nop. #else return v_swap(p, nbytes); #endif } // convert a 32-bit object from local to little-endian. inline void v32_htole(void* p) { return v_htole(p, 4); } // convert a 16-bit object from local to little-endian. inline void v16_htole(void* p) { return v_htole(p, 2); } inline void v32_letoh(void* p) { return v32_htole(p); } // convert a 64-bit object from big-endian (network) to local. inline void v64_ntoh(void* p) { return v_ntoh(p, 8); } // convert a 32-bit object from big-endian (network) to local. inline void v32_ntoh(void* p) { return v_ntoh(p, 4); } // convert a 16-bit object from big-endian (network) to local. inline void v16_ntoh(void* p) { return v_ntoh(p, 2); } // convert a 64-bit object from local to big-endian (network). inline void v64_hton(void* p) { return v64_ntoh(p); } // convert a 32-bit object from local to big-endian (network). inline void v32_hton(void* p) { return v32_ntoh(p); } // convert a 16-bit object from local to big-endian (network). inline void v16_hton(void* p) { return v16_ntoh(p); } astrometry.net-0.67/util/an-fitstopnm.c000644 000765 000024 00000020143 12651445460 020326 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include "os-features.h" #include "an-bool.h" #include "anqfits.h" #include "permutedsort.h" #include "log.h" #include "errors.h" #include "fitsioutils.h" static const char* OPTIONS = "hi:o:Oe:p:m:IX:N:xnrsvML:H:"; static void printHelp(char* progname) { printf("%s -i \n" " [-o ] (default stdout)\n" " [-e ] FITS extension (default 0)\n" " [-p ] Image plane number (default 0)\n" " [-m ] Number of pixels to avoid at the image edges (default 0)\n" " [-O]: do ordinal transform (default: map 25-95 percentile)\n" " [-L ]: set percentile that becomes black (default 25)\n" " [-H ]: set percentile that becomes white (default 95)\n" " [-I]: invert black-on-white image\n" " [-X ]: set the input value that will become white\n" " [-N ]: set the input value that will become black\n" " [-x]: set max to the observed maximum value\n" " [-n]: set min to the observed minimum value\n" " [-r]: same as -x -n: set min and max to observed data range.\n" " [-s]: write 16-bit output\n" " [-v]: verbose\n" " [-M]: compute & print median value\n" "\n", progname); } static void sample_percentiles(const float* img, int nx, int ny, int margin, int NPIX, float lop, float hip, float* lo, float* hi) { // the maximum number of pixels to sample int n, np; int x, y; int i; float* pix; //fprintf(stderr, "Computing image percentiles...\n"); n = (nx - 2*margin) * (ny - 2*margin); np = MIN(n, NPIX); pix = malloc(np * sizeof(float)); if (n < NPIX) { i=0; for (y=margin; y<(ny-margin); y++) for (x=margin; x<(nx-margin); x++) { pix[i] = img[y*nx + x]; i++; } assert(i == np); } else { for (i=0; i #include #include #include #include "an-opts.h" #include "ioutils.h" #include "bl.h" #include "log.h" void opts_print_help(bl* opts, FILE* fid, void (*special_case)(an_option_t* opt, bl* allopts, int index, FILE* fid, void* extra), void* extra) { int i; for (i=0; ihelp) { if ((opt->shortopt >= 'a' && opt->shortopt <= 'z') || (opt->shortopt >= 'A' && opt->shortopt <= 'Z') || (opt->shortopt >= '0' && opt->shortopt <= '9')) nw += fprintf(fid, " -%c / --%s", opt->shortopt, opt->name); else nw += fprintf(fid, " --%s", opt->name); if (opt->has_arg == optional_argument) nw += fprintf(fid, " [<%s>]", opt->argname); else if (opt->has_arg == required_argument) nw += fprintf(fid, " <%s>", opt->argname); nw += fprintf(fid, ": "); if (!opt->help) continue; words = split_long_string(opt->help, 80-nw, 70, NULL); for (j=0; jshortopt) continue; if (iscntrl((unsigned)(opt->shortopt))) continue; optstring[j] = opt->shortopt; j++; if (opt->has_arg == no_argument) continue; optstring[j] = ':'; j++; if (opt->has_arg == required_argument) continue; optstring[j] = ':'; j++; } optstring[j] = '\0'; // create long options. longoptions = calloc(N+1, sizeof(struct option)); j = 0; for (i=0; ishortopt) continue; //if (iscntrl(opt->shortopt)) //continue; longoptions[j].name = opt->name; longoptions[j].has_arg = opt->has_arg; longoptions[j].val = opt->shortopt; j++; } // DEBUG //printf("%s\n", optstring); c = getopt_long(argc, argv, optstring, longoptions, NULL); free(optstring); free(longoptions); return c; } bl* opts_from_array(const an_option_t* opts, int N, bl* lst) { int i; if (!lst) lst = bl_new(4, sizeof(an_option_t)); for (i=0; i #include "an-bool.h" #include "os-features-config.h" // for HAVE_NETPBM. #if HAVE_NETPBM #include #else #include #endif #include "log.h" #include "errors.h" #include "fitsioutils.h" #include "ioutils.h" #include "bl.h" static const char* OPTIONS = "hvqo:"; static void printHelp(char* progname) { printf("%s [options] [, default stdin]\n" " or [ ]\n" " [-o ] (default stdout)\n" " [-v]: verbose\n" " [-q]: quiet\n" "\n", progname); } #if HAVE_NETPBM #else static int skip_whitespace(FILE* fid, int nmax) { int c; int i; for (i=0; (nmax == 0) || i"); exit(-1); } bits = 8 * maxval_to_bytes(maxval); rowbuf = malloc(W * depth * (bits/8)); #endif logmsg("Read file %s: %i x %i pixels x %i color(s); maxval %i\n", infn ? infn : "stdin", W, H, depth, maxval); if (bits == 8) outformat = BPP_8_UNSIGNED; else { outformat = BPP_16_SIGNED; if (maxval >= INT16_MAX) bzero = 0x8000; } logmsg("Using %i-bit output\n", bits); hdr = fits_get_header_for_image3(W, H, outformat, depth, NULL); if (bzero) fits_header_add_int(hdr, "BZERO", bzero, "Number that has been subtracted from pixel values"); if (qfits_header_dump(hdr, fout)) { ERROR("Failed to write FITS header to file %s", outfn); exit(-1); } qfits_header_destroy(hdr); datastart = ftello(fid); // Figure out if we can seek backward in this input file... if ((fid == stdin) || (fseeko(fid, 0, SEEK_SET) || fseeko(fid, datastart, SEEK_SET))) // Nope! onepass = TRUE; if (onepass && depth > 1) { logmsg("Reading in one pass\n"); pixcache = bl_new(16384, bits/8); } for (plane=0; plane 0) { if (fseeko(fid, datastart, SEEK_SET)) { SYSERROR("Failed to seek back to start of image data"); exit(-1); } } for (row = 0; row 1) { for (column = 0; column #include #ifdef WCSLIB_EXISTS #include #include #endif #ifdef WCSTOOLS_EXISTS #include #endif #include "os-features.h" #include "qfits_std.h" #include "qfits_header.h" #include "qfits_rw.h" #include "anwcs.h" #include "anqfits.h" #include "errors.h" #include "log.h" #include "sip.h" #include "sip_qfits.h" #include "sip-utils.h" #include "starutil.h" #include "mathutil.h" #include "ioutils.h" #include "fitsioutils.h" #include "bl.h" struct anwcslib_t { struct wcsprm* wcs; // Image width and height, in pixels. int imagew; int imageh; }; typedef struct anwcslib_t anwcslib_t; /* This is ugly... this macro gets defined differently depending on whether wcslib is available or not... I couldn't figure out how to put the #ifdef inside the macro definition to make it cleaner. */ #if defined(WCSLIB_EXISTS) && defined(WCSTOOLS_EXISTS) #define ANWCS_DISPATCH(anwcs, action, defaction, func, ...) \ do { \ assert(anwcs); \ switch (anwcs->type) { \ case ANWCS_TYPE_WCSLIB: \ { \ anwcslib_t* anwcslib = anwcs->data; \ action wcslib_##func(anwcslib, ##__VA_ARGS__); \ break; \ } \ case ANWCS_TYPE_SIP: \ { \ sip_t* sip = anwcs->data; \ action ansip_##func(sip, ##__VA_ARGS__); \ break; \ } \ case ANWCS_TYPE_WCSTOOLS: \ { \ struct WorldCoor* wcs = anwcs->data; \ action wcstools_##func(wcs, ##__VA_ARGS__); \ break; \ } \ default: \ ERROR("Unknown anwcs type %i", anwcs->type); \ defaction; \ } \ } while (0) #elif defined(WCSLIB_EXISTS) #define ANWCS_DISPATCH(anwcs, action, defaction, func, ...) \ do { \ assert(anwcs); \ switch (anwcs->type) { \ case ANWCS_TYPE_WCSLIB: \ { \ anwcslib_t* anwcslib = anwcs->data; \ action wcslib_##func(anwcslib, ##__VA_ARGS__); \ break; \ } \ case ANWCS_TYPE_SIP: \ { \ sip_t* sip = anwcs->data; \ action ansip_##func(sip, ##__VA_ARGS__); \ break; \ } \ default: \ ERROR("Unknown anwcs type %i", anwcs->type); \ defaction; \ } \ } while (0) #elif defined(WCSTOOLS_EXISTS) #define ANWCS_DISPATCH(anwcs, action, defaction, func, ...) \ do { \ assert(anwcs); \ switch (anwcs->type) { \ case ANWCS_TYPE_SIP: \ { \ sip_t* sip = anwcs->data; \ action ansip_##func(sip, ##__VA_ARGS__); \ break; \ } \ case ANWCS_TYPE_WCSTOOLS: \ { \ struct WorldCoor* wc = anwcs->data; \ action wcstools_##func(wc, ##__VA_ARGS__); \ break; \ } \ default: \ ERROR("Unknown anwcs type %i", anwcs->type); \ defaction; \ } \ } while (0) #else // No WCSLIB. #define ANWCS_DISPATCH(anwcs, action, defaction, func, ...) \ do { \ assert(anwcs); \ switch (anwcs->type) { \ case ANWCS_TYPE_WCSLIB: \ ERROR("WCSlib support was not compiled in"); \ defaction; \ break; \ case ANWCS_TYPE_SIP: \ { \ sip_t* sip = anwcs->data; \ action ansip_##func(sip, ##__VA_ARGS__); \ break; \ } \ default: \ ERROR("Unknown anwcs type %i", anwcs->type); \ defaction; \ } \ } while (0) #endif /////////////////// wcstools implementations ////////////////////////// #if defined(WCSTOOLS_EXISTS) static double wcstools_imagew(const struct WorldCoor* wcs) { return wcs->nxpix; } static double wcstools_imageh(const struct WorldCoor* wcs) { return wcs->nypix; } static int wcstools_pixelxy2radec(const struct WorldCoor* wcs, double px, double py, double* ra, double* dec) { pix2wcs(wcs, px, py, ra, dec); return 0; } static int wcstools_radec2pixelxy(const struct WorldCoor* wcs, double ra, double dec, double* px, double* py) { int offscl; wcs2pix(wcs, ra, dec, px, py, &offscl); return offscl; } static void wcstools_print(const struct WorldCoor* wcs, FILE* fid) { fprintf(fid, "AN WCS type: wcstools\n"); } static void wcstools_free(struct WorldCoor* wcs) { wcsfree(wcs); } static int wcstools_add_to_header(struct WorldCoor* wcs, qfits_header* hdr) { logerr("UNIMPLEMENTED"); return -1; } static void wcstools_set_size(struct WorldCoor* wcs, int w, int h) { logerr("UNIMPLEMENTED"); } static anbool wcstools_radec_is_inside_image(struct WorldCoor* wcs, double ra, double dec) { logerr("UNIMPLEMENTED"); return FALSE; } static double wcstools_pixel_scale(struct WorldCoor* wcs) { logerr("UNIMPLEMENTED"); return 0.0; } static int wcstools_write(struct WorldCoor* wcs, const char* filename) { logerr("UNIMPLEMENTED"); return -1; } static int wcstools_write_to(const struct WorldCoor* wcs, FILE* fid) { logerr("UNIMPLEMENTED"); return -1; } static int wcstools_scale_wcs(struct WorldCoor* anwcs, double scale) { logerr("UNIMPLEMENTED"); return -1; } static int wcstools_rotate_wcs(struct WorldCoor* anwcs, double rot) { logerr("UNIMPLEMENTED"); return -1; } #endif /////////////////// wcslib implementations ////////////////////////// #ifdef WCSLIB_EXISTS static double wcslib_imagew(const anwcslib_t* anwcs) { return anwcs->imagew; } static double wcslib_imageh(const anwcslib_t* anwcs) { return anwcs->imageh; } static int wcslib_pixelxy2radec(const anwcslib_t* anwcslib, double px, double py, double* ra, double* dec) { double pix[2]; double world[2]; double phi; double theta; double imgcrd[2]; int status = 0; int code; struct wcsprm* wcs = anwcslib->wcs; pix[0] = px; pix[1] = py; code = wcsp2s(wcs, 1, 0, pix, imgcrd, &phi, &theta, world, &status); /* int wcsp2s(struct wcsprm *wcs, int ncoord, int nelem, const double pixcrd[], double imgcrd[], double phi[], double theta[], double world[], int stat[]); */ if (code) { //ERROR("Wcslib's wcsp2s() failed: code=%i, status=%i (%s); (x,y)=(%g,%g)", code, status, wcs_errmsg[status], px, py); logverb("Wcslib's wcsp2s() failed: code=%i, status=%i (%s); (x,y)=(%g,%g)", code, status, wcs_errmsg[status], px, py); return -1; } if (ra) *ra = world[wcs->lng]; if (dec) *dec = world[wcs->lat]; return 0; } static int wcslib_radec2pixelxy(const anwcslib_t* anwcslib, double ra, double dec, double* px, double* py) { double pix[2]; double world[2]; double phi; double theta; double imgcrd[2]; int status = 0; int code; struct wcsprm* wcs = anwcslib->wcs; world[wcs->lng] = ra; world[wcs->lat] = dec; code = wcss2p(wcs, 1, 0, world, &phi, &theta, imgcrd, pix, &status); /* int wcss2p(struct wcsprm *wcs, int ncoord, int nelem, const double world[], double phi[], double theta[], double imgcrd[], double pixcrd[], int stat[]); */ if (code) { ERROR("Wcslib's wcss2p() failed: code=%i, status=%i", code, status); return -1; } if (px) *px = pix[0]; if (py) *py = pix[1]; return 0; } static anbool wcslib_radec_is_inside_image(anwcslib_t* wcslib, double ra, double dec) { double px, py; if (wcslib_radec2pixelxy(wcslib, ra, dec, &px, &py)) return FALSE; return (px >= 1 && px <= wcslib->imagew && py >= 1 && py <= wcslib->imageh); } //// This was copied wholesale from sip-utils.c ///// struct radecbounds { double rac, decc; double ramin, ramax, decmin, decmax; }; static void radec_bounds_callback(const anwcs_t* wcs, double x, double y, double ra, double dec, void* token) { struct radecbounds* b = token; b->decmin = MIN(b->decmin, dec); b->decmax = MAX(b->decmax, dec); if (ra - b->rac > 180) // wrap-around: racenter < 180, ra has gone < 0 but been wrapped around to > 180 ra -= 360; if (b->rac - ra > 180) // wrap-around: racenter > 180, ra has gone > 360 but wrapped around to > 0. ra += 360; b->ramin = MIN(b->ramin, ra); b->ramax = MAX(b->ramax, ra); } static void wcslib_radec_bounds(const anwcs_t* genwcs, const anwcslib_t* wcs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax) { struct radecbounds b; anwcs_get_radec_center_and_radius(genwcs, &(b.rac), &(b.decc), NULL); b.ramin = b.ramax = b.rac; b.decmin = b.decmax = b.decc; anwcs_walk_image_boundary(genwcs, stepsize, radec_bounds_callback, &b); // Check for poles... // north pole if (anwcs_radec_is_inside_image(genwcs, 0, 90)) { b.ramin = 0; b.ramax = 360; b.decmax = 90; } if (anwcs_radec_is_inside_image(genwcs, 0, -90)) { b.ramin = 0; b.ramax = 360; b.decmin = -90; } if (pramin) *pramin = b.ramin; if (pramax) *pramax = b.ramax; if (pdecmin) *pdecmin = b.decmin; if (pdecmax) *pdecmax = b.decmax; } static void wcslib_print(const anwcslib_t* anwcslib, FILE* fid) { fprintf(fid, "AN WCS type: wcslib\n"); wcsprt(anwcslib->wcs); fprintf(fid, "Image size: %i x %i\n", anwcslib->imagew, anwcslib->imageh); } static void wcslib_free(anwcslib_t* anwcslib) { wcsfree(anwcslib->wcs); free(anwcslib->wcs); free(anwcslib); } static double wcslib_pixel_scale(const anwcslib_t* anwcslib) { struct wcsprm* wcs = anwcslib->wcs; //double* cd = wcs->m_cd; double* cd = wcs->cd; double ps; //printf("WCSlib pixel scale: cd %g,%g,%g,%g\n", cd[0], cd[1], cd[2], cd[3]); // HACK -- assume "cd" elements are set... ps = deg2arcsec(sqrt(fabs(cd[0]*cd[3] - cd[1]*cd[2]))); if (ps == 0.0) { // Try CDELT //printf("WCSlib pixel scale: cdelt %g,%g\n", wcs->cdelt[0], wcs->cdelt[1]); ps = deg2arcsec(sqrt(fabs(wcs->cdelt[0] * wcs->cdelt[1]))); } assert(ps > 0.0); return ps; } static int wcslib_write_to(const anwcslib_t* anwcslib, FILE* fid) { int res; int Ncards; char* hdrstr; char line[81]; char spaces[81]; char val[32]; const char* hdrformat = "%-8s= %20s /%s"; sl* lines = NULL; int npad; res = wcshdo(-1, anwcslib->wcs, &Ncards, &hdrstr); if (res) { ERROR("wcshdo() failed: %s", wcshdr_errmsg[res]); return -1; } int i; printf("wcslib header:\n"); for (i=0; iimagew); snprintf(line, sizeof(line), hdrformat, "IMAGEW", val, spaces); sl_append(lines, line); sprintf(val, "%i", anwcslib->imageh); snprintf(line, sizeof(line), hdrformat, "IMAGEH", val, spaces); sl_append(lines, line); for (i=0; iimagew = W; anwcslib->imageh = H; } static int wcslib_scale_wcs(anwcslib_t* wcslib, double scale) { ERROR("Not implemented!"); return -1; } static int wcslib_rotate_wcs(anwcslib_t* wcslib, double scale) { ERROR("Not implemented!"); return -1; } static int wcslib_add_to_header(const anwcslib_t* wcslib, qfits_header* hdr) { ERROR("Not implemented!"); return -1; } static void wcslib_get_cd_matrix(const anwcslib_t* wcslib, double* p_cd) { ERROR("Not implemented: wcslib_get_cd_matrix!"); assert(0); p_cd[0] = 0; p_cd[1] = 0; p_cd[2] = 0; p_cd[3] = 0; } #endif // end of WCSLIB implementations /////////////////// sip implementations ////////////////////////// //#define ansip_radec_bounds sip_get_radec_bounds #define ansip_radec_is_inside_image sip_is_inside_image #define ansip_imagew sip_imagew #define ansip_imageh sip_imageh //#define ansip_pixelxy2radec sip_pixelxy2radec static int ansip_pixelxy2radec(const sip_t* sip, double px, double py, double* ra, double* dec) { sip_pixelxy2radec(sip, px, py, ra, dec); return 0; } #define ansip_print sip_print_to #define ansip_free sip_free #define ansip_pixel_scale sip_pixel_scale #define ansip_write sip_write_to_file #define ansip_write_to sip_write_to static void ansip_set_size(sip_t* sip, int W, int H) { sip->wcstan.imagew = W; sip->wcstan.imageh = H; } static int ansip_scale_wcs(sip_t* sip, double scale) { if (sip->a_order || sip->b_order || sip->ap_order || sip->bp_order) { // FIXME!!! logmsg("Warning: ansip_scale_wcs only scales the TAN, not the SIP coefficients!\n"); } tan_scale(&sip->wcstan, &sip->wcstan, scale); return 0; } static int ansip_rotate_wcs(sip_t* sip, double angle) { logmsg("Warning: ansip_rotate_wcs only scales the TAN, not the SIP coefficients!\n"); tan_rotate(&sip->wcstan, &sip->wcstan, angle); return 0; } static int ansip_add_to_header(const sip_t* sip, qfits_header* hdr) { sip_add_to_header(hdr, sip); return 0; } static void ansip_get_cd_matrix(const sip_t* sip, double *p_cd) { p_cd[0] = sip->wcstan.cd[0][0]; p_cd[1] = sip->wcstan.cd[0][1]; p_cd[2] = sip->wcstan.cd[1][0]; p_cd[3] = sip->wcstan.cd[1][1]; } /////////////////// dispatched anwcs_t entry points ////////////////////////// void anwcs_set_size(anwcs_t* anwcs, int W, int H) { ANWCS_DISPATCH(anwcs, , , set_size, W, H); } void anwcs_get_cd_matrix(const anwcs_t* anwcs, double *p_cd) { ANWCS_DISPATCH(anwcs, , , get_cd_matrix, p_cd); } void anwcs_get_radec_bounds(const anwcs_t* wcs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax) { assert(wcs); switch (wcs->type) { case ANWCS_TYPE_WCSLIB: #ifdef WCSLIB_EXISTS { anwcslib_t* anwcslib = wcs->data; wcslib_radec_bounds(wcs, anwcslib, stepsize, pramin, pramax, pdecmin, pdecmax); } #else ERROR("Wcslib support was not compiled in"); #endif break; case ANWCS_TYPE_SIP: { sip_t* sip = wcs->data; sip_get_radec_bounds(sip, stepsize, pramin, pramax, pdecmin, pdecmax); break; } default: ERROR("Unknown anwcs type %i", wcs->type); break; } //ANWCS_DISPATCH(wcs, , , radec_bounds, stepsize, pramin, pramax, pdecmin, pdecmax); } void anwcs_print(const anwcs_t* anwcs, FILE* fid) { assert(anwcs); assert(fid); ANWCS_DISPATCH(anwcs, , , print, fid); } void anwcs_print_stdout(const anwcs_t* wcs) { anwcs_print(wcs, stdout); } void anwcs_free(anwcs_t* anwcs) { if (!anwcs) return; ANWCS_DISPATCH(anwcs, , , free); free(anwcs); } anbool anwcs_radec_is_inside_image(const anwcs_t* wcs, double ra, double dec) { ANWCS_DISPATCH(wcs, return, return FALSE, radec_is_inside_image, ra, dec); } double anwcs_imagew(const anwcs_t* anwcs) { ANWCS_DISPATCH(anwcs, return, return -1.0, imagew); } double anwcs_imageh(const anwcs_t* anwcs) { ANWCS_DISPATCH(anwcs, return, return -1.0, imageh); } int anwcs_pixelxy2radec(const anwcs_t* anwcs, double px, double py, double* ra, double* dec) { ANWCS_DISPATCH(anwcs, return, return -1, pixelxy2radec, px, py, ra, dec); } // Approximate pixel scale, in arcsec/pixel, at the reference point. double anwcs_pixel_scale(const anwcs_t* anwcs) { ANWCS_DISPATCH(anwcs, return, return -1, pixel_scale); } int anwcs_write(const anwcs_t* wcs, const char* filename) { ANWCS_DISPATCH(wcs, return, return -1, write, filename); } int anwcs_write_to(const anwcs_t* wcs, FILE* fid) { ANWCS_DISPATCH(wcs, return, return -1, write_to, fid); } int anwcs_scale_wcs(anwcs_t* anwcs, double scale) { ANWCS_DISPATCH(anwcs, return, return -1, scale_wcs, scale); } int anwcs_rotate_wcs(anwcs_t* anwcs, double rot) { ANWCS_DISPATCH(anwcs, return, return -1, rotate_wcs, rot); } int anwcs_add_to_header(const anwcs_t* wcs, qfits_header* hdr) { ANWCS_DISPATCH(wcs, return, return -1, add_to_header, hdr); } ///////////////////////// un-dispatched functions /////////////////// struct overlap_token { const anwcs_t* wcs; anbool inside; }; static void overlap_callback(const anwcs_t* wcs, double x, double y, double ra, double dec, void* token) { struct overlap_token* t = token; if (t->inside) return; if (anwcs_radec_is_inside_image(t->wcs, ra, dec)) t->inside = TRUE; } anbool anwcs_overlaps(const anwcs_t* wcs1, const anwcs_t* wcs2, int stepsize) { // check for definitely do or don't overlap via bounds: double ralo1, rahi1, ralo2, rahi2; double declo1, dechi1, declo2, dechi2; struct overlap_token token; anwcs_get_radec_bounds(wcs1, 1000, &ralo1, &rahi1, &declo1, &dechi1); anwcs_get_radec_bounds(wcs2, 1000, &ralo2, &rahi2, &declo2, &dechi2); if ((declo1 > dechi2) || (declo2 > dechi1)) return FALSE; // anwcs_get_radec_bounds() has the behavior that ralo <= rahi, // but ralo may be < 0 or rahi > 360. assert(ralo1 < rahi1); assert(ralo2 < rahi2); // undo wrap over 360 if (rahi1 >= 360.0) { ralo1 -= 360.0; rahi1 -= 360.0; } if (rahi2 >= 360.0) { ralo2 -= 360.0; rahi2 -= 360.0; } assert(rahi1 >= 0); assert(rahi2 >= 0); if ((ralo1 > rahi2) || (ralo2 > rahi1)) return FALSE; // check for #1 completely inside #2. if (ralo1 >= ralo2 && rahi1 <= rahi2 && declo1 >= declo2 && dechi1 <= dechi2) return TRUE; // check for #2 completely inside #1. if (ralo2 >= ralo1 && rahi2 <= rahi1 && declo2 >= declo1 && dechi2 <= dechi1) return TRUE; // walk the edge of #1, checking whether any point is in #2. token.wcs = wcs2; token.inside = FALSE; if (stepsize == 0) stepsize = 100; anwcs_walk_image_boundary(wcs1, stepsize, overlap_callback, &token); return token.inside; } void anwcs_walk_image_boundary(const anwcs_t* wcs, double stepsize, void (*callback)(const anwcs_t* wcs, double x, double y, double ra, double dec, void* token), void* token) { int i, side; // Walk the perimeter of the image in steps of stepsize pixels double W = anwcs_imagew(wcs); double H = anwcs_imageh(wcs); logverb("Walking WCS image boundary: image size is %g x %g\n", W, H); { double Xmin = 0.5; double Xmax = W + 0.5; double Ymin = 0.5; double Ymax = H + 0.5; double offsetx[] = { Xmin, Xmax, Xmax, Xmin }; double offsety[] = { Ymin, Ymin, Ymax, Ymax }; double stepx[] = { +stepsize, 0, -stepsize, 0 }; double stepy[] = { 0, +stepsize, 0, -stepsize }; int Nsteps[] = { ceil(W/stepsize), ceil(H/stepsize), ceil(W/stepsize), ceil(H/stepsize) }; for (side=0; side<4; side++) { for (i=0; itype) { case ANWCS_TYPE_WCSLIB: { anwcslib_t* anwcslib = anwcs->data; double x,y; double ra1, dec1, ra2, dec2; x = anwcslib->imagew/2. + 0.5; y = anwcslib->imageh/2. + 0.5; if (anwcs_pixelxy2radec(anwcs, x, y, &ra1, &dec1)) return -1; if (p_ra) *p_ra = ra1; if (p_dec) *p_dec = dec1; // FIXME -- this is certainly not right in general.... /* if (p_radius) { if (anwcs_pixelxy2radec(anwcs, 1.0, 1.0, &ra2, &dec2)) return -1; *p_radius = deg_between_radecdeg(ra1, dec1, ra2, dec2); } */ // try just moving 1 pixel and extrapolating. if (p_radius) { if (anwcs_pixelxy2radec(anwcs, x+1, y, &ra2, &dec2)) return -1; *p_radius = deg_between_radecdeg(ra1, dec1, ra2, dec2) * hypot(anwcslib->imagew, anwcslib->imageh)/2.0;; } } break; case ANWCS_TYPE_SIP: { sip_t* sip; sip = anwcs->data; if (p_ra || p_dec) sip_get_radec_center(sip, p_ra, p_dec); if (p_radius) *p_radius = sip_get_radius_deg(sip); } break; default: ERROR("Unknown anwcs type %i", anwcs->type); return -1; } return 0; } anwcs_t* anwcs_new_sip(const sip_t* sip) { anwcs_t* anwcs; anwcs = calloc(1, sizeof(anwcs_t)); anwcs->type = ANWCS_TYPE_SIP; anwcs->data = sip_create(); memcpy(anwcs->data, sip, sizeof(sip_t)); return anwcs; } anwcs_t* anwcs_new_tan(const tan_t* tan) { sip_t sip; sip_wrap_tan(tan, &sip); return anwcs_new_sip(&sip); } anwcs_t* anwcs_open(const char* filename, int ext) { char* errmsg; anwcs_t* anwcs = NULL; errors_start_logging_to_string(); // try as SIP: anwcs = anwcs_open_sip(filename, ext); if (anwcs) { errors_pop_state(); return anwcs; } else { errmsg = errors_stop_logging_to_string("\n "); logverb("Failed to open file %s, ext %i as SIP:\n%s\n", filename, ext, errmsg); free(errmsg); } // try as WCSLIB: anwcs = anwcs_open_wcslib(filename, ext); if (anwcs) { errors_pop_state(); return anwcs; } else { errmsg = errors_stop_logging_to_string(": "); logverb("Failed to open file %s, ext %i using WCSLIB: %s", filename, ext, errmsg); free(errmsg); } // try as WCStools: anwcs = anwcs_open_wcstools(filename, ext); if (anwcs) { errors_pop_state(); return anwcs; } else { errmsg = errors_stop_logging_to_string(": "); logverb("Failed to open file %s, ext %i using WCStools: %s", filename, ext, errmsg); free(errmsg); } return NULL; } static anwcs_t* open_tansip(const char* filename, int ext, anbool forcetan) { anwcs_t* anwcs = NULL; sip_t* sip = NULL; sip = sip_read_tan_or_sip_header_file_ext(filename, ext, NULL, forcetan); if (!sip) { ERROR("Failed to parse SIP header"); return NULL; } if (sip->a_order >= 2 && sip->b_order >= 2 && (sip->ap_order == 0 || sip->bp_order == 0)) { logverb("Computing inverse SIP polynomial terms...\n"); sip->ap_order = sip->bp_order = MAX(sip->a_order, sip->b_order) + 1; sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); } anwcs = calloc(1, sizeof(anwcs_t)); anwcs->type = ANWCS_TYPE_SIP; anwcs->data = sip; return anwcs; } anwcs_t* anwcs_open_tan(const char* filename, int ext) { return open_tansip(filename, ext, TRUE); } anwcs_t* anwcs_open_sip(const char* filename, int ext) { return open_tansip(filename, ext, FALSE); } static char* getheader(const char* filename, int ext, int* N) { anqfits_t* fits; char* hdrstr = NULL; assert(N); assert(filename); fits = anqfits_open(filename); if (!fits) { ERROR("Failed to open file %s", filename); return NULL; } hdrstr = anqfits_header_get_data(fits, ext, N); if (!hdrstr) { ERROR("Failed to read header data from file %s, ext %i", filename, ext); anqfits_close(fits); return NULL; } anqfits_close(fits); return hdrstr; } char* anwcs_wcslib_to_string(const anwcs_t* wcs, char** s, int* len) { #ifndef WCSLIB_EXISTS ERROR("Wcslib support was not compiled in"); return NULL; #else const anwcslib_t* anwcslib = NULL; int res; char* hdrstr = NULL; assert(wcs); assert(wcs->type == ANWCS_TYPE_WCSLIB); anwcslib = (const anwcslib_t*)wcs->data; if (!s) s = &hdrstr; res = wcshdo(-1, anwcslib->wcs, len, s); if (res) { ERROR("wcshdo() failed: %s", wcshdr_errmsg[res]); return NULL; } // wcshdo() returns the number of 80-char cards. (*len) *= 80; /// FIXME -- WIDTH, HEIGHT? return *s; #endif } anwcs_t* anwcs_wcslib_from_string(const char* str, int len) { #ifndef WCSLIB_EXISTS ERROR("Wcslib support was not compiled in"); return NULL; #else int code; int nkeys; int nrej = 0; int nwcs = 0; struct wcsprm* wcs = NULL; struct wcsprm* wcs2 = NULL; anwcs_t* anwcs = NULL; anwcslib_t* anwcslib; qfits_header* qhdr; int W, H; /* printf("Parsing string: length %i\n", len); printf("--------------------------\n"); //printf("%s\n", str); { int i; for (i=0; i 1) { // copy the first entry, free the rest. wcs2 = calloc(1, sizeof(struct wcsprm)); wcscopy(1, wcs, wcs2); wcsvfree(&nwcs, &wcs); } else { wcs2 = wcs; } code = wcsset(wcs2); if (code) { ERROR("wcslib's wcsset() failed with code %i: %s", code, wcs_errmsg[code]); return NULL; } anwcs = calloc(1, sizeof(anwcs_t)); anwcs->type = ANWCS_TYPE_WCSLIB; anwcs->data = calloc(1, sizeof(anwcslib_t)); anwcslib = anwcs->data; anwcslib->wcs = wcs2; anwcslib->imagew = W; anwcslib->imageh = H; return anwcs; #endif } anwcs_t* anwcs_open_wcslib(const char* filename, int ext) { #ifndef WCSLIB_EXISTS ERROR("Wcslib support was not compiled in"); return NULL; #else anwcs_t* anwcs = NULL; char* hdrstr; int Nhdr; hdrstr = getheader(filename, ext, &Nhdr); if (!hdrstr) return NULL; anwcs = anwcs_wcslib_from_string(hdrstr, Nhdr); free(hdrstr); if (!anwcs) { ERROR("Failed to parse FITS WCS header from file \"%s\" ext %i using WCSlib", filename, ext); return NULL; } return anwcs; #endif } anwcs_t* anwcs_open_wcstools(const char* filename, int ext) { #ifndef WCSTOOLS_EXISTS ERROR("WCStools support was not compiled in"); return NULL; #else anwcs_t* anwcs = NULL; char* hdrstr; int Nhdr; hdrstr = getheader(filename, ext, &Nhdr); if (!hdrstr) return NULL; anwcs = anwcs_wcstools_from_string(hdrstr, Nhdr); free(hdrstr); if (!anwcs) { ERROR("Failed to parse FITS WCS header from file \"%s\" ext %i using WCSTools", filename, ext); return NULL; } return anwcs; #endif } anwcs_t* anwcs_wcstools_from_string(const char* str, int len) { #ifndef WCSTOOLS_EXISTS ERROR("WCStools support was not compiled in"); return NULL; #else anwcs_t* anwcs = NULL; struct WorldCoor* wcs = wcsninit(str, len); if (!wcs) { ERROR("Failed to parse FITS WCS header using WCStools"); // print to stderr. wcserr(); return NULL; } anwcs = calloc(1, sizeof(anwcs_t)); anwcs->type = ANWCS_TYPE_WCSTOOLS; anwcs->data = wcs; return anwcs; #endif } int anwcs_radec2pixelxy(const anwcs_t* anwcs, double ra, double dec, double* px, double* py) { switch (anwcs->type) { case ANWCS_TYPE_WCSLIB: #ifndef WCSLIB_EXISTS ERROR("Wcslib support was not compiled in"); return -1; #else { anwcslib_t* anwcslib = anwcs->data; return wcslib_radec2pixelxy(anwcslib, ra, dec, px, py); } #endif break; case ANWCS_TYPE_SIP: { sip_t* sip; anbool ok; sip = anwcs->data; ok = sip_radec2pixelxy(sip, ra, dec, px, py); if (!ok) return -1; } break; default: ERROR("Unknown anwcs type %i", anwcs->type); return -1; } return 0; } anbool anwcs_find_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double* pra3, double* pdec3, double* pra4, double* pdec4) { #ifdef WCSLIB_EXISTS if (wcs->type == ANWCS_TYPE_WCSLIB) { struct wcsprm* wcslib = ((anwcslib_t*)wcs->data)->wcs; if (ends_with(wcslib->ctype[0], "AIT")) { // Hammer-Aitoff -- wraps at 180 deg from CRVAL0 double ra0 = fmod(wcslib->crval[0] + 180.0, 360.0); //printf("ra0 %g, ra1 %g, ra2 %g\n", ra0, ra1, ra2); double dr1 = fmod(fmod(ra1 - ra0, 360.) + 360., 360.); double dr2 = fmod(fmod(ra2 - ra0, 360.) + 360., 360.); //printf("dr1,dr2 %g, %g\n", dr1, dr2); if (fabs(dr1 - dr2) < MIN(fabs(360. + dr1 - dr2), fabs(360. + dr2 - dr1))) return FALSE; /* printf("d1 = %g, d2 = %g, d3 = %g, d4 = %g\n", fabs(ra1 - ra2), 360-fabs(ra1-ra2), fabs(ra1-ra0), fabs(ra2-ra0)); */ // If ra1 to ra0 to ra2 is less than ra1 to ra2,, RA2 are closer wrapping-around than by crossing RA0. /* if (MIN(fabs(ra1 - ra2), 360-fabs(ra1-ra2)) < (fabs(ra1-ra0) + fabs(ra2-ra0))) return FALSE; */ /* if (ra1 // RA1, RA2 are on the same side of RA0 if ((ra1 - ra0) * (ra2 - ra0) > 0) { return FALSE; } */ if (pra3) *pra3 = ra0 + (ra1 > ra0 ? -360.0 : 0); if (pra4) *pra4 = ra0 + (ra2 > ra0 ? -360.0 : 0); if (pdec3 || pdec4) { // split the distance on sphere to find approximate Dec. //double fulldist = deg_between_radec(ra1, dec1, ra2, dec2); double dr1 = MIN(fabs(ra1 - ra0), fabs(ra1 - ra0 + 360)); double dr2 = MIN(fabs(ra2 - ra0), fabs(ra2 - ra0 + 360)); /* logverb("ra0 = %g. ra1=%g, dr1=%g; ra2=%g, dr2=%g\n", ra0, ra1, dr1, ra2, dr2); */ if (pdec3) *pdec3 = dec1 + (dec2 - dec1) * dr1 / (dr1 + dr2); if (pdec4) *pdec4 = dec1 + (dec2 - dec1) * dr1 / (dr1 + dr2); } return TRUE; } } #endif /* if (anwcs_radec2pixelxy(wcs, ra1, dec1, &x1, &y1) || anwcs_radec2pixelxy(wcs, ra2, dec2, &x2, &y2)) { return TRUE; } */ return FALSE; } anbool anwcs_is_discontinuous(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2) { return anwcs_find_discontinuity(wcs, ra1, dec1, ra2, dec2, NULL, NULL, NULL, NULL); } /* static int anwcs_get_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double* dra, double* ddec) { #ifdef WCSLIB_EXISTS if (wcs->type == ANWCS_TYPE_WCSLIB) { struct wcsprm* wcslib = ((anwcslib_t*)wcs->data)->wcs; if (ends_with(wcslib->ctype[0], "AIT")) { // Hammer-Aitoff -- wraps at 180 deg from CRVAL0 double ra0 = fmod(wcslib->crval[0] + 180.0, 360.0); if ((ra1 - ra0) * (ra2 - ra0) < 0) { return TRUE; } } } #endif } */ // Walk from (ra1,dec1) toward (ra2,dec2) until you hit a boundary; // then along the boundary until the boundary between (ra3,dec3) and // (ra4,dec4), then to (ra3,dec3). // 'stepsize' is in degrees. dl* anwcs_walk_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double ra3, double dec3, double ra4, double dec4, double stepsize, dl* radecs) { double xyz1[3], xyz2[3], xyz3[3], xyz4[4]; double xyz[3]; double dxyz[3]; int i, j; double xyzstep; double ra=0,dec=0, lastra, lastdec; double raA,decA, raB,decB; double xyzA[3], xyzB[3]; double dab; int NMAX; radecdeg2xyzarr(ra1, dec1, xyz1); radecdeg2xyzarr(ra2, dec2, xyz2); radecdeg2xyzarr(ra3, dec3, xyz3); radecdeg2xyzarr(ra4, dec4, xyz4); if (!radecs) radecs = dl_new(256); // first, from ra1,dec1 toward ra2,dec2. for (i=0; i<3; i++) dxyz[i] = xyz2[i] - xyz1[i]; normalize_3(dxyz); xyzstep = deg2dist(stepsize); NMAX = ceil(2. / xyzstep); logverb("stepsize %g; nmax %i\n", xyzstep, NMAX); for (i=0; i<3; i++) dxyz[i] *= xyzstep; for (i=0; i<3; i++) xyz[i] = xyz1[i]; dl_append(radecs, ra1); dl_append(radecs, dec1); lastra = ra1; lastdec = dec1; logverb("Walking from 1 to 2: RA,Decs %g,%g to %g,%g\n", ra1, dec1, ra2, dec2); for (j=0; j 0) { for (i=0; i<3; i++) dxyz[i] = xyzB[i] - xyzA[i]; normalize_3(dxyz); for (i=0; i<3; i++) dxyz[i] *= xyzstep; for (i=0; i<3; i++) xyz[i] = xyzA[i]; for (j=0; j dab) break; xyzarr2radecdeg(xyz, &ra, &dec); dl_append(radecs, ra); dl_append(radecs, dec); } if (j == NMAX) logverb("EXCEEDED number of steps\n"); logverb("Walked along boundary A-B (to %g,%g)\n", ra, dec); dl_append(radecs, raB); dl_append(radecs, decB); } // Now from B to ra3,dec3. dab = distsq(xyzB, xyz3, 3); logverb("Walking B->3 (dist %g)\n", sqrt(dab)); if (dab > 0) { for (i=0; i<3; i++) dxyz[i] = xyz3[i] - xyzB[i]; normalize_3(dxyz); for (i=0; i<3; i++) dxyz[i] *= xyzstep; for (i=0; i<3; i++) xyz[i] = xyzB[i]; for (j=0; j ra,dec %g,%g, dist %g, target %g\n", ra, dec, sqrt(d), sqrt(dab)); if (d > dab) break; //xyzarr2radecdeg(xyz, &ra, &dec); dl_append(radecs, ra); dl_append(radecs, dec); } if (j == NMAX) logverb("EXCEEDED number of steps\n"); logverb("Walk to %g,%g\n", ra, dec); } dl_append(radecs, ra3); dl_append(radecs, dec3); return radecs; } // Returns 0 if the whole line was traced without breaks. // Otherwise, returns the index of the point on the far side of the // break. static int trace_line(const anwcs_t* wcs, const dl* rd, int istart, int idir, int iend, anbool firstmove, dl* plotrd) { int i; double lastra=0, lastdec=0; double first = TRUE; logverb("trace_line: %i to %i by %i\n", istart, iend, idir); for (i = istart; i != iend; i += idir) { double x,y,ra,dec; ra = dl_get_const(rd, 2*i+0); dec = dl_get_const(rd, 2*i+1); logverb("tracing: i=%i, ra,dec = %g,%g\n", i, ra, dec); if (anwcs_radec2pixelxy(wcs, ra, dec, &x, &y)) // ? continue; if (first) { logdebug("plot to (%.2f, %.2f)\n", ra, dec); dl_append(plotrd, x); dl_append(plotrd, y); } else { if (anwcs_is_discontinuous(wcs, lastra, lastdec, ra, dec)) { logverb("discont: (%.2f, %.2f) -- (%.2f, %.2f)\n", lastra, lastdec, ra, dec); logverb("return %i\n", i); return i; } else { logverb("not discontinuous\n"); } logdebug("plot to (%.2f, %.2f)\n", ra, dec); dl_append(plotrd, x); dl_append(plotrd, y); } lastra = ra; lastdec = dec; first = FALSE; } return 0; } pl* anwcs_walk_outline(const anwcs_t* wcs, const dl* rd, int fill) { pl* lists = pl_new(2); dl* rd2; int brk, end; double degstep = 0.0; int i; dl* plotrd = dl_new(256); end = dl_size(rd)/2; brk = trace_line(wcs, rd, 0, 1, end, TRUE, plotrd); logdebug("tracing line 1: brk=%i\n", brk); if (brk) { int brk2; int brk3; // back out the path. logdebug("Cancel path\n"); dl_remove_all(plotrd); logdebug("trace segment 1 back to 0\n"); // trace segment 1 backwards to 0 brk2 = trace_line(wcs, rd, brk-1, -1, -1, TRUE, plotrd); logdebug("traced line 1 backwards: brk2=%i\n", brk2); assert(brk2 == 0); // trace segment 2: from end of list backward, until we // hit brk2 (worst case, we [should] hit brk) logdebug("trace segment 2: end back to brk2=%i\n", brk2); brk2 = trace_line(wcs, rd, end-1, -1, -1, FALSE, plotrd); logdebug("traced segment 2: brk2=%i\n", brk2); if (fill) { // trace segment 3: from brk2 to brk. // 1-pixel steps. logdebug("trace segment 3: brk2=%i to brk=%i\n", brk2, brk); logdebug("walking discontinuity: (%.2f, %.2f), (%.2f, %.2f), (%.2f, %.2f), (%.2f, %.2f)\n", dl_get_const(rd, 2*(brk2+1)+0), dl_get_const(rd, 2*(brk2+1)+1), dl_get_const(rd, 2*(brk2 )+0), dl_get_const(rd, 2*(brk2 )+1), dl_get_const(rd, 2*(brk -1)+0), dl_get_const(rd, 2*(brk -1)+1), dl_get_const(rd, 2*(brk )+0), dl_get_const(rd, 2*(brk )+1)); degstep = arcsec2deg(anwcs_pixel_scale(wcs)); rd2 = anwcs_walk_discontinuity (wcs, dl_get_const(rd, 2*(brk2+1)+0), dl_get_const(rd, 2*(brk2+1)+1), dl_get_const(rd, 2*(brk2 )+0), dl_get_const(rd, 2*(brk2 )+1), dl_get_const(rd, 2*(brk -1)+0), dl_get_const(rd, 2*(brk -1)+1), dl_get_const(rd, 2*(brk )+0), dl_get_const(rd, 2*(brk )+1), degstep, NULL); for (i=0; i brk) { logdebug("trace segments 4+5: from brk=%i to brk2=%i\n",brk,brk2); // (tracing the outline on the far side) brk3 = trace_line(wcs, rd, brk, 1, brk2, TRUE, plotrd); logdebug("traced segment 4/5: brk3=%i\n", brk3); assert(brk3 == 0); // trace segment 6: from brk2 to brk. // (walking the discontinuity on the far side) if (fill) { logdebug("walking discontinuity: (%.2f, %.2f), (%.2f, %.2f), (%.2f, %.2f), (%.2f, %.2f)\n", dl_get_const(rd, 2*(brk2 )+0), dl_get_const(rd, 2*(brk2 )+1), dl_get_const(rd, 2*(brk2+1)+0), dl_get_const(rd, 2*(brk2+1)+1), dl_get_const(rd, 2*(brk )+0), dl_get_const(rd, 2*(brk )+1), dl_get_const(rd, 2*(brk -1)+0), dl_get_const(rd, 2*(brk -1)+1)); rd2 = anwcs_walk_discontinuity (wcs, dl_get_const(rd, 2*(brk2 )+0), dl_get_const(rd, 2*(brk2 )+1), dl_get_const(rd, 2*(brk2+1)+0), dl_get_const(rd, 2*(brk2+1)+1), dl_get_const(rd, 2*(brk )+0), dl_get_const(rd, 2*(brk )+1), dl_get_const(rd, 2*(brk -1)+0), dl_get_const(rd, 2*(brk -1)+1), degstep, NULL); for (i=0; itype == ANWCS_TYPE_SIP) return wcs->data; return NULL; } anwcs_t* anwcs_create_allsky_hammer_aitoff(double refra, double refdec, int W, int H) { return anwcs_create_hammer_aitoff(refra, refdec, 1.0, W, H, TRUE); } anwcs_t* anwcs_create_allsky_hammer_aitoff2(double refra, double refdec, int W, int H) { return anwcs_create_hammer_aitoff(refra, refdec, 1.0, W, H, FALSE); } anwcs_t* anwcs_create_hammer_aitoff(double refra, double refdec, double zoomfactor, int W, int H, anbool yflip) { qfits_header* hdr; double xscale = -360. / (double)W; double yscale = 180. / (double)H; char* str = NULL; int Nstr = 0; anwcs_t* anwcs = NULL; if (yflip) yscale *= -1.; xscale /= zoomfactor; yscale /= zoomfactor; hdr = qfits_header_default(); qfits_header_add(hdr, "CTYPE1", "RA---AIT", "Hammer-Aitoff", NULL); qfits_header_add(hdr, "CTYPE2", "DEC--AIT", "Hammer-Aitoff", NULL); fits_header_add_double(hdr, "CRPIX1", W/2 + 0.5, NULL); fits_header_add_double(hdr, "CRPIX2", H/2 + 0.5, NULL); fits_header_add_double(hdr, "CRVAL1", refra, NULL); fits_header_add_double(hdr, "CRVAL2", refdec, NULL); fits_header_add_double(hdr, "CD1_1", xscale, NULL); fits_header_add_double(hdr, "CD1_2", 0, NULL); fits_header_add_double(hdr, "CD2_1", 0, NULL); fits_header_add_double(hdr, "CD2_2", yscale, NULL); fits_header_add_int(hdr, "IMAGEW", W, NULL); fits_header_add_int(hdr, "IMAGEH", H, NULL); str = fits_to_string(hdr, &Nstr); qfits_header_destroy(hdr); if (!str) { ERROR("Failed to write Hammer-Aitoff FITS header as string"); return NULL; } anwcs = anwcs_wcslib_from_string(str, Nstr); free(str); if (!anwcs) { ERROR("Failed to parse Hammer-Aitoff header string with wcslib"); return NULL; } return anwcs; } anwcs_t* anwcs_create_mercator_2(double refra, double refdec, double crpix1, double crpix2, double zoomfactor, int W, int H, anbool yflip) { qfits_header* hdr; double xscale = -360. / (double)W; double yscale = -xscale; // Pixel scales are the same... char* str = NULL; int Nstr = 0; anwcs_t* anwcs = NULL; if (yflip) yscale *= -1.; xscale /= zoomfactor; yscale /= zoomfactor; hdr = qfits_header_default(); qfits_header_add(hdr, "CTYPE1", "RA---MER", "Mercator", NULL); qfits_header_add(hdr, "CTYPE2", "DEC--MER", "Mercator", NULL); fits_header_add_double(hdr, "CRPIX1", crpix1, NULL); fits_header_add_double(hdr, "CRPIX2", crpix2, NULL); fits_header_add_double(hdr, "CRVAL1", refra, NULL); fits_header_add_double(hdr, "CRVAL2", refdec, NULL); fits_header_add_double(hdr, "CD1_1", xscale, NULL); fits_header_add_double(hdr, "CD1_2", 0, NULL); fits_header_add_double(hdr, "CD2_1", 0, NULL); fits_header_add_double(hdr, "CD2_2", yscale, NULL); fits_header_add_int(hdr, "IMAGEW", W, NULL); fits_header_add_int(hdr, "IMAGEH", H, NULL); str = fits_to_string(hdr, &Nstr); qfits_header_destroy(hdr); if (!str) { ERROR("Failed to write Mercator FITS header as string"); return NULL; } anwcs = anwcs_wcslib_from_string(str, Nstr); free(str); if (!anwcs) { ERROR("Failed to parse Mercator header string with wcslib"); return NULL; } return anwcs; } anwcs_t* anwcs_create_mercator(double refra, double refdec, double zoomfactor, int W, int H, anbool yflip) { return anwcs_create_mercator_2(refra, refdec, W/2 + 0.5, H/2 + 0.5, zoomfactor, W, H, yflip); } static anwcs_t* anwcs_create_box_scaled(double ra, double dec, double width, int W, int H, double yscale) { tan_t tan; double scale; tan.crval[0] = ra; tan.crval[1] = dec; tan.crpix[0] = W / 2.0 + 0.5; tan.crpix[1] = H / 2.0 + 0.5; scale = width / (double)W; tan.cd[0][0] = -scale; tan.cd[1][0] = 0; tan.cd[0][1] = 0; tan.cd[1][1] = scale * yscale; tan.imagew = W; tan.imageh = H; return anwcs_new_tan(&tan); } anwcs_t* anwcs_create_box(double ra, double dec, double width, int W, int H) { return anwcs_create_box_scaled(ra, dec, width, W, H, 1); } anwcs_t* anwcs_create_box_upsidedown(double ra, double dec, double width, int W, int H) { return anwcs_create_box_scaled(ra, dec, width, W, H, -1); } astrometry.net-0.67/util/bl-nl-sort.c000644 000765 000024 00000001224 12651445460 017677 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ static int NLF(compare_ascending)(const void* v1, const void* v2) { number i1 = *(number*)v1; number i2 = *(number*)v2; if (i1 > i2) return 1; else if (i1 < i2) return -1; else return 0; } static int NLF(compare_descending)(const void* v1, const void* v2) { number i1 = *(number*)v1; number i2 = *(number*)v2; if (i1 > i2) return -1; else if (i1 < i2) return 1; else return 0; } void NLF(sort)(nl* list, int ascending) { bl_sort(list, ascending ? NLF(compare_ascending) : NLF(compare_descending)); } astrometry.net-0.67/util/bl-nl.c000644 000765 000024 00000022764 12651445460 016726 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Defined: --nl --number --NL_PRINT(x) prints number 'x' Note: --You can't declare multiple "number" variables like this: number n1, n2; Instead, do: number n1; number n2; This is because "number" may be a pointer type. */ #include "bl-nl.ph" #define NODE_NUMDATA(node) ((number*)NODE_DATA(node)) number* NLF(to_array)(nl* list) { number* arr; size_t N; if (!list) return NULL; N = NLF(size)(list); arr = malloc(N * sizeof(number)); bl_copy(list, 0, N, arr); return arr; } #define InlineDefine InlineDefineC #include "bl-nl.inc" #undef InlineDefine static int NLF(compare_ascending)(const void* v1, const void* v2) { number i1 = *(number*)v1; number i2 = *(number*)v2; if (i1 > i2) return 1; else if (i1 < i2) return -1; else return 0; } static int NLF(compare_descending)(const void* v1, const void* v2) { number i1 = *(number*)v1; number i2 = *(number*)v2; if (i1 > i2) return -1; else if (i1 < i2) return 1; else return 0; } void NLF(reverse)(nl* list) { bl_reverse(list); } void NLF(append_array)(nl* list, const number* data, size_t ndata) { size_t i; for (i=0; iblocksize); N1 = NLF(size)(list1); N2 = NLF(size)(list2); i1 = i2 = 0; getv1 = getv2 = 1; while (i1 < N1 && i2 < N2) { if (getv1) { v1 = NLF(get)(list1, i1); getv1 = 0; } if (getv2) { getv2 = 0; v2 = NLF(get)(list2, i2); } if (v1 <= v2) { NLF(append)(res, v1); i1++; getv1 = 1; } else { NLF(append)(res, v2); i2++; getv2 = 1; } } for (; i1N-1); bl_remove_index(nlist, nlist->N-1); return ret; } nl* NLF(dupe)(nl* nlist) { nl* ret = NLF(new)(nlist->blocksize); size_t i; for (i=0; iN; i++) NLF(push)(ret, NLF(get)(nlist, i)); return ret; } ptrdiff_t NLF(remove_value)(nl* nlist, const number value) { bl* list = nlist; bl_node *node, *prev; size_t istart = 0; for (node=list->head, prev=NULL; node; prev=node, node=node->next) { int i; number* idat; idat = NODE_DATA(node); for (i=0; iN; i++) if (idat[i] == value) { bl_remove_from_node(list, node, prev, i); list->last_access = prev; list->last_access_n = istart; return istart + i; } istart += node->N; } return BL_NOT_FOUND; } void NLF(remove_all)(nl* list) { bl_remove_all(list); } void NLF(remove_index_range)(nl* list, size_t start, size_t length) { bl_remove_index_range(list, start, length); } void NLF(set)(nl* list, size_t index, const number value) { bl_set(list, index, &value); } /* void dl_set(dl* list, int index, double value) { int i; int nadd = (index+1) - list->N; if (nadd > 0) { // enlarge the list to hold 'nadd' more entries. for (i=0; iN; ptrdiff_t mid; while (lower < (upper-1)) { mid = (upper + lower) / 2; if (n >= iarray[mid]) lower = mid; else upper = mid; } return lower; } // find the first node for which n <= the last element. static bl_node* NLF(findnodecontainingsorted)(const nl* list, const number n, size_t* p_nskipped) { bl_node *node; size_t nskipped; //bl_node *prev; //int prevnskipped; // check if we can use the jump accessor or if we have to start at // the beginning... if (list->last_access && list->last_access->N && // is the value we're looking for >= the first element? (n >= *NODE_NUMDATA(list->last_access))) { node = list->last_access; nskipped = list->last_access_n; } else { node = list->head; nskipped = 0; } /* // find the first node for which n < the first element. The // previous node will contain the value (if it exists). for (prev=node, prevnskipped=nskipped; node && (n < *NODE_NUMDATA(node));) { prev=node; prevnskipped=nskipped; nskipped+=node->N; node=node->next; } if (prev && n <= NODE_NUMDATA(prev)[prev->N-1]) { if (p_nskipped) *p_nskipped = prevnskipped; return prev; } if (node && n <= NODE_NUMDATA(node)[node->N-1]) { if (p_nskipped) *p_nskipped = nskipped; return node; } return NULL; */ /* if (!node && prev && n > NODE_NUMDATA(prev)[prev->N-1]) return NULL; if (p_nskipped) *p_nskipped = prevnskipped; return prev; */ for (; node && (n > NODE_NUMDATA(node)[node->N-1]); node=node->next) nskipped += node->N; if (p_nskipped) *p_nskipped = nskipped; return node; } static ptrdiff_t NLF(insertascending)(nl* list, const number n, int unique) { bl_node *node; size_t ind; size_t nskipped; node = NLF(findnodecontainingsorted)(list, n, &nskipped); if (!node) { NLF(append)(list, n); return list->N-1; } /* for (; node && (n > NODE_NUMDATA(node)[node->N-1]); node=node->next) nskipped += node->N; if (!node) { // either we're adding the first element, or we're appending since // n is bigger than the largest element in the list. NLF(append)(list, n); return list->N-1; } */ // find where in the node it should be inserted... ind = 1 + NLF(binarysearch)(node, n); // check if it's a duplicate... if (unique && ind > 0 && (n == NODE_NUMDATA(node)[ind-1])) return BL_NOT_FOUND; // set the jump accessors... list->last_access = node; list->last_access_n = nskipped; // ... so that this runs in O(1). bl_insert(list, nskipped + ind, &n); return nskipped + ind; } size_t NLF(insert_ascending)(nl* list, const number n) { return NLF(insertascending)(list, n, 0); } ptrdiff_t NLF(insert_unique_ascending)(nl* list, const number n) { return NLF(insertascending)(list, n, 1); } size_t NLF(insert_descending)(nl* list, const number n) { return bl_insert_sorted(list, &n, NLF(compare_descending)); } void NLF(insert)(nl* list, size_t indx, const number data) { bl_insert(list, indx, &data); } void NLF(copy)(nl* list, size_t start, size_t length, number* vdest) { bl_copy(list, start, length, vdest); } void NLF(print)(nl* list) { bl_node* n; for (n=list->head; n; n=n->next) { int i; printf("[ "); for (i=0; iN; i++) { if (i > 0) printf(", "); NL_PRINT(NODE_NUMDATA(n)[i]); } printf("] "); } } ptrdiff_t NLF(index_of)(nl* list, const number data) { bl_node* n; number* idata; size_t npast = 0; for (n=list->head; n; n=n->next) { int i; idata = NODE_NUMDATA(n); for (i=0; iN; i++) if (idata[i] == data) return npast + i; npast += n->N; } return BL_NOT_FOUND; } int NLF(contains)(nl* list, const number data) { return (NLF(index_of)(list, data) != BL_NOT_FOUND); } int NLF(sorted_contains)(nl* list, const number n) { return NLF(sorted_index_of)(list, n) != BL_NOT_FOUND; } ptrdiff_t NLF(sorted_index_of)(nl* list, const number n) { bl_node *node; ptrdiff_t lower; size_t nskipped; node = NLF(findnodecontainingsorted)(list, n, &nskipped); if (!node) return BL_NOT_FOUND; //if (!node && (n > NODE_NUMDATA(prev)[prev->N-1])) //return -1; //node = prev; /* // find the first node for which n <= the last element. That node // will contain the value (if it exists) for (; node && (n > NODE_NUMDATA(node)[node->N-1]); node=node->next) nskipped += node->N; if (!node) return -1; */ // update jump accessors... list->last_access = node; list->last_access_n = nskipped; // find within the node... lower = NLF(binarysearch)(node, n); if (lower == BL_NOT_FOUND) return BL_NOT_FOUND; if (n == NODE_NUMDATA(node)[lower]) return nskipped + lower; return BL_NOT_FOUND; } #undef NLF #undef NODE_NUMDATA astrometry.net-0.67/util/bl-sort.c000644 000765 000024 00000007700 12651445460 017275 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "bl-sort.h" // for qsort_r #include "os-features.h" #include "bl.ph" #define nl il #define number int #include "bl-nl-sort.c" #undef nl #undef number #define nl ll #define number int64_t #include "bl-nl-sort.c" #undef nl #undef number #define nl fl #define number float #include "bl-nl-sort.c" #undef nl #undef number #define nl dl #define number double #include "bl-nl-sort.c" #undef nl #undef number static void bl_sort_with_userdata(bl* list, int (*compare)(const void* v1, const void* v2, void* userdata), void* userdata); struct funcandtoken { int (*compare)(const void* v1, const void* v2, void* userdata); void* userdata; }; static int QSORT_COMPARISON_FUNCTION(qcompare, void* token, const void* v1, const void* v2) { struct funcandtoken* ft = token; return ft->compare(v1, v2, ft->userdata); } static void bl_sort_rec(bl* list, void* pivot, int (*compare)(const void* v1, const void* v2, void* userdata), void* userdata) { bl* less; bl* equal; bl* greater; int i; bl_node* node; // Empty case if (!list->head) return; // Base case: list with only one block. if (list->head == list->tail) { bl_node* node; struct funcandtoken ft; ft.compare = compare; ft.userdata = userdata; node = list->head; QSORT_R(NODE_DATA(node), node->N, list->datasize, &ft, qcompare); return; } less = bl_new(list->blocksize, list->datasize); equal = bl_new(list->blocksize, list->datasize); greater = bl_new(list->blocksize, list->datasize); for (node=list->head; node; node=node->next) { char* data = NODE_CHARDATA(node); for (i=0; iN; i++) { int val = compare(data, pivot, userdata); if (val < 0) bl_append(less, data); else if (val > 0) bl_append(greater, data); else bl_append(equal, data); data += list->datasize; } } // recurse before freeing anything... bl_sort_with_userdata(less, compare, userdata); bl_sort_with_userdata(greater, compare, userdata); for (node=list->head; node;) { bl_node* next; next = node->next; bl_free_node(node); node = next; } list->head = NULL; list->tail = NULL; list->N = 0; list->last_access = NULL; list->last_access_n = 0; if (less->N) { list->head = less->head; list->tail = less->tail; list->N = less->N; } if (equal->N) { if (list->N) { list->tail->next = equal->head; list->tail = equal->tail; } else { list->head = equal->head; list->tail = equal->tail; } list->N += equal->N; } if (greater->N) { if (list->N) { list->tail->next = greater->head; list->tail = greater->tail; } else { list->head = greater->head; list->tail = greater->tail; } list->N += greater->N; } // note, these are supposed to be "free", not "bl_free"; we've stolen // the blocks, we're just freeing the headers. free(less); free(equal); free(greater); } static void bl_sort_with_userdata(bl* list, int (*compare)(const void* v1, const void* v2, void* userdata), void* userdata) { int ind; int N = list->N; if (N <= 1) return; // should do median-of-3/5/... to select pivot when N is large. ind = rand() % N; bl_sort_rec(list, bl_access(list, ind), compare, userdata); } static int sort_helper_bl(const void* v1, const void* v2, void* userdata) { int (*compare)(const void* v1, const void* v2) = userdata; return compare(v1, v2); } void bl_sort(bl* list, int (*compare)(const void* v1, const void* v2)) { bl_sort_with_userdata(list, sort_helper_bl, compare); } // dereference one level... static int sort_helper_pl(const void* v1, const void* v2, void* userdata) { const void* p1 = *((const void**)v1); const void* p2 = *((const void**)v2); int (*compare)(const void* p1, const void* p2) = userdata; return compare(p1, p2); } void pl_sort(pl* list, int (*compare)(const void* v1, const void* v2)) { bl_sort_with_userdata(list, sort_helper_pl, compare); } astrometry.net-0.67/util/bl.c000644 000765 000024 00000067730 12651445460 016321 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "bl.h" #include "keywords.h" #include "bl.ph" #include "log.h" static bl_node* bl_new_node(bl* list); static void bl_remove_from_node(bl* list, bl_node* node, bl_node* prev, int index_in_node); // Defined in bl.ph (private header): // free_node // NODE_DATA // NODE_CHARDATA // NODE_INTDATA // NODE_DOUBLEDATA // Defined in bl.inc (inlined functions): // bl_size // bl_access // il_size // il_get // NOTE!, if you make changes here, also see bl-sort.c ! //#define DEFINE_SORT 1 #define DEFINE_SORT 0 #define nl il #define number int #define NL_PRINT(x) printf("%i", x) #include "bl-nl.c" #undef nl #undef number #undef NL_PRINT #define nl ll #define number int64_t #define NL_PRINT(x) printf("%lli", (long long int)x) #include "bl-nl.c" #undef nl #undef number #undef NL_PRINT #define nl fl #define number float #define NL_PRINT(x) printf("%f", (float)x) #include "bl-nl.c" #undef nl #undef number #undef NL_PRINT #define nl dl #define number double #define NL_PRINT(x) printf("%g", x) #include "bl-nl.c" #undef nl #undef number #undef NL_PRINT #undef DEFINE_SORT #define DEFINE_SORT 0 #define nl pl #define number void* #define NL_PRINT(x) printf("%p", x) #include "bl-nl.c" #undef nl #undef number #undef NL_PRINT #undef DEFINE_SORT Pure int bl_datasize(const bl* list) { if (!list) return 0; return list->datasize; } void bl_split(bl* src, bl* dest, size_t split) { bl_node* node; size_t nskipped; size_t ind; size_t ntaken = src->N - split; node = find_node(src, split, &nskipped); ind = split - nskipped; if (ind == 0) { // this whole node belongs to "dest". if (split) { // we need to get the previous node... bl_node* last = find_node(src, split-1, NULL); last->next = NULL; src->tail = last; } else { // we've removed everything from "src". src->head = NULL; src->tail = NULL; } } else { // create a new node to hold the second half of the items in "node". bl_node* newnode = bl_new_node(dest); newnode->N = (node->N - ind); newnode->next = node->next; memcpy(NODE_CHARDATA(newnode), NODE_CHARDATA(node) + (ind * src->datasize), newnode->N * src->datasize); node->N -= (node->N - ind); node->next = NULL; src->tail = node; // to make the code outside this block work... node = newnode; } // append it to "dest". if (dest->tail) { dest->tail->next = node; dest->N += ntaken; } else { dest->head = node; dest->tail = node; dest->N += ntaken; } // adjust "src". src->N -= ntaken; src->last_access = NULL; } void bl_init(bl* list, int blocksize, int datasize) { list->head = NULL; list->tail = NULL; list->N = 0; list->blocksize = blocksize; list->datasize = datasize; list->last_access = NULL; list->last_access_n = 0; } bl* bl_new(int blocksize, int datasize) { bl* rtn; rtn = malloc(sizeof(bl)); if (!rtn) { printf("Couldn't allocate memory for a bl.\n"); return NULL; } bl_init(rtn, blocksize, datasize); return rtn; } void bl_free(bl* list) { if (!list) return; bl_remove_all(list); free(list); } void bl_remove_all(bl* list) { bl_node *n, *lastnode; lastnode = NULL; for (n=list->head; n; n=n->next) { if (lastnode) bl_free_node(lastnode); lastnode = n; } if (lastnode) bl_free_node(lastnode); list->head = NULL; list->tail = NULL; list->N = 0; list->last_access = NULL; list->last_access_n = 0; } void bl_remove_all_but_first(bl* list) { bl_node *n, *lastnode; lastnode = NULL; if (list->head) { for (n=list->head->next; n; n=n->next) { if (lastnode) bl_free_node(lastnode); lastnode = n; } if (lastnode) bl_free_node(lastnode); list->head->next = NULL; list->head->N = 0; list->tail = list->head; } else { list->head = NULL; list->tail = NULL; } list->N = 0; list->last_access = NULL; list->last_access_n = 0; } static void bl_remove_from_node(bl* list, bl_node* node, bl_node* prev, int index_in_node) { // if we're removing the last element at this node, then // remove this node from the linked list. if (node->N == 1) { // if we're removing the first node... if (prev == NULL) { list->head = node->next; // if it's the first and only node... if (list->head == NULL) { list->tail = NULL; } } else { // if we're removing the last element from // the tail node... if (node == list->tail) { list->tail = prev; } prev->next = node->next; } bl_free_node(node); } else { int ncopy; // just remove this element... ncopy = node->N - index_in_node - 1; if (ncopy > 0) { memmove(NODE_CHARDATA(node) + index_in_node * list->datasize, NODE_CHARDATA(node) + (index_in_node+1) * list->datasize, ncopy * list->datasize); } node->N--; } list->N--; } void bl_remove_index(bl* list, size_t index) { // find the node (and previous node) at which element 'index' // can be found. bl_node *node, *prev; size_t nskipped = 0; for (node=list->head, prev=NULL; node; prev=node, node=node->next) { if (index < (nskipped + node->N)) break; nskipped += node->N; } assert(node); bl_remove_from_node(list, node, prev, index-nskipped); list->last_access = NULL; list->last_access_n = 0; } void bl_remove_index_range(bl* list, size_t start, size_t length) { // find the node (and previous node) at which element 'start' // can be found. bl_node *node, *prev; size_t nskipped = 0; list->last_access = NULL; list->last_access_n = 0; for (node=list->head, prev=NULL; node; prev=node, node=node->next) { if (start < (nskipped + node->N)) break; nskipped += node->N; } // begin by removing any indices that are at the end of a block. if (start > nskipped) { // we're not removing everything at this node. size_t istart; size_t n; istart = start - nskipped; if ((istart + length) < node->N) { // we're removing a chunk of elements from the middle of this // block. move elements from the end into the removed chunk. memmove(NODE_CHARDATA(node) + istart * list->datasize, NODE_CHARDATA(node) + (istart + length) * list->datasize, (node->N - (istart + length)) * list->datasize); // we're done! node->N -= length; list->N -= length; return; } else { // we're removing everything from 'istart' to the end of this // block. just change the "N" values. n = (node->N - istart); node->N -= n; list->N -= n; length -= n; start += n; nskipped = start; prev = node; node = node->next; } } // remove complete blocks. for (;;) { size_t n; bl_node* todelete; if (length == 0 || length < node->N) break; // we're skipping this whole block. n = node->N; length -= n; start += n; list->N -= n; nskipped += n; todelete = node; node = node->next; bl_free_node(todelete); } if (prev) prev->next = node; else list->head = node; if (!node) list->tail = prev; // remove indices from the beginning of the last block. // note that we may have removed everything from the tail of the list, // no "node" may be null. if (node && length>0) { //printf("removing %i from end.\n", length); memmove(NODE_CHARDATA(node), NODE_CHARDATA(node) + length * list->datasize, (node->N - length) * list->datasize); node->N -= length; list->N -= length; } } static void clear_list(bl* list) { list->head = NULL; list->tail = NULL; list->N = 0; list->last_access = NULL; list->last_access_n = 0; } void bl_append_list(bl* list1, bl* list2) { list1->last_access = NULL; list1->last_access_n = 0; if (list1->datasize != list2->datasize) { printf("Error: cannot append bls with different data sizes!\n"); assert(0); exit(0); } if (list1->blocksize != list2->blocksize) { printf("Error: cannot append bls with different block sizes!\n"); assert(0); exit(0); } // if list1 is empty, then just copy over list2's head and tail. if (list1->head == NULL) { list1->head = list2->head; list1->tail = list2->tail; list1->N = list2->N; // remove everything from list2 (to avoid sharing nodes) clear_list(list2); return; } // if list2 is empty, then do nothing. if (list2->head == NULL) return; // otherwise, append list2's head to list1's tail. list1->tail->next = list2->head; list1->tail = list2->tail; list1->N += list2->N; // remove everything from list2 (to avoid sharing nodes) clear_list(list2); } static bl_node* bl_new_node(bl* list) { bl_node* rtn; // merge the mallocs for the node and its data into one malloc. rtn = malloc(sizeof(bl_node) + list->datasize * list->blocksize); if (!rtn) { printf("Couldn't allocate memory for a bl node!\n"); return NULL; } //rtn->data = (char*)rtn + sizeof(bl_node); rtn->N = 0; rtn->next = NULL; return rtn; } static void bl_append_node(bl* list, bl_node* node) { node->next = NULL; if (!list->head) { // first node to be added. list->head = node; list->tail = node; } else { list->tail->next = node; list->tail = node; } list->N += node->N; } /* * Append an item to this bl node. If this node is full, then create a new * node and insert it into the list. * * Returns the location where the new item was copied. */ void* bl_node_append(bl* list, bl_node* node, const void* data) { void* dest; if (node->N == list->blocksize) { // create a new node and insert it after the current node. bl_node* newnode; newnode = bl_new_node(list); newnode->next = node->next; node->next = newnode; if (list->tail == node) list->tail = newnode; node = newnode; } // space remains at this node. add item. dest = NODE_CHARDATA(node) + node->N * list->datasize; if (data) memcpy(dest, data, list->datasize); node->N++; list->N++; return dest; } void* bl_append(bl* list, const void* data) { if (!list->tail) // empty list; create a new node. bl_append_node(list, bl_new_node(list)); // append the item to the tail. if the tail node is full, a new tail node may be created. return bl_node_append(list, list->tail, data); } void* bl_push(bl* list, const void* data) { return bl_append(list, data); } void bl_pop(bl* list, void* into) { assert(list->N > 0); bl_get(list, list->N-1, into); bl_remove_index(list, list->N-1); } void bl_print_structure(bl* list) { bl_node* n; printf("bl: head %p, tail %p, N %zu\n", list->head, list->tail, list->N); for (n=list->head; n; n=n->next) { printf("[N=%i] ", n->N); } printf("\n"); } void bl_get(bl* list, size_t n, void* dest) { assert(list->N > 0); char* src = bl_access(list, n); memcpy(dest, src, list->datasize); } static void bl_find_ind_and_element(bl* list, const void* data, int (*compare)(const void* v1, const void* v2), void** presult, ptrdiff_t* pindex) { ptrdiff_t lower, upper; int cmp = -2; void* result; lower = -1; upper = list->N; while (lower < (upper-1)) { ptrdiff_t mid; mid = (upper + lower) / 2; cmp = compare(data, bl_access(list, mid)); if (cmp >= 0) { lower = mid; } else { upper = mid; } } if (lower == -1 || compare(data, (result = bl_access(list, lower)))) { *presult = NULL; if (pindex) *pindex = -1; return; } *presult = result; if (pindex) *pindex = lower; } /** * Finds a node for which the given compare() function * returns zero when passed the given 'data' pointer * and elements from the list. */ void* bl_find(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)) { void* rtn; bl_find_ind_and_element(list, data, compare, &rtn, NULL); return rtn; } ptrdiff_t bl_find_index(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)) { void* val; ptrdiff_t ind; bl_find_ind_and_element(list, data, compare, &val, &ind); return ind; } size_t bl_insert_sorted(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)) { ptrdiff_t lower, upper; lower = -1; upper = list->N; while (lower < (upper-1)) { ptrdiff_t mid; int cmp; mid = (upper + lower) / 2; cmp = compare(data, bl_access(list, mid)); if (cmp >= 0) { lower = mid; } else { upper = mid; } } bl_insert(list, lower+1, data); return lower+1; } ptrdiff_t bl_insert_unique_sorted(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)) { // This is just straightforward binary search - really should // use the block structure... ptrdiff_t lower, upper; lower = -1; upper = list->N; while (lower < (upper-1)) { ptrdiff_t mid; int cmp; mid = (upper + lower) / 2; cmp = compare(data, bl_access(list, mid)); if (cmp >= 0) { lower = mid; } else { upper = mid; } } if (lower >= 0) { if (compare(data, bl_access(list, lower)) == 0) { return BL_NOT_FOUND; } } bl_insert(list, lower+1, data); return lower+1; } void bl_set(bl* list, size_t index, const void* data) { bl_node* node; size_t nskipped; void* dataloc; node = find_node(list, index, &nskipped); dataloc = NODE_CHARDATA(node) + (index - nskipped) * list->datasize; memcpy(dataloc, data, list->datasize); // update the last_access member... list->last_access = node; list->last_access_n = nskipped; } /** * Insert the element "data" into the list, such that its index is "index". * All elements that previously had indices "index" and above are moved * one position to the right. */ void bl_insert(bl* list, size_t index, const void* data) { bl_node* node; size_t nskipped; if (list->N == index) { bl_append(list, data); return; } node = find_node(list, index, &nskipped); list->last_access = node; list->last_access_n = nskipped; // if the node is full: // if we're inserting at the end of this node, then create a new node. // else, shift all but the last element, add in this element, and // add the last element to a new node. if (node->N == list->blocksize) { int localindex, nshift; bl_node* next = node->next; bl_node* destnode; localindex = index - nskipped; // if the next node exists and is not full, then insert the overflowing // element at the front. otherwise, create a new node. if (next && (next->N < list->blocksize)) { // shift the existing elements up by one position... memmove(NODE_CHARDATA(next) + list->datasize, NODE_CHARDATA(next), next->N * list->datasize); destnode = next; } else { // create and insert a new node. bl_node* newnode = bl_new_node(list); newnode->next = next; node->next = newnode; if (!newnode->next) list->tail = newnode; destnode = newnode; } if (localindex == node->N) { // the new element becomes the first element in the destination node. memcpy(NODE_CHARDATA(destnode), data, list->datasize); } else { // the last element in this node is added to the destination node. memcpy(NODE_CHARDATA(destnode), NODE_CHARDATA(node) + (node->N-1)*list->datasize, list->datasize); // shift the end portion of this node up by one... nshift = node->N - localindex - 1; memmove(NODE_CHARDATA(node) + (localindex+1) * list->datasize, NODE_CHARDATA(node) + localindex * list->datasize, nshift * list->datasize); // insert the new element... memcpy(NODE_CHARDATA(node) + localindex * list->datasize, data, list->datasize); } destnode->N++; list->N++; } else { // shift... int localindex, nshift; localindex = index - nskipped; nshift = node->N - localindex; memmove(NODE_CHARDATA(node) + (localindex+1) * list->datasize, NODE_CHARDATA(node) + localindex * list->datasize, nshift * list->datasize); // insert... memcpy(NODE_CHARDATA(node) + localindex * list->datasize, data, list->datasize); node->N++; list->N++; } } void* bl_access_const(const bl* list, size_t n) { bl_node* node; size_t nskipped; node = find_node(list, n, &nskipped); // grab the element. return NODE_CHARDATA(node) + (n - nskipped) * list->datasize; } void bl_copy(bl* list, size_t start, size_t length, void* vdest) { bl_node* node; size_t nskipped; char* dest; if (length <= 0) return; node = find_node(list, start, &nskipped); // we've found the node containing "start". keep copying elements and // moving down the list until we've copied all "length" elements. dest = vdest; while (length > 0) { size_t take, avail; char* src; // number of elements we want to take. take = length; // number of elements available at this node. avail = node->N - (start - nskipped); if (take > avail) take = avail; src = NODE_CHARDATA(node) + (start - nskipped) * list->datasize; memcpy(dest, src, take * list->datasize); dest += take * list->datasize; start += take; length -= take; nskipped += node->N; node = node->next; } // update the last_access member... list->last_access = node; list->last_access_n = nskipped; } int bl_check_consistency(bl* list) { bl_node* node; size_t N; int tailok = 1; int nempty = 0; int nnull = 0; // if one of head or tail is NULL, they had both better be NULL! if (!list->head) nnull++; if (!list->tail) nnull++; if (nnull == 1) { fprintf(stderr, "bl_check_consistency: head is %p, and tail is %p.\n", list->head, list->tail); return 1; } N = 0; for (node=list->head; node; node=node->next) { N += node->N; if (!node->N) { // this block is empty. nempty++; } // are we at the last node? if (!node->next) { tailok = (list->tail == node) ? 1 : 0; } } if (!tailok) { fprintf(stderr, "bl_check_consistency: tail pointer is wrong.\n"); return 1; } if (nempty) { fprintf(stderr, "bl_check_consistency: %i empty blocks.\n", nempty); return 1; } if (N != list->N) { fprintf(stderr, "bl_check_consistency: list->N is %zu, but sum of blocks is %zu.\n", list->N, N); return 1; } return 0; } int bl_check_sorted(bl* list, int (*compare)(const void* v1, const void* v2), int isunique) { size_t i, N; size_t nbad = 0; void* v2 = NULL; N = bl_size(list); if (N) v2 = bl_access(list, 0); for (i=1; i= 0) { nbad++; } } else { if (cmp > 0) { nbad++; } } } if (nbad) { fprintf(stderr, "bl_check_sorted: %zu are out of order.\n", nbad); return 1; } return 0; } static void memswap(void* v1, void* v2, int len) { unsigned char tmp; unsigned char* c1 = v1; unsigned char* c2 = v2; int i; for (i=0; ihead; node; node=node->next) { for (i=0; i<(node->N/2); i++) { memswap(NODE_CHARDATA(node) + i * list->datasize, NODE_CHARDATA(node) + (node->N - 1 - i) * list->datasize, list->datasize); } pl_append(blocks, node); } // reverse the blocks lastnode = NULL; for (i=pl_size(blocks)-1; i>=0; i--) { node = pl_get(blocks, i); if (lastnode) lastnode->next = node; lastnode = node; } if (lastnode) lastnode->next = NULL; pl_free(blocks); // swap head and tail node = list->head; list->head = list->tail; list->tail = node; list->last_access = NULL; list->last_access_n = 0; } void* bl_extend(bl* list) { return bl_append(list, NULL); } // special-case pointer list accessors... int bl_compare_pointers_ascending(const void* v1, const void* v2) { void* p1 = *(void**)v1; void* p2 = *(void**)v2; if (p1 > p2) return 1; else if (p1 < p2) return -1; else return 0; } void pl_free_elements(pl* list) { size_t i; for (i=0; iN; while (lower < (upper-1)) { ptrdiff_t mid; int cmp; mid = (upper + lower) / 2; cmp = compare(data, pl_get(list, mid)); if (cmp >= 0) { lower = mid; } else { upper = mid; } } bl_insert(list, lower+1, &data); return lower+1; } /* void pl_set(pl* list, int index, void* data) { int i; int nadd = (index+1) - list->N; if (nadd > 0) { // enlarge the list to hold 'nadd' more entries. for (i=0; i=0; i--) { char* s = sl_get(lst, i); if (strcmp(s, str) == 0) return i; } return BL_NOT_FOUND; } // Returns 0 if the string is not in the sl, 1 otherwise. // (same as sl_index_of(lst, str) > -1) int sl_contains(sl* lst, const char* str) { return (sl_index_of(lst, str) > -1); } void sl_reverse(sl* list) { bl_reverse(list); } char* sl_append(sl* list, const char* data) { char* copy; if (data) { copy = strdup(data); assert(copy); } else copy = NULL; pl_append(list, copy); return copy; } void sl_append_array(sl* list, const char**strings, size_t n) { size_t i; for (i=0; i= 0); copy = strdup(value); if (index < list->N) { // we're replacing an existing value - free it! free(sl_get(list, index)); bl_set(list, index, ©); } else { // pad size_t i; for (i=list->N; iN); assert(start >= 0); assert(length >= 0); for (i=0; ihead; n; n=n->next) { printf("[\n"); for (i=0; iN; i++) printf(" \"%s\"\n", ((char**)NODE_DATA(n))[i]); printf("]\n"); } } static char* sljoin(sl* list, const char* join, int forward) { size_t start, end, inc; size_t len = 0; size_t i, N; char* rtn; size_t offset; size_t JL; if (sl_size(list) == 0) return strdup(""); // step through the list forward or backward? if (forward) { start = 0; end = sl_size(list); inc = 1; } else { start = sl_size(list) - 1; end = -1; inc = -1; } JL = strlen(join); N = sl_size(list); for (i=0; i #include "astrometry/qfits_header.h" #define BOILERPLATE_HELP_HEADER(fid) \ do { \ fprintf(fid, "This program is part of the Astrometry.net suite.\n"); \ fprintf(fid, "For details, visit http://astrometry.net.\n"); \ fprintf(fid, "Git URL %s\n", AN_GIT_URL); \ fprintf(fid, "Revision %s, date %s.\n", AN_GIT_REVISION, AN_GIT_DATE); \ } while (0) #define BOILERPLATE_ADD_FITS_HEADERS(hdr) \ do { \ fits_add_long_history(hdr, "Created by the Astrometry.net suite."); \ fits_add_long_history(hdr, "For more details, see http://astrometry.net."); \ fits_add_long_history(hdr, "Git URL %s", AN_GIT_URL); \ fits_add_long_history(hdr, "Git revision %s", AN_GIT_REVISION); \ fits_add_long_history(hdr, "Git date %s", AN_GIT_DATE); \ } while (0) #endif astrometry.net-0.67/util/bt.c000644 000765 000024 00000043057 12651445460 016325 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE The AVL tree portion of this code was adapted from GNU libavl, licensed under the GPL. */ #include #include #include #include #include #include "bt.h" /* The AVL tree portion of this code was adapted from GNU libavl. */ #define AVL_MAX_HEIGHT 32 // adapt compare_func to compare_func_2 static int compare_helper(const void* v1, const void* v2, void* token) { compare_func f = token; return f(v1, v2); } // data follows the bt_datablock*. static Const void* NODE_DATA(bt_leaf* leaf) { return leaf+1; } static Const char* NODE_CHARDATA(bt_leaf* leaf) { return (char*)(leaf+1); } static Pure anbool isleaf(bt_node* node) { return node->leaf.isleaf; } static Pure int node_N(bt_node* node) { if (isleaf(node)) return node->leaf.N; return node->branch.N; } static Pure int sum_childN(bt_branch* branch) { return node_N(branch->children[0]) + node_N(branch->children[1]); } static Pure bt_node* getchild(bt_node* node, int i) { if (isleaf(node)) return NULL; return node->branch.children[i]; } static Pure bt_node* getleftchild(bt_node* node) { if (isleaf(node)) return NULL; return node->branch.children[0]; } static Pure bt_node* getrightchild(bt_node* node) { if (isleaf(node)) return NULL; return node->branch.children[1]; } static Pure bt_leaf* firstleaf(bt_node* node) { if (isleaf(node)) return &node->leaf; return node->branch.firstleaf; } static int height_slow(bt_node* node) { int hl, hr; if (isleaf(node)) return 1; hl = height_slow(node->branch.children[0]); hr = height_slow(node->branch.children[1]); return 1 + (hl > hr ? hl : hr); } #define CHECK(expr) { \ int truthval = (expr); \ assert(truthval); \ if (!truthval) return -1; \ } static int bt_check_node(bt* tree, bt_node* node) { int hl, hr; bt_node* leftmost; if (isleaf(node)) { CHECK(node->leaf.N <= tree->blocksize); return 0; } CHECK(sum_childN(&node->branch) == node->branch.N); leftmost = node; while (!isleaf(leftmost)) leftmost = leftmost->branch.children[0]; CHECK(&leftmost->leaf == node->branch.firstleaf); hl = height_slow(node->branch.children[0]); hr = height_slow(node->branch.children[1]); CHECK(node->branch.balance == (hr - hl)); CHECK((node->branch.balance == 0) || (node->branch.balance == 1) || (node->branch.balance == -1)); if (bt_check_node(tree, node->branch.children[0]) || bt_check_node(tree, node->branch.children[1])) return -1; return 0; } int bt_check(bt* tree) { if (tree->root) { CHECK(node_N(tree->root) == tree->N); return bt_check_node(tree, tree->root); } return 0; } bt* bt_new(int datasize, int blocksize) { bt* tree = calloc(1, sizeof(bt)); if (!tree) { fprintf(stderr, "Failed to allocate a new bt struct: %s\n", strerror(errno)); return NULL; } tree->datasize = datasize; tree->blocksize = blocksize; return tree; } int bt_size(bt* tree) { return tree->N; } int bt_height(bt* tree) { bt_node* n; int h; n = tree->root; if (!n) return 0; if (isleaf(n)) return 1; for (h=1; !isleaf(n); h++) { if (n->branch.balance > 0) n = getrightchild(n); else n = getleftchild(n); } return h; } static int bt_count_leaves_rec(bt_node* node) { if (isleaf(node)) return 1; else return bt_count_leaves_rec(node->branch.children[0]) + bt_count_leaves_rec(node->branch.children[1]); } int bt_count_leaves(bt* tree) { return bt_count_leaves_rec(tree->root); } static void bt_free_node(bt_node* node) { if (!isleaf(node)) { bt_free_node(getleftchild(node)); bt_free_node(getrightchild(node)); } free(node); } void bt_free(bt* tree) { if (tree->root) bt_free_node(tree->root); free(tree); } static Pure void* get_element(bt* tree, bt_leaf* leaf, int index) { return NODE_CHARDATA(leaf) + index * tree->datasize; } static Pure void* first_element(bt_node* n) { if (isleaf(n)) return NODE_DATA(&n->leaf); else return NODE_DATA(n->branch.firstleaf); } static Malloc bt_node* bt_new_branch(bt* tree) { bt_node* n = calloc(1, sizeof(bt_node)); if (!n) { fprintf(stderr, "Failed to allocate a new bt_node: %s\n", strerror(errno)); return NULL; } return n; } static Malloc bt_node* bt_new_leaf(bt* tree) { bt_node* n = malloc(sizeof(bt_leaf) + tree->datasize * tree->blocksize); if (!n) { fprintf(stderr, "Failed to allocate a new bt_node: %s\n", strerror(errno)); return NULL; } n->leaf.isleaf = 1; n->leaf.N = 0; return n; } static anbool bt_leaf_insert(bt* tree, bt_leaf* leaf, void* data, anbool unique, compare_func_2 compare, void* token, void* overflow) { int lower, upper; int nshift; int index; // binary search... lower = -1; upper = leaf->N; while (lower < (upper-1)) { int mid; int cmp; mid = (upper + lower) / 2; cmp = compare(data, get_element(tree, leaf, mid), token); if (!cmp && unique) return FALSE; if (cmp >= 0) lower = mid; else upper = mid; } // index to insert at: index = lower + 1; // duplicate value? if (unique && (index > 0)) if (compare(data, get_element(tree, leaf, index-1), token) == 0) return FALSE; // shift... nshift = leaf->N - index; if (leaf->N == tree->blocksize) { // this node is full. insert the element and put the overflowing // element in "overflow". if (nshift) { memcpy(overflow, get_element(tree, leaf, leaf->N-1), tree->datasize); nshift--; } else { memcpy(overflow, data, tree->datasize); return TRUE; } } else { leaf->N++; tree->N++; } memmove(get_element(tree, leaf, index+1), get_element(tree, leaf, index), nshift * tree->datasize); // insert... memcpy(get_element(tree, leaf, index), data, tree->datasize); return TRUE; } static bt_node* next_node(bt_node** ancestors, int nancestors, bt_node* child, bt_node** nextancestors, int* nnextancestors) { // -first, find the first ancestor of whom we are a left // (grand^n)-child. bt_node* parent = NULL; int i, j; for (i=nancestors-1; i>=0; i--) { parent = ancestors[i]; if (parent->branch.children[0] == child) break; child = parent; } if (i < 0) { // no next node. return NULL; } // we share ancestors from the root to "parent". for (j=i; j>=0; j--) nextancestors[j] = ancestors[j]; *nnextancestors = i+1; // -next, find the leftmost leaf of the parent's right branch. child = parent->branch.children[1]; while (!isleaf(child)) { nextancestors[(*nnextancestors)++] = child; child = child->branch.children[0]; } return child; } // Pure? static anbool bt_leaf_contains(bt* tree, bt_leaf* leaf, void* data, compare_func_2 compare, void* token) { int lower, upper; lower = -1; upper = leaf->N; while (lower < (upper-1)) { int mid; int cmp; mid = (upper + lower) / 2; cmp = compare(data, get_element(tree, leaf, mid), token); if (cmp == 0) return TRUE; if (cmp > 0) lower = mid; else upper = mid; } // duplicate value? if (lower >= 0) if (compare(data, get_element(tree, leaf, lower), token) == 0) return TRUE; return FALSE; } // Pure? anbool bt_contains(bt* tree, void* data, compare_func compare) { return bt_contains2(tree, data, compare_helper, compare); } anbool bt_contains2(bt* tree, void* data, compare_func_2 compare, void* token) { bt_node *n; int cmp; int dir; if (!tree->root) return FALSE; dir = 0; for (n = tree->root; !isleaf(n); n = getchild(n, dir)) { cmp = compare(data, first_element(n->branch.children[1]), token); if (cmp == 0) return TRUE; dir = (cmp > 0); } return bt_leaf_contains(tree, &n->leaf, data, compare, token); } static void update_firstleaf(bt_node** ancestors, int nancestors, bt_node* child, bt_leaf* leaf) { int i; for (i=nancestors-1; i>=0; i--) { if (ancestors[i]->branch.children[0] != child) break; ancestors[i]->branch.firstleaf = leaf; child = ancestors[i]; } } anbool bt_insert(bt* tree, void* data, anbool unique, compare_func compare) { return bt_insert2(tree, data, unique, compare_helper, compare); } anbool bt_insert2(bt* tree, void* data, anbool unique, compare_func_2 compare, void* token) { bt_node *y, *z; /* Top node to update balance factor, and parent. */ bt_node *p, *q; /* Iterator, and parent. */ bt_node *n; /* Newly inserted node. */ bt_node *w; /* New root of rebalanced subtree. */ int dir; /* Direction to descend. */ bt_node* np; bt_node* ancestors[AVL_MAX_HEIGHT]; int nancestors = 0; unsigned char da[AVL_MAX_HEIGHT]; /* Cached comparison results. */ int k = 0; /* Number of cached results. */ unsigned char overflow[tree->datasize]; anbool rtn; anbool willfit; int cmp; int i; if (!tree->root) { // inserting the first element... n = bt_new_leaf(tree); tree->root = n; bt_leaf_insert(tree, &n->leaf, data, unique, compare, token, NULL); return TRUE; } z = y = tree->root; dir = 0; for (q = z, p = y; !isleaf(p); q = p, p = p->branch.children[dir]) { cmp = compare(data, first_element(p->branch.children[1]), token); if (unique && (cmp == 0)) return FALSE; if (p->branch.balance != 0) { z = q; y = p; k = 0; } ancestors[nancestors++] = p; da[k++] = dir = (cmp > 0); } cmp = compare(data, first_element(p), token); // will this element fit in the current node? willfit = (p->leaf.N < tree->blocksize); if (willfit) { rtn = bt_leaf_insert(tree, &p->leaf, data, unique, compare, token, overflow); // duplicate value? if (!rtn) return rtn; for (i=0; ibranch.N++; return TRUE; } da[k++] = (cmp > 0); if (cmp > 0) { // insert the new element into this node and shuffle the // overflowing element (which may be the new element) // into the next node, if it exists, or a new node. bt_node* nextnode; bt_node* nextancestors[AVL_MAX_HEIGHT]; int nnextancestors; /* HACK - should we traverse the tree looking for the next node, or just take the right sibling if we're the left child of a balanced parent? */ rtn = bt_leaf_insert(tree, &p->leaf, data, unique, compare, token, overflow); if (!rtn) // duplicate value. return rtn; nextnode = next_node(ancestors, nancestors, p, nextancestors, &nnextancestors); assert(!nextnode || isleaf(nextnode)); if (nextnode && (nextnode->leaf.N < tree->blocksize)) { // there's room; insert the element! rtn = bt_leaf_insert(tree, &nextnode->leaf, overflow, unique, compare, token, NULL); for (i=0; ibranch.N++; return rtn; } // no room (or no next node); add a new node to the right to hold // the overflowed data. dir = 1; data = overflow; } else { // add a new node to the left. dir = 0; } // we have "q", the parent node, and "p", the existing leaf node which is // full. we create a new branch node, "np", to take "p"'s place. // we move "p" down to be the child (1-dir) of "np", and create a new // leaf node, "n", to be child (dir) of "np". // create "n", a new leaf node to hold this element. n = bt_new_leaf(tree); if (!n) return FALSE; rtn = bt_leaf_insert(tree, &n->leaf, data, unique, compare, token, NULL); if (!rtn) { free(n); return FALSE; } // create "np", a new branch node to take p's place. np = bt_new_branch(tree); if (!np) return FALSE; np->branch.children[dir] = n; np->branch.children[1-dir] = p; np->branch.N = p->leaf.N + 1; np->branch.firstleaf = &(np->branch.children[0]->leaf); if (!isleaf(q)) { if (q->branch.children[0] == p) { q->branch.children[0] = np; if (!dir) update_firstleaf(ancestors, nancestors, np, np->branch.firstleaf); } else if (q->branch.children[1] == p) // need this because it could be that p = q = root. q->branch.children[1] = np; } if (p == tree->root) tree->root = np; for (i=0; ibranch.N++; if (!y || isleaf(y)) return TRUE; for (p = y, k = 0; p != np; p = p->branch.children[da[k]], k++) if (da[k] == 0) p->branch.balance--; else p->branch.balance++; if (y->branch.balance == -2) { bt_node *x = y->branch.children[0]; if (x->branch.balance == -1) { /* y |- x | |- x0 | |- x1 |- y1 becomes x |- x0 |- y . |- x1 . |- y1 */ w = x; y->branch.children[0] = x->branch.children[1]; x->branch.children[1] = y; x->branch.balance = y->branch.balance = 0; y->branch.firstleaf = firstleaf(y->branch.children[0]); y->branch.N = sum_childN(&y->branch); x->branch.N = sum_childN(&x->branch); } else { /* y |- x | |- x0 | |- x1 (= w) | |- x10 | |- x11 |- y1 becomes x1 |- x | |- x0 | |- x10 |- y . |- x11 . |- y1 */ assert (x->branch.balance == 1); w = x->branch.children[1]; x->branch.children[1] = w->branch.children[0]; w->branch.children[0] = x; y->branch.children[0] = w->branch.children[1]; w->branch.children[1] = y; y->branch.firstleaf = firstleaf(y->branch.children[0]); w->branch.firstleaf = x->branch.firstleaf; y->branch.N = sum_childN(&y->branch); x->branch.N = sum_childN(&x->branch); w->branch.N = sum_childN(&w->branch); if (w->branch.balance == -1) { x->branch.balance = 0; y->branch.balance = 1; } else if (w->branch.balance == 0) x->branch.balance = y->branch.balance = 0; else { x->branch.balance = -1; y->branch.balance = 0; } w->branch.balance = 0; } } else if (y->branch.balance == 2) { bt_node *x = y->branch.children[1]; if (x->branch.balance == 1) { /* y |- y0 |- x . |- x0 . |- x1 becomes x |- y | |- y0 | |- x0 |- x1 */ w = x; y->branch.children[1] = x->branch.children[0]; x->branch.children[0] = y; x->branch.balance = y->branch.balance = 0; x->branch.firstleaf = y->branch.firstleaf; y->branch.N = sum_childN(&y->branch); x->branch.N = sum_childN(&x->branch); } else { /* y |- y0 |- x . |- x0 . | |- x00 . | |- x01 . |- x1 becomes x0 |- y | |- y0 | |- x00 |- x . |- x01 . |- x1 */ assert (x->branch.balance == -1); w = x->branch.children[0]; x->branch.children[0] = w->branch.children[1]; w->branch.children[1] = x; y->branch.children[1] = w->branch.children[0]; w->branch.children[0] = y; y->branch.N = sum_childN(&y->branch); x->branch.N = sum_childN(&x->branch); w->branch.N = sum_childN(&w->branch); x->branch.firstleaf = firstleaf(x->branch.children[0]); w->branch.firstleaf = y->branch.firstleaf; if (w->branch.balance == 1) { x->branch.balance = 0; y->branch.balance = -1; } else if (w->branch.balance == 0) x->branch.balance = y->branch.balance = 0; else { x->branch.balance = 1; y->branch.balance = 0; } w->branch.balance = 0; } } else goto finished; if (y == tree->root) tree->root = w; else { if (y == z->branch.children[0]) { z->branch.children[0] = w; z->branch.firstleaf = w->branch.firstleaf; } else z->branch.children[1] = w; } finished: return TRUE; } // Pure? void* bt_access(bt* tree, int index) { bt_node* n = tree->root; int offset = index; while (!isleaf(n)) { int Nleft = node_N(n->branch.children[0]); if (offset >= Nleft) { n = n->branch.children[1]; offset -= Nleft; } else n = n->branch.children[0]; } return get_element(tree, &n->leaf, offset); } static void bt_print_node(bt* tree, bt_node* node, char* indent, void (*print_element)(void* val)) { printf("%s", indent); printf("(%p) ", node); printf("N=%i", node_N(node)); if (!isleaf(node)) { char* subind; char* addind = " "; printf(", leftmost (%p)", node->branch.firstleaf); printf(", Nleft=%i, Nright=%i, balance %i.\n", node_N(node->branch.children[0]), node_N(node->branch.children[1]), node->branch.balance); subind = malloc(strlen(indent) + strlen(addind) + 1); sprintf(subind, "%s%s", indent, addind); printf("%sLeft child:\n", indent); bt_print_node(tree, node->branch.children[0], subind, print_element); printf("%sRight child:\n", indent); bt_print_node(tree, node->branch.children[1], subind, print_element); free(subind); } else { int i; printf(". Leaf."); if (print_element) { printf(" [ "); for (i=0; ileaf, i)); } printf("]\n"); } } void bt_print(bt* tree, void (*print_element)(void* val)) { printf(" bt: N=%i, datasize=%i, blocksize=%i.\n", tree->N, tree->datasize, tree->blocksize); printf(" root=(%p)\n", tree->root); if (!tree->root) { printf(" Empty tree.\n"); return; } bt_print_node(tree, tree->root, " ", print_element); } static void bt_print_struct_node(bt* tree, bt_node* node, char* indent, void (*print_element)(void* val)) { printf("%s", indent); if (!isleaf(node)) { char* subind; char* addind = "|--"; printf("(bal %i)\n", node->branch.balance); subind = malloc(strlen(indent) + strlen(addind) + 1); sprintf(subind, "%s%s", indent, addind); bt_print_struct_node(tree, node->branch.children[0], subind, print_element); bt_print_struct_node(tree, node->branch.children[1], subind, print_element); } else { int i; printf("(leaf)"); if (print_element) { printf(" [ "); for (i=0; ileaf, i)); printf("]"); } printf("\n"); } } void bt_print_structure(bt* tree, void (*print_element)(void* val)) { bt_print_struct_node(tree, tree->root, " ", print_element); } astrometry.net-0.67/util/c.py000755 000765 000024 00000000000 12651445460 017657 2util.pyustar00dstnstaff000000 000000 astrometry.net-0.67/util/cairoutils.c000644 000765 000024 00000051174 12651445460 020075 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include #include "os-features.h" #if HAVE_NETPBM #include #endif #include "ioutils.h" #include "cairoutils.h" #include "errors.h" enum imgformat { PPM, PNG, JPEG, }; typedef enum imgformat imgformat; struct mycolor { const char* name; float r,g,b; }; typedef struct mycolor mycolor; static mycolor mycolors[] = { { "darkred", 0.5, 0.0, 0.0 }, { "red", 1.0, 0.0, 0.0 }, { "darkgreen", 0.0, 0.5, 0.0 }, { "green", 0.0, 1.0, 0.0 }, { "blue", 0.0, 0.0, 1.0 }, { "verydarkblue", 0.0, 0.0, 0.2 }, { "white", 1.0, 1.0, 1.0 }, { "black", 0.0, 0.0, 0.0 }, { "cyan", 0.0, 1.0, 1.0 }, { "magenta", 1.0, 0.0, 1.0 }, { "yellow", 1.0, 1.0, 0.0 }, { "brightred", 1.0, 0.0, 0.2 }, { "skyblue", 0.0, 0.5, 1.0 }, { "orange", 1.0, 0.5, 0.0 }, { "gray", 0.5, 0.5, 0.5 }, { "darkgray", 0.25, 0.25, 0.25 }, }; static const int nmycolors = sizeof(mycolors)/sizeof(mycolor); cairo_status_t cairoutils_file_write_func(void *closure, const unsigned char *data, unsigned int length) { FILE* fid = closure; if (fwrite(data, 1, length, fid) != length) { SYSERROR("Failed to write cairo data"); return CAIRO_STATUS_WRITE_ERROR; } return CAIRO_STATUS_SUCCESS; } const char* cairoutils_get_color_name(int i) { if ((i < 0) || (i >= nmycolors)) return NULL; return mycolors[i].name; } int cairoutils_surface_status_errors(cairo_surface_t* surf) { int st = cairo_surface_status(surf); switch (st) { case CAIRO_STATUS_SUCCESS: return 0; case CAIRO_STATUS_NULL_POINTER: ERROR("Cairo null pointer"); break; case CAIRO_STATUS_NO_MEMORY: ERROR("Cairo no memory"); break; case CAIRO_STATUS_READ_ERROR: ERROR("Cairo read error"); break; case CAIRO_STATUS_INVALID_CONTENT: ERROR("Cairo invalid content"); break; case CAIRO_STATUS_INVALID_FORMAT: ERROR("Cairo invalid format"); break; case CAIRO_STATUS_INVALID_VISUAL: ERROR("Cairo invalid visual"); break; } return -1; } int cairoutils_cairo_status_errors(cairo_t* c) { cairo_status_t st = cairo_status(c); if (st == CAIRO_STATUS_SUCCESS) return 0; ERROR("Cairo: %s", cairo_status_to_string(st)); return -1; } void cairoutils_draw_path(cairo_t* c, const double* xy, int N) { int i; for (i=0; i= '0') && (c <= '9')) return c - '0'; if ((c >= 'A') && (c <= 'F')) return 0xA + (c - 'A'); if ((c >= 'a') && (c <= 'f')) return 0xa + (c - 'a'); return 0; } int cairoutils_parse_color(const char* color, float* r, float* g, float* b) { int i; for (i=0; i= nmymarkers)) return NULL; return mymarkers[i].name; } int cairoutils_parse_marker(const char* name) { int i; for (i=0; i= nmymarkers)) return; mymarkers[id].drawit(cairo, x, y, radius, mymarkers[id].name); //cairo_stroke(cairo); } void cairoutils_print_marker_names(const char* prefix) { int i; for (i=0;; i++) { const char* marker = cairoutils_get_marker_name(i); if (!marker) break; if (prefix) printf("%s", prefix); printf("%s", marker); } } void cairoutils_print_color_names(const char* prefix) { int i; for (i=0;; i++) { const char* color = cairoutils_get_color_name(i); if (!color) break; if (prefix) printf("%s", prefix); printf("%s", color); } } unsigned char* cairoutils_read_jpeg(const char* fn, int* pW, int* pH) { FILE* fid; unsigned char* img; if (!strcmp(fn, "-")) { return cairoutils_read_jpeg_stream(stdin, pW, pH); } fid = fopen(fn, "rb"); if (!fid) { fprintf(stderr, "Failed to open file %s\n", fn); return NULL; } img = cairoutils_read_jpeg_stream(fid, pW, pH); fclose(fid); return img; } unsigned char* cairoutils_read_png(const char* fn, int* pW, int *pH) { FILE* fid; unsigned char* img; fid = fopen(fn, "rb"); if (!fid) { fprintf(stderr, "Failed to open file %s\n", fn); return NULL; } img = cairoutils_read_png_stream(fid, pW, pH); fclose(fid); return img; } static void user_error_fn(png_structp png_ptr, png_const_charp error_msg) { fprintf(stderr, "PNG error: %s\n", error_msg); } static void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg) { fprintf(stderr, "PNG warning: %s\n", warning_msg); } unsigned char* cairoutils_read_png_stream(FILE* fid, int* pW, int *pH) { png_structp ping; png_infop info; png_uint_32 W, H; unsigned char* outimg; png_bytepp rows; int j; int bitdepth, color_type, interlace; ping = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, user_error_fn, user_warning_fn); if (!ping) return NULL; info = png_create_info_struct(ping); if (!info) { png_destroy_read_struct(&ping, NULL, NULL); return NULL; } png_init_io(ping, fid); png_read_info(ping, info); png_get_IHDR(ping, info, &W, &H, &bitdepth, &color_type, &interlace, NULL, NULL); // see cairo's cairo-png.c if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(ping); if (color_type == PNG_COLOR_TYPE_GRAY && bitdepth < 8) png_set_expand(ping); if (png_get_valid(ping, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(ping); if (bitdepth == 16) png_set_strip_16(ping); if (bitdepth < 8) png_set_packing(ping); if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(ping); if (interlace != PNG_INTERLACE_NONE) png_set_interlace_handling(ping); png_set_filler(ping, 0xff, PNG_FILLER_AFTER); png_read_update_info(ping, info); outimg = malloc(4 * W * H); rows = malloc(H * sizeof(png_bytep)); if (!outimg || !rows) { free(outimg); png_destroy_read_struct(&ping, &info, NULL); return NULL; } for (j=0; j> 24) & 0xff; r = (ipix >> 16) & 0xff; g = (ipix >> 8) & 0xff; b = (ipix ) & 0xff; outimg[4*i + 0] = r; outimg[4*i + 1] = g; outimg[4*i + 2] = b; outimg[4*i + 3] = a; } } void cairoutils_argb32_to_rgba_flip(const unsigned char* inimg, unsigned char* outimg, int W, int H) { int i, j; for (i=0; i> 24) & 0xff; r = (ipix >> 16) & 0xff; g = (ipix >> 8) & 0xff; b = (ipix ) & 0xff; outrow[4*j + 0] = r; outrow[4*j + 1] = g; outrow[4*j + 2] = b; outrow[4*j + 3] = a; } } } void cairoutils_rgba_to_argb32(unsigned char* img, int W, int H) { cairoutils_rgba_to_argb32_2(img, img, W, H); } void cairoutils_rgba_to_argb32_2(const unsigned char* inimg, unsigned char* outimg, int W, int H) { int i; for (i=0; i<(H*W); i++) { unsigned char r,g,b,a; uint32_t* ipix; r = inimg[4*i + 0]; g = inimg[4*i + 1]; b = inimg[4*i + 2]; a = inimg[4*i + 3]; ipix = (uint32_t*)(outimg + 4*i); *ipix = (a << 24) | (r << 16) | (g << 8) | b; } } void cairoutils_rgba_to_argb32_flip(const unsigned char* inimg, unsigned char* outimg, int W, int H) { int i, j; for (i=0; i tag found:' print doc return None if len(jobids) > 1: print 'Multiple tags found:' print doc return None jobid = jobids[0] if not jobid.hasChildNodes(): print ' tag has no child node:' print doc return None jobid = jobid.firstChild if jobid.nodeType != xml.dom.Node.TEXT_NODE: print 'job id is not a text node:' print doc return None jobid = int(jobid.data) if jobid == -1: # Error: find error message. print 'Failed to submit query. Looking for error message...' founderr = False msgs = xmldoc.getElementsByTagName('message') for msg in msgs: if msg.hasChildNodes(): c = msg.firstChild if c.nodeType == xml.dom.Node.TEXT_NODE: print 'Error message:', c.data founderr = True if not founderr: print 'Error message not found. Whole response document:' print print doc print return jobid def login(self, username, password): print 'Logging in.' data = urllib.urlencode({'userid': username, 'password': password}) f = urllib2.urlopen(self.login_url(), data) d = f.read() # headers = f.info() # print 'headers:', headers # print 'Got response:' # print d return None def cancel_job(self, jobid): data = urllib.urlencode({'id': jobid, 'CancelJob': 'Cancel Job'}) f = urllib2.urlopen(self.cancel_url(), data) f.read() # Returns 'Finished', 'Ready', 'Started', 'Failed', 'Cancelled' def get_job_status(self, jobid): # print 'Getting job status for', jobid url = self.job_details_url() % jobid print 'Job details URL:', url doc = urllib2.urlopen(url).read() for line in doc.split('\n'): for stat in ['Finished', 'Ready', 'Started', 'Failed', 'Cancelled']: if ('

%s

' %(stat,stat) in line or #'

%s

' %(stat,stat) in line or '

%s

' % (stat,stat) in line or '

%s

' %(stat,stat) in line or '

Running

' %(stat) in line): # Galex "Started"/Running return stat return None def drop_table(self, dbname): url = self.drop_url() % dbname try: f = urllib2.urlopen(url) except Exception,e: print 'Failed to drop table', dbname print e return False doc = f.read() (vs,ev) = get_viewstate_and_eventvalidation(doc) data = urllib.urlencode({'yesButton':'Yes', '__EVENTVALIDATION':ev, '__VIEWSTATE':vs}) print 'Dropping table', dbname try: f = urllib2.urlopen(url, data) except Exception,e: print 'Failed to drop table', dbname print e return False d = f.read() # print 'Got response:' # print d # write_file(d, 'res.html') return True def request_output(self, mydbname): url = self.mydb_action_url() % mydbname try: # Need to prime the VIEWSTATE by "clicking" through... f = urllib2.urlopen(self.mydb_url()) f.read() f = urllib2.urlopen(self.mydb_index_url()) f.read() # request = urllib2.Request(url) # request.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060214 Firefox/3.0.11') # f = urllib2.urlopen(request) # Referer: http://galex.stsci.edu/casjobs/mydbindex.aspx f = urllib2.urlopen(url) except urllib2.HTTPError,e: print 'HTTPError:', e print ' code', e.code print ' msg', e.msg print ' hdrs', e.hdrs print ' data:', e.fp.read() raise e doc = f.read().strip() # write_file(doc, 'r1.html') (vs,ev) = get_viewstate_and_eventvalidation(doc) data = {'extractDDL':'FITS', 'Button1':'Go', '__VIEWSTATE':vs} if ev is not None: data['__EVENTVALIDATION'] = ev extra = self.params.get('request_output_extra') if extra is not None: data.update(extra) print 'requesting FITS output of MyDB table', mydbname print 'url', url print 'data', urllib.urlencode(data) try: f = urllib2.urlopen(url, urllib.urlencode(data)) except urllib2.HTTPError,e: print 'HTTPError:', e print ' code', e.code # print ' reason', e.reason raise e d = f.read() # print 'Got response:' # print d # write_file(d, 'res.html') return def get_ready_outputs(self): url = self.output_url() print 'Hitting output URL', url f = urllib2.urlopen(url) doc = f.read() write_file(doc, 'ready.html') print 'Wrote ready downloads to ready.html' urls = [] fns = [] # split into successful and failed parts ifailed = doc.index('Failed Output:') if ifailed > -1: failed = doc[ifailed:] doc = doc[:ifailed] else: failed = '' rex = re.compile('Download') for line in doc.split('\n'): m = rex.search(line) if not m: continue urls.append(m.group(1)) fns.append(m.group(2)) fails = [] rex = re.compile(r'^\s*(.*?).*?(.*?)(.*?)', flags=re.MULTILINE | re.DOTALL) for m in rex.finditer(failed): tab = m.group(1) if '
' in tab: continue msg = m.group(3).replace('\r', ' ').replace('\n', ' ') fails.append((tab, m.group(2), msg)) # ( table name, date string, failure message ) return (urls, fns, fails) def sql_to_fits(self, sql, outfn, dbcontext=None, sleeptime=10): import random dbname = ''.join(chr(ord('A') + random.randrange(26)) for x in range(10)) if sql.lower().startswith('select '): sql = 'select into mydb.%s' % dbname + sql[6:] print 'Submitting query: "%s"' % sql if dbcontext is not None: kwargs = dict(dbcontext=dbcontext) else: kwargs = {} jid = self.submit_query(sql, **kwargs) print 'Submitted job id', jid print 'Waiting for job id:', jid while True: jobstatus = self.get_job_status(jid) print 'Job id', jid, 'is', jobstatus if jobstatus in ['Finished', 'Failed', 'Cancelled']: break print 'Sleeping...' time.sleep(sleeptime) print 'Output-downloads-delete' dodelete = True self.output_and_download([dbname], [outfn], dodelete) # Requests output of the given list of databases, waits for them to appear, # downloads them, and writes them to the given list of local filenames. # # 'dbs' and 'fns' must be either strings, # or lists of string of the same length. # # If 'dodelete' is True, the databases will be deleted after download. # def output_and_download(self, dbs, fns, dodelete=False, sleeptime=10, raiseonfail=True): if type(dbs) is str: dbs = [dbs] assert(type(fns) is str) fns = [fns] # copy lists dbs = dbs[:] fns = fns[:] print 'Getting list of available downloads...' (preurls,nil,prefails) = self.get_ready_outputs() #print 'Preurls:', preurls #print 'Prefails:', prefails for db in dbs: print 'Requesting output of', db self.request_output(db) while True: print 'Waiting for output to appear...' (durls,dfns,dfails) = self.get_ready_outputs() (newurls, newfns) = find_new_outputs(durls, dfns, preurls) #print 'URLs:', durls #print 'New URLs:', newurls print 'New outputs available:', newfns newfails = [f for f in dfails if not f in prefails] print 'New failures:', newfails for (fn,db) in zip(fns,dbs): for (dfn,durl) in zip(newfns,newurls): # the filename will contain the db name. if not db in dfn: continue print 'Output', dfn, 'looks like it belongs to database', db print 'Downloading to local file', fn cmd = 'wget -O "%s" "%s"' % (fn, durl) print ' (running: "%s")' % cmd w = os.system(cmd) if not os.WIFEXITED(w) or os.WEXITSTATUS(w): print 'download failed.' return -1 dbs.remove(db) fns.remove(fn) if dodelete: print 'Deleting database', db self.drop_table(db) for (fn,db) in zip(fns,dbs): for tab,date,msg in newfails: if db != tab: continue print 'Failure:', tab, 'date', date, 'message', msg print 'looks like it belongs to database', db dbs.remove(db) fns.remove(fn) if raiseonfail: raise RuntimeError('Error from CasJobs on output of table "%s": "%s"' % (db, msg)) if not len(dbs): break print 'Waiting...' time.sleep(sleeptime) return 0 def get_viewstate_and_eventvalidation(doc): rex = re.compile('') vs = None for line in doc.split('\n'): m = rex.search(line) if not m: continue vs = m.group(1) break rex = re.compile('') ev = None for line in doc.split('\n'): m = rex.search(line) if not m: continue ev = m.group(1) break return (vs,ev) def query(sql): f = casquery(sql) header = f.readline().strip() if header.startswith('ERROR'): raise RuntimeError('SQL error: ' + f.read()) cols = header.split(',') results = [] for line in f: words = line.strip().split(',') row = [] for w in words: try: ival = int(w) row.append(ival) continue except ValueError: pass try: fval = float(w) row.append(fval) continue except ValueError: pass row.append(w) results.append(row) return (cols, results) def setup_cookies(): cookie_handler = urllib2.HTTPCookieProcessor() opener = urllib2.build_opener(cookie_handler) # ...and install it globally so it can be used with urlopen. urllib2.install_opener(opener) def find_new_outputs(durls, dfns, preurls): newurls = [u for u in durls if not u in preurls] newfns = [f for (f,u) in zip(dfns,durls) if not u in preurls] return (newurls, newfns) def get_known_servers(): return { 'galex': Cas( base_url='http://galex.stsci.edu/casjobs/', submiturl='SubmitJob.aspx', actionurl='mydbcontent.aspx?tableName=%s&kind=tables', defaultdb='GALEXGR4Plus5', outputbaseurl='http://mastweb.stsci.edu/CasOutPut/FITS/' ), # SDSS 'dr7': Cas( base_url='http://casjobs.sdss.org/CasJobs/', submiturl='submitjobhelper.aspx', actionurl='mydbcontent.aspx?ObjName=%s&ObjType=TABLE&context=MyDB&type=normal', defaultdb='DR7', request_output_extra={ 'targetDDL':'TargDR7Long' }, outputbaseurl='http://casjobs.sdss.org/CasJobsOutput2/FITS/' ), # SDSS 'dr8': Cas( # These will change... base_url='http://skyserver.sdss3.org/casjobs/', # base_url='http://skyservice.pha.jhu.edu/casjobs/', submiturl='submitjobhelper.aspx', actionurl='mydbcontent.aspx?ObjName=%s&ObjType=TABLE&context=MyDB&type=normal', defaultdb='DR8', #request_output_extra={ 'targetDDL':'Thumper_DR7' }, outputbaseurl='http://skyservice.pha.jhu.edu/CasJobsOutput/FITS/' ), 'dr9': Cas( # These will change... base_url='http://skyserver.sdss3.org/casjobs/', submiturl='submitjobhelper.aspx', actionurl='mydbcontent.aspx?ObjName=%s&ObjType=TABLE&context=MyDB&type=normal', defaultdb='DR9', outputbaseurl='http://skyservice.pha.jhu.edu/CasJobsOutput/FITS/' ), } if __name__ == '__main__': from optparse import OptionParser surveys = get_known_servers() parser = OptionParser(usage=('%prog ')) parser.add_option('-s', '--survey', dest='survey', default='dr7', help=('Set the CasJobs instance to use: one of: ' + ', '.join(surveys.keys()))) parser.add_option('-c', '--context', '--db', dest='dbcontext', help='Database context ("DR7", "Stripe82", etc)') opt,args = parser.parse_args() cas = surveys[opt.survey] if len(args) < 2: print '%s [command ]' % sys.argv[0] print print 'commands include:' print ' sqltofits ( or <@sql-file>) output.fits' print ' delete [...]' print ' query ( or <@sqlfile> ) [...]' print ' querywait ( or <@sqlfile> ) [...]' print ' -> submit query and wait for it to finish' print ' output [...]' print ' -> request that a database be output as a FITS table' print ' outputdownload [...]' print ' -> request output, wait for it to finish, and download to ' print ' outputdownloaddelete [...]' print ' -> request output, wait for it to finish, download to , and drop table.' sys.exit(-1) instance = 4 username = args[0] password = args[1] cmd = None if len(args) > 2: cmd = args[2] setup_cookies() cas.login(username, password) if cmd == 'delete': if len(args) < 4: print 'Usage: ... delete ' sys.exit(-1) db = args[3] print 'Dropping', db cas.drop_table(db) sys.exit(0) if cmd in ['query', 'querywait']: qs = args[3:] if len(qs) == 0: print 'Usage: ... query or <@file> [...]' sys.exit(-1) jids = [] for q in qs: if q.startswith('@'): q = read_file(q[1:]) print 'Submitting query: "%s"' % q jobid = cas.submit_query(q, dbcontext=opt.dbcontext) print 'Submitted job id', jobid jids.append(jobid) if cmd in ['querywait']: # wait for them to finish. while True: print 'Waiting for job ids:', jids for jid in jids: jobstatus = cas.get_job_status(jid) print 'Job id', jid, 'is', jobstatus if jobstatus in ['Finished', 'Failed', 'Cancelled']: jids.remove(jid) if not len(jids): break print 'Sleeping...' time.sleep(10) sys.exit(0) if cmd == 'sqltofits': if len(args) != 5: print 'Usage: ... sqltofits [ or <@file>] output.fits' sys.exit(-1) q = args[3] outfn = args[4] if q.startswith('@'): q = read_file(q[1:]) cas.sql_to_fits(q, outfn, dbcontext=opt.dbcontext) sys.exit(0) if cmd == 'output': dbs = args[3:] if len(dbs) == 0: print 'Usage: ... output [ ...]' sys.exit(-1) for db in dbs: print 'Requesting output of db', db cas.request_output(db) sys.exit(0) if cmd in ['outputdownload', 'outputdownloaddelete']: dodelete = (cmd == 'outputdownloaddelete') dbfns = args[3:] if len(dbfns) == 0 or len(dbfns) % 2 == 1: print 'Usage: ... outputdownload [...]' sys.exit(-1) dbs = dbfns[0::2] fns = dbfns[1::2] cas.output_and_download(dbs, fns, dodelete) sys.exit(0) print 'Unrecognized command' astrometry.net-0.67/util/celestial_mechanics.py000644 000765 000024 00000031267 12651445460 022105 0ustar00dstnstaff000000 000000 # celestial_mechanics.py # celestial mechanics utilities for exoplanet ephemerides # # intellectual property: # Copyright 2009 David W. Hogg. All rights reserved. # Licensed under a 3-clause BSD style license - see LICENSE # # comments: # - Written for clarity, not speed. The code is intended to be human- # readable. # # bugs: # - Need to make Fourier expansion functions. # - What to do if e is close to 1.0 in eccentric_anomaly # from math import pi import unittest import sys import numpy import numpy as np from numpy import * from scipy.special import jn import matplotlib.pyplot as plt from astrometry.util.starutil_numpy import * ihat = array([1.,0.,0.]) jhat = array([0.,1.,0.]) khat = array([0.,0.,1.]) default_tolerance = 1e-15 # (radians) don't set to zero or less default_maximum_iteration = 1000 # should never hit this limit! default_order = 32 default_K = 1.0 (Equinox, Solstice, EclipticPole) = ecliptic_basis() c_au_per_yr = 63239.6717 # google says #GM_sun = 2.9591310798672560E-04 #AU^3/d^2 # Google says mass of the sun * G = 39.4775743 (au^3) / (yr^2) GM_sun = 39.4775743 # AU^3 / yr^2 def norm1d(x): assert(len(x.shape) == 1) return np.sqrt(np.sum(x**2)) def deg2rad(x): return x * pi/180. #return radians(x) def orbital_elements_to_ss_xyz(E, observer=None, light_travel=True): (a,e,i,Omega,pomega,M,GM) = E # ugh, it's hard to be units-agnostic. # we just assert here so we have to think about this! # This means: # distances in AU # angles in radians # times in years assert(GM == GM_sun) if light_travel: assert(observer is not None) # orbital angular velocity [radians/yr] meanfrequency = np.sqrt(GM / a**3) # Correct for light-time delay. # dM: [radians] dM = 0. lastdM = dM dx = None for ii in range(100): (x,v) = phase_space_coordinates_from_orbital_elements( a,e,i,Omega,pomega,M-dM,GM) if not light_travel: if observer is not None: dx = x - observer break dx = x - observer # light-travel distance [AU] r = norm1d(dx) # light-travel time [yr] travel = r / c_au_per_yr #print 'light-travel time:', travel, 'yr, or', travel*365.25, 'd' # light travel in angular periods [radians] dM = travel * meanfrequency if abs(lastdM - dM) < 1e-12: break lastdM = dM if ii == 99: print 'Warning: orbital_elements_to_ss_xyz: niters', ii return x,dx def orbital_elements_to_xyz(E, observer, light_travel=True, normalize=True): (x,dx) = orbital_elements_to_ss_xyz(E, observer, light_travel) if normalize: dx /= norm1d(dx) edx = dx[0] * Equinox + dx[1] * Solstice + dx[2] * EclipticPole return edx # E = (a,e,i,Omega,pomega,M, GM) # observer = 3-vector # light_travel: correct for light travel time? # Returns RA,Dec in degrees. def orbital_elements_to_radec(E, observer, light_travel=True): xyz = orbital_elements_to_xyz(E, observer, light_travel) return xyztoradec(xyz) # convert orbital elements into vectors in the plane of the orbit. def orbital_vectors_from_orbital_elements(i, Omega, pomega): ascendingnodevector = np.cos(Omega) * ihat + np.sin(Omega) * jhat tmpydir= np.cross(khat, ascendingnodevector) zhat= np.cos(i) * khat - np.sin(i) * tmpydir tmpydir= np.cross(zhat, ascendingnodevector) xhat= np.cos(pomega) * ascendingnodevector + np.sin(pomega) * tmpydir yhat = np.cross(zhat, xhat) return (xhat, yhat, zhat) def position_from_orbital_vectors(xhat, yhat, a, e, M): E = eccentric_anomaly_from_mean_anomaly(M, e) cosE = np.cos(E) sinE = np.sin(E) b = a*np.sqrt(1. - e**2) x = a * (cosE - e) * xhat + b * sinE * yhat return x # convert orbital elements to phase-space coordinates # a - semi-major axis (length units) # e - eccentricity # i - inclination (rad) # Omega - longitude of ascending node (rad) # pomega - argument of periapsis (rad) # M - mean anomaly (rad) # GM - Newton's constant times central mass (length units cubed over time units squared) # return - (x,v) # position, velocity (length units, length units per time unit) def phase_space_coordinates_from_orbital_elements(a, e, i, Omega, pomega, M, GM): (xhat, yhat, zhat) = orbital_vectors_from_orbital_elements(i, Omega, pomega) # [radians/yr] dMdt = np.sqrt(GM / a**3) E = eccentric_anomaly_from_mean_anomaly(M, e) cosE = np.cos(E) sinE = np.sin(E) # [radians/yr] dEdt = 1.0 / (1.0 - e * cosE) * dMdt # [AU] b = a*np.sqrt(1. - e**2) x = a * (cosE - e) * xhat + b * sinE * yhat # [AU/yr] v = -a * sinE * dEdt * xhat + b * cosE * dEdt * yhat return (x, v) class UnboundOrbitError(ValueError): pass def potential_energy_from_position(x, GM): return -1. * GM / norm1d(x) def energy_from_phase_space_coordinates(x, v, GM): return 0.5 * np.dot(v, v) + potential_energy_from_position(x, GM) # convert phase-space coordinates to orbital elements # x - position (3-vector, length units) # v - velocity (3-vector, length units per time unit) # GM - Newton's constant times central mass (length units cubed over time units squared) # return - (a, e, i, Omega, pomega, M) # - see "phase_space_coordinates" for definitions def orbital_elements_from_phase_space_coordinates(x, v, GM): energy = energy_from_phase_space_coordinates(x, v, GM) if energy > 0: raise UnboundOrbitError('orbital_elements_from_phase_space_coordinates: Unbound orbit') angmom = np.cross(x, v) zhat = angmom / norm1d(angmom) evec = np.cross(v, angmom) / GM - x / norm1d(x) e = norm1d(evec) if e == 0: # by convention: xhat = np.cross(jhat, zhat) xhat /= norm1d(xhat) else: xhat = evec / e yhat = np.cross(zhat, xhat) a = -0.5 * GM / energy i = np.arccos(angmom[2] / norm1d(angmom)) if i == 0: Omega = 0.0 else: Omega = np.arctan2(angmom[1], angmom[0]) + 0.5 * pi if Omega < 0: Omega += 2.*pi if i < 0: i *= -1. Omega += pi cosOmega = cos(Omega) sinOmega = sin(Omega) if e == 0: pomega = 0. - Omega else: pomega = np.arccos(min(1.0, (evec[0] * cosOmega + evec[1] * sinOmega) / e)) horriblescalar = ( sinOmega * evec[2] * angmom[0] - cosOmega * evec[2] * angmom[1] + cosOmega * evec[1] * angmom[2] - sinOmega * evec[0] * angmom[2]) if horriblescalar < 0.: pomega = 2.0 * pi - pomega if pomega < 0.0: pomega += 2.0 * pi if pomega > 2.0 * pi: pomega -= 2.0 * pi f = np.arctan2(np.dot(yhat, x), np.dot(xhat, x)) M = mean_anomaly_from_true_anomaly(f, e) if M < 0: M += 2.*pi return (a, e, i, Omega, pomega, M) # convert eccentric anomaly to mean anomaly # E - eccentric anomaly (radians) # e - eccentricity # return - mean anomaly (radians) def mean_anomaly_from_eccentric_anomaly(E, e): return (E - e * np.sin(E)) def mean_anomaly_from_true_anomaly(f, e): return mean_anomaly_from_eccentric_anomaly(eccentric_anomaly_from_true_anomaly(f, e), e) # convert mean anomaly to eccentric anomaly # M - [array of] mean anomaly (radians) # e - eccentricity # [tolerance - read the source] # [maximum_iteration - read the source] # return - eccentric anomaly (radians) def eccentric_anomaly_from_mean_anomaly(M, e, tolerance = default_tolerance, maximum_iteration = default_maximum_iteration, verbose=False): E = M + e * np.sin(M) iteration = 0 deltaM = 100.0 while (iteration < maximum_iteration) and (abs(deltaM) > tolerance): deltaM = (M - mean_anomaly_from_eccentric_anomaly(E, e)) E = E + deltaM / (1. - e * cos(E)) iteration += 1 if verbose: print 'eccentric anomaly iterations:',iteration return E def eccentric_anomaly_from_true_anomaly(f, e): E = np.arccos((np.cos(f) + e) / (1.0 + e * np.cos(f))) E *= (np.sign(np.sin(f)) * np.sign(np.sin(E))) return E # convert eccentric anomaly to true anomaly # E - eccentric anomaly (radians) # e - eccentricity # return - true anomaly (radians) def true_anomaly_from_eccentric_anomaly(E, e): f = np.arccos((np.cos(E) - e) / (1.0 - e * np.cos(E))) f *= (np.sign(np.sin(f)) * np.sign(np.sin(E))) return f # compute radial velocity # K - radial velocity amplitude # f - true anomaly (radians) # e - eccentricity # pomega - eccentric longitude (radians) # return - radial velocity (same units as K) def radial_velocity(K, f, e, pomega): return K * (np.sin(f + pomega) + e * np.sin(pomega)) # compute radial velocity # K - radial velocity amplitude # M - mean anomaly (radians) # e - eccentricity # pomega - eccentric longitude (radians) # return - radial velocity (same units as K) def radial_velocity_from_M(K, M, e, pomega): E = M + e*np.sin(M) term1 = np.cos(pomega) * np.sqrt(1 - e**2) * np.sin(E) / (1 - e*np.cos(E)) term2 = np.sin(pomega) * (np.cos(E) - e) / (1 - e*np.cos(E)) term3 = e*np.sin(pomega) return K * (term1 + term2 + term3) # compute radial velocity using a truncated Fourier series # K - radial velocity amplitude # M - mean anomaly (radians) APW: you may want to change this input # e - eccentricity # pomega - eccentric longitude (radians) # phi - phase # [order - read the source] # return - radial velocity (same units as K) def radial_velocity_fourier_series(K, M, e, pomega, phi, order=default_order): vr = 0.0 for n in arange(0, order+1, 1): vr += K*(fourier_coeff_A(n, pomega, phi, e) * np.cos(n*(M-phi)) \ + fourier_coeff_B(n, pomega, phi, e) * np.sin(n*(M-phi))) return vr # the following is based on the naming convention in Itay's notes on Fourier analysis # - fourier_coeff_A and fourier_coeff_B are the actual coefficients in the series # - aprime and bprime are just used to simplify the code, and break it up to make it more readable # n - order of the coefficient # e - eccentricity def aprime(n,e): return np.sqrt(1. - e**2)*( ((np.sqrt(1. - e**2) - 1)/e)*jn(n,n*e) + jn(n-1,n*e)) def bprime(n,e): return np.sqrt(1. - e**2)*( ((np.sqrt(1. - e**2) - 1)/e)*jn(n,n*e) - jn(n-1,n*e)) def fourier_coeff_A(n, pomega, phi, e): return 0.5 * (aprime(n,e) * np.sin(pomega + n * phi) + bprime(n,e) * np.sin(pomega - n * phi)) def fourier_coeff_B(n, pomega, phi, e): return 0.5 * (aprime(n,e) * np.cos(pomega + n * phi) - bprime(n,e) * np.cos(pomega - n * phi)) # APW: adjust function call as necessary # return - amplitudes as a list of tuples (An,Bn) def radial_velocity_fourier_amplitudes(K, phi, e, pomega, order=default_order): amplitudes = [] for n in range(order): amplitudes.append((fourier_coeff_A(n, pomega, phi, e), fourier_coeff_B(n, pomega, phi, e))) return amplitudes def eccentricity_from_fourier_amplitudes(amplitudes): K = np.sqrt(amplitude[0]**2 + amplitude[1]**2) phi = np.arctan(amplitude[1] / amplitude[0]) # WRONG? e = 0 # WRONG pomega = 0 # WRONG return (K, phi, e, pomega) # some functional testing if __name__ == '__main__': from test_celestial_mechanics import * #suite = unittest.TestLoader().loadTestsFromTestCase(TestOrbitalElements) suite = unittest.TestSuite() #suite.addTest(TestOrbitalElements('testEdgeCases')) suite.addTest(TestOrbitalElements('testAgainstJPL_2')) unittest.TextTestRunner(verbosity=2).run(suite) import sys sys.exit(0) # -- test Earth ephemeris against JPL at Holmes' closest approach # -- test Holmes against JPL ---------''------------ # -- test direction2radec() try: arg1 = sys.argv[1] except IndexError: arg1 = 0 for e in [0.01, 0.1, 0.9, 0.99, 0.999]: print 'eccentricity:', e M = arange(-3.16,-3.14,0.001) # easy #M = arange(-10., 10., 2.1) # easy #M = arange(-0.01,0.01,0.001) # hard print 'mean anomaly input:', M E = eccentric_anomaly_from_mean_anomaly(M, e, verbose=True) print 'eccentric anomaly output:', E f = true_anomaly_from_eccentric_anomaly(E, e) print 'true anomaly output:', f M2 = mean_anomaly_from_eccentric_anomaly(E, e) print 'round-trip error:', M2 - M if arg1 == "plot": # This code will do the plotting: range_min = 0.0 range_max = 20.0 step_size = 0.01 phase = 0.0 pomegas = [0.0, pi/5., 3.*pi/5., 5.*pi/5., 7.*pi/5., 9.*pi/5.] pomegas_str = ["pomega = $0.0$", "pomega = $\pi/5$", "pomega = $3\pi/5$", "pomega = $\pi$", \ "pomega = $7\pi/5$", "pomega = $9\pi/5$"] eccens = [0.01, 0.1, 0.5, 0.9, 0.99] orders = [2, 4, 8, 16, 32] M = arange(range_min,range_max,step_size) for n in orders: for e in eccens: i = 1 for pomega in pomegas: plt.clf() plt.suptitle(pomegas_str[i-1] + ", e = %.2f, n = %i" % (e,n)) plt.subplot(211) plt.plot(M, radial_velocity_fourier_series(default_K, M, e, pomega, phase, order=n), 'r') plt.plot(M, radial_velocity_from_M(default_K, M, e, pomega), 'k--') plt.axis([range_min,range_max,-(default_K+1.),default_K+1.]) plt.subplot(212) plt.plot(M, radial_velocity_from_M(default_K, M, e, pomega) \ - radial_velocity_fourier_series(default_K, M, e, pomega, phase, order=n), 'k') plt.savefig("celestial_mechanics_plots/pomega_%i_e_%.2f_n_%i.png" % (i,e,n)) i += 1 astrometry.net-0.67/util/cfitsutils.h000644 000765 000024 00000001543 12651445460 020110 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CFITSIO_UTILS_H #define CFITSIO_UTILS_H // from cfitsio #include "fitsio.h" #include "astrometry/bl.h" #include "astrometry/errors.h" static void cfitserr(int status) { sl* msgs = sl_new(4); char errmsg[FLEN_ERRMSG]; int i; // pop the cfitsio error message stack... fits_get_errstatus(status, errmsg); sl_append(msgs, errmsg); while (fits_read_errmsg(errmsg)) sl_append(msgs, errmsg); // ... and push it onto the astrometry.net error message stack... sigh. for (i=sl_size(msgs)-1; i>=0; i--) ERROR("%s", sl_get(msgs, i)); sl_free2(msgs); } #define CFITS_CHECK(msg, ...) \ do { \ if (status) { \ cfitserr(status); \ ERROR(msg, ##__VA_ARGS__); \ goto bailout; \ } \ } while(0) #endif astrometry.net-0.67/util/coadd-main.c000644 000765 000024 00000017047 12651445460 017714 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "coadd.h" #include "anwcs.h" #include "fitsioutils.h" #include "starutil.h" #include "errors.h" #include "log.h" #include "mathutil.h" #include "anqfits.h" #include "keywords.h" #include "tic.h" #include "convolve-image.h" #include "ioutils.h" #include "resample.h" static const char* OPTIONS = "hvw:o:e:O:Ns:p:D"; void printHelp(char* progname) { fprintf(stderr, "%s [options] \n [ ...]\n" " use \"none\" as weight filename for no weighting\n" " -w (default: input file)\n" " [-e ]: FITS extension to read WCS from (default: primary extension, 0)\n" " -o \n" " [-O ]: Lanczos order (default 3)\n" " [-p ]: image plane to read (default 0)\n" " [-N]: use nearest-neighbour resampling (default: Lanczos)\n" " [-s ]: smooth before resampling\n" " [-D]: divide each image by its weight image before starting\n" " [-v]: more verbose\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* progname = args[0]; char* outfn = NULL; char* outwcsfn = NULL; int outwcsext = 0; anwcs_t* outwcs; sl* inimgfns = sl_new(16); sl* inwcsfns = sl_new(16); sl* inwtfns = sl_new(16); il* inimgexts = il_new(16); il* inwcsexts = il_new(16); il* inwtexts = il_new(16); int i; int loglvl = LOG_MSG; int order = 3; coadd_t* coadd; lanczos_args_t largs; double sigma = 0.0; anbool nearest = FALSE; anbool divweight = FALSE; int plane = 0; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case '?': case 'h': printHelp(progname); exit(0); case 'D': divweight = TRUE; break; case 'p': plane = atoi(optarg); break; case 'N': nearest = TRUE; break; case 's': sigma = atof(optarg); break; case 'v': loglvl++; break; case 'e': outwcsext = atoi(optarg); break; case 'w': outwcsfn = optarg; break; case 'o': outfn = optarg; break; case 'O': order = atoi(optarg); break; } log_init(loglvl); fits_use_error_system(); args += optind; argc -= optind; if (argc == 0 || argc % 6) { printHelp(progname); exit(-1); } for (i=0; iwcs = outwcs; if (nearest) { coadd->resample_func = nearest_resample_f; coadd->resample_token = NULL; } else { coadd->resample_func = lanczos_resample_f; largs.order = order; coadd->resample_token = &largs; } for (i=0; i 0.0) { int k0, nk; float* kernel; logmsg("Smoothing by Gaussian with sigma=%g\n", sigma); kernel = convolve_get_gaussian_kernel_f(sigma, 4, &k0, &nk); convolve_separable_f(img, W, H, kernel, k0, nk, img, NULL); free(kernel); } fn = sl_get(inwcsfns, i); ext = il_get(inwcsexts, i); logmsg("Reading input WCS file \"%s\" ext %i\n", fn, ext); inwcs = anwcs_open(fn, ext); if (!inwcs) { ERROR("Failed to read WCS from file \"%s\" ext %i\n", fn, ext); exit(-1); } if (anwcs_pixel_scale(inwcs) == 0) { ERROR("Pixel scale from the WCS file is zero. Usually this means the image has no valid WCS header.\n"); exit(-1); } if (anwcs_imagew(inwcs) != W || anwcs_imageh(inwcs) != H) { ERROR("Size mismatch between image and WCS!"); exit(-1); } fn = sl_get(inwtfns, i); ext = il_get(inwtexts, i); if (streq(fn, "none")) { logmsg("Not using weight image.\n"); wt = NULL; } else if (file_exists(fn)) { logmsg("Reading input weight image \"%s\" ext %i\n", fn, ext); wanq = anqfits_open(fn); if (!wanq) { ERROR("Failed to open file \"%s\"\n", fn); exit(-1); } int wtW, wtH; wt = anqfits_readpix(anq, ext, 0, 0, 0, 0, 0, PTYPE_FLOAT, NULL, &wtW, &wtH); if (!wt) { ERROR("Failed to read image from ext %i of %s\n", ext, fn); exit(-1); } anqfits_close(wanq); logmsg("Read image: %i x %i.\n", wtW, wtH); if (wtW != W || wtH != H) { ERROR("Size mismatch between image and weight!"); exit(-1); } } else { char* endp; overallwt = strtod(fn, &endp); if (endp == fn) { ERROR("Weight: \"%s\" is neither a file nor a double.\n", fn); exit(-1); } logmsg("Parsed weight value \"%g\"\n", overallwt); } if (divweight && wt) { int j; logmsg("Dividing image by weight image...\n"); for (j=0; j<(W*H); j++) img[j] /= wt[j]; } coadd_add_image(coadd, img, wt, overallwt, inwcs); anwcs_free(inwcs); free(img); if (wt) free(wt); } // logmsg("Writing output: %s\n", outfn); coadd_divide_by_weight(coadd, 0.0); /* if (fits_write_float_image_hdr(coadd->img, coadd->W, coadd->H, outfn)) { ERROR("Failed to write output image %s", outfn); exit(-1); } */ /* if (fits_write_float_image(coadd->img, coadd->W, coadd->H, outfn)) { ERROR("Failed to write output image %s", outfn); exit(-1); } */ { qfitsdumper qoutimg; qfits_header* hdr; hdr = anqfits_get_header2(outwcsfn, outwcsext); if (!hdr) { ERROR("Failed to read WCS file \"%s\" ext %i\n", outwcsfn, outwcsext); exit(-1); } fits_header_mod_int(hdr, "NAXIS", 2, NULL); fits_header_set_int(hdr, "NAXIS1", coadd->W, "image width"); fits_header_set_int(hdr, "NAXIS2", coadd->H, "image height"); fits_header_modf(hdr, "BITPIX", "-32", "32-bit floats"); memset(&qoutimg, 0, sizeof(qoutimg)); qoutimg.filename = outfn; qoutimg.npix = coadd->W * coadd->H; qoutimg.fbuf = coadd->img; qoutimg.ptype = PTYPE_FLOAT; qoutimg.out_ptype = BPP_IEEE_FLOAT; if (fits_write_header_and_image(NULL, &qoutimg, coadd->W)) { ERROR("Failed to write FITS image to file \"%s\"", outfn); exit(-1); } qfits_header_destroy(hdr); } coadd_free(coadd); sl_free2(inimgfns); sl_free2(inwcsfns); sl_free2(inwtfns); il_free(inimgexts); il_free(inwcsexts); il_free(inwtexts); anwcs_free(outwcs); return 0; } astrometry.net-0.67/util/coadd.c000644 000765 000024 00000011237 12651445460 016765 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "coadd.h" #include "mathutil.h" #include "errors.h" #include "log.h" #include "resample.h" #include "os-features.h" coadd_t* coadd_new_from_wcs(anwcs_t* wcs) { int W,H; coadd_t* co; W = anwcs_imagew(wcs); H = anwcs_imagew(wcs); co = coadd_new(W, H); if (!co) { return NULL; } co->wcs = wcs; return co; } coadd_t* coadd_new(int W, int H) { coadd_t* ca = calloc(1, sizeof(coadd_t)); ca->img = calloc(W * H, sizeof(number)); ca->weight = calloc(W * H, sizeof(number)); ca->W = W; ca->H = H; ca->resample_func = nearest_resample_f; return ca; } void coadd_set_lanczos(coadd_t* co, int Lorder) { lanczos_args_t* L = calloc(1, sizeof(lanczos_args_t)); L->weighted = 0; L->order = Lorder; co->resample_token = L; co->resample_func = lanczos_resample_f; } void coadd_debug(coadd_t* co) { int i; double mn,mx; mn = 1e300; mx = -1e300; for (i=0; i<(co->W*co->H); i++) { mn = MIN(mn, co->img[i]); mx = MAX(mx, co->img[i]); } logmsg("Coadd img min,max %g,%g\n", mn,mx); mn = 1e300; mx = -1e300; for (i=0; i<(co->W*co->H); i++) { mn = MIN(mn, co->weight[i]); mx = MAX(mx, co->weight[i]); } logmsg("Weight img min,max %g,%g\n", mn,mx); mn = 1e300; mx = -1e300; for (i=0; i<(co->W*co->H); i++) { if (co->weight[i] > 0) { mn = MIN(mn, co->img[i] / co->weight[i]); mx = MAX(mx, co->img[i] / co->weight[i]); } } logmsg("Img/Weight min,max %g,%g\n", mn,mx); } typedef struct { double xlo, xhi, ylo, yhi; anwcs_t* wcs; } check_bounds_t; static void check_bounds(const anwcs_t* wcs, double x, double y, double ra, double dec, void* token) { // project the RA,Dec into the co-add check_bounds_t* cb = (check_bounds_t*)token; double cx, cy; if (anwcs_radec2pixelxy(cb->wcs, ra, dec, &cx, &cy)) { ERROR("Failed to project RA,Dec (%g,%g) into coadd WCS\n", ra, dec); return; } cx -= 1; cy -= 1; cb->xlo = MIN(cb->xlo, cx); cb->xhi = MAX(cb->xhi, cx); cb->ylo = MIN(cb->ylo, cy); cb->yhi = MAX(cb->yhi, cy); } int coadd_add_image(coadd_t* ca, const number* img, const number* weightimg, number weight, const anwcs_t* wcs) { int W, H; int i, j; int xlo,xhi,ylo,yhi; check_bounds_t cb; W = anwcs_imagew(wcs); H = anwcs_imageh(wcs); // if check_bounds: cb.xlo = W; cb.xhi = 0; cb.ylo = H; cb.yhi = 0; cb.wcs = ca->wcs; anwcs_walk_image_boundary(wcs, 50, check_bounds, &cb); xlo = MAX(0, floor(cb.xlo)); xhi = MIN(ca->W, ceil(cb.xhi)+1); ylo = MAX(0, floor(cb.ylo)); yhi = MIN(ca->H, ceil(cb.yhi)+1); logmsg("Image projects to output image region: [%i,%i), [%i,%i)\n", xlo, xhi, ylo, yhi); for (i=ylo; iwcs, j+1, i+1, &ra, &dec)) { ERROR("Failed to project pixel (%i,%i) through output WCS\n", j, i); continue; } if (anwcs_radec2pixelxy(wcs, ra, dec, &px, &py)) { ERROR("Failed to project pixel (%i,%i) through input WCS\n", j, i); continue; } // -1 for FITS px -= 1; py -= 1; if (px < 0 || px >= W) continue; if (py < 0 || py >= H) continue; val = ca->resample_func(px, py, img, weightimg, W, H, &wt, ca->resample_token); ca->img[i*ca->W + j] += val * weight; ca->weight[i*ca->W + j] += wt * weight; } logverb("Row %i of %i\n", i+1, ca->H); } return 0; } number* coadd_get_snapshot(coadd_t* co, number* outimg, number badpix) { int i; if (!outimg) outimg = calloc(co->W * co->H, sizeof(number)); for (i=0; i<(co->W * co->H); i++) { if (co->weight[i] == 0) outimg[i] = badpix; else outimg[i] = co->img[i] / co->weight[i]; } return outimg; } // divide "img" by "weight"; set img=badpix where weight=0. void coadd_divide_by_weight(coadd_t* ca, number badpix) { int i; for (i=0; i<(ca->W * ca->H); i++) { if (ca->weight[i] == 0) ca->img[i] = badpix; else ca->img[i] /= ca->weight[i]; } } void coadd_free(coadd_t* ca) { free(ca->img); free(ca->weight); free(ca); } number* coadd_create_weight_image_from_range(const number* img, int W, int H, number lowval, number highval) { int i; number* weight = malloc(W*H*sizeof(number)); for (i=0; i<(W*H); i++) { if (img[i] <= lowval) weight[i] = 0; else if (img[i] >= highval) weight[i] = 0; else weight[i] = 1; } return weight; } void coadd_weight_image_mask_value(const number* img, int W, int H, number* weight, number badval) { int i; for (i=0; i<(W*H); i++) { if (img[i] == badval) { weight[i] = 0; } } } astrometry.net-0.67/util/codekd.c000644 000765 000024 00000006625 12651445460 017151 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "codekd.h" #include "kdtree_fits_io.h" #include "starutil.h" #include "errors.h" static codetree_t* codetree_alloc() { codetree_t* s = calloc(1, sizeof(codetree_t)); if (!s) { fprintf(stderr, "Failed to allocate a code kdtree struct.\n"); return NULL; } return s; } int codetree_append_to(codetree_t* s, FILE* fid) { return kdtree_fits_append_tree_to(s->tree, s->header, fid); } int codetree_N(codetree_t* s) { return s->tree->ndata; } int codetree_nodes(codetree_t* s) { return s->tree->nnodes; } int codetree_D(codetree_t* s) { return s->tree->ndim; } qfits_header* codetree_header(codetree_t* s) { return s->header; } int codetree_get_permuted(codetree_t* s, int index) { if (s->tree->perm) return s->tree->perm[index]; else return index; } static codetree_t* my_open(const char* fn, anqfits_t* fits) { codetree_t* s; kdtree_fits_t* io; char* treename = CODETREE_NAME; s = codetree_alloc(); if (!s) return s; if (fits) { io = kdtree_fits_open_fits(fits); fn = fits->filename; } else io = kdtree_fits_open(fn); if (!io) { ERROR("Failed to open FITS file \"%s\"", fn); goto bailout; } if (!kdtree_fits_contains_tree(io, treename)) treename = NULL; s->tree = kdtree_fits_read_tree(io, treename, &s->header); if (!s->tree) { ERROR("Failed to read code kdtree from file %s\n", fn); goto bailout; } // kdtree_fits_t is a typedef of fitsbin_t fitsbin_close_fd(io); return s; bailout: free(s); return NULL; } codetree_t* codetree_open_fits(anqfits_t* fits) { return my_open(NULL, fits); } codetree_t* codetree_open(const char* fn) { return my_open(fn, NULL); } int codetree_close(codetree_t* s) { if (!s) return 0; if (s->inverse_perm) free(s->inverse_perm); if (s->header) qfits_header_destroy(s->header); if (s->tree) kdtree_fits_close(s->tree); free(s); return 0; } static int Ndata(codetree_t* s) { return s->tree->ndata; } void codetree_compute_inverse_perm(codetree_t* s) { // compute inverse permutation vector. s->inverse_perm = malloc(Ndata(s) * sizeof(int)); if (!s->inverse_perm) { fprintf(stderr, "Failed to allocate code kdtree inverse permutation vector.\n"); return; } kdtree_inverse_permutation(s->tree, s->inverse_perm); } int codetree_get(codetree_t* s, unsigned int codeid, double* code) { if (s->tree->perm && !s->inverse_perm) { codetree_compute_inverse_perm(s); if (!s->inverse_perm) return -1; } if (codeid >= Ndata(s)) { fprintf(stderr, "Invalid code ID: %u >= %u.\n", codeid, Ndata(s)); return -1; } if (s->inverse_perm) kdtree_copy_data_double(s->tree, s->inverse_perm[codeid], 1, code); else kdtree_copy_data_double(s->tree, codeid, 1, code); return 0; } codetree_t* codetree_new() { codetree_t* s = codetree_alloc(); s->header = qfits_header_default(); if (!s->header) { fprintf(stderr, "Failed to create a qfits header for code kdtree.\n"); free(s); return NULL; } qfits_header_add(s->header, "AN_FILE", AN_FILETYPE_CODETREE, "This file is a code kdtree.", NULL); return s; } int codetree_write_to_file(codetree_t* s, const char* fn) { return kdtree_fits_write(s->tree, fn, s->header); } int codetree_write_to_file_flipped(codetree_t* s, const char* fn) { return kdtree_fits_write_flipped(s->tree, fn, s->header); } astrometry.net-0.67/util/convolve-image.c000644 000765 000024 00000005373 12651445460 020632 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "convolve-image.h" #include "mathutil.h" #include "keywords.h" #include "os-features.h" float* convolve_get_gaussian_kernel_f(double sigma, double nsigma, int* p_k0, int* p_NK) { int K0, NK, i; float* kernel; K0 = ceil(sigma * nsigma); NK = 2*K0 + 1; kernel = malloc(NK * sizeof(float)); for (i=0; i [%i, %i), j -> [%i, %i)\n", j, W, K0, NK, j-0+K0, j-NK+K0, MAX(0, j + K0 - (W-1)), MIN(NK, j + K0 + 1), j + K0 - MAX(0, j + K0 - (W-1)), j + K0 - MIN(NK, j + K0 + 1)); */ for (k = MAX(0, j + K0 - (W-1)); k < MIN(NK, j + K0 + 1); k++) { /* assert((j - k + K0) >= 0); assert((k - k + K0) <= (W-1)); touchedleft |= ((j - k + K0) == 0); touchedright |= ((j - k + K0) == (W-1)); */ int p = i*W + j - k + K0; if (weight) { sum += kernel[k] * weight[p] * img[p]; sumw += kernel[k] * weight[p]; } else { sum += kernel[k] * img[p]; sumw += kernel[k]; } } // store into temp image in transposed order tempimg[j*H + i] = (sumw == 0.0) ? 0.0 : (sum / sumw); } //assert(touchedleft); //assert(touchedright); } for (j=0; j. * * Contact: * Laboratoire de vision et systèmes numériques * Pavillon Adrien-Pouliot * Université Laval * Sainte-Foy, Québec, Canada * G1K 7P4 * * perreaul@gel.ulaval.ca */ /* Standard C includes */ #include #include #include #include /* Type declarations */ #ifdef _MSC_VER #include typedef UINT8 uint8_t; typedef UINT16 uint16_t; typedef UINT32 uint32_t; #pragma warning( disable: 4799 ) #else #include #endif /* Intrinsic declarations */ #if defined(__SSE2__) || defined(__MMX__) #if defined(__SSE2__) #include #define USE_SSE2 1 #elif defined(__MMX__) #include #define USE_MMX 1 #endif #if defined(__GNUC__) /* gcc 3.4 lacks mm_malloc.h */ # if __GNUC__ >= 4 # include # else # include "an_mm_malloc.h" # endif # define HAVE_MM_MALLOC 1 #elif defined(_MSC_VER) #include #else /* No aligned malloc - no SSE2/MMX! */ #undef USE_SSE2 #undef USE_MMX #endif #elif defined(__ALTIVEC__) #include #endif /* Compiler peculiarities */ #if defined(__GNUC__) #include #define inline __inline__ #define align(x) __attribute__ ((aligned (x))) #elif defined(_MSC_VER) #define inline __inline #define align(x) __declspec(align(x)) #else #define inline #define align(x) #endif #ifndef MIN #define MIN(a,b) ((a) > (b) ? (b) : (a)) #endif #ifndef MAX #define MAX(a,b) ((a) < (b) ? (b) : (a)) #endif /** * This structure represents a two-tier histogram. The first tier (known as the * "coarse" level) is 4 bit wide and the second tier (known as the "fine" level) * is 8 bit wide. Pixels inserted in the fine level also get inserted into the * coarse bucket designated by the 4 MSBs of the fine bucket value. * * The structure is aligned on 16 bytes, which is a prerequisite for SIMD * instructions. Each bucket is 16 bit wide, which means that extra care must be * taken to prevent overflow. */ typedef struct align(16) { uint16_t coarse[16]; uint16_t fine[16][16]; } Histogram; /** * HOP is short for Histogram OPeration. This macro makes an operation \a op on * histogram \a h for pixel value \a x. It takes care of handling both levels. */ #define HOP(h,x,op) \ h.coarse[x>>4] op; \ *((uint16_t*) h.fine + x) op; #define COP(c,j,x,op) \ h_coarse[ 16*(n*c+j) + (x>>4) ] op; \ h_fine[ 16 * (n*(16*c+(x>>4)) + j) + (x & 0xF) ] op; /** * Adds histograms \a x and \a y and stores the result in \a y. Makes use of * SSE2, MMX or Altivec, if available. */ #if defined(USE_SSE2) static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) { *(__m128i*) &y[0] = _mm_add_epi16( *(__m128i*) &y[0], *(__m128i*) &x[0] ); *(__m128i*) &y[8] = _mm_add_epi16( *(__m128i*) &y[8], *(__m128i*) &x[8] ); } #elif defined(USE_MMX) static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) { *(__m64*) &y[0] = _mm_add_pi16( *(__m64*) &y[0], *(__m64*) &x[0] ); *(__m64*) &y[4] = _mm_add_pi16( *(__m64*) &y[4], *(__m64*) &x[4] ); *(__m64*) &y[8] = _mm_add_pi16( *(__m64*) &y[8], *(__m64*) &x[8] ); *(__m64*) &y[12] = _mm_add_pi16( *(__m64*) &y[12], *(__m64*) &x[12] ); } #elif defined(__ALTIVEC__) static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) { *(vector unsigned short*) &y[0] = vec_add( *(vector unsigned short*) &y[0], *(vector unsigned short*) &x[0] ); *(vector unsigned short*) &y[8] = vec_add( *(vector unsigned short*) &y[8], *(vector unsigned short*) &x[8] ); } #else static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) { int i; for ( i = 0; i < 16; ++i ) { y[i] += x[i]; } } #endif /** * Subtracts histogram \a x from \a y and stores the result in \a y. Makes use * of SSE2, MMX or Altivec, if available. */ #if defined(USE_SSE2) static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) { *(__m128i*) &y[0] = _mm_sub_epi16( *(__m128i*) &y[0], *(__m128i*) &x[0] ); *(__m128i*) &y[8] = _mm_sub_epi16( *(__m128i*) &y[8], *(__m128i*) &x[8] ); } #elif defined(USE_MMX) static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) { *(__m64*) &y[0] = _mm_sub_pi16( *(__m64*) &y[0], *(__m64*) &x[0] ); *(__m64*) &y[4] = _mm_sub_pi16( *(__m64*) &y[4], *(__m64*) &x[4] ); *(__m64*) &y[8] = _mm_sub_pi16( *(__m64*) &y[8], *(__m64*) &x[8] ); *(__m64*) &y[12] = _mm_sub_pi16( *(__m64*) &y[12], *(__m64*) &x[12] ); } #elif defined(__ALTIVEC__) static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) { *(vector unsigned short*) &y[0] = vec_sub( *(vector unsigned short*) &y[0], *(vector unsigned short*) &x[0] ); *(vector unsigned short*) &y[8] = vec_sub( *(vector unsigned short*) &y[8], *(vector unsigned short*) &x[8] ); } #else static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) { int i; for ( i = 0; i < 16; ++i ) { y[i] -= x[i]; } } #endif static inline void histogram_muladd( const uint16_t a, const uint16_t x[16], uint16_t y[16] ) { int i; for ( i = 0; i < 16; ++i ) { y[i] += a * x[i]; } } static void ctmf_helper( const unsigned char* const src, unsigned char* const dst, const int width, const int height, const int src_step, const int dst_step, const int r, const int cn, const int pad_left, const int pad_right ) { const int m = height, n = width; int i, j, k, c; const unsigned char *p, *q; Histogram H[4]; uint16_t *h_coarse, *h_fine, luc[4][16]; assert( src ); assert( dst ); assert( r >= 0 ); assert( width >= 2*r+1 ); assert( height >= 2*r+1 ); assert( src_step != 0 ); assert( dst_step != 0 ); /* SSE2 and MMX need aligned memory, provided by _mm_malloc(). */ #if defined(USE_SSE2) || defined(USE_MMX) h_coarse = (uint16_t*) _mm_malloc( 1 * 16 * n * cn * sizeof(uint16_t), 16 ); h_fine = (uint16_t*) _mm_malloc( 16 * 16 * n * cn * sizeof(uint16_t), 16 ); memset( h_coarse, 0, 1 * 16 * n * cn * sizeof(uint16_t) ); memset( h_fine, 0, 16 * 16 * n * cn * sizeof(uint16_t) ); #else h_coarse = (uint16_t*) calloc( 1 * 16 * n * cn, sizeof(uint16_t) ); h_fine = (uint16_t*) calloc( 16 * 16 * n * cn, sizeof(uint16_t) ); #endif /* First row initialization */ for ( j = 0; j < n; ++j ) { for ( c = 0; c < cn; ++c ) { COP( c, j, src[cn*j+c], += r+1 ); } } for ( i = 0; i < r; ++i ) { for ( j = 0; j < n; ++j ) { for ( c = 0; c < cn; ++c ) { COP( c, j, src[src_step*i+cn*j+c], ++ ); } } } for ( i = 0; i < m; ++i ) { /* Update column histograms for entire row. */ p = src + src_step * MAX( 0, i-r-1 ); q = p + cn * n; for ( j = 0; p != q; ++j ) { for ( c = 0; c < cn; ++c, ++p ) { COP( c, j, *p, -- ); } } p = src + src_step * MIN( m-1, i+r ); q = p + cn * n; for ( j = 0; p != q; ++j ) { for ( c = 0; c < cn; ++c, ++p ) { COP( c, j, *p, ++ ); } } /* First column initialization */ memset( H, 0, cn*sizeof(H[0]) ); memset( luc, 0, cn*sizeof(luc[0]) ); if ( pad_left ) { for ( c = 0; c < cn; ++c ) { histogram_muladd( r, &h_coarse[16*n*c], H[c].coarse ); } } for ( j = 0; j < (pad_left ? r : 2*r); ++j ) { for ( c = 0; c < cn; ++c ) { histogram_add( &h_coarse[16*(n*c+j)], H[c].coarse ); } } for ( c = 0; c < cn; ++c ) { for ( k = 0; k < 16; ++k ) { histogram_muladd( 2*r+1, &h_fine[16*n*(16*c+k)], &H[c].fine[k][0] ); } } for ( j = pad_left ? 0 : r; j < (pad_right ? n : n-r); ++j ) { for ( c = 0; c < cn; ++c ) { const uint16_t t = 2*r*r + 2*r; uint16_t sum = 0, *segment; int b; histogram_add( &h_coarse[16*(n*c + MIN(j+r,n-1))], H[c].coarse ); /* Find median at coarse level */ for ( k = 0; k < 16 ; ++k ) { sum += H[c].coarse[k]; if ( sum > t ) { sum -= H[c].coarse[k]; break; } } assert( k < 16 ); /* Update corresponding histogram segment */ if ( luc[c][k] <= j-r ) { memset( &H[c].fine[k], 0, 16 * sizeof(uint16_t) ); for ( luc[c][k] = j-r; luc[c][k] < MIN(j+r+1,n); ++luc[c][k] ) { histogram_add( &h_fine[16*(n*(16*c+k)+luc[c][k])], H[c].fine[k] ); } if ( luc[c][k] < j+r+1 ) { histogram_muladd( j+r+1 - n, &h_fine[16*(n*(16*c+k)+(n-1))], &H[c].fine[k][0] ); luc[c][k] = j+r+1; } } else { for ( ; luc[c][k] < j+r+1; ++luc[c][k] ) { histogram_sub( &h_fine[16*(n*(16*c+k)+MAX(luc[c][k]-2*r-1,0))], H[c].fine[k] ); histogram_add( &h_fine[16*(n*(16*c+k)+MIN(luc[c][k],n-1))], H[c].fine[k] ); } } histogram_sub( &h_coarse[16*(n*c+MAX(j-r,0))], H[c].coarse ); /* Find median in segment */ segment = H[c].fine[k]; for ( b = 0; b < 16 ; ++b ) { sum += segment[b]; if ( sum > t ) { dst[dst_step*i+cn*j+c] = 16*k + b; break; } } assert( b < 16 ); } } } #if defined(USE_SSE2) || defined(USE_MMX) _mm_empty(); _mm_free(h_coarse); _mm_free(h_fine); #else free(h_coarse); free(h_fine); #endif } void ctmf( const unsigned char* const src, unsigned char* const dst, const int width, const int height, const int src_step, const int dst_step, const int r, const int cn, const long unsigned int memsize ) { /* * Processing the image in vertical stripes is an optimization made * necessary by the limited size of the CPU cache. Each histogram is 544 * bytes big and therefore I can fit a limited number of them in the cache. * That number may sometimes be smaller than the image width, which would be * the number of histograms I would need without stripes. * * I need to keep histograms in the cache so that they are available * quickly when processing a new row. Each row needs access to the previous * row's histograms. If there are too many histograms to fit in the cache, * thrashing to RAM happens. * * To solve this problem, I figure out the maximum number of histograms * that can fit in cache. From this is determined the number of stripes in * an image. The formulas below make the stripes all the same size and use * as few stripes as possible. * * Note that each stripe causes an overlap on the neighboring stripes, as * when mowing the lawn. That overlap is proportional to r. When the overlap * is a significant size in comparison with the stripe size, then we are not * O(1) anymore, but O(r). In fact, we have been O(r) all along, but the * initialization term was neglected, as it has been (and rightly so) in B. * Weiss, "Fast Median and Bilateral Filtering", SIGGRAPH, 2006. Processing * by stripes only makes that initialization term bigger. * * Also, note that the leftmost and rightmost stripes don't need overlap. * A flag is passed to ctmf_helper() so that it treats these cases as if the * image was zero-padded. */ int stripes = (int) ceil( (double) (width - 2*r) / (memsize / sizeof(Histogram) - 2*r) ); int stripe_size = (int) ceil( (double) ( width + stripes*2*r - 2*r ) / stripes ); int i; for ( i = 0; i < width; i += stripe_size - 2*r ) { int stripe = stripe_size; /* Make sure that the filter kernel fits into one stripe. */ if ( i + stripe_size - 2*r >= width || width - (i + stripe_size - 2*r) < 2*r+1 ) { stripe = width - i; } ctmf_helper( src + cn*i, dst + cn*i, stripe, height, src_step, dst_step, r, cn, i == 0, stripe == width - i ); if ( stripe == width - i ) { break; } } } astrometry.net-0.67/util/cutest.c000644 000765 000024 00000021711 12651445460 017220 0ustar00dstnstaff000000 000000 /** (this notice added by dstn) Copyright 2002-2003 Asim Jalis. Licensed under the zlib/libpng License: This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* This is clearly marked as an altered version by the Astrometry.net project. */ #include #include #include #include #include #include #include "cutest.h" static int CUTEST_DIE_ON_FAIL = 0; void CuDieOnFail() { CUTEST_DIE_ON_FAIL = 1; } /*-------------------------------------------------------------------------* * CuStr *-------------------------------------------------------------------------*/ char* CuStrAlloc(int size) { char* newStr = (char*) malloc( sizeof(char) * (size) ); return newStr; } char* CuStrCopy(const char* old) { int len = strlen(old); char* newStr = CuStrAlloc(len + 1); strcpy(newStr, old); return newStr; } /*-------------------------------------------------------------------------* * CuString *-------------------------------------------------------------------------*/ void CuStringInit(CuString* str) { str->length = 0; str->size = STRING_MAX; str->buffer = (char*) malloc(sizeof(char) * str->size); str->buffer[0] = '\0'; } CuString* CuStringNew(void) { CuString* str = (CuString*) malloc(sizeof(CuString)); str->length = 0; str->size = STRING_MAX; str->buffer = (char*) malloc(sizeof(char) * str->size); str->buffer[0] = '\0'; return str; } void CuStringResize(CuString* str, int newSize) { str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize); str->size = newSize; } void CuStringAppend(CuString* str, const char* text) { int length; if (text == NULL) { text = "NULL"; } length = strlen(text); if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); str->length += length; strcat(str->buffer, text); } void CuStringAppendChar(CuString* str, char ch) { char text[2]; text[0] = ch; text[1] = '\0'; CuStringAppend(str, text); } void CuStringAppendFormat(CuString* str, const char* format, ...) { va_list argp; char buf[HUGE_STRING_LEN]; va_start(argp, format); vsprintf(buf, format, argp); va_end(argp); CuStringAppend(str, buf); } void CuStringInsert(CuString* str, const char* text, int pos) { int length = strlen(text); if (pos > str->length) pos = str->length; if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1); str->length += length; memcpy(str->buffer + pos, text, length); } void CuStringFree(CuString* str) { if (!str) return; free(str->buffer); free(str); } /*-------------------------------------------------------------------------* * CuTest *-------------------------------------------------------------------------*/ void CuTestInit(CuTest* t, const char* name, TestFunction function) { t->name = CuStrCopy(name); t->failed = 0; t->ran = 0; t->message = NULL; t->function = function; t->jumpBuf = NULL; } void CuTestFree(CuTest* t) { if (!t) return; free((void*)t->name); free((void*)t->message); free(t); } CuTest* CuTestNew(const char* name, TestFunction function) { CuTest* tc = CU_ALLOC(CuTest); CuTestInit(tc, name, function); return tc; } void CuTestRun(CuTest* tc) { jmp_buf buf; tc->jumpBuf = &buf; if (setjmp(buf) == 0) { tc->ran = 1; (tc->function)(tc); } tc->jumpBuf = 0; } static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* string) { char buf[HUGE_STRING_LEN]; sprintf(buf, "%s:%d: ", file, line); CuStringInsert(string, buf, 0); if (CUTEST_DIE_ON_FAIL) { printf("Dying from TEST_DIE.\n"); assert(0); } tc->failed = 1; tc->message = string->buffer; if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); } void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message) { CuString string; CuStringInit(&string); if (message2 != NULL) { CuStringAppend(&string, message2); CuStringAppend(&string, ": "); } CuStringAppend(&string, message); CuFailInternal(tc, file, line, &string); } void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition) { if (condition) return; CuFail_Line(tc, file, line, NULL, message); } void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, const char* expected, const char* actual) { CuString string; if ((expected == NULL && actual == NULL) || (expected != NULL && actual != NULL && strcmp(expected, actual) == 0)) { return; } CuStringInit(&string); if (message != NULL) { CuStringAppend(&string, message); CuStringAppend(&string, ": "); } CuStringAppend(&string, "expected <"); CuStringAppend(&string, expected); CuStringAppend(&string, "> but was <"); CuStringAppend(&string, actual); CuStringAppend(&string, ">"); CuFailInternal(tc, file, line, &string); } void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, int expected, int actual) { char buf[STRING_MAX]; if (expected == actual) return; sprintf(buf, "expected <%d> but was <%d>", expected, actual); CuFail_Line(tc, file, line, message, buf); } void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, double expected, double actual, double delta) { char buf[STRING_MAX]; if (fabs(expected - actual) <= delta) return; sprintf(buf, "expected <%lf> but was <%lf>", expected, actual); CuFail_Line(tc, file, line, message, buf); } void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, const void* expected, const void* actual) { char buf[STRING_MAX]; if (expected == actual) return; sprintf(buf, "expected pointer <0x%p> but was <0x%p>", expected, actual); CuFail_Line(tc, file, line, message, buf); } /*-------------------------------------------------------------------------* * CuSuite *-------------------------------------------------------------------------*/ void CuSuiteInit(CuSuite* testSuite) { testSuite->count = 0; testSuite->failCount = 0; } CuSuite* CuSuiteNew(void) { CuSuite* testSuite = CU_ALLOC(CuSuite); CuSuiteInit(testSuite); return testSuite; } void CuSuiteFree(CuSuite* cs) { int i; if (!cs) return; for (i=0; icount; i++) { CuTestFree(cs->list[i]); } free(cs); } void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase) { assert(testSuite->count < MAX_TEST_CASES); testSuite->list[testSuite->count] = testCase; testSuite->count++; } void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2) { int i; for (i = 0 ; i < testSuite2->count ; ++i) { CuTest* testCase = testSuite2->list[i]; CuSuiteAdd(testSuite, testCase); } } void CuSuiteRun(CuSuite* testSuite) { int i; for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; CuTestRun(testCase); if (testCase->failed) { testSuite->failCount += 1; } } } void CuSuiteSummary(CuSuite* testSuite, CuString* summary) { int i; for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; CuStringAppend(summary, testCase->failed ? "F" : "."); } CuStringAppend(summary, "\n\n"); } void CuSuiteDetails(CuSuite* testSuite, CuString* details) { int i; int failCount = 0; if (testSuite->failCount == 0) { int passCount = testSuite->count - testSuite->failCount; const char* testWord = passCount == 1 ? "test" : "tests"; CuStringAppendFormat(details, "OK (%d %s)\n", passCount, testWord); } else { if (testSuite->failCount == 1) CuStringAppend(details, "There was 1 failure:\n"); else CuStringAppendFormat(details, "There were %d failures:\n", testSuite->failCount); for (i = 0 ; i < testSuite->count ; ++i) { CuTest* testCase = testSuite->list[i]; if (testCase->failed) { failCount++; CuStringAppendFormat(details, "%d) %s: %s\n", failCount, testCase->name, testCase->message); } } CuStringAppend(details, "\n!!!FAILURES!!!\n"); CuStringAppendFormat(details, "Runs: %d ", testSuite->count); CuStringAppendFormat(details, "Passes: %d ", testSuite->count - testSuite->failCount); CuStringAppendFormat(details, "Fails: %d\n", testSuite->failCount); } } astrometry.net-0.67/util/cutest.h000644 000765 000024 00000007777 12651445460 017245 0ustar00dstnstaff000000 000000 #ifndef CU_TEST_H #define CU_TEST_H #include #include /* CuString */ char* CuStrAlloc(int size); char* CuStrCopy(const char* old); #define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) #define HUGE_STRING_LEN 8192 #define STRING_MAX 256 #define STRING_INC 256 typedef struct { int length; int size; char* buffer; } CuString; void CuStringInit(CuString* str); CuString* CuStringNew(void); void CuStringFree(CuString* str); void CuStringRead(CuString* str, const char* path); void CuStringAppend(CuString* str, const char* text); void CuStringAppendChar(CuString* str, char ch); void CuStringAppendFormat(CuString* str, const char* format, ...); void CuStringInsert(CuString* str, const char* text, int pos); void CuStringResize(CuString* str, int newSize); void CuDieOnFail(); /* CuTest */ typedef struct CuTest CuTest; typedef void (*TestFunction)(CuTest *); struct CuTest { const char* name; TestFunction function; int failed; int ran; const char* message; jmp_buf *jumpBuf; }; void CuTestInit(CuTest* t, const char* name, TestFunction function); CuTest* CuTestNew(const char* name, TestFunction function); void CuTestFree(CuTest* tc); void CuTestRun(CuTest* tc); /* Internal versions of assert functions -- use the public versions */ void CuFail_Line(CuTest* tc, const char* file, int line, const char* message2, const char* message); void CuAssert_Line(CuTest* tc, const char* file, int line, const char* message, int condition); void CuAssertStrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, const char* expected, const char* actual); void CuAssertIntEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, int expected, int actual); void CuAssertDblEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, double expected, double actual, double delta); void CuAssertPtrEquals_LineMsg(CuTest* tc, const char* file, int line, const char* message, const void* expected, const void* actual); /* public assert functions */ #define CuFail(tc, ms) CuFail_Line( (tc), __FILE__, __LINE__, NULL, (ms)) #define CuAssert(tc, ms, cond) CuAssert_Line((tc), __FILE__, __LINE__, (ms), (cond)) #define CuAssertTrue(tc, cond) CuAssert_Line((tc), __FILE__, __LINE__, "assert failed", (cond)) #define CuAssertStrEquals(tc,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) #define CuAssertStrEquals_Msg(tc,ms,ex,ac) CuAssertStrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) #define CuAssertIntEquals(tc,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) #define CuAssertIntEquals_Msg(tc,ms,ex,ac) CuAssertIntEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) #define CuAssertDblEquals(tc,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac),(dl)) #define CuAssertDblEquals_Msg(tc,ms,ex,ac,dl) CuAssertDblEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac),(dl)) #define CuAssertPtrEquals(tc,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,NULL,(ex),(ac)) #define CuAssertPtrEquals_Msg(tc,ms,ex,ac) CuAssertPtrEquals_LineMsg((tc),__FILE__,__LINE__,(ms),(ex),(ac)) #define CuAssertPtrNotNull(tc,p) CuAssert_Line((tc),__FILE__,__LINE__,"null pointer unexpected",(p != NULL)) #define CuAssertPtrNotNullMsg(tc,msg,p) CuAssert_Line((tc),__FILE__,__LINE__,(msg),(p != NULL)) /* CuSuite */ #define MAX_TEST_CASES 1024 #define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST)) typedef struct { int count; CuTest* list[MAX_TEST_CASES]; int failCount; } CuSuite; void CuSuiteInit(CuSuite* testSuite); void CuSuiteFree(CuSuite* cs); CuSuite* CuSuiteNew(void); void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase); void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2); void CuSuiteRun(CuSuite* testSuite); void CuSuiteSummary(CuSuite* testSuite, CuString* summary); void CuSuiteDetails(CuSuite* testSuite, CuString* details); #endif /* CU_TEST_H */ astrometry.net-0.67/util/dallpeaks.c000644 000765 000024 00000005310 12651445460 017646 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "dimage.h" #include "permutedsort.h" #include "simplexy-common.h" #include "log.h" #include "mathutil.h" /* * dallpeaks.c * * Take image and list of objects, and produce list of all peaks (and * which object they are in). * * BUGS: * - Returns no error analysis if the centroid sux. * - Uses dead-reckon pixel center if dcen3x3 sux. * - No out-of-memory checks * * Mike Blanton * 1/2006 */ /* Finds all peaks in the image by cutting a bounding box out around each one */ static int max_gaussian(float* image, int W, int H, float sigma, int x0, int y0, float *p_x, float *p_y) { float x, y; int step; float stepsize = 0.1; // inverse-variance float iv = 1.0 / (sigma*sigma); // half inverse-variance float hiv = 1.0 / (2.0 * sigma*sigma); // clip at six sigma: int Nsigma = 6; // Nsigma=6: G=1.523e-08 x = x0; y = y0; for (;;) { float xdir=0, ydir=0; anbool xflipped = FALSE, yflipped = FALSE; for (step=0; step<100; step++) { float dx, dy; float Gx, Gy; float V; int i,j; int ilo,ihi,jlo,jhi; debug("Stepsize %g, step %i\n", stepsize, step); V = Gx = Gy = 0; // compute gradients. ilo = MAX(0, floor(x-Nsigma*sigma)); ihi = MIN(W-1, ceil(x+Nsigma*sigma)); jlo = MAX(0, floor(y-Nsigma*sigma)); jhi = MIN(H-1, ceil(y+Nsigma*sigma)); //for (j=0; j maxsize || onx > maxsize) { logverb("Skipping object %i: too big, %ix%i (x %i:%i, y %i:%i)\n", current, onx, ony, xmin,xmax, ymin,ymax); continue; } if (*npeaks > maxnpeaks) { logverb("Skipping all further objects: already found the maximum number (%i)\n", maxnpeaks); break; } // enlarge cutout arrays, if necessary. if (onx*ony > npix) { free(oimage); free(simage); npix = onx * ony; oimage = malloc(npix * sizeof(float)); simage = malloc(npix * sizeof(float)); } // make object cutout for (oj=0; oj= onx-1 || yc[i] <= 0 || yc[i] >= ony-1) { logverb("Skipping subpeak %i: position %i,%i out of bounds 1:%i, 1:%i\n", i, xc[i], yc[i], onx-1, ony-1); continue; } if (imore + *npeaks >= maxnpeaks) { logverb("Skipping all further subpeaks: exceeded max number (%i)\n", maxnpeaks); break; } /* install default centroid to begin */ xcen[imore + (*npeaks)] = xc[i] + xmin; ycen[imore + (*npeaks)] = yc[i] + ymin; assert(isfinite(xcen[imore + *npeaks])); assert(isfinite(ycen[imore + *npeaks])); // cut out 3x3 box for (di=-1; di<=1; di++) for (dj=-1; dj<=1; dj++) three[(di+1) + (dj+1)*3] = simage[xc[i]+di + (yc[i]+dj)*onx]; // try to find centroid in the 3x3 cutout if (dcen3x3(three, &tmpxc, &tmpyc)) { assert(isfinite(tmpxc)); assert(isfinite(tmpyc)); xcen[imore + (*npeaks)] = (tmpxc-1.0) + xc[i] + xmin; ycen[imore + (*npeaks)] = (tmpyc-1.0) + yc[i] + ymin; assert(isfinite(xcen[imore + *npeaks])); assert(isfinite(ycen[imore + *npeaks])); } else if (xc[i] > 1 && xc[i] < onx - 2 && yc[i] > 1 && yc[i] < ony - 2 && imore < (maxnpeaks - (*npeaks))) { debug("Peak %i subpeak %i at (%i,%i): searching for centroid in 3x3 box failed; trying 5x5 box...\n", current, i, xmin+xc[i], ymin+yc[i]); debug("3x3 box:\n %g,%g,%g,%g,%g,%g,%g,%g,%g\n", three[0],three[1],three[2],three[3],three[4],three[5],three[6],three[7],three[8]); /* try to get centroid in the 5 x 5 box */ for (di=-1; di<=1; di++) for (dj=-1; dj<=1; dj++) three[(di+1) + (dj+1)*3] = simage[xc[i]+(2*di) + (yc[i] + (2*dj)) * onx]; if (dcen3x3(three, &tmpxc, &tmpyc)) { xcen[imore + (*npeaks)] = 2.0*(tmpxc-1.0) + xc[i] + xmin; ycen[imore + (*npeaks)] = 2.0*(tmpyc-1.0) + yc[i] + ymin; assert(isfinite(xcen[imore + *npeaks])); assert(isfinite(ycen[imore + *npeaks])); } else { // don't add this peak. logverb("Failed to find (5x5) centroid of peak %i, subpeak %i at (%i,%i)\n", current, i, xmin+xc[i], ymin+yc[i]); debug("5x5 box:\n %g,%g,%g,%g,%g,%g,%g,%g,%g\n", three[0],three[1],three[2],three[3],three[4],three[5],three[6],three[7],three[8]); max_gaussian(oimage, onx, ony, dpsf, xc[i], yc[i], &tmpxc, &tmpyc); debug("max_gaussian: %g,%g\n", tmpxc, tmpyc); xcen[imore + (*npeaks)] = tmpxc + xmin; ycen[imore + (*npeaks)] = tmpyc + ymin; //continue; } } else { logverb("Failed to find (3x3) centroid of peak %i, subpeak %i at (%i,%i), and too close to edge for 5x5\n", current, i, xmin+xc[i], ymin+yc[i]); } imore++; } (*npeaks) += imore; nobj++; } FREEVEC(indx); FREEVEC(oimage); FREEVEC(simage); FREEVEC(xc); FREEVEC(yc); return 1; } /* end dallpeaks */ astrometry.net-0.67/util/datalog.c000644 000765 000024 00000003405 12651445460 017324 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "datalog.h" static data_log_t g_datalog; static data_log_t* get_logger() { return &g_datalog; } void data_log_init(int level) { data_log_t* log = get_logger(); log->level = level; log->f = stdout; log->mask = 0; log->nitems = 0; } void data_log_start() { data_log_t* log = get_logger(); fprintf(log->f, "[\n"); } void data_log_end() { data_log_t* log = get_logger(); fprintf(log->f, "]\n"); } void data_log_start_item(data_mask_t mask, int level, const char* name) { data_log_t* log = get_logger(); data_log(mask, level, "%s{\"%s\": ", (log->nitems ? ",\n" : ""), name); } void data_log_end_item(data_mask_t mask, int level) { data_log_t* log = get_logger(); data_log(mask, level, "}"); if (data_log_passes(mask, level)) log->nitems++; } void data_log_enable(data_mask_t mask) { data_log_t* log = get_logger(); log->mask |= mask; } void data_log_enable_all() { data_log_t* log = get_logger(); log->mask |= DATALOG_MASK_ALL; } void data_log_set_level(int level) { data_log_t* log = get_logger(); log->level = level; } void data_log_to(FILE* fid) { data_log_t* log = get_logger(); log->f = fid; } anbool data_log_passes(data_mask_t mask, int level) { data_log_t* log = get_logger(); if (level > log->level) return FALSE; if ((mask & log->mask) == 0) return FALSE; return TRUE; } void data_log(data_mask_t mask, int level, const char* format, ...) { data_log_t* log = get_logger(); va_list va; if (!data_log_passes(mask, level)) return; va_start(va, format); vfprintf(log->f, format, va); va_end(va); fflush(log->f); } astrometry.net-0.67/util/dcen3x3.c000644 000765 000024 00000005526 12651445460 017166 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "simplexy-common.h" /* * dcen3x3.c * * Find center of a star inside a 3x3 image * * COMMENTS: * - Convention is to make the CENTER of the first pixel (0,0). * BUGS: * * Mike Blanton * 1/2006 */ int dcen3a(float f0, float f1, float f2, float *xcen, float* maxval ) { float s, d, aa, sod, kk; kk = (4.0/3.0); s = 0.5 * (f2 - f0); d = 2. * f1 - (f0 + f2); if (d <= 1.e-10*f0) { return (0); } aa = f1 + 0.5 * s * s / d; sod = s / d; if (!isnormal(aa) || !isnormal(s)) return 0; (*xcen) = sod * (1. + kk * (0.25 * d / aa) * (1. - 4. * sod * sod)) + 1.; return (1); } /* given points at (0, f0), (1, f1), (2, f2), assume there is a quadratic passing through the three points; return the peak position and value of the quadratic: f = a x^2 + b x + c df/dx = 2ax + b = 0 => x* = -b/2a f* = a x*^2 + b x* + c */ int dcen3b(float f0, float f1, float f2, float *xcen //float *maxval ) { float a, b; /* f0 = c f1 = a + b + c f2 = 4a + 2b + c */ a = 0.5 * (f2 - 2*f1 + f0); if (a == 0.0) return 0; b = f1 - a - f0; *xcen = -0.5 * b / a; if ((*xcen < 0.0) || (*xcen > 2.0)) return 0; //*maxval = a * (*xcen)*(*xcen) + b * (*xcen) + f0; return 1; } #define dcen3 dcen3b int dcen3x3(float *image, float *xcen, float *ycen) { float mx0=0, mx1=0, mx2=0; float my0=0, my1=0, my2=0; float bx, by, mx , my; int badcen = 0; // Find the peak of the quadratic along each row... badcen += dcen3(image[0 + 3*0], image[1 + 3*0], image[2 + 3*0], &mx0); badcen += dcen3(image[0 + 3*1], image[1 + 3*1], image[2 + 3*1], &mx1); badcen += dcen3(image[0 + 3*2], image[1 + 3*2], image[2 + 3*2], &mx2); // Now along each column... badcen += dcen3(image[0 + 3*0], image[0 + 3*1], image[0 + 3*2], &my0); badcen += dcen3(image[1 + 3*0], image[1 + 3*1], image[1 + 3*2], &my1); badcen += dcen3(image[2 + 3*0], image[2 + 3*1], image[2 + 3*2], &my2); /* are we not okay? */ if (badcen != 6) return 0; // Fit straight line to peak positions along the rows... /* x = (y-1) mx + bx */ bx = (mx0 + mx1 + mx2) / 3.; mx = (mx2 - mx0) / 2.; // ... and along the columns... /* y = (x-1) my + by */ by = (my0 + my1 + my2) / 3.; my = (my2 - my0) / 2.; /* find intersection */ (*xcen) = (mx * (by - my - 1.) + bx) / (1. + mx * my); (*ycen) = ((*xcen) - 1.) * my + by; /* check that we are in the box */ if (((*xcen) < 0.0) || ((*xcen) > 2.0) || ((*ycen) < 0.0) || ((*ycen) > 2.0)){ return (0); } /* check for nan's and inf's */ if (!isnormal(*xcen) || !isnormal(*ycen)) return 0; return (1); } /* end dcen3x3 */ astrometry.net-0.67/util/degtohms.py000755 000765 000024 00000001523 12651445460 017733 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from astrometry.util.starutil_numpy import * if __name__ == '__main__': args = sys.argv[1:] if len(args) != 2: print 'Usage: %s ' % sys.argv[0] sys.exit(-1) ra = float(args[0]) dec = float(args[1]) rastr = ra2hmsstring(ra).replace(' ','h',1).replace(' ','m',1).replace(' ','s',1) decstr = dec2dmsstring(dec).replace(' ','d',1).replace(' ','m',1).replace(' ','s',1) print ' %-20s %-20s' % ('RA', 'Dec') print 'in: %-20f %-20f' % (ra, dec) print 'out: %-20s %-20s' % (ra2hmsstring(ra), dec2dmsstring(dec)) print 'out: %-20s %-20s' % (ra2hmsstring(ra,':'), dec2dmsstring(dec, ':')) print 'out: %-20s %-20s' % (rastr, decstr) astrometry.net-0.67/util/dfind.c000644 000765 000024 00000005243 12651445460 016777 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "simplexy-common.h" #include "dimage.h" #include "bl.h" /* * dfind.c * * Find non-zero objects in a binary image. * * Mike Blanton * 1/2006 * * dfind2() Keir Mierle 2007 */ #define DEBUG_DFIND 0 int initial_max_groups = 50; /* * This code does connected component analysis, but instead of returning a list * of components, it does the following crazy thing: it returns an image where * each component is all numbered the same. For example, if your input is: * * . . . . . . . . . * . . . 1 . . . . . * . . 1 1 1 . . . . * . . . 1 . . . . . * . . . . . . . . . * . 1 1 . . . 1 . . * . 1 1 . . 1 1 1 . * . 1 1 . . . 1 . . * . . . . . . . . . * * where . is 0. Then your output is: * * . . . . . . . . . * . . . 0 . . . . . * . . 0 0 0 . . . . * . . . 0 . . . . . * . . . . . . . . . * . 1 1 . . . 2 . . * . 1 1 . . 2 2 2 . * . 1 1 . . . 2 . . * . . . . . . . . . * * where . is now -1. Diagonals are considered connections, so the following is * a single component: * . . . . . * . 1 . 1 . * . . 1 . . * . 1 . 1 . * . . . . . */ /* Finds the root of this set (which is the min label) but collapses * intermediate labels as it goes. */ dimage_label_t collapsing_find_minlabel(dimage_label_t label, dimage_label_t *equivs) { int min; min = label; while (equivs[min] != min) min = equivs[min]; while (label != min) { int next = equivs[label]; equivs[label] = min; label = next; } return min; } static dimage_label_t relabel_image(il* on_pixels, int maxlabel, dimage_label_t* equivs, int* object) { int i; dimage_label_t maxcontiguouslabel = 0; dimage_label_t *number; number = malloc(sizeof(dimage_label_t) * maxlabel); assert(number); for (i = 0; i < maxlabel; i++) number[i] = LABEL_MAX; for (i=0; i= maxgroups) { maxgroups *= 2; equivs = realloc(equivs, sizeof(dimage_label_t) * maxgroups); assert(equivs); } object[nx*iy+ix] = maxlabel; equivs[maxlabel] = maxlabel; maxlabel++; if (maxlabel == LABEL_MAX) { logverb("Ran out of labels. Relabelling...\n"); maxlabel = relabel_image(on_pixels, maxlabel, equivs, object); logverb("After relabelling, we need %i labels\n", maxlabel); if (maxlabel == LABEL_MAX) { ERROR("Ran out of labels."); exit(-1); } } } thislabel = object[nx*iy + ix]; /* Compute minimum equivalence label for this pixel */ thislabelmin = collapsing_find_minlabel(thislabel, equivs); if (iy == 0) continue; /* Check three pixels above this one which are 'neighbours' */ for (i = MAX(0, ix - 1); i <= MIN(ix + 1, nx - 1); i++) { if (image[nx*(iy-1)+i]) { int otherlabel = object[nx*(iy-1) + i]; /* Find min of the other */ int otherlabelmin = collapsing_find_minlabel(otherlabel, equivs); /* Merge groups if necessary */ if (thislabelmin != otherlabelmin) { int oldlabelmin = MAX(thislabelmin, otherlabelmin); int newlabelmin = MIN(thislabelmin, otherlabelmin); thislabelmin = newlabelmin; equivs[oldlabelmin] = newlabelmin; equivs[thislabel] = newlabelmin; /* Update other pixel too */ object[nx*(iy-1) + i] = newlabelmin; } } } object[nx*iy + ix] = thislabelmin; } } /* Re-label the groups before returning */ maxlabel = relabel_image(on_pixels, maxlabel, equivs, object); //logverb("After final relabelling, %i labels were used.\n", maxlabel); if (pnobjects) *pnobjects = maxlabel; free(equivs); il_free(on_pixels); return 1; } astrometry.net-0.67/util/dmedsmooth.c000644 000765 000024 00000020200 12651445460 020044 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "simplexy-common.h" /* * dmedsmooth.c * * Median smooth an image -- actually, compute median values for a grid of points, * then interpolate. * * Mike Blanton * 1/2006 */ float dselip(unsigned long k, unsigned long n, float *arr); int dmedsmooth_gridpoints(int nx, int halfbox, int* p_nxgrid, int** p_xgrid, int** p_xlo, int** p_xhi) { int nxgrid; int* xgrid; int* xlo; int* xhi; int xoff; int i; nxgrid = MAX(1, nx / halfbox) + 2; *p_nxgrid = nxgrid; // "xgrid" are the centers. // "xlo" are the (inclusive) lower-bounds // "xhi" are the (inclusive) upper-bounds // the grid cells may overlap. *p_xgrid = xgrid = (int *) malloc((size_t)nxgrid * sizeof(int)); *p_xlo = xlo = (int *) malloc((size_t)nxgrid * sizeof(int)); *p_xhi = xhi = (int *) malloc((size_t)nxgrid * sizeof(int)); xoff = (nx - 1 - (nxgrid - 3) * halfbox) / 2; for (i = 1; i < nxgrid - 1; i++) xgrid[i] = (i - 1) * halfbox + xoff; xgrid[0] = xgrid[1] - halfbox; xgrid[nxgrid - 1] = xgrid[nxgrid - 2] + halfbox; for (i = 0; i < nxgrid; i++) { xlo[i] = MAX(xgrid[i] - halfbox, 0); xhi[i] = MIN(xgrid[i] + halfbox, nx-1); } return 0; } int dmedsmooth_grid(const float* image, const uint8_t *masked, int nx, int ny, int halfbox, float **p_grid, int** p_xgrid, int** p_ygrid, int* p_nxgrid, int* p_nygrid) { float* arr = NULL; float* grid = NULL; int *xlo = NULL; int *xhi = NULL; int *ylo = NULL; int *yhi = NULL; int nxgrid, nygrid; int i, j, nb, jp, ip, nm; if (dmedsmooth_gridpoints(nx, halfbox, &nxgrid, p_xgrid, &xlo, &xhi)) { return 1; } if (dmedsmooth_gridpoints(ny, halfbox, &nygrid, p_ygrid, &ylo, &yhi)) { FREEVEC(xlo); FREEVEC(xhi); FREEVEC(*p_xgrid); return 1; } *p_nxgrid = nxgrid; *p_nygrid = nygrid; /* for (i=0; i 1) { nm = nb / 2; grid[i + j*nxgrid] = dselip(nm, nb, arr); } else { grid[i + j*nxgrid] = image[(long)xlo[i] + ((long)ylo[j]) * nx]; } } } FREEVEC(xlo); FREEVEC(ylo); FREEVEC(xhi); FREEVEC(yhi); FREEVEC(arr); return 0; } int dmedsmooth_interpolate(const float* grid, int nx, int ny, int nxgrid, int nygrid, const int* xgrid, const int* ygrid, int halfbox, float* smooth) { int i, j; int jst, jnd, ist, ind; int ypsize, ymsize, xpsize, xmsize; int jp, ip; for (j = 0;j < ny;j++) for (i = 0;i < nx;i++) smooth[i + j*nx] = 0.; for (j = 0;j < nygrid;j++) { jst = (int) ( (float) ygrid[j] - halfbox * 1.5); jnd = (int) ( (float) ygrid[j] + halfbox * 1.5); if (jst < 0) jst = 0; if (jnd > ny - 1) jnd = ny - 1; ypsize = halfbox; ymsize = halfbox; if (j == 0) ypsize = ygrid[1] - ygrid[0]; if (j == 1) ymsize = ygrid[1] - ygrid[0]; if (j == nygrid - 2) ypsize = ygrid[nygrid - 1] - ygrid[nygrid - 2]; if (j == nygrid - 1) ymsize = ygrid[nygrid - 1] - ygrid[nygrid - 2]; for (i = 0;i < nxgrid;i++) { ist = (long) ( (float) xgrid[i] - halfbox * 1.5); ind = (long) ( (float) xgrid[i] + halfbox * 1.5); if (ist < 0) ist = 0; if (ind > nx - 1) ind = nx - 1; xpsize = halfbox; xmsize = halfbox; if (i == 0) xpsize = xgrid[1] - xgrid[0]; if (i == 1) xmsize = xgrid[1] - xgrid[0]; if (i == nxgrid - 2) xpsize = xgrid[nxgrid - 1] - xgrid[nxgrid - 2]; if (i == nxgrid - 1) xmsize = xgrid[nxgrid - 1] - xgrid[nxgrid - 2]; for (jp = jst;jp <= jnd;jp++) { // Interpolate with a kernel that is two parabolas spliced // together: in [-1.5, -0.5] and [0.5, 1.5], 0.5 * (|y|-1.5)^2 // so at +- 0.5 it has value 0.5. // at +- 1.5 it has value 0. // in [-0.5, 0.5]: 0.75 - (y^2) // so at +- 0.5 it has value 0.5 // at 0 it has value 0.75 float dx, dy; float xkernel, ykernel; dy = (float)(jp - ygrid[j]); if (dy >= 0) { dy /= (float)ypsize; } else { dy /= (float)(-ymsize); } if ((dy >= 0.5) && (dy < 1.5)) ykernel = 0.5 * (dy - 1.5) * (dy - 1.5); else if (dy < 0.5) ykernel = 0.75 - (dy * dy); else // ykernel = 0 continue; for (ip = ist; ip <= ind; ip++) { dx = (float)(ip - xgrid[i]); if (dx >= 0) { dx /= (float)xpsize; } else { dx /= (float)(-xmsize); } if ((dx >= 0.5) && (dx < 1.5)) xkernel = 0.5 * (dx - 1.5) * (dx - 1.5); else if (dx < 0.5) xkernel = 0.75 - (dx * dx); else // xkernel = 0 continue; smooth[ip + jp*nx] += xkernel * ykernel * grid[i + j * nxgrid]; } } } } return 0; } int dmedsmooth(const float *image, const uint8_t *masked, int nx, int ny, int halfbox, float *smooth) { float *grid = NULL; int *xgrid = NULL; int *ygrid = NULL; int nxgrid, nygrid; if (dmedsmooth_grid(image, masked, nx, ny, halfbox, &grid, &xgrid, &ygrid, &nxgrid, &nygrid)) { return 0; } if (dmedsmooth_interpolate(grid, nx, ny, nxgrid, nygrid, xgrid, ygrid, halfbox, smooth)) { return 0; } FREEVEC(grid); FREEVEC(xgrid); FREEVEC(ygrid); return 1; } astrometry.net-0.67/util/dobjects.c000644 000765 000024 00000005421 12651445460 017506 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "dimage.h" #include "simplexy-common.h" #include "log.h" /* * dobjects.c * * Object detection * * Mike Blanton * 1/2006 */ typedef unsigned char u8; int dmask(float *image, int nx, int ny, float limit, float dpsf, uint8_t* mask) { int i, j, ip, jp, ilo, ihi, jlo, jhi; int flagged_one = 0; int boxsize = 3 * dpsf; memset(mask, 0, nx*ny); /* This makes a mask which dfind uses when looking at the pixels; dfind * ignores any pixels the mask flagged as uninteresting. */ for (j=0; j #include #include #include #include #include #include #include "os-features.h" #include "an-bool.h" #include "log.h" #include "errors.h" #include "mathutil.h" #include "fitsioutils.h" #include "ioutils.h" #include "anqfits.h" #include "qfits_convert.h" #include "qfits_header.h" static const char* OPTIONS = "hvs:e:"; static void printHelp(char* progname) { printf("%s [options] \n" " use \"-\" to write to stdout.\n" " [-s ]: downsample scale (default: 2): integer\n" " [-e ]: read extension (default: 0)\n" " [-v]: verbose\n" "\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; FILE* fout; anbool tostdout = FALSE; anqfits_t* anq; int W, H; qfits_header* hdr; const anqfits_image_t* animg; float* img; int loglvl = LOG_MSG; int scale = 2; int winw; int winh; int plane; int out_bitpix = -32; float* outimg; int outw, outh; int edge = EDGE_TRUNCATE; int ext = 0; int npixout = 0; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 's': scale = atoi(optarg); break; case 'e': ext = atoi(optarg); break; case '?': case 'h': printHelp(argv[0]); return 0; default: return -1; } log_init(loglvl); log_to(stderr); errors_log_to(stderr); fits_use_error_system(); if (argc - optind != 2) { logerr("Need two arguments: input and output files.\n"); printHelp(argv[0]); exit(-1); } infn = argv[optind]; outfn = argv[optind+1]; if (streq(outfn, "-")) { tostdout = TRUE; fout = stdout; } else { fout = fopen(outfn, "wb"); if (!fout) { SYSERROR("Failed to open output file \"%s\"", outfn); exit(-1); } } anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open input file \"%s\"", infn); exit(-1); } animg = anqfits_get_image_const(anq, ext); W = (int)animg->width; H = (int)animg->height; if (!animg) { ERROR("Failde to read image from \"%s\"", infn); exit(-1); } /* if (tostdout) dump.filename = "STDOUT"; else dump.filename = outfn; dump.ptype = PTYPE_FLOAT; dump.out_ptype = out_bitpix; */ get_output_image_size(W % scale, H % scale, scale, edge, &outw, &outh); outw += (W / scale); outh += (H / scale); hdr = qfits_header_default(); fits_header_add_int(hdr, "BITPIX", out_bitpix, "bits per pixel"); if (animg->planes > 1) fits_header_add_int(hdr, "NAXIS", 3, "number of axes"); else fits_header_add_int(hdr, "NAXIS", 2, "number of axes"); fits_header_add_int(hdr, "NAXIS1", outw, "image width"); fits_header_add_int(hdr, "NAXIS2", outh, "image height"); if (animg->planes > 1) fits_header_add_int(hdr, "NAXIS3", animg->planes, "number of planes"); if (qfits_header_dump(hdr, fout)) { ERROR("Failed to write FITS header to \"%s\"", outfn); exit(-1); } qfits_header_destroy(hdr); winw = W; winh = (int)ceil(ceil(1024*1024 / (float)winw) / (float)scale) * scale; outimg = malloc((int)ceil(winw/scale)*(int)ceil(winh/scale) * sizeof(float)); logmsg("Image is %i x %i x %i\n", W, H, (int)animg->planes); logmsg("Output will be %i x %i x %i\n", outw, outh, (int)animg->planes); logverb("Reading in blocks of %i x %i\n", winw, winh); for (plane=0; planeplanes; plane++) { int bx, by; int nx, ny; for (by=0; by<(int)ceil(H / (float)winh); by++) { for (bx=0; bx<(int)ceil(W / (float)winw); bx++) { int i; int lox, loy, hix, hiy, outw, outh; nx = MIN(winw, W - bx*winw); ny = MIN(winh, H - by*winh); lox = bx*winw; loy = by*winh; hix = lox + nx; hiy = loy + ny; logverb(" reading %i,%i + %i,%i\n", lox, loy, nx, ny); img = anqfits_readpix(anq, ext, lox, hix, loy, hiy, plane, PTYPE_FLOAT, NULL, &W, &H); if (!img) { ERROR("Failed to load pixel window: x=[%i, %i), y=[%i,%i), plane %i\n", lox, hix, loy, hiy, plane); exit(-1); } average_image_f(img, nx, ny, scale, edge, &outw, &outh, outimg); free(img); logverb(" writing %i x %i\n", outw, outh); if (outw * outh == 0) continue; for (i=0; i #include #include #include #include #include "keywords.h" #include "dimage.h" #include "permutedsort.h" #include "simplexy-common.h" /* * dpeaks.c * * Find peaks in an image, for the purposes of deblending children. * * Mike Blanton * 1/2006 */ int dpeaks(float *image, int nx, int ny, int *npeaks, int *xcen, int *ycen, float sigma, /* sky sigma */ float dlim, /* limiting distance */ float saddle, /* number of sigma for allowed saddle */ int maxnpeaks, int smoothimage, int checkpeaks, float minpeak) { int i, j, ip, jp, ist, jst, ind, jnd, highest, tmpnpeaks; float dx, dy, level; float *smooth = NULL; int *peaks = NULL; int *indx = NULL; int *object = NULL; int *keep = NULL; int *mask = NULL; int *fullxcen = NULL; int *fullycen = NULL; /* 1. smooth image */ smooth = (float *) malloc(sizeof(float) * nx * ny); if (smoothimage) { dsmooth2(image, nx, ny, 1, smooth); } else { for (j = 0;j < ny;j++) for (i = 0;i < nx;i++) smooth[i + j*nx] = image[i + j*nx]; } /* 2. find peaks (highest in the 3x3 neighbourhood) */ peaks = (int *) malloc(sizeof(int) * nx * ny); *npeaks = 0; for (j = 1; j < ny - 1; j++) { jst = j - 1; jnd = j + 1; for (i = 1; i < nx - 1; i++) { if (smooth[i + j*nx] < minpeak) continue; ist = i - 1; ind = i + 1; highest = 1; for (ip = ist; ip <= ind; ip++) for (jp = jst; jp <= jnd; jp++) if (smooth[ip + jp*nx] > smooth[i + j*nx]) highest = 0; if (highest) { peaks[*npeaks] = i + j * nx; (*npeaks)++; } } } // DEBUG for (i=0; i<(*npeaks); i++) { Unused float pk = smooth[peaks[i]]; assert((peaks[i] % nx) >= 1); assert((peaks[i] % nx) <= (nx-2)); assert((peaks[i] / nx) >= 1); assert((peaks[i] / nx) <= (ny-2)); assert(pk >= minpeak); assert(pk >= smooth[peaks[i]-1]); assert(pk >= smooth[peaks[i]+1]); assert(pk >= smooth[peaks[i]-nx]); assert(pk >= smooth[peaks[i]+nx]); assert(pk >= smooth[peaks[i]+nx+1]); assert(pk >= smooth[peaks[i]+nx-1]); assert(pk >= smooth[peaks[i]-nx+1]); assert(pk >= smooth[peaks[i]-nx-1]); } /* 2. sort peaks */ indx = realloc(peaks, sizeof(int) * (*npeaks)); peaks = NULL; permuted_sort(smooth, sizeof(float), compare_floats_desc, indx, *npeaks); // DEBUG for (i=0; i<(*npeaks); i++) { Unused float pk = smooth[indx[i]]; assert((indx[i] % nx) >= 1); assert((indx[i] % nx) <= (nx-2)); assert((indx[i] / nx) >= 1); assert((indx[i] / nx) <= (ny-2)); assert(pk >= minpeak); assert(pk >= smooth[indx[i]-1]); assert(pk >= smooth[indx[i]+1]); assert(pk >= smooth[indx[i]-nx]); assert(pk >= smooth[indx[i]+nx]); assert(pk >= smooth[indx[i]+nx+1]); assert(pk >= smooth[indx[i]+nx-1]); assert(pk >= smooth[indx[i]-nx+1]); assert(pk >= smooth[indx[i]-nx-1]); } for (i=1; i<(*npeaks); i++) { assert(smooth[indx[i-1]] >= smooth[indx[i]]); } if ((*npeaks) > maxnpeaks) *npeaks = maxnpeaks; fullxcen = (int *) malloc((*npeaks) * sizeof(int)); fullycen = (int *) malloc((*npeaks) * sizeof(int)); for (i = 0;i < (*npeaks);i++) { fullxcen[i] = indx[i] % nx; fullycen[i] = indx[i] / nx; } FREEVEC(indx); // DEBUG for (i = 0;i < (*npeaks);i++) { assert(fullxcen[i] >= 1); assert(fullxcen[i] <= nx-2); assert(fullycen[i] >= 1); assert(fullycen[i] <= ny-2); } /* 3. trim close peaks and joined peaks */ mask = (int *) malloc(sizeof(int) * nx * ny); object = (int *) malloc(sizeof(int) * nx * ny); keep = (int *) malloc(sizeof(int) * (*npeaks)); for (i = (*npeaks) - 1;i >= 0;i--) { keep[i] = 1; if (checkpeaks) { /* look for peaks joined by a high saddle to brighter peaks */ level = (smooth[ fullxcen[i] + fullycen[i] * nx] - saddle * sigma); if (level < sigma) level = sigma; if (level > 0.99*smooth[ fullxcen[i] + fullycen[i] * nx]) level= 0.99*smooth[ fullxcen[i] + fullycen[i] * nx]; for (jp = 0;jp < ny;jp++) for (ip = 0;ip < nx;ip++) mask[ip + jp*nx] = smooth[ip + jp * nx] > level; dfind2(mask, nx, ny, object, NULL); for (j = i - 1;j >= 0;j--) if (object[ fullxcen[j] + fullycen[j]*nx] == object[ fullxcen[i] + fullycen[i]*nx] || object[ fullxcen[i] + fullycen[i]*nx] == -1 ) { keep[i] = 0; } } /* look for close peaks */ for (j = i - 1;j >= 0;j--) { dx = (float)(fullxcen[j] - fullxcen[i]); dy = (float)(fullycen[j] - fullycen[i]); if (dx*dx + dy*dy < dlim*dlim) keep[i] = 0; } } // Grab just the keepers. tmpnpeaks = 0; for (i=0; i < (*npeaks); i++) { if (!keep[i]) continue; xcen[tmpnpeaks] = fullxcen[i]; ycen[tmpnpeaks] = fullycen[i]; tmpnpeaks++; if (tmpnpeaks >= maxnpeaks) break; } (*npeaks) = tmpnpeaks; FREEVEC(smooth); FREEVEC(keep); FREEVEC(object); FREEVEC(mask); FREEVEC(fullxcen); FREEVEC(fullycen); return (1); } /* end dpeaks */ astrometry.net-0.67/util/dselip.c000644 000765 000024 00000002365 12651445460 017175 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include // for compare_floats_asc #include "permutedsort.h" // for QSORT_R #include "os-features.h" #ifdef SIMPLEXY_REENTRANT // this is slower, because each call needs to malloc, but it is reentrant float dselip(unsigned long k, unsigned long n, const float *arr) { float* sorted_data = malloc(sizeof(float) * n); memcpy(sorted_data, arr, sizeof(float)*n); QSORT_R(sorted_data, n, sizeof(float), NULL, compare_floats_asc_r); float kth_item = sorted_data[k]; free(sorted_data); return kth_item; } void dselip_cleanup() { } #else static int high_water_mark = 0; static float* past_data = NULL; float dselip(unsigned long k, unsigned long n, float *arr) { if (n > high_water_mark) { free(past_data); past_data = malloc(sizeof(float) * n); high_water_mark = n; //printf("dselip watermark=%lu\n",n); } memcpy(past_data, arr, sizeof(float) * n); qsort(past_data, n, sizeof(float), compare_floats_asc); return past_data[k]; } void dselip_cleanup() { free(past_data); past_data = NULL; high_water_mark = 0; } #endif astrometry.net-0.67/util/dsigma.c000644 000765 000024 00000001072 12651445460 017153 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "dimage.h" #include "simplexy-common.h" #include "log.h" /* * dsigma.c * * Simple guess at the sky sigma * * Mike Blanton * 1/2006 */ #define IMGTYPE float #define DSIGMA_SUFF #include "dsigma.inc" #undef DSIGMA_SUFF #undef IMGTYPE #define IMGTYPE uint8_t #define DSIGMA_SUFF _u8 #include "dsigma.inc" #undef IMGTYPE #undef DSIGMA_SUFF astrometry.net-0.67/util/dsigma.inc000644 000765 000024 00000005054 12651445460 017506 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #define GLUE2(a,b) a ## b #define GLUE(a,b) GLUE2(a, b) int GLUE(dsigma, DSIGMA_SUFF)(IMGTYPE *image, int nx, int ny, int sp, int gridsize, float *sigma) { #undef GLUE #undef GLUE2 float *diff = NULL; float tot; int i, j, n, dx, dy, ndiff; int rtn = 0; if (nx == 1 && ny == 1) { *sigma = 0.; return rtn; } if (gridsize == 0) gridsize = 20; dx = gridsize; if (dx > nx / 4) dx = nx / 4; if (dx <= 0) dx = 1; dy = gridsize; if (dy > ny / 4) dy = ny / 4; if (dy <= 0) dy = 1; /* get a bunch of noise 'samples' by looking at the differences between two * diagonally spaced pixels (usually 5) */ ndiff = ((nx-sp + dx-1)/dx) * ((ny-sp + dy-1)/dy); if (ndiff <= 1) { *sigma = 0.; return rtn; } logverb("Sampling sigma at %i points\n", ndiff); diff = malloc(ndiff * sizeof(float)); n = 0; for (j = 0; j < ny-sp; j += dy) { for (i = 0; i < nx-sp; i += dx) { //diff[n] = fabs(image[i + j * nx] - image[i + sp + (j + sp) * nx]); diff[n] = fabs((float)image[i + j * nx] - (float)image[i + sp + (j + sp) * nx]); n++; } } assert(n == ndiff); if (ndiff <= 10) { tot = 0.; for (i = 0; i < ndiff; i++) tot += diff[i] * diff[i]; *sigma = sqrt(tot / (float) ndiff); goto finish; } /* estimate sigma in a clever way to avoid having our estimate biased by outliers. outliers come into the diff list when we sampled a point where the upper point was on a source, but the lower one was not (or vice versa). Since the sample variance involves squaring the already-large outliers, they drastically affect the final sigma estimate. by sorting, the outliers go to the top and only affect the final value very slightly, because they are a small fraction of the total entries in diff (or so we hope!) */ { double Nsigma=0.7; double s = 0.0; // Sample the sorted list of squared differences at different // percentiles (starting at ~50th) while (s == 0.0) { int k = (int)floor(ndiff * erf(Nsigma / M_SQRT2)); if (k >= ndiff) { logerr("Failed to estimate the image noise. Setting sigma=1. Expect the worst.\n"); // FIXME - Could try a finer grid of sample points... s = 1.0; break; } s = dselip(k, ndiff, diff) / (Nsigma * M_SQRT2); logverb("Nsigma=%g, s=%g\n", Nsigma, s); Nsigma += 0.1; } *sigma = s; } rtn = 1; finish: FREEVEC(diff); return rtn; } /* end dsigma */ astrometry.net-0.67/util/dsmooth.c000644 000765 000024 00000004146 12651445460 017371 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "simplexy-common.h" /* * dsmooth.c * * Smooth an image * * Mike Blanton * 1/2006 */ #define IMGTYPE float #define SUFFIX #include "dsmooth.inc" #undef SUFFIX #undef IMGTYPE #define IMGTYPE uint8_t #define SUFFIX _u8 #include "dsmooth.inc" #undef IMGTYPE #undef SUFFIX #define IMGTYPE int16_t #define SUFFIX _i16 #include "dsmooth.inc" #undef IMGTYPE #undef SUFFIX // Original version of dsmooth, non-separated kernel. int dsmooth(float *image, int nx, int ny, float sigma, float *smooth) { int i, j, npix, half, ip, jp, ist, jst, isto, jsto, ind, jnd, ioff, joff; float invvar, total, scale, dx, dy; float* kernel; /* make kernel */ npix = 2 * ((int) ceilf(3. * sigma)) + 1; half = npix / 2; kernel = malloc(npix * npix * sizeof(float)); invvar = 1. / sigma / sigma; for (i = 0;i < npix;i++) for (j = 0;j < npix;j++) { dx = ((float) i - 0.5 * ((float)npix - 1.)); dy = ((float) j - 0.5 * ((float)npix - 1.)); kernel[i + j*npix] = exp( -0.5 * (dx * dx + dy * dy) * invvar); } total = 0.; for (i = 0;i < npix;i++) for (j = 0;j < npix;j++) total += kernel[i + j * npix]; scale = 1. / total; for (i = 0;i < npix;i++) for (j = 0;j < npix;j++) kernel[i + j*npix] *= scale; for (j = 0;j < ny;j++) for (i = 0;i < nx;i++) smooth[i + j*nx] = 0.; for (j = 0;j < ny;j++) { jsto = jst = j - half; jnd = j + half; if (jst < 0) jst = 0; if (jnd > ny - 1) jnd = ny - 1; for (i = 0;i < nx;i++) { isto = ist = i - half; ind = i + half; if (ist < 0) ist = 0; if (ind > nx - 1) ind = nx - 1; for (jp = jst;jp <= jnd;jp++) for (ip = ist;ip <= ind;ip++) { ioff = ip - isto; joff = jp - jsto; smooth[ip + jp*nx] += image[i + j * nx] * kernel[ioff + joff * npix]; } } } FREEVEC(kernel); return (1); } /* end photfrac */ astrometry.net-0.67/util/dsmooth.inc000644 000765 000024 00000005161 12651445460 017716 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #define GLUE2(a,b) a ## b #define GLUE(a,b) GLUE2(a, b) // Optimize version of dsmooth, with a separated Gaussian convolution. void GLUE(dsmooth2, SUFFIX)(IMGTYPE *image, int nx, int ny, float sigma, float *smooth) { #undef GLUE #undef GLUE2 int i, j, npix, half, start, end, sample; float neghalfinvvar, total, scale, dx, sum; float* kernel1D; float* kernel_shifted; float* smooth_temp; // make the kernel npix = 2 * ((int) ceilf(3. * sigma)) + 1; half = npix / 2; kernel1D = malloc(npix * sizeof(float)); neghalfinvvar = -1.0 / (2.0 * sigma * sigma); for (i=0; i #include #include "eigen-math.h" evector_t* evector_new(int N) { evector_t* v = malloc(sizeof(evector_t)); assert(v); v->data = calloc(N, sizeof(double)); assert(v->data); v->N = N; return v; } ematrix_t* ematrix_new(int R, int C) { ematrix_t* m = malloc(sizeof(ematrix_t)); assert(m); m->data = calloc(R * C, sizeof(double)); assert(m->data); m->rows = R; m->cols = C; return m; } void ematrix_set(ematrix_t* m, int r, int c, double v) { m->data[r * m->cols + c] = v; } double ematrix_get(const ematrix_t* m, int r, int c) { return m->data[r * m->cols + c]; } void evector_set(evector_t* m, int i, double v) { m->data[i] = v; } double evector_get(const evector_t* m, int i) { return m->data[i]; } astrometry.net-0.67/util/eigen-math-cc.cc000644 000765 000024 00000002534 12651445460 020457 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ //#include #include //using namespace std; using namespace Eigen; extern "C" { #include "eigen-math.h" #include "stdio.h" #if 0 } // fool emacs indenter #endif int eigen_solve_least_squares(ematrix_t* A, evector_t** B, evector_t** X, int NB) { int i; int r,c; Map > mA(A->data, A->rows, A->cols); /* printf("mA:\n"); for (r=0; r mB(B[i]->data, B[i]->N, RowMajor); printf("["); for (c=0; c svd(mA, ComputeThinU | ComputeThinV); for (i=0; i b(B[i]->data, B[i]->N, RowMajor); VectorXd x = svd.solve(b); // copy results back to C space... for (r=0; r #include #include #include #include "errors.h" #include "ioutils.h" #include "an-bool.h" static pl* estack = NULL; static anbool atexit_registered = FALSE; static err_t* error_copy(err_t* e) { int i, N; err_t* copy = error_new(); copy->print = e->print; copy->save = e->save; N = error_stack_N_entries(e); for (i=0; ifile, ee->line, ee->func, ee->str); } return copy; } static FILE* print_errs_fid; static void print_errs(void) { FILE* fid = print_errs_fid; //fprintf(fid, "Error traceback:\n"); errors_print_stack(fid); } void errors_start_logging_to_string() { err_t* err; errors_push_state(); err = errors_get_state(); err->print = NULL; err->save = TRUE; } char* errors_stop_logging_to_string(const char* separator) { err_t* err; char* rtn; err = errors_get_state(); rtn = error_get_errs(err, separator); errors_pop_state(); return rtn; } int errors_print_on_exit(FILE* fid) { err_t* e; errors_push_state(); e = errors_get_state(); e->save = TRUE; e->print = NULL; print_errs_fid = fid; return atexit(print_errs); } void errors_log_to(FILE* f) { err_t* e; e = errors_get_state(); e->print = f; } void errors_use_function(errfunc_t* func, void* baton) { err_t* e; e = errors_get_state(); e->errfunc = func; e->baton = baton; e->print = NULL; e->save = FALSE; } void errors_clear_stack() { error_stack_clear(errors_get_state()); } err_t* errors_get_state() { if (!estack) { estack = pl_new(4); // register an atexit() function to clean up. if (!atexit_registered) { if (atexit(errors_free) == 0) atexit_registered = TRUE; } } if (!pl_size(estack)) { err_t* e = error_new(); e->print = stderr; pl_append(estack, e); } return pl_get(estack, pl_size(estack)-1); } void errors_free() { int i; if (!estack) return; for (i=0; ierrstack = bl_new(4, sizeof(errentry_t)); return e; } void error_free(err_t* e) { if (!e) return; error_stack_clear(e); bl_free(e->errstack); free(e); } int error_nerrs(const err_t* e) { return error_stack_N_entries(e); } char* error_get_errstr(const err_t* e, int i) { errentry_t* ee = error_stack_get_entry(e, i); return ee->str; } void error_report(err_t* e, const char* module, int line, const char* func, const char* fmt, ...) { va_list va; va_start(va, fmt); error_reportv(errors_get_state(), module, line, func, fmt, va); va_end(va); } void error_reportv(err_t* e, const char* module, int line, const char* func, const char* fmt, va_list va) { if (e->print) { if (line == -1) fprintf(e->print, "%s: ", module); else fprintf(e->print, "%s:%i:%s: ", module, line, func); vfprintf(e->print, fmt, va); fprintf(e->print, "\n"); } if (e->save) { error_stack_add_entryv(e, module, line, func, fmt, va); } if (e->errfunc) { e->errfunc(e->baton, e, module, line, func, fmt, va); } } void error_print_stack(err_t* e, FILE* f) { int i; anbool first=TRUE; for (i=error_stack_N_entries(e)-1; i>=0; i--) { errentry_t* ee = error_stack_get_entry(e, i); if (!first) fprintf(f, " "); if (ee->line >= 0) { fprintf(f, "%s:%i:%s %s\n", ee->file, ee->line, ee->func, ee->str); } else { fprintf(f, "%s:%s %s\n", ee->file, ee->func, ee->str); } first = FALSE; } } char* error_get_errs(err_t* e, const char* separator) { sl* errs = sl_new(4); int i,N; char* rtn; N = error_stack_N_entries(e); for (i=0; istr); } rtn = sl_join_reverse(errs, separator); sl_free2(errs); return rtn; } void errors_regex_error(int errcode, const regex_t* re) { char str[256]; regerror(errcode, re, str, sizeof(str)); error_report(errors_get_state(), "regex", -1, NULL, "%s", str); } void error_stack_add_entryv(err_t* e, const char* file, int line, const char* func, const char* format, va_list va) { char* str; if (vasprintf(&str, format, va) == -1) { fprintf(stderr, "vasprintf failed with format string: \"%s\"\n", format); return; } error_stack_add_entry(e, file, line, func, str); free(str); } void error_stack_add_entry(err_t* e, const char* file, int line, const char* func, const char* str) { errentry_t ee; ee.file = strdup_safe(file); ee.line = line; ee.func = strdup_safe(func); ee.str = strdup_safe(str); bl_append(e->errstack, &ee); } errentry_t* error_stack_get_entry(const err_t* e, int i) { return bl_access(e->errstack, i); } int error_stack_N_entries(const err_t* e) { return bl_size(e->errstack); } void error_stack_clear(err_t* e) { int i; int N = bl_size(e->errstack); for (i=0; ierrstack, i); free(ee->file); free(ee->func); free(ee->str); } bl_remove_all(e->errstack); } astrometry.net-0.67/util/EXIF.py000755 000765 000024 00000166640 12651445460 016670 0ustar00dstnstaff000000 000000 #!/usr/bin/env python # -*- coding: utf-8 -*- # # Library to extract EXIF information from digital camera image files # https://github.com/ianare/exif-py # # VERSION 1.1.0 # # To use this library call with: # f = open(path_name, 'rb') # tags = EXIF.process_file(f) # # To ignore MakerNote tags, pass the -q or --quick # command line arguments, or as # tags = EXIF.process_file(f, details=False) # # To stop processing after a certain tag is retrieved, # pass the -t TAG or --stop-tag TAG argument, or as # tags = EXIF.process_file(f, stop_tag='TAG') # # where TAG is a valid tag name, ex 'DateTimeOriginal' # # These 2 are useful when you are retrieving a large list of images # # # To return an error on invalid tags, # pass the -s or --strict argument, or as # tags = EXIF.process_file(f, strict=True) # # Otherwise these tags will be ignored # # Returned tags will be a dictionary mapping names of EXIF tags to their # values in the file named by path_name. You can process the tags # as you wish. In particular, you can iterate through all the tags with: # for tag in tags.keys(): # if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', # 'EXIF MakerNote'): # print "Key: %s, value %s" % (tag, tags[tag]) # (This code uses the if statement to avoid printing out a few of the # tags that tend to be long or boring.) # # The tags dictionary will include keys for all of the usual EXIF # tags, and will also include keys for Makernotes used by some # cameras, for which we have a good specification. # # Note that the dictionary keys are the IFD name followed by the # tag name. For example: # 'EXIF DateTimeOriginal', 'Image Orientation', 'MakerNote FocusMode' # # Copyright (c) 2002-2007 Gene Cash All rights reserved # Copyright (c) 2007-2008 Ianaré Sévi All rights reserved # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # # 3. Neither the name of the authors nor the names of its contributors # may be used to endorse or promote products derived from this # software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # # ----- See 'changes.txt' file for all contributors and changes ----- # # # Don't throw an exception when given an out of range character. def make_string(seq): str = '' for c in seq: # Screen out non-printing characters if 32 <= c and c < 256: str += chr(c) # If no printing chars if not str: return seq return str # Special version to deal with the code in the first 8 bytes of a user comment. # First 8 bytes gives coding system e.g. ASCII vs. JIS vs Unicode def make_string_uc(seq): code = seq[0:8] seq = seq[8:] # Of course, this is only correct if ASCII, and the standard explicitly # allows JIS and Unicode. return make_string(seq) # field type descriptions as (length, abbreviation, full name) tuples FIELD_TYPES = ( (0, 'X', 'Proprietary'), # no such type (1, 'B', 'Byte'), (1, 'A', 'ASCII'), (2, 'S', 'Short'), (4, 'L', 'Long'), (8, 'R', 'Ratio'), (1, 'SB', 'Signed Byte'), (1, 'U', 'Undefined'), (2, 'SS', 'Signed Short'), (4, 'SL', 'Signed Long'), (8, 'SR', 'Signed Ratio'), ) # dictionary of main EXIF tag names # first element of tuple is tag name, optional second element is # another dictionary giving names to values EXIF_TAGS = { 0x0100: ('ImageWidth', ), 0x0101: ('ImageLength', ), 0x0102: ('BitsPerSample', ), 0x0103: ('Compression', {1: 'Uncompressed', 2: 'CCITT 1D', 3: 'T4/Group 3 Fax', 4: 'T6/Group 4 Fax', 5: 'LZW', 6: 'JPEG (old-style)', 7: 'JPEG', 8: 'Adobe Deflate', 9: 'JBIG B&W', 10: 'JBIG Color', 32766: 'Next', 32769: 'Epson ERF Compressed', 32771: 'CCIRLEW', 32773: 'PackBits', 32809: 'Thunderscan', 32895: 'IT8CTPAD', 32896: 'IT8LW', 32897: 'IT8MP', 32898: 'IT8BL', 32908: 'PixarFilm', 32909: 'PixarLog', 32946: 'Deflate', 32947: 'DCS', 34661: 'JBIG', 34676: 'SGILog', 34677: 'SGILog24', 34712: 'JPEG 2000', 34713: 'Nikon NEF Compressed', 65000: 'Kodak DCR Compressed', 65535: 'Pentax PEF Compressed'}), 0x0106: ('PhotometricInterpretation', ), 0x0107: ('Thresholding', ), 0x010A: ('FillOrder', ), 0x010D: ('DocumentName', ), 0x010E: ('ImageDescription', ), 0x010F: ('Make', ), 0x0110: ('Model', ), 0x0111: ('StripOffsets', ), 0x0112: ('Orientation', {1: 'Horizontal (normal)', 2: 'Mirrored horizontal', 3: 'Rotated 180', 4: 'Mirrored vertical', 5: 'Mirrored horizontal then rotated 90 CCW', 6: 'Rotated 90 CW', 7: 'Mirrored horizontal then rotated 90 CW', 8: 'Rotated 90 CCW'}), 0x0115: ('SamplesPerPixel', ), 0x0116: ('RowsPerStrip', ), 0x0117: ('StripByteCounts', ), 0x011A: ('XResolution', ), 0x011B: ('YResolution', ), 0x011C: ('PlanarConfiguration', ), 0x011D: ('PageName', make_string), 0x0128: ('ResolutionUnit', {1: 'Not Absolute', 2: 'Pixels/Inch', 3: 'Pixels/Centimeter'}), 0x012D: ('TransferFunction', ), 0x0131: ('Software', ), 0x0132: ('DateTime', ), 0x013B: ('Artist', ), 0x013E: ('WhitePoint', ), 0x013F: ('PrimaryChromaticities', ), 0x0156: ('TransferRange', ), 0x0200: ('JPEGProc', ), 0x0201: ('JPEGInterchangeFormat', ), 0x0202: ('JPEGInterchangeFormatLength', ), 0x0211: ('YCbCrCoefficients', ), 0x0212: ('YCbCrSubSampling', ), 0x0213: ('YCbCrPositioning', {1: 'Centered', 2: 'Co-sited'}), 0x0214: ('ReferenceBlackWhite', ), 0x4746: ('Rating', ), 0x828D: ('CFARepeatPatternDim', ), 0x828E: ('CFAPattern', ), 0x828F: ('BatteryLevel', ), 0x8298: ('Copyright', ), 0x829A: ('ExposureTime', ), 0x829D: ('FNumber', ), 0x83BB: ('IPTC/NAA', ), 0x8769: ('ExifOffset', ), 0x8773: ('InterColorProfile', ), 0x8822: ('ExposureProgram', {0: 'Unidentified', 1: 'Manual', 2: 'Program Normal', 3: 'Aperture Priority', 4: 'Shutter Priority', 5: 'Program Creative', 6: 'Program Action', 7: 'Portrait Mode', 8: 'Landscape Mode'}), 0x8824: ('SpectralSensitivity', ), 0x8825: ('GPSInfo', ), 0x8827: ('ISOSpeedRatings', ), 0x8828: ('OECF', ), 0x9000: ('ExifVersion', make_string), 0x9003: ('DateTimeOriginal', ), 0x9004: ('DateTimeDigitized', ), 0x9101: ('ComponentsConfiguration', {0: '', 1: 'Y', 2: 'Cb', 3: 'Cr', 4: 'Red', 5: 'Green', 6: 'Blue'}), 0x9102: ('CompressedBitsPerPixel', ), 0x9201: ('ShutterSpeedValue', ), 0x9202: ('ApertureValue', ), 0x9203: ('BrightnessValue', ), 0x9204: ('ExposureBiasValue', ), 0x9205: ('MaxApertureValue', ), 0x9206: ('SubjectDistance', ), 0x9207: ('MeteringMode', {0: 'Unidentified', 1: 'Average', 2: 'CenterWeightedAverage', 3: 'Spot', 4: 'MultiSpot', 5: 'Pattern'}), 0x9208: ('LightSource', {0: 'Unknown', 1: 'Daylight', 2: 'Fluorescent', 3: 'Tungsten', 9: 'Fine Weather', 10: 'Flash', 11: 'Shade', 12: 'Daylight Fluorescent', 13: 'Day White Fluorescent', 14: 'Cool White Fluorescent', 15: 'White Fluorescent', 17: 'Standard Light A', 18: 'Standard Light B', 19: 'Standard Light C', 20: 'D55', 21: 'D65', 22: 'D75', 255: 'Other'}), 0x9209: ('Flash', {0: 'No', 1: 'Fired', 5: 'Fired (?)', # no return sensed 7: 'Fired (!)', # return sensed 9: 'Fill Fired', 13: 'Fill Fired (?)', 15: 'Fill Fired (!)', 16: 'Off', 24: 'Auto Off', 25: 'Auto Fired', 29: 'Auto Fired (?)', 31: 'Auto Fired (!)', 32: 'Not Available'}), 0x920A: ('FocalLength', ), 0x9214: ('SubjectArea', ), 0x927C: ('MakerNote', ), 0x9286: ('UserComment', make_string_uc), 0x9290: ('SubSecTime', ), 0x9291: ('SubSecTimeOriginal', ), 0x9292: ('SubSecTimeDigitized', ), # used by Windows Explorer 0x9C9B: ('XPTitle', ), 0x9C9C: ('XPComment', ), 0x9C9D: ('XPAuthor', ), #(ignored by Windows Explorer if Artist exists) 0x9C9E: ('XPKeywords', ), 0x9C9F: ('XPSubject', ), 0xA000: ('FlashPixVersion', make_string), 0xA001: ('ColorSpace', {1: 'sRGB', 2: 'Adobe RGB', 65535: 'Uncalibrated'}), 0xA002: ('ExifImageWidth', ), 0xA003: ('ExifImageLength', ), 0xA005: ('InteroperabilityOffset', ), 0xA20B: ('FlashEnergy', ), # 0x920B in TIFF/EP 0xA20C: ('SpatialFrequencyResponse', ), # 0x920C 0xA20E: ('FocalPlaneXResolution', ), # 0x920E 0xA20F: ('FocalPlaneYResolution', ), # 0x920F 0xA210: ('FocalPlaneResolutionUnit', ), # 0x9210 0xA214: ('SubjectLocation', ), # 0x9214 0xA215: ('ExposureIndex', ), # 0x9215 0xA217: ('SensingMethod', # 0x9217 {1: 'Not defined', 2: 'One-chip color area', 3: 'Two-chip color area', 4: 'Three-chip color area', 5: 'Color sequential area', 7: 'Trilinear', 8: 'Color sequential linear'}), 0xA300: ('FileSource', {1: 'Film Scanner', 2: 'Reflection Print Scanner', 3: 'Digital Camera'}), 0xA301: ('SceneType', {1: 'Directly Photographed'}), 0xA302: ('CVAPattern', ), 0xA401: ('CustomRendered', {0: 'Normal', 1: 'Custom'}), 0xA402: ('ExposureMode', {0: 'Auto Exposure', 1: 'Manual Exposure', 2: 'Auto Bracket'}), 0xA403: ('WhiteBalance', {0: 'Auto', 1: 'Manual'}), 0xA404: ('DigitalZoomRatio', ), 0xA405: ('FocalLengthIn35mmFilm', ), 0xA406: ('SceneCaptureType', {0: 'Standard', 1: 'Landscape', 2: 'Portrait', 3: 'Night)'}), 0xA407: ('GainControl', {0: 'None', 1: 'Low gain up', 2: 'High gain up', 3: 'Low gain down', 4: 'High gain down'}), 0xA408: ('Contrast', {0: 'Normal', 1: 'Soft', 2: 'Hard'}), 0xA409: ('Saturation', {0: 'Normal', 1: 'Soft', 2: 'Hard'}), 0xA40A: ('Sharpness', {0: 'Normal', 1: 'Soft', 2: 'Hard'}), 0xA40B: ('DeviceSettingDescription', ), 0xA40C: ('SubjectDistanceRange', ), 0xA500: ('Gamma', ), 0xC4A5: ('PrintIM', ), 0xEA1C: ('Padding', ), } # interoperability tags INTR_TAGS = { 0x0001: ('InteroperabilityIndex', ), 0x0002: ('InteroperabilityVersion', ), 0x1000: ('RelatedImageFileFormat', ), 0x1001: ('RelatedImageWidth', ), 0x1002: ('RelatedImageLength', ), } # GPS tags (not used yet, haven't seen camera with GPS) GPS_TAGS = { 0x0000: ('GPSVersionID', ), 0x0001: ('GPSLatitudeRef', ), 0x0002: ('GPSLatitude', ), 0x0003: ('GPSLongitudeRef', ), 0x0004: ('GPSLongitude', ), 0x0005: ('GPSAltitudeRef', ), 0x0006: ('GPSAltitude', ), 0x0007: ('GPSTimeStamp', ), 0x0008: ('GPSSatellites', ), 0x0009: ('GPSStatus', ), 0x000A: ('GPSMeasureMode', ), 0x000B: ('GPSDOP', ), 0x000C: ('GPSSpeedRef', ), 0x000D: ('GPSSpeed', ), 0x000E: ('GPSTrackRef', ), 0x000F: ('GPSTrack', ), 0x0010: ('GPSImgDirectionRef', ), 0x0011: ('GPSImgDirection', ), 0x0012: ('GPSMapDatum', ), 0x0013: ('GPSDestLatitudeRef', ), 0x0014: ('GPSDestLatitude', ), 0x0015: ('GPSDestLongitudeRef', ), 0x0016: ('GPSDestLongitude', ), 0x0017: ('GPSDestBearingRef', ), 0x0018: ('GPSDestBearing', ), 0x0019: ('GPSDestDistanceRef', ), 0x001A: ('GPSDestDistance', ), 0x001D: ('GPSDate', ), } # Ignore these tags when quick processing # 0x927C is MakerNote Tags # 0x9286 is user comment IGNORE_TAGS=(0x9286, 0x927C) # http://tomtia.plala.jp/DigitalCamera/MakerNote/index.asp def nikon_ev_bias(seq): # First digit seems to be in steps of 1/6 EV. # Does the third value mean the step size? It is usually 6, # but it is 12 for the ExposureDifference. # # Check for an error condition that could cause a crash. # This only happens if something has gone really wrong in # reading the Nikon MakerNote. if len( seq ) < 4 : return "" # if seq == [252, 1, 6, 0]: return "-2/3 EV" if seq == [253, 1, 6, 0]: return "-1/2 EV" if seq == [254, 1, 6, 0]: return "-1/3 EV" if seq == [0, 1, 6, 0]: return "0 EV" if seq == [2, 1, 6, 0]: return "+1/3 EV" if seq == [3, 1, 6, 0]: return "+1/2 EV" if seq == [4, 1, 6, 0]: return "+2/3 EV" # Handle combinations not in the table. a = seq[0] # Causes headaches for the +/- logic, so special case it. if a == 0: return "0 EV" if a > 127: a = 256 - a ret_str = "-" else: ret_str = "+" b = seq[2] # Assume third value means the step size whole = a / b a = a % b if whole != 0: ret_str = ret_str + str(whole) + " " if a == 0: ret_str = ret_str + "EV" else: r = Ratio(a, b) ret_str = ret_str + r.__repr__() + " EV" return ret_str # Nikon E99x MakerNote Tags MAKERNOTE_NIKON_NEWER_TAGS={ 0x0001: ('MakernoteVersion', make_string), # Sometimes binary 0x0002: ('ISOSetting', make_string), 0x0003: ('ColorMode', ), 0x0004: ('Quality', ), 0x0005: ('Whitebalance', ), 0x0006: ('ImageSharpening', ), 0x0007: ('FocusMode', ), 0x0008: ('FlashSetting', ), 0x0009: ('AutoFlashMode', ), 0x000B: ('WhiteBalanceBias', ), 0x000C: ('WhiteBalanceRBCoeff', ), 0x000D: ('ProgramShift', nikon_ev_bias), # Nearly the same as the other EV vals, but step size is 1/12 EV (?) 0x000E: ('ExposureDifference', nikon_ev_bias), 0x000F: ('ISOSelection', ), 0x0011: ('NikonPreview', ), 0x0012: ('FlashCompensation', nikon_ev_bias), 0x0013: ('ISOSpeedRequested', ), 0x0016: ('PhotoCornerCoordinates', ), # 0x0017: Unknown, but most likely an EV value 0x0018: ('FlashBracketCompensationApplied', nikon_ev_bias), 0x0019: ('AEBracketCompensationApplied', ), 0x001A: ('ImageProcessing', ), 0x001B: ('CropHiSpeed', ), 0x001D: ('SerialNumber', ), # Conflict with 0x00A0 ? 0x001E: ('ColorSpace', ), 0x001F: ('VRInfo', ), 0x0020: ('ImageAuthentication', ), 0x0022: ('ActiveDLighting', ), 0x0023: ('PictureControl', ), 0x0024: ('WorldTime', ), 0x0025: ('ISOInfo', ), 0x0080: ('ImageAdjustment', ), 0x0081: ('ToneCompensation', ), 0x0082: ('AuxiliaryLens', ), 0x0083: ('LensType', ), 0x0084: ('LensMinMaxFocalMaxAperture', ), 0x0085: ('ManualFocusDistance', ), 0x0086: ('DigitalZoomFactor', ), 0x0087: ('FlashMode', {0x00: 'Did Not Fire', 0x01: 'Fired, Manual', 0x07: 'Fired, External', 0x08: 'Fired, Commander Mode ', 0x09: 'Fired, TTL Mode'}), 0x0088: ('AFFocusPosition', {0x0000: 'Center', 0x0100: 'Top', 0x0200: 'Bottom', 0x0300: 'Left', 0x0400: 'Right'}), 0x0089: ('BracketingMode', {0x00: 'Single frame, no bracketing', 0x01: 'Continuous, no bracketing', 0x02: 'Timer, no bracketing', 0x10: 'Single frame, exposure bracketing', 0x11: 'Continuous, exposure bracketing', 0x12: 'Timer, exposure bracketing', 0x40: 'Single frame, white balance bracketing', 0x41: 'Continuous, white balance bracketing', 0x42: 'Timer, white balance bracketing'}), 0x008A: ('AutoBracketRelease', ), 0x008B: ('LensFStops', ), 0x008C: ('NEFCurve1', ), # ExifTool calls this 'ContrastCurve' 0x008D: ('ColorMode', ), 0x008F: ('SceneMode', ), 0x0090: ('LightingType', ), 0x0091: ('ShotInfo', ), # First 4 bytes are a version number in ASCII 0x0092: ('HueAdjustment', ), # ExifTool calls this 'NEFCompression', should be 1-4 0x0093: ('Compression', ), 0x0094: ('Saturation', {-3: 'B&W', -2: '-2', -1: '-1', 0: '0', 1: '1', 2: '2'}), 0x0095: ('NoiseReduction', ), 0x0096: ('NEFCurve2', ), # ExifTool calls this 'LinearizationTable' 0x0097: ('ColorBalance', ), # First 4 bytes are a version number in ASCII 0x0098: ('LensData', ), # First 4 bytes are a version number in ASCII 0x0099: ('RawImageCenter', ), 0x009A: ('SensorPixelSize', ), 0x009C: ('Scene Assist', ), 0x009E: ('RetouchHistory', ), 0x00A0: ('SerialNumber', ), 0x00A2: ('ImageDataSize', ), # 00A3: unknown - a single byte 0 # 00A4: In NEF, looks like a 4 byte ASCII version number ('0200') 0x00A5: ('ImageCount', ), 0x00A6: ('DeletedImageCount', ), 0x00A7: ('TotalShutterReleases', ), # First 4 bytes are a version number in ASCII, with version specific # info to follow. Its hard to treat it as a string due to embedded nulls. 0x00A8: ('FlashInfo', ), 0x00A9: ('ImageOptimization', ), 0x00AA: ('Saturation', ), 0x00AB: ('DigitalVariProgram', ), 0x00AC: ('ImageStabilization', ), 0x00AD: ('Responsive AF', ), # 'AFResponse' 0x00B0: ('MultiExposure', ), 0x00B1: ('HighISONoiseReduction', ), 0x00B7: ('AFInfo', ), 0x00B8: ('FileInfo', ), # 00B9: unknown 0x0100: ('DigitalICE', ), 0x0103: ('PreviewCompression', {1: 'Uncompressed', 2: 'CCITT 1D', 3: 'T4/Group 3 Fax', 4: 'T6/Group 4 Fax', 5: 'LZW', 6: 'JPEG (old-style)', 7: 'JPEG', 8: 'Adobe Deflate', 9: 'JBIG B&W', 10: 'JBIG Color', 32766: 'Next', 32769: 'Epson ERF Compressed', 32771: 'CCIRLEW', 32773: 'PackBits', 32809: 'Thunderscan', 32895: 'IT8CTPAD', 32896: 'IT8LW', 32897: 'IT8MP', 32898: 'IT8BL', 32908: 'PixarFilm', 32909: 'PixarLog', 32946: 'Deflate', 32947: 'DCS', 34661: 'JBIG', 34676: 'SGILog', 34677: 'SGILog24', 34712: 'JPEG 2000', 34713: 'Nikon NEF Compressed', 65000: 'Kodak DCR Compressed', 65535: 'Pentax PEF Compressed',}), 0x0201: ('PreviewImageStart', ), 0x0202: ('PreviewImageLength', ), 0x0213: ('PreviewYCbCrPositioning', {1: 'Centered', 2: 'Co-sited'}), 0x0010: ('DataDump', ), } MAKERNOTE_NIKON_OLDER_TAGS = { 0x0003: ('Quality', {1: 'VGA Basic', 2: 'VGA Normal', 3: 'VGA Fine', 4: 'SXGA Basic', 5: 'SXGA Normal', 6: 'SXGA Fine'}), 0x0004: ('ColorMode', {1: 'Color', 2: 'Monochrome'}), 0x0005: ('ImageAdjustment', {0: 'Normal', 1: 'Bright+', 2: 'Bright-', 3: 'Contrast+', 4: 'Contrast-'}), 0x0006: ('CCDSpeed', {0: 'ISO 80', 2: 'ISO 160', 4: 'ISO 320', 5: 'ISO 100'}), 0x0007: ('WhiteBalance', {0: 'Auto', 1: 'Preset', 2: 'Daylight', 3: 'Incandescent', 4: 'Fluorescent', 5: 'Cloudy', 6: 'Speed Light'}), } # decode Olympus SpecialMode tag in MakerNote def olympus_special_mode(v): a={ 0: 'Normal', 1: 'Unknown', 2: 'Fast', 3: 'Panorama'} b={ 0: 'Non-panoramic', 1: 'Left to right', 2: 'Right to left', 3: 'Bottom to top', 4: 'Top to bottom'} if v[0] not in a or v[2] not in b: return v return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]]) MAKERNOTE_OLYMPUS_TAGS={ # ah HAH! those sneeeeeaky bastids! this is how they get past the fact # that a JPEG thumbnail is not allowed in an uncompressed TIFF file 0x0100: ('JPEGThumbnail', ), 0x0200: ('SpecialMode', olympus_special_mode), 0x0201: ('JPEGQual', {1: 'SQ', 2: 'HQ', 3: 'SHQ'}), 0x0202: ('Macro', {0: 'Normal', 1: 'Macro', 2: 'SuperMacro'}), 0x0203: ('BWMode', {0: 'Off', 1: 'On'}), 0x0204: ('DigitalZoom', ), 0x0205: ('FocalPlaneDiagonal', ), 0x0206: ('LensDistortionParams', ), 0x0207: ('SoftwareRelease', ), 0x0208: ('PictureInfo', ), 0x0209: ('CameraID', make_string), # print as string 0x0F00: ('DataDump', ), 0x0300: ('PreCaptureFrames', ), 0x0404: ('SerialNumber', ), 0x1000: ('ShutterSpeedValue', ), 0x1001: ('ISOValue', ), 0x1002: ('ApertureValue', ), 0x1003: ('BrightnessValue', ), 0x1004: ('FlashMode', ), 0x1004: ('FlashMode', {2: 'On', 3: 'Off'}), 0x1005: ('FlashDevice', {0: 'None', 1: 'Internal', 4: 'External', 5: 'Internal + External'}), 0x1006: ('ExposureCompensation', ), 0x1007: ('SensorTemperature', ), 0x1008: ('LensTemperature', ), 0x100b: ('FocusMode', {0: 'Auto', 1: 'Manual'}), 0x1017: ('RedBalance', ), 0x1018: ('BlueBalance', ), 0x101a: ('SerialNumber', ), 0x1023: ('FlashExposureComp', ), 0x1026: ('ExternalFlashBounce', {0: 'No', 1: 'Yes'}), 0x1027: ('ExternalFlashZoom', ), 0x1028: ('ExternalFlashMode', ), 0x1029: ('Contrast int16u', {0: 'High', 1: 'Normal', 2: 'Low'}), 0x102a: ('SharpnessFactor', ), 0x102b: ('ColorControl', ), 0x102c: ('ValidBits', ), 0x102d: ('CoringFilter', ), 0x102e: ('OlympusImageWidth', ), 0x102f: ('OlympusImageHeight', ), 0x1034: ('CompressionRatio', ), 0x1035: ('PreviewImageValid', {0: 'No', 1: 'Yes'}), 0x1036: ('PreviewImageStart', ), 0x1037: ('PreviewImageLength', ), 0x1039: ('CCDScanMode', {0: 'Interlaced', 1: 'Progressive'}), 0x103a: ('NoiseReduction', {0: 'Off', 1: 'On'}), 0x103b: ('InfinityLensStep', ), 0x103c: ('NearLensStep', ), # TODO - these need extra definitions # http://search.cpan.org/src/EXIFTOOL/Image-ExifTool-6.90/html/TagNames/Olympus.html 0x2010: ('Equipment', ), 0x2020: ('CameraSettings', ), 0x2030: ('RawDevelopment', ), 0x2040: ('ImageProcessing', ), 0x2050: ('FocusInfo', ), 0x3000: ('RawInfo ', ), } # 0x2020 CameraSettings MAKERNOTE_OLYMPUS_TAG_0x2020={ 0x0100: ('PreviewImageValid', {0: 'No', 1: 'Yes'}), 0x0101: ('PreviewImageStart', ), 0x0102: ('PreviewImageLength', ), 0x0200: ('ExposureMode', {1: 'Manual', 2: 'Program', 3: 'Aperture-priority AE', 4: 'Shutter speed priority AE', 5: 'Program-shift'}), 0x0201: ('AELock', {0: 'Off', 1: 'On'}), 0x0202: ('MeteringMode', {2: 'Center Weighted', 3: 'Spot', 5: 'ESP', 261: 'Pattern+AF', 515: 'Spot+Highlight control', 1027: 'Spot+Shadow control'}), 0x0300: ('MacroMode', {0: 'Off', 1: 'On'}), 0x0301: ('FocusMode', {0: 'Single AF', 1: 'Sequential shooting AF', 2: 'Continuous AF', 3: 'Multi AF', 10: 'MF'}), 0x0302: ('FocusProcess', {0: 'AF Not Used', 1: 'AF Used'}), 0x0303: ('AFSearch', {0: 'Not Ready', 1: 'Ready'}), 0x0304: ('AFAreas', ), 0x0401: ('FlashExposureCompensation', ), 0x0500: ('WhiteBalance2', {0: 'Auto', 16: '7500K (Fine Weather with Shade)', 17: '6000K (Cloudy)', 18: '5300K (Fine Weather)', 20: '3000K (Tungsten light)', 21: '3600K (Tungsten light-like)', 33: '6600K (Daylight fluorescent)', 34: '4500K (Neutral white fluorescent)', 35: '4000K (Cool white fluorescent)', 48: '3600K (Tungsten light-like)', 256: 'Custom WB 1', 257: 'Custom WB 2', 258: 'Custom WB 3', 259: 'Custom WB 4', 512: 'Custom WB 5400K', 513: 'Custom WB 2900K', 514: 'Custom WB 8000K', }), 0x0501: ('WhiteBalanceTemperature', ), 0x0502: ('WhiteBalanceBracket', ), 0x0503: ('CustomSaturation', ), # (3 numbers: 1. CS Value, 2. Min, 3. Max) 0x0504: ('ModifiedSaturation', {0: 'Off', 1: 'CM1 (Red Enhance)', 2: 'CM2 (Green Enhance)', 3: 'CM3 (Blue Enhance)', 4: 'CM4 (Skin Tones)'}), 0x0505: ('ContrastSetting', ), # (3 numbers: 1. Contrast, 2. Min, 3. Max) 0x0506: ('SharpnessSetting', ), # (3 numbers: 1. Sharpness, 2. Min, 3. Max) 0x0507: ('ColorSpace', {0: 'sRGB', 1: 'Adobe RGB', 2: 'Pro Photo RGB'}), 0x0509: ('SceneMode', {0: 'Standard', 6: 'Auto', 7: 'Sport', 8: 'Portrait', 9: 'Landscape+Portrait', 10: 'Landscape', 11: 'Night scene', 13: 'Panorama', 16: 'Landscape+Portrait', 17: 'Night+Portrait', 19: 'Fireworks', 20: 'Sunset', 22: 'Macro', 25: 'Documents', 26: 'Museum', 28: 'Beach&Snow', 30: 'Candle', 35: 'Underwater Wide1', 36: 'Underwater Macro', 39: 'High Key', 40: 'Digital Image Stabilization', 44: 'Underwater Wide2', 45: 'Low Key', 46: 'Children', 48: 'Nature Macro'}), 0x050a: ('NoiseReduction', {0: 'Off', 1: 'Noise Reduction', 2: 'Noise Filter', 3: 'Noise Reduction + Noise Filter', 4: 'Noise Filter (ISO Boost)', 5: 'Noise Reduction + Noise Filter (ISO Boost)'}), 0x050b: ('DistortionCorrection', {0: 'Off', 1: 'On'}), 0x050c: ('ShadingCompensation', {0: 'Off', 1: 'On'}), 0x050d: ('CompressionFactor', ), 0x050f: ('Gradation', {'-1 -1 1': 'Low Key', '0 -1 1': 'Normal', '1 -1 1': 'High Key'}), 0x0520: ('PictureMode', {1: 'Vivid', 2: 'Natural', 3: 'Muted', 256: 'Monotone', 512: 'Sepia'}), 0x0521: ('PictureModeSaturation', ), 0x0522: ('PictureModeHue?', ), 0x0523: ('PictureModeContrast', ), 0x0524: ('PictureModeSharpness', ), 0x0525: ('PictureModeBWFilter', {0: 'n/a', 1: 'Neutral', 2: 'Yellow', 3: 'Orange', 4: 'Red', 5: 'Green'}), 0x0526: ('PictureModeTone', {0: 'n/a', 1: 'Neutral', 2: 'Sepia', 3: 'Blue', 4: 'Purple', 5: 'Green'}), 0x0600: ('Sequence', ), # 2 or 3 numbers: 1. Mode, 2. Shot number, 3. Mode bits 0x0601: ('PanoramaMode', ), # (2 numbers: 1. Mode, 2. Shot number) 0x0603: ('ImageQuality2', {1: 'SQ', 2: 'HQ', 3: 'SHQ', 4: 'RAW'}), 0x0901: ('ManometerReading', ), } MAKERNOTE_CASIO_TAGS={ 0x0001: ('RecordingMode', {1: 'Single Shutter', 2: 'Panorama', 3: 'Night Scene', 4: 'Portrait', 5: 'Landscape'}), 0x0002: ('Quality', {1: 'Economy', 2: 'Normal', 3: 'Fine'}), 0x0003: ('FocusingMode', {2: 'Macro', 3: 'Auto Focus', 4: 'Manual Focus', 5: 'Infinity'}), 0x0004: ('FlashMode', {1: 'Auto', 2: 'On', 3: 'Off', 4: 'Red Eye Reduction'}), 0x0005: ('FlashIntensity', {11: 'Weak', 13: 'Normal', 15: 'Strong'}), 0x0006: ('Object Distance', ), 0x0007: ('WhiteBalance', {1: 'Auto', 2: 'Tungsten', 3: 'Daylight', 4: 'Fluorescent', 5: 'Shade', 129: 'Manual'}), 0x000B: ('Sharpness', {0: 'Normal', 1: 'Soft', 2: 'Hard'}), 0x000C: ('Contrast', {0: 'Normal', 1: 'Low', 2: 'High'}), 0x000D: ('Saturation', {0: 'Normal', 1: 'Low', 2: 'High'}), 0x0014: ('CCDSpeed', {64: 'Normal', 80: 'Normal', 100: 'High', 125: '+1.0', 244: '+3.0', 250: '+2.0'}), } MAKERNOTE_FUJIFILM_TAGS={ 0x0000: ('NoteVersion', make_string), 0x1000: ('Quality', ), 0x1001: ('Sharpness', {1: 'Soft', 2: 'Soft', 3: 'Normal', 4: 'Hard', 5: 'Hard'}), 0x1002: ('WhiteBalance', {0: 'Auto', 256: 'Daylight', 512: 'Cloudy', 768: 'DaylightColor-Fluorescent', 769: 'DaywhiteColor-Fluorescent', 770: 'White-Fluorescent', 1024: 'Incandescent', 3840: 'Custom'}), 0x1003: ('Color', {0: 'Normal', 256: 'High', 512: 'Low'}), 0x1004: ('Tone', {0: 'Normal', 256: 'High', 512: 'Low'}), 0x1010: ('FlashMode', {0: 'Auto', 1: 'On', 2: 'Off', 3: 'Red Eye Reduction'}), 0x1011: ('FlashStrength', ), 0x1020: ('Macro', {0: 'Off', 1: 'On'}), 0x1021: ('FocusMode', {0: 'Auto', 1: 'Manual'}), 0x1030: ('SlowSync', {0: 'Off', 1: 'On'}), 0x1031: ('PictureMode', {0: 'Auto', 1: 'Portrait', 2: 'Landscape', 4: 'Sports', 5: 'Night', 6: 'Program AE', 256: 'Aperture Priority AE', 512: 'Shutter Priority AE', 768: 'Manual Exposure'}), 0x1100: ('MotorOrBracket', {0: 'Off', 1: 'On'}), 0x1300: ('BlurWarning', {0: 'Off', 1: 'On'}), 0x1301: ('FocusWarning', {0: 'Off', 1: 'On'}), 0x1302: ('AEWarning', {0: 'Off', 1: 'On'}), } MAKERNOTE_CANON_TAGS = { 0x0006: ('ImageType', ), 0x0007: ('FirmwareVersion', ), 0x0008: ('ImageNumber', ), 0x0009: ('OwnerName', ), } # this is in element offset, name, optional value dictionary format MAKERNOTE_CANON_TAG_0x001 = { 1: ('Macromode', {1: 'Macro', 2: 'Normal'}), 2: ('SelfTimer', ), 3: ('Quality', {2: 'Normal', 3: 'Fine', 5: 'Superfine'}), 4: ('FlashMode', {0: 'Flash Not Fired', 1: 'Auto', 2: 'On', 3: 'Red-Eye Reduction', 4: 'Slow Synchro', 5: 'Auto + Red-Eye Reduction', 6: 'On + Red-Eye Reduction', 16: 'external flash'}), 5: ('ContinuousDriveMode', {0: 'Single Or Timer', 1: 'Continuous'}), 7: ('FocusMode', {0: 'One-Shot', 1: 'AI Servo', 2: 'AI Focus', 3: 'MF', 4: 'Single', 5: 'Continuous', 6: 'MF'}), 10: ('ImageSize', {0: 'Large', 1: 'Medium', 2: 'Small'}), 11: ('EasyShootingMode', {0: 'Full Auto', 1: 'Manual', 2: 'Landscape', 3: 'Fast Shutter', 4: 'Slow Shutter', 5: 'Night', 6: 'B&W', 7: 'Sepia', 8: 'Portrait', 9: 'Sports', 10: 'Macro/Close-Up', 11: 'Pan Focus'}), 12: ('DigitalZoom', {0: 'None', 1: '2x', 2: '4x'}), 13: ('Contrast', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 14: ('Saturation', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 15: ('Sharpness', {0xFFFF: 'Low', 0: 'Normal', 1: 'High'}), 16: ('ISO', {0: 'See ISOSpeedRatings Tag', 15: 'Auto', 16: '50', 17: '100', 18: '200', 19: '400'}), 17: ('MeteringMode', {3: 'Evaluative', 4: 'Partial', 5: 'Center-weighted'}), 18: ('FocusType', {0: 'Manual', 1: 'Auto', 3: 'Close-Up (Macro)', 8: 'Locked (Pan Mode)'}), 19: ('AFPointSelected', {0x3000: 'None (MF)', 0x3001: 'Auto-Selected', 0x3002: 'Right', 0x3003: 'Center', 0x3004: 'Left'}), 20: ('ExposureMode', {0: 'Easy Shooting', 1: 'Program', 2: 'Tv-priority', 3: 'Av-priority', 4: 'Manual', 5: 'A-DEP'}), 23: ('LongFocalLengthOfLensInFocalUnits', ), 24: ('ShortFocalLengthOfLensInFocalUnits', ), 25: ('FocalUnitsPerMM', ), 28: ('FlashActivity', {0: 'Did Not Fire', 1: 'Fired'}), 29: ('FlashDetails', {14: 'External E-TTL', 13: 'Internal Flash', 11: 'FP Sync Used', 7: '2nd("Rear")-Curtain Sync Used', 4: 'FP Sync Enabled'}), 32: ('FocusMode', {0: 'Single', 1: 'Continuous'}), } MAKERNOTE_CANON_TAG_0x004 = { 7: ('WhiteBalance', {0: 'Auto', 1: 'Sunny', 2: 'Cloudy', 3: 'Tungsten', 4: 'Fluorescent', 5: 'Flash', 6: 'Custom'}), 9: ('SequenceNumber', ), 14: ('AFPointUsed', ), 15: ('FlashBias', {0xFFC0: '-2 EV', 0xFFCC: '-1.67 EV', 0xFFD0: '-1.50 EV', 0xFFD4: '-1.33 EV', 0xFFE0: '-1 EV', 0xFFEC: '-0.67 EV', 0xFFF0: '-0.50 EV', 0xFFF4: '-0.33 EV', 0x0000: '0 EV', 0x000C: '0.33 EV', 0x0010: '0.50 EV', 0x0014: '0.67 EV', 0x0020: '1 EV', 0x002C: '1.33 EV', 0x0030: '1.50 EV', 0x0034: '1.67 EV', 0x0040: '2 EV'}), 19: ('SubjectDistance', ), } # extract multibyte integer in Motorola format (little endian) def s2n_motorola(str): x = 0 for c in str: x = (x << 8) | ord(c) return x # extract multibyte integer in Intel format (big endian) def s2n_intel(str): x = 0 y = 0L for c in str: x = x | (ord(c) << y) y = y + 8 return x # ratio object that eventually will be able to reduce itself to lowest # common denominator for printing def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) class Ratio: def __init__(self, num, den): self.num = num self.den = den def __repr__(self): self.reduce() if self.den == 1: return str(self.num) return '%d/%d' % (self.num, self.den) def reduce(self): div = gcd(self.num, self.den) if div > 1: self.num = self.num / div self.den = self.den / div # for ease of dealing with tags class IFD_Tag: def __init__(self, printable, tag, field_type, values, field_offset, field_length): # printable version of data self.printable = printable # tag ID number self.tag = tag # field type as index into FIELD_TYPES self.field_type = field_type # offset of start of field in bytes from beginning of IFD self.field_offset = field_offset # length of data field in bytes self.field_length = field_length # either a string or array of data items self.values = values def __str__(self): return self.printable def __repr__(self): return '(0x%04X) %s=%s @ %d' % (self.tag, FIELD_TYPES[self.field_type][2], self.printable, self.field_offset) # class that handles an EXIF header class EXIF_header: def __init__(self, file, endian, offset, fake_exif, strict, debug=0): self.file = file self.endian = endian self.offset = offset self.fake_exif = fake_exif self.strict = strict self.debug = debug self.tags = {} # convert slice to integer, based on sign and endian flags # usually this offset is assumed to be relative to the beginning of the # start of the EXIF information. For some cameras that use relative tags, # this offset may be relative to some other starting point. def s2n(self, offset, length, signed=0): self.file.seek(self.offset+offset) slice=self.file.read(length) if self.endian == 'I': val=s2n_intel(slice) else: val=s2n_motorola(slice) # Sign extension ? if signed: msb=1L << (8*length-1) if val & msb: val=val-(msb << 1) return val # convert offset to string def n2s(self, offset, length): s = '' for dummy in range(length): if self.endian == 'I': s = s + chr(offset & 0xFF) else: s = chr(offset & 0xFF) + s offset = offset >> 8 return s # return first IFD def first_IFD(self): return self.s2n(4, 4) # return pointer to next IFD def next_IFD(self, ifd): entries=self.s2n(ifd, 2) return self.s2n(ifd+2+12*entries, 4) # return list of IFDs in header def list_IFDs(self): i=self.first_IFD() a=[] while i: a.append(i) i=self.next_IFD(i) return a # return list of entries in this IFD def dump_IFD(self, ifd, ifd_name, dict=EXIF_TAGS, relative=0, stop_tag='UNDEF'): entries=self.s2n(ifd, 2) for i in range(entries): # entry is index of start of this IFD in the file entry = ifd + 2 + 12 * i tag = self.s2n(entry, 2) # get tag name early to avoid errors, help debug tag_entry = dict.get(tag) if tag_entry: tag_name = tag_entry[0] else: tag_name = 'Tag 0x%04X' % tag # ignore certain tags for faster processing if not (not detailed and tag in IGNORE_TAGS): field_type = self.s2n(entry + 2, 2) # unknown field type if not 0 < field_type < len(FIELD_TYPES): if not self.strict: continue else: raise ValueError('unknown type %d in tag 0x%04X' % (field_type, tag)) typelen = FIELD_TYPES[field_type][0] count = self.s2n(entry + 4, 4) # Adjust for tag id/type/count (2+2+4 bytes) # Now we point at either the data or the 2nd level offset offset = entry + 8 # If the value fits in 4 bytes, it is inlined, else we # need to jump ahead again. if count * typelen > 4: # offset is not the value; it's a pointer to the value # if relative we set things up so s2n will seek to the right # place when it adds self.offset. Note that this 'relative' # is for the Nikon type 3 makernote. Other cameras may use # other relative offsets, which would have to be computed here # slightly differently. if relative: tmp_offset = self.s2n(offset, 4) offset = tmp_offset + ifd - 8 if self.fake_exif: offset = offset + 18 else: offset = self.s2n(offset, 4) field_offset = offset if field_type == 2: # special case: null-terminated ASCII string # XXX investigate # sometimes gets too big to fit in int value if count != 0 and count < (2**31): self.file.seek(self.offset + offset) values = self.file.read(count) #print values # Drop any garbage after a null. values = values.split('\x00', 1)[0] else: values = '' else: values = [] signed = (field_type in [6, 8, 9, 10]) # XXX investigate # some entries get too big to handle could be malformed # file or problem with self.s2n if count < 1000: for dummy in range(count): if field_type in (5, 10): # a ratio value = Ratio(self.s2n(offset, 4, signed), self.s2n(offset + 4, 4, signed)) else: value = self.s2n(offset, typelen, signed) values.append(value) offset = offset + typelen # The test above causes problems with tags that are # supposed to have long values! Fix up one important case. elif tag_name == 'MakerNote' : for dummy in range(count): value = self.s2n(offset, typelen, signed) values.append(value) offset = offset + typelen #else : # print "Warning: dropping large tag:", tag, tag_name # now 'values' is either a string or an array if count == 1 and field_type != 2: printable=str(values[0]) elif count > 50 and len(values) > 20 : printable=str( values[0:20] )[0:-1] + ", ... ]" else: printable=str(values) # compute printable version of values if tag_entry: if len(tag_entry) != 1: # optional 2nd tag element is present if callable(tag_entry[1]): # call mapping function printable = tag_entry[1](values) else: printable = '' for i in values: # use lookup table for this tag printable += tag_entry[1].get(i, repr(i)) self.tags[ifd_name + ' ' + tag_name] = IFD_Tag(printable, tag, field_type, values, field_offset, count * typelen) if self.debug: print ' debug: %s: %s' % (tag_name, repr(self.tags[ifd_name + ' ' + tag_name])) if tag_name == stop_tag: break # extract uncompressed TIFF thumbnail (like pulling teeth) # we take advantage of the pre-existing layout in the thumbnail IFD as # much as possible def extract_TIFF_thumbnail(self, thumb_ifd): entries = self.s2n(thumb_ifd, 2) # this is header plus offset to IFD ... if self.endian == 'M': tiff = 'MM\x00*\x00\x00\x00\x08' else: tiff = 'II*\x00\x08\x00\x00\x00' # ... plus thumbnail IFD data plus a null "next IFD" pointer self.file.seek(self.offset+thumb_ifd) tiff += self.file.read(entries*12+2)+'\x00\x00\x00\x00' # fix up large value offset pointers into data area for i in range(entries): entry = thumb_ifd + 2 + 12 * i tag = self.s2n(entry, 2) field_type = self.s2n(entry+2, 2) typelen = FIELD_TYPES[field_type][0] count = self.s2n(entry+4, 4) oldoff = self.s2n(entry+8, 4) # start of the 4-byte pointer area in entry ptr = i * 12 + 18 # remember strip offsets location if tag == 0x0111: strip_off = ptr strip_len = count * typelen # is it in the data area? if count * typelen > 4: # update offset pointer (nasty "strings are immutable" crap) # should be able to say "tiff[ptr:ptr+4]=newoff" newoff = len(tiff) tiff = tiff[:ptr] + self.n2s(newoff, 4) + tiff[ptr+4:] # remember strip offsets location if tag == 0x0111: strip_off = newoff strip_len = 4 # get original data and store it self.file.seek(self.offset + oldoff) tiff += self.file.read(count * typelen) # add pixel strips and update strip offset info old_offsets = self.tags['Thumbnail StripOffsets'].values old_counts = self.tags['Thumbnail StripByteCounts'].values for i in range(len(old_offsets)): # update offset pointer (more nasty "strings are immutable" crap) offset = self.n2s(len(tiff), strip_len) tiff = tiff[:strip_off] + offset + tiff[strip_off + strip_len:] strip_off += strip_len # add pixel strip to end self.file.seek(self.offset + old_offsets[i]) tiff += self.file.read(old_counts[i]) self.tags['TIFFThumbnail'] = tiff # decode all the camera-specific MakerNote formats # Note is the data that comprises this MakerNote. The MakerNote will # likely have pointers in it that point to other parts of the file. We'll # use self.offset as the starting point for most of those pointers, since # they are relative to the beginning of the file. # # If the MakerNote is in a newer format, it may use relative addressing # within the MakerNote. In that case we'll use relative addresses for the # pointers. # # As an aside: it's not just to be annoying that the manufacturers use # relative offsets. It's so that if the makernote has to be moved by the # picture software all of the offsets don't have to be adjusted. Overall, # this is probably the right strategy for makernotes, though the spec is # ambiguous. (The spec does not appear to imagine that makernotes would # follow EXIF format internally. Once they did, it's ambiguous whether # the offsets should be from the header at the start of all the EXIF info, # or from the header at the start of the makernote.) def decode_maker_note(self): note = self.tags['EXIF MakerNote'] # Some apps use MakerNote tags but do not use a format for which we # have a description, so just do a raw dump for these. #if self.tags.has_key('Image Make'): make = self.tags['Image Make'].printable #else: # make = '' # model = self.tags['Image Model'].printable # unused # Nikon # The maker note usually starts with the word Nikon, followed by the # type of the makernote (1 or 2, as a short). If the word Nikon is # not at the start of the makernote, it's probably type 2, since some # cameras work that way. if 'NIKON' in make: if note.values[0:7] == [78, 105, 107, 111, 110, 0, 1]: if self.debug: print "Looks like a type 1 Nikon MakerNote." self.dump_IFD(note.field_offset+8, 'MakerNote', dict=MAKERNOTE_NIKON_OLDER_TAGS) elif note.values[0:7] == [78, 105, 107, 111, 110, 0, 2]: if self.debug: print "Looks like a labeled type 2 Nikon MakerNote" if note.values[12:14] != [0, 42] and note.values[12:14] != [42L, 0L]: raise ValueError("Missing marker tag '42' in MakerNote.") # skip the Makernote label and the TIFF header self.dump_IFD(note.field_offset+10+8, 'MakerNote', dict=MAKERNOTE_NIKON_NEWER_TAGS, relative=1) else: # E99x or D1 if self.debug: print "Looks like an unlabeled type 2 Nikon MakerNote" self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_NIKON_NEWER_TAGS) return # Olympus if make.startswith('OLYMPUS'): self.dump_IFD(note.field_offset+8, 'MakerNote', dict=MAKERNOTE_OLYMPUS_TAGS) # XXX TODO #for i in (('MakerNote Tag 0x2020', MAKERNOTE_OLYMPUS_TAG_0x2020),): # self.decode_olympus_tag(self.tags[i[0]].values, i[1]) #return # Casio if 'CASIO' in make or 'Casio' in make: self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_CASIO_TAGS) return # Fujifilm if make == 'FUJIFILM': # bug: everything else is "Motorola" endian, but the MakerNote # is "Intel" endian endian = self.endian self.endian = 'I' # bug: IFD offsets are from beginning of MakerNote, not # beginning of file header offset = self.offset self.offset += note.field_offset # process note with bogus values (note is actually at offset 12) self.dump_IFD(12, 'MakerNote', dict=MAKERNOTE_FUJIFILM_TAGS) # reset to correct values self.endian = endian self.offset = offset return # Canon if make == 'Canon': self.dump_IFD(note.field_offset, 'MakerNote', dict=MAKERNOTE_CANON_TAGS) for i in (('MakerNote Tag 0x0001', MAKERNOTE_CANON_TAG_0x001), ('MakerNote Tag 0x0004', MAKERNOTE_CANON_TAG_0x004)): self.canon_decode_tag(self.tags[i[0]].values, i[1]) return # XXX TODO decode Olympus MakerNote tag based on offset within tag def olympus_decode_tag(self, value, dict): pass # decode Canon MakerNote tag based on offset within tag # see http://www.burren.cx/david/canon.html by David Burren def canon_decode_tag(self, value, dict): for i in range(1, len(value)): x=dict.get(i, ('Unknown', )) if self.debug: print i, x name=x[0] if len(x) > 1: val=x[1].get(value[i], 'Unknown') else: val=value[i] # it's not a real IFD Tag but we fake one to make everybody # happy. this will have a "proprietary" type self.tags['MakerNote '+name]=IFD_Tag(str(val), None, 0, None, None, None) # process an image file (expects an open file object) # this is the function that has to deal with all the arbitrary nasty bits # of the EXIF standard def process_file(f, stop_tag='UNDEF', details=True, strict=False, debug=False): # yah it's cheesy... global detailed detailed = details # by default do not fake an EXIF beginning fake_exif = 0 # determine whether it's a JPEG or TIFF data = f.read(12) if data[0:4] in ['II*\x00', 'MM\x00*']: # it's a TIFF file f.seek(0) endian = f.read(1) f.read(1) offset = 0 elif data[0:2] == '\xFF\xD8': # it's a JPEG file while data[2] == '\xFF' and data[6:10] in ('JFIF', 'JFXX', 'OLYM', 'Phot'): length = ord(data[4])*256+ord(data[5]) f.read(length-8) # fake an EXIF beginning of file data = '\xFF\x00'+f.read(10) fake_exif = 1 if data[2] == '\xFF' and data[6:10] == 'Exif': # detected EXIF header offset = f.tell() endian = f.read(1) else: # no EXIF information return {} else: # file format not recognized return {} # deal with the EXIF info we found if debug: print {'I': 'Intel', 'M': 'Motorola'}[endian], 'format' hdr = EXIF_header(f, endian, offset, fake_exif, strict, debug) ifd_list = hdr.list_IFDs() ctr = 0 for i in ifd_list: if ctr == 0: IFD_name = 'Image' elif ctr == 1: IFD_name = 'Thumbnail' thumb_ifd = i else: IFD_name = 'IFD %d' % ctr if debug: print ' IFD %d (%s) at offset %d:' % (ctr, IFD_name, i) hdr.dump_IFD(i, IFD_name, stop_tag=stop_tag) # EXIF IFD exif_off = hdr.tags.get(IFD_name+' ExifOffset') if exif_off: if debug: print ' EXIF SubIFD at offset %d:' % exif_off.values[0] hdr.dump_IFD(exif_off.values[0], 'EXIF', stop_tag=stop_tag) # Interoperability IFD contained in EXIF IFD intr_off = hdr.tags.get('EXIF SubIFD InteroperabilityOffset') if intr_off: if debug: print ' EXIF Interoperability SubSubIFD at offset %d:' \ % intr_off.values[0] hdr.dump_IFD(intr_off.values[0], 'EXIF Interoperability', dict=INTR_TAGS, stop_tag=stop_tag) # GPS IFD gps_off = hdr.tags.get(IFD_name+' GPSInfo') if gps_off: if debug: print ' GPS SubIFD at offset %d:' % gps_off.values[0] hdr.dump_IFD(gps_off.values[0], 'GPS', dict=GPS_TAGS, stop_tag=stop_tag) ctr += 1 # extract uncompressed TIFF thumbnail thumb = hdr.tags.get('Thumbnail Compression') if thumb and thumb.printable == 'Uncompressed TIFF': hdr.extract_TIFF_thumbnail(thumb_ifd) # JPEG thumbnail (thankfully the JPEG data is stored as a unit) thumb_off = hdr.tags.get('Thumbnail JPEGInterchangeFormat') if thumb_off: f.seek(offset+thumb_off.values[0]) size = hdr.tags['Thumbnail JPEGInterchangeFormatLength'].values[0] hdr.tags['JPEGThumbnail'] = f.read(size) # deal with MakerNote contained in EXIF IFD # (Some apps use MakerNote tags but do not use a format for which we # have a description, do not process these). if 'EXIF MakerNote' in hdr.tags and 'Image Make' in hdr.tags and detailed: hdr.decode_maker_note() # Sometimes in a TIFF file, a JPEG thumbnail is hidden in the MakerNote # since it's not allowed in a uncompressed TIFF IFD if 'JPEGThumbnail' not in hdr.tags: thumb_off=hdr.tags.get('MakerNote JPEGThumbnail') if thumb_off: f.seek(offset+thumb_off.values[0]) hdr.tags['JPEGThumbnail']=file.read(thumb_off.field_length) return hdr.tags # show command line usage def usage(exit_status): msg = 'Usage: EXIF.py [OPTIONS] file1 [file2 ...]\n' msg += 'Extract EXIF information from digital camera image files.\n\nOptions:\n' msg += '-q --quick Do not process MakerNotes.\n' msg += '-t TAG --stop-tag TAG Stop processing when this tag is retrieved.\n' msg += '-s --strict Run in strict mode (stop on errors).\n' msg += '-d --debug Run in debug mode (display extra info).\n' print msg sys.exit(exit_status) # library test/debug function (dump given files) if __name__ == '__main__': import sys import getopt # parse command line options/arguments try: opts, args = getopt.getopt(sys.argv[1:], "hqsdt:v", ["help", "quick", "strict", "debug", "stop-tag="]) except getopt.GetoptError: usage(2) if args == []: usage(2) detailed = True stop_tag = 'UNDEF' debug = False strict = False for o, a in opts: if o in ("-h", "--help"): usage(0) if o in ("-q", "--quick"): detailed = False if o in ("-t", "--stop-tag"): stop_tag = a if o in ("-s", "--strict"): strict = True if o in ("-d", "--debug"): debug = True # output info for each file for filename in args: try: file=open(filename, 'rb') except: print "'%s' is unreadable\n"%filename continue print filename + ':' # get the tags data = process_file(file, stop_tag=stop_tag, details=detailed, strict=strict, debug=debug) if not data: print 'No EXIF information found' continue x=data.keys() x.sort() for i in x: if i in ('JPEGThumbnail', 'TIFFThumbnail'): continue try: print ' %s (%s): %s' % \ (i, FIELD_TYPES[data[i].field_type][2], data[i].printable) except: print 'error', i, '"', data[i], '"' if 'JPEGThumbnail' in data: print 'File has JPEG thumbnail' print astrometry.net-0.67/util/file.py000644 000765 000024 00000004303 12651445460 017034 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import cPickle def trymakedirs(fn, dir=False): if dir is True: dirnm = os.path.dirname(fn) else: dirnm = fn if not os.path.exists(dirnm): try: os.makedirs(dirnm) except: pass def _filesize(fn): st = os.stat(fn) return st.st_size def file_size(fn, error=None): if error is None: return _filesize(fn) try: return _filesize(fn) except OSError: return error def read_file(fn): return open(fn).read() def write_file(data, fn): f = file(fn, 'wb') f.write(data) f.close() def pickle_to_file(data, fn): f = open(fn, 'wb') # MAGIC -1: highest pickle protocol cPickle.dump(data, f, -1) f.close() def unpickle_from_file(fn): f = open(fn, 'rb') data = cPickle.load(f) # necessary? f.close() return data def get_svn_version(): from run_command import run_command version = {} rtn,out,err = run_command('svn info') if rtn != 0: import sys print >>sys.stderr, 'Error getting SVN version: rtn', rtn, '\nOut:', out, '\nErr:', err assert(rtn == 0) lines = out.split('\n') lines = [l for l in lines if len(l)] for l in lines: words = l.split(':', 1) words = [w.strip() for w in words] version[words[0]] = words[1] return version def get_git_version(): ''' eg, {'commit': 'a5c7865efd188715a8436ef7be23e38448e2aa60', 'describe': 'v1.0'} ''' from run_command import run_command version = {} rtn,out,err = run_command('git log --max-count=1 | head -n 1') assert(rtn == 0) lines = out.split('\n') lines = [l for l in lines if len(l)] for l in lines: words = l.split(' ', 1) words = [w.strip() for w in words] version[words[0]] = words[1] rtn,out,err = run_command('git describe') if rtn == 0: # this can fail if there has been no "git tag" lines = out.split('\n') lines = [l for l in lines if len(l)] assert(len(lines) == 1) version['describe'] = lines[0] return version astrometry.net-0.67/util/filetype.py000644 000765 000024 00000002675 12651445460 017750 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os from astrometry.util.shell import shell_escape from astrometry.util.run_command import run_command # DEBUG import logging def logverb(*msg): logging.debug(' '.join([str(m).decode('latin_1', 'backslashreplace') for m in msg])) # Returns a list (usually with just one element) of 2-tuples: # [ (filetype, detail), (filetype, detail) ] # eg # [ ('Minix filesystem', 'version 2'), # ('JPEG image data', 'JFIF standard 1.01') ] def filetype(fn): filecmd = 'file -b -N -L -k -r %s' cmd = filecmd % shell_escape(fn) (rtn,out,err) = run_command(cmd) if rtn: logverb('"file" command failed. Command: "%s"' % cmd) logverb(' ', out) logverb(' ', err) return None out = out.strip() logverb('File: "%s"' % out) lst = [] for line in out.split('\n- '): if line.endswith('\n-'): line = line[:-2] if len(line) == 0: continue p = line.split(', ', 1) if len(p) == 2: lst.append(tuple(p)) else: lst.append((p[0], '')) return lst # Returns a list (usually with just one element) of filetypes, or None if no filetypes are found: # eg # [ 'Minix filesystem', 'JPEG image data' ] def filetype_short(fn): ft = filetype(fn) if ft is None: return None return [t for (t,nil) in ft] astrometry.net-0.67/util/fileutils.c000644 000765 000024 00000006726 12651445460 017722 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "fileutils.h" #include "ioutils.h" #include "os-features.h" char* resolve_path(const char* filename, const char* basedir) { // we don't use canonicalize_file_name() because it requires the paths // to actually exist, while this function should work for output files // that don't already exist. char* path; char* rtn; // absolute path? if (filename[0] == '/') //return strdup(filename); return an_canonicalize_file_name(filename); asprintf_safe(&path, "%s/%s", basedir, filename); //return path; rtn = an_canonicalize_file_name(path); free(path); return rtn; } char* find_executable(const char* progname, const char* sibling) { char* sib; char* sibdir; char* path; char* pathenv; // If it's an absolute path, just return it. if (progname[0] == '/') return strdup(progname); // If it's a relative path, resolve it. if (strchr(progname, '/')) { path = canonicalize_file_name(progname); if (path && file_executable(path)) return path; free(path); } // If "sibling" contains a "/", then check relative to it. if (sibling && strchr(sibling, '/')) { // dirname() overwrites its arguments, so make a copy... sib = strdup(sibling); sibdir = strdup(dirname(sib)); free(sib); asprintf_safe(&path, "%s/%s", sibdir, progname); free(sibdir); if (file_executable(path)) return path; free(path); } // Search PATH. pathenv = getenv("PATH"); while (1) { char* colon; int len; if (!strlen(pathenv)) break; colon = strchr(pathenv, ':'); if (colon) len = colon - pathenv; else len = strlen(pathenv); if (pathenv[len - 1] == '/') len--; asprintf_safe(&path, "%.*s/%s", len, pathenv, progname); if (file_executable(path)) return path; free(path); if (colon) pathenv = colon + 1; else break; } // Not found. return NULL; } char* an_canonicalize_file_name(const char* fn) { sl* dirs; int i; char* result; // Ugh, special cases. if (streq(fn, ".") || streq(fn, "/")) return strdup(fn); dirs = sl_split(NULL, fn, "/"); for (i=0; i\n" " [-X -Y ]\n" " -r \n" " [-R -D ]\n" " OR\n" " -c \n" " (default column names: FIELD_X, FIELD_Y, INDEX_RA, INDEX_DEC)\n" "\n" " -o \n" "\n" " [-s ] (default is a WCS TAN solution, not SIP)\n" " [-W ] (default: max X position; used for SIP)\n" " [-H ] (default: max Y position; used for SIP)\n" " [-C]: set CRPIX to be the center of the field; SIP only\n" " [-v]: verbose\n" "\n", progname); } int main(int argc, char** args) { int c; char* xylsfn = NULL; char* rdlsfn = NULL; char* corrfn = NULL; char* outfn = NULL; char* xcol = NULL; char* ycol = NULL; char* rcol = NULL; char* dcol = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; rd_t rd; starxy_t xy; int fieldnum = 1; int N; double* fieldxy = NULL; double* xyz = NULL; sip_t wcs; int rtn = -1; int loglvl = LOG_MSG; int siporder = 0; int W=0, H=0; anbool crpix_center = FALSE; int i; int doshift = 1; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'C': crpix_center = TRUE; break; case 's': siporder = atoi(optarg); break; case 'c': corrfn = optarg; break; case 'r': rdlsfn = optarg; break; case 'R': rcol = optarg; break; case 'D': dcol = optarg; break; case 'x': xylsfn = optarg; break; case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; case 'o': outfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (! ((xylsfn && rdlsfn) || corrfn) || !outfn) { print_help(args[0]); exit(-1); } log_init(loglvl); if (corrfn) { xylsfn = corrfn; rdlsfn = corrfn; if (!xcol) xcol = "FIELD_X"; if (!ycol) ycol = "FIELD_Y"; if (!rcol) rcol = "INDEX_RA"; if (!dcol) dcol = "INDEX_DEC"; } // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { ERROR("Failed to read an xylist from file %s", xylsfn); goto bailout; } xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); if (xcol) xylist_set_xname(xyls, xcol); if (ycol) xylist_set_yname(xyls, ycol); // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { ERROR("Failed to read an RA,Dec list from file %s", rdlsfn); goto bailout; } if (rcol) rdlist_set_raname(rdls, rcol); if (dcol) rdlist_set_decname(rdls, dcol); if (!xylist_read_field_num(xyls, fieldnum, &xy)) { ERROR("Failed to read xyls file %s, field %i", xylsfn, fieldnum); goto bailout; } if (!rdlist_read_field_num(rdls, fieldnum, &rd)) { ERROR("Failed to read rdls field %i", fieldnum); goto bailout; } N = starxy_n(&xy); if (rd_n(&rd) != N) { ERROR("X,Y list and RA,Dec list must have the same number of entries, " "but found %i vs %i", N, rd_n(&rd)); goto bailout; } logverb("Read %i points from %s and %s\n", N, rdlsfn, xylsfn); xyz = (double*)malloc(sizeof(double) * 3 * N); if (!xyz) { ERROR("Failed to allocate %i xyz coords", N); goto bailout; } radecdeg2xyzarrmany(rd.ra, rd.dec, xyz, N); fieldxy = starxy_to_xy_array(&xy, NULL); if (!fieldxy) { ERROR("Failed to allocate %i xy coords", N); goto bailout; } logverb("Fitting WCS\n"); if (siporder == 0) { if (fit_tan_wcs(xyz, fieldxy, N, &(wcs.wcstan), NULL)) { ERROR("Failed to fit for TAN WCS"); goto bailout; } } else { if (W == 0) { for (i=0; i #include #include "gsl/gsl_matrix.h" #include "gsl/gsl_linalg.h" #include "gsl/gsl_blas.h" #include "os-features.h" #include "fit-wcs.h" #include "starutil.h" #include "mathutil.h" #include "sip.h" #include "sip_qfits.h" #include "log.h" #include "errors.h" #include "gslutils.h" #include "sip-utils.h" int fit_sip_wcs_2(const double* starxyz, const double* fieldxy, const double* weights, int M, int sip_order, int inv_order, int W, int H, int crpix_center, double* crpix, int doshift, sip_t* sipout) { tan_t wcs; memset(&wcs, 0, sizeof(tan_t)); // Start with a TAN if (fit_tan_wcs(starxyz, fieldxy, M, &wcs, NULL)) { ERROR("Failed to fit for TAN WCS"); return -1; } if (crpix || crpix_center) { double cx,cy; double cr,cd; if (crpix) { cx = crpix[0]; cy = crpix[1]; } else { int i; if (W == 0) { for (i=0; iwcstan), tanin, sizeof(tan_t)); sipout->a_order = sipout->b_order = sip_order; sipout->ap_order = sipout->bp_order = inv_order; // The SIP coefficients form an (order x order) upper triangular // matrix missing the 0,0 element. sip_coeffs = (sip_order + 1) * (sip_order + 2) / 2; N = sip_coeffs; if (M < N) { ERROR("Too few correspondences for the SIP order specified (%i < %i)\n", M, N); return -1; } mA = gsl_matrix_alloc(M, N); b1 = gsl_vector_alloc(M); b2 = gsl_vector_alloc(M); assert(mA); assert(b1); assert(b2); /* * We use a clever trick to estimate CD, A, and B terms in two * seperated least squares fits, then finding A and B by multiplying * the found parameters by CD inverse. * * Rearranging the SIP equations (see sip.h) we get the following * matrix operation to compute x and y in world intermediate * coordinates, which is convienently written in a way which allows * least squares estimation of CD and terms related to A and B. * * First use the x's to find the first set of parametetrs * * +--------------------- Intermediate world coordinates in DEGREES * | +--------- Pixel coordinates u and v in PIXELS * | | +--- Polynomial u,v terms in powers of PIXELS * v v v * ( x1 ) ( 1 u1 v1 p1 ) (sx ) * ( x2 ) = ( 1 u2 v2 p2 ) * (cd11 ) : * ( x3 ) ( 1 u3 v3 p3 ) (cd12 ) : * ( ...) ( ... ) (cd11*A + cd12*B ) : * cd11 is a scalar, degrees per pixel * cd12 is a scalar, degrees per pixel * cd11*A and cs12*B are mixture of SIP terms (A,B) and CD matrix * (cd11,cd12) * * Then find cd21 and cd22 with the y's * * ( y1 ) ( 1 u1 v1 p1 ) (sy ) * ( y2 ) = ( 1 u2 v2 p2 ) * (cd21 ) : * ( y3 ) ( 1 u3 v3 p3 ) (cd22 ) : * ( ...) ( ... ) (cd21*A + cd22*B ) : (Y4) * y2: scalar, degrees per pixel * y3: scalar, degrees per pixel * Y4: mixture of SIP terms (A,B) and CD matrix (cd21,cd22) * * These are both standard least squares problems which we solve with * QR decomposition, ie * min_{cd,A,B} || x - [1,u,v,p]*[s;cd;cdA+cdB]||^2 with * x reference, cd,A,B unrolled parameters. * * We get back (for x) a vector of optimal * [sx;cd11;cd12; cd11*A + cd12*B] * Now we can pull out sx, cd11 and cd12 from the beginning of this vector, * and call the rest of the vector [cd11*A] + [cd12*B]; * similarly for the y fit, we get back a vector of optimal * [sy;cd21;cd22; cd21*A + cd22*B] * once we have all those we can figure out A and B as follows * -1 * A' = [cd11 cd12] * [cd11*A' + cd12*B'] * B' [cd21 cd22] [cd21*A' + cd22*B'] * * which recovers the A and B's. * */ /* * Dustin's interpretation of the above: * We want to solve: * * min || b[M-by-1] - A[M-by-N] x[N-by-1] ||_2 * * M = the number of correspondences. * N = the number of SIP terms. * * And we want an overdetermined system, so M >= N. * * [ 1 u_1 v_1 u_1^2 u_1 v_1 v_1^2 ... ] * mA = [ 1 u_2 v_2 u_2^2 u_2 v_2 v_2^2 ... ] * [ ...... ] * * Where (u_i, v_i) are *undistorted* pixel positions minus CRPIX. * * The answers we want are: * * [ sx ] * x1 = [ cd11 ] * [ cd12 ] * [ (A) (B) ] * [ cd11*(A) + cd12*(B) ] * [ (A) (B) ] * * [ sy ] * x2 = [ cd21 ] * [ cd22 ] * [ (A) (B) ] * [ cd21*(A) + cd22*(B) ] * [ (A) (B) ] * * And the target vectors are the intermediate world coords of the * reference stars, in degrees. * * [ ix_1 ] * b1 = [ ix_2 ] * [ ... ] * * [ iy_1 ] * b2 = [ iy_2 ] * [ ... ] * * * (where A and B are tall vectors of SIP coefficients of order 2 * and above) * */ // Fill in matrix mA: radecdeg2xyzarr(tanin->crval[0], tanin->crval[1], xyzcrval); totalweight = 0.0; ngood = 0; for (i=0; icrpix[0]; v = fieldxy[2*i + 1] - tanin->crpix[1]; // B contains Intermediate World Coordinates (in degrees) // tangent-plane projection ok = star_coords(starxyz + 3*i, xyzcrval, TRUE, &x, &y); if (!ok) { logverb("Skipping star that cannot be projected to tangent plane\n"); continue; } if (weights) { weight = weights[i]; assert(weight >= 0.0); assert(weight <= 1.0); totalweight += weight; if (weight == 0.0) continue; } gsl_vector_set(b1, ngood, weight * rad2deg(x)); gsl_vector_set(b2, ngood, weight * rad2deg(y)); /* The coefficients are stored in this order: * p q * (0,0) = 1 <- order 0 * (1,0) = u <- order 1 * (0,1) = v * (2,0) = u^2 <- order 2 * (1,1) = uv * (0,2) = v^2 * ... */ j = 0; for (order=0; order<=sip_order; order++) { for (q=0; q<=order; q++) { p = order - q; assert(j >= 0); assert(j < N); assert(p >= 0); assert(q >= 0); assert(p + q <= sip_order); gsl_matrix_set(mA, ngood, j, weight * pow(u, (double)p) * pow(v, (double)q)); j++; } } assert(j == N); // The shift - aka (0,0) - SIP coefficient must be 1. assert(gsl_matrix_get(mA, i, 0) == 1.0 * weight); assert(fabs(gsl_matrix_get(mA, i, 1) - u * weight) < 1e-12); assert(fabs(gsl_matrix_get(mA, i, 2) - v * weight) < 1e-12); ngood++; } if (ngood == 0) { ERROR("No stars projected within the image\n"); return -1; } if (weights) logverb("Total weight: %g\n", totalweight); if (ngood < M) { _gsl_vector_view sub_b1 = gsl_vector_subvector(b1, 0, ngood); _gsl_vector_view sub_b2 = gsl_vector_subvector(b2, 0, ngood); _gsl_matrix_view sub_mA = gsl_matrix_submatrix(mA, 0, 0, ngood, N); rtn = gslutils_solve_leastsquares_v(&(sub_mA.matrix), 2, &(sub_b1.vector), &x1, NULL, &(sub_b2.vector), &x2, NULL); } else { // Solve the equation. rtn = gslutils_solve_leastsquares_v(mA, 2, b1, &x1, NULL, b2, &x2, NULL); } if (rtn) { ERROR("Failed to solve SIP matrix equation!"); return -1; } // Row 0 of X are the shift (p=0, q=0) terms. // Row 1 of X are the terms that multiply "u". // Row 2 of X are the terms that multiply "v". if (doshift) { // Grab CD. sipout->wcstan.cd[0][0] = gsl_vector_get(x1, 1); sipout->wcstan.cd[0][1] = gsl_vector_get(x1, 2); sipout->wcstan.cd[1][0] = gsl_vector_get(x2, 1); sipout->wcstan.cd[1][1] = gsl_vector_get(x2, 2); // Compute inv(CD) i = invert_2by2_arr((const double*)(sipout->wcstan.cd), (double*)cdinv); assert(i == 0); // Grab the shift. sx = gsl_vector_get(x1, 0); sy = gsl_vector_get(x2, 0); } else { double cd[2][2]; cd[0][0] = gsl_vector_get(x1, 1); cd[0][1] = gsl_vector_get(x1, 2); cd[1][0] = gsl_vector_get(x2, 1); cd[1][1] = gsl_vector_get(x2, 2); // Compute inv(CD) i = invert_2by2_arr((const double*)(sipout->wcstan.cd), (double*)cdinv); assert(i == 0); } // Extract the SIP coefficients. // (this includes the 0 and 1 order terms, which we later overwrite) j = 0; for (order=0; order<=sip_order; order++) { for (q=0; q<=order; q++) { p = order - q; assert(j >= 0); assert(j < N); assert(p >= 0); assert(q >= 0); assert(p + q <= sip_order); sipout->a[p][q] = cdinv[0][0] * gsl_vector_get(x1, j) + cdinv[0][1] * gsl_vector_get(x2, j); sipout->b[p][q] = cdinv[1][0] * gsl_vector_get(x1, j) + cdinv[1][1] * gsl_vector_get(x2, j); j++; } } assert(j == N); if (doshift) { // We have already dealt with the shift and linear terms, so zero them out // in the SIP coefficient matrix. sipout->a[0][0] = 0.0; sipout->a[0][1] = 0.0; sipout->a[1][0] = 0.0; sipout->b[0][0] = 0.0; sipout->b[0][1] = 0.0; sipout->b[1][0] = 0.0; } sip_compute_inverse_polynomials(sipout, 0, 0, 0, 0, 0, 0); if (doshift) { sU = cdinv[0][0] * sx + cdinv[0][1] * sy; sV = cdinv[1][0] * sx + cdinv[1][1] * sy; logverb("Applying shift of sx,sy = %g,%g deg (%g,%g pix) to CRVAL and CD.\n", sx, sy, sU, sV); sip_calc_inv_distortion(sipout, sU, sV, &su, &sv); debug("sx = %g, sy = %g\n", sx, sy); debug("sU = %g, sV = %g\n", sU, sV); debug("su = %g, sv = %g\n", su, sv); wcs_shift(&(sipout->wcstan), -su, -sv); } if (r1) gsl_vector_free(r1); if (r2) gsl_vector_free(r2); gsl_matrix_free(mA); gsl_vector_free(b1); gsl_vector_free(b2); gsl_vector_free(x1); gsl_vector_free(x2); return 0; } int fit_sip_coefficients(const double* starxyz, const double* fieldxy, const double* weights, int M, const tan_t* tanin1, int sip_order, int inv_order, sip_t* sipout) { int sip_coeffs; int N; int i, j, p, q, order; double totalweight; int rtn; gsl_matrix *mA; gsl_vector *b1, *b2, *x1, *x2; gsl_vector *r1=NULL, *r2=NULL; tan_t tanin2; int ngood; const tan_t* tanin = &tanin2; // We need at least the linear terms to compute CD. if (sip_order < 1) sip_order = 1; // convenience: allow the user to call like: // fit_sip_wcs(... &(sipout.wcstan), ..., sipout); memcpy(&tanin2, tanin1, sizeof(tan_t)); memset(sipout, 0, sizeof(sip_t)); memcpy(&(sipout->wcstan), tanin, sizeof(tan_t)); sipout->a_order = sipout->b_order = sip_order; sipout->ap_order = sipout->bp_order = inv_order; // The SIP coefficients form an (order x order) upper triangular // matrix sip_coeffs = (sip_order + 1) * (sip_order + 2) / 2; N = sip_coeffs; if (M < N) { ERROR("Too few correspondences for the SIP order specified (%i < %i)\n", M, N); return -1; } mA = gsl_matrix_alloc(M, N); b1 = gsl_vector_alloc(M); b2 = gsl_vector_alloc(M); assert(mA); assert(b1); assert(b2); /** * We're going to fit for the "forward" SIP coefficients * A, B. * * SIP converts (x,y) -> distort with A,B -> (x',y') -> TAN -> RA,Dec * * We are going to hold TAN fixed here, so first convert RA,Dec * to (x',y'), and then compute A,B terms. * * Set up the matrix equation * [ SIP polynomial terms ] [ SIP coeffs ] - [x'] ~ 0 * * Where SIP polynomial terms are powers of x. * * Though rather than x, x' we'll work in CRPIX-relative units, * since that's what SIP does. */ // Fill in matrix mA: totalweight = 0.0; ngood = 0; for (i=0; icrpix[0]; yprime -= tanin->crpix[1]; x = fieldxy[2*i ] - tanin->crpix[0]; y = fieldxy[2*i+1] - tanin->crpix[1]; if (weights) { weight = weights[i]; assert(weight >= 0.0); assert(weight <= 1.0); totalweight += weight; if (weight == 0.0) continue; } /// AHA!, since SIP computes an "fuv","guv" to ADD to /// x,y to get x',y', b is the DIFFERENCE! gsl_vector_set(b1, ngood, weight * (xprime - x)); gsl_vector_set(b2, ngood, weight * (yprime - y)); /* The coefficients are stored in this order: * p q * (0,0) = 1 <- order 0 * (1,0) = u <- order 1 * (0,1) = v * (2,0) = u^2 <- order 2 * (1,1) = uv * (0,2) = v^2 * ... */ j = 0; for (order=0; order<=sip_order; order++) { for (q=0; q<=order; q++) { p = order - q; assert(j >= 0); assert(j < N); assert(p >= 0); assert(q >= 0); assert(p + q <= sip_order); gsl_matrix_set(mA, ngood, j, weight * pow(x, (double)p) * pow(y, (double)q)); j++; } } assert(j == N); ngood++; } if (ngood == 0) { ERROR("No stars projected within the image\n"); return -1; } if (weights) logverb("Total weight: %g\n", totalweight); if (ngood < M) { _gsl_vector_view sub_b1 = gsl_vector_subvector(b1, 0, ngood); _gsl_vector_view sub_b2 = gsl_vector_subvector(b2, 0, ngood); _gsl_matrix_view sub_mA = gsl_matrix_submatrix(mA, 0, 0, ngood, N); rtn = gslutils_solve_leastsquares_v(&(sub_mA.matrix), 2, &(sub_b1.vector), &x1, NULL, &(sub_b2.vector), &x2, NULL); } else { // Solve the equation. rtn = gslutils_solve_leastsquares_v(mA, 2, b1, &x1, NULL, b2, &x2, NULL); } if (rtn) { ERROR("Failed to solve SIP matrix equation!"); return -1; } // Extract the SIP coefficients. j = 0; for (order=0; order<=sip_order; order++) { for (q=0; q<=order; q++) { p = order - q; assert(j >= 0); assert(j < N); assert(p >= 0); assert(q >= 0); assert(p + q <= sip_order); sipout->a[p][q] = gsl_vector_get(x1, j); sipout->b[p][q] = gsl_vector_get(x2, j); j++; } } assert(j == N); if (r1) gsl_vector_free(r1); if (r2) gsl_vector_free(r2); gsl_matrix_free(mA); gsl_vector_free(b1); gsl_vector_free(b2); gsl_vector_free(x1); gsl_vector_free(x2); return 0; } // Given a pixel offset (shift in image plane), adjust the WCS // CRVAL to the position given by CRPIX + offset. // Why not just // sip_pixelxy2radec(wcs, crpix0 +- xs, crpix1 +- ys, // wcs->wcstan.crval+0, wcs->wcstan.crval+1); // The answer is that "North" changes when you move the reference point. void wcs_shift(tan_t* wcs, double xs, double ys) { // UNITS: xs/ys in pixels // crvals in degrees, nx/nyref and theta in degrees double crpix0, crpix1, crval0; double theta, sintheta, costheta; double newcrval0, newcrval1; double newcd00,newcd01,newcd10,newcd11; // Save old vals crpix0 = wcs->crpix[0]; crpix1 = wcs->crpix[1]; crval0 = wcs->crval[0]; // compute the desired projection of the new tangent point by // shifting the projection of the current tangent point wcs->crpix[0] += xs; wcs->crpix[1] += ys; // now reproject the old crpix[xy] into shifted wcs tan_pixelxy2radec(wcs, crpix0, crpix1, &newcrval0, &newcrval1); // Restore crpix wcs->crpix[0] = crpix0; wcs->crpix[1] = crpix1; // RA,DEC coords of new tangent point wcs->crval[0] = newcrval0; wcs->crval[1] = newcrval1; theta = -deg2rad(newcrval0 - crval0); // deltaRA = new minus old RA; theta *= sin(deg2rad(newcrval1)); // multiply by the sin of the NEW Dec; at equator this correctly // evals to zero sintheta = sin(theta); costheta = cos(theta); // Fix the CD matrix since "northwards" has changed due to moving RA newcd00 = costheta * wcs->cd[0][0] - sintheta * wcs->cd[0][1]; newcd01 = sintheta * wcs->cd[0][0] + costheta * wcs->cd[0][1]; newcd10 = costheta * wcs->cd[1][0] - sintheta * wcs->cd[1][1]; newcd11 = sintheta * wcs->cd[1][0] + costheta * wcs->cd[1][1]; wcs->cd[0][0] = newcd00; wcs->cd[0][1] = newcd01; wcs->cd[1][0] = newcd10; wcs->cd[1][1] = newcd11; } static int fit_tan_wcs_solve(const double* starxyz, const double* fieldxy, const double* weights, int N, const double* crpix, const tan_t* tanin, tan_t* tanout, double* p_scale) { int i, j, k; double field_cm[2] = {0, 0}; double cov[4] = {0, 0, 0, 0}; double R[4] = {0, 0, 0, 0}; double scale; // projected star coordinates double* p; // relative field coordinates double* f; double pcm[2] = {0, 0}; double w = 0; double totalw; gsl_matrix* A; gsl_matrix* U; gsl_matrix* V; gsl_vector* S; gsl_vector* work; gsl_matrix_view vcov; gsl_matrix_view vR; double crxyz[3]; double star_cm[3] = {0, 0, 0}; assert(((tanin != NULL) && (crpix != NULL)) || ((tanin == NULL) && (crpix == NULL))); if (tanin) { // default vals... memcpy(tanout, tanin, sizeof(tan_t)); } else { memset(tanout, 0, sizeof(tan_t)); } // -allocate and fill "p" and "f" arrays. ("projected" and "field") p = malloc(N * 2 * sizeof(double)); f = malloc(N * 2 * sizeof(double)); // -get field center-of-mass totalw = 0.0; for (i=0; icd[0][0] = R[0] * scale; // CD1_1 tanout->cd[0][1] = R[1] * scale; // CD1_2 tanout->cd[1][0] = R[2] * scale; // CD2_1 tanout->cd[1][1] = R[3] * scale; // CD2_2 assert(isfinite(tanout->cd[0][0])); assert(isfinite(tanout->cd[0][1])); assert(isfinite(tanout->cd[1][0])); assert(isfinite(tanout->cd[1][1])); if (tanin) { // CRPIX is fixed. tanout->crpix[0] = crpix[0]; tanout->crpix[1] = crpix[1]; // Set CRVAL temporarily... tan_pixelxy2radec(tanin, crpix[0], crpix[1], tanout->crval+0, tanout->crval+1); // Shift CRVAL so that the center of the quad is in the right place. { double ix,iy; double dx,dy; double dxyz[3]; tan_pixelxy2iwc(tanout, field_cm[0], field_cm[1], &ix, &iy); dx = rad2deg(pcm[0]) - ix; dy = rad2deg(pcm[1]) - iy; tan_iwc2xyzarr(tanout, dx, dy, dxyz); xyzarr2radecdeg(dxyz, tanout->crval + 0, tanout->crval + 1); } } else { tanout->crpix[0] = field_cm[0]; tanout->crpix[1] = field_cm[1]; xyzarr2radecdegarr(star_cm, tanout->crval); // FIXME -- we ignore pcm. It should get added back in (after // multiplication by CD in the appropriate units) to either crval or // crpix. It's a very small correction probably of the same size // as the other approximations we're making. } if (p_scale) *p_scale = scale; free(p); free(f); return 0; } int fit_tan_wcs_move_tangent_point_weighted(const double* starxyz, const double* fieldxy, const double* weights, int N, const double* crpix, const tan_t* tanin, tan_t* tanout) { return fit_tan_wcs_solve(starxyz, fieldxy, weights, N, crpix, tanin, tanout, NULL); } int fit_tan_wcs_move_tangent_point(const double* starxyz, const double* fieldxy, int N, const double* crpix, const tan_t* tanin, tan_t* tanout) { return fit_tan_wcs_move_tangent_point_weighted(starxyz, fieldxy, NULL, N, crpix, tanin, tanout); } int fit_tan_wcs_weighted(const double* starxyz, const double* fieldxy, const double* weights, int N, // output: tan_t* tan, double* p_scale) { return fit_tan_wcs_solve(starxyz, fieldxy, weights, N, NULL, NULL, tan, p_scale); } int fit_tan_wcs(const double* starxyz, const double* fieldxy, int N, // output: tan_t* tan, double* p_scale) { return fit_tan_wcs_weighted(starxyz, fieldxy, NULL, N, tan, p_scale); } astrometry.net-0.67/util/fits-column-merge.c000644 000765 000024 00000015022 12651445460 021244 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "os-features.h" #include "anqfits.h" #include "fitsioutils.h" #include "boilerplate.h" #include "ioutils.h" char* OPTIONS = "hs:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\n\n%s [options] \n" "Options:\n" " [-s]: suffix to add for duplicate column names in table 2\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* afn; char* bfn; char* outfn; char* suffix = NULL; qfits_table* atable; qfits_table* btable; qfits_table* outtable; int i,j; FILE* afid; FILE* bfid; FILE* outfid; int aoff; int boff; char* buffer; qfits_header* hdr; qfits_header* tablehdr; anqfits_t* anqa = NULL; anqfits_t* anqb = NULL; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 's': suffix = optarg; break; case 'h': printHelp(args[0]); exit(0); case '?': exit(-1); } if (optind != (argc - 3)) { printHelp(args[0]); printf("Need 3 arguments.\n"); exit(-1); } afn = args[optind]; bfn = args[optind+1]; outfn = args[optind+2]; anqa = anqfits_open(afn); if (!anqa) { fprintf(stderr, "Failed to open file \"%s\": %s.\n", afn, strerror(errno)); exit(-1); } anqb = anqfits_open(bfn); if (!anqb) { fprintf(stderr, "Failed to open file \"%s\": %s.\n", bfn, strerror(errno)); exit(-1); } atable = anqfits_get_table(anqa, 1); btable = anqfits_get_table(anqb, 1); if (!atable) { fprintf(stderr, "Failed to read a FITS table from ext 1 of file \"%s\".\n", afn); exit(-1); } if (!btable) { fprintf(stderr, "Failed to read a FITS table from ext 1 of file \"%s\".\n", bfn); exit(-1); } if (atable->tab_t != QFITS_BINTABLE) { fprintf(stderr, "Extension 1 of file \"%s\" doesn't contain a BINTABLE.\n", afn); exit(-1); } if (btable->tab_t != QFITS_BINTABLE) { fprintf(stderr, "Extension 1 of file \"%s\" doesn't contain a BINTABLE.\n", bfn); exit(-1); } if (atable->nr != btable->nr) { fprintf(stderr, "Input tables must have the same number of rows: %i vs %i.\n", atable->nr, btable->nr); exit(-1); } for (i=0; inc; i++) { for (j=0; jnc; j++) { if (strcmp(atable->col[i].tlabel, btable->col[j].tlabel) == 0) { fprintf(stderr, "Input tables both have a column named \"%s\".\n", atable->col[i].tlabel); if (!suffix) { exit(-1); } sprintf(btable->col[j].tlabel, "%s%s", atable->col[i].tlabel, suffix); printf("Changed name to \"%s\"\n", btable->col[j].tlabel); } } } afid = fopen(afn, "rb"); if (!afid) { fprintf(stderr, "Failed to open file \"%s\": %s.\n", afn, strerror(errno)); exit(-1); } bfid = fopen(bfn, "rb"); if (!bfid) { fprintf(stderr, "Failed to open file \"%s\": %s.\n", bfn, strerror(errno)); exit(-1); } aoff = anqfits_data_start(anqa, 1); boff = anqfits_data_start(anqb, 1); if (fseek(afid, aoff, SEEK_SET)) { fprintf(stderr, "Failed to seek to start of data in file \"%s\": %s\n", afn, strerror(errno)); exit(-1); } if (fseek(bfid, boff, SEEK_SET)) { fprintf(stderr, "Failed to seek to start of data in file \"%s\": %s\n", bfn, strerror(errno)); exit(-1); } outtable = qfits_table_new(outfn, QFITS_BINTABLE, atable->tab_w + btable->tab_w, atable->nc + btable->nc, atable->nr); // copy column descriptions memcpy(outtable->col, atable->col, atable->nc * sizeof(qfits_col)); memcpy(outtable->col + atable->nc, btable->col, btable->nc * sizeof(qfits_col)); tablehdr = qfits_table_ext_header_default(outtable); if (!tablehdr) { fprintf(stderr, "Failed to create FITS table header.\n"); exit(-1); } buffer = malloc(MAX(atable->tab_w, btable->tab_w)); if (!buffer) { fprintf(stderr, "Failed to malloc buffer.\n"); exit(-1); } outfid = fopen(outfn, "wb"); if (!outfid) { fprintf(stderr, "Failed to open file \"%s\": %s.\n", outfn, strerror(errno)); exit(-1); } hdr = anqfits_get_header2(afn, 0); if (!hdr) { fprintf(stderr, "Failed to read primary header from \"%s\".\n", afn); exit(-1); } BOILERPLATE_ADD_FITS_HEADERS(hdr); fits_add_long_history(hdr, "This file was created by the program \"%s\" by " "merging columns from the input files \"%s\" and \"%s\"." , args[0], afn, bfn); if (qfits_header_dump(hdr, outfid) || qfits_header_dump(tablehdr, outfid)) { fprintf(stderr, "Failed to write headers.\n"); exit(-1); } qfits_header_destroy(hdr); qfits_header_destroy(tablehdr); for (i=0; inr; i++) { if (fread(buffer, 1, atable->tab_w, afid) != atable->tab_w) { fprintf(stderr, "Failed to read row %i from table \"%s\": %s\n", i, afn, strerror(errno)); exit(-1); } if (fwrite(buffer, 1, atable->tab_w, outfid) != atable->tab_w) { fprintf(stderr, "Failed to write row %i: %s\n", i, strerror(errno)); exit(-1); } if (fread(buffer, 1, btable->tab_w, bfid) != btable->tab_w) { fprintf(stderr, "Failed to read row %i from table \"%s\": %s\n", i, bfn, strerror(errno)); exit(-1); } if (fwrite(buffer, 1, btable->tab_w, outfid) != btable->tab_w) { fprintf(stderr, "Failed to write row %i: %s\n", i, strerror(errno)); exit(-1); } } free(buffer); if (fits_pad_file(outfid)) { fprintf(stderr, "Failed to zero-pad file.\n"); exit(-1); } if (fclose(outfid)) { fprintf(stderr, "Failed to close output file: %s\n", strerror(errno)); exit(-1); } fclose(afid); fclose(bfid); anqfits_close(anqa); anqfits_close(anqb); qfits_table_close(atable); qfits_table_close(btable); qfits_table_close(outtable); return 0; } astrometry.net-0.67/util/fits-flip-endian.c000644 000765 000024 00000010767 12651445460 021053 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "an-bool.h" #include "anqfits.h" #include "bl.h" #include "ioutils.h" #include "errors.h" #include "log.h" #include "an-endian.h" char* OPTIONS = "hi:o:e:s:"; void printHelp(char* progname) { fprintf(stderr, "%s -i \n" " -o \n" " [ -e -s ] ...\n\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; anbool tostdout = FALSE; FILE* fin = NULL; FILE* fout = NULL; il* exts; il* sizes; int i; char* progname = argv[0]; int Next; anqfits_t* anq; exts = il_new(16); sizes = il_new(16); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'e': il_append(exts, atoi(optarg)); break; case 's': il_append(sizes, atoi(optarg)); break; case 'i': infn = optarg; break; case 'o': outfn = optarg; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } log_init(LOG_MSG); if (!infn || !outfn || !il_size(exts) || (il_size(exts) != il_size(sizes))) { printHelp(progname); exit(-1); } if (infn) { fin = fopen(infn, "rb"); if (!fin) { SYSERROR("Failed to open input file %s", infn); exit(-1); } } anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open input file %s", infn); exit(-1); } Next = anqfits_n_ext(anq); if (Next == -1) { ERROR("Couldn't determine how many extensions are in file %s", infn); exit(-1); } else { logverb("File %s contains %i FITS extensions.\n", infn, Next); } for (i=0; i= Next) { logerr("Extension %i is not valid: must be in [%i, %i]\n", e, 0, Next); exit(-1); } if (s != 2 && s != 4 && s != 8) { logerr("Invalid byte size %i: must be 2, 4, or 8.\n", s); exit(-1); } } if (!strcmp(outfn, "-")) tostdout = TRUE; if (tostdout) fout = stdout; else { fout = fopen(outfn, "wb"); if (!fout) { SYSERROR("Failed to open output file %s", outfn); exit(-1); } } for (i=0; i 0) if columns in [None, 'minimal', 'fillzero']: cols = set(TT[0].get_columns()) types = {} if columns == 'fillzero': for c in cols: types[c] = TT[0].get(c).dtype #print('col', c, 'is', types[c]) for T in TT[1:]: if columns == 'minimal': if len(cols.symmetric_difference(T.get_columns())): cols = cols.intersection(T.get_columns()) continue if columns == 'fillzero': newcols = set(T.get_columns()) - cols for c in newcols: # Assume numpy arrays types[c] = T.get(c).dtype #print('col', c, 'is', types[c]) cols = cols.union(T.get_columns()) continue # They must have the same set of columns if len(cols.symmetric_difference(T.get_columns())): print('Tables to merge must have the same set of columns.') print('First table columns:', cols) print('Target table columns:', T.get_columns()) print('Difference:', cols.symmetric_difference(T.get_columns())) assert(len(cols.symmetric_difference(T.get_columns())) == 0) cols = list(cols) # Reorder the columns to match their order in TT[0]. ocols = [] for c in TT[0].get_columns(): if c in cols and not c in ocols: ocols.append(c) # (for fillzero) -- add the rest of the columns (not in TT[0]) for c in cols: if not c in ocols: ocols.append(c) cols = ocols else: for i,T in enumerate(TT): # ensure they all have the requested columns if not set(columns).issubset(set(T.get_columns())): print('Each table to be merged must have the requested columns') print('Table', i, 'is missing columns:', set(columns)-set(T.get_columns())) print('columns', columns) print('T.columns', T.get_columns()) assert(False) cols = columns N = sum([len(T) for T in TT]) td = tabledata() for col in cols: if col.startswith('_'): continue if columns == 'fillzero': vv = [] # Handle NxD(xEx...) arrays: find first extant array, record its shape v0 = None for T in TT: if col in T.get_columns(): v0 = T.get(col) break shape = v0.shape[1:] for T in TT: if col in T.get_columns(): vv.append(T.get(col)) else: vv.append(np.zeros((len(T),)+shape, types[col])) V = np.concatenate(vv) td.set(col, V) continue v0 = TT[0].getcolumn(col) if isinstance(v0, np.ndarray): V = np.concatenate([T.getcolumn(col) for T in TT]) elif type(v0) is list: V = v0 for T in TT[1:]: V.extend(T.getcolumn(col)) elif np.isscalar(v0): #print('merge_tables: copying scalar from first table:', col, '=', v0) V = v0 else: raise RuntimeError("pyfits_utils.merge_tables: Don't know how to concatenate type: %s" % str(type(v0))) td.set(col, V) #td._columns = cols assert(td._length == N) return td def add_nonstructural_headers(fromhdr, tohdr): for card in fromhdr.ascardlist(): if ((card.key in ['SIMPLE','XTENSION', 'BITPIX', 'END', 'PCOUNT', 'GCOUNT', 'TFIELDS',]) or card.key.startswith('NAXIS') or card.key.startswith('TTYPE') or card.key.startswith('TFORM')): #card.key.startswith('TUNIT') or #card.key.startswith('TDISP')): #print('skipping card', card.key) continue cl = tohdr.ascardlist() if 'END' in cl.keys(): i = cl.index_of('END') else: i = len(cl) cl.insert(i, pyfits.Card(card.key, card.value, card.comment)) def cut_array(val, I, name=None, to=None): if type(I) is slice: if to is None: return val[I] else: val[I] = to return if isinstance(val, (np.ndarray, np.core.defchararray.chararray)): # You can't slice a two-dimensional, length-zero, numpy array, # with an empty array. if len(val) == 0: return val if to is None: # Indexing an array with an empty index array works, but # ONLY if it is of integer or bool type. # Check for __len__ because "I" can be a plain int too. if hasattr(I, '__len__') and len(I) == 0: return np.array([], val.dtype) return val[I] else: val[I] = to return inttypes = [int, np.int64, np.int32, np.int] if type(val) in [list,tuple] and type(I) in inttypes: if to is None: return val[I] else: val[I] = to return # HACK -- emulate numpy's boolean and int array slicing # (when "val" is a normal python list) if type(I) is np.ndarray and hasattr(I, 'dtype') and ((I.dtype.type in [bool, np.bool]) or (I.dtype == bool)): try: if to is None: return [val[i] for i,b in enumerate(I) if b] else: for i,(b,t) in enumerate(zip(I,to)): if b: val[i] = t return except: print('Failed to slice field', name) #setattr(rtn, name, val) #continue if type(I) is np.ndarray and all(I.astype(int) == I): if to is None: return [val[i] for i in I] else: #[val[i] = t for i,t in zip(I,to)] for i,t in zip(I,to): val[i] = t if (np.isscalar(I) and hasattr(I, 'dtype') and I.dtype in inttypes): if to is None: return val[int(I)] else: val[int(I)] = to return if hasattr(I, '__len__') and len(I) == 0: return [] print('Error slicing array:') print('array is') print(' type:', type(val)) print(' ', val) print('cut is') print(' type:', type(I)) print(' ', I) raise Exception('Error in cut_array') class tabledata(object): class td_iter(object): def __init__(self, td): self.td = td self.i = 0 def __iter__(self): return self def next(self): if self.i >= len(self.td): raise StopIteration X = self.td[self.i] self.i += 1 return X def __init__(self, header=None): self._length = 0 self._header = header self._columns = [] def __str__(self): return 'tabledata object with %i rows and %i columns' % (len(self), len([k for k in self.__dict__.keys() if not k.startswith('_')])) def __repr__(self): if len(self) == 1: vals = [] for k in self.columns(): v = self.get(k) if (not np.isscalar(v)) and len(v) == 1: v = v[0] vals.append(v) return '' % ( len(self), len(self.columns()), ', '.join(['%s=%s' % (k,v) for k,v in zip(self.columns(), vals)])) return '' % ( len(self), len(self.columns()), ', '.join(self.columns())) def about(self): keys = [k for k in self.__dict__.keys() if not k.startswith('_')] print('tabledata object with %i rows and %i columns:' % (len(self), len(keys))) keys.sort() for k in keys: print(' ', k, end=' ') v = self.get(k) print('(%s)' % (str(type(v))), end=' ') if np.isscalar(v): print(v, end=' ') elif hasattr(v, 'shape'): print('shape', v.shape, end=' ') elif hasattr(v, '__len__'): print('length', len(v), end=' ') else: print(v, end=' ') if hasattr(v, 'dtype'): print('dtype', v.dtype, end='') print() def __setattr__(self, name, val): object.__setattr__(self, name, val) #print('set', name, 'to', val) if (self._length == 0) and (not (name.startswith('_'))) and hasattr(val, '__len__') and len(val) != 0 and type(val) != str: self._length = len(val) if hasattr(self, '_columns') and not name in self._columns: self._columns.append(name) def set(self, name, val): self.__setattr__(name, val) def getcolumn(self, name): return self.__dict__[name] #except: # return self.__dict__[name.lower()] def get(self, name): return self.getcolumn(name) # Returns the list of column names, as they were ordered in the input FITS or text table. def get_columns(self, internal=False): if internal: return self._columns[:] return [x for x in self._columns if not x.startswith('_')] # Returns the original FITS header. def get_header(self): return self._header def to_dict(self): return dict([(k,self.get(k)) for k in self.columns()]) def to_np_arrays(self): for col in self.get_columns(): self.set(col, np.array(self.get(col))) def columns(self): return [k for k in self.__dict__.keys() if not k.startswith('_')] def __len__(self): return self._length def delete_column(self, c): del self.__dict__[c] self._columns.remove(c) def rename(self, c_old, c_new): setattr(self, c_new, getattr(self, c_old)) self.delete_column(c_old) def __setitem__(self, I, O): #### TEST for name,val in self.__dict__.items(): if name.startswith('_'): continue cut_array(val, I, name, to=O.get(name)) return #### if type(I) is slice: print('I:', I) # HACK... "[:]" -> slice(None, None, None) if I.start is None and I.stop is None and I.step is None: I = np.arange(len(self)) else: I = np.arange(I.start, I.stop, I.step) for name,val in self.__dict__.items(): if name.startswith('_'): continue # ? if np.isscalar(val): self.set(name, O.get(name)) continue try: val[I] = O.get(name) except Exception: # HACK -- emulate numpy's boolean and int array slicing... ok = False if not ok: print('Error in slicing an astrometry.util.pyfits_utils.table_data object:') import pdb; pdb.set_trace() print('While setting member:', name) print(' setting elements:', I) print(' from obj', O) print(' target type:', type(O.get(name))) print(' dest type:', type(val)) print('index type:', type(I)) if hasattr(I, 'dtype'): print(' index dtype:', I.dtype) print('my length:', self._length) raise Exception('error in fits_table indexing') def copy(self): rtn = tabledata() for name,val in self.__dict__.items(): if name.startswith('_'): continue if np.isscalar(val): #print('copying scalar', name) rtn.set(name, val) continue if type(val) in [np.ndarray, np.core.defchararray.chararray]: #print('copying numpy array', name) rtn.set(name, val.copy()) continue if type(val) in [list,tuple]: #print('copying list', name) rtn.set(name, val[:]) continue print('in pyfits_utils: copy(): can\'t copy', name, '=', val[:10], 'type', type(val)) rtn._header = self._header if hasattr(self, '_columns'): rtn._columns = [c for c in self._columns] return rtn def cut(self, I): for name,val in self.__dict__.items(): if name.startswith('_'): continue if np.isscalar(val): continue C = cut_array(val, I, name) self.set(name, C) self._length = len(C) def __getitem__(self, I): rtn = self.__class__() for name,val in self.__dict__.items(): if name.startswith('_'): continue if np.isscalar(val): rtn.set(name, val) continue try: C = cut_array(val, I, name) except: print('Error in cut_array() via __getitem__, name', name) raise rtn.set(name, C) if np.isscalar(I): rtn._length = 1 else: rtn._length = len(getattr(rtn, name)) rtn._header = self._header if hasattr(self, '_columns'): rtn._columns = [c for c in self._columns] return rtn def __iter__(self): return tabledata.td_iter(self) def append(self, X): for name,val in self.__dict__.items(): if name.startswith('_'): continue if np.isscalar(val): continue try: val2 = X.getcolumn(name) if type(val) is list: newX = val + val2 else: newX = np.append(val, val2, axis=0) self.set(name, newX) self._length = len(newX) except Exception: print('exception appending element "%s"' % name) raise def write_to(self, fn, columns=None, header='default', primheader=None, use_fitsio=True, append=False, append_to_hdu=None): fitsio = None if use_fitsio: try: import fitsio except: pass if columns is None: columns = self.get_columns() if fitsio: arrays = [self.get(c) for c in columns] fits = fitsio.FITS(fn, 'rw', clobber=(not append)) arrays = [np.array(a) if isinstance(a,list) else a for a in arrays] if header == 'default': header = None try: if append and append_to_hdu is not None: fits[append_to_hdu].append(arrays, names=columns, header=header) else: if primheader is not None: fits.write(None, header=primheader) fits.write(arrays, names=columns, header=header) fits.close() except: print('Failed to write FITS table') print('Columns:') for c,a in zip(columns, arrays): print(' ', c, type(a), end='') try: print(a.dtype, a.shape, end='') except: pass print() raise return fc = self.to_fits_columns(columns) T = pyfits.new_table(fc) if header == 'default': header = self._header if header is not None: add_nonstructural_headers(header, T.header) if primheader is not None: P = pyfits.PrimaryHDU() add_nonstructural_headers(primheader, P.header) pyfits.HDUList([P, T]).writeto(fn, clobber=True) else: pyfits_writeto(T, fn) writeto = write_to def normalize(self, columns=None): if columns is None: columns = self.get_columns() for c in columns: X = self.get(c) X = normalize_column(X) self.set(c, X) def to_fits_columns(self, columns=None): cols = [] fmap = {np.float64:'D', np.float32:'E', np.int32:'J', np.int64:'K', np.uint8:'B', # np.int16:'I', #np.bool:'X', #np.bool_:'X', np.bool:'L', np.bool_:'L', np.string_:'A', } if columns is None: columns = self.get_columns() for name in columns: if not name in self.__dict__: continue val = self.get(name) if type(val) in [list, tuple]: val = np.array(val) try: val = normalize_column(val) except: pass try: fitstype = fmap.get(val.dtype.type, 'D') except: print('Table column "%s" has no "dtype"; skipping' % name) continue if fitstype == 'X': # pack bits... pass if len(val.shape) > 1: fitstype = '%i%s' % (val.shape[1], fitstype) elif fitstype == 'A' and val.itemsize > 1: # strings fitstype = '%i%s' % (val.itemsize, fitstype) else: fitstype = '1'+fitstype #print('fits type', fitstype) try: col = pyfits.Column(name=name, array=val, format=fitstype) except: print('Error converting column', name, 'to a pyfits column:') print('fitstype:', fitstype) try: print('numpy dtype:') print(val.dtype) except: pass print('value:', val) raise cols.append(col) return cols def add_columns_from(self, X, dup=None): assert(len(self) == len(X)) mycols = self.get_columns() for c in X.get_columns(): if c in mycols: if dup is None: print('Not copying existing column', c) continue else: self.set(dup + c, X.get(c)) else: self.set(c, X.get(c)) def normalize_column(X): try: dt = X.dtype except: return X if dt.byteorder in ['>','<']: # go native X = X.astype(dt.newbyteorder('N')) return X def fits_table(dataorfn=None, rows=None, hdunum=1, hdu=None, ext=None, header='default', columns=None, column_map=None, lower=True, mmap=True, normalize=True, use_fitsio=True, tabledata_class=tabledata): ''' If 'columns' (a list of strings) is passed, only those columns will be read; otherwise all columns will be read. ''' if dataorfn is None: return tabledata_class(header=header) fitsio = None if use_fitsio: try: import fitsio except: pass pf = None hdr = None # aliases if hdu is not None: hdunum = hdu if ext is not None: hdunum = ext if isinstance(dataorfn, str): if fitsio: F = fitsio.FITS(dataorfn) data = F[hdunum] hdr = data.read_header() else: global pyfits pf = pyfits.open(dataorfn, memmap=mmap) data = pf[hdunum].data if header == 'default': hdr = pf[hdunum].header del pf pf = None else: data = dataorfn if data is None: return None T = tabledata_class(header=hdr) T._columns = [] if fitsio: isrecarray = False try: import pyfits.core # in a try/catch in case pyfits isn't available isrecarray = (type(data) == pyfits.core.FITS_rec) except: try: from astropy.io import fits as pyfits isrecarray = (type(data) == pyfits.core.FITS_rec) except: #import traceback #traceback.print_exc() pass if not isrecarray: try: import pyfits.fitsrec isrecarray = (type(data) == pyfits.fitsrec.FITS_rec) except: try: from astropy.io import fits as pyfits isrecarray = (type(data) == pyfits.fitsrec.FITS_rec) except: import traceback traceback.print_exc() pass #if not isrecarray: # if type(data) == np.recarray: # isrecarray = True if fitsio and not isrecarray: # fitsio sorts the rows and de-duplicates them, so compute # permutation vector 'I' to undo that. I = None if rows is not None: rows,I = np.unique(rows, return_inverse=True) if type(data) == np.ndarray: dd = data if columns is None: columns = data.dtype.fields.keys() else: if data.get_exttype() == 'IMAGE_HDU': # This can happen on empty tables (eg, empty SDSS photoObjs) return None try: dd = data.read(rows=rows, columns=columns, lower=True) except: import sys print('Error reading from FITS object', type(data), data, 'dataorfn', dataorfn, file=sys.stderr) raise if dd is None: return None if columns is None: try: columns = data.get_colnames() except: columns = data.colnames if lower: columns = [c.lower() for c in columns] for c in columns: X = dd[c.lower()] if I is not None: # apply permutation X = X[I] if column_map is not None: c = column_map.get(c, c) if lower: c = c.lower() T.set(c, X) else: if columns is None: columns = data.dtype.names for c in columns: col = data.field(c) if rows is not None: col = col[rows] if normalize: col = normalize_column(col) if column_map is not None: c = column_map.get(c, c) if lower: c = c.lower() T.set(c, col) return T table_fields = fits_table ### FIXME -- it would be great to have a streaming text2fits as well! ### (fitsio does this fairly easily) def streaming_text_table(forfn, skiplines=0, split=None, maxcols=None, headerline=None, coltypes=None, intvalmap={'NaN':-1000000, '':-1000000}, floatvalmap={'': np.nan}, skipcomments=True): # unimplemented assert(maxcols is None) f = None if isinstance(forfn, str): f = open(forfn) print('Reading file', forfn) else: f = forfn for i in range(skiplines): x = f.readline() print('Skipping line:', x) if headerline is None: headerline = f.readline().strip() print('Header:', headerline) header = headerline if header[0] == '#': header = header[1:] if split is None: colnames = header.split() else: colnames = header.split(split) print('Column names:', colnames) if coltypes is not None: if len(coltypes) != len(colnames): print('Column names:', len(colnames)) print('Column types:', len(coltypes)) raise Exception('Column names vs types length mismatch: %i vs %i' % (len(colnames), len(coltypes))) else: coltypes = [str] * len(colnames) Nchunk = 100000 alldata = [] ncomplain = 0 i0 = 0 while True: import time t0 = time.clock() # Create empty data arrays data = [[None] * Nchunk for t in coltypes] j = 0 lines = [] for i,line in zip(xrange(Nchunk), f): line = line.strip() if line.startswith('#') and skipcomments: print('Skipping comment line:') print(line) print() continue if split is None: words = line.split() else: words = line.split(split) if len(words) != len(colnames): ncomplain += 1 if ncomplain > 10: continue print('Expected to find %i columns of data to match headers (%s) in row %i; got %i; skipping line' % (len(colnames), ', '.join(colnames), i+i0, len(words))) print(' "%s"' % line) continue for d,w in zip(data, words): d[j] = w j += 1 nread = i+1 goodrows = j t1 = time.clock() floattypes = [float,np.float32,np.float64] inttypes = [int, np.int16, np.int32, np.int64] for dat,typ in zip(data, coltypes): if typ in floattypes: valmap = floatvalmap elif typ in inttypes: valmap = intvalmap else: continue # HACK -- replace with stringified versions of bad-values valmap = dict([(k,str(v)) for k,v in valmap.items()]) for i,d in enumerate(dat): #dat[i] = valmap.get(d,d) # try: # dat[i] = valmap[d] # except KeyError: # pass if d in valmap: dat[i] = valmap[d] # null out blank values if d is not None and len(d.strip()) == 0: dat[i] = valmap[''] t2 = time.clock() # trim to valid rows data = [dat[:goodrows] for dat in data] # convert try: data = [np.array(dat).astype(typ) for dat,typ in zip(data, coltypes)] except: for name,dat,typ in zip(colnames, data, coltypes): print('Column', name) np.array(dat).astype(typ) raise t3 = time.clock() #print 'Reading & splitting:', t1-t0 #print 'Bad values:', t2-t1 #print 'Conversion:', t3-t2 #print 'Total:', t3-t0 # print 'Read', i+1, 'lines' # print 'Read', j, 'valid lines' print('Read line', i0 + nread) alldata.append(data) i0 += nread if nread != Nchunk: break if ncomplain > 10: print('Total of', ncomplain, 'bad lines') # merge chunks T = tabledata() for name in reversed(colnames): print('Merging', name) xx = [data.pop() for data in alldata] print('lengths:', [len(x) for x in xx]) xx = np.hstack(xx) print('total:', len(xx)) print('type:', xx.dtype) T.set(name, xx) T._columns = colnames return T # ultra-brittle text table parsing. def text_table_fields(forfn, text=None, skiplines=0, split=None, trycsv=True, maxcols=None, headerline=None, coltypes=None, intvalmap={'NaN':-1000000, '':-1000000}, floatvalmap={}): if text is None: f = None if isinstance(forfn, str): f = open(forfn) print('Reading file', forfn) data = f.read() f.close() else: data = forfn.read() print('Read', len(data), 'bytes') else: data = text # replace newline variations with a single newline character print('Replacing line endings') data = data.replace('\r\n','\n') # windows data = data.replace('\r','\n') # mac os print('Splitting lines') txtrows = data.split('\n') print('Got', len(txtrows), 'lines') print('First line:', txtrows[0]) print('Last line:', txtrows[-1]) if txtrows[-1] == '': print('Trimming last line.') txtrows = txtrows[:-1] print('Last line now:', txtrows[-1]) if skiplines != 0: txtrows = txtrows[skiplines:] print('Skipped', skiplines, 'kept', len(txtrows)) if headerline is None: # column names are in the first (un-skipped) line. header = txtrows.pop(0) if header[0] == '#': header = header[1:] else: header = headerline header = header.split() if len(header) == 0: raise Exception('Expected to find column names in the first row of text; got \"%s\".' % txt) print('Header:', len(header), 'columns') #assert(len(header) >= 1) if trycsv and (split is None) and (len(header) == 1) and (',' in header[0]): # try CSV header = header[0].split(',') colnames = header if coltypes is not None: if len(coltypes) != len(colnames): raise Exception('Column types: length %i, vs column names, length %i' % (len(coltypes), len(colnames))) fields = tabledata() txtrows = [r for r in txtrows if not r.startswith('#')] print('Kept', len(txtrows), 'non-commented rows') coldata = [[] for x in colnames] ncomplain = 0 for i,r in enumerate(txtrows): if i and (i % 1000000 == 0): print('Row', i) if maxcols is not None: r = r[:maxcols] if split is None: cols = r.split() else: cols = r.split(split) if len(cols) == 0: continue if trycsv and (split is None) and (len(cols) != len(colnames)) and (',' in r): # try to parse as CSV. cols = r.split(',') if len(cols) != len(colnames): #raise Exception('Expected to find %i columns of data to match headers (%s) in row %i; got %i\n "%s"' % (len(colnames), ', '.join(colnames), i, len(cols), r)) ncomplain += 1 if ncomplain > 10: continue print('Expected to find %i columns of data to match headers (%s) in row %i; got %i' % (len(colnames), ', '.join(colnames), i, len(cols))) print(' "%s"' % (r)) continue if coltypes is not None: floattypes = [float,np.float32,np.float64] for i,(cd,c,t) in enumerate(zip(coldata, cols, coltypes)): if t in floattypes: if len(c) == 0: cd.append(np.nan) continue c = floatvalmap.get(c, c) if t in [int, np.int32, np.int64]: try: cd.append(t(c)) except: if c in intvalmap: cd.append(intvalmap[c]) else: raise else: cd.append(t(c)) else: for cd,c in zip(coldata, cols): cd.append(c) if ncomplain > 10: print('Total of', ncomplain, 'bad lines') if coltypes is None: for i,col in enumerate(coldata): isint = True isfloat = True for x in col: try: float(x) except: isfloat = False #isint = False #break try: int(x, 0) except: isint = False #break if not isint and not isfloat: break if isint: isfloat = False if isint: vals = [int(x, 0) for x in col] elif isfloat: vals = [float(x) for x in col] else: vals = col fields.set(colnames[i].lower(), np.array(vals)) fields._length = len(vals) else: for i,(col,ct) in enumerate(zip(coldata, coltypes)): fields.set(colnames[i].lower(), np.array(col)) #, dtype=ct)) fields._columns = [c.lower() for c in colnames] return fields astrometry.net-0.67/util/fits2fits.py000755 000765 000024 00000010764 12651445460 020045 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import sys import re import logging if __name__ == '__main__': # According to the python sys.path documentation, the directory containing # the main script appears as sys.path[0]. utildir = sys.path[0] assert(os.path.basename(utildir) == 'util') andir = os.path.dirname(utildir) #assert(os.path.basename(andir) == 'astrometry') rootdir = os.path.dirname(andir) # Here we put the "astrometry" and "astrometry/.." directories at the front # of the path: astrometry to pick up pyfits, and .. to pick up astrometry itself. sys.path.insert(1, andir) sys.path.insert(2, rootdir) try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from astrometry.util.fits import pyfits_writeto def fits2fits(infile, outfile, verbose=False, fix_idr=False): """ Returns: error string, or None on success. """ if fix_idr: from astrometry.util.fix_sdss_idr import fix_sdss_idr # Read input file. fitsin = pyfits.open(infile) # Print out info about input file. if verbose: fitsin.info() for i, hdu in enumerate(fitsin): if fix_idr: hdu = fitsin[i] = fix_sdss_idr(hdu) # verify() fails when a keywords contains invalid characters, # so go through the primary header and fix them by converting invalid # characters to '_' hdr = hdu.header logging.info('Header has %i cards' % len(hdr)) # allowed characters (FITS standard section 5.1.2.1) pat = re.compile(r'[^A-Z0-9_\-]') newcards = [] for c in hdr.cards: k = c.keyword # new keyword: knew = pat.sub('_', k) if k != knew: logging.debug('Replacing illegal keyword %s by %s' % (k, knew)) # it seems pyfits is not clever enough to notice this... if len(knew) > 8: knew = 'HIERARCH ' + knew newcards.append(pyfits.Card(keyword=knew, value=c.value, comment=c.comment)) hdu.header = pyfits.Header(newcards) # Fix input header hdu.verify('fix') # UGH! Work around stupid pyfits handling of scaled data... # (it fails to round-trip scaled data correctly!) bzero = hdr.get('BZERO', None) bscale = hdr.get('BSCALE', None) if (bzero is not None and bscale is not None and (bzero != 0. or bscale != 1.)): logging.debug('Scaling to bzero=%g, bscale=%g' % (bzero, bscale)) hdu.scale('int16', '', bscale, bzero) # Describe output file we're about to write... if verbose: print 'Outputting:' fitsin.info() try: pyfits_writeto(fitsin, outfile, output_verify='warn') except pyfits.VerifyError, ve: return ('Verification of output file failed: your FITS file is probably too broken to automatically fix.' + ' Error message is:' + str(ve)) fitsin.close() return None def main(): from optparse import OptionParser parser = OptionParser() parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='be chatty') parser.add_option('-s', '--fix-sdss', action='store_true', dest='fix_idr', help='fix SDSS idR files') (options, args) = parser.parse_args() if len(args) != 2: print 'Usage: fits2fits.py [--verbose] input.fits output.fits' return -1 logformat = '%(message)s' if options.verbose: logging.basicConfig(level=logging.DEBUG, format=logformat) else: logging.basicConfig(level=logging.INFO, format=logformat) logging.raiseExceptions = False infn = args[0] outfn = args[1] errmsg = fits2fits(infn, outfn, fix_idr=options.fix_idr, verbose=options.verbose) if errmsg is not None: print 'fits2fits.py failed:', errmsg return -1 return 0 if __name__ == '__main__': sys.exit(main()) astrometry.net-0.67/util/fitsbin.c000644 000765 000024 00000037465 12651445460 017364 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "keywords.h" #include "fitsbin.h" #include "fitsioutils.h" #include "ioutils.h" #include "fitsfile.h" #include "errors.h" #include "an-endian.h" #include "tic.h" #include "log.h" // For in-memory: storage of previously-written extensions. struct fitsext { qfits_header* header; char* tablename; bl* items; }; typedef struct fitsext fitsext_t; qfits_header* fitsbin_get_header(const fitsbin_t* fb, int ext) { assert(fb->fits); return anqfits_get_header(fb->fits, ext); } int fitsbin_get_datinfo(fitsbin_t* fb, int ext, off_t* pstart, off_t* psize) { assert(fb->fits); if (pstart) *pstart = anqfits_data_start(fb->fits, ext); if (psize) *psize = anqfits_data_size(fb->fits, ext); return 0; } const qfits_table* fitsbin_get_table_const(fitsbin_t* fb, int ext) { assert(fb->fits); return anqfits_get_table_const(fb->fits, ext); } int fitsbin_n_ext(const fitsbin_t* fb) { assert(fb->fits); return anqfits_n_ext(fb->fits); } FILE* fitsbin_get_fid(fitsbin_t* fb) { return fb->fid; } static int nchunks(fitsbin_t* fb) { return bl_size(fb->chunks); } static fitsbin_chunk_t* get_chunk(fitsbin_t* fb, int i) { if (i >= bl_size(fb->chunks)) { ERROR("Attempt to get chunk %i from a fitsbin with only %zu chunks", i, bl_size(fb->chunks)); return NULL; } if (i < 0) { ERROR("Attempt to get fitsbin chunk %i", i); return NULL; } return bl_access(fb->chunks, i); } static fitsbin_t* new_fitsbin(const char* fn) { fitsbin_t* fb; fb = calloc(1, sizeof(fitsbin_t)); if (!fb) return NULL; fb->chunks = bl_new(4, sizeof(fitsbin_chunk_t)); if (!fn) // Can't make it NULL or qfits freaks out. fb->filename = strdup(""); else fb->filename = strdup(fn); return fb; } static anbool in_memory(fitsbin_t* fb) { return fb->inmemory; } static void free_chunk(fitsbin_chunk_t* chunk) { if (!chunk) return; free(chunk->tablename_copy); if (chunk->header) qfits_header_destroy(chunk->header); if (chunk->map) { if (munmap(chunk->map, chunk->mapsize)) { SYSERROR("Failed to munmap fitsbin chunk"); } } } void fitsbin_chunk_init(fitsbin_chunk_t* chunk) { memset(chunk, 0, sizeof(fitsbin_chunk_t)); } void fitsbin_chunk_clean(fitsbin_chunk_t* chunk) { free_chunk(chunk); } void fitsbin_chunk_reset(fitsbin_chunk_t* chunk) { fitsbin_chunk_clean(chunk); fitsbin_chunk_init(chunk); } fitsbin_chunk_t* fitsbin_get_chunk(fitsbin_t* fb, int chunk) { return get_chunk(fb, chunk); } int fitsbin_n_chunks(fitsbin_t* fb) { return nchunks(fb); } fitsbin_chunk_t* fitsbin_add_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk) { chunk = bl_append(fb->chunks, chunk); chunk->tablename_copy = strdup(chunk->tablename); chunk->tablename = chunk->tablename_copy; return chunk; } off_t fitsbin_get_data_start(fitsbin_t* fb, fitsbin_chunk_t* chunk) { return chunk->header_end; } int fitsbin_close_fd(fitsbin_t* fb) { if (!fb) return 0; if (fb->fid) { if (fclose(fb->fid)) { SYSERROR("Error closing fitsbin file"); return -1; } fb->fid = NULL; } return 0; } int fitsbin_close(fitsbin_t* fb) { int i; int rtn = 0; if (!fb) return rtn; rtn = fitsbin_close_fd(fb); if (fb->primheader) qfits_header_destroy(fb->primheader); for (i=0; idata); } free_chunk(get_chunk(fb, i)); } free(fb->filename); if (fb->chunks) bl_free(fb->chunks); if (in_memory(fb)) { for (i=0; iextensions); i++) { fitsext_t* ext = bl_access(fb->extensions, i); bl_free(ext->items); qfits_header_destroy(ext->header); free(ext->tablename); } bl_free(fb->extensions); bl_free(fb->items); } if (fb->tables) { for (i=0; iNext; i++) { if (!fb->tables[i]) continue; qfits_table_close(fb->tables[i]); } free(fb->tables); } free(fb); return rtn; } int fitsbin_write_primary_header(fitsbin_t* fb) { if (in_memory(fb)) return 0; return fitsfile_write_primary_header(fb->fid, fb->primheader, &fb->primheader_end, fb->filename); } int fitsbin_write_primary_header_to(fitsbin_t* fb, FILE* fid) { off_t end; return fitsfile_write_primary_header(fid, fb->primheader, &end, ""); } qfits_header* fitsbin_get_primary_header(const fitsbin_t* fb) { return fb->primheader; } void fitsbin_set_primary_header(fitsbin_t* fb, const qfits_header* hdr) { qfits_header_destroy(fb->primheader); fb->primheader = qfits_header_copy(hdr); } int fitsbin_fix_primary_header(fitsbin_t* fb) { if (in_memory(fb)) return 0; return fitsfile_fix_primary_header(fb->fid, fb->primheader, &fb->primheader_end, fb->filename); } qfits_header* fitsbin_get_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_table* table; int tablesize; qfits_header* hdr; int ncols = 1; char* fn = NULL; if (chunk->header) return chunk->header; // Create the new header. if (fb) fn = fb->filename; if (!fn) fn = ""; // the table header tablesize = chunk->itemsize * chunk->nrows * ncols; table = qfits_table_new(fn, QFITS_BINTABLE, tablesize, ncols, chunk->nrows); assert(table); qfits_col_fill(table->col, chunk->itemsize, 0, 1, chunk->forced_type ? chunk->forced_type : TFITS_BIN_TYPE_A, chunk->tablename, "", "", "", 0, 0, 0, 0, 0); hdr = qfits_table_ext_header_default(table); qfits_table_close(table); chunk->header = hdr; return hdr; } static int write_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk, int flipped) { int N; if (fitsbin_write_chunk_header(fb, chunk)) { return -1; } N = chunk->nrows; if (!flipped) { if (fitsbin_write_items(fb, chunk, chunk->data, chunk->nrows)) return -1; } else { // endian-flip words of the data of length "flipped", write them, // then flip them back to the way they were. // NO, copy to temp array, flip it, write it. // this is slow, but it won't be run very often... int i, j; int nper = chunk->itemsize / flipped; char tempdata[chunk->itemsize]; assert(chunk->itemsize >= flipped); assert(nper * flipped == chunk->itemsize); for (i=0; idata + i*chunk->itemsize, chunk->itemsize); // swap it... for (j=0; jnrows -= N; if (fitsbin_fix_chunk_header(fb, chunk)) { return -1; } return 0; } int fitsbin_write_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk) { return write_chunk(fb, chunk, 0); } int fitsbin_write_chunk_to(fitsbin_t* fb, fitsbin_chunk_t* chunk, FILE* fid) { if (fitsbin_write_chunk_header_to(fb, chunk, fid) || fitsbin_write_items_to(chunk, chunk->data, chunk->nrows, fid)) return -1; return 0; } int fitsbin_write_chunk_flipped(fitsbin_t* fb, fitsbin_chunk_t* chunk, int wordsize) { return write_chunk(fb, chunk, wordsize); } int fitsbin_write_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_header* hdr; hdr = fitsbin_get_chunk_header(fb, chunk); if (in_memory(fb)) return 0; if (fitsfile_write_header(fb->fid, hdr, &chunk->header_start, &chunk->header_end, -1, fb->filename)) { return -1; } return 0; } int fitsbin_write_chunk_header_to(fitsbin_t* fb, fitsbin_chunk_t* chunk, FILE* fid) { off_t start, end; qfits_header* hdr; hdr = fitsbin_get_chunk_header(fb, chunk); if (fitsfile_write_header(fid, hdr, &start, &end, -1, "")) return -1; return 0; } int fitsbin_fix_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { // update NAXIS2 to reflect the number of rows written. fits_header_mod_int(chunk->header, "NAXIS2", chunk->nrows, NULL); // HACK -- leverage the fact that this is the last function called for each chunk... if (in_memory(fb)) { // Save this chunk. fitsext_t ext; // table, header, items if (!fb->extensions) fb->extensions = bl_new(4, sizeof(fitsext_t)); ext.header = qfits_header_copy(chunk->header); ext.items = fb->items; ext.tablename = strdup(chunk->tablename); bl_append(fb->extensions, &ext); fb->items = NULL; return 0; } if (fitsfile_fix_header(fb->fid, chunk->header, &chunk->header_start, &chunk->header_end, -1, fb->filename)) { return -1; } return 0; } int fitsbin_write_items_to(fitsbin_chunk_t* chunk, void* data, int N, FILE* fid) { if (fwrite(data, chunk->itemsize, N, fid) != N) { SYSERROR("Failed to write %i items", N); return -1; } return 0; } int fitsbin_write_items(fitsbin_t* fb, fitsbin_chunk_t* chunk, void* data, int N) { if (in_memory(fb)) { int i; char* src = data; if (!fb->items) fb->items = bl_new(1024, chunk->itemsize); for (i=0; iitems, src); src += chunk->itemsize; } } else { if (fitsbin_write_items_to(chunk, data, N, fb->fid)) return -1; } chunk->nrows += N; return 0; } int fitsbin_write_item(fitsbin_t* fb, fitsbin_chunk_t* chunk, void* data) { return fitsbin_write_items(fb, chunk, data, 1); } // Like fitsioutils.c : fits_find_table_column(), but using our cache... static int find_table_column(fitsbin_t* fb, const char* colname, off_t* pstart, off_t* psize, int* pext) { int i; for (i=1; iNext; i++) { int c; const qfits_table* table = fitsbin_get_table_const(fb, i); if (!table) continue; c = fits_find_column(table, colname); if (c == -1) continue; if (fitsbin_get_datinfo(fb, i, pstart, psize)) { ERROR("error getting start/size for ext %i in file %s.\n", i, fb->filename); return -1; } if (pext) *pext = i; return 0; } debug("searched %i extensions in file %s but didn't find a table with a column \"%s\".\n", fb->Next, fb->filename, colname); return -1; } static int read_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk) { off_t tabstart=0, tabsize=0; int ext; size_t expected = 0; int mode, flags; off_t mapstart; int mapoffset; int table_nrows; int table_rowsize; fitsext_t* inmemext = NULL; if (in_memory(fb)) { int i; anbool gotit = FALSE; for (i=0; iextensions); i++) { inmemext = bl_access(fb->extensions, i); if (strcasecmp(inmemext->tablename, chunk->tablename)) continue; // found it! gotit = TRUE; break; } if (!gotit && chunk->required) { ERROR("Couldn't find table \"%s\"", chunk->tablename); return -1; } table_nrows = bl_size(inmemext->items); table_rowsize = bl_datasize(inmemext->items); chunk->header = qfits_header_copy(inmemext->header); } else { //double t0; //t0 = timenow(); if (find_table_column(fb, chunk->tablename, &tabstart, &tabsize, &ext)) { if (chunk->required) ERROR("Couldn't find table \"%s\" in file \"%s\"", chunk->tablename, fb->filename); return -1; } //debug("fits_find_table_column(%s) took %g ms\n", chunk->tablename, 1000 * (timenow() - t0)); //t0 = timenow(); chunk->header = fitsbin_get_header(fb, ext); if (!chunk->header) { ERROR("Couldn't read FITS header from file \"%s\" extension %i", fb->filename, ext); return -1; } //debug("reading chunk header (%s) took %g ms\n", chunk->tablename, 1000 * (timenow() - t0)); table_nrows = fitsbin_get_table_const(fb, ext)->nr; table_rowsize = fitsbin_get_table_const(fb, ext)->tab_w; } if (!chunk->itemsize) chunk->itemsize = table_rowsize; if (!chunk->nrows) chunk->nrows = table_nrows; if (chunk->callback_read_header && chunk->callback_read_header(fb, chunk)) { ERROR("fitsbin callback_read_header failed"); return -1; } if (chunk->nrows != table_nrows) { ERROR("Table %s in file %s: expected %i data items (ie, rows), found %i", chunk->tablename, fb->filename, chunk->nrows, table_nrows); return -1; } if (chunk->itemsize != table_rowsize) { ERROR("Table %s in file %s: expected data size %i (ie, row width in bytes), found %i", chunk->tablename, fb->filename, chunk->itemsize, table_rowsize); return -1; } expected = (size_t)chunk->itemsize * (size_t)chunk->nrows; if (in_memory(fb)) { int i; chunk->data = malloc(expected); for (i=0; inrows; i++) { memcpy(((char*)chunk->data) + (size_t)i * (size_t)chunk->itemsize, bl_access(inmemext->items, i), chunk->itemsize); } // delete inmemext->items ? } else { if (fits_bytes_needed(expected) != tabsize) { ERROR("Expected table size (%zu => %i FITS blocks) is not equal to " "size of table \"%s\" (%zu => %i FITS blocks).", expected, fits_blocks_needed(expected), chunk->tablename, (size_t)tabsize, (int)(tabsize / (off_t)FITS_BLOCK_SIZE)); return -1; } get_mmap_size(tabstart, tabsize, &mapstart, &(chunk->mapsize), &mapoffset); mode = PROT_READ; flags = MAP_SHARED; chunk->map = mmap(0, chunk->mapsize, mode, flags, fileno(fb->fid), mapstart); if (chunk->map == MAP_FAILED) { SYSERROR("Couldn't mmap file \"%s\"", fb->filename); chunk->map = NULL; return -1; } chunk->data = chunk->map + mapoffset; } return 0; } int fitsbin_read_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk) { if (read_chunk(fb, chunk)) return -1; fitsbin_add_chunk(fb, chunk); return 0; } int fitsbin_read(fitsbin_t* fb) { int i; for (i=0; irequired) goto bailout; } } return 0; bailout: return -1; } char* fitsbin_get_filename(const fitsbin_t* fb) { return fb->filename; } fitsbin_t* fitsbin_open_fits(anqfits_t* fits) { fitsbin_t* fb; fb = new_fitsbin(fits->filename); if (!fb) return fb; fb->fid = fopen(fits->filename, "rb"); if (!fb->fid) { SYSERROR("Failed to open file \"%s\"", fits->filename); goto bailout; } fb->Next = anqfits_n_ext(fits); debug("N ext: %i\n", fb->Next); fb->fits = fits; fb->primheader = fitsbin_get_header(fb, 0); if (!fb->primheader) { ERROR("Couldn't read primary FITS header from file \"%s\"", fits->filename); goto bailout; } return fb; bailout: fitsbin_close(fb); return NULL; } fitsbin_t* fitsbin_open(const char* fn) { anqfits_t* fits; fits = anqfits_open(fn); if (!fits) { ERROR("Failed to open file \"%s\"", fn); return NULL; } return fitsbin_open_fits(fits); } fitsbin_t* fitsbin_open_in_memory() { fitsbin_t* fb; fb = new_fitsbin(NULL); if (!fb) return NULL; fb->primheader = qfits_table_prim_header_default(); fb->inmemory = TRUE; return fb; } int fitsbin_switch_to_reading(fitsbin_t* fb) { int i; // clear the current chunk data?? for (i=0; iheader) qfits_header_destroy(chunk->header); } return 0; } fitsbin_t* fitsbin_open_for_writing(const char* fn) { fitsbin_t* fb; fb = new_fitsbin(fn); if (!fb) return NULL; fb->primheader = qfits_table_prim_header_default(); fb->fid = fopen(fb->filename, "wb"); if (!fb->fid) { SYSERROR("Couldn't open file \"%s\" for output", fb->filename); fitsbin_close(fb); return NULL; } return fb; } astrometry.net-0.67/util/fitsfile.c000644 000765 000024 00000004666 12651445460 017530 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "fitsfile.h" #include "fitsioutils.h" #include "errors.h" int fitsfile_pad_with(FILE* fid, char pad) { return fits_pad_file_with(fid, pad); } int fitsfile_write_header(FILE* fid, qfits_header* hdr, off_t* start_offset, off_t* end_offset, int ext, const char* fn) { assert(fid); assert(hdr); assert(end_offset); // Pad out to FITS boundary. fits_pad_file(fid); *start_offset = ftello(fid); if (qfits_header_dump(hdr, fid)) { if (ext == -1) ERROR("Failed to write FITS extension header to file %s", fn); else ERROR("Failed to write header for extension %i to file %s", ext, fn); return -1; } *end_offset = ftello(fid); return 0; } int fitsfile_fix_header(FILE* fid, qfits_header* hdr, off_t* start_offset, off_t* end_offset, int ext, const char* fn) { off_t offset; off_t new_header_end; off_t old_header_end; offset = ftello(fid); fseeko(fid, *start_offset, SEEK_SET); old_header_end = *end_offset; if (fitsfile_write_header(fid, hdr, start_offset, end_offset, ext, fn)) return -1; new_header_end = *end_offset; if (new_header_end != old_header_end) { if (ext == -1) ERROR("Error: FITS header for file %s, used to end at %lu, " "now it ends at %lu. Data loss is likely!", fn, (unsigned long)old_header_end, (unsigned long)new_header_end); else ERROR("Error: FITS header for file %s, ext %i, used to end at %lu, " "now it ends at %lu. Data loss is likely!", fn, ext, (unsigned long)old_header_end, (unsigned long)new_header_end); return -1; } fseek(fid, offset, SEEK_SET); // Pad out to FITS boundary. fits_pad_file(fid); return 0; } int fitsfile_write_primary_header(FILE* fid, qfits_header* hdr, off_t* end_offset, const char* fn) { off_t zero = 0; return fitsfile_write_header(fid, hdr, &zero, end_offset, 0, fn); } int fitsfile_fix_primary_header(FILE* fid, qfits_header* hdr, off_t* end_offset, const char* fn) { off_t zero = 0; return fitsfile_fix_header(fid, hdr, &zero, end_offset, 0, fn); } astrometry.net-0.67/util/fitsgetext.c000644 000765 000024 00000014550 12651445460 020102 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "an-bool.h" #include "anqfits.h" #include "bl.h" #include "ioutils.h" #include "log.h" #include "fitsioutils.h" #include "errors.h" char* OPTIONS = "he:i:o:baDHMv"; void printHelp(char* progname) { fprintf(stderr, "%s -i \n" " -o \n" " [-a]: write out ALL extensions; the output filename should be\n" " a \"sprintf\" pattern such as \"extension-%%04i\".\n" " [-b]: print sizes and offsets in FITS blocks (of 2880 bytes)\n" " [-M]: print sizes in megabytes (using floor(), not round()!)\n" " [-D]: data blocks only\n" " [-H]: header blocks only\n" " -e ...\n" " -v: +verbose\n\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; anbool tostdout = FALSE; FILE* fin = NULL; FILE* fout = NULL; il* exts; int i; char* progname = argv[0]; anbool inblocks = FALSE; anbool inmegs = FALSE; int allexts = 0; int Next = -1; anbool dataonly = FALSE; anbool headeronly = FALSE; anqfits_t* anq = NULL; int loglvl = LOG_MSG; exts = il_new(16); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'D': dataonly = TRUE; break; case 'H': headeronly = TRUE; break; case 'a': allexts = 1; break; case 'b': inblocks = TRUE; break; case 'M': inmegs = TRUE; break; case 'e': il_append(exts, atoi(optarg)); break; case 'i': infn = optarg; break; case 'o': outfn = optarg; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } if (headeronly && dataonly) { fprintf(stderr, "Can't write data blocks only AND header blocks only!\n"); exit(-1); } if (inblocks && inmegs) { fprintf(stderr, "Can't write sizes in FITS blocks and megabytes.\n"); exit(-1); } fits_use_error_system(); log_init(loglvl); log_to(stderr); errors_log_to(stderr); if (infn) { anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open input file \"%s\"", infn); exit(-1); } Next = anqfits_n_ext(anq); fprintf(stderr, "File %s contains %i FITS extensions.\n", infn, Next); } if (infn && !outfn) { for (i=0; i #include #include #include #include #include #include #include "qfits_convert.h" #include "qfits_error.h" #include "qfits_std.h" #include "qfits_tools.h" #include "os-features.h" #include "anqfits.h" #include "fitsioutils.h" #include "ioutils.h" #include "keywords.h" #include "an-endian.h" #include "errors.h" #include "log.h" #include "errors.h" Malloc char* fits_to_string(const qfits_header* hdr, int* size) { int N = qfits_header_n(hdr); char* str = NULL; int i; str = malloc(N * FITS_LINESZ); if (!str) { SYSERROR("Failed to allocate string for %i FITS lines\n", N); return NULL; } for (i=0; icol = malloc(tbl->nc * sizeof(qfits_col)); memcpy(out->col, tbl->col, tbl->nc * sizeof(qfits_col)); return out; } int fits_pixdump(const qfitsdumper * qd) { FILE* f_out; const void* vbuf; anbool tostdout; int i; int isize; int osize; if (!qd) return -1; if (!qd->filename) return -1; if (qd->npix < 0) { ERROR("Negative number of pixels specified."); return -1; } // accept vbuf = qd->vbuf; switch (qd->ptype) { case PTYPE_FLOAT: if (!vbuf) vbuf = qd->fbuf; break; case PTYPE_INT: if (!vbuf) vbuf = qd->ibuf; break; case PTYPE_DOUBLE: if (!vbuf) vbuf = qd->dbuf; break; case PTYPE_UINT8: case PTYPE_INT16: // ok break; default: ERROR("Invalid input pixel type %i", qd->ptype); return -1; } if (!vbuf) { ERROR("No pixel buffer supplied"); return -1; } tostdout = streq(qd->filename, "STDOUT"); if (tostdout) f_out = stdout; else f_out = fopen(qd->filename, "a"); if (!f_out) { SYSERROR("Failed to open output file \"%s\" for writing", qd->filename); return -1; } isize = qfits_pixel_ctype_size(qd->ptype); osize = qfits_pixel_fitstype_size(qd->out_ptype); for (i=0; inpix; i++) { char buf[8]; if (qfits_pixel_ctofits(qd->ptype, qd->out_ptype, vbuf, buf)) { ERROR("Failed to convert pixel value to FITS"); return -1; } if (fwrite(buf, osize, 1, f_out) != 1) { SYSERROR("Failed to write FITS pixel value to file \"%s\"", qd->filename); return -1; } vbuf += isize; } if (!tostdout) if (fclose(f_out)) { SYSERROR("Failed to close FITS outptu file \"%s\"", qd->filename); return -1; } return 0; } int fits_write_float_image(const float* img, int nx, int ny, const char* fn) { int rtn; qfitsdumper qoutimg; memset(&qoutimg, 0, sizeof(qoutimg)); qoutimg.filename = fn; qoutimg.npix = nx * ny; qoutimg.ptype = PTYPE_FLOAT; qoutimg.fbuf = img; qoutimg.out_ptype = BPP_IEEE_FLOAT; rtn = fits_write_header_and_image(NULL, &qoutimg, nx); if (rtn) ERROR("Failed to write FITS image to file \"%s\"", fn); return rtn; } int fits_write_u8_image(const uint8_t* img, int nx, int ny, const char* fn) { int rtn; qfitsdumper qoutimg; memset(&qoutimg, 0, sizeof(qoutimg)); qoutimg.filename = fn; qoutimg.npix = nx * ny; qoutimg.ptype = PTYPE_UINT8; qoutimg.vbuf = img; qoutimg.out_ptype = BPP_8_UNSIGNED; rtn = fits_write_header_and_image(NULL, &qoutimg, nx); if (rtn) ERROR("Failed to write FITS image to file \"%s\"", fn); return rtn; } int fits_write_i16_image(const int16_t* img, int nx, int ny, const char* fn) { int rtn; qfitsdumper qoutimg; memset(&qoutimg, 0, sizeof(qoutimg)); qoutimg.filename = fn; qoutimg.npix = nx * ny; qoutimg.ptype = PTYPE_INT16; qoutimg.vbuf = img; qoutimg.out_ptype = BPP_16_SIGNED; rtn = fits_write_header_and_image(NULL, &qoutimg, nx); if (rtn) ERROR("Failed to write FITS image to file \"%s\"", fn); return rtn; } static void errfunc(char* errstr) { report_error("qfits", -1, __func__, "%s", errstr); } int fits_write_header_and_image(const qfits_header* hdr, const qfitsdumper* qd, int W) { FILE* fid; const char* fn = qd->filename; qfits_header* freehdr = NULL; fid = fopen(fn, "w"); if (!fid) { SYSERROR("Failed to open file \"%s\" for output", fn); return -1; } if (!hdr) { freehdr = fits_get_header_for_image(qd, W, NULL); hdr = freehdr; } if (qfits_header_dump(hdr, fid)) { ERROR("Failed to write image header to file \"%s\"", fn); return -1; } if (freehdr) qfits_header_destroy(freehdr); // the qfits pixel dumper appends to the given filename, so close // the file here. if (fits_pad_file(fid) || fclose(fid)) { SYSERROR("Failed to pad or close file \"%s\"", fn); return -1; } // write data. if (fits_pixdump(qd)) { ERROR("Failed to write image data to file \"%s\"", fn); return -1; } // FITS pad fid = fopen(fn, "a"); if (!fid) { SYSERROR("Failed to open file \"%s\" for padding", fn); return -1; } if (fits_pad_file(fid) || fclose(fid)) { SYSERROR("Failed to pad or close file \"%s\"", fn); return -1; } return 0; } qfits_header* fits_get_header_for_image2(int W, int H, int bitpix, qfits_header* addtoheader) { return fits_get_header_for_image3(W, H, bitpix, 1, addtoheader); } qfits_header* fits_get_header_for_image3(int W, int H, int bitpix, int planes, qfits_header* addtoheader) { qfits_header* hdr; if (addtoheader) hdr = addtoheader; else hdr = qfits_header_default(); fits_header_add_int(hdr, "BITPIX", bitpix, "bits per pixel"); fits_header_add_int(hdr, "NAXIS", (planes == 1) ? 2 : 3, "number of axes"); fits_header_add_int(hdr, "NAXIS1", W, "image width"); fits_header_add_int(hdr, "NAXIS2", H, "image height"); if (planes > 1) fits_header_add_int(hdr, "NAXIS3", planes, "image planes"); return hdr; } qfits_header* fits_get_header_for_image(const qfitsdumper* qd, int W, qfits_header* addtoheader) { return fits_get_header_for_image2(W, qd->npix / W, qd->out_ptype, addtoheader); } void fits_use_error_system() { qfits_err_remove_all(); qfits_err_register(errfunc); qfits_err_statset(1); } double fits_get_double_val(const qfits_table* table, int column, const void* rowdata) { const unsigned char* cdata = rowdata; double dval; float fval; // oh, the insanity of qfits... cdata += (table->col[column].off_beg - table->col[0].off_beg); if (table->col[column].atom_type == TFITS_BIN_TYPE_E) { memcpy(&fval, cdata, sizeof(fval)); v32_ntoh(&fval); dval = fval; return fval; } else if (table->col[column].atom_type == TFITS_BIN_TYPE_D) { memcpy(&dval, cdata, sizeof(dval)); v64_ntoh(&dval); return dval; } else { fprintf(stderr, "Invalid column type %i.\n", table->col[column].atom_type); } return HUGE_VAL; } int fits_is_table_header(const char* key) { return (!strcasecmp(key, "XTENSION") || !strcasecmp(key, "BITPIX") || !strncasecmp(key, "NAXIS...", 5) || !strcasecmp(key, "PCOUNT") || !strcasecmp(key, "GCOUNT") || !strcasecmp(key, "TFIELDS") || !strncasecmp(key, "TFORM...", 5) || !strncasecmp(key, "TTYPE...", 5) || !strncasecmp(key, "TUNIT...", 5) || !strncasecmp(key, "TNULL...", 5) || !strncasecmp(key, "TSCAL...", 5) || !strncasecmp(key, "TZERO...", 5) || !strncasecmp(key, "TDISP...", 5) || !strncasecmp(key, "THEAP...", 5) || !strncasecmp(key, "TDIM...", 4) || !strcasecmp(key, "END")) ? 1 : 0; } int fits_is_primary_header(const char* key) { return (!strcasecmp(key, "SIMPLE") || !strcasecmp(key, "BITPIX") || !strncasecmp(key, "NAXIS...", 5) || !strcasecmp(key, "EXTEND") || !strcasecmp(key, "END")) ? 1 : 0; } void fits_copy_non_table_headers(qfits_header* dest, const qfits_header* src) { char key[FITS_LINESZ+1]; char val[FITS_LINESZ+1]; char com[FITS_LINESZ+1]; char lin[FITS_LINESZ+1]; int i; for (i=0;; i++) { if (qfits_header_getitem(src, i, key, val, com, lin) == -1) break; if (fits_is_table_header(key)) continue; qfits_header_add(dest, key, val, com, lin); } } char* fits_get_dupstring(const qfits_header* hdr, const char* key) { // qfits_pretty_string() never increases the length of the string char pretty[FITS_LINESZ+1]; char* val = NULL; val = qfits_header_getstr(hdr, key); if (!val) return NULL; qfits_pretty_string_r(val, pretty); return strdup_safe(pretty); } void fits_header_addf(qfits_header* hdr, const char* key, const char* comment, const char* format, ...) { char buf[FITS_LINESZ + 1]; va_list lst; va_start(lst, format); vsnprintf(buf, sizeof(buf), format, lst); qfits_header_add(hdr, key, buf, comment, NULL); va_end(lst); } // the column where the value of a header card begins, 0-indexed. // KEYWORD = 'VALUE' // 01234567890 #define FITS_VALUE_START 10 void fits_header_addf_longstring(qfits_header* hdr, const char* key, const char* comment, const char* format, ...) { char* str = NULL; int nb; int linelen; va_list lst; int i; int commentlen; va_start(lst, format); nb = vasprintf(&str, format, lst); va_end(lst); if (nb == -1) { SYSERROR("vasprintf failed."); return; } // +2 for the quotes linelen = nb + FITS_VALUE_START + 2; // +1 for each character ' which must be escaped for (i=0; i 0) { anbool amp = TRUE; int maxlen; //printf("String: \"%s\"\n", buf); //printf("Linelen: %i\n", len); maxlen = FITS_LINESZ - (commentlen + FITS_VALUE_START + 2); for (i=0; i= 0 && s[N] == ' ') { s[N] = '\0'; N--; } } // modifies s in-place. static anbool pretty_continue_string(char* s) { char* out = s; int i, iout, N; N = strlen(s); i = 0; iout = 0; for (; i len) nchars = len; else { // look for a space to break the line. for (brk=nchars-1; (brk>=0) && (str[brk] != ' '); brk--); if (brk > 0) { // found a place to break the line. nchars = brk + 1; } } sprintf(copy, "%s%.*s", (doindent ? indent : ""), nchars, str); if (append) qfits_header_append(hdr, keyword, copy, NULL, NULL); else qfits_header_add(hdr, keyword, copy, NULL, NULL); len -= nchars; str += nchars; } while (len > 0); free(origstr); return 0; } static int ATTRIB_FORMAT(printf,4,5) add_long_line_b(qfits_header* hdr, const char* keyword, const char* indent, const char* format, ...) { va_list lst; int rtn; va_start(lst, format); rtn = add_long_line(hdr, keyword, indent, 0, format, lst); va_end(lst); return rtn; } int fits_add_long_comment(qfits_header* dst, const char* format, ...) { va_list lst; int rtn; va_start(lst, format); rtn = add_long_line(dst, "COMMENT", " ", 0, format, lst); va_end(lst); return rtn; } int fits_append_long_comment(qfits_header* dst, const char* format, ...) { va_list lst; int rtn; va_start(lst, format); rtn = add_long_line(dst, "COMMENT", " ", 1, format, lst); va_end(lst); return rtn; } int fits_add_long_history(qfits_header* dst, const char* format, ...) { va_list lst; int rtn; va_start(lst, format); rtn = add_long_line(dst, "HISTORY", " ", 0, format, lst); va_end(lst); return rtn; } int fits_add_args(qfits_header* hdr, char** args, int argc) { sl* s; int i; char* ss = NULL; s = sl_new(4); for (i=0; icol + column, ncopies, 0, atomsize, type, label, units, "", "", 0, 0, 0, 0, table->tab_w); table->tab_w += colsize; return 0; } int fits_offset_of_column(qfits_table* table, int colnum) { int off = 0; int i; // from qfits_table.c : qfits_compute_table_width() for (i=0; itab_t == QFITS_ASCIITABLE) { off += table->col[i].atom_nb; } else if (table->tab_t == QFITS_BINTABLE) { off += table->col[i].atom_nb * table->col[i].atom_size; } } return off; } int fits_write_data_D(FILE* fid, double value, anbool flip) { assert(sizeof(double) == 8); if (flip) v64_hton(&value); if (fwrite(&value, 8, 1, fid) != 1) { fprintf(stderr, "Failed to write a double to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_E(FILE* fid, float value, anbool flip) { assert(sizeof(float) == 4); if (flip) v32_hton(&value); if (fwrite(&value, 4, 1, fid) != 1) { fprintf(stderr, "Failed to write a float to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_B(FILE* fid, uint8_t value) { if (fwrite(&value, 1, 1, fid) != 1) { fprintf(stderr, "Failed to write a bit array to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_L(FILE* fid, char value) { return fits_write_data_A(fid, value); } int fits_write_data_A(FILE* fid, char value) { return fits_write_data_B(fid, value); } int fits_write_data_X(FILE* fid, unsigned char value) { return fits_write_data_B(fid, value); } int fits_write_data_I(FILE* fid, int16_t value, anbool flip) { if (flip) v16_hton(&value); if (fwrite(&value, 2, 1, fid) != 1) { fprintf(stderr, "Failed to write a short to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_J(FILE* fid, int32_t value, anbool flip) { if (flip) v32_hton(&value); if (fwrite(&value, 4, 1, fid) != 1) { fprintf(stderr, "Failed to write an int to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_K(FILE* fid, int64_t value, anbool flip) { if (flip) v64_hton(&value); if (fwrite(&value, 8, 1, fid) != 1) { fprintf(stderr, "Failed to write an int64 to FITS file: %s\n", strerror(errno)); return -1; } return 0; } int fits_write_data_array(FILE* fid, const void* vvalue, tfits_type type, int N, anbool flip) { int i; int rtn = 0; const char* pvalue = (const char*)vvalue; if (pvalue == NULL) { if (fseeko(fid, fits_get_atom_size(type) * N, SEEK_CUR)) { fprintf(stderr, "Failed to skip %i bytes in fits_write_data_array: %s\n", fits_get_atom_size(type) * N, strerror(errno)); return -1; } return 0; } for (i=0; inc; c++) { const qfits_col* col = table->col + c; //debug("column: \"%s\"\n", col->tlabel); if (strcasecmp(col->tlabel, colname) == 0) return c; } return -1; } void fits_add_uint_size(qfits_header* header) { fits_header_add_int(header, "UINT_SZ", sizeof(uint), "sizeof(uint)"); } void fits_add_double_size(qfits_header* header) { fits_header_add_int(header, "DUBL_SZ", sizeof(double), "sizeof(double)"); } int fits_check_uint_size(const qfits_header* header) { int uintsz; uintsz = qfits_header_getint(header, "UINT_SZ", -1); if (sizeof(uint) != uintsz) { fprintf(stderr, "File was written with sizeof(uint)=%i, but currently sizeof(uint)=%u.\n", uintsz, (uint)sizeof(uint)); return -1; } return 0; } int fits_check_double_size(const qfits_header* header) { int doublesz; doublesz = qfits_header_getint(header, "DUBL_SZ", -1); if (sizeof(double) != doublesz) { fprintf(stderr, "File was written with sizeof(double)=%i, but currently sizeof(double)=%u.\n", doublesz, (uint)sizeof(double)); return -1; } return 0; } int fits_check_endian(const qfits_header* header) { char* filestr = NULL; char* localstr = NULL; char pretty[FITS_LINESZ+1]; filestr = qfits_header_getstr(header, "ENDIAN"); if (!filestr) { // No ENDIAN header found. return 1; } qfits_pretty_string_r(filestr, pretty); filestr = pretty; localstr = fits_get_endian_string(); if (strcmp(filestr, localstr)) { fprintf(stderr, "File was written with endianness %s, this machine has endianness %s.\n", filestr, localstr); return -1; } return 0; } astrometry.net-0.67/util/fitstable.c000644 000765 000024 00000126661 12651445460 017700 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "fitstable.h" #include "fitsioutils.h" #include "fitsfile.h" #include "ioutils.h" #include "an-endian.h" #include "anqfits.h" #include "log.h" struct fitscol_t { char* colname; tfits_type fitstype; tfits_type ctype; char* units; int arraysize; anbool required; // size of one data item // computed: fits_sizeof({fits,c}type) int fitssize; int csize; // When being used to write to a C struct, the offset in the struct. anbool in_struct; int coffset; // column number of the FITS table. int col; }; typedef struct fitscol_t fitscol_t; // For in-memory: storage of previously-written extensions. struct fitsext { qfits_header* header; qfits_table* table; // bl data size == row size. bl* rows; }; typedef struct fitsext fitsext_t; static anbool need_endian_flip() { return IS_BIG_ENDIAN == 0; } //static void fitstable_add_columns(fitstable_t* tab, fitscol_t* cols, int Ncols); static fitscol_t* fitstable_add_column(fitstable_t* tab, fitscol_t* col); static void fitstable_create_table(fitstable_t* tab); static int ncols(const fitstable_t* t) { return bl_size(t->cols); } static fitscol_t* getcol(const fitstable_t* t, int i) { return bl_access(t->cols, i); } static off_t get_row_offset(const fitstable_t* table, int row) { assert(table->end_table_offset); assert(table->table); assert(table->table->tab_w); return table->end_table_offset + (off_t)(table->table->tab_w) * (off_t)(row); } int fitstable_n_extensions(const fitstable_t* t) { assert(t); assert(t->anq); return anqfits_n_ext(t->anq); } int fitscolumn_get_size(fitscol_t* col) { return col->fitssize * col->arraysize; } static int offset_of_column(const fitstable_t* table, int colnum) { int i; int offset = 0; assert(colnum <= ncols(table)); for (i=0; icols)); return rowsize; } static anbool is_writing(const fitstable_t* t) { return t->fid ? TRUE : FALSE; //return t->writing; } static void ensure_row_list_exists(fitstable_t* table) { if (!table->rows) { // how big are the rows? int rowsize = offset_of_column(table, bl_size(table->cols)); table->rows = bl_new(1024, rowsize); } } static anbool in_memory(const fitstable_t* t) { return t->inmemory; } tfits_type fitscolumn_int_type() { switch (sizeof(int)) { case 2: return TFITS_BIN_TYPE_I; case 4: return TFITS_BIN_TYPE_J; case 8: return TFITS_BIN_TYPE_K; } return -1; } /* char fitscolumn_tfits_to_char(tfits_type t) { } */ tfits_type fitscolumn_double_type() { return TFITS_BIN_TYPE_D; } tfits_type fitscolumn_float_type() { return TFITS_BIN_TYPE_E; } tfits_type fitscolumn_char_type() { return TFITS_BIN_TYPE_A; } tfits_type fitscolumn_u8_type() { return TFITS_BIN_TYPE_B; } tfits_type fitscolumn_i16_type() { return TFITS_BIN_TYPE_I; } tfits_type fitscolumn_i32_type() { return TFITS_BIN_TYPE_J; } tfits_type fitscolumn_i64_type() { return TFITS_BIN_TYPE_K; } tfits_type fitscolumn_boolean_type() { return TFITS_BIN_TYPE_L; } tfits_type fitscolumn_bool_type() { return TFITS_BIN_TYPE_B; } tfits_type fitscolumn_bitfield_type() { return TFITS_BIN_TYPE_X; } // When reading: allow this column to match to any FITS type. tfits_type fitscolumn_any_type() { return (tfits_type)-1; } /* const char* fitscolumn_format_string(tfits_type t) { switch (t) { case TFITS_BIN_TYPE_D: return " */ int fitstable_ncols(const fitstable_t* t) { return ncols(t); } int fitstable_read_row_data(fitstable_t* table, int row, void* dest) { return fitstable_read_nrows_data(table, row, 1, dest); } int fitstable_read_nrows_data(fitstable_t* table, int row0, int nrows, void* dest) { int R; off_t off; assert(table); assert(row0 >= 0); assert((row0 + nrows) <= fitstable_nrows(table)); assert(dest); R = fitstable_row_size(table); if (in_memory(table)) { int i; char* cdest = dest; for (i=0; irows, row0 + i), R); return 0; } if (!table->readfid) { table->readfid = fopen(table->fn, "rb"); if (!table->readfid) { SYSERROR("Failed to open FITS table %s for reading", table->fn); return -1; } assert(table->anq); off_t start; start = anqfits_data_start(table->anq, table->extension); table->end_table_offset = start; } off = get_row_offset(table, row0); if (fseeko(table->readfid, off, SEEK_SET)) { SYSERROR("Failed to fseeko() to read a row"); return -1; } if (fread(dest, 1, R*nrows, table->readfid) != (R*nrows)) { SYSERROR("Failed to read %i rows starting from %i, from %s", nrows, row0, table->fn); return -1; } return 0; } void fitstable_endian_flip_row_data(fitstable_t* table, void* data) { int i; char* cursor; if (!need_endian_flip()) return; cursor = data; for (i=0; iarraysize; j++) { endian_swap(cursor, col->fitssize); cursor += col->fitssize; } } } static int write_row_data(fitstable_t* table, void* data, int R) { assert(table); assert(data); if (in_memory(table)) { ensure_row_list_exists(table); bl_append(table->rows, data); // ? table->table->nr++; return 0; } if (R == 0) R = fitstable_row_size(table); if (fwrite(data, 1, R, table->fid) != R) { SYSERROR("Failed to write a row to %s", table->fn); return -1; } assert(table->table); table->table->nr++; return 0; } int fitstable_write_row_data(fitstable_t* table, void* data) { return write_row_data(table, data, 0); } int fitstable_copy_rows_data(fitstable_t* intable, int* rows, int N, fitstable_t* outtable) { int R; char* buf = NULL; int i; // We need to endian-flip if we're going from FITS file <--> memory. anbool flip = need_endian_flip() && (in_memory(intable) != in_memory(outtable)); R = fitstable_row_size(intable); buf = malloc(R); for (i=0; itable->tab_w; /* int i, N, sz; N = ncols(t); sz = 0; for (i=0; icolname; } void fitstable_copy_columns(const fitstable_t* src, fitstable_t* dest) { int i; for (i=0; icolname = strdup_safe(newcol->colname); newcol->units = strdup_safe(newcol->units); } } sl* fitstable_get_fits_column_names(const fitstable_t* t, sl* lst) { int i; if (!lst) lst = sl_new(16); for (i=0; itable->nc; i++) { qfits_col* qcol = t->table->col + i; sl_append(lst, qcol->tlabel); } return lst; } int fitstable_get_N_fits_columns(const fitstable_t* t) { return t->table->nc; } const char* fitstable_get_fits_column_name(const fitstable_t* t, int i) { assert(i >= 0); assert(i < t->table->nc); return t->table->col[i].tlabel; } tfits_type fitstable_get_fits_column_type(const fitstable_t* t, int i) { assert(i >= 0); assert(i < t->table->nc); return t->table->col[i].atom_type; } int fitstable_get_fits_column_array_size(const fitstable_t* t, int i) { assert(i >= 0); assert(i < t->table->nc); return t->table->col[i].atom_nb; } void fitstable_add_write_column(fitstable_t* tab, tfits_type t, const char* name, const char* units) { fitstable_add_write_column_array_convert(tab, t, t, 1, name, units); } void fitstable_add_write_column_convert(fitstable_t* tab, tfits_type fits_type, tfits_type c_type, const char* name, const char* units) { fitstable_add_write_column_array_convert(tab, fits_type, c_type, 1, name, units); } void fitstable_add_write_column_array(fitstable_t* tab, tfits_type t, int arraysize, const char* name, const char* units) { fitstable_add_write_column_array_convert(tab, t, t, arraysize, name, units); } void fitstable_add_write_column_array_convert(fitstable_t* tab, tfits_type fits_type, tfits_type c_type, int arraysize, const char* name, const char* units) { fitscol_t col; memset(&col, 0, sizeof(fitscol_t)); col.colname = strdup_safe(name); col.units = strdup_safe(units); col.fitstype = fits_type; col.ctype = c_type; col.arraysize = arraysize; col.in_struct = FALSE; fitstable_add_column(tab, &col); } void fitstable_add_write_column_struct(fitstable_t* tab, tfits_type c_type, int arraysize, int structoffset, tfits_type fits_type, const char* name, const char* units) { fitstable_add_column_struct(tab, c_type, arraysize, structoffset, fits_type, name, units, FALSE); } int fitstable_n_fits_columns(const fitstable_t* tab) { return tab->table->nc; } int fitstable_add_fits_columns_as_struct3(const fitstable_t* intab, fitstable_t* outtab, const sl* colnames, int c_offset) { int i, NC; int noc = ncols(outtab); NC = sl_size(colnames); for (i=0; itable, name); int off; if (j == -1) { ERROR("Failed to find FITS column \"%s\"", name); return -1; } qcol = qfits_table_get_col(intab->table, j); // We give the offset of the column in the *input* table, so that // the resulting "outtab" can handle raw data from the "intab". off = fits_offset_of_column(intab->table, j); fitstable_add_read_column_struct(outtab, qcol->atom_type, qcol->atom_nb, c_offset + off, qcol->atom_type, qcol->tlabel, TRUE); // set the FITS column number. col = getcol(outtab, ncols(outtab)-1); col->col = noc + i; } return 0; } void fitstable_add_fits_columns_as_struct2(const fitstable_t* intab, fitstable_t* outtab) { int i, NC; int off = 0; int noc = ncols(outtab); NC = fitstable_get_N_fits_columns(intab); for (i=0; itable, i); fitscol_t* col; /* if (qcol->atom_type == TFITS_BIN_TYPE_X) { } */ fitstable_add_read_column_struct(outtab, qcol->atom_type, qcol->atom_nb, off, qcol->atom_type, qcol->tlabel, TRUE); // set the FITS column number. col = getcol(outtab, ncols(outtab)-1); col->col = noc + i; off += fitscolumn_get_size(col); //getcol(tab, ncols(tab)-1)); } } void fitstable_add_fits_columns_as_struct(fitstable_t* tab) { int i; int off = 0; for (i=0; itable->nc; i++) { qfits_col* qcol = tab->table->col + i; fitscol_t* col; /* if (qcol->atom_type == TFITS_BIN_TYPE_X) { } */ fitstable_add_read_column_struct(tab, qcol->atom_type, qcol->atom_nb, off, qcol->atom_type, qcol->tlabel, TRUE); // set the FITS column number. col = getcol(tab, ncols(tab)-1); col->col = i; off += fitscolumn_get_size(getcol(tab, ncols(tab)-1)); } } int fitstable_find_fits_column(fitstable_t* tab, const char* colname, char** units, tfits_type* type, int* arraysize) { int i; for (i=0; itable->nc; i++) { qfits_col* qcol = tab->table->col + i; if (!strcaseeq(colname, qcol->tlabel)) continue; // found it! if (units) *units = qcol->tunit; if (type) *type = qcol->atom_type; if (arraysize) *arraysize = qcol->atom_nb; return 0; } return -1; } void fitstable_add_read_column_struct(fitstable_t* tab, tfits_type c_type, int arraysize, int structoffset, tfits_type fits_type, const char* name, anbool required) { fitstable_add_column_struct(tab, c_type, arraysize, structoffset, fits_type, name, NULL, required); } void fitstable_add_column_struct(fitstable_t* tab, tfits_type c_type, int arraysize, int structoffset, tfits_type fits_type, const char* name, const char* units, anbool required) { fitscol_t col; memset(&col, 0, sizeof(fitscol_t)); col.colname = strdup_safe(name); col.units = strdup_safe(units); col.fitstype = fits_type; col.ctype = c_type; col.arraysize = arraysize; col.in_struct = TRUE; col.coffset = structoffset; col.required = required; fitstable_add_column(tab, &col); } int fitstable_remove_column(fitstable_t* tab, const char* name) { int i; for (i=0; icolname) == 0) { free(col->colname); free(col->units); bl_remove_index(tab->cols, i); return 0; } } return -1; } void fitstable_print_columns(fitstable_t* tab) { int i; printf("Table columns:\n"); for (i=0; icolname, col->fitstype, col->ctype, col->arraysize, col->fitssize, col->csize, col->coffset, col->col); } } int fitstable_read_structs(fitstable_t* tab, void* struc, int strucstride, int offset, int N) { int i; void* tempdata = NULL; int highwater = 0; //printf("fitstable_read_structs: stride %i, offset %i, N %i\n",strucstride, offset, N); for (i=0; icol == -1) continue; if (!col->in_struct) continue; finaldest = ((char*)struc) + col->coffset; finalstride = strucstride; if (col->fitstype != col->ctype) { int NB = fitscolumn_get_size(col) * N; if (NB > highwater) { free(tempdata); tempdata = malloc(NB); highwater = NB; } dest = tempdata; stride = fitscolumn_get_size(col); } else { dest = finaldest; stride = finalstride; } if (in_memory(tab)) { int j; int off = offset_of_column(tab, i); int sz; if (!tab->rows) { ERROR("No data has been written to this fitstable"); return -1; } if (offset + N > bl_size(tab->rows)) { ERROR("Number of data items requested exceeds number of rows: offset %i, n %i, nrows %zu", offset, N, bl_size(tab->rows)); return -1; } //logverb("column %i: dest offset %i, stride %i, row offset %i, input offset %i, size %i (%ix%i)\n", i, (int)(dest - struc), stride, offset, off, fitscolumn_get_size(col), col->fitssize, col->arraysize); sz = fitscolumn_get_size(col); for (j=0; jrows, offset+j)) + off, sz); } else { // Read from FITS file... qfits_query_column_seq_to_array(tab->table, col->col, offset, N, dest, stride); } if (col->fitstype != col->ctype) { fits_convert_data(finaldest, finalstride, col->ctype, dest, stride, col->fitstype, col->arraysize, N); } } free(tempdata); if (tab->postprocess_read_structs) return tab->postprocess_read_structs(tab, struc, strucstride, offset, N); return 0; } int fitstable_read_struct(fitstable_t* tab, int offset, void* struc) { return fitstable_read_structs(tab, struc, 0, offset, 1); } // One of "struc" or "ap" should be non-null. static int write_one(fitstable_t* table, const void* struc, anbool flip, va_list* ap) { int i; char* buf = NULL; int Nbuf = 0; int ret = 0; int nc = ncols(table); char* thisrow = NULL; int rowoff = 0; if (in_memory(table)) { ensure_row_list_exists(table); thisrow = calloc(1, bl_datasize(table->rows)); } for (i=0; iin_struct) { if (struc) columndata = struc + col->coffset; else columndata = NULL; } else { if (struc) columndata = NULL; else columndata = va_arg(*ap, void *); } // If "columndata" is NULL, fits_write_data_array // skips the required number of bytes. // This allows both structs and normal columns to coexist // (in theory -- is this ever used?) // (yes, by blind.c when writing rdls and correspondence files // with tag-along data...) if (columndata && col->fitstype != col->ctype) { int sz = MAX(256, MAX(col->csize, col->fitssize) * col->arraysize); if (sz > Nbuf) { free(buf); buf = malloc(sz); } fits_convert_data(buf, col->fitssize, col->fitstype, columndata, col->csize, col->ctype, col->arraysize, 1); columndata = buf; } if (in_memory(table)) { int nb = fitscolumn_get_size(col); memcpy(thisrow + rowoff, columndata, nb); rowoff += nb; } else { ret = fits_write_data_array(table->fid, columndata, col->fitstype, col->arraysize, flip); if (ret) break; } } free(buf); if (in_memory(table)) bl_append(table->rows, thisrow); free(thisrow); table->table->nr++; return ret; } int fitstable_write_struct(fitstable_t* table, const void* struc) { return write_one(table, struc, TRUE, NULL); } int fitstable_write_struct_noflip(fitstable_t* table, const void* struc) { return write_one(table, struc, FALSE, NULL); } int fitstable_write_structs(fitstable_t* table, const void* struc, int stride, int N) { int i; char* s = (char*)struc; for (i=0; itable) fitstable_create_table(table); va_start(ap, table); ret = write_one(table, NULL, TRUE, &ap); va_end(ap); return ret; } int fitstable_write_row_noflip(fitstable_t* table, ...) { int ret; va_list ap; if (!table->table) fitstable_create_table(table); va_start(ap, table); ret = write_one(table, NULL, FALSE, &ap); va_end(ap); return ret; } int fitstable_write_one_column(fitstable_t* table, int colnum, int rowoffset, int nrows, const void* src, int src_stride) { anbool flip = TRUE; off_t foffset = 0; off_t start = 0; int i; char* buf = NULL; fitscol_t* col; int off; off = offset_of_column(table, colnum); if (!in_memory(table)) { foffset = ftello(table->fid); // jump to row start... start = get_row_offset(table, rowoffset) + off; if (fseeko(table->fid, start, SEEK_SET)) { SYSERROR("Failed to fseeko() to the start of the file."); return -1; } } col = getcol(table, colnum); if (col->fitstype != col->ctype) { int sz = col->fitssize * col->arraysize * nrows; buf = malloc(sz); fits_convert_data(buf, col->fitssize * col->arraysize, col->fitstype, src, src_stride, col->ctype, col->arraysize, nrows); src = buf; src_stride = col->fitssize * col->arraysize; } if (in_memory(table)) { for (i=0; irows, rowoffset + i)) + off, src, col->fitssize * col->arraysize); src = ((const char*)src) + src_stride; } } else { for (i=0; ifid, start + i * table->table->tab_w, SEEK_SET) || fits_write_data_array(table->fid, src, col->fitstype, col->arraysize, flip)) { SYSERROR("Failed to write row %i of column %i", rowoffset+i, colnum); return -1; } src = ((const char*)src) + src_stride; } } free(buf); if (!in_memory(table)) { if (fseeko(table->fid, foffset, SEEK_SET)) { SYSERROR("Failed to restore file offset."); return -1; } } return 0; } void fitstable_clear_table(fitstable_t* tab) { int i; for (i=0; icolname); free(col->units); } bl_remove_all(tab->cols); } /** If "inds" is non-NULL, it's a list of indices to read. */ static void* read_array_into(const fitstable_t* tab, const char* colname, tfits_type ctype, anbool array_ok, int offset, const int* inds, int Nread, void* dest, int deststride, int desired_arraysize, int* p_arraysize) { int colnum; qfits_col* col; int fitssize; int csize; int fitstype; int arraysize; char* tempdata = NULL; char* cdata; char* fitsdata; int cstride; int fitsstride; int N; colnum = fits_find_column(tab->table, colname); if (colnum == -1) { ERROR("Column \"%s\" not found in FITS table %s", colname, tab->fn); return NULL; } col = tab->table->col + colnum; if (!array_ok && (col->atom_nb != 1)) { ERROR("Column \"%s\" in FITS table %s is an array of size %i, not a scalar", colname, tab->fn, col->atom_nb); return NULL; } arraysize = col->atom_nb; if (p_arraysize) *p_arraysize = arraysize; if (desired_arraysize && arraysize != desired_arraysize) { ERROR("Column \"%s\" has array size %i but you wanted %i", colname, arraysize, desired_arraysize); return NULL; } fitstype = col->atom_type; fitssize = fits_get_atom_size(fitstype); csize = fits_get_atom_size(ctype); N = tab->table->nr; if (Nread == -1) Nread = N; if (offset == -1) offset = 0; if (dest) cdata = dest; else cdata = calloc(Nread * arraysize, csize); if (dest && deststride > 0) cstride = deststride; else cstride = csize * arraysize; fitsstride = fitssize * arraysize; if (csize < fitssize) { // Need to allocate a bigger temp array and down-convert the data. // HACK - could set data=tempdata and realloc after (if 'dest' is NULL) tempdata = calloc(Nread * arraysize, fitssize); fitsdata = tempdata; } else { // We'll read the data into the first fraction of the output array. fitsdata = cdata; } if (in_memory(tab)) { int i; int off; int sz; if (!tab->rows) { ERROR("No data has been written to this fitstable"); return NULL; } if (offset + Nread > bl_size(tab->rows)) { ERROR("Number of data items requested exceeds number of rows: offset %i, n %i, nrows %zu", offset, Nread, bl_size(tab->rows)); return NULL; } off = fits_offset_of_column(tab->table, colnum); sz = fitsstride; if (inds) { for (i=0; irows, inds[i])) + off, sz); } else { for (i=0; irows, offset+i)) + off, sz); } } else { int res; if (inds) { res = qfits_query_column_seq_to_array_inds(tab->table, colnum, inds, Nread, (unsigned char*)fitsdata, fitsstride); } else { res = qfits_query_column_seq_to_array(tab->table, colnum, offset, Nread, (unsigned char*)fitsdata, fitsstride); } if (res) { ERROR("Failed to read column from FITS file"); // MEMLEAK! return NULL; } } if (fitstype != ctype) { if (csize <= fitssize) { // work forward fits_convert_data(cdata, cstride, ctype, fitsdata, fitsstride, fitstype, arraysize, Nread); } else { // work backward from the end of the array fits_convert_data(cdata + (((off_t)Nread*(off_t)arraysize)-1) * (off_t)csize, -csize, ctype, fitsdata + (((off_t)Nread*(off_t)arraysize)-1) * (off_t)fitssize, -fitssize, fitstype, 1, Nread * arraysize); } } free(tempdata); return cdata; } static void* read_array(const fitstable_t* tab, const char* colname, tfits_type ctype, anbool array_ok, int offset, int Nread) { return read_array_into(tab, colname, ctype, array_ok, offset, NULL, Nread, NULL, 0, 0, NULL); } int fitstable_read_column_inds_into(const fitstable_t* tab, const char* colname, tfits_type read_as_type, void* dest, int stride, const int* inds, int N) { return (read_array_into(tab, colname, read_as_type, FALSE, 0, inds, N, dest, stride, 0, NULL) == NULL ? -1 : 0); } void* fitstable_read_column_inds(const fitstable_t* tab, const char* colname, tfits_type read_as_type, const int* inds, int N) { return read_array_into(tab, colname, read_as_type, FALSE, 0, inds, N, NULL, 0, 0, NULL); } int fitstable_read_column_array_inds_into(const fitstable_t* tab, const char* colname, tfits_type read_as_type, void* dest, int stride, int arraysize, const int* inds, int N) { return (read_array_into(tab, colname, read_as_type, TRUE, 0, inds, N, dest, stride, arraysize, NULL) == NULL ? -1 : 0); } void* fitstable_read_column_array_inds(const fitstable_t* tab, const char* colname, tfits_type read_as_type, const int* inds, int N, int* arraysize) { return read_array_into(tab, colname, read_as_type, TRUE, 0, inds, N, NULL, 0, 0, arraysize); } int fitstable_read_column_offset_into(const fitstable_t* tab, const char* colname, tfits_type read_as_type, void* dest, int stride, int start, int N) { return (read_array_into(tab, colname, read_as_type, FALSE, start, NULL, N, dest, stride, 0, NULL) == NULL ? -1 : 0); } int fitstable_read_column_into(const fitstable_t* tab, const char* colname, tfits_type read_as_type, void* dest, int stride) { return fitstable_read_column_offset_into(tab, colname, read_as_type, dest, stride, 0, -1); } void* fitstable_read_column(const fitstable_t* tab, const char* colname, tfits_type ctype) { return read_array(tab, colname, ctype, FALSE, -1, -1); } void* fitstable_read_column_array(const fitstable_t* tab, const char* colname, tfits_type t) { return read_array(tab, colname, t, TRUE, -1, -1); } void* fitstable_read_column_offset(const fitstable_t* tab, const char* colname, tfits_type ctype, int offset, int N) { return read_array(tab, colname, ctype, FALSE, offset, N); } qfits_header* fitstable_get_primary_header(const fitstable_t* t) { return t->primheader; } qfits_header* fitstable_get_header(fitstable_t* t) { if (!t->header) { fitstable_new_table(t); } return t->header; } void fitstable_next_extension(fitstable_t* tab) { if (is_writing(tab)) fits_pad_file(tab->fid); if (in_memory(tab)) { fitsext_t ext; if (!tab->table) return; // update NAXIS2 fitstable_fix_header(tab); ext.table = tab->table; ext.header = tab->header; ext.rows = tab->rows; bl_append(tab->extensions, &ext); tab->rows = NULL; } else { qfits_table_close(tab->table); qfits_header_destroy(tab->header); } tab->extension++; tab->table = NULL; tab->header = NULL; } static fitstable_t* fitstable_new() { fitstable_t* tab; tab = calloc(1, sizeof(fitstable_t)); if (!tab) return tab; tab->cols = bl_new(8, sizeof(fitscol_t)); return tab; } fitstable_t* fitstable_open_in_memory() { fitstable_t* tab; tab = fitstable_new(); if (!tab) { ERROR("Failed to allocate new FITS table structure"); goto bailout; } tab->fn = NULL; tab->fid = NULL; tab->primheader = qfits_table_prim_header_default(); tab->inmemory = TRUE; tab->extensions = bl_new(16, sizeof(fitsext_t)); return tab; bailout: if (tab) { fitstable_close(tab); } return NULL; } int fitstable_switch_to_reading(fitstable_t* table) { assert(in_memory(table)); // store the current extension. fitstable_next_extension(table); // This resets all the meta-data about the table, meaning a reader // can then re-add columns it is interested in. fitstable_clear_table(table); table->extension = 1; return fitstable_open_extension(table, table->extension); } static fitstable_t* _fitstable_open(const char* fn) { fitstable_t* tab; tab = fitstable_new(); if (!tab) { ERROR("Failed to allocate new FITS table structure"); goto bailout; } tab->extension = 1; tab->fn = strdup_safe(fn); tab->anq = anqfits_open(fn); if (!tab->anq) { ERROR("Failed to open FITS file \"%s\"", fn); goto bailout; } tab->primheader = anqfits_get_header(tab->anq, 0); if (!tab->primheader) { ERROR("Failed to read primary FITS header from %s", fn); goto bailout; } return tab; bailout: if (tab) { fitstable_close(tab); } return NULL; } fitstable_t* fitstable_open(const char* fn) { fitstable_t* tab = _fitstable_open(fn); if (!tab) { return NULL; } if (fitstable_open_extension(tab, tab->extension)) { ERROR("Failed to open extension %i in file %s", tab->extension, fn); goto bailout; } return tab; bailout: if (tab) { fitstable_close(tab); } return NULL; } fitstable_t* fitstable_open_mixed(const char* fn) { return _fitstable_open(fn); } fitstable_t* fitstable_open_extension_2(const char* fn, int ext) { fitstable_t* tab = _fitstable_open(fn); if (!tab) return tab; if (fitstable_open_extension(tab, ext)) { fitstable_close(tab); return NULL; } return tab; } static fitstable_t* open_for_writing(const char* fn, const char* mode, FILE* fid) { fitstable_t* tab; tab = fitstable_new(); if (!tab) goto bailout; tab->fn = strdup_safe(fn); if (fid) tab->fid = fid; else { tab->fid = fopen(fn, mode); if (!tab->fid) { SYSERROR("Couldn't open output file %s for writing", fn); goto bailout; } } return tab; bailout: if (tab) { fitstable_close(tab); } return NULL; } fitstable_t* fitstable_open_for_writing(const char* fn) { fitstable_t* tab = open_for_writing(fn, "wb", NULL); if (!tab) return tab; tab->primheader = qfits_table_prim_header_default(); return tab; } fitstable_t* fitstable_open_for_appending(const char* fn) { fitstable_t* tab = open_for_writing(fn, "r+b", NULL); if (!tab) return tab; if (fseeko(tab->fid, 0, SEEK_END)) { SYSERROR("Failed to seek to end of file"); fitstable_close(tab); return NULL; } tab->primheader = anqfits_get_header2(fn, 0); if (!tab->primheader) { ERROR("Failed to read primary FITS header from %s", fn); fitstable_close(tab); return NULL; } return tab; } fitstable_t* fitstable_open_for_appending_to(FILE* fid) { fitstable_t* tab = open_for_writing(NULL, NULL, fid); if (!tab) return tab; if (fseeko(tab->fid, 0, SEEK_END)) { SYSERROR("Failed to seek to end of file"); fitstable_close(tab); return NULL; } return tab; } int fitstable_append_to(fitstable_t* intable, FILE* fid) { fitstable_t* outtable; qfits_header* tmphdr; outtable = fitstable_open_for_appending_to(fid); fitstable_clear_table(intable); fitstable_add_fits_columns_as_struct(intable); fitstable_copy_columns(intable, outtable); outtable->table = fits_copy_table(intable->table); outtable->table->nr = 0; // swap in the input header. tmphdr = outtable->header; outtable->header = intable->header; if (fitstable_write_header(outtable)) { ERROR("Failed to write output table header"); return -1; } if (fitstable_copy_rows_data(intable, NULL, fitstable_nrows(intable), outtable)) { ERROR("Failed to copy rows from input table to output"); return -1; } if (fitstable_fix_header(outtable)) { ERROR("Failed to fix output table header"); return -1; } outtable->header = tmphdr; // clear this so that fitstable_close() doesn't fclose() it. outtable->fid = NULL; fitstable_close(outtable); return 0; } int fitstable_close(fitstable_t* tab) { int i; int rtn = 0; if (!tab) return 0; if (is_writing(tab)) { if (fclose(tab->fid)) { SYSERROR("Failed to close output file %s", tab->fn); rtn = -1; } } if (tab->anq) { anqfits_close(tab->anq); } if (tab->readfid) { fclose(tab->readfid); } if (tab->primheader) qfits_header_destroy(tab->primheader); if (tab->header) qfits_header_destroy(tab->header); if (tab->table) qfits_table_close(tab->table); free(tab->fn); for (i=0; icolname); free(col->units); } bl_free(tab->cols); if (tab->br) { buffered_read_free(tab->br); free(tab->br); } if (tab->rows) { bl_free(tab->rows); } if (tab->extensions) { for (i=0; iextensions); i++) { fitsext_t* ext = bl_access(tab->extensions, i); if (ext->rows != tab->rows) bl_free(ext->rows); if (ext->header != tab->header) qfits_header_destroy(ext->header); if (ext->table != tab->table) qfits_table_close(ext->table); } bl_free(tab->extensions); } free(tab); return rtn; } static fitscol_t* fitstable_add_column(fitstable_t* tab, fitscol_t* col) { col = bl_append(tab->cols, col); col->csize = fits_get_atom_size(col->ctype); col->fitssize = fits_get_atom_size(col->fitstype); return col; } /* static void fitstable_add_columns(fitstable_t* tab, fitscol_t* cols, int Ncols) { int i; for (i=0; itable, name); if (colnum == -1) return -1; qcol = tab->table->col + colnum; return qcol->atom_nb; } int fitstable_get_type(fitstable_t* tab, const char* name) { qfits_col* qcol; int colnum; colnum = fits_find_column(tab->table, name); if (colnum == -1) return -1; qcol = tab->table->col + colnum; return qcol->atom_type; } int fitstable_open_next_extension(fitstable_t* tab) { tab->extension++; return fitstable_open_extension(tab, tab->extension); } int fitstable_open_extension(fitstable_t* tab, int ext) { if (in_memory(tab)) { fitsext_t* theext; if (ext > bl_size(tab->extensions)) { ERROR("Table has only %zu extensions, but you requested #%i", bl_size(tab->extensions), ext); return -1; } theext = bl_access(tab->extensions, ext-1); tab->table = theext->table; tab->header = theext->header; tab->rows = theext->rows; tab->extension = ext; } else { if (tab->table) { qfits_table_close(tab->table); tab->table = NULL; } assert(tab->anq); if (ext >= anqfits_n_ext(tab->anq)) { ERROR("Requested FITS extension %i in file %s, but there are only %i extensions.\n", ext, tab->fn, anqfits_n_ext(tab->anq)); return -1; } tab->table = anqfits_get_table(tab->anq, ext); if (!tab->table) { ERROR("FITS extension %i in file %s is not a table (or there was an error opening the file)", ext, tab->fn); return -1; } if (tab->header) { qfits_header_destroy(tab->header); } tab->header = anqfits_get_header(tab->anq, ext); if (!tab->header) { ERROR("Couldn't get header for FITS extension %i in file %s", ext, tab->fn); return -1; } tab->extension = ext; } return 0; } int fitstable_read_extension(fitstable_t* tab, int ext) { int i; int ok = 1; if (fitstable_open_extension(tab, ext)) return -1; if (tab->readfid) { // close FID so that table->end_table_offset gets refreshed. fclose(tab->readfid); tab->readfid = NULL; } for (i=0; icsize = fits_get_atom_size(col->ctype); // Column found? col->col = fits_find_column(tab->table, col->colname); if (col->col == -1) continue; qcol = tab->table->col + col->col; // Type & array size correct? if (col->fitstype != fitscolumn_any_type() && col->fitstype != qcol->atom_type) { col->col = -1; continue; } col->fitstype = qcol->atom_type; col->fitssize = fits_get_atom_size(col->fitstype); if (col->arraysize) { if (col->arraysize != qcol->atom_nb) { col->col = -1; continue; } } /* This was causing problems with copying startree tag-along data (Tycho2 test case: FLAGS column) if (col->fitstype == TFITS_BIN_TYPE_X) { // ??? really?? col->arraysize = 8 * qcol->atom_nb; } else { col->arraysize = qcol->atom_nb; } */ col->arraysize = qcol->atom_nb; } if (tab->br) { buffered_read_reset(tab->br); tab->br->ntotal = tab->table->nr; } for (i=0; icol == -1 && col->required) { ok = 0; break; } } if (ok) return 0; return -1; } int fitstable_write_primary_header(fitstable_t* t) { if (in_memory(t)) return 0; return fitsfile_write_primary_header(t->fid, t->primheader, &t->end_header_offset, t->fn); } int fitstable_fix_primary_header(fitstable_t* t) { if (in_memory(t)) return 0; return fitsfile_fix_primary_header(t->fid, t->primheader, &t->end_header_offset, t->fn); } // Called just before starting to write a new field. int fitstable_new_table(fitstable_t* t) { if (t->table) { qfits_table_close(t->table); } fitstable_create_table(t); if (t->header) { qfits_header_destroy(t->header); } t->header = qfits_table_ext_header_default(t->table); return 0; } int fitstable_write_header(fitstable_t* t) { if (!t->header) { if (fitstable_new_table(t)) { return -1; } } if (in_memory(t)) return 0; return fitsfile_write_header(t->fid, t->header, &t->table_offset, &t->end_table_offset, t->extension, t->fn); } int fitstable_pad_with(fitstable_t* t, char pad) { return fitsfile_pad_with(t->fid, pad); } int fitstable_fix_header(fitstable_t* t) { // update NAXIS2 to reflect the number of rows written. fits_header_mod_int(t->header, "NAXIS2", t->table->nr, NULL); if (in_memory(t)) return 0; if (fitsfile_fix_header(t->fid, t->header, &t->table_offset, &t->end_table_offset, t->extension, t->fn)) { return -1; } return 0; //fits_pad_file(t->fid); } void fitstable_close_table(fitstable_t* tab) { int i; if (tab->table) { qfits_table_close(tab->table); tab->table = NULL; } for (i=0; icol = -1; col->fitssize = 0; col->arraysize = 0; col->fitstype = fitscolumn_any_type(); } } int fitstable_nrows(const fitstable_t* t) { if (!t->table) return 0; return t->table->nr; } void fitstable_print_missing(fitstable_t* tab, FILE* f) { int i; fprintf(f, "Missing required columns: "); for (i=0; icol == -1 && col->required) { fprintf(f, "%s ", col->colname); } } } void fitstable_error_report_missing(fitstable_t* tab) { int i; sl* missing = sl_new(4); char* mstr; for (i=0; icol == -1 && col->required) sl_append(missing, col->colname); } mstr = sl_join(missing, ", "); sl_free2(missing); ERROR("Missing required columns: %s", mstr); free(mstr); } static void fitstable_create_table(fitstable_t* tab) { qfits_table* qt; int i; qt = qfits_table_new("", QFITS_BINTABLE, 0, ncols(tab), 0); tab->table = qt; for (i=0; icolname); arraysize = col->arraysize; if (col->fitstype == TFITS_BIN_TYPE_X) arraysize = col->arraysize * 8; fits_add_column(qt, i, col->fitstype, arraysize, col->units ? col->units : nil, col->colname); } } static int refill_buffer(void* userdata, void* buffer, unsigned int offset, unsigned int n) { fitstable_t* tab = userdata; //logverb("fitstable.c:refill_buffer: offset %i, n %i\n", offset, n); if (fitstable_read_structs(tab, buffer, tab->br->elementsize, offset, n)) { ERROR("Error refilling FITS table read buffer"); return -1; } return 0; } void fitstable_use_buffered_reading(fitstable_t* tab, int elementsize, int Nbuffer) { if (tab->br) { assert(tab->br->elementsize == elementsize); buffered_read_resize(tab->br, Nbuffer); } else { tab->br = buffered_read_new(elementsize, Nbuffer, 0, refill_buffer, tab); } } void fitstable_set_buffer_fill_function(fitstable_t* tab, int (*refill_buffer)(void* userdata, void* buffer, unsigned int offs, unsigned int nelems), void* userdata) { assert(tab->br); tab->br->refill_buffer = refill_buffer; tab->br->userdata = userdata; } void* fitstable_next_struct(fitstable_t* tab) { if (!tab->br) return NULL; return buffered_read(tab->br); } int fitstable_pushback(fitstable_t* tab) { if (!tab->br) return -1; buffered_read_pushback(tab->br); return 0; } astrometry.net-0.67/util/fix_sdss_idr.py000644 000765 000024 00000004502 12651445460 020576 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import numpy from astrometry.util.fits import pyfits_writeto def is_sdss_idr(hdu): hdr = hdu.header return ((hdr.get('SIMPLE', True) == False) and ('SDSS' in hdr) and ('UNSIGNED' in hdr)) #and hdr.get('SDSS', None) == pyfits.UNDEFINED #and hdr.get('UNSIGNED', None) == pyfits.UNDEFINED) def is_sdss_idr_file(infile): p = pyfits.open(infile) rtn = is_sdss_idr(p[0]) p.close() return rtn # Takes a pyfits HDU object (which is unchanged) and returns a new # pyfits object containing the fixed file. def fix_sdss_idr(hdu): hdr = hdu.header.copy() if hdr.get('SIMPLE', True): print 'SIMPLE = T: not an SDSS idR file.' return hdu print 'Setting SIMPLE = True' hdr.remove('SIMPLE') hdr.set('SIMPLE', True, 'FITS compliant (via fix-sdss-idr.py)') if 'SDSS' in hdr: print 'Setting SDSS = True' hdr.remove('SDSS') hdr.set('SDSS', True, 'SDSS (via fix-sdss-idr.py)') else: print 'No SDSS header card: not an SDSS idR file.' return hdu if 'UNSIGNED' in hdr: print 'Setting UNSIGNED = True' hdr.remove('UNSIGNED') hdr.set('UNSIGNED', True, 'SDSS unsigned ints') else: print 'No UNSIGNED header card: not an SDSS idR file.' return hdu #hdr._updateHDUtype() #newhdu = hdr._hdutype(data=pyfits.DELAYED, header=hdr) newhdu = pyfits.PrimaryHDU(data=pyfits.DELAYED, header=hdr) ## HACK - encapsulation violation newhdu._file = hdu._file #newhdu._ffile = hdu._ffile newhdu._datLoc = hdu._datLoc newhdu.data = newhdu.data.astype(numpy.int32) newhdu.data[newhdu.data < 0] += 2**16 print 'data type:', newhdu.data.dtype print 'data range:', newhdu.data.min(), 'to', newhdu.data.max() return newhdu def fix_sdss_idr_file(infile, outfile): print 'Reading', infile newhdu = fix_sdss_idr(pyfits.open(infile)[0]) print 'Writing', outfile pyfits_wireto(newhdu, outfile) if __name__ == '__main__': if len(sys.argv) != 3: print 'Usage: %s ' % sys.argv[0] sys.exit(-1) infile = sys.argv[1] outfile = sys.argv[2] fix_sdss_idr_file(infile, outfile) sys.exit(0) astrometry.net-0.67/util/gator.py000644 000765 000024 00000001512 12651445460 017230 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from .fits import text_table_fields def gator2fits(fn): f = open(fn, 'rb') while True: line = f.readline() #print 'Read:', line if not line.startswith('\\'): break names = line types = f.readline() units = f.readline() xxx = f.readline() #print 'names:', names #print 'types:', types #print 'xxx:', xxx hdr = names.replace('|', ' ') #print 'hdr:', hdr tmap = {'double':float, 'int':int, 'char':str} types = [tmap.get(t) for t in types.replace('|',' ').split()] #print 'Types:', types data = f.read() #print 'Data:', data data = data.replace('|', ' ') data = data.replace('null', 'NaN') T = text_table_fields(None, text=data, headerline=hdr, coltypes=types) #T.about() #print 'Got', T return T astrometry.net-0.67/util/get-healpix.c000644 000765 000024 00000013224 12651445460 020120 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "healpix.h" #include "healpix-utils.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #define OPTIONS "hdN:npH:drR:" void print_help(char* progname) { printf("usage:\n" " %s [options] ra dec\n" " [-r]: values in radians; default is in decimal degrees or H:M:S\n" " OR,\n" " %s x y z\n\n" " [-H ]: take healpix number as input and print center as output.\n" " [-N nside] (default 1)\n" " [-n]: print neighbours\n" " [-R ]: print healpixes within radius in degrees\n" " [-p]: project position within healpix\n" "If your values are negative, add \"--\" in between \"-r\" (if you're using it) and \"ra\" or \"x\".\n\n", progname, progname); } int main(int argc, char** args) { int healpix = -1; int i; anbool degrees = TRUE; double radius = HUGE_VAL; int nargs; int c; int Nside = 1; anbool neighbours = FALSE; anbool project = FALSE; double xyz[3]; anbool fromhp = FALSE; if (argc == 1) { print_help(args[0]); exit(0); } while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'H': fromhp = TRUE; healpix = atoi(optarg); break; case 'd': // No-op break; case 'r': degrees = FALSE; break; case 'R': radius = atof(optarg); break; case 'N': Nside = atoi(optarg); break; case 'n': neighbours = TRUE; break; case 'p': project = TRUE; } } nargs = argc - optind; args += optind; if (!fromhp) { double ra, dec; if (!((nargs == 2) || (nargs == 3))) { print_help(args[0]); exit(-1); } if (nargs == 2) { ra = atora (args[0]); dec = atodec(args[1]); if (!degrees) { ra = rad2deg(ra); dec = rad2deg(dec); } healpix = radecdegtohealpix(ra, dec, Nside); if (!degrees) printf("(RA, DEC) = (%g, %g) radians\n", ra, dec); printf("(RA, DEC) = (%g, %g) degrees\n", ra, dec); radecdeg2xyzarr(ra, dec, xyz); } else if (nargs == 3) { xyz[0] = atof(args[0]); xyz[1] = atof(args[1]); xyz[2] = atof(args[2]); healpix = xyzarrtohealpix(xyz, Nside); printf("(x, y, z) = (%g, %g, %g)\n", xyz[0], xyz[1], xyz[2]); xyzarr2radecdeg(xyz, &ra, &dec); printf("(RA, DEC) = (%g, %g) degrees\n", ra, dec); } } { int ri; int ringnum, longind; int bighp, x, y; double ra, dec; double ramin, ramax; double decmin, decmax; healpix_decompose_xy(healpix, &bighp, &x, &y, Nside); printf("Healpix=%i in the XY scheme (bighp=%i, x=%i, y=%i)\n", healpix, bighp, x, y); ri = healpix_xy_to_ring(healpix, Nside); healpix_decompose_ring(ri, Nside, &ringnum, &longind); printf(" healpix=%i in the RING scheme (ringnum=%i, longind=%i)\n", ri, ringnum, longind); if (is_power_of_two(Nside)) { int ni = healpix_xy_to_nested(healpix, Nside); printf(" healpix=%i in the NESTED scheme.\n", ni); } healpix_to_radecdeg(healpix, Nside, 0.5, 0.5, &ra, &dec); printf("Healpix center is (%.8g, %.8g) degrees\n", ra, dec); // the point with smallest RA is (0,1); largest is (1,0). // southmost (min Dec) is (0,0); northmost is (1,1). healpix_to_radecdeg(healpix, Nside, 0.0, 1.0, &ramin, &dec); healpix_to_radecdeg(healpix, Nside, 1.0, 0.0, &ramax, &dec); healpix_to_radecdeg(healpix, Nside, 0.0, 0.0, &ra, &decmin); healpix_to_radecdeg(healpix, Nside, 1.0, 1.0, &ra, &decmax); printf("Healpix is bounded by RA=[%g, %g], Dec=[%g, %g] degrees.\n", ramin, ramax, decmin, decmax); } if (neighbours) { int neigh[8]; int nneigh; nneigh = healpix_get_neighbours(healpix, neigh, Nside); printf("Neighbours=[ "); for (i=0; i #include #include #include #include #include #include #include #include "os-features.h" #include "gslutils.h" #include "errors.h" static void errhandler(const char * reason, const char * file, int line, int gsl_errno) { ERROR("GSL error: \"%s\" in %s:%i (gsl errno %i = %s)", reason, file, line, gsl_errno, gsl_strerror(gsl_errno)); } void gslutils_use_error_system() { gsl_set_error_handler(errhandler); } int gslutils_invert_3x3(const double* A, double* B) { gsl_matrix* LU; gsl_permutation *p; gsl_matrix_view mB; int rtn = 0; int signum; p = gsl_permutation_alloc(3); gsl_matrix_const_view mA = gsl_matrix_const_view_array(A, 3, 3); mB = gsl_matrix_view_array(B, 3, 3); LU = gsl_matrix_alloc(3, 3); gsl_matrix_memcpy(LU, &mA.matrix); if (gsl_linalg_LU_decomp(LU, p, &signum) || gsl_linalg_LU_invert(LU, p, &mB.matrix)) { ERROR("gsl_linalg_LU_decomp() or _invert() failed."); rtn = -1; } gsl_permutation_free(p); gsl_matrix_free(LU); return rtn; } void gslutils_matrix_multiply(gsl_matrix* C, const gsl_matrix* A, const gsl_matrix* B) { gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, A, B, 0.0, C); } int gslutils_solve_leastsquares_v(gsl_matrix* A, int NB, ...) { int i, res; gsl_vector** B = malloc(NB * sizeof(gsl_vector*)); // Whoa, three-star programming! gsl_vector*** X = malloc(NB * sizeof(gsl_vector**)); gsl_vector*** R = malloc(NB * sizeof(gsl_vector**)); gsl_vector** Xtmp = malloc(NB * sizeof(gsl_vector*)); gsl_vector** Rtmp = malloc(NB * sizeof(gsl_vector*)); va_list va; va_start(va, NB); for (i=0; isize1; N = A->size2; for (i=0; isize == M); } tau = gsl_vector_alloc(MIN(M, N)); assert(tau); ret = gsl_linalg_QR_decomp(A, tau); assert(ret == 0); // A,tau now contains a packed version of Q,R. for (i=0; i 270 and min(ras) < 90: # wrap-around! ras1 = [] ras2 = [] for ra in ras: if ra < 180: ras1.append(ra) ras2.append(ra+360) else: ras1.append(ra-360) ras2.append(ra) plot(ras1, ycoord(decs), 'k--') plot(ras2, ycoord(decs), 'k-') if racen > 180: text(racen-360, ycoord(deccen), '%i' % hp, **textkws) else: text(racen+360, ycoord(deccen), '%i' % hp, **textkws) else: plot(ras, ycoord(decs), 'k-') xlabel('RA (deg)') ylabel('Dec (deg)') ylim(ycoord(-90), ycoord(90)) xlim(-40,400) yt = arange(-90, 100, 10) yticks(ycoord(yt), ['%g'%y for y in yt]) title('Healpixes (nside=%i)' % nside) if fn is None: fn = 'healpix-%i.png' % nside savefig(fn) def plot_radec_on_healpix(nside=1, bighp=1): clf() xlabel('Healpix x') ylabel('Healpix y') (ralo,rahi,declo,dechi) = healpix_radec_bounds(bighp, 1) ragrid = 5 decgrid = 5 rastep = 0.5 decstep = 0.5 ralo = floor(ralo/ragrid) *ragrid rahi = (1+floor(rahi/ragrid)) *ragrid declo = floor(declo/decgrid) *decgrid dechi = (1+floor(dechi/decgrid)) *decgrid for ra in arange(ralo,rahi,ragrid): xy=[] lastok = True for dec in arange(declo, dechi, decstep): (bhp, hpx, hpy) = radectohealpixf(ra, dec, nside) #print 'ra,dec', ra,dec, 'bighp', bhp, 'x,y', hpx,hpy if bhp != bighp: if lastok and len(xy): plot([x for x,y in xy], [y for x,y in xy], 'r-') xy = [] lastok = False continue lastok = True xy.append((hpx,hpy)) if len(xy): plot([x for x,y in xy], [y for x,y in xy], 'r-') for dec in arange(declo, dechi, decgrid): xy=[] lastok = True for ra in arange(ralo,rahi,rastep): (bhp, hpx, hpy) = radectohealpixf(ra, dec, nside) if bhp != bighp: if lastok and len(xy): plot([x for x,y in xy], [y for x,y in xy], 'r-') xy = [] lastok = False continue lastok = True xy.append((hpx,hpy)) if len(xy): plot([x for x,y in xy], [y for x,y in xy], 'r-') axhline(y=0, lw=0.5, ls='-', color='0.8') axhline(y=nside, lw=0.5, ls='-', color='0.8') axvline(x=0, lw=0.5, ls='-', color='0.8') axvline(x=nside, lw=0.5, ls='-', color='0.8') axis('scaled') axis([-0.1, nside+0.1, -0.1, nside+0.1]) title('RA,Dec lines in healpix space, for big healpix %i' % bighp) savefig('hp-radec-%i.png' % bighp) def plot_smallcircles_on_healpix(nside=1, bighp=1): clf() xlabel('Healpix x') ylabel('Healpix y') #xstep = ystep = 0.05 #radius = 1.3 xstep = ystep = 0.1 radius = 2.5 ncircle = 60 runit = sqrt(deg2distsq(radius)) figure(figsize=(6,6)) for x in arange(0, 1.001, xstep): for y in arange(0, 1.001, ystep): xyz = array(healpix_to_xyz(bighp, nside, x, y)) r,d = xyztoradec(xyz) dra,ddec = derivatives_at_radec(r,d) dra = dra[0,:] dra /= vector_norm(dra) ddec = ddec[0,:] ddec /= vector_norm(ddec) assert(abs(dot(xyz, dra)) < 1e-15) assert(abs(dot(xyz, ddec)) < 1e-15) assert(abs(dot(dra, ddec)) < 1e-15) #print dot(xyz,dra) #print dot(xyz,ddec) #print dot(dra,ddec) theta = linspace(0, 2*pi, ncircle) xyzs = array([xyz + runit*sin(t)*dra + runit*cos(t)*ddec for t in theta]) xyzs /= vector_norm(xyzs) #(bighp, hpx, hpy) = xyz_to_healpixf(p[0],p[1],p[2], nside) HPs = array([xyztohealpixf(p[0],p[1],p[2], nside) for p in xyzs]) bighps = HPs[:,0] hpx = HPs[:,1] hpy = HPs[:,2] I = (bighps == bighp) if sum(I): plot(hpx[I], hpy[I], 'r-') axhline(y=0, lw=0.5, ls='-', color='0.8') axhline(y=nside, lw=0.5, ls='-', color='0.8') axvline(x=0, lw=0.5, ls='-', color='0.8') axvline(x=nside, lw=0.5, ls='-', color='0.8') axis('scaled') margin = 0.05 axis([-margin, nside+margin, -margin, nside+margin]) title('Small circles in healpix space, for big healpix %i' % bighp) xlabel('Healpix x') ylabel('Healpix y') savefig('hp-circles-%i.png' % bighp) if __name__ == '__main__': for bighp in [1,5,9]: plot_smallcircles_on_healpix(nside=1, bighp=bighp) plot_radec_on_healpix(nside=1, bighp=bighp) plot_healpix_on_radec(nside=1, fn='healpix-1a.png') plot_healpix_on_radec(nside=3, fn='healpix-3a.png', textkws={'fontsize':8}) plot_healpix_on_radec(nside=1, cosdec=True) plot_healpix_on_radec(nside=3, cosdec=True, textkws={'fontsize':8}) astrometry.net-0.67/util/healpix-map.py000644 000765 000024 00000002723 12651445460 020326 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np from astrometry.util.util import * from astrometry.util.starutil_numpy import * def plot_healpix_boundaries(nside): for hp in range(12*nside**2): # walk healpix boundary in ra,dec rd = [] dd = np.linspace(0, 1, 100) x = 0 rd.extend([healpix_to_radecdeg(hp, nside, x, y) for y in dd]) y = 1 rd.extend([healpix_to_radecdeg(hp, nside, x, y) for x in dd]) x = 1 rd.extend([healpix_to_radecdeg(hp, nside, x, y) for y in reversed(dd)]) y = 0 rd.extend([healpix_to_radecdeg(hp, nside, x, y) for x in reversed(dd)]) rd = np.array(rd) ra,dec = rd[:,0], rd[:,1] # Put label in center of healpix xyz = radectoxyz(ra, dec) xyz = np.mean(xyz, axis=0) rc,dc = xyztoradec(xyz) plt.text(rc, dc, '%i' % hp, color='b') # handle RA wrap-around if rc > 180: ra += (ra < 90)*360 else: ra -= (ra > 270)*360 plt.plot(ra, dec, 'b-') plt.axis([360,0,-90,90]) if __name__ == '__main__': plt.clf() plot_healpix_boundaries(1) plt.savefig('hp1.png') plt.clf() plot_healpix_boundaries(2) plt.savefig('hp2.png') astrometry.net-0.67/util/healpix-utils.c000644 000765 000024 00000006233 12651445460 020503 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "bl.h" #include "healpix.h" #include "mathutil.h" #include "starutil.h" il* healpix_region_search(int seed, il* seeds, int Nside, il* accepted, il* rejected, int (*accept)(int hp, void* token), void* token, int depth) { il* frontier; anbool allocd_rej = FALSE; int d; if (!accepted) accepted = il_new(256); if (!rejected) { rejected = il_new(256); allocd_rej = TRUE; } if (seeds) //frontier = seeds; frontier = il_dupe(seeds); else { frontier = il_new(256); il_append(frontier, seed); } for (d=0; !depth || d #include #include #include #include "os-features.h" #include "healpix.h" #include "mathutil.h" #include "starutil.h" #include "keywords.h" #include "permutedsort.h" #include "log.h" // Internal type struct hp_s { int bighp; int x; int y; }; typedef struct hp_s hp_t; static int64_t hptointl(hp_t hp, int Nside) { return healpix_compose_xyl(hp.bighp, hp.x, hp.y, Nside); } static int hptoint(hp_t hp, int Nside) { return healpix_compose_xy(hp.bighp, hp.x, hp.y, Nside); } static void intltohp(int64_t pix, hp_t* hp, int Nside) { healpix_decompose_xyl(pix, &hp->bighp, &hp->x, &hp->y, Nside); } static void inttohp(int pix, hp_t* hp, int Nside) { healpix_decompose_xy(pix, &hp->bighp, &hp->x, &hp->y, Nside); } static void hp_decompose(hp_t* hp, int* php, int* px, int* py) { if (php) *php = hp->bighp; if (px) *px = hp->x; if (py) *py = hp->y; } // I've had troubles with rounding functions being declared properly // in other contexts... Declare it here so the compiler complains if // something is wrong. double round(double x); Const static Inline double mysquare(double d) { return d*d; } Const int healpix_xy_to_nested(int hp, int Nside) { int bighp,x,y; int index; int i; healpix_decompose_xy(hp, &bighp, &x, &y, Nside); if (!is_power_of_two(Nside)) { fprintf(stderr, "healpix_xy_to_nested: Nside must be a power of two.\n"); return -1; } // We construct the index called p_n' in the healpix paper, whose bits // are taken from the bits of x and y: // x = ... b4 b2 b0 // y = ... b5 b3 b1 // We go through the bits of x,y, building up "index": index = 0; for (i=0; i<(8*sizeof(int)/2); i++) { index |= (((y & 1) << 1) | (x & 1)) << (i*2); y >>= 1; x >>= 1; if (!x && !y) break; } return index + bighp * Nside * Nside; } Const int healpix_nested_to_xy(int hp, int Nside) { int bighp, x, y; int index; int i; if (!is_power_of_two(Nside)) { fprintf(stderr, "healpix_xy_to_nested: Nside must be a power of two.\n"); return -1; } bighp = hp / (Nside*Nside); index = hp % (Nside*Nside); x = y = 0; for (i=0; i<(8*sizeof(int)/2); i++) { x |= (index & 0x1) << i; index >>= 1; y |= (index & 0x1) << i; index >>= 1; if (!index) break; } return healpix_compose_xy(bighp, x, y, Nside); } Const int healpix_compose_ring(int ring, int longind, int Nside) { if (ring <= Nside) // north polar return ring * (ring-1) * 2 + longind; if (ring < 3*Nside) // equatorial return Nside*(Nside-1)*2 + Nside*4*(ring-Nside) + longind; { int ri; ri = 4*Nside - ring; return 12*Nside*Nside-1 - ( ri*(ri-1)*2 + (ri*4 - 1 - longind) ); } } void healpix_decompose_ring(int hp, int Nside, int* p_ring, int* p_longind) { // FIXME: this could be written in closed form... int longind; int ring; int offset = 0; for (ring=1; ring<=Nside; ring++) { if (offset + ring*4 > hp) { longind = hp - offset; goto gotit; } offset += ring*4; } for (; ring<(3*Nside); ring++) { if (offset + Nside*4 > hp) { longind = hp - offset; goto gotit; } offset += Nside*4; } for (; ring<(4*Nside); ring++) { if (offset + (Nside*4 - ring)*4 > hp) { longind = hp - offset; goto gotit; } offset += (Nside*4 - ring)*4; } fprintf(stderr, "healpix_decompose_ring: shouldn't get here!\n"); if (p_ring) *p_ring = -1; if (p_longind) *p_longind = -1; return; gotit: if (p_ring) *p_ring = ring; if (p_longind) *p_longind = longind; } Const int healpix_ring_to_xy(int ring, int Nside) { int bighp, x, y; int ringind, longind; healpix_decompose_ring(ring, Nside, &ringind, &longind); if (ringind <= Nside) { int ind; int v; int F1; int frow; bighp = longind / ringind; ind = longind - bighp * ringind; y = (Nside - 1 - ind); frow = bighp / 4; F1 = frow + 2; v = F1*Nside - ringind - 1; x = v - y; return healpix_compose_xy(bighp, x, y, Nside); } else if (ringind < 3*Nside) { int panel; int ind; int bottomleft; int topleft; int frow, F1, F2, s, v, h; int bighp = -1; int x, y; int hp; int R = 0; panel = longind / Nside; ind = longind % Nside; bottomleft = ind < (ringind - Nside + 1) / 2; topleft = ind < (3*Nside - ringind + 1)/2; if (!bottomleft && topleft) { // top row. bighp = panel; } else if (bottomleft && !topleft) { // bottom row. bighp = 8 + panel; } else if (bottomleft && topleft) { // left side. bighp = 4 + panel; } else if (!bottomleft && !topleft) { // right side. bighp = 4 + (panel + 1) % 4; if (bighp == 4) { longind -= (4*Nside - 1); // Gah! Wacky hack - it seems that since // "longind" is negative in this case, the // rounding behaves differently, so we end up // computing the wrong "h" and have to correct // for it. R = 1; } } frow = bighp / 4; F1 = frow + 2; F2 = 2*(bighp % 4) - (frow % 2) + 1; s = (ringind - Nside) % 2; v = F1*Nside - ringind - 1; h = 2*longind - s - F2*Nside; if (R) h--; x = (v + h) / 2; y = (v - h) / 2; //fprintf(stderr, "bighp=%i, frow=%i, F1=%i, F2=%i, s=%i, v=%i, h=%i, x=%i, y=%i.\n", bighp, frow, F1, F2, s, v, h, x, y); if ((v != (x+y)) || (h != (x-y))) { h++; x = (v + h) / 2; y = (v - h) / 2; //fprintf(stderr, "tweak h=%i, x=%i, y=%i\n", h, x, y); if ((v != (x+y)) || (h != (x-y))) { //fprintf(stderr, "still not right.\n"); } } hp = healpix_compose_xy(bighp, x, y, Nside); //fprintf(stderr, "hp %i\n", hp); return hp; } else { int ind; int v; int F1; int frow; int ri; ri = 4*Nside - ringind; bighp = 8 + longind / ri; ind = longind - (bighp%4) * ri; y = (ri-1) - ind; frow = bighp / 4; F1 = frow + 2; v = F1*Nside - ringind - 1; x = v - y; return healpix_compose_xy(bighp, x, y, Nside); } } Const int healpix_xy_to_ring(int hp, int Nside) { int bighp,x,y; int frow; int F1; int v; int ring; int index; healpix_decompose_xy(hp, &bighp, &x, &y, Nside); frow = bighp / 4; F1 = frow + 2; v = x + y; // "ring" starts from 1 at the north pole and goes to 4Nside-1 at // the south pole; the pixels in each ring have the same latitude. ring = F1*Nside - v - 1; /* ring: [1, Nside] : n pole (Nside, 2Nside] : n equatorial (2Nside+1, 3Nside) : s equat [3Nside, 4Nside-1] : s pole */ // this probably can't happen... if ((ring < 1) || (ring >= 4*Nside)) { fprintf(stderr, "Invalid ring index: %i\n", ring); return -1; } if (ring <= Nside) { // north polar. // left-to-right coordinate within this healpix index = (Nside - 1 - y); // offset from the other big healpixes index += ((bighp % 4) * ring); // offset from the other rings index += ring*(ring-1)*2; } else if (ring >= 3*Nside) { // south polar. // Here I first flip everything so that we label the pixels // at zero starting in the southeast corner, increasing to the // west and north, then subtract that from the total number of // healpixels. int ri = 4*Nside - ring; // index within this healpix index = (ri-1) - x; // big healpixes index += ((3-(bighp % 4)) * ri); // other rings index += ri*(ri-1)*2; // flip! index = 12*Nside*Nside - 1 - index; } else { // equatorial. int s, F2, h; s = (ring - Nside) % 2; F2 = 2*((int)bighp % 4) - (frow % 2) + 1; h = x - y; index = (F2 * (int)Nside + h + s) / 2; // offset from the north polar region: index += Nside*(Nside-1)*2; // offset within the equatorial region: index += Nside * 4 * (ring - Nside); // handle healpix #4 wrap-around if ((bighp == 4) && (y > x)) index += (4 * Nside - 1); //fprintf(stderr, "frow=%i, F1=%i, v=%i, ringind=%i, s=%i, F2=%i, h=%i, longind=%i.\n", frow, F1, v, ring, s, F2, h, (F2*(int)Nside+h+s)/2); } return index; } Const double healpix_side_length_arcmin(int Nside) { return sqrt((4.0 * M_PI * mysquare(180.0 * 60.0 / M_PI)) / (12.0 * Nside * Nside)); } double healpix_nside_for_side_length_arcmin(double arcmin) { return sqrt(4.0*M_PI / (mysquare(arcmin2rad(arcmin)) * 12.0)); } static Inline void swap(int* i1, int* i2) { int tmp; tmp = *i1; *i1 = *i2; *i2 = tmp; } static Inline void swap_double(double* i1, double* i2) { double tmp; tmp = *i1; *i1 = *i2; *i2 = tmp; } static Inline anbool ispolar(int healpix) { // the north polar healpixes are 0,1,2,3 // the south polar healpixes are 8,9,10,11 return (healpix <= 3) || (healpix >= 8); } static Inline anbool isequatorial(int healpix) { // the north polar healpixes are 0,1,2,3 // the south polar healpixes are 8,9,10,11 return (healpix >= 4) && (healpix <= 7); } static Inline anbool isnorthpolar(int healpix) { return (healpix <= 3); } static Inline anbool issouthpolar(int healpix) { return (healpix >= 8); } static int compose_xy(int x, int y, int Nside) { assert(Nside > 0); assert(x >= 0); assert(x < Nside); assert(y >= 0); assert(y < Nside); return (x * Nside) + y; } int healpix_compose_xy(int bighp, int x, int y, int Nside) { assert(bighp >= 0); assert(bighp < 12); return (bighp * Nside * Nside) + compose_xy(x, y, Nside); } int64_t healpix_compose_xyl(int bighp, int x, int y, int Nside) { int64_t ns = Nside; assert(Nside > 0); assert(bighp >= 0); assert(bighp < 12); assert(x >= 0); assert(x < Nside); assert(y >= 0); assert(y < Nside); return ((((int64_t)bighp * ns) + x) * ns) + y; } void healpix_convert_nside(int hp, int nside, int outnside, int* outhp) { int basehp, x, y; int ox, oy; healpix_decompose_xy(hp, &basehp, &x, &y, nside); healpix_convert_xy_nside(x, y, nside, outnside, &ox, &oy); *outhp = healpix_compose_xy(basehp, ox, oy, outnside); } void healpix_convert_xy_nside(int x, int y, int nside, int outnside, int* outx, int* outy) { double fx, fy; int ox, oy; assert(x >= 0); assert(x < nside); assert(y >= 0); assert(y < nside); // MAGIC 0.5: assume center of pixel... fx = (x + 0.5) / (double)nside; fy = (y + 0.5) / (double)nside; ox = floor(fx * outnside); oy = floor(fy * outnside); if (outx) *outx = ox; if (outy) *outy = oy; } void healpix_decompose_xy(int finehp, int* pbighp, int* px, int* py, int Nside) { int hp; assert(Nside > 0); assert(finehp < (12 * Nside * Nside)); assert(finehp >= 0); if (pbighp) { int bighp = finehp / (Nside * Nside); assert(bighp >= 0); assert(bighp < 12); *pbighp = bighp; } hp = finehp % (Nside * Nside); if (px) { *px = hp / Nside; assert(*px >= 0); assert(*px < Nside); } if (py) { *py = hp % Nside; assert(*py >= 0); assert(*py < Nside); } } void healpix_decompose_xyl(int64_t finehp, int* pbighp, int* px, int* py, int Nside) { int64_t hp; int64_t ns2 = (int64_t)Nside * (int64_t)Nside; assert(Nside > 0); assert(finehp < (12L * ns2)); assert(finehp >= 0); if (pbighp) { int bighp = finehp / ns2; assert(bighp >= 0); assert(bighp < 12); *pbighp = bighp; } hp = finehp % ns2; if (px) { *px = hp / Nside; assert(*px >= 0); assert(*px < Nside); } if (py) { *py = hp % Nside; assert(*py >= 0); assert(*py < Nside); } } /** Given a large-scale healpix number, computes its neighbour in the direction (dx,dy). Returns -1 if there is no such neighbour. */ static int healpix_get_neighbour(int hp, int dx, int dy) { if (isnorthpolar(hp)) { if ((dx == 1) && (dy == 0)) return (hp + 1) % 4; if ((dx == 0) && (dy == 1)) return (hp + 3) % 4; if ((dx == 1) && (dy == 1)) return (hp + 2) % 4; if ((dx == -1) && (dy == 0)) return (hp + 4); if ((dx == 0) && (dy == -1)) return 4 + ((hp + 1) % 4); if ((dx == -1) && (dy == -1)) return hp + 8; return -1; } else if (issouthpolar(hp)) { if ((dx == 1) && (dy == 0)) return 4 + ((hp + 1) % 4); if ((dx == 0) && (dy == 1)) return hp - 4; if ((dx == -1) && (dy == 0)) return 8 + ((hp + 3) % 4); if ((dx == 0) && (dy == -1)) return 8 + ((hp + 1) % 4); if ((dx == -1) && (dy == -1)) return 8 + ((hp + 2) % 4); if ((dx == 1) && (dy == 1)) return hp - 8; return -1; } else { if ((dx == 1) && (dy == 0)) return hp - 4; if ((dx == 0) && (dy == 1)) return (hp + 3) % 4; if ((dx == -1) && (dy == 0)) return 8 + ((hp + 3) % 4); if ((dx == 0) && (dy == -1)) return hp + 4; if ((dx == 1) && (dy == -1)) return 4 + ((hp + 1) % 4); if ((dx == -1) && (dy == 1)) return 4 + ((hp - 1) % 4); return -1; } return -1; } static int get_neighbours(hp_t hp, hp_t* neighbour, int Nside) { int base; int x, y; int nn = 0; int nbase; int nx, ny; base = hp.bighp; x = hp.x; y = hp.y; // ( + , 0 ) nx = (x + 1) % Nside; ny = y; if (x == (Nside - 1)) { nbase = healpix_get_neighbour(base, 1, 0); if (isnorthpolar(base)) { nx = x; swap(&nx, &ny); } } else nbase = base; neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; // ( + , + ) nx = (x + 1) % Nside; ny = (y + 1) % Nside; if ((x == Nside - 1) && (y == Nside - 1)) { if (ispolar(base)) nbase = healpix_get_neighbour(base, 1, 1); else nbase = -1; } else if (x == (Nside - 1)) nbase = healpix_get_neighbour(base, 1, 0); else if (y == (Nside - 1)) nbase = healpix_get_neighbour(base, 0, 1); else nbase = base; if (isnorthpolar(base)) { if (x == (Nside - 1)) nx = Nside - 1; if (y == (Nside - 1)) ny = Nside - 1; if ((x == (Nside - 1)) || (y == (Nside - 1))) swap(&nx, &ny); } //printf("(+ +): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); if (nbase != -1) { neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; } // ( 0 , + ) nx = x; ny = (y + 1) % Nside; if (y == (Nside - 1)) { nbase = healpix_get_neighbour(base, 0, 1); if (isnorthpolar(base)) { ny = y; swap(&nx, &ny); } } else nbase = base; //printf("(0 +): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; // ( - , + ) nx = (x + Nside - 1) % Nside; ny = (y + 1) % Nside; if ((x == 0) && (y == (Nside - 1))) { if (isequatorial(base)) nbase = healpix_get_neighbour(base, -1, 1); else nbase = -1; } else if (x == 0) { nbase = healpix_get_neighbour(base, -1, 0); if (issouthpolar(base)) { nx = 0; swap(&nx, &ny); } } else if (y == (Nside - 1)) { nbase = healpix_get_neighbour(base, 0, 1); if (isnorthpolar(base)) { ny = y; swap(&nx, &ny); } } else nbase = base; //printf("(- +): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); if (nbase != -1) { neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; } // ( - , 0 ) nx = (x + Nside - 1) % Nside; ny = y; if (x == 0) { nbase = healpix_get_neighbour(base, -1, 0); if (issouthpolar(base)) { nx = 0; swap(&nx, &ny); } } else nbase = base; //printf("(- 0): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; // ( - , - ) nx = (x + Nside - 1) % Nside; ny = (y + Nside - 1) % Nside; if ((x == 0) && (y == 0)) { if (ispolar(base)) nbase = healpix_get_neighbour(base, -1, -1); else nbase = -1; } else if (x == 0) nbase = healpix_get_neighbour(base, -1, 0); else if (y == 0) nbase = healpix_get_neighbour(base, 0, -1); else nbase = base; if (issouthpolar(base)) { if (x == 0) nx = 0; if (y == 0) ny = 0; if ((x == 0) || (y == 0)) swap(&nx, &ny); } //printf("(- -): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); if (nbase != -1) { neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; } // ( 0 , - ) ny = (y + Nside - 1) % Nside; nx = x; if (y == 0) { nbase = healpix_get_neighbour(base, 0, -1); if (issouthpolar(base)) { ny = y; swap(&nx, &ny); } } else nbase = base; //printf("(0 -): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; // ( + , - ) nx = (x + 1) % Nside; ny = (y + Nside - 1) % Nside; if ((x == (Nside - 1)) && (y == 0)) { if (isequatorial(base)) { nbase = healpix_get_neighbour(base, 1, -1); } else nbase = -1; } else if (x == (Nside - 1)) { nbase = healpix_get_neighbour(base, 1, 0); if (isnorthpolar(base)) { nx = x; swap(&nx, &ny); } } else if (y == 0) { nbase = healpix_get_neighbour(base, 0, -1); if (issouthpolar(base)) { ny = y; swap(&nx, &ny); } } else nbase = base; //printf("(+ -): nbase=%i, nx=%i, ny=%i, pix=%i\n", nbase, nx, ny, nbase*Ns2+xy_to_pnprime(nx,ny,Nside)); if (nbase != -1) { neighbour[nn].bighp = nbase; neighbour[nn].x = nx; neighbour[nn].y = ny; nn++; } return nn; } int healpix_get_neighbours(int pix, int* neighbour, int Nside) { hp_t neigh[8]; hp_t hp; int nn; int i; inttohp(pix, &hp, Nside); nn = get_neighbours(hp, neigh, Nside); for (i=0; i 0); /* Convert our point into cylindrical coordinates for middle ring */ phi = atan2(vy, vx); if (phi < 0.0) phi += twopi; phi_t = fmod(phi, halfpi); assert (phi_t >= 0.0); // North or south polar cap. if ((vz >= twothirds) || (vz <= -twothirds)) { double zfactor; anbool north; int column; double root; double xx, yy, kx, ky; // Which pole? if (vz >= twothirds) { north = TRUE; zfactor = 1.0; } else { north = FALSE; zfactor = -1.0; } // solve eqn 20: k = Ns - xx (in the northern hemi) root = (1.0 - vz*zfactor) * 3.0 * mysquare(Nside * (2.0 * phi_t - pi) / pi); kx = (root <= 0.0) ? 0.0 : sqrt(root); // solve eqn 19 for k = Ns - yy root = (1.0 - vz*zfactor) * 3.0 * mysquare(Nside * 2.0 * phi_t / pi); ky = (root <= 0.0) ? 0.0 : sqrt(root); if (north) { xx = Nside - kx; yy = Nside - ky; } else { xx = ky; yy = kx; } // xx, yy should be in [0, Nside]. x = MIN(Nside-1, floor(xx)); assert(x >= 0); assert(x < Nside); y = MIN(Nside-1, floor(yy)); assert(y >= 0); assert(y < Nside); dx = xx - x; dy = yy - y; sector = (phi - phi_t) / (halfpi); offset = (int)round(sector); assert(fabs(sector - offset) < EPS); offset = ((offset % 4) + 4) % 4; assert(offset >= 0); assert(offset <= 3); column = offset; if (north) basehp = column; else basehp = 8 + column; } else { // could be polar or equatorial. double sector; int offset; double u1, u2; double zunits, phiunits; double xx, yy; // project into the unit square z=[-2/3, 2/3], phi=[0, pi/2] zunits = (vz + twothirds) / (4.0 / 3.0); phiunits = phi_t / halfpi; // convert into diagonal units // (add 1 to u2 so that they both cover the range [0,2]. u1 = zunits + phiunits; u2 = zunits - phiunits + 1.0; assert(u1 >= 0.); assert(u1 <= 2.); assert(u2 >= 0.); assert(u2 <= 2.); // x is the northeast direction, y is the northwest. xx = u1 * Nside; yy = u2 * Nside; // now compute which big healpix it's in. // (note that we subtract off the modded portion used to // compute the position within the healpix, so this should be // very close to one of the boundaries.) sector = (phi - phi_t) / (halfpi); offset = (int)round(sector); assert(fabs(sector - offset) < EPS); offset = ((offset % 4) + 4) % 4; assert(offset >= 0); assert(offset <= 3); // we're looking at a square in z,phi space with an X dividing it. // we want to know which section we're in. // xx ranges from 0 in the bottom-left to 2Nside in the top-right. // yy ranges from 0 in the bottom-right to 2Nside in the top-left. // (of the phi,z unit box) if (xx >= Nside) { xx -= Nside; if (yy >= Nside) { // north polar. yy -= Nside; basehp = offset; } else { // right equatorial. basehp = ((offset + 1) % 4) + 4; } } else { if (yy >= Nside) { // left equatorial. yy -= Nside; basehp = offset + 4; } else { // south polar. basehp = 8 + offset; } } assert(xx >= -EPS); assert(xx < (Nside+EPS)); x = MAX(0, MIN(Nside-1, floor(xx))); assert(x >= 0); assert(x < Nside); dx = xx - x; assert(yy >= -EPS); assert(yy < (Nside+EPS)); y = MAX(0, MIN(Nside-1, floor(yy))); assert(y >= 0); assert(y < Nside); dy = yy - y; } hp.bighp = basehp; hp.x = x; hp.y = y; if (p_dx) *p_dx = dx; if (p_dy) *p_dy = dy; return hp; } int xyztohealpix(double x, double y, double z, int Nside) { return xyztohealpixf(x, y, z, Nside, NULL, NULL); } int64_t xyztohealpixl(double x, double y, double z, int Nside) { return xyztohealpixlf(x, y, z, Nside, NULL, NULL); } int64_t xyztohealpixlf(double x, double y, double z, int Nside, double* p_dx, double* p_dy) { hp_t hp = xyztohp(x,y,z, Nside, p_dx,p_dy); return hptointl(hp, Nside); } int xyztohealpixf(double x, double y, double z, int Nside, double* p_dx, double* p_dy) { hp_t hp = xyztohp(x,y,z, Nside, p_dx,p_dy); return hptoint(hp, Nside); } int radectohealpix(double ra, double dec, int Nside) { return xyztohealpix(radec2x(ra,dec), radec2y(ra,dec), radec2z(ra,dec), Nside); } int64_t radectohealpixlf(double ra, double dec, int Nside, double* dx, double* dy) { return xyztohealpixlf(radec2x(ra,dec), radec2y(ra,dec), radec2z(ra,dec), Nside, dx, dy); } int64_t radectohealpixl(double ra, double dec, int Nside) { return xyztohealpixl(radec2x(ra,dec), radec2y(ra,dec), radec2z(ra,dec), Nside); } int radectohealpixf(double ra, double dec, int Nside, double* dx, double* dy) { return xyztohealpixf(radec2x(ra,dec), radec2y(ra,dec), radec2z(ra,dec), Nside, dx, dy); } Const int radecdegtohealpix(double ra, double dec, int Nside) { return radectohealpix(deg2rad(ra), deg2rad(dec), Nside); } Const int64_t radecdegtohealpixl(double ra, double dec, int Nside) { return radectohealpixl(deg2rad(ra), deg2rad(dec), Nside); } int64_t radecdegtohealpixlf(double ra, double dec, int Nside, double* dx, double* dy) { return radectohealpixlf(deg2rad(ra), deg2rad(dec), Nside, dx, dy); } int radecdegtohealpixf(double ra, double dec, int Nside, double* dx, double* dy) { return radectohealpixf(deg2rad(ra), deg2rad(dec), Nside, dx, dy); } int xyzarrtohealpix(const double* xyz, int Nside) { return xyztohealpix(xyz[0], xyz[1], xyz[2], Nside); } int64_t xyzarrtohealpixl(const double* xyz, int Nside) { return xyztohealpixl(xyz[0], xyz[1], xyz[2], Nside); } int xyzarrtohealpixf(const double* xyz,int Nside, double* p_dx, double* p_dy) { return xyztohealpixf(xyz[0], xyz[1], xyz[2], Nside, p_dx, p_dy); } static void hp_to_xyz(hp_t* hp, int Nside, double dx, double dy, double* rx, double *ry, double *rz) { int chp; anbool equatorial = TRUE; double zfactor = 1.0; int xp, yp; double x, y, z; double pi = M_PI, phi; double rad; hp_decompose(hp, &chp, &xp, &yp); // this is x,y position in the healpix reference frame x = xp + dx; y = yp + dy; if (isnorthpolar(chp)) { if ((x + y) > Nside) { equatorial = FALSE; zfactor = 1.0; } } if (issouthpolar(chp)) { if ((x + y) < Nside) { equatorial = FALSE; zfactor = -1.0; } } if (equatorial) { double zoff=0; double phioff=0; x /= (double)Nside; y /= (double)Nside; if (chp <= 3) { // north phioff = 1.0; } else if (chp <= 7) { // equator zoff = -1.0; chp -= 4; } else if (chp <= 11) { // south phioff = 1.0; zoff = -2.0; chp -= 8; } else { // should never get here assert(0); } z = 2.0/3.0*(x + y + zoff); phi = pi/4*(x - y + phioff + 2*chp); } else { /* Rearrange eqns (19) and (20) to find phi_t in terms of x,y. y = Ns - k in eq(19) x - Ns - k in eq(20) (Ns - y)^2 / (Ns - x)^2 = (2 phi_t)^2 / (2 phi_t - pi)^2 Recall than y<=Ns, x<=Ns and 0<=phi_t 0); if (Nside <= 0) { logerr("healpix_get_neighbours_within_range: Nside must be > 0.\n"); return -1; } hp = xyzarrtohealpixf(xyz, Nside, &fx, &fy); healpixes[nhp] = hp; nhp++; { struct neighbour_dirn dirs[] = { // edges { fx, 0, 0, -1 }, { fx, 1, 0, 1 }, { 0 , fy,-1, 0 }, { 1 , fy, 1, 0 }, // bottom corner { 0, 0, -1, 1 }, { 0, 0, -1, 0 }, { 0, 0, -1, -1 }, { 0, 0, 0, -1 }, { 0, 0, 1, -1 }, // right corner { 1, 0, 1, 1 }, { 1, 0, 1, 0 }, { 1, 0, 1, -1 }, { 1, 0, 0, -1 }, { 1, 0, -1, -1 }, // left corner { 0, 1, 1, 1 }, { 0, 1, 0, 1 }, { 0, 1, -1, 1 }, { 0, 1, -1, 0 }, { 0, 1, -1, -1 }, // top corner { 1, 1, -1, 1 }, { 1, 1, 0, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 0 }, { 1, 1, 1, -1 }, }; int ndirs = sizeof(dirs) / sizeof(struct neighbour_dirn); double ptx, pty, ptdx, ptdy; int pthp; for (i=0; ix; pty = dir->y; ptdx = dir->dx; ptdy = dir->dy; // pt = point on the edge nearest to the query point. // FIXME -- check that this is true, esp in the polar regions! healpix_to_xyzarr(hp, Nside, ptx, pty, pt); d2 = distsq(pt, xyz, 3); // delta vector should be outside the healpix assert((ptx+step*ptdx < 0) || (ptx+step*ptdx > 1) || (pty+step*ptdy < 0) || (pty+step*ptdy > 1)); if (d2 > range*range) continue; // compute dx and dy directions that are toward the interior of // the healpix. stepdirx = (ptx < step) ? 1 : -1; stepdiry = (pty < step) ? 1 : -1; // take steps in those directions. healpix_to_xyzarr(hp, Nside, ptx + stepdirx * step, pty, ptstepx); healpix_to_xyzarr(hp, Nside, ptx, pty + stepdiry * step, ptstepy); // convert the steps into dx,dy vectors. for (j=0; j<3; j++) { ptstepx[j] = stepdirx * (ptstepx[j] - pt[j]); ptstepy[j] = stepdiry * (ptstepy[j] - pt[j]); } // take a small step in the specified direction. for (j=0; j<3; j++) across[j] = pt[j] + ptdx * ptstepx[j] + ptdy * ptstepy[j]; // see which healpix is at the end of the step. normalize_3(across); pthp = xyzarrtohealpix(across, Nside); healpixes[nhp] = pthp; nhp++; } } // Remove duplicates... for (i=0; i= dist2A) && (dist2mid >= dist2B)) break; if (dist2A < dist2B) { dist2B = dist2mid; dxB = dxmid; dyB = dymid; } else { dist2A = dist2mid; dxA = dxmid; dyA = dymid; } } // Check whether endpoint A is actually closer. dist2A = cdists[corder[0]]; if (dist2A < dist2mid) { dxA = cdx[corder[0]]; dyA = cdy[corder[0]]; healpix_to_xyzarr(hp, Nside, dxA, dyA, midxyz); dist2mid = dist2A; } if (closestxyz) memcpy(closestxyz, midxyz, 3*sizeof(double)); return distsq2deg(dist2mid); } double healpix_distance_to_radec(int hp, int Nside, double ra, double dec, double* closestradec) { double xyz[3]; double closestxyz[3]; double dist; radecdeg2xyzarr(ra, dec, xyz); dist = healpix_distance_to_xyz(hp, Nside, xyz, closestxyz); if (closestradec) xyzarr2radecdegarr(closestxyz, closestradec); return dist; } int healpix_within_range_of_radec(int hp, int Nside, double ra, double dec, double radius) { // This is the dumb trivial implementation... return (healpix_distance_to_radec(hp, Nside, ra, dec, NULL) <= radius); } int healpix_within_range_of_xyz(int hp, int Nside, const double* xyz, double radius) { return (healpix_distance_to_xyz(hp, Nside, xyz, NULL) <= radius); } void healpix_radec_bounds(int hp, int nside, double* p_ralo, double* p_rahi, double* p_declo, double* p_dechi) { // corners! double ralo,rahi,declo,dechi; double ra,dec; double dx, dy; ralo = declo = HUGE_VAL; rahi = dechi = -HUGE_VAL; for (dy=0; dy<2; dy+=1.0) { for (dx=0; dx<2; dx+=1.0) { healpix_to_radecdeg(hp, nside, dx, dy, &ra, &dec); // FIXME -- wrap-around. ralo = MIN(ra, ralo); rahi = MAX(ra, rahi); declo = MIN(dec, declo); dechi = MAX(dec, dechi); } } if (p_ralo) *p_ralo = ralo; if (p_rahi) *p_rahi = rahi; if (p_declo) *p_declo = declo; if (p_dechi) *p_dechi = dechi; } astrometry.net-0.67/util/histogram.c000644 000765 000024 00000003527 12651445460 017713 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "histogram.h" static histogram* hist_new(int nbins) { histogram* h = calloc(1, sizeof(histogram)); if (!h) { fprintf(stderr, "Couldn't allocate a histogram."); return NULL; } h->hist = calloc(nbins, sizeof(int)); if (!h->hist) { fprintf(stderr, "Couldn't allocate a histogram with %i bins.", nbins); free(h); return NULL; } h->Nbins = nbins; return h; } histogram* histogram_new_nbins(double zero, double maximum, int Nbins) { double binsize = (maximum - zero) / (double)(Nbins - 1); histogram* h = hist_new(Nbins); h->min = zero; h->binsize = binsize; return h; } histogram* histogram_new_binsize(double zero, double maximum, double binsize) { int Nbins = (int)ceil((maximum - zero) / binsize) + 1; histogram* h = hist_new(Nbins); h->min = zero; h->binsize = binsize; return h; } void histogram_free(histogram* h) { free(h->hist); free(h); } int histogram_add(histogram* h, double val) { int bin = (val - h->min) / h->binsize; if (bin < 0) bin = 0; if (bin >= h->Nbins) bin = h->Nbins - 1; h->hist[bin]++; return bin; } double histogram_mean(histogram* h) { double acc = 0.0; int n = 0; int i; for (i=0; iNbins; i++) { acc += (h->hist[i] * (i * h->binsize)); n += h->hist[i]; } return h->min + acc / n; } void histogram_print_matlab(histogram* h, FILE* fid) { int i; fprintf(fid, "[ "); for (i=0; iNbins; i++) fprintf(fid, "%s%i", (i ? ", " : ""), h->hist[i]); fprintf(fid, "]"); } void histogram_print_matlab_bin_centers(histogram* h, FILE* fid) { int i; fprintf(fid, "[ "); for (i=0; iNbins; i++) fprintf(fid, "%s%g", (i ? ", " : ""), h->min + (i + 0.5) * h->binsize); fprintf(fid, "]"); } astrometry.net-0.67/util/histogram.h000644 000765 000024 00000001360 12651445460 017711 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef HISTOGRAM_H #define HISTOGRAM_H #include struct histogram { double min; double binsize; int Nbins; int* hist; }; typedef struct histogram histogram; histogram* histogram_new_nbins(double minimum, double maximum, int Nbins); histogram* histogram_new_binsize(double minimum, double maximum, double binsize); void histogram_free(histogram* h); int histogram_add(histogram* h, double val); void histogram_print_matlab(histogram* h, FILE* fid); void histogram_print_matlab_bin_centers(histogram* h, FILE* fid); // assumes each count is on the left side of the bin. double histogram_mean(histogram* h); #endif astrometry.net-0.67/util/histogram2d.c000644 000765 000024 00000003702 12651445460 020134 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "histogram2d.h" #include "errors.h" static histogram2d* hist_new(int nx, int ny) { histogram2d* h = calloc(1, sizeof(histogram2d)); if (!h) { ERROR("Couldn't allocate a histogram2d."); return NULL; } h->hist = calloc(nx*ny, sizeof(int)); if (!h->hist) { ERROR("Couldn't allocate a histogram2d with %ix%i bins.", nx, ny); free(h); return NULL; } h->NX = nx; h->NY = ny; return h; } histogram2d* histogram2d_new_nbins(double minX, double maxX, int NbinsX, double minY, double maxY, int NbinsY) { double binsizeX = (maxX - minX) / (double)(NbinsX); double binsizeY = (maxY - minY) / (double)(NbinsY); histogram2d* h = hist_new(NbinsX, NbinsY); h->minx = minX; //h->maxx = maxX; h->miny = minY; //h->maxy = maxY; h->binsizex = binsizeX; h->binsizey = binsizeY; h->NX = NbinsX; h->NY = NbinsY; h->edgex = HIST2D_TRUNCATE; h->edgey = HIST2D_TRUNCATE; return h; } void histogram2d_free(histogram2d* h) { free(h->hist); free(h); } int histogram2d_add(histogram2d* h, double x, double y) { int binx = (x - h->minx) / h->binsizex; int biny = (y - h->miny) / h->binsizey; int bin; if (h->edgex == HIST2D_TRUNCATE) binx = MIN(h->NX-1, MAX(0, binx)); else if (h->edgex == HIST2D_DISCARD) { if (binx < 0 || binx >= h->NX) return HIST2D_DISCARDED_X; } else assert(0); if (h->edgey == HIST2D_TRUNCATE) biny = MIN(h->NY-1, MAX(0, biny)); else if (h->edgey == HIST2D_DISCARD) { if (biny < 0 || biny >= h->NY) return HIST2D_DISCARDED_Y; } else assert(0); bin = biny * h->NX + binx; h->hist[bin]++; return bin; } void histogram2d_set_x_edges(histogram2d* h, int edgepolicy) { h->edgex = edgepolicy; } void histogram2d_set_y_edges(histogram2d* h, int edgepolicy) { h->edgey = edgepolicy; } astrometry.net-0.67/util/histogram2d.h000644 000765 000024 00000001541 12651445460 020140 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef HISTOGRAM2D_H #define HISTOGRAM2D_H #include #define HIST2D_TRUNCATE 0 #define HIST2D_DISCARD 1 #define HIST2D_DISCARDED_X -1 #define HIST2D_DISCARDED_Y -2 struct histogram2d { double minx, miny; double binsizex, binsizey; int NX, NY; int* hist; // edge-handling policies HIST2D_{TRUNCATE, DISCARD, ...} int edgex, edgey; }; typedef struct histogram2d histogram2d; histogram2d* histogram2d_new_nbins(double minX, double maxX, int NbinsX, double minY, double maxY, int NbinsY); void histogram2d_set_x_edges(histogram2d* h, int edgepolicy); void histogram2d_set_y_edges(histogram2d* h, int edgepolicy); void histogram2d_free(histogram2d* h); int histogram2d_add(histogram2d* h, double x, double y); #endif astrometry.net-0.67/util/hmstodeg.py000755 000765 000024 00000001210 12651445460 017724 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from starutil_numpy import * if __name__ == '__main__': args = sys.argv[1:] if len(args) != 2: print 'Usage: %s ' % sys.argv[0] sys.exit(-1) hms = args[0] dms = args[1] ra = hmsstring2ra(hms) rastr = ra2hmsstring(ra) dec = dmsstring2dec(dms) decstr = dec2dmsstring(dec) print ' %-20s %-20s' % ('RA', 'Dec') print 'in: %-20s %-20s' % (hms, dms) print 'parsed as: %-20s %-20s' % (rastr, decstr) print 'deg: %-20f %-20f' % (ra, dec) astrometry.net-0.67/util/horizons.py000644 000765 000024 00000035371 12651445460 020001 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ''' This code allows one to interact with the JPL Horizons ephemeris service via their telnet interface. Yes, telnet. ''' # ohhhhhh yeahhhhh import telnetlib as tn import datetime import time #from bmjd import Eph from astrometry.util.file import * from astrometry.util.starutil_numpy import * from astrometry.util.fits import * import sys ''' earthfromssb-daily.eph: Ephemeris Type [change] : VECTORS Target Body [change] : Earth [Geocenter] [399] Coordinate Origin [change] : Solar System Barycenter (SSB) [500@0] Time Span [change] : Start=2003-04-28, Stop=2011-04-26, Step=1 d Table Settings [change] : CSV format=YES Display/Output [change] : plain text ''' class Eph(object): def __init__(self, fn='earthfromssb-daily.eph', txt=None, linedelim='\n'): #self.entries = [] if txt is not None: lines = txt.split(linedelim) else: lines = read_file(fn).split('\n') start = lines.index('$$SOE') end = lines.index('$$EOE') lines = lines[start+1:end] xyz = [] jds = [] lts = [] for line in lines: X = line.split(',') X = [x.strip() for x in X] X = [x for x in X if len(x)] jd,ct,x,y,z,vx,vy,vz,lt,rg,rr = X x = float(x) y = float(y) z = float(z) jd = float(jd) lt = float(lt) rg = float(rg) lt *= 86400 # days to seconds #self.entries.append(jd, ct, x,y,z, lt, rg) xyz.append((x,y,z)) jds.append(jd) lts.append(lt) self.entries = tabledata() self.entries.xyz = np.array(xyz) self.entries.jd = np.array(jds) self.entries.lt = np.array(lts) def get_entries_bounding_jd(self, jd): i = self.entries.jd.searchsorted(jd) - 1 assert(i > 0) assert(i < (len(self.entries)-1)) return self.entries[i], self.entries[i+1] # Negotiate telnet options. These ones seemed to be necessary to satisfy JPL c. 2012-02-27 class optcallback(object): def __init__(self, debug=False): self.debug = debug def __call__(self, socket, command, option): if self.debug: print 'optcallback: socket', socket, 'command #', ord(command), 'option #', ord(option) cnum = command onum = option if cnum == tn.WILL and onum in [ tn.ECHO, tn.SGA ]: if self.debug: print 'Got WILL', onum if self.debug: print 'Sending IAC DO', onum socket.send(tn.IAC + tn.DO + onum) elif cnum == tn.WILL: if self.debug: print 'Got WILL', onum if self.debug: print 'Sending IAC DONT', onum socket.send(tn.IAC + tn.DONT + onum) elif cnum == tn.DO and onum == tn.NAWS: if self.debug: print 'Got DO NAWS' # 16-bit big-endian W x H (0x00, 0x80) = 128 reply = (tn.IAC + tn.WILL + tn.NAWS + tn.IAC + tn.SB + tn.NAWS + chr(0) + chr(0x80) + chr(0) + chr(0x80) + tn.IAC + tn.SE) if self.debug: print 'Replying:', reply print ' hex: ', for c in reply: print '0x%02x' % ord(c), print socket.send(reply) elif cnum == tn.DO and onum == tn.TTYPE: if self.debug: print 'Got DO TTYPE' reply = (tn.IAC + tn.WILL + tn.TTYPE + tn.IAC + tn.SB + tn.TTYPE + chr(0) + 'DEC-VT100' + tn.IAC + tn.SE) if self.debug: print 'Replying:', reply print ' hex: ', for c in reply: print '0x%02x' % ord(c), print socket.send(reply) elif cnum == tn.DO: # and onum == tn.TTYPE: if self.debug: print 'Got DO', onum if self.debug: print 'Sending WONT', onum socket.send(tn.IAC + tn.WONT + onum) #tn.TTYPE) ''' About VT100-speak: http://www.termsys.demon.co.uk/vtansi.htm \x1b 7 \x1b [r \x1b [999;999H [{ROW};{COLUMN}HCursor Home \x1b [6n Query Cursor Position[6n Requests a Report Cursor Position response from the device. Report Cursor Position[{ROW};{COLUMN}R Generated by the device in response to a Query Cursor Position request; reports current cursor position. ''' ''' Telnet options are listed here: http://www.iana.org/assignments/telnet-options Telnet(horizons.jpl.nasa.gov,6775): recv '\xff\xfb\x01' Telnet(horizons.jpl.nasa.gov,6775): IAC WILL 1 (1: echo) Telnet(horizons.jpl.nasa.gov,6775): recv '\xff\xfb\x03\xff\xfd\x1f\xff\xfd\x18' Telnet(horizons.jpl.nasa.gov,6775): IAC WILL 3 Telnet(horizons.jpl.nasa.gov,6775): IAC DO 31 Telnet(horizons.jpl.nasa.gov,6775): IAC DO 24 (3: suppress go-ahead) (31: negotiate about window size) (24: terminal type) IAC SB NAWS <16-bit value> <16-bit value> IAC SE Sent by the Telnet client to inform the Telnet server of the window width and height. IAC SB TERMINAL-TYPE IS ... IAC SE ''' def _horizons_login(debug=False): t = tn.Telnet('horizons.jpl.nasa.gov', 6775) print 'Waiting for Horizons...' if debug: t.set_debuglevel(10) ''' Each time a telnet option is read on the input flow, this callback (if set) is called with the following parameters : callback(telnet socket, command (DO/DONT/WILL/WONT), option). No other action is done afterwards by telnetlib. ''' cb = optcallback(debug=debug) t.set_option_negotiation_callback(cb) # Horizons used to assume VT100, we think; it used to do: # # VT100: how big is your terminal? '\x1b7\x1b[r\x1b[999;999H\x1b[6n' # ESC = chr(0x1b) # txt = t.read_until(ESC + '[6n', 30) # # big enough! # t.write(ESC + '[50;150R') if debug: print 'Waiting for Horizons prompt' txt = t.read_until('Horizons>', 30) # Don't do page breaks t.write('PAGE\n') if debug: print 'Waiting for Horizons prompt' txt = t.read_until('Horizons>', 30) return t def get_radec_for_jds(bodyname, jd0, jd1, interval='1d', debug=False): t = _horizons_login(debug=debug) t.write( # Body name; if found, it asks "Continue?" '%s\r\n' % bodyname) #t.read_until('[A]pproaches, [E]phemeris, [F]tp,') #time.sleep(5) #txt = t.read_eager() #print 'Read', txt #time.sleep(1) #txt = t.read_eager() #print 'Read', txt #txt2 = t.read_until('Horizons> ') #txt2 = t.read_until(': ') txt='' txt2 = t.read_until('') print print '--------------------------------' print print txt, txt2 print print '--------------------------------' print t.write('\n') # if 'EXACT' in txt2: # ''' # >EXACT< designation search [CASE & SPACE sensitive]: # DES = C/2014 Q2; # Continue [ # Telnet(horizons.jpl.nasa.gov,6775): send 'E\r\n' # Telnet(horizons.jpl.nasa.gov,6775): recv ' n=no, ? ] : ' # Telnet(horizons.jpl.nasa.gov,6775): recv 'E\r\nContinue [ =yes, n=no, ? ] : ' # ''' # #txt = t.read_until('Continue') # txt = t.read_until('Continue [ =yes, n=no, ? ] :') # print 'Read', txt # t.write('\n') # t.write('\n') # txt = t.read_until('\nHorizons> ') # print txt txt = t.read_until('[E]phemeris') t.write('E\r\n') txt = t.read_until('Observe, Elements, Vectors [o,e,v,?]') print txt t.write('o\n') t.read_until('Coordinate center [ ,coord,geo ]') t.write('geo\n') t.read_until('Starting UT') t.write('JD %.9f\n' % jd0) t.read_until('Ending UT') t.write('JD %.9f\n' % jd1) t.read_until('Output interval [ex: 10m, 1h, 1d, ? ]') t.write('%s\n' % interval) t.read_until('Accept default output [ cr=(y), n, ?]') t.write('\n') t.read_until('Select table quantities [ <#,#..>, ?]') t.write('1\n') # t.write('n\n') # t.read_until('Select table quantities') # t.write('1\n') # t.read_until('Output reference frame') # t.write('J2000\n') # t.read_until('Time-zone correction') # t.write('\n') # t.read_until('Output UT time format [JD,CAL,BOTH]') # t.write('JD\n') # t.read_until('Output time digits [MIN,SEC,FRACSEC]') # t.write('SEC\n') # t.read_until('Output R.A. format [ HMS, DEG ]') # t.write('DEG\n') # t.read_until('Output high precision RA/DEC [YES,NO]') # t.write('YES\n') # t.read_until('Output APPARENT [ Airless,Refracted ]') # t.write('Airless\n') # t.read_until('Set units for RANGE output [ KM, AU ]') # t.write('AU\n') # t.read_until('Suppress RANGE_RATE output [ YES,NO ]') # t.write('YES\n') # t.read_until('Minimum elevation [ -90 <= elv <= 90]') # t.write('\n') # t.write('n\n') # t.read_until('Select table quantities [ <#,#..>, ?]') # t.write('1\n') # t.read_until('Output reference frame [J2000, B1950]') # t.write('J2000\n') # t.read_until('Time-zone correction [ UT=00:00,? ]') # t.write('\n') # t.read_until('Output UT time format [JD,CAL,BOTH]') # t.write('JD\n') # t.read_until('Output time digits [MIN,SEC,FRACSEC]') # t.write('SEC\n') # t.read_until('Output R.A. format [ HMS, DEG ]') # t.write('DEG\n') # t.read_until('Output high precision RA/DEC [YES,NO]') # t.write('YES\n') # t.read_until('Output APPARENT [ Airless,Refracted ]') # t.write('Airless\n') # t.read_until('Set units for RANGE output [ KM, AU ]') # t.write('AU\n') # t.read_until('Suppress RANGE_RATE output [ YES,NO ]') # t.write('YES\n') # t.read_until('Minimum elevation [ -90 <= elv <= 90]') # t.write('-90\n') #txt = t.read_until('Working ...', 10) #eph = t.read_until('>>> Select...', 60) txt = t.read_until('Ephemeris / PORT_LOGIN') header = t.read_until('$$SOE') eph = t.read_until('$$EOE') print 'Header:', header print 'Eph:', eph lines = eph.split('\n') print 'first line:', lines[0] print 'last line:', lines[-1] lines = lines[1:-1] print 'first line:', lines[0] print 'last line:', lines[-1] date,ra,dec = [],[],[] for line in lines: words = line.split() date.append(datetime.datetime.strptime(' '.join(words[:2]), '%Y-%b-%d %H:%M')) words = words[2:] ra.append(hmsstring2ra(' '.join(words[:3]))) words = words[3:] dec.append(dmsstring2dec(' '.join(words[:3]))) return date, ra, dec def get_ephemerides_for_jds(bodyname, jds, debug=False): print 'JDs:', jds t = _horizons_login() ephs = [] jd = jds[0] margin = 1. / (24.*3600.) print 'getting JD', jd t.write( # Body name; if found, it asks "Continue?" '%s\n\n' % bodyname + # [E]phemeris 'E\n' + # [O]bserve, [E]lements, [V]ectors? 'v\n' + '@0\n' + 'eclip\n' + 'JD %.9f\n' % jd + 'JD %.9f\n' % (jd+margin) + '1h\n' + 'n\nJ2000\n' + '1\n' + # corrections = NONE '2\n' + # AU/days 'YES\n' + # CSV format 'YES\n' + # label cartesian output? '3\n') txt = t.read_until('Working ...', 10) eph = t.read_until('>>> Select...', 60) if debug: print 'Got eph: "%s"' % eph ephs.append(eph) for jd in jds[1:]: print 'getting JD', jd t.write('A\nE\nv\n' + '\neclip\n' + 'JD %.9f\n' % jd + 'JD %.9f\n' % (jd+margin) + '1h\n' + '\n' ) eph2 = t.read_until('>>> Select...', 60) ephs.append(eph2) if debug: print 'Got eph: "%s"' % eph2 t.write('q\n') t.close() if debug: print 'Got text:' for i,txt in enumerate(ephs): print ' ', txt fn = 'txt%i' % i write_file(txt, fn) print 'wrote', fn EE = [Eph(txt=txt, linedelim='\r\n') for txt in ephs] return EE if __name__ == '__main__': import optparse parser = optparse.OptionParser() parser.add_option('--start', default='2000-1-1', help='Start date, YYYY-M-D, default %default') parser.add_option('--end', default='2021-1-1', help='End date, YYYY-M-D, default %default') parser.add_option('--interval', default='1d', help='Interval, default %default') parser.add_option('--body', default='C/2012 S1', help='Solar system body, default %default') parser.add_option('--fits', default='ison-ephem.fits', help='FITS table output filename, default %default') parser.add_option('--verbose', '-v', action='store_true', default=False, help='Verbose mode?') opt,args = parser.parse_args() date0 = opt.start.split('-') if len(date0) != 3: print 'Expected YYYY-M-D, got', opt.start sys.exit(-1) date0 = [int(x, 10) for x in date0] date0 = datetime.datetime(*date0) print 'Start date:', date0 jd0 = datetojd(date0) print 'Start JD:', jd0 date1 = opt.end.split('-') if len(date1) != 3: print 'Expected YYYY-M-D, got', opt.end sys.exit(-1) date1 = [int(x, 10) for x in date1] date1 = datetime.datetime(*date1) print 'End date:', date1 jd1 = datetojd(date1) print 'End JD:', jd1 date,ra,dec = get_radec_for_jds(opt.body, jd0, jd1, debug=opt.verbose, interval=opt.interval) for d,rr,dd in zip(date, ra, dec): print ' ', d, rr, dd T = fits_table() T.jd = np.array([datetojd(d) for d in date]) T.ra = np.array(ra) T.dec = np.array(dec) T.writeto(opt.fits) print 'Wrote', opt.fits sys.exit(0) # import numpy as np # jd = 2454153.93624056 + np.random.normal(size=10)*300. # ephs = get_ephemerides_for_jds('GALEX', jd) # for j,E in zip(jd,ephs): # E = E.entries[0] # print # print j # print E.jd, E.lt, E.xyz jd0 = datetojd(datetime.datetime(2013, 9, 1)) #jd1 = datetojd(datetime.datetime(2014, 3, 31)) jd1 = datetojd(datetime.datetime(2014, 1, 1)) print 'jds', jd0, jd1 date,ra,dec = get_radec_for_jds('C/2012 S1', jd0, jd1, debug=True, interval='1h') for d,r,dd in zip(date, ra, dec): print ' ', d, r, dd T = fits_table() T.jd = np.array([datetojd(d) for d in date]) T.ra = np.array(ra) T.dec = np.array(dec) T.writeto('ison-ephem.fits') astrometry.net-0.67/util/hp.png000644 000765 000024 00000075732 12651445460 016676 0ustar00dstnstaff000000 000000 PNG  IHDR XvpsBIT|d pHYsaa?i IDATxwxTgBA:H/TD*RT@=H"bxT`As@QD)z X ] E,(- H!!K$2Y{w_W.`O{afksXvЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 bbb}]J }QHHԩSiӦ [dBBBsY{ܔ X].!l>͉>^>CmذAׯݻ%IgϞUH3p89Ν;I&PQTrem޼Yŋwlȑ#ڵkPB:se@h@ ]tE袋.#N:nm7|5k`^vvY.3bbbtwL2*\5j?<Ϝ9S_J(… nݺzSϞ=UN),,L 6o#瞋yfuIJRXXZho&m:aر ߞ .T|tW*666yS4j(EDD(,,LŊSӦMfvIھ}ZjH"*]ׯ_N6lؠ[nE%JPѢEuuOuǏkȑW/.Hjҝwީu%_/s@nݪ;C%KTXX5k/"Zwޭ|P5kTBTLzZvmAzԩF`ro4 򄘘]s5?ԻwouU?nV-Y$=zh;TRzծ];%$$õa5iD?z'NhРAݻwjݱc6m#GwܡhtM5kV9\!C};w&L}޽ٳ)YfPB#Gyz'?~}ӧ߯ݻ駟`{QF4uT]q4hz5jhƌڻwoW^=[']V͚5S\\kŊ'_qkNIu)""B&Le]~X:tвeԼys}Y} (9v|>9?|ˢ|)O2|N.]=쳎s^۷oߞ޽{;>Yzu˒ܹ3Z{_v?~dɒαcR:mڴ?xSJpƍnp|>3u4k=ztNv휐gÆ /^|>K6n89ƍKN:>}:Ŷի;!!!)~$=fZI 80yۏ?|>nK>޷oiݺuӬ%>> w .,[,m/RJN 3gΤxgy&K?111jժ9!!!NBBBЀjI.kԨ$&&jժNٲeSlp (=z4Ϟ=)Sƹ3юsFb{F Hɒ%'N>}Л^8b '44ԹKÇ;>Ϲ뮻R\N|}6lؐ!Jy7L<{ضmo9~ch"eNhhӨQmI H/xi5 vr|>fnT}޼yi6I^{59_|E+?!!!ҥK3}h@x'"""Ҝ2J*ZzuO:7lٲzWӼ _M=z m߾]NJqZ###UhT[liӦiÆ իYfzSO_V:u4q(IzgSG||$}ױcG=z6mڨy[nׯYOKÆ Sm Uum_~"""4sLܹSz7o *|K7ofnZlKؖtJLLLr˖-̾馛$I]w]@PD4!vzӽs?9rD5J>ϤO>*UBCCuaY|inOjѣΝ;駟8{THNժUf=ꫯ4w\Iz(5g$rBBB\TX1[FJK/\+i_Ξ=;̾`GHZ "222ӳ;z1"e^,հo߾4'ȝ*bccխ[7|>(QB=:vb٤:tƌ:w饗?TBB6nܨ 7РAThQ/GU%JЫW_}U۶mҥK5i$?^Gӽm~sm,XgƘM:5SMҷo_UV-K/s/O?Çdɒ֭[%I]tIut2cݺu:qRlO몫 :T?z)hBڵS׮]zj(P@t5($$D˖-rɗ/"##Mk7 Wxxw﮲ej^?22Rb %&&ZQ<Ӛ4i"IZlYUV4 y8/NN>G@jԨ!IZxq_^F9r$ՇҵkW%Թs ǜ9s4qD5o\=Zn{L7nԐ!CWlYCk׮ /۶mSLLLnݺ4Uґ~m۶M7oٳg/dGLLoߞjCt.\8WTI[5~͟??͆[oUxx|tu'ٟ]{^l<j}Uttz-m۶R:;vhׯz-IR^4zh 5yd5o\5kTɒ%m6}*T7pĨjժY?avmu饗bŊڿϟsB2oI&T+qFϒWX4h#Gt~%8N1cFG3|hbbbTfMG+854 ` # a^9pTzu8}bbbԶm[)Sr DEEX[4c 2 $2ܠ +vYgӦ!⊱~ Ii'Uv% Qժ_ vN@~}W`z-ZcQAoU+O? YG!Iî&OLپki ڱsw됂kz/^د(5)kӦ ѱcqMF^i:p$tЀ54 A[nnد{ط;د / Bk`m`k`‹h@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀdђ%KϚ5kR\_UvTX1.]Zzҁ\p_AQF)'}ݺkUdI5JǏט1ci&YF]2:ljѢnt/饗ti_^+W$]}jݺN{Vg0+u4/3gڷo|H 7ܠ:uh֬Y<$ŋpjժ/?~5l05j, `eQuoV2e?k̘1jѢ;EDDhϞ= *} t!s,jҤ4ioW5|p}:}$ӬPBӧOӀ acǎZxQ…%IgΜIuXIJpOT83޽;yۢEeqVj# YԵkW)RDM4Qr/h /|'xBg_A=zׯ}HuYرchٺ۵vZ]r%׫\.]p 6LcƌQ70,dC=z(S׭[\` kh@XCЀ54 A@g;phQlYeKܮ .\ Uvlq2'gڵJBBiܮ ǥ"Eƍ ݮ y H'NH}HI#F;Joji2'R&kK˖Ie~iHߤs&>}c2kI7,\ve+B.Ȏn2?zAW{u.G5ByU 嗥s6{rh;֬>H3F:l.^=hB`G@4BBʕGݮI͇$ժ%խ+mNMN CZ>ؼ϶^OjCAvtm9W 7]HIeʸ] dR:朶s%q۰~M{6t4y{Hԥ4~5!_ /] d͞=R 'm/ oA@2D׿!Yg+L76zv@` Yӧ͐*@nc%&]AU+sݧ:tp*oKLMÆۻWdI32F` Y˼….6ˑDi|4 nWt16FCf̐ǥݮ&p=jf^;v̜ktnW}d ̫P!aV{?+V[O1Cz%|4 4nyE%:f&?. fU"x֭fK/u"#keUWIsϤ5hZRZvGAǏK/v޶mfU׺u^xA:rD=(vUy[BYcjilkܮ(05BֲZ.5eYR%j󺤬 v%=OwKk]7okg7iBᅴ~ZZj%}жz#:t0S>Ϙ=ݩZo>$ Y@.ȽڼeWKw! ..Mfr6ey׹YKk1dqX+֭[ hhu?w*o#s}&AX1aC顇ݮ{ǜr;ld-Μ1g0+#ZZtt"##./ 1˃ 2G@Œ7Gj]J_mN3MHTGz>Ln0vlNJ4k/={yŦHLLCY˙;R+){ 4#kW#mOKV|d$!8!IG@uUjƼ?sY+]~9DlY3ӁRԉG` Y-iekxgfڹt@viE N5swj<[lP֐=4 ve^vv]̌j?lԌQQڵC kf YGq#F}J}'3?|ӥKׅC` Y-Y^~YCiA Ydnjդ}͡W^Dl!k%YCpwRSbԢt萴qTE" 9cU,]ZZ܌ΌgR0!k es#  $D8QڲE3jƌm3웴$7XIC` Y-2 k>r}˶m3 jrU&5j$-\Ȱ?d[r5dCs-1,$!kg  @UJ=gFG] `Z7M.V6o.k'['}[r+kHC<$+㥆 ͚ VIY*`=k^DCC{'OJeʘ6 #p5B`KvHʟOv[nW7&oDIKL~pt[l!m4 Ii'?paN 5n{s=RzҼyҊ8.[l! IDAT5FxqtydIs ٜ[lg )р.&L7o&ؙR%Mс;l!kv֐'{HNNjNiBzgٲT !k!XCzcWWsX\(:v̼Q^~9sD3Q3lBw@!ke!X9 I&EwåÇ֛d;,Զ{u 5B`WSKfq•+ݮby^G2'LeKۤMݮD` Y-^Z^,!E Aipa? W:%]uT| MM_Ieʸ]r[5`G@P|һ>zjO=eV2;oҒ?4kynjd 5լe4 AK^03c1+XafxKܮ&v7tY-d x=kyC<߇b/m()"aթSҕW-77qqfCY-d Vs bISJwKO>v5Ȏ'0ϟ( ͐͞@F` Y-$թcfzu#p,]jQum3dc Y-d Z`yHnKH0S #TI~}bE" _;d?͢^6[l1+?r"_>sq( Ækʔyl!k%PkK/,d #CTd]۶ҭ5hƍsd[=kyC<$%&J_/eb!C'NHW\aVi&> Y8u̽^|d 5b+k ʹ}@v {jG5&nIKf!O>Ξnj[l <=yLx4z4anWs}4qy~jtkJ]Wgݮ"k`Zc:8M7 I*]: t9l!}]$&J_,9<'wiH1C\y^MZ2Z7n[9k$XQ4I3G1jޓΕ&OΓ#"!C]MF` Y-`,q^^ҦMRժVع,ԩ4m䮚5;ᅲ7v[Cr# yoH%JH{sٶDK/^lż&3 !k`C/n5XTz5[Ǝ-O7CV, utnW5B`K^ZΌe>ܷ̊iСR˖nWc#I ]M@Ț-dْWL8CS+5l(JWK Z}<~ r"2' 'vE5[Y Y$3fH"=#3f7iI*ULxԦ7Fl!kd͖`Adȑ+-_v5i2J /HW^v5CjnWȚArY3Z#k!XCz 朐ݻJ]JA13]`ժ̜IeJ'OJ۷3 ?Z!k)㥬yZRȗ(qnW\x67iI*P@s^{YAR"kDrY .4 HF i]Mp1Lh/Ms' YKY?6d-0CvHgO3 fWd[o5MRKZMxb3C.Y0^̚>" ]o))cVx͞xsbb2f"mK);t0SB#Z搵#kCr/xq3k3;nH3OpBFT1o.'NYdud-sZΑ!k9Gւ 2Ԥf;͚eˤ_{NjjU+zj Y}d-kZ9 1 K11fjޒ%ݮ6sר!}-3vd֙3Rrf mۤjܮZ#kCֲY@\P|fǥVBG>f ,-[ !kGֲeY7Ѐ SV&Mf2sp#}SJgKom#kΝr63d-Zΐ#ky 2_3/[]7CwKv5k8)<\_d-}d-oA5lh9d"ih_4pѫt-f-QܮZ kAR#kyC<$%&~L[g>)"BWOBhYʹ6HW\vE!k.@Z }^xE!!{FW/g^t{hBC%K߯޼qEd-5>fv#*J3j1z7f/vUKRnWfY#k5р Gڴ |RZj{{&nv5ǥ&M2%d.Fl!kd- 1fu׿֯JtwZt9wTtuT>Fl!k@%sڼy~7Dz]jU{7}TOgO]d]d 55u5J&Mҙ3gT~}EFFf͚*YÇcEGGkӦM*TÇL2n  zȌc]^ 66H\#w4nmI?,}ԥY[Z`kn\RX1ժUKwn6ΝI&i۶m:v옥J/kN;uJLO0 $-jN+XÇpݻeݮȚ5BC0|^s`͞=[ׯ׀.|HRr4`_^fͲP!2RG0] hN~ %Ko fܮƿȚ5B֐Wxi׮+ԩ#M(Mn~if͓ڵݮInŜ̸etnWd͛l!k <׀ 8)cؼjrff{+v58oK5k7/t!kF` YC9 ۷|>_|>*TH+Wu]&MXοmLɓfg…ݮ(N6'Kkך{l*C Y d 5 knˋ/֩StIJ ȑ#2eqAڶm9sH" hQi,ꫥG1SC֬ `tHwag+:l!kf_PBzguAmݺU-$u]+WΝ;mzHq78 JK5j]хm.EFJ[8$&JիKvIIZ]хD` Y`f珀^ZhwWjժUn޼k4d'TIgθ]QΜ1u.mN `"\)JKG]QZ"k!y)^ҽ<**JŋOɓ'uE( YP9ҿv5{i&SonWRL|7ed-5Bl<߀_ ,P.]h"ܹS;w… եK}駺{gxi2~9$E}$QխtO?yw4Y d 5{ u|>_;qΔ)Suֹ\uDGG;hK5ӵ+8v5);Ml SH7nWY .d 5o rOBOo߾# TZ5x*W˕O^91aCHア>RRlX1+?m 蓵D` Ys_^<H˫{n?"36qci`) ά4Uzup%+Kg-xe}l!k?DΞ=3gܹ6m$I:zΝ}\!+7ސ&OZ{1~6mڤyyڵS5&EJ,!=ui@)&ƜRdž;*Tf4'I6mjqZC` YC|rQլY3uY֕&NMLSE&M2KW/̛ d-o"k!yYӽoQ]Kns 4G[G3w 3urOsZF` YC|rwG}b{ll|I}嗺\R:fLǏSG7.wq ,w<YY-d ?޽{[n]${*VFOsU 6cISߌ1'1gy/,w+g=:sFj҄!5BH<߀ֲeԫW/kN߿,Y &]"Nw?'}8:t o}5@sȮu֩AVddj@3+֭3{Y, Hr͏>YCzl!kk9G!Rfґ#慯xѣ)YRZR*Xu":$U$%$+U}5dsnp5jܾȗ6i6ʃ% If6MȑHIJ| 'R+UJZ@j|c* !kȱcR><1Q[:q ѧϞ=nWbŤ2'n6ibu뤎ҥE+p`Ccɒ_֬q:o kX!! Y$<<\4c4e>}hر뮻4n8˗O7|V\viZ5itOW^"}~ժv H3f>]*RDrB+-å{Ν3.YK_;H#FۛFa54([xUyY Uh&v!|TTy')S8SLqTXɗ/3w\LeՎs^ymNZMy^c9N|bEڗ/_n.qusQܮ{52'NLrG|yJY˾ŋk؜9nWȚk3k9\wԫvE 8NTT|?W]uW_]^}Q'Sl5jݻw ȅ9NfSwq*Vt-'>ޝ;NHv%s+fތ7oNyY؄ Ca~;qqܭZ%5 8ǎ.oHqάY?;-[:W]Q,IjӦ֯_?S};ZnڶmvyiZ~ԩ5j$Iڰae?Μ럱RϞR|4sn'>ޜ[ӬRpVٳf;Y .2^r^4pZk2VԪvEDr.!A+Kz[nIRB5nX7VX߳gO5&m믿l4*W6{Zze"I3fl׼$*tңەxWK#Gnl#ke`өtMf~EFֲ`A9F H/ mdy{8Qڻ.%}||%$$8|A.T=5ktnT۷m|>_OuC橧W_5vE[7)Xqrk܌8eF͚fX)`oN]֭Skv%Fֲ)Uqݕy!X#  R:uG;vl٢_|Qk-T9 ֙4&_yfj32 i|m[dIE0 Zf$rҿW[O !k9.zxmZ=TԵn<7oz+hQ"##UF ,YRھ}֮]]vL2z5dOVB4Y*Vm ŋ֭[7u;JH0c=_>+ IO3*eFŊ/H˧^a53+N;!k9sfΜ'*hɒt衇TMU@&k;wsR/>8gܹN^Zj9!!!ɳ_8kvz̙3ljsT}Q'449vX/"`ɓOƝ;-Z]Qhq.qNv4TE ÇV~rEf̙Țtba!}d-kf\3?|ls!Cܮ2px9_||o>g߾}N|Ș1c%ҤI4oCy_|a^0_zͿ_|ݺ;Nhv%aH֭Ϳڅ_oތ{H[7)Pqq.#kYwt868NөzY˺g<Ǚ?q^}u#up^yeSTnU0B2tU| pM6Mk׮բEԼyT_n4hhEFFPq`صK*k!!fƝ իi?^za3 VnWmkHKKK{)Zsҿ%]{dOY˞VԲM!~"Mlf{3 4R"k9w絡C#u} 繓Ѓ5x`{4hg| s㥮] 7`o@>ͿF+S> Vg^|9'"V 6n^{#-d-:w6Ɏ+=4{wZ5$,XP_ZjZs &Y@t锗]rM IDATvq\)/ |֋̌liR:)/#kjfٱLoR#kCfV̉wKӦI5k]75[XG<4 |"4z9|!槞[ǓOoP;v/5Y-d ^9 9 ۾]4?8oIKBZ|KX K YCN5Bk9x^ltfջ^xP|fQ|M7@f;&kgIKd G` Yy9x~`pݏ?CY *9U;f*AfhaN3w k<߀ :TOŊ`̙҄ 믛!XYѻ9rq#Sǐ!DK+k%k [ ȷ~:{yh"͛{z2A3R* [_)bT1Mov5dY-d ^d*[l*UJXl8u|RYO SƆ1?o|Ij2!k[ _u֥{u2lPx@ڶxTI1,ԴChLt&+9A֐[ HΝOOuټys.T2e4u9qϤ7KD~@֐[9rZhYW$iӦMڸq֭˗dɒ.Ws+mNgO{ߎ#ժeY@" ! Җ-]\d 5;so@$ĉ=z̙m۶)<<\]tѣ>E]_@?.5l(*$Z%.os^'TޗIڵ+wr@ 5CC$),,L=~'>}ZNҦMM9jGn4y=[:sFj<.Ǒ79FJ@` YC $ɞ={qF8qRg&H}dJS'wcGiso},xO>Ҏfsn! kyY-d & yK.QJ5kH2SFDDO>qBĺuf s[%HӦIsyL㏥s[vMd 5"7 ~t颲egչ-[V*UԩS+9r옙]^=W='\i7 Bp۳<ׅ I}gqZC` YC|ϫEZb&Mh.TJ:c~i,`A_4w3ۤhaObyyR>>Y;l!kdo@~'u5˗/Jj$x2 7$=sCԫy|Pj֝Z@` YC |RHRݺ{壏juMd-5B<߀\6mS]w^jӦ ![W3j+X֞=r]wiWp'[^xAvRF4i$IRTT|IիWOzg\8RҾ}曒Bܮ(YR?ߌe,kpHL659|l!ko@.R\Reʔш#$IG֨QT~}XB5jpJd;Hj]MJmH]jS=zՀnjR"k`sYСCںuUfM˭>]n:5h@ъt۰گʳ^=知3;td7zMܮ&}d-5Bּ#?P H @?.5h -*}w^QBYi6J+BV%լ)o/^GY-d[-wyG]vUÆ u%aÆ;5eŹ]"2q3/^:#=ŋK}fƲ6kX@hk㣪3!$!vwB-X`ںVAPEdm~TYdGh8b$s,sg37=Ϳa IKd-5Bٲe6lx@}~':uJ?f͚{W5w}v(oCSJu]wڷ7sY5k#8 xq~tnWl!kINJMMujԨ*U3fo߾lݻ=zԪU9yK 68 6]Jټqݮp5rq>JP[5jv%CւY-d-05>|,Yv߲eԩS'k:t #J^k*zJsyB+BnU"#T/w"ߑ@` Y \y 9kԩS͇$o^;vԼy,Uo9DpG^ʕ>DJO7sY]s̿U0IKd-5BٲeKGosE?i 2EWj[7La.rΝߨ[7)l!kuـbŊ^[B"bVܮxpoK ] 2͛gݺuͿQ( kp ٳgվ%J`9rP:ҫ]MZZ*YRW:vj"oMsE Y-d ᢄe׮]ڸqc޽k>jN>%fZY~ҍ7hARZ&B` YCp{DDD+nfzJ| + _=f  p"k#k`riӦDD b, ev6:w/)"'#CJ,UR˖nW^V2ߞUbuDAE` Y .y-Pd5Imژ%w7o}{9ϥT)ЛnN6ȟ9cVT^5[Ze-X?aKkJ3fG!I5jH&-vv5cGIJ8IKd-djYsEt4fKRnWcH]=w }fԵY#?5Ypl~EƍŋC{j^Ο7Ώ_3(~[-+:$AȚ-d-xlQ~dDqȐ[pAzl>$bs۶)fl%i|Ț d kG c#W MQոOjBO^fl_~ٌu8#kE."kE."k>[^zI̼UHO=%5o.͛'}Մޓϗdd_ZNd?ZNd-pH 9'NHIIRrf%ݮ(pY+^d-odxSւZ8Cg̠xiݮ&9Ժ˹sy-V|ZZ!k#k^KN6&OjvԩYJqi0 ^Æ1|C LdxA FSH ۵,ث99ľgrԪU̷_իED]Q"kECּG֊y/ȟׂG@P;B8j_DRdԽtg͘EFJ_|tAZ5ߐ#k!k=Z+2EnWW^ݜ߽n2cf Q0V8dwdpȚZA֬^|QzeK .=d/]*)SeI=v5Y Y+<8$ڜ'MpRkQI]Uݮ(0+ժ%HGVtd;d5ky-qyzaQ3pbb?7Ѵiv5M3F&]Xd;dȚwZёE\͜iVz  m[i`iN!!C7[>LQCG֊Y ML rHoI[7Y88Tk.+̥)k0o.dZZ#k#k/в(ׂG@ͅ R2қo򃳸DD##oݮ},Md-'d-'d-Ѐ |嗻]Mh^]zq[ܮ}={&LUsBֲ#kCֲ#kCB ['=Sf@aä^ZHJNv$'KK-Z0_ȚAdZӧf̅W>}X9yR*_Lw;xP*WJI*U2EwEȚ-dY$IO>iN>}7K;]}:>s&oFȚ-dY 4 # ܮ&|V4ھ_v.Xmd 5nY 5| c}dV8QJ O-[J<`.V?]<*fG` Y-ᒵPbfU۶bI0 f>~vEk&kʕBisY-d 5`eHg_NL6GZ;td~ sgږ-Mmd 5Y e Com櫾tnW,3ґ#]w]M8P:z\^=D`Y-Pbގԩ~y AÆҶmfz\0[̬߰wnW"k[Yc Vq$\ d +nW,[frt޹sR,]v5 Y-d J H0AZZ>]2An*U2U:qBV)k?޼&[l 0mHÇK7v5ϰafܜ9f"ϤMkA"k`Z9.QifTb{hɑ#fyXܮ;fa4i~sZ6[lw88^{M+wh>Eb9O'5'LM:X5B`Kf-ЀgGVܮxasς0EܹRfҐ!nW_5B`Ke-0+! 6mCoG0:rDRE1SJt]:E/l!k_Yc Vq$fիwߥVF=2(*o[%k$Dm.=9ɪWmЋ/v.CnW k@Zb V)CzfՁfU\\1 W\z9V9wNJH`B(!kS# !hDi*GhHL4WJM pn+I [l Ԭ3w쐮Z^sBWK[J_~Ժ/ڶ55}󍻵5B`Kqe# E8R Ҙ1nWXXz6Sܒ!cjaNmh"k@h@BҥR|*W}a}A,5l(u. DQCڳGڲE*ϽuԤTk}d 5RԬ18"<sB…nݻ,ܰ[ 04sXRb 0<}Yl!kŭ"`KM552}DDȐʗ3?D+Wg[-ky"l5B`KQZ_ToIn<ikW?_n>7pC` Y-ľ\c(fMZnŜH{SIzD!k[YCNL KOFJ*QR8gJʙ))Rll>SRBY;=%dቬ[ 5`G@Ըqߛ#EGKSHiiR߾S&l!kYCh@Ю]fՈRӦnW@?H͚V*]JZHJJ[5$8W>ܜTׯIQ9y,<6[;k H3\פxA R\a.=y#& Y-d w֐?NB tWK.rȐ*T~U:pq^IUbyJD` Y-fЋ~A#Gһ4ȍ#͚e5ѣӳyYxFl!k_0Hl*M` ֪v5dI:HkJ|?DZNQj۶C!kf a V^FԦ9d v℔(Ęu##fzٳѣeN?[l)(kL*:Ͳp&|;KKG{Tiޤ[l)l=:cǤuN?t@ե{͵cWߟj֔Y-d 5G@KgΘ+cy>ۻwlׅC` Y-d  `~+M(=LxW~ꔹb׮fcڵCI\#EEʉ$5o.u,mܘEΕ6mt^}ۜIߛ.LJH-gd6l0*SLŜZm.~92'5l(eEf c V^fI2޺5ؽ۬U9b4mw7s|;3osv^;~\ ȑYF9.5|.]ڝ:m퓚5ʖ 36nTi\(>@۸QϮI kJ]a`!kwԤ իϻ=qQnYc Vq3GZ,͇d:d`~=dkRF2ғO2]mO>olh-eСff2TOf܀D g7k֘t?PaލZP=}Icl;܆  $I>*u&uv5+YHk*ʗY /opƍ3Wx͔"ܫ/xٳo6WTԡz, Z\i8)[ⶊ֭yӧݫ-P9q۫|Wh-Y~M.h@H\{Ϭ߿mOּ9||pG '=]͹T)sۖ-k tdpڵ3{9rwI'i05^ @N#=Tە tf>$/]*}2I(JrVܹ>D"kQ~q|t͟p@F|ץ9|h3*_"{uKEG|`}9Yc;+6/&>ހHdW=$['0'9/Ibu5U.i#kV7OzeBi \Y{I+ ~L @ÆqJ{={a{ %}95ٜe'ܑ5 lN6C骫*EvfDݭ/5̜ifz24H9E2 $q9i4ɽ:Qԫ̩X:x|яȚo^zI:|XZLK oȚ&Mr6i=z6ov`qiPxL @\@TYq̟*U:mZiS52/Z%K4p`@ּwΝ3?o`S9hZ+ n|Pd$o҅շ/omK _:JNd/izip+ d; _nߞ}f 4q`’EUc.3w+]6m<O~^ZZR\\*UGyDNrr 0p%B5jj֬m[2e}С*M0A{ոq}v-Xf@)nݺ))))}~i%$$hŊ$ըQCSN6J S q… ~ -YDwygV!Iwu5k,[ڵk2e(..Nr~loٲEϟ׵^m{TT6mM6,LA\\kNK+e˖ڸqV*I:x$RJ9bŊZjպ@ 8:{WHgmٳt֭[_֛o)I:s$):::ʼ7a;/PR?87pz-Y$k[ll$थTR G@6liӦyoŊjժ̩ٚWS.uAU\91bDe} xU/nƌ1cFm~{ܥjBG6 *T]wU,sN%&&fq*Q֭[~emOOO͛ux&L(p_Wn_nQ+W^RE!l`Ƒ#Grl[`6nܨ]fm+S:v>@'OԩS#I)-[*))I\sʔ)7wQjOg_V˖-զMڷo^yuE;wv߮N>ʕ+kzMf͚iɒ%9r}Q.]ZwƌRh@|0j(5o\s@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` kh@XCЀ54 ` H1c%$?Walq?W"`\q?W`\qE ` kJ]wI~s{DmK _o9N2vX}?si-=/H՛k9{'͟,Ȼ^_ߛ,hWI}}_(t_>g~}on'}wi)&FJI?396ǑΟE@Μ9#Iwq{^?x!mqhPm~E}Çf͍k.}/ݖbާOaquᄆPյk`mnWPWr\m\SSb*'dWTy-8ϑ;{nIҦMw"?rڽq[`\qwǵ0G|ݻu 7]FPpP@h8z/^5j(66rgΜݻեK]qnh@X*X` kh@XC[_kV\\զM͛7/~w}<O_ 6qaÆUz4qD/'`x;߫k׮˔KGq}\׭[CꪫR||WnM۷o϶y*W_:uJ=vrh9#v\%ZT+V5Gk׮Ͷ/c={V#GTʕUT)ג%K.+(qg}zȫoWZt˗/w"""ٳg统c}NDD3~miiiN:u-[XYpb VxJh~;տk"{Q2ekÆ Y2ߦMT^=g۞9,s@>)SH27 x+Wȑ# -\P&M_XB*222LJ%K*!!A@~zAIRJrܯRJJIIѹsŸ#99YK/oǕy-~xDGG_~馛tWoոqt7jjڴOcYb6L))) ҥKbо}{*UJ-ZPwiʔ)֚5k2X#v>S1Bkӵ~z-]TZrv͜9ԩSbE'**)Wӹsg?رcu:qqqNLLsW;_SNu4hDGG;uu^{5[/) x3[K.N\\S\9g~8k۶mDDDx!͸f"QFg䵐 Lh^uw(J*]wر#Ǿ5򖖖?/5jݻgW5j(լYSiiiZfMUVi֭αrrjԨkjǎ]5vX 0@]vW;cփ>nI;wTZ|qB\ntw4uT=cڱcΝc]vi͚50alڴI|n,:t蠲ejn VZIvܙd+WN7tS2gEGGu9n[j7oXթSGSLq>]s5*U4`۷/~ojժRJʕ+նm[k.~QQQj۶>3_ h@ ޽[Tl%''O>߮۷k^=իոqcEFFf۾euYG /{G=>瀼4hׯ &hZtZnǏgoVj4vXxݻߟy%IIIںuN}(22R/BvG)))͛+!!ASNՅ INNֱcrmÆ jܸH \ֻᆱsɓٳg^^][nѹsbŊl3oQ/}jܸq)SjK/?PZرc5yd9R 4дi$z{ R * "TxEԏD/Q ( "XRDD8(t@x~k&u]lfgϔDD@DDDDD """"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\S(h"$''D^CDDDDy:u ۶mCǎQreˉIl@|dѢE0`eY|[.#&dF=*{&OC_)thUtgƎe9/#G'^#ͳcG)O=!!i [>( JFZFޟ 64##-3}nԨQxW<뀌 'rꫣ0r+QMae:׿F[~]4/^מxbƎ}%0k~pv$''{]Jb#înb4m|-+7lҤr%5)IMa̘`W)W;$&xZf.YUXW]e~uO&N,W;.yyw5l@5l@5l@^H\zu׭3^ W򣐈EJMMEf͐lU{Y#0k䖶mS|9?Y= DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 DDDDD6 'NO<tT$$Ӧn [ޯ/vdAl*{f̀DȨ^_{x]! @@ݺ@R@*W{]YQ Á3kM_ B-V xܷ+xlX믮Jp-+KoSV͛(Xo׆zuI`,{w`$`+ bBP:w/p9@J мy&&{QpD{~X6ovN +ԯVMM<;WNÆܗ_fBIID VD"=|],s ׍QI @#^WBAɓ@ٲ@@J ""*'W]Ԫu54'O[,\tuUT<JCM^/xXN/R "[O~E=x-9!8ۚ(؀P\7.}t׷7uz`>^WBA4jfk.v uUT<ިQg2+!"q`\cGB B}{[?uuUTl@(/tO+!"l)~EXÈ3؀P;vLORJ"CL6N Fz6y=~zqt)pͺǖNi% ܯ'S`L> ޭϛWx./Po_HGFor- zۚ5g!M1㏁L~E:T7εm}? MB"gl%55͚5CJJ 6mu91N腺 [~x.@x ZUml9UKtn>4ЮY5Zlޝ'ʏY3㏁w֯C.\/v:j6˗Bu٧y=`&gufw^W@Aַ/'"""""r """""r """""r """""r zu #*(22GׯGeY#jו>6 >@R:ݶm^WCAmTQىY#0k䖼YKOćxB%źK//*EiBs5u*p5e F`-iue ul[\}5@ǎz7̾Q$"oժ:9'ĬyY#.TC{+z?^ɛ(,3SsQ0lf _V0kdFna-VFƱ.''xti`Hl22#4<=(pP|b֨0Y#ؙ52@7RRR:]VȄ "*)wII"ÆddT(BF>IIʕE^{-{~ F"Y#XZ6}^qH &O݅)< w+]f&|> 8wbFna-nf $q{>yKOS@VՑ'wx];[5rY؀wR&OVsQ{}>zJ t_ lY#)k؀/wk+Vx]b;~|>>ueZ0kf;6 3ebFna-xƧ!t]O%஻x_efC@۶MY=Y#j8P*yy[o*g{]4k>/o?|_`bFna-AZ{ Ԭ(,Fy]}5`-%Y 26 qL`"믁89ؼͺzJ_QוُYƬYcOY *6 q"Q˖z\eǎ:˗{]Ul[st,u}luUìYǬEYYfll@@…zѴ4#x]Ulxa=).=]… ka55c55c5 x]T4k )))hڴmF޳G/@^W?ii@vʕ@j89 _֏b֢ìYǬEYYNdmT,_k{@(*Ν@׮P:iUƍ^VuNcΎYvv̚=c ZB/\|UÌ@F^^~7'YYV0f^Zç 5JOKJƌ"o+'ˍuEƬ9YˍYs؀)-Z;v5k/t dey]qہ+a֘50k̚[5f-ޱ!*U~*A)rǩSnZCJ^W\fYs Ƭ36 dIѢwP?G ޽87o ѱ݋c֘50k̚[5f-^![60npPnpGظQ߁ouEY#0kf ӧƍd {I| ࡇ(~1kf¬Q.f¬[5 :6 䘆 Ł޽>"c>T.^\GÆ^WDa-Y cBW'iϞ_x]Qtz~Wl5r Fna(؀_#!!!תUrMqFt eʔAJpmUzutlW_y]QJwy'%?CRl`-Y _L1b7o붺9v܉mۢB xp1KX~=VZDKTUz v͚y]U~))z`"Z7f¬[5 6 &i=z(ƍéSvZԨQpWԩS1dJK/F* Q:^Wߵ.@ڨyY#0k$<$cp̙={6vw:t@'Ul ̙dd_i=Z_^WDV1kf¬QP1i(WJ(#%%ڵ ƛk޼9֮]fӵ+ѣio9}Z8vLz>Y#0kl@ *Vz &`޼y;v,֯_6mٳPZ|VOcw<0knR˖Z#h],Y#0k؀ԲeK|'4hv튇z?B~aShWsMƍzГn՛ <755r Fna(Aݺuѽ{w|W(Qoڴ4{x7kp%ǻ^>PwϜ}Y#0k8 Mj֬ 8qC‡bgTTaxGr庭߿E@(C ֨<1x/믁1cu$o1kf¬9>G} xTMpDD."z/'N{h׮>\]xᅨU,Yoh֬RRRдiSW-[.oTqnYkg6EV{z[5w1k̚[5f-mۦbfeЁݶn:̛7_߷Ν;mٲe_ѻwoWj%u }YY,'+K矖|I|p;f¬[55l@ ۷/vg}o6FVZtxGAɒ%q5`ĉxлwo\z7j#y;ˏb'6 q,g$&Mtpk0Jhh YY@6@f&pkѮclo Pwu@k]ƔhΝ +~RȠrc]xI7tU=ݺ͚?oEԜY 1h] _ F *L&{)ϜolTР[ g{(d*W_uf||3JKQAou>:֬]:x];v_o͛kڳf-#(Q"%K֯w&/,] -^x!P Pd*Y 7,Z'Ԫo )^X/{{6oظQgo-jv;;~\78Pts>c feK=$r =dPxaΦMa@V?1k؀)Gʘ1ui 1}7rz:p:…憫:vFfz xurGH{ZZiu#zDÆ:*֭ cD73mze-uo*>߻=k,FjQlaBҧ^u6*Cbm簘u7@ϞOۣn|u=9h?2ݥ‡^iR%FĬǟXĬ\Cj3 oss>ܭf"QC;qJuw~0x6 dʎݰ~ >|Uƍ7nwC/1#+`o;]^ "88|8{yrg6ް6U3js&p5zcǀ_((Y[\SА#=MWᆱam[gc}ux-ж_~zK|<չ>\<|AM]@pDA>)_."W D+D֭^ 0Uj-wvU:lmgd)ҸHr IDAT"II"u Rs-\1X$m ұ^bE[oٿb=k[zREܠ /RSӧEzJ3$RuUb=k&h!RHbyvf ~ZvٯcyNzD}N n]H$ǥT4k )))hڴڊ:|zHRzH@^W᭽X`̚5Z5k1kִmy B1ukz(Қ5;_8nY#0k51毿83gE彮*6ݷ:bff ff fX= >tĆ "WP_8u挞hx-ff8ff8f͜<6 >^W11oC0zl:;ff8ff8f͜iӀ-["?,ʯ_?}3FuEc{@5u* f8ff8ff͸Ga6 >$^#@ / ~2Sw~ee1kgììǬìǬڄ u% ]~dוW@(|{^g'W\_3kgìǬìǬì+. 6 > @"z]?Mǭԩ^_L4W3gf'Za5s55s55sxVM "JG"cz]9#R^9--ҥu:Ӛѣm(f-ff8ff8f͜E4OF񑜁)WN$)I1+!CEW"wn]~vHbH"άEƬǬìǬì.r"mۊdeml@c#y=kpDž" "5k>]͚:ݎw]hf.xf-7ff8ff8f͜)RD䧟ocb=ud/Г]:ɬYO7sN׽;u٪U:I&@OǬƬǬìǬì};:UF^W,l@|n< !x0sإrR-ΝkBt={j~=̚ba֌ca֌c=(WxI+ 6 >W^uN置gw+DcL )Il}~s ƬŬǬìǬh0{60~RXk0m" $'z-[l-:tм̝k̚3kˬ?f̚kƎ)ZTdÆgbݻ͛K+Vx]{uD9syχY3Y3Y3Y3Y3.޲hQ"^Wp^l?u7#XEJ|VN, | o:U읯_\v>oo̚9̚q̚9̚q̚9Aẗg۶O:ڶՋ u5 얐Wӗ_|wӦEnhƾ2k0k1k0k1k9kV< P6 1j,D RZg`>h42V-=l^ࡇ읷NG0sg֌ca֌ca֌ jN. >j׻`(]zSnp0l& Rُ4+3S矐 ,m]h{Ϲe0k1k0k1k0k1kx֬><:aj:FzaC!ggeb7nM[oun9̚q̚9̚q̚9̚qA֭O#F͚y]M|a,q{X:^y^z('horRV>"E i̚q̚9̚q̚9̚qAɚW ^WC{ ݍ|崣GEDJvotRDǢ'[&fffff\ϟo<:6 >b%5kB"7;PîF_frw3gr۷wwvUe3k1k0k1k0krcl@!X1~:s૯VtzZ_wv)+ff8ff8f͜X"5jthmbe#˗ A6急KK/ըz]I.X\J555s55sb%kCVa:0[}p|{]Mdg豪E{]ZDC^6nk̚9̚q̚9̚q̚9eˀ^|ē ^w@ͮirDٷϦlԯn)yE+$={,WN_`a֌ca֌cs֎SG];{؀m؆l޽}^WEi}+Vx]In^u-[u%1k0k1k0k1k5k/Ro3?6 &`:`DQYY7Ug8%KsU^~ f}{ɏY3Y3Y3Y3Y3ǏY[\6nP߼(uzH2""2KKnMu%{s@+-1Qnj )fffffvj%r}؀^@_.ܶYrqzUY3cofffff_"Ŋlh|ـXCsgZFGBVp @Bk7nIKظ:/fffff:SO]M T06 qπҥtr{ ]QO_Y̚q̚9̚q̚9̚q^g ۀ+OOQz esr_&Mlu#vn»ѣq9D!/ff8ff8fv}"%J̟`Y= qKݻҙ3@n:"Ʋe,n˖i]wqu䕛oCba֌ca֌c"k˖e/ԯ2; tG}H"El"r&K/I/曝_/ sŬìǬìǬfYS}{{.8X hvΟjuWìǬìǬVԡ`ř֭A_Ĝ$&K: -]wo}|N~ʙeY3Y3Y3Y3Y3Ǎ͝ L?@Z,luD33E9G$!Ad&߾nxɓqu`E$9\gwY3Y3Y3Y3Y3ɬ߯In"YY?/ u}c}iھyUW>ݾyffTǺu/5s55s55sZVHϞ"*c| :6 >.)C얎E*TS#Ok"]W<<ѣEN~y#G S_i-%J;f.ľyczK_=Ww:"l41cDUh!dq"kO_4؀XG4е%ʒdk7iO;fOIDILFԮYz͛e֭8 [oǎZo]G45k>+^U:ڵ˨ D:uϓ'Loȡ9=HR>^m߮ԩ# "oZB!oyAZϞ5|=dXUEJF8H@AZ$;vh[HF;޲v˺at*UDv~yAZ~b}]kJwb;s&o}^F he_fMһws>qNw val*YۍkҹyX.o\z}i~ש>_7_sf} 3SG]C4l= "ڳܷ۵E/ d믺%t{Z]//Yo_ki= a񞵔?~\{tVYYҍժ:d_m`bGӨXQ#y23~r}ƌvSO_vFʖ17sџ ZoWM/o\L``.cyF ȑ9(VG{8kaUŶ_fֲ%Ph4(.==h^=!ky}W_׸PesvmlYt }[bw Y(Y8Xx]bE{#ADܷOM56G.9?x=Nu+G$`<}W_m|~F:LNl^yXez֮Fq^y㏁7?i e-'`߾,b|23 6tn9C5ktP_gmZbxҹoo\˴ N쯏\.ʖwՑ%JMǎ}…z{ٲƗ}_ѣ/|ޝw_S ZoZ=˺'Z=$%z]we[WTСDV 7-+3S('^F#|ZiȲe"'ҵHeG"Y{}=N{d>>Gh!ka7ꆒ*x#GmϞ֖Y+aN7 񔵯֍w/#9#XpC۷lm&k~YֹΆ ul@|HkrSCy*K}y2Z$EH@m2c~p2~MSBz%]]X[7PGޏ'DC~:}"dg~]1}W֗Y ns?N7 "񕵰-[t 5/ҥ~_|ٚΆ ul@|Ho:L^xujڄE EИnf-^{wg] f]zIt7_$֦M }e˜!vVn.LĎc1k"?XukW:$m"%k9j%Ҳb֮VgkR}]?ڡCzͳ;:6 >b)V A͚?H~֖㔳~Эխ[Gh4keƌ˹yJW_-x\{;Z?|Eܩ#v6pK`av-vkY/ l AZ^M+b-k>GQ=w%|ΝQXֲ¹*p:6 >b-*K9b vŋ?1i_~5 c֓3dϑ#]-#C.UJĉu';tMav9{Dӿ쫯#&u͙#2wnל9z d=Ĭ9yʕ"5̈Eɹ7&|+{*,kS°.$RUmh֬ƌَ2ejbn޳GIfp+|qci`tFp4sCVFR.7mm^ _vnr2q"p0 \oa{70n\ ԫ:!F̛xuoa?_ozu͛け#u?_?X x290z-ˁJӱס &MrXȑ @n@7C_æa-´kǮ_򂖵ÇzGAJu9e P$b)k}}#[W?KY,[n^YgO`Tj)LZJJ 6mu9;޽_C:Uw.#|\wa;tn2Kt D^..Rzۺ5H2 lOzzzi]oeznfT#T'yrsB"\cO-UDjtKE<7$Jڵ+.!!6ݙ3%"YΝj:]+z)kjWJ5f8ff8ff8#Y+0SORZy-ֱ+پ}tӯ_/+>lm~u>>\WϘ55s55s5d'toqByy-؀޴I˗IO~?/:9Wu쨏OZHr?j+ff8ff8f3Y;}Z4wȁV6 ֱ)r9 tjJ}ymkIqliW>')fffffܩu' ul@|ī@|<8!RH""۶[_mݪti' 5 IDATtakiƬǬìǬìgG˶6 ֱ/|e|ΧFo]>n+4LnOm~ƬǬìǬìggFIL4 6 ֱs,)r/(b}^~=)QB?mff8ff8f;S9|Ç/Zl@c#n:3Svm}Xľ6h5˾y'ky.^LNXV1k0k1k0k1k8-[Dʖ׽ EC"ŋ$%k]g>Ey{>;_?`֌ca֌ca֌s2k3f[η l@c#nzGBg`οn]guq-XϝìǬìǬtֆ &XĺwN^;x(V ϙet lu3pСُsggb>/}5s55s55sګujNtfd#; FG(v%<_z/k\]V/i̚q̚9̚q̚9̚qnfm;]XGtx}>{:w[>w>w9h>OÆ<'0k1k0k1k0kyɓy#:6 >d.1gͲ 7]|#df,Zr¬ìǬìǬEֲD)SF_Y؀S/({- ȑ/ۊ#_]|(_`a֌ca֌c2kG!l͚?6 ֱ}%"0cZfH͚Zҥ`ҥZoZ]FY̚q̚9̚q̚9̚q~ښ54nـXGȑ"Яm4e-_n^ԌÇckcƬǬìǬì秬M!`l@c#v:fM@4}s%^WR.'O`Vlba֌ca֌cSֲDz+}eb3bNI~4jוD>fl~ŬìǬìǬǬ>C_vȩS̓ ul@|@7l-9yג%ڕSi?nb֌ca֌ca֌s֮)VL؀]>[ rڱ#ukWN-_~ Y3Y3Y3Y3Y3.6i>ӧ[؀^'-_]^r mba֌ca֌c̉eeiSYȦM:6 >b5-9/X#Fx[߷vs?|1k0k1k0k1kR֎" abGvjA23u+Wڕӌ_Y3Y3Y3Y3Y3.~6n~l@c#V}"pq9xe<}u]]U}/Y3Y3Y3Y3Y3.6e>S?؀@#թ8ƚ3ݫ?+Kܐ%ϟr55s55s5b=k""랐ߗ ul@|Lס咒Du8 /dC!Cty<'٣{b1k0k1k0k1k!k'NI]:6 >b4YY"uܹ簜eg5g.^ڕ[Y3Y3Y3Y3Y3'HY۸QT)[n1X؀XG-NscK޽n]s55s5゘?Vab1Y ](E;w,nV {%e֌ca֌ca֌ jDDKk ul@|$@L/^\!s=83ɭ| w~s4ݻoV1k1k0k1k9kN4i9rـXG tq.t8c몪~cik׶g0ȑ:K/EK֨a~WfmND~Zdd  rc6'\Ǎ&I c˼}|`nֳH!wCKժڜstcGd$oVF!kѮ30(r:';6p*%kǎfVz6y^yH}0*zwzJB!k~0A֭B"~jl߯W< ؀Ha޶M,NHOٷO^HC_D^-uh}z?;!3S_sn9"sKҥh>9)ZTscw"O_Z8Q[LEDt+a(dP5Y2,3!Ӛ?f)ke%6XZ;.@~txei,矑ab)(Й"ժ_{T\WG߀.-qc}v-Ȕ)z&M-I]sv9"} EZ{ƶ|1k95m*rٚ/=z-sWϙz5m@JֺY䧟lD/Yj"jU}_t{Ɨu~n烰.{={{p^Wc܂#-@Rw[FwKrt$p e +…@]/́k/5/wzE??gMط\YOO%J.{je!k9]gGWky(W(S[92!ka'Oe*8anAZAg.xʚHڵՉmۀMaÀcǀ#/96 ;xU%udiii2fV(QBZh!K,)pH[ofܨ8zF'Yj|.jճo:sFsu+/Nwݕ}j"ztlߌִgOZ뺘2EOIǎ=…z{ٲY):KM+W-o)2}IH6*P&"5s6hNӺ g ^[=k9ٱD$Y+sDT"֖{}v '2fyUV(+ ͛j[ ȑ#z|kϞ֗Fҭ[u=ee&eD{O#ou9sf=㚟"EX9k""7jCqUw_y;e2_@LJғ͊嬅EZg%$k{0Ƶk9ڥ[y!ݢ_r Zgխ>kfZ AZ$N!C-7Yk m|xɚ Hlg:t?x#_i:.]_ـX!>$&&ʱcrsI(;wO@w/O=VDۀt|I]n=iFlY&My^>y X䓚ΝY;|XO\9oJժŨXZal׮Qz!ѣ֖U=AZNks۽= ݀jD ܱe鐼ua,<=:6 kaÆn_tB!ap|0E"dnu.{ժ[NC܇իjq9G ɫ~}s`EҲZm&ovH6z-6kYfU[]V񒵣G5wm fMDV4zh=kv7 ">w|>iRt{I+yDoab6 iذ\ $ [.t(" _EӀNW/X} kǍYVߟ =T+vs~tH/f:%R6?_ ˬ9[[Ln7wW E9Ɓ30f-kii *"/+eae-/'ZN}8p .w.]YzujD,abUHDě񷂭nݺ1\W^}U > &УФmp2ux;M` ŋw x: `۶@:7#Gt;w]{yEV-651ўzRSy)_^?|HI6r$0aЭлwGx7NO֬I,d-u>ǏGop4jdO=AڶmZ?\x޾h@_WOPvаW9ի\y=)kV5ל|S Пk` ~{u=R%݃߳37Ќ9?f->wre=֣enÇQ#,WN?!x)YE͗lo"%k"z@Qgcb "&leVzKb^G@Tjž={ MOMM.;(E?*v 7n&z&M\g?qqίˌ+͚鍔}tر-[VV^]4 BjU!p5s55s55syDGZځN:%=ԪUKʕ+'۷e˖;@ߛ(y)M^כ(yv1kEca֌ca֌c tVg#f-K.эiE?+ջ`GMjʋY+fffffzmW뽦DX؁ ^JDq>ca,fi|?N1O\֭Ϸu+fffff\Fcu8: >RTg A66V=Y5k>~vg_~NM̙̚fffff}=֮?u,@|@_{n@yģyW|@-۶鞯hXuׅfY3Y3Y3Y3Y3g|K/~u,@|@ԪN.X_{-i}ڵ笆Yc֌ba֌ca֌ۺU/8P$7,@c#%zv{QHzp@s0@֜knb=Y3|f5g=?v]_|VXXGJ o ]nGRR{]yԩII}~uz~255s55s51k. iS!CtC0z "_;wZ[֎E}~uzo,f8ff8ff͸h[oi>^}XXGB tNyȒ%.6eMk7Ϟ͛k̞ѧk[ޮ5s55s55s!k?|s}: >jwҽ:Rynn|.]iʖٳǾͬǬìǬY;vLys-Bg X@kąh"}] ¨\ulﲽ+Ҹ _>fffff\$g[t~ 9,@c#FQnKK/*[Vd^gֱw.?!A F:55s55s5"1kfi|3 tnHÆpÍsXGήkB]ۿm~kaa֌ca֌c̉mڤiy,@c#fwGjs ]KNvg}NHMuwOfffffN$d-=]Q#Qƞ: >b6Ёs>Ͻ<׭=x|wi\z|z55s55s5"!k$&X ]w`P格+eh;M7}Y3Y3Y3Y3Y3.6uo,@c#V{\搼/]M,w=c̻3k1k0k1k0kƅc֯ע{/u,@|j;) niG.N۹wea֌ca֌c :ڵk'a~9,@c#vcoܹ /%ys{넜svxf,f8ff8f͜pZnHRH"nmY,@c#v{#vޮ!C}>[ĬǬìǬìY \aǍ-YXG t`oeޮ{={~_{b֌ca֌ca֌s6lСǮh3+ޮÇnMa̚9̚q̚9̚q̚9~Zz4ukSY& X݁NI?O{+/ff8ff8f?e-7WD[[. X2ĶEcH|vuppΝ޶e`}vY3Y3Y3Y3Y3OY>]߿wߵw,@c#N wo޴(? rrEެ f8ff8ff8?dmfQwؿl ֱ\={l]tHw('ŝqw('`a֌ca֌c2kG4i"Ңȉ/u,@|@/]z֊qwo99>"˖^0k0k1k0k1kx\-z*Vٲřu8 Ar#/d^\9l8:p@_Ⱦ}sp}۝9Y3Y3Y3Y3Y3΋Oo:XXGtGⴆ u];.'}w~] 7v~]Nc֌ca֌ca֌s3k?zab],(|S IDAT 8zFm}87  pέg~``}ʹY3Y3Y3Y3Y3έ?KÆK/9UQF5i{;6tf^qzo{¬ìǬìǬt֒E*TggXG a!{|Ͻ{]RS;7pn.55s55s5ڜ9~- X[I5s 791"ɲeUrs[_0k0k1k0k1k8_~nžeu,@|@==_7,7d}Y~v7==8֗W̚9̚q̚9̚q̚9vfI?: >EzK7ZY[_rn ^mmY-[ryǞfffffYDnbb *]7E*Uپ޶"qq7~z{g̚q̚9̚q̚9̚qvdߧNm`b @W#H^"g%SEU99""rzjUݍ QC׵~v_zn^}s4~ /?=&=C_;t0޶ut}gޮu`͚'2hȯwEڷ9LY."|b|r6cH'$ԯMY Ի(ĈLh|0@AݧZ5ԢE}e= %!As3)k?,ҫ~REE7pZ96\`nVkg{s XJz"ݺo=azm̚%'%l?tһu:iNݐV$rE{_gN^ПsH))Ivmѣ5?NjԬ}^zIEOy="&F7VRK'O=[֬)RȞ= Yk$}<&F6#ܳxEfԿΝOf7vN4HFW7enѐ;vFZMh[רpZ96LG*ͯLֲEvB;-`b @>C~[|…t?*UDkC7RL[`2+K_lG(u~~Ec_~߶n0C5jG?:rD$1Qk̭;Rf4g6_W4d-`> 8d^={ԝa7u]QGKJ YN=BsgpZJJFDR LD3hzd-]X޶: >R0_omEtCq=m9s*TX/*ͪUT{ :uJ?O͛}VM$/ۥuukm׬)ү_j ͙7:#=kɺ}Hg~Djҟ,>fvDHZ&MtY9R%aǨ_FWzmĺXoN9_m <(P24le/[q0z4w53-ZX[rr 9h<,^ 7dn-Zh?^[|۶ݧtu9MطV-8kW``T`v`G5'fs֌௿o+̭7ҳs/`ߺ9kpℾ۶Sc C| quFrvk|usJYy88LjU{ǭ7Ԭ> x#о=gm^W@{ j6M;l^,Ybkk.B7=&FSҏ\ ]?# ֱP /鱱:GcS'my衢o{^X7 EZK:yrpZiHzd}Gj)S"~z/a*r*{̞7~UK߬7ܲf4g+Wɓ43Y{5}]vv "ᗵ-[D/fR=7lŋ.e"q}pZi9+ʄ _Y_IY{UϢ3/Z7lXxOǎ!6?> NkPiiw!ҸqJ+@^{hNE3퟼M`fYRSuƺuz֡:xP_.j3)kfrmm(He-=]o}4 ZqRޭ;{(h^s*ҲpZI=Z2r=,*k?QYXXGB-@v;^cGXoOZ>R~.0i#믺|ej^/*ܾ]_CAW\g0r]w:˫KsvR-k6̙׿59˫cGs%zd矃zw;N%k%>]-~M/{k* Nۿ_u-jT+F7@lIK{|QkB7Cz{M}bٱ#g_o퐝G1ʖ-t[9b0sxu:+&g-Ԝ> {.0dЬP"Yg?n_"%kZW^۷͋YQsgvm`^n+0iP7z=^|1@:'Rtw(鐰Y %g۷7M.>ӧy&@E]ӧW? reݓӣ=NwpX=ӎ ҵko٢}3;[! +ؿv fWllplhU+i'1Q.᜵9ԣ_eˊԯ6*ҲVOSoY^#s啅nzj_JzgO>#1k?$ҫREOa.hᐵPrvOF_67Y5J밊G@c#~ zHbHFSOt@[oIIO<"'&4v i5s55s55sf-+KWS0pG t#jUpEV.i"8m R~̚q̚9̚q̚9̚qEeߵU>X/O"=w=7s+e#G$F:f8ff8ff8+Ygwެu<B?G`@̨UxkLG@W2~}fffffլ5m L/]j^W@EEm^UsPN=}6?[_m~99ﱱq"fffffYSvmk[(x: >EՋ֯E X_͟oBÒ[˪[Y3Y3Y3Y3Y3ά)RM7Y_,@)XQl?;ڶe7;f}y~t0teˬ/];?ήj}fffffY{jU`:/"y]QIY|!YY"g)'c;۟jņ,'GZ5X۽iQ^1ލ6M߷ff0k1k0k1k0k!k_~j8eu,@|ĉ@mk"MY.#;ڴ S5s55s55s)WNw,@)X,32D/Ym[ڵ F~YoRg 6n۶,]~fffff9T,_ +-,'GJcN[S;}Uxwظ_1̚q̚9̚q̚9̚q~ڪU>}XNI?/a6 Ѵ-)hע+%ƬìǬìǬ׬sH"[ڳ<  $%e^&N/͉lnlIIfffffs@͚uDAvUԃ{$D*Wٻ֨={=n,ɨ%A̚q̚9̚q̚9̚qᐵ N,/?fll/vhuKEi{>떔iSm^Y3Y3Y3Y3Y3'\v"+0V`E\k86.{wN-/ p@n޶4˖{5Ffa֌ca֌c @ժm"^&y]QՊzp1~ sHfHbH2"zӆtڞp0~޵Y3Y3Y3Y3Y3.tϯf~<b ͛ :0-ZY?ff5h߻nff8ff8f͜pС"g%o`E~zC_ ,X֬C}ns}wfffff\8gmd 6>[XD'vhG@B5խffÇz.tgvjv`੧[/fffff\gzu``+:#ׇ`(!Thjq pg}IIiYrrDV?51k0k1k0k1kDBrsEz9e )-{xgy_uCdm9]y {g8{/Y3Y3Y3Y3Y3'ڲַȹ;V|,@c#];^r<|&s߸1r+ժU/255s55s51k۶.~ 0G:Fu@N^=n^k]_vYWłF1kϬ>f̚3kYkx1`$$ Æe xw5h$'۷/`S ԯH|4/ÆpYc֌b֌ca֌cy!}w ! *ޝw!aILIH(̼)[V3Dm_MПì1kf0k1k0k1k,[y,XHQO9N:6{O7W]}lNoHŬ)ff8ff8f͜AtЂCOgb )*_u+2{W$+[b(њkuoq":O0@ANZ5ΝE-*<o/r智=EOiW$e->.j{ٳDR23E6>8љvEcfgGINֻb.JD't {yl`fo_ook0aPbw?1x={cǀMm ԫ7ڱbc]8! *W.}k/󧯿5g:wީ7kkێhŚ/6n }~ڎJU IDATm>]8q?>9R{e`h_?ɓ EvoU/Uz"%ky2s]ƣ1k6kһ*ǚZJ^9GnB_ZuNHzѣ޶k`=Dv-wu…eH33eJяO~;KI}C@z:T];B"Qp@5H#Ǐ;۞Gc8 ##cSi} \˯TIधk )\ziܲDcjУmfKbc:uMGի/1QUL;"1kEqAˮ]uov("!k<\ppMη#ڳu ([VGs`Bkm<((PQ/_Z-Ң.A_tQtcu="y11zN{9׮]o!!Ct;n"z$6V{REN:I@z$,Ve˴Os]і s֎ٿ_too|СLJ i/,"#.U;%VZY+&ci# "љ4=Ҵ~^Kky>z ɓ<b >t۶W^:U ?lܨjDj6MwX%Kk뺷mMoȹu:>n8wEک..ݻu&aKOwmє ~/xQn>_FWl)Y+ JJLsrs7ݤUD_UClgx v`#@KmKZi<98/?#;;ur}6?/[yIqq&L0]((N!kEyYim^fJ"Ϭ臈EOuhѣړE,ZН,l"!k"q^"ibVft]w7 hʕStd/? z}/fb   11NorzUVVpZ,ƲaON֋8.qz~JI3ruءcݺ"睧?C 7OnYZ1kEV{?<p;ߞpZQ q^9Ǭ)bO>|D$mq3sa=wo V@ҿWp8:վH&:~"{Ʋcxa}ڙu->.I&'k"#FhòeZlW4fj"⯬gt}LbbDf,<_.V}\WutgE8eyq=*ի߭Ii-kyu(ҡu̚%`cyݻuĥ{4~[+P>3:~g/83t|o8|geP8GiiG ŌO7|;퇵k> \zhΚ~ZqN}sNNnpZqq^@RtgEemN!yd /8۞hZA'NU{}(w墋??D^|17dҀ>wwog:jgd1>0m|zC^2_~5h72\Qѐ5')k.س9stxftX`<`Ԩ|vW? :)J5ofюg)k͛7ܷOovC׫l;#=k99ZdrnСEofXP!UƯ)S{i$uʴi?a8P|-A}};Ъp@&:mRO>}^F(ʖ5<GƎ-?}DC?7ԟV?~HW?ldm(Qa^(ФIB̙WģGW^ѝ9pZ(}o띦vgᔵV+{.Y;|8\Qڬٳ(yq_E0 n]}+=z|mYZ[mNoV_:`>,r:4bŊ:ZEF-쳽#$!pqfllQ_ε%Z&"bEOccwn㗬͛'ҳH͚z{*zE֋S[һ'&u +W:pZ},Ĉ<}EѐLӑ*WkK/ߟAE7M6ذaZnus|V-=kP^srz'T[5k{mG8`֬aBǬYìYsX׬Ev8k9{Dv`-Y#? ԩWQrsu:T4),fft̚=1kxUWEs 56?_כQ`-Y#`Bac tإKt؍u$"35r FnaOx >7=,S8p{@ddУYYzre.xB5{1kcŬYOG@(,7{o@oF}ݘ5r FnaoXM] \ye7޻ZgOo3Q(5r Fnaȏx RSuuLZZ{n:u ^]'= 1k` c֜Ƭ9`Y# k]y~hl |ٙQ`-Y#bb믿"Bԩ*VZja8~-Oc[#F=z[FϞ@r.mEf¬[53e믿#FgA=<6mڄ:y5jv܉'[nXxq)XAWso/<^zz.]nN53lT fYZ,f-YsO.>}G}UVʕ+QR%@z0rH|gٳM Kǎ}񺱳W{-(Ǭ[5r Fဧ` "8z(rrr|ȑ#HIIСCOp-RJxjjX 8~\oT=ˬWxU].PFna- &t +WFŊq5~?lm62eʠe˖lnXn`f` `0{=|80p.{]6f¬[5 ,@ X"+`…;v,/_;b׮]KMMԪU2j֬={p`+@ܹάc<ݓ 5r Fna(Dm""8uTH_ĬY0tPO?4.]g==ɓ' Eʕ;80dvsV/WNmzȿ5r Fna(Dmj*TP!_\veh߾=RRRNO+_< ##NB AaI}{ 'XTo|5%Kt}\7[[5r F(jGjڴ)^Y?ԩH z8+TԮ]3+W7n 7R{Én&NtfG]͛wM`-Ysܹs19m?Qk"emڴ .2eرc͗!*UnlذAȆ m\ 2t7&]R7gW4aּY̚7.<>-jO2c-^7nD޽OO\2z職z ǎ;=71p@Ww|i7mx-]zrFna-=ˌ;uhӦ *W7^y睇G =ر#t邑#Gb׮]Y#0k bDDn7M6ذaZnusf p@|}CѠ|y_uРp׭\fYs ƬE3 d7 ,^ FYbcu?s'p/d/fYs ƬYc֢]ŝ0y2б=ox"o/SxݢǬ9YˏYsXPrs~<G``[?r:n{n׭ _Z5{1kcŬY>,@($۷u|C饦F(f5mrkmuV:fZ5{0kc֢ *իa8` !VSBϸq_&f-t̚5Z5k1kу++KX:j8/ nUx0XJ7ݦwUŬǬìǬìǬE> T5kFA˖Ea_uK_:}ԨJ1k1ka֬cBìYǬE6 On8v 4IP떅 tG_Guf7fx̚1kb" :ڵ|z~(ȺWOvm`&[f9Z~̚s50kcӦ ?#:٧^=G~nړìYc¬1kna" (jW@ݺ-syݪs̘j׭r>fYs Ƭ%ZiXDG=]Ç'= yݲШo](ǎy00kb֘50k̚[)kH4 V HIڵvxVE'oNGZEa|}_x@ߧoe1kĬ[5rK$f-{:{E[II^JJ}AA߻떅Y Y#DB֢  s:~i@\׭cn>i}0kιvLLs?hƍ:Z5[=m;QX%Km5gtw趢k<b >(@ ?V4wഢ ^ w# S||pCb֌ %g_|zq},Ra3k۲Edr9s^a f-6Vdݺs}:un`URΊ쳚ikW gU<CݦB-5[9]wWOtS3kF{FFN?Oaפ н;pǎW_rTP"Яnw~fUR z]nnvzy,@|;2enExٺxUPk}~:dfP&Nԛ g.]{Vg/qe<Ԩ_O?ͬJjSS /#5U-~g֜}l Ԯ>|5jqw6fysgܢi޴+]~- ^7w^{կ;>pxڴ h6{)&Prv}@ϻu뀖-o_0k;yRi{w#$+̚,`ZK.{y,@("\tcǀ_4н]!dkxȞJ6IIo葒:ut7o;++KGPhL KIziiiG)5D% 5gK?HHp9XPDZULj{#*H}TAM= _zt-9ٝRx5Jsӹjw/&C@k{=-z8 =5&'G$= gCuz~ O,@(<9թZyDy~:b`,'z*U۶ZF /b8+ x=jGTPrv͍YAÇ!cbDDn7M6ذaZnus(լ7"r Fna-;of/""""""װ!"""""װ!"""""װ!"""""װ!"""""װ!5ązIDAT"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ!"""""װ@s  sط`: + č3د`:} 3د`!"""""װ!"""""{*lr?}ŋ=v.ˍe۽̓';§%-[8v x! 6Vbc |/jڞ={?_Ci=XO(_S gYǡC7u|uݮ eg~Vڴ?v-#зqDn`#'O%oߍDn׉ncWHGL?v[`tt~,HLޯخI:>y~N |n#XOCmXZA_~uWg_~uqey݌#"u#HaҥWʗ/us'ObիUus """""r /7""""""װ!"""""װ!"""""װ!"""""װ~ DÆ QbET^]toÇ#66WӦM\YдiS/_7ԩSx9j/޽{#11UV-܂"~zs=h޼9*UubغukWcBWy5x'лwoTRx7 Ǽj̫U+W,2Xn]y5/##?0j׮ *K/EJJ KرǎQvm8qG1}t9 5kVW\2O; >/{/N8c: ~ݵk:w: =='~uPLd?f 8-Z@jj*N֭[oAO˼.~e^ٿ?yԭ[-[ʕ+vkBW>GFvMkذ韍5lX`ƌFaٸꪫb (#-[ .aÆIbbb=qTZU|Ӈ**UCpQTyRbEٹsi)))#3f8=k7m֭R\9:ti̫1+jLFF۷ODD[7x|̫1+j݊+$&&F,XP|5lڵ#&M:=ԩSrKǎ=lYx)Xa&66uAzzz"\9rX]wݕowߍǏO>qᠨ~]`:uꜞvWqxNOc: >>A?͚5Ö-[Mg^Cj2Ɣ-[5jy, Pyѣ.PJ6|cԨQ%$$[oŚ5k{n[~X'N -- ۶mÔ)Sd\q93pgjժ{p||wm޺ukbӦMξ)_wލ+h׮د%۷НbWk +,^̫Qre/_ݻwdž N?fd}7nJ*8Y4׀3f{ꓒ]Wvm8r,K[ǁIs"04)M""haTAd@P "IЯUDЮ[ЪE.B*j "u5ގW|yW+f}yL׼?kÆ 1::###ʚ577OgVٚQ@| gJ%|kr9"6`#mv9זhllUDċ/~JVo޼F[[ۜ^g^g6[5/8z]\2VZ5Y\T*?<"Bd3ϟ?OYM۷oOR)j}6TSS߿?w~5KO+VH^c^o.d^c```*.הae/_Lb18p`rmY3s@.^86qHGGT,d<J%vׯO>ŝ;wbhh(.]===(qرزeKDDӸ}v;w.Ξ=o31~zl\5kӧRą bƍ100ckFD___tuuő#G|uky]+Wp|1]ԩSWzjؽ{wGGGG[.^~7n܈x'kfvѸw^9s&6on݊xIرcooyYݽ{7ٳ'555bRgggz5é;R֭[ش?͛-֦t\oa.NxUڻwo*J!uwwOSJrݵkW* fWPH)ׅKlڴ,'r. Çufuy]ޞ֮]bjiiI'NHo߾r|jMͩ.Ǐ/m-K't FQ@l FQ@l FQ@l FQ@l FQ@l FQ@l FQ@l FQ@l FQ@l FamCIENDB`astrometry.net-0.67/util/hpsplit.c000644 000765 000024 00000034643 12651445460 017404 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include "os-features.h" #include "healpix.h" #include "healpix-utils.h" #include "starutil.h" #include "errors.h" #include "log.h" #include "boilerplate.h" #include "fitsioutils.h" #include "bl.h" #include "fitstable.h" #include "ioutils.h" #include "mathutil.h" /** Accepts a list of input FITS tables, all with exactly the same structure, and including RA,Dec columns. Accepts a big-healpix Nside, and a margin specified as nmargin healpixes of a given small-healpix Nside. (OR, healpix_distance_to_radec < margin_deg?) Writes an output file for each of the big-healpixes, containing those rows that are within (or within range) of the healpix. */ const char* OPTIONS = "hvn:r:d:m:o:gc:t:b:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] [...]\n" " -o with %%i printf-pattern\n" " [-r ]: name of RA in FITS table (default RA)\n" " [-d ]: name of DEC in FITS table (default DEC)\n" " [-n ]: default is 1\n" " [-m ]: add a margin of this many degrees around the healpixes; default 0\n" " [-g]: gzip'd inputs\n" " [-c ]: copy given column name to the output files\n" " [-t ]: use the given temp dir; default is /tmp\n" " [-b ]: save the filenumber->filename map in this file; enables writing backreferences too\n" " [-v]: +verbose\n" "\n", progname); } struct cap_s { double xyz[3]; double r2; }; typedef struct cap_s cap_t; static int refill_rowbuffer(void* baton, void* buffer, unsigned int offset, unsigned int nelems) { fitstable_t* table = baton; //printf("refill_rowbuffer: offset %i, n %i\n", offset, nelems); return fitstable_read_nrows_data(table, offset, nelems, buffer); } int main(int argc, char *argv[]) { int argchar; char* progname = argv[0]; sl* infns = sl_new(16); char* outfnpat = NULL; char* racol = "RA"; char* deccol = "DEC"; char* tempdir = "/tmp"; anbool gzip = FALSE; sl* cols = sl_new(16); int loglvl = LOG_MSG; int nside = 1; double margin = 0.0; int NHP; double md; char* backref = NULL; fitstable_t* intable; fitstable_t** outtables; char** myargs; int nmyargs; int i; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'b': backref = optarg; break; case 't': tempdir = optarg; break; case 'c': sl_append(cols, optarg); break; case 'g': gzip = TRUE; break; case 'o': outfnpat = optarg; break; case 'r': racol = optarg; break; case 'd': deccol = optarg; break; case 'n': nside = atoi(optarg); break; case 'm': margin = atof(optarg); break; case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (sl_size(cols) == 0) { sl_free2(cols); cols = NULL; } nmyargs = argc - optind; myargs = argv + optind; for (i=0; i= r2b); } if (backref) { fitstable_t* tab = fitstable_open_for_writing(backref); int maxlen = 0; char* buf; for (i=0; i %s", infn, tempfn); logmsg("Running: \"%s\"\n", cmd); rtn = run_command_get_outputs(cmd, NULL, NULL); if (rtn) { ERROR("Failed to run command: \"%s\"", cmd); exit(-1); } free(cmd); infn = tempfn; } intable = fitstable_open(infn); if (!intable) { ERROR("Couldn't read catalog %s", infn); exit(-1); } NR = fitstable_nrows(intable); logmsg("Got %i rows\n", NR); any = fitscolumn_any_type(); dubl = fitscolumn_double_type(); fitstable_add_read_column_struct(intable, dubl, 1, 0, any, racol, TRUE); fitstable_add_read_column_struct(intable, dubl, 1, sizeof(double), any, deccol, TRUE); fitstable_use_buffered_reading(intable, 2*sizeof(double), 1000); R = fitstable_row_size(intable); rowbuf = buffered_read_new(R, 1000, NR, refill_rowbuffer, intable); if (fitstable_read_extension(intable, 1)) { ERROR("Failed to find RA and DEC columns (called \"%s\" and \"%s\" in the FITS file)", racol, deccol); exit(-1); } for (r=0; r healpix %i\n", hp); } else { double xyz[3]; anbool gotit = FALSE; double d2; if (!hps) hps = il_new(4); radecdeg2xyzarr(ra, dec, xyz); for (j=0; j in mincap %i (dist %g vs %g)\n", j, sqrt(d2), sqrt(mincaps[j].r2)); il_append(hps, j); gotit = TRUE; break; } } if (!gotit) { for (j=0; j in maxcap %i (dist %g vs %g)\n", j, sqrt(d2), sqrt(maxcaps[j].r2)); if (healpix_within_range_of_xyz(j, nside, xyz, margin)) { logverb(" -> and within range.\n"); il_append(hps, j); } } } } //hps = healpix_rangesearch_radec(ra, dec, margin, nside, hps); logverb(" --> healpixes: ["); for (j=0; j= il_size(hps)) break; hp = il_get(hps, j); j++; } assert(hp < NHP); assert(hp >= 0); if (!outtables[hp]) { char* outfn; fitstable_t* out; // MEMLEAK the output filename. You'll live. asprintf_safe(&outfn, outfnpat, hp); logmsg("Opening output file \"%s\"...\n", outfn); out = fitstable_open_for_writing(outfn); if (!out) { ERROR("Failed to open output table \"%s\"", outfn); exit(-1); } // Set the output table structure. if (cols) { fitstable_add_fits_columns_as_struct3(intable, out, cols, 0); } else fitstable_add_fits_columns_as_struct2(intable, out); if (backref) { tfits_type i16type; tfits_type i32type; // R = fitstable_row_size(intable); int off = R; i16type = fitscolumn_i16_type(); i32type = fitscolumn_i32_type(); fitstable_add_read_column_struct(out, i16type, 1, off, i16type, "backref_file", TRUE); off += sizeof(int16_t); fitstable_add_read_column_struct(out, i32type, 1, off, i32type, "backref_index", TRUE); } //printf("Output table:\n"); //fitstable_print_columns(out); if (fitstable_write_primary_header(out) || fitstable_write_header(out)) { ERROR("Failed to write output file headers for \"%s\"", outfn); exit(-1); } outtables[hp] = out; } if (backref) { int16_t brfile; int32_t brind; if (!padrowdata) { padrowdata = malloc(R + sizeof(int16_t) + sizeof(int32_t)); assert(padrowdata); } // convert to FITS endian brfile = htons(i); brind = htonl(r); // add backref data to rowdata memcpy(padrowdata, rowdata, R); memcpy(padrowdata + R, &brfile, sizeof(int16_t)); memcpy(padrowdata + R + sizeof(int16_t), &brind, sizeof(int32_t)); rdata = padrowdata; } else { rdata = rowdata; } if (cols) { if (fitstable_write_struct_noflip(outtables[hp], rdata)) { ERROR("Failed to copy a row of data from input table \"%s\" to output healpix %i", infn, hp); } } else { if (fitstable_write_row_data(outtables[hp], rdata)) { ERROR("Failed to copy a row of data from input table \"%s\" to output healpix %i", infn, hp); } } if (!hps) break; } if (hps) il_remove_all(hps); } buffered_read_free(rowbuf); // wack... buffered_read_free() just frees its internal buffer, // not the "rowbuf" struct itself. // who wrote this crazy code? Oh, me of 5 years ago. Jerk. free(rowbuf); fitstable_close(intable); il_free(hps); if (tempfn) { logverb("Removing temp file %s\n", tempfn); if (unlink(tempfn)) { SYSERROR("Failed to unlink() temp file \"%s\"", tempfn); } tempfn = NULL; } // fix headers so that the files are valid at this point. for (ii=0; iifid); if (fitstable_fix_header(outtables[ii])) { ERROR("Failed to fix header for healpix %i after reading input file \"%s\"", ii, originfn); exit(-1); } fseeko(outtables[ii]->fid, offset, SEEK_SET); } if (padrowdata) { free(padrowdata); padrowdata = NULL; } } for (i=0; i %s'), 'JPEG image data' : ('jpg', 'jpegtopnm %s > %s'), 'PNG image data' : ('png', 'pngtopnm %s > %s'), 'PNG image' : ('png', 'pngtopnm %s > %s'), 'GIF image data' : ('gif', 'giftopnm %s > %s'), 'Netpbm PPM' : ('ppm', 'ppmtoppm < %s > %s'), 'Netpbm PPM "rawbits" image data' : ('ppm', 'cp %s %s'), 'Netpbm PGM' : ('pgm', pgmcmd), 'Netpbm PGM "rawbits" image data' : ('pgm', pgmcmd), 'TIFF image data' : ('tiff', 'tifftopnm %s > %s'), 'PC bitmap' : ('bmp', 'bmptopnm %s > %s'), # RAW is not recognized by 'file'; we have to use 'dcraw', # but we still store this here for convenience. 'raw' : ('raw', 'dcraw -4 -c %s > %s'), } compcmds = {'gzip compressed data' : ('gz', 'gunzip -c %s > %s'), "compress'd data 16 bits" : ('gz', 'gunzip -c %s > %s'), 'bzip2 compressed data' : ('bz2', 'bunzip2 -k -c %s > %s') } # command to identify a RAW image. raw_id_cmd = 'dcraw -i %s >/dev/null 2> /dev/null' verbose = False def do_command(cmd): logging.debug('Running: "%s"' % cmd) if os.system(cmd) != 0: print >>sys.stderr, 'Command failed: %s' % cmd sys.exit(-1) def get_cmd(types, cmds): if types is None: return None ext=None cmd=None for t in types: (ext,cmd) = cmds.get(t, (None,None)) if ext is not None: break return (ext,cmd) def uncompress_file(infile, uncompressed, typeinfo=None): """ infile: input filename. uncompressed: output filename. typeinfo: output from the 'file' command; if None we'll run 'file'. Returns: comptype comptype: None if the file wasn't compressed, or 'gz' or 'bz2'. """ if typeinfo is None: typeinfo = filetype_short(infile) if typeinfo is None: logging.debug('Could not determine file type of "%s"' % infile) return None (ext,cmd) = get_cmd(typeinfo, compcmds) if ext is None: logging.debug('File is not compressed: "%s"' % '/'.join(typeinfo)) return None assert uncompressed != infile logging.debug('Compressed file (type %s), dumping to: "%s"' % (ext, uncompressed)) do_command(cmd % (shell_escape(infile), shell_escape(uncompressed))) return ext def is_raw(fn): rtn = os.system(raw_id_cmd % shell_escape(fn)) logging.debug('ran dcraw: return value %i' % rtn) return os.WIFEXITED(rtn) and (os.WEXITSTATUS(rtn) == 0) # Returns (extension, command, error) def get_image_type(infile): typeinfo = filetype_short(infile) if typeinfo is None: return (None, None, 'Could not determine file type (does the file exist?): %s' % infile) (ext,cmd) = get_cmd(typeinfo, imgcmds) logging.debug('ext: %s' % ext) # "file" recognizes some RAWs as TIFF, but tifftopnm can't read them... # run "dcraw" here if the type is TIFF. if ext == tiffext and is_raw(infile): (ext, cmd) = imgcmds['raw'] if ext is not None: return (ext, cmd, None) if ext != tiffext and is_raw(infile): # it's a RAW image. (ext, cmd) = imgcmds['raw'] return (ext, cmd, None) return (None, None, 'Unknown image type "%s"' % typeinfo) def find_program(mydir, cmd): # pull off the executable name. parts = cmd.split(' ', 1) prog = parts[0] # try the same directory - this should work for installed # versions where image2pnm.py and an-fitstopnm are both in # "bin". p = os.path.join(mydir, prog) if os.path.exists(p): return ' '.join([p, parts[1]]) logging.info('path', p, 'does not exist.') return None def image2pnm(infile, outfile, sanitized=None, force_ppm=False, no_fits2fits=False, extension=None, mydir=None, fix_sdss=False): """ infile: input filename. outfile: output filename. sanitized: for FITS images, output filename of sanitized (fits2fits'd) image. force_ppm: boolean, convert PGM to PPM so that the output is always PPM. Returns: (type, error) - type: (string): image type: 'jpg', 'png', 'gif', etc., or None if image type isn't recognized. - error: (string): error string, or None """ (ext, cmd, err) = get_image_type(infile) if ext is None: return (None, 'Image type not recognized: ' + err) tempfiles = [] (outfile_dir, outfile_file) = os.path.split(outfile) if (ext == fitsext) and fix_sdss and no_fits2fits: # We want to run fix_sdss_idr even if no_fits2fits is set. from fix_sdss_idr import is_sdss_idr_file, fix_sdss_idr_file if is_sdss_idr_file(infile): (f, fixidr) = tempfile.mkstemp('fix_sdss_idr', outfile_file, outfile_dir) os.close(f) tempfiles.append(fixidr) logging.debug('fix_sdss_idr(in="%s", out="%s")' % (infile, fixidr)) fix_sdss_idr_file(infile, fixidr) infile = fixidr # If it's a FITS file we want to filter it first because of the many # misbehaved FITS files. fits2fits is a sanitizer. if (ext == fitsext) and (not no_fits2fits): from fits2fits import fits2fits as fits2fits if not sanitized: (f, sanitized) = tempfile.mkstemp('sanitized', outfile_file, outfile_dir) os.close(f) tempfiles.append(sanitized) else: assert sanitized != infile logging.debug('fits2fits(in="%s", out="%s", fix_idr=%s)' % (infile, sanitized, str(fix_sdss))) errstr = fits2fits(infile, sanitized, fix_idr=fix_sdss) if errstr: return (None, errstr) infile = sanitized if force_ppm: original_outfile = outfile outfile_dir = os.path.dirname(outfile) (f, outfile) = tempfile.mkstemp(suffix='.pnm', dir=outfile_dir) # we might rename this file later, so don't add it to the list of # tempfiles to delete until later... os.close(f) logging.debug('temporary output file: %s' % outfile) # print 'force_ppm: original output file', original_outfile # print 'temp:', outfile if ext == fitsext and extension: cmd = an_fitstopnm_ext_cmd % extension if ext == fitsext and mydir: # an-fitstopnm: add explicit path... cmd = find_program(mydir, cmd) if cmd is None: return (None, 'Couldn\'t find the program "an-fitstopnm".') # Do the actual conversion do_command(cmd % (shell_escape(infile), shell_escape(outfile))) if force_ppm: if ext == pgmext: # Convert to PPM. do_command(pgmcmd % (shell_escape(outfile), shell_escape(original_outfile))) tempfiles.append(outfile) else: # print 'file type extension:', ext, '; renaming', outfile, 'to', original_outfile os.rename(outfile, original_outfile) for fn in tempfiles: os.unlink(fn) # Success return (ext, None) def convert_image(infile, outfile, uncompressed=None, sanitized=None, force_ppm=False, no_fits2fits=False, extension=None, mydir=None, fix_sdss=False): tempfiles = [] # if the caller didn't specify where to put the uncompressed file, # create a tempfile. if uncompressed is None: (outfile_dir, outfile_file) = os.path.split(outfile) (f, uncompressed) = tempfile.mkstemp('', 'uncomp', outfile_dir) os.close(f) tempfiles.append(uncompressed) comp = uncompress_file(infile, uncompressed) if comp: print 'compressed' print comp infile = uncompressed (imgtype, errstr) = image2pnm(infile, outfile, sanitized, force_ppm, no_fits2fits, extension, mydir, fix_sdss) for fn in tempfiles: os.unlink(fn) if errstr: logging.error('ERROR: %s' % errstr) return -1 print imgtype return 0 def main(): from optparse import OptionParser parser = OptionParser() parser.add_option('-i', '--infile', dest='infile', help='input image FILE', metavar='FILE') parser.add_option('-u', '--uncompressed-outfile', dest='uncompressed_outfile', help='uncompressed temporary FILE', metavar='FILE', default='') parser.add_option('-s', '--sanitized-fits-outfile', dest='sanitized_outfile', help='sanitized temporary fits FILE', metavar='FILE', default='') parser.add_option('-o', '--outfile', dest='outfile', help='output pnm image FILE', metavar='FILE') parser.add_option('-p', '--ppm', action='store_true', dest='force_ppm', help='convert the output to PPM') parser.add_option('-e', '--extension', dest='extension', type='int', help='FITS extension to read') parser.add_option('-2', '--no-fits2fits', action='store_true', dest='no_fits2fits', help="don't sanitize FITS files") parser.add_option('-S', '--fix-sdss', action='store_true', dest='fix_sdss', help="fix SDSS idR files") parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='be chatty') (options, args) = parser.parse_args() if not options.infile: parser.error('required argument missing: infile') if not options.outfile: parser.error('required argument missing: outfile') # Find the path to this executable and use it to find other Astrometry.net # executables. if (len(sys.argv) > 0): mydir = os.path.dirname(sys.argv[0]) global verbose verbose = options.verbose logformat = '%(message)s' if verbose: logging.basicConfig(level=logging.DEBUG, format=logformat) else: logging.basicConfig(level=logging.INFO, format=logformat) logging.raiseExceptions = False return convert_image(options.infile, options.outfile, options.uncompressed_outfile, options.sanitized_outfile, options.force_ppm, options.no_fits2fits, options.extension, mydir, fix_sdss=options.fix_sdss) if __name__ == '__main__': sys.exit(main()) astrometry.net-0.67/util/image2xy.c000644 000765 000024 00000005306 12651445460 017440 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include "os-features.h" #include "image2xy.h" #include "ioutils.h" #include "simplexy.h" #include "dimage.h" #include "errors.h" #include "log.h" #include "mathutil.h" static float* upconvert(unsigned char* u8, int nx, int ny) { int i; float* f = malloc(nx * ny * sizeof(float)); if (!f) { SYSERROR("Failed to allocate image array to upconvert u8 image to floating-point."); return NULL; } for (i=0; i<(nx*ny); i++) f[i] = u8[i]; return f; } static void rebin(float** thedata, int W, int H, int S, int* newW, int* newH) { float sigma = S; get_output_image_size(W, H, S, EDGE_AVERAGE, newW, newH); // Gaussian smooth in-place. dsmooth2(*thedata, W, H, sigma, *thedata); // Average SxS blocks, placing the result in the bottom (newW * newH) first pixels. if (!average_image_f(*thedata, W, H, S, EDGE_AVERAGE, newW, newH, *thedata)) { ERROR("Averaging the image failed."); return; } } int image2xy_run(simplexy_t* s, int downsample, int downsample_as_required) { int newW, newH; anbool free_fimage = FALSE; // the factor by which to downsample. int S = downsample ? downsample : 1; int jj; anbool tryagain; int rtn = -1; if (downsample && downsample > 1) { logmsg("Downsampling by %i...\n", S); if (!s->image) { s->image = upconvert(s->image_u8, s->nx, s->ny); free_fimage = TRUE; } if (!s->image) goto bailout; rebin(&s->image, s->nx, s->ny, S, &newW, &newH); s->nx = newW; s->ny = newH; } do { simplexy_run(s); tryagain = FALSE; if (s->npeaks == 0 && downsample_as_required) { logmsg("Downsampling by 2...\n"); if (s->image_u8) { s->image = upconvert(s->image_u8, s->nx, s->ny); if (!s->image) goto bailout; free_fimage = TRUE; s->image_u8 = NULL; } rebin(&s->image, s->nx, s->ny, 2, &newW, &newH); s->nx = newW; s->ny = newH; S *= 2; tryagain = TRUE; downsample_as_required--; } } while (tryagain); for (jj=0; jjnpeaks; jj++) { assert(isfinite((s->x)[jj])); assert(isfinite((s->y)[jj])); // shift the origin to the FITS standard: // center of the lower-left pixel is (1,1). (s->x)[jj] = ((s->x)[jj] + 0.5) * (double)S + 0.5; (s->y)[jj] = ((s->y)[jj] + 0.5) * (double)S + 0.5; } dselip_cleanup(); rtn = 0; bailout: if (free_fimage) { free(s->image); s->image = NULL; } return rtn; } astrometry.net-0.67/util/imageutils.py000644 000765 000024 00000002246 12651445460 020264 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import numpy def write_pnm_to(img, f, maxval=255): if len(img.shape) == 1: raise 'write_pnm: img is one-dimensional: must be 2 or 3.' elif len(img.shape) == 2: #pnmtype = 'G' pnmcode = 5 (h,w) = img.shape elif len(img.shape) == 3: (h,w,planes) = img.shape #pnmtype = 'P' pnmcode = 6 if planes != 3: raise 'write_pnm: img must have 3 planes, not %i' % planes else: raise 'write_pnm: img must have <= 3 dimensions.' if img.max() > maxval: print 'write_pnm: Some pixel values are > maxval (%i): clipping them.' % maxval if img.min() < 0: print 'write_pnm: Some pixel values are < 0: clipping them.' clipped = img.clip(0, maxval) maxval = int(maxval) if maxval > 65535: raise 'write_pnm: maxval must be <= 65535' if maxval < 0: raise 'write_pnm: maxval must be positive' f.write('P%i %i %i %i ' % (pnmcode, w, h, maxval)) if maxval <= 255: f.write(img.astype(numpy.uint8).data) else: f.write(img.astype(numpy.uint16).data) def write_pnm(img, filename, maxval=255): f = open(filename, 'wb') write_pnm_to(img, f, maxval) f.close() astrometry.net-0.67/util/index-demo.py000644 000765 000024 00000001633 12651445460 020151 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from astrometry.util.index import * if __name__ == '__main__': # ~/deblend/tsObj-000745-3-40-0564.fit # build-index -i MyTable_dstn.fit -o sdss.index -N 880 -l 4 -u 5.6 -S ra -r 8 -j 1 -p 16 -R 8 -L 20 -E -I 9999 -M #(xyz,radec,inds,tag) = index_search_stars(index, -143, -2, 1, True) fn = sys.argv[1] index = index_load(fn, 0, None) #use_numpy = True use_numpy = False #(xyz,radec,inds,tag) = index_search_stars(index, -143, -2, 1, True) #(xyz,radec,inds,tag) = index_search_stars(index, -117, 0, 1, True, use_numpy) (xyz,radec,inds,tag) = index_search_stars(index, -117, 0, 0.1, True, use_numpy) if use_numpy: print 'Got xyz', xyz.shape print 'Got inds', inds.shape print inds print radec for k,v in tag.items(): print ' ', k, '=', v #print tag astrometry.net-0.67/util/index-mag-range.py000644 000765 000024 00000004345 12651445460 021066 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') from math import floor, ceil from matplotlib.ticker import FixedFormatter from astrometry.util.util import * import numpy as np import pylab as plt if __name__ == '__main__': #indexfn = '/Users/dstn/INDEXES/tycho-2/tycho-2811.index' #magname = 'MAG' # scp sesame3:/scratch/lustre/hsc/astrometry_net_data/sdss-dr8/index-110311000.fits /tmp #indexfn = '/tmp/index-110311000.fits' indexfn = '/tmp/index-110311003.fits' magname = 'r' index = index_load(indexfn, 0, None) print index print 'Index', indexfn, 'has', index_nstars(index), 'stars and', print index_nquads(index), 'quads' quads = index.quads print 'quads:', quads starkd = index.starkd; print 'star kdtree:', starkd tagalong = startree_get_tagalong(starkd) print 'tag-along:', tagalong mags = startree_get_data_column(starkd, magname, None, startree_N(starkd)) print 'mags:', mags[:10], '...' print 'mag range:', min(mags), max(mags) mn,mx = [],[] for i in range(index_nquads(index)): if i % 100000 == 0: print 'quad', i, 'of', index_nquads(index) stars = quadfile_get_stars(quads, i) #print 'stars', stars qmags = [mags[j] for j in stars] #print 'mags', qmags mn.append(min(qmags)) mx.append(max(qmags)) #if i == 1000000: # break mn = np.array(mn) mx = np.array(mx) H,xe,ye = np.histogram2d(mn, mx, bins=50) plt.clf() plt.imshow(np.log10(1+H.T), extent=[min(xe),max(xe),min(ye),max(ye)], origin='lower', interpolation='nearest') plt.xlabel('Min mag') plt.ylabel('Max mag') a = plt.axis() lo = int(floor(min(mn))) hi = int(ceil(max(mn))) for delta in range(5): plt.plot([lo, hi], [lo+delta, hi+delta], 'k-') plt.axis(a) plt.title('Range of mags in index %s' % index.indexname) mx = np.log10(1+H.max()) tens = np.arange(mx) plt.colorbar(ticks=tens, format=FixedFormatter(['%i'%10**i for i in tens])) plt.savefig('magrange.png') H,xe,ye = np.histogram2d(mn, mx-mn, bins=50) plt.clf() plt.imshow(np.log10(1+H.T), extent=[min(xe),max(xe),min(ye),max(ye)], origin='lower', interpolation='nearest') plt.xlabel('Min mag') plt.ylabel('Mag range') plt.savefig('magrange2.png') astrometry.net-0.67/util/index-stats.py000755 000765 000024 00000014230 12651445460 020363 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') from astrometry.util.index import * from astrometry.util.plotutils import * from astrometry.libkd.spherematch import match from astrometry.util.starutil_numpy import * from astrometry.util.fits import * from optparse import * from pylab import * from numpy import * import os if __name__ == '__main__': parser = OptionParser() parser.add_option('-p', '--prefix', dest='prefix', help='Prefix for output plot names') parser.add_option('-r', '--range', dest='range', type='float', help='Set search radius range (in arcsec) of stars-1 plot, default 15') parser.set_defaults(prefix='', range=15.) opt,args = parser.parse_args() if 'plots' in args: # DEBUG! cat = fits_table('cat2.fits') xyz = radectoxyz(cat.ra, cat.dec) R = 15. inds,dists = match(xyz, xyz, deg2rad(R/3600.)) notself = (inds[:,0] != inds[:,1]) clf() hist(rad2deg(dists[notself]) * 3600., 200) title('ImSim reference catalog') xlabel('Distance between pairs of sources (arcsec)') ylabel('Counts') xlim(0, R) savefig('cat-stars-1.png') cat = fits_table('stars3.fits') xyz = radectoxyz(cat.ra, cat.dec) R = 15. inds,dists = match(xyz, xyz, deg2rad(R/3600.)) notself = (inds[:,0] != inds[:,1]) clf() hist(rad2deg(dists[notself]) * 3600., 200) title('ImSim reference catalog -- stars only') xlabel('Distance between pairs of sources (arcsec)') ylabel('Counts') xlim(0, R) savefig('cat-stars-2.png') I1 = inds[notself,0] I2 = inds[notself,1] clf() RA = cat.ra + (cat.ra > 180)*-360 dra = RA[I1]-RA[I2] ddec = cat.dec[I1]-cat.dec[I2] #plot(dra, ddec, 'r.') (H,xe,ye) = histogram2d(dra, ddec, bins=(200,200)) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) xlabel('dRA (deg)') ylabel('dDec (deg)') axis('equal') savefig('cat-stars-4.png') cat = fits_table('gals2.fits') xyz = radectoxyz(cat.ra, cat.dec) R = 15. inds,dists = match(xyz, xyz, deg2rad(R/3600.)) notself = (inds[:,0] != inds[:,1]) clf() hist(rad2deg(dists[notself]) * 3600., 200) title('ImSim reference catalog -- galaxies only') xlabel('Distance between pairs of sources (arcsec)') ylabel('Counts') xlim(0, R) savefig('cat-stars-3.png') sys.exit(0) for indfn in args: print 'Reading index', indfn null = None I = index_load(indfn, 0, null) print 'Loaded.' NS = index_nstars(I) NQ = index_nquads(I) print 'Index has', NS, 'stars and', NQ, 'quads' DQ = index_get_quad_dim(I) print 'Index has "quads" with %i stars' % (DQ) DC = index_get_quad_dim(I) print 'Index has %i-dimensional codes' % (DC) iname = os.path.basename(I.indexname).replace('.fits', '') # stars print 'Getting stars...' stars = index_get_stars(I) print stars.shape ra,dec = xyztoradec(stars) ra += (ra > 180)*-360 # FIXME --! #ra *= cos(deg2rad(ra)) rng = [[-10,10],[-10,10]] clf() (H,xe,ye) = histogram2d(ra, dec, bins=(100,100), range=rng) H=H.T binarea = (xe[1]-xe[0])*(ye[1]-ye[0]) print 'Bin area:', binarea, 'deg^2' binarea *= 3600. print binarea, 'arcmin^2' imshow(H/binarea, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) colorbar() axis('equal') xlabel('RA (deg)') ylabel('Dec (deg)') title('Reference source density in %s' % iname) savefig(opt.prefix + 'stars-2.png') R = opt.range print 'Finding pairs within', R, 'arcsec' inds,dists = match(stars, stars, deg2rad(R/3600.)) print 'inds', inds.shape, 'dists', dists.shape notself = (inds[:,0] != inds[:,1]) clf() hist(rad2deg(dists[notself]) * 3600., 200) xlabel('Star pair distances (arcsec)') ylabel('Counts') xlim(0, R) savefig(opt.prefix + 'stars-1.png') # codes print 'Getting codes...' codes = index_get_codes(I) print 'shape', codes.shape # code slices cx = codes[:,0] cy = codes[:,1] dx = codes[:,2] dy = codes[:,3] clf() (H,xe,ye) = histogram2d(cx, cy, bins=(100,100)) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) axis('equal') xlabel('cx') ylabel('cy') savefig(opt.prefix + 'codes-1.png') clf() (H,xe,ye) = histogram2d(append(cx, dx), append(cy, dy), bins=(100,100)) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) axis('equal') xlabel('cx, dx') ylabel('cy, dy') savefig(opt.prefix + 'codes-2.png') clf() (H,xe,ye) = histogram2d(cx, dx, bins=(100,100)) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) axis('equal') xlabel('cx') ylabel('dx') savefig(opt.prefix + 'codes-3.png') clf() xx = append(cx, dx) yy = append(cy, dy) (H,xe,ye) = histogram2d(append(xx, 1.0-xx), append(yy, 1.0-yy), bins=(100,100)) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) axis('equal') xlabel('cx, dx') ylabel('cy, dy') title('duplicated for A-B swap') savefig(opt.prefix + 'codes-4.png') for pnum,arrs in [(5, [cx,cy,dx,dy]), (6, [append(cx, 1-cx), append(cy, 1-cy), append(dx, 1-dx), append(dy, 1-dy)])]: clf() anames = ['cx', 'cy', 'dx', 'dy'] sp = 0 for i,a1 in enumerate(arrs): for j,a2 in enumerate(arrs): sp += 1 if j > i: continue subplot(4,4, sp) if i == j: hist(a1, 100, range=[-0.3, 1.3]) else: (H,xe,ye) = histogram2d(a2, a1, bins=(100,100), range=[[-0.3,1.3],[-0.3,1.3]]) H=H.T imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower', cmap=antigray) axis([-0.3,1.3,-0.3,1.3]) axis('scaled') xticks([],[]) yticks([],[]) if i == 3: xlabel(anames[j]) if j == 0: ylabel(anames[i]) savefig(opt.prefix + 'codes-%i.png' % pnum) index_free(I) astrometry.net-0.67/util/index.c000644 000765 000024 00000034444 12651445460 017027 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "index.h" #include "log.h" #include "errors.h" #include "ioutils.h" #include "healpix.h" #include "tic.h" #include "anqfits.h" #include "qfits_rw.h" #include "starutil.h" anbool index_overlaps_scale_range(index_t* meta, double quadlo, double quadhi) { anbool rtn = !((quadlo > meta->index_scale_upper) || (quadhi < meta->index_scale_lower)); debug("index_overlaps_scale_range: index %s has quads [%g, %g] arcsec; image has quads [%g, %g] arcsec. In range? %s\n", meta->indexname, meta->index_scale_lower, meta->index_scale_upper, quadlo, quadhi, rtn ? "yes" : "no"); return rtn; } anbool index_is_within_range(index_t* meta, double ra, double dec, double radius_deg) { if (meta->healpix == -1) { // allsky; tautology return TRUE; } return (healpix_distance_to_radec(meta->healpix, meta->hpnside, ra, dec, NULL) <= radius_deg); } int index_get_quad_dim(const index_t* index) { return quadfile_dimquads(index->quads); } int index_get_code_dim(const index_t* index) { return dimquad2dimcode(index_get_quad_dim(index)); } int index_nquads(const index_t* index) { return quadfile_nquads(index->quads); } int index_nstars(const index_t* index) { return startree_N(index->starkd); } // Ugh! static void get_filenames(const char* indexname, char** quadfn, char** ckdtfn, char** skdtfn, anbool* singlefile) { char* basename; if (ends_with(indexname, ".quad.fits")) { basename = strdup(indexname); basename[strlen(indexname)-10] = '\0'; logverb("Index name \"%s\" ends with .quad.fits: using basename \"%s\"\n", indexname, basename); } else { char* fits; if (file_readable(indexname)) { // assume single-file index. if (ckdtfn) *ckdtfn = strdup(indexname); if (skdtfn) *skdtfn = strdup(indexname); if (quadfn) *quadfn = strdup(indexname); *singlefile = TRUE; logverb("Index name \"%s\" is readable; assuming singe file.\n", indexname); return; } asprintf_safe(&fits, "%s.fits", indexname); if (file_readable(fits)) { // assume single-file index. indexname = fits; if (ckdtfn) *ckdtfn = strdup(indexname); if (skdtfn) *skdtfn = strdup(indexname); if (quadfn) *quadfn = strdup(indexname); *singlefile = TRUE; logverb("Index name \"%s\" with .fits suffix, \"%s\", is readable; assuming singe file.\n", indexname, fits); free(fits); return; } free(fits); basename = strdup(indexname); logverb("Index name \"%s\": neither filename nor filename.fits exist, so using index name as base filename\n", basename); } if (ckdtfn) asprintf_safe(ckdtfn, "%s.ckdt.fits", basename); if (skdtfn) asprintf_safe(skdtfn, "%s.skdt.fits", basename); if (quadfn) asprintf_safe(quadfn, "%s.quad.fits", basename); *singlefile = FALSE; logverb("Index name \"%s\": looking for file \"%s\", \"%s\", \"%s\"\n", indexname, (ckdtfn ? *ckdtfn : "none"), (skdtfn ? *skdtfn : "none"), (quadfn ? *quadfn : "none")); free(basename); return; } char* index_get_quad_filename(const char* indexname) { char* quadfn; anbool singlefile; if (!index_is_file_index(indexname)) return NULL; get_filenames(indexname, &quadfn, NULL, NULL, &singlefile); return quadfn; } char* index_get_qidx_filename(const char* indexname) { char* quadfn; char* qidxfn = NULL; anbool singlefile; if (!index_is_file_index(indexname)) return NULL; get_filenames(indexname, &quadfn, NULL, NULL, &singlefile); if (singlefile) { if (ends_with(quadfn, ".fits")) { asprintf_safe(&qidxfn, "%.*s.qidx.fits", (int)(strlen(quadfn)-5), quadfn); } else { asprintf_safe(&qidxfn, "%s.qidx.fits", quadfn); } } else { if (ends_with(quadfn, ".quad.fits")) { asprintf_safe(&qidxfn, "%.*s.qidx.fits", (int)(strlen(quadfn)-10), quadfn); } else { asprintf_safe(&qidxfn, "%s.qidx.fits", quadfn); } } free(quadfn); return qidxfn; } anbool index_is_file_index(const char* filename) { char* ckdtfn, *skdtfn, *quadfn; anbool singlefile; //index_t meta; anbool rtn = TRUE; get_filenames(filename, &quadfn, &ckdtfn, &skdtfn, &singlefile); if (!file_readable(quadfn)) { ERROR("Index file %s is not readable.", quadfn); goto finish; } if (!singlefile) { if (!file_readable(ckdtfn)) { ERROR("Index file %s is not readable.", ckdtfn); goto finish; } if (!file_readable(skdtfn)) { ERROR("Index file %s is not readable.", skdtfn); goto finish; } } if (!(qfits_is_fits(quadfn) && (singlefile || (qfits_is_fits(ckdtfn) && qfits_is_fits(skdtfn))))) { if (singlefile) ERROR("Index file %s is not FITS.\n", quadfn); else ERROR("Index files %s , %s , and %s are not FITS.\n", quadfn, skdtfn, ckdtfn); rtn = FALSE; goto finish; } /* This is a bit expensive... if (index_get_meta(filename, &meta)) { if (singlefile) ERROR("File %s does not contain an index.\n", quadfn); else ERROR("Files %s , %s , and %s do not contain an index.\n", quadfn, skdtfn, ckdtfn); rtn = FALSE; } */ finish: free(ckdtfn); free(skdtfn); free(quadfn); return rtn; } int index_get_meta(const char* filename, index_t* meta) { index_t* ind = index_load(filename, INDEX_ONLY_LOAD_METADATA, meta); if (!ind) return -1; return 0; } int index_get_missing_cut_params(int indexid, int* hpnside, int* nsweep, double* dedup, int* margin, char** pband) { // The 200-series indices use cut 100 (usnob) // The 500-series indices use cut 100 (usnob) // The 600-series indices use cut 300 (2mass) // The 700-series indices use cut 400 (usnob) int i = -1; int ns, n, marg; double dd; char* band; if ((indexid >= 200 && indexid < 220) || (indexid >= 500 && indexid < 520)) { // Cut 100 params: int cut100hp[] = { 1760, 1245, 880, 622, 440, 312, 220, 156, 110, 78, 55, 39, 28, 20, 14, 10, 7, 5, 4, 3 }; int cut100n[] = { 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 }; double cut100dd[] = { 8, 8, 8, 8, 8, 9.6, 13.2, 18.0, 25.2, 36, 51, 72, 102, 144, 204, 288, 408, 600, 840, 1200 }; int cut100margin = 5; i = indexid % 100; ns = cut100hp[i]; n = cut100n[i]; dd = cut100dd[i]; marg = cut100margin; band = "R"; } else if (indexid >= 602 && indexid < 620) { // Cut 300 params: int cut300hp[] = { 0, 0, 880, 624, 440, 312, 220, 156, 110, 78, 56, 40, 28, 20, 14, 10, 8, 6, 4, 4 }; int cut300n = 10; double cut300dd = 8.0; //double cut300dd[] = { 8, 8, 8, 8, 8, 9.6, 13.2, 18.0, 25.2, 36, 51, 72, 102, 144, 204, 288, 408, 600, 840, 1200 }; int cut300margin = 10; i = indexid % 100; ns = cut300hp[i]; n = cut300n; dd = cut300dd; marg = cut300margin; band = "J"; } else if (indexid >= 700 && indexid < 720) { // Cut 400 params: // (cut 400 used cut 200 as input: it had dedup=8, and n=6,10,10,...) int cut400hp[] = { 1760, 1246, 880, 624, 440, 312, 220, 156, 110, 78, 55, 39, 28, 20, 14, 10, 7, 5, 4, 3 }; int cut400n[] = { 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }; double cut400dd = 8.0; //double cut400dd[] = { 8, 8, 8, 8, 8, 9.6, 13.2, 18.0, 25.2, 36, 51, 72, 102, 144, 204, 288, 408, 600, 840, 1200 }; int cut400margin = 10; i = indexid % 100; ns = cut400hp[i]; n = cut400n[i]; dd = cut400dd; marg = cut400margin; band = "R"; } else { return -1; } if (hpnside) *hpnside = ns; if (nsweep) *nsweep = n; if (dedup) *dedup = dd; if (margin) *margin = marg; if (pband) *pband = strdup(band); return 0; } static void get_cut_params(index_t* index) { index->index_jitter = startree_get_jitter(index->starkd); if (index->index_jitter == 0.0) index->index_jitter = DEFAULT_INDEX_JITTER; index->cutnside = startree_get_cut_nside(index->starkd); index->cutnsweep = startree_get_cut_nsweeps(index->starkd); index->cutdedup = startree_get_cut_dedup(index->starkd); index->cutband = strdup_safe(startree_get_cut_band(index->starkd)); index->cutmargin = startree_get_cut_margin(index->starkd); // HACK - fill in values that are missing in old index files. { int *nside = NULL, *nsweep = NULL, *margin = NULL; char** band = NULL; double* dedup = NULL; if (index->cutnside == -1) nside = &(index->cutnside); if (index->cutnsweep == 0) nsweep = &(index->cutnsweep); if (index->cutmargin == -1) margin = &(index->cutmargin); if (index->cutdedup == 0) dedup = &(index->cutdedup); if (!index->cutband) band = &(index->cutband); index_get_missing_cut_params(index->indexid, nside, nsweep, dedup, margin, band); } } static void set_meta(index_t* index) { index->index_scale_upper = quadfile_get_index_scale_upper_arcsec(index->quads); index->index_scale_lower = quadfile_get_index_scale_lower_arcsec(index->quads); index->indexid = index->quads->indexid; index->healpix = index->quads->healpix; index->hpnside = index->quads->hpnside; index->dimquads = index->quads->dimquads; index->nquads = index->quads->numquads; index->nstars = index->quads->numstars; // This must get called after meta.indexid is set: otherwise we won't be // able to fill in values that are missing in old index files. get_cut_params(index); // check for CIRCLE field in ckdt header... index->circle = qfits_header_getboolean(index->codekd->header, "CIRCLE", 0); // New indexes are cooked such that cx < dx for all codes, but not // all of the old ones are like this. index->cx_less_than_dx = qfits_header_getboolean(index->codekd->header, "CXDX", FALSE); index->meanx_less_than_half = qfits_header_getboolean(index->codekd->header, "CXDXLT1", FALSE); } int index_dimquads(index_t* indx) { return indx->dimquads; } index_t* index_build_from(codetree_t* codekd, quadfile_t* quads, startree_t* starkd) { index_t* index = calloc(1, sizeof(index_t)); index->codekd = codekd; index->quads = quads; index->starkd = starkd; set_meta(index); return index; } index_t* index_load(const char* indexname, int flags, index_t* dest) { index_t* allocd = NULL; anbool singlefile; if (flags & INDEX_ONLY_LOAD_METADATA) logverb("Loading metadata for %s...\n", indexname); if (!dest) allocd = dest = calloc(1, sizeof(index_t)); else memset(dest, 0, sizeof(index_t)); dest->indexname = strdup(indexname); get_filenames(indexname, &(dest->quadfn), &(dest->codefn), &(dest->starfn), &singlefile); if (singlefile) { dest->fits = anqfits_open(dest->quadfn); if (!dest->fits) { ERROR("Failed to open FITS file %s", dest->quadfn); goto bailout; } } if (index_reload(dest)) { goto bailout; } free(dest->indexname); dest->indexname = strdup(quadfile_get_filename(dest->quads)); set_meta(dest); logverb("Index scale: [%g, %g] arcmin, [%g, %g] arcsec\n", dest->index_scale_lower / 60.0, dest->index_scale_upper / 60.0, dest->index_scale_lower, dest->index_scale_upper); logverb("Index has %i quads and %i stars\n", dest->nquads, dest->nstars); if (!dest->circle) { ERROR("Code kdtree does not contain the CIRCLE header."); goto bailout; } if (flags & INDEX_ONLY_LOAD_METADATA) { index_unload(dest); // If we're using anqfits_t (dest->fits), keep that open for // fast reopening. anqfits_t doesn't keep a FILE* or anything // open, so that's fine. } return dest; bailout: index_close(dest); free(allocd); return NULL; } int index_reload(index_t* index) { // Read .skdt file... if (!index->starkd) { if (index->fits) index->starkd = startree_open_fits(index->fits); else { logverb("Reading star KD tree from %s...\n", index->starfn); index->starkd = startree_open(index->starfn); } if (!index->starkd) { ERROR("Failed to read star kdtree from file %s", index->starfn); goto bailout; } } // Read .quad file... if (!index->quads) { if (index->fits) index->quads = quadfile_open_fits(index->fits); else { logverb("Reading quads file %s...\n", index->quadfn); index->quads = quadfile_open(index->quadfn); } if (!index->quads) { ERROR("Failed to read quads from %s", index->quadfn); goto bailout; } } // Read .ckdt file... if (!index->codekd) { if (index->fits) index->codekd = codetree_open_fits(index->fits); else { logverb("Reading code KD tree from %s...\n", index->codefn); index->codekd = codetree_open(index->codefn); if (!index->codekd) { ERROR("Failed to read code kdtree from file %s", index->codefn); goto bailout; } } } return 0; bailout: return -1; } void index_unload(index_t* index) { if (index->starkd) { startree_close(index->starkd); index->starkd = NULL; } if (index->codekd) { codetree_close(index->codekd); index->codekd = NULL; } if (index->quads) { quadfile_close(index->quads); index->quads = NULL; } } int index_close_fds(index_t* ind) { kdtree_fits_t* io; if (ind->quads->fb->fid) { if (fclose(ind->quads->fb->fid)) { SYSERROR("Failed to fclose() an astrometry_net_data quadfile"); return -1; } ind->quads->fb->fid = NULL; } io = ind->codekd->tree->io; if (io->fid) { if (fclose(io->fid)) { SYSERROR("Failed to fclose() an astrometry_net_data code kdtree"); return -1; } io->fid = NULL; } io = (kdtree_fits_t*)ind->starkd->tree->io; if (io->fid) { if (fclose(io->fid)) { SYSERROR("Failed to fclose() an astrometry_net_data star kdtree"); return -1; } io->fid = NULL; } return 0; } void index_close(index_t* index) { if (!index) return; free(index->indexname); free(index->quadfn); free(index->codefn); free(index->starfn); free(index->cutband); index->indexname = index->quadfn = index->codefn = index->starfn = NULL; index_unload(index); if (index->fits) anqfits_close(index->fits); index->fits = NULL; } void index_free(index_t* index) { index_close(index); free(index); } astrometry.net-0.67/util/index.py000644 000765 000024 00000002633 12651445460 017230 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from index_c import * from _index_util import * def index_get_codes(I): addr = codekd_addr(I) return codekd_get_codes_numpy(addr) def index_get_stars(I): addr = starkd_addr(I) return starkd_get_stars_numpy(addr) # RA, Dec, radius in deg. # Returns (xyz, radec, inds[, tagalong]) # "tagalong", if requested, is a dict of column name -> numpy array. def index_search_stars(I, ra, dec, radius, tagalong=False, numpy=True): addr = starkd_addr(I) if numpy: return starkd_search_stars_numpy(addr, ra, dec, radius, tagalong) else: return starkd_search_stars(addr, ra, dec, radius, tagalong) # Returns a list of (name, fits_type, array_size) def index_get_tagalong_columns(index): skdt = index.starkd N = startree_get_tagalong_N_columns(skdt) cols = [] for i in range(N): col = startree_get_tagalong_column_name(skdt, i) print 'column:', col ft = startree_get_tagalong_column_fits_type(skdt, i) print 'fits type', ft arr = startree_get_tagalong_column_array_size(skdt, i) print 'array size', arr cols.append((col, ft, arr)) return cols #def index_get_tagalong(index, inds): # #skdt = index.starkd # #addr = starkd_addr(I) # #tagalong = {} # #for (col,ft,arr) in index_get_tagalong_columns(index): # # startree_get_ # #return tagalong # return starkd_get_tagalong_python(starkd_addr(index), inds) astrometry.net-0.67/util/index_pyutils.c000644 000765 000024 00000026131 12651445460 020612 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "Python.h" // numpy - this should be in site-packages/numpy/core/include #include "arrayobject.h" #include "starkd.h" #include "codekd.h" #include "starutil.h" #include "qidxfile.h" #include "quadfile.h" static PyObject* quadfile_get_stars_for_quads(PyObject* self, PyObject* args) { PyArrayObject* pyquads; PyArrayObject* pystars; int N, DQ; quadfile* qf; npy_intp dims[2]; int i; if (!PyArg_ParseTuple(args, "lO!", &qf, &PyArray_Type, &pyquads)) { PyErr_SetString(PyExc_ValueError, "need: quadfile and quads (numpy array)"); return NULL; } N = PyArray_DIM(pyquads, 0); dims[0] = N; DQ = quadfile_dimquads(qf); dims[1] = DQ; pystars = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_UINT); //printf("N %i, DQ %i\n", N, DQ); for (i=0; i 1) pyval = array_to_pylist2(vdata, N, arr, pyvalfunc); else pyval = array_to_pylist(vdata, N, pyvalfunc); if (PyDict_SetItemString(pydict, name, pyval)) { PyErr_Format(PyExc_ValueError, "fail to set tag-along column value, for \"%s\"", name); return NULL; } } return Py_BuildValue("(OOOO)", pyxyz, pyradec, pyinds, pydict); } // starkd_search_stars_numpy(addr, ra, dec, radius, tagalong) static PyObject* starkd_search_stars_numpy(PyObject* self, PyObject* args) { startree_t* s; double ra, dec, radius; int N; PyArrayObject* pyxyz; PyArrayObject* pyradec; PyArrayObject* pyinds; npy_intp dims[2]; double* xyzres; double* radecres; int* inds; unsigned char tag; int i, C; PyObject* pydict; if (!PyArg_ParseTuple(args, "ldddb", &s, &ra, &dec, &radius, &tag)) { PyErr_SetString(PyExc_ValueError, "need four args: starkd, ra, dec, radius"); return NULL; } startree_search_for_radec(s, ra, dec, radius, &xyzres, &radecres, &inds, &N); dims[0] = N; dims[1] = 3; pyxyz = (PyArrayObject*)PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE, xyzres); dims[0] = N; dims[1] = 2; pyradec = (PyArrayObject*)PyArray_SimpleNewFromData(2, dims, PyArray_DOUBLE, radecres); dims[0] = N; dims[1] = 1; pyinds = (PyArrayObject*)PyArray_SimpleNewFromData(1, dims, PyArray_INT, inds); if (!tag) return Py_BuildValue("(OOO)", pyxyz, pyradec, pyinds); if (!startree_has_tagalong(s) || N == 0) { return Py_BuildValue("(OOOO)", pyxyz, pyradec, pyinds, PyDict_New()); } C = startree_get_tagalong_N_columns(s); pydict = PyDict_New(); for (i=0; i 1) nd = 2; else nd = 1; pyval = PyArray_SimpleNewFromData(nd, dims, pytype, vdata); if (PyDict_SetItemString(pydict, name, pyval)) { PyErr_Format(PyExc_ValueError, "fail to set tag-along column value, for \"%s\"", name); return NULL; } } return Py_BuildValue("(OOOO)", pyxyz, pyradec, pyinds, pydict); } static PyObject* codekd_get_codes_numpy(PyObject* self, PyObject* args) { int N, D; int i; PyArrayObject* A; codetree* t; npy_intp dims[2]; if (!PyArg_ParseTuple(args, "l", &t)) { PyErr_SetString(PyExc_ValueError, "need one arg: codetree pointer (int)"); return NULL; } N = codetree_N(t); D = codetree_D(t); dims[0] = N; dims[1] = D; A = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_DOUBLE); for (i=0; i #include "intmap.h" #define IMGLUE2(n,f) n ## _ ## f #define IMGLUE(n,f) IMGLUE2(n,f) #define key_t int #define nl il #define KL(x) IMGLUE(nl, x) intmap_t* intmap_new(int datasize, int subblocksize, int blocksize, int Ndense) { intmap_t* im = calloc(1, sizeof(intmap_t)); if (!blocksize) blocksize = 4096; im->blocksize = subblocksize; im->datasize = datasize; if (Ndense) { im->ND = Ndense; im->dense = calloc(im->ND, sizeof(bl*)); } else { im->keys = KL(new)(blocksize); im->lists = pl_new(blocksize); } return im; } void intmap_free(intmap_t* im) { int i; if (im->lists) { for (i=0; ilists); i++) { bl* lst = pl_get(im->lists, i); bl_free(lst); } pl_free(im->lists); } if (im->dense) { for (i=0; iND; i++) { bl* lst = im->dense[i]; if (!lst) continue; bl_free(lst); } free(im->dense); } if (im->keys) KL(free)(im->keys); free(im); } bl* intmap_find(intmap_t* im, key_t key, anbool create) { key_t ind; assert(key >= 0); assert(im); if (!im->dense) { assert(im->keys); assert(im->lists); ind = KL(sorted_index_of)(im->keys, key); if (ind == -1) { bl* lst; if (!create) return NULL; lst = bl_new(im->blocksize, im->datasize); ind = KL(insert_unique_ascending)(im->keys, key); pl_insert(im->lists, ind, lst); return lst; } return pl_get(im->lists, ind); } else { bl* lst; assert(key < im->ND); assert(im->dense); lst = im->dense[key]; if (lst) return lst; if (!create) return lst; lst = im->dense[key] = bl_new(im->blocksize, im->datasize); return lst; } } void intmap_append(intmap_t* it, int key, void* pval) { bl* lst = intmap_find(it, key, TRUE); bl_append(lst, pval); } anbool intmap_get_entry(intmap_t* im, int index, key_t* p_key, bl** p_list) { assert(im); assert(index >= 0); if (im->dense) { if (index >= im->ND) return FALSE; if (p_key) *p_key = index; if (p_list) *p_list = im->dense[index]; return TRUE; } assert(im->keys); assert(im->lists); if (index >= KL(size)(im->keys)) return FALSE; if (p_key) *p_key = KL(get)(im->keys, index); if (p_list) *p_list = pl_get(im->lists, index); return TRUE; } #undef IMGLUE2 #undef IMGLUE #undef key #undef nl #undef KL astrometry.net-0.67/util/ioutils.c000644 000765 000024 00000072050 12651445460 017403 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "os-features.h" #include "ioutils.h" //#include "os-features.h" #include "errors.h" #include "log.h" uint32_t ENDIAN_DETECTOR = 0x01020304; int copy_file(const char* infn, const char* outfn) { FILE* fin = fopen(infn, "rb"); FILE* fout = fopen(outfn, "wb"); struct stat st; off_t len; if (!fin) { SYSERROR("Failed to open xyls file \"%s\" for copying", infn); return -1; } if (stat(infn, &st)) { SYSERROR("Failed to stat file \"%s\"", infn); return -1; } len = st.st_size; if (!fout) { SYSERROR("Failed to open output xyls file \"%s\" for copying", outfn); return -1; } if (pipe_file_offset(fin, 0, len, fout)) { ERROR("Failed to copy xyls file \"%s\" to \"%s\"", infn, outfn); return -1; } if (fclose(fin)) { SYSERROR("Failed to close input file \"%s\"", infn); return -1; } if (fclose(fout)) { SYSERROR("Failed to close output file \"%s\"", outfn); return -1; } return 0; } sl* split_long_string(const char* str, int firstlinew, int linew, sl* lst) { const char* s; char* added; int lw = firstlinew; if (!lst) lst = sl_new(16); assert(linew > 1); assert(str); s = str; while (1) { int brk = -1; int i, N; N = strlen(s); if (!N) break; if (N <= lw) { sl_append(lst, s); break; } // scan for last space (' ') before "lw". for (i=0; i= 1 && s[brk-1] == ' ') brk--; added = sl_appendf(lst, "%.*s", brk, s); s += strlen(added); // trim spaces. while (s && s[0]==' ') s++; } lw = linew; } return lst; } int split_string_once(const char* str, const char* splitstr, char** first, char** second) { char* start = strstr(str, splitstr); int n; if (!start) { if (first) *first = NULL; if (second) *second = NULL; return 0; } if (first) { n = start - str; *first = malloc(1 + n); memcpy(*first, str, n); (*first)[n] = '\0'; } if (second) { char* sec = start + strlen(splitstr); n = strlen(sec); *second = malloc(1 + n); memcpy(*second, sec, n); (*second)[n] = '\0'; } return 1; } int write_file(const char* fn, const char* data, int len) { FILE* fid = fopen(fn, "wb"); if (!fid) { SYSERROR("Failed to open file \"%s\"", fn); return -1; } if (fwrite(data, 1, len, fid) != len) { SYSERROR("Failed to write %i bytes to file \"%s\"", len, fn); return -1; } if (fclose(fid)) { SYSERROR("Failed to close file \"%s\"", fn); return -1; } return 0; } int pad_fid(FILE* fid, size_t len, char pad) { off_t offset; size_t npad; size_t i; char buf[1024]; offset = ftello(fid); if (len <= offset) return 0; npad = len - offset; // pad in blocks. memset(buf, pad, sizeof(buf)); for (i=0; i length) { n = length - i; } if (fread(buf, 1, n, fin) != n) { SYSERROR("Failed to read %i bytes", n); return -1; } if (fwrite(buf, 1, n, fout) != n) { SYSERROR("Failed to write %i bytes", n); return -1; } } return 0; } void asprintf_safe(char** strp, const char* format, ...) { va_list lst; int rtn; va_start(lst, format); rtn = vasprintf(strp, format, lst); if (rtn == -1) { fprintf(stderr, "Error, vasprintf() failed: %s\n", strerror(errno)); fprintf(stderr, " (format: \"%s\")\n", format); assert(0); *strp = NULL; } va_end(lst); } sl* dir_get_contents(const char* path, sl* list, anbool filesonly, anbool recurse) { DIR* dir = opendir(path); if (!dir) { fprintf(stderr, "Failed to open directory \"%s\": %s\n", path, strerror(errno)); return NULL; } if (!list) list = sl_new(256); while (1) { struct dirent* de; struct stat st; char* name; char* fullpath; anbool freeit = FALSE; errno = 0; de = readdir(dir); if (!de) { if (errno) fprintf(stderr, "Failed to read entry from directory \"%s\": %s\n", path, strerror(errno)); break; } name = de->d_name; if (!strcmp(name, ".") || !strcmp(name, "..")) continue; asprintf_safe(&fullpath, "%s/%s", path, name); if (stat(fullpath, &st)) { fprintf(stderr, "Failed to stat file %s: %s\n", fullpath, strerror(errno)); // this can happen when files are deleted, eg continue; //closedir(dir); //sl_free2(list); //return NULL; } if (filesonly) { if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) sl_append_nocopy(list, fullpath); else freeit = TRUE; } else { sl_append_nocopy(list, fullpath); } if (recurse && S_ISDIR(st.st_mode)) { dir_get_contents(path, list, filesonly, recurse); } if (freeit) free(fullpath); } closedir(dir); return list; } static int readfd(int fd, char* buf, int NB, char** pcursor, sl* lines, anbool* pdone) { int nr; int i, nleft; char* cursor = *pcursor; nr = read(fd, cursor, buf + NB - cursor); //printf("nr = %i\n", nr); if (nr == -1) { SYSERROR("Failed to read output fd"); return -1; } if (nr == 0) { if (cursor != buf) { //printf("flushing the last line\n"); sl_appendf(lines, "%.*s", (int)(cursor - buf), buf); } *pdone = TRUE; return 0; } // join the newly-read bytes with the carried-over ones. nleft = nr + (cursor - buf); cursor = buf; //printf("nleft = %i\n", nleft); for (i=0; i len2) return 0; if (strncmp(str + len2 - len, suffix, len)) return 0; return 1; } char* strdup_safe(const char* str) { char* rtn; if (!str) return NULL; rtn = strdup(str); if (!rtn) { fprintf(stderr, "Failed to strdup: %s\n", strerror(errno)); assert(0); } return rtn; } static int oldsigbus_valid = 0; static struct sigaction oldsigbus; static void sigbus_handler(int sig) { fprintf(stderr, "\n\n" "SIGBUS (Bus error) signal received.\n" "One reason this can happen is that an I/O error is encountered\n" "on a file that we are reading with \"mmap\".\n\n" "Bailing out now.\n\n"); fflush(stderr); exit(-1); } void add_sigbus_mmap_warning() { struct sigaction sigbus; memset(&sigbus, 0, sizeof(struct sigaction)); sigbus.sa_handler = sigbus_handler; if (sigaction(SIGBUS, &sigbus, &oldsigbus)) { fprintf(stderr, "Failed to change SIGBUS handler: %s\n", strerror(errno)); return; } oldsigbus_valid = 1; } void reset_sigbus_mmap_warning() { if (oldsigbus_valid) { if (sigaction(SIGBUS, &oldsigbus, NULL)) { fprintf(stderr, "Failed to restore SIGBUS handler: %s\n", strerror(errno)); return; } } } int is_word(const char* cmdline, const char* keyword, char** cptr) { int len = strlen(keyword); if (strncmp(cmdline, keyword, len)) return 0; *cptr = (char*)(cmdline + len); return 1; } void read_complain(FILE* fin, const char* attempted) { if (feof(fin)) { SYSERROR("Couldn't read %s: end-of-file", attempted); } else if (ferror(fin)) { SYSERROR("Couldn't read %s", attempted); } else { SYSERROR("Couldn't read %s", attempted); } } int read_u8(FILE* fin, unsigned char* val) { if (fread(val, 1, 1, fin) == 1) { return 0; } else { read_complain(fin, "u8"); return 1; } } int read_u16(FILE* fin, unsigned int* val) { uint16_t v; if (fread(&v, 2, 1, fin) == 1) { *val = v; return 0; } else { read_complain(fin, "u8"); return 1; } } int read_u32_portable(FILE* fin, unsigned int* val) { uint32_t u; if (fread(&u, 4, 1, fin) == 1) { *val = ntohl(u); return 0; } else { read_complain(fin, "u32"); return 1; } } int read_double(FILE* fin, double* val) { if (fread(val, sizeof(double), 1, fin) == 1) { return 0; } else { read_complain(fin, "double"); return 1; } } int read_u32(FILE* fin, unsigned int* val) { uint32_t u; if (fread(&u, 4, 1, fin) == 1) { *val = (unsigned int)u; return 0; } else { read_complain(fin, "u32 native"); return 1; } } int read_u32s_portable(FILE* fin, unsigned int* val, int n) { int i; uint32_t* u = malloc(sizeof(uint32_t) * n); if (!u) { fprintf(stderr, "Couldn't real uint32s: couldn't allocate temp array.\n"); return 1; } if (fread(u, sizeof(uint32_t), n, fin) == n) { for (i=0; iblocksize = Nbuffer; br->elementsize = elementsize; br->ntotal = Ntotal; br->refill_buffer = refill_buffer; br->userdata = userdata; return br; } void* buffered_read(bread_t* br) { void* rtn; if (!br->buffer) { br->buffer = malloc(br->blocksize * br->elementsize); br->nbuff = br->off = br->buffind = 0; } if (br->buffind == br->nbuff) { // read a new block! int n = br->blocksize; // the new block to read starts after the current block... br->off += br->nbuff; if (n + br->off > br->ntotal) n = br->ntotal - br->off; if (!n) return NULL; memset(br->buffer, 0, br->blocksize * br->elementsize); if (br->refill_buffer(br->userdata, br->buffer, br->off, n)) { fprintf(stderr, "buffered_read: Error filling buffer.\n"); return NULL; } br->nbuff = n; br->buffind = 0; } rtn = (char*)br->buffer + (br->buffind * br->elementsize); br->buffind++; return rtn; } void buffered_read_resize(bread_t* br, int newsize) { br->blocksize = newsize; if (br->buffer) br->buffer = realloc(br->buffer, br->blocksize * br->elementsize); } void buffered_read_reset(bread_t* br) { br->nbuff = br->off = br->buffind = 0; } void buffered_read_pushback(bread_t* br) { if (!br->buffind) { fprintf(stderr, "buffered_read_pushback: Can't push back any further!\n"); return; } br->buffind--; } void buffered_read_free(bread_t* br) { free(br->buffer); } astrometry.net-0.67/util/jpl.c000644 000765 000024 00000001362 12651445460 016476 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "bl.h" struct orbital_elements { double a, e, I, Omega, pomega, M; double mjd; }; typedef struct orbital_elements orbital_elements_t; bl* jpl_parse_orbital_elements(const char* str, bl* lst) { double jd; double a, e, I, Omega, pomega, M; double QR, Tp, N, TA, AD, PR; char adstr[5]; char datestr[12]; char timestr[14]; char tzstr[5]; sscanf(s, "%lf = %4s %11s %13s %4s EC= %lf QR= %lf IN=%lf" " OM= %lf W = %lf Tp= %lf N = %lf MA= %lf TA= %lf" " A = %lf AD= %lf PR= %lf", &jd, adstr, datestr, timestr, tzstr, &e, &QR, &I, &Omega, &pomega, &Tp, &N, &M, &TA, &a, &AD, &PR); } astrometry.net-0.67/util/jpl.h000644 000765 000024 00000000633 12651445460 016503 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef JPL_H #define JPL_H #include "astrometry/bl.h" struct orbital_elements { double a; double e; double I; double Omega; double pomega; double M; double mjd; }; typedef struct orbital_elements orbital_elements_t; bl* jpl_parse_orbital_elements(const char* str, bl* lst); #endif astrometry.net-0.67/util/jpl.py000644 000765 000024 00000007052 12651445460 016706 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import re import datetime from astrometry.util.starutil_numpy import * import numpy as np ## FIXME -- requires at least one digit before the decimal place. floatre = r'[+-]?[\d]+(.[\d]*)?([eE][+-]?[\d]*)?' def floatvar(x): return '(?P<%s>%s)' % (x, floatre) # For parsing orbital elements type output. elemrexstr = (r'^' + floatvar('jd') + '.*' + ' EC= ' + floatvar('e') + '.*' + ' IN= ' + floatvar('i') + '.*' + ' OM= ' + floatvar('Omega') + ' W = ' + floatvar('pomega') + '.*' + 'MA= ' + floatvar('M') + '.*' + 'A = ' + floatvar('a') ) elemrex = re.compile(elemrexstr, re.MULTILINE | re.DOTALL) # For finding "System GM" -- only in orbital elements type sysgmrexstr = '^System GM *: ' + floatvar('gm') + r' '#AU\^3/d\^2$' sysgmrex = re.compile(sysgmrexstr) # For parsing X,V type output xvrexstr = ('^' + floatvar('jd') + r' = (?PA\.D\. .*?)' + r'^\s+' + floatvar('x0') + ' +' + floatvar('x1') + ' +' + floatvar('x2') + '.*?' + r'^\s+' + floatvar('v0') + ' +' + floatvar('v1') + ' +' + floatvar('v2') ) xvrex = re.compile(xvrexstr, re.MULTILINE | re.DOTALL) # For parsing "observer" type output (RA,Dec) # With QUANTITIES=1; angle format=DEG radecrexstr = ( '^ ' + '(?P[\d]{4}-[\w]{3}-[\d]{2} [\d]{2}:[\d]{2}) .*?' + floatvar('ra') + ' *?' + floatvar('dec')) radecrex = re.compile(radecrexstr, re.MULTILINE | re.DOTALL) ''' For output like: #Date UT R.A. (J2000) Decl. Delta r El. Ph. m1 Sky Motion # h m s "/min P.A. # geocentric 2007 04 01 000000 23.1983 -02.463 2.953 2.070 22.9 10.8 17.1 1.45 057.9 ''' #radecrexstr2 = ( # '^' + '(?P[\d]{4} [\d]{2} [\d]{2} [\d]{2}:[\d]{2}) .*?' # + floatvar('ra') + ' *?' + floatvar('dec')) #radecrex = re.compile(radecrexstr, re.MULTILINE | re.DOTALL) # Returns a list of lists of elements, plus a list of the JDs. # ([jd1, jd2, ...], [ [a1, e1, i1, Omega1, pomega1, M1, GM1], ... ]) # Where i, Omega, pomega, M are in radians def parse_orbital_elements(s, needSystemGM=True): if needSystemGM: m = sysgmrex.search(s) if not m: print 'Did not find "System GM" entry' return None gm = float(m.group('gm')) else: gm = 1. allE = [] alljd = [] for m in elemrex.finditer(s): d = m.groupdict() E = [np.deg2rad(x) if rad else x for (x,rad) in zip([float(d[x]) for x in ['a', 'e', 'i', 'Omega', 'pomega','M' ]], [False, False, True, True, True, True])] E.append(gm) allE.append(E) alljd.append(float(d['jd'])) return alljd,allE # Returns (x, v, jd), each as numpy arrays. # x in AU # v in AU/day def parse_phase_space(s): all_x = [] all_v = [] all_jd = [] for m in xvrex.finditer(s): d = m.groupdict() x = np.array([float(d[k]) for k in ['x0','x1','x2']]) v = np.array([float(d[k]) for k in ['v0','v1','v2']]) all_x.append(x) all_v.append(v) all_jd.append(float(d['jd'])) return (np.array(all_x), np.array(all_v), np.array(all_jd)) # Returns (ra,dec,jd), each as numpy arrays. # RA,Dec in J2000 deg def parse_radec(s): all_ra = [] all_dec = [] all_jd = [] for m in radecrex.finditer(s): d = m.groupdict() all_ra.append(float(d['ra'])) all_dec.append(float(d['dec'])) t = datetime.datetime.strptime(d['datetime'], '%Y-%b-%d %H:%M') # 2000-Jan-01 12:00 all_jd.append(datetojd(t)) return (np.array(all_ra), np.array(all_dec), np.array(all_jd)) astrometry.net-0.67/util/lanczos.i000644 000765 000024 00000017076 12651445460 017401 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ static int LANCZOS_INTERP_FUNC(PyObject* np_ixi, PyObject* np_iyi, PyObject* np_dx, PyObject* np_dy, PyObject* loutputs, PyObject* linputs) { npy_intp W,H, N; npy_intp Nimages; npy_intp i, j; PyArray_Descr* dtype = PyArray_DescrFromType(NPY_FLOAT); PyArray_Descr* itype = PyArray_DescrFromType(NPY_INT32); int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; int reqout = req | NPY_WRITEABLE | NPY_UPDATEIFCOPY; const int32_t *ixi, *iyi; const float *dx, *dy; /* dx,dy are in [-0.5, 0.5]. Lanczos-3 kernel is zero outside [-3,3]. We build a look-up table where [0] is L(-3.5). And organized so that: lut[0] = L(-3.5) lut[1] = L(-2.5) lut[2] = L(-1.5) lut[3] = L(-0.5) lut[4] = L( 0.5) lut[5] = L( 1.5) lut[6] = L( 2.5) lut[7] is empty for padding actually, = sum(lut[0:7]) lut[8] = L(-3.499) lut[9] = L(-2.499) lut[10] = L(-1.499) ... ... lut[8184] = L(-2.501) lut[8185] = L(-1.501) lut[8186] = L(-0.501) ... This is annoying because [-3.5,3] and [3,3.5] are zero so we have to sum 7 elements rather than 6. But the alternatives seem worse. */ //static const int L = 5; // Nlutunit is number of bins per unit x //static const int Nlutunit = 1024; static const int Nlutunit = 2048; static const double lut0 = -(L + 0.5); //-5.5; //-(L+0.5); static const int Nunits = 2*(L+1); //12; //2*(L+1); //static const int Nlut = Nunits * Nlutunit; //static float lut[24576]; //static float lut[Nunits*Nlutunit]; // HACK -- 2048 here == Nlutunit... some versions of gcc don't believe Nunits*Nlutunit is constant static float lut[2*(L+1)*2048]; static int initialized = 0; if (!initialized) { // this table has the elements you need to use together // stored together: L(x[0]), L(x[0]+1), L(x[0]+2), ...; // L(x[1]), L(x[1]+1), L(x[2]+2), ... for (i=0; i= L) { f = 0.0; } else if (x == 0) { f = 1.0; } else { f = L * sin(M_PI * x) * sin(M_PI / L * x) / (M_PI * M_PI * x * x); } lut[i * Nunits + j] = f; acc += f; } lut[i*Nunits + Nunits-1] = acc; //printf("acc: %f\n", acc); } /* for (i=0; i= (W-L) || iy < L || iy >= (H-L)) { iy -= L; // Lanczos kernel in y direction for (v=0; v<2*L+1; v++, iy++, ly++) { float accx = 0; int clipiy = MAX(0, MIN((int)(H-1), iy)); int ix = *ixi - L; const float* lx = lut + tx0; const float* inpix = inimg + clipiy * W; // Lanczos kernel in x direction for (u=0; u<2*L+1; u++, ix++, lx++) { int clipix = MAX(0, MIN((int)(W-1), ix)); accx += (*lx) * (inpix[clipix]); } acc += (*ly) * accx; } } else { iy -= L; // Lanczos kernel in y direction for (v=0; v<2*L+1; v++, iy++, ly++) { float accx = 0; int ix = *ixi - L; const float* lx = lut + tx0; const float* inpix = inimg + iy * W + ix; // Lanczos kernel in x direction for (u=0; u<2*L+1; u++, lx++, inpix++) { accx += (*lx) * (*inpix); } acc += (*ly) * accx; } } nacc = lut[tx0 + Nunits-1] * lut[ty0 + Nunits-1]; *outimg = acc / nacc; } Py_DECREF(np_inimg); Py_DECREF(np_outimg); } Py_DECREF(dtype); Py_DECREF(np_ixi); Py_DECREF(np_iyi); Py_DECREF(np_dx); Py_DECREF(np_dy); return 0; } astrometry.net-0.67/util/log.c000644 000765 000024 00000006502 12651445460 016473 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "log.h" #include "an-thread.h" #include "tic.h" static int g_thread_specific = 0; static log_t g_logger; void log_set_thread_specific() { g_thread_specific = 1; } static void* logts_init_key(void* user) { log_t* l = malloc(sizeof(log_t)); if (user) memcpy(l, user, sizeof(log_t)); return l; } #define TSNAME logts #include "thread-specific.inc" static log_t* get_logger() { if (g_thread_specific) return logts_get_key(&g_logger); return &g_logger; } void log_init_structure(log_t* logger, enum log_level level) { logger->level = level; logger->f = stdout; logger->timestamp = FALSE; logger->t0 = timenow(); logger->logfunc = NULL; logger->baton = NULL; } void log_init(enum log_level level) { log_init_structure(get_logger(), level); } void log_set_level(enum log_level level) { get_logger()->level = level; } void log_set_timestamp(anbool b) { get_logger()->timestamp = b; } void log_to(FILE* fid) { get_logger()->f = fid; } void log_to_fd(int fd) { // MEMLEAK FILE* fid = fdopen(fd, "a"); log_to(fid); } void log_use_function(logfunc_t func, void* baton) { log_t* l = get_logger(); l->logfunc = func; l->baton = baton; } log_t* log_create(enum log_level level) { log_t* logger = calloc(1, sizeof(log_t)); return logger; } void log_free(log_t* log) { assert(log); free(log); } AN_THREAD_DECLARE_STATIC_MUTEX(loglock); static void loglvl(const log_t* logger, enum log_level level, const char* file, int line, const char* func, const char* format, va_list va) { if (level > logger->level) return; AN_THREAD_LOCK(loglock); if (logger->f) { if (logger->timestamp) fprintf(logger->f, "[%6i: %.3f] ", (int)getpid(), timenow() - logger->t0); //fprintf(logger->f, "%s:%i ", file, line); vfprintf(logger->f, format, va); fflush(logger->f); } if (logger->logfunc) { logger->logfunc(logger->baton, level, file, line, func, format, va); } AN_THREAD_UNLOCK(loglock); } void log_loglevel(enum log_level level, const char* file, int line, const char* func, const char* format, ...) { va_list va; va_start(va, format); loglvl(get_logger(), level, file, line, func, format, va); va_end(va); } int log_get_level() { return get_logger()->level; } FILE* log_get_fid() { return get_logger()->f; } #define LOGGER_TEMPLATE(name, level) \ void \ name##_(const log_t* logger, const char* file, int line, const char* func, const char* format, ...) { \ va_list va; \ va_start(va, format); \ loglvl(logger, level, file, line, func, format, va); \ va_end(va); \ } \ void \ name(const char* file, int line, const char* func, const char* format, ...) { \ va_list va; \ va_start(va, format); \ loglvl(get_logger(), level, file, line, func, format, va); \ va_end(va); \ } \ LOGGER_TEMPLATE(log_logerr, LOG_ERROR); LOGGER_TEMPLATE(log_logmsg, LOG_MSG); LOGGER_TEMPLATE(log_logverb, LOG_VERB); LOGGER_TEMPLATE(log_logdebug,LOG_ALL); astrometry.net-0.67/util/make-tests.sh000755 000765 000024 00000002220 12651445460 020153 0ustar00dstnstaff000000 000000 #! /bin/sh # Auto generate single AllTests file for CuTest. # Searches through all *.c files in the current directory. # Prints to stdout. # Author: Asim Jalis # Date: 01/08/2003 if test $# -eq 0 ; then FILES=*.c ; else FILES=$* ; fi echo ' /* This is auto-generated code. Edit at your own peril. */ #include #include #include #include "cutest.h" ' cat $FILES | grep '^void test_' | sed -e 's/(.*$//' \ -e 's/$/(CuTest*);/' \ -e 's/^/extern /' echo \ ' void RunAllTests(void) { CuString *output = CuStringNew(); CuSuite* suite = CuSuiteNew(); ' cat $FILES | grep '^void test_' | sed -e 's/^void //' \ -e 's/(.*$//' \ -e 's/^/ SUITE_ADD_TEST(suite, /' \ -e 's/$/);/' echo \ ' CuSuiteRun(suite); CuSuiteSummary(suite, output); CuSuiteDetails(suite, output); ' printf %s \ ' printf("%s\n", output->buffer); CuSuiteFree(suite); CuStringFree(output); } int main(int argc, char** args) { if (argc > 1 && !strcmp(args[1], "-d")) { printf("Setting die on fail.\n"); CuDieOnFail(); } RunAllTests(); return 0; } ' astrometry.net-0.67/util/make-wcs.py000755 000765 000024 00000003216 12651445460 017631 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from optparse import OptionParser from astrometry.util.util import * if __name__ == '__main__': parser = OptionParser('usage: %prog [options] ') parser.add_option('-r', '--ra', dest='ra', type='float', help='RA (deg)') parser.add_option('-d', '--dec', dest='dec', type='float', help='Dec (deg)') parser.add_option('-s', '--size', dest='size', type='float', help='Field width (deg)') parser.add_option('-p', '--pixscale', type='float', help='Pixel scale (arcsec/pixel)') parser.add_option('-W', '--width', dest='w', type='int', help='Image width, default %default', default=1024) parser.add_option('-H', '--height', dest='h', type='int', help='Image height, default %default', default=1024) parser.set_defaults(ra=None, dec=None, size=None, w=None, h=None) opt,args = parser.parse_args() if len(args) == 0: parser.print_help() sys.exit(0) if opt.pixscale is None and opt.size is None: print 'Must specify --pixscale or --size' parser.print_help() sys.exit(-1) pixscale = 0. if opt.size is not None: pixscale = opt.size / opt.w elif opt.pixscale is not None: pixscale = opt.pixscale / 3600. if opt.ra is None or opt.dec is None: print 'Must specify --ra and --dec' parser.print_help() sys.exit(-1) wcs = Tan(*[float(x) for x in [ opt.ra, opt.dec, 0.5 + (opt.w / 2.), 0.5 + (opt.h / 2.), -pixscale, 0., 0., pixscale, opt.w, opt.h, ]]) wcs.write_to(args[0]) astrometry.net-0.67/util/Makefile000644 000765 000024 00000034775 12651445460 017223 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE BASEDIR := .. COMMON := . all: .PHONY: all # You can build stripped-down versions of the AN libraries that do not # depend on libkd or libqfits by defining the following in your Makefile # before calling "make" in the "util" directory: # NO_KDTREE := 1 # export NO_KDTREE # NO_QFITS := 1 # export NO_QFITS include $(COMMON)/makefile.common include $(COMMON)/makefile.anfiles SO=$(SHAREDLIB_SUFFIX) ANBASE_OBJ := starutil.o mathutil.o bl-sort.o bl.o bt.o healpix-utils.o \ healpix.o permutedsort.o ioutils.o fileutils.o md5.o \ os-features.o an-endian.o errors.o an-opts.o tic.o log.o datalog.o \ sparsematrix.o coadd.o convolve-image.o resample.o \ intmap.o histogram.o histogram2d.o ANBASE_DEPS := ANUTILS_OBJ := sip-utils.o fit-wcs.o sip.o \ anwcs.o wcs-resample.o gslutils.o wcs-pv2sip.o # Things that it depends on but that aren't linked in ANFILES_DEPS := ANFILES_OBJ := ifndef NO_QFITS ANFILES_OBJ += multiindex.o index.o codekd.o starkd.o rdlist.o xylist.o \ starxy.o qidxfile.o quadfile.o scamp.o scamp-catalog.o \ tabsort.o wcs-xy2rd.o wcs-rd2xy.o ANFILES_DEPS += $(QFITS_LIB) endif SIMPLEXY_OBJ := dallpeaks.o dcen3x3.o dfind.o dmedsmooth.o dobjects.o \ dpeaks.o dselip.o dsigma.o dsmooth.o image2xy.o simplexy.o ctmf.o ANUTILS_OBJ += $(SIMPLEXY_OBJ) include $(COMMON)/makefile.cairo include $(COMMON)/makefile.jpeg include $(COMMON)/makefile.png include $(COMMON)/makefile.netpbm ANBASE_LIB_FILE := libanbase.a ANUTILS_LIB_FILE := libanutils.a ANFILES_LIB_FILE := libanfiles.a # D'oh ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),reconfig) include $(COMMON)/makefile.os-features endif endif NETPBM_INC_ORIG := $(NETPBM_INC) NETPBM_LIB_ORIG := $(NETPBM_LIB) ifeq ($(HAVE_NETPBM),yes) else NETPBM_INC := NETPBM_LIB := endif CFLAGS += $(CFLAGS_DEF) CFLAGS += -I$(ANBASE_DIR) CFLAGS += $(CAIRO_INC) CFLAGS += $(JPEG_INC) CFLAGS += $(PNG_INC) CFLAGS += $(NETPBM_INC) CFLAGS += $(ANFILES_CFLAGS) CFLAGS += $(ANFILES_INC) CFLAGS += -I. %.o: %.c $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) -c $< LDFLAGS += $(LDFLAGS_DEF) LDLIBS := $(LDLIBS_DEF) LDLIBS += $(ANFILES_LIB) SHAREDLIBFLAGS := $(SHAREDLIBFLAGS_DEF) QFITS_UTILS := fits-column-merge subtable fitsgetext wcsinfo PROGS := an-fitstopnm an-pnmtofits downsample-fits \ fits-flip-endian hpsplit wcs-to-tan query-starkd \ get-healpix $(QFITS_UTILS) pad-file wcs-match wcs-pv2sip MAIN_PROGS := wcs-resample tabsort wcs-xy2rd wcs-rd2xy fit-wcs wcs-pv2sip all: $(ANBASE_LIB_FILE) $(ANUTILS_LIB_FILE) $(ANFILES_LIB_FILE) $(PROGS) $(MAIN_PROGS) # Things that it depends on but that aren't linked in ANUTILS_DEPS := # Actually there are ANFILES_H mixed in here too.... ANUTILS_H := an-bool.h an-endian.h an-opts.h an-thread-pthreads.h \ an-thread.h anwcs.h bl.h bl.inc bl.ph bl-nl.h bl-nl.inc bl-nl.ph \ bl-sort.h bt.h cairoutils.h \ codekd.h errors.h fitsbin.h fitsfile.h fitsioutils.h \ fitstable.h os-features-config.h os-features.h gslutils.h \ healpix-utils.h healpix.h index.h intmap.h ioutils.h fileutils.h \ keywords.h log.h \ mathutil.h permutedsort.h qidxfile.h quadfile.h rdlist.h scamp-catalog.h \ fit-wcs.h sip-utils.h sip.h sip_qfits.h starkd.h starutil.h starutil.inc \ starxy.h tic.h \ xylist.h coadd.h convolve-image.h resample.h multiindex.h scamp.h \ ctmf.h dimage.h image2xy.h simplexy-common.h simplexy.h \ tabsort.h wcs-rd2xy.h wcs-xy2rd.h wcs-pv2sip.h ANUTILS_H_PATH := $(addprefix $(INCLUDE_DIR)/,$(ANUTILS_H)) ifndef NO_QFITS ANUTILS_OBJ += fitsioutils.o sip_qfits.o fitstable.o fitsbin.o fitsfile.o \ tic.o ANUTILS_DEPS += $(QFITS_LIB) endif ## ANFILES_DEPS, ANFILES_OBJ -- in makefile.anfiles ALL_OBJ := $(ANBASE_OBJ) $(ANUTILS_OBJ) $(ANFILES_OBJ) $(MISC_OBJ) DEP_OBJ := $(ANUTILS_OBJ) $(ANFILES_OBJ) $(MISC_OBJ) DEP_PREREQS := $(ANBASE_LIB_FILE): $(ANBASE_OBJ) $(ANBASE_DEPS) -rm -f $@ $(AR) rc $@ $(ANBASE_OBJ) $(RANLIB) $@ $(ANUTILS_LIB_FILE): $(ANUTILS_OBJ) $(ANUTILS_DEPS) -rm -f $@ $(AR) rc $@ $(ANUTILS_OBJ) $(RANLIB) $@ $(ANFILES_LIB_FILE): $(ANFILES_OBJ) $(ANFILES_DEPS) -rm -f $@ $(AR) rc $@ $(ANFILES_OBJ) $(RANLIB) $@ $(MAIN_PROGS): %: %-main.o $(ANFILES_SLIB) $(PROGS): %: %.o $(ANFILES_SLIB) DEP_OBJ += $(addsuffix -main.o,$(MAIN_PROGS)) DEP_OBJ += $(addsuffix .o,$(PROGS)) an-pnmtofits: an-pnmtofits.o $(ANFILES_SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(NETPBM_LIB) $(LDLIBS) ALL_OBJ += an-pnmtofits.o wcs-pv2sip: wcs-pv2sip.o $(ANUTILS_SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) ALL_OBJ += wcs-pv2sip.o _util$(PYTHON_SO_EXT): util.i lanczos.i $(ANFILES_SLIB) LDFLAGS="$(LDFLAGS)" LDLIBS="$(LDLIBS)" SLIB="$(ANFILES_SLIB)" \ INC="$(ANFILES_INC)" CFLAGS="$(CFLAGS)" \ python setup.py build_ext -v --inplace --build-temp . util.py: util.i lanczos.i LDFLAGS="$(LDFLAGS)" LDLIBS="$(LDLIBS)" SLIB="$(ANFILES_SLIB)" \ INC="$(ANFILES_INC)" CFLAGS="$(CFLAGS)" \ python setup.py build_ext -v --inplace --build-temp . PYUTIL := _util$(PYTHON_SO_EXT) util.py pyutil: $(PYUTIL) .PHONY: pyutil py: $(PYUTIL) .PHONY: py PYTHON_INSTALL := fits2fits.py image2pnm.py addpath.py \ starutil.py starutil_numpy.py \ shell.py __init__.py file.py run_command.py w3c_validator.py \ filetype.py fits.py fix_sdss_idr.py removelines.py \ uniformize.py lsstutils.py casjobs.py \ sdss_das.py sdss_filenames.py sdss_get_catalog.py sdss_noise.py \ sdss_psf.py sdss_psfield.py sqlcl.py \ usnob_catalog.py usnob_get_image.py usnob_get_region.py \ find_data_file.py plotshift.py plotutils.py miscutils.py multiproc.py \ yanny.py ttime.py resample.py \ EXIF.py degtohms.py hmstodeg.py horizons.py text2fits.py votabletofits.py \ imageutils.py merge-columns.py siap.py stages.py timingpool.py # celestial_mechanics.py (needs license) PYTHON_EXECS := fits2fits.py image2pnm.py removelines.py uniformize.py \ degtohms.py hmstodeg.py text2fits.py votabletofits.py \ merge-columns.py PY_INSTALL_DIR := $(PY_BASE_INSTALL_DIR)/util LINK_DIR := $(PY_BASE_LINK_DIR)/util install: install-core $(MAKE) install-core @echo "The following copy commands may fail; they are optional." -$(MAKE) py && cp _util$(PYTHON_SO_EXT) util.py '$(PY_INSTALL_DIR)' @echo ok .PHONY: install install-core: $(PYTHON_EXECS) $(PROGS) $(MAIN_PROGS) $(ANUTILS_H_PATH) \ $(ANFILES_LIB_FILE) $(ANUTILS_LIB_FILE) $(ANBASE_LIB_FILE) @echo Installing in base directory '$(INSTALL_DIR)' @echo Installing python in base directory '$(PY_INSTALL_DIR)' mkdir -p '$(PY_INSTALL_DIR)' @for x in $(PYTHON_INSTALL); do \ echo cp $$x '$(PY_INSTALL_DIR)/'$$x; \ cp $$x '$(PY_INSTALL_DIR)/'$$x; \ done @echo Making symlinks in directory '$(BIN_INSTALL_DIR)' mkdir -p '$(BIN_INSTALL_DIR)' @for x in $(PYTHON_EXECS); do \ echo ln -f -s '$(PY_INSTALL_DIR)/'$$x '$(BIN_INSTALL_DIR)/'$$x; \ ln -f -s '$(LINK_DIR)/'$$x '$(BIN_INSTALL_DIR)/'$$x; \ done @echo Installing executables into '$(BIN_INSTALL_DIR)'... @for x in $(PROGS) $(MAIN_PROGS); do \ echo cp $$x '$(BIN_INSTALL_DIR)/'$$x; \ cp $$x '$(BIN_INSTALL_DIR)/'$$x; \ done @echo Installing headers into '$(INCLUDE_INSTALL_DIR)'... mkdir -p '$(INCLUDE_INSTALL_DIR)' @for x in $(ANUTILS_H); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ done @echo Installing libraries into '$(LIB_INSTALL_DIR)'... mkdir -p '$(LIB_INSTALL_DIR)' @for x in $(ANFILES_LIB_FILE) $(ANUTILS_LIB_FILE) $(ANBASE_LIB_FILE); do \ echo cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ done .PHONY: install-core $(INCLUDE_DIR)/os-features-config.h: os-features-test.c @echo @echo "---- Error messages in the next few commands are not necessarily bugs ----" @echo " (we're checking how things works on your computer)" -rm -f os-features.log -rm -f $@ $@.tmp @echo @echo "Testing canonicalize_file_name..." @echo "Testing canonicalize_file_name..." >> os-features.log (($(CC) -o os-features-test-canonicalize \ $(CPPFLAGS) $(CFLAGS) -DTEST_CANONICALIZE_FILE_NAME $^ $(LDFLAGS) >> os-features.log && \ ./os-features-test-canonicalize >> os-features.log && \ echo "#define NEED_CANONICALIZE_FILE_NAME 0") \ || echo "#define NEED_CANONICALIZE_FILE_NAME 1") >> $@.tmp @echo @echo "Testing declare qsort_r..." @echo "Testing declare qsort_r..." >> os-features.log (($(CC) -o os-features-test-declare-qsort \ $(CPPFLAGS) $(CFLAGS) -DTEST_DECLARE_QSORT_R $^ $(LDFLAGS) >> os-features.log && \ ./os-features-test-declare-qsort >> os-features.log && \ echo "#define NEED_DECLARE_QSORT_R 1") \ || echo "#define NEED_DECLARE_QSORT_R 0") >> $@.tmp @echo @echo "Testing qsort_r..." @echo "Testing qsort_r..." >> os-features.log (($(CC) -o os-features-test-qsort \ $(CPPFLAGS) $(CFLAGS) -DTEST_QSORT_R $^ $(LDFLAGS) >> os-features.log && \ ./os-features-test-qsort >> os-features.log && \ echo "#define NEED_QSORT_R 0") \ || echo "#define NEED_QSORT_R 1") >> $@.tmp @echo @echo "Testing swap qsort_r..." @echo "Testing swap qsort_r..." >> os-features.log (($(CC) -Werror -o os-features-test-swap-qsort \ $(CPPFLAGS) $(CFLAGS) -DTEST_SWAP_QSORT_R $^ $(LDFLAGS) >> os-features.log && \ ./os-features-test-swap-qsort >> os-features.log && \ echo "#define NEED_SWAP_QSORT_R 0") \ || echo "#define NEED_SWAP_QSORT_R 1") >> $@.tmp @echo @echo "Testing netpbm..." @echo " NETPBM_INC is $(NETPBM_INC_ORIG)" @echo " NETPBM_LIB is $(NETPBM_LIB_ORIG)" @echo "Testing netpbm..." >> os-features.log (($(CC) -o os-features-test-netpbm \ $(CPPFLAGS) $(CFLAGS) -DTEST_NETPBM $(NETPBM_INC_ORIG) $^ $(LDFLAGS) $(NETPBM_LIB_ORIG) >> os-features.log && \ ./os-features-test-netpbm >> os-features.log && \ echo "#define HAVE_NETPBM 1") \ || echo "#define HAVE_NETPBM 0") >> $@.tmp @echo "--------------- End of expected error messages -----------------" @echo mv $@.tmp $@ @echo @echo "Config results:" @echo "------------------------------" @echo cat $@ @echo @echo "------------------------------" @echo makefile.os-features: os-features-test.c @echo @echo "---- Error messages in the next few commands are not necessarily bugs ----" @echo " (we're checking how things works on your computer)" -rm -f os-features-makefile.log @echo "Testing netpbm..." @echo " NETPBM_INC_ORIG is $(NETPBM_INC_ORIG)" @echo " NETPBM_LIB_ORIG is $(NETPBM_LIB_ORIG)" ( \ echo "# This file is generated by util/Makefile."; \ (($(CC) -o os-features-test-netpbm-make \ $(CPPFLAGS) $(CFLAGS) -DTEST_NETPBM_MAKE $(NETPBM_INC_ORIG) $^ $(LDFLAGS) $(NETPBM_LIB_ORIG) >> os-features-makefile.log && \ ./os-features-test-netpbm-make >> os-features-makefile.log && \ echo "HAVE_NETPBM := yes") \ || (echo "# Astrometry.net didn't find netpbm; not setting HAVE_NETPBM."; \ echo "# See os-features-makefile.log for details."; \ echo "# To re-run this test, do 'make reconfig; make makefile.os-features' (in the 'util' directory)"; \ echo "# Or to do it yourself, just uncomment this line:"; \ echo "# HAVE_NETPBM := yes")) \ ; \ echo) > $@.tmp @echo "--------------- End of expected error messages -----------------" @echo mv $@.tmp $@ @echo @echo "Config results:" @echo "------------------------------" @echo cat $@ @echo "------------------------------" @echo @echo "And, by the way, is WCSlib support being compiled in?" @echo pkg-config --exists wcslib && echo yes || echo no @echo @echo " WCSLIB_INC: $(WCSLIB_INC)" @echo " WCSLIB_LIB: $(WCSLIB_LIB)" @echo @echo "------------------------------" reconfig: -rm -f '$(INCLUDE_DIR)/'os-features-config.h makefile.os-features .PHONY: reconfig config: $(INCLUDE_DIR)/os-features-config.h makefile.os-features .PHONY: config ALL_OBJ += os-features.o ALL_TARGETS := os-features-test.o \ os-features-test-canonicalize \ os-features-test-declare-qsort \ os-features-test-qsort \ os-features-test-netpbm \ os-features-test-netpbm-make \ $(INCLUDE_DIR)/os-features-config.h ifndef NO_QFITS DEP_PREREQS += $(QFITS_LIB) endif ### TESTS ALL_TEST_FILES = test_bl test_bt test_endian test_fitstable test_xylist \ test_rdlist test_healpix test_fitsioutils test_fitsbin test_log \ test_scamp_catalog test_starutil test_svd test_ioutils \ test_anwcs test_sip-utils test_errors test_multiindex \ test_convolve_image test_qsort_r test_wcs test_big_tables \ test_dfind test_ctmf test_dsmooth test_dcen3x3 test_simplexy \ test_fit_wcs # test_quadfile -- takes a long time! ALL_TEST_EXTRA_OBJS = ALL_TEST_LIBS = $(ANFILES_SLIB) ALL_TEST_EXTRA_LDFLAGS = include $(COMMON)/makefile.tests DEP_OBJ += $(ALL_TEST_FILES_O) tests: $(ALL_TEST_FILES) .PHONY: tests TEST_DFIND_OBJS := dfind.o ALL_TEST_EXTRA_OBJS += $(TEST_DFIND_OBJS) test_dfind: $(TEST_DFIND_OBJS) $(ANFILES_SLIB) TEST_CTMF_OBJS := ctmf.o ALL_TEST_EXTRA_OBJS += $(TEST_CTMF_OBJS) test_ctmf: $(TEST_CTMF_OBJS) TEST_DSMOOTH_OBJS := dsmooth.o ALL_TEST_EXTRA_OBJS += $(TEST_DSMOOTH_OBJS) test_dsmooth: $(TEST_DSMOOTH_OBJS) test_dcen3x3: dcen3x3.o ALL_TEST_EXTRA_OBJS += dcen3x3.o test_simplexy: $(SIMPLEXY_OBJ) $(ANFILES_SLIB) ALL_TEST_EXTRA_OBJS += $(SIMPLEXY_OBJ) NORMAL_TESTS := test_big_tables test_qsort_r \ test_convolve_image test_multiindex test_errors test_sip-utils \ test_anwcs test_wcs test_fitstable test_fitsbin \ test_fitsioutils test_xylist test_rdlist test_bl test_bt test_endian \ test_healpix test_log test_ioutils test_scamp_catalog test_starutil \ test_svd test_fit_wcs test_quadfile $(NORMAL_TESTS): $(ANFILES_SLIB) ### /TESTS # we'll just tack this on here... It depends on cairo, libjpeg, etc, # so it's not part of the anX.a libraries. ifeq ($(MAKECMDGOALS),cairoutils.o) include cairoutils.dep endif .PHONY: clean clean: rm -f $(ANUTILS_LIB_FILE) $(ANFILES_LIB_FILE) $(ANBASE_LIB_FILE) \ $(ALL_OBJ) $(DEPS) deps cairoutils.o \ grab-stellarium-constellations \ $(PROGS) $(MAIN_PROGS) $(ALL_TARGETS) $(ALL_TESTS_CLEAN) \ cairoutils.dep makefile.os-features *.o *~ *.dep *$(PYTHON_SO_EXT) deps \ os-features.log os-features-makefile.log report.txt check: echo PYTHON_SO_EXT is $(PYTHON_SO_EXT) # Try to compensate for clang's lack of -MG to handle generated header # files by making everything depend explicitly on os-features-config.h. # the bar "|" indicates an "order-only" dependency: must be built # before, but doesn't imply a rebuild is necessary. # Should this perhaps go on the .dep files rather than the .c? DEP_SRC := $(subst .o,.c,$(DEP_OBJ)) $(DEP_SRC): | $(INCLUDE_DIR)/os-features-config.h os-features.h: | $(INCLUDE_DIR)/os-features-config.h $(DEP_OBJ): $(INCLUDE_DIR)/os-features-config.h ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),reconfig) ifneq ($(MAKECMDGOALS),makefile.os-features) include $(COMMON)/makefile.deps endif endif endif astrometry.net-0.67/util/makefile.anbase000644 000765 000024 00000000555 12651445460 020500 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ANBASE_DIR := $(BASEDIR)/util ANBASE_LIB_FILE := $(ANBASE_DIR)/libanbase.a ANBASE_CFLAGS := ANBASE_INC := -I$(INCLUDE_BASE_DIR) -I$(INCLUDE_DIR) ANBASE_LIB := ANBASE_SLIB := $(ANBASE_LIB_FILE) $(ANBASE_LIB_FILE): $(MAKE) -C $(ANBASE_DIR) libanbase.a astrometry.net-0.67/util/makefile.anfiles000644 000765 000024 00000001433 12651445460 020664 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ANFILES_DIR := $(BASEDIR)/util ANFILES_INC := ANFILES_LIB := ANFILES_LIB_FILE := $(ANFILES_DIR)/libanfiles.a ANFILES_SLIB := $(ANFILES_LIB_FILE) ANFILES_CFLAGS := $(ANFILES_LIB_FILE): $(addprefix $(ANFILES_DIR)/,$(ANFILES_OBJ)) $(MAKE) -C $(ANFILES_DIR) libanfiles.a # Astrometry.net files ("anfiles") depends on: # libkd # anutils (+ qfits) ifndef NO_KDTREE include $(COMMON)/makefile.libkd else include $(COMMON)/makefile.anutils endif ifndef NO_KDTREE ANFILES_INC += $(LIBKD_INC) ANFILES_LIB += $(LIBKD_LIB) ANFILES_SLIB += $(LIBKD_SLIB) endif ANFILES_CFLAGS += $(ANUTILS_CFLAGS) ANFILES_INC += $(ANUTILS_INC) ANFILES_LIB += $(ANUTILS_LIB) ANFILES_SLIB += $(ANUTILS_SLIB) astrometry.net-0.67/util/makefile.anutils000644 000765 000024 00000002340 12651445460 020720 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ANUTILS_DIR := $(BASEDIR)/util ANUTILS_LIB_FILE := $(ANUTILS_DIR)/libanutils.a ANUTILS_INC := ANUTILS_LIB := ANUTILS_SLIB := $(ANUTILS_LIB_FILE) ANUTILS_CFLAGS := $(ANUTILS_LIB_FILE): $(MAKE) -C $(ANUTILS_DIR) libanutils.a # Astrometry.net utils ("anutils") depends on: # anbase # qfits # gsl # wcslib (optional) include $(COMMON)/makefile.gsl include $(COMMON)/makefile.wcslib ANUTILS_INC += $(ANBASE_INC) ANUTILS_CFLAGS += $(ANBASE_CFLAGS) ANUTILS_LIB += $(ANBASE_LIB) ANUTILS_SLIB += $(ANBASE_SLIB) ifndef NO_QFITS include $(COMMON)/makefile.qfits else include $(COMMON)/makefile.anbase endif ifdef WCSLIB_EXISTS ifdef NOWCSLIB else ANUTILS_CFLAGS += -DWCSLIB_EXISTS endif endif # WCSTOOLS_EXISTS := 1 ifdef WCSTOOLS_EXISTS ANUTILS_CFLAGS += -DWCSTOOLS_EXISTS WCSTOOLS_LIB ?= libwcs.a endif WCS_LIB := $(WCSTOOLS_LIB) $(WCSLIB_LIB) WCS_SLIB := $(WCSLIB_SLIB) ifndef NO_QFITS ANUTILS_INC += $(QFITS_INC) ANUTILS_LIB += $(QFITS_LIB) ANUTILS_SLIB += $(QFITS_SLIB) endif ANUTILS_INC += $(GSL_INC) $(WCSLIB_INC) ANUTILS_SLIB += $(ANUTILS_LIB) $(GSL_SLIB) $(WCS_SLIB) ANUTILS_LIB += $(GSL_LIB) $(WCS_LIB) -lm astrometry.net-0.67/util/makefile.blind000644 000765 000024 00000000250 12651445460 020327 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE BLIND_DIR := $(BASEDIR)/blind BLIND_INC := -I$(BLIND_DIR) astrometry.net-0.67/util/makefile.cairo000644 000765 000024 00000000344 12651445460 020340 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE CAIRO_INC ?= $(shell pkg-config --cflags cairo 2>/dev/null) CAIRO_LIB ?= $(shell pkg-config --libs cairo 2>/dev/null) astrometry.net-0.67/util/makefile.cfitsio000644 000765 000024 00000001070 12651445460 020700 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # if CFITS_INC environment variable is set, assume CFITS_EXISTS. # Note also that CFITS_EXISTS can be overridden by the environment. ifeq ($(origin CFITS_INC), environment) CFITS_EXISTS := 1 else X := $(shell pkg-config --exists cfitsio && echo yes || echo no) ifeq ($(X), yes) CFITS_EXISTS ?= 1 endif endif CFITS_INC ?= $(shell pkg-config --cflags cfitsio 2>/dev/null) CFITS_LIB ?= $(shell pkg-config --libs cfitsio 2>/dev/null) CFITS_SLIB := astrometry.net-0.67/util/makefile.common000644 000765 000024 00000022315 12651446356 020542 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE INCLUDE_BASE_DIR := $(BASEDIR)/include INCLUDE_DIR := $(INCLUDE_BASE_DIR)/astrometry INSTALL_DIR ?= /usr/local/astrometry # Put INSTALL_DIR in the environment of commands run by Make. export INSTALL_DIR # Installation subdirs PY_BASE_INSTALL_DIR := $(INSTALL_DIR)/lib/python/astrometry INCLUDE_INSTALL_DIR := $(INSTALL_DIR)/include/astrometry LIB_INSTALL_DIR := $(INSTALL_DIR)/lib BIN_INSTALL_DIR := $(INSTALL_DIR)/bin DATA_INSTALL_DIR := $(INSTALL_DIR)/data PY_BASE_LINK_DIR := ../lib/python/astrometry ETC_INSTALL_DIR ?= $(INSTALL_DIR)/etc MAN1_INSTALL_DIR ?= $(INSTALL_DIR)/share/man/man1 DOC_INSTALL_DIR ?= $(INSTALL_DIR)/doc EXAMPLE_INSTALL_DIR ?= $(INSTALL_DIR)/examples # If your build system stages an install in one place (say, a temp # dir) and then copies everything to the final install place, (eg, # debian), set *_INSTALL_DIR to the staging place and *_FINAL_DIR to # the final destination directory. # This should rarely be used, since hardly anything should care that # it's going to be moved after being staged. # (ie, the only place it's used at the moment is in blind/Makefile when # putting the final data directory in the config file etc/astrometry.cfg) FINAL_DIR ?= $(INSTALL_DIR) DATA_FINAL_DIR ?= $(FINAL_DIR)/data # only set CC if it hasn't already been set # (this allows the user to override it) ## can't use "CC ?= gcc" because CC gets a default value ifeq ($(origin CC), default) CC := gcc endif # no default rules .SUFFIXES := # These are files %.py: ; %.i: ; %.c: ; %.h: ; %.awk: ; %.inc: ; %.ph: ; makefile.%: ; Makefile: ; # Cancel stupid implicit rules. %: %,v %: RCS/%,v %: RCS/% %: s.% %: SCCS/s.% # sh shell AN_SHELL ?= /bin/sh RANLIB ?= ranlib AWK ?= LC_ALL=C LC_NUMERIC=EN_US awk SED ?= sed MV ?= mv FLAGS_DEF := -g -Wall TMPFILE := cc-out.tmp # Test whether $(CC) accepts a particular argument; set ARG before running. #CCTEST = $(CC) -x c -c -o $(TMPFILE) $(ARG) - < /dev/null > /dev/null 2> /dev/null && echo $(ARG) # On MacOS, unrecognized gcc args don't cause it to return 1... look for error messages on stderr. # Intel icc/13 says: icc: command line warning #10006: ignoring unknown option '-fno-signaling-nans' CCTEST = $(CC) -x c -c -o $(TMPFILE) $(ARG) - 2>&1 > /dev/null < /dev/null | grep "unrecognized\|invalid\|error:\|warning" > /dev/null || echo $(ARG) LINKTEST = $(CC) -x c -o $(TMPFILE) $(ARG) - 2>&1 > /dev/null < /dev/null | grep "unrecognized\|invalid\|error:\|warning:" > /dev/null || echo $(ARG) #PROGLINKTEST = echo "int main() { return 0; }" | $(CC) -x c -o $(TMPFILE).o - && $(CC) -o $(TMPFILE) $(TMPFILE).o $(ARG) 2>&1 > /dev/null | grep "unrecognized\|invalid\|error:\|warning:" > /dev/null || echo $(ARG) #CCTEST = $(CC) -x c -c -o $(TMPFILE) $(ARG) - 2>&1 < /dev/null | tee "CCTEST-$(ARG)" | grep "unrecognized\|invalid\|error:" > /dev/null || echo $(ARG) # Test whether a particular string appears in the compiler's default environment; # set STR before running. DEFTEST = $(CC) -dM -E - < /dev/null 2> /dev/null | grep "$(STR)" > /dev/null ARG := -shared SHAREDLIBFLAGS_DEF := $(shell $(LINKTEST)) SHAREDLIB_SUFFIX = so # Cygwin peculiarities: # --.dll filename suffix for shared libraries (created by python distutils) # -- -fPIC produces warnings UNAME = $(shell uname -s) ifneq (CYGWIN,$(findstring CYGWIN,$(UNAME))) SHAREDLIBFLAGS_DEF += -fPIC endif # Get the library suffix used by python distutils (.dll on cygwin, .so elsewhere) PYTHON_SO_EXT ?= $(shell python -c "from distutils import sysconfig; print sysconfig.get_config_var('SO')") # Set a default, otherwise terrible things happen: # in util/Makefile : clean: rm -f *$(PYTHON_SO_EXT) ifeq ($(PYTHON_SO_EXT)x,x) PYTHON_SO_EXT := .so endif # gcc 5.1 changes inline semantics #ARG := -std=gnu89 #FLAGS_DEF += $(shell $(CCTEST)) # Handled in keywords.h instead #ARG := -Wno-error=unused-command-line-argument-hard-error-in-future #FLAGS_DEF += $(shell $(CCTEST)) ARG := -ffinite-math-only FLAGS_DEF += $(shell $(CCTEST)) # clang: warning: argument unused during compilation: '-fno-signaling-nans' ARG := -fno-signaling-nans FLAGS_DEF += $(shell $(CCTEST)) # gcc non-IEEE faster math #ARG := -ffast-math #FLAGS_DEF += $(shell $(CCTEST)) # gcc 3.3 on Mac doesn't support -pthread # clang 4.1: warns about including -pthread ARG := -pthread FLAGS_DEF += $(shell $(CCTEST)) # Avoid "undefined reference to `isfinite'" on gcc 4.7.0 (carver) #ARG := -std=c99 #FLAGS_DEF += $(shell $(CCTEST)) ## Below, we try to guess good compiler flags for this CPU / architecture. ## If we make an incorrect choice -- ie, the code fails in some way on the ## machine on which it was compiled, please let us know by posting at ## astrometry.net/group ## If you want to override this setting, you can set the ## ARCH_FLAGS ## environment variable in your shell. ## With gcc 4.2 and later, gcc should be able to make the optimal choice on its own. ## See the README section "I wanna go fast!" for more details. ifneq ($(origin ARCH_FLAGS),undefined) FLAGS_DEF += $(ARCH_FLAGS) else # Try to guess some good compiler flags for this CPU. # Use -march=native if it's available (gcc 4.2 and above) ARG := -march=native X := $(shell $(CCTEST)) ifneq ($(X),) FLAGS_DEF += $(X) else # Try to guess -march MACHINE:=$(shell uname -m) ifeq ($(MACHINE), i686) # gcc before version 3.1 doesn't support "pentium4"; use "i686" instead. ARG := -march=pentium4 X := $(shell $(CCTEST)) ifneq ($(X),) STR := \#define __tune_pentium4__ 1 FLAGS_DEF += $(shell $(DEFTEST) && echo "-march=pentium4" \ || echo "-march=i686") else ARG := -march=i686 FLAGS_DEF += $(shell $(CCTEST)) endif else # make 3.79 doesn't allow multiple "else" statements, so nest 'em. ifeq ($(MACHINE), x86_64) STR := \#define __tune_k8__ 1 FLAGS_DEF += $(shell $(DEFTEST) && echo "-march=k8") FLAGS_DEF += -m64 else # ppc, ... FLAGS_DEF += -DNOT_686 endif endif endif endif STR := __APPLE__ X := $(shell $(DEFTEST) && echo "-DNOBOOL") ifneq ($(X),) # Darwin does dynamic libs differently ARG := -dynamic X := $(shell $(LINKTEST)) SHAREDLIBFLAGS_DEF += $(X) # clang 3.1 wants... ARG := -dynamic -dynamiclib X :+ $(shell $(LINKTEST)) SHAREDLIBFLAGS_DEF += $(X) # clang 4.1 doesn't support -dynamiclib ARG := -dynamiclib X := $(shell $(LINKTEST)) SHAREDLIBFLAGS_DEF += $(X) # clang 4.1 seems to need this instead: ARG := -Wl,-dylib X := $(shell $(LINKTEST)) SHAREDLIBFLAGS_DEF += $(X) ARG := -pthread X := $(shell $(LINKTEST)) SHAREDLIBFLAGS_DEF += $(X) endif # delete temp files that may have been generated by the above tests. X := $(shell rm -f $(TMPFILE)) # FLAGS_DEF are gcc flags that are shared between compiling and # linking. CFLAGS_DEF are compile flags, LDFLAGS_DEF are link flags. # Turn optimization on by default; this statement only sets OPTIMIZE # if it hasn't been set already (eg, in ../Makefile) OPTIMIZE ?= yes PROFILE ?= no ASSERT ?= -DNDEBUG ifeq ($(PROFILE),yes) FLAGS_DEF += -O2 FLAGS_DEF += -pg -g FLAGS_DEF += $(ASSERT) else ifeq ($(OPTIMIZE),yes) # speedy! FLAGS_DEF += -O3 FLAGS_DEF += -fomit-frame-pointer # turn off asserts: FLAGS_DEF += $(ASSERT) else ifeq ($(OPTIMIZE),no) # debuggy! FLAGS_DEF += -O0 FLAGS_DEF += -g endif endif endif ifneq (CYGWIN,$(findstring CYGWIN,$(UNAME))) FLAGS_DEF += -fpic endif # profily! #FLAGS_DEF += -pg ## FIXME DEBUG #FLAGS_DEF += -fstrict-aliasing -std=c99 #FLAGS_DEF += -Wstrict-aliasing # More strict aliasing warnings; possible false positives. #FLAGS_DEF += -Wstrict-aliasing=2 # Put inlined function definitions in .o files. # FLAGS_DEF += -fkeep-inline-functions FLAGS_DEF += -Winline # If user set FLAGS, use those rather than FLAGS_DEF. ifneq ($(origin FLAGS),undefined) FLAGS_DEF := $(FLAGS) endif # fold in the user's CFLAGS, if set... CFLAGS_DEF := $(CFLAGS) $(FLAGS_DEF) CFLAGS_DEF += -I$(INCLUDE_BASE_DIR) CFLAGS_DEF += -I$(INCLUDE_DIR) CFLAGS_DEF += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 CFLAGS_DEF += -D_GNU_SOURCE #ARG := -pthread #CFLAGS_DEF += $(shell $(CCTEST)) #CFLAGS_DEF += -Wextra #CFLAGS_DEF += -Wpointer-arith #CFLAGS_DEF += -fmudflap #LDFLAGS_DEF += -lmudflap # What functions were and weren't inlined? #CFLAGS_DEF += -Winline # Print header files that are included #CFLAGS_DEF += -H # fold in the user's LDFLAGS, if set... LDFLAGS_DEF := $(LDFLAGS) $(FLAGS_DEF) #ARG := -pthread #LDFLAGS_DEF += $(shell $(PROGLINKTEST)) LDLIBS_DEF := $(LDLIBS) # Make's default link recipe is: # $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS) # and some linkers demand that libraries appear *after* the object files, # so if you want a lib always linked in, add it to LDLIBS. # Provide for executable programs and FITS headers # GIT fields: revision, date and url via CFLAGS. # These fields replace the deprecated SVN fields. AN_GIT_REVISION := 0.67 AN_GIT_DATE := Mon_Jan_25_11:20:00_2016_-0500 AN_GIT_URL := https://github.com/dstndstn/astrometry.net CFLAGS_DEF += -DAN_GIT_REVISION='"$(AN_GIT_REVISION)"' CFLAGS_DEF += -DAN_GIT_DATE='"$(AN_GIT_DATE)"' CFLAGS_DEF += -DAN_GIT_URL='"$(AN_GIT_URL)"' astrometry.net-0.67/util/makefile.deps000644 000765 000024 00000002221 12651445460 020172 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # Dependencies: DEPS := $(subst .o,.dep,$(DEP_OBJ)) deps: $(DEP_PREREQS) $(DEPS) cat $(DEPS) > deps # clang complains about extraneous args when computing dependencies: # clang: warning: argument unused during compilation: '-ffinite-math-only' # clang: warning: argument unused during compilation: '-fno-signaling-nans' DEP_ARGS := $(subst -ffinite-math-only,,$(subst -fno-signaling-nans,,$(CFLAGS))) -MM CCTEST = $(CC) -x c -E $(ARG_PRE) $(ARG) - < /dev/null > /dev/null 2> /dev/null && echo $(ARG) ARG_PRE := # -MP is new in gcc-3.0 ARG := -MP DEP_ARGS += $(shell $(CCTEST)) # -MG is not supported in clang 1.1 ARG_PRE := -MM ARG := -MG DEP_ARGS += $(shell $(CCTEST)) # -MF is new in gcc-3.0 ARG := -MF cc-out.tmp X := $(shell $(CCTEST) && rm -f cc-out.tmp) ifeq ($(X),) DEP_OUT := -MF else DEP_OUT := > endif %.dep : %.c $(CC) $(DEP_ARGS) $< $(DEP_OUT) $@.tmp && $(MV) $@.tmp $@ ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),realclean) ifneq ($(MAKECMDGOALS),allclean) include deps endif endif endif astrometry.net-0.67/util/makefile.gsl000644 000765 000024 00000001232 12651445460 020025 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # On by default? This doesn't seem to work #SYSTEM_GSL ?= $(shell pkg-config --modversion gsl >/dev/null 2>/dev/null && echo yes) ifeq ($(SYSTEM_GSL),yes) GSL_INC ?= $(shell pkg-config --cflags gsl 2>/dev/null) GSL_LIB ?= $(shell pkg-config --libs gsl 2>/dev/null) GSL_SLIB ?= else GSL_DIR := $(BASEDIR)/gsl-an GSL_LIB_FILE := $(GSL_DIR)/libgsl-an.a # flags needed to compile gsl GSL_INC ?= -I$(GSL_DIR) # flags needed to link gsl GSL_LIB ?= # file dependencies for GSL GSL_SLIB ?= $(GSL_LIB_FILE) $(GSL_LIB_FILE): $(MAKE) -C $(GSL_DIR) endif astrometry.net-0.67/util/makefile.jpeg000644 000765 000024 00000001424 12651445460 020170 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Copyright 2007 Dustin Lang. # # The Astrometry.net suite 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, version 2. # # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA JPEG_INC ?= JPEG_LIB ?= -ljpeg astrometry.net-0.67/util/makefile.libkd000644 000765 000024 00000001060 12651445460 020324 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE LIBKD_DIR := $(BASEDIR)/libkd LIBKD_LIB_FILE := $(LIBKD_DIR)/libkd.a LIBKD_NOIO_LIB_FILE := $(LIBKD_DIR)/libkd-noio.a LIBKD_INC := LIBKD_SLIB := $(LIBKD_LIB_FILE) LIBKD_LIB := $(LIBKD_LIB_FILE): $(MAKE) -C $(LIBKD_DIR) libkd.a $(LIBKD_NOIO_LIB_FILE): $(MAKE) -C $(LIBKD_DIR) libkd-noio.a include $(COMMON)/makefile.anutils LIBKD_INC += $(ANUTILS_INC) LIBKD_CFLAGS += $(ANUTILS_CFLAGS) LIBKD_SLIB += $(ANUTILS_SLIB) LIBKD_LIB += $(ANUTILS_LIB) astrometry.net-0.67/util/makefile.netpbm000644 000765 000024 00000000227 12651445460 020530 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE NETPBM_INC ?= NETPBM_LIB ?= -L. -lnetpbm astrometry.net-0.67/util/makefile.png000644 000765 000024 00000000342 12651445460 020025 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE PNG_INC ?= $(shell pkg-config --cflags libpng 2>/dev/null) PNG_LIB ?= $(shell pkg-config --libs libpng 2>/dev/null) astrometry.net-0.67/util/makefile.qfits000644 000765 000024 00000000762 12651445460 020375 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE QFITS_DIR := $(BASEDIR)/qfits-an QFITS_LIB_FILE := $(QFITS_DIR)/libqfits.a QFITS_SRCDIR := $(QFITS_DIR) QFITS_CFLAGS := QFITS_INC := QFITS_LIB := QFITS_SLIB := $(QFITS_LIB_FILE) $(QFITS_LIB_FILE): $(MAKE) -C $(QFITS_DIR) libqfits.a include $(COMMON)/makefile.anbase QFITS_INC += $(ANBASE_INC) QFITS_LIB += $(ANBASE_LIB) QFITS_SLIB += $(ANBASE_SLIB) QFITS_CFLAGS += $(ANBASE_CFLAGS) astrometry.net-0.67/util/makefile.tests000644 000765 000024 00000002543 12651445460 020410 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ### First, define these variables in your Makefile. ALL_TEST_FILES ?= ALL_TEST_EXTRA_OBJS ?= ALL_TEST_LIBS ?= ALL_TEST_EXTRA_LDFLAGS ?= -lm ### Next, include this file. ### Ignore everything below here. It's just magic. ALL_TEST_FILES_C = $(addsuffix .c, $(ALL_TEST_FILES)) ALL_TEST_FILES_O = $(addsuffix .o, $(ALL_TEST_FILES)) ALL_TEST_FILES_MAIN_C = $(addsuffix -main.c, $(ALL_TEST_FILES)) ALL_TEST_FILES_MAIN_O = $(addsuffix -main.o, $(ALL_TEST_FILES)) ALL_TESTS_CLEAN = $(ALL_TEST_FILES) $(ALL_TEST_FILES_O) \ $(ALL_TEST_FILES_MAIN_C) $(ALL_TEST_FILES_MAIN_O) \ test test.o test.c cutest.o MAKE_TESTS := $(COMMON)/make-tests.sh $(COMMON)/make-tests.sh: ; $(ALL_TEST_FILES_MAIN_C): %-main.c: $(MAKE_TESTS) $(ALL_TEST_FILES_MAIN_C): %-main.c: %.c $(AN_SHELL) $(MAKE_TESTS) $^ > $@ $(ALL_TEST_FILES): %: %-main.o %.o $(COMMON)/cutest.o TEST_SOURCES = $(ALL_TEST_FILES_C) test.c: $(MAKE_TESTS) $(TEST_SOURCES) $(AN_SHELL) $(MAKE_TESTS) $(TEST_SOURCES) > $@ test: test.o $(COMMON)/cutest.o $(ALL_TEST_FILES_O) $(sort $(ALL_TEST_EXTRA_OBJS)) $(ALL_TEST_LIBS) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(ALL_TEST_EXTRA_LDFLAGS) $(LDLIBS) $(ALL_TEST_FILES_O) $(ALL_TEST_FILES_MAIN_O) test.o: %.o: %.c $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) -c $< -I$(COMMON) astrometry.net-0.67/util/makefile.wcslib000644 000765 000024 00000001157 12651445460 020531 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # WCSLIB is (supposed to be) optional. # if WCSLIB_INC environment variable is set, assume WCSLIB_EXISTS ifeq ($(origin WCSLIB_INC), environment) WCSLIB_EXISTS := 1 else X := $(shell pkg-config --exists wcslib && echo yes || echo no) ifeq ($(X), yes) WCSLIB_EXISTS ?= 1 endif endif WCSLIB_INC ?= $(shell pkg-config --cflags wcslib 2>/dev/null) WCSLIB_LIB ?= $(shell pkg-config --libs wcslib 2>/dev/null) WCSLIB_SLIB ?= #WCSLIB_LIB ?= #WCSLIB_SLIB ?= $(shell pkg-config --static wcslib 2>/dev/null) astrometry.net-0.67/util/makefile.zlib000644 000765 000024 00000000356 12651445460 020206 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE ZLIB_INC ?= $(shell pkg-config --cflags zlib 2>/dev/null) ZLIB_LIB ?= $(shell pkg-config --libs zlib 2>/dev/null || echo "-lz") astrometry.net-0.67/util/matchfile_to_wcs.py000644 000765 000024 00000004032 12651445460 021426 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from optparse import OptionParser from astrometry.util.fits import * def match_to_wcs(matchfn, row, wcsfn, imgw=0, imgh=0): m = table_fields(matchfn) wcs = pyfits.PrimaryHDU() h = wcs.header hdrs = [ ('CTYPE1', 'RA---TAN', None), ('CTYPE2', 'DEC--TAN', None), ('WCSAXES', 2, None), ('EQUINOX', 2000.0, 'Equatorial coordinates definition (yr)'), ('LONPOLE', 180.0, None), ('LATPOLE', 0.0, None), ('CUNIT1', 'deg', 'X pixel scale units'), ('CUNIT2', 'deg', 'Y pixel scale units'), ('CRVAL1', m.crval[row][0], 'RA of reference point'), ('CRVAL2', m.crval[row][1], 'DEC of reference point'), ('CRPIX1', m.crpix[row][0], 'X reference pixel'), ('CRPIX2', m.crpix[row][1], 'Y reference pixel'), ('CD1_1', m.cd[row][0], 'Transformation matrix'), ('CD1_2', m.cd[row][1], None), ('CD2_1', m.cd[row][2], None), ('CD2_2', m.cd[row][3], None), ] if imgw: hdrs.append(('IMAGEW', imgw, 'Image width, in pixels.')) if imgh: hdrs.append(('IMAGEH', imgh, 'Image height, in pixels.')) for (k,v,c) in hdrs: h.update(k, v, c) pyfits_writeto(wcs, wcsfn) if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-r', dest='row', help='Row of the match file to take (default 0)', type='int') parser.add_option('-W', dest='imgw', help='Image width', type='float') parser.add_option('-H', dest='imgh', help='Image height', type='float') parser.set_defaults(row=0, imgw=0, imgh=0) (options, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Need args and ' sys.exit(-1) matchfn = args[0] wcsfn = args[1] match_to_wcs(matchfn, options.row, wcsfn, options.imgw, options.imgh) astrometry.net-0.67/util/mathutil.c000644 000765 000024 00000025002 12651445460 017535 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "mathutil.h" #include "keywords.h" #include "log.h" #include "errors.h" #define InlineDefine InlineDefineC #include "mathutil.inc" #undef InlineDefine #include "bl.h" /** Returns 1 if the given point is inside the given polygon (listed as x0,y0, x1,y1, etc). */ int point_in_polygon(double x, double y, const dl* polygon) { size_t i; size_t N = dl_size(polygon) / 2; int inside = 0; for (i=0; i= 2"); return -1; } if (edgehandling == 0) { // truncate. outw = W / S; outh = H / S; } else if (edgehandling == 1) { // average outw = (W + S-1) / S; outh = (H + S-1) / S; } else { logerr("Unknown edge handling code %i", edgehandling); return -1; } if (newW) *newW = outw; if (newH) *newH = outh; return 0; } float* average_image_f(const float* image, int W, int H, int S, int edgehandling, int* newW, int* newH, float* output) { return average_weighted_image_f(image, NULL, W, H, S, edgehandling, newW, newH, output, 0.0); } float* average_weighted_image_f(const float* image, const float* weight, int W, int H, int S, int edgehandling, int* newW, int* newH, float* output, float nilval) { int outw, outh; int i,j; if (get_output_image_size(W, H, S, edgehandling, &outw, &outh)) return NULL; if (output == NULL) { output = malloc(outw * outh * sizeof(float)); if (!output) { SYSERROR("Failed to allocate %i x %i floats", outw, outh); return NULL; } } for (j=0; j= H) break; for (I=0; I= W) break; ii = (j*S + J)*W + (i*S + I); if (weight) { wsum += weight[ii]; sum += image[ii] * weight[ii]; } else { wsum += 1.0; sum += image[ii]; } } } if (wsum == 0.0) output[j * outw + i] = nilval; else output[j * outw + i] = sum / wsum; } } if (newW) *newW = outw; if (newH) *newH = outh; return output; } // "borrowed" from from linux-2.4 static unsigned int my_hweight32(unsigned int w) { unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); res = (res & 0x33333333) + ((res >> 2) & 0x33333333); res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); } int invert_2by2_arr(const double* A, double* Ainv) { double det; double inv_det; det = A[0] * A[3] - A[1] * A[2]; if (det == 0.0) return -1; inv_det = 1.0 / det; Ainv[0] = A[3] * inv_det; Ainv[1] = -A[1] * inv_det; Ainv[2] = -A[2] * inv_det; Ainv[3] = A[0] * inv_det; return 0; } int invert_2by2(const double A[2][2], double Ainv[2][2]) { double det; double inv_det; det = A[0][0] * A[1][1] - A[0][1] * A[1][0]; if (det == 0.0) return -1; inv_det = 1.0 / det; Ainv[0][0] = A[1][1] * inv_det; Ainv[0][1] = -A[0][1] * inv_det; Ainv[1][0] = -A[1][0] * inv_det; Ainv[1][1] = A[0][0] * inv_det; return 0; } void tan_vectors(const double* pt, double* vec1, double* vec2) { double etax, etay, etaz, xix, xiy, xiz, eta_norm; double inv_en; // eta is a vector perpendicular to pt etax = -pt[1]; etay = pt[0]; etaz = 0.0; eta_norm = hypot(etax, etay); //sqrt(etax * etax + etay * etay); inv_en = 1.0 / eta_norm; etax *= inv_en; etay *= inv_en; vec1[0] = etax; vec1[1] = etay; vec1[2] = etaz; // xi = pt cross eta xix = -pt[2] * etay; xiy = pt[2] * etax; xiz = pt[0] * etay - pt[1] * etax; // xi has unit length since pt and eta have unit length. vec2[0] = xix; vec2[1] = xiy; vec2[2] = xiz; } int is_power_of_two(unsigned int x) { return (my_hweight32(x) == 1); } double vector_length_3(double* v) { return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); } double vector_length_squared_3(double* v) { return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; } double dot_product_3(double* va, double* vb) { return va[0]*vb[0] + va[1]*vb[1] + va[2]*vb[2]; } void matrix_matrix_3(double* ma, double* mb, double* result) { result[0] = ma[0]*mb[0] + ma[1]*mb[3] + ma[2]*mb[6]; result[3] = ma[3]*mb[0] + ma[4]*mb[3] + ma[5]*mb[6]; result[6] = ma[6]*mb[0] + ma[7]*mb[3] + ma[8]*mb[6]; result[1] = ma[0]*mb[1] + ma[1]*mb[4] + ma[2]*mb[7]; result[4] = ma[3]*mb[1] + ma[4]*mb[4] + ma[5]*mb[7]; result[7] = ma[6]*mb[1] + ma[7]*mb[4] + ma[8]*mb[7]; result[2] = ma[0]*mb[2] + ma[1]*mb[5] + ma[2]*mb[8]; result[5] = ma[3]*mb[2] + ma[4]*mb[5] + ma[5]*mb[8]; result[8] = ma[6]*mb[2] + ma[7]*mb[5] + ma[8]*mb[8]; } void matrix_vector_3(double* m, double* v, double* result) { result[0] = m[0]*v[0] + m[1]*v[1] + m[2]*v[2]; result[1] = m[3]*v[0] + m[4]*v[1] + m[5]*v[2]; result[2] = m[6]*v[0] + m[7]*v[1] + m[8]*v[2]; } #define GAUSSIAN_SAMPLE_INVALID -1e300 double gaussian_sample(double mean, double stddev) { // from http://www.taygeta.com/random/gaussian.html // Algorithm by Dr. Everett (Skip) Carter, Jr. static double y2 = GAUSSIAN_SAMPLE_INVALID; double x1, x2, w, y1; // this algorithm generates random samples in pairs; the INVALID // jibba-jabba stores the second value until the next time the // function is called. if (y2 != GAUSSIAN_SAMPLE_INVALID) { y1 = y2; y2 = GAUSSIAN_SAMPLE_INVALID; return mean + y1 * stddev; } do { x1 = uniform_sample(-1, 1); x2 = uniform_sample(-1, 1); w = x1 * x1 + x2 * x2; } while ( w >= 1.0 ); w = sqrt( (-2.0 * log(w)) / w ); y1 = x1 * w; y2 = x2 * w; return mean + y1 * stddev; } double uniform_sample(double low, double high) { if (low == high) return low; return low + (high - low)*((double)rand() / (double)RAND_MAX); } /* computes IN PLACE the inverse of a 3x3 matrix stored as a 9-vector with the first ROW of the matrix in positions 0-2, the second ROW in positions 3-5, and the last ROW in positions 6-8. */ double inverse_3by3(double *matrix) { double det; double a11, a12, a13, a21, a22, a23, a31, a32, a33; double b11, b12, b13, b21, b22, b23, b31, b32, b33; a11 = matrix[0]; a12 = matrix[1]; a13 = matrix[2]; a21 = matrix[3]; a22 = matrix[4]; a23 = matrix[5]; a31 = matrix[6]; a32 = matrix[7]; a33 = matrix[8]; det = a11 * ( a22 * a33 - a23 * a32 ) + a12 * ( a23 * a31 - a21 * a33 ) + a13 * ( a21 * a32 - a22 * a31 ); if (det == 0.0) { return det; } b11 = + ( a22 * a33 - a23 * a32 ) / det; b12 = - ( a12 * a33 - a13 * a32 ) / det; b13 = + ( a12 * a23 - a13 * a22 ) / det; b21 = - ( a21 * a33 - a23 * a31 ) / det; b22 = + ( a11 * a33 - a13 * a31 ) / det; b23 = - ( a11 * a23 - a13 * a21 ) / det; b31 = + ( a21 * a32 - a22 * a31 ) / det; b32 = - ( a11 * a32 - a12 * a31 ) / det; b33 = + ( a11 * a22 - a12 * a21 ) / det; matrix[0] = b11; matrix[1] = b12; matrix[2] = b13; matrix[3] = b21; matrix[4] = b22; matrix[5] = b23; matrix[6] = b31; matrix[7] = b32; matrix[8] = b33; //fprintf(stderr,"matrix determinant = %g\n",det); return (det); } void image_to_xyz(double uu, double vv, double* s, double* transform) { double x, y, z; double length; assert(s); assert(transform); x = uu * transform[0] + vv * transform[1] + transform[2]; y = uu * transform[3] + vv * transform[4] + transform[5]; z = uu * transform[6] + vv * transform[7] + transform[8]; length = sqrt(x*x + y*y + z*z); x /= length; y /= length; z /= length; s[0] = x; s[1] = y; s[2] = z; } /* star = trans * (field; 1) star is 3 x N field is 2 x N and is supplemented by a row of ones. trans is 3 x 3 "star" and "field" are stored in lexicographical order, so the element at (r, c) is stored at array[r + c*H], where H is the "height" of the matrix: 3 for "star", 2 for "field". "trans" is stored in the transposed order (to be compatible with image_to_xyz and the previous version of this function). S = T F S F' = T F F' S F' (F F')^-1 = T */ void fit_transform(double* star, double* field, int N, double* trans) { int r, c, k; double FFt[9]; double det; double* R; double* F; // build F = (field; ones) F = malloc(3 * N * sizeof(double)); for (c=0; c #include "md5.h" #define GET_UINT32(n,b,i) \ { \ (n) = ( (uint32) (b)[(i) ] ) \ | ( (uint32) (b)[(i) + 1] << 8 ) \ | ( (uint32) (b)[(i) + 2] << 16 ) \ | ( (uint32) (b)[(i) + 3] << 24 ); \ } #define PUT_UINT32(n,b,i) \ { \ (b)[(i) ] = (uint8) ( (n) ); \ (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ } void md5_starts( md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; } void md5_process( md5_context *ctx, uint8 data[64] ) { uint32 X[16], A, B, C, D; GET_UINT32( X[0], data, 0 ); GET_UINT32( X[1], data, 4 ); GET_UINT32( X[2], data, 8 ); GET_UINT32( X[3], data, 12 ); GET_UINT32( X[4], data, 16 ); GET_UINT32( X[5], data, 20 ); GET_UINT32( X[6], data, 24 ); GET_UINT32( X[7], data, 28 ); GET_UINT32( X[8], data, 32 ); GET_UINT32( X[9], data, 36 ); GET_UINT32( X[10], data, 40 ); GET_UINT32( X[11], data, 44 ); GET_UINT32( X[12], data, 48 ); GET_UINT32( X[13], data, 52 ); GET_UINT32( X[14], data, 56 ); GET_UINT32( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( D, A, B, C, 14, 9, 0xC33707D6 ); P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( B, C, D, A, 8, 20, 0x455A14ED ); P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( C, D, A, B, 7, 14, 0x676F02D9 ); P( B, C, D, A, 12, 20, 0x8D2A4C8A ); #undef F #define F(x,y,z) (x ^ y ^ z) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( B, C, D, A, 14, 23, 0xFDE5380C ); P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( D, A, B, C, 0, 11, 0xEAA127FA ); P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( B, C, D, A, 6, 23, 0x04881D05 ); P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( B, C, D, A, 2, 23, 0xC4AC5665 ); #undef F #define F(x,y,z) (y ^ (x | ~z)) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( B, C, D, A, 5, 21, 0xFC93A039 ); P( A, B, C, D, 12, 6, 0x655B59C3 ); P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( B, C, D, A, 1, 21, 0x85845DD1 ); P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( C, D, A, B, 6, 15, 0xA3014314 ); P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( A, B, C, D, 4, 6, 0xF7537E82 ); P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( B, C, D, A, 9, 21, 0xEB86D391 ); #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; } void md5_update( md5_context *ctx, uint8 *input, uint32 length ) { uint32 left, fill; if( ! length ) return; left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += length; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < length ) ctx->total[1]++; if( left && length >= fill ) { memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); md5_process( ctx, ctx->buffer ); length -= fill; input += fill; left = 0; } while( length >= 64 ) { md5_process( ctx, input ); length -= 64; input += 64; } if( length ) { memcpy( (void *) (ctx->buffer + left), (void *) input, length ); } } static uint8 md5_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; void md5_finish( md5_context *ctx, uint8 digest[16] ) { uint32 last, padn; uint32 high, low; uint8 msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32( low, msglen, 0 ); PUT_UINT32( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); md5_update( ctx, md5_padding, padn ); md5_update( ctx, msglen, 8 ); PUT_UINT32( ctx->state[0], digest, 0 ); PUT_UINT32( ctx->state[1], digest, 4 ); PUT_UINT32( ctx->state[2], digest, 8 ); PUT_UINT32( ctx->state[3], digest, 12 ); } #include #include /* Use Linear congruential PRNG */ int my_rand_r(int *seedp) { /* Knuth & Lewis */ unsigned x = *seedp * 1664525 + 1013904223; *seedp = x; return (x >> 16) & 0x7fff; } astrometry.net-0.67/util/md5.h000644 000765 000024 00000000635 12651445460 016405 0ustar00dstnstaff000000 000000 #ifndef _MD5_H #define _MD5_H #ifndef uint8 #define uint8 unsigned char #endif #ifndef uint32 #define uint32 unsigned long int #endif typedef struct { uint32 total[2]; uint32 state[4]; uint8 buffer[64]; } md5_context; void md5_starts( md5_context *ctx ); void md5_update( md5_context *ctx, uint8 *input, uint32 length ); void md5_finish( md5_context *ctx, uint8 digest[16] ); #endif /* md5.h */ astrometry.net-0.67/util/merge-columns.py000755 000765 000024 00000001315 12651445460 020675 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from astrometry.util.fits import * import sys if __name__ == '__main__': import optparse parser = optparse.OptionParser(prog='[input files] [output file]') opt,args = parser.parse_args() if len(args) < 2: parser.print_usage() sys.exit(-1) infns = args[:-1] outfn = args[-1] print 'Writing to output file', outfn T = None for fn in infns: print 'Reading input', fn Ti = fits_table(fn) if T is None: T = Ti else: T.add_columns_from(Ti) T.writeto(outfn) astrometry.net-0.67/util/miscutils.py000644 000765 000024 00000050075 12651445460 020140 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from math import pi import numpy as np def estimate_mode(img, lo=None, hi=None, plo=1, phi=70, bins1=30, flo=0.5, fhi=0.8, bins2=30, return_fit=False, raiseOnWarn=False): # Estimate sky level by: compute the histogram within [lo,hi], fit # a parabola to the log-counts, return the argmax of that parabola. # Coarse bin to find the peak (mode) if lo is None: lo = np.percentile(img, plo) if hi is None: hi = np.percentile(img, phi) binedges1 = np.linspace(lo, hi, bins1+1) counts1,e = np.histogram(img.ravel(), bins=binedges1) bincenters1 = binedges1[:-1] + (binedges1[1]-binedges1[0])/2. maxbin = np.argmax(counts1) maxcount = counts1[maxbin] mode = bincenters1[maxbin] # Search for bin containing < {flo,fhi} * maxcount ilo = maxbin while ilo > 0: ilo -= 1 if counts1[ilo] < flo*maxcount: break ihi = maxbin while ihi < bins1-1: ihi += 1 if counts1[ihi] < fhi*maxcount: break lo = bincenters1[ilo] hi = bincenters1[ihi] binedges = np.linspace(lo, hi, bins2) counts,e = np.histogram(img.ravel(), bins=binedges) bincenters = binedges[:-1] + (binedges[1]-binedges[0])/2. b = np.log10(np.maximum(1, counts)) xscale = 0.5 * (hi - lo) x0 = (hi + lo) / 2. x = (bincenters - x0) / xscale A = np.zeros((len(x), 3)) A[:,0] = 1. A[:,1] = x A[:,2] = x**2 res = np.linalg.lstsq(A, b) X = res[0] mx = -X[1] / (2. * X[2]) mx = (mx * xscale) + x0 warn = None if not (mx > lo and mx < hi): if raiseOnWarn: raise ValueError('sky estimate not bracketed by peak: lo %f, sky %f, hi %f' % (lo, mx, hi)) warn = 'WARNING: sky estimate not bracketed by peak: lo %f, sky %f, hi %f' % (lo, mx, hi) if return_fit: bfit = X[0] + X[1] * x + X[2] * x**2 return (x * xscale + x0, b, bfit, mx, warn, binedges1,counts1) return mx def parse_ranges(s): ''' Parse PBS job array-style ranges: NNN,MMM-NNN,PPP *s*: string Returns: [ int, int, ... ] ''' tiles = [] words = s.split() for w in words: for a in w.split(','): if '-' in a: aa = a.split('-') if len(aa) != 2: raise RuntimeError('With an arg containing a dash, expect two parts, in word "%s"' % a) start = int(aa[0]) end = int(aa[1]) for i in range(start, end+1): tiles.append(i) else: tiles.append(int(a)) return tiles def patch_image(img, mask, dxdy = [(-1,0),(1,0),(0,-1),(0,1)], required=None): ''' Patch masked pixels by iteratively averaging non-masked neighboring pixels. WARNING: this modifies BOTH the "img" and "mask" arrays! mask: True for good pixels required: if non-None: True for pixels you want to be patched. dxdy: Pixels to average in, relative to pixels to be patched. Returns True if patching was successful. ''' assert(img.shape == mask.shape) assert(len(img.shape) == 2) h,w = img.shape Nlast = -1 while True: needpatching = np.logical_not(mask) if required is not None: needpatching *= required I = np.flatnonzero(needpatching) if len(I) == 0: break if len(I) == Nlast: return False #print 'Patching', len(I), 'pixels' Nlast = len(I) iy,ix = np.unravel_index(I, img.shape) psum = np.zeros(len(I), img.dtype) pn = np.zeros(len(I), int) for dx,dy in dxdy: ok = True if dx < 0: ok = ok * (ix >= (-dx)) if dx > 0: ok = ok * (ix <= (w-1-dx)) if dy < 0: ok = ok * (iy >= (-dy)) if dy > 0: ok = ok * (iy <= (h-1-dy)) # darn, NaN * False = NaN, not zero. finite = np.isfinite(img [iy[ok]+dy, ix[ok]+dx]) ok[ok] *= finite psum[ok] += (img [iy[ok]+dy, ix[ok]+dx] * mask[iy[ok]+dy, ix[ok]+dx]) pn[ok] += mask[iy[ok]+dy, ix[ok]+dx] # print 'ix', ix # print 'iy', iy # print 'dx,dy', dx,dy # print 'ok', ok # print 'psum', psum # print 'pn', pn img.flat[I] = (psum / np.maximum(pn, 1)).astype(img.dtype) mask.flat[I] = (pn > 0) #print 'Patched', np.sum(pn > 0) return True def clip_wcs(wcs1, wcs2, makeConvex=True, pix1=None, pix2=None): ''' Returns a pixel-space polygon in WCS1 after it is clipped by WCS2. Returns an empty list if the two WCS headers do not intersect. Note that due to weakness in the clip_polygon method, wcs2 must be convex. If makeConvex=True, we find the convex hull and clip with that. If pix1 is not None, pix1=(xx,yy), xx and yy lists of pixel coordinates defining the boundary of the image, in CLOCKWISE order; default is the edges and midpoints. ''' if pix1 is None: w1,h1 = wcs1.get_width(), wcs1.get_height() x1,x2,x3 = 0.5, w1/2., w1+0.5 y1,y2,y3 = 0.5, h1/2., h1+0.5 xx = [x1, x1, x1, x2, x3, x3, x3, x2] yy = [y1, y2, y3, y3, y3, y2, y1, y1] else: xx,yy = pix1 #rr,dd = wcs1.pixelxy2radec(xx, yy) if pix2 is None: w2,h2 = wcs2.get_width(), wcs2.get_height() x1,x2,x3 = 0.5, w2/2., w2+0.5 y1,y2,y3 = 0.5, h2/2., h2+0.5 XX = [x1, x1, x1, x2, x3, x3, x3, x2] YY = [y1, y2, y3, y3, y3, y2, y1, y1] else: XX,YY = pix2 rr,dd = wcs2.pixelxy2radec(XX, YY) ok,XX,YY = wcs1.radec2pixelxy(rr, dd) # XX,YY is the clip polygon in wcs1 pixel coords. # Not necessarily clockwise at this point! #print 'XX,YY', XX, YY if makeConvex: from scipy.spatial import ConvexHull points = np.vstack((XX,YY)).T #print 'points', points.shape hull = ConvexHull(points) #print 'Convex hull:', hull #print hull.vertices # ConvexHull returns the vertices in COUNTER-clockwise order. Reverse. v = np.array(list(reversed(hull.vertices))).astype(int) XX = XX[v] YY = YY[v] #plt.plot(XX, YY, 'm-') #plt.plot(XX[0], YY[0], 'mo') #plt.savefig('clip2.png') else: # Ensure points are listed in CLOCKWISE order. crosses = [] for i in range(len(XX)): j = (i + 1) % len(XX) k = (i + 2) % len(XX) xi,yi = XX[i], YY[i] xj,yj = XX[j], YY[j] xk,yk = XX[k], YY[k] dx1, dy1 = xj - xi, yj - yi dx2, dy2 = xk - xj, yk - yj cross = dx1 * dy2 - dy1 * dx2 #print 'cross', cross crosses.append(cross) crosses = np.array(crosses) #print 'cross products', crosses if np.all(crosses >= 0): # Reverse #print 'Reversing wcs2 points' XX = np.array(list(reversed(XX))) YY = np.array(list(reversed(YY))) clip = clip_polygon(zip(xx, yy), zip(XX, YY)) clip = np.array(clip) if False: import pylab as plt plt.clf() plt.plot(xx, yy, 'b.-') plt.plot(xx[0], yy[0], 'bo') plt.plot(XX, YY, 'r.-') plt.plot(XX[0], YY[0], 'ro') if len(clip) > 0: plt.plot(clip[:,0], clip[:,1], 'm.-', alpha=0.5, lw=2) plt.savefig('clip1.png') return clip def polygon_area(poly): ''' NOTE, unlike many of the other methods in this module, takes: poly = (xx,yy) where xx,yy MUST repeat the starting point at the end of the polygon. ''' xx,yy = poly x,y = np.mean(xx), np.mean(yy) area = 0. for dx0,dy0,dx1,dy1 in zip(xx-x, yy-y, xx[1:]-x, yy[1:]-y): # area: 1/2 cross product area += np.abs(dx0 * dy1 - dx1 * dy0) return 0.5 * area def clip_polygon(poly1, poly2): ''' Returns a new polygon resulting from taking poly1 and clipping it to lie inside poly2. WARNING, the polygons must be listed in CLOCKWISE order. WARNING, the clipping polygon, poly2, must be CONVEX. ''' # from clipper import Clipper, Point, PolyType, ClipType, PolyFillType # ''' # ''' # c = Clipper() # p1 = [Point(x,y) for x,y in poly1] # p2 = [Point(x,y) for x,y in poly2] # c.AddPolygon(p1, PolyType.Subject) # c.AddPolygon(p2, PolyType.Clip) # solution = [] # pft = PolyFillType.EvenOdd # result = c.Execute(ClipType.Intersection, solution, pft, pft) # if len(solution) > 1: # raise RuntimeError('Polygon clipping results in non-simple polygon') # assert(result) # #print 'Result:', result # #print 'Solution:', solution # return [(s.x, s.y) for s in solution[0]] # Sutherland-Hodgman algorithm -- thanks, Wikipedia! N2 = len(poly2) # clip by each edge in turn. for j in range(N2): # target "left_right" value clip1 = poly2[j] clip2 = poly2[(j+1)%N2] LRinside = _left_right(clip1, clip2, poly2[(j+2)%N2]) # are poly vertices inside or outside the clip polygon? isinside = [_left_right(clip1, clip2, p) == LRinside for p in poly1] # the resulting clipped polygon clipped = [] N1 = len(poly1) for i in range(N1): S = poly1[i] E = poly1[(i+1)%N1] Sin = isinside[i] Ein = isinside[(i+1)%N1] if Ein: if not Sin: clipped.append(line_intersection(clip1, clip2, S, E)) clipped.append(E) else: if Sin: clipped.append(line_intersection(clip1, clip2, S, E)) poly1 = clipped return poly1 def polygons_intersect(poly1, poly2): ''' Determines whether the given 2-D polygons intersect. poly1, poly2: np arrays with shape (N,2) ''' # Check whether any points in poly1 are inside poly2, # or vice versa. for (px,py) in poly1: if point_in_poly(px,py, poly2): return (px,py) for (px,py) in poly2: if point_in_poly(px,py, poly1): return (px,py) # Check for intersections between line segments. O(n^2) brutish N1 = len(poly1) N2 = len(poly2) for i in range(N1): for j in range(N2): xy = line_segments_intersect(poly1[i % N1, :], poly1[(i+1) % N1, :], poly2[j % N2, :], poly2[(j+1) % N2, :]) if xy: return xy return False def line_segments_intersect(xy1, xy2, xy3, xy4): ''' Determines whether the two given line segments intersect; (x1,y1) to (x2,y2) and (x3,y3) to (x4,y4) ''' (x1,y1) = xy1 (x2,y2) = xy2 (x3,y3) = xy3 (x4,y4) = xy4 x,y = line_intersection((x1,y1),(x2,y2),(x3,y3),(x4,y4)) if x1 == x2: p1,p2 = y1,y2 p = y else: p1,p2 = x1,x2 p = x if not ((p >= min(p1,p2)) and (p <= max(p1,p2))): return False if x3 == x4: p1,p2 = y3,y4 p = y else: p1,p2 = x3,x4 p = x if not ((p >= min(p1,p2)) and (p <= max(p1,p2))): return False return (x,y) def line_intersection(xy1, xy2, xy3, xy4): ''' Determines the point where the lines described by (x1,y1) to (x2,y2) and (x3,y3) to (x4,y4) intersect. Note that this may be beyond the endpoints of the line segments. Probably raises an exception if the lines are parallel, or does something numerically crazy. ''' (x1,y1) = xy1 (x2,y2) = xy2 (x3,y3) = xy3 (x4,y4) = xy4 # This code started with the equation from Wikipedia, # then I added special-case handling. # bottom = ((x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)) # if bottom == 0: # raise RuntimeError("divide by zero") # t1 = (x1 * y2 - y1 * x2) # t2 = (x3 * y4 - y3 * x4) # px = (t1 * (x3 - x4) - t2 * (x1 - x2)) / bottom # py = (t1 * (y3 - y4) - t2 * (y1 - y2)) / bottom # From http://wiki.processing.org/w/Line-Line_intersection bx = float(x2) - float(x1) by = float(y2) - float(y1) dx = float(x4) - float(x3) dy = float(y4) - float(y3) b_dot_d_perp = bx*dy - by*dx if b_dot_d_perp == 0: return None,None cx = float(x3) - float(x1) cy = float(y3) - float(y1) t = (cx*dy - cy*dx) / b_dot_d_perp return x1 + t*bx, y1 + t*by def _left_right(xy1, xy2, xy3): ''' is (x3,y3) to the 'left' or 'right' of the line from (x1,y1) to (x2,y2) ? ''' (x1,y1) = xy1 (x2,y2) = xy2 (x3,y3) = xy3 dx2,dy2 = x2-x1, y2-y1 dx3,dy3 = x3-x1, y3-y1 return (dx2 * dy3 - dx3 * dy2) > 0 def point_in_poly(x, y, poly): ''' Performs a point-in-polygon test for numpy arrays of *x* and *y* values, and a polygon described as 2-d numpy array (with shape (N,2)) poly: N x 2 array Returns a numpy array of bools. ''' x = np.atleast_1d(x) y = np.atleast_1d(y) inside = np.zeros(x.shape, bool) # This does a winding test -- count how many times a horizontal ray # from (-inf,y) to (x,y) crosses the boundary. for i in range(len(poly)): j = (i-1 + len(poly)) % len(poly) xi,xj = poly[i,0], poly[j,0] yi,yj = poly[i,1], poly[j,1] if yi == yj: continue I = np.logical_and( np.logical_or(np.logical_and(yi <= y, y < yj), np.logical_and(yj <= y, y < yi)), x < (xi + ((xj - xi) * (y - yi) / (yj - yi)))) inside[I] = np.logical_not(inside[I]) return inside def lanczos_filter(order, x, out=None): x = np.atleast_1d(x) nz = np.logical_and(x != 0., np.logical_and(x < order, x > -order)) nz = np.flatnonzero(nz) if out is None: out = np.zeros(x.shape, dtype=float) pinz = pi * x.flat[nz] out.flat[nz] = order * np.sin(pinz) * np.sin(pinz / order) / (pinz**2) out[x == 0] = 1. return out def get_overlapping_region(xlo, xhi, xmin, xmax): ''' Given a range of integer coordinates that you want to, eg, cut out of an image, [xlo, xhi], and bounds for the image [xmin, xmax], returns the range of coordinates that are in-bounds, and the corresponding region within the desired cutout. For example, say you have an image of shape H,W and you want to cut out a region of halfsize "hs" around pixel coordinate x,y, but so that coordinate x,y is centered in the cutout even if x,y is close to the edge. You can do: cutout = np.zeros((hs*2+1, hs*2+1), img.dtype) iny,outy = get_overlapping_region(y-hs, y+hs, 0, H-1) inx,outx = get_overlapping_region(x-hs, x+hs, 0, W-1) cutout[outy,outx] = img[iny,inx] ''' if xlo > xmax or xhi < xmin or xlo > xhi or xmin > xmax: return ([], []) assert(xlo <= xhi) assert(xmin <= xmax) xloclamp = max(xlo, xmin) Xlo = xloclamp - xlo xhiclamp = min(xhi, xmax) Xhi = Xlo + (xhiclamp - xloclamp) #print 'xlo, xloclamp, xhiclamp, xhi', xlo, xloclamp, xhiclamp, xhi assert(xloclamp >= xlo) assert(xloclamp >= xmin) assert(xloclamp <= xmax) assert(xhiclamp <= xhi) assert(xhiclamp >= xmin) assert(xhiclamp <= xmax) #print 'Xlo, Xhi, (xmax-xmin)', Xlo, Xhi, xmax-xmin assert(Xlo >= 0) assert(Xhi >= 0) assert(Xlo <= (xhi-xlo)) assert(Xhi <= (xhi-xlo)) return (slice(xloclamp, xhiclamp+1), slice(Xlo, Xhi+1)) if __name__ == '__main__': import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np from astrometry.util.plotutils import * ps = PlotSequence('miscutils') np.random.seed(42) if True: p2 = np.array([[0,0],[0,4],[4,4],[4,0]]) for i,p1 in enumerate([ np.array([[0,0],[0,2],[2,2],[2,0]]), np.array([[-1,-1],[0,2],[2,2],[2,0]]), np.array([[4,0],[0,4],[-4,0],[0,-4]]), np.array([[-1,2],[2,5],[5,2],[2,-1]]), ] + [None]*10): if p1 is None: p1 = np.random.uniform(high=6., low=-2, size=(4,2)) pc = np.array(clip_polygon(p1, p2)) plt.clf() I = np.array([0,1,2,3,0]) plt.plot(p1[I,0], p1[I,1], 'b-', lw=3, alpha=0.5) plt.plot(p2[I,0], p2[I,1], 'k-') I = np.array(range(len(pc)) + [0]) plt.plot(pc[I,0], pc[I,1], 'r-') plt.axis([-1,5,-1,5]) plt.savefig('clip-%02i.png' % i) import sys sys.exit(0) if True: for i in range(20): if i <= 10: xy1 = np.array([[0,0],[0,4],[4,4],[4,0]]) else: xy1 = np.random.uniform(high=10., size=(4,2)) xy2 = np.random.uniform(high=10., size=(4,2)) plt.clf() I = np.array([0,1,2,3,0]) xy = polygons_intersect(xy1, xy2) if xy: cc = 'r' x,y = xy plt.plot(x,y, 'mo', mec='m', mfc='none', ms=20, mew=3, zorder=30) else: cc = 'k' plt.plot(xy1[I,0], xy1[I,1], '-', color=cc, zorder=20, lw=3) plt.plot(xy2[I,0], xy2[I,1], '-', color=cc, zorder=20, lw=3) ax = plt.axis() plt.axis([ax[0]-0.5, ax[1]+0.5, ax[2]-0.5, ax[3]+0.5]) ps.savefig() if False: X,Y = np.meshgrid(np.linspace(-1,11, 20), np.linspace(-1,11, 23)) X = X.ravel() Y = Y.ravel() for i in range(20): if i == 0: xy = np.array([[0,0],[0,10],[10,10],[10,0]]) else: xy = np.random.uniform(high=10., size=(4,2)) plt.clf() I = np.array([0,1,2,3,0]) plt.plot(xy[I,0], xy[I,1], 'r-', zorder=20, lw=3) inside = point_in_poly(X, Y, xy) plt.plot(X[inside], Y[inside], 'bo') out = np.logical_not(inside) plt.plot(X[out], Y[out], 'ro') ax = plt.axis() plt.axis([ax[0]-0.5, ax[1]+0.5, ax[2]-0.5, ax[3]+0.5]) ps.savefig() if True: # intersection() for i in range(20): if i == 0: x1 = x2 = 0 y1 = 0 y2 = 1 x3 = 1 x4 = -1 y3 = 0 y4 = 1 elif i == 1: x1,y1 = 0,0 x2,y2 = 0,1 x3,y3 = -3,0 x4,y4 = -2,0 elif i == 2: x1,y1 = 1,0 x2,y2 = 0,1 x3,y3 = -3,0 x4,y4 = -2,0 elif i == 3: x1,y1 = 0,1 x2,y2 = 1,0 x3,y3 = 0,-3 x4,y4 = 0,-2 elif i == 4: x1,y1 = 0,0 x2,y2 = 0,1 x3,y3 = 0,2 x4,y4 = 0,3 elif i == 5: x1,y1 = -1,0 x2,y2 = 1, 0 x3,y3 = 0, 2 x4,y4 = 0.5, 1 else: xy = np.random.uniform(high=10., size=(8,)) x1,y1,x2,y2,x3,y3,x4,y4 = xy plt.clf() plt.plot([x1,x2],[y1,y2], 'r-', zorder=20, lw=3) plt.plot([x3,x4],[y3,y4], 'b-', zorder=20, lw=3) x,y = line_intersection((x1,y1),(x2,y2),(x3,y3),(x4,y4)) plt.plot(x, y, 'kx', ms=20, zorder=25) plt.plot([x1,x],[y1,y], 'k--', alpha=0.5, zorder=15) plt.plot([x2,x],[y2,y], 'k--', alpha=0.5, zorder=15) plt.plot([x3,x],[y3,y], 'k--', alpha=0.5, zorder=15) plt.plot([x4,x],[y4,y], 'k--', alpha=0.5, zorder=15) # line_segments_intersect() if line_segments_intersect((x1,y1),(x2,y2),(x3,y3),(x4,y4)): plt.plot(x,y, 'mo', mec='m', mfc='none', ms=20, mew=3, zorder=30) ax = plt.axis() plt.axis([ax[0]-0.5, ax[1]+0.5, ax[2]-0.5, ax[3]+0.5]) ps.savefig() astrometry.net-0.67/util/multiindex.c000644 000765 000024 00000010603 12651445460 020071 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "multiindex.h" #include "index.h" #include "log.h" #include "errors.h" void multiindex_unload_starkd(multiindex_t* mi) { int i; for (i=0; istarkd = NULL; } if (mi->starkd) { startree_close(mi->starkd); mi->starkd = NULL; } } int multiindex_reload_starkd(multiindex_t* mi) { int i; assert(mi->fits); if (mi->starkd) { // It's already loaded return 0; } mi->starkd = startree_open_fits(mi->fits); if (!mi->starkd) { ERROR("Failed to open multi-index star kdtree"); return -1; } for (i=0; istarkd = mi->starkd; } return 0; } void multiindex_unload(multiindex_t* mi) { int i; multiindex_unload_starkd(mi); for (i=0; iinds); } // Get an index index_t* multiindex_get(const multiindex_t* mi, int i) { return pl_get(mi->inds, i); } multiindex_t* multiindex_new(const char* skdtfn) { multiindex_t* mi = calloc(1, sizeof(multiindex_t)); logverb("Reading star KD tree from %s...\n", skdtfn); mi->fits = anqfits_open(skdtfn); if (!mi->fits) { ERROR("Failed to open multiindex file \"%s\"", skdtfn); goto bailout; } mi->inds = pl_new(16); if (multiindex_reload_starkd(mi)) { ERROR("Failed to open multiindex star kd-tree \"%s\"", skdtfn); goto bailout; } return mi; bailout: multiindex_free(mi); return NULL; } int multiindex_add_index(multiindex_t* mi, const char* fn, int flags) { anqfits_t* fits; quadfile_t* quads = NULL; codetree_t* codes = NULL; index_t* ind = NULL; logverb("Reading index file \"%s\"...\n", fn); fits = anqfits_open(fn); if (!fits) { ERROR("Failed to open FITS file \"%s\"", fn); goto bailout; } logverb("Reading quads from file \"%s\"...\n", fn); quads = quadfile_open_fits(fits); if (!quads) { ERROR("Failed to read quads from file \"%s\"", fn); anqfits_close(fits); goto bailout; } logverb("Reading codes from file \"%s\"...\n", fn); codes = codetree_open_fits(fits); if (!codes) { ERROR("Failed to read quads from file \"%s\"", fn); quadfile_close(quads); anqfits_close(fits); goto bailout; } ind = index_build_from(codes, quads, mi->starkd); ind->fits = fits; if (!ind->indexname) ind->indexname = strdup(fn); // shouldn't be needed, but set anyway ind->quadfn = strdup(fn); ind->codefn = strdup(fn); pl_append(mi->inds, ind); if (flags & INDEX_ONLY_LOAD_METADATA) { // don't let it unload the starkd! ind->starkd = NULL; index_unload(ind); ind->starkd = mi->starkd; } return 0; bailout: if (quads) { quadfile_close(quads); } if (codes) { codetree_close(codes); } if (fits) { anqfits_close(fits); } return -1; } multiindex_t* multiindex_open(const char* skdtfn, const sl* indfns, int flags) { multiindex_t* mi = multiindex_new(skdtfn); if (!mi) return NULL; int i; for (i=0; istarkd) { startree_close(mi->starkd); mi->starkd = NULL; } if (mi->inds) { int i; for (i=0; iinds); i++) { index_t* ind = pl_get(mi->inds, i); ind->starkd = NULL; index_free(ind); } pl_free(mi->inds); mi->inds = NULL; } if (mi->fits) { anqfits_close(mi->fits); mi->fits = NULL; } } void multiindex_free(multiindex_t* mi) { multiindex_close(mi); free(mi); } astrometry.net-0.67/util/multiproc.py000644 000765 000024 00000007763 12651445460 020150 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from __future__ import print_function import multiprocessing class FakeAsyncResult(object): def __init__(self, X): self.X = X def wait(self, *a): pass def get(self, *a): return self.X def ready(self): return True def successful(self): return True class funcwrapper(object): def __init__(self, func): self.func = func def __call__(self, *X): #print 'Trying to call', self.func #print 'with args', X try: return self.func(*X) except: import traceback print('Exception while calling your function:') print(' params:', X) print(' exception:') traceback.print_exc() raise class memberfuncwrapper(object): def __init__(self, obj, funcname): self.obj = obj self.funcname = funcname def __call__(self, *X): func = self.obj.getattr(self.funcname) #print 'Trying to call', self.func #print 'with args', X try: return func(self.obj, *X) except: import traceback print('Exception while calling your function:') print(' object:', self.obj) print(' member function:', self.funcname) print(' ', func) print(' params:', X) print(' exception:') traceback.print_exc() raise class multiproc(object): def __init__(self, nthreads=1, init=None, initargs=[], map_chunksize=1, pool=None, wrap_all=False): self.wrap_all = wrap_all if pool is not None: self.pool = pool self.applyfunc = self.pool.apply_async else: if nthreads == 1: self.pool = None # self.map = map self.applyfunc = apply if init is not None: init(*initargs) else: self.pool = multiprocessing.Pool(nthreads, init, initargs) # self.map = self.pool.map self.applyfunc = self.pool.apply_async self.async_results = [] self.map_chunksize = map_chunksize def map(self, f, args, chunksize=None, wrap=False): cs = chunksize if cs is None: cs = self.map_chunksize if self.pool: if wrap or self.wrap_all: f = funcwrapper(f) #print 'pool.map: f', f #print 'args', args #print 'cs', cs return self.pool.map(f, args, cs) return map(f, args) def map_async(self, func, iterable, wrap=False): if self.pool is None: return FakeAsyncResult(map(func, iterable)) if wrap or self.wrap_all: return self.pool.map_async(funcwrapper(func), iterable) return self.pool.map_async(func, iterable) def imap_unordered(self, func, iterable, chunksize=None, wrap=False): cs = chunksize if cs is None: cs = self.map_chunksize if self.pool is None: import itertools return itertools.imap(func, iterable) if wrap or self.wrap_all: func = funcwrapper(func) return self.pool.imap_unordered(func, iterable, chunksize=cs) def apply(self, f, args, wrap=False, kwargs={}): if self.pool is None: return FakeAsyncResult(f(*args, **kwargs)) if wrap: f = funcwrapper(f) res = self.applyfunc(f, args, kwargs) self.async_results.append(res) return res def waitforall(self): print('Waiting for async results to finish...') for r in self.async_results: print(' waiting for', r) r.wait() print('all done') self.async_results = [] def close(self): if self.pool is not None: self.pool.close() self.pool = None astrometry.net-0.67/util/os-features-test.c000644 000765 000024 00000004310 12651445460 021117 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #ifdef TEST_CANONICALIZE_FILE_NAME int main() { char* path = canonicalize_file_name("/"); free(path); //printf("#define NEED_CANONICALIZE_FILE_NAME 0\n"); return 0; } #endif #ifdef TEST_QSORT_R static int cmp(void* u, const void* a, const void* b) { return 0; } int main() { int array; int baton; qsort_r(&array, 1, sizeof(int), &baton, cmp); //printf("#define NEED_QSORT_R 0\n"); return 0; } #endif #ifdef TEST_DECLARE_QSORT_R // Test whether just declaring qsort_r as we do causes a compile failure. void qsort_r(void *base, size_t nmemb, size_t sz, void *userdata, int (*compar)(void *, const void *, const void *)); int main() { //printf("#define NEED_DECLARE_QSORT_R 1\n"); return 0; } #endif #ifdef TEST_SWAP_QSORT_R // Use the result of TEST_DECLARE_QSORT_R and TEST_NEED_QSORT_R, or else // this test will fail with a warning about undefined qsort_r // Include .c rather than .h because we test with: // gcc -o (exec) os-features-test.c // and if NEED_QSORT_R, os-features.c includes qsort_reentrant.c #include "os-features-config.h.tmp" #define DONT_INCLUDE_OS_FEATURES_CONFIG_H 1 #include "os-features.c" #undef DONT_INCLUDE_OS_FEATURES_CONFIG_H // Test whether qsort_r works unswapped. (ie, qsort_r matches the definition of // QSORT_R defined in the os-features.h documentation.) static int sortfunc(void* thunk, const void* v1, const void* v2) { const int* i1 = v1; const int* i2 = v2; if (*i1 < *i2) return -1; if (*i1 > *i2) return 1; return 0; } int main() { int array[] = { 4, 17, 88, 34, 12, 12, 17 }; int N = sizeof(array)/sizeof(int); int mythunk = 42; qsort_r(array, N, sizeof(int), &mythunk, sortfunc); //printf("#define NEED_SWAP_QSORT_R 0\n"); return 0; } #endif #if defined(TEST_NETPBM) || defined(TEST_NETPBM_MAKE) #include int main(int argc, char** args) { struct pam img; pm_init(args[0], 0); //printf("#define HAVE_NETPBM 1\n"); img.size = 42; printf("the answer is %i\n", img.size); return 0; } #endif astrometry.net-0.67/util/os-features.c000644 000765 000024 00000001411 12651445460 020141 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #if defined(_POSIX_SYNCHRONIZED_IO) && (_POSIX_SYNCHRONIZED_IO > 0) #define NEED_FDATASYNC 0 #else #define NEED_FDATASYNC 1 #endif #if NEED_CANONICALIZE_FILE_NAME char* canonicalize_file_name(const char* fn) { char* path = malloc(1024); char* canon; canon = realpath(fn, path); if (!canon) { free(path); return NULL; } path = realloc(path, strlen(path) + 1); return path; } #endif #if NEED_FDATASYNC int fdatasync(int fd) { return fsync(fd); } #endif #if NEED_QSORT_R #include "qsort_reentrant.c" #endif astrometry.net-0.67/util/pad-file.c000644 000765 000024 00000003011 12651445460 017363 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "ioutils.h" #include "errors.h" const char* OPTIONS = "hv:c:"; void printHelp(char* progname) { fprintf(stderr, "\nUsage: %s [ ...]\n" " The file will be padded in-place.\n" "\n" " By default, the file is padded with zeros, but:\n" " [-v ]\n" " [-c ]\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* progname = args[0]; char* infn; size_t padtolen; char padchar = '\0'; int nargs = 0; int i; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 'v': padchar = atoi(optarg); printf("Padding with value %i, character \"%c\"\n", (int)padchar, padchar); break; case 'c': padchar = optarg[0]; printf("Padding with character \"%c\"\n", padchar); break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { nargs = argc - optind; args += optind; } if (nargs < 2) { printHelp(progname); exit(-1); } padtolen = atol(args[0]); for (i=1; i #include #include #include #include #include #include "permutedsort.h" #include "os-features.h" // for qsort_r int* permutation_init(int* perm, int N) { int i; if (!N) return perm; if (!perm) perm = malloc(sizeof(int) * N); for (i=0; idata_array; val1 = darray + i1 * ps->data_array_stride; val2 = darray + i2 * ps->data_array_stride; return ps->compare(val1, val2); } int* permuted_sort(const void* realarray, int array_stride, int (*compare)(const void*, const void*), int* perm, int N) { permsort_t ps; if (!perm) perm = permutation_init(perm, N); ps.compare = compare; ps.data_array = realarray; ps.data_array_stride = array_stride; QSORT_R(perm, N, sizeof(int), &ps, compare_permuted); return perm; } #define COMPARE(d1, d2, op1, op2) \ if (d1 op1 d2) return -1; \ if (d1 op2 d2) return 1; \ /* explicitly test for equality, to catch NaNs*/ \ if (d1 == d2) return 0; \ if (isnan(d1) && isnan(d2)) return 0; \ if (isnan(d1)) return 1; \ if (isnan(d2)) return -1; \ assert(0); return 0; //printf("d1=%g, d2=%g\n", d1, d2); #define INTCOMPARE(i1, i2, op1, op2) \ if (i1 op1 i2) return -1; \ if (i1 op2 i2) return 1; \ return 0; int compare_doubles_asc(const void* v1, const void* v2) { const double d1 = *(double*)v1; const double d2 = *(double*)v2; COMPARE(d1, d2, <, >); } int compare_doubles_desc(const void* v1, const void* v2) { // (note that v1,v2 are flipped) const double d1 = *(double*)v1; const double d2 = *(double*)v2; COMPARE(d1, d2, >, <); } int compare_floats_asc(const void* v1, const void* v2) { float f1 = *(float*)v1; float f2 = *(float*)v2; COMPARE(f1, f2, <, >); } int compare_floats_desc(const void* v1, const void* v2) { float f1 = *(float*)v1; float f2 = *(float*)v2; COMPARE(f1, f2, >, <); } int compare_int64_asc(const void* v1, const void* v2) { int64_t i1 = *(int64_t*)v1; int64_t i2 = *(int64_t*)v2; INTCOMPARE(i1, i2, <, >); } int compare_int64_desc(const void* v1, const void* v2) { int64_t i1 = *(int64_t*)v1; int64_t i2 = *(int64_t*)v2; INTCOMPARE(i1, i2, >, <); } // Versions for use with QSORT_R int QSORT_COMPARISON_FUNCTION(compare_floats_asc_r, void* thunk, const void* v1, const void* v2) { return compare_floats_asc(v1, v2); } #undef COMPARE #undef INTCOMPARE int compare_ints_asc(const void* v1, const void* v2) { const int d1 = *(int*)v1; const int d2 = *(int*)v2; if (d1 < d2) return -1; if (d1 > d2) return 1; return 0; } int compare_ints_desc(const void* v1, const void* v2) { return compare_ints_asc(v2, v1); } int compare_uchars_asc(const void* v1, const void* v2) { const unsigned char d1 = *(unsigned char*)v1; const unsigned char d2 = *(unsigned char*)v2; if (d1 < d2) return -1; if (d1 > d2) return 1; return 0; } int compare_uchars_desc(const void* v1, const void* v2) { return compare_ints_desc(v2, v1); } astrometry.net-0.67/util/plotshift.py000755 000765 000024 00000012041 12651445460 020132 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from optparse import OptionParser import matplotlib matplotlib.use('Agg') from pylab import * from numpy import * from astrometry.libkd import spherematch def plotshift(ixy, rxy, dcell=50, ncells=18, outfn=None, W=None, H=None, hist=False, nhistbins=21): #histbinsize=None): # correspondences we could have hit... radius = dcell * sqrt(2.) #print 'ixy', ixy.shape #print 'rxy', rxy.shape assert((len(rxy) == 0) or (rxy.shape[1] == 2)) assert((len(ixy) == 0) or (ixy.shape[1] == 2)) ix = ixy[:,0] iy = ixy[:,1] if W is None: W = max(ix) if H is None: H = max(iy) if len(rxy): keep = (rxy[:,0] > -dcell) * (rxy[:,0] < W+dcell) * (rxy[:,1] > -dcell) * (rxy[:,1] < H+dcell) rxy = rxy[keep] #print 'Cut to %i ref sources in range' % len(rxy) cellsize = sqrt(W * H / ncells) nw = int(round(W / cellsize)) nh = int(round(H / cellsize)) #print 'Grid cell size', cellsize #print 'N cells', nw, 'x', nh edgesx = linspace(0, W, nw+1) edgesy = linspace(0, H, nh+1) #print 'Edges:' #print ' x:', edgesx #print ' y:', edgesy if len(rxy) == 0: binx = array([]) biny = array([]) else: binx = digitize(rxy[:,0], edgesx) biny = digitize(rxy[:,1], edgesy) binx = clip(binx - 1, 0, nw-1) biny = clip(biny - 1, 0, nh-1) bin = biny * nw + binx clf() for i in range(nh): for j in range(nw): thisbin = i * nw + j R = (bin == thisbin) #print 'cell %i, %i' % (j, i) #print '%i ref sources' % sum(R) matchdx = [] if sum(R) > 0: (inds,dists) = spherematch.match(rxy[R,:], ixy, radius) #print 'Found %i matches within %g pixels' % (len(dists), radius) ri = inds[:,0] # un-cut ref inds... ri = (flatnonzero(R))[ri] ii = inds[:,1] matchx = rxy[ri,0] matchy = rxy[ri,1] matchdx = ix[ii] - matchx matchdy = iy[ii] - matchy #print 'All matches:' #for dx,dy in zip(matchdx,matchdy): # print ' %.1f, %.1f' % (dx,dy) ok = (matchdx >= -dcell) * (matchdx <= dcell) * (matchdy >= -dcell) * (matchdy <= dcell) matchdx = matchdx[ok] matchdy = matchdy[ok] #print 'Cut to %i within %g x %g square' % (sum(ok), dcell*2, dcell*2) #print 'Cut matches:' #for dx,dy in zip(matchdx,matchdy): # print ' %.1f, %.1f' % (dx,dy) # Subplot places plots left-to-right, TOP-to-BOTTOM. subplot(nh, nw, 1 + ((nh - i - 1)*nw + j)) if len(matchdx) > 0: #plot(matchdx, matchdy, 'ro', mec='r', mfc='r', ms=5, alpha=0.2) #plot(matchdx, matchdy, 'ro', mec='r', mfc='none', ms=5, alpha=0.2) if hist: #if histbinsize is None: # histbinsize = dcell / 10. edges = linspace(-dcell, dcell, nhistbins+1) (H,xe,ye) = histogram2d(matchdx, matchdy, bins=(edges,edges)) imshow(H.T, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', origin='lower', interpolation='nearest') text(dcell, dcell, '%i' % H.max(), color='y', horizontalalignment='right', verticalalignment='top') else: plot(matchdx, matchdy, 'r.', alpha=0.3) if hist: axhline(0, color='b', alpha=0.8) axvline(0, color='b', alpha=0.8) else: axhline(0, color='k', alpha=0.5) axvline(0, color='k', alpha=0.5) if i == 0 and j == 0: xticks([-dcell,0,dcell]) yticks([-dcell,0,dcell]) else: xticks([],[]) yticks([],[]) axis('scaled') axis([-dcell, dcell, -dcell, dcell]) if outfn is not None: #print 'Saving', outfn savefig(outfn) if __name__ == '__main__': from astrometry.util.fits import fits_table parser = OptionParser('usage: %prog [options] ') parser.add_option('-X', dest='xcol', help='Name of X column in image table') parser.add_option('-Y', dest='ycol', help='Name of Y column in image table') parser.add_option('-N', dest='nimage', type='int', help='Cut to the first N image sources') parser.add_option('-x', dest='rxcol', help='Name of X column in reference table') parser.add_option('-y', dest='rycol', help='Name of Y column in reference table') parser.add_option('-n', dest='nref', type='int', help='Cut to the first N reference sources') parser.add_option('-c', dest='cells', type='int', help='Approx. number of pieces to cut image into (default:18)') parser.add_option('-s', dest='cellsize', type='int', help='Search radius, in pixels (default 50)') parser.set_defaults(xcol='X', ycol='Y', nimage=0, cells=0, cellsize=0, rxcol='X', rycol='Y', nref=0) opt,args = parser.parse_args() if len(args) != 3: parser.print_help() sys.exit(-1) imxy = fits_table(args[0]) refxy = fits_table(args[1]) outfn = args[2] kwargs = {} if opt.cells: kwargs['ncells'] = opt.cells if opt.cellsize: kwargs['dcell'] = opt.cellsize ix = imxy.getcolumn(opt.xcol) iy = imxy.getcolumn(opt.ycol) ixy = vstack((ix,iy)).T if opt.nimage: ixy = ixy[:opt.nimage,:] rx = refxy.getcolumn(opt.rxcol) ry = refxy.getcolumn(opt.rycol) rxy = vstack((rx,ry)).T if opt.nref: rxy = rxy[:opt.nref,:] plotshift(ixy, rxy, outfn=outfn, **kwargs) astrometry.net-0.67/util/plotSipDistortion.py000755 000765 000024 00000006574 12651445460 021645 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE if __name__ == '__main__': import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np import sys from math import sqrt, floor, ceil from astrometry.util.util import Sip from optparse import OptionParser def plotDistortion(sip, W, H, ncells, exaggerate=1., doclf=True): ''' Produces a plot showing the SIP distortion that was found, by drawing a grid and distorting it. Allows exaggeration of the distortion for ease of visualization. sip -- an astrometry.util.Sip object (duck-type: has "(dx,dy) = sip.get_distortion(x,y)") W, H -- the image size ncells -- the approximate number of grid cells to split the image into. exaggerate -- the factor by which to exaggerate the distortion. ''' ncells = float(ncells) cellsize = sqrt(W * H / ncells) nw = int(floor(W / cellsize)) nh = int(floor(H / cellsize)) #print 'Grid cell size', cellsize #print 'N cells', nw, 'x', nh cx = np.arange(nw+1) * cellsize + ((W - (nw*cellsize))/2.) cy = np.arange(nh+1) * cellsize + ((H - (nh*cellsize))/2.) # pixel step size for grid lines step = 50 nx = int(np.ceil(W / float(step))) ny = int(np.ceil(H / float(step))) #xx = np.arange(-step, W+2*step, step) #yy = np.arange(-step, H+2*step, step) xx = np.linspace(1, W, nx) yy = np.linspace(1, H, ny) if doclf: plt.clf() for y in cy: dx,dy = [],[] for x in xx: dxi,dyi = sip.get_distortion(x, y) dx.append(dxi) dy.append(dyi) plt.plot(xx, y*np.ones_like(xx), 'k-', zorder=10) dx = np.array(dx) dy = np.array(dy) if exaggerate != 1: dx += (exaggerate * (dx - xx)) dy += (exaggerate * (dy - y)) plt.plot(dx, dy, 'r-', zorder=20) for x in cx: dx,dy = [],[] for y in yy: dxi,dyi = sip.get_distortion(x, y) dx.append(dxi) dy.append(dyi) plt.plot(x*np.ones_like(yy), yy, 'k-', zorder=10) dx = np.array(dx) dy = np.array(dy) if exaggerate != 1: dx += (exaggerate * (dx - x)) dy += (exaggerate * (dy - yy)) plt.plot(dx, dy, 'r-', zorder=20, clip_on=False) plt.axis('scaled') plt.axis([0, W, 0, H]) def plotDistortionFile(sipfn, ext, ncells, **kwargs): wcs = Sip(sipfn, ext) if wcs is None: raise RuntimeError('Failed to open WCS file %s' % sipfn) plotDistortion(wcs, wcs.get_width(), wcs.get_height(), ncells, **kwargs) if __name__ == '__main__': parser = OptionParser('usage: %prog [options] ') parser.add_option('-e', dest='ext', type='int', help='FITS extension to read WCS from (default 0)') parser.add_option('-x', dest='exaggerate', type='float', help='Exaggeration factor') parser.add_option('-c', dest='cells', type='int', help='Approx. number of pieces to cut image into (default:18)') parser.set_defaults(ext=0, cells=18, exaggerate=1.) opt,args = parser.parse_args() if len(args) != 2: parser.print_help() sys.exit(-1) wcsfn = args[0] outfn = args[1] plotDistortionFile(wcsfn, opt.ext, opt.cells, exaggerate=opt.exaggerate) plt.savefig(outfn) astrometry.net-0.67/util/plotutils.py000644 000765 000024 00000037471 12651445460 020170 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from __future__ import print_function import matplotlib.cm import matplotlib.colors import matplotlib.patches import numpy as np import pylab as plt from matplotlib.ticker import FixedFormatter import functools class NanColormap(matplotlib.colors.Colormap): ''' A Colormap that wraps another colormap, but replaces non-finite values with a fixed color. ''' def __init__(self, cmap, nancolor): self.cmap = cmap self.nanrgba = matplotlib.colors.colorConverter.to_rgba(nancolor) def __call__(self, data, **kwargs): rgba = self.cmap(data, **kwargs) # 'data' is a MaskedArray, apparently... if np.all(data.mask == False): return rgba iy,ix = np.nonzero(data.mask) #print 'NanColormap: replacing', len(iy), 'pixels with', self.nanrgba # nanrgba are floats in [0,1]; convert to uint8 in [0,255]. rgba[iy,ix, :] = np.clip(255. * np.array(self.nanrgba), 0, 255).astype(np.uint8) return rgba def __getattr__(self, name): ''' delegate to underlying colormap. ''' return getattr(self.cmap, name) def _imshow_better_defaults(imshowfunc, X, interpolation='nearest', origin='lower', cmap='gray', ticks=True, **kwargs): ''' An "imshow" wrapper that uses more sensible defaults. ''' X = imshowfunc(X, interpolation=interpolation, origin=origin, cmap=cmap, **kwargs) if not ticks: plt.xticks([]); plt.yticks([]) return X def _imshow_nan(imshowfunc, X, nancolor='0.5', cmap=None, vmin=None, vmax=None, **kwargs): ''' An "imshow" work-alike that replaces non-finite values by a fixed color. ''' if np.all(np.isfinite(X)): return imshowfunc(X, cmap=cmap, vmin=vmin, vmax=vmax, **kwargs) # X has non-finite values. Time to get tricky. cmap = matplotlib.cm.get_cmap(cmap) cmap = NanColormap(cmap, nancolor) if vmin is None or vmax is None: I = np.flatnonzero(np.isfinite(X)) if vmin is None: try: vmin = X.flat[I].min() except ValueError: vmin = 0. if vmax is None: try: vmax = X.flat[I].max() except ValueError: vmax = 0. return imshowfunc(X, cmap=cmap, vmin=vmin, vmax=vmax, **kwargs) ''' A plt.imshow() work-alike, except with defaults: interpolation='nearest', origin='lower'. ''' imshow_better_defaults = functools.partial(_imshow_better_defaults, plt.imshow) ''' A plt.imshow() work-alike, except handles non-finite values. Accepts an additional kwarg: nancolor='0.5' ''' imshow_nan = functools.partial(_imshow_nan, plt.imshow) ''' My version of plt.imshow that uses imshow_better_defaults and imshow_nan. ''' dimshow = functools.partial(_imshow_better_defaults, imshow_nan) def replace_matplotlib_functions(): ''' Replaces plt.imshow with a function that handles non-finite values and has the defaults interpolation='nearest', origin='lower'. ''' plt.imshow = dimshow class PlotSequence(object): def __init__(self, basefn, format='%02i', suffix='png', suffixes=None): self.ploti = 0 self.basefn = basefn self.format = format if suffixes is None: self.suffixes = [suffix] else: self.suffixes = suffixes self.pattern = self.basefn + '-%s.%s' self.printfn = True def skip(self, n=1): self.ploti += n def skipto(self, n): self.ploti = n def getnextlist(self): #lst = ['%s-%s.%s' % (self.basefn, self.format % self.ploti, suff) lst = [self.pattern % (self.format % self.ploti, suff) for suff in self.suffixes] self.ploti += 1 return lst def getnext(self): lst = self.getnextlist() if len(lst) == 1: return lst[0] return lst def savefig(self, **kwargs): import pylab as plt for fn in self.getnextlist(): plt.savefig(fn, **kwargs) if self.printfn: print('saved', fn) def loghist(x, y, nbins=100, hot=True, doclf=True, docolorbar=True, lo=0.3, imshowargs={}, clampxlo=False, clampxlo_val=None, clampxlo_to=None, clampxhi=False, clampxhi_val=None, clampxhi_to=None, clampylo=False, clampylo_val=None, clampylo_to=None, clampyhi=False, clampyhi_val=None, clampyhi_to=None, clamp=None, clamp_to=None, **kwargs): #np.seterr(all='warn') if doclf: plt.clf() myargs = kwargs.copy() if not 'bins' in myargs: myargs['bins'] = nbins rng = kwargs.get('range', None) x = np.array(x) y = np.array(y) if not (np.all(np.isfinite(x)) and np.all(np.isfinite(y))): K = np.flatnonzero(np.isfinite(x) * np.isfinite(y)) print('loghist: cutting to', len(K), 'of', len(x), 'finite values') x = x[K] y = y[K] if clamp is True: clamp = rng if clamp is not None: ((clampxlo_val, clampxhi_val),(clampylo_val, clampyhi_val)) = clamp if clamp_to is not None: ((clampxlo_to, clampxhi_to),(clampylo_to, clampyhi_to)) = clamp_to if clampxlo: if clampxlo_val is None: if rng is None: raise RuntimeError('clampxlo, but no clampxlo_val or range') clampxlo_val = rng[0][0] if clampxlo_val is not None: if clampxlo_to is None: clampxlo_to = clampxlo_val x[x < clampxlo_val] = clampxlo_to if clampxhi: if clampxhi_val is None: if rng is None: raise RuntimeError('clampxhi, but no clampxhi_val or range') clampxhi_val = rng[0][1] if clampxhi_val is not None: if clampxhi_to is None: clampxhi_to = clampxhi_val x[x > clampxhi_val] = clampxhi_to if clampylo: if clampylo_val is None: if rng is None: raise RuntimeError('clampylo, but no clampylo_val or range') clampylo_val = rng[1][0] if clampylo_val is not None: if clampylo_to is None: clampylo_to = clampylo_val y[y < clampylo_val] = clampylo_to if clampyhi: if clampyhi_val is None: if rng is None: raise RuntimeError('clampyhi, but no clampyhi_val or range') clampyhi_val = rng[1][1] if clampyhi_val is not None: if clampyhi_to is None: clampyhi_to = clampyhi_val y[y > clampyhi_val] = clampyhi_to (H,xe,ye) = np.histogram2d(x, y, **myargs) L = np.log10(np.maximum(lo, H.T)) myargs = dict(extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower') myargs.update(imshowargs) plt.imshow(L, **myargs) if hot: plt.hot() if docolorbar: r = [np.log10(lo)] + range(int(np.ceil(L.max()))) # print 'loghist: L max', L.max(), 'r', r plt.colorbar(ticks=r, format=FixedFormatter( ['0'] + ['%i'%(10**ri) for ri in r[1:]])) #set_fp_err() return H, xe, ye def plothist(x, y, nbins=100, log=False, doclf=True, docolorbar=True, dohot=True, plo=None, phi=None, scale=None, imshowargs={}, **hist2dargs): if log: return loghist(x, y, nbins=nbins, doclf=doclf, docolorbar=docolorbar, dohot=dohot, imshowargs=imshowargs) #, **kwargs) if doclf: plt.clf() (H,xe,ye) = np.histogram2d(x, y, nbins, **hist2dargs) if scale is not None: H *= scale myargs = dict(extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto', interpolation='nearest', origin='lower') vmin = None if plo is not None: vmin = np.percentile(H.ravel(), plo) myargs.update(vmin=vmin) if phi is not None: vmin = imshowargs.get('vmin', vmin) vmax = np.percentile(H.ravel(), phi) if vmax != vmin: myargs.update(vmax=vmax) myargs.update(imshowargs) plt.imshow(H.T, **myargs) if dohot: plt.hot() if docolorbar: plt.colorbar() return H, xe, ye def setRadecAxes(ramin, ramax, decmin, decmax): rl,rh = ramin,ramax dl,dh = decmin,decmax rascale = np.cos(np.deg2rad((dl+dh)/2.)) ax = [rh,rl, dl,dh] plt.axis(ax) plt.gca().set_aspect(1./rascale, adjustable='box', anchor='C') plt.xlabel('RA (deg)') plt.ylabel('Dec (deg)') return ax import matplotlib.colors as mc class ArcsinhNormalize(mc.Normalize): def __init__(self, mean=None, std=None, **kwargs): self.mean = mean self.std = std mc.Normalize.__init__(self, **kwargs) def _map(self, X, out=None): Y = (X - self.mean) / self.std args = (Y,) if out is not None: args = args + (out,) return np.arcsinh(*args) def __call__(self, value, clip=None): # copied from Normalize since it's not easy to subclass if clip is None: clip = self.clip result, is_scalar = self.process_value(value) self.autoscale_None(result) vmin, vmax = self.vmin, self.vmax if vmin > vmax: raise ValueError("minvalue must be less than or equal to maxvalue") elif vmin == vmax: result.fill(0) # Or should it be all masked? Or 0.5? else: vmin = float(vmin) vmax = float(vmax) if clip: mask = ma.getmask(result) result = ma.array(np.clip(result.filled(vmax), vmin, vmax), mask=mask) # ma division is very slow; we can take a shortcut resdat = result.data self._map(resdat, resdat) vmin = self._map(vmin) vmax = self._map(vmax) resdat -= vmin resdat /= (vmax - vmin) result = np.ma.array(resdat, mask=result.mask, copy=False) if is_scalar: result = result[0] return result from matplotlib.colors import LinearSegmentedColormap # a colormap that goes from white to black: the opposite of matplotlib.gray() antigray = LinearSegmentedColormap('antigray', {'red': ((0., 1, 1), (1., 0, 0)), 'green': ((0., 1, 1), (1., 0, 0)), 'blue': ((0., 1, 1), (1., 0, 0))}) bluegrayred = LinearSegmentedColormap('bluegrayred', {'red': ((0., -1, 0), (1., 1, -1)), 'green': ((0., -1, 0), (0.5,0.5, 0.5), (1., 0, -1)), 'blue': ((0., -1, 1), (1., 0, -1))}) # x, y0, y1 _redgreen_data = {'red': ((0., -100, 1), #(0.5, 0, 0), #(0.5, 0.1, 0), (0.49, 0.1, 0), (0.491, 0, 0), (0.51, 0, 0), (0.511, 0, 0.1), (1., 0, -100)), 'green': ((0., -100, 0), #(0.5, 0, 0), #(0.5, 0, 0.1), (0.49, 0.1, 0), (0.491, 0, 0), (0.51, 0, 0), (0.511, 0, 0.1), (1., 1, -100)), 'blue': ((0., -100, 0), (1., 0, -100))} redgreen = LinearSegmentedColormap('redgreen', _redgreen_data) def hist_ints(x, step=1, **kwargs): ''' Creates a histogram of integers. The number of bins is set to the range of the data (+1). That is, each integer gets its own bin. ''' kwargs['bins'] = x.max()/step - x.min()/step + 1 kwargs['range'] = ( (x.min()/int(step))*step - 0.5, ((x.max()/int(step))*step + 0.5) ) return plt.hist(x, **kwargs) def hist2d_with_outliers(x, y, xbins, ybins, nout): ''' Creates a 2D histogram from the given data, and returns a list of the indices in the data of points that lie in low-occupancy cells (where the histogram counts is < "nout"). The "xbins" and "ybins" arguments are passed to numpy.histogram2d. You probably want to show the histogram with: (H, outliers, xe, ye) = hist2d_with_outliers(x, y, 10, 10, 10) imshow(H, extent=(min(xe), max(xe), min(ye), max(ye)), aspect='auto') plot(x[outliers], y[outliers], 'r.') Returns: (H, outliers, xe, ye) H: 2D histogram image outliers: array of integer indices of the outliers xe: x edges chosen by histgram2d ye: y edges chosen by histgram2d ''' # returns (density image, indices of outliers) (H,xe,ye) = plt.histogram2d(x, y, (xbins,ybins)) Out = np.array([]).astype(int) for i in range(len(xe)-1): for j in range(len(ye)-1): if H[i,j] > nout: continue if H[i,j] == 0: continue H[i,j] = 0 Out = np.append(Out, np.flatnonzero((x >= xe[i]) * (x < xe[i+1]) * (y >= ye[j]) * (y < ye[j+1]))) return (H.T, Out, xe, ye) # You probably want to set the keyword radius=R def circle(xy=None, x=None, y=None, **kwargs): if xy is None: if x is None or y is None: raise 'circle: need x and y' xy = np.array([x,y]) c = matplotlib.patches.Circle(xy=xy, **kwargs) a=plt.gca() c.set_clip_box(a.bbox) a.add_artist(c) return c def ellipse(xy=None, x=None, y=None, **kwargs): if xy is None: if x is None or y is None: raise 'ellipse: need x and y' xy = np.array([x,y]) c = matplotlib.patches.Ellipse(xy=xy, **kwargs) a=plt.gca() c.set_clip_box(a.bbox) a.add_artist(c) return c # return (pixel width, pixel height) of the axes area. def get_axes_pixel_size(): dpi = plt.gcf().get_dpi() figsize = plt.gcf().get_size_inches() axpos = plt.gca().get_position() pixw = figsize[0] * dpi * axpos.width pixh = figsize[1] * dpi * axpos.height return (pixw, pixh) # test: if False: figure(dpi=100) (w,h) = get_axes_pixel_size() # not clear why this is required... w += 1 h += 1 img = zeros((h,w)) img[:,::2] = 1. img[::2,:] = 1. imshow(img, extent=(0,w,0,h), aspect='auto', cmap=antigray) xlim(0,w) ylim(0,h) savefig('imtest.png') sys.exit(0) # returns (x data units per pixel, y data units per pixel) # given the current plot range, figure size, and axes position. def get_pixel_scales(): a = plt.axis() (pixw, pixh) = get_axes_pixel_size() return ((a[1]-a[0])/float(pixw), (a[3]-a[2])/float(pixh)) def set_image_color_percentiles(image, plo, phi): # hackery... I = image.copy().ravel() I.sort() N = len(I) mn = I[max(0, int(round(plo * N / 100.)))] mx = I[min(N-1, int(round(phi * N / 100.)))] plt.gci().set_clim(mn, mx) return (mn,mx) if __name__ == '__main__': X = np.arange(25.).reshape((5,5)) X[2:4,3:4] = np.nan print(X) plt.clf() imshow_nan(X, interpolation='nearest') plt.savefig('1.png') dimshow(X) plt.savefig('2.png') replace_matplotlib_functions() plt.clf() plt.imshow(X, interpolation='nearest') plt.savefig('3.png') astrometry.net-0.67/util/pnmutils.py000644 000765 000024 00000002067 12651445460 017775 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from numpy import * # Writes a numpy array as PGM to the given file handle. The numpy # array will be converted to integer values. If maxval=255, 8-bit # ints; if maxval>255, 16-bit ints. def write_pgm(x, f, maxval=255): (h,w) = x.shape if maxval >= 65536: raise 'write_pgm: maxval must be < 65536' f.write('P5 %i %i %i\n' % (w, h, maxval)) if maxval <= 255: f.write(getbuffer(x.astype(uint8))) else: f.write(getbuffer(x.astype(uint16))) # Writes a numpy array as PPM to the given file handle. The numpy # array will be converted to integer values. If maxval=255, 8-bit # ints; if maxval>255, 16-bit ints. def write_ppm(x, f, maxval=255): (h,w,d) = x.shape if maxval >= 65536: raise 'write_pgm: maxval must be < 65536' if d != 3: raise Exception('array must have shape H x W x 3; got ' + x.shape) f.write('P6 %i %i %i\n' % (w, h, maxval)) if maxval <= 255: f.write(getbuffer(x.astype(uint8))) else: f.write(getbuffer(x.astype(uint16))) astrometry.net-0.67/util/qidxfile.c000644 000765 000024 00000012544 12651445460 017522 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "qfits_header.h" #include "fitsioutils.h" #include "starutil.h" #include "ioutils.h" #include "qidxfile.h" #include "errors.h" #define CHUNK_QIDX 0 static int callback_read_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_header* primheader = fitsbin_get_primary_header(fb); qidxfile* qf = chunk->userdata; if (fits_check_endian(primheader)) { ERROR("qidx file was written with wrong endianness"); return -1; } qf->numstars = qfits_header_getint(primheader, "NSTARS", -1); qf->numquads = qfits_header_getint(primheader, "NQUADS", -1); qf->dimquads = qfits_header_getint(primheader, "DIMQUADS", 4); if ((qf->numstars == -1) || (qf->numquads == -1)) { ERROR("Couldn't find NSTARS or NQUADS entries in FITS header"); return -1; } chunk->nrows = qf->numstars * 2 + qf->numquads * qf->dimquads; return 0; } static qidxfile* new_qidxfile(const char* fn, anbool writing) { qidxfile* qf; fitsbin_chunk_t chunk; qf = calloc(1, sizeof(qidxfile)); if (!qf) { SYSERROR("Couldn't malloc a qidxfile struct"); return NULL; } // default qf->dimquads = 4; if (writing) qf->fb = fitsbin_open_for_writing(fn); else qf->fb = fitsbin_open(fn); if (!qf->fb) { ERROR("Failed to create fitsbin"); return NULL; } fitsbin_chunk_init(&chunk); chunk.tablename = "qidx"; chunk.required = 1; chunk.callback_read_header = callback_read_header; chunk.userdata = qf; chunk.itemsize = sizeof(uint32_t); fitsbin_add_chunk(qf->fb, &chunk); fitsbin_chunk_clean(&chunk); return qf; } qidxfile* qidxfile_open(const char* fn) { qidxfile* qf = NULL; qf = new_qidxfile(fn, FALSE); if (!qf) goto bailout; if (fitsbin_read(qf->fb)) { ERROR("Failed to find qidx table.\n"); goto bailout; } qf->index = fitsbin_get_chunk(qf->fb, CHUNK_QIDX)->data; qf->heap = qf->index + 2 * qf->numstars; return qf; bailout: if (qf) qidxfile_close(qf); return NULL; } int qidxfile_close(qidxfile* qf) { int rtn; if (!qf) return 0; if (fitsbin_get_fid(qf->fb)) fits_pad_file(fitsbin_get_fid(qf->fb)); rtn = fitsbin_close(qf->fb); free(qf); return rtn; } qidxfile* qidxfile_open_for_writing(const char* fn, int nstars, int nquads) { qidxfile* qf; qfits_header* hdr; qf = new_qidxfile(fn, TRUE); if (!qf) goto bailout; qf->numstars = nstars; qf->numquads = nquads; hdr = fitsbin_get_primary_header(qf->fb); fits_add_endian(hdr); fits_header_add_int(hdr, "NSTARS", qf->numstars, "Number of stars used."); fits_header_add_int(hdr, "NQUADS", qf->numquads, "Number of quads used."); qfits_header_add(hdr, "AN_FILE", "QIDX", "This is a quad index file.", NULL); qfits_header_add(hdr, "COMMENT", "The data table of this file has two parts:", NULL, NULL); qfits_header_add(hdr, "COMMENT", " -the index", NULL, NULL); qfits_header_add(hdr, "COMMENT", " -the heap", NULL, NULL); fits_add_long_comment(hdr, "The index contains two uint32 values for each star: the offset and " "length, in the heap, of the list of quads to which it belongs. " "The offset and length are in units of uint32s, not bytes. " "Offset 0 is the first uint32 in the heap. " "The heap is ordered and tightly packed. " "The heap is a flat list of quad indices (uint32s)."); return qf; bailout: if (qf) qidxfile_close(qf); return NULL; } int qidxfile_write_header(qidxfile* qf) { fitsbin_t* fb = qf->fb; fitsbin_chunk_t* chunk; chunk = fitsbin_get_chunk(fb, CHUNK_QIDX); chunk->nrows = 2 * qf->numstars + qf->dimquads * qf->numquads; if (fitsbin_write_primary_header(fb) || fitsbin_write_chunk_header(fb, chunk)) { ERROR("Failed to write qidxfile header"); return -1; } qf->cursor_index = 0; qf->cursor_heap = 0; return 0; } int qidxfile_write_star(qidxfile* qf, int* quads, int nquads) { fitsbin_t* fb = qf->fb; FILE* fid; uint32_t nq; int i; fitsbin_chunk_t* chunk; fid = fitsbin_get_fid(fb); chunk = fitsbin_get_chunk(fb, CHUNK_QIDX); // Write the offset & size: if (fseeko(fid, fitsbin_get_data_start(fb, chunk) + qf->cursor_index * 2 * sizeof(uint32_t), SEEK_SET)) { ERROR("qidxfile_write_star: failed to fseek"); return -1; } nq = nquads; if (fitsbin_write_item(fb, chunk, &qf->cursor_heap) || fitsbin_write_item(fb, chunk, &nq)) { ERROR("qidxfile_write_star: failed to write a qidx offset/size"); return -1; } // Write the quads. if (fseeko(fid, fitsbin_get_data_start(fb, chunk) + qf->numstars * 2 * sizeof(uint32_t) + qf->cursor_heap * sizeof(uint32_t), SEEK_SET)) { SYSERROR("qidxfile_write_star: failed to fseek"); return -1; } for (i=0; icursor_index++; qf->cursor_heap += nquads; return 0; } int qidxfile_get_quads(const qidxfile* qf, int starid, uint32_t** quads, int* nquads) { int heapindex = qf->index[2*starid]; *nquads = qf->index[2*starid + 1]; *quads = qf->heap + heapindex; return 0; } qfits_header* qidxfile_get_header(const qidxfile* qf) { return fitsbin_get_primary_header(qf->fb); } astrometry.net-0.67/util/qsort_reentrant.c000644 000765 000024 00000015512 12651445460 021145 0ustar00dstnstaff000000 000000 /* * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ // from https://groups.google.com/forum/#!topic/astrometry/quGEbY1CgR8 #if __sun # include #else # include #endif //__FBSDID("$FreeBSD: src/sys/libkern/qsort.c,v 1.15 2004/07/15 23:58:23 glebius Exp $"); // Astrometry: We want reentrant! #define I_AM_QSORT_R #ifdef I_AM_QSORT_R typedef int cmp_t(void *, const void *, const void *); #else typedef int cmp_t(const void *, const void *); #endif static __inline char *med3(char *, char *, char *, cmp_t *, void *); static __inline void swapfunc(char *, char *, int, int); #define min(a, b) (a) < (b) ? (a) : (b) /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". */ #define swapcode(TYPE, parmi, parmj, n) { \ long i = (n) / sizeof (TYPE); \ register TYPE *pi = (TYPE *) (parmi); \ register TYPE *pj = (TYPE *) (parmj); \ do { \ register TYPE t = *pi; \ *pi++ = *pj; \ *pj++ = t; \ } while (--i > 0); \ } #define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; static __inline void swapfunc(char *a, char *b, int n, int swaptype) { if(swaptype <= 1) swapcode(long, a, b, n) else swapcode(char, a, b, n) } #define swap(a, b) \ if (swaptype == 0) { \ long t = *(long *)(a); \ *(long *)(a) = *(long *)(b); \ *(long *)(b) = t; \ } else \ swapfunc(a, b, es, swaptype) #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) #ifdef I_AM_QSORT_R #define CMP(t, x, y) (cmp((t), (x), (y))) #else #define CMP(t, x, y) (cmp((x), (y))) #endif static __inline char * med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk #ifndef I_AM_QSORT_R __unused #endif ) { return CMP(thunk, a, b) < 0 ? (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); } #ifdef I_AM_QSORT_R void qsort_r(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) #else #define thunk NULL void qsort(void *a, size_t n, size_t es, cmp_t *cmp) #endif { char *pa, *pb, *pc, *pd, *pl, *pm, *pn; int d, r, swaptype, swap_cnt; loop: SWAPINIT(a, es); swap_cnt = 0; if (n < 7) { for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pm = (char *)a + (n / 2) * es; if (n > 7) { pl = a; pn = (char *)a + (n - 1) * es; if (n > 40) { d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); pm = med3(pm - d, pm, pm + d, cmp, thunk); pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); } pm = med3(pl, pm, pn, cmp, thunk); } swap(a, pm); pa = pb = (char *)a + es; pc = pd = (char *)a + (n - 1) * es; for (;;) { while (pb <= pc && (r = CMP(thunk, pb, a)) <= 0) { if (r == 0) { swap_cnt = 1; swap(pa, pb); pa += es; } pb += es; } while (pb <= pc && (r = CMP(thunk, pc, a)) >= 0) { if (r == 0) { swap_cnt = 1; swap(pc, pd); pd -= es; } pc -= es; } if (pb > pc) break; swap(pb, pc); swap_cnt = 1; pb += es; pc -= es; } if (swap_cnt == 0) { /* Switch to insertion sort */ for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) for (pl = pm; pl > (char *)a && CMP(thunk, pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } pn = (char *)a + n * es; r = min(pa - (char *)a, pb - pa); vecswap(a, pb - r, r); r = min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) #ifdef I_AM_QSORT_R qsort_r(a, r / es, es, thunk, cmp); #else qsort(a, r / es, es, cmp); #endif if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r; n = r / es; goto loop; } } astrometry.net-0.67/util/quadfile.c000644 000765 000024 00000022267 12651445460 017512 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "quadfile.h" #include "qfits_header.h" #include "fitsioutils.h" #include "starutil.h" #include "ioutils.h" #include "errors.h" #include "an-endian.h" #define CHUNK_QUADS 0 static fitsbin_chunk_t* quads_chunk(quadfile_t* qf) { return fitsbin_get_chunk(qf->fb, CHUNK_QUADS); } static int callback_read_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_header* primheader = fitsbin_get_primary_header(fb); quadfile_t* qf = chunk->userdata; qf->dimquads = qfits_header_getint(primheader, "DIMQUADS", 4); qf->numquads = qfits_header_getint(primheader, "NQUADS", -1); qf->numstars = qfits_header_getint(primheader, "NSTARS", -1); qf->index_scale_upper = qfits_header_getdouble(primheader, "SCALE_U", -1.0); qf->index_scale_lower = qfits_header_getdouble(primheader, "SCALE_L", -1.0); qf->indexid = qfits_header_getint(primheader, "INDEXID", 0); qf->healpix = qfits_header_getint(primheader, "HEALPIX", -1); qf->hpnside = qfits_header_getint(primheader, "HPNSIDE", 1); if ((qf->numquads == -1) || (qf->numstars == -1) || (qf->index_scale_upper == -1.0) || (qf->index_scale_lower == -1.0)) { ERROR("Couldn't find NQUADS or NSTARS or SCALE_U or SCALE_L entries in FITS header"); return -1; } if (fits_check_endian(primheader)) { ERROR("Quad file was written with the wrong endianness"); return -1; } chunk->itemsize = qf->dimquads * sizeof(uint32_t); chunk->nrows = qf->numquads; return 0; } static quadfile_t* new_quadfile(const char* fn, anqfits_t* fits, anbool writing) { quadfile_t* qf; fitsbin_chunk_t chunk; qf = calloc(1, sizeof(quadfile_t)); if (!qf) { SYSERROR("Couldn't malloc a quadfile struct"); return NULL; } qf->healpix = -1; qf->hpnside = 1; if (writing) if (fn) { qf->fb = fitsbin_open_for_writing(fn); } else { qf->fb = fitsbin_open_in_memory(); } else { if (fits) qf->fb = fitsbin_open_fits(fits); else qf->fb = fitsbin_open(fn); } if (!qf->fb) { ERROR("Failed to create fitsbin"); return NULL; } fitsbin_chunk_init(&chunk); chunk.tablename = "quads"; chunk.required = 1; chunk.callback_read_header = callback_read_header; chunk.userdata = qf; fitsbin_add_chunk(qf->fb, &chunk); fitsbin_chunk_clean(&chunk); return qf; } int quadfile_check(const quadfile_t* qf) { int q, i; if (qf->dimquads < 3 || qf->dimquads > DQMAX) { ERROR("Dimquads has illegal value %i", qf->dimquads); return -1; } for (q=0; qnumquads; q++) { unsigned int stars[DQMAX]; if (quadfile_get_stars(qf, q, stars)) { ERROR("Failed to get quad %i of %i", q, qf->numquads); return -1; } for (i=0; idimquads; i++) { if (stars[i] >= qf->numstars) { ERROR("Star ID %i is out of bounds: num stars %i", stars[i], qf->numstars); return -1; } } } return 0; } int quadfile_dimquads(const quadfile_t* qf) { return qf->dimquads; } int quadfile_nquads(const quadfile_t* qf) { return qf->numquads; } qfits_header* quadfile_get_header(const quadfile_t* qf) { return fitsbin_get_primary_header(qf->fb); } static quadfile_t* my_open(const char* fn, anqfits_t* fits) { quadfile_t* qf = NULL; fitsbin_chunk_t* chunk; qf = new_quadfile(fn, fits, FALSE); if (!qf) goto bailout; if (fitsbin_read(qf->fb)) { ERROR("Failed to open quads file"); goto bailout; } chunk = quads_chunk(qf); qf->quadarray = chunk->data; // close fd. if (qf->fb->fid) { if (fclose(qf->fb->fid)) { ERROR("Failed to close quadfile FID"); goto bailout; } qf->fb->fid = NULL; } return qf; bailout: if (qf) quadfile_close(qf); return NULL; } char* quadfile_get_filename(const quadfile_t* qf) { return fitsbin_get_filename(qf->fb); } quadfile_t* quadfile_open_fits(anqfits_t* fits) { return my_open(NULL, fits); } quadfile_t* quadfile_open(const char* fn) { return my_open(fn, NULL); } int quadfile_close(quadfile_t* qf) { int rtn; if (!qf) return 0; rtn = fitsbin_close(qf->fb); free(qf); return rtn; } static quadfile_t* open_for_writing(const char* fn) { quadfile_t* qf; qfits_header* hdr; qf = new_quadfile(fn, NULL, TRUE); if (!qf) goto bailout; qf->dimquads = 4; // add default values to header hdr = fitsbin_get_primary_header(qf->fb); fits_add_endian(hdr); qfits_header_add(hdr, "AN_FILE", "QUAD", "This file lists, for each quad, its stars.", NULL); qfits_header_add(hdr, "DIMQUADS", "0", "", NULL); qfits_header_add(hdr, "NQUADS", "0", "", NULL); qfits_header_add(hdr, "NSTARS", "0", "", NULL); qfits_header_add(hdr, "SCALE_U", "0.0", "", NULL); qfits_header_add(hdr, "SCALE_L", "0.0", "", NULL); qfits_header_add(hdr, "INDEXID", "0", "", NULL); qfits_header_add(hdr, "HEALPIX", "-1", "", NULL); qfits_header_add(hdr, "HPNSIDE", "1", "", NULL); fits_add_long_comment(hdr, "The first extension contains the quads " "stored as %i 32-bit native-endian unsigned ints.", qf->dimquads); return qf; bailout: if (qf) quadfile_close(qf); return NULL; } quadfile_t* quadfile_open_for_writing(const char* fn) { if (!fn) { ERROR("Non-NULL filename required"); return NULL; } return open_for_writing(fn); } quadfile_t* quadfile_open_in_memory() { return open_for_writing(NULL); } int quadfile_switch_to_reading(quadfile_t* qf) { if (quadfile_fix_header(qf)) { ERROR("Failed to fix quads header"); return -1; } if (fitsbin_switch_to_reading(qf->fb)) { ERROR("Failed to switch to read mode"); return -1; } if (fitsbin_read(qf->fb)) { ERROR("Failed to open quads file"); return -1; } qf->quadarray = quads_chunk(qf)->data; return 0; } static void add_to_header(qfits_header* hdr, quadfile_t* qf) { fits_header_mod_int(hdr, "DIMQUADS", qf->dimquads, "Number of stars in a quad."); fits_header_mod_int(hdr, "NQUADS", qf->numquads, "Number of quads."); fits_header_mod_int(hdr, "NSTARS", qf->numstars, "Number of stars."); fits_header_mod_double(hdr, "SCALE_U", qf->index_scale_upper, "Upper-bound index scale (radians)."); fits_header_mod_double(hdr, "SCALE_L", qf->index_scale_lower, "Lower-bound index scale (radians)."); fits_header_mod_int(hdr, "INDEXID", qf->indexid, "Index unique ID."); fits_header_mod_int(hdr, "HEALPIX", qf->healpix, "Healpix of this index."); fits_header_mod_int(hdr, "HPNSIDE", qf->hpnside, "Nside of the healpixelization"); } int quadfile_write_header(quadfile_t* qf) { fitsbin_t* fb = qf->fb; fitsbin_chunk_t* chunk = quads_chunk(qf); qfits_header* hdr; chunk->itemsize = qf->dimquads * sizeof(uint32_t); chunk->nrows = qf->numquads; hdr = fitsbin_get_primary_header(fb); add_to_header(hdr, qf); if (fitsbin_write_primary_header(fb) || fitsbin_write_chunk_header(fb, chunk)) { ERROR("Failed to write quadfile header"); return -1; } return 0; } int quadfile_write_header_to(quadfile_t* qf, FILE* fid) { fitsbin_t* fb = qf->fb; fitsbin_chunk_t* chunk = quads_chunk(qf); qfits_header* hdr; chunk->itemsize = qf->dimquads * sizeof(uint32_t); chunk->nrows = qf->numquads; hdr = fitsbin_get_primary_header(fb); add_to_header(hdr, qf); if (fitsbin_write_primary_header_to(fb, fid) || fitsbin_write_chunk_header_to(fb, chunk, fid)) { ERROR("Failed to write quadfile header"); return -1; } return 0; } int quadfile_write_quad(quadfile_t* qf, unsigned int* stars) { uint32_t* data; uint32_t ustars[qf->dimquads]; int i; fitsbin_chunk_t* chunk = quads_chunk(qf); if (sizeof(uint32_t) == sizeof(uint)) { data = stars; } else { data = ustars; for (i=0; idimquads; i++) ustars[i] = stars[i]; } if (fitsbin_write_item(qf->fb, chunk, data)) { ERROR("Failed to write a quad"); return -1; } qf->numquads++; return 0; } int quadfile_write_all_quads_to(quadfile_t* qf, FILE* fid) { fitsbin_chunk_t* chunk = quads_chunk(qf); if (fitsbin_write_items_to(chunk, qf->quadarray, quadfile_nquads(qf), fid)) { ERROR("Failed to write %i quads", quadfile_nquads(qf)); return -1; } return 0; } int quadfile_fix_header(quadfile_t* qf) { qfits_header* hdr; fitsbin_t* fb = qf->fb; fitsbin_chunk_t* chunk = quads_chunk(qf); chunk->itemsize = qf->dimquads * sizeof(uint32_t); chunk->nrows = qf->numquads; hdr = fitsbin_get_primary_header(fb); add_to_header(hdr, qf); if (fitsbin_fix_primary_header(fb) || fitsbin_fix_chunk_header(fb, chunk)) { ERROR("Failed to fix quad header"); return -1; } return 0; } double quadfile_get_index_scale_upper_arcsec(const quadfile_t* qf) { return rad2arcsec(qf->index_scale_upper); } double quadfile_get_index_scale_lower_arcsec(const quadfile_t* qf) { return rad2arcsec(qf->index_scale_lower); } int quadfile_get_stars(const quadfile_t* qf, unsigned int quadid, unsigned int* stars) { int i; if (quadid >= qf->numquads) { ERROR("Requested quadid %i, but number of quads is %i", quadid, qf->numquads); assert(quadid < qf->numquads); return -1; } for (i=0; idimquads; i++) { stars[i] = qf->quadarray[quadid * qf->dimquads + i]; } return 0; } astrometry.net-0.67/util/query-starkd.c000644 000765 000024 00000013167 12651445460 020352 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "starkd.h" #include "fitsioutils.h" #include "log.h" #include "errors.h" #include "boilerplate.h" #include "starutil.h" #include "rdlist.h" static const char* OPTIONS = "hvr:d:R:t:Io:T"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] \n" " [-o ]: write FITS table (default: print ASCII to stdout)\n" " [-r ] (deg)\n" " [-d ] (deg)\n" " [-R ] (deg)\n" " [-t ]\n" " [-T]: tag-along all\n" " [-I]: print indices too\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char **argv) { int argchar; startree_t* starkd; double ra=0.0, dec=0.0, radius=0.0; sl* tag = sl_new(4); anbool tagall = FALSE; char* starfn = NULL; int loglvl = LOG_MSG; char** myargs; int nmyargs; anbool getinds = FALSE; double* radec; int* inds; int N; int i; char* rdfn = NULL; pl* tagdata = pl_new(16); il* tagsizes = il_new(16); fitstable_t* tagalong = NULL; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'o': rdfn = optarg; break; case 'I': getinds = TRUE; break; case 'r': ra = atof(optarg); break; case 'd': dec = atof(optarg); break; case 'R': radius = atof(optarg); break; case 't': sl_append(tag, optarg); break; case 'T': tagall = TRUE; break; case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(argv[0]); break; default: return -1; } nmyargs = argc - optind; myargs = argv + optind; if (nmyargs != 1) { ERROR("Got %i arguments; expected 1.\n", nmyargs); printHelp(argv[0]); exit(-1); } starfn = myargs[0]; log_init(loglvl); starkd = startree_open(starfn); if (!starkd) { ERROR("Failed to open star kdtree"); exit(-1); } logmsg("Searching kdtree %s at RA,Dec = (%g,%g), radius %g deg.\n", starfn, ra, dec, radius); startree_search_for_radec(starkd, ra, dec, radius, NULL, &radec, &inds, &N); logmsg("Got %i results.\n", N); if (!N) goto done; if (tagall) { int j, M; M = startree_get_tagalong_N_columns(starkd); for (j=0; j #include "rdlist.h" void rd_getradec(const rd_t* f, int i, double* ra, double* dec) { assert(i < f->N); *ra = f->ra [i]; *dec = f->dec[i]; } double rd_getra (rd_t* f, int i) { assert(i < f->N); return f->ra[i]; } double rd_getdec(rd_t* f, int i) { assert(i < f->N); return f->dec[i]; } void rd_setra (rd_t* f, int i, double ra) { assert(i < f->N); f->ra[i] = ra; } void rd_setdec(rd_t* f, int i, double dec) { assert(i < f->N); f->dec[i] = dec; } int rd_n(rd_t* r) { return r->N; } void rd_free_data(rd_t* f) { if (!f) return; free(f->ra); free(f->dec); } void rd_free(rd_t* f) { rd_free_data(f); free(f); } void rd_alloc_data(rd_t* f, int N) { f->ra = malloc(N * sizeof(double)); f->dec = malloc(N * sizeof(double)); f->N = N; } rd_t* rd_alloc(int N) { rd_t* rd = calloc(1, sizeof(rd_t)); rd_alloc_data(rd, N); return rd; } void rd_copy(rd_t* dest, int dest_offset, const rd_t* src, int src_offset, int N) { int i; for (i=0; ira [i + dest_offset] = src->ra [i + src_offset]; dest->dec[i + dest_offset] = src->dec[i + src_offset]; } } rd_t* rd_get_subset(const rd_t* src, int offset, int N) { rd_t* dest = rd_alloc(N); rd_copy(dest, 0, src, offset, N); return dest; } void rd_from_array(rd_t* r, double* radec, int N) { int i; rd_alloc_data(r, N); for (i=0; iN; i++) { r->ra [i] = radec[i*2]; r->dec[i] = radec[i*2+1]; } } void rd_from_dl(rd_t* r, dl* l) { int i; rd_alloc_data(r, dl_size(l)/2); for (i=0; iN; i++) { r->ra [i] = dl_get(l, i*2); r->dec[i] = dl_get(l, i*2+1); } } void rdlist_set_raname(rdlist_t* ls, const char* name) { xylist_set_xname(ls, name); } void rdlist_set_decname(rdlist_t* ls, const char* name) { xylist_set_yname(ls, name); } void rdlist_set_ratype(rdlist_t* ls, tfits_type type) { xylist_set_xtype(ls, type); } void rdlist_set_dectype(rdlist_t* ls, tfits_type type) { xylist_set_ytype(ls, type); } void rdlist_set_raunits(rdlist_t* ls, const char* units) { xylist_set_xunits(ls, units); } void rdlist_set_decunits(rdlist_t* ls, const char* units) { xylist_set_yunits(ls, units); } /* qfits_header* rdlist_get_header(rdlist* ls) { return xylist_get_header(ls); } qfits_header* rdlist_get_field_header(rdlist* ls) { return xylist_get_field_header(ls, ls->field); } */ rdlist_t* rdlist_open(const char* fn) { rdlist_t* rtn = xylist_open(fn); if (!rtn) return NULL; rdlist_set_raname(rtn, "RA"); rdlist_set_decname(rtn, "DEC"); xylist_set_include_flux(rtn, FALSE); xylist_set_include_background(rtn, FALSE); return rtn; } rd_t* rdlist_read_field(rdlist_t* ls, rd_t* fld) { starxy_t xy; if (!xylist_read_field(ls, &xy)) { return NULL; } if (!fld) { fld = calloc(1, sizeof(rd_t)); } fld->ra = xy.x; fld->dec = xy.y; fld->N = xy.N; return fld; } rd_t* rdlist_read_field_num(rdlist_t* ls, int ext, rd_t* fld) { if (rdlist_open_field(ls, ext)) { return NULL; } return rdlist_read_field(ls, fld); } int rdlist_write_field(rdlist_t* ls, rd_t* fld) { starxy_t xy; memset(&xy, 0, sizeof(starxy_t)); xy.x = fld->ra; xy.y = fld->dec; xy.N = fld->N; return xylist_write_field(ls, &xy); } int rdlist_write_one_row(rdlist_t* ls, rd_t* fld, int row) { starxy_t xy; memset(&xy, 0, sizeof(starxy_t)); xy.x = fld->ra; xy.y = fld->dec; xy.N = fld->N; return xylist_write_one_row(ls, &xy, row); } int rdlist_write_one_radec(rdlist_t* ls, double ra, double dec) { starxy_t xy; xy.x = &ra; xy.y = &dec; xy.N = 1; return xylist_write_one_row(ls, &xy, 0); } rdlist_t* rdlist_open_for_writing(const char* fn) { rdlist_t* rtn = xylist_open_for_writing(fn); xylist_set_antype(rtn, AN_FILETYPE_RDLS); rdlist_set_raname (rtn, "RA"); rdlist_set_decname(rtn, "DEC"); rdlist_set_raunits (rtn, "deg"); rdlist_set_decunits(rtn, "deg"); rdlist_set_ratype (rtn, TFITS_BIN_TYPE_D); rdlist_set_dectype(rtn, TFITS_BIN_TYPE_D); xylist_set_include_flux(rtn, FALSE); xylist_set_include_background(rtn, FALSE); return rtn; } astrometry.net-0.67/util/removelines.py000755 000765 000024 00000006346 12651445460 020461 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import sys import logging from optparse import OptionParser if __name__ == '__main__': import addpath addpath.addpath() import numpy try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from numpy.random import rand from astrometry.util.fits import pyfits_writeto # Returns a numpy array of booleans def hist_remove_lines(x, binwidth, binoffset, logcut): bins = -binoffset + arange(0, max(x)+binwidth, binwidth) (counts, thebins) = histogram(x, bins) # We're ignoring empty bins. occupied = nonzero(counts > 0)[0] noccupied = len(occupied) k = (counts[occupied] - 1) mean = sum(k) / float(noccupied) logpoisson = k*log(mean) - mean - array([sum(arange(kk)) for kk in k]) badbins = occupied[logpoisson < logcut] if len(badbins) == 0: return array([True] * len(x)) badleft = bins[badbins] badright = badleft + binwidth badpoints = sum(array([(x >= L)*(x < R) for (L,R) in zip(badleft, badright)]), 0) return (badpoints == 0) def removelines(infile, outfile, xcol='X', ycol='Y', ext=1, cut=None, **kwargs): if cut is None: cut = 100 p = pyfits.open(infile) xy = p[ext].data hdr = p[ext].header if xy is None: print 'removelines.py: Input file contains no sources.' pyfits_writeto(p, outfile) return 0 x = xy.field(xcol) y = xy.field(ycol) if len(x) == 0: print 'removelines.py: Your FITS file contains 0 sources (rows)' pyfits_writeto(p, outfile) return 0 ix = hist_remove_lines(x, 1, 0.5, logcut=-cut) iy = hist_remove_lines(y, 1, 0.5, logcut=-cut) I = ix * iy xc = x[I] yc = y[I] print 'removelines.py: Removed %i sources' % (len(x) - len(xc)) p[ext].header.add_history('This xylist was filtered by the "removelines.py" program') p[ext].header.add_history('to remove horizontal and vertical lines of sources') p[ext].header['REMLINEN'] = (len(x) - len(xc), 'Number of sources removed by "removelines.py"') p[ext].data = p[ext].data[I] pyfits_writeto(p, outfile) return 0 if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-X', dest='xcol', help='Name of X column in input table') parser.add_option('-Y', dest='ycol', help='Name of Y column in input table') parser.add_option('-s', dest='cut', type='float', help='Significance level to cut at (default 100)') parser.add_option('-e', dest='ext', type=int, help='FITS extension to read', default=1) parser.set_defaults(xcol='X', ycol='Y', cut=None) (opt, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Got arguments:', args sys.exit(-1) infile = args[0] outfile = args[1] rtn = removelines(infile, outfile, xcol=opt.xcol, ycol=opt.ycol, cut=opt.cut, ext=opt.ext) sys.exit(rtn) astrometry.net-0.67/util/removelines_general.py000755 000765 000024 00000012673 12651445460 022156 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from math import * from numpy import * from pylab import * from scipy.ndimage.filters import * from astrometry.util.fits import pyfits_writeto def normalized_hough(x, y, imgw, imgh, rlo, rhi, tlo, thi, nr, nt): houghimg = zeros((nr, nt)).astype(int) tstep = (thi - tlo) / float(nt) rstep = (rhi - rlo) / float(nr) # For each point, accumulate into the Hough transform image... tt = tlo + (arange(nt) + 0.5) * tstep cost = cos(tt) sint = sin(tt) for (xi,yi) in zip(x, y): rr = xi * cost + yi * sint ri = floor((rr - rlo) / rstep).astype(int) I = (ri >= 0) * (ri < nr) houghimg[ri[I], I] += 1 # Compute the approximate Hough normalization image houghnorm = zeros((nr, nt)).astype(float) rr = rlo + (arange(nr) + 0.5) * rstep for ti,t in enumerate(tt): (x0,x1,y0,y1) = clip_to_image(rr, t, imgw, imgh) dist = sqrt((x0 - x1)**2 + (y0 - y1)**2) houghnorm[:, ti] = dist # expected number of points: dist is the length of the slice, # rstep is the width of the slice; len(x)/A is the source density. houghnorm *= (rstep * len(x) / (imgw*imgh)) return (houghimg, houghnorm, rr, tt, rstep, tstep) def clip_to_image(r, t, imgw, imgh): eps = 1e-9 if abs(t) < eps or abs(t-pi) < eps: # near-vertical. s = (abs(t) < eps) and 1 or -1 y0 = 0 y1 = ((r*s >= 0) * (r*s < imgw)) * imgh x0 = x1 = clip(r, 0, imgw) return (x0, x1, y0, y1) m = -cos(t)/sin(t) b = r/sin(t) x0 = 0 x1 = imgw y0 = clip(b + m*x0, 0, imgh) y1 = clip(b + m*x1, 0, imgh) x0 = clip((y0 - b) / m, 0, imgw) x1 = clip((y1 - b) / m, 0, imgw) y0 = clip(b + m*x0, 0, imgh) y1 = clip(b + m*x1, 0, imgh) return (x0, x1, y0, y1) def removelines_general(infile, outfile, nt=180, nr=180, thresh1=2., thresh2=5., plots=False): p = pyfits.open(infile) xy = p[1].data hdr = p[1].header x = xy.field('X').copy() y = xy.field('Y').copy() imshowargs = { 'interpolation':'nearest', 'origin':'lower' } imgw = int(ceil(max(x) - min(x))) imgh = int(ceil(max(y) - min(y))) x -= min(x) y -= min(y) Rmax = sqrt(imgw**2 + imgh**2) Rmin = -Rmax (houghimg, houghnorm, rr, tt, rstep, tstep ) = normalized_hough(x, y, imgw, imgh, Rmin, Rmax, 0, pi, nr, nt) hnorm = houghimg / maximum(houghnorm, 1) if plots: clf() plot(x,y,'r.') savefig('xy.png') clf() imshow(houghimg, **imshowargs) xlabel('Theta') ylabel('Radius') colorbar() savefig('hough.png') clf() imshow(houghnorm, **imshowargs) xlabel('Theta') ylabel('Radius') colorbar() savefig('norm.png') clf() imshow(hnorm, **imshowargs) xlabel('Theta') ylabel('Radius') colorbar() savefig('hnorm.png') I = find(hnorm.ravel() >= thresh1) print '%i peaks are above the coarse threshold' % len(I) bestri = I / nt bestti = I % nt if plots: a=axis() for (ri,ti) in zip(bestri,bestti): plot([ti-2, ti-2, ti+2, ti+2, ti-2], [ri-2, ri+2, ri+2, ri-2, ri-2], 'r-') axis(a) savefig('zooms.png') clf() plot(x,y,'r.') for (ri,ti) in zip(bestri,bestti): (x0,x1,y0,y1) = clip_to_image(rr[ri], tt[ti], imgw, imgh) plot([x0,x1],[y0,y1], 'b-') savefig('xy2.png') # how big a search area around each peak? boxsize = 1 # how much more finely to grid. finer = 3 nr2 = (boxsize * 2)*finer + 1 nt2 = nr2 bestrt = [] keep = array([True] * len(x)) for (ri,ti) in zip(bestri,bestti): (subh, subnorm, subrr, subtt, subrstep, subtstep ) = normalized_hough(x, y, imgw, imgh, rr[max(ri-boxsize, 0)], rr[min(ri+boxsize, nr-1)], tt[max(ti-boxsize, 0)], tt[min(ti+boxsize, nt-1)], nr2, nt2) #print ' median normalization:', median(subnorm) subhnorm = subh / maximum(subnorm,1) I = find((subhnorm).ravel() >= thresh2) for i in I: bestsubri = i / nt2 bestsubti = i % nt2 r = subrr[bestsubri] t = subtt[bestsubti] bestrt.append((r,t)) #print ' (r=%.1f, t=%.1f): factor %.1f above expected' % (r, t*180/pi, subhnorm.ravel()[i]) thisr = x * cos(t) + y * sin(t) keep *= (abs(thisr - r) > subrstep/2.) print 'In finer grid: found %i peaks' % len(bestrt) if plots: clf() subplot(1,1,1) plot(x,y,'r.') for (r,t) in bestrt: (x0,x1,y0,y1) = clip_to_image(r, t, imgw, imgh) plot([x0,x1],[y0,y1],'b-') savefig('xy3.png') clf() plot(x,y,'r.') plot(x[keep == False], y[keep == False], 'b.') savefig('xy4.png') p[1].data = p[1].data[keep] pyfits_writeto(p, outfile) return 0 def exact_hough_normalization(): houghnorm = zeros((nr, nt)).astype(float) [xx,yy] = meshgrid(arange(imgw), arange(imgh)) yyflat = yy.ravel() xxflat = xx.ravel() for ti in range(nt): print ti t = (ti+0.5) * tstep rr = xxflat * cos(t) + yyflat * sin(t) ri = floor((rr - Rmin) / rstep).astype(int) (counts, nil) = histogram(ri, range(0, nr+1)) houghnorm[:, ti] += counts clf() imshow(houghnorm, **imshowargs) colorbar() savefig('houghnorm.png') if __name__ == '__main__': args = sys.argv[1:] plots = False if '-p' in args: plots = True args.remove('-p') if len(args) != 2: print 'Usage: %s [options] ' % sys.argv[0] print ' [-p]: create plots' exit(-1) infile = args[0] outfile = args[1] rtncode = removelines_general(infile, outfile, plots=plots) sys.exit(rtncode) astrometry.net-0.67/util/removelines_rotate.py000755 000765 000024 00000012102 12651445460 022022 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import os import sys import logging from pylab import * from optparse import OptionParser from removelines import hist_remove_lines from astrometry.util.fits import pyfits_writeto if __name__ == '__main__': try: try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError( "Cannot import either pyfits or astropy.io.fits" ) import astrometry from astrometry.util.shell import shell_escape from astrometry.util.filetype import filetype_short except ImportError: me = sys.argv[0] #print 'i am', me path = os.path.realpath(me) #print 'my real path is', path utildir = os.path.dirname(path) assert(os.path.basename(utildir) == 'util') andir = os.path.dirname(utildir) #assert(os.path.basename(andir) == 'astrometry') rootdir = os.path.dirname(andir) #print 'adding path', rootdir #sys.path += [rootdir] sys.path.insert(1, andir) sys.path.insert(2, rootdir) import numpy try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from numpy.random import rand ''' # Returns a numpy array of booleans: True for points that should be kept (are not part of lines) if False: # def hist_remove_lines(x, binwidth, binoffset, nsig, plots=False): bins = -binoffset + arange(0, max(x)+binwidth, binwidth) (counts, thebins) = histogram(x, bins) # We're ignoring empty bins. occupied = nonzero(counts)[0] noccupied = len(occupied) #k = (counts[occupied] - 1) #mean = sum(k) / float(noccupied) k = counts[occupied] mean = sum(k) / ((max(x) - min(x)) / binwidth) * sqrt(2.) thresh = mean + nsig * sqrt(mean) if plots: hist(x, bins) axhline(mean) axhline(thresh, color='r') print 'mean', mean, 'thresh:', thresh, 'max:', max(k) #logpoisson = k*log(mean) - mean - array([sum(log(1 + arange(kk))) for kk in k]) #uk = unique(k) #ulogpoisson = uk*log(mean) - mean - array([sum(1+arange(kk)) for kk in uk]) #print #for (uuk,ull) in zip(uk,ulogpoisson): # print uuk,ull #badbins = occupied[logpoisson < logcut] badbins = occupied[k > thresh] if len(badbins) == 0: return array([True] * len(x)) badleft = bins[badbins] badright = badleft + binwidth badpoints = sum(array([(x >= L)*(x < R) for (L,R) in zip(badleft, badright)]), 0) return (badpoints == 0) ''' #''' def removelines(infile, outfile, xcol='X', ycol='Y', plots=False, cut=None, **kwargs): p = pyfits.open(infile) xy = p[1].data hdr = p[1].header x = xy.field(xcol) y = xy.field(ycol) NX = max(x) - min(x) NY = max(y) - min(y) nangle = int(ceil(sqrt(NX*NY)/4.)) if cut is None: cut = 20 if plots: clf() plot(x, y, 'r.') I = array([True]*len(x)) for i,angle in enumerate(0.75 + linspace(0, pi/2., nangle, endpoint=False)): cost = cos(angle) sint = sin(angle) xx = x*cost + y*sint yy = x*-sint + y*cost xx -= min(xx) yy -= min(yy) if plots: print clf() subplot(2,2,1) plot(xx, yy, 'r.') subplot(2,2,3) #ix = hist_remove_lines(xx, 0.5, 0.5, 5, plots=plots) ix = hist_remove_lines(xx, 1, 0.5, logcut=-cut) if plots: subplot(2,2,4) #iy = hist_remove_lines(yy, 0.5, 0.5, 5, plots=plots) iy = hist_remove_lines(yy, 1, 0.5, logcut=-cut) I *= ix * iy removed = (ix * iy == False) if plots: if sum(removed): plot([min(x[removed]), max(x[removed])], [min(y[removed]), max(y[removed])], 'k-', alpha=0.5) subplot(2,2,1) plot(xx[removed], yy[removed], 'b-', alpha=0.5) plot(xx[removed], yy[removed], 'b.') savefig('rot-%04i.png' % i) print 'angle', angle, 'removed', (len(x) - sum(ix*iy)) xc = x[I] yc = y[I] print 'removelines.py: Removed %i sources' % (len(x) - len(xc)) if plots: plot(xc, yc, 'o', mec='r', mfc='none') # axes('equal') savefig('after.png') p[1].header.add_history('This xylist was filtered by the "removelines_rotate.py" program') p[1].header.add_history('to remove lines of sources') p[1].header.update('REMLINEN', len(x) - len(xc), 'Number of sources removed by "removelines"') p[1].data = p[1].data[I] pyfits_writeto(p, outfile) return 0 if __name__ == '__main__': parser = OptionParser(usage='%prog ') parser.add_option('-X', '--x-column', dest='xcol', help='X column name') parser.add_option('-Y', '--y-column', dest='ycol', help='Y column name') parser.set_defaults(xcol='X', ycol='Y') opt,args = parser.parse_args() if len(args) != 2: parser.print_help() sys.exit(0) kwargs = {} for k in 'xcol','ycol': kwargs[k] = getattr(opt, k) infile = args[0] outfile = args[1] rtncode = removelines(infile, outfile, **kwargs) sys.exit(rtncode) astrometry.net-0.67/util/resample-main.c000644 000765 000024 00000013350 12651445460 020443 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "os-features.h" #include "anwcs.h" #include "fitsioutils.h" #include "starutil.h" #include "errors.h" #include "log.h" #include "mathutil.h" #include "keywords.h" #include "tic.h" #include "anqfits.h" static const char* OPTIONS = "hrvz:o:e:w:WqI:x:y:"; void printHelp(char* progname) { fprintf(stderr, "%s [options] \n" " [-e ]: input FITS extension to read (default: primary extension, 0)\n" " [-w ] (default: input file)\n" " [-o ]: Lanczos order (default 3)\n" " [-v]: more verbose\n" " [-q]: less verbose\n" "\n", progname); } static double lanczos(double x, int order) { if (x == 0) return 1.0; if (x > order || x < -order) return 0.0; return order * sin(M_PI * x) * sin(M_PI * x / (double)order) / square(M_PI * x); } static void resample_image(const double* img, int W, int H, anwcs_t* inwcs, double* outimg, int outW, int outH, anwcs_t* outwcs, double* weightimg, double imgweight, anbool set_or_add, int order) { // double support; support = order; int i, j; for (i=0; i= W+support) continue; if (py < -support || py >= H+support) continue; */ if (px < 0 || px >= W) continue; if (py < 0 || py >= H) continue; x0 = MAX(0, (int)floor(px - support)); y0 = MAX(0, (int)floor(py - support)); x1 = MIN(W-1, (int) ceil(px + support)); y1 = MIN(H-1, (int) ceil(py + support)); weight = 0.0; sum = 0.0; for (iy=y0; iy<=y1; iy++) { for (ix=x0; ix<=x1; ix++) { double K; double pix; double d; d = hypot(px - ix, py - iy); K = lanczos(d, order); //K = space->kernel(space->token, px, py, ix, iy); if (K == 0) continue; pix = img[iy*W + ix]; if (isnan(pix)) // out-of-bounds pixel continue; if (!isfinite(pix)) { logverb("Pixel value: %g\n", pix); continue; } weight += K; sum += K * pix; } } if (weight != 0) { if (set_or_add) outimg[i*outW + j] = sum / weight; else outimg[i*outW + j] += sum / weight; if (weightimg) weightimg[i*outW + j] += imgweight; } } logverb("Row %i of %i\n", i+1, outH); } } int main(int argc, char** args) { int argchar; char* infn = NULL; char* outfn = NULL; char* inwcsfn = NULL; char* outwcsfn = NULL; double* img = NULL; double* outimg = NULL; int W, H; int outW, outH; anwcs_t* inwcs; anwcs_t* outwcs; double inpixscale; double outpixscale; int i; int loglvl = LOG_MSG; anqfits_t* anq; int fitsext = 0; int order = 3; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case '?': case 'h': printHelp(args[0]); exit(0); case 'v': loglvl++; break; case 'q': loglvl--; break; case 'e': fitsext = atoi(optarg); break; case 'w': inwcsfn = optarg; break; case 'o': order = atoi(optarg); break; } log_init(loglvl); fits_use_error_system(); if (argc - optind != 3) { printHelp(args[0]); exit(-1); } infn = args[optind]; outwcsfn = args[optind+1]; outfn = args[optind+2]; if (!inwcsfn) inwcsfn = infn; anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open \"%s\"", infn); exit(-1); } img = anqfits_readpix(anq, fitsext, 0, 0, 0, 0, 0, PTYPE_DOUBLE, NULL, &W, &H); if (!img) { ERROR("Failed to read pixel from \"%s\"", infn); exit(-1); } anqfits_close(anq); logmsg("Read image %s: %i x %i.\n", infn, W, H); logmsg("Reading input WCS file %s\n", inwcsfn); inwcs = anwcs_open(inwcsfn, fitsext); if (!inwcs) { ERROR("Failed to read WCS from file: %s\n", inwcsfn); exit(-1); } inpixscale = anwcs_pixel_scale(inwcs); if (inpixscale == 0) { ERROR("Pixel scale from the WCS file is zero. Usually this means the image has no valid WCS header.\n"); exit(-1); } logmsg("Reading output WCS file %s\n", outwcsfn); outwcs = anwcs_open(outwcsfn, fitsext); if (!outwcs) { ERROR("Failed to read WCS from file: %s\n", outwcsfn); exit(-1); } outpixscale = anwcs_pixel_scale(outwcs); if (inpixscale == 0) { ERROR("Pixel scale from the WCS file is zero. Usually this means the image has no valid WCS header.\n"); exit(-1); } logmsg("Input pixel scale: %g. Output: %g (arcsec/pix)\n", inpixscale, outpixscale); outW = anwcs_imagew(outwcs); outH = anwcs_imageh(outwcs); logmsg("Output image will be %i x %i\n", outW, outH); outimg = malloc(outW * outH * sizeof(double)); for (i=0; i #include #include #include #include "resample.h" #include "os-features.h" #include "mathutil.h" #include "errors.h" #include "log.h" double lanczos(double x, int order) { if (x == 0) return 1.0; if (x > order || x < -order) return 0.0; return order * sin(M_PI * x) * sin(M_PI * x / (double)order) / square(M_PI * x); /* feclearexcept(FE_ALL_EXCEPT); double rtn = order * sin(M_PI * x) * sin(M_PI * x / (double)order) / square(M_PI * x); if (fetestexcept(FE_DIVBYZERO)) { printf("DIVBYZERO: %f\n", x); } if (fetestexcept(FE_INEXACT)) { printf("INEXACT: %f\n", x); } if (fetestexcept(FE_INVALID)) { printf("INVALID: %f\n", x); } if (fetestexcept(FE_OVERFLOW)) { printf("OVERFLOW: %f\n", x); } if (fetestexcept(FE_UNDERFLOW)) { printf("UNDERFLOW: %f\n", x); } return rtn; */ } #define MANGLEGLUE2(n,f) n ## _ ## f #define MANGLEGLUE(n,f) MANGLEGLUE2(n,f) #define MANGLE(func) MANGLEGLUE(func, numbername) #define numbername f #define number float #include "resample.inc" #undef numbername #undef number #define numbername d #define number double #include "resample.inc" #undef numbername #undef number #undef MANGLEGLUE2 #undef MANGLEGLUE #undef MANGLE astrometry.net-0.67/util/resample.inc000644 000765 000024 00000006045 12651445460 020053 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ double MANGLE(lanczos_resample_unw_sep)(double px, double py, const number* img, int W, int H, void* token) { lanczos_args_t* args = token; int order = args->order; int support = order; double weight; double sum; int x0,x1,y0,y1; const number* imgrow; int weighted = args->weighted; // pre-compute Lanczos kernel weights double KY[12]; double KX[12]; x0 = MAX(0, (int)floor(px - support)); y0 = MAX(0, (int)floor(py - support)); x1 = MIN(W-1, (int) ceil(px + support)); y1 = MIN(H-1, (int) ceil(py + support)); int nx,ny,dx,dy; nx = 1+x1-x0; ny = 1+y1-y0; assert(nx < 12); assert(ny < 12); for (dy=0; dyorder; int support = order; double weight; double sum; int x0,x1,y0,y1; int ix,iy; x0 = MAX(0, (int)floor(px - support)); y0 = MAX(0, (int)floor(py - support)); x1 = MIN(W-1, (int) ceil(px + support)); y1 = MIN(H-1, (int) ceil(py + support)); weight = 0.0; sum = 0.0; for (iy=y0; iy<=y1; iy++) { for (ix=x0; ix<=x1; ix++) { double K; number pix; number wt; double d; d = hypot(px - ix, py - iy); K = lanczos(d, order); if (K == 0) continue; if (weightimg) { wt = weightimg[iy*W + ix]; if (wt == 0.0) continue; } else wt = 1.0; pix = img[iy*W + ix]; if (isnan(pix)) // out-of-bounds pixel continue; /* if (!isfinite(pix)) { logverb("Pixel value: %g\n", pix); continue; } */ weight += K * wt; sum += K * wt * pix; } } if (out_wt) *out_wt = weight; return sum; } double MANGLE(nearest_resample)(double px, double py, const number* img, const number* weightimg, int W, int H, double* out_wt, void* token) { int ix = round(px); int iy = round(py); double wt; if (ix < 0 || ix >= W || iy < 0 || iy >= H) { if (out_wt) *out_wt = 0.0; return 0.0; } if (weightimg) wt = weightimg[iy * W + ix]; else wt = 1.0; if (out_wt) *out_wt = wt; return img[iy*W + ix] * wt; } astrometry.net-0.67/util/resample.py000644 000765 000024 00000037354 12651445460 017741 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import numpy as np class ResampleError(Exception): pass class OverlapError(ResampleError): pass class NoOverlapError(OverlapError): pass class SmallOverlapError(OverlapError): pass def resample_with_wcs(targetwcs, wcs, Limages=[], L=3, spline=True, splineFallback = True, splineStep = 25, splineMargin = 12, table=True, cinterp = True): ''' Returns (Yo,Xo, Yi,Xi, ims) Use the results like: target[Yo,Xo] = nearest_neighbour[Yi,Xi] # or target[Yo,Xo] = ims[i] raises NoOverlapError if the target and input WCSes do not overlap. Raises SmallOverlapError if they do not overlap "enough" (as described below). targetwcs, wcs: duck-typed WCS objects that must have: - properties "imagew", "imageh" - methods "r,d = pixelxy2radec(x, y)" - "ok,x,y = radec2pixelxy(ra, dec)" The WCS functions are expected to operate in FITS pixel-indexing. The WCS function must support 1-d, broadcasting, vectorized pixel<->radec calls. Limages: list of images to Lanczos-interpolate at the given Lanczos order. If empty, just returns nearest-neighbour indices. L: int, lanczos order spline: bool: use a spline interpolator to reduce the number of WCS calls. splineFallback: bool: the spline requires a certain amount of spatial overlap. With splineFallback = True, fall back to non-spline version. With splineFallback = False, just raises SmallOverlapError. splineStep: approximate grid size table: use Lanczos3 look-up table? ''' ### DEBUG #ps = PlotSequence('resample') ps = None H,W = int(targetwcs.imageh), int(targetwcs.imagew) h,w = int( wcs.imageh), int( wcs.imagew) for im in Limages: assert(im.shape == (h,w)) #print 'Target size', W, H #print 'Input size', w, h # First find the approximate bbox of the input image in # the target image so that we don't ask for way too # many out-of-bounds pixels... XY = [] for x,y in [(0,0), (w-1,0), (w-1,h-1), (0, h-1)]: # [-2:]: handle ok,ra,dec or ra,dec ok,xw,yw = targetwcs.radec2pixelxy( *(wcs.pixelxy2radec(float(x + 1), float(y + 1))[-2:])) XY.append((xw - 1, yw - 1)) XY = np.array(XY) x0,y0 = np.round(XY.min(axis=0)).astype(int) x1,y1 = np.round(XY.max(axis=0)).astype(int) if spline: # Now we build a spline that maps "target" pixels to "input" pixels # spline inputs: pixel coords in the 'target' image margin = splineMargin step = splineStep xlo = max(0, x0-margin) xhi = min(W-1, x1+margin) nx = np.ceil(float(xhi - xlo) / step) + 1 xx = np.linspace(xlo, xhi, nx) ylo = max(0, y0-margin) yhi = min(H-1, y1+margin) ny = np.ceil(float(yhi - ylo) / step) + 1 yy = np.linspace(ylo, yhi, ny) if ps: def expand_axes(): M = 100 ax = plt.axis() plt.axis([ax[0]-M, ax[1]+M, ax[2]-M, ax[3]+M]) plt.axis('scaled') plt.clf() plt.plot(XY[:,0], XY[:,1], 'ro') plt.plot(xx, np.zeros_like(xx), 'b.') plt.plot(np.zeros_like(yy), yy, 'c.') plt.plot(xx, np.zeros_like(xx)+max(yy), 'b.') plt.plot(max(xx) + np.zeros_like(yy), yy, 'c.') plt.plot([0,W,W,0,0], [0,0,H,H,0], 'k-') plt.title('A: Target image: bbox') expand_axes() ps.savefig() if (len(xx) == 0) or (len(yy) == 0): #print 'No overlap between input and target WCSes' raise NoOverlapError() if (len(xx) <= 3) or (len(yy) <= 3): #print 'Not enough overlap between input and target WCSes' if splineFallback: spline = False else: raise SmallOverlapError() if spline: # spline inputs -- pixel coords in the 'target' image # (xx, yy) # spline outputs -- pixel coords in the 'input' image # (XX, YY) # We use vectorized radec <-> pixelxy functions here R = targetwcs.pixelxy2radec(xx[np.newaxis,:] + 1, yy[:,np.newaxis] + 1) if len(R) == 3: ok = R[0] assert(np.all(ok)) ok,XX,YY = wcs.radec2pixelxy(*(R[-2:])) del R XX -= 1. YY -= 1. assert(np.all(ok)) del ok # ok,XX,YY = wcs.radec2pixelxy( # *(targetwcs.pixelxy2radec( # xx[np.newaxis,:] + 1, # yy[:,np.newaxis] + 1)[-2:])) # XX -= 1. # YY -= 1. # del ok # print 'Spline inputs:' # print xx # print yy # print 'Spline outputs:' # print XX # print YY if ps: plt.clf() plt.plot(Xo, Yo, 'b.') plt.plot([0,w,w,0,0], [0,0,h,h,0], 'k-') plt.title('B: Input image') expand_axes() ps.savefig() import scipy.interpolate as interp xspline = interp.RectBivariateSpline(xx, yy, XX.T) yspline = interp.RectBivariateSpline(xx, yy, YY.T) del XX del YY else: margin = 0 # Now, build the full pixel grid (in the ouput image) we want to # interpolate... ixo = np.arange(max(0, x0-margin), min(W, x1+margin+1), dtype=int) iyo = np.arange(max(0, y0-margin), min(H, y1+margin+1), dtype=int) if len(ixo) == 0 or len(iyo) == 0: raise NoOverlapError() if spline: # And run the interpolator. # [xy]spline() does a meshgrid-like broadcast, so fxi,fyi have # shape n(iyo),n(ixo) # # f[xy]i: floating-point pixel coords in the input image fxi = xspline(ixo, iyo).T.astype(np.float32) fyi = yspline(ixo, iyo).T.astype(np.float32) if ps: plt.clf() plt.plot(ixo, np.zeros_like(ixo), 'r,') plt.plot(np.zeros_like(iyo), iyo, 'm,') plt.plot(ixo, max(iyo) + np.zeros_like(ixo), 'r,') plt.plot(max(ixo) + np.zeros_like(iyo), iyo, 'm,') plt.plot([0,W,W,0,0], [0,0,H,H,0], 'k-') plt.title('C: Target image; i*o') expand_axes() ps.savefig() plt.clf() plt.plot(fxi, fyi, 'r,') plt.plot([0,w,w,0,0], [0,0,h,h,0], 'k-') plt.title('D: Input image, f*i') expand_axes() ps.savefig() else: # Use 2-d broadcasting pixel <-> radec functions here. # This can be rather expensive, with lots of WCS calls! R = targetwcs.pixelxy2radec(ixo[np.newaxis,:] + 1., iyo[:,np.newaxis] + 1.) if len(R) == 3: # ok,ra,dec R = R[1:] ok,fxi,fyi = wcs.radec2pixelxy(*R) assert(np.all(ok)) # ok,fxi,fyi = wcs.radec2pixelxy( # *targetwcs.pixelxy2radec(ixo[np.newaxis,:] + 1., # iyo[:,np.newaxis] + 1.)) del ok fxi -= 1. fyi -= 1. # print 'ixo', ixo.shape # print 'iyo', iyo.shape # print 'fxi', fxi.shape # print 'fyi', fyi.shape # Keep only in-bounds pixels. ## HACK -- 0.51 I = np.flatnonzero((fxi >= -0.5) * (fyi >= -0.5) * (fxi < w-0.51) * (fyi < h-0.51)) fxi = fxi.flat[I] fyi = fyi.flat[I] # i[xy]i: int coords in the input image ixi = np.round(fxi).astype(np.int32) iyi = np.round(fyi).astype(np.int32) #print 'dims', (len(iyo),len(ixo)) iy,ix = np.unravel_index(I, (len(iyo),len(ixo))) iyo = iyo[0] + iy ixo = ixo[0] + ix # i[xy]o: int coords in the target image if spline and ps: plt.clf() plt.plot(ixo, iyo, 'r,') plt.plot([0,W,W,0,0], [0,0,H,H,0], 'k-') plt.title('E: Target image; i*o') expand_axes() ps.savefig() plt.clf() plt.plot(fxi, fyi, 'r,') plt.plot([0,w,w,0,0], [0,0,h,h,0], 'k-') plt.title('F: Input image, f*i') expand_axes() ps.savefig() assert(np.all(ixo >= 0)) assert(np.all(iyo >= 0)) assert(np.all(ixo < W)) assert(np.all(iyo < H)) assert(np.all(ixi >= 0)) assert(np.all(iyi >= 0)) assert(np.all(ixi < w)) assert(np.all(iyi < h)) if len(Limages): dx = (fxi - ixi).astype(np.float32) dy = (fyi - iyi).astype(np.float32) del fxi del fyi # print 'dx', dx.min(), dx.max() # print 'dy', dy.min(), dy.max() # Lanczos interpolation. # number of pixels nn = len(ixo) NL = 2*L+1 # accumulators for each input image laccs = [np.zeros(nn, np.float32) for im in Limages] if cinterp: from util import lanczos3_interpolate # ixi = ixi.astype(np.int) # iyi = iyi.astype(np.int) # print 'ixi/iyi', ixi.shape, ixi.dtype, iyi.shape, iyi.dtype # print 'dx/dy', dx.shape, dx.dtype, dy.shape, dy.dtype rtn = lanczos3_interpolate(ixi, iyi, dx, dy, laccs, [lim.astype(np.float32) for lim in Limages]) # print 'rtn:', rtn else: _lanczos_interpolate(L, ixi, iyi, dx, dy, laccs, Limages, table=table) rims = laccs else: rims = [] return (iyo,ixo, iyi,ixi, rims) def _lanczos_interpolate(L, ixi, iyi, dx, dy, laccs, limages, table=True): ''' L: int, Lanczos order ixi: int, 1-d numpy array, len n, x coord in input images iyi: ----""---- y dx: float, 1-d numpy array, len n, fractional x coord dy: ----""---- y laccs: list of [float, 1-d numpy array, len n]: outputs limages list of [float, 2-d numpy array, shape h,w]: inputs ''' from miscutils import lanczos_filter lfunc = lanczos_filter if L == 3: try: from util import lanczos3_filter, lanczos3_filter_table # 0: no rangecheck if table: #lfunc = lambda nil,x,y: lanczos3_filter_table(x,y, 0) lfunc = lambda nil,x,y: lanczos3_filter_table(x,y, 1) else: lfunc = lambda nil,x,y: lanczos3_filter(x,y) except: pass h,w = limages[0].shape n = len(ixi) # sum of lanczos terms fsum = np.zeros(n) off = np.arange(-L, L+1) #fx = np.zeros(n) #fy = np.zeros(n) fx = np.zeros(n, np.float32) fy = np.zeros(n, np.float32) for oy in off: #print 'dy range:', min(-oy + dy), max(-oy + dy) lfunc(L, -oy + dy, fy) for ox in off: lfunc(L, -ox + dx, fx) #print 'dx range:', min(-ox + dx), max(-ox + dx) for lacc,im in zip(laccs, limages): lacc += fx * fy * im[np.clip(iyi + oy, 0, h-1), np.clip(ixi + ox, 0, w-1)] fsum += fx*fy for lacc in laccs: lacc /= fsum if __name__ == '__main__': import fitsio from astrometry.util.util import Sip,Tan import time import sys import pylab as plt from astrometry.util.util import lanczos3_filter, lanczos3_filter_table # x = np.linspace(-4, 4, 500) # L = np.zeros_like(x) # L2 = np.zeros(len(x), np.float32) # lanczos3_filter(x, L) # lanczos3_filter_table(x.astype(np.float32), L2, 1) # plt.clf() # plt.plot(x, L, 'r-') # plt.plot(x, L2, 'b-') # plt.savefig('l1.png') x = np.linspace(-3.5, 4.5, 8192).astype(np.float32) L1 = np.zeros_like(x) L2 = np.zeros_like(x) lanczos3_filter(x, L1) lanczos3_filter_table(x, L2, 1) print 'L2 - L1 RMS:', np.sqrt(np.mean((L2-L1)**2)) if True: ra,dec = 0.,0., pixscale = 1e-3 W,H = 10,1 cowcs = Tan(ra, dec, (W+1)/2., (H+1)/2., -pixscale, 0., 0., pixscale, W, H) dx,dy = 0.25, 0. wcs = Tan(ra, dec, (W+1)/2. + dx, (H+1)/2. + dy, -pixscale, 0., 0., pixscale, W, H) pix = np.zeros((H,W), np.float32) pix[0,W/2] = 1. Yo,Xo,Yi,Xi,(cpix,) = resample_with_wcs(cowcs, wcs, [pix], 3) print 'C', cpix Yo2,Xo2,Yi2,Xi2,(pypix,) = resample_with_wcs(cowcs, wcs, [pix], 3, cinterp=False, table=False) print 'Py', pypix print 'RMS', np.sqrt(np.mean((cpix - pypix)**2)) sys.exit(0) if True: ra,dec = 219.577111, 54.52 pixscale = 2.75 / 3600. W,H = 10,10 cowcs = Tan(ra, dec, (W+1)/2., (H+1)/2., -pixscale, 0., 0., pixscale, W, H) for i,(dx,dy) in enumerate([(0.01, 0.02), (0.1, 0.0), (0.2, 0.0), (0.3, 0.0), (0.4, 0.0), (0.5, 0.0), (0.6, 0.0), (0.7, 0.0), (0.8, 0.0), ]): wcs = Tan(ra, dec, (W+1)/2. + dx, (H+1)/2. + dy, -pixscale, 0., 0., pixscale, W, H) pix = np.zeros((H,W), np.float32) pix[H/2, :] = 1. pix[:, W/2] = 1. Yo,Xo,Yi,Xi,(cpix,) = resample_with_wcs(cowcs, wcs, [pix], 3) Yo2,Xo2,Yi2,Xi2,(pypix,) = resample_with_wcs(cowcs, wcs, [pix], 3, cinterp=False) cim = np.zeros((H,W)) cim[Yo,Xo] = cpix pyim = np.zeros((H,W)) pyim[Yo2,Xo2] = pypix plt.clf() plt.plot(cim[0,:], 'b-', alpha=0.5) plt.plot(cim[H/4,:], 'c-', alpha=0.5) plt.plot(pyim[0,:], 'r-', alpha=0.5) plt.plot(pyim[H/4,:], 'm-', alpha=0.5) plt.plot(1000. * (cim[0,:] - pyim[0,:]), 'k-', alpha=0.5) plt.savefig('p2-%02i.png' % i) sys.exit(0) ra,dec = 219.577111, 54.52 pixscale = 2.75 / 3600. #W,H = 2048, 2048 W,H = 512, 512 #W,H = 100,100 cowcs = Tan(ra, dec, (W+1)/2., (H+1)/2., -pixscale, 0., 0., pixscale, W, H) cowcs.write_to('co.wcs') if True: #intfn = '05579a167-w1-int-1b.fits' intfn = 'wise-frames/9a/05579a/167/05579a167-w1-int-1b.fits' wcs = Sip(intfn) pix = fitsio.read(intfn) pix[np.logical_not(np.isfinite(pix))] = 0. print 'pix', pix.shape, pix.dtype for i in range(5): t0 = time.clock() Yo,Xo,Yi,Xi,ims = resample_with_wcs(cowcs, wcs, [pix], 3) t1 = time.clock() - t0 print 'C resampling took', t1 t0 = time.clock() Yo2,Xo2,Yi2,Xi2,ims2 = resample_with_wcs(cowcs, wcs, [pix], 3, cinterp=False, table=False) t2 = time.clock() - t0 print 'py resampling took', t2 out = np.zeros((H,W)) out[Yo,Xo] = ims[0] fitsio.write('resampled-c.fits', out, clobber=True) cout = out out = np.zeros((H,W)) out[Yo,Xo] = ims2[0] fitsio.write('resampled-py.fits', out, clobber=True) pyout = out plt.clf() plt.imshow(cout, interpolation='nearest', origin='lower') plt.colorbar() plt.savefig('c.png') plt.clf() plt.imshow(pyout, interpolation='nearest', origin='lower') plt.colorbar() plt.savefig('py.png') plt.clf() plt.imshow(cout - pyout, interpolation='nearest', origin='lower') plt.colorbar() plt.savefig('diff.png') print 'Max diff:', np.abs(cout - pyout).max() astrometry.net-0.67/util/run_command.py000644 000765 000024 00000003671 12651445460 020426 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import subprocess import os import select from subprocess import PIPE # Returns (rtn, out, err) def run_command(cmd, timeout=None, callback=None, stdindata=None): """ Run a command and return the text written to stdout and stderr, plus the return value. Returns: (int return value, string out, string err) """ child = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (fin, fout, ferr) = (child.stdin, child.stdout, child.stderr) stdin = fin.fileno() stdout = fout.fileno() stderr = ferr.fileno() outbl = [] errbl = [] ineof = outeof = erreof = False block = 1024 while True: readers = [] writers = [] if not ineof: writers.append(stdin) if not outeof: readers.append(stdout) if not erreof: readers.append(stderr) if not len(readers): break (ready_readers, ready_writers, _) = select.select(readers, writers, [], timeout) if stdin in ready_writers and stdindata: bytes_written = os.write(stdin, stdindata[:block]) stdindata = stdindata[bytes_written:] if not stdindata: fin.close() ineof = True if stdout in ready_readers: outchunk = os.read(stdout, block) if len(outchunk) == 0: outeof = True outbl.append(outchunk) if stderr in ready_readers: errchunk = os.read(stderr, block) if len(errchunk) == 0: erreof = True errbl.append(errchunk) if callback: callback() fout.close() ferr.close() w = child.wait() out = ''.join(outbl) err = ''.join(errbl) if not os.WIFEXITED(w): return (-100, out, err) rtn = os.WEXITSTATUS(w) return (rtn, out, err) astrometry.net-0.67/util/scamp-catalog.c000644 000765 000024 00000013751 12651445460 020431 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "scamp-catalog.h" #include "fitstable.h" #include "fitsioutils.h" #include "qfits_header.h" #include "errors.h" #include "log.h" scamp_cat_t* scamp_catalog_open_for_writing(const char* filename, anbool ref) { scamp_cat_t* scamp; scamp = calloc(1, sizeof(scamp_cat_t)); scamp->table = fitstable_open_for_writing(filename); if (!scamp->table) { ERROR("Failed to open scamp catalog for writing"); free(scamp); return NULL; } scamp->ref = ref; return scamp; } int scamp_catalog_write_field_header(scamp_cat_t* scamp, const qfits_header* hdr) { int i, N; qfits_header* h; char* hdrstring; qfits_header* freehdr = NULL; tfits_type dubl = fitscolumn_double_type(); tfits_type i16 = fitscolumn_i16_type(); if (fitstable_write_primary_header(scamp->table)) { ERROR("Failed to write scamp catalog primary header.\n"); return -1; } if (!hdr) { freehdr = qfits_header_default(); fits_header_add_int(freehdr, "BITPIX", 0, NULL); fits_header_add_int(freehdr, "NAXIS", 2, NULL); fits_header_add_int(freehdr, "NAXIS1", 0, NULL); fits_header_add_int(freehdr, "NAXIS2", 0, NULL); hdr = freehdr; } // Table is one row x one column (array of (N*80) characters) // TDIM1 is "(80, N)" // EXTNAME = "LDAC_IMHEAD" // 80 is FITS_LINESZ // How many cards are in the header? N = qfits_header_n(hdr); fitstable_add_write_column_array(scamp->table, fitscolumn_char_type(), N * FITS_LINESZ, "Field Header Card", NULL); h = fitstable_get_header(scamp->table); fits_header_addf(h, "TDIM1", "shape of header: FITS cards", "(%i, %i)", FITS_LINESZ, N); qfits_header_add(h, "EXTNAME", "LDAC_IMHEAD", "", NULL); if (fitstable_write_header(scamp->table)) { ERROR("Failed to write scamp catalog header.\n"); return -1; } // +1 because qfits_header_write_line adds a trailing '\0'. hdrstring = malloc(N * FITS_LINESZ + 1); for (i=0; itable, hdrstring)) { ERROR("Failed to write scamp catalog field header"); return -1; } free(hdrstring); if (fitstable_pad_with(scamp->table, ' ') || fitstable_fix_header(scamp->table)) { ERROR("Failed to fix scamp catalog header.\n"); return -1; } fitstable_next_extension(scamp->table); fitstable_clear_table(scamp->table); if (scamp->ref) { fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, ra), dubl, "RA", "deg"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, dec), dubl, "DEC", "deg"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, err_a), dubl, "ERR_A", "pixels"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, err_b), dubl, "ERR_B", "pixels"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, mag), dubl, "MAG", "mag"); // Not used by Scamp! fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_ref_t, err_mag), dubl, "MAG_ERR", "mag"); } else { fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, x), dubl, "X_IMAGE", "pixels"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, y), dubl, "Y_IMAGE", "pixels"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, err_a), dubl, "ERR_A", "pixels"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, err_b), dubl, "ERR_B", "pixels"); // Scamp ignores this. fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, err_theta), dubl, "ERR_THETA", "deg"); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, flux), dubl, "FLUX", NULL); fitstable_add_write_column_struct(scamp->table, dubl, 1, offsetof(scamp_obj_t, err_flux), dubl, "FLUX_ERR", NULL); // this column is optional. fitstable_add_write_column_struct(scamp->table, i16, 1, offsetof(scamp_obj_t, flags), i16, "FLAGS", NULL); } h = fitstable_get_header(scamp->table); qfits_header_add(h, "EXTNAME", "LDAC_OBJECTS", "", NULL); if (fitstable_write_header(scamp->table)) { ERROR("Failed to write scamp catalog object header.\n"); return -1; } return 0; } int scamp_catalog_write_object(scamp_cat_t* scamp, const scamp_obj_t* obj) { assert(!scamp->ref); return fitstable_write_struct(scamp->table, obj); } int scamp_catalog_write_reference(scamp_cat_t* scamp, const scamp_ref_t* ref) { assert(scamp->ref); return fitstable_write_struct(scamp->table, ref); } int scamp_catalog_close(scamp_cat_t* scamp) { if (fitstable_fix_header(scamp->table) || fitstable_close(scamp->table)) { ERROR("Failed to close scamp catalog"); return -1; } free(scamp); return 0; } astrometry.net-0.67/util/scamp.c000644 000765 000024 00000007145 12651445460 017021 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "scamp.h" #include "scamp-catalog.h" #include "sip_qfits.h" #include "errors.h" #include "log.h" int scamp_write_field(const qfits_header* imageheader, const sip_t* wcs, const starxy_t* xy, const char* filename) { scamp_cat_t* scamp; qfits_header* hdr; int i; if (!imageheader) hdr = qfits_table_prim_header_default(); else hdr = qfits_header_copy(imageheader); sip_add_to_header(hdr, wcs); scamp = scamp_catalog_open_for_writing(filename, FALSE); if (!scamp) { return -1; } if (scamp_catalog_write_field_header(scamp, hdr)) { return -1; } qfits_header_destroy(hdr); for (i=0; iflux) obj.flux = xy->flux[i]; else obj.flux = 1000.0; obj.err_flux = 1.0; obj.flags = 0; if (scamp_catalog_write_object(scamp, &obj)) { return -1; } } if (scamp_catalog_close(scamp)) { return -1; } return 0; } int scamp_write_config_file(const char* refcatfn, const char* outfn) { FILE* fid; char* text; int res; fid = fopen(outfn, "w"); if (!fid) { SYSERROR("Failed to open file %s to write Scamp config file", outfn); return -1; } text = scamp_get_config_options(refcatfn); res = fprintf(fid, "%s", text); free(text); if (res < 0) { SYSERROR("Failed to write to Scamp config file %s", outfn); return -1; } if (fclose(fid)) { SYSERROR("Failed to close to Scamp config file %s", outfn); return -1; } return 0; } char* scamp_get_config_options(const char* refcatfn) { char* res; char* fmt = "## These are SCAMP config file entries to get Scamp to read the\n" "## catalogs generated by the Astrometry.net Scamp integration code.\n" "#\n" "# The following decribe the reference catalog:\n" "# Read from a local file.\n" "ASTREF_CATALOG FILE\n" "# You can also set this to: USNO-B1, SDSS-R7, 2MASS, etc\n" "# The reference catalog file name is:\n" "ASTREFCAT_NAME %s\n" "# The reference catalog (RA,Dec) in degrees: column names in file\n" "ASTREFCENT_KEYS RA, DEC\n" "# The reference catalog (RA,Dec) error ellipse: column names\n" "ASTREFERR_KEYS ERR_A, ERR_B\n" "# The reference catalog magnitude: column names\n" "ASTREFMAG_KEY MAG\n" "#\n" "# The following decribe the input catalog:\n" "#\n" "# The (x,y) source positions in pixels: column names\n" "CENTROID_KEYS X_IMAGE, Y_IMAGE\n" "# The source positions should get distortions\n" "DISTORT_KEYS X_IMAGE, Y_IMAGE\n" "# The error ellipse in source positions: column names\n" "CENTROIDERR_KEYS ERR_A, ERR_B\n" "# The flux: column name\n" "PHOTFLUX_KEY FLUX\n" "# The flux error: column name\n" "PHOTFLUXERR_KEY FLUX_ERR\n" "# Don't run Scamp's matching procedure to get initial WCS\n" "# (use the Astrometry.net solution!)\n" "MATCH N\n" "#\n" "## End of Astrometry.net Scamp integration config items\n" ; asprintf_safe(&res, fmt, refcatfn); return res; } astrometry.net-0.67/util/search-index.c000644 000765 000024 00000011662 12651445460 020267 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "os-features.h" #include "index.h" #include "starutil.h" #include "log.h" #include "errors.h" #include "ioutils.h" #include "boilerplate.h" #include "tic.h" #include "fitstable.h" static const char* OPTIONS = "hvr:d:R:o:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] \n" " -r (deg)\n" " -d (deg)\n" " -R (deg)\n" " [-o ]: save results in FITS table; tag-along columns must be the same in all indices\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char **argv) { int argchar; double ra=HUGE_VAL, dec=HUGE_VAL, radius=HUGE_VAL; int loglvl = LOG_MSG; char** myargs; int nmyargs; int i; char* outfn = NULL; fitstable_t* table = NULL; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'o': outfn = optarg; break; case 'r': ra = atof(optarg); break; case 'd': dec = atof(optarg); break; case 'R': radius = atof(optarg); break; case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': default: printHelp(argv[0]); return -1; } log_init(loglvl); nmyargs = argc - optind; myargs = argv + optind; if (nmyargs < 1) { printHelp(argv[0]); exit(-1); } if (ra == HUGE_VAL || dec == HUGE_VAL || radius == HUGE_VAL) { printHelp(argv[0]); exit(-1); } if (outfn) { table = fitstable_open_for_writing(outfn); if (!table) { ERROR("Failed to open output table"); exit(-1); } if (fitstable_write_primary_header(table)) { ERROR("Failed to write primary header of output table"); exit(-1); } } for (i=0; i 0) { fitstable_next_extension(table); fitstable_clear_table(table); } tagtable = startree_get_tagalong(index.starkd); if (tagtable) { fitstable_add_fits_columns_as_struct(tagtable); logverb("Input tag-along table:\n"); if (log_get_level() >= LOG_VERB) fitstable_print_columns(tagtable); fitstable_copy_columns(tagtable, table); } tagsize = fitstable_get_struct_size(table); debug("tagsize=%i\n", tagsize); // Add RA,Dec at the end of the row... fitstable_add_write_column_struct(table, fitscolumn_double_type(), 1, tagsize, fitscolumn_double_type(), "RA", "degrees"); fitstable_add_write_column_struct(table, fitscolumn_double_type(), 1, tagsize + sizeof(double), fitscolumn_double_type(), "DEC", "degrees"); rowsize = fitstable_get_struct_size(table); assert(rowsize == tagsize + 2*sizeof(double)); debug("rowsize=%i\n", rowsize); rowbuf = malloc(rowsize); logverb("Output table:\n"); if (log_get_level() >= LOG_VERB) fitstable_print_columns(table); if (fitstable_write_header(table)) { ERROR("Failed to write header of output table"); exit(-1); } for (j=0; j', ' ', '\t', '\n', '$', "'", '"', "`") # (note, \\ must be first!) for x in repl: s = s.replace(x, '\\'+x) return s # escape a string that will appear inside double-quotes. def shell_escape_inside_quotes(s): repl = ('\\', '\t', '`', '"', '$') # (note, \\ must be first!) for x in repl: s = s.replace(x, '\\'+x) return s astrometry.net-0.67/util/siap.py000644 000765 000024 00000003345 12651445460 017056 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from xml.dom import minidom, Node from numpy import * from astrometry.util.fits import * def siap_parse_result(fn=None): dom1 = minidom.parse(fn) tables = dom1.getElementsByTagName('TABLE') assert(len(tables) == 1) table = tables[0] fields = table.getElementsByTagName('FIELD') print '%i fields' % len(fields) fieldnames = [] fieldtypes = [] fieldparser = [] fieldisarray = [] for f in fields: name = f.getAttribute('name').lower().replace('[]', '') print 'field:', name, ftype = f.getAttribute('datatype').lower() print '(%s)' % ftype farray = f.hasAttribute('arraysize') ftmap = {'int':int, 'double':float, 'float':float, 'char':str, } fieldnames.append(name) fieldtypes.append(ftype) fieldparser.append(ftmap.get(ftype)) fieldisarray.append(farray) data = table.getElementsByTagName('TABLEDATA') assert(len(data) == 1) data = data[0] rows = data.getElementsByTagName('TR') print '%i rows' % len(rows) datarows = [] for r in rows: cols = r.getElementsByTagName('TD') assert(len(cols) == len(fields)) datacol = [] for c,ft,fp,fa in zip(cols, fieldtypes, fieldparser, fieldisarray): assert(c.firstChild) c = c.firstChild assert(c.nodeType == Node.TEXT_NODE) c = c.nodeValue datum = None if fa and ft in ['int','double']: elements = c.split(',') datum = array([fp(x) for x in elements]) elif fp: datum = fp(c) else: datum = c datacol.append(datum) datarows.append(datacol) t = tabledata() for i,f in enumerate(fieldnames): t.set(str(f), array([r[i] for r in datarows])) t._length = len(datarows) return t astrometry.net-0.67/util/simplexy.c000644 000765 000024 00000034445 12651445460 017573 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "simplexy.h" #include "ctmf.h" #include "dimage.h" #include "simplexy-common.h" #include "log.h" #include "errors.h" #include "resample.h" #include "an-bool.h" /* * simplexy.c * * Find sources in a float image. * * Algorithm outline: * 1. Estimate image noise * 2. Median filter and subtract to eliminate low-frequence sky gradient * 3. Find statistically significant pixels * - Mask those pixels and a box around them * 4. Do connected components analysis on the resulting mask to find each * component (source) * 5. Find the peaks in each object * For each object: * - Find the objects boundary * - Cut it out * - Smooth it * - Find peaks in resulting cutout * - Chose the most representative peak * 6. Extract the flux of each object as the value of the image at the peak * * BUGS: * * Note: To make simplexy() reentrant, do the following: * #define SIMPLEXY_REENTRANT * Or compile all the simplexy files with -DSIMPLEXY_REENTRANT * * Mike Blanton * 1/2006 * */ /** Some testing: wget "http://antwrp.gsfc.nasa.gov/apod/image/0910/pleiades_andreo.jpg" jpegtopnm pleiades_andreo.jpg | pnmcut 0 0 500 400 | ppmtopgm | pnmtofits > img.fits an-fitstopnm -N 0 -X 255 -i img.fits | pnmtopng > img.png image2xy -O -p 5 -o img-u8.xy -v -S bgsub.fits -B bg.fits -M mask.fits -U smooth-u8.fits img.fits an-fitstopnm -N 0 -X 255 -i bgsub.fits | pnmtopng > bgsub-u8.png an-fitstopnm -N 0 -X 255 -i bg.fits | pnmtopng > bg-u8.png an-fitstopnm -N 0 -X 255 -i mask.fits | pnmtopng > mask-u8.png an-fitstopnm -N 0 -X 255 -i smooth-u8.fits | pnmtopng > smooth-u8.png tabsort -d FLUX img-u8.xy sorted-u8.xy pngtopnm img.png | plotxy -i sorted-u8.xy -I - -x 1 -y 1 -N 100 -C red -P | plotxy -i sorted-u8.xy -I - -x 1 -y 1 -n 100 -C red -r 2 -o objs-u8.png image2xy -8 -O -p 5 -o img.xy -v -S bgsub.fits -B bg.fits -M mask.fits -U smooth-f.fits img.fits an-fitstopnm -N 0 -X 255 -i bgsub.fits | pnmtopng > bgsub-f.png an-fitstopnm -N 0 -X 255 -i bg.fits | pnmtopng > bg-f.png an-fitstopnm -N 0 -X 255 -i mask.fits | pnmtopng > mask-f.png an-fitstopnm -N 0 -X 255 -i smooth-f.fits | pnmtopng > smooth-f.png python <dpsf == 0) s->dpsf = SIMPLEXY_DEFAULT_DPSF; if (s->plim == 0) s->plim = SIMPLEXY_DEFAULT_PLIM; if (s->dlim == 0) s->dlim = SIMPLEXY_DEFAULT_DLIM; if (s->saddle == 0) s->saddle = SIMPLEXY_DEFAULT_SADDLE; if (s->maxper == 0) s->maxper = SIMPLEXY_DEFAULT_MAXPER; if (s->maxsize == 0) s->maxsize = SIMPLEXY_DEFAULT_MAXSIZE; if (s->halfbox == 0) s->halfbox = SIMPLEXY_DEFAULT_HALFBOX; if (s->maxnpeaks == 0) s->maxnpeaks = SIMPLEXY_DEFAULT_MAXNPEAKS; } void simplexy_fill_in_defaults_u8(simplexy_t* s) { if (s->plim == 0) s->plim = SIMPLEXY_U8_DEFAULT_PLIM; if (s->saddle == 0) s->saddle = SIMPLEXY_U8_DEFAULT_SADDLE; simplexy_fill_in_defaults(s); } void simplexy_set_u8_defaults(simplexy_t* s) { memset(s, 0, sizeof(simplexy_t)); simplexy_fill_in_defaults_u8(s); } void simplexy_set_defaults(simplexy_t* s) { memset(s, 0, sizeof(simplexy_t)); simplexy_fill_in_defaults(s); } void simplexy_free_contents(simplexy_t* s) { free(s->image); s->image = NULL; free(s->image_u8); s->image_u8 = NULL; free(s->x); s->x = NULL; free(s->y); s->y = NULL; free(s->flux); s->flux = NULL; free(s->background); s->background = NULL; free(s->fluxL); free(s->backgroundL); s->fluxL = s->backgroundL = NULL; } int simplexy_run(simplexy_t* s) { int i; int nx = s->nx; int ny = s->ny; float limit; uint8_t* mask; // background-subtracted image. float* bgsub = NULL; int16_t* bgsub_i16 = NULL; // malloc'd background image to free. void* bgfree = NULL; // PSF-smoothed image. float* smoothed = NULL; // malloc'd smoothed image to free. void* smoothfree = NULL; // Connected-components image. int* ccimg = NULL; int nblobs; /* Exactly one of s->image and s->image_u8 should be non-NULL.*/ assert(s->image || s->image_u8); assert(!s->image || !s->image_u8); logverb("simplexy: nx=%d, ny=%d\n", nx, ny); logverb("simplexy: dpsf=%f, plim=%f, dlim=%f, saddle=%f\n", s->dpsf, s->plim, s->dlim, s->saddle); logverb("simplexy: maxper=%d, maxnpeaks=%d, maxsize=%d, halfbox=%d\n", s->maxper, s->maxnpeaks, s->maxsize, s->halfbox); if (s->invert) { if (s->image) { for (i=0; iimage[i] = -s->image[i]; } else { for (i=0; iimage_u8[i] = 255 - s->image_u8[i]; } } if (s->nobgsub) { if (s->image) bgsub = s->image; else { bgsub_i16 = malloc(nx * ny * sizeof(int16_t)); bgfree = bgsub_i16; for (i=0; iimage_u8[i]; } } else { // background subtraction via median smoothing. logverb("simplexy: median smoothing...\n"); if (s->image) { float* medianfiltered; medianfiltered = malloc(nx * ny * sizeof(float)); bgfree = medianfiltered; dmedsmooth(s->image, NULL, nx, ny, s->halfbox, medianfiltered); if (s->bgimgfn) { logverb("Writing background (median-filtered) image \"%s\"\n", s->bgimgfn); write_fits_float_image(medianfiltered, nx, ny, s->bgimgfn); } // subtract background from image, placing result in background. for (i=0; iimage[i] - medianfiltered[i]; bgsub = medianfiltered; medianfiltered = NULL; } else { // u8 image: run faster ctmf() median-smoother. unsigned char* medianfiltered_u8; if (MIN(nx,ny) < 2*s->halfbox+1) s->halfbox = floor(((float)MIN(nx,ny) - 1.0) / 2.0); assert(MIN(nx,ny) >= 2*s->halfbox+1); medianfiltered_u8 = malloc(nx * ny * sizeof(unsigned char)); ctmf(s->image_u8, medianfiltered_u8, nx, ny, nx, nx, s->halfbox, 1, 512*1024); if (s->bgimgfn) { logverb("Writing background (median-filtered) image \"%s\"\n", s->bgimgfn); write_fits_u8_image(medianfiltered_u8, nx, ny, s->bgimgfn); } // Background-subtracted image. bgsub_i16 = malloc(nx * ny * sizeof(int16_t)); bgfree = bgsub_i16; for (i=0; iimage_u8[i] - (int16_t)medianfiltered_u8[i]; bgsub_i16[i] = s->image_u8[i] - medianfiltered_u8[i]; free(medianfiltered_u8); } if (s->bgsubimgfn) { logverb("Writing background-subtracted image \"%s\"\n", s->bgsubimgfn); if (bgsub) write_fits_float_image(bgsub, nx, ny, s->bgsubimgfn); else write_fits_i16_image(bgsub_i16, nx, ny, s->bgsubimgfn); } } if (s->dpsf > 0.0) { smoothed = malloc(nx * ny * sizeof(float)); smoothfree = smoothed; /* smooth by the point spread function (the optimal detection filter, since we assume a symmetric Gaussian PSF) */ if (bgsub) dsmooth2(bgsub, nx, ny, s->dpsf, smoothed); else dsmooth2_i16(bgsub_i16, nx, ny, s->dpsf, smoothed); } else { if (bgsub) smoothed = bgsub; else { smoothed = malloc(nx * ny * sizeof(float)); smoothfree = smoothed; for (i=0; i<(nx*ny); i++) smoothed[i] = bgsub_i16[i]; } } if (s->smoothimgfn) { logverb("Writing smoothed background-subtracted image \"%s\"\n", s->smoothimgfn); write_fits_float_image(smoothed, nx, ny, s->smoothimgfn); } // estimate the noise in the image (sigma) if (s->sigma == 0.0) { logverb("simplexy: measuring image noise (sigma)...\n"); if (s->image_u8) dsigma_u8(s->image_u8, nx, ny, 5, 0, &(s->sigma)); else dsigma(s->image, nx, ny, 5, 0, &(s->sigma)); logverb("simplexy: found sigma=%g.\n", s->sigma); } else { logverb("simplexy: assuming sigma=%g.\n", s->sigma); } /* The noise in the psf-smoothed image is (approximately) * sigma / (2 * sqrt(pi) * dpsf) * This ignores the pixelization, replacing the sum by integral. * The difference is only significant for small sigma, which * would mean your image is undersampled anyway. */ logverb("simplexy: finding objects...\n"); limit = (s->sigma / (2.0 * sqrt(M_PI) * s->dpsf)) * s->plim; if (s->globalbg != 0.0) { limit += s->globalbg; logverb("Increased detection limit by %g to %g to compensate for global background level\n", s->globalbg, limit); } /* find pixels above the noise level, and flag a box of pixels around each one. */ mask = malloc(nx*ny); if (!dmask(smoothed, nx, ny, limit, s->dpsf, mask)) { FREEVEC(smoothfree); return 0; } FREEVEC(smoothfree); /* save the mask image, if requested. */ if (s->maskimgfn) { logverb("Writing masked image \"%s\"\n", s->maskimgfn); if (s->image_u8) { uint8_t* maskedimg = malloc(nx * ny); for (i=0; iimage_u8[i]; write_fits_u8_image(maskedimg, nx, ny, s->maskimgfn); free(maskedimg); } else { float* maskedimg = malloc(nx * ny * sizeof(float)); for (i=0; iimage[i]; write_fits_float_image(maskedimg, nx, ny, s->maskimgfn); free(maskedimg); } } /* find connected-components in the mask image. */ ccimg = malloc(nx * ny * sizeof(int)); dfind2_u8(mask, nx, ny, ccimg, &nblobs); FREEVEC(mask); logverb("simplexy: found %i blobs\n", nblobs); if (s->blobimgfn) { int j; uint8_t* blobimg = malloc(nx * ny); logverb("Writing blob image \"%s\"\n", s->blobimgfn); memset(blobimg, 0, sizeof(uint8_t) * nx*ny); for (j=0; j 0 && (ccimg[ii] != ccimg[ii - 1])) edge = TRUE; if (i < (nx-1) && (ccimg[ii] != ccimg[ii + 1])) edge = TRUE; if (j > 0 && (ccimg[ii] != ccimg[ii - nx])) edge = TRUE; if (j < (ny-1) && (ccimg[ii] != ccimg[ii + nx])) edge = TRUE; if (edge) blobimg[ii] = 255; else if (ccimg[ii] != -1) blobimg[ii] = 127; } } write_fits_u8_image(blobimg, nx, ny, s->blobimgfn); free(blobimg); } s->x = malloc(s->maxnpeaks * sizeof(float)); s->y = malloc(s->maxnpeaks * sizeof(float)); /* find all peaks within each object */ logverb("simplexy: finding peaks...\n"); if (bgsub) dallpeaks(bgsub, nx, ny, ccimg, s->x, s->y, &(s->npeaks), s->dpsf, s->sigma, s->dlim, s->saddle, s->maxper, s->maxnpeaks, s->sigma, s->maxsize); else dallpeaks_i16(bgsub_i16, nx, ny, ccimg, s->x, s->y, &(s->npeaks), s->dpsf, s->sigma, s->dlim, s->saddle, s->maxper, s->maxnpeaks, s->sigma, s->maxsize); logmsg("simplexy: found %i sources.\n", s->npeaks); FREEVEC(ccimg); s->x = realloc(s->x, s->npeaks * sizeof(float)); s->y = realloc(s->y, s->npeaks * sizeof(float)); s->flux = malloc(s->npeaks * sizeof(float)); s->background = malloc(s->npeaks * sizeof(float)); if (s->Lorder) { s->fluxL = malloc(s->npeaks * sizeof(float)); s->backgroundL = malloc(s->npeaks * sizeof(float)); } for (i = 0; i < s->npeaks; i++) { // round int ix = (int)(s->x[i] + 0.5); int iy = (int)(s->y[i] + 0.5); Unused anbool finite; finite = isfinite(s->x[i]); assert(finite); finite = isfinite(s->y[i]); assert(finite); // these coordinates are now 0,0 is center of first pixel. assert(ix >= 0); assert(iy >= 0); assert(ix < nx); assert(iy < ny); if (bgsub) { s->flux[i] = bgsub[ix + iy * nx]; s->background[i] = s->image[ix + iy * nx] - s->flux[i]; } else { s->flux[i] = bgsub_i16[ix + iy * nx]; s->background[i] = (float)s->image_u8[ix + iy * nx] - s->flux[i]; } s->flux[i] -= s->globalbg; s->background[i] += s->globalbg; if (s->Lorder) { lanczos_args_t L; double fL, iL; L.order = s->Lorder; if (bgsub) { /* fL = lanczos_resample_f(s->x[i], s->y[i], bgsub, NULL, nx, ny, NULL, &L); iL = lanczos_resample_f(s->x[i], s->y[i], s->image, NULL, nx, ny, NULL, &L); */ fL = lanczos_resample_unw_sep_f(s->x[i], s->y[i], bgsub, nx, ny, &L); iL = lanczos_resample_unw_sep_f(s->x[i], s->y[i], s->image, nx, ny, &L); } else { int N = 2*L.order+1; float* tempimg = malloc(N*N*sizeof(float)); int xlo,xhi,ylo,yhi; int j,k; xlo = MAX(0, ix-L.order); xhi = MIN(nx-1, ix+L.order); ylo = MAX(0, iy-L.order); yhi = MIN(ny-1, iy+L.order); for (j=ylo; j<=yhi; j++) for (k=xlo; k<=xhi; k++) tempimg[(j-ylo)*N+(k-xlo)] = bgsub_i16[j*nx+k]; //fL = lanczos_resample_f(s->x[i]-xlo, s->y[i]-ylo, //tempimg, NULL, N, N, NULL, &L); fL = lanczos_resample_unw_sep_f(s->x[i]-xlo, s->y[i]-ylo, tempimg, N, N, &L); for (j=ylo; j<=yhi; j++) for (k=xlo; k<=xhi; k++) tempimg[(j-ylo)*N+(k-xlo)] = s->image_u8[j*nx+k]; //iL = lanczos_resample_f(s->x[i]-xlo, s->y[i]-ylo, //tempimg, NULL, N, N, NULL, &L); iL = lanczos_resample_unw_sep_f(s->x[i]-xlo, s->y[i]-ylo, tempimg, N, N, &L); free(tempimg); } s->fluxL[i] = fL; s->backgroundL[i] = iL - fL; s->fluxL[i] -= s->globalbg; s->backgroundL[i] += s->globalbg; } } FREEVEC(bgfree); return 1; } void simplexy_clean_cache() { dselip_cleanup(); } astrometry.net-0.67/util/sip-utils.c000644 000765 000024 00000040111 12651445460 017635 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "os-features.h" #include "sip-utils.h" #include "gslutils.h" #include "starutil.h" #include "mathutil.h" #include "errors.h" #include "log.h" double wcs_pixel_center_for_size(double size) { return 0.5 + 0.5 * size; } void tan_rotate(const tan_t* tanin, tan_t* tanout, double angle) { double s,c; double newcd[4]; memmove(tanout, tanin, sizeof(tan_t)); s = sin(deg2rad(angle)); c = cos(deg2rad(angle)); newcd[0] = c*tanin->cd[0][0] + s*tanin->cd[1][0]; newcd[1] = c*tanin->cd[0][1] + s*tanin->cd[1][1]; newcd[2] = -s*tanin->cd[0][0] + c*tanin->cd[1][0]; newcd[3] = -s*tanin->cd[0][1] + c*tanin->cd[1][1]; tanout->cd[0][0] = newcd[0]; tanout->cd[0][1] = newcd[1]; tanout->cd[1][0] = newcd[2]; tanout->cd[1][1] = newcd[3]; } int sip_ensure_inverse_polynomials(sip_t* sip) { if ((sip->a_order == 0 && sip->b_order == 0) || (sip->ap_order > 0 && sip->bp_order > 0)) { return 0; } sip->ap_order = sip->bp_order = MAX(sip->a_order, sip->b_order) + 1; return sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); } int sip_compute_inverse_polynomials(sip_t* sip, int NX, int NY, double xlo, double xhi, double ylo, double yhi) { int inv_sip_order; int M, N; int i, j, p, q, gu, gv; double maxu, maxv, minu, minv; double u, v, U, V; gsl_matrix *mA; gsl_vector *b1, *b2, *x1, *x2; tan_t* tan; assert(sip->a_order == sip->b_order); assert(sip->ap_order == sip->bp_order); tan = &(sip->wcstan); logverb("sip_compute-inverse_polynomials: A %i, AP %i\n", sip->a_order, sip->ap_order); /* basic idea: lay down a grid in image, for each gridpoint, push through the polynomial to get yourself into warped image coordinate (but not yet lifted onto the sky). Then, using the set of warped gridpoints as inputs, fit back to their original grid locations as targets. */ inv_sip_order = sip->ap_order; // Number of grid points to use: if (NX == 0) NX = 10 * (inv_sip_order + 1); if (NY == 0) NY = 10 * (inv_sip_order + 1); if (xhi == 0) xhi = tan->imagew; if (yhi == 0) yhi = tan->imageh; logverb("NX,NY %i,%i, x range [%f, %f], y range [%f, %f]\n", NX,NY, xlo, xhi, ylo, yhi); // Number of coefficients to solve for: // We only compute the upper triangle polynomial terms N = (inv_sip_order + 1) * (inv_sip_order + 2) / 2; // Number of samples to fit. M = NX * NY; mA = gsl_matrix_alloc(M, N); b1 = gsl_vector_alloc(M); b2 = gsl_vector_alloc(M); assert(mA); assert(b1); assert(b2); /* * Rearranging formula (4), (5), and (6) from the SIP paper gives the * following equations: * * +----------------------- Linear pixel coordinates in PIXELS * | before SIP correction * | +--- Intermediate world coordinates in DEGREES * | | * v v * -1 * U = [CD11 CD12] * x * V [CD21 CD22] y * * +---------------- PIXEL distortion delta from telescope to * | linear coordinates * | +----------- Linear PIXEL coordinates before SIP correction * | | +--- Polynomial U,V terms in powers of PIXELS * v v v * * -f(u1,v1) = p11 p12 p13 p14 p15 ... * ap1 * -f(u2,v2) = p21 p22 p23 p24 p25 ... ap2 * ... * * -g(u1,v1) = p11 p12 p13 p14 p15 ... * bp1 * -g(u2,v2) = p21 p22 p23 p24 p25 ... bp2 * ... * * which recovers the A and B's. */ minu = xlo - tan->crpix[0]; maxu = xhi - tan->crpix[0]; minv = ylo - tan->crpix[1]; maxv = yhi - tan->crpix[1]; // Sample grid locations. i = 0; for (gu=0; gu inv_sip_order) continue; assert(j < N); gsl_matrix_set(mA, i, j, pow(U, (double)p) * pow(V, (double)q)); j++; } assert(j == N); gsl_vector_set(b1, i, -fuv); gsl_vector_set(b2, i, -guv); i++; } } assert(i == M); // Solve the linear equation. if (gslutils_solve_leastsquares_v(mA, 2, b1, &x1, NULL, b2, &x2, NULL)) { ERROR("Failed to solve SIP inverse matrix equation!"); return -1; } // Extract the coefficients j = 0; for (p = 0; p <= inv_sip_order; p++) for (q = 0; q <= inv_sip_order; q++) { if ((p + q > inv_sip_order)) continue; assert(j < N); sip->ap[p][q] = gsl_vector_get(x1, j); sip->bp[p][q] = gsl_vector_get(x2, j); j++; } assert(j == N); // Check that we found values that actually invert the polynomial. // The error should be particularly small at the grid points. if (log_get_level() > LOG_VERB) { // rms error accumulators: double sumdu = 0; double sumdv = 0; int Z; for (gu = 0; gu < NX; gu++) { for (gv = 0; gv < NY; gv++) { double newu, newv; // Calculate grid position in original image pixels u = (gu * (maxu - minu) / (NX-1)) + minu; v = (gv * (maxv - minv) / (NY-1)) + minv; sip_calc_distortion(sip, u, v, &U, &V); sip_calc_inv_distortion(sip, U, V, &newu, &newv); sumdu += square(u - newu); sumdv += square(v - newv); } } sumdu /= (NX*NY); sumdv /= (NX*NY); debug("RMS error of inverting a distortion (at the grid points, in pixels):\n"); debug(" du: %g\n", sqrt(sumdu)); debug(" dv: %g\n", sqrt(sumdu)); debug(" dist: %g\n", sqrt(sumdu + sumdv)); sumdu = 0; sumdv = 0; Z = 1000; for (i=0; i= 1 && x <= wcs->imagew && y >= 1 && y <= wcs->imageh); } anbool sip_pixel_is_inside_image(const sip_t* wcs, double x, double y) { return tan_pixel_is_inside_image(&(wcs->wcstan), x, y); } anbool sip_is_inside_image(const sip_t* wcs, double ra, double dec) { double x,y; if (!sip_radec2pixelxy(wcs, ra, dec, &x, &y)) return FALSE; return sip_pixel_is_inside_image(wcs, x, y); } anbool tan_is_inside_image(const tan_t* wcs, double ra, double dec) { double x,y; if (!tan_radec2pixelxy(wcs, ra, dec, &x, &y)) return FALSE; return tan_pixel_is_inside_image(wcs, x, y); } int* sip_filter_stars_in_field(const sip_t* sip, const tan_t* tan, const double* xyz, const double* radec, int N, double** p_xy, int* inds, int* p_Ngood) { int i, Ngood; int W, H; double* xy = NULL; anbool allocd = FALSE; assert(sip || tan); assert(xyz || radec); assert(p_Ngood); Ngood = 0; if (!inds) { inds = malloc(N * sizeof(int)); allocd = TRUE; } if (p_xy) xy = malloc(N * 2 * sizeof(double)); if (sip) { W = sip->wcstan.imagew; H = sip->wcstan.imageh; } else { W = tan->imagew; H = tan->imageh; } for (i=0; i= W) || (y >= H)) continue; inds[Ngood] = i; if (xy) { xy[Ngood * 2 + 0] = x; xy[Ngood * 2 + 1] = y; } Ngood++; } if (allocd) inds = realloc(inds, Ngood * sizeof(int)); if (xy) xy = realloc(xy, Ngood * 2 * sizeof(double)); if (p_xy) *p_xy = xy; *p_Ngood = Ngood; return inds; } void sip_get_radec_center(const sip_t* wcs, double* p_ra, double* p_dec) { double px = wcs_pixel_center_for_size(wcs->wcstan.imagew); double py = wcs_pixel_center_for_size(wcs->wcstan.imageh); sip_pixelxy2radec(wcs, px, py, p_ra, p_dec); } void tan_get_radec_center(const tan_t* wcs, double* p_ra, double* p_dec) { double px = wcs_pixel_center_for_size(wcs->imagew); double py = wcs_pixel_center_for_size(wcs->imageh); tan_pixelxy2radec(wcs, px, py, p_ra, p_dec); } double sip_get_radius_deg(const sip_t* wcs) { return arcsec2deg(sip_pixel_scale(wcs) * hypot(wcs->wcstan.imagew, wcs->wcstan.imageh)/2.0); } double tan_get_radius_deg(const tan_t* wcs) { return arcsec2deg(tan_pixel_scale(wcs) * hypot(wcs->imagew, wcs->imageh)/2.0); } void sip_get_radec_center_hms(const sip_t* wcs, int* rah, int* ram, double* ras, int* decsign, int* decd, int* decm, double* decs) { double ra, dec; sip_get_radec_center(wcs, &ra, &dec); ra2hms(ra, rah, ram, ras); dec2dms(dec, decsign, decd, decm, decs); } void sip_get_radec_center_hms_string(const sip_t* wcs, char* rastr, char* decstr) { double ra, dec; sip_get_radec_center(wcs, &ra, &dec); ra2hmsstring(ra, rastr); dec2dmsstring(dec, decstr); } void sip_get_field_size(const sip_t* wcs, double* pw, double* ph, char** units) { double minx = 0.5; double maxx = (wcs->wcstan.imagew + 0.5); double midx = (minx + maxx) / 2.0; double miny = 0.5; double maxy = (wcs->wcstan.imageh + 0.5); double midy = (miny + maxy) / 2.0; double ra1, dec1, ra2, dec2, ra3, dec3; double w, h; // measure width through the middle sip_pixelxy2radec(wcs, minx, midy, &ra1, &dec1); sip_pixelxy2radec(wcs, midx, midy, &ra2, &dec2); sip_pixelxy2radec(wcs, maxx, midy, &ra3, &dec3); w = arcsec_between_radecdeg(ra1, dec1, ra2, dec2) + arcsec_between_radecdeg(ra2, dec2, ra3, dec3); // measure height through the middle sip_pixelxy2radec(wcs, midx, miny, &ra1, &dec1); sip_pixelxy2radec(wcs, midx, midy, &ra2, &dec2); sip_pixelxy2radec(wcs, midx, maxy, &ra3, &dec3); h = arcsec_between_radecdeg(ra1, dec1, ra2, dec2) + arcsec_between_radecdeg(ra2, dec2, ra3, dec3); if (MIN(w, h) < 60.0) { *units = "arcseconds"; *pw = w; *ph = h; } else if (MIN(w, h) < 3600.0) { *units = "arcminutes"; *pw = w / 60.0; *ph = h / 60.0; } else { *units = "degrees"; *pw = w / 3600.0; *ph = h / 3600.0; } } void sip_walk_image_boundary(const sip_t* wcs, double stepsize, void (*callback)(const sip_t* wcs, double x, double y, double ra, double dec, void* token), void* token) { int i, side; // Walk the perimeter of the image in steps of stepsize pixels double W = wcs->wcstan.imagew; double H = wcs->wcstan.imageh; { double Xmin = 0.5; double Xmax = W + 0.5; double Ymin = 0.5; double Ymax = H + 0.5; double offsetx[] = { Xmin, Xmax, Xmax, Xmin }; double offsety[] = { Ymin, Ymin, Ymax, Ymax }; double stepx[] = { +stepsize, 0, -stepsize, 0 }; double stepy[] = { 0, +stepsize, 0, -stepsize }; int Nsteps[] = { ceil(W/stepsize), ceil(H/stepsize), ceil(W/stepsize), ceil(H/stepsize) }; for (side=0; side<4; side++) { for (i=0; idecmin = MIN(b->decmin, dec); b->decmax = MAX(b->decmax, dec); if (ra - b->rac > 180) // wrap-around: racenter < 180, ra has gone < 0 but been wrapped around to > 180 ra -= 360; if (b->rac - ra > 180) // wrap-around: racenter > 180, ra has gone > 360 but wrapped around to > 0. ra += 360; b->ramin = MIN(b->ramin, ra); b->ramax = MAX(b->ramax, ra); } void sip_get_radec_bounds(const sip_t* wcs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax) { struct radecbounds b; sip_get_radec_center(wcs, &(b.rac), &(b.decc)); b.ramin = b.ramax = b.rac; b.decmin = b.decmax = b.decc; sip_walk_image_boundary(wcs, stepsize, radec_bounds_callback, &b); // Check for poles... // north pole if (sip_is_inside_image(wcs, 0, 90)) { b.ramin = 0; b.ramax = 360; b.decmax = 90; } if (sip_is_inside_image(wcs, 0, -90)) { b.ramin = 0; b.ramax = 360; b.decmin = -90; } if (pramin) *pramin = b.ramin; if (pramax) *pramax = b.ramax; if (pdecmin) *pdecmin = b.decmin; if (pdecmax) *pdecmax = b.decmax; } void sip_shift(const sip_t* sipin, sip_t* sipout, double xlo, double xhi, double ylo, double yhi) { memmove(sipout, sipin, sizeof(sip_t)); tan_transform(&(sipin->wcstan), &(sipout->wcstan), xlo, xhi, ylo, yhi, 1.0); } void tan_transform(const tan_t* tanin, tan_t* tanout, double xlo, double xhi, double ylo, double yhi, double scale) { memmove(tanout, tanin, sizeof(tan_t)); tanout->imagew = (xhi - xlo + 1) * scale; tanout->imageh = (yhi - ylo + 1) * scale; tanout->crpix[0] = (tanout->crpix[0] - (xlo - 1)) * scale; tanout->crpix[1] = (tanout->crpix[1] - (ylo - 1)) * scale; tanout->cd[0][0] /= scale; tanout->cd[0][1] /= scale; tanout->cd[1][0] /= scale; tanout->cd[1][1] /= scale; } void tan_scale(const tan_t* tanin, tan_t* tanout, double scale) { memmove(tanout, tanin, sizeof(tan_t)); tanout->imagew *= scale; tanout->imageh *= scale; tanout->crpix[0] = 0.5 + scale * (tanin->crpix[0] - 0.5); tanout->crpix[1] = 0.5 + scale * (tanin->crpix[1] - 0.5); tanout->cd[0][0] /= scale; tanout->cd[0][1] /= scale; tanout->cd[1][0] /= scale; tanout->cd[1][1] /= scale; } void sip_scale(const sip_t* wcsin, sip_t* wcsout, double scale) { int i, j; memmove(wcsout, wcsin, sizeof(sip_t)); tan_scale(&(wcsin->wcstan), &(wcsout->wcstan), scale); for (i=0; i<=wcsin->a_order; i++) { for (j=0; j<=wcsin->a_order; j++) { if (i + j > wcsin->a_order) continue; wcsout->a[i][j] *= pow(scale, 1 - (i+j)); } } for (i=0; i<=wcsin->b_order; i++) { for (j=0; j<=wcsin->b_order; j++) { if (i + j > wcsin->b_order) continue; wcsout->b[i][j] *= pow(scale, 1 - (i+j)); } } for (i=0; i<=wcsin->ap_order; i++) { for (j=0; j<=wcsin->ap_order; j++) { if (i + j > wcsin->ap_order) continue; wcsout->ap[i][j] *= pow(scale, 1 - (i+j)); } } for (i=0; i<=wcsin->bp_order; i++) { for (j=0; j<=wcsin->bp_order; j++) { if (i + j > wcsin->bp_order) continue; wcsout->bp[i][j] *= pow(scale, 1 - (i+j)); } } } astrometry.net-0.67/util/sip.c000644 000765 000024 00000035266 12651445460 016516 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "sip.h" #include "starutil.h" #include "mathutil.h" static anbool has_distortions(const sip_t* sip) { return (sip->a_order >= 0); } anbool sip_xyz2pixelxy(const sip_t* sip, double x, double y, double z, double *px, double *py) { double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return sip_xyzarr2pixelxy(sip, xyz, px, py); } void sip_wrap_tan(const tan_t* tan, sip_t* sip) { memset(sip, 0, sizeof(sip_t)); memcpy(&(sip->wcstan), tan, sizeof(tan_t)); } void sip_get_crval(const sip_t* sip, double* ra, double* dec) { *ra = sip->wcstan.crval[0]; *dec = sip->wcstan.crval[1]; } double sip_imagew(sip_t* sip) { assert(sip); return sip->wcstan.imagew; } double sip_imageh(sip_t* sip) { assert(sip); return sip->wcstan.imageh; } sip_t* sip_create() { sip_t* sip = calloc(1, sizeof(sip_t)); sip->wcstan.cd[0][0] = 1; sip->wcstan.cd[0][1] = 0; sip->wcstan.cd[1][0] = 0; sip->wcstan.cd[1][1] = 1; return sip; } void sip_free(sip_t* sip) { free(sip); } void sip_copy(sip_t* dest, const sip_t* src) { memcpy(dest, src, sizeof(sip_t)); } static void sip_distortion(const sip_t* sip, double x, double y, double* X, double* Y) { // Get pixel coordinates relative to reference pixel double u = x - sip->wcstan.crpix[0]; double v = y - sip->wcstan.crpix[1]; sip_calc_distortion(sip, u, v, X, Y); *X += sip->wcstan.crpix[0]; *Y += sip->wcstan.crpix[1]; } // Pixels to RA,Dec in degrees. void sip_pixelxy2radec(const sip_t* sip, double px, double py, double *ra, double *dec) { if (has_distortions(sip)) { double U, V; sip_distortion(sip, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2radec(&(sip->wcstan), U, V, ra, dec); } else // Run a normal TAN conversion tan_pixelxy2radec(&(sip->wcstan), px, py, ra, dec); } // Pixels to Intermediate World Coordinates in degrees. void sip_pixelxy2iwc(const sip_t* sip, double px, double py, double *iwcx, double* iwcy) { if (has_distortions(sip)) { double U, V; sip_distortion(sip, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2iwc(&(sip->wcstan), U, V, iwcx, iwcy); } else // Run a normal TAN conversion tan_pixelxy2iwc(&(sip->wcstan), px, py, iwcx, iwcy); } // Pixels to XYZ unit vector. void sip_pixelxy2xyzarr(const sip_t* sip, double px, double py, double *xyz) { if (has_distortions(sip)) { double U, V; sip_distortion(sip, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2xyzarr(&(sip->wcstan), U, V, xyz); } else // Run a normal TAN conversion tan_pixelxy2xyzarr(&(sip->wcstan), px, py, xyz); } // Pixels to RA,Dec in degrees. void tan_pixelxy2radec(const tan_t* tan, double px, double py, double *ra, double *dec) { double xyz[3]; tan_pixelxy2xyzarr(tan, px, py, xyz); xyzarr2radecdeg(xyz, ra,dec); } void tan_pixelxy2radecarr(const tan_t* wcs_tan, double px, double py, double *radec) { tan_pixelxy2radec(wcs_tan, px, py, radec+0, radec+1); } void tan_iwc2pixelxy(const tan_t* tan, double x, double y, double *px, double* py) { double U,V; Unused int r; double cdi[2][2]; // Invert CD r = invert_2by2_arr((const double*)tan->cd, (double*)cdi); assert(r == 0); // Linear pixel coordinates U = cdi[0][0]*x + cdi[0][1]*y; V = cdi[1][0]*x + cdi[1][1]*y; // Re-add crpix to get pixel coordinates *px = U + tan->crpix[0]; *py = V + tan->crpix[1]; } void tan_pixelxy2iwc(const tan_t* tan, double px, double py, double *iwcx, double* iwcy) { // Get pixel coordinates relative to reference pixel double U = px - tan->crpix[0]; double V = py - tan->crpix[1]; // Get intermediate world coordinates double x = tan->cd[0][0] * U + tan->cd[0][1] * V; double y = tan->cd[1][0] * U + tan->cd[1][1] * V; if (iwcx) *iwcx = x; if (iwcy) *iwcy = y; } void tan_iwc2radec(const tan_t* tan, double x, double y, double *p_ra, double *p_dec) { double xyz[3]; tan_iwc2xyzarr(tan, x, y, xyz); xyzarr2radecdeg(xyz, p_ra, p_dec); } void tan_iwc2xyzarr(const tan_t* tan, double x, double y, double *xyz) { double rx, ry, rz; double ix,iy,norm; double jx,jy,jz; // Mysterious factor of -1 correcting for vector directions below. x = -deg2rad(x); y = deg2rad(y); // Take r to be the threespace vector of crval radecdeg2xyz(tan->crval[0], tan->crval[1], &rx, &ry, &rz); // printf("rx=%lf ry=%lf rz=%lf\n",rx,ry,rz); // Form i = r cross north pole (0,0,1) ix = ry; iy = -rx; // iz = 0 norm = hypot(ix, iy); ix /= norm; iy /= norm; // printf("ix=%lf iy=%lf iz=0.0\n",ix,iy); // printf("r.i = %lf\n",ix*rx+iy*ry); // Form j = i cross r; iz=0 so some terms drop out jx = iy * rz; jy = - ix * rz; jz = ix * ry - iy * rx; // norm should already be 1, but normalize anyway normalize(&jx, &jy, &jz); // printf("jx=%lf jy=%lf jz=%lf\n",jx,jy,jz); // printf("r.j = %lf\n",jx*rx+jy*ry+jz*rz); // printf("i.j = %lf\n",ix*jx+iy*jy); if (tan->sin) { assert((x*x + y*y) < 1.0); // Figure out what factor of r we have to add in to make the resulting length = 1 double rfrac = sqrt(1.0 - (x*x + y*y)); // Don't scale the projected x,y positions, just add in the right amount of r to // bring it onto the unit sphere xyz[0] = ix*x + jx*y + rx * rfrac; xyz[1] = iy*x + jy*y + ry * rfrac; xyz[2] = jz*y + rz * rfrac; // iz = 0 } else { // Form the point on the tangent plane relative to observation point, xyz[0] = ix*x + jx*y + rx; xyz[1] = iy*x + jy*y + ry; xyz[2] = jz*y + rz; // iz = 0 // and normalize back onto the unit sphere normalize_3(xyz); } } // Pixels to XYZ unit vector. void tan_pixelxy2xyzarr(const tan_t* tan, double px, double py, double *xyz) { double x,y; tan_pixelxy2iwc(tan, px, py, &x, &y); tan_iwc2xyzarr(tan, x, y, xyz); } void sip_iwc2pixelxy(const sip_t* sip, double u, double v, double *px, double* py) { double x,y; tan_iwc2pixelxy(&(sip->wcstan), u, v, &x, &y); sip_pixel_undistortion(sip, x, y, px, py); } // SIP: (RA,Dec) --> IWC --> x,y --> x',y' // RA,Dec in degrees to Pixels. anbool sip_radec2pixelxy(const sip_t* sip, double ra, double dec, double *px, double *py) { double x,y; if (!tan_radec2pixelxy(&(sip->wcstan), ra, dec, &x, &y)) return FALSE; sip_pixel_undistortion(sip, x, y, px, py); return TRUE; } void sip_iwc2radec(const sip_t* sip, double x, double y, double *p_ra, double *p_dec) { tan_iwc2radec(&(sip->wcstan), x, y, p_ra, p_dec); } // RA,Dec in degrees to Pixels. anbool sip_radec2pixelxy_check(const sip_t* sip, double ra, double dec, double *px, double *py) { double u, v; double U, V; double U2, V2; if (!tan_radec2pixelxy(&(sip->wcstan), ra, dec, px, py)) return FALSE; if (!has_distortions(sip)) return TRUE; // Subtract crpix, invert SIP distortion, add crpix. // Sanity check: if (sip->a_order != 0 && sip->ap_order == 0) { fprintf(stderr, "suspicious inversion; no inversion SIP coeffs " "yet there are forward SIP coeffs\n"); } U = *px - sip->wcstan.crpix[0]; V = *py - sip->wcstan.crpix[1]; sip_calc_inv_distortion(sip, U, V, &u, &v); // Check that we're dealing with the right range of the polynomial by inverting it and // checking that we end up back in the right place. sip_calc_distortion(sip, u, v, &U2, &V2); if (fabs(U2 - U) + fabs(V2 - V) > 10.0) return FALSE; *px = u + sip->wcstan.crpix[0]; *py = v + sip->wcstan.crpix[1]; return TRUE; } anbool sip_xyzarr2pixelxy(const sip_t* sip, const double* xyz, double *px, double *py) { double ra, dec; xyzarr2radecdeg(xyz, &ra, &dec); return sip_radec2pixelxy(sip, ra, dec, px, py); } anbool sip_xyzarr2iwc(const sip_t* sip, const double* xyz, double* iwcx, double* iwcy) { return tan_xyzarr2iwc(&(sip->wcstan), xyz, iwcx, iwcy); } anbool sip_radec2iwc(const sip_t* sip, double ra, double dec, double* iwcx, double* iwcy) { return tan_radec2iwc(&(sip->wcstan), ra, dec, iwcx, iwcy); } anbool tan_xyzarr2iwc(const tan_t* tan, const double* xyz, double* iwcx, double* iwcy) { double xyzcrval[3]; // FIXME be robust near the poles // Calculate intermediate world coordinates (x,y) on the tangent plane radecdeg2xyzarr(tan->crval[0], tan->crval[1], xyzcrval); if (!star_coords(xyz, xyzcrval, !tan->sin, iwcx, iwcy)) return FALSE; *iwcx = rad2deg(*iwcx); *iwcy = rad2deg(*iwcy); return TRUE; } anbool tan_radec2iwc(const tan_t* tan, double ra, double dec, double* iwcx, double* iwcy) { double xyz[3]; radecdeg2xyzarr(ra, dec, xyz); return tan_xyzarr2iwc(tan, xyz, iwcx, iwcy); } // xyz unit vector to Pixels. anbool tan_xyzarr2pixelxy(const tan_t* tan, const double* xyzpt, double *px, double *py) { double iwx=0, iwy=0; if (!tan_xyzarr2iwc(tan, xyzpt, &iwx, &iwy)) { return FALSE; } tan_iwc2pixelxy(tan, iwx, iwy, px, py); return TRUE; } // RA,Dec in degrees to Pixels. anbool tan_radec2pixelxy(const tan_t* tan, double a, double d, double *px, double *py) { double xyzpt[3]; radecdeg2xyzarr(a,d,xyzpt); return tan_xyzarr2pixelxy(tan, xyzpt, px, py); } void sip_calc_distortion(const sip_t* sip, double u, double v, double* U, double *V) { // Do SIP distortion (in relative pixel coordinates) // See the sip_t struct definition in header file for details int p, q; double fuv=0.; double guv=0.; // avoid using pow() function double powu[SIP_MAXORDER]; double powv[SIP_MAXORDER]; powu[0] = 1.0; powu[1] = u; powv[0] = 1.0; powv[1] = v; for (p=2; p <= MAX(sip->a_order, sip->b_order); p++) { powu[p] = powu[p-1] * u; powv[p] = powv[p-1] * v; } for (p=0; p<=sip->a_order; p++) for (q=0; q<=sip->a_order; q++) // We include all terms, even the constant and linear ones; the standard // isn't clear on whether these are allowed or not. if (p+q <= sip->a_order) fuv += sip->a[p][q] * powu[p] * powv[q]; for (p=0; p<=sip->b_order; p++) for (q=0; q<=sip->b_order; q++) if (p+q <= sip->b_order) guv += sip->b[p][q] * powu[p] * powv[q]; *U = u + fuv; *V = v + guv; } void sip_pixel_distortion(const sip_t* sip, double x, double y, double* X, double *Y) { sip_distortion(sip, x, y, X, Y); } void sip_pixel_undistortion(const sip_t* sip, double x, double y, double* X, double *Y) { if (!has_distortions(sip)) { *X = x; *Y = y; return; } // Sanity check: if (sip->a_order != 0 && sip->ap_order == 0) { fprintf(stderr, "suspicious inversion; no inverse SIP coeffs " "yet there are forward SIP coeffs\n"); } // Get pixel coordinates relative to reference pixel double u = x - sip->wcstan.crpix[0]; double v = y - sip->wcstan.crpix[1]; sip_calc_inv_distortion(sip, u, v, X, Y); *X += sip->wcstan.crpix[0]; *Y += sip->wcstan.crpix[1]; } void sip_calc_inv_distortion(const sip_t* sip, double U, double V, double* u, double *v) { int p, q; double fUV=0.; double gUV=0.; // avoid using pow() function double powu[SIP_MAXORDER]; double powv[SIP_MAXORDER]; powu[0] = 1.0; powu[1] = U; powv[0] = 1.0; powv[1] = V; for (p=2; p <= MAX(sip->ap_order, sip->bp_order); p++) { powu[p] = powu[p-1] * U; powv[p] = powv[p-1] * V; } for (p=0; p<=sip->ap_order; p++) for (q=0; q<=sip->ap_order; q++) if (p+q <= sip->ap_order) fUV += sip->ap[p][q] * powu[p] * powv[q]; for (p=0; p<=sip->bp_order; p++) for (q=0; q<=sip->bp_order; q++) if (p+q <= sip->bp_order) gUV += sip->bp[p][q] * powu[p] * powv[q]; *u = U + fUV; *v = V + gUV; } double tan_det_cd(const tan_t* tan) { return (tan->cd[0][0]*tan->cd[1][1] - tan->cd[0][1]*tan->cd[1][0]); } double sip_det_cd(const sip_t* sip) { return tan_det_cd(&(sip->wcstan)); } double tan_pixel_scale(const tan_t* tan) { double scale = deg2arcsec(sqrt(fabs(tan_det_cd(tan)))); return scale; } // returns pixel scale in arcseconds double sip_pixel_scale(const sip_t* sip) { return tan_pixel_scale(&(sip->wcstan)); } static void print_to(const tan_t* tan, FILE* f, char* type) { fprintf(f,"%s Structure:\n", type); fprintf(f," crval=(%g, %g)\n", tan->crval[0], tan->crval[1]); fprintf(f," crpix=(%g, %g)\n", tan->crpix[0], tan->crpix[1]); fprintf(f," CD = ( %12.5g %12.5g )\n", tan->cd[0][0], tan->cd[0][1]); fprintf(f," ( %12.5g %12.5g )\n", tan->cd[1][0], tan->cd[1][1]); fprintf(f," image size = (%g x %g)\n", tan->imagew, tan->imageh); } void tan_print_to(const tan_t* tan, FILE* f) { if (tan->sin) { print_to(tan, f, "SIN"); } else { print_to(tan, f, "TAN"); } } void tan_print(const tan_t* tan) { tan_print_to(tan, stderr); } void sip_print_to(const sip_t* sip, FILE* f) { double det,pixsc; if (sip->wcstan.sin) { print_to(&(sip->wcstan), f, "SIN-SIP"); } else { print_to(&(sip->wcstan), f, "TAN-SIP"); } fprintf(f, " SIP order: A=%i, B=%i, AP=%i, BP=%i\n", sip->a_order, sip->b_order, sip->ap_order, sip->bp_order); if (sip->a_order > 0) { int p, q; for (p=0; p<=sip->a_order; p++) { fprintf(f, (p ? " " : " A = ")); for (q=0; q<=sip->a_order; q++) if (p+q <= sip->a_order) //fprintf(f,"a%d%d=%le\n", p,q,sip->a[p][q]); fprintf(f,"%12.5g", sip->a[p][q]); fprintf(f,"\n"); } } if (sip->b_order > 0) { int p, q; for (p=0; p<=sip->b_order; p++) { fprintf(f, (p ? " " : " B = ")); for (q=0; q<=sip->b_order; q++) if (p+q <= sip->a_order) fprintf(f,"%12.5g", sip->b[p][q]); //if (p+q <= sip->b_order && p+q > 0) //fprintf(f,"b%d%d=%le\n", p,q,sip->b[p][q]); fprintf(f,"\n"); } } if (sip->ap_order > 0) { int p, q; for (p=0; p<=sip->ap_order; p++) { fprintf(f, (p ? " " : " AP = ")); for (q=0; q<=sip->ap_order; q++) if (p+q <= sip->ap_order) fprintf(f,"%12.5g", sip->ap[p][q]); fprintf(f,"\n"); } } if (sip->bp_order > 0) { int p, q; for (p=0; p<=sip->bp_order; p++) { fprintf(f, (p ? " " : " BP = ")); for (q=0; q<=sip->bp_order; q++) if (p+q <= sip->bp_order) fprintf(f,"%12.5g", sip->bp[p][q]); fprintf(f,"\n"); } } det = sip_det_cd(sip); pixsc = 3600*sqrt(fabs(det)); //fprintf(f," det(CD)=%g\n", det); fprintf(f," sqrt(det(CD))=%g [arcsec]\n", pixsc); //fprintf(f,"\n"); } void sip_print(const sip_t* sip) { sip_print_to(sip, stderr); } double sip_get_orientation(const sip_t* sip) { return tan_get_orientation(&(sip->wcstan)); } double tan_get_orientation(const tan_t* tan) { double T, A, orient; double det, parity; det = tan_det_cd(tan); parity = (det >= 0 ? 1.0 : -1.0); T = parity * tan->cd[0][0] + tan->cd[1][1]; A = parity * tan->cd[1][0] - tan->cd[0][1]; orient = -rad2deg(atan2(A, T)); return orient; } astrometry.net-0.67/util/sip_plot_distortion.py000644 000765 000024 00000006512 12651445460 022230 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import sys from optparse import * import numpy as np from pylab import * from numpy import * #from astrometry.util.sip import * from astrometry.util.util import * def plot_distortions(wcsfn, ex=1, ngridx=10, ngridy=10, stepx=10, stepy=10): wcs = Sip(wcsfn) W,H = wcs.wcstan.imagew, wcs.wcstan.imageh xgrid = np.linspace(0, W, ngridx) ygrid = np.linspace(0, H, ngridy) X = np.linspace(0, W, int(ceil(W/stepx))) Y = np.linspace(0, H, int(ceil(H/stepy))) xlo,xhi,ylo,yhi = 0,W,0,H for x in xgrid: DX,DY = [],[] xx,yy = [],[] UX,UY = [],[] for y in Y: dx,dy = wcs.get_distortion(x, y) ux,uy = wcs.get_undistortion(dx, dy) print 'x,y', (x,y), 'dx,dy', (dx,dy), 'ux,uy', (ux,uy) xx.append(x) yy.append(y) DX.append(dx) DY.append(dy) UX.append(ux) UY.append(uy) DX = np.array(DX) DY = np.array(DY) UX = np.array(UX) UY = np.array(UY) xx = np.array(xx) yy = np.array(yy) EX = DX + ex * (DX - xx) EY = DY + ex * (DY - yy) plot(xx, yy, 'k-', alpha=0.5) plot(EX, EY, 'r-') plot(UX, UY, 'b-', alpha=0.5) xlo = min(xlo, min(EX)) xhi = max(xhi, max(EX)) ylo = min(ylo, min(EY)) yhi = max(yhi, max(EY)) for y in ygrid: DX,DY = [],[] xx,yy = [],[] UX,UY = [],[] for x in X: dx,dy = wcs.get_distortion(x, y) ux,uy = wcs.get_undistortion(dx, dy) DX.append(dx) DY.append(dy) UX.append(ux) UY.append(uy) xx.append(x) yy.append(y) DX = np.array(DX) DY = np.array(DY) xx = np.array(xx) yy = np.array(yy) EX = DX + ex * (DX - xx) EY = DY + ex * (DY - yy) plot(xx, yy, 'k-', alpha=0.5) plot(EX, EY, 'r-') plot(UX, UY, 'b-', alpha=0.5) xlo = min(xlo, min(EX)) xhi = max(xhi, max(EX)) ylo = min(ylo, min(EY)) yhi = max(yhi, max(EY)) plot([wcs.wcstan.crpix[0]], [wcs.wcstan.crpix[1]], 'rx') #axis([0, W, 0, H]) axis('scaled') axis([xlo,xhi,ylo,yhi]) #axis('tight') if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-e', '--ex', '--exaggerate', dest='ex', type='float', help='Exaggerate the distortion by this factor') #parser.add_option('-s', '--scale', dest='scale', type='float', help='Scale the parser.add_option('-n', dest='nsteps', type='int', help='Number of grid lines to plot') parser.set_defaults(ex=1.) opt,args = parser.parse_args() if len(args) != 2: parser.print_help() sys.exit(-1) wcsfn = args[0] outfn = args[1] args = {} if opt.ex is not None: args['ex'] = opt.ex if opt.nsteps is not None: args['ngridx'] = opt.nsteps args['ngridy'] = opt.nsteps clf() plot_distortions(wcsfn, **args) tt = 'SIP distortions: %s' % wcsfn if opt.ex != 1: tt += ' (exaggerated by %g)' % opt.ex title(tt) savefig(outfn) astrometry.net-0.67/util/sip_qfits.c000644 000765 000024 00000041217 12651445460 017715 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "qfits_rw.h" #include "qfits_tools.h" #include "os-features.h" #include "sip_qfits.h" #include "an-bool.h" #include "fitsioutils.h" #include "errors.h" #include "log.h" #include "ioutils.h" #include "anqfits.h" sip_t* sip_from_string(const char* str, int slen, sip_t* dest) { qfits_header* hdr; sip_t* rtn; if (slen == 0) { slen = strlen(str); } hdr = qfits_header_read_hdr_string((const unsigned char*)str, slen); if (!hdr) { ERROR("Failed to parse a FITS header from the given string"); return NULL; } rtn = sip_read_header(hdr, dest); qfits_header_destroy(hdr); return rtn; } sip_t* sip_read_tan_or_sip_header_file_ext(const char* wcsfn, int ext, sip_t* dest, anbool forcetan) { sip_t* rtn; if (forcetan) { sip_t sip; memset(&sip, 0, sizeof(sip_t)); if (!tan_read_header_file_ext(wcsfn, ext, &(sip.wcstan))) { ERROR("Failed to parse TAN header from file %s, extension %i", wcsfn, ext); return NULL; } if (!dest) dest = malloc(sizeof(sip_t)); memcpy(dest, &sip, sizeof(sip_t)); return dest; } else { rtn = sip_read_header_file_ext(wcsfn, ext, dest); if (!rtn) ERROR("Failed to parse SIP header from file %s, extension %i", wcsfn, ext); return rtn; } } int sip_write_to(const sip_t* sip, FILE* fid) { qfits_header* hdr; int res; if ((sip->a_order == 0) && (sip->b_order == 0) && (sip->ap_order == 0) && (sip->bp_order == 0)) return tan_write_to(&(sip->wcstan), fid); hdr = sip_create_header(sip); if (!hdr) { ERROR("Failed to create FITS header from WCS"); return -1; } res = qfits_header_dump(hdr, fid); qfits_header_destroy(hdr); return res; } int sip_write_to_file(const sip_t* sip, const char* fn) { FILE* fid; int res; if ((sip->a_order == 0) && (sip->b_order == 0) && (sip->ap_order == 0) && (sip->bp_order == 0)) return tan_write_to_file(&(sip->wcstan), fn); fid = fopen(fn, "wb"); if (!fid) { SYSERROR("Failed to open file \"%s\" to write WCS header", fn); return -1; } res = sip_write_to(sip, fid); if (res) { ERROR("Failed to write FITS header to file \"%s\"", fn); return -1; } if (fclose(fid)) { SYSERROR("Failed to close file \"%s\" after writing WCS header", fn); return -1; } return 0; } int tan_write_to(const tan_t* tan, FILE* fid) { qfits_header* hdr; int res; hdr = tan_create_header(tan); if (!hdr) { ERROR("Failed to create FITS header from WCS"); return -1; } res = qfits_header_dump(hdr, fid); qfits_header_destroy(hdr); return res; } int tan_write_to_file(const tan_t* tan, const char* fn) { FILE* fid; int res; fid = fopen(fn, "wb"); if (!fid) { SYSERROR("Failed to open file \"%s\" to write WCS header", fn); return -1; } res = tan_write_to(tan, fid); if (res) { ERROR("Failed to write FITS header to file \"%s\"", fn); return -1; } if (fclose(fid)) { SYSERROR("Failed to close file \"%s\" after writing WCS header", fn); return -1; } return 0; } static void wcs_hdr_common(qfits_header* hdr, const tan_t* tan) { qfits_header_add(hdr, "WCSAXES", "2", NULL, NULL); qfits_header_add(hdr, "EQUINOX", "2000.0", "Equatorial coordinates definition (yr)", NULL); qfits_header_add(hdr, "LONPOLE", "180.0", NULL, NULL); qfits_header_add(hdr, "LATPOLE", "0.0", NULL, NULL); fits_header_add_double(hdr, "CRVAL1", tan->crval[0], "RA of reference point"); fits_header_add_double(hdr, "CRVAL2", tan->crval[1], "DEC of reference point"); fits_header_add_double(hdr, "CRPIX1", tan->crpix[0], "X reference pixel"); fits_header_add_double(hdr, "CRPIX2", tan->crpix[1], "Y reference pixel"); qfits_header_add(hdr, "CUNIT1", "deg", "X pixel scale units", NULL); qfits_header_add(hdr, "CUNIT2", "deg", "Y pixel scale units", NULL); fits_header_add_double(hdr, "CD1_1", tan->cd[0][0], "Transformation matrix"); fits_header_add_double(hdr, "CD1_2", tan->cd[0][1], ""); fits_header_add_double(hdr, "CD2_1", tan->cd[1][0], ""); fits_header_add_double(hdr, "CD2_2", tan->cd[1][1], ""); if (tan->imagew > 0.0) fits_header_add_double(hdr, "IMAGEW", tan->imagew, "Image width, in pixels."); if (tan->imageh > 0.0) fits_header_add_double(hdr, "IMAGEH", tan->imageh, "Image height, in pixels."); } int sip_get_image_size(const qfits_header* hdr, int* pW, int* pH) { int W, H; W = qfits_header_getint(hdr, "IMAGEW", 0); debug("sip_get_image_size: IMAGEW = %i\n", W); H = qfits_header_getint(hdr, "IMAGEH", 0); debug("sip_get_image_size: IMAGEH = %i\n", H); if (W == 0 || H == 0) { // no IMAGE[WH]. Check for fpack-compressed image. int eq; char* str = fits_get_dupstring(hdr, "XTENSION"); //printf("XTENSION: '%s'\n", str); // qfits_header_getstr turns the string double-quotes to single-quotes eq = streq(str, "BINTABLE"); free(str); if (eq) { // ZNAXIS1 = 2046 / length of data axis 1 // ZNAXIS2 = 4094 / length of data axis 2 if (!W) { W = qfits_header_getint(hdr, "ZNAXIS1", 0); debug("sip_get_image_size: ZNAXIS1 = %i\n", W); } if (!H) { H = qfits_header_getint(hdr, "ZNAXIS2", 0); debug("sip_get_image_size: ZNAXIS2 = %i\n", H); } } if (!W) { W = qfits_header_getint(hdr, "NAXIS1", 0); debug("sip_get_image_size: NAXIS1 = %i\n", W); } if (!H) { H = qfits_header_getint(hdr, "NAXIS2", 0); debug("sip_get_image_size: NAXIS2 = %i\n", H); } } if (pW) *pW = W; if (pH) *pH = H; return 0; } static void add_polynomial(qfits_header* hdr, const char* format, int order, const double* data, int datastride) { int i, j; char key[64]; for (i=0; i<=order; i++) for (j=0; (i+j)<=order; j++) { //if (i+j < 1) // continue; //if (drop_linear && (i+j < 2)) // continue; sprintf(key, format, i, j); fits_header_add_double(hdr, key, data[i*datastride + j], ""); } } void sip_add_to_header(qfits_header* hdr, const sip_t* sip) { wcs_hdr_common(hdr, &(sip->wcstan)); if (sip->wcstan.sin) { qfits_header_add_after(hdr, "WCSAXES", "CTYPE2", "DEC--SIN-SIP", "SIN projection + SIP distortions", NULL); qfits_header_add_after(hdr, "WCSAXES", "CTYPE1", "RA---SIN-SIP", "SIN projection + SIP distortions", NULL); } else { qfits_header_add_after(hdr, "WCSAXES", "CTYPE2", "DEC--TAN-SIP", "TAN (gnomic) projection + SIP distortions", NULL); qfits_header_add_after(hdr, "WCSAXES", "CTYPE1", "RA---TAN-SIP", "TAN (gnomic) projection + SIP distortions", NULL); } fits_header_add_int(hdr, "A_ORDER", sip->a_order, "Polynomial order, axis 1"); add_polynomial(hdr, "A_%i_%i", sip->a_order, (double*)sip->a, SIP_MAXORDER); fits_header_add_int(hdr, "B_ORDER", sip->b_order, "Polynomial order, axis 2"); add_polynomial(hdr, "B_%i_%i", sip->b_order, (double*)sip->b, SIP_MAXORDER); fits_header_add_int(hdr, "AP_ORDER", sip->ap_order, "Inv polynomial order, axis 1"); add_polynomial(hdr, "AP_%i_%i", sip->ap_order, (double*)sip->ap, SIP_MAXORDER); fits_header_add_int(hdr, "BP_ORDER", sip->bp_order, "Inv polynomial order, axis 2"); add_polynomial(hdr, "BP_%i_%i", sip->bp_order, (double*)sip->bp, SIP_MAXORDER); } qfits_header* sip_create_header(const sip_t* sip) { qfits_header* hdr = qfits_table_prim_header_default(); sip_add_to_header(hdr, sip); return hdr; } void tan_add_to_header(qfits_header* hdr, const tan_t* tan) { wcs_hdr_common(hdr, tan); if (tan->sin) { qfits_header_add_after(hdr, "WCSAXES", "CTYPE2", "DEC--SIN", "SIN projection", NULL); qfits_header_add_after(hdr, "WCSAXES", "CTYPE1", "RA---SIN", "SIN projection", NULL); } else { qfits_header_add_after(hdr, "WCSAXES", "CTYPE2", "DEC--TAN", "TAN (gnomic) projection", NULL); qfits_header_add_after(hdr, "WCSAXES", "CTYPE1", "RA---TAN", "TAN (gnomic) projection", NULL); } } qfits_header* tan_create_header(const tan_t* tan) { qfits_header* hdr = qfits_table_prim_header_default(); tan_add_to_header(hdr, tan); return hdr; } static void* read_header_file(const char* fn, int ext, anbool only, void* dest, void* (*readfunc)(const qfits_header*, void*)) { qfits_header* hdr; void* result; if (only) { hdr = anqfits_get_header_only(fn, ext); } else { hdr = anqfits_get_header2(fn, ext); } if (!hdr) { ERROR("Failed to read FITS header from file \"%s\" extension %i", fn, ext); return NULL; } result = readfunc(hdr, dest); if (!result) { ERROR("Failed to parse WCS header from file \"%s\" extension %i", fn, ext); } qfits_header_destroy(hdr); return result; } // silly little dispatch function to avoid casting - I like a modicum of type safety static void* call_sip_read_header(const qfits_header* hdr, void* dest) { return sip_read_header(hdr, dest); } sip_t* sip_read_header_file(const char* fn, sip_t* dest) { return read_header_file(fn, 0, FALSE, dest, call_sip_read_header); } sip_t* sip_read_header_file_ext(const char* fn, int ext, sip_t* dest) { return read_header_file(fn, ext, TRUE, dest, call_sip_read_header); } sip_t* sip_read_header_file_ext_only(const char* fn, int ext, sip_t* dest) { return read_header_file(fn, ext, TRUE, dest, call_sip_read_header); } static void* call_tan_read_header(const qfits_header* hdr, void* dest) { return tan_read_header(hdr, dest); } tan_t* tan_read_header_file(const char* fn, tan_t* dest) { return read_header_file(fn, 0, FALSE, dest, call_tan_read_header); } tan_t* tan_read_header_file_ext(const char* fn, int ext, tan_t* dest) { return read_header_file(fn, ext, FALSE, dest, call_tan_read_header); } tan_t* tan_read_header_file_ext_only(const char* fn, int ext, tan_t* dest) { return read_header_file(fn, ext, TRUE, dest, call_tan_read_header); } static anbool read_polynomial(const qfits_header* hdr, const char* format, int order, double* data, int datastride, anbool skip_linear, anbool skip_zero) { int i, j; char key[64]; double nil = -HUGE_VAL; double val; for (i=0; i<=order; i++) for (j=0; (i+j)<=order; j++) { if (skip_zero && (i+j < 1)) continue; if (skip_linear && (i+j < 2)) continue; sprintf(key, format, i, j); val = qfits_header_getdouble(hdr, key, nil); if (val == nil) { // don't warn if linear terms are "missing" if (i+j >= 2) { ERROR("SIP: warning: key \"%s\" not found; setting to zero.", key); } val=0.0; } data[i*datastride + j] = val; } return TRUE; } sip_t* sip_read_header(const qfits_header* hdr, sip_t* dest) { sip_t sip; char* str; const char* key; const char* expect; const char* expect2; anbool is_sin; anbool is_tan; anbool skip_linear; anbool skip_zero; char pretty[FITS_LINESZ]; memset(&sip, 0, sizeof(sip_t)); key = "CTYPE1"; expect = "RA---TAN-SIP"; expect2 = "RA---SIN-SIP"; str = qfits_header_getstr(hdr, key); str = qfits_pretty_string_r(str, pretty); if (!str) { ERROR("SIP header: no key \"%s\"", key); return NULL; } is_tan = (strncmp(str, expect, strlen(expect)) == 0); is_sin = (strncmp(str, expect2, strlen(expect2)) == 0); if (!(is_tan || is_sin)) { if (!tan_read_header(hdr, &(sip.wcstan))) { ERROR("SIP: failed to read TAN header"); return NULL; } goto gohome; } key = "CTYPE2"; if (is_sin) { expect = "DEC--SIN-SIP"; } else { expect = "DEC--TAN-SIP"; } str = qfits_header_getstr(hdr, key); str = qfits_pretty_string_r(str, pretty); if (!str || strncmp(str, expect, strlen(expect))) { ERROR("SIP header: incorrect key \"%s\": expected \"%s\", got \"%s\"", key, expect, str); return NULL; } if (!tan_read_header(hdr, &sip.wcstan)) { ERROR("SIP: failed to read TAN header"); return NULL; } sip.a_order = qfits_header_getint(hdr, "A_ORDER", -1); sip.b_order = qfits_header_getint(hdr, "B_ORDER", -1); sip.ap_order = qfits_header_getint(hdr, "AP_ORDER", 0); sip.bp_order = qfits_header_getint(hdr, "BP_ORDER", 0); if ((sip.a_order == -1) || (sip.b_order == -1)) { ERROR("SIP: failed to read polynomial orders (A_ORDER=%i, B_ORDER=%i, -1 means absent)\n", sip.a_order, sip.b_order); return NULL; } if ((sip.ap_order == 0) || (sip.bp_order == 0)) { logverb("Warning: SIP: failed to read polynomial orders (A_ORDER=%i, B_ORDER=%i (-1 means absent), AP_ORDER=%i, BP_ORDER=%i, (0 means absent)\n", sip.a_order, sip.b_order, sip.ap_order, sip.bp_order); } if ((sip.a_order > SIP_MAXORDER) || (sip.b_order > SIP_MAXORDER) || (sip.ap_order > SIP_MAXORDER) || (sip.bp_order > SIP_MAXORDER)) { ERROR("SIP: polynomial orders (A=%i, B=%i, AP=%i, BP=%i) exceeds maximum of %i", sip.a_order, sip.b_order, sip.ap_order, sip.bp_order, SIP_MAXORDER); return NULL; } skip_linear = FALSE; skip_zero = FALSE; if (!read_polynomial(hdr, "A_%i_%i", sip.a_order, (double*)sip.a, SIP_MAXORDER, skip_linear, skip_zero) || !read_polynomial(hdr, "B_%i_%i", sip.b_order, (double*)sip.b, SIP_MAXORDER, skip_linear, skip_zero) || (sip.ap_order > 0 && !read_polynomial(hdr, "AP_%i_%i", sip.ap_order, (double*)sip.ap, SIP_MAXORDER, FALSE, FALSE)) || (sip.bp_order > 0 && !read_polynomial(hdr, "BP_%i_%i", sip.bp_order, (double*)sip.bp, SIP_MAXORDER, FALSE, FALSE))) { ERROR("SIP: failed to read polynomial terms"); return NULL; } gohome: if (!dest) dest = malloc(sizeof(sip_t)); memcpy(dest, &sip, sizeof(sip_t)); return dest; } static int check_tan_ctypes(char* ct1, char* ct2, anbool* is_sin) { const char* ra = "RA---TAN"; const char* dec = "DEC--TAN"; const char* ra2 = "RA---SIN"; const char* dec2 = "DEC--SIN"; int NC = 8; *is_sin = FALSE; if (!ct1 || !ct2) return -1; if (strlen(ct1) < NC || strlen(ct2) < NC) return -1; if ((strncmp(ct1, ra, NC) == 0) && (strncmp(ct2, dec, NC) == 0)) return 0; if ((strncmp(ct1, dec, NC) == 0) && (strncmp(ct2, ra, NC) == 0)) return 1; if ((strncmp(ct1, ra2, NC) == 0) && (strncmp(ct2, dec2, NC) == 0)) { *is_sin = TRUE; return 0; } if ((strncmp(ct1, dec2, NC) == 0) && (strncmp(ct2, ra2, NC) == 0)) { *is_sin = TRUE; return 1; } return -1; } tan_t* tan_read_header(const qfits_header* hdr, tan_t* dest) { tan_t tan; double nil = -1e300; char* ct1; char* ct2; int swap; int W, H; anbool is_sin; memset(&tan, 0, sizeof(tan_t)); ct1 = fits_get_dupstring(hdr, "CTYPE1"); ct2 = fits_get_dupstring(hdr, "CTYPE2"); swap = check_tan_ctypes(ct1, ct2, &is_sin); if (swap == -1) { ERROR("TAN header: expected CTYPE1 = RA---TAN, CTYPE2 = DEC--TAN " "(or vice versa), or RA---SIN, DEC--SIN or vice versa; " "got CTYPE1 = \"%s\", CYTPE2 = \"%s\"\n", ct1, ct2); } free(ct1); free(ct2); if (swap == -1) return NULL; sip_get_image_size(hdr, &W, &H); tan.imagew = W; tan.imageh = H; { const char* keys[] = { "CRVAL1", "CRVAL2", "CRPIX1", "CRPIX2", "CD1_1", "CD1_2", "CD2_1", "CD2_2" }; double* vals[] = { &(tan.crval[0]), &(tan.crval[1]), &(tan.crpix[0]), &(tan.crpix[1]), &(tan.cd[0][0]), &(tan.cd[0][1]), &(tan.cd[1][0]), &(tan.cd[1][1]) }; int i; for (i=0; i<4; i++) { *(vals[i]) = qfits_header_getdouble(hdr, keys[i], nil); if (*(vals[i]) == nil) { ERROR("TAN header: missing or invalid value for \"%s\"", keys[i]); return NULL; } } // Try CD int gotcd = 1; char* complaint = NULL; for (i=4; i<8; i++) { *(vals[i]) = qfits_header_getdouble(hdr, keys[i], nil); if (*(vals[i]) == nil) { asprintf_safe(&complaint, "TAN header: missing or invalid value for key \"%s\"", keys[i]); gotcd = 0; break; } } if (!gotcd) { double cdelt1,cdelt2; // Try CDELT char* key = "CDELT1"; cdelt1 = qfits_header_getdouble(hdr, key, nil); if (cdelt1 == nil) { ERROR("%s; also tried but didn't find \"%s\"", complaint, key); free(complaint); return NULL; } key = "CDELT2"; cdelt2 = qfits_header_getdouble(hdr, key, nil); if (cdelt2 == nil) { ERROR("%s; also tried but didn't find \"%s\"", complaint, key); free(complaint); return NULL; } tan.cd[0][0] = cdelt1; tan.cd[0][1] = 0.0; tan.cd[1][0] = 0.0; tan.cd[1][1] = cdelt2; } } if (swap == 1) { double tmp; tmp = tan.crval[0]; tan.crval[0] = tan.crval[1]; tan.crval[1] = tmp; // swap CD1_1 <-> CD2_1 tmp = tan.cd[0][0]; tan.cd[0][0] = tan.cd[1][0]; tan.cd[1][0] = tmp; // swap CD1_2 <-> CD2_2 tmp = tan.cd[0][1]; tan.cd[0][1] = tan.cd[1][1]; tan.cd[1][1] = tmp; } tan.sin = is_sin; if (!dest) dest = malloc(sizeof(tan_t)); memcpy(dest, &tan, sizeof(tan_t)); return dest; } astrometry.net-0.67/util/sparsematrix.c000644 000765 000024 00000011271 12651445460 020433 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "os-features.h" #include "sparsematrix.h" struct entry { int c; double val; }; typedef struct entry entry_t; int compare_entries(const void* v1, const void* v2) { const entry_t* e1 = v1; const entry_t* e2 = v2; if (e1->c < e2->c) return -1; if (e1->c == e2->c) return 0; return 1; } #define FOR_EACH(sp, X) \ do { \ int r; \ for (r=0; rR; r++) { \ bl* row = sp->rows + r; \ int ci; \ for (ci=0; cirows + r; \ int ci; \ for (ci=0; cirows, ci=0, r=0, e=bl_access(row,ci); rR; \ r = (ci == bl_size(row) ? r+1 : r), \ ci = (ci == bl_size(row) ? 0 : ci+1 ), \ row = sp->rows + r, \ e = (r == sp->R ? NULL : bl_access(row, ci))) //ci = (ci == bl_size(row) ? e=bl_access((ci == bl_size(row) ? sp->rows + (++r) : rows), (ci == bl_size(row) ? 0 : ci)), ci++) */ sparsematrix_t* sparsematrix_new(int R, int C) { int i; sparsematrix_t* sp = calloc(1, sizeof(sparsematrix_t)); sp->R = R; sp->C = C; sp->rows = calloc(R, sizeof(bl)); for (i=0; irows + i, 16, sizeof(entry_t)); return sp; } void sparsematrix_free(sparsematrix_t* sp) { int i; if (!sp) return; for (i=0; iR; i++) bl_remove_all(sp->rows + i); free(sp->rows); free(sp); } void sparsematrix_set(sparsematrix_t* sp, int r, int c, double val) { entry_t e; e.c = c; e.val = val; bl_insert_sorted(sp->rows + r, &e, compare_entries); } // make each row sum to 1. void sparsematrix_normalize_rows(sparsematrix_t* sp) { int i; for (i=0; iR; i++) { int j, N; double sum; bl* row = sp->rows + i; entry_t* e; sum = 0; N = bl_size(row); if (N == 0) continue; for (j=0; jval; } printf("row sum of %i: %g\n", i, sum); for (j=0; jval /= sum; } } } void sparsematrix_mult_vec(const sparsematrix_t* sp, const double* vec, double* out, anbool addto) { int i; for (i=0; iR; i++) { int j, N; double sum; bl* row = sp->rows + i; entry_t* e; sum = 0; N = bl_size(row); for (j=0; jval * vec[e->c]; } if (addto) out[i] += sum; else out[i] = sum; } } void sparsematrix_transpose_mult_vec(const sparsematrix_t* sp, const double* vec, double* out, anbool addto) { int i; if (!addto) for (i=0; iC; i++) out[i] = 0; for (i=0; iR; i++) { int j, N; bl* row = sp->rows + i; entry_t* e; N = bl_size(row); for (j=0; jc] += e->val * vec[i]; } } } int sparsematrix_count_elements_in_row(const sparsematrix_t* sp, int row) { return bl_size(sp->rows + row); } int sparsematrix_count_elements(const sparsematrix_t* sp) { int i, N; N = 0; for (i=0; iR; i++) N += bl_size(sp->rows + i); return N; } void sparsematrix_subset_rows(sparsematrix_t* sp, const int* rows, int NR) { bl* newrows; int i; assert(NR <= sp->R); newrows = malloc(NR * sizeof(bl)); for (i=0; irows[rows[i]]; free(sp->rows); sp->rows = newrows; sp->R = NR; } double sparsematrix_max(const sparsematrix_t* sp) { double mx = -HUGE_VAL; FOR_EACH(sp, mx = MAX(mx, e->val)); /* FOR_EACH_DECL(); FOR_EACH(sp, r, ci, c, row, e) { mx = MAX(mx, e->val); } */ return mx; } double sparsematrix_argmax(const sparsematrix_t* sp, int* pr, int* pc) { double mx = -HUGE_VAL; FOR_EACH(sp, if (e->val > mx) { mx = e->val; *pr = r; *pc = e->c; }); return mx; } double sparsematrix_sum_row(const sparsematrix_t* sp, int r) { double sum = 0.0; FOR_EACH_IN_ROW(sp, r, sum += e->val); return sum; } void sparsematrix_scale_row(const sparsematrix_t* sp, int r, double scale) { FOR_EACH_IN_ROW(sp, r, e->val *= scale); } void sparsematrix_print_row(const sparsematrix_t* sp, int r, FILE* fid) { const bl* row = sp->rows + r; int i; for (i=0; ic, e->val); } fprintf(fid, "\n"); } astrometry.net-0.67/util/sparsematrix.h000644 000765 000024 00000002627 12651445460 020445 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ // Just what the world needs, another... #ifndef SPARSE_MATRIX_H #define SPARSE_MATRIX_H #include #include "astrometry/bl.h" #include "astrometry/an-bool.h" // Stored in row-major form. struct sparsematrix { int R; int C; bl* rows; }; typedef struct sparsematrix sparsematrix_t; sparsematrix_t* sparsematrix_new(int R, int C); void sparsematrix_free(sparsematrix_t* sp); // make each row sum to 1. void sparsematrix_normalize_rows(sparsematrix_t* sp); void sparsematrix_mult_vec(const sparsematrix_t* sp, const double* vec, double* out, anbool addto); void sparsematrix_transpose_mult_vec(const sparsematrix_t* sp, const double* vec, double* out, anbool addto); void sparsematrix_set(sparsematrix_t* sp, int r, int c, double val); int sparsematrix_count_elements_in_row(const sparsematrix_t* sp, int row); int sparsematrix_count_elements(const sparsematrix_t* sp); double sparsematrix_max(const sparsematrix_t* sp); double sparsematrix_argmax(const sparsematrix_t* sp, int* pr, int* pc); void sparsematrix_subset_rows(sparsematrix_t* sp, const int* rows, int NR); void sparsematrix_print_row(const sparsematrix_t* sp, int row, FILE* fid); double sparsematrix_sum_row(const sparsematrix_t* sp, int r); void sparsematrix_scale_row(const sparsematrix_t* sp, int r, double scale); #endif astrometry.net-0.67/util/stages.py000644 000765 000024 00000010575 12651445460 017413 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os from astrometry.util.file import * ''' Stages: a utility for saving and resuming computation, savings intermediate results as pickle files. ''' class CallGlobal(object): def __init__(self, pattern, globals, *args, **kwargs): self.pat = pattern self.args = args self.kwargs = kwargs self.globals = globals def getfunc(self, stage): func = self.pat % stage func = eval(func, self.globals) return func def getkwargs(self, stage, **kwargs): kwa = self.kwargs.copy() kwa.update(kwargs) return kwa def __call__(self, stage, **kwargs): func = self.getfunc(stage) kwa = self.getkwargs(stage, **kwargs) return func(*self.args, **kwa) class CallGlobalTime(CallGlobal): def __call__(self, stage, **kwargs): from astrometry.util.ttime import Time from datetime import datetime t0 = Time() print 'Running stage', stage, 'at', datetime.now().isoformat() rtn = super(CallGlobalTime, self).__call__(stage, **kwargs) t1 = Time() print 'Stage', stage, ':', t1-t0 print 'Stage', stage, 'finished:', datetime.now().isoformat() return rtn def runstage(stage, picklepat, stagefunc, force=[], forceall=False, prereqs={}, update=True, write=True, initial_args={}, **kwargs): ''' Run to a given *stage*. Each stage is a function. Each stage takes a dict and returns None or a dict. Each stage (except the first one!) has a prerequisite stage. Results after running each stage can be written to a pickle file, and later read instead of running the stage. Parameters ---------- stage - int or string Stage name picklepat - string Filename pattern to which pickle data should be written stagefunc - function Function to call for each stage. force - list of stage name/number List of stages to run, ignoring existing pickle files forceall - boolean Force running all stages; ignore all existing pickle files prereqs - dict of stage->stage mappings Defines the dependencies between stages update - boolean Update prerequiste dict with results before writing out pickle write - boolean, or list of stages Write a pickle for this stage / all stages? initial_args - dict Arguments to pass to the first stage kwargs - dict Keyword args added to the prerequisites before running each stage ''' # NOTE, if you add or change args here, be sure to update the recursive # "runstage" call below!! print 'Runstage', stage try: pfn = picklepat % stage except: pfn = picklepat % dict(stage=stage) if os.path.exists(pfn): if forceall or stage in force: print 'Ignoring pickle', pfn, 'and forcing stage', stage else: print 'Reading pickle', pfn R = unpickle_from_file(pfn) return R if stage <= 0: P = initial_args else: try: prereq = prereqs[stage] except KeyError: prereq = stage - 1 if prereq is None: P = initial_args else: P = runstage(prereq, picklepat, stagefunc, force=force, forceall=forceall, prereqs=prereqs, update=update, write=write, initial_args=initial_args, **kwargs) #P.update(kwargs) Px = P.copy() Px.update(kwargs) print 'Running stage', stage print 'Prereq keys:', P.keys() print 'Adding kwargs keys:', kwargs.keys() print 'Combined keys:', Px.keys() R = stagefunc(stage, **Px) print 'Stage', stage, 'finished' if R is not None: print 'Result keys:', R.keys() if update: if R is not None: P.update(R) R = P if not write: pass elif (write is True or stage in write): print 'Saving pickle', pfn print 'Pickling keys:', R.keys() # Create directory, if necessary. dirnm = os.path.dirname(pfn) if len(dirnm) and not os.path.exists(dirnm): try: os.makedirs(dirnm) except: pass pickle_to_file(R, pfn) print 'Saved', pfn return R astrometry.net-0.67/util/starkd.c000644 000765 000024 00000034767 12651445460 017220 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "starkd.h" #include "kdtree.h" #include "kdtree_fits_io.h" #include "starutil.h" #include "fitsbin.h" #include "fitstable.h" #include "errors.h" #include "tic.h" #include "log.h" #include "ioutils.h" #include "fitsioutils.h" static startree_t* startree_alloc() { startree_t* s = calloc(1, sizeof(startree_t)); if (!s) { fprintf(stderr, "Failed to allocate a star kdtree struct.\n"); return NULL; } return s; } sl* startree_get_tagalong_column_names(startree_t* s, sl* lst) { if (!startree_has_tagalong(s)) return NULL; return fitstable_get_fits_column_names(startree_get_tagalong(s), lst); } int startree_get_tagalong_N_columns(startree_t* s) { if (!startree_has_tagalong(s)) return 0; return fitstable_get_N_fits_columns(startree_get_tagalong(s)); } /** Returns the name of the 'i'th column in the tagalong table. */ const char* startree_get_tagalong_column_name(startree_t* s, int i) { if (!startree_has_tagalong(s)) return NULL; return fitstable_get_fits_column_name(startree_get_tagalong(s), i); } tfits_type startree_get_tagalong_column_fits_type(startree_t* s, int i) { if (!startree_has_tagalong(s)) return TFITS_BIN_TYPE_UNKNOWN; return fitstable_get_fits_column_type(startree_get_tagalong(s), i); } int startree_get_tagalong_column_array_size(startree_t* s, int i) { if (!startree_has_tagalong(s)) return -1; return fitstable_get_fits_column_array_size(startree_get_tagalong(s), i); } static void* get_data_column(startree_t* s, const char* colname, const int* inds, int N, tfits_type tt) { fitstable_t* table; void* arr; if (N == 0) { logmsg("Warning: zero stars (elements) in your request for data column \"%s\"\n", colname); return NULL; } table = startree_get_tagalong(s); if (!table) { ERROR("No tag-along data found"); return NULL; } arr = fitstable_read_column_inds(table, colname, tt, inds, N); if (!arr) { ERROR("Failed to read tag-along data column \"%s\"", colname); return NULL; } return arr; } double* startree_get_data_column(startree_t* s, const char* colname, const int* inds, int N) { return get_data_column(s, colname, inds, N, fitscolumn_double_type()); } int64_t* startree_get_data_column_int64(startree_t* s, const char* colname, const int* inds, int N) { return get_data_column(s, colname, inds, N, fitscolumn_i64_type()); } double* startree_get_data_column_array(startree_t* s, const char* colname, const int* indices, int N, int* arraysize) { fitstable_t* table; tfits_type dubl = fitscolumn_double_type(); double* arr; table = startree_get_tagalong(s); if (!table) { ERROR("No tag-along data found"); return NULL; } arr = fitstable_read_column_array_inds(table, colname, dubl, indices, N, arraysize); if (!arr) { ERROR("Failed to read tag-along data"); return NULL; } return arr; } void startree_free_data_column(startree_t* s, double* d) { free(d); } void startree_search_for_radec(const startree_t* s, double ra, double dec, double radius, double** xyzresults, double** radecresults, int** starinds, int* nresults) { double xyz[3]; double r2; radecdeg2xyzarr(ra, dec, xyz); r2 = deg2distsq(radius); startree_search_for(s, xyz, r2, xyzresults, radecresults, starinds, nresults); } void startree_search_for(const startree_t* s, const double* xyzcenter, double radius2, double** xyzresults, double** radecresults, int** starinds, int* nresults) { kdtree_qres_t* res = NULL; int opts; double* xyz; int i, N; opts = KD_OPTIONS_SMALL_RADIUS; if (xyzresults || radecresults) opts |= KD_OPTIONS_RETURN_POINTS; res = kdtree_rangesearch_options(s->tree, xyzcenter, radius2, opts); if (!res || !res->nres) { if (xyzresults) *xyzresults = NULL; if (radecresults) *radecresults = NULL; if (starinds) *starinds = NULL; *nresults = 0; if (res) kdtree_free_query(res); return; } xyz = res->results.d; N = res->nres; *nresults = N; if (radecresults) { *radecresults = malloc(N * 2 * sizeof(double)); for (i=0; iresults.d = NULL; } if (starinds) { *starinds = malloc(res->nres * sizeof(int)); for (i=0; iinds[i]; } kdtree_free_query(res); } void startree_search(const startree_t* s, const double* xyzcenter, double radius2, double** xyzresults, double** radecresults, int* nresults) { startree_search_for(s, xyzcenter, radius2, xyzresults, radecresults, NULL, nresults); } int startree_N(const startree_t* s) { return s->tree->ndata; } int startree_nodes(const startree_t* s) { return s->tree->nnodes; } int startree_D(const startree_t* s) { return s->tree->ndim; } qfits_header* startree_header(const startree_t* s) { return s->header; } static bl* get_chunks(startree_t* s, il* wordsizes) { bl* chunks = bl_new(4, sizeof(fitsbin_chunk_t)); fitsbin_chunk_t chunk; kdtree_t* kd = s->tree; fitsbin_chunk_init(&chunk); chunk.tablename = "sweep"; chunk.forced_type = fitscolumn_u8_type(); chunk.itemsize = sizeof(uint8_t); chunk.nrows = kd->ndata; chunk.data = s->sweep; chunk.userdata = &(s->sweep); chunk.required = FALSE; bl_append(chunks, &chunk); if (wordsizes) il_append(wordsizes, sizeof(uint8_t)); fitsbin_chunk_clean(&chunk); return chunks; } static startree_t* my_open(const char* fn, anqfits_t* fits) { struct timeval tv1, tv2; startree_t* s; bl* chunks; int i; kdtree_fits_t* io; char* treename = STARTREE_NAME; const char* thefn = fn; assert(fn || fits); if (!thefn) thefn = fits->filename; s = startree_alloc(); if (!s) return NULL; gettimeofday(&tv1, NULL); if (fn) io = kdtree_fits_open(fn); else io = kdtree_fits_open_fits(fits); gettimeofday(&tv2, NULL); debug("kdtree_fits_open() took %g ms\n", millis_between(&tv1, &tv2)); if (!io) { ERROR("Failed to open FITS file \"%s\"", thefn); goto bailout; } gettimeofday(&tv1, NULL); if (!kdtree_fits_contains_tree(io, treename)) treename = NULL; gettimeofday(&tv2, NULL); debug("kdtree_fits_contains_tree() took %g ms\n", millis_between(&tv1, &tv2)); gettimeofday(&tv1, NULL); s->tree = kdtree_fits_read_tree(io, treename, &s->header); gettimeofday(&tv2, NULL); debug("kdtree_fits_read_tree() took %g ms\n", millis_between(&tv1, &tv2)); if (!s->tree) { ERROR("Failed to read kdtree from file \"%s\"", thefn); goto bailout; } // Check the tree dimensionality. // (because code trees can be confused...) if (s->tree->ndim != 3) { logverb("File %s contains a kd-tree with dim %i (not 3), named %s\n", thefn, s->tree->ndim, treename); s->tree->io = NULL; goto bailout; } gettimeofday(&tv1, NULL); chunks = get_chunks(s, NULL); for (i=0; iuserdata; kdtree_fits_read_chunk(io, chunk); *dest = chunk->data; } bl_free(chunks); gettimeofday(&tv2, NULL); debug("reading chunks took %g ms\n", millis_between(&tv1, &tv2)); // kdtree_fits_t is a typedef of fitsbin_t fitsbin_close_fd(io); return s; bailout: kdtree_fits_io_close(io); startree_close(s); return NULL; } startree_t* startree_open_fits(anqfits_t* fits) { return my_open(NULL, fits); } startree_t* startree_open(const char* fn) { return my_open(fn, NULL); } /* uint64_t startree_get_starid(const startree_t* s, int ind) { if (!s->starids) return 0; return s->starids[ind]; } */ int startree_close(startree_t* s) { if (!s) return 0; if (s->inverse_perm) free(s->inverse_perm); if (s->header) qfits_header_destroy(s->header); if (s->tree) { if (s->writing) { kdtree_free(s->tree); free(s->sweep); } else kdtree_fits_close(s->tree); } if (s->tagalong) fitstable_close(s->tagalong); free(s); return 0; } static fitstable_t* get_tagalong(startree_t* s, anbool report_errs) { char* fn; int next; int i; int ext = -1; fitstable_t* tag; if (!s->tree->io) return NULL; fn = fitsbin_get_filename(s->tree->io); if (!fn) { if (report_errs) ERROR("No filename"); return NULL; } tag = fitstable_open(fn); if (!tag) { if (report_errs) ERROR("Failed to open FITS table from %s", fn); return NULL; } next = fitstable_n_extensions(tag); for (i=1; ianq, i); if (!hdr) { if (report_errs) ERROR("Failed to read FITS header for ext %i in %s", i, fn); return NULL; } type = fits_get_dupstring(hdr, "AN_FILE"); eq = streq(type, AN_FILETYPE_TAGALONG); free(type); if (!eq) continue; ext = i; break; } if (ext == -1) { if (report_errs) ERROR("Failed to find a FITS header with the card AN_FILE = TAGALONG"); return NULL; } fitstable_open_extension(tag, ext); return tag; } fitstable_t* startree_get_tagalong(startree_t* s) { if (s->tagalong) return s->tagalong; s->tagalong = get_tagalong(s, TRUE); return s->tagalong; } anbool startree_has_tagalong(startree_t* s) { return (startree_get_tagalong(s) != NULL); } static int Ndata(const startree_t* s) { return s->tree->ndata; } int startree_check_inverse_perm(startree_t* s) { // ensure that each value appears exactly once. int i, N; uint8_t* counts; N = Ndata(s); counts = calloc(Ndata(s), sizeof(uint8_t)); for (i=0; iinverse_perm[i] >= 0); assert(s->inverse_perm[i] < N); counts[s->inverse_perm[i]]++; } for (i=0; iinverse_perm) return; // compute inverse permutation vector. s->inverse_perm = malloc(Ndata(s) * sizeof(int)); if (!s->inverse_perm) { fprintf(stderr, "Failed to allocate star kdtree inverse permutation vector.\n"); return; } #ifndef NDEBUG { int i; for (i=0; iinverse_perm[i] = -1; } #endif kdtree_inverse_permutation(s->tree, s->inverse_perm); #ifndef NDEBUG { int i; for (i=0; iinverse_perm[i] != -1); } #endif } int startree_get_cut_nside(const startree_t* s) { return qfits_header_getint(s->header, "CUTNSIDE", -1); } int startree_get_cut_nsweeps(const startree_t* s) { return qfits_header_getint(s->header, "CUTNSWEP", -1); } double startree_get_cut_dedup(const startree_t* s) { return qfits_header_getdouble(s->header, "CUTDEDUP", 0.0); } char* startree_get_cut_band(const startree_t* s) { static char* bands[] = { "R", "B", "J" }; int i; char* str = fits_get_dupstring(s->header, "CUTBAND"); char* rtn = NULL; if (!str) return NULL; for (i=0; iheader, "CUTMARG", -1); } double startree_get_jitter(const startree_t* s) { return qfits_header_getdouble(s->header, "JITTER", 0.0); } void startree_set_jitter(startree_t* s, double jitter_arcsec) { fits_header_set_double(s->header, "JITTER", jitter_arcsec, "Positional error of stars [arcsec]"); } int startree_get_sweep(const startree_t* s, int ind) { if (ind < 0 || ind >= Ndata(s) || !s->sweep) return -1; return s->sweep[ind]; } int startree_get(startree_t* s, int starid, double* posn) { if (s->tree->perm && !s->inverse_perm) { startree_compute_inverse_perm(s); if (!s->inverse_perm) return -1; } if (starid >= Ndata(s)) { fprintf(stderr, "Invalid star ID: %u >= %u.\n", starid, Ndata(s)); assert(0); return -1; } if (s->inverse_perm) { kdtree_copy_data_double(s->tree, s->inverse_perm[starid], 1, posn); } else { kdtree_copy_data_double(s->tree, starid, 1, posn); } return 0; } int startree_get_radec(startree_t* s, int starid, double* ra, double* dec) { double xyz[3]; int rtn; rtn = startree_get(s, starid, xyz); if (rtn) return rtn; xyzarr2radecdeg(xyz, ra, dec); return rtn; } startree_t* startree_new() { startree_t* s = startree_alloc(); s->header = qfits_header_default(); if (!s->header) { fprintf(stderr, "Failed to create a qfits header for star kdtree.\n"); free(s); return NULL; } qfits_header_add(s->header, "AN_FILE", AN_FILETYPE_STARTREE, "This file is a star kdtree.", NULL); s->writing = TRUE; return s; } static int write_to_file(startree_t* s, const char* fn, anbool flipped, FILE* fid) { bl* chunks; il* wordsizes = NULL; int i; kdtree_fits_t* io = NULL; // just haven't bothered... assert(!(flipped && fid)); if (fn) { io = kdtree_fits_open_for_writing(fn); if (!io) { ERROR("Failed to open file \"%s\" for writing kdtree", fn); return -1; } } if (flipped) { if (kdtree_fits_write_tree_flipped(io, s->tree, s->header)) { ERROR("Failed to write (flipped) kdtree to file \"%s\"", fn); return -1; } } else { if (fid) { if (kdtree_fits_append_tree_to(s->tree, s->header, fid)) { ERROR("Failed to write star kdtree"); return -1; } } else { if (kdtree_fits_write_tree(io, s->tree, s->header)) { ERROR("Failed to write kdtree to file \"%s\"", fn); return -1; } } } if (flipped) wordsizes = il_new(4); chunks = get_chunks(s, wordsizes); for (i=0; idata) continue; if (flipped) kdtree_fits_write_chunk_flipped(io, chunk, il_get(wordsizes, i)); else { if (fid) { kdtree_fits_write_chunk_to(chunk, fid); } else { kdtree_fits_write_chunk(io, chunk); } } fitsbin_chunk_clean(chunk); } bl_free(chunks); if (flipped) il_free(wordsizes); if (io) kdtree_fits_io_close(io); return 0; } int startree_write_to_file(startree_t* s, const char* fn) { return write_to_file(s, fn, FALSE, NULL); } int startree_write_to_file_flipped(startree_t* s, const char* fn) { return write_to_file(s, fn, TRUE, NULL); } int startree_append_to(startree_t* s, FILE* fid) { return write_to_file(s, NULL, FALSE, fid); } astrometry.net-0.67/util/starutil.c000644 000765 000024 00000020417 12651445460 017562 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "os-features.h" #include "keywords.h" #include "mathutil.h" #include "starutil.h" #include "errors.h" #define POGSON 2.51188643150958 #define LOGP 0.92103403719762 #define InlineDefine InlineDefineC #include "starutil.inc" #undef InlineDefine void radec_derivatives(double ra, double dec, double* dra, double* ddec) { double cosd = cos(deg2rad(dec)); double cosra = cos(deg2rad(ra)); double sinra = sin(deg2rad(ra)); if (dra) { dra[0] = cosd * -sinra; dra[1] = cosd * cosra; dra[2] = 0.0; normalize_3(dra); } if (ddec) { double sind = sin(deg2rad(dec)); ddec[0] = -sind * cosra; ddec[1] = -sind * sinra; ddec[2] = cosd; normalize_3(ddec); } } void radecrange2xyzrange(double ralo, double declo, double rahi, double dechi, double* minxyz, double* maxxyz) { double minmult, maxmult; double uxlo, uxhi, uylo, uyhi; // Dec only affects z, and is monotonic (z = sin(dec)) minxyz[2] = radec2z(0, declo); maxxyz[2] = radec2z(0, dechi); // min,max of cos(dec). cos(dec) is concave down. minmult = MIN(cos(deg2rad(declo)), cos(deg2rad(dechi))); maxmult = MAX(cos(deg2rad(declo)), cos(deg2rad(dechi))); if (declo < 0 && dechi > 0) maxmult = 1.0; // unscaled x (ie, cos(ra)) uxlo = MIN(cos(deg2rad(ralo)), cos(deg2rad(rahi))); if (ralo < 180 && rahi > 180) uxlo = -1.0; uxhi = MAX(cos(deg2rad(ralo)), cos(deg2rad(rahi))); minxyz[0] = MIN(uxlo * minmult, uxlo * maxmult); maxxyz[0] = MAX(uxhi * minmult, uxhi * maxmult); // unscaled y (ie, sin(ra)) uylo = MIN(sin(deg2rad(ralo)), sin(deg2rad(rahi))); if (ralo < 270 && rahi > 270) uylo = -1.0; uyhi = MAX(sin(deg2rad(ralo)), sin(deg2rad(rahi))); if (ralo < 90 && rahi > 90) uyhi = -1.0; minxyz[1] = MIN(uylo * minmult, uylo * maxmult); maxxyz[1] = MAX(uyhi * minmult, uyhi * maxmult); } static int parse_hms_string(const char* str, int* sign, int* term1, int* term2, double* term3) { anbool matched; regmatch_t matches[6]; int nmatches = 6; regex_t re; regmatch_t* m; const char* s; const char* restr = "^([+-])?([[:digit:]]{1,2}):" "([[:digit:]]{1,2}):" "([[:digit:]]*(\\.[[:digit:]]*)?)$"; if (regcomp(&re, restr, REG_EXTENDED)) { ERROR("Failed to compile H:M:S regex \"%s\"", restr); return -1; } matched = (regexec(&re, str, nmatches, matches, 0) == 0); regfree(&re); if (!matched) return 1; // sign m = matches + 1; s = str + m->rm_so; if (m->rm_so == -1 || s[0] == '+') *sign = 1; else *sign = -1; // hrs / deg m = matches + 2; s = str + m->rm_so; if (s[0] == '0') s++; *term1 = atoi(s); // Min m = matches + 3; s = str + m->rm_so; if (s[0] == '0') s++; *term2 = atoi(s); // Sec m = matches + 4; s = str + m->rm_so; *term3 = atof(s); return 0; } double atora(const char* str) { char* eptr; double ra; int sgn, hr, min; double sec; int rtn; rtn = parse_hms_string(str, &sgn, &hr, &min, &sec); if (rtn == -1) { ERROR("Failed to run regex"); return HUGE_VAL; } if (rtn == 0) return sgn * hms2ra(hr, min, sec); ra = strtod(str, &eptr); if (eptr == str) // no conversion return HUGE_VAL; return ra; } double atodec(const char* str) { char* eptr; double dec; int sgn, deg, min; double sec; int rtn; rtn = parse_hms_string(str, &sgn, °, &min, &sec); if (rtn == -1) { ERROR("Failed to run regex"); return HUGE_VAL; } if (rtn == 0) return dms2dec(sgn, deg, min, sec); dec = strtod(str, &eptr); if (eptr == str) // no conversion return HUGE_VAL; return dec; } double mag2flux(double mag) { return pow(POGSON, -mag); } double flux2mag(double flux) { return -log(flux) * LOGP; } inline void xyzarr2radecarr(const double* xyz, double *radec) { xyz2radec(xyz[0], xyz[1], xyz[2], radec+0, radec+1); } double distsq_between_radecdeg(double ra1, double dec1, double ra2, double dec2) { double xyz1[3]; double xyz2[3]; radecdeg2xyzarr(ra1, dec1, xyz1); radecdeg2xyzarr(ra2, dec2, xyz2); return distsq(xyz1, xyz2, 3); } double arcsec_between_radecdeg(double ra1, double dec1, double ra2, double dec2) { return distsq2arcsec(distsq_between_radecdeg(ra1, dec1, ra2, dec2)); } double deg_between_radecdeg(double ra1, double dec1, double ra2, double dec2) { return arcsec2deg(arcsec_between_radecdeg(ra1, dec1, ra2, dec2)); } void project_equal_area(double x, double y, double z, double* projx, double* projy) { double Xp = x*sqrt(1./(1. + z)); double Yp = y*sqrt(1./(1. + z)); Xp = 0.5 * (1.0 + Xp); Yp = 0.5 * (1.0 + Yp); assert(Xp >= 0.0 && Xp <= 1.0); assert(Yp >= 0.0 && Yp <= 1.0); *projx = Xp; *projy = Yp; } void project_hammer_aitoff_x(double x, double y, double z, double* projx, double* projy) { double theta = atan(x/z); double r = sqrt(x*x+z*z); double zp, xp; /* Hammer-Aitoff projection with x-z plane compressed to purely +z side * of xz plane */ if (z < 0) { if (x < 0) { theta = theta - M_PI; } else { theta = M_PI + theta; } } theta /= 2.0; zp = r*cos(theta); xp = r*sin(theta); assert(zp >= -0.01); project_equal_area(xp, y, zp, projx, projy); } /* makes a star object located uniformly at random within the limits given on the sphere */ void make_rand_star(double* star, double ramin, double ramax, double decmin, double decmax) { double decval, raval; if (ramin < 0.0) ramin = 0.0; if (ramax > (2*M_PI)) ramax = 2 * M_PI; if (decmin < -M_PI / 2.0) decmin = -M_PI / 2.0; if (decmax > M_PI / 2.0) decmax = M_PI / 2.0; decval = asin(uniform_sample(sin(decmin), sin(decmax))); raval = uniform_sample(ramin, ramax); star[0] = radec2x(raval, decval); star[1] = radec2y(raval, decval); star[2] = radec2z(raval, decval); } // RA in degrees to Mercator X coordinate [0, 1). inline double ra2mercx(double ra) { double mx = ra / 360.0; if (mx < 0.0 || mx > 1.0) { mx = fmod(mx, 1.0); if (mx < 0.0) mx += 1.0; } return mx; } // Dec in degrees to Mercator Y coordinate [0, 1). inline double dec2mercy(double dec) { return 0.5 + (asinh(tan(deg2rad(dec))) / (2.0 * M_PI)); } double hms2ra(int h, int m, double s) { return 15.0 * (h + ((m + (s / 60.0)) / 60.0)); } double dms2dec(int sgn, int d, int m, double s) { return sgn * (d + ((m + (s / 60.0)) / 60.0)); } // RA in degrees to H:M:S inline void ra2hms(double ra, int* h, int* m, double* s) { double rem; ra = fmod(ra, 360.0); if (ra < 0.0) ra += 360.0; rem = ra / 15.0; *h = floor(rem); // remaining (fractional) hours rem -= *h; // -> minutes rem *= 60.0; *m = floor(rem); // remaining (fractional) minutes rem -= *m; // -> seconds rem *= 60.0; *s = rem; } // Dec in degrees to D:M:S void dec2dms(double dec, int* sign, int* d, int* m, double* s) { double rem; double flr; *sign = (dec >= 0.0) ? 1 : -1; dec *= (*sign); flr = floor(dec); *d = flr; // remaining degrees: rem = dec - flr; // -> minutes rem *= 60.0; *m = floor(rem); // remaining (fractional) minutes rem -= *m; // -> seconds rem *= 60.0; *s = rem; } void ra2hmsstring(double ra, char* str) { int h, m; double s; int ss; int ds; ra2hms(ra, &h, &m, &s); // round to display to 3 decimal places ss = (int)floor(s); ds = (int)round((s - ss) * 1000.0); if (ds >= 1000) { ss++; ds -= 1000; } if (ss >= 60) { ss -= 60; m += 1; } if (m >= 60) { m -= 60; h += 1; } sprintf(str, "%02i:%02i:%02i.%03i", h, m, ss, ds); } void dec2dmsstring(double dec, char* str) { int sign, d, m; double s; int ss, ds; dec2dms(dec, &sign, &d, &m, &s); ss = (int)floor(s); ds = (int)round((s - ss) * 1000.0); if (ds >= 1000) { ss++; ds -= 1000; } if (ss >= 60) { ss -= 60; m += 1; } if (m >= 60) { m -= 60; d += 1; } sprintf(str, "%c%02i:%02i:%02i.%03i", (sign==1 ? '+':'-'), d, m, ss, ds); } astrometry.net-0.67/util/starutil.py000644 000765 000024 00000007100 12651445460 017762 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from math import pi,cos,sin,radians,degrees,asin,atan2,sqrt,acos,floor def hms2ra(h, m, s): return 15. * (h + (m + s/60.)/60.) def dms2dec(sign, d, m, s): return sign * (d + (m + s/60.)/60.) def tokenize_hms(s): s = s.strip() # split on whitespace tokens = s.split() # also split on colons tokens = reduce(list.__add__, [t.split(':') for t in tokens]) assert(len(tokens) < 4) assert(len(tokens) > 0) h = len(tokens) >= 1 and float(tokens[0]) or 0 m = len(tokens) >= 2 and float(tokens[1]) or 0 s = len(tokens) >= 3 and float(tokens[2]) or 0 return (h,m,s) def hmsstring2hms(st): (h,m,s) = tokenize_hms(st) return (h,m,s) def hmsstring2ra(st): return hms2ra(*hmsstring2hms(st)) # returns (sign, deg, minutes, second) def dmsstring2dms(s): sign = 1.0 if s[0] == '-': sign = -1.0 s = s[1:] elif s[0] == '+': s = s[1:] (d,m,s) = tokenize_hms(s) return (sign, d, m, s) def dmsstring2dec(s): return dms2dec(*dmsstring2dms(s)) # RA in degrees def ra2hms(ra): h = ra * 24. / 360. hh = int(floor(h)) m = (h - hh) * 60. mm = int(floor(m)) s = (m - mm) * 60. return (hh, mm, s) # Dec in degrees # returns (sign, degrees, minutes, seconds) def dec2dms(dec): sgn = (dec > 0) and 1 or -1 d = dec * sgn dd = int(floor(d)) m = (d - dd) * 60. mm = int(floor(m)) s = (m - mm) * 60. return (sgn, d, m, s) # RA in degrees def ra2hmsstring(ra, separator=' '): (h,m,s) = ra2hms(ra) ss = int(floor(s)) ds = int(round((s - ss) * 1000.0)) return separator.join(['%0.2i' % h, '%0.2i' % m, '%0.2i.%0.3i' % (ss,ds)]) # Dec in degrees def dec2dmsstring(dec, separator=' '): (sign,d,m,s) = dec2dms(dec) # whole number of seconds ss = int(floor(s)) # milliseconds ds = int(round((s - ss) * 1000.0)) # fix rounding errors... if ds >= 1000: ds -= 1000 ss += 1 return separator.join(['%+0.2i' % int(d*sign), '%0.2i' % m, '%0.2i.%0.3i' % (ss,ds)]) # RA, Dec in degrees def radectoxyz(ra, dec): rarad = radians(ra) decrad = radians(dec) cosd = cos(decrad) return (cosd * cos(rarad), cosd * sin(rarad), sin(decrad)) # RA, Dec in degrees def xyztoradec(x,y,z): return (degrees(xy2ra(x, y)), degrees(z2dec(z))) def xyzarrtoradec(xyz): return (degrees(xy2ra(xyz[0], xyz[1])), degrees(z2dec(xyz[2]))) def rad2deg(r): return 180.0*r/pi def deg2rad(d): return d*pi/180.0 def rad2arcmin(r): return 10800.0*r/pi def arcmin2rad(a): return a*pi/10800.0 def rad2arcsec(r): return 648000.0*r/pi def arcsec2rad(a): return a*pi/648000.0 def arcsec2deg(a): return rad2deg(arcsec2rad(a)) def radec2x(r,d): return cos(d)*cos(r) # r,d in radians def radec2y(r,d): return cos(d)*sin(r) # r,d in radians def radec2z(r,d): return sin(d) # r,d in radians def z2dec(z): return asin(z) # result in radians def xy2ra(x,y): "Convert x,y to ra in radians" r = atan2(y,x) r += 2*pi*(r<0.) return r def degrees_between(ra1, dec1, ra2, dec2): return arcsec2deg(arcsec_between(ra1, dec1, ra2, dec2)) # RA,Decs in degrees. def arcsec_between(ra1, dec1, ra2, dec2): xyz1 = radectoxyz(ra1, dec1) xyz2 = radectoxyz(ra2, dec2) d2 = sum([(a-b)**2 for (a,b) in zip(xyz1, xyz2)]) return distsq2arcsec(d2) def rad2distsq(rad): return 2. * (1. - cos(rad)) def arcsec2distsq(arcsec): return rad2distsq(arcsec2rad(arcsec)) def arcsec2dist(arcsec): return sqrt(arcsec2distsq(arcsec)) def dist2arcsec(dist): return distsq2arcsec(dist**2) def distsq2arcsec(dist2): return rad2arcsec(distsq2rad(dist2)) def distsq2rad(dist2): return acos(1. - dist2 / 2.) astrometry.net-0.67/util/starutil2.py000644 000765 000024 00000007516 12651445460 020057 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from math import * # Needed if we're going to exclude pylab :) PIl = 3.1415926535897932384626433832795029 def rad2deg(r): return 180.0*r/PIl def deg2rad(d): return d*PIl/180.0 def rad2arcmin(r): return 10800.0*r/PIl def arcmin2rad(a): return a*PIl/10800.0 def rad2arcsec(r): return 648000.0*r/PIl def arcsec2rad(a): return a*PIl/648000.0 def radec2x(r,d): return cos(d)*cos(r) # r,d in radians def radec2y(r,d): return cos(d)*sin(r) # r,d in radians def radec2z(r,d): return sin(d) # r,d in radians def z2dec(z): return arcsin(z) # result in radians def xy2ra(x,y): "Convert x,y to ra in radians" r = arctan2(y,x) r += 2*PIl*(r>=0.00) return r # wrapper to give us a tuple. def radec2xyz(r,d): return (radec2x(r,d), radec2y(r,d), radec2z(r,d)) # Takes min/max RA & DEC (which a number of the catalogs provide) and # compute the xyz coordinates of the box on the surface of the sphere. def radecbox2xyz(min_r, max_r, min_d, max_d): return [radec2xyz(min_r, min_d), radec2xyz(min_r, max_d), \ radec2xyz(max_r, max_d), radec2xyz(max_r, min_d)] #define radscale2xyzscale(r) (sqrt(2.0-2.0*cos(r/2.0))) def star_coords(s,r): # eta is a vector perpendicular to r etax = -r[1] etay = +r[0] etaz = 0.0 eta_norm = sqrt(etax * etax + etay * etay) etax /= eta_norm etay /= eta_norm # xi = r cross eta xix = -r[2] * etay xiy = r[2] * etax xiz = r[0] * etay - r[1] * etax sdotr = dot(s,r) return ( s[0] * xix / sdotr + s[1] * xiy / sdotr + s[2] * xiz / sdotr, s[0] * etax / sdotr + s[1] * etay / sdotr ) def radectohealpix(ra, dec): x = radec2x(ra, dec) y = radec2y(ra, dec) z = radec2z(ra, dec) return xyztohealpix(x, y, z) def xyztohealpix(x, y, z) : "Return the healpix catalog number associated with point (x,y,z)" # the polar pixel center is at (z,phi/pi) = (2/3, 1/4) # the left pixel center is at (z,phi/pi) = (0, 0) # the right pixel center is at (z,phi/pi) = (0, 1/2) twothirds = 2.0 / 3.0 phi = arctan2(y, x) if phi < 0.0: phi += 2.0 * pi phioverpi = phi / pi if z >= twothirds or z <= -twothirds: # definitely in the polar regions. # the north polar healpixes are 0,1,2,3 # the south polar healpixes are 8,9,10,11 if z >= twothirds: offset = 0 else: offset = 8 pix = int(phioverpi * 2.0) return offset + pix # could be polar or equatorial. offset = int(phioverpi * 2.0) phimod = phioverpi - offset * 0.5 z1 = twothirds - (8.0 / 3.0) * phimod z2 = -twothirds + (8.0 / 3.0) * phimod if z >= z1 and z >= z2: # north polar return offset if z <= z1 and z <= z2: # south polar return offset + 8 if phimod < 0.25: # left equatorial return offset + 4 # right equatorial return ((offset+1)%4) + 4 # Brought over from starutil.c & plotcat.c def project_equal_area(point): x, y, z = point xp = x * sqrt(1. / (1. + z)) yp = y * sqrt(1. / (1. + z)) xp = 0.5 * (1.0 + xp) yp = 0.5 * (1.0 + yp) return (xp, yp) def project_hammer_aitoff_x(point): x, y, z = point theta = atan(float(x) / (z + 0.000001)) r = sqrt(x * x + z * z) if z < 0: if x < 0: theta = theta - pi else: theta = pi + theta theta /= 2.0 zp = r * cos(theta) xp = r * sin(theta) assert zp >= -0.01 return project_equal_area((xp, y, zp)) def getxy(projectedpoint, N): px, py = projectedpoint px = 0.5 + (px - 0.5) * 0.99 py = 0.5 + (py - 0.5) * 0.99 X = round(px * 2*N) Y = round(py * N) return (X, Y) astrometry.net-0.67/util/starutil_numpy.py000644 000765 000024 00000042131 12651445460 021215 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from numpy import * import datetime import numpy as np arcsecperrad = 3600. * 180. / np.pi axistilt = 23.44 # degrees def ra_normalize(ra): return np.mod(ra, 360.) # def transform(long, lat, poleTo, poleFrom): (alphaGP,deltaGP) = deg2rad(poleFrom[0]), deg2rad(poleFrom[1]) lCP = deg2rad(poleTo[0]) alpha = deg2rad(long) delta = deg2rad(lat) ra = rad2deg(lCP - arctan2(sin(alpha - alphaGP), tan(delta) * cos(deltaGP) - cos(alpha - alphaGP) * sin(deltaGP))) dec = rad2deg(arcsin((sin(deltaGP)*sin(delta) + cos(deltaGP)*cos(delta)*cos(alpha - alphaGP)))) ra = ra_normalize(ra) return ra,dec # Galactic (l,b) to equatorial (ra,dec). # Lifted from LSST's afw.coord.Coord class by Steve Bickerton. def lbtoradec(l, b): # aka 'GalacticPoleInFk5' poleTo = (192.8595, 27.12825) # aka 'Fk5PoleInGalactic' poleFrom = (122.9320, 27.12825) return transform(l, b, poleTo, poleFrom) galactictoradec = lbtoradec def eclipticPoleInclination(epoch): T = (epoch - 2000.0) / 100.0 eclincl = (23.0 + 26.0/60.0 + (21.448 - 46.82*T - 0.0006*T*T - 0.0018*T*T*T)/3600.0) return eclincl # Thanks to Steve Bickerton in lsst.afw.Coord : EclipticCoord::toFk5 def ecliptictoradec(a, b, epoch=2000.): eclincl = eclipticPoleInclination(epoch) eclipticPoleInFk5 = (270.0, 90.0 - eclincl) fk5PoleInEcliptic = (90.0, 90.0 - eclincl) return transform(a, b, eclipticPoleInFk5, fk5PoleInEcliptic) # Thanks to Steve Bickerton in lsst.afw.Coord : Fk5Coord::toEcliptic def radectoecliptic(ra, dec, epoch=2000.): eclincl = eclipticPoleInclination(epoch) eclPoleInEquatorial = (270.0, 90.0 - eclincl) equPoleInEcliptic = (90.0, 90.0 - eclincl) return transform(ra, dec, equPoleInEcliptic, eclPoleInEquatorial) # scalars (racenter, deccenter) in deg # scalar radius in deg # arrays (ra,dec) in deg # returns array of booleans def points_within_radius(racenter, deccenter, radius, ra, dec): return radecdotproducts(racenter, deccenter, ra, dec) >= cos(deg2rad(radius)) def points_within_radius_range(racenter, deccenter, radiuslo, radiushi, ra, dec): d = radecdotproducts(racenter, deccenter, ra, dec) return (d <= cos(deg2rad(radiuslo))) * (d >= cos(deg2rad(radiushi))) # scalars (racenter, deccenter) in deg # arrays (ra,dec) in deg # returns array of cosines def radecdotproducts(racenter, deccenter, ra, dec): xyzc = radectoxyz(racenter, deccenter).T xyz = radectoxyz(ra, dec) return dot(xyz, xyzc)[:,0] # RA, Dec in degrees: scalars or 1-d arrays. # returns xyz of shape (N,3) def radectoxyz(ra_deg, dec_deg): ra = deg2rad(ra_deg) dec = deg2rad(dec_deg) cosd = cos(dec) xyz = vstack((cosd * cos(ra), cosd * sin(ra), sin(dec))).T assert(xyz.shape[1] == 3) return xyz # RA,Dec in degrees # returns (dxyz_dra, dxyz_ddec) def derivatives_at_radec(ra_deg, dec_deg): ra = deg2rad(ra_deg) dec = deg2rad(dec_deg) cosd = cos(dec) sind = sin(dec) cosra = cos(ra) sinra = sin(ra) return (180./pi * vstack((cosd * -sinra, cosd * cosra, 0)).T, 180./pi * vstack((-sind * cosra, -sind * sinra, cosd)).T) def xyztoradec(xyz): ''' Converts positions on the unit sphere to RA,Dec in degrees. 'xyz' must be a numpy array, either of shape (3,) or (N,3) Returns a tuple (RA,Dec). If 'xyz' is a scalar, RA,Dec are scalars. If 'xyz' is shape (N,3), RA,Dec are shape (N,). >>> xyztoradec(array([1,0,0])) (0.0, 0.0) >>> xyztoradec(array([ [1,0,0], [0,1,0], [0,0,1]])) (array([ 0., 90., 0.]), array([ 0., 0., 90.])) >>> xyztoradec(array([0,1,0])) (90.0, 0.0) >>> xyztoradec(array([0,0,1])) (0.0, 90.0) ''' if len(xyz.shape) == 1: # HACK! rs,ds = xyztoradec(xyz[newaxis,:]) return (rs[0], ds[0]) (nil,three) = xyz.shape assert(three == 3) ra = arctan2(xyz[:,1], xyz[:,0]) ra += 2*pi * (ra < 0) dec = arcsin(xyz[:,2] / norm(xyz)[:,0]) return (rad2deg(ra), rad2deg(dec)) ##################### # RA,Decs in degrees. Both pairs can be arrays. def distsq_between_radecs(ra1, dec1, ra2, dec2): xyz1 = radectoxyz(ra1, dec1) xyz2 = radectoxyz(ra2, dec2) # (n,3) (m,3) s0 = xyz1.shape[0] s1 = xyz2.shape[0] d2 = zeros((s0,s1)) for s in range(s0): d2[s,:] = sum((xyz1[s,:] - xyz2)**2, axis=1) if s0 == 1 and s1 == 1: d2 = d2[0,0] elif s0 == 1: d2 = d2[0,:] elif s1 == 1: d2 = d2[:,0] return d2 # RA,Decs in degrees. def distsq_between_radecs(ra1, dec1, ra2, dec2): ''' Computes the distance-square on the unit sphere between two (arrays of) RA,Decs. ''' xyz1 = radectoxyz(ra1, dec1) xyz2 = radectoxyz(ra2, dec2) # (n,3) (m,3) s0 = xyz1.shape[0] s1 = xyz2.shape[0] d2 = zeros((s0,s1)) for s in range(s0): d2[s,:] = sum((xyz1[s,:] - xyz2)**2, axis=1) if s0 == 1 and s1 == 1: d2 = d2[0,0] elif s0 == 1: d2 = d2[0,:] elif s1 == 1: d2 = d2[:,0] return d2 # RA,Decs in degrees. def arcsec_between(ra1, dec1, ra2, dec2): ''' Computes the angle between two (arrays of) RA,Decs. >>> from numpy import round >>> print round(arcsec_between(0, 0, 1, 0), 6) 3600.0 >>> print round(arcsec_between(array([0, 1]), array([0, 0]), 1, 0), 6) [ 3600. 0.] >>> print round(arcsec_between(1, 0, array([0, 1]), array([0, 0])), 6) [ 3600. 0.] >>> print round(arcsec_between(array([0, 1]), array([0, 0]), array([0, 1]), array([0, 0])), 6) [[ 0. 3600.] [ 3600. 0.]] ''' return distsq2arcsec(distsq_between_radecs(ra1,dec1,ra2,dec2)) def degrees_between(ra1, dec1, ra2, dec2): return arcsec2deg(arcsec_between(ra1, dec1, ra2, dec2)) def deg2distsq(deg): return rad2distsq(deg2rad(deg)) def deg2dist(deg): return rad2dist(deg2rad(deg)) def rad2dist(r): return sqrt(rad2distsq(r)) def rad2distsq(r): # inverse of distsq2arc; cosine law. return 2.0 * (1.0 - cos(r)); def distsq2rad(dist2): return arccos(1. - dist2 / 2.) def distsq2arcsec(dist2): return rad2arcsec(distsq2rad(dist2)) def distsq2deg(dist2): return rad2deg(distsq2rad(dist2)) def rad2deg(r): return 180.0*r/pi def rad2arcsec(r): return 648000.0*r/pi def arcsec2rad(a): return a*pi/648000.0 def arcsec2deg(a): return rad2deg(arcsec2rad(a)) # x can be an array of shape (N,D) # returns an array of shape (N,1) def norm(x): if len(x.shape) == 2: return sqrt(sum(x**2, axis=1))[:,newaxis] else: return sqrt(sum(x**2)) vector_norm = norm # proper motion (dl, db, dra, or ddec) in mas/yr # dist in kpc # returns velocity in km/s def pmdisttovelocity(pm, dist): # (pm in deg/yr) * (dist in kpc) to (velocity in km/s) pmfactor = 1/3.6e6 * pi/180. * 0.977813952e9 return pm * dist * pmfactor # ra, dec in degrees # pmra = d(RA*cos(Dec))/dt, pmdec = dDec/dt, in deg/yr or mas/yr # returns (l,b, pml,pmb) in degrees and [the same units as pmra,pmdec] # pml is d(l*cos(b))/dt def pm_radectolb(ra, dec, pmra, pmdec): (l1, b1) = radectolb(ra, dec) # the Jo Bovy method: (a,d) = galactic_pole alphangp = deg2rad(a) deltangp = deg2rad(d) delta = deg2rad(dec) alpha = deg2rad(ra) b = deg2rad(b1) cosphi = ((sin(deltangp) - sin(delta)*sin(b)) / (cos(delta)*cos(b))) sinphi = ((sin(alpha - alphangp) * cos(deltangp)) / cos(b)) dlcosb = cosphi * pmra + sinphi * pmdec db = -sinphi * pmra + cosphi * pmdec return (l1, b1, dlcosb, db) # ra, dec in degrees # returns (l,b) in degrees def radectolb(ra, dec): (xhat, yhat, zhat) = galactic_unit_vectors() xyz = radectoxyz(ra, dec) xg = dot(xyz, xhat) yg = dot(xyz, yhat) zg = dot(xyz, zhat) # danger, will robinson, danger! # abuse the xyztoradec routine to convert xyz in the galactic # unit sphere to (l,b) in galactic coords. (l,b) = xyztoradec(hstack((xg, yg, zg))) # galactic system is left-handed so "l" comes out backward. l = 360. - l return (l,b) # ra,dec in degrees # dist in kpc # pmra is d(ra * cos(dec))/dt in mas/yr # pmdec is in mas/yr # returns (pmra, pmdec) in the same units def remove_solar_motion(ra, dec, dist, pmra, pmdec): (xhat, yhat, zhat) = galactic_unit_vectors() # (we only need yhat) # V_sun in kpc / yr vsun = 240. * 1.02268944e-9 * yhat.T # unit vectors on celestial sphere unitxyz = radectoxyz(ra, dec) # heliocentric positions in kpc xyz = dist[:,newaxis] * unitxyz # numerical difference time span in yr dyr = 1. # transverse displacements on celestial unit sphere unitxyz2 = radectoxyz(ra + pmra/cos(deg2rad(dec)) /3.6e6 * dyr, dec + pmdec/3.6e6 * dyr) # heliocentric transverse displacement of the observed star in kpc dxyz = (unitxyz2 - unitxyz) * dist[:,newaxis] # galactocentric displacement in kpc dxyz -= vsun * dyr # new 3-space position in kpc xyz3 = xyz + dxyz # back to the lab, deg (ra3,dec3) = xyztoradec(xyz3) # adjusted angular displacement, deg dra = ra3 - ra # tedious RA wrapping dra += 360. * (dra < -180) dra -= 360. * (dra > 180) # convert back to proper motions return ((dra * cos(deg2rad(dec3)) / dyr) * 3.6e6, ((dec3 - dec) / dyr) * 3.6e6) def axis_angle_rotation_matrix(axis, angle): ''' axis: 3-vector about which to rotate angle: angle about which to rotate, in degrees. Returns: 3x3 rotation matrix ''' theta = np.deg2rad(angle) ct = np.cos(theta) st = np.sin(theta) ux,uy,uz = axis / np.sqrt(np.sum(axis**2)) R = np.array([ [ct + ux**2*(1-ct), ux*uy*(1-ct) - uz*st, ux*uz*(1-ct) + uy*st], [uy*ux*(1-ct) + uz*st, ct + uy**2*(1-ct), uy*uz*(1-ct)-ux*st], [uz*ux*(1-ct)-uy*st, uz*uy*(1-ct)+ux*st, ct+uz**2*(1-ct)], ]) return R # the north galactic pole, (RA,Dec), in degrees, from Bovy. # This matches Schlegel's email of 2015-02-19 citing the # Hipparcos explanatory supplement. galactic_pole = (192.85948, 27.12825) # vs Wikipedia's (192.859508, 27.128336) # This puts (RA,DEC) = (1,1) at (l,b) = (98.941031, -59.643798). # returns (xhat, yhat, zhat), unit vectors in the RA,Dec unit sphere # of the galactic coordinates. def galactic_unit_vectors(): # Galactic longitude of celestial equator lomega = 32.93192 # direction to Galactic Pole zhat = radectoxyz(*galactic_pole).T # where the galactic plane crosses the equatorial plane X = np.cross(zhat.T, np.array([[0,0,-1],])) X /= np.sqrt(np.sum(X**2)) # Rotate X by lomega around zhat. Rx = axis_angle_rotation_matrix(zhat[:,0], -lomega) Ry = axis_angle_rotation_matrix(zhat[:,0], 90.-lomega) xhat = np.dot(Rx, X.T) yhat = -np.cross(zhat.T, xhat.T).T return (xhat, yhat, zhat) def mjdtodate(mjd): jd = mjdtojd(mjd) return jdtodate(jd) def jdtodate(jd): unixtime = (jd - 2440587.5) * 86400. # in seconds return datetime.datetime.utcfromtimestamp(unixtime) def mjdtojd(mjd): return mjd + 2400000.5 def jdtomjd(jd): return jd - 2400000.5 def timedeltatodays(dt): return dt.days + (dt.seconds + dt.microseconds/1e6)/86400. def datetomjd(d): d0 = datetime.datetime(1858, 11, 17, 0, 0, 0) dt = d - d0 # dt is a timedelta object. return timedeltatodays(dt) def datetojd(d): return mjdtojd(datetomjd(d)) # UTC for 2000 January 1.5 J2000 = datetime.datetime(2000,1,1,12,0,0,0,tzinfo=None) # -> jd 2451545.0 def ecliptic_basis(eclipticangle = 23.439281): Equinox= array([1,0,0]) CelestialPole = array([0,0,1]) YPole = cross(CelestialPole, Equinox) EclipticAngle= deg2rad(eclipticangle) EclipticPole= (CelestialPole * cos(EclipticAngle) - YPole * sin(EclipticAngle)) Ydir = cross(EclipticPole, Equinox) return (Equinox, Ydir, EclipticPole) meters_per_au = 1.4959e11 # thanks, Google speed_of_light = 2.99792458e8 # m/s seconds_per_day = 86400. days_per_year = 365.25 def days_to_years(d): return d / days_per_year def au_to_meters(au): return au * meters_per_au def seconds_to_days(s): return s / seconds_per_day # Returns the light travel time for the given distance (in AU), in days. def au_light_travel_time_days(au): return seconds_to_days(au_to_meters(au) / speed_of_light) def hms2ra(h, m, s): return 15. * (h + (m + s/60.)/60.) def tokenize_hms(s): s = s.strip() tokens = s.split() tokens = reduce(list.__add__, [t.split(':') for t in tokens]) h = len(tokens) >= 1 and float(tokens[0]) or 0 m = len(tokens) >= 2 and float(tokens[1]) or 0 s = len(tokens) >= 3 and float(tokens[2]) or 0 return (h,m,s) def hmsstring2ra(st): ''' >>> st = "00 44 02.08" >>> hmsstring2ra(st) 11.008666666666667 >>> ra2hmsstring(hmsstring2ra(st), sec_digits=2) == st True ''' (h,m,s) = tokenize_hms(st) return hms2ra(h, m, s) def dms2dec(sign, d, m, s): return sign * (d + (m + s/60.)/60.) def dmsstring2dec(s): sign = (s[0] == '-') and -1.0 or 1.0 if s[0] == '-' or s[0] == '+': s = s[1:] (d,m,s) = tokenize_hms(s) return dms2dec(sign, d, m, s) # RA in degrees def ra2hms(ra): ra = ra_normalize(ra) h = ra * 24. / 360. hh = int(floor(h)) m = (h - hh) * 60. mm = int(floor(m)) s = (m - mm) * 60. return (hh, mm, s) # Dec in degrees def dec2dms(dec): sgn = (dec >= 0) and 1. or -1. d = dec * sgn dd = int(floor(d)) m = (d - dd) * 60. mm = int(floor(m)) s = (m - mm) * 60. if s >= 60.: m += 1. s -= 60. # don't just return sgn*d because values between 0 and 1 deg will get you! return (sgn, d, m, s) # RA in degrees def ra2hmsstring(ra, separator=' ', sec_digits=3): (h,m,s) = ra2hms(ra) #print 'hms', h,m,s ss = int(floor(s)) #ds = int(round((s - ss) * 1000.0)) # fractional seconds fs = s - ss #print 'ss,fs', ss, fs fracstr = '%.*f' % (sec_digits, fs) #print 'fracstr', fracstr if fs >= 1.: ss += 1 fs -= 1. if sec_digits > 0: fracstr = '%.*f' % (sec_digits, fs) if fracstr[0] == '1': ss += 1 fs -= 1. if ss >= 60: ss -= 60 m += 1 if m >= 60: m -= 60 h += 1 if sec_digits == 0: sstr = '%0.2i' % (ss) else: #sfmt = '%%0.2i.%%0.%ii' % (sec_digits) #sstr = sfmt % (ss, ds) sstr = '%0.2i' % ss # fractional seconds string -- 0.XXX fracstr = '%.*f' % (sec_digits, fs) #print 'fracstr', fracstr if fracstr[0] == '-': fracstr = fracstr[1:] assert(fracstr[0] == '0') sstr += fracstr[1:] return separator.join(['%0.2i' % h, '%0.2i' % m, sstr]) # Dec in degrees def dec2dmsstring(dec, separator=' ', sec_digits=3): ''' >>> dec2dmsstring(41.5955538864, sec_digits=3) '+41 35 43.994' >>> dec2dmsstring(41.5955538864, sec_digits=2) '+41 35 43.99' >>> dec2dmsstring(41.5955538864, sec_digits=1) '+41 35 44.0' ''' (sgn, d,m,s) = dec2dms(dec) ss = int(floor(s)) fs = s - ss if sgn > 0: signc = '+' else: signc = '-' if sec_digits == 0: sstr = '%0.2i' % (ss) else: # fractional seconds string -- 0.XXX fracstr = '%.*f' % (sec_digits, fs) # but it can be 1.00 ... #print 'dec fracstr', fracstr if fracstr[0] == '1': ss += 1 if ss >= 60: ss -= 60 m += 1 if m >= 60: m -= 60 d += 1 sstr = '%0.2i' % ss + fracstr[1:] return separator.join(['%c%0.2i' % (signc, d), '%0.2i' % m, sstr]) def xyzarrtoradec(xyz): return (degrees(xy2ra(xyz[0], xyz[1])), degrees(z2dec(xyz[2]))) def deg2rad(d): return d*pi/180.0 def deg2arcmin(d): return d * 60. def deg2arcsec(d): return d * 3600. def rad2arcmin(r): return 10800.0*r/pi def arcmin2rad(a): return a*pi/10800.0 def arcmin2deg(a): return a/60. def arcmin2rad(a): return deg2rad(arcmin2deg(a)) def radec2x(r,d): return cos(d)*cos(r) # r,d in radians def radec2y(r,d): return cos(d)*sin(r) # r,d in radians def radec2z(r,d): return sin(d) # r,d in radians def z2dec(z): return asin(z) # result in radians def xy2ra(x,y): "Convert x,y to ra in radians" r = atan2(y,x) r += 2*pi*(r<0.) return r def rad2distsq(rad): return 2. * (1. - cos(rad)) def arcsec2distsq(arcsec): return rad2distsq(arcsec2rad(arcsec)) def arcsec2dist(arcsec): return sqrt(arcsec2distsq(arcsec)) def arcmin2distsq(arcmin): return rad2distsq(arcmin2rad(arcmin)) def arcmin2dist(arcmin): return sqrt(arcmin2distsq(arcmin)) def dist2arcsec(dist): return distsq2arcsec(dist**2) def dist2deg(dist): return distsq2deg(dist**2) if __name__ == '__main__': import doctest doctest.testmod() astrometry.net-0.67/util/starxy.c000644 000765 000024 00000014164 12651445460 017247 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "os-features.h" #include "starxy.h" #include "permutedsort.h" void starxy_set_xy_array(starxy_t* s, const double* xy) { int i,N; N = starxy_n(s); for (i=0; ix[i] = xy[2*i+0]; s->y[i] = xy[2*i+1]; } } starxy_t* starxy_subset(starxy_t* full, int N) { starxy_t* sub = starxy_new(N, full->flux ? TRUE:FALSE, full->background?TRUE:FALSE); if (!sub) return sub; starxy_set_x_array(sub, full->x); starxy_set_y_array(sub, full->y); if (full->flux) starxy_set_flux_array(sub, full->flux); if (full->background) starxy_set_bg_array(sub, full->background); return sub; } void starxy_compute_range(starxy_t* xy) { int i, N; xy->xlo = xy->ylo = HUGE_VAL; xy->xhi = xy->yhi = -HUGE_VAL; N = starxy_n(xy); for (i=0; ixlo = MIN(xy->xlo, starxy_getx(xy, i)); xy->xhi = MAX(xy->xhi, starxy_getx(xy, i)); xy->ylo = MIN(xy->ylo, starxy_gety(xy, i)); xy->yhi = MAX(xy->yhi, starxy_gety(xy, i)); } } double starxy_getx(const starxy_t* f, int i) { assert(f); assert(i < f->N); assert(i >= 0); assert(f->x); return f->x[i]; } double starxy_gety(const starxy_t* f, int i) { assert(f); assert(i < f->N); assert(i >= 0); assert(f->y); return f->y[i]; } double starxy_get_flux(const starxy_t* f, int i) { assert(f); assert(i >= 0); assert(i < f->N); assert(f->flux); return f->flux[i]; } double starxy_get_x(const starxy_t* f, int i) { return starxy_getx(f, i); } double starxy_get_y(const starxy_t* f, int i) { return starxy_gety(f, i); } void starxy_get(const starxy_t* f, int i, double* xy) { xy[0] = starxy_getx(f, i); xy[1] = starxy_gety(f, i); } void starxy_setx(starxy_t* f, int i, double val) { assert(f); assert(i >= 0); assert(i < f->N); assert(f->x); f->x[i] = val; } void starxy_sety(starxy_t* f, int i, double val) { assert(f); assert(i >= 0); assert(i < f->N); assert(f->y); f->y[i] = val; } void starxy_set_flux(starxy_t* f, int i, double val) { assert(f); assert(i >= 0); assert(i < f->N); assert(f->flux); f->flux[i] = val; } void starxy_set_x(starxy_t* f, int i, double x) { starxy_setx(f, i, x); } void starxy_set_y(starxy_t* f, int i, double y) { starxy_sety(f, i, y); } void starxy_set(starxy_t* f, int i, double x, double y) { assert(i < f->N); f->x[i] = x; f->y[i] = y; } int starxy_n(const starxy_t* f) { return f->N; } void starxy_free_data(starxy_t* f) { if (!f) return; free(f->x); free(f->y); free(f->flux); free(f->background); } void starxy_free(starxy_t* f) { starxy_free_data(f); free(f); } double* starxy_copy_x(const starxy_t* xy) { double* res = malloc(sizeof(double) * starxy_n(xy)); memcpy(res, xy->x, sizeof(double) * starxy_n(xy)); return res; } double* starxy_copy_y(const starxy_t* xy) { double* res = malloc(sizeof(double) * starxy_n(xy)); memcpy(res, xy->y, sizeof(double) * starxy_n(xy)); return res; } double* starxy_copy_xy(const starxy_t* xy) { int i, N; double* res; N = starxy_n(xy); res = malloc(sizeof(double) * 2 * N); for (i=0; iflux, sizeof(double), compare_doubles_desc, NULL, s->N); permutation_apply(perm, s->N, s->x, s->x, sizeof(double)); permutation_apply(perm, s->N, s->y, s->y, sizeof(double)); if (s->flux) permutation_apply(perm, s->N, s->flux, s->flux, sizeof(double)); if (s->background) permutation_apply(perm, s->N, s->background, s->background, sizeof(double)); free(perm); } void starxy_set_x_array(starxy_t* s, const double* x) { memcpy(s->x, x, s->N * sizeof(double)); } void starxy_set_y_array(starxy_t* s, const double* y) { memcpy(s->y, y, s->N * sizeof(double)); } void starxy_set_flux_array(starxy_t* s, const double* f) { memcpy(s->flux, f, s->N * sizeof(double)); } void starxy_set_bg_array(starxy_t* s, const double* f) { memcpy(s->background, f, s->N * sizeof(double)); } starxy_t* starxy_new(int N, anbool flux, anbool back) { starxy_t* xy = calloc(1, sizeof(starxy_t)); starxy_alloc_data(xy, N, flux, back); return xy; } void starxy_alloc_data(starxy_t* f, int N, anbool flux, anbool back) { f->x = malloc(N * sizeof(double)); f->y = malloc(N * sizeof(double)); if (flux) f->flux = malloc(N * sizeof(double)); else f->flux = NULL; if (back) f->background = malloc(N * sizeof(double)); else f->background = NULL; f->N = N; } double* starxy_to_flat_array(starxy_t* xy, double* arr) { int nr = 2; int i, ind; if (xy->flux) nr++; if (xy->background) nr++; if (!arr) arr = malloc(nr * starxy_n(xy) * sizeof(double)); ind = 0; for (i=0; iN; i++) { arr[ind] = xy->x[i]; ind++; arr[ind] = xy->y[i]; ind++; if (xy->flux) { arr[ind] = xy->flux[i]; ind++; } if (xy->background) { arr[ind] = xy->background[i]; ind++; } } return arr; } double* starxy_to_xy_array(starxy_t* xy, double* arr) { int i; if (!arr) arr = malloc(2 * starxy_n(xy) * sizeof(double)); for (i=0; ix[i]; arr[2*i+1] = xy->y[i]; } return arr; } void starxy_from_dl(starxy_t* xy, dl* l, anbool flux, anbool back) { int i; int nr = 2; int ind; if (flux) nr++; if (back) nr++; starxy_alloc_data(xy, dl_size(l)/nr, flux, back); ind = 0; for (i=0; iN; i++) { xy->x[i] = dl_get(l, ind); ind++; xy->y[i] = dl_get(l, ind); ind++; if (flux) { xy->flux[i] = dl_get(l, ind); ind++; } if (back) { xy->background[i] = dl_get(l, ind); ind++; } } } astrometry.net-0.67/util/subtable.c000644 000765 000024 00000011227 12651445460 017513 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "anqfits.h" #include "bl.h" #include "fitsioutils.h" #include "ioutils.h" #include "errors.h" char* OPTIONS = "hc:i:o:"; void printHelp(char* progname) { printf("%s -i \n" " -o \n" " -c ...\n\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; FILE* fin = NULL; FILE* fout = NULL; pl* cols; char* progname = argv[0]; int nextens; int ext; int NC; int start, size; anqfits_t* anq = NULL; qfits_table* outtable; unsigned char* buffer; cols = pl_new(16); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'c': pl_append(cols, optarg); break; case 'i': infn = optarg; break; case 'o': outfn = optarg; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } if (!infn || !outfn || !pl_size(cols)) { printHelp(progname); exit(-1); } fin = fopen(infn, "rb"); if (!fin) { ERROR("Failed to open input file %s: %s\n", infn, strerror(errno)); exit(-1); } fout = fopen(outfn, "wb"); if (!fout) { ERROR("Failed to open output file %s: %s\n", outfn, strerror(errno)); exit(-1); } // copy the main header exactly. anq = anqfits_open(infn); if (!anq) { ERROR("Failed to read \"%s\"", infn); exit(-1); } start = anqfits_header_start(anq, 0); size = anqfits_header_size (anq, 0); if (pipe_file_offset(fin, start, size, fout)) { ERROR("Failed to copy primary header.\n"); exit(-1); } NC = pl_size(cols); nextens = anqfits_n_ext(anq); printf("Translating %i extensions.\n", nextens); buffer = NULL; for (ext=1; extnr); outtable->tab_w = 0; for (c=0; ccol + c2; columns[c] = c2; sizes[c] = col->atom_nb * col->atom_size; offsets[c] = offset; offset += sizes[c]; qfits_col_fill(outtable->col + c, col->atom_nb, col->atom_dec_nb, col->atom_size, col->atom_type, col->tlabel, col->tunit, col->nullval, col->tdisp, col->zero_present, col->zero, col->scale_present, col->scale, outtable->tab_w); outtable->tab_w += sizes[c]; } totalsize = offset; tablehdr = qfits_table_ext_header_default(outtable); // add any headers from the original table that aren't part of the BINTABLE extension. fits_copy_non_table_headers(tablehdr, header); qfits_header_dump(tablehdr, fout); qfits_header_destroy(tablehdr); buffer = realloc(buffer, totalsize * BLOCK); for (off=0; offnr; off+=n) { if (off + BLOCK > table->nr) n = table->nr - off; else n = BLOCK; for (c=0; c@zl?@m' @z4y"8@fv ' @x޽Aw@z=cH@xpq[ @y9:}@u-W@i1Z@rbN@@zgCI@rk^@k5L@qh<@\c03@k$Cj@g%@ @iW @tSnT@ee"@n20ei l@cbk^@mu/@&)@@Gf߅v@1Rm֜@3Shr@AnZzEa@W"@K*n@ @KL @\ة@}h~@U}@|tl}V@7haG>@|HR@2x%@z6>}>@5@p @}VJ@pLe@@@Sz@m"@~(2Ƅ@FԱ*@]۞@DE?ܠ@0astrometry.net-0.67/util/t10.ind000644 000765 000024 00000235400 12651445460 016647 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. AN_FILE = 'QUAD ' / This file lists, for each quad, its stars. DIMQUADS= 4 / Number of stars in a quad. NQUADS = 1600 / Number of quads. NSTARS = 987 / Number of stars. SCALE_U = 0.0247254977366 / Upper-bound index scale (radians). SCALE_L = 0.0174532925199 / Lower-bound index scale (radians). INDEXID = 0 / Index unique ID. HEALPIX = -1 / Healpix of this index. HPNSIDE = 0 / Nside of the healpixelization COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-stars". HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** unpermute-stars: end of history from input. HISTORY ** unpermute-quads end of history from input. COMMENT ** unpermute-quads: comments from input: COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. COMMENT ** unpermute-stars: comments from input: COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. COMMENT ** unpermute-stars: end of comments from input. COMMENT ** unpermute-quads: end of comments from input. ALLSKY = T / All-sky catalog. END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 16 / Bytes in row NAXIS2 = 1600 / no comment PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '16A ' / Format of field TTYPE1 = 'quads ' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing END *^K][6[78YH\]mBdD?{@?F}1"89[8NWP9M \oEvwyRT/8+67~{v$ NPPNPPi+)(! |nop  *aceacf ~}{/ 9x pwBz|JU*,\'  <3;8[V_HEHy|wm\jl]Y^ $#@WN|ywozlrNNIZ>74E+ |~y`ekDSa>HhnmztueNac7,86?QADdXf`OIL&i.;34,`v{ |x~6`$+(2SALO)(*"1~(Z[A@L[OS@BAA<=? '!#ikmn6,*W-QNsq )"7/18 tkoINLO oni@KB   "U*bSaA  "*X>Aahki nFXIL yda][p`ol+|{c^Q?OQ6ls=K@J  bRdmy|  m^F_H{|2$/LRT/{v;7|kxwOpQP  @'$#{zUV/721\eY`]eY`[S]UUBOK=?G|{cnjg^S]Uzu$& Jw/!%v{ /.%``e!3$)}hfb^Y6szf.0*p -?/1#w1 F8I!|- |-:J<A:I<At zliy{yw7,8-, -,B&dPgk34)6ls>TFHTM7*7* L?S/\k]gywUB6]uqstqsZGQW  pamI7S4wj!0%khs78*1( rY)WVh^eZ>=86>Z<?(*, +$,TMQWcg^:2(8H5RG V$W)bztwxkGeH@#'y|Y2U]BRDq3ARDKA )!T;VMOLR?IP$()"YB6]]KU['3<" <})lrorf|Q zls;R58:,63OLIw-( hsm1[=8i`%/@FBIfXQdfyw|`e847`X!z8sv\B6> .4kEbm$X*- \ + \ bf`!#i;cDti#SA/Lh`fiptli shk}vrjotlish%D^mEbi7R4OOM(+/5|E~w|OOL)(!$!/40TKJMae]g\JP\:6>- V &#_b+ * &.wru<~!)`KCdz> U-X|*)! }+ -=Q0<O2?gjSe@T" F^H>tyB (+IL,OMZQR[QI3vq Q1~{Zkg^}QCDNp 0 np~>Z5<6z8*p(LIA7S;4WFHT% ~({HE2$2#RdlmaYkvV2(1)Q?P?YkvUhwxXf__  E"Ho]ne*( 1vzB|mcF#t rlmoGFZiC`}DC=M>kv rl=M>J% H-".%?Iv}IZPp7Q[ztpzZ=gk]KOMvlCJAKCJ>K>7;:B^E[qVoYmcV_*Zwr?IM;U?17#'"{+*$.jto N n|zit6a>\v rnbf`Z>?87S;&2B$1[=S$V&-U>JMnP{',"$vI?P49=.&2B#HMAgI_c&HB.G%z\4ZT F z6s*7X<wu ~E~#1/'[F_kYVo[Q*#&{~c_bvh) BI?YGOF8wr]J=h-%y~bB[ED!wz bvmknyk_c>Z5?nCfiijE"}q}vg|zn/0%t- mnmwlnr&bMdg',GZJN;<>VW_TR0A`>CCv*#U[QJ-R[<})!OIOel`hDd@y!|~+  ~OIQPjalg064v MOTSJ}~EHmn3~~gVdZ7@894!3)iyltmsaa`e Ip3!:({[N>Z<8>Z<;~MYUVZ>=?^K]Upoy=?G!C#lImE>Z:5:9uM=KJ%0baaf>axzgyng~|sa`SbTAuts?W=Q a`=K@B  @2$L:?twU)O2wtq  ga7[8Y,WEYBKfNcDPn~"E@($)@'$)jn -x:,3T+~({~0..4S1"9\X    V$W-j;R83  .#&.#%H]E>B-;47 Q/O5mBlEBA:'90piol ih/1- )kzotX[ :<* .&=?9^3YR\YU$-%utq$# ?dAbR0kn MK5XY~`aozlvm^kbq!{~;i>D)3<:=\^]b_dfhyms  3$.)Z>=<Z>=;IF9GeHa'A#(+v3yu|y?<0N-QeM,LVfWdGTJM~K78SAT?()}g !,TWSVS?T=Z688"9\XWCNFkwh(*FCvyWXop!0%-/U2OFI Q.!-%~}rs/-RcT@\YReTcReTa>;4+\2Y!CQFNy|3(:K`if%!}vyY(W))!4|- 3\6>c^{2$#6l1JTShk2 )(U`]\S[OUU`]YZ WVn0Y|/(+pOIP/!%'Y(2FG,fb G~_7V[ozptNFHGi;a@t ro{vgV^Z&$#lQ_VW-eH@aaQPuwyuvyqHno@\hbr48suzZkgd3A<::$(H5R3qkno5AOqtw>>Z8;wbkhPJKMH8R3Y;UV@BD>Z58>Z5;P5O&($@ADQ_[V>F@HGgjc3A?:p %y*3<?3E}>7:j-5<>aadf<7Rdpm;R53kgonKB\TlN,,R)32w|y@|378;_fd%GZNW}#'1 ,+-m_khzfnC1NpIxTb?A.R87JPI?Dsuz;43JF vmnd`aY;VTlFDGH<"S*.06 vln @AB2&#$`>Y\J! ,~a<>kMcNDi }=%9@nxoqapdm +D|I quz  WbZ^WdZ^Z>?;MJMIPPM-05(/1J`hbs&  DWFNxz**1/QME"H mzpsfJbh#gJbh'"EYb^O vqx~fKCiD!Y.0H"%D!|nJP/791gcjO/5IAH>FQ/5yru>Z5=,Y6U9XKPMywU,1$* S[OXywfX`'.G"1<3MO,np}rx@%$*z8~r},:09I`mak\@%)'R/!E)xwE!KB?7<bfmGNH*3).)(A`Cd} *S.=XQWZszWfbd L,/798<wuyAQ  Rdmh8@9?AF@GDF@HDkEbg"{v =Gn_]^?bAK^Yq3rug6 ]^i sipto;:XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 0 / Bytes in row NAXIS2 = 0 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '0A ' / Format of field TTYPE1 = 'kdtree_header_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing AN_FILE = 'CKDT ' / This file is a code kdtree. HEALPIX = -1 / Healpix of this index. HPNSIDE = 0 / Nside of the healpixelization ALLSKY = T / All-sky catalog. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input ckdt: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** codetree: history from input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** codetree: end of history from input file. HISTORY ** unpermute-quads end of history from input ckdt. COMMENT ** unpermute-quads: comments from input ckdt: COMMENT ** unpermute-quads: end of comments from input ckdt. CXDX = T / All codes have the property cx<=dx. CXDXLT1 = T / All codes have the property cx+dx<=1. CIRCLE = T / Stars C,D live in the circle defined by AB. ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. KDT_NAME= 'codes ' / kdtree: name of this tree KDT_NDAT= 1600 / kdtree: number of data points KDT_NDIM= 4 / kdtree: number of dimensions KDT_NNOD= 255 / kdtree: number of nodes KDT_VER = 1 / kdtree: version number KDT_EXT = 'double ' / kdtree: external type KDT_INT = 'u16 ' / kdtree: type of the tree's structures KDT_DATA= 'u16 ' / kdtree: type of the data KDT_LINL= F / kdtree: has_linear_lr END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 4 / Bytes in row NAXIS2 = 128 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '4A ' / Format of field TTYPE1 = 'kdtree_lr_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_lr_codes" table contains the kdtree "LR" array. COMMENT This array has one 4-byte, native-endian unsigned int for COMMENT each leaf node in the tree. For each node, it gives the COMMENT index of the rightmost data point owned by the node. END #0<IUbn{*6BN[gt $0=IVbn{*7CP\iu $1=JVco|+7DP]iv %2?XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 2 / Bytes in row NAXIS2 = 127 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '2A ' / Format of field TTYPE1 = 'kdtree_split_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_split_codes" table contains the kdtree COMMENT splitting-plane boundaries, and also the splitting COMMENT dimension, packed into a 2-byte, native-endian u16, for COMMENT each interior node in the tree. The splitting dimension COMMENT is packed into the low 2 bits, and the splitting location COMMENT uses the remaining bits. The left child of a node COMMENT contains data points that lie on the low side of the COMMENT splitting plane, and the right child contains data points COMMENT on the high side of the plane. END z-z~F҃YQZ(6)ÿ#E(.=>zSA=hAN3ivercWJ6|3:+QKQ:c1-Ex@!GRg:j֞H!Av]=`,(A Dp#:0a5|)BZbOBltI>b+~(BITe^lK Tqv9%qd,W]KZWV.,4ʴS:ʹA42[T^H6ު4PGBXTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 8 / Bytes in row NAXIS2 = 9 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '8A ' / Format of field TTYPE1 = 'kdtree_range_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_range_codes" table contains the scaling COMMENT parameters of the kdtree. This tells how to convert from COMMENT the format of the data to the internal format of the tree COMMENT (and vice versa). It is stored as an array of 8-byte, COMMENT native-endian doubles. The first 4 elements are the COMMENT lower bound of the data, the next 4 elements are the COMMENT upper bound, and the final element is the scale, which COMMENT says how many tree units there are per data unit. COMMENT For reference, here are the ranges of the data. Note that COMMENT this is not used by the libkd software, it's just for COMMENT human readers. COMMENT dim 0: [-0.207107, 1.20711] COMMENT dim 1: [-0.207107, 1.20711] COMMENT dim 2: [-0.207107, 1.20711] COMMENT dim 3: [-0.207107, 1.20711] COMMENT scale: 46340.2 COMMENT 1/scale: 2.15795e-05 END 4yʿ4yʿ4yʿ4yʿ?3OP??3OP??3OP??3OP?NŇ@XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 8 / Bytes in row NAXIS2 = 1600 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '8A ' / Format of field TTYPE1 = 'kdtree_data_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_data_codes" table contains the kdtree data. It COMMENT is stored as 4-dimensional, 2-byte native-endian u16s. END &O%26'2MvO'#'..'-/V<'R(;@n)&SL/*8%R!N+=LYS-7\-/J2Ho\>2RaYk898Ca CT `EDS`BG7X+*VHC`M 'LwJ^,Q&5V!W}VZ8*}XI>Jb6Y8:N .z ]Y ~i=D{=8=0$jo2-F'vW-h" xR/j8fD,2rK2?p6b:3_b5ր%55n/,E6rXA*}NLC867G>9LGte:XGy$0UQw,'lU߂9)+1WRzR 3YqR@#xR@#Rxv{RUQRo<.\G=_@x>f/*hO!\1{>e#B<qaxi%I~S-E }h9Wg wG=~WN/-̂!E&JF{qt7'sL |_'M/{Td/,|W4GN6d6K$`qO-0bqVsVj $tZy,7 rU]VbvCm#fsdC"f~@j( q{rjRFdp Jcp5it&fv0jjv xuuz{b|\jmSZ0X"*k} N+=LHe7$Mc8TXu }<^ d=PQc!Hf8bJcyL9T.#YNfX}^cOQ G}O\z nRvo)rPST zUQR%/x[TJ)j_@x"oahdkxhlJ pGK{oxxV-(|o(,mx-}Er^:s;)7jJ1^:iJZQadU29Z&)GTb?[e#^:s]Y #[[[^/(.^l` CUmfO7?mhk&.\j1@e fClNrrp+Hu:s&]?it"m{.u U1zuN[ocxQ ZrxA Qfz 9Pu\|WV_ׁ{%,QdGۃ-22Zf8DN;y^;f^>eIXypOYOMFqi\P^=?UQRqaxiJb6$avaenxeyvf@^7qmuLWsxmCJjmP>(_sti5btI@Rt=4l=yG^Bx}hfzTFZU:{y9a1vx{B_@x~WNH\lto|?7_Rykd߂9UuBX\5*'S <+o:@<0(8ghM."'M NN1+M=0(h0!Sd = (TO=)K:LlE5G\_xQL,J.5Pi Q/]2-( P) RP߸z&$1*T42!<2G_b)/У'mJV&B5gQ 7(\A.<(QI2/.B2*^6vJb68Jb6h0C79)K0mb;D}XI>8}XI>h09S>XO;A07m6B䏅6)CL3DIӅ1ElO䏅gR)9TMBS@5U7 Y)kYuY2_FYz#&ZM!t)*Awa*7%cnH=.X =6>Q?3OmDQ8,3PHy[IZ,Y!n8%k%pP5zv#R6`u%XZ?1% h&>/LOjX&h/R9y0XuS8G9u792Lm53ŵQS%> m,j<)^'4C(CTb\GD<^q ̔hhQL dV[LsSBxyJP8qE*??JKo[CrS+OG!RhN1&ˎubA+sg[l,?mb.@@3A==]f@ӓ?:+AFCD@)Jz\LJERK7deELIF=QJaFX-jeRXXY^rW}}qj[_cŽ;$hG% x:_&Ql1 y*+]]n c X jG+man*[UvG#4l?* 6h}W. m* ~*%,'s˃>D a͠,QAyΔ8%{/HeR=_\2<moٰ2b :+=~?+ ,_ҀD]@ESkF^JSw"mS_Y\N]ldbZ`v'PayJw=caqXYMeyvӓ?h[eBtvsh,I^>_\H`=Ped |LCL rVm^H s5vYS}JC}\HŒH`#f`fUVeK^Q؀.xviF\zFizkSZuSbp-/DI}>jW=L**3*6&:$i=ur;(j3GbO~ɓ,EC3> *Q9 %:;'h-1pCO0^%2_HG.@U0A9$+>E[?r0)10'4!:0׼20I|'';1O1H;20@>*׌E90B@t t&#fJI%ԅc (F&-zS*|Fb0u`bt$$]6@^y ~W{D. ^dNj %/p_=:`w5ޫm. a(G˱1TDLoUK1µ(`^U"O+&n@/„mM|%r-)r#zm_=yG^4 h\x`6ۙ\JQ'`|\widc[=2%n]e*qi"/t;o[եyYx3j\^8d@e fs3w ~fv˶!Ui~?,Uv<@DAR@ ]:G_La^HsqHȖKnJ2RoKل]hTKh}T&TŨhKU!\AUYe]dV-[ZZe`F<`oJkr[7ahESb{T_i}hj׹pLJ|H}I39Εu=$=?^ ">.u7 @cM#(IIo){IdV MhpQ0fMdca,MMn$N4`x Q逤"TtxU]bXjr\QygP& `T[sr %`(c\`Zd`3e ǰx+{egwa%f{k@ur)pwvrcxQ yA~X<ʏ==J>MiK)EPTsoU)[8N;aKQ\(anc>d:[Ad9vb>EdOS|TgfGh[eawl2Cӵq_PXVqU2HVr6Kt9ٛrcU;Msa1\Ku k\u?kku_6 v iBwiNf7/|]=H~WN(X؊oQ9`!R|_'F'ÊI4$ϣ6gyd#LFϟa`j0(!t(V7'aR,ᥢW=*hA_-Nv^" NBȢ$A;&,"Ċ/,-ԭ3j[@ky;a!ׂ@j800KAs^_ @bx[Ž;PA4 -PŸ2/8ܙZOK;8`'K喬w[w.1-x#qXӦ:Fj0EFƩ0-x=AߓW=^H0 DA>@M?O*K7۾9B9k?8EvׄE@z4FF\[Y4N2s rGd(QK. ԷXN-.F}eJgolt-fK'^AbO bO- h;wUH=n#R]$mEkɇ^.1uWVNKc @TY!#T^"BjJM#yy%ðUo/L1r$B1MO6`8;H8)g 9}os9!wE:JΫW:鯒c=#N >plZGFaj[GVƎTLQ]BQ`xqXAdShQr('Pt9ц?w( #ˋ& )L<2(>l%YR"8J72=2Ij &&7M1`/1w\4ysW=bk7? aI󽫸#k9+иxQ;On3:3Q-C9CӿY+2e4IG(_-[o ~\n) EsȝDE0>z@`MZVAìEnhQDǫZGBt"TtFNc)gJޮbcwʑ=J.w F)ۆj]pNlOܐYe^1䯕u])On"9cB讑UZP讅Zr뗃vK].LsXes`QO Rox\^-M?pQ%@q4Be[p;8ąsv4*t\EMO:"<O$8['^r%,"?5y$hs#,#(|ͺD 0/|5"0tw6Z2-w55% 8,s`79Ii;6qLtsj}>s mP)BtЃGDu߃;aw~ڭO0xn&x q`k}V ly~~RX<oda$,sa7m맗R8rp!9i}[Fr_SLGSrNdGނޭdGxmaKi`MkESXqd`=zW cwc#e תh[eu'h[ey~PTjvё)Yu svx Z`vr(gyi16>~13+(16R3$9G==H:+v"$A '+0^D?,E.ت48G7 '/NMPP6U{yOXW 2?W6=ZnY=$JZ]3;^$'-`JG`qW@`=DACa7/\c$'%~cT8$AdA6f,j<=m77g#i7"Є=DAm.B2w D5h4Ey1uUnL:Ll R'zA>`Iqڕ@MPcjwAU:I E`XHeO^URaVUC[\/^B~fr nNoc RtFnw`K0}49[W:(VyދQq`9jTcnVep{ =f~|M))no!,rS{C5lp$7`y9b3p:hdvZɻGlw~·Ix&xIxv!^Jyg{$JOK RK7Vexr@!\A }.ƴJLyPMI)|15ɏzh!Mc'B"}+i%$7d|%%Ѱ%&:1p5Έ1u2Q4r,4/%5N%7#=|<>=%~'H-)%Nond0Hמ)0?yKIdU2o}V ~QGPA1?1ʴ߂r+C#2J˹' +:,Ȏ%%Zϧ$-zA7'4 4&5nA3%KZI9^@+q4BֳsG_VbȄ̮b5%__z'n‘h/ppkW6zЋĐ:MQUBOf̪Pk՟RkdNSOXVE!KY\l?xӅr ^,[wة We4;YbƋg^=h ^W~Qjъ7#un$w6sn)&TA%?lxl2*[#W(N;]F H$#4uEGڣ)=ٮr+C0/`2"5n>ɹ,h-1ϼ*P-!;"0+Ͽk%>ȓ10ɭq0],&<ړ#',oڬ2)#ʴ'H5˗( ?90E{ ]r9+j7 r-V(d 7Kka :P+f!O8Q9[WK(sأf'b=ڽw=[Sr5%_h9}5lBv7 ][c& RO 9 i)YuEfJ2HW>JX~w{ mC0x3%6EuDKM¸MӞ¬792+ @9Y4*g2Vn+wJq8w?UzS*)?S7G1R._3/m':I5pIa˥oH.TKY޵:u3!Rq%;|ij4@c㢎:+AKxhVMBf_MUdYM~@tB,>rݹ:O9AcF@NK \g>OMsy X"A20A r4;sx WFV;I9xE&9gq(HWݧIw_Dm ס Ψ%F'ÊbK,~'O/B,0ޖl*8h ZR:`*=ҙ>a`{Z@GA8홸DFTJc4 e}K8K 2RNd01.TfBҀVz/lVOuGV YF0tZ*n\}t]ܙTwދ~c] ؍K(Wi;B ePn$3c?*w84u{c`4|ob5;^L&]G&FI\:qR5]8ǻUj'Ujs=ݪX˔n'Z3:30[Oq^Ą'?`+c2eby6PeX<8h4Ĵ;k:3jlT6sk иuG'}(׼\:;ѷrTPzTwzu'y~DB5b=jm?`LζJQ+(Fʃ+|=sM\{3M'eT7ewuxǯGu'Gɐy~N:ʳu"GI` %nuxǯ<[zӖo x$؊zQ@wְ? w[*FIh(IIRa4;kN;ikIl]蚞+R +K-OE55:DEVFԟ , F)||:I3K*фQ+zTӺz%X":\Mˋd>2 i\5j1Nnoe3ps~ܚrx($!'|Y|j:9oP|9H-z tK(:O^GKi25KifDZh&yT.RV']`/d~T8/mbYL@z8cWKzcw;CM8a~CV;ig;9ӗv6K{ZBhhu%KSjQ|l-tqbr-'%_`,LLTGܔkHl]nehh*) ;DRN&]Dމ(uF;GI]-ŀIqڈ9uN_-ĔS-8YXYx>+Z7.^C72a|pb4;,c Ƽ"eط5<*jޤ0BjR k4\?ndZ=8Go̦2p<5r3}lCBrpp*[nrhnheT7WDGVjhŮpJT6u#&Vu\SKe}vݣ`5r)AcdJ,Yp*Eͮmcoz%newXa4tNi]zӑKoivܘ4Kcuݒ1`o|߮S|hICa7mNt`?:&5±9ެC+vCՇc[S,q;ZyqC1(l>#Bµ1}+2eުw1?d-Rɼш ~ɷ&4.7&`׋䦾PѫmRzhk)EP;^ hn%uVަShSЄidJȒI |GS!4 e}c{ǣ|xr ѫ%ԅxΟ !2 (ªhfK9;^OƗu}"q"&HǸƽӑ^lߝͺ™҇_nzՔXo4 h` ֿs#D<p$~$e%4'7Y+) 9l*o`,Lg6Ӎ/Პ/ƈRP1ݶ"=2Ծ4"p7f|Զy{:d\r=@ts@T #bB6D Q:Eҳ*QTTh c6f$jjf@ȡ{7 9 9'Xԩ+`+֐0Zݶҥ0P!8ȩ{:~ :R_ɄD[PGvGѸ;uH༃mIsJFaKdXOӝ;SzWFaqXȚbaAld>ґnZ.ݾ48Q&xUAӤIhk*Fk ")ϩH62?+½ն,*7)ìw[@펯`^ [H8B'@.ACаƴа?㾆i:ɧӃ$,岞ȅaǁH)ɭ$ʱڀeˍ astrometry.net-0.67/util/t10.skdt000644 000765 000024 00000235400 12651445460 017042 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. AN_FILE = 'QUAD ' / This file lists, for each quad, its stars. DIMQUADS= 4 / Number of stars in a quad. NQUADS = 1600 / Number of quads. NSTARS = 987 / Number of stars. SCALE_U = 0.0247254977366 / Upper-bound index scale (radians). SCALE_L = 0.0174532925199 / Lower-bound index scale (radians). INDEXID = 0 / Index unique ID. HEALPIX = -1 / Healpix of this index. HPNSIDE = 0 / Nside of the healpixelization COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-stars". HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** unpermute-stars: end of history from input. HISTORY ** unpermute-quads end of history from input. COMMENT ** unpermute-quads: comments from input: COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. COMMENT ** unpermute-stars: comments from input: COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. COMMENT ** unpermute-stars: end of comments from input. COMMENT ** unpermute-quads: end of comments from input. ALLSKY = T / All-sky catalog. END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 0 / Bytes in row NAXIS2 = 0 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '0A ' / Format of field TTYPE1 = 'kdtree_header_stars' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing AN_FILE = 'SKDT ' / This file is a star kdtree. HEALPIX = -1 / Healpix covered by this catalog, with Nside=HPNHPNSIDE = 1 / Nside of HEALPIX. ALLSKY = T / All-sky catalog. CUTNSIDE= 55 / uniformization scale (healpix nside) CUTMARG = 0 / margin size, in healpixels CUTDEDUP= 0 / deduplication radius [arcsec] CUTNSWEP= 10 / number of sweeps HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** unpermute-stars: end of history from input. COMMENT ** unpermute-stars: comments from input: COMMENT ** unpermute-stars: end of comments from input. SWEEP1 = 104 / # stars added SWEEP2 = 101 / # stars added SWEEP3 = 100 / # stars added SWEEP4 = 98 / # stars added SWEEP5 = 98 / # stars added SWEEP6 = 98 / # stars added SWEEP7 = 97 / # stars added SWEEP8 = 97 / # stars added SWEEP9 = 97 / # stars added SWEEP10 = 97 / # stars added ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. KDT_NAME= 'stars ' / kdtree: name of this tree KDT_NDAT= 987 / kdtree: number of data points KDT_NDIM= 3 / kdtree: number of dimensions KDT_NNOD= 127 / kdtree: number of nodes KDT_VER = 1 / kdtree: version number KDT_EXT = 'double ' / kdtree: external type KDT_INT = 'u32 ' / kdtree: type of the tree's structures KDT_DATA= 'u32 ' / kdtree: type of the data KDT_LINL= F / kdtree: has_linear_lr END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 4 / Bytes in row NAXIS2 = 64 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '4A ' / Format of field TTYPE1 = 'kdtree_lr_stars' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_lr_stars" table contains the kdtree "LR" array. COMMENT This array has one 4-byte, native-endian unsigned int for COMMENT each leaf node in the tree. For each node, it gives the COMMENT index of the rightmost data point owned by the node. END ,<K[jz"2AQ`p )8HWgv /?N^m}XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 4 / Bytes in row NAXIS2 = 63 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '4A ' / Format of field TTYPE1 = 'kdtree_split_stars' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_split_stars" table contains the kdtree COMMENT splitting-plane boundaries, and also the splitting COMMENT dimension, packed into a 4-byte, native-endian u32, for COMMENT each interior node in the tree. The splitting dimension COMMENT is packed into the low 2 bits, and the splitting location COMMENT uses the remaining bits. The left child of a node COMMENT contains data points that lie on the low side of the COMMENT splitting plane, and the right child contains data points COMMENT on the high side of the plane. END -cȊf۠o@!z'E#)!+49q~_ᄮ{Jr8xݐiV B tBaՍ~ƍc y=KH} iƅB-#9Bި˓aaN~VxQҢ;S哿eNx^:렓ѿށ9:abk=NӂPȓU]1b _fÍ)G]XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 8 / Bytes in row NAXIS2 = 7 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '8A ' / Format of field TTYPE1 = 'kdtree_range_stars' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_range_stars" table contains the scaling COMMENT parameters of the kdtree. This tells how to convert from COMMENT the format of the data to the internal format of the tree COMMENT (and vice versa). It is stored as an array of 8-byte, COMMENT native-endian doubles. The first 3 elements are the COMMENT lower bound of the data, the next 3 elements are the COMMENT upper bound, and the final element is the scale, which COMMENT says how many tree units there are per data unit. COMMENT For reference, here are the ranges of the data. Note that COMMENT this is not used by the libkd software, it's just for COMMENT human readers. COMMENT dim 0: [-1, 1] COMMENT dim 1: [-1, 1] COMMENT dim 2: [-1, 1] COMMENT scale: 2.14748e+09 COMMENT 1/scale: 4.65661e-10 END ???AXTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 12 / Bytes in row NAXIS2 = 987 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '12A ' / Format of field TTYPE1 = 'kdtree_data_stars' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing COMMENT The "kdtree_data_stars" table contains the kdtree data. It COMMENT is stored as 3-dimensional, 4-byte native-endian u32s. END )ပK?-șIDRncG`B27u q})!]#倨ȀlߏtvЀ{]R_*6Q-Q;d8KL$ma9}C c~m%/R ~Eaa]9`QarnסSF .Ȃy1 sႂ$EBw쓁J SFcS M>^Nint„!}ূNN 0elsEi`]J̞ D+mfL :oN?3٫ǀRUY€#d/܂]Ӏ9O+tRrn¹B͂E9驂no9Q%Y<烀AՃ$(̍J+X%Kxi6γS>0]>:h S@>. 2 zLO_"حP@vX/JJӢFk2I0@ B()>!pQ{z&IЅ҈f5]󅊃񈦵}щ cm&{r-Z9L|Έdkgv/EAas؇։x4KcT2oٔÅEˬ >xS&K 6c׈ҹxqysobroC̓\ÊPs݆l*VdV3[Z e:b B߅tBDSw@툁+*yPˇaqz#G.Ċ;b Nnd=qW)\rQ yJN}C{zRR+0;v bO\aW󈱣8Vሼ }bMSMOg~QVD)4r8mX;܋eYFgO}*j΀+3Z+4〈9Gbav-o쀼:c]i;T9i&k?T~  > ?TӍAPgSd۠knSĄJ@Hэtpveҋs*%sD38R~Mo_9tkjG7jVlƃ:m.$]>$V}f$e1 ˋ/\~X_<9ArG$4[Z 30: 0y5K~BaM{g&VS=TiepyĀ+#=̀#!s9V\JsM Zx]Q$-*,M0c{:6QyV* Ȭs5qp 哿SǷ0%Ehu+į}N6Aǂ`?{1+UL/qMl\Gu B4|Иsaw[ ʃԎR9R./ aՍ6] ,[ xT`􅎝lwTmQԶKUAnꌌzRxㄟ^4.Sf2:_dIMxlSZ8yȊg PZZ.l$ eTok0P܆.r) T%ԌrR9'4uōP. O%.gN/{z ag*n MPD򇳩JH6nUv JZf-5<O'ԣy_Z9+3" JJ;m' TsV lj5HhȎ·m!zoz舳ܑ1V3]ho9'| gYK&iXm=NqcK[ o¾Yڔ- /S&>IO 6+*=ϒJMPѿ4Ԙ20/izGb-NPT툴.Bac#z|B͉fۘuuD&:e'6sh(z(!VHI lP9pg?|"y5Kos yOkx#o&O'uG۶E%}l%GVL ]\Œet'Njf ׊^tTǎq||k:)vbb}_kX* }F]ʛ0Bぢr"g݋( sU̥ 5~)6h#Zwٚ{.əo ۰BlH{@HκI&&irrBrS&o!Q"*Dd;bhRaDߋ.*m>_9 x>&P&+ l~A0-](5_;zA%x@ ;Bu}oB>K{~$? ۍ$+,dz{WĀc) 9ǀ=+ZtRa/kɺ͐ށ4 Ml]#Psՙt-,/ }GB Y`/6|[א.}L\>(E,;"I>$_&""UBƷtOZFvڐO. ,dyp$?@չ,4S҄_S:Ɔ aۓnKG>6𙳇e\͋~_j?̹[Z=1AJx]Ovuއ?v'5v,c*H, C^>k!:%B󅍌 JGl þڍ\0g8:m4`q N#T/5͎5Gl{lώwC{n@Tqz؁v')b뇺6H4ߏ+!z."<]Ty0B5&EZKS.cȊ+ 6U 툹H'UEZ9C orM J0Q fcpb-ъwDuHb ⪋vU|y#}?9_ARKEhƻH  Rke8 /&7tLd'-alR&È.nn-(Քr@g8yYX\@*N/XvQn~eH>oh瞏-%lq;lj(p,1؊'mog0bs3/2%r.Z7kчU'vb'njWթo[z$XV &\\VnRxՒD*x:,|M1I[(._/:f0RwhP!\ŕHu 4ȝ)\b@,N~cu[jcꚖ!㺕꧁Yh<꾁Č~ il$ہA'?J9I.C7Nӂ),nZڂ -8ŴG id.<]L))IЅ|~bh6H94┬ۃ#tWko kIt%R1Dȭ#_IRÄ}j\|Nф|j|фrfC`UXۅv⍇=d~~ւsۑPȓ5j3Y͓{JzGoZj}D o-?B)Ӧ\hҔKS_b#ug & YCQ+#8 JUo=ÕCYyn啳fsw~dЇHpݏ`'ੋF#)ϳ~ FT~:;圑,b9zP-WJЊFxF׿Ehݑi@%҃3 AǒWρO!]TnMwd$:@VA"$Adlj }3EV*ΐ #E /ݕy? M ^ŅBPcJʂ9C s,nGHΔ-;{8]Mx󈏜+} ҝY#XЉ.D14NF.nO 1|bV e<z;ݣ:Dy6Њ،0c fNG#x W䌖ʓKBˋdEЋq͋80G3 z-p3~3~x1F n7Y6?-R5D@ጉt^밣UQfBo@sC.Cu5EGiN Ìu$nipRᖍ(iav =-lcȎԍ ̎;o3{^[H8;&E-YS6[ /ϩ"*Fj'[+bnCXݐ3*6:Kv5t1U!G×bpzk\%='vj$h3v1ȂیSō`<4|G ^1}! Z<[34&CO[BTHLmA+'vMH6Us^+nʃҎTh !(쎗ߏ l~ 18 uhϏ!(4揩{ώ0 ;ѺbQ1U {ӑh0n-NАKpm׀ 5Y^潐lyGҐ*9۠א^e'p tT XX'V/FAl,tl\k}E:1=0wm"JF(M /bzs37?~/Rm7=KyZ{6C΍YVeÍd8B\ՍR*ٓoa/~]UnL8L@ZJ!|uc9[)>NӘ;=וn@`RCJ ZO o Fٔy(QHb7-0Z7;;80yᔻ!_%xΐD򒁗c;ZH7ӄ-:;: In1I78k}{UJۿX&B'6Onۼz_%M2fmaw/ɪK;? c"E}<5v܃$5Tl3g˙jRϵ5LVOhΛu*]M#F*mŇ=Y8kP l&x_:3T~f7ш[!-Bq _b7ǮJyDdzDǕIw< ^Fse} #;ϝ6]|ʃj4NhM.yGb¢^hN4t,?:%Z/oaxm(.AW;RFooψXC 9!Pi` ظHXzC.ޔ4w-`)-ӣGs{ ^b/|r<>W kӅw9P1pEfD$̅lV@'?&4qN\sG #5\P [Ei N1CQtYG+I2)ػqV`vpW<$y1dze 2K1)s?jZ Q7 iO6ydɰ>-tH%㎥=(UF\XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 20 / Bytes in row NAXIS2 = 987 / no comment PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 4 / No. of col in table TFORM1 = '1E ' / Format of field TTYPE1 = 'MAG_BT ' / Field label TUNIT1 = / Physical unit of field TFORM2 = '1E ' / Format of field TTYPE2 = 'MAG_VT ' / Field label TUNIT2 = / Physical unit of field TFORM3 = '1E ' / Format of field TTYPE3 = 'MAG_HP ' / Field label TUNIT3 = / Physical unit of field TFORM4 = '1D ' / Format of field TTYPE4 = 'MAG ' / Field label TUNIT4 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:27' / [UTC] Date of writing AN_FILE = 'TAGALONG' / Extra data for stars END AJ$AJy@)]/ A#AQ@"=A:VA4Q@&=AA@"QA?xA4ff@&AAD@ hA=A+@%}pA2(A)^@%7KA'^Ap@"A<ĜA0=q@& A$A@"UA,bNA%\)@$ A:MA b@$ @A9CA+#@%{d`A(A"@$_ABrA/C@%rA!;A@"b@AAA9X@"G+AIA133@&&f`A>A6@&ՁA,ZA%@$3@A) =A|@"A3hsA-%@%ĠA'A@"pA,ZA!|@$/A5A(V@% A;A*@%TA+OA"\@$QA&zA@"QAff@Ĝ@A"A m@!AAp@ AA@"cTA3tA @#AMA25?@&FAFbNA.A@%1 A8vA;@#`A;A2@&ZADA1@&0AIA3@&t9`A@`B@,@A/;dAx@#/A bNA@#A5PA#/@$e`AF=qA7 @&@A)A n@$ AM&AGhs@(`ACA6^5@&ƠAMA>bN@'IA/oA&n@$AffA @!9X A'wAff@#A5A =@#GA.DA/@%^@A>RA!&@$$ AJ9A0@&;`A'A R@!W @A\AR@  @AA @!`A,yA@#`A6RA,y@%/ A0A(@%5@A6A'x@$ABEA(@%A1|A*+@%P`A8A-%@%ĠA;?}A,@% ArAw@ 7A!AĜ@#XA@9A0@&b@AG\)A0@&AA5X@&ADA*b@%B @A0A!@$=A=A05?@&ANA: @'DA9A0@&A1A($@%A>ȴAh@#-A;A#ƨ@$xA#A@"CAMA5#@&d`A9 A(@%b@A8AA#@$p A^5AF@"vAS@@^@A4IA+;@%{`A; A"H@$\)AP@D@hA*1'A"n@$MAVA^5@"ƠA(A I@!I7@A/;dA$r@$VA1|A9X@#+A,\A!@$?|A8A+w@%wACƨA$ J@$@A0ffA @$;`A ZA|@"oAffA b@!B @A' AF@#vA?mA.\@%A 9A@#UA`A3@&bA0^5Av@" A.A)@%2 A @@A&A$@#ěA+VA"9@$V AH@X@A4A&ff@$A:A(@%5@A8A(@%A@A. J@%@A?A2 J@&A@A @@=pA:A-p@%A;dAĜ@ A(A1'@"$A2nA(bN@% IA7 A/o@%MAA^5@"KƠA"A@#?|A=A6@&`A,!AR@# @A;SA5K@&xA. A%@$€A7TA' =@$GA$v@$ AF@9X@+AMA @!QA+A@"9`A@E@ȴ@AG A%7@$&AAff@" A $@u@nA'33Aw@#A:A&@$@ J@@CA,A# @$z@A7A-@"E@;@@A(zA?}@#A=A @$`A@y@/ A<A,Z@%CA9tA--@%EA-A"D@$QhA3GA =@#GA"MA?}@!A;TA#l@$m`A?A1&@&$ A(A!@$#AJ$A*@%] A%ƨA-@"A2QA\)@# A@VA @$5@A1A*@%@A&ffA!dZ@$,@AffA @!y AE^A*@%Pb@AL$A-;d@%lA8ĜA+@%t`A.!A($@%A!/A o@!MA&Aw@"wAGAV@"JA=%A0z@&\ A6IA,{@%`A4A@#A/A!;@$;`A%hsA/@#[A-SA'@$A)GA@#A O@@33@A A @!?|A&Ax@#A7VA'P@$A;#A%@$vA!33A@#A!A`@#\A0vA$@$;`AVA P@!1A(\AC@"hrA VA@ ;`A1oA(E@%@A2A*Ĝ@%XA&VA@"zAKoA/7@%&A2A(^5@% ƠA8VA-dZ@%@A3;A,Z@%CAZAdZ@",@A3;A+K@%ixA2yA"@$TzA@vA+V@%aA)xA~@"@AA@"UA$AA%@#`Ġ@@dZ@@A>HA3/@&e`A9`BA.b@% @A2jA*z@%O\ A"ffAK@"x@h@@~A2rA"R@$W @A5\)A(@%zAFA/@%€A>VA&@$AAOA0@&tA+A@"Pb@A:-A.9X@%+A.bA%@$A8ĜA2b@&B @A$yA7L@#fAFA9@'>vAKA7@&TA8A4R@& @A/hsA@"Pb@A9CA-"@%Z AAo@"MAOhsA4R@& @A=mA4I@&7@A)GA =@#GA="A2@&CA9GA+/@%e`A2A@#^5@A1 A /@$A>AA*I@%I7@AA ƨ@!8AIA+S@%jA>nA.z@%\ A'/A{@#`A7A+@%y A4(AE@#ȴ@A6{A,5?@%AAff@"LA1A*@%] A%AE@!@A)A1@# A<A+@%u?AA\@ A*MA -@$AEA:R@'W @AA\)A7C@&rADyA1;@&;`A3pA(=q@% @`B@ @A0A#@$p A8A-&@% AQdZA5#@&d`A$uA@#^5@A%hA1'@#$AQA;+@'e`@A8A"@$SA/A @!^`A= =A$z@$\ AGA#T@$|jA6HA!@$4`AtA@ 9`AA@"cA6\A)#@%;d`A3tA&@$A0ĜA(\@%A%AM@#`A:A+@%yX A5pA+@%~vA7KA#ƨ@$xA!A@"b@@@@AAI@!7@AAƨA,$@%A>bA-?}@%A&A =@"GA)A@"A5`BA+@%y AA#@ ;d`A-A@ @A?}@@A%"Ay@#]/ A#A `B@!,@A0uA$/@$A9A V@!A9hA-@%vA.ȴA@##TA3GAH@#)AA+@"e`@A9hA-@#EA>A+@%s3@A3SA@# A( JA@"A:(A'@$|AA9X@"+AA@ ?A`B@C@hrA7A.z@%\ A;A(9@% A-dZA#@$z^@A>ffA2r@&NVA9&A*z@%O\ AA;@"`A*1'A@"`A=A%@$ A<{A*@%YA@/@`A+?}A `@$A A&@"d AW =A-@% A2bA'7@$&A8A&(@$A8`A\@#A8vA+?}@%gA2AA(9X@%+A<1A.@%A)xA @$A9PA#/@$e`A0!A@#`A?A2@&TA=qA;d@"lA(rA@"xQA(MA@#5@AzAj@"@A\)A@#AOAZ@"KCA*rA@"|A/A'\)@$ AN!A.@%"A,IA"@$X`A.bNA#33@$ff`A@^5A)?}@%'A@'޸`A@m@A41A*bN@%LIA9 A&@$ A??}A%@$Q@?}@ @AA$$A@#TA*\A#?}@$gA6bA$(@$AG&A3@&yX A+"A!T@$1'A1 @&:@A)Ahs@"`AP@+@e`@A5OA% @$@A;A+p@%nANA.1@% AA M@!I`A%xA@#TA:A41'@&$A8+A-@%pA1hsA(@%"A/#An@#MA3FA@"0 A@@9X @@v@ AZA.@%"A)A!@$>vANffA.1'@%$A$A@#`A%AP@#1A6yA"!@$V A9?}A(9X@%+AA X@!A>A0Z@& CA4A@#@V@j@ O@ @@8QA+VAF@#Ahs@ƨ@A3-A*ȴ@%YA,=qA@" A+hA"D@$QhA K@@5?A#A@# AVQA3@&xQA7A+C@%hrA: A0@&tAE;dA2u@&RnA@A6=q@&Ǯ A?%A5o@&MA>ĜA37@&q&AI#A6@&b@A/oAx@"o@ @x@/A&AC@"(rA#A@#y AC;dA6H@&)A,bNA"@$X`A8AF@#@+@9X@+@@"@Z A5A'dZ@$@A=A,r@%VAmA/@"`AEpA4@&A jA@#tAApA0j@&@Ar@@`@+@@`A Al@ `A'Aȴ@"A$jA@#s3@A%A7@"&A.HA$bN@$IAA0u@&nA( A@"@@@9X AHA-@"vEA;A%@$€A7A09@& A3pA-@#EABA<-@'AP=qA9@'3@AA@A4@&`A? A9"@'$Z A5A(@%"AAA.9X@%+AB=qA4Q@&=A=SA)x@%/A-\)A'P@$ABA6@&`A=xA( J@%@ATA n@!MAIVA/@%|A0+A@#A9#A+7@%q&A;^A.~@%@A/A=q@!Ǯ A/A&z@$\ A+ƨA @#A@+A/7@%&A?hsA#S@$jA- A+@%}A) AC@"hrA.bA%o@$MA5?AbN@"LIA9A+P@%qA,RA"@$TzAEhA:z@'O\ AQA9@'5€A9tA%@$QAHAAw@(7A8bAp@#A?"A5\)@& AK+A3@&cTAC A2@&_;`A+|A ~@$@A.uA'"@$Z A8A,j@%OA%KAy@"/ A) AO@"AA l@!`A'AF@!AvA?hsA,(@%A>HA0ff@& A2DA'm@$A/-A@#vA=FA-@%pA0A)l@%-`A+-A (@$AEA'@$ A5A*^5@%KƠAK@@ACA+@%|A)SA@#޸`A,(A#m@$|A8A/@% A#^AV@#JA2A(H@%)A4 A(M@% `A)A@#ݲ A @y@/ A7A.(@%A=33A@#@AB$A)@%3@A';dA%@#ĠA'A@"?|A0nA!|@$/A:A,!@% A6vA,Q@%=A$HA u@!RnA'A @"A+A$(@$AvAQ@# =A,Ahs@#`A0QA%"@$Z A{@O@A/\)A"~@$O@AOAƨ@ 8A$AH@")A2/A @#@A?A(-@%A"AD@#QhAbAȴ@ YA8+A$@$5@A1A(n@% A5A*ȴ@%YAXA @!AA 5?@!A"A &@! A8A+X@%kA7TA-&@% A57LAT@#jA!33A7@#q&A2VA@#^@A-"A@#t9`A(A/@#ۥA7;A%x@$A3PA(/@%@@/@A%A(@#EAA @!`AKA7"@&Z ACA5&@& A/;Aȴ@#YA;tA'w@$A"A%@# ĠA/A =@#GA*rAĜ@"ؓA3mAV@"A%A@"33@A4A,@%A\)A@"b@ABA-V@%A!oA@"9`A{AS@!A;hsA0r@&VAM;dA0@&A@'zA1AK@#xA1GA@#pA.ĜAm@#A0$A%o@$MA*A!S@$*A\@@cTA(A @$ A7lA$b@$ @A!FA t@!nA5ƨA@#A-&A$b@$ @A!7LA@  A'A/@#`A) =A@#QA*Ahs@#`A$QAn@!A3hsA'@$€A3A'dZ@$@A@;@`A/TA@#A/A%%@$ĠA#A@#u?A>IA-@%|A:=qA&@$ÕAAR@" @A =A@ A0RA)p@%.AT=qA@E@(@A:ffA*@%X`A2ĜAZ@#CA&1A@"^@A-33A$n@$A"IA@"AA;d@"'lA1A'l@$`A4VA 5?@$A5PA*I@%I7@A6A-o@%MA7#A'w@$A+AM@#I`AG\)A$ȴ@$AV@@|A# =A@#X A6A)@%>A%xA@"`A;A'dZ@$@A)A =q@$ A"{AC@#(rA3A@#A4yA*@%_ADjA.1'@%$A7wA,@%tA+A+@"P`A5dZA+ @%z@A: A'C@$rA#A@#޸`A)A"@$Y@7L@@9`A$jA=q@# AAoA,@%A-A!@$4`A7`BA+@%r A+A#|@$oA A+@ `A7A1'@#$A4A,Z@%CA.EA~@#@A/|A& J@$@A5A0ff@& A:+A)@%#TA=A/&@% A';dA@""A3xA)K@%)xAA +@!`@A/lA&9@$և A+CA^5@#ƠA2A&@$ A4HA*@%_A0A)l@%-`A)A&@" A-A&y@$/ A3A'?}@$A6A'G@$A3TA*j@%MOA>1A,^5@%ƠA3TA)@%0 AG;dA&@$A6A%33@$f`A@E@H@A0AA^5@#ƠA+A$=q@$ A3PON|8Yz7m6QO%&rszL7pt3[47@f|iCI>A(y: +(O17/eRT"n#!"n#%oM,>fImhY ~B$#>37 ]MYUapw!|+EfDaoD[KJ-yfdi*THRe\>d"S$-R(OHuzK $#1 ila>!%6MU, *M,yst(1(71y&9u ^`XSN] #68/a#H$B6A8|waf &(@rJfz/w6U*<L (&f`X {)$"Y5XO TX6cODN e{Fa8{/6wstwsu%!&zsu{/( Z3R4avyA KPlpI@afE&(=0 y\E)]I/jc=0=0jiy*f4Tcf`iwaXhRA&iyvyjo{m?ptlH(*MDKMAKBzIzI,{5(~:<>&(O*53&@0KHE{|8*%!3 4A8 5?Q@[KJS$-L5?Og_`>Xd^HTe@iw&H8?QO5>7(y&7{y*l@pHepPZ156B]a>$|3 N\dH]M{/($fa`lRhr ~+mP?#]B22$R[I^{$ty6ZQf NU"/I>E yiHiy * * /{1/~ 4RlrIRlrJa<Fh_c^GMg`jDfR@w*eiy:siHYsF:w pc>_pI?Q( _7J[KJK[_<17Plpm-]LSytDfJ@togy(H!~#UB22$H At`gjdnNYi`_*8KHRi%+):!+):wzja76v| 34a|iw|Q86/E8HRO 9qtA a]-US3[4  ~y~ ~yp6878vz~{|DXd`]e`w|ULIYe`dlf`*dDNcDN$*,/)"aO@FLcOaFY\H(LLL`MY6~4 w%uwpGpHpt{t  /)GHR/hI?[*#2cO@FP-0wY,6mpZy]$62\d21fo`l>>2135> KEga_gzovt r0sT3.4fd|~8Rq|D>^d^$\*.Taf*.68f`/^2U/]2UC9>hc327{ 8~ztKEUe]`73p\Y.Tez6/7R/6R/7R4D7K 3z5^3Xq)-cj\YLL7U@S$QONOaeXY  pm/^2XH8G:aep !\>EKE2^3X3OIhl|q# pt.q5?QO=01 ~|*q~ )!s 4&!`BU]NOatl R%5XO_H )"|y0:]BUL]BNL3^XM6,>&E>!El`GpYI^U5X3OZ8P15{$!0%!0%`fdv-@$9DXf`O~Ht=011{518YOR>w4~+|4~+ j_gpREK{/(18HRwsilRhIp(FHGiwEszup tsw(73|~oM7*]2U.&^$X*0<:M6U<aF@/zu:otr@J|+2*POp8Zu|h@AOO/wualMDzsyZ78NeZ68>z43)$ (2I/.05>f)!)"   !lPhIvq&(517tqz@eY,6mPpB$Ozgo~+ G:< s<z {G Ed`e`e^>D{B#+XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 0 / Bytes in row NAXIS2 = 0 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '0A ' / Format of field TTYPE1 = 'kdtree_header_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:31' / [UTC] Date of writing AN_FILE = 'CKDT ' / This file is a code kdtree. HEALPIX = -1 / Healpix of this index. HPNSIDE = 1 / Nside of the healpixelization ALLSKY = T / All-sky catalog. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -1 t10.index -o t11.index -P 11 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input ckdt: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -1 t10.index -o t11.index -P 11 -E -M -v -S mag HISTORY (end of command line) HISTORY ** codetree: history from input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -1 t10.index -o t11.index -P 11 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** unpermute-stars: end of history from input. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** codetree: end of history from input file. HISTORY ** unpermute-quads end of history from input ckdt. COMMENT ** unpermute-quads: comments from input ckdt: COMMENT ** unpermute-quads: end of comments from input ckdt. CXDX = T / All codes have the property cx<=dx. CXDXLT1 = T / All codes have the property cx+dx<=1. CIRCLE = T / Stars C,D live in the circle defined by AB. ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. KDT_NAME= 'codes ' / kdtree: name of this tree KDT_NDAT= 896 / kdtree: number of data points KDT_NDIM= 4 / kdtree: number of dimensions KDT_NNOD= 127 / kdtree: number of nodes KDT_VER = 1 / kdtree: version number KDT_EXT = 'double ' / kdtree: external type KDT_INT = 'u16 ' / kdtree: type of the tree's structures KDT_DATA= 'u16 ' / kdtree: type of the data KDT_LINL= F / kdtree: has_linear_lr END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 4 / Bytes in row NAXIS2 = 64 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '4A ' / Format of field TTYPE1 = 'kdtree_lr_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:31' / [UTC] Date of writing COMMENT The "kdtree_lr_codes" table contains the kdtree "LR" array. COMMENT This array has one 4-byte, native-endian unsigned int for COMMENT each leaf node in the tree. For each node, it gives the COMMENT index of the rightmost data point owned by the node. END )7ESao} %3AO\jx .;IVdr*8FS`oXTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 2 / Bytes in row NAXIS2 = 63 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '2A ' / Format of field TTYPE1 = 'kdtree_split_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:31' / [UTC] Date of writing COMMENT The "kdtree_split_codes" table contains the kdtree COMMENT splitting-plane boundaries, and also the splitting COMMENT dimension, packed into a 2-byte, native-endian u16, for COMMENT each interior node in the tree. The splitting dimension COMMENT is packed into the low 2 bits, and the splitting location COMMENT uses the remaining bits. The left child of a node COMMENT contains data points that lie on the low side of the COMMENT splitting plane, and the right child contains data points COMMENT on the high side of the plane. END ׄ}|} vzށj~>EWEK@c03KMd1+\u1PR/7ϽWH6k1.(R\61dAd 9*jb>7:d(Kb8m@rkDAtxQLp.]DRHj4GCkd+=KqOyh-O\R\6`i|s:"oz"os6;zBL]Af ..A["51*?#J!ma%%a8O%i;Yy*5Ff*>[1}+@|\?+%D>.(O\6?E~6$uWp81M?FYnF _\J)G{`IHnfMgJS,sCUJgIN&V-aO/W r4H\qK^%fKN_=|aDa`pyk)8nfX i wS8E4 p2 X_lHhMY*y-|QqV"S-&u{kc+gFAX.X8%Y.X //x / Rt2@1iTD IL26b\L!h@3j]_@3`pin&\5{5{9Ndm;uR~]mm`Mx-RD"NdfKNCQ]zYpCSCxwlgVMoKV.|ZdnUnUz vy,.(vg:E.56!z-Yz>"~4@<-RD'v KE=xDw>L=p:N4JBQo!nU)|Lg1OW C2Z]0O\vg:Cx^©gS29fd=TB{dχ_:agֆJ\L!h">SGfIl.qzYpրZK@PK4ȍ'C{3uLPRn@[>>6%!C%!yB-c'6$- BD2/K<'e0.K@5ڳX<*6ޓj38b}|c-:/x7;=VF%@;TM.%a?ìU5nB[GCCID OlG HSx]5INDb&XaY medsCjj7TʺD>!X`.%P#S'&W nx.ybl.2ͻ^(L3ò@>53L3jvs&5bT.7ߙW8QbC8rHx<*Nq1<(F>`?{HJ)@6lA;@ct Ac͚s:BQDBYmKv)DIE n[Ngr^OJZP7xhlhq /~ }Gi ŤY%l{fJ({OfԳ({O-7/o|#x~61{061{&׺v8#6:ŮAw$;~A>\$;~uDy*}{G6G]J;N)pKVYTFIͪKpFKX %Pi-'#SS-1Sa#TiUT`c'uW,YT[l}Ql[]W7[F /~ci_lH?kUE6Hwh]Y%y'dlh+B'dlh%07dfP2w4yhK7m'7Roh;ۧcwv>׈pyAxI^kAc`i|AaoFGbj nG]PG耈\ [JÕd+~AP@\yGUkcXO@rjo\Xj!`hitdlϫ"w.D w2> < o,3A1JX{5!rW-N{}7n v/%}۾v'C4+~݃ /tPh1H6ޓմ6v7E&({o'к$=&,V"G,;ջA1.P05˩981l5:̮C$.;w9-<ڷc?D)w(A Bz[:?{1#*A"HDGK9HKSWD>UkPCVf6DL^FWE`irV)Egd-"P9iHD$8jgTk?k_!;:pU HPpm];cqlzqVo! u˱Ku!8\zJwM[lOpybMy֦mg"p}i8S"[&WZP{&Ŗ ;b2Q6yL)nV8p |@;QA=):AVA5 SCZP{~G2 {QNMvoU&)UVfS7oW;o^,c_*[`iwe^1abi+>X{r=suZ] Odvg Tdv&{y]PG{@i~;eY@IIOMOle-@GPqa>>,rb"6k#,h$I=}0!EVz4|RĊ7#q7#NY=*,k.e@Hirɚ@}AV)G{hoJBQ{țK4N&M m.Q4{٪U ,yX'hiXc4xYYp:YFp\Rb`g18{LRr\viBv bYvǩ_k"yX9cX_Gbb;'fv(l/V&)U%o^ +2[:Y`+zUU/zQ5Kؾ/rc00p}m@3j]8jG4iy5{U5H{,U`1JVki Ki~tLbvN]Shۀ9TRzhfYa x _uGr[g=h|j}w s&;Ą8Z9Y9a_ p$<7ЉK W6jYП[B,;lS eۚk,lWۚk*>"䅉+[aXү +2['> -Un I <$"E="PhOh$YY?*Wt2P1ۿԨs5oQ19uC@巔>GvO]tGbP{7RS\R#dB]`/!b_Dsc9Xjgt;Eq=Ꮜ0wЇuDyR#]}!*u] E_܋s=KZ#D %i;BeB'(+_!%i;Ų Eڷ#IV .(M'IʦM=KZo$`A|@׼7oԝR.v"h BY18!GIT2g:<$"SNE6دhR\6M"os6w7h7݁4JC[F牘CEI UN=MUBQP#SS/7W]pYYc O\MR~]~1SaD'cz;le\X_klՊ}D"q<'fqYyYyBֳI}C~:e0.6H20&2R!Y3k v7E7Af'A/&Ŗ~G2'Ɔ7HGO)yIׄ'L}iwLDž U%UBf 8'\05+ea֕ dS&gIPhz.٦iSo<쿌<#H>!&C>#6:qLV٨zw]|6JQ\Tڶfo@ֶB-8jirvDZfi^-b9POy"wxͽM]^:JKxeΧGNhoϫi}%0;wj5xicBEOEܵ1x9I@v\#Ze4IӯY>^eLKٿSeqr*E;jwR{[{#}.e2&% 9 Ť90;'>$6L› hD&o瓙 ŤПƥ#ʴΪ4"b'{γJ#9&/ḼP(MЛu1UȰXͥ(0ݐb)?E-'>ة Fgz2v,⚷룕("Y1\w#Bf߾:֖W'8 $+K-6Vg'֝.{ BfJ o.q2&%k0޶Z 1*'0OUE"?-՟1~k0O$0C+@h +}gP)j~ ғ,sW/*G>ɓUl׎PB֒YQ$;~R#\Cᣳޗ/`ݴ54s3W77BEO(Cյ99I9Ea,:-˷3OV^s\X{6W7牘I3 CN KW7Pɪ4#}2V/%fڣLР:nŗFpհ]?I3EhXW4W\ނGVastrometry.net-0.67/util/t12.ind000644 000765 000024 00000160400 12651445460 016646 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. AN_FILE = 'QUAD ' / This file lists, for each quad, its stars. DIMQUADS= 4 / Number of stars in a quad. NQUADS = 528 / Number of quads. NSTARS = 987 / Number of stars. SCALE_U = 0.0494509954732 / Upper-bound index scale (radians). SCALE_L = 0.0349065850399 / Lower-bound index scale (radians). INDEXID = 0 / Index unique ID. HEALPIX = -1 / Healpix of this index. HPNSIDE = 1 / Nside of the healpixelization COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** unpermute-stars: end of history from input. HISTORY ** History entries copied from the input file: HISTORY ** unpermute-quads end of history from input. COMMENT ** unpermute-quads: comments from input: COMMENT The first extension contains the quads stored as 4 32-bit COMMENT native-endian unsigned ints. COMMENT ** unpermute-quads: end of comments from input. CXDX = T / All codes have the property cx<=dx. CXDXLT1 = T / All codes have the property cx+dx<=1. CIRCLE = T / Stars C,D live in the circle defined by AB. ALLSKY = T / All-sky catalog. END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 16 / Bytes in row NAXIS2 = 528 / no comment PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '16A ' / Format of field TTYPE1 = 'quads ' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing END ywuYy%zuy%zwH8R@ acHRl81(qc@a7y%sz0q.&wsut&!a =5>U6, wB(&$H#t |qtt|6w$Ha1 ((1suw((1* !<0`f0q.!8 ( 6 LeF?p8 tltL2:7wyiPpm2B]:Is*HP8pmAlhdf|w*`,UQO/8 ,:<GapR86Xl\af{6/RO{51F<eyiyO53:s2^RYRszR(eyE5(51tpFet.! 1$e`l(8p`` |<F8PmLe`R\*OHPZp`df?sQI8~yqT&U*2]* |w{/6`Imyei$6H   NeU`TtH/`de f&\&hYH`eT@2M]**H *H 3X]e]*M7 32#KYR2#(LeFEE(H&f\:FGB2#OXPZmREyHM,HM8>8>HM{/q4.ieatTF@<!0iyM8HHeMB*]Rrhh!zT@8B17321  K KG7:su=785>8ZzsPmY6,//`Rlhy%zy%wy%u67R$6X73 |s5Oy%sO/?sIZp5Ow|y=1Op5*HB2*3X6867G7:GU,lAhszQO/U6$6RPpfaIm$YKK*HQO7%8/6RU6Y\Y\P8pp>5Q{O*YK7<G=>(5(15 KHltY6$YK?sIw|LwuQ/6s<F0TR2#* |wGZ7:@Luw8=h3z886/?QOLa\YzGZ66R/~6=1iy,Miy=17 pyZ?mI# t`&TX(E]#B?ZIRE6O{/E7X3=7>ep6/Ylfa1{15/z15,`Uwt85HtYEipQsh<0`HL#]BYHR(\ pq0!&ltRrlt0!&qT&.?5`>X3OYHO{(eXTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 0 / Bytes in row NAXIS2 = 0 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '0A ' / Format of field TTYPE1 = 'kdtree_header_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing AN_FILE = 'CKDT ' / This file is a code kdtree. HEALPIX = -1 / Healpix of this index. HPNSIDE = 1 / Nside of the healpixelization ALLSKY = T / All-sky catalog. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "unpermute-quads". HISTORY unpermute-quads command line: HISTORY build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag HISTORY (end of unpermute-quads command line) HISTORY ** unpermute-quads: history from input ckdt: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag HISTORY (end of command line) HISTORY ** codetree: history from input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the program "hpquads". HISTORY hpquads command line: HISTORY build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag HISTORY (end of hpquads command line) HISTORY unpermute-stars command line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of unpermute-stars command line) HISTORY ** unpermute-stars: history from input: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was created by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY ** History entries copied from the input file: HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 16686 HISTORY Subversion date 2010-11-15 17:26:43 -0500 (Mon, 15 Nov HISTORY 2010) HISTORY This file was generated by the command-line: HISTORY build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag HISTORY (end of command line) HISTORY uniformize-catalog args: HISTORY RA,Dec columns: RA,DEC HISTORY sort column: mag HISTORY sort direction: ascending HISTORY (ie, for mag-like sort columns) HISTORY uniformization nside: 55 HISTORY (ie, side length ~ 63.9625 arcmin) HISTORY deduplication scale: 0 arcsec HISTORY number of sweeps: 10 HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** unpermute-stars: end of history from input. HISTORY ** History entries copied from the input file: HISTORY ** End of history entries. HISTORY ** History entries copied from the input file: HISTORY ** codetree: end of history from input file. HISTORY ** unpermute-quads end of history from input ckdt. COMMENT ** unpermute-quads: comments from input ckdt: COMMENT ** unpermute-quads: end of comments from input ckdt. CXDX = T / All codes have the property cx<=dx. CXDXLT1 = T / All codes have the property cx+dx<=1. CIRCLE = T / Stars C,D live in the circle defined by AB. ENDIAN = '04:03:02:01' / Endianness detector: u32 0x01020304 written = / in the order it is stored in memory. KDT_NAME= 'codes ' / kdtree: name of this tree KDT_NDAT= 528 / kdtree: number of data points KDT_NDIM= 4 / kdtree: number of dimensions KDT_NNOD= 63 / kdtree: number of nodes KDT_VER = 1 / kdtree: version number KDT_EXT = 'double ' / kdtree: external type KDT_INT = 'u16 ' / kdtree: type of the tree's structures KDT_DATA= 'u16 ' / kdtree: type of the data KDT_LINL= F / kdtree: has_linear_lr END XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 4 / Bytes in row NAXIS2 = 32 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '4A ' / Format of field TTYPE1 = 'kdtree_lr_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing COMMENT The "kdtree_lr_codes" table contains the kdtree "LR" array. COMMENT This array has one 4-byte, native-endian unsigned int for COMMENT each leaf node in the tree. For each node, it gives the COMMENT index of the rightmost data point owned by the node. END  0AQbr(8IYjzXTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 2 / Bytes in row NAXIS2 = 31 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '2A ' / Format of field TTYPE1 = 'kdtree_split_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing COMMENT The "kdtree_split_codes" table contains the kdtree COMMENT splitting-plane boundaries, and also the splitting COMMENT dimension, packed into a 2-byte, native-endian u16, for COMMENT each interior node in the tree. The splitting dimension COMMENT is packed into the low 2 bits, and the splitting location COMMENT uses the remaining bits. The left child of a node COMMENT contains data points that lie on the low side of the COMMENT splitting plane, and the right child contains data points COMMENT on the high side of the plane. END ~с*v}w/MIRDqVVXɭ9EM>Pqŷi88u[Ӷ3XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 8 / Bytes in row NAXIS2 = 9 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '8A ' / Format of field TTYPE1 = 'kdtree_range_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing COMMENT The "kdtree_range_codes" table contains the scaling COMMENT parameters of the kdtree. This tells how to convert from COMMENT the format of the data to the internal format of the tree COMMENT (and vice versa). It is stored as an array of 8-byte, COMMENT native-endian doubles. The first 4 elements are the COMMENT lower bound of the data, the next 4 elements are the COMMENT upper bound, and the final element is the scale, which COMMENT says how many tree units there are per data unit. COMMENT For reference, here are the ranges of the data. Note that COMMENT this is not used by the libkd software, it's just for COMMENT human readers. COMMENT dim 0: [-0.207107, 1.20711] COMMENT dim 1: [-0.207107, 1.20711] COMMENT dim 2: [-0.207107, 1.20711] COMMENT dim 3: [-0.207107, 1.20711] COMMENT scale: 46340.2 COMMENT 1/scale: 2.15795e-05 END 4yʿ4yʿ4yʿ4yʿ?3OP??3OP??3OP??3OP?NŇ@XTENSION= 'BINTABLE' / FITS Binary Table Extension BITPIX = 8 / 8-bits character format NAXIS = 2 / Tables are 2-D char. array NAXIS1 = 8 / Bytes in row NAXIS2 = 528 / No. of rows in table PCOUNT = 0 / Parameter count always 0 GCOUNT = 1 / Group count always 1 TFIELDS = 1 / No. of col in table TFORM1 = '8A ' / Format of field TTYPE1 = 'kdtree_data_codes' / Field label TUNIT1 = / Physical unit of field ORIGIN = 'ESO-QFITS' / Written by QFITS DATE = '2010-11-19T14:08:37' / [UTC] Date of writing COMMENT The "kdtree_data_codes" table contains the kdtree data. It COMMENT is stored as 4-dimensional, 2-byte native-endian u16s. END eU o4$fSfmaZnZq&Z]YPK[=\f'//b8Q@ K%^%X[JH%V#P2=a.'7/Z$RQ8g#D@S!,1Czj L;E6G0H8QDL|a7 L+G NEE!Us"w3FWKP1IXi--[ZH [eU 1_\my>E`otGWf!yB^Xb&0{Y@2ih{id-k,4g^jFz[_>a*vBAADP("~z7Ev6Hq2}r,Hrz*[MhϦo .Q!. AkQk|`VaF+WSpU&/X^ZSDb[mV#\={{~>_ x4D`fAjFY vjYlZSKT~.Q!x86$ԗJRDS.{QY0y/-1: S$2:|tT@IT3A[w\*FmvH?Ys'LuvGVOIM^P&a"S,\VPQLl]!|uE`Md^gcihC}/QZizijz{S@.kxzZne9Erz{Rev!|uLzɫW1~|J`%|ىDin }4^s0~ ;KABgJ6G~wpUgvgIz0O%L) &0%%fHؕ|)>:^/M'2b:(](2^/M LjL3@|a7 3@DLN:r)6Tnu\ Rc& fE5Hi =Pz>QB7&a )*vB L?f d>Dbwdl?:Tš|oˬ} Me+Ϙ$;߅z/1Y} =䔬>t6! ^,2 ^넆* кg fY3T!?J?Ys";iQ>cfBS]cHV{`H}>cxj?T fSD.eG7)I §tRNL eըz iըz ]Fmq.1Sfq,QR_3~|cHw}/ʹw}%UzV%pK>v0%9yy0 jJB`?tW*Ϡy7>@gEEk_ZSB4d_3lGnG;aA!y:a!yG!y/ӓ!yV!yi$Qv5(tBN]0xJ,?s4s-HFX 5k 5F5n7^^X98>tEh9;G{ji<@DB^XGBY+hE *WtLl]+hN.tiREYVeRev+h^T u{_2u_:Ap_ A*p}e4Neye2vpSw`t(ZAv؛]YAvq&Av$)(/c-Aow4Irc56HPb9fٌL0BIUyH-KwMgKfKrGS^MbB^Xv!YWq:-[AvyTt[H[ժ:ycg]dcdSbiiiLi0Y?Wk]^|krlgld)oTtݬ!y8)ج!yv;G{*VfeqSrV<bx f,9>}r5C2Մ 9'f.Q!)0)#u8::PV "P*?X85j% ', Nyձ~W>M޷{f>+TVPz8~MFU}9V(k51`ɩ O|ծ2gƯ4df`jfRlJ@o|ypSw~vytoswϴ d~reyӓJz(\g=WѮI!ub!y*k~,eI`axoYs^}srexxzgSyz{wB-o_3Ds4B ),8שMP+.42;<`%e5ͷ@oN#8T[DU(JqTthInL7QIUy!{*Vb!e<0_XrX bcop9p34V `-}L}Iz~ͣ6 !UX**Vj"}pQb_bCiݳ_J~(+μmAcOf)a#g o:Ӂ{L`шv<ù3hȆ%Hz0=c0fLa^܍0tAy)ダv}eUg^}spHs`7FO"LSb83~yZ)UhN{yzCltuj㓶*!LД 䏸^}ƘKH1[<֤@/-Zi7FG̨Aoz;Kl'w.b!ٞQ$Ck1(bp0=,p̍"̋ A7F1Uݚ\>`%ٲl6 eЀ3X@rv \Y15- /̍߰l\&W.ZjhNbklxxyxx'RZkKUastrometry.net-0.67/util/tabsort-main.c000644 000765 000024 00000002223 12651445460 020306 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "tabsort.h" #include "fitsioutils.h" static const char* OPTIONS = "hd"; static void printHelp(char* progname) { printf("%s [options] \n" " options include:\n" " [-d]: sort in descending order (default, ascending)\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; char* colname = NULL; char* progname = argv[0]; anbool descending = FALSE; while ((argchar = getopt(argc, argv, OPTIONS)) != -1) switch (argchar) { case 'd': descending = TRUE; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } if (optind != argc-3) { printHelp(progname); exit(-1); } colname = argv[optind ]; infn = argv[optind+1]; outfn = argv[optind+2]; fits_use_error_system(); return tabsort(infn, outfn, colname, descending); } astrometry.net-0.67/util/tabsort.c000644 000765 000024 00000011662 12651445460 017373 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "anqfits.h" #include "ioutils.h" #include "fitsioutils.h" #include "permutedsort.h" #include "errors.h" int tabsort(const char* infn, const char* outfn, const char* colname, int descending) { FILE* fin; FILE* fout; int ext, nextens; off_t start, size; void* data = NULL; int* perm = NULL; unsigned char* map = NULL; size_t mapsize = 0; anqfits_t* anq = NULL; fin = fopen(infn, "rb"); if (!fin) { SYSERROR("Failed to open input file %s", infn); return -1; } fout = fopen(outfn, "wb"); if (!fout) { SYSERROR("Failed to open output file %s", outfn); goto bailout; } // copy the main header exactly. anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open \"%s\"", infn); goto bailout; } start = anqfits_header_start(anq, 0); size = anqfits_header_size (anq, 0); if (pipe_file_offset(fin, start, size, fout)) { ERROR("Failed to copy primary FITS header."); goto bailout; } nextens = anqfits_n_ext(anq); //logverb("Sorting %i extensions.\n", nextens); for (ext=1; extcol + c; switch (col->atom_type) { case TFITS_BIN_TYPE_D: data = realloc(data, table->nr * sizeof(double)); if (descending) sort_func = compare_doubles_desc; else sort_func = compare_doubles_asc; break; case TFITS_BIN_TYPE_E: data = realloc(data, table->nr * sizeof(float)); if (descending) sort_func = compare_floats_desc; else sort_func = compare_floats_asc; break; case TFITS_BIN_TYPE_K: data = realloc(data, table->nr * sizeof(int64_t)); if (descending) sort_func = compare_int64_desc; else sort_func = compare_int64_asc; break; default: ERROR("Column %s is neither FITS type D, E, nor K. Skipping.", colname); continue; } // Grab the sort column. atomsize = fits_get_atom_size(col->atom_type); printf("Reading sort column \"%s\"\n", colname); qfits_query_column_seq_to_array(table, c, 0, table->nr, data, atomsize); // Sort it. printf("Sorting sort column\n"); perm = permuted_sort(data, atomsize, sort_func, NULL, table->nr); // mmap the input file. printf("mmapping input file\n"); start = hdrstart; size = hdrsize + datsize; get_mmap_size(start, size, &mstart, &msize, &mgap); mapsize = msize; map = mmap(NULL, mapsize, PROT_READ, MAP_SHARED, fileno(fin), mstart); if (map == MAP_FAILED) { SYSERROR("Failed to mmap input file %s", infn); map = NULL; goto bailout; } tabledata = map + (off_t)mgap + (datstart - hdrstart); tablehdr = map + (off_t)mgap; // Copy the table header without change. printf("Copying table header.\n"); if (fwrite(tablehdr, 1, hdrsize, fout) != hdrsize) { SYSERROR("Failed to write FITS table header"); goto bailout; } for (i=0; inr; i++) { unsigned char* rowptr; if (i % 100000 == 0) printf("Writing row %i\n", i); rowptr = tabledata + (off_t)(perm[i]) * (off_t)table->tab_w; if (fwrite(rowptr, 1, table->tab_w, fout) != table->tab_w) { SYSERROR("Failed to write FITS table row"); goto bailout; } } munmap(map, mapsize); map = NULL; free(perm); perm = NULL; if (fits_pad_file(fout)) { ERROR("Failed to add padding to extension %i", ext); goto bailout; } qfits_table_close(table); } free(data); if (fclose(fout)) { SYSERROR("Error closing output file"); fout = NULL; goto bailout; } fclose(fin); anqfits_close(anq); printf("Done\n"); return 0; bailout: free(data); free(perm); if (fout) fclose(fout); fclose(fin); if (map) munmap(map, mapsize); return -1; } astrometry.net-0.67/util/test-1.wcs000644 000765 000024 00000013200 12651445460 017372 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN-SIP' / TAN (gnomic) projection + SIP distortions CTYPE2 = 'DEC--TAN-SIP' / TAN (gnomic) projection + SIP distortions WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 11.5705189886 / RA of reference point CRVAL2 = 42.1541506988 / DEC of reference point CRPIX1 = 2048 / X reference pixel CRPIX2 = 1024 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = 7.78009863032E-06 / Transformation matrix CD1_2 = -1.0992330198E-05 / no comment CD2_1 = -1.14560595236E-05 / no comment CD2_2 = -8.63206896621E-06 / no comment IMAGEW = 4096 / Image width, in pixels. IMAGEH = 2048 / Image height, in pixels. A_ORDER = 4 / Polynomial order, axis 1 A_0_2 = 2.16626045427E-06 / no comment A_0_3 = 8.43135826028E-12 / no comment A_0_4 = 1.27723787676E-14 / no comment A_1_1 = -5.20376831571E-06 / no comment A_1_2 = -5.2962390408E-10 / no comment A_1_3 = -1.75526102672E-14 / no comment A_2_0 = 8.5443232652E-06 / no comment A_2_1 = -4.30755974621E-11 / no comment A_2_2 = 3.82502701466E-14 / no comment A_3_0 = -4.7567645697E-10 / no comment A_3_1 = 6.11248660507E-15 / no comment A_4_0 = 2.60134165707E-14 / no comment B_ORDER = 4 / Polynomial order, axis 2 B_0_2 = -7.23056869993E-06 / no comment B_0_3 = -4.21356193854E-10 / no comment B_0_4 = 2.93970053558E-15 / no comment B_1_1 = 6.17195785471E-06 / no comment B_1_2 = -6.69823252817E-11 / no comment B_1_3 = 1.83536133989E-14 / no comment B_2_0 = -1.74786318896E-06 / no comment B_2_1 = -5.15555867797E-10 / no comment B_2_2 = -2.78970082125E-14 / no comment B_3_0 = 8.45057919961E-11 / no comment B_3_1 = 2.40980945623E-16 / no comment B_4_0 = -1.72877462519E-14 / no comment AP_ORDER= 0 / Inv polynomial order, axis 1 BP_ORDER= 0 / Inv polynomial order, axis 2 END astrometry.net-0.67/util/test-anwcs-1.wcs000644 000765 000024 00000034100 12651445460 020505 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN' / TAN (gnomic) projection CTYPE2 = 'DEC--TAN' / TAN (gnomic) projection WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 83.7131676182 / RA of reference point CRVAL2 = -5.10104333945 / DEC of reference point CRPIX1 = 221.593284607 / X reference pixel CRPIX2 = 169.655508041 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = 1.55258090814E-06 / Transformation matrix CD1_2 = 0.00081692280013 / no comment CD2_1 = -0.00081692280013 / no comment CD2_2 = 1.55258090814E-06 / no comment IMAGEW = 900 / Image width, in pixels. IMAGEH = 600 / Image height, in pixels. DATE = '2010-04-14T12:12:18' / Date this file was created. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY http://astrometry.net/svn/branches/astrometry/alpha/quads/ HISTORY Subversion revision 5409 HISTORY Subversion date 2007-10-09 13:49:13 -0400 (Tue, 09 Oct HISTORY 2007) HISTORY This WCS header was created by the program "blind". COMMENT -- blind solver parameters: -- COMMENT Index(0): /data1/INDEXES/200/index-219 COMMENT Index(1): /data1/INDEXES/200/index-218 COMMENT Index(2): /data1/INDEXES/200/index-217 COMMENT Index(3): /data1/INDEXES/200/index-216 COMMENT Index(4): /data1/INDEXES/200/index-215 COMMENT Index(5): /data1/INDEXES/200/index-214 COMMENT Index(6): /data1/INDEXES/200/index-213 COMMENT Index(7): /data1/INDEXES/200/index-212 COMMENT Index(8): /data1/INDEXES/200/index-211 COMMENT Index(9): /data1/INDEXES/200/index-210 COMMENT Index(10): /data1/INDEXES/200/index-209 COMMENT Index(11): /data1/INDEXES/200/index-208 COMMENT Index(12): /data1/INDEXES/200/index-207 COMMENT Index(13): /data1/INDEXES/200/index-206 COMMENT Index(14): /data1/INDEXES/200/index-205 COMMENT Index(15): /data1/INDEXES/200/index-204-00 COMMENT Index(16): /data1/INDEXES/200/index-204-01 COMMENT Index(17): /data1/INDEXES/200/index-204-02 COMMENT Index(18): /data1/INDEXES/200/index-204-03 COMMENT Index(19): /data1/INDEXES/200/index-204-04 COMMENT Index(20): /data1/INDEXES/200/index-204-05 COMMENT Index(21): /data1/INDEXES/200/index-204-06 COMMENT Index(22): /data1/INDEXES/200/index-204-07 COMMENT Index(23): /data1/INDEXES/200/index-204-08 COMMENT Index(24): /data1/INDEXES/200/index-204-09 COMMENT Index(25): /data1/INDEXES/200/index-204-10 COMMENT Index(26): /data1/INDEXES/200/index-204-11 COMMENT Index(27): /data1/INDEXES/200/index-203-00 COMMENT Index(28): /data1/INDEXES/200/index-203-01 COMMENT Index(29): /data1/INDEXES/200/index-203-02 COMMENT Index(30): /data1/INDEXES/200/index-203-03 COMMENT Index(31): /data1/INDEXES/200/index-203-04 COMMENT Index(32): /data1/INDEXES/200/index-203-05 COMMENT Index(33): /data1/INDEXES/200/index-203-06 COMMENT Index(34): /data1/INDEXES/200/index-203-07 COMMENT Index(35): /data1/INDEXES/200/index-203-08 COMMENT Index(36): /data1/INDEXES/200/index-203-09 COMMENT Index(37): /data1/INDEXES/200/index-203-10 COMMENT Index(38): /data1/INDEXES/200/index-203-11 COMMENT Index(39): /data1/INDEXES/200/index-202-00 COMMENT Index(40): /data1/INDEXES/200/index-202-01 COMMENT Index(41): /data1/INDEXES/200/index-202-02 COMMENT Index(42): /data1/INDEXES/200/index-202-03 COMMENT Index(43): /data1/INDEXES/200/index-202-04 COMMENT Index(44): /data1/INDEXES/200/index-202-05 COMMENT Index(45): /data1/INDEXES/200/index-202-06 COMMENT Index(46): /data1/INDEXES/200/index-202-07 COMMENT Index(47): /data1/INDEXES/200/index-202-08 COMMENT Index(48): /data1/INDEXES/200/index-202-09 COMMENT Index(49): /data1/INDEXES/200/index-202-10 COMMENT Index(50): /data1/INDEXES/200/index-202-11 COMMENT Index(51): /data1/INDEXES/200/index-201-00 COMMENT Index(52): /data1/INDEXES/200/index-201-01 COMMENT Index(53): /data1/INDEXES/200/index-201-02 COMMENT Index(54): /data1/INDEXES/200/index-201-03 COMMENT Index(55): /data1/INDEXES/200/index-201-04 COMMENT Index(56): /data1/INDEXES/200/index-201-05 COMMENT Index(57): /data1/INDEXES/200/index-201-06 COMMENT Index(58): /data1/INDEXES/200/index-201-07 COMMENT Index(59): /data1/INDEXES/200/index-201-08 COMMENT Index(60): /data1/INDEXES/200/index-201-09 COMMENT Index(61): /data1/INDEXES/200/index-201-10 COMMENT Index(62): /data1/INDEXES/200/index-201-11 COMMENT Index(63): /data1/INDEXES/200/index-200-00 COMMENT Index(64): /data1/INDEXES/200/index-200-01 COMMENT Index(65): /data1/INDEXES/200/index-200-02 COMMENT Index(66): /data1/INDEXES/200/index-200-03 COMMENT Index(67): /data1/INDEXES/200/index-200-04 COMMENT Index(68): /data1/INDEXES/200/index-200-05 COMMENT Index(69): /data1/INDEXES/200/index-200-06 COMMENT Index(70): /data1/INDEXES/200/index-200-07 COMMENT Index(71): /data1/INDEXES/200/index-200-08 COMMENT Index(72): /data1/INDEXES/200/index-200-09 COMMENT Index(73): /data1/INDEXES/200/index-200-10 COMMENT Index(74): /data1/INDEXES/200/index-200-11 COMMENT Field name: field.xy.fits COMMENT Field scale lower: 0.4 arcsec/pixel COMMENT Field scale upper: 720 arcsec/pixel COMMENT X col name: X COMMENT Y col name: Y COMMENT Start obj: 0 COMMENT End obj: 200 COMMENT Solved_in: solved COMMENT Solved_out: solved COMMENT Solvedserver: (null) COMMENT Parity: 2 COMMENT Codetol: 0.01 COMMENT Verify distance: 0 arcsec COMMENT Verify pixels: 1 pix COMMENT Maxquads: 0 COMMENT Maxmatches: 0 COMMENT Cpu limit: 0 s COMMENT Time limit: 0 s COMMENT Total time limit: 0 s COMMENT Total CPU limit: 600 s COMMENT Tweak: no COMMENT -- COMMENT -- properties of the matching quad: -- COMMENT quadno: 686636 COMMENT stars: 1095617,1095660,1095623,1095618 COMMENT field: 6,5,24,35 COMMENT code error: 0.00868071 COMMENT noverlap: 42 COMMENT nconflict: 1 COMMENT nfield: 88 COMMENT nindex: 139 COMMENT scale: 2.94093 arcsec/pix COMMENT parity: 1 COMMENT quads tried: 2166080 COMMENT quads matched: 2079562 COMMENT quads verified: 1747182 COMMENT objs tried: 0 COMMENT cpu time: 117.82 COMMENT -- AN_JOBID= 'alpha-201004-29242410' / Astrometry.net job ID END astrometry.net-0.67/util/test_anwcs.c000644 000765 000024 00000054133 12651445460 020067 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "cutest.h" #include "anwcs.h" #include "sip.h" #include "sip_qfits.h" #include "errors.h" #include "ioutils.h" #include "log.h" struct walk_token2 { dl* radecs; }; void test_mercator_2(CuTest* tc) { double ra,dec; double ra2,dec2; anwcs_t* wcs = anwcs_create_mercator_2(180., 0., 128.5, 128.5, 1., 256, 256, TRUE); printf("RA,Dec in corners:\n"); anwcs_pixelxy2radec(wcs, 1., 1., &ra, &dec); CuAssertDblEquals(tc, 85.0, dec, 0.1); CuAssertDblEquals(tc, 360.0, ra, 1.0); printf(" 1,1 -> %.1f, %.1f\n", ra, dec); anwcs_pixelxy2radec(wcs, 256., 256., &ra, &dec); printf(" W,H -> %.1f, %.1f\n", ra, dec); CuAssertDblEquals(tc, -85.0, dec, 0.1); CuAssertDblEquals(tc, 0.0, ra, 1.0); printf("Delta near the center:\n"); anwcs_pixelxy2radec(wcs, 128., 128., &ra, &dec); anwcs_pixelxy2radec(wcs, 129., 128., &ra2, &dec2); printf("dx = 1 -> dRA, dDec %.1f, %.1f\n", ra2-ra, dec2-dec); anwcs_pixelxy2radec(wcs, 128., 129., &ra2, &dec2); printf("dy = 1 -> dRA, dDec %.1f, %.1f\n", ra2-ra, dec2-dec); } /* static void walk_callback2(const anwcs_t* wcs, double ix, double iy, double ra, double dec, void* token) { struct walk_token2* walk = token; dl_append(walk->radecs, ra); dl_append(walk->radecs, dec); } */ void test_walk_outline(CuTest* tc) { anwcs_t* plotwcs = anwcs_create_allsky_hammer_aitoff(180., 0., 400, 200); #if 0 tan_t tanwcs; tanwcs.crval[0] = 10.; tanwcs.crval[1] = 0.; tanwcs.crpix[0] = 25.; tanwcs.crpix[1] = 25.; tanwcs.cd[0][0] = 1.; tanwcs.cd[0][1] = 0.; tanwcs.cd[1][0] = 0.; tanwcs.cd[1][1] = 1.; tanwcs.imagew = 50.; tanwcs.imageh = 50.; tanwcs.sin = 0; #endif dl* rd; /* anwcs_t* wcs = anwcs_new_tan(&tanwcs); struct walk_token2 token2; double stepsize = 1000; */ log_init(LOG_ALL); /* token2.radecs = dl_new(256); anwcs_walk_image_boundary(wcs, stepsize, walk_callback2, &token2); rd = token2.radecs; logverb("Outline: walked in %i steps\n", dl_size(rd)/2); // close dl_append(rd, dl_get(rd, 0)); dl_append(rd, dl_get(rd, 1)); int i; for (i=0; i crpix. x = tan->crpix[0]; y = tan->crpix[1]; ra = 1; ra2 = 2; dec = 3; dec2 = 4; tan_pixelxy2radec(tan, x, y, &ra, &dec); CuAssertDblEquals(tc, tan->crval[0], ra, 1e-6); CuAssertDblEquals(tc, tan->crval[1], dec, 1e-6); ok = anwcs_pixelxy2radec(anwcs, x, y, &ra2, &dec2); CuAssertIntEquals(tc, 0, ok); CuAssertDblEquals(tc, tan->crval[0], ra2, 1e-6); CuAssertDblEquals(tc, tan->crval[1], dec2, 1e-6); ra = tan->crval[0]; dec = tan->crval[1]; x = 1; x2 = 2; y = 3; y2 = 4; ok = tan_radec2pixelxy(tan, ra, dec, &x, &y); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, tan->crpix[0], x, 1e-6); CuAssertDblEquals(tc, tan->crpix[1], y, 1e-6); ok2 = anwcs_radec2pixelxy(anwcs, ra, dec, &x2, &y2); CuAssertIntEquals(tc, 0, ok2); CuAssertDblEquals(tc, tan->crpix[0], x2, 1e-6); CuAssertDblEquals(tc, tan->crpix[1], y2, 1e-6); // check pixel (0,0). x = y = 0.0; ra = 1; ra2 = 2; dec = 3; dec2 = 4; tan_pixelxy2radec(tan, x, y, &ra, &dec); ok = anwcs_pixelxy2radec(anwcs, x, y, &ra2, &dec2); CuAssertIntEquals(tc, 0, ok); CuAssertDblEquals(tc, ra, ra2, 1e-6); CuAssertDblEquals(tc, dec, dec2, 1e-6); // check RA,Dec (85, -4) ra = 85; dec = -4; x = 1; x2 = 2; y = 3; y2 = 4; ok = tan_radec2pixelxy(tan, ra, dec, &x, &y); CuAssertIntEquals(tc, TRUE, ok); ok2 = anwcs_radec2pixelxy(anwcs, ra, dec, &x2, &y2); CuAssertIntEquals(tc, 0, ok2); printf("x,y (%g,%g) vs (%g,%g)\n", x, y, x2, y2); CuAssertDblEquals(tc, x, x2, 1e-6); CuAssertDblEquals(tc, y, y2, 1e-6); anwcs_free(anwcs); } free(tan); } astrometry.net-0.67/util/test_big_tables.c000644 000765 000024 00000003063 12651445460 021043 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "fitstable.h" #include "fitsioutils.h" #include "ioutils.h" #include "errors.h" #include "log.h" #include "cutest.h" void test_big_table(CuTest* ct) { const char* filename = "/home/boss/products/NULL/wise/trunk/fits/wise-allsky-cat-part01.fits"; fitstable_t* tab; int offset; int nelems; char* buffer; const char* racol = "RA"; const char* deccol = "DEC"; tfits_type any, dubl; fits_use_error_system(); log_init(LOG_VERB); if (!file_exists(filename)) { printf("File %s doesn't exist; skipping test.\n", filename); return; } tab = fitstable_open(filename); if (!tab) { ERROR("Failed to open FITS table \"%s\"", filename); CuFail(ct, "Failed to open FITS table"); return; } offset = 2000000; nelems = 1000; buffer = malloc(nelems * sizeof(double) * 2); CuAssertPtrNotNull(ct, buffer); //fitstable_read_nrows_data(table, offset, nelems, buffer); any = fitscolumn_any_type(); dubl = fitscolumn_double_type(); fitstable_add_read_column_struct(tab, dubl, 1, 0, any, racol, TRUE); fitstable_add_read_column_struct(tab, dubl, 1, sizeof(double), any, deccol, TRUE); if (fitstable_read_extension(tab, 1)) { ERROR("Failed to find RA and DEC columns (called \"%s\" and \"%s\" in the FITS file)", racol, deccol); CuFail(ct, "Failde to find RA,Dec\n"); } if (fitstable_read_structs(tab, buffer, 2 * sizeof(double), offset, nelems)) { CuFail(ct, "Failed to fitstable_read_structs"); return; } } astrometry.net-0.67/util/test_bl.c000644 000765 000024 00000044015 12651445460 017347 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "cutest.h" #include "an-bool.h" #include "bl.h" void test_big_list(CuTest* tc) { // Test size_t sizes and indices of bl's. // Test ptrdiff_t as -1 or index CuAssertTrue(tc, -1 == BL_NOT_FOUND); CuAssertTrue(tc, BL_NOT_FOUND < 0); CuAssertTrue(tc, sizeof(size_t) == sizeof(ptrdiff_t)); // Create a fake list so we don't have to allocate 16 GB of list to test. int blocksize = 1048576; il* big = il_new(blocksize); // that's 1<<20 ~ 1e6 elements per block // now need 1<<12 ~ 4096 blocks to overflow a 32-bit int int i; int N = 4096; bl_node* nodes = calloc(N, sizeof(bl_node)); for (i=1; ihead = nodes; big->tail = nodes + (N-1); big->N = (size_t)blocksize * (size_t)N; bl_print_structure(big); printf("N %zu\n", il_size(big)); printf("check: %s\n", (bl_check_consistency(big) ? "bad" : "ok")); int* p = il_append(big, 42); printf("appended: %i\n", *p); CuAssertIntEquals(tc, 42, *p); CuAssertTrue(tc, 4294967297L == il_size(big)); size_t index = 4294967296L; int v = il_get(big, index); CuAssertIntEquals(tc, 42, v); big->last_access = NULL; big->last_access_n = 0; v = il_get(big, index); CuAssertIntEquals(tc, 42, v); for (i=0; i [0 1 4 5] CuAssertIntEquals(tc, 4, il_size(lst)); CuAssertIntEquals(tc, 4, il_get(lst, 2)); } void test_sl_split_1(CuTest* tc) { sl* s = sl_split(NULL, "hello world this is a test", " "); CuAssertPtrNotNull(tc, s); CuAssertIntEquals(tc, 6, sl_size(s)); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 0), "hello")); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 1), "world")); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 2), "this")); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 3), "is")); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 4), "a")); CuAssertIntEquals(tc, 0, strcmp(sl_get(s, 5), "test")); sl_free2(s); } void test_sl_split_2(CuTest* tc) { int i; sl* s = sl_split(NULL, "hello world this is a test ", " "); CuAssertPtrNotNull(tc, s); printf("got: "); for (i=0; ihead, NULL); CuAssertPtrEquals(tc, x->tail, NULL); CuAssertIntEquals(tc, il_check_consistency(x), 0); CuAssertIntEquals(tc, il_check_sorted_ascending(x, 0), 0); il_free(x); } void test_il_size(CuTest* tc) { il* x = il_new(10); int i, N = 100; for (i=0; ihead, NULL); CuAssertPtrEquals(tc, bl->tail, NULL); CuAssertIntEquals(tc, il_check_consistency(bl), 0); il_free(bl); } void test_delete_2(CuTest* tc) { il* bl = il_new(2); il_push(bl, 42); il_push(bl, 43); il_push(bl, 47); il_push(bl, 49); il_remove(bl, 0); il_remove(bl, 0); il_remove(bl, 0); il_remove(bl, 0); CuAssertIntEquals(tc, il_size(bl), 0); CuAssertPtrEquals(tc, bl->head, NULL); CuAssertPtrEquals(tc, bl->tail, NULL); CuAssertIntEquals(tc, il_check_consistency(bl), 0); il_free(bl); } void test_delete_3(CuTest* tc) { il* bl; bl = il_new(2); il_push(bl, 42); il_push(bl, 43); il_push(bl, 47); il_push(bl, 49); il_remove(bl, 3); il_remove(bl, 2); il_remove(bl, 1); il_remove(bl, 0); CuAssertIntEquals(tc, il_size(bl), 0); CuAssertPtrEquals(tc, bl->head, NULL); CuAssertPtrEquals(tc, bl->tail, NULL); CuAssertIntEquals(tc, il_check_consistency(bl), 0); il_free(bl); } void test_set(CuTest* tc) { il* bl; bl = il_new(2); CuAssertIntEquals(tc, il_size(bl), 0); il_push(bl, 42); il_push(bl, 43); il_push(bl, 47); il_push(bl, 49); il_set(bl, 0, 0); il_set(bl, 1, 1); il_set(bl, 2, 2); CuAssertIntEquals(tc, il_size(bl), 4); CuAssertIntEquals(tc, 0, il_get(bl, 0)); CuAssertIntEquals(tc, 1, il_get(bl, 1)); CuAssertIntEquals(tc, 2, il_get(bl, 2)); CuAssertIntEquals(tc, il_check_consistency(bl), 0); il_free(bl); } void test_delete_4(CuTest* tc) { int i, j, N; il* bl = il_new(20); N = 100; for (i=0; i 0); } } CuAssertIntEquals(tc, il_size(bl), 0); CuAssertPtrEquals(tc, bl->head, NULL); CuAssertPtrEquals(tc, bl->tail, NULL); CuAssertIntEquals(tc, il_check_consistency(bl), 0); il_free(bl); } /******************************************************************************/ /****************************** double lists **********************************/ /******************************************************************************/ void test_dl_push(CuTest* tc) { dl* bl; bl = dl_new(2); CuAssertIntEquals(tc, il_size(bl), 0); dl_push(bl, 42.0); dl_push(bl, 43.0); dl_push(bl, 47.0); dl_push(bl, 49.0); dl_set(bl, 0, 0.0); dl_set(bl, 1, 1.0); dl_set(bl, 2, 2.0); CuAssertIntEquals(tc, il_size(bl), 4); CuAssert(tc, "dl", 0.0 == dl_get(bl, 0)); CuAssert(tc, "dl", 1.0 == dl_get(bl, 1)); CuAssert(tc, "dl", 2.0 == dl_get(bl, 2)); CuAssertIntEquals(tc, dl_check_consistency(bl), 0); dl_free(bl); } void test_bl_extend(CuTest *tc) { bl* list = bl_new(10, sizeof(int)); CuAssertIntEquals(tc, bl_size(list), 0); int *new1 = bl_extend(list); CuAssertPtrNotNull(tc, new1); CuAssertIntEquals(tc, bl_size(list), 1); *new1 = 10; int *new2 = bl_access(list, 0); CuAssertPtrEquals(tc, new2, new1); bl_free(list); } /////////// static void addsome(sl* s, const char* fmt, ...) { va_list va; va_start(va, fmt); sl_appendvf(s, fmt, va); va_end(va); } void test_sl_join(CuTest* tc) { char* s1; sl* s = sl_new(4); sl_append(s, "123"); sl_appendf(s, "%1$s%1$s", "testing"); addsome(s, "%i", 456); sl_insert(s, 1, "inserted"); sl_insertf(s, 2, "%s%s", "ins", "ertedf"); s1 = sl_join(s, ""); CuAssertStrEquals(tc, "123insertedinsertedftestingtesting456", s1); free(s1); s1 = sl_join(s, "--"); CuAssertStrEquals(tc, "123--inserted--insertedf--testingtesting--456", s1); free(s1); s1 = sl_join_reverse(s, "--"); CuAssertStrEquals(tc, "456--testingtesting--insertedf--inserted--123", s1); free(s1); sl_free2(s); } astrometry.net-0.67/util/test_bt.c000644 000765 000024 00000005004 12651445460 017352 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "bt.h" #include "cutest.h" static int compare_ints(const void* v1, const void* v2) { int i1 = *(int*)v1; int i2 = *(int*)v2; if (i1 < i2) return -1; if (i1 > i2) return 1; return 0; } static void print_int(void* v1) { int i = *(int*)v1; printf("%i ", i); } void test_bt_1(CuTest* tc) { int val; int i; bt* tree; tree = bt_new(sizeof(int), 4); printf("Empty:\n"); bt_print(tree, print_int); printf("\n"); { int vals[] = { 10, 5, 100, 10, 50, 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 200,200,200,200,200,250,150 }; for (i=0; iN; i++) { int val = *(int*)bt_access(tree, i); printf("%i ", val); // these tests depend on the values in the "vals" array above. if (i < 11) { CuAssertIntEquals(tc, 1, val); } else if (i < 12) { CuAssertIntEquals(tc, 5, val); } else if (i < 14) { CuAssertIntEquals(tc, 10, val); } else if (i < 16) { CuAssertIntEquals(tc, 50, val); } else if (i < 17) { CuAssertIntEquals(tc, 100, val); } else if (i < 18) { CuAssertIntEquals(tc, 150, val); } else if (i < 23) { CuAssertIntEquals(tc, 200, val); } else { CuAssertIntEquals(tc, 250, val); } } printf("\n"); { int vals[] = { 0, 1, 2, 9, 10, 11, 49, 50, 51, 99, 100, 101, 149, 150, 151, 199, 200, 201, 249, 250, 251 }; int doesit[]={ 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0 }; for (i=0; i #include #include #include #include "cutest.h" #include "convolve-image.h" #include "fitsioutils.h" void test_conv_1(CuTest* tc) { int W = 13; int H = 11; int i; float* img = malloc(W * H * sizeof(float)); float* kernel; float* cimg; int K0, NK; double sig = 1.0; for (i=0; i<(W*H); i++) img[i] = 0; img[(H/2)*W + (W/2)] = 1.; kernel = convolve_get_gaussian_kernel_f(sig, 5., &K0, &NK); cimg = convolve_separable_f(img, W, H, kernel, K0, NK, NULL, NULL); fits_write_float_image(cimg, W, H, "test-conv.fits"); } astrometry.net-0.67/util/test_ctmf.c000644 000765 000024 00000001546 12651445460 017705 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "ctmf.h" #include "cutest.h" void test_simple_median(CuTest* tc) { int i=0; /* should come out all zeros */ unsigned char test_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned char results[sizeof(test_data)]; memset(results,9,sizeof(test_data)); ctmf(test_data, results, 10,10, 10,10, 4 /*r*/, 1, 512*1024); for (i=0; i #include #include #include "cutest.h" #include "dimage.h" void test_dcen3x3_1(CuTest* tc) { float image[] = { 0, 1, 0, 1, 2, 1, 0, 1, 0 }; float xc, yc; int rtn; rtn = dcen3x3(image, &xc, &yc); CuAssertIntEquals(tc, 1, rtn); CuAssertDblEquals(tc, 1.0, xc, 1e-6); CuAssertDblEquals(tc, 1.0, yc, 1e-6); } void test_dcen3x3_2(CuTest* tc) { float image[] = { 1, 2, 1, 2, 3, 2, 1, 2, 1 }; float xc, yc; int rtn; rtn = dcen3x3(image, &xc, &yc); CuAssertIntEquals(tc, 1, rtn); CuAssertDblEquals(tc, 1.0, xc, 1e-6); CuAssertDblEquals(tc, 1.0, yc, 1e-6); } void test_dcen3x3_3(CuTest* tc) { float a1 = -3.; float XX = 1.1; float a2 = -3.; float YY = 1.1; float c = 40.; float image[9]; float xc, yc; int rtn; int x,y; for (y=0; y<3; y++) { for (x=0; x<3; x++) { float dx = (x - XX); float dy = (y - YY); image[y*3 + x] = a1 * dx*dx + a2 * dy*dy + c; } printf("%i %i %i\n", (int)image[y*3+0], (int)image[y*3+1], (int)image[y*3+2]); } rtn = dcen3x3(image, &xc, &yc); CuAssertIntEquals(tc, 1, rtn); CuAssertDblEquals(tc, XX, xc, 1e-6); CuAssertDblEquals(tc, YY, yc, 1e-6); printf("(%g,%g) -> (%g,%g)\n", XX, YY, xc, yc); } astrometry.net-0.67/util/test_dfind.c000644 000765 000024 00000016705 12651445460 020043 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "dimage.h" #include "cutest.h" #include "simplexy-common.h" extern int initial_max_groups; static int old_dfind(int *image, int nx, int ny, int *object) { int i, ip, j, jp, k, kp, l, ist, ind, jst, jnd, igroup, minearly, checkearly, tmpearly; int ngroups; int* mapgroup = (int *) malloc((size_t) nx * ny * sizeof(int)); int* matches = (int *) malloc((size_t) nx * ny * 9 * sizeof(int)); int* nmatches = (int *) malloc((size_t) nx * ny * sizeof(int)); if (!mapgroup || !matches || !nmatches) { fprintf(stderr, "Failed to allocate memory in dfind.c\n"); exit(-1); } for (k = 0;k < nx*ny;k++) object[k] = -1; for (k = 0;k < nx*ny;k++) mapgroup[k] = -1; for (k = 0;k < nx*ny;k++) nmatches[k] = 0; for (k = 0;k < nx*ny*9;k++) matches[k] = -1; /* find matches */ for (j = 0;j < ny;j++) { jst = j - 1; jnd = j + 1; if (jst < 0) jst = 0; if (jnd > ny - 1) jnd = ny - 1; for (i = 0;i < nx;i++) { ist = i - 1; ind = i + 1; if (ist < 0) ist = 0; if (ind > nx - 1) ind = nx - 1; k = i + j * nx; if (image[k]) { for (jp = jst;jp <= jnd;jp++) for (ip = ist;ip <= ind;ip++) { kp = ip + jp * nx; if (image[kp]) { matches[9*k + nmatches[k]] = kp; nmatches[k]++; } } } /* end if */ } } /* group pixels on matches */ igroup = 0; for (k = 0;k < nx*ny;k++) { if (image[k]) { minearly = igroup; for (l = 0;l < nmatches[k];l++) { kp = matches[9 * k + l]; checkearly = object[kp]; if (checkearly >= 0) { while (mapgroup[checkearly] != checkearly) { checkearly = mapgroup[checkearly]; } if (checkearly < minearly) minearly = checkearly; } } if (minearly == igroup) { mapgroup[igroup] = igroup; for (l = 0;l < nmatches[k];l++) { kp = matches[9 * k + l]; object[kp] = igroup; } igroup++; } else { for (l = 0;l < nmatches[k];l++) { kp = matches[9 * k + l]; checkearly = object[kp]; if (checkearly >= 0) { while (mapgroup[checkearly] != checkearly) { tmpearly = mapgroup[checkearly]; mapgroup[checkearly] = minearly; checkearly = tmpearly; } mapgroup[checkearly] = minearly; } } for (l = 0;l < nmatches[k];l++) { kp = matches[9 * k + l]; object[kp] = minearly; } } } } ngroups = 0; for (i = 0;i < nx*ny;i++) { if (mapgroup[i] >= 0) { if (mapgroup[i] == i) { mapgroup[i] = ngroups; ngroups++; } else { mapgroup[i] = mapgroup[mapgroup[i]]; } } } if (ngroups == 0) goto bail; for (i = 0;i < nx*ny;i++) if (object[i] >= 0) object[i] = mapgroup[object[i]]; for (i = 0;i < nx*ny;i++) mapgroup[i] = -1; igroup = 0; for (k = 0;k < nx*ny;k++) { if (image[k] > 0 && mapgroup[object[k]] == -1) { mapgroup[object[k]] = igroup; igroup++; } } for (i = 0;i < nx*ny;i++) if (image[i] > 0) object[i] = mapgroup[object[i]]; else object[i] = -1; bail: FREEVEC(matches); FREEVEC(nmatches); FREEVEC(mapgroup); return (1); } int compare_inputs(int *test_data, int nx, int ny) { int *test_outs_keir = calloc(nx*ny, sizeof(int)); int *test_outs_blanton = calloc(nx*ny, sizeof(int)); int *test_outs_u8 = calloc(nx*ny, sizeof(int)); int fail = 0; int ix, iy, i; unsigned char* u8img; dfind2(test_data, nx,ny,test_outs_keir, NULL); old_dfind(test_data, nx,ny,test_outs_blanton); u8img = malloc(nx * ny); for (i=0; i<(nx*ny); i++) u8img[i] = test_data[i]; dfind2_u8(u8img, nx, ny, test_outs_u8, NULL); for(iy=0; iy #include #include #include #include "cutest.h" int dsmooth(float* image, int nx, int ny, float sigma, float* smooth); void dsmooth2(float* image, int nx, int ny, float sigma, float* smooth); int compare_images(float *i1, float* i2, int nx, int ny, float eps) { int i, j; int fail = 0; for (j=0; j eps) { printf("failure -- %f != %f (delta %f)\n", v1, v2, fabsf(v1-v2)); fail++; } } } return fail; } float* random_image(int nx, int ny) { int i; float* img; img = malloc(nx * ny * sizeof(float)); for (i=0; i<(nx*ny); i++) img[i] = rand() / (float)RAND_MAX; return img; } void test_dsmooth_vs_dsmooth2(CuTest* tc) { float* img; float* img_orig; int nx, ny; float* smooth1; float* smooth2; float sigma; int bites; float eps; nx = 20; ny = 19; sigma = 2.0; eps = 1e-6; bites = nx * ny * sizeof(float); img = random_image(nx, ny); img_orig = calloc(bites, 1); memcpy(img_orig, img, bites); CuAssertIntEquals(tc, 0, compare_images(img, img_orig, nx, ny, 0.0)); smooth1 = calloc(bites, 1); smooth2 = calloc(bites, 1); dsmooth(img, nx, ny, sigma, smooth1); // test: don't change the input image CuAssertIntEquals(tc, 0, compare_images(img, img_orig, nx, ny, 0.0)); dsmooth2(img, nx, ny, sigma, smooth2); // test: don't change the input image CuAssertIntEquals(tc, 0, compare_images(img, img_orig, nx, ny, 0.0)); // test: dsmooth == dsmooth2 CuAssertIntEquals(tc, 0, compare_images(smooth1, smooth2, nx, ny, eps)); free(img); free(img_orig); free(smooth1); free(smooth2); } void test_dsmooth2_inplace(CuTest* tc) { float* img; int nx, ny; float* smooth1; float* smooth2; float sigma; int bites; float eps; nx = 20; ny = 19; sigma = 2.0; eps = 1e-6; bites = nx * ny * sizeof(float); img = random_image(nx, ny); smooth1 = calloc(bites, 1); smooth2 = calloc(bites, 1); dsmooth2(img, nx, ny, sigma, smooth2); // test: can we smooth in-place with dsmooth2? memcpy(smooth1, img, bites); CuAssertIntEquals(tc, 0, compare_images(img, smooth1, nx, ny, 0.0)); dsmooth2(smooth1, nx, ny, sigma, smooth1); CuAssertIntEquals(tc, 0, compare_images(smooth1, smooth2, nx, ny, eps)); free(img); free(smooth1); free(smooth2); } astrometry.net-0.67/util/test_endian.c000644 000765 000024 00000004037 12651445460 020210 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "an-endian.h" #include "cutest.h" // Embarassing, but apparently necessary, since I fscked it up once. void test_endian(CuTest* ct) { char test64[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; uint64_t lbe = 0x0102030405060708LL; //uint64_t lle = 0x0807060504030201LL; uint64_t* ltest = (uint64_t*)test64; uint64_t lval; char test32[4] = { 1, 2, 3, 4 }; uint32_t ibe = 0x01020304; uint32_t ile = 0x04030201; uint32_t* itest = (uint32_t*)test32; uint32_t ival; char test16[2] = { 1, 2 }; uint16_t sbe = 0x0102; uint16_t sle = 0x0201; uint16_t* stest = (uint16_t*)test16; uint16_t sval; #if IS_BIG_ENDIAN printf("Big endian\n"); ival = *itest; CuAssertIntEquals(ct, ival, ibe); #else printf("Little endian\n"); ival = *itest; CuAssertIntEquals(ct, ival, ile); #endif // 64-bit lval = *ltest; v64_hton(&lval); CuAssert(ct, "lval == lbe", lval == lbe); lval = *ltest; v64_ntoh(&lval); CuAssert(ct, "lval == lbe", lval == lbe); /* lval = *ltest; v64_htole(&ival); CuAssert(ct, "lval == lle", lval == lle); lval = *ltest; v64_letoh(&lval); CuAssert(ct, "lval == lle", lval == lle); */ // 32-bit ival = *itest; v32_hton(&ival); CuAssertIntEquals(ct, ival, ibe); ival = *itest; v32_ntoh(&ival); CuAssertIntEquals(ct, ival, ibe); ival = *itest; v32_htole(&ival); CuAssertIntEquals(ct, ival, ile); ival = *itest; v32_letoh(&ival); CuAssertIntEquals(ct, ival, ile); // 16-bit sval = *stest; v16_hton(&sval); CuAssertIntEquals(ct, sval, sbe); sval = *stest; v16_ntoh(&sval); CuAssertIntEquals(ct, sval, sbe); sval = *stest; v16_htole(&sval); CuAssertIntEquals(ct, sval, sle); /* sval = *stest; v16_letoh(&sval); CuAssertIntEquals(ct, sval, sle); */ } astrometry.net-0.67/util/test_errors.c000644 000765 000024 00000001555 12651445460 020270 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "errors.h" #include "cutest.h" typedef struct { int magic; } teststruc_t; static void errfunc(void* baton, err_t* errstate, const char* file, int line, const char* func, const char* format, va_list va) { teststruc_t* t = baton; printf("Magic: %i. %s:%i(%s): ", t->magic, file, line, func); vprintf(format, va); printf("\n"); error_stack_add_entryv(errstate, file, line, func, format, va); } static void funky() { ERROR("I'm funky."); } static void errorprone(int n) { if (n > 0) { errorprone(n-1); ERROR("errorprone(%i) failed", n); return; } funky(); } void test_err_func(CuTest* tc) { teststruc_t ts; ts.magic = 42; errors_use_function(errfunc, &ts); errorprone(4); printf("At end:\n"); errors_print_stack(stdout); } astrometry.net-0.67/util/test_fit_wcs.c000644 000765 000024 00000011117 12651445460 020405 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "cutest.h" #include "fit-wcs.h" #include "sip.h" //sip_t* wcs_shift(sip_t* wcs, double xs, double ys); void test_wcs_shift(CuTest* tc) { sip_t wcs; memset(&wcs, 0, sizeof(sip_t)); wcs.wcstan.crpix[0] = 324.867; wcs.wcstan.crpix[1] = 476.596; wcs.wcstan.crval[0] = 39.0268; wcs.wcstan.crval[1] = 65.0062; wcs.wcstan.cd[0][0] = 0.00061453; wcs.wcstan.cd[0][1] = -0.0035865; wcs.wcstan.cd[1][0] = -0.0035971; wcs.wcstan.cd[1][1] = -0.00061653; wcs.a[0][2] = 3.7161e-06; wcs.a[1][1] = 2.4926e-06; wcs.a[2][0] = -1.9189e-05; wcs.b[0][2] = -3.0798e-05; wcs.b[1][1] = 1.8929e-07; wcs.b[2][0] = 8.5835e-06; wcs.ap[0][1] = -3.7374e-05; wcs.ap[0][2] = -3.8391e-06; wcs.ap[1][0] = 3.582e-05; wcs.ap[1][1] = -2.5333e-06; wcs.ap[2][0] = 1.9578e-05; wcs.bp[0][1] = 0.00028454; wcs.bp[0][2] = 3.0996e-05; wcs.bp[1][0] = -1.0094e-05; wcs.bp[1][1] = -3.7012e-07; wcs.bp[2][0] = -8.7938e-06; wcs.wcstan.imagew = 1024; wcs.wcstan.imageh = 1024; wcs.a_order = wcs.b_order = 2; wcs.ap_order = wcs.bp_order = 2; sip_t wcs2; memset(&wcs2, 0, sizeof(sip_t)); memcpy(&(wcs2.wcstan), &(wcs.wcstan), sizeof(tan_t)); #if 0 //sip_t* newwcs = wcs_shift(&wcs, 2.52369e-05,1.38956e-05); sip_t* newwcs = wcs_shift(&wcs, 10., 10.); printf("New1:\n"); sip_print_to(newwcs, stdout); printf("\n"); #else wcs_shift(&(wcs.wcstan), 10., 10.); printf("New1:\n"); tan_print_to(&(wcs.wcstan), stdout); printf("\n"); #endif #if 0 sip_t* newwcs2 = wcs_shift(&wcs2, 10., 10.); printf("New2:\n"); sip_print_to(newwcs2, stdout); printf("\n"); #endif // 10,10: #if 0 tan_t* newtan = &(newwcs->wcstan); #else tan_t* newtan = &(wcs.wcstan); #endif CuAssertDblEquals(tc, 39.0973, newtan->crval[0], 1e-4); CuAssertDblEquals(tc, 65.0483, newtan->crval[1], 1e-4); CuAssertDblEquals(tc, 324.867, newtan->crpix[0], 1e-3); CuAssertDblEquals(tc, 476.596, newtan->crpix[1], 1e-3); CuAssertDblEquals(tc, 0.00061053, newtan->cd[0][0], 1e-8); CuAssertDblEquals(tc, -0.0035872, newtan->cd[0][1], 1e-7); CuAssertDblEquals(tc, -0.0035978, newtan->cd[1][0], 1e-7); CuAssertDblEquals(tc, -0.00061252, newtan->cd[1][1], 1e-8); /* 1,1 shift: TAN-SIP Structure: crval=(39.0338, 65.0104) crpix=(324.867, 476.596) CD = ( 0.00061413 -0.0035866 ) ( -0.0035972 -0.00061613 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 sqrt(det(CD))=13.119 [arcsec] . OK (1 test) TAN-SIP Structure: crval=(39.0268, 65.0062) crpix=(324.867, 476.596) CD = ( 0.00061453 -0.0035865 ) ( -0.0035971 -0.00061653 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 sqrt(det(CD))=13.119 [arcsec] . crval=(39.0268, 65.0062) crpix=(324.867, 476.596) CD = ( 0.00061453 -0.0035865 ) ( -0.0035971 -0.00061653 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 */ } #if 0 int main() { CuString *output = CuStringNew(); CuSuite* suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_wcs_shift); CuSuiteRun(suite); CuSuiteSummary(suite, output); CuSuiteDetails(suite, output); printf("%s\n", output->buffer); CuSuiteFree(suite); CuStringFree(output); } #endif astrometry.net-0.67/util/test_fitsbin.c000644 000765 000024 00000016632 12651445460 020414 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "fitsbin.h" #include "fitsioutils.h" #include "cutest.h" static char* get_tmpfile(int i) { static char fn[256]; sprintf(fn, "/tmp/test-fitsbin-%i", i); return fn; } void test_fitsbin_1(CuTest* ct) { fitsbin_t* in, *out; int i; int N = 6; double outdata[6]; double* indata; char* fn; fitsbin_chunk_t chunk; fn = get_tmpfile(0); out = fitsbin_open_for_writing(fn); CuAssertPtrNotNull(ct, out); CuAssertIntEquals(ct, 0, fitsbin_write_primary_header(out)); for (i=0; iitemsize); CuAssertIntEquals(ct, N * sizeof(double), ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); CuAssertIntEquals(ct, 0, memcmp(outdata, indata, sizeof(outdata))); ch = fitsbin_get_chunk(in, 1); CuAssertIntEquals(ct, sizeof(double), ch->itemsize); CuAssertIntEquals(ct, N, ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); for (i=0; iitemsize); CuAssertIntEquals(ct, N * sizeof(double), ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); CuAssertIntEquals(ct, 0, memcmp(outdata, indata, sizeof(outdata))); ch = fitsbin_get_chunk(fb, 1); CuAssertIntEquals(ct, sizeof(double), ch->itemsize); CuAssertIntEquals(ct, N, ch->nrows); indata = ch->data; CuAssertPtrNotNull(ct, indata); for (i=0; i #include #include #include #include "cutest.h" #include "qfits_header.h" #include "qfits_rw.h" #include "fitsioutils.h" #include "qfits_header.h" static void expect(CuTest* tc, const char* header, const char* key, const char* val) { char buf[4096]; qfits_header* hdr; char* str; fits_use_error_system(); memset(buf, ' ', sizeof(buf)); sprintf(buf, "SIMPLE = T / this is FITS " "%s" "END ", header); // erase the null-termination. buf[strlen(buf)-1] = ' '; hdr = qfits_header_read_hdr_string((unsigned char*)buf, sizeof(buf)); CuAssertPtrNotNull(tc, hdr); str = fits_get_long_string(hdr, key); CuAssertStrEquals(tc, val, str); free(str); qfits_header_destroy(hdr); } void test_from_paper_1(CuTest* tc) { expect(tc, "SVALUE = 'This is a long string value &' " "CONTINUE 'extending& ' " "CONTINUE ' over 3 lines.' ", "SVALUE", "This is a long string value extending over 3 lines."); } void test_from_paper_2(CuTest* tc) { expect(tc, "SVALUE = 'This is a long string value &' " "MAXVOLT = 12.5 " "CONTINUE ' over 3 lines.' ", "SVALUE", "This is a long string value &"); } void test_from_paper_page1_3(CuTest* tc) { // non-significant space characters may occur between the amp and closing quote. expect(tc, "SVALUE = 'This is a long string value & ' " "CONTINUE 'spread& ' " "CONTINUE ' over 3 lines.' ", "SVALUE", "This is a long string value spread over 3 lines."); } void test_from_paper_page1_5(CuTest* tc) { // the substring may be anywhere in columns 11-80 and may be preceded by non-significant spaces. expect(tc, "SVALUE = 'This is a long string value & ' " "CONTINUE 'spread& ' " "CONTINUE ' over 3 lines.'", "SVALUE", "This is a long string value spread over 3 lines."); } void test_from_paper_page1_5b(CuTest* tc) { // A comment string may follow the substring; if present it must be separated from the substring // by at least one space. expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'spread& ' /comment 2 " "CONTINUE ' over 3 lines.' / ", "SVALUE", "This is a long string value spread over 3 lines."); } void test_from_paper_page2_1(CuTest* tc) { // if the last non-space character in the initial value is &, then it may be a continued line, if: // --the next keyword is CONTINUE expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "VALUE2 = 42 ", "SVALUE", "This is a long string value &"); // -- bytes 9 and 10 contains spaces (no = in byte 9) expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE= 'maybe it does...' ", "SVALUE", "This is a long string value &"); expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'maybe it does...' ", "SVALUE", "This is a long string value &"); // -- bytes 11 through 80 contain a char string enclosed in single quotes, // optionally preceded and followed by spaces, optionally followed by a // comment. expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE maybe it is not in quotes... ", "SVALUE", "This is a long string value &"); expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'maybe it has a start quote but no finishing one ", "SVALUE", "This is a long string value &"); expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'maybe it has quote '' chars inside but no final quote ", "SVALUE", "This is a long string value &"); expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'with leading and trailing space ' ", "SVALUE", "This is a long string value with leading and trailing space"); expect(tc, "SVALUE = 'This is a long string value & ' / comment 1 " "CONTINUE 'with leading and trailing space ' /comment with quotes ''' ", "SVALUE", "This is a long string value with leading and trailing space"); } void test_from_paper_page2_notes(CuTest* tc) { // CONTINUE not following a regular keyword is ok. expect(tc, "SVALUE = 'This is a long string value ' / comment 1 " "CONTINUE 'this should be ignored' // comment ", "SVALUE", "This is a long string value"); } void test_write_long_string(CuTest* tc) { qfits_header* hdr; char* str; hdr = qfits_header_default(); fits_header_add_int(hdr, "VAL1", 42, "First value"); fits_header_addf_longstring(hdr, "VAL2", "Second value", "This is a very very very long string %s %i %s", "with lots of special characters like the " "following four single-quotes >>>>''''<<<< " "and lots of ampersands &&&&&&&&&&&&&&&&&& " "and the number", 42, "which of course has " "special significance. This sentence ends with" " an ampersand.&"); str = fits_get_long_string(hdr, "VAL2"); CuAssertStrEquals(tc, "This is a very very very long string with lots of " "special characters like the following four single-quotes " ">>>>''''<<<< and lots of ampersands &&&&&&&&&&&&&&&&&& " "and the number 42 which of course has special " "significance. This sentence ends with an ampersand.&", str); free(str); qfits_header_destroy(hdr); } astrometry.net-0.67/util/test_fitstable.c000644 000765 000024 00000124011 12651445460 020722 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "fitstable.h" #include "fitsioutils.h" #include "permutedsort.h" #include "an-endian.h" #include "qfits_header.h" #include "cutest.h" static char* get_tmpfile(int i) { static char fn[256]; sprintf(fn, "/tmp/test-fitstable-%i", i); return fn; } static void print_hex(const void* v, int N) { int i; for (i=0; irows, 1), bl_datasize(t1->rows)); printf("\n"); rtn = fitstable_switch_to_reading(t1); CuAssertIntEquals(ct, rtn, 0); d1 = fitstable_read_column(t1, name1, dubl); d2 = fitstable_read_column(t1, name2, dubl); d3 = fitstable_read_column(t1, name3, dubl); CuAssertPtrNotNull(ct, d1); CuAssertPtrNotNull(ct, d2); CuAssertPtrNotNull(ct, d3); for (i=0; i #include #include #include "os-features.h" #include "cutest.h" #include "starutil.h" #include "healpix.h" #include "bl.h" static double square(double x) { return x*x; } void test_side_length(CuTest* ct) { double hp; double len = healpix_side_length_arcmin(1); CuAssertDblEquals(ct, 3517.9, len, 0.1); hp = healpix_nside_for_side_length_arcmin(len); CuAssertDblEquals(ct, 1.0, hp, 0.001); len = healpix_side_length_arcmin(2); CuAssertDblEquals(ct, 1758.969, len, 0.001); hp = healpix_nside_for_side_length_arcmin(len); CuAssertDblEquals(ct, 2.0, hp, 0.001); } static void add_plot_xyz_point(double* xyz) { double ra,dec; xyzarr2radecdeg(xyz, &ra, &dec); fprintf(stderr, "xp.append(%g)\n", ra); fprintf(stderr, "yp.append(%g)\n", dec); } static void add_plot_point(int hp, int nside, double dx, double dy) { double xyz[3]; healpix_to_xyzarr(hp, nside, dx, dy, xyz); add_plot_xyz_point(xyz); } void plot_point(int hp, int nside, double dx, double dy, char* style) { fprintf(stderr, "xp=[]\n"); fprintf(stderr, "yp=[]\n"); add_plot_point(hp, nside, dx, dy); fprintf(stderr, "plot(xp, yp, '%s')\n", style); } void plot_xyz_point(double* xyz, char* style) { fprintf(stderr, "xp=[]\n"); fprintf(stderr, "yp=[]\n"); add_plot_xyz_point(xyz); fprintf(stderr, "plot(xp, yp, '%s')\n", style); } static void plot_hp_boundary(int hp, int nside, double start, double step, char* style) { double dx, dy; fprintf(stderr, "xp=[]\n"); fprintf(stderr, "yp=[]\n"); dy = 0.0; for (dx=start; dx<=1.0; dx+=step) add_plot_point(hp, nside, dx, dy); dx = 1.0; for (dy=start; dy<=1.0; dy+=step) add_plot_point(hp, nside, dx, dy); dy = 1.0; for (dx=1.0-start; dx>=0.0; dx-=step) add_plot_point(hp, nside, dx, dy); dx = 0.0; for (dy=1.0-start; dy>=0.0; dy-=step) add_plot_point(hp, nside, dx, dy); dy = 0.0; add_plot_point(hp, nside, dx, dy); fprintf(stderr, "xp,yp = wrapxy(xp,yp)\nplot(xp, yp, '%s')\n", style); } static void hpmap(int nside, const char* fn) { #if 0 int nhp; #endif double xyz[3]; double range; int hps[9]; int i; int hp; double dx, dy; // pick a point on the edge. //hp = 8; hp = 9; dx = 0.95; dy = 0.0; range = 0.1; /* hp = 6; dx = 0.05; dy = 0.95; range = 0.1; */ healpix_to_xyzarr(hp, nside, dx, dy, xyz); for (i=0; i<12*nside*nside; i++) { plot_hp_boundary(i, nside, 0.005, 0.01, "b-"); } #if 0 nhp = healpix_get_neighbours_within_range(xyz, range, hps, nside); assert(nhp >= 1); assert(nhp <= 9); #else (void)healpix_get_neighbours_within_range(xyz, range, hps, nside); #endif /* for (i=0; i 1.:\n" " if xx < 180:\n" " xx += 360\n" " else:\n" " xx -= 360\n" " outx.append(xx)\n" " outy.append(yy)\n" " lastx = xx\n" " lasty = yy\n" " return (array(outx),array(outy))\n" ); hpmap(1, "hp.png"); hpmap(2, "hp2.png"); } int tst_xyztohpf(CuTest* ct, int hp, int nside, double dx, double dy) { double x,y,z; double outdx, outdy; int outhp; double outx,outy,outz; double dist; healpix_to_xyz(hp, nside, dx, dy, &x, &y, &z); outhp = xyztohealpixf(x, y, z, nside, &outdx, &outdy); healpix_to_xyz(outhp, nside, outdx, outdy, &outx, &outy, &outz); dist = sqrt(MAX(0, square(x-outx) + square(y-outy) + square(z-outz))); printf("true/computed:\n" "hp: %i / %i\n" "dx: %.20g / %.20g\n" "dy: %.20g / %.20g\n" "x: %g / %g\n" "y: %g / %g\n" "z: %g / %g\n" "dist: %g\n\n", hp, outhp, dx, outdx, dy, outdy, x, outx, y, outy, z, outz, dist); if (dist > 1e-6) { double a, b; double outa, outb; a = xy2ra(x,y) / (2.0 * M_PI); b = z2dec(z) / (M_PI); outa = xy2ra(outx, outy) / (2.0 * M_PI); outb = z2dec(outz) / (M_PI); fprintf(stderr, "plot([%g, %g],[%g, %g],'r.-')\n", a, outa, b, outb); fprintf(stderr, "text(%g, %g, \"(%g,%g)\")\n", a, b, dx, dy); } CuAssertIntEquals(ct, 1, (dist < 1e-6)?1:0); return (dist > 1e-6); } void tEst_xyztohpf(CuTest* ct) { double dx, dy; int hp; int nside; double step = 0.1; double a, b; nside = 1; fprintf(stderr, "%s", "from pylab import plot,text,savefig,clf\n"); fprintf(stderr, "clf()\n"); /* Plot the grid of healpixes with dx,dy=step steps. */ step = 0.25; //for (hp=0; hp<12*nside*nside; hp++) { for (hp=0; hp<1*nside*nside; hp++) { double x,y,z; for (dx=0.0; dx<=1.05; dx+=step) { fprintf(stderr, "xp=[]\n"); fprintf(stderr, "yp=[]\n"); for (dy=0.0; dy<=1.05; dy+=step) { healpix_to_xyz(hp, nside, dx, dy, &x, &y, &z); a = xy2ra(x,y) / (2.0 * M_PI); b = z2dec(z) / (M_PI); fprintf(stderr, "xp.append(%g)\n", a); fprintf(stderr, "yp.append(%g)\n", b); } fprintf(stderr, "plot(xp, yp, 'k-')\n"); } for (dy=0.0; dy<=1.05; dy+=step) { fprintf(stderr, "xp=[]\n"); fprintf(stderr, "yp=[]\n"); for (dx=0.0; dx<=1.0; dx+=step) { healpix_to_xyz(hp, nside, dx, dy, &x, &y, &z); a = xy2ra(x,y) / (2.0 * M_PI); b = z2dec(z) / (M_PI); fprintf(stderr, "xp.append(%g)\n", a); fprintf(stderr, "yp.append(%g)\n", b); } fprintf(stderr, "plot(xp, yp, 'k-')\n"); } } step = 0.5; /* Plot places where the conversion screws up. */ for (hp=0; hp<12*nside*nside; hp++) { for (dx=0.0; dx<=1.01; dx+=step) { for (dy=0.0; dy<=1.01; dy+=step) { tst_xyztohpf(ct, hp, nside, dx, dy); } } } fprintf(stderr, "savefig('plot.png')\n"); } static void tst_neighbours(CuTest* ct, int pix, int* true_neigh, int true_nn, int Nside) { int neigh[8]; int nn; int i; for (i=0; i<8; i++) neigh[i] = -1; nn = healpix_get_neighbours(pix, neigh, Nside); /* printf("true(%i) : [ ", pix); for (i=0; i 2.0 * M_PI) ra -= 2.0 * M_PI; // find its healpix. hp = radectohealpix(ra, dec, Nside); // find its neighbourhood. nn = healpix_get_neighbours(hp, neigh, Nside); fprintf(stderr, " N%i [ label=\"%i\", pos=\"%g,%g!\" ];\n", hp, hp, scale * ra/M_PI, scale * z); for (k=0; k= 0.0); CuAssert(ct, "dx", dx <= 1.0); CuAssert(ct, "dy", dy >= 0.0); CuAssert(ct, "dy", dy <= 1.0); healpixl_to_radecdeg(hp, Nside, dx, dy, &ra2, &dec2); CuAssertDblEquals(ct, ra1, ra2, arcsec2deg(1e-10)); CuAssertDblEquals(ct, dec1, dec2, arcsec2deg(1e-10)); printf("RA,Dec difference: %g, %g arcsec\n", deg2arcsec(ra2-ra1), deg2arcsec(dec2-dec1)); } void test_distortion_at_pole(CuTest* ct) { // not really a test of the code, more of healpix itself... double ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4; int Nside = 2097152; int64_t hp; double d1, d2, d3, d4, d5, d6; double testras [] = { 0.0, 45.0, 0.0, 0.0 }; double testdecs[] = { 90.0, 50.0, 40.0, 0.0 }; char* testnames[] = { "north pole", "mid-polar", "mid-equatorial", "equator" }; double ra, dec; int i; for (i=0; ibuffer); /* print_healpix_grid(1); print_healpix_grid(2); print_healpix_grid(3); print_healpix_grid(4); print_healpix_grid(5); */ //print_test_healpix_output(); /* int rastep, decstep; int Nra = 100; int Ndec = 100; double ra, dec; int healpix; printf("radechealpix=zeros(%i,3);\n", Nra*Ndec); for (rastep=0; rastep #include #include #include #include "cutest.h" #include "ioutils.h" #include "fileutils.h" #include "log.h" #include "tic.h" #include "md5.h" void test_run_command_1(CuTest* tc) { int rtn; sl* outlines = NULL; sl* errlines = NULL; char* cmd; char* str2; char txt[10240]; log_init(3); /* str1 = "test test\ntest"; asprintf_safe(&cmd, "echo '%s'", str1); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, "\n"); printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, TRUE, streq(str1, str2)); sl_free2(outlines); sl_free2(errlines); free(str2); printf("\n\npart 2\n\n"); cmd = "(for ((i=0; i<1024; i++)); do /bin/echo -n \"X\"; done) | cat -"; rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, "\n"); printf("got string: \"%s\"\n", str2); sl_free2(outlines); sl_free2(errlines); free(str2); */ // test 'buffer full with no newline' branch // (single read) memset(txt, 'X', 1024); txt[1024] = '\0'; asprintf_safe(&cmd, "printf %%s '%s'", txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, "\n"); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 1, sl_size(outlines)); CuAssertIntEquals(tc, 1024, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); // test 'buffer full with no newline' branch // (two reads) memset(txt, 'X', 512); txt[512] = '\0'; asprintf_safe(&cmd, "printf %%s '%s'; printf %%s '%s'", txt, txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, "\n"); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 1, sl_size(outlines)); CuAssertIntEquals(tc, 1024, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); // test 'buffer full with no newline' branch // and 'flushing the last line' // (three reads, not exactly aligned) memset(txt, 'X', 500); txt[500] = '\0'; // oops, this is not portable /bin/sh! //asprintf_safe(&cmd, "for ((i=0; i<3; i++)); do printf %%s '%s'; done", txt); asprintf_safe(&cmd, "for x in 1 2 3; do printf %%s '%s'; done", txt); printf("Command: \"%s\"\n", cmd); rtn = run_command_get_outputs(cmd, &outlines, &errlines); //rtn = run_command_get_outputs(cmd, NULL, NULL); //printf("return value: %i\n", rtn); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, ""); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 2, sl_size(outlines)); CuAssertIntEquals(tc, 1500, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); memset(txt, 'X', 500); txt[499] = '\n'; txt[500] = '\0'; //asprintf_safe(&cmd, "for ((i=0; i<3; i++)); do printf %%s '%s'; done", txt); asprintf_safe(&cmd, "for x in 1 2 3; do printf %%s '%s'; done", txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, "\n"); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 3, sl_size(outlines)); CuAssertIntEquals(tc, 1499, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); // single line ending with newline. memset(txt, 'X', 1024); txt[1023] = '\n'; txt[1024] = '\0'; asprintf_safe(&cmd, "printf %%s '%s'", txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, ""); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 1, sl_size(outlines)); CuAssertIntEquals(tc, 1023, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); // multiple lines -- normal // written all at once -- hits 'moved N to start of block' branch. memset(txt, 'X', 2000); txt[200] = '\n'; txt[400] = '\n'; txt[600] = '\n'; txt[1000] = '\n'; txt[1500] = '\n'; txt[1800] = '\n'; txt[1999] = '\n'; txt[2000] = '\0'; asprintf_safe(&cmd, "printf %%s '%s'", txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, ""); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 7, sl_size(outlines)); CuAssertIntEquals(tc, 1993, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); // multiple lines -- normal // written all at once -- hits 'moved N to start of block' branch. memset(txt, 'X', 200); txt[200] = '\n'; txt[201] = '\0'; //asprintf_safe(&cmd, "for ((i=0; i<10; i++)); do printf %%s '%s'; sleep 0.1; done", txt); asprintf_safe(&cmd, "for x in 1 2 3 4 5 6 7 8 9 10; do printf %%s '%s'; sleep 0.1; done", txt); rtn = run_command_get_outputs(cmd, &outlines, &errlines); CuAssertIntEquals(tc, 0, rtn); str2 = sl_join(outlines, ""); //printf("got string: \"%s\"\n", str2); CuAssertIntEquals(tc, 10, sl_size(outlines)); CuAssertIntEquals(tc, 10*200, strlen(str2)); sl_free2(outlines); sl_free2(errlines); free(str2); } void test_run_command(CuTest* tc) { int rtn; sl* outlines = NULL; sl* errlines = NULL; char* cmd; FILE* fid; char* tmpfn; int N; int i; int trial; log_init(3); tmpfn = create_temp_file("test_run_command", "/tmp"); CuAssertPtrNotNull(tc, tmpfn); for (trial=0; trial<4; trial++) { double t0; printf("test_ioutils:test_run_command() trial %i\n", trial); fid = fopen(tmpfn, "wb"); CuAssertPtrNotNull(tc, fid); N = 102400; for (i=0; i&2; sleep 0.2", tmpfn); } t0 = timenow(); rtn = run_command_get_outputs(cmd, &outlines, &errlines); printf("That took %g sec\n", timenow() - t0); CuAssertIntEquals(tc, 0, rtn); free(cmd); sl_free2(outlines); sl_free2(errlines); } } void test_split_long_string(CuTest* tc) { sl* lst; lst = split_long_string("", 60, 80, NULL); CuAssertPtrNotNull(tc, lst); CuAssertIntEquals(tc, 0, sl_size(lst)); sl_free2(lst); lst = split_long_string("really long line that will get broken into" " several pieces", 6, 10, NULL); CuAssertPtrNotNull(tc, lst); //printf("%s\n", sl_join(lst, "<<\n")); CuAssertIntEquals(tc, 7, sl_size(lst)); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 0), "really")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 1), "long line")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 2), "that will")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 3), "get broken")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 4), "into")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 5), "several")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 6), "pieces")); sl_free2(lst); // Arguable whether this is correct handling of multiple spaces... lst = split_long_string("extremely long line with ridiculously long words necessitating hyphenationizing (?!)", 6, 10, NULL); CuAssertPtrNotNull(tc, lst); //printf("%s\n", sl_join(lst, "<<\n")); CuAssertIntEquals(tc, 12, sl_size(lst)); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 0), "extre-")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 1), "mely long")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 2), "line")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 3), "with")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 4), "ridiculou-")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 5), "sly long")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 6), "words")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 7), "necessita-")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 8), "ting")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 9), "hyphenati-")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 10), "onizing")); CuAssertIntEquals(tc, 1, streq(sl_get(lst, 11), "(?!)")); sl_free2(lst); } void test_streq_1(CuTest* tc) { CuAssertIntEquals(tc, 1, streq(NULL, NULL)); CuAssertIntEquals(tc, 0, streq(NULL, "")); CuAssertIntEquals(tc, 0, streq("", NULL)); CuAssertIntEquals(tc, 1, streq("", "")); CuAssertIntEquals(tc, 0, streq("", "a")); CuAssertIntEquals(tc, 1, streq("a", "a")); CuAssertIntEquals(tc, 1, streq("yes", "yes")); } static void assertCanon(CuTest* tc, char* in, char* out) { char* canon = an_canonicalize_file_name(in); CuAssertPtrNotNull(tc, canon); if (strcmp(canon, out)) printf("Input \"%s\", expected \"%s\", got \"%s\"\n", in, out, canon); CuAssertIntEquals(tc, 0, strcmp(canon, out)); free(canon); } void test_canon_1(CuTest* tc) { assertCanon(tc, "//path/to/a/.//./file/with/../junk", "/path/to/a/file/junk"); } void test_canon_2(CuTest* tc) { assertCanon(tc, "/", "/"); } void test_canon_2b(CuTest* tc) { assertCanon(tc, ".", "."); } void test_canon_2c(CuTest* tc) { assertCanon(tc, "..", ".."); } void test_canon_3(CuTest* tc) { assertCanon(tc, "x/../y", "y"); } void test_canon_3b(CuTest* tc) { assertCanon(tc, "x/../y/../z/a/b/c/d/../../../e", "z/a/e"); } void test_canon_4(CuTest* tc) { // HACK... this probably ISN'T what it should do. //assertCanon(tc, "../y", "y"); assertCanon(tc, "../y", "../y"); } void test_canon_4b(CuTest* tc) { assertCanon(tc, "../../../y", "../../../y"); } void test_canon_4c(CuTest* tc) { assertCanon(tc, "../../../../y", "../../../../y"); } void test_canon_5(CuTest* tc) { assertCanon(tc, "/../..//x", "/x"); } astrometry.net-0.67/util/test_jpl.c000644 000765 000024 00000004177 12651445460 017544 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "cutest.h" #include "jpl.h" #include "bl.h" #include "starutil.h" void test_jpl_1(CuTest* tc) { bl* lst; orbital_elements_t* orb; char* s = "******************************************************************************* $$SOE 2451544.500000000 = A.D. 2000-Jan-01 00:00:00.0000 (CT) EC= 5.572196627498378E-02 QR= 9.048090920148466E+00 IN= 2.485240160067824E+00 OM= 1.136428218226837E+02 W = 3.360118627136669E+02 Tp= 2452738.076490710024 N = 3.323384124604674E-02 MA= 3.203328683927277E+02 TA= 3.160307045699099E+02 A = 9.582019910444478E+00 AD= 1.011594890074049E+01 PR= 1.083233193944510E+04 2451551.500000000 = A.D. 2000-Jan-08 00:00:00.0000 (CT) EC= 5.573960302454895E-02 QR= 9.047888350190947E+00 IN= 2.485243118146288E+00 OM= 1.136426544365385E+02 W = 3.360396713123293E+02 Tp= 2452738.795322154649 N = 3.323402622894304E-02 MA= 3.205413961220120E+02 TA= 3.162559512605895E+02 A = 9.581984354286307E+00 AD= 1.011608035838167E+01 PR= 1.083227164593380E+04 2451558.500000000 = A.D. 2000-Jan-15 00:00:00.0000 (CT) EC= 5.575752058883327E-02 QR= 9.047688680528223E+00 IN= 2.485246705983557E+00 OM= 1.136424539461901E+02 W = 3.360670860115268E+02 Tp= 2452739.502766492777 N = 3.323418041469598E-02 MA= 3.207503409881191E+02 TA= 3.164817069736243E+02 A = 9.581954717998279E+00 AD= 1.011622075546834E+01 PR= 1.083222139098727E+04 "; lst = jpl_parse_orbital_elements(s, NULL); CuAssertPtrNotNull(tc, lst); CuAssertIntEquals(tc, 3, bl_size(lst)); orb = bl_access(lst, 0); CuAssertDblEquals(tc, 2451544.500000000, mjdtojd(orb->mjd), 1e-6); CuAssertDblEquals(tc, 5.572196627498378E-02, orb->e, fabs(orb->e)*1e-10); /* EC= 5.572196627498378E-02 QR= 9.048090920148466E+00 IN= 2.485240160067824E+00 OM= 1.136428218226837E+02 W = 3.360118627136669E+02 Tp= 2452738.076490710024 N = 3.323384124604674E-02 MA= 3.203328683927277E+02 TA= 3.160307045699099E+02 A = 9.582019910444478E+00 AD= 1.011594890074049E+01 PR= 1.083233193944510E+04 */ } astrometry.net-0.67/util/test_log.c000644 000765 000024 00000005343 12651445460 017534 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "log.h" #include #include #include #include #include "cutest.h" #include "bl.h" #include "ioutils.h" #define STRING1A "I'm thread 1 -- you should see this message." #define STRING1B "I'm thread 1 -- you should NOT see this message." #define STRING2A "I'm thread 2 -- you should see this message." #define STRING2B "I'm thread 2 -- you should see this message B." void* thread1(void* v) { FILE* flog = v; logmsg("I'm thread 1.\n"); log_set_level(LOG_MSG); log_to(flog); logmsg("%s\n", STRING1A); sleep(1); logverb("%s\n", STRING1B); return NULL; } void* thread2(void* v) { FILE* flog = v; logmsg("I'm thread 2.\n"); log_set_level(LOG_VERB); log_to(flog); logmsg("%s\n", STRING2A); logverb("%s\n", STRING2B); return NULL; } typedef struct { int magic; } teststruc_t; static void logfunc(void* baton, enum log_level loglvl, const char* file, int line, const char* func, const char* format, va_list va) { teststruc_t* t = baton; printf("Magic: %i. %s:%i(%s): level %i ", t->magic, file, line, func, loglvl); vprintf(format, va); } void test_log_ts(CuTest* tc) { pthread_t t1, t2; FILE *f1, *f2; char *fn1, *fn2; sl* lst; log_init(LOG_VERB); logmsg("Logging initialized.\n"); log_set_thread_specific(); logmsg("Logging set thread specific.\n"); fn1 = create_temp_file("log", "/tmp"); fn2 = create_temp_file("log", "/tmp"); logmsg("File 1 is %s\n", fn1); logmsg("File 2 is %s\n", fn2); f1 = fopen(fn1, "w"); f2 = fopen(fn2, "w"); CuAssertIntEquals(tc, 0, pthread_create(&t1, NULL, thread1, f1)); CuAssertIntEquals(tc, 0, pthread_create(&t2, NULL, thread2, f2)); CuAssertIntEquals(tc, 0, pthread_join(t1, NULL)); CuAssertIntEquals(tc, 0, pthread_join(t2, NULL)); fclose(f1); fclose(f2); lst = file_get_lines(fn1, FALSE); CuAssertIntEquals(tc, 0, strcmp(sl_get(lst, 0), STRING1A)); CuAssertIntEquals(tc, 1, sl_size(lst)); sl_free2(lst); lst = file_get_lines(fn2, FALSE); CuAssertIntEquals(tc, 0, strcmp(sl_get(lst, 0), STRING2A)); CuAssertIntEquals(tc, 0, strcmp(sl_get(lst, 1), STRING2B)); CuAssertIntEquals(tc, 2, sl_size(lst)); sl_free2(lst); unlink(fn1); unlink(fn2); free(fn1); free(fn2); } void test_log_func(CuTest* tc) { log_init(LOG_VERB); teststruc_t ts; ts.magic = 42; log_use_function(logfunc, &ts); log_to(NULL); logmsg("Testing 1 2 3\n"); logdebug("Testing 1 2 3\n"); log_use_function(NULL, NULL); log_to(stdout); logmsg("Testing 1 2 3 4\n"); logdebug("Testing 1 2 3 4\n"); } astrometry.net-0.67/util/test_multiindex.c000644 000765 000024 00000002536 12651445460 021136 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "cutest.h" #include "multiindex.h" #include "bl.h" /** fitscopy ~/DATA/tycho2-cut.fits"[RA<10 && DEC > 0 && DEC < 10]" t.fits build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag build-index -1 t10.index -o t11.index -P 11 -E -M -v -S mag build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag fitsgetext -i t10.index -o t10.skdt -e 0 -e 7 -e 8 -e 9 -e 10 -e 11 -e 12 -e 13 fitsgetext -i t10.index -o t10.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 fitsgetext -i t11.index -o t11.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 fitsgetext -i t12.index -o t12.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 */ void test_multiindex(CuTest* ct) { sl* fns; multiindex_t* mi; int i; fns = sl_new(4); sl_append(fns, "t10.ind"); sl_append(fns, "t11.ind"); sl_append(fns, "t12.ind"); mi = multiindex_open("t10.skdt", fns, 0); printf("Got %i indices\n", multiindex_n(mi)); for (i=0; iindexname, index_nquads(ind), index_nstars(ind), ind->index_scale_lower/60., ind->index_scale_upper/60.); } multiindex_free(mi); sl_free2(fns); } astrometry.net-0.67/util/test_pyfitsutils.py000644 000765 000024 00000003712 12651445460 021556 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ from fits import * import numpy as np import unittest class TestSlices(unittest.TestCase): def setUp(self): T = tabledata() T.x1 = np.arange(10).astype(int) T.x2 = np.arange(10).astype(float) T.x3 = [i for i in range(10)] T.x4 = tuple([i for i in range(10)]) self.assertEqual(len(T), 10) T.about() self.T = T def testCut(self): T1 = self.T.copy() T1.about() T1.cut(np.arange(10) < 4) T1.about() self.assertEqual(len(T1), 4) def testIter(self): for i in range(len(self.T)): self.T[i].about() for t in self.T: t.about() def testNumpySlicing(self): A = np.arange(10) print A[:3] print A[3:6] print A[7:] print A[1:7:2] A = list(A) print A[:3] print A[3:6] print A[7:] print A[1:7:2] A = np.arange(10) A = A[:,np.newaxis].repeat(2, axis=1) print A[:3] print A[3:6] print A[7:] print A[1:7:2] def testSlice2(self): T1 = self.T[self.T.x1 < 4] self.assertEqual(len(T1), 4) T1.about() self.assertTrue(all(T1.x1 == np.array([0,1,2,3]))) self.assertEqual(T1.x3, [0,1,2,3]) T1 = self.T[np.flatnonzero(self.T.x1 < 4)] self.assertEqual(len(T1), 4) T1.about() self.assertTrue(all(T1.x1 == np.array([0,1,2,3]))) self.assertEqual(T1.x3, [0,1,2,3]) def testSlice1(self): T1 = self.T[:3] self.assertEqual(len(T1), 3) T1.about() self.assertTrue(all(T1.x1 == np.arange(3))) self.assertTrue(all(T1.x2 == np.arange(3).astype(float))) self.assertEqual(T1.x3, [0,1,2]) self.assertEqual(T1.x4, (0,1,2)) T2 = self.T[3:6] self.assertEqual(len(T2), 3) T2.about() self.assertEqual(T2.x3, [3,4,5]) self.assertEqual(T2.x4, (3,4,5)) T3 = self.T[7:] self.assertEqual(len(T3), 3) T3.about() self.assertEqual(T3.x3, [7,8,9]) T4 = self.T[1:7:2] self.assertEqual(len(T4), 3) T4.about() self.assertEqual(T4.x3, [1,3,5]) if __name__ == '__main__': unittest.main() astrometry.net-0.67/util/test_qsort_r.c000644 000765 000024 00000002017 12651445460 020437 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "cutest.h" #include "os-features.h" char* true_baton_val = "MYBATON"; CuTest* g_tc = NULL; static int QSORT_COMPARISON_FUNCTION(compints, void* token, const void* v1, const void* v2) { const int* i1 = v1; const int* i2 = v2; CuAssertPtrEquals(g_tc, true_baton_val, token); if (*i1 < *i2) return -1; if (*i1 > *i2) return 1; return 0; } void test_qsort_r(CuTest* tc) { int array[] = { 4, 17, 88, 34, 12, 12, 17 }; int N = sizeof(array)/sizeof(int); void* token = true_baton_val; g_tc = tc; QSORT_R(array, N, sizeof(int), token, compints); CuAssertIntEquals(tc, 4, array[0]); CuAssertIntEquals(tc, 12, array[1]); CuAssertIntEquals(tc, 12, array[2]); CuAssertIntEquals(tc, 17, array[3]); CuAssertIntEquals(tc, 17, array[4]); CuAssertIntEquals(tc, 34, array[5]); CuAssertIntEquals(tc, 88, array[6]); } astrometry.net-0.67/util/test_quadfile.c000644 000765 000024 00000002765 12651445460 020552 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "fitsbin.h" #include "fitsioutils.h" #include "quadfile.h" #include "errors.h" #include "cutest.h" void test_quadfile_inmemory_big(CuTest* ct) { int i, d; int D = 4; int N = 1000000000; unsigned int quad[4]; unsigned int equad[4]; quadfile_t* qf; qf = quadfile_open_in_memory(); CuAssertPtrNotNull(ct, qf); CuAssertIntEquals(ct, 0, quadfile_write_header(qf)); for (i=0; iantype, AN_FILETYPE_RDLS)); CuAssertPtrNotNull(ct, rdlist_read_field(in, &infld)); CuAssertIntEquals(ct, N, infld.N); for (i=0; iN); for (i=0; ira[i]); CuAssertIntEquals(ct, fld.dec[i], infld2->dec[i]); } rd_free(infld2); CuAssertIntEquals(ct, 0, rdlist_close(in)); in = NULL; free(fn); } void test_read_write(CuTest* ct) { rdlist_t *in, *out; char* fn = get_tmpfile(0); rd_t fld; rd_t infld; out = rdlist_open_for_writing(fn); CuAssertPtrNotNull(ct, out); qfits_header* hdr = rdlist_get_primary_header(out); CuAssertPtrNotNull(ct, hdr); fits_header_add_int(hdr, "KEYA", 42, "Comment"); CuAssertIntEquals(ct, 0, rdlist_write_primary_header(out)); rdlist_set_raname(out, "RRR"); rdlist_set_decname(out, "DDD"); rdlist_set_ratype(out, TFITS_BIN_TYPE_E); rdlist_set_raunits(out, "deg"); rdlist_set_decunits(out, "deg"); hdr = rdlist_get_header(out); CuAssertPtrNotNull(ct, hdr); fits_header_add_int(hdr, "KEYB", 43, "CommentB"); CuAssertIntEquals(ct, 0, rdlist_write_header(out)); int N = 10; double ra[N]; double dec[N]; int i; for (i=0; i #include #include #include "cutest.h" #include "dimage.h" #include "simplexy.h" #include "log.h" /** > python -c "from pylab import *; I=imread('test_dcen3x3_1.pgm'); print ','.join(['%i'%x for x in I.ravel()]); print I.shape" */ void test_simplexy_1(CuTest* tc) { float image[] = { 36,40,47,53,30,29,31,36,32,29,26,22,11,11,11,35,32,27,32,51,50,46,41,36,32,31,26,11,11,11,15,15,24,43,49,51,47,41,37,37,31,17,11,11,11,21,28,19,47,51,54,68,81,82,64,43,41,30,27,21,11,16,47,80,120,138,175,199,188,143,81,43,35,31,27,17,48,114,152,159,163,182,192,174,135,81,41,31,28,24,14,44,108,142,127,108,98,90,70,56,42,30,23,20,16,13,22,47,56,67,48,44,42,29,29,26,11,16,12,12,36,40,34,30,30,24,31,34,27,27,19,11,14,14,11,53,51,36,31,24,19,20,11,11,11,11,11,14,16,14,55,50,37,34,21,28,28,19,17,14,11,16,11,12,14 }; int H = 11; int W = 15; int rtn; float x,y; int N; int* objects; float sigma = 20; int i; log_init(LOG_ALL); for (i=0;; i++) { float sigma = 10.0; float G = exp(-((float)(i*i) / (2.0*sigma*sigma))); debug("Nsigma %g: G=%g\n", (float)i/sigma, G); if (G == 0) break; } CuAssertIntEquals(tc, W*H, sizeof(image)/sizeof(float)); objects = malloc(W*H*sizeof(int)); for (i=0; i #include #include #include #include "cutest.h" #include "sip.h" #include "sip_qfits.h" #include "sip-utils.h" static const char* wcsfile = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN-SIP' / TAN (gnomic) projection + SIP distortions CTYPE2 = 'DEC--TAN-SIP' / TAN (gnomic) projection + SIP distortions WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 11.5705189886 / RA of reference point CRVAL2 = 42.1541506988 / DEC of reference point CRPIX1 = 2048 / X reference pixel CRPIX2 = 1024 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = 7.78009863032E-06 / Transformation matrix CD1_2 = -1.0992330198E-05 / no comment CD2_1 = -1.14560595236E-05 / no comment CD2_2 = -8.63206896621E-06 / no comment IMAGEW = 4096 / Image width, in pixels. IMAGEH = 2048 / Image height, in pixels. A_ORDER = 4 / Polynomial order, axis 1 A_0_2 = 2.16626045427E-06 / no comment A_0_3 = 8.43135826028E-12 / no comment A_0_4 = 1.27723787676E-14 / no comment A_1_1 = -5.20376831571E-06 / no comment A_1_2 = -5.2962390408E-10 / no comment A_1_3 = -1.75526102672E-14 / no comment A_2_0 = 8.5443232652E-06 / no comment A_2_1 = -4.30755974621E-11 / no comment A_2_2 = 3.82502701466E-14 / no comment A_3_0 = -4.7567645697E-10 / no comment A_3_1 = 6.11248660507E-15 / no comment A_4_0 = 2.60134165707E-14 / no comment B_ORDER = 4 / Polynomial order, axis 2 B_0_2 = -7.23056869993E-06 / no comment B_0_3 = -4.21356193854E-10 / no comment B_0_4 = 2.93970053558E-15 / no comment B_1_1 = 6.17195785471E-06 / no comment B_1_2 = -6.69823252817E-11 / no comment B_1_3 = 1.83536133989E-14 / no comment B_2_0 = -1.74786318896E-06 / no comment B_2_1 = -5.15555867797E-10 / no comment B_2_2 = -2.78970082125E-14 / no comment B_3_0 = 8.45057919961E-11 / no comment B_3_1 = 2.40980945623E-16 / no comment B_4_0 = -1.72877462519E-14 / no comment AP_ORDER= 0 / Inv polynomial order, axis 1 BP_ORDER= 0 / Inv polynomial order, axis 2 END "; void test_compute_inverse(CuTest* tc) { double x,y, dx, dy; sip_t* wcs = sip_from_string(wcsfile, 0, NULL); CuAssertPtrNotNull(tc, wcs); printf("Read:\n"); sip_print_to(wcs, stdout); CuAssertIntEquals(tc, 4, wcs->a_order); CuAssertIntEquals(tc, 4, wcs->b_order); CuAssertIntEquals(tc, 0, wcs->ap_order); CuAssertIntEquals(tc, 0, wcs->bp_order); CuAssertIntEquals(tc, 0, sip_ensure_inverse_polynomials(wcs)); printf("After ensuring inverse:\n"); sip_print_to(wcs, stdout); CuAssertIntEquals(tc, 4, wcs->a_order); CuAssertIntEquals(tc, 4, wcs->b_order); CuAssertIntEquals(tc, 5, wcs->ap_order); CuAssertIntEquals(tc, 5, wcs->bp_order); dx = dy = 100; for (y=0; y<=sip_imageh(wcs); y+=dy) { for (x=0; x<=sip_imagew(wcs); x+=dx) { double ra,dec; double x2, y2; anbool ok; sip_pixelxy2radec(wcs, x, y, &ra, &dec); ok = sip_radec2pixelxy(wcs, ra, dec, &x2, &y2); CuAssertTrue(tc, ok); CuAssertDblEquals(tc, x, x2, 1e-2); CuAssertDblEquals(tc, y, y2, 1e-2); printf("x,y %g,%g --> error %g,%g\n", x,y, x2-x, y2-y); } } sip_free(wcs); } astrometry.net-0.67/util/test_starutil.c000644 000765 000024 00000011033 12651445460 020613 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "starutil.h" #include "cutest.h" void test_ra2hmsstring(CuTest* tc) { char rastr[32], decstr[32]; double hr; double as; ra2hmsstring(0, rastr); CuAssertStrEquals(tc, "00:00:00.000", rastr); printf("ra %s\n", rastr); hr = 15.0; ra2hmsstring(-hr, rastr); CuAssertStrEquals(tc, "23:00:00.000", rastr); printf("ra %s\n", rastr); ra2hmsstring(hr, rastr); CuAssertStrEquals(tc, "01:00:00.000", rastr); printf("ra %s\n", rastr); as = 15.0/3600.0; ra2hmsstring(60.0*as, rastr); CuAssertStrEquals(tc, "00:01:00.000", rastr); printf("ra %s\n", rastr); ra2hmsstring(as, rastr); CuAssertStrEquals(tc, "00:00:01.000", rastr); printf("ra %s\n", rastr); ra2hmsstring(0.001*as, rastr); CuAssertStrEquals(tc, "00:00:00.001", rastr); printf("ra %s\n", rastr); ra2hmsstring(0.000999*as, rastr); CuAssertStrEquals(tc, "00:00:00.001", rastr); printf("ra %s\n", rastr); ra2hmsstring(360.0 - 0.001*as, rastr); CuAssertStrEquals(tc, "23:59:59.999", rastr); printf("ra %s\n", rastr); as = 1.0/3600.0; dec2dmsstring(0, decstr); CuAssertStrEquals(tc, "+00:00:00.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(-0, decstr); CuAssertStrEquals(tc, "+00:00:00.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(-1, decstr); CuAssertStrEquals(tc, "-01:00:00.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(-1*as, decstr); CuAssertStrEquals(tc, "-00:00:01.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(-0.001*as, decstr); CuAssertStrEquals(tc, "-00:00:00.001", decstr); printf("dec %s\n", decstr); dec2dmsstring(-0.000999*as, decstr); CuAssertStrEquals(tc, "-00:00:00.001", decstr); printf("dec %s\n", decstr); dec2dmsstring(as, decstr); CuAssertStrEquals(tc, "+00:00:01.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(0.5, decstr); CuAssertStrEquals(tc, "+00:30:00.000", decstr); printf("dec %s\n", decstr); dec2dmsstring(-0.5, decstr); CuAssertStrEquals(tc, "-00:30:00.000", decstr); printf("dec %s\n", decstr); } void test_hammer_aitoff(CuTest* tc) { double xyz[3]; double px, py; double ras [] = { 0, 0, 0, 0, 0, 45, 90, 135, 180, 225, 270, 315, 360}; double decs[] = { 0, 45, 90, -45, -89, 0, 0, 0, 0, 0, 0, 0, 0}; int i; for (i=0; i (%g, %g)\n", ra, dec, px, py); } } void test_atora(CuTest* tc) { CuAssertDblEquals(tc, 0.0, atora("00:00:00.0"), 1e-6); CuAssertDblEquals(tc, 15.0, atora("01:00:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25, atora("00:01:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0, atora("00:00:01.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0/10.0, atora("00:00:00.1"), 1e-6); CuAssertDblEquals(tc, 0.0, atora("0:00:00.0"), 1e-6); CuAssertDblEquals(tc, 15.0, atora("1:00:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25, atora("0:01:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0, atora("0:00:01.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0/10.0, atora("0:00:00.1"), 1e-6); CuAssertDblEquals(tc, 0.0, atora("00:0:00.0"), 1e-6); CuAssertDblEquals(tc, 15.0, atora("01:0:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25, atora("00:1:00.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0, atora("00:0:01.0"), 1e-6); CuAssertDblEquals(tc, 0.25/60.0/10.0, atora("00:0:00.1"), 1e-6); CuAssertDblEquals(tc, 6 * 15 + 8 * 0.25 + 41.0 * 0.25/60.0, atora("06:08:41.0"), 1e-6); CuAssertDblEquals(tc, 6 * 15 + 8 * 0.25 + 41.0 * 0.25/60.0, atora("6:08:41.0"), 1e-6); CuAssertDblEquals(tc, 6 * 15 + 8 * 0.25 + 41.0 * 0.25/60.0, atora("6:8:41.0"), 1e-6); } void test_atodec(CuTest* tc) { CuAssertDblEquals(tc, 0.0, atodec("00:00:00.0"), 1e-6); CuAssertDblEquals(tc, 1.0, atodec("01:00:00.0"), 1e-6); CuAssertDblEquals(tc, 1.0/60.0, atodec("00:01:00.0"), 1e-6); CuAssertDblEquals(tc, 1.0/3600.0, atodec("00:00:01.0"), 1e-6); CuAssertDblEquals(tc, 1.0/36000.0, atodec("00:00:00.1"), 1e-6); CuAssertDblEquals(tc, -1.0, atodec("-01:00:00.0"), 1e-6); CuAssertDblEquals(tc, -(1.0 + 1.0/60.0), atodec("-01:01:00.0"), 1e-6); } void test_xtodistsq(CuTest* tc) { double distsq = 1e-4; double x; x = distsq2rad(distsq); CuAssertDblEquals(tc, distsq, rad2distsq(x), 1e-8); x = distsq2arcsec(distsq); CuAssertDblEquals(tc, distsq, arcsec2distsq(x), 1e-8); } astrometry.net-0.67/util/test_svd.c000644 000765 000024 00000003627 12651445460 017552 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "cutest.h" #include "gsl/gsl_matrix.h" #include "gsl/gsl_linalg.h" // This one fails! /* void tst_nullspace(CuTest* tc) { double cov[4] = {-0.93390448957619598, 1.8004204750064117, 0, 0}; double U[4], V[4], S[2]; { double* pcov[] = { cov, cov+2 }; double* pU[] = { U, U +2 }; double* pV[] = { V, V +2 }; double eps, tol; eps = 1e-30; tol = 1e-30; svd(2, 2, 1, 1, eps, tol, pcov, S, pU, pV); } CuAssertDblEquals(tc, 0, S[1], 1e-6); CuAssertDblEquals(tc, 2.02822373, S[0], 1e-6); } */ void test_nullspace_gsl(CuTest* tc) { int i, j; gsl_matrix* A; gsl_matrix* V; gsl_matrix* U; gsl_vector* S; gsl_matrix_view vcov; double cov[4] = {-0.93390448957619598, 1.8004204750064117, 0, 0}; int M=2, N=2; A = gsl_matrix_alloc(M, N); S = gsl_vector_alloc(N); V = gsl_matrix_alloc(N, N); vcov = gsl_matrix_view_array(cov, M, N); gsl_matrix_memcpy(A, &(vcov.matrix)); gsl_linalg_SV_decomp_jacobi(A, V, S); // the U result is written to A. U = A; printf("S = ["); for (i=0; i #include #include #include "cutest.h" const char* tan1 = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN' / TAN projection CTYPE2 = 'DEC--TAN' / TAN projection WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 6.71529334958 / RA of reference point CRVAL2 = -72.7547910844 / DEC of reference point CRPIX1 = 477.760482899 / X reference pixel CRPIX2 = 361.955063329 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = -3.77685217356E-05 / Transformation matrix CD1_2 = -0.00273782095286 / no comment CD2_1 = 0.00273550077464 / no comment CD2_2 = -3.654231597E-05 / no comment IMAGEW = 1024 / Image width, in pixels. IMAGEH = 683 / Image height, in pixels. "; const char* tan2 = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN-SIP' / TAN (gnomic) projection + SIP distortions CTYPE2 = 'DEC--TAN-SIP' / TAN (gnomic) projection + SIP distortions WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 6.71529334958 / RA of reference point CRVAL2 = -72.7547910844 / DEC of reference point CRPIX1 = 477.760482899 / X reference pixel CRPIX2 = 361.955063329 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = -3.77685217356E-05 / Transformation matrix CD1_2 = -0.00273782095286 / no comment CD2_1 = 0.00273550077464 / no comment CD2_2 = -3.654231597E-05 / no comment IMAGEW = 1024 / Image width, in pixels. IMAGEH = 683 / Image height, in pixels. A_ORDER = 2 / Polynomial order, axis 1 A_0_2 = 2.25528052918E-06 / no comment A_1_1 = -4.81359073875E-07 / no comment A_2_0 = 4.30780269448E-07 / no comment B_ORDER = 2 / Polynomial order, axis 2 B_0_2 = -1.03727867632E-06 / no comment B_1_1 = 6.9796860706E-07 / no comment B_2_0 = -3.7809448368E-07 / no comment AP_ORDER= 2 / Inv polynomial order, axis 1 AP_0_1 = -6.65805505351E-07 / no comment AP_0_2 = -2.2549438026E-06 / no comment AP_1_0 = 3.30484183954E-07 / no comment AP_1_1 = 4.80936510428E-07 / no comment AP_2_0 = -4.30764936375E-07 / no comment BP_ORDER= 2 / Inv polynomial order, axis 2 BP_0_1 = 4.50013020053E-07 / no comment BP_0_2 = 1.03706596388E-06 / no comment BP_1_0 = -2.70330536785E-07 / no comment BP_1_1 = -6.97662208285E-07 / no comment BP_2_0 = 3.78065361127E-07 / no comment "; const char* sin1 = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---SIN' / SIN projection CTYPE2 = 'DEC--SIN' / SIN projection WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 6.71529334958 / RA of reference point CRVAL2 = -72.7547910844 / DEC of reference point CRPIX1 = 477.760482899 / X reference pixel CRPIX2 = 361.955063329 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = -3.77685217356E-05 / Transformation matrix CD1_2 = -0.00273782095286 / no comment CD2_1 = 0.00273550077464 / no comment CD2_2 = -3.654231597E-05 / no comment IMAGEW = 1024 / Image width, in pixels. IMAGEH = 683 / Image height, in pixels. "; const char* sin2 = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---SIN-SIP' / TAN (gnomic) projection + SIP distortions CTYPE2 = 'DEC--SIN-SIP' / TAN (gnomic) projection + SIP distortions WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 6.71529334958 / RA of reference point CRVAL2 = -72.7547910844 / DEC of reference point CRPIX1 = 477.760482899 / X reference pixel CRPIX2 = 361.955063329 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = -3.77685217356E-05 / Transformation matrix CD1_2 = -0.00273782095286 / no comment CD2_1 = 0.00273550077464 / no comment CD2_2 = -3.654231597E-05 / no comment IMAGEW = 1024 / Image width, in pixels. IMAGEH = 683 / Image height, in pixels. A_ORDER = 2 / Polynomial order, axis 1 A_0_2 = 2.25528052918E-06 / no comment A_1_1 = -4.81359073875E-07 / no comment A_2_0 = 4.30780269448E-07 / no comment B_ORDER = 2 / Polynomial order, axis 2 B_0_2 = -1.03727867632E-06 / no comment B_1_1 = 6.9796860706E-07 / no comment B_2_0 = -3.7809448368E-07 / no comment AP_ORDER= 2 / Inv polynomial order, axis 1 AP_0_1 = -6.65805505351E-07 / no comment AP_0_2 = -2.2549438026E-06 / no comment AP_1_0 = 3.30484183954E-07 / no comment AP_1_1 = 4.80936510428E-07 / no comment AP_2_0 = -4.30764936375E-07 / no comment BP_ORDER= 2 / Inv polynomial order, axis 2 BP_0_1 = 4.50013020053E-07 / no comment BP_0_2 = 1.03706596388E-06 / no comment BP_1_0 = -2.70330536785E-07 / no comment BP_1_1 = -6.97662208285E-07 / no comment BP_2_0 = 3.78065361127E-07 / no comment "; static void parse(const char* hdr, sip_t** sip, anwcs_t** anwcs, CuTest* tc) { int len; int hlen; char* str; fits_use_error_system(); len = strlen(hdr); hlen = fits_bytes_needed(len + 80); str = malloc(hlen + 1); memcpy(str, hdr, len); memset(str + len, ' ', hlen - len); memcpy(str + hlen - 80, "END", 3); str[hlen] = '\0'; //printf("Passing FITS header string: len %i, >>\n%s\n<<\n", hlen, str); *sip = sip_from_string(str, hlen, NULL); CuAssertPtrNotNull(tc, *sip); *anwcs = anwcs_wcslib_from_string(str, hlen); CuAssertPtrNotNull(tc, *anwcs); free(str); } static void tst_rd2xy(double ra, double dec, double xtrue, double ytrue, anwcs_t* an1, sip_t* sip1, tan_t* tan1, CuTest* tc) { double x, y; anbool ok; int err; if (an1) { x = y = 0.0; err = anwcs_radec2pixelxy(an1, ra, dec, &x, &y); printf("RA,Dec (%g, %g) -> x,y (%g, %g)\n", ra, dec, x, y); CuAssertIntEquals(tc, 0, err); CuAssertDblEquals(tc, xtrue, x, 1e-8); CuAssertDblEquals(tc, ytrue, y, 1e-8); } if (sip1) { x = y = 0.0; ok = sip_radec2pixelxy(sip1, ra, dec, &x, &y); printf("RA,Dec (%g, %g) -> x,y (%g, %g)\n", ra, dec, x, y); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, xtrue, x, 1e-8); CuAssertDblEquals(tc, ytrue, y, 1e-8); } if (tan1) { x = y = 0.0; ok = tan_radec2pixelxy(tan1, ra, dec, &x, &y); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, xtrue, x, 1e-8); CuAssertDblEquals(tc, ytrue, y, 1e-8); } } static void tst_xy2rd(double x, double y, double ratrue, double dectrue, anwcs_t* an1, sip_t* sip1, tan_t* tan1, CuTest* tc) { double ra, dec; int err; if (an1) { ra = dec = 0.0; err = anwcs_pixelxy2radec(an1, x, y, &ra, &dec); printf("x,y (%g, %g) -> RA,Dec (%g, %g)\n", x, y, ra, dec); CuAssertIntEquals(tc, 0, err); CuAssertDblEquals(tc, ratrue, ra, 1e-8); CuAssertDblEquals(tc, dectrue, dec, 1e-8); } if (sip1) { ra = dec = 0.0; sip_pixelxy2radec(sip1, x, y, &ra, &dec); printf("x,y (%g, %g) -> RA,Dec (%g, %g)\n", x, y, ra, dec); CuAssertDblEquals(tc, ratrue, ra, 1e-8); CuAssertDblEquals(tc, dectrue, dec, 1e-8); } if (tan1) { ra = dec = 0.0; tan_pixelxy2radec(tan1, x, y, &ra, &dec); printf("x,y (%g, %g) -> RA,Dec (%g, %g)\n", x, y, ra, dec); CuAssertDblEquals(tc, ratrue, ra, 1e-8); CuAssertDblEquals(tc, dectrue, dec, 1e-8); } } void test_tan1(CuTest* tc) { sip_t *sip1, *sip2, *sip3, *sip4; anwcs_t * an1, * an2, * an3, * an4; parse(tan1, &sip1, &an1, tc); parse(tan2, &sip2, &an2, tc); parse(sin1, &sip3, &an3, tc); parse(sin2, &sip4, &an4, tc); CuAssertIntEquals(tc, FALSE, sip1->wcstan.sin); CuAssertIntEquals(tc, TRUE, sip3->wcstan.sin); //anwcs_print(an1, stdout); //sip_print(sip1); /* > wcs-rd2xy -w tan1.wcs -r 10.4 -d -74.1 RA,Dec (10.4000000000, -74.1000000000) -> pixel (-30.3363662787, 0.3458823213) */ tst_rd2xy(10.4, -74.1, -30.3363662787, 0.3458823213, an1, sip1, &(sip1->wcstan), tc); /* > wcs-xy2rd -w ../tan1.wcs -x 1 -y 1 Pixel (1.0000000000, 1.0000000000) -> RA,Dec (10.3701345009, -74.0147061244) */ tst_xy2rd(1.0, 1.0, 10.3701345009, -74.0147061244, an1, sip1, &(sip1->wcstan), tc); /* > wcs-rd2xy -w ../sin1.wcs -r 10.4 -d -74.1 -L RA,Dec (10.4000000000, -74.1000000000) -> pixel (-30.1110266970, 0.5062550173) */ tst_rd2xy(10.4, -74.1, -30.1110266970, 0.5062550173, an3, sip3, &(sip3->wcstan), tc); /* > wcs-xy2rd -w ../sin1.wcs -x 1 -y 1 -L Pixel (1.0000000000, 1.0000000000) -> RA,Dec (10.3717392951, -74.0152067481) */ tst_xy2rd(1.0, 1.0, 10.3717392951, -74.0152067481, an3, sip3, &(sip3->wcstan), tc); // TAN-SIP / SIN-SIP /* > wcs-xy2rd -w ../tan2.wcs -x 1 -y 1 Pixel (1.0000000000, 1.0000000000) -> RA,Dec (10.3709060366, -74.0138433058) */ tst_xy2rd(1.0, 1.0, 10.3709060366, -74.0138433058, NULL, sip2, NULL, tc); /* > wcs-rd2xy -w tan2.wcs -r 10.4 -d -74.1 RA,Dec (10.4000000000, -74.1000000000) -> pixel (-30.6539962452, 0.4508839887) */ tst_rd2xy(10.4, -74.1, -30.6539962452, 0.4508839887, NULL, sip2, NULL, tc); /* > wcs-xy2rd -w sin2.wcs -x 1 -y 1 Pixel (1.0000000000, 1.0000000000) -> RA,Dec (10.3725100913, -74.0143432622) */ tst_xy2rd(1.0, 1.0, 10.3725100913, -74.0143432622, NULL, sip4, NULL, tc); /* > wcs-rd2xy -w sin2.wcs -r 10.4 -d -74.1 RA,Dec (10.4000000000, -74.1000000000) -> pixel (-30.4283749577, 0.6111635583) */ tst_rd2xy(10.4, -74.1, -30.4283749577, 0.6111635583, NULL, sip4, NULL, tc); // SIP round-trips double x, y, ra, dec, x2, y2; anbool ok; x = y = 100.0; ra = dec = 0.0; sip_pixelxy2radec(sip2, x, y, &ra, &dec); printf("x,y (%g, %g) -> RA,Dec (%g, %g)\n", x, y, ra, dec); x2 = y2 = 0.0; ok = sip_radec2pixelxy(sip2, ra, dec, &x2, &y2); printf("RA,Dec (%g, %g) -> x,y (%g, %g)\n", ra, dec, x2, y2); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, x, x2, 1e-3); CuAssertDblEquals(tc, y, y2, 1e-3); ra = dec = 0.0; sip_pixelxy2radec(sip4, x, y, &ra, &dec); printf("x,y (%g, %g) -> RA,Dec (%g, %g)\n", x, y, ra, dec); x2 = y2 = 0.0; ok = sip_radec2pixelxy(sip4, ra, dec, &x2, &y2); printf("RA,Dec (%g, %g) -> x,y (%g, %g)\n", ra, dec, x2, y2); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, x, x2, 1e-3); CuAssertDblEquals(tc, y, y2, 1e-3); } astrometry.net-0.67/util/test_xylist.c000644 000765 000024 00000017605 12651445460 020313 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "xylist.h" #include "fitsioutils.h" #include "qfits_header.h" #include "log.h" #include "cutest.h" static char* get_tmpfile(int i) { static char fn[256]; sprintf(fn, "/tmp/test-xylist-%i", i); return strdup(fn); } void test_tagalong(CuTest* ct) { xylist_t *in, *out; char* fn = get_tmpfile(2); starxy_t fld; starxy_t infld; fits_use_error_system(); log_init(LOG_VERB); out = xylist_open_for_writing(fn); CuAssertPtrNotNull(ct, out); xylist_set_include_flux(out, TRUE); CuAssertIntEquals(ct, 0, xylist_write_primary_header(out)); int N = 100; double x[N]; double y[N]; double flux[N]; double tagalong[2*N]; int i; srand(0); for (i=0; iantype, AN_FILETYPE_XYLS)); CuAssertPtrNotNull(ct, xylist_read_field(in, &infld)); CuAssertIntEquals(ct, N, infld.N); for (i=0; iantype, AN_FILETYPE_XYLS)); CuAssertPtrNotNull(ct, xylist_read_field(in, &infld)); CuAssertIntEquals(ct, N, infld.N); for (i=0; i ') p.add_option('-s', dest='separator', help='Separator character (default: whitespace)') p.add_option('-S', dest='skiplines', type='int', help='Skip this number of lines before the header') p.add_option('-m', dest='maxcols', type='int', help='Trim each data row to this number of characters.') p.add_option('-H', dest='header', help='Header string containing column names') #p.add_option('-F', dest='floats', action='store_true', default=False, # help='Assume all floats') p.add_option('-f', dest='format', help='Formats: (f=float32, d=float64, s=string, j=int32, k=int64)') p.add_option('-n', dest='fnull', action='append', default=['null'], help='Floating-point null value string (eg, "NaN", "null")') p.add_option('-N', dest='inull', action='append', default=['null'], help='Integer null value string (eg, "null")') p.set_defaults(separator=None, maxcols=None, skiplines=0) (opt,args) = p.parse_args() if len(args) != 2: p.print_help() sys.exit(-1) textfn = args[0] fitsfn = args[1] coltypes = None #if opt.floats: # coltypes = if opt.format: typemap = {'d':np.float64, 'f':np.float32, 's':str, 'i':np.int16, 'j':np.int32, 'k':np.int64} coltypes = [typemap[c] for c in opt.format] fnulls = dict([(x, np.nan) for x in opt.fnull]) inulls = dict([(x, -1) for x in opt.inull]) #T = text_table_fields(textfn, split=opt.separator, maxcols=opt.maxcols, # skiplines=opt.skiplines, headerline=opt.header, # coltypes=coltypes, floatvalmap=fnulls) fnulls[''] = np.nan T = streaming_text_table(textfn, split=opt.separator, maxcols=opt.maxcols, skiplines=opt.skiplines, headerline=opt.header, coltypes=coltypes, floatvalmap=fnulls, intvalmap=inulls) T.write_to(fitsfn) astrometry.net-0.67/util/tic.c000644 000765 000024 00000003540 12651445460 016470 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include "tic.h" #include "errors.h" #include "log.h" static time_t starttime; static double starttime2; static double startutime, startstime; double timenow() { struct timeval tv; if (gettimeofday(&tv, NULL)) { ERROR("Failed to get time of day"); return -1.0; } return (double)(tv.tv_sec - 3600*24*365*30) + tv.tv_usec * 1e-6; } double millis_between(struct timeval* tv1, struct timeval* tv2) { return (tv2->tv_usec - tv1->tv_usec)*1e-3 + (tv2->tv_sec - tv1->tv_sec )*1e3; } void tic() { starttime = time(NULL); starttime2 = timenow(); if (get_resource_stats(&startutime, &startstime, NULL)) { ERROR("Failed to get_resource_stats()"); return; } } int get_resource_stats(double* p_usertime, double* p_systime, long* p_maxrss) { struct rusage usage; if (getrusage(RUSAGE_SELF, &usage)) { SYSERROR("Failed to get resource stats (getrusage)"); return 1; } if (p_usertime) { *p_usertime = usage.ru_utime.tv_sec + 1e-6 * usage.ru_utime.tv_usec; } if (p_systime) { *p_systime = usage.ru_stime.tv_sec + 1e-6 * usage.ru_stime.tv_usec; } if (p_maxrss) { *p_maxrss = usage.ru_maxrss; } return 0; } void toc() { double utime, stime; long rss; //int dtime; double dtime2; //time_t endtime = time(NULL); //dtime = (int)(endtime - starttime); dtime2 = timenow() - starttime2; if (get_resource_stats(&utime, &stime, &rss)) { ERROR("Failed to get_resource_stats()"); return; } logmsg("Used %g s user, %g s system (%g s total), %g s wall time since last check\n", utime-startutime, stime-startstime, (utime + stime)-(startutime+startstime), dtime2); } astrometry.net-0.67/util/timingpool.py000644 000765 000024 00000057711 12651445460 020311 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from __future__ import print_function import multiprocessing.queues import multiprocessing.pool import multiprocessing.synchronize from multiprocessing.util import debug import _multiprocessing import threading import time import os try: # py2 import cPickle as pickle import Queue as queue Connection = _multiprocessing.Connection except: # py3 loads cPickle if available import pickle # py3 renames Queue to queue import queue Connection = multiprocessing.connection.Connection from astrometry.util.ttime import CpuMeas ''' This file provides a subclass of the multiprocessing.Pool class that tracks the CPU and Wall time of worker processes, as well as time and I/O spent in pickling data. It also provides an astrometry.util.ttime Measurement class, TimingPoolMeas, that records & reports the pool's worker CPU time. dpool = TimingPool(4, taskqueuesize=4) dmup = multiproc.multiproc(pool=dpool) Time.add_measurement(TimingPoolMeas(dpool)) ''' # # In Python 2.7 (and 2.6): # # Pool has an _inqueue (_quick_put) and _outqueue (_quick_get) # and _taskqueue: # # # pool.map() ---> sets cache[] # ---> put work on taskqueue # handle_tasks thread ---> gets work from taskqueue # ---> puts work onto inqueue # worker threads ---> get work from inqueue # ---> put results into outqueue # handle_results thread --> gets results from outqueue # --> sets cache[] # # meanwhile, handle_workers thread creates new workers as needed. # # # map() etc add themselves to cache[jobid] = self # and place work on the task queue. # # _handle_tasks pulls tasks from the _taskqueue and puts them # on the _inqueue. # # _handle_results pulls results from the _outqueue (job,i,obj) # and calls cache[job].set(i, obj) # (cache[job] is an ApplyResult / MapResult, etc.) # # worker threads run the worker() function: # run initializer # while true: # pull task from inqueue # job,i,func,arg,kwargs = task # put (job,i,result) on outqueue # _inqueue,_outqueue are SimpleQueue (queues.py) # get->recv=_reader.recv and put->send=_writer.send # _reader,_writer = Pipe(duplex=False) # Pipe (connection.py) # uses os.pipe() with a _multiprocessing.Connection() # on each fd. # _multiprocessing = /u32/python/src/Modules/_multiprocessing/pipe_connection.c # -> connection.h : send() is connection_send_obj() # which uses pickle. # # Only _multiprocessing/socket_connection.c is used on non-Windows platforms. class TimingConnection(): ''' A *Connection* wrapper that keeps track of how many objects and how many bytes are pickled, and how long that takes. ''' def __init__(self, fd, writable=True, readable=True): self.real = Connection(fd, writable=writable, readable=readable) self.ptime = 0. self.uptime = 0. self.pbytes = 0 self.upbytes = 0 self.pobjs = 0 self.upobjs = 0 def stats(self): ''' Returns statistics of the objects handled by this connection. ''' return dict(pickle_objs = self.pobjs, pickle_bytes = self.pbytes, pickle_megabytes = 1e-6 * self.pbytes, pickle_cputime = self.ptime, unpickle_objs = self.upobjs, unpickle_bytes = self.upbytes, unpickle_megabytes = 1e-6 * self.upbytes, unpickle_cputime = self.uptime) def poll(self): return self.real.poll() def recv(self): bytes = self.real.recv_bytes() t0 = time.time() obj = pickle.loads(bytes) dt = time.time() - t0 self.upbytes += len(bytes) self.uptime += dt self.upobjs += 1 return obj def send(self, obj): t0 = time.time() s = pickle.dumps(obj, -1) dt = time.time() - t0 self.pbytes += len(s) self.ptime += dt self.pobjs += 1 return self.real.send_bytes(s) def close(self): return self.real.close() def TimingPipe(): ''' Creates a pipe composed of two TimingConnection objects. ''' fd1, fd2 = os.pipe() c1 = TimingConnection(fd1, writable=False) c2 = TimingConnection(fd2, readable=False) return c1,c2 class TimingSimpleQueue(multiprocessing.queues.SimpleQueue): ''' A *SimpleQueue* subclass that uses a *TimingPipe* object to keep stats on how much pickling objects costs. ''' # new method def stats(self): ''' Returns stats on the objects sent through this queue. ''' S1 = self._reader.stats() S2 = self._writer.stats() return dict([(k, S1[k]+S2[k]) for k in S1.keys()]) def __init__(self): (self._reader, self._writer) = TimingPipe() self._rlock = multiprocessing.Lock() self._wlock = multiprocessing.Lock() # py2 if hasattr(self, '_make_methods'): self._make_methods() # _make_methods creates two methods: # # get: self._rlock.acquire(); # self._reader.recv(); # self._rlock.release(); # # put: self._wlock.acquire(); # self._write_send(); # self._wlock.release(); # def timing_worker(inqueue, outqueue, progressqueue, initializer=None, initargs=(), maxtasks=None): ''' A modified worker thread that tracks how much CPU time is used. ''' assert(maxtasks is None or (type(maxtasks) == int and maxtasks > 0)) put = outqueue.put get = inqueue.get if hasattr(inqueue, '_writer'): inqueue._writer.close() outqueue._reader.close() if progressqueue is not None: progressqueue._reader.close() if initializer is not None: initializer(*initargs) mypid = os.getpid() completed = 0 #t0 = time.time() while maxtasks is None or (maxtasks and completed < maxtasks): #print 'PID %i @ %f: get task' % (os.getpid(), time.time()-t0) try: # print 'Worker pid', os.getpid(), 'getting task' task = get() except (EOFError, IOError): debug('worker pid ' + os.getpid() + ' got EOFError or IOError -- exiting') break except KeyboardInterrupt as e: print('timing_worker caught KeyboardInterrupt during get()') put((None, None, (None,(False,e)))) raise SystemExit('ctrl-c') break if task is None: debug('worker got sentinel -- exiting') break # print 'PID %i @ %f: unpack task' % (os.getpid(), time.time()-t0) job, i, func, args, kwds = task if progressqueue is not None: try: # print 'Worker pid', os.getpid(), 'writing to progressqueue' progressqueue.put((job, i, mypid)) except (EOFError, IOError): print('worker got EOFError or IOError on progress queue -- exiting') break t1 = CpuMeas() #print 'PID %i @ %f: run task' % (os.getpid(), time.time()-t0) try: success,val = (True, func(*args, **kwds)) except Exception as e: success,val = (False, e) #print 'timing_worker: caught', e except KeyboardInterrupt as e: success,val = (False, e) #print 'timing_worker: caught ctrl-C during work', e #print type(e) put((None, None, (None,(False,e)))) raise #print 'PID %i @ %f: ran task' % (os.getpid(), time.time()-t0) t2 = CpuMeas() dt = (t2.cpu_seconds_since(t1), t2.wall_seconds_since(t1)) put((job, i, dt,(success,val))) completed += 1 #print 'PID %i @ %f: sent result' % (os.getpid(), time.time()-t0) debug('worker exiting after %d tasks' % completed) def timing_handle_results(outqueue, get, cache, beancounter, pool): ''' A modified handle-results thread that tracks how much CPU time is used by workers. ''' thread = threading.current_thread() while 1: try: task = get() except (IOError, EOFError): debug('result handler got EOFError/IOError -- exiting') return if thread._state: assert(thread._state == multiprocessing.pool.TERMINATE) debug('result handler found thread._state=TERMINATE') break if task is None: debug('result handler got sentinel') break #print 'Got task:', task (job, i, dt, obj) = task # ctrl-C -> (None, None, None, (False, KeyboardInterrupt())) if job is None: (success, val) = obj if not success: if isinstance(val, KeyboardInterrupt): #print 'Terminating due to KeyboardInterrupt' thread._state = multiprocessing.pool.TERMINATE pool._state = multiprocessing.pool.CLOSE break try: #print 'cache[job]:', cache[job], 'job', job, 'i', i cache[job]._set(i, obj) except KeyError: pass beancounter.add_time(dt) while cache and thread._state != multiprocessing.pool.TERMINATE: try: task = get() except (IOError, EOFError): debug('result handler got EOFError/IOError -- exiting') return if task is None: debug('result handler ignoring extra sentinel') continue (job, i, dt, obj) = task if job is None: #print 'Ignoring another KeyboardInterrupt' continue try: cache[job]._set(i, obj) except KeyError: pass beancounter.add_time(dt) if hasattr(outqueue, '_reader'): debug('ensuring that outqueue is not full') # If we don't make room available in outqueue then # attempts to add the sentinel (None) to outqueue may # block. There is guaranteed to be no more than 2 sentinels. try: for i in range(10): if not outqueue._reader.poll(): break get() except (IOError, EOFError): pass debug('result handler exiting: len(cache)=%s, thread._state=%s', len(cache), thread._state) #print 'debug_handle_results finishing.' def timing_handle_tasks(taskqueue, put, outqueue, progressqueue, pool, maxnqueued): thread = threading.current_thread() if progressqueue is not None and hasattr(progressqueue, '_writer'): progressqueue._writer.close() nqueued = 0 for taskseq, set_length in iter(taskqueue.get, None): i = -1 #print 'handle_tasks: task sequence', taskseq for i, task in enumerate(taskseq): # print 'handle_tasks: got task', i if thread._state: debug('task handler found thread._state != RUN') break # print 'N queue:', nqueued, 'max', maxnqueued try: # print 'Queueing new task' put(task) nqueued += 1 except IOError: debug('could not put task on queue') break # print 'N queue:', nqueued, 'max', maxnqueued if progressqueue is not None: while maxnqueued and nqueued >= maxnqueued: try: (job,i,pid) = progressqueue.get() # print 'Job', job, 'element', i, 'pid', pid, 'started' nqueued -= 1 except IOError: break else: if set_length: debug('doing set_length()') set_length(i+1) continue break else: debug('task handler got sentinel') #print 'debug_handle_tasks got sentinel' try: # tell result handler to finish when cache is empty debug('task handler sending sentinel to result handler') outqueue.put(None) # tell workers there is no more work debug('task handler sending sentinel to workers') for p in pool: put(None) except IOError: debug('task handler got IOError when sending sentinels') # Empty the progressqueue to prevent blocking writing workers? if progressqueue is not None: # print 'task thread: emptying progressqueue' try: # print 'task thread: reading from progressqueue. nqueued=', nqueued (job,i,pid) = progressqueue.get() # print 'Job', job, 'element', i, 'pid', pid, 'started' nqueued -= 1 except IOError: pass # print 'Task thread done.' class BeanCounter(object): ''' A class to keep track of the CPU and Wall time used by workers. ''' def __init__(self): self.cpu = 0. self.wall = 0. self.lock = multiprocessing.Lock() ### LOCKING def add_time(self, dt): self.lock.acquire() try: (cpu, wall) = dt self.cpu += cpu self.wall += wall finally: self.lock.release() def get_cpu(self): self.lock.acquire() try: return self.cpu finally: self.lock.release() def get_wall(self): self.lock.acquire() try: return self.wall finally: self.lock.release() def __str__(self): return 'CPU time: %.3fs s, Wall time: %.3fs' % (self.get_cpu(), self.get_wall()) class TimingPoolMeas(object): ''' An astrometry.util.ttime Measurement object to measure the resources used by workers, and by pickling objects. ''' def __init__(self, pool, pickleTraffic=True): self.pool = pool self.pickleTraffic = pickleTraffic def __call__(self): return TimingPoolTimestamp(self.pool, self.pickleTraffic) class TimingPoolTimestamp(object): ''' The current resources used by a pool of workers, for astrometry.util.ttime ''' def __init__(self, pool, pickleTraffic): self.pool = pool self.t0 = self.now(pickleTraffic) def format_diff(self, other): t1 = self.t0 t0 = other.t0 s = ('%.3f s worker CPU, %.3f s worker Wall' % tuple(t1[k] - t0[k] for k in ['worker_cpu', 'worker_wall'])) if 'pickle_objs' in self.t0: s += (', pickled %i/%i objs, %.1f/%.1f MB' % tuple(t1[k] - t0[k] for k in [ 'pickle_objs', 'unpickle_objs', 'pickle_megabytes', 'unpickle_megabytes'])) return s def now(self, pickleTraffic): if pickleTraffic: stats = self.pool.get_pickle_traffic() else: stats = dict() stats.update(worker_cpu = self.pool.get_worker_cpu(), worker_wall = self.pool.get_worker_wall()) return stats class TimingPool(multiprocessing.pool.Pool): ''' A python multiprocessing Pool subclass that keeps track of the resources used by workers, and tracks the expense of pickling objects. ''' def _setup_queues(self): self._inqueue = TimingSimpleQueue() self._outqueue = TimingSimpleQueue() self._quick_put = self._inqueue._writer.send self._quick_get = self._outqueue._reader.recv def get_pickle_traffic_string(self): S = self.get_pickle_traffic() return ((' pickled %i objs, %g MB, using %g s CPU\n' + 'unpickled %i objs, %g MB, using %g s CPU') % (S[k] for k in [ 'pickle_objs', 'pickle_megabytes', 'pickle_cputime', 'unpickle_objs', 'unpickle_megabytes', 'unpickle_cputime'])) def get_pickle_traffic(self): S1 = self._inqueue.stats() S2 = self._outqueue.stats() return dict([(k, S1[k]+S2[k]) for k in S1.keys()]) def get_worker_cpu(self): return self._beancounter.get_cpu() def get_worker_wall(self): return self._beancounter.get_wall() ### This just replaces the "worker" call with our "timing_worker". def _repopulate_pool(self): """Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. """ #print 'Repopulating pool with', (self._processes - len(self._pool)), 'workers' for i in range(self._processes - len(self._pool)): w = self.Process(target=timing_worker, args=(self._inqueue, self._outqueue, self._progressqueue, self._initializer, self._initargs, self._maxtasksperchild) ) self._pool.append(w) w.name = w.name.replace('Process', 'PoolWorker') w.daemon = True w.start() debug('added worker') def map(self, func, iterable, chunksize=None): ''' Equivalent of `map()` builtin ''' assert(self._state == multiprocessing.pool.RUN) async = self.map_async(func, iterable, chunksize) while True: try: #print('map: waiting for map_async result...') res = async.get(1) #print('map: got async result') return res except multiprocessing.TimeoutError: #print('map: timeout waiting for async result.') continue def map_async(self, func, iterable, chunksize=None, callback=None): ''' Asynchronous equivalent of `map()` builtin ''' assert(self._state == multiprocessing.pool.RUN) if not hasattr(iterable, '__len__'): iterable = list(iterable) if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) if extra: chunksize += 1 if len(iterable) == 0: chunksize = 0 result = multiprocessing.pool.MapResult(self._cache, chunksize, len(iterable), callback) mapstar = multiprocessing.pool.mapstar #print 'chunksize', chunksize #print 'Submitting job:', result._job #print 'Result:', result if chunksize == 1: self._taskqueue.put((((result._job, i, map, (func,(x,)), {}) for i, x in enumerate(iterable)), None)) else: task_batches = multiprocessing.pool.Pool._get_tasks(func, iterable, chunksize) self._taskqueue.put((((result._job, i, mapstar, (x,), {}) for i, x in enumerate(task_batches)), None)) return result # This is just copied from the superclass; we call our routines: # -handle_results -> timing_handle_results # And add _beancounter. def __init__(self, processes=None, initializer=None, initargs=(), maxtasksperchild=None, taskqueuesize=0): ''' taskqueuesize: maximum number of tasks to put on the queue; this is actually done by keeping a progressqueue, written-to by workers as they take work off the inqueue, and read by the handle_tasks thread. (Can't use a limit on _taskqueue, because (a) multi-element tasks are written; and (b) taskqueue is between the caller and the handle_tasks thread, which then just transfers the work to the inqueue, where it piles up. Can't easily use a limit on inqueue because it is implemented via pipes with unknown, OS-controlled capacity in units of bytes.) ''' self._beancounter = BeanCounter() self._setup_queues() self._taskqueue = queue.Queue() self._cache = {} self._state = multiprocessing.pool.RUN self._initializer = initializer self._initargs = initargs self._maxtasksperchild = maxtasksperchild if taskqueuesize: self._progressqueue = TimingSimpleQueue() else: self._progressqueue = None if processes is None: try: processes = multiprocessing.cpu_count() except NotImplementedError: processes = 1 if initializer is not None and not hasattr(initializer, '__call__'): raise TypeError('initializer must be a callable') self._processes = processes self._pool = [] self._repopulate_pool() self._worker_handler = threading.Thread( target=multiprocessing.pool.Pool._handle_workers, args=(self, ) ) self._worker_handler.name = 'WorkerHandler' self._worker_handler.daemon = True self._worker_handler._state = multiprocessing.pool.RUN self._worker_handler.start() if True: self._task_handler = threading.Thread( target=timing_handle_tasks, args=(self._taskqueue, self._quick_put, self._outqueue, self._progressqueue, self._pool, taskqueuesize)) else: self._task_handler = threading.Thread( target=multiprocessing.pool.Pool._handle_tasks, args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)) self._task_handler.name = 'TaskHandler' self._task_handler.daemon = True self._task_handler._state = multiprocessing.pool.RUN self._task_handler.start() self._result_handler = threading.Thread( target=timing_handle_results, args=(self._outqueue, self._quick_get, self._cache, self._beancounter, self) ) self._result_handler.name = 'ResultHandler' self._result_handler.daemon = True self._result_handler._state = multiprocessing.pool.RUN self._result_handler.start() self._terminate = multiprocessing.util.Finalize( self, self._terminate_pool, args=(self._taskqueue, self._inqueue, self._outqueue, self._pool, self._worker_handler, self._task_handler, self._result_handler, self._cache), exitpriority=15 ) # class iterwrapper(object): # def __init__(self, y, n): # self.n = n # self.y = y # def __str__(self): # return 'iterwrapper: n=%i; ' % self.n + self.y # def __iter__(self): # return self # def next(self): # return self.y.next() # def __len__(self): # return self.n if __name__ == '__main__': import sys from astrometry.util import multiproc from astrometry.util.ttime import * # import logging # lvl = logging.DEBUG # logging.basicConfig(level=lvl, format='%(message)s', stream=sys.stdout) # import multiprocessing # multiprocessing.get_logger() def work(i): print('Doing work', i) time.sleep(2) print('Done work', i) return i class ywrapper(object): def __init__(self, y, n): self.n = n self.y = y def __str__(self): return 'ywrapper: n=%i; ' % self.n + self.y def __iter__(self): return self def next(self): return self.y.next() def __len__(self): return self.n def yielder(n): for i in range(n): print('Yielding', i) yield i N = 20 y = yielder(N) args = ywrapper(y, N) dpool = TimingPool(4, taskqueuesize=4) dmup = multiproc.multiproc(pool=dpool) Time.add_measurement(TimingPoolMeas(dpool)) t0 = Time() res = dmup.map(work, args) print(Time()-t0) print('Got result:', res) astrometry.net-0.67/util/tpv.c000644 000765 000024 00000023477 12651445460 016535 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "tpv.h" #include "starutil.h" #include "mathutil.h" /******************************* NOTE, this does not work yet!!! I copied this from sip.c, which applies the distortion in PIXEL space, while TPV applies the distortion in IWC space. The TPV projection is evaluated as follows. Compute the first order standard coordinates xi and eta from the linear part of the solution stored in CRPIX and the CD matrix. xi = CD1_1 * (x - CRPIX1) + CD1_2 * (y - CRPIX2) eta = CD2_1 * (x - CRPIX1) + CD2_2 * (y - CRPIX2) Apply the distortion transformation using the coefficients in the PV keywords as described below. xi' = f_xi (xi, eta) eta' = f_eta (xi, eta) Apply the tangent plane projection to xi' and eta' as described in Calabretta and Greisen . The reference tangent point given by the CRVAL values lead to the final RA and DEC in degrees. Note that the units of xi, eta, f_xi, and f_eta are also degrees. ********************************/ anbool tpv_xyz2pixelxy(const tpv_t* tpv, double x, double y, double z, double *px, double *py) { double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return tpv_xyzarr2pixelxy(tpv, xyz, px, py); } void tpv_wrap_tan(const tan_t* tan, tpv_t* tpv) { memset(tpv, 0, sizeof(tpv_t)); memcpy(&(tpv->wcstan), tan, sizeof(tan_t)); } void tpv_get_crval(const tpv_t* tpv, double* ra, double* dec) { *ra = tpv->wcstan.crval[0]; *dec = tpv->wcstan.crval[1]; } double tpv_imagew(tpv_t* tpv) { assert(tpv); return tpv->wcstan.imagew; } double tpv_imageh(tpv_t* tpv) { assert(tpv); return tpv->wcstan.imageh; } tpv_t* tpv_create() { tpv_t* tpv = calloc(1, sizeof(tpv_t)); tpv->wcstan.cd[0][0] = 1; tpv->wcstan.cd[0][1] = 0; tpv->wcstan.cd[1][0] = 0; tpv->wcstan.cd[1][1] = 1; return tpv; } void tpv_free(tpv_t* tpv) { free(tpv); } void tpv_copy(tpv_t* dest, const tpv_t* src) { memcpy(dest, src, sizeof(tpv_t)); } static void tpv_distortion(const tpv_t* tpv, double x, double y, double* X, double* Y) { // Get pixel coordinates relative to reference pixel double u = x - tpv->wcstan.crpix[0]; double v = y - tpv->wcstan.crpix[1]; tpv_calc_distortion(tpv, u, v, X, Y); *X += tpv->wcstan.crpix[0]; *Y += tpv->wcstan.crpix[1]; } // Pixels to RA,Dec in degrees. void tpv_pixelxy2radec(const tpv_t* tpv, double px, double py, double *ra, double *dec) { double U, V; tpv_distortion(tpv, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2radec(&(tpv->wcstan), U, V, ra, dec); } // Pixels to Intermediate World Coordinates in degrees. void tpv_pixelxy2iwc(const tpv_t* tpv, double px, double py, double *iwcx, double* iwcy) { double U, V; tpv_distortion(tpv, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2iwc(&(tpv->wcstan), U, V, iwcx, iwcy); } // Pixels to XYZ unit vector. void tpv_pixelxy2xyzarr(const tpv_t* tpv, double px, double py, double *xyz) { double U, V; tpv_distortion(tpv, px, py, &U, &V); // Run a normal TAN conversion on the distorted pixel coords. tan_pixelxy2xyzarr(&(tpv->wcstan), U, V, xyz); } void tpv_iwc2pixelxy(const tpv_t* tpv, double u, double v, double *px, double* py) { double x,y; tan_iwc2pixelxy(&(tpv->wcstan), u, v, &x, &y); tpv_pixel_undistortion(tpv, x, y, px, py); } // RA,Dec in degrees to Pixels. anbool tpv_radec2pixelxy(const tpv_t* tpv, double ra, double dec, double *px, double *py) { double x,y; if (!tan_radec2pixelxy(&(tpv->wcstan), ra, dec, &x, &y)) return FALSE; tpv_pixel_undistortion(tpv, x, y, px, py); return TRUE; } void tpv_iwc2radec(const tpv_t* tpv, double x, double y, double *p_ra, double *p_dec) { tan_iwc2radec(&(tpv->wcstan), x, y, p_ra, p_dec); } anbool tpv_xyzarr2pixelxy(const tpv_t* tpv, const double* xyz, double *px, double *py) { double ra, dec; xyzarr2radecdeg(xyz, &ra, &dec); return tpv_radec2pixelxy(tpv, ra, dec, px, py); } anbool tpv_xyzarr2iwc(const tpv_t* tpv, const double* xyz, double* iwcx, double* iwcy) { return tan_xyzarr2iwc(&(tpv->wcstan), xyz, iwcx, iwcy); } anbool tpv_radec2iwc(const tpv_t* tpv, double ra, double dec, double* iwcx, double* iwcy) { return tan_radec2iwc(&(tpv->wcstan), ra, dec, iwcx, iwcy); } void tpv_calc_distortion(const tpv_t* tpv, double xi, double eta, double* XI, double *ETA) { // Do TPV distortion (in intermediate world coords) // xi,eta -> xi',eta' /** From http://iraf.noao.edu/projects/mosaic/tpv.html p = PV1_ xi' = p0 + p1 * xi + p2 * eta + p3 * r + p4 * xi^2 + p5 * xi * eta + p6 * eta^2 + p7 * xi^3 + p8 * xi^2 * eta + p9 * xi * eta^2 + p10 * eta^3 + p11 * r^3 + p12 * xi^4 + p13 * xi^3 * eta + p14 * xi^2 * eta^2 + p15 * xi * eta^3 + p16 * eta^4 + p17 * xi^5 + p18 * xi^4 * eta + p19 * xi^3 * eta^2 + p20 * xi^2 * eta^3 + p21 * xi * eta^4 + p22 * eta^5 + p23 * r^5 + p24 * xi^6 + p25 * xi^5 * eta + p26 * xi^4 * eta^2 + p27 * xi^3 * eta^3 + p28 * xi^2 * eta^4 + p29 * xi * eta^5 + p30 * eta^6 p31 * xi^7 + p32 * xi^6 * eta + p33 * xi^5 * eta^2 + p34 * xi^4 * eta^3 + p35 * xi^3 * eta^4 + p36 * xi^2 * eta^5 + p37 * xi * eta^6 + p38 * eta^7 + p39 * r^7 p = PV2_ eta' = p0 + p1 * eta + p2 * xi + p3 * r + p4 * eta^2 + p5 * eta * xi + p6 * xi^2 + p7 * eta^3 + p8 * eta^2 * xi + p9 * eta * xi^2 + p10 * xi^3 + p11 * r^3 + p12 * eta^4 + p13 * eta^3 * xi + p14 * eta^2 * xi^2 + p15 * eta * xi^3 + p16 * xi^4 + p17 * eta^5 + p18 * eta^4 * xi + p19 * eta^3 * xi^2 + p20 * eta^2 * xi^3 + p21 * eta * xi^4 + p22 * xi^5 + p23 * r^5 + p24 * eta^6 + p25 * eta^5 * xi + p26 * eta^4 * xi^2 + p27 * eta^3 * xi^3 + p28 * eta^2 * xi^4 + p29 * eta * xi^5 + p30 * xi^6 p31 * eta^7 + p32 * eta^6 * xi + p33 * eta^5 * xi^2 + p34 * eta^4 * xi^3 + p35 * eta^3 * xi^4 + p36 * eta^2 * xi^5 + p37 * eta * xi^6 + p38 * xi^7 + p39 * r^7 Note the "cross-over" -- the xi' powers are in terms of xi,eta while the eta' powers are in terms of eta,xi. */ // 1 x y r x2 xy y2 x3 x2y xy2 y3 r3 x4 x3y x2y2 xy3 y4 // x5 x4y x3y2 x2y3 xy4 y5 r5 x6 x5y x4y2, x3y3 x2y4 xy5 y6 // x7 x6y x5y2 x4y3 x3y4 x2y5 xy6 y7 r7 int xp[] = { 0, 1, 0, 0, 2, 1, 0, 3, 2, 1, 0, 0, 4, 3, 2, 1, 0, 5, 4, 3, 2, 1, 0, 0, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 0}; int yp[] = { 0, 0, 1, 0, 0, 1, 2, 0, 1, 2, 3, 0, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 0}; int rp[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7}; double xipows[8]; double etapows[8]; double rpows[8]; double r; int i; double px, py; r = sqrt(xi*xi + eta*eta); xipows[0] = etapows[0] = rpows[0] = 1.0; for (i=1; ipv1[i] * xipows[xp[i]] * etapows[yp[i]] * rpows[rp[i]]; // here's the "cross-over" mentioned above py += tpv->pv2[i] * etapows[xp[i]] * xipows[yp[i]] * rpows[rp[i]]; } *XI = px; *ETA = py; } void tpv_pixel_distortion(const tpv_t* tpv, double x, double y, double* X, double *Y) { tpv_distortion(tpv, x, y, X, Y); } void tpv_pixel_undistortion(const tpv_t* tpv, double x, double y, double* X, double *Y) { // Get pixel coordinates relative to reference pixel double u = x - tpv->wcstan.crpix[0]; double v = y - tpv->wcstan.crpix[1]; tpv_calc_inv_distortion(tpv, u, v, X, Y); *X += tpv->wcstan.crpix[0]; *Y += tpv->wcstan.crpix[1]; } void tpv_calc_inv_distortion(const tpv_t* tpv, double U, double V, double* u, double *v) { assert(0); printf("tpv_calc_inv_distortion not implemented!\n"); exit(-1); } double tpv_det_cd(const tpv_t* tpv) { return tan_det_cd(&(tpv->wcstan)); } // returns pixel scale in arcseconds (NOT arcsec^2) double tpv_pixel_scale(const tpv_t* tpv) { return tan_pixel_scale(&(tpv->wcstan)); } void tpv_print_to(const tpv_t* tpv, FILE* f) { double det,pixsc; print_to(&(tpv->wcstan), f, "TPV"); /* if (tpv->a_order > 0) { int p, q; for (p=0; p<=tpv->a_order; p++) { fprintf(f, (p ? " " : " A = ")); for (q=0; q<=tpv->a_order; q++) if (p+q <= tpv->a_order) //fprintf(f,"a%d%d=%le\n", p,q,tpv->a[p][q]); fprintf(f,"%12.5g", tpv->a[p][q]); fprintf(f,"\n"); } } if (tpv->b_order > 0) { int p, q; for (p=0; p<=tpv->b_order; p++) { fprintf(f, (p ? " " : " B = ")); for (q=0; q<=tpv->b_order; q++) if (p+q <= tpv->a_order) fprintf(f,"%12.5g", tpv->b[p][q]); //if (p+q <= tpv->b_order && p+q > 0) //fprintf(f,"b%d%d=%le\n", p,q,tpv->b[p][q]); fprintf(f,"\n"); } } det = tpv_det_cd(tpv); pixsc = 3600*sqrt(fabs(det)); //fprintf(f," det(CD)=%g\n", det); fprintf(f," sqrt(det(CD))=%g [arcsec]\n", pixsc); //fprintf(f,"\n"); */ } void tpv_print(const tpv_t* tpv) { tpv_print_to(tpv, stderr); } double tpv_get_orientation(const tpv_t* tpv) { return tan_get_orientation(&(tpv->wcstan)); } astrometry.net-0.67/util/ttime.py000644 000765 000024 00000012777 12651445460 017255 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from __future__ import print_function import os import re import resource # split out of get_memusage for profiling purposes def _read_proc_status(pid): procfn = '/proc/%d/status' % pid t = open(procfn).readlines() d = dict([(line.split()[0][:-1], line.split()[1:]) for line in t]) return d def _read_proc_maps(pid): procfn = '/proc/%d/maps' % pid t = open(procfn).readlines() d = dict(mmaps=t) rex = re.compile(r'(?P[0-9a-f]+)-(?P[0-9a-f]+) .*') parsed = [] addrsum = 0 for line in t: m = rex.match(line) if m is not None: parsed.append(m.groupdict()) try: addrsum += int(m.group('addrhi'), 16) - int(m.group('addrlo'), 16) except: pass return dict(mmaps=t, mmaps_parsed=parsed, mmaps_total=addrsum) def get_memusage(mmaps=True): ru = resource.getrusage(resource.RUSAGE_SELF) #pgsize = resource.getpagesize() maxrss = float(ru.ru_maxrss) / 1e6 # print('shared memory size:', (ru.ru_ixrss / 1e6), 'MB') # print('unshared memory size:', (ru.ru_idrss / 1e6), 'MB') # print('unshared stack size:', (ru.ru_isrss / 1e6), 'MB') # print('shared memory size:', ru.ru_ixrss) # print('unshared memory size:', ru.ru_idrss) # print('unshared stack size:', ru.ru_isrss) mu = dict(maxrss=[maxrss, 'MB']) pid = os.getpid() try: mu.update(_read_proc_status(pid)) except: pass # /proc/meminfo ? if mmaps: try: mu.update(_read_proc_maps(pid)) except: pass return mu def get_procio(): procfn = '/proc/%d/io' % os.getpid() dd = dict() try: t = open(procfn).readlines() for line in t: words = line.split() key = words[0].strip().strip(':') val = int(words[1]) dd[key] = val except: pass return dd def memusage(): mu = get_memusage() print('Memory usage:') print('max rss:', mu['maxrss'], 'MB') for key in ['VmPeak', 'VmSize', 'VmRSS', 'VmData', 'VmStk' # VmLck, VmHWM, VmExe, VmLib, VmPTE ]: print(key, ' '.join(mu.get(key, []))) if 'mmaps' in mu: print('Number of mmaps:', len(mu['mmaps'])) def count_file_descriptors(): procfn = '/proc/%d/fd' % os.getpid() try: # Linux: /proc/PID/fd/* t = os.listdir(procfn) return len(t) except: pass try: # OSX: "lsof" from run_command import run_command as rc cmd = 'lsof -p %i' % os.getpid() rtn,out,err = rc(cmd) if rtn == 0: return len(out.split('\n')) except: pass return 0 class FileDescriptorMeas(object): def __init__(self): self.fds = count_file_descriptors() def format_diff(self, other): return 'Open files: %i' % self.fds class MemMeas(object): def __init__(self): self.mem0 = get_memusage(mmaps=False) def format_diff(self, other): txt = [] for k in ['VmPeak', 'VmSize', 'VmRSS', 'VmData', 'maxrss']: if not k in self.mem0: continue val,unit = self.mem0[k] if unit == 'kB': val = int(val, 10) val /= 1024. unit = 'MB' val = '%.0f' % val txt.append('%s: %s %s' % (k, val, unit)) return ', '.join([] + txt) class IoMeas(object): def __init__(self): self.io0 = get_procio() def format_diff(self, other): txt = [] d1 = self.io0 d0 = other.io0 for k,knice in [('rchar',None), ('wchar',None), ('read_bytes','rb'), ('write_bytes', 'wb')]: v1 = d1.get(k) v0 = d0.get(k) unit = 'b' dv = float(v1 - v0) for uu in ['kB', 'MB', 'GB']: if dv < 2048: break dv = dv / 1024. unit = uu val = '%.3g' % dv if knice is None: kk = k else: kk = knice txt.append('%s: %s %s' % (kk, val, unit)) return ', '.join([] + txt) class CpuMeas(object): def __init__(self): import datetime from time import clock self.wall = datetime.datetime.now() self.cpu = clock() def cpu_seconds_since(self, other): return self.cpu - other.cpu def wall_seconds_since(self, other): dwall = (self.wall - other.wall) # python2.7 if hasattr(dwall, 'total_seconds'): dwall = dwall.total_seconds() else: dwall = (dwall.microseconds + (dwall.seconds + dwall.days * 24. * 3600.) * 1e6) / 1e6 return dwall def format_diff(self, other): dwall = self.wall_seconds_since(other) dcpu = self.cpu_seconds_since(other) return 'Wall: %.2f s, CPU: %.2f s' % (dwall, dcpu) class Time(object): @staticmethod def add_measurement(m): Time.measurements.append(m) measurements = [CpuMeas] def __init__(self): self.meas = [m() for m in Time.measurements] def __sub__(self, other): ''' Returns a string representation of the difference: self - other ''' meas = ', '.join([m.format_diff(om) for m,om in zip(self.meas, other.meas)]) return meas astrometry.net-0.67/util/uniformize.py000755 000765 000024 00000010277 12651445460 020316 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import sys import logging from optparse import OptionParser if __name__ == '__main__': try: try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import astrometry from astrometry.util.shell import shell_escape from astrometry.util.filetype import filetype_short except ImportError: me = sys.argv[0] path = os.path.realpath(me) utildir = os.path.dirname(path) assert(os.path.basename(utildir) == 'util') andir = os.path.dirname(utildir) rootdir = os.path.dirname(andir) sys.path.insert(1, andir) sys.path.insert(2, rootdir) import numpy from numpy import * from numpy.random import rand from astrometry.util.fits import * try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") def uniformize(infile, outfile, n, xcol='X', ycol='Y', ext=1, **kwargs): p = pyfits.open(infile) xy = p[ext].data if xy is None: print 'No sources' pyfits_writeto(p, outfile) return hdr = p[ext].header x = xy.field(xcol) y = xy.field(ycol) if len(x) == 0: print 'Empty xylist' pyfits_writeto(p, outfile) return # use IMAGEW,H, or compute bounds? # #$)(*&%^ NaNs in LSST source positions. Seriously, WTF! I = logical_and(isfinite(x), isfinite(y)) if not all(I): print '%i source positions are not finite.' % sum(logical_not(I)) x = x[I] y = y[I] W = max(x) - min(x) H = max(y) - min(y) if W == 0 or H == 0: print 'Area of the rectangle enclosing all image sources: %i x %i' % (W,H) pyfits_writeto(p, outfile) return NX = int(max(1, round(W / sqrt(W*H / float(n))))) NY = int(max(1, round(n / float(NX)))) print 'Uniformizing into %i x %i bins' % (NX, NY) print 'Image bounds: x [%g,%g], y [%g,%g]' % (min(x),max(x),min(y),max(y)) ix = (clip(floor((x - min(x)) / float(W) * NX), 0, NX-1)).astype(int) iy = (clip(floor((y - min(y)) / float(H) * NY), 0, NY-1)).astype(int) #print ix, iy assert(all(ix >= 0)) assert(all(ix < NX)) assert(all(iy >= 0)) assert(all(iy < NY)) I = iy * NX + ix assert(all(I >= 0)) assert(all(I < NX*NY)) #print 'len(I):', len(I) #print I.shape bins = [[] for i in range(NX*NY)] for j,i in enumerate(I): bins[int(i)].append(j) #print bins maxlen = max([len(b) for b in bins]) J = [] for i in range(maxlen): thisrow = [] for b in bins: if i >= len(b): continue thisrow.append(b[i]) # J.append(b[i]) thisrow.sort() J += thisrow J = array(J) #print 'len(J):', len(J) p[ext].header.add_history('This xylist was filtered by the "uniformize.py" program') p[ext].data = p[ext].data[J] pyfits_writeto(p, outfile) return 0 if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-X', dest='xcol', help='Name of X column in input table', default='X') parser.add_option('-Y', dest='ycol', help='Name of Y column in input table', default='Y') parser.add_option('-n', dest='n', type='int', default=10, help='Number of boxes, approximately') parser.add_option('-e', dest='ext', type=int, help='FITS extension to read', default=1) (opt, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Got arguments:', args sys.exit(-1) infile = args[0] outfile = args[1] rtn = uniformize(infile, outfile, opt.n, xcol=opt.xcol, ycol=opt.ycol, ext=opt.ext) sys.exit(rtn) astrometry.net-0.67/util/usnob_catalog.py000755 000765 000024 00000003775 12651445460 020754 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys from optparse import OptionParser try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from astrometry.util.fits import * from astrometry.util.healpix import * from astrometry.util.starutil_numpy import * from astrometry.util.usnob_cuts import * def get_usnob_sources(ra, dec, radius=1, basefn=None): usnob_nside = 9 if basefn is None: usnob_pat = 'usnob10_hp%03i.fits' else: usnob_pat = basefn usnobhps = healpix_rangesearch(ra, dec, radius, usnob_nside) print 'USNO-B healpixes in range:', usnobhps allU = None for hp in usnobhps: usnobfn = usnob_pat % hp print 'USNOB filename:', usnobfn U = table_fields(usnobfn) I = (degrees_between(ra, dec, U.ra, U.dec) < radius) print '%i USNOB stars within range.' % sum(I) U = U[I] if allU is None: allU = U else: allU.append(U) return allU if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('-r', dest='radius', type='float', help='Search radius, in deg (default 1 deg)') parser.add_option('-b', dest='basefn', help='Base filename of USNO-B FITS files (default: usnob10_hp%03i.fits)') parser.set_defaults(radius=1.0, basefn=None) (opt, args) = parser.parse_args() if len(args) != 3: parser.print_help() print print 'Got extra arguments:', args sys.exit(-1) # parse RA,Dec. ra = float(args[0]) dec = float(args[1]) outfn = args[2] # ugh! opts = {} for k in ['radius', 'basefn']: opts[k] = getattr(opt, k) X = get_usnob_sources(ra, dec, **opts) print 'Got %i USNO-B sources.' % len(X) print 'Applying cuts...' I = usnob_apply_cuts(X) X = X[I] print len(X), 'pass cuts' usnob_compute_average_mags(X) print 'Writing to', outfn X.write_to(outfn) astrometry.net-0.67/util/usnob_cuts.py000644 000765 000024 00000004575 12651445460 020314 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import numpy as np def usnob_apply_cuts(X): # USNO-B sources (not Tycho-2) I = (X.num_detections >= 2) # no diffraction spikes I = np.logical_and(I, np.logical_not(X.flags[:,0])) #X = X[I] #print '%i pass USNO-B diffraction spike cut' % len(X) if hasattr(X, 'an_diffraction_spike'): f = X.an_diffraction_spike print 'f shape', f.shape #u = unique(f) #print 'unique flags:', u for j in range(8): print 'flag', j, 'vals', np.unique(f[:,j]) I *= (np.logical_not(f[:,7]) * np.logical_not(f[:,6])) #X = X[good] #print '%i pass AN diffraction spike cut' % len(X) return I def usnob_compute_average_mags(X): # Compute average R and B mags. #epoch1 = (X.field_1 > 0) #epoch2 = (X.field_3 > 0) #nmag = np.where(epoch1, 1, 0) + np.where(epoch2, 1, 0) #summag = np.where(epoch1, X.magnitude_1, 0) + np.where(epoch2, X.magnitude_3, 0) #X.r_mag = np.where(nmag == 0, 0, summag / nmag) # rewritten to (hopefully) use less memory X.r_mag = np.zeros(len(X), np.float32) # sources that only have a first-epoch measurement I = np.flatnonzero((X.field_1 > 0) * (X.field_3 == 0)) X.r_mag[I] = X.magnitude_1[I] # sources that only have a second-epoch measurement I = np.flatnonzero((X.field_1 == 0) * (X.field_3 > 0)) X.r_mag[I] = X.magnitude_3[I] # sources that have both I = np.flatnonzero((X.field_1 > 0) * (X.field_3 > 0)) X.r_mag[I] = (X.magnitude_1[I] + X.magnitude_3[I]) / 2. # B #epoch1 = (X.field_0 > 0) #epoch2 = (X.field_2 > 0) #nmag = np.where(epoch1, 1, 0) + np.where(epoch2, 1, 0) #summag = np.where(epoch1, X.magnitude_0, 0) + np.where(epoch2, X.magnitude_2, 0) #X.b_mag = np.where(nmag == 0, 0, summag / nmag) X.b_mag = np.zeros(len(X), np.float32) #I = np.logical_or(X.field_0 > 0, X.field_2 > 0) #X.b_mag[I] = ( # ((X.field_0[I] > 0)*X.magnitude_0[I] + (X.field_2[I] > 0)*X.magnitude_2[I]) / # ((X.field_0[I] > 0)*1. + (X.field_2[I] > 0)*1.)) # sources that only have a first-epoch measurement I = np.flatnonzero((X.field_0 > 0) * (X.field_2 == 0)) X.b_mag[I] = X.magnitude_0[I] # sources that only have a second-epoch measurement I = np.flatnonzero((X.field_0 == 0) * (X.field_2 > 0)) X.b_mag[I] = X.magnitude_2[I] # sources that have both I = np.flatnonzero((X.field_0 > 0) * (X.field_2 > 0)) X.b_mag[I] = (X.magnitude_0[I] + X.magnitude_2[I]) / 2. astrometry.net-0.67/util/usnob_get_image.py000755 000765 000024 00000011545 12651445460 021255 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import re import sys import socket import time from urllib2 import urlopen, URLError from urllib import urlencode from urlparse import urlparse, urljoin from os.path import basename from optparse import OptionParser from astrometry.util.starutil_numpy import * from astrometry.util.file import * # raw, decw: rectangle size, in arcmin. # returns list of local filenames to which images were written def get_usnob_images(ra, dec, raw=15., decw=15., fieldname='', fits=False, wait=True, sources=None, basefn=None, survey='All Surveys', justurls=False): if survey is None: survey = 'All Surveys' if survey == 'poss-i': survey = 'POSS-I (103aO, 103aE)' if survey == 'poss-ii': survey = 'POSS-II (IIIaJ, IIIaF, IV-N)' # other survey options include 'SOUTH' and 'AAO-R' formvals = { 'fld': fieldname, 'ra': ra2hmsstring(ra), 'dec': dec2dmsstring(dec), 'rawid': raw, 'decwid': decw, 'wunits': 'Minutes', 'surims': survey, 'pixflg': 'yes', # images, please 'whorbl': 'Light Stars/Dark Sky', 'pixgraph': 'JPEG', 'cextract': 'rect', 'ori': 'NW - North Up, East Left', 'cat': 'USNO B1.0', } if fits: formvals['pixfits'] = 'Yes' else: formvals['pixfits'] = 'No' if sources is None: formvals.update({ 'opstars': 'No', # overplot stars? 'colbits': 'cb_ra', }) else: knownsources = ['R1','R2','B1','B2'] if not sources in knownsources: print 'Unknown source color', sources print 'options:', knownsources return -1 formvals.update({'opstars': 'Yes', 'cat': 'USNO B1.0', 'getcat': 'yes', 'colbits': 'cb_ra', 'clr': 'R1', # overplot color? }) if basefn is None: basefn = 'usnob-%g-%g-' % (ra,dec) #queryurl = 'http://www.nofs.navy.mil/cgi-bin/tfch3tI.cgi' queryurl = 'http://www.nofs.navy.mil/cgi-bin/tfch4.test.cgi' print 'submitting form values:' for k,v in formvals.items(): print ' ',k,'=',v print 'encoded as:' print ' ' + urlencode(formvals) print print 'waiting for results...' socket.setdefaulttimeout(300) f = urlopen(queryurl, urlencode(formvals)) doc = f.read() fn = 'res.html' write_file(doc, fn) m = re.search(r'', doc) if not m: raise RuntimeError('Failed to parse results page: server output written to file ' + fn) resurl = m.group(1) print 'result url', resurl if not wait: return resurl fns = [] # keep hitting the url... it may be 404 for a while. while True: print 'requesting result url', resurl res = urlopen(resurl) #print 'result info:', res.info() print doc = res.read() write_file(doc, 'res2.html') mjpeg = re.findall(r'jpg ', doc) print 'got jpeg matches:', mjpeg print if not len(mjpeg): raise Exception('no jpeg results found') if fits: mfits = re.findall(r'FITS', doc) print 'got fits matches:', mfits print if not len(mfits): raise Exception('no fits results found') else: mfits = [] if justurls: if fits: return ([urljoin(resurl, url) for url in mjpeg], [urljoin(resurl, url) for url in mfits]) else: return [urljoin(resurl, url) for url in mjpeg] for (urls,suffix) in [(mjpeg,''), (mfits,'.fits')]: for url in urls: print 'retrieving image', url fullurl = urljoin(resurl, url) print 'retrieving url', fullurl fn = basefn + basename(url) + suffix for trynum in range(100): try: res = urlopen(fullurl) print print 'writing to file', fn write_file(res.read(), fn) break except Exception,e: print 'Error:', e print 'Retrying...' time.sleep(1) fns.append(fn) break return fns if __name__ == '__main__': parser = OptionParser(usage='%prog [options] ') parser.add_option('--r1', '--R1', dest='red1', help='overplot first-epoch red sources', action='store_true') parser.add_option('--r2', '--R2', dest='red2', help='overplot second-epoch red sources', action='store_true') parser.add_option('-b', dest='big', help='30x30 arcmin (default: 15x15)', action='store_true') parser.add_option('-f', '--fits', dest='fits', help='Get FITS image too', action='store_true') parser.add_option('-n', dest='fieldname', help='fieldname (default: NoName)') parser.set_defaults(red1=False, red2=False, big=None, fieldname=None, fits=False) (opt, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Got extra arguments:', args sys.exit(-1) sources = None if opt.red1: sources = 'R1' elif opt.red2: sources = 'R2' sz = 15. if opt.big: sz = 30. # parse RA,Dec. ra = float(args[0]) dec = float(args[1]) args = {} if opt.fieldname: args['fieldname'] = opt.fieldname if opt.fits: args['fits'] = True get_usnob_images(ra, dec, sources=sources, raw=sz, decw=sz, **args) astrometry.net-0.67/util/usnob_get_region.py000755 000765 000024 00000006456 12651445460 021463 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from urllib2 import urlopen from urllib import urlencode from urlparse import urlparse, urljoin import os.path from numpy import * from astrometry.util.file import * from astrometry.util.usnob_get_image import * from optparse import OptionParser if __name__ == '__main__': parser = OptionParser() parser.add_option('-r', '--ra-low', '--ra-lo', '--ra-min', dest='ralo', type=float, help='Minimum RA') parser.add_option('-R', '--ra-high', '--ra-hi', '--ra-max', dest='rahi', type=float, help='Maximum RA') parser.add_option('-d', '--dec-low', '--dec-lo', '--dec-min', dest='declo', type=float, help='Minimum Dec') parser.add_option('-D', '--dec-high', '--dec-hi', '--dec-max', dest='dechi', type=float, help='Maximum Dec') parser.add_option('-p', '--prefix', dest='prefix', help='Output file prefix') parser.add_option('-s', '--survey', dest='survey', help='Grab only one USNOB survey: poss-i, poss-ii, ... (see http://www.nofs.navy.mil/data/fchpix/cfch.html') parser.add_option('-P', '--plate', dest='plate', help='Grab only one USNOB plate: "se0161", for example') parser.add_option('-c', '--continue', dest='cont', action='store_true', help='Continue a previously interrupted transfer') parser.set_defaults(prefix='usnob', survey=None, plate=None, ralo=None, rahi=None, declo=None, dechi=None, cont=False) (opt, args) = parser.parse_args() if opt.ralo is None or opt.rahi is None or opt.declo is None or opt.dechi is None: parser.print_help() parser.error('RA,Dec lo,hi are required.') radecs = [] decstep = 14./60. Dec = arange(opt.declo, opt.dechi+decstep, decstep) for dec in Dec: rastep = 14./60./cos(deg2rad(dec)) RA = arange(opt.ralo , opt.rahi +rastep , rastep) for ra in RA: radecs.append((ra,dec)) radecs = array(radecs) # Retrieve them in order of distance from the center of the region... #dists = [distsq_between_radecs(r,d, (opt.ralo+opt.rahi)/2., (opt.declo+opt.dechi)/2.) # for (r,d) in radecs] dists = distsq_between_radecs(radecs[:,0], radecs[:,1], (opt.ralo+opt.rahi)/2., (opt.declo+opt.dechi)/2.) order = argsort(dists) for (ra,dec) in radecs[order]: (jpeg,fits) = get_usnob_images(ra, dec, fits=True, survey=opt.survey, justurls=True) print 'got jpeg urls:', jpeg print 'got fits urls:', fits if opt.plate is None: keepjpeg = jpeg keepfits = fits else: keepjpeg = [u for u in jpeg if opt.plate in u] keepfits = [u for u in fits if opt.plate in u] print 'keep jpeg urls:', keepjpeg print 'keep fits urls:', keepfits base = opt.prefix + '-%.3f-%.3f-' % (ra,dec) for url in keepjpeg: # like "fchlwFxSl_so0194.000.jpg" urlfn = url.split('/')[-1] urlfn = urlfn.split('_')[-1] fn = base + urlfn if opt.cont and os.path.exists(fn): print 'File', fn, 'exists.' continue print 'retrieving', url, 'to', fn res = urlopen(url) write_file(res.read(), fn) for url in keepfits: urlfn = url.split('/')[-1] urlfn = urlfn.split('_')[-1] fn = base + urlfn + '.fits' if opt.cont and os.path.exists(fn): print 'File', fn, 'exists.' continue print 'retrieving', url, 'to', fn res = urlopen(url) write_file(res.read(), fn) astrometry.net-0.67/util/usnob_trim.py000644 000765 000024 00000005241 12651445460 020300 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # Used to trim down the "hpslit"-merged USNO-B files before # building indices out of them. import sys from optparse import OptionParser try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from astrometry.util.fits import * from astrometry.util.healpix import * from astrometry.util.starutil_numpy import * from astrometry.util.usnob_cuts import * def trim(infn, outfn): print 'Reading', infn X = fits_table(infn, columns=[ 'num_detections', 'flags', 'an_diffraction_spike', 'field_1', 'field_3', 'magnitude_1', 'magnitude_3', 'field_0', 'field_2', 'magnitude_0', 'magnitude_2', 'ra', 'dec', ]) print 'Read', len(X), 'sources' print 'Applying cuts' I = usnob_apply_cuts(X) # drop now-unwanted columns for c in ['flags', 'an_diffraction_spike', 'num_detections' ]: X.delete_column(c) X.cut(I) print 'Kept', len(X), 'sources' del I print 'Computing average mags' X.field_0 = X.field_0.astype(np.int16) X.field_1 = X.field_1.astype(np.int16) X.field_2 = X.field_2.astype(np.int16) X.field_3 = X.field_3.astype(np.int16) X.magnitude_0 = X.magnitude_0.astype(np.float32) X.magnitude_1 = X.magnitude_1.astype(np.float32) X.magnitude_2 = X.magnitude_2.astype(np.float32) X.magnitude_3 = X.magnitude_3.astype(np.float32) usnob_compute_average_mags(X) for c in [ 'field_1', 'field_3', 'magnitude_1', 'magnitude_3', 'field_0', 'field_2', 'magnitude_0', 'magnitude_2']: X.delete_column(c) X.r_mag = X.r_mag.astype(np.float32) X.b_mag = X.b_mag.astype(np.float32) print 'Writing output to', outfn X.writeto(outfn) del X if __name__ == '__main__': #for hp in range(12): if False: # fitscopy usnob-07.fits"[#row<100000000]" usnob-07-a.fits # fitscopy usnob-07.fits"[#row>=100000000]" usnob-07-b.fits infn = 'usnob-07-a.fits' outfn = 'usnob-trimmed-07-a.fits' trim(infn, outfn) if False: infn = 'usnob-07-b.fits' outfn = 'usnob-trimmed-07-b.fits' trim(infn, outfn) # cp usnob-trimmed-07-a.fits 07a.fits # tabmerge usnob-trimmed-07-b.fits+1 07a.fits+1 # mv 07a.fits usnob-trimmed-07.fits if False: infn = 'usnob-10-a.fits' outfn = 'usnob-trimmed-10-a.fits' trim(infn, outfn) if True: infn = 'usnob-10-b.fits' outfn = 'usnob-trimmed-10-b.fits' trim(infn, outfn) #for hp in range(7,12): #for hp in range(8,12): for hp in range(11,12): infn = 'usnob-%02i.fits' % hp outfn = 'usnob-trimmed-%02i.fits' % hp trim(infn, outfn) astrometry.net-0.67/util/util.i000644 000765 000024 00000255127 12651445460 016706 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ %module(package="astrometry.util") util %include %include %include %{ // numpy. #include #include #include #include #include "os-features.h" #include "log.h" #include "healpix.h" #include "healpix-utils.h" #include "anwcs.h" #include "sip.h" #include "fitsioutils.h" #include "sip-utils.h" #include "sip_qfits.h" #include "index.h" #include "quadfile.h" #include "codekd.h" #include "starkd.h" #include "starutil.h" #include "an-bool.h" #include "ioutils.h" #include "coadd.h" #include "wcs-resample.h" #include "resample.h" #include "keywords.h" #include "dimage.h" #include "fit-wcs.h" #include "qfits_header.h" #include "qfits_rw.h" #include "wcs-pv2sip.h" #define true 1 #define false 0 // For sip.h static void checkorder(int i, int j) { assert(i >= 0); assert(i < SIP_MAXORDER); assert(j >= 0); assert(j < SIP_MAXORDER); } // From index.i: /** For returning single codes and quads as python lists, do something like this: %typemap(out) float [ANY] { int i; $result = PyList_New($1_dim0); for (i = 0; i < $1_dim0; i++) { PyObject *o = PyFloat_FromDouble((double) $1[i]); PyList_SetItem($result,i,o); } } **/ double* code_alloc(int DC) { return malloc(DC * sizeof(double)); } void code_free(double* code) { free(code); } double code_get(double* code, int i) { return code[i]; } long codekd_addr(index_t* ind) { return (long)ind->codekd; } long starkd_addr(index_t* ind) { return (long)ind->starkd; } long quadfile_addr(index_t* ind) { return (long)ind->quads; } /* long qidxfile_addr(qidxfile* qf) { return (long)qf; } */ %} %init %{ // numpy import_array(); %} // Things in keywords.h (used by healpix.h) #define Const #define WarnUnusedResult #define InlineDeclare #define Flatten #define ASTROMETRY_KEYWORDS_H #define ATTRIB_FORMAT(x,y,z) void log_init(int level); int log_get_level(); void log_set_level(int lvl); %include "coadd.h" %include "resample.h" %include "an-bool.h" %include "fit-wcs.h" %inline %{ #define ERR(x, ...) \ printf(x, ## __VA_ARGS__) static void print_array(PyObject* arr) { PyArrayObject *obj; int i; PyArray_Descr *desc; printf("Array: %p\n", arr); if (!arr) return; if (!PyArray_Check(arr)) { printf(" Not a Numpy Array\n"); if (arr == Py_None) printf(" is None\n"); return; } printf(" Contiguous: %s\n", PyArray_ISCONTIGUOUS(arr) ? "yes" : "no"); printf(" Writeable: %s\n", PyArray_ISWRITEABLE(arr) ? "yes" : "no"); printf(" Aligned: %s\n", PyArray_ISALIGNED(arr) ? "yes" : "no"); printf(" C array: %s\n", PyArray_ISCARRAY(arr) ? "yes" : "no"); //printf(" typeobj: %p (float is %p)\n", arr->typeobj, //&PyFloat_Type); obj = (PyArrayObject*)arr; printf(" data: %p\n", obj->data); printf(" N dims: %i\n", obj->nd); for (i=0; ind; i++) printf(" dim %i: %i\n", i, (int)obj->dimensions[i]); for (i=0; ind; i++) printf(" stride %i: %i\n", i, (int)obj->strides[i]); desc = obj->descr; printf(" descr kind: '%c'\n", desc->kind); printf(" descr type: '%c'\n", desc->type); printf(" descr byteorder: '%c'\n", desc->byteorder); printf(" descr elsize: %i\n", desc->elsize); } static PyObject* an_hist2d(PyObject* py_arrx, PyObject* py_arry, PyObject* py_hist, double xlo, double xhi, double ylo, double yhi) { PyArray_Descr* dtype = NULL; PyArray_Descr* itype = NULL; int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; int reqout = req | NPY_WRITEABLE | NPY_UPDATEIFCOPY; PyObject* np_arrx; PyObject* np_arry; PyObject* np_hist; double *arrx; double *arry; int32_t *hist; int nx, ny; double dx, dy, idx, idy; int i, N; dtype = PyArray_DescrFromType(NPY_DOUBLE); itype = PyArray_DescrFromType(NPY_INT32); Py_INCREF(dtype); np_arrx = PyArray_FromAny(py_arrx, dtype, 1, 1, req, NULL); if (!np_arrx) { PyErr_SetString(PyExc_ValueError,"Expected x array to be double"); Py_DECREF(dtype); return NULL; } N = PyArray_SIZE(np_arrx); Py_INCREF(dtype); np_arry = PyArray_FromAny(py_arry, dtype, 1, 1, req, NULL); if (!np_arry) { PyErr_SetString(PyExc_ValueError,"Expected y array to be double"); Py_DECREF(dtype); Py_DECREF(np_arrx); return NULL; } if (PyArray_SIZE(np_arry) != N) { PyErr_SetString(PyExc_ValueError,"Expected x and y arrays to be the same length"); Py_DECREF(dtype); Py_DECREF(np_arrx); return NULL; } Py_CLEAR(dtype); Py_INCREF(itype); np_hist = PyArray_FromAny(py_hist, itype, 2, 2, reqout, NULL); if (!np_hist) { PyErr_SetString(PyExc_ValueError,"Expected hist array to be int32"); Py_DECREF(np_arrx); Py_DECREF(np_arry); Py_DECREF(itype); return NULL; } Py_CLEAR(itype); ny = PyArray_DIM(np_hist, 0); nx = PyArray_DIM(np_hist, 1); dx = (xhi - xlo) / (double)nx; dy = (yhi - ylo) / (double)ny; idx = 1./dx; idy = 1./dy; hist = PyArray_DATA(np_hist); arrx = PyArray_DATA(np_arrx); arry = PyArray_DATA(np_arry); for (i=0; i xhi) || (y < ylo) || (y > yhi)) continue; binx = (int)((x - xlo) * idx); biny = (int)((y - ylo) * idy); // == upper limit if (unlikely(binx == nx)) { binx--; } if (unlikely(biny == ny)) { biny--; } hist[biny * nx + binx]++; } Py_DECREF(np_arrx); Py_DECREF(np_arry); Py_DECREF(np_hist); Py_RETURN_NONE; } static double flat_percentile_f(PyObject* np_arr, double pct) { PyArray_Descr* dtype; npy_intp N; int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; float* x; float med = 0; int L, R; int mid; dtype = PyArray_DescrFromType(NPY_FLOAT); np_arr = PyArray_CheckFromAny(np_arr, dtype, 0, 0, req, NULL); if (!np_arr) { ERR("flat_median_f: Failed to convert array to float\n"); return 0; } dtype = NULL; N = PyArray_Size(np_arr); x = (float*)malloc(sizeof(float) * N); memcpy(x, PyArray_DATA(np_arr), sizeof(float)*N); Py_DECREF(np_arr); { int i; for (i=0; i= R) { mid = R; } while (L < R) { int ipivot; int i,j; int k; float pivot; //printf("L=%i, R=%i (N=%i), mid=%i\n", L, R, 1+R-L, mid); ipivot = random() % (1+R-L) + L; pivot = x[ipivot]; // partition array... i = L; j = R; do { // scan for elements out of place // scan from the left: while (x[i] < pivot) i++; // scan from the right: while (x[j] >= pivot && j>i) j--; // now x[i] >= pivot // and (x[j] < pivot) OR j == i assert(x[i] >= pivot); assert((x[j] < pivot) || (j == i)); assert(j >= i); if (i < j) { // swap float tmp = x[i]; x[i] = x[j]; x[j] = tmp; } } while (i < j); { for (k=L; k= pivot); } } // partition the right partition into == and > j = i; k = R; do { // scan for elements out of place // scan from the right: while (x[k] > pivot) k--; // scan from the left: while (x[j] == pivot && j pivot) || (j == k)); assert(k >= j); if (j < k) { // swap float tmp = x[j]; x[j] = x[k]; x[k] = tmp; } } while (j < k); j = k+1; { //printf("L=%i, i=%i, j=%i, k=%i, R=%i\n", L, i, j, k, R); for (k=L; k pivot); } } // there must be at least one element in the right partitions assert(i <= R); // there must be at least one element in the middle partition assert(j-i >= 1); if (mid < i) // the median is in the left partition (< pivot) R = i-1; else if (mid >= j) // the median is in the right partition (> pivot) L = j; else { // the median is in the middle partition (== pivot) L = R = i; break; } assert(L <= mid); assert(R >= mid); } med = x[mid]; free(x); return med; } static double flat_median_f(PyObject* np_arr) { return flat_percentile_f(np_arr, 50.0); } static int median_smooth(PyObject* np_image, PyObject* np_mask, int halfbox, PyObject* np_smooth) { /* image: np.float32 mask: bool or uint8; 1 to IGNORE. smooth: np.float32; output array. */ if (!PyArray_Check(np_image) || !PyArray_Check(np_smooth) || !PyArray_ISNOTSWAPPED(np_image) || !PyArray_ISNOTSWAPPED(np_smooth ) || !PyArray_ISFLOAT(np_image) || !PyArray_ISFLOAT(np_smooth ) || (PyArray_ITEMSIZE(np_image) != sizeof(float)) || (PyArray_ITEMSIZE(np_smooth ) != sizeof(float)) || !(PyArray_NDIM(np_image) == 2) || !(PyArray_NDIM(np_smooth ) == 2) || !PyArray_ISCONTIGUOUS(np_image) || !PyArray_ISCONTIGUOUS(np_smooth ) || !PyArray_ISWRITEABLE(np_smooth)) { ERR("median_smooth: array type checks failed for image/smooth\n"); ERR("check %i %i notswapped %i %i isfloat %i %i size %i %i ndim %i %i contig %i %i writable %i\n", PyArray_Check(np_image), PyArray_Check(np_smooth), PyArray_ISNOTSWAPPED(np_image), PyArray_ISNOTSWAPPED(np_smooth ), PyArray_ISFLOAT(np_image), PyArray_ISFLOAT(np_smooth), (PyArray_ITEMSIZE(np_image) == sizeof(float)), (PyArray_ITEMSIZE(np_smooth) == sizeof(float)), (PyArray_NDIM(np_image) == 2), (PyArray_NDIM(np_smooth ) == 2), PyArray_ISCONTIGUOUS(np_image), PyArray_ISCONTIGUOUS(np_smooth), PyArray_ISWRITEABLE(np_smooth)); return -1; } if (np_mask != Py_None) { if (!PyArray_Check(np_mask) || !PyArray_ISNOTSWAPPED(np_mask) || !PyArray_ISBOOL(np_mask) || (PyArray_ITEMSIZE(np_mask) != sizeof(uint8_t)) || !(PyArray_NDIM(np_mask) == 2) || !PyArray_ISCONTIGUOUS(np_mask)) { ERR("median_smooth: array type checks failed for mask\n"); return -1; } } npy_intp NX, NY; const float* image; float* smooth; const uint8_t* maskimg = NULL; NY = PyArray_DIM(np_image, 0); NX = PyArray_DIM(np_image, 1); if ((PyArray_DIM(np_smooth, 0) != NY) || (PyArray_DIM(np_smooth, 1) != NX)) { ERR("median_smooth: 'smooth' array is wrong shape\n"); return -1; } image = PyArray_DATA(np_image); smooth = PyArray_DATA(np_smooth); if (np_mask != Py_None) { if ((PyArray_DIM(np_mask, 0) != NY) || (PyArray_DIM(np_mask, 1) != NX)) { ERR("median_smooth: 'mask' array is wrong shape\n"); return -1; } maskimg = PyArray_DATA(np_mask); } dmedsmooth(image, maskimg, (int)NX, (int)NY, halfbox, smooth); return 0; } #define LANCZOS_INTERP_FUNC lanczos5_interpolate #define L 5 static int LANCZOS_INTERP_FUNC(PyObject* np_ixi, PyObject* np_iyi, PyObject* np_dx, PyObject* np_dy, PyObject* loutputs, PyObject* linputs); #include "lanczos.i" #undef LANCZOS_INTERP_FUNC #undef L #define LANCZOS_INTERP_FUNC lanczos3_interpolate #define L 3 static int LANCZOS_INTERP_FUNC(PyObject* np_ixi, PyObject* np_iyi, PyObject* np_dx, PyObject* np_dy, PyObject* loutputs, PyObject* linputs); #include "lanczos.i" #undef LANCZOS_INTERP_FUNC #undef L static int lanczos3_filter(PyObject* np_dx, PyObject* np_f) { npy_intp N; npy_intp i; float* dx; float* f; if (!PyArray_Check(np_dx) || !PyArray_Check(np_f ) || !PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f ) || !PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f ) || (PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float)) || !(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1) || !PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f ) || !PyArray_ISWRITEABLE(np_f) ) { ERR("Arrays aren't right type\n"); return -1; } N = PyArray_DIM(np_dx, 0); if (PyArray_DIM(np_f, 0) != N) { ERR("Input and output must have same dimensions\n"); return -1; } dx = PyArray_DATA(np_dx); f = PyArray_DATA(np_f); const double thirdpi = M_PI / 3.0; const double pisq = M_PI * M_PI; const double threeopisq = 3. / pisq; for (i=N; i>0; i--, dx++, f++) { double x = *dx; if (x < -3.0 || x > 3.0) { *f = 0.0; } else if (x == 0) { *f = 1.0; } else { *f = threeopisq * sin(M_PI * x) * sin(thirdpi * x) / (x * x); } } return 0; } static int lanczos3_filter_table(PyObject* np_dx, PyObject* np_f, int rangecheck) { npy_intp N; npy_intp i; float* dx; float* f; // Nlutunit is number of bins per unit x static const int Nlutunit = 1024; static const float lut0 = -4.; static const int Nlut = 8192; //8 * Nlutunit; // We want bins to go from -4 to 4 (Lanczos-3 range of -3 to 3, plus some buffer) // [Nlut] static float lut[8192]; static int initialized = 0; if (!initialized) { for (i=0; i<(Nlut); i++) { float x,f; x = (lut0 + (i / (float)Nlutunit)); if (x <= -3.0 || x >= 3.0) { f = 0.0; } else if (x == 0) { f = 1.0; } else { f = 3. * sin(M_PI * x) * sin(M_PI / 3.0 * x) / (M_PI * M_PI * x * x); } lut[i] = f; } initialized = 1; } if (!PyArray_Check(np_dx) || !PyArray_Check(np_f )) { ERR("Array check\n"); } if (!PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f )) { ERR("Swapped\n"); } if (!PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f )) { ERR("Float\n"); } if ((PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float))) { ERR("sizeof float\n"); } if ((PyArray_ITEMSIZE(np_dx) != sizeof(float))) { ERR("sizeof dx %i\n", PyArray_ITEMSIZE(np_dx)); } if ((PyArray_ITEMSIZE(np_f ) != sizeof(float))) { ERR("sizeof f %i\n", PyArray_ITEMSIZE(np_f)); } if (!(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1)) { ERR("one-d\n"); } if (!PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f )) { ERR("contig\n"); } if (!PyArray_ISWRITEABLE(np_f)) { ERR("writable\n"); } if (!PyArray_Check(np_dx) || !PyArray_Check(np_f ) || !PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f ) || !PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f ) || (PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float)) || !(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1) || !PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f ) || !PyArray_ISWRITEABLE(np_f) ) { ERR("Arrays aren't right type\n"); return -1; } N = PyArray_DIM(np_dx, 0); if (PyArray_DIM(np_f, 0) != N) { ERR("Input and output must have same dimensions\n"); return -1; } dx = PyArray_DATA(np_dx); f = PyArray_DATA(np_f); if (rangecheck) { for (i=N; i>0; i--, dx++, f++) { float x = *dx; int li = (int)((x - lut0) * Nlutunit); if ((li < 0) || (li >= Nlut)) { *f = 0.0; } else { *f = lut[li]; } } } else { for (i=N; i>0; i--, dx++, f++) { float x = *dx; int li = (int)((x - lut0) * Nlutunit); *f = lut[li]; } } return 0; } static int lanczos_shift_image_c(PyObject* np_img, PyObject* np_weight, PyObject* np_outimg, PyObject* np_outweight, int order, double dx, double dy) { int W,H; int i,j; lanczos_args_t lanczos; PyArray_Descr* dtype; // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; int reqout = req | NPY_WRITEABLE | NPY_UPDATEIFCOPY; double *img, *weight, *outimg, *outweight; weight = NULL; outweight = NULL; lanczos.order = order; /* printf("np_img:\n"); print_array(np_img); printf("np_weight:\n"); print_array(np_weight); printf("np_outimg:\n"); print_array(np_outimg); printf("np_outweight:\n"); print_array(np_outweight); */ dtype = PyArray_DescrFromType(PyArray_DOUBLE); Py_INCREF(dtype); np_img = PyArray_CheckFromAny(np_img, dtype, 2, 2, req, NULL); if (np_weight != Py_None) { Py_INCREF(dtype); np_weight = PyArray_CheckFromAny(np_weight, dtype, 2, 2, req, NULL); if (!np_weight) { ERR("Failed to run PyArray_FromAny on np_weight\n"); return -1; } } Py_INCREF(dtype); np_outimg = PyArray_CheckFromAny(np_outimg, dtype, 2, 2, reqout, NULL); if (np_outweight != Py_None) { Py_INCREF(dtype); np_outweight = PyArray_CheckFromAny(np_outweight, dtype, 2, 2, reqout, NULL); } Py_DECREF(dtype); dtype = NULL; if (!np_img || !np_outimg || !np_outweight) { ERR("Failed to PyArray_FromAny the images (np_img=%p, np_outimg=%p, np_outweight=%p)\n", np_img, np_outimg, np_outweight); return -1; } H = (int)PyArray_DIM(np_img, 0); W = (int)PyArray_DIM(np_img, 1); if ((PyArray_DIM(np_outimg, 0) != H) || (PyArray_DIM(np_outimg, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } if (np_weight != Py_None) { if ((PyArray_DIM(np_weight, 0) != H) || (PyArray_DIM(np_weight, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } weight = PyArray_DATA(np_weight); } if (np_outweight != Py_None) { if ((PyArray_DIM(np_outweight, 0) != H) || (PyArray_DIM(np_outweight, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } outweight = PyArray_DATA(np_outweight); } /* printf("np_img:\n"); print_array(np_img); printf("np_weight:\n"); print_array(np_weight); printf("np_outimg:\n"); print_array(np_outimg); printf("np_outweight:\n"); print_array(np_outweight); printf("weight = %p, outweight = %p\n", weight, outweight); */ img = PyArray_DATA(np_img); outimg = PyArray_DATA(np_outimg); for (i=0; i list of stars // swap the int* neighbours arg for tempneigh %typemap(in, numinputs=0) unsigned int *stars (unsigned int tempstars[DQMAX]) { $1 = tempstars; } // in the argout typemap we don't know about the swap (but that's ok) %typemap(argout) (const quadfile_t* qf, unsigned int quadid, unsigned int *stars) { int i; int D; if (result == -1) { goto fail; } D = $1->dimquads; $result = PyList_New(D); for (i = 0; i < D; i++) { PyObject *o = PyInt_FromLong($3[i]); PyList_SetItem($result, i, o); } } /** double* startree_get_data_column(startree_t* s, const char* colname, const int* indices, int N); -> list of doubles. -> ASSUME indices = None */ %typemap(argout) (startree_t* s, const char* colname, const int* indices, int N) { int i; int N; if (!result) { goto fail; } N = $4; $result = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem($result, i, o); } free(result); } %include "index.h" %include "quadfile.h" %include "codekd.h" %include "starkd.h" //%include "qidxfile.h" double* code_alloc(int DC); void code_free(double* code); double code_get(double* code, int i); long codekd_addr(index_t* ind); long starkd_addr(index_t* ind); long quadfile_addr(index_t* ind); //long qidxfile_addr(qidxfile* qf); %apply double *OUTPUT { double *dx, double *dy }; %apply double *OUTPUT { double *ra, double *dec }; // healpix_to_xyz %apply double *OUTPUT { double *p_x, double *p_y, double *p_z }; // for int healpix_get_neighbours(int hp, int* neigh, int nside) // --> list of neigh // swap the int* neighbours arg for tempneigh %typemap(in, numinputs=0) int *neighbours (int tempneigh[8]) { $1 = tempneigh; } // in the argout typemap we don't know about the swap (but that's ok) %typemap(argout) int *neighbours { int i; int nn; // convert $result to nn //nn = (int)PyInt_AsLong($result); nn = result; $result = PyList_New(nn); for (i = 0; i < nn; i++) { PyObject *o = PyInt_FromLong($1[i]); PyList_SetItem($result, i, o); } } // for il* healpix_rangesearch_radec(ra, dec, double, int nside, il* hps); // --> list // swallow the int* hps arg %typemap(in, numinputs=0) il* hps { $1 = NULL; } %typemap(out) il* { int i; int N; N = il_size($1); $result = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get($1, i)); PyList_SetItem($result, i, o); } } // healpix_radec_bounds %apply double *OUTPUT { double *ralo, double *rahi, double *declo, double *dechi }; // xyztohealpixf %apply double *OUTPUT { double *p_dx, double *p_dy }; %include "healpix.h" %include "healpix-utils.h" // anwcs_get_radec_center_and_radius %apply double *OUTPUT { double *p_ra, double *p_dec, double *p_radius }; // anwcs_get_radec_bounds %apply double *OUTPUT { double* pramin, double* pramax, double* pdecmin, double* pdecmax }; %apply double *OUTPUT { double *p_x, double *p_y, double *p_z }; %apply double *OUTPUT { double *p_ra, double *p_dec }; //%apply double *OUTPUT { double *xyz }; // eg anwcs_radec2pixelxy %apply double *OUTPUT { double *p_x, double *p_y }; // anwcs_pixelxy2xyz %typemap(in, numinputs=0) double* p_xyz (double tempxyz[3]) { $1 = tempxyz; } // in the argout typemap we don't know about the swap (but that's ok) %typemap(argout) double* p_xyz { $result = Py_BuildValue("(ddd)", $1[0], $1[1], $1[2]); } // anwcs_get_cd_matrix %typemap(in, numinputs=0) double* p_cd (double tempcd[4]) { $1 = tempcd; } %typemap(argout) double* p_cd { $result = Py_BuildValue("(dddd)", $1[0], $1[1], $1[2], $1[3]); } %typemap(in, numinputs=0) char **stringparam (char* tempstr) { $1 = &tempstr; } %typemap(in, numinputs=0) int *stringsizeparam (int slen) { $1 = &slen; } char* anwcs_wcslib_to_string(const anwcs_t* wcs, char **stringparam, int *stringsizeparam); %ignore anwcs_wcslib_to_string; %include "anwcs.h" %extend anwcs_t { anwcs_t(char* fn, int ext=0, int slen=0) { if ((ext == -1) || (starts_with(fn, "SIMPLE =") && !file_exists(fn))) { // assume header string if (slen == 0) { slen = (int)strlen(fn); } return anwcs_wcslib_from_string(fn, slen); } anwcs_t* w = anwcs_open(fn, ext); return w; } ~anwcs_t() { free($self); } double pixel_scale() { return anwcs_pixel_scale($self); } // FIXME -- this should be more like linearizeAtPoint(x,y) //void get_cd() { return anwcs_get_cd_matrix($self); } void get_center(double *p_ra, double *p_dec) { anwcs_get_radec_center_and_radius($self, p_ra, p_dec, NULL); } void get_radius(double *p_radius) { anwcs_get_radec_center_and_radius($self, NULL, NULL, p_radius); } anbool is_inside(double ra, double dec) { return anwcs_radec_is_inside_image($self, ra, dec); } double get_width() { return anwcs_imagew($self); } double get_height() { return anwcs_imageh($self); } void set_width(int W) { int H = anwcs_imageh($self); anwcs_set_size($self, W, H); } void set_height(int H) { int W = anwcs_imagew($self); anwcs_set_size($self, W, H); } void pixelxy2radec(double x, double y, double *p_ra, double *p_dec) { anwcs_pixelxy2radec($self, x, y, p_ra, p_dec); } int radec2pixelxy(double ra, double dec, double *p_x, double *p_y) { return anwcs_radec2pixelxy($self, ra, dec, p_x, p_y); } int write_to(const char* filename) { return anwcs_write($self, filename); } } %pythoncode %{ anwcs = anwcs_t anwcs.imagew = property(anwcs.get_width, anwcs.set_width, None, 'image width') anwcs.imageh = property(anwcs.get_height, anwcs.set_height, None, 'image height') anwcs.writeto = anwcs.write_to def anwcs_t_get_shape(self): return int(self.get_height()), int(self.get_width()) anwcs_t.get_shape = anwcs_t_get_shape def anwcs_t_set_shape(self, S): H,W = S self.set_height(H) self.set_width(W) anwcs_t.set_shape = anwcs_t_set_shape anwcs_t.shape = property(anwcs_t.get_shape, anwcs_t.set_shape, None, 'image shape') # same API as tan_t anwcs.radec_center = anwcs.get_center anwcs.radius = anwcs.get_radius def anwcs_from_string(s): return anwcs_t(s, -1, len(s)) def anwcs_get_header_string(self): s = anwcs_wcslib_to_string(self) return (s + 'NAXIS = 2' + ' '*69 + 'NAXIS1 = % 20i' % self.imagew + ' '*50 + 'NAXIS2 = % 20i' % self.imageh + ' '*50 + 'END'+' '*77) anwcs.getHeaderString = anwcs_get_header_string def anwcs_radec_bounds(self, stepsize=1000): r0,r1,d0,d1 = anwcs_get_radec_bounds(self, stepsize) return r0,r1,d0,d1 anwcs.radec_bounds = anwcs_radec_bounds def anwcs_get_cd(self): return anwcs_get_cd_matrix(self) anwcs.get_cd = anwcs_get_cd %} %include "starutil.h" %apply (char *STRING, int LENGTH) { (const unsigned char *, int) }; %include "qfits_header.h" %include "qfits_rw.h" %pythondynamic qfits_header; %pythoncode %{ def fitsio_to_qfits_header(hdr): hdrstr = '' for rec in hdr.records(): cardstr = rec.get('card', None) if cardstr is None: cardstr = hdr._record2card(rec) # pad cardstr = cardstr + ' '*(80 - len(cardstr)) hdrstr += cardstr hdrstr += 'END' + ' '*77 qhdr = qfits_header_read_hdr_string(hdrstr) return qhdr %} %include "wcs-pv2sip.h" %pythoncode %{ def wcs_pv2sip_hdr(hdr, order=5, xlo=0, xhi=0, ylo=0, yhi=0, stepsize=0, W=0, H=0): qhdr = fitsio_to_qfits_header(hdr) forcetan = False doshift = 1 scamp = False sip = wcs_pv2sip_header(qhdr, None, 0, stepsize, xlo, xhi, ylo, yhi, W, H, order, forcetan, doshift) return sip %} %typemap(in) double [ANY] (double temp[$1_dim0]) { int i; if (!PySequence_Check($input)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length($input) != $1_dim0) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0 elements"); return NULL; } for (i = 0; i < $1_dim0; i++) { PyObject *o = PySequence_GetItem($input,i); if (PyNumber_Check(o)) { temp[i] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } $1 = temp; } %typemap(out) double [ANY] { int i; $result = PyList_New($1_dim0); for (i = 0; i < $1_dim0; i++) { PyObject *o = PyFloat_FromDouble($1[i]); PyList_SetItem($result,i,o); } } %typemap(in) double flatmatrix[ANY][ANY] (double temp[$1_dim0][$1_dim1]) { int i; if (!PySequence_Check($input)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length($input) != ($1_dim0 * $1_dim1)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0*$1_dim1 elements"); return NULL; } for (i = 0; i < ($1_dim0*$1_dim1); i++) { PyObject *o = PySequence_GetItem($input,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp[i / $1_dim0][i % $1_dim0] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } $1 = temp; } %typemap(out) double flatmatrix[ANY][ANY] { int i; $result = PyList_New($1_dim0 * $1_dim1); for (i = 0; i < ($1_dim0)*($1_dim1); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble($1[i / $1_dim0][i % $1_dim0]); PyList_SetItem($result,i,o); } } %apply double [ANY] { double crval[2] }; %apply double [ANY] { double crpix[2] }; %apply double flatmatrix[ANY][ANY] { double cd[2][2] }; // SIP coefficients; array size must match SIP_MAXORDER. %apply double flatmatrix[ANY][ANY] { double a[10][10] }; %apply double flatmatrix[ANY][ANY] { double b[10][10] }; %apply double flatmatrix[ANY][ANY] { double ap[10][10] }; %apply double flatmatrix[ANY][ANY] { double bp[10][10] }; %include "sip.h" %include "sip_qfits.h" %include "sip-utils.h" %pythondynamic sip_t; %extend sip_t { sip_t(const char* fn=NULL, int ext=0) { if (fn) return sip_read_header_file_ext_only(fn, ext, NULL); sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); return t; } // from string -- third arg is just to distinguish this signature. sip_t(const char* s, int len, int XXX) { return sip_from_string(s, len, NULL); } // copy constructor sip_t(const sip_t* other) { sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); memcpy(t, other, sizeof(sip_t)); return t; } sip_t(const tan_t* other) { sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); memcpy(&(t->wcstan), other, sizeof(tan_t)); return t; } sip_t(const qfits_header* hdr) { sip_t* t = sip_read_header(hdr, NULL); return t; } ~sip_t() { free($self); } sip_t* get_subimage(int x0, int y0, int w, int h) { sip_t* sub = malloc(sizeof(sip_t)); memcpy(sub, $self, sizeof(sip_t)); sub->wcstan.crpix[0] -= x0; sub->wcstan.crpix[1] -= y0; sub->wcstan.imagew = w; sub->wcstan.imageh = h; return sub; } sip_t* scale(double factor) { sip_t* s = (sip_t*)calloc(1, sizeof(sip_t)); sip_scale($self, s, factor); return s; } double pixel_scale() { return sip_pixel_scale($self); } void radec_center(double *p_ra, double *p_dec) { sip_get_radec_center($self, p_ra, p_dec); } double radius() { return sip_get_radius_deg($self); } int write_to(const char* filename) { return sip_write_to_file($self, filename); } int ensure_inverse_polynomials() { return sip_ensure_inverse_polynomials($self); } /* double* get_cd_matrix() { return $self->wcstan.cd; } */ void pixelxy2xyz(double x, double y, double *p_x, double *p_y, double *p_z) { double xyz[3]; sip_pixelxy2xyzarr($self, x, y, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } void pixelxy2radec(double x, double y, double *p_ra, double *p_dec) { sip_pixelxy2radec($self, x, y, p_ra, p_dec); } int radec2pixelxy(double ra, double dec, double *p_x, double *p_y) { return sip_radec2pixelxy($self, ra, dec, p_x, p_y); } void iwc2pixelxy(double u, double v, double *p_x, double *p_y) { sip_iwc2pixelxy($self, u, v, p_x, p_y); } void pixelxy2iwc(double x, double y, double *p_x, double *p_y) { sip_pixelxy2iwc($self, x, y, p_x, p_y); } void iwc2radec(double u, double v, double *p_ra, double *p_dec) { sip_iwc2radec($self, u, v, p_ra, p_dec); } int radec2iwc(double ra, double dec, double *p_x, double *p_y) { return sip_radec2iwc($self, ra, dec, p_x, p_y); } int xyz2pixelxy(double x, double y, double z, double *p_x, double *p_y) { double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return sip_xyzarr2pixelxy($self, xyz, p_x, p_y); } anbool is_inside(double ra, double dec) { return sip_is_inside_image($self, ra, dec); } void set_a_term(int i, int j, double val) { checkorder(i, j); $self->a[i][j] = val; } void set_b_term(int i, int j, double val) { checkorder(i, j); $self->b[i][j] = val; } void set_ap_term(int i, int j, double val) { checkorder(i, j); $self->ap[i][j] = val; } void set_bp_term(int i, int j, double val) { checkorder(i, j); $self->bp[i][j] = val; } double get_a_term(int i, int j) { checkorder(i, j); return $self->a[i][j]; } double get_b_term(int i, int j) { checkorder(i, j); return $self->b[i][j]; } double get_ap_term(int i, int j) { checkorder(i, j); return $self->ap[i][j]; } double get_bp_term(int i, int j) { checkorder(i, j); return $self->bp[i][j]; } void set_width(double x) { $self->wcstan.imagew = x; } void set_height(double x) { $self->wcstan.imageh = x; } double get_width() { return $self->wcstan.imagew; } double get_height() { return $self->wcstan.imageh; } void get_distortion(double x, double y, double *p_x, double *p_y) { return sip_pixel_distortion($self, x, y, p_x, p_y); } void get_undistortion(double x, double y, double *p_x, double *p_y) { return sip_pixel_undistortion($self, x, y, p_x, p_y); } int write_to(const char* filename) { return sip_write_to_file($self, filename); } } %pythoncode %{ def sip_t_tostring(self): tan = self.wcstan ct = 'SIN' if tan.sin else 'TAN' return (('SIP(%s): crpix (%.1f, %.1f), crval (%g, %g), cd (%g, %g, %g, %g), ' + 'image %g x %g; SIP orders A=%i, B=%i, AP=%i, BP=%i') % (ct, tan.crpix[0], tan.crpix[1], tan.crval[0], tan.crval[1], tan.cd[0], tan.cd[1], tan.cd[2], tan.cd[3], tan.imagew, tan.imageh, self.a_order, self.b_order, self.ap_order, self.bp_order)) sip_t.__str__ = sip_t_tostring def sip_t_addtoheader(self, hdr): '''Adds this SIP WCS header to the given fitsio header''' self.wcstan.add_to_header(hdr) hdr.delete('CTYPE1') hdr.delete('CTYPE2') for k,v,c in [ ('CTYPE1', 'RA---TAN-SIP', 'TANgent plane+SIP'), ('CTYPE2', 'DEC--TAN-SIP', 'TANgent plane+SIP'), ('A_ORDER', self.a_order, 'Polynomial order, axis 1'), ('B_ORDER', self.b_order, 'Polynomial order, axis 2'), ('AP_ORDER', self.ap_order, 'Inv.polynomial order, axis 1'), ('BP_ORDER', self.bp_order, 'Inv.polynomial order, axis 2'), ]: hdr.add_record(dict(name=k, value=v, comment=c)) for i in range(self.a_order + 1): for j in range(self.a_order + 1): #if i + j < 1: # drop linear (CD) terms if i + j < 2: continue if i + j > self.a_order: continue hdr.add_record(dict(name='A_%i_%i' % (i,j), value=self.get_a_term(i, j), comment='SIP polynomial term')) for i in range(self.b_order + 1): for j in range(self.b_order + 1): #if i + j < 1: # drop linear (CD) terms if i + j < 2: continue if i + j > self.b_order: continue hdr.add_record(dict(name='B_%i_%i' % (i,j), value=self.get_b_term(i, j), comment='SIP polynomial term')) for i in range(self.ap_order + 1): for j in range(self.ap_order + 1): if i + j < 1: continue if i + j > self.ap_order: continue hdr.add_record(dict(name='AP_%i_%i' % (i,j), value=self.get_ap_term(i, j), comment='SIP polynomial term')) for i in range(self.bp_order + 1): for j in range(self.bp_order + 1): if i + j < 1: continue if i + j > self.bp_order: continue hdr.add_record(dict(name='BP_%i_%i' % (i,j), value=self.get_bp_term(i, j), comment='SIP polynomial term')) sip_t.add_to_header = sip_t_addtoheader # def sip_t_get_subimage(self, x0, y0, w, h): # wcs2 = sip_t(self) # cpx,cpy = wcs2.crpix # wcs2.set_crpix((cpx - x0, cpy - y0)) # wcs2.set_width(float(w)) # wcs2.set_height(float(h)) # return wcs2 # sip_t.get_subimage = sip_t_get_subimage def sip_t_get_shape(self): return (self.wcstan.imageh, self.wcstan.imagew) sip_t.get_shape = sip_t_get_shape def sip_t_set_shape(self, S): H,W = S self.set_height(H) self.set_width(W) sip_t.set_shape = sip_t_set_shape sip_t.imagew = property(sip_t.get_width, sip_t.set_width, None, 'image width') sip_t.imageh = property(sip_t.get_height, sip_t.set_height, None, 'image height') sip_t.shape = property(sip_t.get_shape, sip_t.set_shape, None, 'image shape') def sip_t_get_cd(self): cd = self.wcstan.cd return (cd[0], cd[1], cd[2], cd[3]) def sip_t_set_cd(self, x): self.wcstan.cd = x sip_t.get_cd = sip_t_get_cd sip_t.set_cd = sip_t_set_cd def sip_t_get_crval(self): return self.wcstan.crval def sip_t_set_crval(self, x): self.wcstan.crval = x sip_t.get_crval = sip_t_get_crval sip_t.set_crval = sip_t_set_crval def sip_t_get_crpix(self): return self.wcstan.crpix def sip_t_set_crpix(self, x): self.wcstan.crpix = x sip_t.get_crpix = sip_t_get_crpix sip_t.set_crpix = sip_t_set_crpix sip_t.crval = property(sip_t_get_crval, sip_t_set_crval, None, 'CRVAL') sip_t.crpix = property(sip_t_get_crpix, sip_t_set_crpix, None, 'CRPIX') sip_t.cd = property(sip_t_get_cd , sip_t_set_cd, None, 'CD') def sip_t_radec_bounds(self): # W,H = self.wcstan.imagew, self.wcstan.imageh # r,d = self.pixelxy2radec([1, W, W, 1], [1, 1, H, H]) # return (r.min(), r.max(), d.min(), d.max()) W,H = self.imagew, self.imageh r,d = self.pixelxy2radec([1, W/2, W, W, W, W/2, 1, 1], [1, 1, 1, H/2, H, H, H, H/2]) rx = r.max() rn = r.min() # ugh, RA wrap-around. We find the largest value < 180 (ie, near zero) and smallest value > 180 (ie, near 360) # and report them with ralo > rahi so that this case can be identified if rx - rn > 180: rx = r[r < 180].max() rn = r[r > 180].min() return (rn, rx, d.min(), d.max()) sip_t.radec_bounds = sip_t_radec_bounds #def sip_t_fromstring(s): # sip = sip_from_string(s, len(s), _real_sip_t_init = sip_t.__init__ def my_sip_t_init(self, *args, **kwargs): # fitsio header: check for '.records()' function. if len(args) == 1 and hasattr(args[0], 'records'): try: hdr = args[0] qhdr = fitsio_to_qfits_header(hdr) args = [qhdr] except: pass _real_sip_t_init(self, *args, **kwargs) if self.this is None: raise RuntimeError('Duck punch!') sip_t.__init__ = my_sip_t_init Sip = sip_t %} %pythondynamic tan_t; %extend tan_t { tan_t(char* fn=NULL, int ext=0, int only=0) { tan_t* t = NULL; if (fn) { if (only) { t = tan_read_header_file_ext_only(fn, ext, NULL); } else { t = tan_read_header_file_ext(fn, ext, NULL); } } else { t = (tan_t*)calloc(1, sizeof(tan_t)); } // printf("tan_t: %p\n", t); if (!t) { // SWIG_exception(SWIG_RuntimeError, "Failed to read TAN WCS header"); PyErr_SetString(PyExc_RuntimeError, "Failed to read TAN WCS header"); return NULL; } return t; } tan_t(double crval1, double crval2, double crpix1, double crpix2, double cd11, double cd12, double cd21, double cd22, double imagew, double imageh) { tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); t->crval[0] = crval1; t->crval[1] = crval2; t->crpix[0] = crpix1; t->crpix[1] = crpix2; t->cd[0][0] = cd11; t->cd[0][1] = cd12; t->cd[1][0] = cd21; t->cd[1][1] = cd22; t->imagew = imagew; t->imageh = imageh; return t; } tan_t(const tan_t* other) { tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); memcpy(t, other, sizeof(tan_t)); return t; } tan_t(const qfits_header* hdr) { tan_t* t = tan_read_header(hdr, NULL); return t; } ~tan_t() { free($self); } void set(double crval1, double crval2, double crpix1, double crpix2, double cd11, double cd12, double cd21, double cd22, double imagew, double imageh) { $self->crval[0] = crval1; $self->crval[1] = crval2; $self->crpix[0] = crpix1; $self->crpix[1] = crpix2; $self->cd[0][0] = cd11; $self->cd[0][1] = cd12; $self->cd[1][0] = cd21; $self->cd[1][1] = cd22; $self->imagew = imagew; $self->imageh = imageh; } anbool is_inside(double ra, double dec) { return tan_is_inside_image($self, ra, dec); } tan_t* scale(double factor) { tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); tan_scale($self, t, factor); return t; } double get_width() { return $self->imagew; } double get_height() { return $self->imageh; } void set_width(double x) { $self->imagew = x; } void set_height(double x) { $self->imageh = x; } double pixel_scale() { return tan_pixel_scale($self); } void radec_center(double *p_ra, double *p_dec) { tan_get_radec_center($self, p_ra, p_dec); } double radius() { return tan_get_radius_deg($self); } void xyzcenter(double *p_x, double *p_y, double *p_z) { double xyz[3]; tan_pixelxy2xyzarr($self, 0.5+$self->imagew/2.0, 0.5+$self->imageh/2.0, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } void pixelxy2xyz(double x, double y, double *p_x, double *p_y, double *p_z) { double xyz[3]; tan_pixelxy2xyzarr($self, x, y, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } void pixelxy2radec(double x, double y, double *p_ra, double *p_dec) { tan_pixelxy2radec($self, x, y, p_ra, p_dec); } int radec2pixelxy(double ra, double dec, double *p_x, double *p_y) { return tan_radec2pixelxy($self, ra, dec, p_x, p_y); } void iwc2pixelxy(double u, double v, double *p_x, double *p_y) { tan_iwc2pixelxy($self, u, v, p_x, p_y); } void pixelxy2iwc(double x, double y, double *p_x, double *p_y) { tan_pixelxy2iwc($self, x, y, p_x, p_y); } void iwc2radec(double u, double v, double *p_ra, double *p_dec) { tan_iwc2radec($self, u, v, p_ra, p_dec); } int radec2iwc(double ra, double dec, double *p_x, double *p_y) { return tan_radec2iwc($self, ra, dec, p_x, p_y); } int xyz2pixelxy(double x, double y, double z, double *p_x, double *p_y) { double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return tan_xyzarr2pixelxy($self, xyz, p_x, p_y); } int write_to(const char* filename) { return tan_write_to_file($self, filename); } void set_crval(double ra, double dec) { $self->crval[0] = ra; $self->crval[1] = dec; } void set_crpix(double x, double y) { $self->crpix[0] = x; $self->crpix[1] = y; } void set_cd(double cd11, double cd12, double cd21, double cd22) { $self->cd[0][0] = cd11; $self->cd[0][1] = cd12; $self->cd[1][0] = cd21; $self->cd[1][1] = cd22; } void set_imagesize(double w, double h) { $self->imagew = w; $self->imageh = h; } /* double* get_cd_matrix() { return $self->cd; } */ }; %inline %{ // Wrapper on coadd_add_image that accepts numpy arrays. static int coadd_add_numpy(coadd_t* c, PyObject* np_img, PyObject* np_weight, float fweight, const anwcs_t* wcs) { PyArray_Descr* dtype = PyArray_DescrFromType(NPY_FLOAT); // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; float *img, *weight; Py_INCREF(dtype); np_img = PyArray_CheckFromAny(np_img, dtype, 2, 2, req, NULL); img = PyArray_DATA(np_img); if (!np_img) { ERR("Failed to PyArray_FromAny the image\n"); Py_XDECREF(np_img); Py_DECREF(dtype); return -1; } if (np_weight == Py_None) { weight = NULL; } else { Py_INCREF(dtype); np_weight = PyArray_CheckFromAny(np_weight, dtype, 2, 2, req, NULL); if (!np_weight) { ERR("Failed to PyArray_FromAny the weight\n"); Py_XDECREF(np_weight); Py_DECREF(dtype); return -1; } weight = PyArray_DATA(np_weight); } int rtn = coadd_add_image(c, img, weight, fweight, wcs); Py_DECREF(np_img); if (weight) { Py_DECREF(np_weight); } Py_DECREF(dtype); return rtn; } static PyObject* coadd_get_snapshot_numpy(coadd_t* co, float badpix) { npy_intp dim[2]; PyObject* npimg; dim[0] = co->H; dim[1] = co->W; npimg = PyArray_EMPTY(2, dim, NPY_FLOAT, 0); coadd_get_snapshot(co, PyArray_DATA(npimg), badpix); return npimg; } static sip_t* fit_sip_wcs_py(PyObject* np_starxyz, PyObject* np_fieldxy, PyObject* np_weights, tan_t* tanin, int sip_order, int inv_order) { PyArray_Descr* dtype = PyArray_DescrFromType(NPY_DOUBLE); // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; Py_INCREF(dtype); np_starxyz = PyArray_CheckFromAny(np_starxyz, dtype, 2, 2, req, NULL); Py_INCREF(dtype); np_fieldxy = PyArray_CheckFromAny(np_fieldxy, dtype, 2, 2, req, NULL); if ((np_starxyz == Py_None) || (np_fieldxy == Py_None)) { Py_DECREF(dtype); Py_DECREF(dtype); printf("Failed to convert starxyz or fieldxy to numpy double arrays\n"); return NULL; } if (np_weights != Py_None) { Py_INCREF(dtype); np_weights = PyArray_CheckFromAny(np_weights, dtype, 1, 1, req,NULL); if (np_weights == Py_None) { Py_DECREF(dtype); printf("Failed to convert weights to numpy double array\n"); return NULL; } } Py_DECREF(dtype); dtype = NULL; int M = (int)PyArray_DIM(np_starxyz, 0); if (PyArray_DIM(np_fieldxy, 0) != M) { printf("Expected starxyz and fieldxy to have the same length\n"); return NULL; } if ((np_weights != Py_None) && (PyArray_DIM(np_weights, 0) != M)) { printf("Expected starxyz and weights to have the same length\n"); return NULL; } if ((PyArray_DIM(np_starxyz, 1) != 3) || (PyArray_DIM(np_fieldxy, 1) != 2)) { printf("Expected starxyz Mx3 and fieldxy Mx2\n"); return NULL; } sip_t* sipout = calloc(1, sizeof(sip_t)); double* weights = NULL; if (np_weights != Py_None) weights = PyArray_DATA(np_weights); int doshift = 1; int rtn = fit_sip_wcs(PyArray_DATA(np_starxyz), PyArray_DATA(np_fieldxy), weights, M, tanin, sip_order, inv_order, doshift, sipout); if (rtn) { free(sipout); printf("fit_sip_wcs() returned %i\n", rtn); return NULL; } return sipout; } %} %inline %{ typedef anbool (*f_2to2ok)(const void*, double, double, double*, double*); typedef void (*f_2to2) (const void*, double, double, double*, double*); typedef int (*f_2to2i) (const void*, double, double, double*, double*); static PyObject* broadcast_2to2ok ( //anbool func(const void*, double, double, double*, double*), f_2to2ok func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* broadcast_2to2 ( //void func(const void*, double, double, double*, double*), f_2to2 func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* broadcast_2to2i ( //int func(const void*, double, double, double*, double*), f_2to2i func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* tan_rd2xy_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)tan_radec2pixelxy, wcs, in1, in2); } static PyObject* sip_rd2xy_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)sip_radec2pixelxy, wcs, in1, in2); } static PyObject* anwcs_rd2xy_wrapper(const anwcs_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2i((f_2to2i)anwcs_radec2pixelxy, wcs, in1, in2); } static PyObject* tan_iwc2xy_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_iwc2pixelxy, wcs, in1, in2); } static PyObject* sip_iwc2xy_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_iwc2pixelxy, wcs, in1, in2); } static PyObject* tan_xy2iwc_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_pixelxy2iwc, wcs, in1, in2); } static PyObject* sip_xy2iwc_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_pixelxy2iwc, wcs, in1, in2); } static PyObject* tan_iwc2rd_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_iwc2radec, wcs, in1, in2); } static PyObject* sip_iwc2rd_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_iwc2radec, wcs, in1, in2); } static PyObject* tan_rd2iwc_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)tan_radec2iwc, wcs, in1, in2); } static PyObject* sip_rd2iwc_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)sip_radec2iwc, wcs, in1, in2); } static PyObject* tan_xy2rd_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_pixelxy2radec, wcs, in1, in2); } static PyObject* sip_xy2rd_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_pixelxy2radec, wcs, in1, in2); } static PyObject* anwcs_xy2rd_wrapper(const anwcs_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2i((f_2to2i)anwcs_pixelxy2radec, wcs, in1, in2); } static PyObject* broadcast_2to2ok ( //anbool func(const void*, double, double, double*, double*), f_2to2ok func, const void* baton, PyObject* in1, PyObject* in2) { NpyIter *iter = NULL; NpyIter_IterNextFunc *iternext; PyArrayObject *op[5]; PyObject *ret; npy_uint32 flags; npy_uint32 op_flags[5]; npy_intp *innersizeptr; char **dataptrarray; npy_intp* strideptr; PyArray_Descr* dtypes[5]; npy_intp i, N; // we'll do the inner loop ourselves flags = NPY_ITER_EXTERNAL_LOOP; // use buffers to satisfy dtype casts flags |= NPY_ITER_BUFFERED; // grow inner loop flags |= NPY_ITER_GROWINNER; op[0] = (PyArrayObject*)PyArray_FromAny(in1, NULL, 0, 0, 0, NULL); op[1] = (PyArrayObject*)PyArray_FromAny(in2, NULL, 0, 0, 0, NULL); // automatically allocate the output arrays. op[2] = NULL; op[3] = NULL; op[4] = NULL; if ((PyArray_Size((PyObject*)op[0]) == 0) || (PyArray_Size((PyObject*)op[1]) == 0)) { // empty inputs -- empty outputs npy_intp dim = 0; ret = Py_BuildValue("(NNN)", PyArray_SimpleNew(1, &dim, NPY_BOOL), PyArray_SimpleNew(1, &dim, NPY_DOUBLE), PyArray_SimpleNew(1, &dim, NPY_DOUBLE)); goto cleanup; } op_flags[0] = NPY_ITER_READONLY | NPY_ITER_NBO; op_flags[1] = NPY_ITER_READONLY | NPY_ITER_NBO; op_flags[2] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; op_flags[3] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; op_flags[4] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; dtypes[0] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[1] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[2] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[3] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[4] = PyArray_DescrFromType(NPY_BOOL); iter = NpyIter_MultiNew(5, op, flags, NPY_KEEPORDER, NPY_SAFE_CASTING, op_flags, dtypes); for (i=0; i<5; i++) Py_DECREF(dtypes[i]); if (!iter) return NULL; iternext = NpyIter_GetIterNext(iter, NULL); strideptr = NpyIter_GetInnerStrideArray(iter); // The inner loop size and data pointers may change during the // loop, so just cache the addresses. innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); dataptrarray = NpyIter_GetDataPtrArray(iter); do { // are the inputs contiguous? (Outputs will be, since we // allocated them) if ((strideptr[0] == sizeof(double)) && (strideptr[1] == sizeof(double))) { // printf("Contiguous inputs; going fast\n"); double* din1 = (double*)(dataptrarray[0]); double* din2 = (double*)(dataptrarray[1]); double* dout1 = (double*)(dataptrarray[2]); double* dout2 = (double*)(dataptrarray[3]); char* ok = dataptrarray[4]; N = *innersizeptr; while (N--) { *ok = func(baton, *din1, *din2, dout1, dout2); ok++; din1++; din2++; dout1++; dout2++; } } else { // printf("Non-contiguous inputs; going slow\n"); npy_intp stride1 = strideptr[0]; npy_intp stride2 = strideptr[1]; npy_intp size = *innersizeptr; char* src1 = dataptrarray[0]; char* src2 = dataptrarray[1]; double* dout1 = (double*)dataptrarray[2]; double* dout2 = (double*)dataptrarray[3]; char* ok = dataptrarray[4]; for (i=0; i= H || xi < 0 || xi >= W) { printf("Warning: skipping out-of-range value: i=%i, xi,yi = %i,%i\n", i, xi, yi); } else { counts[yi*W + xi]++; } px++; py++; } Py_DECREF(np_counts); Py_DECREF(np_x); Py_DECREF(np_y); return 0; } %} %pythoncode %{ import numpy as np def tan_t_tostring(self): ct = 'SIN' if self.sin else 'TAN' return ('%s: crpix (%.1f, %.1f), crval (%g, %g), cd (%g, %g, %g, %g), image %g x %g' % (ct, self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], self.cd[0], self.cd[1], self.cd[2], self.cd[3], self.imagew, self.imageh)) tan_t.__str__ = tan_t_tostring def tan_t_addtoheader(self, hdr): '''Adds this TAN WCS header to the given fitsio header''' hdr.add_record(dict(name='CTYPE1', value='RA---TAN', comment='TANgent plane')) hdr.add_record(dict(name='CTYPE2', value='DEC--TAN', comment='TANgent plane')) hdr.add_record(dict(name='CRVAL1', value=self.crval[0], comment='Reference RA')) hdr.add_record(dict(name='CRVAL2', value=self.crval[1], comment='Reference Dec')) hdr.add_record(dict(name='CRPIX1', value=self.crpix[0], comment='Reference x')) hdr.add_record(dict(name='CRPIX2', value=self.crpix[1], comment='Reference y')) hdr.add_record(dict(name='CD1_1', value=self.cd[0], comment='CD matrix')) hdr.add_record(dict(name='CD1_2', value=self.cd[1], comment='CD matrix')) hdr.add_record(dict(name='CD2_1', value=self.cd[2], comment='CD matrix')) hdr.add_record(dict(name='CD2_2', value=self.cd[3], comment='CD matrix')) hdr.add_record(dict(name='IMAGEW', value=self.imagew, comment='Image width')) hdr.add_record(dict(name='IMAGEH', value=self.imageh, comment='Image height')) tan_t.add_to_header = tan_t_addtoheader ## picklable? def tan_t_getstate(self): return (self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], self.cd[0], self.cd[1], self.cd[2], self.cd[3], self.imagew, self.imageh, self.sin) def tan_t_setstate(self, state): #print 'setstate: self', self, 'state', state #print 'state', state self.this = _util.new_tan_t() #print 'self', repr(self) p0,p1,v0,v1,cd0,cd1,cd2,cd3,w,h,sin = state self.set_crpix(p0,p1) self.set_crval(v0,v1) self.set_cd(cd0,cd1,cd2,cd3) self.set_imagesize(w,h) self.sin = sin #(self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], #self.cd[0], self.cd[1], self.cd[2], self.cd[3], #self.imagew, self.imageh) = state def tan_t_getnewargs(self): return () tan_t.__getstate__ = tan_t_getstate tan_t.__setstate__ = tan_t_setstate tan_t.__getnewargs__ = tan_t_getnewargs def tan_t_getshape(self): return int(self.imageh), int(self.imagew) tan_t.shape = property(tan_t_getshape) def tan_t_get_cd(self): cd = self.cd return (cd[0], cd[1], cd[2], cd[3]) tan_t.get_cd = tan_t_get_cd def tan_t_pixelxy2radec(self, x, y): return tan_xy2rd_wrapper(self.this, x, y) tan_t.pixelxy2radec_single = tan_t.pixelxy2radec tan_t.pixelxy2radec = tan_t_pixelxy2radec def tan_t_radec2pixelxy(self, r, d): return tan_rd2xy_wrapper(self.this, r, d) tan_t.radec2pixelxy_single = tan_t.radec2pixelxy tan_t.radec2pixelxy = tan_t_radec2pixelxy def tan_t_iwc2pixelxy(self, r, d): return tan_iwc2xy_wrapper(self.this, r, d) tan_t.iwc2pixelxy_single = tan_t.iwc2pixelxy tan_t.iwc2pixelxy = tan_t_iwc2pixelxy def tan_t_pixelxy2iwc(self, x,y): return tan_xy2iwc_wrapper(self.this, x,y) tan_t.pixelxy2iwc_single = tan_t.pixelxy2iwc tan_t.pixelxy2iwc = tan_t_pixelxy2iwc def tan_t_radec2iwc(self, r, d): return tan_rd2iwc_wrapper(self.this, r, d) tan_t.radec2iwc_single = tan_t.radec2iwc tan_t.radec2iwc = tan_t_radec2iwc def tan_t_iwc2radec(self, u, v): return tan_iwc2rd_wrapper(self.this, u, v) tan_t.iwc2radec_single = tan_t.iwc2radec tan_t.iwc2radec = tan_t_iwc2radec def sip_t_pixelxy2radec(self, x, y): return sip_xy2rd_wrapper(self.this, x, y) sip_t.pixelxy2radec_single = sip_t.pixelxy2radec sip_t.pixelxy2radec = sip_t_pixelxy2radec def sip_t_radec2pixelxy(self, r, d): return sip_rd2xy_wrapper(self.this, r, d) sip_t.radec2pixelxy_single = sip_t.radec2pixelxy sip_t.radec2pixelxy = sip_t_radec2pixelxy def sip_t_iwc2pixelxy(self, r, d): return sip_iwc2xy_wrapper(self.this, r, d) sip_t.iwc2pixelxy_single = sip_t.iwc2pixelxy sip_t.iwc2pixelxy = sip_t_iwc2pixelxy def sip_t_pixelxy2iwc(self, x,y): return sip_xy2iwc_wrapper(self.this, x,y) sip_t.pixelxy2iwc_single = sip_t.pixelxy2iwc sip_t.pixelxy2iwc = sip_t_pixelxy2iwc def sip_t_radec2iwc(self, r, d): return sip_rd2iwc_wrapper(self.this, r, d) sip_t.radec2iwc_single = sip_t.radec2iwc sip_t.radec2iwc = sip_t_radec2iwc def sip_t_iwc2radec(self, u, v): return sip_iwc2rd_wrapper(self.this, u, v) sip_t.iwc2radec_single = sip_t.iwc2radec sip_t.iwc2radec = sip_t_iwc2radec def anwcs_t_pixelxy2radec(self, x, y): ok,r,d = anwcs_xy2rd_wrapper(self.this, x, y) return (ok == 0),r,d anwcs_t.pixelxy2radec_single = anwcs_t.pixelxy2radec anwcs_t.pixelxy2radec = anwcs_t_pixelxy2radec def anwcs_t_radec2pixelxy(self, r, d): ok,x,y = anwcs_rd2xy_wrapper(self.this, r, d) return (ok == 0),x,y anwcs_t.radec2pixelxy_single = anwcs_t.radec2pixelxy anwcs_t.radec2pixelxy = anwcs_t_radec2pixelxy def tan_t_radec_bounds(self): W,H = self.imagew, self.imageh r,d = self.pixelxy2radec([1, W/2, W, W, W, W/2, 1, 1], [1, 1, 1, H/2, H, H, H, H/2]) rx = r.max() rn = r.min() # ugh, RA wrap-around. We find the largest value < 180 (ie, near zero) and smallest value > 180 (ie, near 360) # and report them with ralo > rahi so that this case can be identified if rx - rn > 180: rx = r[r < 180].max() rn = r[r > 180].min() return (rn, rx, d.min(), d.max()) tan_t.radec_bounds = tan_t_radec_bounds _real_tan_t_init = tan_t.__init__ def my_tan_t_init(self, *args, **kwargs): # fitsio header: check for '.records()' function. if len(args) == 1 and hasattr(args[0], 'records'): try: hdr = args[0] qhdr = fitsio_to_qfits_header(hdr) args = [qhdr] except: pass _real_tan_t_init(self, *args, **kwargs) if self.this is None: raise RuntimeError('Duck punch!') tan_t.__init__ = my_tan_t_init Tan = tan_t def tan_t_get_subimage(self, x0, y0, w, h): wcs2 = tan_t(self) cpx,cpy = wcs2.crpix wcs2.set_crpix(cpx - x0, cpy - y0) wcs2.set_width(float(w)) wcs2.set_height(float(h)) return wcs2 tan_t.get_subimage = tan_t_get_subimage # Deja Vu! # def sip_t_get_subimage(self, xlo, xhi, ylo, yhi): # sipout = sip_t(self) # sip_shift(self.this, sipout.this, float(xlo), float(xhi), float(ylo), float(yhi)) # return sipout # sip_t.get_subimage = sip_t_get_subimage # picklable def sip_t_getstate(self): t = (self.wcstan.__getstate__(), self.a_order, self.b_order, self.a, self.b, self.ap_order, self.bp_order, self.ap, self.bp) return t def sip_t_setstate(self, s): self.this = _util.new_sip_t() (t, self.a_order, self.b_order, self.a, self.b, self.ap_order, self.bp_order, self.ap, self.bp) = s #self.wcstan.__setstate__(t) # disturbingly, tan_t_setstate does not work because it resets self.this = ... p0,p1,v0,v1,cd0,cd1,cd2,cd3,w,h,sin = t self.wcstan.set_crpix(p0,p1) self.wcstan.set_crval(v0,v1) self.wcstan.set_cd(cd0,cd1,cd2,cd3) self.wcstan.set_imagesize(w,h) self.wcstan.sin = sin def sip_t_getnewargs(self): return () sip_t.__getstate__ = sip_t_getstate sip_t.__setstate__ = sip_t_setstate sip_t.__getnewargs__ = sip_t_getnewargs %} %include "fitsioutils.h" // dcen3x3 %apply float *OUTPUT { float *xcen, float *ycen }; %include "dimage.h" %inline %{ int dcen3x3b(float i0, float i1, float i2, float i3, float i4, float i5, float i6, float i7, float i8, float *xcen, float *ycen) { float im[9]; im[0] = i0; im[1] = i1; im[2] = i2; im[3] = i3; im[4] = i4; im[5] = i5; im[6] = i6; im[7] = i7; im[8] = i8; return dcen3x3(im, xcen, ycen); } %} astrometry.net-0.67/util/util.py000644 000765 000024 00000350756 12651446354 017115 0ustar00dstnstaff000000 000000 # This file was automatically generated by SWIG (http://www.swig.org). # Version 3.0.7 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info if version_info >= (2, 6, 0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_util', [dirname(__file__)]) except ImportError: import _util return _util if fp is not None: try: _mod = imp.load_module('_util', fp, pathname, description) finally: fp.close() return _mod _util = swig_import_helper() del swig_import_helper else: import _util del version_info try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self, class_type, name, value, static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'SwigPyObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name, None) if method: return method(self, value) if (not static): if _newclass: object.__setattr__(self, name, value) else: self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self, class_type, name, value): return _swig_setattr_nondynamic(self, class_type, name, value, 0) def _swig_getattr_nondynamic(self, class_type, name, static=1): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name, None) if method: return method(self) if (not static): return object.__getattr__(self, name) else: raise AttributeError(name) def _swig_getattr(self, class_type, name): return _swig_getattr_nondynamic(self, class_type, name, 0) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) try: _object = object _newclass = 1 except AttributeError: class _object: pass _newclass = 0 def log_init(level): return _util.log_init(level) log_init = _util.log_init def log_get_level(): return _util.log_get_level() log_get_level = _util.log_get_level def log_set_level(lvl): return _util.log_set_level(lvl) log_set_level = _util.log_set_level class coadd_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, coadd_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, coadd_t, name) __repr__ = _swig_repr __swig_setmethods__["img"] = _util.coadd_t_img_set __swig_getmethods__["img"] = _util.coadd_t_img_get if _newclass: img = _swig_property(_util.coadd_t_img_get, _util.coadd_t_img_set) __swig_setmethods__["weight"] = _util.coadd_t_weight_set __swig_getmethods__["weight"] = _util.coadd_t_weight_get if _newclass: weight = _swig_property(_util.coadd_t_weight_get, _util.coadd_t_weight_set) __swig_setmethods__["W"] = _util.coadd_t_W_set __swig_getmethods__["W"] = _util.coadd_t_W_get if _newclass: W = _swig_property(_util.coadd_t_W_get, _util.coadd_t_W_set) __swig_setmethods__["H"] = _util.coadd_t_H_set __swig_getmethods__["H"] = _util.coadd_t_H_get if _newclass: H = _swig_property(_util.coadd_t_H_get, _util.coadd_t_H_set) __swig_setmethods__["wcs"] = _util.coadd_t_wcs_set __swig_getmethods__["wcs"] = _util.coadd_t_wcs_get if _newclass: wcs = _swig_property(_util.coadd_t_wcs_get, _util.coadd_t_wcs_set) __swig_setmethods__["resample_func"] = _util.coadd_t_resample_func_set __swig_getmethods__["resample_func"] = _util.coadd_t_resample_func_get if _newclass: resample_func = _swig_property(_util.coadd_t_resample_func_get, _util.coadd_t_resample_func_set) __swig_setmethods__["resample_token"] = _util.coadd_t_resample_token_set __swig_getmethods__["resample_token"] = _util.coadd_t_resample_token_get if _newclass: resample_token = _swig_property(_util.coadd_t_resample_token_get, _util.coadd_t_resample_token_set) def __init__(self): this = _util.new_coadd_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_coadd_t __del__ = lambda self: None coadd_t_swigregister = _util.coadd_t_swigregister coadd_t_swigregister(coadd_t) def coadd_new(W, H): return _util.coadd_new(W, H) coadd_new = _util.coadd_new def coadd_new_from_wcs(wcs): return _util.coadd_new_from_wcs(wcs) coadd_new_from_wcs = _util.coadd_new_from_wcs def coadd_set_lanczos(co, Lorder): return _util.coadd_set_lanczos(co, Lorder) coadd_set_lanczos = _util.coadd_set_lanczos def coadd_add_image(c, img, weightimg, weight, wcs): return _util.coadd_add_image(c, img, weightimg, weight, wcs) coadd_add_image = _util.coadd_add_image def coadd_divide_by_weight(c, badpix): return _util.coadd_divide_by_weight(c, badpix) coadd_divide_by_weight = _util.coadd_divide_by_weight def coadd_get_snapshot(c, outimg, badpix): return _util.coadd_get_snapshot(c, outimg, badpix) coadd_get_snapshot = _util.coadd_get_snapshot def coadd_free(c): return _util.coadd_free(c) coadd_free = _util.coadd_free def coadd_debug(co): return _util.coadd_debug(co) coadd_debug = _util.coadd_debug def coadd_create_weight_image_from_range(img, W, H, lowval, highval): return _util.coadd_create_weight_image_from_range(img, W, H, lowval, highval) coadd_create_weight_image_from_range = _util.coadd_create_weight_image_from_range def coadd_weight_image_mask_value(img, W, H, weight, badval): return _util.coadd_weight_image_mask_value(img, W, H, weight, badval) coadd_weight_image_mask_value = _util.coadd_weight_image_mask_value class lanczos_args_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, lanczos_args_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, lanczos_args_t, name) __repr__ = _swig_repr __swig_setmethods__["order"] = _util.lanczos_args_t_order_set __swig_getmethods__["order"] = _util.lanczos_args_t_order_get if _newclass: order = _swig_property(_util.lanczos_args_t_order_get, _util.lanczos_args_t_order_set) __swig_setmethods__["weighted"] = _util.lanczos_args_t_weighted_set __swig_getmethods__["weighted"] = _util.lanczos_args_t_weighted_get if _newclass: weighted = _swig_property(_util.lanczos_args_t_weighted_get, _util.lanczos_args_t_weighted_set) def __init__(self): this = _util.new_lanczos_args_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_lanczos_args_t __del__ = lambda self: None lanczos_args_t_swigregister = _util.lanczos_args_t_swigregister lanczos_args_t_swigregister(lanczos_args_t) def lanczos(x, order): return _util.lanczos(x, order) lanczos = _util.lanczos def nearest_resample_f(px, py, img, weightimg, W, H, out_wt, token): return _util.nearest_resample_f(px, py, img, weightimg, W, H, out_wt, token) nearest_resample_f = _util.nearest_resample_f def lanczos_resample_f(px, py, img, weightimg, W, H, out_wt, token): return _util.lanczos_resample_f(px, py, img, weightimg, W, H, out_wt, token) lanczos_resample_f = _util.lanczos_resample_f def lanczos_resample_unw_sep_f(px, py, img, W, H, token): return _util.lanczos_resample_unw_sep_f(px, py, img, W, H, token) lanczos_resample_unw_sep_f = _util.lanczos_resample_unw_sep_f def nearest_resample_d(px, py, img, weightimg, W, H, out_wt, token): return _util.nearest_resample_d(px, py, img, weightimg, W, H, out_wt, token) nearest_resample_d = _util.nearest_resample_d def lanczos_resample_d(px, py, img, weightimg, W, H, out_wt, token): return _util.lanczos_resample_d(px, py, img, weightimg, W, H, out_wt, token) lanczos_resample_d = _util.lanczos_resample_d _util.TRUE_swigconstant(_util) TRUE = _util.TRUE _util.FALSE_swigconstant(_util) FALSE = _util.FALSE def fit_sip_coefficients(starxyz, fieldxy, weights, M, tanin1, sip_order, inv_order, sipout): return _util.fit_sip_coefficients(starxyz, fieldxy, weights, M, tanin1, sip_order, inv_order, sipout) fit_sip_coefficients = _util.fit_sip_coefficients def wcs_shift(wcs, xs, ys): return _util.wcs_shift(wcs, xs, ys) wcs_shift = _util.wcs_shift def fit_sip_wcs(starxyz, fieldxy, weights, M, tanin, sip_order, inv_order, doshift, sipout): return _util.fit_sip_wcs(starxyz, fieldxy, weights, M, tanin, sip_order, inv_order, doshift, sipout) fit_sip_wcs = _util.fit_sip_wcs def fit_sip_wcs_2(starxyz, fieldxy, weights, M, sip_order, inv_order, W, H, crpix_center, crpix, doshift, sipout): return _util.fit_sip_wcs_2(starxyz, fieldxy, weights, M, sip_order, inv_order, W, H, crpix_center, crpix, doshift, sipout) fit_sip_wcs_2 = _util.fit_sip_wcs_2 def fit_tan_wcs_move_tangent_point(starxyz, fieldxy, N, crpix, tanin, tanout): return _util.fit_tan_wcs_move_tangent_point(starxyz, fieldxy, N, crpix, tanin, tanout) fit_tan_wcs_move_tangent_point = _util.fit_tan_wcs_move_tangent_point def fit_tan_wcs_move_tangent_point_weighted(starxyz, fieldxy, weights, N, crpix, tanin, tanout): return _util.fit_tan_wcs_move_tangent_point_weighted(starxyz, fieldxy, weights, N, crpix, tanin, tanout) fit_tan_wcs_move_tangent_point_weighted = _util.fit_tan_wcs_move_tangent_point_weighted def fit_tan_wcs(starxyz, fieldxy, nobjs, wcstan, p_scale): return _util.fit_tan_wcs(starxyz, fieldxy, nobjs, wcstan, p_scale) fit_tan_wcs = _util.fit_tan_wcs def fit_tan_wcs_weighted(starxyz, fieldxy, weights, N, tan, p_scale): return _util.fit_tan_wcs_weighted(starxyz, fieldxy, weights, N, tan, p_scale) fit_tan_wcs_weighted = _util.fit_tan_wcs_weighted def print_array(arr): return _util.print_array(arr) print_array = _util.print_array def an_hist2d(py_arrx, py_arry, py_hist, xlo, xhi, ylo, yhi): return _util.an_hist2d(py_arrx, py_arry, py_hist, xlo, xhi, ylo, yhi) an_hist2d = _util.an_hist2d def flat_percentile_f(np_arr, pct): return _util.flat_percentile_f(np_arr, pct) flat_percentile_f = _util.flat_percentile_f def flat_median_f(np_arr): return _util.flat_median_f(np_arr) flat_median_f = _util.flat_median_f def median_smooth(np_image, np_mask, halfbox, np_smooth): return _util.median_smooth(np_image, np_mask, halfbox, np_smooth) median_smooth = _util.median_smooth _util.L_swigconstant(_util) L = _util.L def lanczos5_interpolate(np_ixi, np_iyi, np_dx, np_dy, loutputs, linputs): return _util.lanczos5_interpolate(np_ixi, np_iyi, np_dx, np_dy, loutputs, linputs) lanczos5_interpolate = _util.lanczos5_interpolate def lanczos3_interpolate(np_ixi, np_iyi, np_dx, np_dy, loutputs, linputs): return _util.lanczos3_interpolate(np_ixi, np_iyi, np_dx, np_dy, loutputs, linputs) lanczos3_interpolate = _util.lanczos3_interpolate def lanczos3_filter(np_dx, np_f): return _util.lanczos3_filter(np_dx, np_f) lanczos3_filter = _util.lanczos3_filter def lanczos3_filter_table(np_dx, np_f, rangecheck): return _util.lanczos3_filter_table(np_dx, np_f, rangecheck) lanczos3_filter_table = _util.lanczos3_filter_table def lanczos_shift_image_c(np_img, np_weight, np_outimg, np_outweight, order, dx, dy): return _util.lanczos_shift_image_c(np_img, np_weight, np_outimg, np_outweight, order, dx, dy) lanczos_shift_image_c = _util.lanczos_shift_image_c def lanczos_shift_image(img, dx, dy, order=3, weight=None, outimg=None, outweight=None): img = img.astype(float) if weight is not None: weight = weight.astype(float) assert(img.shape == weight.shape) if outimg is None: outimg = np.zeros_like(img) if outweight is not None: assert(outweight.shape == img.shape) # print 'outweight:', outweight lanczos_shift_image_c(img, weight, outimg, outweight, order, dx, dy) if outweight is None: return outimg return outimg,outweight _util.DEFAULT_INDEX_JITTER_swigconstant(_util) DEFAULT_INDEX_JITTER = _util.DEFAULT_INDEX_JITTER class index_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, index_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, index_t, name) __repr__ = _swig_repr __swig_setmethods__["codekd"] = _util.index_t_codekd_set __swig_getmethods__["codekd"] = _util.index_t_codekd_get if _newclass: codekd = _swig_property(_util.index_t_codekd_get, _util.index_t_codekd_set) __swig_setmethods__["quads"] = _util.index_t_quads_set __swig_getmethods__["quads"] = _util.index_t_quads_get if _newclass: quads = _swig_property(_util.index_t_quads_get, _util.index_t_quads_set) __swig_setmethods__["starkd"] = _util.index_t_starkd_set __swig_getmethods__["starkd"] = _util.index_t_starkd_get if _newclass: starkd = _swig_property(_util.index_t_starkd_get, _util.index_t_starkd_set) __swig_setmethods__["fits"] = _util.index_t_fits_set __swig_getmethods__["fits"] = _util.index_t_fits_get if _newclass: fits = _swig_property(_util.index_t_fits_get, _util.index_t_fits_set) __swig_setmethods__["codefn"] = _util.index_t_codefn_set __swig_getmethods__["codefn"] = _util.index_t_codefn_get if _newclass: codefn = _swig_property(_util.index_t_codefn_get, _util.index_t_codefn_set) __swig_setmethods__["quadfn"] = _util.index_t_quadfn_set __swig_getmethods__["quadfn"] = _util.index_t_quadfn_get if _newclass: quadfn = _swig_property(_util.index_t_quadfn_get, _util.index_t_quadfn_set) __swig_setmethods__["starfn"] = _util.index_t_starfn_set __swig_getmethods__["starfn"] = _util.index_t_starfn_get if _newclass: starfn = _swig_property(_util.index_t_starfn_get, _util.index_t_starfn_set) __swig_setmethods__["indexname"] = _util.index_t_indexname_set __swig_getmethods__["indexname"] = _util.index_t_indexname_get if _newclass: indexname = _swig_property(_util.index_t_indexname_get, _util.index_t_indexname_set) __swig_setmethods__["indexid"] = _util.index_t_indexid_set __swig_getmethods__["indexid"] = _util.index_t_indexid_get if _newclass: indexid = _swig_property(_util.index_t_indexid_get, _util.index_t_indexid_set) __swig_setmethods__["healpix"] = _util.index_t_healpix_set __swig_getmethods__["healpix"] = _util.index_t_healpix_get if _newclass: healpix = _swig_property(_util.index_t_healpix_get, _util.index_t_healpix_set) __swig_setmethods__["hpnside"] = _util.index_t_hpnside_set __swig_getmethods__["hpnside"] = _util.index_t_hpnside_get if _newclass: hpnside = _swig_property(_util.index_t_hpnside_get, _util.index_t_hpnside_set) __swig_setmethods__["index_jitter"] = _util.index_t_index_jitter_set __swig_getmethods__["index_jitter"] = _util.index_t_index_jitter_get if _newclass: index_jitter = _swig_property(_util.index_t_index_jitter_get, _util.index_t_index_jitter_set) __swig_setmethods__["cutnside"] = _util.index_t_cutnside_set __swig_getmethods__["cutnside"] = _util.index_t_cutnside_get if _newclass: cutnside = _swig_property(_util.index_t_cutnside_get, _util.index_t_cutnside_set) __swig_setmethods__["cutnsweep"] = _util.index_t_cutnsweep_set __swig_getmethods__["cutnsweep"] = _util.index_t_cutnsweep_get if _newclass: cutnsweep = _swig_property(_util.index_t_cutnsweep_get, _util.index_t_cutnsweep_set) __swig_setmethods__["cutdedup"] = _util.index_t_cutdedup_set __swig_getmethods__["cutdedup"] = _util.index_t_cutdedup_get if _newclass: cutdedup = _swig_property(_util.index_t_cutdedup_get, _util.index_t_cutdedup_set) __swig_setmethods__["cutband"] = _util.index_t_cutband_set __swig_getmethods__["cutband"] = _util.index_t_cutband_get if _newclass: cutband = _swig_property(_util.index_t_cutband_get, _util.index_t_cutband_set) __swig_setmethods__["cutmargin"] = _util.index_t_cutmargin_set __swig_getmethods__["cutmargin"] = _util.index_t_cutmargin_get if _newclass: cutmargin = _swig_property(_util.index_t_cutmargin_get, _util.index_t_cutmargin_set) __swig_setmethods__["circle"] = _util.index_t_circle_set __swig_getmethods__["circle"] = _util.index_t_circle_get if _newclass: circle = _swig_property(_util.index_t_circle_get, _util.index_t_circle_set) __swig_setmethods__["cx_less_than_dx"] = _util.index_t_cx_less_than_dx_set __swig_getmethods__["cx_less_than_dx"] = _util.index_t_cx_less_than_dx_get if _newclass: cx_less_than_dx = _swig_property(_util.index_t_cx_less_than_dx_get, _util.index_t_cx_less_than_dx_set) __swig_setmethods__["meanx_less_than_half"] = _util.index_t_meanx_less_than_half_set __swig_getmethods__["meanx_less_than_half"] = _util.index_t_meanx_less_than_half_get if _newclass: meanx_less_than_half = _swig_property(_util.index_t_meanx_less_than_half_get, _util.index_t_meanx_less_than_half_set) __swig_setmethods__["index_scale_upper"] = _util.index_t_index_scale_upper_set __swig_getmethods__["index_scale_upper"] = _util.index_t_index_scale_upper_get if _newclass: index_scale_upper = _swig_property(_util.index_t_index_scale_upper_get, _util.index_t_index_scale_upper_set) __swig_setmethods__["index_scale_lower"] = _util.index_t_index_scale_lower_set __swig_getmethods__["index_scale_lower"] = _util.index_t_index_scale_lower_get if _newclass: index_scale_lower = _swig_property(_util.index_t_index_scale_lower_get, _util.index_t_index_scale_lower_set) __swig_setmethods__["dimquads"] = _util.index_t_dimquads_set __swig_getmethods__["dimquads"] = _util.index_t_dimquads_get if _newclass: dimquads = _swig_property(_util.index_t_dimquads_get, _util.index_t_dimquads_set) __swig_setmethods__["nstars"] = _util.index_t_nstars_set __swig_getmethods__["nstars"] = _util.index_t_nstars_get if _newclass: nstars = _swig_property(_util.index_t_nstars_get, _util.index_t_nstars_set) __swig_setmethods__["nquads"] = _util.index_t_nquads_set __swig_getmethods__["nquads"] = _util.index_t_nquads_get if _newclass: nquads = _swig_property(_util.index_t_nquads_get, _util.index_t_nquads_set) def __init__(self): this = _util.new_index_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_index_t __del__ = lambda self: None index_t_swigregister = _util.index_t_swigregister index_t_swigregister(index_t) def index_dimquads(indx): return _util.index_dimquads(indx) index_dimquads = _util.index_dimquads def index_overlaps_scale_range(indx, quadlo, quadhi): return _util.index_overlaps_scale_range(indx, quadlo, quadhi) index_overlaps_scale_range = _util.index_overlaps_scale_range def index_is_within_range(indx, ra, dec, radius_deg): return _util.index_is_within_range(indx, ra, dec, radius_deg) index_is_within_range = _util.index_is_within_range def index_get_meta(filename, indx): return _util.index_get_meta(filename, indx) index_get_meta = _util.index_get_meta def index_is_file_index(filename): return _util.index_is_file_index(filename) index_is_file_index = _util.index_is_file_index def index_get_quad_filename(indexname): return _util.index_get_quad_filename(indexname) index_get_quad_filename = _util.index_get_quad_filename def index_get_qidx_filename(indexname): return _util.index_get_qidx_filename(indexname) index_get_qidx_filename = _util.index_get_qidx_filename _util.INDEX_ONLY_LOAD_METADATA_swigconstant(_util) INDEX_ONLY_LOAD_METADATA = _util.INDEX_ONLY_LOAD_METADATA def index_get_quad_dim(index): return _util.index_get_quad_dim(index) index_get_quad_dim = _util.index_get_quad_dim def index_get_code_dim(index): return _util.index_get_code_dim(index) index_get_code_dim = _util.index_get_code_dim def index_nquads(index): return _util.index_nquads(index) index_nquads = _util.index_nquads def index_nstars(index): return _util.index_nstars(index) index_nstars = _util.index_nstars def index_build_from(codekd, quads, starkd): return _util.index_build_from(codekd, quads, starkd) index_build_from = _util.index_build_from def index_load(indexname, flags, dest): return _util.index_load(indexname, flags, dest) index_load = _util.index_load def index_unload(index): return _util.index_unload(index) index_unload = _util.index_unload def index_reload(index): return _util.index_reload(index) index_reload = _util.index_reload def index_close_fds(index): return _util.index_close_fds(index) index_close_fds = _util.index_close_fds def index_close(index): return _util.index_close(index) index_close = _util.index_close def index_free(index): return _util.index_free(index) index_free = _util.index_free def index_get_missing_cut_params(indexid, hpnside, nsweep, dedup, margin, band): return _util.index_get_missing_cut_params(indexid, hpnside, nsweep, dedup, margin, band) index_get_missing_cut_params = _util.index_get_missing_cut_params class quadfile_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, quadfile_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, quadfile_t, name) __repr__ = _swig_repr __swig_setmethods__["numquads"] = _util.quadfile_t_numquads_set __swig_getmethods__["numquads"] = _util.quadfile_t_numquads_get if _newclass: numquads = _swig_property(_util.quadfile_t_numquads_get, _util.quadfile_t_numquads_set) __swig_setmethods__["numstars"] = _util.quadfile_t_numstars_set __swig_getmethods__["numstars"] = _util.quadfile_t_numstars_get if _newclass: numstars = _swig_property(_util.quadfile_t_numstars_get, _util.quadfile_t_numstars_set) __swig_setmethods__["dimquads"] = _util.quadfile_t_dimquads_set __swig_getmethods__["dimquads"] = _util.quadfile_t_dimquads_get if _newclass: dimquads = _swig_property(_util.quadfile_t_dimquads_get, _util.quadfile_t_dimquads_set) __swig_setmethods__["index_scale_upper"] = _util.quadfile_t_index_scale_upper_set __swig_getmethods__["index_scale_upper"] = _util.quadfile_t_index_scale_upper_get if _newclass: index_scale_upper = _swig_property(_util.quadfile_t_index_scale_upper_get, _util.quadfile_t_index_scale_upper_set) __swig_setmethods__["index_scale_lower"] = _util.quadfile_t_index_scale_lower_set __swig_getmethods__["index_scale_lower"] = _util.quadfile_t_index_scale_lower_get if _newclass: index_scale_lower = _swig_property(_util.quadfile_t_index_scale_lower_get, _util.quadfile_t_index_scale_lower_set) __swig_setmethods__["indexid"] = _util.quadfile_t_indexid_set __swig_getmethods__["indexid"] = _util.quadfile_t_indexid_get if _newclass: indexid = _swig_property(_util.quadfile_t_indexid_get, _util.quadfile_t_indexid_set) __swig_setmethods__["healpix"] = _util.quadfile_t_healpix_set __swig_getmethods__["healpix"] = _util.quadfile_t_healpix_get if _newclass: healpix = _swig_property(_util.quadfile_t_healpix_get, _util.quadfile_t_healpix_set) __swig_setmethods__["hpnside"] = _util.quadfile_t_hpnside_set __swig_getmethods__["hpnside"] = _util.quadfile_t_hpnside_get if _newclass: hpnside = _swig_property(_util.quadfile_t_hpnside_get, _util.quadfile_t_hpnside_set) __swig_setmethods__["fb"] = _util.quadfile_t_fb_set __swig_getmethods__["fb"] = _util.quadfile_t_fb_get if _newclass: fb = _swig_property(_util.quadfile_t_fb_get, _util.quadfile_t_fb_set) __swig_setmethods__["quadarray"] = _util.quadfile_t_quadarray_set __swig_getmethods__["quadarray"] = _util.quadfile_t_quadarray_get if _newclass: quadarray = _swig_property(_util.quadfile_t_quadarray_get, _util.quadfile_t_quadarray_set) def __init__(self): this = _util.new_quadfile_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_quadfile_t __del__ = lambda self: None quadfile_t_swigregister = _util.quadfile_t_swigregister quadfile_t_swigregister(quadfile_t) def quadfile_open(fname): return _util.quadfile_open(fname) quadfile_open = _util.quadfile_open def quadfile_open_fits(fits): return _util.quadfile_open_fits(fits) quadfile_open_fits = _util.quadfile_open_fits def quadfile_get_filename(qf): return _util.quadfile_get_filename(qf) quadfile_get_filename = _util.quadfile_get_filename def quadfile_open_for_writing(quadfname): return _util.quadfile_open_for_writing(quadfname) quadfile_open_for_writing = _util.quadfile_open_for_writing def quadfile_open_in_memory(): return _util.quadfile_open_in_memory() quadfile_open_in_memory = _util.quadfile_open_in_memory def quadfile_switch_to_reading(qf): return _util.quadfile_switch_to_reading(qf) quadfile_switch_to_reading = _util.quadfile_switch_to_reading def quadfile_close(qf): return _util.quadfile_close(qf) quadfile_close = _util.quadfile_close def quadfile_check(qf): return _util.quadfile_check(qf) quadfile_check = _util.quadfile_check def quadfile_get_stars(qf, quadid): return _util.quadfile_get_stars(qf, quadid) quadfile_get_stars = _util.quadfile_get_stars def quadfile_write_quad(qf): return _util.quadfile_write_quad(qf) quadfile_write_quad = _util.quadfile_write_quad def quadfile_dimquads(qf): return _util.quadfile_dimquads(qf) quadfile_dimquads = _util.quadfile_dimquads def quadfile_nquads(qf): return _util.quadfile_nquads(qf) quadfile_nquads = _util.quadfile_nquads def quadfile_fix_header(qf): return _util.quadfile_fix_header(qf) quadfile_fix_header = _util.quadfile_fix_header def quadfile_write_header(qf): return _util.quadfile_write_header(qf) quadfile_write_header = _util.quadfile_write_header def quadfile_get_index_scale_upper_arcsec(qf): return _util.quadfile_get_index_scale_upper_arcsec(qf) quadfile_get_index_scale_upper_arcsec = _util.quadfile_get_index_scale_upper_arcsec def quadfile_get_index_scale_lower_arcsec(qf): return _util.quadfile_get_index_scale_lower_arcsec(qf) quadfile_get_index_scale_lower_arcsec = _util.quadfile_get_index_scale_lower_arcsec def quadfile_get_header(qf): return _util.quadfile_get_header(qf) quadfile_get_header = _util.quadfile_get_header def quadfile_write_header_to(qf, fid): return _util.quadfile_write_header_to(qf, fid) quadfile_write_header_to = _util.quadfile_write_header_to def quadfile_write_all_quads_to(qf, fid): return _util.quadfile_write_all_quads_to(qf, fid) quadfile_write_all_quads_to = _util.quadfile_write_all_quads_to _util.AN_FILETYPE_CODETREE_swigconstant(_util) AN_FILETYPE_CODETREE = _util.AN_FILETYPE_CODETREE _util.CODETREE_NAME_swigconstant(_util) CODETREE_NAME = _util.CODETREE_NAME class codetree_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, codetree_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, codetree_t, name) __repr__ = _swig_repr __swig_setmethods__["tree"] = _util.codetree_t_tree_set __swig_getmethods__["tree"] = _util.codetree_t_tree_get if _newclass: tree = _swig_property(_util.codetree_t_tree_get, _util.codetree_t_tree_set) __swig_setmethods__["header"] = _util.codetree_t_header_set __swig_getmethods__["header"] = _util.codetree_t_header_get if _newclass: header = _swig_property(_util.codetree_t_header_get, _util.codetree_t_header_set) __swig_setmethods__["inverse_perm"] = _util.codetree_t_inverse_perm_set __swig_getmethods__["inverse_perm"] = _util.codetree_t_inverse_perm_get if _newclass: inverse_perm = _swig_property(_util.codetree_t_inverse_perm_get, _util.codetree_t_inverse_perm_set) def __init__(self): this = _util.new_codetree_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_codetree_t __del__ = lambda self: None codetree_t_swigregister = _util.codetree_t_swigregister codetree_t_swigregister(codetree_t) def codetree_open(fn): return _util.codetree_open(fn) codetree_open = _util.codetree_open def codetree_open_fits(fits): return _util.codetree_open_fits(fits) codetree_open_fits = _util.codetree_open_fits def codetree_get(s, codeid, code): return _util.codetree_get(s, codeid, code) codetree_get = _util.codetree_get def codetree_N(s): return _util.codetree_N(s) codetree_N = _util.codetree_N def codetree_nodes(s): return _util.codetree_nodes(s) codetree_nodes = _util.codetree_nodes def codetree_D(s): return _util.codetree_D(s) codetree_D = _util.codetree_D def codetree_get_permuted(s, index): return _util.codetree_get_permuted(s, index) codetree_get_permuted = _util.codetree_get_permuted def codetree_header(s): return _util.codetree_header(s) codetree_header = _util.codetree_header def codetree_close(s): return _util.codetree_close(s) codetree_close = _util.codetree_close def codetree_new(): return _util.codetree_new() codetree_new = _util.codetree_new def codetree_append_to(s, fid): return _util.codetree_append_to(s, fid) codetree_append_to = _util.codetree_append_to def codetree_write_to_file(s, fn): return _util.codetree_write_to_file(s, fn) codetree_write_to_file = _util.codetree_write_to_file def codetree_write_to_file_flipped(s, fn): return _util.codetree_write_to_file_flipped(s, fn) codetree_write_to_file_flipped = _util.codetree_write_to_file_flipped _util.AN_FILETYPE_STARTREE_swigconstant(_util) AN_FILETYPE_STARTREE = _util.AN_FILETYPE_STARTREE _util.AN_FILETYPE_TAGALONG_swigconstant(_util) AN_FILETYPE_TAGALONG = _util.AN_FILETYPE_TAGALONG _util.STARTREE_NAME_swigconstant(_util) STARTREE_NAME = _util.STARTREE_NAME class startree_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, startree_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, startree_t, name) __repr__ = _swig_repr __swig_setmethods__["tree"] = _util.startree_t_tree_set __swig_getmethods__["tree"] = _util.startree_t_tree_get if _newclass: tree = _swig_property(_util.startree_t_tree_get, _util.startree_t_tree_set) __swig_setmethods__["header"] = _util.startree_t_header_set __swig_getmethods__["header"] = _util.startree_t_header_get if _newclass: header = _swig_property(_util.startree_t_header_get, _util.startree_t_header_set) __swig_setmethods__["inverse_perm"] = _util.startree_t_inverse_perm_set __swig_getmethods__["inverse_perm"] = _util.startree_t_inverse_perm_get if _newclass: inverse_perm = _swig_property(_util.startree_t_inverse_perm_get, _util.startree_t_inverse_perm_set) __swig_setmethods__["sweep"] = _util.startree_t_sweep_set __swig_getmethods__["sweep"] = _util.startree_t_sweep_get if _newclass: sweep = _swig_property(_util.startree_t_sweep_get, _util.startree_t_sweep_set) __swig_setmethods__["writing"] = _util.startree_t_writing_set __swig_getmethods__["writing"] = _util.startree_t_writing_get if _newclass: writing = _swig_property(_util.startree_t_writing_get, _util.startree_t_writing_set) __swig_setmethods__["tagalong"] = _util.startree_t_tagalong_set __swig_getmethods__["tagalong"] = _util.startree_t_tagalong_get if _newclass: tagalong = _swig_property(_util.startree_t_tagalong_get, _util.startree_t_tagalong_set) def __init__(self): this = _util.new_startree_t() try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_startree_t __del__ = lambda self: None startree_t_swigregister = _util.startree_t_swigregister startree_t_swigregister(startree_t) def startree_open(fn): return _util.startree_open(fn) startree_open = _util.startree_open def startree_open_fits(fits): return _util.startree_open_fits(fits) startree_open_fits = _util.startree_open_fits def startree_search_for(s, xyzcenter, radius2, xyzresults, radecresults, starinds, nresults): return _util.startree_search_for(s, xyzcenter, radius2, xyzresults, radecresults, starinds, nresults) startree_search_for = _util.startree_search_for def startree_search_for_radec(s, ra, dec, radius, xyzresults, radecresults, starinds, nresults): return _util.startree_search_for_radec(s, ra, dec, radius, xyzresults, radecresults, starinds, nresults) startree_search_for_radec = _util.startree_search_for_radec def startree_search(s, xyzcenter, radius2, xyzresults, radecresults, nresults): return _util.startree_search(s, xyzcenter, radius2, xyzresults, radecresults, nresults) startree_search = _util.startree_search def startree_get_data_column(s, colname, indices, N): return _util.startree_get_data_column(s, colname, indices, N) startree_get_data_column = _util.startree_get_data_column def startree_get_data_column_int64(s, colname, indices, N): return _util.startree_get_data_column_int64(s, colname, indices, N) startree_get_data_column_int64 = _util.startree_get_data_column_int64 def startree_get_data_column_array(s, colname, indices, N, arraysize): return _util.startree_get_data_column_array(s, colname, indices, N, arraysize) startree_get_data_column_array = _util.startree_get_data_column_array def startree_free_data_column(s, d): return _util.startree_free_data_column(s, d) startree_free_data_column = _util.startree_free_data_column def startree_has_tagalong(s): return _util.startree_has_tagalong(s) startree_has_tagalong = _util.startree_has_tagalong def startree_get_tagalong(s): return _util.startree_get_tagalong(s) startree_get_tagalong = _util.startree_get_tagalong def startree_get_tagalong_column_names(s, lst): return _util.startree_get_tagalong_column_names(s, lst) startree_get_tagalong_column_names = _util.startree_get_tagalong_column_names def startree_get_tagalong_N_columns(s): return _util.startree_get_tagalong_N_columns(s) startree_get_tagalong_N_columns = _util.startree_get_tagalong_N_columns def startree_get_tagalong_column_name(s, i): return _util.startree_get_tagalong_column_name(s, i) startree_get_tagalong_column_name = _util.startree_get_tagalong_column_name def startree_get_tagalong_column_fits_type(s, i): return _util.startree_get_tagalong_column_fits_type(s, i) startree_get_tagalong_column_fits_type = _util.startree_get_tagalong_column_fits_type def startree_get_tagalong_column_array_size(s, i): return _util.startree_get_tagalong_column_array_size(s, i) startree_get_tagalong_column_array_size = _util.startree_get_tagalong_column_array_size def startree_get_cut_nside(s): return _util.startree_get_cut_nside(s) startree_get_cut_nside = _util.startree_get_cut_nside def startree_get_cut_nsweeps(s): return _util.startree_get_cut_nsweeps(s) startree_get_cut_nsweeps = _util.startree_get_cut_nsweeps def startree_get_cut_dedup(s): return _util.startree_get_cut_dedup(s) startree_get_cut_dedup = _util.startree_get_cut_dedup def startree_get_cut_band(s): return _util.startree_get_cut_band(s) startree_get_cut_band = _util.startree_get_cut_band def startree_get_cut_margin(s): return _util.startree_get_cut_margin(s) startree_get_cut_margin = _util.startree_get_cut_margin def startree_get_jitter(s): return _util.startree_get_jitter(s) startree_get_jitter = _util.startree_get_jitter def startree_set_jitter(s, jitter_arcsec): return _util.startree_set_jitter(s, jitter_arcsec) startree_set_jitter = _util.startree_set_jitter def startree_get_sweep(s, ind): return _util.startree_get_sweep(s, ind) startree_get_sweep = _util.startree_get_sweep def startree_N(s): return _util.startree_N(s) startree_N = _util.startree_N def startree_nodes(s): return _util.startree_nodes(s) startree_nodes = _util.startree_nodes def startree_D(s): return _util.startree_D(s) startree_D = _util.startree_D def startree_header(s): return _util.startree_header(s) startree_header = _util.startree_header def startree_get(s, starid, posn): return _util.startree_get(s, starid, posn) startree_get = _util.startree_get def startree_get_radec(s, starid, ra, dec): return _util.startree_get_radec(s, starid, ra, dec) startree_get_radec = _util.startree_get_radec def startree_close(s): return _util.startree_close(s) startree_close = _util.startree_close def startree_compute_inverse_perm(s): return _util.startree_compute_inverse_perm(s) startree_compute_inverse_perm = _util.startree_compute_inverse_perm def startree_check_inverse_perm(s): return _util.startree_check_inverse_perm(s) startree_check_inverse_perm = _util.startree_check_inverse_perm def startree_new(): return _util.startree_new() startree_new = _util.startree_new def startree_write_to_file(s, fn): return _util.startree_write_to_file(s, fn) startree_write_to_file = _util.startree_write_to_file def startree_write_to_file_flipped(s, fn): return _util.startree_write_to_file_flipped(s, fn) startree_write_to_file_flipped = _util.startree_write_to_file_flipped def startree_append_to(s, fid): return _util.startree_append_to(s, fid) startree_append_to = _util.startree_append_to def code_alloc(DC): return _util.code_alloc(DC) code_alloc = _util.code_alloc def code_free(code): return _util.code_free(code) code_free = _util.code_free def code_get(code, i): return _util.code_get(code, i) code_get = _util.code_get def codekd_addr(ind): return _util.codekd_addr(ind) codekd_addr = _util.codekd_addr def starkd_addr(ind): return _util.starkd_addr(ind) starkd_addr = _util.starkd_addr def quadfile_addr(ind): return _util.quadfile_addr(ind) quadfile_addr = _util.quadfile_addr _util.HP_MAX_INT_NSIDE_swigconstant(_util) HP_MAX_INT_NSIDE = _util.HP_MAX_INT_NSIDE def healpix_xy_to_ring(hp, Nside): return _util.healpix_xy_to_ring(hp, Nside) healpix_xy_to_ring = _util.healpix_xy_to_ring def healpix_ring_to_xy(ring_index, Nside): return _util.healpix_ring_to_xy(ring_index, Nside) healpix_ring_to_xy = _util.healpix_ring_to_xy def healpix_xy_to_nested(hp, Nside): return _util.healpix_xy_to_nested(hp, Nside) healpix_xy_to_nested = _util.healpix_xy_to_nested def healpix_nested_to_xy(nested_index, Nside): return _util.healpix_nested_to_xy(nested_index, Nside) healpix_nested_to_xy = _util.healpix_nested_to_xy def healpix_decompose_ring(ring_index, Nside, p_ring_number, p_longitude_index): return _util.healpix_decompose_ring(ring_index, Nside, p_ring_number, p_longitude_index) healpix_decompose_ring = _util.healpix_decompose_ring def healpix_compose_ring(ring, longind, Nside): return _util.healpix_compose_ring(ring, longind, Nside) healpix_compose_ring = _util.healpix_compose_ring def healpix_decompose_xy(finehp, bighp, x, y, Nside): return _util.healpix_decompose_xy(finehp, bighp, x, y, Nside) healpix_decompose_xy = _util.healpix_decompose_xy def healpix_decompose_xyl(finehp, bighp, x, y, Nside): return _util.healpix_decompose_xyl(finehp, bighp, x, y, Nside) healpix_decompose_xyl = _util.healpix_decompose_xyl def healpix_compose_xy(bighp, x, y, Nside): return _util.healpix_compose_xy(bighp, x, y, Nside) healpix_compose_xy = _util.healpix_compose_xy def healpix_compose_xyl(bighp, x, y, Nside): return _util.healpix_compose_xyl(bighp, x, y, Nside) healpix_compose_xyl = _util.healpix_compose_xyl def healpix_convert_xy_nside(x, y, nside, outnside, outx, outy): return _util.healpix_convert_xy_nside(x, y, nside, outnside, outx, outy) healpix_convert_xy_nside = _util.healpix_convert_xy_nside def healpix_convert_nside(hp, nside, outnside, outhp): return _util.healpix_convert_nside(hp, nside, outnside, outhp) healpix_convert_nside = _util.healpix_convert_nside def radectohealpix(ra, dec, Nside): return _util.radectohealpix(ra, dec, Nside) radectohealpix = _util.radectohealpix def radectohealpixf(ra, dec, Nside): return _util.radectohealpixf(ra, dec, Nside) radectohealpixf = _util.radectohealpixf def radectohealpixl(ra, dec, Nside): return _util.radectohealpixl(ra, dec, Nside) radectohealpixl = _util.radectohealpixl def radectohealpixlf(ra, dec, Nside): return _util.radectohealpixlf(ra, dec, Nside) radectohealpixlf = _util.radectohealpixlf def radecdegtohealpix(ra, dec, Nside): return _util.radecdegtohealpix(ra, dec, Nside) radecdegtohealpix = _util.radecdegtohealpix def radecdegtohealpixf(ra, dec, Nside): return _util.radecdegtohealpixf(ra, dec, Nside) radecdegtohealpixf = _util.radecdegtohealpixf def radecdegtohealpixl(ra, dec, Nside): return _util.radecdegtohealpixl(ra, dec, Nside) radecdegtohealpixl = _util.radecdegtohealpixl def radecdegtohealpixlf(ra, dec, Nside): return _util.radecdegtohealpixlf(ra, dec, Nside) radecdegtohealpixlf = _util.radecdegtohealpixlf def xyztohealpix(x, y, z, Nside): return _util.xyztohealpix(x, y, z, Nside) xyztohealpix = _util.xyztohealpix def xyztohealpixl(x, y, z, Nside): return _util.xyztohealpixl(x, y, z, Nside) xyztohealpixl = _util.xyztohealpixl def xyztohealpixf(x, y, z, Nside): return _util.xyztohealpixf(x, y, z, Nside) xyztohealpixf = _util.xyztohealpixf def xyztohealpixlf(x, y, z, Nside): return _util.xyztohealpixlf(x, y, z, Nside) xyztohealpixlf = _util.xyztohealpixlf def xyzarrtohealpix(xyz, Nside): return _util.xyzarrtohealpix(xyz, Nside) xyzarrtohealpix = _util.xyzarrtohealpix def xyzarrtohealpixl(xyz, Nside): return _util.xyzarrtohealpixl(xyz, Nside) xyzarrtohealpixl = _util.xyzarrtohealpixl def xyzarrtohealpixf(xyz, Nside): return _util.xyzarrtohealpixf(xyz, Nside) xyzarrtohealpixf = _util.xyzarrtohealpixf def healpix_to_xyz(hp, Nside, dx, dy): return _util.healpix_to_xyz(hp, Nside, dx, dy) healpix_to_xyz = _util.healpix_to_xyz def healpix_to_xyzarr(hp, Nside, dx, dy, xyz): return _util.healpix_to_xyzarr(hp, Nside, dx, dy, xyz) healpix_to_xyzarr = _util.healpix_to_xyzarr def healpix_to_radec(hp, Nside, dx, dy): return _util.healpix_to_radec(hp, Nside, dx, dy) healpix_to_radec = _util.healpix_to_radec def healpix_to_radecdeg(hp, Nside, dx, dy): return _util.healpix_to_radecdeg(hp, Nside, dx, dy) healpix_to_radecdeg = _util.healpix_to_radecdeg def healpixl_to_radecdeg(hp, Nside, dx, dy): return _util.healpixl_to_radecdeg(hp, Nside, dx, dy) healpixl_to_radecdeg = _util.healpixl_to_radecdeg def healpix_to_radecarr(hp, Nside, dx, dy, radec): return _util.healpix_to_radecarr(hp, Nside, dx, dy, radec) healpix_to_radecarr = _util.healpix_to_radecarr def healpix_to_radecdegarr(hp, Nside, dx, dy, radec): return _util.healpix_to_radecdegarr(hp, Nside, dx, dy, radec) healpix_to_radecdegarr = _util.healpix_to_radecdegarr def healpix_side_length_arcmin(Nside): return _util.healpix_side_length_arcmin(Nside) healpix_side_length_arcmin = _util.healpix_side_length_arcmin def healpix_nside_for_side_length_arcmin(arcmin): return _util.healpix_nside_for_side_length_arcmin(arcmin) healpix_nside_for_side_length_arcmin = _util.healpix_nside_for_side_length_arcmin def healpix_get_neighbours(hp, Nside): return _util.healpix_get_neighbours(hp, Nside) healpix_get_neighbours = _util.healpix_get_neighbours def healpix_get_neighboursl(pix, neighbour, Nside): return _util.healpix_get_neighboursl(pix, neighbour, Nside) healpix_get_neighboursl = _util.healpix_get_neighboursl def healpix_get_neighbours_within_range(xyz, range, healpixes, Nside): return _util.healpix_get_neighbours_within_range(xyz, range, healpixes, Nside) healpix_get_neighbours_within_range = _util.healpix_get_neighbours_within_range def healpix_get_neighbours_within_range_radec(ra, dec, radius, healpixes, Nside): return _util.healpix_get_neighbours_within_range_radec(ra, dec, radius, healpixes, Nside) healpix_get_neighbours_within_range_radec = _util.healpix_get_neighbours_within_range_radec def healpix_distance_to_radec(hp, Nside, ra, dec, closestradec): return _util.healpix_distance_to_radec(hp, Nside, ra, dec, closestradec) healpix_distance_to_radec = _util.healpix_distance_to_radec def healpix_distance_to_xyz(hp, Nside, xyz, closestxyz): return _util.healpix_distance_to_xyz(hp, Nside, xyz, closestxyz) healpix_distance_to_xyz = _util.healpix_distance_to_xyz def healpix_within_range_of_radec(hp, Nside, ra, dec, radius): return _util.healpix_within_range_of_radec(hp, Nside, ra, dec, radius) healpix_within_range_of_radec = _util.healpix_within_range_of_radec def healpix_within_range_of_xyz(hp, Nside, xyz, radius): return _util.healpix_within_range_of_xyz(hp, Nside, xyz, radius) healpix_within_range_of_xyz = _util.healpix_within_range_of_xyz def healpix_radec_bounds(hp, nside): return _util.healpix_radec_bounds(hp, nside) healpix_radec_bounds = _util.healpix_radec_bounds def healpix_rangesearch_xyz(xyz, radius, Nside): return _util.healpix_rangesearch_xyz(xyz, radius, Nside) healpix_rangesearch_xyz = _util.healpix_rangesearch_xyz def healpix_rangesearch_xyz_approx(xyz, radius, Nside): return _util.healpix_rangesearch_xyz_approx(xyz, radius, Nside) healpix_rangesearch_xyz_approx = _util.healpix_rangesearch_xyz_approx def healpix_rangesearch_radec_approx(ra, dec, radius, Nside): return _util.healpix_rangesearch_radec_approx(ra, dec, radius, Nside) healpix_rangesearch_radec_approx = _util.healpix_rangesearch_radec_approx def healpix_rangesearch_radec(ra, dec, radius, Nside): return _util.healpix_rangesearch_radec(ra, dec, radius, Nside) healpix_rangesearch_radec = _util.healpix_rangesearch_radec def healpix_region_search(seed, seeds, Nside, accepted, rejected, accept, token, depth): return _util.healpix_region_search(seed, seeds, Nside, accepted, rejected, accept, token, depth) healpix_region_search = _util.healpix_region_search def anwcs_wcslib_to_string(wcs): return _util.anwcs_wcslib_to_string(wcs) anwcs_wcslib_to_string = _util.anwcs_wcslib_to_string _util.ANWCS_TYPE_WCSLIB_swigconstant(_util) ANWCS_TYPE_WCSLIB = _util.ANWCS_TYPE_WCSLIB _util.ANWCS_TYPE_SIP_swigconstant(_util) ANWCS_TYPE_SIP = _util.ANWCS_TYPE_SIP _util.ANWCS_TYPE_WCSTOOLS_swigconstant(_util) ANWCS_TYPE_WCSTOOLS = _util.ANWCS_TYPE_WCSTOOLS class anwcs_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, anwcs_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, anwcs_t, name) __repr__ = _swig_repr __swig_setmethods__["type"] = _util.anwcs_t_type_set __swig_getmethods__["type"] = _util.anwcs_t_type_get if _newclass: type = _swig_property(_util.anwcs_t_type_get, _util.anwcs_t_type_set) __swig_setmethods__["data"] = _util.anwcs_t_data_set __swig_getmethods__["data"] = _util.anwcs_t_data_get if _newclass: data = _swig_property(_util.anwcs_t_data_get, _util.anwcs_t_data_set) def __init__(self, fn, ext=0, slen=0): this = _util.new_anwcs_t(fn, ext, slen) try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_anwcs_t __del__ = lambda self: None def pixel_scale(self): return _util.anwcs_t_pixel_scale(self) def get_center(self): return _util.anwcs_t_get_center(self) def get_radius(self): return _util.anwcs_t_get_radius(self) def is_inside(self, ra, dec): return _util.anwcs_t_is_inside(self, ra, dec) def get_width(self): return _util.anwcs_t_get_width(self) def get_height(self): return _util.anwcs_t_get_height(self) def set_width(self, W): return _util.anwcs_t_set_width(self, W) def set_height(self, H): return _util.anwcs_t_set_height(self, H) def pixelxy2radec(self, x, y): return _util.anwcs_t_pixelxy2radec(self, x, y) def radec2pixelxy(self, ra, dec): return _util.anwcs_t_radec2pixelxy(self, ra, dec) def write_to(self, filename): return _util.anwcs_t_write_to(self, filename) anwcs_t_swigregister = _util.anwcs_t_swigregister anwcs_t_swigregister(anwcs_t) def anwcs_walk_outline(wcs, path, fill): return _util.anwcs_walk_outline(wcs, path, fill) anwcs_walk_outline = _util.anwcs_walk_outline def anwcs_wcslib_from_string(str, len): return _util.anwcs_wcslib_from_string(str, len) anwcs_wcslib_from_string = _util.anwcs_wcslib_from_string def anwcs_open(filename, ext): return _util.anwcs_open(filename, ext) anwcs_open = _util.anwcs_open def anwcs_open_wcslib(filename, ext): return _util.anwcs_open_wcslib(filename, ext) anwcs_open_wcslib = _util.anwcs_open_wcslib def anwcs_open_wcstools(filename, ext): return _util.anwcs_open_wcstools(filename, ext) anwcs_open_wcstools = _util.anwcs_open_wcstools def anwcs_wcstools_from_string(str, len): return _util.anwcs_wcstools_from_string(str, len) anwcs_wcstools_from_string = _util.anwcs_wcstools_from_string def anwcs_open_sip(filename, ext): return _util.anwcs_open_sip(filename, ext) anwcs_open_sip = _util.anwcs_open_sip def anwcs_open_tan(filename, ext): return _util.anwcs_open_tan(filename, ext) anwcs_open_tan = _util.anwcs_open_tan def anwcs_new_sip(sip): return _util.anwcs_new_sip(sip) anwcs_new_sip = _util.anwcs_new_sip def anwcs_new_tan(tan): return _util.anwcs_new_tan(tan) anwcs_new_tan = _util.anwcs_new_tan def anwcs_create_box(ra, dec, width, W, H): return _util.anwcs_create_box(ra, dec, width, W, H) anwcs_create_box = _util.anwcs_create_box def anwcs_create_box_upsidedown(ra, dec, width, W, H): return _util.anwcs_create_box_upsidedown(ra, dec, width, W, H) anwcs_create_box_upsidedown = _util.anwcs_create_box_upsidedown def anwcs_create_mercator(refra, refdec, zoomfactor, W, H, yflip): return _util.anwcs_create_mercator(refra, refdec, zoomfactor, W, H, yflip) anwcs_create_mercator = _util.anwcs_create_mercator def anwcs_create_mercator_2(refra, refdec, crpix1, crpix2, zoomfactor, W, H, yflip): return _util.anwcs_create_mercator_2(refra, refdec, crpix1, crpix2, zoomfactor, W, H, yflip) anwcs_create_mercator_2 = _util.anwcs_create_mercator_2 def anwcs_create_hammer_aitoff(refra, refdec, zoomfactor, W, H, yflip): return _util.anwcs_create_hammer_aitoff(refra, refdec, zoomfactor, W, H, yflip) anwcs_create_hammer_aitoff = _util.anwcs_create_hammer_aitoff def anwcs_create_allsky_hammer_aitoff(refra, refdec, W, H): return _util.anwcs_create_allsky_hammer_aitoff(refra, refdec, W, H) anwcs_create_allsky_hammer_aitoff = _util.anwcs_create_allsky_hammer_aitoff def anwcs_create_allsky_hammer_aitoff2(refra, refdec, W, H): return _util.anwcs_create_allsky_hammer_aitoff2(refra, refdec, W, H) anwcs_create_allsky_hammer_aitoff2 = _util.anwcs_create_allsky_hammer_aitoff2 def anwcs_write(wcs, filename): return _util.anwcs_write(wcs, filename) anwcs_write = _util.anwcs_write def anwcs_write_to(wcs, fid): return _util.anwcs_write_to(wcs, fid) anwcs_write_to = _util.anwcs_write_to def anwcs_add_to_header(wcs, hdr): return _util.anwcs_add_to_header(wcs, hdr) anwcs_add_to_header = _util.anwcs_add_to_header def anwcs_radec2pixelxy(wcs, ra, dec): return _util.anwcs_radec2pixelxy(wcs, ra, dec) anwcs_radec2pixelxy = _util.anwcs_radec2pixelxy def anwcs_pixelxy2radec(wcs, px, py): return _util.anwcs_pixelxy2radec(wcs, px, py) anwcs_pixelxy2radec = _util.anwcs_pixelxy2radec def anwcs_pixelxy2xyz(wcs, px, py): return _util.anwcs_pixelxy2xyz(wcs, px, py) anwcs_pixelxy2xyz = _util.anwcs_pixelxy2xyz def anwcs_xyz2pixelxy(wcs, xyz, px, py): return _util.anwcs_xyz2pixelxy(wcs, xyz, px, py) anwcs_xyz2pixelxy = _util.anwcs_xyz2pixelxy def anwcs_radec_is_inside_image(wcs, ra, dec): return _util.anwcs_radec_is_inside_image(wcs, ra, dec) anwcs_radec_is_inside_image = _util.anwcs_radec_is_inside_image def anwcs_get_cd_matrix(wcs): return _util.anwcs_get_cd_matrix(wcs) anwcs_get_cd_matrix = _util.anwcs_get_cd_matrix def anwcs_get_radec_bounds(wcs, stepsize): return _util.anwcs_get_radec_bounds(wcs, stepsize) anwcs_get_radec_bounds = _util.anwcs_get_radec_bounds def anwcs_print(wcs, fid): return _util.anwcs_print(wcs, fid) anwcs_print = _util.anwcs_print def anwcs_print_stdout(wcs): return _util.anwcs_print_stdout(wcs) anwcs_print_stdout = _util.anwcs_print_stdout def anwcs_get_radec_center_and_radius(anwcs): return _util.anwcs_get_radec_center_and_radius(anwcs) anwcs_get_radec_center_and_radius = _util.anwcs_get_radec_center_and_radius def anwcs_walk_image_boundary(wcs, stepsize, callback, token): return _util.anwcs_walk_image_boundary(wcs, stepsize, callback, token) anwcs_walk_image_boundary = _util.anwcs_walk_image_boundary def anwcs_find_discontinuity(wcs, ra1, dec1, ra2, dec2, pra3, pdec3, pra4, pdec4): return _util.anwcs_find_discontinuity(wcs, ra1, dec1, ra2, dec2, pra3, pdec3, pra4, pdec4) anwcs_find_discontinuity = _util.anwcs_find_discontinuity def anwcs_is_discontinuous(wcs, ra1, dec1, ra2, dec2): return _util.anwcs_is_discontinuous(wcs, ra1, dec1, ra2, dec2) anwcs_is_discontinuous = _util.anwcs_is_discontinuous def anwcs_walk_discontinuity(wcs, ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4, stepsize, radecs): return _util.anwcs_walk_discontinuity(wcs, ra1, dec1, ra2, dec2, ra3, dec3, ra4, dec4, stepsize, radecs) anwcs_walk_discontinuity = _util.anwcs_walk_discontinuity def anwcs_overlaps(wcs1, wcs2, stepsize): return _util.anwcs_overlaps(wcs1, wcs2, stepsize) anwcs_overlaps = _util.anwcs_overlaps def anwcs_imagew(anwcs): return _util.anwcs_imagew(anwcs) anwcs_imagew = _util.anwcs_imagew def anwcs_imageh(anwcs): return _util.anwcs_imageh(anwcs) anwcs_imageh = _util.anwcs_imageh def anwcs_set_size(anwcs, W, H): return _util.anwcs_set_size(anwcs, W, H) anwcs_set_size = _util.anwcs_set_size def anwcs_scale_wcs(anwcs, scale): return _util.anwcs_scale_wcs(anwcs, scale) anwcs_scale_wcs = _util.anwcs_scale_wcs def anwcs_rotate_wcs(anwcs, angle): return _util.anwcs_rotate_wcs(anwcs, angle) anwcs_rotate_wcs = _util.anwcs_rotate_wcs def anwcs_pixel_scale(anwcs): return _util.anwcs_pixel_scale(anwcs) anwcs_pixel_scale = _util.anwcs_pixel_scale def anwcs_free(wcs): return _util.anwcs_free(wcs) anwcs_free = _util.anwcs_free def anwcs_get_sip(wcs): return _util.anwcs_get_sip(wcs) anwcs_get_sip = _util.anwcs_get_sip anwcs = anwcs_t anwcs.imagew = property(anwcs.get_width, anwcs.set_width, None, 'image width') anwcs.imageh = property(anwcs.get_height, anwcs.set_height, None, 'image height') anwcs.writeto = anwcs.write_to def anwcs_t_get_shape(self): return int(self.get_height()), int(self.get_width()) anwcs_t.get_shape = anwcs_t_get_shape def anwcs_t_set_shape(self, S): H,W = S self.set_height(H) self.set_width(W) anwcs_t.set_shape = anwcs_t_set_shape anwcs_t.shape = property(anwcs_t.get_shape, anwcs_t.set_shape, None, 'image shape') # same API as tan_t anwcs.radec_center = anwcs.get_center anwcs.radius = anwcs.get_radius def anwcs_from_string(s): return anwcs_t(s, -1, len(s)) def anwcs_get_header_string(self): s = anwcs_wcslib_to_string(self) return (s + 'NAXIS = 2' + ' '*69 + 'NAXIS1 = % 20i' % self.imagew + ' '*50 + 'NAXIS2 = % 20i' % self.imageh + ' '*50 + 'END'+' '*77) anwcs.getHeaderString = anwcs_get_header_string def anwcs_radec_bounds(self, stepsize=1000): r0,r1,d0,d1 = anwcs_get_radec_bounds(self, stepsize) return r0,r1,d0,d1 anwcs.radec_bounds = anwcs_radec_bounds def anwcs_get_cd(self): return anwcs_get_cd_matrix(self) anwcs.get_cd = anwcs_get_cd _util.DIM_STARS_swigconstant(_util) DIM_STARS = _util.DIM_STARS _util.DIM_XY_swigconstant(_util) DIM_XY = _util.DIM_XY _util.DQMAX_swigconstant(_util) DQMAX = _util.DQMAX _util.DCMAX_swigconstant(_util) DCMAX = _util.DCMAX def dimquad2dimcode(dimquad): return _util.dimquad2dimcode(dimquad) dimquad2dimcode = _util.dimquad2dimcode _util.ONE_OVER_SIXTY_swigconstant(_util) ONE_OVER_SIXTY = _util.ONE_OVER_SIXTY _util.RAD_PER_DEG_swigconstant(_util) RAD_PER_DEG = _util.RAD_PER_DEG _util.RAD_PER_ARCMIN_swigconstant(_util) RAD_PER_ARCMIN = _util.RAD_PER_ARCMIN _util.RAD_PER_ARCSEC_swigconstant(_util) RAD_PER_ARCSEC = _util.RAD_PER_ARCSEC _util.DEG_PER_RAD_swigconstant(_util) DEG_PER_RAD = _util.DEG_PER_RAD _util.DEG_PER_ARCMIN_swigconstant(_util) DEG_PER_ARCMIN = _util.DEG_PER_ARCMIN _util.DEG_PER_ARCSEC_swigconstant(_util) DEG_PER_ARCSEC = _util.DEG_PER_ARCSEC _util.ARCMIN_PER_RAD_swigconstant(_util) ARCMIN_PER_RAD = _util.ARCMIN_PER_RAD _util.ARCMIN_PER_DEG_swigconstant(_util) ARCMIN_PER_DEG = _util.ARCMIN_PER_DEG _util.ARCMIN_PER_ARCSEC_swigconstant(_util) ARCMIN_PER_ARCSEC = _util.ARCMIN_PER_ARCSEC _util.ARCSEC_PER_RAD_swigconstant(_util) ARCSEC_PER_RAD = _util.ARCSEC_PER_RAD _util.ARCSEC_PER_DEG_swigconstant(_util) ARCSEC_PER_DEG = _util.ARCSEC_PER_DEG _util.ARCSEC_PER_ARCMIN_swigconstant(_util) ARCSEC_PER_ARCMIN = _util.ARCSEC_PER_ARCMIN def rad2deg(x): return _util.rad2deg(x) rad2deg = _util.rad2deg def rad2arcmin(x): return _util.rad2arcmin(x) rad2arcmin = _util.rad2arcmin def rad2arcsec(x): return _util.rad2arcsec(x) rad2arcsec = _util.rad2arcsec def deg2rad(x): return _util.deg2rad(x) deg2rad = _util.deg2rad def deg2arcmin(x): return _util.deg2arcmin(x) deg2arcmin = _util.deg2arcmin def deg2arcsec(x): return _util.deg2arcsec(x) deg2arcsec = _util.deg2arcsec def arcmin2rad(x): return _util.arcmin2rad(x) arcmin2rad = _util.arcmin2rad def arcmin2deg(x): return _util.arcmin2deg(x) arcmin2deg = _util.arcmin2deg def arcmin2arcsec(x): return _util.arcmin2arcsec(x) arcmin2arcsec = _util.arcmin2arcsec def arcsec2rad(x): return _util.arcsec2rad(x) arcsec2rad = _util.arcsec2rad def arcsec2deg(x): return _util.arcsec2deg(x) arcsec2deg = _util.arcsec2deg def arcsec2arcmin(x): return _util.arcsec2arcmin(x) arcsec2arcmin = _util.arcsec2arcmin _util.MJD_JD_OFFSET_swigconstant(_util) MJD_JD_OFFSET = _util.MJD_JD_OFFSET def mjdtojd(mjd): return _util.mjdtojd(mjd) mjdtojd = _util.mjdtojd def jdtomjd(jd): return _util.jdtomjd(jd) jdtomjd = _util.jdtomjd def xy2ra(x, y): return _util.xy2ra(x, y) xy2ra = _util.xy2ra def z2dec(z): return _util.z2dec(z) z2dec = _util.z2dec def atora(str): return _util.atora(str) atora = _util.atora def atodec(str): return _util.atodec(str) atodec = _util.atodec def mag2flux(mag): return _util.mag2flux(mag) mag2flux = _util.mag2flux def radecrange2xyzrange(ralow, declow, rahigh, dechigh, xyzlow, xyzhigh): return _util.radecrange2xyzrange(ralow, declow, rahigh, dechigh, xyzlow, xyzhigh) radecrange2xyzrange = _util.radecrange2xyzrange def radec2xyz(ra, dec, x, y, z): return _util.radec2xyz(ra, dec, x, y, z) radec2xyz = _util.radec2xyz def xyz2radec(x, y, z): return _util.xyz2radec(x, y, z) xyz2radec = _util.xyz2radec def xyzarr2radec(xyz): return _util.xyzarr2radec(xyz) xyzarr2radec = _util.xyzarr2radec def xyzarr2radecarr(xyz, radec): return _util.xyzarr2radecarr(xyz, radec) xyzarr2radecarr = _util.xyzarr2radecarr def radec2xyzarr(ra, dec): return _util.radec2xyzarr(ra, dec) radec2xyzarr = _util.radec2xyzarr def radec2xyzarrmany(xyz, n): return _util.radec2xyzarrmany(xyz, n) radec2xyzarrmany = _util.radec2xyzarrmany def radecdeg2xyz(ra, dec, x, y, z): return _util.radecdeg2xyz(ra, dec, x, y, z) radecdeg2xyz = _util.radecdeg2xyz def xyzarr2radecdeg(xyz): return _util.xyzarr2radecdeg(xyz) xyzarr2radecdeg = _util.xyzarr2radecdeg def xyzarr2radecdegarr(xyz, radec): return _util.xyzarr2radecdegarr(xyz, radec) xyzarr2radecdegarr = _util.xyzarr2radecdegarr def radecdeg2xyzarr(ra, dec): return _util.radecdeg2xyzarr(ra, dec) radecdeg2xyzarr = _util.radecdeg2xyzarr def radecdegarr2xyzarr(radec, xyz): return _util.radecdegarr2xyzarr(radec, xyz) radecdegarr2xyzarr = _util.radecdegarr2xyzarr def radecdeg2xyzarrmany(xyz, n): return _util.radecdeg2xyzarrmany(xyz, n) radecdeg2xyzarrmany = _util.radecdeg2xyzarrmany def radec_derivatives(ra, dec, dra, ddec): return _util.radec_derivatives(ra, dec, dra, ddec) radec_derivatives = _util.radec_derivatives def distsq_between_radecdeg(ra1, dec1, ra2, dec2): return _util.distsq_between_radecdeg(ra1, dec1, ra2, dec2) distsq_between_radecdeg = _util.distsq_between_radecdeg def arcsec_between_radecdeg(ra1, dec1, ra2, dec2): return _util.arcsec_between_radecdeg(ra1, dec1, ra2, dec2) arcsec_between_radecdeg = _util.arcsec_between_radecdeg def deg_between_radecdeg(ra1, dec1, ra2, dec2): return _util.deg_between_radecdeg(ra1, dec1, ra2, dec2) deg_between_radecdeg = _util.deg_between_radecdeg def ra2mercx(ra): return _util.ra2mercx(ra) ra2mercx = _util.ra2mercx def dec2mercy(dec): return _util.dec2mercy(dec) dec2mercy = _util.dec2mercy def ra2hms(ra, h, m, s): return _util.ra2hms(ra, h, m, s) ra2hms = _util.ra2hms def dec2dms(dec, sign, d, m, s): return _util.dec2dms(dec, sign, d, m, s) dec2dms = _util.dec2dms def hms2ra(h, m, s): return _util.hms2ra(h, m, s) hms2ra = _util.hms2ra def dms2dec(sgn, d, m, s): return _util.dms2dec(sgn, d, m, s) dms2dec = _util.dms2dec def ra2hmsstring(ra, str): return _util.ra2hmsstring(ra, str) ra2hmsstring = _util.ra2hmsstring def dec2dmsstring(dec, str): return _util.dec2dmsstring(dec, str) dec2dmsstring = _util.dec2dmsstring def project_hammer_aitoff_x(x, y, z, projx, projy): return _util.project_hammer_aitoff_x(x, y, z, projx, projy) project_hammer_aitoff_x = _util.project_hammer_aitoff_x def project_equal_area(x, y, z, projx, projy): return _util.project_equal_area(x, y, z, projx, projy) project_equal_area = _util.project_equal_area def distsq2arc(dist2): return _util.distsq2arc(dist2) distsq2arc = _util.distsq2arc def distsq2rad(dist2): return _util.distsq2rad(dist2) distsq2rad = _util.distsq2rad def distsq2deg(dist2): return _util.distsq2deg(dist2) distsq2deg = _util.distsq2deg def dist2rad(dist): return _util.dist2rad(dist) dist2rad = _util.dist2rad def distsq2arcsec(dist2): return _util.distsq2arcsec(dist2) distsq2arcsec = _util.distsq2arcsec def dist2arcsec(dist): return _util.dist2arcsec(dist) dist2arcsec = _util.dist2arcsec def rad2distsq(arcInRadians): return _util.rad2distsq(arcInRadians) rad2distsq = _util.rad2distsq def rad2dist(arcInRadians): return _util.rad2dist(arcInRadians) rad2dist = _util.rad2dist def arcsec2distsq(arcInArcSec): return _util.arcsec2distsq(arcInArcSec) arcsec2distsq = _util.arcsec2distsq def arcsec2dist(arcInArcSec): return _util.arcsec2dist(arcInArcSec) arcsec2dist = _util.arcsec2dist def deg2dist(arcInDegrees): return _util.deg2dist(arcInDegrees) deg2dist = _util.deg2dist def deg2distsq(d): return _util.deg2distsq(d) deg2distsq = _util.deg2distsq def arcmin2dist(arcmin): return _util.arcmin2dist(arcmin) arcmin2dist = _util.arcmin2dist def arcmin2distsq(arcmin): return _util.arcmin2distsq(arcmin) arcmin2distsq = _util.arcmin2distsq def dist2deg(dist): return _util.dist2deg(dist) dist2deg = _util.dist2deg _util.HELP_ERR_swigconstant(_util) HELP_ERR = _util.HELP_ERR _util.OPT_ERR_swigconstant(_util) OPT_ERR = _util.OPT_ERR def make_rand_star(star, ramin, ramax, decmin, decmax): return _util.make_rand_star(star, ramin, ramax, decmin, decmax) make_rand_star = _util.make_rand_star def star_coords(s, r, tangent, x, y): return _util.star_coords(s, r, tangent, x, y) star_coords = _util.star_coords def star_midpoint(mid, A, B): return _util.star_midpoint(mid, A, B) star_midpoint = _util.star_midpoint def qfits_header_debug_dump(arg1): return _util.qfits_header_debug_dump(arg1) qfits_header_debug_dump = _util.qfits_header_debug_dump def qfits_header_list(hdr, out): return _util.qfits_header_list(hdr, out) qfits_header_list = _util.qfits_header_list def qfits_header_new(): return _util.qfits_header_new() qfits_header_new = _util.qfits_header_new def qfits_header_default(): return _util.qfits_header_default() qfits_header_default = _util.qfits_header_default def qfits_header_n(arg1): return _util.qfits_header_n(arg1) qfits_header_n = _util.qfits_header_n def qfits_header_add(arg1, arg2, arg3, arg4, arg5): return _util.qfits_header_add(arg1, arg2, arg3, arg4, arg5) qfits_header_add = _util.qfits_header_add def qfits_header_add_after(arg1, arg2, arg3, arg4, arg5, arg6): return _util.qfits_header_add_after(arg1, arg2, arg3, arg4, arg5, arg6) qfits_header_add_after = _util.qfits_header_add_after def qfits_header_append(arg1, arg2, arg3, arg4, arg5): return _util.qfits_header_append(arg1, arg2, arg3, arg4, arg5) qfits_header_append = _util.qfits_header_append def qfits_header_del(arg1, arg2): return _util.qfits_header_del(arg1, arg2) qfits_header_del = _util.qfits_header_del def qfits_header_sort(arg1): return _util.qfits_header_sort(arg1) qfits_header_sort = _util.qfits_header_sort def qfits_header_copy(arg1): return _util.qfits_header_copy(arg1) qfits_header_copy = _util.qfits_header_copy def qfits_header_mod(arg1, arg2, arg3, arg4): return _util.qfits_header_mod(arg1, arg2, arg3, arg4) qfits_header_mod = _util.qfits_header_mod def qfits_header_destroy(arg1): return _util.qfits_header_destroy(arg1) qfits_header_destroy = _util.qfits_header_destroy def qfits_header_getstr(arg1, arg2): return _util.qfits_header_getstr(arg1, arg2) qfits_header_getstr = _util.qfits_header_getstr def qfits_header_getstr_pretty(hdr, key, pretty, default_val): return _util.qfits_header_getstr_pretty(hdr, key, pretty, default_val) qfits_header_getstr_pretty = _util.qfits_header_getstr_pretty def qfits_header_getitem(arg1, arg2, arg3, arg4, arg5, arg6): return _util.qfits_header_getitem(arg1, arg2, arg3, arg4, arg5, arg6) qfits_header_getitem = _util.qfits_header_getitem def qfits_header_setitem(arg1, arg2, key, val, comment, line): return _util.qfits_header_setitem(arg1, arg2, key, val, comment, line) qfits_header_setitem = _util.qfits_header_setitem def qfits_header_getcom(arg1, arg2): return _util.qfits_header_getcom(arg1, arg2) qfits_header_getcom = _util.qfits_header_getcom def qfits_header_getint(arg1, arg2, arg3): return _util.qfits_header_getint(arg1, arg2, arg3) qfits_header_getint = _util.qfits_header_getint def qfits_header_getdouble(arg1, arg2, arg3): return _util.qfits_header_getdouble(arg1, arg2, arg3) qfits_header_getdouble = _util.qfits_header_getdouble def qfits_header_getboolean(arg1, arg2, arg3): return _util.qfits_header_getboolean(arg1, arg2, arg3) qfits_header_getboolean = _util.qfits_header_getboolean def qfits_header_dump(arg1, arg2): return _util.qfits_header_dump(arg1, arg2) qfits_header_dump = _util.qfits_header_dump def qfits_header_findmatch(hdr, key): return _util.qfits_header_findmatch(hdr, key) qfits_header_findmatch = _util.qfits_header_findmatch def qfits_header_write_line(hdr, line, result): return _util.qfits_header_write_line(hdr, line, result) qfits_header_write_line = _util.qfits_header_write_line def qfits_header_read_hdr_string(arg1): return _util.qfits_header_read_hdr_string(arg1) qfits_header_read_hdr_string = _util.qfits_header_read_hdr_string def qfits_zeropad(arg1): return _util.qfits_zeropad(arg1) qfits_zeropad = _util.qfits_zeropad def qfits_is_fits(arg1): return _util.qfits_is_fits(arg1) qfits_is_fits = _util.qfits_is_fits def is_blank_line(s): return _util.is_blank_line(s) is_blank_line = _util.is_blank_line def fitsio_to_qfits_header(hdr): hdrstr = '' for rec in hdr.records(): cardstr = rec.get('card', None) if cardstr is None: cardstr = hdr._record2card(rec) # pad cardstr = cardstr + ' '*(80 - len(cardstr)) hdrstr += cardstr hdrstr += 'END' + ' '*77 qhdr = qfits_header_read_hdr_string(hdrstr) return qhdr def wcs_pv2sip_header(hdr, xy, Nxy, stepsize, xlo, xhi, ylo, yhi, imageW, imageH, order, forcetan, doshift): return _util.wcs_pv2sip_header(hdr, xy, Nxy, stepsize, xlo, xhi, ylo, yhi, imageW, imageH, order, forcetan, doshift) wcs_pv2sip_header = _util.wcs_pv2sip_header def wcs_pv2sip(wcsinfn, ext, wcsoutfn, scamp_head_file, xy, Nxy, stepsize, xlo, xhi, ylo, yhi, imageW, imageH, order, forcetan, doshift): return _util.wcs_pv2sip(wcsinfn, ext, wcsoutfn, scamp_head_file, xy, Nxy, stepsize, xlo, xhi, ylo, yhi, imageW, imageH, order, forcetan, doshift) wcs_pv2sip = _util.wcs_pv2sip def wcs_pv2sip_hdr(hdr, order=5, xlo=0, xhi=0, ylo=0, yhi=0, stepsize=0, W=0, H=0): qhdr = fitsio_to_qfits_header(hdr) forcetan = False doshift = 1 scamp = False sip = wcs_pv2sip_header(qhdr, None, 0, stepsize, xlo, xhi, ylo, yhi, W, H, order, forcetan, doshift) return sip _util.SIP_MAXORDER_swigconstant(_util) SIP_MAXORDER = _util.SIP_MAXORDER class tan_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, tan_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, tan_t, name) __repr__ = _swig_repr __swig_setmethods__["crval"] = _util.tan_t_crval_set __swig_getmethods__["crval"] = _util.tan_t_crval_get if _newclass: crval = _swig_property(_util.tan_t_crval_get, _util.tan_t_crval_set) __swig_setmethods__["crpix"] = _util.tan_t_crpix_set __swig_getmethods__["crpix"] = _util.tan_t_crpix_get if _newclass: crpix = _swig_property(_util.tan_t_crpix_get, _util.tan_t_crpix_set) __swig_setmethods__["cd"] = _util.tan_t_cd_set __swig_getmethods__["cd"] = _util.tan_t_cd_get if _newclass: cd = _swig_property(_util.tan_t_cd_get, _util.tan_t_cd_set) __swig_setmethods__["imagew"] = _util.tan_t_imagew_set __swig_getmethods__["imagew"] = _util.tan_t_imagew_get if _newclass: imagew = _swig_property(_util.tan_t_imagew_get, _util.tan_t_imagew_set) __swig_setmethods__["imageh"] = _util.tan_t_imageh_set __swig_getmethods__["imageh"] = _util.tan_t_imageh_get if _newclass: imageh = _swig_property(_util.tan_t_imageh_get, _util.tan_t_imageh_set) __swig_setmethods__["sin"] = _util.tan_t_sin_set __swig_getmethods__["sin"] = _util.tan_t_sin_get if _newclass: sin = _swig_property(_util.tan_t_sin_get, _util.tan_t_sin_set) def __init__(self, *args): this = _util.new_tan_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_tan_t __del__ = lambda self: None def set(self, crval1, crval2, crpix1, crpix2, cd11, cd12, cd21, cd22, imagew, imageh): return _util.tan_t_set(self, crval1, crval2, crpix1, crpix2, cd11, cd12, cd21, cd22, imagew, imageh) def is_inside(self, ra, dec): return _util.tan_t_is_inside(self, ra, dec) def scale(self, factor): return _util.tan_t_scale(self, factor) def get_width(self): return _util.tan_t_get_width(self) def get_height(self): return _util.tan_t_get_height(self) def set_width(self, x): return _util.tan_t_set_width(self, x) def set_height(self, x): return _util.tan_t_set_height(self, x) def pixel_scale(self): return _util.tan_t_pixel_scale(self) def radec_center(self): return _util.tan_t_radec_center(self) def radius(self): return _util.tan_t_radius(self) def xyzcenter(self): return _util.tan_t_xyzcenter(self) def pixelxy2xyz(self, x, y): return _util.tan_t_pixelxy2xyz(self, x, y) def pixelxy2radec(self, x, y): return _util.tan_t_pixelxy2radec(self, x, y) def radec2pixelxy(self, ra, dec): return _util.tan_t_radec2pixelxy(self, ra, dec) def iwc2pixelxy(self, u, v): return _util.tan_t_iwc2pixelxy(self, u, v) def pixelxy2iwc(self, x, y): return _util.tan_t_pixelxy2iwc(self, x, y) def iwc2radec(self, u, v): return _util.tan_t_iwc2radec(self, u, v) def radec2iwc(self, ra, dec): return _util.tan_t_radec2iwc(self, ra, dec) def xyz2pixelxy(self, x, y, z): return _util.tan_t_xyz2pixelxy(self, x, y, z) def write_to(self, filename): return _util.tan_t_write_to(self, filename) def set_crval(self, ra, dec): return _util.tan_t_set_crval(self, ra, dec) def set_crpix(self, x, y): return _util.tan_t_set_crpix(self, x, y) def set_cd(self, cd11, cd12, cd21, cd22): return _util.tan_t_set_cd(self, cd11, cd12, cd21, cd22) def set_imagesize(self, w, h): return _util.tan_t_set_imagesize(self, w, h) tan_t_swigregister = _util.tan_t_swigregister tan_t_swigregister(tan_t) class sip_t(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, sip_t, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, sip_t, name) __repr__ = _swig_repr __swig_setmethods__["wcstan"] = _util.sip_t_wcstan_set __swig_getmethods__["wcstan"] = _util.sip_t_wcstan_get if _newclass: wcstan = _swig_property(_util.sip_t_wcstan_get, _util.sip_t_wcstan_set) __swig_setmethods__["a_order"] = _util.sip_t_a_order_set __swig_getmethods__["a_order"] = _util.sip_t_a_order_get if _newclass: a_order = _swig_property(_util.sip_t_a_order_get, _util.sip_t_a_order_set) __swig_setmethods__["b_order"] = _util.sip_t_b_order_set __swig_getmethods__["b_order"] = _util.sip_t_b_order_get if _newclass: b_order = _swig_property(_util.sip_t_b_order_get, _util.sip_t_b_order_set) __swig_setmethods__["a"] = _util.sip_t_a_set __swig_getmethods__["a"] = _util.sip_t_a_get if _newclass: a = _swig_property(_util.sip_t_a_get, _util.sip_t_a_set) __swig_setmethods__["b"] = _util.sip_t_b_set __swig_getmethods__["b"] = _util.sip_t_b_get if _newclass: b = _swig_property(_util.sip_t_b_get, _util.sip_t_b_set) __swig_setmethods__["ap_order"] = _util.sip_t_ap_order_set __swig_getmethods__["ap_order"] = _util.sip_t_ap_order_get if _newclass: ap_order = _swig_property(_util.sip_t_ap_order_get, _util.sip_t_ap_order_set) __swig_setmethods__["bp_order"] = _util.sip_t_bp_order_set __swig_getmethods__["bp_order"] = _util.sip_t_bp_order_get if _newclass: bp_order = _swig_property(_util.sip_t_bp_order_get, _util.sip_t_bp_order_set) __swig_setmethods__["ap"] = _util.sip_t_ap_set __swig_getmethods__["ap"] = _util.sip_t_ap_get if _newclass: ap = _swig_property(_util.sip_t_ap_get, _util.sip_t_ap_set) __swig_setmethods__["bp"] = _util.sip_t_bp_set __swig_getmethods__["bp"] = _util.sip_t_bp_get if _newclass: bp = _swig_property(_util.sip_t_bp_get, _util.sip_t_bp_set) def __init__(self, *args): this = _util.new_sip_t(*args) try: self.this.append(this) except: self.this = this __swig_destroy__ = _util.delete_sip_t __del__ = lambda self: None def get_subimage(self, x0, y0, w, h): return _util.sip_t_get_subimage(self, x0, y0, w, h) def scale(self, factor): return _util.sip_t_scale(self, factor) def pixel_scale(self): return _util.sip_t_pixel_scale(self) def radec_center(self): return _util.sip_t_radec_center(self) def radius(self): return _util.sip_t_radius(self) def write_to(self, filename): return _util.sip_t_write_to(self, filename) def ensure_inverse_polynomials(self): return _util.sip_t_ensure_inverse_polynomials(self) def pixelxy2xyz(self, x, y): return _util.sip_t_pixelxy2xyz(self, x, y) def pixelxy2radec(self, x, y): return _util.sip_t_pixelxy2radec(self, x, y) def radec2pixelxy(self, ra, dec): return _util.sip_t_radec2pixelxy(self, ra, dec) def iwc2pixelxy(self, u, v): return _util.sip_t_iwc2pixelxy(self, u, v) def pixelxy2iwc(self, x, y): return _util.sip_t_pixelxy2iwc(self, x, y) def iwc2radec(self, u, v): return _util.sip_t_iwc2radec(self, u, v) def radec2iwc(self, ra, dec): return _util.sip_t_radec2iwc(self, ra, dec) def xyz2pixelxy(self, x, y, z): return _util.sip_t_xyz2pixelxy(self, x, y, z) def is_inside(self, ra, dec): return _util.sip_t_is_inside(self, ra, dec) def set_a_term(self, i, j, val): return _util.sip_t_set_a_term(self, i, j, val) def set_b_term(self, i, j, val): return _util.sip_t_set_b_term(self, i, j, val) def set_ap_term(self, i, j, val): return _util.sip_t_set_ap_term(self, i, j, val) def set_bp_term(self, i, j, val): return _util.sip_t_set_bp_term(self, i, j, val) def get_a_term(self, i, j): return _util.sip_t_get_a_term(self, i, j) def get_b_term(self, i, j): return _util.sip_t_get_b_term(self, i, j) def get_ap_term(self, i, j): return _util.sip_t_get_ap_term(self, i, j) def get_bp_term(self, i, j): return _util.sip_t_get_bp_term(self, i, j) def set_width(self, x): return _util.sip_t_set_width(self, x) def set_height(self, x): return _util.sip_t_set_height(self, x) def get_width(self): return _util.sip_t_get_width(self) def get_height(self): return _util.sip_t_get_height(self) def get_distortion(self, x, y): return _util.sip_t_get_distortion(self, x, y) def get_undistortion(self, x, y): return _util.sip_t_get_undistortion(self, x, y) sip_t_swigregister = _util.sip_t_swigregister sip_t_swigregister(sip_t) def sip_create(): return _util.sip_create() sip_create = _util.sip_create def sip_free(sip): return _util.sip_free(sip) sip_free = _util.sip_free def sip_copy(dest, src): return _util.sip_copy(dest, src) sip_copy = _util.sip_copy def sip_wrap_tan(tan, sip): return _util.sip_wrap_tan(tan, sip) sip_wrap_tan = _util.sip_wrap_tan def sip_imagew(sip): return _util.sip_imagew(sip) sip_imagew = _util.sip_imagew def sip_imageh(sip): return _util.sip_imageh(sip) sip_imageh = _util.sip_imageh def sip_pixelxy2radec(sip, px, py, a, d): return _util.sip_pixelxy2radec(sip, px, py, a, d) sip_pixelxy2radec = _util.sip_pixelxy2radec def sip_pixelxy2xyzarr(sip, px, py, xyz): return _util.sip_pixelxy2xyzarr(sip, px, py, xyz) sip_pixelxy2xyzarr = _util.sip_pixelxy2xyzarr def sip_radec2pixelxy(sip, a, d, px, py): return _util.sip_radec2pixelxy(sip, a, d, px, py) sip_radec2pixelxy = _util.sip_radec2pixelxy def sip_radec2pixelxy_check(sip, ra, dec, px, py): return _util.sip_radec2pixelxy_check(sip, ra, dec, px, py) sip_radec2pixelxy_check = _util.sip_radec2pixelxy_check def sip_xyzarr2pixelxy(sip, xyz, px, py): return _util.sip_xyzarr2pixelxy(sip, xyz, px, py) sip_xyzarr2pixelxy = _util.sip_xyzarr2pixelxy def sip_xyz2pixelxy(sip, x, y, z, px, py): return _util.sip_xyz2pixelxy(sip, x, y, z, px, py) sip_xyz2pixelxy = _util.sip_xyz2pixelxy def sip_pixelxy2iwc(sip, px, py, iwcx, iwcy): return _util.sip_pixelxy2iwc(sip, px, py, iwcx, iwcy) sip_pixelxy2iwc = _util.sip_pixelxy2iwc def tan_det_cd(tan): return _util.tan_det_cd(tan) tan_det_cd = _util.tan_det_cd def sip_det_cd(sip): return _util.sip_det_cd(sip) sip_det_cd = _util.sip_det_cd def tan_pixel_scale(tn): return _util.tan_pixel_scale(tn) tan_pixel_scale = _util.tan_pixel_scale def sip_pixel_scale(sip): return _util.sip_pixel_scale(sip) sip_pixel_scale = _util.sip_pixel_scale def sip_calc_inv_distortion(sip, U, V, u, v): return _util.sip_calc_inv_distortion(sip, U, V, u, v) sip_calc_inv_distortion = _util.sip_calc_inv_distortion def sip_calc_distortion(sip, u, v, U, V): return _util.sip_calc_distortion(sip, u, v, U, V) sip_calc_distortion = _util.sip_calc_distortion def sip_pixel_distortion(sip, x, y): return _util.sip_pixel_distortion(sip, x, y) sip_pixel_distortion = _util.sip_pixel_distortion def sip_pixel_undistortion(sip, x, y): return _util.sip_pixel_undistortion(sip, x, y) sip_pixel_undistortion = _util.sip_pixel_undistortion def tan_pixelxy2xyzarr(tan, px, py, xyz): return _util.tan_pixelxy2xyzarr(tan, px, py, xyz) tan_pixelxy2xyzarr = _util.tan_pixelxy2xyzarr def tan_pixelxy2radec(wcs_tan, px, py): return _util.tan_pixelxy2radec(wcs_tan, px, py) tan_pixelxy2radec = _util.tan_pixelxy2radec def tan_pixelxy2radecarr(wcs_tan, px, py, radec): return _util.tan_pixelxy2radecarr(wcs_tan, px, py, radec) tan_pixelxy2radecarr = _util.tan_pixelxy2radecarr def tan_radec2pixelxy(wcs_tan, ra, dec, px, py): return _util.tan_radec2pixelxy(wcs_tan, ra, dec, px, py) tan_radec2pixelxy = _util.tan_radec2pixelxy def tan_xyzarr2pixelxy(wcs_tan, xyz, px, py): return _util.tan_xyzarr2pixelxy(wcs_tan, xyz, px, py) tan_xyzarr2pixelxy = _util.tan_xyzarr2pixelxy def tan_iwc2pixelxy(tan, iwcx, iwcy, px, py): return _util.tan_iwc2pixelxy(tan, iwcx, iwcy, px, py) tan_iwc2pixelxy = _util.tan_iwc2pixelxy def tan_iwc2xyzarr(tan, x, y, xyz): return _util.tan_iwc2xyzarr(tan, x, y, xyz) tan_iwc2xyzarr = _util.tan_iwc2xyzarr def tan_iwc2radec(tan, x, y): return _util.tan_iwc2radec(tan, x, y) tan_iwc2radec = _util.tan_iwc2radec def tan_pixelxy2iwc(tan, px, py, iwcx, iwcy): return _util.tan_pixelxy2iwc(tan, px, py, iwcx, iwcy) tan_pixelxy2iwc = _util.tan_pixelxy2iwc def tan_xyzarr2iwc(tan, xyz, iwcx, iwcy): return _util.tan_xyzarr2iwc(tan, xyz, iwcx, iwcy) tan_xyzarr2iwc = _util.tan_xyzarr2iwc def tan_radec2iwc(tan, ra, dec, iwcx, iwcy): return _util.tan_radec2iwc(tan, ra, dec, iwcx, iwcy) tan_radec2iwc = _util.tan_radec2iwc def sip_xyzarr2iwc(sip, xyz, iwcx, iwcy): return _util.sip_xyzarr2iwc(sip, xyz, iwcx, iwcy) sip_xyzarr2iwc = _util.sip_xyzarr2iwc def sip_radec2iwc(sip, ra, dec, iwcx, iwcy): return _util.sip_radec2iwc(sip, ra, dec, iwcx, iwcy) sip_radec2iwc = _util.sip_radec2iwc def sip_iwc2pixelxy(sip, iwcx, iwcy, px, py): return _util.sip_iwc2pixelxy(sip, iwcx, iwcy, px, py) sip_iwc2pixelxy = _util.sip_iwc2pixelxy def sip_iwc2radec(sip, x, y): return _util.sip_iwc2radec(sip, x, y) sip_iwc2radec = _util.sip_iwc2radec def sip_print(arg1): return _util.sip_print(arg1) sip_print = _util.sip_print def sip_print_to(arg1, fid): return _util.sip_print_to(arg1, fid) sip_print_to = _util.sip_print_to def tan_print(tan): return _util.tan_print(tan) tan_print = _util.tan_print def tan_print_to(tan, f): return _util.tan_print_to(tan, f) tan_print_to = _util.tan_print_to def sip_get_crval(sip): return _util.sip_get_crval(sip) sip_get_crval = _util.sip_get_crval def tan_get_orientation(tan): return _util.tan_get_orientation(tan) tan_get_orientation = _util.tan_get_orientation def sip_get_orientation(sip): return _util.sip_get_orientation(sip) sip_get_orientation = _util.sip_get_orientation def sip_get_image_size(hdr, pW, pH): return _util.sip_get_image_size(hdr, pW, pH) sip_get_image_size = _util.sip_get_image_size def sip_read_tan_or_sip_header_file_ext(fn, ext, dest, forcetan): return _util.sip_read_tan_or_sip_header_file_ext(fn, ext, dest, forcetan) sip_read_tan_or_sip_header_file_ext = _util.sip_read_tan_or_sip_header_file_ext def sip_create_header(sip): return _util.sip_create_header(sip) sip_create_header = _util.sip_create_header def tan_create_header(tan): return _util.tan_create_header(tan) tan_create_header = _util.tan_create_header def sip_add_to_header(hdr, sip): return _util.sip_add_to_header(hdr, sip) sip_add_to_header = _util.sip_add_to_header def tan_add_to_header(hdr, tan): return _util.tan_add_to_header(hdr, tan) tan_add_to_header = _util.tan_add_to_header def sip_read_header_file(fn, dest): return _util.sip_read_header_file(fn, dest) sip_read_header_file = _util.sip_read_header_file def sip_read_header_file_ext(fn, ext, dest): return _util.sip_read_header_file_ext(fn, ext, dest) sip_read_header_file_ext = _util.sip_read_header_file_ext def sip_read_header_file_ext_only(fn, ext, dest): return _util.sip_read_header_file_ext_only(fn, ext, dest) sip_read_header_file_ext_only = _util.sip_read_header_file_ext_only def tan_read_header_file(fn, dest): return _util.tan_read_header_file(fn, dest) tan_read_header_file = _util.tan_read_header_file def tan_read_header_file_ext(fn, ext, dest): return _util.tan_read_header_file_ext(fn, ext, dest) tan_read_header_file_ext = _util.tan_read_header_file_ext def tan_read_header_file_ext_only(fn, ext, dest): return _util.tan_read_header_file_ext_only(fn, ext, dest) tan_read_header_file_ext_only = _util.tan_read_header_file_ext_only def sip_read_header(hdr, dest): return _util.sip_read_header(hdr, dest) sip_read_header = _util.sip_read_header def tan_read_header(hdr, dest): return _util.tan_read_header(hdr, dest) tan_read_header = _util.tan_read_header def sip_from_string(str, len, dest): return _util.sip_from_string(str, len, dest) sip_from_string = _util.sip_from_string def tan_write_to(tan, fid): return _util.tan_write_to(tan, fid) tan_write_to = _util.tan_write_to def sip_write_to(sip, fid): return _util.sip_write_to(sip, fid) sip_write_to = _util.sip_write_to def sip_write_to_file(sip, fn): return _util.sip_write_to_file(sip, fn) sip_write_to_file = _util.sip_write_to_file def tan_write_to_file(tan, fn): return _util.tan_write_to_file(tan, fn) tan_write_to_file = _util.tan_write_to_file def wcs_pixel_center_for_size(size): return _util.wcs_pixel_center_for_size(size) wcs_pixel_center_for_size = _util.wcs_pixel_center_for_size def sip_ensure_inverse_polynomials(sip): return _util.sip_ensure_inverse_polynomials(sip) sip_ensure_inverse_polynomials = _util.sip_ensure_inverse_polynomials def sip_compute_inverse_polynomials(sip, NX, NY, xlo, xhi, ylo, yhi): return _util.sip_compute_inverse_polynomials(sip, NX, NY, xlo, xhi, ylo, yhi) sip_compute_inverse_polynomials = _util.sip_compute_inverse_polynomials def sip_filter_stars_in_field(sip, tan, xyz, radec, N, xy, inds, Ngood): return _util.sip_filter_stars_in_field(sip, tan, xyz, radec, N, xy, inds, Ngood) sip_filter_stars_in_field = _util.sip_filter_stars_in_field def sip_get_radec_bounds(wcs, stepsize): return _util.sip_get_radec_bounds(wcs, stepsize) sip_get_radec_bounds = _util.sip_get_radec_bounds def sip_walk_image_boundary(wcs, stepsize, callback, token): return _util.sip_walk_image_boundary(wcs, stepsize, callback, token) sip_walk_image_boundary = _util.sip_walk_image_boundary def sip_get_radec_center(wcs): return _util.sip_get_radec_center(wcs) sip_get_radec_center = _util.sip_get_radec_center def tan_get_radec_center(wcs): return _util.tan_get_radec_center(wcs) tan_get_radec_center = _util.tan_get_radec_center def sip_get_radius_deg(wcs): return _util.sip_get_radius_deg(wcs) sip_get_radius_deg = _util.sip_get_radius_deg def tan_get_radius_deg(wcs): return _util.tan_get_radius_deg(wcs) tan_get_radius_deg = _util.tan_get_radius_deg def sip_get_radec_center_hms(wcs, rah, ram, ras, decsign, decd, decm, decs): return _util.sip_get_radec_center_hms(wcs, rah, ram, ras, decsign, decd, decm, decs) sip_get_radec_center_hms = _util.sip_get_radec_center_hms def sip_pixel_is_inside_image(wcs, px, py): return _util.sip_pixel_is_inside_image(wcs, px, py) sip_pixel_is_inside_image = _util.sip_pixel_is_inside_image def sip_is_inside_image(wcs, ra, dec): return _util.sip_is_inside_image(wcs, ra, dec) sip_is_inside_image = _util.sip_is_inside_image def sip_get_radec_center_hms_string(wcs, rastr, decstr): return _util.sip_get_radec_center_hms_string(wcs, rastr, decstr) sip_get_radec_center_hms_string = _util.sip_get_radec_center_hms_string def sip_get_field_size(wcs, pw, ph, units): return _util.sip_get_field_size(wcs, pw, ph, units) sip_get_field_size = _util.sip_get_field_size def sip_shift(sipin, sipout, xlo, xhi, ylo, yhi): return _util.sip_shift(sipin, sipout, xlo, xhi, ylo, yhi) sip_shift = _util.sip_shift def tan_pixel_is_inside_image(wcs, px, py): return _util.tan_pixel_is_inside_image(wcs, px, py) tan_pixel_is_inside_image = _util.tan_pixel_is_inside_image def tan_is_inside_image(wcs, ra, dec): return _util.tan_is_inside_image(wcs, ra, dec) tan_is_inside_image = _util.tan_is_inside_image def tan_transform(tanin, tanout, xlo, xhi, ylo, yhi, scale): return _util.tan_transform(tanin, tanout, xlo, xhi, ylo, yhi, scale) tan_transform = _util.tan_transform def tan_scale(tanin, tanout, scale): return _util.tan_scale(tanin, tanout, scale) tan_scale = _util.tan_scale def sip_scale(tanin, tanout, scale): return _util.sip_scale(tanin, tanout, scale) sip_scale = _util.sip_scale def tan_rotate(tanin, tanout, rotate): return _util.tan_rotate(tanin, tanout, rotate) tan_rotate = _util.tan_rotate def sip_t_tostring(self): tan = self.wcstan ct = 'SIN' if tan.sin else 'TAN' return (('SIP(%s): crpix (%.1f, %.1f), crval (%g, %g), cd (%g, %g, %g, %g), ' + 'image %g x %g; SIP orders A=%i, B=%i, AP=%i, BP=%i') % (ct, tan.crpix[0], tan.crpix[1], tan.crval[0], tan.crval[1], tan.cd[0], tan.cd[1], tan.cd[2], tan.cd[3], tan.imagew, tan.imageh, self.a_order, self.b_order, self.ap_order, self.bp_order)) sip_t.__str__ = sip_t_tostring def sip_t_addtoheader(self, hdr): '''Adds this SIP WCS header to the given fitsio header''' self.wcstan.add_to_header(hdr) hdr.delete('CTYPE1') hdr.delete('CTYPE2') for k,v,c in [ ('CTYPE1', 'RA---TAN-SIP', 'TANgent plane+SIP'), ('CTYPE2', 'DEC--TAN-SIP', 'TANgent plane+SIP'), ('A_ORDER', self.a_order, 'Polynomial order, axis 1'), ('B_ORDER', self.b_order, 'Polynomial order, axis 2'), ('AP_ORDER', self.ap_order, 'Inv.polynomial order, axis 1'), ('BP_ORDER', self.bp_order, 'Inv.polynomial order, axis 2'), ]: hdr.add_record(dict(name=k, value=v, comment=c)) for i in range(self.a_order + 1): for j in range(self.a_order + 1): #if i + j < 1: # drop linear (CD) terms if i + j < 2: continue if i + j > self.a_order: continue hdr.add_record(dict(name='A_%i_%i' % (i,j), value=self.get_a_term(i, j), comment='SIP polynomial term')) for i in range(self.b_order + 1): for j in range(self.b_order + 1): #if i + j < 1: # drop linear (CD) terms if i + j < 2: continue if i + j > self.b_order: continue hdr.add_record(dict(name='B_%i_%i' % (i,j), value=self.get_b_term(i, j), comment='SIP polynomial term')) for i in range(self.ap_order + 1): for j in range(self.ap_order + 1): if i + j < 1: continue if i + j > self.ap_order: continue hdr.add_record(dict(name='AP_%i_%i' % (i,j), value=self.get_ap_term(i, j), comment='SIP polynomial term')) for i in range(self.bp_order + 1): for j in range(self.bp_order + 1): if i + j < 1: continue if i + j > self.bp_order: continue hdr.add_record(dict(name='BP_%i_%i' % (i,j), value=self.get_bp_term(i, j), comment='SIP polynomial term')) sip_t.add_to_header = sip_t_addtoheader # def sip_t_get_subimage(self, x0, y0, w, h): # wcs2 = sip_t(self) # cpx,cpy = wcs2.crpix # wcs2.set_crpix((cpx - x0, cpy - y0)) # wcs2.set_width(float(w)) # wcs2.set_height(float(h)) # return wcs2 # sip_t.get_subimage = sip_t_get_subimage def sip_t_get_shape(self): return (self.wcstan.imageh, self.wcstan.imagew) sip_t.get_shape = sip_t_get_shape def sip_t_set_shape(self, S): H,W = S self.set_height(H) self.set_width(W) sip_t.set_shape = sip_t_set_shape sip_t.imagew = property(sip_t.get_width, sip_t.set_width, None, 'image width') sip_t.imageh = property(sip_t.get_height, sip_t.set_height, None, 'image height') sip_t.shape = property(sip_t.get_shape, sip_t.set_shape, None, 'image shape') def sip_t_get_cd(self): cd = self.wcstan.cd return (cd[0], cd[1], cd[2], cd[3]) def sip_t_set_cd(self, x): self.wcstan.cd = x sip_t.get_cd = sip_t_get_cd sip_t.set_cd = sip_t_set_cd def sip_t_get_crval(self): return self.wcstan.crval def sip_t_set_crval(self, x): self.wcstan.crval = x sip_t.get_crval = sip_t_get_crval sip_t.set_crval = sip_t_set_crval def sip_t_get_crpix(self): return self.wcstan.crpix def sip_t_set_crpix(self, x): self.wcstan.crpix = x sip_t.get_crpix = sip_t_get_crpix sip_t.set_crpix = sip_t_set_crpix sip_t.crval = property(sip_t_get_crval, sip_t_set_crval, None, 'CRVAL') sip_t.crpix = property(sip_t_get_crpix, sip_t_set_crpix, None, 'CRPIX') sip_t.cd = property(sip_t_get_cd , sip_t_set_cd, None, 'CD') def sip_t_radec_bounds(self): # W,H = self.wcstan.imagew, self.wcstan.imageh # r,d = self.pixelxy2radec([1, W, W, 1], [1, 1, H, H]) # return (r.min(), r.max(), d.min(), d.max()) W,H = self.imagew, self.imageh r,d = self.pixelxy2radec([1, W/2, W, W, W, W/2, 1, 1], [1, 1, 1, H/2, H, H, H, H/2]) rx = r.max() rn = r.min() # ugh, RA wrap-around. We find the largest value < 180 (ie, near zero) and smallest value > 180 (ie, near 360) # and report them with ralo > rahi so that this case can be identified if rx - rn > 180: rx = r[r < 180].max() rn = r[r > 180].min() return (rn, rx, d.min(), d.max()) sip_t.radec_bounds = sip_t_radec_bounds #def sip_t_fromstring(s): # sip = sip_from_string(s, len(s), _real_sip_t_init = sip_t.__init__ def my_sip_t_init(self, *args, **kwargs): # fitsio header: check for '.records()' function. if len(args) == 1 and hasattr(args[0], 'records'): try: hdr = args[0] qhdr = fitsio_to_qfits_header(hdr) args = [qhdr] except: pass _real_sip_t_init(self, *args, **kwargs) if self.this is None: raise RuntimeError('Duck punch!') sip_t.__init__ = my_sip_t_init Sip = sip_t def coadd_add_numpy(c, np_img, np_weight, fweight, wcs): return _util.coadd_add_numpy(c, np_img, np_weight, fweight, wcs) coadd_add_numpy = _util.coadd_add_numpy def coadd_get_snapshot_numpy(co, badpix): return _util.coadd_get_snapshot_numpy(co, badpix) coadd_get_snapshot_numpy = _util.coadd_get_snapshot_numpy def fit_sip_wcs_py(np_starxyz, np_fieldxy, np_weights, tanin, sip_order, inv_order): return _util.fit_sip_wcs_py(np_starxyz, np_fieldxy, np_weights, tanin, sip_order, inv_order) fit_sip_wcs_py = _util.fit_sip_wcs_py def broadcast_2to2ok(func, baton, in1, in2): return _util.broadcast_2to2ok(func, baton, in1, in2) broadcast_2to2ok = _util.broadcast_2to2ok def broadcast_2to2(func, baton, in1, in2): return _util.broadcast_2to2(func, baton, in1, in2) broadcast_2to2 = _util.broadcast_2to2 def broadcast_2to2i(func, baton, in1, in2): return _util.broadcast_2to2i(func, baton, in1, in2) broadcast_2to2i = _util.broadcast_2to2i def tan_rd2xy_wrapper(wcs, in1, in2): return _util.tan_rd2xy_wrapper(wcs, in1, in2) tan_rd2xy_wrapper = _util.tan_rd2xy_wrapper def sip_rd2xy_wrapper(wcs, in1, in2): return _util.sip_rd2xy_wrapper(wcs, in1, in2) sip_rd2xy_wrapper = _util.sip_rd2xy_wrapper def anwcs_rd2xy_wrapper(wcs, in1, in2): return _util.anwcs_rd2xy_wrapper(wcs, in1, in2) anwcs_rd2xy_wrapper = _util.anwcs_rd2xy_wrapper def tan_iwc2xy_wrapper(wcs, in1, in2): return _util.tan_iwc2xy_wrapper(wcs, in1, in2) tan_iwc2xy_wrapper = _util.tan_iwc2xy_wrapper def sip_iwc2xy_wrapper(wcs, in1, in2): return _util.sip_iwc2xy_wrapper(wcs, in1, in2) sip_iwc2xy_wrapper = _util.sip_iwc2xy_wrapper def tan_xy2iwc_wrapper(wcs, in1, in2): return _util.tan_xy2iwc_wrapper(wcs, in1, in2) tan_xy2iwc_wrapper = _util.tan_xy2iwc_wrapper def sip_xy2iwc_wrapper(wcs, in1, in2): return _util.sip_xy2iwc_wrapper(wcs, in1, in2) sip_xy2iwc_wrapper = _util.sip_xy2iwc_wrapper def tan_iwc2rd_wrapper(wcs, in1, in2): return _util.tan_iwc2rd_wrapper(wcs, in1, in2) tan_iwc2rd_wrapper = _util.tan_iwc2rd_wrapper def sip_iwc2rd_wrapper(wcs, in1, in2): return _util.sip_iwc2rd_wrapper(wcs, in1, in2) sip_iwc2rd_wrapper = _util.sip_iwc2rd_wrapper def tan_rd2iwc_wrapper(wcs, in1, in2): return _util.tan_rd2iwc_wrapper(wcs, in1, in2) tan_rd2iwc_wrapper = _util.tan_rd2iwc_wrapper def sip_rd2iwc_wrapper(wcs, in1, in2): return _util.sip_rd2iwc_wrapper(wcs, in1, in2) sip_rd2iwc_wrapper = _util.sip_rd2iwc_wrapper def tan_xy2rd_wrapper(wcs, in1, in2): return _util.tan_xy2rd_wrapper(wcs, in1, in2) tan_xy2rd_wrapper = _util.tan_xy2rd_wrapper def sip_xy2rd_wrapper(wcs, in1, in2): return _util.sip_xy2rd_wrapper(wcs, in1, in2) sip_xy2rd_wrapper = _util.sip_xy2rd_wrapper def anwcs_xy2rd_wrapper(wcs, in1, in2): return _util.anwcs_xy2rd_wrapper(wcs, in1, in2) anwcs_xy2rd_wrapper = _util.anwcs_xy2rd_wrapper def tan_wcs_resample(inwcs, outwcs, np_inimg, np_outimg, weighted, lorder): return _util.tan_wcs_resample(inwcs, outwcs, np_inimg, np_outimg, weighted, lorder) tan_wcs_resample = _util.tan_wcs_resample def tan_numpy_xyz2pixelxy(tan, npxyz, npx, npy): return _util.tan_numpy_xyz2pixelxy(tan, npxyz, npx, npy) tan_numpy_xyz2pixelxy = _util.tan_numpy_xyz2pixelxy def an_tally(py_counts, py_x, py_y): return _util.an_tally(py_counts, py_x, py_y) an_tally = _util.an_tally import numpy as np def tan_t_tostring(self): ct = 'SIN' if self.sin else 'TAN' return ('%s: crpix (%.1f, %.1f), crval (%g, %g), cd (%g, %g, %g, %g), image %g x %g' % (ct, self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], self.cd[0], self.cd[1], self.cd[2], self.cd[3], self.imagew, self.imageh)) tan_t.__str__ = tan_t_tostring def tan_t_addtoheader(self, hdr): '''Adds this TAN WCS header to the given fitsio header''' hdr.add_record(dict(name='CTYPE1', value='RA---TAN', comment='TANgent plane')) hdr.add_record(dict(name='CTYPE2', value='DEC--TAN', comment='TANgent plane')) hdr.add_record(dict(name='CRVAL1', value=self.crval[0], comment='Reference RA')) hdr.add_record(dict(name='CRVAL2', value=self.crval[1], comment='Reference Dec')) hdr.add_record(dict(name='CRPIX1', value=self.crpix[0], comment='Reference x')) hdr.add_record(dict(name='CRPIX2', value=self.crpix[1], comment='Reference y')) hdr.add_record(dict(name='CD1_1', value=self.cd[0], comment='CD matrix')) hdr.add_record(dict(name='CD1_2', value=self.cd[1], comment='CD matrix')) hdr.add_record(dict(name='CD2_1', value=self.cd[2], comment='CD matrix')) hdr.add_record(dict(name='CD2_2', value=self.cd[3], comment='CD matrix')) hdr.add_record(dict(name='IMAGEW', value=self.imagew, comment='Image width')) hdr.add_record(dict(name='IMAGEH', value=self.imageh, comment='Image height')) tan_t.add_to_header = tan_t_addtoheader ## picklable? def tan_t_getstate(self): return (self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], self.cd[0], self.cd[1], self.cd[2], self.cd[3], self.imagew, self.imageh, self.sin) def tan_t_setstate(self, state): #print 'setstate: self', self, 'state', state #print 'state', state self.this = _util.new_tan_t() #print 'self', repr(self) p0,p1,v0,v1,cd0,cd1,cd2,cd3,w,h,sin = state self.set_crpix(p0,p1) self.set_crval(v0,v1) self.set_cd(cd0,cd1,cd2,cd3) self.set_imagesize(w,h) self.sin = sin #(self.crpix[0], self.crpix[1], self.crval[0], self.crval[1], #self.cd[0], self.cd[1], self.cd[2], self.cd[3], #self.imagew, self.imageh) = state def tan_t_getnewargs(self): return () tan_t.__getstate__ = tan_t_getstate tan_t.__setstate__ = tan_t_setstate tan_t.__getnewargs__ = tan_t_getnewargs def tan_t_getshape(self): return int(self.imageh), int(self.imagew) tan_t.shape = property(tan_t_getshape) def tan_t_get_cd(self): cd = self.cd return (cd[0], cd[1], cd[2], cd[3]) tan_t.get_cd = tan_t_get_cd def tan_t_pixelxy2radec(self, x, y): return tan_xy2rd_wrapper(self.this, x, y) tan_t.pixelxy2radec_single = tan_t.pixelxy2radec tan_t.pixelxy2radec = tan_t_pixelxy2radec def tan_t_radec2pixelxy(self, r, d): return tan_rd2xy_wrapper(self.this, r, d) tan_t.radec2pixelxy_single = tan_t.radec2pixelxy tan_t.radec2pixelxy = tan_t_radec2pixelxy def tan_t_iwc2pixelxy(self, r, d): return tan_iwc2xy_wrapper(self.this, r, d) tan_t.iwc2pixelxy_single = tan_t.iwc2pixelxy tan_t.iwc2pixelxy = tan_t_iwc2pixelxy def tan_t_pixelxy2iwc(self, x,y): return tan_xy2iwc_wrapper(self.this, x,y) tan_t.pixelxy2iwc_single = tan_t.pixelxy2iwc tan_t.pixelxy2iwc = tan_t_pixelxy2iwc def tan_t_radec2iwc(self, r, d): return tan_rd2iwc_wrapper(self.this, r, d) tan_t.radec2iwc_single = tan_t.radec2iwc tan_t.radec2iwc = tan_t_radec2iwc def tan_t_iwc2radec(self, u, v): return tan_iwc2rd_wrapper(self.this, u, v) tan_t.iwc2radec_single = tan_t.iwc2radec tan_t.iwc2radec = tan_t_iwc2radec def sip_t_pixelxy2radec(self, x, y): return sip_xy2rd_wrapper(self.this, x, y) sip_t.pixelxy2radec_single = sip_t.pixelxy2radec sip_t.pixelxy2radec = sip_t_pixelxy2radec def sip_t_radec2pixelxy(self, r, d): return sip_rd2xy_wrapper(self.this, r, d) sip_t.radec2pixelxy_single = sip_t.radec2pixelxy sip_t.radec2pixelxy = sip_t_radec2pixelxy def sip_t_iwc2pixelxy(self, r, d): return sip_iwc2xy_wrapper(self.this, r, d) sip_t.iwc2pixelxy_single = sip_t.iwc2pixelxy sip_t.iwc2pixelxy = sip_t_iwc2pixelxy def sip_t_pixelxy2iwc(self, x,y): return sip_xy2iwc_wrapper(self.this, x,y) sip_t.pixelxy2iwc_single = sip_t.pixelxy2iwc sip_t.pixelxy2iwc = sip_t_pixelxy2iwc def sip_t_radec2iwc(self, r, d): return sip_rd2iwc_wrapper(self.this, r, d) sip_t.radec2iwc_single = sip_t.radec2iwc sip_t.radec2iwc = sip_t_radec2iwc def sip_t_iwc2radec(self, u, v): return sip_iwc2rd_wrapper(self.this, u, v) sip_t.iwc2radec_single = sip_t.iwc2radec sip_t.iwc2radec = sip_t_iwc2radec def anwcs_t_pixelxy2radec(self, x, y): ok,r,d = anwcs_xy2rd_wrapper(self.this, x, y) return (ok == 0),r,d anwcs_t.pixelxy2radec_single = anwcs_t.pixelxy2radec anwcs_t.pixelxy2radec = anwcs_t_pixelxy2radec def anwcs_t_radec2pixelxy(self, r, d): ok,x,y = anwcs_rd2xy_wrapper(self.this, r, d) return (ok == 0),x,y anwcs_t.radec2pixelxy_single = anwcs_t.radec2pixelxy anwcs_t.radec2pixelxy = anwcs_t_radec2pixelxy def tan_t_radec_bounds(self): W,H = self.imagew, self.imageh r,d = self.pixelxy2radec([1, W/2, W, W, W, W/2, 1, 1], [1, 1, 1, H/2, H, H, H, H/2]) rx = r.max() rn = r.min() # ugh, RA wrap-around. We find the largest value < 180 (ie, near zero) and smallest value > 180 (ie, near 360) # and report them with ralo > rahi so that this case can be identified if rx - rn > 180: rx = r[r < 180].max() rn = r[r > 180].min() return (rn, rx, d.min(), d.max()) tan_t.radec_bounds = tan_t_radec_bounds _real_tan_t_init = tan_t.__init__ def my_tan_t_init(self, *args, **kwargs): # fitsio header: check for '.records()' function. if len(args) == 1 and hasattr(args[0], 'records'): try: hdr = args[0] qhdr = fitsio_to_qfits_header(hdr) args = [qhdr] except: pass _real_tan_t_init(self, *args, **kwargs) if self.this is None: raise RuntimeError('Duck punch!') tan_t.__init__ = my_tan_t_init Tan = tan_t def tan_t_get_subimage(self, x0, y0, w, h): wcs2 = tan_t(self) cpx,cpy = wcs2.crpix wcs2.set_crpix(cpx - x0, cpy - y0) wcs2.set_width(float(w)) wcs2.set_height(float(h)) return wcs2 tan_t.get_subimage = tan_t_get_subimage # Deja Vu! # def sip_t_get_subimage(self, xlo, xhi, ylo, yhi): # sipout = sip_t(self) # sip_shift(self.this, sipout.this, float(xlo), float(xhi), float(ylo), float(yhi)) # return sipout # sip_t.get_subimage = sip_t_get_subimage # picklable def sip_t_getstate(self): t = (self.wcstan.__getstate__(), self.a_order, self.b_order, self.a, self.b, self.ap_order, self.bp_order, self.ap, self.bp) return t def sip_t_setstate(self, s): self.this = _util.new_sip_t() (t, self.a_order, self.b_order, self.a, self.b, self.ap_order, self.bp_order, self.ap, self.bp) = s #self.wcstan.__setstate__(t) # disturbingly, tan_t_setstate does not work because it resets self.this = ... p0,p1,v0,v1,cd0,cd1,cd2,cd3,w,h,sin = t self.wcstan.set_crpix(p0,p1) self.wcstan.set_crval(v0,v1) self.wcstan.set_cd(cd0,cd1,cd2,cd3) self.wcstan.set_imagesize(w,h) self.wcstan.sin = sin def sip_t_getnewargs(self): return () sip_t.__getstate__ = sip_t_getstate sip_t.__setstate__ = sip_t_setstate sip_t.__getnewargs__ = sip_t_getnewargs def fits_use_error_system(): return _util.fits_use_error_system() fits_use_error_system = _util.fits_use_error_system def fits_to_string(hdr, size): return _util.fits_to_string(hdr, size) fits_to_string = _util.fits_to_string def fits_write_float_image(img, nx, ny, fn): return _util.fits_write_float_image(img, nx, ny, fn) fits_write_float_image = _util.fits_write_float_image def fits_write_u8_image(img, nx, ny, fn): return _util.fits_write_u8_image(img, nx, ny, fn) fits_write_u8_image = _util.fits_write_u8_image def fits_write_i16_image(img, nx, ny, fn): return _util.fits_write_i16_image(img, nx, ny, fn) fits_write_i16_image = _util.fits_write_i16_image def fits_get_header_for_image(qd, W, addtoheader): return _util.fits_get_header_for_image(qd, W, addtoheader) fits_get_header_for_image = _util.fits_get_header_for_image def fits_get_header_for_image2(W, H, bitpix, addtoheader): return _util.fits_get_header_for_image2(W, H, bitpix, addtoheader) fits_get_header_for_image2 = _util.fits_get_header_for_image2 def fits_get_header_for_image3(W, H, bitpix, planes, addtoheader): return _util.fits_get_header_for_image3(W, H, bitpix, planes, addtoheader) fits_get_header_for_image3 = _util.fits_get_header_for_image3 def fits_write_header(hdr, filename): return _util.fits_write_header(hdr, filename) fits_write_header = _util.fits_write_header def fits_write_header_and_image(hdr, qd, W): return _util.fits_write_header_and_image(hdr, qd, W) fits_write_header_and_image = _util.fits_write_header_and_image def fits_get_double_val(table, column, rowdata): return _util.fits_get_double_val(table, column, rowdata) fits_get_double_val = _util.fits_get_double_val def fits_is_table_header(keyword): return _util.fits_is_table_header(keyword) fits_is_table_header = _util.fits_is_table_header def fits_is_primary_header(key): return _util.fits_is_primary_header(key) fits_is_primary_header = _util.fits_is_primary_header def fits_copy_non_table_headers(dest, src): return _util.fits_copy_non_table_headers(dest, src) fits_copy_non_table_headers = _util.fits_copy_non_table_headers def fits_get_dupstring(hdr, key): return _util.fits_get_dupstring(hdr, key) fits_get_dupstring = _util.fits_get_dupstring def fits_get_long_string(hdr, key): return _util.fits_get_long_string(hdr, key) fits_get_long_string = _util.fits_get_long_string def fits_header_addf(hdr, key, comment, format): return _util.fits_header_addf(hdr, key, comment, format) fits_header_addf = _util.fits_header_addf def fits_header_addf_longstring(hdr, key, comment, format): return _util.fits_header_addf_longstring(hdr, key, comment, format) fits_header_addf_longstring = _util.fits_header_addf_longstring def fits_header_add_longstring_boilerplate(hdr): return _util.fits_header_add_longstring_boilerplate(hdr) fits_header_add_longstring_boilerplate = _util.fits_header_add_longstring_boilerplate def fits_header_modf(hdr, key, comment, format): return _util.fits_header_modf(hdr, key, comment, format) fits_header_modf = _util.fits_header_modf def fits_header_add_int(hdr, key, val, comment): return _util.fits_header_add_int(hdr, key, val, comment) fits_header_add_int = _util.fits_header_add_int def fits_header_add_double(hdr, key, val, comment): return _util.fits_header_add_double(hdr, key, val, comment) fits_header_add_double = _util.fits_header_add_double def fits_header_set_double(hdr, key, val, comment): return _util.fits_header_set_double(hdr, key, val, comment) fits_header_set_double = _util.fits_header_set_double def fits_header_set_int(hdr, key, val, comment): return _util.fits_header_set_int(hdr, key, val, comment) fits_header_set_int = _util.fits_header_set_int def fits_header_mod_int(hdr, key, val, comment): return _util.fits_header_mod_int(hdr, key, val, comment) fits_header_mod_int = _util.fits_header_mod_int def fits_header_mod_double(hdr, key, val, comment): return _util.fits_header_mod_double(hdr, key, val, comment) fits_header_mod_double = _util.fits_header_mod_double def fits_update_value(hdr, key, newvalue): return _util.fits_update_value(hdr, key, newvalue) fits_update_value = _util.fits_update_value def fits_copy_table(tbl): return _util.fits_copy_table(tbl) fits_copy_table = _util.fits_copy_table def an_fits_copy_header(src, dest, key): return _util.an_fits_copy_header(src, dest, key) an_fits_copy_header = _util.an_fits_copy_header def fits_copy_all_headers(src, dest, targetkey): return _util.fits_copy_all_headers(src, dest, targetkey) fits_copy_all_headers = _util.fits_copy_all_headers def fits_append_all_headers(src, dest, targetkey): return _util.fits_append_all_headers(src, dest, targetkey) fits_append_all_headers = _util.fits_append_all_headers def fits_add_args(src, args, argc): return _util.fits_add_args(src, args, argc) fits_add_args = _util.fits_add_args def fits_add_long_comment(dst, format): return _util.fits_add_long_comment(dst, format) fits_add_long_comment = _util.fits_add_long_comment def fits_append_long_comment(dst, format): return _util.fits_append_long_comment(dst, format) fits_append_long_comment = _util.fits_append_long_comment def fits_add_long_history(dst, format): return _util.fits_add_long_history(dst, format) fits_add_long_history = _util.fits_add_long_history def fits_blocks_needed(size): return _util.fits_blocks_needed(size) fits_blocks_needed = _util.fits_blocks_needed def fits_bytes_needed(size): return _util.fits_bytes_needed(size) fits_bytes_needed = _util.fits_bytes_needed def fits_pad_file_with(fid, pad): return _util.fits_pad_file_with(fid, pad) fits_pad_file_with = _util.fits_pad_file_with def fits_pad_file(fid): return _util.fits_pad_file(fid) fits_pad_file = _util.fits_pad_file def fits_pad_file_name(filename): return _util.fits_pad_file_name(filename) fits_pad_file_name = _util.fits_pad_file_name def fits_fill_endian_string(str): return _util.fits_fill_endian_string(str) fits_fill_endian_string = _util.fits_fill_endian_string def fits_get_endian_string(): return _util.fits_get_endian_string() fits_get_endian_string = _util.fits_get_endian_string def fits_check_endian(header): return _util.fits_check_endian(header) fits_check_endian = _util.fits_check_endian def fits_check_uint_size(header): return _util.fits_check_uint_size(header) fits_check_uint_size = _util.fits_check_uint_size def fits_check_double_size(header): return _util.fits_check_double_size(header) fits_check_double_size = _util.fits_check_double_size def fits_add_endian(header): return _util.fits_add_endian(header) fits_add_endian = _util.fits_add_endian def fits_add_reverse_endian(header): return _util.fits_add_reverse_endian(header) fits_add_reverse_endian = _util.fits_add_reverse_endian def fits_mod_reverse_endian(header): return _util.fits_mod_reverse_endian(header) fits_mod_reverse_endian = _util.fits_mod_reverse_endian def fits_add_uint_size(header): return _util.fits_add_uint_size(header) fits_add_uint_size = _util.fits_add_uint_size def fits_add_double_size(header): return _util.fits_add_double_size(header) fits_add_double_size = _util.fits_add_double_size def fits_find_column(table, colname): return _util.fits_find_column(table, colname) fits_find_column = _util.fits_find_column def fits_find_table_column(fn, colname, start, size, extension): return _util.fits_find_table_column(fn, colname, start, size, extension) fits_find_table_column = _util.fits_find_table_column def fits_get_table_column(fn, colname, pcol): return _util.fits_get_table_column(fn, colname, pcol) fits_get_table_column = _util.fits_get_table_column def fits_add_column(table, column, type, ncopies, units, label): return _util.fits_add_column(table, column, type, ncopies, units, label) fits_add_column = _util.fits_add_column def fits_offset_of_column(table, colnum): return _util.fits_offset_of_column(table, colnum) fits_offset_of_column = _util.fits_offset_of_column def fits_write_data_A(fid, value): return _util.fits_write_data_A(fid, value) fits_write_data_A = _util.fits_write_data_A def fits_write_data_B(fid, value): return _util.fits_write_data_B(fid, value) fits_write_data_B = _util.fits_write_data_B def fits_write_data_D(fid, value, flip): return _util.fits_write_data_D(fid, value, flip) fits_write_data_D = _util.fits_write_data_D def fits_write_data_E(fid, value, flip): return _util.fits_write_data_E(fid, value, flip) fits_write_data_E = _util.fits_write_data_E def fits_write_data_I(fid, value, flip): return _util.fits_write_data_I(fid, value, flip) fits_write_data_I = _util.fits_write_data_I def fits_write_data_J(fid, value, flip): return _util.fits_write_data_J(fid, value, flip) fits_write_data_J = _util.fits_write_data_J def fits_write_data_K(fid, value, flip): return _util.fits_write_data_K(fid, value, flip) fits_write_data_K = _util.fits_write_data_K def fits_write_data_L(fid, value): return _util.fits_write_data_L(fid, value) fits_write_data_L = _util.fits_write_data_L def fits_write_data_X(fid, value): return _util.fits_write_data_X(fid, value) fits_write_data_X = _util.fits_write_data_X def fits_write_data(fid, pvalue, type, flip): return _util.fits_write_data(fid, pvalue, type, flip) fits_write_data = _util.fits_write_data def fits_write_data_array(fid, vvalue, type, N, flip): return _util.fits_write_data_array(fid, vvalue, type, N, flip) fits_write_data_array = _util.fits_write_data_array def collapsing_find_minlabel(label, equivs): return _util.collapsing_find_minlabel(label, equivs) collapsing_find_minlabel = _util.collapsing_find_minlabel def dfind2(image, nx, ny, objectimg, p_nobjects): return _util.dfind2(image, nx, ny, objectimg, p_nobjects) dfind2 = _util.dfind2 def dfind2_u8(image, nx, ny, objectimg, p_nobjects): return _util.dfind2_u8(image, nx, ny, objectimg, p_nobjects) dfind2_u8 = _util.dfind2_u8 def dselip(k, n, arr): return _util.dselip(k, n, arr) dselip = _util.dselip def dselip_cleanup(): return _util.dselip_cleanup() dselip_cleanup = _util.dselip_cleanup def dsmooth(image, nx, ny, sigma, smooth): return _util.dsmooth(image, nx, ny, sigma, smooth) dsmooth = _util.dsmooth def dsmooth2(image, nx, ny, sigma, smooth): return _util.dsmooth2(image, nx, ny, sigma, smooth) dsmooth2 = _util.dsmooth2 def dsmooth2_u8(image, nx, ny, sigma, smooth): return _util.dsmooth2_u8(image, nx, ny, sigma, smooth) dsmooth2_u8 = _util.dsmooth2_u8 def dsmooth2_i16(image, nx, ny, sigma, smooth): return _util.dsmooth2_i16(image, nx, ny, sigma, smooth) dsmooth2_i16 = _util.dsmooth2_i16 def dobjects(image, nx, ny, limit, dpsf, objects): return _util.dobjects(image, nx, ny, limit, dpsf, objects) dobjects = _util.dobjects def dmask(image, nx, ny, limit, dpsf, mask): return _util.dmask(image, nx, ny, limit, dpsf, mask) dmask = _util.dmask def dpeaks(image, nx, ny, npeaks, xcen, ycen, sigma, dlim, saddle, maxnpeaks, smooth, checkpeaks, minpeak): return _util.dpeaks(image, nx, ny, npeaks, xcen, ycen, sigma, dlim, saddle, maxnpeaks, smooth, checkpeaks, minpeak) dpeaks = _util.dpeaks def dcen3x3(image): return _util.dcen3x3(image) dcen3x3 = _util.dcen3x3 def dsigma(image, nx, ny, sp, gridsize, sigma): return _util.dsigma(image, nx, ny, sp, gridsize, sigma) dsigma = _util.dsigma def dsigma_u8(image, nx, ny, sp, gridsize, sigma): return _util.dsigma_u8(image, nx, ny, sp, gridsize, sigma) dsigma_u8 = _util.dsigma_u8 def dmedsmooth(image, masked, nx, ny, halfbox, smooth): return _util.dmedsmooth(image, masked, nx, ny, halfbox, smooth) dmedsmooth = _util.dmedsmooth def dallpeaks(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize): return _util.dallpeaks(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize) dallpeaks = _util.dallpeaks def dallpeaks_u8(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize): return _util.dallpeaks_u8(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize) dallpeaks_u8 = _util.dallpeaks_u8 def dallpeaks_i16(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize): return _util.dallpeaks_i16(image, nx, ny, objects, npeaks, dpsf, sigma, dlim, saddle, maxper, maxnpeaks, minpeak, maxsize) dallpeaks_i16 = _util.dallpeaks_i16 def dcen3x3b(i0, i1, i2, i3, i4, i5, i6, i7, i8): return _util.dcen3x3b(i0, i1, i2, i3, i4, i5, i6, i7, i8) dcen3x3b = _util.dcen3x3b # This file is compatible with both classic and new-style classes. astrometry.net-0.67/util/util_wrap.c000644 000765 000024 00004624070 12651446354 017735 0ustar00dstnstaff000000 000000 /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.7 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG #else # include #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *cstr; char *newstr; Py_ssize_t len; str = PyUnicode_AsUTF8String(str); PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif /* Add PyObject_Del for old Pythons */ #if PY_VERSION_HEX < 0x01060000 # define PyObject_Del(op) PyMem_DEL((op)) #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intintargfunc ssizessizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) { long result = 0; PyObject *i = PyNumber_Int(x); if (i) { result = PyInt_AsLong(i); Py_DECREF(i); } return result; } #endif #if PY_VERSION_HEX < 0x02050000 #define PyInt_FromSize_t(x) PyInt_FromLong((long)x) #endif #if PY_VERSION_HEX < 0x02040000 #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif #if PY_VERSION_HEX < 0x02030000 typedef struct { PyTypeObject type; PyNumberMethods as_number; PyMappingMethods as_mapping; PySequenceMethods as_sequence; PyBufferProcs as_buffer; PyObject *name, *slots; } PyHeapTypeObject; #endif #if PY_VERSION_HEX < 0x02030000 typedef destructor freefunc; #endif #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ (PY_MAJOR_VERSION > 3)) # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #endif #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX >= 0x03000000 SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { return PyInstanceMethod_New(func); } #else SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) { return NULL; } #endif #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN int SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { int i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { int i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS SwigPyObject_repr(SwigPyObject *v) #else SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { # ifdef METH_NOARGS PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # else PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); # endif # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!SwigPyObject_Check(next)) { return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS SwigPyObject_next(PyObject* v) #else SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_disown(PyObject *v) #else SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_acquire(PyObject *v) #else SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #elif (PY_VERSION_HEX < 0x02050000) if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #else if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) #endif { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v); } else { SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * SwigPyObject_getattr(SwigPyObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpyobject_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobject_type) < 0) return NULL; #endif } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME int SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ (printfunc)SwigPyPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpypacked_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpypacked_type) < 0) return NULL; #endif } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return SWIG_Python_str_FromChar("this"); } static PyObject *swig_this = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (swig_this == NULL) swig_this = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst = 0; PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else # ifdef SWIGPY_USE_CAPSULE type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); # else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); # endif if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void #ifdef SWIGPY_USE_CAPSULE SWIG_Python_DestroyModule(PyObject *obj) #else SWIG_Python_DestroyModule(void *vptr) #endif { #ifdef SWIGPY_USE_CAPSULE swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); #else swig_module_info *swig_module = (swig_module_info *) vptr; #endif swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); swig_this = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif #ifdef SWIGPY_USE_CAPSULE PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #else PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #endif } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { #ifdef SWIGPY_USE_CAPSULE descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); #else descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); #endif } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { #ifdef SWIGPY_USE_CAPSULE obj = PyCapsule_New((void*) descriptor, NULL, NULL); #else obj = PyCObject_FromVoidPtr(descriptor, NULL); #endif PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); } else { PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_FILE swig_types[0] #define SWIGTYPE_p_a_10__double swig_types[1] #define SWIGTYPE_p_a_2__double swig_types[2] #define SWIGTYPE_p_anqfits_t swig_types[3] #define SWIGTYPE_p_anwcs_t swig_types[4] #define SWIGTYPE_p_char swig_types[5] #define SWIGTYPE_p_coadd_t swig_types[6] #define SWIGTYPE_p_codetree_t swig_types[7] #define SWIGTYPE_p_dl swig_types[8] #define SWIGTYPE_p_double swig_types[9] #define SWIGTYPE_p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double swig_types[10] #define SWIGTYPE_p_f_int_p_void__int swig_types[11] #define SWIGTYPE_p_f_p_q_const__sip_t_double_double_double_double_p_void__void swig_types[12] #define SWIGTYPE_p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void swig_types[13] #define SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__int swig_types[14] #define SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char swig_types[15] #define SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__void swig_types[16] #define SWIGTYPE_p_fitsbin_t swig_types[17] #define SWIGTYPE_p_fitstable_t swig_types[18] #define SWIGTYPE_p_float swig_types[19] #define SWIGTYPE_p_il swig_types[20] #define SWIGTYPE_p_index_t swig_types[21] #define SWIGTYPE_p_int swig_types[22] #define SWIGTYPE_p_int16_t swig_types[23] #define SWIGTYPE_p_int32_t swig_types[24] #define SWIGTYPE_p_int64_t swig_types[25] #define SWIGTYPE_p_kdtree_t swig_types[26] #define SWIGTYPE_p_lanczos_args_t swig_types[27] #define SWIGTYPE_p_off_t swig_types[28] #define SWIGTYPE_p_p_char swig_types[29] #define SWIGTYPE_p_p_double swig_types[30] #define SWIGTYPE_p_p_int swig_types[31] #define SWIGTYPE_p_p_qfits_header swig_types[32] #define SWIGTYPE_p_pl swig_types[33] #define SWIGTYPE_p_qfits_header swig_types[34] #define SWIGTYPE_p_qfits_table swig_types[35] #define SWIGTYPE_p_qfitsdumper swig_types[36] #define SWIGTYPE_p_quadfile_t swig_types[37] #define SWIGTYPE_p_sip_t swig_types[38] #define SWIGTYPE_p_sl swig_types[39] #define SWIGTYPE_p_startree_t swig_types[40] #define SWIGTYPE_p_tan_t swig_types[41] #define SWIGTYPE_p_tfits_type swig_types[42] #define SWIGTYPE_p_uint16_t swig_types[43] #define SWIGTYPE_p_uint32_t swig_types[44] #define SWIGTYPE_p_uint8_t swig_types[45] #define SWIGTYPE_p_unsigned_char swig_types[46] #define SWIGTYPE_p_unsigned_int swig_types[47] #define SWIGTYPE_p_void swig_types[48] static swig_type_info *swig_types[50]; static swig_module_info swig_module = {swig_types, 49, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _util.so ------------------------------------------------*/ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_init PyInit__util #else # define SWIG_init init_util #endif #define SWIG_name "_util" #define SWIGVERSION 0x030007 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) (void *)((const void *)(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) // numpy. #include #include #include #include #include "os-features.h" #include "log.h" #include "healpix.h" #include "healpix-utils.h" #include "anwcs.h" #include "sip.h" #include "fitsioutils.h" #include "sip-utils.h" #include "sip_qfits.h" #include "index.h" #include "quadfile.h" #include "codekd.h" #include "starkd.h" #include "starutil.h" #include "an-bool.h" #include "ioutils.h" #include "coadd.h" #include "wcs-resample.h" #include "resample.h" #include "keywords.h" #include "dimage.h" #include "fit-wcs.h" #include "qfits_header.h" #include "qfits_rw.h" #include "wcs-pv2sip.h" #define true 1 #define false 0 // For sip.h static void checkorder(int i, int j) { assert(i >= 0); assert(i < SIP_MAXORDER); assert(j >= 0); assert(j < SIP_MAXORDER); } // From index.i: /** For returning single codes and quads as python lists, do something like this: %typemap(out) float [ANY] { int i; $result = PyList_New($1_dim0); for (i = 0; i < $1_dim0; i++) { PyObject *o = PyFloat_FromDouble((double) $1[i]); PyList_SetItem($result,i,o); } } **/ double* code_alloc(int DC) { return malloc(DC * sizeof(double)); } void code_free(double* code) { free(code); } double code_get(double* code, int i) { return code[i]; } long codekd_addr(index_t* ind) { return (long)ind->codekd; } long starkd_addr(index_t* ind) { return (long)ind->starkd; } long quadfile_addr(index_t* ind) { return (long)ind->quads; } /* long qidxfile_addr(qidxfile* qf) { return (long)qf; } */ #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (int)(v); } } return res; } SWIGINTERNINLINE PyObject* SWIG_From_int (int value) { return PyInt_FromLong((long) value); } /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include # define SWIG_isfinite(X) (finite(X)) # endif #endif /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif SWIGINTERN int SWIG_AsVal_float (PyObject * obj, float *val) { double v; int res = SWIG_AsVal_double (obj, &v); if (SWIG_IsOK(res)) { if (SWIG_Float_Overflow_Check(v)) { return SWIG_OverflowError; } else { if (val) *val = (float)(v); } } return res; } #define SWIG_From_double PyFloat_FromDouble #define ERR(x, ...) \ printf(x, ## __VA_ARGS__) static void print_array(PyObject* arr) { PyArrayObject *obj; int i; PyArray_Descr *desc; printf("Array: %p\n", arr); if (!arr) return; if (!PyArray_Check(arr)) { printf(" Not a Numpy Array\n"); if (arr == Py_None) printf(" is None\n"); return; } printf(" Contiguous: %s\n", PyArray_ISCONTIGUOUS(arr) ? "yes" : "no"); printf(" Writeable: %s\n", PyArray_ISWRITEABLE(arr) ? "yes" : "no"); printf(" Aligned: %s\n", PyArray_ISALIGNED(arr) ? "yes" : "no"); printf(" C array: %s\n", PyArray_ISCARRAY(arr) ? "yes" : "no"); //printf(" typeobj: %p (float is %p)\n", arr->typeobj, //&PyFloat_Type); obj = (PyArrayObject*)arr; printf(" data: %p\n", obj->data); printf(" N dims: %i\n", obj->nd); for (i=0; ind; i++) printf(" dim %i: %i\n", i, (int)obj->dimensions[i]); for (i=0; ind; i++) printf(" stride %i: %i\n", i, (int)obj->strides[i]); desc = obj->descr; printf(" descr kind: '%c'\n", desc->kind); printf(" descr type: '%c'\n", desc->type); printf(" descr byteorder: '%c'\n", desc->byteorder); printf(" descr elsize: %i\n", desc->elsize); } static PyObject* an_hist2d(PyObject* py_arrx, PyObject* py_arry, PyObject* py_hist, double xlo, double xhi, double ylo, double yhi) { PyArray_Descr* dtype = NULL; PyArray_Descr* itype = NULL; int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; int reqout = req | NPY_WRITEABLE | NPY_UPDATEIFCOPY; PyObject* np_arrx; PyObject* np_arry; PyObject* np_hist; double *arrx; double *arry; int32_t *hist; int nx, ny; double dx, dy, idx, idy; int i, N; dtype = PyArray_DescrFromType(NPY_DOUBLE); itype = PyArray_DescrFromType(NPY_INT32); Py_INCREF(dtype); np_arrx = PyArray_FromAny(py_arrx, dtype, 1, 1, req, NULL); if (!np_arrx) { PyErr_SetString(PyExc_ValueError,"Expected x array to be double"); Py_DECREF(dtype); return NULL; } N = PyArray_SIZE(np_arrx); Py_INCREF(dtype); np_arry = PyArray_FromAny(py_arry, dtype, 1, 1, req, NULL); if (!np_arry) { PyErr_SetString(PyExc_ValueError,"Expected y array to be double"); Py_DECREF(dtype); Py_DECREF(np_arrx); return NULL; } if (PyArray_SIZE(np_arry) != N) { PyErr_SetString(PyExc_ValueError,"Expected x and y arrays to be the same length"); Py_DECREF(dtype); Py_DECREF(np_arrx); return NULL; } Py_CLEAR(dtype); Py_INCREF(itype); np_hist = PyArray_FromAny(py_hist, itype, 2, 2, reqout, NULL); if (!np_hist) { PyErr_SetString(PyExc_ValueError,"Expected hist array to be int32"); Py_DECREF(np_arrx); Py_DECREF(np_arry); Py_DECREF(itype); return NULL; } Py_CLEAR(itype); ny = PyArray_DIM(np_hist, 0); nx = PyArray_DIM(np_hist, 1); dx = (xhi - xlo) / (double)nx; dy = (yhi - ylo) / (double)ny; idx = 1./dx; idy = 1./dy; hist = PyArray_DATA(np_hist); arrx = PyArray_DATA(np_arrx); arry = PyArray_DATA(np_arry); for (i=0; i xhi) || (y < ylo) || (y > yhi)) continue; binx = (int)((x - xlo) * idx); biny = (int)((y - ylo) * idy); // == upper limit if (unlikely(binx == nx)) { binx--; } if (unlikely(biny == ny)) { biny--; } hist[biny * nx + binx]++; } Py_DECREF(np_arrx); Py_DECREF(np_arry); Py_DECREF(np_hist); Py_RETURN_NONE; } static double flat_percentile_f(PyObject* np_arr, double pct) { PyArray_Descr* dtype; npy_intp N; int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; float* x; float med = 0; int L, R; int mid; dtype = PyArray_DescrFromType(NPY_FLOAT); np_arr = PyArray_CheckFromAny(np_arr, dtype, 0, 0, req, NULL); if (!np_arr) { ERR("flat_median_f: Failed to convert array to float\n"); return 0; } dtype = NULL; N = PyArray_Size(np_arr); x = (float*)malloc(sizeof(float) * N); memcpy(x, PyArray_DATA(np_arr), sizeof(float)*N); Py_DECREF(np_arr); { int i; for (i=0; i= R) { mid = R; } while (L < R) { int ipivot; int i,j; int k; float pivot; //printf("L=%i, R=%i (N=%i), mid=%i\n", L, R, 1+R-L, mid); ipivot = random() % (1+R-L) + L; pivot = x[ipivot]; // partition array... i = L; j = R; do { // scan for elements out of place // scan from the left: while (x[i] < pivot) i++; // scan from the right: while (x[j] >= pivot && j>i) j--; // now x[i] >= pivot // and (x[j] < pivot) OR j == i assert(x[i] >= pivot); assert((x[j] < pivot) || (j == i)); assert(j >= i); if (i < j) { // swap float tmp = x[i]; x[i] = x[j]; x[j] = tmp; } } while (i < j); { for (k=L; k= pivot); } } // partition the right partition into == and > j = i; k = R; do { // scan for elements out of place // scan from the right: while (x[k] > pivot) k--; // scan from the left: while (x[j] == pivot && j pivot) || (j == k)); assert(k >= j); if (j < k) { // swap float tmp = x[j]; x[j] = x[k]; x[k] = tmp; } } while (j < k); j = k+1; { //printf("L=%i, i=%i, j=%i, k=%i, R=%i\n", L, i, j, k, R); for (k=L; k pivot); } } // there must be at least one element in the right partitions assert(i <= R); // there must be at least one element in the middle partition assert(j-i >= 1); if (mid < i) // the median is in the left partition (< pivot) R = i-1; else if (mid >= j) // the median is in the right partition (> pivot) L = j; else { // the median is in the middle partition (== pivot) L = R = i; break; } assert(L <= mid); assert(R >= mid); } med = x[mid]; free(x); return med; } static double flat_median_f(PyObject* np_arr) { return flat_percentile_f(np_arr, 50.0); } static int median_smooth(PyObject* np_image, PyObject* np_mask, int halfbox, PyObject* np_smooth) { /* image: np.float32 mask: bool or uint8; 1 to IGNORE. smooth: np.float32; output array. */ if (!PyArray_Check(np_image) || !PyArray_Check(np_smooth) || !PyArray_ISNOTSWAPPED(np_image) || !PyArray_ISNOTSWAPPED(np_smooth ) || !PyArray_ISFLOAT(np_image) || !PyArray_ISFLOAT(np_smooth ) || (PyArray_ITEMSIZE(np_image) != sizeof(float)) || (PyArray_ITEMSIZE(np_smooth ) != sizeof(float)) || !(PyArray_NDIM(np_image) == 2) || !(PyArray_NDIM(np_smooth ) == 2) || !PyArray_ISCONTIGUOUS(np_image) || !PyArray_ISCONTIGUOUS(np_smooth ) || !PyArray_ISWRITEABLE(np_smooth)) { ERR("median_smooth: array type checks failed for image/smooth\n"); ERR("check %i %i notswapped %i %i isfloat %i %i size %i %i ndim %i %i contig %i %i writable %i\n", PyArray_Check(np_image), PyArray_Check(np_smooth), PyArray_ISNOTSWAPPED(np_image), PyArray_ISNOTSWAPPED(np_smooth ), PyArray_ISFLOAT(np_image), PyArray_ISFLOAT(np_smooth), (PyArray_ITEMSIZE(np_image) == sizeof(float)), (PyArray_ITEMSIZE(np_smooth) == sizeof(float)), (PyArray_NDIM(np_image) == 2), (PyArray_NDIM(np_smooth ) == 2), PyArray_ISCONTIGUOUS(np_image), PyArray_ISCONTIGUOUS(np_smooth), PyArray_ISWRITEABLE(np_smooth)); return -1; } if (np_mask != Py_None) { if (!PyArray_Check(np_mask) || !PyArray_ISNOTSWAPPED(np_mask) || !PyArray_ISBOOL(np_mask) || (PyArray_ITEMSIZE(np_mask) != sizeof(uint8_t)) || !(PyArray_NDIM(np_mask) == 2) || !PyArray_ISCONTIGUOUS(np_mask)) { ERR("median_smooth: array type checks failed for mask\n"); return -1; } } npy_intp NX, NY; const float* image; float* smooth; const uint8_t* maskimg = NULL; NY = PyArray_DIM(np_image, 0); NX = PyArray_DIM(np_image, 1); if ((PyArray_DIM(np_smooth, 0) != NY) || (PyArray_DIM(np_smooth, 1) != NX)) { ERR("median_smooth: 'smooth' array is wrong shape\n"); return -1; } image = PyArray_DATA(np_image); smooth = PyArray_DATA(np_smooth); if (np_mask != Py_None) { if ((PyArray_DIM(np_mask, 0) != NY) || (PyArray_DIM(np_mask, 1) != NX)) { ERR("median_smooth: 'mask' array is wrong shape\n"); return -1; } maskimg = PyArray_DATA(np_mask); } dmedsmooth(image, maskimg, (int)NX, (int)NY, halfbox, smooth); return 0; } #define LANCZOS_INTERP_FUNC lanczos5_interpolate #define L 5 static int LANCZOS_INTERP_FUNC(PyObject* np_ixi, PyObject* np_iyi, PyObject* np_dx, PyObject* np_dy, PyObject* loutputs, PyObject* linputs); #include "lanczos.i" #undef LANCZOS_INTERP_FUNC #undef L #define LANCZOS_INTERP_FUNC lanczos3_interpolate #define L 3 static int LANCZOS_INTERP_FUNC(PyObject* np_ixi, PyObject* np_iyi, PyObject* np_dx, PyObject* np_dy, PyObject* loutputs, PyObject* linputs); #include "lanczos.i" #undef LANCZOS_INTERP_FUNC #undef L static int lanczos3_filter(PyObject* np_dx, PyObject* np_f) { npy_intp N; npy_intp i; float* dx; float* f; if (!PyArray_Check(np_dx) || !PyArray_Check(np_f ) || !PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f ) || !PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f ) || (PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float)) || !(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1) || !PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f ) || !PyArray_ISWRITEABLE(np_f) ) { ERR("Arrays aren't right type\n"); return -1; } N = PyArray_DIM(np_dx, 0); if (PyArray_DIM(np_f, 0) != N) { ERR("Input and output must have same dimensions\n"); return -1; } dx = PyArray_DATA(np_dx); f = PyArray_DATA(np_f); const double thirdpi = M_PI / 3.0; const double pisq = M_PI * M_PI; const double threeopisq = 3. / pisq; for (i=N; i>0; i--, dx++, f++) { double x = *dx; if (x < -3.0 || x > 3.0) { *f = 0.0; } else if (x == 0) { *f = 1.0; } else { *f = threeopisq * sin(M_PI * x) * sin(thirdpi * x) / (x * x); } } return 0; } static int lanczos3_filter_table(PyObject* np_dx, PyObject* np_f, int rangecheck) { npy_intp N; npy_intp i; float* dx; float* f; // Nlutunit is number of bins per unit x static const int Nlutunit = 1024; static const float lut0 = -4.; static const int Nlut = 8192; //8 * Nlutunit; // We want bins to go from -4 to 4 (Lanczos-3 range of -3 to 3, plus some buffer) // [Nlut] static float lut[8192]; static int initialized = 0; if (!initialized) { for (i=0; i<(Nlut); i++) { float x,f; x = (lut0 + (i / (float)Nlutunit)); if (x <= -3.0 || x >= 3.0) { f = 0.0; } else if (x == 0) { f = 1.0; } else { f = 3. * sin(M_PI * x) * sin(M_PI / 3.0 * x) / (M_PI * M_PI * x * x); } lut[i] = f; } initialized = 1; } if (!PyArray_Check(np_dx) || !PyArray_Check(np_f )) { ERR("Array check\n"); } if (!PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f )) { ERR("Swapped\n"); } if (!PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f )) { ERR("Float\n"); } if ((PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float))) { ERR("sizeof float\n"); } if ((PyArray_ITEMSIZE(np_dx) != sizeof(float))) { ERR("sizeof dx %i\n", PyArray_ITEMSIZE(np_dx)); } if ((PyArray_ITEMSIZE(np_f ) != sizeof(float))) { ERR("sizeof f %i\n", PyArray_ITEMSIZE(np_f)); } if (!(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1)) { ERR("one-d\n"); } if (!PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f )) { ERR("contig\n"); } if (!PyArray_ISWRITEABLE(np_f)) { ERR("writable\n"); } if (!PyArray_Check(np_dx) || !PyArray_Check(np_f ) || !PyArray_ISNOTSWAPPED(np_dx) || !PyArray_ISNOTSWAPPED(np_f ) || !PyArray_ISFLOAT(np_dx) || !PyArray_ISFLOAT(np_f ) || (PyArray_ITEMSIZE(np_dx) != sizeof(float)) || (PyArray_ITEMSIZE(np_f ) != sizeof(float)) || !(PyArray_NDIM(np_dx) == 1) || !(PyArray_NDIM(np_f ) == 1) || !PyArray_ISCONTIGUOUS(np_dx) || !PyArray_ISCONTIGUOUS(np_f ) || !PyArray_ISWRITEABLE(np_f) ) { ERR("Arrays aren't right type\n"); return -1; } N = PyArray_DIM(np_dx, 0); if (PyArray_DIM(np_f, 0) != N) { ERR("Input and output must have same dimensions\n"); return -1; } dx = PyArray_DATA(np_dx); f = PyArray_DATA(np_f); if (rangecheck) { for (i=N; i>0; i--, dx++, f++) { float x = *dx; int li = (int)((x - lut0) * Nlutunit); if ((li < 0) || (li >= Nlut)) { *f = 0.0; } else { *f = lut[li]; } } } else { for (i=N; i>0; i--, dx++, f++) { float x = *dx; int li = (int)((x - lut0) * Nlutunit); *f = lut[li]; } } return 0; } static int lanczos_shift_image_c(PyObject* np_img, PyObject* np_weight, PyObject* np_outimg, PyObject* np_outweight, int order, double dx, double dy) { int W,H; int i,j; lanczos_args_t lanczos; PyArray_Descr* dtype; // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; int reqout = req | NPY_WRITEABLE | NPY_UPDATEIFCOPY; double *img, *weight, *outimg, *outweight; weight = NULL; outweight = NULL; lanczos.order = order; /* printf("np_img:\n"); print_array(np_img); printf("np_weight:\n"); print_array(np_weight); printf("np_outimg:\n"); print_array(np_outimg); printf("np_outweight:\n"); print_array(np_outweight); */ dtype = PyArray_DescrFromType(PyArray_DOUBLE); Py_INCREF(dtype); np_img = PyArray_CheckFromAny(np_img, dtype, 2, 2, req, NULL); if (np_weight != Py_None) { Py_INCREF(dtype); np_weight = PyArray_CheckFromAny(np_weight, dtype, 2, 2, req, NULL); if (!np_weight) { ERR("Failed to run PyArray_FromAny on np_weight\n"); return -1; } } Py_INCREF(dtype); np_outimg = PyArray_CheckFromAny(np_outimg, dtype, 2, 2, reqout, NULL); if (np_outweight != Py_None) { Py_INCREF(dtype); np_outweight = PyArray_CheckFromAny(np_outweight, dtype, 2, 2, reqout, NULL); } Py_DECREF(dtype); dtype = NULL; if (!np_img || !np_outimg || !np_outweight) { ERR("Failed to PyArray_FromAny the images (np_img=%p, np_outimg=%p, np_outweight=%p)\n", np_img, np_outimg, np_outweight); return -1; } H = (int)PyArray_DIM(np_img, 0); W = (int)PyArray_DIM(np_img, 1); if ((PyArray_DIM(np_outimg, 0) != H) || (PyArray_DIM(np_outimg, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } if (np_weight != Py_None) { if ((PyArray_DIM(np_weight, 0) != H) || (PyArray_DIM(np_weight, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } weight = PyArray_DATA(np_weight); } if (np_outweight != Py_None) { if ((PyArray_DIM(np_outweight, 0) != H) || (PyArray_DIM(np_outweight, 1) != W)) { ERR("All images must have the same dimensions.\n"); return -1; } outweight = PyArray_DATA(np_outweight); } /* printf("np_img:\n"); print_array(np_img); printf("np_weight:\n"); print_array(np_weight); printf("np_outimg:\n"); print_array(np_outimg); printf("np_outweight:\n"); print_array(np_outweight); printf("weight = %p, outweight = %p\n", weight, outweight); */ img = PyArray_DATA(np_img); outimg = PyArray_DATA(np_outimg); for (i=0; i=0x03000000 if (PyUnicode_Check(obj)) #else if (PyString_Check(obj)) #endif { char *cstr; Py_ssize_t len; #if PY_VERSION_HEX>=0x03000000 if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); PyBytes_AsStringAndSize(obj, &cstr, &len); if(alloc) *alloc = SWIG_NEWOBJ; #else PyString_AsStringAndSize(obj, &cstr, &len); #endif if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ #if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) #else if (*alloc == SWIG_NEWOBJ) #endif { *cptr = (char *)memcpy((char *)malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1)); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { #if PY_VERSION_HEX>=0x03000000 assert(0); /* Should never reach here in Python 3 */ #endif *cptr = SWIG_Python_str_AsChar(obj); } } if (psize) *psize = len + 1; #if PY_VERSION_HEX>=0x03000000 Py_XDECREF(obj); #endif return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj((char *)(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { #if PY_VERSION_HEX >= 0x03000000 #if PY_VERSION_HEX >= 0x03010000 return PyUnicode_DecodeUTF8(carray, (int)(size), "surrogateescape"); #else return PyUnicode_FromStringAndSize(carray, (int)(size)); #endif #else return PyString_FromStringAndSize(carray, (int)(size)); #endif } } else { return SWIG_Py_Void(); } } SWIGINTERNINLINE PyObject * SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else #endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); #if PY_VERSION_HEX >= 0x03000000 { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (v < 0) { return SWIG_OverflowError; } } else { PyErr_Clear(); } } #endif } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_unsigned_SS_char (PyObject * obj, unsigned char *val) { unsigned long v; int res = SWIG_AsVal_unsigned_SS_long (obj, &v); if (SWIG_IsOK(res)) { if ((v > UCHAR_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (unsigned char)(v); } } return res; } #define SWIG_From_long PyLong_FromLong SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long (unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyLong_FromLong((long)(value)); } SWIGINTERNINLINE PyObject * SWIG_From_unsigned_SS_char (unsigned char value) { return SWIG_From_unsigned_SS_long (value); } SWIGINTERN int SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) { unsigned long v; int res = SWIG_AsVal_unsigned_SS_long (obj, &v); if (SWIG_IsOK(res)) { if ((v > UINT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (unsigned int)(v); } } return res; } SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_int (unsigned int value) { return PyInt_FromSize_t((size_t) value); } SWIGINTERN struct anwcs_t *new_anwcs_t(char *fn,int ext,int slen){ if ((ext == -1) || (starts_with(fn, "SIMPLE =") && !file_exists(fn))) { // assume header string if (slen == 0) { slen = (int)strlen(fn); } return anwcs_wcslib_from_string(fn, slen); } anwcs_t* w = anwcs_open(fn, ext); return w; } SWIGINTERN void delete_anwcs_t(struct anwcs_t *self){ free(self); } SWIGINTERN double anwcs_t_pixel_scale(struct anwcs_t *self){ return anwcs_pixel_scale(self); } SWIGINTERN void anwcs_t_get_center(struct anwcs_t *self,double *p_ra,double *p_dec){ anwcs_get_radec_center_and_radius(self, p_ra, p_dec, NULL); } SWIGINTERN void anwcs_t_get_radius(struct anwcs_t *self,double *p_radius){ anwcs_get_radec_center_and_radius(self, NULL, NULL, p_radius); } SWIGINTERN anbool anwcs_t_is_inside(struct anwcs_t *self,double ra,double dec){ return anwcs_radec_is_inside_image(self, ra, dec); } SWIGINTERN double anwcs_t_get_width(struct anwcs_t *self){ return anwcs_imagew(self); } SWIGINTERN double anwcs_t_get_height(struct anwcs_t *self){ return anwcs_imageh(self); } SWIGINTERN void anwcs_t_set_width(struct anwcs_t *self,int W){ int H = anwcs_imageh(self); anwcs_set_size(self, W, H); } SWIGINTERN void anwcs_t_set_height(struct anwcs_t *self,int H){ int W = anwcs_imagew(self); anwcs_set_size(self, W, H); } SWIGINTERN void anwcs_t_pixelxy2radec(struct anwcs_t *self,double x,double y,double *p_ra,double *p_dec){ anwcs_pixelxy2radec(self, x, y, p_ra, p_dec); } SWIGINTERN int anwcs_t_radec2pixelxy(struct anwcs_t *self,double ra,double dec,double *p_x,double *p_y){ return anwcs_radec2pixelxy(self, ra, dec, p_x, p_y); } SWIGINTERN int anwcs_t_write_to(struct anwcs_t *self,char const *filename){ return anwcs_write(self, filename); } SWIGINTERN tan_t *new_tan_t__SWIG_0(char *fn,int ext,int only){ tan_t* t = NULL; if (fn) { if (only) { t = tan_read_header_file_ext_only(fn, ext, NULL); } else { t = tan_read_header_file_ext(fn, ext, NULL); } } else { t = (tan_t*)calloc(1, sizeof(tan_t)); } // printf("tan_t: %p\n", t); if (!t) { // SWIG_exception(SWIG_RuntimeError, "Failed to read TAN WCS header"); PyErr_SetString(PyExc_RuntimeError, "Failed to read TAN WCS header"); return NULL; } return t; } SWIGINTERN tan_t *new_tan_t__SWIG_1(double crval1,double crval2,double crpix1,double crpix2,double cd11,double cd12,double cd21,double cd22,double imagew,double imageh){ tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); t->crval[0] = crval1; t->crval[1] = crval2; t->crpix[0] = crpix1; t->crpix[1] = crpix2; t->cd[0][0] = cd11; t->cd[0][1] = cd12; t->cd[1][0] = cd21; t->cd[1][1] = cd22; t->imagew = imagew; t->imageh = imageh; return t; } SWIGINTERN tan_t *new_tan_t__SWIG_2(tan_t const *other){ tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); memcpy(t, other, sizeof(tan_t)); return t; } SWIGINTERN tan_t *new_tan_t__SWIG_3(qfits_header const *hdr){ tan_t* t = tan_read_header(hdr, NULL); return t; } SWIGINTERN void delete_tan_t(tan_t *self){ free(self); } SWIGINTERN void tan_t_set(tan_t *self,double crval1,double crval2,double crpix1,double crpix2,double cd11,double cd12,double cd21,double cd22,double imagew,double imageh){ self->crval[0] = crval1; self->crval[1] = crval2; self->crpix[0] = crpix1; self->crpix[1] = crpix2; self->cd[0][0] = cd11; self->cd[0][1] = cd12; self->cd[1][0] = cd21; self->cd[1][1] = cd22; self->imagew = imagew; self->imageh = imageh; } SWIGINTERN anbool tan_t_is_inside(tan_t *self,double ra,double dec){ return tan_is_inside_image(self, ra, dec); } SWIGINTERN tan_t *tan_t_scale(tan_t *self,double factor){ tan_t* t = (tan_t*)calloc(1, sizeof(tan_t)); tan_scale(self, t, factor); return t; } SWIGINTERN double tan_t_get_width(tan_t *self){ return self->imagew; } SWIGINTERN double tan_t_get_height(tan_t *self){ return self->imageh; } SWIGINTERN void tan_t_set_width(tan_t *self,double x){ self->imagew = x; } SWIGINTERN void tan_t_set_height(tan_t *self,double x){ self->imageh = x; } SWIGINTERN double tan_t_pixel_scale(tan_t *self){ return tan_pixel_scale(self); } SWIGINTERN void tan_t_radec_center(tan_t *self,double *p_ra,double *p_dec){ tan_get_radec_center(self, p_ra, p_dec); } SWIGINTERN double tan_t_radius(tan_t *self){ return tan_get_radius_deg(self); } SWIGINTERN void tan_t_xyzcenter(tan_t *self,double *p_x,double *p_y,double *p_z){ double xyz[3]; tan_pixelxy2xyzarr(self, 0.5+self->imagew/2.0, 0.5+self->imageh/2.0, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } SWIGINTERN void tan_t_pixelxy2xyz(tan_t *self,double x,double y,double *p_x,double *p_y,double *p_z){ double xyz[3]; tan_pixelxy2xyzarr(self, x, y, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } SWIGINTERN void tan_t_pixelxy2radec(tan_t *self,double x,double y,double *p_ra,double *p_dec){ tan_pixelxy2radec(self, x, y, p_ra, p_dec); } SWIGINTERN int tan_t_radec2pixelxy(tan_t *self,double ra,double dec,double *p_x,double *p_y){ return tan_radec2pixelxy(self, ra, dec, p_x, p_y); } SWIGINTERN void tan_t_iwc2pixelxy(tan_t *self,double u,double v,double *p_x,double *p_y){ tan_iwc2pixelxy(self, u, v, p_x, p_y); } SWIGINTERN void tan_t_pixelxy2iwc(tan_t *self,double x,double y,double *p_x,double *p_y){ tan_pixelxy2iwc(self, x, y, p_x, p_y); } SWIGINTERN void tan_t_iwc2radec(tan_t *self,double u,double v,double *p_ra,double *p_dec){ tan_iwc2radec(self, u, v, p_ra, p_dec); } SWIGINTERN int tan_t_radec2iwc(tan_t *self,double ra,double dec,double *p_x,double *p_y){ return tan_radec2iwc(self, ra, dec, p_x, p_y); } SWIGINTERN int tan_t_xyz2pixelxy(tan_t *self,double x,double y,double z,double *p_x,double *p_y){ double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return tan_xyzarr2pixelxy(self, xyz, p_x, p_y); } SWIGINTERN int tan_t_write_to(tan_t *self,char const *filename){ return tan_write_to_file(self, filename); } SWIGINTERN void tan_t_set_crval(tan_t *self,double ra,double dec){ self->crval[0] = ra; self->crval[1] = dec; } SWIGINTERN void tan_t_set_crpix(tan_t *self,double x,double y){ self->crpix[0] = x; self->crpix[1] = y; } SWIGINTERN void tan_t_set_cd(tan_t *self,double cd11,double cd12,double cd21,double cd22){ self->cd[0][0] = cd11; self->cd[0][1] = cd12; self->cd[1][0] = cd21; self->cd[1][1] = cd22; } SWIGINTERN void tan_t_set_imagesize(tan_t *self,double w,double h){ self->imagew = w; self->imageh = h; } SWIGINTERN sip_t *new_sip_t__SWIG_0(char const *fn,int ext){ if (fn) return sip_read_header_file_ext_only(fn, ext, NULL); sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); return t; } SWIGINTERN sip_t *new_sip_t__SWIG_1(char const *s,int len,int XXX){ return sip_from_string(s, len, NULL); } SWIGINTERN sip_t *new_sip_t__SWIG_2(sip_t const *other){ sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); memcpy(t, other, sizeof(sip_t)); return t; } SWIGINTERN sip_t *new_sip_t__SWIG_3(tan_t const *other){ sip_t* t = (sip_t*)calloc(1, sizeof(sip_t)); memcpy(&(t->wcstan), other, sizeof(tan_t)); return t; } SWIGINTERN sip_t *new_sip_t__SWIG_4(qfits_header const *hdr){ sip_t* t = sip_read_header(hdr, NULL); return t; } SWIGINTERN void delete_sip_t(sip_t *self){ free(self); } SWIGINTERN sip_t *sip_t_get_subimage(sip_t *self,int x0,int y0,int w,int h){ sip_t* sub = malloc(sizeof(sip_t)); memcpy(sub, self, sizeof(sip_t)); sub->wcstan.crpix[0] -= x0; sub->wcstan.crpix[1] -= y0; sub->wcstan.imagew = w; sub->wcstan.imageh = h; return sub; } SWIGINTERN sip_t *sip_t_scale(sip_t *self,double factor){ sip_t* s = (sip_t*)calloc(1, sizeof(sip_t)); sip_scale(self, s, factor); return s; } SWIGINTERN double sip_t_pixel_scale(sip_t *self){ return sip_pixel_scale(self); } SWIGINTERN void sip_t_radec_center(sip_t *self,double *p_ra,double *p_dec){ sip_get_radec_center(self, p_ra, p_dec); } SWIGINTERN double sip_t_radius(sip_t *self){ return sip_get_radius_deg(self); } SWIGINTERN int sip_t_write_to(sip_t *self,char const *filename){ return sip_write_to_file(self, filename); } SWIGINTERN int sip_t_ensure_inverse_polynomials(sip_t *self){ return sip_ensure_inverse_polynomials(self); } SWIGINTERN void sip_t_pixelxy2xyz(sip_t *self,double x,double y,double *p_x,double *p_y,double *p_z){ double xyz[3]; sip_pixelxy2xyzarr(self, x, y, xyz); *p_x = xyz[0]; *p_y = xyz[1]; *p_z = xyz[2]; } SWIGINTERN void sip_t_pixelxy2radec(sip_t *self,double x,double y,double *p_ra,double *p_dec){ sip_pixelxy2radec(self, x, y, p_ra, p_dec); } SWIGINTERN int sip_t_radec2pixelxy(sip_t *self,double ra,double dec,double *p_x,double *p_y){ return sip_radec2pixelxy(self, ra, dec, p_x, p_y); } SWIGINTERN void sip_t_iwc2pixelxy(sip_t *self,double u,double v,double *p_x,double *p_y){ sip_iwc2pixelxy(self, u, v, p_x, p_y); } SWIGINTERN void sip_t_pixelxy2iwc(sip_t *self,double x,double y,double *p_x,double *p_y){ sip_pixelxy2iwc(self, x, y, p_x, p_y); } SWIGINTERN void sip_t_iwc2radec(sip_t *self,double u,double v,double *p_ra,double *p_dec){ sip_iwc2radec(self, u, v, p_ra, p_dec); } SWIGINTERN int sip_t_radec2iwc(sip_t *self,double ra,double dec,double *p_x,double *p_y){ return sip_radec2iwc(self, ra, dec, p_x, p_y); } SWIGINTERN int sip_t_xyz2pixelxy(sip_t *self,double x,double y,double z,double *p_x,double *p_y){ double xyz[3]; xyz[0] = x; xyz[1] = y; xyz[2] = z; return sip_xyzarr2pixelxy(self, xyz, p_x, p_y); } SWIGINTERN anbool sip_t_is_inside(sip_t *self,double ra,double dec){ return sip_is_inside_image(self, ra, dec); } SWIGINTERN void sip_t_set_a_term(sip_t *self,int i,int j,double val){ checkorder(i, j); self->a[i][j] = val; } SWIGINTERN void sip_t_set_b_term(sip_t *self,int i,int j,double val){ checkorder(i, j); self->b[i][j] = val; } SWIGINTERN void sip_t_set_ap_term(sip_t *self,int i,int j,double val){ checkorder(i, j); self->ap[i][j] = val; } SWIGINTERN void sip_t_set_bp_term(sip_t *self,int i,int j,double val){ checkorder(i, j); self->bp[i][j] = val; } SWIGINTERN double sip_t_get_a_term(sip_t *self,int i,int j){ checkorder(i, j); return self->a[i][j]; } SWIGINTERN double sip_t_get_b_term(sip_t *self,int i,int j){ checkorder(i, j); return self->b[i][j]; } SWIGINTERN double sip_t_get_ap_term(sip_t *self,int i,int j){ checkorder(i, j); return self->ap[i][j]; } SWIGINTERN double sip_t_get_bp_term(sip_t *self,int i,int j){ checkorder(i, j); return self->bp[i][j]; } SWIGINTERN void sip_t_set_width(sip_t *self,double x){ self->wcstan.imagew = x; } SWIGINTERN void sip_t_set_height(sip_t *self,double x){ self->wcstan.imageh = x; } SWIGINTERN double sip_t_get_width(sip_t *self){ return self->wcstan.imagew; } SWIGINTERN double sip_t_get_height(sip_t *self){ return self->wcstan.imageh; } SWIGINTERN void sip_t_get_distortion(sip_t *self,double x,double y,double *p_x,double *p_y){ return sip_pixel_distortion(self, x, y, p_x, p_y); } SWIGINTERN void sip_t_get_undistortion(sip_t *self,double x,double y,double *p_x,double *p_y){ return sip_pixel_undistortion(self, x, y, p_x, p_y); } // Wrapper on coadd_add_image that accepts numpy arrays. static int coadd_add_numpy(coadd_t* c, PyObject* np_img, PyObject* np_weight, float fweight, const anwcs_t* wcs) { PyArray_Descr* dtype = PyArray_DescrFromType(NPY_FLOAT); // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; float *img, *weight; Py_INCREF(dtype); np_img = PyArray_CheckFromAny(np_img, dtype, 2, 2, req, NULL); img = PyArray_DATA(np_img); if (!np_img) { ERR("Failed to PyArray_FromAny the image\n"); Py_XDECREF(np_img); Py_DECREF(dtype); return -1; } if (np_weight == Py_None) { weight = NULL; } else { Py_INCREF(dtype); np_weight = PyArray_CheckFromAny(np_weight, dtype, 2, 2, req, NULL); if (!np_weight) { ERR("Failed to PyArray_FromAny the weight\n"); Py_XDECREF(np_weight); Py_DECREF(dtype); return -1; } weight = PyArray_DATA(np_weight); } int rtn = coadd_add_image(c, img, weight, fweight, wcs); Py_DECREF(np_img); if (weight) { Py_DECREF(np_weight); } Py_DECREF(dtype); return rtn; } static PyObject* coadd_get_snapshot_numpy(coadd_t* co, float badpix) { npy_intp dim[2]; PyObject* npimg; dim[0] = co->H; dim[1] = co->W; npimg = PyArray_EMPTY(2, dim, NPY_FLOAT, 0); coadd_get_snapshot(co, PyArray_DATA(npimg), badpix); return npimg; } static sip_t* fit_sip_wcs_py(PyObject* np_starxyz, PyObject* np_fieldxy, PyObject* np_weights, tan_t* tanin, int sip_order, int inv_order) { PyArray_Descr* dtype = PyArray_DescrFromType(NPY_DOUBLE); // in numpy v2.0 these constants have a NPY_ARRAY_ prefix int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; Py_INCREF(dtype); np_starxyz = PyArray_CheckFromAny(np_starxyz, dtype, 2, 2, req, NULL); Py_INCREF(dtype); np_fieldxy = PyArray_CheckFromAny(np_fieldxy, dtype, 2, 2, req, NULL); if ((np_starxyz == Py_None) || (np_fieldxy == Py_None)) { Py_DECREF(dtype); Py_DECREF(dtype); printf("Failed to convert starxyz or fieldxy to numpy double arrays\n"); return NULL; } if (np_weights != Py_None) { Py_INCREF(dtype); np_weights = PyArray_CheckFromAny(np_weights, dtype, 1, 1, req,NULL); if (np_weights == Py_None) { Py_DECREF(dtype); printf("Failed to convert weights to numpy double array\n"); return NULL; } } Py_DECREF(dtype); dtype = NULL; int M = (int)PyArray_DIM(np_starxyz, 0); if (PyArray_DIM(np_fieldxy, 0) != M) { printf("Expected starxyz and fieldxy to have the same length\n"); return NULL; } if ((np_weights != Py_None) && (PyArray_DIM(np_weights, 0) != M)) { printf("Expected starxyz and weights to have the same length\n"); return NULL; } if ((PyArray_DIM(np_starxyz, 1) != 3) || (PyArray_DIM(np_fieldxy, 1) != 2)) { printf("Expected starxyz Mx3 and fieldxy Mx2\n"); return NULL; } sip_t* sipout = calloc(1, sizeof(sip_t)); double* weights = NULL; if (np_weights != Py_None) weights = PyArray_DATA(np_weights); int doshift = 1; int rtn = fit_sip_wcs(PyArray_DATA(np_starxyz), PyArray_DATA(np_fieldxy), weights, M, tanin, sip_order, inv_order, doshift, sipout); if (rtn) { free(sipout); printf("fit_sip_wcs() returned %i\n", rtn); return NULL; } return sipout; } typedef anbool (*f_2to2ok)(const void*, double, double, double*, double*); typedef void (*f_2to2) (const void*, double, double, double*, double*); typedef int (*f_2to2i) (const void*, double, double, double*, double*); static PyObject* broadcast_2to2ok ( //anbool func(const void*, double, double, double*, double*), f_2to2ok func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* broadcast_2to2 ( //void func(const void*, double, double, double*, double*), f_2to2 func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* broadcast_2to2i ( //int func(const void*, double, double, double*, double*), f_2to2i func, const void* baton, PyObject* in1, PyObject* in2); static PyObject* tan_rd2xy_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)tan_radec2pixelxy, wcs, in1, in2); } static PyObject* sip_rd2xy_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)sip_radec2pixelxy, wcs, in1, in2); } static PyObject* anwcs_rd2xy_wrapper(const anwcs_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2i((f_2to2i)anwcs_radec2pixelxy, wcs, in1, in2); } static PyObject* tan_iwc2xy_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_iwc2pixelxy, wcs, in1, in2); } static PyObject* sip_iwc2xy_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_iwc2pixelxy, wcs, in1, in2); } static PyObject* tan_xy2iwc_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_pixelxy2iwc, wcs, in1, in2); } static PyObject* sip_xy2iwc_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_pixelxy2iwc, wcs, in1, in2); } static PyObject* tan_iwc2rd_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_iwc2radec, wcs, in1, in2); } static PyObject* sip_iwc2rd_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_iwc2radec, wcs, in1, in2); } static PyObject* tan_rd2iwc_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)tan_radec2iwc, wcs, in1, in2); } static PyObject* sip_rd2iwc_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2ok((f_2to2ok)sip_radec2iwc, wcs, in1, in2); } static PyObject* tan_xy2rd_wrapper(const tan_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)tan_pixelxy2radec, wcs, in1, in2); } static PyObject* sip_xy2rd_wrapper(const sip_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2((f_2to2)sip_pixelxy2radec, wcs, in1, in2); } static PyObject* anwcs_xy2rd_wrapper(const anwcs_t* wcs, PyObject* in1, PyObject* in2) { return broadcast_2to2i((f_2to2i)anwcs_pixelxy2radec, wcs, in1, in2); } static PyObject* broadcast_2to2ok ( //anbool func(const void*, double, double, double*, double*), f_2to2ok func, const void* baton, PyObject* in1, PyObject* in2) { NpyIter *iter = NULL; NpyIter_IterNextFunc *iternext; PyArrayObject *op[5]; PyObject *ret; npy_uint32 flags; npy_uint32 op_flags[5]; npy_intp *innersizeptr; char **dataptrarray; npy_intp* strideptr; PyArray_Descr* dtypes[5]; npy_intp i, N; // we'll do the inner loop ourselves flags = NPY_ITER_EXTERNAL_LOOP; // use buffers to satisfy dtype casts flags |= NPY_ITER_BUFFERED; // grow inner loop flags |= NPY_ITER_GROWINNER; op[0] = (PyArrayObject*)PyArray_FromAny(in1, NULL, 0, 0, 0, NULL); op[1] = (PyArrayObject*)PyArray_FromAny(in2, NULL, 0, 0, 0, NULL); // automatically allocate the output arrays. op[2] = NULL; op[3] = NULL; op[4] = NULL; if ((PyArray_Size((PyObject*)op[0]) == 0) || (PyArray_Size((PyObject*)op[1]) == 0)) { // empty inputs -- empty outputs npy_intp dim = 0; ret = Py_BuildValue("(NNN)", PyArray_SimpleNew(1, &dim, NPY_BOOL), PyArray_SimpleNew(1, &dim, NPY_DOUBLE), PyArray_SimpleNew(1, &dim, NPY_DOUBLE)); goto cleanup; } op_flags[0] = NPY_ITER_READONLY | NPY_ITER_NBO; op_flags[1] = NPY_ITER_READONLY | NPY_ITER_NBO; op_flags[2] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; op_flags[3] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; op_flags[4] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_NBO; dtypes[0] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[1] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[2] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[3] = PyArray_DescrFromType(NPY_DOUBLE); dtypes[4] = PyArray_DescrFromType(NPY_BOOL); iter = NpyIter_MultiNew(5, op, flags, NPY_KEEPORDER, NPY_SAFE_CASTING, op_flags, dtypes); for (i=0; i<5; i++) Py_DECREF(dtypes[i]); if (!iter) return NULL; iternext = NpyIter_GetIterNext(iter, NULL); strideptr = NpyIter_GetInnerStrideArray(iter); // The inner loop size and data pointers may change during the // loop, so just cache the addresses. innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); dataptrarray = NpyIter_GetDataPtrArray(iter); do { // are the inputs contiguous? (Outputs will be, since we // allocated them) if ((strideptr[0] == sizeof(double)) && (strideptr[1] == sizeof(double))) { // printf("Contiguous inputs; going fast\n"); double* din1 = (double*)(dataptrarray[0]); double* din2 = (double*)(dataptrarray[1]); double* dout1 = (double*)(dataptrarray[2]); double* dout2 = (double*)(dataptrarray[3]); char* ok = dataptrarray[4]; N = *innersizeptr; while (N--) { *ok = func(baton, *din1, *din2, dout1, dout2); ok++; din1++; din2++; dout1++; dout2++; } } else { // printf("Non-contiguous inputs; going slow\n"); npy_intp stride1 = strideptr[0]; npy_intp stride2 = strideptr[1]; npy_intp size = *innersizeptr; char* src1 = dataptrarray[0]; char* src2 = dataptrarray[1]; double* dout1 = (double*)dataptrarray[2]; double* dout2 = (double*)dataptrarray[3]; char* ok = dataptrarray[4]; for (i=0; i= H || xi < 0 || xi >= W) { printf("Warning: skipping out-of-range value: i=%i, xi,yi = %i,%i\n", i, xi, yi); } else { counts[yi*W + xi]++; } px++; py++; } Py_DECREF(np_counts); Py_DECREF(np_x); Py_DECREF(np_y); return 0; } SWIGINTERNINLINE int SWIG_AsVal_size_t (PyObject * obj, size_t *val) { unsigned long v; int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = (size_t)(v); return res; } SWIGINTERNINLINE PyObject * SWIG_From_size_t (size_t value) { return SWIG_From_unsigned_SS_long ((unsigned long)(value)); } SWIGINTERN int SWIG_AsCharArray(PyObject * obj, char *val, size_t size) { char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); } if (alloc == SWIG_NEWOBJ) { free((char*)cptr); res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) free((char*)cptr); } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_char (PyObject * obj, char *val) { int res = SWIG_AsCharArray(obj, val, 1); if (!SWIG_IsOK(res)) { long v; res = SWIG_AddCast(SWIG_AsVal_long (obj, &v)); if (SWIG_IsOK(res)) { if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { if (val) *val = (char)(v); } else { res = SWIG_OverflowError; } } } return res; } SWIGINTERNINLINE PyObject * SWIG_From_float (float value) { return SWIG_From_double (value); } int dcen3x3b(float i0, float i1, float i2, float i3, float i4, float i5, float i6, float i7, float i8, float *xcen, float *ycen) { float im[9]; im[0] = i0; im[1] = i1; im[2] = i2; im[3] = i3; im[4] = i4; im[5] = i5; im[6] = i6; im[7] = i7; im[8] = i8; return dcen3x3(im, xcen, ycen); } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_log_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:log_init",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "log_init" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); log_init(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_log_get_level(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int result; if (!PyArg_ParseTuple(args,(char *)":log_get_level")) SWIG_fail; result = (int)log_get_level(); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_log_set_level(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:log_set_level",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "log_set_level" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); log_set_level(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_img_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; number *arg2 = (number *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_img_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_img_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_t_img_set" "', argument " "2"" of type '" "number *""'"); } arg2 = (number *)(argp2); if (arg1) (arg1)->img = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_img_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; number *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_img_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_img_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (number *) ((arg1)->img); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_weight_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; number *arg2 = (number *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_weight_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_weight_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_t_weight_set" "', argument " "2"" of type '" "number *""'"); } arg2 = (number *)(argp2); if (arg1) (arg1)->weight = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_weight_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; number *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_weight_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_weight_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (number *) ((arg1)->weight); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_W_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_W_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_W_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_t_W_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->W = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_W_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_W_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_W_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (int) ((arg1)->W); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_H_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_H_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_H_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_t_H_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->H = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_H_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_H_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_H_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (int) ((arg1)->H); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_wcs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_wcs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_wcs_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_t_wcs_set" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); if (arg1) (arg1)->wcs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_wcs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_wcs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_wcs_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (anwcs_t *) ((arg1)->wcs); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_resample_func_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; double (*arg2)(double,double,number const *,number const *,int,int,double *,void *) = (double (*)(double,double,number const *,number const *,int,int,double *,void *)) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_resample_func_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_resample_func_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "coadd_t_resample_func_set" "', argument " "2"" of type '" "double (*)(double,double,number const *,number const *,int,int,double *,void *)""'"); } } if (arg1) (arg1)->resample_func = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_resample_func_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)(double,double,number const *,number const *,int,int,double *,void *) = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_resample_func_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_resample_func_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (double (*)(double,double,number const *,number const *,int,int,double *,void *)) ((arg1)->resample_func); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_resample_token_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_t_resample_token_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_resample_token_set" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_t_resample_token_set" "', argument " "2"" of type '" "void *""'"); } if (arg1) (arg1)->resample_token = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_t_resample_token_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_t_resample_token_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_t_resample_token_get" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); result = (void *) ((arg1)->resample_token); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_coadd_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_coadd_t")) SWIG_fail; result = (coadd_t *)calloc(1, sizeof(coadd_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_coadd_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_coadd_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_coadd_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_coadd_t" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *coadd_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_coadd_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_coadd_new(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; coadd_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_new",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "coadd_new" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_new" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (coadd_t *)coadd_new(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_coadd_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_new_from_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; coadd_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_new_from_wcs",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_new_from_wcs" "', argument " "1"" of type '" "anwcs_t *""'"); } arg1 = (anwcs_t *)(argp1); result = (coadd_t *)coadd_new_from_wcs(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_coadd_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_set_lanczos(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_set_lanczos",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_set_lanczos" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_set_lanczos" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); coadd_set_lanczos(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_add_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; number *arg2 = (number *) 0 ; number *arg3 = (number *) 0 ; number arg4 ; anwcs_t *arg5 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:coadd_add_image",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_add_image" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_add_image" "', argument " "2"" of type '" "number const *""'"); } arg2 = (number *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "coadd_add_image" "', argument " "3"" of type '" "number const *""'"); } arg3 = (number *)(argp3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "coadd_add_image" "', argument " "4"" of type '" "number""'"); } arg4 = (number)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "coadd_add_image" "', argument " "5"" of type '" "anwcs_t const *""'"); } arg5 = (anwcs_t *)(argp5); result = (int)coadd_add_image(arg1,(float const *)arg2,(float const *)arg3,arg4,(struct anwcs_t const *)arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_divide_by_weight(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; number arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_divide_by_weight",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_divide_by_weight" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_divide_by_weight" "', argument " "2"" of type '" "number""'"); } arg2 = (number)(val2); coadd_divide_by_weight(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_get_snapshot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; number *arg2 = (number *) 0 ; number arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; float val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; number *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:coadd_get_snapshot",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_get_snapshot" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "coadd_get_snapshot" "', argument " "2"" of type '" "number *""'"); } arg2 = (number *)(argp2); ecode3 = SWIG_AsVal_float(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "coadd_get_snapshot" "', argument " "3"" of type '" "number""'"); } arg3 = (number)(val3); result = (number *)coadd_get_snapshot(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_free" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); coadd_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_debug(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:coadd_debug",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_debug" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); coadd_debug(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_create_weight_image_from_range(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; number *arg1 = (number *) 0 ; int arg2 ; int arg3 ; number arg4 ; number arg5 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; number *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:coadd_create_weight_image_from_range",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_create_weight_image_from_range" "', argument " "1"" of type '" "number const *""'"); } arg1 = (number *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_create_weight_image_from_range" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "coadd_create_weight_image_from_range" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "coadd_create_weight_image_from_range" "', argument " "4"" of type '" "number""'"); } arg4 = (number)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "coadd_create_weight_image_from_range" "', argument " "5"" of type '" "number""'"); } arg5 = (number)(val5); result = (number *)coadd_create_weight_image_from_range((float const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_weight_image_mask_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; number *arg1 = (number *) 0 ; int arg2 ; int arg3 ; number *arg4 = (number *) 0 ; number arg5 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; float val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:coadd_weight_image_mask_value",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_weight_image_mask_value" "', argument " "1"" of type '" "number const *""'"); } arg1 = (number *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_weight_image_mask_value" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "coadd_weight_image_mask_value" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "coadd_weight_image_mask_value" "', argument " "4"" of type '" "number *""'"); } arg4 = (number *)(argp4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "coadd_weight_image_mask_value" "', argument " "5"" of type '" "number""'"); } arg5 = (number)(val5); coadd_weight_image_mask_value((float const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_args_t_order_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *arg1 = (lanczos_args_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:lanczos_args_t_order_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lanczos_args_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "lanczos_args_t_order_set" "', argument " "1"" of type '" "lanczos_args_t *""'"); } arg1 = (lanczos_args_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos_args_t_order_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->order = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_args_t_order_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *arg1 = (lanczos_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:lanczos_args_t_order_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lanczos_args_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "lanczos_args_t_order_get" "', argument " "1"" of type '" "lanczos_args_t *""'"); } arg1 = (lanczos_args_t *)(argp1); result = (int) ((arg1)->order); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_args_t_weighted_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *arg1 = (lanczos_args_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:lanczos_args_t_weighted_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lanczos_args_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "lanczos_args_t_weighted_set" "', argument " "1"" of type '" "lanczos_args_t *""'"); } arg1 = (lanczos_args_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos_args_t_weighted_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->weighted = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_args_t_weighted_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *arg1 = (lanczos_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:lanczos_args_t_weighted_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lanczos_args_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "lanczos_args_t_weighted_get" "', argument " "1"" of type '" "lanczos_args_t *""'"); } arg1 = (lanczos_args_t *)(argp1); result = (int) ((arg1)->weighted); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_lanczos_args_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_lanczos_args_t")) SWIG_fail; result = (lanczos_args_t *)calloc(1, sizeof(lanczos_args_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lanczos_args_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_lanczos_args_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; lanczos_args_t *arg1 = (lanczos_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_lanczos_args_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lanczos_args_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_lanczos_args_t" "', argument " "1"" of type '" "lanczos_args_t *""'"); } arg1 = (lanczos_args_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *lanczos_args_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_lanczos_args_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_lanczos(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; int arg2 ; double val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:lanczos",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "lanczos" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (double)lanczos(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nearest_resample_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; float *arg3 = (float *) 0 ; float *arg4 = (float *) 0 ; int arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *arg8 = (void *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; int res8 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:nearest_resample_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "nearest_resample_f" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nearest_resample_f" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "nearest_resample_f" "', argument " "3"" of type '" "float const *""'"); } arg3 = (float *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "nearest_resample_f" "', argument " "4"" of type '" "float const *""'"); } arg4 = (float *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "nearest_resample_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "nearest_resample_f" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "nearest_resample_f" "', argument " "7"" of type '" "double *""'"); } arg7 = (double *)(argp7); res8 = SWIG_ConvertPtr(obj7,SWIG_as_voidptrptr(&arg8), 0, 0); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "nearest_resample_f" "', argument " "8"" of type '" "void *""'"); } result = (double)nearest_resample_f(arg1,arg2,(float const *)arg3,(float const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_resample_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; float *arg3 = (float *) 0 ; float *arg4 = (float *) 0 ; int arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *arg8 = (void *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; int res8 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:lanczos_resample_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "lanczos_resample_f" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos_resample_f" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "lanczos_resample_f" "', argument " "3"" of type '" "float const *""'"); } arg3 = (float *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "lanczos_resample_f" "', argument " "4"" of type '" "float const *""'"); } arg4 = (float *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "lanczos_resample_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "lanczos_resample_f" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "lanczos_resample_f" "', argument " "7"" of type '" "double *""'"); } arg7 = (double *)(argp7); res8 = SWIG_ConvertPtr(obj7,SWIG_as_voidptrptr(&arg8), 0, 0); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "lanczos_resample_f" "', argument " "8"" of type '" "void *""'"); } result = (double)lanczos_resample_f(arg1,arg2,(float const *)arg3,(float const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_resample_unw_sep_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; float *arg3 = (float *) 0 ; int arg4 ; int arg5 ; void *arg6 = (void *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; int res6 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:lanczos_resample_unw_sep_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "lanczos_resample_unw_sep_f" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos_resample_unw_sep_f" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "lanczos_resample_unw_sep_f" "', argument " "3"" of type '" "float const *""'"); } arg3 = (float *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "lanczos_resample_unw_sep_f" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "lanczos_resample_unw_sep_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res6 = SWIG_ConvertPtr(obj5,SWIG_as_voidptrptr(&arg6), 0, 0); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "lanczos_resample_unw_sep_f" "', argument " "6"" of type '" "void *""'"); } result = (double)lanczos_resample_unw_sep_f(arg1,arg2,(float const *)arg3,arg4,arg5,arg6); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_nearest_resample_d(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; int arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *arg8 = (void *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; int res8 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:nearest_resample_d",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "nearest_resample_d" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nearest_resample_d" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "nearest_resample_d" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "nearest_resample_d" "', argument " "4"" of type '" "double const *""'"); } arg4 = (double *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "nearest_resample_d" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "nearest_resample_d" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "nearest_resample_d" "', argument " "7"" of type '" "double *""'"); } arg7 = (double *)(argp7); res8 = SWIG_ConvertPtr(obj7,SWIG_as_voidptrptr(&arg8), 0, 0); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "nearest_resample_d" "', argument " "8"" of type '" "void *""'"); } result = (double)nearest_resample_d(arg1,arg2,(double const *)arg3,(double const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_resample_d(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; int arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *arg8 = (void *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; int res8 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:lanczos_resample_d",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "lanczos_resample_d" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "lanczos_resample_d" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "lanczos_resample_d" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "lanczos_resample_d" "', argument " "4"" of type '" "double const *""'"); } arg4 = (double *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "lanczos_resample_d" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "lanczos_resample_d" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "lanczos_resample_d" "', argument " "7"" of type '" "double *""'"); } arg7 = (double *)(argp7); res8 = SWIG_ConvertPtr(obj7,SWIG_as_voidptrptr(&arg8), 0, 0); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "lanczos_resample_d" "', argument " "8"" of type '" "void *""'"); } result = (double)lanczos_resample_d(arg1,arg2,(double const *)arg3,(double const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *TRUE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "TRUE",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *FALSE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "FALSE",SWIG_From_int((int)(0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_fit_sip_coefficients(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; tan_t *arg5 = (tan_t *) 0 ; int arg6 ; int arg7 ; sip_t *arg8 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:fit_sip_coefficients",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_sip_coefficients" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_sip_coefficients" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fit_sip_coefficients" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fit_sip_coefficients" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_sip_coefficients" "', argument " "5"" of type '" "tan_t const *""'"); } arg5 = (tan_t *)(argp5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "fit_sip_coefficients" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "fit_sip_coefficients" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "fit_sip_coefficients" "', argument " "8"" of type '" "sip_t *""'"); } arg8 = (sip_t *)(argp8); result = (int)fit_sip_coefficients((double const *)arg1,(double const *)arg2,(double const *)arg3,arg4,(tan_t const *)arg5,arg6,arg7,arg8); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_wcs_shift(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:wcs_shift",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "wcs_shift" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "wcs_shift" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "wcs_shift" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); wcs_shift(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_sip_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; tan_t *arg5 = (tan_t *) 0 ; int arg6 ; int arg7 ; int arg8 ; sip_t *arg9 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; int val8 ; int ecode8 = 0 ; void *argp9 = 0 ; int res9 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:fit_sip_wcs",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_sip_wcs" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_sip_wcs" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fit_sip_wcs" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fit_sip_wcs" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_sip_wcs" "', argument " "5"" of type '" "tan_t const *""'"); } arg5 = (tan_t *)(argp5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "fit_sip_wcs" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "fit_sip_wcs" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_int(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "fit_sip_wcs" "', argument " "8"" of type '" "int""'"); } arg8 = (int)(val8); res9 = SWIG_ConvertPtr(obj8, &argp9,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res9)) { SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "fit_sip_wcs" "', argument " "9"" of type '" "sip_t *""'"); } arg9 = (sip_t *)(argp9); result = (int)fit_sip_wcs((double const *)arg1,(double const *)arg2,(double const *)arg3,arg4,(tan_t const *)arg5,arg6,arg7,arg8,arg9); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_sip_wcs_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; int arg5 ; int arg6 ; int arg7 ; int arg8 ; int arg9 ; double *arg10 = (double *) 0 ; int arg11 ; sip_t *arg12 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; int val8 ; int ecode8 = 0 ; int val9 ; int ecode9 = 0 ; void *argp10 = 0 ; int res10 = 0 ; int val11 ; int ecode11 = 0 ; void *argp12 = 0 ; int res12 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOO:fit_sip_wcs_2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_sip_wcs_2" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_sip_wcs_2" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fit_sip_wcs_2" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fit_sip_wcs_2" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "fit_sip_wcs_2" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "fit_sip_wcs_2" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "fit_sip_wcs_2" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_int(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "fit_sip_wcs_2" "', argument " "8"" of type '" "int""'"); } arg8 = (int)(val8); ecode9 = SWIG_AsVal_int(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "fit_sip_wcs_2" "', argument " "9"" of type '" "int""'"); } arg9 = (int)(val9); res10 = SWIG_ConvertPtr(obj9, &argp10,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res10)) { SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "fit_sip_wcs_2" "', argument " "10"" of type '" "double *""'"); } arg10 = (double *)(argp10); ecode11 = SWIG_AsVal_int(obj10, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "fit_sip_wcs_2" "', argument " "11"" of type '" "int""'"); } arg11 = (int)(val11); res12 = SWIG_ConvertPtr(obj11, &argp12,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res12)) { SWIG_exception_fail(SWIG_ArgError(res12), "in method '" "fit_sip_wcs_2" "', argument " "12"" of type '" "sip_t *""'"); } arg12 = (sip_t *)(argp12); result = (int)fit_sip_wcs_2((double const *)arg1,(double const *)arg2,(double const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_tan_wcs_move_tangent_point(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; double *arg4 = (double *) 0 ; tan_t *arg5 = (tan_t *) 0 ; tan_t *arg6 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:fit_tan_wcs_move_tangent_point",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "4"" of type '" "double const *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "5"" of type '" "tan_t const *""'"); } arg5 = (tan_t *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "fit_tan_wcs_move_tangent_point" "', argument " "6"" of type '" "tan_t *""'"); } arg6 = (tan_t *)(argp6); result = (int)fit_tan_wcs_move_tangent_point((double const *)arg1,(double const *)arg2,arg3,(double const *)arg4,(tan_t const *)arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_tan_wcs_move_tangent_point_weighted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; double *arg5 = (double *) 0 ; tan_t *arg6 = (tan_t *) 0 ; tan_t *arg7 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:fit_tan_wcs_move_tangent_point_weighted",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "5"" of type '" "double const *""'"); } arg5 = (double *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "6"" of type '" "tan_t const *""'"); } arg6 = (tan_t *)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "fit_tan_wcs_move_tangent_point_weighted" "', argument " "7"" of type '" "tan_t *""'"); } arg7 = (tan_t *)(argp7); result = (int)fit_tan_wcs_move_tangent_point_weighted((double const *)arg1,(double const *)arg2,(double const *)arg3,arg4,(double const *)arg5,(tan_t const *)arg6,arg7); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_tan_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; tan_t *arg4 = (tan_t *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:fit_tan_wcs",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_tan_wcs" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_tan_wcs" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fit_tan_wcs" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fit_tan_wcs" "', argument " "4"" of type '" "tan_t *""'"); } arg4 = (tan_t *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_tan_wcs" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (int)fit_tan_wcs((double const *)arg1,(double const *)arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_tan_wcs_weighted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; tan_t *arg5 = (tan_t *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:fit_tan_wcs_weighted",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_tan_wcs_weighted" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_tan_wcs_weighted" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fit_tan_wcs_weighted" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fit_tan_wcs_weighted" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fit_tan_wcs_weighted" "', argument " "5"" of type '" "tan_t *""'"); } arg5 = (tan_t *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "fit_tan_wcs_weighted" "', argument " "6"" of type '" "double *""'"); } arg6 = (double *)(argp6); result = (int)fit_tan_wcs_weighted((double const *)arg1,(double const *)arg2,(double const *)arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_print_array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:print_array",&obj0)) SWIG_fail; arg1 = obj0; print_array(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_an_hist2d(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:an_hist2d",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "an_hist2d" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "an_hist2d" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "an_hist2d" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "an_hist2d" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); result = (PyObject *)an_hist2d(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_flat_percentile_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; double arg2 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:flat_percentile_f",&obj0,&obj1)) SWIG_fail; arg1 = obj0; ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "flat_percentile_f" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (double)flat_percentile_f(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_flat_median_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:flat_median_f",&obj0)) SWIG_fail; arg1 = obj0; result = (double)flat_median_f(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_median_smooth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; int arg3 ; PyObject *arg4 = (PyObject *) 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:median_smooth",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; arg1 = obj0; arg2 = obj1; ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "median_smooth" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); arg4 = obj3; result = (int)median_smooth(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *L_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "L",SWIG_From_int((int)(5))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_lanczos5_interpolate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; PyObject *arg5 = (PyObject *) 0 ; PyObject *arg6 = (PyObject *) 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:lanczos5_interpolate",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; arg4 = obj3; arg5 = obj4; arg6 = obj5; result = (int)lanczos5_interpolate(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos3_interpolate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; PyObject *arg5 = (PyObject *) 0 ; PyObject *arg6 = (PyObject *) 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:lanczos3_interpolate",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; arg4 = obj3; arg5 = obj4; arg6 = obj5; result = (int)lanczos3_interpolate(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos3_filter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:lanczos3_filter",&obj0,&obj1)) SWIG_fail; arg1 = obj0; arg2 = obj1; result = (int)lanczos3_filter(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos3_filter_table(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; int arg3 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:lanczos3_filter_table",&obj0,&obj1,&obj2)) SWIG_fail; arg1 = obj0; arg2 = obj1; ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "lanczos3_filter_table" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)lanczos3_filter_table(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_lanczos_shift_image_c(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; int arg5 ; double arg6 ; double arg7 ; int val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:lanczos_shift_image_c",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; arg4 = obj3; ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "lanczos_shift_image_c" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "lanczos_shift_image_c" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "lanczos_shift_image_c" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); result = (int)lanczos_shift_image_c(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *DEFAULT_INDEX_JITTER_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DEFAULT_INDEX_JITTER",SWIG_From_double((double)(1.0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_index_t_codekd_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; codetree_t *arg2 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_codekd_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_codekd_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_codetree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_codekd_set" "', argument " "2"" of type '" "codetree_t *""'"); } arg2 = (codetree_t *)(argp2); if (arg1) (arg1)->codekd = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_codekd_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; codetree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_codekd_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_codekd_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (codetree_t *) ((arg1)->codekd); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_codetree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_quads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; quadfile_t *arg2 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_quads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_quads_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_quadfile_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_quads_set" "', argument " "2"" of type '" "quadfile_t *""'"); } arg2 = (quadfile_t *)(argp2); if (arg1) (arg1)->quads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_quads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_quads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_quads_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (quadfile_t *) ((arg1)->quads); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_starkd_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; startree_t *arg2 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_starkd_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_starkd_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_startree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_starkd_set" "', argument " "2"" of type '" "startree_t *""'"); } arg2 = (startree_t *)(argp2); if (arg1) (arg1)->starkd = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_starkd_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; startree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_starkd_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_starkd_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (startree_t *) ((arg1)->starkd); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_startree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_fits_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; anqfits_t *arg2 = (anqfits_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_fits_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_fits_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anqfits_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_fits_set" "', argument " "2"" of type '" "anqfits_t *""'"); } arg2 = (anqfits_t *)(argp2); if (arg1) (arg1)->fits = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_fits_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anqfits_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_fits_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_fits_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (anqfits_t *) ((arg1)->fits); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anqfits_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_codefn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_codefn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_codefn_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_codefn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->codefn) free((char*)arg1->codefn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->codefn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->codefn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_index_t_codefn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_codefn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_codefn_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (char *) ((arg1)->codefn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_quadfn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_quadfn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_quadfn_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_quadfn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->quadfn) free((char*)arg1->quadfn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->quadfn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->quadfn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_index_t_quadfn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_quadfn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_quadfn_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (char *) ((arg1)->quadfn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_starfn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_starfn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_starfn_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_starfn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->starfn) free((char*)arg1->starfn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->starfn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->starfn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_index_t_starfn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_starfn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_starfn_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (char *) ((arg1)->starfn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_indexname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_indexname_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_indexname_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_indexname_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->indexname) free((char*)arg1->indexname); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->indexname = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->indexname = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_index_t_indexname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_indexname_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_indexname_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (char *) ((arg1)->indexname); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_indexid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_indexid_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_indexid_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_indexid_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->indexid = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_indexid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_indexid_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_indexid_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->indexid); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_healpix_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_healpix_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_healpix_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_healpix_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->healpix = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_healpix_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_healpix_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_healpix_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->healpix); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_hpnside_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_hpnside_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_hpnside_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_hpnside_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->hpnside = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_hpnside_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_hpnside_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_hpnside_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->hpnside); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_jitter_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_index_jitter_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_jitter_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_index_jitter_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->index_jitter = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_jitter_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_index_jitter_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_jitter_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (double) ((arg1)->index_jitter); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutnside_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cutnside_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutnside_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_cutnside_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->cutnside = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutnside_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cutnside_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutnside_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->cutnside); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutnsweep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cutnsweep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutnsweep_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_cutnsweep_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->cutnsweep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutnsweep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cutnsweep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutnsweep_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->cutnsweep); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutdedup_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cutdedup_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutdedup_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_cutdedup_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->cutdedup = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutdedup_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cutdedup_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutdedup_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (double) ((arg1)->cutdedup); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutband_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cutband_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutband_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_t_cutband_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->cutband) free((char*)arg1->cutband); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->cutband = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->cutband = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutband_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cutband_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutband_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (char *) ((arg1)->cutband); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutmargin_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cutmargin_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutmargin_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_cutmargin_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->cutmargin = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cutmargin_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cutmargin_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cutmargin_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->cutmargin); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_circle_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_circle_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_circle_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_circle_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->circle = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_circle_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_circle_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_circle_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (anbool) ((arg1)->circle); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cx_less_than_dx_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_cx_less_than_dx_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cx_less_than_dx_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_cx_less_than_dx_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->cx_less_than_dx = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_cx_less_than_dx_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_cx_less_than_dx_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_cx_less_than_dx_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (anbool) ((arg1)->cx_less_than_dx); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_meanx_less_than_half_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_meanx_less_than_half_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_meanx_less_than_half_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_meanx_less_than_half_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->meanx_less_than_half = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_meanx_less_than_half_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_meanx_less_than_half_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_meanx_less_than_half_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (anbool) ((arg1)->meanx_less_than_half); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_scale_upper_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_index_scale_upper_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_scale_upper_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_index_scale_upper_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->index_scale_upper = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_scale_upper_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_index_scale_upper_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_scale_upper_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (double) ((arg1)->index_scale_upper); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_scale_lower_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_index_scale_lower_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_scale_lower_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_index_scale_lower_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->index_scale_lower = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_index_scale_lower_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_index_scale_lower_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_index_scale_lower_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (double) ((arg1)->index_scale_lower); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_dimquads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_dimquads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_dimquads_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_dimquads_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->dimquads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_dimquads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_dimquads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_dimquads_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->dimquads); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_nstars_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_nstars_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_nstars_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_nstars_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->nstars = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_nstars_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_nstars_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_nstars_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->nstars); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_nquads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:index_t_nquads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_nquads_set" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_t_nquads_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->nquads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_t_nquads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_t_nquads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_t_nquads_get" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int) ((arg1)->nquads); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_index_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_index_t")) SWIG_fail; result = (index_t *)calloc(1, sizeof(index_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_index_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_index_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_index_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_index_t" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *index_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_index_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_index_dimquads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_dimquads",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_dimquads" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int)index_dimquads(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_overlaps_scale_range(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:index_overlaps_scale_range",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_overlaps_scale_range" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_overlaps_scale_range" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "index_overlaps_scale_range" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)index_overlaps_scale_range(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_is_within_range(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOO:index_is_within_range",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_is_within_range" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_is_within_range" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "index_is_within_range" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "index_is_within_range" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (anbool)index_is_within_range(arg1,arg2,arg3,arg4); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_get_meta(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; index_t *arg2 = (index_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:index_get_meta",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_get_meta" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_get_meta" "', argument " "2"" of type '" "index_t *""'"); } arg2 = (index_t *)(argp2); result = (int)index_get_meta((char const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_index_is_file_index(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:index_is_file_index",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_is_file_index" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (anbool)index_is_file_index((char const *)arg1); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_index_get_quad_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_get_quad_filename",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_get_quad_filename" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (char *)index_get_quad_filename((char const *)arg1); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_index_get_qidx_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_get_qidx_filename",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_get_qidx_filename" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (char *)index_get_qidx_filename((char const *)arg1); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *INDEX_ONLY_LOAD_METADATA_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "INDEX_ONLY_LOAD_METADATA",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_index_get_quad_dim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_get_quad_dim",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_get_quad_dim" "', argument " "1"" of type '" "index_t const *""'"); } arg1 = (index_t *)(argp1); result = (int)index_get_quad_dim((index_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_get_code_dim(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_get_code_dim",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_get_code_dim" "', argument " "1"" of type '" "index_t const *""'"); } arg1 = (index_t *)(argp1); result = (int)index_get_code_dim((index_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_nquads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_nquads",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_nquads" "', argument " "1"" of type '" "index_t const *""'"); } arg1 = (index_t *)(argp1); result = (int)index_nquads((index_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_nstars(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_nstars",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_nstars" "', argument " "1"" of type '" "index_t const *""'"); } arg1 = (index_t *)(argp1); result = (int)index_nstars((index_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_build_from(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; quadfile_t *arg2 = (quadfile_t *) 0 ; startree_t *arg3 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; index_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:index_build_from",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_build_from" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_build_from" "', argument " "2"" of type '" "quadfile_t *""'"); } arg2 = (quadfile_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "index_build_from" "', argument " "3"" of type '" "startree_t *""'"); } arg3 = (startree_t *)(argp3); result = (index_t *)index_build_from(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_index_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_load(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; index_t *arg3 = (index_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; index_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:index_load",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_load" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "index_load" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "index_load" "', argument " "3"" of type '" "index_t *""'"); } arg3 = (index_t *)(argp3); result = (index_t *)index_load((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_index_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_index_unload(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_unload",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_unload" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); index_unload(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_reload(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_reload",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_reload" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int)index_reload(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_close_fds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:index_close_fds",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_close_fds" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (int)index_close_fds(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_close",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_close" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); index_close(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:index_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "index_free" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); index_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_index_get_missing_cut_params(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; double *arg4 = (double *) 0 ; int *arg5 = (int *) 0 ; char **arg6 = (char **) 0 ; int val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:index_get_missing_cut_params",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "index_get_missing_cut_params" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "index_get_missing_cut_params" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "index_get_missing_cut_params" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "index_get_missing_cut_params" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "index_get_missing_cut_params" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "index_get_missing_cut_params" "', argument " "6"" of type '" "char **""'"); } arg6 = (char **)(argp6); result = (int)index_get_missing_cut_params(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_numquads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; unsigned int arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_numquads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_numquads_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_numquads_set" "', argument " "2"" of type '" "unsigned int""'"); } arg2 = (unsigned int)(val2); if (arg1) (arg1)->numquads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_numquads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; unsigned int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_numquads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_numquads_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (unsigned int) ((arg1)->numquads); resultobj = SWIG_From_unsigned_SS_int((unsigned int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_numstars_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; unsigned int arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_numstars_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_numstars_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_numstars_set" "', argument " "2"" of type '" "unsigned int""'"); } arg2 = (unsigned int)(val2); if (arg1) (arg1)->numstars = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_numstars_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; unsigned int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_numstars_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_numstars_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (unsigned int) ((arg1)->numstars); resultobj = SWIG_From_unsigned_SS_int((unsigned int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_dimquads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_dimquads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_dimquads_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_dimquads_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->dimquads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_dimquads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_dimquads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_dimquads_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int) ((arg1)->dimquads); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_index_scale_upper_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_index_scale_upper_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_index_scale_upper_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_index_scale_upper_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->index_scale_upper = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_index_scale_upper_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_index_scale_upper_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_index_scale_upper_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (double) ((arg1)->index_scale_upper); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_index_scale_lower_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_index_scale_lower_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_index_scale_lower_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_index_scale_lower_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->index_scale_lower = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_index_scale_lower_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_index_scale_lower_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_index_scale_lower_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (double) ((arg1)->index_scale_lower); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_indexid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_indexid_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_indexid_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_indexid_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->indexid = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_indexid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_indexid_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_indexid_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int) ((arg1)->indexid); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_healpix_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_healpix_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_healpix_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_healpix_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->healpix = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_healpix_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_healpix_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_healpix_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int) ((arg1)->healpix); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_hpnside_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_hpnside_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_hpnside_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_t_hpnside_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->hpnside = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_hpnside_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_hpnside_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_hpnside_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int) ((arg1)->hpnside); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_fb_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; fitsbin_t *arg2 = (fitsbin_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_fb_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_fb_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_fitsbin_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "quadfile_t_fb_set" "', argument " "2"" of type '" "fitsbin_t *""'"); } arg2 = (fitsbin_t *)(argp2); if (arg1) (arg1)->fb = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_fb_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; fitsbin_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_fb_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_fb_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (fitsbin_t *) ((arg1)->fb); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_fitsbin_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_quadarray_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; uint32_t *arg2 = (uint32_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_t_quadarray_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_quadarray_set" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_uint32_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "quadfile_t_quadarray_set" "', argument " "2"" of type '" "uint32_t *""'"); } arg2 = (uint32_t *)(argp2); if (arg1) (arg1)->quadarray = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_t_quadarray_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; uint32_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_t_quadarray_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_t_quadarray_get" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (uint32_t *) ((arg1)->quadarray); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_uint32_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_quadfile_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_quadfile_t")) SWIG_fail; result = (quadfile_t *)calloc(1, sizeof(quadfile_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_quadfile_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_quadfile_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_quadfile_t" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *quadfile_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_quadfile_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_quadfile_open(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_open",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_open" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (quadfile_t *)quadfile_open((char const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_quadfile_open_fits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anqfits_t *arg1 = (anqfits_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_open_fits",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anqfits_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_open_fits" "', argument " "1"" of type '" "anqfits_t *""'"); } arg1 = (anqfits_t *)(argp1); result = (quadfile_t *)quadfile_open_fits(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_get_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_get_filename",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_get_filename" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (char *)quadfile_get_filename((quadfile_t const *)arg1); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_open_for_writing(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_open_for_writing",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_open_for_writing" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (quadfile_t *)quadfile_open_for_writing((char const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_quadfile_open_in_memory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":quadfile_open_in_memory")) SWIG_fail; result = (quadfile_t *)quadfile_open_in_memory(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_quadfile_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_switch_to_reading(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_switch_to_reading",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_switch_to_reading" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_switch_to_reading(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_close",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_close" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_close(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_check(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_check",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_check" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_check((quadfile_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_get_stars(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; unsigned int arg2 ; unsigned int *arg3 = (unsigned int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; unsigned int val2 ; int ecode2 = 0 ; unsigned int tempstars3[DQMAX] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; { arg3 = tempstars3; } if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_get_stars",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_get_stars" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "quadfile_get_stars" "', argument " "2"" of type '" "unsigned int""'"); } arg2 = (unsigned int)(val2); result = (int)quadfile_get_stars((quadfile_t const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); { int i; int D; if (result == -1) { goto fail; } D = arg1->dimquads; resultobj = PyList_New(D); for (i = 0; i < D; i++) { PyObject *o = PyInt_FromLong(arg3[i]); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_write_quad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; unsigned int *arg2 = (unsigned int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; unsigned int tempstars2[DQMAX] ; PyObject * obj0 = 0 ; int result; { arg2 = tempstars2; } if (!PyArg_ParseTuple(args,(char *)"O:quadfile_write_quad",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_write_quad" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_write_quad(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_dimquads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_dimquads",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_dimquads" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_dimquads((quadfile_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_nquads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_nquads",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_nquads" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_nquads((quadfile_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_fix_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_fix_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_fix_header" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_fix_header(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_write_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_write_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_write_header" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); result = (int)quadfile_write_header(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_get_index_scale_upper_arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_get_index_scale_upper_arcsec",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_get_index_scale_upper_arcsec" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (double)quadfile_get_index_scale_upper_arcsec((quadfile_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_get_index_scale_lower_arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_get_index_scale_lower_arcsec",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_get_index_scale_lower_arcsec" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (double)quadfile_get_index_scale_lower_arcsec((quadfile_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_get_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_get_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_get_header" "', argument " "1"" of type '" "quadfile_t const *""'"); } arg1 = (quadfile_t *)(argp1); result = (qfits_header *)quadfile_get_header((quadfile_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_write_header_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_write_header_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_write_header_to" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "quadfile_write_header_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)quadfile_write_header_to(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_write_all_quads_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; quadfile_t *arg1 = (quadfile_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:quadfile_write_all_quads_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_quadfile_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_write_all_quads_to" "', argument " "1"" of type '" "quadfile_t *""'"); } arg1 = (quadfile_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "quadfile_write_all_quads_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)quadfile_write_all_quads_to(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *AN_FILETYPE_CODETREE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "AN_FILETYPE_CODETREE",SWIG_FromCharPtr("CKDT")); return SWIG_Py_Void(); } SWIGINTERN PyObject *CODETREE_NAME_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CODETREE_NAME",SWIG_FromCharPtr("codes")); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_codetree_t_tree_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; kdtree_t *arg2 = (kdtree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_t_tree_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_tree_set" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_kdtree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_t_tree_set" "', argument " "2"" of type '" "kdtree_t *""'"); } arg2 = (kdtree_t *)(argp2); if (arg1) (arg1)->tree = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_t_tree_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; kdtree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_t_tree_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_tree_get" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (kdtree_t *) ((arg1)->tree); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_kdtree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_t_header_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_t_header_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_header_set" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_t_header_set" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); if (arg1) (arg1)->header = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_t_header_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_t_header_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_header_get" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (qfits_header *) ((arg1)->header); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_t_inverse_perm_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; int *arg2 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_t_inverse_perm_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_inverse_perm_set" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_t_inverse_perm_set" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); if (arg1) (arg1)->inverse_perm = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_t_inverse_perm_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_t_inverse_perm_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_t_inverse_perm_get" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (int *) ((arg1)->inverse_perm); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_codetree_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_codetree_t")) SWIG_fail; result = (codetree_t *)calloc(1, sizeof(codetree_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_codetree_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_codetree_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_codetree_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_codetree_t" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *codetree_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_codetree_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_codetree_open(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; codetree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_open",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_open" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (codetree_t *)codetree_open((char const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_codetree_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_codetree_open_fits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anqfits_t *arg1 = (anqfits_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; codetree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_open_fits",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anqfits_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_open_fits" "', argument " "1"" of type '" "anqfits_t *""'"); } arg1 = (anqfits_t *)(argp1); result = (codetree_t *)codetree_open_fits(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_codetree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; unsigned int arg2 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; unsigned int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:codetree_get",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_get" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "codetree_get" "', argument " "2"" of type '" "unsigned int""'"); } arg2 = (unsigned int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "codetree_get" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); result = (int)codetree_get(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_N(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:codetree_N",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_N" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (int)codetree_N(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_nodes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:codetree_nodes",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_nodes" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (int)codetree_nodes(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:codetree_D",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_D" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (int)codetree_D(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_get_permuted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_get_permuted",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_get_permuted" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "codetree_get_permuted" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)codetree_get_permuted(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:codetree_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_header" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (qfits_header *)codetree_header(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:codetree_close",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_close" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); result = (int)codetree_close(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_new(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":codetree_new")) SWIG_fail; result = (codetree_t *)codetree_new(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_codetree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_append_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_append_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_append_to" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_append_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)codetree_append_to(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codetree_write_to_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_write_to_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_write_to_file" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_write_to_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)codetree_write_to_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_codetree_write_to_file_flipped(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; codetree_t *arg1 = (codetree_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:codetree_write_to_file_flipped",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_codetree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codetree_write_to_file_flipped" "', argument " "1"" of type '" "codetree_t *""'"); } arg1 = (codetree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "codetree_write_to_file_flipped" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)codetree_write_to_file_flipped(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *AN_FILETYPE_STARTREE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "AN_FILETYPE_STARTREE",SWIG_FromCharPtr("SKDT")); return SWIG_Py_Void(); } SWIGINTERN PyObject *AN_FILETYPE_TAGALONG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "AN_FILETYPE_TAGALONG",SWIG_FromCharPtr("TAGALONG")); return SWIG_Py_Void(); } SWIGINTERN PyObject *STARTREE_NAME_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "STARTREE_NAME",SWIG_FromCharPtr("stars")); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_startree_t_tree_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; kdtree_t *arg2 = (kdtree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_tree_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_tree_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_kdtree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_t_tree_set" "', argument " "2"" of type '" "kdtree_t *""'"); } arg2 = (kdtree_t *)(argp2); if (arg1) (arg1)->tree = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_tree_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; kdtree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_tree_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_tree_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (kdtree_t *) ((arg1)->tree); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_kdtree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_header_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_header_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_header_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_t_header_set" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); if (arg1) (arg1)->header = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_header_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_header_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_header_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (qfits_header *) ((arg1)->header); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_inverse_perm_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int *arg2 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_inverse_perm_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_inverse_perm_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_t_inverse_perm_set" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); if (arg1) (arg1)->inverse_perm = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_inverse_perm_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_inverse_perm_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_inverse_perm_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (int *) ((arg1)->inverse_perm); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_sweep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; uint8_t *arg2 = (uint8_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_sweep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_sweep_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_uint8_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_t_sweep_set" "', argument " "2"" of type '" "uint8_t *""'"); } arg2 = (uint8_t *)(argp2); if (arg1) (arg1)->sweep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_sweep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; uint8_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_sweep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_sweep_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (uint8_t *) ((arg1)->sweep); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_uint8_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_writing_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_writing_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_writing_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_t_writing_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->writing = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_writing_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_writing_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_writing_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (int) ((arg1)->writing); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_tagalong_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; fitstable_t *arg2 = (fitstable_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_t_tagalong_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_tagalong_set" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_fitstable_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_t_tagalong_set" "', argument " "2"" of type '" "fitstable_t *""'"); } arg2 = (fitstable_t *)(argp2); if (arg1) (arg1)->tagalong = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_t_tagalong_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; fitstable_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_t_tagalong_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_t_tagalong_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (fitstable_t *) ((arg1)->tagalong); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_fitstable_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_startree_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_startree_t")) SWIG_fail; result = (startree_t *)calloc(1, sizeof(startree_t)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_startree_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_startree_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_startree_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_startree_t" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *startree_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_startree_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_startree_open(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; startree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_open",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_open" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (startree_t *)startree_open((char const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_startree_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_startree_open_fits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anqfits_t *arg1 = (anqfits_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; startree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_open_fits",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anqfits_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_open_fits" "', argument " "1"" of type '" "anqfits_t *""'"); } arg1 = (anqfits_t *)(argp1); result = (startree_t *)startree_open_fits(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_startree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_search_for(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; double *arg2 = (double *) 0 ; double arg3 ; double **arg4 = (double **) 0 ; double **arg5 = (double **) 0 ; int **arg6 = (int **) 0 ; int *arg7 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:startree_search_for",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_search_for" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_search_for" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "startree_search_for" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "startree_search_for" "', argument " "4"" of type '" "double **""'"); } arg4 = (double **)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "startree_search_for" "', argument " "5"" of type '" "double **""'"); } arg5 = (double **)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "startree_search_for" "', argument " "6"" of type '" "int **""'"); } arg6 = (int **)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "startree_search_for" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); startree_search_for((startree_t const *)arg1,(double const *)arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_search_for_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double **arg5 = (double **) 0 ; double **arg6 = (double **) 0 ; int **arg7 = (int **) 0 ; int *arg8 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:startree_search_for_radec",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_search_for_radec" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_search_for_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "startree_search_for_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "startree_search_for_radec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "startree_search_for_radec" "', argument " "5"" of type '" "double **""'"); } arg5 = (double **)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "startree_search_for_radec" "', argument " "6"" of type '" "double **""'"); } arg6 = (double **)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "startree_search_for_radec" "', argument " "7"" of type '" "int **""'"); } arg7 = (int **)(argp7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "startree_search_for_radec" "', argument " "8"" of type '" "int *""'"); } arg8 = (int *)(argp8); startree_search_for_radec((startree_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_search(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; double *arg2 = (double *) 0 ; double arg3 ; double **arg4 = (double **) 0 ; double **arg5 = (double **) 0 ; int *arg6 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:startree_search",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_search" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_search" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "startree_search" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "startree_search" "', argument " "4"" of type '" "double **""'"); } arg4 = (double **)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "startree_search" "', argument " "5"" of type '" "double **""'"); } arg5 = (double **)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "startree_search" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); startree_search((startree_t const *)arg1,(double const *)arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_data_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; char *arg2 = (char *) 0 ; int *arg3 = (int *) 0 ; int arg4 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:startree_get_data_column",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_data_column" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_get_data_column" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "startree_get_data_column" "', argument " "3"" of type '" "int const *""'"); } arg3 = (int *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "startree_get_data_column" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (double *)startree_get_data_column(arg1,(char const *)arg2,(int const *)arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); { int i; int N; if (!result) { goto fail; } N = arg4; resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj, i, o); } free(result); } if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_startree_get_data_column_int64(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; char *arg2 = (char *) 0 ; int *arg3 = (int *) 0 ; int arg4 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int64_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:startree_get_data_column_int64",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_data_column_int64" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_get_data_column_int64" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "startree_get_data_column_int64" "', argument " "3"" of type '" "int const *""'"); } arg3 = (int *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "startree_get_data_column_int64" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (int64_t *)startree_get_data_column_int64(arg1,(char const *)arg2,(int const *)arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int64_t, 0 | 0 ); { int i; int N; if (!result) { goto fail; } N = arg4; resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj, i, o); } free(result); } if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_startree_get_data_column_array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; char *arg2 = (char *) 0 ; int *arg3 = (int *) 0 ; int arg4 ; int *arg5 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:startree_get_data_column_array",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_data_column_array" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_get_data_column_array" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "startree_get_data_column_array" "', argument " "3"" of type '" "int const *""'"); } arg3 = (int *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "startree_get_data_column_array" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "startree_get_data_column_array" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); result = (double *)startree_get_data_column_array(arg1,(char const *)arg2,(int const *)arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); { int i; int N; if (!result) { goto fail; } N = arg4; resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj, i, o); } free(result); } if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_startree_free_data_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_free_data_column",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_free_data_column" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_free_data_column" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); startree_free_data_column(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_has_tagalong(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:startree_has_tagalong",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_has_tagalong" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (anbool)startree_has_tagalong(arg1); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; fitstable_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_tagalong",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (fitstable_t *)startree_get_tagalong(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_fitstable_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong_column_names(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; sl *arg2 = (sl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; sl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_get_tagalong_column_names",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong_column_names" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sl, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_get_tagalong_column_names" "', argument " "2"" of type '" "sl *""'"); } arg2 = (sl *)(argp2); result = (sl *)startree_get_tagalong_column_names(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong_N_columns(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_tagalong_N_columns",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong_N_columns" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_get_tagalong_N_columns(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong_column_name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_get_tagalong_column_name",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong_column_name" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get_tagalong_column_name" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (char *)startree_get_tagalong_column_name(arg1,arg2); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong_column_fits_type(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; tfits_type result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_get_tagalong_column_fits_type",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong_column_fits_type" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get_tagalong_column_fits_type" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = startree_get_tagalong_column_fits_type(arg1,arg2); resultobj = SWIG_NewPointerObj((tfits_type *)memcpy((tfits_type *)malloc(sizeof(tfits_type)),&result,sizeof(tfits_type)), SWIGTYPE_p_tfits_type, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_tagalong_column_array_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_get_tagalong_column_array_size",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_tagalong_column_array_size" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get_tagalong_column_array_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)startree_get_tagalong_column_array_size(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_cut_nside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_cut_nside",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_cut_nside" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_get_cut_nside((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_cut_nsweeps(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_cut_nsweeps",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_cut_nsweeps" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_get_cut_nsweeps((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_cut_dedup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_cut_dedup",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_cut_dedup" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (double)startree_get_cut_dedup((startree_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_cut_band(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_cut_band",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_cut_band" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (char *)startree_get_cut_band((startree_t const *)arg1); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_cut_margin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_cut_margin",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_cut_margin" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_get_cut_margin((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_jitter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:startree_get_jitter",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_jitter" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (double)startree_get_jitter((startree_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_set_jitter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:startree_set_jitter",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_set_jitter" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_set_jitter" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); startree_set_jitter(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_sweep(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_get_sweep",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_sweep" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get_sweep" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)startree_get_sweep((startree_t const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_N(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_N",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_N" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_N((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_nodes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_nodes",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_nodes" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_nodes((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_D",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_D" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_D((startree_t const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_header" "', argument " "1"" of type '" "startree_t const *""'"); } arg1 = (startree_t *)(argp1); result = (qfits_header *)startree_header((startree_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:startree_get",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "startree_get" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); result = (int)startree_get(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_get_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:startree_get_radec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_get_radec" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "startree_get_radec" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "startree_get_radec" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "startree_get_radec" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (int)startree_get_radec(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_close(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_close",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_close" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_close(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_compute_inverse_perm(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:startree_compute_inverse_perm",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_compute_inverse_perm" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); startree_compute_inverse_perm(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_check_inverse_perm(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:startree_check_inverse_perm",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_check_inverse_perm" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); result = (int)startree_check_inverse_perm(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_new(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":startree_new")) SWIG_fail; result = (startree_t *)startree_new(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_startree_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_startree_write_to_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_write_to_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_write_to_file" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_write_to_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)startree_write_to_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_startree_write_to_file_flipped(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_write_to_file_flipped",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_write_to_file_flipped" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_write_to_file_flipped" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)startree_write_to_file_flipped(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_startree_append_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; startree_t *arg1 = (startree_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:startree_append_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_startree_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "startree_append_to" "', argument " "1"" of type '" "startree_t *""'"); } arg1 = (startree_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "startree_append_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)startree_append_to(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_code_alloc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:code_alloc",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "code_alloc" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); result = (double *)code_alloc(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_code_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:code_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "code_free" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); code_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_code_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:code_get",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "code_get" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "code_get" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (double)code_get(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_codekd_addr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; long result; if (!PyArg_ParseTuple(args,(char *)"O:codekd_addr",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "codekd_addr" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (long)codekd_addr(arg1); resultobj = SWIG_From_long((long)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_starkd_addr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; long result; if (!PyArg_ParseTuple(args,(char *)"O:starkd_addr",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "starkd_addr" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (long)starkd_addr(arg1); resultobj = SWIG_From_long((long)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_quadfile_addr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; index_t *arg1 = (index_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; long result; if (!PyArg_ParseTuple(args,(char *)"O:quadfile_addr",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "quadfile_addr" "', argument " "1"" of type '" "index_t *""'"); } arg1 = (index_t *)(argp1); result = (long)quadfile_addr(arg1); resultobj = SWIG_From_long((long)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *HP_MAX_INT_NSIDE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "HP_MAX_INT_NSIDE",SWIG_From_int((int)(13377))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_healpix_xy_to_ring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:healpix_xy_to_ring",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_xy_to_ring" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_xy_to_ring" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)healpix_xy_to_ring(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_ring_to_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:healpix_ring_to_xy",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_ring_to_xy" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_ring_to_xy" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)healpix_ring_to_xy(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_xy_to_nested(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:healpix_xy_to_nested",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_xy_to_nested" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_xy_to_nested" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)healpix_xy_to_nested(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_nested_to_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:healpix_nested_to_xy",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_nested_to_xy" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_nested_to_xy" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)healpix_nested_to_xy(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_decompose_ring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_decompose_ring",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_decompose_ring" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_decompose_ring" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_decompose_ring" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_decompose_ring" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); healpix_decompose_ring(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_compose_ring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:healpix_compose_ring",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_compose_ring" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_compose_ring" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_compose_ring" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)healpix_compose_ring(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_decompose_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; int val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_decompose_xy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_decompose_xy" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "healpix_decompose_xy" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_decompose_xy" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_decompose_xy" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "healpix_decompose_xy" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); healpix_decompose_xy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_decompose_xyl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int64_t arg1 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int arg5 ; void *argp1 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_decompose_xyl",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; { res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_int64_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpix_decompose_xyl" "', argument " "1"" of type '" "int64_t""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "healpix_decompose_xyl" "', argument " "1"" of type '" "int64_t""'"); } else { arg1 = *((int64_t *)(argp1)); } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "healpix_decompose_xyl" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_decompose_xyl" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_decompose_xyl" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "healpix_decompose_xyl" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); healpix_decompose_xyl(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_compose_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int arg4 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_compose_xy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_compose_xy" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_compose_xy" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_compose_xy" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_compose_xy" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (int)healpix_compose_xy(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_compose_xyl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int arg4 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int64_t result; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_compose_xyl",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_compose_xyl" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_compose_xyl" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_compose_xyl" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_compose_xyl" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = healpix_compose_xyl(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_convert_xy_nside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int arg4 ; int *arg5 = (int *) 0 ; int *arg6 = (int *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:healpix_convert_xy_nside",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_convert_xy_nside" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_convert_xy_nside" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_convert_xy_nside" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_convert_xy_nside" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_convert_xy_nside" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "healpix_convert_xy_nside" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); healpix_convert_xy_nside(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_convert_nside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_convert_nside",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_convert_nside" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_convert_nside" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_convert_nside" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_convert_nside" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); healpix_convert_nside(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radectohealpix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:radectohealpix",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radectohealpix" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radectohealpix" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radectohealpix" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)radectohealpix(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radectohealpixf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:radectohealpixf",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radectohealpixf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radectohealpixf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radectohealpixf" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)radectohealpixf(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radectohealpixl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int64_t result; if (!PyArg_ParseTuple(args,(char *)"OOO:radectohealpixl",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radectohealpixl" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radectohealpixl" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radectohealpixl" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = radectohealpixl(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radectohealpixlf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int64_t result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:radectohealpixlf",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radectohealpixlf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radectohealpixlf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radectohealpixlf" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = radectohealpixlf(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdegtohealpix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:radecdegtohealpix",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdegtohealpix" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdegtohealpix" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radecdegtohealpix" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)radecdegtohealpix(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdegtohealpixf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:radecdegtohealpixf",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdegtohealpixf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdegtohealpixf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radecdegtohealpixf" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)radecdegtohealpixf(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdegtohealpixl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int64_t result; if (!PyArg_ParseTuple(args,(char *)"OOO:radecdegtohealpixl",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdegtohealpixl" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdegtohealpixl" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radecdegtohealpixl" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = radecdegtohealpixl(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdegtohealpixlf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int64_t result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:radecdegtohealpixlf",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdegtohealpixlf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdegtohealpixlf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radecdegtohealpixlf" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = radecdegtohealpixlf(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyztohealpix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:xyztohealpix",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xyztohealpix" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyztohealpix" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "xyztohealpix" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "xyztohealpix" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (int)xyztohealpix(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyztohealpixl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int64_t result; if (!PyArg_ParseTuple(args,(char *)"OOOO:xyztohealpixl",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xyztohealpixl" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyztohealpixl" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "xyztohealpixl" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "xyztohealpixl" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = xyztohealpixl(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyztohealpixf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:xyztohealpixf",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xyztohealpixf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyztohealpixf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "xyztohealpixf" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "xyztohealpixf" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (int)xyztohealpixf(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyztohealpixlf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int64_t result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:xyztohealpixlf",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xyztohealpixlf" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyztohealpixlf" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "xyztohealpixlf" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "xyztohealpixlf" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = xyztohealpixlf(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarrtohealpix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:xyzarrtohealpix",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarrtohealpix" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyzarrtohealpix" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)xyzarrtohealpix((double const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarrtohealpixl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int64_t result; if (!PyArg_ParseTuple(args,(char *)"OO:xyzarrtohealpixl",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarrtohealpixl" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyzarrtohealpixl" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = xyzarrtohealpixl((double const *)arg1,arg2); resultobj = SWIG_NewPointerObj((int64_t *)memcpy((int64_t *)malloc(sizeof(int64_t)),&result,sizeof(int64_t)), SWIGTYPE_p_int64_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarrtohealpixf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"OO:xyzarrtohealpixf",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarrtohealpixf" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyzarrtohealpixf" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)xyzarrtohealpixf((double const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; double *arg7 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; double temp7 ; int res7 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; arg5 = &temp5; arg6 = &temp6; arg7 = &temp7; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_to_xyz",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_xyz" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_xyz" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_xyz" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_xyz" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); healpix_to_xyz(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res7)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg7))); } else { int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_to_xyzarr",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_xyzarr" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_xyzarr" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_xyzarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_xyzarr" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_to_xyzarr" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); healpix_to_xyzarr(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_to_radec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_radec" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_radec" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_radec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); healpix_to_radec(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_to_radecdeg",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_radecdeg" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_radecdeg" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_radecdeg" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_radecdeg" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); healpix_to_radecdeg(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpixl_to_radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int64_t arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpixl_to_radecdeg",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; { res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_int64_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpixl_to_radecdeg" "', argument " "1"" of type '" "int64_t""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "healpixl_to_radecdeg" "', argument " "1"" of type '" "int64_t""'"); } else { arg1 = *((int64_t *)(argp1)); } } ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpixl_to_radecdeg" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpixl_to_radecdeg" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpixl_to_radecdeg" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); healpixl_to_radecdeg(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_radecarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_to_radecarr",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_radecarr" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_radecarr" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_radecarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_radecarr" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_to_radecarr" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); healpix_to_radecarr(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_to_radecdegarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_to_radecdegarr",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_to_radecdegarr" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_to_radecdegarr" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_to_radecdegarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_to_radecdegarr" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_to_radecdegarr" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); healpix_to_radecdegarr(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_side_length_arcmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:healpix_side_length_arcmin",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_side_length_arcmin" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); result = (double)healpix_side_length_arcmin(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_nside_for_side_length_arcmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:healpix_nside_for_side_length_arcmin",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_nside_for_side_length_arcmin" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)healpix_nside_for_side_length_arcmin(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_get_neighbours(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int *arg2 = (int *) 0 ; int arg3 ; int val1 ; int ecode1 = 0 ; int tempneigh2[8] ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; { arg2 = tempneigh2; } if (!PyArg_ParseTuple(args,(char *)"OO:healpix_get_neighbours",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_get_neighbours" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode3 = SWIG_AsVal_int(obj1, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_get_neighbours" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)healpix_get_neighbours(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); { int i; int nn; // convert resultobj to nn //nn = (int)PyInt_AsLong(resultobj); nn = result; resultobj = PyList_New(nn); for (i = 0; i < nn; i++) { PyObject *o = PyInt_FromLong(arg2[i]); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_get_neighboursl(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int64_t arg1 ; int64_t *arg2 = (int64_t *) 0 ; int arg3 ; void *argp1 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:healpix_get_neighboursl",&obj0,&obj1,&obj2)) SWIG_fail; { res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_int64_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpix_get_neighboursl" "', argument " "1"" of type '" "int64_t""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "healpix_get_neighboursl" "', argument " "1"" of type '" "int64_t""'"); } else { arg1 = *((int64_t *)(argp1)); } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int64_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "healpix_get_neighboursl" "', argument " "2"" of type '" "int64_t *""'"); } arg2 = (int64_t *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_get_neighboursl" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)healpix_get_neighboursl(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_get_neighbours_within_range(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double arg2 ; int *arg3 = (int *) 0 ; int arg4 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_get_neighbours_within_range",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpix_get_neighbours_within_range" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_get_neighbours_within_range" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_get_neighbours_within_range" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_get_neighbours_within_range" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (int)healpix_get_neighbours_within_range(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_get_neighbours_within_range_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int *arg4 = (int *) 0 ; int arg5 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_get_neighbours_within_range_radec",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_get_neighbours_within_range_radec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_get_neighbours_within_range_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_get_neighbours_within_range_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_get_neighbours_within_range_radec" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "healpix_get_neighbours_within_range_radec" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); result = (int)healpix_get_neighbours_within_range_radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_distance_to_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_distance_to_radec",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_distance_to_radec" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_distance_to_radec" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_distance_to_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_distance_to_radec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_distance_to_radec" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (double)healpix_distance_to_radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_distance_to_xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_distance_to_xyz",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_distance_to_xyz" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_distance_to_xyz" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_distance_to_xyz" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_distance_to_xyz" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (double)healpix_distance_to_xyz(arg1,arg2,(double const *)arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_within_range_of_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; double arg4 ; double arg5 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:healpix_within_range_of_radec",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_within_range_of_radec" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_within_range_of_radec" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_within_range_of_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_within_range_of_radec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "healpix_within_range_of_radec" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); result = (int)healpix_within_range_of_radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_within_range_of_xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double *arg3 = (double *) 0 ; double arg4 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_within_range_of_xyz",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_within_range_of_xyz" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_within_range_of_xyz" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "healpix_within_range_of_xyz" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_within_range_of_xyz" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (int)healpix_within_range_of_xyz(arg1,arg2,(double const *)arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_radec_bounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg3 = &temp3; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OO:healpix_radec_bounds",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_radec_bounds" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_radec_bounds" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); healpix_radec_bounds(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_rangesearch_xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double arg2 ; int arg3 ; il *arg4 = (il *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; il *result = 0 ; { arg4 = NULL; } if (!PyArg_ParseTuple(args,(char *)"OOO:healpix_rangesearch_xyz",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpix_rangesearch_xyz" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_rangesearch_xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_rangesearch_xyz" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (il *)healpix_rangesearch_xyz((double const *)arg1,arg2,arg3,arg4); { int i; int N; N = il_size(result); resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get(result, i)); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_rangesearch_xyz_approx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double arg2 ; int arg3 ; il *arg4 = (il *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; il *result = 0 ; { arg4 = NULL; } if (!PyArg_ParseTuple(args,(char *)"OOO:healpix_rangesearch_xyz_approx",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "healpix_rangesearch_xyz_approx" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_rangesearch_xyz_approx" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_rangesearch_xyz_approx" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (il *)healpix_rangesearch_xyz_approx((double const *)arg1,arg2,arg3,arg4); { int i; int N; N = il_size(result); resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get(result, i)); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_rangesearch_radec_approx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; il *arg5 = (il *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; il *result = 0 ; { arg5 = NULL; } if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_rangesearch_radec_approx",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_rangesearch_radec_approx" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_rangesearch_radec_approx" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_rangesearch_radec_approx" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_rangesearch_radec_approx" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (il *)healpix_rangesearch_radec_approx(arg1,arg2,arg3,arg4,arg5); { int i; int N; N = il_size(result); resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get(result, i)); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_rangesearch_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; il *arg5 = (il *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; il *result = 0 ; { arg5 = NULL; } if (!PyArg_ParseTuple(args,(char *)"OOOO:healpix_rangesearch_radec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_rangesearch_radec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "healpix_rangesearch_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_rangesearch_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "healpix_rangesearch_radec" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (il *)healpix_rangesearch_radec(arg1,arg2,arg3,arg4,arg5); { int i; int N; N = il_size(result); resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get(result, i)); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_healpix_region_search(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; il *arg2 = (il *) 0 ; int arg3 ; il *arg4 = (il *) 0 ; il *arg5 = (il *) 0 ; int (*arg6)(int,void *) = (int (*)(int,void *)) 0 ; void *arg7 = (void *) 0 ; int arg8 ; int val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; int res7 ; int val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; il *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:healpix_region_search",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "healpix_region_search" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_il, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "healpix_region_search" "', argument " "2"" of type '" "il *""'"); } arg2 = (il *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "healpix_region_search" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_il, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "healpix_region_search" "', argument " "4"" of type '" "il *""'"); } arg4 = (il *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_il, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "healpix_region_search" "', argument " "5"" of type '" "il *""'"); } arg5 = (il *)(argp5); { int res = SWIG_ConvertFunctionPtr(obj5, (void**)(&arg6), SWIGTYPE_p_f_int_p_void__int); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "healpix_region_search" "', argument " "6"" of type '" "int (*)(int,void *)""'"); } } res7 = SWIG_ConvertPtr(obj6,SWIG_as_voidptrptr(&arg7), 0, 0); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "healpix_region_search" "', argument " "7"" of type '" "void *""'"); } ecode8 = SWIG_AsVal_int(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "healpix_region_search" "', argument " "8"" of type '" "int""'"); } arg8 = (int)(val8); result = (il *)healpix_region_search(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); { int i; int N; N = il_size(result); resultobj = PyList_New(N); for (i = 0; i < N; i++) { PyObject *o = PyInt_FromLong(il_get(result, i)); PyList_SetItem(resultobj, i, o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_wcslib_to_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; char **arg2 = (char **) 0 ; int *arg3 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; char *tempstr2 ; int slen3 ; PyObject * obj0 = 0 ; char *result = 0 ; { arg2 = &tempstr2; } { arg3 = &slen3; } if (!PyArg_ParseTuple(args,(char *)"O:anwcs_wcslib_to_string",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_wcslib_to_string" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (char *)anwcs_wcslib_to_string((struct anwcs_t const *)arg1,arg2,arg3); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *ANWCS_TYPE_WCSLIB_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ANWCS_TYPE_WCSLIB",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ANWCS_TYPE_SIP_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ANWCS_TYPE_SIP",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ANWCS_TYPE_WCSTOOLS_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ANWCS_TYPE_WCSTOOLS",SWIG_From_int((int)(3))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_anwcs_t_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_t_type_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_type_set" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_type_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->type = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_type_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_type_get" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); result = (int) ((arg1)->type); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_data_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_t_data_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_data_set" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_t_data_set" "', argument " "2"" of type '" "void *""'"); } if (arg1) (arg1)->data = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_data_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_data_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_data_get" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); result = (void *) ((arg1)->data); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_anwcs_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 = (int) 0 ; int arg3 = (int) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; struct anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O|OO:new_anwcs_t",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_anwcs_t" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); if (obj1) { ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_anwcs_t" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); } if (obj2) { ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_anwcs_t" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); } result = (struct anwcs_t *)new_anwcs_t(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_delete_anwcs_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_anwcs_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_anwcs_t" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); delete_anwcs_t(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_pixel_scale" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); result = (double)anwcs_t_pixel_scale(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_get_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_get_center",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_get_center" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); anwcs_t_get_center(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_get_radius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_get_radius",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_get_radius" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); anwcs_t_get_radius(arg1,arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_is_inside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_t_is_inside",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_is_inside" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_is_inside" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_t_is_inside" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)anwcs_t_is_inside(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_get_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_get_width",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_get_width" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); result = (double)anwcs_t_get_width(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_get_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_t_get_height",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_get_height" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); result = (double)anwcs_t_get_height(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_set_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_t_set_width",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_set_width" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_set_width" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); anwcs_t_set_width(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_set_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_t_set_height",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_set_height" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_set_height" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); anwcs_t_set_height(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_t_pixelxy2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_pixelxy2radec" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_t_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); anwcs_t_pixelxy2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_t_radec2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_radec2pixelxy" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_t_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_t_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)anwcs_t_radec2pixelxy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_t_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct anwcs_t *arg1 = (struct anwcs_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_t_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_t_write_to" "', argument " "1"" of type '" "struct anwcs_t *""'"); } arg1 = (struct anwcs_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_t_write_to" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)anwcs_t_write_to(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *anwcs_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_anwcs_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_anwcs_walk_outline(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; dl *arg2 = (dl *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; pl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_walk_outline",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_walk_outline" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_dl, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_walk_outline" "', argument " "2"" of type '" "dl const *""'"); } arg2 = (dl *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_walk_outline" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (pl *)anwcs_walk_outline((struct anwcs_t const *)arg1,(dl const *)arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_pl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_wcslib_from_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_wcslib_from_string",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_wcslib_from_string" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_wcslib_from_string" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_wcslib_from_string((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_open(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_open",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_open" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_open" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_open((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_open_wcslib(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_open_wcslib",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_open_wcslib" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_open_wcslib" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_open_wcslib((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_open_wcstools(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_open_wcstools",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_open_wcstools" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_open_wcstools" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_open_wcstools((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_wcstools_from_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_wcstools_from_string",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_wcstools_from_string" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_wcstools_from_string" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_wcstools_from_string((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_open_sip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_open_sip",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_open_sip" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_open_sip" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_open_sip((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_open_tan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_open_tan",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_open_tan" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_open_tan" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (anwcs_t *)anwcs_open_tan((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_new_sip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_new_sip",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_new_sip" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (anwcs_t *)anwcs_new_sip((sip_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_new_tan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_new_tan",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_new_tan" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (anwcs_t *)anwcs_new_tan((tan_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_box(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; int arg5 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:anwcs_create_box",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_box" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_box" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_box" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_box" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_create_box" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); result = (anwcs_t *)anwcs_create_box(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_box_upsidedown(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; int arg5 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:anwcs_create_box_upsidedown",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_box_upsidedown" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_box_upsidedown" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_box_upsidedown" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_box_upsidedown" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_create_box_upsidedown" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); result = (anwcs_t *)anwcs_create_box_upsidedown(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_mercator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; int arg5 ; anbool arg6 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; unsigned char val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:anwcs_create_mercator",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_mercator" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_mercator" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_mercator" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_mercator" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_create_mercator" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_unsigned_SS_char(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "anwcs_create_mercator" "', argument " "6"" of type '" "anbool""'"); } arg6 = (anbool)(val6); result = (anwcs_t *)anwcs_create_mercator(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_mercator_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; int arg6 ; int arg7 ; anbool arg8 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; unsigned char val8 ; int ecode8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:anwcs_create_mercator_2",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_mercator_2" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_mercator_2" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_mercator_2" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_mercator_2" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_create_mercator_2" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "anwcs_create_mercator_2" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "anwcs_create_mercator_2" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); ecode8 = SWIG_AsVal_unsigned_SS_char(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "anwcs_create_mercator_2" "', argument " "8"" of type '" "anbool""'"); } arg8 = (anbool)(val8); result = (anwcs_t *)anwcs_create_mercator_2(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_hammer_aitoff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; int arg4 ; int arg5 ; anbool arg6 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; unsigned char val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:anwcs_create_hammer_aitoff",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_hammer_aitoff" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_hammer_aitoff" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_hammer_aitoff" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_hammer_aitoff" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_create_hammer_aitoff" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_unsigned_SS_char(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "anwcs_create_hammer_aitoff" "', argument " "6"" of type '" "anbool""'"); } arg6 = (anbool)(val6); result = (anwcs_t *)anwcs_create_hammer_aitoff(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_allsky_hammer_aitoff(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; int arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:anwcs_create_allsky_hammer_aitoff",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_allsky_hammer_aitoff" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_allsky_hammer_aitoff" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_allsky_hammer_aitoff" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_allsky_hammer_aitoff" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (anwcs_t *)anwcs_create_allsky_hammer_aitoff(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_create_allsky_hammer_aitoff2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int arg3 ; int arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:anwcs_create_allsky_hammer_aitoff2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "anwcs_create_allsky_hammer_aitoff2" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_create_allsky_hammer_aitoff2" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_create_allsky_hammer_aitoff2" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_create_allsky_hammer_aitoff2" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); result = (anwcs_t *)anwcs_create_allsky_hammer_aitoff2(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_write",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_write" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_write" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)anwcs_write((struct anwcs_t const *)arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_anwcs_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_write_to" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_write_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)anwcs_write_to((struct anwcs_t const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_add_to_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_add_to_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_add_to_header" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_add_to_header" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); result = (int)anwcs_add_to_header((struct anwcs_t const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_radec2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_radec2pixelxy" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)anwcs_radec2pixelxy((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_pixelxy2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_pixelxy2radec" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)anwcs_pixelxy2radec((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_pixelxy2xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double tempxyz4[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; { arg4 = tempxyz4; } if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_pixelxy2xyz",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_pixelxy2xyz" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_pixelxy2xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_pixelxy2xyz" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)anwcs_pixelxy2xyz((struct anwcs_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); { resultobj = Py_BuildValue("(ddd)", arg4[0], arg4[1], arg4[2]); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_xyz2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:anwcs_xyz2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_xyz2pixelxy" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_xyz2pixelxy" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "anwcs_xyz2pixelxy" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "anwcs_xyz2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (int)anwcs_xyz2pixelxy((struct anwcs_t const *)arg1,(double const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_radec_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_radec_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_radec_is_inside_image" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_radec_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_radec_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)anwcs_radec_is_inside_image((struct anwcs_t const *)arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_get_cd_matrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double tempcd2[4] ; PyObject * obj0 = 0 ; { arg2 = tempcd2; } if (!PyArg_ParseTuple(args,(char *)"O:anwcs_get_cd_matrix",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_get_cd_matrix" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); anwcs_get_cd_matrix((struct anwcs_t const *)arg1,arg2); resultobj = SWIG_Py_Void(); { resultobj = Py_BuildValue("(dddd)", arg2[0], arg2[1], arg2[2], arg2[3]); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_get_radec_bounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg3 = &temp3; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_get_radec_bounds",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_get_radec_bounds" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_get_radec_bounds" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); anwcs_get_radec_bounds((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_print",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_print" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_print" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); anwcs_print((struct anwcs_t const *)arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_print_stdout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_print_stdout",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_print_stdout" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); anwcs_print_stdout((struct anwcs_t const *)arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_get_radec_center_and_radius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; int result; arg2 = &temp2; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_get_radec_center_and_radius",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_get_radec_center_and_radius" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (int)anwcs_get_radec_center_and_radius((struct anwcs_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_walk_image_boundary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; void (*arg3)(anwcs_t const *,double,double,double,double,void *) = (void (*)(anwcs_t const *,double,double,double,double,void *)) 0 ; void *arg4 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:anwcs_walk_image_boundary",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_walk_image_boundary" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_walk_image_boundary" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); { int res = SWIG_ConvertFunctionPtr(obj2, (void**)(&arg3), SWIGTYPE_p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "anwcs_walk_image_boundary" "', argument " "3"" of type '" "void (*)(anwcs_t const *,double,double,double,double,void *)""'"); } } res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "anwcs_walk_image_boundary" "', argument " "4"" of type '" "void *""'"); } anwcs_walk_image_boundary((struct anwcs_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_find_discontinuity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; double *arg6 = (double *) 0 ; double *arg7 = (double *) 0 ; double *arg8 = (double *) 0 ; double *arg9 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; void *argp9 = 0 ; int res9 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:anwcs_find_discontinuity",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_find_discontinuity" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_find_discontinuity" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_find_discontinuity" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_find_discontinuity" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_find_discontinuity" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "anwcs_find_discontinuity" "', argument " "6"" of type '" "double *""'"); } arg6 = (double *)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "anwcs_find_discontinuity" "', argument " "7"" of type '" "double *""'"); } arg7 = (double *)(argp7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "anwcs_find_discontinuity" "', argument " "8"" of type '" "double *""'"); } arg8 = (double *)(argp8); res9 = SWIG_ConvertPtr(obj8, &argp9,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res9)) { SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "anwcs_find_discontinuity" "', argument " "9"" of type '" "double *""'"); } arg9 = (double *)(argp9); result = (anbool)anwcs_find_discontinuity((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_is_discontinuous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:anwcs_is_discontinuous",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_is_discontinuous" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_is_discontinuous" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_is_discontinuous" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_is_discontinuous" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_is_discontinuous" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); result = (anbool)anwcs_is_discontinuous((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_walk_discontinuity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; double arg8 ; double arg9 ; double arg10 ; dl *arg11 = (dl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; double val8 ; int ecode8 = 0 ; double val9 ; int ecode9 = 0 ; double val10 ; int ecode10 = 0 ; void *argp11 = 0 ; int res11 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; dl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO:anwcs_walk_discontinuity",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_walk_discontinuity" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_walk_discontinuity" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_walk_discontinuity" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "anwcs_walk_discontinuity" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "anwcs_walk_discontinuity" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "anwcs_walk_discontinuity" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "anwcs_walk_discontinuity" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); ecode8 = SWIG_AsVal_double(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "anwcs_walk_discontinuity" "', argument " "8"" of type '" "double""'"); } arg8 = (double)(val8); ecode9 = SWIG_AsVal_double(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "anwcs_walk_discontinuity" "', argument " "9"" of type '" "double""'"); } arg9 = (double)(val9); ecode10 = SWIG_AsVal_double(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "anwcs_walk_discontinuity" "', argument " "10"" of type '" "double""'"); } arg10 = (double)(val10); res11 = SWIG_ConvertPtr(obj10, &argp11,SWIGTYPE_p_dl, 0 | 0 ); if (!SWIG_IsOK(res11)) { SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "anwcs_walk_discontinuity" "', argument " "11"" of type '" "dl *""'"); } arg11 = (dl *)(argp11); result = (dl *)anwcs_walk_discontinuity((struct anwcs_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_dl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_overlaps(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_overlaps",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_overlaps" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "anwcs_overlaps" "', argument " "2"" of type '" "anwcs_t const *""'"); } arg2 = (anwcs_t *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_overlaps" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (anbool)anwcs_overlaps((struct anwcs_t const *)arg1,(struct anwcs_t const *)arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_imagew(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_imagew",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_imagew" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (double)anwcs_imagew((struct anwcs_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_imageh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_imageh",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_imageh" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (double)anwcs_imageh((struct anwcs_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_set_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_set_size",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_set_size" "', argument " "1"" of type '" "anwcs_t *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_set_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "anwcs_set_size" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); anwcs_set_size(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_scale_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_scale_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_scale_wcs" "', argument " "1"" of type '" "anwcs_t *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_scale_wcs" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (int)anwcs_scale_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_rotate_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:anwcs_rotate_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_rotate_wcs" "', argument " "1"" of type '" "anwcs_t *""'"); } arg1 = (anwcs_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "anwcs_rotate_wcs" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (int)anwcs_rotate_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_pixel_scale" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (double)anwcs_pixel_scale((struct anwcs_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_free" "', argument " "1"" of type '" "anwcs_t *""'"); } arg1 = (anwcs_t *)(argp1); anwcs_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_get_sip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:anwcs_get_sip",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_get_sip" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); result = (sip_t *)anwcs_get_sip((struct anwcs_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *DIM_STARS_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIM_STARS",SWIG_From_int((int)(3))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DIM_XY_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIM_XY",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DQMAX_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DQMAX",SWIG_From_int((int)(5))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DCMAX_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DCMAX",SWIG_From_int((int)(6))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_dimquad2dimcode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:dimquad2dimcode",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dimquad2dimcode" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); result = (int)dimquad2dimcode(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *ONE_OVER_SIXTY_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ONE_OVER_SIXTY",SWIG_From_double((double)(0.016666666666666666))); return SWIG_Py_Void(); } SWIGINTERN PyObject *RAD_PER_DEG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "RAD_PER_DEG",SWIG_From_double((double)(0.017453292519943295))); return SWIG_Py_Void(); } SWIGINTERN PyObject *RAD_PER_ARCMIN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "RAD_PER_ARCMIN",SWIG_From_double((double)(0.00029088820866572158))); return SWIG_Py_Void(); } SWIGINTERN PyObject *RAD_PER_ARCSEC_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "RAD_PER_ARCSEC",SWIG_From_double((double)(4.8481368110953598e-06))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DEG_PER_RAD_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DEG_PER_RAD",SWIG_From_double((double)(57.295779513082323))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DEG_PER_ARCMIN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DEG_PER_ARCMIN",SWIG_From_double((double)(0.016666666666666666))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DEG_PER_ARCSEC_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DEG_PER_ARCSEC",SWIG_From_double((double)(0.00027777777777777778))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCMIN_PER_RAD_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCMIN_PER_RAD",SWIG_From_double((double)(3437.7467707849396))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCMIN_PER_DEG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCMIN_PER_DEG",SWIG_From_double((double)(60.0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCMIN_PER_ARCSEC_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCMIN_PER_ARCSEC",SWIG_From_double((double)(0.016666666666666666))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCSEC_PER_RAD_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCSEC_PER_RAD",SWIG_From_double((double)(206264.80624709636))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCSEC_PER_DEG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCSEC_PER_DEG",SWIG_From_double((double)(3600.0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *ARCSEC_PER_ARCMIN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "ARCSEC_PER_ARCMIN",SWIG_From_double((double)(60.0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_rad2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:rad2deg",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2deg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)rad2deg(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_rad2arcmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:rad2arcmin",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2arcmin" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)rad2arcmin(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_rad2arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:rad2arcsec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2arcsec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)rad2arcsec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:deg2rad",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2rad" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)deg2rad(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg2arcmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:deg2arcmin",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2arcmin" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)deg2arcmin(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg2arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:deg2arcsec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2arcsec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)deg2arcsec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcmin2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcmin2rad",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcmin2rad" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcmin2rad(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcmin2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcmin2deg",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcmin2deg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcmin2deg(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcmin2arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcmin2arcsec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcmin2arcsec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcmin2arcsec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcsec2rad",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec2rad" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcsec2rad(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcsec2deg",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec2deg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcsec2deg(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec2arcmin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcsec2arcmin",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec2arcmin" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcsec2arcmin(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *MJD_JD_OFFSET_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "MJD_JD_OFFSET",SWIG_From_double((double)(2400000.5))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_mjdtojd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:mjdtojd",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "mjdtojd" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)mjdtojd(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_jdtomjd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:jdtomjd",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "jdtomjd" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)jdtomjd(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xy2ra(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:xy2ra",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xy2ra" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xy2ra" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (double)xy2ra(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_z2dec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:z2dec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "z2dec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)z2dec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_atora(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:atora",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "atora" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (double)atora((char const *)arg1); resultobj = SWIG_From_double((double)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_atodec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:atodec",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "atodec" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (double)atodec((char const *)arg1); resultobj = SWIG_From_double((double)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_mag2flux(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:mag2flux",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "mag2flux" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)mag2flux(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecrange2xyzrange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:radecrange2xyzrange",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecrange2xyzrange" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecrange2xyzrange" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radecrange2xyzrange" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "radecrange2xyzrange" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "radecrange2xyzrange" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "radecrange2xyzrange" "', argument " "6"" of type '" "double *""'"); } arg6 = (double *)(argp6); radecrange2xyzrange(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec2xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:radec2xyz",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radec2xyz" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radec2xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "radec2xyz" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "radec2xyz" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "radec2xyz" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); radec2xyz(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyz2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:xyz2radec",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "xyz2radec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "xyz2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "xyz2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); xyz2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarr2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:xyzarr2radec",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarr2radec" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); xyzarr2radec((double const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarr2radecarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:xyzarr2radecarr",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarr2radecarr" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "xyzarr2radecarr" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); xyzarr2radecarr((double const *)arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double tempxyz3[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; { arg3 = tempxyz3; } if (!PyArg_ParseTuple(args,(char *)"OO:radec2xyzarr",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radec2xyzarr" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radec2xyzarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); radec2xyzarr(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); { resultobj = Py_BuildValue("(ddd)", arg3[0], arg3[1], arg3[2]); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec2xyzarrmany(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; double temp1 ; int res1 = SWIG_TMPOBJ ; double temp2 ; int res2 = SWIG_TMPOBJ ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg1 = &temp1; arg2 = &temp2; if (!PyArg_ParseTuple(args,(char *)"OO:radec2xyzarrmany",&obj0,&obj1)) SWIG_fail; res3 = SWIG_ConvertPtr(obj0, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "radec2xyzarrmany" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj1, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "radec2xyzarrmany" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); radec2xyzarrmany(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res1)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg1))); } else { int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdeg2xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:radecdeg2xyz",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdeg2xyz" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdeg2xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "radecdeg2xyz" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "radecdeg2xyz" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "radecdeg2xyz" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); radecdeg2xyz(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarr2radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:xyzarr2radecdeg",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarr2radecdeg" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); xyzarr2radecdeg((double const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_xyzarr2radecdegarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:xyzarr2radecdegarr",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "xyzarr2radecdegarr" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "xyzarr2radecdegarr" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); xyzarr2radecdegarr(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdeg2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double tempxyz3[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; { arg3 = tempxyz3; } if (!PyArg_ParseTuple(args,(char *)"OO:radecdeg2xyzarr",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radecdeg2xyzarr" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radecdeg2xyzarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); radecdeg2xyzarr(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); { resultobj = Py_BuildValue("(ddd)", arg3[0], arg3[1], arg3[2]); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdegarr2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:radecdegarr2xyzarr",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "radecdegarr2xyzarr" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "radecdegarr2xyzarr" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); radecdegarr2xyzarr(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radecdeg2xyzarrmany(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; int arg4 ; double temp1 ; int res1 = SWIG_TMPOBJ ; double temp2 ; int res2 = SWIG_TMPOBJ ; void *argp3 = 0 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg1 = &temp1; arg2 = &temp2; if (!PyArg_ParseTuple(args,(char *)"OO:radecdeg2xyzarrmany",&obj0,&obj1)) SWIG_fail; res3 = SWIG_ConvertPtr(obj0, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "radecdeg2xyzarrmany" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); ecode4 = SWIG_AsVal_int(obj1, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "radecdeg2xyzarrmany" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); radecdeg2xyzarrmany(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res1)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg1))); } else { int new_flags = SWIG_IsNewObj(res1) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg1), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec_derivatives(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:radec_derivatives",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radec_derivatives" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radec_derivatives" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "radec_derivatives" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "radec_derivatives" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); radec_derivatives(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq_between_radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:distsq_between_radecdeg",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "distsq_between_radecdeg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "distsq_between_radecdeg" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "distsq_between_radecdeg" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "distsq_between_radecdeg" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (double)distsq_between_radecdeg(arg1,arg2,arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec_between_radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:arcsec_between_radecdeg",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec_between_radecdeg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "arcsec_between_radecdeg" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "arcsec_between_radecdeg" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "arcsec_between_radecdeg" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (double)arcsec_between_radecdeg(arg1,arg2,arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg_between_radecdeg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:deg_between_radecdeg",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg_between_radecdeg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "deg_between_radecdeg" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "deg_between_radecdeg" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "deg_between_radecdeg" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (double)deg_between_radecdeg(arg1,arg2,arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ra2mercx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:ra2mercx",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ra2mercx" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)ra2mercx(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dec2mercy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:dec2mercy",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dec2mercy" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)dec2mercy(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ra2hms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; double *arg4 = (double *) 0 ; double val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:ra2hms",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ra2hms" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ra2hms" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ra2hms" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "ra2hms" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); ra2hms(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dec2dms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dec2dms",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dec2dms" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "dec2dms" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "dec2dms" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dec2dms" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dec2dms" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); dec2dms(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_hms2ra(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; double arg3 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:hms2ra",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "hms2ra" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "hms2ra" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "hms2ra" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (double)hms2ra(arg1,arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dms2dec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; double arg4 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:dms2dec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dms2dec" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dms2dec" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dms2dec" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dms2dec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (double)dms2dec(arg1,arg2,arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ra2hmsstring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; char *arg2 = (char *) 0 ; double val1 ; int ecode1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:ra2hmsstring",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "ra2hmsstring" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ra2hmsstring" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); ra2hmsstring(arg1,arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_dec2dmsstring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; char *arg2 = (char *) 0 ; double val1 ; int ecode1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:dec2dmsstring",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dec2dmsstring" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "dec2dmsstring" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); dec2dmsstring(arg1,arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_project_hammer_aitoff_x(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:project_hammer_aitoff_x",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "project_hammer_aitoff_x" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "project_hammer_aitoff_x" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "project_hammer_aitoff_x" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "project_hammer_aitoff_x" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "project_hammer_aitoff_x" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); project_hammer_aitoff_x(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_project_equal_area(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:project_equal_area",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "project_equal_area" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "project_equal_area" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "project_equal_area" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "project_equal_area" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "project_equal_area" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); project_equal_area(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq2arc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:distsq2arc",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "distsq2arc" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)distsq2arc(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:distsq2rad",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "distsq2rad" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)distsq2rad(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:distsq2deg",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "distsq2deg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)distsq2deg(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dist2rad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:dist2rad",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dist2rad" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)dist2rad(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq2arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:distsq2arcsec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "distsq2arcsec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)distsq2arcsec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dist2arcsec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:dist2arcsec",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dist2arcsec" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)dist2arcsec(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_rad2distsq(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:rad2distsq",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2distsq" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)rad2distsq(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_rad2dist(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:rad2dist",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "rad2dist" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)rad2dist(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec2distsq(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcsec2distsq",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec2distsq" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcsec2distsq(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcsec2dist(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcsec2dist",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcsec2dist" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcsec2dist(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg2dist(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:deg2dist",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2dist" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)deg2dist(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_deg2distsq(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:deg2distsq",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "deg2distsq" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)deg2distsq(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcmin2dist(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcmin2dist",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcmin2dist" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcmin2dist(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_arcmin2distsq(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:arcmin2distsq",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "arcmin2distsq" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)arcmin2distsq(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dist2deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:dist2deg",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dist2deg" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)dist2deg(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *HELP_ERR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "HELP_ERR",SWIG_From_int((int)(-101))); return SWIG_Py_Void(); } SWIGINTERN PyObject *OPT_ERR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "OPT_ERR",SWIG_From_int((int)(-201))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_make_rand_star(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:make_rand_star",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "make_rand_star" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "make_rand_star" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "make_rand_star" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "make_rand_star" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "make_rand_star" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); make_rand_star(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_star_coords(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; anbool arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:star_coords",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "star_coords" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "star_coords" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "star_coords" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "star_coords" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "star_coords" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)star_coords((double const *)arg1,(double const *)arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_star_midpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:star_midpoint",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "star_midpoint" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "star_midpoint" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "star_midpoint" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); star_midpoint(arg1,(double const *)arg2,(double const *)arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_debug_dump(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_debug_dump",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_debug_dump" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); qfits_header_debug_dump((qfits_header const *)arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_list(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_list",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_list" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_list" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)qfits_header_list((qfits_header const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_new(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":qfits_header_new")) SWIG_fail; result = (qfits_header *)qfits_header_new(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_default(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":qfits_header_default")) SWIG_fail; result = (qfits_header *)qfits_header_default(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_n(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_n",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_n" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (int)qfits_header_n((qfits_header const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_add(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:qfits_header_add",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_add" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_add" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_add" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_add" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "qfits_header_add" "', argument " "5"" of type '" "char const *""'"); } arg5 = (char *)(buf5); qfits_header_add(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_add_after(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; char *arg6 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; int res6 ; char *buf6 = 0 ; int alloc6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:qfits_header_add_after",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_add_after" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_add_after" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_add_after" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_add_after" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "qfits_header_add_after" "', argument " "5"" of type '" "char const *""'"); } arg5 = (char *)(buf5); res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "qfits_header_add_after" "', argument " "6"" of type '" "char const *""'"); } arg6 = (char *)(buf6); qfits_header_add_after(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:qfits_header_append",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_append" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_append" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_append" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_append" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "qfits_header_append" "', argument " "5"" of type '" "char const *""'"); } arg5 = (char *)(buf5); qfits_header_append(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_del(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_del",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_del" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_del" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); qfits_header_del(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_sort(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header **arg1 = (qfits_header **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_sort",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_sort" "', argument " "1"" of type '" "qfits_header **""'"); } arg1 = (qfits_header **)(argp1); result = (int)qfits_header_sort(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_copy",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_copy" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (qfits_header *)qfits_header_copy((qfits_header const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_mod(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:qfits_header_mod",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_mod" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_mod" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_mod" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_mod" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); qfits_header_mod(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_destroy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_destroy",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_destroy" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); qfits_header_destroy(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getstr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_getstr",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getstr" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getstr" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (char *)qfits_header_getstr((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getstr_pretty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:qfits_header_getstr_pretty",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getstr_pretty" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getstr_pretty" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_getstr_pretty" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_getstr_pretty" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)qfits_header_getstr_pretty((qfits_header const *)arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getitem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; int arg2 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; char *arg6 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; int res6 ; char *buf6 = 0 ; int alloc6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:qfits_header_getitem",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getitem" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfits_header_getitem" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_getitem" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_getitem" "', argument " "4"" of type '" "char *""'"); } arg4 = (char *)(buf4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "qfits_header_getitem" "', argument " "5"" of type '" "char *""'"); } arg5 = (char *)(buf5); res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "qfits_header_getitem" "', argument " "6"" of type '" "char *""'"); } arg6 = (char *)(buf6); result = (int)qfits_header_getitem((qfits_header const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_setitem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; int arg2 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; char *arg5 = (char *) 0 ; char *arg6 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; int res6 ; char *buf6 = 0 ; int alloc6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:qfits_header_setitem",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_setitem" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfits_header_setitem" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_setitem" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "qfits_header_setitem" "', argument " "4"" of type '" "char *""'"); } arg4 = (char *)(buf4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "qfits_header_setitem" "', argument " "5"" of type '" "char *""'"); } arg5 = (char *)(buf5); res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "qfits_header_setitem" "', argument " "6"" of type '" "char *""'"); } arg6 = (char *)(buf6); result = (int)qfits_header_setitem(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getcom(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_getcom",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getcom" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getcom" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (char *)qfits_header_getcom((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:qfits_header_getint",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getint" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getint" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "qfits_header_getint" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)qfits_header_getint((qfits_header const *)arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getdouble(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:qfits_header_getdouble",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getdouble" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getdouble" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "qfits_header_getdouble" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (double)qfits_header_getdouble((qfits_header const *)arg1,(char const *)arg2,arg3); resultobj = SWIG_From_double((double)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_getboolean(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:qfits_header_getboolean",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_getboolean" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_getboolean" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "qfits_header_getboolean" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)qfits_header_getboolean((qfits_header const *)arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_dump(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_dump",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_dump" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_dump" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)qfits_header_dump((qfits_header const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_findmatch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfits_header_findmatch",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_findmatch" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfits_header_findmatch" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (char *)qfits_header_findmatch((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_write_line(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; int arg2 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:qfits_header_write_line",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_write_line" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfits_header_write_line" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "qfits_header_write_line" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); result = (int)qfits_header_write_line((qfits_header const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_qfits_header_read_hdr_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; unsigned char *arg1 = (unsigned char *) 0 ; int arg2 ; int res1 ; char *buf1 = 0 ; size_t size1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfits_header_read_hdr_string",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, &size1, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_header_read_hdr_string" "', argument " "1"" of type '" "unsigned char const *""'"); } arg1 = (unsigned char *)(buf1); arg2 = (int)(size1 - 1); result = (qfits_header *)qfits_header_read_hdr_string((unsigned char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_qfits_zeropad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfits_zeropad",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_zeropad" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); qfits_zeropad((char const *)arg1); resultobj = SWIG_Py_Void(); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_qfits_is_fits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfits_is_fits",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_is_fits" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)qfits_is_fits((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_is_blank_line(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:is_blank_line",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "is_blank_line" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)is_blank_line((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_wcs_pv2sip_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; double arg8 ; int arg9 ; int arg10 ; int arg11 ; anbool arg12 ; int arg13 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; double val8 ; int ecode8 = 0 ; int val9 ; int ecode9 = 0 ; int val10 ; int ecode10 = 0 ; int val11 ; int ecode11 = 0 ; unsigned char val12 ; int ecode12 = 0 ; int val13 ; int ecode13 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOO:wcs_pv2sip_header",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "wcs_pv2sip_header" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "wcs_pv2sip_header" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "wcs_pv2sip_header" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "wcs_pv2sip_header" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "wcs_pv2sip_header" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wcs_pv2sip_header" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wcs_pv2sip_header" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); ecode8 = SWIG_AsVal_double(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wcs_pv2sip_header" "', argument " "8"" of type '" "double""'"); } arg8 = (double)(val8); ecode9 = SWIG_AsVal_int(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "wcs_pv2sip_header" "', argument " "9"" of type '" "int""'"); } arg9 = (int)(val9); ecode10 = SWIG_AsVal_int(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "wcs_pv2sip_header" "', argument " "10"" of type '" "int""'"); } arg10 = (int)(val10); ecode11 = SWIG_AsVal_int(obj10, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "wcs_pv2sip_header" "', argument " "11"" of type '" "int""'"); } arg11 = (int)(val11); ecode12 = SWIG_AsVal_unsigned_SS_char(obj11, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "wcs_pv2sip_header" "', argument " "12"" of type '" "anbool""'"); } arg12 = (anbool)(val12); ecode13 = SWIG_AsVal_int(obj12, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "wcs_pv2sip_header" "', argument " "13"" of type '" "int""'"); } arg13 = (int)(val13); result = (sip_t *)wcs_pv2sip_header(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_wcs_pv2sip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; char *arg3 = (char *) 0 ; anbool arg4 ; double *arg5 = (double *) 0 ; int arg6 ; double arg7 ; double arg8 ; double arg9 ; double arg10 ; double arg11 ; int arg12 ; int arg13 ; int arg14 ; anbool arg15 ; int arg16 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; unsigned char val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; int val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; double val8 ; int ecode8 = 0 ; double val9 ; int ecode9 = 0 ; double val10 ; int ecode10 = 0 ; double val11 ; int ecode11 = 0 ; int val12 ; int ecode12 = 0 ; int val13 ; int ecode13 = 0 ; int val14 ; int ecode14 = 0 ; unsigned char val15 ; int ecode15 = 0 ; int val16 ; int ecode16 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; PyObject * obj13 = 0 ; PyObject * obj14 = 0 ; PyObject * obj15 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOOOOO:wcs_pv2sip",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12,&obj13,&obj14,&obj15)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "wcs_pv2sip" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "wcs_pv2sip" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "wcs_pv2sip" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); ecode4 = SWIG_AsVal_unsigned_SS_char(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "wcs_pv2sip" "', argument " "4"" of type '" "anbool""'"); } arg4 = (anbool)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "wcs_pv2sip" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "wcs_pv2sip" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "wcs_pv2sip" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); ecode8 = SWIG_AsVal_double(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "wcs_pv2sip" "', argument " "8"" of type '" "double""'"); } arg8 = (double)(val8); ecode9 = SWIG_AsVal_double(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "wcs_pv2sip" "', argument " "9"" of type '" "double""'"); } arg9 = (double)(val9); ecode10 = SWIG_AsVal_double(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "wcs_pv2sip" "', argument " "10"" of type '" "double""'"); } arg10 = (double)(val10); ecode11 = SWIG_AsVal_double(obj10, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "wcs_pv2sip" "', argument " "11"" of type '" "double""'"); } arg11 = (double)(val11); ecode12 = SWIG_AsVal_int(obj11, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "wcs_pv2sip" "', argument " "12"" of type '" "int""'"); } arg12 = (int)(val12); ecode13 = SWIG_AsVal_int(obj12, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "wcs_pv2sip" "', argument " "13"" of type '" "int""'"); } arg13 = (int)(val13); ecode14 = SWIG_AsVal_int(obj13, &val14); if (!SWIG_IsOK(ecode14)) { SWIG_exception_fail(SWIG_ArgError(ecode14), "in method '" "wcs_pv2sip" "', argument " "14"" of type '" "int""'"); } arg14 = (int)(val14); ecode15 = SWIG_AsVal_unsigned_SS_char(obj14, &val15); if (!SWIG_IsOK(ecode15)) { SWIG_exception_fail(SWIG_ArgError(ecode15), "in method '" "wcs_pv2sip" "', argument " "15"" of type '" "anbool""'"); } arg15 = (anbool)(val15); ecode16 = SWIG_AsVal_int(obj15, &val16); if (!SWIG_IsOK(ecode16)) { SWIG_exception_fail(SWIG_ArgError(ecode16), "in method '" "wcs_pv2sip" "', argument " "16"" of type '" "int""'"); } arg16 = (int)(val16); result = (int)wcs_pv2sip((char const *)arg1,arg2,(char const *)arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,arg16); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *SIP_MAXORDER_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "SIP_MAXORDER",SWIG_From_int((int)(10))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_tan_t_crval_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 ; void *argp1 = 0 ; int res1 = 0 ; double temp2[2] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_crval_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_crval_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != 2) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 2 elements"); return NULL; } for (i = 0; i < 2; i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { temp2[i] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)2; ++ii) *(double *)&arg1->crval[ii] = *((double *)arg2 + ii); } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""crval""' of type '""double [2]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_crval_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_crval_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_crval_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double *)(double *) ((arg1)->crval); { int i; resultobj = PyList_New(2); for (i = 0; i < 2; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_crpix_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 ; void *argp1 = 0 ; int res1 = 0 ; double temp2[2] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_crpix_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_crpix_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != 2) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 2 elements"); return NULL; } for (i = 0; i < 2; i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { temp2[i] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)2; ++ii) *(double *)&arg1->crpix[ii] = *((double *)arg2 + ii); } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""crpix""' of type '""double [2]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_crpix_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_crpix_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_crpix_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double *)(double *) ((arg1)->crpix); { int i; resultobj = PyList_New(2); for (i = 0; i < 2; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_cd_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double (*arg2)[2] ; void *argp1 = 0 ; int res1 = 0 ; double temp2[2][2] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_cd_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_cd_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != (2 * 2)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 2*2 elements"); return NULL; } for (i = 0; i < (2*2); i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp2[i / 2][i % 2] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)2; ++ii) { if (arg2[ii]) { size_t jj = 0; for (; jj < (size_t)2; ++jj) arg1->cd[ii][jj] = arg2[ii][jj]; } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""cd""' of type '""double [2][2]""'"); } } } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""cd""' of type '""double [2][2]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_cd_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)[2] = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_cd_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_cd_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double (*)[2])(double (*)[2]) ((arg1)->cd); { int i; resultobj = PyList_New(2 * 2); for (i = 0; i < (2)*(2); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble(result[i / 2][i % 2]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_imagew_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_imagew_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_imagew_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_imagew_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->imagew = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_imagew_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_imagew_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_imagew_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double) ((arg1)->imagew); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_imageh_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_imageh_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_imageh_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_imageh_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->imageh = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_imageh_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_imageh_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_imageh_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double) ((arg1)->imageh); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_sin_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_sin_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_sin_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_sin_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->sin = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_sin_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_sin_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_sin_get" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (anbool) ((arg1)->sin); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_tan_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) NULL ; int arg2 = (int) 0 ; int arg3 = (int) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"|OOO:new_tan_t",&obj0,&obj1,&obj2)) SWIG_fail; if (obj0) { res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_tan_t" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); } if (obj1) { ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_tan_t" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); } if (obj2) { ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_tan_t" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); } result = (tan_t *)new_tan_t__SWIG_0(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_new_tan_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; double arg8 ; double arg9 ; double arg10 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; double val8 ; int ecode8 = 0 ; double val9 ; int ecode9 = 0 ; double val10 ; int ecode10 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOO:new_tan_t",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_tan_t" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_tan_t" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_tan_t" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_tan_t" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_tan_t" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "new_tan_t" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "new_tan_t" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); ecode8 = SWIG_AsVal_double(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "new_tan_t" "', argument " "8"" of type '" "double""'"); } arg8 = (double)(val8); ecode9 = SWIG_AsVal_double(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "new_tan_t" "', argument " "9"" of type '" "double""'"); } arg9 = (double)(val9); ecode10 = SWIG_AsVal_double(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "new_tan_t" "', argument " "10"" of type '" "double""'"); } arg10 = (double)(val10); result = (tan_t *)new_tan_t__SWIG_1(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_tan_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_tan_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_tan_t" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (tan_t *)new_tan_t__SWIG_2((tan_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_tan_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_tan_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_tan_t" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (tan_t *)new_tan_t__SWIG_3((qfits_header const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_tan_t(PyObject *self, PyObject *args) { int argc; PyObject *argv[11] = { 0 }; int ii; if (!PyTuple_Check(args)) SWIG_fail; argc = args ? (int)PyObject_Length(args) : 0; for (ii = 0; (ii < 10) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if ((argc >= 0) && (argc <= 3)) { int _v; if (argc <= 0) { return _wrap_new_tan_t__SWIG_0(self, args); } int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0); _v = SWIG_CheckState(res); if (_v) { if (argc <= 1) { return _wrap_new_tan_t__SWIG_0(self, args); } { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 2) { return _wrap_new_tan_t__SWIG_0(self, args); } { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_tan_t__SWIG_0(self, args); } } } } if (argc == 1) { int _v; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_tan_t, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_tan_t__SWIG_2(self, args); } } if (argc == 1) { int _v; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_qfits_header, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_tan_t__SWIG_3(self, args); } } if (argc == 10) { int _v; { int res = SWIG_AsVal_double(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[3], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[4], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[5], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[6], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[7], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[8], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[9], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_tan_t__SWIG_1(self, args); } } } } } } } } } } } fail: SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_tan_t'.\n" " Possible C/C++ prototypes are:\n" " tan_t::tan_t(char *,int,int)\n" " tan_t::tan_t(double,double,double,double,double,double,double,double,double,double)\n" " tan_t::tan_t(tan_t const *)\n" " tan_t::tan_t(qfits_header const *)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_tan_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_tan_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_tan_t" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); delete_tan_t(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; double arg8 ; double arg9 ; double arg10 ; double arg11 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; double val8 ; int ecode8 = 0 ; double val9 ; int ecode9 = 0 ; double val10 ; int ecode10 = 0 ; double val11 ; int ecode11 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO:tan_t_set",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_set" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "tan_t_set" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "tan_t_set" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "tan_t_set" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "tan_t_set" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); ecode8 = SWIG_AsVal_double(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "tan_t_set" "', argument " "8"" of type '" "double""'"); } arg8 = (double)(val8); ecode9 = SWIG_AsVal_double(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "tan_t_set" "', argument " "9"" of type '" "double""'"); } arg9 = (double)(val9); ecode10 = SWIG_AsVal_double(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "tan_t_set" "', argument " "10"" of type '" "double""'"); } arg10 = (double)(val10); ecode11 = SWIG_AsVal_double(obj10, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "tan_t_set" "', argument " "11"" of type '" "double""'"); } arg11 = (double)(val11); tan_t_set(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_is_inside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_is_inside",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_is_inside" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_is_inside" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_is_inside" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)tan_t_is_inside(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_scale",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_scale" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_scale" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (tan_t *)tan_t_scale(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_get_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_get_width",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_get_width" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_t_get_width(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_get_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_get_height",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_get_height" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_t_get_height(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_set_width",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_width" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_width" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); tan_t_set_width(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_set_height",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_height" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_height" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); tan_t_set_height(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_pixel_scale" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_t_pixel_scale(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_radec_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_radec_center",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_radec_center" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); tan_t_radec_center(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_radius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_radius",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_radius" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_t_radius(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_xyzcenter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:tan_t_xyzcenter",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_xyzcenter" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); tan_t_xyzcenter(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_pixelxy2xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_pixelxy2xyz",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_pixelxy2xyz" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_pixelxy2xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_pixelxy2xyz" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_pixelxy2xyz(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_pixelxy2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_pixelxy2radec" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_pixelxy2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_radec2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_radec2pixelxy" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)tan_t_radec2pixelxy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_iwc2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_iwc2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_iwc2pixelxy" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_iwc2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_iwc2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_iwc2pixelxy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_pixelxy2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_pixelxy2iwc",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_pixelxy2iwc" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_pixelxy2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_pixelxy2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_pixelxy2iwc(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_iwc2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_iwc2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_iwc2radec" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_iwc2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_iwc2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_iwc2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_radec2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_radec2iwc",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_radec2iwc" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_radec2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_radec2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)tan_t_radec2iwc(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_xyz2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_t_xyz2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_xyz2pixelxy" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_xyz2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_xyz2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "tan_t_xyz2pixelxy" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (int)tan_t_xyz2pixelxy(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:tan_t_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_write_to" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_t_write_to" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)tan_t_write_to(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_crval(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_set_crval",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_crval" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_crval" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_set_crval" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_set_crval(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_crpix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_set_crpix",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_crpix" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_crpix" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_set_crpix" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_set_crpix(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_cd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:tan_t_set_cd",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_cd" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_cd" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_set_cd" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "tan_t_set_cd" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "tan_t_set_cd" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); tan_t_set_cd(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_t_set_imagesize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_t_set_imagesize",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_t_set_imagesize" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_t_set_imagesize" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_t_set_imagesize" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_t_set_imagesize(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *tan_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_tan_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_sip_t_wcstan_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_wcstan_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_wcstan_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_t_wcstan_set" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); if (arg1) (arg1)->wcstan = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_wcstan_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_wcstan_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_wcstan_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (tan_t *)& ((arg1)->wcstan); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_a_order_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_a_order_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_a_order_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_a_order_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->a_order = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_a_order_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_a_order_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_a_order_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int) ((arg1)->a_order); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_b_order_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_b_order_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_b_order_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_b_order_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->b_order = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_b_order_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_b_order_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_b_order_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int) ((arg1)->b_order); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_a_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double (*arg2)[10] ; void *argp1 = 0 ; int res1 = 0 ; double temp2[10][10] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_a_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_a_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != (10 * 10)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 10*10 elements"); return NULL; } for (i = 0; i < (10*10); i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp2[i / 10][i % 10] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)10; ++ii) { if (arg2[ii]) { size_t jj = 0; for (; jj < (size_t)10; ++jj) arg1->a[ii][jj] = arg2[ii][jj]; } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""a""' of type '""double [10][10]""'"); } } } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""a""' of type '""double [10][10]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_a_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)[10] = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_a_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_a_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double (*)[10])(double (*)[10]) ((arg1)->a); { int i; resultobj = PyList_New(10 * 10); for (i = 0; i < (10)*(10); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble(result[i / 10][i % 10]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_b_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double (*arg2)[10] ; void *argp1 = 0 ; int res1 = 0 ; double temp2[10][10] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_b_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_b_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != (10 * 10)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 10*10 elements"); return NULL; } for (i = 0; i < (10*10); i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp2[i / 10][i % 10] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)10; ++ii) { if (arg2[ii]) { size_t jj = 0; for (; jj < (size_t)10; ++jj) arg1->b[ii][jj] = arg2[ii][jj]; } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""b""' of type '""double [10][10]""'"); } } } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""b""' of type '""double [10][10]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_b_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)[10] = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_b_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_b_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double (*)[10])(double (*)[10]) ((arg1)->b); { int i; resultobj = PyList_New(10 * 10); for (i = 0; i < (10)*(10); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble(result[i / 10][i % 10]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_ap_order_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_ap_order_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_ap_order_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_ap_order_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->ap_order = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_ap_order_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_ap_order_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_ap_order_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int) ((arg1)->ap_order); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_bp_order_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_bp_order_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_bp_order_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_bp_order_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->bp_order = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_bp_order_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_bp_order_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_bp_order_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int) ((arg1)->bp_order); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_ap_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double (*arg2)[10] ; void *argp1 = 0 ; int res1 = 0 ; double temp2[10][10] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_ap_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_ap_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != (10 * 10)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 10*10 elements"); return NULL; } for (i = 0; i < (10*10); i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp2[i / 10][i % 10] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)10; ++ii) { if (arg2[ii]) { size_t jj = 0; for (; jj < (size_t)10; ++jj) arg1->ap[ii][jj] = arg2[ii][jj]; } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""ap""' of type '""double [10][10]""'"); } } } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""ap""' of type '""double [10][10]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_ap_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)[10] = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_ap_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_ap_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double (*)[10])(double (*)[10]) ((arg1)->ap); { int i; resultobj = PyList_New(10 * 10); for (i = 0; i < (10)*(10); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble(result[i / 10][i % 10]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_bp_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double (*arg2)[10] ; void *argp1 = 0 ; int res1 = 0 ; double temp2[10][10] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_bp_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_bp_set" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != (10 * 10)) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 10*10 elements"); return NULL; } for (i = 0; i < (10*10); i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { // FIXME -- is it dim0 or dim1? temp2[i / 10][i % 10] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)10; ++ii) { if (arg2[ii]) { size_t jj = 0; for (; jj < (size_t)10; ++jj) arg1->bp[ii][jj] = arg2[ii][jj]; } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""bp""' of type '""double [10][10]""'"); } } } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""bp""' of type '""double [10][10]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_bp_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double (*result)[10] = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_bp_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_bp_get" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double (*)[10])(double (*)[10]) ((arg1)->bp); { int i; resultobj = PyList_New(10 * 10); for (i = 0; i < (10)*(10); i++) { // FIXME -- dim0 or dim1? PyObject *o = PyFloat_FromDouble(result[i / 10][i % 10]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) NULL ; int arg2 = (int) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"|OO:new_sip_t",&obj0,&obj1)) SWIG_fail; if (obj0) { res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_sip_t" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); } if (obj1) { ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_sip_t" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); } result = (sip_t *)new_sip_t__SWIG_0((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; int arg3 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:new_sip_t",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_sip_t" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_sip_t" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_sip_t" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (sip_t *)new_sip_t__SWIG_1((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_sip_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_sip_t" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (sip_t *)new_sip_t__SWIG_2((sip_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_sip_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_sip_t" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (sip_t *)new_sip_t__SWIG_3((tan_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:new_sip_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_sip_t" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (sip_t *)new_sip_t__SWIG_4((qfits_header const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_sip_t(PyObject *self, PyObject *args) { int argc; PyObject *argv[4] = { 0 }; int ii; if (!PyTuple_Check(args)) SWIG_fail; argc = args ? (int)PyObject_Length(args) : 0; for (ii = 0; (ii < 3) && (ii < argc); ii++) { argv[ii] = PyTuple_GET_ITEM(args,ii); } if ((argc >= 0) && (argc <= 2)) { int _v; if (argc <= 0) { return _wrap_new_sip_t__SWIG_0(self, args); } int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0); _v = SWIG_CheckState(res); if (_v) { if (argc <= 1) { return _wrap_new_sip_t__SWIG_0(self, args); } { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_sip_t__SWIG_0(self, args); } } } if (argc == 1) { int _v; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_sip_t, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_sip_t__SWIG_2(self, args); } } if (argc == 1) { int _v; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_tan_t, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_sip_t__SWIG_3(self, args); } } if (argc == 1) { int _v; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_qfits_header, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_sip_t__SWIG_4(self, args); } } if (argc == 3) { int _v; int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_sip_t__SWIG_1(self, args); } } } } fail: SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_sip_t'.\n" " Possible C/C++ prototypes are:\n" " sip_t::sip_t(char const *,int)\n" " sip_t::sip_t(char const *,int,int)\n" " sip_t::sip_t(sip_t const *)\n" " sip_t::sip_t(tan_t const *)\n" " sip_t::sip_t(qfits_header const *)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_sip_t(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_sip_t",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_sip_t" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); delete_sip_t(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_subimage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; int arg4 ; int arg5 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_t_get_subimage",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_subimage" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_subimage" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_subimage" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_get_subimage" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sip_t_get_subimage" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); result = (sip_t *)sip_t_get_subimage(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_scale",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_scale" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_scale" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (sip_t *)sip_t_scale(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_pixel_scale" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_t_pixel_scale(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_radec_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_radec_center",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_radec_center" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); sip_t_radec_center(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_radius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_radius",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_radius" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_t_radius(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_write_to" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_t_write_to" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)sip_t_write_to(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_sip_t_ensure_inverse_polynomials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_ensure_inverse_polynomials",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_ensure_inverse_polynomials" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int)sip_t_ensure_inverse_polynomials(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_pixelxy2xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_pixelxy2xyz",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_pixelxy2xyz" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_pixelxy2xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_pixelxy2xyz" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_pixelxy2xyz(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_pixelxy2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_pixelxy2radec" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_pixelxy2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_radec2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_radec2pixelxy" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)sip_t_radec2pixelxy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_iwc2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_iwc2pixelxy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_iwc2pixelxy" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_iwc2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_iwc2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_iwc2pixelxy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_pixelxy2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_pixelxy2iwc",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_pixelxy2iwc" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_pixelxy2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_pixelxy2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_pixelxy2iwc(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_iwc2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_iwc2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_iwc2radec" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_iwc2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_iwc2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_iwc2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_radec2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_radec2iwc",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_radec2iwc" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_radec2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_radec2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)sip_t_radec2iwc(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_xyz2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_t_xyz2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_xyz2pixelxy" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_xyz2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_xyz2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_xyz2pixelxy" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (int)sip_t_xyz2pixelxy(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_is_inside(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_is_inside",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_is_inside" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_is_inside" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_is_inside" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)sip_t_is_inside(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_a_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_t_set_a_term",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_a_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_a_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_set_a_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_set_a_term" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); sip_t_set_a_term(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_b_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_t_set_b_term",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_b_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_b_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_set_b_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_set_b_term" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); sip_t_set_b_term(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_ap_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_t_set_ap_term",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_ap_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_ap_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_set_ap_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_set_ap_term" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); sip_t_set_ap_term(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_bp_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_t_set_bp_term",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_bp_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_bp_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_set_bp_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_t_set_bp_term" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); sip_t_set_bp_term(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_a_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_a_term",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_a_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_a_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_a_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (double)sip_t_get_a_term(arg1,arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_b_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_b_term",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_b_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_b_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_b_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (double)sip_t_get_b_term(arg1,arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_ap_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_ap_term",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_ap_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_ap_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_ap_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (double)sip_t_get_ap_term(arg1,arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_bp_term(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_bp_term",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_bp_term" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_bp_term" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_bp_term" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (double)sip_t_get_bp_term(arg1,arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_set_width",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_width" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_width" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); sip_t_set_width(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_set_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_t_set_height",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_set_height" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_set_height" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); sip_t_set_height(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_get_width",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_width" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_t_get_width(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_t_get_height",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_height" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_t_get_height(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_distortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_distortion",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_distortion" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_distortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_distortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_get_distortion(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_t_get_undistortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_t_get_undistortion",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_t_get_undistortion" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_t_get_undistortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_t_get_undistortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_t_get_undistortion(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *sip_t_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_sip_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_sip_create(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":sip_create")) SWIG_fail; result = (sip_t *)sip_create(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_free" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); sip_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_copy",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_copy" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_copy" "', argument " "2"" of type '" "sip_t const *""'"); } arg2 = (sip_t *)(argp2); sip_copy(arg1,(sip_t const *)arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_wrap_tan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_wrap_tan",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_wrap_tan" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_wrap_tan" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); sip_wrap_tan((tan_t const *)arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_imagew(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_imagew",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_imagew" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_imagew(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_imageh(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_imageh",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_imageh" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_imageh(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_pixelxy2radec",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixelxy2radec" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_pixelxy2radec" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_pixelxy2radec" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); sip_pixelxy2radec((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixelxy2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_pixelxy2xyzarr",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixelxy2xyzarr" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixelxy2xyzarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixelxy2xyzarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_pixelxy2xyzarr" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); sip_pixelxy2xyzarr((sip_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_radec2pixelxy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_radec2pixelxy" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_radec2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_radec2pixelxy" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)sip_radec2pixelxy((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_radec2pixelxy_check(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_radec2pixelxy_check",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_radec2pixelxy_check" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_radec2pixelxy_check" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_radec2pixelxy_check" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_radec2pixelxy_check" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_radec2pixelxy_check" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)sip_radec2pixelxy_check((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_xyzarr2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_xyzarr2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_xyzarr2pixelxy" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_xyzarr2pixelxy" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_xyzarr2pixelxy" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_xyzarr2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (anbool)sip_xyzarr2pixelxy((sip_t const *)arg1,(double const *)arg2,arg3,arg4); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_xyz2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:sip_xyz2pixelxy",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_xyz2pixelxy" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_xyz2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_xyz2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_xyz2pixelxy" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_xyz2pixelxy" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "sip_xyz2pixelxy" "', argument " "6"" of type '" "double *""'"); } arg6 = (double *)(argp6); result = (anbool)sip_xyz2pixelxy((sip_t const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixelxy2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_pixelxy2iwc",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixelxy2iwc" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixelxy2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixelxy2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_pixelxy2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_pixelxy2iwc" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); sip_pixelxy2iwc((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_det_cd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_det_cd",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_det_cd" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_det_cd((tan_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_det_cd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_det_cd",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_det_cd" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_det_cd((sip_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixel_scale" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_pixel_scale((tan_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixel_scale" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_pixel_scale((sip_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_calc_inv_distortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_calc_inv_distortion",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_calc_inv_distortion" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_calc_inv_distortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_calc_inv_distortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_calc_inv_distortion" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_calc_inv_distortion" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); sip_calc_inv_distortion((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_calc_distortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_calc_distortion",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_calc_distortion" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_calc_distortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_calc_distortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_calc_distortion" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_calc_distortion" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); sip_calc_distortion((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixel_distortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_pixel_distortion",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixel_distortion" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixel_distortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixel_distortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_pixel_distortion((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixel_undistortion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_pixel_undistortion",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixel_undistortion" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixel_undistortion" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixel_undistortion" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_pixel_undistortion((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixelxy2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_pixelxy2xyzarr",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixelxy2xyzarr" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_pixelxy2xyzarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_pixelxy2xyzarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_pixelxy2xyzarr" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); tan_pixelxy2xyzarr((tan_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixelxy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_pixelxy2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixelxy2radec" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_pixelxy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_pixelxy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_pixelxy2radec((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixelxy2radecarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_pixelxy2radecarr",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixelxy2radecarr" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_pixelxy2radecarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_pixelxy2radecarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_pixelxy2radecarr" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); tan_pixelxy2radecarr((tan_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_radec2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:tan_radec2pixelxy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_radec2pixelxy" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_radec2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_radec2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_radec2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "tan_radec2pixelxy" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)tan_radec2pixelxy((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_xyzarr2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_xyzarr2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_xyzarr2pixelxy" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_xyzarr2pixelxy" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "tan_xyzarr2pixelxy" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_xyzarr2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (anbool)tan_xyzarr2pixelxy((tan_t const *)arg1,(double const *)arg2,arg3,arg4); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_iwc2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:tan_iwc2pixelxy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_iwc2pixelxy" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_iwc2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_iwc2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_iwc2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "tan_iwc2pixelxy" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); tan_iwc2pixelxy((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_iwc2xyzarr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_iwc2xyzarr",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_iwc2xyzarr" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_iwc2xyzarr" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_iwc2xyzarr" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_iwc2xyzarr" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); tan_iwc2xyzarr((tan_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_iwc2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_iwc2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_iwc2radec" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_iwc2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_iwc2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_iwc2radec((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixelxy2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:tan_pixelxy2iwc",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixelxy2iwc" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_pixelxy2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_pixelxy2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_pixelxy2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "tan_pixelxy2iwc" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); tan_pixelxy2iwc((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_xyzarr2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_xyzarr2iwc",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_xyzarr2iwc" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_xyzarr2iwc" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "tan_xyzarr2iwc" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_xyzarr2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (anbool)tan_xyzarr2iwc((tan_t const *)arg1,(double const *)arg2,arg3,arg4); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_radec2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:tan_radec2iwc",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_radec2iwc" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_radec2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_radec2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "tan_radec2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "tan_radec2iwc" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)tan_radec2iwc((tan_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_xyzarr2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_xyzarr2iwc",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_xyzarr2iwc" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_xyzarr2iwc" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_xyzarr2iwc" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_xyzarr2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (anbool)sip_xyzarr2iwc((sip_t const *)arg1,(double const *)arg2,arg3,arg4); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_radec2iwc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_radec2iwc",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_radec2iwc" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_radec2iwc" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_radec2iwc" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_radec2iwc" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_radec2iwc" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); result = (anbool)sip_radec2iwc((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_iwc2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:sip_iwc2pixelxy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_iwc2pixelxy" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_iwc2pixelxy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_iwc2pixelxy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_iwc2pixelxy" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_iwc2pixelxy" "', argument " "5"" of type '" "double *""'"); } arg5 = (double *)(argp5); sip_iwc2pixelxy((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_iwc2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_iwc2radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_iwc2radec" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_iwc2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_iwc2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_iwc2radec((sip_t const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_print",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_print" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); sip_print((sip_t const *)arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_print_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_print_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_print_to" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_print_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); sip_print_to((sip_t const *)arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:tan_print",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_print" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); tan_print((tan_t const *)arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_print_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_print_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_print_to" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_print_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); tan_print_to((tan_t const *)arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_crval(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:sip_get_crval",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_crval" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); sip_get_crval((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_get_orientation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_get_orientation",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_get_orientation" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_get_orientation((tan_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_orientation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_get_orientation",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_orientation" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_get_orientation((sip_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_image_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_get_image_size",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_image_size" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_get_image_size" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_get_image_size" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); result = (int)sip_get_image_size((qfits_header const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_read_tan_or_sip_header_file_ext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; sip_t *arg3 = (sip_t *) 0 ; anbool arg4 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; unsigned char val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_read_tan_or_sip_header_file_ext",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_read_tan_or_sip_header_file_ext" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_read_tan_or_sip_header_file_ext" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_read_tan_or_sip_header_file_ext" "', argument " "3"" of type '" "sip_t *""'"); } arg3 = (sip_t *)(argp3); ecode4 = SWIG_AsVal_unsigned_SS_char(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_read_tan_or_sip_header_file_ext" "', argument " "4"" of type '" "anbool""'"); } arg4 = (anbool)(val4); result = (sip_t *)sip_read_tan_or_sip_header_file_ext((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_sip_create_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:sip_create_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_create_header" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (qfits_header *)sip_create_header((sip_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_create_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:tan_create_header",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_create_header" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (qfits_header *)tan_create_header((tan_t const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_add_to_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_add_to_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_add_to_header" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_add_to_header" "', argument " "2"" of type '" "sip_t const *""'"); } arg2 = (sip_t *)(argp2); sip_add_to_header(arg1,(sip_t const *)arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_add_to_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; tan_t *arg2 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_add_to_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_add_to_header" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_add_to_header" "', argument " "2"" of type '" "tan_t const *""'"); } arg2 = (tan_t *)(argp2); tan_add_to_header(arg1,(tan_t const *)arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_read_header_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; sip_t *arg2 = (sip_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_read_header_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_read_header_file" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_read_header_file" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); result = (sip_t *)sip_read_header_file((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_sip_read_header_file_ext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; sip_t *arg3 = (sip_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_read_header_file_ext",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_read_header_file_ext" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_read_header_file_ext" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_read_header_file_ext" "', argument " "3"" of type '" "sip_t *""'"); } arg3 = (sip_t *)(argp3); result = (sip_t *)sip_read_header_file_ext((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_sip_read_header_file_ext_only(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; sip_t *arg3 = (sip_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_read_header_file_ext_only",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_read_header_file_ext_only" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_read_header_file_ext_only" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_read_header_file_ext_only" "', argument " "3"" of type '" "sip_t *""'"); } arg3 = (sip_t *)(argp3); result = (sip_t *)sip_read_header_file_ext_only((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_tan_read_header_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; tan_t *arg2 = (tan_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_read_header_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_read_header_file" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_read_header_file" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); result = (tan_t *)tan_read_header_file((char const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_tan_read_header_file_ext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; tan_t *arg3 = (tan_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_read_header_file_ext",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_read_header_file_ext" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_read_header_file_ext" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "tan_read_header_file_ext" "', argument " "3"" of type '" "tan_t *""'"); } arg3 = (tan_t *)(argp3); result = (tan_t *)tan_read_header_file_ext((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_tan_read_header_file_ext_only(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; tan_t *arg3 = (tan_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_read_header_file_ext_only",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_read_header_file_ext_only" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_read_header_file_ext_only" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "tan_read_header_file_ext_only" "', argument " "3"" of type '" "tan_t *""'"); } arg3 = (tan_t *)(argp3); result = (tan_t *)tan_read_header_file_ext_only((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_sip_read_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:sip_read_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_read_header" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_read_header" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); result = (sip_t *)sip_read_header((qfits_header const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_read_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; tan_t *arg2 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; tan_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:tan_read_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_read_header" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_read_header" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); result = (tan_t *)tan_read_header((qfits_header const *)arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_tan_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_from_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int arg2 ; sip_t *arg3 = (sip_t *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_from_string",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_from_string" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_from_string" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_from_string" "', argument " "3"" of type '" "sip_t *""'"); } arg3 = (sip_t *)(argp3); result = (sip_t *)sip_from_string((char const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_tan_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:tan_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_write_to" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_write_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)tan_write_to((tan_t const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_write_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:sip_write_to",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_write_to" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_write_to" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)sip_write_to((sip_t const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_write_to_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:sip_write_to_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_write_to_file" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_write_to_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)sip_write_to_file((sip_t const *)arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_tan_write_to_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:tan_write_to_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_write_to_file" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_write_to_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)tan_write_to_file((tan_t const *)arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_wcs_pixel_center_for_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:wcs_pixel_center_for_size",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "wcs_pixel_center_for_size" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)wcs_pixel_center_for_size(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_ensure_inverse_polynomials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:sip_ensure_inverse_polynomials",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_ensure_inverse_polynomials" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); result = (int)sip_ensure_inverse_polynomials(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_compute_inverse_polynomials(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; int arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:sip_compute_inverse_polynomials",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_compute_inverse_polynomials" "', argument " "1"" of type '" "sip_t *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_compute_inverse_polynomials" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_compute_inverse_polynomials" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_compute_inverse_polynomials" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sip_compute_inverse_polynomials" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "sip_compute_inverse_polynomials" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "sip_compute_inverse_polynomials" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); result = (int)sip_compute_inverse_polynomials(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_filter_stars_in_field(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; int arg5 ; double **arg6 = (double **) 0 ; int *arg7 = (int *) 0 ; int *arg8 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; int *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:sip_filter_stars_in_field",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_filter_stars_in_field" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_filter_stars_in_field" "', argument " "2"" of type '" "tan_t const *""'"); } arg2 = (tan_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_filter_stars_in_field" "', argument " "3"" of type '" "double const *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_filter_stars_in_field" "', argument " "4"" of type '" "double const *""'"); } arg4 = (double *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sip_filter_stars_in_field" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_p_double, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "sip_filter_stars_in_field" "', argument " "6"" of type '" "double **""'"); } arg6 = (double **)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "sip_filter_stars_in_field" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "sip_filter_stars_in_field" "', argument " "8"" of type '" "int *""'"); } arg8 = (int *)(argp8); result = (int *)sip_filter_stars_in_field((sip_t const *)arg1,(tan_t const *)arg2,(double const *)arg3,(double const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_radec_bounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg3 = &temp3; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OO:sip_get_radec_bounds",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_radec_bounds" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_get_radec_bounds" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); sip_get_radec_bounds((sip_t const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_walk_image_boundary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; void (*arg3)(sip_t const *,double,double,double,double,void *) = (void (*)(sip_t const *,double,double,double,double,void *)) 0 ; void *arg4 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_walk_image_boundary",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_walk_image_boundary" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_walk_image_boundary" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); { int res = SWIG_ConvertFunctionPtr(obj2, (void**)(&arg3), SWIGTYPE_p_f_p_q_const__sip_t_double_double_double_double_p_void__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "sip_walk_image_boundary" "', argument " "3"" of type '" "void (*)(sip_t const *,double,double,double,double,void *)""'"); } } res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_walk_image_boundary" "', argument " "4"" of type '" "void *""'"); } sip_walk_image_boundary((sip_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_radec_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:sip_get_radec_center",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_radec_center" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); sip_get_radec_center((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_get_radec_center(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:tan_get_radec_center",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_get_radec_center" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); tan_get_radec_center((tan_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_radius_deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:sip_get_radius_deg",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_radius_deg" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); result = (double)sip_get_radius_deg((sip_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_get_radius_deg(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:tan_get_radius_deg",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_get_radius_deg" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); result = (double)tan_get_radius_deg((tan_t const *)arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_radec_center_hms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; double *arg4 = (double *) 0 ; int *arg5 = (int *) 0 ; int *arg6 = (int *) 0 ; int *arg7 = (int *) 0 ; double *arg8 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:sip_get_radec_center_hms",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_radec_center_hms" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_get_radec_center_hms" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_get_radec_center_hms" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_get_radec_center_hms" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "sip_get_radec_center_hms" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "sip_get_radec_center_hms" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "sip_get_radec_center_hms" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "sip_get_radec_center_hms" "', argument " "8"" of type '" "double *""'"); } arg8 = (double *)(argp8); sip_get_radec_center_hms((sip_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_pixel_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_pixel_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_pixel_is_inside_image" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_pixel_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_pixel_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)sip_pixel_is_inside_image((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_is_inside_image" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sip_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)sip_is_inside_image((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_get_radec_center_hms_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_get_radec_center_hms_string",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_radec_center_hms_string" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_get_radec_center_hms_string" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_get_radec_center_hms_string" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); sip_get_radec_center_hms_string((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_sip_get_field_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; char **arg4 = (char **) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:sip_get_field_size",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_get_field_size" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_get_field_size" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "sip_get_field_size" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "sip_get_field_size" "', argument " "4"" of type '" "char **""'"); } arg4 = (char **)(argp4); sip_get_field_size((sip_t const *)arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_shift(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; double arg3 ; double arg4 ; double arg5 ; double arg6 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:sip_shift",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_shift" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_shift" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_shift" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sip_shift" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sip_shift" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "sip_shift" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); sip_shift((sip_t const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_pixel_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_pixel_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_pixel_is_inside_image" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_pixel_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_pixel_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)tan_pixel_is_inside_image((tan_t const *)arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_is_inside_image" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "tan_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)tan_is_inside_image((tan_t const *)arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_transform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; double arg3 ; double arg4 ; double arg5 ; double arg6 ; double arg7 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; double val6 ; int ecode6 = 0 ; double val7 ; int ecode7 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:tan_transform",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_transform" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_transform" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_transform" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "tan_transform" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "tan_transform" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_double(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "tan_transform" "', argument " "6"" of type '" "double""'"); } arg6 = (double)(val6); ecode7 = SWIG_AsVal_double(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "tan_transform" "', argument " "7"" of type '" "double""'"); } arg7 = (double)(val7); tan_transform((tan_t const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_scale",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_scale" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_scale" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_scale" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_scale((tan_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_scale",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_scale" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "sip_scale" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sip_scale" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); sip_scale((sip_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_rotate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_rotate",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_rotate" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_rotate" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "tan_rotate" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); tan_rotate((tan_t const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_add_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; float arg4 ; anwcs_t *arg5 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:coadd_add_numpy",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_add_numpy" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); arg2 = obj1; arg3 = obj2; ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "coadd_add_numpy" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "coadd_add_numpy" "', argument " "5"" of type '" "anwcs_t const *""'"); } arg5 = (anwcs_t *)(argp5); result = (int)coadd_add_numpy(arg1,arg2,arg3,arg4,(struct anwcs_t const *)arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_coadd_get_snapshot_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; coadd_t *arg1 = (coadd_t *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:coadd_get_snapshot_numpy",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_coadd_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "coadd_get_snapshot_numpy" "', argument " "1"" of type '" "coadd_t *""'"); } arg1 = (coadd_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "coadd_get_snapshot_numpy" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); result = (PyObject *)coadd_get_snapshot_numpy(arg1,arg2); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_sip_wcs_py(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; tan_t *arg4 = (tan_t *) 0 ; int arg5 ; int arg6 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; sip_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:fit_sip_wcs_py",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fit_sip_wcs_py" "', argument " "4"" of type '" "tan_t *""'"); } arg4 = (tan_t *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "fit_sip_wcs_py" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "fit_sip_wcs_py" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); result = (sip_t *)fit_sip_wcs_py(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_sip_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_broadcast_2to2ok(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; f_2to2ok arg1 = (f_2to2ok) 0 ; void *arg2 = (void *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:broadcast_2to2ok",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; { int res = SWIG_ConvertFunctionPtr(obj0, (void**)(&arg1), SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "broadcast_2to2ok" "', argument " "1"" of type '" "f_2to2ok""'"); } } res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "broadcast_2to2ok" "', argument " "2"" of type '" "void const *""'"); } arg3 = obj2; arg4 = obj3; result = (PyObject *)broadcast_2to2ok(arg1,(void const *)arg2,arg3,arg4); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_broadcast_2to2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; f_2to2 arg1 = (f_2to2) 0 ; void *arg2 = (void *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:broadcast_2to2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; { int res = SWIG_ConvertFunctionPtr(obj0, (void**)(&arg1), SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "broadcast_2to2" "', argument " "1"" of type '" "f_2to2""'"); } } res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "broadcast_2to2" "', argument " "2"" of type '" "void const *""'"); } arg3 = obj2; arg4 = obj3; result = (PyObject *)broadcast_2to2(arg1,(void const *)arg2,arg3,arg4); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_broadcast_2to2i(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; f_2to2i arg1 = (f_2to2i) 0 ; void *arg2 = (void *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:broadcast_2to2i",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; { int res = SWIG_ConvertFunctionPtr(obj0, (void**)(&arg1), SWIGTYPE_p_f_p_q_const__void_double_double_p_double_p_double__int); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "broadcast_2to2i" "', argument " "1"" of type '" "f_2to2i""'"); } } res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "broadcast_2to2i" "', argument " "2"" of type '" "void const *""'"); } arg3 = obj2; arg4 = obj3; result = (PyObject *)broadcast_2to2i(arg1,(void const *)arg2,arg3,arg4); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_rd2xy_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_rd2xy_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_rd2xy_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_rd2xy_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_rd2xy_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_rd2xy_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_rd2xy_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_rd2xy_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_rd2xy_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_rd2xy_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_rd2xy_wrapper" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)anwcs_rd2xy_wrapper((struct anwcs_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_iwc2xy_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_iwc2xy_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_iwc2xy_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_iwc2xy_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_iwc2xy_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_iwc2xy_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_iwc2xy_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_iwc2xy_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_xy2iwc_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_xy2iwc_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_xy2iwc_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_xy2iwc_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_xy2iwc_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_xy2iwc_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_xy2iwc_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_xy2iwc_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_iwc2rd_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_iwc2rd_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_iwc2rd_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_iwc2rd_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_iwc2rd_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_iwc2rd_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_iwc2rd_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_iwc2rd_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_rd2iwc_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_rd2iwc_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_rd2iwc_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_rd2iwc_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_rd2iwc_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_rd2iwc_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_rd2iwc_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_rd2iwc_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_xy2rd_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_xy2rd_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_xy2rd_wrapper" "', argument " "1"" of type '" "tan_t const *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)tan_xy2rd_wrapper((tan_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_sip_xy2rd_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; sip_t *arg1 = (sip_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:sip_xy2rd_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sip_xy2rd_wrapper" "', argument " "1"" of type '" "sip_t const *""'"); } arg1 = (sip_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)sip_xy2rd_wrapper((sip_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_anwcs_xy2rd_wrapper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; anwcs_t *arg1 = (anwcs_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:anwcs_xy2rd_wrapper",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "anwcs_xy2rd_wrapper" "', argument " "1"" of type '" "anwcs_t const *""'"); } arg1 = (anwcs_t *)(argp1); arg2 = obj1; arg3 = obj2; result = (PyObject *)anwcs_xy2rd_wrapper((struct anwcs_t const *)arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_wcs_resample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; int arg5 ; int arg6 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:tan_wcs_resample",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_wcs_resample" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_wcs_resample" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); arg3 = obj2; arg4 = obj3; ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "tan_wcs_resample" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "tan_wcs_resample" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); result = (int)tan_wcs_resample(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_numpy_xyz2pixelxy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tan_t *arg1 = (tan_t *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject *arg4 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:tan_numpy_xyz2pixelxy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_numpy_xyz2pixelxy" "', argument " "1"" of type '" "tan_t *""'"); } arg1 = (tan_t *)(argp1); arg2 = obj1; arg3 = obj2; arg4 = obj3; result = (int)tan_numpy_xyz2pixelxy(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_an_tally(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; PyObject *arg2 = (PyObject *) 0 ; PyObject *arg3 = (PyObject *) 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:an_tally",&obj0,&obj1,&obj2)) SWIG_fail; arg1 = obj0; arg2 = obj1; arg3 = obj2; result = (int)an_tally(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_use_error_system(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; if (!PyArg_ParseTuple(args,(char *)":fits_use_error_system")) SWIG_fail; fits_use_error_system(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_to_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; int *arg2 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:fits_to_string",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_to_string" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_to_string" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); result = (char *)fits_to_string((qfits_header const *)arg1,arg2); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_float_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_write_float_image",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_float_image" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_float_image" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_float_image" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_write_float_image" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)fits_write_float_image((float const *)arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_write_u8_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int arg2 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_write_u8_image",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_u8_image" "', argument " "1"" of type '" "uint8_t const *""'"); } arg1 = (uint8_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_u8_image" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_u8_image" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_write_u8_image" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)fits_write_u8_image((uint8_t const *)arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_write_i16_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int16_t *arg1 = (int16_t *) 0 ; int arg2 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_write_i16_image",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int16_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_i16_image" "', argument " "1"" of type '" "int16_t const *""'"); } arg1 = (int16_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_i16_image" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_i16_image" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_write_i16_image" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)fits_write_i16_image((int16_t const *)arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_get_header_for_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfitsdumper *arg1 = (qfitsdumper *) 0 ; int arg2 ; qfits_header *arg3 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_get_header_for_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_get_header_for_image" "', argument " "1"" of type '" "qfitsdumper const *""'"); } arg1 = (qfitsdumper *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_get_header_for_image" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_get_header_for_image" "', argument " "3"" of type '" "qfits_header *""'"); } arg3 = (qfits_header *)(argp3); result = (qfits_header *)fits_get_header_for_image((qfitsdumper const *)arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_get_header_for_image2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; qfits_header *arg4 = (qfits_header *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_get_header_for_image2",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "fits_get_header_for_image2" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_get_header_for_image2" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_get_header_for_image2" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_get_header_for_image2" "', argument " "4"" of type '" "qfits_header *""'"); } arg4 = (qfits_header *)(argp4); result = (qfits_header *)fits_get_header_for_image2(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_get_header_for_image3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int arg4 ; qfits_header *arg5 = (qfits_header *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; qfits_header *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:fits_get_header_for_image3",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "fits_get_header_for_image3" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_get_header_for_image3" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_get_header_for_image3" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fits_get_header_for_image3" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fits_get_header_for_image3" "', argument " "5"" of type '" "qfits_header *""'"); } arg5 = (qfits_header *)(argp5); result = (qfits_header *)fits_get_header_for_image3(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_header, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_write_header",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_header" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_header" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)fits_write_header((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_write_header_and_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; qfitsdumper *arg2 = (qfitsdumper *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_header_and_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_header_and_image" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_header_and_image" "', argument " "2"" of type '" "qfitsdumper const *""'"); } arg2 = (qfitsdumper *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_header_and_image" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)fits_write_header_and_image((qfits_header const *)arg1,(qfitsdumper const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_get_double_val(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_table *arg1 = (qfits_table *) 0 ; int arg2 ; void *arg3 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int res3 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_get_double_val",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_table, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_get_double_val" "', argument " "1"" of type '" "qfits_table const *""'"); } arg1 = (qfits_table *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_get_double_val" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_get_double_val" "', argument " "3"" of type '" "void const *""'"); } result = (double)fits_get_double_val((qfits_table const *)arg1,arg2,(void const *)arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_is_table_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_is_table_header",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_is_table_header" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)fits_is_table_header((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_fits_is_primary_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_is_primary_header",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_is_primary_header" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)fits_is_primary_header((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_fits_copy_non_table_headers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:fits_copy_non_table_headers",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_copy_non_table_headers" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_copy_non_table_headers" "', argument " "2"" of type '" "qfits_header const *""'"); } arg2 = (qfits_header *)(argp2); fits_copy_non_table_headers(arg1,(qfits_header const *)arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_get_dupstring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:fits_get_dupstring",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_get_dupstring" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_get_dupstring" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (char *)fits_get_dupstring((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_get_long_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:fits_get_long_string",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_get_long_string" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_get_long_string" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (char *)fits_get_long_string((qfits_header const *)arg1,(char const *)arg2); resultobj = SWIG_FromCharPtr((const char *)result); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_addf__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_addf",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_addf" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_addf" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_header_addf" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_addf" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_addf(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_addf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,4); varargs = PyTuple_GetSlice(args,4,PyTuple_Size(args)); resultobj = _wrap_fits_header_addf__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_header_addf_longstring__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_addf_longstring",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_addf_longstring" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_addf_longstring" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_header_addf_longstring" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_addf_longstring" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_addf_longstring(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_addf_longstring(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,4); varargs = PyTuple_GetSlice(args,4,PyTuple_Size(args)); resultobj = _wrap_fits_header_addf_longstring__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_header_add_longstring_boilerplate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_header_add_longstring_boilerplate",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_add_longstring_boilerplate" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_header_add_longstring_boilerplate(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_header_modf__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_modf",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_modf" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_modf" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_header_modf" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_modf" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_modf(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_modf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,4); varargs = PyTuple_GetSlice(args,4,PyTuple_Size(args)); resultobj = _wrap_fits_header_modf__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_header_add_int(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_add_int",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_add_int" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_add_int" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_add_int" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_add_int" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_add_int(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_add_double(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_add_double",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_add_double" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_add_double" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_add_double" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_add_double" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_add_double(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_set_double(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_set_double",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_set_double" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_set_double" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_set_double" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_set_double" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_set_double(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_set_int(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_set_int",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_set_int" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_set_int" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_set_int" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_set_int" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_set_int(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_mod_int(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_mod_int",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_mod_int" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_mod_int" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_mod_int" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_mod_int" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_mod_int(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_header_mod_double(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_header_mod_double",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_header_mod_double" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_header_mod_double" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_header_mod_double" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_header_mod_double" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); fits_header_mod_double(arg1,(char const *)arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_fits_update_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_update_value",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_update_value" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_update_value" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_update_value" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); result = (int)fits_update_value(arg1,(char const *)arg2,(char const *)arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_fits_copy_table(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_table *arg1 = (qfits_table *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; qfits_table *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_copy_table",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_table, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_copy_table" "', argument " "1"" of type '" "qfits_table *""'"); } arg1 = (qfits_table *)(argp1); result = (qfits_table *)fits_copy_table(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_table, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_an_fits_copy_header(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:an_fits_copy_header",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "an_fits_copy_header" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "an_fits_copy_header" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "an_fits_copy_header" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); result = (int)an_fits_copy_header((qfits_header const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_fits_copy_all_headers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_copy_all_headers",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_copy_all_headers" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_copy_all_headers" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_copy_all_headers" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); result = (int)fits_copy_all_headers((qfits_header const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_fits_append_all_headers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; qfits_header *arg2 = (qfits_header *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_append_all_headers",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_append_all_headers" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_append_all_headers" "', argument " "2"" of type '" "qfits_header *""'"); } arg2 = (qfits_header *)(argp2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_append_all_headers" "', argument " "3"" of type '" "char *""'"); } arg3 = (char *)(buf3); result = (int)fits_append_all_headers((qfits_header const *)arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_fits_add_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char **arg2 = (char **) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_add_args",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_args" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_char, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_add_args" "', argument " "2"" of type '" "char **""'"); } arg2 = (char **)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_add_args" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)fits_add_args(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_add_long_comment__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_add_long_comment",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_long_comment" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_add_long_comment" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)fits_add_long_comment(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_add_long_comment(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,2); varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args)); resultobj = _wrap_fits_add_long_comment__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_append_long_comment__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_append_long_comment",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_append_long_comment" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_append_long_comment" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)fits_append_long_comment(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_append_long_comment(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,2); varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args)); resultobj = _wrap_fits_append_long_comment__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_add_long_history__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; char *arg2 = (char *) 0 ; void *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_add_long_history",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_long_history" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_add_long_history" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)fits_add_long_history(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_add_long_history(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,2); varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args)); resultobj = _wrap_fits_add_long_history__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_fits_blocks_needed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_blocks_needed",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "fits_blocks_needed" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); result = (int)fits_blocks_needed(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_bytes_needed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; size_t arg1 ; size_t val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; size_t result; if (!PyArg_ParseTuple(args,(char *)"O:fits_bytes_needed",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "fits_bytes_needed" "', argument " "1"" of type '" "size_t""'"); } arg1 = (size_t)(val1); result = fits_bytes_needed(arg1); resultobj = SWIG_From_size_t((size_t)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_pad_file_with(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; char arg2 ; void *argp1 = 0 ; int res1 = 0 ; char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_pad_file_with",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_pad_file_with" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_pad_file_with" "', argument " "2"" of type '" "char""'"); } arg2 = (char)(val2); result = (int)fits_pad_file_with(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_pad_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_pad_file",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_pad_file" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); result = (int)fits_pad_file(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_pad_file_name(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_pad_file_name",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_pad_file_name" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); result = (int)fits_pad_file_name(arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_fits_fill_endian_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_fill_endian_string",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_fill_endian_string" "', argument " "1"" of type '" "char *""'"); } arg1 = (char *)(buf1); fits_fill_endian_string(arg1); resultobj = SWIG_Py_Void(); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_fits_get_endian_string(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":fits_get_endian_string")) SWIG_fail; result = (char *)fits_get_endian_string(); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_check_endian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_check_endian",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_check_endian" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (int)fits_check_endian((qfits_header const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_check_uint_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_check_uint_size",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_check_uint_size" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (int)fits_check_uint_size((qfits_header const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_check_double_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:fits_check_double_size",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_check_double_size" "', argument " "1"" of type '" "qfits_header const *""'"); } arg1 = (qfits_header *)(argp1); result = (int)fits_check_double_size((qfits_header const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_add_endian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_add_endian",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_endian" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_add_endian(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_add_reverse_endian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_add_reverse_endian",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_reverse_endian" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_add_reverse_endian(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_mod_reverse_endian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_mod_reverse_endian",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_mod_reverse_endian" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_mod_reverse_endian(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_add_uint_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_add_uint_size",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_uint_size" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_add_uint_size(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_add_double_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_header *arg1 = (qfits_header *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:fits_add_double_size",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_header, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_double_size" "', argument " "1"" of type '" "qfits_header *""'"); } arg1 = (qfits_header *)(argp1); fits_add_double_size(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_find_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_table *arg1 = (qfits_table *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_find_column",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_table, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_find_column" "', argument " "1"" of type '" "qfits_table const *""'"); } arg1 = (qfits_table *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_find_column" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)fits_find_column((qfits_table const *)arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_find_table_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; off_t *arg3 = (off_t *) 0 ; off_t *arg4 = (off_t *) 0 ; int *arg5 = (int *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:fits_find_table_column",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_find_table_column" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_find_table_column" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_off_t, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_find_table_column" "', argument " "3"" of type '" "off_t *""'"); } arg3 = (off_t *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_off_t, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fits_find_table_column" "', argument " "4"" of type '" "off_t *""'"); } arg4 = (off_t *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fits_find_table_column" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); result = (int)fits_find_table_column((char const *)arg1,(char const *)arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_get_table_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; int *arg3 = (int *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; qfits_table *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_get_table_column",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_get_table_column" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_get_table_column" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_get_table_column" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); result = (qfits_table *)fits_get_table_column((char const *)arg1,(char const *)arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfits_table, 0 | 0 ); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_fits_add_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_table *arg1 = (qfits_table *) 0 ; int arg2 ; tfits_type arg3 ; int arg4 ; char *arg5 = (char *) 0 ; char *arg6 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; void *argp3 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; int res6 ; char *buf6 = 0 ; int alloc6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:fits_add_column",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_table, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_add_column" "', argument " "1"" of type '" "qfits_table *""'"); } arg1 = (qfits_table *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_add_column" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); { res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_tfits_type, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_add_column" "', argument " "3"" of type '" "tfits_type""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_add_column" "', argument " "3"" of type '" "tfits_type""'"); } else { arg3 = *((tfits_type *)(argp3)); } } ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fits_add_column" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "fits_add_column" "', argument " "5"" of type '" "char const *""'"); } arg5 = (char *)(buf5); res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "fits_add_column" "', argument " "6"" of type '" "char const *""'"); } arg6 = (char *)(buf6); result = (int)fits_add_column(arg1,arg2,arg3,arg4,(char const *)arg5,(char const *)arg6); resultobj = SWIG_From_int((int)(result)); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return resultobj; fail: if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); if (alloc6 == SWIG_NEWOBJ) free((char*)buf6); return NULL; } SWIGINTERN PyObject *_wrap_fits_offset_of_column(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfits_table *arg1 = (qfits_table *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_offset_of_column",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfits_table, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_offset_of_column" "', argument " "1"" of type '" "qfits_table *""'"); } arg1 = (qfits_table *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_offset_of_column" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)fits_offset_of_column(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_A(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; char arg2 ; void *argp1 = 0 ; int res1 = 0 ; char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_write_data_A",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_A" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_data_A" "', argument " "2"" of type '" "char""'"); } arg2 = (char)(val2); result = (int)fits_write_data_A(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_B(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; uint8_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_write_data_B",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_B" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); { res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_uint8_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data_B" "', argument " "2"" of type '" "uint8_t""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data_B" "', argument " "2"" of type '" "uint8_t""'"); } else { arg2 = *((uint8_t *)(argp2)); } } result = (int)fits_write_data_B(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_D(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; double arg2 ; anbool arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_data_D",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_D" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_data_D" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_data_D" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); result = (int)fits_write_data_D(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_E(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; float arg2 ; anbool arg3 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_data_E",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_E" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_data_E" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_data_E" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); result = (int)fits_write_data_E(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_I(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; int16_t arg2 ; anbool arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_data_I",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_I" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); { res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_int16_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data_I" "', argument " "2"" of type '" "int16_t""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data_I" "', argument " "2"" of type '" "int16_t""'"); } else { arg2 = *((int16_t *)(argp2)); } } ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_data_I" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); result = (int)fits_write_data_I(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_J(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; int32_t arg2 ; anbool arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_data_J",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_J" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); { res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_int32_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data_J" "', argument " "2"" of type '" "int32_t""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data_J" "', argument " "2"" of type '" "int32_t""'"); } else { arg2 = *((int32_t *)(argp2)); } } ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_data_J" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); result = (int)fits_write_data_J(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_K(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; int64_t arg2 ; anbool arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:fits_write_data_K",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_K" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); { res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_int64_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data_K" "', argument " "2"" of type '" "int64_t""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data_K" "', argument " "2"" of type '" "int64_t""'"); } else { arg2 = *((int64_t *)(argp2)); } } ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fits_write_data_K" "', argument " "3"" of type '" "anbool""'"); } arg3 = (anbool)(val3); result = (int)fits_write_data_K(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_L(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; char arg2 ; void *argp1 = 0 ; int res1 = 0 ; char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_write_data_L",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_L" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_data_L" "', argument " "2"" of type '" "char""'"); } arg2 = (char)(val2); result = (int)fits_write_data_L(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_X(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; unsigned char arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:fits_write_data_X",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_X" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "fits_write_data_X" "', argument " "2"" of type '" "unsigned char""'"); } arg2 = (unsigned char)(val2); result = (int)fits_write_data_X(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; void *arg2 = (void *) 0 ; tfits_type arg3 ; anbool arg4 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; void *argp3 ; int res3 = 0 ; unsigned char val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:fits_write_data",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data" "', argument " "2"" of type '" "void *""'"); } { res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_tfits_type, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_write_data" "', argument " "3"" of type '" "tfits_type""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data" "', argument " "3"" of type '" "tfits_type""'"); } else { arg3 = *((tfits_type *)(argp3)); } } ecode4 = SWIG_AsVal_unsigned_SS_char(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fits_write_data" "', argument " "4"" of type '" "anbool""'"); } arg4 = (anbool)(val4); result = (int)fits_write_data(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fits_write_data_array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; FILE *arg1 = (FILE *) 0 ; void *arg2 = (void *) 0 ; tfits_type arg3 ; int arg4 ; anbool arg5 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; void *argp3 ; int res3 = 0 ; int val4 ; int ecode4 = 0 ; unsigned char val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:fits_write_data_array",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fits_write_data_array" "', argument " "1"" of type '" "FILE *""'"); } arg1 = (FILE *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fits_write_data_array" "', argument " "2"" of type '" "void const *""'"); } { res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_tfits_type, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "fits_write_data_array" "', argument " "3"" of type '" "tfits_type""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "fits_write_data_array" "', argument " "3"" of type '" "tfits_type""'"); } else { arg3 = *((tfits_type *)(argp3)); } } ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "fits_write_data_array" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_unsigned_SS_char(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "fits_write_data_array" "', argument " "5"" of type '" "anbool""'"); } arg5 = (anbool)(val5); result = (int)fits_write_data_array(arg1,(void const *)arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_collapsing_find_minlabel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; dimage_label_t arg1 ; dimage_label_t *arg2 = (dimage_label_t *) 0 ; void *argp1 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; dimage_label_t result; if (!PyArg_ParseTuple(args,(char *)"OO:collapsing_find_minlabel",&obj0,&obj1)) SWIG_fail; { res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_uint16_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "collapsing_find_minlabel" "', argument " "1"" of type '" "dimage_label_t""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "collapsing_find_minlabel" "', argument " "1"" of type '" "dimage_label_t""'"); } else { arg1 = *((dimage_label_t *)(argp1)); } } res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_uint16_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "collapsing_find_minlabel" "', argument " "2"" of type '" "dimage_label_t *""'"); } arg2 = (dimage_label_t *)(argp2); result = collapsing_find_minlabel(arg1,arg2); resultobj = SWIG_NewPointerObj((dimage_label_t *)memcpy((dimage_label_t *)malloc(sizeof(dimage_label_t)),&result,sizeof(dimage_label_t)), SWIGTYPE_p_uint16_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dfind2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int *arg1 = (int *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; int *arg5 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dfind2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dfind2" "', argument " "1"" of type '" "int const *""'"); } arg1 = (int *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dfind2" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dfind2" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dfind2" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dfind2" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); result = (int)dfind2((int const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dfind2_u8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; unsigned char *arg1 = (unsigned char *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; int *arg5 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dfind2_u8",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_unsigned_char, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dfind2_u8" "', argument " "1"" of type '" "unsigned char const *""'"); } arg1 = (unsigned char *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dfind2_u8" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dfind2_u8" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dfind2_u8" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dfind2_u8" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); result = (int)dfind2_u8((unsigned char const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dselip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; unsigned long arg1 ; unsigned long arg2 ; float *arg3 = (float *) 0 ; unsigned long val1 ; int ecode1 = 0 ; unsigned long val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"OOO:dselip",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_unsigned_SS_long(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dselip" "', argument " "1"" of type '" "unsigned long""'"); } arg1 = (unsigned long)(val1); ecode2 = SWIG_AsVal_unsigned_SS_long(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dselip" "', argument " "2"" of type '" "unsigned long""'"); } arg2 = (unsigned long)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "dselip" "', argument " "3"" of type '" "float const *""'"); } arg3 = (float *)(argp3); result = (float)dselip(arg1,arg2,(float const *)arg3); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dselip_cleanup(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; if (!PyArg_ParseTuple(args,(char *)":dselip_cleanup")) SWIG_fail; dselip_cleanup(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsmooth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float arg4 ; float *arg5 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dsmooth",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsmooth" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsmooth" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsmooth" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsmooth" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dsmooth" "', argument " "5"" of type '" "float *""'"); } arg5 = (float *)(argp5); result = (int)dsmooth(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsmooth2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float arg4 ; float *arg5 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dsmooth2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsmooth2" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsmooth2" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsmooth2" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsmooth2" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dsmooth2" "', argument " "5"" of type '" "float *""'"); } arg5 = (float *)(argp5); dsmooth2(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsmooth2_u8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int arg2 ; int arg3 ; float arg4 ; float *arg5 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dsmooth2_u8",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsmooth2_u8" "', argument " "1"" of type '" "uint8_t *""'"); } arg1 = (uint8_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsmooth2_u8" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsmooth2_u8" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsmooth2_u8" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dsmooth2_u8" "', argument " "5"" of type '" "float *""'"); } arg5 = (float *)(argp5); dsmooth2_u8(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsmooth2_i16(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int16_t *arg1 = (int16_t *) 0 ; int arg2 ; int arg3 ; float arg4 ; float *arg5 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:dsmooth2_i16",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int16_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsmooth2_i16" "', argument " "1"" of type '" "int16_t *""'"); } arg1 = (int16_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsmooth2_i16" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsmooth2_i16" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsmooth2_i16" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dsmooth2_i16" "', argument " "5"" of type '" "float *""'"); } arg5 = (float *)(argp5); dsmooth2_i16(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dobjects(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float arg4 ; float arg5 ; int *arg6 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:dobjects",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dobjects" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dobjects" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dobjects" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dobjects" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dobjects" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dobjects" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); result = (int)dobjects(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dmask(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float arg4 ; float arg5 ; uint8_t *arg6 = (uint8_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:dmask",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dmask" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dmask" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dmask" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dmask" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dmask" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dmask" "', argument " "6"" of type '" "uint8_t *""'"); } arg6 = (uint8_t *)(argp6); result = (int)dmask(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dpeaks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; int *arg5 = (int *) 0 ; int *arg6 = (int *) 0 ; float arg7 ; float arg8 ; float arg9 ; int arg10 ; int arg11 ; int arg12 ; float arg13 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; float val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; float val9 ; int ecode9 = 0 ; int val10 ; int ecode10 = 0 ; int val11 ; int ecode11 = 0 ; int val12 ; int ecode12 = 0 ; float val13 ; int ecode13 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOO:dpeaks",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dpeaks" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dpeaks" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dpeaks" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dpeaks" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "dpeaks" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dpeaks" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); ecode7 = SWIG_AsVal_float(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "dpeaks" "', argument " "7"" of type '" "float""'"); } arg7 = (float)(val7); ecode8 = SWIG_AsVal_float(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "dpeaks" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); ecode9 = SWIG_AsVal_float(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "dpeaks" "', argument " "9"" of type '" "float""'"); } arg9 = (float)(val9); ecode10 = SWIG_AsVal_int(obj9, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "dpeaks" "', argument " "10"" of type '" "int""'"); } arg10 = (int)(val10); ecode11 = SWIG_AsVal_int(obj10, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "dpeaks" "', argument " "11"" of type '" "int""'"); } arg11 = (int)(val11); ecode12 = SWIG_AsVal_int(obj11, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "dpeaks" "', argument " "12"" of type '" "int""'"); } arg12 = (int)(val12); ecode13 = SWIG_AsVal_float(obj12, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "dpeaks" "', argument " "13"" of type '" "float""'"); } arg13 = (float)(val13); result = (int)dpeaks(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dcen3x3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; float temp2 ; int res2 = SWIG_TMPOBJ ; float temp3 ; int res3 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; int result; arg2 = &temp2; arg3 = &temp3; if (!PyArg_ParseTuple(args,(char *)"O:dcen3x3",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dcen3x3" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); result = (int)dcen3x3(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_float, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_float, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsigma(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; int arg4 ; int arg5 ; float *arg6 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:dsigma",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsigma" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsigma" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsigma" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsigma" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dsigma" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dsigma" "', argument " "6"" of type '" "float *""'"); } arg6 = (float *)(argp6); result = (int)dsigma(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dsigma_u8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int arg2 ; int arg3 ; int arg4 ; int arg5 ; float *arg6 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:dsigma_u8",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dsigma_u8" "', argument " "1"" of type '" "uint8_t *""'"); } arg1 = (uint8_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dsigma_u8" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dsigma_u8" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dsigma_u8" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dsigma_u8" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dsigma_u8" "', argument " "6"" of type '" "float *""'"); } arg6 = (float *)(argp6); result = (int)dsigma_u8(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dmedsmooth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; uint8_t *arg2 = (uint8_t *) 0 ; int arg3 ; int arg4 ; int arg5 ; float *arg6 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:dmedsmooth",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dmedsmooth" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "dmedsmooth" "', argument " "2"" of type '" "uint8_t const *""'"); } arg2 = (uint8_t *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dmedsmooth" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dmedsmooth" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dmedsmooth" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "dmedsmooth" "', argument " "6"" of type '" "float *""'"); } arg6 = (float *)(argp6); result = (int)dmedsmooth((float const *)arg1,(uint8_t const *)arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dallpeaks(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; float *arg5 = (float *) 0 ; float *arg6 = (float *) 0 ; int *arg7 = (int *) 0 ; float arg8 ; float arg9 ; float arg10 ; float arg11 ; int arg12 ; int arg13 ; float arg14 ; int arg15 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; float temp5 ; int res5 = SWIG_TMPOBJ ; float temp6 ; int res6 = SWIG_TMPOBJ ; void *argp7 = 0 ; int res7 = 0 ; float val8 ; int ecode8 = 0 ; float val9 ; int ecode9 = 0 ; float val10 ; int ecode10 = 0 ; float val11 ; int ecode11 = 0 ; int val12 ; int ecode12 = 0 ; int val13 ; int ecode13 = 0 ; float val14 ; int ecode14 = 0 ; int val15 ; int ecode15 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOO:dallpeaks",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dallpeaks" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dallpeaks" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dallpeaks" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dallpeaks" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res7 = SWIG_ConvertPtr(obj4, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "dallpeaks" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); ecode8 = SWIG_AsVal_float(obj5, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "dallpeaks" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); ecode9 = SWIG_AsVal_float(obj6, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "dallpeaks" "', argument " "9"" of type '" "float""'"); } arg9 = (float)(val9); ecode10 = SWIG_AsVal_float(obj7, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "dallpeaks" "', argument " "10"" of type '" "float""'"); } arg10 = (float)(val10); ecode11 = SWIG_AsVal_float(obj8, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "dallpeaks" "', argument " "11"" of type '" "float""'"); } arg11 = (float)(val11); ecode12 = SWIG_AsVal_int(obj9, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "dallpeaks" "', argument " "12"" of type '" "int""'"); } arg12 = (int)(val12); ecode13 = SWIG_AsVal_int(obj10, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "dallpeaks" "', argument " "13"" of type '" "int""'"); } arg13 = (int)(val13); ecode14 = SWIG_AsVal_float(obj11, &val14); if (!SWIG_IsOK(ecode14)) { SWIG_exception_fail(SWIG_ArgError(ecode14), "in method '" "dallpeaks" "', argument " "14"" of type '" "float""'"); } arg14 = (float)(val14); ecode15 = SWIG_AsVal_int(obj12, &val15); if (!SWIG_IsOK(ecode15)) { SWIG_exception_fail(SWIG_ArgError(ecode15), "in method '" "dallpeaks" "', argument " "15"" of type '" "int""'"); } arg15 = (int)(val15); result = (int)dallpeaks(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_float, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_float, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dallpeaks_u8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; uint8_t *arg1 = (uint8_t *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; float *arg5 = (float *) 0 ; float *arg6 = (float *) 0 ; int *arg7 = (int *) 0 ; float arg8 ; float arg9 ; float arg10 ; float arg11 ; int arg12 ; int arg13 ; float arg14 ; int arg15 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; float temp5 ; int res5 = SWIG_TMPOBJ ; float temp6 ; int res6 = SWIG_TMPOBJ ; void *argp7 = 0 ; int res7 = 0 ; float val8 ; int ecode8 = 0 ; float val9 ; int ecode9 = 0 ; float val10 ; int ecode10 = 0 ; float val11 ; int ecode11 = 0 ; int val12 ; int ecode12 = 0 ; int val13 ; int ecode13 = 0 ; float val14 ; int ecode14 = 0 ; int val15 ; int ecode15 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOO:dallpeaks_u8",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_uint8_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dallpeaks_u8" "', argument " "1"" of type '" "uint8_t *""'"); } arg1 = (uint8_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dallpeaks_u8" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dallpeaks_u8" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dallpeaks_u8" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res7 = SWIG_ConvertPtr(obj4, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "dallpeaks_u8" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); ecode8 = SWIG_AsVal_float(obj5, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "dallpeaks_u8" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); ecode9 = SWIG_AsVal_float(obj6, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "dallpeaks_u8" "', argument " "9"" of type '" "float""'"); } arg9 = (float)(val9); ecode10 = SWIG_AsVal_float(obj7, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "dallpeaks_u8" "', argument " "10"" of type '" "float""'"); } arg10 = (float)(val10); ecode11 = SWIG_AsVal_float(obj8, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "dallpeaks_u8" "', argument " "11"" of type '" "float""'"); } arg11 = (float)(val11); ecode12 = SWIG_AsVal_int(obj9, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "dallpeaks_u8" "', argument " "12"" of type '" "int""'"); } arg12 = (int)(val12); ecode13 = SWIG_AsVal_int(obj10, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "dallpeaks_u8" "', argument " "13"" of type '" "int""'"); } arg13 = (int)(val13); ecode14 = SWIG_AsVal_float(obj11, &val14); if (!SWIG_IsOK(ecode14)) { SWIG_exception_fail(SWIG_ArgError(ecode14), "in method '" "dallpeaks_u8" "', argument " "14"" of type '" "float""'"); } arg14 = (float)(val14); ecode15 = SWIG_AsVal_int(obj12, &val15); if (!SWIG_IsOK(ecode15)) { SWIG_exception_fail(SWIG_ArgError(ecode15), "in method '" "dallpeaks_u8" "', argument " "15"" of type '" "int""'"); } arg15 = (int)(val15); result = (int)dallpeaks_u8(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_float, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_float, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dallpeaks_i16(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int16_t *arg1 = (int16_t *) 0 ; int arg2 ; int arg3 ; int *arg4 = (int *) 0 ; float *arg5 = (float *) 0 ; float *arg6 = (float *) 0 ; int *arg7 = (int *) 0 ; float arg8 ; float arg9 ; float arg10 ; float arg11 ; int arg12 ; int arg13 ; float arg14 ; int arg15 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; float temp5 ; int res5 = SWIG_TMPOBJ ; float temp6 ; int res6 = SWIG_TMPOBJ ; void *argp7 = 0 ; int res7 = 0 ; float val8 ; int ecode8 = 0 ; float val9 ; int ecode9 = 0 ; float val10 ; int ecode10 = 0 ; float val11 ; int ecode11 = 0 ; int val12 ; int ecode12 = 0 ; int val13 ; int ecode13 = 0 ; float val14 ; int ecode14 = 0 ; int val15 ; int ecode15 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; PyObject * obj9 = 0 ; PyObject * obj10 = 0 ; PyObject * obj11 = 0 ; PyObject * obj12 = 0 ; int result; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOOOO:dallpeaks_i16",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10,&obj11,&obj12)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_int16_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dallpeaks_i16" "', argument " "1"" of type '" "int16_t *""'"); } arg1 = (int16_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dallpeaks_i16" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dallpeaks_i16" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "dallpeaks_i16" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); res7 = SWIG_ConvertPtr(obj4, &argp7,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "dallpeaks_i16" "', argument " "7"" of type '" "int *""'"); } arg7 = (int *)(argp7); ecode8 = SWIG_AsVal_float(obj5, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "dallpeaks_i16" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); ecode9 = SWIG_AsVal_float(obj6, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "dallpeaks_i16" "', argument " "9"" of type '" "float""'"); } arg9 = (float)(val9); ecode10 = SWIG_AsVal_float(obj7, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "dallpeaks_i16" "', argument " "10"" of type '" "float""'"); } arg10 = (float)(val10); ecode11 = SWIG_AsVal_float(obj8, &val11); if (!SWIG_IsOK(ecode11)) { SWIG_exception_fail(SWIG_ArgError(ecode11), "in method '" "dallpeaks_i16" "', argument " "11"" of type '" "float""'"); } arg11 = (float)(val11); ecode12 = SWIG_AsVal_int(obj9, &val12); if (!SWIG_IsOK(ecode12)) { SWIG_exception_fail(SWIG_ArgError(ecode12), "in method '" "dallpeaks_i16" "', argument " "12"" of type '" "int""'"); } arg12 = (int)(val12); ecode13 = SWIG_AsVal_int(obj10, &val13); if (!SWIG_IsOK(ecode13)) { SWIG_exception_fail(SWIG_ArgError(ecode13), "in method '" "dallpeaks_i16" "', argument " "13"" of type '" "int""'"); } arg13 = (int)(val13); ecode14 = SWIG_AsVal_float(obj11, &val14); if (!SWIG_IsOK(ecode14)) { SWIG_exception_fail(SWIG_ArgError(ecode14), "in method '" "dallpeaks_i16" "', argument " "14"" of type '" "float""'"); } arg14 = (float)(val14); ecode15 = SWIG_AsVal_int(obj12, &val15); if (!SWIG_IsOK(ecode15)) { SWIG_exception_fail(SWIG_ArgError(ecode15), "in method '" "dallpeaks_i16" "', argument " "15"" of type '" "int""'"); } arg15 = (int)(val15); result = (int)dallpeaks_i16(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_float, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_float, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dcen3x3b(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float arg1 ; float arg2 ; float arg3 ; float arg4 ; float arg5 ; float arg6 ; float arg7 ; float arg8 ; float arg9 ; float *arg10 = (float *) 0 ; float *arg11 = (float *) 0 ; float val1 ; int ecode1 = 0 ; float val2 ; int ecode2 = 0 ; float val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; float val6 ; int ecode6 = 0 ; float val7 ; int ecode7 = 0 ; float val8 ; int ecode8 = 0 ; float val9 ; int ecode9 = 0 ; float temp10 ; int res10 = SWIG_TMPOBJ ; float temp11 ; int res11 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; int result; arg10 = &temp10; arg11 = &temp11; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:dcen3x3b",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail; ecode1 = SWIG_AsVal_float(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "dcen3x3b" "', argument " "1"" of type '" "float""'"); } arg1 = (float)(val1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "dcen3x3b" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); ecode3 = SWIG_AsVal_float(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "dcen3x3b" "', argument " "3"" of type '" "float""'"); } arg3 = (float)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "dcen3x3b" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "dcen3x3b" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); ecode6 = SWIG_AsVal_float(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "dcen3x3b" "', argument " "6"" of type '" "float""'"); } arg6 = (float)(val6); ecode7 = SWIG_AsVal_float(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "dcen3x3b" "', argument " "7"" of type '" "float""'"); } arg7 = (float)(val7); ecode8 = SWIG_AsVal_float(obj7, &val8); if (!SWIG_IsOK(ecode8)) { SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "dcen3x3b" "', argument " "8"" of type '" "float""'"); } arg8 = (float)(val8); ecode9 = SWIG_AsVal_float(obj8, &val9); if (!SWIG_IsOK(ecode9)) { SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "dcen3x3b" "', argument " "9"" of type '" "float""'"); } arg9 = (float)(val9); result = (int)dcen3x3b(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res10)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg10))); } else { int new_flags = SWIG_IsNewObj(res10) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg10), SWIGTYPE_p_float, new_flags)); } if (SWIG_IsTmpObj(res11)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_float((*arg11))); } else { int new_flags = SWIG_IsNewObj(res11) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg11), SWIGTYPE_p_float, new_flags)); } return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, { (char *)"log_init", _wrap_log_init, METH_VARARGS, NULL}, { (char *)"log_get_level", _wrap_log_get_level, METH_VARARGS, NULL}, { (char *)"log_set_level", _wrap_log_set_level, METH_VARARGS, NULL}, { (char *)"coadd_t_img_set", _wrap_coadd_t_img_set, METH_VARARGS, NULL}, { (char *)"coadd_t_img_get", _wrap_coadd_t_img_get, METH_VARARGS, NULL}, { (char *)"coadd_t_weight_set", _wrap_coadd_t_weight_set, METH_VARARGS, NULL}, { (char *)"coadd_t_weight_get", _wrap_coadd_t_weight_get, METH_VARARGS, NULL}, { (char *)"coadd_t_W_set", _wrap_coadd_t_W_set, METH_VARARGS, NULL}, { (char *)"coadd_t_W_get", _wrap_coadd_t_W_get, METH_VARARGS, NULL}, { (char *)"coadd_t_H_set", _wrap_coadd_t_H_set, METH_VARARGS, NULL}, { (char *)"coadd_t_H_get", _wrap_coadd_t_H_get, METH_VARARGS, NULL}, { (char *)"coadd_t_wcs_set", _wrap_coadd_t_wcs_set, METH_VARARGS, NULL}, { (char *)"coadd_t_wcs_get", _wrap_coadd_t_wcs_get, METH_VARARGS, NULL}, { (char *)"coadd_t_resample_func_set", _wrap_coadd_t_resample_func_set, METH_VARARGS, NULL}, { (char *)"coadd_t_resample_func_get", _wrap_coadd_t_resample_func_get, METH_VARARGS, NULL}, { (char *)"coadd_t_resample_token_set", _wrap_coadd_t_resample_token_set, METH_VARARGS, NULL}, { (char *)"coadd_t_resample_token_get", _wrap_coadd_t_resample_token_get, METH_VARARGS, NULL}, { (char *)"new_coadd_t", _wrap_new_coadd_t, METH_VARARGS, NULL}, { (char *)"delete_coadd_t", _wrap_delete_coadd_t, METH_VARARGS, NULL}, { (char *)"coadd_t_swigregister", coadd_t_swigregister, METH_VARARGS, NULL}, { (char *)"coadd_new", _wrap_coadd_new, METH_VARARGS, NULL}, { (char *)"coadd_new_from_wcs", _wrap_coadd_new_from_wcs, METH_VARARGS, NULL}, { (char *)"coadd_set_lanczos", _wrap_coadd_set_lanczos, METH_VARARGS, NULL}, { (char *)"coadd_add_image", _wrap_coadd_add_image, METH_VARARGS, NULL}, { (char *)"coadd_divide_by_weight", _wrap_coadd_divide_by_weight, METH_VARARGS, NULL}, { (char *)"coadd_get_snapshot", _wrap_coadd_get_snapshot, METH_VARARGS, NULL}, { (char *)"coadd_free", _wrap_coadd_free, METH_VARARGS, NULL}, { (char *)"coadd_debug", _wrap_coadd_debug, METH_VARARGS, NULL}, { (char *)"coadd_create_weight_image_from_range", _wrap_coadd_create_weight_image_from_range, METH_VARARGS, NULL}, { (char *)"coadd_weight_image_mask_value", _wrap_coadd_weight_image_mask_value, METH_VARARGS, NULL}, { (char *)"lanczos_args_t_order_set", _wrap_lanczos_args_t_order_set, METH_VARARGS, NULL}, { (char *)"lanczos_args_t_order_get", _wrap_lanczos_args_t_order_get, METH_VARARGS, NULL}, { (char *)"lanczos_args_t_weighted_set", _wrap_lanczos_args_t_weighted_set, METH_VARARGS, NULL}, { (char *)"lanczos_args_t_weighted_get", _wrap_lanczos_args_t_weighted_get, METH_VARARGS, NULL}, { (char *)"new_lanczos_args_t", _wrap_new_lanczos_args_t, METH_VARARGS, NULL}, { (char *)"delete_lanczos_args_t", _wrap_delete_lanczos_args_t, METH_VARARGS, NULL}, { (char *)"lanczos_args_t_swigregister", lanczos_args_t_swigregister, METH_VARARGS, NULL}, { (char *)"lanczos", _wrap_lanczos, METH_VARARGS, NULL}, { (char *)"nearest_resample_f", _wrap_nearest_resample_f, METH_VARARGS, NULL}, { (char *)"lanczos_resample_f", _wrap_lanczos_resample_f, METH_VARARGS, NULL}, { (char *)"lanczos_resample_unw_sep_f", _wrap_lanczos_resample_unw_sep_f, METH_VARARGS, NULL}, { (char *)"nearest_resample_d", _wrap_nearest_resample_d, METH_VARARGS, NULL}, { (char *)"lanczos_resample_d", _wrap_lanczos_resample_d, METH_VARARGS, NULL}, { (char *)"TRUE_swigconstant", TRUE_swigconstant, METH_VARARGS, NULL}, { (char *)"FALSE_swigconstant", FALSE_swigconstant, METH_VARARGS, NULL}, { (char *)"fit_sip_coefficients", _wrap_fit_sip_coefficients, METH_VARARGS, NULL}, { (char *)"wcs_shift", _wrap_wcs_shift, METH_VARARGS, NULL}, { (char *)"fit_sip_wcs", _wrap_fit_sip_wcs, METH_VARARGS, NULL}, { (char *)"fit_sip_wcs_2", _wrap_fit_sip_wcs_2, METH_VARARGS, NULL}, { (char *)"fit_tan_wcs_move_tangent_point", _wrap_fit_tan_wcs_move_tangent_point, METH_VARARGS, NULL}, { (char *)"fit_tan_wcs_move_tangent_point_weighted", _wrap_fit_tan_wcs_move_tangent_point_weighted, METH_VARARGS, NULL}, { (char *)"fit_tan_wcs", _wrap_fit_tan_wcs, METH_VARARGS, NULL}, { (char *)"fit_tan_wcs_weighted", _wrap_fit_tan_wcs_weighted, METH_VARARGS, NULL}, { (char *)"print_array", _wrap_print_array, METH_VARARGS, NULL}, { (char *)"an_hist2d", _wrap_an_hist2d, METH_VARARGS, NULL}, { (char *)"flat_percentile_f", _wrap_flat_percentile_f, METH_VARARGS, NULL}, { (char *)"flat_median_f", _wrap_flat_median_f, METH_VARARGS, NULL}, { (char *)"median_smooth", _wrap_median_smooth, METH_VARARGS, NULL}, { (char *)"L_swigconstant", L_swigconstant, METH_VARARGS, NULL}, { (char *)"lanczos5_interpolate", _wrap_lanczos5_interpolate, METH_VARARGS, NULL}, { (char *)"lanczos3_interpolate", _wrap_lanczos3_interpolate, METH_VARARGS, NULL}, { (char *)"lanczos3_filter", _wrap_lanczos3_filter, METH_VARARGS, NULL}, { (char *)"lanczos3_filter_table", _wrap_lanczos3_filter_table, METH_VARARGS, NULL}, { (char *)"lanczos_shift_image_c", _wrap_lanczos_shift_image_c, METH_VARARGS, NULL}, { (char *)"DEFAULT_INDEX_JITTER_swigconstant", DEFAULT_INDEX_JITTER_swigconstant, METH_VARARGS, NULL}, { (char *)"index_t_codekd_set", _wrap_index_t_codekd_set, METH_VARARGS, NULL}, { (char *)"index_t_codekd_get", _wrap_index_t_codekd_get, METH_VARARGS, NULL}, { (char *)"index_t_quads_set", _wrap_index_t_quads_set, METH_VARARGS, NULL}, { (char *)"index_t_quads_get", _wrap_index_t_quads_get, METH_VARARGS, NULL}, { (char *)"index_t_starkd_set", _wrap_index_t_starkd_set, METH_VARARGS, NULL}, { (char *)"index_t_starkd_get", _wrap_index_t_starkd_get, METH_VARARGS, NULL}, { (char *)"index_t_fits_set", _wrap_index_t_fits_set, METH_VARARGS, NULL}, { (char *)"index_t_fits_get", _wrap_index_t_fits_get, METH_VARARGS, NULL}, { (char *)"index_t_codefn_set", _wrap_index_t_codefn_set, METH_VARARGS, NULL}, { (char *)"index_t_codefn_get", _wrap_index_t_codefn_get, METH_VARARGS, NULL}, { (char *)"index_t_quadfn_set", _wrap_index_t_quadfn_set, METH_VARARGS, NULL}, { (char *)"index_t_quadfn_get", _wrap_index_t_quadfn_get, METH_VARARGS, NULL}, { (char *)"index_t_starfn_set", _wrap_index_t_starfn_set, METH_VARARGS, NULL}, { (char *)"index_t_starfn_get", _wrap_index_t_starfn_get, METH_VARARGS, NULL}, { (char *)"index_t_indexname_set", _wrap_index_t_indexname_set, METH_VARARGS, NULL}, { (char *)"index_t_indexname_get", _wrap_index_t_indexname_get, METH_VARARGS, NULL}, { (char *)"index_t_indexid_set", _wrap_index_t_indexid_set, METH_VARARGS, NULL}, { (char *)"index_t_indexid_get", _wrap_index_t_indexid_get, METH_VARARGS, NULL}, { (char *)"index_t_healpix_set", _wrap_index_t_healpix_set, METH_VARARGS, NULL}, { (char *)"index_t_healpix_get", _wrap_index_t_healpix_get, METH_VARARGS, NULL}, { (char *)"index_t_hpnside_set", _wrap_index_t_hpnside_set, METH_VARARGS, NULL}, { (char *)"index_t_hpnside_get", _wrap_index_t_hpnside_get, METH_VARARGS, NULL}, { (char *)"index_t_index_jitter_set", _wrap_index_t_index_jitter_set, METH_VARARGS, NULL}, { (char *)"index_t_index_jitter_get", _wrap_index_t_index_jitter_get, METH_VARARGS, NULL}, { (char *)"index_t_cutnside_set", _wrap_index_t_cutnside_set, METH_VARARGS, NULL}, { (char *)"index_t_cutnside_get", _wrap_index_t_cutnside_get, METH_VARARGS, NULL}, { (char *)"index_t_cutnsweep_set", _wrap_index_t_cutnsweep_set, METH_VARARGS, NULL}, { (char *)"index_t_cutnsweep_get", _wrap_index_t_cutnsweep_get, METH_VARARGS, NULL}, { (char *)"index_t_cutdedup_set", _wrap_index_t_cutdedup_set, METH_VARARGS, NULL}, { (char *)"index_t_cutdedup_get", _wrap_index_t_cutdedup_get, METH_VARARGS, NULL}, { (char *)"index_t_cutband_set", _wrap_index_t_cutband_set, METH_VARARGS, NULL}, { (char *)"index_t_cutband_get", _wrap_index_t_cutband_get, METH_VARARGS, NULL}, { (char *)"index_t_cutmargin_set", _wrap_index_t_cutmargin_set, METH_VARARGS, NULL}, { (char *)"index_t_cutmargin_get", _wrap_index_t_cutmargin_get, METH_VARARGS, NULL}, { (char *)"index_t_circle_set", _wrap_index_t_circle_set, METH_VARARGS, NULL}, { (char *)"index_t_circle_get", _wrap_index_t_circle_get, METH_VARARGS, NULL}, { (char *)"index_t_cx_less_than_dx_set", _wrap_index_t_cx_less_than_dx_set, METH_VARARGS, NULL}, { (char *)"index_t_cx_less_than_dx_get", _wrap_index_t_cx_less_than_dx_get, METH_VARARGS, NULL}, { (char *)"index_t_meanx_less_than_half_set", _wrap_index_t_meanx_less_than_half_set, METH_VARARGS, NULL}, { (char *)"index_t_meanx_less_than_half_get", _wrap_index_t_meanx_less_than_half_get, METH_VARARGS, NULL}, { (char *)"index_t_index_scale_upper_set", _wrap_index_t_index_scale_upper_set, METH_VARARGS, NULL}, { (char *)"index_t_index_scale_upper_get", _wrap_index_t_index_scale_upper_get, METH_VARARGS, NULL}, { (char *)"index_t_index_scale_lower_set", _wrap_index_t_index_scale_lower_set, METH_VARARGS, NULL}, { (char *)"index_t_index_scale_lower_get", _wrap_index_t_index_scale_lower_get, METH_VARARGS, NULL}, { (char *)"index_t_dimquads_set", _wrap_index_t_dimquads_set, METH_VARARGS, NULL}, { (char *)"index_t_dimquads_get", _wrap_index_t_dimquads_get, METH_VARARGS, NULL}, { (char *)"index_t_nstars_set", _wrap_index_t_nstars_set, METH_VARARGS, NULL}, { (char *)"index_t_nstars_get", _wrap_index_t_nstars_get, METH_VARARGS, NULL}, { (char *)"index_t_nquads_set", _wrap_index_t_nquads_set, METH_VARARGS, NULL}, { (char *)"index_t_nquads_get", _wrap_index_t_nquads_get, METH_VARARGS, NULL}, { (char *)"new_index_t", _wrap_new_index_t, METH_VARARGS, NULL}, { (char *)"delete_index_t", _wrap_delete_index_t, METH_VARARGS, NULL}, { (char *)"index_t_swigregister", index_t_swigregister, METH_VARARGS, NULL}, { (char *)"index_dimquads", _wrap_index_dimquads, METH_VARARGS, NULL}, { (char *)"index_overlaps_scale_range", _wrap_index_overlaps_scale_range, METH_VARARGS, NULL}, { (char *)"index_is_within_range", _wrap_index_is_within_range, METH_VARARGS, NULL}, { (char *)"index_get_meta", _wrap_index_get_meta, METH_VARARGS, NULL}, { (char *)"index_is_file_index", _wrap_index_is_file_index, METH_VARARGS, NULL}, { (char *)"index_get_quad_filename", _wrap_index_get_quad_filename, METH_VARARGS, NULL}, { (char *)"index_get_qidx_filename", _wrap_index_get_qidx_filename, METH_VARARGS, NULL}, { (char *)"INDEX_ONLY_LOAD_METADATA_swigconstant", INDEX_ONLY_LOAD_METADATA_swigconstant, METH_VARARGS, NULL}, { (char *)"index_get_quad_dim", _wrap_index_get_quad_dim, METH_VARARGS, NULL}, { (char *)"index_get_code_dim", _wrap_index_get_code_dim, METH_VARARGS, NULL}, { (char *)"index_nquads", _wrap_index_nquads, METH_VARARGS, NULL}, { (char *)"index_nstars", _wrap_index_nstars, METH_VARARGS, NULL}, { (char *)"index_build_from", _wrap_index_build_from, METH_VARARGS, NULL}, { (char *)"index_load", _wrap_index_load, METH_VARARGS, NULL}, { (char *)"index_unload", _wrap_index_unload, METH_VARARGS, NULL}, { (char *)"index_reload", _wrap_index_reload, METH_VARARGS, NULL}, { (char *)"index_close_fds", _wrap_index_close_fds, METH_VARARGS, NULL}, { (char *)"index_close", _wrap_index_close, METH_VARARGS, NULL}, { (char *)"index_free", _wrap_index_free, METH_VARARGS, NULL}, { (char *)"index_get_missing_cut_params", _wrap_index_get_missing_cut_params, METH_VARARGS, NULL}, { (char *)"quadfile_t_numquads_set", _wrap_quadfile_t_numquads_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_numquads_get", _wrap_quadfile_t_numquads_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_numstars_set", _wrap_quadfile_t_numstars_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_numstars_get", _wrap_quadfile_t_numstars_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_dimquads_set", _wrap_quadfile_t_dimquads_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_dimquads_get", _wrap_quadfile_t_dimquads_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_index_scale_upper_set", _wrap_quadfile_t_index_scale_upper_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_index_scale_upper_get", _wrap_quadfile_t_index_scale_upper_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_index_scale_lower_set", _wrap_quadfile_t_index_scale_lower_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_index_scale_lower_get", _wrap_quadfile_t_index_scale_lower_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_indexid_set", _wrap_quadfile_t_indexid_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_indexid_get", _wrap_quadfile_t_indexid_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_healpix_set", _wrap_quadfile_t_healpix_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_healpix_get", _wrap_quadfile_t_healpix_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_hpnside_set", _wrap_quadfile_t_hpnside_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_hpnside_get", _wrap_quadfile_t_hpnside_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_fb_set", _wrap_quadfile_t_fb_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_fb_get", _wrap_quadfile_t_fb_get, METH_VARARGS, NULL}, { (char *)"quadfile_t_quadarray_set", _wrap_quadfile_t_quadarray_set, METH_VARARGS, NULL}, { (char *)"quadfile_t_quadarray_get", _wrap_quadfile_t_quadarray_get, METH_VARARGS, NULL}, { (char *)"new_quadfile_t", _wrap_new_quadfile_t, METH_VARARGS, NULL}, { (char *)"delete_quadfile_t", _wrap_delete_quadfile_t, METH_VARARGS, NULL}, { (char *)"quadfile_t_swigregister", quadfile_t_swigregister, METH_VARARGS, NULL}, { (char *)"quadfile_open", _wrap_quadfile_open, METH_VARARGS, NULL}, { (char *)"quadfile_open_fits", _wrap_quadfile_open_fits, METH_VARARGS, NULL}, { (char *)"quadfile_get_filename", _wrap_quadfile_get_filename, METH_VARARGS, NULL}, { (char *)"quadfile_open_for_writing", _wrap_quadfile_open_for_writing, METH_VARARGS, NULL}, { (char *)"quadfile_open_in_memory", _wrap_quadfile_open_in_memory, METH_VARARGS, NULL}, { (char *)"quadfile_switch_to_reading", _wrap_quadfile_switch_to_reading, METH_VARARGS, NULL}, { (char *)"quadfile_close", _wrap_quadfile_close, METH_VARARGS, NULL}, { (char *)"quadfile_check", _wrap_quadfile_check, METH_VARARGS, NULL}, { (char *)"quadfile_get_stars", _wrap_quadfile_get_stars, METH_VARARGS, NULL}, { (char *)"quadfile_write_quad", _wrap_quadfile_write_quad, METH_VARARGS, NULL}, { (char *)"quadfile_dimquads", _wrap_quadfile_dimquads, METH_VARARGS, NULL}, { (char *)"quadfile_nquads", _wrap_quadfile_nquads, METH_VARARGS, NULL}, { (char *)"quadfile_fix_header", _wrap_quadfile_fix_header, METH_VARARGS, NULL}, { (char *)"quadfile_write_header", _wrap_quadfile_write_header, METH_VARARGS, NULL}, { (char *)"quadfile_get_index_scale_upper_arcsec", _wrap_quadfile_get_index_scale_upper_arcsec, METH_VARARGS, NULL}, { (char *)"quadfile_get_index_scale_lower_arcsec", _wrap_quadfile_get_index_scale_lower_arcsec, METH_VARARGS, NULL}, { (char *)"quadfile_get_header", _wrap_quadfile_get_header, METH_VARARGS, NULL}, { (char *)"quadfile_write_header_to", _wrap_quadfile_write_header_to, METH_VARARGS, NULL}, { (char *)"quadfile_write_all_quads_to", _wrap_quadfile_write_all_quads_to, METH_VARARGS, NULL}, { (char *)"AN_FILETYPE_CODETREE_swigconstant", AN_FILETYPE_CODETREE_swigconstant, METH_VARARGS, NULL}, { (char *)"CODETREE_NAME_swigconstant", CODETREE_NAME_swigconstant, METH_VARARGS, NULL}, { (char *)"codetree_t_tree_set", _wrap_codetree_t_tree_set, METH_VARARGS, NULL}, { (char *)"codetree_t_tree_get", _wrap_codetree_t_tree_get, METH_VARARGS, NULL}, { (char *)"codetree_t_header_set", _wrap_codetree_t_header_set, METH_VARARGS, NULL}, { (char *)"codetree_t_header_get", _wrap_codetree_t_header_get, METH_VARARGS, NULL}, { (char *)"codetree_t_inverse_perm_set", _wrap_codetree_t_inverse_perm_set, METH_VARARGS, NULL}, { (char *)"codetree_t_inverse_perm_get", _wrap_codetree_t_inverse_perm_get, METH_VARARGS, NULL}, { (char *)"new_codetree_t", _wrap_new_codetree_t, METH_VARARGS, NULL}, { (char *)"delete_codetree_t", _wrap_delete_codetree_t, METH_VARARGS, NULL}, { (char *)"codetree_t_swigregister", codetree_t_swigregister, METH_VARARGS, NULL}, { (char *)"codetree_open", _wrap_codetree_open, METH_VARARGS, NULL}, { (char *)"codetree_open_fits", _wrap_codetree_open_fits, METH_VARARGS, NULL}, { (char *)"codetree_get", _wrap_codetree_get, METH_VARARGS, NULL}, { (char *)"codetree_N", _wrap_codetree_N, METH_VARARGS, NULL}, { (char *)"codetree_nodes", _wrap_codetree_nodes, METH_VARARGS, NULL}, { (char *)"codetree_D", _wrap_codetree_D, METH_VARARGS, NULL}, { (char *)"codetree_get_permuted", _wrap_codetree_get_permuted, METH_VARARGS, NULL}, { (char *)"codetree_header", _wrap_codetree_header, METH_VARARGS, NULL}, { (char *)"codetree_close", _wrap_codetree_close, METH_VARARGS, NULL}, { (char *)"codetree_new", _wrap_codetree_new, METH_VARARGS, NULL}, { (char *)"codetree_append_to", _wrap_codetree_append_to, METH_VARARGS, NULL}, { (char *)"codetree_write_to_file", _wrap_codetree_write_to_file, METH_VARARGS, NULL}, { (char *)"codetree_write_to_file_flipped", _wrap_codetree_write_to_file_flipped, METH_VARARGS, NULL}, { (char *)"AN_FILETYPE_STARTREE_swigconstant", AN_FILETYPE_STARTREE_swigconstant, METH_VARARGS, NULL}, { (char *)"AN_FILETYPE_TAGALONG_swigconstant", AN_FILETYPE_TAGALONG_swigconstant, METH_VARARGS, NULL}, { (char *)"STARTREE_NAME_swigconstant", STARTREE_NAME_swigconstant, METH_VARARGS, NULL}, { (char *)"startree_t_tree_set", _wrap_startree_t_tree_set, METH_VARARGS, NULL}, { (char *)"startree_t_tree_get", _wrap_startree_t_tree_get, METH_VARARGS, NULL}, { (char *)"startree_t_header_set", _wrap_startree_t_header_set, METH_VARARGS, NULL}, { (char *)"startree_t_header_get", _wrap_startree_t_header_get, METH_VARARGS, NULL}, { (char *)"startree_t_inverse_perm_set", _wrap_startree_t_inverse_perm_set, METH_VARARGS, NULL}, { (char *)"startree_t_inverse_perm_get", _wrap_startree_t_inverse_perm_get, METH_VARARGS, NULL}, { (char *)"startree_t_sweep_set", _wrap_startree_t_sweep_set, METH_VARARGS, NULL}, { (char *)"startree_t_sweep_get", _wrap_startree_t_sweep_get, METH_VARARGS, NULL}, { (char *)"startree_t_writing_set", _wrap_startree_t_writing_set, METH_VARARGS, NULL}, { (char *)"startree_t_writing_get", _wrap_startree_t_writing_get, METH_VARARGS, NULL}, { (char *)"startree_t_tagalong_set", _wrap_startree_t_tagalong_set, METH_VARARGS, NULL}, { (char *)"startree_t_tagalong_get", _wrap_startree_t_tagalong_get, METH_VARARGS, NULL}, { (char *)"new_startree_t", _wrap_new_startree_t, METH_VARARGS, NULL}, { (char *)"delete_startree_t", _wrap_delete_startree_t, METH_VARARGS, NULL}, { (char *)"startree_t_swigregister", startree_t_swigregister, METH_VARARGS, NULL}, { (char *)"startree_open", _wrap_startree_open, METH_VARARGS, NULL}, { (char *)"startree_open_fits", _wrap_startree_open_fits, METH_VARARGS, NULL}, { (char *)"startree_search_for", _wrap_startree_search_for, METH_VARARGS, NULL}, { (char *)"startree_search_for_radec", _wrap_startree_search_for_radec, METH_VARARGS, NULL}, { (char *)"startree_search", _wrap_startree_search, METH_VARARGS, NULL}, { (char *)"startree_get_data_column", _wrap_startree_get_data_column, METH_VARARGS, NULL}, { (char *)"startree_get_data_column_int64", _wrap_startree_get_data_column_int64, METH_VARARGS, NULL}, { (char *)"startree_get_data_column_array", _wrap_startree_get_data_column_array, METH_VARARGS, NULL}, { (char *)"startree_free_data_column", _wrap_startree_free_data_column, METH_VARARGS, NULL}, { (char *)"startree_has_tagalong", _wrap_startree_has_tagalong, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong", _wrap_startree_get_tagalong, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong_column_names", _wrap_startree_get_tagalong_column_names, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong_N_columns", _wrap_startree_get_tagalong_N_columns, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong_column_name", _wrap_startree_get_tagalong_column_name, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong_column_fits_type", _wrap_startree_get_tagalong_column_fits_type, METH_VARARGS, NULL}, { (char *)"startree_get_tagalong_column_array_size", _wrap_startree_get_tagalong_column_array_size, METH_VARARGS, NULL}, { (char *)"startree_get_cut_nside", _wrap_startree_get_cut_nside, METH_VARARGS, NULL}, { (char *)"startree_get_cut_nsweeps", _wrap_startree_get_cut_nsweeps, METH_VARARGS, NULL}, { (char *)"startree_get_cut_dedup", _wrap_startree_get_cut_dedup, METH_VARARGS, NULL}, { (char *)"startree_get_cut_band", _wrap_startree_get_cut_band, METH_VARARGS, NULL}, { (char *)"startree_get_cut_margin", _wrap_startree_get_cut_margin, METH_VARARGS, NULL}, { (char *)"startree_get_jitter", _wrap_startree_get_jitter, METH_VARARGS, NULL}, { (char *)"startree_set_jitter", _wrap_startree_set_jitter, METH_VARARGS, NULL}, { (char *)"startree_get_sweep", _wrap_startree_get_sweep, METH_VARARGS, NULL}, { (char *)"startree_N", _wrap_startree_N, METH_VARARGS, NULL}, { (char *)"startree_nodes", _wrap_startree_nodes, METH_VARARGS, NULL}, { (char *)"startree_D", _wrap_startree_D, METH_VARARGS, NULL}, { (char *)"startree_header", _wrap_startree_header, METH_VARARGS, NULL}, { (char *)"startree_get", _wrap_startree_get, METH_VARARGS, NULL}, { (char *)"startree_get_radec", _wrap_startree_get_radec, METH_VARARGS, NULL}, { (char *)"startree_close", _wrap_startree_close, METH_VARARGS, NULL}, { (char *)"startree_compute_inverse_perm", _wrap_startree_compute_inverse_perm, METH_VARARGS, NULL}, { (char *)"startree_check_inverse_perm", _wrap_startree_check_inverse_perm, METH_VARARGS, NULL}, { (char *)"startree_new", _wrap_startree_new, METH_VARARGS, NULL}, { (char *)"startree_write_to_file", _wrap_startree_write_to_file, METH_VARARGS, NULL}, { (char *)"startree_write_to_file_flipped", _wrap_startree_write_to_file_flipped, METH_VARARGS, NULL}, { (char *)"startree_append_to", _wrap_startree_append_to, METH_VARARGS, NULL}, { (char *)"code_alloc", _wrap_code_alloc, METH_VARARGS, NULL}, { (char *)"code_free", _wrap_code_free, METH_VARARGS, NULL}, { (char *)"code_get", _wrap_code_get, METH_VARARGS, NULL}, { (char *)"codekd_addr", _wrap_codekd_addr, METH_VARARGS, NULL}, { (char *)"starkd_addr", _wrap_starkd_addr, METH_VARARGS, NULL}, { (char *)"quadfile_addr", _wrap_quadfile_addr, METH_VARARGS, NULL}, { (char *)"HP_MAX_INT_NSIDE_swigconstant", HP_MAX_INT_NSIDE_swigconstant, METH_VARARGS, NULL}, { (char *)"healpix_xy_to_ring", _wrap_healpix_xy_to_ring, METH_VARARGS, NULL}, { (char *)"healpix_ring_to_xy", _wrap_healpix_ring_to_xy, METH_VARARGS, NULL}, { (char *)"healpix_xy_to_nested", _wrap_healpix_xy_to_nested, METH_VARARGS, NULL}, { (char *)"healpix_nested_to_xy", _wrap_healpix_nested_to_xy, METH_VARARGS, NULL}, { (char *)"healpix_decompose_ring", _wrap_healpix_decompose_ring, METH_VARARGS, NULL}, { (char *)"healpix_compose_ring", _wrap_healpix_compose_ring, METH_VARARGS, NULL}, { (char *)"healpix_decompose_xy", _wrap_healpix_decompose_xy, METH_VARARGS, NULL}, { (char *)"healpix_decompose_xyl", _wrap_healpix_decompose_xyl, METH_VARARGS, NULL}, { (char *)"healpix_compose_xy", _wrap_healpix_compose_xy, METH_VARARGS, NULL}, { (char *)"healpix_compose_xyl", _wrap_healpix_compose_xyl, METH_VARARGS, NULL}, { (char *)"healpix_convert_xy_nside", _wrap_healpix_convert_xy_nside, METH_VARARGS, NULL}, { (char *)"healpix_convert_nside", _wrap_healpix_convert_nside, METH_VARARGS, NULL}, { (char *)"radectohealpix", _wrap_radectohealpix, METH_VARARGS, NULL}, { (char *)"radectohealpixf", _wrap_radectohealpixf, METH_VARARGS, NULL}, { (char *)"radectohealpixl", _wrap_radectohealpixl, METH_VARARGS, NULL}, { (char *)"radectohealpixlf", _wrap_radectohealpixlf, METH_VARARGS, NULL}, { (char *)"radecdegtohealpix", _wrap_radecdegtohealpix, METH_VARARGS, NULL}, { (char *)"radecdegtohealpixf", _wrap_radecdegtohealpixf, METH_VARARGS, NULL}, { (char *)"radecdegtohealpixl", _wrap_radecdegtohealpixl, METH_VARARGS, NULL}, { (char *)"radecdegtohealpixlf", _wrap_radecdegtohealpixlf, METH_VARARGS, NULL}, { (char *)"xyztohealpix", _wrap_xyztohealpix, METH_VARARGS, NULL}, { (char *)"xyztohealpixl", _wrap_xyztohealpixl, METH_VARARGS, NULL}, { (char *)"xyztohealpixf", _wrap_xyztohealpixf, METH_VARARGS, NULL}, { (char *)"xyztohealpixlf", _wrap_xyztohealpixlf, METH_VARARGS, NULL}, { (char *)"xyzarrtohealpix", _wrap_xyzarrtohealpix, METH_VARARGS, NULL}, { (char *)"xyzarrtohealpixl", _wrap_xyzarrtohealpixl, METH_VARARGS, NULL}, { (char *)"xyzarrtohealpixf", _wrap_xyzarrtohealpixf, METH_VARARGS, NULL}, { (char *)"healpix_to_xyz", _wrap_healpix_to_xyz, METH_VARARGS, NULL}, { (char *)"healpix_to_xyzarr", _wrap_healpix_to_xyzarr, METH_VARARGS, NULL}, { (char *)"healpix_to_radec", _wrap_healpix_to_radec, METH_VARARGS, NULL}, { (char *)"healpix_to_radecdeg", _wrap_healpix_to_radecdeg, METH_VARARGS, NULL}, { (char *)"healpixl_to_radecdeg", _wrap_healpixl_to_radecdeg, METH_VARARGS, NULL}, { (char *)"healpix_to_radecarr", _wrap_healpix_to_radecarr, METH_VARARGS, NULL}, { (char *)"healpix_to_radecdegarr", _wrap_healpix_to_radecdegarr, METH_VARARGS, NULL}, { (char *)"healpix_side_length_arcmin", _wrap_healpix_side_length_arcmin, METH_VARARGS, NULL}, { (char *)"healpix_nside_for_side_length_arcmin", _wrap_healpix_nside_for_side_length_arcmin, METH_VARARGS, NULL}, { (char *)"healpix_get_neighbours", _wrap_healpix_get_neighbours, METH_VARARGS, NULL}, { (char *)"healpix_get_neighboursl", _wrap_healpix_get_neighboursl, METH_VARARGS, NULL}, { (char *)"healpix_get_neighbours_within_range", _wrap_healpix_get_neighbours_within_range, METH_VARARGS, NULL}, { (char *)"healpix_get_neighbours_within_range_radec", _wrap_healpix_get_neighbours_within_range_radec, METH_VARARGS, NULL}, { (char *)"healpix_distance_to_radec", _wrap_healpix_distance_to_radec, METH_VARARGS, NULL}, { (char *)"healpix_distance_to_xyz", _wrap_healpix_distance_to_xyz, METH_VARARGS, NULL}, { (char *)"healpix_within_range_of_radec", _wrap_healpix_within_range_of_radec, METH_VARARGS, NULL}, { (char *)"healpix_within_range_of_xyz", _wrap_healpix_within_range_of_xyz, METH_VARARGS, NULL}, { (char *)"healpix_radec_bounds", _wrap_healpix_radec_bounds, METH_VARARGS, NULL}, { (char *)"healpix_rangesearch_xyz", _wrap_healpix_rangesearch_xyz, METH_VARARGS, NULL}, { (char *)"healpix_rangesearch_xyz_approx", _wrap_healpix_rangesearch_xyz_approx, METH_VARARGS, NULL}, { (char *)"healpix_rangesearch_radec_approx", _wrap_healpix_rangesearch_radec_approx, METH_VARARGS, NULL}, { (char *)"healpix_rangesearch_radec", _wrap_healpix_rangesearch_radec, METH_VARARGS, NULL}, { (char *)"healpix_region_search", _wrap_healpix_region_search, METH_VARARGS, NULL}, { (char *)"anwcs_wcslib_to_string", _wrap_anwcs_wcslib_to_string, METH_VARARGS, NULL}, { (char *)"ANWCS_TYPE_WCSLIB_swigconstant", ANWCS_TYPE_WCSLIB_swigconstant, METH_VARARGS, NULL}, { (char *)"ANWCS_TYPE_SIP_swigconstant", ANWCS_TYPE_SIP_swigconstant, METH_VARARGS, NULL}, { (char *)"ANWCS_TYPE_WCSTOOLS_swigconstant", ANWCS_TYPE_WCSTOOLS_swigconstant, METH_VARARGS, NULL}, { (char *)"anwcs_t_type_set", _wrap_anwcs_t_type_set, METH_VARARGS, NULL}, { (char *)"anwcs_t_type_get", _wrap_anwcs_t_type_get, METH_VARARGS, NULL}, { (char *)"anwcs_t_data_set", _wrap_anwcs_t_data_set, METH_VARARGS, NULL}, { (char *)"anwcs_t_data_get", _wrap_anwcs_t_data_get, METH_VARARGS, NULL}, { (char *)"new_anwcs_t", _wrap_new_anwcs_t, METH_VARARGS, NULL}, { (char *)"delete_anwcs_t", _wrap_delete_anwcs_t, METH_VARARGS, NULL}, { (char *)"anwcs_t_pixel_scale", _wrap_anwcs_t_pixel_scale, METH_VARARGS, NULL}, { (char *)"anwcs_t_get_center", _wrap_anwcs_t_get_center, METH_VARARGS, NULL}, { (char *)"anwcs_t_get_radius", _wrap_anwcs_t_get_radius, METH_VARARGS, NULL}, { (char *)"anwcs_t_is_inside", _wrap_anwcs_t_is_inside, METH_VARARGS, NULL}, { (char *)"anwcs_t_get_width", _wrap_anwcs_t_get_width, METH_VARARGS, NULL}, { (char *)"anwcs_t_get_height", _wrap_anwcs_t_get_height, METH_VARARGS, NULL}, { (char *)"anwcs_t_set_width", _wrap_anwcs_t_set_width, METH_VARARGS, NULL}, { (char *)"anwcs_t_set_height", _wrap_anwcs_t_set_height, METH_VARARGS, NULL}, { (char *)"anwcs_t_pixelxy2radec", _wrap_anwcs_t_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"anwcs_t_radec2pixelxy", _wrap_anwcs_t_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"anwcs_t_write_to", _wrap_anwcs_t_write_to, METH_VARARGS, NULL}, { (char *)"anwcs_t_swigregister", anwcs_t_swigregister, METH_VARARGS, NULL}, { (char *)"anwcs_walk_outline", _wrap_anwcs_walk_outline, METH_VARARGS, NULL}, { (char *)"anwcs_wcslib_from_string", _wrap_anwcs_wcslib_from_string, METH_VARARGS, NULL}, { (char *)"anwcs_open", _wrap_anwcs_open, METH_VARARGS, NULL}, { (char *)"anwcs_open_wcslib", _wrap_anwcs_open_wcslib, METH_VARARGS, NULL}, { (char *)"anwcs_open_wcstools", _wrap_anwcs_open_wcstools, METH_VARARGS, NULL}, { (char *)"anwcs_wcstools_from_string", _wrap_anwcs_wcstools_from_string, METH_VARARGS, NULL}, { (char *)"anwcs_open_sip", _wrap_anwcs_open_sip, METH_VARARGS, NULL}, { (char *)"anwcs_open_tan", _wrap_anwcs_open_tan, METH_VARARGS, NULL}, { (char *)"anwcs_new_sip", _wrap_anwcs_new_sip, METH_VARARGS, NULL}, { (char *)"anwcs_new_tan", _wrap_anwcs_new_tan, METH_VARARGS, NULL}, { (char *)"anwcs_create_box", _wrap_anwcs_create_box, METH_VARARGS, NULL}, { (char *)"anwcs_create_box_upsidedown", _wrap_anwcs_create_box_upsidedown, METH_VARARGS, NULL}, { (char *)"anwcs_create_mercator", _wrap_anwcs_create_mercator, METH_VARARGS, NULL}, { (char *)"anwcs_create_mercator_2", _wrap_anwcs_create_mercator_2, METH_VARARGS, NULL}, { (char *)"anwcs_create_hammer_aitoff", _wrap_anwcs_create_hammer_aitoff, METH_VARARGS, NULL}, { (char *)"anwcs_create_allsky_hammer_aitoff", _wrap_anwcs_create_allsky_hammer_aitoff, METH_VARARGS, NULL}, { (char *)"anwcs_create_allsky_hammer_aitoff2", _wrap_anwcs_create_allsky_hammer_aitoff2, METH_VARARGS, NULL}, { (char *)"anwcs_write", _wrap_anwcs_write, METH_VARARGS, NULL}, { (char *)"anwcs_write_to", _wrap_anwcs_write_to, METH_VARARGS, NULL}, { (char *)"anwcs_add_to_header", _wrap_anwcs_add_to_header, METH_VARARGS, NULL}, { (char *)"anwcs_radec2pixelxy", _wrap_anwcs_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"anwcs_pixelxy2radec", _wrap_anwcs_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"anwcs_pixelxy2xyz", _wrap_anwcs_pixelxy2xyz, METH_VARARGS, NULL}, { (char *)"anwcs_xyz2pixelxy", _wrap_anwcs_xyz2pixelxy, METH_VARARGS, NULL}, { (char *)"anwcs_radec_is_inside_image", _wrap_anwcs_radec_is_inside_image, METH_VARARGS, NULL}, { (char *)"anwcs_get_cd_matrix", _wrap_anwcs_get_cd_matrix, METH_VARARGS, NULL}, { (char *)"anwcs_get_radec_bounds", _wrap_anwcs_get_radec_bounds, METH_VARARGS, NULL}, { (char *)"anwcs_print", _wrap_anwcs_print, METH_VARARGS, NULL}, { (char *)"anwcs_print_stdout", _wrap_anwcs_print_stdout, METH_VARARGS, NULL}, { (char *)"anwcs_get_radec_center_and_radius", _wrap_anwcs_get_radec_center_and_radius, METH_VARARGS, NULL}, { (char *)"anwcs_walk_image_boundary", _wrap_anwcs_walk_image_boundary, METH_VARARGS, NULL}, { (char *)"anwcs_find_discontinuity", _wrap_anwcs_find_discontinuity, METH_VARARGS, NULL}, { (char *)"anwcs_is_discontinuous", _wrap_anwcs_is_discontinuous, METH_VARARGS, NULL}, { (char *)"anwcs_walk_discontinuity", _wrap_anwcs_walk_discontinuity, METH_VARARGS, NULL}, { (char *)"anwcs_overlaps", _wrap_anwcs_overlaps, METH_VARARGS, NULL}, { (char *)"anwcs_imagew", _wrap_anwcs_imagew, METH_VARARGS, NULL}, { (char *)"anwcs_imageh", _wrap_anwcs_imageh, METH_VARARGS, NULL}, { (char *)"anwcs_set_size", _wrap_anwcs_set_size, METH_VARARGS, NULL}, { (char *)"anwcs_scale_wcs", _wrap_anwcs_scale_wcs, METH_VARARGS, NULL}, { (char *)"anwcs_rotate_wcs", _wrap_anwcs_rotate_wcs, METH_VARARGS, NULL}, { (char *)"anwcs_pixel_scale", _wrap_anwcs_pixel_scale, METH_VARARGS, NULL}, { (char *)"anwcs_free", _wrap_anwcs_free, METH_VARARGS, NULL}, { (char *)"anwcs_get_sip", _wrap_anwcs_get_sip, METH_VARARGS, NULL}, { (char *)"DIM_STARS_swigconstant", DIM_STARS_swigconstant, METH_VARARGS, NULL}, { (char *)"DIM_XY_swigconstant", DIM_XY_swigconstant, METH_VARARGS, NULL}, { (char *)"DQMAX_swigconstant", DQMAX_swigconstant, METH_VARARGS, NULL}, { (char *)"DCMAX_swigconstant", DCMAX_swigconstant, METH_VARARGS, NULL}, { (char *)"dimquad2dimcode", _wrap_dimquad2dimcode, METH_VARARGS, NULL}, { (char *)"ONE_OVER_SIXTY_swigconstant", ONE_OVER_SIXTY_swigconstant, METH_VARARGS, NULL}, { (char *)"RAD_PER_DEG_swigconstant", RAD_PER_DEG_swigconstant, METH_VARARGS, NULL}, { (char *)"RAD_PER_ARCMIN_swigconstant", RAD_PER_ARCMIN_swigconstant, METH_VARARGS, NULL}, { (char *)"RAD_PER_ARCSEC_swigconstant", RAD_PER_ARCSEC_swigconstant, METH_VARARGS, NULL}, { (char *)"DEG_PER_RAD_swigconstant", DEG_PER_RAD_swigconstant, METH_VARARGS, NULL}, { (char *)"DEG_PER_ARCMIN_swigconstant", DEG_PER_ARCMIN_swigconstant, METH_VARARGS, NULL}, { (char *)"DEG_PER_ARCSEC_swigconstant", DEG_PER_ARCSEC_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCMIN_PER_RAD_swigconstant", ARCMIN_PER_RAD_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCMIN_PER_DEG_swigconstant", ARCMIN_PER_DEG_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCMIN_PER_ARCSEC_swigconstant", ARCMIN_PER_ARCSEC_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCSEC_PER_RAD_swigconstant", ARCSEC_PER_RAD_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCSEC_PER_DEG_swigconstant", ARCSEC_PER_DEG_swigconstant, METH_VARARGS, NULL}, { (char *)"ARCSEC_PER_ARCMIN_swigconstant", ARCSEC_PER_ARCMIN_swigconstant, METH_VARARGS, NULL}, { (char *)"rad2deg", _wrap_rad2deg, METH_VARARGS, NULL}, { (char *)"rad2arcmin", _wrap_rad2arcmin, METH_VARARGS, NULL}, { (char *)"rad2arcsec", _wrap_rad2arcsec, METH_VARARGS, NULL}, { (char *)"deg2rad", _wrap_deg2rad, METH_VARARGS, NULL}, { (char *)"deg2arcmin", _wrap_deg2arcmin, METH_VARARGS, NULL}, { (char *)"deg2arcsec", _wrap_deg2arcsec, METH_VARARGS, NULL}, { (char *)"arcmin2rad", _wrap_arcmin2rad, METH_VARARGS, NULL}, { (char *)"arcmin2deg", _wrap_arcmin2deg, METH_VARARGS, NULL}, { (char *)"arcmin2arcsec", _wrap_arcmin2arcsec, METH_VARARGS, NULL}, { (char *)"arcsec2rad", _wrap_arcsec2rad, METH_VARARGS, NULL}, { (char *)"arcsec2deg", _wrap_arcsec2deg, METH_VARARGS, NULL}, { (char *)"arcsec2arcmin", _wrap_arcsec2arcmin, METH_VARARGS, NULL}, { (char *)"MJD_JD_OFFSET_swigconstant", MJD_JD_OFFSET_swigconstant, METH_VARARGS, NULL}, { (char *)"mjdtojd", _wrap_mjdtojd, METH_VARARGS, NULL}, { (char *)"jdtomjd", _wrap_jdtomjd, METH_VARARGS, NULL}, { (char *)"xy2ra", _wrap_xy2ra, METH_VARARGS, NULL}, { (char *)"z2dec", _wrap_z2dec, METH_VARARGS, NULL}, { (char *)"atora", _wrap_atora, METH_VARARGS, NULL}, { (char *)"atodec", _wrap_atodec, METH_VARARGS, NULL}, { (char *)"mag2flux", _wrap_mag2flux, METH_VARARGS, NULL}, { (char *)"radecrange2xyzrange", _wrap_radecrange2xyzrange, METH_VARARGS, NULL}, { (char *)"radec2xyz", _wrap_radec2xyz, METH_VARARGS, NULL}, { (char *)"xyz2radec", _wrap_xyz2radec, METH_VARARGS, NULL}, { (char *)"xyzarr2radec", _wrap_xyzarr2radec, METH_VARARGS, NULL}, { (char *)"xyzarr2radecarr", _wrap_xyzarr2radecarr, METH_VARARGS, NULL}, { (char *)"radec2xyzarr", _wrap_radec2xyzarr, METH_VARARGS, NULL}, { (char *)"radec2xyzarrmany", _wrap_radec2xyzarrmany, METH_VARARGS, NULL}, { (char *)"radecdeg2xyz", _wrap_radecdeg2xyz, METH_VARARGS, NULL}, { (char *)"xyzarr2radecdeg", _wrap_xyzarr2radecdeg, METH_VARARGS, NULL}, { (char *)"xyzarr2radecdegarr", _wrap_xyzarr2radecdegarr, METH_VARARGS, NULL}, { (char *)"radecdeg2xyzarr", _wrap_radecdeg2xyzarr, METH_VARARGS, NULL}, { (char *)"radecdegarr2xyzarr", _wrap_radecdegarr2xyzarr, METH_VARARGS, NULL}, { (char *)"radecdeg2xyzarrmany", _wrap_radecdeg2xyzarrmany, METH_VARARGS, NULL}, { (char *)"radec_derivatives", _wrap_radec_derivatives, METH_VARARGS, NULL}, { (char *)"distsq_between_radecdeg", _wrap_distsq_between_radecdeg, METH_VARARGS, NULL}, { (char *)"arcsec_between_radecdeg", _wrap_arcsec_between_radecdeg, METH_VARARGS, NULL}, { (char *)"deg_between_radecdeg", _wrap_deg_between_radecdeg, METH_VARARGS, NULL}, { (char *)"ra2mercx", _wrap_ra2mercx, METH_VARARGS, NULL}, { (char *)"dec2mercy", _wrap_dec2mercy, METH_VARARGS, NULL}, { (char *)"ra2hms", _wrap_ra2hms, METH_VARARGS, NULL}, { (char *)"dec2dms", _wrap_dec2dms, METH_VARARGS, NULL}, { (char *)"hms2ra", _wrap_hms2ra, METH_VARARGS, NULL}, { (char *)"dms2dec", _wrap_dms2dec, METH_VARARGS, NULL}, { (char *)"ra2hmsstring", _wrap_ra2hmsstring, METH_VARARGS, NULL}, { (char *)"dec2dmsstring", _wrap_dec2dmsstring, METH_VARARGS, NULL}, { (char *)"project_hammer_aitoff_x", _wrap_project_hammer_aitoff_x, METH_VARARGS, NULL}, { (char *)"project_equal_area", _wrap_project_equal_area, METH_VARARGS, NULL}, { (char *)"distsq2arc", _wrap_distsq2arc, METH_VARARGS, NULL}, { (char *)"distsq2rad", _wrap_distsq2rad, METH_VARARGS, NULL}, { (char *)"distsq2deg", _wrap_distsq2deg, METH_VARARGS, NULL}, { (char *)"dist2rad", _wrap_dist2rad, METH_VARARGS, NULL}, { (char *)"distsq2arcsec", _wrap_distsq2arcsec, METH_VARARGS, NULL}, { (char *)"dist2arcsec", _wrap_dist2arcsec, METH_VARARGS, NULL}, { (char *)"rad2distsq", _wrap_rad2distsq, METH_VARARGS, NULL}, { (char *)"rad2dist", _wrap_rad2dist, METH_VARARGS, NULL}, { (char *)"arcsec2distsq", _wrap_arcsec2distsq, METH_VARARGS, NULL}, { (char *)"arcsec2dist", _wrap_arcsec2dist, METH_VARARGS, NULL}, { (char *)"deg2dist", _wrap_deg2dist, METH_VARARGS, NULL}, { (char *)"deg2distsq", _wrap_deg2distsq, METH_VARARGS, NULL}, { (char *)"arcmin2dist", _wrap_arcmin2dist, METH_VARARGS, NULL}, { (char *)"arcmin2distsq", _wrap_arcmin2distsq, METH_VARARGS, NULL}, { (char *)"dist2deg", _wrap_dist2deg, METH_VARARGS, NULL}, { (char *)"HELP_ERR_swigconstant", HELP_ERR_swigconstant, METH_VARARGS, NULL}, { (char *)"OPT_ERR_swigconstant", OPT_ERR_swigconstant, METH_VARARGS, NULL}, { (char *)"make_rand_star", _wrap_make_rand_star, METH_VARARGS, NULL}, { (char *)"star_coords", _wrap_star_coords, METH_VARARGS, NULL}, { (char *)"star_midpoint", _wrap_star_midpoint, METH_VARARGS, NULL}, { (char *)"qfits_header_debug_dump", _wrap_qfits_header_debug_dump, METH_VARARGS, NULL}, { (char *)"qfits_header_list", _wrap_qfits_header_list, METH_VARARGS, NULL}, { (char *)"qfits_header_new", _wrap_qfits_header_new, METH_VARARGS, NULL}, { (char *)"qfits_header_default", _wrap_qfits_header_default, METH_VARARGS, NULL}, { (char *)"qfits_header_n", _wrap_qfits_header_n, METH_VARARGS, NULL}, { (char *)"qfits_header_add", _wrap_qfits_header_add, METH_VARARGS, NULL}, { (char *)"qfits_header_add_after", _wrap_qfits_header_add_after, METH_VARARGS, NULL}, { (char *)"qfits_header_append", _wrap_qfits_header_append, METH_VARARGS, NULL}, { (char *)"qfits_header_del", _wrap_qfits_header_del, METH_VARARGS, NULL}, { (char *)"qfits_header_sort", _wrap_qfits_header_sort, METH_VARARGS, NULL}, { (char *)"qfits_header_copy", _wrap_qfits_header_copy, METH_VARARGS, NULL}, { (char *)"qfits_header_mod", _wrap_qfits_header_mod, METH_VARARGS, NULL}, { (char *)"qfits_header_destroy", _wrap_qfits_header_destroy, METH_VARARGS, NULL}, { (char *)"qfits_header_getstr", _wrap_qfits_header_getstr, METH_VARARGS, NULL}, { (char *)"qfits_header_getstr_pretty", _wrap_qfits_header_getstr_pretty, METH_VARARGS, NULL}, { (char *)"qfits_header_getitem", _wrap_qfits_header_getitem, METH_VARARGS, NULL}, { (char *)"qfits_header_setitem", _wrap_qfits_header_setitem, METH_VARARGS, NULL}, { (char *)"qfits_header_getcom", _wrap_qfits_header_getcom, METH_VARARGS, NULL}, { (char *)"qfits_header_getint", _wrap_qfits_header_getint, METH_VARARGS, NULL}, { (char *)"qfits_header_getdouble", _wrap_qfits_header_getdouble, METH_VARARGS, NULL}, { (char *)"qfits_header_getboolean", _wrap_qfits_header_getboolean, METH_VARARGS, NULL}, { (char *)"qfits_header_dump", _wrap_qfits_header_dump, METH_VARARGS, NULL}, { (char *)"qfits_header_findmatch", _wrap_qfits_header_findmatch, METH_VARARGS, NULL}, { (char *)"qfits_header_write_line", _wrap_qfits_header_write_line, METH_VARARGS, NULL}, { (char *)"qfits_header_read_hdr_string", _wrap_qfits_header_read_hdr_string, METH_VARARGS, NULL}, { (char *)"qfits_zeropad", _wrap_qfits_zeropad, METH_VARARGS, NULL}, { (char *)"qfits_is_fits", _wrap_qfits_is_fits, METH_VARARGS, NULL}, { (char *)"is_blank_line", _wrap_is_blank_line, METH_VARARGS, NULL}, { (char *)"wcs_pv2sip_header", _wrap_wcs_pv2sip_header, METH_VARARGS, NULL}, { (char *)"wcs_pv2sip", _wrap_wcs_pv2sip, METH_VARARGS, NULL}, { (char *)"SIP_MAXORDER_swigconstant", SIP_MAXORDER_swigconstant, METH_VARARGS, NULL}, { (char *)"tan_t_crval_set", _wrap_tan_t_crval_set, METH_VARARGS, NULL}, { (char *)"tan_t_crval_get", _wrap_tan_t_crval_get, METH_VARARGS, NULL}, { (char *)"tan_t_crpix_set", _wrap_tan_t_crpix_set, METH_VARARGS, NULL}, { (char *)"tan_t_crpix_get", _wrap_tan_t_crpix_get, METH_VARARGS, NULL}, { (char *)"tan_t_cd_set", _wrap_tan_t_cd_set, METH_VARARGS, NULL}, { (char *)"tan_t_cd_get", _wrap_tan_t_cd_get, METH_VARARGS, NULL}, { (char *)"tan_t_imagew_set", _wrap_tan_t_imagew_set, METH_VARARGS, NULL}, { (char *)"tan_t_imagew_get", _wrap_tan_t_imagew_get, METH_VARARGS, NULL}, { (char *)"tan_t_imageh_set", _wrap_tan_t_imageh_set, METH_VARARGS, NULL}, { (char *)"tan_t_imageh_get", _wrap_tan_t_imageh_get, METH_VARARGS, NULL}, { (char *)"tan_t_sin_set", _wrap_tan_t_sin_set, METH_VARARGS, NULL}, { (char *)"tan_t_sin_get", _wrap_tan_t_sin_get, METH_VARARGS, NULL}, { (char *)"new_tan_t", _wrap_new_tan_t, METH_VARARGS, NULL}, { (char *)"delete_tan_t", _wrap_delete_tan_t, METH_VARARGS, NULL}, { (char *)"tan_t_set", _wrap_tan_t_set, METH_VARARGS, NULL}, { (char *)"tan_t_is_inside", _wrap_tan_t_is_inside, METH_VARARGS, NULL}, { (char *)"tan_t_scale", _wrap_tan_t_scale, METH_VARARGS, NULL}, { (char *)"tan_t_get_width", _wrap_tan_t_get_width, METH_VARARGS, NULL}, { (char *)"tan_t_get_height", _wrap_tan_t_get_height, METH_VARARGS, NULL}, { (char *)"tan_t_set_width", _wrap_tan_t_set_width, METH_VARARGS, NULL}, { (char *)"tan_t_set_height", _wrap_tan_t_set_height, METH_VARARGS, NULL}, { (char *)"tan_t_pixel_scale", _wrap_tan_t_pixel_scale, METH_VARARGS, NULL}, { (char *)"tan_t_radec_center", _wrap_tan_t_radec_center, METH_VARARGS, NULL}, { (char *)"tan_t_radius", _wrap_tan_t_radius, METH_VARARGS, NULL}, { (char *)"tan_t_xyzcenter", _wrap_tan_t_xyzcenter, METH_VARARGS, NULL}, { (char *)"tan_t_pixelxy2xyz", _wrap_tan_t_pixelxy2xyz, METH_VARARGS, NULL}, { (char *)"tan_t_pixelxy2radec", _wrap_tan_t_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"tan_t_radec2pixelxy", _wrap_tan_t_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_t_iwc2pixelxy", _wrap_tan_t_iwc2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_t_pixelxy2iwc", _wrap_tan_t_pixelxy2iwc, METH_VARARGS, NULL}, { (char *)"tan_t_iwc2radec", _wrap_tan_t_iwc2radec, METH_VARARGS, NULL}, { (char *)"tan_t_radec2iwc", _wrap_tan_t_radec2iwc, METH_VARARGS, NULL}, { (char *)"tan_t_xyz2pixelxy", _wrap_tan_t_xyz2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_t_write_to", _wrap_tan_t_write_to, METH_VARARGS, NULL}, { (char *)"tan_t_set_crval", _wrap_tan_t_set_crval, METH_VARARGS, NULL}, { (char *)"tan_t_set_crpix", _wrap_tan_t_set_crpix, METH_VARARGS, NULL}, { (char *)"tan_t_set_cd", _wrap_tan_t_set_cd, METH_VARARGS, NULL}, { (char *)"tan_t_set_imagesize", _wrap_tan_t_set_imagesize, METH_VARARGS, NULL}, { (char *)"tan_t_swigregister", tan_t_swigregister, METH_VARARGS, NULL}, { (char *)"sip_t_wcstan_set", _wrap_sip_t_wcstan_set, METH_VARARGS, NULL}, { (char *)"sip_t_wcstan_get", _wrap_sip_t_wcstan_get, METH_VARARGS, NULL}, { (char *)"sip_t_a_order_set", _wrap_sip_t_a_order_set, METH_VARARGS, NULL}, { (char *)"sip_t_a_order_get", _wrap_sip_t_a_order_get, METH_VARARGS, NULL}, { (char *)"sip_t_b_order_set", _wrap_sip_t_b_order_set, METH_VARARGS, NULL}, { (char *)"sip_t_b_order_get", _wrap_sip_t_b_order_get, METH_VARARGS, NULL}, { (char *)"sip_t_a_set", _wrap_sip_t_a_set, METH_VARARGS, NULL}, { (char *)"sip_t_a_get", _wrap_sip_t_a_get, METH_VARARGS, NULL}, { (char *)"sip_t_b_set", _wrap_sip_t_b_set, METH_VARARGS, NULL}, { (char *)"sip_t_b_get", _wrap_sip_t_b_get, METH_VARARGS, NULL}, { (char *)"sip_t_ap_order_set", _wrap_sip_t_ap_order_set, METH_VARARGS, NULL}, { (char *)"sip_t_ap_order_get", _wrap_sip_t_ap_order_get, METH_VARARGS, NULL}, { (char *)"sip_t_bp_order_set", _wrap_sip_t_bp_order_set, METH_VARARGS, NULL}, { (char *)"sip_t_bp_order_get", _wrap_sip_t_bp_order_get, METH_VARARGS, NULL}, { (char *)"sip_t_ap_set", _wrap_sip_t_ap_set, METH_VARARGS, NULL}, { (char *)"sip_t_ap_get", _wrap_sip_t_ap_get, METH_VARARGS, NULL}, { (char *)"sip_t_bp_set", _wrap_sip_t_bp_set, METH_VARARGS, NULL}, { (char *)"sip_t_bp_get", _wrap_sip_t_bp_get, METH_VARARGS, NULL}, { (char *)"new_sip_t", _wrap_new_sip_t, METH_VARARGS, NULL}, { (char *)"delete_sip_t", _wrap_delete_sip_t, METH_VARARGS, NULL}, { (char *)"sip_t_get_subimage", _wrap_sip_t_get_subimage, METH_VARARGS, NULL}, { (char *)"sip_t_scale", _wrap_sip_t_scale, METH_VARARGS, NULL}, { (char *)"sip_t_pixel_scale", _wrap_sip_t_pixel_scale, METH_VARARGS, NULL}, { (char *)"sip_t_radec_center", _wrap_sip_t_radec_center, METH_VARARGS, NULL}, { (char *)"sip_t_radius", _wrap_sip_t_radius, METH_VARARGS, NULL}, { (char *)"sip_t_write_to", _wrap_sip_t_write_to, METH_VARARGS, NULL}, { (char *)"sip_t_ensure_inverse_polynomials", _wrap_sip_t_ensure_inverse_polynomials, METH_VARARGS, NULL}, { (char *)"sip_t_pixelxy2xyz", _wrap_sip_t_pixelxy2xyz, METH_VARARGS, NULL}, { (char *)"sip_t_pixelxy2radec", _wrap_sip_t_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"sip_t_radec2pixelxy", _wrap_sip_t_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_t_iwc2pixelxy", _wrap_sip_t_iwc2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_t_pixelxy2iwc", _wrap_sip_t_pixelxy2iwc, METH_VARARGS, NULL}, { (char *)"sip_t_iwc2radec", _wrap_sip_t_iwc2radec, METH_VARARGS, NULL}, { (char *)"sip_t_radec2iwc", _wrap_sip_t_radec2iwc, METH_VARARGS, NULL}, { (char *)"sip_t_xyz2pixelxy", _wrap_sip_t_xyz2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_t_is_inside", _wrap_sip_t_is_inside, METH_VARARGS, NULL}, { (char *)"sip_t_set_a_term", _wrap_sip_t_set_a_term, METH_VARARGS, NULL}, { (char *)"sip_t_set_b_term", _wrap_sip_t_set_b_term, METH_VARARGS, NULL}, { (char *)"sip_t_set_ap_term", _wrap_sip_t_set_ap_term, METH_VARARGS, NULL}, { (char *)"sip_t_set_bp_term", _wrap_sip_t_set_bp_term, METH_VARARGS, NULL}, { (char *)"sip_t_get_a_term", _wrap_sip_t_get_a_term, METH_VARARGS, NULL}, { (char *)"sip_t_get_b_term", _wrap_sip_t_get_b_term, METH_VARARGS, NULL}, { (char *)"sip_t_get_ap_term", _wrap_sip_t_get_ap_term, METH_VARARGS, NULL}, { (char *)"sip_t_get_bp_term", _wrap_sip_t_get_bp_term, METH_VARARGS, NULL}, { (char *)"sip_t_set_width", _wrap_sip_t_set_width, METH_VARARGS, NULL}, { (char *)"sip_t_set_height", _wrap_sip_t_set_height, METH_VARARGS, NULL}, { (char *)"sip_t_get_width", _wrap_sip_t_get_width, METH_VARARGS, NULL}, { (char *)"sip_t_get_height", _wrap_sip_t_get_height, METH_VARARGS, NULL}, { (char *)"sip_t_get_distortion", _wrap_sip_t_get_distortion, METH_VARARGS, NULL}, { (char *)"sip_t_get_undistortion", _wrap_sip_t_get_undistortion, METH_VARARGS, NULL}, { (char *)"sip_t_swigregister", sip_t_swigregister, METH_VARARGS, NULL}, { (char *)"sip_create", _wrap_sip_create, METH_VARARGS, NULL}, { (char *)"sip_free", _wrap_sip_free, METH_VARARGS, NULL}, { (char *)"sip_copy", _wrap_sip_copy, METH_VARARGS, NULL}, { (char *)"sip_wrap_tan", _wrap_sip_wrap_tan, METH_VARARGS, NULL}, { (char *)"sip_imagew", _wrap_sip_imagew, METH_VARARGS, NULL}, { (char *)"sip_imageh", _wrap_sip_imageh, METH_VARARGS, NULL}, { (char *)"sip_pixelxy2radec", _wrap_sip_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"sip_pixelxy2xyzarr", _wrap_sip_pixelxy2xyzarr, METH_VARARGS, NULL}, { (char *)"sip_radec2pixelxy", _wrap_sip_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_radec2pixelxy_check", _wrap_sip_radec2pixelxy_check, METH_VARARGS, NULL}, { (char *)"sip_xyzarr2pixelxy", _wrap_sip_xyzarr2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_xyz2pixelxy", _wrap_sip_xyz2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_pixelxy2iwc", _wrap_sip_pixelxy2iwc, METH_VARARGS, NULL}, { (char *)"tan_det_cd", _wrap_tan_det_cd, METH_VARARGS, NULL}, { (char *)"sip_det_cd", _wrap_sip_det_cd, METH_VARARGS, NULL}, { (char *)"tan_pixel_scale", _wrap_tan_pixel_scale, METH_VARARGS, NULL}, { (char *)"sip_pixel_scale", _wrap_sip_pixel_scale, METH_VARARGS, NULL}, { (char *)"sip_calc_inv_distortion", _wrap_sip_calc_inv_distortion, METH_VARARGS, NULL}, { (char *)"sip_calc_distortion", _wrap_sip_calc_distortion, METH_VARARGS, NULL}, { (char *)"sip_pixel_distortion", _wrap_sip_pixel_distortion, METH_VARARGS, NULL}, { (char *)"sip_pixel_undistortion", _wrap_sip_pixel_undistortion, METH_VARARGS, NULL}, { (char *)"tan_pixelxy2xyzarr", _wrap_tan_pixelxy2xyzarr, METH_VARARGS, NULL}, { (char *)"tan_pixelxy2radec", _wrap_tan_pixelxy2radec, METH_VARARGS, NULL}, { (char *)"tan_pixelxy2radecarr", _wrap_tan_pixelxy2radecarr, METH_VARARGS, NULL}, { (char *)"tan_radec2pixelxy", _wrap_tan_radec2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_xyzarr2pixelxy", _wrap_tan_xyzarr2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_iwc2pixelxy", _wrap_tan_iwc2pixelxy, METH_VARARGS, NULL}, { (char *)"tan_iwc2xyzarr", _wrap_tan_iwc2xyzarr, METH_VARARGS, NULL}, { (char *)"tan_iwc2radec", _wrap_tan_iwc2radec, METH_VARARGS, NULL}, { (char *)"tan_pixelxy2iwc", _wrap_tan_pixelxy2iwc, METH_VARARGS, NULL}, { (char *)"tan_xyzarr2iwc", _wrap_tan_xyzarr2iwc, METH_VARARGS, NULL}, { (char *)"tan_radec2iwc", _wrap_tan_radec2iwc, METH_VARARGS, NULL}, { (char *)"sip_xyzarr2iwc", _wrap_sip_xyzarr2iwc, METH_VARARGS, NULL}, { (char *)"sip_radec2iwc", _wrap_sip_radec2iwc, METH_VARARGS, NULL}, { (char *)"sip_iwc2pixelxy", _wrap_sip_iwc2pixelxy, METH_VARARGS, NULL}, { (char *)"sip_iwc2radec", _wrap_sip_iwc2radec, METH_VARARGS, NULL}, { (char *)"sip_print", _wrap_sip_print, METH_VARARGS, NULL}, { (char *)"sip_print_to", _wrap_sip_print_to, METH_VARARGS, NULL}, { (char *)"tan_print", _wrap_tan_print, METH_VARARGS, NULL}, { (char *)"tan_print_to", _wrap_tan_print_to, METH_VARARGS, NULL}, { (char *)"sip_get_crval", _wrap_sip_get_crval, METH_VARARGS, NULL}, { (char *)"tan_get_orientation", _wrap_tan_get_orientation, METH_VARARGS, NULL}, { (char *)"sip_get_orientation", _wrap_sip_get_orientation, METH_VARARGS, NULL}, { (char *)"sip_get_image_size", _wrap_sip_get_image_size, METH_VARARGS, NULL}, { (char *)"sip_read_tan_or_sip_header_file_ext", _wrap_sip_read_tan_or_sip_header_file_ext, METH_VARARGS, NULL}, { (char *)"sip_create_header", _wrap_sip_create_header, METH_VARARGS, NULL}, { (char *)"tan_create_header", _wrap_tan_create_header, METH_VARARGS, NULL}, { (char *)"sip_add_to_header", _wrap_sip_add_to_header, METH_VARARGS, NULL}, { (char *)"tan_add_to_header", _wrap_tan_add_to_header, METH_VARARGS, NULL}, { (char *)"sip_read_header_file", _wrap_sip_read_header_file, METH_VARARGS, NULL}, { (char *)"sip_read_header_file_ext", _wrap_sip_read_header_file_ext, METH_VARARGS, NULL}, { (char *)"sip_read_header_file_ext_only", _wrap_sip_read_header_file_ext_only, METH_VARARGS, NULL}, { (char *)"tan_read_header_file", _wrap_tan_read_header_file, METH_VARARGS, NULL}, { (char *)"tan_read_header_file_ext", _wrap_tan_read_header_file_ext, METH_VARARGS, NULL}, { (char *)"tan_read_header_file_ext_only", _wrap_tan_read_header_file_ext_only, METH_VARARGS, NULL}, { (char *)"sip_read_header", _wrap_sip_read_header, METH_VARARGS, NULL}, { (char *)"tan_read_header", _wrap_tan_read_header, METH_VARARGS, NULL}, { (char *)"sip_from_string", _wrap_sip_from_string, METH_VARARGS, NULL}, { (char *)"tan_write_to", _wrap_tan_write_to, METH_VARARGS, NULL}, { (char *)"sip_write_to", _wrap_sip_write_to, METH_VARARGS, NULL}, { (char *)"sip_write_to_file", _wrap_sip_write_to_file, METH_VARARGS, NULL}, { (char *)"tan_write_to_file", _wrap_tan_write_to_file, METH_VARARGS, NULL}, { (char *)"wcs_pixel_center_for_size", _wrap_wcs_pixel_center_for_size, METH_VARARGS, NULL}, { (char *)"sip_ensure_inverse_polynomials", _wrap_sip_ensure_inverse_polynomials, METH_VARARGS, NULL}, { (char *)"sip_compute_inverse_polynomials", _wrap_sip_compute_inverse_polynomials, METH_VARARGS, NULL}, { (char *)"sip_filter_stars_in_field", _wrap_sip_filter_stars_in_field, METH_VARARGS, NULL}, { (char *)"sip_get_radec_bounds", _wrap_sip_get_radec_bounds, METH_VARARGS, NULL}, { (char *)"sip_walk_image_boundary", _wrap_sip_walk_image_boundary, METH_VARARGS, NULL}, { (char *)"sip_get_radec_center", _wrap_sip_get_radec_center, METH_VARARGS, NULL}, { (char *)"tan_get_radec_center", _wrap_tan_get_radec_center, METH_VARARGS, NULL}, { (char *)"sip_get_radius_deg", _wrap_sip_get_radius_deg, METH_VARARGS, NULL}, { (char *)"tan_get_radius_deg", _wrap_tan_get_radius_deg, METH_VARARGS, NULL}, { (char *)"sip_get_radec_center_hms", _wrap_sip_get_radec_center_hms, METH_VARARGS, NULL}, { (char *)"sip_pixel_is_inside_image", _wrap_sip_pixel_is_inside_image, METH_VARARGS, NULL}, { (char *)"sip_is_inside_image", _wrap_sip_is_inside_image, METH_VARARGS, NULL}, { (char *)"sip_get_radec_center_hms_string", _wrap_sip_get_radec_center_hms_string, METH_VARARGS, NULL}, { (char *)"sip_get_field_size", _wrap_sip_get_field_size, METH_VARARGS, NULL}, { (char *)"sip_shift", _wrap_sip_shift, METH_VARARGS, NULL}, { (char *)"tan_pixel_is_inside_image", _wrap_tan_pixel_is_inside_image, METH_VARARGS, NULL}, { (char *)"tan_is_inside_image", _wrap_tan_is_inside_image, METH_VARARGS, NULL}, { (char *)"tan_transform", _wrap_tan_transform, METH_VARARGS, NULL}, { (char *)"tan_scale", _wrap_tan_scale, METH_VARARGS, NULL}, { (char *)"sip_scale", _wrap_sip_scale, METH_VARARGS, NULL}, { (char *)"tan_rotate", _wrap_tan_rotate, METH_VARARGS, NULL}, { (char *)"coadd_add_numpy", _wrap_coadd_add_numpy, METH_VARARGS, NULL}, { (char *)"coadd_get_snapshot_numpy", _wrap_coadd_get_snapshot_numpy, METH_VARARGS, NULL}, { (char *)"fit_sip_wcs_py", _wrap_fit_sip_wcs_py, METH_VARARGS, NULL}, { (char *)"broadcast_2to2ok", _wrap_broadcast_2to2ok, METH_VARARGS, NULL}, { (char *)"broadcast_2to2", _wrap_broadcast_2to2, METH_VARARGS, NULL}, { (char *)"broadcast_2to2i", _wrap_broadcast_2to2i, METH_VARARGS, NULL}, { (char *)"tan_rd2xy_wrapper", _wrap_tan_rd2xy_wrapper, METH_VARARGS, NULL}, { (char *)"sip_rd2xy_wrapper", _wrap_sip_rd2xy_wrapper, METH_VARARGS, NULL}, { (char *)"anwcs_rd2xy_wrapper", _wrap_anwcs_rd2xy_wrapper, METH_VARARGS, NULL}, { (char *)"tan_iwc2xy_wrapper", _wrap_tan_iwc2xy_wrapper, METH_VARARGS, NULL}, { (char *)"sip_iwc2xy_wrapper", _wrap_sip_iwc2xy_wrapper, METH_VARARGS, NULL}, { (char *)"tan_xy2iwc_wrapper", _wrap_tan_xy2iwc_wrapper, METH_VARARGS, NULL}, { (char *)"sip_xy2iwc_wrapper", _wrap_sip_xy2iwc_wrapper, METH_VARARGS, NULL}, { (char *)"tan_iwc2rd_wrapper", _wrap_tan_iwc2rd_wrapper, METH_VARARGS, NULL}, { (char *)"sip_iwc2rd_wrapper", _wrap_sip_iwc2rd_wrapper, METH_VARARGS, NULL}, { (char *)"tan_rd2iwc_wrapper", _wrap_tan_rd2iwc_wrapper, METH_VARARGS, NULL}, { (char *)"sip_rd2iwc_wrapper", _wrap_sip_rd2iwc_wrapper, METH_VARARGS, NULL}, { (char *)"tan_xy2rd_wrapper", _wrap_tan_xy2rd_wrapper, METH_VARARGS, NULL}, { (char *)"sip_xy2rd_wrapper", _wrap_sip_xy2rd_wrapper, METH_VARARGS, NULL}, { (char *)"anwcs_xy2rd_wrapper", _wrap_anwcs_xy2rd_wrapper, METH_VARARGS, NULL}, { (char *)"tan_wcs_resample", _wrap_tan_wcs_resample, METH_VARARGS, NULL}, { (char *)"tan_numpy_xyz2pixelxy", _wrap_tan_numpy_xyz2pixelxy, METH_VARARGS, NULL}, { (char *)"an_tally", _wrap_an_tally, METH_VARARGS, NULL}, { (char *)"fits_use_error_system", _wrap_fits_use_error_system, METH_VARARGS, NULL}, { (char *)"fits_to_string", _wrap_fits_to_string, METH_VARARGS, NULL}, { (char *)"fits_write_float_image", _wrap_fits_write_float_image, METH_VARARGS, NULL}, { (char *)"fits_write_u8_image", _wrap_fits_write_u8_image, METH_VARARGS, NULL}, { (char *)"fits_write_i16_image", _wrap_fits_write_i16_image, METH_VARARGS, NULL}, { (char *)"fits_get_header_for_image", _wrap_fits_get_header_for_image, METH_VARARGS, NULL}, { (char *)"fits_get_header_for_image2", _wrap_fits_get_header_for_image2, METH_VARARGS, NULL}, { (char *)"fits_get_header_for_image3", _wrap_fits_get_header_for_image3, METH_VARARGS, NULL}, { (char *)"fits_write_header", _wrap_fits_write_header, METH_VARARGS, NULL}, { (char *)"fits_write_header_and_image", _wrap_fits_write_header_and_image, METH_VARARGS, NULL}, { (char *)"fits_get_double_val", _wrap_fits_get_double_val, METH_VARARGS, NULL}, { (char *)"fits_is_table_header", _wrap_fits_is_table_header, METH_VARARGS, NULL}, { (char *)"fits_is_primary_header", _wrap_fits_is_primary_header, METH_VARARGS, NULL}, { (char *)"fits_copy_non_table_headers", _wrap_fits_copy_non_table_headers, METH_VARARGS, NULL}, { (char *)"fits_get_dupstring", _wrap_fits_get_dupstring, METH_VARARGS, NULL}, { (char *)"fits_get_long_string", _wrap_fits_get_long_string, METH_VARARGS, NULL}, { (char *)"fits_header_addf", _wrap_fits_header_addf, METH_VARARGS, NULL}, { (char *)"fits_header_addf_longstring", _wrap_fits_header_addf_longstring, METH_VARARGS, NULL}, { (char *)"fits_header_add_longstring_boilerplate", _wrap_fits_header_add_longstring_boilerplate, METH_VARARGS, NULL}, { (char *)"fits_header_modf", _wrap_fits_header_modf, METH_VARARGS, NULL}, { (char *)"fits_header_add_int", _wrap_fits_header_add_int, METH_VARARGS, NULL}, { (char *)"fits_header_add_double", _wrap_fits_header_add_double, METH_VARARGS, NULL}, { (char *)"fits_header_set_double", _wrap_fits_header_set_double, METH_VARARGS, NULL}, { (char *)"fits_header_set_int", _wrap_fits_header_set_int, METH_VARARGS, NULL}, { (char *)"fits_header_mod_int", _wrap_fits_header_mod_int, METH_VARARGS, NULL}, { (char *)"fits_header_mod_double", _wrap_fits_header_mod_double, METH_VARARGS, NULL}, { (char *)"fits_update_value", _wrap_fits_update_value, METH_VARARGS, NULL}, { (char *)"fits_copy_table", _wrap_fits_copy_table, METH_VARARGS, NULL}, { (char *)"an_fits_copy_header", _wrap_an_fits_copy_header, METH_VARARGS, NULL}, { (char *)"fits_copy_all_headers", _wrap_fits_copy_all_headers, METH_VARARGS, NULL}, { (char *)"fits_append_all_headers", _wrap_fits_append_all_headers, METH_VARARGS, NULL}, { (char *)"fits_add_args", _wrap_fits_add_args, METH_VARARGS, NULL}, { (char *)"fits_add_long_comment", _wrap_fits_add_long_comment, METH_VARARGS, NULL}, { (char *)"fits_append_long_comment", _wrap_fits_append_long_comment, METH_VARARGS, NULL}, { (char *)"fits_add_long_history", _wrap_fits_add_long_history, METH_VARARGS, NULL}, { (char *)"fits_blocks_needed", _wrap_fits_blocks_needed, METH_VARARGS, NULL}, { (char *)"fits_bytes_needed", _wrap_fits_bytes_needed, METH_VARARGS, NULL}, { (char *)"fits_pad_file_with", _wrap_fits_pad_file_with, METH_VARARGS, NULL}, { (char *)"fits_pad_file", _wrap_fits_pad_file, METH_VARARGS, NULL}, { (char *)"fits_pad_file_name", _wrap_fits_pad_file_name, METH_VARARGS, NULL}, { (char *)"fits_fill_endian_string", _wrap_fits_fill_endian_string, METH_VARARGS, NULL}, { (char *)"fits_get_endian_string", _wrap_fits_get_endian_string, METH_VARARGS, NULL}, { (char *)"fits_check_endian", _wrap_fits_check_endian, METH_VARARGS, NULL}, { (char *)"fits_check_uint_size", _wrap_fits_check_uint_size, METH_VARARGS, NULL}, { (char *)"fits_check_double_size", _wrap_fits_check_double_size, METH_VARARGS, NULL}, { (char *)"fits_add_endian", _wrap_fits_add_endian, METH_VARARGS, NULL}, { (char *)"fits_add_reverse_endian", _wrap_fits_add_reverse_endian, METH_VARARGS, NULL}, { (char *)"fits_mod_reverse_endian", _wrap_fits_mod_reverse_endian, METH_VARARGS, NULL}, { (char *)"fits_add_uint_size", _wrap_fits_add_uint_size, METH_VARARGS, NULL}, { (char *)"fits_add_double_size", _wrap_fits_add_double_size, METH_VARARGS, NULL}, { (char *)"fits_find_column", _wrap_fits_find_column, METH_VARARGS, NULL}, { (char *)"fits_find_table_column", _wrap_fits_find_table_column, METH_VARARGS, NULL}, { (char *)"fits_get_table_column", _wrap_fits_get_table_column, METH_VARARGS, NULL}, { (char *)"fits_add_column", _wrap_fits_add_column, METH_VARARGS, NULL}, { (char *)"fits_offset_of_column", _wrap_fits_offset_of_column, METH_VARARGS, NULL}, { (char *)"fits_write_data_A", _wrap_fits_write_data_A, METH_VARARGS, NULL}, { (char *)"fits_write_data_B", _wrap_fits_write_data_B, METH_VARARGS, NULL}, { (char *)"fits_write_data_D", _wrap_fits_write_data_D, METH_VARARGS, NULL}, { (char *)"fits_write_data_E", _wrap_fits_write_data_E, METH_VARARGS, NULL}, { (char *)"fits_write_data_I", _wrap_fits_write_data_I, METH_VARARGS, NULL}, { (char *)"fits_write_data_J", _wrap_fits_write_data_J, METH_VARARGS, NULL}, { (char *)"fits_write_data_K", _wrap_fits_write_data_K, METH_VARARGS, NULL}, { (char *)"fits_write_data_L", _wrap_fits_write_data_L, METH_VARARGS, NULL}, { (char *)"fits_write_data_X", _wrap_fits_write_data_X, METH_VARARGS, NULL}, { (char *)"fits_write_data", _wrap_fits_write_data, METH_VARARGS, NULL}, { (char *)"fits_write_data_array", _wrap_fits_write_data_array, METH_VARARGS, NULL}, { (char *)"collapsing_find_minlabel", _wrap_collapsing_find_minlabel, METH_VARARGS, NULL}, { (char *)"dfind2", _wrap_dfind2, METH_VARARGS, NULL}, { (char *)"dfind2_u8", _wrap_dfind2_u8, METH_VARARGS, NULL}, { (char *)"dselip", _wrap_dselip, METH_VARARGS, NULL}, { (char *)"dselip_cleanup", _wrap_dselip_cleanup, METH_VARARGS, NULL}, { (char *)"dsmooth", _wrap_dsmooth, METH_VARARGS, NULL}, { (char *)"dsmooth2", _wrap_dsmooth2, METH_VARARGS, NULL}, { (char *)"dsmooth2_u8", _wrap_dsmooth2_u8, METH_VARARGS, NULL}, { (char *)"dsmooth2_i16", _wrap_dsmooth2_i16, METH_VARARGS, NULL}, { (char *)"dobjects", _wrap_dobjects, METH_VARARGS, NULL}, { (char *)"dmask", _wrap_dmask, METH_VARARGS, NULL}, { (char *)"dpeaks", _wrap_dpeaks, METH_VARARGS, NULL}, { (char *)"dcen3x3", _wrap_dcen3x3, METH_VARARGS, NULL}, { (char *)"dsigma", _wrap_dsigma, METH_VARARGS, NULL}, { (char *)"dsigma_u8", _wrap_dsigma_u8, METH_VARARGS, NULL}, { (char *)"dmedsmooth", _wrap_dmedsmooth, METH_VARARGS, NULL}, { (char *)"dallpeaks", _wrap_dallpeaks, METH_VARARGS, NULL}, { (char *)"dallpeaks_u8", _wrap_dallpeaks_u8, METH_VARARGS, NULL}, { (char *)"dallpeaks_i16", _wrap_dallpeaks_i16, METH_VARARGS, NULL}, { (char *)"dcen3x3b", _wrap_dcen3x3b, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_FILE = {"_p_FILE", "FILE *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_a_10__double = {"_p_a_10__double", "double (*)[10]", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_a_2__double = {"_p_a_2__double", "double (*)[2]", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_anqfits_t = {"_p_anqfits_t", "anqfits_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_anwcs_t = {"_p_anwcs_t", "struct anwcs_t *|anwcs_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_coadd_t = {"_p_coadd_t", "coadd_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_codetree_t = {"_p_codetree_t", "codetree_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_dl = {"_p_dl", "dl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double = {"_p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double", "double (*)(double,double,float const *,float const *,int,int,double *,void *)|double (*)(double,double,number const *,number const *,int,int,double *,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_int_p_void__int = {"_p_f_int_p_void__int", "int (*)(int,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__sip_t_double_double_double_double_p_void__void = {"_p_f_p_q_const__sip_t_double_double_double_double_p_void__void", "void (*)(sip_t const *,double,double,double,double,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void = {"_p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void", "void (*)(struct anwcs_t const *,double,double,double,double,void *)|void (*)(anwcs_t const *,double,double,double,double,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__void_double_double_p_double_p_double__int = {"_p_f_p_q_const__void_double_double_p_double_p_double__int", "f_2to2i|int (*)(void const *,double,double,double *,double *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char = {"_p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char", "unsigned char (*)(void const *,double,double,double *,double *)|f_2to2ok", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__void_double_double_p_double_p_double__void = {"_p_f_p_q_const__void_double_double_p_double_p_double__void", "f_2to2|void (*)(void const *,double,double,double *,double *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_fitsbin_t = {"_p_fitsbin_t", "fitsbin_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_fitstable_t = {"_p_fitstable_t", "fitstable_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_float = {"_p_float", "number *|float *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_il = {"_p_il", "il *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_index_t = {"_p_index_t", "index_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int16_t = {"_p_int16_t", "int16_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int32_t = {"_p_int32_t", "int32_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int64_t = {"_p_int64_t", "int64_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_kdtree_t = {"_p_kdtree_t", "kdtree_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_lanczos_args_t = {"_p_lanczos_args_t", "lanczos_args_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_off_t = {"_p_off_t", "off_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_char = {"_p_p_char", "char **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_double = {"_p_p_double", "double **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_int = {"_p_p_int", "int **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_qfits_header = {"_p_p_qfits_header", "qfits_header **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_pl = {"_p_pl", "pl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_qfits_header = {"_p_qfits_header", "qfits_header *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_qfits_table = {"_p_qfits_table", "qfits_table *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_qfitsdumper = {"_p_qfitsdumper", "qfitsdumper *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_quadfile_t = {"_p_quadfile_t", "quadfile_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_sip_t = {"_p_sip_t", "sip_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_sl = {"_p_sl", "sl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_startree_t = {"_p_startree_t", "startree_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tan_t = {"_p_tan_t", "tan_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tfits_type = {"_p_tfits_type", "tfits_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_uint16_t = {"_p_uint16_t", "dimage_label_t *|uint16_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_uint32_t = {"_p_uint32_t", "uint32_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_uint8_t = {"_p_uint8_t", "uint8_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "uchar *|unsigned char *|anbool *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_int = {"_p_unsigned_int", "unsigned int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_FILE, &_swigt__p_a_10__double, &_swigt__p_a_2__double, &_swigt__p_anqfits_t, &_swigt__p_anwcs_t, &_swigt__p_char, &_swigt__p_coadd_t, &_swigt__p_codetree_t, &_swigt__p_dl, &_swigt__p_double, &_swigt__p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double, &_swigt__p_f_int_p_void__int, &_swigt__p_f_p_q_const__sip_t_double_double_double_double_p_void__void, &_swigt__p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void, &_swigt__p_f_p_q_const__void_double_double_p_double_p_double__int, &_swigt__p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char, &_swigt__p_f_p_q_const__void_double_double_p_double_p_double__void, &_swigt__p_fitsbin_t, &_swigt__p_fitstable_t, &_swigt__p_float, &_swigt__p_il, &_swigt__p_index_t, &_swigt__p_int, &_swigt__p_int16_t, &_swigt__p_int32_t, &_swigt__p_int64_t, &_swigt__p_kdtree_t, &_swigt__p_lanczos_args_t, &_swigt__p_off_t, &_swigt__p_p_char, &_swigt__p_p_double, &_swigt__p_p_int, &_swigt__p_p_qfits_header, &_swigt__p_pl, &_swigt__p_qfits_header, &_swigt__p_qfits_table, &_swigt__p_qfitsdumper, &_swigt__p_quadfile_t, &_swigt__p_sip_t, &_swigt__p_sl, &_swigt__p_startree_t, &_swigt__p_tan_t, &_swigt__p_tfits_type, &_swigt__p_uint16_t, &_swigt__p_uint32_t, &_swigt__p_uint8_t, &_swigt__p_unsigned_char, &_swigt__p_unsigned_int, &_swigt__p_void, }; static swig_cast_info _swigc__p_FILE[] = { {&_swigt__p_FILE, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_a_10__double[] = { {&_swigt__p_a_10__double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_a_2__double[] = { {&_swigt__p_a_2__double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_anqfits_t[] = { {&_swigt__p_anqfits_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_anwcs_t[] = { {&_swigt__p_anwcs_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_coadd_t[] = { {&_swigt__p_coadd_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_codetree_t[] = { {&_swigt__p_codetree_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_dl[] = { {&_swigt__p_dl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_double[] = { {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double[] = { {&_swigt__p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_int_p_void__int[] = { {&_swigt__p_f_int_p_void__int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__sip_t_double_double_double_double_p_void__void[] = { {&_swigt__p_f_p_q_const__sip_t_double_double_double_double_p_void__void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void[] = { {&_swigt__p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__void_double_double_p_double_p_double__int[] = { {&_swigt__p_f_p_q_const__void_double_double_p_double_p_double__int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char[] = { {&_swigt__p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__void_double_double_p_double_p_double__void[] = { {&_swigt__p_f_p_q_const__void_double_double_p_double_p_double__void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_fitsbin_t[] = { {&_swigt__p_fitsbin_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_fitstable_t[] = { {&_swigt__p_fitstable_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_float[] = { {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_il[] = { {&_swigt__p_il, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_index_t[] = { {&_swigt__p_index_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int16_t[] = { {&_swigt__p_int16_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int32_t[] = { {&_swigt__p_int32_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int64_t[] = { {&_swigt__p_int64_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_kdtree_t[] = { {&_swigt__p_kdtree_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_lanczos_args_t[] = { {&_swigt__p_lanczos_args_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_off_t[] = { {&_swigt__p_off_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_char[] = { {&_swigt__p_p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_double[] = { {&_swigt__p_p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_int[] = { {&_swigt__p_p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_qfits_header[] = { {&_swigt__p_p_qfits_header, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_pl[] = { {&_swigt__p_pl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_qfits_header[] = { {&_swigt__p_qfits_header, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_qfits_table[] = { {&_swigt__p_qfits_table, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_qfitsdumper[] = { {&_swigt__p_qfitsdumper, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_quadfile_t[] = { {&_swigt__p_quadfile_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_sip_t[] = { {&_swigt__p_sip_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_sl[] = { {&_swigt__p_sl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_startree_t[] = { {&_swigt__p_startree_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tan_t[] = { {&_swigt__p_tan_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tfits_type[] = { {&_swigt__p_tfits_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_uint16_t[] = { {&_swigt__p_uint16_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_uint32_t[] = { {&_swigt__p_uint32_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_uint8_t[] = { {&_swigt__p_uint8_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_int[] = { {&_swigt__p_unsigned_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_FILE, _swigc__p_a_10__double, _swigc__p_a_2__double, _swigc__p_anqfits_t, _swigc__p_anwcs_t, _swigc__p_char, _swigc__p_coadd_t, _swigc__p_codetree_t, _swigc__p_dl, _swigc__p_double, _swigc__p_f_double_double_p_q_const__float_p_q_const__float_int_int_p_double_p_void__double, _swigc__p_f_int_p_void__int, _swigc__p_f_p_q_const__sip_t_double_double_double_double_p_void__void, _swigc__p_f_p_q_const__struct_anwcs_t_double_double_double_double_p_void__void, _swigc__p_f_p_q_const__void_double_double_p_double_p_double__int, _swigc__p_f_p_q_const__void_double_double_p_double_p_double__unsigned_char, _swigc__p_f_p_q_const__void_double_double_p_double_p_double__void, _swigc__p_fitsbin_t, _swigc__p_fitstable_t, _swigc__p_float, _swigc__p_il, _swigc__p_index_t, _swigc__p_int, _swigc__p_int16_t, _swigc__p_int32_t, _swigc__p_int64_t, _swigc__p_kdtree_t, _swigc__p_lanczos_args_t, _swigc__p_off_t, _swigc__p_p_char, _swigc__p_p_double, _swigc__p_p_int, _swigc__p_p_qfits_header, _swigc__p_pl, _swigc__p_qfits_header, _swigc__p_qfits_table, _swigc__p_qfitsdumper, _swigc__p_quadfile_t, _swigc__p_sip_t, _swigc__p_sl, _swigc__p_startree_t, _swigc__p_tan_t, _swigc__p_tfits_type, _swigc__p_uint16_t, _swigc__p_uint32_t, _swigc__p_uint8_t, _swigc__p_unsigned_char, _swigc__p_unsigned_int, _swigc__p_void, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ (printfunc) swig_varlink_print, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 varlink_type.ob_type = &PyType_Type; #else if (PyType_Ready(&varlink_type) < 0) return NULL; #endif } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { # if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, # else { PyObject_HEAD_INIT(NULL) NULL, /* m_init */ 0, /* m_index */ NULL, /* m_copy */ }, # endif (char *) SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = { 0, 0, 0, 0, 0, 0, 0 }; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { (PyCFunction) SwigPyObject_own, (PyCFunction) SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyObject *metatype_args; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* metatype is used to implement static member variables. */ metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type); assert(metatype_args); metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL); assert(metatype); Py_DECREF(metatype_args); metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro; assert(PyType_Ready(metatype) >= 0); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce(); } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); // numpy import_array(); #if PY_VERSION_HEX >= 0x03000000 return m; #else return; #endif } astrometry.net-0.67/util/votabletofits.py000755 000765 000024 00000001010 12651445460 020775 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from astrometry.util.siap import * from astrometry.util.fits import * if __name__ == '__main__': from optparse import OptionParser import sys parser = OptionParser('%prog #include #include #include #include "boilerplate.h" #include "gsl/gsl_vector.h" #include "gsl/gsl_multiroots.h" #include "anwcs.h" #include "errors.h" #include "log.h" const char* OPTIONS = "vh1:2:"; static int loglvl = LOG_MSG; static anwcs_t* wcs1 = NULL; static anwcs_t* wcs2 = NULL; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -1 \n" " -2 \n" " -h\n" " [-v]: +verbose\n" "\nPrints x and y coordinates of invariant point" "\n", progname); } int fvec(const gsl_vector *x, void *params, gsl_vector *f) { double ra,dec,xp,yp; double xi = gsl_vector_get(x,0); double yi = gsl_vector_get(x,1); anwcs_pixelxy2radec(wcs1, xi, yi, &ra, &dec); anwcs_radec2pixelxy(wcs2, ra, dec, &xp, &yp); xp = xp - xi; yp = yp - yi; gsl_vector_set(f,0,xp); gsl_vector_set(f,1,yp); return GSL_SUCCESS; } int print_state (size_t iter, gsl_multiroot_fsolver * s) { if (loglvl > LOG_MSG) { if (iter==0) { fprintf(stderr,"Solving...\n"); fprintf(stderr,"Iteration X Y\n"); fprintf(stderr,"%8ld: %16.6f %16.6f\n",(long)iter, gsl_vector_get(s->x,0), gsl_vector_get(s->x,1)); } else fprintf(stderr,"%8ld: %16.6f %16.6f\n",(long)iter, gsl_vector_get(s->x,0), gsl_vector_get(s->x,1)); } return 1; } int main(int argc, char** args) { int ext = 0,c; double ra,dec; double sol[2]; const gsl_multiroot_fsolver_type *T; gsl_multiroot_fsolver *s; int status; size_t iter=0; const size_t n=2; gsl_multiroot_function f={&fvec,n,NULL}; gsl_vector *x = gsl_vector_alloc(n); char *wcsfn1=NULL, *wcsfn2=NULL; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch(c) { case 'v': loglvl++; break; case 'h': print_help(args[0]); exit(0); case '1': wcsfn1 = optarg; break; case '2': wcsfn2 = optarg; break; } } log_init(loglvl); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(wcsfn1) || !(wcsfn2)) { print_help(args[0]); exit(-1); } /* open the two wcs systems */ wcs1 = anwcs_open(wcsfn1, ext); if (!wcs1) { ERROR("Failed to read WCS file"); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs1, log_get_fid()); } wcs2 = anwcs_open(wcsfn2, ext); if (!wcs2) { ERROR("Failed to read WCS file"); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs2, log_get_fid()); } /* setup the solver, start in the middle */ gsl_vector_set(x,0,anwcs_imagew(wcs1)/2.0); gsl_vector_set(x,1,anwcs_imageh(wcs1)/2.0); T = gsl_multiroot_fsolver_hybrids; s = gsl_multiroot_fsolver_alloc (T,2); gsl_multiroot_fsolver_set(s,&f,x); print_state(iter,s); do { iter++; status = gsl_multiroot_fsolver_iterate(s); print_state(iter,s); if (status) break; status = gsl_multiroot_test_residual(s->f,1e-7); } while (status == GSL_CONTINUE && iter < 1000); sol[0]=gsl_vector_get(s->x,0); sol[1]=gsl_vector_get(s->x,1); /* write some diagnostics on stderr */ /* transform to ra/dec */ anwcs_pixelxy2radec(wcs1, sol[0], sol[1], &ra, &dec); if (loglvl > LOG_MSG) fprintf(stderr,"Pixel (%.10f, %.10f) -> RA,Dec (%.10f, %.10f)\n", sol[0], sol[1], ra, dec); /* transform to x/y with second wcs center of rotation should stay the same x/y */ anwcs_radec2pixelxy(wcs2, ra, dec, &sol[0], &sol[1]); if (loglvl > LOG_MSG) fprintf(stderr,"RA,Dec (%.10f, %.10f) -> Pixel (%.10f, %.10f) \n", ra, dec, sol[0], sol[1]); /* write the solution */ fprintf(stdout,"%f\n",sol[0]); fprintf(stdout,"%f\n",sol[1]); return(0); } astrometry.net-0.67/util/wcs-pv2sip-main.c000644 000765 000024 00000005556 12651445460 020661 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "wcs-pv2sip.h" #include "boilerplate.h" #include "bl.h" #include "log.h" #include "fitsioutils.h" const char* OPTIONS = "hve:sx:X:y:Y:a:W:H:to:S"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] \n" " [-o ] SIP polynomial order to fit (default: 5)\n" " [-e ] FITS HDU number to read WCS from (default 0 = primary)\n" " [-S]: do NOT do the wcs_shift thing\n" " [-s]: treat input as Scamp .head file\n" " [-t]: override the CTYPE* cards in the WCS header, and assume they are TAN.\n" " [-v]: +verboseness\n" " Set the IMAGEW, IMAGEH in the output file:\n" " [-W ]\n" " [-H ]\n" " Set the pixel values used to compute the distortion polynomials with:\n" " [-x ] (default: 1)\n" " [-y ] (default: 1)\n" " [-X ] (default: image width)\n" " [-Y ] (default: image width)\n" " [-a ] (default: closest to 100 yielding whole number of steps)\n" "\n", progname); } int main(int argc, char** args) { int loglvl = LOG_MSG; char** myargs; int nargs; int c; int order = 5; char* wcsinfn = NULL; char* wcsoutfn = NULL; int ext = 0; anbool scamp = FALSE; double xlo = 0; double xhi = 0; double stepsize = 0; double ylo = 0; double yhi = 0; anbool forcetan = FALSE; int W, H; int doshift = 1; W = H = 0; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'S': doshift = 0; break; case 't': forcetan = TRUE; break; case 'o': order = atoi(optarg); break; case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'x': xlo = atof(optarg); break; case 'X': xhi = atof(optarg); break; case 'a': stepsize = atof(optarg); break; case 'y': ylo = atof(optarg); break; case 'Y': yhi = atof(optarg); break; case 's': scamp = TRUE; break; case 'e': ext = atoi(optarg); break; case 'v': loglvl++; break; case '?': case 'h': print_help(args[0]); exit(0); } } nargs = argc - optind; myargs = args + optind; if (nargs != 2) { print_help(args[0]); exit(-1); } wcsinfn = myargs[0]; wcsoutfn = myargs[1]; log_init(loglvl); fits_use_error_system(); logmsg("Reading WCS (with PV distortions) from %s, ext %i\n", wcsinfn, ext); logmsg("Writing WCS (with SIP distortions) to %s\n", wcsoutfn); if (wcs_pv2sip(wcsinfn, ext, wcsoutfn, scamp, NULL, 0, stepsize, xlo, xhi, ylo, yhi, W, H, order, forcetan, doshift)) { exit(-1); } return 0; } astrometry.net-0.67/util/wcs-pv2sip.c000644 000765 000024 00000033342 12651445460 017731 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "os-features.h" #include "fitsioutils.h" #include "ioutils.h" #include "errors.h" #include "log.h" #include "an-bool.h" #include "sip.h" #include "sip_qfits.h" #include "sip-utils.h" #include "starutil.h" #include "starxy.h" #include "tweak.h" #include "anqfits.h" #include "qfits_rw.h" #include "fit-wcs.h" /* Scamp's copy of wcslib has "raw_to_pv" in "proj.c". wcslib-4.4.4 has no such thing... tanrev() called by celrev(), by wcsrev() wcsrev() - calls linrev() (pixcrd -> imgcrd) - calls celrev(, x=imgcrd,y=imgcrd) - calls tanrev() (x,y -> phi,theta) - calls raw_to_pv() (x,y -> xp, yp) - calls sphrev() (phi,theta -> lng,lat) Got imcrd = (-0.0154408,-0.00816145) = sip.c (x,y) before -deg2rd // lng = 0, lat = 1 CFHTLS via CVO headers: PV1_0 = 6.888383659426E-03 / xi = PV1_0 PV1_1 = 1.01653233841 / + PV1_1 * x PV1_2 = 7.672948165520E-03 / + PV1_2 * y PV1_3 = 0.00000000000 / + PV1_3 * sqrt(x**2 + y**2) PV1_4 = -1.613906528201E-03 / + PV1_4 * x**2 PV1_5 = -1.170568723090E-03 / + PV1_5 * x*y PV1_6 = -6.175903023930E-04 / + PV1_6 * y**2 PV1_7 = -2.467136651059E-02 / + PV1_7 * x**3 PV1_8 = -1.806292484275E-03 / + PV1_8 * x**2 * y PV1_9 = -2.439766180834E-02 / + PV1_9 * x * y**2 PV1_10 = -4.872349869816E-04 / + PV1_10* y**3 PV2_0 = 5.963468826495E-03 / eta = PV2_0 PV2_1 = 1.01450676752 / + PV2_1 * y PV2_2 = 7.677145522017E-03 / + PV2_2 * x PV2_3 = 0.00000000000 / + PV2_3 * sqrt(x**2 + y**2) PV2_4 = -1.353520666662E-03 / + PV2_4 * y**2 PV2_5 = -1.247925715556E-03 / + PV2_5 * y*x PV2_6 = -5.742047327244E-04 / + PV2_6 * x**2 PV2_7 = -2.435753005264E-02 / + PV2_7 * y**3 PV2_8 = -1.842813673530E-03 / + PV2_8 * y**2 * x PV2_9 = -2.444782516561E-02 / + PV2_9 * y * x**2 PV2_10 = -4.717653697970E-04 / + PV2_10* x**3 a = prj->p+100; b = prj->p; xp = *(a++); xp += *(a++)*x; */ sip_t* wcs_pv2sip_header(qfits_header* hdr, double* xy, int Nxy, double stepsize, double xlo, double xhi, double ylo, double yhi, int imageW, int imageH, int order, anbool forcetan, int doshift) { double* radec = NULL; int rtn = -1; tan_t tanwcs; double x,y, px,py; double* rddist = NULL; int i, j; int nx, ny; double xstep, ystep; sip_t* sip = NULL; /** From http://iraf.noao.edu/projects/mosaic/tpv.html p = PV1_ xi' = p0 + p1 * xi + p2 * eta + p3 * r + p4 * xi^2 + p5 * xi * eta + p6 * eta^2 + p7 * xi^3 + p8 * xi^2 * eta + p9 * xi * eta^2 + p10 * eta^3 + p11 * r^3 + p12 * xi^4 + p13 * xi^3 * eta + p14 * xi^2 * eta^2 + p15 * xi * eta^3 + p16 * eta^4 + p17 * xi^5 + p18 * xi^4 * eta + p19 * xi^3 * eta^2 + p20 * xi^2 * eta^3 + p21 * xi * eta^4 + p22 * eta^5 + p23 * r^5 + p24 * xi^6 + p25 * xi^5 * eta + p26 * xi^4 * eta^2 + p27 * xi^3 * eta^3 + p28 * xi^2 * eta^4 + p29 * xi * eta^5 + p30 * eta^6 p31 * xi^7 + p32 * xi^6 * eta + p33 * xi^5 * eta^2 + p34 * xi^4 * eta^3 + p35 * xi^3 * eta^4 + p36 * xi^2 * eta^5 + p37 * xi * eta^6 + p38 * eta^7 + p39 * r^7 p = PV2_ eta' = p0 + p1 * eta + p2 * xi + p3 * r + p4 * eta^2 + p5 * eta * xi + p6 * xi^2 + p7 * eta^3 + p8 * eta^2 * xi + p9 * eta * xi^2 + p10 * xi^3 + p11 * r^3 + p12 * eta^4 + p13 * eta^3 * xi + p14 * eta^2 * xi^2 + p15 * eta * xi^3 + p16 * xi^4 + p17 * eta^5 + p18 * eta^4 * xi + p19 * eta^3 * xi^2 + p20 * eta^2 * xi^3 + p21 * eta * xi^4 + p22 * xi^5 + p23 * r^5 + p24 * eta^6 + p25 * eta^5 * xi + p26 * eta^4 * xi^2 + p27 * eta^3 * xi^3 + p28 * eta^2 * xi^4 + p29 * eta * xi^5 + p30 * xi^6 p31 * eta^7 + p32 * eta^6 * xi + p33 * eta^5 * xi^2 + p34 * eta^4 * xi^3 + p35 * eta^3 * xi^4 + p36 * eta^2 * xi^5 + p37 * eta * xi^6 + p38 * xi^7 + p39 * r^7 Note the "cross-over" -- the xi' powers are in terms of xi,eta while the eta' powers are in terms of eta,xi. */ // 1 x y r x2 xy y2 x3 x2y xy2 y3 r3 x4 x3y x2y2 xy3 y4 // x5 x4y x3y2 x2y3 xy4 y5 r5 x6 x5y x4y2, x3y3 x2y4 xy5 y6 // x7 x6y x5y2 x4y3 x3y4 x2y5 xy6 y7 r7 int xp[] = { 0, 1, 0, 0, 2, 1, 0, 3, 2, 1, 0, 0, 4, 3, 2, 1, 0, 5, 4, 3, 2, 1, 0, 0, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 0}; int yp[] = { 0, 0, 1, 0, 0, 1, 2, 0, 1, 2, 3, 0, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 0}; int rp[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7}; double xpows[8]; double ypows[8]; double rpows[8]; double pv1[40]; double pv2[40]; double r; char* ct; ct = fits_get_dupstring(hdr, "CTYPE1"); if ((ct && streq(ct, "RA---TPV")) || forcetan) { // http://iraf.noao.edu/projects/ccdmosaic/tpv.html logmsg("Replacing CTYPE1 = %s header with RA---TAN\n", ct); fits_update_value(hdr, "CTYPE1", "RA---TAN"); } ct = fits_get_dupstring(hdr, "CTYPE2"); if ((ct && streq(ct, "DEC--TPV")) || forcetan) { logmsg("Replacing CTYPE2 = %s header with DEC--TAN\n", ct); fits_update_value(hdr, "CTYPE2", "DEC--TAN"); } tan_read_header(hdr, &tanwcs); if (log_get_level() >= LOG_VERB) { printf("Read TAN header:\n"); tan_print(&tanwcs); } if (imageW && (imageW != tanwcs.imagew)) { logmsg("Overriding image width %f with user-specified %i\n", tanwcs.imagew, imageW); tanwcs.imagew = imageW; } if (imageH && (imageH != tanwcs.imageh)) { logmsg("Overriding image height %f with user-specified %i\n", tanwcs.imageh, imageH); tanwcs.imageh = imageH; } for (i=0; i= xlo); assert(yhi >= ylo); if (stepsize == 0) stepsize = 100.; nx = MAX(2, round((xhi - xlo)/stepsize)); ny = MAX(2, round((yhi - ylo)/stepsize)); xstep = (xhi - xlo) / (double)(nx - 1); ystep = (yhi - ylo) / (double)(ny - 1); logverb("Stepping from x = %g to %g, steps of %g\n", xlo, xhi, xstep); logverb("Stepping from y = %g to %g, steps of %g\n", ylo, yhi, ystep); Nxy = nx * ny; if (xy == NULL) { int k = 0; xy = malloc(Nxy * 2 * sizeof(double)); for (i=0; i= LOG_VERB) { printf("Fit SIP:\n"); sip_print(sip); } // FIXME? -- use xlo,xhi,ylo,yhi here?? Not clear. sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); if (log_get_level() >= LOG_VERB) { printf("Fit SIP inverse polynomials:\n"); sip_print(sip); } free(starxyz); } free(rddist); free(radec); return sip; } /** Evaluates the given TAN-TPV WCS header on a grid of points, fitting a SIP distortion solution to it. The grid can be specified by either: double* xy, int Nxy double stepsize=100, double xlo=0, double xhi=0, double ylo=0, double yhi=0 xlo and xhi, if both 0, default to 1. and the WCS width ylo and yhi, if both 0, default to 1. and the WCS height The number of steps is chosen to be the closest step size to split the range xlo to xhi into an integer number of steps. imageW and imageH, if non-zero, override the image width read from the WCS, and ALSO the WCS width/height mentioned above. */ int wcs_pv2sip(const char* wcsinfn, int ext, const char* wcsoutfn, anbool scamp_head_file, double* xy, int Nxy, double stepsize, double xlo, double xhi, double ylo, double yhi, int imageW, int imageH, int order, anbool forcetan, int doshift) { qfits_header* hdr = NULL; sip_t* sip = NULL; int rtn = -1; if (scamp_head_file) { size_t sz = 0; char* txt; char* prefix; int np; int nt; unsigned char* txthdr; sl* lines; int i; txt = file_get_contents(wcsinfn, &sz, TRUE); if (!txt) { ERROR("Failed to read file %s", wcsinfn); goto bailout; } lines = sl_split(NULL, txt, "\n"); prefix = "SIMPLE = T / Standard FITS file " "BITPIX = 8 / ASCII or bytes array " "NAXIS = 0 / Minimal header " "EXTEND = T / There may be FITS ext " "WCSAXES = 2 / "; np = strlen(prefix); nt = np + FITS_LINESZ * sl_size(lines); txthdr = malloc(nt); memset(txthdr, ' ', np + FITS_LINESZ * sl_size(lines)); memcpy(txthdr, prefix, np); for (i=0; i #include #include #include #include "os-features.h" #include "an-bool.h" #include "bl.h" #include "boilerplate.h" #include "wcs-rd2xy.h" #include "anwcs.h" #include "errors.h" #include "log.h" const char* OPTIONS = "hi:o:w:f:R:D:te:r:d:Lv"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w \n" " [-e ] HDU to read (default 0 = primary)\n" " -i \n" " -o \n" " [-f ] (default: all)\n" " [-R -D ]\n" " [-t]: just use TAN projection, even if SIP extension exists\n" " [-L]: force using WCSlib rather than Astrometry.net routines\n" " [-v]: +verbose\n" "You can also just specify a single point to convert (printed to stdout)\n" " [-r ], RA in deg.\n" " [-d ], Dec in deg.\n" "\n", progname); } int main(int argc, char** args) { int c; char* rdlsfn = NULL; char* wcsfn = NULL; char* xylsfn = NULL; char* rcol = NULL; char* dcol = NULL; anbool forcetan = FALSE; il* fields; int ext = 0; double ra=HUGE_VAL, dec=HUGE_VAL; anbool wcslib = FALSE; int loglvl = LOG_MSG; fields = il_new(16); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 'L': wcslib = TRUE; break; case 'r': ra = atof(optarg); break; case 'd': dec = atof(optarg); break; case 'e': ext = atoi(optarg); break; case 'h': print_help(args[0]); exit(0); case 't': forcetan = TRUE; break; case 'o': xylsfn = optarg; break; case 'i': rdlsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'f': il_append(fields, atoi(optarg)); break; case 'R': rcol = optarg; break; case 'D': dcol = optarg; break; } } log_init(loglvl); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(wcsfn && ((rdlsfn && xylsfn) || ((ra != HUGE_VAL) && (dec != HUGE_VAL))))) { print_help(args[0]); exit(-1); } if (!rdlsfn) { double x,y; anwcs_t* wcs = NULL; // read WCS. if (wcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file"); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs, log_get_fid()); } // convert immediately. if (anwcs_radec2pixelxy(wcs, ra, dec, &x, &y)) { ERROR("The given RA,Dec is on the opposite side of the sky."); exit(-1); } printf("RA,Dec (%.10f, %.10f) -> pixel (%.10f, %.10f)\n", ra, dec, x, y); anwcs_free(wcs); exit(0); } if (wcs_rd2xy(wcsfn, ext, rdlsfn, xylsfn, rcol, dcol, forcetan, wcslib, fields)) { ERROR("wcs-rd2xy failed"); exit(-1); } return 0; } astrometry.net-0.67/util/wcs-rd2xy.c000644 000765 000024 00000006451 12651445460 017557 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "anwcs.h" #include "an-bool.h" #include "starutil.h" #include "bl.h" #include "xylist.h" #include "rdlist.h" #include "errors.h" int wcs_rd2xy(const char* wcsfn, int wcsext, const char* rdlsfn, const char* xylsfn, const char* racol, const char* deccol, int forcetan, int forcewcslib, il* fields) { xylist_t* xyls = NULL; rdlist_t* rdls = NULL; anwcs_t* wcs = NULL; int i; anbool alloced_fields = FALSE; int rtn = -1; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, wcsext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, wcsext); } else { wcs = anwcs_open(wcsfn, wcsext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, wcsext); return -1; } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { ERROR("Failed to read an RA,Dec list from file %s", rdlsfn); goto bailout; } if (racol) rdlist_set_raname(rdls, racol); if (deccol) rdlist_set_decname(rdls, deccol); // write XYLS. xyls = xylist_open_for_writing(xylsfn); if (!xyls) { ERROR("Failed to open file %s to write XYLS", xylsfn); goto bailout; } if (xylist_write_primary_header(xyls)) { ERROR("Failed to write header to XYLS file %s", xylsfn); goto bailout; } if (!fields) { alloced_fields = TRUE; fields = il_new(16); } if (!il_size(fields)) { // add all fields. int NF = rdlist_n_fields(rdls); for (i=1; i<=NF; i++) il_append(fields, i); } for (i=0; i #include #include #include #include #include "wcs-resample.h" #include "sip_qfits.h" #include "starutil.h" #include "bl.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "fitsioutils.h" const char* OPTIONS = "hw:e:E:x:L:z"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] \n" " [-E ] (default: 0)\n" " [-w ] (default is to read WCS from input FITS image)\n" " [-e ] (default: 0)\n" " [-x ] (default: 0)\n" " [-L ] (default: nearest-neighbor resampling)\n" " [-z]: zero out inf/nan input image value\n" "\n", progname); } int main(int argc, char** args) { int c; char* inwcsfn = NULL; char* outwcsfn = NULL; char* infitsfn = NULL; char* outfitsfn = NULL; int inwcsext = 0; int inimgext = 0; int outwcsext = 0; int Lorder = 0; int zinf; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'w': inwcsfn = optarg; break; case 'e': inwcsext = atoi(optarg); break; case 'E': inimgext = atoi(optarg); break; case 'x': outwcsext = atoi(optarg); break; case 'L': Lorder = atoi(optarg); break; case 'z': zinf = 1; break; } } log_init(LOG_MSG); fits_use_error_system(); if (optind != argc - 3) { print_help(args[0]); exit(-1); } infitsfn = args[optind+0]; outwcsfn = args[optind+1]; outfitsfn = args[optind+2]; if (!inwcsfn) inwcsfn = infitsfn; if (resample_wcs_files(infitsfn, inimgext, inwcsfn, inwcsext, outwcsfn, outwcsext, outfitsfn, Lorder, zinf)) { ERROR("Failed to resample image"); exit(-1); } return 0; } astrometry.net-0.67/util/wcs-resample.c000644 000765 000024 00000021457 12651445460 020322 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "wcs-resample.h" #include "sip_qfits.h" #include "an-bool.h" #include "anqfits.h" #include "starutil.h" #include "bl.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "fitsioutils.h" #include "anwcs.h" #include "resample.h" int resample_wcs_files(const char* infitsfn, int infitsext, const char* inwcsfn, int inwcsext, const char* outwcsfn, int outwcsext, const char* outfitsfn, int lorder, int zero_inf) { anwcs_t* inwcs; anwcs_t* outwcs; anqfits_t* anqin; qfitsdumper qoutimg; float* inimg; float* outimg; qfits_header* hdr; int outW, outH; int inW, inH; double outpixmin, outpixmax; // read input WCS. inwcs = anwcs_open(inwcsfn, inwcsext); if (!inwcs) { ERROR("Failed to parse WCS header from %s extension %i", inwcsfn, inwcsext); return -1; } logmsg("Read input WCS from file \"%s\" ext %i\n", inwcsfn, inwcsext); anwcs_print(inwcs, stdout); // read output WCS. outwcs = anwcs_open(outwcsfn, outwcsext); if (!outwcs) { ERROR("Failed to parse WCS header from %s extension %i", outwcsfn, outwcsext); return -1; } logmsg("Read output (target) WCS from file \"%s\" ext %i\n", outwcsfn, outwcsext); anwcs_print(outwcs, stdout); outW = anwcs_imagew(outwcs); outH = anwcs_imageh(outwcs); // read input image. anqin = anqfits_open(infitsfn); if (!anqin) { ERROR("Failed to open \"%s\"", infitsfn); return -1; } inimg = (float*)anqfits_readpix(anqin, infitsext, 0, 0, 0, 0, 0, PTYPE_FLOAT, NULL, &inW, &inH); anqfits_close(anqin); anqin = NULL; if (!inimg) { ERROR("Failed to read pixels from \"%s\"", infitsfn); return -1; } if (zero_inf) { int i; for (i=0; i<(inW*inH); i++) { if (!isfinite(inimg[i])) { inimg[i] = 0.0; } } } logmsg("Input image is %i x %i pixels.\n", inW, inH); logmsg("Output image is %i x %i pixels.\n", outW, outH); outimg = calloc(outW * outH, sizeof(float)); if (resample_wcs(inwcs, inimg, inW, inH, outwcs, outimg, outW, outH, 1, lorder)) { ERROR("Failed to resample"); return -1; } { double pmin, pmax; int i; /* pmin = HUGE_VAL; pmax = -HUGE_VAL; for (i=0; i<(inW*inH); i++) { pmin = MIN(pmin, inimg[i]); pmax = MAX(pmax, inimg[i]); } logmsg("Input image bounds: %g to %g\n", pmin, pmax); */ pmin = HUGE_VAL; pmax = -HUGE_VAL; for (i=0; i<(outW*outH); i++) { pmin = MIN(pmin, outimg[i]); pmax = MAX(pmax, outimg[i]); } logmsg("Output image bounds: %g to %g\n", pmin, pmax); outpixmin = pmin; outpixmax = pmax; } // prepare output image. memset(&qoutimg, 0, sizeof(qoutimg)); qoutimg.filename = outfitsfn; qoutimg.npix = outW * outH; qoutimg.ptype = PTYPE_FLOAT; qoutimg.fbuf = outimg; qoutimg.out_ptype = BPP_IEEE_FLOAT; hdr = fits_get_header_for_image(&qoutimg, outW, NULL); anwcs_add_to_header(outwcs, hdr); fits_header_add_double(hdr, "DATAMIN", outpixmin, "min pixel value"); fits_header_add_double(hdr, "DATAMAX", outpixmax, "max pixel value"); if (fits_write_header_and_image(hdr, &qoutimg, 0)) { ERROR("Failed to write image to file \"%s\"", outfitsfn); return -1; } free(outimg); qfits_header_destroy(hdr); anwcs_free(inwcs); anwcs_free(outwcs); return 0; } // Check whether output pixels overlap with input pixels, // on a grid of output pixel positions. static anbool* find_overlap_grid(int B, int outW, int outH, const anwcs_t* outwcs, const anwcs_t* inwcs, int* pBW, int* pBH) { int BW, BH; anbool* bib = NULL; anbool* bib2 = NULL; int i,j; BW = (int)ceil(outW / (float)B); BH = (int)ceil(outH / (float)B); bib = calloc(BW*BH, sizeof(anbool)); for (i=0; i= LOG_VERB) { logverb("Input image overlaps output image:\n"); for (i=0; i= LOG_VERB) { logverb("After growing:\n"); for (i=0; i= W) || (xmax < 0) || (ymin >= H) || (ymax < 0)) { logverb("No overlap between input and output images\n"); return 0; } ilo = MAX(0, xmin); ihi = MIN(W, xmax); jlo = MAX(0, ymin); jhi = MIN(H, ymax); //logverb("Clipped resampling output box to [%i,%i], [%i,%i]\n", //ilo,ihi,jlo,jhi); } } for (j=jlo; j= inW || y < 0 || y >= inH) continue; pix = inimg[y * inW + x]; } else { if (inx < (-lorder) || inx >= (inW+lorder) || iny < (-lorder) || iny >= (inH+lorder)) continue; pix = lanczos_resample_unw_sep_f(inx, iny, inimg, inW, inH, &largs); } outimg[j * outW + i] = pix; } } return 0; } int resample_wcs_rgba(const anwcs_t* inwcs, const unsigned char* inimg, int inW, int inH, const anwcs_t* outwcs, unsigned char* outimg, int outW, int outH) { int i,j; int B = 20; int BW, BH; anbool* bib; int bi,bj; bib = find_overlap_grid(B, outW, outH, outwcs, inwcs, &BW, &BH); // We've expanded the in-bounds boxes by 1 in each direction, // so this (using the lower-left corner) should be ok. for (bj=0; bj= inW || y < 0 || y >= inH) continue; // HACK -- straight copy outimg[4 * (j * outW + i) + 0] = inimg[4 * (y * inW + x) + 0]; outimg[4 * (j * outW + i) + 1] = inimg[4 * (y * inW + x) + 1]; outimg[4 * (j * outW + i) + 2] = inimg[4 * (y * inW + x) + 2]; outimg[4 * (j * outW + i) + 3] = inimg[4 * (y * inW + x) + 3]; } } } } free(bib); return 0; } astrometry.net-0.67/util/wcs-resample.h000644 000765 000024 00000001423 12651445460 020316 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef WCS_RESAMPLE_H #define WCS_RESAMPLE_H #include "anwcs.h" int resample_wcs_files(const char* infitsfn, int infitsext, const char* inwcsfn, int inwcsext, const char* outwcsfn, int outwcsext, const char* outfitsfn, int lanczos_order, int zero_inf); int resample_wcs(const anwcs_t* inwcs, const float* inimg, int inW, int inH, const anwcs_t* outwcs, float* outimg, int outW, int outH, int weighted, int lanczos_order); int resample_wcs_rgba(const anwcs_t* inwcs, const unsigned char* inimg, int inW, int inH, const anwcs_t* outwcs, unsigned char* outimg, int outW, int outH); #endif astrometry.net-0.67/util/wcs-to-tan.c000644 000765 000024 00000007771 12651445460 017717 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "os-features.h" #include "starutil.h" #include "mathutil.h" #include "fit-wcs.h" #include "xylist.h" #include "rdlist.h" #include "boilerplate.h" #include "sip.h" #include "sip_qfits.h" #include "fitsioutils.h" #include "anwcs.h" #include "log.h" #include "errors.h" static const char* OPTIONS = "hw:e:tLx:y:W:H:N:o:v"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w \n" " [-e ] FITS HDU number to read WCS from (default 0 = primary)\n" " [-t]: just use TAN projection, even if SIP extension exists.\n" " [-L]: force WCSlib\n" " [-x x-lo]\n" " [-y y-lo]\n" " [-W x-hi]\n" " [-H y-hi]\n" " [-N grid-n]\n" " -o \n" " [-v]: verbose\n" "\n", progname); } int main(int argc, char** args) { int c; char* wcsfn = NULL; char* outfn = NULL; int ext = 0; anbool forcetan = FALSE; anbool forcewcslib = FALSE; double xlo = 1; double ylo = 1; double xhi = HUGE_VAL; double yhi = HUGE_VAL; int N = 20; double* xyz = NULL; double* xy = NULL; tan_t outwcs; anwcs_t* inwcs = NULL; int i, j; double xstep, ystep; int loglvl = LOG_MSG; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'w': wcsfn = optarg; break; case 'L': forcewcslib = TRUE; break; case 't': forcetan = TRUE; break; case 'o': outfn = optarg; break; case 'e': ext = atoi(optarg); break; case 'N': N = atoi(optarg); break; case 'x': xlo = atof(optarg); break; case 'y': ylo = atof(optarg); break; case 'W': xhi = atof(optarg); break; case 'H': yhi = atof(optarg); break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!wcsfn || !outfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to read WCS header from \"%s\" ext %i...\n", wcsfn, ext); if (forcewcslib) { inwcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcetan) { inwcs = anwcs_open_tan(wcsfn, ext); } else { inwcs = anwcs_open(wcsfn, ext); } if (!inwcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, ext); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(inwcs, log_get_fid()); } if (xhi == HUGE_VAL) { xhi = anwcs_imagew(inwcs); logverb("Setting image width to %g\n", xhi); } if (yhi == HUGE_VAL) { yhi = anwcs_imageh(inwcs); logverb("Setting image height to %g\n", yhi); } // FIXME -- what if the user wants xhi or yhi == 0? if (xhi == HUGE_VAL || xhi == 0) { ERROR("Couldn't find the image size; please supply -W\n"); exit(-1); } if (yhi == HUGE_VAL || yhi == 0) { ERROR("Couldn't find the image size; please supply -H\n"); exit(-1); } xstep = (xhi - xlo) / (N-1); ystep = (yhi - ylo) / (N-1); logverb("Evaluating WCS on a grid of %i x %i in X [%g,%g], Y [%g,%g]\n", N, N, xlo, xhi, ylo, yhi); xyz = (double*)malloc(sizeof(double) * 3 * N*N); xy = (double*)malloc(sizeof(double) * 2 * N*N); if (!xyz || !xy) { ERROR("Failed to allocate %i xyz, xy coords", N*N); exit(-1); } for (j=0; j #include #include #include #include "os-features.h" #include "an-bool.h" #include "bl.h" #include "boilerplate.h" #include "wcs-rd2xy.h" #include "starutil.h" #include "anwcs.h" #include "errors.h" #include "wcs-xy2rd.h" #include "log.h" const char* OPTIONS = "hi:o:w:f:R:D:te:x:y:X:Y:LTvs"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w \n" " [-e ] FITS HDU number to read WCS from (default 0 = primary)\n" " [-t]: just use TAN projection, even if SIP extension exists.\n" " [-L]: force WCSlib\n" " [-T]: force WCStools\n" " [-s]: print sexigesimal too\n" " -i \n" " -o \n" " [-f ] (default: all)\n" " [-X -Y ]\n" " [-v]: +verbose\n" "\n" "You can also specify a single point to convert (result is printed to stdout):\n" " [-x ]\n" " [-y ]\n" "\n", progname); } int main(int argc, char** args) { int c; char* rdlsfn = NULL; char* wcsfn = NULL; char* xylsfn = NULL; char* xcol = NULL; char* ycol = NULL; anbool forcetan = FALSE; anbool forcewcslib = FALSE; anbool forcewcstools = FALSE; anbool printhms = FALSE; il* fields; int ext = 0; double x, y; int loglvl = LOG_MSG; x = y = HUGE_VAL; fields = il_new(16); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 's': printhms = TRUE; break; case 'L': forcewcslib = TRUE; break; case 'T': forcewcstools = TRUE; break; case 'x': x = atof(optarg); break; case 'y': y = atof(optarg); break; case 'e': ext = atoi(optarg); break; case 'h': print_help(args[0]); exit(0); case 't': forcetan = TRUE; break; case 'o': rdlsfn = optarg; break; case 'i': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'f': il_append(fields, atoi(optarg)); break; case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; } } log_init(loglvl); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(wcsfn && ((rdlsfn && xylsfn) || ((x != HUGE_VAL) && (y != HUGE_VAL))))) { print_help(args[0]); exit(-1); } if (!xylsfn) { double ra,dec; anwcs_t* wcs = NULL; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcewcstools) { wcs = anwcs_open_wcstools(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, ext); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs, log_get_fid()); } // convert immediately. anwcs_pixelxy2radec(wcs, x, y, &ra, &dec); printf("Pixel (%.10f, %.10f) -> RA,Dec (%.10f, %.10f)\n", x, y, ra, dec); if (printhms) { char str[32]; ra2hmsstring(ra, str); printf(" RA,Dec (%20s, ", str); dec2dmsstring(dec, str); printf("%20s)\n", str); } anwcs_free(wcs); exit(0); } if (wcs_xy2rd(wcsfn, ext, xylsfn, rdlsfn, xcol, ycol, forcetan, forcewcslib, fields)) { ERROR("wcs-xy2rd failed"); exit(-1); } return 0; } astrometry.net-0.67/util/wcs-xy2rd.c000644 000765 000024 00000006431 12651445460 017555 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "anwcs.h" #include "an-bool.h" #include "starutil.h" #include "bl.h" #include "xylist.h" #include "rdlist.h" #include "boilerplate.h" #include "errors.h" #include "log.h" int wcs_xy2rd(const char* wcsfn, int ext, const char* xylsfn, const char* rdlsfn, const char* xcol, const char* ycol, int forcetan, int forcewcslib, il* fields) { rdlist_t* rdls = NULL; xylist_t* xyls = NULL; anwcs_t* wcs = NULL; int i; int rtn = -1; anbool alloced_fields = FALSE; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, ext); return -1; } // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { ERROR("Failed to read an xylist from file %s", xylsfn); goto bailout; } xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); if (xcol) xylist_set_xname(xyls, xcol); if (ycol) xylist_set_yname(xyls, ycol); // write RDLS. rdls = rdlist_open_for_writing(rdlsfn); if (!rdls) { ERROR("Failed to open file %s to write RDLS.\n", rdlsfn); goto bailout; } if (rdlist_write_primary_header(rdls)) { ERROR("Failed to write header to RDLS file %s.\n", rdlsfn); goto bailout; } if (!fields) { alloced_fields = TRUE; fields = il_new(16); } if (!il_size(fields)) { // add all fields. int NF = xylist_n_fields(xyls); for (i=1; i<=NF; i++) il_append(fields, i); } logverb("Processing %zu extensions...\n", il_size(fields)); for (i=0; i #include #include #include #include #include "os-features.h" #include "sip.h" #include "sip-utils.h" #include "sip_qfits.h" #include "starutil.h" #include "mathutil.h" #include "boilerplate.h" #include "errors.h" const char* OPTIONS = "he:W:H:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "\nUsage: %s [options] \n" " [-e ] Read from given HDU (default 0 = primary)\n" " [-W ] Set/override IMAGEW\n" " [-H ] Set/override IMAGEH\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* progname = args[0]; char** inputfiles = NULL; int ninputfiles = 0; int ext = 0; sip_t wcs; double imw=0, imh=0; double rac, decc; double det, parity, orient, orientc; int rah, ram, decsign, decd, decm; double ras, decs; char* units; double pixscale; double fldw, fldh; double ramin, ramax, decmin, decmax; double mxlo, mxhi, mylo, myhi; double dm; int merczoom; char rastr[32]; char decstr[32]; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 'e': ext = atoi(optarg); break; case 'W': imw = atof(optarg); break; case 'H': imh = atof(optarg); break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { ninputfiles = argc - optind; inputfiles = args + optind; } if (ninputfiles != 1) { printHelp(progname); exit(-1); } if (!sip_read_header_file_ext(inputfiles[0], ext, &wcs)) { ERROR("failed to read WCS header from file %s, extension %i", inputfiles[0], ext); return -1; } if (imw == 0) imw = wcs.wcstan.imagew; if (imh == 0) imh = wcs.wcstan.imageh; if ((imw == 0.0) || (imh == 0.0)) { ERROR("failed to find IMAGE{W,H} in WCS file"); return -1; } // If W,H were set on the cmdline... if (wcs.wcstan.imagew == 0) wcs.wcstan.imagew = imw; if (wcs.wcstan.imageh == 0) wcs.wcstan.imageh = imh; printf("crpix0 %.12g\n", wcs.wcstan.crpix[0]); printf("crpix1 %.12g\n", wcs.wcstan.crpix[1]); printf("crval0 %.12g\n", wcs.wcstan.crval[0]); printf("crval1 %.12g\n", wcs.wcstan.crval[1]); printf("ra_tangent %.12g\n", wcs.wcstan.crval[0]); printf("dec_tangent %.12g\n", wcs.wcstan.crval[1]); printf("pixx_tangent %.12g\n", wcs.wcstan.crpix[0]); printf("pixy_tangent %.12g\n", wcs.wcstan.crpix[1]); printf("imagew %.12g\n", imw); printf("imageh %.12g\n", imh); printf("cd11 %.12g\n", wcs.wcstan.cd[0][0]); printf("cd12 %.12g\n", wcs.wcstan.cd[0][1]); printf("cd21 %.12g\n", wcs.wcstan.cd[1][0]); printf("cd22 %.12g\n", wcs.wcstan.cd[1][1]); det = sip_det_cd(&wcs); parity = (det >= 0 ? 1.0 : -1.0); pixscale = sip_pixel_scale(&wcs); printf("det %.12g\n", det); printf("parity %i\n", (int)parity); printf("pixscale %.12g\n", pixscale); orient = sip_get_orientation(&wcs); printf("orientation %.8g\n", orient); sip_get_radec_center(&wcs, &rac, &decc); printf("ra_center %.12g\n", rac); printf("dec_center %.12g\n", decc); // contributed by Rob Johnson, user rob at the domain whim.org, Nov 13, 2009 orientc = orient + rad2deg(atan(tan(deg2rad(rac - wcs.wcstan.crval[0])) * sin(deg2rad(wcs.wcstan.crval[1])))); printf("orientation_center %.8g\n", orientc); sip_get_radec_center_hms(&wcs, &rah, &ram, &ras, &decsign, &decd, &decm, &decs); printf("ra_center_h %i\n", rah); printf("ra_center_m %i\n", ram); printf("ra_center_s %.12g\n", ras); printf("dec_center_sign %i\n", decsign); printf("dec_center_d %i\n", decd); printf("dec_center_m %i\n", decm); printf("dec_center_s %.12g\n", decs); sip_get_radec_center_hms_string(&wcs, rastr, decstr); printf("ra_center_hms %s\n", rastr); printf("dec_center_dms %s\n", decstr); // mercator printf("ra_center_merc %.8g\n", ra2mercx(rac)); printf("dec_center_merc %.8g\n", dec2mercy(decc)); fldw = imw * pixscale; fldh = imh * pixscale; // area of the field, in square degrees. printf("fieldarea %g\n", (arcsec2deg(fldw) * arcsec2deg(fldh))); sip_get_field_size(&wcs, &fldw, &fldh, &units); printf("fieldw %.4g\n", fldw); printf("fieldh %.4g\n", fldh); printf("fieldunits %s\n", units); sip_get_radec_bounds(&wcs, 10, &ramin, &ramax, &decmin, &decmax); printf("decmin %g\n", decmin); printf("decmax %g\n", decmax); printf("ramin %g\n", ramin); printf("ramax %g\n", ramax); // merc zoom level mxlo = ra2mercx(ramax); mxhi = ra2mercx(ramin); mylo = dec2mercy(decmax); myhi = dec2mercy(decmin); printf("ra_min_merc %g\n", mxlo); printf("ra_max_merc %g\n", mxhi); printf("dec_min_merc %g\n", mylo); printf("dec_max_merc %g\n", myhi); dm = MAX(fabs(mxlo - mxhi), fabs(mylo - myhi)); printf("merc_diff %g\n", dm); merczoom = 0 - (int)floor(log(dm) / log(2.0)); printf("merczoom %i\n", merczoom); return 0; } astrometry.net-0.67/util/xylist.c000644 000765 000024 00000027472 12651445460 017257 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "qfits_header.h" #include "xylist.h" #include "fitstable.h" #include "fitsioutils.h" #include "an-bool.h" #include "keywords.h" static anbool is_writing(xylist_t* ls) { return (ls->table && ls->table->fid) ? TRUE : FALSE; } static anbool is_reading(xylist_t* ls) { return !is_writing(ls); } int xylist_get_imagew(xylist_t* ls) { int W; qfits_header* hdr = xylist_get_header(ls); W = qfits_header_getint(hdr, "IMAGEW", 0); if (!W) { // some axy's have IMAGEW/H only in the primary hdr... hdr = xylist_get_primary_header(ls); W = qfits_header_getint(hdr, "IMAGEW", 0); } return W; } int xylist_get_imageh(xylist_t* ls) { qfits_header* hdr = xylist_get_header(ls); int H; H = qfits_header_getint(hdr, "IMAGEH", 0); if (!H) { // some axy's have IMAGEW/H only in the primary hdr... hdr = xylist_get_primary_header(ls); H = qfits_header_getint(hdr, "IMAGEH", 0); } return H; } anbool xylist_is_file_xylist(const char* fn, int ext, const char* xcolumn, const char* ycolumn, char** reason) { int rtn; xylist_t* xyls; err_t* err; errors_push_state(); err = errors_get_state(); err->print = NULL; err->save = TRUE; xyls = xylist_open(fn); if (!xyls) { goto bail; } if (fitstable_n_extensions(xyls->table) < 2) { ERROR("FITS file does not have any extensions"); goto bail; } if (ext) { if (xylist_open_extension(xyls, ext)) { ERROR("Failed to open xylist extension %i", ext); goto bail; } } else { ext = 1; } if (xcolumn) xylist_set_xname(xyls, xcolumn); if (ycolumn) xylist_set_yname(xyls, ycolumn); fitstable_add_read_column_struct(xyls->table, fitscolumn_double_type(), 1, 0, fitscolumn_any_type(), xyls->xname, TRUE); fitstable_add_read_column_struct(xyls->table, fitscolumn_double_type(), 1, 0, fitscolumn_any_type(), xyls->yname, TRUE); rtn = fitstable_read_extension(xyls->table, ext); if (rtn) fitstable_error_report_missing(xyls->table); xylist_close(xyls); if (rtn) goto bail; errors_pop_state(); return TRUE; bail: if (reason) *reason = error_get_errs(err, ": "); errors_pop_state(); return FALSE; } static xylist_t* xylist_new() { xylist_t* xy = calloc(1, sizeof(xylist_t)); xy->xname = "X"; xy->yname = "Y"; xy->xtype = TFITS_BIN_TYPE_D; xy->ytype = TFITS_BIN_TYPE_D; return xy; } xylist_t* xylist_open(const char* fn) { qfits_header* hdr; xylist_t* ls = NULL; ls = xylist_new(); if (!ls) { ERROR("Failed to allocate xylist"); return NULL; } ls->table = fitstable_open_mixed(fn); if (!ls->table) { ERROR("Failed to open FITS table %s", fn); free(ls); return NULL; } ls->table->extension = 1; hdr = fitstable_get_primary_header(ls->table); ls->antype = fits_get_dupstring(hdr, "AN_FILE"); // not including primary extension... ls->nfields = fitstable_n_extensions(ls->table) - 1; ls->include_flux = TRUE; ls->include_background = TRUE; assert(is_reading(ls)); return ls; } xylist_t* xylist_open_for_writing(const char* fn) { xylist_t* ls; qfits_header* hdr; ls = xylist_new(); if (!ls) { ERROR("Failed to allocate xylist"); return NULL; } ls->table = fitstable_open_for_writing(fn); if (!ls->table) { ERROR("Failed to open FITS table for writing"); free(ls); return NULL; } // since we have to call xylist_next_field() before writing the first one... ls->table->extension = 0; xylist_set_antype(ls, AN_FILETYPE_XYLS); hdr = fitstable_get_primary_header(ls->table); qfits_header_add(hdr, "AN_FILE", ls->antype, "Astrometry.net file type", NULL); assert(is_writing(ls)); return ls; } int xylist_add_tagalong_column(xylist_t* ls, tfits_type c_type, int arraysize, tfits_type fits_type, const char* name, const char* units) { assert(is_writing(ls)); fitstable_add_write_column_struct(ls->table, c_type, arraysize, 0, fits_type, name, units); return fitstable_ncols(ls->table) - 1; } int xylist_write_tagalong_column(xylist_t* ls, int colnum, int offset, int N, void* data, int datastride) { assert(is_writing(ls)); return fitstable_write_one_column(ls->table, colnum, offset, N, data, datastride); } void* xylist_read_tagalong_column(xylist_t* ls, const char* colname, tfits_type c_type) { assert(is_reading(ls)); return fitstable_read_column_array(ls->table, colname, c_type); } sl* xylist_get_tagalong_column_names(xylist_t* ls, sl* lst) { char* x; char* y; assert(is_reading(ls)); lst = fitstable_get_fits_column_names(ls->table, lst); x = sl_remove_string_bycaseval(lst, ls->xname); y = sl_remove_string_bycaseval(lst, ls->yname); free(x); free(y); return lst; } void xylist_set_antype(xylist_t* ls, const char* type) { free(ls->antype); ls->antype = strdup(type); } int xylist_close(xylist_t* ls) { int rtn = 0; if (ls->table) { if (fitstable_close(ls->table)) { ERROR("Failed to close xylist table"); rtn = -1; } } free(ls->antype); free(ls); return rtn; } void xylist_set_xname(xylist_t* ls, const char* name) { ls->xname = name; } void xylist_set_yname(xylist_t* ls, const char* name) { ls->yname = name; } void xylist_set_xtype(xylist_t* ls, tfits_type type) { ls->xtype = type; } void xylist_set_ytype(xylist_t* ls, tfits_type type) { ls->ytype = type; } void xylist_set_xunits(xylist_t* ls, const char* units) { ls->xunits = units; } void xylist_set_yunits(xylist_t* ls, const char* units) { ls->yunits = units; } void xylist_set_include_flux(xylist_t* ls, anbool inc) { ls->include_flux = inc; } void xylist_set_include_background(xylist_t* ls, anbool inc) { ls->include_background = inc; } int xylist_n_fields(xylist_t* ls) { return ls->nfields; } int xylist_write_one_row(xylist_t* ls, starxy_t* fld, int row) { // FIXME -- does this work if you're using background but not flux? assert(is_writing(ls)); return fitstable_write_row(ls->table, fld->x + row, fld->y + row, ls->include_flux ? fld->flux + row : NULL, ls->include_background ? fld->background + row : NULL); } int xylist_write_one_row_data(xylist_t* ls, double x, double y, double flux, double bg) { assert(is_writing(ls)); return fitstable_write_row(ls->table, &x, &y, ls->include_flux ? &flux : NULL, ls->include_background ? &bg : NULL); } int xylist_write_field(xylist_t* ls, starxy_t* fld) { int i; assert(is_writing(ls)); assert(fld); for (i=0; iN; i++) { if (fitstable_write_row(ls->table, fld->x + i, fld->y + i, ls->include_flux ? fld->flux + i : NULL, ls->include_background ? fld->background + i : NULL)) return -1; } return 0; } starxy_t* xylist_read_field(xylist_t* ls, starxy_t* fld) { anbool freeit = FALSE; tfits_type dubl = fitscolumn_double_type(); assert(is_reading(ls)); if (!ls->table->table) xylist_open_field(ls, ls->table->extension); if (!ls->table->table) { // FITS table not found. return NULL; } if (!fld) { fld = calloc(1, sizeof(starxy_t)); freeit = TRUE; } fld->N = fitstable_nrows(ls->table); fld->x = fitstable_read_column(ls->table, ls->xname, dubl); fld->y = fitstable_read_column(ls->table, ls->yname, dubl); if (ls->include_flux) fld->flux = fitstable_read_column(ls->table, "FLUX", dubl); else fld->flux = NULL; if (ls->include_background) fld->background = fitstable_read_column(ls->table, "BACKGROUND", dubl); else fld->background = NULL; if (!(fld->x && fld->y)) { free(fld->x); free(fld->y); free(fld->flux); free(fld->background); if (freeit) free(fld); return NULL; } return fld; } starxy_t* xylist_read_field_num(xylist_t* ls, int ext, starxy_t* fld) { starxy_t* rtn; assert(is_reading(ls)); if (xylist_open_field(ls, ext)) { ERROR("Failed to open field %i from xylist", ext); return NULL; } rtn = xylist_read_field(ls, fld); if (!rtn) ERROR("Failed to read field %i from xylist", ext); return rtn; } int xylist_open_field(xylist_t* ls, int i) { return fitstable_open_extension(ls->table, i); } int xylist_open_extension(xylist_t* ls, int i) { return fitstable_open_extension(ls->table, i); } /* Used for both reading and writing. --when writing: start a new field. Set up the table and header structures so that they can be added to before writing the field header. --when reading: move on to the next extension. */ int xylist_next_field(xylist_t* ls) { if (is_writing(ls)) { fitstable_next_extension(ls->table); fitstable_clear_table(ls->table); ls->nfields++; } else { int rtn = fitstable_open_next_extension(ls->table); //int rtn = fitstable_open_extension(ls->table, ls->table->extension); if (rtn) return rtn; } return 0; } qfits_header* xylist_get_primary_header(xylist_t* ls) { qfits_header* hdr; hdr = fitstable_get_primary_header(ls->table); // ?? qfits_header_mod(hdr, "AN_FILE", ls->antype, "Astrometry.net file type"); return hdr; } qfits_header* xylist_get_header(xylist_t* ls) { if (is_writing(ls) && !ls->table->header) { fitstable_add_write_column_convert(ls->table, ls->xtype, fitscolumn_double_type(), ls->xname, ls->xunits); fitstable_add_write_column_convert(ls->table, ls->ytype, fitscolumn_double_type(), ls->yname, ls->yunits); if (ls->include_flux) fitstable_add_write_column_convert(ls->table, fitscolumn_double_type(), fitscolumn_double_type(), "FLUX", "fluxunits"); if (ls->include_background) fitstable_add_write_column_convert(ls->table, fitscolumn_double_type(), fitscolumn_double_type(), "BACKGROUND", "fluxunits"); fitstable_new_table(ls->table); } if (is_reading(ls) && !ls->table->header) xylist_open_field(ls, ls->table->extension); return fitstable_get_header(ls->table); } int xylist_write_primary_header(xylist_t* ls) { assert(is_writing(ls)); // ensure we've added the AN_FILE header... xylist_get_primary_header(ls); return fitstable_write_primary_header(ls->table); } int xylist_fix_primary_header(xylist_t* ls) { assert(is_writing(ls)); return fitstable_fix_primary_header(ls->table); } int xylist_write_header(xylist_t* ls) { assert(is_writing(ls)); // ensure we've added our columns to the table... xylist_get_header(ls); return fitstable_write_header(ls->table); } int xylist_fix_header(xylist_t* ls) { assert(is_writing(ls)); return fitstable_fix_header(ls->table); } astrometry.net-0.67/sdss/__init__.py000644 000765 000024 00000000670 12651445460 017656 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from .dr7 import DR7 from .dr8 import DR8 from .dr9 import DR9 from .dr10 import DR10 from .common import band_name, band_index, band_names, cas_flags from .common import photo_flags1_info, photo_flags2_info, photo_flags1_map, photo_flags2_map from .common import munu_to_radec_deg, AsTransWrapper, AsTrans from .fields import * astrometry.net-0.67/sdss/common.py000644 000765 000024 00000121675 12651445460 017420 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from __future__ import print_function import os from astrometry.util.fits import fits_table from astrometry.util.miscutils import get_overlapping_region import numpy as np try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") try: import cutils except: cutils = None cas_flags = dict( CANONICAL_CENTER = 0x0000000000000001, BRIGHT = 0x0000000000000002, EDGE = 0x0000000000000004, BLENDED = 0x0000000000000008, CHILD = 0x0000000000000010, PEAKCENTER = 0x0000000000000020, NODEBLEND = 0x0000000000000040, NOPROFILE = 0x0000000000000080, NOPETRO = 0x0000000000000100, MANYPETRO = 0x0000000000000200, NOPETRO_BIG = 0x0000000000000400, DEBLEND_TOO_MANY_PEAKS = 0x0000000000000800, COSMIC_RAY = 0x0000000000001000, MANYR50 = 0x0000000000002000, MANYR90 = 0x0000000000004000, BAD_RADIAL = 0x0000000000008000, INCOMPLETE_PROFILE = 0x0000000000010000, INTERP = 0x0000000000020000, SATURATED = 0x0000000000040000, NOTCHECKED = 0x0000000000080000, SUBTRACTED = 0x0000000000100000, NOSTOKES = 0x0000000000200000, BADSKY = 0x0000000000400000, PETROFAINT = 0x0000000000800000, TOO_LARGE = 0x0000000001000000, DEBLENDED_AS_PSF = 0x0000000002000000, DEBLEND_PRUNED = 0x0000000004000000, ELLIPFAINT = 0x0000000008000000, BINNED1 = 0x0000000010000000, BINNED2 = 0x0000000020000000, BINNED4 = 0x0000000040000000, MOVED = 0x0000000080000000, DEBLENDED_AS_MOVING = 0x0000000100000000, NODEBLEND_MOVING = 0x0000000200000000, TOO_FEW_DETECTIONS = 0x0000000400000000, BAD_MOVING_FIT = 0x0000000800000000, STATIONARY = 0x0000001000000000, PEAKS_TOO_CLOSE = 0x0000002000000000, MEDIAN_CENTER = 0x0000004000000000, LOCAL_EDGE = 0x0000008000000000, BAD_COUNTS_ERROR = 0x0000010000000000, BAD_MOVING_FIT_CHILD = 0x0000020000000000, DEBLEND_UNASSIGNED_FLUX = 0x0000040000000000, SATUR_CENTER = 0x0000080000000000, INTERP_CENTER = 0x0000100000000000, DEBLENDED_AT_EDGE = 0x0000200000000000, DEBLEND_NOPEAK = 0x0000400000000000, PSF_FLUX_INTERP = 0x0000800000000000, TOO_FEW_GOOD_DETECTIONS = 0x0001000000000000, CENTER_OFF_AIMAGE = 0x0002000000000000, DEBLEND_DEGENERATE = 0x0004000000000000, BRIGHTEST_GALAXY_CHILD = 0x0008000000000000, CANONICAL_BAND = 0x0010000000000000, AMOMENT_FAINT = 0x0020000000000000, AMOMENT_SHIFT = 0x0040000000000000, AMOMENT_MAXITER = 0x0080000000000000, MAYBE_CR = 0x0100000000000000, MAYBE_EGHOST = 0x0200000000000000, NOTCHECKED_CENTER = 0x0400000000000000, OBJECT2_HAS_SATUR_DN = 0x0800000000000000, OBJECT2_DEBLEND_PEEPHOLE = 0x1000000000000000, GROWN_MERGED = 0x2000000000000000, HAS_CENTER = 0x4000000000000000, RESERVED = 0x8000000000000000, ) # From: # http://www.sdss3.org/svn/repo/idlutils/trunk/data/sdss/sdssMaskbits.par # via # s = open('sdssMaskbits.par').read() # bits = [] # for line in s.split('\n'): # sp = line.split() # line = (int(sp[2]), sp[3], ' '.join(sp[4:])) # bits.append(line) # print repr(bits).replace('), ', '),\n ') # photo_flags1_info = [ # masktype OBJECT1 32 "Object flags from photo reductions for SDSS (first 32)" (0, 'CANONICAL_CENTER', '"The quantities (psf counts, model fits and likelihoods) that are usually determined at an object\'s center as determined band-by-band were in fact determined at the canonical center (suitably transformed). This is due to the object being to close to the edge to extract a profile at the local center, and OBJECT1_EDGE is also set."'), (1, 'BRIGHT', '"Indicates that the object was detected as a bright object. Since these are typically remeasured as faint objects, most users can ignore BRIGHT objects."'), (2, 'EDGE', '"Object is too close to edge of frame in this band."'), (3, 'BLENDED', '"Object was determined to be a blend. The flag is set if: more than one peak is detected within an object in a single band together; distinct peaks are found when merging different colours of one object together; or distinct peaks result when merging different objects together. "'), (4, 'CHILD', '"Object is a child, created by the deblender."'), (5, 'PEAKCENTER', '"Given center is position of peak pixel, as attempts to determine a better centroid failed."'), (6, 'NODEBLEND', '"Although this object was marked as a blend, no deblending was attempted."'), (7, 'NOPROFILE', '"Frames couldn\'t extract a radial profile."'), (8, 'NOPETRO', '" No Petrosian radius or other Petrosian quanties could be measured."'), (9, 'MANYPETRO', '"Object has more than one possible Petrosian radius."'), (10, 'NOPETRO_BIG', '"The Petrosian ratio has not fallen to the value at which the Petrosian radius is defined at the outermost point of the extracted radial profile. NOPETRO is set, and the Petrosian radius is set to the outermost point in the profile."'), (11, 'DEBLEND_TOO_MANY_PEAKS', '"The object had the OBJECT1_DEBLEND flag set, but it contained too many candidate children to be fully deblended. This flag is only set in the parent, i.e. the object with too many peaks."'), (12, 'CR', '"Object contains at least one pixel which was contaminated by a cosmic ray. The OBJECT1_INTERP flag is also set. This flag does not mean that this object is a cosmic ray; rather it means that a cosmic ray has been removed. "'), (13, 'MANYR50', '" More than one radius was found to contain 50% of the Petrosian flux. (For this to happen part of the radial profile must be negative)."'), (14, 'MANYR90', '"More than one radius was found to contain 90% of the Petrosian flux. (For this to happen part of the radial profile must be negative)."'), (15, 'BAD_RADIAL', '" Measured profile includes points with a S/N <= 0. In practice this flag is essentially meaningless."'), (16, 'INCOMPLETE_PROFILE', '"A circle, centerd on the object, of radius the canonical Petrosian radius extends beyond the edge of the frame. The radial profile is still measured from those parts of the object that do lie on the frame."'), (17, 'INTERP', '" The object contains interpolated pixels (e.g. cosmic rays or bad columns)."'), (18, 'SATUR', '"The object contains saturated pixels; INTERP is also set."'), (19, 'NOTCHECKED', '"Object includes pixels that were not checked for peaks, for example the unsmoothed edges of frames, and the cores of subtracted or saturated stars."'), (20, 'SUBTRACTED', '"Object (presumably a star) had wings subtracted."'), (21, 'NOSTOKES', '"Object has no measured Stokes parameters."'), (22, 'BADSKY', '"The estimated sky level is so bad that the central value of the radial profile is crazily negative; this is usually the result of the subtraction of the wings of bright stars failing."'), (23, 'PETROFAINT', '"At least one candidate Petrosian radius occured at an unacceptably low surface brightness."'), (24, 'TOO_LARGE', '" The object is (as it says) too large. Either the object is still detectable at the outermost point of the extracted radial profile (a radius of approximately 260 arcsec), or when attempting to deblend an object, at least one child is larger than half a frame (in either row or column)."'), (25, 'DEBLENDED_AS_PSF', '"When deblending an object, in this band this child was treated as a PSF."'), (26, 'DEBLEND_PRUNED', '"When solving for the weights to be assigned to each child the deblender encountered a nearly singular matrix, and therefore deleted at least one of them."'), (27, 'ELLIPFAINT', '"No isophotal fits were performed."'), (28, 'BINNED1', '"The object was detected in an unbinned image."'), (29, 'BINNED2', '" The object was detected in a 2x2 binned image after all unbinned detections have been replaced by the background level."'), (30, 'BINNED4', '"The object was detected in a 4x4 binned image. The objects detected in the 2x2 binned image are not removed before doing this."'), (31, 'MOVED', '"The object appears to have moved during the exposure. Such objects are candidates to be deblended as moving objects."'), ] photo_flags2_info = [ (0, 'DEBLENDED_AS_MOVING', '"The object has the MOVED flag set, and was deblended on the assumption that it was moving."'), (1, 'NODEBLEND_MOVING', '"The object has the MOVED flag set, but was not deblended as a moving object."'), (2, 'TOO_FEW_DETECTIONS', '"The object has the MOVED flag set, but has too few detection to be deblended as moving."'), (3, 'BAD_MOVING_FIT', '"The fit to the object as a moving object is too bad to be believed."'), (4, 'STATIONARY', '"A moving objects velocity is consistent with zero"'), (5, 'PEAKS_TOO_CLOSE', '"Peaks in object were too close (set only in parent objects)."'), (6, 'BINNED_CENTER', '"When centroiding the object the object\'s size is larger than the (PSF) filter used to smooth the image."'), (7, 'LOCAL_EDGE', '"The object\'s center in some band was too close to the edge of the frame to extract a profile."'), (8, 'BAD_COUNTS_ERROR', '"An object containing interpolated pixels had too few good pixels to form a reliable estimate of its error"'), (9, 'BAD_MOVING_FIT_CHILD', '"A putative moving child\'s velocity fit was too poor, so it was discarded, and the parent was not deblended as moving"'), (10, 'DEBLEND_UNASSIGNED_FLUX', '"After deblending, the fraction of flux assigned to none of the children was too large (this flux is then shared out as described elsewhere)."'), (11, 'SATUR_CENTER', '"An object\'s center is very close to at least one saturated pixel; the object may well be causing the saturation."'), (12, 'INTERP_CENTER', '"An object\'s center is very close to at least one interpolated pixel."'), (13, 'DEBLENDED_AT_EDGE', '"An object so close to the edge of the frame that it would not ordinarily be deblended has been deblended anyway. Only set for objects large enough to be EDGE in all fields/strips."'), (14, 'DEBLEND_NOPEAK', '"A child had no detected peak in a given band, but we centroided it anyway and set the BINNED1"'), (15, 'PSF_FLUX_INTERP', '"The fraction of light actually detected (as opposed to guessed at by the interpolator) was less than some number (currently 80%) of the total."'), (16, 'TOO_FEW_GOOD_DETECTIONS', '"A child of this object had too few good detections to be deblended as moving."'), (17, 'CENTER_OFF_AIMAGE', '"At least one peak\'s center lay off the atlas image in some band. This can happen when the object\'s being deblended as moving, or if the astrometry is badly confused."'), (18, 'DEBLEND_DEGENERATE', '"At least one potential child has been pruned because its template was too similar to some other child\'s template."'), (19, 'BRIGHTEST_GALAXY_CHILD', '"This is the brightest child galaxy in a blend."'), (20, 'CANONICAL_BAND', '"This band was the canonical band. This is the band used to measure the Petrosian radius used to calculate the Petrosian counts in each band, and to define the model used to calculate model colors; it has no effect upon the coordinate system used for the OBJC center."'), (21, 'AMOMENT_UNWEIGHTED', '"`Adaptive\' moments are actually unweighted."'), (22, 'AMOMENT_SHIFT', '"Object\'s center moved too far while determining adaptive moments. In this case, the M_e1 and M_e2 give the (row, column) shift, not the object\'s shape."'), (23, 'AMOMENT_MAXITER', '"Too many iterations while determining adaptive moments."'), (24, 'MAYBE_CR', '"This object may be a cosmic ray. This bit can get set in the cores of bright stars, and is quite likely to be set for the cores of saturated stars."'), (25, 'MAYBE_EGHOST', '"Object appears in the right place to be an electronics ghost."'), (26, 'NOTCHECKED_CENTER', '"Center of object lies in a NOTCHECKED region. The object is almost certainly bogus."'), (27, 'HAS_SATUR_DN', '"This object is saturated in this band and the bleed trail doesn\'t touch the edge of the frame, we we\'ve made an attempt to add up all the flux in the bleed trails, and to include it in the object\'s photometry. "'), (28, 'DEBLEND_PEEPHOLE', '"The deblend was modified by the optimizer"'), (29, 'SPARE3', '""'), (30, 'SPARE2', '""'), (31, 'SPARE1', '""'), ] specobj_boss_target1_info = [ # masktype BOSS_TARGET1 64 "BOSS survey primary target selection flags" # galaxies (0, 'GAL_LOZ', "low-z lrgs"), (1, 'GAL_CMASS', "dperp > 0.55, color-mag cut"), (2, 'GAL_CMASS_COMM', "dperp > 0.55, commissioning color-mag cut"), (3, 'GAL_CMASS_SPARSE', "GAL_CMASS_COMM & (!GAL_CMASS) & (i < 19.9) sparsely sampled"), (6, 'SDSS_KNOWN', "Matches a known SDSS spectra"), (7, 'GAL_CMASS_ALL', "GAL_CMASS and the entire sparsely sampled region"), (8, 'GAL_IFIBER2_FAINT', "ifiber2 > 21.5, extinction corrected. Used after Nov 2010"), # galaxies deprecated #maskbits BOSS_TARGET1 3 GAL_GRRED "red in g-r" #maskbits BOSS_TARGET1 4 GAL_TRIANGLE "GAL_HIZ and !GAL_CMASS" #maskbits BOSS_TARGET1 5 GAL_LODPERP "Same as hiz but between dperp00 and dperp0" # qsos (1) (10, 'QSO_CORE', "restrictive qso selection: commissioning only"), (11, 'QSO_BONUS', "permissive qso selection: commissioning only"), (12, 'QSO_KNOWN_MIDZ', "known qso between [2.2,9.99]"), (13, 'QSO_KNOWN_LOHIZ', "known qso outside of miz range. never target"), (14, 'QSO_NN', "Neural Net that match to sweeps/pass cuts"), (15, 'QSO_UKIDSS', "UKIDSS stars that match sweeps/pass flag cuts"), (16, 'QSO_KDE_COADD', "kde targets from the stripe82 coadd"), (17, 'QSO_LIKE', "likelihood method"), (18, 'QSO_FIRST_BOSS', "FIRST radio match"), (19, 'QSO_KDE', "selected by kde+chi2"), # standards (20, 'STD_FSTAR', "standard f-stars"), (21, 'STD_WD', "white dwarfs"), (22, 'STD_QSO', "qso"), # template stars (32, 'TEMPLATE_GAL_PHOTO', "galaxy templates"), (33, 'TEMPLATE_QSO_SDSS1', "QSO templates"), (34, 'TEMPLATE_STAR_PHOTO', "stellar templates"), (35, 'TEMPLATE_STAR_SPECTRO', "stellar templates (spectroscopically known)"), # qsos (2) (40, 'QSO_CORE_MAIN', "Main survey core sample"), (41, 'QSO_BONUS_MAIN', "Main survey bonus sample"), (42, 'QSO_CORE_ED', "Extreme Deconvolution in Core"), (43, 'QSO_CORE_LIKE', "Likelihood that make it into core"), (44, 'QSO_KNOWN_SUPPZ', "known qso between [1.8,2.15]"), ] specobj_boss_target1_map = dict([(nm, 1< 360)) return (ra, dec) # makes an SDSS AsTrans WCS object look like an anwcs / Tan / Sip class AsTransWrapper(object): def __init__(self, wcs, w, h, x0=0, y0=0): self.wcs = wcs self.imagew = w self.imageh = h self.x0 = x0 self.y0 = y0 def pixelxy2radec(self, x, y): r,d = self.wcs.pixel_to_radec(x+self.x0-1, y+self.y0-1) return r, d def radec2pixelxy(self, ra, dec): x,y = self.wcs.radec_to_pixel(ra, dec) return True, x-self.x0+1, y-self.y0+1 class AsTrans(SdssFile): ''' In DR7, asTrans structures can appear in asTrans files (for a whole run) or in tsField files (in astrom/ or fastrom/). http://www.sdss.org/dr7/dm/flatFiles/asTrans.html In DR8, they are in asTrans files, or in the "frames". http://data.sdss3.org/datamodel/files/PHOTO_REDUX/RERUN/RUN/astrom/asTrans.html ''' def __init__(self, *args, **kwargs): ''' node, incl: in radians astrans: must be an object with fields: {a,b,c,d,e,f}[band] {ricut}[band] {drow0, drow1, drow2, drow3, dcol0, dcol1, dcol2, dcol3}[band] {csrow, cscol, ccrow, cccol}[band] cut_to_band: in DR8 frames files, the astrans elements are not arrays; in DR7 tsField files they are. Note about units in this class: mu,nu are in degrees (great circle coords) a,d are in degrees (mu0, nu0) b,c,e,f are in degrees/pixel (dmu,dnu/drow,dcol) drow0,dcol0 are in pixels (distortion coefficients order 0); dpixels drow1,dcol1 are unitless dpixels / pixel (distortion coefficients order 1) drow2,dcol2 are in 1/pixels (dpixels/pixel**2) (distortion coefficients order 2) drow3,dcol3 are in 1/pixels**2 (dpixels/pixel**3) (distortion coefficients order 3) csrow,cscol are in pixels/mag (color-dependent shift) ccrow,cccol are in pixels (non-color-dependent shift) ''' super(AsTrans, self).__init__(*args, **kwargs) self.filetype = 'asTrans' self.node = kwargs.get('node', None) self.incl = kwargs.get('incl', None) astrans = kwargs.get('astrans', None) self.trans = {} cut = kwargs.get('cut_to_band', True) if astrans is not None and hasattr(self, 'bandi'): for f in ['a','b','c','d','e','f', 'ricut', 'drow0', 'drow1', 'drow2', 'drow3', 'dcol0', 'dcol1', 'dcol2', 'dcol3', 'csrow', 'cscol', 'ccrow', 'cccol']: try: if hasattr(astrans, f): el = getattr(astrans, f) if cut: el = el[self.bandi] self.trans[f] = el except: print('failed to get astrans.' + f) import traceback traceback.print_exc() pass self._cache_vals() @staticmethod def read(fn, F=None, primhdr=None, table=None): ''' F: fitsio.FITS object to use an already-open file. primhdr: FITS header object for the primary HDU. table: astrometry.util.fits table ''' if F is None: import fitsio F = fitsio.FITS(fn) if primhdr is None: primhdr = F[0].read_header() band = primhdr['FILTER'].strip() run = primhdr['RUN'] camcol = primhdr['CAMCOL'] field = 0 # 'FRAME' != field if table is None: tab = fits_table(F[3].read(lower=True)) else: tab = table assert(len(tab) == 1) tab = tab[0] return AsTrans(run, camcol, field, band, node=np.deg2rad(tab.node), incl=np.deg2rad(tab.incl), astrans=tab, cut_to_band=False) def __str__(self): return (SdssFile.__str__(self) + ' (node=%g, incl=%g)' % (self.node, self.incl)) def _cache_vals(self): a, b, c, d, e, f = self._get_abcdef() determinant = b * f - c * e B = f / determinant C = -c / determinant E = -e / determinant F = b / determinant py,px, qy,qx = self._get_cscc() g0, g1, g2, g3 = self._get_drow() h0, h1, h2, h3 = self._get_dcol() color0 = self._get_ricut() self._cached = [self.node, self.incl, a,b,c,d,e,f, B,C,E,F, px,py,qx,qy, g0,g1,g2,g3, h0,h1,h2,h3, color0] def _get_abcdef(self): return tuple(self.trans[x] for x in 'abcdef') def _get_drow(self): return tuple(self.trans[x] for x in ['drow0', 'drow1', 'drow2', 'drow3']) def _get_dcol(self): return tuple(self.trans[x] for x in ['dcol0', 'dcol1', 'dcol2', 'dcol3']) def _get_cscc(self): return tuple(self.trans[x] for x in ['csrow', 'cscol', 'ccrow', 'cccol']) def _get_ricut(self): return self.trans['ricut'] def cd_at_pixel(self, x, y, color=0): ''' (x,y) to numpy array (2,2) -- the CD matrix at pixel x,y: [ [ dRA/dx * cos(Dec), dRA/dy * cos(Dec) ], [ dDec/dx , dDec/dy ] ] in FITS these are called: [ [ CD11 , CD12 ], [ CD21 , CD22 ] ] Note: these statements have not been verified by the FDA. ''' ra0,dec0 = self.pixel_to_radec(x, y, color) step = 10. # pixels rax,decx = self.pixel_to_radec(x+step, y, color) ray,decy = self.pixel_to_radec(x, y+step, color) cosd = np.cos(np.deg2rad(dec0)) return np.array([ [ (rax-ra0)/step * cosd, (ray-ra0)/step * cosd ], [ (decx-dec0)/step , (decy-dec0)/step ] ]) def pixel_to_radec(self, x, y, color=0): mu, nu = self.pixel_to_munu(x, y, color) return self.munu_to_radec(mu, nu) def radec_to_pixel_single_py(self, ra, dec, color=0): '''RA,Dec -> x,y for scalar RA,Dec.''' # RA,Dec -> mu,nu -> prime -> pixel mu, nu = self.radec_to_munu_single(ra, dec) return self.munu_to_pixel_single(mu, nu, color) def radec_to_pixel_single_c(self, ra, dec): return cutils.radec_to_pixel(float(ra), float(dec), self._cached) def radec_to_pixel(self, ra, dec, color=0): mu, nu = self.radec_to_munu(ra, dec) return self.munu_to_pixel(mu, nu, color) def munu_to_pixel(self, mu, nu, color=0): xprime, yprime = self.munu_to_prime(mu, nu, color) return self.prime_to_pixel(xprime, yprime, color=color) munu_to_pixel_single = munu_to_pixel def munu_to_prime(self, mu, nu, color=0): ''' mu = a + b * rowm + c * colm nu = d + e * rowm + f * colm So [rowm; colm] = [b,c; e,f]^-1 * [mu-a; nu-d] [b,c; e,f]^1 = [B,C; E,F] in the code below, so [rowm; colm] = [B,C; E,F] * [mu-a; nu-d] ''' a, b, c, d, e, f = self._get_abcdef() determinant = b * f - c * e B = f / determinant C = -c / determinant E = -e / determinant F = b / determinant mua = mu - a # in field 6955, g3, 809 we see a~413 #if mua < -180.: # mua += 360. mua += 360. * (mua < -180.) yprime = B * mua + C * (nu - d) xprime = E * mua + F * (nu - d) return xprime,yprime def pixel_to_munu(self, x, y, color=0): (xprime, yprime) = self.pixel_to_prime(x, y, color) a, b, c, d, e, f = self._get_abcdef() mu = a + b * yprime + c * xprime nu = d + e * yprime + f * xprime return (mu, nu) def pixel_to_prime(self, x, y, color=0): # Secret decoder ring: # http://www.sdss.org/dr7/products/general/astrometry.html # (color)0 is called riCut; # g0, g1, g2, and g3 are called # dRow0, dRow1, dRow2, and dRow3, respectively; # h0, h1, h2, and h3 are called # dCol0, dCol1, dCol2, and dCol3, respectively; # px and py are called csRow and csCol, respectively; # and qx and qy are called ccRow and ccCol, respectively. color0 = self._get_ricut() g0, g1, g2, g3 = self._get_drow() h0, h1, h2, h3 = self._get_dcol() px, py, qx, qy = self._get_cscc() # #$(%*&^(%$%*& bad documentation. (px,py) = (py,px) (qx,qy) = (qy,qx) yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 # The code below implements this, vectorized: # if color < color0: # xprime += px * color # yprime += py * color # else: # xprime += qx # yprime += qy qx = qx * np.ones_like(x) qy = qy * np.ones_like(y) xprime += np.where(color < color0, px * color, qx) yprime += np.where(color < color0, py * color, qy) return (xprime, yprime) def prime_to_pixel(self, xprime, yprime, color=0): color0 = self._get_ricut() g0, g1, g2, g3 = self._get_drow() h0, h1, h2, h3 = self._get_dcol() px, py, qx, qy = self._get_cscc() # #$(%*&^(%$%*& bad documentation. (px,py) = (py,px) (qx,qy) = (qy,qx) qx = qx * np.ones_like(xprime) qy = qy * np.ones_like(yprime) xprime -= np.where(color < color0, px * color, qx) yprime -= np.where(color < color0, py * color, qy) # Now invert: # yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 # xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 x = xprime - h0 # dumb-ass Newton's method dx = 1. # FIXME -- should just update the ones that aren't zero # FIXME -- should put in some failsafe... while np.max(np.abs(np.atleast_1d(dx))) > 1e-10: xp = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 dxpdx = 1 + h1 + h2 * 2*x + h3 * 3*x**2 dx = (xprime - xp) / dxpdx x += dx y = yprime - (g0 + g1 * x + g2 * x**2 + g3 * x**3) return (x, y) def radec_to_munu_single_c(self, ra, dec): ''' Compute ra,dec to mu,nu for a single RA,Dec, calling C code''' mu,nu = cutils.radec_to_munu(ra, dec, self.node, self.incl) return mu,nu def radec_to_munu(self, ra, dec): ''' RA,Dec in degrees mu,nu (great circle coords) in degrees ''' node,incl = self.node, self.incl assert(ra is not None) assert(dec is not None) ra, dec = np.deg2rad(ra), np.deg2rad(dec) mu = node + np.arctan2(np.sin(ra - node) * np.cos(dec) * np.cos(incl) + np.sin(dec) * np.sin(incl), np.cos(ra - node) * np.cos(dec)) nu = np.arcsin(-np.sin(ra - node) * np.cos(dec) * np.sin(incl) + np.sin(dec) * np.cos(incl)) mu, nu = np.rad2deg(mu), np.rad2deg(nu) mu += (360. * (mu < 0)) mu -= (360. * (mu > 360)) return (mu, nu) def munu_to_radec(self, mu, nu): node,incl = self.node, self.incl assert(mu is not None) assert(nu is not None) # just in case you thought we needed *more* rad/deg conversions... return munu_to_radec_deg(mu, nu, np.rad2deg(node), np.rad2deg(incl)) if cutils is not None: AsTrans.radec_to_munu_single = AsTrans.radec_to_munu_single_c AsTrans.radec_to_pixel_single = AsTrans.radec_to_pixel_single_c else: AsTrans.radec_to_munu_single = AsTrans.radec_to_munu AsTrans.radec_to_pixel_single = AsTrans.radec_to_pixel_single_py class TsField(SdssFile): def __init__(self, *args, **kwargs): super(TsField, self).__init__(*args, **kwargs) self.filetype = 'tsField' self.exptime = 53.907456 def setHdus(self, p): self.hdus = p self.table = fits_table(self.hdus[1].data)[0] T = self.table self.aa = T.aa.astype(float) self.kk = T.kk.astype(float) self.airmass = T.airmass def getAsTrans(self, band): bandi = band_index(band) band = band_name(band) #node,incl = self.getNode(), self.getIncl() hdr = self.hdus[0].header node = np.deg2rad(hdr.get('NODE')) incl = np.deg2rad(hdr.get('INCL')) asTrans = AsTrans(self.run, self.camcol, self.field, band=band, node=node, incl=incl, astrans=self.table) return asTrans #magL = -(2.5/ln(10))*[asinh((f/f0)/2b)+ln(b)] # luptitude == arcsinh mag # band: int def luptitude_to_counts(self, L, band): # from arcsinh softening parameters table # http://www.sdss.org/dr7/algorithms/fluxcal.html#counts2mag b = [1.4e-10, 0.9e-10, 1.2e-10, 1.8e-10, 7.4e-10] b = b[band] maggies = 2.*b * np.sinh(-0.4 * np.log(10.) * L - np.log(b)) dlogcounts = -0.4 * (self.aa[band] + self.kk[band] * self.airmass[band]) return (maggies * self.exptime) * 10.**dlogcounts def get_zeropoint(self, band): return (2.5 * np.log10(self.exptime) -(self.aa[band] + self.kk[band] * self.airmass[band])) # band: int def mag_to_counts(self, mag, band): # log_10(counts) logcounts = (-0.4 * mag + np.log10(self.exptime) - 0.4*(self.aa[band] + self.kk[band] * self.airmass[band])) #logcounts = np.minimum(logcounts, 308.) #olderrs = np.seterr(all='print') rtn = 10.**logcounts #np.seterr(**olderrs) return rtn def counts_to_mag(self, counts, band): # http://www.sdss.org/dr5/algorithms/fluxcal.html#counts2mag # f/f0 = counts/exptime * 10**0.4*(aa + kk * airmass) # mag = -2.5 * log10(f/f0) return -2.5 * (np.log10(counts / self.exptime) + 0.4 * (self.aa[band] + self.kk[band] * self.airmass[band])) class FpObjc(SdssFile): def __init__(self, *args, **kwargs): super(FpObjc, self).__init__(*args, **kwargs) self.filetype = 'fpObjc' class FpM(SdssFile): def __init__(self, *args, **kwargs): super(FpM, self).__init__(*args, **kwargs) self.filetype = 'fpM' self.maskmap = None def setHdus(self, p): self.hdus = p def getMaskPlane(self, name): # Mask planes are described in HDU 11 (the last HDU) if self.maskmap is None: self.maskmap = {} T = fits_table(self.hdus[-1].data) T.cut(T.defname == 'S_MASKTYPE') for k,v in zip(T.attributename, T.value): k = k.replace('S_MASK_', '') if k == 'S_NMASK_TYPES': continue self.maskmap[k] = v if not name in self.maskmap: raise RuntimeError('Unknown mask plane \"%s\"' % name) return fits_table(self.hdus[1 + self.maskmap[name]].data) def setMaskedPixels(self, name, img, val, roi=None): M = self.getMaskPlane(name) if M is None: return if roi is not None: x0,x1,y0,y1 = roi for (c0,c1,r0,r1,coff,roff) in zip(M.cmin,M.cmax,M.rmin,M.rmax, M.col0, M.row0): assert(coff == 0) assert(roff == 0) if roi is not None: (outx,nil) = get_overlapping_region(c0-x0, c1+1-x0, 0, x1-x0) (outy,nil) = get_overlapping_region(r0-y0, r1+1-y0, 0, y1-y0) img[outy,outx] = val else: img[r0:r1+1, c0:c1+1] = val class FpC(SdssFile): def __init__(self, *args, **kwargs): super(FpC, self).__init__(*args, **kwargs) self.filetype = 'fpC' def getImage(self): return self.image def getHeader(self): return self.header class PsField(SdssFile): def __init__(self, *args, **kwargs): super(PsField, self).__init__(*args, **kwargs) self.filetype = 'psField' def setHdus(self, p): self.hdus = p t = fits_table(p[6].data) # the table has only one row... assert(len(t) == 1) t = t[0] #self.table = t self.gain = t.gain self.dark_variance = t.dark_variance self.sky = t.sky self.skyerr = t.skyerr self.psp_status = t.status # Double-Gaussian PSF params self.dgpsf_s1 = t.psf_sigma1_2g self.dgpsf_s2 = t.psf_sigma2_2g self.dgpsf_b = t.psf_b_2g # summary PSF width (sigmas) self.psf_fwhm = t.psf_width * (2.*np.sqrt(2.*np.log(2.))) # 2-gaussian plus power-law PSF params self.plpsf_s1 = t.psf_sigma1 self.plpsf_s2 = t.psf_sigma2 self.plpsf_b = t.psf_b self.plpsf_p0 = t.psf_p0 self.plpsf_beta = t.psf_beta self.plpsf_sigmap = t.psf_sigmap t = fits_table(p[8].data) self.per_run_apcorrs = t.ap_corr_run def getPowerLaw(self, bandnum): ''' Returns: (a1, sigma_1, a2, sigma_2, a3, sigma_power, beta_power) Where a1 is the amplitude of the first Gaussian and sigma_1 is its standard deviation; a2 and sigma_2 are the same for the second Gaussian component, and a3 is the amplitude for the power-law component. Sigma is the scale length, beta the power. RHL claims: func = a*[exp(-x^2/(2*sigmax1^2) - y^2/(2*sigmay1^2)) + b*exp(-x^2/(2*sigmax2^2) - y^2/(2*sigmay2^2)) + p0*(1 + r^2/(beta*sigmap^2))^{-beta/2}] ''' return (1., self.plpsf_s1[bandnum], self.plpsf_b[bandnum], self.plpsf_s1[bandnum], self.plpsf_p0[bandnum], self.plpsf_sigmap[bandnum], self.plpsf_beta[bandnum]) def getPsfFwhm(self, bandnum): return self.psf_fwhm[bandnum] def getDoubleGaussian(self, bandnum, normalize=False): # http://www.sdss.org/dr7/dm/flatFiles/psField.html # good = PSP_FIELD_OK status = self.psp_status[bandnum] if status != 0: print('Warning: PsField status[band=%s] =' % (bandnum), status) # b is the "ratio of G2 to G1 at the origin", ie, not the # straight Gaussian amplitudes a = 1.0 s1 = self.dgpsf_s1[bandnum] s2 = self.dgpsf_s2[bandnum] b = self.dgpsf_b[bandnum] # value at center is 1./(2.*pi*sigma**2) if normalize: b *= (s2/s1)**2 absum = (a + b) a /= absum b /= absum return (float(a), float(s1), float(b), float(s2)) def getEigenPsfs(self, bandnum): ''' Returns a numpy array of shape, eg, (4, 51, 51). ''' T = fits_table(self.hdus[bandnum+1].data) psfs = [] for psf,h,w in zip(T.rrows, T.rnrow, T.rncol): psfs.append(psf.reshape((h,w))) psfs = np.array(psfs) return psfs def getEigenPolynomials(self, bandnum): ''' Returns [ (xorder, yorder, coeffs), (xorder, yorder, coeffs), ...] one tuple per eigen-PSF. xorder and yorder are np arrays of integers coeffs is a numpy array of floating-point coefficients ''' T = fits_table(self.hdus[bandnum+1].data) terms = [] for k in range(len(T)): nrb = T.nrow_b[k] ncb = T.ncol_b[k] c = T.c[k] # !!! c = c.copy() c = c.reshape(5, 5) c = c[:nrb,:ncb] (gridc,gridr) = np.meshgrid(np.arange(ncb), np.arange(nrb)) # remove the 1e-3 coordinate prescaling c *= (1e-3 ** (gridr + gridc)) I = np.flatnonzero(c) terms.append((gridr.flat[I], gridc.flat[I], c.flat[I])) return terms def correlateEigenPsf(self, bandnum, img): from scipy.ndimage.filters import correlate eigenpsfs = self.getEigenPsfs(bandnum) eigenterms = self.getEigenPolynomials(bandnum) H,W = img.shape corr = np.zeros((H,W)) xx,yy = np.arange(W).astype(float), np.arange(H).astype(float) for epsf, (XO,YO,C) in zip(eigenpsfs, eigenterms): k = reduce(np.add, [np.outer(yy**yo, xx**xo) * c for xo,yo,c in zip(XO,YO,C)]) assert(k.shape == img.shape) # Trim symmetric zero-padding off the epsf. # This will fail spectacularly given an all-zero eigen-component. while True: H,W = epsf.shape if (np.all(epsf[:,0] == 0) and np.all(epsf[:,-1] == 0) and np.all(epsf[0,:] == 0) and np.all(epsf[-1,:] == 0)): # Trim! epsf = epsf[1:-1, 1:-1] else: break corr += k * correlate(img, epsf) return corr def getPsfAtPoints(self, bandnum, x, y): ''' Reconstruct the SDSS model PSF from KL basis functions. x,y can be scalars or 1-d numpy arrays. Return value: if x,y are scalars: a PSF image if x,y are arrays: a list of PSF images ''' rtnscalar = np.isscalar(x) and np.isscalar(y) x = np.atleast_1d(x).astype(float) y = np.atleast_1d(y).astype(float) eigenpsfs = self.getEigenPsfs(bandnum) eigenpolys = self.getEigenPolynomials(bandnum) # From the IDL docs: # http://photo.astro.princeton.edu/photoop_doc.html#SDSS_PSF_RECON # acoeff_k = SUM_i{ SUM_j{ (0.001*ROWC)^i * (0.001*COLC)^j * C_k_ij } } # psfimage = SUM_k{ acoeff_k * RROWS_k } # we assume all the eigen-psfs are the same size. assert(len(np.unique([psf.shape for psf in eigenpsfs])) == 1) xx,yy = np.broadcast_arrays(x, y) N = len(xx.flat) psfimgs = np.zeros((N,) + eigenpsfs[0].shape) for epsf, (XO, YO, C) in zip(eigenpsfs, eigenpolys): kk = reduce(np.add, [(xx.flat ** xo) * (yy.flat ** yo) * c for (xo,yo,c) in zip(XO,YO,C)]) psfimgs += epsf[np.newaxis,:,:] * kk[:,np.newaxis,np.newaxis] if rtnscalar: return psfimgs[0,:,:] # convert back to a list... return [psfimgs[i,:,:] for i in range(N)] def getGain(self, band=None): if band is not None: return self.gain[band] return self.gain def getDarkVariance(self, band=None): if band is not None: return self.dark_variance[band] return self.dark_variance def getSky(self, band=None): if band is not None: return self.sky[band] return self.sky def getSkyErr(self, band=None): if band is not None: return self.skyerr[band] return self.skyerr astrometry.net-0.67/sdss/cutils.i000644 000765 000024 00000013671 12651445460 017227 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ %module cutils %{ #include static double deg2rad(double x) { return x * (M_PI / 180.0); } static double rad2deg(double x) { return x * (180.0 / M_PI); } %} %inline %{ #if CONFUSE_EMACS } #endif PyObject* munu_to_prime(double mu, double nu, double color) { return NULL; // return (xp,yp) /* def munu_to_prime(self, mu, nu, color=0): ''' mu = a + b * rowm + c * colm nu = d + e * rowm + f * colm So [rowm; colm] = [b,c; e,f]^-1 * [mu-a; nu-d] [b,c; e,f]^1 = [B,C; E,F] in the code below, so [rowm; colm] = [B,C; E,F] * [mu-a; nu-d] ''' a, b, c, d, e, f = self._get_abcdef() #print 'mu,nu', mu, nu, 'a,d', a,d determinant = b * f - c * e #print 'det', determinant B = f / determinant C = -c / determinant E = -e / determinant F = b / determinant #print 'B', B, 'mu-a', mu-a, 'C', C, 'nu-d', nu-d #print 'E', E, 'mu-a', mu-a, 'F', F, 'nu-d', nu-d mua = mu - a # in field 6955, g3, 809 we see a~413 #if mua < -180.: # mua += 360. mua = 360. * (mua < -180.) yprime = B * mua + C * (nu - d) xprime = E * mua + F * (nu - d) return xprime,yprime */ } PyObject* prime_to_pixel(double xp, double yp) { return NULL; /* def prime_to_pixel(self, xprime, yprime, color=0): color0 = self._get_ricut() g0, g1, g2, g3 = self._get_drow() h0, h1, h2, h3 = self._get_dcol() px, py, qx, qy = self._get_cscc() # #$(%*&^(%$%*& bad documentation. (px,py) = (py,px) (qx,qy) = (qy,qx) qx = qx * np.ones_like(xprime) qy = qy * np.ones_like(yprime) #print 'color', color.shape, 'px', px.shape, 'qx', qx.shape xprime -= np.where(color < color0, px * color, qx) yprime -= np.where(color < color0, py * color, qy) # Now invert: # yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 # xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 x = xprime - h0 # dumb-ass Newton's method dx = 1. # FIXME -- should just update the ones that aren't zero # FIXME -- should put in some failsafe... while max(np.abs(np.atleast_1d(dx))) > 1e-10: xp = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 dxpdx = 1 + h1 + h2 * 2*x + h3 * 3*x**2 dx = (xprime - xp) / dxpdx #print 'Max Newton dx', max(abs(dx)) x += dx y = yprime - (g0 + g1 * x + g2 * x**2 + g3 * x**3) return (x, y) */ } /* Convention: ra,dec in degrees node,incl in radians resulting mu,nu in degrees. */ PyObject* radec_to_munu(double ra, double dec, double node, double incl) { ra = deg2rad(ra); dec = deg2rad(dec); /* double mu = node + atan2(sin(ra - node) * cos(dec) * cos(incl) + sin(dec) * sin(incl), cos(ra - node) * cos(dec)); double nu = asin(-sin(ra - node) * cos(dec) * sin(incl) + sin(dec) * cos(incl)); */ // This version is faster const double sinramnode = sin(ra - node); const double cosdec = cos(dec); const double sindec = sin(dec); const double sinincl = sin(incl); const double cosincl = cos(incl); double mu = node + atan2(sinramnode * cosdec * cosincl + sindec * sinincl, cos(ra - node) * cosdec); double nu = asin(-sinramnode * cosdec * sinincl + sindec * cosincl); mu = rad2deg(mu); nu = rad2deg(nu); if (mu < 0) mu += 360.0; if (mu > 360) mu -= 360.0; return PyTuple_Pack(2, PyFloat_FromDouble(mu), PyFloat_FromDouble(nu)); } static double getlistval(PyObject* cachedvals, int i) { PyObject* po = PyList_GET_ITEM(cachedvals, i); assert(PyFloat_Check(po)); return PyFloat_AsDouble(po); } /* Convention: ra,dec in degrees node,incl in radians ASSUMES color < riCut ASSUMES color = 0 */ PyObject* radec_to_pixel(double ra, double dec, PyObject* cachedvals) { //double node, double incl, //double a, double b, double c, //double d, double e, double f, //double px, double py) { assert(PyList_Check(cachedvals)); assert(PyList_Size(cachedvals) == 25); double node = getlistval(cachedvals, 0); double incl = getlistval(cachedvals, 1); double a = getlistval(cachedvals, 2); double d = getlistval(cachedvals, 5); double B = getlistval(cachedvals, 8); double C = getlistval(cachedvals, 9); double E = getlistval(cachedvals, 10); double F = getlistval(cachedvals, 11); //double px = getlistval(cachedvals, 12); //double py = getlistval(cachedvals, 13); double g0 = getlistval(cachedvals, 16); double g1 = getlistval(cachedvals, 17); double g2 = getlistval(cachedvals, 18); double g3 = getlistval(cachedvals, 19); double h0 = getlistval(cachedvals, 20); double h1 = getlistval(cachedvals, 21); double h2 = getlistval(cachedvals, 22); double h3 = getlistval(cachedvals, 23); ra = deg2rad(ra); dec = deg2rad(dec); // from previous (radec_to_munu) const double sinramnode = sin(ra - node); const double cosdec = cos(dec); const double sindec = sin(dec); const double sinincl = sin(incl); const double cosincl = cos(incl); double mu = node + atan2(sinramnode * cosdec * cosincl + sindec * sinincl, cos(ra - node) * cosdec); double nu = asin(-sinramnode * cosdec * sinincl + sindec * cosincl); mu = rad2deg(mu); nu = rad2deg(nu); if (mu > 360.0) mu -= 360.0; if (mu < 0) mu += 360.0; //printf("c: mu,nu %g,%g\n", mu, nu); // munu_to_pixel // munu_to_prime, double mua = mu - a; if (mua < -180) mua += 360; double xp = E * mua + F * (nu - d); double yp = B * mua + C * (nu - d); //printf("c: xp,yp %g,%g\n", xp,yp); // prime_to_pixel // color terms would go here... // Now invert: // yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 // xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 double x = xp - h0; double dx = 1.; double dxpdx; double xpi; do { //xp = x + h0 + h1 * x + h2 * x*x + h3 * x*x*x; xpi = x + h0 + x * (h1 + x * (h2 + x * h3)); dxpdx = 1. + h1 + x * (h2 * 2. + h3 * 3. * x); dx = (xp - xpi) / dxpdx; x += dx; } while (dx > 1e-10); double y = yp - (g0 + x * (g1 + x * (g2 + x * g3))); return PyTuple_Pack(2, PyFloat_FromDouble(x), PyFloat_FromDouble(y)); } %} astrometry.net-0.67/sdss/cutils.py000644 000765 000024 00000006105 12651446356 017426 0ustar00dstnstaff000000 000000 # This file was automatically generated by SWIG (http://www.swig.org). # Version 3.0.7 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info if version_info >= (2, 6, 0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_cutils', [dirname(__file__)]) except ImportError: import _cutils return _cutils if fp is not None: try: _mod = imp.load_module('_cutils', fp, pathname, description) finally: fp.close() return _mod _cutils = swig_import_helper() del swig_import_helper else: import _cutils del version_info try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self, class_type, name, value, static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'SwigPyObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name, None) if method: return method(self, value) if (not static): if _newclass: object.__setattr__(self, name, value) else: self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self, class_type, name, value): return _swig_setattr_nondynamic(self, class_type, name, value, 0) def _swig_getattr_nondynamic(self, class_type, name, static=1): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name, None) if method: return method(self) if (not static): return object.__getattr__(self, name) else: raise AttributeError(name) def _swig_getattr(self, class_type, name): return _swig_getattr_nondynamic(self, class_type, name, 0) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) try: _object = object _newclass = 1 except AttributeError: class _object: pass _newclass = 0 def munu_to_prime(mu, nu, color): return _cutils.munu_to_prime(mu, nu, color) munu_to_prime = _cutils.munu_to_prime def prime_to_pixel(xp, yp): return _cutils.prime_to_pixel(xp, yp) prime_to_pixel = _cutils.prime_to_pixel def radec_to_munu(ra, dec, node, incl): return _cutils.radec_to_munu(ra, dec, node, incl) radec_to_munu = _cutils.radec_to_munu def getlistval(cachedvals, i): return _cutils.getlistval(cachedvals, i) getlistval = _cutils.getlistval def radec_to_pixel(ra, dec, cachedvals): return _cutils.radec_to_pixel(ra, dec, cachedvals) radec_to_pixel = _cutils.radec_to_pixel # This file is compatible with both classic and new-style classes. astrometry.net-0.67/sdss/cutils_wrap.c000644 000765 000024 00000361415 12651446356 020261 0ustar00dstnstaff000000 000000 /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.7 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG #else # include #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *cstr; char *newstr; Py_ssize_t len; str = PyUnicode_AsUTF8String(str); PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif /* Add PyObject_Del for old Pythons */ #if PY_VERSION_HEX < 0x01060000 # define PyObject_Del(op) PyMem_DEL((op)) #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intintargfunc ssizessizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) { long result = 0; PyObject *i = PyNumber_Int(x); if (i) { result = PyInt_AsLong(i); Py_DECREF(i); } return result; } #endif #if PY_VERSION_HEX < 0x02050000 #define PyInt_FromSize_t(x) PyInt_FromLong((long)x) #endif #if PY_VERSION_HEX < 0x02040000 #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif #if PY_VERSION_HEX < 0x02030000 typedef struct { PyTypeObject type; PyNumberMethods as_number; PyMappingMethods as_mapping; PySequenceMethods as_sequence; PyBufferProcs as_buffer; PyObject *name, *slots; } PyHeapTypeObject; #endif #if PY_VERSION_HEX < 0x02030000 typedef destructor freefunc; #endif #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ (PY_MAJOR_VERSION > 3)) # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #endif #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX >= 0x03000000 SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { return PyInstanceMethod_New(func); } #else SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) { return NULL; } #endif #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN int SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { int i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { int i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS SwigPyObject_repr(SwigPyObject *v) #else SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { # ifdef METH_NOARGS PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # else PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); # endif # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!SwigPyObject_Check(next)) { return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS SwigPyObject_next(PyObject* v) #else SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_disown(PyObject *v) #else SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_acquire(PyObject *v) #else SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #elif (PY_VERSION_HEX < 0x02050000) if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #else if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) #endif { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v); } else { SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * SwigPyObject_getattr(SwigPyObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpyobject_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobject_type) < 0) return NULL; #endif } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME int SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ (printfunc)SwigPyPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpypacked_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpypacked_type) < 0) return NULL; #endif } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return SWIG_Python_str_FromChar("this"); } static PyObject *swig_this = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (swig_this == NULL) swig_this = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst = 0; PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else # ifdef SWIGPY_USE_CAPSULE type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); # else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); # endif if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void #ifdef SWIGPY_USE_CAPSULE SWIG_Python_DestroyModule(PyObject *obj) #else SWIG_Python_DestroyModule(void *vptr) #endif { #ifdef SWIGPY_USE_CAPSULE swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); #else swig_module_info *swig_module = (swig_module_info *) vptr; #endif swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); swig_this = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif #ifdef SWIGPY_USE_CAPSULE PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #else PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #endif } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { #ifdef SWIGPY_USE_CAPSULE descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); #else descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); #endif } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { #ifdef SWIGPY_USE_CAPSULE obj = PyCapsule_New((void*) descriptor, NULL, NULL); #else obj = PyCObject_FromVoidPtr(descriptor, NULL); #endif PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); } else { PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] static swig_type_info *swig_types[2]; static swig_module_info swig_module = {swig_types, 1, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _cutils.so ------------------------------------------------*/ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_init PyInit__cutils #else # define SWIG_init init_cutils #endif #define SWIG_name "_cutils" #define SWIGVERSION 0x030007 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) (void *)((const void *)(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) #include static double deg2rad(double x) { return x * (M_PI / 180.0); } static double rad2deg(double x) { return x * (180.0 / M_PI); } #if CONFUSE_EMACS } #endif PyObject* munu_to_prime(double mu, double nu, double color) { return NULL; // return (xp,yp) /* def munu_to_prime(self, mu, nu, color=0): ''' mu = a + b * rowm + c * colm nu = d + e * rowm + f * colm So [rowm; colm] = [b,c; e,f]^-1 * [mu-a; nu-d] [b,c; e,f]^1 = [B,C; E,F] in the code below, so [rowm; colm] = [B,C; E,F] * [mu-a; nu-d] ''' a, b, c, d, e, f = self._get_abcdef() #print 'mu,nu', mu, nu, 'a,d', a,d determinant = b * f - c * e #print 'det', determinant B = f / determinant C = -c / determinant E = -e / determinant F = b / determinant #print 'B', B, 'mu-a', mu-a, 'C', C, 'nu-d', nu-d #print 'E', E, 'mu-a', mu-a, 'F', F, 'nu-d', nu-d mua = mu - a # in field 6955, g3, 809 we see a~413 #if mua < -180.: # mua += 360. mua = 360. * (mua < -180.) yprime = B * mua + C * (nu - d) xprime = E * mua + F * (nu - d) return xprime,yprime */ } PyObject* prime_to_pixel(double xp, double yp) { return NULL; /* def prime_to_pixel(self, xprime, yprime, color=0): color0 = self._get_ricut() g0, g1, g2, g3 = self._get_drow() h0, h1, h2, h3 = self._get_dcol() px, py, qx, qy = self._get_cscc() # #$(%*&^(%$%*& bad documentation. (px,py) = (py,px) (qx,qy) = (qy,qx) qx = qx * np.ones_like(xprime) qy = qy * np.ones_like(yprime) #print 'color', color.shape, 'px', px.shape, 'qx', qx.shape xprime -= np.where(color < color0, px * color, qx) yprime -= np.where(color < color0, py * color, qy) # Now invert: # yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 # xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 x = xprime - h0 # dumb-ass Newton's method dx = 1. # FIXME -- should just update the ones that aren't zero # FIXME -- should put in some failsafe... while max(np.abs(np.atleast_1d(dx))) > 1e-10: xp = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 dxpdx = 1 + h1 + h2 * 2*x + h3 * 3*x**2 dx = (xprime - xp) / dxpdx #print 'Max Newton dx', max(abs(dx)) x += dx y = yprime - (g0 + g1 * x + g2 * x**2 + g3 * x**3) return (x, y) */ } /* Convention: ra,dec in degrees node,incl in radians resulting mu,nu in degrees. */ PyObject* radec_to_munu(double ra, double dec, double node, double incl) { ra = deg2rad(ra); dec = deg2rad(dec); /* double mu = node + atan2(sin(ra - node) * cos(dec) * cos(incl) + sin(dec) * sin(incl), cos(ra - node) * cos(dec)); double nu = asin(-sin(ra - node) * cos(dec) * sin(incl) + sin(dec) * cos(incl)); */ // This version is faster const double sinramnode = sin(ra - node); const double cosdec = cos(dec); const double sindec = sin(dec); const double sinincl = sin(incl); const double cosincl = cos(incl); double mu = node + atan2(sinramnode * cosdec * cosincl + sindec * sinincl, cos(ra - node) * cosdec); double nu = asin(-sinramnode * cosdec * sinincl + sindec * cosincl); mu = rad2deg(mu); nu = rad2deg(nu); if (mu < 0) mu += 360.0; if (mu > 360) mu -= 360.0; return PyTuple_Pack(2, PyFloat_FromDouble(mu), PyFloat_FromDouble(nu)); } static double getlistval(PyObject* cachedvals, int i) { PyObject* po = PyList_GET_ITEM(cachedvals, i); assert(PyFloat_Check(po)); return PyFloat_AsDouble(po); } /* Convention: ra,dec in degrees node,incl in radians ASSUMES color < riCut ASSUMES color = 0 */ PyObject* radec_to_pixel(double ra, double dec, PyObject* cachedvals) { //double node, double incl, //double a, double b, double c, //double d, double e, double f, //double px, double py) { assert(PyList_Check(cachedvals)); assert(PyList_Size(cachedvals) == 25); double node = getlistval(cachedvals, 0); double incl = getlistval(cachedvals, 1); double a = getlistval(cachedvals, 2); double d = getlistval(cachedvals, 5); double B = getlistval(cachedvals, 8); double C = getlistval(cachedvals, 9); double E = getlistval(cachedvals, 10); double F = getlistval(cachedvals, 11); //double px = getlistval(cachedvals, 12); //double py = getlistval(cachedvals, 13); double g0 = getlistval(cachedvals, 16); double g1 = getlistval(cachedvals, 17); double g2 = getlistval(cachedvals, 18); double g3 = getlistval(cachedvals, 19); double h0 = getlistval(cachedvals, 20); double h1 = getlistval(cachedvals, 21); double h2 = getlistval(cachedvals, 22); double h3 = getlistval(cachedvals, 23); ra = deg2rad(ra); dec = deg2rad(dec); // from previous (radec_to_munu) const double sinramnode = sin(ra - node); const double cosdec = cos(dec); const double sindec = sin(dec); const double sinincl = sin(incl); const double cosincl = cos(incl); double mu = node + atan2(sinramnode * cosdec * cosincl + sindec * sinincl, cos(ra - node) * cosdec); double nu = asin(-sinramnode * cosdec * sinincl + sindec * cosincl); mu = rad2deg(mu); nu = rad2deg(nu); if (mu > 360.0) mu -= 360.0; if (mu < 0) mu += 360.0; //printf("c: mu,nu %g,%g\n", mu, nu); // munu_to_pixel // munu_to_prime, double mua = mu - a; if (mua < -180) mua += 360; double xp = E * mua + F * (nu - d); double yp = B * mua + C * (nu - d); //printf("c: xp,yp %g,%g\n", xp,yp); // prime_to_pixel // color terms would go here... // Now invert: // yprime = y + g0 + g1 * x + g2 * x**2 + g3 * x**3 // xprime = x + h0 + h1 * x + h2 * x**2 + h3 * x**3 double x = xp - h0; double dx = 1.; double dxpdx; double xpi; do { //xp = x + h0 + h1 * x + h2 * x*x + h3 * x*x*x; xpi = x + h0 + x * (h1 + x * (h2 + x * h3)); dxpdx = 1. + h1 + x * (h2 * 2. + h3 * 3. * x); dx = (xp - xpi) / dxpdx; x += dx; } while (dx > 1e-10); double y = yp - (g0 + x * (g1 + x * (g2 + x * g3))); return PyTuple_Pack(2, PyFloat_FromDouble(x), PyFloat_FromDouble(y)); } SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (int)(v); } } return res; } #define SWIG_From_double PyFloat_FromDouble #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_munu_to_prime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:munu_to_prime",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "munu_to_prime" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "munu_to_prime" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "munu_to_prime" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (PyObject *)munu_to_prime(arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_prime_to_pixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:prime_to_pixel",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "prime_to_pixel" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "prime_to_pixel" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (PyObject *)prime_to_pixel(arg1,arg2); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec_to_munu(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double arg4 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:radec_to_munu",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radec_to_munu" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radec_to_munu" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "radec_to_munu" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "radec_to_munu" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (PyObject *)radec_to_munu(arg1,arg2,arg3,arg4); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_getlistval(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; PyObject *arg1 = (PyObject *) 0 ; int arg2 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:getlistval",&obj0,&obj1)) SWIG_fail; arg1 = obj0; ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "getlistval" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (double)getlistval(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_radec_to_pixel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; PyObject *arg3 = (PyObject *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:radec_to_pixel",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "radec_to_pixel" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "radec_to_pixel" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); arg3 = obj2; result = (PyObject *)radec_to_pixel(arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, { (char *)"munu_to_prime", _wrap_munu_to_prime, METH_VARARGS, NULL}, { (char *)"prime_to_pixel", _wrap_prime_to_pixel, METH_VARARGS, NULL}, { (char *)"radec_to_munu", _wrap_radec_to_munu, METH_VARARGS, NULL}, { (char *)"getlistval", _wrap_getlistval, METH_VARARGS, NULL}, { (char *)"radec_to_pixel", _wrap_radec_to_pixel, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_char, }; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_char, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ (printfunc) swig_varlink_print, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 varlink_type.ob_type = &PyType_Type; #else if (PyType_Ready(&varlink_type) < 0) return NULL; #endif } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { # if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, # else { PyObject_HEAD_INIT(NULL) NULL, /* m_init */ 0, /* m_index */ NULL, /* m_copy */ }, # endif (char *) SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = { 0, 0, 0, 0, 0, 0, 0 }; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { (PyCFunction) SwigPyObject_own, (PyCFunction) SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyObject *metatype_args; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* metatype is used to implement static member variables. */ metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type); assert(metatype_args); metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL); assert(metatype); Py_DECREF(metatype_args); metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro; assert(PyType_Ready(metatype) >= 0); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce(); } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); #if PY_VERSION_HEX >= 0x03000000 return m; #else return; #endif } astrometry.net-0.67/sdss/cutout.py000644 000765 000024 00000011043 12651445460 017436 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import numpy as np from scipy.ndimage.filters import gaussian_filter from astrometry.util.resample import resample_with_wcs, ResampleError from fields import radec_to_sdss_rcf from common import band_name, band_index, AsTransWrapper def get_sdss_cutout(targetwcs, sdss, get_rawvals=False, bands='irg', get_rawvals_only=False, bandscales=dict(z=1.0, i=1.0, r=1.3, g=2.5)): rgbims = [] ra,dec = targetwcs.radec_center() # in deg radius = targetwcs.radius() #print 'Target WCS radius is', radius, 'deg' H,W = targetwcs.get_height(), targetwcs.get_width() targetpixscale = targetwcs.pixel_scale() wlistfn = sdss.filenames.get('window_flist', 'window_flist.fits') rad2 = radius*60. + np.hypot(14., 10.)/2. #print 'Rad2 radius', rad2, 'arcmin' RCF = radec_to_sdss_rcf(ra, dec, tablefn=wlistfn, radius=rad2) # Drop rerun 157 keepRCF = [] for run,camcol,field,r,d in RCF: rr = sdss.get_rerun(run, field) #print 'Rerun:', rr if rr == '157': continue keepRCF.append((run,camcol,field)) RCF = keepRCF print len(RCF), 'run/camcol/fields in range' # size in SDSS pixels of the target image. sz = np.hypot(H, W)/2. * targetpixscale / 0.396 print 'SDSS sz:', sz bandnums = [band_index(b) for b in bands] for bandnum,band in zip(bandnums, bands): targetim = np.zeros((H, W), np.float32) targetn = np.zeros((H, W), np.uint8) for ifield,(run,camcol,field) in enumerate(RCF): fn = sdss.retrieve('frame', run, camcol, field, band) frame = sdss.readFrame(run, camcol, field, bandnum) h,w = frame.getImageShape() x,y = frame.astrans.radec_to_pixel(ra, dec) x,y = int(x), int(y) # add some margin for resampling sz2 = int(sz) + 5 xlo = np.clip(x - sz2, 0, w) xhi = np.clip(x + sz2 + 1, 0, w) ylo = np.clip(y - sz2, 0, h) yhi = np.clip(y + sz2 + 1, 0, h) if xlo == xhi or ylo == yhi: continue stamp = frame.getImageSlice((slice(ylo, yhi), slice(xlo, xhi))) sh,sw = stamp.shape wcs = AsTransWrapper(frame.astrans, sw, sh, x0=xlo, y0=ylo) # FIXME -- allow nn resampling too try: Yo,Xo,Yi,Xi,[rim] = resample_with_wcs(targetwcs, wcs, [stamp], 3) except ResampleError: continue targetim[Yo,Xo] += rim targetn [Yo,Xo] += 1 rgbims.append(targetim / targetn) if get_rawvals_only: return rgbims if get_rawvals: rawvals = [x.copy() for x in rgbims] r,g,b = rgbims r *= bandscales[bands[0]] g *= bandscales[bands[1]] b *= bandscales[bands[2]] # i #r *= 1.0 # r #g *= 1.5 #g *= 1.3 # g #b *= 2.5 m = -0.02 r = np.maximum(0, r - m) g = np.maximum(0, g - m) b = np.maximum(0, b - m) I = (r+g+b)/3. alpha = 1.5 Q = 20 m2 = 0. fI = np.arcsinh(alpha * Q * (I - m2)) / np.sqrt(Q) I += (I == 0.) * 1e-6 R = fI * r / I G = fI * g / I B = fI * b / I maxrgb = reduce(np.maximum, [R,G,B]) J = (maxrgb > 1.) R[J] = R[J]/maxrgb[J] G[J] = G[J]/maxrgb[J] B[J] = B[J]/maxrgb[J] ss = 0.5 RGBblur = np.clip(np.dstack([ gaussian_filter(R, ss), gaussian_filter(G, ss), gaussian_filter(B, ss)]), 0., 1.) if get_rawvals: return RGBblur, rawvals return RGBblur if __name__ == '__main__': import tempfile import matplotlib matplotlib.use('Agg') import pylab as plt from dr10 import DR10 from astrometry.util.util import Tan tempdir = tempfile.gettempdir() sdss = DR10(basedir=tempdir) sdss.saveUnzippedFiles(tempdir) W,H = 100, 100 pixscale = 1. cd = pixscale / 3600. targetwcs = Tan(120., 10., W/2., H/2., -cd, 0., 0., cd, float(W), float(H)) rgb = get_sdss_cutout(targetwcs, sdss) plt.clf() plt.imshow(rgb, interpolation='nearest', origin='lower') plt.savefig('cutout1.png') W,H = 3000, 3000 pixscale = 0.5 cd = pixscale / 3600. targetwcs = Tan(120., 10., W/2., H/2., -cd, 0., 0., cd, float(W), float(H)) rgb = get_sdss_cutout(targetwcs, sdss) plt.clf() plt.imshow(rgb, interpolation='nearest', origin='lower') plt.savefig('cutout2.png') astrometry.net-0.67/sdss/dr10.py000644 000765 000024 00000001421 12651445460 016660 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from astrometry.util.fits import fits_table import numpy as np from common import * from dr9 import * class DR10(DR9): def __init__(self, **kwargs): ''' Useful kwargs: basedir : (string) - local directory where data will be stored. ''' super(DR9, self).__init__(**kwargs) self.dasurl = 'http://data.sdss3.org/sas/dr10/boss/' def getDRNumber(self): return 10 def _get_runlist_filename(self): return self._get_data_file('runList-dr10.par') astrometry.net-0.67/sdss/dr7.py000644 000765 000024 00000010723 12651445460 016613 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os from .common import * from astrometry.util.miscutils import * from astrometry.util.fits import * class DR7(SdssDR): def __init__(self, **kwargs): ''' kwargs: (base class:) curl=False: use curl rather than wget? basedir=None: base directory for local files ''' SdssDR.__init__(self, **kwargs) # These are *LOCAL* filenames -- some are different than those # on the DAS. self.filenames = { 'fpObjc': 'fpObjc-%(run)06i-%(camcol)i-%(field)04i.fit', 'fpM': 'fpM-%(run)06i-%(band)s%(camcol)i-%(field)04i.fit', 'fpC': 'fpC-%(run)06i-%(band)s%(camcol)i-%(field)04i.fit', 'fpAtlas': 'fpAtlas-%(run)06i-%(camcol)i-%(field)04i.fit', 'psField': 'psField-%(run)06i-%(camcol)i-%(field)04i.fit', #'tsObj': 'tsObj-%(run)06i-%(camcol)i-%(rerun)i-%(field)04i.fit', #'tsField': 'tsField-%(run)06i-%(camcol)i-%(rerun)i-%(field)04i.fit', 'tsObj': 'tsObj-%(run)06i-%(camcol)i-%(field)04i.fit', 'tsField': 'tsField-%(run)06i-%(camcol)i-%(field)04i.fit', } self.softbias = 1000 def getDRNumber(self): return 7 def retrieve(self, filetype, run, camcol, field, band=None, skipExisting=True): # FIXME! from astrometry.util.sdss_das import sdss_das_get outfn = self.getPath(filetype, run, camcol, field, band) #print 'Output filename:', outfn if skipExisting and os.path.exists(outfn): return return sdss_das_get(filetype, outfn, run, camcol, field, band, curl=self.curl) def readTsField(self, run, camcol, field, rerun): ''' http://www.sdss.org/dr7/dm/flatFiles/tsField.html band: string ('u', 'g', 'r', 'i', 'z') ''' f = TsField(run, camcol, field, rerun=rerun) fn = self.getFilename('tsField', run, camcol, field, rerun=rerun) #print 'reading file', fn p = self._open(fn) #print 'got', len(p), 'HDUs' f.setHdus(p) return f def readFpC(self, run, camcol, field, band): ''' http://data.sdss3.org/datamodel/files/PHOTO_REDUX/RERUN/RUN/objcs/CAMCOL/fpC.html band: string ('u', 'g', 'r', 'i', 'z') ''' f = FpC(run, camcol, field, band) # ... fn = self.getFilename('fpC', run, camcol, field, band) #print 'reading file', fn p = self._open(fn) #print 'got', len(p), 'HDUs' f.image = p[0].data f.header = p[0].header return f def readFpObjc(self, run, camcol, field): ''' http://data.sdss3.org/datamodel/files/PHOTO_REDUX/RERUN/RUN/objcs/CAMCOL/fpObjc.html ''' f = FpObjc(run, camcol, field) # ... fn = self.getFilename('fpObjc', run, camcol, field) #print 'reading file', fn p = self._open(fn) #print 'got', len(p), 'HDUs' return f def readFpM(self, run, camcol, field, band): ''' http://data.sdss3.org/datamodel/files/PHOTO_REDUX/RERUN/RUN/objcs/CAMCOL/fpM.html ''' f = FpM(run, camcol, field, band) # ... fn = self.getFilename('fpM', run, camcol, field, band) #print 'reading file', fn p = self._open(fn) #print 'got', len(p), 'HDUs' f.setHdus(p) return f def readPsField(self, run, camcol, field): ''' http://data.sdss3.org/datamodel/files/PHOTO_REDUX/RERUN/RUN/objcs/CAMCOL/psField.html ''' f = PsField(run, camcol, field) # ... fn = self.getFilename('psField', run, camcol, field) #print 'reading file', fn p = self._open(fn) #print 'got', len(p), 'HDUs' f.setHdus(p) return f def getInvvar(self, fpC, fpM, gain, darkvar, sky, skyerr, x0=0, x1=None, y0=0, y1=None, invvar_and_mask=False): ''' Produces a (cut-out of) the inverse-variance noise image, from columns [x0,x1] and rows [y0,y1] (inclusive). Default is the whole image. fpC is the image pixels (eg FpC.getImage()) #### CHECK THIS -- below we have (img + sky), but fpCs have *not* had sky subtracted. fpM is the FpM gain, darkvar, sky, and skyerr can be retrieved from the psField file. ''' if x1 is None: x1 = fpC.shape[1]-1 if y1 is None: y1 = fpC.shape[0]-1 # Poisson: mean = variance # Add readout noise? # Spatial smoothing? img = fpC[y0:y1+1, x0:x1+1] # from http://www.sdss.org/dr7/algorithms/fluxcal.html ivarimg = 1./((img + sky) / gain + darkvar + skyerr) if invvar_and_mask: mask = np.ones(ivarimg.shape, np.bool) maskimg = mask else: maskimg = ivarimg # Noise model: # -mask coordinates are wrt fpC coordinates. # -INTERP, SATUR, CR, # -GHOST? for plane in [ 'INTERP', 'SATUR', 'CR', 'GHOST' ]: fpM.setMaskedPixels(plane, maskimg, 0) if invvar_and_mask: return ivarimg, mask return ivarimg astrometry.net-0.67/sdss/dr8.py000644 000765 000024 00000042354 12651445460 016621 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os from astrometry.util.fits import fits_table import numpy as np import logging import urlparse import tempfile fitsio = None try: import fitsio except: try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from common import * from dr7 import * from yanny import * from astrometry.util.run_command import run_command class Frame(SdssFile): def __init__(self, *args, **kwargs): super(Frame, self).__init__(*args, **kwargs) self.filetype = 'frame' self.image = None self.image_proxy = None def getImageShape(self): if self.image_proxy is not None: # fitsio fits.FITSHDU object H,W = self.image_proxy.get_info()['dims'] H = int(H) W = int(W) else: H,W = self.image.shape return H,W def getImageSlice(self, slice): if self.image_proxy is not None: #print 'reading slice from image proxy:', slice return self.image_proxy[slice] return self.image[slice] #def __str__(self): def getImage(self): if self.image is None and self.image_proxy is not None: self.image = self.image_proxy.read() self.image_proxy = None return self.image def getHeader(self): return self.header def getAsTrans(self): return self.astrans def getCalibVec(self): return self.calib def getSkyAt(self, x, y): skyim = self.sky (sh,sw) = skyim.shape if sw != 256: skyim = skyim.T (sh,sw) = skyim.shape xi = np.round(self.skyxi[x]).astype(int) yi = np.round(self.skyyi[y]).astype(int) yi = np.minimum(yi,sh-1) return skyim[yi,xi] def getSky(self): skyim = self.sky (sh,sw) = skyim.shape if sw != 256: skyim = skyim.T (sh,sw) = skyim.shape xi = np.round(self.skyxi).astype(int) yi = np.round(self.skyyi).astype(int) yi = np.minimum(yi,sh-1) assert(all(xi >= 0) and all(xi < sw)) assert(all(yi >= 0) and all(yi < sh)) XI,YI = np.meshgrid(xi, yi) # Nearest-neighbour interpolation -- we just need this # for approximate invvar. bigsky = skyim[YI,XI] return bigsky def getInvvar(self, psfield, bandnum, ignoreSourceFlux=False, sourceFlux=None, constantSkyAt=None): ''' If constantSkyAt = (x,y) (INTEGERS!), returns a scalar (rather than a np.array) of the invvar at that point. NOTE that this does NOT blank out masked pixels; use, eg, fpM = sdss.readFpM(run, camcol, field, bandname) for plane in [ 'INTERP', 'SATUR', 'CR', 'GHOST' ]: fpM.setMaskedPixels(plane, invvar, 0, roi=roi) ''' calibvec = self.getCalibVec() if constantSkyAt: x,y = constantSkyAt calibvec = calibvec[x] sky = self.getSkyAt(x,y) if ignoreSourceFlux: dn = sky elif sourceFlux is None: image = self.getImage() dn = (image[y,x] / calibvec) + sky else: dn = (sourceFlux / calibvec) + sky else: bigsky = self.getSky() if ignoreSourceFlux: dn = bigsky elif sourceFlux is None: image = self.getImage() dn = (image / calibvec) + bigsky else: dn = (sourceFlux / calibvec) + bigsky gain = psfield.getGain(bandnum) # Note, "darkvar" includes dark current *and* read noise. darkvar = psfield.getDarkVariance(bandnum) dnvar = (dn / gain) + darkvar invvar = 1./(dnvar * calibvec**2) return invvar class PhotoObj(SdssFile): def __init__(self, *args, **kwargs): super(PhotoObj, self).__init__(*args, **kwargs) self.filetype = 'photoObj' self.table = None def getTable(self): return self.table class runlist(object): pass class DR8(DR7): _lup_to_mag_b = np.array([1.4e-10, 0.9e-10, 1.2e-10, 1.8e-10, 7.4e-10]) _two_lup_to_mag_b = 2.*_lup_to_mag_b _ln_lup_to_mag_b = np.log(_lup_to_mag_b) ''' From http://data.sdss3.org/datamodel/glossary.html#asinh m = -(2.5/ln(10))*[asinh(f/2b)+ln(b)]. The parameter b is a softening parameter measured in maggies, and for the [u, g, r, i, z] bands has the values [1.4, 0.9, 1.2, 1.8, 7.4] x 1e-10 ''' @staticmethod def luptitude_to_mag(Lmag, bandnum, badmag=25): if bandnum is None: # assume Lmag is broadcastable to a 5-vector twobi = DR8._two_lup_to_mag_b lnbi = DR8._ln_lup_to_mag_b else: twobi = DR8._two_lup_to_mag_b[bandnum] lnbi = DR8._ln_lup_to_mag_b[bandnum] # MAGIC -1.08.... = -2.5/np.log(10.) f = np.sinh(Lmag/-1.0857362047581294 - lnbi) * twobi # prevent log10(-flux) mag = np.zeros_like(f) + badmag I = (f > 0) mag[I] = -2.5 * np.log10(f[I]) return mag @staticmethod def nmgy_to_mag(nmgy): return 22.5 - 2.5 * np.log10(nmgy) def getDRNumber(self): return 8 def useLocalTree(self, photoObjs=None, resolve=None): if photoObjs is None: photoObjs = os.environ['BOSS_PHOTOOBJ'] redux = os.environ['PHOTO_REDUX'] if resolve is None: resolve = os.environ['PHOTO_RESOLVE'] self.filenames.update( photoObj = os.path.join(photoObjs, '%(rerun)s', '%(run)i', '%(camcol)i', 'photoObj-%(run)06i-%(camcol)i-%(field)04i.fits'), frame = os.path.join(photoObjs, 'frames', '%(rerun)s', '%(run)i', '%(camcol)i', 'frame-%(band)s-%(run)06i-%(camcol)i-%(field)04i.fits.bz2'), photoField = os.path.join(photoObjs, '%(rerun)s', '%(run)i', 'photoField-%(run)06i-%(camcol)i.fits'), psField = os.path.join(redux, '%(rerun)s', '%(run)i', 'objcs', '%(camcol)i', 'psField-%(run)06i-%(camcol)i-%(field)04i.fit'), fpM = os.path.join(redux, '%(rerun)s', '%(run)i', 'objcs', '%(camcol)i', 'fpM-%(run)06i-%(band)s%(camcol)i-%(field)04i.fit.gz'), window_flist = os.path.join(resolve, 'window_flist.fits'), ) # use fpM files compressed try: del self.dassuffix['fpM'] except: pass try: del self.processcmds['fpM'] except: pass def saveUnzippedFiles(self, basedir): self.unzip_dir = basedir def setFitsioReadBZ2(self, to=True): ''' Call this if fitsio supports reading .bz2 files directly. ''' self.readBz2 = to def __init__(self, **kwargs): ''' Useful kwargs: basedir : (string) - local directory where data will be stored. ''' DR7.__init__(self, **kwargs) self.unzip_dir = None self.readBz2 = False # Local filenames self.filenames.update({ 'frame': 'frame-%(band)s-%(run)06i-%(camcol)i-%(field)04i.fits.bz2', 'idR': 'idR-%(run)06i-%(band)s-%(camcol)i-%(field)04i.fits', 'photoObj': 'photoObj-%(run)06i-%(camcol)i-%(field)04i.fits', 'photoField': 'photoField-%(run)06i-%(camcol)i.fits', 'window_flist': 'window_flist.fits', }) # URLs on DAS server self.dasurl = 'http://data.sdss3.org/sas/dr8/groups/boss/' self.daspaths = { 'idR': 'photo/data/%(run)i/fields/%(camcol)i/idR-%(run)06i-%(band)s%(camcol)i-%(field)04i.fit.Z', 'fpObjc': 'photo/redux/%(rerun)s/%(run)i/objcs/%(camcol)i/fpObjc-%(run)06i-%(camcol)i-%(field)04i.fit', # DR8 frames are no longer available on DAS. 'frame': '/sas/dr9/boss/photoObj/frames/%(rerun)s/%(run)i/%(camcol)i/frame-%(band)s-%(run)06i-%(camcol)i-%(field)04i.fits.bz2', #'frame': 'photoObj/frames/%(rerun)s/%(run)i/%(camcol)i/frame-%(band)s-%(run)06i-%(camcol)i-%(field)04i.fits.bz2', 'photoObj': 'photoObj/%(rerun)s/%(run)i/%(camcol)i/photoObj-%(run)06i-%(camcol)i-%(field)04i.fits', 'psField': 'photo/redux/%(rerun)s/%(run)i/objcs/%(camcol)i/psField-%(run)06i-%(camcol)i-%(field)04i.fit', 'photoField': 'photoObj/%(rerun)s/%(run)i/photoField-%(run)06i-%(camcol)i.fits', 'fpM': 'photo/redux/%(rerun)s/%(run)i/objcs/%(camcol)i/fpM-%(run)06i-%(band)s%(camcol)i-%(field)04i.fit.gz', 'fpAtlas': 'photo/redux/%(rerun)s/%(run)i/objcs/%(camcol)i/fpAtlas-%(run)06i-%(camcol)i-%(field)04i.fit', 'window_flist': 'resolve/2010-05-23/window_flist.fits', } self.dassuffix = { #'frame': '.bz2', 'fpM': '.gz', 'idR': '.Z', } # called in retrieve() self.processcmds = { 'fpM': 'gunzip -cd %(input)s > %(output)s', 'idR': 'gunzip -cd %(input)s > %(output)s', } self.postprocesscmds = { 'frame': 'TMPFILE=$(mktemp %(output)s.tmp.XXXXXX) && bunzip2 -cd %(input)s > $TMPFILE && mv $TMPFILE %(output)s', } y = read_yanny(self._get_runlist_filename()) y = y['RUNDATA'] rl = runlist() rl.run = np.array(y['run']) rl.startfield = np.array(y['startfield']) rl.endfield = np.array(y['endfield']) rl.rerun = np.array(y['rerun']) #print 'Rerun type:', type(rl.rerun), rl.rerun.dtype self.runlist = rl self.logger = logging.getLogger('astrometry.sdss.DR%i' % self.getDRNumber()) #self.logger.debug('debug test') #self.logger.info('info test') #self.logger.warning('warning test') def _unzip_frame(self, fn, run, camcol): if self.readBz2: return None,True # No, PJM reported that pyfits failed on SDSS frame*.bz2 files # if not fitsio: # # pyfits can read .bz2 # return None,True tempfn = None keep = False filetype = 'frame' if not(filetype in self.postprocesscmds and fn.endswith('.bz2')): return None,True cmd = self.postprocesscmds[filetype] if self.unzip_dir is not None: udir = os.path.join(self.unzip_dir, '%i' % run, '%i' % camcol) if not os.path.exists(udir): try: os.makedirs(udir) except: pass tempfn = os.path.join(udir, os.path.basename(fn).replace('.bz2', '')) #print 'Checking', tempfn if os.path.exists(tempfn): print 'File exists:', tempfn return tempfn,True else: print 'Saving to', tempfn keep = True else: fid,tempfn = tempfile.mkstemp() os.close(fid) cmd = cmd % dict(input = fn, output = tempfn) self.logger.debug('cmd: %s' % cmd) print 'command:', cmd (rtn,out,err) = run_command(cmd) if rtn: print 'Command failed: command', cmd print 'Output:', out print 'Error:', err print 'Return val:', rtn raise RuntimeError('Command failed (return val %i): %s' % (rtn, cmd)) print out print err return tempfn,keep def _get_runlist_filename(self): return self._get_data_file('runList-dr8.par') # read a data file describing the DR8 data def _get_data_file(self, fn): return os.path.join(os.path.dirname(__file__), fn) def get_rerun(self, run, field=None): I = (self.runlist.run == run) if field is not None: I *= (self.runlist.startfield <= field) * (self.runlist.endfield >= field) I = np.flatnonzero(I) reruns = np.unique(self.runlist.rerun[I]) #print 'Run', run, '-> reruns:', reruns if len(reruns) == 0: return None return reruns[-1] def get_url(self, filetype, run, camcol, field, band=None, rerun=None): if rerun is None: rerun = self.get_rerun(run, field) path = self.daspaths[filetype] url = urlparse.urljoin(self.dasurl, path % dict( run=run, camcol=camcol, field=field, rerun=rerun, band=band)) return url def retrieve(self, filetype, run, camcol, field=None, band=None, skipExisting=True, tempsuffix='.tmp', rerun=None): outfn = self.getPath(filetype, run, camcol, field, band, rerun=rerun) print 'Checking for file', outfn if outfn is None: return None if skipExisting and os.path.exists(outfn): return outfn outdir = os.path.dirname(outfn) if not os.path.exists(outdir): try: os.makedirs(outdir) except: pass url = self.get_url(filetype, run, camcol, field, band=band, rerun=rerun) #print 'Did not find file:', outfn print 'Retrieving from URL:', url if self.curl: cmd = "curl -o '%(outfn)s' '%(url)s'" else: cmd = "wget --continue -nv -O %(outfn)s '%(url)s'" # suffix to add to the downloaded filename suff = self.dassuffix.get(filetype, '') oo = outfn + suff if tempsuffix is not None: oo += tempsuffix cmd = cmd % dict(outfn=oo, url=url) self.logger.debug('cmd: %s' % cmd) (rtn,out,err) = run_command(cmd) if rtn: print 'Command failed: command', cmd print 'Output:', out print 'Error:', err print 'Return val:', rtn return None if tempsuffix is not None: # self.logger.debug('Renaming %s to %s' % (oo, outfn+suff)) os.rename(oo, outfn + suff) if filetype in self.processcmds: cmd = self.processcmds[filetype] cmd = cmd % dict(input = outfn + suff, output = outfn) self.logger.debug('cmd: %s' % cmd) (rtn,out,err) = run_command(cmd) if rtn: print 'Command failed: command', cmd print 'Output:', out print 'Error:', err print 'Return val:', rtn return None return outfn def readPhotoObj(self, run, camcol, field, filename=None): obj = PhotoObj(run, camcol, field) if filename is None: fn = self.getPath('photoObj', run, camcol, field) else: fn = filename obj.table = fits_table(fn) return obj def readFrame(self, run, camcol, field, band, filename=None): ''' http://data.sdss3.org/datamodel/files/BOSS_PHOTOOBJ/frames/RERUN/RUN/CAMCOL/frame.html ''' f = Frame(run, camcol, field, band) # ... if filename is None: fn = self.getPath('frame', run, camcol, field, band) else: fn = filename # optionally bunzip2 the frame file. tempfn,keep = self._unzip_frame(fn, run, camcol) if tempfn is not None: fn = tempfn if fitsio: print 'Frame filename', fn # eg /clusterfs/riemann/raid006/dr10/boss/photoObj/frames/301/2825/1/frame-u-002825-1-0126.fits.bz2 F = fitsio.FITS(fn, lower=True) f.header = F[0].read_header() # Allow later reading of just the pixels of interest. f.image_proxy = F[0] f.calib = F[1].read() sky = F[2].read_columns(['allsky', 'xinterp', 'yinterp']) #print 'sky', type(sky) # ... supposed to be a recarray, but it's not... f.sky, f.skyxi, f.skyyi = sky.tolist()[0] tab = fits_table(F[3].read()) if not keep and tempfn is not None: os.remove(tempfn) else: p = pyfits.open(fn) # in nanomaggies f.image = p[0].data f.header = p[0].header # converts counts -> nanomaggies f.calib = p[1].data # table with val,x,y -- binned; use bilinear interpolation to expand sky = p[2].data # table -- asTrans structure tab = fits_table(p[3].data) f.sky = sky.field('allsky')[0] f.skyxi = sky.field('xinterp')[0] f.skyyi = sky.field('yinterp')[0] #print 'sky shape', f.sky.shape if len(f.sky.shape) != 2: f.sky = f.sky.reshape((-1, 256)) assert(len(tab) == 1) tab = tab[0] # DR7 has NODE, INCL in radians... f.astrans = AsTrans(run, camcol, field, band, node=np.deg2rad(tab.node), incl=np.deg2rad(tab.incl), astrans=tab, cut_to_band=False) return f astrometry.net-0.67/sdss/dr9.py000644 000765 000024 00000003543 12651445460 016617 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from astrometry.util.fits import fits_table import numpy as np from common import * from dr8 import * class DR9(DR8): def __init__(self, **kwargs): ''' Useful kwargs: basedir : (string) - local directory where data will be stored. ''' DR8.__init__(self, **kwargs) self.dasurl = 'http://data.sdss3.org/sas/dr9/boss/' def getDRNumber(self): return 9 def _get_runlist_filename(self): return self._get_data_file('runList-dr9.par') if __name__ == '__main__': sdss = DR9() rcfb = (2873, 3, 211, 'r') r,c,f,b = rcfb bandnum = band_index(b) sdss.retrieve('psField', *rcfb) psfield = sdss.readPsField(r,c,f) dg = psfield.getDoubleGaussian(bandnum, normalize=True) psf = psfield.getPsfAtPoints(bandnum, 2048/2., 1489./2.) import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np H,W = psf.shape cx,cy = (W/2, H/2) DX,DY = np.meshgrid(np.arange(W)-cx, np.arange(H)-cy) (a1,s1, a2,s2) = dg R2 = (DX**2 + DY**2) G = (a1 / (2.*np.pi*s1**2) * np.exp(-R2/(2.*s1**2)) + a2 / (2.*np.pi*s2**2) * np.exp(-R2/(2.*s2**2))) print 'G sum', G.sum() print 'psf sum', psf.sum() psf /= psf.sum() plt.clf() plt.subplot(2,2,1) ima = dict(interpolation='nearest', origin='lower') plt.imshow(psf, **ima) plt.subplot(2,2,2) plt.imshow(G, **ima) plt.subplot(2,2,3) plt.plot(psf[H/2,:], 'rs-', mec='r', mfc='none') plt.plot(G[H/2,:], 'gx-') plt.subplot(2,2,4) plt.semilogy(np.maximum(1e-6, psf[H/2,:]), 's-', mec='r', mfc='none') plt.semilogy(np.maximum(1e-6, G[H/2,:]), 'gx-') plt.savefig('psf1.png') astrometry.net-0.67/sdss/fields.py000755 000765 000024 00000030034 12651445460 017365 0ustar00dstnstaff000000 000000 #! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from astrometry.util.fits import * from astrometry.util.starutil_numpy import * from astrometry.util.find_data_file import * from os.path import basename,dirname import numpy as np def get_photoobj_filename(photoobjdir, rr, run, camcol, field): fn = os.path.join(photoobjdir, rr, '%i'%run, '%i'%camcol, 'photoObj-%06i-%i-%04i.fits' % (run, camcol, field)) return fn def read_photoobjs_in_wcs(wcs, margin, cols=None, cutToPrimary=True, wfn=None, sdss=None): ''' Read photoObjs that are inside the given 'wcs', plus 'margin' in degrees. ''' import logging log = logging.getLogger('read_photoobjs_in_wcs') ra,dec = wcs.radec_center() rad = wcs.radius() rad += np.hypot(14., 10.) / 2 / 60. # a little extra margin rad += margin if sdss is None: from astrometry.sdss import DR9 sdss = DR9() if wfn is None: wfn = sdss.filenames.get('window_flist', None) if wfn is None: wfn = 'window_flist.fits' if not os.path.exists(wfn): print 'File does not exist:', wfn, '; downloading...' wfn = sdss.retrieve('window_flist', None, None, None, rerun='xxx') print 'Retrieved', wfn else: print 'Using', wfn print 'Searching for run,camcol,fields with radius', rad, 'deg' RCF = radec_to_sdss_rcf(ra, dec, radius=rad*60., tablefn=wfn) log.debug('Found %i fields possibly in range' % len(RCF)) pixmargin = margin * 3600. / wcs.pixel_scale() W,H = wcs.get_width(), wcs.get_height() TT = [] for run,camcol,field,r,d in RCF: log.debug('RCF %i/%i/%i' % (run, camcol, field)) rr = sdss.get_rerun(run, field=field) if rr in [None, '157']: log.debug('Rerun 157') continue fn = sdss.retrieve('photoObj', run, camcol, field, rerun=rr) #fn = get_photoobj_filename(rr, run, camcol, field) T = fits_table(fn, columns=cols) if T is None: log.debug('read 0 from %s' % fn) continue log.debug('read %i from %s' % (len(T), fn)) # while we're reading it, record its length for later... #get_photoobj_length(rr, run, camcol, field) ok,x,y = wcs.radec2pixelxy(T.ra, T.dec) x -= 1 y -= 1 T.cut((x > -pixmargin) * (x < (W + pixmargin)) * (y > -pixmargin) * (y < (H + pixmargin))) if cutToPrimary: T.cut((T.resolve_status & 256) > 0) log.debug('cut to %i within target area and PRIMARY.' % len(T)) else: log.debug('cut to %i within target area.' % len(T)) if len(T) == 0: continue TT.append(T) if not len(TT): return None T = merge_tables(TT) return T class RaDecToRcf(object): def __init__(self, tablefn=None): self.kd = None self.sdssxyz = None if tablefn is None: tablefn = find_data_file('dr7fields.fits') self.tab = fits_table(tablefn) if self.tab is None: raise Exception('Failed to read table of SDSS fields from file: "' + str(tablefn) + '"') def __del__(self): if self.kd is not None: from astrometry.libkd import spherematch_c spherematch_c.kdtree_free(self.kd) self.kd = None def __call__(self, ra, dec, spherematch=True, radius=0, contains=False): T = self.tab # HACK - magic 13x9 +1 arcmin. if radius == 0: radius = sqrt(14.**2 + 10.**2)/2. d2 = arcmin2distsq(radius) if self.sdssxyz is None: self.sdssxyz = radectoxyz(T.ra, T.dec) if not spherematch: rcfs = [] for r,d in broadcast(ra,dec): xyz = radectoxyz(r,d) dist2s = sum((xyz - self.sdssxyz)**2, axis=1) I = flatnonzero(dist2s < d2) rcfs.append(zip(T[I].run, T[I].camcol, T[I].field, T[I].ra, T[I].dec)) else: from astrometry.libkd import spherematch from astrometry.libkd import spherematch_c if self.kd is None: self.kd = spherematch_c.kdtree_build(self.sdssxyz) rds = array([x for x in broadcast(ra,dec)]) xyz = radectoxyz(rds[:,0], rds[:,1]).astype(double) kd2 = spherematch_c.kdtree_build(xyz) notself = False inds,D = spherematch_c.match(self.kd, kd2, np.sqrt(d2), notself,True) if len(inds) == 0: return [] spherematch_c.kdtree_free(kd2) I = np.argsort(D[:,0]) inds = inds[I] rcfs = [[] for i in range(len(rds))] cols = T.columns() gotem = False if contains: if ('ramin' in cols and 'ramax' in cols and 'decmin' in cols and 'decmax' in cols): gotem = True for j,i in inds: (r,d) = rds[i] if (r >= T.ramin[j] and r <= T.ramax[j] and d >= T.decmin[j] and d <= T.decmax[j]): rcfs[i].append((T.run[j], T.camcol[j], T.field[j], T.ra[j], T.dec[j])) #print '%i fields contain the first query RA,Dec' % len(rcfs[0]) else: print 'you requested fields *containing* the query RA,Dec,' print 'but the fields list file \"%s\" doesn\'t contain RAMIN,RAMAX,DECMIN, and DECMAX columns' % tablefn if not gotem: for j,i in inds: rcfs[i].append((T.run[j], T.camcol[j], T.field[j], T.ra[j], T.dec[j])) if isscalar(ra) and isscalar(dec): return rcfs[0] return rcfs # RA,Dec are either scalars or iterables. # Radius is in *arcmin*. sigh. # If scalars, returns a list of (run, camcol, field, ra, dec) tuples, one for each matching field. # If iterable, returns a list containing one list per query (ra,dec) of the same tuple. def radec_to_sdss_rcf(ra, dec, spherematch=True, radius=0, tablefn=None, contains=False): RD = RaDecToRcf(tablefn=tablefn) return RD(ra, dec, spherematch=spherematch, radius=radius, contains=contains) def OLD_radec_to_sdss_rcf(ra, dec, spherematch=True, radius=0, tablefn=None, contains=False): # This file is generated by merging the files "dr7_e.fits", "dr7_g.fits", and "dr7_a.fits", # whose construction is described in http://trac.astrometry.net/browser/trunk/projects/sdss-tests/README # (and in comments below that I didn't notice before writing this) if tablefn is None: tablefn = find_data_file('dr7fields.fits') sdss = table_fields(tablefn) if sdss is None: print 'Failed to read table of SDSS fields from file', tablefn raise Exception('Failed to read table of SDSS fields from file: "' + str(tablefn) + '"') sdssxyz = radectoxyz(sdss.ra, sdss.dec) ## HACK - magic 13x9 arcmin. if radius == 0: radius = sqrt(13.**2 + 9.**2)/2. radius2 = arcmin2distsq(radius) if not spherematch: rcfs = [] for r,d in broadcast(ra,dec): xyz = radectoxyz(r,d) dist2s = sum((xyz - sdssxyz)**2, axis=1) I = flatnonzero(dist2s < radius2) if False: print 'I:', I print 'fields:', sdss[I].run, sdss[I].field, sdss[I].camcol print 'RA', sdss[I].ra print 'Dec', sdss[I].dec rcfs.append(zip(sdss[I].run, sdss[I].camcol, sdss[I].field, sdss[I].ra, sdss[I].dec)) else: from astrometry.libkd import spherematch rds = array([x for x in broadcast(ra,dec)]) xyz = radectoxyz(rds[:,0], rds[:,1]).astype(double) (inds,dists) = spherematch.match(xyz, sdssxyz, sqrt(radius2)) #print 'found %i matches' % len(inds) if len(inds) == 0: return [] #print 'inds:', inds.shape I = np.argsort(dists[:,0]) #print 'dists:', dists.shape inds = inds[I,:] rcfs = [[] for i in range(len(rds))] cols = sdss.columns() gotem = False if contains: if 'ramin' in cols and 'ramax' in cols and 'decmin' in cols and 'decmax' in cols: gotem = True for i,j in inds: (r,d) = rds[i] if r >= sdss.ramin[j] and r <= sdss.ramax[j] and d >= sdss.decmin[j] and d <= sdss.decmax[j]: rcfs[i].append((sdss.run[j], sdss.camcol[j], sdss.field[j], sdss.ra[j], sdss.dec[j])) print '%i fields contain the first query RA,Dec' % len(rcfs[0]) else: print 'you requested fields *containing* the query RA,Dec,' print 'but the fields list file \"%s\" doesn\'t contain RAMIN,RAMAX,DECMIN, and DECMAX columns' % tablefn if not gotem: for i,j in inds: rcfs[i].append((sdss.run[j], sdss.camcol[j], sdss.field[j], sdss.ra[j], sdss.dec[j])) if isscalar(ra) and isscalar(dec): return rcfs[0] return rcfs # The field list was created starting with dstn's list of fields in DR7: # fitscopy dr7_e.fits"[col RUN;FIELD;CAMCOL;RA=(RAMIN+RAMAX)/2;DEC=(DECMIN+DECMAX)/2]" e.fits # fitscopy dr7_g.fits"[col RUN;FIELD;CAMCOL;RA=(RAMIN+RAMAX)/2;DEC=(DECMIN+DECMAX)/2]" g.fits # fitscopy dr7_a.fits"[col RUN;FIELD;CAMCOL;RA=(RAMIN+RAMAX)/2;DEC=(DECMIN+DECMAX)/2]" a.fits # tabmerge g.fits e.fits # tabmerge g.fits+1 e.fits+1 # tabmerge a.fits+1 e.fits+1 # mv e.fits dr7fields.fits # rm g.fits a.fits ''' cd ~/sdss-tests casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS querywait @dr7_ngood.sql casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS querywait @dr7_ngood2.sql casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS outputdownloaddelete mydb.goodfields2 /tmp/dr7.fits fitscopy /tmp/dr7.fits"[col RA=(ramin+ramax)/2;DEC=(decmin+decmax)/2;run;field;camcol;ngood;ramin;ramax;decmin;decmax]" dr7fields.fits casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS querywait @s82_ngood.sql # Stripe82 has no RunQA table. casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS querywait @s82_ngood2.sql casjobs.py $SDSS_CAS_USER $SDSS_CAS_PASS outputdownloaddelete mydb.s82goodfields2 s82.fits fitscopy s82.fits"[col RA=(ramin+ramax)/2;DEC=(decmin+decmax)/2;run;field;camcol;ngood;ramin;ramax;decmin;decmax]" s82fields.fits ''' def main(): import sys from optparse import OptionParser parser = OptionParser(usage='%prog [options] ') parser.add_option('-f', dest='fields', help='FITS table of fields to use; default is astrometry/data/dr7fields.fits') parser.add_option('-c', dest='contains', action='store_true', help='Print only fields that *contain* the given point; requires RAMIN,RAMAX,DECMIN,DECMAX fields.') parser.add_option('-b', '--bands', dest='bands', help='Retrieve fpCs of the given bands; default "ugriz"') parser.add_option('-t', dest='filetypes', help='Retrieve this file type (fpC, fpM, psField, tsField, tsObj, etc)', action='append', default=['fpC']) parser.add_option('-r', dest='radius', type=float, default=15., help='Search radius (arcmin)') parser.set_defaults(fields=None, contains=False, bands='ugriz') (opt, args) = parser.parse_args() if len(args) != 2: parser.print_help() print print 'Got extra arguments:', args sys.exit(-1) # parse RA,Dec. try: ra = float(args[0]) except ValueError: ra = hmsstring2ra(args[0]) try: dec = float(args[1]) except ValueError: dec = dmsstring2dec(args[1]) tablefn = None if opt.fields is not None: if os.path.exists(opt.fields): tablefn = opt.fields else: tablefn = find_data_file(opt.fields) if tablefn is None: print 'Failed to find list of fields:', opt.fields sys.exit(-1) # arcmin radius = opt.radius rcfs = radec_to_sdss_rcf(ra,dec,radius=radius, tablefn=tablefn, contains=opt.contains) print 'ra,dec', ra,dec print 'rcfs:', rcfs print for (r,c,f,ra1,dec1) in rcfs: print '%i %i %i (dist: %g arcmin)' % (r,c,f, deg2arcmin(degrees_between(ra,dec,ra1,dec1))) print for (r,c,f,ra1,dec1) in rcfs: print 'http://cas.sdss.org/dr7/en/get/frameByRCFZ.asp?R=%i&C=%i&F=%i&Z=0&submit1=Get+Image' % (r,c,f) print for (r,c,f,ra1,dec1) in rcfs: print 'wget "http://cas.sdss.org/dr7/en/get/frameByRCFZ.asp?R=%i&C=%i&F=%i&Z=0&submit1=Get+Image" -O sdss-%04i-%i-%04i.jpg' % (r,c,f,r,c,f) from sdss_das import sdss_das_get for (r,c,f,ra1,dec1) in rcfs: for t in opt.filetypes: for b in opt.bands: R = sdss_das_get(t, None, r, c, f, b) if R is False: continue if t == 'fpC': fpc = sdss_filename('fpC', r, c, f, b) os.system('gunzip -cd %s.gz > %s' % (fpc,fpc)) wcs = Tan(filename=fpc) x,y = wcs.radec2pixelxy(ra, dec) x,y = int(x),int(y) os.system('imcopy %s"[%i:%i,%i:%i]" !/tmp/cut-%s' % (fpc, max(0, x-100), x+100, max(0, y-100), y+100, fpc)) os.system('an-fitstopnm -i /tmp/cut-%s -N 1150 -X 1400 | pnmtopng > cut-%s.png' % (fpc, fpc)) print 'R,C,F', r,c,f print 'x,y', x,y if __name__ == '__main__': main() astrometry.net-0.67/sdss/Makefile000644 000765 000024 00000002445 12651445460 017207 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE all: BASEDIR := .. COMMON := $(BASEDIR)/util include $(COMMON)/makefile.common SO=$(SHAREDLIB_SUFFIX) .PHONY: all all: try_lib try_lib: -$(MAKE) lib .PHONY: try_lib lib: _cutils$(PYTHON_SO_EXT) cutils.py .PHONY: lib MY_DIR := $(PY_BASE_INSTALL_DIR)/sdss _cutils$(PYTHON_SO_EXT) cutils.py: cutils.i python setup.py build_ext -v --inplace --build-temp . INSTALL_PY := __init__.py common.py cutout.py dr7.py dr8.py runList-dr8.par \ dr9.py fields.py cutout.py runList-dr9.par dr10.py runList-dr10.par \ sdss_das.py sdss_name.py yanny.py INSTALL_LIB := cutils.py _cutils$(PYTHON_SO_EXT) install-lib: mkdir -p '$(MY_DIR)' @for x in $(INSTALL_LIB); do \ echo cp $$x '$(MY_DIR)'; \ cp $$x '$(MY_DIR)'; \ done .PHONY: install-lib #install: _cutils$(PYTHON_SO_EXT) cutils.py # cutils are supposed to be optional, so try but don't fail to build install: @echo Installing in directory '$(MY_DIR)' mkdir -p '$(MY_DIR)' @for x in $(INSTALL_PY); do \ echo cp $$x '$(MY_DIR)'; \ cp $$x '$(MY_DIR)'; \ done @echo "Trying to build (optional) python module..." -$(MAKE) lib && $(MAKE) install-lib .PHONY: install .PHONY: clean clean: rm -f _cutils$(PYTHON_SO_EXT) cutils_wrap.c cutils.py astrometry.net-0.67/sdss/runList-dr10.par000644 000765 000024 00000122034 12651445460 020454 0ustar00dstnstaff000000 000000 # # runList.par # # Created by SDSS3::Yanny.pm # # 2011-01-05 21:41:03 UTC # typedef struct { int run; # Run number char rerun[]; # Relevant rerun directory int exist; # Does a directory exist (has it ever been queued) (0/1)? int done; # Is this field done (0-Not done/1-Done)? int calib; # Is this field calibrated (0-No/1-Yes)? # All the fields below are only updated if the run is done # Otherwise, they are set to zero. int startfield; # Starting field - determined from fpObjc present int endfield; # Ending field char machine[]; # The machine the data is on char disk[]; # The disk this run is on.... } RUNDATA; RUNDATA 1933 157 1 1 1 0011 0122 unknown unknown RUNDATA 2253 157 1 1 1 0011 0338 unknown unknown RUNDATA 3147 157 1 1 1 0011 0255 unknown unknown RUNDATA 3171 157 1 1 1 0011 0335 unknown unknown RUNDATA 3172 157 1 0 0 0 0 unknown unknown RUNDATA 3173 157 1 1 1 0011 0447 unknown unknown RUNDATA 3174 157 1 1 1 0011 0223 unknown unknown RUNDATA 3466 157 1 1 1 0011 0223 unknown unknown RUNDATA 3467 157 1 1 1 0011 0111 unknown unknown RUNDATA 3468 157 1 1 1 0011 0127 unknown unknown RUNDATA 3469 157 1 1 1 0011 0159 unknown unknown RUNDATA 3470 157 1 1 1 0011 0239 unknown unknown RUNDATA 3471 157 1 1 1 0011 0159 unknown unknown RUNDATA 3472 157 1 1 1 0011 0143 unknown unknown RUNDATA 3473 157 1 1 1 0011 0175 unknown unknown RUNDATA 3575 157 1 1 1 0011 0767 unknown unknown RUNDATA 3576 157 1 1 1 0011 0399 unknown unknown RUNDATA 3577 157 1 1 1 0011 0239 unknown unknown RUNDATA 3578 157 1 1 1 0011 0351 unknown unknown RUNDATA 3579 157 1 1 1 0011 0335 unknown unknown RUNDATA 3580 157 1 1 1 0011 0287 unknown unknown RUNDATA 3581 157 1 1 1 0011 0623 unknown unknown RUNDATA 3582 157 1 1 1 0011 0127 unknown unknown RUNDATA 3583 157 1 1 1 0011 0687 unknown unknown RUNDATA 3638 157 1 1 1 0011 0367 unknown unknown RUNDATA 3639 157 1 1 1 0011 0383 unknown unknown RUNDATA 3669 157 1 1 1 0011 0031 unknown unknown RUNDATA 4033 157 1 1 1 0011 0369 unknown unknown RUNDATA 4034 157 1 0 0 0 0 unknown unknown RUNDATA 4121 157 1 1 1 0011 0319 unknown unknown RUNDATA 4122 157 1 0 0 0 0 unknown unknown RUNDATA 4123 157 1 1 1 0011 0127 unknown unknown RUNDATA 4124 157 1 0 0 0 0 unknown unknown RUNDATA 4160 157 1 1 1 0011 0781 unknown unknown RUNDATA 4162 157 1 1 1 0011 0311 unknown unknown RUNDATA 4163 157 1 0 0 0 0 unknown unknown RUNDATA 4164 157 1 1 1 0011 0203 unknown unknown RUNDATA 4165 157 1 0 0 0 0 unknown unknown RUNDATA 4221 157 1 0 0 0 0 unknown unknown RUNDATA 4222 157 1 1 1 0011 0787 unknown unknown RUNDATA 4223 157 1 1 1 0011 0631 unknown unknown RUNDATA 4224 157 1 1 1 0011 0069 unknown unknown RUNDATA 4225 157 1 1 1 0011 0475 unknown unknown RUNDATA 4240 157 1 1 1 0011 0831 unknown unknown RUNDATA 4248 157 1 1 1 0011 0767 unknown unknown RUNDATA 4249 157 1 1 1 0011 0783 unknown unknown RUNDATA 4266 157 1 1 1 0011 0751 unknown unknown RUNDATA 4267 157 1 1 1 0011 0783 unknown unknown RUNDATA 4268 157 1 1 1 0011 0623 unknown unknown RUNDATA 4269 157 1 1 1 0011 0495 unknown unknown RUNDATA 4270 157 1 1 1 0011 0767 unknown unknown RUNDATA 4271 157 1 1 1 0011 0623 unknown unknown RUNDATA 4272 157 1 1 1 0011 0543 unknown unknown RUNDATA 4273 157 1 1 1 0011 0415 unknown unknown RUNDATA 4274 157 1 1 1 0011 0783 unknown unknown RUNDATA 4275 157 1 1 1 0011 0271 unknown unknown RUNDATA 4281 157 1 1 1 0011 0783 unknown unknown RUNDATA 4282 157 1 1 1 0011 0767 unknown unknown RUNDATA 4283 157 1 1 1 0011 0623 unknown unknown RUNDATA 4284 157 1 1 1 0011 0479 unknown unknown RUNDATA 4291 157 1 1 1 0011 0511 unknown unknown RUNDATA 4322 157 1 1 1 0011 0847 unknown unknown RUNDATA 4329 157 1 1 1 0011 0687 unknown unknown RUNDATA 4330 157 1 1 1 0011 0671 unknown unknown RUNDATA 4331 157 1 1 1 0011 0799 unknown unknown RUNDATA 4473 157 1 1 1 0011 0815 unknown unknown RUNDATA 4474 157 1 1 1 0011 0767 unknown unknown RUNDATA 4475 157 1 1 1 0011 0719 unknown unknown RUNDATA 4476 157 1 1 1 0011 0479 unknown unknown RUNDATA 4477 157 1 1 1 0011 0639 unknown unknown RUNDATA 4557 157 1 1 1 0011 0543 unknown unknown RUNDATA 4558 157 1 0 0 0 0 unknown unknown RUNDATA 4559 157 1 0 0 0 0 unknown unknown RUNDATA 4560 157 1 1 1 0011 0783 unknown unknown RUNDATA 4561 157 1 1 1 0011 0495 unknown unknown RUNDATA 4562 157 1 1 1 0011 0639 unknown unknown RUNDATA 4563 157 1 0 0 0 0 unknown unknown RUNDATA 5194 157 1 0 0 0 0 unknown unknown RUNDATA 94 301 1 1 1 0011 0546 unknown unknown RUNDATA 109 301 1 1 1 0011 0214 unknown unknown RUNDATA 125 301 1 1 1 0011 0589 unknown unknown RUNDATA 211 301 1 1 1 0011 0385 unknown unknown RUNDATA 240 301 1 1 1 0011 0165 unknown unknown RUNDATA 241 301 1 1 1 0011 0111 unknown unknown RUNDATA 250 301 1 1 1 0011 0455 unknown unknown RUNDATA 251 301 1 1 1 0011 0083 unknown unknown RUNDATA 256 301 1 1 1 0011 0057 unknown unknown RUNDATA 259 301 1 1 1 0012 0567 unknown unknown RUNDATA 273 301 1 1 1 0011 0534 unknown unknown RUNDATA 287 301 1 1 1 0011 0437 unknown unknown RUNDATA 297 301 1 1 1 0011 0203 unknown unknown RUNDATA 307 301 1 1 1 0011 0186 unknown unknown RUNDATA 308 301 1 1 1 0011 0216 unknown unknown RUNDATA 727 301 1 1 1 0011 0082 unknown unknown RUNDATA 745 301 1 1 1 0011 0611 unknown unknown RUNDATA 752 301 1 1 1 0011 0723 unknown unknown RUNDATA 756 301 1 1 1 0011 0812 unknown unknown RUNDATA 994 301 1 1 1 0011 0133 unknown unknown RUNDATA 1000 301 1 1 1 0027 0201 unknown unknown RUNDATA 1006 301 1 1 1 0011 0066 unknown unknown RUNDATA 1009 301 1 1 1 0011 0227 unknown unknown RUNDATA 1010 301 1 1 1 0011 0087 unknown unknown RUNDATA 1011 301 1 1 1 0011 0174 unknown unknown RUNDATA 1013 301 1 1 1 0011 0110 unknown unknown RUNDATA 1022 301 1 1 1 0011 0205 unknown unknown RUNDATA 1024 301 1 1 1 0011 0156 unknown unknown RUNDATA 1033 301 1 1 1 0011 0246 unknown unknown RUNDATA 1035 301 1 1 1 0011 0186 unknown unknown RUNDATA 1037 301 1 1 1 0011 0203 unknown unknown RUNDATA 1040 301 1 1 1 0038 0159 unknown unknown RUNDATA 1043 301 1 1 1 0011 0237 unknown unknown RUNDATA 1045 301 1 1 1 0011 0223 unknown unknown RUNDATA 1055 301 1 1 1 0011 0034 unknown unknown RUNDATA 1056 301 1 1 1 0013 0234 unknown unknown RUNDATA 1057 301 1 1 1 0011 0110 unknown unknown RUNDATA 1119 301 1 1 1 0011 0033 unknown unknown RUNDATA 1120 301 1 1 1 0011 0044 unknown unknown RUNDATA 1122 301 1 1 1 0011 0121 unknown unknown RUNDATA 1133 301 1 1 1 0018 0046 unknown unknown RUNDATA 1140 301 1 1 1 0011 0354 unknown unknown RUNDATA 1142 301 1 1 1 0011 0050 unknown unknown RUNDATA 1231 301 1 1 1 0011 0215 unknown unknown RUNDATA 1233 301 1 1 1 0011 0054 unknown unknown RUNDATA 1239 301 1 1 1 0011 0188 unknown unknown RUNDATA 1241 301 1 1 1 0011 0187 unknown unknown RUNDATA 1302 301 1 1 1 0011 0438 unknown unknown RUNDATA 1329 301 1 1 1 0011 0055 unknown unknown RUNDATA 1331 301 1 1 1 0011 0279 unknown unknown RUNDATA 1332 301 1 1 1 0011 0069 unknown unknown RUNDATA 1334 301 1 1 1 0011 0091 unknown unknown RUNDATA 1336 301 1 1 1 0011 0098 unknown unknown RUNDATA 1339 301 1 1 1 0011 0097 unknown unknown RUNDATA 1345 301 1 1 1 0011 0857 unknown unknown RUNDATA 1350 301 1 1 1 0011 0465 unknown unknown RUNDATA 1352 301 1 1 1 0011 0060 unknown unknown RUNDATA 1356 301 1 1 1 0011 0114 unknown unknown RUNDATA 1359 301 1 1 1 0011 0116 unknown unknown RUNDATA 1363 301 1 1 1 0011 0129 unknown unknown RUNDATA 1365 301 1 1 1 0011 0132 unknown unknown RUNDATA 1402 301 1 1 1 0011 0203 unknown unknown RUNDATA 1404 301 1 1 1 0011 0068 unknown unknown RUNDATA 1411 301 1 1 1 0011 0092 unknown unknown RUNDATA 1412 301 1 1 1 0011 0391 unknown unknown RUNDATA 1449 301 1 1 1 0020 0096 unknown unknown RUNDATA 1450 301 1 1 1 0011 0116 unknown unknown RUNDATA 1451 301 1 1 1 0021 0073 unknown unknown RUNDATA 1452 301 1 1 1 0028 0122 unknown unknown RUNDATA 1453 301 1 1 1 0026 0124 unknown unknown RUNDATA 1458 301 1 1 1 0053 0784 unknown unknown RUNDATA 1462 301 1 1 1 0023 0688 unknown unknown RUNDATA 1463 301 1 1 1 0026 0076 unknown unknown RUNDATA 1473 301 1 1 1 0020 0099 unknown unknown RUNDATA 1477 301 1 1 1 0050 0097 unknown unknown RUNDATA 1478 301 1 1 1 0017 0221 unknown unknown RUNDATA 1481 301 1 1 1 0046 0099 unknown unknown RUNDATA 1484 301 1 1 1 0011 0051 unknown unknown RUNDATA 1659 301 1 1 1 0011 0359 unknown unknown RUNDATA 1662 301 1 1 1 0026 0151 unknown unknown RUNDATA 1663 301 1 1 1 0035 0077 unknown unknown RUNDATA 1666 301 1 1 1 0111 0308 unknown unknown RUNDATA 1729 301 1 1 1 0011 0503 unknown unknown RUNDATA 1736 301 1 1 1 0026 0047 unknown unknown RUNDATA 1737 301 1 1 1 0011 0144 unknown unknown RUNDATA 1738 301 1 1 1 0011 0085 unknown unknown RUNDATA 1739 301 1 1 1 0011 0323 unknown unknown RUNDATA 1740 301 1 1 1 0011 0167 unknown unknown RUNDATA 1741 301 1 1 1 0011 0060 unknown unknown RUNDATA 1742 301 1 1 1 0011 0075 unknown unknown RUNDATA 1749 301 1 1 1 0040 0220 unknown unknown RUNDATA 1752 301 1 1 1 0030 0372 unknown unknown RUNDATA 1754 301 1 1 1 0028 0069 unknown unknown RUNDATA 1755 301 1 1 1 0064 0684 unknown unknown RUNDATA 1854 301 1 1 1 0059 0149 unknown unknown RUNDATA 1855 301 1 1 1 0029 0140 unknown unknown RUNDATA 1862 301 1 1 1 0032 0134 unknown unknown RUNDATA 1863 301 1 1 1 0011 0092 unknown unknown RUNDATA 1869 301 1 1 1 0039 0112 unknown unknown RUNDATA 1886 301 1 1 1 0039 0143 unknown unknown RUNDATA 1887 301 1 1 1 0050 0190 unknown unknown RUNDATA 1888 301 1 1 1 0025 0112 unknown unknown RUNDATA 1889 301 1 1 1 0024 0335 unknown unknown RUNDATA 1891 301 1 1 1 0031 0095 unknown unknown RUNDATA 1892 301 1 1 1 0016 0052 unknown unknown RUNDATA 1893 301 1 1 1 0011 0125 unknown unknown RUNDATA 1894 301 1 1 1 0011 0177 unknown unknown RUNDATA 1895 301 1 1 1 0042 0363 unknown unknown RUNDATA 1896 301 1 1 1 0042 0188 unknown unknown RUNDATA 1897 301 1 1 1 0011 0051 unknown unknown RUNDATA 1904 301 1 1 1 0011 0371 unknown unknown RUNDATA 1907 301 1 1 1 0011 0248 unknown unknown RUNDATA 1908 301 1 1 1 0011 0058 unknown unknown RUNDATA 1923 301 1 1 1 0029 0071 unknown unknown RUNDATA 1924 301 1 1 1 0034 0078 unknown unknown RUNDATA 1925 301 1 1 1 0017 0048 unknown unknown RUNDATA 1926 301 1 1 1 0024 0079 unknown unknown RUNDATA 1927 301 1 1 1 0011 0065 unknown unknown RUNDATA 1992 301 1 1 1 0011 0192 unknown unknown RUNDATA 2029 301 1 1 1 0182 0284 unknown unknown RUNDATA 2062 301 1 1 1 0044 0200 unknown unknown RUNDATA 2064 301 1 1 1 0021 0152 unknown unknown RUNDATA 2065 301 1 1 1 0052 0197 unknown unknown RUNDATA 2068 301 1 1 1 0119 0207 unknown unknown RUNDATA 2069 301 1 1 1 0031 0141 unknown unknown RUNDATA 2073 301 1 1 1 0053 0155 unknown unknown RUNDATA 2074 301 1 1 1 0011 0213 unknown unknown RUNDATA 2075 301 1 1 1 0028 0076 unknown unknown RUNDATA 2076 301 1 1 1 0018 0175 unknown unknown RUNDATA 2078 301 1 1 1 0019 0279 unknown unknown RUNDATA 2124 301 1 1 1 0011 0079 unknown unknown RUNDATA 2125 301 1 1 1 0011 0329 unknown unknown RUNDATA 2126 301 1 1 1 0011 0443 unknown unknown RUNDATA 2127 301 1 1 1 0021 0097 unknown unknown RUNDATA 2131 301 1 1 1 0011 0276 unknown unknown RUNDATA 2133 301 1 1 1 0011 0112 unknown unknown RUNDATA 2134 301 1 1 1 0024 0381 unknown unknown RUNDATA 2137 301 1 1 1 0045 0312 unknown unknown RUNDATA 2138 301 1 1 1 0011 0139 unknown unknown RUNDATA 2140 301 1 1 1 0011 0123 unknown unknown RUNDATA 2141 301 1 1 1 0019 0311 unknown unknown RUNDATA 2142 301 1 1 1 0011 0026 unknown unknown RUNDATA 2143 301 1 1 1 0011 0028 unknown unknown RUNDATA 2167 301 1 1 1 0089 0210 unknown unknown RUNDATA 2168 301 1 1 1 0033 0170 unknown unknown RUNDATA 2187 301 1 1 1 0018 0067 unknown unknown RUNDATA 2188 301 1 1 1 0011 0228 unknown unknown RUNDATA 2189 301 1 1 1 0023 0143 unknown unknown RUNDATA 2190 301 1 1 1 0019 0403 unknown unknown RUNDATA 2194 301 1 1 1 0011 0406 unknown unknown RUNDATA 2206 301 1 1 1 0031 0363 unknown unknown RUNDATA 2207 301 1 1 1 0020 0178 unknown unknown RUNDATA 2243 301 1 1 1 0043 0415 unknown unknown RUNDATA 2244 301 1 1 1 0011 0080 unknown unknown RUNDATA 2247 301 1 1 1 0011 0336 unknown unknown RUNDATA 2248 301 1 1 1 0025 0276 unknown unknown RUNDATA 2259 301 1 1 1 0011 0217 unknown unknown RUNDATA 2267 301 1 1 1 0046 0107 unknown unknown RUNDATA 2297 301 1 1 1 0020 0044 unknown unknown RUNDATA 2298 301 1 1 1 0011 0094 unknown unknown RUNDATA 2299 301 1 1 1 0011 0330 unknown unknown RUNDATA 2304 301 1 1 1 0015 0341 unknown unknown RUNDATA 2305 301 1 1 1 0011 0185 unknown unknown RUNDATA 2322 301 1 1 1 0011 0147 unknown unknown RUNDATA 2326 301 1 1 1 0011 0326 unknown unknown RUNDATA 2327 301 1 1 1 0011 0099 unknown unknown RUNDATA 2328 301 1 1 1 0011 0179 unknown unknown RUNDATA 2333 301 1 1 1 0011 0138 unknown unknown RUNDATA 2334 301 1 1 1 0011 0289 unknown unknown RUNDATA 2335 301 1 1 1 0011 0152 unknown unknown RUNDATA 2336 301 1 1 1 0011 0079 unknown unknown RUNDATA 2346 301 1 1 1 0036 0185 unknown unknown RUNDATA 2347 301 1 1 1 0011 0064 unknown unknown RUNDATA 2348 301 1 1 1 0011 0077 unknown unknown RUNDATA 2379 301 1 1 1 0032 0198 unknown unknown RUNDATA 2385 301 1 1 1 0011 0102 unknown unknown RUNDATA 2391 301 1 1 1 0029 0252 unknown unknown RUNDATA 2392 301 1 1 1 0011 0243 unknown unknown RUNDATA 2505 301 1 1 1 0017 0066 unknown unknown RUNDATA 2506 301 1 1 1 0011 0083 unknown unknown RUNDATA 2507 301 1 1 1 0011 0329 unknown unknown RUNDATA 2566 301 1 1 1 0041 0361 unknown unknown RUNDATA 2570 301 1 1 1 0084 0337 unknown unknown RUNDATA 2574 301 1 1 1 0035 0186 unknown unknown RUNDATA 2575 301 1 1 1 0024 0083 unknown unknown RUNDATA 2576 301 1 1 1 0026 0189 unknown unknown RUNDATA 2578 301 1 1 1 0041 0212 unknown unknown RUNDATA 2579 301 1 1 1 0029 0151 unknown unknown RUNDATA 2582 301 1 1 1 0045 0291 unknown unknown RUNDATA 2583 301 1 1 1 0030 0256 unknown unknown RUNDATA 2585 301 1 1 1 0011 0097 unknown unknown RUNDATA 2589 301 1 1 1 0062 0306 unknown unknown RUNDATA 2591 301 1 1 1 0011 0077 unknown unknown RUNDATA 2649 301 1 1 1 0011 0180 unknown unknown RUNDATA 2650 301 1 1 1 0011 0086 unknown unknown RUNDATA 2659 301 1 1 1 0018 0154 unknown unknown RUNDATA 2662 301 1 1 1 0011 0479 unknown unknown RUNDATA 2677 301 1 1 1 0034 0233 unknown unknown RUNDATA 2699 301 1 1 1 0023 0099 unknown unknown RUNDATA 2700 301 1 1 1 0011 0273 unknown unknown RUNDATA 2703 301 1 1 1 0011 0047 unknown unknown RUNDATA 2708 301 1 1 1 0011 0271 unknown unknown RUNDATA 2709 301 1 1 1 0011 0273 unknown unknown RUNDATA 2711 301 1 1 1 0011 0196 unknown unknown RUNDATA 2728 301 1 1 1 0146 0633 unknown unknown RUNDATA 2734 301 1 1 1 0021 0075 unknown unknown RUNDATA 2735 301 1 1 1 0011 0136 unknown unknown RUNDATA 2738 301 1 1 1 0011 0323 unknown unknown RUNDATA 2740 301 1 1 1 0039 0344 unknown unknown RUNDATA 2766 301 1 1 1 0011 0081 unknown unknown RUNDATA 2768 301 1 1 1 0024 0304 unknown unknown RUNDATA 2777 301 1 1 1 0011 0275 unknown unknown RUNDATA 2780 301 1 1 1 0011 0079 unknown unknown RUNDATA 2820 301 1 1 1 0016 0267 unknown unknown RUNDATA 2821 301 1 1 1 0023 0223 unknown unknown RUNDATA 2822 301 1 1 1 0011 0266 unknown unknown RUNDATA 2825 301 1 1 1 0011 0269 unknown unknown RUNDATA 2826 301 1 1 1 0011 0375 unknown unknown RUNDATA 2830 301 1 1 1 0016 0554 unknown unknown RUNDATA 2831 301 1 1 1 0011 0089 unknown unknown RUNDATA 2854 301 1 1 1 0071 0116 unknown unknown RUNDATA 2855 301 1 1 1 0011 0068 unknown unknown RUNDATA 2856 301 1 1 1 0011 0123 unknown unknown RUNDATA 2861 301 1 1 1 0011 0206 unknown unknown RUNDATA 2863 301 1 1 1 0011 0231 unknown unknown RUNDATA 2864 301 1 1 1 0011 0259 unknown unknown RUNDATA 2873 301 1 1 1 0037 0318 unknown unknown RUNDATA 2882 301 1 1 1 0011 0090 unknown unknown RUNDATA 2883 301 1 1 1 0011 0331 unknown unknown RUNDATA 2886 301 1 1 1 0021 0318 unknown unknown RUNDATA 2887 301 1 1 1 0011 0346 unknown unknown RUNDATA 2888 301 1 1 1 0011 0212 unknown unknown RUNDATA 2955 301 1 1 1 0021 0166 unknown unknown RUNDATA 2960 301 1 1 1 0011 0127 unknown unknown RUNDATA 2961 301 1 1 1 0011 0150 unknown unknown RUNDATA 2963 301 1 1 1 0011 0118 unknown unknown RUNDATA 2964 301 1 1 1 0011 0575 unknown unknown RUNDATA 2968 301 1 1 1 0019 0094 unknown unknown RUNDATA 2986 301 1 1 1 0017 0336 unknown unknown RUNDATA 2987 301 1 1 1 0011 0124 unknown unknown RUNDATA 2989 301 1 1 1 0011 0120 unknown unknown RUNDATA 3015 301 1 1 1 0056 0468 unknown unknown RUNDATA 3031 301 1 1 1 0011 0701 unknown unknown RUNDATA 3058 301 1 1 1 0011 0094 unknown unknown RUNDATA 3059 301 1 1 1 0011 0169 unknown unknown RUNDATA 3063 301 1 1 1 0011 0091 unknown unknown RUNDATA 3064 301 1 1 1 0011 0078 unknown unknown RUNDATA 3098 301 1 1 1 0026 0130 unknown unknown RUNDATA 3103 301 1 1 1 0011 0265 unknown unknown RUNDATA 3104 301 1 1 1 0011 0058 unknown unknown RUNDATA 3130 301 1 1 1 0011 0127 unknown unknown RUNDATA 3170 301 1 1 1 0015 0063 unknown unknown RUNDATA 3177 301 1 1 1 0019 0370 unknown unknown RUNDATA 3180 301 1 1 1 0011 0259 unknown unknown RUNDATA 3183 301 1 1 1 0023 0168 unknown unknown RUNDATA 3184 301 1 1 1 0011 0175 unknown unknown RUNDATA 3185 301 1 1 1 0011 0158 unknown unknown RUNDATA 3187 301 1 1 1 0011 0203 unknown unknown RUNDATA 3204 301 1 1 1 0041 0116 unknown unknown RUNDATA 3206 301 1 1 1 0011 0052 unknown unknown RUNDATA 3225 301 1 1 1 0020 0365 unknown unknown RUNDATA 3226 301 1 1 1 0011 0228 unknown unknown RUNDATA 3229 301 1 1 1 0046 0103 unknown unknown RUNDATA 3230 301 1 1 1 0017 0104 unknown unknown RUNDATA 3256 301 1 1 1 0011 0070 unknown unknown RUNDATA 3313 301 1 1 1 0035 0099 unknown unknown RUNDATA 3322 301 1 1 1 0031 0124 unknown unknown RUNDATA 3323 301 1 1 1 0011 0082 unknown unknown RUNDATA 3325 301 1 1 1 0016 0508 unknown unknown RUNDATA 3354 301 1 1 1 0045 0071 unknown unknown RUNDATA 3355 301 1 1 1 0011 0276 unknown unknown RUNDATA 3356 301 1 1 1 0011 0092 unknown unknown RUNDATA 3358 301 1 1 1 0033 0177 unknown unknown RUNDATA 3360 301 1 1 1 0011 0523 unknown unknown RUNDATA 3362 301 1 1 1 0011 0235 unknown unknown RUNDATA 3366 301 1 1 1 0027 0138 unknown unknown RUNDATA 3367 301 1 1 1 0011 0138 unknown unknown RUNDATA 3368 301 1 1 1 0011 0037 unknown unknown RUNDATA 3384 301 1 1 1 0014 0797 unknown unknown RUNDATA 3388 301 1 1 1 0011 0723 unknown unknown RUNDATA 3427 301 1 1 1 0016 0145 unknown unknown RUNDATA 3430 301 1 1 1 0031 0114 unknown unknown RUNDATA 3434 301 1 1 1 0027 0578 unknown unknown RUNDATA 3437 301 1 1 1 0015 0502 unknown unknown RUNDATA 3438 301 1 1 1 0011 0199 unknown unknown RUNDATA 3458 301 1 1 1 0011 0045 unknown unknown RUNDATA 3460 301 1 1 1 0031 0275 unknown unknown RUNDATA 3461 301 1 1 1 0011 0119 unknown unknown RUNDATA 3462 301 1 1 1 0011 0299 unknown unknown RUNDATA 3465 301 1 1 1 0017 0369 unknown unknown RUNDATA 3478 301 1 1 1 0024 0189 unknown unknown RUNDATA 3511 301 1 1 1 0014 0089 unknown unknown RUNDATA 3512 301 1 1 1 0011 0090 unknown unknown RUNDATA 3513 301 1 1 1 0011 0149 unknown unknown RUNDATA 3518 301 1 1 1 0014 0141 unknown unknown RUNDATA 3525 301 1 1 1 0054 0271 unknown unknown RUNDATA 3530 301 1 1 1 0011 0405 unknown unknown RUNDATA 3538 301 1 1 1 0011 0329 unknown unknown RUNDATA 3557 301 1 1 1 0011 0086 unknown unknown RUNDATA 3559 301 1 1 1 0011 0086 unknown unknown RUNDATA 3560 301 1 1 1 0011 0342 unknown unknown RUNDATA 3562 301 1 1 1 0014 0146 unknown unknown RUNDATA 3563 301 1 1 1 0011 0061 unknown unknown RUNDATA 3565 301 1 1 1 0058 0209 unknown unknown RUNDATA 3600 301 1 1 1 0016 0118 unknown unknown RUNDATA 3605 301 1 1 1 0011 0176 unknown unknown RUNDATA 3606 301 1 1 1 0011 0174 unknown unknown RUNDATA 3610 301 1 1 1 0017 0148 unknown unknown RUNDATA 3614 301 1 1 1 0011 0075 unknown unknown RUNDATA 3615 301 1 1 1 0011 0095 unknown unknown RUNDATA 3624 301 1 1 1 0011 0068 unknown unknown RUNDATA 3628 301 1 1 1 0017 0165 unknown unknown RUNDATA 3629 301 1 1 1 0011 0129 unknown unknown RUNDATA 3630 301 1 1 1 0011 0270 unknown unknown RUNDATA 3631 301 1 1 1 0011 0510 unknown unknown RUNDATA 3634 301 1 1 1 0018 0162 unknown unknown RUNDATA 3635 301 1 1 1 0011 0226 unknown unknown RUNDATA 3636 301 1 1 1 0011 0052 unknown unknown RUNDATA 3642 301 1 1 1 0011 0097 unknown unknown RUNDATA 3643 301 1 1 1 0011 0119 unknown unknown RUNDATA 3644 301 1 1 1 0011 0314 unknown unknown RUNDATA 3646 301 1 1 1 0011 0062 unknown unknown RUNDATA 3647 301 1 1 1 0011 0195 unknown unknown RUNDATA 3648 301 1 1 1 0011 0063 unknown unknown RUNDATA 3649 301 1 1 1 0011 0040 unknown unknown RUNDATA 3650 301 1 1 1 0011 0137 unknown unknown RUNDATA 3664 301 1 1 1 0011 0115 unknown unknown RUNDATA 3697 301 1 1 1 0011 0095 unknown unknown RUNDATA 3698 301 1 1 1 0011 0227 unknown unknown RUNDATA 3699 301 1 1 1 0011 0253 unknown unknown RUNDATA 3704 301 1 1 1 0011 0193 unknown unknown RUNDATA 3705 301 1 1 1 0011 0417 unknown unknown RUNDATA 3712 301 1 1 1 0011 0266 unknown unknown RUNDATA 3716 301 1 1 1 0019 0256 unknown unknown RUNDATA 3723 301 1 1 1 0017 0246 unknown unknown RUNDATA 3804 301 1 1 1 0011 0214 unknown unknown RUNDATA 3805 301 1 1 1 0011 0134 unknown unknown RUNDATA 3813 301 1 1 1 0011 0549 unknown unknown RUNDATA 3818 301 1 1 1 0011 0435 unknown unknown RUNDATA 3829 301 1 1 1 0011 0036 unknown unknown RUNDATA 3830 301 1 1 1 0011 0328 unknown unknown RUNDATA 3835 301 1 1 1 0026 0067 unknown unknown RUNDATA 3836 301 1 1 1 0011 0648 unknown unknown RUNDATA 3838 301 1 1 1 0011 0136 unknown unknown RUNDATA 3840 301 1 1 1 0011 0275 unknown unknown RUNDATA 3841 301 1 1 1 0011 0329 unknown unknown RUNDATA 3842 301 1 1 1 0011 0256 unknown unknown RUNDATA 3893 301 1 1 1 0017 0473 unknown unknown RUNDATA 3894 301 1 1 1 0011 0332 unknown unknown RUNDATA 3900 301 1 1 1 0016 0830 unknown unknown RUNDATA 3903 301 1 1 1 0019 0431 unknown unknown RUNDATA 3905 301 1 1 1 0011 0134 unknown unknown RUNDATA 3909 301 1 1 1 0018 0334 unknown unknown RUNDATA 3910 301 1 1 1 0011 0227 unknown unknown RUNDATA 3911 301 1 1 1 0011 0072 unknown unknown RUNDATA 3918 301 1 1 1 0028 0434 unknown unknown RUNDATA 3919 301 1 1 1 0011 0362 unknown unknown RUNDATA 3925 301 1 1 1 0020 0057 unknown unknown RUNDATA 3926 301 1 1 1 0011 0233 unknown unknown RUNDATA 3927 301 1 1 1 0011 0210 unknown unknown RUNDATA 3957 301 1 1 1 0011 0047 unknown unknown RUNDATA 3958 301 1 1 1 0011 0216 unknown unknown RUNDATA 3959 301 1 1 1 0011 0024 unknown unknown RUNDATA 3964 301 1 1 1 0011 0334 unknown unknown RUNDATA 3965 301 1 1 1 0011 0214 unknown unknown RUNDATA 3967 301 1 1 1 0011 0118 unknown unknown RUNDATA 3970 301 1 1 1 0016 0178 unknown unknown RUNDATA 3971 301 1 1 1 0011 0241 unknown unknown RUNDATA 3972 301 1 1 1 0011 0162 unknown unknown RUNDATA 3983 301 1 1 1 0011 0182 unknown unknown RUNDATA 3992 301 1 1 1 0011 0189 unknown unknown RUNDATA 3996 301 1 1 1 0025 0293 unknown unknown RUNDATA 3997 301 1 1 1 0011 0165 unknown unknown RUNDATA 4002 301 1 1 1 0020 0326 unknown unknown RUNDATA 4003 301 1 1 1 0011 0102 unknown unknown RUNDATA 4007 301 1 1 1 0014 0106 unknown unknown RUNDATA 4010 301 1 1 1 0031 0291 unknown unknown RUNDATA 4011 301 1 1 1 0011 0271 unknown unknown RUNDATA 4014 301 1 1 1 0033 0337 unknown unknown RUNDATA 4015 301 1 1 1 0011 0203 unknown unknown RUNDATA 4023 301 1 1 1 0023 0133 unknown unknown RUNDATA 4031 301 1 1 1 0022 0072 unknown unknown RUNDATA 4072 301 1 1 1 0011 0114 unknown unknown RUNDATA 4073 301 1 1 1 0011 0160 unknown unknown RUNDATA 4076 301 1 1 1 0011 0242 unknown unknown RUNDATA 4100 301 1 1 1 0011 0195 unknown unknown RUNDATA 4107 301 1 1 1 0026 0072 unknown unknown RUNDATA 4114 301 1 1 1 0041 0127 unknown unknown RUNDATA 4115 301 1 1 1 0011 0069 unknown unknown RUNDATA 4116 301 1 1 1 0011 0077 unknown unknown RUNDATA 4119 301 1 1 1 0011 0070 unknown unknown RUNDATA 4127 301 1 1 1 0027 0101 unknown unknown RUNDATA 4128 301 1 1 1 0011 0525 unknown unknown RUNDATA 4134 301 1 1 1 0020 0405 unknown unknown RUNDATA 4135 301 1 1 1 0011 0307 unknown unknown RUNDATA 4136 301 1 1 1 0011 0215 unknown unknown RUNDATA 4143 301 1 1 1 0020 0143 unknown unknown RUNDATA 4144 301 1 1 1 0011 0191 unknown unknown RUNDATA 4145 301 1 1 1 0011 0515 unknown unknown RUNDATA 4152 301 1 1 1 0011 0185 unknown unknown RUNDATA 4153 301 1 1 1 0011 0175 unknown unknown RUNDATA 4157 301 1 1 1 0014 0276 unknown unknown RUNDATA 4158 301 1 1 1 0044 0120 unknown unknown RUNDATA 4184 301 1 1 1 0032 0313 unknown unknown RUNDATA 4187 301 1 1 1 0022 0114 unknown unknown RUNDATA 4188 301 1 1 1 0011 0155 unknown unknown RUNDATA 4191 301 1 1 1 0014 0028 unknown unknown RUNDATA 4192 301 1 1 1 0011 0503 unknown unknown RUNDATA 4198 301 1 1 1 0016 0762 unknown unknown RUNDATA 4203 301 1 1 1 0030 0806 unknown unknown RUNDATA 4204 301 1 1 1 0011 0258 unknown unknown RUNDATA 4207 301 1 1 1 0020 0772 unknown unknown RUNDATA 4208 301 1 1 1 0011 0275 unknown unknown RUNDATA 4233 301 1 1 1 0011 0160 unknown unknown RUNDATA 4247 301 1 1 1 0011 0288 unknown unknown RUNDATA 4252 301 1 1 1 0025 0105 unknown unknown RUNDATA 4253 301 1 1 1 0011 0183 unknown unknown RUNDATA 4263 301 1 1 1 0011 0468 unknown unknown RUNDATA 4264 301 1 1 1 0011 0268 unknown unknown RUNDATA 4288 301 1 1 1 0011 0179 unknown unknown RUNDATA 4294 301 1 1 1 0011 0251 unknown unknown RUNDATA 4326 301 1 1 1 0011 0068 unknown unknown RUNDATA 4334 301 1 1 1 0011 0303 unknown unknown RUNDATA 4335 301 1 1 1 0011 0236 unknown unknown RUNDATA 4336 301 1 1 1 0011 0073 unknown unknown RUNDATA 4338 301 1 1 1 0011 0101 unknown unknown RUNDATA 4344 301 1 1 1 0020 0289 unknown unknown RUNDATA 4380 301 1 1 1 0026 0148 unknown unknown RUNDATA 4381 301 1 1 1 0011 0263 unknown unknown RUNDATA 4382 301 1 1 1 0011 0126 unknown unknown RUNDATA 4388 301 1 1 1 0132 0232 unknown unknown RUNDATA 4389 301 1 1 1 0084 0123 unknown unknown RUNDATA 4392 301 1 1 1 0021 0306 unknown unknown RUNDATA 4448 301 1 1 1 0011 0098 unknown unknown RUNDATA 4458 301 1 1 1 0011 0094 unknown unknown RUNDATA 4469 301 1 1 1 0011 0475 unknown unknown RUNDATA 4470 301 1 1 1 0016 0177 unknown unknown RUNDATA 4503 301 1 1 1 0043 0145 unknown unknown RUNDATA 4504 301 1 1 1 0011 0261 unknown unknown RUNDATA 4508 301 1 1 1 0011 0236 unknown unknown RUNDATA 4510 301 1 1 1 0011 0041 unknown unknown RUNDATA 4512 301 1 1 1 0011 0281 unknown unknown RUNDATA 4516 301 1 1 1 0011 0189 unknown unknown RUNDATA 4517 301 1 1 1 0011 0135 unknown unknown RUNDATA 4518 301 1 1 1 0011 0209 unknown unknown RUNDATA 4520 301 1 1 1 0011 0155 unknown unknown RUNDATA 4540 301 1 1 1 0011 0073 unknown unknown RUNDATA 4549 301 1 1 1 0015 0093 unknown unknown RUNDATA 4550 301 1 1 1 0011 0098 unknown unknown RUNDATA 4552 301 1 1 1 0011 0293 unknown unknown RUNDATA 4555 301 1 1 1 0011 0112 unknown unknown RUNDATA 4569 301 1 1 1 0011 0318 unknown unknown RUNDATA 4570 301 1 1 1 0011 0322 unknown unknown RUNDATA 4571 301 1 1 1 0011 0125 unknown unknown RUNDATA 4576 301 1 1 1 0011 0818 unknown unknown RUNDATA 4588 301 1 1 1 0011 0324 unknown unknown RUNDATA 4599 301 1 1 1 0022 0249 unknown unknown RUNDATA 4600 301 1 1 1 0011 0120 unknown unknown RUNDATA 4623 301 1 1 1 0023 0426 unknown unknown RUNDATA 4628 301 1 1 1 0021 0132 unknown unknown RUNDATA 4629 301 1 1 1 0011 0302 unknown unknown RUNDATA 4632 301 1 1 1 0024 0222 unknown unknown RUNDATA 4633 301 1 1 1 0011 0154 unknown unknown RUNDATA 4646 301 1 1 1 0011 0390 unknown unknown RUNDATA 4649 301 1 1 1 0011 0463 unknown unknown RUNDATA 4663 301 1 1 1 0025 0109 unknown unknown RUNDATA 4670 301 1 1 1 0027 0368 unknown unknown RUNDATA 4671 301 1 1 1 0011 0156 unknown unknown RUNDATA 4674 301 1 1 1 0011 0325 unknown unknown RUNDATA 4678 301 1 1 1 0030 0334 unknown unknown RUNDATA 4679 301 1 1 1 0011 0317 unknown unknown RUNDATA 4682 301 1 1 1 0020 0298 unknown unknown RUNDATA 4797 301 1 1 1 0018 0190 unknown unknown RUNDATA 4800 301 1 1 1 0011 0118 unknown unknown RUNDATA 4822 301 1 1 1 0011 0568 unknown unknown RUNDATA 4828 301 1 1 1 0018 0599 unknown unknown RUNDATA 4829 301 1 1 1 0011 0335 unknown unknown RUNDATA 4832 301 1 1 1 0011 0582 unknown unknown RUNDATA 4836 301 1 1 1 0011 0479 unknown unknown RUNDATA 4843 301 1 1 1 0011 0344 unknown unknown RUNDATA 4844 301 1 1 1 0011 0169 unknown unknown RUNDATA 4849 301 1 1 1 0024 0941 unknown unknown RUNDATA 4851 301 1 1 1 0017 0101 unknown unknown RUNDATA 4858 301 1 1 1 0011 0749 unknown unknown RUNDATA 4868 301 1 1 1 0011 0619 unknown unknown RUNDATA 4874 301 1 1 1 0021 1001 unknown unknown RUNDATA 4879 301 1 1 1 0011 0201 unknown unknown RUNDATA 4880 301 1 1 1 0021 0118 unknown unknown RUNDATA 4884 301 1 1 1 0017 0107 unknown unknown RUNDATA 4887 301 1 1 1 0011 0292 unknown unknown RUNDATA 4894 301 1 1 1 0011 0208 unknown unknown RUNDATA 4895 301 1 1 1 0030 0497 unknown unknown RUNDATA 4899 301 1 1 1 0031 0360 unknown unknown RUNDATA 4900 301 1 1 1 0011 0162 unknown unknown RUNDATA 4905 301 1 1 1 0042 0472 unknown unknown RUNDATA 4927 301 1 1 1 0025 0761 unknown unknown RUNDATA 4930 301 1 1 1 0020 0395 unknown unknown RUNDATA 4933 301 1 1 1 0029 0776 unknown unknown RUNDATA 4948 301 1 1 1 0041 0350 unknown unknown RUNDATA 5036 301 1 1 1 0011 0091 unknown unknown RUNDATA 5037 301 1 1 1 0011 0135 unknown unknown RUNDATA 5038 301 1 1 1 0011 0190 unknown unknown RUNDATA 5042 301 1 1 1 0030 0275 unknown unknown RUNDATA 5043 301 1 1 1 0011 0076 unknown unknown RUNDATA 5044 301 1 1 1 0011 0142 unknown unknown RUNDATA 5045 301 1 1 1 0011 0209 unknown unknown RUNDATA 5046 301 1 1 1 0011 0045 unknown unknown RUNDATA 5047 301 1 1 1 0011 0110 unknown unknown RUNDATA 5052 301 1 1 1 0011 0272 unknown unknown RUNDATA 5060 301 1 1 1 0011 0202 unknown unknown RUNDATA 5061 301 1 1 1 0011 0456 unknown unknown RUNDATA 5064 301 1 1 1 0028 0218 unknown unknown RUNDATA 5065 301 1 1 1 0011 0255 unknown unknown RUNDATA 5066 301 1 1 1 0011 0105 unknown unknown RUNDATA 5069 301 1 1 1 0026 0274 unknown unknown RUNDATA 5070 301 1 1 1 0011 0042 unknown unknown RUNDATA 5071 301 1 1 1 0011 0504 unknown unknown RUNDATA 5072 301 1 1 1 0011 0055 unknown unknown RUNDATA 5079 301 1 1 1 0011 0069 unknown unknown RUNDATA 5080 301 1 1 1 0011 0286 unknown unknown RUNDATA 5087 301 1 1 1 0011 0337 unknown unknown RUNDATA 5112 301 1 1 1 0026 0473 unknown unknown RUNDATA 5115 301 1 1 1 0024 0212 unknown unknown RUNDATA 5116 301 1 1 1 0031 0242 unknown unknown RUNDATA 5125 301 1 1 1 0019 0315 unknown unknown RUNDATA 5137 301 1 1 1 0020 0347 unknown unknown RUNDATA 5138 301 1 1 1 0011 0098 unknown unknown RUNDATA 5140 301 1 1 1 0011 0178 unknown unknown RUNDATA 5181 301 1 1 1 0011 0129 unknown unknown RUNDATA 5182 301 1 1 1 0011 0208 unknown unknown RUNDATA 5183 301 1 1 1 0011 0687 unknown unknown RUNDATA 5194 301 1 1 1 0021 0906 unknown unknown RUNDATA 5224 301 1 1 1 0023 0443 unknown unknown RUNDATA 5225 301 1 1 1 0019 0216 unknown unknown RUNDATA 5237 301 1 1 1 0034 0215 unknown unknown RUNDATA 5301 301 1 1 1 0011 0077 unknown unknown RUNDATA 5308 301 1 1 1 0011 0386 unknown unknown RUNDATA 5312 301 1 1 1 0028 0228 unknown unknown RUNDATA 5313 301 1 1 1 0011 0125 unknown unknown RUNDATA 5314 301 1 1 1 0011 0370 unknown unknown RUNDATA 5317 301 1 1 1 0020 0178 unknown unknown RUNDATA 5318 301 1 1 1 0011 0184 unknown unknown RUNDATA 5322 301 1 1 1 0018 0262 unknown unknown RUNDATA 5323 301 1 1 1 0011 0160 unknown unknown RUNDATA 5326 301 1 1 1 0011 0321 unknown unknown RUNDATA 5327 301 1 1 1 0011 0098 unknown unknown RUNDATA 5330 301 1 1 1 0020 0129 unknown unknown RUNDATA 5360 301 1 1 1 0030 0384 unknown unknown RUNDATA 5362 301 1 1 1 0011 0194 unknown unknown RUNDATA 5374 301 1 1 1 0011 0075 unknown unknown RUNDATA 5375 301 1 1 1 0011 0104 unknown unknown RUNDATA 5376 301 1 1 1 0011 0148 unknown unknown RUNDATA 5377 301 1 1 1 0011 0118 unknown unknown RUNDATA 5378 301 1 1 1 0011 0207 unknown unknown RUNDATA 5381 301 1 1 1 0025 0209 unknown unknown RUNDATA 5382 301 1 1 1 0011 0140 unknown unknown RUNDATA 5384 301 1 1 1 0011 0176 unknown unknown RUNDATA 5385 301 1 1 1 0011 0038 unknown unknown RUNDATA 5387 301 1 1 1 0011 0034 unknown unknown RUNDATA 5390 301 1 1 1 0020 0205 unknown unknown RUNDATA 5391 301 1 1 1 0011 0281 unknown unknown RUNDATA 5392 301 1 1 1 0011 0085 unknown unknown RUNDATA 5395 301 1 1 1 0054 0078 unknown unknown RUNDATA 5396 301 1 1 1 0011 0272 unknown unknown RUNDATA 5398 301 1 1 1 0011 0232 unknown unknown RUNDATA 5401 301 1 1 1 0013 0067 unknown unknown RUNDATA 5402 301 1 1 1 0011 0047 unknown unknown RUNDATA 5403 301 1 1 1 0011 0307 unknown unknown RUNDATA 5404 301 1 1 1 0011 0045 unknown unknown RUNDATA 5405 301 1 1 1 0011 0099 unknown unknown RUNDATA 5408 301 1 1 1 0027 0143 unknown unknown RUNDATA 5409 301 1 1 1 0011 0125 unknown unknown RUNDATA 5410 301 1 1 1 0011 0285 unknown unknown RUNDATA 5414 301 1 1 1 0011 0085 unknown unknown RUNDATA 5415 301 1 1 1 0011 0091 unknown unknown RUNDATA 5416 301 1 1 1 0011 0204 unknown unknown RUNDATA 5421 301 1 1 1 0155 0285 unknown unknown RUNDATA 5598 301 1 1 1 0011 0203 unknown unknown RUNDATA 5636 301 1 1 1 0027 0161 unknown unknown RUNDATA 5640 301 1 1 1 0022 0284 unknown unknown RUNDATA 5641 301 1 1 1 0011 0160 unknown unknown RUNDATA 5655 301 1 1 1 0011 0262 unknown unknown RUNDATA 5656 301 1 1 1 0011 0167 unknown unknown RUNDATA 5657 301 1 1 1 0014 0080 unknown unknown RUNDATA 5711 301 1 1 1 0011 0233 unknown unknown RUNDATA 5714 301 1 1 1 0011 0274 unknown unknown RUNDATA 5794 301 1 1 1 0011 0126 unknown unknown RUNDATA 5803 301 1 1 1 0011 0045 unknown unknown RUNDATA 5814 301 1 1 1 0011 0191 unknown unknown RUNDATA 5815 301 1 1 1 0011 0133 unknown unknown RUNDATA 5817 301 1 1 1 0024 0351 unknown unknown RUNDATA 5824 301 1 1 1 0011 0108 unknown unknown RUNDATA 5848 301 1 1 1 0011 0029 unknown unknown RUNDATA 5849 301 1 1 1 0011 0192 unknown unknown RUNDATA 5867 301 1 1 1 0011 0243 unknown unknown RUNDATA 5921 301 1 1 1 0011 0074 unknown unknown RUNDATA 5925 301 1 1 1 0011 0032 unknown unknown RUNDATA 5933 301 1 1 1 0019 0114 unknown unknown RUNDATA 5934 301 1 1 1 0011 0279 unknown unknown RUNDATA 5935 301 1 1 1 0011 0302 unknown unknown RUNDATA 5959 301 1 1 1 0011 0218 unknown unknown RUNDATA 5960 301 1 1 1 0011 0247 unknown unknown RUNDATA 5972 301 1 1 1 0024 0264 unknown unknown RUNDATA 5973 301 1 1 1 0011 0159 unknown unknown RUNDATA 5976 301 1 1 1 0018 0245 unknown unknown RUNDATA 5982 301 1 1 1 0020 0146 unknown unknown RUNDATA 5999 301 1 1 1 0011 0095 unknown unknown RUNDATA 6003 301 1 1 1 0022 0291 unknown unknown RUNDATA 6004 301 1 1 1 0011 0302 unknown unknown RUNDATA 6005 301 1 1 1 0011 0223 unknown unknown RUNDATA 6073 301 1 1 1 0011 0078 unknown unknown RUNDATA 6074 301 1 1 1 0011 0098 unknown unknown RUNDATA 6075 301 1 1 1 0011 0063 unknown unknown RUNDATA 6103 301 1 1 1 0011 0172 unknown unknown RUNDATA 6104 301 1 1 1 0011 0077 unknown unknown RUNDATA 6105 301 1 1 1 0011 0119 unknown unknown RUNDATA 6118 301 1 1 1 0019 0178 unknown unknown RUNDATA 6121 301 1 1 1 0011 0218 unknown unknown RUNDATA 6122 301 1 1 1 0011 0189 unknown unknown RUNDATA 6123 301 1 1 1 0011 0095 unknown unknown RUNDATA 6160 301 1 1 1 0011 0059 unknown unknown RUNDATA 6161 301 1 1 1 0011 0151 unknown unknown RUNDATA 6162 301 1 1 1 0011 0449 unknown unknown RUNDATA 6166 301 1 1 1 0011 0276 unknown unknown RUNDATA 6168 301 1 1 1 0011 0076 unknown unknown RUNDATA 6169 301 1 1 1 0011 0150 unknown unknown RUNDATA 6174 301 1 1 1 0011 0270 unknown unknown RUNDATA 6176 301 1 1 1 0020 0092 unknown unknown RUNDATA 6177 301 1 1 1 0011 0384 unknown unknown RUNDATA 6182 301 1 1 1 0023 0303 unknown unknown RUNDATA 6207 301 1 1 1 0030 0139 unknown unknown RUNDATA 6212 301 1 1 1 0018 0153 unknown unknown RUNDATA 6282 301 1 1 1 0011 0101 unknown unknown RUNDATA 6354 301 1 1 1 0011 0322 unknown unknown RUNDATA 6361 301 1 1 1 0011 0169 unknown unknown RUNDATA 6366 301 1 1 1 0011 0172 unknown unknown RUNDATA 6371 301 1 1 1 0011 0157 unknown unknown RUNDATA 6372 301 1 1 1 0011 0145 unknown unknown RUNDATA 6413 301 1 1 1 0011 0135 unknown unknown RUNDATA 6426 301 1 1 1 0011 0129 unknown unknown RUNDATA 6469 301 1 1 1 0011 0136 unknown unknown RUNDATA 6475 301 1 1 1 0011 0158 unknown unknown RUNDATA 6481 301 1 1 1 0019 0095 unknown unknown RUNDATA 6485 301 1 1 1 0011 0213 unknown unknown RUNDATA 6505 301 1 1 1 0011 0103 unknown unknown RUNDATA 6509 301 1 1 1 0011 0175 unknown unknown RUNDATA 6514 301 1 1 1 0011 0209 unknown unknown RUNDATA 6519 301 1 1 1 0011 0199 unknown unknown RUNDATA 6572 301 1 1 1 0011 0236 unknown unknown RUNDATA 6573 301 1 1 1 0011 0276 unknown unknown RUNDATA 6574 301 1 1 1 0011 0211 unknown unknown RUNDATA 6581 301 1 1 1 0011 0235 unknown unknown RUNDATA 6585 301 1 1 1 0011 0201 unknown unknown RUNDATA 6591 301 1 1 1 0011 0140 unknown unknown RUNDATA 6597 301 1 1 1 0011 0249 unknown unknown RUNDATA 6605 301 1 1 1 0011 0166 unknown unknown RUNDATA 6708 301 1 1 1 0011 0259 unknown unknown RUNDATA 6709 301 1 1 1 0011 0088 unknown unknown RUNDATA 6727 301 1 1 1 0011 0114 unknown unknown RUNDATA 6728 301 1 1 1 0011 0156 unknown unknown RUNDATA 6749 301 1 1 1 0011 0208 unknown unknown RUNDATA 6751 301 1 1 1 0011 0164 unknown unknown RUNDATA 6752 301 1 1 1 0011 0048 unknown unknown RUNDATA 6753 301 1 1 1 0011 0047 unknown unknown RUNDATA 6781 301 1 1 1 0019 0138 unknown unknown RUNDATA 6782 301 1 1 1 0011 0189 unknown unknown RUNDATA 6793 301 1 1 1 0011 0149 unknown unknown RUNDATA 6794 301 1 1 1 0011 0223 unknown unknown RUNDATA 6850 301 1 1 1 0011 0183 unknown unknown RUNDATA 6895 301 1 1 1 0011 0079 unknown unknown RUNDATA 7178 301 1 1 1 0011 0227 unknown unknown RUNDATA 7183 301 1 1 1 0011 0362 unknown unknown RUNDATA 7185 301 1 1 1 0011 0051 unknown unknown RUNDATA 7210 301 1 1 1 0015 0148 unknown unknown RUNDATA 7220 301 1 1 1 0011 0237 unknown unknown RUNDATA 7243 301 1 1 1 0014 0190 unknown unknown RUNDATA 7264 301 1 1 1 0011 0189 unknown unknown RUNDATA 7265 301 1 1 1 0011 0225 unknown unknown RUNDATA 7674 301 1 1 1 0032 0129 unknown unknown RUNDATA 7675 301 1 1 1 0011 0178 unknown unknown RUNDATA 7698 301 1 1 1 0027 0314 unknown unknown RUNDATA 7699 301 1 1 1 0011 0081 unknown unknown RUNDATA 7708 301 1 1 1 0011 0281 unknown unknown RUNDATA 7709 301 1 1 1 0011 0150 unknown unknown RUNDATA 7712 301 1 1 1 0011 0469 unknown unknown RUNDATA 7713 301 1 1 1 0011 0429 unknown unknown RUNDATA 7717 301 1 1 1 0011 0636 unknown unknown RUNDATA 7718 301 1 1 1 0011 0295 unknown unknown RUNDATA 7727 301 1 1 1 0011 0373 unknown unknown RUNDATA 7729 301 1 1 1 0011 0166 unknown unknown RUNDATA 7741 301 1 1 1 0016 0172 unknown unknown RUNDATA 7754 301 1 1 1 0017 0369 unknown unknown RUNDATA 7757 301 1 1 1 0011 0228 unknown unknown RUNDATA 7759 301 1 1 1 0011 0168 unknown unknown RUNDATA 7760 301 1 1 1 0011 0191 unknown unknown RUNDATA 7761 301 1 1 1 0011 0217 unknown unknown RUNDATA 7765 301 1 1 1 0011 0226 unknown unknown RUNDATA 7767 301 1 1 1 0011 0142 unknown unknown RUNDATA 7770 301 1 1 1 0011 0138 unknown unknown RUNDATA 7772 301 1 1 1 0011 0130 unknown unknown RUNDATA 7773 301 1 1 1 0011 0516 unknown unknown RUNDATA 7777 301 1 1 1 0011 0162 unknown unknown RUNDATA 7778 301 1 1 1 0011 0624 unknown unknown RUNDATA 7780 301 1 1 1 0011 0207 unknown unknown RUNDATA 7781 301 1 1 1 0011 0242 unknown unknown RUNDATA 7784 301 1 1 1 0016 0405 unknown unknown RUNDATA 7787 301 1 1 1 0016 0410 unknown unknown RUNDATA 7791 301 1 1 1 0019 0095 unknown unknown RUNDATA 7807 301 1 1 1 0011 0114 unknown unknown RUNDATA 7808 301 1 1 1 0011 0105 unknown unknown RUNDATA 7812 301 1 1 1 0037 0165 unknown unknown RUNDATA 7814 301 1 1 1 0014 0147 unknown unknown RUNDATA 7824 301 1 1 1 0011 0436 unknown unknown RUNDATA 7845 301 1 1 1 0011 0154 unknown unknown RUNDATA 7865 301 1 1 1 0011 0221 unknown unknown RUNDATA 7880 301 1 1 1 0011 0122 unknown unknown RUNDATA 7881 301 1 1 1 0011 0329 unknown unknown RUNDATA 7885 301 1 1 1 0011 0190 unknown unknown RUNDATA 7907 301 1 1 1 0011 0211 unknown unknown RUNDATA 7908 301 1 1 1 0011 0163 unknown unknown RUNDATA 7912 301 1 1 1 0011 0234 unknown unknown RUNDATA 7913 301 1 1 1 0011 0164 unknown unknown RUNDATA 7917 301 1 1 1 0011 0309 unknown unknown RUNDATA 7923 301 1 1 1 0011 0386 unknown unknown RUNDATA 7932 301 1 1 1 0011 0215 unknown unknown RUNDATA 7937 301 1 1 1 0018 0255 unknown unknown RUNDATA 7941 301 1 1 1 0011 0115 unknown unknown RUNDATA 7942 301 1 1 1 0020 0119 unknown unknown RUNDATA 8038 301 1 1 1 0011 0198 unknown unknown RUNDATA 8039 301 1 1 1 0011 0098 unknown unknown RUNDATA 8049 301 1 1 1 0028 0143 unknown unknown RUNDATA 8054 301 1 1 1 0017 0209 unknown unknown RUNDATA 8055 301 1 1 1 0011 0129 unknown unknown RUNDATA 8056 301 1 1 1 0011 0152 unknown unknown RUNDATA 8060 301 1 1 1 0011 0136 unknown unknown RUNDATA 8061 301 1 1 1 0011 0060 unknown unknown RUNDATA 8062 301 1 1 1 0011 0129 unknown unknown RUNDATA 8066 301 1 1 1 0011 0148 unknown unknown RUNDATA 8067 301 1 1 1 0011 0135 unknown unknown RUNDATA 8083 301 1 1 1 0019 0208 unknown unknown RUNDATA 8095 301 1 1 1 0017 0473 unknown unknown RUNDATA 8096 301 1 1 1 0011 0298 unknown unknown RUNDATA 8097 301 1 1 1 0011 0101 unknown unknown RUNDATA 8100 301 1 1 1 0033 0378 unknown unknown RUNDATA 8101 301 1 1 1 0011 0104 unknown unknown RUNDATA 8102 301 1 1 1 0011 0152 unknown unknown RUNDATA 8103 301 1 1 1 0011 0178 unknown unknown RUNDATA 8105 301 1 1 1 0011 0157 unknown unknown RUNDATA 8108 301 1 1 1 0017 0258 unknown unknown RUNDATA 8109 301 1 1 1 0011 0165 unknown unknown RUNDATA 8110 301 1 1 1 0011 0225 unknown unknown RUNDATA 8111 301 1 1 1 0011 0201 unknown unknown RUNDATA 8112 301 1 1 1 0011 0142 unknown unknown RUNDATA 8115 301 1 1 1 0020 0196 unknown unknown RUNDATA 8116 301 1 1 1 0011 0386 unknown unknown RUNDATA 8117 301 1 1 1 0011 0098 unknown unknown RUNDATA 8142 301 1 1 1 0014 0125 unknown unknown RUNDATA 8149 301 1 1 1 0021 0274 unknown unknown RUNDATA 8150 301 1 1 1 0011 0127 unknown unknown RUNDATA 8151 301 1 1 1 0011 0120 unknown unknown RUNDATA 8155 301 1 1 1 0020 0168 unknown unknown RUNDATA 8156 301 1 1 1 0011 0241 unknown unknown RUNDATA 8157 301 1 1 1 0011 0149 unknown unknown RUNDATA 8158 301 1 1 1 0011 0112 unknown unknown RUNDATA 8162 301 1 1 1 0080 0237 unknown unknown astrometry.net-0.67/sdss/runList-dr8.par000644 000765 000024 00000122034 12651445460 020403 0ustar00dstnstaff000000 000000 # # runList.par # # Created by SDSS3::Yanny.pm # # 2011-01-05 21:41:03 UTC # typedef struct { int run; # Run number char rerun[]; # Relevant rerun directory int exist; # Does a directory exist (has it ever been queued) (0/1)? int done; # Is this field done (0-Not done/1-Done)? int calib; # Is this field calibrated (0-No/1-Yes)? # All the fields below are only updated if the run is done # Otherwise, they are set to zero. int startfield; # Starting field - determined from fpObjc present int endfield; # Ending field char machine[]; # The machine the data is on char disk[]; # The disk this run is on.... } RUNDATA; RUNDATA 1933 157 1 1 1 0011 0122 unknown unknown RUNDATA 2253 157 1 1 1 0011 0338 unknown unknown RUNDATA 3147 157 1 1 1 0011 0255 unknown unknown RUNDATA 3171 157 1 1 1 0011 0335 unknown unknown RUNDATA 3172 157 1 0 0 0 0 unknown unknown RUNDATA 3173 157 1 1 1 0011 0447 unknown unknown RUNDATA 3174 157 1 1 1 0011 0223 unknown unknown RUNDATA 3466 157 1 1 1 0011 0223 unknown unknown RUNDATA 3467 157 1 1 1 0011 0111 unknown unknown RUNDATA 3468 157 1 1 1 0011 0127 unknown unknown RUNDATA 3469 157 1 1 1 0011 0159 unknown unknown RUNDATA 3470 157 1 1 1 0011 0239 unknown unknown RUNDATA 3471 157 1 1 1 0011 0159 unknown unknown RUNDATA 3472 157 1 1 1 0011 0143 unknown unknown RUNDATA 3473 157 1 1 1 0011 0175 unknown unknown RUNDATA 3575 157 1 1 1 0011 0767 unknown unknown RUNDATA 3576 157 1 1 1 0011 0399 unknown unknown RUNDATA 3577 157 1 1 1 0011 0239 unknown unknown RUNDATA 3578 157 1 1 1 0011 0351 unknown unknown RUNDATA 3579 157 1 1 1 0011 0335 unknown unknown RUNDATA 3580 157 1 1 1 0011 0287 unknown unknown RUNDATA 3581 157 1 1 1 0011 0623 unknown unknown RUNDATA 3582 157 1 1 1 0011 0127 unknown unknown RUNDATA 3583 157 1 1 1 0011 0687 unknown unknown RUNDATA 3638 157 1 1 1 0011 0367 unknown unknown RUNDATA 3639 157 1 1 1 0011 0383 unknown unknown RUNDATA 3669 157 1 1 1 0011 0031 unknown unknown RUNDATA 4033 157 1 1 1 0011 0369 unknown unknown RUNDATA 4034 157 1 0 0 0 0 unknown unknown RUNDATA 4121 157 1 1 1 0011 0319 unknown unknown RUNDATA 4122 157 1 0 0 0 0 unknown unknown RUNDATA 4123 157 1 1 1 0011 0127 unknown unknown RUNDATA 4124 157 1 0 0 0 0 unknown unknown RUNDATA 4160 157 1 1 1 0011 0781 unknown unknown RUNDATA 4162 157 1 1 1 0011 0311 unknown unknown RUNDATA 4163 157 1 0 0 0 0 unknown unknown RUNDATA 4164 157 1 1 1 0011 0203 unknown unknown RUNDATA 4165 157 1 0 0 0 0 unknown unknown RUNDATA 4221 157 1 0 0 0 0 unknown unknown RUNDATA 4222 157 1 1 1 0011 0787 unknown unknown RUNDATA 4223 157 1 1 1 0011 0631 unknown unknown RUNDATA 4224 157 1 1 1 0011 0069 unknown unknown RUNDATA 4225 157 1 1 1 0011 0475 unknown unknown RUNDATA 4240 157 1 1 1 0011 0831 unknown unknown RUNDATA 4248 157 1 1 1 0011 0767 unknown unknown RUNDATA 4249 157 1 1 1 0011 0783 unknown unknown RUNDATA 4266 157 1 1 1 0011 0751 unknown unknown RUNDATA 4267 157 1 1 1 0011 0783 unknown unknown RUNDATA 4268 157 1 1 1 0011 0623 unknown unknown RUNDATA 4269 157 1 1 1 0011 0495 unknown unknown RUNDATA 4270 157 1 1 1 0011 0767 unknown unknown RUNDATA 4271 157 1 1 1 0011 0623 unknown unknown RUNDATA 4272 157 1 1 1 0011 0543 unknown unknown RUNDATA 4273 157 1 1 1 0011 0415 unknown unknown RUNDATA 4274 157 1 1 1 0011 0783 unknown unknown RUNDATA 4275 157 1 1 1 0011 0271 unknown unknown RUNDATA 4281 157 1 1 1 0011 0783 unknown unknown RUNDATA 4282 157 1 1 1 0011 0767 unknown unknown RUNDATA 4283 157 1 1 1 0011 0623 unknown unknown RUNDATA 4284 157 1 1 1 0011 0479 unknown unknown RUNDATA 4291 157 1 1 1 0011 0511 unknown unknown RUNDATA 4322 157 1 1 1 0011 0847 unknown unknown RUNDATA 4329 157 1 1 1 0011 0687 unknown unknown RUNDATA 4330 157 1 1 1 0011 0671 unknown unknown RUNDATA 4331 157 1 1 1 0011 0799 unknown unknown RUNDATA 4473 157 1 1 1 0011 0815 unknown unknown RUNDATA 4474 157 1 1 1 0011 0767 unknown unknown RUNDATA 4475 157 1 1 1 0011 0719 unknown unknown RUNDATA 4476 157 1 1 1 0011 0479 unknown unknown RUNDATA 4477 157 1 1 1 0011 0639 unknown unknown RUNDATA 4557 157 1 1 1 0011 0543 unknown unknown RUNDATA 4558 157 1 0 0 0 0 unknown unknown RUNDATA 4559 157 1 0 0 0 0 unknown unknown RUNDATA 4560 157 1 1 1 0011 0783 unknown unknown RUNDATA 4561 157 1 1 1 0011 0495 unknown unknown RUNDATA 4562 157 1 1 1 0011 0639 unknown unknown RUNDATA 4563 157 1 0 0 0 0 unknown unknown RUNDATA 5194 157 1 0 0 0 0 unknown unknown RUNDATA 94 301 1 1 1 0011 0546 unknown unknown RUNDATA 109 301 1 1 1 0011 0214 unknown unknown RUNDATA 125 301 1 1 1 0011 0589 unknown unknown RUNDATA 211 301 1 1 1 0011 0385 unknown unknown RUNDATA 240 301 1 1 1 0011 0165 unknown unknown RUNDATA 241 301 1 1 1 0011 0111 unknown unknown RUNDATA 250 301 1 1 1 0011 0455 unknown unknown RUNDATA 251 301 1 1 1 0011 0083 unknown unknown RUNDATA 256 301 1 1 1 0011 0057 unknown unknown RUNDATA 259 301 1 1 1 0012 0567 unknown unknown RUNDATA 273 301 1 1 1 0011 0534 unknown unknown RUNDATA 287 301 1 1 1 0011 0437 unknown unknown RUNDATA 297 301 1 1 1 0011 0203 unknown unknown RUNDATA 307 301 1 1 1 0011 0186 unknown unknown RUNDATA 308 301 1 1 1 0011 0216 unknown unknown RUNDATA 727 301 1 1 1 0011 0082 unknown unknown RUNDATA 745 301 1 1 1 0011 0611 unknown unknown RUNDATA 752 301 1 1 1 0011 0723 unknown unknown RUNDATA 756 301 1 1 1 0011 0812 unknown unknown RUNDATA 994 301 1 1 1 0011 0133 unknown unknown RUNDATA 1000 301 1 1 1 0027 0201 unknown unknown RUNDATA 1006 301 1 1 1 0011 0066 unknown unknown RUNDATA 1009 301 1 1 1 0011 0227 unknown unknown RUNDATA 1010 301 1 1 1 0011 0087 unknown unknown RUNDATA 1011 301 1 1 1 0011 0174 unknown unknown RUNDATA 1013 301 1 1 1 0011 0110 unknown unknown RUNDATA 1022 301 1 1 1 0011 0205 unknown unknown RUNDATA 1024 301 1 1 1 0011 0156 unknown unknown RUNDATA 1033 301 1 1 1 0011 0246 unknown unknown RUNDATA 1035 301 1 1 1 0011 0186 unknown unknown RUNDATA 1037 301 1 1 1 0011 0203 unknown unknown RUNDATA 1040 301 1 1 1 0038 0159 unknown unknown RUNDATA 1043 301 1 1 1 0011 0237 unknown unknown RUNDATA 1045 301 1 1 1 0011 0223 unknown unknown RUNDATA 1055 301 1 1 1 0011 0034 unknown unknown RUNDATA 1056 301 1 1 1 0013 0234 unknown unknown RUNDATA 1057 301 1 1 1 0011 0110 unknown unknown RUNDATA 1119 301 1 1 1 0011 0033 unknown unknown RUNDATA 1120 301 1 1 1 0011 0044 unknown unknown RUNDATA 1122 301 1 1 1 0011 0121 unknown unknown RUNDATA 1133 301 1 1 1 0018 0046 unknown unknown RUNDATA 1140 301 1 1 1 0011 0354 unknown unknown RUNDATA 1142 301 1 1 1 0011 0050 unknown unknown RUNDATA 1231 301 1 1 1 0011 0215 unknown unknown RUNDATA 1233 301 1 1 1 0011 0054 unknown unknown RUNDATA 1239 301 1 1 1 0011 0188 unknown unknown RUNDATA 1241 301 1 1 1 0011 0187 unknown unknown RUNDATA 1302 301 1 1 1 0011 0438 unknown unknown RUNDATA 1329 301 1 1 1 0011 0055 unknown unknown RUNDATA 1331 301 1 1 1 0011 0279 unknown unknown RUNDATA 1332 301 1 1 1 0011 0069 unknown unknown RUNDATA 1334 301 1 1 1 0011 0091 unknown unknown RUNDATA 1336 301 1 1 1 0011 0098 unknown unknown RUNDATA 1339 301 1 1 1 0011 0097 unknown unknown RUNDATA 1345 301 1 1 1 0011 0857 unknown unknown RUNDATA 1350 301 1 1 1 0011 0465 unknown unknown RUNDATA 1352 301 1 1 1 0011 0060 unknown unknown RUNDATA 1356 301 1 1 1 0011 0114 unknown unknown RUNDATA 1359 301 1 1 1 0011 0116 unknown unknown RUNDATA 1363 301 1 1 1 0011 0129 unknown unknown RUNDATA 1365 301 1 1 1 0011 0132 unknown unknown RUNDATA 1402 301 1 1 1 0011 0203 unknown unknown RUNDATA 1404 301 1 1 1 0011 0068 unknown unknown RUNDATA 1411 301 1 1 1 0011 0092 unknown unknown RUNDATA 1412 301 1 1 1 0011 0391 unknown unknown RUNDATA 1449 301 1 1 1 0020 0096 unknown unknown RUNDATA 1450 301 1 1 1 0011 0116 unknown unknown RUNDATA 1451 301 1 1 1 0021 0073 unknown unknown RUNDATA 1452 301 1 1 1 0028 0122 unknown unknown RUNDATA 1453 301 1 1 1 0026 0124 unknown unknown RUNDATA 1458 301 1 1 1 0053 0784 unknown unknown RUNDATA 1462 301 1 1 1 0023 0688 unknown unknown RUNDATA 1463 301 1 1 1 0026 0076 unknown unknown RUNDATA 1473 301 1 1 1 0020 0099 unknown unknown RUNDATA 1477 301 1 1 1 0050 0097 unknown unknown RUNDATA 1478 301 1 1 1 0017 0221 unknown unknown RUNDATA 1481 301 1 1 1 0046 0099 unknown unknown RUNDATA 1484 301 1 1 1 0011 0051 unknown unknown RUNDATA 1659 301 1 1 1 0011 0359 unknown unknown RUNDATA 1662 301 1 1 1 0026 0151 unknown unknown RUNDATA 1663 301 1 1 1 0035 0077 unknown unknown RUNDATA 1666 301 1 1 1 0111 0308 unknown unknown RUNDATA 1729 301 1 1 1 0011 0503 unknown unknown RUNDATA 1736 301 1 1 1 0026 0047 unknown unknown RUNDATA 1737 301 1 1 1 0011 0144 unknown unknown RUNDATA 1738 301 1 1 1 0011 0085 unknown unknown RUNDATA 1739 301 1 1 1 0011 0323 unknown unknown RUNDATA 1740 301 1 1 1 0011 0167 unknown unknown RUNDATA 1741 301 1 1 1 0011 0060 unknown unknown RUNDATA 1742 301 1 1 1 0011 0075 unknown unknown RUNDATA 1749 301 1 1 1 0040 0220 unknown unknown RUNDATA 1752 301 1 1 1 0030 0372 unknown unknown RUNDATA 1754 301 1 1 1 0028 0069 unknown unknown RUNDATA 1755 301 1 1 1 0064 0684 unknown unknown RUNDATA 1854 301 1 1 1 0059 0149 unknown unknown RUNDATA 1855 301 1 1 1 0029 0140 unknown unknown RUNDATA 1862 301 1 1 1 0032 0134 unknown unknown RUNDATA 1863 301 1 1 1 0011 0092 unknown unknown RUNDATA 1869 301 1 1 1 0039 0112 unknown unknown RUNDATA 1886 301 1 1 1 0039 0143 unknown unknown RUNDATA 1887 301 1 1 1 0050 0190 unknown unknown RUNDATA 1888 301 1 1 1 0025 0112 unknown unknown RUNDATA 1889 301 1 1 1 0024 0335 unknown unknown RUNDATA 1891 301 1 1 1 0031 0095 unknown unknown RUNDATA 1892 301 1 1 1 0016 0052 unknown unknown RUNDATA 1893 301 1 1 1 0011 0125 unknown unknown RUNDATA 1894 301 1 1 1 0011 0177 unknown unknown RUNDATA 1895 301 1 1 1 0042 0363 unknown unknown RUNDATA 1896 301 1 1 1 0042 0188 unknown unknown RUNDATA 1897 301 1 1 1 0011 0051 unknown unknown RUNDATA 1904 301 1 1 1 0011 0371 unknown unknown RUNDATA 1907 301 1 1 1 0011 0248 unknown unknown RUNDATA 1908 301 1 1 1 0011 0058 unknown unknown RUNDATA 1923 301 1 1 1 0029 0071 unknown unknown RUNDATA 1924 301 1 1 1 0034 0078 unknown unknown RUNDATA 1925 301 1 1 1 0017 0048 unknown unknown RUNDATA 1926 301 1 1 1 0024 0079 unknown unknown RUNDATA 1927 301 1 1 1 0011 0065 unknown unknown RUNDATA 1992 301 1 1 1 0011 0192 unknown unknown RUNDATA 2029 301 1 1 1 0182 0284 unknown unknown RUNDATA 2062 301 1 1 1 0044 0200 unknown unknown RUNDATA 2064 301 1 1 1 0021 0152 unknown unknown RUNDATA 2065 301 1 1 1 0052 0197 unknown unknown RUNDATA 2068 301 1 1 1 0119 0207 unknown unknown RUNDATA 2069 301 1 1 1 0031 0141 unknown unknown RUNDATA 2073 301 1 1 1 0053 0155 unknown unknown RUNDATA 2074 301 1 1 1 0011 0213 unknown unknown RUNDATA 2075 301 1 1 1 0028 0076 unknown unknown RUNDATA 2076 301 1 1 1 0018 0175 unknown unknown RUNDATA 2078 301 1 1 1 0019 0279 unknown unknown RUNDATA 2124 301 1 1 1 0011 0079 unknown unknown RUNDATA 2125 301 1 1 1 0011 0329 unknown unknown RUNDATA 2126 301 1 1 1 0011 0443 unknown unknown RUNDATA 2127 301 1 1 1 0021 0097 unknown unknown RUNDATA 2131 301 1 1 1 0011 0276 unknown unknown RUNDATA 2133 301 1 1 1 0011 0112 unknown unknown RUNDATA 2134 301 1 1 1 0024 0381 unknown unknown RUNDATA 2137 301 1 1 1 0045 0312 unknown unknown RUNDATA 2138 301 1 1 1 0011 0139 unknown unknown RUNDATA 2140 301 1 1 1 0011 0123 unknown unknown RUNDATA 2141 301 1 1 1 0019 0311 unknown unknown RUNDATA 2142 301 1 1 1 0011 0026 unknown unknown RUNDATA 2143 301 1 1 1 0011 0028 unknown unknown RUNDATA 2167 301 1 1 1 0089 0210 unknown unknown RUNDATA 2168 301 1 1 1 0033 0170 unknown unknown RUNDATA 2187 301 1 1 1 0018 0067 unknown unknown RUNDATA 2188 301 1 1 1 0011 0228 unknown unknown RUNDATA 2189 301 1 1 1 0023 0143 unknown unknown RUNDATA 2190 301 1 1 1 0019 0403 unknown unknown RUNDATA 2194 301 1 1 1 0011 0406 unknown unknown RUNDATA 2206 301 1 1 1 0031 0363 unknown unknown RUNDATA 2207 301 1 1 1 0020 0178 unknown unknown RUNDATA 2243 301 1 1 1 0043 0415 unknown unknown RUNDATA 2244 301 1 1 1 0011 0080 unknown unknown RUNDATA 2247 301 1 1 1 0011 0336 unknown unknown RUNDATA 2248 301 1 1 1 0025 0276 unknown unknown RUNDATA 2259 301 1 1 1 0011 0217 unknown unknown RUNDATA 2267 301 1 1 1 0046 0107 unknown unknown RUNDATA 2297 301 1 1 1 0020 0044 unknown unknown RUNDATA 2298 301 1 1 1 0011 0094 unknown unknown RUNDATA 2299 301 1 1 1 0011 0330 unknown unknown RUNDATA 2304 301 1 1 1 0015 0341 unknown unknown RUNDATA 2305 301 1 1 1 0011 0185 unknown unknown RUNDATA 2322 301 1 1 1 0011 0147 unknown unknown RUNDATA 2326 301 1 1 1 0011 0326 unknown unknown RUNDATA 2327 301 1 1 1 0011 0099 unknown unknown RUNDATA 2328 301 1 1 1 0011 0179 unknown unknown RUNDATA 2333 301 1 1 1 0011 0138 unknown unknown RUNDATA 2334 301 1 1 1 0011 0289 unknown unknown RUNDATA 2335 301 1 1 1 0011 0152 unknown unknown RUNDATA 2336 301 1 1 1 0011 0079 unknown unknown RUNDATA 2346 301 1 1 1 0036 0185 unknown unknown RUNDATA 2347 301 1 1 1 0011 0064 unknown unknown RUNDATA 2348 301 1 1 1 0011 0077 unknown unknown RUNDATA 2379 301 1 1 1 0032 0198 unknown unknown RUNDATA 2385 301 1 1 1 0011 0102 unknown unknown RUNDATA 2391 301 1 1 1 0029 0252 unknown unknown RUNDATA 2392 301 1 1 1 0011 0243 unknown unknown RUNDATA 2505 301 1 1 1 0017 0066 unknown unknown RUNDATA 2506 301 1 1 1 0011 0083 unknown unknown RUNDATA 2507 301 1 1 1 0011 0329 unknown unknown RUNDATA 2566 301 1 1 1 0041 0361 unknown unknown RUNDATA 2570 301 1 1 1 0084 0337 unknown unknown RUNDATA 2574 301 1 1 1 0035 0186 unknown unknown RUNDATA 2575 301 1 1 1 0024 0083 unknown unknown RUNDATA 2576 301 1 1 1 0026 0189 unknown unknown RUNDATA 2578 301 1 1 1 0041 0212 unknown unknown RUNDATA 2579 301 1 1 1 0029 0151 unknown unknown RUNDATA 2582 301 1 1 1 0045 0291 unknown unknown RUNDATA 2583 301 1 1 1 0030 0256 unknown unknown RUNDATA 2585 301 1 1 1 0011 0097 unknown unknown RUNDATA 2589 301 1 1 1 0062 0306 unknown unknown RUNDATA 2591 301 1 1 1 0011 0077 unknown unknown RUNDATA 2649 301 1 1 1 0011 0180 unknown unknown RUNDATA 2650 301 1 1 1 0011 0086 unknown unknown RUNDATA 2659 301 1 1 1 0018 0154 unknown unknown RUNDATA 2662 301 1 1 1 0011 0479 unknown unknown RUNDATA 2677 301 1 1 1 0034 0233 unknown unknown RUNDATA 2699 301 1 1 1 0023 0099 unknown unknown RUNDATA 2700 301 1 1 1 0011 0273 unknown unknown RUNDATA 2703 301 1 1 1 0011 0047 unknown unknown RUNDATA 2708 301 1 1 1 0011 0271 unknown unknown RUNDATA 2709 301 1 1 1 0011 0273 unknown unknown RUNDATA 2711 301 1 1 1 0011 0196 unknown unknown RUNDATA 2728 301 1 1 1 0146 0633 unknown unknown RUNDATA 2734 301 1 1 1 0021 0075 unknown unknown RUNDATA 2735 301 1 1 1 0011 0136 unknown unknown RUNDATA 2738 301 1 1 1 0011 0323 unknown unknown RUNDATA 2740 301 1 1 1 0039 0344 unknown unknown RUNDATA 2766 301 1 1 1 0011 0081 unknown unknown RUNDATA 2768 301 1 1 1 0024 0304 unknown unknown RUNDATA 2777 301 1 1 1 0011 0275 unknown unknown RUNDATA 2780 301 1 1 1 0011 0079 unknown unknown RUNDATA 2820 301 1 1 1 0016 0267 unknown unknown RUNDATA 2821 301 1 1 1 0023 0223 unknown unknown RUNDATA 2822 301 1 1 1 0011 0266 unknown unknown RUNDATA 2825 301 1 1 1 0011 0269 unknown unknown RUNDATA 2826 301 1 1 1 0011 0375 unknown unknown RUNDATA 2830 301 1 1 1 0016 0554 unknown unknown RUNDATA 2831 301 1 1 1 0011 0089 unknown unknown RUNDATA 2854 301 1 1 1 0071 0116 unknown unknown RUNDATA 2855 301 1 1 1 0011 0068 unknown unknown RUNDATA 2856 301 1 1 1 0011 0123 unknown unknown RUNDATA 2861 301 1 1 1 0011 0206 unknown unknown RUNDATA 2863 301 1 1 1 0011 0231 unknown unknown RUNDATA 2864 301 1 1 1 0011 0259 unknown unknown RUNDATA 2873 301 1 1 1 0037 0318 unknown unknown RUNDATA 2882 301 1 1 1 0011 0090 unknown unknown RUNDATA 2883 301 1 1 1 0011 0331 unknown unknown RUNDATA 2886 301 1 1 1 0021 0318 unknown unknown RUNDATA 2887 301 1 1 1 0011 0346 unknown unknown RUNDATA 2888 301 1 1 1 0011 0212 unknown unknown RUNDATA 2955 301 1 1 1 0021 0166 unknown unknown RUNDATA 2960 301 1 1 1 0011 0127 unknown unknown RUNDATA 2961 301 1 1 1 0011 0150 unknown unknown RUNDATA 2963 301 1 1 1 0011 0118 unknown unknown RUNDATA 2964 301 1 1 1 0011 0575 unknown unknown RUNDATA 2968 301 1 1 1 0019 0094 unknown unknown RUNDATA 2986 301 1 1 1 0017 0336 unknown unknown RUNDATA 2987 301 1 1 1 0011 0124 unknown unknown RUNDATA 2989 301 1 1 1 0011 0120 unknown unknown RUNDATA 3015 301 1 1 1 0056 0468 unknown unknown RUNDATA 3031 301 1 1 1 0011 0701 unknown unknown RUNDATA 3058 301 1 1 1 0011 0094 unknown unknown RUNDATA 3059 301 1 1 1 0011 0169 unknown unknown RUNDATA 3063 301 1 1 1 0011 0091 unknown unknown RUNDATA 3064 301 1 1 1 0011 0078 unknown unknown RUNDATA 3098 301 1 1 1 0026 0130 unknown unknown RUNDATA 3103 301 1 1 1 0011 0265 unknown unknown RUNDATA 3104 301 1 1 1 0011 0058 unknown unknown RUNDATA 3130 301 1 1 1 0011 0127 unknown unknown RUNDATA 3170 301 1 1 1 0015 0063 unknown unknown RUNDATA 3177 301 1 1 1 0019 0370 unknown unknown RUNDATA 3180 301 1 1 1 0011 0259 unknown unknown RUNDATA 3183 301 1 1 1 0023 0168 unknown unknown RUNDATA 3184 301 1 1 1 0011 0175 unknown unknown RUNDATA 3185 301 1 1 1 0011 0158 unknown unknown RUNDATA 3187 301 1 1 1 0011 0203 unknown unknown RUNDATA 3204 301 1 1 1 0041 0116 unknown unknown RUNDATA 3206 301 1 1 1 0011 0052 unknown unknown RUNDATA 3225 301 1 1 1 0020 0365 unknown unknown RUNDATA 3226 301 1 1 1 0011 0228 unknown unknown RUNDATA 3229 301 1 1 1 0046 0103 unknown unknown RUNDATA 3230 301 1 1 1 0017 0104 unknown unknown RUNDATA 3256 301 1 1 1 0011 0070 unknown unknown RUNDATA 3313 301 1 1 1 0035 0099 unknown unknown RUNDATA 3322 301 1 1 1 0031 0124 unknown unknown RUNDATA 3323 301 1 1 1 0011 0082 unknown unknown RUNDATA 3325 301 1 1 1 0016 0508 unknown unknown RUNDATA 3354 301 1 1 1 0045 0071 unknown unknown RUNDATA 3355 301 1 1 1 0011 0276 unknown unknown RUNDATA 3356 301 1 1 1 0011 0092 unknown unknown RUNDATA 3358 301 1 1 1 0033 0177 unknown unknown RUNDATA 3360 301 1 1 1 0011 0523 unknown unknown RUNDATA 3362 301 1 1 1 0011 0235 unknown unknown RUNDATA 3366 301 1 1 1 0027 0138 unknown unknown RUNDATA 3367 301 1 1 1 0011 0138 unknown unknown RUNDATA 3368 301 1 1 1 0011 0037 unknown unknown RUNDATA 3384 301 1 1 1 0014 0797 unknown unknown RUNDATA 3388 301 1 1 1 0011 0723 unknown unknown RUNDATA 3427 301 1 1 1 0016 0145 unknown unknown RUNDATA 3430 301 1 1 1 0031 0114 unknown unknown RUNDATA 3434 301 1 1 1 0027 0578 unknown unknown RUNDATA 3437 301 1 1 1 0015 0502 unknown unknown RUNDATA 3438 301 1 1 1 0011 0199 unknown unknown RUNDATA 3458 301 1 1 1 0011 0045 unknown unknown RUNDATA 3460 301 1 1 1 0031 0275 unknown unknown RUNDATA 3461 301 1 1 1 0011 0119 unknown unknown RUNDATA 3462 301 1 1 1 0011 0299 unknown unknown RUNDATA 3465 301 1 1 1 0017 0369 unknown unknown RUNDATA 3478 301 1 1 1 0024 0189 unknown unknown RUNDATA 3511 301 1 1 1 0014 0089 unknown unknown RUNDATA 3512 301 1 1 1 0011 0090 unknown unknown RUNDATA 3513 301 1 1 1 0011 0149 unknown unknown RUNDATA 3518 301 1 1 1 0014 0141 unknown unknown RUNDATA 3525 301 1 1 1 0054 0271 unknown unknown RUNDATA 3530 301 1 1 1 0011 0405 unknown unknown RUNDATA 3538 301 1 1 1 0011 0329 unknown unknown RUNDATA 3557 301 1 1 1 0011 0086 unknown unknown RUNDATA 3559 301 1 1 1 0011 0086 unknown unknown RUNDATA 3560 301 1 1 1 0011 0342 unknown unknown RUNDATA 3562 301 1 1 1 0014 0146 unknown unknown RUNDATA 3563 301 1 1 1 0011 0061 unknown unknown RUNDATA 3565 301 1 1 1 0058 0209 unknown unknown RUNDATA 3600 301 1 1 1 0016 0118 unknown unknown RUNDATA 3605 301 1 1 1 0011 0176 unknown unknown RUNDATA 3606 301 1 1 1 0011 0174 unknown unknown RUNDATA 3610 301 1 1 1 0017 0148 unknown unknown RUNDATA 3614 301 1 1 1 0011 0075 unknown unknown RUNDATA 3615 301 1 1 1 0011 0095 unknown unknown RUNDATA 3624 301 1 1 1 0011 0068 unknown unknown RUNDATA 3628 301 1 1 1 0017 0165 unknown unknown RUNDATA 3629 301 1 1 1 0011 0129 unknown unknown RUNDATA 3630 301 1 1 1 0011 0270 unknown unknown RUNDATA 3631 301 1 1 1 0011 0510 unknown unknown RUNDATA 3634 301 1 1 1 0018 0162 unknown unknown RUNDATA 3635 301 1 1 1 0011 0226 unknown unknown RUNDATA 3636 301 1 1 1 0011 0052 unknown unknown RUNDATA 3642 301 1 1 1 0011 0097 unknown unknown RUNDATA 3643 301 1 1 1 0011 0119 unknown unknown RUNDATA 3644 301 1 1 1 0011 0314 unknown unknown RUNDATA 3646 301 1 1 1 0011 0062 unknown unknown RUNDATA 3647 301 1 1 1 0011 0195 unknown unknown RUNDATA 3648 301 1 1 1 0011 0063 unknown unknown RUNDATA 3649 301 1 1 1 0011 0040 unknown unknown RUNDATA 3650 301 1 1 1 0011 0137 unknown unknown RUNDATA 3664 301 1 1 1 0011 0115 unknown unknown RUNDATA 3697 301 1 1 1 0011 0095 unknown unknown RUNDATA 3698 301 1 1 1 0011 0227 unknown unknown RUNDATA 3699 301 1 1 1 0011 0253 unknown unknown RUNDATA 3704 301 1 1 1 0011 0193 unknown unknown RUNDATA 3705 301 1 1 1 0011 0417 unknown unknown RUNDATA 3712 301 1 1 1 0011 0266 unknown unknown RUNDATA 3716 301 1 1 1 0019 0256 unknown unknown RUNDATA 3723 301 1 1 1 0017 0246 unknown unknown RUNDATA 3804 301 1 1 1 0011 0214 unknown unknown RUNDATA 3805 301 1 1 1 0011 0134 unknown unknown RUNDATA 3813 301 1 1 1 0011 0549 unknown unknown RUNDATA 3818 301 1 1 1 0011 0435 unknown unknown RUNDATA 3829 301 1 1 1 0011 0036 unknown unknown RUNDATA 3830 301 1 1 1 0011 0328 unknown unknown RUNDATA 3835 301 1 1 1 0026 0067 unknown unknown RUNDATA 3836 301 1 1 1 0011 0648 unknown unknown RUNDATA 3838 301 1 1 1 0011 0136 unknown unknown RUNDATA 3840 301 1 1 1 0011 0275 unknown unknown RUNDATA 3841 301 1 1 1 0011 0329 unknown unknown RUNDATA 3842 301 1 1 1 0011 0256 unknown unknown RUNDATA 3893 301 1 1 1 0017 0473 unknown unknown RUNDATA 3894 301 1 1 1 0011 0332 unknown unknown RUNDATA 3900 301 1 1 1 0016 0830 unknown unknown RUNDATA 3903 301 1 1 1 0019 0431 unknown unknown RUNDATA 3905 301 1 1 1 0011 0134 unknown unknown RUNDATA 3909 301 1 1 1 0018 0334 unknown unknown RUNDATA 3910 301 1 1 1 0011 0227 unknown unknown RUNDATA 3911 301 1 1 1 0011 0072 unknown unknown RUNDATA 3918 301 1 1 1 0028 0434 unknown unknown RUNDATA 3919 301 1 1 1 0011 0362 unknown unknown RUNDATA 3925 301 1 1 1 0020 0057 unknown unknown RUNDATA 3926 301 1 1 1 0011 0233 unknown unknown RUNDATA 3927 301 1 1 1 0011 0210 unknown unknown RUNDATA 3957 301 1 1 1 0011 0047 unknown unknown RUNDATA 3958 301 1 1 1 0011 0216 unknown unknown RUNDATA 3959 301 1 1 1 0011 0024 unknown unknown RUNDATA 3964 301 1 1 1 0011 0334 unknown unknown RUNDATA 3965 301 1 1 1 0011 0214 unknown unknown RUNDATA 3967 301 1 1 1 0011 0118 unknown unknown RUNDATA 3970 301 1 1 1 0016 0178 unknown unknown RUNDATA 3971 301 1 1 1 0011 0241 unknown unknown RUNDATA 3972 301 1 1 1 0011 0162 unknown unknown RUNDATA 3983 301 1 1 1 0011 0182 unknown unknown RUNDATA 3992 301 1 1 1 0011 0189 unknown unknown RUNDATA 3996 301 1 1 1 0025 0293 unknown unknown RUNDATA 3997 301 1 1 1 0011 0165 unknown unknown RUNDATA 4002 301 1 1 1 0020 0326 unknown unknown RUNDATA 4003 301 1 1 1 0011 0102 unknown unknown RUNDATA 4007 301 1 1 1 0014 0106 unknown unknown RUNDATA 4010 301 1 1 1 0031 0291 unknown unknown RUNDATA 4011 301 1 1 1 0011 0271 unknown unknown RUNDATA 4014 301 1 1 1 0033 0337 unknown unknown RUNDATA 4015 301 1 1 1 0011 0203 unknown unknown RUNDATA 4023 301 1 1 1 0023 0133 unknown unknown RUNDATA 4031 301 1 1 1 0022 0072 unknown unknown RUNDATA 4072 301 1 1 1 0011 0114 unknown unknown RUNDATA 4073 301 1 1 1 0011 0160 unknown unknown RUNDATA 4076 301 1 1 1 0011 0242 unknown unknown RUNDATA 4100 301 1 1 1 0011 0195 unknown unknown RUNDATA 4107 301 1 1 1 0026 0072 unknown unknown RUNDATA 4114 301 1 1 1 0041 0127 unknown unknown RUNDATA 4115 301 1 1 1 0011 0069 unknown unknown RUNDATA 4116 301 1 1 1 0011 0077 unknown unknown RUNDATA 4119 301 1 1 1 0011 0070 unknown unknown RUNDATA 4127 301 1 1 1 0027 0101 unknown unknown RUNDATA 4128 301 1 1 1 0011 0525 unknown unknown RUNDATA 4134 301 1 1 1 0020 0405 unknown unknown RUNDATA 4135 301 1 1 1 0011 0307 unknown unknown RUNDATA 4136 301 1 1 1 0011 0215 unknown unknown RUNDATA 4143 301 1 1 1 0020 0143 unknown unknown RUNDATA 4144 301 1 1 1 0011 0191 unknown unknown RUNDATA 4145 301 1 1 1 0011 0515 unknown unknown RUNDATA 4152 301 1 1 1 0011 0185 unknown unknown RUNDATA 4153 301 1 1 1 0011 0175 unknown unknown RUNDATA 4157 301 1 1 1 0014 0276 unknown unknown RUNDATA 4158 301 1 1 1 0044 0120 unknown unknown RUNDATA 4184 301 1 1 1 0032 0313 unknown unknown RUNDATA 4187 301 1 1 1 0022 0114 unknown unknown RUNDATA 4188 301 1 1 1 0011 0155 unknown unknown RUNDATA 4191 301 1 1 1 0014 0028 unknown unknown RUNDATA 4192 301 1 1 1 0011 0503 unknown unknown RUNDATA 4198 301 1 1 1 0016 0762 unknown unknown RUNDATA 4203 301 1 1 1 0030 0806 unknown unknown RUNDATA 4204 301 1 1 1 0011 0258 unknown unknown RUNDATA 4207 301 1 1 1 0020 0772 unknown unknown RUNDATA 4208 301 1 1 1 0011 0275 unknown unknown RUNDATA 4233 301 1 1 1 0011 0160 unknown unknown RUNDATA 4247 301 1 1 1 0011 0288 unknown unknown RUNDATA 4252 301 1 1 1 0025 0105 unknown unknown RUNDATA 4253 301 1 1 1 0011 0183 unknown unknown RUNDATA 4263 301 1 1 1 0011 0468 unknown unknown RUNDATA 4264 301 1 1 1 0011 0268 unknown unknown RUNDATA 4288 301 1 1 1 0011 0179 unknown unknown RUNDATA 4294 301 1 1 1 0011 0251 unknown unknown RUNDATA 4326 301 1 1 1 0011 0068 unknown unknown RUNDATA 4334 301 1 1 1 0011 0303 unknown unknown RUNDATA 4335 301 1 1 1 0011 0236 unknown unknown RUNDATA 4336 301 1 1 1 0011 0073 unknown unknown RUNDATA 4338 301 1 1 1 0011 0101 unknown unknown RUNDATA 4344 301 1 1 1 0020 0289 unknown unknown RUNDATA 4380 301 1 1 1 0026 0148 unknown unknown RUNDATA 4381 301 1 1 1 0011 0263 unknown unknown RUNDATA 4382 301 1 1 1 0011 0126 unknown unknown RUNDATA 4388 301 1 1 1 0132 0232 unknown unknown RUNDATA 4389 301 1 1 1 0084 0123 unknown unknown RUNDATA 4392 301 1 1 1 0021 0306 unknown unknown RUNDATA 4448 301 1 1 1 0011 0098 unknown unknown RUNDATA 4458 301 1 1 1 0011 0094 unknown unknown RUNDATA 4469 301 1 1 1 0011 0475 unknown unknown RUNDATA 4470 301 1 1 1 0016 0177 unknown unknown RUNDATA 4503 301 1 1 1 0043 0145 unknown unknown RUNDATA 4504 301 1 1 1 0011 0261 unknown unknown RUNDATA 4508 301 1 1 1 0011 0236 unknown unknown RUNDATA 4510 301 1 1 1 0011 0041 unknown unknown RUNDATA 4512 301 1 1 1 0011 0281 unknown unknown RUNDATA 4516 301 1 1 1 0011 0189 unknown unknown RUNDATA 4517 301 1 1 1 0011 0135 unknown unknown RUNDATA 4518 301 1 1 1 0011 0209 unknown unknown RUNDATA 4520 301 1 1 1 0011 0155 unknown unknown RUNDATA 4540 301 1 1 1 0011 0073 unknown unknown RUNDATA 4549 301 1 1 1 0015 0093 unknown unknown RUNDATA 4550 301 1 1 1 0011 0098 unknown unknown RUNDATA 4552 301 1 1 1 0011 0293 unknown unknown RUNDATA 4555 301 1 1 1 0011 0112 unknown unknown RUNDATA 4569 301 1 1 1 0011 0318 unknown unknown RUNDATA 4570 301 1 1 1 0011 0322 unknown unknown RUNDATA 4571 301 1 1 1 0011 0125 unknown unknown RUNDATA 4576 301 1 1 1 0011 0818 unknown unknown RUNDATA 4588 301 1 1 1 0011 0324 unknown unknown RUNDATA 4599 301 1 1 1 0022 0249 unknown unknown RUNDATA 4600 301 1 1 1 0011 0120 unknown unknown RUNDATA 4623 301 1 1 1 0023 0426 unknown unknown RUNDATA 4628 301 1 1 1 0021 0132 unknown unknown RUNDATA 4629 301 1 1 1 0011 0302 unknown unknown RUNDATA 4632 301 1 1 1 0024 0222 unknown unknown RUNDATA 4633 301 1 1 1 0011 0154 unknown unknown RUNDATA 4646 301 1 1 1 0011 0390 unknown unknown RUNDATA 4649 301 1 1 1 0011 0463 unknown unknown RUNDATA 4663 301 1 1 1 0025 0109 unknown unknown RUNDATA 4670 301 1 1 1 0027 0368 unknown unknown RUNDATA 4671 301 1 1 1 0011 0156 unknown unknown RUNDATA 4674 301 1 1 1 0011 0325 unknown unknown RUNDATA 4678 301 1 1 1 0030 0334 unknown unknown RUNDATA 4679 301 1 1 1 0011 0317 unknown unknown RUNDATA 4682 301 1 1 1 0020 0298 unknown unknown RUNDATA 4797 301 1 1 1 0018 0190 unknown unknown RUNDATA 4800 301 1 1 1 0011 0118 unknown unknown RUNDATA 4822 301 1 1 1 0011 0568 unknown unknown RUNDATA 4828 301 1 1 1 0018 0599 unknown unknown RUNDATA 4829 301 1 1 1 0011 0335 unknown unknown RUNDATA 4832 301 1 1 1 0011 0582 unknown unknown RUNDATA 4836 301 1 1 1 0011 0479 unknown unknown RUNDATA 4843 301 1 1 1 0011 0344 unknown unknown RUNDATA 4844 301 1 1 1 0011 0169 unknown unknown RUNDATA 4849 301 1 1 1 0024 0941 unknown unknown RUNDATA 4851 301 1 1 1 0017 0101 unknown unknown RUNDATA 4858 301 1 1 1 0011 0749 unknown unknown RUNDATA 4868 301 1 1 1 0011 0619 unknown unknown RUNDATA 4874 301 1 1 1 0021 1001 unknown unknown RUNDATA 4879 301 1 1 1 0011 0201 unknown unknown RUNDATA 4880 301 1 1 1 0021 0118 unknown unknown RUNDATA 4884 301 1 1 1 0017 0107 unknown unknown RUNDATA 4887 301 1 1 1 0011 0292 unknown unknown RUNDATA 4894 301 1 1 1 0011 0208 unknown unknown RUNDATA 4895 301 1 1 1 0030 0497 unknown unknown RUNDATA 4899 301 1 1 1 0031 0360 unknown unknown RUNDATA 4900 301 1 1 1 0011 0162 unknown unknown RUNDATA 4905 301 1 1 1 0042 0472 unknown unknown RUNDATA 4927 301 1 1 1 0025 0761 unknown unknown RUNDATA 4930 301 1 1 1 0020 0395 unknown unknown RUNDATA 4933 301 1 1 1 0029 0776 unknown unknown RUNDATA 4948 301 1 1 1 0041 0350 unknown unknown RUNDATA 5036 301 1 1 1 0011 0091 unknown unknown RUNDATA 5037 301 1 1 1 0011 0135 unknown unknown RUNDATA 5038 301 1 1 1 0011 0190 unknown unknown RUNDATA 5042 301 1 1 1 0030 0275 unknown unknown RUNDATA 5043 301 1 1 1 0011 0076 unknown unknown RUNDATA 5044 301 1 1 1 0011 0142 unknown unknown RUNDATA 5045 301 1 1 1 0011 0209 unknown unknown RUNDATA 5046 301 1 1 1 0011 0045 unknown unknown RUNDATA 5047 301 1 1 1 0011 0110 unknown unknown RUNDATA 5052 301 1 1 1 0011 0272 unknown unknown RUNDATA 5060 301 1 1 1 0011 0202 unknown unknown RUNDATA 5061 301 1 1 1 0011 0456 unknown unknown RUNDATA 5064 301 1 1 1 0028 0218 unknown unknown RUNDATA 5065 301 1 1 1 0011 0255 unknown unknown RUNDATA 5066 301 1 1 1 0011 0105 unknown unknown RUNDATA 5069 301 1 1 1 0026 0274 unknown unknown RUNDATA 5070 301 1 1 1 0011 0042 unknown unknown RUNDATA 5071 301 1 1 1 0011 0504 unknown unknown RUNDATA 5072 301 1 1 1 0011 0055 unknown unknown RUNDATA 5079 301 1 1 1 0011 0069 unknown unknown RUNDATA 5080 301 1 1 1 0011 0286 unknown unknown RUNDATA 5087 301 1 1 1 0011 0337 unknown unknown RUNDATA 5112 301 1 1 1 0026 0473 unknown unknown RUNDATA 5115 301 1 1 1 0024 0212 unknown unknown RUNDATA 5116 301 1 1 1 0031 0242 unknown unknown RUNDATA 5125 301 1 1 1 0019 0315 unknown unknown RUNDATA 5137 301 1 1 1 0020 0347 unknown unknown RUNDATA 5138 301 1 1 1 0011 0098 unknown unknown RUNDATA 5140 301 1 1 1 0011 0178 unknown unknown RUNDATA 5181 301 1 1 1 0011 0129 unknown unknown RUNDATA 5182 301 1 1 1 0011 0208 unknown unknown RUNDATA 5183 301 1 1 1 0011 0687 unknown unknown RUNDATA 5194 301 1 1 1 0021 0906 unknown unknown RUNDATA 5224 301 1 1 1 0023 0443 unknown unknown RUNDATA 5225 301 1 1 1 0019 0216 unknown unknown RUNDATA 5237 301 1 1 1 0034 0215 unknown unknown RUNDATA 5301 301 1 1 1 0011 0077 unknown unknown RUNDATA 5308 301 1 1 1 0011 0386 unknown unknown RUNDATA 5312 301 1 1 1 0028 0228 unknown unknown RUNDATA 5313 301 1 1 1 0011 0125 unknown unknown RUNDATA 5314 301 1 1 1 0011 0370 unknown unknown RUNDATA 5317 301 1 1 1 0020 0178 unknown unknown RUNDATA 5318 301 1 1 1 0011 0184 unknown unknown RUNDATA 5322 301 1 1 1 0018 0262 unknown unknown RUNDATA 5323 301 1 1 1 0011 0160 unknown unknown RUNDATA 5326 301 1 1 1 0011 0321 unknown unknown RUNDATA 5327 301 1 1 1 0011 0098 unknown unknown RUNDATA 5330 301 1 1 1 0020 0129 unknown unknown RUNDATA 5360 301 1 1 1 0030 0384 unknown unknown RUNDATA 5362 301 1 1 1 0011 0194 unknown unknown RUNDATA 5374 301 1 1 1 0011 0075 unknown unknown RUNDATA 5375 301 1 1 1 0011 0104 unknown unknown RUNDATA 5376 301 1 1 1 0011 0148 unknown unknown RUNDATA 5377 301 1 1 1 0011 0118 unknown unknown RUNDATA 5378 301 1 1 1 0011 0207 unknown unknown RUNDATA 5381 301 1 1 1 0025 0209 unknown unknown RUNDATA 5382 301 1 1 1 0011 0140 unknown unknown RUNDATA 5384 301 1 1 1 0011 0176 unknown unknown RUNDATA 5385 301 1 1 1 0011 0038 unknown unknown RUNDATA 5387 301 1 1 1 0011 0034 unknown unknown RUNDATA 5390 301 1 1 1 0020 0205 unknown unknown RUNDATA 5391 301 1 1 1 0011 0281 unknown unknown RUNDATA 5392 301 1 1 1 0011 0085 unknown unknown RUNDATA 5395 301 1 1 1 0054 0078 unknown unknown RUNDATA 5396 301 1 1 1 0011 0272 unknown unknown RUNDATA 5398 301 1 1 1 0011 0232 unknown unknown RUNDATA 5401 301 1 1 1 0013 0067 unknown unknown RUNDATA 5402 301 1 1 1 0011 0047 unknown unknown RUNDATA 5403 301 1 1 1 0011 0307 unknown unknown RUNDATA 5404 301 1 1 1 0011 0045 unknown unknown RUNDATA 5405 301 1 1 1 0011 0099 unknown unknown RUNDATA 5408 301 1 1 1 0027 0143 unknown unknown RUNDATA 5409 301 1 1 1 0011 0125 unknown unknown RUNDATA 5410 301 1 1 1 0011 0285 unknown unknown RUNDATA 5414 301 1 1 1 0011 0085 unknown unknown RUNDATA 5415 301 1 1 1 0011 0091 unknown unknown RUNDATA 5416 301 1 1 1 0011 0204 unknown unknown RUNDATA 5421 301 1 1 1 0155 0285 unknown unknown RUNDATA 5598 301 1 1 1 0011 0203 unknown unknown RUNDATA 5636 301 1 1 1 0027 0161 unknown unknown RUNDATA 5640 301 1 1 1 0022 0284 unknown unknown RUNDATA 5641 301 1 1 1 0011 0160 unknown unknown RUNDATA 5655 301 1 1 1 0011 0262 unknown unknown RUNDATA 5656 301 1 1 1 0011 0167 unknown unknown RUNDATA 5657 301 1 1 1 0014 0080 unknown unknown RUNDATA 5711 301 1 1 1 0011 0233 unknown unknown RUNDATA 5714 301 1 1 1 0011 0274 unknown unknown RUNDATA 5794 301 1 1 1 0011 0126 unknown unknown RUNDATA 5803 301 1 1 1 0011 0045 unknown unknown RUNDATA 5814 301 1 1 1 0011 0191 unknown unknown RUNDATA 5815 301 1 1 1 0011 0133 unknown unknown RUNDATA 5817 301 1 1 1 0024 0351 unknown unknown RUNDATA 5824 301 1 1 1 0011 0108 unknown unknown RUNDATA 5848 301 1 1 1 0011 0029 unknown unknown RUNDATA 5849 301 1 1 1 0011 0192 unknown unknown RUNDATA 5867 301 1 1 1 0011 0243 unknown unknown RUNDATA 5921 301 1 1 1 0011 0074 unknown unknown RUNDATA 5925 301 1 1 1 0011 0032 unknown unknown RUNDATA 5933 301 1 1 1 0019 0114 unknown unknown RUNDATA 5934 301 1 1 1 0011 0279 unknown unknown RUNDATA 5935 301 1 1 1 0011 0302 unknown unknown RUNDATA 5959 301 1 1 1 0011 0218 unknown unknown RUNDATA 5960 301 1 1 1 0011 0247 unknown unknown RUNDATA 5972 301 1 1 1 0024 0264 unknown unknown RUNDATA 5973 301 1 1 1 0011 0159 unknown unknown RUNDATA 5976 301 1 1 1 0018 0245 unknown unknown RUNDATA 5982 301 1 1 1 0020 0146 unknown unknown RUNDATA 5999 301 1 1 1 0011 0095 unknown unknown RUNDATA 6003 301 1 1 1 0022 0291 unknown unknown RUNDATA 6004 301 1 1 1 0011 0302 unknown unknown RUNDATA 6005 301 1 1 1 0011 0223 unknown unknown RUNDATA 6073 301 1 1 1 0011 0078 unknown unknown RUNDATA 6074 301 1 1 1 0011 0098 unknown unknown RUNDATA 6075 301 1 1 1 0011 0063 unknown unknown RUNDATA 6103 301 1 1 1 0011 0172 unknown unknown RUNDATA 6104 301 1 1 1 0011 0077 unknown unknown RUNDATA 6105 301 1 1 1 0011 0119 unknown unknown RUNDATA 6118 301 1 1 1 0019 0178 unknown unknown RUNDATA 6121 301 1 1 1 0011 0218 unknown unknown RUNDATA 6122 301 1 1 1 0011 0189 unknown unknown RUNDATA 6123 301 1 1 1 0011 0095 unknown unknown RUNDATA 6160 301 1 1 1 0011 0059 unknown unknown RUNDATA 6161 301 1 1 1 0011 0151 unknown unknown RUNDATA 6162 301 1 1 1 0011 0449 unknown unknown RUNDATA 6166 301 1 1 1 0011 0276 unknown unknown RUNDATA 6168 301 1 1 1 0011 0076 unknown unknown RUNDATA 6169 301 1 1 1 0011 0150 unknown unknown RUNDATA 6174 301 1 1 1 0011 0270 unknown unknown RUNDATA 6176 301 1 1 1 0020 0092 unknown unknown RUNDATA 6177 301 1 1 1 0011 0384 unknown unknown RUNDATA 6182 301 1 1 1 0023 0303 unknown unknown RUNDATA 6207 301 1 1 1 0030 0139 unknown unknown RUNDATA 6212 301 1 1 1 0018 0153 unknown unknown RUNDATA 6282 301 1 1 1 0011 0101 unknown unknown RUNDATA 6354 301 1 1 1 0011 0322 unknown unknown RUNDATA 6361 301 1 1 1 0011 0169 unknown unknown RUNDATA 6366 301 1 1 1 0011 0172 unknown unknown RUNDATA 6371 301 1 1 1 0011 0157 unknown unknown RUNDATA 6372 301 1 1 1 0011 0145 unknown unknown RUNDATA 6413 301 1 1 1 0011 0135 unknown unknown RUNDATA 6426 301 1 1 1 0011 0129 unknown unknown RUNDATA 6469 301 1 1 1 0011 0136 unknown unknown RUNDATA 6475 301 1 1 1 0011 0158 unknown unknown RUNDATA 6481 301 1 1 1 0019 0095 unknown unknown RUNDATA 6485 301 1 1 1 0011 0213 unknown unknown RUNDATA 6505 301 1 1 1 0011 0103 unknown unknown RUNDATA 6509 301 1 1 1 0011 0175 unknown unknown RUNDATA 6514 301 1 1 1 0011 0209 unknown unknown RUNDATA 6519 301 1 1 1 0011 0199 unknown unknown RUNDATA 6572 301 1 1 1 0011 0236 unknown unknown RUNDATA 6573 301 1 1 1 0011 0276 unknown unknown RUNDATA 6574 301 1 1 1 0011 0211 unknown unknown RUNDATA 6581 301 1 1 1 0011 0235 unknown unknown RUNDATA 6585 301 1 1 1 0011 0201 unknown unknown RUNDATA 6591 301 1 1 1 0011 0140 unknown unknown RUNDATA 6597 301 1 1 1 0011 0249 unknown unknown RUNDATA 6605 301 1 1 1 0011 0166 unknown unknown RUNDATA 6708 301 1 1 1 0011 0259 unknown unknown RUNDATA 6709 301 1 1 1 0011 0088 unknown unknown RUNDATA 6727 301 1 1 1 0011 0114 unknown unknown RUNDATA 6728 301 1 1 1 0011 0156 unknown unknown RUNDATA 6749 301 1 1 1 0011 0208 unknown unknown RUNDATA 6751 301 1 1 1 0011 0164 unknown unknown RUNDATA 6752 301 1 1 1 0011 0048 unknown unknown RUNDATA 6753 301 1 1 1 0011 0047 unknown unknown RUNDATA 6781 301 1 1 1 0019 0138 unknown unknown RUNDATA 6782 301 1 1 1 0011 0189 unknown unknown RUNDATA 6793 301 1 1 1 0011 0149 unknown unknown RUNDATA 6794 301 1 1 1 0011 0223 unknown unknown RUNDATA 6850 301 1 1 1 0011 0183 unknown unknown RUNDATA 6895 301 1 1 1 0011 0079 unknown unknown RUNDATA 7178 301 1 1 1 0011 0227 unknown unknown RUNDATA 7183 301 1 1 1 0011 0362 unknown unknown RUNDATA 7185 301 1 1 1 0011 0051 unknown unknown RUNDATA 7210 301 1 1 1 0015 0148 unknown unknown RUNDATA 7220 301 1 1 1 0011 0237 unknown unknown RUNDATA 7243 301 1 1 1 0014 0190 unknown unknown RUNDATA 7264 301 1 1 1 0011 0189 unknown unknown RUNDATA 7265 301 1 1 1 0011 0225 unknown unknown RUNDATA 7674 301 1 1 1 0032 0129 unknown unknown RUNDATA 7675 301 1 1 1 0011 0178 unknown unknown RUNDATA 7698 301 1 1 1 0027 0314 unknown unknown RUNDATA 7699 301 1 1 1 0011 0081 unknown unknown RUNDATA 7708 301 1 1 1 0011 0281 unknown unknown RUNDATA 7709 301 1 1 1 0011 0150 unknown unknown RUNDATA 7712 301 1 1 1 0011 0469 unknown unknown RUNDATA 7713 301 1 1 1 0011 0429 unknown unknown RUNDATA 7717 301 1 1 1 0011 0636 unknown unknown RUNDATA 7718 301 1 1 1 0011 0295 unknown unknown RUNDATA 7727 301 1 1 1 0011 0373 unknown unknown RUNDATA 7729 301 1 1 1 0011 0166 unknown unknown RUNDATA 7741 301 1 1 1 0016 0172 unknown unknown RUNDATA 7754 301 1 1 1 0017 0369 unknown unknown RUNDATA 7757 301 1 1 1 0011 0228 unknown unknown RUNDATA 7759 301 1 1 1 0011 0168 unknown unknown RUNDATA 7760 301 1 1 1 0011 0191 unknown unknown RUNDATA 7761 301 1 1 1 0011 0217 unknown unknown RUNDATA 7765 301 1 1 1 0011 0226 unknown unknown RUNDATA 7767 301 1 1 1 0011 0142 unknown unknown RUNDATA 7770 301 1 1 1 0011 0138 unknown unknown RUNDATA 7772 301 1 1 1 0011 0130 unknown unknown RUNDATA 7773 301 1 1 1 0011 0516 unknown unknown RUNDATA 7777 301 1 1 1 0011 0162 unknown unknown RUNDATA 7778 301 1 1 1 0011 0624 unknown unknown RUNDATA 7780 301 1 1 1 0011 0207 unknown unknown RUNDATA 7781 301 1 1 1 0011 0242 unknown unknown RUNDATA 7784 301 1 1 1 0016 0405 unknown unknown RUNDATA 7787 301 1 1 1 0016 0410 unknown unknown RUNDATA 7791 301 1 1 1 0019 0095 unknown unknown RUNDATA 7807 301 1 1 1 0011 0114 unknown unknown RUNDATA 7808 301 1 1 1 0011 0105 unknown unknown RUNDATA 7812 301 1 1 1 0037 0165 unknown unknown RUNDATA 7814 301 1 1 1 0014 0147 unknown unknown RUNDATA 7824 301 1 1 1 0011 0436 unknown unknown RUNDATA 7845 301 1 1 1 0011 0154 unknown unknown RUNDATA 7865 301 1 1 1 0011 0221 unknown unknown RUNDATA 7880 301 1 1 1 0011 0122 unknown unknown RUNDATA 7881 301 1 1 1 0011 0329 unknown unknown RUNDATA 7885 301 1 1 1 0011 0190 unknown unknown RUNDATA 7907 301 1 1 1 0011 0211 unknown unknown RUNDATA 7908 301 1 1 1 0011 0163 unknown unknown RUNDATA 7912 301 1 1 1 0011 0234 unknown unknown RUNDATA 7913 301 1 1 1 0011 0164 unknown unknown RUNDATA 7917 301 1 1 1 0011 0309 unknown unknown RUNDATA 7923 301 1 1 1 0011 0386 unknown unknown RUNDATA 7932 301 1 1 1 0011 0215 unknown unknown RUNDATA 7937 301 1 1 1 0018 0255 unknown unknown RUNDATA 7941 301 1 1 1 0011 0115 unknown unknown RUNDATA 7942 301 1 1 1 0020 0119 unknown unknown RUNDATA 8038 301 1 1 1 0011 0198 unknown unknown RUNDATA 8039 301 1 1 1 0011 0098 unknown unknown RUNDATA 8049 301 1 1 1 0028 0143 unknown unknown RUNDATA 8054 301 1 1 1 0017 0209 unknown unknown RUNDATA 8055 301 1 1 1 0011 0129 unknown unknown RUNDATA 8056 301 1 1 1 0011 0152 unknown unknown RUNDATA 8060 301 1 1 1 0011 0136 unknown unknown RUNDATA 8061 301 1 1 1 0011 0060 unknown unknown RUNDATA 8062 301 1 1 1 0011 0129 unknown unknown RUNDATA 8066 301 1 1 1 0011 0148 unknown unknown RUNDATA 8067 301 1 1 1 0011 0135 unknown unknown RUNDATA 8083 301 1 1 1 0019 0208 unknown unknown RUNDATA 8095 301 1 1 1 0017 0473 unknown unknown RUNDATA 8096 301 1 1 1 0011 0298 unknown unknown RUNDATA 8097 301 1 1 1 0011 0101 unknown unknown RUNDATA 8100 301 1 1 1 0033 0378 unknown unknown RUNDATA 8101 301 1 1 1 0011 0104 unknown unknown RUNDATA 8102 301 1 1 1 0011 0152 unknown unknown RUNDATA 8103 301 1 1 1 0011 0178 unknown unknown RUNDATA 8105 301 1 1 1 0011 0157 unknown unknown RUNDATA 8108 301 1 1 1 0017 0258 unknown unknown RUNDATA 8109 301 1 1 1 0011 0165 unknown unknown RUNDATA 8110 301 1 1 1 0011 0225 unknown unknown RUNDATA 8111 301 1 1 1 0011 0201 unknown unknown RUNDATA 8112 301 1 1 1 0011 0142 unknown unknown RUNDATA 8115 301 1 1 1 0020 0196 unknown unknown RUNDATA 8116 301 1 1 1 0011 0386 unknown unknown RUNDATA 8117 301 1 1 1 0011 0098 unknown unknown RUNDATA 8142 301 1 1 1 0014 0125 unknown unknown RUNDATA 8149 301 1 1 1 0021 0274 unknown unknown RUNDATA 8150 301 1 1 1 0011 0127 unknown unknown RUNDATA 8151 301 1 1 1 0011 0120 unknown unknown RUNDATA 8155 301 1 1 1 0020 0168 unknown unknown RUNDATA 8156 301 1 1 1 0011 0241 unknown unknown RUNDATA 8157 301 1 1 1 0011 0149 unknown unknown RUNDATA 8158 301 1 1 1 0011 0112 unknown unknown RUNDATA 8162 301 1 1 1 0080 0237 unknown unknown astrometry.net-0.67/sdss/runList-dr9.par000644 000765 000024 00000122034 12651445460 020404 0ustar00dstnstaff000000 000000 # # runList.par # # Created by SDSS3::Yanny.pm # # 2011-01-05 21:41:03 UTC # typedef struct { int run; # Run number char rerun[]; # Relevant rerun directory int exist; # Does a directory exist (has it ever been queued) (0/1)? int done; # Is this field done (0-Not done/1-Done)? int calib; # Is this field calibrated (0-No/1-Yes)? # All the fields below are only updated if the run is done # Otherwise, they are set to zero. int startfield; # Starting field - determined from fpObjc present int endfield; # Ending field char machine[]; # The machine the data is on char disk[]; # The disk this run is on.... } RUNDATA; RUNDATA 1933 157 1 1 1 0011 0122 unknown unknown RUNDATA 2253 157 1 1 1 0011 0338 unknown unknown RUNDATA 3147 157 1 1 1 0011 0255 unknown unknown RUNDATA 3171 157 1 1 1 0011 0335 unknown unknown RUNDATA 3172 157 1 0 0 0 0 unknown unknown RUNDATA 3173 157 1 1 1 0011 0447 unknown unknown RUNDATA 3174 157 1 1 1 0011 0223 unknown unknown RUNDATA 3466 157 1 1 1 0011 0223 unknown unknown RUNDATA 3467 157 1 1 1 0011 0111 unknown unknown RUNDATA 3468 157 1 1 1 0011 0127 unknown unknown RUNDATA 3469 157 1 1 1 0011 0159 unknown unknown RUNDATA 3470 157 1 1 1 0011 0239 unknown unknown RUNDATA 3471 157 1 1 1 0011 0159 unknown unknown RUNDATA 3472 157 1 1 1 0011 0143 unknown unknown RUNDATA 3473 157 1 1 1 0011 0175 unknown unknown RUNDATA 3575 157 1 1 1 0011 0767 unknown unknown RUNDATA 3576 157 1 1 1 0011 0399 unknown unknown RUNDATA 3577 157 1 1 1 0011 0239 unknown unknown RUNDATA 3578 157 1 1 1 0011 0351 unknown unknown RUNDATA 3579 157 1 1 1 0011 0335 unknown unknown RUNDATA 3580 157 1 1 1 0011 0287 unknown unknown RUNDATA 3581 157 1 1 1 0011 0623 unknown unknown RUNDATA 3582 157 1 1 1 0011 0127 unknown unknown RUNDATA 3583 157 1 1 1 0011 0687 unknown unknown RUNDATA 3638 157 1 1 1 0011 0367 unknown unknown RUNDATA 3639 157 1 1 1 0011 0383 unknown unknown RUNDATA 3669 157 1 1 1 0011 0031 unknown unknown RUNDATA 4033 157 1 1 1 0011 0369 unknown unknown RUNDATA 4034 157 1 0 0 0 0 unknown unknown RUNDATA 4121 157 1 1 1 0011 0319 unknown unknown RUNDATA 4122 157 1 0 0 0 0 unknown unknown RUNDATA 4123 157 1 1 1 0011 0127 unknown unknown RUNDATA 4124 157 1 0 0 0 0 unknown unknown RUNDATA 4160 157 1 1 1 0011 0781 unknown unknown RUNDATA 4162 157 1 1 1 0011 0311 unknown unknown RUNDATA 4163 157 1 0 0 0 0 unknown unknown RUNDATA 4164 157 1 1 1 0011 0203 unknown unknown RUNDATA 4165 157 1 0 0 0 0 unknown unknown RUNDATA 4221 157 1 0 0 0 0 unknown unknown RUNDATA 4222 157 1 1 1 0011 0787 unknown unknown RUNDATA 4223 157 1 1 1 0011 0631 unknown unknown RUNDATA 4224 157 1 1 1 0011 0069 unknown unknown RUNDATA 4225 157 1 1 1 0011 0475 unknown unknown RUNDATA 4240 157 1 1 1 0011 0831 unknown unknown RUNDATA 4248 157 1 1 1 0011 0767 unknown unknown RUNDATA 4249 157 1 1 1 0011 0783 unknown unknown RUNDATA 4266 157 1 1 1 0011 0751 unknown unknown RUNDATA 4267 157 1 1 1 0011 0783 unknown unknown RUNDATA 4268 157 1 1 1 0011 0623 unknown unknown RUNDATA 4269 157 1 1 1 0011 0495 unknown unknown RUNDATA 4270 157 1 1 1 0011 0767 unknown unknown RUNDATA 4271 157 1 1 1 0011 0623 unknown unknown RUNDATA 4272 157 1 1 1 0011 0543 unknown unknown RUNDATA 4273 157 1 1 1 0011 0415 unknown unknown RUNDATA 4274 157 1 1 1 0011 0783 unknown unknown RUNDATA 4275 157 1 1 1 0011 0271 unknown unknown RUNDATA 4281 157 1 1 1 0011 0783 unknown unknown RUNDATA 4282 157 1 1 1 0011 0767 unknown unknown RUNDATA 4283 157 1 1 1 0011 0623 unknown unknown RUNDATA 4284 157 1 1 1 0011 0479 unknown unknown RUNDATA 4291 157 1 1 1 0011 0511 unknown unknown RUNDATA 4322 157 1 1 1 0011 0847 unknown unknown RUNDATA 4329 157 1 1 1 0011 0687 unknown unknown RUNDATA 4330 157 1 1 1 0011 0671 unknown unknown RUNDATA 4331 157 1 1 1 0011 0799 unknown unknown RUNDATA 4473 157 1 1 1 0011 0815 unknown unknown RUNDATA 4474 157 1 1 1 0011 0767 unknown unknown RUNDATA 4475 157 1 1 1 0011 0719 unknown unknown RUNDATA 4476 157 1 1 1 0011 0479 unknown unknown RUNDATA 4477 157 1 1 1 0011 0639 unknown unknown RUNDATA 4557 157 1 1 1 0011 0543 unknown unknown RUNDATA 4558 157 1 0 0 0 0 unknown unknown RUNDATA 4559 157 1 0 0 0 0 unknown unknown RUNDATA 4560 157 1 1 1 0011 0783 unknown unknown RUNDATA 4561 157 1 1 1 0011 0495 unknown unknown RUNDATA 4562 157 1 1 1 0011 0639 unknown unknown RUNDATA 4563 157 1 0 0 0 0 unknown unknown RUNDATA 5194 157 1 0 0 0 0 unknown unknown RUNDATA 94 301 1 1 1 0011 0546 unknown unknown RUNDATA 109 301 1 1 1 0011 0214 unknown unknown RUNDATA 125 301 1 1 1 0011 0589 unknown unknown RUNDATA 211 301 1 1 1 0011 0385 unknown unknown RUNDATA 240 301 1 1 1 0011 0165 unknown unknown RUNDATA 241 301 1 1 1 0011 0111 unknown unknown RUNDATA 250 301 1 1 1 0011 0455 unknown unknown RUNDATA 251 301 1 1 1 0011 0083 unknown unknown RUNDATA 256 301 1 1 1 0011 0057 unknown unknown RUNDATA 259 301 1 1 1 0012 0567 unknown unknown RUNDATA 273 301 1 1 1 0011 0534 unknown unknown RUNDATA 287 301 1 1 1 0011 0437 unknown unknown RUNDATA 297 301 1 1 1 0011 0203 unknown unknown RUNDATA 307 301 1 1 1 0011 0186 unknown unknown RUNDATA 308 301 1 1 1 0011 0216 unknown unknown RUNDATA 727 301 1 1 1 0011 0082 unknown unknown RUNDATA 745 301 1 1 1 0011 0611 unknown unknown RUNDATA 752 301 1 1 1 0011 0723 unknown unknown RUNDATA 756 301 1 1 1 0011 0812 unknown unknown RUNDATA 994 301 1 1 1 0011 0133 unknown unknown RUNDATA 1000 301 1 1 1 0027 0201 unknown unknown RUNDATA 1006 301 1 1 1 0011 0066 unknown unknown RUNDATA 1009 301 1 1 1 0011 0227 unknown unknown RUNDATA 1010 301 1 1 1 0011 0087 unknown unknown RUNDATA 1011 301 1 1 1 0011 0174 unknown unknown RUNDATA 1013 301 1 1 1 0011 0110 unknown unknown RUNDATA 1022 301 1 1 1 0011 0205 unknown unknown RUNDATA 1024 301 1 1 1 0011 0156 unknown unknown RUNDATA 1033 301 1 1 1 0011 0246 unknown unknown RUNDATA 1035 301 1 1 1 0011 0186 unknown unknown RUNDATA 1037 301 1 1 1 0011 0203 unknown unknown RUNDATA 1040 301 1 1 1 0038 0159 unknown unknown RUNDATA 1043 301 1 1 1 0011 0237 unknown unknown RUNDATA 1045 301 1 1 1 0011 0223 unknown unknown RUNDATA 1055 301 1 1 1 0011 0034 unknown unknown RUNDATA 1056 301 1 1 1 0013 0234 unknown unknown RUNDATA 1057 301 1 1 1 0011 0110 unknown unknown RUNDATA 1119 301 1 1 1 0011 0033 unknown unknown RUNDATA 1120 301 1 1 1 0011 0044 unknown unknown RUNDATA 1122 301 1 1 1 0011 0121 unknown unknown RUNDATA 1133 301 1 1 1 0018 0046 unknown unknown RUNDATA 1140 301 1 1 1 0011 0354 unknown unknown RUNDATA 1142 301 1 1 1 0011 0050 unknown unknown RUNDATA 1231 301 1 1 1 0011 0215 unknown unknown RUNDATA 1233 301 1 1 1 0011 0054 unknown unknown RUNDATA 1239 301 1 1 1 0011 0188 unknown unknown RUNDATA 1241 301 1 1 1 0011 0187 unknown unknown RUNDATA 1302 301 1 1 1 0011 0438 unknown unknown RUNDATA 1329 301 1 1 1 0011 0055 unknown unknown RUNDATA 1331 301 1 1 1 0011 0279 unknown unknown RUNDATA 1332 301 1 1 1 0011 0069 unknown unknown RUNDATA 1334 301 1 1 1 0011 0091 unknown unknown RUNDATA 1336 301 1 1 1 0011 0098 unknown unknown RUNDATA 1339 301 1 1 1 0011 0097 unknown unknown RUNDATA 1345 301 1 1 1 0011 0857 unknown unknown RUNDATA 1350 301 1 1 1 0011 0465 unknown unknown RUNDATA 1352 301 1 1 1 0011 0060 unknown unknown RUNDATA 1356 301 1 1 1 0011 0114 unknown unknown RUNDATA 1359 301 1 1 1 0011 0116 unknown unknown RUNDATA 1363 301 1 1 1 0011 0129 unknown unknown RUNDATA 1365 301 1 1 1 0011 0132 unknown unknown RUNDATA 1402 301 1 1 1 0011 0203 unknown unknown RUNDATA 1404 301 1 1 1 0011 0068 unknown unknown RUNDATA 1411 301 1 1 1 0011 0092 unknown unknown RUNDATA 1412 301 1 1 1 0011 0391 unknown unknown RUNDATA 1449 301 1 1 1 0020 0096 unknown unknown RUNDATA 1450 301 1 1 1 0011 0116 unknown unknown RUNDATA 1451 301 1 1 1 0021 0073 unknown unknown RUNDATA 1452 301 1 1 1 0028 0122 unknown unknown RUNDATA 1453 301 1 1 1 0026 0124 unknown unknown RUNDATA 1458 301 1 1 1 0053 0784 unknown unknown RUNDATA 1462 301 1 1 1 0023 0688 unknown unknown RUNDATA 1463 301 1 1 1 0026 0076 unknown unknown RUNDATA 1473 301 1 1 1 0020 0099 unknown unknown RUNDATA 1477 301 1 1 1 0050 0097 unknown unknown RUNDATA 1478 301 1 1 1 0017 0221 unknown unknown RUNDATA 1481 301 1 1 1 0046 0099 unknown unknown RUNDATA 1484 301 1 1 1 0011 0051 unknown unknown RUNDATA 1659 301 1 1 1 0011 0359 unknown unknown RUNDATA 1662 301 1 1 1 0026 0151 unknown unknown RUNDATA 1663 301 1 1 1 0035 0077 unknown unknown RUNDATA 1666 301 1 1 1 0111 0308 unknown unknown RUNDATA 1729 301 1 1 1 0011 0503 unknown unknown RUNDATA 1736 301 1 1 1 0026 0047 unknown unknown RUNDATA 1737 301 1 1 1 0011 0144 unknown unknown RUNDATA 1738 301 1 1 1 0011 0085 unknown unknown RUNDATA 1739 301 1 1 1 0011 0323 unknown unknown RUNDATA 1740 301 1 1 1 0011 0167 unknown unknown RUNDATA 1741 301 1 1 1 0011 0060 unknown unknown RUNDATA 1742 301 1 1 1 0011 0075 unknown unknown RUNDATA 1749 301 1 1 1 0040 0220 unknown unknown RUNDATA 1752 301 1 1 1 0030 0372 unknown unknown RUNDATA 1754 301 1 1 1 0028 0069 unknown unknown RUNDATA 1755 301 1 1 1 0064 0684 unknown unknown RUNDATA 1854 301 1 1 1 0059 0149 unknown unknown RUNDATA 1855 301 1 1 1 0029 0140 unknown unknown RUNDATA 1862 301 1 1 1 0032 0134 unknown unknown RUNDATA 1863 301 1 1 1 0011 0092 unknown unknown RUNDATA 1869 301 1 1 1 0039 0112 unknown unknown RUNDATA 1886 301 1 1 1 0039 0143 unknown unknown RUNDATA 1887 301 1 1 1 0050 0190 unknown unknown RUNDATA 1888 301 1 1 1 0025 0112 unknown unknown RUNDATA 1889 301 1 1 1 0024 0335 unknown unknown RUNDATA 1891 301 1 1 1 0031 0095 unknown unknown RUNDATA 1892 301 1 1 1 0016 0052 unknown unknown RUNDATA 1893 301 1 1 1 0011 0125 unknown unknown RUNDATA 1894 301 1 1 1 0011 0177 unknown unknown RUNDATA 1895 301 1 1 1 0042 0363 unknown unknown RUNDATA 1896 301 1 1 1 0042 0188 unknown unknown RUNDATA 1897 301 1 1 1 0011 0051 unknown unknown RUNDATA 1904 301 1 1 1 0011 0371 unknown unknown RUNDATA 1907 301 1 1 1 0011 0248 unknown unknown RUNDATA 1908 301 1 1 1 0011 0058 unknown unknown RUNDATA 1923 301 1 1 1 0029 0071 unknown unknown RUNDATA 1924 301 1 1 1 0034 0078 unknown unknown RUNDATA 1925 301 1 1 1 0017 0048 unknown unknown RUNDATA 1926 301 1 1 1 0024 0079 unknown unknown RUNDATA 1927 301 1 1 1 0011 0065 unknown unknown RUNDATA 1992 301 1 1 1 0011 0192 unknown unknown RUNDATA 2029 301 1 1 1 0182 0284 unknown unknown RUNDATA 2062 301 1 1 1 0044 0200 unknown unknown RUNDATA 2064 301 1 1 1 0021 0152 unknown unknown RUNDATA 2065 301 1 1 1 0052 0197 unknown unknown RUNDATA 2068 301 1 1 1 0119 0207 unknown unknown RUNDATA 2069 301 1 1 1 0031 0141 unknown unknown RUNDATA 2073 301 1 1 1 0053 0155 unknown unknown RUNDATA 2074 301 1 1 1 0011 0213 unknown unknown RUNDATA 2075 301 1 1 1 0028 0076 unknown unknown RUNDATA 2076 301 1 1 1 0018 0175 unknown unknown RUNDATA 2078 301 1 1 1 0019 0279 unknown unknown RUNDATA 2124 301 1 1 1 0011 0079 unknown unknown RUNDATA 2125 301 1 1 1 0011 0329 unknown unknown RUNDATA 2126 301 1 1 1 0011 0443 unknown unknown RUNDATA 2127 301 1 1 1 0021 0097 unknown unknown RUNDATA 2131 301 1 1 1 0011 0276 unknown unknown RUNDATA 2133 301 1 1 1 0011 0112 unknown unknown RUNDATA 2134 301 1 1 1 0024 0381 unknown unknown RUNDATA 2137 301 1 1 1 0045 0312 unknown unknown RUNDATA 2138 301 1 1 1 0011 0139 unknown unknown RUNDATA 2140 301 1 1 1 0011 0123 unknown unknown RUNDATA 2141 301 1 1 1 0019 0311 unknown unknown RUNDATA 2142 301 1 1 1 0011 0026 unknown unknown RUNDATA 2143 301 1 1 1 0011 0028 unknown unknown RUNDATA 2167 301 1 1 1 0089 0210 unknown unknown RUNDATA 2168 301 1 1 1 0033 0170 unknown unknown RUNDATA 2187 301 1 1 1 0018 0067 unknown unknown RUNDATA 2188 301 1 1 1 0011 0228 unknown unknown RUNDATA 2189 301 1 1 1 0023 0143 unknown unknown RUNDATA 2190 301 1 1 1 0019 0403 unknown unknown RUNDATA 2194 301 1 1 1 0011 0406 unknown unknown RUNDATA 2206 301 1 1 1 0031 0363 unknown unknown RUNDATA 2207 301 1 1 1 0020 0178 unknown unknown RUNDATA 2243 301 1 1 1 0043 0415 unknown unknown RUNDATA 2244 301 1 1 1 0011 0080 unknown unknown RUNDATA 2247 301 1 1 1 0011 0336 unknown unknown RUNDATA 2248 301 1 1 1 0025 0276 unknown unknown RUNDATA 2259 301 1 1 1 0011 0217 unknown unknown RUNDATA 2267 301 1 1 1 0046 0107 unknown unknown RUNDATA 2297 301 1 1 1 0020 0044 unknown unknown RUNDATA 2298 301 1 1 1 0011 0094 unknown unknown RUNDATA 2299 301 1 1 1 0011 0330 unknown unknown RUNDATA 2304 301 1 1 1 0015 0341 unknown unknown RUNDATA 2305 301 1 1 1 0011 0185 unknown unknown RUNDATA 2322 301 1 1 1 0011 0147 unknown unknown RUNDATA 2326 301 1 1 1 0011 0326 unknown unknown RUNDATA 2327 301 1 1 1 0011 0099 unknown unknown RUNDATA 2328 301 1 1 1 0011 0179 unknown unknown RUNDATA 2333 301 1 1 1 0011 0138 unknown unknown RUNDATA 2334 301 1 1 1 0011 0289 unknown unknown RUNDATA 2335 301 1 1 1 0011 0152 unknown unknown RUNDATA 2336 301 1 1 1 0011 0079 unknown unknown RUNDATA 2346 301 1 1 1 0036 0185 unknown unknown RUNDATA 2347 301 1 1 1 0011 0064 unknown unknown RUNDATA 2348 301 1 1 1 0011 0077 unknown unknown RUNDATA 2379 301 1 1 1 0032 0198 unknown unknown RUNDATA 2385 301 1 1 1 0011 0102 unknown unknown RUNDATA 2391 301 1 1 1 0029 0252 unknown unknown RUNDATA 2392 301 1 1 1 0011 0243 unknown unknown RUNDATA 2505 301 1 1 1 0017 0066 unknown unknown RUNDATA 2506 301 1 1 1 0011 0083 unknown unknown RUNDATA 2507 301 1 1 1 0011 0329 unknown unknown RUNDATA 2566 301 1 1 1 0041 0361 unknown unknown RUNDATA 2570 301 1 1 1 0084 0337 unknown unknown RUNDATA 2574 301 1 1 1 0035 0186 unknown unknown RUNDATA 2575 301 1 1 1 0024 0083 unknown unknown RUNDATA 2576 301 1 1 1 0026 0189 unknown unknown RUNDATA 2578 301 1 1 1 0041 0212 unknown unknown RUNDATA 2579 301 1 1 1 0029 0151 unknown unknown RUNDATA 2582 301 1 1 1 0045 0291 unknown unknown RUNDATA 2583 301 1 1 1 0030 0256 unknown unknown RUNDATA 2585 301 1 1 1 0011 0097 unknown unknown RUNDATA 2589 301 1 1 1 0062 0306 unknown unknown RUNDATA 2591 301 1 1 1 0011 0077 unknown unknown RUNDATA 2649 301 1 1 1 0011 0180 unknown unknown RUNDATA 2650 301 1 1 1 0011 0086 unknown unknown RUNDATA 2659 301 1 1 1 0018 0154 unknown unknown RUNDATA 2662 301 1 1 1 0011 0479 unknown unknown RUNDATA 2677 301 1 1 1 0034 0233 unknown unknown RUNDATA 2699 301 1 1 1 0023 0099 unknown unknown RUNDATA 2700 301 1 1 1 0011 0273 unknown unknown RUNDATA 2703 301 1 1 1 0011 0047 unknown unknown RUNDATA 2708 301 1 1 1 0011 0271 unknown unknown RUNDATA 2709 301 1 1 1 0011 0273 unknown unknown RUNDATA 2711 301 1 1 1 0011 0196 unknown unknown RUNDATA 2728 301 1 1 1 0146 0633 unknown unknown RUNDATA 2734 301 1 1 1 0021 0075 unknown unknown RUNDATA 2735 301 1 1 1 0011 0136 unknown unknown RUNDATA 2738 301 1 1 1 0011 0323 unknown unknown RUNDATA 2740 301 1 1 1 0039 0344 unknown unknown RUNDATA 2766 301 1 1 1 0011 0081 unknown unknown RUNDATA 2768 301 1 1 1 0024 0304 unknown unknown RUNDATA 2777 301 1 1 1 0011 0275 unknown unknown RUNDATA 2780 301 1 1 1 0011 0079 unknown unknown RUNDATA 2820 301 1 1 1 0016 0267 unknown unknown RUNDATA 2821 301 1 1 1 0023 0223 unknown unknown RUNDATA 2822 301 1 1 1 0011 0266 unknown unknown RUNDATA 2825 301 1 1 1 0011 0269 unknown unknown RUNDATA 2826 301 1 1 1 0011 0375 unknown unknown RUNDATA 2830 301 1 1 1 0016 0554 unknown unknown RUNDATA 2831 301 1 1 1 0011 0089 unknown unknown RUNDATA 2854 301 1 1 1 0071 0116 unknown unknown RUNDATA 2855 301 1 1 1 0011 0068 unknown unknown RUNDATA 2856 301 1 1 1 0011 0123 unknown unknown RUNDATA 2861 301 1 1 1 0011 0206 unknown unknown RUNDATA 2863 301 1 1 1 0011 0231 unknown unknown RUNDATA 2864 301 1 1 1 0011 0259 unknown unknown RUNDATA 2873 301 1 1 1 0037 0318 unknown unknown RUNDATA 2882 301 1 1 1 0011 0090 unknown unknown RUNDATA 2883 301 1 1 1 0011 0331 unknown unknown RUNDATA 2886 301 1 1 1 0021 0318 unknown unknown RUNDATA 2887 301 1 1 1 0011 0346 unknown unknown RUNDATA 2888 301 1 1 1 0011 0212 unknown unknown RUNDATA 2955 301 1 1 1 0021 0166 unknown unknown RUNDATA 2960 301 1 1 1 0011 0127 unknown unknown RUNDATA 2961 301 1 1 1 0011 0150 unknown unknown RUNDATA 2963 301 1 1 1 0011 0118 unknown unknown RUNDATA 2964 301 1 1 1 0011 0575 unknown unknown RUNDATA 2968 301 1 1 1 0019 0094 unknown unknown RUNDATA 2986 301 1 1 1 0017 0336 unknown unknown RUNDATA 2987 301 1 1 1 0011 0124 unknown unknown RUNDATA 2989 301 1 1 1 0011 0120 unknown unknown RUNDATA 3015 301 1 1 1 0056 0468 unknown unknown RUNDATA 3031 301 1 1 1 0011 0701 unknown unknown RUNDATA 3058 301 1 1 1 0011 0094 unknown unknown RUNDATA 3059 301 1 1 1 0011 0169 unknown unknown RUNDATA 3063 301 1 1 1 0011 0091 unknown unknown RUNDATA 3064 301 1 1 1 0011 0078 unknown unknown RUNDATA 3098 301 1 1 1 0026 0130 unknown unknown RUNDATA 3103 301 1 1 1 0011 0265 unknown unknown RUNDATA 3104 301 1 1 1 0011 0058 unknown unknown RUNDATA 3130 301 1 1 1 0011 0127 unknown unknown RUNDATA 3170 301 1 1 1 0015 0063 unknown unknown RUNDATA 3177 301 1 1 1 0019 0370 unknown unknown RUNDATA 3180 301 1 1 1 0011 0259 unknown unknown RUNDATA 3183 301 1 1 1 0023 0168 unknown unknown RUNDATA 3184 301 1 1 1 0011 0175 unknown unknown RUNDATA 3185 301 1 1 1 0011 0158 unknown unknown RUNDATA 3187 301 1 1 1 0011 0203 unknown unknown RUNDATA 3204 301 1 1 1 0041 0116 unknown unknown RUNDATA 3206 301 1 1 1 0011 0052 unknown unknown RUNDATA 3225 301 1 1 1 0020 0365 unknown unknown RUNDATA 3226 301 1 1 1 0011 0228 unknown unknown RUNDATA 3229 301 1 1 1 0046 0103 unknown unknown RUNDATA 3230 301 1 1 1 0017 0104 unknown unknown RUNDATA 3256 301 1 1 1 0011 0070 unknown unknown RUNDATA 3313 301 1 1 1 0035 0099 unknown unknown RUNDATA 3322 301 1 1 1 0031 0124 unknown unknown RUNDATA 3323 301 1 1 1 0011 0082 unknown unknown RUNDATA 3325 301 1 1 1 0016 0508 unknown unknown RUNDATA 3354 301 1 1 1 0045 0071 unknown unknown RUNDATA 3355 301 1 1 1 0011 0276 unknown unknown RUNDATA 3356 301 1 1 1 0011 0092 unknown unknown RUNDATA 3358 301 1 1 1 0033 0177 unknown unknown RUNDATA 3360 301 1 1 1 0011 0523 unknown unknown RUNDATA 3362 301 1 1 1 0011 0235 unknown unknown RUNDATA 3366 301 1 1 1 0027 0138 unknown unknown RUNDATA 3367 301 1 1 1 0011 0138 unknown unknown RUNDATA 3368 301 1 1 1 0011 0037 unknown unknown RUNDATA 3384 301 1 1 1 0014 0797 unknown unknown RUNDATA 3388 301 1 1 1 0011 0723 unknown unknown RUNDATA 3427 301 1 1 1 0016 0145 unknown unknown RUNDATA 3430 301 1 1 1 0031 0114 unknown unknown RUNDATA 3434 301 1 1 1 0027 0578 unknown unknown RUNDATA 3437 301 1 1 1 0015 0502 unknown unknown RUNDATA 3438 301 1 1 1 0011 0199 unknown unknown RUNDATA 3458 301 1 1 1 0011 0045 unknown unknown RUNDATA 3460 301 1 1 1 0031 0275 unknown unknown RUNDATA 3461 301 1 1 1 0011 0119 unknown unknown RUNDATA 3462 301 1 1 1 0011 0299 unknown unknown RUNDATA 3465 301 1 1 1 0017 0369 unknown unknown RUNDATA 3478 301 1 1 1 0024 0189 unknown unknown RUNDATA 3511 301 1 1 1 0014 0089 unknown unknown RUNDATA 3512 301 1 1 1 0011 0090 unknown unknown RUNDATA 3513 301 1 1 1 0011 0149 unknown unknown RUNDATA 3518 301 1 1 1 0014 0141 unknown unknown RUNDATA 3525 301 1 1 1 0054 0271 unknown unknown RUNDATA 3530 301 1 1 1 0011 0405 unknown unknown RUNDATA 3538 301 1 1 1 0011 0329 unknown unknown RUNDATA 3557 301 1 1 1 0011 0086 unknown unknown RUNDATA 3559 301 1 1 1 0011 0086 unknown unknown RUNDATA 3560 301 1 1 1 0011 0342 unknown unknown RUNDATA 3562 301 1 1 1 0014 0146 unknown unknown RUNDATA 3563 301 1 1 1 0011 0061 unknown unknown RUNDATA 3565 301 1 1 1 0058 0209 unknown unknown RUNDATA 3600 301 1 1 1 0016 0118 unknown unknown RUNDATA 3605 301 1 1 1 0011 0176 unknown unknown RUNDATA 3606 301 1 1 1 0011 0174 unknown unknown RUNDATA 3610 301 1 1 1 0017 0148 unknown unknown RUNDATA 3614 301 1 1 1 0011 0075 unknown unknown RUNDATA 3615 301 1 1 1 0011 0095 unknown unknown RUNDATA 3624 301 1 1 1 0011 0068 unknown unknown RUNDATA 3628 301 1 1 1 0017 0165 unknown unknown RUNDATA 3629 301 1 1 1 0011 0129 unknown unknown RUNDATA 3630 301 1 1 1 0011 0270 unknown unknown RUNDATA 3631 301 1 1 1 0011 0510 unknown unknown RUNDATA 3634 301 1 1 1 0018 0162 unknown unknown RUNDATA 3635 301 1 1 1 0011 0226 unknown unknown RUNDATA 3636 301 1 1 1 0011 0052 unknown unknown RUNDATA 3642 301 1 1 1 0011 0097 unknown unknown RUNDATA 3643 301 1 1 1 0011 0119 unknown unknown RUNDATA 3644 301 1 1 1 0011 0314 unknown unknown RUNDATA 3646 301 1 1 1 0011 0062 unknown unknown RUNDATA 3647 301 1 1 1 0011 0195 unknown unknown RUNDATA 3648 301 1 1 1 0011 0063 unknown unknown RUNDATA 3649 301 1 1 1 0011 0040 unknown unknown RUNDATA 3650 301 1 1 1 0011 0137 unknown unknown RUNDATA 3664 301 1 1 1 0011 0115 unknown unknown RUNDATA 3697 301 1 1 1 0011 0095 unknown unknown RUNDATA 3698 301 1 1 1 0011 0227 unknown unknown RUNDATA 3699 301 1 1 1 0011 0253 unknown unknown RUNDATA 3704 301 1 1 1 0011 0193 unknown unknown RUNDATA 3705 301 1 1 1 0011 0417 unknown unknown RUNDATA 3712 301 1 1 1 0011 0266 unknown unknown RUNDATA 3716 301 1 1 1 0019 0256 unknown unknown RUNDATA 3723 301 1 1 1 0017 0246 unknown unknown RUNDATA 3804 301 1 1 1 0011 0214 unknown unknown RUNDATA 3805 301 1 1 1 0011 0134 unknown unknown RUNDATA 3813 301 1 1 1 0011 0549 unknown unknown RUNDATA 3818 301 1 1 1 0011 0435 unknown unknown RUNDATA 3829 301 1 1 1 0011 0036 unknown unknown RUNDATA 3830 301 1 1 1 0011 0328 unknown unknown RUNDATA 3835 301 1 1 1 0026 0067 unknown unknown RUNDATA 3836 301 1 1 1 0011 0648 unknown unknown RUNDATA 3838 301 1 1 1 0011 0136 unknown unknown RUNDATA 3840 301 1 1 1 0011 0275 unknown unknown RUNDATA 3841 301 1 1 1 0011 0329 unknown unknown RUNDATA 3842 301 1 1 1 0011 0256 unknown unknown RUNDATA 3893 301 1 1 1 0017 0473 unknown unknown RUNDATA 3894 301 1 1 1 0011 0332 unknown unknown RUNDATA 3900 301 1 1 1 0016 0830 unknown unknown RUNDATA 3903 301 1 1 1 0019 0431 unknown unknown RUNDATA 3905 301 1 1 1 0011 0134 unknown unknown RUNDATA 3909 301 1 1 1 0018 0334 unknown unknown RUNDATA 3910 301 1 1 1 0011 0227 unknown unknown RUNDATA 3911 301 1 1 1 0011 0072 unknown unknown RUNDATA 3918 301 1 1 1 0028 0434 unknown unknown RUNDATA 3919 301 1 1 1 0011 0362 unknown unknown RUNDATA 3925 301 1 1 1 0020 0057 unknown unknown RUNDATA 3926 301 1 1 1 0011 0233 unknown unknown RUNDATA 3927 301 1 1 1 0011 0210 unknown unknown RUNDATA 3957 301 1 1 1 0011 0047 unknown unknown RUNDATA 3958 301 1 1 1 0011 0216 unknown unknown RUNDATA 3959 301 1 1 1 0011 0024 unknown unknown RUNDATA 3964 301 1 1 1 0011 0334 unknown unknown RUNDATA 3965 301 1 1 1 0011 0214 unknown unknown RUNDATA 3967 301 1 1 1 0011 0118 unknown unknown RUNDATA 3970 301 1 1 1 0016 0178 unknown unknown RUNDATA 3971 301 1 1 1 0011 0241 unknown unknown RUNDATA 3972 301 1 1 1 0011 0162 unknown unknown RUNDATA 3983 301 1 1 1 0011 0182 unknown unknown RUNDATA 3992 301 1 1 1 0011 0189 unknown unknown RUNDATA 3996 301 1 1 1 0025 0293 unknown unknown RUNDATA 3997 301 1 1 1 0011 0165 unknown unknown RUNDATA 4002 301 1 1 1 0020 0326 unknown unknown RUNDATA 4003 301 1 1 1 0011 0102 unknown unknown RUNDATA 4007 301 1 1 1 0014 0106 unknown unknown RUNDATA 4010 301 1 1 1 0031 0291 unknown unknown RUNDATA 4011 301 1 1 1 0011 0271 unknown unknown RUNDATA 4014 301 1 1 1 0033 0337 unknown unknown RUNDATA 4015 301 1 1 1 0011 0203 unknown unknown RUNDATA 4023 301 1 1 1 0023 0133 unknown unknown RUNDATA 4031 301 1 1 1 0022 0072 unknown unknown RUNDATA 4072 301 1 1 1 0011 0114 unknown unknown RUNDATA 4073 301 1 1 1 0011 0160 unknown unknown RUNDATA 4076 301 1 1 1 0011 0242 unknown unknown RUNDATA 4100 301 1 1 1 0011 0195 unknown unknown RUNDATA 4107 301 1 1 1 0026 0072 unknown unknown RUNDATA 4114 301 1 1 1 0041 0127 unknown unknown RUNDATA 4115 301 1 1 1 0011 0069 unknown unknown RUNDATA 4116 301 1 1 1 0011 0077 unknown unknown RUNDATA 4119 301 1 1 1 0011 0070 unknown unknown RUNDATA 4127 301 1 1 1 0027 0101 unknown unknown RUNDATA 4128 301 1 1 1 0011 0525 unknown unknown RUNDATA 4134 301 1 1 1 0020 0405 unknown unknown RUNDATA 4135 301 1 1 1 0011 0307 unknown unknown RUNDATA 4136 301 1 1 1 0011 0215 unknown unknown RUNDATA 4143 301 1 1 1 0020 0143 unknown unknown RUNDATA 4144 301 1 1 1 0011 0191 unknown unknown RUNDATA 4145 301 1 1 1 0011 0515 unknown unknown RUNDATA 4152 301 1 1 1 0011 0185 unknown unknown RUNDATA 4153 301 1 1 1 0011 0175 unknown unknown RUNDATA 4157 301 1 1 1 0014 0276 unknown unknown RUNDATA 4158 301 1 1 1 0044 0120 unknown unknown RUNDATA 4184 301 1 1 1 0032 0313 unknown unknown RUNDATA 4187 301 1 1 1 0022 0114 unknown unknown RUNDATA 4188 301 1 1 1 0011 0155 unknown unknown RUNDATA 4191 301 1 1 1 0014 0028 unknown unknown RUNDATA 4192 301 1 1 1 0011 0503 unknown unknown RUNDATA 4198 301 1 1 1 0016 0762 unknown unknown RUNDATA 4203 301 1 1 1 0030 0806 unknown unknown RUNDATA 4204 301 1 1 1 0011 0258 unknown unknown RUNDATA 4207 301 1 1 1 0020 0772 unknown unknown RUNDATA 4208 301 1 1 1 0011 0275 unknown unknown RUNDATA 4233 301 1 1 1 0011 0160 unknown unknown RUNDATA 4247 301 1 1 1 0011 0288 unknown unknown RUNDATA 4252 301 1 1 1 0025 0105 unknown unknown RUNDATA 4253 301 1 1 1 0011 0183 unknown unknown RUNDATA 4263 301 1 1 1 0011 0468 unknown unknown RUNDATA 4264 301 1 1 1 0011 0268 unknown unknown RUNDATA 4288 301 1 1 1 0011 0179 unknown unknown RUNDATA 4294 301 1 1 1 0011 0251 unknown unknown RUNDATA 4326 301 1 1 1 0011 0068 unknown unknown RUNDATA 4334 301 1 1 1 0011 0303 unknown unknown RUNDATA 4335 301 1 1 1 0011 0236 unknown unknown RUNDATA 4336 301 1 1 1 0011 0073 unknown unknown RUNDATA 4338 301 1 1 1 0011 0101 unknown unknown RUNDATA 4344 301 1 1 1 0020 0289 unknown unknown RUNDATA 4380 301 1 1 1 0026 0148 unknown unknown RUNDATA 4381 301 1 1 1 0011 0263 unknown unknown RUNDATA 4382 301 1 1 1 0011 0126 unknown unknown RUNDATA 4388 301 1 1 1 0132 0232 unknown unknown RUNDATA 4389 301 1 1 1 0084 0123 unknown unknown RUNDATA 4392 301 1 1 1 0021 0306 unknown unknown RUNDATA 4448 301 1 1 1 0011 0098 unknown unknown RUNDATA 4458 301 1 1 1 0011 0094 unknown unknown RUNDATA 4469 301 1 1 1 0011 0475 unknown unknown RUNDATA 4470 301 1 1 1 0016 0177 unknown unknown RUNDATA 4503 301 1 1 1 0043 0145 unknown unknown RUNDATA 4504 301 1 1 1 0011 0261 unknown unknown RUNDATA 4508 301 1 1 1 0011 0236 unknown unknown RUNDATA 4510 301 1 1 1 0011 0041 unknown unknown RUNDATA 4512 301 1 1 1 0011 0281 unknown unknown RUNDATA 4516 301 1 1 1 0011 0189 unknown unknown RUNDATA 4517 301 1 1 1 0011 0135 unknown unknown RUNDATA 4518 301 1 1 1 0011 0209 unknown unknown RUNDATA 4520 301 1 1 1 0011 0155 unknown unknown RUNDATA 4540 301 1 1 1 0011 0073 unknown unknown RUNDATA 4549 301 1 1 1 0015 0093 unknown unknown RUNDATA 4550 301 1 1 1 0011 0098 unknown unknown RUNDATA 4552 301 1 1 1 0011 0293 unknown unknown RUNDATA 4555 301 1 1 1 0011 0112 unknown unknown RUNDATA 4569 301 1 1 1 0011 0318 unknown unknown RUNDATA 4570 301 1 1 1 0011 0322 unknown unknown RUNDATA 4571 301 1 1 1 0011 0125 unknown unknown RUNDATA 4576 301 1 1 1 0011 0818 unknown unknown RUNDATA 4588 301 1 1 1 0011 0324 unknown unknown RUNDATA 4599 301 1 1 1 0022 0249 unknown unknown RUNDATA 4600 301 1 1 1 0011 0120 unknown unknown RUNDATA 4623 301 1 1 1 0023 0426 unknown unknown RUNDATA 4628 301 1 1 1 0021 0132 unknown unknown RUNDATA 4629 301 1 1 1 0011 0302 unknown unknown RUNDATA 4632 301 1 1 1 0024 0222 unknown unknown RUNDATA 4633 301 1 1 1 0011 0154 unknown unknown RUNDATA 4646 301 1 1 1 0011 0390 unknown unknown RUNDATA 4649 301 1 1 1 0011 0463 unknown unknown RUNDATA 4663 301 1 1 1 0025 0109 unknown unknown RUNDATA 4670 301 1 1 1 0027 0368 unknown unknown RUNDATA 4671 301 1 1 1 0011 0156 unknown unknown RUNDATA 4674 301 1 1 1 0011 0325 unknown unknown RUNDATA 4678 301 1 1 1 0030 0334 unknown unknown RUNDATA 4679 301 1 1 1 0011 0317 unknown unknown RUNDATA 4682 301 1 1 1 0020 0298 unknown unknown RUNDATA 4797 301 1 1 1 0018 0190 unknown unknown RUNDATA 4800 301 1 1 1 0011 0118 unknown unknown RUNDATA 4822 301 1 1 1 0011 0568 unknown unknown RUNDATA 4828 301 1 1 1 0018 0599 unknown unknown RUNDATA 4829 301 1 1 1 0011 0335 unknown unknown RUNDATA 4832 301 1 1 1 0011 0582 unknown unknown RUNDATA 4836 301 1 1 1 0011 0479 unknown unknown RUNDATA 4843 301 1 1 1 0011 0344 unknown unknown RUNDATA 4844 301 1 1 1 0011 0169 unknown unknown RUNDATA 4849 301 1 1 1 0024 0941 unknown unknown RUNDATA 4851 301 1 1 1 0017 0101 unknown unknown RUNDATA 4858 301 1 1 1 0011 0749 unknown unknown RUNDATA 4868 301 1 1 1 0011 0619 unknown unknown RUNDATA 4874 301 1 1 1 0021 1001 unknown unknown RUNDATA 4879 301 1 1 1 0011 0201 unknown unknown RUNDATA 4880 301 1 1 1 0021 0118 unknown unknown RUNDATA 4884 301 1 1 1 0017 0107 unknown unknown RUNDATA 4887 301 1 1 1 0011 0292 unknown unknown RUNDATA 4894 301 1 1 1 0011 0208 unknown unknown RUNDATA 4895 301 1 1 1 0030 0497 unknown unknown RUNDATA 4899 301 1 1 1 0031 0360 unknown unknown RUNDATA 4900 301 1 1 1 0011 0162 unknown unknown RUNDATA 4905 301 1 1 1 0042 0472 unknown unknown RUNDATA 4927 301 1 1 1 0025 0761 unknown unknown RUNDATA 4930 301 1 1 1 0020 0395 unknown unknown RUNDATA 4933 301 1 1 1 0029 0776 unknown unknown RUNDATA 4948 301 1 1 1 0041 0350 unknown unknown RUNDATA 5036 301 1 1 1 0011 0091 unknown unknown RUNDATA 5037 301 1 1 1 0011 0135 unknown unknown RUNDATA 5038 301 1 1 1 0011 0190 unknown unknown RUNDATA 5042 301 1 1 1 0030 0275 unknown unknown RUNDATA 5043 301 1 1 1 0011 0076 unknown unknown RUNDATA 5044 301 1 1 1 0011 0142 unknown unknown RUNDATA 5045 301 1 1 1 0011 0209 unknown unknown RUNDATA 5046 301 1 1 1 0011 0045 unknown unknown RUNDATA 5047 301 1 1 1 0011 0110 unknown unknown RUNDATA 5052 301 1 1 1 0011 0272 unknown unknown RUNDATA 5060 301 1 1 1 0011 0202 unknown unknown RUNDATA 5061 301 1 1 1 0011 0456 unknown unknown RUNDATA 5064 301 1 1 1 0028 0218 unknown unknown RUNDATA 5065 301 1 1 1 0011 0255 unknown unknown RUNDATA 5066 301 1 1 1 0011 0105 unknown unknown RUNDATA 5069 301 1 1 1 0026 0274 unknown unknown RUNDATA 5070 301 1 1 1 0011 0042 unknown unknown RUNDATA 5071 301 1 1 1 0011 0504 unknown unknown RUNDATA 5072 301 1 1 1 0011 0055 unknown unknown RUNDATA 5079 301 1 1 1 0011 0069 unknown unknown RUNDATA 5080 301 1 1 1 0011 0286 unknown unknown RUNDATA 5087 301 1 1 1 0011 0337 unknown unknown RUNDATA 5112 301 1 1 1 0026 0473 unknown unknown RUNDATA 5115 301 1 1 1 0024 0212 unknown unknown RUNDATA 5116 301 1 1 1 0031 0242 unknown unknown RUNDATA 5125 301 1 1 1 0019 0315 unknown unknown RUNDATA 5137 301 1 1 1 0020 0347 unknown unknown RUNDATA 5138 301 1 1 1 0011 0098 unknown unknown RUNDATA 5140 301 1 1 1 0011 0178 unknown unknown RUNDATA 5181 301 1 1 1 0011 0129 unknown unknown RUNDATA 5182 301 1 1 1 0011 0208 unknown unknown RUNDATA 5183 301 1 1 1 0011 0687 unknown unknown RUNDATA 5194 301 1 1 1 0021 0906 unknown unknown RUNDATA 5224 301 1 1 1 0023 0443 unknown unknown RUNDATA 5225 301 1 1 1 0019 0216 unknown unknown RUNDATA 5237 301 1 1 1 0034 0215 unknown unknown RUNDATA 5301 301 1 1 1 0011 0077 unknown unknown RUNDATA 5308 301 1 1 1 0011 0386 unknown unknown RUNDATA 5312 301 1 1 1 0028 0228 unknown unknown RUNDATA 5313 301 1 1 1 0011 0125 unknown unknown RUNDATA 5314 301 1 1 1 0011 0370 unknown unknown RUNDATA 5317 301 1 1 1 0020 0178 unknown unknown RUNDATA 5318 301 1 1 1 0011 0184 unknown unknown RUNDATA 5322 301 1 1 1 0018 0262 unknown unknown RUNDATA 5323 301 1 1 1 0011 0160 unknown unknown RUNDATA 5326 301 1 1 1 0011 0321 unknown unknown RUNDATA 5327 301 1 1 1 0011 0098 unknown unknown RUNDATA 5330 301 1 1 1 0020 0129 unknown unknown RUNDATA 5360 301 1 1 1 0030 0384 unknown unknown RUNDATA 5362 301 1 1 1 0011 0194 unknown unknown RUNDATA 5374 301 1 1 1 0011 0075 unknown unknown RUNDATA 5375 301 1 1 1 0011 0104 unknown unknown RUNDATA 5376 301 1 1 1 0011 0148 unknown unknown RUNDATA 5377 301 1 1 1 0011 0118 unknown unknown RUNDATA 5378 301 1 1 1 0011 0207 unknown unknown RUNDATA 5381 301 1 1 1 0025 0209 unknown unknown RUNDATA 5382 301 1 1 1 0011 0140 unknown unknown RUNDATA 5384 301 1 1 1 0011 0176 unknown unknown RUNDATA 5385 301 1 1 1 0011 0038 unknown unknown RUNDATA 5387 301 1 1 1 0011 0034 unknown unknown RUNDATA 5390 301 1 1 1 0020 0205 unknown unknown RUNDATA 5391 301 1 1 1 0011 0281 unknown unknown RUNDATA 5392 301 1 1 1 0011 0085 unknown unknown RUNDATA 5395 301 1 1 1 0054 0078 unknown unknown RUNDATA 5396 301 1 1 1 0011 0272 unknown unknown RUNDATA 5398 301 1 1 1 0011 0232 unknown unknown RUNDATA 5401 301 1 1 1 0013 0067 unknown unknown RUNDATA 5402 301 1 1 1 0011 0047 unknown unknown RUNDATA 5403 301 1 1 1 0011 0307 unknown unknown RUNDATA 5404 301 1 1 1 0011 0045 unknown unknown RUNDATA 5405 301 1 1 1 0011 0099 unknown unknown RUNDATA 5408 301 1 1 1 0027 0143 unknown unknown RUNDATA 5409 301 1 1 1 0011 0125 unknown unknown RUNDATA 5410 301 1 1 1 0011 0285 unknown unknown RUNDATA 5414 301 1 1 1 0011 0085 unknown unknown RUNDATA 5415 301 1 1 1 0011 0091 unknown unknown RUNDATA 5416 301 1 1 1 0011 0204 unknown unknown RUNDATA 5421 301 1 1 1 0155 0285 unknown unknown RUNDATA 5598 301 1 1 1 0011 0203 unknown unknown RUNDATA 5636 301 1 1 1 0027 0161 unknown unknown RUNDATA 5640 301 1 1 1 0022 0284 unknown unknown RUNDATA 5641 301 1 1 1 0011 0160 unknown unknown RUNDATA 5655 301 1 1 1 0011 0262 unknown unknown RUNDATA 5656 301 1 1 1 0011 0167 unknown unknown RUNDATA 5657 301 1 1 1 0014 0080 unknown unknown RUNDATA 5711 301 1 1 1 0011 0233 unknown unknown RUNDATA 5714 301 1 1 1 0011 0274 unknown unknown RUNDATA 5794 301 1 1 1 0011 0126 unknown unknown RUNDATA 5803 301 1 1 1 0011 0045 unknown unknown RUNDATA 5814 301 1 1 1 0011 0191 unknown unknown RUNDATA 5815 301 1 1 1 0011 0133 unknown unknown RUNDATA 5817 301 1 1 1 0024 0351 unknown unknown RUNDATA 5824 301 1 1 1 0011 0108 unknown unknown RUNDATA 5848 301 1 1 1 0011 0029 unknown unknown RUNDATA 5849 301 1 1 1 0011 0192 unknown unknown RUNDATA 5867 301 1 1 1 0011 0243 unknown unknown RUNDATA 5921 301 1 1 1 0011 0074 unknown unknown RUNDATA 5925 301 1 1 1 0011 0032 unknown unknown RUNDATA 5933 301 1 1 1 0019 0114 unknown unknown RUNDATA 5934 301 1 1 1 0011 0279 unknown unknown RUNDATA 5935 301 1 1 1 0011 0302 unknown unknown RUNDATA 5959 301 1 1 1 0011 0218 unknown unknown RUNDATA 5960 301 1 1 1 0011 0247 unknown unknown RUNDATA 5972 301 1 1 1 0024 0264 unknown unknown RUNDATA 5973 301 1 1 1 0011 0159 unknown unknown RUNDATA 5976 301 1 1 1 0018 0245 unknown unknown RUNDATA 5982 301 1 1 1 0020 0146 unknown unknown RUNDATA 5999 301 1 1 1 0011 0095 unknown unknown RUNDATA 6003 301 1 1 1 0022 0291 unknown unknown RUNDATA 6004 301 1 1 1 0011 0302 unknown unknown RUNDATA 6005 301 1 1 1 0011 0223 unknown unknown RUNDATA 6073 301 1 1 1 0011 0078 unknown unknown RUNDATA 6074 301 1 1 1 0011 0098 unknown unknown RUNDATA 6075 301 1 1 1 0011 0063 unknown unknown RUNDATA 6103 301 1 1 1 0011 0172 unknown unknown RUNDATA 6104 301 1 1 1 0011 0077 unknown unknown RUNDATA 6105 301 1 1 1 0011 0119 unknown unknown RUNDATA 6118 301 1 1 1 0019 0178 unknown unknown RUNDATA 6121 301 1 1 1 0011 0218 unknown unknown RUNDATA 6122 301 1 1 1 0011 0189 unknown unknown RUNDATA 6123 301 1 1 1 0011 0095 unknown unknown RUNDATA 6160 301 1 1 1 0011 0059 unknown unknown RUNDATA 6161 301 1 1 1 0011 0151 unknown unknown RUNDATA 6162 301 1 1 1 0011 0449 unknown unknown RUNDATA 6166 301 1 1 1 0011 0276 unknown unknown RUNDATA 6168 301 1 1 1 0011 0076 unknown unknown RUNDATA 6169 301 1 1 1 0011 0150 unknown unknown RUNDATA 6174 301 1 1 1 0011 0270 unknown unknown RUNDATA 6176 301 1 1 1 0020 0092 unknown unknown RUNDATA 6177 301 1 1 1 0011 0384 unknown unknown RUNDATA 6182 301 1 1 1 0023 0303 unknown unknown RUNDATA 6207 301 1 1 1 0030 0139 unknown unknown RUNDATA 6212 301 1 1 1 0018 0153 unknown unknown RUNDATA 6282 301 1 1 1 0011 0101 unknown unknown RUNDATA 6354 301 1 1 1 0011 0322 unknown unknown RUNDATA 6361 301 1 1 1 0011 0169 unknown unknown RUNDATA 6366 301 1 1 1 0011 0172 unknown unknown RUNDATA 6371 301 1 1 1 0011 0157 unknown unknown RUNDATA 6372 301 1 1 1 0011 0145 unknown unknown RUNDATA 6413 301 1 1 1 0011 0135 unknown unknown RUNDATA 6426 301 1 1 1 0011 0129 unknown unknown RUNDATA 6469 301 1 1 1 0011 0136 unknown unknown RUNDATA 6475 301 1 1 1 0011 0158 unknown unknown RUNDATA 6481 301 1 1 1 0019 0095 unknown unknown RUNDATA 6485 301 1 1 1 0011 0213 unknown unknown RUNDATA 6505 301 1 1 1 0011 0103 unknown unknown RUNDATA 6509 301 1 1 1 0011 0175 unknown unknown RUNDATA 6514 301 1 1 1 0011 0209 unknown unknown RUNDATA 6519 301 1 1 1 0011 0199 unknown unknown RUNDATA 6572 301 1 1 1 0011 0236 unknown unknown RUNDATA 6573 301 1 1 1 0011 0276 unknown unknown RUNDATA 6574 301 1 1 1 0011 0211 unknown unknown RUNDATA 6581 301 1 1 1 0011 0235 unknown unknown RUNDATA 6585 301 1 1 1 0011 0201 unknown unknown RUNDATA 6591 301 1 1 1 0011 0140 unknown unknown RUNDATA 6597 301 1 1 1 0011 0249 unknown unknown RUNDATA 6605 301 1 1 1 0011 0166 unknown unknown RUNDATA 6708 301 1 1 1 0011 0259 unknown unknown RUNDATA 6709 301 1 1 1 0011 0088 unknown unknown RUNDATA 6727 301 1 1 1 0011 0114 unknown unknown RUNDATA 6728 301 1 1 1 0011 0156 unknown unknown RUNDATA 6749 301 1 1 1 0011 0208 unknown unknown RUNDATA 6751 301 1 1 1 0011 0164 unknown unknown RUNDATA 6752 301 1 1 1 0011 0048 unknown unknown RUNDATA 6753 301 1 1 1 0011 0047 unknown unknown RUNDATA 6781 301 1 1 1 0019 0138 unknown unknown RUNDATA 6782 301 1 1 1 0011 0189 unknown unknown RUNDATA 6793 301 1 1 1 0011 0149 unknown unknown RUNDATA 6794 301 1 1 1 0011 0223 unknown unknown RUNDATA 6850 301 1 1 1 0011 0183 unknown unknown RUNDATA 6895 301 1 1 1 0011 0079 unknown unknown RUNDATA 7178 301 1 1 1 0011 0227 unknown unknown RUNDATA 7183 301 1 1 1 0011 0362 unknown unknown RUNDATA 7185 301 1 1 1 0011 0051 unknown unknown RUNDATA 7210 301 1 1 1 0015 0148 unknown unknown RUNDATA 7220 301 1 1 1 0011 0237 unknown unknown RUNDATA 7243 301 1 1 1 0014 0190 unknown unknown RUNDATA 7264 301 1 1 1 0011 0189 unknown unknown RUNDATA 7265 301 1 1 1 0011 0225 unknown unknown RUNDATA 7674 301 1 1 1 0032 0129 unknown unknown RUNDATA 7675 301 1 1 1 0011 0178 unknown unknown RUNDATA 7698 301 1 1 1 0027 0314 unknown unknown RUNDATA 7699 301 1 1 1 0011 0081 unknown unknown RUNDATA 7708 301 1 1 1 0011 0281 unknown unknown RUNDATA 7709 301 1 1 1 0011 0150 unknown unknown RUNDATA 7712 301 1 1 1 0011 0469 unknown unknown RUNDATA 7713 301 1 1 1 0011 0429 unknown unknown RUNDATA 7717 301 1 1 1 0011 0636 unknown unknown RUNDATA 7718 301 1 1 1 0011 0295 unknown unknown RUNDATA 7727 301 1 1 1 0011 0373 unknown unknown RUNDATA 7729 301 1 1 1 0011 0166 unknown unknown RUNDATA 7741 301 1 1 1 0016 0172 unknown unknown RUNDATA 7754 301 1 1 1 0017 0369 unknown unknown RUNDATA 7757 301 1 1 1 0011 0228 unknown unknown RUNDATA 7759 301 1 1 1 0011 0168 unknown unknown RUNDATA 7760 301 1 1 1 0011 0191 unknown unknown RUNDATA 7761 301 1 1 1 0011 0217 unknown unknown RUNDATA 7765 301 1 1 1 0011 0226 unknown unknown RUNDATA 7767 301 1 1 1 0011 0142 unknown unknown RUNDATA 7770 301 1 1 1 0011 0138 unknown unknown RUNDATA 7772 301 1 1 1 0011 0130 unknown unknown RUNDATA 7773 301 1 1 1 0011 0516 unknown unknown RUNDATA 7777 301 1 1 1 0011 0162 unknown unknown RUNDATA 7778 301 1 1 1 0011 0624 unknown unknown RUNDATA 7780 301 1 1 1 0011 0207 unknown unknown RUNDATA 7781 301 1 1 1 0011 0242 unknown unknown RUNDATA 7784 301 1 1 1 0016 0405 unknown unknown RUNDATA 7787 301 1 1 1 0016 0410 unknown unknown RUNDATA 7791 301 1 1 1 0019 0095 unknown unknown RUNDATA 7807 301 1 1 1 0011 0114 unknown unknown RUNDATA 7808 301 1 1 1 0011 0105 unknown unknown RUNDATA 7812 301 1 1 1 0037 0165 unknown unknown RUNDATA 7814 301 1 1 1 0014 0147 unknown unknown RUNDATA 7824 301 1 1 1 0011 0436 unknown unknown RUNDATA 7845 301 1 1 1 0011 0154 unknown unknown RUNDATA 7865 301 1 1 1 0011 0221 unknown unknown RUNDATA 7880 301 1 1 1 0011 0122 unknown unknown RUNDATA 7881 301 1 1 1 0011 0329 unknown unknown RUNDATA 7885 301 1 1 1 0011 0190 unknown unknown RUNDATA 7907 301 1 1 1 0011 0211 unknown unknown RUNDATA 7908 301 1 1 1 0011 0163 unknown unknown RUNDATA 7912 301 1 1 1 0011 0234 unknown unknown RUNDATA 7913 301 1 1 1 0011 0164 unknown unknown RUNDATA 7917 301 1 1 1 0011 0309 unknown unknown RUNDATA 7923 301 1 1 1 0011 0386 unknown unknown RUNDATA 7932 301 1 1 1 0011 0215 unknown unknown RUNDATA 7937 301 1 1 1 0018 0255 unknown unknown RUNDATA 7941 301 1 1 1 0011 0115 unknown unknown RUNDATA 7942 301 1 1 1 0020 0119 unknown unknown RUNDATA 8038 301 1 1 1 0011 0198 unknown unknown RUNDATA 8039 301 1 1 1 0011 0098 unknown unknown RUNDATA 8049 301 1 1 1 0028 0143 unknown unknown RUNDATA 8054 301 1 1 1 0017 0209 unknown unknown RUNDATA 8055 301 1 1 1 0011 0129 unknown unknown RUNDATA 8056 301 1 1 1 0011 0152 unknown unknown RUNDATA 8060 301 1 1 1 0011 0136 unknown unknown RUNDATA 8061 301 1 1 1 0011 0060 unknown unknown RUNDATA 8062 301 1 1 1 0011 0129 unknown unknown RUNDATA 8066 301 1 1 1 0011 0148 unknown unknown RUNDATA 8067 301 1 1 1 0011 0135 unknown unknown RUNDATA 8083 301 1 1 1 0019 0208 unknown unknown RUNDATA 8095 301 1 1 1 0017 0473 unknown unknown RUNDATA 8096 301 1 1 1 0011 0298 unknown unknown RUNDATA 8097 301 1 1 1 0011 0101 unknown unknown RUNDATA 8100 301 1 1 1 0033 0378 unknown unknown RUNDATA 8101 301 1 1 1 0011 0104 unknown unknown RUNDATA 8102 301 1 1 1 0011 0152 unknown unknown RUNDATA 8103 301 1 1 1 0011 0178 unknown unknown RUNDATA 8105 301 1 1 1 0011 0157 unknown unknown RUNDATA 8108 301 1 1 1 0017 0258 unknown unknown RUNDATA 8109 301 1 1 1 0011 0165 unknown unknown RUNDATA 8110 301 1 1 1 0011 0225 unknown unknown RUNDATA 8111 301 1 1 1 0011 0201 unknown unknown RUNDATA 8112 301 1 1 1 0011 0142 unknown unknown RUNDATA 8115 301 1 1 1 0020 0196 unknown unknown RUNDATA 8116 301 1 1 1 0011 0386 unknown unknown RUNDATA 8117 301 1 1 1 0011 0098 unknown unknown RUNDATA 8142 301 1 1 1 0014 0125 unknown unknown RUNDATA 8149 301 1 1 1 0021 0274 unknown unknown RUNDATA 8150 301 1 1 1 0011 0127 unknown unknown RUNDATA 8151 301 1 1 1 0011 0120 unknown unknown RUNDATA 8155 301 1 1 1 0020 0168 unknown unknown RUNDATA 8156 301 1 1 1 0011 0241 unknown unknown RUNDATA 8157 301 1 1 1 0011 0149 unknown unknown RUNDATA 8158 301 1 1 1 0011 0112 unknown unknown RUNDATA 8162 301 1 1 1 0080 0237 unknown unknown astrometry.net-0.67/sdss/sdss_das.py000755 000765 000024 00000007547 12651445460 017737 0ustar00dstnstaff000000 000000 #! /usr/bin/env python from astrometry.util.run_command import run_command from astrometry.util.sdss_filenames import * from astrometry.sdss import * def get_urls(urls, outfn, curl=False): for url in urls: if curl: cmd = 'curl ' if outfn: cmd += '-o %s ' % outfn else: cmd += '-O ' else: cmd = 'wget --continue -nv ' if outfn: cmd += '-O %s ' % outfn cmd += '\"%s\"' % url print 'Running:', cmd (rtn, out, err) = run_command(cmd) if rtn == 0: return True if rtn: print 'Command failed: command', cmd print 'Output:', out print 'Error:', err print 'Return val:', rtn return False def sdss_das_get_suffix(filetype): return ({'fpC': '.gz'}).get(filetype, '') def sdss_das_get_url(filetype, run, camcol, field, rerun, band, suffix=None): if suffix is None: suffix = sdss_das_get_suffix(filetype) path = sdss_path(filetype, run, camcol, field, band, rerun) if path is None: print 'Unknown SDSS filetype', filetype return None return 'http://das.sdss.org/imaging/' + path + suffix def sdss_das_get(filetype, outfn, run, camcol, field, band=None, reruns=None, suffix=None, gunzip=True, curl=False, ): if reruns is None: reruns = [40,41,42,44] urls = [] for rerun in reruns: url = sdss_das_get_url(filetype, run, camcol, field, rerun, band, suffix=suffix) if url is None: return False urls.append(url) if suffix is None: suffix = sdss_das_get_suffix(filetype) if outfn: outfn = outfn % { 'run':run, 'camcol':camcol, 'field':field, 'band':band } + suffix else: outfn = sdss_filename(filetype, run, camcol, field, band) + suffix if not get_urls(urls, outfn, curl): return False if suffix == '.gz' and gunzip: print 'gzipped file; outfn=', outfn gzipfn = outfn outfn = gzipfn.replace('.gz', '') if os.path.exists(gzipfn): cmd = 'gunzip -cd %s > %s' % (gzipfn, outfn) print 'Running:', cmd (rtn, out, err) = run_command(cmd) if rtn: print 'Command failed: command', cmd print 'Output:', out print 'Error:', err print 'Return val:', rtn return outfn def sdss_das_get_fpc(run, camcol, field, band, outfn=None, reruns=None): return sdss_das_get('fpC', outfn, run, camcol, field, band, reruns, suffix='.gz') def sdss_das_get_mask(run, camcol, field, band, outfn=None, reruns=None): return sdss_das_get('fpM', outfn, run, camcol, field, band, reruns) if __name__ == '__main__': from optparse import OptionParser import sys parser = OptionParser(usage=('%prog \n\n' + 'file types include: fpC, fpM, fpObjc, psField, tsObj, tsField\n' 'and for DR8 and above: frame')) parser.add_option('-r', '--run', dest='run', type='int') parser.add_option('-f', '--field', dest='field', type='int') parser.add_option('-c', '--camcol', dest='camcol', type='int') parser.add_option('-R', '--rerun', dest='rerun', type='int') parser.add_option('-b', '--band', dest='band') parser.add_option('-C', '--curl', dest='curl', action='store_true', default=False) parser.add_option('--dr9', dest='dr9', action='store_true', help='Grab DR9 data') parser.set_defaults(run=None, field=None, camcol=None, band=None, rerun=None) (opt, args) = parser.parse_args() if not len(args): parser.print_help() print print 'Must specify types of data desired' sys.exit(-1) run = opt.run field = opt.field camcol = opt.camcol band = opt.band if run is None or field is None or camcol is None: parser.print_help() print print 'Must supply --run, --field, --camcol' sys.exit(-1) argdict = {} if band is not None: argdict['band'] = band if opt.rerun is not None: argdict['reruns'] = [opt.rerun] if opt.dr9: sdss = DR9() else: sdss = DR7() for filetype in args: print 'Retrieving', filetype, '...' fn = sdss.retrieve(filetype, run, camcol, field, **argdict) #sdss_das_get(filetype, None, run, camcol, field, curl=opt.curl, **argdict) astrometry.net-0.67/sdss/sdss_name.py000644 000765 000024 00000002330 12651445460 020066 0ustar00dstnstaff000000 000000 from starutil_numpy import ra2hms, dec2dms # RA,Dec in degrees def sdss_name(ra, dec): ''' Returns the SDSS name, JHHMMSS.ss+DDMMSS.s >>> print sdss_name(15, 1) J010000.00+010000.0 >>> print sdss_name(0, 0) J000000.00+000000.0 >>> print sdss_name(0, 1./3600) J000000.00+000001.0 >>> print sdss_name(0, 1./36000) J000000.00+000000.1 # Truncation >>> print sdss_name(0, 1./36001) J000000.00+000000.0 >>> print sdss_name(15/60., 1) J000100.00+010000.0 >>> print sdss_name(15/3600., 1) J000001.00+010000.0 >>> print sdss_name(15/360000., 1) J000000.01+010000.0 >>> print sdss_name(15/360001., 1) J000000.00+010000.0 >>> print sdss_name(375., -0.5) J010000.00-003000.0 >>> print sdss_name(375., 0.5) J010000.00+003000.0 >>> print sdss_name(360., 90.) J000000.00+900000.0 ''' (rh,rm,rs) = ra2hms(ra) (sgn,dd,dm,ds) = dec2dms(dec) # According to http://www.sdss.org/dr3/coverage/IAU.html # the coordinates are truncated, not rounded. rcs = int(rs * 100.) dds = int(ds * 10.) return 'J%02i%02i%02i.%02i%s%02i%02i%02i.%01i' % ( rh, rm, rcs / 100, rcs % 100, '+' if sgn >= 0 else '-', dd, dm, dds / 10, dds % 10) if __name__ == "__main__": import doctest doctest.testmod(verbose=True) astrometry.net-0.67/sdss/setup.py000644 000765 000024 00000001127 12651445460 017255 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from distutils.core import setup, Extension import os import sys sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'util')) from an_build_ext import an_build_ext setup(cmdclass={'build_ext': an_build_ext}, name='C utils for Astrometry.net SDSS routines', version = '1.0', author = 'Lang & Hogg', author_email = 'dstn@cmu.edu', url = 'http://astrometry.net', ext_modules = [Extension('_cutils', ['cutils.i'], libraries=['m'])], ) astrometry.net-0.67/sdss/sqlcl.py000644 000765 000024 00000005075 12651445460 017241 0ustar00dstnstaff000000 000000 #!/usr/bin/python2 """>> sqlcl << command line query tool by Tamas Budavari Usage: sqlcl [options] sqlfile(s) Options: -s url : URL with the ASP interface (default: pha) -f fmt : set output format (html,xml,csv - default: csv) -q query : specify query on the command line -l : skip first line of output with column names -v : verbose mode dumps settings in header -h : show this message""" formats = ['csv','xml','html'] astro_url='http://cas.sdss.org/astro/en/tools/search/x_sql.asp' public_url='http://cas.sdss.org/public/en/tools/search/x_sql.asp' default_url=public_url default_fmt='csv' def usage(status, msg=''): "Error message and usage" print __doc__ if msg: print '-- ERROR: %s' % msg sys.exit(status) def filtercomment(sql): "Get rid of comments starting with --" import os fsql = '' for line in sql.split('\n'): fsql += line.split('--')[0] + ' ' + os.linesep; return fsql def query(sql,url=default_url,fmt=default_fmt): "Run query and return file object" import urllib fsql = filtercomment(sql) params = urllib.urlencode({'cmd': fsql, 'format': fmt}) return urllib.urlopen(url+'?%s' % params) def write_header(ofp,pre,url,qry): import time ofp.write('%s SOURCE: %s\n' % (pre,url)) ofp.write('%s TIME: %s\n' % (pre,time.asctime())) ofp.write('%s QUERY:\n' % pre) for l in qry.split('\n'): ofp.write('%s %s\n' % (pre,l)) def main(argv): "Parse command line and do it..." import os, getopt, string queries = [] url = os.getenv("SQLCLURL",default_url) fmt = default_fmt writefirst = 1 verbose = 0 # Parse command line try: optlist, args = getopt.getopt(argv[1:],'s:f:q:vlh?') except getopt.error, e: usage(1,e) for o,a in optlist: if o=='-s': url = a elif o=='-f': fmt = a elif o=='-q': queries.append(a) elif o=='-l': writefirst = 0 elif o=='-v': verbose += 1 else: usage(0) if fmt not in formats: usage(1,'Wrong format!') # Enqueue queries in files for fname in args: try: queries.append(open(fname).read()) except IOError, e: usage(1,e) # Run all queries sequentially for qry in queries: ofp = sys.stdout if verbose: write_header(ofp,'#',url,qry) file = query(qry,url,fmt) # Output line by line (in case it's big) line = file.readline() if line.startswith("ERROR"): # SQL Statement Error -> stderr ofp = sys.stderr if writefirst: ofp.write(string.rstrip(line)+os.linesep) line = file.readline() while line: ofp.write(string.rstrip(line)+os.linesep) line = file.readline() if __name__=='__main__': import sys main(sys.argv) astrometry.net-0.67/sdss/test_dr7.py000644 000765 000024 00000006501 12651445460 017651 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os from math import sqrt if __name__ == '__main__': import matplotlib matplotlib.use('Agg') import numpy as np import pylab as plt import astrometry.sdss from astrometry.sdss import DR7 from astrometry.util.fits import fits_table if __name__ == '__main__': sdss = DR7() testdata = os.path.join(os.path.dirname(astrometry.sdss.__file__), 'testdata') print 'Using test data dir:', testdata sdss.setBasedir(testdata) tsfield = sdss.readTsField(2830, 6, 398, 41) rband,iband = 2,3 asr = tsfield.getAsTrans(rband) asi = tsfield.getAsTrans(iband) ''' $ listhead fpC-002830-r6-0398.fit CRPIX1 = 1.02450000000000E+03 / Column Pixel Coordinate of Ref. Pixel CRPIX2 = 7.44500000000000E+02 / Row Pixel Coordinate of Ref. Pixel CRVAL1 = 1.79464261370000E+02 / RA at Reference Pixel CRVAL2 = 5.33206072700000E+01 / DEC at Reference Pixel CD1_1 = -8.4291038759718E-06 / RA degrees per column pixel CD1_2 = 1.09673333339369E-04 / RA degrees per row pixel CD2_1 = 1.09675673828125E-04 / DEC degrees per column pixel CD2_2 = 8.42453629032368E-06 / DEC degrees per row pixel ''' print 'CD at 0,0:', asr.cd_at_pixel(1024.5, 744.5) for x,y,color in [ (0, 0, 0), (np.array([1,2,3]), np.array([0,100,200]), 0), (np.array([1,2,3]), np.array([0,100,200]), np.array([0,1,2])), ]: print print 'Pixel x,y', x,y print 'color', color rr,dr = asr.pixel_to_radec(x, y, color) ri,di = asi.pixel_to_radec(x, y, color) print 'r-band RA,Dec:', rr,dr print 'i-band RA,Dec:', ri,di rx,ry = asr.radec_to_pixel(rr, dr) ix,iy = asi.radec_to_pixel(ri, di) print 'r-band x,y:', rx, ry print 'i-band x,y:', ix, iy tsobj = fits_table(os.path.join(testdata, 'cut-tsObj-002830-6-0-0398.fit')) ra,dec = tsobj.ra, tsobj.dec #X,Y = tsobj.colc[:,rband], tsobj.rowc[:,rband] X,Y = tsobj.objc_colc, tsobj.objc_rowc print 'ra,dec', ra.shape, dec.shape print 'x', X.shape #rmag = tsobj.psfcounts[:,rband] #imag = tsobj.psfcounts[:,iband] rmag = tsobj.counts_model[:,rband] imag = tsobj.counts_model[:,iband] # According to http://www.sdss.org/dr7/dm/flatFiles/tsField.html, # r,i,z fields, use this color: color = (rmag - imag) print 'color:', color.min(), color.max() xx,yy = asr.radec_to_pixel(ra, dec, color) print 'xx', xx.shape rr,dd = asr.pixel_to_radec(X, Y, color) print 'dxy', xx-X, yy-Y #print 'dradec', ra-rr, dec-dd print 'x RMS:', sqrt(np.mean((xx - X)**2)) print 'y RMS:', sqrt(np.mean((yy - Y)**2)) print 'RA RMS:', sqrt(np.mean((ra - rr)**2)) print 'Dec RMS:', sqrt(np.mean((dec - dd)**2)) #I = np.argmax((xx - X)**2 + (yy - Y)**2) #print 'Biggest x,y deviant: row', I #tsobj[I].about() plt.clf() plt.plot(xx,yy, 'r.') plt.plot(X, Y, 'bo', mfc='none') plt.savefig('dxy.png') lo,hi = 1e-10, 10 rng = np.log10(lo), np.log10(hi) plt.clf() plt.hist(np.log10(np.clip(np.abs(xx - X), lo, hi)), range=rng) plt.xlabel('log_10 ( x error )') plt.savefig('dx.png') plt.clf() plt.hist(np.log10(np.clip(np.abs(yy - Y), lo, hi)), range=rng) plt.xlabel('log_10 ( y error )') plt.savefig('dy.png') plt.clf() plt.hist(np.log10(np.clip(np.sqrt((yy - Y)**2 + (xx - X)**2), lo, hi)), range=rng) plt.xlabel('log_10 ( x,y error )') plt.savefig('dr.png') astrometry.net-0.67/sdss/test_dr8.py000644 000765 000024 00000004267 12651445460 017661 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import pylab as plt import sys from astrometry.sdss.dr8 import * import numpy as np def test_astrans(sdss, r,c,f,b): bandnum = band_index(b) sdss.retrieve('frame', r, c, f, b) frame = sdss.readFrame(r, c, f, b) astrans = frame.getAsTrans() sdss.retrieve('photoObj', r, c, f) obj = sdss.readPhotoObj(r, c, f) tab = obj.getTable() #tab.about() x,y = tab.colc[:,bandnum], tab.rowc[:,bandnum] ra,dec = tab.ra, tab.dec for r,d in zip(ra,dec): print 'ra,dec', r,d #print 'py:' x1,y1 = astrans.radec_to_pixel_single_py(r, d) print ' py', x1,y1 #print 'c:' x2,y2 = astrans.radec_to_pixel_single_c(r, d) print ' c', x2,y2 assert(np.abs(x1 - x2) < 1e-6) assert(np.abs(y1 - y2) < 1e-6) r2,d2 = astrans.pixel_to_radec(x, y) plt.clf() plt.plot(ra, dec, 'r.') plt.plot(r2, d2, 'bo', mec='b', mfc='none') plt.savefig('rd.png') r3,d3 = [],[] for xi,yi in zip(x,y): ri,di = astrans.pixel_to_radec(xi, yi) r3.append(ri) d3.append(di) plt.clf() plt.plot(ra, dec, 'r.') plt.plot(r3, d3, 'bo', mec='b', mfc='none') plt.savefig('rd3.png') x2,y2 = astrans.radec_to_pixel(ra, dec) plt.clf() plt.plot(x, y, 'r.') plt.plot(x2, y2, 'bo', mec='b', mfc='none') plt.savefig('xy.png') x3,y3 = [],[] for ri,di in zip(ra, dec): xi,yi = astrans.radec_to_pixel(ri, di) x3.append(xi) y3.append(yi) plt.clf() plt.plot(x, y, 'r.') plt.plot(x3, y3, 'bo', mec='b', mfc='none') plt.savefig('xy3.png') if __name__ == '__main__': sdss = DR8() #test_astrans(sdss, 4623, 1, 203, 'r') test_astrans(sdss, 5065, 1, 68, 'r') sys.exit(0) fnew = sdss.readFrame(4623, 1, 203, 'r', filename='frame-r-004623-1-0203.fits') print 'fnew:', fnew forig = sdss.readFrame(4623, 1, 203, 'r', 'frame-r-004623-1-0203.fits.orig') print 'forig:', forig frame = sdss.readFrame(3712, 3, 187, 'r') print 'frame:', frame img = frame.getImage() print ' image', img.shape fpobj = sdss.readFpObjc(6581, 2, 135) print 'fpobj:', fpobj fpm = sdss.readFpM(6581, 2, 135, 'i') print 'fpm:', fpm psf = sdss.readPsField(6581, 2, 135) print 'psfield:', psf astrometry.net-0.67/sdss/test_psf.py000644 000765 000024 00000016217 12651445460 017752 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np import sys import os from astrometry.sdss.dr9 import * from astrometry.sdss import * from astrometry.util.plotutils import * from scipy.ndimage.filters import * def test_vs_idl(): run, camcol, field = 1752, 3, 163 band ='r' bandnum = band_index(band) datadir = os.path.join(os.path.dirname(__file__), 'testdata') sdss = DR9(basedir=datadir) sdss.retrieve('psField', run, camcol, field) psfield = sdss.readPsField(run, camcol, field) ps = PlotSequence('klpsf') # These psf*.fits files were produced on the NYU system via: # # psfield = mrdfits('psField-001752-3-0163.fit', 3) # psfimage = sdss_psf_recon(psfield, 1000., 0.) # mwrfits,psfimage,'psf1k0.fits',/CREATE # for x,y,fn in [(0.,0.,'psf00.fits'), (0., 1000., 'psf01k.fits'), (1000., 0., 'psf1k0.fits'), (0., 2000., 'psf02k.fits'), (2000., 0., 'psf2k0.fits'), (600.,500.,'psf.fits')]: psf0 = pyfits.open(os.path.join(datadir, fn))[0].data # The IDL code adds 0.5 to the pixel coords psf = psfield.getPsfAtPoints(bandnum, x + 0.5, y + 0.5) psf = psf.astype(np.float32) def show(im): plt.imshow(np.log10(np.maximum(im, 1e-4)), interpolation='nearest', origin='lower') plt.clf() show(psf0) plt.gray() plt.colorbar() plt.title('IDL: %.1f, %.1f' % (x,y)) ps.savefig() plt.clf() show(psf) plt.colorbar() plt.title('Me: %.1f, %.1f' % (x,y)) ps.savefig() plt.clf() plt.imshow(psf - psf0, interpolation='nearest', origin='lower') plt.colorbar() plt.title('Diff: %.1f, %.1f' % (x,y)) ps.savefig() diff = psf - psf0 print 'Diff:', diff.min(), diff.max() rms = np.sqrt(np.mean(diff**2)) print 'RMS:', rms assert(np.all(np.abs(diff) < 5e-8)) assert(rms < 2e-8) def test_vs_stars(): ps = PlotSequence('klpsf') #run, camcol, field, band = 4948, 6, 249, 'r' run, camcol, field, band = 94, 6, 11, 'r' test_vs_stars_on(run, camcol, field, band, ps) return run, camcol, field = 1752, 3, 163 band ='r' test_vs_stars_on(run, camcol, field, band, ps) #756-z6-700 run, camcol, field = 756, 6, 700 band ='z' test_vs_stars_on(run, camcol, field, band, ps) def test_vs_stars_on(run, camcol, field, band, ps): bandnum = band_index(band) datadir = os.path.join(os.path.dirname(__file__), 'testdata') sdss = DR9(basedir=datadir) sdss.retrieve('psField', run, camcol, field) psfield = sdss.readPsField(run, camcol, field) sdss.retrieve('frame', run, camcol, field, band) frame = sdss.readFrame(run, camcol, field, band) img = frame.image H,W = img.shape fn = sdss.retrieve('photoObj', run, camcol, field) T = fits_table(fn) T.mag = T.get('psfmag')[:,bandnum] T.flux = T.get('psfflux')[:,bandnum] # !! T.x = T.colc[:,bandnum] - 0.5 T.y = T.rowc[:,bandnum] - 0.5 T.cut(T.prob_psf[:,bandnum] == 1) T.cut(T.nchild == 0) T.cut(T.parent == -1) T.cut(T.flux > 1.) print len(T), 'after flux cut' #T.cut(T.flux > 10.) #print len(T), 'after flux cut' #T.cut(T.flux > 20.) #print len(T), 'after flux cut' T.cut(np.argsort(-T.flux)[:25]) # margin m = 30 T.cut((T.x >= m) * (T.x < (W-m)) * (T.y >= m) * (T.y < (H-m))) #T.cut(np.argsort(T.mag)) T.cut(np.argsort(-np.abs(T.x - T.y))) print len(T), 'PSF stars' #R,C = 5,5 #plt.clf() eigenpsfs = psfield.getEigenPsfs(bandnum) eigenpolys = psfield.getEigenPolynomials(bandnum) RR,CC = 2,2 xx,yy = np.meshgrid(np.linspace(0, W, 12), np.linspace(0, H, 8)) ima = dict(interpolation='nearest', origin='lower') plt.clf() mx = None for i,(psf,poly) in enumerate(zip(eigenpsfs, eigenpolys)): print print 'Eigen-PSF', i XO,YO,C = poly kk = np.zeros_like(xx) for xo,yo,c in zip(XO,YO,C): dk = (xx ** xo) * (yy ** yo) * c #print 'xo,yo,c', xo,yo,c, '-->', dk kk += dk print 'Max k:', kk.max(), 'min', kk.min() print 'PSF range:', psf.min(), psf.max() print 'Max effect:', max(np.abs(kk.min()), kk.max()) * max(np.abs(psf.min()), psf.max()) plt.subplot(RR,CC, i+1) plt.imshow(psf * kk.max(), **ima) if mx is None: mx = (psf * kk.max()).max() else: plt.clim(-mx * 0.05, mx * 0.05) plt.colorbar() ps.savefig() psfs = psfield.getPsfAtPoints(bandnum, xx,yy) #print 'PSFs:', psfs ph,pw = psfs[0].shape psfs = np.array(psfs).reshape(xx.shape + (ph,pw)) print 'PSFs shape:', psfs.shape psfs = psfs[:,:,15:36,15:36] ny,nx,ph,pw = psfs.shape psfmos = np.concatenate([psfs[i,:,:,:] for i in range(ny)], axis=1) print 'psfmos', psfmos.shape psfmos = np.concatenate([psfmos[i,:,:] for i in range(nx)], axis=1) print 'psfmos', psfmos.shape plt.clf() plt.imshow(np.log10(np.maximum(psfmos + 1e-3, 1e-3)), **ima) ps.savefig() diffs = None rmses = None for i in range(len(T)): xx = T.x[i] yy = T.y[i] ix = int(np.round(xx)) iy = int(np.round(yy)) dx = xx - ix dy = yy - iy S = 25 stamp = img[iy-S:iy+S+1, ix-S:ix+S+1] L = 6 Lx = lanczos_filter(L, np.arange(-L, L+1) - dx) Ly = lanczos_filter(L, np.arange(-L, L+1) - dy) sx = correlate1d(stamp, Lx, axis=1, mode='constant') shim = correlate1d(sx, Ly, axis=0, mode='constant') shim /= (Lx.sum() * Ly.sum()) psf = psfield.getPsfAtPoints(bandnum, xx, yy) mod = psf / psf.sum() * T.flux[i] psf2 = psfield.getPsfAtPoints(bandnum, yy, xx) mod2 = psf2 / psf2.sum() * T.flux[i] psf3 = psfield.getPsfAtPoints(bandnum, xx, yy).T mod3 = psf3 / psf3.sum() * T.flux[i] mods = [mod, mod2, mod3] if diffs is None: diffs = [np.zeros_like(m) for m in mods] rmses = [np.zeros_like(m) for m in mods] for m,rms,diff in zip(mods, rmses, diffs): diff += (m - shim) rms += (m - shim)**2 if i > 10: continue def show(im): plt.imshow(np.log10(np.maximum(1e-3, im + 1e-3)), vmin=-3, vmax=0, **ima) plt.hot() plt.colorbar() R,C = 3,4 plt.clf() plt.subplot(R,C,1) show(shim) plt.subplot(R,C,2) show(mods[0]) plt.subplot(R,C,2+C) plt.imshow(mods[0] - shim, vmin=-0.05, vmax=0.05, **ima) plt.hot() plt.colorbar() plt.subplot(R,C,3) show(mods[1]) plt.subplot(R,C,3+C) plt.imshow(mods[1] - shim, vmin=-0.05, vmax=0.05, **ima) plt.hot() plt.colorbar() plt.subplot(R,C,4) show(mods[2]) plt.subplot(R,C,4+C) plt.imshow(mods[2] - shim, vmin=-0.05, vmax=0.05, **ima) plt.hot() plt.colorbar() plt.subplot(R,C,3+2*C) plt.imshow(mods[1] - mods[0], vmin=-0.05, vmax=0.05, **ima) plt.hot() plt.colorbar() plt.subplot(R,C,4+2*C) plt.imshow(mods[2] - mods[0], vmin=-0.05, vmax=0.05, **ima) plt.hot() plt.colorbar() plt.suptitle('%.0f, %.0f' % (xx,yy)) ps.savefig() for diff in diffs: diff /= len(T) rmses = [np.sqrt(rms / len(T)) for rms in rmses] print 'rms median', np.median(rmses[0]), 'mean', np.mean(rmses[0]) r0,r1 = [np.percentile(rmses[0], p) for p in [10,90]] R,C = 2,len(diffs) plt.clf() for i,(d,r) in enumerate(zip(diffs, rmses)): plt.subplot(R,C, 1+i) plt.imshow(d, vmin=-0.05, vmax=0.05, **ima) plt.colorbar() plt.hot() plt.subplot(R,C, 1+i+C) plt.imshow(r, vmin=r0, vmax=r1, **ima) plt.colorbar() plt.hot() ps.savefig() if __name__ == '__main__': #test_vs_idl() test_vs_stars() astrometry.net-0.67/sdss/testdata/000755 000765 000024 00000000000 12651445460 017353 5ustar00dstnstaff000000 000000 astrometry.net-0.67/sdss/yanny.py000644 000765 000024 00000077345 12651445460 017272 0ustar00dstnstaff000000 000000 # # yanny.py # # Python library for reading & writing yanny files. # # B. A. Weaver, NYU, 2008-10-20 # # $Id: yanny.py 128984 2011-12-22 19:52:34Z weaver $ # """Python library for reading & writing yanny files. yanny is an object-oriented interface to FTCL/yanny data files following these specifications_. The format of the returned object is similar to that returned by ``read_yanny()`` in the efftickle perl package (in the yannytools product). Currently multidimensional arrays are only supported for type ``char``, but a close reading of the specifications indicates that multidimensional arrays were only ever intended to be supported for type ``char``. .. _specifications: http://www.sdss3.org/dr8/software/par.php """ __author__ = 'Benjamin Weaver ' __version__ = '$Revision: 128984 $'.split(': ')[1].split()[0] __all__ = [ 'yanny', 'read_yanny', 'write_yanny', 'write_yanny_append' ] __docformat__ = "restructuredtext en" # # Modules # import re import os import os.path import datetime import numpy # # Classes # class yanny(dict): """An object interface to a yanny file. Most users will use the convenience functions defined in this package, but this object provides a somewhat more powerful way of reading & writing the data in a yanny file. Attributes ---------- np : bool If True, data in a yanny file will be converted into a NumPy record array. debug : bool If True, some simple debugging statements will be turned on. _filename : str The name of a yanny parameter file. _contents : str The complete contents of a yanny parameter file. _struct_type_caches : dict A dictionary of dictionaries, one dictionary for every structure definition in a yanny parameter file. Contains the types of each column _struct_isarray_caches : dict A dictionary of dictionaries, one dictionary for every structure definition in a yanny parameter file. Contains a boolean value for every column. _enum_cache : dict Initially ``None``, this attribute is initialized the first time the ``isenum()`` method is called. The keyword is the name of the enum type, the value is a list of the possible values of that type. Parameters ---------- filename : str The name of a yanny file. np : bool, optional If True, data in a yanny file will be converted into a NumPy record array. Default is False debug : bool, optional If True, some simple debugging statements will be turned on. Default is False. """ @staticmethod def get_token(string): """Removes the first 'word' from string. If the 'word' is enclosed in double quotes, it returns the contents of the double quotes. If the 'word' is enclosed in braces, it returns the contents of the braces, but does not attempt to split the array. If the 'word' is the last word of the string, remainder is set equal to the empty string. This is basically a wrapper on some convenient regular expressions. """ if string[0] == '"': (word, remainder) = re.search(r'^"([^"]*)"\s*(.*)', string).groups() elif string[0] == '{': (word, remainder) = re.search(r'^\{\s*([^}]*)\s*\}\s*(.*)', string).groups() else: try: (word, remainder) = re.split(r'\s+',string,1) except ValueError: #print "Problem with string: %s" % string (word, remainder) = (string, '') if remainder is None: remainder = '' return (word,remainder) @staticmethod def protect(x): """Used to appropriately quote string that might contain whitespace. This method is mostly for internal use by the yanny object. """ s = str(x) if len(s) == 0 or re.search(r'\s+',s) is not None: return '"' + s + '"' else: return s @staticmethod def dtype_to_struct(dt,structname='mystruct',enums=dict()): """Convert a NumPy dtype object describing a record array to a typedef struct statement. The second argument is the name of the structure. If any of the columns are enum types, enums must be a dictionary with the keys the column names, and the values are a tuple containing the name of the enum type as the first item and a tuple or list of possible values as the second item. """ dtmap = {'i2':'short','i4':'int','i8':'long','f4':'float', 'f8':'double'} lines = list() for e in enums: lines.append('typedef enum {') for n in enums[e][1]: lines.append(" %s,"%n) lines[-1] = lines[-1].strip(',') lines.append('} %s;' % enums[e][0].upper()) lines.append('') lines.append('typedef struct {') for c in dt.names: if dt[c].kind == 'V': t = dt[c].subdtype[0].str[1:] l = dt[c].subdtype[1][0] s = dt[c].subdtype[0].itemsize else: t = dt[c].str[1:] l = 0 s = dt[c].itemsize line = ' ' if t[0] == 'S': if c in enums: line += enums[c][0].upper() else: line += 'char' else: line += dtmap[t] line += ' %s' % c if l > 0: line += "[%d]" % l if t[0] == 'S' and c not in enums: line += "[%d]" % s line += ';' lines.append(line) lines.append('} %s;' % structname.upper()) return "\n".join(lines) def __init__(self,filename=None,np=False,debug=False): """Create a yanny object using a yanny file. Create a yanny object using a yanny file, filename. If the file exists, it is read, & the dict structure of the object will be basically the same as that returned by ``read_yanny()`` in the efftickle package. If the file does not exist, or if no filename is given, a blank structure is returned. Other methods allow for subsequent writing to the file. """ # # The symbol hash is inherited from the old read_yanny # self['symbols'] = dict() # # Create special attributes that contain the internal status of the object # this should prevent overlap with keywords in the data files # self._filename = '' self._contents = '' # # Since the re is expensive, cache the structure types keyed by the field. # Create a dictionary for each structure found. # self._struct_type_caches = dict() self._struct_isarray_caches = dict() self._enum_cache = None # # Optionally convert numeric data into NumPy arrays # self.np = np # # Turn on simple debugging # self.debug = debug # # If the file exists, read it # if filename is not None: if os.access(filename,os.R_OK): self._filename = filename f = open(filename,'r') self._contents = f.read() f.close() self._parse() return def __str__(self): """Implement the ``str()`` function for yanny objects. Simply prints the current contents of the yanny file. """ return self._contents def __eq__(self,other): """Test two yanny objects for equality. Two yanny objects are assumed to be equal if their contents are equal. """ if isinstance(other,yanny): return str(other) == str(self) return False def type(self,structure,variable): """Returns the type of a variable defined in a structure. Returns ``None`` if the structure or the variable is undefined. """ if structure not in self: return None if variable not in self.columns(structure): return None defl = filter(lambda x: x.find(structure.lower()) > 0, self['symbols']['struct']) defu = filter(lambda x: x.find(structure.upper()) > 0, self['symbols']['struct']) if len(defl) != 1 and len(defu) != 1: return None elif len(defl) == 1: definition = defl else: definition = defu # # Added code to cache values to speed up parsing large files. # 2009.05.11 / Demitri Muna, NYU # Find (or create) the cache for this structure. # try: cache = self._struct_type_caches[structure] except KeyError: self._struct_type_caches[structure] = dict() cache = self._struct_type_caches[structure] # cache for one struct type # # Lookup (or create) the value for this variable # try: var_type = cache[variable] except KeyError: if self.debug: print variable typere = re.compile(r'(\S+)\s+%s([[<].*[]>]|);' % variable) (typ,array) = typere.search(definition[0]).groups() var_type = typ + array.replace('<','[').replace('>',']') cache[variable] = var_type return var_type def basetype(self,structure,variable): """Returns the bare type of a variable, stripping off any array information.""" typ = self.type(structure,variable) if self.debug: print variable, typ try: return typ[0:typ.index('[')] except ValueError: return typ def isarray(self,structure,variable): """Returns True if the variable is an array type. For character types, this means a two-dimensional array, *e.g.*: ``char[5][20]``. """ try: cache = self._struct_isarray_caches[structure] except KeyError: self._struct_isarray_caches[structure] = dict() cache = self._struct_isarray_caches[structure] try: result = cache[variable] except KeyError: typ = self.type(structure,variable) character_array = re.compile(r'char[[<]\d*[]>][[<]\d*[]>]') if ((character_array.search(typ) is not None) or (typ.find('char') < 0 and (typ.find('[') >= 0 or typ.find('<') >= 0))): cache[variable] = True else: cache[variable] = False result = cache[variable] return result def isenum(self,structure,variable): """Returns true if a variable is an enum type. """ if self._enum_cache is None: self._enum_cache = dict() if 'enum' in self['symbols']: for e in self['symbols']['enum']: m = re.search(r'typedef\s+enum\s*\{([^}]+)\}\s*(\w+)\s*;',e).groups() self._enum_cache[m[1]] = re.split(r',\s*',m[0].strip()) else: return False return self.basetype(structure,variable) in self._enum_cache def array_length(self,structure,variable): """Returns the length of an array type or 1 if the variable is not an array. For character types, this is the length of a two-dimensional array, *e.g.*, ``char[5][20]`` has length 5. """ if self.isarray(structure,variable): typ = self.type(structure,variable) return int(typ[typ.index('[')+1:typ.index(']')]) else: return 1 def char_length(self,structure,variable): """Returns the length of a character field. *e.g.* ``char[5][20]`` is an array of 5 strings of length 20. Returns ``None`` if the variable is not a character type. If the length is not specified, *i.e.* ``char[]``, it returns the length of the largest string. """ typ = self.type(structure,variable) if typ.find('char') < 0: return None try: return int(typ[typ.rfind('[')+1:typ.rfind(']')]) except ValueError: if self.isarray(structure,variable): return max([max(map(len,r)) for r in self[structure][variable]]) else: return max(map(len,self[structure][variable])) def dtype(self,structure): """Returns a NumPy dtype object suitable for describing a table as a record array. Treats enums as string, which is what the IDL reader does. """ dt = list() dtmap = {'short':'i2', 'int':'i4', 'long':'i8', 'float':'f', 'double':'d' } for c in self.columns(structure): typ = self.basetype(structure,c) if typ == 'char': d = "S%d" % self.char_length(structure,c) elif self.isenum(structure,c): d = "S%d" % max(map(len,self._enum_cache[typ])) else: d = dtmap[typ] if self.isarray(structure,c): dt.append((c,d,(self.array_length(structure,c),))) else: dt.append((c,d)) dt = numpy.dtype(dt) return dt def convert(self,structure,variable,value): """Converts value into the appropriate (Python) type. * ``short`` & ``int`` are converted to Python ``int``. * ``long`` is converted to Python ``long``. * ``float`` & ``double`` are converted to Python ``float``. * Other types are not altered. There may be further conversions into NumPy types, but this is the first stage. """ typ = self.basetype(structure,variable) if (typ == 'short' or typ == 'int'): if self.isarray(structure,variable): return map(int, value) else: return int(value) if typ == 'long': if self.isarray(structure,variable): return map(long, value) else: return long(value) if (typ == 'float' or typ == 'double'): if self.isarray(structure,variable): return map(float, value) else: return float(value) return value def tables(self): """Returns a list of all the defined structures. This is just the list of keys of the object with the 'internal' keys removed. """ foo = self['symbols'].keys() foo.remove('struct') foo.remove('enum') return foo def columns(self,table): """Returns an ordered list of column names associated with a particular table. The order is the same order as they are defined in the yanny file. """ foo = list() if table in self['symbols']: return self['symbols'][table] return foo def size(self,table): """Returns the number of rows in a table. """ foo = self.columns(table) return len(self[table][foo[0]]) def pairs(self): """Returns a list of keys to keyword/value pairs. Equivalent to doing ``self.keys()``, but with all the data tables & other control structures stripped out. """ p = list() foo = self.tables() for k in self.keys(): if k == 'symbols' or k in foo: continue p.append(k) return p def row(self,table,index): """Returns a list containing a single row from a specified table in column order If index is out of range, it returns an empty list. If the yanny object instance is set up for NumPy record arrays, then a single row can be obtained with:: >>> row0 = par['TABLE'][0] """ datarow = list() if table in self and index >= 0 and index < self.size(table): for c in self.columns(table): datarow.append(self[table][c][index]) return datarow def set_filename(self,newfile): """Updates the filename associated with the yanny object. Use this if the object was created with no filename. """ self._filename = newfile return def list_of_dicts(self, table): """Construct a list of dictionaries. Takes a table from the yanny object and constructs a list object containing one row per entry. Each item in the list is a dictionary keyed by the struct value names. If the yanny object instance is set up for NumPy record arrays, then the same functionality can be obtained with:: >>> foo = par['TABLE'][0]['column'] """ return_list = list() d = dict() struct_fields = self.columns(table) # I'm assuming these are in order... for i in range(self.size(table)): one_row = self.row(table, i) # one row as a list j = 0 for key in struct_fields: d[key] = one_row[j] j = j + 1 return_list.append(dict(d)) # append a new dict (copy of d) return return_list def new_dict_from_pairs(self): """Returns a new dictionary of keyword/value pairs. The new dictionary (*i.e.*, not a yanny object) contains the keys that ``self.pairs()`` returns. There are two reasons this is convenient: * the key 'symbols' that is part of the yanny object will not be present * a simple yanny file can be read with no further processing Example ------- Read a yanny file and return only the pairs:: >>> new_dict = yanny.yanny(file).new_dict_from_pairs() added: Demitri Muna, NYU 2009-04-28 """ new_dictionary = dict() for key in self.pairs(): new_dictionary[key] = self[key] return new_dictionary def write(self,*args): """Write a yanny object to a file. This assumes that the filename used to create the object was not that of a pre-existing file. If a file of the same name is detected, this method will *not* attempt to overwrite it, but will print a warning. This also assumes that the special 'symbols' key has been properly created. This will not necessarily make the file very human-readable, especially if the data lines are long. If the name of a new file is given, it will write to the new file (assuming it doesn't exist). If the writing is successful, the data in the object will be updated. """ if len(args) > 0: newfile = args[0] else: if len(self._filename) > 0: newfile = self._filename else: print "ERROR: No filename specified!" return basefile = os.path.basename(newfile) timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC') contents = "#\n# %s\n#\n# Created by yanny.py\n#\n# %s\n#\n" % (basefile,timestamp) # # Print any key/value pairs # for key in self.pairs(): contents += "%s %s\n" % (key,self[key]) # # Print out enum definitions # if len(self['symbols']['enum']) > 0: contents += "\n" + "\n\n".join(self['symbols']['enum']) + "\n" # # Print out structure definitions # if len(self['symbols']['struct']) > 0: contents += "\n" + "\n\n".join(self['symbols']['struct']) + "\n" contents += "\n" # # Print out the data tables # for sym in self.tables(): columns = self.columns(sym) for k in range(self.size(sym)): line = list() line.append(sym) for col in columns: if self.isarray(sym,col): datum = '{' + ' '.join(map(self.protect,self[sym][col][k])) + '}' else: datum = self.protect(self[sym][col][k]) line.append(datum) contents += "%s\n" % ' '.join(line) # # Actually write the data to file # if os.access(newfile,os.F_OK): print "%s exists, aborting write!" % newfile print "For reference, here's what would have been written:" print contents else: f = open(newfile,'w') print >> f, contents f.close() self._contents = contents self._filename = newfile self._parse() return def append(self,datatable): """Appends data to an existing FTCL/yanny file. Tries as much as possible to preserve the ordering & format of the original file. The datatable should adhere to the format of the yanny object, but it is not necessary to reproduce the 'symbols' dictionary. It will not try to append data to a file that does not exist. If the append is successful, the data in the object will be updated. """ if len(self._filename) == 0: print "No filename is set for this object. Use the set_filename method to set the filename!" return if type(datatable) != dict: print "Data to append is not of the correct type. Use a dict!" return timestamp = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC') contents = '' # # Print any key/value pairs # for key in datatable.keys(): if key.upper() in self.tables() or key == 'symbols': continue contents += "%s %s\n" % (key, datatable[key]) # # Print out the data tables # for sym in self.tables(): if sym.lower() in datatable: datasym = sym.lower() else: datasym = sym if datasym in datatable: columns = self.columns(sym) for k in range(len(datatable[datasym][columns[0]])): line = list() line.append(sym) for col in columns: if self.isarray(sym,col): datum = '{' + ' '.join(map(self.protect,datatable[datasym][col][k])) + '}' else: datum = self.protect(datatable[datasym][col][k]) line.append(datum) contents += "%s\n" % ' '.join(line) # # Actually write the data to file # if len(contents) > 0: contents = ("# Appended by yanny.py at %s.\n" % timestamp) + contents if os.access(self._filename,os.W_OK): f = open(self._filename,'a') print >> f, contents f.close() self._contents += contents self._parse() else: print "%s does not exist, aborting append!" % self._filename print "For reference, here's what would have been written:" print contents else: print "Nothing to be appended!" return def _parse(self): """Converts text into tables that users can use. This method is for use internally by the yanny object. It is not meant to be called by users. Parsing proceeds in this order: #. Lines that end with a backslash character ``\`` are reattached to following lines. #. Structure & enum definitions are identified, saved into the 'symbols' dictionary & stripped from the contents. #. Structure definitions are interpreted. #. At this point, the remaining lines of the original file can only contain these things: * 'blank' lines, including lines that only contain comments * keyword/value pairs * structure rows #. The remaining lines are scanned sequentially. #. 'Blank' lines are identified & ignored. #. Whitespace & comments are stripped from non-blank lines. #. Empty double braces ``{{}}`` are converted into empty double quotes ``""``. #. If the first word on a line matches the name of a structure, the line is broken up into tokens & each token or set of tokens (for arrays) is converted to the appropriate Python type. #. If the first word on a line does not match the name of a structure, it must be a keyword, so this line is interpreted as a keyword/value pair. No further processing is done to the value. #. At the conclusion of parsing, if ``self.np`` is ``True``, the structures are converted into NumPy record arrays. """ # # there are five things we might find # 1. 'blank' lines including comments # 2. keyword/value pairs (which may have trailing comments) # 3. enumeration definitions # 4. structure definitions # 5. data # lines = self._contents # # Reattach lines ending with \ # lines = re.sub(r'\\\s*\n',' ',lines) # # Find structure & enumeration definitions & strip them out # self['symbols']['struct'] = re.findall(r'typedef\s+struct\s*\{[^}]+\}\s*\w+\s*;',lines) self['symbols']['enum'] = re.findall(r'typedef\s+enum\s*\{[^}]+\}\s*\w+\s*;',lines) lines = re.sub(r'typedef\s+struct\s*\{[^}]+\}\s*\w+\s*;','',lines) lines = re.sub(r'typedef\s+enum\s*\{[^}]+\}\s*\w+\s*;','',lines) # # Interpret the structure definitions # typedefre = re.compile(r'typedef\s+struct\s*\{([^}]+)\}\s*(\w*)\s*;') for typedef in self['symbols']['struct']: typedefm = typedefre.search(typedef) (definition,name) = typedefm.groups() self[name.upper()] = dict() self['symbols'][name.upper()] = list() definitions = re.findall(r'\S+\s+\S+;',definition) for d in definitions: d = d.replace(';','') (datatype,column) = re.split(r'\s+',d) column = re.sub(r'[[<].*[]>]$','',column) self['symbols'][name.upper()].append(column) self[name.upper()][column] = list() comments = re.compile(r'^\s*#') # Remove lines containing only comments blanks = re.compile(r'^\s*$') # Remove lines containing only whitespace trailing_comments = re.compile(r'\s*\#.*$') # Remove trailing comments double_braces = re.compile(r'\{\s*\{\s*\}\s*\}') # Double empty braces get replaced with empty quotes if len(lines) > 0: for line in lines.split('\n'): if self.debug: print line if len(line) == 0: continue if comments.search(line) is not None: continue if blanks.search(line) is not None: continue # # Remove leading & trailing blanks & comments # line = line.strip() line = trailing_comments.sub('',line) line = double_braces.sub('""',line) # # Now if the first word on the line does not match a # structure definition it is a keyword/value pair # (key, value) = self.get_token(line) uckey = key.upper() if uckey in self['symbols'].keys(): # # Structure data # for column in self['symbols'][uckey]: if len(value) > 0 and blanks.search(value) is None: (data,value) = self.get_token(value) if self.isarray(uckey,column): # # An array value # if it's character data, it won't be # delimited by {} unless it is a multidimensional # string array. It may or may not be delimited # by double quotes # # Note, we're assuming here that the only # multidimensional arrays are string arrays # arraydata = list() while len(data) > 0: (token, data) = self.get_token(data) arraydata.append(token) self[uckey][column].append( self.convert(uckey,column,arraydata)) else: # # A single value # self[uckey][column].append( self.convert(uckey,column,data)) else: break else: # # Keyword/value pair # self[key] = value # # If self.np is True, convert tables into NumPy record arrays # if self.np: for t in self.tables(): record = numpy.zeros((self.size(t),),dtype=self.dtype(t)) for c in self.columns(t): record[c] = self[t][c] self[t] = record return # # Functions # def read_yanny(filename): """Reads the contents of an FTCL/yanny file & returns the data in a hash. This is just a convenience wrapper on a yanny object, for use when a user is not interested in changing the contents of a yanny object. """ par = yanny(filename) return par.copy() def write_yanny(filename,datatable): """Writes the contents of a hash to an FTCL/yanny file. Ideally used in conjunction with read_yanny() to create an initial dictionary of the appropriate format. """ par = yanny(filename) for key in datatable: par[key] = datatable[key] par.write() return def write_yanny_append(filename,datatable): """Appends the contents of a hash to an existing FTCL/yanny file. Ideally used in conjunction with read_yanny() to create an initial dictionary of the appropriate format. """ par = yanny(filename) par.append(datatable) return def main(): """Used to test the yanny class. """ par = yanny(os.path.join(os.getenv('YANNYTOOLS_DIR'),'data','test.par'), np=True,debug=True) print par.pairs() for p in par.pairs(): print "%s => %s" % (p, par[p]) print par.keys() print par['symbols'].keys() print par['symbols']['struct'] print par['symbols']['enum'] print par.tables() for t in par.tables(): print par.dtype(t) print "%s: %d entries" % (t,par.size(t)) print par.columns(t) for c in par.columns(t): print "%s: type %s" % (c,par.type(t,c)) print par[t][c] if par.isenum('MYSTRUCT','new_flag'): print par._enum_cache par.write() # This should fail, since test.par already exists. datatable = {'status_update': {'state':['SUCCESS', 'SUCCESS'], 'timestamp':['2008-06-22 01:27:33','2008-06-22 01:27:36']}, 'new_keyword':'new_value'} par.set_filename(os.path.join(os.getenv('YANNYTOOLS_DIR'),'data','test_append.par')) par.append(datatable) # This should also fail, because test_append.par does not exist return # # Testing purposes # if __name__ == '__main__': main() astrometry.net-0.67/sdss/testdata/cut-tsObj-002830-6-0-0398.fit000644 000765 000024 00000534600 12651445460 023374 0ustar00dstnstaff000000 000000 SIMPLE = T BITPIX = 8 NAXIS = 0 EXTEND = T RUN = 2830 / Imaging run number. CAMCOL = 6 / Column in imaging camera. RERUN = 41 / Rerun number. NFIELDS = 1 / Number of fields reduced. STRIPE = 31 / Stripe number. STRIP = 'S ' / N - north, S - south, O - other. EQUINOX = 2.00000000000000E+03 / Equinox of great circle scanned (Juli NODE = 9.50000000000000E+01 / Ascending node of great circle scanne INCL = 5.25000000000000E+01 / Inclination of great circle scanned ( C_OBS = 2.63220000000000E+04 / CCD clock rate (usec/unbinned-row). TRACKING= 1.50410600000000E+01 / Tracking rate (arcsec/TAI-sec). PHOTO_ID= '2003-08-27T12:18:07 15085' / Photometric pipeline run id. PHOT_VER= 'v5_4_25 ' / Version of frames pipeline used. TASTR_ID= '2003-08-25T20:13:47 04688' / Astrometric pipeline run id for targe TAST_VER= 'v3_7 ' / Version of astrometric pipeline for t TFCAL_ID= '2003-08-31T05:11:02 32747' / Photometric calibration run id for ta TFCA_VER= 'v2_2 ' / Version of fcalib for target. EASTR_ID= '2003-08-25T20:13:47 04688' / Astrometric pipeline run id for expor EAST_VER= 'v3_7 ' / Version of astrometric pipeline for e EFCAL_ID= '2003-08-31T05:11:02 32747' / Photometric calibration run id for ex EFCA_VER= 'v2_2 ' / Version of fcalib for export. TARG_VER= 'ts_v5_6 ' / Version of target pipeline used. EXPO_VER= 'ts_v5_6 ' / Version of export pipeline used. FILTERS = 'u g r i z' / Filter order in arrays. OBJ_SRC = 'OPDB_PRELIM' / Source of objects. TARG_SRC= 'OPDB_PRELIM' / Source of target info. RESOLVED= F / Data from a resolved segment. SKY_VER = -1 / Sky version(-1=stage,0=target,1=best) EXPORTED= 4 / 1=targets,2=prim,3=prim+sec,4=all FAMILIES= T / Contains family members of included o REF_BAND= 2 / Band used for canonical centre. DARK_VAR= '7.02 1.82 0.90 5.06 1.21' / Per-pixel variances at zero DN (DN^2) GAIN = '2.17 4.03 4.89 4.76 4.69' / Mean gains of amplifiers (e/DN). FIELD0 = 398 / First field reduced. END XTENSION= 'BINTABLE' BITPIX = 8 NAXIS = 2 NAXIS1 = 2732 NAXIS2 = 50 PCOUNT = 0 GCOUNT = 1 TFIELDS = 146 FIELD = 398 / Field sequence number within the run QUALITY = 'ACCEPTABLE' / Field quality CULLED = 0 / Culling bit mask SEEING_U= 1.68579745292664E+00 / FWHM (arcsecs) MJD_U = 5.22634142837000E+04 / MJD(TAI) PSFERR_U= 2.04104091972113E-02 / Photometric err due to imperfect PSF STATUS_U= 'OK ' / PSF fit status on this frame SKY_U = 1.26909682762744E-09 / Sky after obj sub (maggies/arcsec^2) SEEING_G= 1.47657227516174E+00 / FWHM (arcsecs) MJD_G = 5.22634159423000E+04 / MJD(TAI) PSFERR_G= 1.74803771078587E-02 / Photometric err due to imperfect PSF STATUS_G= 'OK ' / PSF fit status on this frame SKY_G = 1.54127022256034E-09 / Sky after obj sub (maggies/arcsec^2) SEEING_R= 1.25936317443848E+00 / FWHM (arcsecs) MJD_R = 5.22634126250000E+04 / MJD(TAI) PSFERR_R= 1.51031054556370E-02 / Photometric err due to imperfect PSF STATUS_R= 'OK ' / PSF fit status on this frame SKY_R = 3.80955444967412E-09 / Sky after obj sub (maggies/arcsec^2) SEEING_I= 1.28556013107300E+00 / FWHM (arcsecs) MJD_I = 5.22634134543000E+04 / MJD(TAI) PSFERR_I= 1.30331348627806E-02 / Photometric err due to imperfect PSF STATUS_I= 'OK ' / PSF fit status on this frame SKY_I = 7.28569071739571E-09 / Sky after obj sub (maggies/arcsec^2) SEEING_Z= 1.24099946022034E+00 / FWHM (arcsecs) MJD_Z = 5.22634151128000E+04 / MJD(TAI) PSFERR_Z= 1.36831225827336E-02 / Photometric err due to imperfect PSF STATUS_Z= 'OK ' / PSF fit status on this frame SKY_Z = 2.17737863295042E-08 / Sky after obj sub (maggies/arcsec^2) PSP_STAT= 'OK ' / Maximum of STATUS value on all 5 fram TFORM1 = '1J ' TTYPE1 = 'run ' TFORM2 = '1J ' TTYPE2 = 'camCol ' TFORM3 = '1J ' TTYPE3 = 'rerun ' TFORM4 = '1J ' TTYPE4 = 'field ' TFORM5 = '1J ' TTYPE5 = 'parent ' TFORM6 = '1J ' TTYPE6 = 'id ' TFORM7 = '1J ' TTYPE7 = 'nchild ' TFORM8 = '1J ' TTYPE8 = 'objc_type' TFORM9 = '1E ' TTYPE9 = 'objc_prob_psf' TFORM10 = '1J ' TTYPE10 = 'catID ' TFORM11 = '1J ' TTYPE11 = 'objc_flags' TFORM12 = '1J ' TTYPE12 = 'objc_flags2' TFORM13 = '1E ' TTYPE13 = 'objc_rowc' TUNIT13 = 'pixels ' TFORM14 = '1E ' TTYPE14 = 'objc_rowcErr' TUNIT14 = 'pixels ' TFORM15 = '1E ' TTYPE15 = 'objc_colc' TUNIT15 = 'pixels ' TFORM16 = '1E ' TTYPE16 = 'objc_colcErr' TUNIT16 = 'pixels ' TFORM17 = '1E ' TTYPE17 = 'rowv ' TUNIT17 = 'deg/day ' TFORM18 = '1E ' TTYPE18 = 'rowvErr ' TUNIT18 = 'deg/day ' TFORM19 = '1E ' TTYPE19 = 'colv ' TUNIT19 = 'deg/day ' TFORM20 = '1E ' TTYPE20 = 'colvErr ' TUNIT20 = 'deg/day ' TFORM21 = '5E ' TTYPE21 = 'rowc ' TUNIT21 = 'pixels ' TFORM22 = '5E ' TTYPE22 = 'rowcErr ' TUNIT22 = 'pixels ' TFORM23 = '5E ' TTYPE23 = 'colc ' TUNIT23 = 'pixels ' TFORM24 = '5E ' TTYPE24 = 'colcErr ' TUNIT24 = 'pixels ' TFORM25 = '5E ' TTYPE25 = 'sky ' TUNIT25 = 'maggies/square-arcsec' TFORM26 = '5E ' TTYPE26 = 'skyErr ' TUNIT26 = 'maggies/square-arcsec' TFORM27 = '5E ' TTYPE27 = 'psfCounts' TUNIT27 = 'luptitudes' TFORM28 = '5E ' TTYPE28 = 'psfCountsErr' TUNIT28 = 'luptitudes' TFORM29 = '5E ' TTYPE29 = 'fiberCounts' TUNIT29 = 'luptitudes' TFORM30 = '5E ' TTYPE30 = 'fiberCountsErr' TUNIT30 = 'luptitudes' TFORM31 = '5E ' TTYPE31 = 'petroCounts' TUNIT31 = 'luptitudes' TFORM32 = '5E ' TTYPE32 = 'petroCountsErr' TUNIT32 = 'luptitudes' TFORM33 = '5E ' TTYPE33 = 'petroRad' TUNIT33 = 'arcsecs ' TFORM34 = '5E ' TTYPE34 = 'petroRadErr' TUNIT34 = 'arcsecs ' TFORM35 = '5E ' TTYPE35 = 'petroR50' TUNIT35 = 'arcsecs ' TFORM36 = '5E ' TTYPE36 = 'petroR50Err' TUNIT36 = 'arcsecs ' TFORM37 = '5E ' TTYPE37 = 'petroR90' TUNIT37 = 'arcsecs ' TFORM38 = '5E ' TTYPE38 = 'petroR90Err' TUNIT38 = 'arcsecs ' TFORM39 = '5E ' TTYPE39 = 'Q ' TFORM40 = '5E ' TTYPE40 = 'QErr ' TFORM41 = '5E ' TTYPE41 = 'U ' TFORM42 = '5E ' TTYPE42 = 'UErr ' TFORM43 = '5E ' TTYPE43 = 'M_e1 ' TFORM44 = '5E ' TTYPE44 = 'M_e2 ' TFORM45 = '5E ' TTYPE45 = 'M_e1e1Err' TFORM46 = '5E ' TTYPE46 = 'M_e1e2Err' TFORM47 = '5E ' TTYPE47 = 'M_e2e2Err' TFORM48 = '5E ' TTYPE48 = 'M_rr_cc ' TFORM49 = '5E ' TTYPE49 = 'M_rr_ccErr' TFORM50 = '5E ' TTYPE50 = 'M_cr4 ' TFORM51 = '5E ' TTYPE51 = 'M_e1_psf' TFORM52 = '5E ' TTYPE52 = 'M_e2_psf' TFORM53 = '5E ' TTYPE53 = 'M_rr_cc_psf' TFORM54 = '5E ' TTYPE54 = 'M_cr4_psf' TFORM55 = '5E ' TTYPE55 = 'iso_rowc' TUNIT55 = 'pixels ' TFORM56 = '5E ' TTYPE56 = 'iso_rowcErr' TUNIT56 = 'pixels ' TFORM57 = '5E ' TTYPE57 = 'iso_rowcGrad' TUNIT57 = 'pixels/(1 mag/arcsec^2 SB change) at object center' TFORM58 = '5E ' TTYPE58 = 'iso_colc' TUNIT58 = 'pixels ' TFORM59 = '5E ' TTYPE59 = 'iso_colcErr' TUNIT59 = 'pixels ' TFORM60 = '5E ' TTYPE60 = 'iso_colcGrad' TUNIT60 = 'pixels/(1 mag/arcsec^2 SB change) at object center' TFORM61 = '5E ' TTYPE61 = 'iso_a ' TUNIT61 = 'arcsecs ' TFORM62 = '5E ' TTYPE62 = 'iso_aErr' TUNIT62 = 'arcsecs ' TFORM63 = '5E ' TTYPE63 = 'iso_aGrad' TUNIT63 = 'arcsecs/(1 mag/arcsec^2 SB change) at object center' TFORM64 = '5E ' TTYPE64 = 'iso_b ' TUNIT64 = 'arcsecs ' TFORM65 = '5E ' TTYPE65 = 'iso_bErr' TUNIT65 = 'arcsecs ' TFORM66 = '5E ' TTYPE66 = 'iso_bGrad' TUNIT66 = 'arcsecs/(1 mag/arcsec^2 SB change) at object center' TFORM67 = '5E ' TTYPE67 = 'iso_phi ' TUNIT67 = 'degrees ' TFORM68 = '5E ' TTYPE68 = 'iso_phiErr' TUNIT68 = 'degrees ' TFORM69 = '5E ' TTYPE69 = 'iso_phiGrad' TUNIT69 = 'degrees/(1 mag/arcsec^2 SB change) at object center' TFORM70 = '5E ' TTYPE70 = 'r_deV ' TUNIT70 = 'arcsecs ' TFORM71 = '5E ' TTYPE71 = 'r_deVErr' TUNIT71 = 'arcsecs ' TFORM72 = '5E ' TTYPE72 = 'ab_deV ' TFORM73 = '5E ' TTYPE73 = 'ab_deVErr' TFORM74 = '5E ' TTYPE74 = 'phi_deV ' TUNIT74 = 'degrees ' TFORM75 = '5E ' TTYPE75 = 'phi_deVErr' TUNIT75 = 'degrees ' TFORM76 = '5E ' TTYPE76 = 'counts_deV' TUNIT76 = 'luptitudes' TFORM77 = '5E ' TTYPE77 = 'counts_deVErr' TUNIT77 = 'luptitudes' TFORM78 = '5E ' TTYPE78 = 'r_exp ' TUNIT78 = 'arcsecs ' TFORM79 = '5E ' TTYPE79 = 'r_expErr' TUNIT79 = 'arcsecs ' TFORM80 = '5E ' TTYPE80 = 'ab_exp ' TFORM81 = '5E ' TTYPE81 = 'ab_expErr' TFORM82 = '5E ' TTYPE82 = 'phi_exp ' TUNIT82 = 'degrees ' TFORM83 = '5E ' TTYPE83 = 'phi_expErr' TUNIT83 = 'degrees ' TFORM84 = '5E ' TTYPE84 = 'counts_exp' TUNIT84 = 'luptitudes' TFORM85 = '5E ' TTYPE85 = 'counts_expErr' TUNIT85 = 'luptitudes' TFORM86 = '5E ' TTYPE86 = 'counts_model' TUNIT86 = 'luptitudes' TFORM87 = '5E ' TTYPE87 = 'counts_modelErr' TUNIT87 = 'luptitudes' TFORM88 = '5E ' TTYPE88 = 'texture ' TFORM89 = '5E ' TTYPE89 = 'star_L ' TFORM90 = '5E ' TTYPE90 = 'star_lnL' TFORM91 = '5E ' TTYPE91 = 'exp_L ' TFORM92 = '5E ' TTYPE92 = 'exp_lnL ' TFORM93 = '5E ' TTYPE93 = 'deV_L ' TFORM94 = '5E ' TTYPE94 = 'deV_lnL ' TFORM95 = '5E ' TTYPE95 = 'fracPSF ' TFORM96 = '5J ' TTYPE96 = 'flags ' TFORM97 = '5J ' TTYPE97 = 'flags2 ' TFORM98 = '5J ' TTYPE98 = 'type ' TFORM99 = '5E ' TTYPE99 = 'prob_psf' TFORM100= '5J ' TTYPE100= 'nprof ' TFORM101= '75E ' TDIM101 = '(15,5) ' TTYPE101= 'profMean' TUNIT101= 'maggies/square-arcsec' TFORM102= '75E ' TDIM102 = '(15,5) ' TTYPE102= 'profErr ' TUNIT102= 'maggies/square-arcsec' TFORM103= '1J ' TTYPE103= 'status ' TFORM104= '1D ' TTYPE104= 'ra ' TUNIT104= 'degrees ' TFORM105= '1D ' TTYPE105= 'dec ' TUNIT105= 'degrees ' TFORM106= '1D ' TTYPE106= 'lambda ' TUNIT106= 'degrees ' TFORM107= '1D ' TTYPE107= 'eta ' TUNIT107= 'degrees ' TFORM108= '1D ' TTYPE108= 'l ' TUNIT108= 'degrees ' TFORM109= '1D ' TTYPE109= 'b ' TUNIT109= 'degrees ' TFORM110= '5E ' TTYPE110= 'offsetRa' TUNIT110= 'arcsecs ' TFORM111= '5E ' TTYPE111= 'offsetDec' TUNIT111= 'arcsecs ' TFORM112= '1J ' TTYPE112= 'primTarget' TFORM113= '1J ' TTYPE113= 'secTarget' TFORM114= '5E ' TTYPE114= 'reddening' TUNIT114= 'luptitudes' TFORM115= '1J ' TTYPE115= 'propermotionmatch' TFORM116= '1E ' TTYPE116= 'propermotiondelta' TUNIT116= 'arcsec ' TFORM117= '1E ' TTYPE117= 'propermotion' TUNIT117= 'arcsec/century' TFORM118= '1E ' TTYPE118= 'propermotionangle' TUNIT118= 'degrees, + N thru E' TFORM119= '1E ' TTYPE119= 'usnoBlue' TUNIT119= 'mag ' TFORM120= '1E ' TTYPE120= 'usnoRed ' TUNIT120= 'mag ' TFORM121= '1J ' TTYPE121= 'firstMatch' TFORM122= '1J ' TTYPE122= 'firstId ' TFORM123= '1D ' TTYPE123= 'firstLambda' TUNIT123= 'degrees ' TFORM124= '1D ' TTYPE124= 'firstEta' TUNIT124= 'degrees ' TFORM125= '1E ' TTYPE125= 'firstDelta' TUNIT125= 'arcsec ' TFORM126= '1E ' TTYPE126= 'firstPeak' TUNIT126= 'mJy ' TFORM127= '1E ' TTYPE127= 'firstInt' TUNIT127= 'mJy ' TFORM128= '1E ' TTYPE128= 'firstRms' TUNIT128= 'mJy ' TFORM129= '1E ' TTYPE129= 'firstMajor' TUNIT129= 'arcsec ' TFORM130= '1E ' TTYPE130= 'firstMinor' TUNIT130= 'arcsec ' TFORM131= '1E ' TTYPE131= 'firstPa ' TUNIT131= 'degrees ' TFORM132= '1J ' TTYPE132= 'rosatMatch' TFORM133= '1E ' TTYPE133= 'rosatDelta' TUNIT133= 'arcsec ' TFORM134= '1E ' TTYPE134= 'rosatPosErr' TUNIT134= 'arcsec ' TFORM135= '1E ' TTYPE135= 'rosatCps' TUNIT135= 'counts/sec' TFORM136= '1E ' TTYPE136= 'rosatCpsErr' TUNIT136= 'counts/sec' TFORM137= '1E ' TTYPE137= 'rosatHr1' TFORM138= '1E ' TTYPE138= 'rosatHr1Err' TFORM139= '1E ' TTYPE139= 'rosatHr2' TFORM140= '1E ' TTYPE140= 'rosatHr2Err' TFORM141= '1E ' TTYPE141= 'rosatExt' TUNIT141= 'arcsecs ' TFORM142= '1E ' TTYPE142= 'rosatExtLike' TFORM143= '1E ' TTYPE143= 'rosatDetectLike' TFORM144= '1E ' TTYPE144= 'rosatExposure' TUNIT144= 'seconds ' TFORM145= '1J ' TTYPE145= 'priority' TSCAL145= 1.00000000000000E+00 TZERO145= 2.14748364800000E+09 TFORM146= '50J ' TDIM146 = '(5,10) ' TTYPE146= 'matchid ' HISTORY CFITSIO used the following filtering expression to create this table: HISTORY tsObj-002830-6-0-0398.fit[#row <= 50] END )?ND\r>XDDٽ>XW?ŬN?6@K@A)?T/?P ??5DwDD7DD! zzzzz.{?(? =?LABIwwBDDB33Czzzzz?өABkTAB[AAffB&ffBC "zzzzzCA ıALFAg AC iC"SCBMzzzzzBF¥_>J@h@A\y'>?B;vz>Jē@BmXBmwT4Oa2xU1 0Pa//W/^/1/[0101i1[F0 `0/ /.l-E),o,9,0,Z- - ρ-M.L0J:1G1s1^A/G.2?-*-[,d,ں-4I-g.j.d/01}N1o1v0/-^-,-+-O.//G0&O 01161gP0M/4.$`-Z ',-o...8.M/0qi2m2\2Ń51B0c/S.K=C-(N-6-~.J.W005/M00f@foP͑@J-H N"B@5G@aDn#V@Nؑ^Cva=rC]yCޏB t<"B eBZp>E==v=y=1 = )? :D\l>D5>D11qy2r+@++QE,,XAs$.AjhAN(AWAL`<K:R9X:=C<_MAy@AyAG2A\ART];i;#{9t:|u:ArAkANAkAW?DALH;[f:~9}::w;C4C.@>@>${@>zzzzz?e͸?7?6?D?%@ @C@I@j(?J:Xxzzz9N@a6pzzz8v:Wzzz9R@MAZAR1%A@;=;f{zzz:$OI@.?k-Q?g?w@^jfAn gZl=ά?5DwDD7DD! zzzzz.{?(? =?LABIwwBDDB33Czzzzz?өABkTAB[AAffB&ffBC "zzzzzCA ıALFAg AC C"C >BJzzzzzBF¥_=RK?9??D=/<<<?8B% C!vB$qBBҌazzzzzArBAwAlAkAhqAL;b<,<.z<.(;vz>/o? 2???W>??=+=/}/}/#@"@ 0@ @@??  4M4P3 3j10bk/-Ԭz,r- ,-8y-S*3h3_3G3V>21?730.L-p,E-.~.$.Z%/8 4E4-T3i2 10&g/a.+.T.).'.!/01d7H33.3[2o,1P0/ڥ.˲.h._5.8.o/O#0aO6`m6->5q>T4Osq2Ř10+/)WQC d.J.?1[F0 `0s//. B-L*,q,,0,0-]w,~l0Iڶ1G1s1^A/.-_-8,B,- ;g-,-boW./c>0n1}N1o1v0/-^-A,@--d-D-,F./20Q1161gP0M:w/4.%L-Z,ć-Z-ߺ:-v-;.4021}2m2\2Ń51|0/m.Tą-ɶ-{y9-~--. ;@foP@Jͭu N) @5ͫ)@aq@N`mCN>yHC$TC=B >+@BЍY>E==j=y=1 0 )?D\l>D5>Dq6122r+@++QE/5,XAs AAx^A}2ALXu<;?oj @T?ഌ_FAc33AAAٙA""zzzzz?+V?l/#?&?>bAC$IAε@C#Ezzzzz?>[q?0?&U?Nx=RK??6?wb=<< /o?Z?5?vWb8Q]]e:??1j?`bN?X ?- 0?? 4o4P3l3j1J0a}/-33O(3n3[3$2 1>.0H..p4S4Aa4-A3™2ɢ1B0b/u~,423zd33)2f1AU0|/0-RS6Ծ6.5q34M+2S71e-0- z1Zn0{y0"/L/ ]. -9,o,0GP1J1@1V'Y/.xU-S->"+0111A+0g/d-Ԭ-F,E-0M1C1}1f0M /.|. OC- ,8,I2m[2$2<10_o/w.s,(-&s@foPǕ@JOJ N)q[@5ސ@au@N^l^=wdK7=D=[> >$>E==j=y=1 0>s`?QBqA^\AJ=q )?CNa>,D>D(QWO>(m?@eB`:@#?=9=>>sasJ8="6="/@@>a="1{;^҉ѷ=lVֽ]d<%zx;MH<$wA=ȯ<;u1`;=I|:89j/#9Sz96t{ez8ir[:8 9j 9$wz9k@MuA2"_AAJ@.[0;;#%;"z:@?=??o@OfAn gZl=ά?Q<uD8DFD<DGzzz<z# # Q<<# ABffC ;<Azzz<z?2o@oCBZa<=/AdAA<Affzzz<z??_@5)A)BB#<Cbzzz<z AIK1A<?t?RTa??cS ?? 4`4}L4 ^30m10rD/6Y,ǵ-ޭ4m-ȭ]ʁ4[s4u04dSP32^^g10 /c.rMP5644?4[ 3/2w$12U0j/ /.ɧ,/^U-)<4s44j321$0'/U.OW-_.- 6(\5 423&21S0;o/u 1"7>1on0>0*0/Z. O-;+D,(.,@,:,,0/1ݩ2H$1/H.l-[-X&-,η,9 - ,1w110/.-ɭ-N-}E-UB-\-n-11y1)[0E/.\- ^--8-/-k-{-Q232/I2M1)A/fw..P.9.- -w-!]--&s@flْ@JYg u(@5cs@aݢ@N_C=p+=x' 6>=݇>4<>7>W=セ=|=z>e=1m ?Bņ?VAEAk\)AX( ) C>*D>D&?5 ;aݹM;aCXCݺCؿCICܸd=\';;zd};|-*;JDDDDFD=`;;a;m;01NhA1-2B)e2 .1l1j$0>.FA`A}Aqdu>nZ? @>^r">K??A)oBcB7Bc+BFը>tBI0BkAAPA A/A8AJLA,AA4ARS@Ѧ@BaBBgBsB3A_zzzz"MӼ҉M5,v+k< <o;9X::k<+;)_;D;ѷ;D< '<o;9X:҉:k0Dfzh}v>>"C>2r>6b>9;;99j[9n:w:N8/\8>+8MI885;899W9l^9r=%:wCnCNLCHzzzzz8CAAWqA92@'BE+BB{BʺBlzzzzzzNtB {&f6A?IAۮAxAAAy>ц=?=Pq=AD=A?FB? ??+??$o ;*d;K)_BU"B$~B5NB:B>wzzzzzAgAFPA9A2[A* ;Җ:Ԣ:~::ٖo@%AMAS5A9HA6A=@="/ BpB/YB;lB@BLzzzzzApoAIRJA;QA4A0u!;:Mt:%::,AimAHA9A2EiA,y:;/:ki:~::ڗ@Q@Q@Q@Q@QƙH6Z^4eeĦV {ULJN5wć &cbL?<[?2!?<M?F?V @@@@@2~2_^j2D2 /1M.1M00{$/-e.2v*|-Dja.]cr44Q3!3v3p33 322GH1Ӱ1V'Y0;//tQ/{A,CX4R;44Z4 S33=Ku2 2jB11D0Q10 f/u^-Uh54n4^ 4Tq33 j3&uP2~23s1Ǝ170kB /D_,"~5Fe5"34%C4?4#A33_2C2it1m1.%0ؖ/٦@H0e`@.V..,.2".E-k--d,K,p-#O-,91'X/f//q/kiV/L`/Ed._X..{#.5.Km-09-Dq10kX0os0nL0/~0/v/-S/[/#3.{--Pb190E0J"00_#0El0E/8/x&/J٪/~/". K-L<1o1"16 100Ȭ0cm0/h/8//X@.M$.+&s@flŶ'p@J +zե@5煴@a@N(V< ;)q<ەj;}B>b=0==y"=1- )?  CA;DcD˛;1?5 ;aݻa;aCCCKCACE CI=R";;Dc;^A;ӺDDD˛DRD=OF;;1;/b;[n0D1tj122 +K,d/4/5,PAAVA AyAv/~<< =@"6=*y< <9=<> :z:7߀:W;K:l83d78oR9<⟑::8:]H;zU@@t<@>@LS@2S>,3;; Mx;9;i@Z@30@@T0@ܻfAn gZl=ά8Q<# DD@D˔DDڳDzzzzzQ# <# AAwwABADDzzzzz?>?Z>8@""A2AkAAk33zzzzz?\??-\? ? BյC%B3eBnQCzzzzz;m?/K;57?>J=7=, )_>4>@=qB)EBKhBBoBiuzzzzzAAsA~ȖAyxAv<=;";ن;n;>XI&>'=533@bB(:BBBǶBdVzzzzzAAuA~ȖAyxAv<,;";ن;n;AAz A~ȖAytAv}Q<;";ن;n;8>c@Q@Q@Q@Q=S.Zq=Oč #ğB8=:sqEwMĈĠ.aG&=D {Bć#Ġ'Gw??? ????? 2:1'1_Z0_/mt.=. L3c3g@261|0+E/9/Ltg44PW3V2Fl0l/݈/FI,޳U4c4Drq3&2S)1/v0II/8.+4ӕ4xC321Lx09. 0..Z..V-#-,,۱,Z0A/Y/ZR.=-'-boW-),ܓ0w0 0e/Qd .): --P-:00ڍ0,/].4.i-. &-1;1;a-1 $/.| .{-~-&s@fkX(@JS ![@5ϥ@aZ 1@N!A= ;;=Fb;H==< >==S=z=1q>@ CREAAn\ )?  DQ*?;9DԚn;9M;aݻ;aDQDSEDQ*?DQDS->wPt><<;x<A!kA7AvA(A>t<=@J$t<(U<-;e`B;dþ=*͟<o=(=k>Q<(U<-;e`B;6ھ'.`bUJx<=G=̴><3;;A;O|՞{f8sc9c:tG><3;G!;D;J@ia@q@+@A#@8m?=)V<5<Q<@@@PT@b@һfAn gZl=ά6>C?>F<@33@AAff<zzzz<>R׭>>0><-<B(BU-BѐBq'<zzzz<@q%X5@]B;@dp)<=ZB;r;J< ? 6?,q ?`ѷ@ѵt@ѵt@@@TBAGB~B:BNCB@zzzzzAAA3#AA'>)<=ZB;r;J<AAA3#AA'>a<=ZB;r;J< 2;4?m\@Q@Q>?p>.$D6Qɢ?Ji꽅RRJYms?]n=W"a3`?}P-!Q'?]n=W"ZCG3>P?u!p"鯿??@@?????0^0{y/V-+B2 |111+ 0k.J,x)ii33#22f)0Ό/⺪73f3X92v105S.-˭t+c/4\321A0/Djt/`-..-'C,tu/b.߰-"-^v-0)i,8+07.|.-ݪ,z+)04/_/'d.-Wu,E,^T+VA15i0 0N{f/z.Ô. ;-&s@fof:'@JE XU$!@5^ @a:@N*ٽ='=!!=>Ƚ5ػ4=!z-D=9==y=0>-?|CA\)Ab=q )?  CD<[G?DIju=t9 ?7n?Jo>>e>Wz=^һTʼ`m]֡b=$?6=Xf=Y=P>B@Co@@@ @fAn gZl=ά(>>Ā>>6w@@ff@@DD@UUzzzzz>>wU>B>Rq>UCŤB>kCBVBWVzzzzzRrĿHMFv=6P`?r?\I?F_?Z@ѵt>M@ѵt:҉@ѵtA?gBHBjB$BzzzzzAAAüAtAA5t=7-kn=X?=5?r?s9?MIR?@@ѵt>:*@ѵt@ѵt@ѵtA@]BǀBjB$BzzzzzAAAüAtAA5t=`L+k>>+P2\l>J?N/ߜ4U]? m?t۶s? m?t忀s?@????? 1kT1&0p0/.Wê[&4(m\2#=1$ 1X05.x,`PC(έ/ܔ2=2/l1dD0@µ.#驁"E(?;(?;v52?2(T1{Ō01N.G%,Ȯ(y+g622GnY104>-$0),),0o.6.j-XN,۱+e\(m(m,4E0C5..jQ. X-3 +)ii((,0v].0./- $+)H(?;(?;,W0c.a.9-*%+pX`)@(y+(y+,#1&'..˚-L>,s),),),-4o&s@fm&%M@J6 ˽` mZ@5G @ax&i@NO?P=~Q{<W===yт=1 ) ? `CՀ=Dÿ= ;YG;5 CքpC|!CՀCCٶ~?w=k==6>D#DDÿDBD$L? F===> 1*02[22ޚ3?/0^]T0]11[ AAAbAA?u>n>y>et@AKAOAASA|=xj<<Ƒ?e͸>"/?z?l,z?n?"/?sd?Zw<z>/?Dz<?kn???<zzzz<=aG; <%zx<5<>>=<6>><$Z>=Vm>>ż<_`<<=2<? =|>3>6a<=;,Ns:<?=;>3n>6x!<@GW@\ @Y'@/+<?:>P?Q>7'<@??l@%<fAn gZl=ά > > <?@B""@@@H<zzzz<=n=c> > <AtB^^&ABc<zzzz<#}6@]f@v*<=Pq=XW@='>"5@Ae=~?$> >=y@ѵt@ѵt@Z0U@ѵtBABִ1AA|CԩzzzzzAAAA@Ax?=[==>?>J =L$?DJ=>AE>RT? L>̥z>=;^҉@ѵt?_p@ѵtB"Bִ1A1ACzzzzzAAAiA@Ax?=[==>?AAGAiA{Ax>,(=,==|?g:74= =5? ?F8?WN˜Iy!l\G?7ԩy?~<ڸ< I€)JF?y7ԩy?~<ڸ=.I€l)JF????@@@ ???? 0//T-+K(m(m(m(m(m0A0=/(. +{(((((έLn0$W0D/;l.mtH(?;(?;(?;(?;(?;k1*0 Z0.u(y+*$J(y+(y+(y+7),),),),),),),),),),0"-}.,k+v(m(m(m(m(m,k0gǨ,?- ,71w*(((((,l0,XD?,'+ݝ*qJ(?;(?;(?;(?;(?;-41[-Ji,I,) E*(y+(y+(y+(y+(y+-$1oW),),),),),),),),),-zG&s@fl #@JM7 s@520 .@aק@N߾9G>ھ]Lq>x>m=A==y=19 )   CV`5D"D$DDD*=e0C1Z&1S2<2 +K/_O00Q-%|AdAajA̟A"=A@<#"1{??X??9s?/ƴ?J>sPq?D>)i!=/ =>6?@ :?o??d]@ "EfAn gZl=ά=>>{l>sa>:@؈@@DD@l@wwzzzzz>_ o>q>N,>*^ >UBBB0BgC%BzzzzzҜ@@*??/o>7>,>@~>J="/="5=AD?3?re?"-?7??S >=Vm= >'>AT>EB0|B)BBT=BzzzzzAy|ASAVA,Ař<ȒD<:l<{u==+b?Gco>G>>sa?s=@[?h?..?:1?r?T>& =>>2a>B=BBBDB$>a?Z>k=K|>F¡^Og†Sd?>??M:?z/]iLGsDeX3?+}3>P;:?jS(h~1읽_?{>غ @@@@@? 1!011sV07X0>,X*-1_1l1c(0"/J- *ۜ_111DΚ0/J.S x(?;1K11i/.|*$J*$Je%11܏:1D1*3!0=;S \A\,d+o0.Skc.:. B-y+3(m+0.X.o.-ݚ,p,x(*0.6.0-,(L#)H(?;+r30?S.sʴ.1e7-:מ-k^)@(y++pX`0.3/sW/?2.~$+E),+E, v, v-6&s@fm$@J>$5 8Y@4rZ@aﳏ:Q@NϽ<E2D[@=zHW>"=ҹ==y|=0?'B?mB|AAA )   D< (DD<֝; M;^X ;^XD AD DDOD;=œ0<[< (=:U>:DD͌,DDD̓D͏,=͕0K1F'127 2k+/@/n/}q- AAiAf4AA߈=3=< =%tB=W]APBABAWA A\=O;<>"6->>J >l>)<}V.{˺IR<ě<<6z== O߻`B<<߫=.t=;T:XHᄻ*;Y=3+m;=(=T>?T@\\@6@y?@ػfAn gZl=άa`>R>g&>oSv>N@ff@s33@@{Azzzzz>=G>:y>>I>RB.B}BhBmBzzzzz?? A:MoeAE#? =/>)=AD? >%="/=,="AD>A?H?'?*͟?r?]>*?uL>f>C->q BvB. BŪBʠ.B`zzzzzA;A:uAbAA>V='>XG>6c?c>"6="/=,=6c>"1{??w?3?W?Q[W>?1'>x?A>.B8BIBǪB4BzzzzzAA4PAbAA:=j7<[=<=e=CјA\A gAbAA= +*<|&<@<=K^=>}V=!==c66MֽJ[ ??]n??f^?,)J/˾? @@@??? 1 1i1o0i/;[-cr*-(m*141i1xV/i~-i+B(Ϋv2 g-1'1/."E(?;(?;ͬ1o1ۓ0\/V-l*$Jp(y++>+A:2W1 1|E1Q0Ԫ$0ɐ),0 l.l.{.1-y,_(m(m*-/=-[.M-Zg,+:((*SC0.c.:-_,P*KS(?;(?;)/0..1e7-(,) E*(y+(y+*:+2,)0.d/Ty/4@.w9,+),),+E&s@fm2t@J|nbw @5Vnx@aOy d@Nz><_<Ӭ;=M<37X>X=" =]=y =1! )  CL%?Do?<<<<CnCΜCL%CC9=>?0?>r?DDwDoDD >Uk>_?>3^?01U1{2:sN21001,ɕ-N-RVA A%AjA A>@T?C.?T:C?'AxA OAA;@A>i><<y<^AH7AY,AjTAAE>E"?)@yܒ@@UB|BsX@>@>${@>zzzzz@vo@> @z@z@z?-zzzz@@@@h@zzzzz q<<<<>2a|? <<</;r{<<<>2{?<<<Է<<<<a<<<<z<<<<z<<<<z<<<<AV<<<<z<<<<?- <<<<fAn gZl=ά<<<<D.<<<<z<<<<>k<<<<C®<<<<z<<<<<<<<A[<<<<z<<<<AL <<<<A<<<<z<<<<A7<<<AhJ@@A7@C??%@BBAW?e=?W?j=Z?]d>]>J@ѵt>֮}@ѵtA B(@ kC0? zzzzzAyAHAŚA3Aa=/8=|_@W?J@HnBmZ@@@l@ٿ@Ю>7>5??W?+>q ? <=BAŚAA=9W=@W@a[~@6l@Q@Q@Q@Fm?M{U>0÷$~j2(Pùkh1'X60ù\'W>6+k>/???  44 @@0 @ /b//G/^/P-DK2U//hA/8Hq// #y/.8.h.c.t-6+EH:a(?;(?;(?;(?;(?;(?;(?;(?;(?;)ڭb (y+(y+(y+(y+(y+(y+(y+(y+(y+(y+),),),),),),),),),-.e0J.Q. p.5:-qo-J--9--"[d-,K+K1,,V ,,qO,%,<^,,P,T:,¼-k,,E/c(?;(?;(?;(?;(?;(?;(?;(?;)- /8(y+(y+(y+(y+(y+(y+(y+(y+(y+-0),),),),),),),),,(.( &s@fl5R@J: '͔X0@5DH@aH-wWk@N;zf=} >cB=Z=>U={> g>W= =f=yҗ=1 ) ? C˷=>pDˡ=^ă<<<<CsCC˷CRC>gb> =>p>3T>=DDDˡDD>>؃=^ă> > 0o1\[J1V2T2+K/^:07 /0'AACA_A A_?)?U=??j/AOAA AA:?=i=\I=@=AAAA5A_\R@@ @>J@>?ԃ@>${?Czz>"5z?6w<<?F<><<=G<z<<?GM<? C<<z<zFt<=<> 5@Q<=<@QпA<<@<; @Q<= <@Q<<>y8<>{<<={<?ƒ<<;b)$<@tơ<<Mf+<P<<;{7<@HgE<<?\<@<<;A<AB<<@*<?ԻfAn gZl=άN,<=i<<@UUU<?333<<z<z<<> 5<=J8<<BZ <A}<<z<z<<@<P=>#f>R<=4n>@ѵt>HB B@qC'B I*zzzzzAɒA6AAAO@ 8?MF=6?Ò?>)An>=9>)Av<=T,==A>ݘ=L>IR@ѵt= BXB6@?BlCB*rzzzzzAɒA6AϞA¾A@ +?MF=6EAq?#AڐACAϞAAǾ?8?Qz=6E?k?0o;o>v`ѷQ?]cU@5h@as@N ܤP<<x<,_U=_=7=z=1Q )  Cc <+3D= z Ж;MP;^XCFCJCc CV C=߬=#<+3=aX4>oUDXDODDUD{><= z =S1>gC0 1PQ31Z20m2 +/m00 n@,PADA]EAAEA==U=$1=c={A1AJAAImA?= <Я<==]AALA7"A A%==RM=">T9=X@mhJ?셣? ?(@T>-=X?=XG@~?6w?ē?i$?J ?6l?="6="/=XG=6c=)<@/o?Y?хD?@3=RK>e> z>)<<'IR49XS<1<1<=@=P=s=;PH==U<<<=@=_8+|]|6>>\C=B=j>h3l= <!<=IՈ=}Z; :cl:\;b8;O=`I<W@%@$@e&@B@z?ƻfAn gZl=άJē>> j>>BA DD@@ff@Azzzzz>{n>>>_>FBNUaBGiBpB[C(zzzzz.?b?Y ٠@(%?>5>=L$@>RK=X?>6c?i' ?K??u?}?o{?!.=֡=> M?*^5> B<@B-MBwBB3azzzzzA%AxAjYA[A.<ׅz>s?8>/oe?$g8?U2?r?v+?;==$? ? >pB@vB*BB9QB5SzzzzzAGAAAgA] <X>7=:k={J?QPA¢'oJ8߇?U:/2??>4ן4CP{%LWBݧ:3:>1?~<79!ɼ.FE6n??=?@@@@@?  1u!1_U100>/6(m(m;11^1| 0V/ 7u, _((+!)G)0)1141(D0D+.Y1@1f0./k.Щ(y+(y++/]+%N[1Zo11L1"0©X/),),+),0b.KA.z.I.-v(m(m*oE/ڟ .e.L-N-z+w((*)+0(x-'.): -1,)0/q-I.ș->q,;~)#(y+(y++2*,80+.z./@..h,d),),, v*٠&s@fk.L)@Jp 45rǭ@4>k@a=1A%@NE_>>F:>-=9;3F=>z=SL==z 9=1H )\CQ?GD?pA=tp>4W=x`C]C CCC?2 ?1D?%;?&?=DyDyD=eD[6D???8??5h0߅1'2-j23//x4i//'0MAACAVqAA8?<??1R?&i?(_A $A>A-Ab'AH}>&<ƹJ@>@>?l,=XAzzz?@=XA?}u<?N$&?s?1{z<?Tbzz?u%<?P=?T?z<zzzV<=,<ȴ9> ?T<?>Η@Qн-<+Τ@Q?;^<=/ <ɰ/ z<>}???[?$<A W!@2Z?ipz<@Q@ ?8?֭<??p?Y:fAn gZl=άVt=<<<??33<<<zz<<<> =$f<<<C @<<<zz<<<nAe<>ē="/?N$&>l?A/8AAB=L=L? ?(7>N<@ѵt@ѵt@ѵt@ѵtB BC |C/BgzzzzzA sA6AoAuA@HAQk@@@^Į@?%="/?Ga>,?[A+A@aAp=L=L?@`?N>8@ѵt@ѵt@ѵt@ѵtBJBC %C/@BgYzzzzzAXA6A;AA0*@JSAQk@C@H@@+A>i?ӺQQQko??????????????????    ./y.7..6+-*oE(m(m[(((((((((Ϋv/F/Giw..{,(?;"E(?;(?;70/.B+|ʝ(y+(y+(y+(y+p-Y(.:/ '/],(),*٠),),ɐ/ -#O-[-y,"&+D(m(m(m*U/f((((((((*6_/q9,U,-{,P(?;(?;(?;(?;*qJ0,/E1,/E1*(y+(y+(y+(y+(y+*V31-0-r.!,,U ),),),),*٠&s@flr7@J)o ?8@4ǣd@aX#@N0{O==*=yĖ=1 )?`C?]DE?-> ?]>ז>DȁDȕDEDȐDȝ?>?->K>z01R2/I23 .%/n/M,/0AAA^A AH>>C?@?`2>SA+AA\AA͏>fF<ֵ@<_<=-=AIRAkA AA=?2?Q{@=8@wZ?'@>J?@>@>${?z>Jzz>K??,R>G??%?}&>zzz@?XW?Czzzzz>+;T9IR;o>>0U@Q@<?K^FUfϽ.21>>@Q@@??>&$=>:YB3/4f+ZMQ =Zy>$>,?頭?>=A<<\80c = >^U>*3?O?!>A@|m?μ@4@-@x?+k@<@?g9??!}?n:?u?XfAn gZl=άE>>X> =¡?ꪫ@&ff?L?DD@7wwzzzzz=o> >*Q>=CCABfC JC"Czzzzz>>F>Ϩ@g?>"/"/@_@Av>A=L=s>]c=K?xl@ѵt@F҉@ѵt9QCNuCB2C+B&fzzzzzACAAA+Ad>K=x?AV?:>>4"?b>eJAQVAn />Or>?9@ѵt@ѵt@ѵtCwjC XB'C}BYzzzzzA9AAA1SAf>qa=I?A)>^`AlA AA2Ab>=v?A)>c:ѷ>'?F=e< >μ;s_30fp=q) :j}Ub{My8]=p[) :j}l\by8Z??@@???? /r//U`.=P.A?,E[(m(m(mg"0K%0 #/ r.?*6_()ii(((έM/#ۼ.!-G*% ɨ_(?;(?;(?;(?;(?;E/]&/5.,+:e(y+(y+(y+(y+n1<0N0a..vϫ\A\),ɐ),),),^/ -g.>--0G,e(m(m(m(m,E/W,G:,U+*6_(((((-u7/$+ݝ, &)*KS(?;(?;(?;(?;(?;(?;-Na0nl,/E1,Q *(y+(y+(y+(y+(y+(y+-V0.!,.-,"),),),),),),-G&s@flh4@JؿX{ KRS@57<@ag@NZ:f:oS7;{R>B=>>rV=G==y=1?! )? `C>3Dȡ>7:; M<<<^XCXC+CCdCM>=>3>2>ZDDDȡDD:>"=L >7:>Gz>-0Mn12/l23f.og/w/0/(<0AýAuA@A=2=7>^ >9>AaAA+AIA>;9< <<'=TAeUAgA{AlAT>er>o ?+/>’?=@>J?u?)?SM?[z>J>,>eu>w?o?9ָ?P ?)?c>=?>e>=L$>9@ ??P ??Czzzzz< =p;k=nc =R>oO=>=Vm>>>,==Sa<74= ~(=6>=Vm>>W>S=*-;I=c=?1 Zz>>~M>eYz>)zIa#:0<k>~M^>f>AH&@@+s@d0@ȓz?k?*?N@j?s@H@ @_?ܻfAn gZl=ά>'|>"AD>9<@@@$DD@@@B""<zzzz<> >*Q>$f=fK<Am?ܸAAՙ<zzzz< SBG@R@kn>/>XW>KA(>J>sd?{@4&>K?=L==z?/iD?@ѵt@ѵtAGAJsB.L,C'qA=zzzzzA&A-VAWFAAq>=e>r>V ?\x@>e>AD>ʽ@L>"/?@>L$?ף>8?=L>e,>r?> ?@ѵt@ѵtAsAiǹB-C&)AYzzzzzAA)AAWFA!A$>b=>r>V?^YAϾAƀAWFAA>ֶ=D>r>$>mXG;r{:IR: l|?:U"? [??<㧗*#?9 5>#??p2 }VQ᷅?9N>#?? VQ??  @??? /@5/Z/ig.-.A-+L (m(mA0Y039X/ .+,5a?Γ)ii((έz0o0!R/MH.)(?;(?;(?;(?;600}/p.+2e(y+(y+#OU1i0Òa0.Z),),),;/ֱ-.G-9-,SL(m(m(m,M#/",~,Ą,!qU*((((,/),,ad,**qJ(?;(?;(?;(?;,p0!k--C^,b*(y+(y+(y+(y+,B0V-#-(N-,"*٠),),),),,P&s@fm]V@JVrȔ U>@5K|>@aTSJ@Nc>_ nm>D}i>r>6j`>{>j=<=ϻ=yl=16v )? `CL%?D/?: <Mt&<MCCCL%C|C?>s?>?]DdD|eD/DʁDʤ?>?>&?F0 a1}:22'23D+K/C/w/0VAAAjAIA<>T>Q?H>sN?5AwASAEAjA>S2<"<2P?@L@@B@>J?@>? %?Tz>Jz?vB?@?o?"/@z?~?3> ozzzz@J?\E@??bezzzzz:)ǼU<*1>6>U<?I#@Qлo͞<be=>f>b<?I*0@Qо=M4<2L>yO\<5 >z>?i<>x#@ .z;<2-xz>?<>@A:@Y<@/@Xz?#n<?7AeE?i<@<@1l?$fAn gZl=άL<# <# <# DaD|/<Dʄ(Dʤzz<zz>\)<<# @@,<@ww?zz<zz?zk> <=E=1{@(@ <@?wwzz<zz>D>.Y<>>=BCC$^<B*Azz<zzz<oU?RK@>>/ƴ?g+@n?&9@3C1>k>{m>?1&?˒?@ѵt@ѵt@ѵtB\BAdbB0AO:zzzzzAABArA"A8>? Bs@O5AS$?.J=/@>6c?3?~JBe!w@WB1>>;?F???@ѵt@ѵt@ѵtBC/BBXA_ZDzzzzzAAAjA;A?&u? B9B#I@0A_A|AAjAAK>o9&>b @?@'D^X>ܮ>o=DS=9=y=1<_ )? CǏU?.D|?.<<<<CȽ:C˺CǏUCAZCˬ>t??.>>=D͕DȅD|DD>ˠ??.>>01I2,23_w/ //jO/0/A=ACAAAI?Ua?Ή]?-?jp?4AW&AsAASAmW>J@>@>@>${@>zzzzz<@z>Pq? ?)<<zzzz<@?XG?}?6w<zzzz<<2<<<??<<<zz<<<=Pq><<<CVB?<<<zz<<<dPlh<@z>u?LSAI?ԃ@KA\B>>,=>Rn=Q><>;-@ѵt@ѵtB(pBBZB&]A.2zzzzzAdAAJkA2An?h@eJ>{?zK?7?@c?dtT> =X=? @ѵt9Q@ѵtB'pBoBB& A zzzzzAdA6AJkAAm7?h@w>&?xj?p{AdA6AJkAsA}??pq>{?_@?FLi@Q@Q?!=]/?+}0q|ÒBÕLÂK?J/sqnÔC×Ä?J/sq1ÔC×Ä9????? 4  ??? /+.(-y e, c(m(m(mc((((((((((έ//,u.;+ͬ(?;(?;(?;(?;(?;k/1o.. ,P(y+iO(y+(y+(y+--N.\g?.{+ )?),), ),),),a/R,a- ,X,+v(m(m(m(m,{/(((((((((-B/&U+,B+8*(?;(?;(?;(?;(?;(?;-j0 +%,Ȯ+pX`(y+(y+(y+(y+(y+(y+-0~,P-+E),),),),),),.r{&s@fl4@Jǁ4 ﰕ@4MD@aSXE@Nj(^>t*=>=I>_:>\؁>]->U==T=yt=1` ) D،=.Dɪ= M;g;"+DND VD،DD>==.=> sDװDDɪD{Dp>P+="= ==0p01FdZ1 2E2k+0k1921,=AAXAA9A =˒>Elj>?h=Y$AAAAaA@=1l>;>?>&=L BAAplAsAg|Ao=ǫ=>>44>=,@BsXB{BՊdA>e͸zzz?C<B4B57B*~<<?@zAh<<Be+B~B{<<@zz<<DoO[<<=zx>@O>5<<<<49X;d<<=z=>r<>-<5?$><=gx="qy?%*=<=}j=b>B-E@ <@i@$]+?[fAn gZl=ά<<<@ĨAww<<<A[33z<<<z>C<<<>J8C <<<ARz<<<zfk<<<?y=@A]AKtAw>)<>>G@?@=)ح? >q?=p<M=R=M=TB9gA;AC/?B=>zzzzzAEADAvA;HA=Y<7G/>ц?@@Ti?D=1{?@?-=B>#n/?r><&<YK:d<[AٞC)ʊB薫CX BVzzzzzA7AsAAzAv(A$=~Z<"l}V?  @ @@@? 0x0\0cq//A.e,(.(m(m3֭ӭ_^0R'0M0rC&0 %/I /4/w?/{..@L.ȭ.LT1=V0Ǡm0$S_//I{//...oy..W?=11V0n0/cS///83/ /6/.+21al1Y1 0Ll0μ0$5//o,Gԭ(]/.7.v.1u.6-y7,:(m(m+yP,o,V,݂0}--+--2 .#-.-O-?-7-K,19-+.p--B-v-wd-Uh-X-OF--`u-?1..M.YN.(-:- -O-N-[-M4-yz-2e-Lh 0ӑ./&o.( ..M.0..P,(-8- -&s@fmSt@J0T3 @5s@aZ@N?WLFS=nN;F_TÔP/gd >L===y=1F ) \ CDR8=3D4=%W;5 ;BCFiCNoCDR8CHCMr>n~p=j+=3>?^DyDD4DDB>.==%W=- ?UV01G1Q 22++/wx/S/ː,=A/mAAjLAAؤ=G^<Ԍ<= =feAvA!AAMAx=BV/<<<=3AAzlAnvAk6A> /=R<9>y셣>,>JєzAHA'ACB@t?J?B?,?Kz;Ƚhs.y lFCRBBSBYB,zzzzz8 i.? 2hAMAA]Af|AwA`j@Wp>u>"5??' ?,1?Q|?r?sS?1=Y=7>sPq>AD=J8>ȴ>e,>ff>4n?=;9X;4; l=) CB\oBB*BQOzzzzzA@AvL%AlAkAiA%ʌ==J>!  @@@@@ 1{1 0آ00;Y///s}~.ϥ3.\1'1of110:00XT0=j0 p/ą. }-09Y;1h1c1_F1|K0[0ϔ07y0\v0V/`t. &\,1s1`1Qi105C0k00w0!/|.-r,l1 1 S1y1PL10010#/,7XU训i/-.@.kk-#->7-y-(--!++@,/b-⮻.b .N&.3-^-e.Od-^--"P,N/O.F.@.a.)qY-¬Y-G.}Ud.-#8.cD-v,qb0 .H;.z.h.H-DC-H.V.A.n-x-,l0 ./K..{.,1.4p.3.-8,>-)9-p@fs@fkyv@JgWc 褌QT@4㋎!@aV@N`xE=>;o>@>= ;T=r> 3@>PY===yơ=1 )? C(?D?<<<<C-CC(COC>>G?>Y>ϹD DDDDd>*>&?>ޝ>0ڤ1A2,X*2fF3$/Dn//Ǟ/_0AoAĞkA}3A&A?v?s?w?|?ؠAAA5&ḀA><<5J@>@>@>${@>zzzzz<> >>єL@z<zzzz<?J?Tb@ؾ@<zzzz<C<<@Q?@Q<<19ѷ <<@Q?4@Q<<>:E_<<>A?<<@Q?L$@eAkA_t?zA ??~\>o>.=7?@ѵt@J>@ѵt@ѵtC%VB"/ C#B"ȭ?@}'=6є@BdeBdV@|"AB?|=>rG>=͞@ѵt@ѵt?]@ѵtC%>B"/ C B"1Bb:zzzzzA@AĨA AiA??Z>ȉ?@W]A=AĨA AɩAx??Z#>ȉ???.?YrG?m>֡bA<>2"Q>3o}>5>P>B^>M>N>P=k=4=y)=1 ) C?#UD?,<<<<CVCZCCڵCD>Y>?#U>$>DJDYDDOD]E>Y>?,>ʹ>Ј0 |12)2Kq3/(/r/Բ/q0rA´J=1<6<=,KANAAAAE@۩A@@ñ@@>J@>@>@>${@>zzzzz<@z>@z@z<zzzz<@?[@h@<zzzz<<<<<<<@P<<<<9ѷ<<<<@l<<<<;K<<<<<<<<?h<<<<<<<<?hI<<<<@#<<<<@<<<<@<<fAn gZl=ά @B@zCA5?)>,?[?L>,=@ѵt@ѵtB*BCKA\v"BTѬzzzzzAÀACA)AAkAN^E-V@@@"N="6@>@=@C%uAA?) ?; ?QN2Q>B7>D3L>EJ>C[>5g>@>A>Q===y=1 )?JCǣ;{D9;;HVM;a<q6;aC CCǣCuC=>-;>>Z>?Z?7?@8:@P6>'>jt>>)@"@8@@R@_CCCC}CϋqCzzzzz# < =L=# D9`D9ѽD9>D9D9zzzzz=u>LA333A""AA""Azzzzz?{n?J?1j?d+@+A*AJ""AdADDA|DDzzzzz>?E3??!=.$B@A1B[B'BtzzzzzBn>ėB1>Jē??=>?3(?3E>>@O>e>7<*d;$;e<^҉B Bkn>eæ>)=W="1{[?2??H1'?>z>/{=.}V=S&B,zzzzzAZA|dAqAmAl<6;c;w,;{@;AA|Ap*AlAj<:;cW;t;y ;F?@Q@Q@Q@QuƒtRlAŪ?nŹ*Ū}Nl3ų Ž=e,>>@4n>71> 'BbBBB@@@@@????? 2p2 "2Rƽ1d0D/qinu!*4U4W3/21q0.,!g5 !4\t32ǚ1>1h2/sJ-i5-Kx4p4 224^1/[.7ԭ5Ww4L4~2"2W1/~-Sy7)^'04//P.d.` -f-&B- ,,0c0D0k/EG0b/l-1+K6+]00dv0;/00P-8,r,U1%j1Wz0O0 1ѽ05. ,O,\"111R0A1)A1e.>--!]-r-G@fmT&@J| GlW@4샬L@aLMZ@Oq==x==5> >)=D=>=O=z=o!=)ީ )?C:yD9;: &a; :M; C&CCCjC<\;Gr:y;-O;UHD9ſD9 D9;D95D9< ;5I: &:,;[00ȁ71{J12'+D*%+8*+J,7yA׷A}9ArjaAnAl/<<8>`>\>f>?Z?7?@>@P6>'>sPq>6c>)~D9D9zzzzz=Q켣 <# >\)A;A~ffAwwAA33zzzzz@:??J ?ܐ@xA#33AQAuUUAApzzzzz> Y?G2?4?YwXABݭA߆B B;đBjlzzzzzAyVX?B,C@>>Jē? ?=>?9?3>>33>><*d;$;ۋ<`uB Bkn>eæ>)=W="1{J?3 ?E?G?f>>0 ={J=Y@֡B B3ABBB'zzzzzAZA|`AqAm~Al<5 ;b<;wg;z;AA|Ap*AlAj<:;cV;t;y;g;G??}@Q@Q@Q@QQhoHQ" 7Ū";}"żw=bŪ$Y^_ŵ~v[ż=>>@>9=> (@@@@@????? 2p2 "2Ru1d0Dv/s-h-B4U4W3/2(1rI0v.-,$5 !4\t32k{11 ]/x.< ,̅+w(5-Kx4p4*2)u251-K/\a.~-]:,s5Ww4L4~2"2W1/E.1ɐWyꭺZ<0| /T/Q..d.@-e-(I-C,z,_0?0D0k/0b/l-3 +݆+9+a0Ӽ0dv0;/ƥ00P-E_,*+ݝ+1%C1Wz0O0 1ѽ05. =,),ɟ+A111R0A1)A1e.>--4o-Y,`@fm{On@J5 Al+@4b@aL@Oڶ=w==E=o=)p )?C:tD9;:󱻂^X;aݺ M;aCyCXCCjC<(I;EK:t;;RD9D9D9;D9mD9<};5nc::䉓;[01qc1l22l/Cxx11S2- 2g5AA}^ArvAnmAl;<+ AAj""AwwAA33zzzzz@??~wT@%@aͯAA-?J?/?م?@ ?~wBr@vFC zzzzzBC}Cq.]?Љ`=RK=,yX?E>?2@!^BQ4BBIBCBzzzzzAGA}ArrAnAl<3;l;|;?;l>=@=5="6 ?@|?U?5t>|?O=Q?@HBBBCB$BzzzzzASA}ArrAnAl<3;l;|;?;lAA}ArrAnAl<3;l;|;?;>Vm@Q@Q@Q@Q;s}E*xß Dx&B=(%n ß̶⪑K1I=B(6: ßK9 ???????? 222Q:1n0l.8+43-+-4S!432q]`0S/.V@-tv,ߎz'5 \432.1j0 / .=,bw(5+?4‹4Ѓ2`1k0U$y/,.-F,25VjJ4O4 2_1ے0g/-=*b [B>==E=o=)p )?@C;#D7;s|kM;a:Z;sZCCBCĊXC>< ;#;;D8D8sD7D8D8>a6<:;s|k;es;Ի#0QF1|]2C"2X3G0WG2)G3,E3L$3A"A,6AA A>7j>>2~> I > hA*AU,A,ADA>9>W>>Yn>jnATAW8AA^Az>t>>>T>$@g%@?F??@>J='e͸>ʻ>=>>>[?ē?Y?j?p8?wzzzzz<,=>u">==k==u:d=r=O>=>vz>u=P=e]>BW<<3Rk=Y=?;;&:i;C:#d?k{8':1#=-;R ;6;n;9-@gR@6@*O@.V@>><0;;Ӟ׭??<<B.ZBr)B<<zzz<<#S@IAJ<?=6c? R<>Ĝ?L??W?%"@ѵt<#@_>IQ@"hBFB&cBHrBQBKLzzzzzAU7AHAAA[=;;S;;;?m=L$>}>*0??r??@ѵt<@2L0=.2@,BZB.BHrB$oBAzzzzzAU7AAAA[=;;+;;;AWBAAAA[=;̸h;; b;~{x2=Ãu!=>2/2>J%ET^o`n_>2/9>\J)2?]UmgB???@???? 10Ms0/0--'-|S-W\]2Y232"1O+J0l.`-boW,,4b(3h2%1E0I|E/BG.d/-dI-%J4A3ec37g20-l/..؋-ϒ +ot4435=2'0/M=-ي.[70v˾-%.'1.b-t,ܙ-8y-,݂,_2)G/H/C[/=/K,A0+]+++sQ3,E/X,s/zD.[-R--,E,%+g3L$0e ,0 cK/@.F-N-.,,#,w3%0~[0/.f.-V-6-{y9-V&s@fmY-@J d@4ƳԚ@aZ8@O\;<<_<ޓL>Op=;ӣ;K%S> ==L=o=) )Cv>D8O>};= %k> ]>ψ >S/>D9~D9D8D9D9~>+>M>9> >d00ȁ71|$1po2+D*%,.g~,7yALAŀA\AA?GF?>=<>.{ApAĕAAfAt?w]??}>)1>tATAvAiAA ?F@iG?$3>Ud>୒?@>@>B/$r??knzzz>1{A<A'At:<<AM<@Y@(+<B'<A֘A1"<z<zz<<v<?<? >Vb<%zx<<>@<>=q<>> J<@!'7>,'j,ڿk?K1+׽ 0>T,bzz? ==Xzz==yĽk-zz?(6=>=sAK+A @~h@'@zz???>?Yf@!@:?=7f4 d%r=<BN\Ay1^@`L?s? K="=L>?$֡=L>K^>>@ѵtBJ`BC$=.>9BmZ@Ang?/>Beu?,T>ԕ=L>ff=L=L>Ft>C wBOoCBBzzzzzAD8A%AfA#A /? t>>=>8hA&AUAAYA?@B?~5>G=.>aCe^i*dý;/Q?r<>>Z=5? Qae}ǿ^G75?y>ȏ?=? [wLQ`?e6>D>2=]O? d聋0I|'맿t;>+<( @@? jC/#4.yEAK,"&-P,5h,;J,"&.;->-,,U,Ƽ^,zh,{ŵ,B//Ao/.BjϚ-%-,آ-f4,+/7 x0wt0R˒/3&.'. ."k-%x-eL-B- e1=0 0=.o.@*$0. q-Y(.\0魋;/-t- --)9-Bݤ--7,Yu,_,k.-%-GU,-2,,أ,2r+{+ih?+//2C-v--yg-A-T+-#;,r+",|Jn++h/Q.O.H.9P--Wu,r-ؕ,v,4+04.ƕ&/-~/ .{-ϋ-{y9-k-Y(-r,+&s@fl @JT @4G2@a~QХ@Od-e=ޥ<`WK=K=S=p=*=Y )?JD;(DcW;k;sZ;aAz Ay:<8:Ѷv::!{;A&A~PAwAuAt=<(;: &:+;A????AD?;H%C<ǿ= ;`9q{9:(: !7689?;ˌ9I9j::@Hg@@.1@7u@*E=:=r: (:##;@p@{Z@L@ *@8=%dyi=C۾n'=O{<<RJ>JY?s33??>)*0=2?0u==1B)BXI&>eϪ?W?r?E>G= ?=@#8B&^B(BBBzzzzzA%A}AvAt#As<(!;c; ;ic;dATA}AvAtB— `>I |3STR +D]#>q _ 4:\$D)slq+?????"@@@@@????? 3y2`/2nf10A/n-,~lu4:F^4r3j7231 /.1`vFͺ04^4x!/32u1!/H.A-xE4^432%1R0.,.p)54z3Y21M0 IaFwe%0/ /C .ʅ-ﯫ- -q,,xC\00d0n0z3.ɥ-?,s!j,[~+#0$0<1i0dg/.ZI-,z,p,1R1rF0c/.wa--HhM-,11410&.k.f.)-G-@fp@JL,J )mcl@4﨓6@ai>@O+=]= C=K>Ca===g=$i )?DQ;DcWy:踻sZ;a:Z;sZDDDQDuD<;I;;':B;DcײDcDcWyDctDc><ų;D:; ;A00ǕV1{r12U+@*%+8*+J,7yA A~}LAvAt2As@y@}&@M@ +@=y`BnC2o|=<;a<=!T@"@s@0-@6y@'9@}@@@@ DD5DYDDzzzzz# LͽL;\)DcDcDcU1DcDczzzzz=# # # A-A[AAUUA33zzzzz??n6"?!s@ %@m5)A DDAC33AOwwAnAUUUzzzzz?W???oSv?ŬNBCAۊPBdIB7YzzzzzB@#u?_<}»>J>J]c?s33??>XD=7Y?A=5 >bB)BBBBѢzzzzzAfA}AvAt As<'ً;cMP;?;J;?&>XI&>' ?Fs=r?c=a>B&eB'%BBBѢzzzzzA%A}Av*At#As<'و;cMP;?;ic;?&ATA}AvAtμѵf~rQM{7ɑ=sA:$ Ásĕ Z7%=sA-6ÁX GK?????(@@@@@????? 3y2ג2nf1_M0A/..-y-`WK-*Z-,~l,k+34:F^4r3j72Tl1 H/.m.-ekӭf4^4x!/32u1!r/u.tq-\,#̬ p4^43׹2%1S0j/.DY-B, 54z3Y2t1SQ0.g-)9働O0/ w/B.A'-|--D,,r,tu+,;J,݂+}00d00y .c-Y,v ,]O+#+a0Q0<1i0dg/.[ -,,@, Z+g111rF0a/.-I-F-v,,sؑ1y 141F0".|I.^Pf.( -h--4o@fp_ @JN )gI @4降@ai@Oo=ד;;qJSp>B===g=$h )?DQ;DcWy:踻a;a:Ж;aDDDQDuD<;I;;':B;DcײDcDcWyDctDc><ų;D:; ;A00ǕV1{r12U+@*%+8*+J,7yA A~lAvAtAsAz Ay <9s::՜:v;AA~7AwAuAt <'b;s::p;A????AD?J>/ x?s33??> ԕ=9#?J=8=]B) BBBBzzzzzAfA}pAvAt As<# ;`c;R;+;,5>XI&>e0??|??W>D="x?= >B&zgB%9BBRBzzzzzA%A}AvAt As<#;`c;R;+;,5AXA}AvAt#As<$-;a7;R;,;,5?t@Q@Q@Q@Q+=gK& i±6=R-Rvo*¬,)f6o=X`C7!n«Ɓ ?????????? 3 22oX+10@/i.,- -cr-%sD-,~l,e+348K43"201 [%/tN.|-)uӭf4τ4x!/3W2͕1!&/u.O+-, p4D4 3 2y\1S0j/. -CA+T543>&2t1SQ0~.,1\A\dO0f/]/F .bQ-،-y-C,ܙ,e,+, c,݂+}0j0n00vPk.V-8,bØ,9+Y+00:Y0fe/ .V̙-,^,+, &)+g1ѽ1 80W/۩.!*--CA,,b,z119{1 0\.Ԅ.Z~H.%JK---4o&s@fp@JN؈ )g*@4降_!@ai@O=[t;H;r1̻Inb>B===g=$h>`Q?]gCO?2AAu ) 0DH>@GDh+>,<<<<DKDDHDDB>ܮ>>@G>>DhDhDh+DhDhD>b>׽2>,>׉6>׍0<0m1{r12U+@*g+8*+J,7yA˥!AA{A'Aw?zp>=+> >r>hABlA_A=gA4"Al4?5>(>SG>A?Af AAPA'>V>k?o@>J@'@>@>${?8zzzz?0l@n@??O> z>>>?Zwz@&J@c:@ f@SD?1{zzzzzM=ԕ=Ĝ>$g8?T9X>(Xy>s>J?q4 ԕ&>b>Kx?2=?f>ܧ>w߿HuT>tohD@Zz> Q>\*>|Pzz=Q>zz>>i%> `zA(@T@d@Az@I@=^ADz?S ?4@ C?>Z?$=y`BnC2o|=<;a<=!T@"@s@0-@6y@'9@}@@@@ <<DE<<<<z<<<<=<<<<Dh+<<<<z<<<<# <<<<@{<<<<z<<<<?+Ur<<<<?<<<<z<<<<?F<<<<Cv<<<<z<<<<C<<AhJ@h?jA?LS@@u?ԵAW@3=L>֔F>]?\c=L?;j?3?EF BfB&C/$BjFBp}zzzzzABA AA7Aȭ?GN>|>bQ>d5>A~??z@j?(BJ?}?"5?w=L>y>>1>;=L?.? >MjBB4]0C/C BzzzzzAOAzgAPiA,OA?78>>\b>o>2wA˖Ae-AAA?ֈ>aަ>">>1?uH.ֽCV?wO?mD?||? T?nVʼv /?ss?ss?~ӽ.%-b,l10r0PV=f==h=$ )!?JD&d>CD:4>D;"+; ;<DqDhD*DD&=Q;{??;IyD|D̋D0D|D̈=^;??;)00,1}12-(.L.+.BJ/WU*A}ArA].AcAB<5F ?O`??>@Q%B0B+AA ?=XI&@HASAepJw<BS"BB1B_{<zzzzYKě=⽚u>;IR:4::ě<F`N==j===2<9[9ε:28]:!5[7Y*7 < 9\@9!:Ue81@ڹ@o @*A@6?=x:O::ADyD̊D,LDuD̄zzzzzW = = >\>{A-A33ABBzzzzz?Y?+@Wo9B@ƔAAUUADDB$DDAǻzzzzzP>?$v@Xm9B* j?kn@^ =)<="6?s,?p|?s*?=we>g=_pA,=)<="6>=,>a#:??](? ?iD=r=t!<9X<>'B#ApA B\[BdzzzzzA:A}bA51AszABH+1 B/{/.-#8.)qY/%X./DY/ƥ0}4P_43$63Չ3 1ؐ0Λ^0 w/fS//Ш./n/g076:5\43]52,B1 /.Ĕ6.d /޺-0/Gm/k00!.{ .ը..ʅ-K-C,M#,Yu,{,F,xC\-k-R^.q00D04a/T.-,r,t6,P,1-F,m.1-.I / 1$221/=/u.uh-e%,]C,m,,6.L--.pq.[00 ^1W1,1b 0UE/].2-vD,-&/1+-w..(0A23=83$2#0&>"M>X=>=h=6!=y{=0M )!"?D#>=D3a>D^X;ݻ- ;GDo!Dd.D-DD$<̉; jZ??:qDwD̃D//DvWD́<%;=??: 0O0k112+@+6S+BZ+W,7yAyArA]7.AcAB;*_@)o?9?a@HH?=XI&F׭==u.8Q>A AA33B Bzzzzz@H}?%B? =@Hv@"r[ADDApA33BBzzzzz>̓?q?ڿ@0@cBjCB AB\zzzzzQw>BGD~C?kn?֦V=)<dž?s33??W?=v+k>=0 <&>B?|$?@?}?خ=poi> =o<8>B#OBXB.zB*3BczzzzzA>ArlA_AbjFABH;t;A|As!#A\AwxAC1=3aK>څ=hu=5=y=0 )"#?D#>=D3a>D^X;GP;GDo!Dd.D-DD$<̉; jZ??:qDwD̃D//DvWD́<%;=??: 0O0k112+@+6S+BZ+%,7yAyArA]7.AcAB}R<F>=5kk%<<0=Q< 9\'9E:8:}r7RiF7c>< ?&9\9`:] 8@|@o@`AX@7z=xH:P:CM-?~n?Q@@"1{Be*CdB\AHBS9zzzzz@Є=3@@)?kn?=XA ?s33?lM?z0U?=we?#S=;/<={JBnWBB+OAhBxzzzzzAφArhAbvAgWAB0<=_R;^2<:1<,;sȏ? ?t,=?F'?}V?~ߤ=pE?)=ں<8> B#dBCBB(B:zzzzzA>ArhA`5"AbMAB0<>;^2<;M<>;sȏAѓAsZ{A]GAvvACf<>;j< nN&ĀQnh ˆcāI#ĮCĒ.H)ʿākXdђ?>=q?e??A  ?? 2x2?2%1}~0.q-)9-:,Yu\C4Ђ>4¨32Յ1"0'/J-gC~6GX5ӂ4x3X 2C1U/.L+K4Ba4c33P3 210W/. ;-k!7d65ӎ^4]3[x2+N1 k/.ϡ, v0_V.ه ..?v.d--,k,K,_00[0/q.-,,k,LT1a2ƀ21&nB/sp.{-&f ,,]801m1`1[D0W/b;R.>Ib-3,",b,27~37d3cK2d]068=3aK>څ=hu=5=y=0>Hc@`zC0mdAtAZ\ )"$? D@Z==< <ߣ=(010ʻ1~>1k2c+@+6S+8*+J,7yAwVAuA!A(A2?kg=E?S=l=<Ƹv=F@>J?t%?ԃ?(?z? =,=6c@t<?=7?sd?)?(<=X?=Pq=W>=9<U2(Xy޾h<=<$<,1<6z<=F<=<>~ҳ=]=cY> 7<@@r@ B@EaG<DƅD-DrADƧ,<zzzz<< <@h@@""B(<zzzz<?G> 5>o<@H@@wwAR""<zzzz<>>*Q>+><BAAycC <zzzz<@g.?@@"1{Bv>>)P|@ѵt@ѵt@ѵt@ѵt?0BE6#B9BBʄBlzzzzzA̹IA_AA,AD(?S'=N='XAA>?6=)<>&B=8=y?Lv>>l"h@ѵt@ѵt@ѵt@BDBþBBBCNzzzzzA̹IAIAA,Ab?S'=NU==ѷ??2\???U+G(k7B=??\?>1?jS+u *ۺe轵;_??\?>1?p+ v뺐 f28?? @@????J7- v-Cc-(I0 g0S/Q*.-b˫ҵq"1x1W04/en-}͖,6+%2cW21@ q0S$/- 0S2lE2n<*10ګ/:r.Y.;4s/*.., . -&B,Yu,9/ L-j--~,,,/-.$.2-W,-k,6/q|.a.gg-c-,l,o,0k/[Y/F*m/*..N-.'.-^S&s@fpf>@JRTV WE@5.@a~ }@N&?4 =~<*HVO=ᜊ==x'=/>w#?Bӹ]AA=q )"%@DS>D>}9M*F>?QU?K-D"DDDD]DX~>lO>S>}>[?K00n/1}N1 2U+@,*+8*-2-AA&AAAo?d ->]>>/>/ALA'AAOA?96>;>$9>J>ԼmAcAA#A AA?7 >>?xZ9>~@@>@?ؾ@zz>>euz<?Q}?a? ?<>J>e>L$?C<??ua>=ɺ^>>A< ⾷=,<> #:=W>><>UK>=R</7z>!>+7L<z>O0>?z<zd=Az<z>L>z<B5A @EB8<z@n@$2,z<>9@ @s>[8Q>=q<DNDDEDa<zzzz<# ><@j@@A"<zzzz<?>>@آ@8<?@=?@ <zzzz<>!> AD?-<C BE@lДC<zzzz<AA#@%¹,O?o?G??=L$@c@ o?bb?Ե?@?=L?=L?=={?*C?B'C(uBR:CbC/zzzzzAڟAilA:AXAi&?6!> 5 >>|>܎>-?e?sPq?Gp8?mO?7n>?> ?/ƴ@)?r=L?3Z=L?3>b3? }?x9BrC&-oBMC8bC/zzzzzAϯAKAaiA^A!?HM> >1\>>Aՙ-A@AaiA8gAp?Fb>U=5>LfX>% ,q q޽=/?P1?z?e6Q:&EP2ؽ'?0KЖ>2a? (@@(@@?. Oҭ§\;/l/@/.w.9- +Ԑ0.{/o/.C/-z+BZ/+//z.>T0/07/~"4/f."t'/e.>.eA.O-3`-.s$-8. %k-?- ,?/< -h-k-m-;x,/_.$. -1`--'0r./...&s@fq,@J6/ e6P†@5]u@a}~p)@N Z>*ph,>&B;$>p;;[?i>*=K=!=x=0z )"&D ?0Dlz>Yo<<<<DQeDCDDqhDj?#?A??"?"~Dѯ^DѺmDo%Dѩ Dѽ?>Ĥ >>>>">&00n/1}1 2U+@,r+8*-o,7yAANAń}AʰA?a> Kn?w?F#?A,AwAAAVW?v>Y?7G?Rv?=FA\A A 4A̍A?J>34?!??L@@>@v@>${@zzzzz<?6u<<<<><<<<?d;<<<<z<<<<<<<<>p|<<<<> <<<<>e<<<<<<<=Lf<?S\<<>@zl<z<<=Ce<z<<>X"<z<<@w*<BY<<?<z<<@ B<'4<<<<<?<<<<z<<<<>D<<<<B7<<<<z<<<<-<<<?@t="AD4k??9?h? @YA=oi@ѵt?g8AO}Bz2AB{C$"zzzzzA̯(AAПA{Aj?۝>5%??9?hAAAHAOAg?\l>{?7?D?2: lyrG;';IR8ѷ?~=2==x̾=0f )"'?DD>(Dџ><<<<DD~DDbDDC>h>i>>z>DDDѣDD >P>>|>>0?f0ɝ1}n1%2-+@+/+8*+,7yAƐ$ALA̳$r?,\?JR,?,AS^AӦAUAH8AA?ub>?@0?U{?AAXAAʝAYA.? >f?'??~A@>J?z @v@>${@>z=/zzz?ē> <<<>kn=7<<<?%?(<<<z>/<<<@Q=R<yԕ<@Q=ۋ<@Q<?觽$<>U2a<@Q=W?<@G<> Pt=<">@%<Uzz<zzzz<zzzz<zzAy\<A&Bzz<zz>'<@;>!<<<<?ff<<<<z<<<<=<<<<C <<<<z<<<<AB<<<A3>'A%=XWA ;=L= =>b=L=@ѵt@ѵt>oBCcB@CkB%zzzzzA8AA̩A"A=)@ k>-l?e\?-?;@Y>sG="5="1{Au?JA@~B =u> W>5Y=L= ?@ѵt@ѵt@ѵtB+C>-p ?e̺?-?<hAŰ+AUAվAqA ?b7>-p >g??";;0|<ok< ':Q?? T??ss?ss$>PPt> \?~<>$??c?e6̯9g1 ؘI ?~<>ͷ??c?e6₶iI5KC#? 0   ?a.:.W|-eB+e/?/v#. FsϾ,rcF~حspƦ=g5 T/7z7-Y,l1jʬ/Qw.h@.[Z.m/-.9n~.8->7-E).7-V3--iY,/,LT/(DE-X--G,},*/)-.$-G-&.,I0a/g/].-.ca&s@fpt̚@JٺE @5O@a}oN@Ni=c =1=y=0 )"(Dr>YD̳>Q<<<<D.D(FDDD]?? ?p>³?ӍDDD̸DD:@@Q@)>Te@001~z1 2c+@+6S+8*+J,7yAPYA+AAA!?Q>٭>4>^(@ArAA6A"gA܊?>?">?> X@AAA,1ALA:Aނ>=$=k,>N?r>.@>J@>?B/$rB/hzz?jzz<<<Acx<<<<@r<<<<A4<<<<z<<<<B&<<<<=c<<<<o<<<<=<<w>?(?jX<AF=K<zz>W%z<zzz<zz>z<SX`ARA W^A<zz@{5{z<@Jg?#?=@h"Q.{<<<<@<<<<z<<<<?ޗ<<<<@N<<<<z<<<<?mL?<<<<AhK<<<<z<<<<B+<="6>7?QDA>KAq5?\E@DA`@@ѵtCACCBE.*B?B.kzzzzzAJMAAwAbA9?vE>>c>B>fʽAV,n@Ӈ?G@"?\?iD=L=L>Ĩ=M@ѵt>z@ѵtC!CBNLBᖪB3zzzzzAFAAA4A ?8>>>Cw>εAݚA.ABGAVA]?hy@S?>B~#?r4>q?&":^5=W?:O.%>¢snN\*񿍄? Qw>}"¥t{{Qz]U? QB >z5§I{QK}????"3?sa    @ ? &C§\.M-C+@ Ldg55*| - .Cc+3~p,GlH/*.,p.@+#e0, Z=󭈴0UV//4..`-Q5-:-hu-HhM-(ɭ/-/ ,o-#,P--f{_.{j/o-.`-S-q,.W,4E,xC\+K,F,SL.ׄ,8- -],,,á+a+ҭg+9+/2-R)-mh-A,ͻ+7,6r+r3+u +u +YN/-t.-KU-,l,HE,Q ,8,,=),2b0mD./2|/+. 0-l-{y9,7X-]-%|,`&s@fp@p@J  cFTv@52,@a}ꍟ,@Nq # w=7=z=xj=0j ))?Dh;D;~V;5 ;a<B;aDD@; V@0<A:-::;@2@I@A@ @V=vx4M qGI==t<@<{= @9@s@2Y@FAUUAHAPAiA(zzzzz?BC-cC#BBqB zzzzz@b?J@A" =I&=/6>>(B&DBo4B#BkBdJzzzzzAA{AuAs` Ar<s;cW;;;>"6=G=R=6}<9X>BBHBBuBZ zzzzzAA{AuAs` Ar<T;cW;;E;A`A{AuAs` Ar<s;cW;;E;@@Q@Q@Q@ 8+OÝ` L?@@@@@????? 3b݁3)2T10-//,p\ 4Y 4g32֌1q/.o4'4NA3>2HU1-ys0`,.wB+4h4321a<0.;//.E%/s-5+4i3 2Lt1CV2/W" G0ye/9A/|.N. 6;-`WK-3`,ǒ0X0b~052/(4.l->,v ,Ĕ$0:0J:0dg/V!.-,,GxH1 1 0ӝ/`.-b:-(',ٌ/B&8-1(1WԌ1 /I.}.z-s-g@fqiO@J;x .$@4E@a~rP搇@O''=K=t=QJ=A=V,>F=4=\zr>FD=O=o=i=% ))*?DkO;D[:2:P;a:Z;aDD DkODDlEA}9Av At~AsX<::Ϛ:Cd;MAb?7?sd?AD?ojA\\)D DD3DDzzzzz# # # <<# AFAiArAAzzzzz??L?~@@-A/wwAOwwAZ""AyATzzzzz?~yC?h!%?z?H{?CHCC)3A B&\!B'`zzzzz>jVO?,AJ]=I&=/ =8>#:=7Y>BA,BK[BW0BfaBnzzzzzAA{AuAs` Arۇ<U;c;3;;G>"6>'vE==M=҉>BZB(BBpBdIzzzzzAA{AuAs` Arۇ<;c;3;E;GAHA{AuAs` Ar<5;c;3;E;o?@Q@Q@Q@1^_31T/Q.-$l4'4NA3>2HU1-`0.D-i+1y4h4321bA00dd/ .h-2I]5+4M3A2"}1Q 09/0E.\00J /;Q/l. .!-f-6y:,p,_,"&, c0S0b~05U/(4.-,t6,/+$0X0J +0d1/4.--JG,޳U,Im+ŭ1 1 0k/`.- -8!-H,^T,v11WԌ1 /S&.(h.p?--ȧ- U&s@fq͋w @J J@4Z&@a~r,@O'4'[;E=O\=$=i3=%S>h>j.CA Au )+?JDy<$D[;E;;a;;aDDDyDDG=>xՓ>=?$S=IgD= <<:#9.v:$ֶ:9 8'i8b9&A<9E:$_f9:';8@b@}xH@4S@AW@-=<;$Ul:;;@@@{T@@ =jὼɾV$r=j=J(wXA@A.ffAMAnA zzzzz>k5?C?P>?=.$BdgXCBtBBzzzzz>z@?p>}]>-='r?X7?s33?s&?W>H>;J#?3*?> JB8BBSBBpezzzzzA9AuAz9:AvzAt=@=/͟=>RTa>=f1B4$BDB ?B\BuzzzzzAEAuAz9:AvzAt0g/\.A44JH33?2v&1,/CW. d4K4o?362v1?,0$+/ b.x4O4&3213?/sqUܯ0} [...m--Dja-Z,؛0nF0)0b/u[.7f-7_,7,s!j0'0Z0@7/I.du-,,+00̅0/ˡ.--V-- r11D91%/ G..e.N.6?@fqiR@J q@4m@a}yW@N_UI,=b==~O0>G=ۭc=T =q=+Q' )+,?D;*]VD[n;4k;q6;a; M;aDDqDDBDAA{7.AwAul<;d:uF;K;T? o?ָ?#??oj="6x>Κ=>Έ=IvP=N<::#9'u:$Ա:'9a_,8'28a9m\<8Zv:$R9:';)|@@}!@4ٵ@A@.=;$`:};;SI@ z@;@|@@ =1QVھq==H-='"?s&?W>8>4?#f?>zBkBB"BBYzzzzzAAsAz9:AvzAtGJē=7B?f_?Y?fl?W>=:?co>>1B]BBIBBzzzzzAAsAz9:AvzAtG̣;-ut3 >G;/[ .[r?z @@@@@????? 22l~2&1&v/.{tY-cr,ǵ-a,e4i3L3'2*0Bn/m).PH3,+v44JH33?2u1/b . 6-+ s4K4ow362#1@e0p/.KO+ۺ4O4&32B1D/u.a+l0|h.n.ɸ .i7-|5-G-C,؛+%,:0m֚0)0b/.:-?, J,k,#A%,b0g0Z0@7/I.a--u,,E-+)00̅0/.M--Y;-,,)11Dl61P/M..z.M$.'D--p@@fq󂢠w@JSm aPD@4ΆS@a}|!h@N'<2C'0G]=ۭ=S=q@=+P ),-?D;*]VD[n;4k;- ;a; M;aDDqDDBD=7)=Pp=ք<::#9h:$:H9_%8"y׶38o9<8[:$-9Q:'GJ;@S@~O@4 @AI@. =;$e:;~v;0@ @@b @$@`=1QVھq==H-='҉>) ?4,=?C>BLBB%BBuzzzzzAAqAz9:AvvAtGXI&=/g=m?#>M>HBBWBBBkDzzzzzAAqAz9:AvvAtGi <ӿ| ":r?????????? 2/42l~2i1&ņ/(.sg-?K,@-Z![,e4M33(2 2+0\/m).SݥC+wͫv44J3S2ux>1q/0.-}+u 4B4ow3<2#1@ q0p/a-;* 4^4&32B1E&h/.f}̤0|W.S.ga.r--Bݤ- ,ǒ+%,:0m.00 / g..;-B,ߎ,v ,!qU,b0g0 0=/@.a- ,P,dE ,= +)00.0(/.`-#T-F,3 ,^T,)11K1j/..m.?-k-!]-p@&s@fqI@JR aӘ@4΄l@a}|x@Nބ'<20iG]=ۭ=S=q@=+P>;h? C%9AAw ),.@D>@D>߼YG<"+t>~>@>A>D+D%'DDD4>>>=B>]00fK1{12{U+@+>+8*+J,XAńGA!AUACA?4]>@=˽=>;DA™AwAA_A`?)>i>~i=>BAAA5AVAʮ>An?Z6X>Qd>@!A58=7A5@cSo? Hz="/z?D>=9A ?I4@U@ %<?o@_??p<A,A2k@N)A]<zzzz<=qvQt"> )<>@Q=U>7e<K]QtKƨ=B\<>;@Q=#n/>4m<>S/.^]>:Ӿ۫>=>>J> BOzz>(W=i>Ozz<=Suzz>,b=ۑ8>A@4 @s@@+`zz?,Sw?27?T >b?x@9@ [@=1QVھq==Hu<<<DD"<<<zz<<<=Q<<<@""@<<<zz<<<? ?´<<<@ww@s33<<<zz<<<>{l=´<<<B!BP<<<zz<<<BA<AMA@sG?P ?=L$?زBua@x> >єL?\?)>>O>.=L?ӯ?+?)>Al;aBB¼*BPuBiUzzzzzAAgAAA?"l>y`=?=>TCBmhJ?J>?%?A$?3>)>s?v@>4n>> >7k=L?*?F ?[>A B>B'BVBlŪzzzzzA`AAAUAR>Ch>h{=5=>TX#AſhAsTAA'AR?ӿ>c==<>EQN<,P,T:,/A-{<.c-Na-!v, &),N,|/M,--.{-('-CA,ߒ,2b,ć0.;.˲.ՙ..,E- -r&s@fr} @JJw [Gh@4B@a}psg@N\!U ;w=5P>p=|= =p=* )/?JD;#mDJZ ;s;a;a\) <# DJDJ2DJYDJDKzzzzz<# <# =\)AAYAaAA$zzzzz?E@?9?>UADDA>ffALAnffA""zzzzz>>?,R?Q?O>/CwC bHA_ʿB8BkzzzzzߏA ?'/=I&=G)=-w>^>@QBBGBBiBzzzzzAA}fAv>Atf.Asb<;f-;0;,k;>"6>/="5="AD?&ff?fff?e?/U>%=\?>"h >Z@p_BABBbBBzzzzzAA}Av>Atf.Asb<;f,;0;,k;AA}Av>Atf.As1<;f,;0;,k;?Np;@Q@Q@Q@Q=+ny+% þiBk&e>ꑓ)eGv;Á8Az)B$Àޮ<1#/D???0@@@@@?????  3053W2510KP.pe0MK4B4Q3}&2c1 /.sJ-04r4y 3E21%я/.-i443_21O0q/ ͵.OW-+z,փ44J321:+/{mVq4 0//7.Ź.9U-p-Z,{00VQ 0/+/ .f-\{R,A0,+0;0dg0ZL/k.{-]7,آ,100/.1-&-'-.@,#,l11n1=x/1i/..Dj.r{-J@frJa@J p@4Ԙ+j@a~ VI@OSkf= ==V.=o+=M >%=(4_=u>/=ǜ=Ƨ=[=r )/0?D; DJW:<: M;a;P;aDD؋DD Da<;H; ;+;DJ݃DJDJWDJ[DJ<;1{7V1Vv2++DZ+_1+/],/AA~?AvAtAs6?C3?_??4C;C+AjB BB![zzzzzA,KBTTe>Y*=RK=G="5=R>Fs>|?BlBBBy-BrzzzzzAA}fAvWAtf.As<:C;f-;;,k;v>/o>/="5="AD;=^i>C->E8?B-BQ$>z"|ò[S濄q?n>dhͭT¾d#?p>gK h S½H????0@@@@@????? 3053w 21Q?0PH/.S-܇+Զ4B4Q3}&2c1 /.i-@;*%4r4y 3E21%/..ɧ,-G,$443_2g1O0/t.O-̬3644=v321O<'0+S.F.Ǡ-4ʭ;0/f/6Y.bQ.-M- ,,o,۱00VQ 0/ɣ/!.f;-Zg,,4+0;0dg0ZL/k.{f'-,,Z,@F100/;+.Zn--#;,,j}M+T11<1ܙ/P.-.F{L-?-J-G[-G@frj@JX ּjD@4\(@a~ jF@OҊK /;z-;;E=5)=ǜ=Ơ=[=j )01?D; DJW:<: M;a;P;aDD؋DD Da<;H; ;+;DJ݃DJDJWDJ[DJ<;1{7V1Vv2++DZ+_1+/],/AA~;AvAtAs=?7y8?i?6l? KCC*2A^+AH1AW7zzzzzA qf^4_*m@\8=I&=?="5<6=O>HK^>9 l@ 4nB"BBnBiB>zzzzzAA}fAv>Atf.As<1c;d;E;v-;_>/o>/="5="AD|=_;d>>@I?BvBBB1B*IzzzzzAA}fAv>Atf.As<0?;d;E;v-;6YA A}Av>AtbAsl< ;d;E;v.;?=)@Q@Q@Q@Q>1?2\"ë/U\¼u^?mD? d<`NjS·]f?n? [὏`}N·C|\???????? 30D38'2&1Q?0Py.X-|5+e\+4A0443~2+1 /.*$-&*p'`4י4y 3:21%z/3.˩-m.h, j443o21P0,@/- p-ݬ364H4J3ĕ21Pb0--.qv.k-쭑%m0/7/:s?.A. -p- ,,0,Ն@0N0`l\09/'չ.d-Y,,H1+{00dv0[/.{-Q,',,[T,B1rF10I/ml.3-Y-#;,ɟ,m+T1D1A91)=ǜ=Ơ=[=j>?OBAAu )02X@D ?9DK# >=9q<}=| DFDDD?>ϫ?A>E?DL.DKDKDKDLl?> ?>n4?00n/1{r12Θ++DZ+_1+h,/AύdAhAaA^AQ1?07?>kR>N>P?gAƨjARA%\AiA:?k>>>>AjATAAA??b>[2>J?H @>J@>@>@ h@]zzz?%@Í<?9I?˒??:<?C>Pq>L$?[<@(?$Z?a?֑t<zzzz'R>2=9X@Q>>*h>R>-[?P=SZa> @Q>N<>(Xy>>y><3?d8> ~<?Bj>Bgüˁ<>gz>*z<=8z=;|&z<>z>Dz<A#@A zA<@z@Ez<?r?R?&? S=!j$ؽҺ9`R=<\W =<<<@,@<<<zz<<<>X?'SM<<<@DD@[<<<zz<<<=5<<<CTC <<<zz<<<@*~ž?<?Q}@?A.AAu%@F@cC!@uB=C=L>P>@>Z?p|?"e??ABUBCC/C!OBzzzzzAAl}AQ0AA6?n>~>~>???jt?@>Jē?7?N$&?ؾ@ޗ=]d=L?? =L?V_?CBFkBI&C .CBJzzzzzAA`Aq/AA`?m>:>~>{?AІAAk>M`C>Jk?;<t=u%dü> ???0K?~Ҫ Б~(5?? L (@(@({*oE[-Rͭ<Ƭ-ȭ .h.w.!--b*%j/z/.|].q-+BZ+BZ0?%/ /NZm/-`+J-S00'0)/.-ϋ-/x-Ki..->-P+3,.,-:-)E,o+SK,. /7 j-.%\--*뜫,yA/-v. .p,)+5-20.m./.B,(-@fsW@Jʑ :L{@4U-@a}s9@O^k;խ;F#;9ȕ><=f=7=[S*= astrometry.net-0.67/sdss/testdata/psf.fits000644 000765 000024 00000034100 12651445460 021030 0ustar00dstnstaff000000 000000 SIMPLE = T /Primary Header created by MWRFITS v1.11 BITPIX = -32 / NAXIS = 2 / NAXIS1 = 51 / NAXIS2 = 51 / EXTEND = T /Extensions may be present END 8c5V6Cd+(87T8W7j 889@8ȿ8 77j¸GVs88ʦ87k9r;8<|8M8e96 5kˠf}8L7LĂ8 X87A8sѸ97q6Bm9!6H/е08C䃠$87@9-@9<H7i89Jrp9,LV9C9Ms+7<8s1`8!8>8z4yʶ EEַ@bYVH38Ww7OlB8iT888¶9)99#Q9=@99d9f+92W8N9M;79,8x8w ;84CƸ ke06)638kd~*7e8JcƷ'499al9/E9W9W9Y:j:&999_R9a#8V 8 #8Vo7@77L 8_784>j$V?:?8>V8n81oz898/299 `:%:$:S}::k:':C/99E9Q8(;74_ 9858 Bq87ڨ;f%8q7|H7ef8;89(9t::Uj::D:K; :B:a:AJ: 9Sg:8˒j9v84V8A|8,Izs8EMoR/bUU(0h8Ӫ8"8B8=J8)99V:$e:; ;^;.;u;J;:(:^:2ۅ: +9?9H8n937:7\Zh76N8f88G8V9!j8O9:Ho:;IL;0n:v5:9 7Ơ918bt.8\ 7 4ϷPd7YtŨ=2&zn8?f8"80d8bzS9 _9}4:Ⱥ:5\:;73;k$;;i;:: 9D9#s996Ǻ8&7i=8 оfVlc7#GXR8/8:e8a4зB88f9889}9:AR:(::y:s:i:_:]S9}Q9Gn9R8w9\8:8ۢ(7ZlP8 j8g07lP̜a^T]8!q8Cӷ?8Z9ku99_B9U: }l:3R8:0:aL::aXO: 9?\88S9!9 NH7O8$8Dn78n'7H`9%6DB8{Hj?8}8ed8 9699/9 9P9z9:(: 998>Dg9*ϸI:7VZO8͠8H8X^8E7$g#<8:x!H88R7=588P9Ho 8@h9,95p9v9oo9,9B*8n8ey8D68 8M8&7dS8?·3 T,7'G7hl8 888ip88:"8*7ŀ8h8D`9" 9t9Q7L~986D768@9Ր]DAX8D\\8v 8t6!w6Q/7cq·NQg+77ayT8I7Lo288lpk7>8,"8g8978F8|e 8Jt8n8>Df8g螷|^7ʰ8o<:ǏZ7:M67_\-7ٞ8.87R88*зV9U784>*8q7dJn8,87x7X4 R8gL! a`U!G-7F1j8d8FP%B8Ec̷q87> 7Ѝ8w+rx@HW:8k4qP7M8 B!7'=7d;0sQ6Ad 6 ʏJzDp˸Ovh8 6޿l98и18_Q8F'dK5|pzr/]ȸ!8br8U@74E7Ex0F>ط8$HS Q578(θE8Sn8"-790a4\&8#@ӷ,849Be=s6зی8,8 88o7<~䞺7E8J廷388ID=m96/ηd^e~2eRg7ݍ7ARastrometry.net-0.67/sdss/testdata/psf00.fits000644 000765 000024 00000034100 12651445460 021170 0ustar00dstnstaff000000 000000 SIMPLE = T /Primary Header created by MWRFITS v1.11 BITPIX = -32 / NAXIS = 2 / NAXIS1 = 51 / NAXIS2 = 51 / EXTEND = T /Extensions may be present END 7cŗsݸ8yrˡ6跘7v9%ll8sO 븉8׀7828Ŭ83,7+8U8dY~76!p4f޹F7%~8n8V8P: "88 7P@8xt8 Hc,~pݮ8@7gd80+7:8xJb8,J8E򿞸1LdZJ9vZ'99%r8V &ܹ R8` &йἸ+yظ⑹.N+?8)/θ[ĸ8L9/7Ǹ7j}8n>88>.']7P9)ȸp}Hd988 ñD`8\5b75x8FN-@92W)`c~8gN8'1J9An`8Ƕ7![Q8mH|7QԷS!¹"F8.d 8\8788$L9KI889a9L9=9{9Aq9{|9p7M*p8P X_ϑ"9Tz*,\ׁ7[|t8M()8:>Yvʄ%Z;9z9r95'9U 99:2|:49\9M9K9Hz8dɪ&80k&78\l7ui7g8g6<8&uQyʹB 8z8w*K]6R88o9 %9k9HQ:B:87:]:Y):<&:[:L9 9gS9e}P9\7 <9>~j9-Ɩ83uNMq8{n7иiʟ7޸8c[8N8WkPZ8y=99`y9O:M/:A::::;g;:GL:Xe:!H9Ka89e8қ8\IE7f9G6Kp8nD[0%:8JTw77nC;8tD8s9<>9:$v[:;L;dD;!;;AN;@@:˟h:#:V9S9M897`7 3`bƸ8ROƷP7N9r2P8z]9G:d:wM;O];[g;b;E;s;#R:l:^{9t!9Tx9.9uL7828FIֹ︭xs8557PJ?_7=%88o9 99yx: s:?:<:Ts:J::L::]99,n9f8m9N@9Ŝ8585ɖ8z88|, <ФAz86`8939C.9B<9m9]:8t:R:g:l:19+9ˀy8699u8n7Ô<8BL87z#8l7ySvhf9,V6KL7X8 iS8s988HDP92E99Gl9ך'9Q9{?9:<99T9 7@ᐸO{9d mO7yKK8_qt8$8>y98}JH8ɹDPE7O9.:868us;9 oN9i涷P980[9K!99579L9(L$ 8dD68ػ8qj4'&8lB7w@7ލH8S8@\]8298_,N8 V8:8z7 x%9J47E979\9Q18Y9>8g7g3 /59JBh8 k78veAMyFɷͲ78709#L86RyS!8J|9mB 9"7"8n9D]Iwsn4L98sP6WX8Ky5619w7rXڸ 47p86D7=.з 78|8?8# gR8[i9_8e9E7&8z8ʼn5z8WiƸ~8W6c8dvL儷*89 '87D8YCpзe%-!'08j8n887-)V848Itl}9~y@8A8O8$9W۫7 7,8c'n1 "I E춝296`6p_$3ڙ7<8Lq0}8?9ηB`~748 w8yuk 7 K츸F 7>:176GEظ(Ӣ9,;mf9]3b9:G.9T8hΏ O-7|JMD8[b6qX7x2ظ׻7G-_sH7?$8k5z'8888I޹5: zij8K8뒸{R6ï9].{ 8J678=8VDm8e8e~6Nm Dǒ6/l8*ȹ&N)76]/8B77x"XxZ(1'k7 =![8\6* 8sd-߸ʂƳastrometry.net-0.67/sdss/testdata/psf01k.fits000644 000765 000024 00000034100 12651445460 021344 0ustar00dstnstaff000000 000000 SIMPLE = T /Primary Header created by MWRFITS v1.11 BITPIX = -32 / NAXIS = 2 / NAXIS1 = 51 / NAXIS2 = 51 / EXTEND = T /Extensions may be present END 8V8 :=_ȵMxJ7 is80X7в7}771)$7 b8{F88T4K7ڿ6XvGj̸=ajXpl8b6\88òd7X&5ŭ}6ɷO l/Q6j08+5ָ]Ul.$ط/N-J6MظO/$8oSb:H7kζ"7C5rIYRw7.8Um=zζT7ږF8#;ZG7θ8-(78d753 pzϻ8k%VdP𝖷 uܙ7856D)L6F7P.8fjL7@4@8387.ظ7!$8K7GܸB8o޻6%1@8~/aq8y 7Щ7ָ9\mb7shE87g8Ӷdp88ٰ7U,p6ַ+8:8 7d8M:6V8'4778gI5@ωxж77Ǹdr7i$B8vϠ7WooE$7 /q$ Ҳ4VC 6`78s{9 8;=N7@7 ^n rn^8h@7 ;7`V8C8h477>guП)z8G5?A868|9L8f8c89l:tO8S:8o7ym7ǃ|іxV!7 G66&8r6cW82O80F!ʸe8q j8a8ˮ889 192L98/7j$v̆88t'8`k6MLC7b7K7Ya¸c"~F)7kr8 b:%»8-!8a9*O9#8K9Y 9Zi9%U=9}9#9jT988-7W8 8VK{=7vVH8Ը`!;ո8J6@'7K }71Ÿ?]8g8_88濵96|N9 9aNv9U9j9ީ:_9{95n9^{9yu88@ [8#7L6Hĸ 8B[7T7۳_8Xy7X6[8VB8^0$4@879!J99?E9f9o:&:fM:I:!j::O:?99T9C8[88##8Sܷ"vs߈FڷfgL8g97ָ?#M78R@څ893k)96:_:gg:t::;4: :D$:4499^8?988ʪ7fr8b߸MA0uo ι1]̊8Rr8)8#R88H8s9Β:,iv:;;\!;g;;;8'::R99O9a~8t9>#||8 >8P7P8u7дH88Po)8Z9!9):-12:u;Iy;9e9,H:z:b);b6L=49}288B8 ?j8y&84k4D4۞"WvA7108a88e8Q9a:\ :e;-YKV9 8].8 /jl,(VK L8:7p 8KCq4M|4v"[8@7Cl7/8]8tѿHz7R'8948P8R:7L8gpFΟ878B\ެBCݕ#88" y887Hc78l4es$7h)zP888~@,.7$J $T5U͌8V8Kv2 8x8(ե788BO oL87"Ð77돶cϸ͸yEh8e8k6~8 "Ǹ<m1 7IX8!R8HŸ(n8%÷yָuM8Be7 ,w7 7"7F8<7<) 5\P߸Klg77m8&8 Kڹi8^%KJ<7)nTѬXm5@0*etؐ78"28'za7#<8f~ʸmW|J@ \ѸP8T:k7bU7RLH5`97J 7ր!ҷ`a6JF¶8'/7ʸG8ɖ8Fҵ: 7삸7p8 ܙ88ֱw7f׸y7 6ގ78Z487VcO릸:37x8oP*888'7W9A8|7nQ9^<99a9_\88e18;<7M87? vUݸ 7gjY X t8b7CҸw5M89/9 U&9_9%9*+9t9(99l9 9#e 9~888iF8B,7ŌF7"(8]R.Y7r\7CԸnJL8C@8 ~8z9B9Ծ9z99ʳ::=:TX9Ӱ9 9a{8)7˱8j7u777z8J._=7öƸ^8$R88_N~8L 8j9i9:dc:&:N: :: :H99` 9QU8d8H&88C8 7j} 4I7A8ZK~:nQ;O\;\5($~w88Q;7D88(9}C:K?:Ź;s^θ >8<7M68d8 8Q9: 9:Z_:;<ɹ==D=h=m<3x;g7:$:|+l9V9N8188G]7F826kʸ3'al7X8F818iX8ԝ9 9Jq9{ :L :C;?==&8489@:Te:G ::(?:Ü%:¿:yi:3:NY999Nx828b8k28 l6688Mu 8^6L*$67k0r67(8K76kI8 ,9]999y-:H\:-8:Fs:yx:`U:< :-A996Y8[8Y88*_8 i7N676sY7tJXa8 5ƸE8*4889&8q95<91F9>9M99X`999ёi9y9q588^8BR8!v7z\n898iN68 u8Z$L8PaH8y6о8_8?v8X8A8*k9 j9=9$9029~9o329ka:9<"8)8 87A8$}07-7峸kG7 ]-7LC;Ը_M 0748O,7\&8 \8Ƕ8*B8898KI88#R-9&G9J93kZ79Y(81g7&l 1#I698*7Q26\76D7{*7Ť5D6!>7t87U.u8+z7Hp4AJ8>[&8i98if 7 8bFe7Bd8Ww8Fc=$?26e*S\C{m8Wv8"-77m77Mi84_6<|D.8J8?8738M8eHʣ8GXi8 8b8:k"4(7͘7uI쩨7hw89Nj8@8(>m+X)8?8.]8W/'޸78zJ7L7mW6ַ8"ci6˷7gX8f6X-ln57+J晆6y=7X(8}7̸K <7]6Pb8l6, 8 7?O8"U6ė7Q6K"̚9R7Ϊnl8\FJϴc7fH@Q5?70|7R.g&8b85`p۶W׸\8^8{kT!ܬY6b\0@ h7xx7#*7#8p d<7]kt58Rx8 nA78#@h% (ڷ +`7 (ɸb##t8U^ظm7^>8Z48Pฑ"V)n!&~7|7COl7[08R[ 7q6ڎ z8608C˾xh?n8N7+7Gi¸p /7\f&µ7 7x7sq>73$cuvastrometry.net-0.67/sdss/testdata/psf1k0.fits000644 000765 000024 00000034100 12651445460 021344 0ustar00dstnstaff000000 000000 SIMPLE = T /Primary Header created by MWRFITS v1.11 BITPIX = -32 / NAXIS = 2 / NAXIS1 = 51 / NAXIS2 = 51 / EXTEND = T /Extensions may be present END 7Q#g? M|۸8?A8-8T|8#*L-89 ,39 8o66"FowP@.&8D g192*79U?7v7B@8+38io7H8ع7쥹/Oc8񟷑T0 b88?J@8L684$ЦZ8C9!a!8g9F+p06QXx8*" 7%u7 H9I`|H99j9YN$8w 8adN8%P<8rܾm WYG88jDȀ.88:B8v|7;9 o28L09d9MT:c--8Ie 89C87u.X8o99%:JP8Lf8.\ b>-7쬶18E$BDr9{ 6^!g08<ƹ}99Xn߶h9s^[O478j 7fd9i(6ܨ85P8/.9ɸ: :N rbȹK8b(7p8y{8?ո(7ڸf9)I>t8K4/߸ۤ8^8}F7axߚ40)08dָ޹B8Vb/P8-7vָ}8\8=7 9*;89 ·9 ]9/(+m|9S?9i8e893$7:Y}:8##Z9*87% @8f07V46v9)7Ju8@ uQ!889f~9Fel=ɷZL89y9k9O9cɖ7f8HbM7e8Ĝk8{/90sm|'8/ظE,ƸHEgN8~M^7$0h79t0g8808ַH88/3h~ pzR\Tv88w67n8W9Fb96~9:yp:@;bM;f;;F;;A: :O:.”99N~895~7(83:͌o 2/S8W#8~9/cY8HN5 i78A9c59:n-:;Qu;\LO;J!::Gk9!9 92`88iIBЭq\޸C7cι%E49f,IPz987N9,:K:/;3,۸+{uM@8(908*T7 89s(:4ǒ:%;;=;%;<;fdn;/:PD:39698>9V98%!7Z~1^{ι` 8>8ʼd8]O7(gx9B88G9*9'=9f:P:=Nj:6 ::ұ0;t:f:W':|,99ʷ!97:,v9tL8'd7g\r9Q829 g9FR8XY8s7tܷ"8~ԩ8g81o8ځ/yj6뜷Xt8`8;hZ7h88`7>Ҋhg9f97878f9[6Z|8׳.Lcc8%Z6Y7T8 8B8yFU8xr8´7δVo\8R59 @8# 8A8"Rⷤ8HøL- 8 ɷx"8ʘ~5*8(88XZԏ&8Qa:9l#+4>ظv9F889gGQ^9x9;9ہ&9X?ǰ: TظMg< l: pĸyop: s95BSɹFFZ9+:(8'8I1GOFZ~6 9*[j: 8@ڈf7'z`Ns948R9@6.t9O9H9hN9g80r9}N-)9[7k0.9ܩj8%7 r90{8úE728;;9~7T}G92:GS9Ȼ=:88@\:7:vZ9W6298R9m799}t9]8LJ9%=99̸qҸ*7zƺ aW89$qN8Ζvi9.8)9Ը);yv9:&\9[냹9sm8cX!Փ:,1J9B9y5Ϲp.y9:幨@9vP99pź8b9g:f 8c99wC)g<59/:#K:r:/699:9}6@9im9(:BƸ9OR:D:"ǵP9@v9ŀ7RM760.9B!9K4989:,^8ιeJ8I:I9H9k9k?:f:fV9$9z$9W9R7`9^e&5@7=8Qʇc*'f:9:7ǹ#$8p9&9l=9B9:9B:1:m::1:eH:Ah:)90 9Q ;幻|: D͹aj9%ghX:%9=\G7Yи=Bp439;"9M9T:?:.:m;x;<:Q:j:@:K19<:N=9B|8VDַq`:A63Ue9p?x8|?Qš 936Ǔ9a&939:I:4:; B;k;V;J;C;cF::g= t95_@o8B¹BP<899{y9<,9^ɸ*:9S9Z9"83^:NB|:MK9nlD;;;;P<̀<(6Ì.m$9J87<9:!+7; ?8$d99N9> 9g: :);j#<o\=z=ٽ=~/=<(<:s:^9/Ĺ9a9^k:0u9+<9(8\8.ޚAǓ1$oTf=zV!|9ܡ9C#09PN<:-q9m;88N9t9::nt:>:jN;<:<ܩ<թL9_L-Y8d99pp8:Kg^z08:Ga:SN::M4:K2:.E:k:;s8b:enP\H&9,99ŸR2?ٴ9ul:ڸ9Ř481#8z9+m9 9t'9WZ99"IZZ:PJ:)L9>8]KP9h9Iq:#$:; 8:'I8Z89 9w> pxo:1 9e0:\:T㸸<:ĸr:(83<:ti:9 89:%ɹs9,:2dHx:&`9 wv"8|a`9M9D1幒uLIߖW!f93"9V&uCE9X77 ҸQ[t94:"A98z9Bb8I8рgb9l9%=8Y9399[{a|90KWZT1L8ɶ959ⷩ^0`Mh 9990e9z89lӹ3.9366T9 s͸`:b8wLCtӘ/Zt9k8xو7Lҹz9r9v8 09 \ó>Xُ>DJ~Q>&\(þF6̹u0?87?곧I?$)'?jB$?'A}r>GW>6D a>Z؊&Q>MK8R?H'J'?s?nSw?%p?S!le?sݐzo~A);;%ׂ +`?#']?!V2?4I0?&DX:?.!Xо|D7yhȗKξǝnxU!8'C7=n*u =õQ=̑=ƀ=_9=~k1@?j~ \?a??1,DDTa?FOʞ?30̯h??AH>.?g=ӽ־2&ɾP¾O(޾ό}r&=<=O<=ϑ* =<=gZ>a(XPƿGx<𔿗x("K+Iz='7 R1nWo:Mi\"RmBm^Bv`Ϯ?&Con[v%@`)H`*JL׳.%ӟT s@?@Y@Y@Y@A@Of9@49X@;@H?TAA?mȠ?ԕ?@ ? 3??? ?@?3֠?? ?]+?;`?(CO!i\' a_;~:S:B :<^; f?>*ȣ=Z=$)=Dujt”ΤlB!rAAgJAA.?0901}a120j0`1|1K2K0l`0Ԡ121U2 >==$=Sv=5@=`"?;&?Z0??׍?.:l::::'9??>)?Z#?0?ר?:P::u:a:&?;5?Y??پ?:(::W::@%?<0?Z?0?(?:z:1::|: xp/.$s?aH?^>혾>??m>O>C={f=I{=0=Zq,,_,v,-ؚHۧȈ(N)ylBdh¶@@Bdh -&<3<3!> >Ǖ?h??V\?m? =^=$=><<<3ֿ<.<04<4<3}@@@dv@eL@!@`On@@Es@5}@ Y@(?6?R?2?:=_:=yGZ=C8<;&DzD?CF^yB2g@5?$!>o= <`<^DzD !IC3uB![@G?>H='f;; DD:rCBA(?>=C!wM=eY/ =6<%+@;"`DʓD C@B@=?u}>Y= D /D CbC-dLB }@?pC>;-=_X;:A&>k@͕@u?ð>}<3c;ŷ:%9OA(7@>4@4?3.=X<;c}:F:9-d8ҠA+@",?k>x=F=<;>:9f882A-M @@>Lu=V<-|;+:]F9p8A.D@:@u><=IC<)c;:9 98ޕ@ H@@@Q@{@R?G?g =@?H==astrometry.net-0.67/qfits-an/anqfits.c000644 000765 000024 00000112537 12651445460 020132 0ustar00dstnstaff000000 000000 /* This file was added by the Astrometry.net team. Copyright 2007,2010 Dustin Lang. Copyright 2013 Dustin Lang. Licensed under GPL v2 or later. */ #include #include #include #include #include #include #include #include #include #include "anqfits.h" #include "qfits_std.h" #include "qfits_error.h" #include "qfits_tools.h" #include "qfits_table.h" #include "qfits_memory.h" #include "qfits_rw.h" #include "qfits_card.h" #include "qfits_image.h" #include "qfits_convert.h" #include "qfits_byteswap.h" #include "ioutils.h" #include "errors.h" #if 0 //#if 1 #define qdebug( code ) { code } #define debug printf #else #define qdebug( code ) {} #define debug(args...) #endif int fits_get_atom_size(tfits_type type) { int atomsize = -1; switch (type) { case TFITS_BIN_TYPE_A: case TFITS_BIN_TYPE_X: case TFITS_BIN_TYPE_L: case TFITS_BIN_TYPE_B: atomsize = 1; break; case TFITS_BIN_TYPE_I: atomsize = 2; break; case TFITS_BIN_TYPE_J: case TFITS_BIN_TYPE_E: atomsize = 4; break; case TFITS_BIN_TYPE_K: case TFITS_BIN_TYPE_D: atomsize = 8; break; default: break; } return atomsize; } int fits_convert_data_2(void* vdest, int deststride, tfits_type desttype, const void* vsrc, int srcstride, tfits_type srctype, int arraysize, size_t N, double bzero, double bscale) { size_t i; int j; char* dest = vdest; const char* src = vsrc; int destatomsize = fits_get_atom_size(desttype); int srcatomsize = fits_get_atom_size(srctype); anbool scaling = (bzero != 0.0) || (bscale != 1.0); // this loop is over rows of data for (i=0; iNexts; } off_t anqfits_header_start(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (ext < 0 || ext >= qf->Nexts) { ERROR("Failed to get header start for file \"%s\" ext %i: ext not in range [0, %i)", qf->filename, ext, qf->Nexts); return -1; } return (off_t)qf->exts[ext].hdr_start * (off_t)FITS_BLOCK_SIZE; } off_t anqfits_header_size(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (ext < 0 || ext >= qf->Nexts) { ERROR("Failed to get header size for file \"%s\" ext %i: ext not in range [0, %i)", qf->filename, ext, qf->Nexts); return -1; } return (off_t)qf->exts[ext].hdr_size * (off_t)FITS_BLOCK_SIZE; } off_t anqfits_data_start(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (ext < 0 || ext >= qf->Nexts) { ERROR("Failed to get data start for file \"%s\" ext %i: ext not in range [0, %i)", qf->filename, ext, qf->Nexts); return -1; } return (off_t)qf->exts[ext].data_start * (off_t)FITS_BLOCK_SIZE; } off_t anqfits_data_size(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (ext < 0 || ext >= qf->Nexts) { ERROR("Failed to get data size for file \"%s\" ext %i: ext not in range [0, %i)", qf->filename, ext, qf->Nexts); return -1; } return (off_t)qf->exts[ext].data_size * (off_t)FITS_BLOCK_SIZE; } int anqfits_get_data_start_and_size(const anqfits_t* qf, int ext, off_t* pstart, off_t* psize) { if (pstart) { *pstart = anqfits_data_start(qf, ext); if (*pstart == -1) return -1; } if (psize) { *psize = anqfits_data_size(qf, ext); if (*psize == -1) return -1; } return 0; } int anqfits_get_header_start_and_size(const anqfits_t* qf, int ext, off_t* pstart, off_t* psize) { if (pstart) { *pstart = anqfits_header_start(qf, ext); if (*pstart == -1) return -1; } if (psize) { *psize = anqfits_header_size(qf, ext); if (*psize == -1) return -1; } return 0; } qfits_header* anqfits_get_header(const anqfits_t* qf, int ext) { const qfits_header* hdr = anqfits_get_header_const(qf, ext); if (!hdr) return NULL; return qfits_header_copy(hdr); } qfits_header* anqfits_get_header2(const char* fn, int ext) { qfits_header* hdr; anqfits_t* anq = anqfits_open(fn); if (!anq) { qfits_error("Failed to read FITS file \"%s\"", fn); return NULL; } hdr = anqfits_get_header(anq, ext); anqfits_close(anq); return hdr; } qfits_header* anqfits_get_header_only(const char* fn, int ext) { qfits_header* hdr; anqfits_t* anq = anqfits_open_hdu(fn, ext); if (!anq) { qfits_error("Failed to read FITS file \"%s\" to extension %i", fn, ext); return NULL; } hdr = anqfits_get_header(anq, ext); anqfits_close(anq); return hdr; } /* // copied from util/ioutils.c static char* file_get_contents_offset(const char* fn, int offset, int size) { char* buf; FILE* fid; fid = fopen(fn, "rb"); if (!fid) { fprintf(stderr, "file_get_contents_offset: failed to open file \"%s\": %s\n", fn, strerror(errno)); return NULL; } buf = malloc(size); if (!buf) { fprintf(stderr, "file_get_contents_offset: couldn't malloc %lu bytes.\n", (long)size); return NULL; } if (offset) { if (fseeko(fid, offset, SEEK_SET)) { fprintf(stderr, "file_get_contents_offset: failed to fseeko: %s.\n", strerror(errno)); return NULL; } } if (fread(buf, 1, size, fid) != size) { fprintf(stderr, "file_get_contents_offset: failed to read %lu bytes: %s\n", (long)size, strerror(errno)); free(buf); return NULL; } fclose(fid); return buf; } */ const qfits_header* anqfits_get_header_const(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (!qf->exts[ext].header) { off_t start, size; char* str; start = anqfits_header_start(qf, ext); size = anqfits_header_size (qf, ext); if ((start == -1) || (size == -1)) { ERROR("failed to get header start + size for file \"%s\" extension %i", qf->filename, ext); return NULL; } str = file_get_contents_offset(qf->filename, (int)start, (int)size); if (!str) { ERROR("failed to read \"%s\" extension %i: offset %i size %i\n", qf->filename, ext, (int)start, (int)size); return NULL; } qf->exts[ext].header = qfits_header_read_hdr_string ((unsigned char*)str, (int)size); } return qf->exts[ext].header; } // Returns a newly-allocated array containing the raw header bytes for the // given extension. char* anqfits_header_get_data(const anqfits_t* qf, int ext, int* Nbytes) { FILE* fid; off_t N, nr; char* data; off_t start; start = anqfits_header_start(qf, ext); if (start == -1) return NULL; N = anqfits_header_size(qf, ext); if (N == -1) return NULL; fid = fopen(qf->filename, "rb"); if (!fid) { return NULL; } data = malloc(N + 1); if (start) { if (fseeko(fid, start, SEEK_SET)) { SYSERROR("Failed to seek to start of FITS header: byte %li in %s", (long int)start, qf->filename); return NULL; } } nr = fread(data, 1, N, fid); fclose(fid); if (nr != N) { free(data); return NULL; } data[N] = '\0'; if (Nbytes) *Nbytes = N; return data; } qfits_table* anqfits_get_table(const anqfits_t* qf, int ext) { const qfits_table* t = anqfits_get_table_const(qf, ext); if (!t) return NULL; return qfits_table_copy(t); } const qfits_table* anqfits_get_table_const(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (!qf->exts[ext].table) { const qfits_header* hdr = anqfits_get_header_const(qf, ext); off_t begin, size; if (!hdr) { qfits_error("Failed to get header for ext %i\n", ext); return NULL; } if (anqfits_get_data_start_and_size(qf, ext, &begin, &size)) { ERROR("failed to get data start and size"); return NULL; } qf->exts[ext].table = qfits_table_open2(hdr, begin, size, qf->filename, ext); } return qf->exts[ext].table; } anqfits_image_t* anqfits_get_image(const anqfits_t* qf, int ext) { const anqfits_image_t* t = anqfits_get_image_const(qf, ext); anqfits_image_t* tout; if (!t) return NULL; tout = anqfits_image_new(); memcpy(tout, t, sizeof(anqfits_image_t)); return tout; } const anqfits_image_t* anqfits_get_image_const(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (!qf->exts[ext].image) { anqfits_image_t* img; const qfits_header* hdr = anqfits_get_header_const(qf, ext); int naxis1, naxis2, naxis3; if (!hdr) { qfits_error("Failed to get header for ext %i\n", ext); return NULL; } img = anqfits_image_new(); // from qfits_image.c : qfitsloader_init() img->bitpix = qfits_header_getint(hdr, "BITPIX", -1); img->naxis = qfits_header_getint(hdr, "NAXIS", -1); naxis1 = qfits_header_getint(hdr, "NAXIS1", -1); naxis2 = qfits_header_getint(hdr, "NAXIS2", -1); naxis3 = qfits_header_getint(hdr, "NAXIS3", -1); img->bzero = qfits_header_getdouble(hdr, "BZERO", 0.0); img->bscale = qfits_header_getdouble(hdr, "BSCALE", 1.0); if (img->bitpix == -1) { qfits_error("Missing BITPIX in file %s ext %i", qf->filename, ext); goto bailout; } if (!((img->bitpix == 8) || (img->bitpix == 16) || (img->bitpix == 32) || (img->bitpix == -32) || (img->bitpix == -64))) { qfits_error("Invalid BITPIX %i in file %s ext %i", img->bitpix, qf->filename, ext); goto bailout; } img->bpp = BYTESPERPIXEL(img->bitpix); if (img->naxis < 0) { qfits_error("No NAXIS in file %s ext %i", qf->filename, ext); goto bailout; } if (img->naxis==0) { qfits_error("NAXIS = 0 in file %s ext %i", qf->filename, ext); goto bailout; } if (img->naxis > 3) { qfits_error("NAXIS = %i > 3 unsupported in file %s ext %i", img->naxis, qf->filename, ext); goto bailout; } /* NAXIS1 must always be present */ if (naxis1 < 0) { qfits_error("No NAXIS1 in file %s ext %i", qf->filename, ext); goto bailout; } img->width = 1; img->height = 1; img->planes = 1; switch (img->naxis) { case 1: img->width = naxis1; break; case 3: if (naxis3 < 0) { qfits_error("No NAXIS3 in file %s ext %i", qf->filename, ext); goto bailout; } img->planes = naxis3; // no break: fall through to... case 2: if (naxis2 < 0) { qfits_error("No NAXIS2 in file %s ext %i", qf->filename, ext); goto bailout; } img->height = naxis2; img->width = naxis1; break; } qf->exts[ext].image = img; return img; bailout: anqfits_image_free(img); return NULL; } return qf->exts[ext].image; } /* static int starts_with(const char* str, const char* start) { int len = strlen(start); return strncmp(str, start, len) == 0; } */ static const char* blankline = " "; static int parse_header_block(const char* buf, qfits_header* hdr, int* found_it) { char getval_buf[FITS_LINESZ+1]; char getkey_buf[FITS_LINESZ+1]; char getcom_buf[FITS_LINESZ+1]; char line_buf[FITS_LINESZ+1]; // Browse through current block int i; const char* line = buf; for (i=0; ifilename = strdup(filename); qf->exts = calloc(ext_capacity, sizeof(anqfits_ext_t)); assert(qf->exts); if (!qf->exts) goto bailout; // Set first HDU offsets qf->exts[0].hdr_start = 0; qf->exts[0].data_start = n_blocks; qf->exts[0].header = hdr; hdr = NULL; qf->Nexts = 1; debug("Extensions? %s\n", xtend ? "yes":"no"); if (xtend) { /* Look for extensions */ /* * Register all extension offsets */ hdr = qfits_header_new(); end_of_file = 0; while (!end_of_file) { if (qf->Nexts-1 == hdu) { debug("Stopped reading after finding HDU %i\n", hdu); //printf("Stopped reading after HDU %i\n", hdu); // Could cache the file offset to continue reading later... break; } /* * Skip the previous data section if pixels were declared */ if (data_bytes > 0) { /* Skip as many blocks as there are declared pixels */ size_t off; skip_blocks = qfits_blocks_needed(data_bytes); off = skip_blocks; off *= (size_t)FITS_BLOCK_SIZE; seeked = fseeko(fin, off, SEEK_CUR); if (seeked == -1) { qfits_error("anqfits: failed to fseeko in file %s: %s", filename, strerror(errno)); goto bailout; } debug("hdu %i, data_bytes %zu, skip_blocks %zu, off %zu, n_blocks %zu\n", qf->Nexts-1, data_bytes, skip_blocks, off, n_blocks); /* Increase counter of current seen blocks. */ n_blocks += skip_blocks; data_bytes = 0; } /* Look for extension start */ found_it = 0; while (!found_it && !end_of_file) { if (fread(buf, 1, FITS_BLOCK_SIZE, fin) != FITS_BLOCK_SIZE) { /* Reached end of file */ end_of_file = 1; break; } n_blocks++; /* Search for XTENSION at block top */ if (starts_with(buf, "XTENSION=")) { debug("Found XTENSION\n"); /* Got an extension */ found_it = 1; qf->exts[qf->Nexts].hdr_start = n_blocks-1; } else { qfits_warning("Failed to find XTENSION in the FITS block following the previous data block -- whaddup? Filename %s, block %i, hdu %i", filename, n_blocks, qf->Nexts-1); } // FIXME -- should we really just skip the block if we don't find the "XTENSION=" header? } if (end_of_file) break; // Look for extension END n_blocks--; found_it = 0; firsttime = 1; if (!hdr) hdr = qfits_header_new(); while (!found_it && !end_of_file) { if (!firsttime) { if (fread(buf, 1, FITS_BLOCK_SIZE, fin) != FITS_BLOCK_SIZE) { qdebug(printf("anqfits: XTENSION without END in %s\n", filename);); end_of_file = 1; break; } } firsttime = 0; n_blocks++; if (parse_header_block(buf, hdr, &found_it)) { debug("parse_header_block() failed: bailing\n"); goto bailout; } debug("parse_header_block() succeeded: found END? %s\n", found_it ? "yes":"no"); } if (found_it) { data_bytes = get_data_bytes(hdr); debug("This data block will have %zu bytes\n", data_bytes); qf->exts[qf->Nexts].data_start = n_blocks; qf->exts[qf->Nexts].header = hdr; hdr = NULL; qf->Nexts++; if (qf->Nexts >= ext_capacity) { ext_capacity *= 2; qf->exts = realloc(qf->exts, ext_capacity * sizeof(anqfits_ext_t)); assert(qf->exts); if (!qf->exts) goto bailout; } } } } debug("Found %i extensions\n", qf->Nexts); if (hdr) qfits_header_destroy(hdr); hdr = NULL; /* Close file */ fclose(fin); fin = NULL; // realloc qf->exts = realloc(qf->exts, qf->Nexts * sizeof(anqfits_ext_t)); assert(qf->exts); if (!qf->exts) goto bailout; for (i=0; iNexts; i++) { qf->exts[i].hdr_size = qf->exts[i].data_start - qf->exts[i].hdr_start; if (i == qf->Nexts-1) { debug("st_size %zu, /block_size = %zu\n", (size_t)sta.st_size, (size_t)(sta.st_size / (size_t)FITS_BLOCK_SIZE)); qf->exts[i].data_size = ((sta.st_size/FITS_BLOCK_SIZE) - qf->exts[i].data_start); } else qf->exts[i].data_size = (qf->exts[i+1].hdr_start - qf->exts[i].data_start); debug(" Ext %i: header size %i, data size %i; hdr=%p\n", i, qf->exts[i].hdr_size, qf->exts[i].data_size, qf->exts[i].header); debug("ext %i: hdr_start %i, hdr_size %i, data_start %i, data_size %i, blocks\n", i, qf->exts[i].hdr_start, qf->exts[i].hdr_size, qf->exts[i].data_start, qf->exts[i].data_size); } qf->filesize = sta.st_size / FITS_BLOCK_SIZE; return qf; bailout: if (hdr) qfits_header_destroy(hdr); if (fin) fclose(fin); if (qf) { free(qf->filename); free(qf->exts); free(qf); } return NULL; } void anqfits_close(anqfits_t* qf) { int i; if (!qf) return; for (i=0; iNexts; i++) { if (qf->exts[i].header) qfits_header_destroy(qf->exts[i].header); if (qf->exts[i].table) qfits_table_close(qf->exts[i].table); if (qf->exts[i].image) anqfits_image_free(qf->exts[i].image); } free(qf->exts); free(qf->filename); free(qf); } anqfits_image_t* anqfits_image_new() { anqfits_image_t* img = calloc(1, sizeof(anqfits_image_t)); assert(img); return img; } void anqfits_image_free(anqfits_image_t* img) { free(img); } tfits_type anqfits_ptype_to_ttype(int ptype) { switch (ptype) { case PTYPE_UINT8: return TFITS_BIN_TYPE_B; case PTYPE_INT16: return TFITS_BIN_TYPE_I; case PTYPE_INT: return TFITS_BIN_TYPE_J; case PTYPE_FLOAT: return TFITS_BIN_TYPE_E; case PTYPE_DOUBLE: return TFITS_BIN_TYPE_D; } qfits_error("Unknown ptype %i\n", ptype); assert(0); return -1; } void* anqfits_readpix(const anqfits_t* qf, int ext, int x0, int x1, int y0, int y1, /** The plane you want, from 0 to planes-1 */ int plane, /** Pixel type you want (PTYPE_FLOAT, PTYPE_INT or PTYPE_DOUBLE) */ int ptype, void* output, int* pW, int* pH) { const anqfits_image_t* img = anqfits_get_image_const(qf, ext); //off_t NX, NY; //off_t planesize; off_t start; off_t size; off_t mapstart; size_t mapsize; int mapoffset; char* map = NULL; FILE* f = NULL; char* datastart; char* rowstart; char* outrowstart; off_t outrowsize; int x, y; off_t inlinesize; char* inlinebuf = NULL; int inptype; char* alloc_output = NULL; int outbpp; tfits_type in_ttype, out_ttype; if (x0) { if ((x0 < 0) || (x1 && (x0 >= x1)) || (x0 >= img->width)) { qfits_error("Invalid x0=%i not in [0, x1=%i <= W=%i) reading %s ext %i", x0, x1, img->width, qf->filename, ext); return NULL; } } if (y0) { if ((y0 < 0) || (y1 && (y0 >= y1)) || (y0 >= img->height)) { qfits_error("Invalid y0=%i not in [0, y1=%i <= W=%i) reading %s ext %i", y0, y1, img->height, qf->filename, ext); return NULL; } } if (x1) { if ((x1 < 0) || (x1 <= x0) || (x1 > img->width)) { qfits_error("Invalid x1=%i not in [0, x0=%i, W=%i) reading %s ext %i", x1, x0, img->width); return NULL; } } else { x1 = img->width; } if (y1) { if ((y1 < 0) || (y1 <= y0) || (y1 > img->height)) { qfits_error("Invalid y1=%i not in [0, y0=%i, H=%i) reading %s ext %i", y1, y0, img->height); return NULL; } } else { y1 = img->height; } if ((plane < 0) || (plane >= img->planes)) { qfits_error("Plane %i not in [0, %i) reading %s ext %i\n", plane, img->planes, qf->filename, ext); return NULL; } //NX = x1 - x0; //NY = y1 - y0; //planesize = img->width * img->height * (off_t)img->bpp; f = fopen(qf->filename, "rb"); if (!f) { qfits_error("Failed to fopen %s: %s\n", qf->filename, strerror(errno)); return NULL; } start = ((off_t)qf->exts[ext].data_start * (off_t)FITS_BLOCK_SIZE + ((off_t)y0 * img->width + (off_t)x0) * (off_t)img->bpp); size = (((off_t)(y1 - y0 - 1) * img->width + (off_t)(x1 - x0)) * (off_t)img->bpp); get_mmap_size(start, size, &mapstart, &mapsize, &mapoffset); int mode, flags; mode = PROT_READ; flags = MAP_SHARED; map = mmap(0, mapsize, mode, flags, fileno(f), mapstart); if (map == MAP_FAILED) { qfits_error("Failed to mmap file %s: %s", qf->filename, strerror(errno)); map = NULL; goto bailout; } fclose(f); f = NULL; datastart = map + mapoffset; /* if (fseeko(f, start, SEEK_SET)) { qfits_error("Failed to fseeko(%zu) in file %s ext %i: %s\n", start, qf->filename, ext, strerror(errno)); goto bailout; } */ inlinesize = (off_t)(x1 - x0) * (off_t)img->bpp; inlinebuf = malloc(inlinesize); switch (img->bitpix) { case 8: inptype = PTYPE_UINT8; break; case 16: inptype = PTYPE_INT16; break; case 32: inptype = PTYPE_INT; break; case -32: inptype = PTYPE_FLOAT; break; case -64: inptype = PTYPE_DOUBLE; break; default: qfits_error("Unknown bitpix %i\n", img->bitpix); goto bailout; } in_ttype = anqfits_ptype_to_ttype(inptype); out_ttype = anqfits_ptype_to_ttype(ptype); outbpp = qfits_pixel_ctype_size(ptype); if (!output) { output = alloc_output = malloc((off_t)(x1-x0) * (off_t)(y1-y0) * (off_t)outbpp); } rowstart = datastart; outrowstart = output; outrowsize = (off_t)outbpp * (off_t)(x1-x0); // Rows... for (y=y0; ybpp * (off_t)(x1-x0)); rowstart += (off_t)img->bpp * img->width; #ifndef WORDS_BIGENDIAN char* ptr = inlinebuf; for (x=x0; xbpp); ptr += img->bpp; } #endif // passthrough? if ((img->bzero == 0.0) && (img->bscale == 1.0) && (inptype == ptype)) { memcpy(outrowstart, inlinebuf, outrowsize); outrowstart += outrowsize; continue; } // we treat these as "arrays" since both the input and output // are contiguous; hence no stride needed, and N=1. if (fits_convert_data_2(outrowstart, 0, out_ttype, inlinebuf, 0, in_ttype, x1-x0, 1, img->bzero, img->bscale)) { qfits_error("Failed to fits_convert_data_2\n"); goto bailout; } outrowstart += outrowsize; } munmap(map, mapsize); free(inlinebuf); if (pW) *pW = (x1 - x0); if (pH) *pH = (y1 - y0); return output; bailout: free(inlinebuf); free(alloc_output); fclose(f); if (map) { munmap(map, mapsize); } return NULL; } astrometry.net-0.67/qfits-an/AUTHORS000644 000765 000024 00000000175 12651445460 017363 0ustar00dstnstaff000000 000000 Nicolas Devillard ndevilla@gmail.com Initial author Yves Jung yjung@eso.org Maintainer since 2002 astrometry.net-0.67/qfits-an/doc/000755 000765 000024 00000000000 12651445460 017055 5ustar00dstnstaff000000 000000 astrometry.net-0.67/qfits-an/Makefile000644 000765 000024 00000002674 12651445460 017761 0ustar00dstnstaff000000 000000 FILES := anqfits qfits_card qfits_convert qfits_error qfits_header \ qfits_image qfits_md5 qfits_table qfits_time qfits_tools qfits_byteswap \ qfits_memory qfits_rw qfits_float OBJS := $(addsuffix .o,$(FILES)) md5.o SRCS := $(addsuffix .c,$(FILES)) md5.c HEADERS := $(addsuffix .h,$(FILES)) qfits_keywords.h qfits_std.h # md5.h is not listed; doesn't need to be installed. HEADERS_PATH := $(addprefix $(INCLUDE_DIR)/,$(HEADERS)) QFITS_LIB_FILE := libqfits.a all: $(QFITS_LIB_FILE) .PHONY: all BASEDIR := .. COMMON := $(BASEDIR)/util include $(COMMON)/makefile.common include $(COMMON)/makefile.anbase INC := $(ANBASE_INC) CFLAGS += $(CFLAGS_DEF) CFLAGS += $(ANBASE_CFLAGS) CFLAGS += -I. CFLAGS += $(INC) LDFLAGS += $(LDFLAGS_DEF) LDLIBS := $(LDLIBS_DEF) LDLIBS += $(ANBASE_LIB) $(QFITS_LIB_FILE): $(OBJS) -rm -f $@ $(AR) rc $@ $^ $(RANLIB) $@ install: $(QFITS_LIB_FILE) $(HEADERS) @echo Installing in base directory '$(INSTALL_DIR)' mkdir -p '$(INCLUDE_INSTALL_DIR)' mkdir -p '$(LIB_INSTALL_DIR)' @for x in $(HEADERS); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ done @for x in $(QFITS_LIB_FILE); do \ echo cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ done .PHONY: install DEP_OBJ := $(OBJS) ifneq ($(MAKECMDGOALS),clean) include $(COMMON)/makefile.deps endif clean: rm -f $(QFITS_LIB_FILE) $(OBJS) *.dep *~ deps .PHONY: clean astrometry.net-0.67/qfits-an/md5.c000644 000765 000024 00000023122 12651445460 017141 0ustar00dstnstaff000000 000000 /* $Id: md5.c,v 1.6 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.6 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include "md5.h" /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ static void byteReverse(unsigned char *buf, unsigned longs); /*----------------------------------------------------------------------------*/ /** * @defgroup md5 MD5 message-digest algorithm * * The algorithm is due to Ron Rivest. This code was written by Colin Plumb * in 1993, no copyright is claimed. This code is in the public domain; do * with it what you wish. * Equivalent code is available from RSA Data Security, Inc. This code has * been tested against that, and is equivalent, except that you don't need to * include two pages of legalese with every copy. * To compute the message digest of a chunk of bytes, declare an MD5Context * structure, pass it to MD5Init, call MD5Update as needed on buffers full of * bytes, and then call MD5Final, which will fill a supplied 16-byte array with * the digest. */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(struct MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) { register word32 t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((word32) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = 64 - t; if (len < t) { memmove(p, buf, len); return; } memmove(p, buf, t); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (word32 *) ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memmove(ctx->in, buf, 64); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (word32 *) ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memmove(ctx->in, buf, len); } /* * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Final(unsigned char digest[16], struct MD5Context *ctx) { unsigned int count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); byteReverse(ctx->in, 16); MD5Transform(ctx->buf, (word32 *) ctx->in); /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } byteReverse(ctx->in, 14); /* Append length in bits and transform */ ctx->in32[14] = ctx->bits[0]; ctx->in32[15] = ctx->bits[1]; MD5Transform(ctx->buf, (word32 *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); memmove(digest, ctx->buf, 16); memset(ctx, 0, sizeof(struct MD5Context)); } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(word32 buf[4], word32 const in[16]) { register word32 a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } /**@}*/ /* * Note: this code is harmless on little-endian machines. */ static void byteReverse(unsigned char *buf, unsigned longs) { word32 t; do { t = (word32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(word32 *) buf = t; buf += 4; } while (--longs); } astrometry.net-0.67/qfits-an/md5.h000644 000765 000024 00000001066 12651445460 017151 0ustar00dstnstaff000000 000000 #ifndef MD5_H #define MD5_H typedef unsigned int word32; struct MD5Context { word32 buf[4]; word32 bits[2]; union { unsigned char in[64]; word32 in32[16]; }; }; void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); void MD5Transform(word32 buf[4], word32 const in[16]); /* * This is needed to make RSAREF happy on some MS-DOS compilers. */ typedef struct MD5Context MD5_CTX; #endif astrometry.net-0.67/qfits-an/NOTE-Astrometry.net000644 000765 000024 00000001055 12651445460 021735 0ustar00dstnstaff000000 000000 This distribution of the qfits library is a modified version of qfits-6.2.0. We have submitted our patches upstream but have not heard back from the original author. All modified files contain a note at the top of the file (as required by the GPL): /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ In turn, we hereby claim all our modifications: Copyright 2006, 2007 Dustin Lang, Keir Mierle and Sam Roweis and release our modifications under the GPL v2 or later. astrometry.net-0.67/qfits-an/qfits_byteswap.c000644 000765 000024 00000010556 12651445460 021527 0ustar00dstnstaff000000 000000 /* $Id: qfits_byteswap.c,v 1.5 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.5 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include "qfits_config.h" #include "qfits_byteswap.h" // does qfits think this platform is big-endian? int qfits_is_platform_big_endian() { #ifdef WORDS_BIGENDIAN return 1; #else return 0; #endif } /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_byteswap Low-level byte-swapping routines * * This module offers access to byte-swapping routines. * Generic routines are offered that should work everywhere. * Assembler is also included for x86 architectures, and dedicated * assembler calls for processors > 386. * */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Swap a 16-bit number @param w A 16-bit (short) number to byte-swap. @return The swapped version of w, w is untouched. This function swaps a 16-bit number, returned the swapped value without modifying the passed argument. Assembler included for x86 architectures. */ /*----------------------------------------------------------------------------*/ unsigned short qfits_swap_bytes_16(unsigned short w) { #ifdef CPU_X86 __asm("xchgb %b0,%h0" : "=q" (w) : "0" (w)); return w; #else return (((w) & 0x00ff) << 8 | ((w) & 0xff00) >> 8); #endif } /*----------------------------------------------------------------------------*/ /** @brief Swap a 32-bit number @param dw A 32-bit (long) number to byte-swap. @return The swapped version of dw, dw is untouched. This function swaps a 32-bit number, returned the swapped value without modifying the passed argument. Assembler included for x86 architectures and optimized for processors above 386. */ /*----------------------------------------------------------------------------*/ unsigned int qfits_swap_bytes_32(unsigned int dw) { #ifdef CPU_X86 #if CPU_X86 > 386 __asm("bswap %0": "=r" (dw) : #else __asm("xchgb %b0,%h0\n" " rorl $16,%0\n" " xchgb %b0,%h0": "=q" (dw) : #endif "0" (dw)); return dw; #else return ((((dw) & 0xff000000) >> 24) | (((dw) & 0x00ff0000) >> 8) | (((dw) & 0x0000ff00) << 8) | (((dw) & 0x000000ff) << 24)); #endif } /*----------------------------------------------------------------------------*/ /** @brief Swaps bytes in a variable of given size @param p pointer to void (generic pointer) @param s size of the element to swap, pointed to by p @return void This byte-swapper is portable and works for any even variable size. It is not truly the most efficient ever, but does its job fine everywhere this file compiles. */ /*----------------------------------------------------------------------------*/ void qfits_swap_bytes(void * p, int s) { unsigned char tmp, *a, *b; a = (unsigned char*)p; b = a + s; while (a #include #include #include #include #include "qfits_std.h" #include "qfits_card.h" #include "qfits_tools.h" #include "qfits_error.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* Define the following to get zillions of debug messages */ /* #define DEBUG_FITSHEADER */ /*----------------------------------------------------------------------------- Static functions -----------------------------------------------------------------------------*/ static char* expkey_strupc(const char *, char* buf); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_card Card handling functions * * This module contains various routines to help parsing a single FITS * card into its components: key, value, comment. * */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Write out a card to a string on 80 chars. @param line Allocated output character buffer. @param key Key to write. @param val Value to write. @param com Comment to write. @return void Write out a key, value and comment into an allocated character buffer. The buffer must be at least 80 chars to receive the information. Formatting is done according to FITS standard. */ /*----------------------------------------------------------------------------*/ void qfits_card_build( char * line, const char * key, const char * val, const char * com) { int len; int hierarch = 0; char cval[81]; char cval2[81]; char cval_q[81]; char ccom[81]; char safe_line[512]; int i, j; if (line==NULL || key==NULL) return; /* Set the line with zeroes */ memset(line, ' ', 80); if (key==NULL) return; /* END keyword*/ if (!strcmp(key, "END")) { /* Write key and return */ sprintf(line, "END"); return; } /* HISTORY, COMMENT and blank keywords */ if (!strcmp(key, "HISTORY") || !strcmp(key, "COMMENT") || !strcmp(key, "CONTINUE") || !strncmp(key, " ", 8)) { /* Write key */ sprintf(line, "%s ", key); if (val==NULL) return; /* There is a value to write, copy it correctly */ len = strlen(val); /* 72 is 80 (FITS line size) - 8 (sizeof COMMENT or HISTORY) */ if (len>72) len=72; strncpy(line+8, val, len); return; } /* Check for NULL values */ if (val==NULL) cval[0]='\0'; else if (strlen(val)<1) cval[0]='\0'; else strcpy(cval, val); /* Check for NULL comments */ if (com==NULL) strcpy(ccom, "no comment"); else strcpy(ccom, com); /* Set hierarch flag */ if (!strncmp(key, "HIERARCH", 8)) hierarch ++; /* Boolean, int, float or complex */ if (qfits_is_int(cval) || qfits_is_float(cval) || qfits_is_boolean(cval) || qfits_is_complex(cval)) { if (hierarch) sprintf(safe_line, "%-29s= %s / %s", key, cval, ccom); else sprintf(safe_line, "%-8.8s= %20s / %-48s", key, cval, ccom); strncpy(line, safe_line, 80); line[80]='\0'; return; } /* Blank or NULL values */ if (cval[0]==0) { if (hierarch) { sprintf(safe_line, "%-29s= / %s", key, ccom); } else { sprintf(safe_line, "%-8.8s= / %-48s", key, ccom); } strncpy(line, safe_line, 80); line[80]='\0'; return; } /* Can only be a string - Make simple quotes ['] as double [''] */ memset(cval_q, 0, 81); qfits_pretty_string_r(cval, cval2); j=0; i=0; while (cval2[i] != '\0') { if (cval2[i]=='\'') { cval_q[j]='\''; j++; cval_q[j]='\''; } else { cval_q[j] = cval2[i]; } i++; j++; } if (hierarch) { sprintf(safe_line, "%-29s= '%s' / %s", key, cval_q, ccom); if (strlen(key) + strlen(cval_q) + 3 >= 80) safe_line[79] = '\''; } else { sprintf(safe_line, "%-8.8s= '%-8s' / %s", key, cval_q, ccom); } strncpy(line, safe_line, 80); /* Null-terminate in any case */ line[80]='\0'; return; } // Thread-safe version. char* qfits_getkey_r(const char* line, char* key) { int i; if (line==NULL) { #ifdef DEBUG_FITSHEADER printf("qfits_getkey: NULL input line\n"); #endif return NULL; } /* Special case: blank keyword */ if (!strncmp(line, " ", 8)) { strcpy(key, " "); return key; } /* Sort out special cases: HISTORY, COMMENT, END do not have = in line */ if (!strncmp(line, "HISTORY ", 8)) { strcpy(key, "HISTORY"); return key; } if (!strncmp(line, "COMMENT ", 8)) { strcpy(key, "COMMENT"); return key; } if (!strncmp(line, "END ", 4)) { strcpy(key, "END"); return key; } /* Neither does CONTINUE. */ if (!strncmp(line, "CONTINUE ", 9)) { strcpy(key, "CONTINUE"); return key; } memset(key, 0, 81); /* General case: look for the first equal sign */ i=0; while (line[i]!='=' && i<80) i++; if (i>=80) { qfits_error("qfits_getkey: cannot find equal sign in line: \"%.80s\"\n", line); return NULL; } i--; /* Equal sign found, now backtrack on blanks */ while (line[i]==' ' && i>=0) i--; if (i<0) { qfits_error("qfits_getkey: error backtracking on blanks in line: \"%s\"\n", line); return NULL; } i++; /* Copy relevant characters into output buffer */ strncpy(key, line, i); /* Null-terminate the string */ key[i+1] = '\0'; return key; } /*----------------------------------------------------------------------------*/ /** @brief Find the keyword in a key card (80 chars) @param line allocated 80-char line from a FITS header @return statically allocated char * Find out the part of a FITS line corresponding to the keyword. Returns NULL in case of error. The returned pointer is statically allocated in this function, so do not modify or try to free it. */ /*----------------------------------------------------------------------------*/ char * qfits_getkey(const char * line) { static char key[81]; return qfits_getkey_r(line, key); } // Thread-safe version of the below. char* qfits_getvalue_r(const char* line, char* value) { int i; int from, to; int inq; if (line==NULL) { #ifdef DEBUG_FITSHEADER printf("qfits_getvalue: NULL input line\n"); #endif return NULL; } /* Special cases */ /* END has no associated value */ if (!strncmp(line, "END ", 4)) { return NULL; } /* * HISTORY has for value everything else on the line. */ memset(value, 0, 81); if (!strncmp(line, "HISTORY ", 8) || !strncmp(line, " ", 8) || !strncmp(line, "COMMENT ", 8) || !strncmp(line, "CONTINUE", 8)) { strncpy(value, line+8, 80-8); return value; } /* General case - Get past the keyword */ i=0; while (line[i]!='=' && i<80) i++; if (i>80) { #ifdef DEBUG_FITSHEADER printf("qfits_getvalue: no equal sign found on line\n"); #endif return NULL; } i++; while (line[i]==' ' && i<80) i++; if (i>80) { #ifdef DEBUG_FITSHEADER printf("qfits_getvalue: no value past the equal sign\n"); #endif return NULL; } from=i; /* Now value section: Look for the first slash '/' outside a string */ inq = 0; while (i<80) { if (line[i]=='\'') inq=!inq; if (line[i]=='/') if (!inq) break; i++; } i--; /* Backtrack on blanks */ while (line[i]==' ' && i>=0) i--; if (i<0) { #ifdef DEBUG_FITSHEADER printf("qfits_getvalue: error backtracking on blanks\n"); #endif return NULL; } to=i; if (toto?\n"); printf("line=[%s]\n", line); #endif return NULL; } /* Copy relevant characters into output buffer */ strncpy(value, line+from, to-from+1); /* Null-terminate the string */ value[to-from+1] = '\0'; return value; } /*----------------------------------------------------------------------------*/ /** @brief Find the value in a key card (80 chars) @param line allocated 80-char line from a FITS header @return statically allocated char * Find out the part of a FITS line corresponding to the value. Returns NULL in case of error, or if no value can be found. The returned pointer is statically allocated in this function, so do not modify or try to free it. */ /*----------------------------------------------------------------------------*/ char* qfits_getvalue(const char* line) { static char value[81]; return qfits_getvalue_r(line, value); } char* qfits_getcomment_r(const char* line, char* comment) { int i; int from, to; int inq; if (line==NULL) { #ifdef DEBUG_FITSHEADER printf("qfits_getcomment: null line in input\n"); #endif return NULL; } /* Special cases: END, HISTORY, COMMENT and blank have no comment */ if (!strncmp(line, "END ", 4)) return NULL; if (!strncmp(line, "HISTORY ", 8)) return NULL; if (!strncmp(line, "COMMENT ", 8)) return NULL; if (!strncmp(line, " ", 8)) return NULL; memset(comment, 0, 81); /* Get past the keyword */ i=0; while (line[i]!='=' && i<80) i++; if (i>=80) { #ifdef DEBUG_FITSHEADER printf("qfits_getcomment: no equal sign on line\n"); #endif return NULL; } i++; /* Get past the value until the slash */ inq = 0; while (i<80) { if (line[i]=='\'') inq = !inq; if (line[i]=='/') if (!inq) break; i++; } if (i>=80) { #ifdef DEBUG_FITSHEADER printf("qfits_getcomment: no slash found on line\n"); #endif return NULL; } i++; /* Get past the first blanks */ while (line[i]==' ') i++; from=i; /* Now backtrack from the end of the line to the first non-blank char */ to=79; while (line[to]==' ') to--; if (toto?\n"); #endif return NULL; } /* Copy relevant characters into output buffer */ strncpy(comment, line+from, to-from+1); /* Null-terminate the string */ comment[to-from+1] = '\0'; return comment; } /*----------------------------------------------------------------------------*/ /** @brief Find the comment in a key card (80 chars) @param line allocated 80-char line from a FITS header @return statically allocated char * Find out the part of a FITS line corresponding to the comment. Returns NULL in case of error, or if no comment can be found. The returned pointer is statically allocated in this function, so do not modify or try to free it. */ /*----------------------------------------------------------------------------*/ char * qfits_getcomment(const char * line) { static char comment[81]; return qfits_getcomment_r(line, comment); } /*----------------------------------------------------------------------------*/ /** Thread-safe version of qfits_expand_keyword. */ char* qfits_expand_keyword_r(const char * keyword, char* expanded) { char ws[81]; char * token; /* Bulletproof entries */ if (keyword==NULL) return NULL; /* If regular keyword, copy the uppercased input and return */ if (strstr(keyword, ".")==NULL) { expkey_strupc(keyword, expanded); return expanded; } /* Regular shortFITS keyword */ sprintf(expanded, "HIERARCH ESO"); expkey_strupc(keyword, ws); token = strtok(ws, "."); while (token!=NULL) { strcat(expanded, " "); strcat(expanded, token); token = strtok(NULL, "."); } return expanded; } /*----------------------------------------------------------------------------*/ /** @brief Expand a keyword from shortFITS to HIERARCH notation. @param keyword Keyword to expand. @return 1 pointer to statically allocated string. This function expands a given keyword from shortFITS to HIERARCH notation, bringing it to uppercase at the same time. Examples: @verbatim det.dit expands to HIERARCH ESO DET DIT ins.filt1.id expands to HIERARCH ESO INS FILT1 ID @endverbatim If the input keyword is a regular FITS keyword (i.e. it contains not dots '.') the result is identical to the input. */ /*----------------------------------------------------------------------------*/ char * qfits_expand_keyword(const char * keyword) { static char expanded[81]; QFITS_THREAD_UNSAFE; qfits_expand_keyword_r(keyword, expanded); return expanded; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief Uppercase a string @param s string @return string */ /*----------------------------------------------------------------------------*/ static char * expkey_strupc(const char * s, char* l) { int i; if (s==NULL) return NULL; i=0; while (s[i]) { l[i] = (char)toupper((int)s[i]); i++; } l[i] = '\0'; return l; } astrometry.net-0.67/qfits-an/qfits_convert.c000644 000765 000024 00000005633 12651445460 021351 0ustar00dstnstaff000000 000000 /** Copyright 2009 Dustin Lang. */ #include #include "qfits_std.h" #include "qfits_config.h" #include "qfits_image.h" #include "qfits_byteswap.h" #include "qfits_error.h" #define FITSOUTPUTPIXEL(fitstype, ival, optr) \ do { \ uint8_t* o8; \ int16_t* o16; \ int32_t* o32; \ float* ofloat; \ double* odouble; \ switch (fitstype) { \ case BPP_8_UNSIGNED: \ o8 = optr; \ *o8 = MIN(255, MAX(0, (uint8_t)ival)); \ break; \ case BPP_16_SIGNED: \ o16 = optr; \ *o16 = MIN(INT16_MAX, MAX(INT16_MIN, (int16_t)ival)); \ break; \ case BPP_32_SIGNED: \ o32 = optr; \ *o32 = MIN(INT32_MAX, MAX(INT32_MIN, (int32_t)ival)); \ break; \ case BPP_IEEE_FLOAT: \ ofloat = optr; \ *ofloat = ival; \ break; \ case BPP_IEEE_DOUBLE: \ odouble = optr; \ *odouble = ival; \ break; \ default: \ qfits_error("Unknown output FITS type %i\n", fitstype); \ return -1; \ } \ } while (0) int qfits_pixel_ctype_size(int ctype) { switch (ctype) { case PTYPE_DOUBLE: return sizeof(double); case PTYPE_FLOAT: return sizeof(float); case PTYPE_INT: return sizeof(int); case PTYPE_INT16: return sizeof(int16_t); case PTYPE_UINT8: return sizeof(uint8_t); } return -1; } int qfits_pixel_fitstype_size(int fitstype) { int n = BYTESPERPIXEL(fitstype); if (!n) return -1; return n; } /** Converts a value described by a "PTYPE_" To a value described by a "BPP_" */ int qfits_pixel_ctofits(int ctype, int fitstype, const void* cval, void* fitsval) { const float* ifloat; const double* idouble; const int* iint; const uint8_t* iu8; const int16_t* ii16; switch (ctype) { case PTYPE_DOUBLE: idouble = cval; FITSOUTPUTPIXEL(fitstype, *idouble, fitsval); break; case PTYPE_FLOAT: ifloat = cval; FITSOUTPUTPIXEL(fitstype, *ifloat, fitsval); break; case PTYPE_INT: iint = cval; FITSOUTPUTPIXEL(fitstype, *iint, fitsval); break; case PTYPE_UINT8: iu8 = cval; // This generates warnings about "comparison always false due to limited range of data". // These warnings are harmless. FITSOUTPUTPIXEL(fitstype, *iu8, fitsval); break; case PTYPE_INT16: ii16 = cval; // This generates warnings about "comparison always false due to limited range of data". // These warnings are harmless. FITSOUTPUTPIXEL(fitstype, *ii16, fitsval); break; default: return -1; } // Byteswap, if necessary. #ifndef WORDS_BIGENDIAN switch (fitstype) { case BPP_8_UNSIGNED: break; case BPP_16_SIGNED: qfits_swap_bytes(fitsval, 2); break; case BPP_32_SIGNED: case BPP_IEEE_FLOAT: qfits_swap_bytes(fitsval, 4); break; case BPP_IEEE_DOUBLE: qfits_swap_bytes(fitsval, 8); break; } #endif return 0; } #undef FITSOUTPUTPIXEL astrometry.net-0.67/qfits-an/qfits_error.c000644 000765 000024 00000016365 12651445460 021026 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_error.c,v 1.6 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.6 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include "qfits_error.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* Max number of error handling functions registered */ #define QFITS_ERR_MAXERRDISP 8 /* Max size of an error message */ #define QFITS_ERR_MSGSIZE 1024 /*----------------------------------------------------------------------------- Static declarations -----------------------------------------------------------------------------*/ /* Type of a display function only defined for legibility here */ typedef void (*qfits_err_dispfunc)(char *); /* Default display function prints out msg to stderr */ static void qfits_err_display_stderr(char * s) { fprintf(stderr, "qfits: %s\n", s); } /* Static control structure, completely private */ static struct { qfits_err_dispfunc disp[QFITS_ERR_MAXERRDISP]; int n; int active; } qfits_err_control = {{qfits_err_display_stderr}, 1, 0}; static void qfits_err_main_display(char *); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_error Messaging functionalities * * This module is responsible for error message display. It allows * to re-direct all messages to a given set of functions for display. * */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ void qfits_err_remove_all(void) { qfits_err_control.n = 0; } /* Public warning/error functions */ void qfits_warning(const char *fmt, ...) { char msg[QFITS_ERR_MSGSIZE]; char all[QFITS_ERR_MSGSIZE]; va_list ap; /* Check if display is activated */ if (qfits_err_control.active==0) { return; } va_start(ap, fmt); vsprintf(msg, fmt, ap); va_end(ap); sprintf(all, "*** %s", msg); qfits_err_main_display(all); return; } void qfits_error(const char *fmt, ...) { char msg[QFITS_ERR_MSGSIZE]; char all[QFITS_ERR_MSGSIZE]; va_list ap; /* Check if display is activated */ if (qfits_err_control.active==0) { return; } va_start(ap, fmt); vsprintf(msg, fmt, ap); va_end(ap); sprintf(all, "error: %s", msg); qfits_err_main_display(all); return; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief used for message display @param msg message @return nothing It calls registered display functions one after another. */ /*----------------------------------------------------------------------------*/ static void qfits_err_main_display(char * msg) { int i; /* Check if there is a message in input */ if (msg==NULL) return; /* Loop on all registered functions and call them */ for (i=0; i>31); } int _qfits_isinff(float f) { ieee_float_pattern ip; int ix, t; ip.f = f; ix = ip.i; t = ix & 0x7fffffff; t ^= 0x7f800000; t |= -t; return ~(t >> 31) & (ix >> 30); } int _qfits_isnand(double d) { ieee_double_pattern id; int hx, lx; id.d = d; lx = id.p.lsw; hx = id.p.msw; hx &= 0x7fffffff; hx |= (unsigned int)(lx|(-lx))>>31; hx = 0x7ff00000 - hx; return (int)(((unsigned int)hx)>>31); } int _qfits_isinfd(double d) { ieee_double_pattern id; int hx, lx; id.d = d; lx = id.p.lsw; hx = id.p.msw; lx |= (hx & 0x7fffffff) ^ 0x7ff00000; lx |= -lx; return ~(lx >> 31) & (hx >> 30); } /**@}*/ /* * Test program to validate the above functions * Compile with: * % cc -o qfits_float qfits_float.c -DTEST */ #ifdef TEST #include #include #include "ieeefp-compat.h" #ifndef WORDS_BIGENDIAN /* Little endian patterns */ static unsigned char fnan_pat[] = {0, 0, 0xc0, 0x7f}; static unsigned char dnan_pat[] = {0, 0, 0, 0, 0, 0, 0xf8, 0x7f}; static unsigned char finf_pat[] = {0, 0, 0x80, 0x7f}; static unsigned char dinf_pat[] = {0, 0, 0, 0, 0, 0, 0xf0, 0x7f}; static unsigned char fminf_pat[] = {0, 0, 0x80, 0xff}; /* static unsigned char dminf_pat[] = {0, 0, 0, 0, 0, 0, 0xf0, 0xff}; */ static unsigned char dminf_pat[] = {0, 0, 0, 0, 0, 0, 0xf0, 0x7f}; #else /* Big endian patterns */ static unsigned char fnan_pat[] = {0x7f, 0xc0, 0, 0}; static unsigned char dnan_pat[] = {0x7f, 0xf8, 0, 0, 0, 0, 0, 0}; static unsigned char finf_pat[] = {0x7f, 0x80, 0, 0}; static unsigned char dinf_pat[] = {0x7f, 0xf0, 0, 0, 0, 0, 0, 0}; static unsigned char fminf_pat[] = {0xff, 0x80, 0, 0}; static unsigned char dminf_pat[] = {0xff, 0xf0, 0, 0, 0, 0, 0, 0}; #endif static void hexdump(void * p, int s) { unsigned char * c; int i; c=(unsigned char*)p; #ifndef WORDS_BIGENDIAN for (i=s-1; i>=0; i--) { #else for (i=0; ifirst = NULL; h->last = NULL; h->n = 0; h->current = NULL; h->current_idx = -1; return h; } int qfits_header_n(const qfits_header* hdr) { if (!hdr) return -1; return hdr->n; } /*----------------------------------------------------------------------------*/ /** @brief FITS header default constructor. @return 1 newly allocated qfits_header object. This is a secondary constructor for a qfits_header object. It returns an allocated linked-list handler containing two cards: the first one (SIMPLE=T) and the last one (END). */ /*----------------------------------------------------------------------------*/ qfits_header * qfits_header_default(void) { qfits_header * h; h = qfits_header_new(); qfits_header_append(h, "SIMPLE", "T", "Fits format", NULL); qfits_header_append(h, "END", NULL, NULL, NULL); return h; } /*----------------------------------------------------------------------------*/ /** @brief Add a new card to a FITS header @param hdr qfits_header object to modify @param key FITS key @param val FITS value @param com FITS comment @param lin FITS original line if exists @return void This function adds a new card into a header, at the one-before-last position, i.e. the entry just before the END entry if it is there. The key must always be a non-NULL string, all other input parameters are allowed to get NULL values. */ /*----------------------------------------------------------------------------*/ void qfits_header_add( qfits_header * hdr, const char * key, const char * val, const char * com, const char * lin) { keytuple * k; keytuple * kbf; keytuple * first; keytuple * last; if (hdr==NULL || key==NULL) return; if (hdr->n<2) { fprintf(stderr, "Caution: qfits thinks it knows better than you: %s:%i key=\"%s\"\n", __FILE__, __LINE__, key); return; } first = (keytuple*)hdr->first; last = (keytuple*)hdr->last; if (((keytype)first->typ != keytype_top) || ((keytype)last->typ != keytype_end)) { fprintf(stderr, "Caution, qfits thinks it knows better than you: %s:%i\n", __FILE__, __LINE__); return; } /* Create new key tuple */ k = keytuple_new(key, val, com, lin); /* Don't add duplicate SIMPLE, XTENSION or END entries. */ if ((k->typ == keytype_top) || (k->typ == keytype_end)) { keytuple_del(k); return; } /* Find the last keytuple with same key type */ /* NO, DO WHAT THE DOCUMENTATION SAYS WE'RE SUPPOSED TO DO. kbf = first; while (kbf!=NULL) { if ((k->typ>=kbf->typ) && (kbf->next) && (k->typnext->typ)) break; kbf = kbf->next; } if (kbf==NULL) kbf = last->prev; */ kbf = last->prev; /* Hook it into list */ k->next = kbf->next; (kbf->next)->prev = k; kbf->next = k; k->prev = kbf; hdr->n ++; return; } /*----------------------------------------------------------------------------*/ /** @brief add a new card to a FITS header @param hdr qfits_header object to modify @param after Key to specify insertion place @param key FITS key @param val FITS value @param com FITS comment @param lin FITS original line if exists @return void Adds a new card to a FITS header, after the specified key. Nothing happens if the specified key is not found in the header. All fields can be NULL, except after and key. */ /*----------------------------------------------------------------------------*/ void qfits_header_add_after( qfits_header * hdr, const char * after, const char * key, const char * val, const char * com, const char * lin) { keytuple * kreq; keytuple * k; char exp_after[FITS_LINESZ+1]; if (hdr==NULL || after==NULL || key==NULL) return; qfits_expand_keyword_r(after, exp_after); /* Locate where the entry is requested */ kreq = (keytuple*)(hdr->first); while (kreq!=NULL) { if (!strcmp(kreq->key, exp_after)) break; kreq = kreq->next; } if (kreq==NULL) return; k = keytuple_new(key, val, com, lin); k->next = kreq->next; kreq->next->prev = k; kreq->next = k; k->prev = kreq; hdr->n ++; return; } /*----------------------------------------------------------------------------*/ /** @brief Append a new card to a FITS header. @param hdr qfits_header object to modify @param key FITS key @param val FITS value @param com FITS comment @param lin FITS original line if exists @return void Adds a new card in a FITS header as the last one. All fields can be NULL except key. */ /*----------------------------------------------------------------------------*/ void qfits_header_append( qfits_header * hdr, const char * key, const char * val, const char * com, const char * lin) { keytuple * k; keytuple * last; if (hdr==NULL || key==NULL) return; k = keytuple_new(key, val, com, lin); if (hdr->n==0) { hdr->first = hdr->last = k; hdr->n = 1; return; } last = (keytuple*)hdr->last; last->next = k; k->prev = last; hdr->last = k; hdr->n++; return; } /*----------------------------------------------------------------------------*/ /** @brief Delete a card in a FITS header. @param hdr qfits_header to modify @param key specifies which card to remove @return void Removes a card from a FITS header. The first found card that matches the key is removed. */ /*----------------------------------------------------------------------------*/ void qfits_header_del(qfits_header * hdr, const char * key) { keytuple * k; char xkey[FITS_LINESZ]; if (hdr==NULL || key==NULL) return; qfits_expand_keyword_r(key, xkey); k = (keytuple*)hdr->first; while (k!=NULL) { if (!strcmp(k->key, xkey)) break; k = k->next; } if (k==NULL) return; if(k == hdr->first) { hdr->first = k->next; } else { k->prev->next = k->next; k->next->prev = k->prev; } keytuple_del(k); return; } /*----------------------------------------------------------------------------*/ /** @brief Modifies a FITS card. @param hdr qfits_header to modify @param key FITS key @param val FITS value @param com FITS comment @return void Finds the first card in the header matching 'key', and replaces its value and comment fields by the provided values. The initial FITS line is set to NULL in the card. */ /*----------------------------------------------------------------------------*/ void qfits_header_mod( qfits_header * hdr, const char * key, const char * val, const char * com) { keytuple * k; char xkey[FITS_LINESZ+1]; if (hdr==NULL || key==NULL) return; qfits_expand_keyword_r(key, xkey); k = (keytuple*)hdr->first; while (k!=NULL) { if (!strcmp(k->key, xkey)) break; k=k->next; } if (k==NULL) return; if (k->val) qfits_free(k->val); if (k->com) qfits_free(k->com); if (k->lin) qfits_free(k->lin); k->val = NULL; k->com = NULL; k->lin = NULL; if (val) { if (strlen(val)>0) k->val = qfits_strdup(val); } if (com) { if (strlen(com)>0) k->com = qfits_strdup(com); } return; } /*----------------------------------------------------------------------------*/ /** @brief Sort a FITS header @param hdr Header to sort (modified) @return -1 in error case, 0 otherwise */ /*----------------------------------------------------------------------------*/ int qfits_header_sort(qfits_header ** hdr) { qfits_header * sorted; keytuple * k; keytuple * kbf; keytuple * next; keytuple * last; /* Test entries */ if (hdr == NULL) return -1; if (*hdr == NULL) return -1; if ((*hdr)->n < 2) return 0; /* Create the new FITS header */ sorted = qfits_header_new(); /* Move the first keytuple to the sorted empty header */ k = (keytuple*)(*hdr)->first; next = k->next; sorted->first = sorted->last = k; k->next = k->prev = NULL; sorted->n = 1; /* Loop over the other tuples */ while (next != NULL) { k = next; next = k->next; /* Find k's place in sorted */ kbf = (keytuple*)sorted->first; while (kbf!=NULL) { if (k->typ < kbf->typ) break; kbf = kbf->next; } /* Hook k into sorted list */ if (kbf == NULL) { /* k is last in sorted */ last = sorted->last; sorted->last = k; k->next = NULL; k->prev = last; last->next = k; } else { /* k goes just before kbf */ k->next = kbf; k->prev = kbf->prev; if (kbf->prev != NULL) (kbf->prev)->next = k; else sorted->first = k; kbf->prev = k; } (sorted->n) ++; } /* Replace the input header by the sorted one */ (*hdr)->first = (*hdr)->last = NULL; qfits_header_destroy(*hdr); *hdr = sorted; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Copy a FITS header @param src Header to replicate @return Pointer to newly allocated qfits_header object. Makes a strict copy of all information contained in the source header. The returned header must be freed using qfits_header_destroy. */ /*----------------------------------------------------------------------------*/ qfits_header * qfits_header_copy(const qfits_header * src) { qfits_header * fh_copy; keytuple * k; if (src==NULL) return NULL; fh_copy = qfits_header_new(); k = (keytuple*)src->first; while (k!=NULL) { qfits_header_append(fh_copy, k->key, k->val, k->com, k->lin); k = k->next; } return fh_copy; } /*----------------------------------------------------------------------------*/ /** @brief qfits_header destructor @param hdr qfits_header to deallocate @return void Frees all memory associated to a given qfits_header object. */ /*----------------------------------------------------------------------------*/ void qfits_header_destroy(qfits_header * hdr) { keytuple * k; keytuple * kn; if (hdr==NULL) return; k = (keytuple*)hdr->first; while (k!=NULL) { kn = k->next; keytuple_del(k); k = kn; } qfits_free(hdr); return; } /*----------------------------------------------------------------------------*/ /** @brief Return the value associated to a key, as a string @param hdr qfits_header to parse @param key key to find @return pointer to statically allocated string Finds the value associated to the given key and return it as a string. The returned pointer is statically allocated, so do not modify its contents or try to free it. Returns NULL if no matching key is found or no value is attached. */ /*----------------------------------------------------------------------------*/ char * qfits_header_getstr(const qfits_header * hdr, const char * key) { keytuple * k; char xkey[FITS_LINESZ+1]; if (hdr==NULL || key==NULL) return NULL; qfits_expand_keyword_r(key, xkey); k = (keytuple*)hdr->first; while (k!=NULL) { if (!strcmp(k->key, xkey)) break; k=k->next; } if (k==NULL) return NULL; return k->val; } int qfits_header_getstr_pretty(const qfits_header* hdr, const char* key, char* pretty, const char* defaultval) { char* val = qfits_header_getstr(hdr, key); if (!val) { if (defaultval) strcpy(pretty, defaultval); return -1; } qfits_pretty_string_r(val, pretty); return 0; } static keytuple* get_keytuple(qfits_header* hdr, int idx) { if (idx == 0) { hdr->current_idx = 0; hdr->current = hdr->first; return hdr->current; } else if (idx == hdr->current_idx + 1) { hdr->current = ((keytuple*) (hdr->current))->next; hdr->current_idx++; return hdr->current; } else { keytuple* k = (keytuple*)hdr->first; int count=0; while (countnext; count++; } return k; } } /*----------------------------------------------------------------------------*/ /** @brief Return the i-th key/val/com/line tuple in a header. @param hdr Header to consider @param idx Index of the requested card @param key Output key @param val Output value @param com Output comment @param lin Output initial line @return int 0 if Ok, -1 if error occurred. This function is useful to browse a FITS header object card by card. By iterating on the number of cards (available in the 'n' field of the qfits_header struct), you can retrieve the FITS lines and their components one by one. Indexes run from 0 to n-1. You can pass NULL values for key, val, com or lin if you are not interested in a given field. @code int i; char key[FITS_LINESZ+1]; char val[FITS_LINESZ+1]; char com[FITS_LINESZ+1]; char lin[FITS_LINESZ+1]; for (i=0; in; i++) { qfits_header_getitem(hdr, i, key, val, com, lin); printf("card[%d] key[%s] val[%s] com[%s]\n", i, key, val, com); } @endcode This function has primarily been written to interface a qfits_header object to other languages (C++/Python). If you are working within a C program, you should use the other header manipulation routines available in this module. */ /*----------------------------------------------------------------------------*/ int qfits_header_getitem( const qfits_header * hdr, int idx, char * key, char * val, char * com, char * lin) { keytuple * k; if (hdr==NULL) return -1; if (key==NULL && val==NULL && com==NULL && lin==NULL) return 0; if (idx<0 || idx>=hdr->n) return -1; k = get_keytuple((qfits_header*)hdr, idx); /* Fill return values */ if (key!=NULL) strcpy(key, k->key); if (val!=NULL) { if (k->val!=NULL) strcpy(val, k->val); else val[0]=0; } if (com!=NULL) { if (k->com!=NULL) strcpy(com, k->com); else com[0]=0; } if (lin!=NULL) { if (k->lin!=NULL) strcpy(lin, k->lin); else lin[0]=0; } return 0; } int qfits_header_setitem( qfits_header * hdr, int idx, char * key, char * val, char * com, char * lin) { keytuple * k; if (!hdr) return -1; if (!key && !val && !com && !lin) return 0; if (idx<0 || idx>=hdr->n) return -1; k = get_keytuple(hdr, idx); // free existing strings as per keytuple_del if (k->key) qfits_free(k->key); if (k->val) qfits_free(k->val); if (k->com) qfits_free(k->com); if (k->lin) qfits_free(k->lin); // copy input strings. if (key) k->key = qfits_strdup(key); else k->key = NULL; if (val) k->val = qfits_strdup(val); else k->val = NULL; if (com) k->com = qfits_strdup(com); else k->com = NULL; // the rest of the code expects this to be exactly 80 chars. if (lin) { k->lin = qfits_malloc(80); memcpy(k->lin, lin, 80); } else k->lin = NULL; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Return the comment associated to a key, as a string @param hdr qfits_header to parse @param key key to find @return pointer to statically allocated string Finds the comment associated to the given key and return it as a string. The returned pointer is statically allocated, so do not modify its contents or try to free it. Returns NULL if no matching key is found or no comment is attached. */ /*----------------------------------------------------------------------------*/ char * qfits_header_getcom(const qfits_header * hdr, const char * key) { keytuple * k; char xkey[FITS_LINESZ+1]; if (hdr==NULL || key==NULL) return NULL; qfits_expand_keyword_r(key, xkey); k = (keytuple*)hdr->first; while (k!=NULL) { if (!strcmp(k->key, xkey)) break; k=k->next; } if (k==NULL) return NULL; return k->com; } /*----------------------------------------------------------------------------*/ /** @brief Return the value associated to a key, as an int @param hdr qfits_header to parse @param key key to find @param errval default value to return if nothing is found @return int Finds the value associated to the given key and return it as an int. Returns errval if no matching key is found or no value is attached. */ /*----------------------------------------------------------------------------*/ int qfits_header_getint( const qfits_header * hdr, const char * key, int errval) { char * c; int d; if (hdr==NULL || key==NULL) return errval; c = qfits_header_getstr(hdr, key); if (c==NULL) return errval; if (sscanf(c, "%d", &d)!=1) return errval; return d; } /*----------------------------------------------------------------------------*/ /** @brief Return the value associated to a key, as a double @param hdr qfits_header to parse @param key key to find @param errval default value to return if nothing is found @return double Finds the value associated to the given key and return it as a double. Returns errval if no matching key is found or no value is attached. */ /*----------------------------------------------------------------------------*/ double qfits_header_getdouble( const qfits_header * hdr, const char * key, double errval) { char * c; char* endptr; double d; if (hdr==NULL || key==NULL) return errval; c = qfits_header_getstr(hdr, key); if (c==NULL) return errval; d = strtod(c, &endptr); if (endptr == c) return errval; return d; //return atof(c); } /*----------------------------------------------------------------------------*/ /** @brief Return the value associated to a key, as a boolean (int). @param hdr qfits_header to parse @param key key to find @param errval default value to return if nothing is found @return int Finds the value associated to the given key and return it as a boolean. Returns errval if no matching key is found or no value is attached. A boolean is here understood as an int taking the value 0 or 1. errval can be set to any other integer value to reflect that nothing was found. errval is returned if no matching key is found or no value is attached. A true value is any character string beginning with a 'y' (yes), a 't' (true) or the digit '1'. A false value is any character string beginning with a 'n' (no), a 'f' (false) or the digit '0'. */ /*----------------------------------------------------------------------------*/ int qfits_header_getboolean( const qfits_header * hdr, const char * key, int errval) { char * c; int ret; if (hdr==NULL || key==NULL) return errval; c = qfits_header_getstr(hdr, key); if (c==NULL) return errval; if (strlen(c)<1) return errval; if (c[0]=='y' || c[0]=='Y' || c[0]=='1' || c[0]=='t' || c[0]=='T') { ret = 1; } else if (c[0]=='n' || c[0]=='N' || c[0]=='0' || c[0]=='f' || c[0]=='F') { ret = 0; } else { ret = errval; } return ret; } int qfits_header_write_line(const qfits_header* hdr, int line, char* result) { keytuple* k; int i; k = hdr->first; for (i=0; inext; if (!k) return -1; } qfits_header_makeline(result, k, 1); return 0; } /*----------------------------------------------------------------------------*/ /** @brief Dump a FITS header to an opened file. @param hdr FITS header to dump @param out Opened file pointer @return int 0 if Ok, -1 otherwise Dumps a FITS header to an opened file pointer. */ /*----------------------------------------------------------------------------*/ int qfits_header_dump( const qfits_header * hdr, FILE * out) { keytuple * k; char line[81]; int n_out; if (hdr==NULL) return -1; if (out==NULL) out=stdout; k = (keytuple*)hdr->first; n_out = 0; while (k!=NULL) { /* Make line from information in the node */ qfits_header_makeline(line, k, 1); if ((fwrite(line, 1, 80, out))!=80) { fprintf(stderr, "error dumping FITS header"); return -1; } n_out ++; k=k->next; } /* Blank-pad the output */ memset(line, ' ', 80); while (n_out % 36) { fwrite(line, 1, 80, out); n_out++; } return 0; } int qfits_header_list( const qfits_header * hdr, FILE * out) { keytuple * k; char line[81]; int n_out; if (hdr==NULL) return -1; if (out==NULL) out=stdout; k = (keytuple*)hdr->first; n_out = 0; while (k!=NULL) { /* Make line from information in the node */ qfits_header_makeline(line, k, 1); if ((fwrite(line, 1, 80, out))!=80) { fprintf(stderr, "error dumping FITS header"); return -1; } fprintf(out, "\n"); n_out ++; k=k->next; } return 0; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief keytuple constructor @param key Key associated to key tuple (cannot be NULL). @param val Value associated to key tuple. @param com Comment associated to key tuple. @param lin Initial line read from FITS header (if applicable). @return 1 pointer to newly allocated keytuple. This function is a keytuple creator. NULL values and zero-length strings are valid parameters for all but the key field. The returned object must be deallocated using keytuple_del(). */ /*----------------------------------------------------------------------------*/ static keytuple * keytuple_new( const char * key, const char * val, const char * com, const char * lin) { char xkey[FITS_LINESZ+1]; keytuple * k; if (key==NULL) return NULL; /* Allocate space for new structure */ k = qfits_malloc(sizeof(keytuple)); /* Hook a copy of the new key */ qfits_expand_keyword_r(key, xkey); k->key = qfits_strdup(xkey); /* Hook a copy of the value if defined */ k->val = NULL; if (val!=NULL) { // Why was this here? //if (strlen(val)>0) k->val = qfits_strdup(val); } /* Hook a copy of the comment if defined */ k->com = NULL; if (com!=NULL) { if (strlen(com)>0) k->com = qfits_strdup(com); } /* Hook a copy of the initial line if defined */ k->lin = NULL; if (lin!=NULL) { if (strlen(lin)>0) k->lin = qfits_strdup(lin); } k->next = NULL; k->prev = NULL; k->typ = keytuple_type(key); return k; } /*----------------------------------------------------------------------------*/ /** @brief keytuple type identification routine @param key String representing a FITS keyword. @return A key type (see keytype enum) This function identifies the type of a FITS keyword when given the keyword as a string. Keywords are expected literally as they are found in a FITS header on disk. */ /*----------------------------------------------------------------------------*/ static keytype keytuple_type(const char * key) { keytype kt; kt = keytype_undef; /* Assign type to key tuple */ if (!strcmp(key, "SIMPLE") || !strcmp(key, "XTENSION")) kt = keytype_top; else if (!strcmp(key, "END")) kt = keytype_end; else if (!strcmp(key, "BITPIX")) kt = keytype_bitpix; else if (!strcmp(key, "NAXIS")) kt = keytype_naxis; else if (!strcmp(key, "NAXIS1")) kt = keytype_naxis1; else if (!strcmp(key, "NAXIS2")) kt = keytype_naxis2; else if (!strcmp(key, "NAXIS3")) kt = keytype_naxis3; else if (!strcmp(key, "NAXIS4")) kt = keytype_naxis4; else if (!strncmp(key, "NAXIS", 5)) kt = keytype_naxisi; else if (!strcmp(key, "GROUP")) kt = keytype_group; else if (!strcmp(key, "PCOUNT")) kt = keytype_pcount; else if (!strcmp(key, "GCOUNT")) kt = keytype_gcount; else if (!strcmp(key, "EXTEND")) kt = keytype_extend; else if (!strcmp(key, "BSCALE")) kt = keytype_bscale; else if (!strcmp(key, "BZERO")) kt = keytype_bzero; else if (!strcmp(key, "TFIELDS")) kt = keytype_tfields; else if (!strncmp(key, "TBCOL", 5)) kt = keytype_tbcoli; else if (!strncmp(key, "TFORM", 5)) kt = keytype_tformi; else if (!strncmp(key, "HIERARCH ESO DPR", 16)) kt = keytype_hierarch_dpr; else if (!strncmp(key, "HIERARCH ESO OBS", 16)) kt = keytype_hierarch_obs; else if (!strncmp(key, "HIERARCH ESO TPL", 16)) kt = keytype_hierarch_tpl; else if (!strncmp(key, "HIERARCH ESO GEN", 16)) kt = keytype_hierarch_gen; else if (!strncmp(key, "HIERARCH ESO TEL", 16)) kt = keytype_hierarch_tel; else if (!strncmp(key, "HIERARCH ESO INS", 16)) kt = keytype_hierarch_ins; else if (!strncmp(key, "HIERARCH ESO LOG", 16)) kt = keytype_hierarch_log; else if (!strncmp(key, "HIERARCH ESO PRO", 16)) kt = keytype_hierarch_pro; else if (!strncmp(key, "HIERARCH", 8)) kt = keytype_hierarch; else if (!strcmp(key, "HISTORY")) kt = keytype_history; else if (!strcmp(key, "COMMENT")) kt = keytype_comment; else if (!strcmp(key, "CONTINUE")) kt = keytype_continue; else if ((int)strlen(key)<9) kt = keytype_primary; return kt; } /*----------------------------------------------------------------------------*/ /** @brief Keytuple destructor. @param k Keytuple to deallocate. @return void Keytuple destructor. */ /*----------------------------------------------------------------------------*/ static void keytuple_del(keytuple * k) { if (k==NULL) return; if (k->key) qfits_free(k->key); if (k->val) qfits_free(k->val); if (k->com) qfits_free(k->com); if (k->lin) qfits_free(k->lin); qfits_free(k); } /*----------------------------------------------------------------------------*/ /** @brief Keytuple dumper. @param k Keytuple to dump @return void This function dumps a key tuple to stdout. It is meant for debugging purposes only. */ /*----------------------------------------------------------------------------*/ static void keytuple_dmp(const keytuple * k) { if (!k) return; printf("[%s]=[", k->key); if (k->val) printf("%s", k->val); printf("]"); if (k->com) printf("/[%s]", k->com); printf("\n"); return; } void qfits_header_debug_dump(const qfits_header* hdr) { keytuple* k; if (hdr==NULL) return; k = (keytuple*)hdr->first; while (k) { keytuple_dmp(k); k=k->next; } } /*----------------------------------------------------------------------------*/ /** @brief Build a FITS line from the information contained in a card. @param line pointer to allocated string to be filled @param node pointer to card node in qfits_header linked-list @param conservative flag to indicate conservative behaviour @return int 0 if Ok, anything else otherwise Build a FITS line (80 chars) from the information contained in a node of a qfits_header linked-list. If the mode is set to conservative, the original FITS line will be used wherever present. If conservative is set to 0, a new line will be formatted. */ /*----------------------------------------------------------------------------*/ static int qfits_header_makeline( char * line, const keytuple * k, int conservative) { char blankline[81]; int i; if (line==NULL || k==NULL) return -1; /* If a previous line information is there, use it as is */ if (conservative) { if (k->lin != NULL) { memcpy(line, k->lin, 80); line[80]='\0'; return 0; } } /* Got to build keyword from scratch */ memset(blankline, 0, 81); qfits_card_build(blankline, k->key, k->val, k->com); memset(line, ' ', 80); i=0; while (blankline[i] != '\0') { line[i] = blankline[i]; i++; } line[80]='\0'; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Find a matching key in a header. @param hdr qfits_header to parse @param key Key prefix to match @return pointer to statically allocated string. This function finds the first keyword in the given header for which the given 'key' is a prefix, and returns the full name of the matching key (NOT ITS VALUE). This is useful to locate any keyword starting with a given prefix. Careful with HIERARCH keywords, the shortFITS notation is not likely to be accepted here. Examples: @verbatim s = qfits_header_findmatch(hdr, "SIMP") returns "SIMPLE" s = qfits_header_findmatch(hdr, "HIERARCH ESO DET") returns the first detector keyword among the HIERACH keys. @endverbatim */ /*----------------------------------------------------------------------------*/ char * qfits_header_findmatch(const qfits_header * hdr, const char * key) { keytuple * k; if (hdr==NULL || key==NULL) return NULL; k = (keytuple*)hdr->first; while (k!=NULL) { if (!strncmp(k->key, key, (int)strlen(key))) break; k=k->next; } if (k==NULL) return NULL; return k->key; } astrometry.net-0.67/qfits-an/qfits_image.c000644 000765 000024 00000043000 12651445460 020741 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_image.c,v 1.12 2006/02/23 11:25:25 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/23 11:25:25 $ * $Revision: 1.12 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include "qfits_config.h" #include "qfits_image.h" #include "qfits_rw.h" #include "qfits_header.h" #include "qfits_byteswap.h" #include "qfits_tools.h" #include "qfits_error.h" #include "qfits_memory.h" #include "qfits_std.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ #define QFITSLOADERINIT_MAGIC 0xcafe /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ static byte * qfits_pixdump_float(const float *, int, int); static byte * qfits_pixdump_int(const int *, int, int); static byte * qfits_pixdump_double(const double *, int, int); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_image Pixel loader for FITS images. */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Dump a pixel buffer to an output FITS file in append mode. @param qd qfitsdumper control object. @return int 0 if Ok, -1 otherwise. This function takes in input a qfitsdumper control object. This object must be allocated beforehand and contain valid references to the data to save, and how to save it. The minimum fields to fill are: - filename: Name of the FITS file to dump to. - npix: Number of pixels in the buffer to be dumped. - ptype: Type of the passed buffer (PTYPE_FLOAT, PTYPE_INT, PTYPE_DOUBLE) - out_ptype: Requested FITS BITPIX for the output. One of the following fields must point to the corresponding pixel buffer: - ibuf for an int pixel buffer (ptype=PTYPE_INT) - fbuf for a float pixel buffer (ptype=PTYPE_FLOAT) - dbuf for a double pixel buffer (ptype=PTYPE_DOUBLE) This is a fairly low-level function, in the sense that it does not check that the output file already contains a proper header or even that the file it is appending to is indeed a FITS file. It will convert the pixel buffer to the requested BITPIX type and append the data to the file, without padding with zeros. See qfits_zeropad() about padding. If the given output file name is "STDOUT" (all caps), the dump will be performed to stdout. */ /*----------------------------------------------------------------------------*/ int qfits_pixdump(const qfitsdumper * qd) { FILE * f_out; byte * buf_out; int buf_free; int buf_sz; /* Check inputs */ if (qd==NULL) return -1; if (qd->filename==NULL) return -1; switch (qd->ptype) { case PTYPE_FLOAT: if (qd->fbuf==NULL) return -1; break; case PTYPE_DOUBLE: if (qd->dbuf==NULL) return -1; break; case PTYPE_INT: if (qd->ibuf==NULL) return -1; break; default: return -1; } if (qd->npix <= 0) { qfits_error("Negative or NULL number of pixels specified"); return -1; } /* * Special cases: input buffer is identical to requested format. * This is only possible on big-endian machines, since FITS is * big-endian only. */ buf_out = NULL; buf_free = 1; #ifdef WORDS_BIGENDIAN if (qd->ptype==PTYPE_FLOAT && qd->out_ptype==-32) { buf_out = (byte*)qd->fbuf; buf_free=0; } else if (qd->ptype==PTYPE_DOUBLE && qd->out_ptype==-64) { buf_out = (byte*)qd->dbuf; buf_free=0; } else if (qd->ptype==PTYPE_INT && qd->out_ptype==32) { buf_out = (byte*)qd->ibuf; buf_free=0; } #endif buf_sz = qd->npix * BYTESPERPIXEL(qd->out_ptype); /* General case */ if (buf_out==NULL) { switch (qd->ptype) { /* Convert buffer */ case PTYPE_FLOAT: buf_out = qfits_pixdump_float( qd->fbuf, qd->npix, qd->out_ptype); break; /* Convert buffer */ case PTYPE_INT: buf_out = qfits_pixdump_int( qd->ibuf, qd->npix, qd->out_ptype); break; /* Convert buffer */ case PTYPE_DOUBLE: buf_out = qfits_pixdump_double( qd->dbuf, qd->npix, qd->out_ptype); break; } } if (buf_out==NULL) { qfits_error("cannot dump pixel buffer"); return -1; } /* Dump buffer */ if (!strncmp(qd->filename, "STDOUT", 6)) { f_out = stdout; } else { f_out = fopen(qd->filename, "a"); } if (f_out==NULL) { qfits_free(buf_out); return -1; } fwrite(buf_out, buf_sz, 1, f_out); if (buf_free) { qfits_free(buf_out); } if (f_out!=stdout) { fclose(f_out); } return 0; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief Convert a float pixel buffer to a byte buffer. @param buf Input float buffer. @param npix Number of pixels in the input buffer. @param ptype Requested output BITPIX type. @return 1 pointer to a newly allocated byte buffer. This function converts the given float buffer to a buffer of bytes suitable for dumping to a FITS file (i.e. big-endian, in the requested pixel type). The returned pointer must be deallocated using the qfits_free() function. */ /*----------------------------------------------------------------------------*/ static byte * qfits_pixdump_float(const float * buf, int npix, int ptype) { byte * buf_out; register byte * op; int i; int lpix; short spix; double dpix; buf_out = qfits_malloc(npix * BYTESPERPIXEL(ptype)); op = buf_out; switch (ptype) { case 8: /* Convert from float to 8 bits */ for (i=0; i255.0) { *op++ = (byte)0xff; } else if (buf[i]<0.0) { *op++ = (byte)0x00; } else { *op++ = (byte)buf[i]; } } break; case 16: /* Convert from float to 16 bits */ for (i=0; i32767.0) { *op++ = (byte)0x7f; *op++ = (byte)0xff; } else if (buf[i]<-32768.0) { *op++ = (byte)0x80; *op++ = 0x00; } else { spix = (short)buf[i]; *op++ = (spix >> 8); *op++ = (spix & (byte)0xff); } } break; case 32: /* Convert from float to 32 bits */ for (i=0; i 2147483647.0) { *op++ = (byte)0x7f; *op++ = (byte)0xff; *op++ = (byte)0xff; *op++ = (byte)0xff; } else if (buf[i]<-2147483648.0) { *op++ = (byte)0x80; *op++ = (byte)0x00; *op++ = (byte)0x00; *op++ = (byte)0x00; } else { lpix = (int)buf[i]; *op++ = (byte)(lpix >> 24); *op++ = (byte)(lpix >> 16) & 0xff; *op++ = (byte)(lpix >> 8 ) & 0xff; *op++ = (byte)(lpix) & 0xff; } } break; case -32: /* Convert from float to float */ memcpy(op, buf, npix * sizeof(float)); #ifndef WORDS_BIGENDIAN for (i=0; i255) { *op++ = (byte)0xff; } else if (buf[i]<0) { *op++ = (byte)0x00; } else { *op++ = (byte)buf[i]; } } break; case 16: /* Convert from int32 to 16 bits */ for (i=0; i32767) { spix = 32767; } else if (buf[i]<-32768) { spix = -32768; } else { spix = (short)buf[i]; } #ifndef WORDS_BIGENDIAN qfits_swap_bytes(&spix, 2); #endif memcpy(op, &spix, 2); op += 2; } break; case 32: /* Convert from int32 to 32 bits */ memcpy(op, buf, npix * sizeof(int)); #ifndef WORDS_BIGENDIAN for (i=0; i255.0) { *op++ = (byte)0xff; } else if (buf[i]<0.0) { *op++ = (byte)0x00; } else { *op++ = (byte)buf[i]; } } break; case 16: /* Convert from double to 16 bits */ for (i=0; i32767.0) { spix = 32767; } else if (buf[i]<-32768.0) { spix = -32768; } else { spix = (short)buf[i]; } #ifndef WORDS_BIGENDIAN qfits_swap_bytes(&spix, 2); #endif memcpy(op, &spix, 2); op += 2; } break; case 32: /* Convert from double to 32 bits */ for (i=0; i 2147483647.0) { lpix = 2147483647; } else if (buf[i] < -2147483648.0) { lpix = -2147483647; } else { lpix = (int)buf[i]; } #ifndef WORDS_BIGENDIAN qfits_swap_bytes(&lpix, 4); #endif memcpy(op, &lpix, 4); op += 4; } break; case -32: /* Convert from double to float */ for (i=0; ifilename, ql->xtnum, ql->pnum, ql->ptype, ql->lx, ql->ly, ql->np, ql->bitpix, ql->seg_start, ql->bscale, ql->bzero, ql->ibuf, ql->fbuf, ql->dbuf); } int main (int argc, char * argv[]) { qfitsloader ql; if (argc<2) { printf("use: %s \n", argv[0]); return 1; } ql.filename = argv[1]; ql.xtnum = 0; ql.pnum = 0; ql.ptype = PTYPE_FLOAT; if (qfits_loadpix(&ql)!=0) { printf("error occurred during loading: abort\n"); return -1; } qfitsloader_dump(&ql); printf("pix[0]=%g\n" "pix[100]=%g\n" "pix[10000]=%g\n", ql.fbuf[0], ql.fbuf[100], ql.fbuf[10000]); qfits_free(ql.fbuf); ql.ptype = PTYPE_INT; if (qfits_loadpix(&ql)!=0) { printf("error occurred during loading: abort\n"); return -1; } qfitsloader_dump(&ql); printf("pix[0]=%d\n" "pix[100]=%d\n" "pix[10000]=%d\n", ql.ibuf[0], ql.ibuf[100], ql.ibuf[10000]); qfits_free(ql.ibuf); ql.ptype = PTYPE_DOUBLE; if (qfits_loadpix(&ql)!=0) { printf("error occurred during loading: abort\n"); return -1; } qfitsloader_dump(&ql); printf("pix[0]=%g\n" "pix[100]=%g\n" "pix[10000]=%g\n", ql.dbuf[0], ql.dbuf[100], ql.dbuf[10000]); qfits_free(ql.dbuf); return 0; } #endif astrometry.net-0.67/qfits-an/qfits_md5.c000644 000765 000024 00000014563 12651445460 020360 0ustar00dstnstaff000000 000000 /* $Id: qfits_md5.c,v 1.9 2007/01/10 08:53:45 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2007/01/10 08:53:45 $ * $Revision: 1.9 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include "qfits_md5.h" #include "md5.h" #include "qfits_std.h" #include "qfits_error.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* Size of an MD5 hash in bytes (32 bytes are 128 bits) */ #define MD5HASHSZ 32 /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_md5 FITS data block MD5 computation routine * * This module offers MD5 computation over all data areas of a FITS file. * */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function code -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Compute the MD5 hash of data zones in a FITS file. @param filename Name of the FITS file to examine. @return 1 statically allocated character string, or NULL. This function expects the name of a FITS file. It will compute the MD5 hash on all data blocks in the main data section and possibly extensions (including zero-padding blocks if necessary) and return it as a string suitable for inclusion into a FITS keyword. The returned string is statically allocated inside this function, so do not free it or modify it. This function returns NULL in case of error. */ /*----------------------------------------------------------------------------*/ const char * qfits_datamd5(const char * filename) { static char datamd5[MD5HASHSZ+1]; struct MD5Context ctx; unsigned char digest[16]; FILE * in; char buf[FITS_BLOCK_SIZE]; char * buf_c; int i; int in_header; int check_fits; /* Check entries */ if (filename==NULL) return NULL; /* Open input file */ if ((in=fopen(filename, "r"))==NULL) { qfits_error("cannot open file %s", filename); return NULL; } /* Initialize all variables */ MD5Init(&ctx); in_header=1; check_fits=0; /* Loop over input file */ while (fread(buf, 1, FITS_BLOCK_SIZE, in)==FITS_BLOCK_SIZE) { /* First time in the loop: check the file is FITS */ if (check_fits==0) { /* Examine first characters in block */ if (buf[0]!='S' || buf[1]!='I' || buf[2]!='M' || buf[3]!='P' || buf[4]!='L' || buf[5]!='E' || buf[6]!=' ' || buf[7]!=' ' || buf[8]!='=') { qfits_error("file [%s] is not FITS\n", filename); fclose(in); return NULL; } else { check_fits=1; } } if (in_header) { buf_c = buf; for (i=0; i #include #include #include #include #include #include #include #include #include #include #include "qfits_error.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* This symbol sets the debug level for the memory module. Debug levels are defined as follows: 0 no debugging. 1 add tracing for memory leaks and diagnostics in qfits_memory_status 2 add lots of debug messages */ #ifndef QFITS_MEMORY_DEBUG #define QFITS_MEMORY_DEBUG 0 #endif /* This symbol defines the level of usage of the memory module. 0 Use the memory system calls. 1 Use the memory system calls, but exit if they are not succesfull 2 Fully use the memory functions */ #ifndef QFITS_MEMORY_MODE #define QFITS_MEMORY_MODE 0 #endif /* Initial number of entries in memory table */ /* If this number is big, the size of the memory table can become problematic. */ #ifndef QFITS_MEMORY_MAXPTRS #define QFITS_MEMORY_MAXPTRS 200003 #endif /* Identify true RAM memory */ #define MEMTYPE_RAM 'R' /* Identify swap memory */ #define MEMTYPE_SWAP 'S' /* Identify memory-mapped file */ #define MEMTYPE_MMAP 'M' /* Minimal page size in bytes */ #define MEMPAGESZ 2048 /* Size of temporary dir name */ #define TMPDIRNAMESZ 1024 /* Size of temporary file names */ #define TMPFILENAMESZ 1024 /* Size of source file names */ #define SRCFILENAMESZ 64 /* Size of mapped file names */ #define MAPFILENAMESZ 256 /*----------------------------------------------------------------------------- Macros -----------------------------------------------------------------------------*/ /* Debug */ #if (QFITS_MEMORY_DEBUG>=2) #define qfits_mem_debug( code ) { code } #else #define qfits_mem_debug( code ) #endif /* A very simple hash */ #define PTR_HASH(ptr) (((unsigned long int) ptr) % QFITS_MEMORY_MAXPTRS) /*----------------------------------------------------------------------------- Private variables -----------------------------------------------------------------------------*/ /* Initialization flag */ static int qfits_memory_initialized=0; /* Path to temporary directory */ static char qfits_memory_tmpdirname[TMPDIRNAMESZ] = "."; /*----------------------------------------------------------------------------*/ /* This table holds a list pointer cells (all the ones allocated so far). It is strictly internal to this source file. */ /*----------------------------------------------------------------------------*/ static struct { /* Number of active cells */ int ncells; /* Total allocated memory in bytes */ size_t alloc_total; /* Total allocated RAM in bytes */ size_t alloc_ram; /* Total allocated VM in bytes */ size_t alloc_swap; /* Peak allocation ever seen for diagnostics */ size_t alloc_max; /* Peak number of pointers ever seen for diagnostics */ int max_cells; /* Current number of swap files */ int nswapfiles; /* Registration counter for swap files */ int file_reg; /* Current number of memory-mapped files */ int n_mm_files; /* Current number of mappings derived from files */ int n_mm_mappings; #ifdef __linux__ /* Page size in bytes (Linux only) */ int pagesize; /* Value found for RLIMIT_DATA (Linux only) */ int rlimit_data; #endif } qfits_memory_table; /* Various infos about the pointers */ /* List of pointers (outside of cells for efficiency reason) */ static void * qfits_memory_p_val[QFITS_MEMORY_MAXPTRS]; /* Pointed size in bytes */ static size_t qfits_memory_p_size[QFITS_MEMORY_MAXPTRS]; #if (QFITS_MEMORY_DEBUG>=1) /* Name of the source file where the alloc was requested */ static char * qfits_memory_p_filename[QFITS_MEMORY_MAXPTRS]; /* Line number where the alloc was requested */ static int qfits_memory_p_lineno[QFITS_MEMORY_MAXPTRS]; #endif /* Memory type: RAM, swap, or mapped file */ static char qfits_memory_p_memtype[QFITS_MEMORY_MAXPTRS]; /* Swap memory only */ /* Swap file ID */ static int qfits_memory_p_swapfileid[QFITS_MEMORY_MAXPTRS]; /* Swap file descriptor */ static int qfits_memory_p_swapfd[QFITS_MEMORY_MAXPTRS]; /* Mapped files only */ /* Name of mapped file */ static char qfits_memory_p_mm_filename[QFITS_MEMORY_MAXPTRS][MAPFILENAMESZ]; /* Hash of mapped file name for quick search */ static unsigned qfits_memory_p_mm_hash[QFITS_MEMORY_MAXPTRS]; /* Reference counter for this pointer */ static int qfits_memory_p_mm_refcount[QFITS_MEMORY_MAXPTRS]; /*----------------------------------------------------------------------------- Private function prototypes -----------------------------------------------------------------------------*/ static unsigned qfits_memory_hash(const char *); static void qfits_memory_init(void); static void qfits_memory_cleanup(void); static int qfits_memory_addcell(void*, size_t, const char*, int, char, int, int, const char*); static int qfits_memory_remcell(int); static void qfits_memory_dumpcell(int, FILE*); static char * qfits_memory_tmpfilename(int); static char * strdup_(const char * str); void qfits_memory_status_(const char *, int); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_memory POSIX-compatible extended memory handling * * qfits_memory is a small and efficient module offering memory extension * capabitilies to ANSI C programs running on POSIX-compliant systems. It * offers several useful features such as memory leak detection, protection for * free on NULL or unallocated pointers, and virtually unlimited memory space. * qfits_memory requires the @c mmap() system call to be implemented in the * local C library to function. This module has been tested on a number of * current Unix * flavours and is reported to work fine. * The current limitation is the limited number of pointers it can handle at * the same time. */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Allocate memory. @param size Size (in bytes) to allocate. @param filename Name of the file where the alloc took place. @param lineno Line number in the file. @return 1 newly allocated pointer. This function is a replacement call for malloc. It should never be called directly but through a macro instead, as: @code qfits_memory_malloc(size, __FILE__, __LINE__) @endcode */ /*----------------------------------------------------------------------------*/ void * qfits_memory_malloc( size_t size, const char * filename, int lineno) { void * ptr; char * fname; int swapfileid; int swapfd; char wbuf[MEMPAGESZ]; int nbufs; int memtype; int i; #ifdef __linux__ int p; #endif /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if (QFITS_MEMORY_MODE == 0) return malloc(size); else if (QFITS_MEMORY_MODE == 1) { ptr = malloc(size); if (ptr == NULL) exit(1); else return ptr; } /* Initialize table if needed */ if (qfits_memory_initialized==0) { qfits_memory_init(); qfits_memory_initialized++; } /* Protect the call */ if (size==0) { qfits_mem_debug( fprintf(stderr, "qfits_mem: malloc called with 0 size - %s (%d)\n", filename, lineno); ); return NULL; } /* Try to allocate in memory */ #ifdef __linux__ /* Linux does not honor the RLIMIT_DATA limit. * The only way to limit the amount of memory taken by * a process is to set RLIMIT_AS, which unfortunately also * limits down the maximal amount of memory addressable with * mmap() calls, making on-the-fly swap space creation useless * in this module. To avoid this, the RLIMIT_DATA value * is honored here with this test. */ ptr = NULL; if (qfits_memory_table.rlimit_data<1) { /* No limit set on RLIMIT_DATA: proceed with malloc */ ptr = malloc(size); } else if (qfits_memory_table.alloc_total+size <= (size_t)qfits_memory_table.rlimit_data) { /* Next allocation will still be within limits: proceed */ ptr = malloc(size); } #else ptr = malloc(size); #endif if (ptr==NULL) { /* No more RAM available: try to allocate private swap */ qfits_mem_debug( fprintf(stderr, "qfits_mem: hit a NULL pointer -- swapping\n"); ); /* Create swap file with rights: rw-rw-rw- */ swapfileid = ++ qfits_memory_table.file_reg; fname = qfits_memory_tmpfilename(swapfileid); swapfd = open(fname, O_RDWR | O_CREAT); if (swapfd==-1) { fprintf(stderr, "qfits_mem: cannot create swap file\n"); exit(-1); } fchmod(swapfd, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); /* Compute number of passes to insert buffer */ nbufs = size / MEMPAGESZ; if (size % MEMPAGESZ != 0) nbufs ++; /* Dump empty buffers into file */ memset(wbuf, 0, MEMPAGESZ); for (i=0; i qfits_memory_table.alloc_max) qfits_memory_table.alloc_max = qfits_memory_table.alloc_total; /* Insert memory stamp */ return (void*)ptr; } /*----------------------------------------------------------------------------*/ /** @brief Allocate memory. @param nmemb Number of elements to allocate. @param size Size (in bytes) of each element. @param filename Name of the file where the alloc took place. @param lineno Line number in the file. @return 1 newly allocated pointer. This function is a replacement call for calloc. It should never be called directly but through a macro instead, as: @code qfits_memory_calloc(nmemb, size, __FILE__, __LINE__) @endcode */ /*----------------------------------------------------------------------------*/ void * qfits_memory_calloc( size_t nmemb, size_t size, const char * filename, int lineno) { void * ptr; /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if (QFITS_MEMORY_MODE == 0) return calloc(nmemb, size); else if (QFITS_MEMORY_MODE == 1) { ptr = calloc(nmemb, size); if (ptr == NULL) exit(1); else return ptr; } ptr = qfits_memory_malloc(nmemb * size, filename, lineno); return memset(ptr, 0, nmemb * size); } // copied from ioutils.c static void get_mmap_size(size_t start, size_t size, off_t* mapstart, size_t* mapsize, int* pgap) { int ps = getpagesize(); int gap = start % ps; // start must be a multiple of pagesize. *mapstart = start - gap; *mapsize = size + gap; *pgap = gap; } void qfits_memory_fdealloc2( void * ptr, size_t len, const char * filename, int lineno) { if (munmap(ptr, len)) { qfits_error("qfits_memory_fdealloc2(%s:%i): Failed to munmap(): %s\n", filename, lineno, strerror(errno)); } } void* qfits_memory_falloc2( const char* name, size_t offs, size_t size, char** freeaddr, size_t* freesize, const char * srcname, int srclin) { char * ptr; struct stat sta; int fd; int eno; size_t maplen; off_t mapstart; int mapoff; /* Check file's existence and compute its size */ if (stat(name, &sta)==-1) { qfits_warning("qfits_memory_falloc2(%s:%i): cannot stat file \"%s\"\n", srcname, srclin, name); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Check offset request does not go past end of file */ if ((offs + size) > (size_t)sta.st_size) { qfits_warning("qfits_memory_falloc2(%s:%i): offset request exceeds file size (%zu + %zu = %zu > %zu) for file \"%s\"\n", srcname, srclin, offs, size, (offs + size), (size_t)sta.st_size, name); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Open file */ if ((fd=open(name, O_RDONLY))==-1) { qfits_warning("qfits_memory_falloc2(%s:%i): failed to open file \"%s\": %s\n", srcname, srclin, name, strerror(errno)); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Memory-map input file */ // mmap requires page-aligned offsets. get_mmap_size(offs, size, &mapstart, &maplen, &mapoff); ptr = (char*)mmap(0, maplen, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, mapstart); eno = errno; /* Close file */ close(fd); if (ptr == MAP_FAILED || ptr==NULL) { qfits_warning("qfits_memory_falloc2(%s:%i): failed to mmap file \"%s\": %s\n", srcname, srclin, name, strerror(eno)); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } if (freeaddr) { *freeaddr = ptr; } if (freesize) { *freesize = maplen; } return ptr + mapoff; } /*----------------------------------------------------------------------------*/ /** @brief Map a file's contents to memory as a char pointer. @param name Name of the file to map @param offs Offset to the first mapped byte in file. @param size Returned size of the mapped file in bytes. @param srcname Name of the source file making the call. @param srclin Line # where the call was made. @return A pointer to char, to be freed using qfits_memory_fdealloc(). This function takes in input the name of a file. It tries to map the file into memory and if it succeeds, returns the file's contents as a char pointer. It also modifies the input size variable to be the size of the mapped file in bytes. This function is normally never directly called but through the falloc() macro. The offset indicates the starting point for the mapping, i.e. if you are not interested in mapping the whole file but only from a given place. The returned pointer ptr must be deallocated with qfits_memory_fdealloc(ptr) */ /*----------------------------------------------------------------------------*/ char * qfits_memory_falloc( const char * name, size_t offs, size_t * size, const char * srcname, int srclin) { unsigned mm_hash; char * ptr; struct stat sta; int fd; int nptrs; int i; int eno; /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if ((QFITS_MEMORY_MODE == 0) || (QFITS_MEMORY_MODE == 1)) { if (size!=NULL) *size = 0; /* Check file's existence and compute its size */ if (stat(name, &sta)==-1) { qfits_warning("qfits_memory_falloc(%s:%i): cannot stat file \"%s\"\n", srcname, srclin, name); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Check offset request does not go past end of file */ if (offs>=(size_t)sta.st_size) { qfits_warning("qfits_memory_falloc(%s:%i): offset request exceeds file size (%zu > %zu) for file \"%s\"\n", srcname, srclin, offs, (size_t)sta.st_size); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Open file */ if ((fd=open(name, O_RDONLY))==-1) { qfits_warning("qfits_memory_falloc(%s:%i): failed to open file \"%s\": %s\n", srcname, srclin, name, strerror(errno)); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } /* Memory-map input file */ ptr = (char*)mmap(0, sta.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); eno = errno; /* Close file */ close(fd); if (ptr == MAP_FAILED || ptr==NULL) { qfits_warning("qfits_memory_falloc(%s:%i): failed to mmap file \"%s\": %s\n", srcname, srclin, name, strerror(eno)); if (QFITS_MEMORY_MODE == 0) return NULL; else exit(1); } qfits_mem_debug( fprintf(stderr, "qfits_mem: falloc mmap succeeded for [%s] - %s (%d)\n", name, srcname, srclin); ); if (size!=NULL) (*size) = sta.st_size; return ptr + offs; } /* Protect the call */ if (size!=NULL) *size = 0; /* Initialize table if needed */ if (qfits_memory_initialized==0) { qfits_memory_init(); qfits_memory_initialized++; } if (qfits_memory_table.ncells>0) { /* Check if file has already been mapped */ /* Compute hash for this name */ mm_hash = qfits_memory_hash(name); /* Loop over all memory cells */ nptrs=0; for (i=0; i= qfits_memory_p_size[i]) { qfits_mem_debug( fprintf(stderr, "qfits_mem: falloc offset larger than file sz"); ); return NULL; } /* Increase reference counter */ qfits_memory_p_mm_refcount[i] ++; qfits_mem_debug( fprintf(stderr, "qfits_mem: incref on %s (%d mappings)\n", name, qfits_memory_p_mm_refcount[i]); ); /* Increase number of mappings */ qfits_memory_table.n_mm_mappings ++; /* Build up return pointer */ ptr = (char*)qfits_memory_p_val[i] + offs; /* Available size is filesize minus offset */ if (size!=NULL) { *size = qfits_memory_p_size[i] - offs; } /* Return constructed pointer as void * */ return (void*)ptr; } } if (nptrs>=qfits_memory_table.ncells) break; } } /* First mapping attempt for this file */ /* Check file's existence and compute its size */ if (stat(name, &sta)==-1) { qfits_mem_debug( fprintf(stderr, "qfits_mem: cannot stat file %s - %s (%d)\n", name, srcname, srclin); ); return NULL; } /* Check offset request does not go past end of file */ if (offs>=(size_t)sta.st_size) { qfits_mem_debug( fprintf(stderr, "qfits_mem: falloc offsets larger than file size"); ); return NULL; } /* Open file */ if ((fd=open(name, O_RDONLY))==-1) { qfits_mem_debug( fprintf(stderr, "qfits_mem: cannot open file %s - %s (%d)\n", name, srcname, srclin); ); return NULL; } /* Memory-map input file */ ptr = (char*)mmap(0, sta.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE,fd,0); /* Close file */ close(fd); if (ptr == (char*)-1 || ptr==NULL) { qfits_mem_debug( perror("mmap"); fprintf(stderr, "qfits_mem: falloc cannot mmap file %s", name); ); return NULL; } qfits_memory_table.n_mm_files ++; qfits_memory_table.n_mm_mappings ++; qfits_mem_debug( fprintf(stderr, "qfits_mem: falloc mmap succeeded for [%s] - %s (%d)\n", name, srcname, srclin); ); /* Add cell into general table */ (void) qfits_memory_addcell((void*)ptr, sta.st_size, srcname, srclin, MEMTYPE_MMAP, -1, -1, name); if (size!=NULL) (*size) = sta.st_size; return ptr + offs; } /*----------------------------------------------------------------------------*/ /** @brief Free memory that has been allocated with falloc @param ptr Pointer to free. @param offs Offset to the first mapped byte in file. @param size size to unmap @param filename Name of the file where the dealloc took place. @param lineno Line number in the file. @return void */ /*----------------------------------------------------------------------------*/ void qfits_memory_fdealloc( void * ptr, size_t offs, size_t size, const char * filename, int lineno) { int i; int pos; char * swapname; int nptrs; int ii; /* Do nothing for a NULL pointer */ if (ptr==NULL) { /* Output a warning */ fprintf(stderr, "qfits_mem: free requested on NULL ptr -- %s (%d)\n", filename, lineno); return; } /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if ((QFITS_MEMORY_MODE == 0) || (QFITS_MEMORY_MODE == 1)) { munmap((char*)(ptr)-offs, size); return; } /* Locate pointer in main table */ nptrs = 0; pos = -1; i = PTR_HASH(ptr); for (ii=0; ii= (char*)ptr)) { pos = i; break; } } if (nptrs>=qfits_memory_table.ncells) break; } if (pos==-1) { fprintf(stderr, "qfits_mem: %s (%d) free req. on unallocated pointer (%p)\n", filename, lineno, ptr); /* Pointer sent to system's free() function, maybe it should not? */ free(ptr); return; } /* Deallocate pointer */ switch (qfits_memory_p_memtype[pos]) { case MEMTYPE_RAM: /* --- RAM pointer */ /* Free normal memory pointer */ free(ptr); qfits_memory_table.alloc_ram -= qfits_memory_p_size[pos]; break; case MEMTYPE_SWAP: /* --- SWAP pointer */ swapname = qfits_memory_tmpfilename(qfits_memory_p_swapfileid[pos]); qfits_mem_debug( fprintf(stderr, "qfits_mem: deallocating swap file [%s]\n", swapname); ); /* Munmap file */ if (munmap(ptr, qfits_memory_p_size[pos])!=0) { qfits_mem_debug( perror("munmap"); ); } /* Close swap file */ if (close(qfits_memory_p_swapfd[pos])==-1) { qfits_mem_debug( perror("close"); ); } /* Remove swap file */ if (remove(swapname)!=0) { qfits_mem_debug( perror("remove"); ); } qfits_memory_table.alloc_swap -= qfits_memory_p_size[pos]; qfits_memory_table.nswapfiles --; break; case MEMTYPE_MMAP: /* --- MEMORY-MAPPED pointer */ /* Decrease reference count */ qfits_memory_p_mm_refcount[pos] --; /* Decrease total number of mappings */ qfits_memory_table.n_mm_mappings --; /* Non-null ref count means the file stays mapped */ if (qfits_memory_p_mm_refcount[pos]>0) { qfits_mem_debug( fprintf(stderr, "qfits_mem: decref on %s (%d mappings)\n", qfits_memory_p_mm_filename[pos], qfits_memory_p_mm_refcount[pos]); ); return; } /* Ref count reached zero: unmap the file */ qfits_mem_debug( fprintf(stderr, "qfits_mem: unmapping file %s\n", qfits_memory_p_mm_filename[pos]); ); munmap((char*)qfits_memory_p_val[pos], qfits_memory_p_size[pos]); /* Decrease total number of mapped files */ qfits_memory_table.n_mm_files --; break; default: qfits_mem_debug( fprintf(stderr, "qfits_mem: unknown memory cell type???"); ); break; } if (qfits_memory_p_memtype[pos]!=MEMTYPE_MMAP) { /* Adjust allocated totals */ qfits_memory_table.alloc_total -= qfits_memory_p_size[pos]; /* Print out message in debug mode */ qfits_mem_debug( fprintf(stderr, "qfits_mem: free(%p) %ld bytes in %s (%d)\n", ptr, (long)qfits_memory_p_size[pos], filename, lineno); ); } /* Remove cell from main table */ qfits_memory_remcell(pos); return; } /*----------------------------------------------------------------------------*/ /** @brief Free memory. @param ptr Pointer to free. @param filename Name of the file where the dealloc took place. @param lineno Line number in the file. @return void Free the memory associated to a given pointer. Prints out a warning on stderr if the requested pointer is NULL or cannot be found in the extended memory table. */ /*----------------------------------------------------------------------------*/ void qfits_memory_free( void * ptr, const char * filename, int lineno) { int i; int pos; char * swapname; int nptrs; int ii; /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if ((QFITS_MEMORY_MODE == 0) || (QFITS_MEMORY_MODE == 1)) { free(ptr); return; } /* Do nothing for a NULL pointer */ if (ptr==NULL) { /* Output a warning */ fprintf(stderr, "qfits_mem: free requested on NULL ptr -- %s (%d)\n", filename, lineno); return; } /* Locate pointer in main table */ nptrs = 0; pos = -1; i = PTR_HASH(ptr); for (ii=0; ii= (char*)ptr)) { pos = i; break; } } if (nptrs>=qfits_memory_table.ncells) break; } if (pos==-1) { fprintf(stderr, "qfits_mem: %s (%d) free requested on unallocated ptr (%p)\n", filename, lineno, ptr); /* Pointer sent to system's free() function, maybe it should not? */ free(ptr); return; } /* Deallocate pointer */ switch (qfits_memory_p_memtype[pos]) { case MEMTYPE_RAM: /* --- RAM pointer */ /* Free normal memory pointer */ free(ptr); qfits_memory_table.alloc_ram -= qfits_memory_p_size[pos]; break; case MEMTYPE_SWAP: /* --- SWAP pointer */ swapname = qfits_memory_tmpfilename(qfits_memory_p_swapfileid[pos]); qfits_mem_debug( fprintf(stderr, "qfits_mem: deallocating swap file [%s]\n", swapname); ); /* Munmap file */ if (munmap(ptr, qfits_memory_p_size[pos])!=0) { qfits_mem_debug( perror("munmap"); ); } /* Close swap file */ if (close(qfits_memory_p_swapfd[pos])==-1) { qfits_mem_debug( perror("close"); ); } /* Remove swap file */ if (remove(swapname)!=0) { qfits_mem_debug( perror("remove"); ); } qfits_memory_table.alloc_swap -= qfits_memory_p_size[pos]; qfits_memory_table.nswapfiles --; break; case MEMTYPE_MMAP: /* --- MEMORY-MAPPED pointer */ /* Decrease reference count */ qfits_memory_p_mm_refcount[pos] --; /* Decrease total number of mappings */ qfits_memory_table.n_mm_mappings --; /* Non-null ref count means the file stays mapped */ if (qfits_memory_p_mm_refcount[pos]>0) { qfits_mem_debug( fprintf(stderr, "qfits_mem: decref on %s (%d mappings)\n", qfits_memory_p_mm_filename[pos], qfits_memory_p_mm_refcount[pos]); ); return; } /* Ref count reached zero: unmap the file */ qfits_mem_debug( fprintf(stderr, "qfits_mem: unmapping file %s\n", qfits_memory_p_mm_filename[pos]); ); munmap((char*)qfits_memory_p_val[pos], qfits_memory_p_size[pos]); /* Decrease total number of mapped files */ qfits_memory_table.n_mm_files --; break; default: qfits_mem_debug( fprintf(stderr, "qfits_mem: unknown memory cell type???"); ); break; } if (qfits_memory_p_memtype[pos]!=MEMTYPE_MMAP) { /* Adjust allocated totals */ qfits_memory_table.alloc_total -= qfits_memory_p_size[pos]; /* Print out message in debug mode */ qfits_mem_debug( fprintf(stderr, "qfits_mem: free(%p) %ld bytes in %s (%d)\n", ptr, (long)qfits_memory_p_size[pos], filename, lineno); ); } /* Remove cell from main table */ qfits_memory_remcell(pos); return; } /*----------------------------------------------------------------------------*/ /** @brief Re-Allocate memory. @param ptr Pointer to free. @param size Size (in bytes) to allocate. @param filename Name of the file where the alloc took place. @param lineno Line number in the file. @return 1 newly allocated pointer. This function is a replacement call for realloc. It should never be called directly but through a macro instead, as: @code qfits_memory_realloc(nmemb, size, __FILE__, __LINE__) @endcode */ /*----------------------------------------------------------------------------*/ void * qfits_memory_realloc( void * ptr, size_t size, const char * filename, int lineno) { void * ptr2; size_t small_sz; size_t ptr_sz; int pos = -1; int i; /* If QFITS_MEMORY_MODE is 0 or 1, do not use the qfits_memory model */ if (QFITS_MEMORY_MODE == 0) return realloc(ptr, size); else if (QFITS_MEMORY_MODE == 1) { ptr2 = realloc(ptr, size); if (ptr2 == NULL) exit(1); else return ptr2; } if (ptr == NULL) return qfits_memory_malloc(size, filename, lineno); /* Get the pointer size */ for (i=0; i=1) fprintf(stderr, "#----- memory diagnostics -----\n"); fprintf(stderr, "#- Peak memory usage\n" "ALL_maxalloc_kb %ld\n" "ALL_maxpointers %d\n", (long)(qfits_memory_table.alloc_max/1024), qfits_memory_table.max_cells); fprintf(stderr, "#- Local implementation\n" "TAB_ptrs %d\n" "TAB_size %u bytes\n", QFITS_MEMORY_MAXPTRS, (unsigned)sizeof(qfits_memory_table)); #ifdef __linux__ fprintf(stderr, "#- Linux specific\n" "LINUX_pagesize %d bytes\n" "LINUX_RLIMIT_DATA %d kb\n", qfits_memory_table.pagesize, qfits_memory_table.rlimit_data); #endif #endif if (qfits_memory_table.ncells<1) return; fprintf(stderr, "#----- memory diagnostics -----\n"); fprintf(stderr, "#- ALL status\n" "ALL_npointers %d\n" "ALL_size %ld\n" "ALL_maxalloc_kb %ld\n" "ALL_maxpointers %d\n", qfits_memory_table.ncells, (long)qfits_memory_table.alloc_total, (long)(qfits_memory_table.alloc_max/1024), qfits_memory_table.max_cells); if (qfits_memory_table.alloc_ram > 0) { fprintf(stderr, "#- RAM status\n" "RAM_alloc %ld\n", (long)qfits_memory_table.alloc_ram); } if (qfits_memory_table.alloc_swap > 0) { fprintf(stderr, "#- SWP status\n" "SWP_alloc %ld\n" "SWP_files %d\n", (long)qfits_memory_table.alloc_swap, qfits_memory_table.nswapfiles); } if (qfits_memory_table.n_mm_files>0) { fprintf(stderr, "#- MAP status\n" "MAP_files %d\n" "MAP_mappings %d\n", qfits_memory_table.n_mm_files, qfits_memory_table.n_mm_mappings); } fprintf(stderr, "#- pointer details\n"); for (i=0; i * Message-ID: <4rvjs2$6oh@elna.ethz.ch> * * Most systems don't have this (yet) */ static char * strdup_(const char * str) { char * p; if ((p = malloc(strlen(str)+1)) == NULL) return((char *) NULL); (void) strcpy(p, str); return(p); } /*----------------------------------------------------------------------------*/ /** @brief Hash a string to an unsigned value. @param key String to hash @return 1 unsigned value as a hash for the given string. This hash function has been taken from an Article in Dr Dobbs Journal. This is normally a collision-free function, distributing keys evenly. The key is stored anyway in the struct so that collision can be avoided by comparing the key itself in last resort. */ /*----------------------------------------------------------------------------*/ static unsigned qfits_memory_hash(const char * key) { int len; unsigned hash; int i; len = strlen(key); for (hash=0, i=0; i>6); } hash += (hash <<3); hash ^= (hash >>11); hash += (hash <<15); return hash; } /*----------------------------------------------------------------------------*/ /** @brief Initialize extended memory features. @return void This function is implicitly called by the first malloc() or calloc() or strdup_() execution. It allocates a minimal number of memory cells into the global extended memory table. It also install atexit routines the first time it is called, and increases the number of possible descriptors to the maximum. */ /*----------------------------------------------------------------------------*/ static void qfits_memory_init(void) { struct rlimit rlim; qfits_mem_debug( fprintf(stderr, "qfits_mem: initializing main table size=%d ptrs (%ld bytes)\n", QFITS_MEMORY_MAXPTRS, (long)sizeof(qfits_memory_table)); ); /* Initialize memory table */ memset(&qfits_memory_table, 0, sizeof(qfits_memory_table)); /* Install cleanup routine at exit */ atexit(qfits_memory_cleanup); /* Increase number of descriptors to maximum */ getrlimit(RLIMIT_NOFILE, &rlim); qfits_mem_debug( fprintf(stderr, "qfits_mem: increasing from %ld to %ld file handles\n", (long)rlim.rlim_cur, (long)rlim.rlim_max); ); rlim.rlim_cur = rlim.rlim_max; setrlimit(RLIMIT_NOFILE, &rlim); #ifdef __linux__ /* Get RLIMIT_DATA on Linux */ getrlimit(RLIMIT_DATA, &rlim); qfits_memory_table.rlimit_data = rlim.rlim_cur; qfits_mem_debug( fprintf(stderr, "qfits_mem: got RLIMIT_DATA=%d\n", qfits_memory_table.rlimit_data); ); /* Get page size on Linux */ qfits_memory_table.pagesize = getpagesize(); #endif return; } /*----------------------------------------------------------------------------*/ /** @brief Removes all swap files. @return void This routine will delete all swap files from the temporary area. */ /*----------------------------------------------------------------------------*/ static void qfits_memory_cleanup(void) { int reg; if (qfits_memory_table.file_reg>0) { qfits_mem_debug( fprintf(stderr, "qfits_mem: cleaning up swap files... "); ); /* * Call remove() on all possible VM files. If the file exists, it * is effectively removed. It it does not, ignore the error. * This is not the cleanest way of doing it, but this function is * meant to be called also in cases of emergency (e.g. segfault), * so it should not rely on a correct memory table. */ for (reg=0; reg= QFITS_MEMORY_MAXPTRS) { fprintf(stderr, "fatal qfits_memory error: reached max pointers (%d)\n", QFITS_MEMORY_MAXPTRS); exit(-1); } /* Find an available slot */ pos = PTR_HASH(pointer); for (ii = 0; ii=1) qfits_memory_p_filename[pos] = filename; qfits_memory_p_lineno[pos] = lineno; #endif qfits_memory_p_memtype[pos] = memtype; qfits_memory_p_swapfileid[pos] = swapfileid; qfits_memory_p_swapfd[pos] = swapfd; if (mm_filename!=NULL) { strncpy(qfits_memory_p_mm_filename[pos], mm_filename,MAPFILENAMESZ); qfits_memory_p_mm_hash[pos] = qfits_memory_hash(mm_filename); qfits_memory_p_mm_refcount[pos] = 1; } else { qfits_memory_p_mm_filename[pos][0] = 0; qfits_memory_p_mm_hash[pos] = 0; qfits_memory_p_mm_refcount[pos] = 0; } qfits_memory_table.ncells ++; if (qfits_memory_table.ncells > qfits_memory_table.max_cells) qfits_memory_table.max_cells = qfits_memory_table.ncells; return pos; } /*----------------------------------------------------------------------------*/ /** @brief Remove a memory cell from the xtended memory table. @param pos Position of the pointer in the table. @return int 0 if Ok, -1 if error occurred. Remove the specified cell in qfits_memory_table. This call is not protected against illegal parameter values, so make sure the passed values are correct! */ /*----------------------------------------------------------------------------*/ static int qfits_memory_remcell(int pos) { qfits_mem_debug( fprintf(stderr, "qfits_mem: removing cell from pos %d (cached)\n", pos); ); /* Set pointer to NULL */ qfits_memory_p_val[pos] = NULL; /* Decrement number of allocated pointers */ qfits_memory_table.ncells --; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Dump a memory cell to an open file pointer. @param cell Cell to dump. @param out Open file pointer to dump to. @return void This function is meant for debugging purposes only. It takes in input a pointer to a memory cell and dumps it to the requested file pointer (it is Ok to provide stdout or stderr as file pointers). If the passed position is invalid or the table pointer is NULL, this function returns immediately. */ /*----------------------------------------------------------------------------*/ static void qfits_memory_dumpcell( int pos, FILE * out) { if (pos<0 || pos>=QFITS_MEMORY_MAXPTRS) return; if (qfits_memory_p_val[pos]==NULL) return; if (qfits_memory_p_memtype[pos] == MEMTYPE_MMAP) { #if (QFITS_MEMORY_DEBUG>=1) fprintf(out, "M(%p) - %s (%d) maps [%s] for %ld bytes", qfits_memory_p_val[pos], qfits_memory_p_filename[pos], qfits_memory_p_lineno[pos], qfits_memory_p_mm_filename[pos], (long)qfits_memory_p_size[pos]); #else fprintf(out, "M(%p) maps [%s] for %ld bytes", qfits_memory_p_val[pos], qfits_memory_p_mm_filename[pos], (long)qfits_memory_p_size[pos]); #endif } else { #if (QFITS_MEMORY_DEBUG>=1) fprintf(out, "%c(%p) - %s (%d) for %ld bytes", qfits_memory_p_memtype[pos], qfits_memory_p_val[pos], qfits_memory_p_filename[pos], qfits_memory_p_lineno[pos], (long)qfits_memory_p_size[pos]); #else fprintf(out, "%c(%p) for %ld bytes", qfits_memory_p_memtype[pos], qfits_memory_p_val[pos], (long)qfits_memory_p_size[pos]); #endif } if (qfits_memory_p_memtype[pos]==MEMTYPE_SWAP) { fprintf(out, " swf[%s][%d]", qfits_memory_tmpfilename(qfits_memory_p_swapfileid[pos]), qfits_memory_p_swapfd[pos]); } fprintf(out, "\n"); } /*----------------------------------------------------------------------------*/ /** @brief Compute filename associated to a temporary file ID. @param reg Registration number of temporary file name. @return pointer to statically allocated char string. This function computes the valid file name associated to a temporary file ID. It computes the result, stores it in an internal static string and returns a pointer to it. */ /*----------------------------------------------------------------------------*/ static char * qfits_memory_tmpfilename(int reg) { static char qfits_mem_tmpfilename[TMPFILENAMESZ]; /* Create file name using tmp directory as a base */ sprintf(qfits_mem_tmpfilename, "%s/vmswap_%05ld_%05x", qfits_memory_tmpdirname, (long)getpid(), reg); return qfits_mem_tmpfilename; } astrometry.net-0.67/qfits-an/qfits_rw.c000644 000765 000024 00000016545 12651445460 020325 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_rw.c,v 1.11 2006/02/23 11:08:59 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/23 11:08:59 $ * $Revision: 1.11 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include "qfits_rw.h" #include "qfits_card.h" #include "qfits_std.h" #include "qfits_tools.h" #include "qfits_error.h" #include "qfits_memory.h" /*----------------------------------------------------------------------------- Define -----------------------------------------------------------------------------*/ /* FITS magic number */ #define FITS_MAGIC "SIMPLE" /* Size of the FITS magic number */ #define FITS_MAGIC_SZ 6 /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_rw FITS header reading/writing */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Read a FITS header from a 'hdr' string @param hdr_str String containing the hdr file @param nb_char Number of characters in the string @return Pointer to newly allocated qfits_header or NULL in error case This function parses a 'hdr' string, and returns an allocated qfits_header object. */ /*----------------------------------------------------------------------------*/ qfits_header * qfits_header_read_hdr_string( const unsigned char * hdr_str, int nb_char) { char getval_buf[FITS_LINESZ+1]; char getkey_buf[FITS_LINESZ+1]; char getcom_buf[FITS_LINESZ+1]; qfits_header * hdr; char line[81]; char * key, * val, * com; int ind; int i, j; /* Check input */ if (hdr_str==NULL) { printf("Header string is null; returning null\n"); return NULL; } //printf("Parsing header string of length %i\n", nb_char); /* Initialise */ key = val = com = NULL; /* Create the header */ hdr = qfits_header_new(); /* Go through the file */ ind = 0; while (ind <= nb_char - 80) { strncpy(line, (char*)hdr_str + ind, 80); line[80] = '\0'; for (i=0; i<81; i++) { if (line[i] == '\n') { for (j=i; j<81; j++) line[j] = ' '; line[80] = '\0'; break; } } if (!strcmp(line, "END")) { line[3] = ' '; line[4] = '\0'; } /* Rule out blank lines */ if (!is_blank_line(line)) { /* Get key, value, comment for the current line */ key = qfits_getkey_r(line, getkey_buf); val = qfits_getvalue_r(line, getval_buf); com = qfits_getcomment_r(line, getcom_buf); /* If key or value cannot be found, trigger an error */ if (key==NULL) { qfits_header_destroy(hdr); printf("Failed to parse line: %s\n", line); return NULL; } /* Append card to linked-list */ qfits_header_append(hdr, key, val, com, NULL); } ind += 80; } /* The last key should be 'END' */ if (strlen(key)!=3) { qfits_header_destroy(hdr); printf("Last key not END\n"); return NULL; } if (key[0]!='E' || key[1]!='N' || key[2]!='D') { qfits_header_destroy(hdr); printf("Last key not END\n"); return NULL; } return hdr; } /*----------------------------------------------------------------------------*/ /** @brief Pad an existing file with zeros to a multiple of 2880. @param filename Name of the file to pad. @return void This function simply pads an existing file on disk with enough zeros for the file size to reach a multiple of 2880, as required by FITS. */ /*----------------------------------------------------------------------------*/ void qfits_zeropad(const char * filename) { struct stat sta; int size; int remaining; FILE * out; char * buf; if (filename==NULL) return; /* Get file size in bytes */ if (stat(filename, &sta)!=0) { return; } size = (int)sta.st_size; /* Compute number of zeros to pad */ remaining = size % FITS_BLOCK_SIZE; if (remaining==0) return; remaining = FITS_BLOCK_SIZE - remaining; /* Open file, dump zeros, exit */ if ((out=fopen(filename, "a"))==NULL) return; buf = qfits_calloc(remaining, sizeof(char)); fwrite(buf, 1, remaining, out); fclose(out); qfits_free(buf); return; } /*----------------------------------------------------------------------------*/ /** @brief Identify if a file is a FITS file. @param filename name of the file to check @return int 0, 1, or -1 Returns 1 if the file name looks like a valid FITS file. Returns 0 else. If the file does not exist, returns -1. */ /*----------------------------------------------------------------------------*/ int qfits_is_fits(const char * filename) { FILE * fp; char * magic; int isfits; if (filename==NULL) return -1; if ((fp = fopen(filename, "r"))==NULL) { qfits_error("cannot open file [%s]: %s", filename, strerror(errno)); return -1; } magic = qfits_calloc(FITS_MAGIC_SZ+1, sizeof(char)); if (fread(magic, 1, FITS_MAGIC_SZ, fp) != FITS_MAGIC_SZ) { qfits_error("failed to read file [%s]: %s", filename, strerror(errno)); return -1; } fclose(fp); magic[FITS_MAGIC_SZ] = '\0'; if (strstr(magic, FITS_MAGIC)!=NULL) isfits = 1; else isfits = 0; qfits_free(magic); return isfits; } /**@}*/ int is_blank_line(const char * s) { int i; for (i=0; i<(int)strlen(s); i++) { if (s[i]!=' ') return 0; } return 1; } astrometry.net-0.67/qfits-an/qfits_table.c000644 000765 000024 00000260420 12651445460 020755 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_table.c,v 1.20 2007/01/10 12:24:45 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2007/01/10 12:24:45 $ * $Revision: 1.20 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include "qfits_config.h" #include "qfits_table.h" #include "qfits_float.h" #include "qfits_std.h" #include "qfits_byteswap.h" #include "qfits_tools.h" #include "qfits_time.h" #include "qfits_rw.h" #include "qfits_md5.h" #include "qfits_error.h" #include "qfits_memory.h" /*----------------------------------------------------------------------------- Define -----------------------------------------------------------------------------*/ #define ELEMENT_MAX_DISPLAY_SIZE 50 /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ static char * qfits_bintable_field_to_string(const qfits_table *, int, int,int); static char * qfits_asciitable_field_to_string(const qfits_table *, int, int, int); static char * qfits_build_format(const qfits_col *); static int qfits_table_append_bin_xtension(FILE *, const qfits_table *, const void **); static int qfits_table_append_ascii_xtension(FILE *, const qfits_table *, const void **); static int qfits_table_append_data(FILE *, const qfits_table *, const void **); static int qfits_table_get_field_size(int, const qfits_col *); static char * qfits_strstrip(const char *); static double qfits_str2dec(const char *, int); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_table FITS table handling * */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ const qfits_col* qfits_table_get_col(const qfits_table* t, int i) { return t->col + i; } qfits_table* qfits_table_copy(const qfits_table* t) { qfits_table* dest = calloc(1, sizeof(qfits_table)); assert(dest); memcpy(dest, t, sizeof(qfits_table)); dest->col = calloc(dest->nc, sizeof(qfits_col)); memcpy(dest->col, t->col, dest->nc * sizeof(qfits_col)); return dest; } int qfits_is_table_header(const qfits_header* hdr) { char* value; int ttype; char buf[FITS_LINESZ + 1]; ttype = QFITS_INVALIDTABLE; value = qfits_header_getstr(hdr, "XTENSION"); if (!value) return ttype; qfits_pretty_string_r(value, buf); value = buf; if (!strcmp(value, "TABLE")) { ttype = QFITS_ASCIITABLE; } else if (!strcmp(value, "BINTABLE")) { ttype = QFITS_BINTABLE; } return ttype; } /*----------------------------------------------------------------------------*/ /** @brief Generate a default primary header to store tables @return the header object */ /*----------------------------------------------------------------------------*/ qfits_header * qfits_table_prim_header_default(void) { qfits_header * fh; fh = qfits_header_new(); qfits_header_append(fh, "SIMPLE", "T", "Standard FITS file", NULL); qfits_header_append(fh, "BITPIX", "8", "ASCII or bytes array", NULL); qfits_header_append(fh, "NAXIS", "0", "Minimal header", NULL); qfits_header_append(fh, "EXTEND", "T", "There may be FITS ext", NULL); qfits_header_append(fh, "END", NULL, NULL, NULL); return fh; } /*----------------------------------------------------------------------------*/ /** @brief Generate a default extension header to store tables @return the header object */ /*----------------------------------------------------------------------------*/ qfits_header * qfits_table_ext_header_default(const qfits_table * t) { qfits_header * fh; qfits_col * curr_col; char str_val[FITS_LINESZ]; char str_val2[FITS_LINESZ]; char * date; int tab_width; int col_pos; int i; /* Compute the table width */ if ((tab_width = qfits_compute_table_width(t)) == -1) { qfits_error("cannot get the table width"); return NULL; } /* Create fits header */ if ((fh=qfits_header_new()) == NULL) { qfits_error("cannot create new fits header"); return NULL; } /* Check the kind of table */ if (t->tab_t == QFITS_BINTABLE) { /* Write extension header */ qfits_header_append(fh, "XTENSION", "BINTABLE", "FITS Binary Table Extension", NULL); qfits_header_append(fh, "BITPIX", "8", "8-bits character format", NULL); qfits_header_append(fh, "NAXIS", "2","Tables are 2-D char. array",NULL); sprintf(str_val, "%d", tab_width); qfits_header_append(fh, "NAXIS1", str_val, "Bytes in row", NULL); sprintf(str_val, "%d", (int)(t->nr)); qfits_header_append(fh, "NAXIS2", str_val, "No. of rows in table",NULL); qfits_header_append(fh, "PCOUNT", "0", "Parameter count always 0",NULL); qfits_header_append(fh, "GCOUNT", "1", "Group count always 1", NULL); sprintf(str_val, "%d", (int)(t->nc)); qfits_header_append(fh, "TFIELDS", str_val, "No. of col in table",NULL); /* Columns descriptors */ curr_col = t->col; for (i=0; inc; i++) { sprintf(str_val, "TFORM%d", i+1); sprintf(str_val2, "'%s'", qfits_build_format(curr_col)); qfits_header_append(fh, str_val, str_val2, "Format of field", NULL); sprintf(str_val, "TTYPE%d", i+1); sprintf(str_val2, "%s", curr_col->tlabel); qfits_header_append(fh, str_val, str_val2, "Field label", NULL); sprintf(str_val, "TUNIT%d", i+1); sprintf(str_val2, "%s", curr_col->tunit); //printf("Setting '%s' = '%s'\n", str_val, str_val2); qfits_header_append(fh, str_val, str_val2, "Physical unit of field", NULL); if (curr_col->zero_present) { sprintf(str_val, "TZERO%d", i+1); sprintf(str_val2, "%f", curr_col->zero); qfits_header_append(fh, str_val, str_val2, "NULL value is defined", NULL); } if (curr_col->scale_present) { sprintf(str_val, "TSCAL%d", i+1); sprintf(str_val2, "%f", curr_col->scale); qfits_header_append(fh, str_val, str_val2, "Scaling applied", NULL); } curr_col++; } qfits_header_append(fh,"ORIGIN","ESO-QFITS", "Written by QFITS", NULL); date = qfits_get_datetime_iso8601(); sprintf(str_val, "'%s'", date); qfits_header_append(fh, "DATE", str_val, "[UTC] Date of writing", NULL); qfits_header_append(fh, "END", NULL, NULL, NULL); } else if (t->tab_t == QFITS_ASCIITABLE) { /* Write extension header */ qfits_header_append(fh, "XTENSION", "TABLE", "FITS ASCII Table Extension", NULL); qfits_header_append(fh, "BITPIX", "8", "8-bits character format", NULL); qfits_header_append(fh, "NAXIS", "2", "ASCII table has 2 axes", NULL); /* Fill the header */ sprintf(str_val, "%d", tab_width); qfits_header_append(fh, "NAXIS1", str_val, "Characters in a row", NULL); sprintf(str_val, "%d", (int)(t->nr)); qfits_header_append(fh, "NAXIS2", str_val, "No. of rows in table",NULL); qfits_header_append(fh, "PCOUNT", "0", "No group parameters", NULL); qfits_header_append(fh, "GCOUNT", "1", "Only one group", NULL); sprintf(str_val, "%d", (int)(t->nc)); qfits_header_append(fh, "TFIELDS", str_val, "No. of col in table",NULL); qfits_header_append(fh, "ORIGIN","ESO-QFITS","Written by QFITS",NULL); date = qfits_get_datetime_iso8601(); sprintf(str_val, "'%s'", date); qfits_header_append(fh, "DATE", str_val, "[UTC] Date of writing", NULL); /* Columns descriptors */ curr_col = t->col; col_pos = 1; for (i=0; inc; i++) { sprintf(str_val, "TTYPE%d", i+1); sprintf(str_val2, "%s", curr_col->tlabel); qfits_header_append(fh, str_val, str_val2, "Field label", NULL); sprintf(str_val, "TFORM%d", i+1); sprintf(str_val2, "'%s'", qfits_build_format(curr_col)); qfits_header_append(fh, str_val, str_val2, "Format of field", NULL); sprintf(str_val, "TBCOL%d", i+1); sprintf(str_val2, "%d", col_pos); qfits_header_append(fh, str_val, str_val2,"Start column of field", NULL); col_pos += curr_col->atom_nb; sprintf(str_val, "TUNIT%d", i+1); sprintf(str_val2, "%s", curr_col->tunit); qfits_header_append(fh, str_val, str_val2, "Physical unit of field", NULL); if (curr_col->zero_present) { sprintf(str_val, "TZERO%d", i+1); sprintf(str_val2, "%f", curr_col->zero); qfits_header_append(fh, str_val, str_val2, "NULL value is defined", NULL); } if (curr_col->scale_present) { sprintf(str_val, "TSCAL%d", i+1); sprintf(str_val2, "%f", curr_col->scale); qfits_header_append(fh, str_val, str_val2, "Scaling applied", NULL); } curr_col++; } qfits_header_append(fh, "END", NULL, NULL, NULL); } else { qfits_error("Table type not known"); qfits_header_destroy(fh); return NULL; } return fh; } /*----------------------------------------------------------------------------*/ /** @brief Table object constructor @param filename Name of the FITS file associated to the table @param table_type Type of the table (QFITS_ASCIITABLE or QFITS_BINTABLE) @param table_width Width in bytes of the table @param nb_cols Number of columns @param nb_raws Number of raws @return The table object The columns are also allocated. The object has to be deallocated with qfits_table_close() */ /*----------------------------------------------------------------------------*/ qfits_table * qfits_table_new( const char * filename, int table_type, int table_width, int nb_cols, int nb_raws) { qfits_table * qt; qt = qfits_malloc(sizeof(qfits_table)); strcpy(qt->filename, filename); qt->tab_t = table_type; qt->nc = nb_cols; qt->nr = nb_raws; if (qt->nc) qt->col = qfits_calloc(qt->nc, sizeof(qfits_col)); else qt->col = NULL; qt->tab_w = table_width; return qt; } /*----------------------------------------------------------------------------*/ /** @brief Fill a column object with some provided informations @param qc Pointer to the column that has to be filled @param unit Unit of the data @param label Label of the column @param disp Way to display the data @param nullval Null value @param atom_nb Number of atoms per field. According to the type, an atom is a double, an int, a char, ... @param atom_dec_nb Number of decimals as specified in TFORM @param atom_size Size in bytes of the field for ASCII tables, and of an atom for BIN tables. ASCII tables only contain 1 atom per field (except for A type where you can of course have more than one char per field) @param atom_type Type of data (11 types for BIN, 5 for ASCII) @param zero_present Flag to use or not zero @param zero Zero value @param scale_present Flag to use or not scale @param scale Scale value @param offset_beg Gives the position of the column @return -1 in error case, 0 otherwise */ /*----------------------------------------------------------------------------*/ int qfits_col_fill( qfits_col * qc, int atom_nb, int atom_dec_nb, int atom_size, tfits_type atom_type, const char * label, const char * unit, const char * nullval, const char * disp, int zero_present, float zero, int scale_present, float scale, int offset_beg) { /* Number of atoms per column */ qc->atom_nb = atom_nb; /* Number of decimals in a field in ASCII table (0 in BINTABLE) */ qc->atom_dec_nb = atom_dec_nb; /* Size in bytes of an atom */ qc->atom_size = atom_size; /* Data type in the column */ qc->atom_type = atom_type; /* Label of the column */ strcpy(qc->tlabel, label); /* Unit of the column data */ strcpy(qc->tunit, unit); /* Null value*/ strcpy(qc->nullval, nullval); /* How to display the data */ strcpy(qc->tdisp, disp); /* Default values for zero and scales */ qc->zero_present = zero_present; qc->scale_present = scale_present; qc->zero = zero; qc->scale = scale; /* Number of bytes between two consecutive fields of the same column */ qc->off_beg = offset_beg; /* A column is a priori readable */ qc->readable = 1; return 0; } /* Creates a qfits_table* from the given qfits_header. Also requires the offset to the beginning of the data unit, and its size. (eg, via qfits_get_datinfo) The "filename" and "xtnum" args are purely for printing error messages. (the filename is copied to the qfits_table object, though) */ qfits_table * qfits_table_open2(const qfits_header* hdr, off_t offset_beg, size_t data_size, const char* filename, int xtnum) { qfits_table * tload; qfits_col * curr_col; char str_val[FITS_LINESZ+1]; char keyword[FITSVALSZ]; /* Table infos */ int table_type; int nb_col; int table_width; int nb_rows; /* Column infos */ char label[FITSVALSZ]; char unit[FITSVALSZ]; char disp[FITSVALSZ]; char nullval[FITSVALSZ]; int atom_nb; int atom_dec_nb; int atom_size; tfits_type atom_type; size_t theory_size; int zero_present; int scale_present; float zero; float scale; /* For ASCII tables */ int col_pos; int next_col_pos; /* For X type */ int nb_bits; int i; /* Identify a table and get the table type : ASCII or BIN */ if ((table_type = qfits_is_table_header(hdr)) == QFITS_INVALIDTABLE) { qfits_error("[%s] extension %d is not a table", filename, xtnum); return NULL; } /* Get number of columns and allocate them: nc <-> TFIELDS */ nb_col = qfits_header_getint(hdr, "TFIELDS", -1); if (nb_col == -1) { qfits_error("cannot read TFIELDS in [%s]:[%d]", filename, xtnum); return NULL; } /* Get the width in bytes of the table */ table_width = qfits_header_getint(hdr, "NAXIS1", -1); if (table_width == -1) { qfits_error("cannot read NAXIS1 in [%s]:[%d]", filename, xtnum); return NULL; } /* Get the number of rows */ nb_rows = qfits_header_getint(hdr, "NAXIS2", -1); if (nb_rows == -1) { qfits_error("cannot read NAXIS2 in [%s]:[%d]", filename, xtnum); return NULL; } /* Create the table object */ tload = qfits_table_new(filename, table_type, table_width, nb_col, nb_rows); /* Loop on all columns and get column descriptions */ curr_col = tload->col; for (i=0; inc; i++) { const char* nil = ""; /* label <-> TTYPE */ sprintf(keyword, "TTYPE%d", i+1); qfits_header_getstr_pretty(hdr, keyword, label, nil); /* unit <-> TUNIT */ sprintf(keyword, "TUNIT%d", i+1); qfits_header_getstr_pretty(hdr, keyword, unit, nil); /* disp <-> TDISP */ sprintf(keyword, "TDISP%d", i+1); qfits_header_getstr_pretty(hdr, keyword, disp, nil); /* nullval <-> TNULL */ sprintf(keyword, "TNULL%d", i+1); qfits_header_getstr_pretty(hdr, keyword, nullval, nil); /* atom_size, atom_nb, atom_dec_nb, atom_type <-> TFORM */ sprintf(keyword, "TFORM%d", i+1); if (qfits_header_getstr_pretty(hdr, keyword, str_val, NULL)) { qfits_error("cannot read [%s] in [%s]:[%d]", keyword, filename, xtnum); qfits_table_close(tload); return NULL; } /* Interpret the type in header */ if (qfits_table_interpret_type(str_val, &atom_nb, &atom_dec_nb, &atom_type, table_type) == -1) { qfits_error("cannot interpret column type: %s", str_val); qfits_table_close(tload); return NULL; } /* Set atom_size */ switch (atom_type) { case TFITS_BIN_TYPE_A: case TFITS_BIN_TYPE_L: case TFITS_BIN_TYPE_B: atom_size = 1; break; case TFITS_BIN_TYPE_I: atom_size = 2; break; case TFITS_BIN_TYPE_J: case TFITS_BIN_TYPE_E: case TFITS_ASCII_TYPE_I: case TFITS_ASCII_TYPE_E: case TFITS_ASCII_TYPE_F: atom_size = 4; break; case TFITS_BIN_TYPE_C: case TFITS_BIN_TYPE_P: atom_size = 4; atom_nb *= 2; break; case TFITS_BIN_TYPE_K: case TFITS_BIN_TYPE_D: case TFITS_ASCII_TYPE_D: atom_size = 8; break; case TFITS_BIN_TYPE_M: atom_size = 8; atom_nb *= 2; break; case TFITS_BIN_TYPE_X: atom_size = 1; nb_bits = atom_nb; atom_nb = (int)((nb_bits - 1)/ 8) + 1; break; case TFITS_ASCII_TYPE_A: atom_size = atom_nb; break; default: qfits_error("unrecognized type"); qfits_table_close(tload); return NULL; break; } /* zero <-> TZERO */ sprintf(keyword, "TZERO%d", i+1); zero_present = 1; zero = qfits_header_getdouble(hdr, keyword, HUGE_VAL); if (zero == HUGE_VAL) { zero = 0.0; zero_present = 0; } /* scale <-> TSCAL */ sprintf(keyword, "TSCAL%d", i+1); scale_present = 1; scale = qfits_header_getdouble(hdr, keyword, HUGE_VAL); if (scale == HUGE_VAL) { scale = 1.0; scale_present = 0; } /* Fill the current column object */ qfits_col_fill(curr_col, atom_nb, atom_dec_nb, atom_size, atom_type, label, unit, nullval, disp, zero_present, zero, scale_present, scale, offset_beg); /* Compute offset_beg but for the last column */ if (i < tload->nc - 1) { if (table_type == QFITS_ASCIITABLE) { /* column width <-> TBCOLi and TBCOLi+1 */ sprintf(keyword, "TBCOL%d", i+1); col_pos = qfits_header_getint(hdr, keyword, -1); if (col_pos == -1) { qfits_error("cannot read [%s] in [%s]", keyword, filename); qfits_table_close(tload); return NULL; } sprintf(keyword, "TBCOL%d", i+2); next_col_pos = qfits_header_getint(hdr, keyword, -1); if (next_col_pos == -1) { qfits_error("cannot read [%s] in [%s]", keyword, filename); qfits_table_close(tload); return NULL; } offset_beg += (int)(next_col_pos - col_pos); } else if (table_type == QFITS_BINTABLE) { offset_beg += atom_nb * atom_size; } } curr_col++; } /* Check that the theoretical data size is not far from the measured */ /* one by more than 2880 */ theory_size = (size_t)qfits_compute_table_width(tload) * (size_t)tload->nr; if (data_size < theory_size) { qfits_error("Inconsistent data sizes: found %i, expected %i.", data_size, theory_size); qfits_table_close(tload); return NULL; } /* Return */ return tload; } /*----------------------------------------------------------------------------*/ /** @brief Free a FITS table and associated pointers @param t qfits_table to free @return void Frees all memory associated to a qfits_table structure. */ /*----------------------------------------------------------------------------*/ void qfits_table_close(qfits_table * t) { if (t==NULL) return; if (t->nc>0) if (t->col!=NULL) qfits_free(t->col); qfits_free(t); return; } /*----------------------------------------------------------------------------*/ /** @brief Extract data from a column in a FITS table @param th Allocated qfits_table @param colnum Number of the column to extract (from 0 to colnum-1) @param selection boolean array to define the selected rows @return unsigned char array If selection is NULL, select the complete column. Extract a column from a FITS table and return the data as a bytes array. The returned array type and size are determined by the column object in the qfits_table and by the selection parameter. Returned array size in bytes is: nbselected * col->natoms * col->atom_size Numeric types are correctly understood and byte-swapped if needed, to be converted to the local machine type. NULL values have to be handled by the caller. The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ unsigned char * qfits_query_column( const qfits_table * th, int colnum, const int * selection) { char * start; qfits_col * col; int field_size; unsigned char * array; unsigned char * r; unsigned char * inbuf; int table_width; int nb_rows; size_t size; int i; if (th->tab_w == -1) { /* Compute the table width in bytes */ if ((table_width = qfits_compute_table_width(th)) == -1) { qfits_error("cannot compute the table width"); return NULL; } } else table_width = th->tab_w; /* Compute the number of selected rows */ nb_rows = 0; if (selection == NULL) { nb_rows = th->nr; } else { for (i=0; inr; i++) if (selection[i] == 1) nb_rows++; } /* Pointer to requested column */ col = th->col + colnum; /* Test if column is empty */ if (nb_rows * col->atom_size * col->atom_nb == 0) col->readable = 0; /* Test if column is readable */ if (col->readable == 0) return NULL; /* Compute the size in bytes of one field stored in the file */ if ((field_size=qfits_table_get_field_size(th->tab_t,col))==-1) return NULL; /* Load input file */ if ((start=qfits_falloc((char *)(th->filename), 0, &size))==NULL) { qfits_error("cannot open table for query [%s]", th->filename); return NULL; } /* Allocate data array */ array = qfits_malloc(nb_rows * field_size * sizeof(char)); /* Position the input pointer at the begining of the column data */ r = array; inbuf = (unsigned char*)start + col->off_beg; /* Copy the values in array */ if (selection == NULL) { /* No selection : get the complete column */ for (i=0; inr; i++) { /* Copy all atoms on this field into array */ memcpy(r, inbuf, field_size); r += field_size; /* Jump to next line */ inbuf += table_width; } } else { /* Get only the selected rows */ for (i=0; inr; i++) { if (selection[i] == 1) { /* Copy all atoms on this field into array */ memcpy(r, inbuf, field_size); r += field_size; } /* Jump to next line */ inbuf += table_width; } } qfits_fdealloc(start, 0, size); /* SWAP the bytes if necessary */ #ifndef WORDS_BIGENDIAN if ((th->tab_t == QFITS_BINTABLE) && (col->atom_size > 1)) { r = array; for (i=0; iatom_nb; i++) { qfits_swap_bytes(r, col->atom_size); r += col->atom_size; } } #endif /* Return allocated and converted array */ return array; } /*----------------------------------------------------------------------------*/ /** @brief Extract consequtive values from a column in a FITS table @param th Allocated qfits_table @param colnum Number of the column to extract (from 0 to colnum-1) @param start_ind Index of the first row (0 for the first) @param nb_rows Number of rows to extract @return unsigned char array Does the same as qfits_query_column() but on a consequtive sequence of rows Spares the overhead of the selection object allocation The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ unsigned char * qfits_query_column_seq( const qfits_table * th, int colnum, int start_ind, int nb_rows) { char * start; qfits_col * col; int field_size; unsigned char * array; unsigned char * r; unsigned char * inbuf; int table_width; size_t size; int i; if (th->tab_w == -1) { /* Compute the table width in bytes */ if ((table_width = qfits_compute_table_width(th)) == -1) { qfits_error("cannot compute the table width"); return NULL; } } else table_width = th->tab_w; /* Check the validity of start_ind and nb_rows */ if ((start_ind<0) || (start_ind+nb_rows>th->nr)) { qfits_error("bad start index and number of rows"); return NULL; } /* Pointer to requested column */ col = th->col + colnum; /* Test if column is empty */ if (nb_rows * col->atom_size * col->atom_nb == 0) col->readable = 0; /* Test if column is readable */ if (col->readable == 0) return NULL; /* Compute the size in bytes of one field stored in the file */ if ((field_size=qfits_table_get_field_size(th->tab_t,col))==-1) return NULL; /* Load input file */ if ((start=qfits_falloc((char *)(th->filename), 0, &size))==NULL) { qfits_error("cannot open table for query [%s]", th->filename); return NULL; } /* Allocate data array */ array = qfits_malloc(nb_rows * field_size * sizeof(char)); /* Position the input pointer at the begining of the column data */ r = array; inbuf = (unsigned char*)start + col->off_beg + table_width * start_ind; /* Copy the values in array */ /* Get only the selected rows */ for (i=0; itab_t == QFITS_BINTABLE) && (col->atom_size > 1)) { r = array; for (i=0; iatom_nb; i++) { qfits_swap_bytes(r, col->atom_size); r += col->atom_size; } } #endif /* Return allocated and converted array */ return array; } static int qfits_query_column_seq_to_array_endian( const qfits_table * th, int colnum, int start_ind, const int* indices, int nb_rows, unsigned char* destination, int dest_stride, int swap_endian) { qfits_col * col; int field_size; unsigned char * r; unsigned char * inbuf; int table_width; int i; int do_swap; int maxind; char* freeaddr; size_t freesize; size_t mapoffset; size_t maplen; if (th->tab_w == -1) { /* Compute the table width in bytes */ if ((table_width = qfits_compute_table_width(th)) == -1) { qfits_error("cannot compute the table width"); return -1; } } else table_width = th->tab_w; /* Check the validity of start_ind and nb_rows */ if ((start_ind<0) || (start_ind+nb_rows>th->nr)) { qfits_error("bad start index and number of rows"); return -1; } /* Pointer to requested column */ col = th->col + colnum; /* Test if column is empty */ if (nb_rows * col->atom_size * col->atom_nb == 0) col->readable = 0; /* Test if column is readable */ if (col->readable == 0) return -1; /* Compute the size in bytes of one field stored in the file */ if ((field_size=qfits_table_get_field_size(th->tab_t,col))==-1) return -1; /* Load input file */ if (indices) { maxind = 0; for (i=0; i 2GB files! mapoffset = col->off_beg + (size_t)table_width * (size_t)start_ind; // NOTE that this *isn't* (table_width * N) -- that can lead to trying to map // beyond the end of the file! maplen = (size_t)maxind * (size_t)table_width + (size_t)field_size; //printf("opening %s: %zu + %zu (column offset = %i, width=%i, start_index=%i)\n", th->filename, mapoffset, maplen, col->off_beg, table_width, start_ind); if ((inbuf = qfits_falloc2(th->filename, mapoffset, maplen, &freeaddr, &freesize)) == NULL) { qfits_error("cannot open table for reading column data [%s]", th->filename); return -1; } /* if ((start=qfits_falloc(th->filename, 0, &size))==NULL) { qfits_error("cannot open table for query [%s]", th->filename); return -1; } inbuf = (unsigned char*)start + col->off_beg + table_width * start_ind; */ /* Position the input pointer at the begining of the column data */ r = destination; do_swap = 0; #ifndef WORDS_BIGENDIAN if (swap_endian) if ((th->tab_t == QFITS_BINTABLE) && (col->atom_size > 1)) do_swap = 1; #endif /* Copy the values in array */ /* Get only the selected rows */ for (i=0; iatom_nb; j++) { qfits_swap_bytes(r2, col->atom_size); r2 += col->atom_size; } } #endif r += dest_stride; } //qfits_fdealloc(start, 0, size); qfits_fdealloc2(freeaddr, freesize); return 0; } int qfits_query_column_seq_to_array( const qfits_table * th, int colnum, int start_ind, int nb_rows, unsigned char* destination, int dest_stride) { return qfits_query_column_seq_to_array_endian(th, colnum, start_ind, NULL, nb_rows, destination, dest_stride, 1); } int qfits_query_column_seq_to_array_inds(const qfits_table * th, int colnum, const int* indices, int Ninds, unsigned char* destination, int dest_stride) { return qfits_query_column_seq_to_array_endian(th, colnum, 0, indices, Ninds, destination, dest_stride, 1); } int qfits_query_column_seq_to_array_no_endian_swap( const qfits_table * th, int colnum, int start_ind, int nb_rows, unsigned char* destination, int dest_stride) { return qfits_query_column_seq_to_array_endian(th, colnum, start_ind, NULL, nb_rows, destination, dest_stride, 0); } /*----------------------------------------------------------------------------*/ /** @brief Extract binary data from a column in a FITS table @param th Allocated qfits_table @param colnum Number of the column to extract (from 0 to colnum-1) @param selection bollean array to identify selected rows @param null_value Value to return when a NULL value comes @return Pointer to void * Extract a column from a FITS table and return the data as a generic void* array. The returned array type and size are determined by the column object in the qfits_table. Returned array size in bytes is: nb_selected * col->atom_nb * col->atom_size NULL values are recognized and replaced by the specified value. The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ void * qfits_query_column_data( const qfits_table * th, int colnum, const int * selection, const void * null_value) { void * out_array; qfits_col * col; int nb_rows; unsigned char * in_array; char * field; unsigned char ucnull; short snull; int inull; double dnull; float fnull; int i; /* Initialize */ if (null_value == NULL) { inull = (int)0; snull = (short)0; ucnull = (unsigned char)0; fnull = (float)0.0; dnull = (double)0.0; } else { inull = *(int*)null_value; snull = *(short*)null_value; ucnull = *(unsigned char*)null_value; fnull = *(float*)null_value; dnull = *(double*)null_value; } /* Get the number of selected rows */ nb_rows = 0; if (selection == NULL) { nb_rows = th->nr; } else { for (i=0; inr; i++) if (selection[i] == 1) nb_rows++; } /* Pointer to requested column */ col = th->col+colnum; /* Test if column is readable */ if (col->readable == 0) return NULL; /* Handle each type separately */ switch(col->atom_type) { case TFITS_ASCII_TYPE_A: out_array = (char*)qfits_query_column(th, colnum, selection); break; case TFITS_ASCII_TYPE_I: in_array = (unsigned char*)qfits_query_column(th, colnum, selection); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { ((int*)out_array)[i] = inull; } else { ((int*)out_array)[i] = (int)atoi(field); } } qfits_free(field); qfits_free(in_array); break; case TFITS_ASCII_TYPE_E: case TFITS_ASCII_TYPE_F: in_array = (unsigned char*)qfits_query_column(th, colnum, selection); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { ((float*)out_array)[i] = fnull; } else { /* Add the decimal handling */ ((float*)out_array)[i]=(float)qfits_str2dec(field, col->atom_dec_nb); } } qfits_free(field); qfits_free(in_array); break; case TFITS_ASCII_TYPE_D: in_array = (unsigned char*)qfits_query_column(th, colnum, selection); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, field)) { ((double*)out_array)[i] = dnull; } else { /* Add the decimal handling */ ((double*)out_array)[i]=qfits_str2dec(field, col->atom_dec_nb); } } qfits_free(field); qfits_free(in_array); break; case TFITS_BIN_TYPE_A: case TFITS_BIN_TYPE_L: out_array = (char*)qfits_query_column(th, colnum, selection); break; case TFITS_BIN_TYPE_D: case TFITS_BIN_TYPE_M: out_array = (double*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (qfits_isnan(((double*)out_array)[i]) || qfits_isinf(((double*)out_array)[i])) { ((double*)out_array)[i] = dnull; } } break; case TFITS_BIN_TYPE_E: case TFITS_BIN_TYPE_C: out_array = (float*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (qfits_isnan(((float*)out_array)[i]) || qfits_isinf(((float*)out_array)[i])) { ((float*)out_array)[i] = fnull; } } break; case TFITS_BIN_TYPE_X: out_array = (unsigned char*)qfits_query_column(th, colnum, selection); break; case TFITS_BIN_TYPE_B: out_array = (unsigned char*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval) == (int)((unsigned char*)out_array)[i])) { ((unsigned char*)out_array)[i] = ucnull; } } break; case TFITS_BIN_TYPE_I: out_array = (short*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==(int)((short*)out_array)[i])) { ((short*)out_array)[i] = snull; } } break; case TFITS_BIN_TYPE_J: out_array = (int*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==((int*)out_array)[i])) { ((int*)out_array)[i] = inull; } } break; case TFITS_BIN_TYPE_K: out_array = (int64_t*)qfits_query_column(th, colnum, selection); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoll(col->nullval)==((int64_t*)out_array)[i])) { ((int64_t*)out_array)[i] = inull; } } break; case TFITS_BIN_TYPE_P: out_array = (int*)qfits_query_column(th, colnum, selection); break; default: qfits_error("unrecognized data type"); return NULL; } return out_array; } /*----------------------------------------------------------------------------*/ /** @brief Extract binary data from a column in a FITS table @param th Allocated qfits_table @param colnum Number of the column to extract (from 0 to colnum-1) @param start_ind Index of the first row (0 for the first) @param nb_rows Number of rows to extract @param null_value Value to return when a NULL value comes @return Pointer to void * Does the same as qfits_query_column_data() but on a consequtive sequence of rows. Spares the overhead of the selection object allocation The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ void * qfits_query_column_seq_data( const qfits_table * th, int colnum, int start_ind, int nb_rows, const void * null_value) { void * out_array; qfits_col * col; unsigned char * in_array; char * field; unsigned char ucnull; short snull; int inull; double dnull; float fnull; int i; /* Initialize */ if (null_value == NULL) { inull = (int)0; snull = (short)0; ucnull = (unsigned char)0; fnull = (float)0.0; dnull = (double)0.0; } else { inull = *(int*)null_value; snull = *(short*)null_value; ucnull = *(unsigned char*)null_value; fnull = *(float*)null_value; dnull = *(double*)null_value; } /* Pointer to requested column */ col = th->col+colnum; /* Test if column is readable */ if (col->readable == 0) return NULL; /* Handle each type separately */ switch(col->atom_type) { case TFITS_ASCII_TYPE_A: out_array = (char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); break; case TFITS_ASCII_TYPE_I: in_array = (unsigned char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { ((int*)out_array)[i] = inull; } else { ((int*)out_array)[i] = (int)atoi(field); } } qfits_free(field); qfits_free(in_array); break; case TFITS_ASCII_TYPE_E: case TFITS_ASCII_TYPE_F: in_array = (unsigned char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { ((float*)out_array)[i] = fnull; } else { /* Add the decimal handling */ ((float*)out_array)[i]=(float)qfits_str2dec(field, col->atom_dec_nb); } } qfits_free(field); qfits_free(in_array); break; case TFITS_ASCII_TYPE_D: in_array = (unsigned char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); out_array = qfits_malloc(nb_rows*col->atom_size); field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Write the data in out_array */ /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { ((double*)out_array)[i] = dnull; } else { /* Add the decimal handling */ ((double*)out_array)[i]=qfits_str2dec(field, col->atom_dec_nb); } } qfits_free(field); qfits_free(in_array); break; case TFITS_BIN_TYPE_A: case TFITS_BIN_TYPE_L: out_array = (char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); break; case TFITS_BIN_TYPE_D: case TFITS_BIN_TYPE_M: out_array = (double*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (qfits_isnan(((double*)out_array)[i]) || qfits_isinf(((double*)out_array)[i])) { ((double*)out_array)[i] = dnull; } } break; case TFITS_BIN_TYPE_E: case TFITS_BIN_TYPE_C: out_array = (float*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (qfits_isnan(((float*)out_array)[i]) || qfits_isinf(((float*)out_array)[i])) { ((float*)out_array)[i] = fnull; } } break; case TFITS_BIN_TYPE_X: out_array = (unsigned char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); break; case TFITS_BIN_TYPE_B: out_array = (unsigned char*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)== (int)((unsigned char*)out_array)[i])) { ((unsigned char*)out_array)[i] = ucnull; } } break; case TFITS_BIN_TYPE_I: out_array = (short*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==(int)((short*)out_array)[i])) { ((short*)out_array)[i] = snull; } } break; case TFITS_BIN_TYPE_J: out_array = (int*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==((int*)out_array)[i])) { ((int*)out_array)[i] = inull; } } break; case TFITS_BIN_TYPE_K: out_array = (int64_t*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoll(col->nullval)==((int64_t*)out_array)[i])) { ((int64_t*)out_array)[i] = inull; } } break; case TFITS_BIN_TYPE_P: out_array = (int*)qfits_query_column_seq(th, colnum, start_ind, nb_rows); break; default: qfits_error("unrecognized data type"); return NULL; } return out_array; } /*----------------------------------------------------------------------------*/ /** @brief Detect NULL values in a column @param th Allocated qfits_table @param colnum Number of the column to check (from 0 to colnum-1) @param selection Array to identify selected rows @param nb_vals Gives the size of the output array @param nb_nulls Gives the number of detected null values @return array with 1 for NULLs and 0 for non-NULLs The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ int * qfits_query_column_nulls( const qfits_table * th, int colnum, const int * selection, int * nb_vals, int * nb_nulls) { int * out_array; qfits_col * col; unsigned char * in_array; void * tmp_array; char * field; int nb_rows; int i; /* Initialize */ *nb_nulls = 0; *nb_vals = 0; /* Get the number of selected rows */ nb_rows = 0; if (selection == NULL) { nb_rows = th->nr; } else { for (i=0; inr; i++) if (selection[i] == 1) nb_rows++; } /* Pointer to requested column */ col = th->col+colnum; /* Test if column is readable */ if (col->readable == 0) return NULL; /* Handle each type separately */ switch(col->atom_type) { case TFITS_ASCII_TYPE_A: case TFITS_ASCII_TYPE_D: case TFITS_ASCII_TYPE_E: case TFITS_ASCII_TYPE_F: case TFITS_ASCII_TYPE_I: in_array = (unsigned char*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows, sizeof(int)); *nb_vals = nb_rows; field = qfits_malloc((col->atom_nb+1)*sizeof(char)); for (i=0; iatom_nb], col->atom_nb); field[col->atom_nb]='\0'; /* Test if a NULL val is encoutered */ if (!strcmp(col->nullval, qfits_strstrip(field))) { out_array[i] = 1; (*nb_nulls)++; } } qfits_free(field); if (in_array != NULL) qfits_free(in_array); break; case TFITS_BIN_TYPE_A: /* No NULL values */ out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; break; case TFITS_BIN_TYPE_L: case TFITS_BIN_TYPE_X: case TFITS_BIN_TYPE_P: /* No NULL values */ out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; break; case TFITS_BIN_TYPE_D: case TFITS_BIN_TYPE_M: tmp_array = (double*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (qfits_isnan(((double*)tmp_array)[i]) || qfits_isinf(((double*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) qfits_free(tmp_array); break; case TFITS_BIN_TYPE_E: case TFITS_BIN_TYPE_C: tmp_array = (float*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (qfits_isnan(((float*)tmp_array)[i]) || qfits_isinf(((float*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) qfits_free(tmp_array); break; case TFITS_BIN_TYPE_B: tmp_array = (unsigned char*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==(int)((unsigned char*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) qfits_free(tmp_array); break; case TFITS_BIN_TYPE_I: tmp_array = (short*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==(int)((short*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) qfits_free(tmp_array); break; case TFITS_BIN_TYPE_K: tmp_array = (int64_t*)qfits_query_column(th, colnum, selection); out_array = calloc(nb_rows * col->atom_nb, sizeof(int64_t)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoll(col->nullval)==((int64_t*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) free(tmp_array); break; case TFITS_BIN_TYPE_J: tmp_array = (int*)qfits_query_column(th, colnum, selection); out_array = qfits_calloc(nb_rows * col->atom_nb, sizeof(int)); *nb_vals = nb_rows * col->atom_nb; for (i=0; iatom_nb; i++) { if (((col->nullval)[0] != '\0') && (atoi(col->nullval)==((int*)tmp_array)[i])) { out_array[i] = 1; (*nb_nulls)++; } } if (tmp_array != NULL) qfits_free(tmp_array); break; default: qfits_error("unrecognized data type"); return NULL; } return out_array; } /*----------------------------------------------------------------------------*/ /** @brief Appends a std extension header + data to a FITS table file. @param outfile Pointer to (opened) file ready for writing. @param t Pointer to qfits_table @param data Table data to write @return int 0 if Ok, -1 otherwise Dumps a FITS table to a file. The whole table described by qfits_table, and the data arrays contained in 'data' are dumped to the file. An extension header is produced with all keywords needed to describe the table, then the data is dumped to the file. The output is then padded to reach a multiple of 2880 bytes in size. Notice that no main header is produced, only the extension part. */ /*----------------------------------------------------------------------------*/ int qfits_table_append_xtension( FILE * outfile, const qfits_table * t, const void ** data) { /* Append the extension */ if (t->tab_t == QFITS_BINTABLE) { if (qfits_table_append_bin_xtension(outfile, t, data) == -1) { qfits_error("in writing fits table"); return -1; } } else if (t->tab_t == QFITS_ASCIITABLE) { if (qfits_table_append_ascii_xtension(outfile, t, data) == -1) { qfits_error("in writing fits table"); return -1; } } else { qfits_error("Unrecognized table type"); return -1; } return 0; } /*----------------------------------------------------------------------------*/ /** @brief Appends a specified extension header + data to a FITS table file. @param outfile Pointer to (opened) file ready for writing. @param t Pointer to qfits_table @param data Table data to write @param hdr Specified extension header @return int 0 if Ok, -1 otherwise Dumps a FITS table to a file. The whole table described by qfits_table, and the data arrays contained in 'data' are dumped to the file following the specified fits header. The output is then padded to reach a multiple of 2880 bytes in size. Notice that no main header is produced, only the extension part. */ /*----------------------------------------------------------------------------*/ int qfits_table_append_xtension_hdr( FILE * outfile, const qfits_table * t, const void ** data, const qfits_header * hdr) { /* Write the fits header in the file */ if (qfits_header_dump(hdr, outfile) == -1) { qfits_error("cannot dump header in file"); return -1; } /* Append the data to the file */ return qfits_table_append_data(outfile, t, data); } /*----------------------------------------------------------------------------*/ /** @brief given a col and a row, find out the string to write for display @param table table structure @param col_id col id (0 -> nbcol-1) @param row_id row id (0 -> nrow-1) @param use_zero_scale Flag to use or not zero and scale @return the string This function is highly inefficient, it should not be used in loops to display a complete table. It is more to get one field from time to time, or for debugging puposes. The returned object must be deallocated with qfits_free(). */ /*----------------------------------------------------------------------------*/ char * qfits_table_field_to_string( const qfits_table * table, int col_id, int row_id, int use_zero_scale) { char * str; switch (table->tab_t) { case QFITS_BINTABLE: str = qfits_bintable_field_to_string(table, col_id, row_id, use_zero_scale); break; case QFITS_ASCIITABLE: str = qfits_asciitable_field_to_string(table, col_id, row_id, use_zero_scale); break; default: qfits_error("Table type not recognized"); return NULL; break; } return str; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief Compute the table width in bytes from the columns infos @param th Allocated qfits_table @return the width (-1 in error case) */ /*----------------------------------------------------------------------------*/ int qfits_compute_table_width(const qfits_table * th) { int width; qfits_col * curr_col; int i; /* Initialize */ width = 0; /* Loop on all columns and get column descriptions */ curr_col = th->col; for (i=0; inc; i++) { if (th->tab_t == QFITS_ASCIITABLE) { width += curr_col->atom_nb; } else if (th->tab_t == QFITS_BINTABLE) { width += curr_col->atom_nb * curr_col->atom_size; } curr_col++; } return width; } /*----------------------------------------------------------------------------*/ /** @brief given a col and a row, find out the string to write for display @param table table structure @param col_id col id (0 -> nbcol-1) @param row_id row id (0 -> nrow-1) @param use_zero_scale Flag to use or not zero and scale @return the string to write The returned object must be deallocated with qfits_free(). ASCII tables specific */ /*----------------------------------------------------------------------------*/ static char * qfits_asciitable_field_to_string( const qfits_table * table, int col_id, int row_id, int use_zero_scale) { qfits_col * col; char * ccol; int * icol; float * fcol; double * dcol; char ctmp[512]; char * stmp; int field_size; void * field; int * selection; /* Test inputs */ if (table->tab_t != QFITS_ASCIITABLE) return NULL; /* Initialize */ ctmp[0] = '\0'; /* Set selection to select the requested row */ selection = qfits_calloc(table->nr, sizeof(int)); selection[row_id] = 1; /* Load the column data */ if ((field = qfits_query_column_data(table, col_id, selection, NULL)) == NULL) return NULL; qfits_free(selection); /* Set reference to the column */ col = table->col + col_id; /* Compute field size and allocate stmp */ if (col->atom_nb > ELEMENT_MAX_DISPLAY_SIZE) field_size = col->atom_nb + 1; else field_size = ELEMENT_MAX_DISPLAY_SIZE; stmp = qfits_malloc(field_size * sizeof(char)); stmp[0] = '\0'; /* Get the string to write according to the type */ switch(col->atom_type) { case TFITS_ASCII_TYPE_A: ccol = (char*)field; strncpy(ctmp, ccol, col->atom_nb); ctmp[col->atom_nb] = '\0'; strcpy(stmp, ctmp); break; case TFITS_ASCII_TYPE_I: icol = (int*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { sprintf(stmp, "%f", (float)(col->zero + (float)icol[0] * col->scale)); } else { sprintf(stmp, "%d", icol[0]); } break; case TFITS_ASCII_TYPE_E: case TFITS_ASCII_TYPE_F: fcol = (float*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { sprintf(stmp, "%f", (float)(col->zero + fcol[0] * col->scale)); } else { sprintf(stmp, "%f", fcol[0]); } break; case TFITS_ASCII_TYPE_D: dcol = (double*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { sprintf(stmp, "%f", (float)(col->zero + (float)dcol[0] * col->scale)); } else { sprintf(stmp, "%g", dcol[0]); } break; default: qfits_warning("Type not recognized"); break; } /* Free and return */ qfits_free(field); return stmp; } /*----------------------------------------------------------------------------*/ /** @brief Given a col and a row, find out the string to write for display @param table table structure @param col_id col id (0 -> nbcol-1) @param row_id row id (0 -> nrow-1) @param use_zero_scale Flag to use or not zero and scale @return the allocated string to write The returned object must be deallocated with qfits_free(). BIN tables specific */ /*----------------------------------------------------------------------------*/ static char * qfits_bintable_field_to_string( const qfits_table * table, int col_id, int row_id, int use_zero_scale) { qfits_col * col; unsigned char * uccol; char * ccol; int * icol; int64_t * kcol; short * scol; float * fcol; double * dcol; char ctmp[512]; char * stmp; int field_size; void * field; int * selection; int i; /* Test inputs */ if (table->tab_t != QFITS_BINTABLE) return NULL; /* Initialize */ ctmp[0] = '\0'; /* Set selection to select the requested row */ selection = qfits_calloc(table->nr, sizeof(int)); selection[row_id] = 1; /* Load the data column */ if ((field = qfits_query_column_data(table, col_id, selection, NULL)) == NULL) { qfits_free(selection); return NULL; } qfits_free(selection); /* Set reference to the column */ col = table->col + col_id; /* Compute field size and allocate stmp */ field_size = col->atom_nb * ELEMENT_MAX_DISPLAY_SIZE; stmp = qfits_malloc(field_size * sizeof(char)); stmp[0] = '\0'; /* Get the string to write according to the type */ switch(col->atom_type) { case TFITS_BIN_TYPE_A: ccol = (char*)field; strncpy(ctmp, ccol, col->atom_size * col->atom_nb); ctmp[col->atom_size*col->atom_nb] = '\0'; strcpy(stmp, ctmp); break; case TFITS_BIN_TYPE_B: uccol = (unsigned char*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", (float)(col->zero + (float)uccol[i] * col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", (float)(col->zero + (float)uccol[col->atom_nb-1]*col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%d, ", (int)uccol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp,"%d",(int)uccol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_D: case TFITS_BIN_TYPE_M: dcol = (double*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%g, ", (double)((double)col->zero + dcol[i] * (double)col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%g", (double)((double)col->zero + dcol[col->atom_nb-1] * (double)col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%g, ", dcol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%g", dcol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_E: case TFITS_BIN_TYPE_C: fcol = (float*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", (float)(col->zero + (float)fcol[i] * col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", (float)(col->zero + (float)fcol[col->atom_nb-1] * col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", fcol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", fcol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_I: scol = (short*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", (float)(col->zero + (float)scol[i] * col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", (float)(col->zero + (float)scol[col->atom_nb-1] * col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%d, ", (int)scol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%d",(int)scol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_J: icol = (int*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", (float)(col->zero + (float)icol[i] * col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", (float)(col->zero + (float)icol[col->atom_nb-1] * col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%d, ", (int)icol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%d",(int)icol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_K: kcol = (int64_t*)field; /* Two cases: use col->zero and col->scale or not */ if (col->zero_present && col->scale_present && use_zero_scale) { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%f, ", (float)(col->zero + (float)kcol[i] * col->scale)); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%f", (float)(col->zero + (float)kcol[col->atom_nb-1] * col->scale)); strcat(stmp, ctmp); } else { /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%lld, ", (long long int)kcol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%lld", (long long int)kcol[col->atom_nb-1]); strcat(stmp, ctmp); } break; case TFITS_BIN_TYPE_L: ccol = (char*)field; /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%c, ", ccol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%c", ccol[col->atom_nb-1]); strcat(stmp, ctmp); break; case TFITS_BIN_TYPE_X: uccol = (unsigned char*)field; /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%d, ", uccol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%d", uccol[col->atom_nb-1]); strcat(stmp, ctmp); break; case TFITS_BIN_TYPE_P: icol = (int*)field; /* For each atom of the column */ for (i=0; iatom_nb-1; i++) { sprintf(ctmp, "%d, ", (int)icol[i]); strcat(stmp, ctmp); } /* Handle the last atom differently: no ',' */ sprintf(ctmp, "%d",(int)icol[col->atom_nb-1]); strcat(stmp, ctmp); break; default: qfits_warning("Type not recognized"); break; } qfits_free(field); return stmp; } /*----------------------------------------------------------------------------*/ /** @brief Remove blanks at the beginning and the end of a string. @param s String to parse. @return ptr to statically allocated string. This function returns a pointer to a statically allocated string, which is identical to the input string, except that all blank characters at the end and the beg. of the string have been removed. Do not free or modify the returned string! Since the returned string is statically allocated, it will be modified at each function call (not re-entrant). */ /*----------------------------------------------------------------------------*/ static char * qfits_strstrip(const char * s) { static char l[1024+1]; char * last; if (s==NULL) return NULL; while (isspace((int)*s) && *s) s++; memset(l, 0, 1024+1); strcpy(l, s); last = l + strlen(l); while (last > l) { if (!isspace((int)*(last-1))) break; last --; } *last = '\0'; return (char*)l; } /*----------------------------------------------------------------------------*/ /** @brief Make a double out of a string and a number of decimals @param to_format the string to convert @param nb_dec the number of decimals @return the double A field with 123 of type F3.1 actually contains 12.3 This is handled by this function. */ /*----------------------------------------------------------------------------*/ static double qfits_str2dec( const char * to_format, int nb_dec) { double val; int i; /* Test entries */ if (to_format == NULL) return 0.00; val = (double)atof(to_format); /* First handle case where there are no decimals or the dot is there */ if ((strstr(to_format, ".") == NULL) && (nb_dec > 0)) { for (i=0; iatom_type) { case TFITS_ASCII_TYPE_A: nb=sprintf(sval, "A%d.%d", col->atom_nb, col->atom_dec_nb); break; case TFITS_ASCII_TYPE_D: nb=sprintf(sval, "D%d.%d", col->atom_nb, col->atom_dec_nb); break; case TFITS_ASCII_TYPE_E: nb=sprintf(sval, "E%d.%d", col->atom_nb, col->atom_dec_nb); break; case TFITS_ASCII_TYPE_I: nb=sprintf(sval, "I%d.%d", col->atom_nb, col->atom_dec_nb); break; case TFITS_ASCII_TYPE_F: nb=sprintf(sval, "F%d.%d", col->atom_nb, col->atom_dec_nb); break; case TFITS_BIN_TYPE_D: nb=sprintf(sval, "%dD", col->atom_nb); break; case TFITS_BIN_TYPE_E: nb=sprintf(sval, "%dE", col->atom_nb); break; case TFITS_BIN_TYPE_I: nb=sprintf(sval, "%dI", col->atom_nb); break; case TFITS_BIN_TYPE_A: nb=sprintf(sval, "%dA", col->atom_nb); break; case TFITS_BIN_TYPE_B: nb=sprintf(sval, "%dB", col->atom_nb); break; case TFITS_BIN_TYPE_C: nb=sprintf(sval, "%dC", (int)(col->atom_nb/2)); break; case TFITS_BIN_TYPE_J: nb=sprintf(sval, "%dJ", col->atom_nb); break; case TFITS_BIN_TYPE_K: nb=sprintf(sval, "%dK", col->atom_nb); break; case TFITS_BIN_TYPE_L: nb=sprintf(sval, "%dL", col->atom_nb); break; case TFITS_BIN_TYPE_M: nb=sprintf(sval, "%dM", (int)(col->atom_nb/2)); break; case TFITS_BIN_TYPE_P: nb=sprintf(sval, "%dP", (int)(col->atom_nb/2)); break; case TFITS_BIN_TYPE_X: nb=sprintf(sval, "%dX", 8*col->atom_nb); break; default: return NULL; } sval[nb] = '\0'; return sval; } /*----------------------------------------------------------------------------*/ /** @brief Appends a std extension header + data to a FITS BIN table file. @param outfile Pointer to (opened) file ready for writing. @param t Pointer to qfits_table @param data Table data to write @return int 0 if Ok, -1 otherwise Dumps a FITS table to a file. The whole table described by qfits_table, and the data arrays contained in 'data' are dumped to the file. An extension header is produced with all keywords needed to describe the table, then the data is dumped to the file. The output is then padded to reach a multiple of 2880 bytes in size. Notice that no main header is produced, only the extension part. */ /*----------------------------------------------------------------------------*/ static int qfits_table_append_bin_xtension( FILE * outfile, const qfits_table * t, const void ** data) { qfits_header * fh; if ((fh=qfits_table_ext_header_default(t)) == NULL) { qfits_error("cannot create new fits header"); return -1; } /* Write the fits header in the file */ if (qfits_header_dump(fh, outfile) == -1) { qfits_error("cannot dump header in file"); qfits_header_destroy(fh); fclose(outfile); return -1; } qfits_header_destroy(fh); /* Append the data to the file */ return qfits_table_append_data(outfile, t, data); } /*----------------------------------------------------------------------------*/ /** @brief Appends an extension header + data to a FITS ASCII table file. @param outfile Pointer to (opened) file ready for writing. @param t Pointer to qfits_table @param data Table data to write @return int 0 if Ok, -1 otherwise Dumps a FITS table to a file. The whole table described by qfits_table, and the data arrays contained in 'data' are dumped to the file. An extension header is produced with all keywords needed to describe the table, then the data is dumped to the file. The output is then padded to reach a multiple of 2880 bytes in size. Notice that no main header is produced, only the extension part. */ /*----------------------------------------------------------------------------*/ static int qfits_table_append_ascii_xtension( FILE * outfile, const qfits_table * t, const void ** data) { qfits_header * fh; if ((fh=qfits_table_ext_header_default(t)) == NULL) { qfits_error("cannot create new fits header"); return -1; } /* Write the fits header in the file */ if (qfits_header_dump(fh, outfile) == -1) { qfits_error("cannot dump header in file"); qfits_header_destroy(fh); return -1; } qfits_header_destroy(fh); /* Append the data to the file */ return qfits_table_append_data(outfile, t, data); } /*----------------------------------------------------------------------------*/ /** @brief Appends data to a FITS table file. @param outfile Pointer to (opened) file ready for writing. @param t Pointer to qfits_table @param data Table data to write @return int 0 if Ok, -1 otherwise Dumps the data part of a FITS table to a file. The primary header, as well as the extension header are supposed to be already there (and properly padded). The output is then padded to reach a multiple of 2880 bytes in size. */ /*----------------------------------------------------------------------------*/ static int qfits_table_append_data( FILE * outfile, const qfits_table * t, const void ** data) { qfits_col * curr_col; char field[1024]; char * line; unsigned char ** array; unsigned char * r; unsigned char * inbuf; int writt_char; int nb_blanks; int field_size; int i, j; /* Write DATA */ array = qfits_malloc(t->nc*sizeof(unsigned char *)); curr_col = t->col; for (i=0; inc; i++) { /* Compute the field size */ field_size = qfits_table_get_field_size(t->tab_t, curr_col); /* Copy data from data to array (unsigned char) */ array[i] = qfits_malloc(t->nr * field_size); r = (unsigned char *)array[i]; inbuf = (unsigned char *)(data[i]); /* Copy the data */ if (t->tab_t == QFITS_ASCIITABLE) { /* ASCII table */ for (j=0; jnr; j++) { switch(curr_col->atom_type) { case TFITS_ASCII_TYPE_A : strncpy(field, (char*)inbuf, curr_col->atom_nb); field[curr_col->atom_nb] = '\0'; inbuf += curr_col->atom_nb; break; case TFITS_ASCII_TYPE_D : memset(field, ' ', curr_col->atom_nb); sprintf(field, "%g", ((double*)data[i])[j]); field[curr_col->atom_nb] = '\0'; break; case TFITS_ASCII_TYPE_E : case TFITS_ASCII_TYPE_F : memset(field, ' ', curr_col->atom_nb); sprintf(field, "%f", ((float*)data[i])[j]); field[curr_col->atom_nb] = '\0'; break; case TFITS_ASCII_TYPE_I : memset(field, ' ', curr_col->atom_nb); sprintf(field, "%d", ((int*)data[i])[j]); field[curr_col->atom_nb] = '\0'; break; default: break; } memcpy(r, field, curr_col->atom_nb); r += (curr_col->atom_nb); } } else if (t->tab_t == QFITS_BINTABLE) { /* BINARY table */ for (j=0; jnr; j++) { memcpy(r, inbuf, field_size); inbuf += field_size; r += field_size; } /* Byte swapping needed if on a little-endian machine */ #ifndef WORDS_BIGENDIAN if (curr_col->atom_size > 1) { r = array[i]; for (j=0; jnr * curr_col->atom_nb; j++) { qfits_swap_bytes(r, curr_col->atom_size); r += curr_col->atom_size; } } #endif } else return -1; curr_col++; } /* Write to the outfile */ writt_char = 0; for (i=0; inr; i++) { curr_col = t->col; for (j=0; jnc; j++) { field_size = qfits_table_get_field_size(t->tab_t, curr_col); r = array[j] + field_size * i; line = (char *)qfits_calloc (field_size+1, sizeof (char)); memcpy(line, r, field_size); line[field_size] = '\0'; fwrite(line, 1, field_size, outfile); writt_char += field_size; curr_col++; qfits_free(line); } } /* Complete with blanks to FITS_BLOCK_SIZE characters */ if (writt_char % FITS_BLOCK_SIZE) { nb_blanks = FITS_BLOCK_SIZE - (writt_char%FITS_BLOCK_SIZE); for (i=1; i<=nb_blanks; i++) fwrite(" ", 1, 1, outfile); } /* Free and return */ for(i=0; inc; i++) { if (array[i] != NULL) qfits_free(array[i]); } qfits_free(array); return 0; } /*----------------------------------------------------------------------------*/ /** @brief Get the size in bytes of a field @param type table type @param col a column @return the size */ /*----------------------------------------------------------------------------*/ static int qfits_table_get_field_size( int type, const qfits_col * col) { int field_size; switch (type) { case QFITS_BINTABLE: field_size = col->atom_nb * col->atom_size; break; case QFITS_ASCIITABLE: field_size = col->atom_nb; break; default: qfits_warning("unrecognized table type"); field_size = -1; } return field_size; } astrometry.net-0.67/qfits-an/qfits_time.c000644 000765 000024 00000021153 12651445460 020622 0ustar00dstnstaff000000 000000 /* $Id: qfits_time.c,v 1.7 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.7 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include "qfits_time.h" /*----------------------------------------------------------------------------- Macros -----------------------------------------------------------------------------*/ /* Get century from a date in long format */ #define GET_CENTURY(d) (int) ( (d) / 1000000L) /* Get century year from a date in long format */ #define GET_CCYEAR(d) (int) ( (d) / 10000L) /* Get year from a date in long format */ #define GET_YEAR(d) (int) (((d) % 1000000L) / 10000L) /* Get month from a date in long format */ #define GET_MONTH(d) (int) (((d) % 10000L) / 100) /* Get day from a date in long format */ #define GET_DAY(d) (int) ( (d) % 100) /* Get hours from a date in long format */ #define GET_HOUR(t) (int) ( (t) / 1000000L) /* Get minutes from a date in long format */ #define GET_MINUTE(t) (int) (((t) % 1000000L) / 10000L) /* Get seconds from a date in long format */ #define GET_SECOND(t) (int) (((t) % 10000L) / 100) /* Get centi-seconds from a date in long format */ #define GET_CENTI(t) (int) ( (t) % 100) /* Make date in long format from its components */ #define MAKE_DATE(c,y,m,d) (long) (c) * 1000000L + \ (long) (y) * 10000L + \ (long) (m) * 100 + (d) /* Make time in long format from its components */ #define MAKE_TIME(h,m,s,c) (long) (h) * 1000000L + \ (long) (m) * 10000L + \ (long) (s) * 100 + (c) /* Interval values, specified in centiseconds */ #define INTERVAL_CENTI 1 #define INTERVAL_SEC 100 #define INTERVAL_MIN 6000 #define INTERVAL_HOUR 360000L #define INTERVAL_DAY 8640000L /*----------------------------------------------------------------------------- Private to this module -----------------------------------------------------------------------------*/ static long timer_to_date(time_t time_secs); static long timer_to_time(time_t time_secs); static long qfits_time_now(void); static long qfits_date_now (void); /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_time Get date/time, possibly in ISO8601 format * * This module contains various utilities to get the current date/time, * and possibly format it according to the ISO 8601 format. */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Returns the current date and time as a static string. @return Pointer to statically allocated string Build and return a string containing the date of today and the current time in ISO8601 format. The returned pointer points to a statically allocated string in the function, so no need to free it. */ /*----------------------------------------------------------------------------*/ char * qfits_get_datetime_iso8601(void) { static char date_iso8601[20]; long curdate; long curtime; curdate = qfits_date_now(); curtime = qfits_time_now(); sprintf(date_iso8601, "%04d-%02d-%02dT%02d:%02d:%02d", GET_CCYEAR(curdate), GET_MONTH(curdate), GET_DAY(curdate), GET_HOUR(curtime), GET_MINUTE(curtime), GET_SECOND(curtime)); return date_iso8601; } /**@}*/ /*----------------------------------------------------------------------------*/ /** @brief Returns the current date as a long (CCYYMMDD). @return The current date as a long number. Returns the current date as a long value (CCYYMMDD). Since most system clocks do not return a century, this function assumes that all years 80 and above are in the 20th century, and all years 00 to 79 are in the 21st century. For best results, consume before 1 Jan 2080. Example: 19 Oct 2000 is returned as 20001019 */ /*----------------------------------------------------------------------------*/ static long qfits_date_now (void) { return (timer_to_date (time (NULL))); } /*----------------------------------------------------------------------------*/ /** @brief Returns the current time as a long (HHMMSSCC). @return The current time as a long number. Returns the current time as a long value (HHMMSSCC). If the system clock does not return centiseconds, these are set to zero. Example: 15:36:12.84 is returned as 15361284 */ /*----------------------------------------------------------------------------*/ static long qfits_time_now(void) { struct timeval time_struct; gettimeofday (&time_struct, 0); return (timer_to_time (time_struct.tv_sec) + time_struct.tv_usec / 10000); } /*----------------------------------------------------------------------------*/ /** @brief Converts a timer value to a date. @param time_secs Current time definition in seconds. @return Current date as a long (CCYYMMDD). Converts the supplied timer value into a long date value. Dates are stored as long values: CCYYMMDD. If the supplied value is zero, returns zero. If the supplied value is out of range, returns 1 January, 1970 (19700101). The timer value is assumed to be UTC (GMT). */ /*----------------------------------------------------------------------------*/ static long timer_to_date(time_t time_secs) { struct tm *time_struct; if (time_secs == 0) { return 0; } else { /* Convert into a long value CCYYMMDD */ time_struct = localtime (&time_secs); if (time_struct) { time_struct-> tm_year += 1900; return (MAKE_DATE ( time_struct-> tm_year / 100, time_struct-> tm_year % 100, time_struct-> tm_mon + 1, time_struct-> tm_mday)); } else { return (19700101); } } } /*----------------------------------------------------------------------------*/ /** @brief Convert a timer value to a time. @param time_secs Current time definition in seconds. @return Current time as a long. Converts the supplied timer value into a long time value. Times are stored as long values: HHMMSS00. Since the timer value does not hold centiseconds, these are set to zero. If the supplied value was zero or invalid, returns zero. The timer value is assumed to be UTC (GMT). */ /*----------------------------------------------------------------------------*/ static long timer_to_time(time_t time_secs) { struct tm *time_struct; if (time_secs == 0) { return 0; } else { /* Convert into a long value HHMMSS00 */ time_struct = localtime (&time_secs); if (time_struct) { return (MAKE_TIME (time_struct-> tm_hour, time_struct-> tm_min, time_struct-> tm_sec, 0)); } else { return 0; } } } astrometry.net-0.67/qfits-an/qfits_tools.c000644 000765 000024 00000020117 12651445460 021023 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_tools.c,v 1.12 2006/02/23 11:19:56 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/23 11:19:56 $ * $Revision: 1.12 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include "qfits_config.h" #include "qfits_tools.h" #include "qfits_card.h" #include "qfits_rw.h" #include "qfits_std.h" #include "qfits_error.h" #include "qfits_memory.h" /*----------------------------------------------------------------------------- Global variables -----------------------------------------------------------------------------*/ size_t qfits_blocks_needed(size_t size) { return (size + FITS_BLOCK_SIZE - 1) / FITS_BLOCK_SIZE; } /* * The following global variables are only used for regular expression * matching of integers and floats. These definitions are private to * this module. */ /** A regular expression matching a floating-point number */ static const char* regex_float = "^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eEdD][+-]?[0-9]+)?$"; /** A regular expression matching an integer */ static const char* regex_int = "^[+-]?[0-9]+$"; /** A regular expression matching a complex number (int or float) */ static const char* regex_cmp = "^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eEdD][+-]?[0-9]+)?[ ]+[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eEdD][+-]?[0-9]+)?$"; /*----------------------------------------------------------------------------*/ /** * @defgroup qfits_tools Simple FITS access routines * * This module offers a number of very basic low-level FITS access * routines. */ /*----------------------------------------------------------------------------*/ /**@{*/ /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ char* qfits_pretty_string_r(const char * s, char* pretty) { int i,j; int slen; pretty[0] = '\0'; if (!s) { return NULL; } if (s[0] != '\'') { strcpy(pretty, s); return pretty; } slen = strlen(s); /* skip first quote */ i=1; j=0; /* trim left-side blanks */ while (s[i]==' ') { if (i==slen) break; i++; } if (i >= (slen-1)) { return pretty; } /* copy string, changing double quotes to single ones */ while (i1) return 0; if (s[0]=='T' || s[0]=='F') return 1; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Identify if a FITS value is an int. @param s FITS value as a string @return int 0 or 1 Identifies if a FITS value is an integer. */ /*----------------------------------------------------------------------------*/ int qfits_is_int(const char * s) { regex_t re_int; int status; if (s==NULL) return 0; if (s[0]==0) return 0; if (regcomp(&re_int, regex_int, REG_EXTENDED|REG_NOSUB)!=0) { qfits_error("internal error: compiling int rule"); exit(-1); } status = regexec(&re_int, s, 0, NULL, 0); regfree(&re_int); return (status) ? 0 : 1; } /*----------------------------------------------------------------------------*/ /** @brief Identify if a FITS value is float. @param s FITS value as a string @return int 0 or 1 Identifies if a FITS value is float. */ /*----------------------------------------------------------------------------*/ int qfits_is_float(const char * s) { regex_t re_float; int status; if (s==NULL) return 0; if (s[0]==0) return 0; if (regcomp(&re_float, regex_float, REG_EXTENDED|REG_NOSUB)!=0) { qfits_error("internal error: compiling float rule"); exit(-1); } status = regexec(&re_float, s, 0, NULL, 0); regfree(&re_float); return (status) ? 0 : 1; } /*----------------------------------------------------------------------------*/ /** @brief Identify if a FITS value is complex. @param s FITS value as a string @return int 0 or 1 Identifies if a FITS value is complex. */ /*----------------------------------------------------------------------------*/ int qfits_is_complex(const char * s) { regex_t re_cmp; int status; if (s==NULL) return 0; if (s[0]==0) return 0; if (regcomp(&re_cmp, regex_cmp, REG_EXTENDED|REG_NOSUB)!=0) { qfits_error("internal error: compiling complex rule"); exit(-1); } status = regexec(&re_cmp, s, 0, NULL, 0); regfree(&re_cmp); return (status) ? 0 : 1; } /*----------------------------------------------------------------------------*/ /** @brief Identify if a FITS value is string. @param s FITS value as a string @return int 0 or 1 Identifies if a FITS value is a string. */ /*----------------------------------------------------------------------------*/ int qfits_is_string(const char * s) { if (s==NULL) return 0; if (s[0]=='\'') return 1; return 0; } /*----------------------------------------------------------------------------*/ /** @brief Identify the type of a FITS value given as a string. @param s FITS value as a string @return integer naming the FITS type Returns the following value: - QFITS_UNKNOWN (0) for an unknown type. - QFITS_BOOLEAN (1) for a boolean type. - QFITS_INT (2) for an integer type. - QFITS_FLOAT (3) for a floating-point type. - QFITS_COMPLEX (4) for a complex number. - QFITS_STRING (5) for a FITS string. */ /*----------------------------------------------------------------------------*/ int qfits_get_type(const char * s) { if (s==NULL) return QFITS_UNKNOWN; if (qfits_is_boolean(s)) return QFITS_BOOLEAN; if (qfits_is_int(s)) return QFITS_INT; if (qfits_is_float(s)) return QFITS_FLOAT; if (qfits_is_complex(s)) return QFITS_COMPLEX; return QFITS_STRING; } /*----------------------------------------------------------------------------*/ /** @brief Return the current QFITS version @return the QFITS version */ /*----------------------------------------------------------------------------*/ const char * qfits_version(void) { return (const char *)QFITS_VERSION; } /**@}*/ astrometry.net-0.67/qfits-an/README000644 000765 000024 00000004272 12651445460 017175 0ustar00dstnstaff000000 000000 qfits: quick FITS library ------------------------- Introduction ------------ qfits is a C library giving access to FITS file internals, both for reading and writing. qfits was born from the need to have a simple and efficient library to handle FITS files. It has been initially designed to support any kind of FITS data stream, but only relevant parts were implemented. New features and support for more data streams have been added as the need came up. This ensures that all features present in the library have been thoroughly tested, since they are all used daily in a production environment. Overview -------- The FITS format is pretty simple, declaring ancillary data in 80-char lines in ASCII format, and storing values in fixed-size, uncompressed format. Data are stored on the disk more or less as they will be in memory (bar some trivial transformations). qfits has several levels of complexity, depending on whether you only want to retrieve ancillary data from headers, or only read pixels in, or do some true data manipulation or header re-formatting. People only interested in getting ancillary information from FITS files (i.e. reading FITS headers) will potentially use only 1 or 2 functions from qfits. If you want to do header manipulation (remove/add/modify keywords and dump the header back to disk), you will definitely want to have a look into the qfits_header methods. If you want to load pixels from FITS images, a couple of function calls should do the job. If you want to work on table data, you will want to check the qfits_table methods for generic data loading. qfits only gives you handles on the FITS format, it does not provide extra functionalities related to table or image processing, this is left to other (higher-level) libraries. Implementation -------------- qfits is written in 100% pure ANSI C that should compile on any Unix. qfits has not been compiled or tested on any non-Unix platform (Windows, Be, etc.). qfits has been shown to work reliably on the following platforms: - AIX - Dec/OSF1 (True64) - FreeBSD - HPUX - Linux - Mac OS X / Darwin - Solaris qfits should work fine on all POSIX-compliant Unixes. If you port qfits to any other platform, please let me know. astrometry.net-0.67/qfits-an/test/000755 000765 000024 00000000000 12651445460 017267 5ustar00dstnstaff000000 000000 astrometry.net-0.67/qfits-an/test/asciitable.tfits000644 000765 000024 00000116600 12651445460 022446 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / No. of bits per pixel NAXIS = 0 / Minimum FITS header - no data EXTEND = T / There may be FITS extensions BLOCKED = T / The file may be blocked ORIGIN = 'ESO ' / File was prepared at ESO-Garching DATE = '20/08/92' / Creation date of this file COMMENT This is a minimum FITS header with no data matrix. COMMENT FITS extensions may come after this header. END XTENSION= 'TABLE ' / FITS ASCII table extension BITPIX = 8 / Character data 8 bits per pixel NAXIS = 2 / ASCII tables has 2 axes NAXIS1 = 59 / Characters in row NAXIS2 = 53 / No. or rows in table PCOUNT = 0 / No group parameters GCOUNT = 1 / only one group TFIELDS = 8 / No. of table fields EXTNAME = 'Asciitable' / Extension name EXTVER = 1 / Extension version is 1 EXTLEVEL= 1 / Extension level is 1 DATE = '20/08/92' / Date of writting data ORIGIN = 'ESO ' / European Souther Observatory AUTHOR = 'P.Grosbol' / Author of data COMMENT Test file for ASCII table extension TTYPE1 = 'IDENT ' / Identifier TBCOL1 = 1 / Start column of field TFORM1 = 'A9 ' / String of 9 char's TNULL1 = '* ' / Undefined field value TTYPE2 = 'Mag ' / Magnitude TBCOL2 = 11 / Start column of field TFORM2 = 'F6.2 ' / Single precision fixed point TNULL2 = '---.-- ' / NULL value TTYPE3 = 'Channel ' / Channel value TBCOL3 = 18 / Start column of field TFORM3 = 'I3 ' / Integer format TNULL3 = ' * ' / NULL string for field TSCAL3 = 2.1 / Scaling factor of data TZERO3 = -70.2 / Value zero offset TDISP3 = 'F8.1 ' / Display as real TTYPE4 = 'Dist ' / Distance TBCOL4 = 22 / Start column of field TUNIT4 = 'PC ' / Values are in pc TFORM4 = 'E10.4 ' / Single precision real TDISP4 = 'F9.3 ' / Display with fixed point TTYPE5 = 'Mass ' / Mass TBCOL5 = 33 / Start column of field TFORM5 = 'D20.15 ' / Double precision real value TNULL5 = '* ' / NULL value has '*' TDISP5 = 'F20.15 ' / Single precision display TTYPE6 = 'Class ' / Full string with class TBCOL6 = 54 / Start column of field TFORM6 = 'A5 ' / String with 5 characters TNULL6 = '* ' / NULL value has '*' TTYPE7 = 'Type ' / Type TBCOL7 = 54 / Start column of field TFORM7 = 'A1 ' / Note: first character of CLASS TNULL7 = '* ' / NULL value has '*' TTYPE8 = 'Class_No' / Class no. TBCOL8 = 55 / Start column of field TFORM8 = 'I4 ' / Note: four last chars are a no. TNULL8 = ' ' / Blank field is Null END 1234567890123456789012345678901234567890123456789012345678 123456789 123456 123 1234567890 12345678901234567890 12345 Object 1 6.32 23 93.3911 23.1846719826491824 A4321 Object 2 -21.1 -91 12.23E02 1.281928469124D-01 B12 Object3 12345 0 12345678 987978 C 21 Some Null ---.-- 333 * D 1 More Null 32345 * -23.12 0.0 * 32 * 11.57 -19 0.0 -12300.1204232321 F3214 New Obj.1 1.2345 1 -934.322 1.234 G9876 N30212 33.215 43 -2.4334D2 421.827456582876592 H1234 IC30201 12 1 1.2257 -1.49547575746482 I9281 A10+2012 4.21 39 1.9234 J8392 Object 1 6.32 23 93.3911 23.1846719826491824 A4321 Object 2 -21.1 -91 12.23E02 1.281928469124D-01 B12 Object3 12345 0 12345678 987978 C 21 Some Null ---.-- 333 * D 1 More Null 32345 * -23.12 0.0 * 32 * 11.57 -19 0.0 -12300.1204232321 F3214 New Obj.1 1.2345 1 -934.322 1.234 G9876 N30212 33.215 43 -2.4334D2 421.827456582876592 H1234 IC30201 12 1 1.2257 -1.49547575746482 I9281 A10+2012 4.21 39 1.9234 J8392 Object 1 6.32 23 93.3911 23.1846719826491824 A4321 Object 2 -21.1 -91 12.23E02 1.281928469124D-01 B12 Object3 12345 0 12345678 987978 C 21 Some Null ---.-- 333 * D 1 More Null 32345 * -23.12 0.0 * 32 * 11.57 -19 0.0 -12300.1204232321 F3214 New Obj.1 1.2345 1 -934.322 1.234 G9876 N30212 33.215 43 -2.4334D2 421.827456582876592 H1234 IC30201 12 1 1.2257 -1.49547575746482 I9281 A10+2012 4.21 39 1.9234 J8392 Object 1 6.32 23 93.3911 23.1846719826491824 A4321 Object 2 -21.1 -91 12.23E02 1.281928469124D-01 B12 Object3 12345 0 12345678 987978 C 21 Some Null ---.-- 333 * D 1 More Null 32345 * -23.12 0.0 * 32 * 11.57 -19 0.0 -12300.1204232321 F3214 New Obj.1 1.2345 1 -934.322 1.234 G9876 N30212 33.215 43 -2.4334D2 421.827456582876592 H1234 IC30201 12 1 1.2257 -1.49547575746482 I9281 A10+2012 4.21 39 1.9234 J8392 Object 1 6.32 23 93.3911 23.1846719826491824 A4321 Object 2 -21.1 -91 12.23E02 1.281928469124D-01 B12 Object3 12345 0 12345678 987978 C 21 Some Null ---.-- 333 * D 1 More Null 32345 * -23.12 0.0 * 32 * 11.57 -19 0.0 -12300.1204232321 F3214 New Obj.1 1.2345 1 -934.322 1.234 G9876 N30212 33.215 43 -2.4334D2 421.827456582876592 H1234 IC30201 12 1 1.2257 -1.49547575746482 I9281 A10+2012 4.21 39 1.9234 J8392 1234567890123456789012345678901234567890123456789012345678 XTENSION= 'IMAGE ' / FITS IMAGE Extension BITPIX = 16 / No. of bits per pixel NAXIS = 3 / Three axes NAXIS1 = 73 / No. of pixels in X NAXIS2 = 31 / No. of pixels in Y NAXIS3 = 5 / No. of pixels in Z PCOUNT = 0 / No group parameters GCOUNT = 1 / One data group only EXTNAME = 'quality ' / Extension name EXTLEV = 1 / Extension level is 1 EXTVER = 1 / Extension version is 1 OBJECT = 'Ramp 16-bit' / Name of image ORIGIN = 'ESO ' / File was prepared at ESO-Garching DATE = '20/08/92' / Creation date of this file COMMENT This test file was created by P.Grosbol, ESO (pgrosbol@eso.org) COMMENT Simple 16-bit ramp wave pattern for testing of FITS readers CDELT1 = -2.3 / Coordinate increment CRVAL1 = -73.0 / Coordinate of reference pixel CRPIX1 = 12.1 / Reference pixel in X CDELT2 = 7.1 / Coordinate increment CRVAL2 = 300.6 / Coordinate of reference pixel CRPIX2 = -11.3 / Reference pixel in Y CDELT3 = .003 / Coordinate increment CRVAL3 = 21.2 / Coordinate of reference pixel CRPIX3 = 199.0 / Reference pixel in Y END   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHastrometry.net-0.67/qfits-an/test/bintable.tfits000644 000765 000024 00000116600 12651445460 022126 0ustar00dstnstaff000000 000000 SIMPLE = T / Standard FITS file BITPIX = 8 / No. of bits per pixel NAXIS = 0 / Minimum FITS header - no data EXTEND = T / There may be FITS extensions BLOCKED = T / The file may be blocked ORIGIN = 'ESO ' / File was prepared at ESO-Garching DATE = '20/08/92' / Creation date of this file COMMENT This is a minimum FITS header with no data matrix. COMMENT FITS extensions may come after this header. END XTENSION= 'BINTABLE' / FITS Binary table extension BITPIX = 8 / Byte array with 8 bits per pixel NAXIS = 2 / Binary tables have 2 axes NAXIS1 = 99 / Bytes in row NAXIS2 = 11 / No. of rows in table PCOUNT = 2731 / Heap size in bytes GCOUNT = 1 / Only one group TFIELDS = 13 / No. of table fields EXTNAME = 'BinTest ' / Name of extension EXTVER = 1 / This is version 1 EXTLEVEL= 1 / Extension level 1 THEAP = 1107 / Heap offset from data start DATE = '20/08/92' / Table was written 1992-08-20 ORIGIN = 'ESO ' / European Southern Observatory AUTHOR = 'P.Grosbol' / Author of table COMMENT Test file for verification of BINTABLE extension readers TTYPE1 = 'IDENT ' / Object identifier TFORM1 = '9A ' / Character string TTYPE2 = 'FLAGS ' / General flag field TFORM2 = '13X ' / Field contains 13 bit flags TTYPE3 = 'COUNTS ' / Count rate encoded as bytes TFORM3 = '3B ' / Byte for three energies TNULL3 = 237 / NULL value is defined TSCAL3 = 123.1 / Scaling should be applied TZERO3 = -12.65 / Data value offset TTYPE4 = 'COOR ' / Coordinates TFORM4 = '2D ' / X and Y coordinate TUNIT4 = 'M ' / Unit of values TTYPE5 = 'FLUX ' / Flux values TFORM5 = '3E ' / Single precision real values TUNIT5 = 'JY ' / Unit TTYPE6 = 'DUMMY ' / What about a dummy field TFORM6 = '0J ' / with no data TTYPE7 = 'CHANNEL ' / An integer I*2 channel no TFORM7 = 'I ' / Default repeat is 1 TNULL7 = -9999 / NULL values TTYPE8 = 'Yes_No ' / Check a logical column TFORM8 = '2L ' / Two values TTYPE9 = 'Index ' / Index array with 3 values TFORM9 = '3J ' / Full 32-bit integers TNULL9 = +793149 / Value for not defined data TTYPE10 = 'Array ' / Variable array or heap pointer TFORM10 = 'PI(13) ' / Max. length is 13 16-bit values TTYPE11 = 'Complex ' / Complex values TFORM11 = '2C ' / Two values per entry TTYPE12 = 'Cplx_64 ' / Yet another complex number TFORM12 = 'M ' / This time a 64-bit complex TTYPE13 = 'NOTE ' / No. of note if any TFORM13 = 'B ' / There are only 255 possibilities TNULL13 = 0 / NULL value is defined END Ident2001?@?@@@TT ?@@@@?@Ident2002??@@@FT @@@@@Ident2003?@@@@TF1?@@@@?PIdent2004123<~:{@?@?FF = = =8?C;@?@Ident2005AC??@#E?@@@@@IdentQRS@@@TT =~:@@@@?EIdent2007bc?@?;@@F?@@ Ident2008" qrs?@@@@F =@?@@@@?C;S?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHastrometry.net-0.67/qfits-an/test/Makefile.am000644 000765 000024 00000001437 12651445460 021330 0ustar00dstnstaff000000 000000 AUTOMAKE_OPTIONS = 1.8 foreign DISTCLEANFILES = *~ INCLUDES = -I$(top_srcdir)/src LDADD = $(top_builddir)/src/libqfits.la check_PROGRAMS = test_pixio \ test_qfits \ test_tfits \ test_xmem \ test_xmem_stress test_pixio_SOURCES = test_pixio.c test_qfits_SOURCES = test_qfits.c test_tfits_SOURCES = test_tfits.c test_xmem_SOURCES = test_xmem.c test_xmem_stress_SOURCES = test_xmem_stress.c noinst_HEADERS = pixset.h # Add here files or directories, that will be included in the distribution EXTRA_DIST = test_pixio.txt \ test_qfits.txt \ test_tfits.txt \ asciitable.tfits \ bintable.tfits # Test to be executed with "make check" # They should return 0 test passed, else error # test_stress TESTS = test_pixio \ test_qfits \ test_tfits \ test_xmem \ test_xmem_stress astrometry.net-0.67/qfits-an/test/Makefile.in000644 000765 000024 00000046160 12651445460 021343 0ustar00dstnstaff000000 000000 # Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test_pixio$(EXEEXT) test_qfits$(EXEEXT) \ test_tfits$(EXEEXT) test_xmem$(EXEEXT) \ test_xmem_stress$(EXEEXT) TESTS = test_pixio$(EXEEXT) test_qfits$(EXEEXT) test_tfits$(EXEEXT) \ test_xmem$(EXEEXT) test_xmem_stress$(EXEEXT) subdir = test DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_test_pixio_OBJECTS = test_pixio.$(OBJEXT) test_pixio_OBJECTS = $(am_test_pixio_OBJECTS) test_pixio_LDADD = $(LDADD) test_pixio_DEPENDENCIES = $(top_builddir)/src/libqfits.la am_test_qfits_OBJECTS = test_qfits.$(OBJEXT) test_qfits_OBJECTS = $(am_test_qfits_OBJECTS) test_qfits_LDADD = $(LDADD) test_qfits_DEPENDENCIES = $(top_builddir)/src/libqfits.la am_test_tfits_OBJECTS = test_tfits.$(OBJEXT) test_tfits_OBJECTS = $(am_test_tfits_OBJECTS) test_tfits_LDADD = $(LDADD) test_tfits_DEPENDENCIES = $(top_builddir)/src/libqfits.la am_test_xmem_OBJECTS = test_xmem.$(OBJEXT) test_xmem_OBJECTS = $(am_test_xmem_OBJECTS) test_xmem_LDADD = $(LDADD) test_xmem_DEPENDENCIES = $(top_builddir)/src/libqfits.la am_test_xmem_stress_OBJECTS = test_xmem_stress.$(OBJEXT) test_xmem_stress_OBJECTS = $(am_test_xmem_stress_OBJECTS) test_xmem_stress_LDADD = $(LDADD) test_xmem_stress_DEPENDENCIES = $(top_builddir)/src/libqfits.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/admin/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(test_pixio_SOURCES) $(test_qfits_SOURCES) \ $(test_tfits_SOURCES) $(test_xmem_SOURCES) \ $(test_xmem_stress_SOURCES) DIST_SOURCES = $(test_pixio_SOURCES) $(test_qfits_SOURCES) \ $(test_tfits_SOURCES) $(test_xmem_SOURCES) \ $(test_xmem_stress_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_REVISION = @LT_REVISION@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.8 foreign DISTCLEANFILES = *~ INCLUDES = -I$(top_srcdir)/src LDADD = $(top_builddir)/src/libqfits.la test_pixio_SOURCES = test_pixio.c test_qfits_SOURCES = test_qfits.c test_tfits_SOURCES = test_tfits.c test_xmem_SOURCES = test_xmem.c test_xmem_stress_SOURCES = test_xmem_stress.c noinst_HEADERS = pixset.h # Add here files or directories, that will be included in the distribution EXTRA_DIST = test_pixio.txt \ test_qfits.txt \ test_tfits.txt \ asciitable.tfits \ bintable.tfits all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list test_pixio$(EXEEXT): $(test_pixio_OBJECTS) $(test_pixio_DEPENDENCIES) @rm -f test_pixio$(EXEEXT) $(LINK) $(test_pixio_OBJECTS) $(test_pixio_LDADD) $(LIBS) test_qfits$(EXEEXT): $(test_qfits_OBJECTS) $(test_qfits_DEPENDENCIES) @rm -f test_qfits$(EXEEXT) $(LINK) $(test_qfits_OBJECTS) $(test_qfits_LDADD) $(LIBS) test_tfits$(EXEEXT): $(test_tfits_OBJECTS) $(test_tfits_DEPENDENCIES) @rm -f test_tfits$(EXEEXT) $(LINK) $(test_tfits_OBJECTS) $(test_tfits_LDADD) $(LIBS) test_xmem$(EXEEXT): $(test_xmem_OBJECTS) $(test_xmem_DEPENDENCIES) @rm -f test_xmem$(EXEEXT) $(LINK) $(test_xmem_OBJECTS) $(test_xmem_LDADD) $(LIBS) test_xmem_stress$(EXEEXT): $(test_xmem_stress_OBJECTS) $(test_xmem_stress_DEPENDENCIES) @rm -f test_xmem_stress$(EXEEXT) $(LINK) $(test_xmem_stress_OBJECTS) $(test_xmem_stress_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pixio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_qfits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_tfits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_xmem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_xmem_stress.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: astrometry.net-0.67/qfits-an/test/pixset.h000644 000765 000024 00000017140 12651445460 020757 0ustar00dstnstaff000000 000000 #define TEST_LX 8 #define TEST_LY 35 #define TEST_NPIX (TEST_LX * TEST_LY) static float floatpix_set[TEST_NPIX] = { -65535, -65535, -65535, -65535, -65535, -65535, -65535, -65535, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -511, -511, -511, -511, -511, -511, -511, -511, -255, -255, -255, -255, -255, -255, -255, -255, -127, -127, -127, -127, -127, -127, -127, -127, -63, -63, -63, -63, -63, -63, -63, -63, -31, -31, -31, -31, -31, -31, -31, -31, -15, -15, -15, -15, -15, -15, -15, -15, -7, -7, -7, -7, -7, -7, -7, -7, -3, -3, -3, -3, -3, -3, -3, -3, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 63, 63, 63, 63, 63, 63, 63, 63, 127, 127, 127, 127, 127, 127, 127, 127, 255, 255, 255, 255, 255, 255, 255, 255, 511, 511, 511, 511, 511, 511, 511, 511, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535 } ; static double doublepix_set[TEST_NPIX] = { -65535, -65535, -65535, -65535, -65535, -65535, -65535, -65535, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -511, -511, -511, -511, -511, -511, -511, -511, -255, -255, -255, -255, -255, -255, -255, -255, -127, -127, -127, -127, -127, -127, -127, -127, -63, -63, -63, -63, -63, -63, -63, -63, -31, -31, -31, -31, -31, -31, -31, -31, -15, -15, -15, -15, -15, -15, -15, -15, -7, -7, -7, -7, -7, -7, -7, -7, -3, -3, -3, -3, -3, -3, -3, -3, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 63, 63, 63, 63, 63, 63, 63, 63, 127, 127, 127, 127, 127, 127, 127, 127, 255, 255, 255, 255, 255, 255, 255, 255, 511, 511, 511, 511, 511, 511, 511, 511, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535 } ; static int intpix_set[TEST_NPIX] = { -65535, -65535, -65535, -65535, -65535, -65535, -65535, -65535, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -32767, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -16383, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -8191, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -4095, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -2047, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -1023, -511, -511, -511, -511, -511, -511, -511, -511, -255, -255, -255, -255, -255, -255, -255, -255, -127, -127, -127, -127, -127, -127, -127, -127, -63, -63, -63, -63, -63, -63, -63, -63, -31, -31, -31, -31, -31, -31, -31, -31, -15, -15, -15, -15, -15, -15, -15, -15, -7, -7, -7, -7, -7, -7, -7, -7, -3, -3, -3, -3, -3, -3, -3, -3, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 31, 31, 31, 31, 63, 63, 63, 63, 63, 63, 63, 63, 127, 127, 127, 127, 127, 127, 127, 127, 255, 255, 255, 255, 255, 255, 255, 255, 511, 511, 511, 511, 511, 511, 511, 511, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 16383, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535 } ; astrometry.net-0.67/qfits-an/test/test_pixio.c000644 000765 000024 00000042262 12651445460 021630 0ustar00dstnstaff000000 000000 /* $Id: test_pixio.c,v 1.9 2007/01/10 12:29:58 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2007/01/10 12:29:58 $ * $Revision: 1.9 $ * $Name: qfits-6_2_0 $ */ /*--------------------------------------------------------------------------- Includes ---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include "qfits_header.h" #include "qfits_image.h" #include "qfits_md5.h" #include "qfits_memory.h" /* Get test data sets */ #include "pixset.h" /*--------------------------------------------------------------------------- Defines ---------------------------------------------------------------------------*/ /* 5 possible values for FITS BITPIX */ #define FITS_NBITPIX 5 /* Name of temporary directory */ #define TEST_DIRNAME "pixio_dat" /*--------------------------------------------------------------------------- Static variables ---------------------------------------------------------------------------*/ /* List of all FITS BITPIX possible values */ static int fits_bitpix[FITS_NBITPIX] = {8, 16, 32, -32, -64}; /* List of all DATAMD5 signatures for the generated files */ static char md5sigs[FITS_NBITPIX][33] = { "980c2e1bd6f6418e000b4f2bba665e69", "df8420dce7a4e6b3edb23171b9112d1d", "3b50d1cf34f3f5687c8f00ebbecc74b4", "f502ad23f6b250cb0f9f333c50314751", "d77c59b732df2a65c036dbf2fb180ad3" }; /*--------------------------------------------------------------------------- Function codes ---------------------------------------------------------------------------*/ /* Print out a comment */ static void say(char * fmt, ...) { va_list ap ; fprintf(stdout, "qtest:\t\t"); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); fprintf(stdout, "\n"); } /* Print out an error message */ static void fail(char * fmt, ...) { va_list ap ; fprintf(stderr, "qtest: error: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } /* Dump data to a test file */ static int test_dumpfile(qfitsdumper * qd) { qfits_header * qh ; FILE * out ; char s_out[8]; qh = qfits_header_default(); qfits_header_add(qh, "NAXIS", "2", "Number of axes", NULL); sprintf(s_out, "%d", TEST_LX); qfits_header_add(qh, "NAXIS1", s_out, "size in x", NULL); sprintf(s_out, "%d", TEST_LY); qfits_header_add(qh, "NAXIS2", s_out, "size in y", NULL); sprintf(s_out, "%d", qd->out_ptype); qfits_header_add(qh, "BITPIX", s_out, "Bits per pixel", NULL); out = fopen(qd->filename, "w"); if (out==NULL) { fail("cannot create test file"); qfits_header_destroy(qh); return 1 ; } if (qfits_header_dump(qh, out)!=0) { fail("cannot dump header"); qfits_header_destroy(qh); return 1 ; } fclose(out); qfits_header_destroy(qh); if (qfits_pixdump(qd)!=0) { fail("cannot dump data section"); remove(qd->filename); return 1 ; } qfits_zeropad(qd->filename); return 0 ; } /* * For this first test, the idea is to have the same array of pixels * defined three times: as int, as float, and as double. Pixels in the * three arrays contain strictly the same values but under different data * types. * All arrays are successively dumped to all possible FITS pixel types * (BITPIX), yielding 5 data types per input array. A first check is to * ensure that all input pixel types can be dumped to all possible BITPIX * values. * The second thing to test is that FITS files with the same BITPIX have * the same MD5 data signature, i.e. that dumping from two different data * types yields the same FITS file. */ static int test_dumpdatasets(void) { int err ; char filename[1024] ; char * ptype_name ; qfitsdumper qd ; int i ; const char * datamd5 ; err = 0 ; qd.npix = TEST_NPIX ; say("-----> Data dump tests"); /* Create working directory to avoid flooding the current one */ say("creating directory %s", TEST_DIRNAME); if (mkdir(TEST_DIRNAME, 0777)!=0) { fail("cannot create directory '%s'", TEST_DIRNAME); return 1 ; } /* Set pointers to the relevant pixel buffers */ qd.ibuf = intpix_set ; qd.fbuf = floatpix_set ; qd.dbuf = doublepix_set ; /* Create file from the int array with all possible FITS types */ qd.ptype = PTYPE_INT ; ptype_name = "int" ; /* Loop on all FITS types */ for (i=0 ; i BITPIX=% 3d", ptype_name, qd.out_ptype); if (test_dumpfile(&qd)!=0) { err++ ; } else { /* Verify MD5 signature */ datamd5 = qfits_datamd5(filename); if (strcmp(datamd5, md5sigs[i])) { fail("MD5 signature does not match"); err++ ; } } } /* Create file from the float array with all possible FITS types */ qd.ptype = PTYPE_FLOAT ; ptype_name = "float" ; /* Loop on all FITS types */ for (i=0 ; i BITPIX=% 3d", ptype_name, qd.out_ptype); if (test_dumpfile(&qd)!=0) { err++ ; } else { /* Verify MD5 signature */ datamd5 = qfits_datamd5(filename); if (strcmp(datamd5, md5sigs[i])) { fail("MD5 signature does not match"); err++ ; } } } /* Create file from the double array with all possible FITS types */ qd.ptype = PTYPE_DOUBLE ; ptype_name = "double" ; /* Loop on all FITS types */ for (i=0 ; i BITPIX=% 3d", ptype_name, qd.out_ptype); if (test_dumpfile(&qd)!=0) { err++ ; } else { /* Verify MD5 signature */ datamd5 = qfits_datamd5(filename); if (strcmp(datamd5, md5sigs[i])) { fail("MD5 signature does not match"); err++ ; } } } return err ; } /* * Simple comparison function for the int array */ static int check_intpix(int * arr, int bitpix) { int i ; int pix ; int pixerr ; pixerr=0 ; for (i=0 ; i255) pix=255 ; } else if (bitpix==16) { if (intpix_set[i]<-32768) pix = -32768 ; else if (intpix_set[i]>32767) pix = 32767 ; } if (arr[i]!=pix) pixerr++ ; } return pixerr ; } /* * Simple comparison function for the float array */ static int check_floatpix(float * arr, int bitpix) { int i ; float pix ; int pixerr ; pixerr=0 ; for (i=0 ; i255) pix=255 ; } else if (bitpix==16) { if (intpix_set[i]<-32768) pix = -32768 ; else if (intpix_set[i]>32767) pix = 32767 ; } if (fabs((double)(arr[i]-pix))>1e-7) pixerr++ ; } return pixerr ; } /* * Simple comparison function for the double array */ static int check_doublepix(double * arr, int bitpix) { int i ; double pix ; int pixerr ; pixerr=0 ; for (i=0 ; i255) pix=255 ; } else if (bitpix==16) { if (intpix_set[i]<-32768) pix = -32768 ; else if (intpix_set[i]>32767) pix = 32767 ; } if (fabs(arr[i]-pix)>1e-7) pixerr++ ; } return pixerr ; } /* * This second test tries to read back the data written in the first test, * and compares the values with what was initially sent to the files. */ static int test_readdatasets(void) { char filename[1024]; int i ; qfitsloader ql ; int err, pixerr ; char * ptype_name ; err=0 ; say("-----> Data read tests"); ql.xtnum = 0 ; ql.pnum = 0 ; ql.map = 0 ; /* Test reading back from all files as int buffer */ ptype_name = "int" ; ql.ptype = PTYPE_INT ; say("-----> int reading tests"); for (i=0 ; i float reading tests"); for (i=0 ; i double reading tests"); for (i=0 ; i window double reading tests"); for (i=0 ; i Data dump tests qtest: creating directory pixio_dat qtest: dumping data int -> BITPIX= 8 qtest: dumping data int -> BITPIX= 16 qtest: dumping data int -> BITPIX= 32 qtest: dumping data int -> BITPIX=-32 qtest: dumping data int -> BITPIX=-64 qtest: dumping data float -> BITPIX= 8 qtest: dumping data float -> BITPIX= 16 qtest: dumping data float -> BITPIX= 32 qtest: dumping data float -> BITPIX=-32 qtest: dumping data float -> BITPIX=-64 qtest: dumping data double -> BITPIX= 8 qtest: dumping data double -> BITPIX= 16 qtest: dumping data double -> BITPIX= 32 qtest: dumping data double -> BITPIX=-32 qtest: dumping data double -> BITPIX=-64 qtest: -----> Data read tests qtest: -----> int reading tests qtest: reading data from file: pixio_dat/pixio_int_8.fits qtest: reading data from file: pixio_dat/pixio_int_16.fits qtest: reading data from file: pixio_dat/pixio_int_32.fits qtest: reading data from file: pixio_dat/pixio_int_-32.fits qtest: reading data from file: pixio_dat/pixio_int_-64.fits qtest: -----> float reading tests qtest: reading data from file: pixio_dat/pixio_float_8.fits qtest: reading data from file: pixio_dat/pixio_float_16.fits qtest: reading data from file: pixio_dat/pixio_float_32.fits qtest: reading data from file: pixio_dat/pixio_float_-32.fits qtest: reading data from file: pixio_dat/pixio_float_-64.fits qtest: -----> double reading tests qtest: reading data from file: pixio_dat/pixio_double_8.fits qtest: reading data from file: pixio_dat/pixio_double_16.fits qtest: reading data from file: pixio_dat/pixio_double_32.fits qtest: reading data from file: pixio_dat/pixio_double_-32.fits qtest: reading data from file: pixio_dat/pixio_double_-64.fits qtest: cleaning up data files... qtest: removing directory 'pixio_dat' astrometry.net-0.67/qfits-an/test/test_qfits.c000644 000765 000024 00000046522 12651445460 021631 0ustar00dstnstaff000000 000000 /* $Id: test_qfits.c,v 1.15 2007/01/10 12:29:58 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2007/01/10 12:29:58 $ * $Revision: 1.15 $ * $Name: qfits-6_2_0 $ */ /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include #include "qfits_header.h" #include "qfits_image.h" #include "qfits_tools.h" #include "qfits_rw.h" #include "qfits_md5.h" #include "qfits_memory.h" /*----------------------------------------------------------------------------- Define -----------------------------------------------------------------------------*/ #define QFITSTEST1 "QFITS.fits" #define QFITSTEST2 "QFITS_ext.fits" #define REFSIG "6569daba7b124febfa0cd7813f555774" /*----------------------------------------------------------------------------- Functions -----------------------------------------------------------------------------*/ static float float_array_orig[] = { 1.0, 2.0, 0.0, -1.0, -2.0, 1e-4, -1e-4, 1e-6, -1e-6, 1.2345678, 3.1415926535, 19.71 }; static int int_array_orig[] = { -32768, -16384, -8192, -4096, -1023, 0, 1023, 2048, 8191, 16387, 32767, 65536 }; static double double_array_orig[] = { 1.0, 2.0, 0.0, -1.0, -2.0, 1e-4, -1e-4, 1e-6, -1e-6, 1.2345678, 3.1415926535, 19.71 }; /* Print out a comment */ static void say(char * fmt, ...) { va_list ap ; fprintf(stdout, "qtest:\t\t"); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); fprintf(stdout, "\n"); } /* Print out an error message */ static void fail(char * fmt, ...) { va_list ap ; fprintf(stderr, "qtest: error: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } /*--------------------------------------------------------------------------- main ---------------------------------------------------------------------------*/ int test_qfits_header_sort(void) { qfits_header * qh ; /* Create header */ qh = qfits_header_new(); qfits_header_append(qh, "EXTEND", "value", "comment", NULL); qfits_header_append(qh, "COMMENT", "value", "comment", NULL); qfits_header_append(qh, "TFORM", "value", "comment", NULL); qfits_header_append(qh, "BITPIX", "value", "comment", NULL); qfits_header_append(qh, "NAXIS", "value", "comment", NULL); qfits_header_append(qh, "NAXIS2", "value", "comment", NULL); qfits_header_append(qh, "NAXIS1", "value", "comment", NULL); /* Dump the header */ qfits_header_dump(qh, NULL) ; /* Sort the header */ qfits_header_sort(&qh) ; /* Dump the header */ qfits_header_dump(qh, NULL) ; /* Destroy the header */ qfits_header_destroy(qh) ; return 0 ; } int test_qfits_filecreate(char * filename) { qfits_header * qh ; FILE * out ; qfitsdumper qd ; int i ; say("-----> Header creation"); say("Creating blank header"); qh = qfits_header_new(); if (qh==NULL) { fail("qfits_header_new() failed"); return 1 ; } say("Destroying blank header"); /* Destroy header now */ qfits_header_destroy(qh); /* Create minimal header (SIMPLE/END) */ say("Creating minimal header"); qh = qfits_header_default(); if (qh==NULL) { fail("qfits_header_default() failed"); return 1 ; } say("Inserting primary keywords"); /* Insert XTENSION marker */ qfits_header_add(qh, "EXTEND", "T", "xtension might be present", NULL); /* Insert a string */ qfits_header_add(qh, "KEY01", "value01", "comment 01", NULL); /* Insert an int */ qfits_header_add(qh, "KEY02", "2", "comment 02", NULL); /* Insert a double */ qfits_header_add(qh, "KEY03", "3.0", "comment 03", NULL); /* Insert a complex */ qfits_header_add(qh, "KEY04", "4.0 4.2", "comment 04", NULL); /* Insert a boolean */ qfits_header_add(qh, "KEY05", "T", "comment 05", NULL); say("Inserting history keywords"); /* Insert HISTORY keys */ qfits_header_add(qh, "HISTORY", "1 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "2 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "3 history field", NULL, NULL); qfits_header_add(qh, "HISTORY", "4 history field", NULL, NULL); say("Inserting comment keywords"); /* Insert COMMENT keys */ qfits_header_add(qh, "COMMENT", "1 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "2 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "3 comment field", NULL, NULL); qfits_header_add(qh, "COMMENT", "4 comment field", NULL, NULL); say("Inserting hierarch keywords"); /* Insert HIERARCH ESO keys in reverse DICB order */ qfits_header_add(qh, "HIERARCH ESO NULL A", "0.0", "not DICB", NULL); qfits_header_add(qh, "HIERARCH ESO NULL B", "0.0", "not DICB", NULL); qfits_header_add(qh, "HIERARCH ESO NULL C", "0.0", "not DICB", NULL); qfits_header_add(qh, "PRO.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "PRO.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "PRO.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO LOG C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "INS.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TEL C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "GEN.C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "HIERARCH ESO TPL C", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.A", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.B", "0.0", "DICB compliant", NULL); qfits_header_add(qh, "OBS.C", "0.0", "DICB compliant", NULL); say("Inserting mandatory keywords"); /* Insert mandatory keys in reverse order */ qfits_header_add(qh, "NAXIS2", "10", "NAXIS2 comment", NULL); qfits_header_add(qh, "NAXIS1", "11", "NAXIS1 comment", NULL); qfits_header_add(qh, "NAXIS", "2", "NAXIS comment", NULL); qfits_header_add(qh, "BITPIX", "-32", "BITPIX comment", NULL); /* Dump header to file */ say("Opening file for output"); out = fopen(filename, "w"); if (out==NULL) { fail("cannot create test file"); qfits_header_destroy(qh); return 1 ; } say("Dumping header to file"); if (qfits_header_dump(qh, out)!=0) { fail("cannot dump header"); qfits_header_destroy(qh); return 1 ; } say("Destroying built header"); qfits_header_destroy(qh); fclose(out); say("-----> Dumping pixels"); /* Allocate data segment and save it to FITS file */ qd.fbuf = qfits_malloc(11 * 10 * sizeof(float)); for (i=0 ; i<(11*10) ; i++) { qd.fbuf[i]=i*0.2 ; } qd.filename = filename ; qd.npix = 11 * 10 ; qd.ptype = PTYPE_FLOAT ; qd.out_ptype = -32 ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } qfits_free(qd.fbuf); /* Zero-pad the output file */ qfits_zeropad(filename); return 0 ; } int check_key(qfits_header * qh, char * key, char * expval) { char * val ; int err=0 ; val = qfits_header_getstr(qh, key); if (val==NULL) { fail("missing key in header"); err++ ; } else { val = qfits_pretty_string(val); if (strcmp(val, expval)) { fail("wrong value for key in header"); err++ ; } } return err ; } int test_qfitsheader_read(char * filename) { qfits_header * qh ; char * val ; int err ; int keytype ; err=0 ; say("-----> Header reading test"); /* Read header from source */ say("Reading header from file"); qh = qfits_header_read(filename); if (qh==NULL) { fail("cannot read test file"); return 1 ; } say("Querying mandatory keys"); err += check_key(qh, "SIMPLE", "T"); err += check_key(qh, "NAXIS", "2"); err += check_key(qh, "NAXIS1", "11"); err += check_key(qh, "NAXIS2", "10"); err += check_key(qh, "BITPIX", "-32"); say("Querying base keys"); err += check_key(qh, "KEY01", "value01"); err += check_key(qh, "KEY02", "2"); err += check_key(qh, "KEY03", "3.0"); err += check_key(qh, "KEY04", "4.0 4.2"); err += check_key(qh, "KEY05", "T"); say("Checking key types"); val = qfits_header_getstr(qh, "KEY01"); keytype = qfits_get_type(val); if (keytype!=QFITS_STRING) { printf("val=[%s] type is %d\n", val, keytype); fail("wrong identified type for KEY01 (string)"); err++; } val = qfits_header_getstr(qh, "KEY02"); keytype = qfits_get_type(val); if (keytype!=QFITS_INT) { fail("wrong identified type for KEY02 (int)"); err++; } val = qfits_header_getstr(qh, "KEY03"); keytype = qfits_get_type(val); if (keytype!=QFITS_FLOAT) { fail("wrong identified type for KEY03 (float)"); err++; } val = qfits_header_getstr(qh, "KEY04"); keytype = qfits_get_type(val); if (keytype!=QFITS_COMPLEX) { fail("wrong identified type for KEY04 (complex)"); err++; } val = qfits_header_getstr(qh, "KEY05"); keytype = qfits_get_type(val); if (keytype!=QFITS_BOOLEAN) { fail("wrong identified type for KEY05 (boolean)"); err++; } say("Querying hierarch keys"); err += check_key(qh, "HIERARCH ESO PRO A", "0.0"); err += check_key(qh, "PRO.B", "0.0"); err += check_key(qh, "pro.c", "0.0"); err += check_key(qh, "ins.a", "0.0"); err += check_key(qh, "ins.b", "0.0"); err += check_key(qh, "ins.c", "0.0"); err += check_key(qh, "gen.a", "0.0"); err += check_key(qh, "gen.b", "0.0"); err += check_key(qh, "gen.c", "0.0"); err += check_key(qh, "obs.a", "0.0"); err += check_key(qh, "obs.b", "0.0"); err += check_key(qh, "obs.c", "0.0"); err += check_key(qh, "tpl.a", "0.0"); err += check_key(qh, "tpl.b", "0.0"); err += check_key(qh, "tpl.c", "0.0"); err += check_key(qh, "tel.a", "0.0"); err += check_key(qh, "tel.b", "0.0"); err += check_key(qh, "tel.c", "0.0"); err += check_key(qh, "log.a", "0.0"); err += check_key(qh, "log.b", "0.0"); err += check_key(qh, "log.c", "0.0"); err += check_key(qh, "null.a", "0.0"); err += check_key(qh, "null.b", "0.0"); err += check_key(qh, "null.c", "0.0"); say("Removing keys"); qfits_header_del(qh, "PRO.A"); qfits_header_del(qh, "pro.b"); qfits_header_del(qh, "HIERARCH ESO PRO C"); if (qfits_header_getstr(qh, "HIERARCH ESO PRO A")!=NULL) err ++ ; if (qfits_header_getstr(qh, "PRO.B")!=NULL) err ++ ; if (qfits_header_getstr(qh, "pro.c")!=NULL) err ++ ; say("Modifying keys"); qfits_header_destroy(qh); return err ; } int test_qfitsheader_browse(char * filename) { qfits_header * qh ; char key[80], val[80], com[80] ; int i ; int err ; say("-----> Header browsing test"); /* Read header from source */ say("Reading header from file"); qh = qfits_header_read(filename); if (qh==NULL) { fail("cannot read test file"); return 1 ; } err=0 ; for (i=0 ; in ; i++) { if (qfits_header_getitem(qh, i, key, val, com, NULL)!=0) { fail("cannot read header item"); err++ ; } } qfits_header_destroy(qh); return err ; } int test_qfitsdata_load(char * filename) { qfitsloader ql ; int i ; int err ; float diff ; err=0 ; say("-----> Data loading test"); ql.filename = filename ; ql.xtnum = 0 ; ql.pnum = 0 ; ql.ptype = PTYPE_FLOAT ; ql.map = 1 ; say("Initializing loader"); if (qfitsloader_init(&ql)!=0) { fail("cannot initialize loader on test file"); return 1 ; } if (ql.lx != 11) { fail("wrong size in X"); err++ ; } if (ql.ly != 10) { fail("wrong size in Y"); err++ ; } say("Loading pixel buffer"); if (qfits_loadpix(&ql)!=0) { fail("cannot load data from test file"); return 1 ; } for (i=0 ; i<(11*10) ; i++) { diff = ql.fbuf[i] - (float)i * 0.2 ; if (diff>1e-4) { fail("diff in pix value"); err++ ; } } qfits_free(ql.fbuf); return err ; } int test_qfits_filecreate_ext(char * filename) { qfits_header* qh ; qfitsdumper qd ; FILE * out ; const char * sig ; say("-----> File with multiple extensions"); /* Create minimal FITS header for main */ say("Creating default header"); qh = qfits_header_default() ; if (qh==NULL) { fail("cannot create default header"); return 1 ; } qfits_header_add(qh, "BITPIX", "8", "no data in main section", NULL); qfits_header_add(qh, "NAXIS", "0", "no data in main section", NULL); qfits_header_add(qh, "EXTEND", "T", "Extensions are present", NULL); say("Dumping header to test file"); out = fopen(filename, "w"); if (out==NULL) { fail("cannot create test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Creating first extension with float pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 1"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "-32", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 1 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping float array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_FLOAT ; qd.out_ptype = -32 ; qd.fbuf = float_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); say("Creating second extension with int pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 1"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "32", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 2 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping int array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_INT ; qd.out_ptype = 32 ; qd.ibuf = int_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); say("Creating third extension with double pixels"); qh = qfits_header_new(); if (qh==NULL) { fail("cannot create extension header 3"); return 1 ; } qfits_header_append(qh, "XTENSION", "T", "Ext 1", NULL); qfits_header_append(qh, "BITPIX", "-64", "bpp", NULL); qfits_header_append(qh, "NAXIS", "2", "axes", NULL); qfits_header_append(qh, "NAXIS1", "6", "size in x", NULL); qfits_header_append(qh, "NAXIS2", "2", "size in y", NULL); qfits_header_append(qh, "END", NULL, NULL, NULL); say("Dumping ext header 3 to test file"); out = fopen(filename, "a"); if (out==NULL) { fail("cannot append to test file"); qfits_header_destroy(qh); return 1 ; } qfits_header_dump(qh, out); fclose(out); qfits_header_destroy(qh); say("Dumping double array"); qd.filename = filename ; qd.npix = 12 ; qd.ptype = PTYPE_DOUBLE ; qd.out_ptype = -64 ; qd.dbuf = double_array_orig ; if (qfits_pixdump(&qd)!=0) { fail("cannot save data to test file"); qfits_free(qd.fbuf); return 1 ; } /* Zero-pad the output file */ qfits_zeropad(filename); /* Get MD5 for the test file */ sig = qfits_datamd5(filename); if (strcmp(sig, REFSIG)) { fail("test file signature does not match"); return 1 ; } say("File DATAMD5 signature is Ok"); return 0 ; } int main(int argc, char * argv[]) { int err ; err=0 ; /* Test on simple FITS file */ err += test_qfits_header_sort(); err += test_qfits_filecreate(QFITSTEST1); err += test_qfitsheader_read(QFITSTEST1); err += test_qfitsheader_browse(QFITSTEST1); err += test_qfitsdata_load(QFITSTEST1); remove(QFITSTEST1); /* Test on FITS file with extensions */ err += test_qfits_filecreate_ext(QFITSTEST2); remove(QFITSTEST2); fprintf(stderr, "total error(s): %d\n", err); return err ; } astrometry.net-0.67/qfits-an/test/test_qfits.txt000644 000765 000024 00000002461 12651445460 022220 0ustar00dstnstaff000000 000000 qtest: -----> Header creation qtest: Creating blank header qtest: Destroying blank header qtest: Creating minimal header qtest: Inserting primary keywords qtest: Inserting history keywords qtest: Inserting comment keywords qtest: Inserting hierarch keywords qtest: Inserting mandatory keywords qtest: Opening file for output qtest: Dumping header to file qtest: Destroying built header qtest: -----> Dumping pixels qtest: -----> Header reading test qtest: Reading header from file qtest: Querying mandatory keys qtest: Querying base keys qtest: Checking key types qtest: Querying hierarch keys qtest: Removing keys qtest: Modifying keys qtest: -----> Header browsing test qtest: Reading header from file qtest: -----> Data loading test qtest: Initializing loader qtest: Loading pixel buffer qtest: -----> File with multiple extensions qtest: Creating default header qtest: Dumping header to test file qtest: Creating first extension with float pixels qtest: Dumping ext header 1 to test file qtest: Dumping float array qtest: Creating second extension with int pixels qtest: Dumping ext header 2 to test file qtest: Dumping int array qtest: Creating third extension with double pixels qtest: Dumping ext header 3 to test file qtest: Dumping double array qtest: File DATAMD5 signature is Ok astrometry.net-0.67/qfits-an/test/test_tfits.c000644 000765 000024 00000030251 12651445460 021624 0ustar00dstnstaff000000 000000 /* $Id: test_tfits.c,v 1.18 2006/04/27 13:08:43 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/04/27 13:08:43 $ * $Revision: 1.18 $ * $Name: qfits-6_2_0 $ */ /*--------------------------------------------------------------------------- Includes ---------------------------------------------------------------------------*/ #include #include #include #include #include "qfits_header.h" #include "qfits_table.h" #include "qfits_memory.h" /*--------------------------------------------------------------------------- Define ---------------------------------------------------------------------------*/ #define BIN_TABLE_NAME "/bintable.tfits" #define ASCII_TABLE_NAME "/asciitable.tfits" #define TMP_TABLE_NAME "tmp_table.tfits" /*--------------------------------------------------------------------------- Functions prototypes ---------------------------------------------------------------------------*/ static int qfits_test_table(char *, int) ; static void say(char * fmt, ...) ; static void fail(char * fmt, ...) ; /*--------------------------------------------------------------------------- Functions ---------------------------------------------------------------------------*/ /* Print out a comment */ static void say(char * fmt, ...) { va_list ap ; fprintf(stdout, "qtest:\t\t"); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); fprintf(stdout, "\n"); } /* Print out an error message */ static void fail(char * fmt, ...) { va_list ap ; fprintf(stderr, "qtest: error: "); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } /* Test a bin table : read it, write it, read it, and compare the 2 reads */ static int qfits_test_table( char * name, int extnum) { qfits_header * qh ; qfits_table * qt ; void ** one_column_table ; void * column_after_wr ; qfits_table * qt_tmp ; int nb_val ; int err ; double ddiff ; int idiff ; int i, j ; /* Initialize */ err = 0 ; /* Create a default primary header */ if ((qh = qfits_table_prim_header_default()) == NULL) { fail("cannot create a default primary header") ; err++ ; return err ; } printf("----- %s\n", name) ; /* Read the test table */ if ((qt = qfits_table_open(name, extnum)) == NULL) { fail("cannot load infos from the input table") ; qfits_header_destroy(qh) ; err++ ; return err ; } /* For each column */ for (i=0 ; inc ; i++) { say("Test the %dth column", i+1) ; /* Create the data array */ one_column_table = qfits_malloc(1*sizeof(void*)) ; /* Load the ith column data */ if ((one_column_table[0] = qfits_query_column_data(qt, i, NULL, NULL)) == NULL) { qfits_free(one_column_table) ; /* The 6th column is empty - normal if not loaded */ if ((i == 5) && (qt->tab_t == QFITS_BINTABLE)) { say("Column %d is empty", i+1) ; } else { err++ ; fail("cannot load the data from the %dth column", i+1) ; } continue ; } /* Create a tmp table object */ qt_tmp = qfits_table_new(TMP_TABLE_NAME, qt->tab_t, -1, 1, qt->nr) ; qfits_col_fill(qt_tmp->col, (&(qt->col)[i])->atom_nb, (&(qt->col)[i])->atom_dec_nb, (&(qt->col)[i])->atom_size, (&(qt->col)[i])->atom_type, (&(qt->col)[i])->tlabel, (&(qt->col)[i])->tunit, (&(qt->col)[i])->nullval, (&(qt->col)[i])->tdisp, 0, 0.0, 0, 1.0, 0) ; /* Write a one column table */ if (qfits_save_table_hdrdump((const void **)one_column_table, qt_tmp, qh) == -1) { fail("cannot save a table to file") ; qfits_free(one_column_table) ; qfits_table_close(qt_tmp) ; err++ ; continue ; } /* Destroy the tmp table object */ qfits_table_close(qt_tmp) ; /* Read the one column table */ if ((qt_tmp = qfits_table_open(TMP_TABLE_NAME, 1)) == NULL) { fail("cannot load infos from the generated table"); qfits_free(one_column_table) ; err++ ; continue ; } /* Load the column data */ if ((column_after_wr = qfits_query_column_data(qt_tmp, 0, NULL, NULL)) == NULL) { fail("cannot load the data from the generated table") ; qfits_free(one_column_table) ; qfits_table_close(qt_tmp) ; err++ ; continue ; } /* Destroy the tmp table object */ remove(qt_tmp->filename) ; qfits_table_close(qt_tmp) ; /* Test the diff between column_after_wr and one_column_table[0] */ switch ((&(qt->col)[i])->atom_type) { case TFITS_BIN_TYPE_A : case TFITS_BIN_TYPE_L : case TFITS_ASCII_TYPE_A : /* Set the number of values in the data array */ nb_val = qt->nr * (&(qt->col)[i])->atom_nb ; idiff = strncmp((char*)column_after_wr, (char*)one_column_table[0], nb_val) ; if (idiff == 0) say("Columns are identical...ok") ; else { fail("Columns are not the same") ; err++ ;} break ; case TFITS_BIN_TYPE_B : case TFITS_BIN_TYPE_X : /* Set the number of values in the data array */ nb_val = qt->nr * (&(qt->col)[i])->atom_nb ; idiff = 0 ; for (j=0 ; jnr * (&(qt->col)[i])->atom_nb ; ddiff = 0.0 ; for (j=0 ; jnr * (&(qt->col)[i])->atom_nb ; ddiff = 0.0 ; for (j=0 ; jnr * (&(qt->col)[i])->atom_nb ; idiff = 0 ; for (j=0 ; jnr * (&(qt->col)[i])->atom_nb ; idiff = 0 ; for (j=0 ; jnr ; ddiff = 0.0 ; for (j=0 ; jnr ; ddiff = 0.0 ; for (j=0 ; jnr ; idiff = 0 ; for (j=0 ; j #include #include #include #include #include "qfits_memory.h" /*--------------------------------------------------------------------------- Define ---------------------------------------------------------------------------*/ #define PTRS_TOT_NB 20000 #define PTRS_SIZE 10 #define PTRS_TMP_NB 5 #define ITERATIONS_NB 5000 /*--------------------------------------------------------------------------- Main ---------------------------------------------------------------------------*/ int main(void) { int * array[PTRS_TOT_NB] ; int * ptr[PTRS_TMP_NB] ; clock_t chrono ; double elapsed_time ; int i, j ; /* Start chrono */ chrono = clock() ; /* Allocate pointers */ printf("----- RAM allocation\n"); for (i=0 ; i #include #include #include #include #include #include "qfits_memory.h" /*--------------------------------------------------------------------------- Define ---------------------------------------------------------------------------*/ #define BIGNUM 100 /*--------------------------------------------------------------------------- Functions ---------------------------------------------------------------------------*/ /* Clocking variables and routines */ static clock_t chrono ; static void c_start(void) { chrono = clock(); } static void c_stop(void) { double elapsed = (double)(clock()-chrono) / (double)CLOCKS_PER_SEC ; printf("elapsed: %5.3f sec\n", elapsed); } /* * First stress test: allocate a large number of small memory blocks and * free them all in reverse order. */ void stress1(void) { int i ; int * ip[BIGNUM] ; for (i=0 ; i=0 ; i--) { qfits_free(ip[i]); } } void stress2(void) { int i ; int * ip[BIGNUM] ; for (i=0 ; ifilename map in this file; enables writing backreferences too .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO build-astrometry-index (1) .br For a tutorial, see http://astrometry.net/doc/build-index.html astrometry.net-0.67/man/image2xy.1000644 000765 000024 00000004162 12651445460 017153 0ustar00dstnstaff000000 000000 .TH IMAGE2XY "1" "July 2015" "0.56" "astrometry.net" .SH NAME image2xy \- Source extractor. .SH SYNOPSIS .B image2xy [options] \fIfitsname.fits\fR .SH DESCRIPTION Read a FITS file, find objects, and write out X, Y, FLUX to fitsname.xy.fits. .SH OPTIONS .TP \fB\-e\fR \fIextension\fR Read from a single FITS extension .TP \fB\-O\fR Overwrite existing output file. .TP \fB\-o\fR \fIfile\fR Write XYlist to given filename. .TP \fB\-L\fR \fIorder\fR Lanczos order .TP \fB\-8\fR Don't use optimization for byte (u8) images. .TP \fB\-H\fR Downsample by a factor of 2 before running simplexy. .TP \fB\-d\fR \fIfactor\fR Downsample by an integer factor before running simplexy. .TP \fB\-D\fR \fIfactor\fR Downsample, if necessary, by this many factors of two. .TP \fB\-s\fR \fIscale\fR\fR Set median\-filter box size (default 100 pixels) .TP \fB\-w\fR \fIwidth\fR Set Gaussian PSF sigma (default 1 pixel) .TP \fB\-g\fR \fIsigma\fR Set image noise level .TP \fB\-p\fR \fIsignificance\fR Set significance level of peaks in sigmas (default 8 sigmas) .TP \fB\-a\fR \fIsaddle\fR Set "saddle" level joining peaks i sigmas (default 5 sigmas) .TP \fB\-P\fR \fIplane\fR Pull out a single plane of a multi-color image (default: first plane) .TP \fB\-b\fR Don't do (median-based) background subtraction .TP \fB\-G\fR \fIbackground\fR Subtract this 'global' background value; implies \fB\-b\fR .TP \fB\-m\fR Set maximum extended object size for deblending (default 2000 pixels) .TP \fB\-S\fR \fIfile\fR Save background\-subtracted image to this filename (FITS float image) .TP \fB\-B\fR \fIfile\fR Save background image to filename .TP \fB\-U\fR \fIfile\fR Save smoothed background\-subtracted image to filename .TP \fB\-M\fR \fIfile\fR Save mask image to filename .TP \fB\-C\fR \fIfile\fR Save connected\-components image to filename .TP \fB\-v\fR Verbose. repeat for more and more verboseness .TP image2xy 'file.fits[1]' Process first extension. .TP image2xy 'file.fits[2]' Process second extension .TP image2xy file.fits+2 Same as above .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/new-wcs.1000644 000765 000024 00000001142 12651445460 017004 0ustar00dstnstaff000000 000000 .TH NEW-WCS "1" "July 2015" "0.56" "astrometry.net" .SH NAME new-wcs \- Merge a WCS solution with existing FITS header cards .SH SYNOPSIS .B new\-wcs \fB\-i\fR \fIinput-file\fR .SH DESCRIPTION Merge a WCS solution with existing FITS header cards. This can be used to create a new image file containing the WCS headers. .SH OPTIONS .TP \fB\-w\fR \fIfile\fR WCS file .TP \fB\-o\fR \fIfile\fR Output file .TP \fB\-d\fR Also copy the data segment .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/pad-file.1000644 000765 000024 00000001045 12651445460 017104 0ustar00dstnstaff000000 000000 .TH PAD-FILE "1" "July 2015" "0.56" "astrometry.net" .SH NAME pad-file \- Pad a FITS file out to the correct size .SH SYNOPSIS .B pad-file \fIdesired-length input-file\fR [\fIinput-file\fR ...] .SH DESCRIPTION The file will be padded in\-place. By default, the file is padded with zeros. .SH OPTIONS .TP \fB\-v\fR \fIn\fR Numerical value of character to pad with .TP \fB\-c\fR \fIc\fR Character to pad with .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/plot-constellations.1000644 000765 000024 00000003506 12651445460 021444 0ustar00dstnstaff000000 000000 .TH PLOT-CONSTELLATIONS "1" "July 2015" "0.56" "astrometry.net" .SH NAME plot-constellations \- Annotates images with constellations etc. .SH SYNOPSIS plot-constellations \fB\-w\fR \fIfile\fR | \fB\-L\fR | \fB\-o\fR \fIfile\fR .SH DESCRIPTION Annotates images with constellations, bright stars, Messier/NGC objects, Henry Draper catalog stars, etc. .SH OPTIONS .TP \fB\-w\fR \fIfile\fR WCS input file .TP \fB\-L\fR just list the items in the field .TP \fB\-o\fR \fIfile\fR image output file; "\-" for stdout .TP .TP \fB\-p\fR write PPM output \- default is PNG ([\fB\-i\fR \fIPPM input file\fR] OR [\fB\-W\fR \fIwidth\fR \fB\-H\fR \fIheight\fR] ) .TP \fB\-s\fR \fIscale\fR scale image coordinates by this value before plotting. .TP \fB\-N\fR plot NGC objects .TP \fB\-F\fR \fIfraction\fR minimum NGC size, relative to image size (default 0.02) .TP \fB\-C\fR plot constellations .TP \fB\-B\fR plot named bright stars .TP \fB\-D\fR plot HD objects .TP \fB\-d\fR path to HD catalog .TP \fB\-b\fR \fIN\fR just plot the \fIN\fR brightest stars .TP \fB\-c\fR only plot bright stars that have common names. .TP \fB\-j\fR if a bright star has a common name, only print that .TP \fB\-v\fR be verbose .TP \fB\-n\fR \fIwidth\fR NGC circle width (default 2) .TP \fB\-f\fR \fIsize\fR font size. .TP \fB\-M\fR show only NGC/IC and Messier numbers (no common names) .TP \fB\-G\fR \fIspacing\fR Plot RA,Dec grid with specified grid spacing in arcmin. .TP \fB\-g\fR \fIr\fR:\fIg\fR:\fIb\fR grid color (default 0.2:0.2:0.2) .TP \fB\-J\fR print JSON output to stderr .TP \fB\-V\fR vertical alignment of text labels, "C"enter/"T"op/"B"ottom: default C .TP \fB\-O\fR horizontal alignment of text labels, "L"eft/"C"enter/"R"ight, default L .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/plotquad.1000644 000765 000024 00000002400 12651445460 017250 0ustar00dstnstaff000000 000000 .TH PLOTQUAD "1" "July 2015" "0.56" "astrometry.net" .SH NAME plotquad \- Draws polygons over images. .SH SYNOPSIS .B plotquad [\fI\,options\/\fR] \fIquads\fR > output.png\/\fR .SH OPTIONS .TP \fB\-I\fR \fIfile\fR Input image (PPM format) to plot over. .TP \fB\-p\fR Input image is PNG format, not PPM. .TP \fB\-P\fR Write PPM output instead of PNG. .TP \fB\-C\fR \fIcolor\fR Color to plot in (default: white): darkred, red, darkgreen, green, blue, verydarkblue, white, black, cyan, magenta, yellow, brightred, skyblue, orange, gray, darkgray .TP \fB\-b\fR \fIcolor\fR Draw in \fIcolor\fR behind each line. .TP \fB\-c\fR Also plot a circle at each vertex. .TP \fB\-W\fR \fIwidth\fR Width of output image. .TP \fB\-H\fR \fIheight\fR Height of output image. .TP \fB\-w\fR \fIwidth\fR Width of lines to draw (default: 5). .TP \fB\-R\fR Read quads from stdin. .TP \fB\-o\fR \fIopacity\fR Opacity. .TP \fB\-d\fR \fIdim\fR Dimension of "quad". .TP \fB\-s\fR \fIscale\fR Scale quad coordinates before plotting. .TP \fB\-m\fR \fIfile\fR Get quad from match file. OR \fIx1\fR \fIy1\fR \fIx2\fR \fIy2\fR \fIx3\fR \fIy3\fR \fIx4\fR \fIy4\fR [...] .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/plotxy.1000644 000765 000024 00000003417 12651445460 016767 0ustar00dstnstaff000000 000000 .TH PLOTXY "1" "July 2015" "0.56" "astrometry.net" .SH NAME plotxy \- plots circles, crosses, etc over images. .SH SYNOPSIS .B plotxy [options] .SH OPTIONS .TP \fB\-i\fR \fIfile\fR Input file (xylist) .TP \fB\-o\fR \fIfile\fR Output file (default: stdout) .TP \fB\-I\fR \fIimage\fR Input image on which plotting will occur; PPM format. .TP \fB\-p\fR Input image is PNG format, not PPM. .TP \fB\-P\fR Write PPM output instead of PNG. .TP \fB\-J\fR Write PDF output. .TP \fB\-W\fR \fIwidth\fR Width of output image (default: data\-dependent). .TP \fB\-H\fR \fIheight\fR Height of output image (default: data\-dependent). .TP \fB\-x\fR \fIoffset\fR X offset: position of the bottom\-left pixel (default: 1). .TP \fB\-y\fR \fIoffset\fR Y offset: position of the bottom\-left pixel (default: 1). .TP \fB\-X\fR \fIname\fR X column: name of the FITS column. .TP \fB\-Y\fR \fIname\fR Y column: name of the FITS column. .TP \fB\-n\fR \fIobj\fR First object to plot (default: 0). .TP \fB\-N\fR \fInum\fR Number of objects to plot (default: all). .TP \fB\-r\fR \fIradius\fR Size of markers to plot (default: 5.0). .TP \fB\-w\fR \fIwidth\fR Linewidth (default: 1.0). .TP \fB\-s\fR \fIshape\fR Shape of markers (default: circle): circle, crosshair, square, diamond, X, Xcrosshair .TP \fB\-C\fR \fIcolor\fR Color to plot in (default: white): darkred, red, darkgreen, green, blue, verydarkblue, white, black, cyan, magenta, yellow, brightred, skyblue, orange, gray, darkgray .TP \fB\-b\fR \fIcolor\fR Draw in \fIcolor\fR behind each marker. .TP \fB\-S\fR \fIfactor\fR Scale xylist entries by this value before plotting. .TP \fB\-e\fR \fIext\fR FITS extension to read (default 0). .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/query-starkd.1000644 000765 000024 00000001241 12651445460 020054 0ustar00dstnstaff000000 000000 .TH QUERY-STARKD "1" "July 2015" "0.56" "astrometry.net" .SH NAME query-starkd \- Search index files for stars near a given point on the sky .SH SYNOPSIS .B query-starkd [options] \fIstar-kdtree-file\fR .SH OPTIONS .TP \fB\-o\fR \fIfile\fR Write RA-DEC-list FITS table (default: print ASCII to stdout) .TP \fB-r\fR \fIra\fR RA (deg) .TP \fB\-d\fR \fIdec\fR DEC (deg) .TP \fB\-R\fR \fIradius\fR Radius (deg) .TP \fB\-t\fR \fIcol\fR Tag along column .TP \fB\-T\fR Tag along all .TP \fB\-I\fR Print indices too .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/solve-field.1000644 000765 000024 00000024553 12651445460 017645 0ustar00dstnstaff000000 000000 .TH SOLVE-FIELD "1" "July 2015" "0.56" "astrometry.net" .SH NAME solve-field \- Main high-level command-line user interface. .SH SYNOPSIS .B solve-field [options] [\fIimage-file-1\fR \fIimage-file-2\fR ...] [\fIxyls-file-1\fR \fIxyls-file-2\fR ...] .SH DESCRIPTION Main high-level command-line user interface for astrometry.net .PP You can specify http:// or ftp:// URLs instead of filenames. The "wget" or "curl" program will be used to retrieve the URL. .PP The astrometry engine will take any image and return the astrometry world coordinate system (WCS), ie a standards-based description of the (usually nonlinear) transformation between image coordinates and sky coordinates with absolutely no “false positives” (but maybe some “no answers”). It will do its best, even when the input image has no or totally incorrect meta data. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR Print the help message .TP \fB\-v\fR, \fB\-\-verbose\fR Be more chatty. Repeat for even more verboseness .TP \fB\-D\fR, \fB\-\-dir\fR \fIdirectory\fR Place all output files in the specified directory .TP \fB\-o\fR, \fB\-\-out\fR \fIfile\fR Name the output files with this base name .TP \fB\-b\fR, \fB\-\-backend-config\fR \fIfile\fR Use this config file for the "astrometry-engine" program .TP \fB\-\-config\fR \fIfile\fR Use this config file for the "astrometry-engine" program .TP \fB\-\-batch\fR Run astrometry-engine once, rather than once per input file .TP \fB\-f\fR, \fB\-\-files-on-stdin\fR Read filenames to solve on stdin, one per line .TP \fB\-p\fR, \fB\-\-no\-plots\fR Don't create any plots of the results .TP \fB\-\-plot\-scale\fR \fIscale\fR Scale the plots by this factor (eg, 0.25) .TP \fB\-\-plot\-bg\fR \fIfile\fR Set the background image to use for plots (JPEG) .TP \fB\-G\fR, \fB\-\-use\-wget\fR Use wget instead of curl .TP \fB\-O\fR, \fB\-\-overwrite\fR Overwrite output files if they already exist .TP \fB\-K\fR, \fB\-\-continue\fR Don't overwrite output files if they already exist; continue a previous run .TP \fB\-J\fR, \fB\-\-skip-solved\fR Skip input files for which the 'solved' output file already exists; NOTE: this assumes single-field input files .TP \fB\-\-fits\-image\fR assume the input files are FITS images .TP \fB\-N\fR, \fB\-\-new-fits\fR \fIfile\fR Output filename of the new FITS file containing the WCS header; "none" to not create this file .TP \fB\-Z\fR, \fB\-\-kmz\fR \fIfile\fR Create KMZ file for Google Sky. (requires wcs2kml) .TP \fB\-i\fR, \fB\-\-scamp\fR \fIfile\fR Create image object catalog for SCAMP .TP \fB\-n\fR, \fB\-\-scamp-config\fR \fIfile\fR Create SCAMP config file snippet .TP \fB\-U\fR, \fB\-\-index-xyls\fR \fIfile\fR Output filename for xylist containing the image coordinate of stars from the index .TP \fB\-\-just-augment\fR Just write the augmented xylist files; don't run astrometry-engine. .TP \fB\-\-axy\fR \fIfile\fR Output filename for augment xy list (axy) .TP \fB\-\-temp\-axy\fR Write 'augmented xy list' (axy) file to a temp file .TP \fB\-\-timestamp\fR Add timestamps to log messages .TP \fB\-7\fR, \fB\-\-no-delete-temp\fR Don't delete temp files (for debugging) .TP \fB\-L\fR, \fB\-\-scale-low\fR \fIscale\fR Lower bound of image scale estimate .TP \fB\-H\fR, \fB\-\-scale-high\fR \fIscale\fR Upper bound of image scale estimate .TP \fB\-u\fR, \fB\-\-scale-units\fR \fIunits\fR In what units are the lower and upper bounds? Choices: .RS .TP "degwidth", "degw", "dw" width of the image, in degrees (default) .TP "arcminwidth", "amw", "aw" width of the image, in arcminutes .TP "arcsecperpix", "app" arcseconds per pixel .TP "focalmm" 35\-mm (width-based) equivalent focal length .RE .TP \fB\-8\fR, \fB\-\-parity\fR \fIpos\fR/\fIneg\fR Only check for matches with positive/negative parity (default: try both) .TP \fB\-c\fR, \fB\-\-code\-tolerance\fR \fIdistance\fR Matching distance for quads (default: 0.01) .TP \fB\-E\fR, \fB\-\-pixel\-error\fR \fIpixels\fR For verification, size of pixel positional error (default: 1) .TP \fB\-q\fR, \fB\-\-quad\-size\-min\fR \fIfraction\fR Minimum size of quads to try, as a fraction of the smaller image dimension, default: 0.1 .TP \fB\-Q\fR, \fB\-\-quad\-size\-max\fR \fIfraction\fR Maximum size of quads to try, as a fraction of the image hypotenuse, default 1.0 .TP \fB\-\-odds\-to\-tune\-up\fR \fIodds\fR Odds ratio at which to try tuning up a match that isn't good enough to solve (default: 1e6) .TP \fB\-\-odds\-to\-solve\fR \fIodds\fR Odds ratio at which to consider a field solved (default: 1e9) .TP \fB\-\-odds\-to\-reject\fR \fIodds\fR Odds ratio at which to reject a hypothesis (default: 1e\-100) .TP \fB\-\-odds\-to\-stop\-looking\fR \fIodds\fR Odds ratio at which to stop adding stars when evaluating a hypothesis (default: HUGE_VAL) .TP \fB\-\-use\-sextractor\fR Use SExtractor rather than built\-in image2xy to find sources .TP \fB\-\-sextractor\-config\fR \fIfile\fR Use the given SExtractor config file. Note that CATALOG_NAME and CATALOG_TYPE values will be over\-ridden by command\-line values. This option implies \fB\-\-use\-sextractor\fR. .TP \fB\-\-sextractor\-path\fR \fIfile\fR Use the given path to the SExtractor executable. Default: just 'sextractor', assumed to be in your PATH. Note that you can give command line args here too (but put them in quotes), eg: .IP \fB\-\-sextractor\-path\fR 'sextractor -DETECT_TYPE CCD'. .IP This option implies \fB\-\-use\-sextractor\fR. .TP \fB\-3\fR \fIRA\fR, \fB\-\-ra\fR \fIRA\fR RA of field center for search, format: degrees or hh:mm:ss .TP \fB\-4\fR \fIDEC\fR, \fB\-\-dec\fR \fIDEC\fR DEC of field center for search, format: degrees or hh:mm:ss .TP \fB\-5\fR \fIdegrees\fR, \fB\-\-radius\fR \fIdegrees\fR Only search in indexes within 'radius' of the field center given by \fB\-\-ra\fR and \fB\-\-dec\fR .TP \fB\-d\fR, \fB\-\-depth\fR \fInumber\fR or \fIrange\fR Number of field objects to look at, or range of numbers; 1 is the brightest star, so "\-d 10" or "\-d 1\-10" mean look at the top ten brightest stars only. .TP \fB\-\-objs\fR \fIint\fR Cut the source list to have this many items (after sorting, if applicable). .TP \fB\-l\fR, \fB\-\-cpulimit\fR \fIseconds\fR Give up solving after the specified number of seconds of CPU time .TP \fB\-r\fR, \fB\-\-resort\fR Sort the star brightnesses by background\-subtracted flux; the default is to sort using acompromise between background\-subtracted and non\-background\-subtracted flux .TP \fB\-6\fR, \fB\-\-extension\fR \fIint\fR FITS extension to read image from. .TP \fB\-2\fR, \fB\-\-no\-fits2fits\fR Don't sanitize FITS files; assume they're already valid .TP \fB\-\-invert\fR Invert the image (for black\-on\-white images) .TP \fB\-z\fR, \fB\-\-downsample\fR \fIint\fR Downsample the image by factor \fIint\fR before running source extraction .TP \fB\-\-no\-background\-subtraction\fR Don't try to estimate a smoothly\-varying sky background during source extraction. .TP \fB\-\-sigma\fR \fIfloat\fR Set the noise level in the image .TP \fB\-9\fR, \fB\-\-no\-remove\-lines\fR Don't remove horizontal and vertical overdensities of sources. .TP \fB\-\-uniformize\fR \fIint\fR Select sources uniformly using roughly this many boxes (0=disable; default 10) .TP \fB\-\-no\-verify\-uniformize\fR Don't uniformize the field stars during verification .TP \fB\-\-no\-verify\-dedup\fR Don't deduplicate the field stars during verification .TP \fB\-0\fR, \fB\-\-no\-fix\-sdss\fR Don't try to fix SDSS idR files. .TP \fB\-C\fR, \fB\-\-cancel\fR \fIfile\fR Filename whose creation signals the process to stop .TP \fB\-S\fR, \fB\-\-solved\fR \fIfile\fR Output file to mark that the solver succeeded .TP \fB\-I\fR, \fB\-\-solved\-in\fR \fIfile\fR Input filename for solved file .TP \fB\-M\fR, \fB\-\-match\fR \fIfile\fR Output filename for match file .TP \fB\-R\fR, \fB\-\-rdls\fR \fIfile\fR Output filename for RDLS file .TP \fB\-\-sort\-rdls\fR \fIcolumn\fR Sort the RDLS file by this column; default is ascending; use "\-column" to sort "column" in descending order instead. .TP \fB\-\-tag\fR \fIcolumn\fR Grab tag\-along column from index into RDLS file .TP \fB\-\-tag\-all\fR Grab all tag\-along columns from index into RDLS file .TP \fB\-j\fR, \fB\-\-scamp\-ref\fR \fIfile\fR Output filename for SCAMP reference catalog .TP \fB\-B\fR, \fB\-\-corr\fR \fIfile\fR Output filename for correspondences .TP \fB\-W\fR, \fB\-\-wcs\fR \fIfile\fR Output filename for WCS file .TP \fB\-P\fR, \fB\-\-pnm\fR \fIfile\fR Save the PNM file as \fIfile\fR .TP \fB\-k\fR, \fB\-\-keep\-xylist\fR \fIfile\fR Save the (unaugmented) xylist to \fIfile\fR .TP \fB\-A\fR, \fB\-\-dont\-augment\fR Quit after writing the unaugmented xylist .TP \fB\-V\fR, \fB\-\-verify\fR \fIfile\fR Try to verify an existing WCS file .TP \fB\-\-verify\-ext\fR \fIextension\fR HDU from which to read WCS to verify; set this BEFORE \fB\-\-verify\fR .TP \fB\-y\fR, \fB\-\-no\-verify\fR Ignore existing WCS headers in FITS input images .TP \fB\-g\fR, \fB\-\-guess\-scale\fR Try to guess the image scale from the FITS headers .TP \fB\-\-crpix\-center\fR Set the WCS reference point to the image center .TP \fB\-\-crpix\-x\fR \fIpix\fR Set the WCS reference point to the given position .TP \fB\-\-crpix\-y\fR \fIpix\fR Set the WCS reference point to the given position .TP \fB\-T\fR, \fB\-\-no\-tweak\fR Don't fine\-tune WCS by computing a SIP polynomial .TP \fB\-t\fR, \fB\-\-tweak\-order\fR \fIint\fR Polynomial order of SIP WCS corrections .TP \fB\-m\fR, \fB\-\-temp\-dir\fR \fIdir\fR Where to put temp files, default \fI\,/tmp\/\fP .SS "The following options are valid for xylist inputs only:" .TP \fB\-F\fR, \fB\-\-fields\fR \fInumber or range\fR The FITS extension(s) to solve, inclusive .TP \fB\-w\fR, \fB\-\-width\fR \fIpixels\fR Specify the field width .TP \fB\-e\fR, \fB\-\-height\fR \fIpixels\fR Specify the field height .TP \fB\-X\fR, \fB\-\-x\-column\fR \fIcolumn\-name\fR The FITS column containing the X coordinate of the sources .TP \fB\-Y\fR, \fB\-\-y\-column\fR \fIcolumn\-name\fR The FITS column containing the Y coordinate of the sources .TP \fB\-s\fR, \fB\-\-sort\-column\fR \fIcolumn\-name\fR The FITS column that should be used to sort the sources .TP \fB\-a\fR, \fB\-\-sort\-ascending\fR Sort in ascending order (smallest first); default is descending order .PP Note that most output files can be disabled by setting the filename to "none". (If you have a sick sense of humour and you really want to name your output file "none", you can use "./none" instead.) .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/subtable.1000644 000765 000024 00000001032 12651445460 017220 0ustar00dstnstaff000000 000000 .TH SUBTABLE "1" "July 2015" "0.56" "astrometry.net" .SH NAME subtable \- Pull out a set of columns from a many-column FITS binary table. .SH SYNOPSIS .B subtable \fB\-i\fR \fIinput-file\fR \fB\-o\fR \fIoutput-file\fR \fB\-c\fR \fIcol-name\fR [\fB\-c\fR \fIcol-name\fR ...] .SH OPTIONS .TP \fB\-i\fR \fIfile\fR Input file .TP \fB\-o\fR \fIfile\fR Output file .TP \fB\-c\fR \fIname\fR Column name .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/tabsort.1000644 000765 000024 00000000655 12651445460 017107 0ustar00dstnstaff000000 000000 .TH TABSORT "1" "July 2015" "0.56" "astrometry.net" .SH NAME tabsort \- Sort a FITS binary table based on values in one column. .SH SYNOPSIS .B tabsort [options] \fIcolumn-name\fR \fIinput-file\fR \fIoutput-file\fR .SH OPTIONS .TP \fB\-d\fR Sort in descending order (default: ascending) .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-grab.1000644 000765 000024 00000000512 12651445460 017126 0ustar00dstnstaff000000 000000 .TH WCS-GRAB "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-grab \- Try to interpret an existing WCS header. .SH SYNOPSIS .B wcs-grab \fIinput-filename extension output-filename\fR .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-match.1000644 000765 000024 00000000665 12651445460 017320 0ustar00dstnstaff000000 000000 .TH WCS-MATCH "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-match \- Prints x and y coordinates of invariant point .SH SYNOPSIS .B wcs-match .SH DESCRIPTION .TP \fB\-1\fR \fIfile\fR WCS first input file .TP \fB\-2\fR \fIfile\fR WCS second input file .TP \fB\-h\fR .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-pv2sip.1000644 000765 000024 00000002210 12651445460 017433 0ustar00dstnstaff000000 000000 .TH WCS-PV2SIP "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-pv2sip \- Convert TPV WCS headers to SIP distortion headers .SH SYNOPSIS .B wcs-pv2sip [options] \fIinput-wcs\fR \fIoutput-wcs\fR .SH OPTIONS .TP \fB\-o\fR \fIorder\fR SIP polynomial order to fit (default: 5) .TP \fB\-e\fR \fIext\fR FITS HDU number to read WCS from (default 0 = primary) .TP \fB\-S\fR Do NOT do the wcs_shift thing .TP \fB\-s\fR Treat input as Scamp .head file .TP \fB\-t\fR Override the CTYPE* cards in the WCS header, and assume they are TAN. .TP \fB\-v\fR +verboseness .TP \fB\-W\fR \fIint\fR Set the IMAGEW in the output file .TP \fB\-H\fR \fIint\fR Set the IMAGEH in the output file .TP \fB\-x\fR \fInum\fR x-low (default: 1) .TP \fB\-y\fR \fInum\fR y-low (default: 1) .TP \fB\-X\fR \fInum\fR x-high (default: image width) .TP \fB\-Y\fR \fInum\fR y-high (default: image width) .TP \fB\-a\fR \fIsize\fR Set the pixel values used to compute the distortion polynomials with (default: closest to 100 yielding whole number of steps) .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-rd2xy.1000644 000765 000024 00000001674 12651445460 017275 0ustar00dstnstaff000000 000000 .TH WCS-RD2XY "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-rd2xy \- Convert lists of pixel from (RA,Dec) to (x,y) positions. .SH SYNOPSIS .B wcs-rd2xy [options] \fB\-w\fR \fIfile\fR .SH OPTIONS .TP \fB\-w\fR \fIfile\fR WCS input file .TP \fB\-e\fR \fIextension\fR FITS HDU number to read WCS from (default 0 = primary) .TP \fB\-i\fR \fIfile\fR rdls input file .TP \fB\-o\fR \fIfile\fR xyls output file .TP \fB\-f\fR \fIindex\fR rdls field index (default: all) .TP \fB\-R\fR \fIname\fR RA column name .TP \fB\-D\fR \fIname\fR DEC column name .TP \fB\-t\fR Just use TAN projection, even if SIP extension exists .TP \fB\-L\fR Force using WCSlib rather than Astrometry.net routines .TP \fB\-r\fR \fIra\fR \fB\-d\fR \fIra\fR Specify a single point (in deg) to convert (printed to stdout) .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-resample.1000644 000765 000024 00000001423 12651445460 020025 0ustar00dstnstaff000000 000000 .TH WCS-RESAMPLE "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-resample \- Project one FITS image onto another image. .SH SYNOPSIS .B wcs-resample [options] \fIinput-FITS\fR \fIoutput-WCS\fR \fIoutput-FITS\fR .SH OPTIONS .TP \fB\-E\fR \fIextension\fR Input image FITS extension (default: 0) .TP \fB\-w\fR \fIfile\fR Input WCS file (default is to read WCS from input FITS image) .TP \fB\-e\fR \fIfile\fR Input WCS FITS extension (default: 0) .TP \fB\-x\fR \fIextension\fR Output WCS FITS extension (default: 0) .TP \fB\-L\fR \fIorder\fR Lanczos order (default: nearest-neighbor resampling) .TP \fB\-z\fR Zero out inf/nan input image value .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-to-tan.1000644 000765 000024 00000001272 12651445460 017421 0ustar00dstnstaff000000 000000 .TH WCS-TO-TAN "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-to-tan \- Undocumented program of astromatic.net .SH SYNOPSIS .B wcs-to-tan .SH DESCRIPTION .TP \fB\-w\fR \fIfile\fR WCS input file .TP \fB\-o\fR \fIfile\fR WCS output file .TP \fB\-e \fIextension\fR FITS HDU number to read WCS from (default 0 = primary) .TP \fB\-t\fR Just use TAN projection, even if SIP extension exists. .TP \fB\-L\fR force WCSlib .TP \fB\-x\fR \fIx-lo\fR \fB\-y\fR \fIy-lo\fR \fB\-W\fR \fIx-hi\fR \fB\-H\fR \fIy-hi\fR .TP \fB\-N\fR \fIgrid-n\fR .TP \fB\-v\fR Verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcs-xy2rd.1000644 000765 000024 00000001714 12651445460 017270 0ustar00dstnstaff000000 000000 .TH WCS-XY2RD "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcs-xy2rd \- Convert lists of pixel from (x,y) to (RA,Dec) positions. .SH SYNOPSIS .B wcs-xy2rd [options] \fB\-w\fR \fIfile\fR .SH OPTIONS .TP \fB\-w\fR \fIfile\fR WCS input file .TP \fB\-e\fR \fIextension\fR FITS HDU number to read WCS from (default 0 = primary) .TP \fB\-x \fIpixel\fR \fB\-y \fIpixel\fR Specify a single point to convert (result is printed to stdout) .TP \fB\-t\fR just use TAN projection, even if SIP extension exists. .TP \fB\-L\fR force WCSlib .TP \fB\-T\fR force WCStools .TP \fB\-s\fR print sexigesimal too .TP \fB\-i\fR \fIfile\fR xyls input file .TP \fB\-o\fR \fIfile\fR rdls output file .TP \fB\-f \fIindex\fR xyls field index (default: all) .TP \fB\-X \fIname\fR X-column-name .TP \fB\-Y\fR \fIname\fR Y-column-name .TP \fB\-v\fR +verbose .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/man/wcsinfo.1000644 000765 000024 00000000766 12651445460 017104 0ustar00dstnstaff000000 000000 .TH WCSINFO "1" "July 2015" "0.56" "astrometry.net" .SH NAME wcsinfo \- print simple properties of WCS headers (scale, rotation, etc) .SH SYNOPSIS .B wcsinfo [options] \fIwcs-file\fR .SH OPTIONS .TP \fB\-e\fR \fIextension\fR Read from given HDU (default 0 = primary) .TP \fB\-W\fR \fIwidth\fR Set/override IMAGEW .TP \fB\-H\fR \fIheight\fR Set/override IMAGEH .SH AUTHOR The Astrometry.net team. Principal investigators are David W. Hogg (NYU) and Dustin Lang (CMU). .SH SEE ALSO http://astrometry.net astrometry.net-0.67/libkd/__init__.py000644 000765 000024 00000000000 12651445460 017752 0ustar00dstnstaff000000 000000 astrometry.net-0.67/libkd/an-fls.h000644 000765 000024 00000004740 12651445460 017211 0ustar00dstnstaff000000 000000 /** This file includes code copied from three source files in the Linux kernel v 2.6.23.1: - include/asm-generic/bitops/fls.h - include/asm-i386/bitops.h - include/asm-x86_64/bitops.h The second and third files contain this notice: * Copyright 1992, Linus Torvalds. And of course the kernel is distributed under the terms of the GPL v2. */ #ifndef AN_FLS_H #define AN_FLS_H #include #include /** * fls - find last (most-significant) bit set * * @x: the word to search * * This is defined the same way as ffs. * * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. */ static inline int an_fls(int x); /** * flsB() = fls() - 1. * * Note that x MUST be > 0. */ static inline uint8_t an_flsB(uint32_t x); /**** Below this line are the implementations for different CPUs. ****/ #if AN_I386 static inline int an_fls(int x) { int r; __asm__("bsrl %1,%0\n\t" "jnz 1f\n\t" "movl $-1,%0\n" "1:" : "=r" (r) : "rm" (x)); return r+1; } static inline uint8_t an_flsB(uint32_t x) { int r; assert(x); __asm__("bsrl %1,%0\n\t" "jnz 1f\n\t" "movl $-1,%0\n" "1:" : "=r" (r) : "rm" (x)); return r; } #elif AN_X86_64 static __inline__ int an_fls(int x) { int r; __asm__("bsrl %1,%0\n\t" "cmovzl %2,%0" : "=&r" (r) : "rm" (x), "rm" (-1)); return r+1; } static inline uint8_t an_flsB(uint32_t x) { int r; assert(x); __asm__("bsrl %1,%0\n\t" "cmovzl %2,%0" : "=&r" (r) : "rm" (x), "rm" (-1)); return r; } #else static inline int an_fls(int x) { int r = 32; if (!x) return 0; if (!(x & 0xffff0000u)) { x <<= 16; r -= 16; } if (!(x & 0xff000000u)) { x <<= 8; r -= 8; } if (!(x & 0xf0000000u)) { x <<= 4; r -= 4; } if (!(x & 0xc0000000u)) { x <<= 2; r -= 2; } if (!(x & 0x80000000u)) { x <<= 1; r -= 1; } return r; } static inline uint8_t an_flsB(uint32_t x) { int r = 31; assert(x); if (!(x & 0xffff0000u)) { x <<= 16; r -= 16; } if (!(x & 0xff000000u)) { x <<= 8; r -= 8; } if (!(x & 0xf0000000u)) { x <<= 4; r -= 4; } if (!(x & 0xc0000000u)) { x <<= 2; r -= 2; } if (!(x & 0x80000000u)) { x <<= 1; r -= 1; } return r; } #endif #endif astrometry.net-0.67/libkd/AUTHORS000644 000765 000024 00000000030 12651445460 016714 0ustar00dstnstaff000000 000000 Dustin Lang Keir Mierle astrometry.net-0.67/libkd/checktree.c000644 000765 000024 00000006320 12651445460 017755 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "kdtree.h" #include "kdtree_fits_io.h" void printHelp(char* progname) { printf("\nUsage: %s\n" " [-d]: print data\n" " [-n]: also print data in its native format (as stored in the kdtree file).\n" " \n" "\n", progname); } const char* OPTIONS = "hdn"; int main(int argc, char** args) { int argchar; char* progname = args[0]; kdtree_t* kd; char* fn; int printData = 0; int treeData = 0; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'h': printHelp(progname); exit(-1); case 'd': printData = 1; break; case 'n': treeData = 1; break; } if (argc - optind == 1) { fn = args[optind]; optind++; } else { printHelp(progname); exit(-1); } printf("Reading kdtree from file %s ...\n", fn); kd = kdtree_fits_read(fn, NULL, NULL); printf("Tree name: \"%s\"\n", kd->name); printf("Treetype: 0x%x\n", kd->treetype); printf("Data type: %s\n", kdtree_kdtype_to_string(kdtree_datatype(kd))); printf("Tree type: %s\n", kdtree_kdtype_to_string(kdtree_treetype(kd))); printf("External type: %s\n", kdtree_kdtype_to_string(kdtree_exttype(kd))); printf("N data points: %i\n", kd->ndata); printf("Dimensions: %i\n", kd->ndim); printf("Nodes: %i\n", kd->nnodes); printf("Leaf nodes: %i\n", kd->nbottom); printf("Non-leaf nodes: %i\n", kd->ninterior); printf("Tree levels: %i\n", kd->nlevels); printf("LR array: %s\n", (kd->lr ? "yes" : "no")); printf("Perm array: %s\n", (kd->perm ? "yes" : "no")); printf("Bounding box: %s\n", (kd->bb.any ? "yes" : "no")); printf("Split plane: %s\n", (kd->split.any ? "yes" : "no")); printf("Split dim: %s\n", (kd->splitdim ? "yes" : "no")); printf("Data: %s\n", (kd->data.any ? "yes" : "no")); if (kd->minval && kd->maxval) { int d; printf("Data ranges:\n"); for (d=0; dndim; d++) printf(" %i: [%g, %g]\n", d, kd->minval[d], kd->maxval[d]); } printf("Running kdtree_check...\n"); if (kdtree_check(kd)) { printf("kdtree_check failed.\n"); exit(-1); } if (printData) { int i, d; int dt = kdtree_datatype(kd); double data[kd->ndim]; for (i=0; indata; i++) { int iarray; kdtree_copy_data_double(kd, i, 1, data); printf("data[%i] = %n(", i, &iarray); for (d=0; dndim; d++) printf("%s%g", d?", ":"", data[d]); printf(")\n"); if (treeData) { printf("%*s(", iarray, ""); for (d=0; dndim; d++) switch (dt) { case KDT_DATA_DOUBLE: printf("%s%g", (d?", ":""), kd->data.d[kd->ndim * i + d]); break; case KDT_DATA_FLOAT: printf("%s%g", (d?", ":""), kd->data.f[kd->ndim * i + d]); break; case KDT_DATA_U32: printf("%s%u", (d?", ":""), kd->data.u[kd->ndim * i + d]); break; case KDT_DATA_U16: printf("%s%u", (d?", ":""), (unsigned int)kd->data.s[kd->ndim * i + d]); break; } printf(")\n"); } } } kdtree_fits_close(kd); return 0; } astrometry.net-0.67/libkd/demo.c000644 000765 000024 00000000730 12651445460 016743 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "kdtree.h" void ex1() { double mydata[] = { 1,1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8 }; int D = 2; int N = sizeof(mydata) / (D * sizeof(double)); printf("N %i, D %i\n", N, D); kdtree_t* kd = kdtree_build(NULL, mydata, N, D, 4, KDTT_DOUBLE, KD_BUILD_BBOX); kdtree_print(kd); kdtree_free(kd); } int main() { ex1(); } astrometry.net-0.67/libkd/dualtree.c000644 000765 000024 00000011043 12651445460 017623 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "dualtree.h" #include "bl.h" /* At each step of the recursion, we have a query node ("ynode") and a list of candidate search nodes ("nodes" and "leaves" in the "xtree"). General idea: - if we've hit a leaf in the "ytree", callback results; done. - if there are only leaves, no "x"/search nodes left, callback results; done. - for each element in x node list: - if decision(xnode, ynode) - add children of xnode to child search list - recurse on ynode's children with the child search list - empty the child search list The search order is depth-first, left-to-right in the "y" tree. */ static void dualtree_recurse(kdtree_t* xtree, kdtree_t* ytree, il* nodes, il* leaves, int ynode, dualtree_callbacks* callbacks) { // annoyances: // -trees are of different heights, so we can reach the leaves of one // before the leaves of the other. if we hit a leaf in the query // tree, just call the result function with all the search nodes, // leaves or not. if we hit a leaf in the search tree, add it to // the leaf-list. // -we want to share search lists between the children, but that means // that the children can't modify the lists - or if they do, they // have to undo any changes they make. if we only append items, then // we can undo changes by remembering the original list length and removing // everything after it when we're done. int leafmarker; il* childnodes; decision_function decision; void* decision_extra; int i, N; // if the query node is a leaf... if (KD_IS_LEAF(ytree, ynode)) { // ... then run the result function on each search node. result_function result = callbacks->result; void* result_extra = callbacks->result_extra; if (callbacks->start_results) callbacks->start_results(callbacks->start_extra, ytree, ynode); if (result) { // non-leaf nodes N = il_size(nodes); for (i=0; iend_results) callbacks->end_results(callbacks->end_extra, ytree, ynode); return; } // if there are search leaves but no search nodes, run the result // function on each leaf. (Note that the query node is not a leaf!) if (!il_size(nodes)) { result_function result = callbacks->result; void* result_extra = callbacks->result_extra; if (callbacks->start_results) callbacks->start_results(callbacks->start_extra, ytree, ynode); // leaf nodes if (result) { N = il_size(leaves); for (i=0; iend_results) callbacks->end_results(callbacks->end_extra, ytree, ynode); return; } leafmarker = il_size(leaves); childnodes = il_new(32); decision = callbacks->decision; decision_extra = callbacks->decision_extra; N = il_size(nodes); for (i=0; i #include #include #include #include "os-features.h" #include "dualtree_nearestneighbour.h" #include "dualtree.h" #include "mathutil.h" struct rs_params { kdtree_t* xtree; kdtree_t* ytree; anbool notself; double* node_nearest_d2; double d2; double* nearest_d2; int* nearest_ind; int* count_in_range; }; typedef struct rs_params rs_params; static anbool rs_within_range(void* params, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); static void rs_handle_result(void* extra, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); void dualtree_nearestneighbour(kdtree_t* xtree, kdtree_t* ytree, double maxdist2, double** nearest_d2, int** nearest_ind, int** count_in_range, int notself) { int i, NY, NNY; // dual-tree search callback functions dualtree_callbacks callbacks; rs_params params; // These two inputs must be non-NULL (they are essential return values); // but they may point to pointers that are NULL (indicating that the caller wants us to // allocate and return new arrays). assert(nearest_d2); assert(nearest_ind); memset(&callbacks, 0, sizeof(dualtree_callbacks)); callbacks.decision = rs_within_range; callbacks.decision_extra = ¶ms; callbacks.result = rs_handle_result; callbacks.result_extra = ¶ms; // set search params NY = kdtree_n(ytree); memset(¶ms, 0, sizeof(params)); params.xtree = xtree; params.ytree = ytree; params.notself = notself; params.d2 = maxdist2; params.count_in_range = NULL; if (count_in_range) { if (!(*count_in_range)) { *count_in_range = (int*)calloc(NY, sizeof(int)); } params.count_in_range = *count_in_range; } // were we given a d2 array? if (*nearest_d2) params.nearest_d2 = *nearest_d2; else params.nearest_d2 = malloc(NY * sizeof(double)); if (maxdist2 == 0.0) maxdist2 = HUGE_VAL; for (i=0; icount_in_range) { if (kdtree_node_node_mindist2_exceeds(xtree, xnode, ytree, ynode, p->d2)) return FALSE; return TRUE; } if (kdtree_node_node_mindist2_exceeds(xtree, xnode, ytree, ynode, p->node_nearest_d2[ynode])) return FALSE; maxd2 = kdtree_node_node_maxdist2(xtree, xnode, ytree, ynode); if (maxd2 < p->node_nearest_d2[ynode]) { // update this node and its children. p->node_nearest_d2[ynode] = maxd2; if (!KD_IS_LEAF(ytree, ynode)) { int child = KD_CHILD_LEFT(ynode); p->node_nearest_d2[child] = MIN(p->node_nearest_d2[child], maxd2); child = KD_CHILD_RIGHT(ynode); p->node_nearest_d2[child] = MIN(p->node_nearest_d2[child], maxd2); } } return TRUE; } /** This callback gets called when we've reached a node in the Y tree and a node in the X tree (one or both may be leaves), and it's time to look at individual data points. */ static void rs_handle_result(void* vparams, kdtree_t* xtree, int xnode, kdtree_t* ytree, int ynode) { int xl, xr, yl, yr; int x, y; rs_params* p = (rs_params*)vparams; int D = ytree->ndim; double checkd2; xl = kdtree_left (xtree, xnode); xr = kdtree_right(xtree, xnode); yl = kdtree_left (ytree, ynode); yr = kdtree_right(ytree, ynode); for (y=yl; y<=yr; y++) { void* py = kdtree_get_data(ytree, y); if (p->count_in_range) { checkd2 = p->d2; } else { p->nearest_d2[y] = MIN(p->nearest_d2[y], p->node_nearest_d2[ynode]); checkd2 = p->nearest_d2[y]; } // check if we can eliminate the whole x node for this y point... if (kdtree_node_point_mindist2_exceeds(xtree, xnode, py, checkd2)) continue; for (x=xl; x<=xr; x++) { double d2; void* px; if (p->notself && (y == x)) continue; px = kdtree_get_data(xtree, x); d2 = distsq(px, py, D); if (p->count_in_range) { if (d2 < p->d2) { p->count_in_range[y]++; } } if (d2 > p->nearest_d2[y]) continue; p->nearest_d2[y] = d2; p->nearest_ind[y] = x; } } } astrometry.net-0.67/libkd/dualtree_rangesearch.c000644 000765 000024 00000025745 12651445460 022203 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "dualtree_rangesearch.h" #include "dualtree.h" #include "mathutil.h" double RANGESEARCH_NO_LIMIT = 1.12345e308; struct rs_params { kdtree_t* xtree; kdtree_t* ytree; anbool notself; // radius-squared of the search range. double mindistsq; double maxdistsq; // are we using the min/max limit? anbool usemin; anbool usemax; // for "search" result_callback user_callback; void* user_callback_param; progress_callback user_progress; void* user_progress_param; int ydone; double (*distsquared)(void* px, void* py, int D); // for "count" int* counts; }; typedef struct rs_params rs_params; static anbool rs_within_range(void* params, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); static void rs_handle_result(void* extra, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); static void rs_start_results(void* extra, kdtree_t* querytree, int querynode); static double mydistsq(void* v1, void* v2, int D) { return distsq((double*)v1, (double*)v2, D); } void dualtree_rangesearch(kdtree_t* xtree, kdtree_t* ytree, double mindist, double maxdist, int notself, dist2_function distsquared, result_callback callback, void* param, progress_callback progress, void* progress_param) { // dual-tree search callback functions dualtree_callbacks callbacks; rs_params params; memset(&callbacks, 0, sizeof(dualtree_callbacks)); callbacks.decision = rs_within_range; callbacks.decision_extra = ¶ms; callbacks.result = rs_handle_result; callbacks.result_extra = ¶ms; // set search params memset(¶ms, 0, sizeof(params)); if ((mindist == RANGESEARCH_NO_LIMIT) || (mindist == 0.0)) { params.usemin = FALSE; } else { params.usemin = TRUE; params.mindistsq = mindist * mindist; } if (maxdist == RANGESEARCH_NO_LIMIT) { params.usemax = FALSE; } else { double d = maxdist; /* printf("Original distance %.16g\n", d); d = kdtree_get_conservative_query_radius(xtree, d); printf("Conservative distance in tree 1: %.16g\n", d); d = kdtree_get_conservative_query_radius(ytree, d); printf("Conservative distance in tree 2: %.16g\n", d); */ params.usemax = TRUE; params.maxdistsq = d*d; } params.notself = notself; if (distsquared) params.distsquared = distsquared; else params.distsquared = mydistsq; params.user_callback = callback; params.user_callback_param = param; params.xtree = xtree; params.ytree = ytree; if (progress) { callbacks.start_results = rs_start_results; callbacks.start_extra = ¶ms; params.user_progress = progress; params.user_progress_param = progress_param; params.ydone = 0; } dualtree_search(xtree, ytree, &callbacks); } static void rs_start_results(void* vparams, kdtree_t* ytree, int ynode) { rs_params* p = (rs_params*)vparams; p->ydone += 1 + kdtree_right(ytree, ynode) - kdtree_left(ytree, ynode); if (p->user_progress) p->user_progress(p->user_progress_param, p->ydone); } static anbool rs_within_range(void* vparams, kdtree_t* xtree, int xnode, kdtree_t* ytree, int ynode) { rs_params* p = (rs_params*)vparams; //printf("rs_within_range: x node %i (parent %i) / y node %i (parent %i)\n", xnode, KD_PARENT(xnode), ynode, KD_PARENT(ynode)); if (p->usemax && kdtree_node_node_mindist2_exceeds(xtree, xnode, ytree, ynode, p->maxdistsq)) return FALSE; if (p->usemin && !kdtree_node_node_maxdist2_exceeds(xtree, xnode, ytree, ynode, p->mindistsq)) return FALSE; return TRUE; } static void rs_handle_result(void* vparams, kdtree_t* xtree, int xnode, kdtree_t* ytree, int ynode) { // go through all pairs of points in this pair of nodes, checking // that each pair's distance lies within the required range. Call the // user's callback function on each satisfying pair. int xl, xr, yl, yr; int x, y; rs_params* p = (rs_params*)vparams; int D = ytree->ndim; xl = kdtree_left (xtree, xnode); xr = kdtree_right(xtree, xnode); yl = kdtree_left (ytree, ynode); yr = kdtree_right(ytree, ynode); for (y=yl; y<=yr; y++) { double py[D]; kdtree_copy_data_double(ytree, y, 1, py); // check if we can eliminate the whole box for this point... // HACK - can only do this if leaf nodes have bounding-boxes! if (!KD_IS_LEAF(xtree, xnode)) { if (p->usemax && kdtree_node_point_mindist2_exceeds(xtree, xnode, py, p->maxdistsq)) continue; if (p->usemin && !kdtree_node_point_maxdist2_exceeds(xtree, xnode, py, p->mindistsq)) continue; } for (x=xl; x<=xr; x++) { double d2; double px[D]; if (p->notself && x == y) continue; kdtree_copy_data_double(xtree, x, 1, px); d2 = p->distsquared(px, py, D); //printf("eliminated point.\n"); if ((p->usemax) && (d2 > p->maxdistsq)) continue; if ((p->usemin) && (d2 < p->mindistsq)) continue; p->user_callback(p->user_callback_param, x, y, d2); } } } /* void dualtree_rangecount(kdtree_t* x, kdtree_t* y, double mindist, double maxdist, dist2_function distsquared, int* counts) { printf("HACK - implement dualtree_rangecount.\n"); } anbool rc_should_recurse(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode); void rc_handle_result(void* params, kdtree_node_t* search, kdtree_node_t* query); void rc_self_handle_result(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode); anbool rc_self_should_recurse(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode); void dualtree_rangecount(kdtree_t* xtree, kdtree_t* ytree, double mindist, double maxdist, int* counts) { dualtree_callbacks callbacks; rs_params params; memset(&callbacks, 0, sizeof(dualtree_callbacks)); if (xtree == ytree) { callbacks.decision = rc_self_should_recurse; callbacks.result = rc_self_handle_result; } else { callbacks.decision = rc_should_recurse; callbacks.result = rc_handle_result; } callbacks.decision_extra = ¶ms; callbacks.result_extra = ¶ms; // set search params memset(¶ms, 0, sizeof(params)); if (mindist == RANGESEARCH_NO_LIMIT) { params.usemin = 0; } else { params.usemin = 1; params.mindistsq = mindist * mindist; } if (maxdist == RANGESEARCH_NO_LIMIT) { params.usemax = 0; } else { params.usemax = 1; params.maxdistsq = maxdist * maxdist; } params.xtree = xtree; params.ytree = ytree; params.counts = counts; dualtree_search(xtree, ytree, &callbacks); } */ /* anbool rc_should_recurse(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode) { rs_params* p = (rs_params*)vparams; // does the bounding box partly overlap the desired range? if (p->usemax) { if (kdtree_node_node_mindist2_exceeds(p->xtree, xnode, p->ytree, ynode, p->maxdistsq)) return FALSE; } if (p->usemin) { if (!kdtree_node_node_maxdist2_exceeds(p->xtree, xnode, p->ytree, ynode, p->mindistsq)) return FALSE; } */ /* ; // HACK - it's not clear that it's advantageous to do this here... // (NOTE, if you decide to uncomment this, be sure to fix / rc_self_should_recurse, since the action to take is different.) // is the bounding box fully within the desired range? if (p->usemin) { // compute min bound if it hasn't already been... if (!p->usemax) mindistsq = kdtree_node_node_mindist2(p->xtree, xnode, p->ytree, ynode); if (mindistsq < p->mindistsq) allinrange = FALSE; } if (allinrange && p->usemax) { if (!p->usemin) maxdistsq = kdtree_node_node_maxdist2(p->xtree, xnode, p->ytree, ynode); if (maxdistsq > p->maxdistsq) allinrange = FALSE; } if (allinrange) { // we can stop at this pair of nodes; no need to recurse any further. // for each Y point, increment its counter by the number of points in the X node. int NX, yl, yr, y; NX = kdtree_node_npoints(xnode); yl = ynode->l; yr = ynode->r; for (y=yl; y<=yr; y++) { int iy = p->ytree->perm[y]; p->counts[iy] += NX; } return FALSE; } */ /* return TRUE; } void rc_handle_result(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode) { // go through all pairs of points in this pair of nodes, checking // that each pair's distance lies within the required range. int xl, xr, yl, yr; int x, y; rs_params* p = (rs_params*)vparams; int D = p->ytree->ndim; anbool allinrange = TRUE; // is the bounding box fully within the desired range? if (p->usemin) { if (!kdtree_node_node_mindist2_exceeds(p->xtree, xnode, p->ytree, ynode, p->mindistsq)) allinrange = FALSE; } if (allinrange && p->usemax) { if (kdtree_node_node_maxdist2_exceeds(p->xtree, xnode, p->ytree, ynode, p->maxdistsq)) allinrange = FALSE; } if (allinrange) { // for each Y point, increment its counter by the number of points in the X node. int NX, yl, yr, y; NX = kdtree_node_npoints(xnode); yl = ynode->l; yr = ynode->r; for (y=yl; y<=yr; y++) { p->counts[y] += NX; } return; } xl = xnode->l; xr = xnode->r; yl = ynode->l; yr = ynode->r; if (p->usemax && !p->usemin) { for (y=yl; y<=yr; y++) { double* py = p->ytree->data + y * D; for (x=xl; x<=xr; x++) { double* px; px = p->xtree->data + x * D; if (distsq_exceeds(px, py, D, p->maxdistsq)) continue; p->counts[y]++; } } } else { for (y=yl; y<=yr; y++) { double* py = p->ytree->data + y * D; for (x=xl; x<=xr; x++) { double d2; double* px; px = p->xtree->data + x * D; d2 = distsq(px, py, D); if ((p->usemax) && (d2 > p->maxdistsq)) continue; if ((p->usemin) && (d2 < p->mindistsq)) continue; p->counts[y]++; } } } } anbool rc_self_should_recurse(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode) { if (xnode > ynode) return FALSE; return rc_should_recurse(vparams, xnode, ynode); } void rc_self_handle_result(void* vparams, kdtree_node_t* xnode, kdtree_node_t* ynode) { int xl, xr, yl, yr; int x, y; rs_params* p = (rs_params*)vparams; int D = p->ytree->ndim; if (xnode > ynode) return; if (xnode == ynode) { int x2; xl = xnode->l; xr = xnode->r; for (x=xl; x<=xr; x++) { double* px = p->xtree->data + x * D; for (x2=x+1; x2<=xr; x2++) { double d2; double* px2; px2 = p->xtree->data + x2 * D; d2 = distsq(px, px2, D); if ((p->usemax) && (d2 > p->maxdistsq)) continue; if ((p->usemin) && (d2 < p->mindistsq)) continue; p->counts[x]++; p->counts[x2]++; } // the diagonal... if ((p->usemin) && (0.0 < p->mindistsq)) continue; p->counts[x]++; } return; } xl = xnode->l; xr = xnode->r; yl = ynode->l; yr = ynode->r; if (p->usemax && !p->usemin) { for (y=yl; y<=yr; y++) { double* py = p->ytree->data + y * D; for (x=xl; x<=xr; x++) { double* px; px = p->xtree->data + x * D; if (distsq_exceeds(px, py, D, p->maxdistsq)) continue; p->counts[y]++; p->counts[x]++; } } } else { for (y=yl; y<=yr; y++) { double* py = p->ytree->data + y * D; for (x=xl; x<=xr; x++) { double d2; double* px; px = p->xtree->data + x * D; d2 = distsq(px, py, D); if ((p->usemax) && (d2 > p->maxdistsq)) continue; if ((p->usemin) && (d2 < p->mindistsq)) continue; p->counts[y]++; p->counts[x]++; } } } } */ astrometry.net-0.67/libkd/fix-bb.c000644 000765 000024 00000014260 12651445460 017171 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "kdtree.h" #include "kdtree_fits_io.h" #include "ioutils.h" #include "fitsioutils.h" #include "errors.h" #include "anqfits.h" void printHelp(char* progname) { printf("\nUsage: %s \n" "\n", progname); } const char* OPTIONS = "hvq"; int main(int argc, char** args) { int argchar; char* progname = args[0]; kdtree_t* kd; char* infn; char* outfn; qfits_header* hdr; qfits_header* outhdr; int i, Next; FILE* fout; FILE* fin; anbool verbose = FALSE; char* err; anbool force_quad = FALSE; anqfits_t* anq = NULL; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': verbose = TRUE; break; case 'q': force_quad = TRUE; break; case 'h': printHelp(progname); exit(-1); } if (optind != argc - 2) { printHelp(progname); exit(-1); } infn = args[optind]; outfn = args[optind+1]; if (!strcmp(infn, outfn)) { printf("Sorry, in-place modification of files is not supported.\n"); exit(-1); } if (!force_quad && ends_with(infn, ".quad.fits")) { printf("\nYou don't need to fix .quad.fits files.\n" " (use the -q option to try anyway.)\n"); exit(1); } printf("Reading kdtree from file %s ...\n", infn); errors_start_logging_to_string(); kd = kdtree_fits_read(infn, NULL, &hdr); err = errors_stop_logging_to_string("\n "); if (!kd) { printf("Failed to read kdtree from file %s:\n", infn); printf(" %s\n", err); free(err); exit(-1); } free(err); if (!kdtree_has_old_bb(kd)) { printf("Kdtree %s has the correct number of bounding boxes; it doesn't need fixing.\n", infn); exit(1); } if (verbose) { printf("Tree name: %s\n", kd->name); printf("Treetype: 0x%x\n", kd->treetype); printf("Data type: %s\n", kdtree_kdtype_to_string(kdtree_datatype(kd))); printf("Tree type: %s\n", kdtree_kdtype_to_string(kdtree_treetype(kd))); printf("External type: %s\n", kdtree_kdtype_to_string(kdtree_exttype(kd))); printf("N data points: %i\n", kd->ndata); printf("Dimensions: %i\n", kd->ndim); printf("Nodes: %i\n", kd->nnodes); printf("Leaf nodes: %i\n", kd->nbottom); printf("Non-leaf nodes: %i\n", kd->ninterior); printf("Tree levels: %i\n", kd->nlevels); printf("LR array: %s\n", (kd->lr ? "yes" : "no")); printf("Perm array: %s\n", (kd->perm ? "yes" : "no")); printf("Bounding box: %s\n", (kd->bb.any ? "yes" : "no")); printf("Split plane: %s\n", (kd->split.any ? "yes" : "no")); printf("Split dim: %s\n", (kd->splitdim ? "yes" : "no")); printf("Data: %s\n", (kd->data.any ? "yes" : "no")); if (kd->minval && kd->maxval) { int d; printf("Data ranges:\n"); for (d=0; dndim; d++) printf(" %i: [%g, %g]\n", d, kd->minval[d], kd->maxval[d]); } } if (verbose) printf("Computing bounding boxes...\n"); kdtree_fix_bounding_boxes(kd); if (verbose) printf("Running kdtree_check...\n"); if (kdtree_check(kd)) { printf("kdtree_check failed.\n"); exit(-1); } outhdr = qfits_header_new(); fits_append_long_comment(outhdr, "This file was processed by the fix-bb " "program, part of the Astrometry.net suite. The " "extra FITS headers in the original file are " "given below:"); fits_append_long_comment(outhdr, "---------------------------------"); for (i=0; inc == 1) && kdtree_fits_column_is_kdtree(table->col[0].tlabel)) continue; } if (verbose) printf("Extension %i is not part of the kdtree. Copying it verbatim.\n", ext); hoffset = anqfits_header_start(anq, i); hlength = anqfits_header_size (anq, i); doffset = anqfits_data_start(anq, i); dlength = anqfits_data_size (anq, i); if (pipe_file_offset(fin, hoffset, hlength, fout) || pipe_file_offset(fin, doffset, dlength, fout)) { ERROR("Failed to write extension %i verbatim", ext); exit(-1); } } fclose(fin); if (fclose(fout)) { SYSERROR("Failed to close output file %s", outfn); exit(-1); } anqfits_close(anq); kdtree_fits_close(kd); errors_free(); printf("Fixed file %s was written successfully.\n", outfn); return 0; } astrometry.net-0.67/libkd/header000644 000765 000024 00000001274 12651445460 017032 0ustar00dstnstaff000000 000000 /* This file is part of libkd. Copyright 2006, Dustin Lang and Keir Mierle. libkd 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, version 2. libkd 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 libkd; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ astrometry.net-0.67/libkd/kdint_ddd.c000644 000765 000024 00000002146 12651445460 017746 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_d.h" #include "kdint_dtype_d.h" #include "kdint_ttype_d.h" #define POINT_ED(kd, d, r, func) (r) #define POINT_DT(kd, d, r, func) (r) #define POINT_ET(kd, d, r, func) (r) #define POINT_TD(kd, d, r) (r) #define POINT_DE(kd, d, r) (r) #define POINT_TE(kd, d, r) (r) #define DIST_ED(kd, dist, func) (dist) #define DIST_DT(kd, dist, func) (dist) #define DIST_ET(kd, dist, func) (dist) #define DIST_TD(kd, dist) (dist) #define DIST_DE(kd, dist) (dist) #define DIST_TE(kd, dist) (dist) #define DIST2_ED(kd, dist2, func) (dist2) #define DIST2_DT(kd, dist2, func) (dist2) #define DIST2_ET(kd, dist2, func) (dist2) #define DIST2_TD(kd, dist2) (dist2) #define DIST2_DE(kd, dist2) (dist2) #define DIST2_TE(kd, dist2) (dist2) #define EQUAL_ED 1 #define EQUAL_DT 1 #define EQUAL_ET 1 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" astrometry.net-0.67/libkd/kdint_dds.c000644 000765 000024 00000002544 12651445460 017767 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_d.h" #include "kdint_dtype_d.h" #include "kdint_ttype_s.h" #define POINT_ED(kd, d, r, func) (r) #define POINT_DT(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_ET(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_TD(kd, d, r) POINT_INVSCALE(kd, d, r) #define POINT_DE(kd, d, r) (r) #define POINT_TE(kd, d, r) POINT_INVSCALE(kd, d, r) #define DIST_ED(kd, dist, func) (dist) #define DIST_DT(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_ET(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_TD(kd, dist) DIST_INVSCALE(kd, dist) #define DIST_DE(kd, dist) (dist) #define DIST_TE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST2_ED(kd, dist2, func) (dist2) #define DIST2_DT(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_ET(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_TD(kd, dist2) DIST2_INVSCALE(kd, dist2) #define DIST2_DE(kd, dist2) (dist2) #define DIST2_TE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define EQUAL_ED 1 #define EQUAL_DT 0 #define EQUAL_ET 0 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" astrometry.net-0.67/libkd/kdint_ddu.c000644 000765 000024 00000002544 12651445460 017771 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_d.h" #include "kdint_dtype_d.h" #include "kdint_ttype_u.h" #define POINT_ED(kd, d, r, func) (r) #define POINT_DT(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_ET(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_TD(kd, d, r) POINT_INVSCALE(kd, d, r) #define POINT_DE(kd, d, r) (r) #define POINT_TE(kd, d, r) POINT_INVSCALE(kd, d, r) #define DIST_ED(kd, dist, func) (dist) #define DIST_DT(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_ET(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_TD(kd, dist) DIST_INVSCALE(kd, dist) #define DIST_DE(kd, dist) (dist) #define DIST_TE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST2_ED(kd, dist2, func) (dist2) #define DIST2_DT(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_ET(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_TD(kd, dist2) DIST2_INVSCALE(kd, dist2) #define DIST2_DE(kd, dist2) (dist2) #define DIST2_TE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define EQUAL_ED 1 #define EQUAL_DT 0 #define EQUAL_ET 0 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" astrometry.net-0.67/libkd/kdint_dss.c000644 000765 000024 00000002544 12651445460 020006 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_d.h" #include "kdint_dtype_s.h" #include "kdint_ttype_s.h" #define POINT_ED(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_DT(kd, d, r, func) (r) #define POINT_ET(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_TD(kd, d, r) (r) #define POINT_DE(kd, d, r) POINT_INVSCALE(kd, d, r) #define POINT_TE(kd, d, r) POINT_INVSCALE(kd, d, r) #define DIST_ED(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_DT(kd, dist, func) (dist) #define DIST_ET(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_TD(kd, dist) (dist) #define DIST_DE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST_TE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST2_ED(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_DT(kd, dist2, func) (dist2) #define DIST2_ET(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_TD(kd, dist2) (dist2) #define DIST2_DE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define DIST2_TE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define EQUAL_ED 0 #define EQUAL_DT 1 #define EQUAL_ET 0 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" astrometry.net-0.67/libkd/kdint_dtype_d.h000644 000765 000024 00000000475 12651445460 020653 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef double dtype; #define DTYPE_INTEGER 0 #define DTYPE_DOUBLE 1 #define DTYPE_MAX KDT_INFTY_DOUBLE #define DTYPE_MIN -KDT_INFTY_DOUBLE #define DTYPE d #define DTYPE_M d #define DTYPE_KDT_DATA KDT_DATA_DOUBLE astrometry.net-0.67/libkd/kdint_dtype_f.h000644 000765 000024 00000000471 12651445460 020651 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef float dtype; #define DTYPE_INTEGER 0 #define DTYPE_DOUBLE 0 #define DTYPE_MAX KDT_INFTY_FLOAT #define DTYPE_MIN -KDT_INFTY_FLOAT #define DTYPE f #define DTYPE_M f #define DTYPE_KDT_DATA KDT_DATA_FLOAT astrometry.net-0.67/libkd/kdint_dtype_s.h000644 000765 000024 00000000443 12651445460 020665 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u16 dtype; #define DTYPE_INTEGER 1 #define DTYPE_DOUBLE 0 #define DTYPE_MAX UINT16_MAX #define DTYPE_MIN 0 #define DTYPE s #define DTYPE_M s #define DTYPE_KDT_DATA KDT_DATA_U16 astrometry.net-0.67/libkd/kdint_dtype_u.h000644 000765 000024 00000000442 12651445460 020666 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u32 dtype; #define DTYPE_INTEGER 1 #define DTYPE_DOUBLE 0 #define DTYPE_MAX UINT32_MAX #define DTYPE_MIN 0 #define DTYPE u #define DTYPE_M u #define DTYPE_KDT_DATA KDT_DATA_U32 astrometry.net-0.67/libkd/kdint_duu.c000644 000765 000024 00000002644 12651445460 020013 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_d.h" #include "kdint_dtype_u.h" #include "kdint_ttype_u.h" #define POINT_ED(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_DT(kd, d, r, func) (r) #define POINT_ET(kd, d, r, func) (func(POINT_SCALE(kd, d, r))) #define POINT_TD(kd, d, r) (r) #define POINT_DE(kd, d, r) POINT_INVSCALE(kd, d, r) #define POINT_TE(kd, d, r) POINT_INVSCALE(kd, d, r) #define DIST_ED(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_DT(kd, dist, func) (dist) #define DIST_ET(kd, dist, func) (func(DIST_SCALE(kd, dist))) #define DIST_TD(kd, dist) (dist) #define DIST_DE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST_TE(kd, dist) DIST_INVSCALE(kd, dist) #define DIST2_ED(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_DT(kd, dist2, func) (dist2) #define DIST2_ET(kd, dist2, func) (func(DIST2_SCALE(kd, dist2))) #define DIST2_TD(kd, dist2) (dist2) #define DIST2_DE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define DIST2_TE(kd, dist2) DIST2_INVSCALE(kd, dist2) #define EQUAL_ED 0 #define EQUAL_DT 1 #define EQUAL_ET 0 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" // FIXME double kd_round(double x) { return KD_ROUND(x); } astrometry.net-0.67/libkd/kdint_etype_d.h000644 000765 000024 00000000375 12651445460 020653 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef double etype; #define ETYPE_INTEGER 0 #define ETYPE_MAX KDT_INFTY_DOUBLE #define ETYPE_MIN -KDT_INFTY_DOUBLE #define ETYPE d #define ETYPE_M d astrometry.net-0.67/libkd/kdint_etype_f.h000644 000765 000024 00000000443 12651445460 020651 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef float etype; #define ETYPE_INTEGER 0 #define ETYPE_MAX KDT_INFTY_FLOAT #define ETYPE_MIN -KDT_INFTY_FLOAT #define ETYPE f #define ETYPE_M f //#define ETYPE_KDT_DATA KDT_DATA_FLOAT astrometry.net-0.67/libkd/kdint_etype_s.h000644 000765 000024 00000000412 12651445460 020662 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u16 etype; #define ETYPE_INTEGER 1 #define ETYPE_MAX 0xffffu #define ETYPE_MIN 0 #define ETYPE s #define ETYPE_M s //#define ETYPE_KDT_DATA KDT_DATA_U16 astrometry.net-0.67/libkd/kdint_etype_u.h000644 000765 000024 00000000415 12651445460 020667 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u32 etype; #define ETYPE_INTEGER 1 #define ETYPE_MAX 0xffffffffu #define ETYPE_MIN 0 #define ETYPE u #define ETYPE_M u //#define ETYPE_KDT_DATA KDT_DATA_U32 astrometry.net-0.67/libkd/kdint_fff.c000644 000765 000024 00000002146 12651445460 017754 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "kdtree.h" #include "kdtree_internal_common.h" #include "kdint_etype_f.h" #include "kdint_dtype_f.h" #include "kdint_ttype_f.h" #define POINT_ED(kd, d, r, func) (r) #define POINT_DT(kd, d, r, func) (r) #define POINT_ET(kd, d, r, func) (r) #define POINT_TD(kd, d, r) (r) #define POINT_DE(kd, d, r) (r) #define POINT_TE(kd, d, r) (r) #define DIST_ED(kd, dist, func) (dist) #define DIST_DT(kd, dist, func) (dist) #define DIST_ET(kd, dist, func) (dist) #define DIST_TD(kd, dist) (dist) #define DIST_DE(kd, dist) (dist) #define DIST_TE(kd, dist) (dist) #define DIST2_ED(kd, dist2, func) (dist2) #define DIST2_DT(kd, dist2, func) (dist2) #define DIST2_ET(kd, dist2, func) (dist2) #define DIST2_TD(kd, dist2) (dist2) #define DIST2_DE(kd, dist2) (dist2) #define DIST2_TE(kd, dist2) (dist2) #define EQUAL_ED 1 #define EQUAL_DT 1 #define EQUAL_ET 1 #include "kdtree_internal.c" #include "kdtree_internal_fits.c" astrometry.net-0.67/libkd/kdint_ttype_d.h000644 000765 000024 00000000563 12651445460 020671 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef double ttype; #define BIGTTYPE double #define BIGTTYPE_MAX KDT_INFTY_DOUBLE typedef double bigttype; #define TTYPE_INTEGER 0 #define TTYPE_MIN -KDT_INFTY_DOUBLE #define TTYPE_MAX KDT_INFTY_DOUBLE #define TTYPE_SQRT_MAX 1e154 #define TTYPE d #define TTYPE_M d astrometry.net-0.67/libkd/kdint_ttype_f.h000644 000765 000024 00000000554 12651445460 020673 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef float ttype; #define BIGTTYPE float #define BIGTTYPE_MAX KDT_INFTY_FLOAT typedef float bigttype; #define TTYPE_INTEGER 0 #define TTYPE_MIN -KDT_INFTY_FLOAT #define TTYPE_MAX KDT_INFTY_FLOAT #define TTYPE_SQRT_MAX 1e19 #define TTYPE f #define TTYPE_M f astrometry.net-0.67/libkd/kdint_ttype_s.h000644 000765 000024 00000000517 12651445460 020707 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u16 ttype; #define BIGTTYPE u32 #define BIGTTYPE_MAX UINT32_MAX typedef u32 bigttype; #define TTYPE_INTEGER 1 #define TTYPE_MIN 0 #define TTYPE_MAX UINT16_MAX #define TTYPE_SQRT_MAX UINT8_MAX #define TTYPE s #define TTYPE_M s astrometry.net-0.67/libkd/kdint_ttype_u.h000644 000765 000024 00000000520 12651445460 020703 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef u32 ttype; #define BIGTTYPE u64 #define BIGTTYPE_MAX UINT64_MAX typedef u64 bigttype; #define TTYPE_INTEGER 1 #define TTYPE_MIN 0 #define TTYPE_MAX UINT32_MAX #define TTYPE_SQRT_MAX UINT16_MAX #define TTYPE u #define TTYPE_M u astrometry.net-0.67/libkd/kdtree.c000644 000765 000024 00000043075 12651445460 017306 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "os-features.h" #include "kdtree.h" #include "kdtree_internal.h" #include "kdtree_internal_common.h" #include "kdtree_mem.h" #include "keywords.h" #include "an-fls.h" #include "errors.h" #include "log.h" kdtree_t* kdtree_build(kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options) { return kdtree_build_2(kd, data, N, D, Nleaf, treetype, options, NULL, NULL); } void kdtree_print(kdtree_t* kd) { printf("kdtree:\n"); printf(" type 0x%x\n", kd->treetype); printf(" lr %p\n", kd->lr); printf(" perm %p\n", kd->perm); printf(" bb %p\n", kd->bb.any); printf(" nbb %i\n", kd->n_bb); printf(" split %p\n", kd->split.any); printf(" splitdim %p\n", kd->splitdim); printf(" dimbits %i\n", kd->dimbits); printf(" dimmask 0x%x\n", kd->dimmask); printf(" splitmask 0x%x\n", kd->splitmask); printf(" data %p\n", kd->data.any); printf(" free data %i\n", (int)kd->free_data); printf(" range"); if (kd->minval && kd->maxval) { int i; for (i=0; indim; i++) printf(" [%g, %g]", kd->minval[i], kd->maxval[i]); } else printf(" (none)\n"); printf("\n"); printf(" scale %g\n", kd->scale); printf(" invscale %g\n", kd->invscale); printf(" Ndata %i\n", kd->ndata); printf(" Ndim %i\n", kd->ndim); printf(" Nnodes %i\n", kd->nnodes); printf(" Nbottom %i\n", kd->nbottom); printf(" Ninterior %i\n", kd->ninterior); printf(" Nlevels %i\n", kd->nlevels); printf(" has_linear_lr %i\n", (int)kd->has_linear_lr); printf(" name %s\n", kd->name); } int kdtree_n(const kdtree_t* kd) { return kd->ndata; } int kdtree_nnodes(const kdtree_t* kd) { return kd->nnodes; } int kdtree_has_old_bb(const kdtree_t* kd) { return kd->n_bb != kd->nnodes; } KD_DECLARE(kdtree_update_funcs, void, (kdtree_t*)); void kdtree_update_funcs(kdtree_t* kd) { KD_DISPATCH(kdtree_update_funcs, kd->treetype,, (kd)); } static int get_tree_size(int treetype) { switch (treetype & KDT_TREE_MASK) { case KDT_TREE_DOUBLE: return sizeof(double); case KDT_TREE_FLOAT: return sizeof(float); case KDT_TREE_U32: return sizeof(u32); case KDT_TREE_U16: return sizeof(u16); } return -1; } static int get_data_size(int treetype) { switch (treetype & KDT_DATA_MASK) { case KDT_DATA_DOUBLE: return sizeof(double); case KDT_DATA_FLOAT: return sizeof(float); case KDT_DATA_U32: return sizeof(u32); case KDT_DATA_U16: return sizeof(u16); } return -1; } size_t kdtree_sizeof_lr(const kdtree_t* kd) { return sizeof(int32_t) * kd->nbottom; } size_t kdtree_sizeof_perm(const kdtree_t* kd) { return sizeof(u32) * kd->ndata; } size_t kdtree_sizeof_bb(const kdtree_t* kd) { return get_tree_size(kd->treetype) * kd->ndim * kd->nnodes; } size_t kdtree_sizeof_split(const kdtree_t* kd) { return get_tree_size(kd->treetype) * kd->ninterior; } size_t kdtree_sizeof_splitdim(const kdtree_t* kd) { return sizeof(u8) * kd->ninterior; } size_t kdtree_sizeof_data(const kdtree_t* kd) { return get_data_size(kd->treetype) * kd->ndim * kd->ndata; } void kdtree_memory_report(kdtree_t* kd) { int mem; int n, sz; int total = 0; int tsz = get_tree_size(kd->treetype); int dsz = get_data_size(kd->treetype); char* fmt = "%-10s: %12i %10s * %2i = %12i B (%10.3f MB)\n"; printf("Memory usage of kdtree (ndata %i, ndim %i, nnodes %i, nleaves %i)\n", kd->ndata, kd->ndim, kd->nnodes, kd->nbottom); if (kd->lr) { n = kd->nbottom; sz = sizeof(int32_t); mem = n*sz; printf(fmt, "lr", n, "leaves", sz, mem, 1e-6*mem); total += mem; } if (kd->perm) { n = kd->ndata; sz = sizeof(u32); mem = n*sz; printf(fmt, "perm", n, "points", sz, mem, 1e-6*mem); total += mem; } if (kd->bb.any) { n = kd->nnodes; sz = tsz * 2 * kd->ndim; mem = n*sz; printf(fmt, "bbox", n, "nodes", sz, mem, 1e-6*mem); total += mem; } if (kd->split.any) { n = kd->ninterior; sz = tsz; mem = n*sz; printf(fmt, "split", n, "splits", sz, mem, 1e-6*mem); total += mem; } if (kd->splitdim) { n = kd->ninterior; sz = sizeof(u8); mem = n*sz; printf(fmt, "splitdim", n, "splits", sz, mem, 1e-6*mem); total += mem; } printf("Total without data: %12i B (%10.3f MB)\n", total, total*1e-6); if (kd->data.any) { n = kd->ndata; sz = dsz * kd->ndim; mem = n*sz; printf(fmt, "data", n, "points", sz, mem, 1e-6*mem); total += mem; } printf("Total including data: %12i B (%10.3f MB)\n", total, total*1e-6); } int kdtree_level_start(const kdtree_t* kd, int level) { return (1 << level) - 1; } int kdtree_level_end(const kdtree_t* kd, int level) { return (1 << (level+1)) - 2; } static inline u8 node_level(int nodeid) { return an_flsB(nodeid + 1); } int kdtree_get_level(const kdtree_t* kd, int nodeid) { return node_level(nodeid); } int kdtree_get_splitdim(const kdtree_t* kd, int nodeid) { u32 tmpsplit; if (kd->splitdim) return kd->splitdim[nodeid]; switch (kdtree_treetype(kd)) { case KDT_TREE_U32: tmpsplit = kd->split.u[nodeid]; break; case KDT_TREE_U16: tmpsplit = kd->split.s[nodeid]; break; default: return -1; } return tmpsplit & kd->dimmask; } double kdtree_get_splitval(const kdtree_t* kd, int nodeid) { assert(kd->fun.get_splitval); return kd->fun.get_splitval(kd, nodeid); } void* kdtree_get_data(const kdtree_t* kd, int i) { switch (kdtree_datatype(kd)) { case KDT_DATA_DOUBLE: return kd->data.d + kd->ndim * i; case KDT_DATA_FLOAT: return kd->data.f + kd->ndim * i; case KDT_DATA_U32: return kd->data.u + kd->ndim * i; case KDT_DATA_U16: return kd->data.s + kd->ndim * i; default: ERROR("kdtree_get_data: invalid data type %i", kdtree_datatype(kd)); return NULL; } } void kdtree_copy_data_double(const kdtree_t* kd, int start, int N, double* dest) { int i; int d, D; D = kd->ndim; switch (kdtree_datatype(kd)) { case KDT_DATA_DOUBLE: memcpy(dest, kd->data.d + start*D, N * D * sizeof(double)); break; case KDT_DATA_FLOAT: for (i=0; i<(N * D); i++) dest[i] = kd->data.f[start*D + i]; break; case KDT_DATA_U32: for (i=0; idata.u[(start + i)*D + d]); break; case KDT_DATA_U16: for (i=0; idata.s[(start + i)*D + d]); break; default: ERROR("kdtree_copy_data_double: invalid data type %i", kdtree_datatype(kd)); return; } } int kdtree_permute(const kdtree_t* tree, int ind) { if (!tree->perm) return ind; return tree->perm[ind]; } void kdtree_inverse_permutation(const kdtree_t* tree, int* invperm) { int i; if (!tree->perm) { for (i=0; indata; i++) invperm[i] = i; } else { for (i=0; indata; i++) { assert((int)(tree->perm[i]) >= 0); assert((int)(tree->perm[i]) < tree->ndata); invperm[tree->perm[i]] = i; } } } const char* kdtree_build_options_to_string(int opts) { static char buf[256]; sprintf(buf, "%s%s%s%s%s", (opts & KD_BUILD_BBOX) ? "BBOX ":"", (opts & KD_BUILD_SPLIT) ? "SPLIT ":"", (opts & KD_BUILD_SPLITDIM) ? "SPLITDIM ":"", (opts & KD_BUILD_NO_LR) ? "NOLR ":"", (opts & KD_BUILD_LINEAR_LR) ? "LINEARLR ":""); return buf; } const char* kdtree_kdtype_to_string(int kdtype) { switch (kdtype) { case KDT_DATA_DOUBLE: case KDT_TREE_DOUBLE: case KDT_EXT_DOUBLE: return "double"; case KDT_DATA_FLOAT: case KDT_TREE_FLOAT: case KDT_EXT_FLOAT: return "float"; case KDT_DATA_U32: case KDT_TREE_U32: return "u32"; case KDT_DATA_U16: case KDT_TREE_U16: return "u16"; default: return NULL; } } int kdtree_kdtype_parse_data_string(const char* str) { if (!str) return KDT_DATA_NULL; if (!strcmp(str, "double")) { return KDT_DATA_DOUBLE; } else if (!strcmp(str, "float")) { return KDT_DATA_FLOAT; } else if (!strcmp(str, "u32")) { return KDT_DATA_U32; } else if (!strcmp(str, "u16")) { return KDT_DATA_U16; } else return KDT_DATA_NULL; } int kdtree_kdtype_parse_tree_string(const char* str) { if (!str) return KDT_TREE_NULL; if (!strcmp(str, "double")) { return KDT_TREE_DOUBLE; } else if (!strcmp(str, "float")) { return KDT_TREE_FLOAT; } else if (!strcmp(str, "u32")) { return KDT_TREE_U32; } else if (!strcmp(str, "u16")) { return KDT_TREE_U16; } else return KDT_TREE_NULL; } int kdtree_kdtype_parse_ext_string(const char* str) { if (!str) return KDT_EXT_NULL; if (!strcmp(str, "double")) { return KDT_EXT_DOUBLE; } else if (!strcmp(str, "float")) { return KDT_EXT_FLOAT; } else return KDT_EXT_NULL; } int kdtree_kdtypes_to_treetype(int exttype, int treetype, int datatype) { // HACK - asserts here... return exttype | treetype | datatype; } kdtree_t* kdtree_new(int N, int D, int Nleaf) { kdtree_t* kd; int maxlevel, nnodes; maxlevel = kdtree_compute_levels(N, Nleaf); kd = CALLOC(1, sizeof(kdtree_t)); nnodes = (1 << maxlevel) - 1; kd->nlevels = maxlevel; kd->ndata = N; kd->ndim = D; kd->nnodes = nnodes; kd->nbottom = 1 << (maxlevel - 1); kd->ninterior = kd->nbottom - 1; assert(kd->nbottom + kd->ninterior == kd->nnodes); return kd; } void kdtree_set_limits(kdtree_t* kd, double* low, double* high) { int D = kd->ndim; if (!kd->minval) { kd->minval = MALLOC(D * sizeof(double)); } if (!kd->maxval) { kd->maxval = MALLOC(D * sizeof(double)); } memcpy(kd->minval, low, D * sizeof(double)); memcpy(kd->maxval, high, D * sizeof(double)); } double kdtree_get_conservative_query_radius(const kdtree_t* kd, double radius) { if (!kd->minval) { return radius; } return sqrt(radius* radius + kd->ndim * 0.25 * kd->invscale*kd->invscale); } int kdtree_compute_levels(int N, int Nleaf) { int nnodes = N / Nleaf; int maxlevel = 1; while (nnodes) { nnodes = nnodes >> 1; maxlevel++; } return maxlevel; } int kdtree_nnodes_to_nlevels(int Nnodes) { return an_flsB(Nnodes + 1); } /* This returns the NODE id (not leaf index) */ int kdtree_first_leaf(const kdtree_t* kd, int nodeid) { int dlevel; dlevel = (kd->nlevels - 1) - node_level(nodeid); return ((nodeid+1) << dlevel) - 1; } /* This returns the NODE id (not leaf index) */ int kdtree_last_leaf(const kdtree_t* kd, int nodeid) { int dlevel, twodl, nodeid_twodl; dlevel = (kd->nlevels - 1) - node_level(nodeid); twodl = (1 << dlevel); nodeid_twodl = (nodeid << dlevel); return nodeid_twodl + (twodl - 1)*2; } static int calculate_R(const kdtree_t* kd, int leafid) { int l; unsigned int mask, N, L; mask = (1 << (kd->nlevels-1)); N = kd->ndata; L = 0; // Compute the L index of the node one to the right of this node. int nextguy = leafid + 1; if (nextguy == kd->nbottom) return kd->ndata-1; for (l=0; l<(kd->nlevels-1); l++) { mask /= 2; if (nextguy & mask) { L += N/2; N = (N+1)/2; } else { N = N/2; } } L--; return L; } static int linear_lr(const kdtree_t* kd, int leafid) { return ((u64)leafid * kd->ndata) / kd->nbottom; } int kdtree_leaf_left(const kdtree_t* kd, int nodeid) { int leafid = nodeid - kd->ninterior; if (!leafid) return 0; if (kd->has_linear_lr) return linear_lr(kd, leafid); if (kd->lr) return kd->lr[leafid-1] + 1; return calculate_R(kd, leafid-1) + 1; } int kdtree_leaf_right(const kdtree_t* kd, int nodeid) { int leafid = nodeid - kd->ninterior; if (kd->has_linear_lr) return linear_lr(kd, leafid+1) - 1; if (kd->lr) return kd->lr[leafid]; return calculate_R(kd, leafid); } int kdtree_left(const kdtree_t* kd, int nodeid) { if (KD_IS_LEAF(kd, nodeid)) { return kdtree_leaf_left(kd, nodeid); } else { // leftmost child's L. int leftmost = kdtree_first_leaf(kd, nodeid); return kdtree_leaf_left(kd, leftmost); } } int kdtree_right(const kdtree_t* kd, int nodeid) { if (KD_IS_LEAF(kd, nodeid)) { return kdtree_leaf_right(kd, nodeid); } else { // rightmost child's R. int rightmost = kdtree_last_leaf(kd, nodeid); return kdtree_leaf_right(kd, rightmost); } } int kdtree_is_leaf_node_empty(const kdtree_t* kd, int nodeid) { int L, R; L = kdtree_leaf_left (kd, nodeid); R = kdtree_leaf_right(kd, nodeid); return (L == R+1); } int kdtree_is_node_empty(const kdtree_t* kd, int nodeid) { int L, R; L = kdtree_left (kd, nodeid); R = kdtree_right(kd, nodeid); return (L == R+1); } int kdtree_npoints(const kdtree_t* kd, int nodeid) { return 1 + kdtree_right(kd, nodeid) - kdtree_left(kd, nodeid); } void kdtree_free_query(kdtree_qres_t *kq) { if (!kq) return; FREE(kq->results.any); FREE(kq->sdists); FREE(kq->inds); FREE(kq); } void kdtree_free(kdtree_t *kd) { if (!kd) return; FREE(kd->name); FREE(kd->lr); FREE(kd->perm); FREE(kd->bb.any); FREE(kd->split.any); FREE(kd->splitdim); if (kd->free_data) FREE(kd->data.any); FREE(kd->minval); FREE(kd->maxval); //FREE(kd->fun); FREE(kd); } int kdtree_nearest_neighbour(const kdtree_t* kd, const void* pt, double* p_mindist2) { return kdtree_nearest_neighbour_within(kd, pt, HUGE_VAL, p_mindist2); } int kdtree_check(const kdtree_t* kd) { assert(kd->fun.check); return kd->fun.check(kd); } int kdtree_nearest_neighbour_within(const kdtree_t* kd, const void *pt, double maxd2, double* p_mindist2) { double bestd2 = maxd2; int ibest = -1; assert(kd->fun.nearest_neighbour_internal); kd->fun.nearest_neighbour_internal(kd, pt, &bestd2, &ibest); if (p_mindist2 && (ibest != -1)) *p_mindist2 = bestd2; return ibest; } KD_DECLARE(kdtree_node_node_mindist2, double, (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2)); double kdtree_node_node_mindist2(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2) { double res = HUGE_VAL; KD_DISPATCH(kdtree_node_node_mindist2, kd1->treetype, res=, (kd1, node1, kd2, node2)); return res; } KD_DECLARE(kdtree_node_node_maxdist2, double, (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2)); double kdtree_node_node_maxdist2(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2) { double res = HUGE_VAL; KD_DISPATCH(kdtree_node_node_maxdist2, kd1->treetype, res=, (kd1, node1, kd2, node2)); return res; } KD_DECLARE(kdtree_node_node_mindist2_exceeds, int, (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double maxd2)); int kdtree_node_node_mindist2_exceeds(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double dist2) { int res = FALSE; KD_DISPATCH(kdtree_node_node_mindist2_exceeds, kd1->treetype, res=, (kd1, node1, kd2, node2, dist2)); return res; } KD_DECLARE(kdtree_node_node_maxdist2_exceeds, int, (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double maxd2)); int kdtree_node_node_maxdist2_exceeds(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double dist2) { int res = FALSE; KD_DISPATCH(kdtree_node_node_maxdist2_exceeds, kd1->treetype, res=, (kd1, node1, kd2, node2, dist2)); return res; } KD_DECLARE(kdtree_node_point_mindist2, double, (const kdtree_t* kd, int node, const void* query)); double kdtree_node_point_mindist2(const kdtree_t* kd, int node, const void* pt) { double res = HUGE_VAL; KD_DISPATCH(kdtree_node_point_mindist2, kd->treetype, res=, (kd, node, pt)); return res; } KD_DECLARE(kdtree_node_point_maxdist2, double, (const kdtree_t* kd, int node, const void* query)); double kdtree_node_point_maxdist2(const kdtree_t* kd, int node, const void* pt) { double res = HUGE_VAL; KD_DISPATCH(kdtree_node_point_maxdist2, kd->treetype, res=, (kd, node, pt)); return res; } KD_DECLARE(kdtree_node_point_mindist2_exceeds, int, (const kdtree_t* kd, int node, const void* query, double maxd2)); int kdtree_node_point_mindist2_exceeds(const kdtree_t* kd, int node, const void* pt, double dist2) { int res = FALSE; KD_DISPATCH(kdtree_node_point_mindist2_exceeds, kd->treetype, res=, (kd, node, pt, dist2)); return res; } KD_DECLARE(kdtree_node_point_maxdist2_exceeds, int, (const kdtree_t* kd, int node, const void* query, double maxd2)); int kdtree_node_point_maxdist2_exceeds(const kdtree_t* kd, int node, const void* pt, double dist2) { int res = FALSE; KD_DISPATCH(kdtree_node_point_maxdist2_exceeds, kd->treetype, res=, (kd, node, pt, dist2)); return res; } void kdtree_nodes_contained(const kdtree_t* kd, const void* querylow, const void* queryhi, void (*callback_contained)(const kdtree_t* kd, int node, void* extra), void (*callback_overlap)(const kdtree_t* kd, int node, void* extra), void* cb_extra) { assert(kd->fun.nodes_contained); kd->fun.nodes_contained(kd, querylow, queryhi, callback_contained, callback_overlap, cb_extra); } int kdtree_get_bboxes(const kdtree_t* kd, int node, void* bblo, void* bbhi) { assert(kd->fun.get_bboxes); return kd->fun.get_bboxes(kd, node, bblo, bbhi); } void kdtree_fix_bounding_boxes(kdtree_t* kd) { assert(kd->fun.fix_bounding_boxes); kd->fun.fix_bounding_boxes(kd); } astrometry.net-0.67/libkd/kdtree_dim.c000644 000765 000024 00000003621 12651445460 020130 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "kdtree.h" #include "kdtree_internal.h" KD_DECLARE(kdtree_build_2, kdtree_t*, (kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options, double* minval, double* maxval)); /* Build a tree from an array of data, of size N*D*sizeof(real) */ /* If the root node is level 0, then maxlevel is the level at which there may * not be enough points to keep the tree complete (i.e. last level) */ kdtree_t* KDFUNC(kdtree_build_2) (kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options, double* minval, double* maxval) { KD_DISPATCH(kdtree_build_2, treetype, kd=, (kd, data, N, D, Nleaf, treetype, options, minval, maxval)); return kd; } /* Range seach */ kdtree_qres_t* KDFUNC(kdtree_rangesearch) (const kdtree_t *kd, const void *pt, double maxd2) { return KDFUNC(kdtree_rangesearch_options_reuse)(kd, NULL, pt, maxd2, KD_OPTIONS_COMPUTE_DISTS | KD_OPTIONS_SORT_DISTS); } kdtree_qres_t* KDFUNC(kdtree_rangesearch_nosort) (const kdtree_t *kd, const void *pt, double maxd2) { return KDFUNC(kdtree_rangesearch_options_reuse)(kd, NULL, pt, maxd2, KD_OPTIONS_COMPUTE_DISTS); } kdtree_qres_t* KDFUNC(kdtree_rangesearch_options) (const kdtree_t *kd, const void *pt, double maxd2, int options) { return KDFUNC(kdtree_rangesearch_options_reuse)(kd, NULL, pt, maxd2, options); } KD_DECLARE(kdtree_rangesearch_options, kdtree_qres_t*, (const kdtree_t* kd, kdtree_qres_t* res, const void* pt, double maxd2, int options)); kdtree_qres_t* KDFUNC(kdtree_rangesearch_options_reuse) (const kdtree_t *kd, kdtree_qres_t* res, const void *pt, double maxd2, int options) { assert(kd->fun.rangesearch); return kd->fun.rangesearch(kd, res, pt, maxd2, options); } astrometry.net-0.67/libkd/kdtree_fits_io.c000644 000765 000024 00000030153 12651445460 021013 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "kdtree_fits_io.h" #include "kdtree_internal.h" #include "kdtree_mem.h" #include "fitsioutils.h" #include "anqfits.h" #include "ioutils.h" #include "errors.h" #include "fitsbin.h" #include "tic.h" #include "log.h" // is the given table name one of the above strings? int kdtree_fits_column_is_kdtree(char* columnname) { return starts_with(columnname, KD_STR_HEADER) || starts_with(columnname, KD_STR_LR ) || starts_with(columnname, KD_STR_PERM ) || starts_with(columnname, KD_STR_BB ) || starts_with(columnname, KD_STR_SPLIT) || starts_with(columnname, KD_STR_SPLITDIM) || starts_with(columnname, KD_STR_DATA ) || starts_with(columnname, KD_STR_RANGE); } static int is_tree_header_ok(qfits_header* header, int* ndim, int* ndata, int* nnodes, unsigned int* treetype, int oldstyle) { unsigned int ext_type, int_type, data_type; char str[FITS_LINESZ+1]; if (oldstyle) { *ndim = qfits_header_getint(header, "NDIM", -1); *ndata = qfits_header_getint(header, "NDATA", -1); *nnodes = qfits_header_getint(header, "NNODES", -1); } else { *ndim = qfits_header_getint(header, "KDT_NDIM", -1); *ndata = qfits_header_getint(header, "KDT_NDAT", -1); *nnodes = qfits_header_getint(header, "KDT_NNOD", -1); } qfits_pretty_string_r(qfits_header_getstr(header, "KDT_EXT"), str); ext_type = kdtree_kdtype_parse_ext_string(str); qfits_pretty_string_r(qfits_header_getstr(header, "KDT_INT"), str); int_type = kdtree_kdtype_parse_tree_string(str); qfits_pretty_string_r(qfits_header_getstr(header, "KDT_DATA"), str); data_type = kdtree_kdtype_parse_data_string(str); // default: external world is doubles. if (ext_type == KDT_NULL) ext_type = KDT_EXT_DOUBLE; *treetype = kdtree_kdtypes_to_treetype(ext_type, int_type, data_type); if ((*ndim > -1) && (*ndata > -1) && (*nnodes > -1) && (int_type != KDT_NULL) && (data_type != KDT_NULL) && (fits_check_endian(header) == 0)) { return 1; } return 0; } kdtree_t* kdtree_fits_read(const char* fn, const char* treename, qfits_header** p_hdr) { kdtree_fits_t* io; kdtree_t* kd; io = kdtree_fits_open(fn); if (!io) { ERROR("Failed to open FITS file \"%s\"", fn); return NULL; } kd = kdtree_fits_read_tree(io, treename, p_hdr); if (!kd) { if (treename) ERROR("Failed to read kdtree named \"%s\" from file %s", treename, fn); else ERROR("Failed to read kdtree from file %s", fn); kdtree_fits_io_close(io); return NULL; } return kd; } static int write_convenience(const kdtree_t* kd, const char* fn, const qfits_header* hdr, anbool flipped) { kdtree_fits_t* io; int rtn; io = kdtree_fits_open_for_writing(fn); if (!io) { ERROR("Failed to open file %s for writing", fn); return -1; } if (flipped) rtn = kdtree_fits_write_tree_flipped(io, kd, hdr); else rtn = kdtree_fits_write_tree(io, kd, hdr); kdtree_fits_io_close(io); if (rtn) { ERROR("Failed to write kdtree to file %s", fn); } return rtn; } int kdtree_fits_write_flipped(const kdtree_t* kdtree, const char* fn, const qfits_header* hdr) { return write_convenience(kdtree, fn, hdr, TRUE); } int kdtree_fits_write(const kdtree_t* kdtree, const char* fn, const qfits_header* hdr) { return write_convenience(kdtree, fn, hdr, FALSE); } /* bl* kdtree_fits_get_chunks(const kdtree_t* kd) { bl* chunks = bl_new(4, sizeof(fitsbin_chunk_t)); fitsbin_chunk_t chunk; qfits_header* hdr; fitsbin_chunk_init(&chunk); chunk.tablename = ""; hdr = fitsbin_get_chunk_header(NULL, &chunk); fits_add_endian(hdr); fits_header_addf (hdr, "KDT_NAME", "kdtree: name of this tree", "'%s'", kd->name ? kd->name : ""); fits_header_add_int(hdr, "KDT_NDAT", kd->ndata, "kdtree: number of data points"); fits_header_add_int(hdr, "KDT_NDIM", kd->ndim, "kdtree: number of dimensions"); fits_header_add_int(hdr, "KDT_NNOD", kd->nnodes, "kdtree: number of nodes"); fits_header_add_int(hdr, "KDT_VER", KDTREE_FITS_VERSION, "kdtree: version number"); bl_append(chunks, &chunk); } */ fitsbin_t* kdtree_fits_get_fitsbin(kdtree_fits_t* io) { return io; } const fitsbin_t* get_fitsbin_const(const kdtree_fits_t* io) { return io; } kdtree_fits_t* kdtree_fits_open(const char* fn) { return fitsbin_open(fn); } kdtree_fits_t* kdtree_fits_open_fits(anqfits_t* fits) { return fitsbin_open_fits(fits); } kdtree_fits_t* kdtree_fits_open_for_writing(const char* fn) { return fitsbin_open_for_writing(fn); } qfits_header* kdtree_fits_get_primary_header(kdtree_fits_t* io) { return fitsbin_get_primary_header(kdtree_fits_get_fitsbin(io)); } int kdtree_fits_read_chunk(kdtree_fits_t* io, fitsbin_chunk_t* chunk) { int rtn; //double t0 = timenow(); rtn = fitsbin_read_chunk(io, chunk); //debug("kdtree_fits_read_chunk(%s) took %g ms\n", chunk->tablename, 1000. * (timenow() - t0)); return rtn; } // declarations KD_DECLARE(kdtree_read_fits, int, (kdtree_fits_t* io, kdtree_t* kd)); KD_DECLARE(kdtree_write_fits, int, (kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr, anbool flip_endian, FILE* fid)); static qfits_header* find_tree(const char* treename, const fitsbin_t* fb, int* ndim, int* ndata, int* nnodes, unsigned int* tt, char** realname) { qfits_header* header; int i, nexten; char* fn = fb->filename; if (!treename) { // Look in the primary header... header = fitsbin_get_primary_header(fb); if (is_tree_header_ok(header, ndim, ndata, nnodes, tt, 1)) { header = qfits_header_copy(header); *realname = NULL; return header; } } // treat empty treename as NULL... if (treename && !treename[0]) treename = NULL; // scan the extension headers, looking for one that contains a matching KDT_NAME entry. nexten = fitsbin_n_ext(fb); header = NULL; for (i=1; ifilename; //double t0; kd = CALLOC(1, sizeof(kdtree_t)); if (!kd) { SYSERROR("Couldn't allocate kdtree"); return NULL; } header = find_tree(treename, fb, &ndim, &ndata, &nnodes, &tt, &kd->name); if (!header) { // Not found. if (treename) ERROR("Kdtree header for a tree named \"%s\" was not found in file %s", treename, fn); else ERROR("Kdtree header was not found in file %s", fn); FREE(kd); return NULL; } kd->has_linear_lr = qfits_header_getboolean(header, "KDT_LINL", 0); if (p_hdr) *p_hdr = header; else qfits_header_destroy(header); kd->ndata = ndata; kd->ndim = ndim; kd->nnodes = nnodes; kd->nbottom = (nnodes+1)/2; kd->ninterior = nnodes - kd->nbottom; kd->nlevels = kdtree_nnodes_to_nlevels(nnodes); kd->treetype = tt; //t0 = timenow(); KD_DISPATCH(kdtree_read_fits, tt, rtn = , (io, kd)); //debug("kdtree_read_fits(%s) took %g ms\n", fn, 1000. * (timenow() - t0)); if (rtn) { FREE(kd->name); FREE(kd); return NULL; } kdtree_update_funcs(kd); kd->io = io; return kd; } int kdtree_fits_write_chunk(kdtree_fits_t* io, fitsbin_chunk_t* chunk) { fitsbin_t* fb = kdtree_fits_get_fitsbin(io); if (fitsbin_write_chunk(fb, chunk)) { ERROR("Failed to write kdtree extra chunk"); return -1; } return 0; } int kdtree_fits_write_chunk_to(fitsbin_chunk_t* chunk, FILE* fid) { if (fitsbin_write_chunk_to(NULL, chunk, fid)) { ERROR("Failed to write kdtree extra chunk"); return -1; } return 0; } int kdtree_fits_write_chunk_flipped(kdtree_fits_t* io, fitsbin_chunk_t* chunk, int wordsize) { fitsbin_t* fb = kdtree_fits_get_fitsbin(io); if (fitsbin_write_chunk_flipped(fb, chunk, wordsize)) { ERROR("Failed to write (flipped) kdtree extra chunk"); return -1; } return 0; } // just writes the tree, no primary header. int kdtree_fits_append_tree(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr) { int rtn = -1; KD_DISPATCH(kdtree_write_fits, kd->treetype, rtn = , (io, kd, inhdr, FALSE, NULL)); return rtn; } int kdtree_fits_append_tree_to(kdtree_t* kd, const qfits_header* inhdr, FILE* fid) { int rtn = -1; KD_DISPATCH(kdtree_write_fits, kd->treetype, rtn = , (NULL, kd, inhdr, FALSE, fid)); return rtn; } int kdtree_fits_append_tree_flipped(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr) { int rtn = -1; KD_DISPATCH(kdtree_write_fits, kd->treetype, rtn = , (io, kd, inhdr, TRUE, NULL)); return rtn; } // just writes the tree, no primary header. int kdtree_fits_write_primary_header(kdtree_fits_t* io, const qfits_header* inhdr) { fitsbin_t* fb; qfits_header* hdr; fb = kdtree_fits_get_fitsbin(io); if (inhdr) { hdr = fitsbin_get_primary_header(fb); fits_copy_all_headers(inhdr, hdr, NULL); } return fitsbin_write_primary_header(fb); } int kdtree_fits_write_tree(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr) { return (kdtree_fits_write_primary_header(io, NULL) || kdtree_fits_append_tree(io, kd, inhdr)); } int kdtree_fits_write_tree_flipped(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr) { return (kdtree_fits_write_primary_header(io, NULL) || kdtree_fits_append_tree_flipped(io, kd, inhdr)); } int kdtree_fits_io_close(kdtree_fits_t* io) { fitsbin_t* fb; fb = kdtree_fits_get_fitsbin(io); return fitsbin_close(fb); } int kdtree_fits_close(kdtree_t* kd) { if (!kd) return 0; // FIXME - erm, this will double-free if we try to read and then free // multiple kdtrees from one file... reference count?? if (kd->io) kdtree_fits_io_close(kd->io); FREE(kd->name); FREE(kd); return 0; } astrometry.net-0.67/libkd/kdtree_internal.c000644 000765 000024 00000231550 12651445460 021177 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "kdtree.h" #include "kdtree_internal.h" #include "kdtree_mem.h" #include "keywords.h" #include "errors.h" #define KDTREE_MAX_RESULTS 1000 #define KDTREE_MAX_DIM 100 #define WARNING(x, ...) fprintf(stderr, x, ## __VA_ARGS__) #define MANGLE(x) KDMANGLE(x, ETYPE, DTYPE, TTYPE) /* The "external" type is the data type that the outside world works in. The "data" type is the type in which we store the points. The "tree" type is the type in which we store the bounding boxes or splitting planes. Recall that etype >= dtype >= ttype: . (etype >= dtype: because there's no point storing more precision than needed by the . outside world; . dtype >= ttype: because there's no point keeping more precision in the splitting . plane than exists in the data.) The following will be defined: - etype: typedef, the "external" type. - ETYPE_INTEGER: 1 if the "external" space is integral (not floating-point) - ETYPE_MIN - ETYPE_MAX: the limits of the "external" space. - ETYPE: the "external" type, in a form that the preprocessor can make C . identifiers out of it: eg 'd' for double; use this to get to the . particular data type in the kdtree unions: . kdtree_qres_t* query_results = ...; . etype* mydata = query_results.results.ETYPE; - dtype: typedef, the "data" type. - DTYPE_INTEGER: 1 if the "data" space is integral (not floating-point) - DTYPE_DOUBLE: 1 if the "data" space has type 'double'. - DTYPE_MIN - DTYPE_MAX: the limits of the "data" space. - DTYPE_KDT_DATA: eg KDT_DATA_DOUBLE - DTYPE: the "data" type, in a form that the preprocessor can make C . identifiers out of it: eg 'd' for double: . dtype* mydata = kd->data.DTYPE; - ttype: typedef, the "tree" type. - TTYPE_INTEGER: 1 if the "tree" space is integral (not floating-point) - TTYPE_MIN - TTYPE_MAX: the limits of the "tree" space. - TTYPE_SQRT_MAX: the square root of the maximum value of the "tree" space. - TTYPE: the "tree" type, in a form that the preprocessor can make C . identifiers out of it: eg 'd' for double. . ttype* mybb = kd->bb.TTYPE; - bigttype: typedef, a type that can hold a "ttype" squared. - BIGTTYPE: #define the bigttype; used for "STRINGIFY" macro. - BIGTTYPE_MAX: maximum value of a 'bigttype'. - EQUAL_ED: 1 if "external" and "data" spaces are the same. - EQUAL_DT: 1 if "data" and "tree" spaces are the same. - EQUAL_ET: 1 if "external" and "tree" spaces are the same; implies EQUAL_ED && EQUAL_DT. - POINT_ED(kd, d, c, func): d: dimension; . c: coordinate in that dimension, . func: function to apply (may be empty) . Converts a coordinate from "external" to "data" space. . eg POINT_ED(kd, 0, 0.1, floor); . POINT_ED(kd, 1, 0.0, ); - POINT_DT(kd, d, c, func): . Converts a coordinate from "data" to "tree" space. - POINT_ET(kd, d, c, func): . Converts a coordinate from "external" to "tree" space. - POINT_TD(kd, d, c): . Converts a coordinate from "tree" to "data" space. - POINT_DE(kd, d, c): . Converts a coordinate from "data" to "external" space. - POINT_TE(kd, d, c): . Converts a coordinate from "tree" to "external" space. - DIST_ED(kd, dist, func): - DIST2_ED(kd, dist2, func): . Convert distance or distance-squared from "external" to "data" space, . optionally applying a function to the result. - DIST_DT(kd, dist, func): - DIST2_DT(kd, dist2, func): . Convert distance or distance-squared from "data" to "tree" space. - DIST_ET(kd, dist, func): - DIST2_ET(kd, dist2, func): . Convert distance or distance-squared from "external" to "tree" space. - DIST_TD(kd, dist): - DIST2_TD(kd, dist2): . Convert distance or distance-squared from "tree" to "data" space. - DIST_DE(kd, dist): - DIST2_DE(kd, dist2): . Convert distance or distance-squared from "data" to "external" space. - DIST_TE(kd, dist): - DIST2_TE(kd, dist2): . Convert distance or distance-squared from "tree" to "external" space. */ // Which function do we use for rounding? #define KD_ROUND rint // Get the low corner of the bounding box #define LOW_HR( kd, D, i) ((kd)->bb.TTYPE + (2*(i)*(D))) // Get the high corner of the bounding box #define HIGH_HR(kd, D, i) ((kd)->bb.TTYPE + ((2*(i)+1)*(D))) // Get the splitting-plane position #define KD_SPLIT(kd, i) ((kd)->split.TTYPE + (i)) // Get a pointer to the 'i'-th data point. #define KD_DATA(kd, D, i) ((kd)->data.DTYPE + ((D)*(i))) // Get the 'i'-th element of the permutation vector, or 'i' if there is no permutation vector. #define KD_PERM(kd, i) ((kd)->perm ? (kd)->perm[i] : i) // Get the dimension of this tree. #if defined(KD_DIM) #define DIMENSION(kd) (KD_DIM) #else #define DIMENSION(kd) (kd->ndim) #endif // Get the size of a single point in the tree. #define SIZEOF_PT(kd) (sizeof(dtype)*DIMENSION(kd)) // compatibility macros (for DEPRECATED old-fashioned trees) #define COMPAT_NODE_SIZE(kd) (sizeof(kdtree_node_t) + (SIZEOF_PT(kd) * 2)) #define COMPAT_HIGH_HR(kd, i) ((ttype*)(((char*)(kd)->nodes) \ + COMPAT_NODE_SIZE(kd)*(i) \ + sizeof(kdtree_node_t) \ + SIZEOF_PT(kd))) #define COMPAT_LOW_HR(kd, i) ((ttype*) (((char*)(kd)->nodes) \ + COMPAT_NODE_SIZE(kd)*(i) \ + sizeof(kdtree_node_t))) // "converted" <-> "dtype" conversion. #define POINT_CTOR(kd, d, val) (((val) - ((kd)->minval[(d)])) * (kd)->scale) #define POINT_RTOC(kd, d, val) (((val) * ((kd)->invscale)) + (kd)->minval[d]) #define DIST_CTOR(kd, dist) ((dist) * (kd)->scale) #define DIST2_CTOR(kd, dist2) ((dist2) * (kd)->scale * (kd)->scale) #define DIST2_RTOC(kd, dist2) ((dist2) * (kd)->invscale * (kd)->invscale) // this must be at least as big as the biggest integer TTYPE. typedef u32 bigint; #define ACTUAL_STRINGIFY(x) (#x) #define STRINGIFY(x) ACTUAL_STRINGIFY(x) #define MYGLUE2(a, b) a ## b #define DIST_FUNC_MANGLE(x, suffix) MYGLUE2(x, suffix) /* static void split_dim_and_value(kdtree_t* kd, int node, uint8_t* splitdim, ttype* splitval) { if (kd->splitdim) { *splitdim = kd->splitdim[node]; *splitval = *KD_SPLIT(kd, node); } else { bigint tmpsplit = *KD_SPLIT(kd, node); *splitdim = (uint8_t)(tmpsplit & kd->dimmask); *splitval = (ttype)(tmpsplit & kd->splitmask); } } */ /* min/maxdist functions. */ #define CAN_OVERFLOW 0 #undef DELTAMAX #define PTYPE etype #define DISTTYPE double #define FUNC_SUFFIX #include "kdtree_internal_dists.c" #undef PTYPE #undef DISTTYPE #undef FUNC_SUFFIX #undef CAN_OVERFLOW #define CAN_OVERFLOW 1 #define PTYPE ttype #define DISTTYPE ttype #define FUNC_SUFFIX _ttype #define DELTAMAX TTYPE_SQRT_MAX #include "kdtree_internal_dists.c" #undef PTYPE #undef DISTTYPE #undef FUNC_SUFFIX #undef DELTAMAX #define PTYPE ttype #define DISTTYPE bigttype #define FUNC_SUFFIX _bigttype #undef DELTAMAX #include "kdtree_internal_dists.c" #undef PTYPE #undef DISTTYPE #undef FUNC_SUFFIX #undef CAN_OVERFLOW void MANGLE(kdtree_update_funcs)(kdtree_t* kd); static anbool bboxes(const kdtree_t* kd, int node, ttype** p_tlo, ttype** p_thi, int D) { if (kd->bb.any) { // bb trees *p_tlo = LOW_HR(kd, D, node); *p_thi = HIGH_HR(kd, D, node); return TRUE; } else { return FALSE; } } static inline double dist2(const kdtree_t* kd, const etype* q, const dtype* p, int D) { int d; double d2 = 0.0; #if defined(KD_DIM) D = KD_DIM; #endif for (d=0; d pp) delta = q[d] - pp; else delta = pp - q[d]; } else { delta = q[d] - pp; } d2 += delta * delta; } return d2; } static inline void dist2_bailout(const kdtree_t* kd, const etype* q, const dtype* p, int D, double maxd2, anbool* bailedout, double* d2res) { int d; double d2 = 0.0; #if defined(KD_DIM) D = KD_DIM; #endif for (d=0; d pp) delta = q[d] - pp; else delta = pp - q[d]; } else { delta = q[d] - pp; } */ delta = q[d] - pp; d2 += delta * delta; if (d2 > maxd2) { *bailedout = TRUE; return; } } *d2res = d2; } static inline void ddist2_bailout(const kdtree_t* kd, const dtype* q, const dtype* p, int D, bigttype maxd2, anbool* bailedout, bigttype* d2res) { int d; bigttype d2 = 0; #if defined(KD_DIM) D = KD_DIM; #endif for (d=0; d p[d]) delta = q[d] - p[d]; else delta = p[d] - q[d]; d2 += (bigttype)delta * (bigttype)delta; if (d2 > maxd2) { *bailedout = TRUE; return; } } *d2res = d2; } static inline anbool dist2_exceeds(const kdtree_t* kd, const etype* q, const dtype* p, int D, double maxd2) { int d; double d2 = 0.0; #if defined(KD_DIM) D = KD_DIM; #endif for (d=0; d pp) delta = q[d] - pp; else delta = pp - q[d]; } else { delta = q[d] - pp; } d2 += delta * delta; if (d2 > maxd2) return 1; } return 0; } static anbool bb_point_l1mindist_exceeds_ttype(ttype* lo, ttype* hi, ttype* query, int D, ttype maxl1, ttype maxlinf) { ttype dist = 0; ttype newdist; ttype delta; int d; #if defined(KD_DIM) D = KD_DIM; #endif for (d=0; d hi[d]) delta = query[d] - hi[d]; else continue; if (delta > maxlinf) { //printf("linf: %u > %u.\n", (unsigned int)delta, (unsigned int)maxlinf); return TRUE; } newdist = dist + delta; if (newdist < dist) { // overflow! return TRUE; } if (newdist > maxl1) { //printf("l1: %u > %u\n", (unsigned int)newdist, (unsigned int)maxl1); return TRUE; } dist = newdist; } return FALSE; } static void compute_splitbits(kdtree_t* kd) { int D; int bits; u32 val; D = kd->ndim; bits = 0; val = 1; while (val < D) { bits++; val *= 2; } kd->dimmask = val - 1; kd->dimbits = bits; kd->splitmask = ~kd->dimmask; } /* Sorts results by kq->sdists */ static int kdtree_qsort_results(kdtree_qres_t *kq, int D) { int beg[KDTREE_MAX_RESULTS], end[KDTREE_MAX_RESULTS], i = 0, j, L, R; static etype piv_vec[KDTREE_MAX_DIM]; unsigned int piv_perm; double piv; beg[0] = 0; end[0] = kq->nres - 1; while (i >= 0) { L = beg[i]; R = end[i]; if (L < R) { piv = kq->sdists[L]; for (j=0; jresults.ETYPE[L*D + j]; piv_perm = kq->inds[L]; if (i == KDTREE_MAX_RESULTS - 1) /* Sanity */ assert(0); while (L < R) { while (kq->sdists[R] >= piv && L < R) R--; if (L < R) { for (j=0; jresults.ETYPE[L*D + j] = kq->results.ETYPE[R*D + j]; kq->inds [L] = kq->inds [R]; kq->sdists[L] = kq->sdists[R]; L++; } while (kq->sdists[L] <= piv && L < R) L++; if (L < R) { for (j=0; jresults.ETYPE[R*D + j] = kq->results.ETYPE[L*D + j]; kq->inds [R] = kq->inds [L]; kq->sdists[R] = kq->sdists[L]; R--; } } for (j=0; jresults.ETYPE[D*L + j] = piv_vec[j]; kq->inds [L] = piv_perm; kq->sdists[L] = piv; beg[i + 1] = L + 1; end[i + 1] = end[i]; end[i++] = L; } else i--; } return 1; } static void print_results(kdtree_qres_t* res, int D) { if (TRUE) { int i, d; printf("%i results.\n", res->nres); for (i=0; inres; i++) { printf(" ind %i", res->inds[i]); if (res->sdists) printf(", dist %g", res->sdists[i]); if (res->results.any) { printf(", pt [ "); for (d=0; dresults.ETYPE[i*D + d]); printf("]"); } printf("\n"); } printf("\n"); } } static anbool resize_results(kdtree_qres_t* res, int newsize, int D, anbool do_dists, anbool do_points) { if (FALSE) { printf("resize results: before:\n"); print_results(res, D); } if (do_dists) res->sdists = REALLOC(res->sdists , newsize * sizeof(double)); if (do_points) res->results.any = REALLOC(res->results.any, newsize * D * sizeof(etype)); res->inds = REALLOC(res->inds, newsize * sizeof(u32)); if (newsize && (!res->results.any || (do_dists && !res->sdists) || !res->inds)) SYSERROR("Failed to resize kdtree results arrays"); res->capacity = newsize; if (FALSE) { printf("resize results: after:\n"); print_results(res, D); } return TRUE; } static anbool add_result(const kdtree_t* kd, kdtree_qres_t* res, double sdist, unsigned int ind, const dtype* pt, int D, anbool do_dists, anbool do_points) { if (FALSE) { printf("Before adding new result:\n"); print_results(res, D); } if (do_dists) res->sdists[res->nres] = sdist; res->inds [res->nres] = ind; if (do_points) { int d; for (d=0; dresults.ETYPE[res->nres * D + d] = POINT_DE(kd, d, pt[d]); } res->nres++; if (res->nres == res->capacity) { // enlarge arrays. return resize_results(res, res->capacity * 2, D, do_dists, do_points); } if (FALSE) { printf("After adding new result:\n"); print_results(res, D); } return TRUE; } /* Can the query be represented as a ttype? If so, place the converted value in "tquery". */ static anbool ttype_query(const kdtree_t* kd, const etype* query, ttype* tquery) { etype val; int d, D=kd->ndim; for (d=0; d TTYPE_MAX) return FALSE; tquery[d] = (ttype)val; } return TRUE; } double MANGLE(kdtree_get_splitval)(const kdtree_t* kd, int nodeid) { Unused int dim; ttype split = *KD_SPLIT(kd, nodeid); if (EQUAL_ET) { return split; } if (!kd->splitdim && TTYPE_INTEGER) { bigint tmpsplit = split; dim = tmpsplit & kd->dimmask; return POINT_TE(kd, dim, tmpsplit & kd->splitmask); } else { dim = kd->splitdim[nodeid]; } return POINT_TE(kd, dim, split); } static void kdtree_nn_bb(const kdtree_t* kd, const etype* query, double* p_bestd2, int* p_ibest) { int nodestack[100]; double dist2stack[100]; int stackpos = 0; int D = (kd ? kd->ndim : 0); anbool use_tquery = FALSE; anbool use_tmath = FALSE; anbool use_bigtmath = FALSE; ttype tquery[D]; double bestd2 = *p_bestd2; int ibest = *p_ibest; ttype tl2 = 0; bigttype bigtl2 = 0; #if defined(KD_DIM) assert(kd->ndim == KD_DIM); D = KD_DIM; #else D = kd->ndim; #endif if (TTYPE_INTEGER) { use_tquery = ttype_query(kd, query, tquery); } if (TTYPE_INTEGER && use_tquery) { double dtl2 = DIST2_ET(kd, bestd2, ); if (dtl2 < TTYPE_MAX) { use_tmath = TRUE; } else if (dtl2 < BIGTTYPE_MAX) { use_bigtmath = TRUE; } bigtl2 = ceil(dtl2); tl2 = bigtl2; } // queue root. nodestack[0] = 0; dist2stack[0] = 0.0; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, 0, 1); while (stackpos >= 0) { int nodeid; int i; int L, R; ttype *tlo=NULL, *thi=NULL; int child; double childd2[2]; double firstd2, secondd2; int firstid, secondid; if (dist2stack[stackpos] > bestd2) { // pruned! if (kd->fun.nn_prune) kd->fun.nn_prune(kd, nodestack[stackpos], dist2stack[stackpos], bestd2, 1); stackpos--; continue; } nodeid = nodestack[stackpos]; stackpos--; if (kd->fun.nn_explore) kd->fun.nn_explore(kd, nodeid, dist2stack[stackpos+1], bestd2); if (KD_IS_LEAF(kd, nodeid)) { // Back when leaf nodes didn't have BBoxes: //|| KD_IS_LEAF(kd, KD_CHILD_LEFT(nodeid))) dtype* data; L = kdtree_left(kd, nodeid); R = kdtree_right(kd, nodeid); for (i=L; i<=R; i++) { anbool bailedout = FALSE; double dsqd; if (kd->fun.nn_point) kd->fun.nn_point(kd, nodeid, i); data = KD_DATA(kd, D, i); dist2_bailout(kd, query, data, D, bestd2, &bailedout, &dsqd); if (bailedout) continue; // new best ibest = i; bestd2 = dsqd; if (kd->fun.nn_new_best) kd->fun.nn_new_best(kd, nodeid, i, bestd2); } continue; } childd2[0] = childd2[1] = HUGE_VAL; for (child=0; child<2; child++) { anbool bailed; double dist2; int childid = (child ? KD_CHILD_RIGHT(nodeid) : KD_CHILD_LEFT(nodeid)); bboxes(kd, childid, &tlo, &thi, D); bailed = FALSE; if (TTYPE_INTEGER && use_tmath) { ttype newd2 = 0; bb_point_mindist2_bailout_ttype(tlo, thi, tquery, D, tl2, &bailed, &newd2); if (bailed) { if (kd->fun.nn_prune) kd->fun.nn_prune(kd, nodeid, newd2, bestd2, 2); continue; } dist2 = DIST2_TE(kd, newd2); } else if (TTYPE_INTEGER && use_bigtmath) { bigttype newd2 = 0; bb_point_mindist2_bailout_bigttype(tlo, thi, tquery, D, bigtl2, &bailed, &newd2); if (bailed) { if (kd->fun.nn_prune) kd->fun.nn_prune(kd, nodeid, newd2, bestd2, 3); continue; } dist2 = DIST2_TE(kd, newd2); } else { etype bblo, bbhi; int d; // this is just bb_point_mindist2_bailout... dist2 = 0.0; for (d=0; d bbhi) { dist2 += (query[d] - bbhi)*(query[d] - bbhi); } else continue; } if (dist2 > bestd2) { bailed = TRUE; break; } } if (bailed) { if (kd->fun.nn_prune) kd->fun.nn_prune(kd, childid, dist2, bestd2, 4); continue; } } childd2[child] = dist2; } if (childd2[0] <= childd2[1]) { firstd2 = childd2[0]; secondd2 = childd2[1]; firstid = KD_CHILD_LEFT(nodeid); secondid = KD_CHILD_RIGHT(nodeid); } else { firstd2 = childd2[1]; secondd2 = childd2[0]; firstid = KD_CHILD_RIGHT(nodeid); secondid = KD_CHILD_LEFT(nodeid); } if (firstd2 == HUGE_VAL) continue; // it's a stack, so put the "second" one on first. if (secondd2 != HUGE_VAL) { stackpos++; nodestack[stackpos] = secondid; dist2stack[stackpos] = secondd2; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, secondid, 2); } stackpos++; nodestack[stackpos] = firstid; dist2stack[stackpos] = firstd2; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, firstid, 2); } *p_bestd2 = bestd2; *p_ibest = ibest; } static void kdtree_nn_int_split(const kdtree_t* kd, const etype* query, const ttype* tquery, double* p_bestd2, int* p_ibest) { int nodestack[100]; ttype mindists[100]; int stackpos = 0; int D = kd->ndim; ttype closest_so_far; bigttype closest2; int ibest = -1; dtype* data; dtype* dquery = (dtype*)tquery; /** FIXME **/ assert(sizeof(dtype) == sizeof(ttype)); { double closest; closest = DIST_ET(kd, sqrt(*p_bestd2), ); if (closest > TTYPE_MAX) { closest_so_far = TTYPE_MAX; closest2 = BIGTTYPE_MAX; } else { closest_so_far = ceil(closest); closest2 = (bigttype)closest_so_far * (bigttype)closest_so_far; } } // queue root. nodestack[0] = 0; mindists[0] = 0; while (stackpos >= 0) { int nodeid; int i; int dim = -1; int L, R; ttype split = 0; if (mindists[stackpos] > closest_so_far) { // pruned! stackpos--; continue; } nodeid = nodestack[stackpos]; stackpos--; if (KD_IS_LEAF(kd, nodeid)) { int oldbest = ibest; L = kdtree_left(kd, nodeid); R = kdtree_right(kd, nodeid); for (i=L; i<=R; i++) { anbool bailedout = FALSE; bigttype dsqd; data = KD_DATA(kd, D, i); ddist2_bailout(kd, dquery, data, D, closest2, &bailedout, &dsqd); if (bailedout) continue; // new best ibest = i; closest2 = dsqd; } if (oldbest != ibest) { // FIXME - replace with int sqrt closest_so_far = ceil(sqrt((double)closest2)); } continue; } // split/dim trees split = *KD_SPLIT(kd, nodeid); if (kd->splitdim) dim = kd->splitdim[nodeid]; else { bigint tmpsplit; tmpsplit = split; dim = tmpsplit & kd->dimmask; split = tmpsplit & kd->splitmask; } if (tquery[dim] < split) { // query is on the "left" side of the split. assert(query[dim] < POINT_TE(kd, dim, split)); // is the right child within range? // look mum, no int overflow! if (split - tquery[dim] <= closest_so_far) { // visit right child - it is within range. assert(POINT_TE(kd, dim, split) - query[dim] > 0.0); //assert(POINT_TE(kd, dim, split) - query[dim] <= bestdist); stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); mindists[stackpos] = split - tquery[dim]; } stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); mindists[stackpos] = 0; } else { // query is on "right" side. assert(POINT_TE(kd, dim, split) <= query[dim]); // is the left child within range? if (tquery[dim] - split < closest_so_far) { assert(query[dim] - POINT_TE(kd, dim, split) >= 0.0); //assert(query[dim] - POINT_TE(kd, dim, split) < bestdist); stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); mindists[stackpos] = tquery[dim] - split; } stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); mindists[stackpos] = 0; } } if (ibest != -1) { //*p_bestd2 = DIST2_TE(kd, closest2); // Recompute the d2 more precisely in "etype": data = KD_DATA(kd, D, ibest); *p_bestd2 = dist2(kd, query, data, D); *p_ibest = ibest; } } void MANGLE(kdtree_nn)(const kdtree_t* kd, const void* vquery, double* p_bestd2, int* p_ibest) { int nodestack[100]; double dist2stack[100]; int stackpos = 0; int D = (kd ? kd->ndim : 0); double bestd2 = *p_bestd2; int ibest = *p_ibest; const etype* query = vquery; if (!kd) { WARNING("kdtree_nn: null tree!\n"); return; } // Bounding boxes if (!kd->split.any) { kdtree_nn_bb(kd, query, p_bestd2, p_ibest); return; } #if defined(KD_DIM) assert(kd->ndim == KD_DIM); D = KD_DIM; #else D = kd->ndim; #endif // Integers. if (TTYPE_INTEGER) { ttype tquery[D]; if (ttype_query(kd, query, tquery)) { kdtree_nn_int_split(kd, query, tquery, p_bestd2, p_ibest); return; } } // We got splitting planes, and the splits are either doubles, or ints // but the query doesn't find into the integer range. // queue root. nodestack[0] = 0; dist2stack[0] = 0.0; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, 0, 1); while (stackpos >= 0) { int nodeid; int i; int dim = -1; int L, R; ttype split = 0; double del; etype rsplit; int nearchild; int farchild; double fard2; if (dist2stack[stackpos] > bestd2) { // pruned! if (kd->fun.nn_prune) kd->fun.nn_prune(kd, nodestack[stackpos], dist2stack[stackpos], bestd2, 1); stackpos--; continue; } nodeid = nodestack[stackpos]; stackpos--; if (kd->fun.nn_explore) kd->fun.nn_explore(kd, nodeid, dist2stack[stackpos+1], bestd2); if (KD_IS_LEAF(kd, nodeid)) { dtype* data; L = kdtree_left(kd, nodeid); R = kdtree_right(kd, nodeid); for (i=L; i<=R; i++) { anbool bailedout = FALSE; double dsqd; if (kd->fun.nn_point) kd->fun.nn_point(kd, nodeid, i); data = KD_DATA(kd, D, i); dist2_bailout(kd, query, data, D, bestd2, &bailedout, &dsqd); if (bailedout) continue; // new best ibest = i; bestd2 = dsqd; if (kd->fun.nn_new_best) kd->fun.nn_new_best(kd, nodeid, i, bestd2); } continue; } // split/dim trees split = *KD_SPLIT(kd, nodeid); if (kd->splitdim) { dim = kd->splitdim[nodeid]; } else { // packed int bigint tmpsplit = split; dim = tmpsplit & kd->dimmask; split = tmpsplit & kd->splitmask; } rsplit = POINT_TE(kd, dim, split); del = query[dim] - rsplit; fard2 = del*del; if (query[dim] < rsplit) { nearchild = KD_CHILD_LEFT (nodeid); farchild = KD_CHILD_RIGHT(nodeid); } else { nearchild = KD_CHILD_RIGHT(nodeid); farchild = KD_CHILD_LEFT (nodeid); } if (fard2 <= bestd2) { // is the far child within range? stackpos++; nodestack[stackpos] = farchild; dist2stack[stackpos] = fard2; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, farchild, 8); } else { if (kd->fun.nn_prune) kd->fun.nn_prune(kd, farchild, fard2, bestd2, 7); } // stack near child. stackpos++; nodestack[stackpos] = nearchild; dist2stack[stackpos] = 0.0; if (kd->fun.nn_enqueue) kd->fun.nn_enqueue(kd, nearchild, 9); } *p_bestd2 = bestd2; *p_ibest = ibest; } kdtree_qres_t* MANGLE(kdtree_rangesearch_options) (const kdtree_t* kd, kdtree_qres_t* res, const void* vquery, double maxd2, int options) { int nodestack[100]; int stackpos = 0; int D = (kd ? kd->ndim : 0); anbool do_dists; anbool do_points = TRUE; anbool do_wholenode_check; double maxdist = 0.0; ttype tlinf = 0; ttype tl1 = 0; ttype tl2 = 0; bigttype bigtl2 = 0; anbool use_tquery = FALSE; anbool use_tsplit = FALSE; anbool use_tmath = FALSE; anbool use_bigtmath = FALSE; anbool do_precheck = FALSE; anbool do_l1precheck = FALSE; anbool use_bboxes = FALSE; Unused anbool use_splits = FALSE; double dtl1=0.0, dtl2=0.0, dtlinf=0.0; const etype* query = vquery; //dtype dquery[D]; ttype tquery[D]; if (!kd || !query) return NULL; #if defined(KD_DIM) assert(kd->ndim == KD_DIM); D = KD_DIM; #else D = kd->ndim; #endif if (options & KD_OPTIONS_SORT_DISTS) // gotta compute 'em if ya wanna sort 'em! options |= KD_OPTIONS_COMPUTE_DISTS; do_dists = options & KD_OPTIONS_COMPUTE_DISTS; do_wholenode_check = !(options & KD_OPTIONS_SMALL_RADIUS); if ((options & KD_OPTIONS_SPLIT_PRECHECK) && kd->bb.any && kd->splitdim) { do_precheck = TRUE; } if ((options & KD_OPTIONS_L1_PRECHECK) && kd->bb.any) { do_l1precheck = TRUE; } if (!kd->split.any) { assert(kd->bb.any); use_bboxes = TRUE; } else { if (kd->bb.any) { // Got both BBoxes and Splits. if (options & KD_OPTIONS_USE_SPLIT) { use_splits = TRUE; } else { // Use bboxes by default. use_bboxes = TRUE; } } else { use_splits = TRUE; assert(kd->splitdim || TTYPE_INTEGER); } } assert(use_splits || use_bboxes); maxdist = sqrt(maxd2); if (TTYPE_INTEGER && (kd->split.any || do_precheck || do_l1precheck)) { use_tquery = ttype_query(kd, query, tquery); } if (TTYPE_INTEGER && use_tquery) { dtl1 = DIST_ET(kd, maxdist * sqrt(D),); dtl2 = DIST2_ET(kd, maxd2, ); dtlinf = DIST_ET(kd, maxdist, ); tl1 = ceil(dtl1); tlinf = ceil(dtlinf); bigtl2 = ceil(dtl2); tl2 = bigtl2; } use_tsplit = use_tquery && (dtlinf < TTYPE_MAX); if (do_l1precheck) if (dtl1 > TTYPE_MAX) { //printf("L1 maxdist %g overflows ttype representation. L1 precheck disabled.\n", dtl1); do_l1precheck = FALSE; } if (TTYPE_INTEGER && use_tquery && kd->bb.any) { if (dtl2 < TTYPE_MAX) { use_tmath = TRUE; /* printf("Using %s integer math.\n", STRINGIFY(TTYPE)); printf("(tl2 = %u).\n", (unsigned int)tl2); */ } else if (dtl2 < BIGTTYPE_MAX) { use_bigtmath = TRUE; } else { /* printf("L2 maxdist overflows u16 and u32 representation; not using int math. %g -> %g > %u\n", maxd2, dtl2, UINT32_MAX); */ } if (use_bigtmath) { if (options & KD_OPTIONS_NO_BIG_INT_MATH) use_bigtmath = FALSE; else { /* printf("Using %s/%s integer math.\n", STRINGIFY(TTYPE), STRINGIFY(BIGTTYPE)); printf("(bigtl2 = %llu).\n", (long long unsigned int)bigtl2); */ } } } if (res) { if (!res->capacity) { resize_results(res, KDTREE_MAX_RESULTS, D, do_dists, do_points); } else { // call the resize routine just in case the old result struct was // from a tree of different type or dimensionality. resize_results(res, res->capacity, D, do_dists, do_points); } res->nres = 0; } else { res = CALLOC(1, sizeof(kdtree_qres_t)); if (!res) { SYSERROR("Failed to allocate kdtree_qres_t struct"); return NULL; } resize_results(res, KDTREE_MAX_RESULTS, D, do_dists, do_points); } // queue root. nodestack[0] = 0; while (stackpos >= 0) { int nodeid; int i; int dim = -1; int L, R; ttype split = 0; ttype *tlo=NULL, *thi=NULL; nodeid = nodestack[stackpos]; stackpos--; if (KD_IS_LEAF(kd, nodeid)) { dtype* data; L = kdtree_left(kd, nodeid); R = kdtree_right(kd, nodeid); if (do_dists) { for (i=L; i<=R; i++) { anbool bailedout = FALSE; double dsqd; data = KD_DATA(kd, D, i); // FIXME benchmark dist2 vs dist2_bailout. // HACK - should do "use_dtype", just like "use_ttype". dist2_bailout(kd, query, data, D, maxd2, &bailedout, &dsqd); if (bailedout) continue; if (!add_result(kd, res, dsqd, KD_PERM(kd, i), data, D, do_dists, do_points)) return NULL; } } else { for (i=L; i<=R; i++) { data = KD_DATA(kd, D, i); // HACK - should do "use_dtype", just like "use_ttype". if (dist2_exceeds(kd, query, data, D, maxd2)) continue; if (!add_result(kd, res, HUGE_VAL, KD_PERM(kd, i), data, D, do_dists, do_points)) return NULL; } } continue; } if (kd->splitdim) dim = kd->splitdim[nodeid]; if (use_bboxes) { anbool wholenode = FALSE; bboxes(kd, nodeid, &tlo, &thi, D); assert(tlo && thi); if (do_precheck && nodeid) { anbool isleftchild = KD_IS_LEFT_CHILD(nodeid); // we need to use the dimension our _parent_ split on, not ours! int pdim; anbool cut; if (kd->splitdim) pdim = kd->splitdim[KD_PARENT(nodeid)]; else { pdim = kd->split.TTYPE[KD_PARENT(nodeid)]; pdim &= kd->dimmask; } if (TTYPE_INTEGER && use_tquery) { if (isleftchild) cut = ((tquery[pdim] > thi[pdim]) && (tquery[pdim] - thi[pdim] > tlinf)); else cut = ((tlo[pdim] > tquery[pdim]) && (tlo[pdim] - tquery[pdim] > tlinf)); } else { etype bb; if (isleftchild) { bb = POINT_TE(kd, pdim, thi[pdim]); cut = (query[pdim] - bb > maxdist); } else { bb = POINT_TE(kd, pdim, tlo[pdim]); cut = (bb - query[pdim] > maxdist); } } if (cut) { // precheck failed! //printf("precheck failed!\n"); continue; } } if (TTYPE_INTEGER && do_l1precheck && use_tquery) if (bb_point_l1mindist_exceeds_ttype(tlo, thi, tquery, D, tl1, tlinf)) { //printf("l1 precheck failed!\n"); continue; } if (TTYPE_INTEGER && use_tmath) { if (bb_point_mindist2_exceeds_ttype(tlo, thi, tquery, D, tl2)) continue; wholenode = do_wholenode_check && !bb_point_maxdist2_exceeds_ttype(tlo, thi, tquery, D, tl2); } else if (TTYPE_INTEGER && use_bigtmath) { if (bb_point_mindist2_exceeds_bigttype(tlo, thi, tquery, D, bigtl2)) continue; wholenode = do_wholenode_check && !bb_point_maxdist2_exceeds_bigttype(tlo, thi, tquery, D, bigtl2); } else { etype bblo[D], bbhi[D]; int d; for (d=0; dsplitdim && TTYPE_INTEGER) { bigint tmpsplit; tmpsplit = split; dim = tmpsplit & kd->dimmask; split = tmpsplit & kd->splitmask; } if (TTYPE_INTEGER && use_tsplit) { if (tquery[dim] < split) { // query is on the "left" side of the split. assert(query[dim] < POINT_TE(kd, dim, split)); stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); // look mum, no int overflow! if (split - tquery[dim] <= tlinf) { // right child is okay. assert(POINT_TE(kd, dim, split) - query[dim] >= 0.0); // This may fail due to rounding? //assert(POINT_TE(kd, dim, split) - query[dim] <= maxdist); stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); } } else { // query is on "right" side. //assert(POINT_TE(kd, dim, split) <= query[dim]); assert(POINT_TE(kd, dim, split) <= query[dim] + kd->invscale/2.0); stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); if (tquery[dim] - split <= tlinf) { //assert(query[dim] - POINT_TE(kd, dim, split) >= 0.0); assert((query[dim] - POINT_TE(kd, dim, split)) >= -kd->invscale/2.0); // This may fail due to rounding? //assert(query[dim] - POINT_TE(kd, dim, split) <= maxdist); stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); } } } else { dtype rsplit = POINT_TE(kd, dim, split); if (query[dim] < rsplit) { // query is on the "left" side of the split. stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); if (rsplit - query[dim] <= maxdist) { stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); } } else { // query is on the "right" side stackpos++; nodestack[stackpos] = KD_CHILD_RIGHT(nodeid); if (query[dim] - rsplit <= maxdist) { stackpos++; nodestack[stackpos] = KD_CHILD_LEFT(nodeid); } } } } } /* Resize result arrays. */ if (!(options & KD_OPTIONS_NO_RESIZE_RESULTS)) resize_results(res, res->nres, D, do_dists, do_points); /* Sort by ascending distance away from target point before returning */ if (options & KD_OPTIONS_SORT_DISTS) { if (FALSE) { printf("before sorting results:\n"); print_results(res, D); } kdtree_qsort_results(res, kd->ndim); if (FALSE) { printf("after sorting results:\n"); print_results(res, D); } } return res; } static void* get_data(const kdtree_t* kd, int i) { return KD_DATA(kd, kd->ndim, i); } static void copy_data_double(const kdtree_t* kd, int start, int N, double* dest) { Unused int i, j, d; int D; D = kd->ndim; #if DTYPE_DOUBLE //#warning "Data type is double; just copying data." memcpy(dest, kd->data.DTYPE + start*D, N*D*sizeof(etype)); #elif (!DTYPE_INTEGER && !ETYPE_INTEGER) //#warning "Etype and Dtype are both reals; just casting values." for (i=0; i<(N * D); i++) dest[i] = kd->data.DTYPE[start*D + i]; #else //#warning "Using POINT_DE to convert data." j=0; for (i=0; idata.DTYPE[(start + i)*D + d]); j++; } #endif } static dtype* kdqsort_arr; static int kdqsort_D; static int kdqsort_compare(const void* v1, const void* v2) { int i1, i2; dtype val1, val2; i1 = *((int*)v1); i2 = *((int*)v2); val1 = kdqsort_arr[i1 * kdqsort_D]; val2 = kdqsort_arr[i2 * kdqsort_D]; if (val1 < val2) return -1; else if (val1 > val2) return 1; return 0; } static int kdtree_qsort(dtype *arr, unsigned int *parr, int l, int r, int D, int d) { int* permute; int i, j, N; dtype* tmparr; int* tmpparr; N = r - l + 1; permute = MALLOC(N * sizeof(int)); if (!permute) { SYSERROR("Failed to allocate extra permutation array"); return -1; } for (i = 0; i < N; i++) permute[i] = i; kdqsort_arr = arr + l * D + d; kdqsort_D = D; qsort(permute, N, sizeof(int), kdqsort_compare); // permute the data one dimension at a time... tmparr = MALLOC(N * sizeof(dtype)); if (!tmparr) { SYSERROR("Failed to allocate temp permutation array"); return -1; } for (j = 0; j < D; j++) { for (i = 0; i < N; i++) { int pi = permute[i]; tmparr[i] = arr[(l + pi) * D + j]; } for (i = 0; i < N; i++) arr[(l + i) * D + j] = tmparr[i]; } FREE(tmparr); tmpparr = MALLOC(N * sizeof(int)); if (!tmpparr) { SYSERROR("Failed to allocate temp permutation array"); return -1; } for (i = 0; i < N; i++) { int pi = permute[i]; tmpparr[i] = parr[l + pi]; } memcpy(parr + l, tmpparr, N*sizeof(int)); FREE(tmpparr); FREE(permute); return 0; } #define GET(x) (arr[(x)*D+d]) #if defined(KD_DIM) #define ELEM_SWAP(il, ir) { \ if ((il) != (ir)) { \ tmpperm = parr[il]; \ assert(tmpperm != -1); \ parr[il] = parr[ir]; \ parr[ir] = tmpperm; \ { int d; for (d=0; d= L); /* Find the "rank"th point and partition the data. */ /* For us, "rank" is usually the median of L and R. */ low = L; high = R; while(1) { dtype vals[3]; dtype tmp; dtype pivot; int i,j; int iless, iequal, igreater; int endless, endequal, endgreater; int middle; int nless, nequal; // temp storage for ELEM_SWAP and ELEM_ROT macros. dtype tmpdata[D]; int tmpperm; if (high == low) break; /* Choose the pivot: find the median of the values in low, middle, and high positions. */ middle = (low + high) / 2; vals[0] = GET(low); vals[1] = GET(middle); vals[2] = GET(high); /* (Bubblesort the three elements.) */ for (i=0; i<2; i++) for (j=0; j<(2-i); j++) if (vals[j] > vals[j+1]) { tmp = vals[j]; vals[j] = vals[j+1]; vals[j+1] = tmp; } assert(vals[0] <= vals[1]); assert(vals[1] <= vals[2]); pivot = vals[1]; /* Count the number of items that are less than, and equal to, the pivot. */ nless = nequal = 0; for (i=low; i<=high; i++) { if (GET(i) < pivot) nless++; else if (GET(i) == pivot) nequal++; } /* These are the indices where the <, =, and > entries will start. */ iless = low; iequal = low + nless; igreater = low + nless + nequal; /* These are the indices where they will end; ie the elements less than the pivot will live in [iless, endless). (But note that we'll be incrementing "iequal" et al in the loop below.) */ endless = iequal; endequal = igreater; endgreater = high+1; while (1) { /* Find an element in the "less" section that is out of place. */ while ( (iless < endless) && (GET(iless) < pivot) ) iless++; /* Find an element in the "equal" section that is out of place. */ while ( (iequal < endequal) && (GET(iequal) == pivot) ) iequal++; /* Find an element in the "greater" section that is out of place. */ while ( (igreater < endgreater) && (GET(igreater) > pivot) ) igreater++; /* We're looking at three positions, and each one has three cases: we're finished that segment, or the element we're looking at belongs in one of the other two segments. This yields 27 cases, but many of them are ruled out because, eg, if the element at "iequal" belongs in the "less" segment, then we can't be done the "less" segment. It turns out there are only 6 cases to handle: --------------------------------------------- case iless iequal igreater action --------------------------------------------- 1 D D D done 2 G ? L swap l,g 3 E L ? swap l,e 4 ? G E swap e,g 5 E G L rotate A 6 G L E rotate B --------------------------------------------- legend: D: done ?: don't care L: (element < pivot) E: (element == pivot) G: (element > pivot) */ /* case 1: done? */ if ((iless == endless) && (iequal == endequal) && (igreater == endgreater)) break; /* case 2: swap l,g */ if ((iless < endless) && (igreater < endgreater) && (GET(iless) > pivot) && (GET(igreater) < pivot)) { ELEM_SWAP(iless, igreater); assert(GET(iless) < pivot); assert(GET(igreater) > pivot); continue; } /* cases 3,4,5,6 */ assert(iequal < endequal); if (GET(iequal) > pivot) { /* cases 4,5: */ assert(igreater < endgreater); if (GET(igreater) == pivot) { /* case 4: swap e,g */ ELEM_SWAP(iequal, igreater); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); } else { /* case 5: rotate. */ assert(GET(iless) == pivot); assert(GET(iequal) > pivot); assert(GET(igreater) < pivot); ELEM_ROT(iless, iequal, igreater); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); } } else { /* cases 3,6 */ assert(GET(iequal) < pivot); assert(iless < endless); if (GET(iless) == pivot) { /* case 3: swap l,e */ ELEM_SWAP(iless, iequal); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); } else { /* case 6: rotate. */ assert(GET(iless) > pivot); assert(GET(iequal) < pivot); assert(GET(igreater) == pivot); ELEM_ROT(igreater, iequal, iless); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); } } } /* Reset the indices of where the segments start. */ iless = low; iequal = low + nless; igreater = low + nless + nequal; /* Assert that "<" values are in the "less" partition, "=" values are in the "equal" partition, and ">" values are in the "greater" partition. */ for (i=iless; i pivot); /* Is the median in the "<", "=", or ">" partition? */ if (rank < iequal) /* median is in the "<" partition. low is unchanged. */ high = iequal - 1; else if (rank < igreater) /* the median is inside the "=" partition; we're done! */ break; else /* median is in the ">" partition. high is unchanged. */ low = igreater; } /* check that it worked. */ for (i=L; i= GET(rank)); } #undef ELEM_SWAP #undef ELEM_ROT #undef GET static int kdtree_check_node(const kdtree_t* kd, int nodeid) { int sum, i; int D = kd->ndim; int L, R; int d; L = kdtree_left (kd, nodeid); R = kdtree_right(kd, nodeid); if (kdtree_is_node_empty(kd, nodeid)) { assert(L == (R+1)); assert(L >= 0); assert(L <= kd->ndata); assert(R >= -1); assert(R < kd->ndata); if (!((L == (R+1)) && (L >= -1) && (L <= kd->ndata) && (R >= -1) && (R < kd->ndata))) { ERROR("kdtree_check: L,R out of range for empty node"); return -1; } } else { assert(L < kd->ndata); assert(R < kd->ndata); assert(L >= 0); assert(R >= 0); assert(L <= R); if (!((L < kd->ndata) && (R < kd->ndata) && (L >= 0) && (R >= 0) && (L <= R))) { ERROR("kdtree_check: L,R out of range for non-empty node"); return -1; } } // if it's the root node, make sure that each value in the permutation // array is present exactly once. if (!nodeid && kd->perm) { unsigned char* counts = CALLOC(kd->ndata, 1); for (i=0; indata; i++) counts[kd->perm[i]]++; for (i=0; indata; i++) assert(counts[i] == 1); for (i=0; indata; i++) if (counts[i] != 1) { ERROR("kdtree_check: permutation vector failure"); return -1; } FREE(counts); } sum = 0; if (kd->perm) { for (i=L; i<=R; i++) { sum += kd->perm[i]; assert(kd->perm[i] >= 0); assert(kd->perm[i] < kd->ndata); if (kd->perm[i] >= kd->ndata) { ERROR("kdtree_check: permutation vector range failure"); return -1; } } } if (KD_IS_LEAF(kd, nodeid)) { if ((kd->minval && !kd->maxval) || (!kd->minval && kd->maxval)) { ERROR("kdtree_check: minval but no maxval (or vice versa)"); return -1; } if (kd->minval && kd->maxval) { for (i=L; i<=R; i++) { dtype* dat = KD_DATA(kd, D, i); for (d=0; d= kd->minval[d]); assert(e <= kd->maxval[d]); } } } return 0; } if (kd->bb.any) { ttype* bb; ttype *plo, *phi; anbool ok = FALSE; plo = LOW_HR( kd, D, nodeid); phi = HIGH_HR(kd, D, nodeid); // bounding-box sanity. for (d=0; d phi[d]) { ERROR("kdtree_check: bounding-box sanity failure"); return -1; } } // check that the points owned by this node are within its bounding box. for (i=L; i<=R; i++) { dtype* dat = KD_DATA(kd, D, i); for (d=0; d t || t > phi[d]) { ERROR("kdtree_check: bounding-box failure"); return -1; } } } if (!KD_IS_LEAF(kd, nodeid)) { // check that the children's bounding box corners are within // the parent's bounding box. bb = LOW_HR(kd, D, KD_CHILD_LEFT(nodeid)); for (d=0; d bb[d] || bb[d] > phi[d]) { ERROR("kdtree_check: bounding-box nesting failure"); return -1; } } bb = HIGH_HR(kd, D, KD_CHILD_LEFT(nodeid)); for (d=0; d bb[d] || bb[d] > phi[d]) { ERROR("kdtree_check: bounding-box nesting failure"); return -1; } } bb = LOW_HR(kd, D, KD_CHILD_RIGHT(nodeid)); for (d=0; d bb[d] || bb[d] > phi[d]) { ERROR("kdtree_check: bounding-box nesting failure"); return -1; } } bb = HIGH_HR(kd, D, KD_CHILD_RIGHT(nodeid)); for (d=0; d bb[d] || bb[d] > phi[d]) { ERROR("kdtree_check: bounding-box nesting failure"); return -1; } } // check that the children don't overlap with positive volume. for (d=0; d= bb1[d]) { ok = TRUE; break; } } assert(ok); if (!ok) { ERROR("kdtree_check: peer overlap failure"); return -1; } } } if (kd->split.any) { if (!KD_IS_LEAF(kd, nodeid)) { // check split/dim. ttype split; int dim = 0; int cL, cR; dtype dsplit; split = *KD_SPLIT(kd, nodeid); if (kd->splitdim) dim = kd->splitdim[nodeid]; else { if (TTYPE_INTEGER) { bigint tmpsplit; tmpsplit = split; dim = tmpsplit & kd->dimmask; split = tmpsplit & kd->splitmask; } } dsplit = POINT_TD(kd, dim, split); cL = kdtree_left (kd, KD_CHILD_LEFT(nodeid)); cR = kdtree_right(kd, KD_CHILD_LEFT(nodeid)); for (i=cL; i<=cR; i++) { Unused dtype* dat = KD_DATA(kd, D, i); assert(dat[dim] <= dsplit); if (dat[dim] > dsplit) { ERROR("kdtree_check: split-plane failure"); return -1; } } cL = kdtree_left (kd, KD_CHILD_RIGHT(nodeid)); cR = kdtree_right(kd, KD_CHILD_RIGHT(nodeid)); for (i=cL; i<=cR; i++) { Unused dtype* dat = KD_DATA(kd, D, i); assert(dat[dim] >= dsplit); if (dat[dim] < dsplit) { ERROR("kdtree_check: split-plane failure"); return -1; } } } } return 0; } int MANGLE(kdtree_check)(const kdtree_t* kd) { int i; if (kd->split.any) { assert(kd->splitmask); if (!kd->splitdim) { assert(kd->dimmask); } } for (i=0; innodes; i++) { if (kdtree_check_node(kd, i)) return -1; } return 0; } static double maxrange(double* lo, double* hi, int D) { double range; int d; range = 0.0; for (d=0; d range) range = hi[d] - lo[d]; if (range == 0.0) return 1.0; return range; } static double compute_scale(dtype* ddata, int N, int D, double* lo, double* hi) { double range; int i, d; for (d=0; d hi[d]) hi[d] = *ddata; if (*ddata < lo[d]) lo[d] = *ddata; ddata++; } } range = maxrange(lo, hi, D); return (double)(DTYPE_MAX) / range; } // same as "compute_scale" but takes data of "etype". static double compute_scale_ext(etype* edata, int N, int D, double* lo, double* hi) { double range; int i, d; for (d=0; d hi[d]) hi[d] = *edata; if (*edata < lo[d]) lo[d] = *edata; edata++; } } range = maxrange(lo, hi, D); return (double)DTYPE_MAX / range; } static void convert_data(kdtree_t* kd, etype* edata, int N, int D, int Nleaf) { dtype* ddata; int i, d; if (!kd->minval || !kd->maxval) { kd->minval = MALLOC(D * sizeof(double)); kd->maxval = MALLOC(D * sizeof(double)); kd->scale = compute_scale_ext(edata, N, D, kd->minval, kd->maxval); } else { // limits were pre-set by the user. just compute scale. double range; range = maxrange(kd->minval, kd->maxval, D); kd->scale = (double)DTYPE_MAX / range; } kd->invscale = 1.0 / kd->scale; ddata = kd->data.any = MALLOC(N * D * sizeof(dtype)); kd->free_data = TRUE; for (i=0; i DTYPE_MAX) { WARNING("Clamping value %.12g -> %.12g to %u", (double)*edata, (double)dd, (unsigned int)DTYPE_MAX); dd = DTYPE_MAX; } if (dd < DTYPE_MIN) { WARNING("Clamping value %.12g -> %.12g to %u.\n", (double)*edata, (double)dd, (unsigned int)DTYPE_MIN); dd = DTYPE_MIN; } // Right place for this? Not really.... if (!ETYPE_INTEGER) { // NaN and Inf detection... if (!isfinite(dd) || isnan(dd)) { WARNING("Replacing inf/nan value (element %i,%i) = %g with %g\n", i, d, (double)dd, (double)DTYPE_MAX); dd = DTYPE_MAX; } } *ddata = (dtype)dd; ddata++; edata++; } } // tune up kd->maxval so that it is larger than the external-type // value of all points in the tree. for (d=0; dmaxval[d], KD_ROUND); etype emax = POINT_DE(kd, d, dmax); kd->maxval[d] = MAX(kd->maxval[d], emax); } #ifndef NDEBUG for (i=0; imaxval[d]); assert(e >= kd->minval[d]); } } #endif } static void compute_bb(const dtype* data, int D, int N, dtype* lo, dtype* hi) { int d, i; for (d=0; ddata[NODE(i)*D + d] many times; just ++ the pointer) */ for (i=0; i hi[d]) hi[d] = *data; if (*data < lo[d]) lo[d] = *data; data++; } } } static void save_bb(kdtree_t* kd, int i, const dtype* lo, const dtype* hi) { int D = kd->ndim; int d; for (d=0; d 0); assert(D <= KDTREE_MAX_DIM); #if defined(KD_DIM) assert(D == KD_DIM); // let the compiler know that D is a constant... D = KD_DIM; #endif /* Parameters checking */ if (!indata || !N || !D) { ERROR("Data, N, or D is zero"); return NULL; } /* Make sure we have enough data */ if ((1 << maxlevel) - 1 > N) { ERROR("Too few data points for number of tree levels (%i < %i)!", N, (1 << maxlevel) - 1); return NULL; } if ((options & KD_BUILD_SPLIT) && (options & KD_BUILD_NO_LR) && !(options & KD_BUILD_SPLITDIM) && TTYPE_INTEGER) { ERROR("Currently you can't set KD_BUILD_NO_LR for int trees " "unless you also set KD_BUILD_SPLITDIM"); return NULL; } if (!kd) kd = kdtree_new(N, D, Nleaf); kd->treetype = treetype; if (minval) { kd->minval = CALLOC(D, sizeof(double)); memcpy(kd->minval, minval, D*sizeof(double)); } if (maxval) { kd->maxval = CALLOC(D, sizeof(double)); memcpy(kd->maxval, maxval, D*sizeof(double)); } if (!kd->data.any) { if (needs_data_conversion()) { // need to convert the data from "etype" to "dtype". convert_data(kd, indata, N, D, Nleaf); } else { kd->data.any = indata; // ??? if (!ETYPE_INTEGER) { int i,d; etype* edata = indata; for (i=0; iminval || !kd->maxval) { free(kd->minval); free(kd->maxval); kd->minval = MALLOC(D * sizeof(double)); kd->maxval = MALLOC(D * sizeof(double)); assert(kd->minval); assert(kd->maxval); kd->scale = compute_scale(kd->data.any, N, D, kd->minval, kd->maxval); } else { // limits were pre-set by the user. just compute scale. double range; range = maxrange(kd->minval, kd->maxval, D); kd->scale = (double)TTYPE_MAX / range; } kd->invscale = 1.0 / kd->scale; } /* perm stores the permutation indexes. This gets shuffled around during * sorts to keep track of the original index. */ kd->perm = MALLOC(sizeof(u32) * N); assert(kd->perm); for (i = 0; i < N; i++) kd->perm[i] = i; kd->lr = MALLOC(kd->nbottom * sizeof(int32_t)); assert(kd->lr); if (options & KD_BUILD_BBOX) { kd->bb.any = MALLOC(kd->nnodes * 2 * D * sizeof(ttype)); kd->n_bb = kd->nnodes; assert(kd->bb.any); } if (options & KD_BUILD_SPLIT) { kd->split.any = MALLOC(kd->ninterior * sizeof(ttype)); assert(kd->split.any); } if (((options & KD_BUILD_SPLIT) && !TTYPE_INTEGER) || (options & KD_BUILD_SPLITDIM)) { kd->splitdim = MALLOC(kd->ninterior * sizeof(u8)); kd->splitmask = UINT32_MAX; kd->dimmask = 0; } else if (options & KD_BUILD_SPLIT) compute_splitbits(kd); if (options & KD_BUILD_LINEAR_LR) kd->has_linear_lr = TRUE; /* Use the lr array as a stack while building. In place in your face! */ kd->lr[0] = N - 1; lnext = 1; level = 0; // shorthand data = kd->data.DTYPE; /* And in one shot, make the kdtree. Because the lr pointers * are only stored for the bottom layer, we use the lr array as a * stack. At finish, it contains the r pointers for the bottom nodes. * The l pointer is simply +1 of the previous right pointer, or 0 if we * are at the first element of the lr array. */ for (i = 0; i < kd->ninterior; i++) { unsigned int d; int left, right; dtype maxrange; ttype s; unsigned int c; int dim = 0; int m; dtype qsplit = 0; /* Have we reached the next level in the tree? */ if (i == lnext) { level++; lnext = lnext * 2 + 1; } /* Since we're not storing the L pointers, we have to infer L */ if (i == (1<lr[i-1] + 1; } right = kd->lr[i]; assert(right != (unsigned int)-1); if (left >= right) { //debug("Empty node %i: left=right=%i\n", i, left); if (options & KD_BUILD_BBOX) save_bb(kd, i, nullbb, nullbb); if (kd->splitdim) kd->splitdim[i] = 0; c = 2*i; if (level == maxlevel - 2) c -= kd->ninterior; kd->lr[c+1] = right; kd->lr[c+2] = right; continue; } /* More sanity */ assert(0 <= left); assert(left <= right); assert(right < N); /* Find the bounding-box for this node. */ compute_bb(KD_DATA(kd, D, left), D, right - left + 1, lo, hi); if (options & KD_BUILD_BBOX) save_bb(kd, i, lo, hi); /* Split along dimension with largest range */ maxrange = DTYPE_MIN; for (d=0; d= maxrange) { maxrange = hi[d] - lo[d]; dim = d; } d = dim; assert (d < D); if ((options & KD_BUILD_FORCE_SORT) || (TTYPE_INTEGER && !(options & KD_BUILD_SPLITDIM))) { /* We're packing dimension and split location into an int. */ /* Sort the data. */ /* Because the nature of the inttree is to bin the split * planes, we have to be careful. Here, we MUST sort instead * of merely partitioning, because we may not be able to * properly represent the median as a split plane. Imagine the * following on the dtype line: * * |P P | P M | P |P | PP | ------> X * 1 2 * The |'s are possible split positions. If M is selected to * split on, we actually cannot select the split 1 or 2 * immediately, because if we selected 2, then M would be on * the wrong side (the medians always go to the right) and we * can't select 1 because then P would be on the wrong side. * So, the solution is to try split 2, and if point M-1 is on * the correct side, great. Otherwise, we have to move shift * point M-1 into the right side and only then chose plane 1. */ /* FIXME but qsort allocates a 2nd perm array GAH */ if (kdtree_qsort(data, kd->perm, left, right, D, dim)) { ERROR("kdtree_qsort failed"); // FIXME: memleak mania! return NULL; } m = (1+left+right)/2; /* Make sure sort works */ for(xx=left; xx<=right-1; xx++) { assert(data[D*xx+d] <= data[D*(xx+1)+d]); } /* Encode split dimension and value. */ /* "s" is the location of the splitting plane in the "tree" data type. */ s = POINT_DT(kd, d, data[D*m+d], KD_ROUND); if (kd->split.any) { /* If we are using the "split" array to store both the splitting plane and the splitting dimension, then we truncate a few bits from "s" here. */ bigint tmps = s; tmps &= kd->splitmask; assert((tmps & kd->dimmask) == 0); s = tmps; } /* "qsplit" is the location of the splitting plane in the "data" type. */ qsplit = POINT_TD(kd, d, s); /* Play games to make sure we properly partition the data */ while (m < right && data[D*m+d] < qsplit) m++; while (left < m && qsplit < data[D*(m-1)+d]) m--; /* Even more sanity */ assert(m >= -1); assert(left <= m); assert(m <= right); for (xx=left; m && xx<=m-1; xx++) assert(data[D*xx+d] <= qsplit); for (xx=m; xx<=right; xx++) assert(qsplit <= data[D*xx+d]); } else { /* "m-1" becomes R of the left child; "m" becomes L of the right child. */ if (kd->has_linear_lr) { m = kdtree_left(kd, KD_CHILD_RIGHT(i)); } else { /* Pivot the data at the median */ m = (left + right + 1) / 2; } assert(m >= left); assert(m <= right); kdtree_quickselect_partition(data, kd->perm, left, right, D, dim, m); s = POINT_DT(kd, d, data[D*m+d], KD_ROUND); assert(m != 0); assert(left <= (m-1)); assert(m <= right); for (xx=left; xx<=m-1; xx++) assert(data[D*xx+d] <= data[D*m+d]); for (xx=left; xx<=m-1; xx++) assert(data[D*xx+d] <= s); for (xx=m; xx<=right; xx++) assert(data[D*m+d] <= data[D*xx+d]); for (xx=m; xx<=right; xx++) assert(s <= data[D*xx+d]); } if (kd->split.any) { if (kd->splitdim) *KD_SPLIT(kd, i) = s; else { bigint tmps = s; *KD_SPLIT(kd, i) = tmps | dim; } } if (kd->splitdim) kd->splitdim[i] = dim; /* Store the R pointers for each child */ c = 2*i; if (level == maxlevel - 2) c -= kd->ninterior; kd->lr[c+1] = m-1; kd->lr[c+2] = right; assert(c+2 < kd->nbottom); } for (i=0; inbottom-1; i++) assert(kd->lr[i] <= kd->lr[i+1]); if (options & KD_BUILD_BBOX) { // Compute bounding boxes for leaf nodes. int L, R = -1; for (i=0; inbottom; i++) { L = R + 1; R = kd->lr[i]; assert(L == kdtree_leaf_left(kd, i + kd->ninterior)); assert(R == kdtree_leaf_right(kd, i + kd->ninterior)); compute_bb(KD_DATA(kd, D, L), D, R - L + 1, lo, hi); save_bb(kd, i + kd->ninterior, lo, hi); } // check that it worked... #ifndef NDEBUG for (i=0; inbottom; i++) { ttype* lo; ttype* hi; int j, d; int nodeid = i + kd->ninterior; lo = LOW_HR(kd, kd->ndim, nodeid); hi = HIGH_HR(kd, kd->ndim, nodeid); for (j=kdtree_leaf_left(kd, nodeid); j<=kdtree_leaf_right(kd, nodeid); j++) { dtype* data = KD_DATA(kd, kd->ndim, j); for (d=0; dndim; d++) { assert(POINT_TD(kd, d, lo[d]) <= data[d]); assert(POINT_TD(kd, d, hi[d]) >= data[d]); assert(POINT_DT(kd, d, data[d], KD_ROUND) <= hi[d]); assert(POINT_DT(kd, d, data[d], KD_ROUND) >= lo[d]); } } } #endif } if (options & KD_BUILD_NO_LR) { FREE(kd->lr); kd->lr = NULL; } // set function table pointers. MANGLE(kdtree_update_funcs)(kd); return kd; } void MANGLE(kdtree_fix_bounding_boxes)(kdtree_t* kd) { // FIXME - do this log(N) times more efficiently by propagating // bounding boxes up the levels of the tree... int i; int D = kd->ndim; kd->bb.any = MALLOC(kd->nnodes * sizeof(ttype) * D * 2); assert(kd->bb.any); for (i=0; innodes; i++) { unsigned int left, right; dtype hi[D], lo[D]; left = kdtree_left(kd, i); right = kdtree_right(kd, i); compute_bb(KD_DATA(kd, D, left), D, right - left + 1, lo, hi); save_bb(kd, i, lo, hi); } } double MANGLE(kdtree_node_point_mindist2) (const kdtree_t* kd, int node, const etype* query) { int D = kd->ndim; int d; ttype* tlo, *thi; double d2 = 0.0; if (!bboxes(kd, node, &tlo, &thi, D)) { ERROR("Error: kdtree does not have bounding boxes!"); return HUGE_VAL; } for (d=0; d hi) delta = query[d] - hi; else continue; } d2 += delta * delta; } return d2; } double MANGLE(kdtree_node_point_maxdist2) (const kdtree_t* kd, int node, const etype* query) { int D = kd->ndim; int d; ttype* tlo=NULL, *thi=NULL; double d2 = 0.0; if (!bboxes(kd, node, &tlo, &thi, D)) { ERROR("Error: kdtree_node_point_maxdist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; d hi) delta = query[d] - lo; else { delta1 = hi - query[d]; delta2 = query[d] - lo; delta = MAX(delta1, delta2); } d2 += delta*delta; } return d2; } anbool MANGLE(kdtree_node_point_mindist2_exceeds) (const kdtree_t* kd, int node, const etype* query, double maxd2) { int D = kd->ndim; int d; ttype* tlo, *thi; double d2 = 0.0; if (!bboxes(kd, node, &tlo, &thi, D)) { //ERROR("Error: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; d hi) delta = query[d] - hi; else continue; } d2 += delta * delta; if (d2 > maxd2) return TRUE; } return FALSE; } anbool MANGLE(kdtree_node_point_maxdist2_exceeds) (const kdtree_t* kd, int node, const etype* query, double maxd2) { int D = kd->ndim; int d; ttype* tlo=NULL, *thi=NULL; double d2 = 0.0; if (!bboxes(kd, node, &tlo, &thi, D)) { ERROR("Error: kdtree_node_point_maxdist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; d hi) delta = query[d] - lo; else { delta1 = hi - query[d]; delta2 = query[d] - lo; delta = (delta1 > delta2 ? delta1 : delta2); } d2 += delta*delta; if (d2 > maxd2) return TRUE; } return FALSE; } double MANGLE(kdtree_node_node_maxdist2) (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2) { ttype *tlo1=NULL, *tlo2=NULL, *thi1=NULL, *thi2=NULL; double d2 = 0.0; int d, D = kd1->ndim; assert(kd1->ndim == kd2->ndim); if (!bboxes(kd1, node1, &tlo1, &thi1, D)) { ERROR("Error: kdtree_node_node_maxdist2: kdtree does not have bounding boxes!"); return FALSE; } if (!bboxes(kd2, node2, &tlo2, &thi2, D)) { ERROR("Error: kdtree_node_node_maxdist2: kdtree does not have bounding boxes!"); return FALSE; } // Since the two trees can have different conversion factors, // we have to convert both to the external type. // FIXME - we do assume that POINT_TE works for both of them -- // ie, ~we assume they are the same treetype. for (d=0; dndim; assert(kd1->ndim == kd2->ndim); if (!bboxes(kd1, node1, &tlo1, &thi1, D)) { ERROR("Error: kdtree_node_node_mindist2: kdtree does not have bounding boxes!"); return FALSE; } if (!bboxes(kd2, node2, &tlo2, &thi2, D)) { ERROR("Error: kdtree_node_node_mindist2: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; dndim; //assert(kd1->treetype == kd2->treetype); assert(kd1->ndim == kd2->ndim); if (!bboxes(kd1, node1, &tlo1, &thi1, D)) { ERROR("Error: kdtree_node_node_maxdist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } if (!bboxes(kd2, node2, &tlo2, &thi2, D)) { ERROR("Error: kdtree_node_node_maxdist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; d delta2 ? delta1 : delta2); d2 += delta*delta; if (d2 > maxd2) return TRUE; } return FALSE; } anbool MANGLE(kdtree_node_node_mindist2_exceeds) (const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double maxd2) { ttype *tlo1=NULL, *tlo2=NULL, *thi1=NULL, *thi2=NULL; double d2 = 0.0; int d, D = kd1->ndim; //assert(kd1->treetype == kd2->treetype); assert(kd1->ndim == kd2->ndim); if (!bboxes(kd1, node1, &tlo1, &thi1, D)) { //ERROR("Error: kdtree_node_node_mindist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } if (!bboxes(kd2, node2, &tlo2, &thi2, D)) { //ERROR("Error: kdtree_node_node_mindist2_exceeds: kdtree does not have bounding boxes!"); return FALSE; } for (d=0; d maxd2) return TRUE; } return FALSE; } static anbool do_boxes_overlap(const ttype* lo1, const ttype* hi1, const ttype* lo2, const ttype* hi2, int D) { int d; for (d=0; d hi2[d]) return FALSE; if (lo2[d] > hi1[d]) return FALSE; } return TRUE; } /* Is the first box contained within the second? */ static anbool is_box_contained(const ttype* lo1, const ttype* hi1, const ttype* lo2, const ttype* hi2, int D) { int d; for (d=0; d hi2[d]) return FALSE; } return TRUE; } static void nodes_contained_rec(const kdtree_t* kd, int nodeid, const ttype* qlo, const ttype* qhi, void (*cb_contained)(const kdtree_t* kd, int node, void* extra), void (*cb_overlap)(const kdtree_t* kd, int node, void* extra), void* cb_extra) { ttype *tlo=NULL, *thi=NULL; int D = kd->ndim; // leaf nodes don't have bounding boxes, so we have to do this check first! if (KD_IS_LEAF(kd, nodeid)) { cb_overlap(kd, nodeid, cb_extra); return; } if (!bboxes(kd, nodeid, &tlo, &thi, D)) { ERROR("Error: kdtree_nodes_contained: node %i doesn't have a bounding box", nodeid); return; } if (!do_boxes_overlap(tlo, thi, qlo, qhi, D)) return; if (is_box_contained(tlo, thi, qlo, qhi, D)) { cb_contained(kd, nodeid, cb_extra); return; } nodes_contained_rec(kd, KD_CHILD_LEFT(nodeid), qlo, qhi, cb_contained, cb_overlap, cb_extra); nodes_contained_rec(kd, KD_CHILD_RIGHT(nodeid), qlo, qhi, cb_contained, cb_overlap, cb_extra); } void MANGLE(kdtree_nodes_contained) (const kdtree_t* kd, const void* vquerylow, const void* vqueryhi, void (*cb_contained)(const kdtree_t* kd, int node, void* extra), void (*cb_overlap)(const kdtree_t* kd, int node, void* extra), void* cb_extra) { int D = kd->ndim; int d; ttype qlo[D], qhi[D]; const etype* querylow = vquerylow; const etype* queryhi = vqueryhi; for (d=0; d TTYPE_MAX) { // query's low position is more than the tree's max: no overlap is possible. return; } qhi[d] = q = POINT_ET(kd, d, queryhi [d], ceil ); if (q > TTYPE_MAX) { //WARNING("Error: query value %g is above the maximum range of the tree %g.\n", q, (double)TTYPE_MAX); qhi[d] = TTYPE_MAX; } else if (q < TTYPE_MIN) { // query's high position is less than the tree's min: no overlap is possible. return; } } nodes_contained_rec(kd, 0, qlo, qhi, cb_contained, cb_overlap, cb_extra); } int MANGLE(kdtree_get_bboxes)(const kdtree_t* kd, int node, void* vbblo, void* vbbhi) { etype* bblo = vbblo; etype* bbhi = vbbhi; ttype *tlo=NULL, *thi=NULL; int D = kd->ndim; int d; if (!bboxes(kd, node, &tlo, &thi, D)) return FALSE; for (d=0; dfun.get_data = get_data; kd->fun.copy_data_double = copy_data_double; kd->fun.get_splitval = MANGLE(kdtree_get_splitval); kd->fun.get_bboxes = MANGLE(kdtree_get_bboxes); kd->fun.check = MANGLE(kdtree_check); kd->fun.fix_bounding_boxes = MANGLE(kdtree_fix_bounding_boxes); kd->fun.nearest_neighbour_internal = MANGLE(kdtree_nn); kd->fun.rangesearch = MANGLE(kdtree_rangesearch_options); kd->fun.nodes_contained = MANGLE(kdtree_nodes_contained); } astrometry.net-0.67/libkd/kdtree_internal.h000644 000765 000024 00000002406 12651445460 021200 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_INTERNAL_H #define KDTREE_INTERNAL_H #include "astrometry/kdtree.h" #define GLUE3(base, x, y, z) base ## _ ## x ## y ## z #define KDMANGLE(func, e, d, t) GLUE3(func, e, d, t) #define KD_DECLARE(func, rtn, args) \ rtn KDMANGLE(func, d, d, d)args; \ rtn KDMANGLE(func, f, f, f)args; \ rtn KDMANGLE(func, d, d, u)args; \ rtn KDMANGLE(func, d, u, u)args; \ rtn KDMANGLE(func, d, d, s)args; \ rtn KDMANGLE(func, d, s, s)args #define KD_DISPATCH(func, tt, rtn, args) \ switch (tt) { \ case KDTT_DOUBLE: rtn KDMANGLE(func, d, d, d)args; break; \ case KDTT_FLOAT: rtn KDMANGLE(func, f, f, f)args; break; \ case KDTT_DUU: \ rtn KDMANGLE(func, d, u, u)args; break; \ case KDTT_DSS: \ rtn KDMANGLE(func, d, s, s)args; break; \ case KDTT_DOUBLE_U32: \ rtn KDMANGLE(func, d, d, u)args; break; \ case KDTT_DOUBLE_U16: \ rtn KDMANGLE(func, d, d, s)args; break; \ default: \ fprintf(stderr, #func ": unimplemented treetype %#x.\n", tt); \ } /* Compute how many levels should be used if you have "N" points and you want "Nleaf" points in the leaf nodes. */ int kdtree_compute_levels(int N, int Nleaf); #endif astrometry.net-0.67/libkd/kdtree_internal_common.h000644 000765 000024 00000000764 12651445460 022555 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #define DIST_SCALE( kd, rd) ((rd) * (kd)->scale) #define DIST2_SCALE(kd, rd) ((rd) * (kd)->scale * (kd)->scale) #define DIST_INVSCALE( kd, rd) ((rd) * (kd)->invscale) #define DIST2_INVSCALE(kd, rd) ((rd) * (kd)->invscale * (kd)->invscale) #define POINT_SCALE( kd, d, p) (((p) - (kd)->minval[d]) * (kd)->scale) #define POINT_INVSCALE(kd, d, p) (((p) * ((kd)->invscale)) + (kd)->minval[d]) astrometry.net-0.67/libkd/kdtree_internal_dists.c000644 000765 000024 00000004410 12651445460 022376 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "keywords.h" static anbool DIST_FUNC_MANGLE(bb_point_mindist2_exceeds, FUNC_SUFFIX) (const PTYPE* lo, const PTYPE* hi, const PTYPE* point, int dim, DISTTYPE maxd2) { DISTTYPE d2 = 0; DISTTYPE newd2; DISTTYPE delta; int i; #if defined(KD_DIM) dim = KD_DIM; #endif for (i = 0; i < dim; i++) { if (point[i] < lo[i]) delta = lo[i] - point[i]; else if (point[i] > hi[i]) delta = point[i] - hi[i]; else continue; #if defined(DELTAMAX) if (delta > DELTAMAX) return TRUE; #endif newd2 = d2 + delta * delta; if (CAN_OVERFLOW && (newd2 < d2)) // Int overflow! return TRUE; if (newd2 > maxd2) return TRUE; d2 = newd2; } return FALSE; } Unused // don't warn if unused. static void DIST_FUNC_MANGLE(bb_point_mindist2_bailout, FUNC_SUFFIX) (const PTYPE* lo, const PTYPE* hi, const PTYPE* point, int dim, DISTTYPE maxd2, anbool* bailedout, DISTTYPE* p_d2) { DISTTYPE d2 = 0; DISTTYPE newd2; DISTTYPE delta; int i; #if defined(KD_DIM) dim = KD_DIM; #endif for (i = 0; i < dim; i++) { if (point[i] < lo[i]) delta = lo[i] - point[i]; else if (point[i] > hi[i]) delta = point[i] - hi[i]; else continue; #if defined(DELTAMAX) if (delta > DELTAMAX) { *bailedout = TRUE; return; } #endif newd2 = d2 + delta * delta; if (CAN_OVERFLOW && (newd2 < d2)) { // Int overflow! *bailedout = TRUE; return; } if (newd2 > maxd2) { *bailedout = TRUE; return; } d2 = newd2; } *p_d2 = d2; } static anbool DIST_FUNC_MANGLE(bb_point_maxdist2_exceeds, FUNC_SUFFIX) (const PTYPE* lo, const PTYPE* hi, const PTYPE* point, int dim, DISTTYPE maxd2) { DISTTYPE d2 = 0; DISTTYPE newd2; PTYPE delta1, delta2; DISTTYPE delta; int i; #if defined(KD_DIM) dim = KD_DIM; #endif for (i = 0; i < dim; i++) { delta1 = (point[i] > lo[i]) ? point[i] - lo[i] : lo[i] - point[i]; delta2 = (point[i] > hi[i]) ? point[i] - hi[i] : hi[i] - point[i]; delta = (delta1 > delta2 ? delta1 : delta2); #if defined(DELTAMAX) if (delta > DELTAMAX) return TRUE; #endif newd2 = d2 + delta * delta; if (CAN_OVERFLOW && (newd2 < d2)) // Int overflow! return TRUE; if (newd2 > maxd2) return TRUE; d2 = newd2; } return FALSE; } astrometry.net-0.67/libkd/kdtree_internal_dualtree.c000644 000765 000024 00000012621 12651445460 023060 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_NO_DUALTREE #include "bl.h" #include "errors.h" typedef void (*rangesearch_callback)(void* user, kdtree_t* kd1, int ind1, kdtree_t* kd2, int ind2, double dist2); static void dtrs_nodes(kdtree_t* xtree, kdtree_t* ytree, int xnode, int ynode, double maxd2 rangesearch_callback cb, void* baton) { } /* At each step of the recursion, we have a query node ("ynode") and a list of candidate search nodes ("nodes" and "leaves" in the "xtree"). General idea: - if we've hit a leaf in the "ytree", callback results; done. - if there are only leaves, no "x"/search nodes left, callback results; done. - for each element in x node list: - if decision(xnode, ynode) - add children of xnode to child search list - recurse on ynode's children with the child search list - empty the child search list The search order is depth-first, left-to-right in the "y" tree. */ static void dualtree_rs_recurse(kdtree_t* xtree, kdtree_t* ytree, il* xnodes, il* xleaves, bl* xnodebbs, bl* xleafbbs, int ynode, ttype* ybb, double maxd2, rangesearch_callback cb, void* baton) { int leafmarker; il* childnodes; int i, N; ttype oldbbval; ttype splitval; uint8_t splitdim; // if the query node is a leaf... if (KD_IS_LEAF(ytree, ynode)) { // ... then run the result function on each x node /* if (callbacks->start_results) callbacks->start_results(callbacks->start_extra, ytree, ynode); */ if (cb) { // non-leaf nodes N = il_size(xnodes); for (i=0; iend_results) callbacks->end_results(callbacks->end_extra, ytree, ynode); */ return; } // if there are search leaves but no search nodes, run the result // function on each leaf. (Note that the query node is not a leaf!) if (!il_size(xnodes)) { /* result_function result = callbacks->result; void* result_extra = callbacks->result_extra; if (callbacks->start_results) callbacks->start_results(callbacks->start_extra, ytree, ynode); */ // leaf nodes if (result) { N = il_size(xleaves); for (i=0; iend_results) callbacks->end_results(callbacks->end_extra, ytree, ynode); */ return; } leafmarker = il_size(leaves); childnodes = il_new(256); #define BBLO(bb, d) ((bb)[2*(d)]) #define BBHI(bb, d) ((bb)[(2*(d))+1]) N = il_size(xnodes); for (i=0; isplit.any || !kd2->split.any) { ERROR("This function only supports splitting-plane trees.\n"); return -1; } nodes = il_new(256); leaves = il_new(256); // root nodes. xnode = ynode = 0; if (KD_IS_LEAF(xtree, xnode)) il_append(leaves, xnode); else il_append(nodes, xnode); dualtree_recurse(xtree, ytree, nodes, leaves, ynode, callbacks); il_free(nodes); il_free(leaves); return 0; } #endif astrometry.net-0.67/libkd/kdtree_internal_fits.c000644 000765 000024 00000032451 12651445460 022223 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_NO_FITS #include "kdtree_fits_io.h" #include "kdtree.h" #include "fitsioutils.h" #include "ioutils.h" #include "errors.h" #define KDTREE_FITS_VERSION 1 static char* get_table_name(const char* treename, const char* tabname) { char* rtn; if (!treename) { return strdup_safe(tabname); } asprintf_safe(&rtn, "%s_%s", tabname, treename); return rtn; } int MANGLE(kdtree_read_fits)(kdtree_fits_t* io, kdtree_t* kd) { fitsbin_chunk_t chunk; fitsbin_chunk_init(&chunk); // kd->lr chunk.tablename = get_table_name(kd->name, KD_STR_LR); chunk.itemsize = sizeof(u32); chunk.nrows = kd->nbottom; chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { kd->lr = chunk.data; } free(chunk.tablename); // kd->perm chunk.tablename = get_table_name(kd->name, KD_STR_PERM); chunk.itemsize = sizeof(u32); chunk.nrows = kd->ndata; chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { kd->perm = chunk.data; } free(chunk.tablename); // kd->bb chunk.tablename = get_table_name(kd->name, KD_STR_BB); chunk.itemsize = sizeof(ttype) * kd->ndim * 2; chunk.nrows = 0; chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { int nbb_old = (kd->nnodes + 1) / 2 - 1; int nbb_new = kd->nnodes; // accept (but warn about) old-school buggy BB extension. if (chunk.nrows == nbb_new) { } else if (chunk.nrows == nbb_old) { ERROR("Warning: this file contains an old, buggy, %s " "extension; it has %i rather than %i items. Proceeding " "anyway, but this is probably going to cause problems!", chunk.tablename, nbb_old, nbb_new); } else { // error? ERROR("Bounding-box table %s should contain either %i (new) or " "%i (old) bounding-boxes, but it has %i.", chunk.tablename, nbb_new, nbb_old, chunk.nrows); free(chunk.tablename); return -1; } kd->bb.any = chunk.data; kd->n_bb = chunk.nrows; } free(chunk.tablename); // kd->split chunk.tablename = get_table_name(kd->name, KD_STR_SPLIT); chunk.itemsize = sizeof(ttype); chunk.nrows = kd->ninterior; chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { kd->split.any = chunk.data; } free(chunk.tablename); // kd->splitdim chunk.tablename = get_table_name(kd->name, KD_STR_SPLITDIM); chunk.itemsize = sizeof(u8); chunk.nrows = kd->ninterior; chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { kd->splitdim = chunk.data; } free(chunk.tablename); // kd->data chunk.tablename = get_table_name(kd->name, KD_STR_DATA); chunk.itemsize = sizeof(dtype) * kd->ndim; chunk.nrows = kd->ndata; chunk.required = TRUE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { kd->data.any = chunk.data; } free(chunk.tablename); // kd->minval/kd->maxval/kd->scale chunk.tablename = get_table_name(kd->name, KD_STR_RANGE); chunk.itemsize = sizeof(double); chunk.nrows = (kd->ndim * 2 + 1); chunk.required = FALSE; if (kdtree_fits_read_chunk(io, &chunk) == 0) { double* r; r = chunk.data; kd->minval = r; kd->maxval = r + kd->ndim; kd->scale = r[kd->ndim * 2]; kd->invscale = 1.0 / kd->scale; } free(chunk.tablename); if (!(kd->bb.any || (kd->split.any && (TTYPE_INTEGER || kd->splitdim)))) { ERROR("kdtree contains neither bounding boxes nor split+dim data"); return -1; } if ((TTYPE_INTEGER && !ETYPE_INTEGER) && !(kd->minval && kd->maxval)) { ERROR("treee does not contain required range information"); return -1; } if (kd->split.any) { if (kd->splitdim) kd->splitmask = UINT32_MAX; else compute_splitbits(kd); } return 0; } #define WRITE_CHUNK() \ do { \ if (flip_endian) { \ if (fitsbin_write_chunk_flipped(fb, &chunk, wordsize)) { \ ERROR("Failed to write (flipped) kdtree chunk"); \ fitsbin_chunk_clean(&chunk); \ return -1; \ } \ } else { \ if (fid ? \ fitsbin_write_chunk_to(fb, &chunk, fid) : \ fitsbin_write_chunk(fb, &chunk)) { \ ERROR("Failed to write kdtree chunk"); \ fitsbin_chunk_clean(&chunk); \ return -1; \ } \ } \ } while (0) int MANGLE(kdtree_write_fits)(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr, anbool flip_endian, FILE* fid) { fitsbin_chunk_t chunk; fitsbin_t* fb = kdtree_fits_get_fitsbin(io); qfits_header* hdr; int wordsize = 0; // haven't bothered to support this. assert(!(flip_endian && fid)); fitsbin_chunk_init(&chunk); // kdtree header is an empty fitsbin_chunk. chunk.tablename = get_table_name(kd->name, KD_STR_HEADER); hdr = fitsbin_get_chunk_header(fb, &chunk); if (inhdr) fits_copy_all_headers(inhdr, hdr, NULL); if (flip_endian) fits_add_reverse_endian(hdr); else fits_add_endian(hdr); fits_header_addf (hdr, "KDT_NAME", "kdtree: name of this tree", "'%s'", kd->name ? kd->name : ""); fits_header_add_int(hdr, "KDT_NDAT", kd->ndata, "kdtree: number of data points"); fits_header_add_int(hdr, "KDT_NDIM", kd->ndim, "kdtree: number of dimensions"); fits_header_add_int(hdr, "KDT_NNOD", kd->nnodes, "kdtree: number of nodes"); fits_header_add_int(hdr, "KDT_VER", KDTREE_FITS_VERSION, "kdtree: version number"); qfits_header_add(hdr, "KDT_EXT", (char*)kdtree_kdtype_to_string(kdtree_exttype(kd)), "kdtree: external type", NULL); qfits_header_add(hdr, "KDT_INT", (char*)kdtree_kdtype_to_string(kdtree_treetype(kd)), "kdtree: type of the tree's structures", NULL); qfits_header_add(hdr, "KDT_DATA", (char*)kdtree_kdtype_to_string(kdtree_datatype(kd)), "kdtree: type of the data", NULL); qfits_header_add(hdr, "KDT_LINL", (kd->has_linear_lr ? "T" : "F"), "kdtree: has_linear_lr", NULL); WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); if (kd->lr) { chunk.tablename = get_table_name(kd->name, KD_STR_LR); chunk.itemsize = sizeof(u32); chunk.nrows = kd->nbottom; chunk.data = kd->lr; if (flip_endian) wordsize = sizeof(u32); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree \"LR\" array. " "This array has one %u-byte, native-endian unsigned int for each " "leaf node in the tree. For each node, it gives the index of the " "rightmost data point owned by the node.", chunk.tablename, chunk.itemsize); WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); } if (kd->perm) { chunk.tablename = get_table_name(kd->name, KD_STR_PERM); chunk.itemsize = sizeof(u32); chunk.nrows = kd->ndata; chunk.data = kd->perm; if (flip_endian) wordsize = sizeof(u32); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree permutation array. " "This array contains one %u-byte, native-endian unsigned int for " "each data point in the tree. For each data point, it gives the " "index that the data point had in the original array on which the " "kdtree was built.", chunk.tablename, chunk.itemsize); WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); } if (kd->bb.any) { chunk.tablename = get_table_name(kd->name, KD_STR_BB); chunk.itemsize = sizeof(ttype) * kd->ndim * 2; chunk.nrows = kd->nnodes; chunk.data = kd->bb.any; if (flip_endian) wordsize = sizeof(ttype); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree bounding-box array. " "This array contains two %u-dimensional points, stored as %u-byte, " "native-endian %ss, for each node in the tree. Each data " "point owned by a node is contained within its bounding box.", chunk.tablename, (unsigned int)kd->ndim, (unsigned int)sizeof(ttype), kdtree_kdtype_to_string(kdtree_treetype(kd))); WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); } if (kd->split.any) { chunk.tablename = get_table_name(kd->name, KD_STR_SPLIT); chunk.itemsize = sizeof(ttype); chunk.nrows = kd->ninterior; chunk.data = kd->split.any; if (flip_endian) wordsize = sizeof(ttype); hdr = fitsbin_get_chunk_header(fb, &chunk); if (!kd->splitdim) { fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree splitting-plane " "boundaries, and also the splitting dimension, packed into " "a %u-byte, native-endian %s, for each interior node in the tree. " "The splitting dimension is packed into the low %u bit%s, and the " "splitting location uses the remaining bits. " "The left child of a node contains data points that lie on the " "low side of the splitting plane, and the right child contains " "data points on the high side of the plane.", chunk.tablename, chunk.itemsize, kdtree_kdtype_to_string(kdtree_treetype(kd)), kd->dimbits, (kd->dimbits > 1 ? "s" : "")); } else { fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree splitting-plane " "boundaries as %u-byte, native-endian %s, for each interior node in the tree. " "The dimension along which the splitting-plane splits is stored in " "a separate array. " "The left child of a node contains data points that lie on the " "low side of the splitting plane, and the right child contains " "data points on the high side of the plane.", chunk.tablename, chunk.itemsize, kdtree_kdtype_to_string(kdtree_treetype(kd))); } WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); } if (kd->splitdim) { chunk.tablename = get_table_name(kd->name, KD_STR_SPLITDIM); chunk.itemsize = sizeof(u8); chunk.nrows = kd->ninterior; chunk.data = kd->splitdim; if (flip_endian) wordsize = sizeof(u8); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree splitting-plane " "dimensions as %u-byte unsigned ints, for each interior node in the tree. " "The location of the splitting-plane along that dimension is stored " "in a separate array. " "The left child of a node contains data points that lie on the " "low side of the splitting plane, and the right child contains " "data points on the high side of the plane.", chunk.tablename, chunk.itemsize); WRITE_CHUNK(); free(chunk.tablename); fitsbin_chunk_reset(&chunk); } if (kd->minval && kd->maxval) { double tempranges[kd->ndim * 2 + 1]; int d; memcpy(tempranges, kd->minval, kd->ndim * sizeof(double)); memcpy(tempranges + kd->ndim, kd->maxval, kd->ndim * sizeof(double)); tempranges[kd->ndim*2] = kd->scale; chunk.tablename = get_table_name(kd->name, KD_STR_RANGE); chunk.itemsize = sizeof(double); chunk.nrows = (kd->ndim * 2 + 1); chunk.data = tempranges; if (flip_endian) wordsize = sizeof(double); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the scaling parameters of the " "kdtree. This tells how to convert from the format of the data " "to the internal format of the tree (and vice versa). " "It is stored as an array " "of %u-byte, native-endian doubles. The first %u elements are " "the lower bound of the data, the next %u elements are the upper " "bound, and the final element is the scale, which says how many " "tree units there are per data unit.", chunk.tablename, chunk.itemsize, (unsigned int)kd->ndim, (unsigned int)kd->ndim); fits_add_long_comment (hdr, "For reference, here are the ranges of the data. Note that " "this is not used by the libkd software, it's just for human readers."); for (d=0; dndim; d++) fits_add_long_comment (hdr, " dim %i: [%g, %g]", d, kd->minval[d], kd->maxval[d]); fits_add_long_comment(hdr, "scale: %g", kd->scale); fits_add_long_comment(hdr, "1/scale: %g", kd->invscale); free(chunk.tablename); WRITE_CHUNK(); fitsbin_chunk_reset(&chunk); } if (kd->data.any) { chunk.tablename = get_table_name(kd->name, KD_STR_DATA); chunk.itemsize = sizeof(dtype) * kd->ndim; chunk.nrows = kd->ndata; chunk.data = kd->data.any; if (flip_endian) wordsize = sizeof(dtype); hdr = fitsbin_get_chunk_header(fb, &chunk); fits_add_long_comment (hdr, "The \"%s\" table contains the kdtree data. " "It is stored as %u-dimensional, %u-byte native-endian %ss.", chunk.tablename, (unsigned int)kd->ndim, (unsigned int)sizeof(dtype), kdtree_kdtype_to_string(kdtree_datatype(kd))); free(chunk.tablename); WRITE_CHUNK(); fitsbin_chunk_reset(&chunk); } return 0; } #undef WRITE_CHUNK #endif astrometry.net-0.67/libkd/kdtree_mem.c000644 000765 000024 00000002657 12651445460 020145 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "kdtree_mem.h" static int memory_total = 0; // Are we tracking memory usage by libkd? #if defined(KDTREE_MEM_TRACK) struct memblock { int nbytes; }; typedef struct memblock memblock; void* MALLOC(size_t sz) { memblock* mb; if (!sz) return NULL; mb = (memblock*)malloc(sz + sizeof(memblock)); mb->nbytes = sz; memory_total += sz; return mb + 1; } void* CALLOC(size_t nmemb, size_t sz) { char* ptr = MALLOC(nmemb * sz); memset(ptr, 0, nmemb * sz); return ptr; } void* REALLOC(void* ptr, size_t sz) { memblock* mb; if (!ptr) { return MALLOC(sz); } if (!sz) { FREE(ptr); return NULL; } mb = ptr; mb--; memory_total += (sz - mb->nbytes); mb->nbytes = sz; mb = realloc(mb, sz + sizeof(memblock)); return mb + 1; } void FREE(void* ptr) { memblock* mb; int nfreed; if (!ptr) return; mb = ptr; mb--; nfreed = mb->nbytes; memory_total -= nfreed; free(mb); } #endif // Is memory-tracking enabled? int kdtree_mem_enabled() { #if defined(KDTREE_MEM_TRACK) return 1; #else return 0; #endif } // Reset the memory usage counter void kdtree_mem_reset() { memory_total = 0; } // Get the current memory usage int kdtree_mem_get() { return memory_total; } astrometry.net-0.67/libkd/kdtree_mem.h000644 000765 000024 00000001202 12651445460 020133 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_MEM_H #define KDTREE_MEM_H #include // Are we tracking memory usage by libkd? #if defined(KDTREE_MEM_TRACK) void* CALLOC(size_t nmemb, size_t sz); void* MALLOC(size_t sz); void* REALLOC(void* ptr, size_t sz); void FREE(void* ptr); #else #define CALLOC calloc #define MALLOC malloc #define REALLOC realloc #define FREE free #endif // Is memory-tracking enabled? int kdtree_mem_enabled(); // Reset the memory usage counter void kdtree_mem_reset(); // Get the current memory usage int kdtree_mem_get(); #endif astrometry.net-0.67/libkd/LICENSE000644 000765 000024 00000002726 12651445460 016667 0ustar00dstnstaff000000 000000 Copyright (c) 2006-2015, Libkd Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Libkd Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. astrometry.net-0.67/libkd/Makefile000644 000765 000024 00000010173 12651445460 017315 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE BASEDIR := .. COMMON := $(BASEDIR)/util all: .PHONY: all include $(COMMON)/makefile.common include $(COMMON)/makefile.libkd SO=$(SHAREDLIB_SUFFIX) INTERNALS := \ kdint_ddd.o \ kdint_fff.o \ kdint_ddu.o \ kdint_duu.o \ kdint_dds.o \ kdint_dss.o KD := kdtree.o kdtree_dim.o kdtree_mem.o KD_FITS := kdtree_fits_io.o DT := dualtree.o dualtree_rangesearch.o dualtree_nearestneighbour.o INSTALL_H := kdtree.h kdtree_fits_io.h dualtree.h \ dualtree_nearestneighbour.h dualtree_rangesearch.h # These are #included by other source files. INTERNAL_SOURCES := kdtree_internal.c kdtree_internal_fits.c INC := $(QFITS_INC) INC += $(ANUTILS_INC) INC += $(LIBKD_INC) CFLAGS := $(CFLAGS_DEF) CFLAGS += $(ANUTILS_CFLAGS) CFLAGS += $(INC) # Track memory usage? #CFLAGS += -DKDTREE_MEM_TRACK LDFLAGS := $(LDFLAGS_DEF) LDLIBS := $(LDLIBS_DEF) LDLIBS += $(LIBKD_LIB) LDLIBS += $(QFITS_LIB) LDLIBS += $(ANUTILS_LIB) LIBKD := libkd.a SLIB := $(LIBKD) SLIB += $(ANUTILS_SLIB) LIBKD_NOIO := libkd-noio.a INTERNALS_NOIO := \ kdint_ddd_noio.o \ kdint_fff_noio.o \ kdint_ddu_noio.o \ kdint_duu_noio.o \ kdint_dds_noio.o \ kdint_dss_noio.o DEP_OBJ := $(KD) $(KD_FITS) $(INTERNALS) $(INTERNALS_NOIO) $(DT) %_noio.o: %.c $(CC) -o $@ -c $< $(CFLAGS) -DKDTREE_NO_FITS all: $(LIBKD) checktree fix-bb $(LIBKD): $(KD) $(KD_FITS) $(INTERNALS) $(DT) -rm -f $@ $(AR) rc $@ $^ $(RANLIB) $@ $(LIBKD_NOIO): $(KD) $(INTERNALS_NOIO) $(DT) -rm -f $@ $(AR) rc $@ $^ $(RANLIB) $@ pyspherematch: spherematch_c$(PYTHON_SO_EXT) @echo pyspherematch py: pyspherematch .PHONY: py .PHONY: pyspherematch PYSPHEREMATCH_OBJ := pyspherematch.o spherematch_c$(PYTHON_SO_EXT): pyspherematch.c setup.py $(SLIB) LDFLAGS="$(LDFLAGS)" LDLIBS="$(LDLIBS)" \ SLIB="$(SLIB)" \ INC="$(INC)" \ CFLAGS="$(CFLAGS)" \ python setup.py build_ext --inplace --force --build-temp . # pyspherematch.c includes Python.h -- so have to make sure to add Python.h include path # (otherwise, get an obscure message from numpy about needing a python built with unicode) ifeq ($(MAKECMDGOALS),spherematch_c$(PYTHON_SO_EXT)) CFLAGS += $(shell python -c "from distutils.sysconfig import *; print '-I'+get_python_inc()") DEP_OBJ += $(PYSPHEREMATCH_OBJ) endif ifeq ($(MAKECMDGOALS),pyspherematch) CFLAGS += $(shell python -c "from distutils.sysconfig import *; print '-I'+get_python_inc()") DEP_OBJ += $(PYSPHEREMATCH_OBJ) endif checktree: checktree.o $(SLIB) fix-bb: fix-bb.o $(SLIB) demo: demo.o $(SLIB) DEP_OBJ += fix-bb.o checktree.o PY_INSTALL_DIR := $(PY_BASE_INSTALL_DIR)/libkd .PHONY: install install: $(LIBKD) @echo Installing in directory '$(INSTALL_DIR)' mkdir -p '$(INSTALL_DIR)/bin' mkdir -p '$(INCLUDE_INSTALL_DIR)' @for x in $(INSTALL_H); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ done mkdir -p '$(LIB_INSTALL_DIR)' @for x in $(LIBKD); do \ echo cp $$x '$(LIB_INSTALL_DIR)'; \ cp $$x '$(LIB_INSTALL_DIR)'; \ done -$(MAKE) install-spherematch .PHONY: install-spherematch install-spherematch: spherematch_c$(PYTHON_SO_EXT) mkdir -p '$(PY_INSTALL_DIR)' @for x in spherematch_c$(PYTHON_SO_EXT) spherematch.py __init__.py; do \ echo cp $$x '$(PY_INSTALL_DIR)'; \ cp $$x '$(PY_INSTALL_DIR)'; \ done ### TESTS are great ALL_TEST_FILES = test_libkd test_libkd_io test_dualtree_nn ALL_TEST_EXTRA_OBJS = ALL_TEST_LIBS = $(SLIB) include $(COMMON)/makefile.tests test_libkd: $(SLIB) test_libkd_io: $(SLIB) test_dualtree_nn: $(SLIB) DEP_OBJ += $(ALL_TEST_FILES_O) $(ALL_TEST_FILES_MAIN_O) ### /TESTS .PHONY: clean clean: -rm -f $(LIBKD) $(KD) $(KD_FITS) deps $(DEPS) \ checktree checktree.o \ fix-bb fix-bb.o \ $(INTERNALS) $(INTERNALS_NOIO) $(LIBKD_NOIO) $(DT) \ $(ALL_TESTS_CLEAN) \ $(PYSPHEREMATCH_OBJ) spherematch_c$(PYTHON_SO_EXT) *~ *.dep deps -rm -Rf build .PHONY: tags tags: etags `find . -name "*.c" -o -name "*.h"` DEP_PREREQS := $(QFITS_LIB) include $(COMMON)/makefile.deps # Borrowed from makefile.deps %_noio.dep : %.c $(CC) $(DEP_ARGS) $< -MT $(addsuffix .o, $(basename $@)) $(DEP_OUT) $@ cflags: echo $(CFLAGS) astrometry.net-0.67/libkd/Makefile.min000644 000765 000024 00000004041 12651445460 020074 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE all: .PHONY: all include ../util/makefile.common INTERNALS := \ kdint_ddd.o \ kdint_fff.o \ kdint_ddu.o \ kdint_duu.o \ kdint_dds.o \ kdint_dss.o KD := kdtree.o kdtree_dim.o kdtree_mem.o KD_FITS := kdtree_fits_io.o DT := dualtree.o dualtree_rangesearch.o dualtree_nearestneighbour.o QFITSO := ../qfits-an/anqfits.o ../qfits-an/qfits_tools.o \ ../qfits-an/qfits_table.o ../qfits-an/qfits_float.o \ ../qfits-an/qfits_error.o ../qfits-an/qfits_time.o \ ../qfits-an/qfits_card.o ../qfits-an/qfits_header.o \ ../qfits-an/qfits_rw.o ../qfits-an/qfits_memory.o \ ../qfits-an/qfits_convert.o ../qfits-an/qfits_byteswap.o UTILO := ../util/ioutils.o ../util/os-features.o \ ../util/mathutil.o ../util/fitsioutils.o \ ../util/fitsbin.o ../util/bl.o ../util/an-endian.o \ ../util/fitsfile.o ../util/log.o \ ../util/errors.o ../util/tic.o INC := -I../util -I../qfits-an CFLAGS += $(INC) libkd-min.a: $(DT) $(KD_FITS) $(KD) $(INTERNALS) $(QFITSO) $(UTILO) -rm -f $@ $(AR) rc $@ $^ $(RANLIB) $@ spherematch_c.so: pyspherematch.c setup-min.py libkd-min.a INC="$(INC)" CFLAGS="$(CFLAGS)" \ python setup-min.py build_ext --inplace --build-temp . --force ALL_TEST_FILES := test_dualtree_nn test_libkd test_libkd_io all: libkd-min.a $(ALL_TEST_FILES) ALL_TEST_OBJS := libkd-min.a COMMON := ../util ALL_TEST_FILES_C = $(addsuffix .c, $(ALL_TEST_FILES)) ALL_TEST_FILES_O = $(addsuffix .o, $(ALL_TEST_FILES)) ALL_TEST_FILES_MAIN_C = $(addsuffix -main.c, $(ALL_TEST_FILES)) ALL_TEST_FILES_MAIN_O = $(addsuffix -main.o, $(ALL_TEST_FILES)) $(ALL_TEST_FILES_MAIN_C): %-main.c: $(MAKE_TESTS) $(ALL_TEST_FILES_MAIN_C): %-main.c: %.c $(AN_SHELL) $(MAKE_TESTS) $^ > $@ MAKE_TESTS := $(COMMON)/make-tests.sh $(ALL_TEST_FILES): %: %-main.o %.o $(COMMON)/cutest.o $(ALL_TEST_OBJS) TEST_SOURCES = $(ALL_TEST_FILES_C) test.c: $(MAKE_TESTS) $(TEST_SOURCES) $(AN_SHELL) $(MAKE_TESTS) $(TEST_SOURCES) > $@ # test_dt_nn: test_dualtree_nn.o libkd-min.a \ # $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) astrometry.net-0.67/libkd/pyspherematch.c000644 000765 000024 00000047566 12651445460 020715 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "Python.h" #include #include #include "numpy/arrayobject.h" #include "os-features.h" #include "kdtree.h" #include "kdtree_fits_io.h" #include "dualtree_rangesearch.h" #include "dualtree_nearestneighbour.h" #include "bl.h" static PyObject* spherematch_kdtree_build(PyObject* self, PyObject* args) { int N, D; int i,j; int Nleaf, treeoptions, treetype; kdtree_t* kd; double* data; PyArrayObject* x; if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &x)) return NULL; if (PyArray_NDIM(x) != 2) { PyErr_SetString(PyExc_ValueError, "array must be two-dimensional"); return NULL; } if (PyArray_TYPE(x) != PyArray_DOUBLE) { PyErr_SetString(PyExc_ValueError, "array must contain doubles"); return NULL; } N = (int)PyArray_DIM(x, 0); D = (int)PyArray_DIM(x, 1); if (D > 10) { PyErr_SetString(PyExc_ValueError, "maximum dimensionality is 10: maybe you need to transpose your array?"); return NULL; } data = malloc(N * D * sizeof(double)); for (i=0; idata.any); kdtree_free(kd); return Py_BuildValue(""); } static PyObject* spherematch_kdtree_write(PyObject* self, PyObject* args) { long i; kdtree_t* kd; char* fn; int rtn; if (!PyArg_ParseTuple(args, "ls", &i, &fn)) { PyErr_SetString(PyExc_ValueError, "need two args: kdtree identifier (int), filename (string)"); return NULL; } // Nasty! kd = (kdtree_t*)i; rtn = kdtree_fits_write(kd, fn, NULL); return Py_BuildValue("i", rtn); } static PyObject* spherematch_kdtree_open(PyObject* self, PyObject* args) { kdtree_t* kd; char* fn; char* treename = NULL; int n; n = PyTuple_Size(args); if (!((n == 1) || (n == 2))) { PyErr_SetString(PyExc_ValueError, "need one or two args: kdtree filename + optionally tree name"); return NULL; } if (n == 1) { if (!PyArg_ParseTuple(args, "s", &fn)) { return NULL; } } else { if (!PyArg_ParseTuple(args, "ss", &fn, &treename)) { return NULL; } } kd = kdtree_fits_read(fn, treename, NULL); return Py_BuildValue("k", kd); } static PyObject* spherematch_kdtree_close(PyObject* self, PyObject* args) { long i; kdtree_t* kd; if (!PyArg_ParseTuple(args, "l", &i)) { PyErr_SetString(PyExc_ValueError, "need one arg: kdtree identifier (int)"); return NULL; } // Nasty! kd = (kdtree_t*)i; kdtree_fits_close(kd); return Py_BuildValue(""); } static PyObject* spherematch_kdtree_n(PyObject* self, PyObject* args) { long i; kdtree_t* kd; if (!PyArg_ParseTuple(args, "l", &i)) { PyErr_SetString(PyExc_ValueError, "need one arg: kdtree identifier (int)"); return NULL; } // Nasty! kd = (kdtree_t*)i; return PyInt_FromLong(kdtree_n(kd)); } struct dualtree_results2 { kdtree_t *kd1; kdtree_t *kd2; PyObject* indlist; anbool permute; }; static void callback_dualtree2(void* v, int ind1, int ind2, double dist2) { struct dualtree_results2* dt = v; PyObject* lst; if (dt->permute) { ind1 = kdtree_permute(dt->kd1, ind1); ind2 = kdtree_permute(dt->kd2, ind2); } lst = PyList_GET_ITEM(dt->indlist, ind1); if (!lst) { lst = PyList_New(1); // SetItem steals a ref -- that's what we want. PyList_SetItem(dt->indlist, ind1, lst); PyList_SET_ITEM(lst, 0, PyInt_FromLong(ind2)); } else { PyList_Append(lst, PyInt_FromLong(ind2)); } } static PyObject* spherematch_match2(PyObject* self, PyObject* args) { int i, N; long p1, p2; struct dualtree_results2 dtresults; kdtree_t *kd1, *kd2; double rad; PyObject* indlist; anbool notself; anbool permute; // So that ParseTuple("b") with a C "anbool" works assert(sizeof(anbool) == sizeof(unsigned char)); if (!PyArg_ParseTuple(args, "lldbb", &p1, &p2, &rad, ¬self, &permute)) { PyErr_SetString(PyExc_ValueError, "spherematch_c.match: need five args: two kdtree identifiers (ints), search radius (float), notself (boolean), permuted (boolean)"); return NULL; } // Nasty! kd1 = (kdtree_t*)p1; kd2 = (kdtree_t*)p2; N = kdtree_n(kd1); indlist = PyList_New(N); assert(indlist); dtresults.kd1 = kd1; dtresults.kd2 = kd2; dtresults.indlist = indlist; dtresults.permute = permute; dualtree_rangesearch(kd1, kd2, 0.0, rad, notself, NULL, callback_dualtree2, &dtresults, NULL, NULL); // set empty slots to None, not NULL. for (i=0; iinds1, ind1); il_append(dtresults->inds2, ind2); dl_append(dtresults->dists, sqrt(dist2)); } static PyObject* spherematch_match(PyObject* self, PyObject* args) { size_t i, N; long p1, p2; kdtree_t *kd1, *kd2; double rad; struct dualtree_results dtresults; PyArrayObject* inds; npy_intp dims[2]; PyArrayObject* dists; anbool notself; anbool permute; PyObject* rtn; // So that ParseTuple("b") with a C "anbool" works assert(sizeof(anbool) == sizeof(unsigned char)); if (!PyArg_ParseTuple(args, "lldbb", &p1, &p2, &rad, ¬self, &permute)) { PyErr_SetString(PyExc_ValueError, "spherematch_c.match: need five args: two kdtree identifiers (ints), search radius (float), notself (boolean), permuted (boolean)"); return NULL; } //printf("Notself = %i\n", (int)notself); // Nasty! kd1 = (kdtree_t*)p1; kd2 = (kdtree_t*)p2; dtresults.inds1 = il_new(256); dtresults.inds2 = il_new(256); dtresults.dists = dl_new(256); dualtree_rangesearch(kd1, kd2, 0.0, rad, notself, NULL, callback_dualtree, &dtresults, NULL, NULL); N = il_size(dtresults.inds1); dims[0] = N; dims[1] = 2; inds = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_INT); dims[1] = 1; dists = (PyArrayObject*)PyArray_SimpleNew(2, dims, PyArray_DOUBLE); for (i=0; indim; dims[0] = D; dims[1] = 2; bbox = (PyArrayObject*)PyArray_SimpleNew(2, dims, NPY_DOUBLE); { double bblo[D]; double bbhi[D]; ok = kdtree_get_bboxes(kd, 0, bblo, bbhi); if (!ok) { Py_RETURN_NONE; } assert(ok); bb = PyArray_DATA(bbox); for (j=0; jndim; if (sortdists) { getdists = 1; } Py_INCREF(dtype); pyI = PyArray_FromAny(pyO, dtype, 1, 1, req, NULL); if (!pyI) { PyErr_SetString(PyExc_ValueError, "Failed to convert query point array to np array of float"); Py_XDECREF(dtype); return NULL; } N = (int)PyArray_DIM(pyI, 0); if (N != D) { PyErr_SetString(PyExc_ValueError, "Query point must have size == dimension of tree"); Py_DECREF(pyI); Py_DECREF(dtype); return NULL; } X = PyArray_DATA(pyI); opts = 0; if (getdists) { opts |= KD_OPTIONS_COMPUTE_DISTS; } if (sortdists) { opts |= KD_OPTIONS_SORT_DISTS; } res = kdtree_rangesearch_options(kd, X, radius*radius, opts); N = res->nres; dims[0] = N; res->inds = realloc(res->inds, N * sizeof(uint32_t)); pyInds = PyArray_SimpleNewFromData(1, dims, NPY_UINT32, res->inds); res->inds = NULL; if (getdists) { res->sdists = realloc(res->sdists, N * sizeof(double)); pyDists = PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, res->sdists); res->sdists = NULL; } kdtree_free_query(res); Py_DECREF(pyI); Py_DECREF(dtype); if (getdists) { rtn = Py_BuildValue("(OO)", pyInds, pyDists); Py_DECREF(pyDists); } else { rtn = Py_BuildValue("O", pyInds); } Py_DECREF(pyInds); return rtn; } static PyObject* spherematch_kdtree_get_data(PyObject* self, PyObject* args) { PyArrayObject* pyX; double* X; PyObject* rtn; npy_intp dims[2]; long i; kdtree_t* kd; int k, D, N; //npy_int* I; npy_uint32* I; PyObject* pyO; PyObject* pyI; // this is the type returned by kdtree_rangesearch PyArray_Descr* dtype = PyArray_DescrFromType(NPY_UINT32); int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; if (!PyArg_ParseTuple(args, "lO", &i, &pyO)) { PyErr_SetString(PyExc_ValueError, "need two args: kdtree identifier (int), index array (numpy array of ints)"); return NULL; } // Nasty! kd = (kdtree_t*)i; D = kd->ndim; Py_INCREF(dtype); pyI = PyArray_FromAny(pyO, dtype, 1, 1, req, NULL); if (!pyI) { PyErr_SetString(PyExc_ValueError, "Failed to convert index array to np array of int"); Py_XDECREF(dtype); return NULL; } N = (int)PyArray_DIM(pyI, 0); dims[0] = N; dims[1] = D; pyX = (PyArrayObject*)PyArray_SimpleNew(2, dims, NPY_DOUBLE); X = PyArray_DATA(pyX); I = PyArray_DATA(pyI); for (k=0; k #include #include #include #define GET(x) (arr[(x)]) #define ELEM_SWAP(il, ir) { \ if ((il) != (ir)) { \ int tmp = arr[(il)]; \ arr[(il)] = arr[(ir)]; \ arr[(ir)] = tmp; }} int main() { int* arr; int N = 30; int mx = 100; int i; int L = 0; int R = N-1; time_t t; /* t = 981; */ t = time(NULL); t = t % 1000; printf("t=%i\n", (int)t); srand(t); arr = malloc(N * sizeof(int)); for (i=0; i GET(high)) ELEM_SWAP(middle, high); if (GET(low) > GET(high)) ELEM_SWAP(low, high); if (GET(middle) > GET(low)) ELEM_SWAP(middle, low); /* Swap low item (now in position middle) into position (low+1) */ ELEM_SWAP(middle, low + 1) ; midval = GET(low); printf("middle value: %i\n", midval); printf("beginning:\n"); for (i=L; i<=R; i++) { if (i == low) printf("( "); printf("%i ", GET(i)); if (i == high) printf(") "); } printf("\n"); /* Count the number of items in each category. */ nless = nequal = 0; for (i=low; i<=high; i++) { if (GET(i) < midval) nless++; else if (GET(i) == midval) nequal++; } /* "equal" is the index where the items equal to "midval" will end up. */ equal = low + nless; /* "greater" is the index where the items greater than "midval" will end up. */ greater = equal + nequal; /* Nibble from each end towards middle, swapping items when stuck */ ll = low + 1; hh = high; for (;;) { while ((GET(ll) < midval) && (ll <= hh)) ll++; while ((GET(hh) >= midval) && (ll <= hh)) hh--; if (hh < ll) break; ELEM_SWAP(ll, hh); } /* Swap middle item (in position low) back into correct position */ ELEM_SWAP(low, hh); /* Where did the middle value end up? */ midpos = hh; printf("after swapping middle value back into place:\n"); for (i=L; i<=R; i++) { if (i == low) printf("( "); if (i == midpos) printf("*"); printf("%i ", GET(i)); if (i == high) printf(") "); } printf("\n"); for (i=low; i= midval); /* Collect all items equal to the middle value. At this point items less than "midval" are in the left part of the array, and items equal to or greater than "midval" are in the right side. Nibble the right side, moving "=" and ">" items into their respective halves. */ ll = equal; hh = high; for (;;) { while ((GET(ll) == midval) && (ll < greater)) ll++; while ((GET(hh) > midval) && (hh >= ll)) hh--; if (hh < ll) break; ELEM_SWAP(ll, hh); } printf("after collecting equal items:\n"); for (i=L; i<=R; i++) { if (i == low) printf("( "); if (i == midpos) printf("*"); printf("%i ", GET(i)); if (i == high) printf(") "); } printf("\n"); for (i=low; i midval); /* You might want to choose some value other than the median to produce splits of closer to equal size. */ { int nl = equal - L; int nh = R + 1 - greater; printf("nl=%i, ne=%i, nh=%i.\n", nl, nequal, nh); printf("greater=%i, high=%i.\n", greater, high); /* "greater <= high" ensures that there is at least one element in the high partition. */ if ((greater <= high) && (nh > nl) && (nl + nequal >= nh)) { /* The high partition is already bigger, so select the first value in the high partition, which means the middle partition will end up to the left of the new "median". */ median = greater; printf("Changed \"median\" to %i.\n", median); low = greater; continue; } } /* Is the median in the "<", "=", or ">" partition? */ if (median < equal) { // low is unchanged. high = equal - 1; printf("median is in low partition.\n"); } else if (median < greater) { /* the median is inside the "=" partition; we've isolated the median. */ low = high = equal; printf("median is in middle partition.\n"); break; } else { // high is unchanged. low = greater; printf("median is in high partition.\n"); } } if (high == low + 1) { /* Two elements only */ if (GET(low) > GET(high)) ELEM_SWAP(low, high); } median = low; midval = GET(median); printf("end:\n"); for (i=L; i<=R; i++) { if (i == median) printf("*"); printf("%i ", GET(i)); } printf("\n"); /* check that it worked. */ for (i = L; i < median; i++) { assert(GET(i) < midval); } for (i = median; i <= R; i++) { /* Assert contention: i just changed this assert to ">" from ">=" * because for the inttree, i need strict median guarentee * (i.e. all the median values are on one side or the other of * the return value of this function) If this causes problems * let me know --k */ assert(GET(i) >= midval); } } free(arr); return 0; } astrometry.net-0.67/libkd/README000644 000765 000024 00000006176 12651445460 016545 0ustar00dstnstaff000000 000000 libkd: a library for building and using kd-trees. libkd is Copyright 2006-2015 Dustin Lang and Keir Mierle. libkd is free software, licensed under a 3-clause BSD-style license. See the file LICENSE for the full terms. Dustin Lang is dstndstn (at) gmail (dot) com Keir Mierle is mierle (at) gmail (dot) com About the code internals: ------------------------- We use some nasty preprocessors magic to support multiple data types. It probably would have been better to write them as C++ templates. One lives and learns. The instantiation of the "templates" happens in the files "kdint_*.c" and friends. These in turn #include one each of "kdint_[edt]type_*.h". There are three data types involved: * the "external" type -- the type accepted by the external API, for example, the datatype of the kdtree_nearest_neighbour() query point. * the "tree" type -- the type used to describe the bounding boxes or splitting planes within the tree. * the "data" type -- the type used to store the data points within the tree. We also tried to write some functions so that the dimension of the tree could be declared constant at compile time -- so there would be separate compiled code for three-dimensional or two-dimensional trees. But that became hard to manage so we don't use it now. When instantiated, the function names have the datatypes appended to them. For example, if you look in the libkd.a file, you'll see: > nm libkd/libkd.a | grep "T _kdtree_rangesearch_options" 0000000000000130 T _kdtree_rangesearch_options 00000000000009e0 T _kdtree_rangesearch_options_ddd 0000000000000a00 T _kdtree_rangesearch_options_fff 00000000000011e0 T _kdtree_rangesearch_options_ddu 0000000000001210 T _kdtree_rangesearch_options_duu 00000000000011e0 T _kdtree_rangesearch_options_dds 0000000000001240 T _kdtree_rangesearch_options_dss Where the first one is the entry-point which dispatches to the instantiated ones based on the kdtree_t.treetype value. (To make things more elaborate, we also started gathering the function pointers into a "vtable", kdtree_t.fun, and that is used in some places.) There are some preprocessor functions to support the name mangling. For example, take the function declared in kdtree.h: kdtree_t* kdtree_convert_data(kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype); The kdtree_convert_data entry point is in kdtree.c: KD_DECLARE(kdtree_convert_data, kdtree_t*, (kdtree_t* kd, void* data, int N, int D, int Nleaf)); kdtree_t* kdtree_convert_data(kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype) { kdtree_t* res = NULL; KD_DISPATCH(kdtree_convert_data, treetype, res=, (kd, data, N, D, Nleaf)); if (res) res->converted_data = TRUE; return res; } and the actual implementation is in kdtree_internal.c: kdtree_t* MANGLE(kdtree_convert_data) (kdtree_t* kd, etype* edata, int N, int D, int Nleaf) { dtype* ddata; int i, d; //// ..... } Note that in kdtree_interal.c you get to assume that "etype" is typedef'd to the external datatype, "dtype" is the tree's datatype, etc. astrometry.net-0.67/libkd/setup-min.py000644 000765 000024 00000002605 12651445460 020151 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE from distutils.core import setup, Extension import numpy import os.path from numpy.distutils.misc_util import get_numpy_include_dirs numpy_inc = get_numpy_include_dirs() print 'Numpy inc:', numpy_inc def strlist(s, split=' '): lst = s.split(split) lst = [i.strip() for i in lst] lst = [i for i in lst if len(i)] return lst link = ' '.join([os.environ.get('LDFLAGS', ''), os.environ.get('LDLIBS', ''),]) link = strlist(link) #objs = strlist(os.environ.get('SLIB', '')) inc = strlist(os.environ.get('INC', ''), split='-I') cflags = strlist(os.environ.get('CFLAGS', '')) print 'link:', link #print 'objs:', objs print 'inc:', inc print 'cflags:', cflags c_module = Extension('spherematch_c', sources = ['pyspherematch.c'], include_dirs = numpy_inc + inc, extra_objects = ['libkd-min.a'], extra_compile_args = cflags, extra_link_args=link, ) setup(name = 'Kdtree matching in Python', version = '1.0', description = 'This package finds near neighbours in two sets of points', author = 'Astrometry.net (Dustin Lang)', author_email = 'dstn@cmu.edu', url = 'http://astrometry.net', py_modules = [ 'spherematch' ], ext_modules = [c_module]) astrometry.net-0.67/libkd/setup.py000644 000765 000024 00000002532 12651445460 017367 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE from distutils.core import setup, Extension import numpy import os.path from numpy.distutils.misc_util import get_numpy_include_dirs numpy_inc = get_numpy_include_dirs() def strlist(s, split=' '): lst = s.split(split) lst = [i.strip() for i in lst] lst = [i for i in lst if len(i)] return lst link = ' '.join([os.environ.get('LDFLAGS', ''), os.environ.get('LDLIBS', ''),]) link = strlist(link) objs = strlist(os.environ.get('SLIB', '')) inc = strlist(os.environ.get('INC', ''), split='-I') cflags = strlist(os.environ.get('CFLAGS', '')) print 'link:', link print 'objs:', objs print 'inc:', inc print 'cflags:', cflags c_module = Extension('spherematch_c', sources = ['pyspherematch.c'], include_dirs = numpy_inc + inc, extra_objects = objs, extra_compile_args = cflags, extra_link_args=link, ) setup(name = 'Kdtree matching in Python', version = '1.0', description = 'This package finds near neighbours in two sets of points', author = 'Astrometry.net (Dustin Lang)', author_email = 'dstn@cmu.edu', url = 'http://astrometry.net', py_modules = [ 'spherematch' ], ext_modules = [c_module]) astrometry.net-0.67/libkd/spherematch.py000644 000765 000024 00000031035 12651445460 020532 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE from . import spherematch_c from ..util.starutil_numpy import radectoxyz, deg2dist, dist2deg, distsq2deg import numpy as np def match_xy(x1,y1, x2,y2, R, **kwargs): ''' Like match_radec, except for plain old 2-D points. ''' I,d = match(np.vstack((x1,y1)).T, np.vstack((x2,y2)).T, R, **kwargs) return I[:,0],I[:,1],d # Copied from "celestial.py" by Sjoert van Velzen. def match_radec(ra1, dec1, ra2, dec2, radius_in_deg, notself=False, nearest=False, indexlist=False, count=False): ''' (m1,m2,d12) = match_radec(ra1,dec1, ra2,dec2, radius_in_deg) Cross-matches numpy arrays of RA,Dec points. Behaves like spherematch.pro of IDL ra1,dec1 (and 2): RA,Dec in degrees of points to match. Must be scalars or numpy arrays. radius_in_deg: search radius in degrees. notself: if True, avoids returning 'identity' matches; ASSUMES that ra1,dec1 == ra2,dec2. nearest: if True, returns only the nearest match in (ra2,dec2) for each point in (ra1,dec1). indexlist: returns a list of length len(ra1), containing None or a list of ints of matched points in ra2,dec2. Returns this list. Returns: m1: indices into the "ra1,dec1" arrays of matching points. Numpy array of ints. m2: same, but for "ra2,dec2". d12: distance, in degrees, between the matching points. ''' # Convert to coordinates on the unit sphere xyz1 = radectoxyz(ra1, dec1) #if all(ra1 == ra2) and all(dec1 == dec2): if ra1 is ra2 and dec1 is dec2: xyz2 = xyz1 else: xyz2 = radectoxyz(ra2, dec2) r = deg2dist(radius_in_deg) extra = () if nearest: X = _nearest_func(xyz2, xyz1, r, notself=notself, count=count) if not count: (inds,dists2) = X I = np.flatnonzero(inds >= 0) J = inds[I] d = distsq2deg(dists2[I]) else: #print 'X', X #(inds,dists2,counts) = X J,I,d,counts = X extra = (counts,) print 'I', I.shape, I.dtype print 'J', J.shape, J.dtype print 'counts', counts.shape, counts.dtype else: X = match(xyz1, xyz2, r, notself=notself, indexlist=indexlist) if indexlist: return X (inds,dists) = X dist_in_deg = dist2deg(dists) I,J = inds[:,0], inds[:,1] d = dist_in_deg[:,0] return (I, J, d) + extra def cluster_radec(ra, dec, R, singles=False): ''' Finds connected groups of objects in RA,Dec space. Returns a list of lists of indices that are connected, EXCLUDING singletons. If *singles* is *True*, also returns the indices of singletons. ''' I,J,d = match_radec(ra, dec, ra, dec, R, notself=True) # 'mgroups' maps each index in a group to a list of the group members mgroups = {} # 'ugroups' is a list of the unique groups ugroups = [] for i,j in zip(I,J): # Are both sources already in groups? if i in mgroups and j in mgroups: # Are they already in the same group? if mgroups[i] == mgroups[j]: continue # merge if they are different; # assert(they are disjoint) lsti = mgroups[i] lstj = mgroups[j] merge = lsti + lstj for k in merge: mgroups[k] = merge ugroups.remove(lsti) ugroups.remove(lstj) ugroups.append(merge) elif i in mgroups: # Add j to i's group lst = mgroups[i] lst.append(j) mgroups[j] = lst elif j in mgroups: # Add i to j's group lst = mgroups[j] lst.append(i) mgroups[i] = lst else: # Create a new group lst = [i,j] mgroups[i] = lst mgroups[j] = lst ugroups.append(lst) if singles: S = np.ones(len(ra), bool) for g in ugroups: S[np.array(g)] = False S = np.flatnonzero(S) return ugroups,S return ugroups def _cleaninputs(x1, x2): fx1 = x1.astype(np.float64) if x2 is x1: fx2 = fx1 else: fx2 = x2.astype(np.float64) (N1,D1) = fx1.shape (N2,D2) = fx2.shape if D1 != D2: raise ValueError, 'Arrays must have the same dimensionality' return (fx1,fx2) def _buildtrees(x1, x2): (fx1, fx2) = _cleaninputs(x1, x2) kd1 = spherematch_c.kdtree_build(fx1) if fx2 is fx1: kd2 = kd1 else: kd2 = spherematch_c.kdtree_build(fx2) return (kd1, kd2) def _freetrees(kd1, kd2): spherematch_c.kdtree_free(kd1) if kd2 != kd1: spherematch_c.kdtree_free(kd2) def match(x1, x2, radius, notself=False, permuted=True, indexlist=False): ''' (indices,dists) = match(x1, x2, radius): OR inds = match(x1, x2, radius, indexlist=True): Given an N1 x D1 array x1, and an N2 x D2 array x2, and radius: Returns the indices (Nx2 int array) and distances (Nx1 float array) between points in "x1" and "x2" that are within "radius" Euclidean distance of each other. "x1" is N1xD and "x2" is N2xD. "x1" and "x2" can be the same array. Dimensions D above 5-10 will probably not run faster than naive. Despite the name of this package, the arrays x1 and x2 need not be celestial positions; in particular, there is no RA wrapping at 0, and no special handling at the poles. If you want to match celestial coordinates like RA,Dec, see the match_radec function. If "indexlist" is True, the return value is a python list with one element per data point in the first tree; that element is a python list containing the indices of points matched in the second tree. The "indices" return value has a row for each match; the matched points are: x1[indices[:,0],:] and x2[indices[:,1],:] This function doesn\'t know about spherical coordinates -- it just searches for matches in n-dimensional space. >>> from astrometry.util.starutil_numpy import * >>> from astrometry.libkd import spherematch # RA,Dec in degrees >>> ra1 = array([ 0, 1, 2, 3, 4, 359,360]) >>> dec1 = array([-90,-89,-1, 0, 1, 89, 90]) # xyz: N x 3 array: unit vectors >>> xyz1 = radectoxyz(ra1, dec1) >>> ra2 = array([ 45, 1, 4, 4, 4, 0, 1]) >>> dec2 = array([-89, -88, -1, 0, 2, 89, 89]) >>> xyz2 = radectoxyz(ra2, dec2) # The \'radius\' is now distance between points on the unit sphere -- # for small angles, this is ~ angular distance in radians. You can use # the function: >>> radius_in_deg = 2. >>> r = sqrt(deg2distsq(radius_in_deg)) >>> (inds,dists) = spherematch.match(xyz1, xyz2, r) # Now "inds" is an Mx2 array of the matching indices, # and "dists" the distances between them: # eg, sqrt(sum((xyz1[inds[:,0],:] - xyz2[inds[:,1],:])**2, axis=1)) = dists >>> print inds [[0 0] [1 0] [1 1] [2 2] [3 2] [3 3] [4 3] [4 4] [5 5] [6 5] [5 6] [6 6]] >>> print sqrt(sum((xyz1[inds[:,0],:] - xyz2[inds[:,1],:])**2, axis=1)) [ 0.01745307 0.01307557 0.01745307 0.0348995 0.02468143 0.01745307 0.01745307 0.01745307 0.0003046 0.01745307 0.00060917 0.01745307] >>> print dists[:,0] [ 0.01745307 0.01307557 0.01745307 0.0348995 0.02468143 0.01745307 0.01745307 0.01745307 0.0003046 0.01745307 0.00060917 0.01745307] >>> print vstack((ra1[inds[:,0]], dec1[inds[:,0]], ra2[inds[:,1]], dec2[inds[:,1]])).T [[ 0 -90 45 -89] [ 1 -89 45 -89] [ 1 -89 1 -88] [ 2 -1 4 -1] [ 3 0 4 -1] [ 3 0 4 0] [ 4 1 4 0] [ 4 1 4 2] [359 89 0 89] [360 90 0 89] [359 89 1 89] [360 90 1 89]] ''' (kd1,kd2) = _buildtrees(x1, x2) if indexlist: inds = spherematch_c.match2(kd1, kd2, radius, notself, permuted) else: (inds,dists) = spherematch_c.match(kd1, kd2, radius, notself, permuted) _freetrees(kd1, kd2) if indexlist: return inds return (inds,dists) def match_naive(x1, x2, radius, notself=False): ''' Does the same thing as match(), but the straight-forward slow way. (Not necessarily the way you\'d do it in python either). Not very fair as a speed comparison, but useful to convince yourself that match() does the right thing. ''' (fx1, fx2) = _cleaninputs(x1, x2) (N1,D1) = x1.shape (N2,D2) = x2.shape inds = [] dists = [] for i1 in range(N1): for i2 in range(N2): if notself and i1 == i2: continue d2 = sum((x1[i1,:] - x2[i2,:])**2) if d2 < radius**2: inds.append((i1,i2)) dists.append(sqrt(d2)) inds = array(inds) dists = array(dists) return (inds,dists) def nearest(x1, x2, maxradius, notself=False, count=False): ''' For each point in x2, returns the index of the nearest point in x1, if there is a point within 'maxradius'. (Note, this may be backward from what you want/expect!) ''' (kd1,kd2) = _buildtrees(x1, x2) if count: X = spherematch_c.nearest2(kd1, kd2, maxradius, notself, count) else: X = spherematch_c.nearest(kd1, kd2, maxradius, notself) _freetrees(kd1, kd2) return X _nearest_func = nearest def tree_build_radec(ra=None, dec=None, xyz=None): if ra is not None: (N,) = ra.shape xyz = np.zeros((N,3)).astype(float) xyz[:,2] = np.sin(np.deg2rad(dec)) cosd = np.cos(np.deg2rad(dec)) xyz[:,0] = cosd * np.cos(np.deg2rad(ra)) xyz[:,1] = cosd * np.sin(np.deg2rad(ra)) kd = spherematch_c.kdtree_build(xyz) return kd def tree_build(X): ''' X: Numpy array of shape (N,D) Returns: kdtree identifier. ''' return spherematch_c.kdtree_build(X) def tree_free(kd): spherematch_c.kdtree_free(kd) def tree_save(kd, fn): rtn = spherematch_c.kdtree_write(kd, fn) return rtn def tree_open(fn, treename=None): if treename is None: return spherematch_c.kdtree_open(fn) else: return spherematch_c.kdtree_open(fn, treename) def tree_close(kd): return spherematch_c.kdtree_close(kd) def tree_search(kd, pos, radius, getdists=False, sortdists=False): return spherematch_c.kdtree_rangesearch(kd, pos, radius, int(getdists), int(sortdists)) def tree_search_radec(kd, ra, dec, radius, getdists=False, sortdists=False): ''' ra,dec in degrees radius in degrees ''' dec = np.deg2rad(dec) cosd = np.cos(dec) ra = np.deg2rad(ra) pos = np.array([cosd * np.cos(ra), cosd * np.sin(ra), np.sin(dec)]) rad = deg2dist(radius) return tree_search(kd, pos, rad, getdists=getdists, sortdists=sortdists) def trees_match(kd1, kd2, radius, nearest=False, notself=False, permuted=True, count=False): ''' Runs rangesearch or nearest-neighbour matching on given kdtrees. 'radius' is Euclidean distance. If 'nearest'=True, returns the nearest neighbour of each point in "kd1"; ie, "I" will NOT contain duplicates, but "J" may. If 'count'=True, also counts the number of objects within range as well as returning the nearest neighbor of each point in "kd1"; the return value becomes I,J,d,counts , counts a numpy array of ints. Returns (I, J, d), where I are indices into kd1 J are indices into kd2 d are distances-squared [counts is number of sources in range] >>> import numpy as np >>> X = np.array([[1, 2, 3, 6]]).T.astype(float) >>> Y = np.array([[1, 4, 4]]).T.astype(float) >>> kd1 = tree_build(X) >>> kd2 = tree_build(Y) >>> I,J,d = trees_match(kd1, kd2, 1.1, nearest=True) >>> print I [0 1 2] >>> print J [0 0 2] >>> print d [ 0. 60. 60.] >>> I,J,d,count = trees_match(kd1, kd2, 1.1, nearest=True, count=True) >>> print I [0 1 2] >>> print J [0 0 2] >>> print d [ 0. 60. 60.] >>> print count [1 1 2] ''' rtn = None if nearest: rtn = spherematch_c.nearest2(kd2, kd1, radius, notself, count) # J,I,d,[count] rtn = (rtn[1], rtn[0], np.sqrt(rtn[2])) + rtn[3:] #distsq2deg(rtn[2]), else: (inds,dists) = spherematch_c.match(kd1, kd2, radius, notself, permuted) #d = dist2deg(dists[:,0]) d = dists[:,0] I,J = inds[:,0], inds[:,1] rtn = (I,J,d) return rtn tree_permute = spherematch_c.kdtree_permute tree_bbox = spherematch_c.kdtree_bbox tree_n = spherematch_c.kdtree_n tree_print = spherematch_c.kdtree_print tree_data = spherematch_c.kdtree_get_positions if __name__ == '__main__': import doctest doctest.testmod() astrometry.net-0.67/libkd/test-quickselect.c000644 000765 000024 00000021267 12651445460 021320 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include typedef double dtype; static int kdtree_quickselect_partition(dtype *arr, unsigned int *parr, int L, int R, int D, int d); int main(int argc, char** args) { int i, d; int D = 3; int N = 10000; int T = 1000, t; dtype* arr; unsigned int* perm; srand(time(NULL)); perm = malloc(N * sizeof(int)); arr = malloc(N * D * sizeof(dtype)); for (t=0; t= L); /* Find the median and partition the data */ low = L; high = R; median = (low + high + 1) / 2; while(1) { dtype vals[3]; dtype tmp; dtype pivot; int i,j; int iless, iequal, igreater; int endless, endequal, endgreater; int nless, nequal; if (high == low) break; /* Choose the pivot: find the median of the values in low, middle, and high positions. */ middle = (low + high) / 2; vals[0] = GET(low); vals[1] = GET(middle); vals[2] = GET(high); /* Bubblesort the three elements. */ for (i=0; i<2; i++) for (j=0; j<(2-i); j++) if (vals[j] > vals[j+1]) { tmp = vals[j]; vals[j] = vals[j+1]; vals[j+1] = tmp; } /* unrolled: if (vals[0] > vals[1]) { tmp = vals[0]; vals[0] = vals[1]; vals[1] = tmp; } if (vals[1] > vals[2]) { tmp = vals[1]; vals[1] = vals[2]; vals[2] = tmp; } if (vals[0] > vals[1]) { tmp = vals[0]; vals[0] = vals[1]; vals[1] = tmp; } */ assert(vals[0] <= vals[1]); assert(vals[1] <= vals[2]); pivot = vals[1]; /* Count the number of items that are less than, equal to, and greater than the pivot. */ nless = nequal = 0; for (i=low; i<=high; i++) { if (GET(i) < pivot) nless++; else if (GET(i) == pivot) nequal++; } /* These are the indices where the <, =, and > entries will start. */ iless = low; iequal = low + nless; igreater = low + nless + nequal; /* These are the indices where they will end; ie the elements less than the pivot will live in [iless, endless). (But note that we'll be incrementing "iequal" et al in the loop below.) */ endless = iequal; endequal = igreater; endgreater = high+1; int n1, n2, n3, n4, n5, n6; n1 = n2 = n3 = n4 = n5 = n6 = 0; while (1) { /* Find an element in the "less" section that is out of place. */ while ( (GET(iless) < pivot) && (iless < endless) ) iless++; /* Find an element in the "equal" section that is out of place. */ while ( (GET(iequal) == pivot) && (iequal < endequal) ) iequal++; /* Find an element in the "greater" section that is out of place. */ while ( (GET(igreater) > pivot) && (igreater < endgreater) ) igreater++; /* We're looking at three positions, and each one has three cases: we're finished that segment, or the element we're looking at belongs in either of the other two segments. This yields 27 cases, but many of them are ruled out because, eg, if the element at "iequal" belongs in the "less" segment, then we can't be done the "less" segment. There are only 6 cases to handle: --------------------------------------------- case iless iequal igreater action --------------------------------------------- 1 D D D done 2 G ? L swap l,g 3 E L ? swap l,e 4 ? G E swap e,g 5 E G L rotate A 6 G L E rotate B --------------------------------------------- legend: D: done L: (element < pivot) E: (element == pivot) G: (element > pivot) */ /* case 1: done? */ if ((iless == endless) && (iequal == endequal) && (igreater == endgreater)) { n1++; break; } /* case 2: swap l,g */ if ((iless < endless) && (igreater < endgreater) && (GET(iless) > pivot) && (GET(igreater) < pivot)) { ELEM_SWAP(iless, igreater); assert(GET(iless) < pivot); assert(GET(igreater) > pivot); n2++; continue; } /* cases 3,4,5,6 */ assert(iequal < endequal); if (GET(iequal) > pivot) { /* cases 4,5: */ assert(igreater < endgreater); if (GET(igreater) == pivot) { /* case 4: swap e,g */ ELEM_SWAP(iequal, igreater); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); n4++; } else { /* case 5: rotate. */ assert(GET(iless) == pivot); assert(GET(iequal) > pivot); assert(GET(igreater) < pivot); ELEM_ROT(iless, iequal, igreater); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); n5++; } } else { /* cases 3,6 */ assert(GET(iequal) < pivot); assert(iless < endless); if (GET(iless) == pivot) { /* case 3: swap l,e */ ELEM_SWAP(iless, iequal); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); n3++; } else { dtype vequal, vless, vgreater; vequal = GET(iequal); vless = GET(iless); vgreater = GET(igreater); assert(GET(iless) > pivot); assert(GET(iequal) < pivot); assert(GET(igreater) == pivot); /* case 6: rotate. */ ELEM_ROT(igreater, iequal, iless); vequal = GET(iequal); vless = GET(iless); vgreater = GET(igreater); assert(GET(iless) < pivot); assert(GET(iequal) == pivot); assert(GET(igreater) > pivot); n6++; } } } printf("% 8i % 8i % 8i % 8i % 8i % 8i\n", n1, n2, n3, n4, n5, n6); /* Reset the indices of where the segments start. */ iless = low; iequal = low + nless; igreater = low + nless + nequal; /* Assert that "<" values are in the "less" partition, "=" values are in the "equal" partition, and ">" values are in the "greater" partition. */ for (i=iless; i pivot); /* Is the median in the "<", "=", or ">" partition? */ if (median < iequal) /* median is in the "<" partition. low is unchanged. */ high = iequal - 1; else if (median < igreater) { /* the median is inside the "=" partition; we're done! */ low = high = median; break; } else /* median is in the ">" partition. high is unchanged. */ low = igreater; } /* if (high == low + 1) { if (GET(low) > GET(high)) ELEM_SWAP(low, high); } median = low; assert(median != 0); midval = GET(median); */ /* check that it worked. */ midval = GET(median); for (i=L; i= midval); assert (L < median); assert (median <= R); return median; } #undef ELEM_SWAP #undef ELEM_ROT #undef GET astrometry.net-0.67/libkd/test_dualtree_nn.c000644 000765 000024 00000004665 12651445460 021371 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "cutest.h" #include "dualtree_nearestneighbour.h" #include "mathutil.h" #include "tic.h" void test_nn_1(CuTest* tc) { //int NX = 5000; //int NY = 6000; //double maxr2 = 0.01; int NX = 8; int NY = 10; double maxr2 = 0.5; int D = 3; int Nleaf = 5; int i, j; kdtree_t* xkd; kdtree_t* ykd; double* xdata; double* ydata; double* nearest_d2 = NULL; int* nearest_ind = NULL; double* true_nearest_d2; int* true_nearest_ind; double t0; srand(0); xdata = malloc(NX * D * sizeof(double)); ydata = malloc(NY * D * sizeof(double)); for (i=0; i<(NX*D); i++) xdata[i] = rand() / (double)RAND_MAX; for (i=0; i<(NY*D); i++) ydata[i] = rand() / (double)RAND_MAX; true_nearest_d2 = malloc(NY * sizeof(double)); true_nearest_ind = malloc(NY * sizeof(int)); t0 = timenow(); for (j=0; j #include #include #include #include #include #include "os-features.h" #include "errors.h" #include "cutest.h" #include "kdtree.h" #include "mathutil.h" #include "an-fls.h" #include "test_libkd_common.c" static int calculate_R(int leafid, int nlevels, int N) { int l; unsigned int mask, L; int nbottom = 1 << (nlevels - 1); mask = (1 << (nlevels-1)); L = 0; // Compute the L index of the node one to the right of this node. int nextguy = leafid + 1; if (nextguy == nbottom) return N-1; for (l=0; l<(nlevels-1); l++) { mask /= 2; if (nextguy & mask) { L += N/2; N = (N+1)/2; } else { N = N/2; } } L--; return L; } int linearR(int leafid, int nbottom, int N) { int64_t res = leafid + 1; res *= N; res /= nbottom; return res - 1; } double linearRF(int leafid, int nbottom, int N) { double res = leafid + 1.0; res *= N; res /= (double)nbottom; return res - 1.0; } void tst_1(CuTest* ct) { kdtree_t* kd; double * data; int N = 1000; int Nleaf = 5; int D = 3; int i; data = random_points_d(N, D); kd = build_tree(ct, data, N, D, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); printf("kd->nbottom = %i, kd->nlevels = %i.\n", kd->nbottom, kd->nlevels); for (i=0; inbottom; i++) { int R1 = kdtree_right(kd, kd->ninterior + i); int R2 = calculate_R(i, kd->nlevels, N); int R3 = linearR(i, kd->nbottom, N); double d3 = linearRF(i, kd->nbottom, N); printf("%i %i %i %g\n", R1, R2, R3, d3); printf(" %s %g\n", (R1 != R3) ? "***" : " ", (double)R3 - d3); /* CuAssertIntEquals(ct, R1, R2); CuAssertIntEquals(ct, R1, R3); */ } kdtree_free(kd); } static void compute_splitbits(int ndim, uint32_t* dimmask, uint32_t* dimbits, uint32_t* splitmask) { int D; int bits; uint32_t val; D = ndim; bits = 0; val = 1; while (val < D) { bits++; val *= 2; } *dimmask = val - 1; *dimbits = bits; *splitmask = ~(*dimmask); } void test_splitbits(CuTest* ct) { uint32_t dmask, dbits, smask; int dim; compute_splitbits(1, &dmask, &dbits, &smask); CuAssertIntEquals(ct, 0x0, dbits); CuAssertIntEquals(ct, 0x0, dmask); CuAssertIntEquals(ct,~0x0, smask); compute_splitbits(2, &dmask, &dbits, &smask); CuAssertIntEquals(ct, 0x1, dbits); CuAssertIntEquals(ct, 0x1, dmask); CuAssertIntEquals(ct,~0x1, smask); for (dim=3; dim<=4; dim++) { compute_splitbits(dim, &dmask, &dbits, &smask); CuAssertIntEquals(ct, 0x2, dbits); CuAssertIntEquals(ct, 0x3, dmask); CuAssertIntEquals(ct,~0x3, smask); } for (dim=5; dim<=8; dim++) { compute_splitbits(dim, &dmask, &dbits, &smask); CuAssertIntEquals(ct, 0x3, dbits); CuAssertIntEquals(ct, 0x7, dmask); CuAssertIntEquals(ct,~0x7, smask); } for (dim=9; dim<=16; dim++) { compute_splitbits(dim, &dmask, &dbits, &smask); CuAssertIntEquals(ct, 0x4, dbits); CuAssertIntEquals(ct, 0xF, dmask); CuAssertIntEquals(ct,~0xF, smask); } } void test_short_partition(CuTest* ct) { kdtree_t* kd; double* data; int N = 21; int Nleaf = 16; int D = 2; int i; double minval[D], maxval[D]; uint16_t cdata[] = { 12669, 12669, 12669, 12669, 12669, 12669, 12669, 12669, 12669, 12669, 12669, 12669, 13860, 13913, 14164, 14557, 15283, 17130, 17130, 17130, 17130 }; minval[0] = -0.20710678118654757; minval[1] = -0.20710678118654757; maxval[0] = 1.2071067811865475; maxval[1] = 1.2071067811865475; data = calloc(N*D, sizeof(double)); // convert from "cdata" to "data" space (I got the test data above // from the internal data representation of a problem tree). double scale = (maxval[0] - minval[0]) / (double)UINT16_MAX; for (i=0; idata.s; for (i=0; idata.s; for (i=0; i> 1; u8 level = 0; while (val) { val = val >> 1; level++; } return level; } void test_2(CuTest* ct) { int N = 1024; int i; for (i=0; ilr == NULL); for (q=0; qperm[ind], sqrt(d2)); */ CuAssertIntEquals(tc, kd->perm[ind], trueind); if (fabs(sqrt(d2) - sqrt(trued2)) >= eps) { printf("Naive : %.12g\n", sqrt(trued2)); printf("Kdtree: %.12g\n", sqrt(d2)); } CuAssertDblEquals(tc, sqrt(d2), sqrt(trued2), eps); } kdtree_free(kd); free(treedata); free(origdata); } static void run_test_rs_ND(CuTest* tc, int treetype, int treeopts, double eps, int N, int D) { int Nleaf = 10; int Q = 10; double rad2 = 0.01; double* origdata; double* treedata; kdtree_t* kd; double query[D]; int i, q, d; srand(0); origdata = random_points_d(N, D); treedata = malloc(N * D * sizeof(double)); memcpy(treedata, origdata, N*D*sizeof(double)); kd = build_tree(tc, treedata, N, D, Nleaf, treetype, treeopts); CuAssert(tc, "kd", kd != NULL); for (q=0; qnres, ntrue); for (i=0; inres; i++) { ind = res->inds[i]; d2 = res->sdists[i]; trued2 = distsq(query, origdata + ind*D, D); } CuAssert(tc, "res", res != NULL); for (i=0; inres; i++) { ind = res->inds[i]; d2 = res->sdists[i]; trued2 = distsq(query, origdata + ind*D, D); CuAssert(tc, "ind pos", ind >= 0); CuAssert(tc, "ind pos", ind < N); CuAssert(tc, "inrange", d2 <= rad2); CuAssert(tc, "inrange", trued2 <= rad2); CuAssert(tc, "d2pos", d2 >= 0.0); CuAssert(tc, "trued2pos", trued2 >= 0.0); CuAssertDblEquals(tc, sqrt(d2), sqrt(trued2), sqrt(eps)); } /* printf("Naive : ind %i, dist %g.\n", trueind, sqrt(trued2)); printf("Kdtree: ind %i, dist %g.\n", kd->perm[ind], sqrt(d2)); */ kdtree_free_query(res); } kdtree_free(kd); free(treedata); free(origdata); } static void run_test_rs(CuTest* tc, int treetype, int treeopts, double eps) { int N = 1000; int D = 3; run_test_rs_ND(tc, treetype, treeopts, eps, N, D); } void test_rs_bb_duu(CuTest* tc) { run_test_rs(tc, KDTT_DUU, KD_BUILD_BBOX, 1e-9); } void test_rs_bb_ddd_small(CuTest* tc) { run_test_rs_ND(tc, KDTT_DOUBLE, KD_BUILD_BBOX, 1e-9, 10, 1); } void test_rs_bb_ddd(CuTest* tc) { run_test_rs(tc, KDTT_DOUBLE, KD_BUILD_BBOX, 1e-9); } void test_rs_split_ddd(CuTest* tc) { run_test_rs(tc, KDTT_DOUBLE, KD_BUILD_SPLIT, 1e-9); } void test_rs_both_ddd(CuTest* tc) { run_test_rs(tc, KDTT_DOUBLE, KD_BUILD_BBOX | KD_BUILD_SPLIT, 1e-9); } void test_rs_split_duu(CuTest* tc) { run_test_rs(tc, KDTT_DUU, KD_BUILD_SPLIT, 1e-9); } /** Sadly, does not work. void test_rs_split_ddu(CuTest* tc) { run_test_rs(tc, KDTT_DDU, KD_BUILD_SPLIT, 1e-9); } */ void test_rs_bb_dss(CuTest* tc) { run_test_rs(tc, KDTT_DSS, KD_BUILD_BBOX, 1e-5); } void test_rs_split_dss(CuTest* tc) { run_test_rs(tc, KDTT_DSS, KD_BUILD_SPLIT, 1e-5); } void test_nn_bb_ddd(CuTest* tc) { run_test_nn(tc, KDTT_DOUBLE, KD_BUILD_BBOX, 1e-9); } void test_nn_split_ddd(CuTest* tc) { run_test_nn(tc, KDTT_DOUBLE, KD_BUILD_SPLIT, 1e-9); } void test_nn_both_ddd(CuTest* tc) { run_test_nn(tc, KDTT_DOUBLE, KD_BUILD_SPLIT | KD_BUILD_BBOX, 1e-9); } void test_nn_split_duu(CuTest* tc) { run_test_nn(tc, KDTT_DUU, KD_BUILD_SPLIT, 1e-9); } void test_nn_bb_duu(CuTest* tc) { run_test_nn(tc, KDTT_DUU, KD_BUILD_BBOX, 1e-9); } void test_nn_split_dss(CuTest* tc) { run_test_nn(tc, KDTT_DSS, KD_BUILD_SPLIT, 1e-5); } void test_nn_split_dssB(CuTest* tc) { run_test_nn(tc, KDTT_DSS, KD_BUILD_SPLIT | KD_BUILD_NO_LR | KD_BUILD_SPLITDIM, 1e-5); } void test_nn_bb_dss(CuTest* tc) { run_test_nn(tc, KDTT_DSS, KD_BUILD_BBOX, 1e-5); } void test_nn_bb_dssB(CuTest* tc) { run_test_nn(tc, KDTT_DSS, KD_BUILD_BBOX | KD_BUILD_NO_LR, 1e-5); } void test_nn_split_ddd_linearlr(CuTest* tc) { run_test_nn(tc, KDTT_DOUBLE, KD_BUILD_SPLIT | KD_BUILD_NO_LR | KD_BUILD_LINEAR_LR, 1e-9); } void test_nn_split_duu_linearlr(CuTest* tc) { run_test_nn(tc, KDTT_DUU, KD_BUILD_SPLIT | KD_BUILD_SPLITDIM | KD_BUILD_NO_LR | KD_BUILD_LINEAR_LR, 1e-9); } void test_nn_split_dss_linearlr(CuTest* tc) { run_test_nn(tc, KDTT_DSS, KD_BUILD_SPLIT | KD_BUILD_SPLITDIM | KD_BUILD_NO_LR | KD_BUILD_LINEAR_LR, 1e-5); } void run_test_lr(CuTest* tc, int D, int Nleaf, int treetype, int treeopts) { int i; kdtree_t* kd; double* treedata; int32_t* lr; int N; for (N=100; N<=1000; N+=9) { treedata = random_points_d(N, D); kd = build_tree(tc, treedata, N, D, Nleaf, treetype, treeopts); CuAssert(tc, "kd", kd != NULL); lr = kd->lr; kd->lr = NULL; for (i=0; inbottom; i++) { if (i) CuAssertIntEquals(tc, lr[i-1]+1, kdtree_left(kd, i + kd->ninterior)); CuAssertIntEquals(tc, lr[i], kdtree_right(kd, i + kd->ninterior)); } kd->lr = lr; kdtree_free(kd); free(treedata); } } void test_lr_ddd(CuTest* tc) { run_test_lr(tc, 3, 10, KDTT_DOUBLE, KD_BUILD_SPLIT); } void test_no_lr_with_ints(CuTest* tc) { double* data; kdtree_t* kd; int N = 1000; int D = 3; int Nleaf = 10; data = random_points_d(N, D); kd = build_tree(tc, data, N, D, Nleaf, KDTT_DSS, KD_BUILD_SPLIT | KD_BUILD_NO_LR); CuAssert(tc, "no kd", kd == NULL); free(data); errors_free(); } astrometry.net-0.67/libkd/test_libkd_common.c000644 000765 000024 00000001455 12651445460 021520 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ static kdtree_t* build_tree(CuTest* tc, double* data, int N, int D, int Nleaf, int treetype, int treeopts); static double* random_points_d(int N, int D); static double* random_points_d(int N, int D) { int i; double* data = malloc(N * D * sizeof(double)); for (i=0; i<(N*D); i++) { data[i] = rand() / (double)RAND_MAX; } return data; } static kdtree_t* build_tree(CuTest* tc, double* data, int N, int D, int Nleaf, int treetype, int treeopts) { kdtree_t* kd; kd = kdtree_build(NULL, data, N, D, Nleaf, treetype, treeopts); if (!kd) return NULL; CuAssertIntEquals(tc, kdtree_check(kd), 0); return kd; } astrometry.net-0.67/libkd/test_libkd_io.c000644 000765 000024 00000020416 12651445460 020635 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include "cutest.h" #include "kdtree.h" #include "kdtree_fits_io.h" #include "test_libkd_common.c" static void assert_kdtrees_equal(CuTest* ct, const kdtree_t* kd, const kdtree_t* kd2) { double del = 1e-10; size_t sz, sz2; if (!kd) { CuAssertPtrEquals(ct, NULL, (kdtree_t*)kd2); return; } CuAssertPtrNotNull(ct, kd2); CuAssertIntEquals(ct, kd->treetype, kd2->treetype); CuAssertIntEquals(ct, kd->dimbits, kd2->dimbits); CuAssertIntEquals(ct, kd->dimmask, kd2->dimmask); CuAssertIntEquals(ct, kd->splitmask, kd2->splitmask); CuAssertIntEquals(ct, kd->ndata, kd2->ndata); CuAssertIntEquals(ct, kd->ndim, kd2->ndim); CuAssertIntEquals(ct, kd->nnodes, kd2->nnodes); CuAssertIntEquals(ct, kd->nbottom, kd2->nbottom); CuAssertIntEquals(ct, kd->ninterior, kd2->ninterior); CuAssertIntEquals(ct, kd->nlevels, kd2->nlevels); CuAssertIntEquals(ct, kd->has_linear_lr, kd2->has_linear_lr); CuAssertDblEquals(ct, kd->scale, kd2->scale, del); CuAssertDblEquals(ct, kd->invscale, kd2->invscale, del); if (kd->lr) { CuAssertPtrNotNull(ct, kd2->lr); sz = kdtree_sizeof_lr(kd ); sz2 = kdtree_sizeof_lr(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "lr equal", memcmp(kd->lr, kd2->lr, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->lr); } if (kd->perm) { CuAssertPtrNotNull(ct, kd2->perm); sz = kdtree_sizeof_perm(kd ); sz2 = kdtree_sizeof_perm(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "perm equal", memcmp(kd->perm, kd2->perm, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->perm); } if (kd->data.any) { CuAssertPtrNotNull(ct, kd2->data.any); sz = kdtree_sizeof_data(kd ); sz2 = kdtree_sizeof_data(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "data equal", memcmp(kd->data.any, kd2->data.any, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->data.any); } if (kd->splitdim) { CuAssertPtrNotNull(ct, kd2->splitdim); sz = kdtree_sizeof_splitdim(kd ); sz2 = kdtree_sizeof_splitdim(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "splitdim equal", memcmp(kd->splitdim, kd2->splitdim, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->splitdim); } if (kd->split.any) { CuAssertPtrNotNull(ct, kd2->split.any); sz = kdtree_sizeof_split(kd ); sz2 = kdtree_sizeof_split(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "split equal", memcmp(kd->split.any, kd2->split.any, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->split.any); } if (kd->bb.any) { CuAssertPtrNotNull(ct, kd2->bb.any); sz = kdtree_sizeof_bb(kd ); sz2 = kdtree_sizeof_bb(kd2); CuAssertIntEquals(ct, sz, sz2); CuAssert(ct, "bb equal", memcmp(kd->bb.any, kd2->bb.any, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->bb.any); } if (kd->minval) { sz = kd->ndim * sizeof(double); CuAssertPtrNotNull(ct, kd2->minval); CuAssert(ct, "minval equal", memcmp(kd->minval, kd2->minval, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->minval); } if (kd->maxval) { CuAssertPtrNotNull(ct, kd2->maxval); sz = kd->ndim * sizeof(double); CuAssert(ct, "maxval equal", memcmp(kd->maxval, kd2->maxval, sz) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->maxval); } if (kd->name) { CuAssertPtrNotNull(ct, kd2->name); CuAssert(ct, "name equal", strcmp(kd->name, kd2->name) == 0); } else { CuAssertPtrEquals(ct, NULL, kd2->name); } } void test_read_write_single_tree_unnamed(CuTest* ct) { kdtree_t* kd; double * data; int N = 1000; int Nleaf = 5; int D = 3; char fn[1024]; int rtn; kdtree_t* kd2; int fd; data = random_points_d(N, D); kd = build_tree(ct, data, N, D, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); kd->name = NULL; sprintf(fn, "/tmp/test_libkd_io_single_tree_unnamed.XXXXXX"); fd = mkstemp(fn); if (fd == -1) { fprintf(stderr, "Failed to generate a temp filename: %s\n", strerror(errno)); CuFail(ct, "mkstemp"); } close(fd); printf("Single tree unnamed: writing to file %s.\n", fn); rtn = kdtree_fits_write(kd, fn, NULL); CuAssertIntEquals(ct, 0, rtn); kd2 = kdtree_fits_read(fn, NULL, NULL); assert_kdtrees_equal(ct, kd, kd2); free(data); kdtree_free(kd); kdtree_fits_close(kd2); } void test_read_write_single_tree_named(CuTest* ct) { kdtree_t* kd; double * data; int N = 1000; int Nleaf = 5; int D = 3; char fn[1024]; int rtn; kdtree_t* kd2; int fd; data = random_points_d(N, D); kd = build_tree(ct, data, N, D, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT | KD_BUILD_BBOX | KD_BUILD_LINEAR_LR); kd->name = strdup("christmas"); sprintf(fn, "/tmp/test_libkd_io_single_tree_named.XXXXXX"); fd = mkstemp(fn); if (fd == -1) { fprintf(stderr, "Failed to generate a temp filename: %s\n", strerror(errno)); CuFail(ct, "mkstemp"); } close(fd); printf("Single tree named: writing to file %s.\n", fn); rtn = kdtree_fits_write(kd, fn, NULL); CuAssertIntEquals(ct, 0, rtn); // Loading any tree should succeed. kd2 = kdtree_fits_read(fn, NULL, NULL); assert_kdtrees_equal(ct, kd, kd2); kdtree_fits_close(kd2); // Attempting to load a nonexist named tree should fail. kd2 = kdtree_fits_read(fn, "none", NULL); CuAssertPtrEquals(ct, NULL, kd2); // Loading by its correct name should work. kd2 = kdtree_fits_read(fn, "christmas", NULL); assert_kdtrees_equal(ct, kd, kd2); kdtree_fits_close(kd2); free(data); kdtree_free(kd); } void test_read_write_two_trees(CuTest* ct) { kdtree_t* kd; kdtree_t* kdB; double * data; double * dataB; int N = 1000; int Nleaf = 5; int D = 3; char fn[1024]; int rtn; kdtree_t* kd2; kdtree_t* kd2B; int fd; kdtree_fits_t* io; data = random_points_d(N, D); kd = build_tree(ct, data, N, D, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT | KD_BUILD_BBOX | KD_BUILD_LINEAR_LR); kd->name = strdup("christmas"); dataB = random_points_d(N, D); kdB = build_tree(ct, dataB, N, D, Nleaf, KDTT_DUU, KD_BUILD_SPLIT | KD_BUILD_SPLITDIM | KD_BUILD_LINEAR_LR); kdB->name = strdup("watermelon"); sprintf(fn, "/tmp/test_libkd_io_two_trees.XXXXXX"); fd = mkstemp(fn); if (fd == -1) { fprintf(stderr, "Failed to generate a temp filename: %s\n", strerror(errno)); CuFail(ct, "mkstemp"); } printf("Two trees: writing to file %s.\n", fn); close(fd); io = kdtree_fits_open_for_writing(fn); if (!io) { fprintf(stderr, "Failed to open temp file: %s\n", strerror(errno)); CuFail(ct, "fdopen"); } rtn = kdtree_fits_write_primary_header(io, NULL); CuAssertIntEquals(ct, 0, rtn); rtn = kdtree_fits_append_tree(io, kd, NULL); CuAssertIntEquals(ct, 0, rtn); rtn = kdtree_fits_append_tree(io, kdB, NULL); CuAssertIntEquals(ct, 0, rtn); if (kdtree_fits_io_close(io)) { fprintf(stderr, "Failed to close temp file: %s\n", strerror(errno)); CuFail(ct, "fclose"); } // Loading any tree should return the first one. kd2 = kdtree_fits_read(fn, NULL, NULL); assert_kdtrees_equal(ct, kd, kd2); kdtree_fits_close(kd2); // Attempting to load a nonexist named tree should fail. kd2 = kdtree_fits_read(fn, "none", NULL); CuAssertPtrEquals(ct, NULL, kd2); // Loading by the correct names should work. kd2 = kdtree_fits_read(fn, "christmas", NULL); assert_kdtrees_equal(ct, kd, kd2); kd2B = kdtree_fits_read(fn, "watermelon", NULL); assert_kdtrees_equal(ct, kdB, kd2B); kdtree_fits_close(kd2); kdtree_fits_close(kd2B); free(data); kdtree_free(kd); free(dataB); kdtree_free(kdB); } astrometry.net-0.67/libkd/test_spherematch.py000644 000765 000024 00000002176 12651445460 021575 0ustar00dstnstaff000000 000000 # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE from astrometry.libkd import spherematch import numpy as np from time import time N1 = 1000 N2 = 1000 D = 2 r = 0.02 x1 = np.random.rand(N1, D) x2 = np.random.rand(N2, D) t0 = time() (inds,dists) = spherematch.match(x1, x2, r) dt = time() - t0 print 'spherematch.match: found', len(inds), 'pairs in', int(dt*1000.), 'ms' order = np.argsort(inds[:,0]*N2 + inds[:,1]) inds = inds[order] dists = dists[order] t0 = time() pairs = [] truedists = [] for i in range(N1): pt1 = x1[i,:] d2s = np.sum((x2 - pt1)**2, axis=1) good = np.where(d2s <= r**2)[0] for j in good: pairs.append((i, j)) truedists.append(d2s[j]) dt = time() - t0 pairs = np.array(pairs) truedists = np.sqrt(np.array(truedists)) print 'naive : found', len(pairs), 'pairs in', int(dt*1000.), 'ms' order = np.argsort(pairs[:,0]*N2 + pairs[:,1]) pairs = pairs[order] ok = np.array_equal(pairs, inds) print 'Indices equal:', ok ok = np.array_equal(truedists[order], dists.ravel()) print 'Dists equal:', ok t0 = time() (inds,dists) = spherematch.nearest(x1, x2, r) dt = time() - t0 astrometry.net-0.67/include/astrometry/000755 000765 000024 00000000000 12651445460 020422 5ustar00dstnstaff000000 000000 astrometry.net-0.67/include/astrometry/2mass-fits.h000644 000765 000024 00000001751 12651445460 022567 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef TWOMASS_FITS_H #define TWOMASS_FITS_H #include "astrometry/anqfits.h" #include "astrometry/2mass.h" #include "astrometry/fitstable.h" #include "astrometry/ioutils.h" #define AN_FILETYPE_2MASS "2MASS" typedef fitstable_t twomass_fits; twomass_fits* twomass_fits_open(char* fn); twomass_fits* twomass_fits_open_for_writing(char* fn); int twomass_fits_write_headers(twomass_fits* cat); int twomass_fits_fix_headers(twomass_fits* cat); int twomass_fits_read_entries(twomass_fits* cat, int offset, int count, twomass_entry* entries); twomass_entry* twomass_fits_read_entry(twomass_fits* cat); int twomass_fits_count_entries(twomass_fits* cat); int twomass_fits_close(twomass_fits* cat); int twomass_fits_write_entry(twomass_fits* cat, twomass_entry* entry); qfits_header* twomass_fits_get_primary_header(const twomass_fits* cat); #endif astrometry.net-0.67/include/astrometry/2mass.h000644 000765 000024 00000011157 12651445460 021625 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef TWOMASS_H #define TWOMASS_H #include #include "astrometry/an-bool.h" /** See: . ftp://ftp.ipac.caltech.edu/pub/2mass/allsky/format_psc.html */ struct twomass_entry { // [degrees] - J2000 ICRS double ra; // [degrees] - J2000 ICRS double dec; // unique id of this object. unsigned int key; // [degrees] - one-sigma positional error ellipse: major axis float err_major; // [degrees] - one-sigma positional error ellipse: minor axis float err_minor; // [degrees] - rotation east of north of the major axis of the error ellipse float err_angle; // hhmmssss[+-]ddmmsss[ABC...] char designation[18]; // is this in the northern hemisphere? // TRUE=northern, FALSE=southern. anbool northern_hemisphere; // [mag] - J magnitude float j_m; // [mag] - J corrected photometric uncertainty float j_cmsig; // [mag] - J total photometric uncertainty float j_msigcom; // J signal-to-noise float j_snr; // [mag] - H magnitude float h_m; // [mag] - H corrected photometric uncertainty float h_cmsig; // [mag] - H total photometric uncertainty float h_msigcom; // H signal-to-noise float h_snr; // [mag] - K magnitude float k_m; // [mag] - K corrected photometric uncertainty float k_cmsig; // [mag] - K total photometric uncertainty float k_msigcom; // K signal-to-noise float k_snr; // [code: twomass_quality_val] photometric quality flags char j_quality; char h_quality; char k_quality; // read flags: where did the data come from? uint8_t j_read_flag; uint8_t h_read_flag; uint8_t k_read_flag; // blend flags: how many source measurements were blended? uint8_t h_blend_flag; uint8_t j_blend_flag; uint8_t k_blend_flag; // [code: twomass_cc_val] contamination and confusion flags: object detection. char j_cc; char h_cc; char k_cc; // number of detections (M=seen, N=possible) uint8_t j_ndet_M; uint8_t j_ndet_N; uint8_t h_ndet_M; uint8_t h_ndet_N; uint8_t k_ndet_M; uint8_t k_ndet_N; // may be a foreground star superimposed on a galaxy. uint8_t galaxy_contam; // [degrees] - proximity to the nearest other source in the catalog. float proximity; // [degrees] - angle east of north to the nearest object float prox_angle; // key of the nearest neighbour. unsigned int prox_key; // day the observation run was started uint16_t date_year; uint8_t date_month; uint8_t date_day; // [days]: Julian date (+- 30 seconds) of the measurement. double jdate; // nightly scan number uint16_t scan; // may be a minor planet, comet, asteroid, etc. anbool minor_planet; // [degrees] - angle east of north to optical counterpart float phi_opt; // [degrees] - galactic longitude float glon; // [degrees] - galactic latitude float glat; // [degrees] float x_scan; // (null) float j_psfchi; // [mag] (null) float j_m_stdap; // [mag] (null) float j_msig_stdap; // (null) float h_psfchi; // [mag] (null) float h_m_stdap; // [mag] (null) float h_msig_stdap; // (null) float k_psfchi; // [mag] (null) float k_m_stdap; // [mag] (null) float k_msig_stdap; // [degrees] (null): float dist_opt; // [mag] (null) float b_m_opt; // [mag] (null) float vr_m_opt; // [degrees] float dist_edge_ns; // [degrees] float dist_edge_ew; // TRUE=north anbool dist_flag_ns; // TRUE=east anbool dist_flag_ew; uint8_t dup_src; anbool use_src; // [code: twomass_association_val] char association; uint8_t nopt_mchs; uint16_t coadd; unsigned int scan_key; // AKA ext_key (null) unsigned int xsc_key; unsigned int coadd_key; }; typedef struct twomass_entry twomass_entry; #define TWOMASS_NULL (1.0/0.0) #define TWOMASS_KEY_NULL 0xffffff enum twomass_association_val { TWOMASS_ASSOCIATION_NONE, TWOMASS_ASSOCIATION_TYCHO, TWOMASS_ASSOCIATION_USNOA2 }; enum twomass_quality_val { TWOMASS_QUALITY_NO_BRIGHTNESS, // X flag TWOMASS_QUALITY_UPPER_LIMIT_MAG, // U TWOMASS_QUALITY_NO_SIGMA, // F TWOMASS_QUALITY_BAD_FIT, // E TWOMASS_QUALITY_A, TWOMASS_QUALITY_B, TWOMASS_QUALITY_C, TWOMASS_QUALITY_D }; enum twomass_cc_val { TWOMASS_CC_NONE, // 0 flag TWOMASS_CC_PERSISTENCE, // p flag TWOMASS_CC_CONFUSION, // c TWOMASS_CC_DIFFRACTION, // d TWOMASS_CC_STRIPE, // s TWOMASS_CC_BANDMERGE // b }; int twomass_is_value_null(float val); int twomass_parse_entry(twomass_entry* entry, const char* line); int twomass_cc_flag(unsigned char val, unsigned char flag); int twomass_quality_flag(unsigned char val, unsigned char flag); int twomass_is_null_float(float f); #endif astrometry.net-0.67/include/astrometry/allquads.h000644 000765 000024 00000001221 12651445460 022375 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef ALLQUADS_H #define ALLQUADS_H struct allquads { int dimquads; int dimcodes; int id; char *quadfn; char *codefn; char *skdtfn; startree_t* starkd; quadfile* quads; codefile* codes; double quad_d2_lower; double quad_d2_upper; anbool use_d2_lower; anbool use_d2_upper; int starA; }; typedef struct allquads allquads_t; allquads_t* allquads_init(); int allquads_open_outputs(allquads_t* aq); int allquads_create_quads(allquads_t* aq); int allquads_close(allquads_t* aq); void allquads_free(allquads_t* aq); #endif astrometry.net-0.67/include/astrometry/an-bool.h000644 000765 000024 00000000534 12651445460 022124 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_BOOL_H #define AN_BOOL_H #include #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // This helps unconfuse SWIG; it doesn't seem to like uint8_t typedef unsigned char anbool; #endif astrometry.net-0.67/include/astrometry/an-endian.h000644 000765 000024 00000002054 12651445460 022426 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_ENDIAN_H #define AN_ENDIAN_H #include // MacOSX doesn't have endian.h // (actually 10.5 does) #if __APPLE__ # include #elif __FreeBSD__ # include #elif __sun # include #else # include #endif #if \ (defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN)) || \ (defined( _BYTE_ORDER) && ( _BYTE_ORDER == _BIG_ENDIAN)) || \ (defined( BYTE_ORDER) && ( BYTE_ORDER == BIG_ENDIAN)) #define IS_BIG_ENDIAN 1 #else #define IS_BIG_ENDIAN 0 #endif int is_big_endian(); uint32_t u32_letoh(uint32_t i); uint32_t u32_htole(uint32_t i); uint16_t u16_letoh(uint16_t i); uint16_t u16_htole(uint16_t i); void v32_htole(void* p); void v16_htole(void* p); void v32_letoh(void* p); void v64_ntoh(void* p); void v32_ntoh(void* p); void v16_ntoh(void* p); void v64_hton(void* p); void v32_hton(void* p); void v16_hton(void* p); void endian_swap(void* p, int nbytes); #endif astrometry.net-0.67/include/astrometry/an-opts.h000644 000765 000024 00000001451 12651445460 022155 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_OPTS_H #define AN_OPTS_H #include #include "astrometry/bl.h" struct anoption { // don't change the order of these fields! // static initializers depend on the ordering. char shortopt; const char *name; int has_arg; const char* argname; const char* help; }; typedef struct anoption an_option_t; void opts_print_help(bl* list_of_opts, FILE* fid, void (*special_case)(an_option_t* opt, bl* allopts, int index, FILE* fid, void* extra), void* extra); int opts_getopt(bl* list_of_opts, int argc, char** argv); bl* opts_from_array(const an_option_t* opts, int N, bl* lst); #endif astrometry.net-0.67/include/astrometry/an-thread-pthreads.h000644 000765 000024 00000002300 12651445460 024241 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_THREAD_PTHREADS_H #define AN_THREAD_PTHREADS_H #include #define AN_THREAD_DECLARE_ONCE(X) pthread_once_t X = PTHREAD_ONCE_INIT #define AN_THREAD_DECLARE_STATIC_ONCE(X) static pthread_once_t X = PTHREAD_ONCE_INIT #define AN_THREAD_CALL_ONCE(X, F) pthread_once(&X, F) #define AN_THREAD_DECLARE_MUTEX(X) pthread_mutex_t X = PTHREAD_MUTEX_INITIALIZER #define AN_THREAD_DECLARE_STATIC_MUTEX(X) static pthread_mutex_t X = PTHREAD_MUTEX_INITIALIZER #define AN_THREAD_LOCK(X) pthread_mutex_lock(&X) /* DEBUG #define AN_THREAD_DECLARE_STATIC_MUTEX(X) \ static pthread_mutex_t X; \ static inline void init_mutex_ ## X() { \ pthread_mutexattr_t attr; \ pthread_mutexattr_init(&attr); \ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); \ pthread_mutex_init(&X, &attr); \ pthread_mutexattr_destroy(&attr); \ } \ static pthread_once_t X_once = PTHREAD_ONCE_INIT #define AN_THREAD_LOCK(X) { \ pthread_once(&X_once, init_mutex_ ## X); \ pthread_mutex_lock(&X); \ } */ #define AN_THREAD_UNLOCK(X) pthread_mutex_unlock(&X) #endif astrometry.net-0.67/include/astrometry/an-thread.h000644 000765 000024 00000001501 12651445460 022433 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_THREAD_H #define AN_THREAD_H /** Some wrappers for threading functions. We provide a pthreads implementation but since most of the programs in the package are single-threaded, a null implementation could be written if necessary. */ /* The implementation must define: -- declare (probably at the top of your source file) -- a named run-once function. 'name' should be a valid C -- variable identifier. AN_THREAD_DECLARE_ONCE(name); -- ensure that the named run-once function 'name' has been run. AN_THREAD_CALL_ONCE(name, void (*func)(void)); -- AN_THREAD_DECLARE_MUTEX(name); AN_THREAD_LOCK(name); AN_THREAD_UNLOCK(name); */ #include "astrometry/an-thread-pthreads.h" #endif astrometry.net-0.67/include/astrometry/anqfits.h000644 000765 000024 00000010661 12651445460 022244 0ustar00dstnstaff000000 000000 /* This file was added by the Astrometry.net team. Copyright 2007-2013 Dustin Lang. Licensed under GPL v2 or later. */ #ifndef ANQFITS_H #define ANQFITS_H #include #include "astrometry/qfits_header.h" #include "astrometry/qfits_table.h" #include "astrometry/qfits_keywords.h" #include "astrometry/qfits_std.h" #include "astrometry/qfits_image.h" #include "astrometry/qfits_tools.h" #include "astrometry/qfits_time.h" int fits_get_atom_size(tfits_type type); /** Converts data between different FITS types. Does NO checking, rounding, or anything smart - just uses C casts. ASSUMES the data have already been flipped to the local host's endianness. */ int fits_convert_data(void* dest, int deststride, tfits_type desttype, const void* src, int srcstride, tfits_type srctype, int arraysize, size_t N); int fits_convert_data_2(void* vdest, int deststride, tfits_type desttype, const void* vsrc, int srcstride, tfits_type srctype, int arraysize, size_t N, double bzero, double bscale); typedef struct { int naxis; off_t width; off_t height; off_t planes; int bpp; int bitpix; double bscale; double bzero; } anqfits_image_t; anqfits_image_t* anqfits_image_new(void); void anqfits_image_free(anqfits_image_t*); // Everything we know about a FITS extension. typedef struct { // Offsets to header, in FITS blocks // --> int works for ~12 TB files. int hdr_start; // Header size int hdr_size; // Offsets to data int data_start; // Data size int data_size; qfits_header* header; qfits_table* table; anqfits_image_t* image; } anqfits_ext_t; typedef struct { char* filename; int Nexts; // # of extensions in file anqfits_ext_t* exts; off_t filesize ; // File size in FITS blocks } anqfits_t; anqfits_t* anqfits_open(const char* filename); // Open the given file, but only parse up to the given HDU number. // Attempts to get headers or data beyond that HDU will fail, and the // number of HDUs the file is reported to contain will be hdu+1. anqfits_t* anqfits_open_hdu(const char* filename, int hdu); void anqfits_close(anqfits_t* qf); int anqfits_n_ext(const anqfits_t* qf); // In BYTES off_t anqfits_header_start(const anqfits_t* qf, int ext); // In BYTES off_t anqfits_header_size(const anqfits_t* qf, int ext); // In BYTES off_t anqfits_data_start(const anqfits_t* qf, int ext); // In BYTES off_t anqfits_data_size(const anqfits_t* qf, int ext); int anqfits_get_data_start_and_size(const anqfits_t* qf, int ext, off_t* pstart, off_t* psize); int anqfits_get_header_start_and_size(const anqfits_t* qf, int ext, off_t* pstart, off_t* psize); int anqfits_is_table(const anqfits_t* qf, int ext); qfits_header* anqfits_get_header(const anqfits_t* qf, int ext); qfits_header* anqfits_get_header2(const char* fn, int ext); qfits_header* anqfits_get_header_only(const char* fn, int ext); const qfits_header* anqfits_get_header_const(const anqfits_t* qf, int ext); // Returns a newly-allocated array containing the raw header bytes for the // given extension. (Plus a zero-terminator.) Places the number of // bytes returned in *Nbytes (not including the zero-terminator). char* anqfits_header_get_data(const anqfits_t* qf, int ext, int* Nbytes); qfits_table* anqfits_get_table(const anqfits_t* qf, int ext); const qfits_table* anqfits_get_table_const(const anqfits_t* qf, int ext); anqfits_image_t* anqfits_get_image(const anqfits_t* qf, int ext); const anqfits_image_t* anqfits_get_image_const(const anqfits_t* qf, int ext); void* anqfits_readpix(const anqfits_t* qf, int ext, /** Pixel window coordinates (0 for whole image); THESE ARE ZERO-INDEXED, unlike qfits_loadpix, and (x1,y1) or NON-INCLUSIVE. **/ int x0, int x1, int y0, int y1, /** The plane you want, from 0 to planes-1 */ int pnum, /** Pixel type you want (PTYPE_FLOAT, PTYPE_INT or PTYPE_DOUBLE) */ int ptype, void* output, int* W, int* H); /* Deprecated // ? int anqfits_is_table_2(const anqfits_t* qf, int ext); Deprecated // ? char* anqfits_query_ext_2(const anqfits_t* qf, int ext, const char* keyword); */ #endif astrometry.net-0.67/include/astrometry/anwcs.h000644 000765 000024 00000012330 12651445460 021705 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef ANWCSLIB_H #define ANWCSLIB_H #include "astrometry/sip.h" #include "astrometry/an-bool.h" #include "astrometry/qfits_header.h" #include "astrometry/bl.h" /** Interface to Mark Calabretta's wcslib, if available, and Astrometry.net's TAN/SIP implementation. Also WCSTools. */ #define ANWCS_TYPE_WCSLIB 1 #define ANWCS_TYPE_SIP 2 #define ANWCS_TYPE_WCSTOOLS 3 struct anwcs_t { /** If type == ANWCS_TYPE_WCSLIB: data is a private struct containing a wcslib "struct wcsprm*". If type == ANWCS_TYPE_SIP: data is a "sip_t*" If type == ANWCS_TYPE_WCSTOOLS: data is a "struct WorldCoor*" */ int type; void* data; }; typedef struct anwcs_t anwcs_t; pl* anwcs_walk_outline(const anwcs_t* wcs, const dl* path, int fill); // len: length in characters of 'str' anwcs_t* anwcs_wcslib_from_string(const char* str, int len); char* anwcs_wcslib_to_string(const anwcs_t* wcs, char** s, int* len); anwcs_t* anwcs_open(const char* filename, int ext); anwcs_t* anwcs_open_wcslib(const char* filename, int ext); anwcs_t* anwcs_open_wcstools(const char* filename, int ext); anwcs_t* anwcs_wcstools_from_string(const char* str, int len); anwcs_t* anwcs_open_sip(const char* filename, int ext); anwcs_t* anwcs_open_tan(const char* filename, int ext); anwcs_t* anwcs_new_sip(const sip_t* sip); anwcs_t* anwcs_new_tan(const tan_t* tan); // Creates an axis-aligned TAN WCS at the given RA,Dec with "width" width in degrees // and W x H pixels. anwcs_t* anwcs_create_box(double ra, double dec, double width, int W, int H); anwcs_t* anwcs_create_box_upsidedown(double ra, double dec, double width, int W, int H); anwcs_t* anwcs_create_mercator(double refra, double refdec, double zoomfactor, int W, int H, anbool yflip); anwcs_t* anwcs_create_mercator_2(double refra, double refdec, double crpix1, double crpix2, double zoomfactor, int W, int H, anbool yflip); anwcs_t* anwcs_create_hammer_aitoff(double refra, double refdec, double zoomfactor, int W, int H, anbool yflip); anwcs_t* anwcs_create_allsky_hammer_aitoff(double refra, double refdec, int W, int H); anwcs_t* anwcs_create_allsky_hammer_aitoff2(double refra, double refdec, int W, int H); int anwcs_write(const anwcs_t* wcs, const char* filename); int anwcs_write_to(const anwcs_t* wcs, FILE* fid); int anwcs_add_to_header(const anwcs_t* wcs, qfits_header* hdr); int anwcs_radec2pixelxy(const anwcs_t* wcs, double ra, double dec, double* p_x, double* p_y); int anwcs_pixelxy2radec(const anwcs_t* wcs, double px, double py, double* ra, double* dec); int anwcs_pixelxy2xyz(const anwcs_t* wcs, double px, double py, double* p_xyz); int anwcs_xyz2pixelxy(const anwcs_t* wcs, const double* xyz, double *px, double *py); anbool anwcs_radec_is_inside_image(const anwcs_t* wcs, double ra, double dec); void anwcs_get_cd_matrix(const anwcs_t* wcs, double* p_cd); /** The SIP implementation guarantees: ramin <= ramax ramin may be < 0, or ramax > 360, if the image straddles RA=0. */ void anwcs_get_radec_bounds(const anwcs_t* wcs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax); void anwcs_print(const anwcs_t* wcs, FILE* fid); // useful for python void anwcs_print_stdout(const anwcs_t* wcs); // Center and radius of the field. // RA,Dec,radius in degrees. int anwcs_get_radec_center_and_radius(const anwcs_t* anwcs, double* p_ra, double* p_dec, double* p_radius); void anwcs_walk_image_boundary(const anwcs_t* wcs, double stepsize, void (*callback)(const anwcs_t* wcs, double x, double y, double ra, double dec, void* token), void* token); anbool anwcs_find_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double* pra3, double* pdec3, double* pra4, double* pdec4); anbool anwcs_is_discontinuous(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2); /* // Assuming there is a discontinuity between (ra1,dec1) and (ra2,dec2), // return int anwcs_get_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double* dra, double* ddec); */ dl* anwcs_walk_discontinuity(const anwcs_t* wcs, double ra1, double dec1, double ra2, double dec2, double ra3, double dec3, double ra4, double dec4, double stepsize, dl* radecs); anbool anwcs_overlaps(const anwcs_t* wcs1, const anwcs_t* wcs2, int stepsize); double anwcs_imagew(const anwcs_t* anwcs); double anwcs_imageh(const anwcs_t* anwcs); void anwcs_set_size(anwcs_t* anwcs, int W, int H); int anwcs_scale_wcs(anwcs_t* anwcs, double scale); // angle in deg int anwcs_rotate_wcs(anwcs_t* anwcs, double angle); // Approximate pixel scale, in arcsec/pixel, at the reference point. double anwcs_pixel_scale(const anwcs_t* anwcs); void anwcs_free(anwcs_t* wcs); // useful for python: get the sip_t*, if this anwcs wraps a SIP structure; NULL else sip_t* anwcs_get_sip(const anwcs_t* wcs); #endif astrometry.net-0.67/include/astrometry/augment-xylist.h000644 000765 000024 00000006417 12651445460 023575 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AUGMENT_XYLIST_H #define AUGMENT_XYLIST_H #include #include "astrometry/starxy.h" #include "astrometry/an-bool.h" #include "astrometry/bl.h" #include "astrometry/an-opts.h" #define SCALE_UNITS_DEG_WIDTH 0 #define SCALE_UNITS_ARCMIN_WIDTH 1 #define SCALE_UNITS_ARCSEC_PER_PIX 2 #define SCALE_UNITS_FOCAL_MM 3 struct augment_xylist_s { char* tempdir; int verbosity; anbool no_delete_temp; // contains ranges of depths as pairs of ints. il* depths; // contains ranges of fields as pairs of ints. il* fields; int cutobjs; sl* verifywcs; il* verifywcs_ext; sip_t* predistort; // FITS columns copied from index to RDLS output sl* tagalong; anbool tagalong_all; // column to sort RDLS output by; prefix with "-" for descending order. char* sort_rdls; // input files char* imagefn; char* xylsfn; char* solvedinfn; anbool assume_fits_image; // output files char* axyfn; char* cancelfn; char* solvedfn; char* matchfn; char* rdlsfn; // SCAMP reference catalog char* scampfn; char* wcsfn; char* corrfn; char* keepxylsfn; char* pnmfn; time_t wcs_last_mod; anbool keep_fitsimg; char* fitsimgfn; // FITS extension to read image from int extension; // set during augment_xylist: is the input image or xyls FITS? anbool isfits; anbool guess_scale; anbool pnm; anbool force_ppm; anbool use_sextractor; char* sextractor_path; char* sextractor_config; int W; int H; double scalelo; double scalehi; int scaleunit; int parity; float cpulimit; anbool tweak; int tweakorder; anbool no_fits2fits; anbool no_removelines; anbool no_fix_sdss; anbool no_bg_subtraction; int uniformize; anbool invert_image; float image_sigma; char* xcol; char* ycol; char* sortcol; char* bgcol; // WCS reference point anbool set_crpix; anbool set_crpix_center; double crpix[2]; anbool sort_ascending; anbool resort; double codetol; double pixelerr; double odds_to_tune_up; double odds_to_solve; double odds_to_bail; double odds_to_stoplooking; int downsample; anbool dont_augment; anbool verify_uniformize; anbool verify_dedup; // try to verify FITS input images? anbool try_verify; // fractions double quadsize_min; double quadsize_max; // for searching only within indexes that are near some estimated position. double ra_center; double dec_center; double search_radius; }; typedef struct augment_xylist_s augment_xylist_t; int parse_scale_units(const char* str); int augment_xylist(augment_xylist_t* args, const char* executable_path); void augment_xylist_init(augment_xylist_t* args); void augment_xylist_free_contents(augment_xylist_t* args); void augment_xylist_print_help(FILE* fid); void augment_xylist_add_options(bl* opts); int augment_xylist_parse_option(char argchar, char* optarg, augment_xylist_t* axyargs); void augment_xylist_print_special_opts(an_option_t* opt, bl* opts, int index, FILE* fid, void* extra); #endif astrometry.net-0.67/include/astrometry/axyfile.h000644 000765 000024 00000005561 12651445460 022243 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AXYFILE_H #define AXYFILE_H #include "astrometry/bl.h" /* Shared between 'augment-xylist' and 'astrometry-engine': description of a field to be solved. Uses FITS header cards: IMAGEW IMAGEH ANPOSERR -- positional error; sp->verify_pix ANCTOL -- code tolerance; sp->codetol ANDISTR -- distractor ratio; sp->distractor_ratio ANSOLVED -- solved output filename; bp ANSOLVIN -- solved input filename; bp ANMATCH -- match file; bp ANRDLS -- RA,Dec of index stars ANSCAMP -- Scamp catalog ANWCS -- WCS FITS header ANCORR -- correlation between sources and index ANCANCEL -- cancel file. ANTAG# (string) Tag-along columns to copy from index into index-rdls ANTAGALL (bool) Tag-along all columns ANXCOL -- X column name ANYCOL -- Y column name ANTLIM -- time limit (seconds) ANCLIM -- CPU time limit (seconds) ANODDSPR -- odds ratio to print ANODDSKP -- odds ratio to keep ANODDSSL -- odds ratio to solve ANODDSBL -- odds ratio to bail ANODDSST -- odds ratio to stop looking further ANAPPDEF (bool) include default image scales ANPARITY (string) "NEG"/"POS" ANTWEAK (bool) tweak? ANTWEAKO (int) tweak polynomial order ANQSFMIN (float) minimum quad size fraction (of image size) ANQSFMAX (float) maximum quad size fraction (of image size) ANCRPIXC (bool) set CRPIX to image center ANCRPIX1 (float) set CRPIX to... ANCRPIX2 (float) set CRPIX to... ANERA (float) estimated RA (deg) ANEDEC (float) estimated DEC (deg) ANERAD (float) estimated field radius (deg) ANAPPL# (float) #=1,2,... image scale, lower bound, arcsec/pixel ANAPPU# (float) #=1,2,... image scale, upper bound, arcsec/pixel ANDPL# (int) #=1,2,... depth (image obj #), lower bound, >= 1 ANDPU# (int) #=1,2,... depth (image obj #), upper bound, >= min ANFDL# (int) #=1,2,... field (FITS extension), lower, >= 1 ANFDU# (int) #=1,2,... field (FITS extension), upper, >= min ANFD# (int) #=1,2,... field (FITS extension), single field, >= 1. ANW#PIX1 (float) #=1,2,... WCS to verify. ANW#PIX2 (float) (crpix) ANW#VAL1 (float) (crval) ANW#VAL2 (float) ANW#CD11 (float) (cd matrix) ANW#CD12 (float) ANW#CD21 (float) ANW#CD22 (float) ANW#SAO (int) SIP order, forward ANW#A## (float) ## = (i,j) SIP coefficients ANW#B## (float) ## = (i,j) ANW#SAPO (int) SIP order, inverse ANW#AP## (float) ## = (i,j) SIP coefficients ANW#BP## (float) ## = (i,j) ANRUN (bool) Go. **/ struct axyfile { /* // contains ranges of depths as pairs of ints. il* depths; bool include_default_scales; double ra_center; double dec_center; double search_radius; bool use_radec_center; blind_t bp; */ }; typedef struct axyfile axyfile_t; #endif astrometry.net-0.67/include/astrometry/bl-nl.h000644 000765 000024 00000005452 12651445460 021605 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Common header for lists of numerical types. Expects "nl" to be #defined to the list type. Expects "number" to be #defined to the numerical type. */ #include "astrometry/bl-nl.ph" typedef bl nl; // The "const number"s in here are mostly for pl. Malloc nl* NLF(new)(int blocksize); Pure InlineDeclare size_t NLF(size)(const nl* list); void NLF(new_existing)(nl* list, int blocksize); void NLF(init)(nl* list, int blocksize); void NLF(reverse)(nl* list); void NLF(remove_all)(nl* list); void NLF(remove_all_reuse)(nl* list); void NLF(free)(nl* list); number* NLF(append)(nl* list, const number data); void NLF(append_list)(nl* list, nl* list2); void NLF(append_array)(nl* list, const number* data, size_t ndata); void NLF(merge_lists)(nl* list1, nl* list2); void NLF(push)(nl* list, const number data); number NLF(pop)(nl* list); int NLF(contains)(nl* list, const number data); // Assuming the list is sorted in ascending order, // does it contain the given number? int NLF(sorted_contains)(nl* list, const number data); // Or -1 if not found. ptrdiff_t NLF(sorted_index_of)(nl* list, const number data); #if DEFINE_SORT void NLF(sort)(nl* list, int ascending); #endif Malloc number* NLF(to_array)(nl* list); // Returns the index in the list of the given number, or -1 if it // is not found. ptrdiff_t NLF(index_of)(nl* list, const number data); InlineDeclare number NLF(get)(nl* list, size_t n); InlineDeclare number NLF(get_const)(const nl* list, size_t n); InlineDeclare number* NLF(access)(nl* list, size_t n); /** Copy from the list, starting at index "start" for length "length", into the provided array. */ void NLF(copy)(nl* list, size_t start, size_t length, number* vdest); nl* NLF(dupe)(nl* list); void NLF(print)(nl* list); void NLF(insert)(nl* list, size_t indx, const number data); size_t NLF(insert_ascending)(nl* list, const number n); size_t NLF(insert_descending)(nl* list, const number n); // Returns the index at which the element was added, or -1 if it's a duplicate. ptrdiff_t NLF(insert_unique_ascending)(nl* list, const number p); void NLF(set)(nl* list, size_t ind, const number value); void NLF(remove)(nl* list, size_t ind); void NLF(remove_index_range)(nl* list, size_t start, size_t length); // See also sorted_index_of, which should be faster. // Or -1 if not found ptrdiff_t NLF(find_index_ascending)(nl* list, const number value); nl* NLF(merge_ascending)(nl* list1, nl* list2); // returns the index of the removed value, or -1 if it didn't // exist in the list. ptrdiff_t NLF(remove_value)(nl* list, const number value); int NLF(check_consistency)(nl* list); int NLF(check_sorted_ascending)(nl* list, int isunique); int NLF(check_sorted_descending)(nl* list, int isunique); astrometry.net-0.67/include/astrometry/bl-nl.inc000644 000765 000024 00000001065 12651445460 022123 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "astrometry/bl-nl.ph" InlineDefine number NLF(get)(nl* list, size_t n) { number* ptr = (number*)bl_access(list, n); return *ptr; } InlineDefine number NLF(get_const)(const nl* list, size_t n) { number* ptr = (number*)bl_access_const(list, n); return *ptr; } InlineDefine size_t NLF(size)(const nl* list) { return bl_size(list); } InlineDefine number* NLF(access)(nl* list, size_t j) { return (number*)bl_access(list, j); } astrometry.net-0.67/include/astrometry/bl-nl.ph000644 000765 000024 00000000427 12651445460 021762 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ //#define NODE_NUMDATA(node) ((number*)NODE_DATA(node)) #define NLFGLUE2(n,f) n ## _ ## f #define NLFGLUE(n,f) NLFGLUE2(n,f) #define NLF(func) NLFGLUE(nl, func) astrometry.net-0.67/include/astrometry/bl-sort.h000644 000765 000024 00000000625 12651445460 022160 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Sorting functions of bl.h, to factor out qsort dependency. */ #ifndef BL_SORT_H #define BL_SORT_H #include "astrometry/bl.h" void bl_sort(bl* list, int (*compare)(const void* v1, const void* v2)); void pl_sort(pl* list, int (*compare)(const void* v1, const void* v2)); #endif astrometry.net-0.67/include/astrometry/bl.h000644 000765 000024 00000024477 12651445460 021206 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** A linked list of arrays, which allows more rapid traversal of the list, and fairly efficient insertions and deletions. */ #ifndef BL_H #define BL_H #include #include #include #include #include "astrometry/keywords.h" struct bl_node { // number of elements filled. int N; struct bl_node* next; // (data block implicitly follows this struct). }; typedef struct bl_node bl_node; // the top-level data structure of a blocklist. typedef struct { bl_node* head; bl_node* tail; // the total number of data elements size_t N; // the number of elements per block int blocksize; // the size in bytes of each data element int datasize; // rapid accessors for "jumping in" at the last block accessed bl_node* last_access; size_t last_access_n; } bl; #define BL_NOT_FOUND (ptrdiff_t)(-1) Malloc bl* bl_new(int blocksize, int datasize); void bl_init(bl* l, int blocksize, int datasize); void bl_free(bl* list); void bl_remove_all(bl* list); Pure InlineDeclare size_t bl_size(const bl* list); Pure int bl_datasize(const bl* list); /** Appends an element, returning the location whereto it was copied. */ void* bl_append(bl* list, const void* data); // Copies the nth element into the destination location. void bl_get(bl* list, size_t n, void* dest); // Returns a pointer to the nth element. InlineDeclare void* bl_access(bl* list, size_t n); void* bl_access_const(const bl* list, size_t n); void* bl_push(bl* list, const void* data); // Pops a data item into the given "into" memory. void bl_pop(bl* list, void* into); // allocates space for a new object and returns a pointer to it void* bl_extend(bl* list); /** Removes elements from \c split to the end of the list from \c src and appends them to \c dest. */ void bl_split(bl* src, bl* dest, size_t split); void bl_reverse(bl* list); /* * Appends "list2" to the end of "list1", and removes all elements * from "list2". */ void bl_append_list(bl* list1, bl* list2); void bl_insert(bl* list, size_t indx, const void* data); void bl_set(bl* list, size_t indx, const void* data); void bl_print_structure(bl* list); void bl_copy(bl* list, size_t start, size_t length, void* vdest); /** * Inserts the given datum into the list in such a way that the list * stays sorted in ascending order according to the given comparison * function (assuming it was sorted to begin with!). * * The inserted element will be placed _after_ existing elements with * the same value. * * The comparison function is the same as qsort's: it should return * 1 if the first arg is greater than the second arg * 0 if they're equal * -1 if the first arg is smaller. * * The index where the element was inserted is returned. */ size_t bl_insert_sorted(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)); /** If the item already existed in the list (ie, the compare function returned zero), then -1 is returned. Otherwise, the index at which the item was inserted is returned. */ ptrdiff_t bl_insert_unique_sorted(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)); /* Removes all the elements, but doesn't free the first block, which makes it slightly faster for the case when you're going to add more elements right away, since you don't have to free() the old block then immediately malloc() a new block. */ void bl_remove_all_but_first(bl* list); void bl_remove_index(bl* list, size_t indx); void bl_remove_index_range(bl* list, size_t start, size_t length); void* bl_find(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)); ptrdiff_t bl_find_index(bl* list, const void* data, int (*compare)(const void* v1, const void* v2)); // returns 0 if okay, 1 if an error is detected. int bl_check_consistency(bl* list); // returns 0 if okay, 1 if an error is detected. int bl_check_sorted(bl* list, int (*compare)(const void* v1, const void* v2), int isunique); /////////////////////////////////////////////// // special-case functions for string lists. // /////////////////////////////////////////////// /* sl makes a copy of the string using strdup(). It will be freed when the string is removed from the list or the list is freed. */ typedef bl sl; sl* sl_new(int blocksize); /* The functions: sl_init() ---> sl_init2() sl_free() ---> sl_free2() sl_add() ---> sl_add2() sl_find() ---> sl_find2() are defined by BSD, where they live in libc. We therefore avoid these names, which breaks the principle of least surprise, but makes life a bit easier. */ void sl_init2(sl* list, int blocksize); // free this list and all the strings it contains. void sl_free2(sl* list); void sl_append_contents(sl* dest, sl* src); // Searches the sl for the given string. Comparisons use strcmp(). // Returns -1 if the string is not found, or the first index where it was found. ptrdiff_t sl_index_of(sl* lst, const char* str); ptrdiff_t sl_last_index_of(sl* lst, const char* str); // Returns 0 if the string is not in the sl, 1 otherwise. // (same as sl_index_of(lst, str) > -1) int sl_contains(sl* lst, const char* str); // just free the list structure, not the strings in it. void sl_free_nonrecursive(sl* list); Pure InlineDeclare size_t sl_size(const sl* list); // copies the string and enqueues it; returns the newly-allocate string. char* sl_append(sl* list, const char* string); // appends the string; doesn't copy it. void sl_append_nocopy(sl* list, const char* string); void sl_append_array(sl* list, const char** strings, size_t n); // copies the string and pushes the copy. Returns the copy. char* sl_push(sl* list, const char* data); // returns the last string: it's your responsibility to free it. char* sl_pop(sl* list); char* sl_get(sl* list, size_t n); char* sl_get_const(const sl* list, size_t n); // sets the string at the given index to the given value. // if there is already a string at that index, frees it. char* sl_set(sl* list, size_t n, const char* val); int sl_check_consistency(sl* list); // inserts a copy of the given string. char* sl_insert(sl* list, size_t indx, const char* str); // inserts the given string. void sl_insert_nocopy(sl* list, size_t indx, const char* str); // frees all the strings and removes them from the list. void sl_remove_all(sl* list); // inserts the string; doesn't copy it. void sl_insert_sorted_nocopy(sl* list, const char* string); // inserts a copy of the string; returns the newly-allocated string. char* sl_insert_sorted(sl* list, const char* string); // Inserts the (newly-allocated) formatted string and returns it. char* ATTRIB_FORMAT(printf,2,3) sl_insert_sortedf(sl* list, const char* format, ...); void sl_remove_index_range(sl* list, size_t start, size_t length); void sl_remove(sl* list, size_t index); // Removes "string" if it is found in the list. // Note that this checks pointer match, not a strcmp() match. // Returns the index where the string was found, or -1 if it wasn't found. ptrdiff_t sl_remove_string(sl* list, const char* string); // Removes "string" if it is found in the list, using strcasecmp(). // Returns the string or NULL if not found. char* sl_remove_string_bycaseval(sl* list, const char* string); // Removes "string" if it is found in the list, using strcmp(). // Returns the index where the string was found, or -1 if it wasn't found. ptrdiff_t sl_remove_string_byval(sl* list, const char* string); // remove all elements starting from "start" to the end of the list. void sl_remove_from(sl* list, size_t start); void sl_merge_lists(sl* list1, sl* list2); void sl_print(sl* list); /* Removes duplicate entries, using strcmp(). */ void sl_remove_duplicates(sl* lst); /* Splits the given string 'str' into substrings separated by 'sepstring'. (Some of the substrings may be empty, for example if the 'sepstring' appears consecutively.) Adds them to 'lst', if non-NULL. Allocates and fills a new sl* if 'lst' is NULL. The original string can be reconstructed by calling "sl_implode(lst, sepstring)" */ sl* sl_split(sl* lst, const char* str, const char* sepstring); // Like the PHP function implode(), joins each element in the list with the given // "join" string. The result is a newly-allocate string containing: // sl_get(list, 0) + join + sl_get(list, 1) + join + ... + join + sl_get(list, N-1) // -AKA sl_join. char* sl_implode(sl* list, const char* join); // like Python's joinstring.join(list) // -AKA sl_implode char* sl_join(sl* list, const char* joinstring); // same as sl_join(reverse(list), str) char* sl_join_reverse(sl* list, const char* join); // Appends the (newly-allocated) formatted string and returns it. char* ATTRIB_FORMAT(printf,2,3) sl_appendf(sl* list, const char* format, ...); // Appends the (newly-allocated) formatted string and returns it. char* sl_appendvf(sl* list, const char* format, va_list va); // Inserts the (newly-allocated) formatted string and returns it. char* ATTRIB_FORMAT(printf,3,4) sl_insertf(sl* list, size_t index, const char* format, ...); #define DEFINE_SORT 1 #define nl il #define number int #include "astrometry/bl-nl.h" #undef nl #undef number #define nl ll #define number int64_t #include "astrometry/bl-nl.h" #undef nl #undef number #define nl dl #define number double #include "astrometry/bl-nl.h" #undef nl #undef number #define nl fl #define number float #include "astrometry/bl-nl.h" #undef nl #undef number #undef DEFINE_SORT #define DEFINE_SORT 0 #define nl pl #define number void* #include "astrometry/bl-nl.h" #undef nl #undef number #undef DEFINE_SORT //////// Special functions //////// void pl_free_elements(pl* list); size_t pl_insert_sorted(pl* list, const void* data, int (*compare)(const void* v1, const void* v2)); #ifdef INCLUDE_INLINE_SOURCE #define InlineDefine InlineDefineH #include "astrometry/bl.inc" #define nl il #define number int #include "astrometry/bl-nl.inc" #undef nl #undef number #define nl ll #define number int64_t #include "astrometry/bl-nl.inc" #undef nl #undef number #define nl pl #define number void* #include "astrometry/bl-nl.inc" #undef nl #undef number #define nl dl #define number double #include "astrometry/bl-nl.inc" #undef nl #undef number #define nl fl #define number float #include "astrometry/bl-nl.inc" #undef nl #undef number #undef InlineDefine #endif #endif astrometry.net-0.67/include/astrometry/bl.inc000644 000765 000024 00000002245 12651445460 021515 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "astrometry/bl.ph" /* find the node in which element "n" can be found. */ InlineDefine bl_node* find_node(const bl* list, size_t n, size_t* p_nskipped) { bl_node* node; size_t nskipped; if (list->last_access && n >= list->last_access_n) { // take the shortcut! nskipped = list->last_access_n; node = list->last_access; } else { node = list->head; nskipped = 0; } for (; node;) { if (n < (nskipped + node->N)) break; nskipped += node->N; node = node->next; } assert(node); if (p_nskipped) *p_nskipped = nskipped; return node; } InlineDefine void* bl_access(bl* list, size_t n) { void* rtn; bl_node* node; size_t nskipped; node = find_node(list, n, &nskipped); // grab the element. rtn = NODE_CHARDATA(node) + (n - nskipped) * list->datasize; // update the last_access member... list->last_access = node; list->last_access_n = nskipped; return rtn; } InlineDefine size_t bl_size(const bl* list) { return list->N; } InlineDefine size_t sl_size(const sl* list) { return bl_size(list); } astrometry.net-0.67/include/astrometry/bl.ph000644 000765 000024 00000001056 12651445460 021352 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /// Private header file shared between bl.inc and bl.c InlineDeclare bl_node* find_node(const bl* list, size_t n, size_t* rtn_nskipped); // data follows the bl_node*. #define NODE_DATA(node) ((void*)(((bl_node*)(node)) + 1)) #define NODE_CHARDATA(node) ((char*)(((bl_node*)(node)) + 1)) #define NODE_INTDATA(node) ((int*)(((bl_node*)(node)) + 1)) #define NODE_DOUBLEDATA(node) ((double*)(((bl_node*)(node)) + 1)) #define bl_free_node free astrometry.net-0.67/include/astrometry/blind.h000644 000765 000024 00000010170 12651445460 021662 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef BLIND_H #define BLIND_H #include "astrometry/an-bool.h" #include "astrometry/solver.h" #include "astrometry/matchobj.h" #include "astrometry/matchfile.h" #include "astrometry/rdlist.h" #include "astrometry/bl.h" #define DEFAULT_QSF_LO 0.1 #define DEFAULT_QSF_HI 1.0 struct blind_params { solver_t solver; anbool indexes_inparallel; double logratio_tosolve; // How many solving quads are required before we stop? int nsolves; int nsolves_sofar; // Filenames char *fieldfname; char *matchfname; char *indexrdlsfname; char *corr_fname; char* scamp_fname; // WCS filename template (sprintf format with %i for field number) char* wcs_template; // List of WCS filenames to run verification on. sl* verify_wcsfiles; // WCS instances to verify. (sip_t structs) bl* verify_wcs_list; // Output solved file. char *solved_out; // Input solved file. char* solved_in; // Solvedserver ip:port char *solvedserver; // If using solvedserver, limits of fields to ask for int firstfield, lastfield; // Indexes to use (base filenames) sl* indexnames; // Indexes to use (index_t objects) pl* indexes; int index_options; // Quad size fraction: select indexes that contain quads of size fraction // [quad_size_fraction_lo, quad_size_fraction_hi] of the image size. double quad_size_fraction_lo; double quad_size_fraction_hi; // Fields to try il* fieldlist; // Which field in a multi-HDU xyls file is this? int fieldnum; // A unique ID for the whole multi-HDU xyls file. int fieldid; // xylist column names. char *xcolname, *ycolname; // FITS keyword to copy from xylist to matchfile. char *fieldid_key; // The fields to solve! xylist_t* xyls; // Output files matchfile* mf; rdlist_t* indexrdls; // extra fields to add to index rdls file: sl* rdls_tagalong; anbool rdls_tagalong_all; // internal use only: have I grabbed "all" rdls fields already? //anbool done_rdls_tagalong_all; // field to sort RDLS file by; prefix by "-" for descending order. char* sort_rdls; // extra fields to add from the xyls file: sl* xyls_tagalong; anbool xyls_tagalong_all; // List of MatchObjs with logodds >= logodds_tokeep bl* solutions; float cpulimit; float cpu_start; anbool hit_cpulimit; int timelimit; time_t time_start; anbool hit_timelimit; float total_cpulimit; float cpu_total_start; anbool hit_total_cpulimit; double total_timelimit; double time_total_start; anbool hit_total_timelimit; anbool single_field_solved; // filename for cancelling char* cancelfname; anbool cancelled; anbool best_hit_only; }; typedef struct blind_params blind_t; void blind_set_field_file(blind_t* bp, const char* fn); void blind_set_cancel_file(blind_t* bp, const char* fn); void blind_set_solved_file(blind_t* bp, const char* fn); void blind_set_solvedin_file(blind_t* bp, const char* fn); void blind_set_solvedout_file(blind_t* bp, const char* fn); void blind_set_match_file(blind_t* bp, const char* fn); void blind_set_rdls_file(blind_t* bp, const char* fn); void blind_set_scamp_file(blind_t* bp, const char* fn); void blind_set_corr_file(blind_t* bp, const char* fn); void blind_set_wcs_file(blind_t* bp, const char* fn); void blind_set_xcol(blind_t* bp, const char* x); void blind_set_ycol(blind_t* bp, const char* x); void blind_add_verify_wcs(blind_t* bp, sip_t* wcs); void blind_add_loaded_index(blind_t* bp, index_t* ind); void blind_add_index(blind_t* bp, const char* index); void blind_clear_verify_wcses(blind_t* bp); void blind_clear_indexes(blind_t* bp); void blind_clear_solutions(blind_t* bp); void blind_add_field(blind_t* bp, int field); void blind_add_field_range(blind_t* bp, int lo, int hi); void blind_run(blind_t* bp); void blind_init(blind_t* bp); void blind_cleanup(blind_t* bp); int blind_parameters_are_sane(blind_t* bp, solver_t* sp); int blind_is_run_obsolete(blind_t* bp, solver_t* sp); void blind_log_run_parameters(blind_t* bp); void blind_free_matchobj(MatchObj* mo); void blind_matchobj_deep_copy(const MatchObj* mo, MatchObj* dest); #endif astrometry.net-0.67/include/astrometry/blindutils.h000644 000765 000024 00000000373 12651445460 022747 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SCRIPTUTILS_H #define SCRIPTUTILS_H #include "astrometry/bl.h" int parse_depth_string(il* depths, const char* str); #endif astrometry.net-0.67/include/astrometry/brightstars.h000644 000765 000024 00000000726 12651445460 023134 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef BRIGHTSTARS_H #define BRIGHTSTARS_H struct brightstar { // Don't change the order of these fields - the included datafile depends on this order! char* name; char* common_name; double ra; double dec; double Vmag; }; typedef struct brightstar brightstar_t; int bright_stars_n(); const brightstar_t* bright_stars_get(int starindex); #endif astrometry.net-0.67/include/astrometry/bt.h000644 000765 000024 00000003770 12651445460 021207 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef BT_H #define BT_H #include "astrometry/keywords.h" #include "astrometry/an-bool.h" /* We distinguish between "branch" (ie, internal) nodes and "leaf" nodes because leaf nodes can be much smaller. Since there are a lot of leaves, the space savings can be considerable. The data owned by a leaf node follows right after the leaf struct itself. */ struct bt_leaf { // always 1; must be the first element in the struct. unsigned char isleaf; // number of data elements. short N; // data follows implicitly. }; typedef struct bt_leaf bt_leaf; struct bt_branch { // always 0; must be the first element in the struct. unsigned char isleaf; // AVL balance signed char balance; //struct bt_node* children[2]; union bt_node* children[2]; // the leftmost leaf node in this subtree. bt_leaf* firstleaf; // number of element in this subtree. int N; }; typedef struct bt_branch bt_branch; union bt_node { bt_leaf leaf; bt_branch branch; }; typedef union bt_node bt_node; struct bt { bt_node* root; int datasize; int blocksize; int N; }; typedef struct bt bt; typedef int (*compare_func)(const void* v1, const void* v2); typedef int (*compare_func_2)(const void* v1, const void* v2, void* token); Malloc bt* bt_new(int datasize, int blocksize); void bt_free(bt* tree); Pure //Inline int bt_size(bt* tree); anbool bt_insert(bt* tree, void* data, anbool unique, compare_func compare); anbool bt_insert2(bt* tree, void* data, anbool unique, compare_func_2 compare, void* token); anbool bt_contains(bt* tree, void* data, compare_func compare); anbool bt_contains2(bt* tree, void* data, compare_func_2 compare, void* token); void* bt_access(bt* tree, int index); void bt_print(bt* tree, void (*print_element)(void* val)); void bt_print_structure(bt* tree, void (*print_element)(void* val)); int bt_height(bt* tree); int bt_count_leaves(bt* tree); int bt_check(bt* tree); #endif astrometry.net-0.67/include/astrometry/build-index.h000644 000765 000024 00000002750 12651445460 023003 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef BUILD_INDEX_H #define BUILD_INDEX_H #include "astrometry/fitstable.h" #include "astrometry/index.h" #include "astrometry/an-bool.h" struct index_params { // catalog: const char* racol; const char* deccol; // in arcsec double jitter; // uniformization: const char* sortcol; anbool sortasc; double brightcut; int bighp; int bignside; int sweeps; double dedup; int margin; int UNside; // hpquads: int Nside; void* hpquads_sort_data; int (*hpquads_sort_func)(const void*, const void*); int hpquads_sort_size; // quad size range, in arcmin double qlo; double qhi; int passes; int Nreuse; int Nloosen; anbool scanoccupied; int dimquads; int indexid; // general options anbool inmemory; anbool delete_tempfiles; const char* tempdir; char** args; int argc; }; typedef struct index_params index_params_t; void build_index_defaults(index_params_t* params); int build_index_files(const char* catalogfn, int extension, const char* indexfn, index_params_t* params); int build_index(fitstable_t* catalog, index_params_t* p, index_t** p_index, const char* indexfn); int build_index_shared_skdt(const char* starkdfn, startree_t* starkd, index_params_t* p, index_t** p_index, const char* indexfn); int build_index_shared_skdt_files(const char* starkdfn, const char* indexfn, index_params_t* p); #endif astrometry.net-0.67/include/astrometry/cairoutils.h000644 000765 000024 00000006453 12651445460 022761 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CAIRO_UTILS_H #define CAIRO_UTILS_H #include #include /** A cairo_write_func_t for use with, eg, cairo_pdf_surface_create_for_stream. The "closure" arg must be a FILE*. */ cairo_status_t cairoutils_file_write_func(void *closure, const unsigned char *data, unsigned int length); /** Reports any cairo error for the given surface. Returns 0 for ok, -1 on error. */ int cairoutils_surface_status_errors(cairo_surface_t* surf); int cairoutils_cairo_status_errors(cairo_t* c); void cairoutils_draw_path(cairo_t* c, const double* xy, int N); void cairoutils_argb32_to_rgba(unsigned char* img, int W, int H); void cairoutils_argb32_to_rgba_2(const unsigned char* inimg, unsigned char* outimg, int W, int H); void cairoutils_argb32_to_rgba_flip(const unsigned char* inimg, unsigned char* outimg, int W, int H); void cairoutils_rgba_to_argb32(unsigned char* img, int W, int H); void cairoutils_rgba_to_argb32_2(const unsigned char* inimg, unsigned char* outimg, int W, int H); void cairoutils_rgba_to_argb32_flip(const unsigned char* inimg, unsigned char* outimg, int W, int H); void cairoutils_premultiply_alpha_rgba(unsigned char* img, int W, int H); /** All the following cairoutils_read_* function return a newly-allocated image buffer of size W * H * 4, containing R,G,B, and alpha. */ unsigned char* cairoutils_read_png_stream(FILE* fid, int* pW, int *pH); unsigned char* cairoutils_read_jpeg_stream(FILE* fid, int* pW, int* pH); unsigned char* cairoutils_read_png(const char* fn, int* pW, int *pH); unsigned char* cairoutils_read_jpeg(const char* fn, int* pW, int* pH); void cairoutils_fake_ppm_init(void); // You must call ppm_init() or (preferably) cairoutils_fake_ppm_init() unsigned char* cairoutils_read_ppm(const char* infn, int* pW, int* pH); unsigned char* cairoutils_read_ppm_stream(FILE* fid, int* pW, int* pH); int cairoutils_write_ppm(const char* outfn, unsigned char* img, int W, int H); int cairoutils_write_png(const char* outfn, unsigned char* img, int W, int H); int cairoutils_write_jpeg(const char* outfn, unsigned char* img, int W, int H); int cairoutils_stream_ppm(FILE* fout, unsigned char* img, int W, int H); int cairoutils_stream_png(FILE* fout, unsigned char* img, int W, int H); int cairoutils_stream_jpeg(FILE* fout, unsigned char* img, int W, int H); int cairoutils_parse_color(const char* color, float* r, float* g, float* b); // Parses a space-separated list of floating-point rgb(a) values. // Parses alpha if "a" is non-null and str contains four terms. int cairoutils_parse_rgba(const char* str, float* r, float* g, float* b, float* a); const char* cairoutils_get_color_name(int i); int cairoutils_parse_marker(const char* name); #define CAIROUTIL_MARKER_CIRCLE 0 #define CAIROUTIL_MARKER_CROSSHAIR 1 #define CAIROUTIL_MARKER_SQUARE 2 #define CAIROUTIL_MARKER_DIAMOND 3 #define CAIROUTIL_MARKER_X 4 #define CAIROUTIL_MARKER_XCROSSHAIR 5 void cairoutils_draw_marker(cairo_t* cairo, int id, double x, double y, double radius); const char* cairoutils_get_marker_name(int i); void cairoutils_print_color_names(const char* prefix); void cairoutils_print_marker_names(const char* prefix); #endif astrometry.net-0.67/include/astrometry/catalog.h000644 000765 000024 00000004276 12651445460 022216 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CATUTILS_H #define CATUTILS_H #include #include #include "astrometry/fitsbin.h" #include "astrometry/bl.h" #include "astrometry/an-bool.h" #define AN_FILETYPE_CATALOG "OBJS" struct catalog { int numstars; int healpix; int hpnside; double* stars; // optional table: star magnitudes and mag errors. float* mag; float* mag_err; // optional tables: positional error ellipses, proper motions float* sigma_radec; // sigma_ra, sigma_dec float* proper_motion; // motion_ra, motion_dec float* sigma_pm; // sigma_motion_ra, sigma_motion_dec // optional table: star IDs uint64_t* starids; // while writing: storage for the extra fields. fl* maglist; fl* magerrlist; fl* siglist; fl* pmlist; fl* sigpmlist; bl* idlist; fitsbin_t* fb; }; typedef struct catalog catalog; catalog* catalog_open(char* catfn); catalog* catalog_open_for_writing(char* catfn); double* catalog_get_star(catalog* cat, int sid); double* catalog_get_base(catalog* cat); int catalog_write_star(catalog* cat, double* star); int catalog_close(catalog* cat); //void catalog_compute_radecminmax(catalog* cat); int catalog_write_header(catalog* cat); qfits_header* catalog_get_header(catalog* cat); int catalog_fix_header(catalog* cat); anbool catalog_has_mag(const catalog* cat); void catalog_add_mag(catalog* cat, float mag); void catalog_add_mag_err(catalog* cat, float magerr); void catalog_add_sigmas(catalog* cat, float sra, float sdec); void catalog_add_pms(catalog* cat, float sra, float sdec); void catalog_add_sigma_pms(catalog* cat, float sra, float sdec); void catalog_add_id(catalog* cat, uint64_t id); /* This should be called after writing all the star positions and calling catalog_fix_header(). It appends the data in "cat->mags" to the file as an extra FITS table. */ int catalog_write_mags(catalog* cat); int catalog_write_mag_errs(catalog* cat); int catalog_write_sigmas(catalog* cat); int catalog_write_pms(catalog* cat); int catalog_write_sigma_pms(catalog* cat); int catalog_write_ids(catalog* cat); #endif astrometry.net-0.67/include/astrometry/coadd.h000644 000765 000024 00000002642 12651445460 021651 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "astrometry/anwcs.h" #include "astrometry/resample.h" typedef float number; /* typedef bool (*isbadpix)(const number* img, const number* weightimg, int ix, int iy, void* token) badpixfunc_t; */ typedef struct { number* img; number* weight; int W, H; anwcs_t* wcs; double (*resample_func)(double px, double py, const number* img, const number* weightimg, int W, int H, double* wt, //badpixfunc_t badpix, //void* isbadpix_token, void* resample_token); void* resample_token; } coadd_t; coadd_t* coadd_new(int W, int H); coadd_t* coadd_new_from_wcs(anwcs_t* wcs); void coadd_set_lanczos(coadd_t* co, int Lorder); int coadd_add_image(coadd_t* c, const number* img, const number* weightimg, number weight, const anwcs_t* wcs); //, badpixfunc_t badpix, void* badpix_token); // divide "img" by "weight"; set img=badpix where weight=0. void coadd_divide_by_weight(coadd_t* c, number badpix); number* coadd_get_snapshot(coadd_t* c, number* outimg, number badpix); void coadd_free(coadd_t* c); void coadd_debug(coadd_t* co); number* coadd_create_weight_image_from_range(const number* img, int W, int H, number lowval, number highval); void coadd_weight_image_mask_value(const number* img, int W, int H, number* weight, number badval); astrometry.net-0.67/include/astrometry/codefile.h000644 000765 000024 00000003354 12651445460 022352 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CODEFILE_H_ #define CODEFILE_H_ #include #include #include "astrometry/qfits_header.h" #include "astrometry/starutil.h" #include "astrometry/fitsbin.h" #include "astrometry/quadfile.h" #include "astrometry/starkd.h" // util: void codefile_compute_star_code(const double* starxyz, double* code, int dimquads); void codefile_compute_field_code(const double* xy, double* code, int dimquads); typedef struct { int numcodes; int numstars; int dimcodes; // upper bound double index_scale_upper; // lower bound double index_scale_lower; // unique ID of this index int indexid; // healpix covered by this index int healpix; // Nside of the healpixelization int hpnside; fitsbin_t* fb; // when reading: double* codearray; } codefile_t; int codefile_close(codefile_t* cf); int codefile_dimcodes(const codefile_t* cf); void codefile_get_code(const codefile_t* cf, int codeid, double* code); codefile_t* codefile_open(const char* fn); codefile_t* codefile_open_for_writing(const char* fname); codefile_t* codefile_open_in_memory(); // when in-memory int codefile_switch_to_reading(codefile_t* cf); int codefile_write_header(codefile_t* cf); int codefile_write_code(codefile_t* cf, double* code); int codefile_fix_header(codefile_t* cf); qfits_header* codefile_get_header(const codefile_t* cf); void quad_write(codefile_t* codes, quadfile_t* quads, unsigned int* quad, startree_t* starkd, int dimquads, int dimcodes); void quad_write_const(codefile_t* codes, quadfile_t* quads, const unsigned int* quad, startree_t* starkd, int dimquads, int dimcodes); #endif astrometry.net-0.67/include/astrometry/codekd.h000644 000765 000024 00000002030 12651445460 022017 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CODE_KD_H #define CODE_KD_H #include "astrometry/kdtree.h" #include "astrometry/qfits_header.h" #include "astrometry/anqfits.h" #define AN_FILETYPE_CODETREE "CKDT" #define CODETREE_NAME "codes" typedef struct { kdtree_t* tree; qfits_header* header; int* inverse_perm; } codetree_t; codetree_t* codetree_open(const char* fn); codetree_t* codetree_open_fits(anqfits_t* fits); int codetree_get(codetree_t* s, unsigned int codeid, double* code); int codetree_N(codetree_t* s); int codetree_nodes(codetree_t* s); int codetree_D(codetree_t* s); int codetree_get_permuted(codetree_t* s, int index); qfits_header* codetree_header(codetree_t* s); int codetree_close(codetree_t* s); // for writing codetree_t* codetree_new(void); int codetree_append_to(codetree_t* s, FILE* fid); int codetree_write_to_file(codetree_t* s, const char* fn); int codetree_write_to_file_flipped(codetree_t* s, const char* fn); #endif astrometry.net-0.67/include/astrometry/codetree.h000644 000765 000024 00000001076 12651445460 022371 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CODETREE_H #define CODETREE_H #include "astrometry/codekd.h" #include "astrometry/codefile.h" #include "astrometry/fitstable.h" /** */ codetree_t* codetree_build(codefile_t* codes, int Nleaf, int datatype, int treetype, int buildopts, char** args, int argc); int codetree_files(const char* codefn, const char* ckdtfn, int Nleaf, int datatype, int treetype, int buildopts, char** args, int argc); #endif astrometry.net-0.67/include/astrometry/constellation-boundaries.h000644 000765 000024 00000003060 12651445460 025601 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CONSTELLATION_BOUNDARIES_H #define CONSTELLATION_BOUNDARIES_H /** Returns the "enum constellations" number of the constellation containing the given RA,Dec point, or -1 if none such is found. */ int constellation_containing(double ra, double dec); enum constellations { CON_AND, CON_ANT, CON_APS, CON_AQR, CON_AQL, CON_ARA, CON_ARI, CON_AUR, CON_BOO, CON_CAE, CON_CAM, CON_CNC, CON_CVN, CON_CMA, CON_CMI, CON_CAP, CON_CAR, CON_CAS, CON_CEN, CON_CEP, CON_CET, CON_CHA, CON_CIR, CON_COL, CON_COM, CON_CRA, CON_CRB, CON_CRV, CON_CRT, CON_CRU, CON_CYG, CON_DEL, CON_DOR, CON_DRA, CON_EQU, CON_ERI, CON_FOR, CON_GEM, CON_GRU, CON_HER, CON_HOR, CON_HYA, CON_HYI, CON_IND, CON_LAC, CON_LEO, CON_LMI, CON_LEP, CON_LIB, CON_LUP, CON_LYN, CON_LYR, CON_MEN, CON_MIC, CON_MON, CON_MUS, CON_NOR, CON_OCT, CON_OPH, CON_ORI, CON_PAV, CON_PEG, CON_PER, CON_PHE, CON_PIC, CON_PSC, CON_PSA, CON_PUP, CON_PYX, CON_RET, CON_SGE, CON_SGR, CON_SCO, CON_SCL, CON_SCT, CON_SER1, CON_SER2, CON_SEX, CON_TAU, CON_TEL, CON_TRI, CON_TRA, CON_TUC, CON_UMA, CON_UMI, CON_VEL, CON_VIR, CON_VOL, CON_VUL, CON_FINAL, }; #endif astrometry.net-0.67/include/astrometry/constellations.h000644 000765 000024 00000002003 12651445460 023627 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CONSTELLATIONS_H #define CONSTELLATIONS_H #include "astrometry/bl.h" int constellations_n(); const char* constellations_get_shortname(int constellation_num); const char* constellations_get_longname(int constellation_num); const char* constellations_short_to_longname(const char* shortname); int constellations_get_nlines(int constellation_num); il* constellations_get_lines(int constellation_num); il* constellations_get_unique_stars(int constellation_num); /* Returns the star IDs of the line_num'th line. */ void constellations_get_line(int constellation_num, int line_num, int* ep1, int* ep2); /* Returns a newly-allocated dl* which is a list of (ra1, dec1), (ra2, dec2) coordinates of the line endpoints. */ dl* constellations_get_lines_radec(int constellation_num); /* RA,Dec in degrees */ void constellations_get_star_radec(int starnum, double* ra, double* dec); #endif astrometry.net-0.67/include/astrometry/convolve-image.h000644 000765 000024 00000001643 12651445460 023512 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CONVOLVE_IMAGE_H #define CONVOLVE_IMAGE_H float* convolve_get_gaussian_kernel_f(double sigma, double nsigma, int* k0, int* NK); // Does 2-D convolution by applying the same kernel in x and y directions. // Output image can be the same as input image. float* convolve_separable_f(const float* img, int W, int H, const float* kernel, int k0, int NK, float* outimg, float* tempimg); /** Hacky -- "weight" must be the same size as "img". Weights pixels by the kernel and the weight image. Probably only useful/correct if the weight matrix contains a constant and zeros for masked pixels. */ float* convolve_separable_weighted_f(const float* img, int W, int H, const float* weight, const float* kernel, int k0, int NK, float* outimg, float* tempimg); #endif astrometry.net-0.67/include/astrometry/ctmf.h000644 000765 000024 00000004523 12651445460 021530 0ustar00dstnstaff000000 000000 // See util/ctmf.c for copyright & license #ifndef CTMF_H #define CTMF_H #ifdef __cplusplus extern "C" { #endif /** * \brief Constant-time median filtering * * This function does a median filtering of an 8-bit image. The source image is * processed as if it was padded with zeros. The median kernel is square with * odd dimensions. Images of arbitrary size may be processed. * * To process multi-channel images, you must call this function multiple times, * changing the source and destination adresses and steps such that each channel * is processed as an independent single-channel image. * * Processing images of arbitrary bit depth is not supported. * * The computing time is O(1) per pixel, independent of the radius of the * filter. The algorithm's initialization is O(r*width), but it is negligible. * Memory usage is simple: it will be as big as the cache size, or smaller if * the image is small. For efficiency, the histograms' bins are 16-bit wide. * This may become too small and lead to overflow as \a r increases. * * \param src Source image data. * \param dst Destination image data. Must be preallocated. * \param width Image width, in pixels. * \param height Image height, in pixels. * \param src_step Distance between adjacent pixels on the same column in * the source image, in bytes. * \param dst_step Distance between adjacent pixels on the same column in * the destination image, in bytes. * \param r Median filter radius. The kernel will be a 2*r+1 by * 2*r+1 square. * \param cn Number of channels. For example, a grayscale image would * have cn=1 while an RGB image would have cn=3. * \param memsize Maximum amount of memory to use, in bytes. Set this to * the size of the L2 cache, then vary it slightly and * measure the processing time to find the optimal value. * For example, a 512 kB L2 cache would have * memsize=512*1024 initially. */ void ctmf( const unsigned char* src, unsigned char* dst, int width, int height, int src_step_row, int dst_step_row, int r, int channels, unsigned long memsize ); #ifdef __cplusplus } #endif #endif astrometry.net-0.67/include/astrometry/datalog.h000644 000765 000024 00000002152 12651445460 022206 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef DATA_LOG_H #define DATA_LOG_H #include #include "astrometry/an-bool.h" #include "astrometry/keywords.h" typedef uint32_t data_mask_t; #define DATALOG_MASK_ALL UINT32_MAX // FIXME -- duh, datalog should use log! struct data_log_t { data_mask_t mask; int level; FILE* f; int nitems; }; typedef struct data_log_t data_log_t; /** * Initialize global logging object. Must be called before any of the other * log_* functions. */ void data_log_init(int level); void data_log_start(); void data_log_end(); void data_log_start_item(data_mask_t mask, int level, const char* name); void data_log_end_item(data_mask_t mask, int level); void data_log_enable(data_mask_t mask); void data_log_enable_all(); void data_log_set_level(int level); /** Sends global data_logging to the given FILE*. */ void data_log_to(FILE* fid); anbool data_log_passes(data_mask_t mask, int level); void ATTRIB_FORMAT(printf, 3, 4) data_log(data_mask_t mask, int level, const char* format, ...); #endif astrometry.net-0.67/include/astrometry/dimage.h000644 000765 000024 00000004467 12651445460 022034 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef DIMAGE_H #define DIMAGE_H #include // this is only really included here so that it can be tested :) typedef uint16_t dimage_label_t; #define LABEL_MAX UINT16_MAX dimage_label_t collapsing_find_minlabel(dimage_label_t label, dimage_label_t *equivs); int dfind2(const int* image, int nx, int ny, int* objectimg, int* p_nobjects); int dfind2_u8(const unsigned char* image, int nx, int ny, int* objectimg, int* p_nobjects); float dselip(unsigned long k, unsigned long n, const float *arr); void dselip_cleanup(void); int dsmooth(float *image, int nx, int ny, float sigma, float *smooth); void dsmooth2(float *image, int nx, int ny, float sigma, float *smooth); void dsmooth2_u8(uint8_t *image, int nx, int ny, float sigma, float *smooth); void dsmooth2_i16(int16_t *image, int nx, int ny, float sigma, float *smooth); int dobjects(float *image, int nx, int ny, float limit, float dpsf, int *objects); int dmask(float *image, int nx, int ny, float limit, float dpsf, uint8_t* mask); int dpeaks(float *image, int nx, int ny, int *npeaks, int *xcen, int *ycen, float sigma, float dlim, float saddle, int maxnpeaks, int smooth, int checkpeaks, float minpeak); int dcen3x3(float *image, float *xcen, float *ycen); int dsigma(float *image, int nx, int ny, int sp, int gridsize, float *sigma); int dsigma_u8(uint8_t *image, int nx, int ny, int sp, int gridsize, float *sigma); int dmedsmooth(const float *image, const uint8_t *masked, int nx, int ny, int halfbox, float *smooth); int dallpeaks(float *image, int nx, int ny, int *objects, float *xcen, float *ycen, int *npeaks, float dpsf, float sigma, float dlim, float saddle, int maxper, int maxnpeaks, float minpeak, int maxsize); int dallpeaks_u8(uint8_t *image, int nx, int ny, int *objects, float *xcen, float *ycen, int *npeaks, float dpsf, float sigma, float dlim, float saddle, int maxper, int maxnpeaks, float minpeak, int maxsize); int dallpeaks_i16(int16_t *image, int nx, int ny, int *objects, float *xcen, float *ycen, int *npeaks, float dpsf, float sigma, float dlim, float saddle, int maxper, int maxnpeaks, float minpeak, int maxsize); #endif astrometry.net-0.67/include/astrometry/dualtree.h000644 000765 000024 00000003227 12651445460 022404 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ /** \file Dual-tree search. Input: -a search tree -a query tree -a function that takes two nodes and returns true if the result set should contain that pair of nodes. -an extra value that will be passed to the decision function. -a function that is called for each pair of leaf nodes. (** actually, at least one of the nodes will be a leaf. **) -an extra value that will be passed to the leaf-node function The query tree is a kd-tree built out of the points you want to query. The search and query trees can be the same tree. */ #include "astrometry/starutil.h" #include "astrometry/kdtree.h" typedef anbool (*decision_function)(void* extra, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); typedef void (*start_of_results_function)(void* extra, kdtree_t* querytree, int querynode); typedef void (*result_function)(void* extra, kdtree_t* searchtree, int searchnode, kdtree_t* querytree, int querynode); typedef void (*end_of_results_function)(void* extra, kdtree_t* querytree, int querynode); struct dualtree_callbacks { decision_function decision; void* decision_extra; start_of_results_function start_results; void* start_extra; result_function result; void* result_extra; end_of_results_function end_results; void* end_extra; }; typedef struct dualtree_callbacks dualtree_callbacks; void dualtree_search(kdtree_t* search, kdtree_t* query, dualtree_callbacks* callbacks); astrometry.net-0.67/include/astrometry/dualtree_nearestneighbour.h000644 000765 000024 00000000675 12651445460 026034 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef DUALTREE_NEAREST_NEIGHBOUR_H #define DUALTREE_NEAREST_NEIGHBOUR_H #include "astrometry/kdtree.h" void dualtree_nearestneighbour(kdtree_t* xtree, kdtree_t* ytree, double maxdist2, double** nearest_d2, int** nearest_ind, int** count_within_range, int notself); #endif astrometry.net-0.67/include/astrometry/dualtree_rangesearch.h000644 000765 000024 00000001773 12651445460 024752 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef DUALTREE_RANGE_SEARCH_H #define DUALTREE_RANGE_SEARCH_H extern double RANGESEARCH_NO_LIMIT; #include "astrometry/kdtree.h" // note, 'xind' and 'yind' are indices IN THE KDTREE; to get back to // 'normal' ordering you must use the kdtree permutation vector. typedef void (*result_callback)(void* extra, int xind, int yind, double dist2); typedef void (*progress_callback)(void* extra, int ydone); typedef double (*dist2_function)(void* px, void* py, int D); void dualtree_rangesearch(kdtree_t* xtree, kdtree_t* ytree, double mindist, double maxdist, int notself, dist2_function distsquared, result_callback callback, void* param, progress_callback progress, void* progress_param); /* void dualtree_rangecount(kdtree_t* x, kdtree_t* y, double mindist, double maxdist, dist2_function distsquared, int* counts); */ #endif astrometry.net-0.67/include/astrometry/eigen-math.h000644 000765 000024 00000001321 12651445460 022606 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ typedef struct { double* data; int cols; int rows; } ematrix_t; typedef struct { double* data; int N; } evector_t; ematrix_t* ematrix_new(int R, int C); evector_t* evector_new(int N); void ematrix_set(ematrix_t* m, int r, int c, double v); double ematrix_get(const ematrix_t* m, int r, int c); void evector_set(evector_t* m, int i, double v); double evector_get(const evector_t* m, int i); //int eigen_solve_least_squares(const ematrix_t* A, const evector_t** B, int eigen_solve_least_squares(ematrix_t* A, evector_t** B, evector_t** X, int NB); astrometry.net-0.67/include/astrometry/engine.h000644 000765 000024 00000004002 12651445460 022034 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef ENGINE_H #define ENGINE_H #include #include "astrometry/blind.h" #include "astrometry/bl.h" #include "astrometry/an-bool.h" #include "astrometry/index.h" struct engine { // search paths (directories) sl* index_paths; // contains "index_t" objects. // if "inparallel" is not set, they will be "metadata-only" until // they need to be loaded. pl* indexes; // indexes that need to be freed pl* free_indexes; // multiindexes that need to be freed pl* free_mindexes; il* ibiggest; il* ismallest; il* default_depths; double sizesmallest; double sizebiggest; anbool inparallel; double minwidth; double maxwidth; float cpulimit; char* cancelfn; char* solvedfn; }; typedef struct engine engine_t; struct job_t { dl* scales; il* depths; anbool include_default_scales; double ra_center; double dec_center; double search_radius; anbool use_radec_center; blind_t bp; }; typedef struct job_t job_t; engine_t* engine_new(); void engine_add_search_path(engine_t* engine, const char* path); char* engine_find_index(engine_t*, const char* name); // note that "path" must be a full path name. int engine_add_index(engine_t* engine, char* path); // look in all the search path directories for index files. int engine_autoindex_search_paths(engine_t* engine); int engine_parse_config_file_stream(engine_t* engine, FILE* fconf); int engine_parse_config_file(engine_t* engine, const char* fn); int engine_run_job(engine_t* engine, job_t* job); void engine_free(engine_t* engine); job_t* engine_read_job_file(engine_t* engine, const char* jobfn); int job_set_base_dir(job_t* job, const char* dir); int job_set_input_base_dir(job_t* job, const char* dir); int job_set_output_base_dir(job_t* job, const char* dir); void job_set_cancel_file(job_t* job, const char* fn); void job_set_solved_file(job_t* job, const char* fn); void job_free(job_t* job); #endif astrometry.net-0.67/include/astrometry/errors.h000644 000765 000024 00000006206 12651445460 022113 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_ERRORS_H #define AN_ERRORS_H #include #include #include #include #include "astrometry/an-bool.h" #include "astrometry/bl.h" #include "astrometry/keywords.h" // forward declaration struct errors; typedef struct errors err_t; typedef void (errfunc_t)(void* baton, err_t* errstate, const char* file, int line, const char* func, const char* format, va_list va); struct errentry { char* file; int line; char* func; char* str; }; typedef struct errentry errentry_t; struct errors { FILE* print; anbool save; bl* errstack; errfunc_t* errfunc; void* baton; }; /*** Global functions ***/ err_t* errors_get_state(); // takes a (deep) snapshot of the current error handling state and pushes it onto the // stack. void errors_push_state(); // void errors_pop_state(); void ATTRIB_FORMAT(printf,4,5) report_error(const char* modfile, int modline, const char* modfunc, const char* fmt, ...); void report_errno(); #define ERROR(fmt, ...) report_error(__FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__) #define SYSERROR(fmt, ...) do { report_errno(); report_error(__FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__); } while(0) void errors_log_to(FILE* f); /* Sends all errors to the given function for processing; turns off printing and saving (ie, err_t.print and err_t.save) */ void errors_use_function(errfunc_t* func, void* baton); void errors_print_stack(FILE* f); void errors_clear_stack(); int errors_print_on_exit(FILE* fid); // free globals. void errors_free(); /* A convenience routine for times when you want to suppress printing error messages and instead capture them to a string. Use in conjunction with the following... */ void errors_start_logging_to_string(); /* Reverts the error-processing system to its previous state and returns the captured error string. Returns a newly-allocated string which you must free(). */ char* errors_stop_logging_to_string(const char* separator); /* Convenience function to report an error from the regex module. */ void errors_regex_error(int errcode, const regex_t* re); /*** End globals ***/ err_t* error_new(); void error_free(err_t* e); void error_stack_add_entryv(err_t* e, const char* file, int line, const char* func, const char* format, va_list va); void error_stack_add_entry(err_t* e, const char* file, int line, const char* func, const char* str); errentry_t* error_stack_get_entry(const err_t* e, int i); int error_stack_N_entries(const err_t* e); int error_nerrs(const err_t* e); char* error_get_errstr(const err_t* e, int i); void error_stack_clear(err_t* e); void ATTRIB_FORMAT(printf,5,6) error_report(err_t* e, const char* module, int line, const char* func, const char* fmt, ...); void error_reportv(err_t* e, const char* module, int line, const char* func, const char* fmt, va_list va); void error_print_stack(err_t* e, FILE* f); // returns the error messages (not module:lines) in a newly-allocated string char* error_get_errs(err_t* e, const char* separator); #endif astrometry.net-0.67/include/astrometry/fileutils.h000644 000765 000024 00000001135 12651445460 022573 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FILEUTILS_H #define FILEUTILS_H /* Removes '.' and '..' references from a path. Collapses '//' to '/'. Does NOT care whether the file actually exists. Does NOT resolve symlinks. Assumes '/' is the path separator. Returns a newly-allocated string which should be freed with free(). */ char* an_canonicalize_file_name(const char* fn); char* resolve_path(const char* filename, const char* basedir); char* find_executable(const char* progname, const char* sibling); #endif astrometry.net-0.67/include/astrometry/fit-wcs.h000644 000765 000024 00000006113 12651445460 022150 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FIT_WCS_H #define FIT_WCS_H #include "astrometry/sip.h" #include "astrometry/starkd.h" int fit_sip_coefficients(const double* starxyz, const double* fieldxy, const double* weights, int M, const tan_t* tanin1, int sip_order, int inv_order, sip_t* sipout); void wcs_shift(tan_t* wcs, double xs, double ys); /** Computed SIP parameters given a set of corresponding points, and an initial TAN WCS solution. (See fit_sip_wcs_2 if you don't already have a TAN) If 'weights' is NULL, uniform weighting will be used. */ int fit_sip_wcs(const double* starxyz, const double* fieldxy, const double* weights, int M, const tan_t* tanin, int sip_order, int inv_order, int doshift, sip_t* sipout ); int fit_sip_wcs_2(const double* starxyz, const double* fieldxy, const double* weights, int M, int sip_order, int inv_order, int W, int H, int crpix_center, double* crpix, int doshift, sip_t* sipout ); /** Move the tangent point to the given CRPIX, keeping the corresponding stars in "starxyz" and "fieldxy" aligned. It's assumed that "tanin" contains a reasonably close WCS solution (eg, from fit_wcs). The output is put in "tanout". You might want to iterate this process, though in my tests the adjustments in the second iteration are very minor. */ int fit_tan_wcs_move_tangent_point(const double* starxyz, const double* fieldxy, int N, const double* crpix, const tan_t* tanin, tan_t* tanout); int fit_tan_wcs_move_tangent_point_weighted(const double* starxyz, const double* fieldxy, const double* weights, int N, const double* crpix, const tan_t* tanin, tan_t* tanout); /* Computes a rigid (conformal) TAN WCS projection, based on the correspondence between stars and field objects. . starxyz is an array of star positions on the unit sphere. . fieldxy is an array of pixel coordinates. . nobjs is the number of correspondences; the star at . (starxyz + i*3) corresponds with the field object at (fieldxy + i*2). If "p_scale" is specified, the scale of the field will be placed in it. It is in units of degrees per pixel. */ int fit_tan_wcs(const double* starxyz, const double* fieldxy, int nobjs, // output: tan_t* wcstan, double* p_scale); int fit_tan_wcs_weighted(const double* starxyz, const double* fieldxy, const double* weights, int N, // output: tan_t* tan, double* p_scale); #endif astrometry.net-0.67/include/astrometry/fits-guess-scale.h000644 000765 000024 00000001450 12651445460 023751 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FITS_GUESS_SCALE_H #define FITS_GUESS_SCALE_H #include "astrometry/qfits_header.h" #include "astrometry/bl.h" int fits_guess_scale(const char* infn, sl** p_methods, dl** p_scales); /* If p_methods is not NULL but *p_methods is NULL, allocates a new sl; otherwise uses *p_methods. Ditto for p_scales. So do: sl* methods = NULL; fits_guess_scale_hdr(hdr, &methods, NULL); // ... process it... sl_free2(methods); OR sl* methods = sl_new(4); fits_guess_scale_hdr(hdr, &methods, NULL); // ... process it... sl_free2(methods); */ void fits_guess_scale_hdr(const qfits_header* hdr, sl** p_methods, dl** p_scales); #endif astrometry.net-0.67/include/astrometry/fitsbin.h000644 000765 000024 00000013455 12651445460 022241 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FITSBIN_H #define FITSBIN_H #include #include "astrometry/anqfits.h" #include "astrometry/bl.h" #include "astrometry/an-bool.h" /** "fitsbin" is our abuse of FITS binary tables to hold raw binary data, *without endian flips*, by storing the data as characters/bytes. This has the advantage that they can be directly mmap()'d, but of course means that they aren't endian-independent. We accept that tradeoff in the interest of speed and the recognition that x86 is pretty much all we care about. Typical usage patterns: -Reading: fitsbin_open(); fitsbin_add_chunk(); fitsbin_add_chunk(); ... fitsbin_read(); ... fitsbin_close(); OR: fb = fitsbin_open(); fitsbin_chunk_init(&chunk); chunk.tablename = "hello"; fitsbin_read_chunk(fb, &chunk); // chunk.data; //NO fitsbin_add_chunk(fb, &chunk); fitsbin_close(); -Writing: fitsbin_open_for_writing(); fitsbin_add_chunk(); fitsbin_add_chunk(); ... fitsbin_write_primary_header(); ... fitsbin_write_chunk_header(); fitsbin_write_items(); ... fitsbin_fix_chunk_header(); fitsbin_write_chunk_header(); fitsbin_write_items(); ... fitsbin_fix_chunk_header(); ... fitsbin_fix_primary_header(); fitsbin_close(); OR: fb = fitsbin_open_for_writing(); fitsbin_write_primary_header(); fitsbin_chunk_init(&chunk); chunk.tablename = "whatever"; chunk.data = ...; chunk.itemsize = 4; chunk.nrows = 1000; fitsbin_write_chunk(fb, &chunk); fitsbin_chunk_clean(&chunk); fitsbin_fix_primary_header(); fitsbin_close(fb); */ struct fitsbin_t; struct fitsbin_chunk_t { char* tablename; // internal use: pointer to strdup'd name. char* tablename_copy; // The data (NULL if the table was not found) void* data; // The size of a single row in bytes. int itemsize; // The number of items (rows) int nrows; // abort if this table isn't found? int required; // Reading: int (*callback_read_header)(struct fitsbin_t* fb, struct fitsbin_chunk_t* chunk); void* userdata; qfits_header* header; // Writing: off_t header_start; off_t header_end; // on output, force a type other than A? tfits_type forced_type; // Internal use: // The mmap'ed address char* map; // The mmap'ed size. size_t mapsize; }; typedef struct fitsbin_chunk_t fitsbin_chunk_t; struct fitsbin_t { char* filename; anqfits_t* fits; bl* chunks; // Writing: FILE* fid; // only used for in_memory(): anbool inmemory; bl* items; bl* extensions; // The primary FITS header qfits_header* primheader; off_t primheader_end; // for use when reading (not in_memory()): cache the tables in this FITS file. // ideally this would be pushed down to the qfits layer... qfits_table** tables; // number of extensions, include the primary; extensions < Next are valid. int Next; // for use by callback_read_header(). void* userdata; }; typedef struct fitsbin_t fitsbin_t; // Initializes a chunk to default values void fitsbin_chunk_init(fitsbin_chunk_t* chunk); // Frees contents of this chunk. void fitsbin_chunk_clean(fitsbin_chunk_t* chunk); // clean + init void fitsbin_chunk_reset(fitsbin_chunk_t* chunk); char* fitsbin_get_filename(const fitsbin_t* fb); // Reading: returns a new copy of the given FITS extension header. // (-> *qfits_get_header) qfits_header* fitsbin_get_header(const fitsbin_t* fb, int ext); // Reading: how many extensions in this file? (-> *qfits_query_n_ext) int fitsbin_n_ext(const fitsbin_t* fb); fitsbin_t* fitsbin_open(const char* fn); fitsbin_t* fitsbin_open_fits(anqfits_t* fits); fitsbin_t* fitsbin_open_for_writing(const char* fn); fitsbin_t* fitsbin_open_in_memory(void); int fitsbin_close_fd(fitsbin_t* fb); int fitsbin_switch_to_reading(fitsbin_t* fb); int fitsbin_read(fitsbin_t* fb); fitsbin_chunk_t* fitsbin_get_chunk(fitsbin_t* fb, int chunk); off_t fitsbin_get_data_start(fitsbin_t* fb, fitsbin_chunk_t* chunk); int fitsbin_n_chunks(fitsbin_t* fb); /** Appends the given chunk -- makes a copy of the contents of "chunk" and returns a pointer to the stored location. */ fitsbin_chunk_t* fitsbin_add_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk); /** Immediately tries to read a chunk. If the chunk is not found, -1 is returned and the chunk is not added to this fitsbin's list. If it's found, 0 is returned, a copy of the chunk is stored, and the results are placed in "chunk". */ int fitsbin_read_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk); FILE* fitsbin_get_fid(fitsbin_t* fb); int fitsbin_close(fitsbin_t* fb); qfits_header* fitsbin_get_primary_header(const fitsbin_t* fb); void fitsbin_set_primary_header(fitsbin_t* fb, const qfits_header* hdr); // (pads to FITS block size) int fitsbin_write_primary_header(fitsbin_t* fb); // (pads to FITS block size) int fitsbin_fix_primary_header(fitsbin_t* fb); qfits_header* fitsbin_get_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk); int fitsbin_write_chunk(fitsbin_t* fb, fitsbin_chunk_t* chunk); int fitsbin_write_chunk_flipped(fitsbin_t* fb, fitsbin_chunk_t* chunk, int wordsize); // (pads to FITS block size) int fitsbin_write_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk); // (pads to FITS block size) int fitsbin_fix_chunk_header(fitsbin_t* fb, fitsbin_chunk_t* chunk); int fitsbin_write_item(fitsbin_t* fb, fitsbin_chunk_t* chunk, void* data); int fitsbin_write_items(fitsbin_t* fb, fitsbin_chunk_t* chunk, void* data, int N); // direct FILE* output: int fitsbin_write_primary_header_to(fitsbin_t* fb, FILE* fid); int fitsbin_write_chunk_header_to(fitsbin_t* fb, fitsbin_chunk_t* chunk, FILE* fid); int fitsbin_write_items_to(fitsbin_chunk_t* chunk, void* data, int N, FILE* fid); int fitsbin_write_chunk_to(fitsbin_t* fb, fitsbin_chunk_t* chunk, FILE* fid); #endif astrometry.net-0.67/include/astrometry/fitsfile.h000644 000765 000024 00000001646 12651445460 022407 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FITSFILE_H #define FITSFILE_H #include #include "astrometry/qfits_header.h" int fitsfile_pad_with(FILE* fid, char pad); int fitsfile_write_primary_header(FILE* fid, qfits_header* hdr, off_t* end_offset, const char* fn); int fitsfile_fix_primary_header(FILE* fid, qfits_header* hdr, off_t* end_offset, const char* fn); // set ext = -1 if unknown. int fitsfile_write_header(FILE* fid, qfits_header* hdr, off_t* start_offset, off_t* end_offset, int ext, const char* fn); // set ext = -1 if unknown. int fitsfile_fix_header(FILE* fid, qfits_header* hdr, off_t* start_offset, off_t* end_offset, int ext, const char* fn); #endif astrometry.net-0.67/include/astrometry/fitsioutils.h000644 000765 000024 00000014743 12651445460 023162 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FITSIO_UTILS_H #define FITSIO_UTILS_H #include #include "astrometry/qfits_header.h" #include "astrometry/qfits_image.h" #include "astrometry/qfits_table.h" #include "astrometry/keywords.h" #include "astrometry/an-bool.h" void fits_use_error_system(void); Malloc char* fits_to_string(const qfits_header* hdr, int* size); int fits_write_float_image(const float* img, int nx, int ny, const char* fn); int fits_write_u8_image(const uint8_t* img, int nx, int ny, const char* fn); int fits_write_i16_image(const int16_t* img, int nx, int ny, const char* fn); /** Creates a FITS header for the image described in "qd". */ qfits_header* fits_get_header_for_image(const qfitsdumper* qd, int W, qfits_header* addtoheader); qfits_header* fits_get_header_for_image2(int W, int H, int bitpix, qfits_header* addtoheader); qfits_header* fits_get_header_for_image3(int W, int H, int bitpix, int planes, qfits_header* addtoheader); /* Writes the FITS header to the given filename, then pads and closes the file. */ int fits_write_header(const qfits_header* hdr, const char* filename); /** Writes the given FITS header and image. If "hdr" is null, a standard image header will be written; "W" must be the image width. Of "hdr" is non-null, "W" is ignored. */ int fits_write_header_and_image(const qfits_header* hdr, const qfitsdumper* qd, int W); double fits_get_double_val(const qfits_table* table, int column, const void* rowdata); /* Returns 1 if the given keyword is one of the required keywords in a BINTABLE specification. */ int fits_is_table_header(const char* keyword); /* Returns 1 if the given keyword is one of the required keywords in the primary header. */ int fits_is_primary_header(const char* key); /* Copies headers that aren't part of the BINTABLE specification from "src" to "dest". */ void fits_copy_non_table_headers(qfits_header* dest, const qfits_header* src); /* Retrieves the value of the header card "key" as a string, returning a newly-allocated string which should be free()'d. It will be "prettied" via qfits_pretty_string_r. */ char* fits_get_dupstring(const qfits_header* hdr, const char* key); char* fits_get_long_string(const qfits_header* hdr, const char* key); void ATTRIB_FORMAT(printf,4,5) fits_header_addf(qfits_header* hdr, const char* key, const char* comment, const char* format, ...); void ATTRIB_FORMAT(printf,4,5) fits_header_addf_longstring(qfits_header* hdr, const char* key, const char* comment, const char* format, ...); void fits_header_add_longstring_boilerplate(qfits_header* hdr); void ATTRIB_FORMAT(printf,4,5) fits_header_modf(qfits_header* hdr, const char* key, const char* comment, const char* format, ...); void fits_header_add_int(qfits_header* hdr, const char* key, int val, const char* comment); void fits_header_add_double(qfits_header* hdr, const char* key, double val, const char* comment); // Add if it doesn't exist, mod if it does. void fits_header_set_double(qfits_header* hdr, const char* key, double val, const char* comment); void fits_header_set_int(qfits_header* hdr, const char* key, int val, const char* comment); void fits_header_mod_int(qfits_header* hdr, const char* key, int val, const char* comment); void fits_header_mod_double(qfits_header* hdr, const char* key, double val, const char* comment); int fits_update_value(qfits_header* hdr, const char* key, const char* newvalue); qfits_table* fits_copy_table(qfits_table* tbl); int an_fits_copy_header(const qfits_header* src, qfits_header* dest, char* key); int fits_copy_all_headers(const qfits_header* src, qfits_header* dest, char* targetkey); int fits_append_all_headers(const qfits_header* src, qfits_header* dest, char* targetkey); int fits_add_args(qfits_header* src, char** args, int argc); int ATTRIB_FORMAT(printf,2,3) fits_add_long_comment(qfits_header* dst, const char* format, ...); int ATTRIB_FORMAT(printf,2,3) fits_append_long_comment(qfits_header* dst, const char* format, ...); int ATTRIB_FORMAT(printf,2,3) fits_add_long_history(qfits_header* dst, const char* format, ...); // how many FITS blocks are required to hold 'size' bytes? int fits_blocks_needed(int size); size_t fits_bytes_needed(size_t size); int fits_pad_file_with(FILE* fid, char pad); int fits_pad_file(FILE* fid); int fits_pad_file_name(char* filename); void fits_fill_endian_string(char* str); char* fits_get_endian_string(void); int fits_check_endian(const qfits_header* header); int fits_check_uint_size(const qfits_header* header); int fits_check_double_size(const qfits_header* header); void fits_add_endian(qfits_header* header); void fits_add_reverse_endian(qfits_header* header); void fits_mod_reverse_endian(qfits_header* header); void fits_add_uint_size(qfits_header* header); void fits_add_double_size(qfits_header* header); int fits_find_column(const qfits_table* table, const char* colname); int fits_find_table_column(const char* fn, const char* colname, off_t* start, off_t* size, int* extension); qfits_table* fits_get_table_column(const char* fn, const char* colname, int* pcol); int fits_add_column(qfits_table* table, int column, tfits_type type, int ncopies, const char* units, const char* label); int fits_offset_of_column(qfits_table* table, int colnum); // write single column fields: int fits_write_data_A(FILE* fid, char value); int fits_write_data_B(FILE* fid, uint8_t value); int fits_write_data_D(FILE* fid, double value, anbool flip); int fits_write_data_E(FILE* fid, float value, anbool flip); int fits_write_data_I(FILE* fid, int16_t value, anbool flip); int fits_write_data_J(FILE* fid, int32_t value, anbool flip); int fits_write_data_K(FILE* fid, int64_t value, anbool flip); int fits_write_data_L(FILE* fid, char value); int fits_write_data_X(FILE* fid, unsigned char value); int fits_write_data(FILE* fid, void* pvalue, tfits_type type, anbool flip); // Writes one cell of a FITS table (which may be an array or scalar) // that has already been converted to FITS format "type". // If "vvalue" is NULL, just skips past that number of bytes. int fits_write_data_array(FILE* fid, const void* vvalue, tfits_type type, int N, anbool flip); #endif astrometry.net-0.67/include/astrometry/fitstable.h000644 000765 000024 00000036323 12651445460 022557 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef FITSTABLE_H #define FITSTABLE_H #include #include #include "astrometry/qfits_table.h" #include "astrometry/an-bool.h" #include "astrometry/bl.h" #include "astrometry/ioutils.h" #include "astrometry/anqfits.h" /** For quick-n-easy(-ish) access to a column of data in a FITS BINTABLE. Some example usage scenarios: // Writing: char* filename = "/tmp/xxx"; fitstable_t* tab = fitstable_open_for_writing(filename); // Add column "X", a scalar double (FITS type D) fitstable_add_write_column(tab, fitscolumn_double_type(), "X", "xunits"); // Add column "Y", a 2-D float (FITS type E), but the data to be // written is in C doubles. fitstable_add_write_column_array_convert(tab, fitscolumn_float_type(), fitscolumn_double_type(), 2, "Y", "yunits"); // Add some stuff to the primary header... qfits_header* hdr = fitstable_get_primary_header(tab); fits_header_add_int(hdr, "KEYVAL", 42, "Comment"); // Add some stuff to the extension header... hdr = fitstable_get_header(tab); fits_header_add_int(hdr, "KEYVAL2", 43, "Comment"); // Write... if (fitstable_write_primary_header(tab) || fitstable_write_header(tab)) { // error... } // Write data... double x[] = { 1,2,3 }; double y[] = { 3,4, 5,6, 7,8 }; int i, N = 3; for (i=0; i #include void gslutils_use_error_system(); /** Solves a least-squares matrix equation A X_i = B_i For NB pairs of X_i, B_i. NOTE: THIS DESTROYS A! A: MxN matrix B: array of NB x length-M vectors X: must be an array big enough to hold NB vectors. (they will be length-N). resids: if non-NULL, must be an array big enough to hold NB vectors (they will be length-M). The result vectors are freshly allocated and should be freed with gsl_vector_free(). */ int gslutils_solve_leastsquares(gsl_matrix* A, gsl_vector** B, gsl_vector** X, gsl_vector** resids, int NB); /** Same as above, but using varargs. There must be exactly 3 * NB additional arguments, in the order: B0, &X0, &resid0, B1, &X1, &resid1, ... ie, the types must be repeating triples of: gsl_vector* b, gsl_vector** x, gsl_vector** resid */ int gslutils_solve_leastsquares_v(gsl_matrix* A, int NB, ...); // C = A B void gslutils_matrix_multiply(gsl_matrix* C, const gsl_matrix* A, const gsl_matrix* B); int gslutils_invert_3x3(const double* A, double* B); #endif astrometry.net-0.67/include/astrometry/hd.h000644 000765 000024 00000002123 12651445460 021164 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_HD_H #define AN_HD_H #include "astrometry/kdtree.h" #include "astrometry/bl.h" /** This code allows easy access to the Henry Draper catalog stored in kd-tree format. Get the required hd.fits file either by the easy way: wget http://trac.astrometry.net/export/13120/binary/henry-draper/hd.fits Or the hard way (which involves downloading > 500 MB of Tycho-2 catalog from Denmark!): make hd.fits (in the astrometry.net catalog/ directory) **/ struct hd_entry { // J2000.0 degrees double ra; double dec; int hd; }; typedef struct hd_entry hd_entry_t; struct hd_catalog { char* fn; kdtree_t* kd; }; typedef struct hd_catalog hd_catalog_t; hd_catalog_t* henry_draper_open(const char* fn); // N stars int henry_draper_n(const hd_catalog_t* hd); void henry_draper_close(hd_catalog_t* hd); bl* henry_draper_get(hd_catalog_t* hd, double racenter, double deccenter, double radius_in_arcsec); #endif astrometry.net-0.67/include/astrometry/healpix-utils.h000644 000765 000024 00000002746 12651445460 023374 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef HEALPIX_UTILS_H #define HEALPIX_UTILS_H #include "astrometry/bl.h" /** Returns healpixes that are / may be within range of the given point, resp. */ il* healpix_rangesearch_xyz(const double* xyz, double radius, int Nside, il* hps); il* healpix_rangesearch_xyz_approx(const double* xyz, double radius, int Nside, il* hps); il* healpix_rangesearch_radec_approx(double ra, double dec, double radius, int Nside, il* hps); il* healpix_rangesearch_radec(double ra, double dec, double radius, int Nside, il* hps); /** Starting from a "seed" or list of "seeds" healpixes, grows a region by looking at healpix neighbours. Accepts healpixes for which the "accept" function returns 1. Returns the healpixes that are accepted. The accepted results are placed in "accepted", if non-NULL, or in a newly-allocated list. If "rejected" is non-NULL, the healpixes that are rejected will be put there. If "depth" is non-zero, that number of neighbour steps will be taken. Zero means no limit. NOTE that any existing entries in the "accepted" list will be treated as having already been accepted: when the search reaches them, their neighbours will not be added to the frontier to explore. */ il* healpix_region_search(int seed, il* seeds, int Nside, il* accepted, il* rejected, int (*accept)(int hp, void* token), void* token, int depth); #endif astrometry.net-0.67/include/astrometry/healpix.h000644 000765 000024 00000030236 12651445460 022231 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef HEALPIX_H #define HEALPIX_H #include #include #include "astrometry/keywords.h" //#undef Const //#define Const /** The HEALPix paper is here: http://iopscience.iop.org/0004-637X/622/2/759/pdf/0004-637X_622_2_759.pdf See: http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2005ApJ...622..759G&db_key=AST&high=41069202cf02947 */ /** In this documentation we talk about "base healpixes": these are the big, top-level healpixes. There are 12 of these, with indices [0, 11]. We say "fine healpixes" or "healpixes" or "pixels" when we mean the fine- scale healpixes; there are Nside^2 of these in each base healpix, for a total of 12*Nside^2, indexed from zero. */ /** Some notes about the different indexing schemes: The healpix paper discusses two different ways to number healpixes, and there is a third way, which we prefer, which is (in my opinion) more sensible and easy. -RING indexing. Healpixes are numbered first in order of decreasing DEC, then in order of increasing RA of the center of the pixel, ie: . 0 1 2 3 . 4 5 6 7 8 9 10 11 . 12 13 14 15 16 17 18 19 . 20 21 22 23 24 25 26 27 . 28 29 30 31 32 33 34 35 . 36 37 38 39 40 41 42 43 . 44 45 46 47 Note that 12, 20 and 28 are part of base healpix 4, as is 27; it "wraps around". The RING index can be decomposed into the "ring number" and the index within the ring (called "longitude index"). Note that different rings contain different numbers of healpixes. Also note that the ring number starts from 1, but the longitude index starts from zero. -NESTED indexing. This only works for Nside parameters that are powers of two. This scheme is hierarchical in the sense that each pair of bits of the index tells you where the pixel center is to finer and finer resolution. It doesn't really show with Nside=2, but here it is anyway: . 3 7 11 15 . 2 1 6 5 10 9 14 13 . 19 0 23 4 27 8 31 12 . 17 22 21 26 25 30 29 18 . 16 35 20 39 24 43 28 47 . 34 33 38 37 42 41 46 45 . 32 36 40 44 Note that all the base healpixes have the same pattern; they're just offset by factors of Nside^2. Here's a zoom-in of the first base healpix, turned 45 degrees to the right, for Nside=4: . 10 11 14 15 . 8 9 12 13 . 2 3 6 7 . 0 1 4 5 Note that the bottom-left block of 4 have the smallest values, and within that the bottom-left corner has the smallest value, followed by the bottom-right, top-left, then top-right. The NESTED index can't be decomposed into 'orthogonal' directions. -XY indexing. This is arguably the most natural, at least for the internal usage of the healpix code. Within each base healpix, the healpixes are numbered starting with 0 for the southmost pixel, then increasing first in the "y" (north-west), then in the "x" (north-east) direction. In other words, within each base healpix there is a grid and we number the pixels "lexicographically" (mod a 135 degree turn). . 3 7 11 15 . 1 2 5 6 9 10 13 14 . 19 0 23 4 27 8 31 12 . 18 21 22 25 26 29 30 17 . 16 35 20 39 24 43 28 47 . 33 34 37 38 41 42 45 46 . 32 36 40 44 Zooming in on the first base healpix, turning 45 degrees to the right, for Nside=4 we get: . 3 7 11 15 . 2 6 10 14 . 1 5 9 13 . 0 4 8 12 Notice that the numbers first increase from bottom to top (y), then left to right (x). The XY indexing can be decomposed into 'x' and 'y' coordinates (in case that wasn't obvious), where the above figure becomes (x,y): . (0,3) (1,3) (2,3) (3,3) . (0,2) (1,2) (2,2) (3,2) . (0,1) (1,1) (2,1) (3,1) . (0,0) (1,0) (2,0) (3,0) Note that "x" increases in the north-east direction, and "y" increases in the north-west direction. The major advantage to this indexing scheme is that it extends to fractional coordinates in a natural way: it is meaningful to talk about the position (x,y) = (0.25, 0.6) and you can compute its position. In this code, all healpix indexing uses the XY scheme. If you want to use the other schemes you will have to use the conversion routines: . healpix_xy_to_ring . healpix_ring_to_xy . healpix_xy_to_nested . healpix_nested_to_xy */ // The maximum healpix Nside that leads to int-sized healpix indices. // 12 * (13377+1)^2 > 2^31 (since we use signed ints) // This corresponds to about 16 arcsec side length. #define HP_MAX_INT_NSIDE 13377 /** Converts a healpix index from the XY scheme to the RING scheme. */ Const int healpix_xy_to_ring(int hp, int Nside); /** Converts a healpix index from the RING scheme to the XY scheme. */ Const int healpix_ring_to_xy(int ring_index, int Nside); /** Converts a healpix index from the XY scheme to the NESTED scheme. */ Const int healpix_xy_to_nested(int hp, int Nside); /** Converts a healpix index from the NESTED scheme to the XY scheme. */ Const int healpix_nested_to_xy(int nested_index, int Nside); /** Decomposes a RING index into the "ring number" (each ring contain healpixels of equal latitude) and "longitude index". Pixels within a ring have longitude index starting at zero for the first pixel with RA >= 0. Different rings contain different numbers of healpixels. */ void healpix_decompose_ring(int ring_index, int Nside, int* p_ring_number, int* p_longitude_index); /** Composes a RING index given the "ring number" and "longitude index". Does NOT check that the values are legal! Garbage in, garbage out. */ Const int healpix_compose_ring(int ring, int longind, int Nside); /** Decomposes an XY index into the "base healpix" and "x" and "y" coordinates within that healpix. */ void healpix_decompose_xy(int finehp, int* bighp, int* x, int* y, int Nside); void healpix_decompose_xyl(int64_t finehp, int* bighp, int* x, int* y, int Nside); /** Composes an XY index given the "base healpix" and "x" and "y" coordinates within that healpix. */ Const int healpix_compose_xy(int bighp, int x, int y, int Nside); Const int64_t healpix_compose_xyl(int bighp, int x, int y, int Nside); /** Given (x,y) coordinates of resolution "nside" within a base-level healpixel, and an output resolution "outnside", returns the output (x,y) coordinates at the output resolution. */ void healpix_convert_xy_nside(int x, int y, int nside, int outnside, int* outx, int* outy); /** Given a healpix index (in the XY scheme) of resolution "nside", and an output resolution "outnside", returns the healpix index at the output resolution. */ void healpix_convert_nside(int hp, int nside, int outnside, int* outhp); /** Converts (RA, DEC) coordinates (in radians) to healpix index. */ Const int radectohealpix(double ra, double dec, int Nside); int radectohealpixf(double ra, double dec, int Nside, double* dx, double* dy); Const int64_t radectohealpixl(double ra, double dec, int Nside); int64_t radectohealpixlf(double ra, double dec, int Nside, double* dx, double* dy); /** Converts (RA, DEC) coordinates (in degrees) to healpix index. */ Const int radecdegtohealpix(double ra, double dec, int Nside); int radecdegtohealpixf(double ra, double dec, int Nside, double* dx, double* dy); Const int64_t radecdegtohealpixl(double ra, double dec, int Nside); int64_t radecdegtohealpixlf(double ra, double dec, int Nside, double* dx, double* dy); /** Converts (x,y,z) coordinates on the unit sphere into a healpix index. */ Const int xyztohealpix(double x, double y, double z, int Nside); Const int64_t xyztohealpixl(double x, double y, double z, int Nside); int xyztohealpixf(double x, double y, double z, int Nside, double* p_dx, double* p_dy); int64_t xyztohealpixlf(double x, double y, double z, int Nside, double* p_dx, double* p_dy); /** Converts (x,y,z) coordinates (stored in an array) on the unit sphere into a healpix index. */ int xyzarrtohealpix(const double* xyz, int Nside); int64_t xyzarrtohealpixl(const double* xyz, int Nside); int xyzarrtohealpixf(const double* xyz,int Nside, double* p_dx, double* p_dy); /** Converts a healpix index, plus fractional offsets (dx,dy), into (x,y,z) coordinates on the unit sphere. (dx,dy) must be in [0, 1]. (0.5, 0.5) is the center of the healpix. (0,0) is the southernmost corner, (1,1) is the northernmost corner, (1,0) is the easternmost, and (0,1) the westernmost. */ void healpix_to_xyz(int hp, int Nside, double dx, double dy, double* p_x, double *p_y, double *p_z); /** Same as healpix_to_xyz, but (x,y,z) are stored in an array. */ void healpix_to_xyzarr(int hp, int Nside, double dx, double dy, double* xyz); /** Same as healpix_to_xyz, but returns (RA,DEC) in radians. */ void healpix_to_radec(int hp, int Nside, double dx, double dy, double* ra, double* dec); void healpix_to_radecdeg(int hp, int Nside, double dx, double dy, double* ra, double* dec); void healpixl_to_radecdeg(int64_t hp, int Nside, double dx, double dy, double* ra, double* dec); /** Same as healpix_to_radec, but (RA,DEC) are stored in an array. */ void healpix_to_radecarr(int hp, int Nside, double dx, double dy, double* radec); void healpix_to_radecdegarr(int hp, int Nside, double dx, double dy, double* radec); /** Computes the approximate side length of a healpix, in arcminutes. */ Const double healpix_side_length_arcmin(int Nside); /** Computes the approximate Nside you need to get healpixes with side length about "arcmin" arcminutes. (inverse of healpix_side_length_arcmin) */ double healpix_nside_for_side_length_arcmin(double arcmin); /** Finds the healpixes neighbouring the given healpix, placing them in the array "neighbour". Returns the number of neighbours. You must ensure that "neighbour" has 8 elements. Healpixes in the interior of a large healpix will have eight neighbours; pixels near the edges can have fewer. */ int healpix_get_neighbours(int hp, int* neighbours, int Nside); /** Same as above, but for Nsides big enough that it overflows 32-bit int. */ int healpix_get_neighboursl(int64_t pix, int64_t* neighbour, int Nside); /** Finds the healpixes containing and neighbouring the given xyz position which are within distance 'range' (in units of distance of the unit sphere). Places the results in 'healpixes', which must have at least 9 elements. Returns the number of 'healpixes' set. Returns -1 if "Nside" < 0. */ int healpix_get_neighbours_within_range(double* xyz, double range, int* healpixes, int Nside); /** Same as above, but RA,Dec,radius in degrees. */ int healpix_get_neighbours_within_range_radec(double ra, double dec, double radius, int* healpixes, int Nside); /** Returns the minimum distance (in degrees) between the given healpix and the given RA,Dec (in degrees). */ double healpix_distance_to_radec(int hp, int Nside, double ra, double dec, double* closestradec); /** Returns the minimum distance (in degrees) between the given healpix and the given xyz (point on unit sphere). */ double healpix_distance_to_xyz(int hp, int Nside, const double* xyz, double* closestxyz); /** Returns true if the closest distance between the given healpix and the given RA,Dec (in degrees) is less than then given radius (in degrees). */ int healpix_within_range_of_radec(int hp, int Nside, double ra, double dec, double radius); int healpix_within_range_of_xyz(int hp, int Nside, const double* xyz, double radius); /** Computes the RA,Dec bounding-box of the given healpix. Results are in degrees. RA may be wacky for healpixes spanning RA=0. */ void healpix_radec_bounds(int hp, int nside, double* ralo, double* rahi, double* declo, double* dechi); #endif astrometry.net-0.67/include/astrometry/hpquads.h000644 000765 000024 00000002052 12651445460 022237 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef HPQUADS_H #define HPQUADS_H #include "astrometry/an-bool.h" #include "astrometry/starkd.h" #include "astrometry/codefile.h" #include "astrometry/quadfile.h" int hpquads(startree_t* starkd, codefile_t* codes, quadfile_t* quads, int Nside, double scale_min_arcmin, double scale_max_arcmin, int dimquads, int passes, int Nreuses, int Nloosen, int id, anbool scanoccupied, void* sort_data, int (*sort_func)(const void*, const void*), int sort_size, char** args, int argc); int hpquads_files(const char* skdtfn, const char* codefn, const char* quadfn, int Nside, double scale_min_arcmin, double scale_max_arcmin, int dimquads, int passes, int Nreuses, int Nloosen, int id, anbool scanoccupied, void* sort_data, int (*sort_func)(const void*, const void*), int sort_size, char** args, int argc); #endif astrometry.net-0.67/include/astrometry/image2xy-files.h000644 000765 000024 00000001622 12651445460 023421 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef IMAGE2XY_FILES_H #define IMAGE2XY_FILES_H #include #include "astrometry/an-bool.h" #include "astrometry/simplexy.h" /** Reads an input FITS image (possibly multi-HDU), runs simplexy on each image and places the results in an output file containing a FITS BINTABLE. If you want to look at just a single HDU, set "extension". Note that it follows the QFITS convention that the primary extension is 0, the first extension is 1, etc. This is different than the CFITSIO convention which is 1-based: 1 is the primary extension, 2 is the first extension, etc. */ int image2xy_files(const char* infn, const char* outfn, anbool do_u8, int downsample, int downsample_as_required, int extension, int plane, simplexy_t* params); #endif astrometry.net-0.67/include/astrometry/image2xy.h000644 000765 000024 00000000454 12651445460 022323 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef IMAGE2XY_H #define IMAGE2XY_H #include #include "astrometry/simplexy.h" int image2xy_run(simplexy_t* s, int downsample, int downsample_as_required); #endif astrometry.net-0.67/include/astrometry/index.h000644 000765 000024 00000011022 12651445460 021676 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_INDEX_H #define AN_INDEX_H #include "astrometry/quadfile.h" #include "astrometry/starkd.h" #include "astrometry/codekd.h" #include "astrometry/an-bool.h" #include "astrometry/anqfits.h" /* * These routines handle loading of index files, which can consist of * several files (.skdt.fits , .ckdt.fits, .quad.fits), or a single * large file (.fits). */ #define DEFAULT_INDEX_JITTER 1.0 // arcsec /** Info about an index, including part of the sky it covers, size of quads, etc.; plus the code kdtree, quad list, and star kdtree. Some of the functions below only read the metadata, leaving the "codekd", "quads", and "starkd" fields NULL. */ typedef struct { // The actual components of an index. codetree_t* codekd; quadfile_t* quads; startree_t* starkd; // FITS file access anqfits_t* fits; // filenames char* codefn; char* quadfn; char* starfn; // Below here: metadata about the index. char* indexname; // Unique id for this index. int indexid; int healpix; int hpnside; // Jitter in the index, in arcseconds. double index_jitter; // cut-an parameters: int cutnside; int cutnsweep; double cutdedup; char* cutband; int cutmargin; // Does the index have the CIRCLE header - (codes live in the circle, not the box)? anbool circle; // Does the index have the CX <= DX property anbool cx_less_than_dx; // Does the index have the CX + DX <= 1/2 property anbool meanx_less_than_half; // Limits of the size of quads in the index, in arcseconds. double index_scale_upper; double index_scale_lower; int dimquads; int nstars; int nquads; } index_t; /** Simple accessor (indx->dimquads): returns the dimensionality of quads in this index. */ int index_dimquads(index_t* indx); /** Returns TRUE if the given index contains quads of sizes that overlap the given range of quad sizes, [quadlo, quadhi], in arcseconds. */ anbool index_overlaps_scale_range(index_t* indx, double quadlo, double quadhi); /** Returns TRUE if the given index covers a part of the sky that is within "radius_deg" degrees of the given "ra","dec" position (in degrees). */ anbool index_is_within_range(index_t* indx, double ra, double dec, double radius_deg); /** Reads index metadata from the given 'filename' into the given 'indx' struct. This is done by basically loading the index, grabbing the metadata, and closing the index; therefore it checks for structural consistency of the index file as well as getting the metadata; this also means it's slower than it could be... */ int index_get_meta(const char* filename, index_t* indx); anbool index_is_file_index(const char* filename); char* index_get_quad_filename(const char* indexname); char* index_get_qidx_filename(const char* indexname); #define INDEX_ONLY_LOAD_METADATA 2 int index_get_quad_dim(const index_t* index); int index_get_code_dim(const index_t* index); int index_nquads(const index_t* index); int index_nstars(const index_t* index); index_t* index_build_from(codetree_t* codekd, quadfile_t* quads, startree_t* starkd); /** * Load an index from disk * * Parameters: * * indexname - the base name of the index files; for example, if the * index is in files 'myindex.ckdt.fits' and * 'myindex.skdt.fits', then the indexname is just * 'myindex' * * flags - If INDEX_ONLY_LOAD_METADATA, then only metadata will be * loaded. * * dest - If NULL, a new index_t will be allocated and returned; * otherwise, the results will be put in this index_t * object. * * Returns: * * A pointer to an index_t structure or NULL on error. * */ index_t* index_load(const char* indexname, int flags, index_t* dest); /** Close the quad, skdt, and ckdt files; makes it as though you did INDEX_ONLY_LOAD_METADATA. You can re-load the files with index_reload(). */ void index_unload(index_t* index); int index_reload(index_t* index); /** Closes the FILE*s in this index. Once you have index_reload()ed, you can call this function and the index will remain valid. */ int index_close_fds(index_t* index); /** Close an index and free associated data structures, *without freeing 'index' itself*. */ void index_close(index_t* index); /** Closes the given index and calls free(index). */ void index_free(index_t* index); int index_get_missing_cut_params(int indexid, int* hpnside, int* nsweep, double* dedup, int* margin, char** band); #endif astrometry.net-0.67/include/astrometry/intmap.h000644 000765 000024 00000002752 12651445460 022071 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef INTMAP_H #define INTMAP_H #include "astrometry/an-bool.h" #include "astrometry/bl.h" /** Maps integers to lists of objects. */ // FIXME -- would this work better with "bt" for the keys? struct intmap { // dense only: bl** dense; int ND; // sparse only: il* keys; // list of bl* pl* lists; // common: // list blocksize int blocksize; // data size int datasize; }; typedef struct intmap intmap_t; /** Creates a new intmap that will contain data objects (ie, list elements) of size "datasize". The lists will have blocks of size "subblocksize". Intmap uses blocklists internally, and their block sizes are set by "blocksize". "Ndense": if non-zero, the number of items that will be contained. If zero, a sparse map is assumed. */ intmap_t* intmap_new(int datasize, int subblocksize, int blocksize, int Ndense); void intmap_free(intmap_t* it); /** Finds the list of objects for the given "key". Creates a new list if "create" is TRUE and the list didn't already exist. */ bl* intmap_find(intmap_t* it, int key, anbool create); void intmap_append(intmap_t* it, int key, void* pval); /** Iterates through the map elements. Returns pointers to the "index"-th entry. Returns TRUE if the element exists, FALSE otherwise. The iteration proceeds in a random order. */ anbool intmap_get_entry(intmap_t* it, int index, int* key, bl** list); #endif astrometry.net-0.67/include/astrometry/ioutils.h000644 000765 000024 00000013266 12651445460 022273 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef IOUTILS_H #define IOUTILS_H #include #include #include #include #include "astrometry/an-bool.h" #include "astrometry/bl.h" #include "astrometry/keywords.h" extern uint32_t ENDIAN_DETECTOR; int copy_file(const char* infn, const char* outfn); int pad_fid(FILE* fid, size_t len, char pad); int pad_file(char* filename, size_t len, char pad); /* The "basename" function may overwrite its arg and may return a pointer to static memory... both undesirable. This replacement returns a newly- allocated string containing the result. */ Malloc char* basename_safe(const char* path); Malloc char* dirname_safe(const char* path); // Returns (system + user) CPU time, in seconds. float get_cpu_usage(void); //int log_resource_usage(int loglevel); /* Searches for the given "filename" in the given set of directories. Returns a newly allocated string "dir/filename", or NULL if none of the paths exists and is readable. */ char* find_file_in_dirs(const char** dirs, int ndirs, const char* filename, anbool allow_absolute); // Are strings s1 and s2 equal? anbool streq(const char* s1, const char* s2); anbool strcaseeq(const char* s1, const char* s2); /* Copy data from "fin" to "fout", starting at offset "offset" (from the beginning of "fin"), and length "length". Returns 0 on success. */ int pipe_file_offset(FILE* fin, off_t offset, off_t length, FILE* fout); int write_file(const char* fn, const char* data, int len); /* It's not really _safe_ as such, it just prints an error message if it fails... */ void ATTRIB_FORMAT(printf,2,3) asprintf_safe(char** strp, const char* format, ...); int run_command_get_outputs(const char* cmd, sl** outlines, sl** errlines); void get_mmap_size(size_t start, size_t size, off_t* mapstart, size_t* mapsize, int* pgap); // If "dir" is NULL, create temp file in $TMP, or /tmp if not set. char* create_temp_file(const char* fn, const char* dir); // If "dir" is NULL, create temp file in $TMP, or /tmp if not set. char* create_temp_dir(const char* name, const char* dir); char* shell_escape(const char* str); int mkdir_p(const char* path); // Returns 0 on error. time_t file_get_last_modified_time(const char* fn); anbool file_exists(const char* fn); anbool file_readable(const char* fn); anbool file_executable(const char* fn); anbool path_is_dir(const char* path); void* file_get_contents(const char* fn, size_t* len, anbool addzero); char* file_get_contents_offset(const char* fn, int offset, int length); sl* fid_add_lines(FILE* fid, anbool include_newlines, sl* list); sl* file_get_lines(const char* fn, anbool include_newlines); sl* fid_get_lines(FILE* fid, anbool include_newlines); sl* dir_get_contents(const char* path, sl* result, anbool filesonly, anbool recursive); int file_get_last_modified_string(const char* fn, const char* timeformat, anbool utc, char* output, size_t outsize); /** Splits the given "str" into words, so that the first line is at most "firstlinew" long. Subsequent lines have length <= "linew". If "lst" is non-NULL, the words are added into it. Otherwise a new sl is allocated. */ sl* split_long_string(const char* str, int firstlinew, int linew, sl* lst); // Split a string on the first instance of "splitstr". // Places the addresses of (newly-allocated) copies of the first and seconds parts of the string. // Returns 1 if the string is found. int split_string_once(const char* str, const char* splitstr, char** first, char** second); /** If "cmdline" starts with "keyword", returns 1 and places the address of the start of the next word in "p_next_word". */ int is_word(const char* cmdline, const char* keyword, char** p_next_word); int starts_with(const char* str, const char* prefix); int ends_with(const char* str, const char* prefix); char* strdup_safe(const char* str); void add_sigbus_mmap_warning(void); void reset_sigbus_mmap_warning(void); int write_u8(FILE* fout, unsigned char val); int write_u16(FILE* fout, unsigned int val); int write_u32(FILE* fout, unsigned int val); int write_uints(FILE* fout, unsigned int* val, int n); int write_double(FILE* fout, double val); int write_float(FILE* fout, float val); int write_fixed_length_string(FILE* fout, char* s, int length); int write_string(FILE* fout, char* s); int write_u32_portable(FILE* fout, unsigned int val); int write_u32s_portable(FILE* fout, unsigned int* val, int n); int read_u8(FILE* fin, unsigned char* val); int read_u16(FILE* fout, unsigned int* val); int read_u32(FILE* fin, unsigned int* val); int read_double(FILE* fin, double* val); int read_fixed_length_string(FILE* fin, char* s, int length); char* read_string(FILE* fin); char* read_string_terminated(FILE* fin, const char* terminators, int nterminators, anbool include_terminator); int read_u32_portable(FILE* fin, unsigned int* val); int read_u32s_portable(FILE* fin, unsigned int* val, int n); struct buffered_read_data { void* buffer; int blocksize; int elementsize; int ntotal; int nbuff; int off; int buffind; int (*refill_buffer)(void* userdata, void* buffer, unsigned int offs, unsigned int nelems); void* userdata; }; typedef struct buffered_read_data bread_t; bread_t* buffered_read_new(int elementsize, int Nbuffer, int Ntotal, int (*refill_buffer)(void* userdata, void* buffer, unsigned int offs, unsigned int nelems), void* userdata); void* buffered_read(bread_t* buff); void buffered_read_pushback(bread_t* br); void buffered_read_reset(bread_t* br); void buffered_read_free(bread_t* br); void buffered_read_resize(bread_t* br, int newsize); #endif astrometry.net-0.67/include/astrometry/kdtree.h000644 000765 000024 00000043516 12651445460 022062 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_H #define KDTREE_H #include #include #define KDTREE_MAX_LEVELS 1000 #define KDT_INFTY_DOUBLE HUGE_VAL #define KDT_INFTY_FLOAT HUGE_VALF enum kd_rangesearch_options { KD_OPTIONS_COMPUTE_DISTS = 0x1, KD_OPTIONS_RETURN_POINTS = 0x2, KD_OPTIONS_SORT_DISTS = 0x4, KD_OPTIONS_SMALL_RADIUS = 0x8, /* If both bounding box and splitting plane are available, use splitting plane (default is bounding box)... */ KD_OPTIONS_USE_SPLIT = 0x10, /* If the tree is u32 and bounding boxes are being used and the rangesearch only fits in 64 bits, use doubles instead of u64 in the distance computation (default is to use u64). (Likewise for u16/u32) */ KD_OPTIONS_NO_BIG_INT_MATH = 0x20, /* In bounding-box trees that also have a "splitdim" array, do a quick check along the splitting dimension. */ KD_OPTIONS_SPLIT_PRECHECK = 0x40, /* In integer bounding-box trees, do an L1 distance pre-check. */ KD_OPTIONS_L1_PRECHECK = 0x80, /* Don't resize the kdtree_qres_t* result structure to take only the space required (assume it's going to be reused and we're letting the memory usage do the "high water mark" thing). */ KD_OPTIONS_NO_RESIZE_RESULTS = 0x100 }; enum kd_build_options { KD_BUILD_BBOX = 0x1, KD_BUILD_SPLIT = 0x2, /* Only applicable to integer trees: use a separate array to hold the splitting dimension, rather than packing it into the bottom bits of the splitting plane location. */ KD_BUILD_SPLITDIM = 0x4, KD_BUILD_NO_LR = 0x8, /* Twiddle the split locations so that computing LR is O(1). Only works for double trees or int trees with KD_BUILD_SPLITDIM. */ KD_BUILD_LINEAR_LR = 0x10, // DEBUG KD_BUILD_FORCE_SORT = 0x20, }; typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; typedef uint8_t u8; enum kd_types { KDT_NULL = 0, // note, this MUST be 0 because it's used as a boolean value. KDT_DATA_NULL = 0, KDT_DATA_DOUBLE = 0x1, KDT_DATA_FLOAT = 0x2, KDT_DATA_U32 = 0x4, KDT_DATA_U16 = 0x8, KDT_TREE_NULL = 0, KDT_TREE_DOUBLE = 0x100, KDT_TREE_FLOAT = 0x200, KDT_TREE_U32 = 0x400, KDT_TREE_U16 = 0x800, KDT_EXT_NULL = 0, KDT_EXT_DOUBLE = 0x10000, KDT_EXT_FLOAT = 0x20000 }; typedef enum kd_types kd_types; #define KDT_DATA_MASK 0xf #define KDT_TREE_MASK 0xf00 #define KDT_EXT_MASK 0x30000 /* Possible values for the "treetype" member. There are three relevant data type: (a) the type of the raw data; (b) the type used in the tree's bounding boxes and splitting planes; (c) the external type. These are called the "data", "tree", and "ext" types. */ enum kd_tree_types { KDTT_NULL = 0, /* "All doubles, all the time". */ KDTT_DOUBLE = KDT_EXT_DOUBLE | KDT_DATA_DOUBLE | KDT_TREE_DOUBLE, /* "All floats, all the time". */ KDTT_FLOAT = KDT_EXT_FLOAT | KDT_DATA_FLOAT | KDT_TREE_FLOAT, /* Data are "doubles", tree is u32. aka inttree. */ KDTT_DOUBLE_U32 = KDT_EXT_DOUBLE | KDT_DATA_DOUBLE | KDT_TREE_U32, /* Data are "doubles", tree is u16. aka shorttree. */ KDTT_DOUBLE_U16 = KDT_EXT_DOUBLE | KDT_DATA_DOUBLE | KDT_TREE_U16, /* Data and tree are "u32". */ KDTT_DUU = KDT_EXT_DOUBLE | KDT_DATA_U32 | KDT_TREE_U32, /* Data and tree are "u16". */ KDTT_DSS = KDT_EXT_DOUBLE | KDT_DATA_U16 | KDT_TREE_U16, KDTT_DDU = KDT_EXT_DOUBLE | KDT_DATA_DOUBLE | KDT_TREE_U32, }; struct kdtree; typedef struct kdtree kdtree_t; struct kdtree_qres; typedef struct kdtree_qres kdtree_qres_t; struct kdtree_funcs { void* (*get_data)(const kdtree_t* kd, int i); void (*copy_data_double)(const kdtree_t* kd, int start, int N, double* dest); double (*get_splitval)(const kdtree_t* kd, int nodeid); int (*get_bboxes)(const kdtree_t* kd, int node, void* bblo, void* bbhi); int (*check)(const kdtree_t* kd); void (*fix_bounding_boxes)(kdtree_t* kd); void (*nearest_neighbour_internal)(const kdtree_t* kd, const void* query, double* bestd2, int* pbest); kdtree_qres_t* (*rangesearch)(const kdtree_t* kd, kdtree_qres_t* res, const void* pt, double maxd2, int options); void (*nodes_contained)(const kdtree_t* kd, const void* querylow, const void* queryhi, void (*callback_contained)(const kdtree_t* kd, int node, void* extra), void (*callback_overlap)(const kdtree_t* kd, int node, void* extra), void* cb_extra); //int (*node_node_mindist2_exceeds)(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double maxd2); // instrumentation functions - set these to get callbacks about // the progress of the algorithm. // a node was enqueued to be searched during nearest-neighbour. void (*nn_enqueue)(const kdtree_t* kd, int nodeid, int place); // a node was pruned during nearest-neighbour. void (*nn_prune)(const kdtree_t* kd, int nodeid, double d2, double bestd2, int place); // a node is being explored during nearest-neighbour. void (*nn_explore)(const kdtree_t* kd, int nodeid, double d2, double bestd2); // a point is being examined during nearest-neighbour. void (*nn_point)(const kdtree_t* kd, int nodeid, int pointindex); // a new best point has been found. void (*nn_new_best)(const kdtree_t* kd, int nodeid, int pointindex, double d2); }; typedef struct kdtree_funcs kdtree_funcs; struct kdtree { /* A bitfield describing the type of this tree. */ u32 treetype; int32_t* lr; /* Points owned by leaf nodes, stored and manipulated in a way that's too complicated to explain in this comment. (nbottom) */ u32* perm; /* Permutation index / hairstyle from the 80s (ndata) */ /* Bounding box: list of D-dimensional lower hyperrectangle corner followed by D-dimensional upper corner. (ttype x ndim x nnodes) */ union { float* f; double* d; u32* u; u16* s; void* any; } bb; // how many bounding-boxes were found? int n_bb; /* Split position (& dimension for ints) (ttype x ninterior). */ union { float* f; double* d; u32* u; u16* s; void* any; } split; /* Split dimension for floating-point types (x ninterior) */ u8* splitdim; /* bitmasks for the split dimension and location. */ u8 dimbits; u32 dimmask; u32 splitmask; /* Raw coordinate data as xyzxyzxyz (dtype) */ union { float* f; double* d; u32* u; u16* s; void* any; } data; /* Should the kdtree free(kd->data) when kdtree_free(kd) is called? Normally the kdtree does *not* free the data, unless the datatype had to be converted (if "external" type != "data" type) so that a new array had to be allocated. */ int free_data; double* minval; double* maxval; double scale; /* kdtype per real -- isotropic */ double invscale; /* real per kdtype */ int ndata; /* Number of items */ int ndim; /* Number of dimensions */ int nnodes; /* Number of nodes */ int nbottom; /* Number of leaf nodes */ int ninterior; /* Number of internal nodes */ int nlevels; int has_linear_lr; // For i/o: the name of this tree in the file. char* name; void* io; struct kdtree_funcs fun; }; struct kdtree_qres { unsigned int nres; unsigned int capacity; /* Allocated size. */ union { double* d; float* f; u32* u; u16* s; void* any; } results; double *sdists; /* Squared distance from query point */ u32 *inds; /* Indexes into original data set */ }; // Returns the number of data points in this kdtree. int kdtree_n(const kdtree_t* kd); // Returns the number of nodes in this kdtree. int kdtree_nnodes(const kdtree_t* kd); int kdtree_has_old_bb(const kdtree_t* kd); double kdtree_get_conservative_query_radius(const kdtree_t* kd, double radius); /* These functions return the number of bytes each entry in the kdtree is expected to have. These return positive values EVEN IF THE ACTUAL array is NULL in the particular tree. Ie, it answers the question "how big would the LR array for this tree be, if it had one?" */ size_t kdtree_sizeof_lr(const kdtree_t* kd); size_t kdtree_sizeof_perm(const kdtree_t* kd); size_t kdtree_sizeof_bb(const kdtree_t* kd); size_t kdtree_sizeof_split(const kdtree_t* kd); size_t kdtree_sizeof_splitdim(const kdtree_t* kd); size_t kdtree_sizeof_data(const kdtree_t* kd); size_t kdtree_sizeof_nodes(const kdtree_t* kd); static inline int kdtree_exttype(const kdtree_t* kd) { return kd->treetype & KDT_EXT_MASK; } static inline int kdtree_datatype(const kdtree_t* kd) { return kd->treetype & KDT_DATA_MASK; } /* What type are my bounding boxes / split planes? */ static inline int kdtree_treetype(const kdtree_t* kd) { return kd->treetype & KDT_TREE_MASK; } void kdtree_memory_report(kdtree_t* kd); kdtree_t* kdtree_new(int N, int D, int Nleaf); void kdtree_print(kdtree_t* kd); /* Reinitialize the table of function pointers "kd->fun". */ void kdtree_update_funcs(kdtree_t* kd); void kdtree_set_limits(kdtree_t* kd, double* low, double* high); void* kdtree_get_data(const kdtree_t* kd, int i); void kdtree_copy_data_double(const kdtree_t* kd, int i, int N, double* dest); const char* kdtree_kdtype_to_string(int kdtype); const char* kdtree_build_options_to_string(int opts); int kdtree_kdtype_parse_data_string(const char* str); int kdtree_kdtype_parse_tree_string(const char* str); int kdtree_kdtype_parse_ext_string(const char* str); int kdtree_kdtypes_to_treetype(int exttype, int treetype, int datatype); int kdtree_permute(const kdtree_t* tree, int ind); /* Compute the inverse permutation of tree->perm and place it in "invperm". */ void kdtree_inverse_permutation(const kdtree_t* tree, int* invperm); /* Free results */ void kdtree_free_query(kdtree_qres_t *res); /* Free a tree; does not free kd->data */ void kdtree_free(kdtree_t *kd); int kdtree_is_node_empty(const kdtree_t* kd, int nodeid); int kdtree_is_leaf_node_empty(const kdtree_t* kd, int nodeid); /* The leftmost point owned by this node. */ int kdtree_left(const kdtree_t* kd, int nodeid); /* The rightmost point owned by this node. */ int kdtree_right(const kdtree_t* kd, int nodeid); /* Shortcut kdtree_{left,right} for leaf nodes. */ int kdtree_leaf_right(const kdtree_t* kd, int nodeid); int kdtree_leaf_left(const kdtree_t* kd, int nodeid); /* How many points are owned by node "nodeid"? */ int kdtree_npoints(const kdtree_t* kd, int nodeid); /* Returns the node index of the first/last leaf within the subtree rooted at "nodeid". */ int kdtree_first_leaf(const kdtree_t* kd, int nodeid); int kdtree_last_leaf(const kdtree_t* kd, int nodeid); /* Return the first and last node id (resp) of a given level in the tree. The root is level 0. */ int kdtree_level_start(const kdtree_t* kd, int level); int kdtree_level_end(const kdtree_t* kd, int level); /* Returns the level of the given nodeid; 0=root. */ int kdtree_get_level(const kdtree_t* kd, int nodeid); /* How many levels are in a tree with "Nnodes" nodes? A tree with one node (Nnodes = 1) has one level. */ int kdtree_nnodes_to_nlevels(int Nnodes); /* Nearest neighbour: returns the index _in the kdtree_ of the nearest point; * the point is at (kd->data + ind * kd->ndim) and its permuted index is * (kd->perm[ind]). * * If "bestd2" is non-NULL, the distance-squared to the nearest neighbour * will be placed there. */ int kdtree_nearest_neighbour(const kdtree_t* kd, const void *pt, double* bestd2); /* Nearest neighbour (if within a maximum range): returns the index * _in the kdtree_ of the nearest point, _if_ its distance is less than * maxd2. (Otherwise, -1). * * If "bestd2" is non-NULL, the distance-squared to the nearest neighbour * will be placed there. */ int kdtree_nearest_neighbour_within(const kdtree_t* kd, const void *pt, double maxd2, double* bestd2); /* * Finds the set of non-leaf nodes that are completely contained * within the given query rectangle, plus the leaf nodes that * overlap with the query. (In other words, all nodes that overlap * the query, without recursing down to leaf nodes unnecessarily.) * Calls one of two callbacks for fully-contained and * partly-contained nodes. */ void kdtree_nodes_contained(const kdtree_t* kd, const void* querylow, const void* queryhi, void (*callback_contained)(const kdtree_t* kd, int node, void* extra), void (*callback_overlap)(const kdtree_t* kd, int node, void* extra), void* cb_extra); #define KD_IS_LEAF(kd, i) ((i) >= ((kd)->ninterior)) #define KD_IS_LEFT_CHILD(i) ((i) & 1) #define KD_PARENT(i) (((i)-1)/2) #define KD_CHILD_LEFT(i) (2*(i)+1) #define KD_CHILD_RIGHT(i) (2*(i)+2) /* * Copies the bounding box of the given node into the given arrays, * which are of the external type. * * Returns FALSE if the tree does not have bounding boxes. */ int kdtree_get_bboxes(const kdtree_t* kd, int node, void* bblo, void* bbhi); double kdtree_get_splitval(const kdtree_t* kd, int nodeid); int kdtree_get_splitdim(const kdtree_t* kd, int nodeid); double kdtree_node_node_mindist2(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2); double kdtree_node_node_maxdist2(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2); int kdtree_node_node_mindist2_exceeds(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double dist2); int kdtree_node_node_maxdist2_exceeds(const kdtree_t* kd1, int node1, const kdtree_t* kd2, int node2, double dist2); double kdtree_node_point_mindist2(const kdtree_t* kd, int node, const void* pt); double kdtree_node_point_maxdist2(const kdtree_t* kd, int node, const void* pt); int kdtree_node_point_mindist2_exceeds(const kdtree_t* kd, int node, const void* pt, double dist2); int kdtree_node_point_maxdist2_exceeds(const kdtree_t* kd, int node, const void* pt, double dist2); /* Sanity-check a tree. 0=okay. */ int kdtree_check(const kdtree_t* t); void kdtree_fix_bounding_boxes(kdtree_t* kd); #if 0 /* Range seach using callback */ void kdtree_rangesearch_callback(kdtree_t *kd, real *pt, real maxdistsquared, void (*rangesearch_callback)(kdtree_t* kd, real* pt, real maxdist2, real* computed_dist2, int indx, void* extra), void* extra); /* Counts points within range. */ int kdtree_rangecount(kdtree_t* kd, real* pt, real maxdistsquared); /* Output Graphviz .dot format version of the tree */ void kdtree_output_dot(FILE* fid, kdtree_t* kd); #endif // include dimension-generic versions of the dimension-specific code. #define KD_DIM_GENERIC 1 #endif /* KDTREE_H */ #if defined(KD_DIM) || defined(KD_DIM_GENERIC) #if defined(KD_DIM) #undef KDID #undef GLUE2 #undef GLUE #define GLUE2(a, b) a ## b #define GLUE(a, b) GLUE2(a, b) #define KDID(x) GLUE(x ## _, KD_DIM) #else #define KDID(x) x #endif #define KDFUNC(x) KDID(x) /* kdtree_build() Build a tree from an array of data, of size N*D*sizeof(real). "options" is a bitfield of kd_build_options values. kd: NULL to allocate a new kdtree_t* structure, or the address of the structure in which to store the result. data: your N x D-dimensional data, stored in N-major direction: data[n*D + d] is the address of data item "n", dimension "d". If 3-dimensional data, eg, order is x0,y0,z0,x1,y1,z1,x2,y2,z2. N: number of vectors D: dimensionality of vectors Nleaf: number of element in a kd-tree leaf node. Typical value would be about 32. treetype: if you data are doubles, KDTT_DOUBLE if you data are floats, KDTT_FLOAT For fancier options, see kd_tree_types above. options: Specify one of: KD_BUILD_BBOX: keep a full bounding-box at each node; KD_BUILD_SPLIT: just keep the split dimension and value at each node. see kd_build_options above for additional fancy stuff. When you're done with your tree, kdtree_free() it. */ kdtree_t* KDFUNC(kdtree_build) (kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options); kdtree_t* KDFUNC(kdtree_build_2) (kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options, double* minval, double* maxval); /* Range seach for a single point. kdtree_rangesearch() kd: kd-tree object. pt: pointer to the query point -- the thing you are searching for. The data type of this depends on the "treetype" of the kd-tree. For a KDTT_DOUBLE, it must be a D-dimensional array of doubles. For KDTT_FLOAT, an array of floats. maxd2: maximum distance-squared of the search. The resulting kdtree_qres_t* object will be sorted by distance (nearest first), and you can get the results. Again, the type depends on the kd-tree's "treetype"; for KDTT_DOUBLE, the "results.d" field contains the results; "nres" is the number of points within range. "sdists" are the squared-distances, and "inds" are the indices of the matches. Free the query results with kdtree_free_query(). */ kdtree_qres_t* KDFUNC(kdtree_rangesearch)(const kdtree_t *kd, const void *pt, double maxd2); /* Like kdtree_rangesearch(), but don't sort the results by distance. */ kdtree_qres_t* KDFUNC(kdtree_rangesearch_nosort)(const kdtree_t *kd, const void *pt, double maxd2); /* Like kdtree_rangesearch, but you get to call the shots; see kd_rangesearch_options for what the "options" are. */ kdtree_qres_t* KDFUNC(kdtree_rangesearch_options)(const kdtree_t *kd, const void *pt, double maxd2, int options); /* Like kdtree_rangesearch_options, except reuse a kdtree_qres_t* from a previous call, to avoid a lot of freeing and allocating memory. */ kdtree_qres_t* KDFUNC(kdtree_rangesearch_options_reuse)(const kdtree_t *kd, kdtree_qres_t* res, const void *pt, double maxd2, int options); #if !defined(KD_DIM) #undef KD_DIM_GENERIC #endif #endif astrometry.net-0.67/include/astrometry/kdtree_fits_io.h000644 000765 000024 00000007302 12651445460 023567 0ustar00dstnstaff000000 000000 /* # This file is part of libkd. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef KDTREE_FITS_IO_H #define KDTREE_FITS_IO_H #include #include "astrometry/kdtree.h" #include "astrometry/fitsbin.h" #include "astrometry/anqfits.h" /** Usage patterns: kdtree_fits_t* io = kdtree_fits_open("in.kd.fits"); kdtree_t* kd = kdtree_fits_read_tree(io, "mytree"); // kd contains the tree that was read. // io->fb->primheader is the primary header fitsbin_chunk_t chunk; chunk.tablename = "my_extra_data"; chunk.itemsize = sizeof(int32_t); chunk.nrows = kd->ndata; kdtree_fits_read_chunk(io, &chunk); // chunk->header // chunk->data kdtree_fits_close(); kdtree_fits_t* io = kdtree_fits_open_for_writing("out.kd.fits"); kdtree_t* mytree = ...; kdtree_fits_write_tree(io, mytree); fitsbin_chunk_t chunk; chunk.tablename = "my_extra"; chunk.data = ...; chunk.itemsize = sizeof(int32_t); chunk.nrows = mytree->ndata; kdtree_fits_write_chunk(io, &chunk) kdtree_fits_close(); */ typedef fitsbin_t kdtree_fits_t; kdtree_fits_t* kdtree_fits_open(const char* fn); kdtree_fits_t* kdtree_fits_open_fits(anqfits_t* fits); // convenience... kdtree_t* kdtree_fits_read(const char* fn, const char* treename, qfits_header** p_hdr); int kdtree_fits_write(const kdtree_t* kdtree, const char* fn, const qfits_header* hdr); //sl* kdtree_fits_list_trees(kdtree_fits_t* io); int kdtree_fits_contains_tree(const kdtree_fits_t* io, const char* treename); fitsbin_t* kdtree_fits_get_fitsbin(kdtree_fits_t* io); kdtree_t* kdtree_fits_read_tree(kdtree_fits_t* io, const char* treename, qfits_header** p_hdr); int kdtree_fits_read_chunk(kdtree_fits_t* io, fitsbin_chunk_t* chunk); qfits_header* kdtree_fits_get_primary_header(kdtree_fits_t* io); kdtree_fits_t* kdtree_fits_open_for_writing(const char* fn); // writes the primary header and the tree. int kdtree_fits_write_tree(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* add_headers); // just writes the tree, no primary header. int kdtree_fits_append_tree(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* add_headers); int kdtree_fits_append_tree_to(kdtree_t* kd, const qfits_header* inhdr, FILE* fid); int kdtree_fits_write_primary_header(kdtree_fits_t* io, const qfits_header* add_headers); int kdtree_fits_write_chunk(kdtree_fits_t* io, fitsbin_chunk_t* chunk); int kdtree_fits_write_chunk_to(fitsbin_chunk_t* chunk, FILE* fid); int kdtree_fits_close(kdtree_t* io); int kdtree_fits_io_close(kdtree_fits_t* io); // flipped-endian writing... int kdtree_fits_write_chunk_flipped(kdtree_fits_t* io, fitsbin_chunk_t* chunk, int wordsize); int kdtree_fits_write_flipped(const kdtree_t* kdtree, const char* fn, const qfits_header* hdr); int kdtree_fits_write_tree_flipped(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr); int kdtree_fits_append_tree_flipped(kdtree_fits_t* io, const kdtree_t* kd, const qfits_header* inhdr); // names (actually prefixes) of FITS tables. #define KD_STR_HEADER "kdtree_header" #define KD_STR_LR "kdtree_lr" #define KD_STR_PERM "kdtree_perm" #define KD_STR_BB "kdtree_bb" #define KD_STR_SPLIT "kdtree_split" #define KD_STR_SPLITDIM "kdtree_splitdim" #define KD_STR_DATA "kdtree_data" #define KD_STR_RANGE "kdtree_range" // is the given column name one of the above strings? int kdtree_fits_column_is_kdtree(char* columnname); #endif astrometry.net-0.67/include/astrometry/keywords.h000644 000765 000024 00000005355 12651445460 022452 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ // borrowed from http://rlove.org/log/2005102601. #ifndef ASTROMETRY_KEYWORDS_H #define ASTROMETRY_KEYWORDS_H #define ATTRIB_FORMAT(style,fmt,start) __attribute__ ((format(style,fmt,start))) // this snippet borrowed from GNU libc features.h: #if defined __GNUC__ # define GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) #else # define GNUC_PREREQ(maj, min) 0 #endif #if GNUC_PREREQ (3, 0) // Clang masquerades as gcc but isn't compatible. Someone should file a // lawsuit. Clang treats inlining differently; see // http://clang.llvm.org/compatibility.html#inline #if defined __clang__ || GNUC_PREREQ (5, 0) // After gcc 5.0, -std=gnu11 is the default (vs -std=gnu89 in previous // versions). This affects inlining semantics, among other things. #define InlineDeclare #define InlineDefineH #define InlineDefineC #else // plain old gcc #define INCLUDE_INLINE_SOURCE 1 #define InlineDeclare extern inline #define InlineDefineH extern inline #define InlineDefineC #endif // See: // http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html # define Inline inline # define Pure __attribute__ ((pure)) # define Const __attribute__ ((const)) # define Noreturn __attribute__ ((noreturn)) # define Malloc __attribute__ ((malloc)) # define Used __attribute__ ((used)) # define Unused __attribute__ ((unused)) # define VarUnused __attribute__ ((unused)) # define Packed __attribute__ ((packed)) # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) # define Noinline __attribute__ ((noinline)) // alloc_size // new in gcc-3.1: #if GNUC_PREREQ (3, 1) # define Deprecated __attribute__ ((deprecated)) #else # define Deprecated #endif // new in gcc-3.4: #if GNUC_PREREQ (3, 4) # define Must_check __attribute__ ((warn_unused_result)) # define WarnUnusedResult __attribute__ ((warn_unused_result)) #else # define Must_check # define WarnUnusedResult #endif // new in gcc-4.1: #if GNUC_PREREQ (4, 1) #if defined __clang__ // clang complains very loudly about this being ignored... # define Flatten #else # define Flatten __attribute__ (( flatten)) #endif #else # define Flatten #endif #else // not gnuc >= 3.0 # define Inline # define Pure # define Const # define Noreturn # define Malloc # define Must_check # define Deprecated # define Used # define Unused # define VarUnused # define Packed # define likely(x) (x) # define unlikely(x) (x) # define Noinline # define WarnUnusedResult # define Flatten #endif #endif // ASTROMETRY_KEYWORDS_H astrometry.net-0.67/include/astrometry/log.h000644 000765 000024 00000005606 12651445460 021363 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef _LOG_H #define _LOG_H #include #include #include "astrometry/an-bool.h" enum log_level { LOG_NONE, LOG_ERROR, LOG_MSG, LOG_VERB, LOG_ALL }; typedef void (*logfunc_t)(void* baton, enum log_level, const char* file, int line, const char* func, const char* format, va_list va); //typedef void (*logfunc2_t)(void* baton, enum log_level, const char* file, int line, const char* string); struct log_t { enum log_level level; FILE* f; anbool timestamp; double t0; // User-specified logging functions logfunc_t logfunc; void* baton; }; typedef struct log_t log_t; /** Send log messages to the user-specified logging function (as well as to the FILE*, if it is set; use log_to(NULL) to only send messages to the user-specified function. */ void log_use_function(logfunc_t func, void* baton); /** Make all logging commands thread-specific rather than global. */ void log_set_thread_specific(void); void log_set_timestamp(anbool b); /** * Initialize global logging object. Must be called before any of the other * log_* functions. */ void log_init(enum log_level level); void log_set_level(enum log_level level); /** Sends global logging to the given FILE*. */ void log_to(FILE* fid); void log_to_fd(int fd); /** * Create a new logger. * * Parameters: * * level - LOG_NONE don't show anything * LOG_ERROR only log errors * LOG_MSG log errors and important messages * LOG_VERB log verbose messages * LOG_ALL log debug messages * * Returns: * * A new logger object * */ log_t* log_create(const enum log_level level); /** * Close and free a logger object. */ void log_free(log_t* logger); #define LOG_TEMPLATE(name) \ void log_##name(const char* file, int line, const char* func, const char* format, ...) \ __attribute__ ((format (printf, 4, 5))); LOG_TEMPLATE(logmsg); LOG_TEMPLATE(logerr); LOG_TEMPLATE(logverb); LOG_TEMPLATE(logdebug); void log_loglevel(enum log_level level, const char* file, int line, const char* func, const char* format, ...) __attribute__ ((format (printf, 5, 6))); /** * Log a message: */ #define logerr( x, ...) log_logerr( __FILE__, __LINE__, __func__, x, ##__VA_ARGS__) #define logmsg( x, ...) log_logmsg( __FILE__, __LINE__, __func__, x, ##__VA_ARGS__) #define logverb( x, ...) log_logverb( __FILE__, __LINE__, __func__, x, ##__VA_ARGS__) #define debug( x, ...) log_logdebug(__FILE__, __LINE__, __func__, x, ##__VA_ARGS__) #define logdebug(x, ...) log_logdebug(__FILE__, __LINE__, __func__, x, ##__VA_ARGS__) // log at a particular level. #define loglevel(loglvl, format, ...) log_loglevel(loglvl, __FILE__, __LINE__, __func__, format, ##__VA_ARGS__) int log_get_level(void); FILE* log_get_fid(void); extern log_t _logger_global; #endif // _LOG_H astrometry.net-0.67/include/astrometry/matchfile.h000644 000765 000024 00000001626 12651445460 022534 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef MATCHFILE_H #define MATCHFILE_H #include #include "astrometry/matchobj.h" #include "astrometry/starutil.h" #include "astrometry/fitstable.h" #include "astrometry/bl.h" #define AN_FILETYPE_MATCH "MATCH" typedef fitstable_t matchfile; pl* matchfile_get_matches_for_field(matchfile* m, int field); matchfile* matchfile_open_for_writing(char* fn); int matchfile_write_headers(matchfile* m); int matchfile_fix_headers(matchfile* m); int matchfile_write_match(matchfile* m, MatchObj* mo); matchfile* matchfile_open(const char* fn); int matchfile_read_matches(matchfile* m, MatchObj* mo, int offset, int n); MatchObj* matchfile_read_match(matchfile* m); int matchfile_pushback_match(matchfile* m); int matchfile_count(matchfile* m); int matchfile_close(matchfile* m); #endif astrometry.net-0.67/include/astrometry/matchobj.h000644 000765 000024 00000010404 12651445460 022361 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef MATCHOBJ_H #define MATCHOBJ_H #include #include "astrometry/starutil.h" #include "astrometry/sip.h" #include "astrometry/bl.h" #include "astrometry/index.h" #include "astrometry/an-bool.h" struct match_struct { unsigned int quadno; unsigned int star[DQMAX]; unsigned int field[DQMAX]; uint64_t ids[DQMAX]; // actually code error ^2. float code_err; // Pixel positions of the quad stars. double quadpix[2 * DQMAX]; // Star positions of the quad stars. double quadxyz[3 * DQMAX]; uint8_t dimquads; // the center of the field in xyz coords double center[3]; // radius of the bounding circle, in distance on the unit sphere. double radius; // radius of the bounding circle in degrees double radius_deg; // WCS params anbool wcs_valid; tan_t wcstan; // arcseconds per pixel; computed: scale=3600*sqrt(abs(det(wcstan.cd))) double scale; // How many quads were matched to this single quad (not a running total) // (only counts a single ABCD permutation) int16_t quad_npeers; int nmatch; int ndistractor; int nconflict; int nfield; int nindex; // nbest = besti+1 = nmatch + ndistractor + nconflict <= nfield int nbest; float logodds; float worstlogodds; // how many other matches agreed with this one *at the time it was found* int16_t nagree; int fieldnum; int fieldfile; int16_t indexid; int16_t healpix; int16_t hpnside; char fieldname[32]; anbool parity; // how many field quads did we try before finding this one? int quads_tried; // how many matching quads from the index did we find before this one? int quads_matched; // how many matching quads had the right scale? int quads_scaleok; // how many field objects did we have to look at? // (this isn't stored in the matchfile, it's max(field)) int objs_tried; // how many matches have we run verification on? int nverified; // how many seconds of CPU time have we spent on this field? float timeused; // stuff used by blind... // tweaked-up WCS. sip_t* sip; // RA,Dec of reference stars; length is "nindex". double* refradec; // for correspondence file we need a copy of the field! (star x,y positions) double* fieldxy; bl* tagalong; bl* field_tagalong; // in arcsec. double index_jitter; index_t* index; // from verify.c: correspondences between index and image stars. // length of this array is "nfield". // Element i corresponds to field star 'i'; theta[i] is the reference star // that matched, as an index in the "refxyz", "refxy", and "refstarid" arrays; // OR one of the (negative) special values THETA_DISTRACTOR, THETA_CONFLICT, THETA_FILTERED. int* theta; // log-odds that the matches in 'theta' are correct; // this array is parallel to 'theta' so has length "nfield". // Star that were unmatched (THETA_DISTRACTOR, etc) have -inf; // Stars that are part of the matched quad have +inf. // Normal matches contain log-odds of the match: log(p(fg)/p(bg)); // see verify.h : verify_logodds_to_weight(x) to convert to a weight // that is 0 for definitely not-a-match and 1 for definitely a match. double* matchodds; // the order in which test stars were tried during verification int* testperm; // the stuff we discover about the reference stars during verify(). // These arrays have length "nindex"; they include all reference // stars that should appear in the image. // refxyz[i*3] -- x,y,z unit sphere position of this star; xyz2radec double* refxyz; // refxy[i*2] -- pixel x,y position (according to the *un-tweaked* WCS) double* refxy; // refstarid[i] -- index in the star kdtree (ie, can be used with startree_get_data_column as 'indices') int* refstarid; }; typedef struct match_struct MatchObj; void matchobj_compute_overlap(MatchObj* mo); // compute all derived fields. void matchobj_compute_derived(MatchObj* mo); // Returns the name of the index that produced this match. const char* matchobj_get_index_name(MatchObj* mo); void matchobj_log_hit_miss(int* theta, int* testperm, int nbest, int nfield, int loglevel, const char* prefix); char* matchobj_hit_miss_string(int* theta, int* testperm, int nbest, int nfield, char* target); void matchobj_print(MatchObj* mo, int loglvl); #endif astrometry.net-0.67/include/astrometry/mathutil.h000644 000765 000024 00000005475 12651445460 022435 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef MATHUTIL_H #define MATHUTIL_H #include "astrometry/keywords.h" #include "bl.h" int point_in_polygon(double x, double y, const dl* polygon); /* Given a point "pt", computes two unit vectors that are tangent to the point and perpendicular to each other. */ void tan_vectors(const double* pt, double* vec1, double* vec2); int invert_2by2(const double A[2][2], double Ainv[2][2]); int invert_2by2_arr(const double* A, double* Ainv); int is_power_of_two(unsigned int x); void matrix_matrix_3(double* m1, double* m2, double* result); void matrix_vector_3(double* m, double* v, double* result); double dot_product_3(double* v1, double* v2); double vector_length_3(double* v); double vector_length_squared_3(double* v); double inverse_3by3(double *matrix); void image_to_xyz(double uu, double vv, double* s, double* transform); void fit_transform(double* star, double* field, int N, double* trans); double uniform_sample(double low, double high); double gaussian_sample(double mean, double stddev); // just drop partial blocks off the end. #define EDGE_TRUNCATE 0 // just average the pixels in partial blocks. #define EDGE_AVERAGE 1 int get_output_image_size(int W, int H, int blocksize, int edgehandling, int* outw, int* outh); #define SIGN(x) (((x) == 0) ? 0.0 : (((x) > 0) ? 1.0 : -1.0)) /** Average the image in "blocksize" x "blocksize" blocks, placing the output in the "output" image. The output image will have size "*newW" by "*newH". If you pass "output = NULL", memory will be allocated for the output image. It is valid to pass in "output" = "image". The output image is returned. */ float* average_image_f(const float* image, int W, int H, int blocksize, int edgehandling, int* newW, int* newH, float* output); float* average_weighted_image_f(const float* image, const float* weight, int W, int H, int blocksize, int edgehandling, int* newW, int* newH, float* output, float nilval); Const InlineDeclare int imax(int a, int b); Const InlineDeclare int imin(int a, int b); InlineDeclare double distsq_exceeds(double* d1, double* d2, int D, double limit); Const InlineDeclare double square(double d); // note, this function works on angles in degrees; it wraps around // at 360. Const InlineDeclare int inrange(double ra, double ralow, double rahigh); InlineDeclare double distsq(const double* d1, const double* d2, int D); InlineDeclare void cross_product(double* v1, double* v2, double* cross); InlineDeclare void normalize(double* x, double* y, double* z); InlineDeclare void normalize_3(double* xyz); #ifdef INCLUDE_INLINE_SOURCE #define InlineDefine InlineDefineH #include "astrometry/mathutil.inc" #undef InlineDefine #endif #endif astrometry.net-0.67/include/astrometry/mathutil.inc000644 000765 000024 00000003136 12651445460 022747 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include InlineDefine void normalize(double* x, double* y, double* z) { double invl = 1.0 / sqrt((*x)*(*x) + (*y)*(*y) + (*z)*(*z)); *x *= invl; *y *= invl; *z *= invl; } InlineDefine void normalize_3(double* xyz) { double invlen = 1.0 / sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]); xyz[0] *= invlen; xyz[1] *= invlen; xyz[2] *= invlen; } InlineDefine void cross_product(double* a, double* b, double* cross) { cross[0] = a[1] * b[2] - a[2] * b[1]; cross[1] = a[2] * b[0] - a[0] * b[2]; cross[2] = a[0] * b[1] - a[1] * b[0]; } InlineDefine int imax(int a, int b) { return (a > b) ? a : b; } InlineDefine int imin(int a, int b) { return (a < b) ? a : b; } InlineDefine double distsq_exceeds(double* d1, double* d2, int D, double limit) { double dist2; int i; dist2 = 0.0; for (i=0; i limit) return 1; } return 0; } InlineDefine double distsq(const double* d1, const double* d2, int D) { double dist2; int i; dist2 = 0.0; for (i=0; i= ralow && ra <= rahigh) return 1; return 0; } /* handle wraparound properly */ //if (ra <= ralow && ra >= rahigh) if (ra >= ralow || ra <= rahigh) return 1; return 0; } astrometry.net-0.67/include/astrometry/merge-index.h000644 000765 000024 00000001301 12651445460 022772 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef MERGE_INDEX_H #define MERGE_INDEX_H #include "astrometry/quadfile.h" #include "astrometry/codekd.h" #include "astrometry/starkd.h" /** Merges .quad, .ckdt, and .skdt files to produce a .index file. */ int merge_index_files(const char* quadfn, const char* ckdtfn, const char* skdtfn, const char* indexfn); int merge_index_open_files(const char* quadfn, const char* ckdtfn, const char* skdtfn, quadfile_t** quad, codetree_t** code, startree_t** star); int merge_index(quadfile_t* quads, codetree_t* codekd, startree_t* starkd, const char* indexfn); #endif astrometry.net-0.67/include/astrometry/multiindex.h000644 000765 000024 00000005265 12651445460 022765 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef AN_MULTIINDEX_H #define AN_MULTIINDEX_H #include "astrometry/index.h" #include "astrometry/bl.h" #include "astrometry/starkd.h" /** About unloading and reloading multiindexes: The multiindex object holds the star-kdtree, and the list of index files. The star-kdtree can be unloaded and reloaded. AFTER calling multiindex_unload_starkd(), you can then call index_unload() on individual index_t*s. To reload, FIRST call multiindex_reload_starkd(), THEN index_reload() on individual index_t*s. We use a bit of sneakiness: -- multiindex_unload_starkd() sets each of the index_t*'s starkd pointers NULL. Then when index_unload() is called, it doesn't try to unload the starkd. -- likewise, for reloading, multiindex_reload_starkd() sets the index_t* starkd pointers, so upon index_reload(), it doesn't try to reload the starkd. -- we set index->fits to an anqfits_t for the file that contains the codekd and quadfile. Upon index_reload, it doesn't try to load the starkd (if it did, it would try to read the star-kd from the wrong file), and uses the index->fits object to read the quadfile and codekd. */ typedef struct { pl* inds; startree_t* starkd; // for the starkd: anqfits_t* fits; } multiindex_t; /* * Opens a set of index files. * * flags - If INDEX_ONLY_LOAD_METADATA, then only metadata will be * loaded. */ multiindex_t* multiindex_open(const char* skdtfn, const sl* indfns, int flags); /* * Opens a single star-kdtree. */ multiindex_t* multiindex_new(const char* skdtfn); /* * Adds an index files (quadfile and code-tree) to this multi-index. * * flags - If INDEX_ONLY_LOAD_METADATA, then only metadata will be * loaded. */ int multiindex_add_index(multiindex_t* mi, const char* indexfn, int flags); /* Unloads the shared star kdtree -- ie, closes mem-maps, etc. * None of the indices will be usable. */ void multiindex_unload_starkd(multiindex_t* mi); /* Reloads a previously unloaded shared star kdtree. */ int multiindex_reload_starkd(multiindex_t* mi); /* Calls multiindex_unload_starkd() and index_unload() on all contained indexes.*/ void multiindex_unload(multiindex_t* mi); /* Calls multiindex_reload_starkd() and index_reload() on all contained indexes.*/ int multiindex_reload(multiindex_t* mi); void multiindex_close(multiindex_t* mi); // close and free void multiindex_free(multiindex_t* mi); // How many indices? int multiindex_n(const multiindex_t* mi); // Get an index index_t* multiindex_get(const multiindex_t* mi, int i); #endif astrometry.net-0.67/include/astrometry/new-wcs.h000644 000765 000024 00000000450 12651445460 022155 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef NEW_WCS_H #define NEW_WCS_H #include "astrometry/an-bool.h" int new_wcs(const char* infn, const char* wcsfn, const char* outfn, anbool include_data); #endif astrometry.net-0.67/include/astrometry/ngc2000.h000644 000765 000024 00000003604 12651445460 021647 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef NGC2000_H #define NGC2000_H #include "astrometry/bl.h" /** The Astrometry.net codebase has two NGC modules. This one contains rough positions for all NGC/IC objects. ngcic-accurate.h contains more precise positions for some of the objects. You probably want to use them something like this: int i, N; N = ngc_num_entries(); for (i=0; i #include "astrometry/nomad.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_NOMAD "NOMAD" typedef fitstable_t nomad_fits; nomad_fits* nomad_fits_open(char* fn); nomad_fits* nomad_fits_open_for_writing(char* fn); int nomad_fits_write_headers(nomad_fits* nomad); int nomad_fits_fix_headers(nomad_fits* nomad); int nomad_fits_count_entries(nomad_fits* nomad); nomad_entry* nomad_fits_read_entry(nomad_fits* t); int nomad_fits_read_entries(nomad_fits* nomad, int offset, int count, nomad_entry* entries); int nomad_fits_close(nomad_fits* nomad); int nomad_fits_write_entry(nomad_fits* nomad, nomad_entry* entry); #endif astrometry.net-0.67/include/astrometry/nomad.h000644 000765 000024 00000005456 12651445460 021703 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef NOMAD_H #define NOMAD_H #include #include "astrometry/starutil.h" #define NOMAD_RECORD_SIZE 88 /* See: http://www.nofs.navy.mil/nomad/nomad_readme.html */ struct nomad_entry { // [degrees] double ra; double dec; // [degrees] float sigma_racosdec; float sigma_dec; // [arcsec/yr] float pm_racosdec; float pm_dec; // [arcsec/yr] float sigma_pm_racosdec; float sigma_pm_dec; // [yr] float epoch_ra; float epoch_dec; // mag // (30.000 in any magnitude field indicates "no data".) // (30.001 = "no data" but ...) float mag_B; float mag_V; float mag_R; float mag_J; float mag_H; float mag_K; int32_t usnob_id; int32_t twomass_id; int32_t yb6_id; int32_t ucac2_id; int32_t tycho2_id; // all these take values from the "nomad_src" enum. uint8_t astrometry_src; uint8_t blue_src; uint8_t visual_src; uint8_t red_src; anbool usnob_fail; // UBBIT "Fails Blaise's test for USNO-B1.0 star" anbool twomass_fail; // TMBIT "Fails Roc's test for clean 2MASS star" anbool tycho_astrometry; // TYBIT "Astrometry comes from Tycho2" anbool alt_radec; // XRBIT "Alt correlations for same (RA,Dec)" // This bit is NEVER set in NOMAD. //anbool alt_2mass; // ITMBIT "Alt correlations for same 2MASS ID" anbool alt_ucac; // IUCBIT "Alt correlations for same UCAC-2 ID" anbool alt_tycho; // ITYBIT "Alt correlations for same Tycho2 ID" anbool blue_o; // OMAGBIT "Blue magnitude from O (not J) plate" anbool red_e; // EMAGBIT "Red magnitude from E (not F) plate" anbool twomass_only; // TMONLY "Object found only in 2MASS cat" anbool hipp_astrometry; // HIPAST "Ast from Hipparcos (not Tycho2) cat" anbool diffraction; // SPIKE "USNO-B1.0 diffraction spike bit set" anbool confusion; // TYCONF "Tycho2 confusion flag" anbool bright_confusion; // BSCONF "Bright star has nearby faint source" anbool bright_artifact; // BSART "Faint source is bright star artifact" anbool standard; // USEME "Recommended astrometric standard" // This bit is NEVER set in NOMAD. //anbool external; // EXCAT "External, non-astrometric object" // this is a staging area for FITS i/o. uint8_t flags[2]; // sequence number assigned by us (it's not in the original catalogue), // composed of the 1/10 degree DEC zone (top 11 bits) and the sequence // number within the zone (bottom 21 bits). uint32_t nomad_id; }; typedef struct nomad_entry nomad_entry; enum nomad_src { NOMAD_SRC_NONE = 0, NOMAD_SRC_USNOB, NOMAD_SRC_2MASS, NOMAD_SRC_YB6, NOMAD_SRC_UCAC2, NOMAD_SRC_TYCHO2, NOMAD_SRC_HIPPARCOS, }; int nomad_parse_entry(nomad_entry* entry, const void* encoded); #endif astrometry.net-0.67/include/astrometry/os-features.h000644 000765 000024 00000007260 12651445460 023035 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef OS_FEATURES_H #define OS_FEATURES_H #ifndef DONT_INCLUDE_OS_FEATURES_CONFIG_H #include "astrometry/os-features-config.h" #endif // Features we use that aren't standard across all supported platforms char* canonicalize_file_name(const char* fn); // This is actually in POSIX1b but may or may not be available. int fdatasync(int fd); // Not POSIX; doesn't exist in Solaris 10 #include #ifndef MIN #define MIN(a,b) (((a)<(b))?(a):(b)) #endif #ifndef MAX #define MAX(a,b) (((a)>(b))?(a):(b)) #endif // isfinite() on Solaris; from // https://code.google.com/p/redis/issues/detail?id=20 #if defined(__sun) && defined(__GNUC__) #undef isnan #define isnan(x) \ __extension__({ __typeof (x) __x_a = (x); \ __builtin_expect(__x_a != __x_a, 0); }) #undef isfinite #define isfinite(x) \ __extension__ ({ __typeof (x) __x_f = (x); \ __builtin_expect(!isnan(__x_f - __x_f), 1); }) #undef isinf #define isinf(x) \ __extension__ ({ __typeof (x) __x_i = (x); \ __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); }) #undef isnormal #define isnormal(x) \ __extension__ ({ __typeof(x) __x_n = (x); \ if (__x_n < 0.0) __x_n = -__x_n; \ __builtin_expect(isfinite(__x_n) \ && (sizeof(__x_n) == sizeof(float) \ ? __x_n >= __FLT_MIN__ \ : sizeof(__x_n) == sizeof(long double) \ ? __x_n >= __LDBL_MIN__ \ : __x_n >= __DBL_MIN__), 1); }) #undef HUGE_VALF #define HUGE_VALF (1e50f) #endif /** The qsort_r story: -qsort_r appears in BSD (including Mac OSX) void qsort_r(void *, size_t, size_t, void *, int (*)(void *, const void *, const void *)); -qsort_r appears in glibc 2.8, but with a different argument order: void qsort_r(void*, size_t, size_t, int (*)(const void*, const void*, void*), void*); Notice that the "thunk" and "comparison function" arguments to qsort_r are swapped, and the "thunk" appears either at the beginning or end of the comparison function. We check a few things: -is qsort_r declared? -does qsort_r exist? -do we need to swap the arguments? Those using qsort_r in Astrometry.net should instead use the macro QSORT_R() to take advantage of these tests. Its signature is: void QSORT_R(void* base, size_t nmembers, size_t member_size, void* token, comparison_function); You should define the "comparison" function like this: static int QSORT_COMPARISON_FUNCTION(my_comparison, void* token, const void* v1, const void* v2) { ... } Distributions including glibc 2.8 include: -Mandriva 2009 -Ubuntu 8.10 */ #if NEED_DECLARE_QSORT_R //// NOTE: this declaration must match os-features-test.c . void qsort_r(void *base, size_t nmemb, size_t sz, void *userdata, int (*compar)(void *, const void *, const void *)); #endif #if NEED_SWAP_QSORT_R #define QSORT_R(a,b,c,d,e) qsort_r(a,b,c,e,d) #define QSORT_COMPARISON_FUNCTION(func, thunk, v1, v2) func(v1, v2, thunk) #else #define QSORT_R qsort_r #define QSORT_COMPARISON_FUNCTION(func, thunk, v1, v2) func(thunk, v1, v2) #endif // As suggested in http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Names.html #if __STDC_VERSION__ < 199901L # if __GNUC__ >= 2 # define __func__ __FUNCTION__ # else # define __func__ "" # endif #endif #endif astrometry.net-0.67/include/astrometry/permutedsort.h000644 000765 000024 00000004222 12651445460 023330 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PERMUTED_SORT_H #define PERMUTED_SORT_H // for QSORT_COMPARISON_FUNCTION #include "os-features.h" /* Computes the permutation array that will cause the "realarray" to be sorted according to the "compare" function. Ie, the first element in the sorted array will be at (char*)realarray + perm[0] * array_stride The "stride" parameter gives the number of bytes between successive entries in "realarray". If "perm" is NULL, a new permutation array will be allocated and returned. Otherwise, the permutation array will be placed in "perm". Note that if you pass in a non-NULL "perm" array, its existing values will be used! You probably want to initialize it with "permutation_init()" to set it to the identity permutation. */ int* permuted_sort(const void* realarray, int array_stride, int (*compare)(const void*, const void*), int* perm, int Nperm); int* permutation_init(int* perm, int Nperm); /** Applies a permutation array to a data vector. Copies "inarray" into "outarray" according to the given "perm"utation. This also works when "inarray" == "outarray". */ void permutation_apply(const int* perm, int Nperm, const void* inarray, void* outarray, int elemsize); /* Some sort functions that might come in handy: */ int compare_doubles_asc(const void* v1, const void* v2); int compare_doubles_desc(const void* v1, const void* v2); int compare_floats_asc(const void* v1, const void* v2); int compare_floats_desc(const void* v1, const void* v2); int compare_int64_asc(const void* v1, const void* v2); int compare_int64_desc(const void* v1, const void* v2); int compare_ints_asc(const void* v1, const void* v2); int compare_ints_desc(const void* v1, const void* v2); int compare_uchars_asc(const void* v1, const void* v2); int compare_uchars_desc(const void* v1, const void* v2); /* Versions for use with QSORT_R directly (not with permuted_sort). */ int QSORT_COMPARISON_FUNCTION(compare_floats_asc_r, void* thunk, const void* v1, const void* v2); #endif astrometry.net-0.67/include/astrometry/plotannotations.h000644 000765 000024 00000002665 12651445460 024040 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTANNOTATIONS_H #define PLOTANNOTATIONS_H #include "astrometry/plotstuff.h" struct annotation_args { anbool NGC; anbool constellations; anbool constellation_lines; anbool constellation_markers; anbool constellation_labels; anbool constellation_labels_long; // don't *exactly* connect the stars, leave a gap of this many pixels. // probably want this = plotstuff marker size float constellation_lines_offset; anbool constellation_pastel; anbool bright; anbool bright_labels; anbool bright_pastel; anbool HD; anbool HD_labels; float ngc_fraction; bl* targets; char* hd_catalog; }; typedef struct annotation_args plotann_t; void* plot_annotations_init(plot_args_t* args); plotann_t* plot_annotations_get(plot_args_t* pargs); int plot_annotations_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_annotations_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_annotations_free(plot_args_t* args, void* baton); int plot_annotations_set_hd_catalog(plotann_t* ann, const char* hdfn); int plot_annotations_add_named_target(plotann_t* ann, const char* target); void plot_annotations_add_target(plotann_t* ann, double ra, double dec, const char* name); DECLARE_PLOTTER(annotations); #endif astrometry.net-0.67/include/astrometry/plotfill.h000644 000765 000024 00000001210 12651445460 022412 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTFILL_H #define PLOTFILL_H #include "astrometry/plotstuff.h" struct plotfill_args { }; typedef struct plotfill_args plotfill_t; void* plot_fill_init(plot_args_t* args); int plot_fill_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_fill_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_fill_free(plot_args_t* args, void* baton); //extern const plotter_t plotter_fill; //plotter_t* plot_fill_new(); DECLARE_PLOTTER(fill); #endif astrometry.net-0.67/include/astrometry/plotgrid.h000644 000765 000024 00000003105 12651445460 022416 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTGRID_H #define PLOTGRID_H #include "astrometry/plotstuff.h" struct plotgrid_args { anbool dolabel; double rastep; double decstep; double ralabelstep; double declabelstep; int ralabeldir; int declabeldir; // Range of values to plot; default (0) is to choose sensible limits double ralo; double rahi; double declo; double dechi; // these strings are owned by the plotgrid object (will be free()d) char* raformat; char* decformat; }; typedef struct plotgrid_args plotgrid_t; plotgrid_t* plot_grid_get(plot_args_t* pargs); void* plot_grid_init(plot_args_t* args); int plot_grid_set_formats(plotgrid_t* grid, const char* raformat, const char* decformat); int plot_grid_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_grid_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_grid_free(plot_args_t* args, void* baton); #define DIRECTION_DEFAULT 0 #define DIRECTION_POS 1 #define DIRECTION_NEG 2 #define DIRECTION_POSNEG 3 #define DIRECTION_NEGPOS 4 void plot_grid_add_label(plot_args_t* pargs, double ra, double dec, double lval, const char* format); int plot_grid_find_ra_label_location(plot_args_t* pargs, double ra, double cdec, double decmin, double decmax, int dirn, double* pdec); int plot_grid_find_dec_label_location(plot_args_t* pargs, double dec, double cra, double ramin, double ramax, int dirn, double* pra); DECLARE_PLOTTER(grid); #endif astrometry.net-0.67/include/astrometry/plothealpix.h000644 000765 000024 00000001247 12651445460 023130 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTHEALPIX_H #define PLOTHEALPIX_H #include "plotstuff.h" struct plothealpix_args { int nside; int stepsize; }; typedef struct plothealpix_args plothealpix_t; plothealpix_t* plot_healpix_get(plot_args_t* pargs); void* plot_healpix_init(plot_args_t* args); int plot_healpix_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_healpix_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_healpix_free(plot_args_t* args, void* baton); DECLARE_PLOTTER(healpix); #endif astrometry.net-0.67/include/astrometry/plotimage.h000644 000765 000024 00000004756 12651445460 022570 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTIMAGE_H #define PLOTIMAGE_H #include "astrometry/plotstuff.h" #include "astrometry/anwcs.h" struct plotimage_args { char* fn; int format; // PLOTSTUFF_FORMAT_* // Use slow but correct resampling? // default is to use faster but approximate Cairo rendering. anbool resample; int downsample; // double arcsinh; double rgbscale[3]; double alpha; anwcs_t* wcs; double gridsize; // Only used when WCS is *not* set: scales the image by the given factors. //double scalex; //double scaley; // For FITS images: values that will be linearly transformed to 0,255. double image_low; double image_high; // image value that will be made transparent. double image_null; // image values outside this range will be made transparent // (if non-zero) double image_valid_low; double image_valid_high; int n_invalid_low; int n_invalid_high; int n_invalid_null; // FITS extension int fitsext; // FITS image plane int fitsplane; anbool auto_scale; unsigned char* img; int W; int H; }; typedef struct plotimage_args plotimage_t; plotimage_t* plot_image_get(plot_args_t* pargs); int plot_image_set_wcs(plotimage_t* args, const char* filename, int ext); void* plot_image_init(plot_args_t* args); int plot_image_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_image_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_image_free(plot_args_t* args, void* baton); int plot_image_getsize(plotimage_t* args, int* W, int* H); int plot_image_set_filename(plotimage_t* args, const char* fn); int plot_image_setsize(plot_args_t* pargs, plotimage_t* args); // 'percentile' must be in [0,1] // results are placed in 'rgbout' // don't rename 'rgbout' -- that name is used in plotstuff.i by SWIG int plot_image_get_percentile(plot_args_t* pargs, plotimage_t* args, double percentile, unsigned char* rgbout); void plot_image_add_to_pixels(plotimage_t* args, int rgb[3]); unsigned char* plot_image_scale_float(plotimage_t* args, const float* fimg); void plot_image_rgba_data(cairo_t* cairo, plotimage_t* args); // After setting filename, actually open and read the image file. int plot_image_read(const plot_args_t* pargs, plotimage_t* args); void plot_image_make_color_transparent(plotimage_t* args, unsigned char r, unsigned char g, unsigned char b); DECLARE_PLOTTER(image); #endif astrometry.net-0.67/include/astrometry/plotindex.h000644 000765 000024 00000002363 12651445460 022605 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTINDEX_H #define PLOTINDEX_H #include "astrometry/plotstuff.h" #include "astrometry/bl.h" #include "astrometry/index.h" struct plotindex_args { pl* indexes; pl* qidxes; anbool stars; anbool quads; anbool fill; }; typedef struct plotindex_args plotindex_t; // immediate: do cairo_move_to and cairo_line_to; no cairo_stroke/fill. void plot_quad_xy(cairo_t* cairo, double* quadxy, int dimquads); // immediate: plot the given quad number. Requires the plot wcs to be set. void plot_index_plotquad(cairo_t* cairo, plot_args_t* pargs, plotindex_t* args, index_t* index, int quadnum, int DQ); plotindex_t* plot_index_get(plot_args_t* pargs); int plot_index_add_file(plotindex_t* args, const char* fn); int plot_index_add_qidx_file(plotindex_t* args, const char* fn); void* plot_index_init(plot_args_t* args); int plot_index_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_index_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_index_free(plot_args_t* args, void* baton); //extern const plotter_t plotter_index; DECLARE_PLOTTER(index); #endif astrometry.net-0.67/include/astrometry/plotmatch.h000644 000765 000024 00000001613 12651445460 022567 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTMATCH_H #define PLOTMATCH_H #include "astrometry/plotstuff.h" #include "astrometry/bl.h" #include "astrometry/matchobj.h" struct plotmatch_args { // of MatchObj's bl* matches; }; typedef struct plotmatch_args plotmatch_t; plotmatch_t* plot_match_get(plot_args_t* pargs); int plot_match_add_match(plotmatch_t* args, const MatchObj* mo); int plot_match_set_filename(plotmatch_t* args, const char* filename); void* plot_match_init(plot_args_t* args); int plot_match_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_match_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_match_free(plot_args_t* args, void* baton); //extern const plotter_t plotter_match; DECLARE_PLOTTER(match); #endif astrometry.net-0.67/include/astrometry/plotoutline.h000644 000765 000024 00000002037 12651445460 023153 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTOUTLINE_H #define PLOTOUTLINE_H #include "astrometry/plotstuff.h" #include "astrometry/anwcs.h" struct plotoutline_args { anwcs_t* wcs; double stepsize; anbool fill; }; typedef struct plotoutline_args plotoutline_t; plotoutline_t* plot_outline_get(plot_args_t* pargs); void* plot_outline_init(plot_args_t* args); int plot_outline_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_outline_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_outline_free(plot_args_t* args, void* baton); int plot_outline_set_wcs_file(plotoutline_t* args, const char* filename, int ext); int plot_outline_set_wcs_size(plotoutline_t* args, int W, int H); int plot_outline_set_wcs(plotoutline_t* args, sip_t* wcs); int plot_outline_set_fill(plotoutline_t* args, anbool fill); //extern const plotter_t plotter_outline; DECLARE_PLOTTER(outline); #endif astrometry.net-0.67/include/astrometry/plotradec.h000644 000765 000024 00000002340 12651445460 022547 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTRADEC_H #define PLOTRADEC_H #include "astrometry/plotstuff.h" struct plotradec_args { char* fn; int ext; char* racol; char* deccol; int firstobj; int nobjs; // coordinates added with radec_val dl* radecvals; }; typedef struct plotradec_args plotradec_t; plotradec_t* plot_radec_get(plot_args_t* pargs); void plot_radec_reset(plotradec_t* args); // Called prior to cairo surface initialization. void* plot_radec_init(plot_args_t* args); void plot_radec_set_racol(plotradec_t* args, const char* col); void plot_radec_set_deccol(plotradec_t* args, const char* col); void plot_radec_set_filename(plotradec_t* args, const char* fn); int plot_radec_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_radec_count_inbounds(plot_args_t* pargs, plotradec_t* args); int plot_radec_plot(const char* command, cairo_t* cairo, plot_args_t* plotargs, void* baton); void plot_radec_free(plot_args_t* args, void* baton); void plot_radec_vals(plotradec_t* args, double ra, double dec); //extern const plotter_t plotter_radec; DECLARE_PLOTTER(radec); #endif astrometry.net-0.67/include/astrometry/plotstuff.h000644 000765 000024 00000020216 12651445460 022622 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTSTUFF_H #define PLOTSTUFF_H #include #include #include "astrometry/keywords.h" #include "astrometry/sip.h" #include "astrometry/bl.h" #include "astrometry/anwcs.h" #include "astrometry/an-bool.h" #define PLOTSTUFF_FORMAT_JPG 1 #define PLOTSTUFF_FORMAT_PNG 2 #define PLOTSTUFF_FORMAT_PPM 3 #define PLOTSTUFF_FORMAT_PDF 4 // Save the image as RGBA image "pargs->outimage" #define PLOTSTUFF_FORMAT_MEMIMG 5 #define PLOTSTUFF_FORMAT_FITS 6 struct plotter; typedef struct plotter plotter_t; struct plot_args { // the workers plotter_t* plotters; int NP; char* outfn; FILE* fout; int outformat; unsigned char* outimage; cairo_t* cairo; cairo_surface_t* target; cairo_operator_t op; // functions to call instead of cairo_move_to / cairo_line_to. void (*move_to)(struct plot_args* pargs, double x, double y, void* baton); void* move_to_baton; void (*line_to)(struct plot_args* pargs, double x, double y, void* baton); void* line_to_baton; anwcs_t* wcs; int W, H; float rgba[4]; float lw; // default: 1 int marker; // default: circle float markersize; // default: 5 float bg_rgba[4]; float bg_lw; // default: 3 int bg_box; // plot a rectangle for text backgrounds. float fontsize; // default: 20 // text alignment char halign; // L, R, C char valign; // T, B, C double label_offset_x; double label_offset_y; int text_bg_layer; int text_fg_layer; int marker_fg_layer; bl* cairocmds; // step size in pixels for drawing curved lines in RA,Dec; default 10 float linestep; }; typedef struct plot_args plot_args_t; typedef void* (*plot_func_init_t)(plot_args_t* args); typedef int (*plot_func_init2_t)(plot_args_t* args, void* baton); typedef int (*plot_func_command_t)(const char* command, const char* cmdargs, plot_args_t* args, void* baton); typedef int (*plot_func_plot_t)(const char* command, cairo_t* cr, plot_args_t* args, void* baton); typedef void (*plot_func_free_t)(plot_args_t* args, void* baton); struct plotter { // don't change the order of these fields! char* name; plot_func_init_t init; plot_func_init2_t init2; plot_func_command_t command; plot_func_plot_t doplot; plot_func_free_t free; void* baton; }; //#define DECLARE_PLOTTER(name) plotter_t* plot_ ## name ## _new() #define DECLARE_PLOTTER(name) void plot_ ## name ## _describe(plotter_t* p) #define DEFINE_PLOTTER_BODY(pname) \ p->name = #pname; \ p->init = plot_ ## pname ## _init; \ p->command = plot_ ## pname ## _command; \ p->doplot = plot_ ## pname ## _plot; \ p->free = plot_ ## pname ## _free; #define DEFINE_PLOTTER(name) DECLARE_PLOTTER(name) { \ DEFINE_PLOTTER_BODY(name) \ } /* #define DEFINE_PLOTTER(name) void plot_ ## name ## _describe(plotter_t* p) { \ p->name = #name; \ p->init = plot_ ## name ## _init; \ p->command = plot_ ## name ## _command; \ p->doplot = plot_ ## name ## _plot; \ p->free = plot_ ## name ## _free; \ } */ // return PLOTSTUFF_FORMAT_*, or -1 on error int parse_image_format(const char* fmt); int guess_image_format_from_filename(const char* fn); const char* image_format_name_from_code(int code); int parse_color(const char* color, float* r, float* g, float* b, float* a); int parse_color_rgba(const char* color, float* rgba); int cairo_set_color(cairo_t* cairo, const char* color); void cairo_set_rgba(cairo_t* cairo, const float* rgba); plot_args_t* plotstuff_new(void); int plotstuff_init(plot_args_t* plotargs); int plotstuff_read_and_run_command(plot_args_t* pargs, FILE* f); int plotstuff_run_command(plot_args_t* pargs, const char* cmd); void plotstuff_set_text_bg_alpha(plot_args_t* pargs, float alpha); int plotstuff_plot_layer(plot_args_t* pargs, const char* layer); void* plotstuff_get_config(plot_args_t* pargs, const char* name); int plotstuff_set_color(plot_args_t* pargs, const char* name); int plotstuff_set_bgcolor(plot_args_t* pargs, const char* name); float plotstuff_get_alpha(const plot_args_t* pargs); int plotstuff_set_alpha(plot_args_t* pargs, float alpha); int plotstuff_set_rgba(plot_args_t* pargs, const float* rgba); int plotstuff_set_rgba2(plot_args_t* pargs, float r, float g, float b, float a); int plotstuff_set_bgrgba2(plot_args_t* pargs, float r, float g, float b, float a); int plotstuff_set_marker(plot_args_t* pargs, const char* name); int plotstuff_set_markersize(plot_args_t* pargs, double ms); int plotstuff_set_size(plot_args_t* pargs, int W, int H); // Sets the plot size from the WCS size. int plotstuff_set_size_wcs(plot_args_t* pargs); int plotstuff_scale_wcs(plot_args_t* pargs, double scale); // in deg. int plotstuff_rotate_wcs(plot_args_t* pargs, double angle); int plotstuff_set_wcs_box(plot_args_t* pargs, float ra, float dec, float width); int plotstuff_set_wcs_file(plot_args_t* pargs, const char* fn, int ext); int plotstuff_set_wcs(plot_args_t* pargs, anwcs_t* wcs); int plotstuff_set_wcs_tan(plot_args_t* pargs, tan_t* wcs); int plotstuff_set_wcs_sip(plot_args_t* pargs, sip_t* wcs); void plotstuff_builtin_apply(cairo_t* cairo, plot_args_t* args); // Would a marker plotted with the current markersize at x,y appear in the image? anbool plotstuff_marker_in_bounds(plot_args_t* pargs, double x, double y); int ATTRIB_FORMAT(printf,2,3) plotstuff_run_commandf(plot_args_t* pargs, const char* fmt, ...); int plotstuff_output(plot_args_t* pargs); void plotstuff_free(plot_args_t* pargs); /* Reset drawing surface with color (0,0,0) and alpha=0 */ void plotstuff_clear(plot_args_t* pargs); void plotstuff_stack_marker(plot_args_t* pargs, double x, double y); void plotstuff_stack_arrow(plot_args_t* pargs, double x, double y, double x2, double y2); void plotstuff_stack_text(plot_args_t* pargs, cairo_t* cairo, const char* txt, double px, double py); int plotstuff_plot_stack(plot_args_t* pargs, cairo_t* cairo); void plotstuff_get_maximum_rgba(plot_args_t* pargs, int* p_r, int* p_g, int* p_b, int* p_a); /// WCS-related stuff: // in arcsec/pixel double plotstuff_pixel_scale(plot_args_t* pargs); // RA,Dec in degrees // x,y in pixels (cairo coordinates) // Returns TRUE on success. anbool plotstuff_radec2xy(plot_args_t* pargs, double ra, double dec, double* p_x, double* p_y); // RA,Dec in degrees // x,y in pixels (FITS coordinates) // Returns TRUE on success. anbool plotstuff_xy2radec(plot_args_t* pargs, double x, double y, double* pre, double* pdec); // RA,Dec,radius in deg. int plotstuff_get_radec_center_and_radius(plot_args_t* pargs, double* pra, double* pdec, double* pradius); void plotstuff_get_radec_bounds(const plot_args_t* pargs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax); anbool plotstuff_radec_is_inside_image(plot_args_t* pargs, double ra, double dec); int plotstuff_line_constant_ra(plot_args_t* pargs, double ra, double dec1, double dec2, anbool startwithmove); int plotstuff_line_constant_dec(plot_args_t* pargs, double dec, double ra1, double ra2); int plotstuff_line_constant_dec2(plot_args_t* pargs, double dec, double ra1, double ra2, double stepra); int plotstuff_text_xy(plot_args_t* pargs, double ra, double dec, const char* label); int plotstuff_text_radec(plot_args_t* pargs, double ra, double dec, const char* label); int plotstuff_move_to_radec(plot_args_t* pargs, double ra, double dec); int plotstuff_line_to_radec(plot_args_t* pargs, double ra, double dec); int plotstuff_close_path(plot_args_t* pargs); int plotstuff_stroke(plot_args_t* pargs); int plotstuff_fill(plot_args_t* pargs); int plotstuff_stroke_preserve(plot_args_t* pargs); int plotstuff_fill_preserve(plot_args_t* pargs); void plotstuff_move_to(plot_args_t* pargs, double x, double y); void plotstuff_line_to(plot_args_t* pargs, double x, double y); void plotstuff_marker(plot_args_t* pargs, double x, double y); int plotstuff_marker_radec(plot_args_t* pargs, double ra, double dec); int plotstuff_append_doubles(const char* str, dl* lst); void plotstuff_set_dashed(plot_args_t* pargs, double dashlen); void plotstuff_set_solid(plot_args_t* pargs); #endif astrometry.net-0.67/include/astrometry/plotxy.h000644 000765 000024 00000003202 12651445460 022127 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTXY_H #define PLOTXY_H #include "astrometry/plotstuff.h" struct plotxy_args { char* fn; int ext; char* xcol; char* ycol; double xoff, yoff; int firstobj; int nobjs; double scale; // coordinates added with xy_val dl* xyvals; // if WCS is set, x,y are treated as FITS pixel coords; // that is, this are pushed through the WCS unmodified, then the resulting // RA,Dec is pushed through the plot WCS, producing FITS coords, from which // 1,1 is subtracted to yield 0-indexed image coords. anwcs_t* wcs; }; typedef struct plotxy_args plotxy_t; plotxy_t* plot_xy_get(plot_args_t* pargs); // Called prior to cairo surface initialization. void* plot_xy_init(plot_args_t* args); // Set the plot size based on IMAGEW,IMAGEH in the xylist header. int plot_xy_setsize(plot_args_t* args, plotxy_t* xyargs); // Clears the list of points. void plot_xy_clear_list(plotxy_t* args); void plot_xy_set_xcol(plotxy_t* args, const char* col); void plot_xy_set_ycol(plotxy_t* args, const char* col); void plot_xy_set_filename(plotxy_t* args, const char* fn); int plot_xy_set_wcs_filename(plotxy_t* args, const char* fn, int ext); int plot_xy_set_offsets(plotxy_t* args, double xo, double yo); int plot_xy_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_xy_plot(const char* command, cairo_t* cairo, plot_args_t* plotargs, void* baton); void plot_xy_free(plot_args_t* args, void* baton); void plot_xy_vals(plotxy_t* args, double x, double y); DECLARE_PLOTTER(xy); #endif astrometry.net-0.67/include/astrometry/qfits_byteswap.h000644 000765 000024 00000003143 12651445460 023640 0ustar00dstnstaff000000 000000 /* $Id: qfits_byteswap.h,v 1.4 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.4 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_BYTESWAP_H #define QFITS_BYTESWAP_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------- Function ANSI C prototypes -----------------------------------------------------------------------------*/ unsigned short qfits_swap_bytes_16(unsigned short w); unsigned int qfits_swap_bytes_32(unsigned int dw); void qfits_swap_bytes(void * p, int s); #endif astrometry.net-0.67/include/astrometry/qfits_card.h000644 000765 000024 00000003332 12651445460 022713 0ustar00dstnstaff000000 000000 /* $Id: qfits_card.h,v 1.6 2006/02/20 09:45:25 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/20 09:45:25 $ * $Revision: 1.6 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_CARD_H #define QFITS_CARD_H /*----------------------------------------------------------------------------- Function ANSI C prototypes -----------------------------------------------------------------------------*/ void qfits_card_build(char *, const char *, const char *, const char *); // NOT THREAD-SAFE char* qfits_getvalue(const char*); char* qfits_getkey(const char*); char* qfits_expand_keyword(const char*); char* qfits_getcomment(const char*); // Thread-safe versions: char* qfits_getvalue_r(const char *line, char* value); char* qfits_getkey_r(const char *line, char* key); char* qfits_expand_keyword_r(const char* keyword, char* expanded); char* qfits_getcomment_r(const char * line, char* comment); #endif astrometry.net-0.67/include/astrometry/qfits_config.h000644 000765 000024 00000000250 12651445460 023243 0ustar00dstnstaff000000 000000 /* Version number of package */ #define QFITS_VERSION "6.2.0" #include "an-endian.h" #if IS_BIG_ENDIAN #define WORDS_BIGENDIAN 1 #else #undef WORDS_BIGENDIAN #endif astrometry.net-0.67/include/astrometry/qfits_convert.h000644 000765 000024 00000001307 12651445460 023462 0ustar00dstnstaff000000 000000 /** Copyright 2009 Dustin Lang. # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Converts a single pixel from C to FITS format. "ctype" = PTYPE_FLOAT, PTYPE_INT, etc. "fitstype" = BPP_8_UNSIGNED, BPP_16_SIGNED, etc. "cval": pointer to C value (input) "fitsval": pointer to FITS value (output) Does byte-swapping, if necessary. */ int qfits_pixel_ctofits(int ctype, int fitstype, const void* cval, void* fitsval); /** Returns the size in bytes of the given C pixel type. */ int qfits_pixel_ctype_size(int ctype); /** Returns the size in bytes of the given FITS pixel type. */ int qfits_pixel_fitstype_size(int fitstype); astrometry.net-0.67/include/astrometry/qfits_error.h000644 000765 000024 00000003503 12651445460 023133 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_error.h,v 1.4 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.4 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_ERROR_H #define QFITS_ERROR_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ void qfits_warning(const char *fmt, ...); void qfits_error(const char *fmt, ...); int qfits_err_statget(void); int qfits_err_statset(int); void qfits_err_remove_all(void); int qfits_err_register( void (*dispfn)(char*) ); #endif astrometry.net-0.67/include/astrometry/qfits_float.h000644 000765 000024 00000006610 12651445460 023111 0ustar00dstnstaff000000 000000 /* $Id: qfits_float.h,v 1.3 2006/02/17 10:24:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 10:24:52 $ * $Revision: 1.3 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_FLOAT_H #define QFITS_FLOAT_H /*----------------------------------------------------------------------------- Macros -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Test a floating-point variable for NaN value. @param n Number to test (float or double) @return 1 if n is NaN, 0 else. This macro is needed to support both float and double variables as input parameter. It checks on the size of the input variable to branch to the float or double version. Portability is an issue for this function which is present on most Unixes but not all, under various libraries (C lib on BSD, Math lib on Linux, sunmath on Solaris, ...). Integrating the code for this function makes qfits independent from any math library. */ /*----------------------------------------------------------------------------*/ #define qfits_isnan(n) ((sizeof(n)==sizeof(float)) ? _qfits_isnanf(n) : \ (sizeof(n)==sizeof(double)) ? _qfits_isnand(n) : -1) /*----------------------------------------------------------------------------*/ /** @brief Test a floating-point variable for Inf value. @param n Number to test (float or double) @return 1 if n is Inf or -Inf, 0 else. This macro is needed to support both float and double variables as input parameter. It checks on the size of the input variable to branch to the float or double version. Portability is an issue for this function which is missing on most Unixes. Most of the time, another function called finite() is offered to perform the opposite task, but it is not consistent among platforms and found in various libraries. Integrating the code for this function makes qfits independent from any math library. */ /*----------------------------------------------------------------------------*/ #define qfits_isinf(n) ((sizeof(n)==sizeof(float)) ? _qfits_isinff(n) : \ (sizeof(n)==sizeof(double)) ? _qfits_isinfd(n) : -1) /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ int _qfits_isnanf(float); int _qfits_isinff(float); int _qfits_isnand(double); int _qfits_isinfd(double); #endif astrometry.net-0.67/include/astrometry/qfits_header.h000644 000765 000024 00000010355 12651445460 023235 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_header.h,v 1.8 2006/11/22 13:33:42 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/11/22 13:33:42 $ * $Revision: 1.8 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_HEADER_H #define QFITS_HEADER_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include /*----------------------------------------------------------------------------- New types -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief FITS header object This structure represents a FITS header in memory. It is actually no more than a thin layer on top of the keytuple object. No field in this structure should be directly modifiable by the user, only through accessor functions. */ /*----------------------------------------------------------------------------*/ struct qfits_header; typedef struct qfits_header qfits_header; /*----------------------------------------------------------------------------- Function ANSI prototypes -----------------------------------------------------------------------------*/ void qfits_header_debug_dump(const qfits_header*); int qfits_header_list(const qfits_header* hdr, FILE* out); qfits_header * qfits_header_new(void); qfits_header * qfits_header_default(void); int qfits_header_n(const qfits_header*); void qfits_header_add(qfits_header *, const char *, const char *, const char *, const char *); void qfits_header_add_after(qfits_header *, const char *, const char *, const char *, const char *, const char *); void qfits_header_append(qfits_header *, const char *, const char *, const char *, const char *); void qfits_header_del(qfits_header *, const char *); int qfits_header_sort(qfits_header **); qfits_header * qfits_header_copy(const qfits_header *); void qfits_header_mod(qfits_header *, const char *, const char *, const char *); void qfits_header_destroy(qfits_header *); char* qfits_header_getstr(const qfits_header *, const char *); int qfits_header_getstr_pretty(const qfits_header* hdr, const char* key, char* pretty, const char* default_val); int qfits_header_getitem(const qfits_header *, int, char *, char *, char *, char *); /* Note, the "key", "val", "comment", args are copied with "strdup", while "line" is copied with "memcpy(dest, line, 80)", so you must ensure that the string you pass in has at least 80 chars. */ int qfits_header_setitem(qfits_header *, int, char* key, char* val, char* comment, char* line); char * qfits_header_getcom(const qfits_header *, const char *); int qfits_header_getint(const qfits_header *, const char *, int); double qfits_header_getdouble(const qfits_header *, const char *, double); int qfits_header_getboolean(const qfits_header *, const char *, int); int qfits_header_dump(const qfits_header *, FILE *); char * qfits_header_findmatch(const qfits_header * hdr, const char * key); int qfits_header_write_line(const qfits_header* hdr, int line, char* result); #endif astrometry.net-0.67/include/astrometry/qfits_image.h000644 000765 000024 00000013046 12651445460 023067 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_image.h,v 1.9 2006/02/23 11:04:17 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/23 11:04:17 $ * $Revision: 1.9 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_IMAGE_H #define QFITS_IMAGE_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /** C pixel types. */ #define PTYPE_FLOAT 0 #define PTYPE_INT 1 #define PTYPE_DOUBLE 2 #define PTYPE_UINT8 3 /** Astrometry.net only */ #define PTYPE_INT16 4 /** Astrometry.net only */ /* FITS pixel depths */ /* FITS BITPIX=8 */ #define BPP_8_UNSIGNED (8) /* FITS BITPIX=16 */ #define BPP_16_SIGNED (16) /* FITS BITPIX=32 */ #define BPP_32_SIGNED (32) /* FITS BITPIX=-32 */ #define BPP_IEEE_FLOAT (-32) /* FITS BITPIX=-64 */ #define BPP_IEEE_DOUBLE (-64) /* Default BITPIX for output */ #define BPP_DEFAULT BPP_IEEE_FLOAT /* Compute the number of bytes per pixel for a given BITPIX value */ #define BYTESPERPIXEL(x) ( ((x) == BPP_8_UNSIGNED) ? 1 : \ ((x) == BPP_16_SIGNED) ? 2 : \ ((x) == BPP_32_SIGNED) ? 4 : \ ((x) == BPP_IEEE_FLOAT) ? 4 : \ ((x) == BPP_IEEE_DOUBLE) ? 8 : 0 ) /*----------------------------------------------------------------------------- New types -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Alias for unsigned char A 'byte' is just an alias for an unsigned char. It is only defined for readability. */ /*----------------------------------------------------------------------------*/ typedef unsigned char byte; /*----------------------------------------------------------------------------*/ /** @brief qfits dumper control object This structure offers various control parameters to dump a pixel buffer to a FITS file. The buffer will be dumped as requested to the requested file in append mode. Of course, the requested file must be writeable for the operation to succeed. The following example demonstrates how to save a linear ramp sized 100x100 to a FITS file with BITPIX=16. Notice that this code only dumps the pixel buffer, no header information is provided in this case. @code int i, j; int * ibuf; qfitsdumper qd; // Fill a buffer with 100x100 int pixels ibuf = malloc(100 * 100 * sizeof(int)); for (j=0; j<100; j++) { for (i=0; i<100; i++) { ibuf[i+j*100] = i+j; } } qd.filename = "out.fits"; // Output file name qd.npix = 100 * 100; // Number of pixels qd.ptype = PTYPE_INT; // Input buffer type qd.ibuf = ibuf; // Set buffer pointer qd.out_ptype = BPP_16_SIGNED; // Save with BITPIX=16 // Dump buffer to file (error checking omitted for clarity) qfits_pixdump(&qd); free(ibuf); @endcode If the provided output file name is "STDOUT" (all capitals), the function will dump the pixels to the stdout steam (usually the console, could have been re-directed). */ /*----------------------------------------------------------------------------*/ typedef struct qfitsdumper { /** Name of the file to dump to, "STDOUT" to dump to stdout */ const char * filename; /** Number of pixels in the buffer to dump */ int npix; /** Buffer type: PTYPE_FLOAT, PTYPE_INT or PTYPE_DOUBLE */ int ptype; /** Pointer to input integer pixel buffer */ const int * ibuf; /** Pointer to input float pixel buffer */ const float * fbuf; /** Pointer to input double pixel buffer */ const double * dbuf; /** Pointer to generic pixel buffer. */ const void* vbuf; /** Requested BITPIX in output FITS file */ int out_ptype; } qfitsdumper; /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ int qfits_pixdump(const qfitsdumper *); #endif astrometry.net-0.67/include/astrometry/qfits_keywords.h000644 000765 000024 00000001143 12651445460 023647 0ustar00dstnstaff000000 000000 /* This file was added by the Astrometry.net team. Copyright 2007 Dustin Lang. # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef QFITS_KEYWORDS_H #define QFITS_KEYWORDS_H // this snippet borrowed from GNU libc features.h: #if defined __GNUC__ # define GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) #else # define GNUC_PREREQ(maj, min) 0 #endif // new in gcc-3.1: #if GNUC_PREREQ (3, 1) # define Deprecated __attribute__ ((deprecated)) #else # define Deprecated #endif #endif astrometry.net-0.67/include/astrometry/qfits_md5.h000644 000765 000024 00000003025 12651445460 022466 0ustar00dstnstaff000000 000000 /* $Id: qfits_md5.h,v 1.6 2007/01/10 08:53:45 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2007/01/10 08:53:45 $ * $Revision: 1.6 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_MD5_H #define QFITS_MD5_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include /*----------------------------------------------------------------------------- Function ANSI prototypes -----------------------------------------------------------------------------*/ const char * qfits_datamd5(const char *); #endif astrometry.net-0.67/include/astrometry/qfits_memory.h000644 000765 000024 00000007106 12651445460 023315 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_memory.h,v 1.3 2006/02/23 14:15:13 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/23 14:15:13 $ * $Revision: 1.3 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_MEMORY_H #define QFITS_MEMORY_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ #define qfits_malloc(s) qfits_memory_malloc(s, __FILE__,__LINE__) #define qfits_calloc(n,s) qfits_memory_calloc(n,s, __FILE__,__LINE__) #define qfits_realloc(p,s) qfits_memory_realloc(p,s, __FILE__,__LINE__) #define qfits_free(p) qfits_memory_free(p, __FILE__,__LINE__) #define qfits_strdup(s) qfits_memory_strdup(s, __FILE__,__LINE__) #define qfits_falloc(f,o,s) qfits_memory_falloc(f,o,s, __FILE__,__LINE__) #define qfits_fdealloc(f,o,s) qfits_memory_fdealloc(f,o,s,__FILE__,__LINE__) #define qfits_falloc2(f,o,s,fa,fs) qfits_memory_falloc2(f,o,s,fa,fs, __FILE__,__LINE__) #define qfits_fdealloc2(p,s) qfits_memory_fdealloc2(p,s,__FILE__,__LINE__) /*----------------------------------------------------------------------------- Function prototypes -----------------------------------------------------------------------------*/ /* *********************************************************************** */ /* These functions have to be called by the assiciated macro defined above */ void * qfits_memory_malloc(size_t, const char *, int); void * qfits_memory_calloc(size_t, size_t, const char *, int); void * qfits_memory_realloc(void *, size_t, const char *, int); void qfits_memory_free(void *, const char *, int); char * qfits_memory_strdup(const char *, const char *, int); char * qfits_memory_falloc(const char *, size_t, size_t *, const char *, int); void qfits_memory_fdealloc(void *, size_t, size_t, const char *, int); /* *********************************************************************** */ void* qfits_memory_falloc2( const char* name, size_t offs, size_t size, char** freeaddr, size_t* freesize, const char * srcname, int srclin); void qfits_memory_fdealloc2( void * ptr, size_t len, const char * filename, int lineno); void qfits_memory_status(void); int qfits_memory_is_empty(void); #endif astrometry.net-0.67/include/astrometry/qfits_rw.h000644 000765 000024 00000003201 12651445460 022425 0ustar00dstnstaff000000 000000 /* $Id: qfits_rw.h,v 1.9 2006/02/20 09:45:25 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/20 09:45:25 $ * $Revision: 1.9 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_RW_H #define QFITS_RW_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include "astrometry/qfits_header.h" /*----------------------------------------------------------------------------- Function ANSI prototypes -----------------------------------------------------------------------------*/ qfits_header * qfits_header_read_hdr_string(const unsigned char *, int); void qfits_zeropad(const char *); int qfits_is_fits(const char *); int is_blank_line(const char * s); #endif astrometry.net-0.67/include/astrometry/qfits_std.h000644 000765 000024 00000003360 12651445460 022575 0ustar00dstnstaff000000 000000 /* $Id: qfits_std.h,v 1.5 2006/02/17 13:51:52 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/17 13:51:52 $ * $Revision: 1.5 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_STD_H #define QFITS_STD_H /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ // does qfits think this platform is big-endian? int qfits_is_platform_big_endian(void); // Not POSIX; doesn't exist in Solaris 10 #include #ifndef MIN #define MIN(a,b) (((a)<(b))?(a):(b)) #endif #ifndef MAX #define MAX(a,b) (((a)>(b))?(a):(b)) #endif #define QFITS_THREAD_UNSAFE {} /* FITS header constants */ /** FITS block size */ #define FITS_BLOCK_SIZE (2880) /** FITS number of cards per block */ #define FITS_NCARDS (36) /** FITS size of each line in bytes */ #define FITS_LINESZ (80) #endif astrometry.net-0.67/include/astrometry/qfits_table.h000644 000765 000024 00000024307 12651445460 023076 0ustar00dstnstaff000000 000000 /* Note: this file has been modified from its original form by the Astrometry.net team. For details see http://astrometry.net */ /* $Id: qfits_table.h,v 1.9 2006/02/20 09:45:25 yjung Exp $ * * This file is part of the ESO QFITS Library * Copyright (C) 2001-2004 European Southern Observatory * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * $Author: yjung $ * $Date: 2006/02/20 09:45:25 $ * $Revision: 1.9 $ * $Name: qfits-6_2_0 $ */ #ifndef QFITS_TABLE_H #define QFITS_TABLE_H /*----------------------------------------------------------------------------- Includes -----------------------------------------------------------------------------*/ #include #include #include #include #include "astrometry/qfits_header.h" /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* The following defines the maximum acceptable size for a FITS value */ #define FITSVALSZ 60 #define QFITS_INVALIDTABLE 0 #define QFITS_BINTABLE 1 #define QFITS_ASCIITABLE 2 /*----------------------------------------------------------------------------- New types -----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ /** @brief Column data type */ /*----------------------------------------------------------------------------*/ typedef enum _TFITS_DATA_TYPE_ { TFITS_ASCII_TYPE_A, TFITS_ASCII_TYPE_D, TFITS_ASCII_TYPE_E, TFITS_ASCII_TYPE_F, TFITS_ASCII_TYPE_I, TFITS_BIN_TYPE_A, TFITS_BIN_TYPE_B, TFITS_BIN_TYPE_C, TFITS_BIN_TYPE_D, TFITS_BIN_TYPE_E, TFITS_BIN_TYPE_I, TFITS_BIN_TYPE_J, TFITS_BIN_TYPE_K, TFITS_BIN_TYPE_L, TFITS_BIN_TYPE_M, TFITS_BIN_TYPE_P, TFITS_BIN_TYPE_X, TFITS_BIN_TYPE_UNKNOWN } tfits_type; /*----------------------------------------------------------------------------*/ /** @brief Column object This structure contains all information needed to read a column in a table. These informations come from the header. The qfits_table object contains a list of qfits_col objects. This structure has to be created from scratch and filled if one want to generate a FITS table. */ /*----------------------------------------------------------------------------*/ typedef struct qfits_col { /** Number of atoms in one field. In ASCII tables, it is the number of characters in the field as defined in TFORM%d keyword. In BIN tables, it is the number of atoms in each field. For type 'A', it is the number of characters. A field with two complex object will have atom_nb = 4. */ int atom_nb; /** Number of decimals in a ASCII field. This value is always 0 for BIN tables */ int atom_dec_nb; /** Size of one element in bytes. In ASCII tables, atom_size is the size of the element once it has been converted in its 'destination' type. For example, if "123" is contained in an ASCII table in a column defined as I type, atom_nb=3, atom_size=4. In ASCII tables: - type 'A' : atom_size = atom_nb = number of chars - type 'I', 'F' or 'E' : atom_size = 4 - type 'D' : atom_size = 8 In BIN tables : - type 'A', 'L', 'X', 'B': atom_size = 1 - type 'I' : atom_size = 2 - type 'E', 'J', 'C', 'P' : atom_size = 4 - type 'D', 'M' : atom_size = 8 In ASCII table, there is one element per field. The size in bytes and in number of characters is atom_nb, and the size in bytes after conversion of the field is atom_size. In BIN tables, the size in bytes of a field is always atom_nb*atom_size. */ int atom_size; /** Type of data in the column as specified in TFORM keyword In ASCII tables : TFITS_ASCII_TYPE_* with *=A, I, F, E or D In BIN tables : TFITS_BIN_TYPE_* with *=L, X, B, I, J, A, E, D, C, M or P */ tfits_type atom_type; /** Label of the column */ char tlabel[FITSVALSZ]; /** Unit of the data */ char tunit[FITSVALSZ]; /** Null value */ char nullval[FITSVALSZ]; /** Display format */ char tdisp[FITSVALSZ]; /** zero and scale are used when the quantity in the field does not represent a true physical quantity. Basically, thez should be used when they are present: physical_value = zero + scale * field_value They are read from TZERO and TSCAL in the header */ int zero_present; float zero; int scale_present; float scale; /** Offset between the beg. of the table and the beg. of the column. NOTE, THIS IS NOT THE OFFSET FROM THE BEGINNING OF THE *ROW*! */ int off_beg; /** Flag to know if the column is readable. An empty col is not readable */ int readable; } qfits_col; /*----------------------------------------------------------------------------*/ /** @brief Table object This structure contains all information needed to read a FITS table. These information come from the header. The object is created by qfits_open(). To read a FITS table, here is a code example: @code int main(int argc, char* argv[]) { qfits_table * table; int n_ext; int i; // Query the number of extensions n_ext = qfits_query_n_ext(argv[1]); // For each extension for (i=0; i #include #include /*----------------------------------------------------------------------------- Defines -----------------------------------------------------------------------------*/ /* Unknown type for FITS value */ #define QFITS_UNKNOWN 0 /* Boolean type for FITS value */ #define QFITS_BOOLEAN 1 /* Int type for FITS value */ #define QFITS_INT 2 /* Float type for FITS value */ #define QFITS_FLOAT 3 /* Complex type for FITS value */ #define QFITS_COMPLEX 4 /* String type for FITS value */ #define QFITS_STRING 5 #include "astrometry/qfits_std.h" size_t qfits_blocks_needed(size_t size); /*----------------------------------------------------------------------------- Function codes -----------------------------------------------------------------------------*/ char* qfits_pretty_string_r(const char* in, char* out); int qfits_is_boolean(const char *); int qfits_is_int(const char *); int qfits_is_float(const char *); int qfits_is_complex(const char *); int qfits_is_string(const char *); int qfits_get_type(const char *); const char * qfits_version(void); #endif astrometry.net-0.67/include/astrometry/qidxfile.h000644 000765 000024 00000002036 12651445460 022401 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef QIDXFILE_H #define QIDXFILE_H #include #include #include "astrometry/qfits_header.h" #include "astrometry/fitsbin.h" struct qidxfile { int numstars; int numquads; int dimquads; fitsbin_t* fb; // when reading: uint32_t* index; uint32_t* heap; uint32_t cursor_index; uint32_t cursor_heap; }; typedef struct qidxfile qidxfile; int qidxfile_close(qidxfile* qf); // Sets "quads" to a pointer within the qidx's data block. // DO NOT free this pointer! // It is valid until the qidxfile is closed. int qidxfile_get_quads(const qidxfile* qf, int starid, uint32_t** quads, int* nquads); int qidxfile_write_star(qidxfile* qf, int* quads, int nquads); int qidxfile_write_header(qidxfile* qf); qidxfile* qidxfile_open(const char* fname); qidxfile* qidxfile_open_for_writing(const char* qidxfname, int nstars, int nquads); qfits_header* qidxfile_get_header(const qidxfile* qf); #endif astrometry.net-0.67/include/astrometry/quad-builder.h000644 000765 000024 00000005017 12651445460 023154 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef QUAD_BUILDER_H #define QUAD_BUILDER_H #include "astrometry/an-bool.h" struct potential_quad { double midAB[3]; double Ax, Ay; double costheta, sintheta; int iA, iB; int staridA, staridB; int* inbox; int ninbox; anbool scale_ok; // user-defined check passed? anbool check_ok; }; typedef struct potential_quad pquad_t; struct quadbuilder; typedef struct quadbuilder quadbuilder_t; struct quadbuilder { // FIXME -- could replace this with a function to get xyz for a given index // (eg, using starkd) double* starxyz; // Indices into a (presumed) larger array. Ie, it's expected that you're // cutting down to a subset of the stars, in "starxyz", whose indices are in // "starinds", and the number of which is "Nstars". // (thus "starinds" has length "Nstars" but its contents can be > Nstars) int* starinds; int Nstars; int dimquads; // scale limits, in diameter-squared on the unit sphere double quadd2_low; double quadd2_high; // enable scale checks? anbool check_scale_low; anbool check_scale_high; // FIXME -- could add a method to find potential B stars given an A star. // (eg, allquads) // called to check whether a choice of stars A,B is acceptable. anbool (*check_AB_stars)(quadbuilder_t* qb, pquad_t* pq, void* token); void* check_AB_stars_token; // called when the third, fourth, ... stars are added. anbool (*check_partial_quad)(quadbuilder_t* qb, unsigned int* quad, int nstars, void* token); void* check_partial_quad_token; // called when all the stars have been added. anbool (*check_full_quad)(quadbuilder_t* qb, unsigned int* quad, int nstars, void* token); void* check_full_quad_token; // called to decide which of the given stars are accetable. // must compact the acceptable star indices into the bottom of the "sC" array and // return the new number of acceptable stars. int (*check_internal_stars)(quadbuilder_t* qb, int sA, int sB, int* sC, int NC, void* token); void* check_internal_stars_token; // called when an acceptable quad has been found. void (*add_quad)(quadbuilder_t* qb, unsigned int* stars, void* token); void* add_quad_token; // set this to stop a qb_create() call. anbool stop_creating; // int nbadscale; // internal: int Ncq; void* pquads; //pquad_t* pquads; int* inbox; }; int quadbuilder_create(quadbuilder_t* qb); quadbuilder_t* quadbuilder_init(); void quadbuilder_free(quadbuilder_t* qb); //void quadbuilder_free_static(); #endif astrometry.net-0.67/include/astrometry/quad-utils.h000644 000765 000024 00000001370 12651445460 022664 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef QUAD_UTILS_H #define QUAD_UTILS_H #include "astrometry/starkd.h" #include "astrometry/codefile.h" #include "astrometry/quadfile.h" #include "astrometry/an-bool.h" void quad_compute_star_code(const double* starxyz, double* code, int dimquads); void quad_flip_parity(const double* code, double* flipcode, int dimcode); int quad_compute_code(const unsigned int* quad, int dimquads, startree_t* starkd, double* code); void quad_enforce_invariants(unsigned int* quad, double* code, int dimquads, int dimcodes); anbool quad_obeys_invariants(unsigned int* quad, double* code, int dimquads, int dimcodes); #endif astrometry.net-0.67/include/astrometry/quadfile.h000644 000765 000024 00000004151 12651445460 022366 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef QUADFILE_H #define QUADFILE_H #include #include #include "astrometry/qfits_header.h" #include "astrometry/fitsbin.h" #include "astrometry/anqfits.h" typedef struct { unsigned int numquads; unsigned int numstars; int dimquads; // upper bound of AB distance of quads in this index double index_scale_upper; // lower bound double index_scale_lower; // unique ID of this index int indexid; // healpix covered by this index int healpix; // Nside of the healpixelization int hpnside; fitsbin_t* fb; // when reading: uint32_t* quadarray; } quadfile_t; quadfile_t* quadfile_open(const char* fname); quadfile_t* quadfile_open_fits(anqfits_t* fits); char* quadfile_get_filename(const quadfile_t* qf); quadfile_t* quadfile_open_for_writing(const char* quadfname); quadfile_t* quadfile_open_in_memory(void); int quadfile_switch_to_reading(quadfile_t* qf); int quadfile_close(quadfile_t* qf); // Look at each quad, and ensure that the star ids it contains are all // less than the number of stars ("numstars"). Returns 0=ok, -1=problem int quadfile_check(const quadfile_t* qf); // Copies the star ids of the stars that comprise quad "quadid". // There will be qf->dimquads such stars. // (this will be less than starutil.h : DQMAX, for ease of static // allocation of arrays that will hold quads of stars) int quadfile_get_stars(const quadfile_t* qf, unsigned int quadid, unsigned int* stars); int quadfile_write_quad(quadfile_t* qf, unsigned int* stars); int quadfile_dimquads(const quadfile_t* qf); int quadfile_nquads(const quadfile_t* qf); int quadfile_fix_header(quadfile_t* qf); int quadfile_write_header(quadfile_t* qf); double quadfile_get_index_scale_upper_arcsec(const quadfile_t* qf); double quadfile_get_index_scale_lower_arcsec(const quadfile_t* qf); qfits_header* quadfile_get_header(const quadfile_t* qf); int quadfile_write_header_to(quadfile_t* qf, FILE* fid); int quadfile_write_all_quads_to(quadfile_t* qf, FILE* fid); #endif astrometry.net-0.67/include/astrometry/rdlist.h000644 000765 000024 00000005646 12651445460 022107 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef RDLIST_H #define RDLIST_H #include #include #include "astrometry/xylist.h" #include "astrometry/starutil.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_RDLS "RDLS" typedef xylist_t rdlist_t; struct rd_t { double* ra; double* dec; int N; }; typedef struct rd_t rd_t; void rd_getradec(const rd_t* f, int i, double* ra, double* dec); double rd_getra (rd_t* f, int i); double rd_getdec(rd_t* f, int i); void rd_setra (rd_t* f, int i, double ra); void rd_setdec(rd_t* f, int i, double dec); int rd_n(rd_t* f); void rd_from_dl(rd_t* r, dl* l); void rd_from_array(rd_t* r, double* radec, int N); // Just free the data, not the field itself. void rd_free_data(rd_t* f); void rd_free(rd_t* f); void rd_alloc_data(rd_t* f, int N); rd_t* rd_alloc(int N); void rd_copy(rd_t* dest, int dest_offset, const rd_t* src, int src_offset, int N); rd_t* rd_get_subset(const rd_t* src, int offset, int N); rdlist_t* rdlist_open(const char* fn); rdlist_t* rdlist_open_for_writing(const char* fn); //void rdlist_set_antype(rdlist_t* ls, const char* type); #define rdlist_set_antype xylist_set_antype void rdlist_set_raname(rdlist_t* ls, const char* name); void rdlist_set_decname(rdlist_t* ls, const char* name); void rdlist_set_ratype(rdlist_t* ls, tfits_type type); void rdlist_set_dectype(rdlist_t* ls, tfits_type type); void rdlist_set_raunits(rdlist_t* ls, const char* units); void rdlist_set_decunits(rdlist_t* ls, const char* units); //int rdlist_write_primary_header(rdlist_t* ls); #define rdlist_write_primary_header xylist_write_primary_header #define rdlist_fix_primary_header xylist_fix_primary_header //void rdlist_next_field(rdlist_t* ls); #define rdlist_next_field xylist_next_field #define rdlist_open_field xylist_open_field #define rdlist_n_fields xylist_n_fields //int rdlist_write_header(rdlist_t* ls); #define rdlist_write_header xylist_write_header int rdlist_write_field(rdlist_t* ls, rd_t* fld); int rdlist_write_one_row(rdlist_t* ls, rd_t* fld, int row); int rdlist_write_one_radec(rdlist_t* ls, double ra, double dec); #define rdlist_add_tagalong_column xylist_add_tagalong_column #define rdlist_write_tagalong_column xylist_write_tagalong_column #define rdlist_read_tagalong_column xylist_read_tagalong_column // (input rd_t* is optional; if not given, a new one is allocated and returned.) rd_t* rdlist_read_field(rdlist_t* ls, rd_t* fld); rd_t* rdlist_read_field_num(rdlist_t* ls, int ext, rd_t* fld); //int rdlist_fix_header(rdlist_t* ls); #define rdlist_fix_header xylist_fix_header //int rdlist_close(rdlist_t* ls); #define rdlist_close xylist_close //qfits_header* rdlist_get_primary_header(rdlist_t* ls); #define rdlist_get_primary_header xylist_get_primary_header //qfits_header* rdlist_get_header(rdlist_t* ls); #define rdlist_get_header xylist_get_header #endif astrometry.net-0.67/include/astrometry/resample.h000644 000765 000024 00000002220 12651445460 022377 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef RESAMPLE_H #define RESAMPLE_H typedef struct { int order; int weighted; } lanczos_args_t; /*** All the lanczos_* functions take a "lanczos_args_t*". for their "void* token". They're declared this way for ease of generic use as callbacks (eg in coadd.c) */ double lanczos(double x, int order); double nearest_resample_f(double px, double py, const float* img, const float* weightimg, int W, int H, double* out_wt, void* token); double lanczos_resample_f(double px, double py, const float* img, const float* weightimg, int W, int H, double* out_wt, void* token); double lanczos_resample_unw_sep_f(double px, double py, const float* img, int W, int H, void* token); double nearest_resample_d(double px, double py, const double* img, const double* weightimg, int W, int H, double* out_wt, void* token); double lanczos_resample_d(double px, double py, const double* img, const double* weightimg, int W, int H, double* out_wt, void* token); #endif astrometry.net-0.67/include/astrometry/resort-xylist.h000644 000765 000024 00000001203 12651445460 023437 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef RESORT_XYLIST_H #define RESORT_XYLIST_H /* Sorts the xylist in *infn*, writing the output to *outfn*. The sorting order is strange. The algorithm first performs two indirect sorts, by flux and by flux+background. It then interleaves these two results, without duplication. This can be useful if you don't really trust the background subtraction... */ int resort_xylist(const char* infn, const char* outfn, const char* fluxcol, const char* backcol, int ascending); #endif astrometry.net-0.67/include/astrometry/scamp-catalog.h000644 000765 000024 00000003761 12651445460 023315 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SCAMP_CATALOG_H #define SCAMP_CATALOG_H #include "astrometry/fitstable.h" #include "astrometry/qfits_header.h" #include "astrometry/an-bool.h" struct scamp_catalog { fitstable_t* table; anbool ref; }; typedef struct scamp_catalog scamp_cat_t; // These definitions are imported from SExtractor 2.5.0, and should // be OR'd together to form the "flags" field. // "The object has neighbours, bright and close enough to significantly bias // the photometry; or bad pixels. #define SCAMP_FLAG_CROWDED 0x0001 // The object was blended with another one. #define SCAMP_FLAG_MERGED 0x0002 // At least one pixel is saturated #define SCAMP_FLAG_SATUR 0x0004 // The object is too close to an image boundary #define SCAMP_FLAG_TRUNC 0x0008 // Aperture data incorrect #define SCAMP_FLAG_APERT_PB 0x0010 // Isophotal data incorrect #define SCAMP_FLAG_ISO_PB 0x0020 // Memory overflow during deblending (!) #define SCAMP_FLAG_DOVERFLOW 0x0040 // Memory overflow during extraction (!) #define SCAMP_FLAG_OVERFLOW 0x0080 struct scamp_catalog_object { double x; double y; double err_a; double err_b; double err_theta; double flux; double err_flux; int16_t flags; }; typedef struct scamp_catalog_object scamp_obj_t; struct scamp_reference_object { double ra; double dec; double err_a; double err_b; //double err_theta; double mag; double err_mag; //int16_t flags; }; typedef struct scamp_reference_object scamp_ref_t; scamp_cat_t* scamp_catalog_open_for_writing(const char* filename, anbool reference); int scamp_catalog_write_field_header(scamp_cat_t* scamp, const qfits_header* hdr); int scamp_catalog_write_object(scamp_cat_t* scamp, const scamp_obj_t* obj); int scamp_catalog_write_reference(scamp_cat_t* scamp, const scamp_ref_t* ref); int scamp_catalog_close(scamp_cat_t* scamp); #endif astrometry.net-0.67/include/astrometry/scamp.h000644 000765 000024 00000001424 12651445460 021677 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef BLIND_SCAMP_H #define BLIND_SCAMP_H #include "astrometry/qfits_header.h" #include "astrometry/sip.h" #include "astrometry/starxy.h" int scamp_write_field(const qfits_header* imageheader, const sip_t* wcs, const starxy_t* xy, const char* filename); // Writes a Scamp config file snippet describing the reference and input catalogs // we generate. int scamp_write_config_file(const char* refcatfn, const char* outfn); // Returns a newly-allocated Scamp config file snippet describing the reference // and input catalogs we generate. char* scamp_get_config_options(const char* refcatfn); #endif astrometry.net-0.67/include/astrometry/simplexy-common.h000644 000765 000024 00000000477 12651445460 023743 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Common declarations and syntactic candy. */ #ifndef SIMPLEXY_COMMON_H #define SIMPLEXY_COMMON_H #include #define PI M_PI #define FREEVEC(a) {if((a)!=NULL) free((a)); (a)=NULL;} #endif astrometry.net-0.67/include/astrometry/simplexy.h000644 000765 000024 00000004575 12651445460 022460 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SIMPLEXY2_H #define SIMPLEXY2_H #include "astrometry/an-bool.h" #define SIMPLEXY_DEFAULT_DPSF 1.0 #define SIMPLEXY_DEFAULT_PLIM 8.0 #define SIMPLEXY_DEFAULT_DLIM 1.0 #define SIMPLEXY_DEFAULT_SADDLE 5.0 #define SIMPLEXY_DEFAULT_MAXPER 1000 #define SIMPLEXY_DEFAULT_MAXSIZE 2000 #define SIMPLEXY_DEFAULT_HALFBOX 100 #define SIMPLEXY_DEFAULT_MAXNPEAKS 10000 #define SIMPLEXY_U8_DEFAULT_PLIM 4.0 #define SIMPLEXY_U8_DEFAULT_SADDLE 2.0 struct simplexy_t { /****** Inputs ******/ float *image; unsigned char* image_u8; int nx; int ny; /* gaussian psf width (sigma, not FWHM) */ float dpsf; /* significance to keep */ float plim; /* closest two peaks can be */ float dlim; /* saddle difference (in sig) */ float saddle; /* maximum number of peaks per object */ int maxper; /* maximum number of peaks total */ int maxnpeaks; /* maximum size for extended objects */ int maxsize; /* size for sliding sky estimation box */ int halfbox; // (boolean) don't do background subtraction. int nobgsub; // global background. float globalbg; // (boolean) invert the image before processing (for black-on-white images) int invert; // If set to non-zero, the given sigma value will be used; // otherwise a value will be estimated. float sigma; /****** Outputs ******/ float *x; float *y; float *flux; float *background; int npeaks; // Lanczos-interpolated flux and backgrounds; // measured if Lorder > 0. int Lorder; float* fluxL; float* backgroundL; /*** Debug ***/ // The filename for saving the background-subtracted FITS image. const char* bgimgfn; const char* maskimgfn; const char* blobimgfn; const char* bgsubimgfn; const char* smoothimgfn; }; typedef struct simplexy_t simplexy_t; void simplexy_set_defaults(simplexy_t* s); // Really this is for limited-dynamic-range images, not u8 as such... void simplexy_set_u8_defaults(simplexy_t* i); // Set default values for any fields that are zero. void simplexy_fill_in_defaults(simplexy_t* s); void simplexy_fill_in_defaults_u8(simplexy_t* s); int simplexy_run(simplexy_t* s); void simplexy_free_contents(simplexy_t* s); void simplexy_clean_cache(); #endif astrometry.net-0.67/include/astrometry/sip-utils.h000644 000765 000024 00000007473 12651445460 022537 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SIP_UTILS_H #define SIP_UTILS_H #include "astrometry/sip.h" double wcs_pixel_center_for_size(double size); int sip_ensure_inverse_polynomials(sip_t* sip); /** sip->a_order, sip->b_order, sip->a, and sip->b must be set. sip->ap_order and sip->bp_order must be set. Computes sip->ap and sip->bp by inverting the forward polynomial evaluated on a regular grid of points, NX x NY, between xlo,xhi and ylo,yhi. If NX,NY are 0, a reasonable default will be chosen. If xlo=xhi=0 or ylo=yhi=0, the bounds of the image (from sip->wcstan.imagew/h) will be used. */ int sip_compute_inverse_polynomials(sip_t* sip, int NX, int NY, double xlo, double xhi, double ylo, double yhi); /* Finds stars that are inside the bounds of a given field (wcs). One of "sip" or "tan" must be non-NULL; if "sip" is non-NULL it is used. One of "xyz" or "radec" must be non-NULL. If both are non-NULL, xyz is used. "N" indicates how many elements are in these arrays. "radec" are in degrees. If "inds" is non-NULL, the indices of stars that are inside the field are put there; otherwise a new int array is allocated and returned; it should be free()'d. The pixel (xy) positions are placed into a newly-allocated array at "xy", unless "xy" is NULL. The number of good stars is placed in Ngood, which must be non-NULL. */ int* sip_filter_stars_in_field(const sip_t* sip, const tan_t* tan, const double* xyz, const double* radec, int N, double** xy, int* inds, int* Ngood); /** Returns the bounds of the image in RA,Dec space, approximately, by walking the boundary of the image in steps of size "stepsize". Return values satisfy: -90 <= decmin <= decmax <= 90 ramin <= ramax ramin may be < 0, or ramax > 360, if the image straddles RA=0. */ void sip_get_radec_bounds(const sip_t* wcs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax); void sip_walk_image_boundary(const sip_t* wcs, double stepsize, void (*callback)(const sip_t* wcs, double x, double y, double ra, double dec, void* token), void* token); // sets RA,Dec in degrees. void sip_get_radec_center(const sip_t* wcs, double* p_ra, double* p_dec); void tan_get_radec_center(const tan_t* wcs, double* p_ra, double* p_dec); double sip_get_radius_deg(const sip_t* wcs); double tan_get_radius_deg(const tan_t* wcs); // RA hours:minutes:seconds, Dec degrees:minutes:seconds void sip_get_radec_center_hms(const sip_t* wcs, int* rah, int* ram, double* ras, int* decsign, int* decd, int* decm, double* decs); anbool sip_pixel_is_inside_image(const sip_t* wcs, double px, double py); anbool sip_is_inside_image(const sip_t* wcs, double ra, double dec); // Writes RA, Dec H:M:S and D:M:S strings. void sip_get_radec_center_hms_string(const sip_t* wcs, char* rastr, char* decstr); void sip_get_field_size(const sip_t* wcs, double* pw, double* ph, char** units); void sip_shift(const sip_t* sipin, sip_t* sipout, double xlo, double xhi, double ylo, double yhi); anbool tan_pixel_is_inside_image(const tan_t* wcs, double px, double py); anbool tan_is_inside_image(const tan_t* wcs, double ra, double dec); void tan_transform(const tan_t* tanin, tan_t* tanout, double xlo, double xhi, double ylo, double yhi, double scale); void tan_scale(const tan_t* tanin, tan_t* tanout, double scale); void sip_scale(const sip_t* tanin, sip_t* tanout, double scale); void tan_rotate(const tan_t* tanin, tan_t* tanout, double rotate); #endif astrometry.net-0.67/include/astrometry/sip.h000644 000765 000024 00000020475 12651445460 021376 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef ANSIP_H #define ANSIP_H #include #include "astrometry/an-bool.h" #include "astrometry/keywords.h" #define SIP_MAXORDER 10 // WCS TAN header. typedef struct { // World coordinate of the tangent point, in ra,dec. double crval[2]; // Tangent point location in pixel (CCD) coordinates // This may not be in the image; consider a telescope with an array of // CCD's, where the tangent point is in one or none of the CCD's. double crpix[2]; // Matrix for the linear transformation of relative pixel coordinates // (u,v) onto "intermediate world coordinates", which are in degrees // (x,y). The x,y coordinates are on the tangent plane. If the SIP // terms are all zero, then the equation to get from pixel coordinates // to intermediate world coordinates is: // // u = pixel_x - crpix0 // v = pixel_y - crpix1 // // x = [cd00 cd01] * u // y [cd10 cd11] v // // where x,y are in intermediate world coordinates (i.e. x points // along negative ra and y points to positive dec) and u,v are in pixel // coordinates. double cd[2][2]; // size of the image in pixels. Not strictly part of the WCS, but useful! double imagew; double imageh; // SIN projection rather than TAN. anbool sin; } tan_t; // Flat structure for minimal SIP wcs. This structure should contain enough // information to effectively represent any image, provided it is possible to // convert that image's projecton to a TAN projection and the distortion to SIP // distortion. typedef struct { // A basic TAN header. tan_t wcstan; // Forward SIP coefficients // The transformation from relative pixel coordinates to intermediate // world coordinates[1] is: // // x = [cd00 cd01] * (u + f(u,v)) x,y are intermediate coordinates on the sky (in deg) // y [cd10 cd11] (v + g(u,v)) which are just a "translation" away from final WCS // u,v are original (unwarped) pixel coordinates // where // p q // U = u + f(u,v) = u + SUM a[p][q] * u * v , p+q <= a_order // p,q // // p q // V = v + g(u,v) = v + SUM b[p][q] * u * v , p+q <= b_order // p,q // // [1] The SIP convention for representing distortion in FITS image // headers. D. L. Shupe, M.Moshir, J. Li, D. Makovoz, R. Narron, R. N. // Hook. Astronomical Data Analysis Software and Systems XIV. // http://ssc.spitzer.caltech.edu/postbcd/doc/shupeADASS.pdf // // Note: These matricies are larger than they strictly need to be // because aij = 0 if i+j > a_order and similarily for b. // // Note: The convention for indicating that no SIP polynomial is // present is to simply set [ab]_order to zero. int a_order, b_order; double a[SIP_MAXORDER][SIP_MAXORDER]; double b[SIP_MAXORDER][SIP_MAXORDER]; // Inverse SIP coefficients // To convert from world coordinates back into image coordinates, the // inverse transformation may be stored. To convert from intermediate // world coordinates, first we calculate the linear pixel coordinates: // // -1 // U = [cd00 cd01] * x // V [cd10 cd11] y // // Then, the original pixel coordinates are computed as: // // p q // u = U + SUM ap[p][q] * U * V , p+q <= ap_order // p,q // // p q // v = V + SUM bp[p][q] * U * V , p+q <= ap_order // p,q // // Note: ap_order does not necessarily equal a_order, because the // inverse of a nth-order polynomial may be of higer order than n. // // Note: The convention for indicating that no inverse SIP polynomial // is present is to simply set [ab]p_order to zero. int ap_order, bp_order; double ap[SIP_MAXORDER][SIP_MAXORDER]; double bp[SIP_MAXORDER][SIP_MAXORDER]; } sip_t; sip_t* sip_create(void); void sip_free(sip_t* sip); void sip_copy(sip_t* dest, const sip_t* src); // Set the given SIP wcs to the given TAN wcs. void sip_wrap_tan(const tan_t* tan, sip_t* sip); double sip_imagew(sip_t* sip); double sip_imageh(sip_t* sip); // Pixels to RA,Dec in degrees. void sip_pixelxy2radec(const sip_t* sip, double px, double py, double *a, double *d); // Pixels to XYZ unit vector. void sip_pixelxy2xyzarr(const sip_t* sip, double px, double py, double *xyz); // RA,Dec in degrees to Pixels. // Returns FALSE if the point is on the opposite side of the sphere (and hence the point // does not project onto the tangent plane) WarnUnusedResult anbool sip_radec2pixelxy(const sip_t* sip, double a, double d, double *px, double *py); WarnUnusedResult anbool sip_radec2pixelxy_check(const sip_t* sip, double ra, double dec, double *px, double *py); WarnUnusedResult anbool sip_xyzarr2pixelxy(const sip_t* sip, const double* xyz, double *px, double *py); WarnUnusedResult anbool sip_xyz2pixelxy(const sip_t* sip, double x, double y, double z, double *px, double *py); // Pixels to Intermediate World Coordinates in degrees. void sip_pixelxy2iwc(const sip_t* sip, double px, double py, double *iwcx, double* iwcy); double tan_det_cd(const tan_t* tan); double sip_det_cd(const sip_t* sip); // returns pixel scale in arcseconds/pixel (NOT arcsec^2) double tan_pixel_scale(const tan_t* tn); double sip_pixel_scale(const sip_t* sip); // these take *relative* pixel coords (WRT crpix) void sip_calc_inv_distortion(const sip_t* sip, double U, double V, double* u, double *v); void sip_calc_distortion(const sip_t* sip, double u, double v, double* U, double *V); // Applies forward SIP distortion to pixel coords. // This applies the A,B matrix terms; // This is the distortion applied in the pixel-to-RA,Dec direction. // (pix -> "un"distorted -> TAN -> RA,Dec) void sip_pixel_distortion(const sip_t* sip, double x, double y, double *p_x, double *p_y); // Reverses sip_pixel_distortion; // Applies "reverse" SIP distortion: the AP, BP matrices; // This is the distortion applied in the RA,Dec-to-pixel direction: // (RA,Dec -> TAN -> undistorted -> pix) void sip_pixel_undistortion(const sip_t* sip, double x, double y, double *p_x, double *p_y); // Pixels to XYZ unit vector. void tan_pixelxy2xyzarr(const tan_t* tan, double px, double py, double *xyz); // Pixels to RA,Dec in degrees. void tan_pixelxy2radec(const tan_t* wcs_tan, double px, double py, double *ra, double *dec); // Pixels to RA,Dec in degrees. void tan_pixelxy2radecarr(const tan_t* wcs_tan, double px, double py, double *radec); // RA,Dec in degrees to Pixels. // Returns FALSE if the point is on the opposite side of the sphere. WarnUnusedResult anbool tan_radec2pixelxy(const tan_t* wcs_tan, double ra, double dec, double *px, double *py); // xyz unit vector to Pixels. // Returns TRUE if all is good. WarnUnusedResult anbool tan_xyzarr2pixelxy(const tan_t* wcs_tan, const double* xyz, double *px, double *py); void tan_iwc2pixelxy(const tan_t* tan, double iwcx, double iwcy, double *px, double* py); void tan_iwc2xyzarr(const tan_t* tan, double x, double y, double *xyz); void tan_iwc2radec(const tan_t* tan, double x, double y, double *p_ra, double *p_dec); /** Subtracts off CRPIX, multiplies by CD matrix. Results are in degrees. */ void tan_pixelxy2iwc(const tan_t* tan, double px, double py, double *iwcx, double* iwcy); anbool tan_xyzarr2iwc(const tan_t* tan, const double* xyz, double* iwcx, double* iwcy); anbool tan_radec2iwc(const tan_t* tan, double ra, double dec, double* iwcx, double* iwcy); anbool sip_xyzarr2iwc(const sip_t* sip, const double* xyz, double* iwcx, double* iwcy); anbool sip_radec2iwc(const sip_t* sip, double ra, double dec, double* iwcx, double* iwcy); void sip_iwc2pixelxy(const sip_t* sip, double iwcx, double iwcy, double *px, double* py); void sip_iwc2radec(const sip_t* sip, double x, double y, double *p_ra, double *p_dec); void sip_print(const sip_t*); void sip_print_to(const sip_t*, FILE* fid); void tan_print(const tan_t* tan); void tan_print_to(const tan_t* tan, FILE* f); // for python void sip_get_crval(const sip_t* sip, double* ra, double* dec); double tan_get_orientation(const tan_t* tan); double sip_get_orientation(const sip_t* sip); #endif astrometry.net-0.67/include/astrometry/sip_qfits.h000644 000765 000024 00000002646 12651445460 022604 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SIP_QFITS_H #define SIP_QFITS_H #include "astrometry/qfits_header.h" #include "astrometry/sip.h" int sip_get_image_size(const qfits_header* hdr, int* pW, int* pH); sip_t* sip_read_tan_or_sip_header_file_ext(const char* fn, int ext, sip_t* dest, anbool forcetan); qfits_header* sip_create_header(const sip_t* sip); qfits_header* tan_create_header(const tan_t* tan); void sip_add_to_header(qfits_header* hdr, const sip_t* sip); void tan_add_to_header(qfits_header* hdr, const tan_t* tan); sip_t* sip_read_header_file(const char* fn, sip_t* dest); sip_t* sip_read_header_file_ext(const char* fn, int ext, sip_t* dest); sip_t* sip_read_header_file_ext_only(const char* fn, int ext, sip_t* dest); tan_t* tan_read_header_file(const char* fn, tan_t* dest); tan_t* tan_read_header_file_ext(const char* fn, int ext, tan_t* dest); tan_t* tan_read_header_file_ext_only(const char* fn, int ext, tan_t* dest); sip_t* sip_read_header(const qfits_header* hdr, sip_t* dest); tan_t* tan_read_header(const qfits_header* hdr, tan_t* dest); sip_t* sip_from_string(const char* str, int len, sip_t* dest); int tan_write_to(const tan_t* tan, FILE* fid); int sip_write_to(const sip_t* sip, FILE* fid); int sip_write_to_file(const sip_t* sip, const char* fn); int tan_write_to_file(const tan_t* tan, const char* fn); #endif astrometry.net-0.67/include/astrometry/solvedclient.h000644 000765 000024 00000000666 12651445460 023276 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SOLVEDCLIENT_H #define SOLVEDCLIENT_H #include "astrometry/bl.h" int solvedclient_set_server(char* addr); int solvedclient_get(int filenum, int fieldnum); void solvedclient_set(int filenum, int fieldnum); il* solvedclient_get_fields(int filenum, int firstfield, int lastfield, int maxnfields); #endif astrometry.net-0.67/include/astrometry/solvedfile.h000644 000765 000024 00000002366 12651445460 022736 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SOLVEDFILE_H #define SOLVEDFILE_H #include "astrometry/bl.h" #include "astrometry/an-bool.h" /** All field numbers are 1-indexed. The solvedfiles themselves are 0-indexed, but this module handles that. */ int solvedfile_get(char* fn, int fieldnum); int solvedfile_getsize(char* fn); /** Get a list of unsolved fields between "firstfield" and "lastfield", up to a maximum of "maxfields" (no limit if "maxfields" is zero). */ il* solvedfile_getall(char* fn, int firstfield, int lastfield, int maxfields); /** Same as "getall" except return solved fields. */ il* solvedfile_getall_solved(char* fn, int firstfield, int lastfield, int maxfields); int solvedfile_set(char* fn, int fieldnum); /* Set an array of fields. Note that the "vals" array is 0-indexed; vals[0] corresponds to field 1. This *only sets* elements, it does *not* reset (clear) values in the file. */ int solvedfile_set_array(char* fn, anbool* vals, int N); /** Sets the file to the given values and size (possibly truncating it!) */ int solvedfile_set_file(char* fn, anbool* vals, int N); int solvedfile_setsize(char* fn, int fieldnum); #endif astrometry.net-0.67/include/astrometry/solver.h000644 000765 000024 00000026273 12651445460 022117 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef SOLVER_H #define SOLVER_H #include #include "astrometry/starutil.h" #include "astrometry/starxy.h" #include "astrometry/kdtree.h" #include "astrometry/bl.h" #include "astrometry/matchobj.h" #include "astrometry/quadfile.h" #include "astrometry/starkd.h" #include "astrometry/codekd.h" #include "astrometry/index.h" #include "astrometry/verify.h" #include "astrometry/sip.h" #include "astrometry/an-bool.h" enum { PARITY_NORMAL, PARITY_FLIP, PARITY_BOTH }; #define DEFAULT_CODE_TOL .01 #define DEFAULT_PARITY PARITY_BOTH #define DEFAULT_TWEAK_ABORDER 3 #define DEFAULT_TWEAK_ABPORDER 3 #define DEFAULT_DISTRACTOR_RATIO 0.25 #define DEFAULT_VERIFY_PIX 1.0 #define DEFAULT_BAIL_THRESHOLD 1e-100 struct verify_field_t; struct solver_t { // FIELDS REQUIRED FROM THE CALLER BEFORE CALLING SOLVER_RUN // ========================================================= // The set of indexes. Caller must add with solver_add_index() pl* indexes; // The field to solve starxy_t* fieldxy; // Distortion pattern to apply before solving. sip_t* predistort; // Limits on the image pixel scale in [arcsec per pixel]. double funits_lower; double funits_upper; double logratio_toprint; double logratio_tokeep; double logratio_totune; // Callback; called for each match found whose log-odds ratio is above // "logratio_record_threshold". The second parameter is "userdata". anbool (*record_match_callback)(MatchObj*, void*); // User data passed to the callbacks void* userdata; // Assume that stars far from the matched quad will have larger positional // variance? anbool distance_from_quad_bonus; anbool verify_uniformize; anbool verify_dedup; anbool do_tweak; int tweak_aborder; int tweak_abporder; // OPTIONAL FIELDS WITH SENSIBLE DEFAULTS // ====================================== // The positional noise in the field, in pixels. double verify_pix; // Fraction of distractors in [0,1]. double distractor_ratio; // Code tolerance in 4D codespace L2 distance. double codetol; // Minimum size of field quads to try, in pixels. double quadsize_min; // Maximum size of field quads to try, in pixels. double quadsize_max; // The first and last field objects to look at; default is all of them. int startobj; int endobj; // One of PARITY_NORMAL, PARITY_FLIP, or PARITY_BOTH. Are the X and Y axes of // the image flipped? Default PARITY_BOTH. int parity; // Only accept matches within a radius of a given RA,Dec position? anbool use_radec; double centerxyz[3]; double r2; // During verification, if the log-odds ratio drops to this level, we bail out and // assume it's not a match. Default log(1e-100). double logratio_bail_threshold; // During verification, if the log-odds ratio rises above this level, we accept the // match and bail out. Default: HUGE_VAL (ie, don't bail out: keep going to find the // maximum Bayes factor value). double logratio_stoplooking; // Number of field quads to try or zero for no limit. int maxquads; // Number of quad matches to try or zero for no limit. int maxmatches; // Force CRPIX to be the given point "crpix", or the center of the image? anbool set_crpix; anbool set_crpix_center; double crpix[2]; // MatchObj template: if non-NULL, whenever a match is found, we first memcpy() // this template, then set the fields that describe the match. MatchObj* mo_template; // Called after a delay in seconds; returns how long to wait before // calling again. The parameter is "userdata". time_t (*timer_callback)(void*); // FIELDS THAT AFFECT THE RUNNING SOLVER ON CALLBACK // ================================================= // Bail out ASAP. anbool quit_now; // SOLVER OUTPUTS // ============== // NOTE: these are only incremented, not initialized. It's up to you to set // them to zero before calling, if you're starting from scratch. // See solver_reset_counters(). int numtries; int nummatches; int numscaleok; // the last field object examined int last_examined_object; // number of quads skipped because of cxdx constraints. int num_cxdx_skipped; int num_meanx_skipped; // number of matches skipped due to RA,Dec bounds constraints. int num_radec_skipped; // int num_abscale_skipped; // The number of times we ran verification on a quad. int num_verified; // INTERNAL PARAMETERS; DO NOT MODIFY // ================================== // The index we're currently dealing with. index_t* index; // The extreme limits of quad size, for all indexes, in pixels^2. double minminAB2; double maxmaxAB2; // The relative noise of the current index, squared: // square( index->index_jitter / index->index_scale_lower ) double rel_index_noise2; // The relative noise of the current quad, squared: double rel_field_noise2; double abscale_low; double abscale_high; // Field limits, in pixels. double field_minx, field_maxx, field_miny, field_maxy; // Distance in pixels across the diagonal of the field double field_diag; // If the index has the property that cx <= dx, then how much of a margin do we // have to add before we can safely assume that a permutation of a quad's code // can't be in the index? double cxdx_margin; // How long has this been going on? (CPU time) double starttime; double timeused; // Best match so far double best_logodds; MatchObj best_match; index_t* best_index; anbool best_match_solves; anbool have_best_match; // Cached data about this field, for verify_hit(). verify_field_t* vf; }; typedef struct solver_t solver_t; solver_t* solver_new(); void solver_set_default_values(solver_t* solver); /** Returns the assumed field positional uncertainty ("jitter") in pixels. */ double solver_get_field_jitter(const solver_t* solver); /** Sets the log-odds ratio for "recording" a proposed solution. NOTE, 'recording' means calling your callback, where you can decide what to do with it; thus it's probably your "solve" threshold. Default: 0, which means your callback gets called for every match. Suggested value: log(1e9) or log(1e12). */ void solver_set_keep_logodds(solver_t* solver, double logodds); // back-compate #define solver_set_record_logodds solver_set_keep_logodds /** Sets the "parity" or "flip" of the image. PARITY_NORMAL: det(CD) < 0 PARITY_FLIP: det(CD) > 0 PARITY_BOTH (default): try both. Return 0 on success, -1 on invalid parity value. */ int solver_set_parity(solver_t* solver, int parity); /** Returns the pixel position of the center of the field, defined to be the mean of the min and max position. (field_maxx + field_maxy)/2 */ void solver_get_field_center(const solver_t* solver, double* px, double* py); /** Returns the maximum field size expected, in arcsec. This is simply the maximum pixel scale * maximum radius (on the diagonal) */ double solver_get_max_radius_arcsec(const solver_t* solver); /** Returns the best match found after a solver_run() call. This is just &(solver->best_match) */ MatchObj* solver_get_best_match(solver_t* solver); /** Did the best match solve? Returns solver->best_match_solved. */ anbool solver_did_solve(const solver_t* solver); /** Returns solver->best_index->indexname. (Should be equal to solver->best_match->index->indexname. */ const char* solver_get_best_match_index_name(const solver_t* solver); /** Returns the lower/upper bounds of pixel scale that will be searched, in arcsec/pixel. */ double solver_get_pixscale_low(const solver_t* solver); double solver_get_pixscale_high(const solver_t* solver); /** Sets the range of quad sizes to try in the image. This will be further tightened, if possible, given the range of quad sizes in the index and the pixel scale estimates. This avoids looking at tiny quads in the image, because if matches are generated they are difficult to verify (a tiny bit of noise in the quad position translates to a lot of positional noise in stars far away). Min and max are in pixels. Sets quadsize_min, quadsize_max fields. Recommended: ~ 10% of smaller image dimension; 100% of image diagonal. */ void solver_set_quad_size_range(solver_t* solver, double qmin, double qmax); /** Same as solver_set_quad_size_range(), but specified in terms of fraction of the smaller image dimension (for lower) and the diagonal (for upper). Recommended: min=0.1, max=1 */ void solver_set_quad_size_fraction(solver_t* solver, double qmin, double qmax); /** Returns the range of quad sizes that could be matched, given the current settings of pixel scale and image quad size. Returns minimum pixel scale * minimum quad size and maximum pixel scale * maximum quad size. */ void solver_get_quad_size_range_arcsec(const solver_t* solver, double* qmin, double* qmax); void solver_free(solver_t*); /** Tells the solver which field of stars it's going to be solving. The solver_t* takes ownership of the *field*; it will be freed upon solver_free() or solver_cleanup_field() or a new solver_set_field(). */ void solver_set_field(solver_t* s, starxy_t* field); starxy_t* solver_get_field(solver_t* solver); void solver_reset_field_size(solver_t* s); /** Tells the solver to only accept matches within "radius_deg" (in degrees) of the given "ra","dec" point (also in degrees). This is, each star comprising the quad must be within that circle. */ void solver_set_radec(solver_t* s, double ra, double dec, double radius_deg); void solver_clear_radec(solver_t* s); /** Tells the solver the pixel coordinate range of the image to be solved. If not set, this will be computed based on the bounds of the stars within the field (an underestimate). */ void solver_set_field_bounds(solver_t* s, double xlo, double xhi, double ylo, double yhi); /** Reset everything associated with solving a particular field. (renamed from solver_new_field) */ void solver_cleanup_field(solver_t*); /** get field w,h */ double solver_field_width(const solver_t* t); double solver_field_height(const solver_t* t); void solver_add_index(solver_t* solver, index_t* index); void solver_clear_indexes(solver_t* solver); int solver_n_indices(const solver_t* solver); index_t* solver_get_index(const solver_t* solver, int i); void solver_verify_sip_wcs(solver_t* solver, sip_t* sip); //, MatchObj* mo); void solver_run(solver_t* solver); #define SOLVER_TWEAK2_AVAILABLE 1 void solver_tweak2(solver_t* solver, MatchObj* mo, int order, sip_t* verifysip); void solver_cleanup(solver_t* solver); // Call this before solver_inject_match(), solver_verify_sip_wcs() or solver_run(). // (or it will get called automatically) void solver_preprocess_field(solver_t* sp); // Call this after solver_inject_match() or solver_run(). // (or it will get called when you solver_free()) void solver_free_field(solver_t* sp); void solver_inject_match(solver_t* solver, MatchObj* mo, sip_t* sip); void solver_compute_quad_range(const solver_t* solver, const index_t* index, double*, double*); /** Resets the "numtries", "nummatches", etc counters, as well as "quitnow". */ void solver_reset_counters(solver_t* t); /** Clears the "best_match_solves", "have_best_match", etc fields. */ void solver_reset_best_match(solver_t* sp); void solver_print_to(const solver_t* sp, FILE* stream); void solver_log_params(const solver_t* sp); #endif astrometry.net-0.67/include/astrometry/starkd.h000644 000765 000024 00000013514 12651445460 022067 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef STAR_KD_H #define STAR_KD_H #include #include #include "astrometry/kdtree.h" #include "astrometry/kdtree_fits_io.h" #include "astrometry/fitstable.h" #include "astrometry/keywords.h" #include "astrometry/anqfits.h" #ifdef SWIG // this keyword (from keywords.h) confuses swig #define Malloc #endif #define AN_FILETYPE_STARTREE "SKDT" #define AN_FILETYPE_TAGALONG "TAGALONG" #define STARTREE_NAME "stars" typedef struct { kdtree_t* tree; qfits_header* header; int* inverse_perm; uint8_t* sweep; // reading or writing? int writing; // reading: tagged-along data (a FITS BINTABLE with one row per star, // in the same order); access this via startree_get_tagalong() ONLY! fitstable_t* tagalong; } startree_t; startree_t* startree_open(const char* fn); startree_t* startree_open_fits(anqfits_t* fits); /** Searches for stars within a radius of a point. xyzcenter: double[3]: unit-sphere coordinates of point; see starutil.h : radecdeg2xyzarr() to convert RA,Decs to this form. radius2: radius-squared on the unit sphere; see starutil.h : deg2distsq() or arcsec2distsq(). xyzresults: if non-NULL, returns the xyz positions of the stars that are found, in a newly-allocated array. radecresults: if non-NULL, returns the RA,Dec positions (in degrees) of the stars within range. starinds: if non-NULL, returns the indices of stars within range. This can be used to retrieve extra information about the stars, using the 'startree_get_data_column()' function. */ void startree_search_for(const startree_t* s, const double* xyzcenter, double radius2, double** xyzresults, double** radecresults, int** starinds, int* nresults); /** RA, Dec, and radius in degrees. Otherwise same as startree_search_for(). */ void startree_search_for_radec(const startree_t* s, double ra, double dec, double radius, double** xyzresults, double** radecresults, int** starinds, int* nresults); void startree_search(const startree_t* s, const double* xyzcenter, double radius2, double** xyzresults, double** radecresults, int* nresults); /** Reads a column of data from the "tag-along" table. Get the "inds" and "N" from "startree_search" or "startree_search_for". To get all entries, set "inds" = NULL and N = startree_N(). The return value is a newly-allocated array of size N. It should be freed using "startree_free_data_column" */ Malloc double* startree_get_data_column(startree_t* s, const char* colname, const int* indices, int N); /** Same as startree_get_data_column but for int64_t. Don't you love C templating? */ Malloc int64_t* startree_get_data_column_int64(startree_t* s, const char* colname, const int* indices, int N); /** Reads a column of data from the "tag-along" table. The column may be an array (that is, each row contains multiple entries); the array size is placed in "arraysize". The array entries */ Malloc double* startree_get_data_column_array(startree_t* s, const char* colname, const int* indices, int N, int* arraysize); void startree_free_data_column(startree_t* s, double* d); anbool startree_has_tagalong(startree_t* s); fitstable_t* startree_get_tagalong(startree_t* s); /* Returns a string-list of the names of the columns in the "tagalong" table of this star kdtree. If you pass in a non-NULL "lst", the names will be added to that list; otherwise, a new sl* will be allocated (free it with sl_free2()). If you want to avoid "sl*", see: -- startree_get_tagalong_N_columns(s) -- startree_get_tagalong_column_name(s, i) */ sl* startree_get_tagalong_column_names(startree_t* s, sl* lst); /** Returns the number of columns in the tagalong table. */ int startree_get_tagalong_N_columns(startree_t* s); /** Returns the name of the 'i'th column in the tagalong table. The lifetime of the returned string is the lifetime of this starkd. */ const char* startree_get_tagalong_column_name(startree_t* s, int i); /** Returns the FITS type of the 'i'th column in the tagalong table. */ tfits_type startree_get_tagalong_column_fits_type(startree_t* s, int i); /** Returns the array size of the 'i'th column in the tagalong table. For scalar columns, this is 1. */ int startree_get_tagalong_column_array_size(startree_t* s, int i); /* Retrieve parameters of the cut-an process, if they are available. Older index files may not have these header cards. */ // healpix nside, or -1 int startree_get_cut_nside(const startree_t* s); int startree_get_cut_nsweeps(const startree_t* s); // in arcsec; 0 if none. double startree_get_cut_dedup(const startree_t* s); // band (one of several static strings), or NULL char* startree_get_cut_band(const startree_t* s); // margin, in healpix, or -1 int startree_get_cut_margin(const startree_t* s); double startree_get_jitter(const startree_t* s); void startree_set_jitter(startree_t* s, double jitter_arcsec); //uint64_t startree_get_starid(const startree_t* s, int ind); // returns the sweep number of star 'ind', or -1 if the index is out of bounds // or the tree has no sweep numbers. int startree_get_sweep(const startree_t* s, int ind); int startree_N(const startree_t* s); int startree_nodes(const startree_t* s); int startree_D(const startree_t* s); qfits_header* startree_header(const startree_t* s); int startree_get(startree_t* s, int starid, double* posn); int startree_get_radec(startree_t* s, int starid, double* ra, double* dec); int startree_close(startree_t* s); void startree_compute_inverse_perm(startree_t* s); int startree_check_inverse_perm(startree_t* s); // for writing startree_t* startree_new(void); int startree_write_to_file(startree_t* s, const char* fn); int startree_write_to_file_flipped(startree_t* s, const char* fn); int startree_append_to(startree_t* s, FILE* fid); #endif astrometry.net-0.67/include/astrometry/starutil.h000644 000765 000024 00000016565 12651445460 022457 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef STARUTIL_H #define STARUTIL_H #include #include "astrometry/an-bool.h" #include "astrometry/keywords.h" #define DIM_STARS 3 #define DIM_XY 2 // upper bound of dimquads value #define DQMAX 5 // upper bound of dimcodes value #define DCMAX 6 InlineDeclare int dimquad2dimcode(int dimquad); typedef unsigned char uchar; #define ONE_OVER_SIXTY 0.016666666666666666 // pi / 180. #define RAD_PER_DEG 0.017453292519943295 // pi / (180. * 60.) #define RAD_PER_ARCMIN 0.00029088820866572158 // pi / (180. * 60. * 60.) #define RAD_PER_ARCSEC 4.8481368110953598e-06 // 180. / pi #define DEG_PER_RAD 57.295779513082323 #define DEG_PER_ARCMIN ONE_OVER_SIXTY // 1./3600. #define DEG_PER_ARCSEC 0.00027777777777777778 // 60. * 180. / pi #define ARCMIN_PER_RAD 3437.7467707849396 #define ARCMIN_PER_DEG 60.0 #define ARCMIN_PER_ARCSEC ONE_OVER_SIXTY // 60. * 60. * 180. / pi #define ARCSEC_PER_RAD 206264.80624709636 #define ARCSEC_PER_DEG 3600.0 #define ARCSEC_PER_ARCMIN 60.0 InlineDeclare Const double rad2deg(double x); InlineDeclare Const double rad2arcmin(double x); InlineDeclare Const double rad2arcsec(double x); InlineDeclare Const double deg2rad(double x); InlineDeclare Const double deg2arcmin(double x); InlineDeclare Const double deg2arcsec(double x); InlineDeclare Const double arcmin2rad(double x); InlineDeclare Const double arcmin2deg(double x); InlineDeclare Const double arcmin2arcsec(double x); InlineDeclare Const double arcsec2rad(double x); InlineDeclare Const double arcsec2deg(double x); InlineDeclare Const double arcsec2arcmin(double x); #define MJD_JD_OFFSET 2400000.5 InlineDeclare Const double mjdtojd(double mjd); InlineDeclare Const double jdtomjd(double jd); // RA,Dec in radians: #define radec2x(r,d) (cos(d)*cos(r)) #define radec2y(r,d) (cos(d)*sin(r)) #define radec2z(r,d) (sin(d)) InlineDeclare Const double xy2ra(double x, double y); InlineDeclare Const double z2dec(double z); double atora(const char* str); double atodec(const char* str); double mag2flux(double mag); /* RA,Dec in degrees. RAs in range [0, 360], Decs in range [-90, 90]. */ void radecrange2xyzrange(double ralow, double declow, double rahigh, double dechigh, double* xyzlow, double* xyzhigh); // RA,Dec in radians: InlineDeclare void radec2xyz(double ra, double dec, double* x, double* y, double* z); InlineDeclare Flatten void xyz2radec(double x, double y, double z, double *ra, double *dec); InlineDeclare Flatten void xyzarr2radec(const double* xyz, double *ra, double *dec); InlineDeclare void xyzarr2radecarr(const double* xyz, double *radec); InlineDeclare void radec2xyzarr(double ra, double dec, double* p_xyz); InlineDeclare void radec2xyzarrmany(double *ra, double *dec, double* xyz, int n); // RA,Dec in degrees: InlineDeclare void radecdeg2xyz(double ra, double dec, double* x, double* y, double* z); InlineDeclare Flatten void xyzarr2radecdeg(const double* xyz, double *ra, double *dec); InlineDeclare Flatten void xyzarr2radecdegarr(double* xyz, double *radec); InlineDeclare void radecdeg2xyzarr(double ra, double dec, double* p_xyz); InlineDeclare void radecdegarr2xyzarr(double* radec, double* xyz); InlineDeclare void radecdeg2xyzarrmany(double *ra, double *dec, double* xyz, int n); // RA,Dec in degrees. // Puts the xyz unit vector pointing in positive-RA direction in "dra", // Puts the xyz unit vector pointing in the positive-Dec direction in "ddec". void radec_derivatives(double ra, double dec, double* dra, double* ddec); // Returns the distance-squared between two (RA,Dec)s in degrees. double distsq_between_radecdeg(double ra1, double dec1, double ra2, double dec2); // Returns the arcseconds between two (RA,Dec)s in degrees. double arcsec_between_radecdeg(double ra1, double dec1, double ra2, double dec2); // Returns the degrees between two (RA,Dec)s in degrees. double deg_between_radecdeg(double ra1, double dec1, double ra2, double dec2); // RA in degrees to Mercator X coordinate [0, 1). double ra2mercx(double ra); // Dec in degrees to Mercator Y coordinate [0, 1). double dec2mercy(double dec); // RA in degrees to H:M:S void ra2hms(double ra, int* h, int* m, double* s); // Dec in degrees to D:M:S void dec2dms(double dec, int* sign, int* d, int* m, double* s); double hms2ra(int h, int m, double s); double dms2dec(int sgn, int d, int m, double s); void ra2hmsstring(double ra, char* str); void dec2dmsstring(double dec, char* str); void project_hammer_aitoff_x(double x, double y, double z, double* projx, double* projy); void project_equal_area(double x, double y, double z, double* projx, double* projy); // Converts a distance-squared between two points on the // surface of the unit sphere into the angle between the // rays from the center of the sphere to the points, in // radians. InlineDeclare Flatten Const double distsq2arc(double dist2); // Distance^2 on the unit sphere to radians. // (alias of distsq2arc) InlineDeclare Flatten Const double distsq2rad(double dist2); InlineDeclare Flatten Const double distsq2deg(double dist2); // Distance on the unit sphere to radians. InlineDeclare Flatten Const double dist2rad(double dist); // Distance^2 on the unit sphere to arcseconds. InlineDeclare Flatten Const double distsq2arcsec(double dist2); // Distance on the unit sphere to arcseconds InlineDeclare Flatten Const double dist2arcsec(double dist); // Radians to distance^2 on the unit sphere. // (alias of arc2distsq) InlineDeclare Const double rad2distsq(double arcInRadians); // Radians to distance on the unit sphere. InlineDeclare Flatten Const double rad2dist(double arcInRadians); // Converts an angle (in arcseconds) into the distance-squared // between two points on the unit sphere separated by that angle. InlineDeclare Flatten Const double arcsec2distsq(double arcInArcSec); // Arcseconds to distance on the unit sphere. InlineDeclare Flatten Const double arcsec2dist(double arcInArcSec); // Degrees to distance on the unit sphere. InlineDeclare Flatten Const double deg2dist(double arcInDegrees); InlineDeclare Flatten Const double deg2distsq(double d); InlineDeclare Flatten Const double arcmin2dist(double arcmin); InlineDeclare Flatten Const double arcmin2distsq(double arcmin); // Distance on the unit sphere to degrees. InlineDeclare Flatten Const double dist2deg(double dist); #define HELP_ERR -101 #define OPT_ERR -201 void make_rand_star(double* star, double ramin, double ramax, double decmin, double decmax); /* Computes the 2D coordinates (x,y) (in units of a celestial sphere of radius 1) that star s would have in a TANGENTIAL PROJECTION defined by (centred at) star r. s and r are both given in xyz coordinates, the parameters are pointers to arrays of size 3. If "tangent" is true, the projection is the WCS TAN projection; if not, it is the WCS SIN projection. The resulting x,y coordinates are intermediate world coordinates in degrees. The "x" direction should be positive for increasing RA, "y" is increasing Dec. WARNING -- this code assumes s and r are UNIT vectors (ie normalized to have length 1). */ WarnUnusedResult InlineDeclare anbool star_coords(const double *s, const double *r, anbool tangent, double *x, double *y); InlineDeclare void star_midpoint(double* mid, const double* A, const double* B); #ifdef INCLUDE_INLINE_SOURCE #define InlineDefine InlineDefineH #include "astrometry/starutil.inc" #undef InlineDefine #endif #endif astrometry.net-0.67/include/astrometry/starutil.inc000644 000765 000024 00000016213 12651445460 022767 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include InlineDefine void star_midpoint(double* mid, const double* A, const double* B) { double len; double invlen; // we don't divide by 2 because we immediately renormalize it... mid[0] = A[0] + B[0]; mid[1] = A[1] + B[1]; mid[2] = A[2] + B[2]; //len = sqrt(square(mid[0]) + square(mid[1]) + square(mid[2])); len = sqrt(mid[0] * mid[0] + mid[1] * mid[1] + mid[2] * mid[2]); invlen = 1.0 / len; mid[0] *= invlen; mid[1] *= invlen; mid[2] *= invlen; } InlineDefine Const double mjdtojd(double mjd) { return mjd + MJD_JD_OFFSET; } InlineDefine Const double jdtomjd(double jd) { return jd - MJD_JD_OFFSET; } InlineDefine Const int dimquad2dimcode(int dimquad) { return 2 * (dimquad - 2); } InlineDefine Const double rad2deg(double x) { return x * DEG_PER_RAD; } InlineDefine Const double deg2rad(double x) { return x * RAD_PER_DEG; } InlineDefine Const double deg2arcmin(double x) { return x * ARCMIN_PER_DEG; } InlineDefine Const double arcmin2deg(double x) { return x * DEG_PER_ARCMIN; } InlineDefine Const double arcmin2arcsec(double x) { return x * ARCSEC_PER_ARCMIN; } InlineDefine Const double arcsec2arcmin(double x) { return x * ARCMIN_PER_ARCSEC; } InlineDefine Const double rad2arcmin(double x) { return x * ARCMIN_PER_RAD; } InlineDefine Const double rad2arcsec(double x) { return x * ARCSEC_PER_RAD; } InlineDefine Const double deg2arcsec(double x) { return x * ARCSEC_PER_DEG; } InlineDefine Const double arcmin2rad(double x) { return x * RAD_PER_ARCMIN; } InlineDefine Const double arcsec2rad(double x) { return x * RAD_PER_ARCSEC; } InlineDefine Const double arcsec2deg(double x) { return x * DEG_PER_ARCSEC; } InlineDefine Const double rad2distsq(double x) { // inverse of distsq2arc; cosine law. return 2.0 * (1.0 - cos(x)); } InlineDefine Flatten Const double rad2dist(double x) { return sqrt(rad2distsq(x)); } InlineDefine Flatten Const double arcsec2distsq(double x) { return rad2distsq(arcsec2rad(x)); } InlineDefine Flatten Const double arcmin2dist(double x) { return rad2dist(arcmin2rad(x)); } InlineDefine Flatten Const double arcmin2distsq(double arcmin) { return rad2distsq(arcmin2rad(arcmin)); } InlineDefine Const double z2dec(double z) { return asin(z); } InlineDefine Const double xy2ra(double x, double y) { double a = atan2(y, x); if (a < 0) a += 2.0 * M_PI; return a; } InlineDefine Flatten void xyz2radec(double x, double y, double z, double *ra, double *dec) { if (ra) *ra = xy2ra(x, y); if (dec) *dec = z2dec(z); } InlineDefine Flatten void xyzarr2radec(const double* xyz, double *ra, double *dec) { xyz2radec(xyz[0], xyz[1], xyz[2], ra, dec); } InlineDefine Flatten void xyzarr2radecdeg(const double* xyz, double *ra, double *dec) { xyzarr2radec(xyz, ra, dec); if (ra) *ra = rad2deg(*ra); if (dec) *dec = rad2deg(*dec); } InlineDefine Flatten void xyzarr2radecdegarr(double* xyz, double *radec) { xyzarr2radecdeg(xyz, radec, radec+1); } InlineDefine void radec2xyzarr(double ra, double dec, double* xyz) { double cosdec = cos(dec); xyz[0] = cosdec * cos(ra); xyz[1] = cosdec * sin(ra); xyz[2] = sin(dec); } InlineDefine void radec2xyz(double ra, double dec, double* x, double* y, double* z) { double cosdec = cos(dec); *x = cosdec * cos(ra); *y = cosdec * sin(ra); *z = sin(dec); } InlineDefine void radecdeg2xyz(double ra, double dec, double* x, double* y, double* z) { radec2xyz(deg2rad(ra), deg2rad(dec), x, y, z); } InlineDefine void radecdeg2xyzarr(double ra, double dec, double* xyz) { radec2xyzarr(deg2rad(ra),deg2rad(dec), xyz); } InlineDefine void radecdegarr2xyzarr(double* radec, double* xyz) { radecdeg2xyzarr(radec[0], radec[1], xyz); } // xyz stored as xyzxyzxyz. InlineDefine void radec2xyzarrmany(double *ra, double *dec, double* xyz, int n) { int i; for (i=0; i #define GLUE2(x, y) x ## _ ## y #define GLUE(x, y) GLUE2(x, y) #define TSMANGLE(x) GLUE(TSNAME, x) static pthread_key_t TSMANGLE(key); static pthread_once_t TSMANGLE(key_once) = PTHREAD_ONCE_INIT; static void TSMANGLE(make_key)() { pthread_key_create(&TSMANGLE(key), NULL); } static void* TSMANGLE(get_key)(void* initdata) { void *ptr; pthread_once(&TSMANGLE(key_once), TSMANGLE(make_key)); ptr = pthread_getspecific(TSMANGLE(key)); if (!ptr) { ptr = TSMANGLE(init_key)(initdata); pthread_setspecific(TSMANGLE(key), ptr); } return ptr; } astrometry.net-0.67/include/astrometry/tic.h000644 000765 000024 00000001040 12651445460 021345 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef TIC_H #define TIC_H #include #include void tic(); int get_resource_stats(double* p_usertime, double* p_systime, long* p_maxrss); void toc(); double millis_between(struct timeval* tv1, struct timeval* tv2); // Returns the number of seconds since (approximately) Jan 1, 2000 UTC. // You probably only want to look at differences in the values returned by this function. double timenow(); #endif astrometry.net-0.67/include/astrometry/tpv.h000644 000765 000024 00000006217 12651445460 021412 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef ANTPV_H #define ANTPV_H #include #include "astrometry/sip.h" #include "astrometry/keywords.h" #define N_PV_TERMS 40 // TPV (TAN + PV distortion) structure. typedef struct { // A basic TAN header. tan_t wcstan; double pv1[N_PV_TERMS]; double pv2[N_PV_TERMS]; } tpv_t; tpv_t* tpv_new(void); void tpv_free(tpv_t* tpv); void sip_copy(sip_t* dest, const sip_t* src); // Set the given TPV wcs to the given TAN wcs. void tpv_wrap_tan(const tan_t* tan, tpv_t* tpv); double tpv_imagew(tpv_t* tpv); double tpv_imageh(tpv_t* tpv); // Pixels to RA,Dec in degrees. void tpv_pixelxy2radec(const tpv_t* tpv, double px, double py, double *a, double *d); // Pixels to XYZ unit vector. void tpv_pixelxy2xyzarr(const tpv_t* tpv, double px, double py, double *xyz); // RA,Dec in degrees to Pixels. // Returns FALSE if the point is on the opposite side of the sphere (and hence the point // does not project onto the tangent plane) WarnUnusedResult anbool tpv_radec2pixelxy(const tpv_t* tpv, double a, double d, double *px, double *py); WarnUnusedResult anbool tpv_radec2pixelxy_check(const tpv_t* tpv, double ra, double dec, double *px, double *py); WarnUnusedResult anbool tpv_xyzarr2pixelxy(const tpv_t* tpv, const double* xyz, double *px, double *py); WarnUnusedResult anbool tpv_xyz2pixelxy(const tpv_t* tpv, double x, double y, double z, double *px, double *py); // Pixels to Intermediate World Coordinates in degrees. void tpv_pixelxy2iwc(const tpv_t* tpv, double px, double py, double *iwcx, double* iwcy); double tpv_det_cd(const tpv_t* tpv); // returns pixel scale in arcseconds/pixel (NOT arcsec^2) double tpv_pixel_scale(const tpv_t* tpv); // these take *relative* pixel coords (WRT crpix) void tpv_calc_inv_distortion(const tpv_t* tpv, double U, double V, double* u, double *v); void tpv_calc_distortion(const tpv_t* tpv, double u, double v, double* U, double *V); // Applies forward TPV distortion to pixel coords. // This applies the A,B matrix terms; // This is the distortion applied in the pixel-to-RA,Dec direction. // (pix -> "un"distorted -> TAN -> RA,Dec) void tpv_pixel_distortion(const tpv_t* tpv, double x, double y, double* X, double *Y); // Reverses tpv_pixel_distortion; // Applies "reverse" TPV distortion: the AP, BP matrices; // This is the distortion applied in the RA,Dec-to-pixel direction: // (RA,Dec -> TAN -> undistorted -> pix) void tpv_pixel_undistortion(const tpv_t* tpv, double x, double y, double* X, double *Y); anbool tpv_xyzarr2iwc(const tpv_t* tpv, const double* xyz, double* iwcx, double* iwcy); anbool tpv_radec2iwc(const tpv_t* tpv, double ra, double dec, double* iwcx, double* iwcy); void tpv_iwc2pixelxy(const tpv_t* tpv, double iwcx, double iwcy, double *px, double* py); void tpv_iwc2radec(const tpv_t* tpv, double x, double y, double *p_ra, double *p_dec); void tpv_print(const tpv_t*); void tpv_print_to(const tpv_t*, FILE* fid); // for python void tpv_get_crval(const tpv_t* tpv, double* ra, double* dec); double tpv_get_orientation(const tpv_t* tpv); #endif astrometry.net-0.67/include/astrometry/tweak.h000644 000765 000024 00000006737 12651445460 021723 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef _TWEAK_INTERNAL_H #define _TWEAK_INTERNAL_H #include "astrometry/an-bool.h" #include "astrometry/kdtree.h" #include "astrometry/bl.h" #include "astrometry/sip.h" #include "astrometry/starutil.h" #include "astrometry/starxy.h" // These flags represent the work already done on a tweak problem enum tweak_flags { TWEAK_HAS_SIP = 0x1, TWEAK_HAS_IMAGE_XY = 0x2, TWEAK_HAS_IMAGE_XYZ = 0x4, TWEAK_HAS_IMAGE_AD = 0x8, TWEAK_HAS_REF_XY = 0x10, TWEAK_HAS_REF_XYZ = 0x20, TWEAK_HAS_REF_AD = 0x40, TWEAK_HAS_CORRESPONDENCES = 0x100, TWEAK_HAS_COARSLY_SHIFTED = 0x800, TWEAK_HAS_FINELY_SHIFTED = 0x1000, TWEAK_HAS_REALLY_FINELY_SHIFTED = 0x2000, TWEAK_HAS_LINEAR_CD = 0x4000, }; typedef struct tweak_s { sip_t* sip; // bitfield of tweak_flags unsigned int state; // Sources in the image int n; // pixel x,y double *x; double *y; // CACHED: // RA,Dec double *a; double *d; // vector on the unit sphere double *xyz; // Sources in the catalog int n_ref; // RA,Dec double *a_ref; double *d_ref; // unit vector on the sphere double *xyz_ref; // CACHED: // pixel double *x_ref; double *y_ref; // Correspondences il* image; il* ref; dl* dist2; dl* weight; // Size of Hough space for shift double mindx, mindy, maxdx, maxdy; // Size of last run shift operation double xs, ys; // Trees used for finding correspondences kdtree_t* kd_image; kdtree_t* kd_ref; // star jitter, in arcseconds. double jitter; // (computed from jitter); star jitter in distance-squared on the unit sphere. double jitterd2; // Weighted or unweighted fit? anbool weighted_fit; // push SIP shift term onto CRPIX, or CRVAL? // traditional behavior is CRPIX; ie push_crval = FALSE. //anbool push_crval; } tweak_t; tweak_t* tweak_new(); void tweak_init(tweak_t*); void tweak_push_wcs_tan(tweak_t* t, const tan_t* wcs); void tweak_push_ref_xyz(tweak_t* t, const double* xyz, int n); void tweak_push_ref_ad(tweak_t* t, const double* a, const double *d, int n); void tweak_push_ref_ad_array(tweak_t* t, const double* ad, int n); void tweak_push_image_xy(tweak_t* t, const starxy_t* xy); void tweak_push_correspondence_indices(tweak_t* t, il* image, il* ref, dl* distsq, dl* weight); unsigned int tweak_advance_to(tweak_t* t, unsigned int flag); void tweak_clear(tweak_t* t); void tweak_dump_ascii(tweak_t* t); void tweak_skip_shift(tweak_t* t); char* tweak_get_state_string(const tweak_t* t); void tweak_go_to(tweak_t* t, unsigned int flag); void tweak_clear_correspondences(tweak_t* t); void tweak_clear_on_sip_change(tweak_t* t); void tweak_clear_image_ad(tweak_t* t); void tweak_clear_ref_xy(tweak_t* t); void tweak_clear_image_xyz(tweak_t* t); void tweak_free(tweak_t* t); void tweak_iterate_to_order(tweak_t* t, int maxorder, int iterations); sip_t* tweak_just_do_it(const tan_t* wcs, const starxy_t* imagexy, const double* starxyz, const double* star_ra, const double* star_dec, const double* star_radec, int nstars, double jitter_arcsec, int order, int inverse_order, int iterations, anbool weighted, anbool skip_shift); // TEST void tchebyshev_tweak(tweak_t* t, int W, int H); #endif astrometry.net-0.67/include/astrometry/tweak2.h000644 000765 000024 00000005077 12651445460 022001 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef TWEAK_2_H #define TWEAK_2_H #include "astrometry/sip.h" /** Given an initial WCS solution, compute SIP polynomial distortions using an annealing-like strategy. That is, it finds matches between image and reference catalog by searching within a radius, and that radius is small near a region of confidence, and grows as you move away. That makes it possible to pick up more distant matches, but they are downweighted in the fit. The annealing process reduces the slope of the growth of the matching radius with respect to the distance from the region of confidence. In Astrometry.net, the confidence region is the center of the quad that matched. fieldxy: source positions, x0,y0,x1,y1,... Nfield: number of source positions fieldjitter: standard deviation of field sources, in pixels; (FIXME: this should be per-source!) W, H: size of the image. indexradec: reference star positions, in degrees, ra0,dec0,ra1,dec1,... Nindex: number of reference stars indexjitter: standard deviation of reference sources, in arcsec. (FIXME: this should be per-source) quadcenter: the center of the quad that matched, in pixels. quadR2: the radius-squared, in pixels, of the quad that matched. distractors: how often you find unexpected test stars; we've always kept this fixed at 0.25 logodds_bail: totally uninteresting; shouldn't really be here. Set to, say, -100. sip_order: polynomial distortion order you want. 1=linear works. startwcs: initial WCS solution. See util/sip.h : sip_wrap_tan() if you have a tan_t rather than a sip_t. destwcs: where to put the solution; NULL to allocate a new sip_t. newtheta: "theta" maps field stars to reference stars in the final matching that we produce. Set this non-NULL to pull it out. newodds: this tells the confidence in the matches. Use verify_logodds_to_weight() to turn these into a weight in [0,1]. crpix: if you want to keep the reference point fixed, set this to a (2-element) array of the image reference position. */ sip_t* tweak2(const double* fieldxy, int Nfield, double fieldjitter, int W, int H, const double* indexradec, int Nindex, double indexjitter, const double* quadcenter, double quadR2, double distractors, double logodds_bail, int sip_order, int sip_invorder, const sip_t* startwcs, sip_t* destwcs, int** newtheta, double** newodds, double* crpix, double* p_logodds, int* p_besti, int* testperm, int startorder); #endif astrometry.net-0.67/include/astrometry/tycho2-fits.h000644 000765 000024 00000001633 12651445460 022751 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef TYCHO2_FITS_H #define TYCHO2_FITS_H #include #include "astrometry/tycho2.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_TYCHO2 "TYCHO2" typedef struct fitstable_t tycho2_fits; tycho2_fits* tycho2_fits_open(char* fn); tycho2_fits* tycho2_fits_open_for_writing(char* fn); qfits_header* tycho2_fits_get_header(tycho2_fits* tycho2); int tycho2_fits_write_headers(tycho2_fits* tycho2); int tycho2_fits_fix_headers(tycho2_fits* tycho2); int tycho2_fits_count_entries(tycho2_fits* tycho2); tycho2_entry* tycho2_fits_read_entry(tycho2_fits* t); int tycho2_fits_read_entries(tycho2_fits* tycho2, int offset, int count, tycho2_entry* entries); int tycho2_fits_close(tycho2_fits* tycho2); int tycho2_fits_write_entry(tycho2_fits* tycho2, tycho2_entry* entry); #endif astrometry.net-0.67/include/astrometry/tycho2.h000644 000765 000024 00000005203 12651445460 022003 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Parses Tycho-2 data files, which are available here: http://www.astro.ku.dk/~cf/CD/data/ */ #ifndef TYCHO2_H #define TYCHO2_H #include #include "astrometry/starutil.h" // 206 bytes of data, but each record is supposed to be terminated // by \r\n, making... #define TYCHO_RECORD_SIZE_RAW 206 // ... 208 bytes total! #define TYCHO_RECORD_SIZE 208 #define TYCHO_SUPPLEMENT_RECORD_SIZE_RAW 122 #define TYCHO_SUPPLEMENT_RECORD_SIZE 124 struct tycho2_entry { // together these form the star ID. int16_t tyc1; // [1, 9537] in main catalog; [2, 9529] in suppl. int16_t tyc2; // [1, 12121] main; [1,12112] suppl. uint8_t tyc3; // [1, 3] main, [1, 4] suppl. // flag "P": photo-center of two stars was used for position anbool photo_center; // flag "X": no mean position, no proper motion anbool no_motion; // flag "T" anbool tycho1_star; // flag "D" anbool double_star; // flag "P" ( DP) anbool photo_center_treatment; // flag "H" (in supplements) anbool hipparcos_star; // [degrees] double ra; // RAdeg double dec; // DEdeg double mean_ra; // mRAdeg double mean_dec; // mDEdeg // [degrees] float sigma_ra; // mas2deg(e_RA*) float sigma_dec; // mas2deg(e_DE) float sigma_mean_ra; // mas2deg(e_mRA*) float sigma_mean_dec; // mas2deg(e_mDE) // [arcsec/yr] float pm_ra; // pmRA* / 1000 // (note that this is actually a change in RA*cos(Dec)) float pm_dec; // pmDE / 1000 // [arcsec/yr] float sigma_pm_ra; // e_pmRA* / 1000 float sigma_pm_dec; // e_pmDE / 1000 // [yr] float epoch_ra; // epRA + 1990 float epoch_dec; // epDE + 1990 float epoch_mean_ra; // mepRA float epoch_mean_dec; // mepDE // uint8_t nobs; // Num // "goodness" float goodness_mean_ra; // g_mRA float goodness_mean_dec; // g_mDEC float goodness_pm_ra; // g_pmRA float goodness_pm_dec; // g_pmDEC // [mag] (0.0 means unavailable) float mag_BT; // BT float mag_VT; // VT float sigma_BT; // e_BT float sigma_VT; // e_VT // [mag] supplements only: Hp magnitude float mag_HP; // HP float sigma_HP; // e_HP // [degrees], -1.0 for null. float prox; float correlation; int32_t hipparcos_id; // [1, 120404] (or zero for null) char hip_ccdm[4]; // (up to three chars; null-terminated.) }; typedef struct tycho2_entry tycho2_entry; int tycho2_guess_is_supplement(const char* line); int tycho2_parse_entry(const char* line, tycho2_entry* entry); int tycho2_supplement_parse_entry(const char* line, tycho2_entry* entry); #endif astrometry.net-0.67/include/astrometry/ucac3.h000644 000765 000024 00000020017 12651445460 021571 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UCAC3_H #define UCAC3_H #include #define UCAC3_RECORD_SIZE 84 struct ucac3_entry { // (in brackets are the name, format, and units in the UCAC3 data files) // [degrees] (ra, I4: mas) double ra; // [degrees] (spd, I4: mas) double dec; // [degrees] (sigra, I2, mas) // error in RA*cos(Dec) float sigma_ra; // [degrees] (sigdc, I2, mas) float sigma_dec; // fit model mag // [mag] (im1, I2: millimag) // value 18.000 is used to flag errors float mag; // aperture mag // [mag] (im2, I2: millimag) // value 18.000 is used to flag errors float apmag; // [mag] (sigmag, I2: millimag) float mag_err; // (objt, I1) // -2 = warning: object could be from possible streak // -1 = warning: object is near overexposed star // 0 = good star // 1 = good star (data copied from another entry) // 2 = warning: contains at least 1 overexposed image // 3 = warning: all images are overexposed or "bad" int8_t objtype; // (dsf, I1) // 0 = single star // 1 = primary of pair with unreal secondary = single // 2 = forced separation, on same frame // 3 = blended image, some CCD frames show single star, some double // 4 = forced separation, 2 objects on same frame number // 5 = primary component of real double // 6 = secondary component of real double // 7 = other "odd" case int8_t doublestar; // (na1: I1) // total # of CCD images of this star uint8_t navail; // (nu1: I1) // # of CCD images used for this star uint8_t nused; // (us1: I1) // # catalogs (epochs) used for proper motions uint8_t npm; // (cn1: I1) // total numb. catalogs (epochs) initial match uint8_t nmatch; // Central epoch for mean RA/Dec // [yr] (cepra/cepdc, I2, 0.01 yr - 1900) float epoch_ra; float epoch_dec; // Proper motion in RA*cos(Dec), Dec // [arcsec/yr] (pmrac/pmdc, I4, 0.1 mas/yr) float pm_ra; float pm_dec; // [arcsec/pr] (sigpmr/sigpmd, I2, 0.1 mas/yr) float sigma_pm_ra; float sigma_pm_dec; // 2MASS pts_key star identifier // (id2m, I4) uint32_t twomass_id; // 2MASS J mag // (jmag, I2, millimag) float jmag; // 2MASS H mag // (hmag, I2, millimag) float hmag; // 2MASS K_s mag // (kmag, I2, millimag) float kmag; // e2mpho I*1 * 3 2MASS error photom. (1/100 mag) float jmag_err; float hmag_err; float kmag_err; // icqflg I*1 * 3 2MASS cc_flg*10 + phot.qual.flag /* (cc_flg*10 + ph_qual) consisting of the contamination flag (0 to 5) and the photometric quality flag (0 to 8). 0 = cc_flg 2MASS 0, no artifacts or contamination 1 = cc_flg 2MASS p, source may be contaminated by a latent image 2 = cc_flg 2MASS c, photometric confusion 3 = cc_flg 2MASS d, diffraction spike confusion 4 = cc_flg 2MASS s, electronic stripe 5 = cc_flg 2MASS b, bandmerge confusion 0 = no ph_qual flag 1 = ph_qual 2MASS X, no valid brightness estimate 2 = ph_qual 2MASS U, upper limit on magnitude 3 = ph_qual 2MASS F, no reliable estimate of the photometric error 4 = ph_qual 2MASS E, goodness-of-fit quality of profile-fit poor 5 = ph_qual 2MASS A, valid measurement, [jhk]snr>10 AND [jhk]cmsig<0.10857 6 = ph_qual 2MASS B, valid measurement, [jhk]snr> 7 AND [jhk]cmsig<0.15510 7 = ph_qual 2MASS C, valid measurement, [jhk]snr> 5 AND [jhk]cmsig<0.21714 8 = ph_qual 2MASS D, valid measurement, no [jhk]snr OR [jhk]cmsig req. For example icqflg = 05 is decoded to be cc_flg=0, and ph_qual=5, meaning no artifacts or contamination from cc_flg and 2MASS qual flag = "A" . */ uint8_t twomass_jflags; uint8_t twomass_hflags; uint8_t twomass_kflags; // SuperCosmos Bmag / R2mag / Imag // (smB / smR2 / smI, I2 millimag) float bmag; float r2mag; float imag; // clbl I*1 SC star/galaxy classif./quality flag /* clbl is a combination of the SuperCOSMOS "meanclass" and modified "blend" flag (meanclass + 10*blend) originally for each magnitude (B, R1, R2, I). The flag provided here is the maximum value over all bands for each of the 2 flags. The SuperCOSMOS mean class flag is an estimate of image class based on unit-weighted mean of individual classes from (B, R1, R2, I). The SuperCOSMOS modified blend flag indicates if blending is detected. The "meanclass" has the following meaning from SuperCOSMOS: 1 = galaxy 2 = star 3 = unclassifiable 4 = noise The modified "blend" flag has the following meaning: 0 = no blending 1 = possible blending detected */ uint8_t clbl; // SuperCosmos quality flag Bmag/R2mag/Imag // (qfB/qfR2/qfI, I1) /* This is a modified quality flag from the "qualB", "qualR2", and "qualI" quality flag from SuperCOSMOS, which gives an indication of the quality of the image from the three bands (B, R2, I). The modified quality flag qfB, qfR2, and qfI have the following meaning: -1 = qual blank in SuperCOSMOS, no flag given 0 = qual zero in SuperCOSMOS, no problems detected 1 = qual < 128 in SuperCOSMOS, reliable image 2 = qual < 65535 in SuperCOSMOS, problems detected 3 = qual >= 65535 in SuperCOSMOS, spurious detection */ uint8_t bquality; uint8_t r2quality; uint8_t iquality; // mmf flag for 10 major catalogs matched // (catflg, I * 10) /* The catflg provides reference to 10 major catalogs used in the computation of the proper motions and catalog matching. Each of the 10 numbers range from 0 to 6 and are the "mmf" (multiple match flag) with respect to each of the 10 following catalogs: Hip, Tycho, AC2000, AGK2B, AGK2H, ZA, BY, Lick, SC, SPM catflg 1 2 3 4 5 6 7 8 9 10 The value for each byte, the mmf flag, has the following meaning: 0 = star not matched with this catalog 1 = unique match, not involving a double star 2 = closest match, not involving a double, likely o.k. 3 = unique match, and involving a double star 4 = closest match, and involving a double, likely o.k. 5 = maybe o.k. smallest sep. match in both directions 6 = same as 5, but involving a double star */ uint8_t matchflags[10]; // Yale SPM object type (g-flag) // (g1, I1) /* The g-flag from the Yale San Juan first epoch Southern Proper Motion data (YSJ1, SPM) has the following meaning: 0 = no info 1 = matched with 2MASS extended source list 2 = LEDA galaxy 3 = known QSO */ uint8_t yale_gflag; // Yale SPM input cat. (c-flag) // (c1, I1) /* The c-flag from the Yale San Juan first epoch Southern Proper Motion data (YSJ1, SPM) indicates which input catalog has been used to identify stars for pipeline processing: 1 = Hipparcos 2 = Tycho2 3 = UCAC2 4 = 2MASS psc 5 = 2MASS xsc (extended sources, largely (but not all!) galaxies) 6 = LEDA (confirmed galaxies, Paturel et al. 2005) 7 = QSO (Veron-Cetty & Veron 2006) */ uint8_t yale_cflag; // LEDA galaxy match flag // (leda, I1) /* This flag is either 0 (no match) or contains the log of the apparent total diameter for I-band (object size) information copied from the LEDA catalog (galaxies). A size value of less than 1 has been rounded up to 1. */ uint8_t leda_flag; // 2MASS extend.source flag // (x2m, I1) /* This flag is either 0 (no match) or contains the length of the semi-major axis of the fiducial ellipse at the K-band (object size) information copied from the 2MASS extended source catalog. If the size is larger than 127, the flag was set to 127. */ uint8_t twomass_extsource_flag; // MPOS star number; identifies HPM stars // (rn, I4) /* MPOS running star numbers over 140 million indicate high proper motion stars which were identified in UCAC pixel data from matches with known HPM stars. The position given for those HPM stars is the unweighted mean of the CCD observations and the proper motion is copied from the literature catalog. */ uint32_t mpos; }; typedef struct ucac3_entry ucac3_entry; int ucac3_parse_entry(ucac3_entry* entry, const void* encoded); #endif astrometry.net-0.67/include/astrometry/ucac4.h000644 000765 000024 00000023333 12651445460 021576 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UCAC4_H #define UCAC4_H #include #define UCAC4_RECORD_SIZE 78 struct ucac4_entry { // (in brackets are the name, format, and units in the UCAC4 data files) // [degrees] (ra, I4: mas) double ra; // [degrees] (spd, I4: mas) double dec; // [degrees] (sigra, I1, mas) // error in RA*cos(Dec) float sigma_ra; // [degrees] (sigdc, I1, mas) float sigma_dec; /* The range of values sigra and sigdc is 1 to 255 which is represented as a signed 1-byte integer (range -127 to 127); thus add 128 to the integer number found in the data file. There is no 0 mas value; data less than 1 mas have been set to 1 mas. Original data larger than 255 mas have been set to 255. */ // fit model mag // [mag] (magm, I2: millimag) // value 20.000 is used to flag errors float mag; // aperture mag // [mag] (maga, I2: millimag) // value 20.000 is used to flag errors float apmag; // [mag] (sigmag, I1: 1/100 mag) float mag_err; // (objt, I1) /* 0 = good, clean star (from MPOS), no known problem 1 = largest flag of any image = near overexposed star (from MPOS) 2 = largest flag of any image = possible streak object (from MPOS) 3 = high proper motion (HPM) star, match with external PM file (MPOS) 4 = actually use external HPM data instead of UCAC4 observ.data (accuracy of positions varies between catalogs) 5 = poor proper motion solution, report only CCD epoch position 6 = substitute poor astrometric results by FK6/Hip/Tycho-2 data 7 = added supplement star (no CCD data) from FK6/Hip/Tycho-2 data, and 2 stars added from high proper motion surveys 8 = high proper motion solution in UCAC4, star not matched with PPMXL 9 = high proper motion solution in UCAC4, discrepant PM to PPMXL (see discussion of flags 8,9 in redcution section 2e above) */ int8_t objtype; // (cdf, I1) /* The cdf flag is a combined double star flag used to indicate the type/quality of double star fit. It is a combination of 2 flags, cdf = 10 * dsf + dst with the following meaning: dsf = double star flag = overall classification 0 = single star 1 = component #1 of "good" double star 2 = component #2 of "good" double star 3 = blended image dst = double star type, from pixel data image profile fits, largest value of all images used for this star 0 = no double star, not sufficient #pixels or elongation to even call double star fit subroutine 1 = elongated image but no more than 1 peak detected 2 = 2 separate peaks detected -> try double star fit 3 = secondary peak found on each side of primary 4 = case 1 after successful double fit (small separ. blended image) 5 = case 2 after successful double fit (most likely real double) 6 = case 3 after successful double fit (brighter secondary picked) */ int8_t doublestar; // (na1: I1) // total # of CCD images of this star uint8_t navail; // (nu1: I1) // # of CCD images used for this star uint8_t nused; // (cu1: I1) // total numb. catalogs (epochs) used for proper motion uint8_t nmatch; // Central epoch for mean RA/Dec // [yr] (cepra/cepdc, I2, 0.01 yr - 1900.00) float epoch_ra; float epoch_dec; // Proper motion in RA*cos(Dec), Dec at central epoch // [arcsec/yr] (pmrac/pmdc, I2, 0.1 mas/yr) float pm_rac; float pm_dec; // [arcsec/pr] (sigpmr/sigpmd, I2, 0.1 mas/yr) float sigma_pm_ra; float sigma_pm_dec; // 2MASS pts_key star identifier // (pts_key, I4) uint32_t twomass_id; // 2MASS J mag // (j_m, I2, millimag) float jmag; // 2MASS H mag // (h_m, I2, millimag) float hmag; // 2MASS K_s mag // (k_m, I2, millimag) float kmag; // e2mpho I*1 * 3 2MASS error photom. (1/100 mag) float jmag_err; float hmag_err; float kmag_err; // icqflg I*1 * 3 2MASS cc_flg*10 + phot.qual.flag /* (cc_flg*10 + ph_qual) consisting of the contamination flag (0 to 5) and the photometric quality flag (0 to 8). 0 = cc_flg 2MASS 0, no artifacts or contamination 1 = cc_flg 2MASS p, source may be contaminated by a latent image 2 = cc_flg 2MASS c, photometric confusion 3 = cc_flg 2MASS d, diffraction spike confusion 4 = cc_flg 2MASS s, electronic stripe 5 = cc_flg 2MASS b, bandmerge confusion 0 = no ph_qual flag 1 = ph_qual 2MASS X, no valid brightness estimate 2 = ph_qual 2MASS U, upper limit on magnitude 3 = ph_qual 2MASS F, no reliable estimate of the photometric error 4 = ph_qual 2MASS E, goodness-of-fit quality of profile-fit poor 5 = ph_qual 2MASS A, valid measurement, [jhk]snr>10 AND [jhk]cmsig<0.10857 6 = ph_qual 2MASS B, valid measurement, [jhk]snr> 7 AND [jhk]cmsig<0.15510 7 = ph_qual 2MASS C, valid measurement, [jhk]snr> 5 AND [jhk]cmsig<0.21714 8 = ph_qual 2MASS D, valid measurement, no [jhk]snr OR [jhk]cmsig req. For example icqflg = 05 is decoded to be cc_flg=0, and ph_qual=5, meaning no artifacts or contamination from cc_flg and 2MASS qual flag = "A" . */ uint8_t twomass_jflags; uint8_t twomass_hflags; uint8_t twomass_kflags; // APASS magnitudes B,V,g,r,i // (apsm, 5 * I2, millimag) float Bmag; float Vmag; float gmag; float rmag; float imag; // APASS magnitudes error // (apase, 5 * I2, 1/100 millimag) float Bmag_err; float Vmag_err; float gmag_err; float rmag_err; float imag_err; // Yale SPM g-flag*10 c-flag // (gcflg, I1) /* The g-flag from the Yale San Juan first epoch Southern Proper Motion data (YSJ1, SPM) has the following meaning: 0 = no info 1 = matched with 2MASS extended source list 2 = LEDA galaxy 3 = known QSO The c-flag from the Yale San Juan first epoch Southern Proper Motion data (YSJ1, SPM) indicates which input catalog has been used to identify stars for pipeline processing: 1 = Hipparcos 2 = Tycho2 3 = UCAC2 4 = 2MASS psc 5 = 2MASS xsc (extended sources, largely (but not all!) galaxies) 6 = LEDA (confirmed galaxies, Paturel et al. 2005) 7 = QSO (Veron-Cetty & Veron 2006) */ uint8_t yale_gc_flag; // Catalog flags // (icf, I4) /* That 4-byte integer has the value: icf = icf(1)*10^8 + icf(2)*10^7 + ... + icf(8)*10 + icf(9) The FK6-Hipparcos-Tycho-source-flag has the following meaning: (= icf(1)) 0 = not a Hip. or Tycho star 1 = Hipparcos 1997 version main catalog (not in UCAC4 data files) 2 = Hipparcos double star annex 3 = Tycho-2 4 = Tycho annex 1 5 = Tycho annex 2 6 = FK6 position and proper motion (instead of Hipparcos data) 7 = Hippparcos 2007 solution position and proper motion 8 = FK6 only PM substit. (not in UCAC4 data) 9 = Hipparcos 2007, only proper motion substituted The catflg match flag is provided for major catalogs used in the computation of the proper motions. Each match is analyzed for multiple matches of entries of the 1st catalog to 2nd catalog entries, and the other way around. Matches are also classified by separation and difference in magnitude to arrive at a confidence level group. The flag has the following meaning: 0 = star not matched with this catalog 1 = unique-unique match, not involving a double star 2 = ... same, but involving a flagged double star 3 = multiple match but unique in high confidence level group, no double 4 = ... same, but involving a flagged double star 5 = closest match, not involving a double, likely o.k. 6 = ... same, but involving a flagged double star 7 = maybe o.k. smallest sep. match in both directions, no double 8 = ... same, but involving a flagged double star */ uint32_t catalog_flags; // LEDA galaxy match flag // (leda, I1) /* This flag is either 0 (no match) or contains the log of the apparent total diameter for I-band (object size) information copied from the LEDA catalog (galaxies). A size value of less than 1 has been rounded up to 1. */ uint8_t leda_flag; // 2MASS extend.source flag // (x2m, I1) /* This flag is either 0 (no match) or contains the length of the semi-major axis of the fiducial ellipse at the K-band (object size) information copied from the 2MASS extended source catalog. If the size is larger than 127, the flag was set to 127. */ uint8_t twomass_extsource_flag; // unique star identification number // (rnm, I4) /* This unique star identification number is between 200001 and 321640 for Hipparcos stars, and between 1 and 9430 for non- Hipparcos stars supplemented to the UCAC4 catalog (no CCD observ.). For all other stars this unique star identification number is the internal mean-position-file (MPOS) number + 1 million. For both the Hipparcos and the supplement stars there is an entry on the u4supl.dat file providing more information, including the original Hipparcos star number. Note, there are several thousand cases where different UCAC4 stars link to the same Hipparcos star number due to resolved binary stars with each component being a separate star entry in UCAC4. */ uint32_t mpos; // zone number of UCAC2 // (zn2, I2) uint16_t ucac2_zone; // running record number along UCAC2 zone // (rn2, I4) uint32_t ucac2_number; }; typedef struct ucac4_entry ucac4_entry; int ucac4_parse_entry(ucac4_entry* entry, const void* encoded); #endif astrometry.net-0.67/include/astrometry/uniformize-catalog.h000644 000765 000024 00000003047 12651445460 024376 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UNIFORMIZE_CATALOG_H #define UNIFORMIZE_CATALOG_H #include "astrometry/fitstable.h" #include "astrometry/an-bool.h" /** Given a FITS BINTABLE, select a (permuted) subset of the rows that yields a spatially uniform, bright, catalog. Works by laying a healpix grid over the sky and selecting N stars in each healpixel (grid cell). In other words, sweep over the healpixes, first selecting the brightest star, then the second brightest, etc. healpix = -1: make all-sky index. FIXME -- the following is currently NOT TRUE -- do we need it? Within each sweep, the brightness ordering will be used, so that when you list the catalog you will see the stars collected during the first sweep, sorted by brightness, then the stars from the second sweep, also sorted by brightness. Note that the brightest star in the second sweep may be brighter than the faintest star in the first sweep: spatial uniformity trumps brightness. */ int uniformize_catalog(fitstable_t* intable, fitstable_t* outtable, const char* racol, const char* deccol, // ? Or do this sorting in a separate step? const char* sortcol, anbool sort_ascending, double sort_min_cut, // ? Or do this cut in a separate step? int healpix, int hpnside, int nmargin, // uniformization nside. int finenside, double dedup_radius_arcsec, int nsweeps, char** args, int argc); #endif astrometry.net-0.67/include/astrometry/unpermute-quads.h000644 000765 000024 00000001423 12651445460 023732 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UNPERMUTE_QUADS_H #define UNPERMUTE_QUADS_H #include "astrometry/quadfile.h" #include "astrometry/codekd.h" /** \file Applies a code kdtree permutation array to the corresponding .quad file to produce new .quad and .ckdt files that are consistent and don't require permutation. In: .quad, .ckdt Out: .quad, .ckdt Original author: dstn */ int unpermute_quads_files(const char* quadinfn, const char* ckdtinfn, const char* quadoutfn, const char* ckdtoutfn, char** args, int argc); int unpermute_quads(quadfile_t* quadin, codetree_t* ckdtin, quadfile_t* quadout, codetree_t** ckdtout, char** args, int argc); #endif astrometry.net-0.67/include/astrometry/unpermute-stars.h000644 000765 000024 00000002000 12651445460 023741 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UNPERMUTE_STARS_H #define UNPERMUTE_STARS_H #include "astrometry/starkd.h" #include "astrometry/quadfile.h" #include "astrometry/fitstable.h" /** \file Applies a star kdtree permutation array to all files that depend on the ordering of the stars: .quad and .skdt . The new files are consistent and don't require the star kdtree to have a permutation array. In: .quad, .skdt Out: .quad, .skdt Original author: dstn */ int unpermute_stars_files(const char* skdtinfn, const char* quadinfn, const char* skdtoutfn, const char* quadoutfn, anbool sweep, anbool check, char** args, int argc); int unpermute_stars(startree_t* starkdin, quadfile_t* quadin, startree_t** starkdout, quadfile_t* quadout, anbool sweep, anbool check, char** args, int argc); int unpermute_stars_tagalong(startree_t* starkdin, fitstable_t* tagalong_out); #endif astrometry.net-0.67/include/astrometry/usnob-fits.h000644 000765 000024 00000001733 12651445460 022670 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef USNOB_FITS_H #define USNOB_FITS_H #include #include "astrometry/qfits_header.h" #include "astrometry/usnob.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_USNOB "USNOB" typedef fitstable_t usnob_fits; usnob_fits* usnob_fits_open(char* fn); usnob_fits* usnob_fits_open_for_writing(char* fn); qfits_header* usnob_fits_get_header(usnob_fits* usnob); int usnob_fits_write_headers(usnob_fits* usnob); int usnob_fits_fix_headers(usnob_fits* usnob); usnob_entry* usnob_fits_read_entry(usnob_fits* u); int usnob_fits_read_entries(usnob_fits* usnob, int offset, int count, usnob_entry* entries); int usnob_fits_count_entries(usnob_fits* usnob); int usnob_fits_close(usnob_fits* usnob); int usnob_fits_write_entry(usnob_fits* usnob, usnob_entry* entry); int usnob_fits_remove_an_diffraction_spike_column(usnob_fits* usnob); #endif astrometry.net-0.67/include/astrometry/usnob.h000644 000765 000024 00000012364 12651445460 021727 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef USNOB_H #define USNOB_H #include "astrometry/an-bool.h" #include #include "astrometry/starutil.h" #define USNOB_RECORD_SIZE 80 #define USNOB_SURVEY_POSS_I_O 0 #define USNOB_SURVEY_POSS_I_E 1 #define USNOB_SURVEY_POSS_II_J 2 #define USNOB_SURVEY_POSS_II_F 3 #define USNOB_SURVEY_SERC_J 4 #define USNOB_SURVEY_SERC_EJ 4 #define USNOB_SURVEY_ESO_R 5 #define USNOB_SURVEY_SERC_ER 5 #define USNOB_SURVEY_AAO_R 6 #define USNOB_SURVEY_POSS_II_N 7 #define USNOB_SURVEY_SERC_I 8 #define USNOB_SURVEY_SERC_I_OR_POSS_II_N 9 struct observation { // 0 to 99.99 (m:4) float mag; // field number in the original survey. 1-937 (F:3) int16_t field; // the original survey. (S:1) // (eg USNOB_SURVEY_POSS_I_O) uint8_t survey; // star/galaxy estimate. 0=galaxy, 11=star. 19=no value computed. // (GG:2) // (but note, in fact values 12, 13, 14, 15 and possibly others exist // in the data files as well!) uint8_t star_galaxy; // [degrees] (R:4) float xi_resid; // [degrees] (r:4) float eta_resid; // source of photometric calibration: (C:1) // 0=bright photometric standard on this plate // 1=faint pm standard on this plate // 2=faint " " one plate away // etc uint8_t calibration; // back-pointer to PMM file. (i:7) int32_t pmmscan; }; #define OBS_BLUE1 0 #define OBS_RED1 1 #define OBS_BLUE2 2 #define OBS_RED2 3 #define OBS_N 4 struct usnob_entry { // (numbers in brackets are number of digits used in USNOB format) // [degrees] (a:9) double ra; // [degrees] (s:8) double dec; // [degrees] (u:3) float sigma_ra; // [degrees] (v:3) float sigma_dec; // [degrees] (Q:1) float sigma_ra_fit; // [degrees] (R:1) float sigma_dec_fit; // proper motion // [arcsec/yr] (A:3) float pm_ra; // [arcsec/yr] (S:3) float pm_dec; // [arcsec/yr] (x:3) float sigma_pm_ra; // [arcsec/yr] (y:3) float sigma_pm_dec; // motion probability. (P:1) float pm_prob; // [yr] 1950-2050. (e:3) float epoch; // number of detections; (M:1) // M=0 means Tycho-2 star. In this case, NONE of the other fields // in the struct can be trusted! The USNOB // compilers used a different (and undocumented) // format to store Tycho-2 stars. // M=1 means it's a reject USNOB star. // M>=2 means it's a valid USNOB star. uint8_t ndetections; anbool diffraction_spike; anbool motion_catalog; // YS4.0 correlation anbool ys4; // astrometry.net diffraction detection: 0, 1=spike, 2=halo uint8_t an_diffraction_spike; // this is our identifier; it's not in the USNO-B files. // it allows us to point back to the USNO-B source. // top byte: [0,180): south-polar distance slice. // bottom 24 bits: [0, 12,271,141): index within slice. uint32_t usnob_id; // this is a "staging" variable used by the FITS i/o routines. uint8_t flags; // the observations for this object. These are stored in a fixed // order (same as the raw USNOB data): // obs[OBS_BLUE1] is the "first-epoch (old) blue" observation, // obs[OBS_RED2] is the "second-epoch (new) red" observation // // Note that many objects have fewer than five observations. To check // whether an observation exists, check the "field" value: all valid // observations have non-zero values. struct observation obs[5]; }; typedef struct usnob_entry usnob_entry; int usnob_get_slice(usnob_entry* entry); int usnob_get_index(usnob_entry* entry); int usnob_parse_entry(unsigned char* line, usnob_entry* usnob); // Returns 0 if this entry has a measured blue magnitude and sets 'mag'; // returns -1 if it has no blue measurements. int usnob_get_blue_mag(usnob_entry* entry, float* mag); int usnob_get_red_mag(usnob_entry* entry, float* mag); int usnob_get_infrared_mag(usnob_entry* entry, float* mag); unsigned char usnob_get_survey_band(int survey); // returns 1 if the observation is first-epoch // 2 if the observation is second-epoch // -1 on error. int unsob_get_survey_epoch(int survey, int obsnum); /* Returns TRUE if this entry is a true USNOB star, not a Tycho-2 or reject. (This doesn't check diffraction flags, just the "M" / "ndetection" field). */ anbool usnob_is_usnob_star(usnob_entry* entry); /* Returns TRUE if the given observation contains real data. (Note that "usnob_is_usnob_star" must pass for this to be valid) */ anbool usnob_is_observation_valid(struct observation* obs); /* Returns TRUE if the given bandpass (emulsion) is "blue" (band is 'O' or 'J'). */ anbool usnob_is_band_blue(unsigned char band); /* Returns TRUE if the given observation comes from a blue emulsion. */ anbool usnob_is_observation_blue(struct observation* obs); /* Returns TRUE if the given bandpass (emulsion) is "red" (band is 'E' or 'F'). */ anbool usnob_is_band_red(unsigned char band); /* Returns TRUE if the given observation comes from a red emulsion. */ anbool usnob_is_observation_red(struct observation* obs); /* Returns TRUE if the given bandpass (emulsion) is "infrared" (band is 'N') */ anbool usnob_is_band_ir(unsigned char band); /* Returns TRUE if the given observation comes from an infrared emulsion. */ anbool usnob_is_observation_ir(struct observation* obs); #endif astrometry.net-0.67/include/astrometry/verify.h000644 000765 000024 00000013236 12651445460 022104 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef VERIFY_H #define VERIFY_H #include "astrometry/kdtree.h" #include "astrometry/matchobj.h" #include "astrometry/bl.h" #include "astrometry/starkd.h" #include "astrometry/sip.h" #include "astrometry/bl.h" #include "astrometry/starxy.h" struct verify_field_t { const starxy_t* field; // this copy is normal. double* xy; // this copy is permuted by the kdtree double* fieldcopy; kdtree_t* ftree; // should this field be spatially uniformized at the index's scale? anbool do_uniformize; // should this field be de-duplicated (have nearby sources removed)? anbool do_dedup; // apply radius-of-relevance filtering anbool do_ror; }; typedef struct verify_field_t verify_field_t; /* This function must be called once for each field before verification begins. We build a kdtree out of the field stars (in pixel space) which will be used during deduplication. */ verify_field_t* verify_field_preprocess(const starxy_t* fieldxy); /* This function must be called after all verification calls for a field are finished; we clean up the data structures we created in the verify_field_preprocess() function. */ void verify_field_free(verify_field_t* vf); void verify_count_hits(int* theta, int besti, int* p_nmatch, int* p_nconflict, int* p_ndistractor); void verify_wcs(const startree_t* skdt, int index_cutnside, const sip_t* sip, const verify_field_t* vf, double verify_pix2, double distractors, double fieldW, double fieldH, double logratio_tobail, double logratio_toaccept, double logratio_tostoplooking, double* logodds, int* nfield, int* nindex, int* nmatch, int* nconflict, int* ndistractor // int** theta ? ); /* Uses the following entries in the "mo" struct: -wcs_valid -wcstan -center -radius -field[] -star[] -dimquads Sets the following: -nfield -noverlap -nconflict -nindex -(matchobj_compute_derived() values) -logodds -corr_field -corr_index */ void verify_hit(const startree_t* skdt, int index_cutnside, // input/output param. MatchObj* mo, const sip_t* sip, // if non-NULL, verify this SIP WCS. const verify_field_t* vf, double verify_pix2, double distractors, double fieldW, double fieldH, double logratio_tobail, double logratio_toaccept, double logratio_tostoplooking, anbool distance_from_quad_bonus, anbool fake_match); // Distractor #define THETA_DISTRACTOR -1 // Conflict #define THETA_CONFLICT -2 // Filtered out #define THETA_FILTERED -3 // Not examined because the bail-out threshold was reached. #define THETA_BAILEDOUT -4 // Not examined because the stop-looking threshold was reached. #define THETA_STOPPEDLOOKING -5 /* void verify_apply_ror(double* refxy, int* starids, int* p_NR, int index_cutnside, MatchObj* mo, const verify_field_t* vf, double pix2, double distractors, double fieldW, double fieldH, anbool do_gamma, anbool fake_match, double** p_testxy, double** p_sigma2s, int* p_NT, int** p_perm, double* p_effA, int* p_uninw, int* p_uninh); */ /** Returns the best log-odds encountered. */ double verify_star_lists(double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double effective_area, double distractors, double logodds_bail, double logodds_accept, int* p_besti, double** p_all_logodds, int** p_theta, double* p_worstlogodds, int** p_testperm); void verify_get_uniformize_scale(int cutnside, double scale, int W, int H, int* uni_nw, int* uni_nh); void verify_uniformize_field(const double* xy, int* perm, int N, double fieldW, double fieldH, int nw, int nh, int** p_bincounts, int** p_binids); double* verify_uniformize_bin_centers(double fieldW, double fieldH, int nw, int nh); void verify_get_quad_center(const verify_field_t* vf, const MatchObj* mo, double* centerpix, double* quadr2); /* int verify_get_test_stars(const verify_field_t* vf, MatchObj* mo, double pix2, anbool do_gamma, anbool fake_match, double** p_sigma2s, int** p_perm); */ void verify_get_index_stars(const double* fieldcenter, double fieldr2, const startree_t* skdt, const sip_t* sip, const tan_t* tan, double fieldW, double fieldH, double** p_indexradec, double** p_indexpix, int** p_starids, int* p_nindex); /* anbool* verify_deduplicate_field_stars(const verify_field_t* vf, double* sigma2s, double nsigmas); */ /* double* verify_compute_sigma2s_arr(const double* xy, int NF, const double* qc, double Q2, double verify_pix2, anbool do_gamma); */ // For use with matchobj.h : matchodds double verify_logodds_to_weight(double lodds); void verify_free_matchobj(MatchObj* mo); void verify_matchobj_deep_copy(const MatchObj* mo, MatchObj* dest); double verify_get_ror2(double Q2, double area, double distractors, int NR, double pix2); double verify_star_lists_ror(double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double pix2, double gamma, const double* qc, double Q2, double W, double H, double distractors, double logodds_bail, double logodds_stoplooking, int* p_besti, double** p_all_logodds, int** p_theta, double* p_worstlogodds, int** p_testperm, int** p_refperm); #endif astrometry.net-0.67/include/astrometry/wcs-pv2sip.h000644 000765 000024 00000001737 12651445460 022620 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef WCS_PV2SIP_H #define WCS_PV2SIP_H #include "qfits_header.h" #include "sip.h" sip_t* wcs_pv2sip_header(qfits_header* hdr, double* xy, int Nxy, double stepsize, double xlo, double xhi, double ylo, double yhi, int imageW, int imageH, int order, anbool forcetan, int doshift); int wcs_pv2sip(const char* wcsinfn, int ext, const char* wcsoutfn, anbool scamp_head_file, double* xy, int Nxy, double stepsize, double xlo, double xhi, double ylo, double yhi, int imageW, int imageH, int order, anbool forcetan, int doshift); #endif astrometry.net-0.67/include/astrometry/wcs-rd2xy.h000644 000765 000024 00000000624 12651445460 022437 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef WCS_RD2XY_H #define WCS_RD2XY_H #include "astrometry/bl.h" int wcs_rd2xy(const char* wcsfn, int wcsext, const char* rdlsfn, const char* xylsfn, const char* racol, const char* deccol, int forcetan, int forcewcslib, il* fields); #endif astrometry.net-0.67/include/astrometry/wcs-xy2rd.h000644 000765 000024 00000000621 12651445460 022434 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef WCS_XY2RD_H #define WCS_XY2RD_H #include "astrometry/bl.h" int wcs_xy2rd(const char* wcsfn, int wcsext, const char* xylsfn, const char* rdlsfn, const char* xcol, const char* ycol, int forcetan, int forcewcslib, il* fields); #endif astrometry.net-0.67/include/astrometry/xylist.h000644 000765 000024 00000007600 12651445460 022132 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef XYLIST_H #define XYLIST_H #include "astrometry/starxy.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_XYLS "XYLS" /** Writing: xylist_open_for_writing() xylist_write_primary_header() for (each extension) { // optionally: xylist_add_tagalong_column() xylist_write_header() // either: xylist_write_one_row() // repeatedly // or: xylist_write_field() // optionally: xylist_write_tagalong_column() xylist_fix_header() xylist_next_field() } xylist_fix_primary_header() xylist_close() Reading: xylist_t* xyls = xylist_open("my.xyls"); int nf = xylist_n_fields(xyls); starxy_t* xy = xylist_read_field(xyls, NULL); */ /* One table per field. One row per star. */ struct xylist_t { int parity; fitstable_t* table; char* antype; // Astrometry.net filetype string. const char* xname; const char* yname; const char* xunits; const char* yunits; tfits_type xtype; tfits_type ytype; anbool include_flux; anbool include_background; // When reading: total number of fields in this file. int nfields; }; typedef struct xylist_t xylist_t; xylist_t* xylist_open(const char* fn); xylist_t* xylist_open_for_writing(const char* fn); void xylist_set_antype(xylist_t* ls, const char* type); void xylist_set_xname(xylist_t* ls, const char* name); void xylist_set_yname(xylist_t* ls, const char* name); void xylist_set_xtype(xylist_t* ls, tfits_type type); void xylist_set_ytype(xylist_t* ls, tfits_type type); void xylist_set_xunits(xylist_t* ls, const char* units); void xylist_set_yunits(xylist_t* ls, const char* units); void xylist_set_include_flux(xylist_t* ls, anbool inc); void xylist_set_include_background(xylist_t* ls, anbool inc); // when writing. // Returns the column number of the added column; use this number // in the call to xylist_write_tagalong_column. int xylist_add_tagalong_column(xylist_t* ls, tfits_type c_type, int arraysize, tfits_type fits_type, const char* name, const char* units); int xylist_write_tagalong_column(xylist_t* ls, int colnum, int offset, int N, void* data, int datastride); // when reading. // Returns the tagged-along column names. // If 'lst' is non-NULL, the names will be added to it; otherwise a new // sl* will be allocated and returned. sl* xylist_get_tagalong_column_names(xylist_t* ls, sl* lst); void* xylist_read_tagalong_column(xylist_t* ls, const char* colname, tfits_type c_type); int xylist_write_primary_header(xylist_t* ls); int xylist_fix_primary_header(xylist_t* ls); int xylist_next_field(xylist_t* ls); //int xylist_start_field(xylist_t* ls); int xylist_open_field(xylist_t* ls, int i); int xylist_open_extension(xylist_t* ls, int i); int xylist_write_header(xylist_t* ls); int xylist_write_field(xylist_t* ls, starxy_t* fld); int xylist_write_one_row(xylist_t* ls, starxy_t* fld, int row); int xylist_write_one_row_data(xylist_t* ls, double x, double y, double flux, double bg); // (input starxy_t* is optional; if not given, a new one is allocated and returned.) starxy_t* xylist_read_field(xylist_t* ls, starxy_t* fld); starxy_t* xylist_read_field_num(xylist_t* ls, int ext, starxy_t* fld); int xylist_fix_header(xylist_t* ls); int xylist_close(xylist_t* ls); qfits_header* xylist_get_primary_header(xylist_t* ls); qfits_header* xylist_get_header(xylist_t* ls); int xylist_get_imagew(xylist_t* ls); int xylist_get_imageh(xylist_t* ls); int xylist_n_fields(xylist_t* ls); // Is the given filename an xylist? anbool xylist_is_file_xylist(const char* fn, int ext, const char* xcolumn, const char* ycolumn, char** reason); #endif astrometry.net-0.67/etc/astrometry.cfg000644 000765 000024 00000004721 12651445460 020237 0ustar00dstnstaff000000 000000 # This is a config file for the Astrometry.net 'astrometry-engine' # program - it contains information about where indices are stored, # and "site policy" items. # Check the indices in parallel? # # -if the indices you are using take less than 2 GB of space, and you have at least # as much physical memory as indices, then you want this enabled. # # -if you are using a 64-bit machine and you have enough physical memory to contain # the indices you are using, then you want this enabled. # # -otherwise, leave it commented-out. inparallel # If no scale estimate is given, use these limits on field width. # minwidth 0.1 # maxwidth 180 # If no depths are given, use these: #depths 10 20 30 40 50 60 70 80 90 100 # Maximum CPU time to spend on a field, in seconds: # default is 600 (ten minutes), which is probably way overkill. cpulimit 300 # In which directories should we search for indices? add_path /Users/dstn/astrometry/data # Load any indices found in the directories listed above. autoindex ## Or... explicitly list the indices to load. #index index-219 #index index-218 #index index-217 #index index-216 #index index-215 #index index-214 #index index-213 #index index-212 #index index-211 #index index-210 #index index-209 #index index-208 #index index-207 #index index-206 #index index-205 #index index-204-00 #index index-204-01 #index index-204-02 #index index-204-03 #index index-204-04 #index index-204-05 #index index-204-06 #index index-204-07 #index index-204-08 #index index-204-09 #index index-204-10 #index index-204-11 #index index-203-00 #index index-203-01 #index index-203-02 #index index-203-03 #index index-203-04 #index index-203-05 #index index-203-06 #index index-203-07 #index index-203-08 #index index-203-09 #index index-203-10 #index index-203-11 #index index-202-00 #index index-202-01 #index index-202-02 #index index-202-03 #index index-202-04 #index index-202-05 #index index-202-06 #index index-202-07 #index index-202-08 #index index-202-09 #index index-202-10 #index index-202-11 #index index-201-00 #index index-201-01 #index index-201-02 #index index-201-03 #index index-201-04 #index index-201-05 #index index-201-06 #index index-201-07 #index index-201-08 #index index-201-09 #index index-201-10 #index index-201-11 #index index-200-00 #index index-200-01 #index index-200-02 #index index-200-03 #index index-200-04 #index index-200-05 #index index-200-06 #index index-200-07 #index index-200-08 #index index-200-09 #index index-200-10 #index index-200-11 astrometry.net-0.67/etc/astrometry.cfg-dist000644 000765 000024 00000004707 12651445460 021204 0ustar00dstnstaff000000 000000 # This is a config file for the Astrometry.net 'astrometry-engine' # program - it contains information about where indices are stored, # and "site policy" items. # Check the indices in parallel? # # -if the indices you are using take less than 2 GB of space, and you have at least # as much physical memory as indices, then you want this enabled. # # -if you are using a 64-bit machine and you have enough physical memory to contain # the indices you are using, then you want this enabled. # # -otherwise, leave it commented-out. #inparallel # If no scale estimate is given, use these limits on field width. # minwidth 0.1 # maxwidth 180 # If no depths are given, use these: #depths 10 20 30 40 50 60 70 80 90 100 # Maximum CPU time to spend on a field, in seconds: # default is 600 (ten minutes), which is probably way overkill. cpulimit 300 # In which directories should we search for indices? add_path DATA_INSTALL_DIR # Load any indices found in the directories listed above. autoindex ## Or... explicitly list the indices to load. #index index-219 #index index-218 #index index-217 #index index-216 #index index-215 #index index-214 #index index-213 #index index-212 #index index-211 #index index-210 #index index-209 #index index-208 #index index-207 #index index-206 #index index-205 #index index-204-00 #index index-204-01 #index index-204-02 #index index-204-03 #index index-204-04 #index index-204-05 #index index-204-06 #index index-204-07 #index index-204-08 #index index-204-09 #index index-204-10 #index index-204-11 #index index-203-00 #index index-203-01 #index index-203-02 #index index-203-03 #index index-203-04 #index index-203-05 #index index-203-06 #index index-203-07 #index index-203-08 #index index-203-09 #index index-203-10 #index index-203-11 #index index-202-00 #index index-202-01 #index index-202-02 #index index-202-03 #index index-202-04 #index index-202-05 #index index-202-06 #index index-202-07 #index index-202-08 #index index-202-09 #index index-202-10 #index index-202-11 #index index-201-00 #index index-201-01 #index index-201-02 #index index-201-03 #index index-201-04 #index index-201-05 #index index-201-06 #index index-201-07 #index index-201-08 #index index-201-09 #index index-201-10 #index index-201-11 #index index-200-00 #index index-200-01 #index index-200-02 #index index-200-03 #index index-200-04 #index index-200-05 #index index-200-06 #index index-200-07 #index index-200-08 #index index-200-09 #index index-200-10 #index index-200-11 astrometry.net-0.67/doc/an-cookbook.rst000644 000765 000024 00000012117 12651445460 020271 0ustar00dstnstaff000000 000000 With this document, we try to collect all the useful code snipplets to help you using `Astrometry.net `_, which will now be referred to by *AN*. While there is already some limited documentation around for quite specific aspects of all the components used, an overview helping a beginner to solve astronomical images was missing---until now. .. contents:: *********************************************** Building Your Local Astrometry.net Installation *********************************************** There are several ways to use the *AN* functionality: #. Build your own local installation; #. use one of the projects using it, eg. - The Flickr Astro group, where all uploaded images are automatically fetched and fed through the solver; - `AstroTortilla `_, which uses *AN* internally; #. or finally, you can use *AN*'s web service to process your images. This section will describe how to prepare a local installation by getting and building the source code. You'll need additional *index* files to actually solve images, but that will be described later. (They can be downloaded or prepared locally.) Getting the Source Code ======================= The following examples always work on the *complete* SVN repository, though you only need the ``./src/astrometry/`` subdirectory. Thus, you'd always add that to save quite some bandwidth. Downloading Release Tarballs or Daily Snapshots ----------------------------------------------- For details, please refer to the `AN Usage page `_. Snapshots as well as release tarballs can be found at `http://astrometry.net/downloads/ `_. Please look at the file names carefully: Some contain version numbers, some SVN revision numbers. As usual, newer is better. Your choice! As the project currently (20140623) switches over to GitHub, you'll find all upcoming releases there, too, listed at `https://github.com/dstndstn/astrometry.net/releases `_. Current Sources --------------- The current source tree is managed in GIT on GitHub. Anonymous users will clone from there:: git clone https://github.com/dstndstn/astrometry.net.git while authenticated users (you need your SSH keys in place!) can clone with:: git clone git@github.com:dstndstn/astrometry.net.git Historic SVN Tree ----------------- With SVN ^^^^^^^^ You can anonymously download the *AN* sources like this:: svn co http://astrometry.net/svn/trunk astrometry If you have an account (with a few useful patches posted to the mailing list, you'll usually get one if you ask for it), you can of course fetch as an authenticated user and will be able to commit your changes:: svn co svn+ssh://@astrometry.net/svn/trunk astrometry With GIT-SVN ^^^^^^^^^^^^ Anonymously, this is done by:: git svn clone http://astrometry.net/svn/trunk astrometry As an authenticated user, you'd use:: git svn clone svn+ssh://@astrometry.net/svn/trunk astrometry Both variants will place a GIT-SVN converted copy of the whole repository into the local ``./astrometry/`` directory, which you can update with ``git svn rebase``. With commit rights (using authenticated access), you can also easily commit to SVN: Just commit them locally (ie. using ``git update-index``, ``git add``, ``git rm`` etc., finally followed by ``git commit`` to commit your changes) and then push them into the upstream SVN repository using ``git svn dcommit``. ******************** Using Astrometry.net ******************** With or without a local *AN* installation, you can use it to solve your astronomical images. It will accept `FITS `_ files as well as other commonly used digital image formats. You can even feed it with preprocessed (X,\ Y) coordinates you got other astronomical software stacks, like `SExtractor `_. Astrometry.net Flickr Group =========================== We've a bot installed watching the `Astrometry Flickr Group `_. Every image uploaded to this group will be solved automatically. Some comments will be added describing the image's location, rotation, and important objects found. Astrometry.net Web Service ========================== You can upload your images to the `Nova Web Service `_ found at ``http://nova.astrometry.net/upload``. Keep in mind that this is a public web service; others may see your captures. We're doing lots of work there, the service may be unstable from time to time. For every image, you'll find a page linking to all important files with the WCS solution etc. Local *AN* Installation ======================= Other Projects Using Astrometry.net =================================== AstroTortilla ------------- AstroTortilla (`SourceForge project page `_, `home page `_) is Windows software shipping a `Cygwin `_ build of *AN*, which it uses internally. astrometry.net-0.67/doc/api-util-py.rst000644 000765 000024 00000000447 12651445460 020244 0ustar00dstnstaff000000 000000 Astrometry.net python API reference: astrometry.util ==================================================== .. currentmodule:: astrometry.util .. _api_util: WCS handling ------------ .. autoclass:: astrometry.util.util.Tan :members: .. autoclass:: astrometry.util.util.tan_t :members: astrometry.net-0.67/doc/api.rst000644 000765 000024 00000000224 12651445460 016634 0ustar00dstnstaff000000 000000 Astrometry.net code API reference ================================= * :ref:`api_util` Flat list --------- * :class:`~astrometry.util.util.Tan` astrometry.net-0.67/doc/backups.rst000644 000765 000024 00000003674 12651445460 017527 0ustar00dstnstaff000000 000000 .. _backups: Backups of Astrometry.net stuff ------------------------------- * **Subversion** (svn) repo. dstn maintains a mirror (at ``dstn@astro.cs.toronto.edu:svn-backup-astrometry``) using the code in ``trunk/scripts/svnsync`` (`here `_). It is updated and md5sum-checked hourly, via a cron job on ``astro.cs.toronto.edu``:: # Sync hourly @hourly /u/dstn/svn-backup-astrometry/sync.sh # Check hourly, at 5 minutes past (to let the sync finish) 5 * * * * /u/dstn/svn-backup-astrometry/sync.sh && /u/dstn/svn-backup-astrometry/check.sh That directory also contains dumps of series of 1000 revs, named like ``svn-backup-10k-to-11k.dump.bz2`` * **Trac**. Backed up in ``svn:secure/trac``. The database gets dumped and committed daily at 4am by a cron job by ``astrometry@astrometry.net``. Attachments do **not** get automatically added. * **Forum**. Nothing? * **Live**. dstn has backups in ``dstn@broiler:/data1/live``. These are monthly tarballs, created manually as part of the perpetual data-juggling on oven. Hogg has an independent backup of this.... RIGHT? * **Nova**. dstn has a snapshot (2012-06-05) of the nova/net/data directory at ``dstn@broiler:/data2/dstn/BACKUP-nova/nova-data``:: cd /data2/dstn/BACKUP-nova rsync --progress -Rarvz nova:nova/net/./data/ nova-data rsync --progress -Rarvz nova:nova/net/jobs/./ nova-jobs (There is a snapshot dump of the nova database there too.) There is a snapshot (snapshot-2013-10-14.tgz) on bbq, as well as daily backups, in ``bbq:/export/bbq1/nova/nova-data``:: # Backup nova@broiler nova.astrometry.net data 0 4 * * * rsync -ar /data2/nova/nova-data nova-data-rsync:nova-data-backup/ 0 4 * * * pg_dump an-nova | ssh nova-data-rsync 'cat > nova-data-backup/nova-database/an-nova.sql && cd nova-data-backup/nova-database && git commit -a -m "database snapshot: $(date)"' astrometry.net-0.67/doc/build-index.rst000644 000765 000024 00000056177 12651445460 020311 0ustar00dstnstaff000000 000000 *************************************** Building Index Files for Astrometry.net *************************************** Astrometry.net searches the sky using *index files*. These contain a set of "stars" (maybe also galaxies), selected so that they are relatively bright and cover the sky uniformly. They also contain a large number of *features* or *quads* that describe the local shape of sets of (usually four) stars. Each *feature* points back to the stars it is composed of. The Astrometry.net engine works by detecting stars in your image, and then looking at sets of (usually four) stars, computing their local shape, and searching in the index files for features with similar shapes. For each similar shape that is found, it retrieves *other* stars in the area and checks whether other reference stars are aligned with other stars in your image. While we distribute index files based on the 2MASS and Tycho-2 astrometric catalogs that should work for most purposes, some people want to use other reference catalogs for their particular purpsose. This document explains how to build custom index files from a reference catalog. The steps are: * :ref:`convert-to-fits` * :ref:`prepare-fits` * :ref:`hpsplit` * :ref:`build-index` * :ref:`use` Here are some pictures of the index-building process itself: +-------------------------------+----------------------------+----------------------------------------------+ |A reference catalog: |We lay down a healpix grid: | And select the brightest stars in each cell: | +-------------------------------+----------------------------+----------------------------------------------+ | .. image:: usnob.jpg | .. image:: usnob-grid.jpg | .. image:: cut.png | | :height: 200px | :height: 200px | :height: 200px | +-------------------------------+----------------------------+----------------------------------------------+ |And then try to build a 4-star | And again... | And again, until the sky is densely tiled | |feature centered in each cell | | in features. | +-------------------------------+----------------------------+----------------------------------------------+ | .. image:: quads1b.png | .. image:: quads2b.png | .. image:: quads3b.jpg | | :height: 200px | :height: 200px | :height: 200px | +-------------------------------+----------------------------+----------------------------------------------+ .. _convert-to-fits: Convert your reference catalog to FITS tables ============================================= The Astrometry.net index files are FITS tables, and the index-building process take FITS tables as inputs. Many astrometric reference catalogs are available in FITS format. For those that aren't, here are a few options for converting to FITS BINTABLE (binary table) format: * *text2fits.py* in the Astrometry.net package---useful for CSV (comma-separated values) and other ASCII text inputs; this is a simple parser and takes a huge amount of memory to process big files. It would be possible to make it "stream" the inputs and outputs, but I haven't done that (yet). * Custom format converters, including *2masstofits*, *nomadtofits*, *ucac3tofits*, and *usnobtofits* (all in the Astrometry.net package). * Check the `Vizier `_ service to see if your catalog is available there; sometimes you can download it as FITS binary table (in the "Preferences" box for output format). I find the Vizier search engine impossible to use; just use your favorite web search engine to query, say, "vizier ucac4". * Write your own custom converter. If I had to do this again, I would rewrite all the *Xtofits* converters above in python, probably using the `struct module `_. But if you are converting a format that is very similar to one of the above, the fastest may be to copy-n-edit one of the existing ones. If you do this, please consider contributing your code back to the Astrometry.net codebase. As for python FITS table handling, the *best* option is `fitsio `_. The *most popular* option is probably `pyfits `_. The Astrometry.net package includes a wrapper that can use either of those; util/fits.py. The *cfitsio* package includes some tools for handling FITS tables, in particular *liststruc* (list the structure of a FITS file), *listhead* (print the headers), *fitscopy* (copy files, possible with manipulations; see `extended filename syntax `_.). .. _prepare-fits: Prepare your FITS tables ======================== You may want to make some cuts, remove irrelevant columns, or otherwise prepare your FITS tables before feeding them into the index-building stage. At the very least, you want your FITS tables to contain *RA* and *DEC* columns, as well as a column that defines the brightness ordering of your stars: probably a *MAG*. Any other columns you include can optionally be propagated into the index files, so that after getting an astrometric match you will also have access to this "tag-along" data. This is useful for, for example, doing an initial photometric calibration by tagging-along one or more bands of photometric data for each astrometric star. As an example, the file `2mass-cut.py `_ implements the cut we used to build our 2MASS-based index files. It removes any stars that are flagged in the 2MASS catalog (low quality, contaminated, etc), and writes out just the RA,Dec, and J-magnitude columns. .. _hpsplit: Split the sky into pieces ========================= Optionally, you can split the sky into slightly overlapping pieces. Why split the sky into pieces? First, it results in smaller files that can be easier to handle. Second, if you have an initial guess of where your image is on the sky, the Astrometry.net engine can avoid loading sky tiles that don't overlap, so it results in faster and less memory-intensive searches. If you don't split the sky into pieces, at this point you should combine your input catalog files into a single FITS table, if you haven't done that already. You can use the *tabmerge* program for that. Splitting the sky into pieces is done using the *hpsplit* program. It takes a number of input FITS tables and produces one output table for each *healpix* tile:: > hpsplit -h This program is part of the Astrometry.net suite. For details, visit http://astrometry.net . Subversion URL svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ Revision 22921, date 2013-06-02 15:07:59 -0400 (Sun, 02 Jun 2013). Usage: hpsplit [options] [...] -o with %i printf-pattern [-r ]: name of RA in FITS table (default RA) [-d ]: name of DEC in FITS table (default DEC) [-n ]: default is 1 [-m ]: add a margin of this many degrees around the healpixes; default 0 [-g]: gzip'd inputs [-c ]: copy given column name to the output files [-t ]: use the given temp dir; default is /tmp [-b ]: save the filenumber->filename map in this file; enables writing backreferences too [-v]: +verbose The number of healpix tiles is determined by the *Nside* (-n) option. ``-n 1`` means split the sky into 12 pieces. ``-n 2`` means split the sky into 48 pieces. You probably don't want to go any finer than that. For reference, maps of the healpix tiles are here: `Nside=1 healpixes `_; `Nside=2 healpixes `_. You probably want to set ``-m`` for the *margin* -- extra overlapping area around each healpix tile. You probably want to set this about half as big as the images you are going to solve. This will mean that in the margin areas, multiple healpix tiles will contain the same stars. If you want to "tag-along" extra information into the index files, include those columns with the ``-c`` option. Example hpsplit command:: hpsplit -o 2mass-hp%02i.fits -n 2 -m 1 2mass/2mass-*.fits Notice the ``%02i`` in the output filename; that's a "printf string" that says, write an integer, using 2 digits, padding with zeros. The outputs will be named 2mass-hp00.fits through 2mass-hp11.fits (for ``-n 1``). At the end of this, you will have 12 or 48 FITS tables (assuming your input catalog was all-sky; fewer if not). You will build several index file for each of these (each one covering one scale). .. _build-index: Building Index Files ==================== Finally! The real deal. *build-astrometry-index* has a daunting number of options, but don't panic:: > build-astrometry-index You must specify input & output filenames. This program is part of the Astrometry.net suite. For details, visit http://astrometry.net . Subversion URL svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ Revision 22921, date 2013-06-02 15:07:59 -0400 (Sun, 02 Jun 2013). Usage: build-astrometry-index ( -i input: source RA,DEC, etc OR, -1 to share another index's stars ) -o output filename for index ( -P : use 'preset' values for '-N', '-l', and '-u' (the scale-number is the last two digits of the pre-cooked index filename -- eg, index-205 is "-P 5". -P 0 should be good for images about 6 arcmin in size and it goes in steps of sqrt(2), so: -P 2 should work for images about 12 arcmin across -P 4 should work for images about 24 arcmin across -P 6 should work for images about 1 degree across -P 8 should work for images about 2 degree across -P 10 should work for images about 4 degree across etc... up to -P 19 OR, -N healpix Nside for quad-building -l minimum quad size (arcminutes) -u maximum quad size (arcminutes) ) [-S ]: sort column (default: assume the input file is already sorted) [-f]: sort in descending order (eg, for FLUX); default ascending (eg, for MAG) [-A ]: specify the RA column name in the input FITS table (default "RA") [-D ]: specify the Dec column name in the input FITS table (default "Dec") [-B ]: cut any object whose sort-column value is less than 'val'; for mags this is a bright limit [-U]: healpix Nside for uniformization (default: same as -n) [-H ]; default is all-sky [-s ]; default is 1 [-m ]: add a margin of healpixels; default 0 [-n ] (ie, number of stars per fine healpix grid cell); default 10 [-r ]: deduplication radius in arcseconds; default no deduplication [-j ]: positional error of stars in the reference catalog (in arcsec; default 1) [-d ] number of stars in a "quad" (default 4). [-p ] number of rounds of quad-building (ie, # quads per healpix cell, default 16) [-R ] number of times a star can be used (default: 8) [-L ] make extra passes through the healpixes, increasing the "-r" reuse limit each time, up to "max-reuses". [-E]: scan through the catalog, checking which healpixes are occupied. [-I ] set the unique ID of this index [-M]: in-memory (don't use temp files) [-T]: don't delete temp files [-t ]: use this temp direcotry (default: /tmp) [-v]: add verbosity. I will list them from most important to least (and roughly top-to-bottom). **Input file**:: ( -i input: source RA,DEC, etc OR, -1 to share another index's stars ) The ``-1`` version is only used in the LSST index files; everyone else should probably use ``-i``. This will be the FITS file you have carefully created as detailed above. **Output filename**:: -o output filename for index Easy! I usually just name mine with a number, the healpix tile, and scale, but you can do anything that makes sense to you. These will be FITS tables, so the suffix .fits would be appropriate, but none of the code cares about the filenames, so do what you like. **Index scale**:: ( -P : use 'preset' values for '-N', '-l', and '-u' (the scale-number is the last two digits of the pre-cooked index filename -- eg, index-205 is "-P 5". -P 0 should be good for images about 6 arcmin in size and it goes in steps of sqrt(2), so: -P 2 should work for images about 12 arcmin across -P 4 should work for images about 24 arcmin across -P 6 should work for images about 1 degree across -P 8 should work for images about 2 degree across -P 10 should work for images about 4 degree across etc... up to -P 19 OR, -N healpix Nside for quad-building -l minimum quad size (arcminutes) -u maximum quad size (arcminutes) ) ... [-U]: healpix Nside for uniformization (default: same as -n) This determines the scale on which stars are selected uniformly on the sky, the scale at which features are selected, and the angular size of the features to create. In Astrometry.net land, we use a "preset" number of scales, each one covering a range of about square-root-of-2. Totally arbitrarily, the range 2.0-to-2.4 arcminutes is called scale zero. You want to have features that are maybe 25% to 75% of the size of your image, so you probably want to build a range of scales. For reference, for most of the experiments in my thesis I used scale 2 (4 to 5.6 arcmin features) to recognize Sloan Digital Sky Survey images, which are 13-by-9 arcminutes. Scales 3, 4, and 1 also yielded solutions when they were included. You will run build-astrometry-index once for each scale. Presets in the range -5 to 19 are available. The scales for the presets are listed in the `Getting Index Files `_ documentation. Rather than use the ``-P`` option it is possible to specify separately the different scales using ``-N``, ``-l``, ``-u``, ``-U``, but I wouldn't recommend it. The presets are listed in ``_. **Sort column**:: [-S ]: sort column (default: assume the input file is already sorted) [-f]: sort in descending order (eg, for FLUX); default ascending (eg, for MAG) [-B ]: cut any object whose sort-column value is less than 'val'; for mags this is a bright limit Which column in your FITS table input should we use to determine which stars are bright? (We preferentially select bright stars to include in the index files.) Typically this will be something like:: build-astrometry-index -S J_mag [...] By default, we assume that SMALL values of the sorting column are bright -- that is, it works for MAGs. If you have linear FLUX-like units, then use the ``-f`` flag to reverse the sorting direction. It is also possible to *cut* objects whose sort-column value is less than a lower limit, using the ``-B`` flag. **Which part of the sky is this?**:: [-H ]; default is all-sky [-s ]; default is 1 You need to tell build-astrometry-index which part of the sky it is indexing. By default, it assumes you are building an all-sky index. If you have split your reference catalog into 12 pieces (healpix Nside = 1) using *hpsplit* as described above, then you will run *build-astrometry-index* once for each healpix tile FITS table and scale, specifying the tile number with ``-H`` and the Nside with ``-s`` (default is 1), and specifying the scale with ``-P``:: # Healpix 0, scales 2-4 build-astrometry-index -i catalog-hp00.fits -H 0 -s 1 -P 2 -o myindex-02-00.fits [...] build-astrometry-index -i catalog-hp00.fits -H 0 -s 1 -P 3 -o myindex-03-00.fits [...] build-astrometry-index -i catalog-hp00.fits -H 0 -s 1 -P 4 -o myindex-04-00.fits [...] # Healpix 1, scales 2-4 build-astrometry-index -i catalog-hp01.fits -H 1 -s 1 -P 2 -o myindex-02-01.fits [...] build-astrometry-index -i catalog-hp01.fits -H 1 -s 1 -P 3 -o myindex-03-01.fits [...] build-astrometry-index -i catalog-hp01.fits -H 1 -s 1 -P 4 -o myindex-04-01.fits [...] ... # Healpix 11, scales 2-4 build-astrometry-index -i catalog-hp11.fits -H 1 -s 1 -P 2 -o myindex-02-11.fits [...] build-astrometry-index -i catalog-hp11.fits -H 1 -s 1 -P 3 -o myindex-03-11.fits [...] build-astrometry-index -i catalog-hp11.fits -H 1 -s 1 -P 4 -o myindex-04-11.fits [...] You probably want to do that using a loop in your shell; for example, in bash:: for ((HP=0; HP<12; HP++)); do for ((SCALE=2; SCALE<=4; SCALE++)); do HH=$(printf %02i $HP) SS=$(printf %02i $SCALE) build-astrometry-index -i catalog-hp${HH}.fits -H $HP -s 1 -P $SCALE -o myindex-${HH}-${SS}.fits [...] done done **Sparse catalog?**:: [-E]: scan through the catalog, checking which healpixes are occupied. If your catalog only covers a small part of the sky, be sure to set the ``-E`` flag, so that ``build-astrometry-index`` only tries to select features in the part of the sky that your index covers. **Unique ID**:: [-I ] set the unique ID of this index Select an identifier for your index files. I usually encode the date and scale: eg 2013-08-01, scale 2, becomes 13080102. Or I keep a running number, like the 4100-series and 4200-series files. The different healpixes at a scale do not need unique IDs. **Triangles?**:: [-d ] number of stars in a "quad" (default 4). Normally we use four-star featurse. This allows you to build 3- or 5-star features instead. 3-star features are useful for wide-angle images. 5-star features are probably not useful for most purposes. You probably don't need to set any of the options below here ------------------------------------------------------------ **RA,Dec column names**:: [-A ]: specify the RA column name in the input FITS table (default "RA") [-D ]: specify the Dec column name in the input FITS table (default "Dec") I would recommend naming your RA and Dec columns "RA" and "DEC", but if for some reason you don't want to do that, you need to tell ``build-astrometry-index`` what they're called at this point, using the ``-A`` and ``-D`` options:: build-astrometry-index -A Alpha_J2000 -D Delta_J2000 [...] **Indexing Details**:: [-m ]: add a margin of healpixels; default 0 Try to create features in a margin around each healpix tile. Not normally necessary: the healpix tiles can contain overlapping margins *stars*, so each one can recognize images that straddle its boundary. There's no need to also cover the margin regions with (probably duplicate) features. :: [-n ] (ie, number of stars per fine healpix grid cell); default 10 We try to select a bright, uniform subset of stars from your reference catalog by laying down a fine healpix grid and selecting ``-n`` stars from each. This allows you to select fewer or more. With fewer, you risk being unable to recognize some images. With more, file sizes will be bigger. :: [-r ]: deduplication radius in arcseconds; default no deduplication We can remove stars that are within a radius of exclusion of each other (eg, double stars, or problems with the reference catalog). :: [-j ]: positional error of stars in the reference catalog (in arcsec; default 1) The index files contain a FITS header card saying what the typical astrometric error is. This is used when "verifying" a proposed match; I don't think the system is very sensitive to this value. :: [-p ] number of rounds of quad-building (ie, # quads per healpix cell, default 16) We try to build a uniform set of features by laying down a fine healpix grid and trying to build a feature in each cell. We run multiple passes of this, building a total of ``-p`` features in each cell. :: [-R ] number of times a star can be used (default: 8) By default, any star can be used in at most 8 features. This prevents us from relying too heavily on any one star. :: [-L ] make extra passes through the healpixes, increasing the "-r" reuse limit each time, up to "max-reuses". Sometimes the ``-R`` option means that we "use up" all the stars in an area and can't build as many features as we would like. This option enables a second pass where we loosen up with ``-R`` value, trying to build extra features. **Runtime details**:: [-M]: in-memory (don't use temp files) [-T]: don't delete temp files [-t ]: use this temp direcotry (default: /tmp) [-v]: add verbosity. The help messages are all pretty self-explanatory, no? .. _use: Using your shiny new index files ================================ In order to use your new index files, you need to create a *backend config* file that tells the astrometry engine where to find them. The default backend config file is in /usr/local/astrometry/etc/backend.cfg You can either edit that file, or create a new .cfg file. Either way, you need to add lines like:: # In which directories should we search for indices? add_path /home/dstn/astrometry/data # Load any indices found in the directories listed above. autoindex ## Or... explicitly list the indices to load. #index index-4200-00.fits #index index-4200-01.fits It is safe to include multiple sets of index files that cover the same region of sky, mix and match, or whatever. The astrometry engine will just use whatever you give it. If you edited the default backend.cfg file, ``solve-field`` and ``backend`` will start using your new index files right away. If you create a new index file (I often put one in the directory containing the index files themselves), you need to tell ``solve-field`` where it is:: solve-field --backend-config /path/to/backend.cfg [...] That's it! Report successes, failures, frustrations, missing documentation, spelling errors, and such at the `Astrometry.net google group `_. astrometry.net-0.67/doc/build.rst000644 000765 000024 00000014250 12651445460 017166 0ustar00dstnstaff000000 000000 .. _build: Building/installing the Astrometry.net code =========================================== Grab the code:: wget http://astrometry.net/downloads/astrometry.net-latest.tar.bz2 tar xjf astrometry.net-latest.tar.bz2 cd astrometry.net-* Build it. The short version:: make make py make extra make install # to put it in /usr/local/astrometry # or: make install INSTALL_DIR=/some/other/place The long version: Prerequisites ------------- For full functionality, you will need: * GNU build tools (gcc/clang, make, etc.) * cairo * netpbm * libpng * libjpeg * libz * bzip2 * python (probably >= 2.4) * numpy * pyfits: http://www.stsci.edu/resources/software_hardware/pyfits (version >= 3.1) * cfitsio: http://heasarc.gsfc.nasa.gov/fitsio/ Ubuntu or Debian-like systems: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: $ sudo apt-get install libcairo2-dev libnetpbm10-dev netpbm \ libpng12-dev libjpeg-dev python-numpy \ python-pyfits python-dev zlib1g-dev \ libbz2-dev swig cfitsio-dev CentOS 6.5 / Fedora / RedHat / RHEL -- Detailed Instructions: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See these `instructions from James Chamberlain `_. Mac OS X using homebrew: ^^^^^^^^^^^^^^^^^^^^^^^^ These instructions *Worked For Me* as of September 2012 on OSX 10.8. First set up homebrew: * grab `XCode `_ (from the Apps Store. Free, but you still need a credit card. Argh.) * grab `XCode Command-line utilities `_ * grab `XQuartz `_ * grab `Homebrew `_ * grab `pip `_ if you don't have it already Get homebrew dependencies that need special instructions:: $ brew install --HEAD --use-gcc netpbm Optionally, grab some other handy homebrew packages:: $ brew install cfitsio --with-examples $ brew install md5sha1sum # OSX doesn't come with this?! For shame Get our fork of homebrew-science and install:: $ brew tap homebrew/homebrew-science $ brew install astrometry-net Or:: $ brew install --HEAD astrometry.net if you like to live dangerously (but trendily). Mac OS X using Fink: ^^^^^^^^^^^^^^^^^^^^ Use apt-get install as per the Debian instructions above (leaving out ``zlib1g-dev`` because it's already included with OSX). Note that to use Fink you will need to add something like this in your ``~/.profile`` or ``~/.bashrc`` file:: . /sw/bin/init.sh export CFLAGS="-I/usr/local/include -I/sw/include" export LDFLAGS="-L/usr/local/lib -L/sw/lib" Getting/Building ---------------- If you don't have and can't get these libraries, you should still be able to compile and use the core parts of the solver, but you will miss out on some eye-candy. Build the solving system:: $ make If you installed the libraries listed above, build the plotting code:: $ make extra Install it:: $ make install You might see some error message during compilation; see the section ERROR MESSAGES below for fixes to common problems. By default it will be installed in ``/usr/local/astrometry`` . You can override this by either: * editing the top-level Makefile (look for INSTALL_DIR); or * defining INSTALL_DIR on the command-line: For bash shell:: $ export INSTALL_DIR=/path/to/astrometry $ make install or:: $ INSTALL_DIR=/path/to/astrometry make install For tcsh shell:: $ setenv INSTALL_DIR /path/to/astrometry $ make install The astrometry solver is composed of several executables. You may want to add the INSTALL_DIR/bin directory to your path: For bash shell:: $ export PATH="$PATH:/usr/local/astrometry/bin" For tcsh shell:: $ setenv PATH "$PATH:/usr/local/astrometry/bin" Auto-config ----------- We use a do-it-yourself auto-config system that tries to detect what is available on your machine. It is called ``os-features``, and it works by trying to compile, link, and run a number of executables to detect: * whether the "netpbm" library is available * whether certain GNU-specific function calls exist You can change the flags used to compile and link "netpbm" by either: * editing util/makefile.netpbm * setting NETPBM_INC or NETPBM_LIB, like this:: $ make NETPBM_INC="-I/tmp" NETPBM_LIB="-L/tmp -lnetpbm" You can see whether netpbm was successfully detected by:: $ cat util/makefile.os-features # This file is generated by util/Makefile. HAVE_NETPBM := yes You can force a re-detection either by deleting util/makefile.os-features and util/os-features-config.h, or running:: $ make reconfig (which just deletes those files) Overriding Things ----------------- For most of the libraries we use, there is a file called ``util/makefile.*`` where we try to auto-configure where the headers and libraries can be found. We use ``pkg-config`` when possible, but you can override things. ``*_INC`` are the compile flags (eg, for the include files). ``*_LIB`` is for libraries. ``*_SLIB``, when used, is for static libraries (.a files). gsl: ^^^^ You can either use your system's GSL (GNU scientific library) libraries, or the subset we ship. (You don't need to do anything special to use the shipped version.) System:: make SYSTEM_GSL=yes Or specify static lib:: make SYSTEM_GSL=yes GSL_INC="-I/to/gsl/include" GSL_SLIB="/to/gsl/lib/libgsl.a" Or specify dynamic lib:: make SYSTEM_GSL=yes GSL_INC="-I/to/gsl/include" GSL_LIB="-L/to/gsl/lib -lgsl" cfitsio: ^^^^^^^^ For dynamic libs:: make CFITS_INC="-I/to/cfitsio/include" CFITS_LIB="-L/to/cfitsio/lib -lcfitsio" Or for static lib:: make CFITS_INC="-I/to/cfitsio" CFITS_SLIB="/to/cfitsio/lib/libcfitsio.a" netpbm: ^^^^^^^ :: make NETPBM_INC="-I/to/netpbm" NETPBM_LIB="-L/to/netpbm/lib -lnetpbm" wcslib: ^^^^^^^ Ditto, with ``WCSLIB_INC``, ``WCSLIB_LIB``, ``WCS_SLIB`` cairo: ^^^^^^ ``CAIRO_INC``, ``CAIRO_LIB`` jpeg: ^^^^^ ``JPEG_INC``, ``JPEG_LIB`` png: ^^^^ ``PNG_INC``, ``PNG_LIB`` zlib: ^^^^^ ``ZLIB_INC``, ``ZLIB_LIB`` astrometry.net-0.67/doc/changelog.rst000644 000765 000024 00000000774 12651445460 020024 0ustar00dstnstaff000000 000000 Change Log: =========== Version 0.46: ------------- * Makefile revamp. Now possible to use system GSL rather than our shipped subset, by defining SYSTEM_GSL=yes:: make SYSTEM_GSL=yes * Move away from *qfits*, toward *an-qfits*; reorganize *qfits-an* directory to be more like the other source directories. * Web api: add *invert* option * Add more Intermediate World Coords options to WCS classes Version 0.47: ------------- * *solve-field*: add "focalmm" as a supported image scale type. astrometry.net-0.67/doc/conf.py000644 000765 000024 00000016043 12651445460 016636 0ustar00dstnstaff000000 000000 # -*- coding: utf-8 -*- # # Astrometry.net documentation build configuration file, created by # sphinx-quickstart on Fri May 18 13:56:06 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.pngmath', #'sphinx.ext.jsmath', 'sphinx.ext.viewcode'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Astrometry.net' copyright = u'2012, Lang, Hogg, Mierle, Roweis, et al.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = 'master' # The full version, including alpha/beta/rc tags. release = 'master' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Astrometrynetdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Astrometrynet.tex', u'Astrometry.net Documentation', u'Lang, Hogg, Mierle, Roweis, etal', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'astrometrynet', u'Astrometry.net Documentation', [u'Lang, Hogg, Mierle, Roweis, etal'], 1) ] astrometry.net-0.67/doc/cut.png000644 000765 000024 00002744760 12651445460 016660 0ustar00dstnstaff000000 000000 PNG  IHDRUUJPLTEkkk}}}$$$666HHHZZZlll~~~%%%777III[[[mmm&&&888JJJ\\\nnn'''999KKK]]]ooo(((:::LLL^^^ppp)));;;MMM___qqq***<<>>PPPbbb ttt---???QQQccc uuu...@@@RRRddd vvv///AAASSSeee www000BBBTTTfff xxx111CCCUUUgggyyy 222DDDVVVhhhzzz!!!333EEEWWWiii{{{"""444FFFXXXjjj|||###555GGGYYY* IDATxp\uIsYa4Uk2"$EfQLjapKX(ЂU  /U1,ah p2F++` =S=^EE~s_?M"ٷs>sݔR(RI"F\RD+$)5| *I mRzVK3^</ }P{TFjBѨ5QM޻ su|EژDn*wwnj&R&j}~~zRlсf蘙>ujǎg=rӟ_ b.*/p$ ζg*=XF 3>}y:Ԡq"J_pEяܿ,-HHegufgg;:FGEàkDň~ƴv?Mҩ?[[޻on.RAn1EOW)F -}禖F_X'ܟ_?t1EPqQ]{[i ŗr] cn߾GGd|G 2¬ )lZP9 ;D0WqEQE}iaxAd c⧾&w~)[[T*T/N*+*"‹_<x}:(H)_2tL&J l1 kaf'p`zAPp,L gJ*+].c,==24ZZ`HUTGkz8m*JY|ʥ4*TB&~&KQ]GPq6Ub˂PŞK m"uP|x z%n}Om҆TqQEtm#| 1n'Ի:&ªGkCA FNj:(Jtf7@Z~ M[= ~ҕ jcbK6\tˆ"KKh]]]}}]]kk'O=裯z]w=>>' w'>/|?oY?ؖ-oxϟw_>y\+&'vOO;SFa"taymPE 3Rdj(,R;8 8dU.;U/*pw0M1mx.$nlB%Y Z/REQ% τ~cc\Zn)`$u\TaQb6̓VԮ+H--MO;u r^?Yd"^>]a{wiiqqxxXf< sjd Ud:c V+O<)'u؄ Q U#AC>^gcA סOELO˴NVǪ8E*G62rMrUUQS-OLz+y|d_jssߛ"o@Rj,+f"ZGNp 18*J fCGTa)Rff;)nv2{#`s}-ZG^):mB լu8H)uȩztp􇥊P(4]TQ<Պ}*&T|SmێmuPEy 5xMU*~TYԋ-T͏d]j6U\]TAYLBù#y S(`v|T, ,Y PPl@~<-{:aK(^< a 7yJ:][tY2rZ\$RP7o>x->==-Z W,MQTFGUZYY\\YټGe{?~gͿ$7w=zЉ'WemMV S_8h=5' 1.D\0M-ua^F̟BgxppыP'gAx v/*UiE(& Ӌ:L ?^4PG]Z]rrl B2HќB"uYGGg(=7Gj鯋#_Ү]?ӿ{%OJ]k1604m*fv[sMERuuutTPA)b _2ー S333\*p2 g9z 8.{L^wA7KAOOK/h5v# bL YW׊WU$VT!,*>?ogR{NLءM UL!Tu۲d_+U|IT]cm®P:-^69{B~DY|׻/|i^嗿|d_}uΝ+f h1U[h0*U5p7E':!TY^0Egg籚*@hPQЇLlaOvBVmG+0KX@R3J՚u!BlYGEXڎV0P$.$[9c qZϣ0k0 m\P YclE筭DŽZ[$i ntmfZ} Eq7*u>p4G4:_Ɓ1|+COjVgHnQhd#YOvXѺ))^"&,GW k̃nO)cgN!`g;Oee>pxE.)jjGw~=G$\f`Mu_YhAcܴdF Me*l,DW|p+%yꚝ鎘MGE! &%JRlZi..ˢ[び@W{dN!h×Ͱϙ !b~AõUB*~C[yF֦KFMؒ\-TDZU½j% TM-u,*n/J)xMW:U0 zN؂`T]˛JyaaNv 'mC,dFBդRZM") *@ u_VV %If?^:aHy-'3PdZwwʊrv0 UO"Ar}##gn&-;{)~SpM|O=u-O?}>gyS:;-bh͋atFxw' AHLw5!|Y ^w b^1I'tNmS*0h t_ѸQXT[F3Y;:Є+V$2(j `7;C  0K$n5!UnS8Nom*2;tɵs6yʠry`@3TA/L\ v&U TsEEPE*T?Whu$A$SW%Sͱmێ?{IL.CKC79euOݟ_駯 ͏NKQâ+ 1UVQEKvCK|Չ? ΐ!=]'z AR`k)z NF hO {O&&''Qw|k BB ykjeBAĊ壊VkmDT^6'WU^rҦ*{&Q̡ 4U)M,W&Upx ˅GS<uUT:M+Sh)@D7YW< ,Uj-v&?`5*X Cj__A.B?[͏''+REѣ7ts/_~ٟ_Wɬon~O`4qh̙;GFVV$l%KjqXA*gfeU/*^#D-*0ڔcWFjD@n *hpof MN6louiwl]zdU-=g#2=1^ONN_ZRҎ! ^*Hm1?W? UxXꄫ*dPey U|GwPw؝(Pj6U\T>Ů1UVJ l TD AC7~Bebm?o?ēs#G}v|D;vlk;:{V<2]]}}eIb͑u+1VH''O*j.*UHC^Sc_iYc`qŶPE3 lR:r݊7z U(i3*UJгrֲlAC틔eR73#SkeUR8#].g q6 .]IQ 84xhSYa^/B29..ݷojjeE0 \gwz6sסJ,`I%fMWKvUpJ>\ς@LQ㜅qSe׷oߩS7t Gt|J>lfq? nTIPjKN㢢n*[F)r(׉Ef^p,74\*'UiPflpdd*vuls[Mxd&U|xob[7IȨrDA.bsCz뫏*N_&m|m]?>S*.U$!!̢JR. we*FPq (xPKLk1U>lڬ.⊥ V֕)2#n8Uɮ.&rDgp9M45v=l*1wdOo"hX}L]sR?\?sS87wNA&9*)fFR,i9cmMrLM vw={;y{c>y۟{;^}u۶G9}ZVG\'xkt4Iaڢ5AJUf%xcc @?sba{cB"G' \hؒkѴ-C:3 [P8MѲvv yQΨrH,EPksPQ5yiMHL 28uĂ̭߿[1jz@ 5ɯ2Tju1@Vڿ˅mMClaKYf9\5D-.cU}P RҴ\^[>amsxѩG!zSxv rĉ.ہ\XY=8Ď,)'vft4|'K5%jwX;̐IT4.rD_:  coSPK,UvU\L:;K?%c*8fD?d¯0DQ©rkk:;fiy BFNr< 4|hMm+Hy4XxCkS;qTѼHAQ"` nRs.q}骦P䭗*~'PW7ܦ*&W7UU,ڦ*|^G/IA^ TqER7rїN'ٟg;n;vLb+ NՔEQ{G ePb O*aSHީTK>m6$>QE8,8J'* Q')e ٍ U&\_{ll`Y~f=}I7 ly)~=_t9cI33B"aU4p|x*MF?a/#3j14s wv6ty$7Bꦦj ;qU(H ,.> /M|dA4hZH}|BK/gJ*9+RGbewW dK}{vKU*ϟ;75%G6cw ?wWgOvC. K( =fjM"QW^ٲ<}on߾3۶- %4j*FG*1"l7Ĉ83R?p-> Et8_Kժ-ǮYׇO^[UH9+v9ϊ֗h<9M %$?8d URCis…RQv)S'SҨxA !sT] fa^@^(ab4ju*ȜHH!Ӝ!Q;qIk!Xs/T4fE@#LODw2JJM{ii~XÂ:R9׎adLmM ge\ O\Il[Doq`6-@hEn_g{R|$eld@wvvd[yF!%jH*SmS:׮Y.qL^C`QAtz*OQߗbki K) n)ܒlڡCxC%,@p ovܡ »4A4$/t롊.b;6"eG~CQEs8TgpmPE2B{R*X=X󖥊c{ΰ*JH{Gb٦*^͖ Υ U=V* a ^SqSE}MW>UT>&Tq81oeC@!|ٳMWU9dj* M2L05%=3Um 2B8K̎؅m uZ*R`LG7_L~&&$! (zzΝ} OKmێ9xpo|o챭[/m:ttwfٷo!ށUJekPM4ժ}bsLeMӮ'UtQd0Pp&oKY)@eSS2^x21nLN5P(E`TjL!66"yjɣWqr #IN#?f"&at9Ɖ0K/ Fܤe+I60;i!K՛mD|/N{%UD**")5RиPOyt[ssM RZ Zn]]4(AwZh0t£""< Ȕ$ŸNd$J9~PL!>؋SDC`dy46 V{ p*O$V/ΞLbzS$Iȁm5aJA~>.f{ۥ]xaan3IU\:p{<҆Xt䤧 &ۤD*0c A[;X NmKlFZ,ku"5V{eBBJlSK.:/t 29CnFU9? l=^ ne[&Ʊ)ftPɥ̬ݩLg})-`UdK#?쫳bigb}e*'?o#[9(U_ 7z)YtۻN4Wo)cRt4ȣ4}mTattmrbg9.9Xmr U=X1Ӧ N2[*EH0ʓZ $a`@)׎`0<+Ya>ū'T.Pvhw"6]χ4n.k͙{lrxP'ue.-*e҈yɗȲ)^'GFF:;7o=n7?w6ˡC'NcxXRjʁIf쇂J>I)o]#PA=*hiPC9Z؏EP.nT$\DV\lPZ2S9월*8% X~AӐ]U2l 1 J?Cs˖Ե$p;Zo{A#2iKE\wf 1Kj0Nn7?ָI dL "4s S:;zt:'t<z^E=c5.*̻+;% wҤ*`7O8.6R s· rTa{*&-telLv"m U7TqERE[i4͵C1f)oSI;diaZwmQE+Taێ -UOJ~OLH6ZT@զJkCUjuv:DS*pOAդ4mLmi [xlF_*ƓBf3j$4.v9:ط~4<k\)$l/ݻWv=m>m#=zYN>^vJskkb:@AOyBMUJer2zT@g [5oԕI`5b#Ke]PBΘ*tL!Ya oϨPNmX}b>q= SGt+΋ "j*"-> 7whIKY/cA-Tx;Q3gEhTjJ*&&ZBW GJ1,[uB ^Tְ+Gץ K!E5|t@ XtI8TԒɉ5,Ub I?m 4*^ t0kT*2O4q!rrhG0ܜ2x"jf櫕eu*/p5.*Tow fM_$`0@&[E:*𯍩ŸgӟjUCwN)⊣)vK]*>HTQC:ltX~ۮE(5bXJ*$B[re铍r lR4%,==$r=ؤ{b1+̱\{qg遁Ν;wvwWz3ɲ%8ݓbGPQ;t;avVxBammX%=E-`e ݑ Mt[2v ׄo6 cR˾*J%j#V@bG ;$XBkr\^YY\,gv"FZqh\pBWEt7iTE ?mGJc b :86  )F׸}F)KR< UТSA :} އn-gІuA7/7^AɿixcR_%k'cswRњFTqğgs_TQ|wJ *Qm"@]"q 5UhSE ^wuoG-r~Ok.Ȧ6@W9 l?v3_`bog*ɏlR֣5T00V4Й:Guf&_:: 3T\!$þ$k_:-8MTNxK Ӟ}Smۿ/:tRϽwM:%4Z`窸W$vkK,N%W?"5:>lTVv `oz\z챗^z\Y͑l)ZA%Uq@qsr((qc5un!؉]R tw?@oS% "HI!zkDё?UqU 7!!OE(-!_lv~q-nhhYRgeQCW[\WV|ss.F0PJcPc9/U$*ηJd,_TX޵M+*& 0(UcQTbcwSRE}mE0$9+͏ݙBgasi͕K{Y#k@SR..Oc AO9?>]ۑgͣPlP*\PKR },Ljx4ժ$B)RLiˢK(a```mMw;w8yGF*feqqm"e`Ze-y,Xj#P#=ඐ³QyجsqJFTA'KwbBNYş]=v\)t ~e[#x `#P]5Lfϊl*(@90MnIC=  5SE4(qD.c 2QEX Ifv^3WG$Zd\TNћ] l'w]EŐ.6c(bB,CYEjܟ+`~'_*mthCtX~P>slϵ-fro7i'yTifBkZab>vTOizPh V H(oN@XtRcJ WRc JZ*ܟ]sz!oC* 9q!Rnyu@Rz_)EB,+Sݱ 40e/BMvmSE2GlSŕ@>!0U:]6mbX_6UHv=~浩TT1RWxbtXxǠ&\^nЧjZ0uı :qEˎ;wؼYb'I!IDk:χb#'fžV44\_3*N } >TQCϠMTޤya(Y2332223# PY9Ê*Ȼۅܹ|j,-cECY܊ emX-Km43M1"]ѬӆyUajYD-!B wq⩧hPI)`U|/$Ǘ3[t.EGԩdDwwwkkɶS7F&eU @IxKdfgye뎽ЙQ͖JZ$9֨U?󕩨Zbg=] AHޮq1HU U 8}^(9ԞLCMJW!ʤOIf8\{mm}rv Xrj\o>DWd IDAT E&cC<t&oL_ pZns##wQ.gjbȏRuwyY3iSzT$[*nhS[*:,7[qRE7r@SOζb#H;8\bZbAXqSc2ZbB>?xy_.ܱc:W'Fx ,\ b}Lլ,*aBt`+Af%3HT#ZR7 T!Iư q]IQ_GƐ!, \'%#&pReG=ztpP7OKdmMX\'0E_ؘۭZ. pKUw*]bFZ8zR\ȱh]lv"Es8杣,湭Ot\ q_Vitl eE4rNyVjaE{zzΝ`CjF3QOT!D̎ [KQ b2 v.dvCԹaߙ x R.e5|fs3gz{GG1ܻIuVUСҒ䙛a-}SC%2z<-sM 7Dϝ;zNPhsj-!V؅ өhCh):n) Nsb%d s2{X7YJ!P[<&z<RQ`a2T"e ?m#bc5tI w7k]w;42پ;_*+حzc_e~dԍIkQ;הr.U\?'Tq[%iSMoMnAbZkS? 6w荽T5,TgWH*.FڰAv^l^TDeQ7m@;7a}^4!o~b456Vwkvq?Z .ACxsVEu| qK=e_&h _*4%+G8Gu&#-eAQ҅G[k '%.CP.Q0:::5yswԔ &8%$!=-Rkw;$L99L ]NG#S㦥E51J%#(IPJ 9+*>!u.\x(y`(kLp5$VFzeށ@7!e}֛ 4P;kEx,y z$.*3(3k?j8@6zopON6vo:ϫ_{z{~Xqpw32qs[zAftrid ^Ek\޻w I%i-r앝…4]zzD#(`uaKePw+CCp_9՚[Xʸ#-7xc#2cp^Q\t{@UڢcQ+C>$P3䣮.9ϾZJk4Z0wP.f+*Do:iPy0[ߌ R+  YFZ8yrp P {_o;?/(P1;:C 1UQegeYuWsM7$PvgU`|r֏U$typUtإ֒4_4i@kskq,,^ 6J-_/UIw3yHTaŵNߒ #Kn7* 6MM;mNNIFu2/Bak"|^Ң:UNW3S..SnO (mbCUh7 WF{yTsq3O]E)R:cBu4W?B.m1 ˒}SB,$-a"1b^%DAڀ=9^&?%9CU<0O0vdPJ*r'/Bs-U$Uwk{F% ;o/;5U-;Wa?xiil nvxGJIƒ7ƒ,8^%g5D3WG IW نp'P޽O?߉_;я~_7?#'::*U;PMZ*H`~!j[ ^ґdwPֹfb\PKwx'6lΙ #ۈ2+oh ƞ 7s\6G\*N9T ]8g'WBMN"1T&Z斁RIzb`'DdÈ̓{9Uώ`:THhQK_eGp`@;aq(!&;JxS%mo7`>U$*6'T_lST9mwY8?LT1UqF-Tmh ؄R*6b՟SE*{K7դٷjo&U$={>'?. 5{ie&h ;(*`xz =жn_ TCR[q&⛌] ׏??@QvƗ*LT5S*leq6f$BA[prp!mLAammtTTzENV |b |aѶrh<5`H׃NfHLy BQtp4~1U+TGKV,쟰8aub};Gk~i;?_H 7&i ..)5pk=k,UDkvYU@`x? ΛH:>A@ |+ێb[~w_wO…w?05Ӄ3|qTAI}*_eJf:`o |@7  F8Xq(nCzpoYؒ4֋q+kcFE`UBZMY0E2L[J \W};jg7}zs -lMљA96 oUF >mSp,m|.զtA]isi7OŔʵY|Ѻ$GbD*nlP#sBwmiSņTQThSe0b*^ U.3o U,m*nժM1U4z*^ U}=YƩ } Z{b/I6=M*n뫅Ɏf\]nqJX M*E1J!x!ghĊfv5$!Evs,|>V&V\"dq@(yLOaY2љ?\c$ͥ۔+p~`q7 ozC(j֒a5RVV(ƶdr0^T5gH]^)!!0*)э֩,ENb B9 *L9t393,( K!<D8ɼv . ʥYrfVVd]5rVFmchh . XM9f{G//692"Uqgkel.GKXp 'o#ɦ&F+8nј< Qϕw7"jc߲%#ۅ, nBhHJYKtnD#/ʠ<SA4\"+`Ņ'BVd"_Vٳc8ԩ =ŨLQ͜9#S 6`musfӘ<~oͬ\ 34$Ŀyi 7 m>| m ~bZ*^UsTqy"υ6U\*X3fSŦTAxT /]T\=mgӦ4&R~I6r[BkfͽYY}9} vCdKaplf*UvofC{>U#.Uh׬K ױZЛNvIԡ<Lm.m~^)E,[9]yJ26& RO"~ 6[H%X-uX݃]QI7!Uh .Z0cL fl UħÄ ꠌBzPDbaYZ% #P*TjS[']acc44}ƻq ْ}1\+U4v͸zU?EcqɉM#=Ν[\8=w;.)K :C4Uaሠ cǏ>Ņ{L ƯCPFPu| (Ud CcDU<>ڢTk{("}/96EQGЧz$wNhQ u*eY;ӝYpe1X["nDeLuf74joO b$y.hۥxFt9bg$f/.'LN݄gɸe}1L Yzuu$fXUL>47 hSņTIKTzé9ާצ qrbˁJ(?զwiANiSiN=8Ujr͡ 8Ba^r#t@ Ҁ9lFp6 tE{6) X5tyjQERd w\ͭv_uU` Q r䤜큏cIb%U$)*p>/S6KXRi9?> }HX%sHC8bU$|LH;bMQxmqhc'cv'UG5r on=A zCq ͅs8TR]+SK vCj[ռfXriSe JޓMK啕EIVE9lyn)"B,sC'N?|ォʞ=_WD=sjddfڈ ztmwKXAЬE[l_9 O!ѠߊK`l=VV\* U eV`#LTk[C*;pK0&* vUäU, Ne+ H`]2G`+q? pompd"˴Zpq-it.FE7͖4NWDjxp"0-巽c64x`Ӧ?xu%b½~L[HY'm9sڊªTWb9테hSkҽءTq9m.82Vm+Fo_rxÓ-T6UB{rwkSU,o֩UDjv{F;|P+5ׅ~_-kvBQ얄'J&:k;x U \UqK:HY26v;xd)Rl!E+[.!q,Gɀ "[He`}ULBBȆ͹h9v74 Gk chX,f"6yW8֥)sj#1US_W܍nZx⡇v횛η[ 6֋Nm֥ .(MJNT幹(EK؛*rAVK[*xz%~Zp\xbwA_v*V|ŋK9uW:=17Ъ^Dg t*s{> VT3{SLPgC6Xx\VHN**S fPOV~AoBsנF[;YBOx,cB嘦HoĽǎuqTaJμŭMW9r-mSE(ԇ9;ܡ7PRiw>鱘*^v~߻T YCV76U\*i lSśKx N|aX=zbԙUyԻKLdao'#4'9TCR} T3TR0Y-=a913'8pXl9qcj`@D- DôćxbTRrUa%js/*ڷF'a3.$Yx&~N3jT--!k:I z [ɍ+:!8],t'h9<|>79 ʭEϗutKɮ*#|VD#nqMS_膹 Zj"q'O>u}{۷8qIIYNf\޷obbӎ ~޽^wO忓~fFc4!~i0_*m50T;/u#)W;* UaOkG~mQi]P= L87dFwv. M?yꅻC< lhzq}1Pxc$xЌvn 38Tt_FbݠӪSjfǀ6l^ X pӛDvPX=ag~jSEp. vU)*cợi*R;^'U%z.)Ul^uXLx]nnS|9,!?M*O U\xئ7*\E$ 'r1EW KL# UHFG]\u_C6]h.p_E< ZS֡ 'ZUFݦuNX2=Wh "c+8]L;dm=(/E\~ SJ)J 4d>TAU6 9Taær*t_b< NƸdZ E4 ,Rp5/!-.޼齽*^uSZ\b$#_R [7-Ϟ}W_e>KLѰϊip0N)^VW[#]n"n`?]^~P.۴ kw IDATm0~[HDHA莎bssϽpS w8B*8O3TmlFk'A,0:uoVai Uv_*luMjV(I2TwCqލ MC712뚾M& mΉz8)"Q,Uo؍QAX 6Hނ0 4z.+0na8%.C@11TABA[_<ݔa,*>гԦ U9PE騢m0FRE*T⇣VcT1u{uO*俣{V*o "<8*ŭ.Ӟ6UYT -Pܻ&'\a5B ]hcD U/.W.@?ݎ@E3+S9TqEV[3X> ȣwyJS wvvttJB3C$%a sL"fqLro0l_P;e8tB(=`WҪh} \W'_.$xc ߃"U>1lUi/)&ctĉGVLMH>9c+*x?zTcZYϨe5IK-vE[Jp j>pW]YYI膨N!]]fޓ$GOJ^39!tuCqخkP+S{3OR0U*PbtiL_?UD5 99zHЁtu_ꟙڰ3=.Fe4}kdžf!#$=MkZ_HEwS0_q{5%IITR(xH!E*QF H.,yK&So9"/GdJ o b(fFL5n@J/ J)sw DCU+U F9G5lD򹾥ǡVʯ`TwwTbI؆'c,V\l(7*JE[T%@S*̛)9. ,KT)ښ im* +<`jEĩb{A vB*( 关y$omǵ3nlOH 6pSM*K+ a8+?iU;SC4ڦxURm5ZYm-N?{s疖wM$f.BvKa x2YFEqUY }A?#f[>45fg噙fY[Tfh l 7I. 8^[n'WER"DtQCB"xzr[d$^C,3Ұ; wZ = Je)X|'a㩤:)xCVm;JRB6RyY([W%/yR,jC؟pN) 2׋u| ["'LVNM[Dt"C28_ͬm)9HRh^ tKŢsΜ)K!T_߼ؓ @UWZ|:4&l6xo_tƀ9销|z+g 1v@6\jaaA•KFIEbk=m* ** :Dm(\ 9'TR+sxӋ[*~x(͎mxj֓uBBxC ҘV1.qsԪ4lTaSlG=c=,*s^JYYՌ1D"= \ +LgptW4R,;{i-##}}55^50Wvͣ>1ӄkxQ iirT@Td9l'MN-*:@Ua2Q ôRѱfX1gEn+圸.Q=bϥtM/XK.1U`Ê*jԜ/;w/`}.;2ggöɮ}&&$Cl&ޒO]S rQ0 kel% nNNc! % f&hуj˛*6rӸztE& -UREgPo t]TK %5-Kn(*WXB0Ѡgپ}EŽU$|=ّ[BsTAPem2 ?r@Fadi5tJ}H齧Vz٪S]ݢ2"0 B,xAVRƉ0_踼8](S%~hSEϥV]T4T*G6U\zh4=6U1T/U'nSť="jM?(UT'=ަ L).!U yaM-=u " i*h;cmx#bIMoU'mx#Tϡ LNCDFAn3HĐ)3"TgT۬4x v5x7c\`g+mNd 7r  U`~):ƹ#č6n i`M\G$q ,LM1Ap$7y qG$Gav ,z8IvM8Lh2ݭ_t8}uv*9. 5+r@Q8(`䩂̩[d$ DEyƦ#a*T*7S}ggjT՘*nV64#ɅY@:Ldz:l܀(#\.s;;;0r\_ qd+[▋ 27FT9 W)9@e}%ߠ[C(~z6G dG'l7yqȖCR!!JaΜPaϰ7 PEfBӝOK5@%0I!kM077%b\>s#9pΞŰ%lN9[lg,긘iyªqkms4q1U`K Fy{\3%ZpD.\$[`uEIxbyps-,G^nmSE*JAuMT뤊mxC",TqSmTq6U\bXѦKM9_*ZY0 /Z*ǩ[zG=Gי!*cYڰ 3bBR\`k?]]Q ]*U P@4Eo+t#"2oUΔš ;h`4A5¦ #Ti|J*,J_IdږX&#qk _W^K1:;GqAD,|bgj#tuy"\/AnzZW|;={$Ȉ&eH~6D2I>'4Ӭ$C3ͣ, [aR뛂塟Tז0挳-T1|ႜ=X5~6<UVIsqLgPttщʫ3#<Tn%}I__߹sad' ں{>~zFn[jھ4&g4d JbB F[JT9͈R~IWVEI̎`Zm4B)v[Y7A?dá|1660P.W<;{\ɛsTV?7SD"iSz凧Փ6UdJ|뢊ڶ\IjSťۄ*MKH*.4Mo,U{XlSť'TdU|Z4THgZ=T_V{~ Vn ]/ "%tB§bUlloѸ}2ӜWZ7H!nidsAicc++SS  e5k>gӖIDzhRf!\x6%jRi bqp 5MfAIi{loU6 .z @Ԝ Ua~nFGW9T2e; [f< 岣]b꘷"E;e\"FeԍuuuU*2UX,E푡 ;+`TX b :gX݀*-y3*>3YɗFcbnNSLOVt@PJ$Z>{ظ+3фCv[1"ẐUG6aBk^! Bq!9ZE-XhBP MՊ`"DQ $H s E p\q]Hkq]04c{s{EeYs{=W{X_ ˼[*2 J\=XXxqƆI)ӓ6ƑZWjg]4B[c5a" U ў~ZDSTh|:0%MT} U/f'͇֡%xRIFK=?`AU\E'|nkFɧV]UɏjTqbyU|TU\zF7*.ɡuQElh# A XbZw%1E.ބGɃ#&؀*H$6@5u5/Dt1$^*`,U/E5U`Z0 /+7)d2GVn=|: DleEq<7NTJ0%\ӛI;GJU`C+!Xr~pUnm"2KrLY E_ G/Z({6F=EvuFUVA2[k:8z9n..??94擸QNι&.3f xB[X:B>,UNlrkN96LŴ ׌K*1A, DD1nF'&:::@")j1n3sHnrvרFcANaTY#io9OZ^Xag0i#Q1a#֢ET/eFި\NfVg:iBpѳj=\0MAX#?P0P%K8 y3N2[0,cxic WU"  \N S.]h H:oa=Q)XxUhu9D9RJdjic95_󺱲*1â#'n<~$2W|;'q’Aja({M[.cڥ<1AX'*0;=UO5l2EG0K~QÛŀBubgᰋ ڝ[5f#hx$qS:J}}kkc@jU`2nK['/V>h8LUp(Y~&FTQQ5cF!LaP:=[R]2=%!Jeqf1" $ƒa:=1a$UXH( iI趜p({~CT^i)˞>*[okX[84kTan&M [gkTPE-5kTYSEn5a5ըQ0TϋbHѢH֨SE>T1{ =jTqcTQ]WcCdѥuK"ռ:I b+Yi^tfv"SxQk?ЗvʟZSgv}\nW1nOIA[m )@r\Is)\FvQ7j_%eH+;6'%Azu,KȅM ^d87]_j"?l*-bq'oD*ZSClbia $ %OWU7\Ր% @UPtYZ=Jqk&zrh.Dm\.,ޏbȴ--ǎX10%Ԙ_*ʨbpmտ.KNTv\✺Um tݬ1W /Ţ$x iSx^n4A'hQcU2%Pz}P4fE |cbDSSOO"Ud-@SF@3WdE& D[P`V^6e/~*aK LFTQe8P" .;*C6k?PP^wraXJV7fZX #{iF9ᔁZ萢~G̻i_J̳[Zp*oHUWD|%];Ssxc\/oe51C\[ONrqdjTq+mNרSv9[QŭIyX\룊K*65]/UԾ"%נ =`=E3IpO2lbm+1ϰ2T\[ӈ5P*p{ם{l+76-Z㵷YʼntMQU yѕg|Rv*VK& ™خ+QDe3'J*iu1Ӌ nX1 mWH\M6M Ɔvrb@P_i i+v (]4spYw&TA3H]kIR{qibIbtW=+E @^Wbk[6~GZLJM$"@x$ <׷[%$2h_aCvqs;_8ppoBE9R^8N΋ő|B.P+t MQgNP̚F* 'Un-U5$TGYQŭ 5$T>:wT7h1'bTl"ԙ).nioYL YHUa`܎Kwc7մL4\=Z:N>G0UBv5IBU4{IF,= L(!l0V=g=nʋSKܨ*%FyT&r(kpPDbbօ*;% p'CXa.fspYyTYrȞ?Iw3^[xnzq $Q3Z[@0Qc)ŧըsBE֨":iV*PQ 9*C%.QuS4wOn*dr$k)E kć8":KNy.+ .#GEdu’Nxw醨bcEYNi}4UzA/퀠&DS'\^"b 楒LN::ںax|.\yp)+:m+pҩ9q0:)ULoᚼL31A''>vF[BP`I*AJQ)QAd=g[jTq#T?PQ ﭧBy{;]QōPEǣcbp*DeQp`ܖSvaJыЈ\?dHק&M0*I{ ȔgqI lNJ_J)17@B K @gr1W(pm*,%}fdPId/v.Uꖬ .j Vҭ1-្*q r "џb*e3 %oi*@+Z\ܿvv` +G;сkDVxT៰vD)okߩt;$uKGt#zQK*ȸDB;7JDچv_;;={[#uwIOҲIG@rIӂm-UV!C+Lgh:g"nONɑ0Rsppvvgjjp$R6 &$ٳMs"_Q5lF4UQ7-2HCHZ9yQV\us^IF RLkr:琈Tс3)d* T ƇZUǤxs~leY|JPr֨VQÊəƤFIP,=ըuaQR5"G'GC5^!T!_XM*&KŘV5\bPO+QQۚN,KX%-z^~3:lP.Rvʦzpr 9}?*e;E(UP`Qz?IyGR&2..E2k9hNe6C4_MHwnQebsڶAK^Ffvh% 2i_v,]Ƹ !5E¹sO_2>XQH >0@1%Z36 .O|hf#L062qE\b ⫑Ct%9K 7 /2HZ<};C@њU:!U\UhBMSjTQxT렊^}Uۀ*r0/Ԩzb[}kjf&e;@YlZ!QPho|{p&d9 L#QfV)6I+C M?X3ؠCJ/?5'V)OwcUj3lUrh 53A˙nOMKNy՝!T!9ZF+-n4T5[G7 2vVe9PIj$ŠGF6lذqs_s|> NH 14*<[oX5!xy+g"gU lA'!:Ot5?ߜ%{„㏹JE&D(m}ͷstk.>;ڇF*[A}dFנf-\Q6v5.TQj{ƭ"Qŵ,j*ԨB5U\xTh_R UgUUh*JMo>jcWCn2VU\*wPۉ* CAc{kTqU}-PQer1&*b_NJc\பIAS%NLUi'e]\y`*z7]Ug#y I2<<Eޒ]L.0O l*lʈXWeL0-TS]zU!^/n;{c'fC@fruPE*O6[B2#|/T1/f=|cc]]])9DGwSfC߸1?SSTBPidɋ& M]h1d`PEYO755F'djT+{ iWsiU*4f(eFTׇP]QXh) T J_"i9ȴz Nr&tlH+ SP+/Aq8Dd Fv$$Cf5WC}>t(taHb&&d2ԨSoA=V%g3LGFU ?U.Ԩb)piV&'wUnTQ:̐U,E-5*4UfbuJ! "r凍 7FЇU,E% k#!v1M'eN+3TiUK8Uj틋=ρ*^{tal .ȉ$d@JvhFq` M3?#:R`_H;$UƛT~uP1s`dgtx V EQ^$ _e߿M PMMH<> o#d ALa}նT%삙M,NE D[ȡCMM@_d & xhd#Kj|RZ8KT"ƀiE$Cl(xo+<YTQ(\1Uiw}z 0z;=@s׬hrrK1o] QGR44tws.hkk4,2O<'k<,9QŭUT2T/êfU|T1QwuITjTSER:|*Q@ৠ KUE0߈}Il k2,Fpe(:\Ee/E"ea]vRʟBn*ߊsW,ݰ} Ϸ3J'C~914ᘖrip%_ΨޛxB EZАhrBa5xZܭk8'A?_e8,xtNz\՗W YDJ(WV8qbaʞUQwHTl3?Ut4ZSb^VR*1֑޵7mkmmiq[Nc0 Ƴe)7H ѳ%pC @;tV@쓿uDT!*>AFET;QpAʔ^QVAXoZP[BrԣkEnO{@ =vņ_N)OJvg:0FWM:AV$Q!=I1*ijje^@cz3Dy)bŮ}+"r e߱LLav͐3Haa) T0LMktt2;:o[ sL#T2sUDs+Ϛ*F9E alxUs$"ʧLf F3UH5~S;OII bR%%MW37L%CZG;QMۦMgE0&g2xQ~bUR%U$P'3v% -qf$A}lRE[|&F \h(ן%~` h#IA틋,2IgefbUj|W>4G%mi"&)*SiꝨ*T!Gqf2MȗЦ~͛a:Y`H4* W~CP$l B%I){A͉wYWzz֑݉zgJmDǴLَ gk+U6KYTKD2"1UJ*DPOUJ_'vcm4x=Tpo[UՉmNX\d^*RͶXlAJWQ nxsv9ƨ*^_&o3,mj[c"FAP0T 8*rmܿ@"F(6rK(;E6pE[[SS]]CCSSС~92n$OT|$\A8QE*,VԨQ]oǤF)U葲pwRE7FFF'UjUx~A#C7*xb:WJБ$cz**Dä6v2Kfz#+˟o"U XsTP-s,6~קHKW,f2]Up)bѼan}Y++PIѝ~Wp;]D6OGD Mvʕ;wf"f U#KVTHi(k`Nr,ss/>ܯ}ZaÇZazts]v^Ѕhy*f) 󙒊WMA ibaA q&y<ؤi(b.QKK{{wTX_+f)ì>cJb/H7w&RSKK*G➢ |n994WԲ s^*J=#ETIĭy'oWZ%"Q:)go<0, |hjB9]tE[[whh<44,.6,Z[WG(gS$<JxaApO(kT?z |FB젢Fˁ*Ccƻ*r ckTqSEmkT=A{ںoUH;eɧ贫Uuy:N︨+yt!7igX6zFkܪUwI= i񩪒Ja:أcb1T֪O>sd^fD~P(L)$KFkJ)[˅?]fVH{H-Ǹqr\M-'xaHLK7):8ܼbE[[*ZSo$)#vۘ b<-ydy%GEbbɓ|/#0Ǿb1q^m~:9m;>ܹE,"ɖt U*)PdK4H3VgMMMK8IWYA,yՏ\s@ ըJ(X z:;8TDXO$8tI:q\Pâ$UYK"OˆxevRS= RAWaLFRRUt72mv>T'@k͇ffU($k({şMM"qÃs Dh"gg--uu ԩ] 3]rY_n>TceY$i9GCEjTB Vc^=UT *?25]!VLTOXts">#L~dwzXhgN48чB5$ E1; )01iIbH/FLy17>3[.T!YnOVZ u,6LO./kIPTpK0wI3J<*힜<~@R;&W257KR,ڹ$C"TiIcUcC0D=rdޮ!q QCِk5++)sqqTJc#$ IDAT~e?,1$^3 tUB $EVs&|@Wz4TcbBFm]iU"?6O0ϟʌ$EO) 2uwPOϾ}+VTBvfR^ynD!46fʢγj ϊ0Pj78mŪgH>2#E*t"ƌDQҪ :$Z*(=*`m`V` C;= a CHSS*fg/^ܶԩĹ;n*vvs*6n}iDB&,|F3U$π*fT$b}PdyQEUS4ܵTQ%XMXAQmJ}A $wU}7*defNAN{G̓)E3A)"d$9sbmUBQ6r.Uͯ:?Ce7K̊rEյXGݩ kP%NV'''+$q4b` BsAቁ뛚2"" P%I_/T߈eVl_FeB_~UdN8XT~YM.fmhf%$S?sCKTt.e >8?萋{ SFBFUd\1n LG|<$,8a'O%4B"P+H)P AN]?[@G?o9>$JBz]T 1C9GM*.8F˅*n'dJ/TqiQ2N}.H9\S 8/#Ayāqlc<'lQh kL,[QAjލ0vDrbIk."Fp4M7bծ:xseٽc-k 6Y7)gFemh4V()vꟂqQ2^[% &q#%cQBxカҞi*IijA0&Tw$;%Eb_ϧ9)p# cØJbt v uo*z8՛FJ,]}rӅWRr K+53FS]RSq'x-VHhpUǑ$uS/GSm2 ,R#6d{o1hI )$V ''3)U&NQT T=SxuiϋEp5Gchq{Ri;K"=-<^NhMŒ}B1-DNIZXSxq ȢY<]=kW{{C64,>V*>Հ $ý+TWV1'#rUTU혻 P19ۜQra|o. q5XVTQj{T1.J= -7*$k]7^9ŏeFx . %eba;fDSċR1tbDi]2n1#/NK"(VRR2(D0Wbs-UՓȳD_yVS`Tʱ/rxMZ;%#?UH` a.5c'6kCk$U!թ7 bjv"*Բ~I"tTWX `NS*åqfצ ;c wz/:bV/I P Ӱ},ۡ>=#ĥEG\|xx|^>I#THG6GL6KW"er8Ib Sy=)є2RJ+>>W n@oo_Xr1 :L3PL'M*e!:`ZmQhE*2[@Nq0VUi6yĕr ɼm טnD$Yſ t'jvvA xb||dСCinnnm=qʕC?,d ;UA*x QE Nʣv]ۃ*rݡ eTPQeL?*4U*LUH>*.>0qt<ݣRFg(ϔQ6)D=ND ږAHfQ%mlGDŽXnKhGt\ c ^K˦M/ =hGޔL+ì.[4mw_$VG'wΘļD<&%6Pmq  9L AuZ794wO+i'mUe )]sSokPE~pwʉ:wpk*cCt oq m5וvٝ(E|X Xژ U'O(vQ-%W^YɿWnhؼر> }bUN &gxPli戛 Z% nT∰ЯbIG" (U5ASɔ%cQ$kUp-5d,ќA`-۫VQGNvuvz\6w(PqSYv9`4߼N c|\V.R7R U%J7N@6x>zz==gnp\*?5.ijˉ e*4wcJU>TQ"Vλ*J8սըdP#r[QEzRlw>U kTa:O&2Bt`0L;*'U\U;*J]:>qPEi70jfM._;*r6]@*jTܩP^ 뼱گw2UlAo>Uw,'7#.y32dzzv?{رmΞݿ?NFPEFm6JonPz5^ hiٰaPT=u?%~̃@!FTRT!Ժ;/A2-V^(i$($ݍUj$UBK* /NO$ _: -$X*3'je^j\7UTiU"D*Us9K7GgZcc(5IAY D&\cVw9 $P 0"ASgdOEF:>*vk Qek_xa|6! BȪˍ"+ BƟ;hB} |r5 BZɘ1FOi}ȴ @Pb}GuY ً$`)Z4l2U= /<HGo96V }1YN @}:4"|YR侬B$]?g%-qv'P;#+@ @KT~D杖vSXb?r_!GǻGFQd+)MMmm}}Py`*,Ĝ]kZUۈ*d*:pPP N" *ueFF˙*U4 T@o"I2csLLʙ1lk:vxqm۶LM54 V"(֜hEP#?XӠFNQ$@Vw|uq'"=ItYgEE)UT .Jk(ףUFuƇMT[}ҳ}S$3MG8Ӫ $t(1. h[!uwQ4Ed㠭r~M0h UhELc5Js"\lA˱9fVeiUA+jpLX:&Wm͕z޲*U\b%m+Q47vAevܹ;;:Ti;$T#dsw )]T_*brEYŤPFԀP6{ z:b p,MZ^﵏tϐĐ>]7UU'zTWREPGY(iB粀vr0d91*7nlD_ٲ"['漰蘉lQN¢3Tq|ApiHRn(ʢ<ӧ q!b Uq3RGǧV9JLo 4|QIm_ XVۊvuU`Gh00E尡TU<{z }`CvbD%$u͍,O0@~ɽd";P\X81'8`i+M4 hV-͍ *ĉg篜}??3+/^q>.Ж X*<4@Txdd/Tq[T $ֈg`xG>E:-VJU,;V@~sb܂= FQg,[(w|XqRŹ7U ͙H=YhV[545yR N懀7iQ?U%[(5)Y,<I<^9FFxL^f(H=/Mo_46~!U@g")Լ˱ Һ:05"@&3A Oso~pXhoGp+sC/T4byJ"hIB;NuJCE[DaݙTàݥB*DH\>!CPő*jTqPd>3߹TPgH! f(qd<\;3rbbq&Z>ޱ'fK^J#p(%40SQuQ/1V-s޵Ŀ6Z9 ;+x3vJYVg!|NbSOUJQ5΢Nch˚ C<ѝR: z#pOǕ RC-C.&8::zB.}eB!sie٣y)X#j,^qQH׊ZNL pRB&QWW75c>uY_JXd41?/'M+_q5Er"_YxM Y Drd͛Ϝ9z>֨F wU<@{JUܱTQhq1S 5(2c g{m{s>ܹ.>zT Poܹe˖8.>^7zSb` M$o*c y,[,az!$׭X4T?wc(l~6;ـ׊/@  SӴ؀8e4 e>վՉϧNSEt7GGǩSGyWG#0.dT8U A+HFp]]SuS*xRtm /bw]@&T ֘ǝD GCCr6oPE^b/_P(Ak:V/7HxI-+~l8fJ%1~D%EmG]/"^LxILj4r^6M^c-~.ǝ3bU:ѢĜu#-"KPE:PN浵f*>u*Fc!o$Kfc+M;]4ƇHo%9Kr3o&E'8U>FC$a.2~L\YB>?BÆ#ׇֽ=?| @#/:8v ,ϕlΝXw,RO !MMΎ/,45uwwLXqNN4|s sSA H^~PĦ}AOј|X mƅPEZ[@k6l GEF],-I&&W\7_=ֆEćJDϰ*RܲSƘMO)Ȍ®T: WQy"F9VїjѨuL"V7 MiiKHTv\;j3>0y[Ѷjq=rYi fKVxmZS|]jWFT!C帢etCdJ@wXDRHШS-G%Qa|^ߒBQoFE DQ"HmٛR,ܭLN3HlQdF\^B+/HUYj՝ vp9#/=U"F TIbA+g"թSU^7lXW)T!7s7[< ]܌a,@aEk*菑_P3S]?IQžkTqcTQXacgv@ .,T $G a#۰_>y,ej!ZHVTO MĦ()Ξx'7oBHf8o"?Q*އX+/rƅQPaln(ňTJ~ţ >CzNa6=]':w@v?DIc[ gыm7TS*O9NO!U)mxPq!x'pҰ5Ν2ڷn*l@t>_6ߖ\J%=m;%Sqe,Y(di!C qFceΙOʈ$8OV|?#c(ĭ2B9YyK`cȈ1_(6xr9յo߶m;wwةSydSeva -Lpn+kd8(@WT=u/jTqT˭v;L?UdU,Y(ȕv81w'PE0*kTqwPEm;B`N_k%TٓKLrxPYʼnY.óO{wرjʕǏo޼C +7wu+PNigL }P<h"ٺG+=q( h '2u)*v2)WJ:iK"Y)*-[|Ν,._7Uk_*RwE7η?+L@V&PE_l[dJ6wRq >&u,V*xL;h|g?[_ň*'aQ^dBmqP`:n7Jn/R4 O˰W)nm/|r6VXl)4*}s81uE~&`sxTFD$1T*hS{ȨY:L}-SJE ) UJډA 7NFA ѭA'&УpUuV'U 3ݵ K' Fy+7 '\uH"PJf$jaZ||0}LαthTa֛Q*Xb~ǎaǦM/'9^8|ݧO?~̕+Wu6l޼mٳ8j \Z8 >l"WG"7n2%Vys3iP*TaQO@!L>|Q#*~P*R4ȯuLqn9O 55T+}L'eI*~zPwT QG}&4tEA;>/Wy䩧֮rʿ_ٻw~b` Aq9, Olt) 6Knd`ņ%D,Qlb*Z9oE ŵNW bHUM酨 EHvcWSii J, ! Ki$KYфפpw_{*48ȥ>7mIז[ZЉ #wПH/!˷Df d$6T#{l#ȖE*Xw5kP3b\ u6;vHkUkT!эôB ;emԀ!'NXd s9Ue5oqĄXT+(N.UU ;8筶Z*[tu +V 1E$:'-oLI3rZUAm7IA󡷸A? y+V)Q.u8 1O o q3}&VHjby/"Ƃm7Q^CC}} d^\ıso%'?~R^W)sϳ^\p3pu7【7&ǖUɱ900:#49@TqT UmPODE/W-?`TqFwUtK]˙*|Q55H"hw&UTBXTQwPqBVx3ø ")$Ov9Pś/{=_ a>]i> 57ä*ny;U-QFgI\ӊ't;$V_ UȚ(T,=v=#n`CSTr\V#uH4B.w8ϫ7]"-iz(K&mtz*AjfMˌWe" oo<7: *2jՊ8F'ItQ^USƖQ+Xˈ{17g9]Qmr*1й<.k2c-n*baGnQEIJZ5D6 tz.K3):h/F†(LL:˫Wtϝ!*!˦CC PU6Jj{5%#bl쭷x,?àhsĩ zb0Q7LI0?CC}},rc'N9B󫨄\ "< ^)1f8;m6T>ADqӨg*vF|wy2"ffPUxҥ'.Oy۷?ʕ/~޽GM۶m;bNB&W""5:* %_UTz?TROH~2^w*ĕG.򃽇jT)ϟ 2 8!+TѪZ5H/;*]ɱ˕*T[{V:7ʬ׽̙Kl»@ּ/q.<0bSfg\z8ty3Sx4lF{)qvʸ.ex*#bLv(&e6?o___"n$LOPGkF^ +ʩ{p:)'+AU-C%UB1(-SbLw K3 %zirKrJ5>xt~G^2isC)ЅƝg^49e//"WGX.QEgQylLuM UzHOU}Bp Bq/&TQ!'r>`T i)GwW7ƓPRtrH[_k(;L|wBOe<8>ZRք}v->fi?3B h5ϝ :߷2.rAt1+Un!#t9~*/8]w* x46ϋeKgkb|Fz$/7<ܟ SP\%zkc(xCd@cqq]p46dW~x /]r.;ayw3gWWzwٱ_=\q#⥗^y׏> 6lٲmܑ.#6kqY?ʌX.R(LSK+5TQ O!U4{[fT_`o^kTqTQS^T։o*jTqRE𫠊ː**~J}|ޘ*?U| (:=ˎ*"bіEs_B|*>!Uv*&wU:}aFw/Ut? V,+8=Gn)U0ކaN=_eSP v_p+/ꢼx?0FT'?M9ᔡxCv:Ty3 t~vU)IW)A 43N7 y~&iE>p˦B}x^.R=Lw.;Izl- b ix]ѤTwtb.nG'5ʟ7qW2)lb2V4STG[GKu)DĨa.W0#ܞ݊^Ħjaَ$EIg儀*MN(H̔ *dCCK;qL4iO zWv;.BL֣G\ko$-PLA`+0b FKIO?;2MoAqᲡ0&hwse "vYS!TQ*!F"]ޚ_|ϊ.ؗMC bx%;Pԗ$t$)X}&iiVKA߲ |&BA ғNT/|pb-s2+~ 3r-rc@sYI$Ʀr'e''a l(LC8J])E7ؼ38s9} |#G9g_\fSO=ܚ5غw~{_߸=~d35NKccOv /+5,H!Wn.U4~él T>9UQE ]IܶTQ"T6P۸?=| _Ͼm˖%WQ/slu,:YB+DPF"})" DԶ3k`` 7]԰Z jgdt>[]3f堞 Na.!'5"ܳrj>^ou,eI7WXP nʦ`* 5NjvDK> ~;:CXZV,[{+4aAkTa3^ ژh&;\/RU*Tȉ+ZZw*Yɐ6TaQ(4/ju>mqwd&IT8,gjU,$5+P]􏄓 [%VT<*N=hfs PŒ"W [\lh@̐HGǽGSQż@]ICHxh(v x#S$; Snu *NOVلs5+0ы^a+v?~V548^WDOOcS;wnpʇ~6Xvk/\x={^to~<̚5k>xժ{G}t#G<}z˗~p\ו+6mٲoҼ762G&L15E'ͽt_^O?ȏQŧ\3ĊLuoS(U@uNj^T1+k*LA( V4wT\uQEb1}SW~P߬T!kkV_U`J+ErǺ&~\Rt&y8eOTq\tIpUvu[:̜4PZhjLΓCv7gƒ*?G+ *=X,5uϰTK^:6]Y>@:Uh$c,_m~L咄*!M-tc!.t$&I):9!V==65}<==2o]ѕ<woQ3tp UG5TW6x3A 1ia$doksRK^Y VKUQPGr$wJY$j.WbT~LAOvM(duvy>Xʻ_pA9c oD{AӲ>LĶ\*GUb||}#G6mڿ]|U\eYgmx͗BsÄH^V&:\DkJr&U`C̉ !CIϢ wRtp)#VL^2vץ>_eD)KDawREg\ nj~4z"Z|-lʂ'\0ީBR^]|DG,P\ٙnF,n.۸ hmݵo^,Zr6Ũd]9?0vdQ UWg> Q3mwG4 FGDV |EjQ") h\OiqqdIxᅍ+W^pȩIx?oݕ䓿>j㏿"6{׃+Sx@ bh?FqNlRς*vԥ{kTq"c8V6Fb2T/'2T\ s 5UGDCUԨ´}3n+ۜ*T?|BWR\S Y'v,`M֝&c<Vba H$HT?(Ѹ$򳈧eP`4lGӅh@\?IiQpș&ҍU< riPi7TQ혆"v^f,mv\i4XcҌDِIBTSĚ9G8L(nz@"03h_5= Va.]zO駻IاZ &H$Ʃ+EZE65h5LUݷ뛛+8]jTQ%hWto9pHx-11FUHJT'0>^wA*-2پbU%XFsQ|hjg$0a\j]e wЈݫ6,SaǏvDV9Jǔd~):ډfx\ B^6eV9YA{ \8tyϗH7g-`~:[Z˼6&UXM ԩ}֭;~y^+ӮPL8P)[>ؓO~o}:|xժzŷ߆9P2b+ᱩ8dLrOm*U.gKvT'}bk/WsH*>U$aKN~kTԨB5Ê^G[U^T1!"T!+"#NI OXCQ$,0B}REM.\y IDAT&r *FELÒ3UYHiLL/\%Iû 4 SŲJ,@5Ta'=09*}Q&S28Gh5Tn>UiV\X F_ߡCSSmq@ 1&UJ <1>33/76v|jHYB%zQDQ5\PHlKV5[T}IK ܼ[/aQX*U0O6]}4 2ͫP5_` ?5eTC#p^nGHJr.`YĜ偞u3s[1SDTALO4/zH$4/Eyzgc|ll ^Vq9q'3 Xf탃<_lyS ? U#&`Ki7J4@..bR#>sI`q$SSSuuXزNDګv&qV)2v_p/ 5h88A33?O׏<{TU{+UHS78e`xwH&Bb Q̑I4E#\#"~ hW >xUe *Z)pҨ6wǭy2oWNfjqB*V5#2GzIp[x4lHvaҔvsd|-B{$X]b5xv2UN=%}݆{'\[rf<5͌$DMM+(PP]SP@K̨Dq,/yVMJҸq=yԭ~tg3(hַ:-_xғU.C)'HCC^mgntx;Z[+*9o@ލQMG:w< +WþPl1=th͚Y*o2e̙]|գG?w/oO??a.?3Gv7jTUU{{sm̂#Mukh_vCC:a*n,UcA/UX[*D3;oFT dP*b2"EI;~)4U[*(J #s2dȏ~7srmHtz*eb*Mwkqh#GǟmXa 7(ĵ;_Og#c~fHF?@vt꥚6p Psݬ+)/,?ĉ}a')]͞d o&6-߿~c_VP7Ϥsvt>S[o{|-->;cmŊ͛+;{6ʕ80jԲe۶56U)JJ鉷LIKkydibU@#槜A@@ ToVTCbUTTn\Cx)MQ_*E^U<@J~7B !*E_*J}iGJ߭edV/P T[?_;?YTaWM2~yI׊_3 HcePu[E7Ҳ@$8T.5Ӊ*Rn/]/U}M/>cѯgiKC@&Vd#s"x>eU2L%Wk? ˽ 8XsG^W``sؐy,)ą9zf?j<"M vs_*rTLP @՗ެVf`Îk'mCgFJH1IyilBwrAw2~6qx jٽ\UQc/)ږbέ]rWUIIk+W㕪oS> bk~MԳ۷Ғ+YmR =C/j;2_!t ~ *w}خb]{ ꦗUW緷WU]aÆiΜٻwY_x͚-[ݿt>V*ZNxqؽ{${ݻgxwyZdĚ5k99ȄuQӧ#Vc#"??"H CAT]{f*o!T1\ q٘j]ԁYoMSEb?C<~|?κBeni騍b^c޾ۛC~?xu1b)OQB&je:;[~S FϜ@\3NI,4)U vh#J`v#M 6jrx @~~\2]_y[ t0(=}{7lQ {(U**(/B ̚Q@ Q'*ph**ڹ/\dmj \aͦ }!HV(QRsźټ͋ Z6Sl"Y] r#Ri V\4 6d;(=Yv"CmLB0·bXO ܲ{wKt<L_PZeFO吺:B8 Ɇa+R#|V/G>d U3=w6U6}}1uiᤌ 7TW駕zʔѣ [~UM1;U MSN4pHNRHM*Cv [_|;%};NU$ ! SoQNM6fU[[23o_ KOo oq#N~\e~eҤOޱcSN[(Ͽ⋥K?|p3kk{ʔ;v\4mچ ڍݫV57cwi>vS,+E˼woL>ѻ^T֪:k"T1 r0vOolPE8~SEMGrvRTaH/䛤 ١U xRͨkUVG܆T@87GT|tA zm7nm9T~Ri1{w& PP'U2S-샱jJ++1wX@<++㭧9mi ɚ9GV?eZb*dӌ! s'ԣ5 *aBBkQuUS _R9 ,IM(&^Vɹ|ڠICߋ}v^pi ?IYC~+n?nj#xBD)AQ)Yx}+ :/>讻vཽpxMe%GQe#PybCyv0p 7{L,,fiZ~@! @I%jb/N湩埦}}eeii۶Z*nO6;@rrv;v_/x{ذѣ.\zaZZZ.seq_{z/u䳷Z [),\pq֮U\} q{ 0TNXl0 So?#oTLh0**v@dbl&&<$ToTA[=@\PEo*X)l8|U8|[RE)!}өg8T$PҿGBO>pOoUt1*'2)U "ʯ?zCud1ZS_V[QրU LV}R#+PZn)Xi3\w;;-ki 549f Zjr**XĿ.ўHm,<(5W?،vpy%XCE;]V71~Udɛjhǣ(8yg?{g/^ʊA*uM]f{˟vnMUERA^(MvgH5r(;hb8=HfC?8ltkNȏi݂ #WfP*"H~ ]1Pdu"|,VSYZ.TFFS 0-{'G譁\$܆Dŗ/Vꊞ;kׂ.=>gg_gW?s|SO[tBߣ}=tٳ/#q_>|)nݢECRT.UmûJZV6"gffv6IRC_2Upؽd,mPlZŽTA#AQ(*+}}{PqL4^H IDAT>,<yؐ f,p1U  T!CKm]\Y/+ %ϡUP TQ5NDL={._=V\8?UҸ0bFe@:N&bNGlI YYǎ3|?~ٻ:{/QHoz2"FM(8$쯔N^2AOb:n |澈-wASr~E!eJPJ22P}۶G:|x֕+\zُ>z׏ Ç >ҥow|}'-9~_}O| :u *Ν?--Tʥ==}}55ܬ[,ǽhC* 9c* +n*ULSOQżPњTBPRT oڡwfR)ITqrG_Jo*wn&U_zT1dT, w_U ľ.)|5!eayN1{qzkkVVTS"oTꝢv&GBRN{1ǁc5&Nē*D6 ielA`9) ck{ƇC)xГ>_i)q. L4sr--u@M_lu+myyiiY`Ego#HYV !gjeXxhE%p܋G$~/YYUUUuupN%/p8c.PҬWKr'pT{ XpX:ƚE!*3 + b\X_wl'gE3sVٓ}8?Irfyqb= ~g f3[Nz駞zk?2>@utب(吅u5.W Z8FX#"EfKJ@)wRf8xj{rGU]VT|CH '4Kz+([[󳲎moG&F8aÂKS#G"YX߯[ W쳟GQ٥K~c܏?2eѢw}رkɿBњGedHggk+b6QEEk6a4'PZ[HHʄT1zoUTZĈ^*NB"EU*XfQ}Q[*2ۗ*|q3oU|wsS}$ oU"*XUB/0tu϶+< AڵkŊ^8qܸܼOP1CK8O 2kwh=\ˢr>0i6c$>Ӑx|jY2uuYYZhƺ:Q3Rc==oUWc%\(lR0:5L| F OЉѭS7O2:hi%9TYoj28ʰ0*t`[[^^^uuZ@M m»oʽʗy^)Ζ 9[5F83Љ#rMOB!TQj&ψjz~F$T kրI1U/XAyRDL1^ΣB[#xd؃`o%5?"i IRr%| 壕Eb?bŰaG~_"rKo(4(Qߐķrpg8FqCmii0 A:ɶ VB[fE5Up迼I컥|aT uQ 麺"CYYͅ/8q.:>Y`ڴ#z俚8GS~K|;DŏG/Ǧ޹s'N|O>1bΝl݊k\x͍=+Z~Mk(kA <$T!mB@PɱjnUVT 5M@1zKM6ʤUK2fPEIV*n&Uq|M efTkVwF͠*]JTPRw`SFӲ޼LJG%X u3ӭbN.(7nܘ1'Oo_EEi)8?֦>-\*2 &kTIM+! agΞ3TTyic0.١-GQKw:SmBRc'[ZZ.5/A^q8qSJj=N̈́8y8$kt5+F,1 ,mVVjTd6jh-,,@6dq ;R_.硜ǝgkCJy+dў:tB h̭;gvg> @)9]֍5\P_iYOry]D7bAcuOp^ ɉ@CZ&pi c.DgfZ940#SZگ]$L!<7> FkN>@9+bOdԯ?,YxaÆ=o/8f̈r (y]Z ˎ@4LԶۂiVD6s=h7G*Sڐ:{O_|>1cfΜן9C>--.nl@+*B֒>(TV-n-*Eo*_ŠPE$T6Rs꥛FAPEˢA Z>Y*Uj yP%KC2ST$TabӬs[ ST1xTn/U|_qxmNI> T*:O3 6U ŋ~wGVpcT m0= JJ8Ν"yDq6o쓟||%aQU{6hf}OĤ0g ͯ%Kbh|䟘#1Zs6B`m @*ic+WΟeK{; `xHݜGCzՒ;ZZv޽맔MHTRrx"qr Pa˥B+^*燓+2{~jNƥ23A#%p'P砘XDž*t7 8dq=u~͉-f~nm\Wׅ)蹬 +ϒpǶbլڦ@2<ǰ_kѾ-1q mUA !r8? p\{n[kQuDYg 3ҪUkfeuVEH֦8ދa PYh'Ɲ>mQE$}Ӏ0>ת[w}?|5kB?:"x$pj1' `ٞ=z.Qrs,h[[8ښJ/;FI'bcϘ\wSyG/E:``uϞ8U`eūVjy챇ŭvڅ gx͋w2eM O/~?`gCP;K?>~ch9`}nގhͲ 0C;HdШbh*`gߺN(/̺.ߍ7?͸T U~`bTQݾ3iȌP*RT*1ŠQEbs r* &UM{*HU"ն8V "ULoY CUBl^O`Shi#&L }}茣G33" *T (zpƱbÎuZL߹UX!n|礸h6ZMVZu"U菑х8jĮ "?glQ} ZwǍ[rL|_GA;}C~iB|{Hi2#_aGSga#޴HF*X0 q*fG$wi:mݜrؒtmgP@ufU*Bb!E+%BFH-!'1L5 .L,<'p͸L[Yg1`YJ>c֯l |c +bנ h'SlL3IsϢaӶpK20֘O@|y而;,#Y Gii[[AA]kTU96I)2I2k+o 4Y]F]=ڲ%Qc$H ; rc/޲%'gkJ3IO@k5NjTA'SB. IT3Nf%h67;xMp7Odƍ|=)i|ToZF|cYRf2WTdd7#ixڸg]Sϝ8o߾ ,A޽#ĉ֝>lJzqUW+*"Icٳsn[ƸHcr~v1T~BB(.]Y׹W~<2S.L꘡K]xҤ͛-cPMt?=|;Yz=@w/cƬXc3gΜ8qJOeHQE*JOP3Ezt||淅*b{y> 2:b=gLՁPYcE',P)V,SUmi݈EilPkCYY?׿ U,{ѓLI5 QQN55+Wb(VXʇ9S]q<4Ga~jOXhU$۫w, EC4 R"uu1?4 z4?;iL/T>ŦҚ*!oTsMobT'\t4Fh(+JcBd۹|68ÆÛ 0 p$9:GH>aGת[CWU3̝80րЁN@$*_䀔uˆ͂Ι,fGk OcPB~"vטdFv UاX w*hw(̴S>DTxhx^{z -}WWEEVV_dD"f4,Ac8!7EY8/ TP5Jg`{&Y"1/g{byf40ւW <2k-PzW֕1IEȢuu%%f:pQ'RCXd3"IP|+MV+/oo߸eӧ#ՖK>ckƏ>}˗8kEk:f 5?dŊ?\pOz׏~ѣW?p;&Mz5h.;w-ׯY316 ҶoGJm'U݃HarTSۛU%ᄂI!SIu-B‚ G ,_TEș bfg_߳d Z9ˮǛ;IvY.=Cb%P mgf,|iĄUإ͒Tc0Qުb֮`:ɥ7) O:#)Uu8j*|7K-dٛ$5*9 4eYGvC<;n'(_h֩ۅ!!ބ!C#M!r$N?mT"%cJUP@"2q+,''Ò?y sv< $*LKC;R@4@ֲ~.i(f}f) J68%;:2|v*k2QEx.tuuQ,ml,,ޏ^Sb׮Çۇj;o=ujv6m+CxCp-Yu+vޞ[Rli IDATZcȭ^^<^v u'L6kթ,Y| )UDUt/jaTAhϗHQ Sw_0TݕUTZ]]E>WSF'.U%W势Ϋ` 7_1g*=0߿j:,py'x'6 no|rso/(hhW*hϐӒ%i G/ڹbDc |}JBiN{D^ neiTN/j TTҫZ6Ơ$ 2-cDDqvݫt 1I aj*MFebWKiu?}+:Q'9E/kn lQ*&g1L^x4;IkIbV>~_sI6[nc<],h;Bu; i$w]Z6׶߬nD̯/RNo2A(浈EO:oɓq-fټyʔ) =śG~pO? 3f,_NJ7<8bųgo8|`WظMTYYY{ \%  .UDǜIW rIQŗ vȻ!T{*U1!MYc" RE.KRjcקA )| "CPr쎡``/E>Uv@~;(E))TԪ؊O/ X\eϟg).MT]VZX {1.wJv z3?Ii;<# _cqr; UX$l"#"*|GZx[{ݖ^e5wIaB!DV!'1T!'3E\Ǭ|@lW a./+Qgi7G,SD_OОJjz|N_uº؀$ͦ mI=B[Z .B%<#|9.O<򛎴${®<p0QCY?LI:C1H pA$]|Xkle<f"k 1UfO[ *0#B%b$]ܬV%6Ub5AmX0BR6jgu[o]*$Ҝ  Ig c;9/>@= *n=p6 ɳ9 5S󋊀rZQtip3;U\nUܬ&WaPDPI^[STeBcKW NBfQ$> _D-"OcףuݠjXSTDK_*>6bۆ*yEo*UA59*EΪQ̧bXcb9:ي?a#0G;CFZOc0ҏZ3U 9m@ݲƑ-/Ux>a`ZZIy˫-N˾hV\h멾(t#!HP, ~H-;(pjvZM0)vXsZ0o7VvDF4@c ]Q^Q1ggs.(,6cWW8<oPmPYU* e,+2xԨ>FqlugA"x߄ef66K74?'%cƠ FK" {eRvE!*jD *VUl#E>QH|Wjv{lWkjZ[ʲib#j{[LGq )@jh)D2#W2/B8I2 `wK| 䨡 p^PA5Zaa9yW F,u*\vE*=BX?\z)m1V잱GmãQ:-/+`J;>SQ7#N.`'_|]kUܹfԩ/SAYxRջљ= bL |QJ=Ir*0M&O޹sڌR*9S$j/SI?~L֡skU8Y*QD0Qr؞)h&PU32P&%Ip $U)/p8pRKWO6a*V62F*ۣXH{L_-T'ksŵY(u4 Tc 'ɧ|DE!5{ٙnEL U[ ʒV*[MOW~/RTKͩ&<ʂ@KqczO ˁg {xU9}FOxriszL} Ki|I yQ+?x#]sw' ~~XwzUDz[Zv޴i[e[N :> B(Ժi zziGy$nǏ`@fQRbDk7r`c N=#?sԩg\@#FLx1g.X`Æ ظ**L81teef jT12Bm--OQW .;dHƻ4LQ`Qh|@ Z+Ts'RTA7xi*"i*^ը"qx6 i]-!,㣰`AQzIRbJZrEәiST&5QQX湊h``(Ob#a-clHWӚӎq PBXDDlg` BI%ЄZ+ԴdDAQDׂǂb#-*3^t8;H~Ü͐OeS9]8ns&Ry^}v>#5v(=Ӳ"J 7Ud06Ԥ־gMpD\ WT Y>t)[*[] Yx҉5!Y6b20J0fx7N kԀ\'H?W.P:;235؝ rAQ]>tJwx@]o є`!bkk}܂{k'Y5~4ƒֺ ~xH =R6®zi%"`$Qa ,hX2ۖR4rJ _XPHW9+^B2Z_R -+ޚ 1^1E1~[Z*ߏꥳN0)n.B#xqT YLJS RM!Z-_JJQ疣 @MUTQړ WVPEˌ/E򦗢o*@g8*Ώ2TU۟6)HQ qN``7\!xPѧ?U@ۘ*,It|UsVUMGFXK-ot sz(.v::IY +F ݚ@/D"6RVw8wLaTa .H2vwua>z7uDc@h$?ICz@?2x\&)#L讍i tAV>0IB !4hg9|Gr˗tIz%cA4N!I=,n~$P=_̅ȗ?~֬w]533\+ny%L=[M9d hU&޴y $P'c7|v5|C Σk k(@zWl:i|ժT-[syy==$$2l˓&+**ZrshcGo$ɜb;+s'}}'O^VIIUUuuCbUMMN@䢋ڔ禂|˙L#x"cM55U?~dAo/x56_\L1UL˖k.Y߿~ŠիO:xpwߝ:uر#F`?`5ktiڴ+#R h|E۷#Jq2q(py履|RE"zt tш ˺P U gx"Τ`CEFRT LMb;T($(|Tѱ/v N?v0w: D78T!LƆF~S m?U[JR(s:(+~נTA%+ks*J*lLj3![thoɫT2D+/VLl^?r#YjC c~\YۋMs䱠AR[8h_hgP ˣb= mǶ()9|–z?9ʏ5wwᛮΨb^?"jyyYw7mInTL3U ӸG556LkQk֟g-P29|B_ʣhB.NB9nUXj+< hTto67o'N2gU,:}ڵ7*B_e2\a%IWY-/6iirʤV՗ԯmOޓlSV)$g0j/_WAA WWC+aFݹsԨׯ?z4=]dHAJݑa9)(Cn(?o۶j| Q*Ps#U[.Y2mZg\OfͺxqY܈)֯Ǯq,ٰA9S < ~de(zzzXrMF[*b9.T ´A.>URU$ћ>ڥ LTwUׁ*sEG=x*RT1TqP'R q-8 T]~{R(p'ӺDŽJF9X#%BUH\[QQoR&*s*T-{s<`cGp2N\?3'[D{xI]ʊfl=eiF`EGG wk(0Ϛ!1wuO`An.% ? Oc,ն1fs5_qxcgWv)U \9#5ێP4:@Ղh/ IDATm_͢*3 7@ᕱLB>n8m V!O8-J"baxq8[8Ϻ읚:T.#WltirPBΎ Uu9knFPoQߙEè50@"*,R'eA@&~f6WL1ĦRhУ&[_d+LOhD͝ISK+J}T@ & iƄOW{$ɱ; ֕a-MtOOV-[ ssϝ;t^zdxib@?PwT.Wiz pv[unPŅLdxضmٲO8|ܹ(ګVM'N.:v.=\qЎNM:I{_";=th t2"5ah-{tv"@k+V~[^YahaJC0nQ6k/ f¾UkQ4.W| U/3 śMы\TQJv;*~ŠZ-iÓ@E*RTqcZHBXk@ʅWEܘ̼ە*h+=<©$*%6ȟb#뉝XAm3vVܹܰfĬq@)MF>pKW74E~>^oe>Q!r^cӢ=%4vt>_x鏆9>*Kv{ M*;(Q>OgFǝb>(Gob.nnv|*@|L3۶秥UW jk tچTjQ HM*T1qϞ4䣪ZHyx|28WUu7lXv-6+g/?̙C߿s-;wؙ3Ɓ)(Ps)`OT_WJ (U5#(U꺵>E@ɠ}v/ UDgR^LQ7K]–i3B/Eĩ79Up7.#E7*Xosb w2D(mI"Utv%iiK+G4=r T!Kbz?cXI*,,&GNEkU?/<9B=9*cJ醤*}ŐP9UxG҉לr22 E:CA޵@/E[ ;QI<𚢀GPTY 0v?=e0`kpa83&f֖ XDǥGIB`EPÞ: *:E,|ۃʚ:BBF/KO_K ١t1e %yO^E7A ~4EaYTA7+`.erC(X5&Q$nm~Np4.o3JH)JIN]$#]٣zQϣEkzį>i^kdܸ;'N?N7С{n@&j80j">{{gdXYYQў=}}==1BeY<^HQHjT+]2ҥ*h $es`DOeMQ>Er +L?t|svs"E"IUg5@#riGҐ;**Uu5.UCүH]@\8T1cO[*RTqR疖3MU ,WERTOyKPNJQcxc Z..LQ{7*ڔcN67CK]w8U4MG7|MTL ^**XlS];Uv>H~Fxbli3lihrjQ2z-@[sB;R&2&tۼO\  W+x5ܚ3A=R?3njjm((/noQwؽ{Ӕ.2YBEr{.Scͦ zrʂ@xձmryhц>0jn@ҊK/2e8KEMU رCPtʭ[;wnd8l+*BMl+(؟٥rMFUFvGPEwTiQ*v"E>UkOSS?&jSECi^ӨT@|o=UuPթ"R0T@n`S2K{Y8D6MA k/Il U>Ңp CCeWVbH0`ǂj+8J&hbQ]p/Ydܸ@4P;pb-vwԩO<1r$S\9mڒ%"'g N5T=Ev^=TSS]=={P ӅDMNSS8j X*dUl4f1a&EUTO"CMFyR ٠*jy鎧O{nIѮ*qŘ?~g7XS׷*Qlu4نE}kZJt5&$^ rfO12biB9}]Y3 +}EXI>E8\PdTRTqgSET AUXF(EVBcO !uHQïIa+{Bm7MQEWW3S9&t}TW4Uq|[B,Ez>cexL{^2QאjXDV_=h#+fLfi\$P<+JThVf"E먹 M Hˏs4Q"Zʞ%AN.:}+ѳvd--H\/F}4d4-*T!Xt,i ⃒5ɀb D;TA҉FĔ 31K͖D 4دA.KDJhvnRv : w#6q zw6&Σg2?7R6 e#M8*'B$X6OcmDc*A 뢣 (mRW{y_ON'x'aN"wtF K؛@{l}r/*$6iLNhvh h6a(l&G"&w`i0q޳;y|i6/iV|.U l@TTee56=ܼl2TP&٧OOtK8)?L)B@ԡD"E HCƸE>[vfTv0T#ZǴPycO&T#$x2Bb 'E):iGe^1UN1UғUZ{SU-%l\s{;kի& WH1̀)d+9v"רnG/>?Q@UNDXk_Z>ܬQŭBRbRBFyoU `?yƃ;UP')iWP^ w֬%>%NS3rV/9RXҽF^MyvQ'z6/DL(dw)j:}<\}KR(y篑ܻ9Y=uq^h|-)ȄxPcZ@#{j9.>pnW8EJK~$'ֈ'a%0IW #D,'Ebr;cA30U(c>P5r0;i -:I6վgOs>7=S(rg؋,~o&DLpfas,CPe Z雖o'QwfIzPk" s򪡞" ^Kf*1|lˇMvcr%Ta^mL=߃[$e8j :fZIk4 `5PcW!f"!Wgo//>Ÿ,?% c<[Ƒ)7UaUb[IUk/Cgh*dgDl#yJaV/GAUh uV΀X=HeϞ_ʽ>đ#]g<#QϷ+ᯗA{6ޜҌ%;T(8* +E%n/Lj)VTpf WE>UpYbl muA/,  yyd*>0£wA>x'w~u||oKeo'~ZR@qH;h:uAWkk##2iA1CB>ը.G\v*֨";Uu9?guKUT1/eTAOըP*V,TA;A#jc}cPAfc j݁UEPHع@A-VǪ~XN+MWb&M.%Ű.JdKn}nP%X pcpN3#Qބ#OLgg>u/:42;sKUZ4 Cڑ&nL*tMP4sB-I_jũvǃתvwt #koJU(}+QffmCMeΡ"X$fg/>Ҷ,>%7aNd$lE 0 U9 `7 C _4YZpXbD6͖6ov$0)(=:::7Gƙ%!KvBkx\M9kSduya5@s߸?Hq X[0)y/+bHmO>)XAkoK7ސ͟TOh 0&wȹs9AR{llJTt&$DOqF5p5"+v xWjTQNC3?tފjTQ>:Xw#STFU—\8xG $>2B1a|TWKcWxz8$JA\kXqɳd##؆1 % 8*8(Bx2,M3BWO10 =pn!ݘR6}U7)iOGK3YS.9j[ SѫR0tDVM%wK @Lˉeϻ$ nbB 삱c9|sd|@4/CP:H;f[oU K&ېBMS9+djjeETw@jl}`3sO6NWbf:iXwfPfoǎD-Ð6,ol#8jeMLel`CzH {XgZБ{mPugͻ.ޒqi##{otBcZuA](mtTכgޑ;O|7+Dbn26覘;4KAV^ę}9ŰG𙍣*hXHT-%geܜdl 7ʨ:тA`-IĒqڗk{OK.WC*S#2q~ƕf6zG[7dfl4C!õ*=v%ўCB%*B=8HtΕ]Fnkv7_zw#v-l0[xU5%S^zpS-POzKGYjkYеRR]Mm< A6s 57&NYw6j.KYJ?zVT!~ZV@#H,FM+VD@tj|(pQr^Z{ORq-eڳnyiݟ+G]Bw++.o5'%pݨ_T풼JE4*pfHhXV}qtJSBՑCW׮&>-1cˡc8FL$O>͸Ǿ}{:8q9-qYY*^ }H3ֹ#ϑYUL]TћxLZzF7 U!>𫧳UT⊮ᤇjTq PŜ?ᑋ/Ob***CZI/#L" kXv_(q`MH$oQn MMͣܥ2PPAB4 kmŠ+^6ZJߤ͌+qZ7j'U)&&c`l7m а1΢Uʭ y쳢S<{Sy2%+e.l-ùnQy80aJԏ`5IiRrkױL  :΍{~~h)9/)+qpq|ȀX8k?=-U5L>=([fB5o_U\޴$M<44>.)u{^WAkin࢐KT'4q`+YoqjV1R) ,q^(e`PO)#0=Ƅ5[%$xq˯*#:FA|5ʜ.1fINcؾ-T8}>ԩS};F}tbT! aܐks1,䆲e/ ;;+ٚSSSxȑa -%yGzA8h'x%Ź=GM CCD++Y3Ťv>+gQAI5;QžgWUcT$g_*w_kTQa|\:4kTOQETըàx/F+7osTA Z ^iq:$שR+PݏIR ;uDʫ-YS{aA*_5aڽ殆يZ?thlQ 3TG9o!wpQqd/:wy/j^/_,z^xx=552 _ia[H5Qœ*Nʨw3U|DTzߝ8vkTQ[.l*rjXIU|tT5F7*zTAKQ԰-QײuXoe5;LS-'dMVBቪEO9c4ܶl6"B $2( hŸvl<%'<r+5EFh}5*հ($\C4vp7wKr k㖒 .q}{ݻ~zs'b#_rV"W ~{T=D+i8>f40XC7{(5MSU 0z t062aN<74, E\Dptz+Xu,B:z!^>]7΁AbS h>%Tatt[/]d ?NzUTT"WM1pgdCz*3J) NPNN[TaOoFXDBkl_Kt,0dEU<t!bqĄ0zC9rrl9}Ç]R,ַ4a\˗%EseE6K}!ykݶV`ǞmU}B j./;*&@U|TQǯu FjU3nf <`UTZkTq#b=(J=&̿QEVUW9 *& X^?R*vn^*SרBUu/|6S5QNC4teTџ?&}QmVd* t2Rd@1[I JvqRC4!;r@^";{NWEP)0ZLd9U>([`$*c= # W~[qgʄS{bN pym^څ \xb*g^jJO5#Wŭ\'ATa(?MM$Gkrsf?0H4?/ŵ~w?vdd*N2I^gDϱyw+2;+aH)YN2A 'SФ}o0+Ȇ&y4<&=5/#$&(aY4aU"nHдvMf1_蝕ۢ |GܕZQ|GUD~bQ ǍKj8W3[僓`__W0a_I]!O>5P! q[֑Cq,Y[;~8$]k\ŕ+/%0IGqIi܆&FR8tNry,U`5Pk*g-QEk1A /Ԩ"D?-PŘ/ըC.'ho58oרbV >VT˽9PwnSTQRRj.j/>OIAep ]B]VdAD.˶г Pַ"0Z*xd^[*XB7Ą9 :;Xo;,TpƆlc2u= m_ڍɹgWW|y(R`_LX-N+kUIrHrƴ*M[;3tFEB#6A5;4`{0\LeQe;Wt_=*EWNa 6O D.]M&pH7=lŠh\ N-8e2pHZl'! .e~GopX ,QEE 8#n97A# m4EQ0!*eE8\d5]x%TSw<1#jL3㊭(:LUb0F"0OlZ"4M<-1>A+5eUd/<EXR2p81x_PJ}oy9= rK :&"P4- ˉ–,^@ng\BУSC8D~@Ht%$<ih6)*xdXJ} )Y['Z7A ͊&WHM{ܢysܺ,wʴx?>U G&SFWߴjh&23I +b_6@ﳨyÁ>8 $v-X TU0-GBtnTw4k/\x啅wDFtȉH N @pɕCC##.V.+!9!A Ky@1!1FFFt:W*dU+ ~zeFFw8 >T1zLR+5UTqU|V8kT!P#*CγìF][*z ]x*c T?(bam*bBY M53"&qߛEkXO4 nBD=~Κv. ͨc –S߰lNT.( ?9d JmΖsN&'xJ ' *v;?>4$( }@U):ʌJ*pRn2^QK4 6ɢ0-i_Z_-O\^EC{oǎ?uY>طnr憆9*'( Ƀrh̪D^25\^xެxS*+"@rerd@q 爐:flϚUQsB=Ȕašq`ECOBft9n` G5 nsl#ȏj^cSZ-S:TTXUpAFըB>iqz E1?9] ҢdJK*T! ŸWP%&G d WDVKS뒗8sYY-ys)h9ɾAP b8IQ&'eS9&F@$AĹg4Jם&˻x̙8Av{´ Õ00/pnU%ű._ښ@1 sHDCP小DT UHC&RD"!r֨@U*PEcx ;TCըPS*LU~' #.T*JZF9֣T k*.|yvCd3˳3d:9eSfbK[$dO$ NfBO路 ,hs'zgL81MI=L5C#`}ʨnKg: nk#(K7l x!0\u.J49='u—@1,>G@$S*m@HL0«n(2YUM%(_ȹs?++r+%ľ,3xc7ɎY6'Pɓk6p\ŜT"Z jvV*u來^l! 3`|%bW!d au! 2qE3djouI~½߹<(0ٽFxYE)- IDATk4"ΎA jTq0؛(ڀkTqC"O*8^J U =*A*׏ԨF ^r@àU\88v;lcHxuVB K@ TBȭ59|~N04 1ًGs\ƒ|=yfp:ZmŖ"2zFo*PD;"=,ﰏ"DMC5}6lu4'BHX*qK)G!z8gb~ܹ7xP֣Ѡs3 Smn9o=׼gCbZlLc)dd =*ʻ1aؒEFbS $+[1٤`F@}(9lR[[>1eA%WxMMPE4` &A;T* %rC)$]x…61+MO^}"1fxL PSVƅ1 (K. "⬱2N<SwF8{tE["FSj7:*;/w^$.VS|U,Rt bw +B\{SeZ8LQ@& I^YYvmxXf䣤sJpdhp@WU @0XJ?Y;Uc U3.gy*nUdd=KT1k&#ZlLQAŁ8.-#O8_UԨG 81 oގ11â}J LE5F*RP*~Ϝs]3~(at7N]3PF2 鎖d ((ͥi@`Oڣ ²}]g6~gizksqWSH֢ /j04YlhDėWL*«Wz>r%i- |0\k5\d)p/_;}zO(ozKY~w5E+>'kqʅX͢`QE E{t[HYM!m?f:)V /ݗr}պk5NJUZ\ںTUĽTFfٳ+at"3r&"Cj~ج:RPS CXl/gP#)'/^lֱk/f_.&AF `"U8fgϞ7?uWhR5PSqAz#@]LxQ0Þ>t Ob+\nD:fs~~jj|ܹs׮۷xd^hIAN'OOPGK0]mDBM^>ըG{=J*T!eQj}|jTaȱHPE.[I)]Unh, xT?{vA\,r//٣bܺNMW=|e7m%3prrLR# "C%,KS*hT[\ M5>2XUDm*oh֨YT.ł\QEsl^QE*>.Tˬ<(>*w plBz !ZLM}dTۏAϿhҙ6O]ܹgɌE?-?:?)`|qTa1ECwPU ԲvxjyuA4=704Z(*u@ouo(0X\oax!ƧUPKxRqj*b+ r>l:mPYӏ[S#tƨjӶ.6ty' "{qYP0k(L wh!C;}@V%T+|DaTjAC^M!]ܾ 䕓;|;RS*n_:P/-|TTVq5QŭE*o ww;X1Ӿ PeEuyQ߃)b:n枔؅^eԢ $:p鿳Uٰ ˬmGz Bi搓-:,/Ġl"&KK cbF$N6QfR[ 6wYTagd5c'!i0>63ޗn͑E {6_fk&so$-\QmU(cķ|j]r1o&*Z@#é)tƉ)|U8@X,_YQ〬_#(TbJ̀ KYb¹Lvo'x2_'ٚVF6 NE bɏ MQPMjRmA-Js™ kY: a@N%"_ p\]+mL(wDrO=A`dX|Q)#i^r`c T!w=R 4%XB-煹Q["F+DQ5CݩeR$+1qܝb 6uGDғ׻kTQ[*ι77[7U4 +UԨV ?7U/xXQ7n9ho݈**BPE+jTQ*<8Ժ9Bt*jTJTmfba]PE,90@ƊUDPf j~+JVN1UtW|.Β:>=f^Njpi\ڎ(^O^ 0m/S:U WSGe';CJC X3)z.[Kesb]q$"ByK) l&Slfe^ lсDCe@ŚiAE&j46)FQ&&sOM>aV*j(/:~dxYwT&  Q4+[texS˗U˭iqg]jkdDEV>;fEzx`\ Z7GEhK|?fK(RHښ7اOx5QDQ(e\WBL@CGՓK"TwTInҀ~y}49b =#'ZLƆWInlNWA9 S [ aݢeif8[}dwHS<3r7A~ ѭI|K_噥ZdzqhZx2$^EpL ܤ{N2]OO)G02;cc8ĺb]JxS+}ʏr⢯E/fAUȝ>$_c%"Bc65|9XԪ($㛝xȑ#W JHRCFx):C KZϤ(Oį;'_xᩧ~o~@)SӧC_is҇ = %=jJ 2v4{ Y(015522==p?:甄n-MqyZ(jS|*r;̙ @M& wm#,H$JX |`E5 r"ڶzWc]`l l@{|y*E=d!?)4#cY4,lX]Yٚ ͧij3^2B@k'Grx3H2f۝B$1 rZKHh^jT j#ɜ@>Y;S w H4 %9\c 7>4bرmRH3ԫ}+8}!U$pH @Dʙ/wexh'a顡/ q+kN ,%ivnwt•/}0*wp9 ;Ax-@>yy_*5Yxy*nh6#NLרF7UPqPEw+b+v,JXRy-p*LHٚK;sHU1-e-@|իO>yO?_[ou@~Pz}ɚ$"p)#Y 8[ M3"2W924}JXiKn`׬ _K@xC+,_ufr/&c4C-Uv>C>Ɗ٥ ?# vE:& (*/A_wԫ)#`G&4VQJD~@ hv'F[R@>[6 4}jdy}忎,6XIښlHt0&L1i/] qv"ځzU#FQ*FKԺ0TqA&{ PE򘠊G1UԨ栊*n-hrjTר& _fe[sPVH#*Ļ-_H4rU$،+PJVp$`Km) N|3g~?Wip#Ks Q׌&IzݒU(*BE:pbAgO./ ޜ,!E7 Xա .BIGtZM'-=РoID;*bST$ pm|_זHeD;YK&'=>z29Mhw‘5f"=z14Px0=ru #Ӄ|@E .[ArTb_h: fUX\iIeg.\X]MQEGv3AHIwImR\+^ z f$),˦!I&mQ|۠ /+дvLD:ko1ɮ9A0cRn*W@utu+\Y-'NHAn  LY 3@LÔg CQy<*v}yRvq\tBN7zwt(C@ ^'q1)ԯniVR5P95W*̼eh)3vۻ lb  aٕJ1kXI-F!V*"mQ$lzh26wY}<F|1ViP\nn 3--{K.vL!"?2G\L G!"%_F UwxKXU ܩlQ\__l*jTPE*N ȋ]`Eb*jTq;_$:T1?/ⅅw=ƥ QiE+ p4\E&sy,n%NJСq@POūWwzKNؘdqfjN`& P+ V/(?ad_+ͮ3^>Vi᫬¬}S2rqnVGaI('>9sZ*," IXfNږ°U\#u K+ :G[(ce# *xV={y3'<\SZTRd`"{`4>TA@2@L%0`!UWW_mxS=b[\ io z=TUxȠFPJ',I@)@~0$%ldsKie6%>ӧ<צ+T`6I>&u*n͓@u! Mf+u׽M&ǛC*aʎ5:L1]zQ1hn Fx끌V>2rci/.1波f܉0?e D@\GeHf'^yXͦNcdQv'_г;Us#fnj*d8PU|xTyQ^t|\" "QE*>,GQh Xqvbd{\JBo4VTQaj$B9 )˗76S:9Qґ<PYF0%W# ˗#&X>(NY< mc;±y^c̈́9MY$˂NrGiXv25{V+=m*(w 7L U-PE}pH5h+O$O\V{TKW;1>x&2 5Ղ\^,Ȳ١!a&Q4׋*lŰ# ߕr9c?nKWI-%)b#(  UXq.0CTk&|Ÿm*Dys츻yѹJ'~Hഖ5coِ2 H C][[\iv1aJ"`Sc9U? f}t*²(ӱ&0Ծ*[\ uEF a%^|#;0$!NO88Q=m*x@wtMF/MLH1pvXiKgAT1U@,[]D"kGcG4pK5QŇC'*BUljT%cGn8P7+yK65 \dݙbAjܣS):Jx{m+9SְM)<':,TXQ*i SG$ I~u+7U"Yg"24 B=!)ɠ^t@ީ"i9N+l=A L*Bhj8ph]2U@&f6UT f‘= J4zw?"ˑy4{d(nPl}Q J%dJP:P]ɪDžZ}̿O5ɝN/hܩƩtd350lFd |áyfeA@%X'Q󹲚%DPrk 0Qt)7N f%V@Iq MqSq_<_uGZ|$U.~hv^+tÓN^|,,%Ŝ |ԁ AO anF<<ԐX\x2v b 75 e8.GEՇZk˨պPEwVKUL}gtFkG'*}s*jTqèbx oz%Cq 9fF5nU<@w:O U49Xpm' 8ݻ%,8g?VB&/1%TH~*`WOOjp;[3xBn 0z()nO/  %nU&k۰dT ,ɨQBΒ!<8I$O@V*9{,5E*q -1PəE`" UT([JXX"q,C0 $)ftR(2'6:XmCո=N.ty3GNء_|JTDR %,SrR{P!U"qRp8\gwYAV'Ճ։8m=*hFT ?َԿ0*zЧb-8Si  )! R+byœv=9+ h`OUBVW >*F x$w5mTfPH߿5Tcia}>݁U,Q\p 7TaP!XoP#+v 19Xq!NG{@._`Pj࡞F/ɴ5|PEc;U <=OUXѨQE*UHAMlQE/d5QōvgOU'Xz` t [ %N\2N-[-Xֈ0,쳚X>wߩޮ"$]U-Ljp نCvYĔo`)}%Zd"b Mfn1!S0SwƨD[\KRÕAo(U- @Ṽ))OF,*b9ݣ8'O)Rk) _=ieҕ✹wS13c9AOPed&x US \AIjᴈv蟶Dt)X[Bd7A<4R 5+ǁsyЅvﱿ(d iEE2M'Ӗ 6!`SDh.}Ն&FV%m['m*QTQT@Gf01H^KCH*‚ F@fRFp#1Us3(uo80(2S窇m86Y++"HɗqW{y_n'p] !^8Ȣ eNOHu0B`bS@A./ VDO;'YjL@LQ"=gEXH5F%tj&&&VV&& CZqP5 g3SD&w4m7=KזnK> ]8<8JTAڛV zQ=wo[;XK54 P*i05:f*t#Tr|ϫ*Xf^ @nRQÀ OSX&jnmSZv~M9˫aZ^ TA[~g] ?X4XX~. sxӀZ)NgtqȾsxwfB0plj2@"u.g5F7ت()!#ݹ׻QA'U,_QE*GSE*vN#}jTQQšU9fPCPU\'*2.Qp<}MPE) F52frpF^$ʪ_1UV±Uti3 S UP50O>! :P&—YV-f-G h^U4B8tꚍ*ܹۨ{0*$WvĞLE'ZIe ׇ*0փx+htWށsΤVo'Ѐ{, Ddʨ|H땨B5&"Wi .l4pz/@UD9bv6^/Miƃf a8 bBg'06vڵWϜY__::(_7~ oaωD TȻ 0?KZ ^t¥9W#˂*Cy5h֨b3TBPNCQAgQ]|}*?'Va2eښufgi4!?4VF} B JNO> jƌ5twc`B'aQy6 >K8vGV@[pX&zzcCx{PUܮ러b?ךopG@@)켑<̓.Gdӕپ)U,&ImUݓ(FFo7\\#6.7Vԗ?NMM 6ĩth+gu,ƖUfiqtEP{f!*TlvQEUĂ#ݪRUpQ/UW+PN0\73eΰN'Qq#tZ[}#P<*Dc9DW38G^E[ /0nҙxȊЬD9)2P*-p Tj=250&IDE`>yTg/jM߃eUbq*KND_XPMS_t,E#6)Myʷ[ xs8VOwGȵۧϳ#>6XdxTJ[jLY*@p7@;I13B@<WCe*V M/*PEg&*`# pkz}F։PYG-VN(Gg --1U\[`{86g^6:JY@ 5*YFHN,I#x^T=: ^lzc'=W\U_"}I2LoUxelLR5:̗-Tȩ/+8Cl_CB dU5 *Q & Giz@.A{Lb]K9Ӣ/\Fi!zՌAXAcS ރtFx_t* oCe*e6O5â@R R ^Gfͧřgz 5r.xOͣ=eХUnyiui5 5w!Xtbs4;U4s5QE*/]XT1BF DDo*XV3;2rj CN'HFi q$GS Jֹ !ͦ*8.Is~;I]I\Tڕf_*韓SZv61PCn T hb~ƽF$Jy"@#T}*^TAPa݁"v25Qz _1݁[F|BVРQ1-,qp ڵXU\JVT#if4:`]C>6dr{; U R'6B I?i$c:^z<ᤦ_ *^OWĻ#90Nc&g4BƏۀ -#$BóMJTa&An**d*Uĩ욢0>O0Q( +򝿣>wnh&ЈXAiPJ(2ODGw}XeT2 "|TIL{H"!9UYD)Re,:+7y֫}!(K=*`p-W:B<^ C "2>f(+Rxec)d0ynQw:dȢ/&TRta|&\)b.]15"=׆1(a* 5`q<鋶 g,/sGLX\&&HGR K.A[q}!]8EdZ37ב,´tQ)0n..XUNbKtiw"hvJQEαe23Q tTm_XxF5R7;U9XA٘?y 0C}Ô; P- "TW `1PE0CG}|┪m|4v14B 饨®}&jyp+M~0=$̋HGUttKFR]!Pkנ ˁgPE^.;2Ћ_T[s*4Mz+4чZP70"ўeo҉Nʹ 9 *fM}(XMܓqtˤKp76碻Eߣ/^p岮 r8-$[:v{~k)]Fxb4 U>ozK%3QE3á/ff>5dwxs?*S3*vjTY;۸;QEK¾K3#0*G:oŷ>TA[K멤H!+Nbz V"*y*rXEn%0ʆq>.aPvX E#'DgT w8:ad335NF]RDSN\NJR6*dqpٖ5K[ ddfBHL£AhT}4dr +uIx4 y]@$ٚk6PA@ԀUʄoNӒ4 s}rԔG>.QJt= 7Bvis͔6q`brE%/oM)`ܕXǠ;Խ\V7y> 9y&[U}f fR]@tCkpVȦsr(~z1W|Ձ9wʞbOOˡ:=!"K'b C(ݕ}5,g/^nq uϷ۳һO|Ņ\z׀TQ*_ eEn곳f50ws碊K*^$K܁"VԨ.C}?l$̶Q1^G ?ad %2'38%x؄oS6UmکN$OԸgԌ*8aP^#.$Y.̖qƣ@%#$ a:DvΊuUږ?@hbŕ ¦VKE:O#iDu+e^BtzVt,5O4SӏFW#4}& cA(F@RTdZsQȈxƐCظV59?*^g'TcT6y*^͔Riq]d^JrY{uh%D v4WaGQTrVTvY GmSm.+T$iMz|h,}zTi;BKJi4մoY r#ɝh4Dukx(*;NŖdhԍ2`s.mbbz+a ɦy-̍|ʮmzb pIxp;r+!04;1::*U*xp> =YA$\ꊦN@vRPӁ,SF@B&,RuWW^BFG(,T4%)xW$]F0|6PlF#XS,c9#;Ӥ;o"Wm%+c( tp-,MҜ={wִeqrC,}lJgUX+) IqHFf9v:ږꚯG1Tg"apArƏk~'=U2E,@J!L(6kѨ2)G$7\KOP-tksϸX56Vq3E4IVz04 n;eڥ3M.+tvi. 7|̦֘*\j5y lx-XIaq95^{ݮ1nB` P`\Y+g\ppTtFFFEs B8{C5[/0RG 탽)X=Ԩ6@S:$溣QE×S|O'Q5QEozoLގ1`sM**T#KPU6EF)7d͘jB !P=8},*yo2YGl2Pv,pgiU Q42Q(Iu 됳@Ymt0x |qnXE\erۂT arؖ( Q qSW;Kl`offυE~pKM,QKhFYdkOA0(=o9"+NL_zumv,GnCc=}bfV&ĩ)X;׏Ln*<qdV6i@*A镶%ъ>#l-ڋ^|Jca8=5(v6 ָ4nYm_0A<\͹9jB>3h]cccSSbХEP%h(ɝlQŎGk(`dQEKaxkTqW#]QaU܍}*NV^QE*<س n[Tdӥ~F@wxr&o_TOX?sE*JsP@oƋU_oR܊M3aIAٱ#qj~kѾZe%)*TKBf.L;1'gmV&8$Mwy-ʆ?ύx&XK2aJ7֧ⶶ5k)cTpwX0=Kpf)ĥnYIq3r(9\>cedaZI(?܌ '";e3PT7h'"JTr%$`mU*Hĕ4\/JȘvبnlŋ]*RD\(;y[4| NSh ǧ|2)xxb;/Y Ȥ" ZW'\@6ݕ&e{}ք+e}IM[AQdʵ0$$$ȩS;E~(䄊ì,MŸ_:`rBpM@=}Aa',`ZX8sfX"tW9Dx0u]Zt(wZ9}l sɎb]PVm$, dČN}yS+UQ/;S`r!_UAT3GjTa:݁uAG7h4p {'fkTq7Wfިb1#biQ Ub*-QݞgcB*VP-u:KڌaDl,vyeE+<wn=FDV8&E躁Y0w]nP9e 4tV‰ۘ-.(= HTQ̈ ;K(H g*Q^(3r\Uwtb77S*aP TͰ١?cQ2>i#jASSkkcId|x$04"x#_UIUAPJ+?{"uyN0B.:ChZ'~aӁ(kL-.)٠.+vEf1#Tm^ 5E$Sd1 j4E,#oc.acs}/2~~ *#ޏs>qϹvPyS6#NjʡilΐAFxaa{§|+_y\٭F`%u-H \EǸ6ն|TN= VbC~S\eC +Tq [DxWeGDB4U UX}e"XGįXy16 5xYdEjPWHTa&3whcs<._H5/O1 =9Pq{j$Ke<,S!HVm R^ve5AvEB`F9u(An*!Q3^'w&p$/;}8-0Y lr Wl߷jm5t!3T/~觺@ٳg~]o*C=LZuۢFט\ [H1]_WBMjFtLD@ GUA55ƙTQ+*r\q[I>lY{ F= XiX1<w0Qt59 6 cruX=!":axtNLG_![:lʹRAQ5h04 t'O ۲+_FN7ȏ{G.̂-~)W]@% X*Iؿ>|o_<&({*{. UԼA Qg>{QE *J ~d/Шi?kf4FDkUyAM )ͦ3.Ü9}9r`˧kuӇf%9 ڋLs\ogǙlan h*~3ɱ'?u ~ A|O#jkk\KGߕol$4S.HȐU?ͳ/>*h@}ļ5.kD`⛠dP8k$ PEWx@ Tm=frel-@[ljl4Wq-541)UlzDOd'MN:z fmR3J  t:vjGhY"+lI=˺ѣ 8hKX2Od]Yg?{"Ai:%ׇB5Eԗ۱ cHCACQ \-Rz="z߁*9PER *DH ewԵPc8z}kuг~Z7NRV|_ $H4r3L@v 0ߵ54.&mʈ@1UfX{JL6P\Ӛ;fdJҌW94s2LK#$'iL IDAT˴ H<F ?ʊqged_kT!@1ebI7D,ɤ=EkomU U<-p$MP~S>}5xB⁦Ku*881yP?s1gzXPSkO1 _%6 *^='ےn*&T,2 QbԆ*%qp1OT}XP)9Uw HJ5$ DCF#hV,U]捫w*퇌ٝ*b1Va_tI]=Zjp_ ۨ՜" )-*Zmo|Rc"]v+W\_LUrPqķW]~UXqأ?iZQ&uYP^qW皜f  z5 O<oo!;%edWvk>wTږPzL(/PPzY-=%M4 x@&nRTYq DrykkkO%RyhGPUf^5iT($A2RE㤁N?Cm8w I7* W/jz7&KkTn='3[y0w!GXDFCtH`Mn4B0Oicy3i^a=:8hf `o+'zZ+t0h~ZIhSOaJTסo=br--eWB?k zB*^ENJ"-\`6Nɏ>8˩ b[}_?=qB]#Z9ҷXTX{ƛ'mM喽 H4zv^8CER9%DZ*BU>: *x^RX5w_+#vId͕PEkץTa^E|? ͣVCԞzsJߛ^UD?ʞ/ґjqF_i#d9P4tIMtLܢ2oć*ʢ M"P>cl#:7;{n( +)[J 5 V{*aW(ΏoTQH%W ~ 7m +ɮsQEaB尡*NJ>omU̽V+ټTQ[Ҹ7ӅZMƋ 0YŻ"I.Btc)bq_>^R-Eȑsz=. s- COD vqO\Cc2f7cgA>_^ C*[`( ;SEžTM!($HғPjyػ[rnX%6ۣG%0^ Q/2ۙoQQ*YznsM-S\(u/M%Y* F_/[M)檟HR->2Zf*oBZ\oZ5LFtܘ/ʾ~5*Z2 %tNf7m\J\"\}$;Ϻ-!%ɭsDቸ0ԆYMC"śvs"P{bO OQDD%j҆lڰϖ_Zr:FDRdwBϒqT]ps]${&UwRvULza[یB=(7C#+_ZC`1[qhiY_,P=AN)T"ZLWU8!_}ԝ~*6WU=ECU, &(7嵆*8pP%O>=!_B˕ UX*U|B UܧTwD?eLB|ECUaUbQE9ya]p"Uar'<$3*TԒc[ U( ݛ"󿘖Wh^X} QHI+)ȆX>K@bR){Ije|I wyGGVaUVQ aUڿH0aCq{EwXOlX +oL'BJƾOijuW ֊ӡ2s+Tv åIabEߓjcWEqEI>i Ao*bfGy9 X~q׃T 'T ,j?&1U)Ǟa46x̒\/.̹Nv{&(uuu?+ߊPk3B`"ܼr5R$\#PVq٤En",g8ՔB^g\-tp+ k##!Pݧ D|l!Z*g."?OF{*3O U̠Cr*`:?jZ*{*pfWˇ*|}6SEePhP-@rPiA-UuXbAB)v:WtBVc;"R5.ZROq挪<i:gE5-a<qeee{K>.nPj㮱U6OjۓN&S~랔Is1#fS.3dK=ݥzlPWƎ=Ξ(~HF0DBv텱L7K~R0"( `l zB! *׉ A@AR%ȭއ v5_+UH[ՐHC[ PA8T`pILⷣ_Vж;YEdG4v֨Bf$#Ut]F14HJR pŶd]Dg_D>±>S]j[ֳ98q Zڰo_=OKuHJ%ӘhR紝X{@T RPݦ./NՊ}ٸ)UalP[3:*TYd9^ VOGȏ*ITw9R7*S%^'fO@zАk˦£wgǹ>ɿ($@"բȀV9lYO\uv@,jJ+T[+B.8J>,L2mo͉`73FiJ*\6ncA-{_AadJɅ\ L-vbmzsBBz%rϦvܡC. %N4lJx[+ONI\4}nrk_uD"| O ^LLYǶE2yT8;l d7D҂ge_o6ɱJthEɨatKCw* <9PE;NDTQ#>}Msng]tG˯u]}WKgq Uxx}b顠KB.UкH}d ^j͏jẻ1n4#Y+Β7O e, ӀiG7K{ ݝH{谇֏RTز|81Jtz-.Jhb`P]o=Eh';˲¦a[m_ !)OzgEeؙ ;dp]V}V:M.!rJe#?؇Xe϶Z፶WѢAQ^op#P.g60h%]fnIct ص -0PI'$̓Xr*sn Dl&]H^tj(Sɔ*ܳ5^|aB5\L2%X͹ ])-UaX97 pREb r|*b(6 z#+hu+qr攍n$w.wM؃B /-[/wOjO\U3KUзkN:^|w%^ߊ5E% Ræ ӎzVL H7 ѶNm:< \Gt]4*=QL4ST5h3GJ,?ܝ?3?,thTqulqT1~C&FBz@CL/(o>KΒ>G=TMa}yvPC0]7ci("i`m/a'*X *h|%}-+TMDyLS<gusҡCKKq?T[eHpoʯշv$rs*v0jV̰kZӅlmٙ*u We7PQmyȿ CcF#Z0R-+Sd[YW|4MprJalxa:s];P? iG5Iqw@68U[Ԇ*i8~l3UZ*$-S` ܘ j5t݄se&U;M ?au ?Z~'IV#`Z,L3Sc ܤqct[ʭ_!!{1XhsÅ`(ř-+;fvi%+zq\6T1*TApO+TH o +G h̉_|1(AԄsyľqy3nۑN'65K; TTY@iA:gjAtI4fȵ[i/.ZzH&̋l[nYw`pRaȢOqD͵gm?ҋc<hbrZ;2Yw+'Ho)Jq2U5Ew|./ooo9rի[ׇ 0RE`UA܎!ӼČv?6 )f4*k;\GP=_~y/ax^.;_=fY0778a/aa'/*U0126'PDqK^INoUbS鱆*Ur[VEBaV_o4W4TTQXRz7Jbij$Ji (.Po)kMf?..ҍ@$劎UX X&<rx-R~.M)[fBo;C]'uSI5̤ -o4ԢpZ")bTr ܹȇfgPEKs`7'-X47֍⏕Qk#[|鑘 iTznfLؤӉ+4۝f|_gBAFW٧ycɛߐGЛC%(٧3ST8p?N_mn d<^\O7Tjˆ*lks]l'YC1Ud' _5ޑCG04ǎ͉m+UX^c*iV yXLFso̠ 4FF̤jWp87wJOn Pq6I:2@7HK?^cI* 4:$^n٫œnj÷6?{ HY,7k.~|y3a@a U)h.TAtpۄch^0a^I«(}-RNv(eW 7I8ֻREVmRX&E,UK{_O< jQfO H*] FPKE \(C'' -K͛+]| ( UؙJdzTjB7 0\67'آ%xnʕ^O5,SS/.o[ xm1T1}P)q''ONDni' BE߈dtu`-If L.լY pv\"!GF퍮cEκ|X`z=}I8n+ǡ`DC^'|T> mZTk: IDATx6| {,|PV7kJE89iޤ  UT5 ֨"χm9zm- mLO6%zLNiY HMWq"'$yhhܿpۢT~M%PK>O} ؁UE[CXn Ć[:fp.?Q1`Ke,S]M2m!9Fпs&rCA\ZrEJ(_^X~H#UtE™Mj?8jBkDɈ NRvac qw'њquIWE~߱' ?Q?#а6O~|fa݃|J0ݑekk1EJ|e2ejVʿX3X./sΟg?sdU}]5P1U*B[ٙY<zOKEo*\ |G(JK65$F T2LC9\ ~):ZЅW![K.,/㌮@t6n/S5TasO X &3R_H_mۓp?ɳr+c4Os%S_*!'"<;luOi"ѻw*sKw/] O?tex}XqPEnH U(·*&'W*+ USEc4TqP@ϗm*hWn* ,^9UP)EێND8皯)8pn(U0!>֚f꫿$Y,+'\٢s,!p}|q2%-gnbV3p32H.HԶ%t {T=X$*l{2xm[G@Uzgf Qdg?/fP1WOieA$.}gf$ i1}٦n/0j~^UH팱gZj/Pn͡ߕCj,U 5,G^>|vz[⫯:&Wc֘^B^nץcAqȂ֔lXэ,{j:$SM0DB]iF;ʻL40tYQg04S̼l-$pu~6x@޴~]O wc# {T|d:(wB:mA~?k傚M?+(v'cy<{eE|t|WOȑ+O~}[UϽ] Ih7p'?Tal;i@CUw#h"BgMRNTs\pRXBz}*N\*^_w:4Fi*e B|f n$W-jUwJJڮq_%Ѩű&SJSJynv<^5*kE ,/uf "fj()Ԯ}U)~ѼP,QΠi~a*+"ID .ٟ>yayڥs/Sfn@|0Q֪8H!n ]' qJ9N :ſ}h~v9_8ػX0OoРZ2EP2 [5dBqFR:헎o("Kɾ9q^|0p㪂*]KTnw8dsƗ O:99c$t%NVw6̒ j -~TܦtVO]ӐG!10?p pՅn*Zs]'x|]Ru7MR&ڰբ-f1Ƣ sGk&W#Q1v)| bkLVrMф%?_H Ki1ۖ,Zx7mw,Vk͊2i/8T3vphu ~5-\](OF[eS|-Uj/HSyZ\,,g\.#F#>K5^ uJ2_ M'ѩ I7"XFViS_ީ ppBh~Y3aNzar%|hg( =7> h/ 4Q*gxJ{_&9d>,LђU,5ׂ%fQ@O:> m34TjZd2X9w5DkK䪲;+rF`":U}En+{زTd)Kl!ƒf rnTW`M>1 ;(U)r]M.@j ".vǠI}YgQqj5CyhP1Vw*YTn{X_֜*oY;BuAKhyD8 UR Lц*2ULwyC{³B-SXS'Se(ӭB'E D%韚z- رHq&;##( 4\^}Pզn~&t7IQm|Q'SjB>Lv"|:9h53*Da { gIÏ V$ioM-U+TaFr;m 5cA0|>}I%}ʛ3,/~*lk*TQb='L*@,UGhv PohL+ UMp4eD-J;䓈*R1iX)o1 8 # d!Xé ]%>KFKIQa'b%AlPSx#l\ %Xz)kv؂鶓08Bѐ yҗ>`ccw #YJ*L{$UD kf=雸Ui{ݳ?TQKJPEqRE%} U*& Ur"i廮,uW_S(pEloM'H஛rT%mMͶ ]3Qq&dШB(/먁u()U }DhV* m*L0PGIfHpgIƙOB\(3Xp^'t;Pn Eik*J>DP$rȭTӀuFFci+N4W:5}%(mǰMyP}΃(e`ϯmInF׻z_O*f8 b<Abk&8jߨO $EcUCv{7&quT1{nC3Wg8-JQ TŴ#g ?ZʗO:t[`+ ve>ue}̨/x¹R]@XuiǽJ*A Uf1H6+j^CEqӿ.b{G",b.PSj8?6fQ+6 UYC7CŋB_w*c\@B`#\Z3L?"./JDN e͑|oz4u&׎GE&nTj/ +M*&6 vx ģM\Tz ]MC1`*zuC5.V†*x p: U$ϟES;G*z\i↩b󪣊? SnҨMxmIYI J] y[F U[bnnn9eCڒ`}~Rݨ9[UR*oenŅlP— '%%T7J5mO{!H]WaLY_5'  3l,4B0**њԜX ϻwC7 j+zH<-:D#r>05Ljo 2Za.Z$zb0i9B*TQ;y{hg^*1 4%$ɢm'F;K'JPg ^j$ޥ/7deG2+|RvqbmJJd>#ɉT!GiCH#h i~!TXPJYL|9BvD8'3^):hJʳDdZ 0n!8('/=G{oUb8T0ͺTP U=R}|tXm{ AF꺲٥*0PEM百3T|'*>L(}g7TqST'M=t ht\+^\IT5 s&8XTr Dki>$|GTqxCDe7 cԢinoN'3MIZro_]5ͫ1]2j^T+@$?@V\0A,VI[n3Zl %ͮTdGJ YkJ$$< %VjaعVw6y#ڒ"UY]gAN_5vTdX0/]5Yy`y&+ luX7]q`ϻBPP@]xuz3~&[o,Zamr7&4^Hw,~k jtΤ TBl+Z_U0% 8 ^78IvA`m{S΍2Q|x }!)-75\Y;oIƚˤ" UnzS^  UU^ B1̫*n* T4TaMPEF<-w*Gu*n*BoVo*R%`<V=}|/ۡm\A1sNyՇL:d&Ymb2oIآN|OF4 lLRi'dr7///N=ejqLM9Q̥U|X[[[GPEX'?iVn…y16p#f8\LkwJ¦A3[)]w 2r< .\WFI)r\Oz>Fd3^Ï PE .zġ௚IMyq*SaTyjKĺY'.fMR]a&xAJ HM&ᯚ@B=n*³ Kʬ*([R j8+WT'')P]% l if]G/˙:KKs\vXfWvwE {(L>P}1 ɋ [Ѯ]YdD8+HD~AsRlr-K 1::Wcy<WH_`Ju]7YpI_ҳg=$|Ibozf_ v1qTK4 /5r8gx1qԇq_K TaUXM4TE<*O_m,(9e28{vu@f[j$b;(pfn mGgPH6:T7 G2B8;n0Ap+k5Hz_S9IٵXkum:W-iiOYj&q\>q8T tmmaaqQgLUCt #\9jFT@l`Q1%&z4_Y.qX=yJEp]1U.Pc}ވU8aBn @rDvY,^e~|PE]elQExGb+lE@eECN+0SWKىrŷw ,SE9UwG"'W8á% _)WkáUإPQH=b]z:;5[ԛ IDAT"73ahvPÖ ~ ۟˪(f:'va;⎵)'e*Ԉ|rk^J+c$q>zDUK&a S- ;Y@Os^b.1X`e쳽Tv(GPֈZ|gugi%U`5sҩ\j-v(xgιjA6n㛀+, ױ+kRD+VW_X4P."yS*oYCfjmALjnVSX5nty U'qϥgWWMUyrMLM2?`K L⑃YR~EYh lұcQȎmE-+-U]srT8C%8HX,XXH`")[g0r r:_iࠋ*S'k06TqsH.7Tq{bP'*$UH&'lRu٠q kRzgPu*ڲjKMTAͭz#1?oB5jT1 dkvRՍYCw*Z?Ԅ 5TV^'ѲbW4߹B@([ba n2twPOf@uF!^w+#(%M ܳy+,/C]) Dݥ:1%zU>A Jj7Q#GN^Z43lzwҷq@3Deφə +jbp%YH"%Y3Kq VXF6B7QZX<*@$<^տя(N8Q*e Vog*&%lZ1EepoUK0L\$/ Cp ~]q~xT~gnbb!EF i77_}ui)G82MXqcB#Jh t͔"}dLGv`.'W|$1HCII8Pm ɇ%噢7 U<*ā*=̂?DEteP</~99/8>ȣU ?4ll% ШWJxơ+qP-/tp#?ϙPL5mU|"ZaU]r1ܘ 96W= VZE5\9mdj n9$~ˌz9RjS̝6 'cw\6׻4rTǜ?qh4tp qi?kDI+n`"J^V!܃쉳1%_ZIAnz s#qѨ @al 14z =q%RL; h>q H_c2F\܁85 lOVƂY#QAeg$j$6|["IF@3J6e*]l[\МTW6e/_p1 T!kI!*`2| =Оjࢢ- <6qjACF/@dz*Zu&GkB\ݕ*7nT˷U :>-ץϚqӓ]ss'N,.b6'HrqT?9;UMdV$)W*9B~2\$f['8|OT 'PkŎW3UB0ިN3f֌O "խsrW_E*'!WJ!V[-|N%MW3v$"*Z֬b]mCա*潊XZ!8JTiѡ!@OvX+#;ݿ\{U{X)wM+ɐܗPE(CK"6klC+ŋfrհE쮔n|//ň,n/ YR37eTB+(4a9aQLI ]TЈ: /ɟi4)O~׽D?u5+m0Td\IibSBͺPv `Z#U(V ΌH^[3kuLWX~P$*=VG UwWO&oL;SE^ֳCO6 UlX" I;U>}V *%p"ž:jzhl_9tkT=?(.- gHdFHO^]iM#JWB1HqL̖ߓ)h27'K6QE1/&umM(i0wVۀǙ?P}~JVjͬ Cx8ć:2>zo>rj h2nkI:SIኪ'*0ASgJZ+AY6v@DJ~JDHmtC/xU>VNWYVcApUj~ALDygE5~jQ7Ȝ1d]v=x[xpFP=s UXn]*_T"E% :o& &.H ށ*<`BZ"E]rCXbgO"yȤϵшou" h ?iX; wն}ICbVob28n1Zڴ4Tq@͍hQ]uL^Z85Tq7XPEM#w3η<@EC*UVls@d6ϲOw??sRDw4Vd0qeۛEE h[ wwiӛeO<'N1YuqTa&@:7F% n6v5l'hM ynTQcuڊAANOkZ,XZKS}jX *,A#%SR7xSX3\nlJ5C=ЯYZQ]@(99nb <-z%Z5o\?{| @_m.9^QmnYb˔C!k>>-u@ӨX5j2 u(_~Mnbz[jR朴F*zF[vR>^%e~/@="τ;з:}gJeOgNO|qw5N!*Dĸoy :B"G#IG>} "@s~ɠRKk r \?Dzņ*: Ul3luT!}wtv嫥 UyޮTQdoAX<*W*U㢗oƩ-h!*V`PT?_3XDk90:r7ΜycdA}eOy2xu蝺ǹ 4+*p 5أD%b|9tlcu:7NFI "mGJF_%2; `!B˚6NZy.Ttj" jے(c]ƿkƥ#وOb*nk^]v1Fh3ngT]fEx_ = >Q?ڶ2I9Y6,NʊRV(0Luv Q|O% oZfPE; eJi( OLfXqyYrIeP_my> V-Yj#Y՗#72ܬy6 tE&XӪu#>=BF9KH"US'Ohbχ;wKh%KH8HCE=B>w%zאTy7Ŋx6TQ_^t>v|4Tqvn!@ U0}TO' U*Ƴg_^4Tq7bN<QŴuX?[aqG L@ʒ>43b㽥%5@Bq bzKvZW:;_h.Y8UP+-Vt]diǺU;Ux@`_0a*^jm3frx^RE25}bmAqYy,jz>Y ځ*o:(|V0'~]S}O_8}z~>6zZ0Z߲n|S'va-3i"Wjw.PF=gsVQe-4QY]m׹ G\z) `fV1NdbERGkZ޷^(ŨJndҿLIp7( ܚfKک/>Q]'Y(_N[&_,cwiQ %o屌՜9ԁqF:bBk"9աØf\f.֭<"AOː 8=PϽϘ# )د\Y\ '2HBɼ\?{G|XqSHªh*>zPP֋*SO>@ UmȲ]̛P#1sECw*Xl+&^szEU̪rF̛%h*TQ< \>yhv3kg+JGBs_ m;c%#'ǒHnņɦ~Sv ?7۱%r$ڶy_89Ĵv8GGR`!g)vR=RbGe)U2Qu$<]; m @|aҤl1I9sppޖfkE&`;ħE`Y]̚+,FU/k0J3Z!ZdVy~Bv$ĉG}3gU+Uw }$>qk"sk/=Zbǎzm`޺W`7Kiؐ d8 vz@$O¥K|o1aʮ~ 6*Hb\ex a_0`Dh7dR)Xsy[A} =g0Rp87 c& ^s*$ͦ&^H'qCI1 5P] G=TѓO5T8(+ˆ* UVTʺ @Xݑ*0pTdDwYH9H$lT:0nid R࣮{HQtG2L$VVg̫kZ,+ÌpIw?Lpiiqyqld}J&7@wojgh 0fE\<" pTj?1% UhJ?PUi(&yl'y DE>Bbp[X8pĉ%Ab꫗/=zT6)m1U ~hb2@BíVE5TqXqP.Tq]N8{ZCUU6TUw/])w"?;K9ayT#RUm]+&Mc`dI`ƐPH\8a'[B`Y뫀՚F:_\Z U HG˔-û)XMۓa]g*yv1SC9, 3N7؊$TIi;N<[M8pG;*Zq03"87nYwZUG dnF2hc $) LZPTy:Wr@0 |,X%}>׫viG ^2Re /uTQp ̏Hؚ66pqWf}j+MeXn1Fᢷ@EB>տO[TQ@M`}lEL BڞL6 @S QbtBO`SUGJђK>Ҋr34I;*RerE=CPbƢq:kkBK*\E喦 =&>q"n p|da/*ڣo|0&e*>Urơ"#`o#8v`CC}sMEǨY0 BS5V?=t +K~ LM w IYۣm!>yo3+BH^** UpgʕV<}ءPUjO) ݁*BN/&/rojƑ]< ~.*>tz`5 t` d| sm 0gP^2lysK>@wxQ ¢0z<$ 諴V H AE.əj\[$Y,H\`tH*j][mxG}ﻗܿc4+ T4TqoR* tkl"ұWbw _(rdkי6]H#E1"[\0j}}Y4kBCo&6aEnjcw=&)1%qgE.vF/C'kT:ȋq珽ysVdY*}y=sóBtmd܏Guץc4\+}80LdszaQUW®ɵYXLj:mvJC8&t7 4/!S?8+5TNC'_@hNa]# AB:7NjI^䩤 9]`_'ݴEC- (ꍸQ? lp*Pa3EM(ZU xUׅs ukkc*%x˰݋T]qd9ֱr0QǥǺg hZ's,#g hxWnXIѦrׇ#E҅'&DUЯmѝ.Vd3 Tyv;Rahj*T+6&g._-j;IL<,фzWԭC$@X")VI*FW~[$ ߗ ñ#0iiLNH51gwz@*T2+ȭPKEjF%*o WzWF[REh+ UK/*&]@Ȩ"Ⅴ'*v!UdKyQ˰ jyFTQџ6 {iN4:%J9/mU|E!RĒBvѫ~q kRtx' eC*Vp܄Vr+P"2O߆*lyC@0uas'TAe%o?J/I\[\ř,@ [ejߢ,~Vn!tKNx+);E9he?@XK2dp/G80.//Krշvf̛Sm U`]Օ|}j5 /|!3P&u.Vm[B?¿ˆ;Dgb= 7uam{| Mlxpj;sdoM,:>oiTEMR ι4[})É.eetG-!R x>}"Co%f8[ƷvRjQ/}.I$[j$]0 "w2sxkk*4rdBS]S(R"%Oe?aW#VY*—vzT_ֱ. B!wjx'ؗ]k}eQ1^laٛMdĵ-m+ ̡aGʍWWW%r5+x>eK1W+WբeRKeَt0C>V)?sn&nee#Fұtk,aV=Z $f< (2!dMd渄V3%8e>;ᴿ{>bjBy\ UX9:8haԸl{gׅ*>|֚IK  HVt2w tDQjgTCJW3ٿ7 I!G..F2.J1ʸI,RE{頲o \o>nsb?PTKոGC.eG}kU]OH>ՎcSE]IC$QfZeh,w*YqPD"SEZ:q Qߒ%[' ,;O4֋' Qxg~ #i\ɝR] F}+Uhe:frtw;j'SE dp 4[#:I:68XVi¸ 4|2\>!nV0.$s5T mO"I7JR3Va>qCwvF7\@#YtH$'ie,.:DQ8 @.j_TTTCrNMMe95u"нO.Gt,[oQGbWļqDǝ3)qNS{3/LIDgpmk}qx 0i'o`* SX +_, wBg>pfJw~3;8NmPE}wMuOTѷ;kT1?x@8_z+0L@aTض*]x򽍆* UpbI,$Bܞ9qySFC&XhA%ť*"C@DP .ML EEmЛ[h9eדL1IQS4"Bز*.h;(ueڊ_UO6vJjTKm`[&?) 5TaXU~nr]=;0ńB6` uVPLVmD,c㴌ֶG1qf$,sJ}O<(-|L6/G xU-,9S/43:E#qM ,ln`77}e'67A0CuQ?KPvDKBM+9l : B Eaiaj|,6>(^3t Ia UH,/n8b5&0[^ _5#O"+Uze_I:;N]믭=TqPq$oBuћ۴eRIPEe|X U칼\V|;%6T4{Gk$[oREE'L.6&;# &Kø MͶygڷv>7CڨͨPYlREnZ6R-UU#G?=UvaTD/GQE[BaextO+%[XvqƼKWa;*X{H!c5b4Z KfPW,Q-zj[YcdBu!oO/t&u:4\(C1Ul'Q }tފ*k32N^+<W/ X1,{,--\Y\,2->FƖUa&ĂbM]Xxb>+EFN(=T1xV\r,͠bT񦐃,TPXyV>ؘIZvPVQWGmQuT׫[Iӱ*؜힀F*Ԏ`TKFUn8 rB8 }Ёs2x;T|BU4` U]hO]wzU4` U]F_I{ ;`V4؋TS<H<{ozz[֪S4*]G67x,67UZfث6o݆*HB8-x.θ\u]/8Ψ UӲ~Vd|åж(zhPUЙRqln[>5=cU>|뭷^~R*,=iD-,z**x<Uط(W3Qf IҴ{RR;(2s'dUQM,H7Äjfђ;Zkăq@trKπB'RE8u Bй] X#191џ]`KEA ܛ\?Z,U0SQ^%ߊ$DNk:$((bs"p#2 zSh@$V$꒨Jx\ 2O)K"Q* Dhp&ѡT (/# IMG9~O؎@kbOREm xp\Z*:UΫW f҆* UhD!KFX[VVκ k [xlE>~ eP(J*o*R^yI[ör~ƨ5iI2*3Ɩj;ڜJ]&瞓ՑIGCbrf jgF̃{+њ0V!2ׯ?ZAmF77755p_?GN*+ScS$Dp,m`|[NhC+Ta|K|:B7yycp ۣnMJۥm**TBͫ 螽*TLCڦ=L*T<5TVբGD19Ef?v+v@4:qoy87ZTTr^-p.0y|- , թYlن*DarC^XY`]B +\T|Y,~Qt'^pR* \oRނ*$Ɩ%MLk)eɷUXl* n TAC};+Ƀ^~w07'˜c1@IU*d03Tt;7 H ZCv8bFKM>贰CoTs_ jbSEwC8$һ校ĤaXMwF؟T)^s;^+RW{*oG jbSEу-#KHzcPOEz;Uu'|qlb/S5 !BGz>UF/Oӵ:n5L?d*%SeȻIA컢B8*s}W}Td^~˩B$Uknd=ٝ`ߙ S1O$TzB ȈoM? RwX|;`%D!"'UEȿ >w*9lw xeEX^#ڷBo{D|"KaZ y}zayNlCI2Pw$R{]VrjeOƵ# ~ P˂ 3Y%LP?q<0R9D]~Ta$jO#kTrp[x-ZD*UVWu*C)$JӠQҬ@x`kR?w2H P-g`wP;htyYøquG~/I5 /=K*Pճ=*hbPEx%`ž ?EYC,*%'/Ud&aPޤm?J'pt\>HOƘt:SSǎxݸnN;Q9^ٽ0ĦP+u8,lp~\Fl?Z(j 5^O:ZEG}L;8eP\Vu.uagj+%6h˚ga2x öćmRf!iE:/m(_FujhVRUBSUckXtU.Y/G!?GfLsȔTNA+Zۇ~=^i:. /ôAce |pݮwd4V6M(!8DQgbR]KӌJ^m 4Rb3[{0g!bL,\UɆLi$9v/]z9ywKztgO-Z}h6VIɢ<|!>XgE͹"";2ƫV2fSƊ}GϺKo仚*|@T9PmPӨs~XDCkI012XAT+*qbzXSx)W/m cpna5WC}TQ4z;*a!Ym=*RH[l$ MX;(ն\T!*ɇ*ZBsEE*P:L fڽouԍ VsBϲ81<\=p*V=UA{$ K-J|fI${R& /m{$UW 4r샠Tbgcqگͳ'cT\ sB-e4hǞϡ T1EzHSS?;B^qa-!-72pEBzuTU bm}5J* VC.[*t&@!:P)?R ۟rmFhcrSUa!!ob?P&|P~mVrH#|L!+ԭ.0C Nh:D(A^Y ;nMc˶ 8 F욜,֔!~*gV/9e0H ] ~Y'Kh8 C0cAbKm}u)onhCt>?]C5њ1Ky}i5 OMUT˹s|μ8dG0a<=K]áYI~u+"WR v$7*3:&'BKHNLS'\ٗk; j!qxuNcREÊ'6UBL"tΗ<=<v\5OV ?H`~EQ9'Mܡ^-s_i %STmxoPBcj[pvv7u>S5@:zR1G UlCLlUK+n`=^)cM֎Dz`YTt:R)U \$}k<=! Tnd|jre ?iFN0 -*d;jڱCH.^wX|ٵ[r6={7DV0NUX/L*qjM4G֍3!{x`Oy ιDan̙*c\RcM,Ǜl9Dztc!W˃Ժ$TZµSldkŦqjH%.)Uh*xeeVW^}tr01~T9$ToBqV.7|>ge sR۷5C2C:gޣζl/>{ƒ HY[;Ə<;;@sm FpeeF 4nݐQ,wN2 llt:Jsh122 8Z‰ ݨ?]FTv2Q;Bl+TΙ lN+XPŇyibPEw*VE8zUboPXS UTKW^10j1f+X/7uߓ / 1hTDžgbQ`[vڲB5>4yTo>uYt 5uCK[h~?@j=.-4Gin'caALUa}; y%*dܡcH`;p(պWm{{vWxRC9,X#@:bÎȡd[K&c8ĭ[>~Ǐ_((j+H~\\FǖC(\kqT*%y$aẖ*ԟ Y8gwIGn0X^ޘ/@@Qg0ҰE!ǹyh{_XԙTKCDݑ|VVΟiHGY8Ur #:3O<<4.h$ɓ{'K?}|;{&[32G7n QEԝ6?)1Uqfx(sbA:D&$c-";Ew>׋o&gVwZ'GQE|8ޠ P(LҦ5TxC î Ps(;X U[TN Uޡ٫BSUstLpHCw*x)(UQ:-kPB"Tx [CI^+TpV{$7oETqpfiCQgZmO6췼)QS YIUy T*0FP"ۚDD+oj>ny <BZ" p[8Щm1P劚-NCScJR0t$ڈD;1H[Z ߪn;/FѠ/[A85*rSZ"$+H kG [d^Uwd̙3׮ .'Ϝi|7Tv[ؗN[;qtL @Uw$ rQR7TU9o7LO_~sł̾H5"Uamd ;CTvm>s̻ uz.{-*^P::!gc{KȹQ}!୤ێϤE v5g 7{W~ӑ= i-Rpq=#s䇹E IDAT a5UBh"ʉ/iSg5Ԧ2 H!QMUh&V~*Vx=UT4TQ8*ڇ*nޜ TqH6^yר} U,ߟ5T\ iDC]G{YWaKH̱n:UcC{ZՄAL ]W Ů**wK4m;B'T ⭢rwMLY̆*I>P(9b50&:PИtߵ^ U@BN9rb[xèLQa *ΐ^f%W҄yGlv1X)^|`>;#M:Rv%a2l$qQunt_ q B~C!@xOk_$%ZUu<d՟)PIJӠmtV%wP$m&kZi U0 %AE+JeyD^KrnKmAECK= ˩PH yRhJjx,xzUU604Q ˏn91*%M̄_&㷋W P*8J2-x~i[?Tb$T7uןbBEC U $[b;~ Ub(ܹ7b4W*0I/B?: UQC92 (C@w@;(TZU^v+=fti#7HuO kZoSEpd\`qqqn.}vT!aĂ*_3ċ)TPVT`LAސkrIm&Rjt[Zr6+Di/:/r UȠ^^+ib`F,l+#TwFjLy:q,d#aÃ6ioZTDsjyUaU[Lh2͋cܸ'/0 K] 6/y  !5TaW'`BPiSSEb&% F-:=s'|)'Z/ K:-"c xM U/ZĂPt"VUIAO5 uʷn 岅R%#q6Dl}ÿ}g~S}9G8vpOJ+/5>TߌQBaDlmԸoI^ G*4W&MN0-q. Şʱ|IPE1!T!m"&'vU4+k w:'7*mC1VX3jw*v/^x~ 0KO?"j۶* oPZn"_\af;eoN2&9;cQ]V]:jYIXqD;ƀ`3Zb+CkPN1Z(IRH^_%u-k0{WVN>w\<*81U `sSc[T/v[4Sj엱'BZQ2ǩȎ^l, [TÓ9&Hb쨩85xo(ϽnaxlY%s5MiȺD\t-paU2NvE崯L 3/JsX&@c6"])t`xcD~ l.H$&:ˉ)(zKjPa#%w6TQ4T,8Jeh¿'49Cl}N8GNbZ E=eP&4Z_8dYf}hkKX)S"y9w,HΡnњ"rs-,- @* [\\KI^ZCڌ;|1.Bg9;dRUAk{oYilbR,+Ȩj۝R>_0cS>ˮ]W\\jpA]!^H|x:OklTmT cEred0l]LNH1ס*yʎjW-ոOpQ.7镵%/l{_CmfUbv#(n- %zqJyB  _K]ZO ,Xщ~kqkB;,ؖTbn xѻ٢Tn;%CN0Qɞ,LkFn,,`‚;*6,oIѽhQ`% cpǩ\M:Un eSJ1U Td~E+nǎFqfSHF٪R;wߡ*« }7AQuxKTae t)mSw;ё8Jj3\_ Qw`j~T]A;8j"?jmIE"TqT*0Tbn UЍun ֦h+`TѦ!88#"vne9o!.w8mC'o U U* JeDEf}[Gv_)_u,LJLݶΎ:*^\gսةcmU/JLX6=TucyĮ>}gTa&-7?d}ONBۡӻ[TD N,^{1cNTT%}i+(ԟV[ UX%. $GլWaV L='TˢK]d݆*|@j mT, ;3lUV/%&l,UbIkMF t^TֆsUԹwTះ4p{Qg`(u)2㐢 _iЧD*7TnFkB{*Tcw8yS*D}v+( *4TPRE+]f}i~SEW>]P [2dݦPq8fyG0$uirIjvÃwo U6Z@]VUxIVmjzaQPOh.JnW‰GA*k|^ܨ:u䤵#BRJ.V8Ѥpt"*?\7I0fMΡD0y>겏 o)4$ը99 5$6pcɝMmuEAzh`P yVK.Уf N ԣf2nZ ]8\u4ƘRBA%7VPW{n&$Xs8*g]UݞNXIm|akHȄfR?h5w!k[>;@umu0@!4:=[ 397 z".`$ Qhb뷠 +f#-pREyۡZ`h 뢏ɧcHKu"&9;S`P'v'%BZ?mOr?7O?cKouۨ~"Ԏ6haZnl9sp' .aRXgLBtXv)W2HF-˗/aTh3w3.fL2tn;Gy>_*Ah<}lA̩~4{Q?]_X=̜^Ol1.MKu{uixؚՌUt( C3l< kTA+Rbn4ּe p@ms#Z9RU*L-PEԁ@M~01bPj[Nuf$6TBE_ 7|-Sf/˗^rۣ;ScK@>?gi4= 7y=cW*~om**\ƫ=[P`>rbmI|WɊ=L/K?; Us(?9w{qCV IDAT*ⴂ bKk[P!)1l UgN}k/4?`}\X)˟]fWk-9ǣq 0Jg QqEU8!(wB5}[yTz\,:qڜx .<ɓ'J~XԄ*9+a_Y34Gӧ! gO̪q9l5tbBAΖ,ќ1OTr" ,To.X 6Cjq[?ڔ\>rXHF39O>zݮȜ Q (_I 4U.Y_ Xͩ #wPjiI`\a7DĮ5ڔoxRG:Sb=B|PECRU)+5PBroZH.e(ֱ2;̸Py/"?{Aj UW`Nx p9 Xg*՜KP77xS_:\*x&( f T#PK-U苍ÆVtp= bR S˲n*XįP\W1[RE{X@*&ٲb&~fb PESEga4UiVʆ*DpVP.ypU[6ء4-@eyY k!ꍕ>νTPҚY ]-GΚeN*#FimO۴>O*̘$իigv$9`p~EiBu LPJ**Ytk;8h\SEXŇet:Q"88)ji# Dnur Iv"Xh%ϜP|1`3~(=d*-q %אdEaO`Iv$C3be`WîkHh`(` *Ƀv@APJXfꏡ$c[ )5sӒXRKҬ_&E} 0yP0Val* mZ0ymqrv )̄*4҅j&Jq^0bm)SMЁ,FC^*eII6*Z~O*N`QC Uhs!U8X__uXIQQR":3T!Ύg)U %~ {G+B|rTQܝ;d*rRߐ"# ^ݮ#0+mן_ R~]_H^0L>;K@O6vV/}t*_ޮ|MB.r>K/ 1 [;Z=[$)E}U1^U*0+-"ޢ6.\;oGn6NҤX螺.zv`+gYS:,;,LŅ01q좼3L.=%T"22-//}R"/\av kTY}2Q@ LrR~z7n;vԕ+oS 64 TAm cͯr VSTf*HUqp&bFCAGTKan-F&Pvn4~RS'kK~i+I[-,a|HU7bʥalTT"bhm|3,ald&vӶVQCSb GRJlQ <*Aڥ⽶M~gj=OС/V U_{ik* *\>oBg*:{ UD>\%chr\(?}c={*ZRE.?P\xKk U-]ЈNCU[X?*O`mx@^'A݈-UyϺ^VPER<̶Jz UtRc#*xGbkT>Vs@q6}Teʴiu*oyY2){Uwrݬxh&t;kYuvTQ. ~Nޠ 8[SR)>%[4$N۝ sDii`{8Ge;ŏӝ66V57n<_8!W@]AA Je 6JbyF5P+ujcJ[SEQ0@Wil߷E!z mz.^r_?U\O9oTj[^O?O_ x"VPam뱏̭.nvY8ן%S"1[ 3ް#/b)~ү;qbL==KH`Zd UWGA B "_V,3L`.6)B)G:|qqYλ"=3J"8 v̏m>67UV7m'ܾCA#XOE/VFf5YsժhO :gFA4OreKbm Y#)"%^s !t_ a/ ZG*OMLGPc~oܸpɅ%77#҈QHT) 1!iםi٤<$TUD{=īF5Ո}hY~YbGY7+*d_F ^)=𨋧E1W-\TΟCg.KGb^-wCN8p^1慥ڍcb~+cR՛ ixQ/Ebqv~+@2ͺ= b)r U7 RMu8PbWkإ%U$Y.0MT< (*U,OkC UHzo?oۦ [_RWTqA:5T!Ql>RÊ#T3wFGP*HP o*`kK]T-ڲ9ĪkEd`-Rob8 MJhRz;)݊*tdZx$֯Vi8S#nF~$xs9mmP~LREvǏQP:RlÌ3XCF;r9X=Q1] yy`ӑ<IUj E2nh3ɩN aV0#0R0l'R#h[d dºQRuItB$س-<ީCPc-/0Ri>,0}8}|uYʍʮm ]g_3v=q0fag_:rRy92k;FX^&6=xFI 8C&#1N+4nR'.uZR-,7'Rbfhsmmuܹ~?xH DْcF#`"u"ƊոT\?UTPEC$?ľscpTQZK81B>0Rw5Tq_"[?7WkP{'JJ8 :}`^O6uR<ړܺݵ8ܝ{4+7/&lNeT0BetP)S'KbOiL~'@\3B9J!GRjQV'/`)Umd%+P__p C;HpX cBc顢*&FDڏ>?Oy~TQdOMG]jxG U|薈 Ug v2}wdb-@􃭩bwDohP]U>yF s6}i33m;mǎ)ƄRJ:n&|TB uZzĮOY %4BhM}F,t0Oʼ2&M'zvFxÝPX15/'*oӚBFɥ"hی7P)&bj&ΟO3DcS/ʈ>D7qo3Mq^MmY @lbg #XXrgU3%32%|˾ЁE7Vm9C/eyP]MM%N5ø-U$}Y=t橭 Tئ, s`p OA4bq T42<2:iawBjl_p |$0%-Fg>DXDt,hxAlO0gGAk@k&yr \`f&~t`Bˀނ#`R|_\GVhJZtdO*Uvߩ}avj9Ut+*oQ*VCw@򳽏K a%ϬWYC*ᇫn- Tq-/݊";Hpm2U̿*TT7TPEY[W&d`ϣn"yoBX@;IRڠ&kRc =1S*t<Ԩۣ ?_u&y~ĮB:Iģk´Ψ(x󲖇p}HcQުPE&|>_! q@#TSwQQbAMB5CvJpsϝ;7=nn^4==-!T 7Dnm3u!*#a˒Ry[Z_^nYC?/]Hp?s`\v i9MUI]>Ĥ:I-]w0*$Ml'3[PECiFUd~l1[>~TަA9(N~񬡊AĊ7 UyH=UlJ͛?4TPEB⎩A/ U4THue?RE=AzQŕ3og UV?'U(Tqh]6"PkPE5DƊs=?^(2[J^s?TS̶{KK6&v{f%bl7*(+ד ^"}6qw7"ѨەPQxB%%|ڪjГFcn4pjߟrΚwR>FVptB6$46wXo7VSP<+ EC33g<"BGJ(?'][Xt̙1MOLO/,U8 @Qюϋx*~ˡD{=X^ڱa+4qa|, 6)":QXHb+&nҡDo[`E\aki& 'p E׶ghpIMQB%({,Y>ɓn o8CqNKHِT. ax]^ HVG^if%G+ )D!(D/.$_ oq@Oye*"TK2|]i~&{tNUݭ4P_'=% !-s4@]L{Bab[wD}&lPER*P8~E}J'"|6TK"?;2_Gd*^*Tѳs09_NGb{8_?vri!]Old+ 8;έy |okEئJ ѻA; eOvbvTa= <[hak׮I2^TAz~?=){k2uWGc&z7= mn U{oCa[<*5Q;n˜9U _qXH)QpWEc[W,~)2t%߆*d޺CMOf)rpڵkWHj fgO>}a\Μ9~\v@6)pAj諠oF`pƍW_|֭wo>痰-5|W_=wN4^[Ǐ|i!a.nȢ6Idhru.șRTATtK>~-x}Q0X2%6T9j5IBAE>[ġ6=U.DN:_k$o#ɝ*]B':D3"'p(pxX:% iV+v SpyT6s=GԖ؃j|d.'Rrdǘ™%ll\87UhLTAlxAFwy*^Hn*iE'qw& IDATGvÊMc,TqB]ԕ*h:Url ]*o*ހW2=ןKw*Dkv6T"նu 'j7 tޏ U4T~[Txϝ\ ;]ss++tihJ|7] Ap`h'Pӈҫaki: >Dޒ^^QxqjJuɲ@V%_ZT8*!Z3>!S#؈ѝ2Hnzw ?w>ߚc`ed"=HѶ8a[ȕ/5QG5+GDh<_V)U60?uiU#l3!T[Sܾ2&kҺė`! bnnz[\/vʕO r@쳯kX*m:|iڷOH'-a˫˕zK8¯ z&' jjC7R W$ᩜPθZKI\仺,x{ٽ[NoqQZE4xة宮Y2*BT 'NZfFKaXcؔ SS/,\ 1)U`>ZWLp%~ׂTLY;?/0_q+/sZ::{`&D졫*#K,3Hcu₨;Tѡ ?* c`mqL?ܡs.De>Z@R_*ZP v [SِB(tT_u|'h,R"w39GDs*h5ZJ(yvr.O`vkJ(p3֣brLW6=RXUJlg3OW 'vA4'k=C3U6Q5 +D0@fڄbV"4*$N.;\ҁ9"P0傜iNōVBESelNv`maZ'{\? Q*ۮ_З2ýg>O?ǩ#PӧaDcfٷoǎ{߮] 3o L4<}5׍ǁ)r) 8[E,KE ,-|4~3%pQmEjY= TBDIq/=(}TdV׸(N`vFqNwHz]]]Cb>ͮGGFDKxI {qv6[.6ׇbLSJscPBpRLiEp8m,;˂"BC޽[XT(D4oQE(BOfEh;xءD2:Ty T.|E2.G*n(54U􄅊_;TgT;PŌzL(Y*:TQD|.?Fv4F}T10^ou[DMχP~4Ag܎#EV"0&U$UxjRMNq/h =Bam8 dמĄVo]^E6;3;kV6Wu}ʨ,uPPiTSvv2d 0C=sQK!RQä-tQϚCLԼA"3;vO?tu V&^$DXFB# Yl x}{w8-MxD ]0򉡧k4n߾}pPVzQJJI5DknFt>0F5[\1X,F,6RzIYZ( ~>%xkU_ yA,UN/мŧd*CUeM<n Ͳ=r l 6<90/ܭfNY#Z|FQݷ376b<0_\ tvX?Cdt_u4HF?tʸP7f=mm Tá{ݜ6H}ɖ[a bK$ EO(6F3CV[ϸ_,|u7JCIPTQ> ݵTqA:sC*Z[۔˅PX [mDT32jnmuCETn(>hnHrv87hl,,tuvۑv5SJ?6F3ZM2Um_ n?jL?>ڢVI5/ ׸#I2 PF ebKu ۲8>.vF/hG N#lZL9s@#cgYҷ av)os}%Pa _vzw)3pmo]3Im d4PHf:@191Qow[oݵ{R{ $[ׯVO 3-.μfCھq4XeY8,zwbnb.-W{oCB1fZxtdۭR v[rQVb]=z~}LD"AڃdaJy鹹8| z sз ndP:8x}mz"y/C4/8CNF6T|3Lqpz%|O!{%y ˼B Dn.Le` (+ZY92OJ*-:eCF[qdzGnR`Vm83 JUt"NYvi\u5f$6FTįȇC*Z-q5/ooۥo?,UV*nlv{v} ( 56UR, BÇzT)e5(vi~ ;[\i=,n1B2$P*TysBm /\ЬѮi?F}eR¼ʝ,<>9dV}1=AQ_h@vv+"T0+->hB,.Xh)vpG*5tIELDB_ޏju |l߾}{|;?k;vD.Z=t%8OvB= 뮠nٳ|7 Z QP5fOסn9W%P./S\cua.޲HI**Ag.S45=Qx tUn4[ v-HPۻ񯽛~izͅT>Kv}7 849*rdQ cJI4zo(p27&,}p(PoW]'uL4tW+dtUn U5+hh\Aǜʩ+xޭg;c@vQvCÓk?PŧUITqD=g8+dT^]>kLJ'JC;ChLL= *˱4K̼H-Ąhdko%b0yn ^'U:l4Uī&"o?<)aȨAb.*^Z@CrcӅ6V,h[0dNեTa?Xi  Wҧ:X^@9hIWEԍv1)DΔcK_oo}W^zIɝ'ηKwl6nz% Cꢐ8x )1c*v"7-J^DJ1Ȑ*BO6ƍI)6.%z)"_ВP;nHCNjöQZc*,hϢnG<ĬTT_)w;N۸(i-S%DUa#\#hʆXUdԴţG<.C٠ C:ԡo(CedZ(RCJVˮ%VF֕z*@E3C "ޒ 5u'z`"vJѝ՜}T Ǘ^{'?*~{EGWTg33ccpq!U3X/mW8-P[."h0ՈeCer8D֮[4zVC sэ>&=>.K ht ,EHäDTETԖK{LM7Z;;xՋo2 KKKZ$H1BJJh@27t1Qd|%]QZQʞ Xy\a)Yic)  `xy@îYғ,Cjk/ f% !4Ȯe2h~o8UژTǾ'9(Tq:TQܴJ*XKF+jt{6 KC*X1GZ@xBmPŶV*:T*U`2,8ҸP=NiϷ[7$BWu5?kS3]*NוQ,‰T؍U!"Q* 6aZgXقaJLA(9|8*H`0 )wDzo4g\x|VTAYSe.B+B+ʵ9}Lҷ38#Pu4,K#6ֻϟ'T;zw~~mo{pU<űvĒ7GjD u:RqTY& :VT,6(~h%E96N"R6 EhO}1U8Uo|BsVk:STi)(ah̬;ˁTbr(8U#n͂[vm ^eY^ѿK[[ Ab*Z&@g8a?.tJ8[-U ]ZɍUkºY+P}-W)y=P\4;); Ux*p#+73[47zvM2!R/? )ɓ62UdWX[%~i鮠;T=LP |a *,w?؜TQ g=FT\KKìQ*:T2U`V-8Ra:">ԟӭn;;g$H 2 -1I̿lTRE &: Xe5j5wPv֭~LQPFӂErCȿpjVcZBƓNʦs d1+Z<^;B*bMo JVבKKQ͐R& r}eg+`sT "xjj)P6^${JkA'N'nسW~i?sf{EEeTnNI5.ُ U0d>TJ՞DERU[7K"g ".'%k[P<魈#DO:}VKtIWħ9#4;A H= i7B(_{/ӟ_4e f@EP/r0I\q*mr}RPX5dF 1KB߀ۆ'YSe@6l\x5ƗMzW(xzIGmlH(:Tq!CW* Q_.y#PŜ,V¥Cfщ*?T6M uC7&UT2H+*U\PP\>]Pݦ*|U|E>~Cæ*n$U0P*:TU TAKÈx5?Q:fQE̝ѻεުӢg%,yqq(l̙UH+X$ΰ0;+Gj 'm}+##'ۥZyXQ6XH_aRYa'xbyy314;&Vrx]!_YJqhyZuOdlDJ2-;Ŋ,#]x(bl DHHӐ沁(}ZMziSw|%%?//o{׿l緎=:?_'&SŦ !`!֟XAAzdXPzfR/^ZP~z8T5nnMC(hED$P)(b*4չoA3zS' J2⚕x%b7/H$}-ۯ Mx̉`,AjGb6qp8u9MC[txl1BH 1r܂A(&;"CI禮 /2iYYXEk6TgpB6!i\jۈSgd`ux(]H/cBU*?P+e)vab^=>PV:T`R_DI*$a\I U_MDȇ7oP&F@TtCU!U 4aA0ґ?貈*\vj;ܛhU=SPE!+Z\ePW,8KSkY*&brRsV-Ci)JYѨeJp@Aoݺjn[UTlN rn~->DF-L|gZ\(qR ]מZ6*ɮm LGJƠO x锆vk 8}P'ꚙ>6!_<'GrV<&&6P`+)bIr;>mx%g =[R.BZ)Ud |,^^fw]f#ZC:[ [o* \ #r66'wzwU# V$*Vl~/?>AGF} ܦJ:Z7S'$T18c0L %wAj=*gȨ81R ӻ ^I1".:`U2^eBԼ{K/{ァOjT8&UlAm*Pѡס E徽{Ɗy[Aⶏ厾޲eϽ@C75Ud'^أPE*V 5z򄻪XlYfXJUTo(OrۦlH&Mκv2qCjV+9- ;'c5 !Qz_u edvU(\ߪ\*b'6ʬ xZ@r$a#!XFs)LuPJ|k+{-3z.6\!aG ,c O({z}ddrR;v/a_% 0n)+-”CEϟ^fRͲʓ 7WHVbK͈jD!P?ɸ.c&U胣:' $gd*Ƒa..-WJ^ ̼ZLxժd8,[N~wf&YHϰ O|.rҫ9Nsm62RGlI:2"{e,H?tO@Пz=!*lAr.-4/Pl-ׄju`СaIzMw0+bib@?b_ZECxQEүU+H=EPqLO*:T._o_IA*:TUDV+UEŚ+vbNJ!Uػ8G3o4*JE?.`[[p8/b?dXXp|R)07P3iv-®hsm^VVhLQɏBd/cjLy*J*sQf0*D\ӹ#YTZ&B-QDS?k#wu=ɓvtˇ ~]]T! >)U>{ɩBsHeT&TAMnLLJ i) 7TËssӷm8xN6 O§,0;nViхR^腕¶r[p&2٘T=n]T j}X0! $NMWkPrA M95f 4F'CO.Ruv[4EOuWH4ÃRIĉGn=.gΜ={mvX_XwIҫ&r$ё\#Ɩ4OXUgr ^=S ]{V}]HP'Zf`i B" -W4hUMW ,TՉoģ$Ђ}o#OuI)Ah7#:|]) Pijt}1P^f▉`!)W^ aGYꓣal΄*([07EDTA).`^hcg'})9jmG>YҏV]Up78UHm.8L*(mY:CMBsk/;:Tqe1<С JskUdI6UNA]voJPEi0Fd ulؓRHCwH;[\2\@9&:)}>|(-Im@ZTjhBR!B05~«tK(D ABaF,*}\Taa4,kh,mHqNdhR_E+rۄ_b۱+|z{ii@5[b9$ēA<9){h _yVv}@={gllx'2Rud 8‰@`TɺMt?C ~򂖌\,%컥2' BuRk{TW]ӧ%u$HTqJSS}U4.sL}+//G1lB9'BBTZ0@|S23Әw*v$cLKD$!]L^[ U}Ao5o аfxTHE:IC|5K/g_#_O{}ڞ^.{VKBNZUzu*wS?Eq޾žC+Hn}SEu؝Z֡r K7sKZ>|bS~νsRWz6"e6-plDєViJ0O|܎ꞕ 6VIIU!| iL3ҌLR64\ z- D ät.vL>̋nհJ(*G{{s`վ̀;w'#5qpr} 3M iѠ `"NnhkWu2118(GUe``Dj['!)**|ݽ}y|I!"pytsǦ0 ~7Yօ!HtX)3VQ^TqolM-)hQ_Ct4Q(,*(4tyQp42zƒ.SfA}Z&is5/[vG cse`4!W*Һ鴐*6.ULaB;:TѡN{]ΊREeF/.PFxjkSEcžR1xRE?V*t{r{oX^\ಙ+1( (TQ3'TpyP9-j[a(ijRL@& ŠֿMĬ/vۈ*L}T/]8Z3V렊Ũ&ەk)Qyt{)2n\y$Ժ]7ӡȿ1Ǵdbicy7&<y%V!@Q*x]TEt>l&Tn\Ni9&]?}}}}G8HVچ+ywȆV9PVyAP1}}zuJREoo , .̜?/I^Ihs϶m7 y/֞Z^C+3ҸTdt ̓>j+gu@7$, Q44Ng{{{{{Ju)ZU boO -Ԙ>mJS;q!B@h)brFӖUKƂc@Y4EH\a>UkO@^ 9=p5`B(rY{d%np7l߾o=Ž?|>1@'EF?ɲ,l\<.٨T1ކ9U  U{ԡ -X\)ps}*F'pzy[**cѸ7-U08";WbU!6w>P} *d$n@\ ?7~fbsKK=ą%ULmG~*/b.GYUJ,Ey@xbo XJ Uf$mx;s͚TVJyhyvkZL51DOĹ^tv**(|(;}ϮLnO燓%.7r вZ_նPM0V[YЎlq7v``c\ŎJ yM$rݻgfNᆪG6 Hz>W  G៬nb\ q@6"DV%tBT&FFv|衳gBPɪyX4Ĺ>~5ujxD5CKrC$/ CКǴP.t%>܃UZ]{Gmܿy=bJh83d|m0&V<3\˘R@$3OMTѴDamfV49Ie$US͇jW&ˡ< .,WAwƂ2e6_֢XI9@P'` ל㱣Go顇>mh;q( DKW MGm.ޘT12jWS#mBKLtbQػ~mUܷ)=U^,m-K~k[|n;T?^m*U:QڌT6TQ:MP*RO$T/&UpMMWL/+S(,qA +*'J%Pz.fTә2RsrT!28S>\5ID !^?Upaޫ Y,.bKQ`*z^JH41.: Nb1/g)}qSytYQ eNmŪA!c*VxD,5PtOMNj@ [< *\[7I9XV 11ZVtT4lU+_yRQob|)#j33'Ο*\nb>}שxPQN} m/ "^>5%̌ [4MZ?|љ3u!w:c/Weaڣ$rWTY!Ta]l < h^GW撲AF-ɻWP0X YilmVQzJeY lKk$0j17ۭ%܆1*=U< gw0<Bǂ@*h\n<Ș,?%"}GOs~c2{THOz7pmR֟-mۈTqd7k UvXqnw*6UK7dREB(I"+9pq(}nC֋]-]棊ك.Nɹ BBF*`Tm9s*zt ?4*`y$Ki!MN%lSUV&dCtx>-|[*dPYLcn5'&/bNFLQL~.^L *ܿnkV+L"?%O+9~F[K Nb(2+uSldd3gD#$sCZviVu7E}eZ*ֶZ-Xcru X1yؘx *\kccIPA٣VhuV$i23u^*'T;6';=+ gOHK\M޵W{쮻noosDyNJ2e0b]hH;#zYZ2rQ;PE̓PBzF|k8w>I.Qyx8rh&m_eeP^`)Ygi4V,-Ws9נ JMz /Ii:}TWHL$iEfdd|D&cn_??9%;Kz@-$EY8[6UrPnDlh#+PƠD=z5c&7*|žK%>0^Tb5S훌*j{1(B-_*HTqB^HT1 u*A@F6٥ٔrW*6U+i~c棊q$$Yf3Xub?0oO"& *^8W7Uuލlu(${;T'D.ڟP-вLfcЀB=NM.!GW/#>|\!tOzwYT>5텦()9$H>D%݇,~`GVF>#t9ĔۅzaUtj}IwGNqC7wsL|Hᒔ;= cSt'S0XT_Kβ|N\ic@ٞf\@lW׌q)S!x"!;$x@"\*`0Dе<`RIs@꽾ImFi-Uv䀜Y<U Hۮ"9uW;OGg>sGWi49U"#g{yREx+PB@B\* E;/_K%C5t"C: )~onB]kA*oSỶx l$5|S Z*q_5-- Ѿ;&t\nM&|7:i;ܿqdrT!p)R!ZfwL>}Ͼ]{|?C/\C@ U c3CPWl<^%GUVXza:TqŨ?Rj*UT*n梊.x/Tre1!;.UykJ]D& \Ut˖ 3:g,[*s.{w*T1WQ@!ZbPEǪԨ`o!*FEް5=<2Rh)dElK!}C0k'},UսZM%1crB;B;&D\D+{.V!D@*GL/9ljrtӧ۝rfචJK[;О fd<_"ʇCܚ9}+@Ϣ#K4MD1$AnO)hfB;~`V J%]ߦaVN,4jⴛgۺu5 -]wuudqpdsnH X0 ) $eySpƛ2"S= R~1aZM" qzZx`?حULH?U{/~''2n%|hXN?U~S`e) lϪNNJ< *U,+rǞ*3a4wqj9D`!0zNl(Ze kou` 2|t2MdmnHύRdDBSre,I`#Ea]IXk[{]w~UW=78(Z\rz/vQ Ѻ"9w[F WN_]PsΎFBΊ}e3Q*vUWCm*_p`h IDAT>Bd#+fH!T!|Ըv @Aak^A**T tOG< :[n;9.49%RkddppPP61!y=dUh?_q+H">l]'UXas: yC%/T!g_$ByFTqkŔw422)kq5IAClOtbqԞڴ\*9wVKNNM!`a>B,U++(#*S߶WFGt {d cZ7k@#<@6vG{*^D!}Ȗ0"s䳽hq?gH1Af84nF~2)DB, ЈڎӾ)BkQR \+p$4h_:9X-tN|e7Dٓ8pm}{̤yCCH7 I#O*)6Cn4 B6T `U\)p.lmWŝ,q^{~?Ą-֬v208XajANN.//˺? (Mąu`,s!_# Ei4ҭ{՗]R9QJrDÄz3uB6j6%cp~'zwɓ_kQhZ6>A,NT--rk :; QSIX꒏Jo;FaMg###آ\c"m\$-!4ѝxEĽP.⻥`y4>o|㥗VmX_}[*&߱7? lJghY(G։fY- xػNb6NwfZ1eiճr˧D"C~CFEfRI5O2:rybzkPE.bR8 (& p~RquJY 'C[z4nÇ_ݶm۩SO#+(Pnuz$٩d Hl#T₠K-RH=ED=X7X5=ňI!'C1W`ͺiag5U+FTjݠńa|L27 64ak[ɡws{j3HtT#ou;8*qu@NO9|hmj}|m#3Tx[ Ɋ ,"*qg)`1)l To*XfS3>~ /ȲSeք#o)9Tyu6TAyBy?sr"~fOnJyBSqNvS˭#[8xS7kRN(V.U|9R$|wk3SĘ}!6 lɩ`˃U|:Yn'^*vl?-.U g]JW [7G= b@ ࡁ\ ej;I+iˆ*Vzbz_hH*jb0d@U61铓]]r:JyN W[' ְߚIJ2KKmie3nbZHu1j6 \G&CD]V 3WVZMQDm?ܢĻgϜ9\_'^';E3Hr<<Ɋ$^m?- ^^h?fYAb5NYdt .k;Ϻ3e/ dc@s;uAEdc5HuGkSkf@A/R5~4>{w?/rжܺģV~ۢ| %oGI[Kt c]uC'GM˧I3\&`P#jvX+G @әﳋ@ rW*V)*lɕ+oj@JmţQ('.U̾GNmn^NU7y{vQEa:UX}e}<+z ub(.?[<9,U\,Fgyȑ* ,D==Lv%e;*Ƈ( =7Oc`H*#m!/Yd\,ϟGtv\./^x+NJ -}JRK؆K V1C*nPQzSSO9|?UT_8w%w(}džoRy U}RŶiTQ]bUbhJ;ûG ,MX`ò>F} + KF'TFTH{{'&\4'X N/rD?t/șX]O)>S"'{oGf!^?*|gJ0- mB Q*YyCd˟ԓnaqV c,C vuoJ _pI%*>D4~",^|S utKP]V<юJ6m.{@XeMwOdzHJ:!EK(R)bq.djS't2.oX|nky˃WCPfZh荱9*jeV>jJLr|DWLxK^?zbEUzlKl:>$or.7δ1mڢ_CEGGΜW[2"yø. -qybF@UL0C'l9K}+-yLEc邨n ޽)rC ^saRqf)%2Q=\VpozKۡKOnIJXMJ-]||BwQE{4<7/PEt1֡*ʇ׼99_|꯺47v9BUQ=\N'. UbE*.U&{RIXuټ.U4"P~+}RE7UHª6Uĥr鈋}ѡMJ-=M/ l- 5h+eɂ9aRTtzGubSg k .Zv UH06.h8'lqIt ӣӛSPNcMOт̓B£,}LDEgaDl1IA+0A7_"p` O^@A:?8HTW"ʶI|3o"8 o3{$[Ŕqk0SET ̜B> kw-3!&r3 C܆pkס?}[e$fBɷft--`;HTI;3S.K:fjR^Mߪ ¢ 򐲽JSՑӧo݇ "hRcf 2BZ&mM:2΢<*g 3gjZJZފMצggXl *>/"7Q]V)iیH-w 3)1ܔ0pi"{VHdC[ y;wȤ_T(籢C8TӬl^th<,Tq,TQCU^XkZoFӭTE& IDAT R*DKp7;Tɩ?glKc7 ͏¯ar3{b)9 j UHy(?F݉aZ϶u#]W49_*B)~ͯղ^ : [Z 2M݌媳fjEfBO*Yq;b?eEc.1 4+o>}N U* ?w'e<ˢNci}jp+)̛.;,1KPLNASזved]񅱁=Y㦘/?4] ZeZn K`F 4= H6,UxSg[IUi?ciLڵk߾Ç$%MxI;*>.#Mm'q)"6I+hEFVg4ϗ#2S9t7Oj}^ yJ$c|]k;F<:fIsQ]i&+@ ~pyyquuhN妊9Qp^"@ŝaPEC뤊 /W$T U\( URcrTRZ=p"7+01hRh]V,zSY#IrDkw+O5ZxIwF çN Ru ԐU@%OnLUQ}D Tأq#* ~JW=Xjl4 dUĮ ˍgw옚j7=w˶-(Uu=>.I#5)ڔl͢ɭ܁2q,9;1rŕe`G?$V̭c>6u>6ϰ/-vs').,,/DF'gtTa=X\&dyTfLP dx "Q8 b||yԩSgΌuuj2]n{(uZFCNLOK0))r̠#,2^*g$>Sbrmr#mF>>#GAV]>nN3"L* &4'< rixE&'{{q2q>\TwfȢ堊JWW:Tѡ *feojrɩ)'K>R*. UpRr mS-_w nPŦ YrUD?oK7gZU] r!˸ݓ!TdT: Zΐ+\)+WKFF(:`_8UJ2r.$"l%2Z8y;B\#{U vhO%Srh´'ިfCktW|5JvЭ",aX\B^A2r #Bv{1ZaU`26[Xp=&-*v c)y vXFA±rrrp'*ָ8;WT`86ttpnTBk[滹̯jDw̉33r_jzL 4#"x;~|z*"iyѦiQ|tTHlUU4`6T!Ғκ7V\( ]]"x@rčÒ".!+bP[Y:L"SS壊isQEnNr&h- 5Pq M\ k4n-eBH))%\TYKr PpUWNfJM3әJxBZ X6,+K%9 F˪DW.6U'cBm+7|nۄ*see+X nqՕa7j%1pC&[$NjQrxAl7aׯ5Ka+j5I$j7dG mKQipOn@`p33"Wne@KmtoD&@frDJXu_Z <ҺJl[#~]+/jE16jeBaǦi>!$f=hvociMr eab%>)bvd4lVΙ>P8E|$Ž¢ ET{HAN >uKV gy7 ? Oe3׺J+'UǛuw"mkw̕r"e bE_*X:TAX?UdG*4堊!stCKPS6ߕKýCmPf J!7`Xb;d~J]]۷8qbvfgjXZFBR\ k BMꚋZ|VEݛ`j9" rբ>26 T36+v-v&UQ+HWiŢ:넶3\_HJ!WΨp!T!7+swos(Ӵz]yFǍNjeTR|r9ߥa\B' aN/EL[PKjPحop,Yu!OH'j!bV4 ˴e=L>2^$hUQ]>/p1M!$j(lPU$kH z)h˲ݻk5Hj*?ܣ)A4ĝζ?l$Ui4.bSyIKaNBAq@T*=w۷dŇ矃`yFC5!/RR CU%B.ѮW~<ѳ BVK bah5 E bGApHrʑ+oA@Ǚ&t#plZ*P1A Yi&f*:TqTQ 5 nw驢]wiCvjubT1lJPEb T!7~פCnS?|-}oV Ązdb*UGPY^rY^REoנ ;̮yL5Tkh=+bj;CHՄb/z U SԑDJo<ޘ 'jDٚ#>Q|A>ʮa4ڋ*t) LI;-0AbX=apeq[{bwTQV> ك16%u"hULP•&&Ԟ?4lQv/{O*Ooˢ;T2=ĄE*x )H!dݯ=HsU͕kQ,3++ZCm EKN gJ>\s* s8oU 2du@BD*9Q_2.IWDW+eV]a8n-)%@Gz^s_u1X wM@+F}CB;ӛ]6(Z]TƈuCkSI/*\Utx%StJQE6,?١BTYek`?W-jC^y;NL-.FHwsTa]Ͽ]*Z5"ww5tLҨmLlDQ%VZ\2>.eL{snT!r_?rD'L%y>S }HRnH;eU(376,cgNJSEͧ*_%Z,Ծltx6NF= XUfF@2w@#Ƽr*h`MO(-.M͈5)a7Үgz7cN<.bB' 6K]F0Tdxֆ0?+Yё[7 ݍTO ^G(`'5Xb`Lg[^Uxc'F| v sY P݌)#)Ut|-b]A^A.1"18^0TX9S_U,**pX!:Tѡ /`|:kd7|9 ŭ#H-w,Tqh:/?UXzDTM;TQPv*_D@Q$ oSŇΝPE*KK+MA:T \KqT!>vjggTAC|LNjRw;'ҀQb.*8*)ձ%@.A*n1A). :9_I  _ 0eRPZ%Dpk^_n ={TAޤ-ҡp#:w;jj7&:j_Q T0]ssǏ}P5l(Ӟ|M9B2=Êůn3}[RcF T߻24*Yez(UR[f`<ֹ~ Ta7'cY0kY+ @t"=ҿ4`G>;mff0&oޏUZxا`D::|t!Kvk( lٔ_4?a})'֢ WRSIibq2BE U@ʭB'QwobT!M&YJT2@kUBMgy@!KX&:E]bB^/e*^yᥤۧ*>1/U?v27PE*V2t]ו&)r9h0E_^@/1(.`Я y#ĸƼ70)B06>kAcAxL)t0KN)NJN6*r0ǻk[k}έ*r*TsY{;{#Nv QEuBPƥ:TqTWUũ@Υ8SwvQnYoy6o:)= +Ӱt8!i2iv+"s*:6VTaTySn_T9ʝw\^^Z, *zXɘdyf~>|z;vVUhS A& G Hc{J97.FTAQ!,)ʘqXmLLd֕i,*sQL UE{F@6dls󥗾姞|yyYFW ۜK}g&>ٚ@'p'0P$jD i0ۯRI8+W^~faGjL=i/x>U_( WڐEI82"ұ>mEV˜zyY~;V\w4=0,d&Rqoi $ p[a)f8B2x" /Mǡ!c-A*e|F1fIr^ipwKeybZY~|b%I}'}*+:TѡPETQEy#<ޡU*N<'(NqC^:TуU\ [~!T+_Nh*:Tᆨt\xoo)YPE|x*ZQʼn9ozTQ B tB ^Ն*"/0E}ͩ 9ҟN*K/`v׌tWòkZ}YeZn0~Y׶xRM9@bXb62gG# I|3k,߃~jq|򣦆=FQbT![/_ַ^{WN<%Q$8( "}Q 4X8-?I=ӴPNSy8O\S9hB4]qS#s-:C+PyaoF^ u!EbekV!c4(bY qtd}JS_ŭo0TUOCMx!POB;0qF^"y T{&HOi,)hA`#jC*62}l%vh8J #8v;BW2%Pdg 9$Cd̯Kɿ5Pd#iQ6^4 |Ϝ7(.^Iֹb'*Lu`_T1h&Jl5v/t{F8IQEboL}y Ba>Ft?@BcnFbs$(PhHLl$ IDAT` OI#`KI4 N`#x|[P{%8P ,aTq\Vv*2n.wCG궠բQE1~NPW;TqdQDJfK'XQk~Y!Z=r3O0_P\C38}t`by7*KtY evM#6sw^kTIhw%GBRKgEBa=HIJ|D4dw2YX+U0? Q_zSYP@Rh89}כS;7`+,Q,1Vp˟`EC @:g2QÍ>صf)1Uuv[*&^[627 %duC콟Y:٬>d]*CGjpּo.q `ʟ{2TS7 ovD ޽ qpf(]9}d;F) (`QGNŃĬԱoOA8Z06ODhVym BiJE\\({R1mV"XuOy/-=xeǂ s`A"%!xbD`-Z"^F|D(RonKK)Fz/xLkd+tK/8 `PG4=XP>Us(3P툣Wd*WN:Tѡ U,\ T1_QEY5?ԡ#*hpR`aݹaHW9ϊnjztOe7̓q)l;zLSSX X'u7 .xmnD]vQҍ{)υf5.IEYQ˛}Ɍ o!} [QEQjgK[?o~pI 8]O>hJͭoMp$yB $G%4{ \4]{uM5.x;&QQF`4\-hV6^[o*vLCeULQqR{X|PtWig3c], Oyi=cdȐt!\y2:ia5©i-aQLÕi;yR"px-9iRmpU64ٞA8(r3.*]D;"{y n(4;]Z{ |9 "P擃N>*DUf?Lº(a(0Exٱ61$0 ?!妻1ӂHLU;e^8=V,q [H4~D,r2Uю0Db{Ӹ_QE9rFCxw=SB`8&v&{~Ӛ;V;Ī Іp}T]͞ *HeW_ySu2SډCl9+uoXW\Gw2ri.YFXknzkP@tLsK Uͽ{#;J+@ֱ: Q )Db}w\-XJ+S'Hzi|ѲUJMzUA*dl. X0R Dۡم p@aC缰t9p4a7LP8u Ǹq Ё6: 淊!$0`jw{{ \ u3 C-aSH+Z !d+\H@EF c4M(&;?)4|SzVUx IgQ  %!4?AQ(+d[0ʴUF<(R@9ΧXd`@r\p"Ӗo4m|̫exVk>A9 TbGb % o3.efBe*?_PE*Rmp^*b ;Tѡ?T;VtH>"e8W>㒿ZS&s@pHtpUڋ+t%ٚXB =с7P34հ q煮3}m6KLZ>)0[ޒ7yV6Gj%7'>[(xi X!DRGآ>[SPz][߹'}yPUfXyjEc&Y %^G"b]!aHcCT;dG+vּC3E7U|UhC8?!+A"ڸC6裄*&.)`X&fJc;;wڢU]^;1Mh2(H*'0XHuZ^~۷YB*1[?l^fρG@B" + ͖cG  rFjw'K`\'̊e9zߝ(^Tvӂ**X܇ 3_sEM qWv*f\8"Xcy,ҧRxC\ȓQEe5!2 `yw+x5P|l8l-R{ VS_%>?-@r!h+\Y9\cmRXL\g2|)ÙS fQ-y  PXm1Zpχ%N: S"!eNMy_Ǎ#`9A 1c6R(^Y$#uWrws융D߯=`~4}\X8^+ͤ`LQ|f*& f13wbr YNQ p~$TqO F$>h`:v;F}G g"cR%sɀPCSLqQEyaGP+:T1ET1R8;QEFȭ|*dTp)l<^O:TqPq+Lϟ o8;xVJPBT>2-a 4) "dckV( 3dw-}+ubMU d084YaPue`z*O*fyU{6xX*@Ydϟ|g8Bx,sJt0TQ!љZ?kE@3ʹP>Jcy>V҈Cd VE6)r=@F0f.α Y,Q SI+$Ì.C`ye6}L UĿHWg;TU(o*Z|"EXJ2TUkÊ/:$ T1Q.F_U:mў $f  .yٽJ};45@N 9PTAμ EyPEbwDUInۋ/^[y閭Opp0Gky liTb 2YJDOn( dOҼ{hįeQW6P2SYSå>gE}* p:#ULAh1lb:T1ApzGU^?bKVPŃ*.nl(#(T}8znŪ+ܹ'E נPEslȹy{NV̴(kD_{4YA6{`66?&x=l'A%#kQ;Ѽ(n_CaLL 7BL(b*Om(ا 3h> (NL]͐&W%b8lFO:NeELDIB솎Ѩ}{A^)+[(jTkQi :BD`p ++gάD\!+,ӴCiy{DӬ)RD"Ե\OOmd_e-4(d{*UXJ9>B` bM9"0WרAea)Aiax|q:`?yI}F?taUoxRUEüCNI(;.䁒=>`Gk.*ˑwI?Fam7҂hH`mٞY[3lSsk{*@šBUTdpcҘYcb;4b$bcxQebJuXQE*U5T.d"'[d&[w+=:@{ 蓷q}XTaΓ?dJ42wiڠ>٘j6+wdj_饗| n+POغ jOTh ,,~68j Dxw7L (ezw+3׊*2- xhAS\uI㢫г&֫e#.ҲQ5 .eřz-J]b3@( \E^[3%e4 wQp[w~!!4Y@M(y1dS&P鬡]-$lU_76XKoyhwuY !u$QKTU(|db%,]x7#n__ bXb#LM G&eTUB9s>$D<p9h2QC; S{j']sD1?2;3{PEًtpeTq<_[UUHyYXiC;TFP<vXQEtIPśء*0xf@ĕ Qh=RTezhiךmRd)Eq;*RX+]c{O:TW*ܕ'K”.Thy0htg8G"Z0:w&c_KRF8}G25©P,ɘWOXh sw8:AHaC2@{34za~+c;?M+"g{f0PsVՑkvTVGLRc%ň85}eZ9H-P8Q`b9L! @kv*(p4v-@rfQ_% Z^Xیy+oMF AA2”Ɲt>12aJٚ:ʱSx"aH+}1a~]M4VCNn@\ $ L4+<6Akmؖkԅ?>TAS9RUp F?e"} ץ8ֶ)pٚU?;AC+vA@ŷĔm'JեU<8BtÎ*sV|eԡU&8.P* @+Vt"cQD O UyQE1`|*`6v/1R!@Aqx+ޅyl\ivEhvB泅-ݵm65)K2Rji[@Lo`l}kƤ9 LcAbmE!IF.STT8A}~Kx+Wu5-11ٟJGv];m6y*L!\‚)O!U=ЧhcBtuFݳWFDxb*'8M0\(vRkAհ&3y׭J򠵵pNE$% 6Ư1 X 0La 4U V|5!7`F//i?-O,J&wS'mnqd͘01ݷ G:21KB*#{65D9-Ccm{dQ|TQn\CJաUH)8e.U.xUGU@QA+Kg:TqTPE/ XN=\T^enřp}XT 9e'|eej%OӜ6Vq V)pI7C`hm~5ŢGZ7Z&Ѹ\U%~0ˈTRؾW3| $wzL12m˘9G1ӣ iZA)&w߽re~~^J" h`oX> g/ ~*&&Oa{"JczzBH[BlUu^2{8WesYU^7U$HCT(C/{@6CLϖ{|Ru<٦ oczd~&B/<;:XGUL/Д%-TUme`' ᆘtZ]pFoҢ%W zP EQ?d"2Ӯ2PJ/%zOP0(* = $I"c\T*Z\v8QE=>mu"cy4Pi_XmPGC'ޟ%TQ͟uh ` ͻPP9TA}-"YrET&Ky65PV`|(J U+DK4\IΒ?%<i=>YtA`SXeUmr\"MT1@As9].W:5Z5+EjY%0cwdjc:S\e^a,m5?ƑG>&'?s@X|Mi ȕ5 \09cϜpm-< |'6>ܻk$ ,an%Mz/Z7?ct<Ey6`KpuB'Ai ܏FX#ST9 &IkrJ?I}aWef %^>zS/f3Yc TA030Lc/zR< Y01kTI0o\sFȴnӨe|v2DC8*.Z01d4Ȣ$8RbD)sn?{%P-"T]2_%B# `o7T= 4⻠ УY2WZwee~~eES'T iw314 !U J০!peځP#`$b'ϢPŗxFH[*>Cz(;lQ*5 (&BJ*#*P0j{ETܶq**fTH)]|򎠊PPՍx+hs/UpG돘x(ݣ1\F=,MGIkaQ[3bϘ1Ut>A`$z)~J҆E6l"o\͜0&;qh iASJ>UňL{!^?< g̰R*`|DbTIp hGf9 I~i|\U *$+|pEu̸G X¡`%0,Eef g5^ v1!PEw>9U- bsCGU^AAȢ!3-֡CU bg1GUȴ,t 6%7_$w^+TP,"߻f /qV*yS ?#p5x| ɜvD"RpE5wm[1q4qbӊbyyi)l̇0ѦS֢w0۠KF>w7NqaQ@sOk3-59m8{dh\z{&X~> KH^}E7672)Q%MK@q]@Ar YkeUmh mUۣ;նӹky{I6r ?eErhkJ[a % ;U+:(@U q;M+R'ݲG<;M8*å if&acO)f28}ЃDcFb9n۾+Ybb1qrZvfFAq}&&#ђ.2  vGg!Tז#䬯Pm"UQGwdy] !&Z>Ł}x&{*iN":T+|!!ά(0"3wqwa*g46l=CG-c[T^c&*oXEС*b#*+UG~xPE8U`k\uQE(6v 3ױ^7J1K˫1AWr_mx}Q͆,<χb9tRr3@WUP H}Z*8]~~IFoDцPI稂3 >g&NCv).ѣFN,=E=̻CT5snpHy?SΝ)C@PNqqI4~Taڭ}(#~R;TAJݡJJMzĭ{\&ޞ#=Z R4-Ɗ^-+ /yH[c{}h Taku4ίN2Tl E,J:LWƐTaV+_Q4y-ŊA )JL:M@SLLC42j8\&݅4gt[D /QON}gϷsEqbAmzvŜQK'Jpte|J'&MoUpB$e*6Zxt1\PK-5(YA*{Vܭ4E:Q b((Mzmx(WK2pwv7YV)co 5QgD> 'DnPEwQE] r*xڹj'!T9]l-HM*58@O-HbI^bwCUSbf3~淒@EJݴ-j%DTá"1'^6J2EAtUe7,%+kXXFs6s3İlfXmw 4z䑬(&-I "f͑伴SYgw IH#;Y[[Xam9Tk` I#?[ΦJWVGw-Fs 46+8 ǔ9TlE Xz-xH`Q8 bZ*23ls`p8?LUS(M sL5^ zdK٠Z?<߉Ē@MTBl7M^ &@Qɪ5|g5b%96|0%*FSz?^10R 8Q1RvyL Ud;oGL5Y1^}F.u9f-c>.Tk,gMl] W$*b M+m}]p0EҺnqpTot~ ޞa8lU V@M*/}%lJ"8UȎCq:_ZPE}Q\4 .eO?> _XBs]t$3{+o4zI552 D4/$e*6j'Wz;1 Q7'UX ;h-Մ9f`}" L-yH6KLJchwq(@MA K/oۛ)LCEz{Yyo룥RJ 7n8YD@'(3QEV&]G3}Fڅ0%(,y8=# }jB$GUuF[ElMEf-07w񉙕[kkx7޸ysU}A݊`Qpw^* @kDPпhKDM~I1Ⱥ'?='+32'eg \=}nd2r^[Pښ8vD7424 z%sHPp'XGKK/~vuC]tgi?a'E_+ěrun+?"f =wk$jOU($5+ Vz Rm@@E+jM,o<%!6 VqeB#0X^p TL=/r;׃-mU@pJ$jNc^zY{@EF0㠲/` NDbi&h^{Lg|Ěh(?z::3jMQ q_6*ڌoL> YMBa;wTFaw6B~=ø *zF)2i~Wbt3,@|mGPkUDkHG*+ZU]#PE$wߔ߾/дߺx{(+vWȋO}q<ʤwNe+UbsYק;KCQT![ ]{`ׂY~] '4Ql}>lk4Q25s`T!/sﷳB)0@g x .kF-8^L }8+5K/MP9:v>nؽHdUXY0P -8V~WKtU> 9_Q;$eUwe` ؄=užW@:cpeaW4PR^\O̢I UhWI7YD ujC%Jfdʒ1=+2b4J oTRF2`hYN|T jTTѯ:TqP坐q{e( "pPwS\Jc!bUTK*6w␠ o1oqK;w$t)j`u%}6Z5:Q8E3܊ Ճl5wѐ^+++rCgnSw Y ]:?3xVNY(br$H[6D}p76oEA踲˵"?-?Er ܛ<$xɀ)PAi}S?ϝ AHŀE'cOm%n#Dq[dWbBwxf0G`i%m=D5I4-g8 oJ3ME( ѠӣLpG=r%` I;ggiB6LbB#)lg D lY*fg}cTqz[PųU4`E*T3RH'e\TQLX١Ä*υW/??8쵵UH=)Tݡ†k?Po`Lqkqr#dUI+MCiљEdh ~b"웄D|TaV=VƳ NpZ7S7 X8 ws!Ȩ3}jeFkA;aB|)'4%;z23_kjZzT)Ed[[09hCvh@.픠 )XSu/PE,am^jZcZ4as4+$CW,HO=+kxzE@ Ah&qɞBVן駗ڤf3Pt F$>l^C*T~o 񧷧d{djl(̵Le3 ͐'Eo1yxb 'Ly1A ʫ*Wknyߍv0n+-5m++7o91g (z;7|C͚&*!r-qV&30Ԁ94S= т W[{ރYīI7xl'U:T[J}*mAUX!Tu>GKW<[YQ*h<0*%b{uء*bz#rdh1º0aFknes4B/Je˃6ܡkY2JWǼ՞Aum'Led3urd{ Tz;]"WQLRU}n-q/>5PF,H UpP?K]`B–?-0"Eq61fؔXE;TQ4зa5ڹjT}QFrT7ӽ&GdEs*p;?tԗ08%ϏܴkWTa8APEU]o};O?MI}LhTMw D@K[ɹJF--_ QSaDDر~}tž#>c=I V4FX83?L*d.`(%֪d- ؾ6Cθ&y[~zwEpƄ^;k=#i j,p* LTXze ǚz_iWqMuF$5AjBzJPuT2j_UR*ZIU}JwJQg˜6yiw>Pb +Gu0m x(~*QT1rH|PE wV^*ݧT d7D;򥍞sh iq(kktj2ӻDd}Zmm,:'U< N{.5;]Z{R,[ЖE,Ye+/mվ´-Ӵyڇ%O( 6"Iό$ne? Uu&_Jyxja:? mݣ Mfb=05Wp@\E4mrEOlG'VXi,GjIEz:7S&Sz߸qC,-ЃFiSE+5%.oU鐞 ~Og~!׈J2gcK37mIM(8 -,--ŸT|{*DAskڨ\?;6a1&OɆ0aSߴ۷G7Zn4oi`7c}0JQe{Y:,>%QSIe/vھq3hLT<U~U*>vTQ]HIٝquRQ 8зs5|QE+](sաlpnTq.l|*ޒo>H>MXѡ >D}u')x6x2un,qR_$Ppb}n7ó}9(TlVܹJ{h3Q P M3uC!(q%<5#& F8ίU\ݠ$.n# aHOQUQQP`oP [s["y0~<}J´ a])1_LNIw>laK/ݼYj .FUxL[EGLQ&8Vr IDAT*.͋~E^߻voݺuE-*3r6%y#ָ,i䰙5JϗCo@ ovjGF^x(8fF~qt\Px 6 Z~̔u1 5`noo^xRb -R`4)zŻ2ylq%{e`T+_TR*>NT1\VH x7Ge2RC-8KQU,:TAyɻ_P<@~1o]^][4g\&I7v-ٚ~<c&U]-U0Tlfc?U *|P戔7sX:Ɉ덿FрLo>h Ui]fȣH}ͦfJ13)2' @fNV sIYPU<1WuUBUؤ&#J7&j(i$~W.~b|"nA[:TĮ.Z3PǏ*P^}`&a U|PUܟbCpssaaiI-z\t#agb۠@؉ g-wE%RhPjkneʾ2RŜƸ=lrYz;U"ۧbIlF՞e;NX/S6 i V=gs@xܢUŧ\(rlÊ!fTMLfZ꿸?"U *􄅦[}8ȼ{TmKC>[>Pe\S_Mbd7`&;dŗDB>ҟǕ4c$hCB;%vT_ ¥ ۢ{I܍*7WÎoMt~hfFx*8C~$ @|:?8(-e&igrQ ˅M'@=:`8NKKd^ĻHiVӣ`IJfmpNS UB@`$j:gz1a+|GȺ4țkhp #pvv ߡr*|J)rEUc3OD|tTȐ*zh,z;;T@ S!C TqAC[[?YPECUԪ3KߊM ")|zMmgf*H =12"r\(Q}PEqF1.Iu>)"<88cA'@aA ϶{jnr@PEA%ʪle z٘1tNÏ١:],)<+2lPިWx0l<>"$}~Ot|U*C5ԹP* .==JQ${URC1+:TјIҿ?~T@ֵ̑gBA͝+gI"g PbAQ! !bBYPW Tᾜ'k#>'s,kvQ+h4C)1erc}wWI4ށQEڳ`{1gD"f`C: 0ίy kkضX_е<` jޭ]F"#4Rr*v6FA0 &{,#h$l.榦$&K! Wm51Qt6UjX,eS|u>v3KMC2:sgL"w/=:dFw,TPo^CX+X* y4:y\ǞRټDlj*)S}d}%=u#M .}Ufw Ϡ .=Ew@Ԑ=F^4 5LiM$&PEPZU\ 5/sC{ -3PrPoO,6QE(\<7;dTC{vˠuPůULAU|i@_b˧SFVxT1?a}UPEѫSmzȼ"t3,Z,/܍wRQ.fS/!W~j*ftP~6VhPUj`aA ُ*.vWD&D&$K|{*}y w}񏗗{u13y àw"wEQXYq~ؖBΚQߖU(U{cQ)m؆''Z?ZWZ"IEL5!1.f N,}% pJ3t #"+9vH.8-O/'qC]6[l_!PQ_95EVe+?[o}GOA gW_%\acm(>U|8Ó:P̚0H@{ p[! E(ӧ:9ɛu+F,2=>/׃fS/SLIM[P1"cmp SkPH,IfCҙ;RbURy1DW3*Ր-PŏZ;T1Ux33T!Ղ*F,Ŋ\UB`γUQ()hE4Kf􀣊z X Q8g8ӡ Odž*n 8~TTdT;0UڼGvSmm(%J^:k~7w F,V*<= GO m*;پ^BǛݾc7_x-T :UybWUd\@ĴO?b| U*JlymgW?'[ro9eVjGITM%H)B$[",h4E'L< .,* o\Dn{]{OPD+11OmI91EJ,OahfqtG$Yk܁m5<6}Y\M]u\ډ*c$"0rGDi2*,7PX6ce_:n"b}Uқoj~]Bkk.fG|bc@%;LzsヾWB3XgQJ?@N{Qт@^'FUũZIJ6G{_2h)+;T1!Ost x:Ta4hsje箮gcԡP\i!otHM**sޭW7U[Uŭ~H-8(Xqmyz۟ 'oVJPŽGThDH|vFWh`eq5\_2Ї@.(ZNǡ OKv:,llgBPk{Nj~ΝܴI5ՠ%M# x7$ U(gz#)K{0H7nXNG4! X(V-Bb)ٜ*59jn8 ny>oc/Q XB"-A4(=IFk !ԠDeS;:S$jxF3@ؒz64KH_D?EY fBP߼YQUg#yS& 6T1F ?i |7Q*XTƮAaO-9귅wNW dhW#L1!nR^ԩ('L+),S"K*Σa*&V i7$;Ŕ-bգ[*W*bVvv:TiS^7Nt?vx4T L*B֧xtC@Y6w׃*NoT>Cuݡ }AۏPBPd31}8CU ۮ.\=7Ǽӝ(dx@񹦶Zs'=h<ӢU6]UKU†>GhۡF˃ǎJ/@MePќ0g>ʶgoDӟ> b"T|hnKx@T,c8Hamm0Mhζ&hj*ם =6A?ЇJcTa3wxUnk|d^ BJriއ^Cm8PE$U!7T{9*P]XT_:TauCzቭ7C$CPU|\b,bdZC#nE>aSb6(L`:2 ȁýUA53,XҦKùvFaT<K7Ŋŵ _xB'B;!eurE3rlk u&B}pG?9'3k9!A=/zboss |Dxa. G.,zo.u(޸/ --MבOrDLmM*JD x5-C4 ^x%:TyLTAX1P>l*n>D Pѡ*uA[Lՠ:NPCULۿ yWu*E*>Tpc~UH+1u^B,9'c$Wj@@{5vU Hi`Xopyʖy`r]/{"C$ O4QI.RCDq[1cGRi&drClaÞCHJϫF3zAL:bz#Gube1yM+bDxvL6R3A0zazf?i hR5`85^.Y(@X/ Ȋ0a51 d-^n:3KcM2aeeyy0xee0xaN$ص&7gz++xR3Le?eV&M7'HB+D8r!essy9щZN-Q[q-u$1  *Ahc-GZ:\|767d|OLGA'0?(1PPiU#;-U>̙#e*2blODX/Ayw4!`w"k~ HP?1CGBʻ=WScWUw*eNM*>NTt5lU|hT1cem1tc@$Kv{) !14NLQv&GHYj֯PIݧknr)me\YX:eaI*ik FBv=r} YҿyɤX҅fr1|P*dO?zOQEVJXI%345N.pjU@پKjͤʈqUݢ0B'3oft-y筽I*,Wo8^pg?6$oxHȰ/"i3T 1 1- ’"K EGVVVH,ZY[^@HxP@G hv*0KOS41pE!6R]a͵d+!5*gxs7ƧpޒF90$Se) mJZy2} &F_拿ƕ}?K_~}J鲏&–(ɱc3d%ʤh4WzMۥS t!yc*0EAӜU$;Q[ϦN!P3C#Hu`hueȉݒ{ UI܉b^Mr Ir_Q y/ b/U&UȑR\J{հbPWD@c_Mc0πeLJ plG'ЩءY .7u*Rסx ݠ F.:T1^~,Tvϴ8 Cݢŵgx,UkTq.{NI*@ zx;K*<;TQ|XT'Uph0FHn!3`]X$YqFfdk9 hn)ߩ6?*]gaQE)pO5͛SnLQEh܏i͌&F~ }ͮϾÓ'ϟ_[;Sbާӂ&l[PEb栅u |>WC~U!&v61uĎ^3TA3T3 wsΆ߽K& Viz8;zGc-DZF6[1N+$s?17bG2="UNr9vswnnnwW`/UCK>Btˣ=1_><& Ga"k T|\"^5U*Y|Ta ܣz{EPo_>O}/^\^>0HP:1X[VI ./ ^X d@Y`VKDST??ᇈ"X'U3!MWԧ0//ߑP:{cPE{𨂛_tcDoc䚰5~P#*LI*Uե<CULBh骠;D|}CU VU{ p~گ,.,˖RQ4T %p<+x,TQ,!XJj1Q8T{ ,KK!#mqqmƍӧO"(3>"<=Q/ }\\ vwϟ\ @+9B"A,k0| :*!2)mTa=\}j8B`Ŵx20 ~9i:ks*tâG8q)5Zb)42,R9zyYǚ;2]2\^L.^xS,ә9@6mZb az+P0Mő >)Kx %?(pJJ 2pT)PM2BWpFC]OW+C|k& G'LFL2C弾L%M`*Tj>O]={,o5. PE Rެ ,ۖ,Bk8\R(SH!zd6hk UKU4>xTAŠu*;TQUUYA[?_Pǃ*-ʫq*!Xg8m<> lCU7E~/cf ATOݸ!бht9Kr__$$(uj?^=IĠUB=|`v:cZ婡\GGo[qˠG*ۜDZg,Hm?K03m[Y<뭭@NqoH\gYKQ|hh10|0Ta?VZ(XzwUk3uz1DԶɎp rƞcoX)5g ‡$[N+=7-)OURi@)#@oQ{adLTMY^~_xgx~tJsc;O0Ud;K *))؉[[XGȃ "1c@%GWbUү> ^c&@7樂1_pKoʞբ*g3WB(d %{ /9^7&-ŃqiDXF ̶[%}əʔ M4V|=-- TaMi ^Kǃ5QӡUXsP=G1ZP{oQE8`Ů#CU,$A[6T#%p姞z] `J*dX/@q Q"¡)xSۤ,'7Aty=lnwwϜ97s=H+0LԨzjӇUQ1s56b,RVMǼQ||ռ p!MK9TAr[NITMA[ c; 113\ܾsg{{}ע'o]\\PDž*5A:TqoQUgk-#:T!Q`i%CUxҡ UT=WPŽC/l U\ߐS!O9T103d} fF\les{ߝ+iӴ? 6FLQ*zO ;*VFd. Tc"A535[k5fQº,ᮮr|t9sKK~3`Ê孭oz0U2_OM7B{K=3oLU"mԜ4ި7!%CHZc Ai}uX[U(J5&q{ӰsDLfpc.{P|Bz=r#9̠SxE`_b)&|(e\ˉ͛7e W'B"I:U  Z Їa `fFKKׯOɕ%&!D+eR~/SaB U# ^&9jLB(< TOK <ٚ8: ЪhG9oTo P$1QU`v:O!_O @i $d-+]{ W\WԱv"ksUBU4 羨ܶm(:Tq !#uȨ)>_tcB?stޡSaRDJQx1 K(0.L7 :2&gH@@D3Ӻ. ִ‘nږT yy?h˚HGNuj(t)= s8G|ɸnJ'7޵h{7+4uj ++beI' [ju/g =y\,qqzEy qqWF2ڐq~9Czj5S<Ƙ c5qR ^3ིV+^/@[p(G)l|mqtV[-`2\Cwww BPR֣u#ddzhi>v #y]f?H!7 8¦Sǖ½|8E]7LyP\lHuᛛfԱa#bI]fIף:ef.F$/AxIa&"ոIada4*˚5fȆWLȊ ~[1z65-(ïfHb{E.NEo={yι%E-Z{=?s:= Wy,.82 :^O2'E5U8Z`\S1Gs;=Er-d߷4ػ x(dTjYC/;*0 6*/JTe ĝRB&PXM+">yR|/jJTAQ/iڀ*NÍڀT3(j';ahETACaٞj Cҳ'L%hO\vVnx*EM y*>-}aBB,.^rХKc rqxv\ѷc Q3pm@ߔ\0uo%h& Ҳm8 )FVCvzǘjk,Ua#zz=iMo,ݛ6@gGj&S8箇H ~M]0$wE tPGTi3얕0oQsU 76EI\X,H8&E' +]='^'JWqI?lmuTQx*Gb럘*eW#*i=Uh YYݓLbWT|jKtèbP?* E&PdYSBMoeoz5U$hUTznJPvęZV2úc Z@&QobO,+*eTE,?kQsXwPs?l(}IS.F˗gf<`6+!" ]z?"$Q+L#qȞ)56&Ȥ>{vZ֪r)B6:0 |9ID*<_iң|3pehfqB*g_,hΝ۹cǦ(e]>Ѱh!"^wBNRE= ! &zp,!&qv5#5 } EALwMY=q.V-,X7-nC/5+,5^UHUOn _W/h-I*csE?q1J&Uz{17{wz;}B+pB$ #Fߒ1%05g Dt۷,X`ҽGDƱ`c(=| ⃓qQMǵoUhYص.qGtiU8 [Z*@0o z=Tk1HL 6]hjSa{E>!"YPSURDp;?aDЀKuyvN3_-RQ]-:K6E5"A%S̒5A|_TM DUьfH\Xۀ*ʼnTQz܆` 'vz룏T5v F JBpd3|\wnhtm nIWSvr+c)z Ӊ*N+RjS߸\e!4R %^6:]4 $^wЅWNTohcRe+- h u JN8C8sah`b ]ˁCk)| =aWSczljo]C Ɛu&D`Y0tbR5Ff&&u-L%\@̌ SуaTZ/I&- Yt/>~ vb?8ﵺgJܸGXz4/p22PD_"\`*|GrgfqŸ76UoO3EFjHF^Ђ\ ]Qbeb˲28ZUO,#x$5PBwÌ]dٳ??3kwP#B[vl N҉&r '2o*\ ;vJC$j2`nN6Nd?z7&𢦓&WxFx)o )]T_g?5UTLnvsMWO5*7*Ikfx ATqA*({mAO,[r6 HJHR5"MAoDjݪu0(>'u5i|R*=XNe~XhB,W&T1A؀*lA!Uz2>.mf) e]Q^}8eoMc?0Dc&}2!B&+&_\Jh46_W.ugYI6!drMMB8^:0xtX9YP[pkW#?ޚ@)SEFeG62*M|#);dq|Qz#oJ.].yRd*DrFgZr$VI WDMh3vՍWk>Z垄 x̉R{8ձ.}n/ɀļƤI3h6;v^ P XyVǮRES=)%N~O39'(譇X7 5a+h$xiKqS ~䃈& BEX!/*bw:Οم |MUSfMWO TTqkb4P~MB# )AϽPE&MWW/l8clOmyw*4 VQIP !|Z%HT8D>WR~QA1քT_ªƩĖ*"QUPW4#™HZDPԬ$ʣ\**Dv2v&"1BF`Bgrh|6,It8Ɇ?kIK 7pc}͢ԓB#VSZWT 5}*|x>i( IDATTںzw絸ݟ/EJB[34Hn7QÝ.UbcJ9#Զ@ِxBܦ5m :mfߠ[?).|AN`PNrC|gTŞsD ׺a$ +W2S6WD|2E)HhY:< n2ez\,q}\C C R[8vv*VPA=DܭO#n<88葉Ti;_8= Sb(hH"Jtw0-u;JK)s~r_SjJAXn-M'0~?mo/%TaRa09^hSY(sJk*sBW*N&D"hU&6ÊƉRJ 3d /=΀anǦ?l7z~?'*RŢ$"s:دvYT *:eƗU:|j4¸ ^|‰o֪A *׈I*҇@jSS.T[N(2i2T{hk|>Q<-E8NO[pC #G`@m9qrn~1 Pׅb_CR8QS֡Ê՝7*w^*تT^@̈́*pfZ@;Ye+Tc(0ޗʊtn#Tf%uNTUT\gNa6zڛ1&֭p@t W4 ]-I, (&~Go][MqC_E$|AoQrѭ1U:!U)E$Yb9Pt ld2=N m&1蛮; Z0Qh K `K*:;,Ux@cutE"DBUdaEBS$c/Fr8s¥YfF4VWNeELt *Bʀ=reHg`7Og_߾}SSE!߿6Lv<>gp<hZA½0 4M8Kk0q:O.Un[AȴNOc*%ʠIsElsGO7Tq=8YMQYPѨbkQE1PʮH Ɩ《(ɽ*rDg.+cea!ȪFz7Z4]I7SUG>`T]9 HsԔ[./ /^Y:kUVEAǠߴ4=|1.h[(vt8\Dj쓖0r&Fi˦6EKdLP Og ]T!YemÞ`;Ae6퇖mb9bv(HkہsrbYO,N(mwq\0>prWȏKTrE*i.6U|#'=>vpjZ=.nG" vK4dD D5+`p:ʬMzOGj˒ņR cJN 'P6){֛eF\tmc+IlBhl퓲ae .5I%ΉEŨ$S,Ϗ.x:Ϟݳ{ݿ._2yIxȒNfuH4>Hכqvwf¬\|}3ք5UhU J'`rU4_:^jmNjjT=^>bV5UlȊnoロ@߂T1OMh T]I>CPfgRBbN*K}=TvpWInf=$7j0sJT(5G3SxbZ@GJ֡М? B%\ _a pmH/̍x81Q1Δ*"uF$W`(:R?YG MR/  t7G l$eу&>bZp$7YCp&ORP lbz("VD>(IR5h۸t͔*(-`|NGB˝tp2v&5RwAG}q Ȫ u 9"4@lpp+)9*Ԡ"ԇ9S'NIiF# V 3nF.8 HZO?߿[N;/*6:6̌gOk䳊01*_>x@GB6ZΓ=dRVuk[*>SS|P_ U'?n_hpVSŖ×ku TxžU5UDr]_nUxkVP,ib/b/VUXi-#lMIKU\*"$Ew*77P󩷦l]^v%^jPSES^ U4jϫ8V;*:Ow.T"begMYD{Z4̥$zh|u#'@D|XwǶU.>zZeCcDT@geMMzIfB#k1]M+&=wQE HrxnM[*FFyMJ{#@EMf.%i PVV䐋M=Pi=9bDRܱaT =xHUx+ mhkW pTu5)PH{uīPTUݮ4pBPh;n{;ssE^x)qrO q~.QW08[]apADVAiÈ)3*E!-σƩ a)FZq^c d-TPM#ޕ+^4==-RG pQD?3? 4lVRyaSU4NeeiH ^g8qfx̰KoYswO-W*oUmwQ%v~}̳JGzuTE$ՐAnoA>B4(q'WWs_WtJq:ⶕJ{~㏯D9;~'ra61 O.ц\\s${W\TP+Rĥ2ʡRDRK4!*+*NVS ,JJͽ*㙁[hO!zߟl᫡\s@ld0 HOM]xU GΥMp x40`Dm~0X ._`m"œ$xT8$Ck gE&2ztg})Rz/.]kc$sZ[)̝q߽4߄O`@~줼 ‹ 2=;/8rzBh>\bpURQ q ykvT1ݎRL~bJ}*\u"YRwU'bRhuSEW+Bϼ*nU\8dx8C'sm <"PK:p(JN87t ^Yi ~^faf&)6?!2Uo!/)bXT%,siܹݻ?f<ܤK|y+4^ųg샖Z)e*OX W TGVU CLFiqcƅRE"t4f%XaD\`#HSBT[VÔޅ` <3* W$T<{ٲ!~u3p]JCL8*)fߺ^[=@)bJ#*;E)G#}- 7|~EY- oR*` > DR'|I~CwRF[knW$L@:;rbc[8}rO @Jg|TX;pQEEnS{cwfT5Ұ%;f->*͖on6Mdr*}d`EB [/@hׅC|RBw1{B 1+M쬋Tsw|qA-$ x fU>U4:tTw쫮kM[*\<,Ꭵ5U4n3X~C$ϪÊMQ\xWClS፧ >C-*axɏ'Jp6 ^l>UPX̘M. A4{>%kdboU+V4~4Mt據Mxe6eq}OR%6{Y_+hvvM/Sj[fƱQʮzJ{<2.htWdGIh>8).,:9'WP ˞M2 ,"i9[J UX㟪T\pwԌ"u:*BfƪmX~=5NUEypg6J=O3K{*.BOTB6fQS_կ>#0w8;nX}&#" hN2lF"`ID3bј6% hQ,/Z.ZʃUԮ|RE4_:= v\)-JŴ4dLB)&Ds&??0܄~ӎ_ƆdNSRPY1ֽo~.'+􊤰Iv@nd@5}S sL(TQ)E$L9X@EYgZFQ[n{I*47NӀϻ*ob SE1ǓPعbwVSEUdqm>U`68ɷUTtx7*09u$C.'F@FTA?!y]9W?ūni ,vٳ޸HCG!w2,Y(5Up…\3 <pmUhy֚gYe_kp$ *TML E e T:hd=8!{(,(wTT)'REE#:>A|ylNrOGRɯ*\t"] OyE먋$i%l@HmHAW)(}ܯ@-:ev+SM0eUn*²8 dyf^MUēSdl_1J}558+KTQ_.gq_j"Š;*Bkb41b΢F'FMrU#7k+h3b;l[Sp1&J]ևO%Ur2bi"otƓݲxwR#0ޚIٴY7>Ο8E8/봽^-Ȱ_%@hUQ7B(J̌]]Qa' x 4~>v܈*9ZRQNmU;G6rnwfaQPFTV6tNtٴKm"}Do;G;1BVert1CXvBzv赌, ux]*9B̷D|[@83%#>0T}QA8A_z#pH},@ 깶^P#'ՎJf|rEFUlzh_C3ES51ţZ Z#B /㋋.?nFX'8Ti0kMz;!+ cdNH9M;_02ڟůP "|f`1Td8` _a߄(BTxo_p-eLv_~p TAwU/-TIj@1P\VW Xbo~ATq;SEVYumնSeHcP@qi^CDlX J,EA"&RߖE¥'݇thï1ŔAx$`EIgP@{*;ju4F kt%hh&6 P#VZ'l0<, (Z sTf ӾOCJ`R!Xel}k_D*&e,I,Jj/r}ԟqڶ>ʼJ@,M'!0^_cAOT(@ȝΙ~ײ)/UŃ*{E>-SyVjO͘X .dJm?:m@h-NQ_2OR@P]KAډvJKBq2.s`q`7 TLNb%l`R\R.+ 0+rY)U[ڦ,,tIz&_./.>$)r@4U[3HJ󼡄>t P\0F12.EG베KT>7tp 5? U|d|%ǡQvA9CS(KjP}#, @xor f+w}pXV{JĨSX]A-H4L ƓK~ݻb쓎.?D-*n i '`|>%x+K$A"X:**+O2aQ -/[؍aWv'`Gu#tR>@ A@ۗ*=L6a•?ȼ뚩>E5њۂ* Pq=_S6CBgTcGv5UlpXsS7eBx(?p Qr[F3[f~FE }CM#laI|7\<{V).fw8N/Tr+jh|Ih548ŗ^ڷ|ҥ%T7Q$K Ogȋ\jڡQhjٍMS2ݒQ|i2l:Mooɲ9h`7s #.=XX|g}ӧ);qAbfzI)O .\2}AkCvVFfg)(#ujQ*L"B(3Gm=l֜G9H>z!b bg9IoMS<+QY؀tth̐$ iFrǤ\LþO4·+>46 !{#B!W{{PGw?@{9/.I:L΀_Zd<=y܏x 4<)gVZ•SQMPW AC) -CK]RDod4g\Z@]<\xQ(} 1p*!a18qt'0ۍ|#K_Q }} = +TiYocp;R1wȖbvT HD^SEbpb{=7*C*nUڇ*.Tb_uCP`]W>,lM4],ïl8>uⵤcVJRoTܪ٨8UoQ[x?tӟ~;}ZBi޳ T~M)Й6 2c+*8Z/O˾J)֕}y6RBـ_6[;^Ѹ|wݷEQVWh:Ili!SBBWA?*18P5UP6 #J3σ*p0φ vu(, =}[jE:]ʉᲛMB> H@Z+ H9h ,X@jP-:>8[\[ j'cޑ"]K}8.][(wKU]GiO3R ўpK$ԟ7[dzvhݒ2Xd$T! T0IBHP0;tQQ ] ٸ'YU4F VQEN(I,Fꀬv_5 }X)^ҼUwmGJ|o>eHa$~MMJb-|R쉸v֋mLX+REc+S?A-U\TTqtQEcK[]8NMow[S-PʓJë'HUi(F'kJKpk[*ۓ*2]~['E-PSŖPŷimOthPd7*FJ"5S|'IrXTqӸaT#id67bIn;łz`Px|XW#a! PzTk$0ڟC uY-Ҩm@A謁lN:rdj O5<1Dvs?(#>B 1j*kT]ss/Z }ҤcߓrYjiIB.CUPEZr9 ڟZP.G(TFڲc*(F^A-5_0F w84GՒPIG/k!1ù>3N+\T Ͻ#8p̃[ W&?pm?`b"#R# |HB '+;BP̙=9mz.h@ nn- q# E0T1=ZtwtJL  7nh<ï\ 7*@EnQ ͧ2ҳ:2dr.$;Ǝ :MOE`ҐsQw05'ܿzE1;mY>,uxJƣL@%kq4*̲XJɹ2U FˈmM o?ZT1?Pm?*)^S߼MbB++ܡw{Ś*nUd{*d϶5H0 Q^ mRX&/5eof KT!J$Pυllķ0]Sͦ= s9O* Y#L* bF8RVD {:/w=3g_,8.O~U4coE88Yd}+e<͠N>~6-,={s(|U\kɰQ~"iTUV?#89;5aHsB%U؆\u2QXTR<<$P ʯ*j7]1sLe.zB 7 -[8dNBw l ר9u)&BJ'G H|+1>M1#/R- o;l1KVtrL'%7GHˁ>gg/%30Cr Ij{K)g~֡*lL >D\>>"^@`$[HB?SOĴ?K&O;t=;r?P  &ѷBcR&X滸>*{ +Slh|n(T7%ˊ?&nS|`Ec[Q뻚*۟*Zg?pa^T3*/XظN./NMu:~Nj \\3[O4c!,VfNlp!@ !6mR8:'.fh \?{v~O2ïyvTFirȚhcH"ߦ&_аatevBLJ`.ڞB/l/[y5RP\ 8 8E[I!-ﳒ*-f`r/.C 1UFDI a7$0hȮ.B1hge ĉ%jDŽ`QN)ݮkZ; Z |PD>sEl42j`*J?[3Aw ]jR ZY9*|ĹgZ(""Vex9*FȪ_clܳOǯ{KM% Tx?`')TA}[QE-n W5UDFvPEۛ*șGA7*^|_|*LD.Sہ*Z+soU '.]=d*cK_әbXf7PVI#*7"TJU- C@n$n+Q#QbC ^j &fBv*/e&>%~СيcKwP KȦPE?dSTQ 8A.DKKpΖib K#mSMmcǤKybT?dj삍MZ׫C,Q s7 6s@ԧ8E麱.gΜl~qqfFĆ|-[ p·3䱃WㅷˣxJ_r66Q}=Rvrzk7ƇZ*hz.J|ە+s۷sR&׆<"  Ol!T aguU(#eO?tC٘)!O($JSp(XzgZ^V^vܹ?w 6Okg/ŃM>aGsbFxeIXM1#n>!i̾T?YfvU|C5UaT\nwP' DŇBgݩk'?-o U&PAռ[E;nN* a(ZY򜅲4%WS;v֎;6; 8c/E"$pR:@zHB7hdzy⒒e@_B;@P82nRC{Թ\z'aP DbJ3+H#,EB(Pl,pۦvc8 gqfasVTm0Eae@( m4-@Lc L..dcۼzj:aV;ioUPhdQ T݅:\ do3C r ொ=qyI.#̴Zź]8kX)ņ-b$޺0og䪇6XdW3Wp'K~9t }K,?DwaS<alkg^~g?կq 47K #x$/|cJF[TAu.3-q9UR*R L2֡ ,Ma,V_[oZ`Pe G7J7vnJW Ŧ͊›Cih(Ոq=PjJTAfmĥiE IDAT)VvاCtc0 R/0+5UlU,ۙ*ƾ~ILgB`hXT!7۪Qň`3UYTzU\XI۾iʿvg=yN&tcH =XA=Mr]0š^=UTncDyfgA-(+ƲfȒ᪴W]W z TŬ#~U$N0mF"2ω UdyF*wЭ'[Eq"cQm${X%j]ZR{BU]W:ʇex pu1U)x w tX0{iIk SDW2<:8A/έQn}rd^g ^y%DOB"(oGZ@V!<؞=={w5:$Elۜōƈj}*:ۯޣ34WNW>d%NP<AB`NBɡ[匄O<gb>ɋA5X]'Iûm%2]e"C %сfٚ犞 J +0/n D¸T.j_UjeiT)TqtƏly8,ztMw U Uyv8PqB*~YAH Қ*nUxXUM3"~i7*Xn,:ِ {5Et~X^~w׫ 3 UI<͋@,+VCf56ЬX(hjSU\ 7F }#>t=U'P! [57H)SD\S7 zhe2RuE}=ԴBR T)n]f[Xwp8 #pYE% 9 I44J J τ*0> ]Lg\^^\#st][ï CTXn~<W KK3$jɚ;$t7S))qtTN8wݨN҅6tPŝ}Y]#hkW@'k2ԠY>DntggO9CތT }1׎ʺ8[e?@6ޜ4i"O`Punvh3v`cq=99|_ܻ!WRcfE^^ץ biSISPW [B,b]^!"q=tgdk+g"to "e`cw=TqП13.$c8l|MC`6*88o:;*?8z!Uq&飋 TXp*bQdDjTA#ۇ*PIߤ7*` TH{F1?|nyEY'DhƛWXS.=7ub!<Ptͬ|uIq1ai|VcVX@bxXC(eބ*XpnRpruXB P&cw дmmmܹv[->=N'K񰋘HmZ z,3ٹ4BDTeη#DSNNO* DۋJF[@HTITȶ Κ1@8,OA..2FO8d)v۟!B[-K#]15G J@ABld]x|1/4񦐉ۉn,>Sbk~ Afffg9U)3 e0Z-9ڃi)r$o ;]rXy}Upֽ:|_9׎jHiX;{` J׻غ#yɣ1Z^ HhFu.Nc.a qT1FB&%-->}ĉi.b)bB4͜Ŋ8'bo#PE/=;Ry d%O1) [M *m{=9rJ;VRAys-(_Uwhil@6Ҕ^*ڇy{{Md]*eTPE@c;A_/U|ӝ7J⵼[SŦQNJ nSWkéO{nh=*a3btÊ{Jo8+b+PEVVo8qxU- J4A/ٟv=x^5e|vfnYVuGD Cc#civd'b$͸\Re+ |,K -9Y:6Yv:whVtLŸHB:KS/r-[EbjV}@s𼫤(q2ioH"΍ TkI,]S;M.^tQ\ȟXsdت$AEheNϸOLbffر)Q,Ɇ*dkg&!Ԭ,B?aۦW<9/Tϻ(X]._>{V juE":.Ky/;OgT= CRKf=Z`r*Zspͻ Rhg qCW#$; dǏNg5Kh.zޚQFRH f* ~HYfgm੫*}hjDޚ 3TӞ7~@~,|0Ot"o7RM,V+}o㭪]".XnѾ 2٩I <^̈}5#X Hm$ڨoN2TAEMjAͮJc 5ѻjb ہ*<䎖:_/w}tBS+=fSEWM&Aľ}_g|2$h >V!X3)a1HZD;`M[c/얖m6kD u䥽Wtl)"U;3 TT9.Tś4+lTQ*j1'ɼ@fq6TcCݦ 4Fx.UQ@¨.@#(jRMSIC RCp(:r.6GFUp[/8GIW0 Ξ][`A2qdg. +;'~iq ̓T % O}q[JpܹcG]'2wvvnnqyi*6a(l`lu}tGǎ+An\.LŅg"E  R'u60#E[Ixǣf+ȃJmSCs`oa_^[<ר;€ RNFx^5%[tݐ4GUԤI6>.IVH[ZYVvgTaL#0JAV]#4z3g]/ܹsmͯtR/ Ҹ:43h<\[5uꎅ8^EZ/Qz`)ߺ?wnzZZd}?N~*렊S$Upcߡ*nU4}0RTk(Z*j(QEBwaVVwjb=@M b.n9UN7!v7'W~dNq#m($ 8 {~_Ogf-nk6E|)5D*TpB*Jq/uj͇I2bCuTԭm!^`[3 Τ([_ᄑ{Ǔln{_|?}萄YHn)">4#/ n~LSU qhs@fh&(dyt@/gjPC'@rȀnh%B0nvxS %4^1UetOu rBS Q#lŽh51 eZhJ]/UfVjX&xeinVXQX08ceD%NPl԰Jd3̬N UWHr(l#A{uQ;I G5]SfPB*jb}NՁ-CVeQjT}m'2TQ)S"uRHz3uPpzz_yiL@o[Hz7Eh1@j[f4?D-COHR9y.BmT }mT)44VYS㰢xBevڙh~vzT!Q*8dVGq®ynݺTq,`XjTA**qۀ*tݯ.3;wZ5tD GN*BD JOi#- 3 SPCC:57'wUr܇0ڞt'ߧ/?=rizzvvbVCCfp EH9kSԔT+Z IDATZg| G#U+T0*OBVhט*͚HgĮrXͧr5A31UX@Rp5YdRt׼ pǶLb)g 9SXJUR%TcY:iQ]%S-U {7N~S…|ѻ[VKpB .aILΉ+33/LGssbNՔݣv$ٳl8QfbyE-˕ÀIhhOw ".+ؘ^O>m.FVG)S2Zp&EY&u^C\rkXYz5K8kU]nPEEYfw&ޚI_ 4zzYz"a9&_Yqm@iٹATuAi*m2*^kg[3"HEMDb܀w'q/捚*nUjW5UT>U|A3+n5U~ÇaM**sd˷*ڇWETGhV6&GNBebV@AaOeRS.[_Ѕ~?VFך3CΓ)$qno’je/K&3+Jjo<])*(k4RG.kk*hGFߐ*tͱҎf 53#+hN൫ ,u`rIPO+`CEKi4tR)4>'W6"2) :e\"zMc Z*r4fVFbc3)^C弰%^}!i-1_'V>~ꔋu-+4;+ W;<M.-"bSlhnEˠe v`PgYAT1<*I3;KWLK=لP;K3lVVU}BOε{`xvr>xcǎi֙9T{p5ʇBxTArRn Ta=*  Mѧ72A͋ `3 !s' xڔZ"0DaYn.;+vfU?yEmHh*ns@ܩo%UxZDW<&kضTB?J8Տ5UTg3?IXE>7tvn%Uv`/oPj0tin'/.xvU,EK+}!~ŝ[<#j`3f2L!w}8W}|ޚ>$ en|X!38gj9*5+v%?'wpt2P*KYqc4cb*O4k~q;Ta1L}&(9U)UYtE?Aj/Gl/ aCUn#RE| @#e ~jPm'8ˇ. 밡2 g K03ss~ʕq:}?㻾ze+Wq~T1vZ-2 -i :m91ӑxNO_t/h",z/9r9q|ovO^YX"ݢxRݢ#3u J.6fjM.Yr ^nOˉ>ҷtG}Ǐ;KŐ ãӸ{Pd^[TU^Tj:CBgxI,=5BJ)Tqy/tO #2.i)#}97@EO-1 A@( zp'T!ŭ⶧緈*N*γ5UTq TqSs*^zQ냚*jvt oUTAEzl @1ZE4Oxg"DBI`j=IU<4}%FM[qÄ4IT0 1l[ʗ/OY:i]Z:ԩs)BڄX/7G4ԲI'3w~^Ch,H%3c_&^ݴc OkhjXwW|8d0)8f;ʚEIJ`yw2n^L7SWQX'(cn`0bI]U׌8aW%[^utņu\En*f]K"ԑf6m^+ֳ?|<9}_Ö 88?3qx|LO:$LY"|rBrrScLht8R~ ]RdXLML5Ţ=ZQ)6v!qsxqmPncaUbO=RLFRDA2΄Ø╤B;\XG혇=8`_Qsf:0poܸqqQdb{h!Y,)X[\$@,&K,21ɬZpkq A` 9t4oY.1ɲ(_3RڟU65BX"4F(^?ŋ2#C~It@XePpT*mĚR(>]Xa4+C1R5@-Y3RbPR**>t@;H"wD^k~B~QV=`%%/cttBaM Uo/q-//6U1kO JZ"+ʫ̡fU}/28#.6$/GR5X.S; 5S%5|H;ۘ|Qnq$NsZM5ُ 4"LgXmM.-] F(שf}M?;z{[[[ /,e= \s)^ sRMP(Esze~nx㍛gxoxxav*WT)rPuhzGNjXUTկ0Q9ѤMG?J m.NJQ*nZJII^,ɴ"z|7N ]?tK#L+ک > yJs۶=tCC۠P4{rXy pg3*u. `BqWCg&5' H@JXs7ۖUޚr wXS{'B_6uE "ݴc9J)$=KP^o%k*V\aAEJS8?zTq󟜾Taj~qREJ*ܖARE?ifϔ*RTa]I'K^eR^RyREO/A7?}%B/g)UTq1TXq%†|P :Sn*$28qd86egϞaVש** -%U^ 7r;nZ;S` -T1;8Y'W§A gYb 燦^Piss68o_VOy]>`V}mRJr]юDPWާG?zͯw@1NHQ W-bek̹JREe#8ʡϠa$R" 4]J,p 6 4>+d؏ErB]*.m# _y'CCÞ4[Դe9BVTh6Oq U| `,ӧ{z^g6}yV$/?\}kPQw a eB-&R5E堊*RHQEӾ~~,U6*2K=XT8bq%GkyV6k+6V;U`O!|țż}II ym>=<@q`U*9x*[$&]j: L;d klYXX*x2–[.W ;qp_,ѓ7mMo0H KIbǨ"uY`Wm\(N4E]:C7/;tZ{Š2Gf9s!C8pS0s0zk\Ro߭c06y5xP?ʙ̴hJ[ԍh|F/ss]])ؾ}͚+_} _8v׭۹ȑ#ok `SY`;z@fvCہ]zi ?Io3*3r $ +ixaUU t87Wf+ɧLFKlgUbܚD Tc5) +;1*T]Uxt!' +C~i9N/k;M) f7V)8zV#\v~ tGrkFFvvnsHl޻ZzhP,pTȷ 'yKSƨB]/#UX'vTRS[Ao>88= !IP:2B l VJ~*||S DfCy;'h@A(:?G8Y2*H8h ,6n~uwf(E_Je:|.WTF(!aH+V] WaRp G,+j!ܑdY>?+X(tt.{ܧF>r#+Bɐ]ԔP- 'gB .A@8bd4oKss3hbz1 8}ze˖_\v۶ի?o|m[rݺu[vE29[cM-^p'\!92VHֲ25!f{6uSvtb$ǒWp_PXW0TᇳZ/JV1u IDAT,5%u;Y*,Vw8f{wLG:gT}/0*r4Y8 J#L쌫IRэQNELkÚHNSH$ԠZR"*zwUlpI)UTqqPoTQdMc)UTqg=SE;iNMTT!i[^ *ygP{A$UQKQpԍW‰n\N^o-JEy5h"BהzDGODo Z˷TOf!ƪsA#ȩ0 _Cjzf־ƍF;'J,6Ycӈe ^ #љ6N)U L7'gqTPEhIOH'E^x *((aܜqg Y8C [$KVM$'!WLHNo?q54ΑR_o|&uy{` ^ {饳g7o޳gϋ/Y}?\mɂU,6DpЍF\0@ ,UЦ!œ&iHGN,CF>H>"ӯt_8a2ʼYU+@q1E*k*r~X[TQ[*UؖREJK )?K!U4oKK*RT#uR +dT!W1$dA_f 窆룔Py _J7P糙d*NSIe %s4 LJXx]G[aKo}i_د8iO:e.l񓮮9K*89h Y0j#ss1kб(w aeQҥ(8"Lkc5**[R*RHx`E|ـ*z1XŖKF/q&*.7U튛.U߉OV<ClngfGɭ[,BK6ۭRŌ>-KRE;lM9(SiIهjdRLd`[PnVٚ ^)F)H<}]*j~ xO.U:w(*UKO зʗ*S6tIe W'bų3XmnJ:V#dP鉉Z4&KR].sv;7]Fq|PBR-Z|ҕ=>~54z]N1R%w輕.Mg/-K*VF6NZ7{)'N=Kvy(ԬJb h3Bju$k8q`ܣ 9_SOJ)1n*T=Ĩ"ELͭR!*8vdڹEsEl 4t 96a̻Je_䞄WkK2Z@7n%L^ Uq)U\TB\Ut 5SHOQ޽?G{TqіU42Rť뫞F+ ' ScKWUژ&-S{5ڼl[Fǩ/'T7v%M̈&ǎWE| Q`n߾yew.*tL[3(El&A3+mV.Jƌ?(_>Te$Y`PٟHyy'uxQCDhKB̙Ewt0Wl2JFo4@lh֨?-b92[4Tj*J!4ia//^y LN5~{6tw 7b1u,'QdB>~s ƻUb {`'@i&$uƑ*ަx'| =xz8tӜ0MRSzy?={֮3+Fץ:%/4Y)3~fLrt1 f~s;4t[qoJ[=Zc^/8.*]PHn9r9%Y>##5s" b\b[yjPԃV2T* 3tH hmxRܨszB\N\q+䆋GNbRw_yWTRŅQcf[_;TѰ Tˏ_ U VJTq)HϽgSPEf5bP=ةE{*X,VĔT;oRE^GB;Ta/*d8jrpǰ,aƛW㡅BM͖-b _]NQQ %4T}#Ƒl+NZ0,J *"'T<Ì2+&;2R{%U]< w!Ov[&y{\v($Sً֬bM8Tr]fu:b)O!9+)$iC:G ,Z7݉U7o2BX|!a`iej4SRWW[;~w^_{O?7=?챧zm>uj]9|WK]]w4!ss8y{l Q( &b9}޽U݉|.TirN}U|V홋7bH9--]]|-7±>rPkTẤOt VZf)'scV+%>W}vAGrCZ֐YGQ{',.17A m1-cm( r|U e"u9W?mm#E$Rќ$J>,TDp–DMrJ*yȖU|>b UuUvH" ~>w5{~*&HRREu}m)UDR8~Rj*RHBU[X\g1XLQExK>*.U||mUNI5{U|wF*nHR]\^ĝ)UD bj;)yPEY 7sUv ,sKE#Ta) n^Ŵ4oɋ-xnޚ!+qD_dGscLq,|W@;%UF&Y`#VmIGZIƣyқ 䬢:rkaq~y[G^w6JӮIBLۿs'xӧq< QJM+Ewؘ^w@;5&_Dt*" >NI< !rL,(CjgXCWքgG7FO P9>h6g龾YD~uך5/'N|S{֭SSw{Wg [no^}u5kVܸq߭yZ;08hn^\DNV0 3p<.mQxjGwpnZ7 (f ã H(#r0Z'gºD[_>|+G'24ci58ns@96(%$p$,, lTaotFB7ߊ^e2IhYUӑ \y.Sd\X@r<0 hS!½&^WNUQxT1:#Ο*J=jEo _0S)t&pYT]JUm0l?wTүSHb'=IW?7Ⱦ[A?B+)U\Rh5;rUT*7[HJ!Ud UL`T "y W/m(PgU儖|TFuW_^+rNnߨ*Lj!*L*^;Cj^.IH۟p m۶q#$T+8\q.U$Yaq,k{I`$Hx1F5QIF*O(C#o~פ;at5 ύ)[ Ż1}t\♐vx:n0cH۞rD(8ut&ZD&DсojooiA*j{<ٳ_[OC?{~W|C /tM<8;{tM44tw?{y T4T/1<21.FKqD顇Pb'xd^3R*0.zh``x Zo$L̟ Q.L Ն.e2g|hngG! f µ"2e&9]bvl U;1!K5v=M5J07!jrA!%A-b rKg‹Tq);"TwTRE(3B#_=j%eRD~,1t@*:+b] ׌)7`%&V&R3 _zge-b¤Ď*KyTt`vN^H@A/a1{zp|pBoUomAɃ83$CpC"Hf(Y(ս0޴Ti.z|dz~:O9 mm}}XxǫPL5[ۊVl*X!&H јk 9tԚ$ąL5^L{FH 6Ȧ3oCwQT!X<2ڼ 'IAOE8iP-[Hj/ Q/crJh-Z gBgzZh7e tϼړa&Ԝ4MF}8qcTQ}՛6奈([=@̏*h$M6GUfBg=*ٔ*1U|=x(No;/U4Z(Tqɩ6N癔*Ta#D8_p 5! ҡVNl*9#Q ~5_/<9A2%J̫~$y\K%!3 T8^fcΈ+Z2HefMKp++&C*X9@bRtd'OPU'Nw UwӪN!@ !P@ND >H<}N% _٬>.R-vĤ S>%O_x~?L(s(_ CX2E MA Dڑ T(QqK8 sֳؾf[xLh"E@꺘iČxPrfz*YM_$14 1Ί+X1"E/'RtU[Qۄ]YU^X8x[ڿ\XXN>yH`b=bo1QLI#!#9芪vv_4-<*1|y>a6/Q*:MEPȢ /Lfg6_f3] lVYi*jt~gGs﫱-2cT4Ul*Kjct,ߌ"ؒEKPEMN%.zw떭QJoo=NP%>Nzt`y"kS&S"y L.0$BEpgW6EӔ{˝UoyqZHO=YAჲYt=qY[>\c6o;1}?_oy(z,U\ޥ+IL>dUJDM͗9RS l LKvGLankb dS=hg* FpxO7&'W7o>{!]T{ny IDATnyժ/k 6 45+p0,; a`ҫ~s:OU T ĠacO=~6~|.w˲SM<-L݅ETWT;dqȳ6 JĊSגnk8"T!ꊪ_IBpEk+],FG{zkj{L?GV~v5<҆ s<&ػC*U47VVt0;7+V+^:cТ1"p,ښ8iIP<δLJh 4'&::jZ# b8o8K%.9J2ß(7տT:)Upڕg j8j}HJj041rXR4>oH3-倱%6LqxKh,؁6{vEFe>JjlClj@$9 QSyl&t}N~ڜ5fejjw)N~Z@vK 545S| MΐRuF&PIZ*M*cU1*fo1)U#Yߔ?ͻ޽_g͗nm8R%D 8U@ޔ*rna>4U 4+SOTUUc9#KU=*$34oSalIP=+]B΃*.M;I/hMN4ԟt`%(5K⫵-5:cOt;a,<@LUN֛(sR1~rhi|4Te]fr[IѡWKN)d7տS-nV,xvx] xl)]x>w 7g۶u|XE`AK,K6FNsMSHO4>RUM<_)sOU3}y b1BqH2uzz077< #Gv\'NUX{J%Utv1["T.gSG&Qū"T1c"wHO|Go³Mv*>;QJQa(UuJsPENd(Ng-TC.9/L+%ć6KbE#q2U1{G>o>OCN3ElIkuQ{#TJ*.vKdʫĦf<] +~+:,Buv11Ǔ |-V(OJ:n+N޷ol۶iC׬뮁ӧA‚9|nNxذkUzXXP`qr p*e˕"<HKM$pؼ ]1b,!@uЫlS.Ś-[֬yَ~kT53!Ƭ#Y2jd`5;Hw^JR_mxh0v+|d/Kb"++iP dޚL-Q_ X͵?j5L@l%%. +!!.]R ֍F.C]D"G ݭ #:ES݃S(u Le;~$_;.i6X%%z/rW_LO($4N36%m,KhnSp՟AunCę$I}#9zH5x،nk8>"Rhm(i+>x2V0"b}+H%*ihN=_ I;yW>{曟}n/m\Su)(WG@c 8v) pWؾOL\+}Ń`GnL#%qЄ.;tpkh* ׏vwOVˑ#[U˩S?_|?1>w$NC,$dZ@f +< wZv유B1#Poʚ%&` BA cMicǎ{_ցu]?|g047̱cXG!TidjmڊA4VUkfnn۶͛kkkkyQD1Z t[(,.VT!k'9s~:#WyD˅JW~N|b~ܿo(uvKOxrиgnQvG ~dyV;駓dn\ƒC 1 'l&dE3/2{7s.jw ',%ݤ>N'}^f$tQLkuEn@"#&)RRcw%P8RxcrT:"HJPE{wfR 1I\Q*gzV6$@k'HeS̼l*;sFf1a{% AT! 16ţ ȃ`ݭ5ƽz KhS Y*䠹H*dUtUHNb"lȉ#7lٲ~>vmwy-:5>n8S) MjzX*HHiS8Rڬtja%)rk ߠǎY] \n:Rnn^\Dlh__WWKK&'۾}rr˖+W馝RWdJKKw _*YOV)q:w6TƐ_<С5clKCehPz*i&IJtg $6ꖹyƙB_W\y ?i~} Y^ =aBe䬂W,Y\H}Q:B;3xY;zB%NG &ΐfաG}6~o;^-y5Ip6%~hG?ֲzQ)RW{myQlT-8 ~ =Jli]s\TY#Udׂ* e|J>USuHJU6K@͊wU|؟Rŕ2SN߶ou2Zm~;8$?=ޣci9眷=?(_3}!YP SMLYONܫ5;{ǎmذgϞ+_ $Vdg$2 -,"JۢwfU+$ѕf@6-f(6uupIjNnrQ"{{a7 qHPc 2{w{{&'om6l8X---]8K=={ttq(]XYY(guRTa+Vl b W~J2U4UILJ)Ux"Ɋ,Utvn2ٻ1hF)\Ty'fD(S&c2RE*HXKE˗mjhۣXA2٫9y|7> tmI֟^OwΧ,1 Yp3Cthn~+cmQ+Q="'"|@nM1< S@rͳ55@no!cqL G->CCbϘSPD5-9&8DXHМ:dzdHyӇ:8V?du>yTW)8.kB7)E+QG~6Bg؟ /ƆyV;/MbtaSzv1bšT(7=_% P.F |:%jٯ8Ǭwj*Z/M⺧SV׎O 3",>|Y7* Tخ;>^H"w*mWPBt7яڎ%]zι9'V˜t^FS^(UJ%Bω)*xF["qa6PE $&Jw>G=z菾3<{2J' Ws*t3`΄^;א*4"ە2ܗR|c4eddciYҝ[ˑb:٘_/V>HD\;O %9>TP ;yG+4%iJq<C Vy>jfSSO\3Oڴ}}}YŒEQ!O%S l6>c;vLqE/Bh!ni@)lؘx"*̟痑ެv~H6 -&gB!J0/*t=Mպ/4y度n:dzvZe'N?*)ey8?BN5Y&UoF["0w*Mi\ 0qZ[=oVWy A$|ѣSS l_{,cڅr=A&ʪoMANOzT!p\TqS87>[{*bT).T_Ů*U캳REJW*)˾iR{KPEy9OmuVbfur;lŌ4Wx=N*cfsYʼrT٠YPE6<3֜H} W IDAT\zuu|m8s:n6 nKSW[j} O>D+oLbREtXIAJHgTa^1߮%ujSTZnjjYS,Jਊ1qLth0#Nh 6=ZgCcxMkDhqx-llD"b"fcc 1 `c֮pTbcI*6aěsQ-n['s|@0Ԙ]?MK´0x8wV>qz8tgQt3}BYy$ їu|Ud?\HPgC xal)g ~L Q.]I*ѱrXZ$OFǺVOj" g祜AC Ì2TUJoPس0hT֒;`uGxs@wĥir0g+gcTeӵml g`8.u_Qo4M(S?XӼ8ԸeB2ҟTq=SEc'A_Dݚf)d_?-X$)UT~dL}S]RHRpɀͥ͞*Dk T6u]1"$@USc M뻉L䪻ԩ͛GGGɳ?p;ͣG5pbHkC8O^|Կ{WՎ1t)xBG5tf_"EVUYt=b5^w*C0 P3_Rit\H~JmQ+Jx掲=y-q}%j,3vzFt{S f22Ww[+o<R +U[}-ከ8E 񟤮"RT>d f]f``A֛͝X߇Ŧr12T^' (stK~\RRxM}F<H"GrRń/ *)UTq5P]P)UTq#OtT1/='U4|SuĊ+f7\-"%P TaO9G*JU IГC0j'zUS¢WQgyŦ{DNvp[ğGElQ!y5#[cn2< B:2qA灘cX笌}5k}+E"`"|=bLVfPj-<$1jߎ&U(9ycVTa38q ^zREBE2Œ˜R>ȰN>Yqxm-d[gOS3a+{:GGٌ?x.Hqpj5!kr'>1C4 1Bqä憁C8Wr&'MOOn6˽b]9]nhЌSn ʌc "JFFBC_sR(fLu(3Qtdsj.˳g7mZϻ3+̂勢L&Vaѱ@7ӒŽ^Fq× G}v{X@J{&mFɃ Bѷyb, #+?}3<"u>UŠ܃jzI"5*~[Q9f}IL"w*}J]@7TREJQU{/̚ݽ힪W!L͉|ϦC/Q56 q>P܂-nc}S& UR7\^KL'8[Kcm?$DۋmRɂ7oC1_ȌS%yH2#]$?.(BGFa]>WmStLǎĐ5VѤa%:n37=a{9bIBCz}9ĉ' A|m|Қ}͍xiJcl~&y&!Qɨ!%57xИ`rb Uszc 䏅V$/ 3bA~͎]v83AxCkatծ|/=0j˫`dj/UV%,SzgL8Hm |M<0SH"Uˌ<C Vv?4u E2IvVdyέ <@nVB?O/,~V6ldQEkD Ȳ=~J$5ĺ5sWa욛o|`ƱϏA3<)3f; }! u"nP߰ ^--%jR9:UTdCȗwbERΔ*Rx7}!UoUz5*U=,Ʃ"ғKPEF#fwW{AsS6x;ā6z>׵cTA}&G.8ۅ_*KUsbXpt_ fhToKz(V{GCIo%SKTtT UsS->o"Ǔ'OZ2L$ȓK+DqS[Q^36 8RR&d2fuim2srTY+*t*PTx*˕Hy h8 g'mmv>7 _R(\yTSSb_" T}aPoܐrOO/,46;ܻ޽w!X*!dVk\e!$3z% o EmhW#[ɩUR1p$CQgbFFj`#bvWQ@naZ UX_'ATN*jyn!Hsp3f8Q ӟ?.mhz*?z"VU SSz06Xqﱜ5eAE~kݤb.Q Hc)\/3?V*$qUU*ru@eSEstX}J)UTQà;;q( bEJ)U\e)@ʊWbPTEWw7bLjqr^5t ^Izz9{9STX'¯A[IBAI }&<'*A\et;ZY֓˨3PoMXf7wv&VԟUhM\Okpz>W }v (:|u7vdSũ_dٌ`+* >9.r #J_Y6:he}>F0QH֙S&wJT]| w@ƋR;0TBM;PZ4<6vSFd~MMF7H+C8?8<y]MQ9>#>5B H0*:l`୉{AijF=0oM9~*꛴X?=j|P,"Z,pI&# !!(&~S QP؞y@m o57wwoӘF 88`i `<G4iC&9w}x#^cm&"J>$48RR? bĄ J4v-fсUYbTTsjF=]dz UȈ$kxkf8RU˜r-&$@4z"W*LXtW-)g)@bId2zAj;;J4tΊkbEHai&ƧNPgacMO?PYEHjw%][їT(NR9Z*H2UW3"T'hfJq+IXB*89{H?/ͦTMBG ULN,Gs@;J"K[7!Ul4GD⦣^]D%_gH>ޤ j2bF:=5I=5|F"A@ ̈?%$̈辄ף#RObLveg.]58 qCPTwEMl ,t\SɓYxa>u^-/<9a6)L˂TTT LQeji&"Td#) Wԟb:1)IcE*O CEh{Ì"T!^x&ޖͦT~鼠B11uVRH=AU9m͜򩉔*RT C_ B0}> jySH=L#魖*R 8:)UTnPEcl=?-f{h"*.'U<C+~#CqoT{8"KS`ګ* TPY=$& =]c\UHiPB 3Wr_ ߦthe<]yN.n`zoaR-u_H o"/M?p5`XA^X._ XY+I % k!/ TqƊE{RcMy #(Dj y6TT0ׄe_Ņa2=ML*BY,A̬x4G+KG4OO@w ꣹ڻޜ` / sGcp{}( <88?/f)s'ZF* Q#S"P[ .[y}La-5x8h"dԛfЭ6w.x:PU &)@=_GpAjD U>f 8~u!N֋Au8eS,vvRxIA66Qk#Tv-[ %3-rUfm:_fA77m̊XZ'q2?zɛfS)#'WG98oBR+_CP9j "129YKFID$#q$k;")U(?uTdLS%[YV TRŻKo:8ozܴj!*.#U}: XXT?/WUP>UVҚ05RS#*K yv}T!DDžs]IT!)$ ?gÉi,vX{8?O>[RoW;;ۍ˦s.xH` lFމkZUK0< olNHTnH^¾TA}dB)H,ؿ$"RUPp'\VӋuo65h hv-6/ё9 K|>$@@BP2H=LDFElO@*Fd&46 /``? 7<}hґκ tzri] IDAT:0rZ]~1-E^(,a=X7@OW97ùsƶff'RD(5=EOf_JV5>prk Q@r9Y5? LaܘsŬ&B5fpUGC^p$ow-pA&ܙj߀% AIYRbGb466P֏>X( dyҥGd@`R+W];pʕN'@/t@ޅ$ 51l# K)۔s̚Gh c!K%PR5GYtŚa\5άz]/ޚ 8pnң "J**Bg8)ǮWE«]bAךAghʹQL2j`h b~.#knu\fLs")z֫ىأy-O =1|T.^>.h=F&Hx:*tX*ʻ*&7CB&U4⣡~cPʼnWA6Iw*V1Cpzj UpHJ6T}T bOmJ U$ʇ,ޜޞ*!mp~Ux$G$br&TNTxep6PEoV9狦vancj*7ZMDvacbr/jcCKBs<3iUėd0bCs;ZDS"TIb * DgׅL`Uf =k)+%Bt(|*ofO]T y9֌5Wu[YIt<4oP&7GY.-G7 fۢKq*DDA(Eb2( CQǦFwؒU|XQ czYiQZ5Ժ)i LtmD6ٓ4]1|ڎjJ©J>e$p)}*4B@+(y2:g  :"P\8Ȉ'ddީpÞ514Ȋ#Pg Gx=ff`p 66::4 3ċG?x8`'d+frSSȚoM}ɓo񇳑& $%W$)T4`F~(; !0/" `UEo2EHUSbQi옅5x0 [ķh&krϏ1m:a) $ "F] Q}p|6icl,T/f-S5!]Xϣj*k5:C!\N.yxPIQ%=֤ Psp+TQ}a&U4CoUdfVauoRE*>L(}2n*81fB. jV2WU! y0%}nVʪ}3GCfO; B UT 7ԊَT~ ML Q5{3MɭF}Km:D \ۀy{~:K8M!L*(h' ߰Q88 ٠һju/t+3S RlIt\\c"efՈ(%ISfskK; ƋSXib2b8?R *Jx"T:PCUc8E.6hc`D:½Ҳ>=4VGRX%zz }"HcewoF}zyfg^B&,ԑI"bU=(Z\Ei!j+\p/U⡸`>>wv-(98˩f2XogBmїSkf /nJ_G9#\V6]1%`pd3,Z)5تl"3^(b*xf*A1We8ZL--**Y}/pBZz0*H#21SR\ *5\9b,*,487>ѨlLF-^26 rTI*,g~ZeU\jRE*$Ul܏B/}|U pTѤ**?^e V\B审 Ť؂* Js&UNZk}(Gdl:{匉b8ڎ*U"fnmC [n{z X^-C5|aTߊ2 ԱTS7dJ@C{Ⲙ L;@<~@58|;J-ބ*D[XBPQeq )I H$hg :o=- y<(?2]r*z,NмHQ+99t-Ҥۗc0V= !5{)voQ,yoMM]Z^)ivH|OƃBA¯uiaaa UD$=UM`GlT5kbPxx[byPwEnRE*0Ul| I3'4IU{%PEkPE+TZ;*BhzK<]Ӡ)3CICdGߴ(sͧ[ѥ k A1ɖu$Cf06ۛMxz#=>y[\1PJ_ˆk/s?<$)33%ikٻS{vb2X_KvVv dMtڿ5+AWHeJis{b6xpcX ݺNJA5JeyyllpМzey$Am?fJ\SjJH޺##kk8U@5 (&K GX1pᡡƒ{:zU=XTԖ'% X_G*-ZCItO=Z?Yga`yc[Z8sdl"%Gucc}ޜGʊwJoή?ىz+!`RyGYEfj~UOO%Ͻo77A32A0˜ƶx!KT`K x5~jGa}sRyu-Ne9)C??eBl1UqX>l,Q]׶vǦ!67|]VOe)h"c D K}-+_}>xYqMحTQ PGWp{N&U4b+w7_Qř*>Y x&U4NSŃ cGN'~/TV[*M17CQRmbTpꘟ߳g޽uin6鬜Ĝim\q4:)U'j{ў&T ySg߈dΥ AoyQsLΚ ѐВ$p ē{ df#(aQ_Bm!CAW?]ƨ_y ?ApVXf&krh9]zj=Sl8*\QQnCX fHsrH Hyin[%˛#S<{RH xŘԮИZ M\>~%2rȊ|^&pSr.D &֔2`9 ̙/x cZV@*iIK HAHC #XIj 䤔Z*Q" 5M/7K }x˚?cT9:N ԯHX6TJ̉ZR{3-(jKBSj.*P#PisLռ4VRzMVD֥X5PEfMPTQK:jc&"uWv.YY~&7تRonsõ2221gO.:[ oP;$WJhހEA##Y 윏'3WݎZ" }]]>|q~'̪핹ħIPy0G3%Z3s7-U|s"bKDKso@|gZ_ hЁZ*3ĜY̷5GO:# !~w1IقQ 6zVFYx"Pvmmnnr<$46XIzl&T L"ę_/PKŭj?L+m+[:>; % ՊEƘ*XߑftdA>Y#^1'Y82+W1kד '~MJ P|*SG)F0?`ʧ@. 7DҲi|}!KoKb"š̅Nsq&&UT*ޣ2R TQlWkA5INM*::v ;DkO*F.7I*;- {d7X#b0'PW GDr-N͌񫧊EnOFѰ"wtZ8OesNv& `JZ>Y@s*մʅi[PEu/GytKYᔈ>WpE 5OtzLM(Fnؤ _RRE(͛7:y-IMTugXLbNREӠ7޸Ҥ&UȪ[>%ht'b =MФtr*nUKw*"hN֤&UxgÑ*N~REljM(6AVa631 Eonb]ݕHgC5sK>Ez"5 !|O d*RO 5w*r64t_lRE*So_T? }IM)([U/y(L<X=WܹTIUlHUH;tUc R/mrky`'OcSZБw*>LoވMrlF)S;Xpp'n:fތ)_Ct ]LsEL<8E#UgeY(D[=]|(DNŹ5#ЇI6 =7@'x/i]V]LF=CB4 jI ֭,Ur;㺔~lsEMk5_a , &Le-:DX?z8_ȋ_O~/~ѣOU8)4bE;-3vd ,./9+Q#a!-=z'~{fcG);K5D@ IDATO cCA# e_$@kPx%'qfKA U'RF(B@-B!ǰ~WI*T ;l28qXB)H߆p4q= 8EDy# *~Qac'Q)uA=+jd~g!UT~w8%J&AL'TyTAP TXU0Ih\9}KW 4;m; cbViB4bPųAkUJ[>{I2UdU߃*QgCA֤&U:Uy,ݺtREq9goٷ# 4Oqh#*Th8"{*5KDx{v!#e$WmsU{nRps̩T6 gz{ 86f>cWᡆUߜe^WyX_6%C%8?EDJhYaF9"kfSuYq{ngfس kn'ʽ$A@s4f [wee4`l 8>S.rP`39p%Ҁ]o狼|YS%)g`%ؚrS"CE=QSQjDIAؓR7NKO=_w|GXhSay 08S r*v U>sTJCr7FԤ&U̎\U Tw@/t(T1"TѤ[i?;!REsE"B䣥 qZ?GK Ej7ݱ:c8+xGR& + ɥ+HXk]4I슕h8̰R9&MbER'Ke?BIM &P''!du٤'/2JQ3f 7u4$834SZ4'HTi%80e48nϙ*ܢ *xJn&̣I`iK@5oeʔ˫ޕt2 Gk>Bûb@*hIߨ0l d:ydejSqVYzykQ]OwepiV Ȣ_KF|uohѢ X ,kk=;Sg|p*F?s n C`fH+d}Fg1Mi'b!Etu%1”8L"SR|N౼4&Z(=[oitI2Ą UZAFQ1*֏ڗ4IhHvOF2^fdr,W%sy*nPrw %Z%ӹm"LO^)\©M4HOE4^^~~ڵ<*\2֤U47Ѥi;*tjF= E>wn*JSdMhR Q4s?v|aQEPɓ'TѤ+F%wgzvU@VhXan6iɀ3, 57JP*А"\ۚWk T+ <Mew~>aQY,dM?yP= ;00I ׂs>t,u01~ ^U,ڒT'2rهɝ2";Aڸ2lw1qMtBQmΪ$U\4ZV1B,P-N\RnpPY9QS̒g~TB! a)ԙ1}sT@AJw.3PsO??w^@{ 1 [LBMC?i+ N =w=侁/2:HQj_~ rU8(( ``6,W1QD8_U=4&p8?dN4H&Ta>wKTejzG`92Ç/hC0(i H4)#X W `>=எUl1D}KG000`E:#~It`JY3E,ӌ!hJwleŚ!en2֩,fULʤ5e_FK4]Jhz9eT"MpSثB՚DttL#\3-+ Sd T}PCk̲{Q[ӕELɇv>Lo˧Nx0,e`3ʾd6V!E&U. 0]Mr}Oo*ޤ&U\7US< X& w*U,>8bG*TqTQ|[jU7;*iia0SkIf19 #=w^|Rz9mro**ToT$6fR3HIˀvY?MY]L!*x1L35ޙ>/DJ(SfW?\'zz)iYZr_8|εWgsP2.xXO醊p@,;`p76p2c@iPip-"wyѣwe`;o0W]3VQqΫc#9D9 /ٳUK(LzүҹJ9ũZàwbU(x'֨ *5s4= 67bbNU}PDPsEPEQADZ]]XXpP1@rB;IH| $s8T])`|k5ՒiX¼E=撍EIyniSS,7i3fTQpVOTK*J㭿.U W*Vߤ&U\7U;s}G;f_mA4I7Bߺ zQREi%è"u2i 297٩\CܭR깸;r,ͷR bǍ6h*\U'ޖ)ǫ,FȐJr. -ÐmB߮+i=@\*}ⱞE}V*Dɼ$d7QF-<dOS{\qV5t{k|~[|@Q(1B"4|43c={#.EՎFY5j^;.6&n(F;ϑN0cѱёu$K1g7t7BU?+Qi&flN:N]o//佂 p8y _75XT@V?<|ѣ_NDuǠS|]Cnޖ,!i b.:b)Qg.UBkdѠB}4;HgTU*8q{/qנRNX _^0$sZ54z>xBq@'t?%ʅ$CF$A>T݋OT1@[QobbB̓ %v @%P_v_$(B˃JSb0 `<&U I^>0dREpiItZ4I[RL }Ws U,ؤ&U\/U =wTSÊ ^(F7B;isyrTz&TQ(`EէzkOlevfqon*l` m♓*p\Omۑ /<5li;ߟ)|ܹh3hF:[UGĄ:\ٻcټ 56TvT> idinOӻZk-"%YKja-0Z@ΦOI/89l/A_dO FM!AR-+$Аg57}@ V!#UDBKp/)s# <#[f g7$| vv=:6$p_mɼAzŃr5\j,LbJIP Ξ`ؘV"1Y>j9eF4wX 1jDHyìrzK3+%kݚ' d6StlBL5a t 2Sgla2p)(;HyF$+b2ޚRZ.UDk/̕1ޘ 5)|w3(#.d"X{ CN |.).T4Aw6UL*.lJm34U6GIMؔ*'G1O#@GjRE**@Aun# i$f0Bn*p%,y踬)o* I v)c*{,7RŖsB^:"om8q"2y:BMo/rUƃ;v/~с K䬠;w]3# Fa%) syki ($rˌݙ-JwBNm݋ lKlԝ\റݑx1mmmmKKuT6881D7R3A(-selY&ms=Rх Ua||yyi Z!)LNj/İLU J &3GA:gN3/vfdXxK 2N<@ӀmkkkL`X760ssgvv鲃@ :I%-<|mm8wkkooI,;j`(8huyX= ̓GJM)@Ʊ55WTM9S?2T"DU&w ii~͕龔*"Kv鵨У̂,|z%,)$2?)gw|P沈3T|Orc/א0d glt7~ zқV8؄l (۸; N )j))I:]*@m~{pTCn0~I> MhR6TqC$SW}T2 8{MhRVfT85vU/\0GI[hV));XGF}A$JT'X^r˘#X}PZΰ~} P0QÁܻG[JUp{8fݛ+3%<}{5# >(wne }%8QVx0 V]MO9?j;%74|)~Q@b;zN CwoxB0aDi+%wBG!#:;j(Kf&ۚ6q" #nRfTG I6o-÷ۭ%8`jtN~,[UU`?%yt}1Ocfa !_oVmXpSY7N]ݣTTN)Y12P_&8i.//..SB*b詩91SossŹ7PLD[ ^\[߅vgf`hiYvY(]ǣ̲"p}u/0w+ޖFxUs~Gx U}.! j.,C)YQ4_IB If'\hUD)/3w%S%ijA? VjdnCJDM;AU*/x&U6"*|TqumgQ̻?\nRE*6*CvUGsXN s1Ĉ*tX#B"m jbse>ŔRoG% PErRy?@S2\6[REa!^B(l'u69Gy]tuxnxclk5E/G4HSEd9 (8q*<ԢwwT==J $d\diI FA*[=]"t kH5)Uhn Zڬ]ͨ(+_N_0JĤC\\ӭ f$\!CJͦYQQ5 K Ӓ/SGozbCIM;TJv_aV`Q!⚱K|LfQ C ޤ7;ߟcl3!H}ɷxGiU.lR-*=p2$m~-Y_JWT$UDV!܋qkeB Ÿs(۪vђ!#p6 >INd},xtT9?B^ !yKXj_E7N IDAT\V{=0v\T!_( 𒂞 |*Hi]gog ҄U>2#>Fvs8"5b)::6 U. )(_#M,Yp !榦&&=nxVl|8I\Awa?^FLO˪*&wQd!| 21_re߾#GffAt bd_Yo ACTE-Id]<~>JWi*BW f)W eve?MFNCXK˟sKWtt9S!֣xI%'oq*NGxAL~T;>*^}{* VA)p`6!Wt6PE',5IX$;*:U^=Ф&UduaTYڱTQ,s. /30,$ ɡ }3hxKM9+4al&, fw(ؔ*|2W,Aby|Ӊm:k3TanQBuc4.,ZsG>"7's7ag7(I*IKА˕zu;_ABF:r^B?ІV)0fD:;p" r~YF /,-Θ#%Q$r6b$e H&y&u24&@ʄ>{,]}R3|[5Nc\)"8|44Ŕ  F| duе9S%, tu1r " &`bՏı0s0$t6'&P$v5ZB|,*,,8m݃u:,pdqm 4s[1qdE@YQY-4OǤo0yX,9ޝIPuEnWVF3  V8*Zkg )kJ$eKI-(.dsAqNj 731[3l~eTU^cSUStPc&78t6f ޚhNcU1gF˗mc.l% :b":ERe❧|pw>U<} U?<U-v*b_oM ?tl^^ gv#&SO*&Kˡ"`6b mN~F<.ĽbgaiRn +T!eYJ{ Ѣҩ,Ƃ> /yONJ}Xl Z)<#)>p,,4e{z "K"r '7dHBx9PbY SG~dU[ܶ'lͻ\ K{{'=ZE,{,c<)4_:*;^Ga v[]W5^5/}nWAI{*]V]F|4T+Dh+$ACG*k6m9l5`@09-ZKˑ#___?}co+8B^: d:{Pnq-طQnɮ~Ù'ۦ*7_'ٜ8R%a}U@, 3{I)efbV sJaҹ흓-KT-;~&T[w.3 d(q.!Lec+dafpь؜Vzn4pv۶ []-}x(PP9ЛUGL@qkg>yd*ΎQsG![[.CC p j}Fa6w{=`~׮=;< Fho7艉A fJfARs<?O %o q4b2nza6bq (#-4\C@CӞSN'̉==*>vScgyzꩾ> -NPcRu`ԅv7<6^03߾e-j>Cu[o=p[ N4HˠaUzhpE.*MbKxͽ[ s\7¼5WNu7J)E; XotNOy$g8]*im;Oc8'A Œ;5mo3,swL x{iTyѥRW>()I7 TAk@089ZoW/κʎqP[[T9iX\D611hLtwwwv1cxy?|ŋ0 7?b .p7]\)y\oo|;~z*O'B+9 Cdgb5dMۻdJѹE2 E|@_Lk2Ք]f-鰾;7;^'<8ƒ+*xZ?{q$Eא{dNd&7$aYg12Qvd3Z{w_rNJw?zHIU|$J4ޣǩZ|R2SE*OOBA,I"M.?z ܹstimm|9ܡ> m uROqr+^K ~< -%aęeiFy+9zߟ8.}+*Ao]R9+=_olLO Ï %r)T񒖗-/~_F%Ρ MdEF0[q͹S#0}F)\.SЮ0]UdKLyw*69RQp}Aw>xEeAڂ.[Ro)8 cɐUB, 7!2dP2WױpyY~ MLN?"~s5@bJ̅oʋ/^  >hmcl۵V 7880Wsxʕ+?Ə~3 zbx Q̓7 n҅oX1``( K< 1xK'ǘ˦$O^c93aVT!ãMO}R¾T)f^K 9"M'LU^(-N2u_>(jGaEu@p#,WV.](0 31Vٽ|rU[2kIɩj\˒{Q˓mM]dt>SA3FOan U̺OyrA߻=!SEI97TqPEw6fO*L*-C'^f(O(+*}M$Aqے*Ru*O&D@2^#ǝ m///?vv2fy9.#'[@JҎ0R߿%T+nBiXXq!ؓ0Wo|]^ӟwi8לl-^kJ{oR>f=  Ô"?@ڦ`2Ց1Rh IVAЩRY+F|%;|/y(-,"aTNŻ o%˙x?:G'0B rU-f79s̥K$>:`سgϕ+{ |LAhH kCFj,.={׿|/m~\ VIoUll>wL4v ` YIbpܤ' #"`Ѿ|r|nzF鿫LXLN0ڕ%i%0)Bgr#@Z5Bh }͛^R^ɋDŽjފ2arb"T?BF׬8 KSt1TjBGg)䓐fG|異1|4q'Tu?3۩υ7=0(%TQظD>U!^IU {TF]O?IU!Nz(2ЉvU LY_U4ii7PqV"eiC+ sTM+66.]`%^5P=xxE A 7F+tikKw;퇊b׊шj]ԏ3< jc[Д܊)J+8ᰄQ#),qbK^6/-aCmUR!I7UC,P>lB %w^ +ɑgeJ4s3Y f2TX'Ba% #hq~Dc ttXZEgUUȧ; Ta`|K@?t:/_zuaAD u*MRoD&GBr"6D ,2Bh A7/ۃay =ٿ|$TQn*λ_Ts[侊v Y(~zUW&UT1zTwdwPEAOx* \uTq;°´m5e%0u-Fq)d TaĮ IDATBP;NOOկ~ucHEI="Qbki֌UirAXqeM"餖3Ezencޚn9iiyU &>+O1*נ8qT%/eG_vVUV^x .0F45dIdꘝ ex3M`ꡡ];C" \_ CK%j'a܀&@B1+{%K/3g?~,>tdNƞh1io'[8MOa`okpp=Eġr t4ud1>Yt0: $1=#B!,'<>2qLj&emn "נl%y6'f5`*h$4"#U8ж,ss4Vcѡ:XV ARGIܬZaWǖNlkQQ 4Dv6ytO&,H<'Vto4yc1ش!~U) *~!ӏz**ڲ46oi[b#UX(rvMTqPt ԤO?duPE]T TKzr_է=9T,#'v U |UnR.`ձD- *ȋMT1/U;YMTQOՋUĬP-*[a_^_n 3EK"HO]4fHm%5ƭ+J?G@2>A]o *p1ʓCC??==`8N".;fXVogMaE\^dsSǜU ? -ʒ*17hR灃7ٙyX:{lOzY}I!v,tGxb5 +,'h-RW98Y!?7O_}':z.JB(T*X(Q*~ŋvP$P\Wqx R`V B" Хcj (!hG> 8 '(mZ76L%,T[D0c*)>kf*FTSS˭jGF u/ :8n$/hqDFT9 ^X ]QBeKuN (Ň9+$R:FXUyy4BAý-vKfvsi@ RExzCeyffx19Y]C3orX\0|WR侊X^ſPEg^GJZXxnI*ھ~TεF jRn?PQmTQVޝ ^ 00䐚Gq}%xG~EHgkpڀٱ~j3M[>ei)jNŪnh8 nԟ}znqn*(!2 ~ WenHrv]@\๡?<9; sPvj x}kQJr-"}ɹgpXU=V؜V7~Y"W{C,jv<Ç02BչV| Ѓ><7>xpwl>h"@=ϡ)\^F4b/\3qaXH` ioxYkgϞ>}O7D'ΟoG|KΝ;{ĉa(iEK&Wt2A0e >r[__Q]?robD;:.//lIojԎ0f yi?p4S!x0Jys^ZO*(Kih qiɂIx_öyB SXZ¸7q ($%VEo߿ẓZި [>դ>l$;rerI(}]pCJTIRY"af.ȞkBvQEo=@7_*\FhpTq&UNQPwv#U? 8xyI*Vg *Xv+Nw*RX26GӯrUH&adžJ毩G6XI+7A?1۱v>L. aڶc]x㛽: 9˨|&}E@Y(K$Yշ^^`=waϖ}đz ƹsO#UŔ*ΝxQoWr@ wi &1 c7uK$"AXVyUV0wfUQRD Hq+)l"C9oU_h3, z*.rO<~jj:ZiXW+<J˙F>µ"?)e\ 5k{FPX.MFhg\9P7 U- h]Bg]U{Hdÿ,b <T2f]+B8 bNk^+=CWܻ qؤi&UTuTRFYpiTQM}T1U:Uر{b=P 7bQEo*+*}/'3u6SE|^ǣRo:*҄|}i /G*".^ں% f">]9GV?zIIOdށy#j`zgvi"0GΜd? S-\X쾏ɱhЫ&͠lJ,*m1T)||c2^-2>)Ki~ĉ{z0ed7y/[?wT{e2T)0Jh1# 1俗c N)[&-"έpΆЖt&HT+AOͶ68h.2bf:f"yP9HoJWԱǏ8qڵǏ(x||'pBhm81HΟΟCpa iErNtt95U/îq #Z\WYR(Znm=~onC$\1OzPx~@4ڡCs\`qD#G.^8Mj ϻXT4C?[o] !e]zI RA(OxӛCzُDOŨba>5A/qczS 7 MLF1;+4ER!~kSE`&tQ{U [nqѡ 9IX+W%VE~&C"{,#@o_=_r0H>;;$P#SE΀Rd &dW+eUƞk*V;%]PaU$췱Q@;stI T"JW7@GX崧'1%ܗAŠSaE*xP1ճbs MTQ{mj* ρ*V|T#3#PEml3=7JviS Nhljb)wPIBzWyM5#0(O܄QW*_{r_t<[TA\CKy>P"*NٺBt`+ 88d `w;5% b"UJŋrh2DC Rkr_Zb S9jy/REJBQhWZi,Y a)")S'9+hTA h(DB+K֤w)U<dž v7B_6`{KQiޭZ*x({* +T҇{rOPEa]Po?UH{2!/.[K3$Ci֌42x9Tv8̗ بFHy %iԲң=ʄ+ Nޚ[ݛ®r sB'1!5[7bEvU 5f}Dhִpˮ$G-Y(xltx҆&T'Dgۊza$  ێaSnjƬ@C!q΀p6p$, ^M2 7]iHf)C :Wl{9(ThXm 0cyyΝ{k:;76U:55p̈́^uQG^o49r FS;s{Pv 5p9|r|VbϟS s7bs.qVum0"&AgBE4LC b"b:J ͝܋)"ЌihH ^HÄNW z'$Я׆㄄zgg}j1 4>k=k?ੱf8iN#xlºQYpDz<3 |:u ]63ϛ6"XV }&hn{H#nEqjB,pBh-w:Z䡙A" Iī؅XJr"Rs|Aܤu[Rw*.gtW#iNMʜBcd "T7[MD-kWi>{Qga{J{aE4;$ MӸcGf*7,yv"W|Xqe4'iRxvb뭠O8T|X/quJ;U (-eUd FDXTT(4,ܓ*zz[*1M`qf_A>`]Bރ*V]U8Yx?h~{Ai^m M{dr_~d/5Ld(u6{w%O:%D>޽Bnl@e%fXQ*IUL|mXr $e6W -eeKOEDRfy- ,+e~NSwA,'$ 1vd' "% np)3 _o*#ƒfP_\7h`#I#W^N9ug6(G#{0<mϝܵ ᚝@ nš=lU]zurX?`L \ظqժ5kHk+ 4cǵkGv!8~9@H5<ƍWom3 ^q8]aqjcxr!Njj$9 .ѻo% _čf* !|>xH 3uⶃAҶ`UI%.u淧 + s9 <8ҕ iҎnNЬW *M T3ܧZF|Z$UވTTsHyEl6/(8'sy4Y٭\F\D[cރ٘F;o!΋_*rd8T54иzdQP:U+b(j)U= :vj[;L"$>@b(|pȔB/y _p%SL,mt9Ng{cDA}pr\n+99ƹ+˶Z f 4kRee_kL) 4etQx]Ug2謴%DU6Fķ˂%2Kʳ]6\<[1l*C0lv?o5Pw;d31UdiJO*޿ 8!RE+3%gaJ>UoH*6]Jyz'?@p'UPQ&㉰!8nqM$K Z7515հ]Ӧ֨\4d^Q ["eRS-윒jT{l~m}/l`r_5zvwaį+q>6$#i$SZ^29;s*:'7oY|@fb'[)6 x>R\b]X¯:3È,D(;O',rG~"BHhq /xjDX`2-shA?# Y%{B*C~]ZKKVPfnn \UttݿӦ`@jkAddHͽ F9jk `n6S|yE(bJ% wొq Ӯ]qVĖ;Ⱦx$\@nhd1q^ uKPB IDATxkuwMڏdOecc}*POc-nuuxf2 ,eiEgrhXc A/)zenWa^b&.&Ќ&| f`cPNm";4#gԪr2AǢ2ۄpG1CD#|0)64}D;.,l(D$@B. 7PnuU- mbB{' $Ml_z?d5yפқ;E Usb;;=EѪ1jc9*jr*UO*PC>:O9 $ܴbC*M⊭IqSEocO*r@3?TZ#M> mkAN)pTuIY*$FQTTZt*ӮU8(Xoy rz iECĵksXƑO)?[s2.yr9#bэZ9{UnTN_]7ٿ}3T!U^%G=d4Ușe|W)Yv1]G7HGrϾmVe}ʫ .RP&.lLWz~Xsg1S|N:r_}v T?HW"g^%S h"/)Ak6iI/\+Ls%ݻW k_5 /_XG L1/eN"heĸF;4nڴs/"PypH8qϫa-6V^^|_TVzD!%*1 f=cVb W f~ts9:'(?2PRJS,mwq;*Ԓ[!H饨zʅaO~@:^!UڭQ{DCM U0ĩMXB9߰K;Uek*sXlZ])f~ WXH1R:͹Ta}p{WOewRxb띠? Ob~ўRcRs㦊vg?dMзD1Qh_lqgJ3Gߜ.ңĬ$=U`-Ϻ8~uTNrJ7HI $UKMdy]zkEja .RqĬ cw*4 ]emй{f9X+I2-VTaP(ݏZ7Z|ϟ%}J=J!JLM9D)&OyeN\L^SE֋ajׁȦK3ٞKW\(TcUHIu,ٌԨbd)Ur&8pB_60y\/b ~֭HފS)Eۋ`0u0: `CB[8d4TtZ?kmqY`čkyG#†i;s:0VTvl>VOs(cKܺ`Jqopy.룮o`! X?*9؈ۅb&G?:[6 fklY!20l9eq:BS%eb~~f 7h2=EYUi% ak;9"hD^8iG$JiqosNt%Mvz$ȅToL|*2ajzʟUAt6D $>z,I_NZiROQwcJ)UH-9}_GN}?h:R٧Cn}kzOo+L1Qro 㤊@gs?xgVRݤTB*/A-3;RE9ڏ(,G y`O?OeiGRBt3惌)EN1m/X_+)*Jh݇*&8?xi:UNT 15H`Sq}pTAY&W*@mdݞ0ŒPR%oj'T&.94wr"305*iAT^Tc@ !}$UW8!I팵5;ھpxŏ?6@ڂlb^p2 (zR\).#"N^x3yfE)xSS:FvI?g4oײt4Z>LT 'Y|< QTۄ"G,_vM̓$Ks6䟰S0A+.,,44>!vud ܻYd8z(dΟ|Y5U RY Qڎ&Ļuɠă(q +{{ z,{o]%GD|%, [498Po~߹: 4vlW,R]!ؖ9 gD̫^+# >3 Qez]|Tm* j<0E|.ۙi1b;˛7nͱxq"VJ8QHVXzSc^xMZIMTrٝD@j; ",@d5G6IF*<Ԩ?]k) u/$U4KΔ**AR3NWփ*ST1x=PŊ3)U<"UQ_ k<0K*TEǘ@rJUޚ ;dQP+Kݽ{jE~[CͦF\)(ا5%$^f˪Qg> Ɵԙ83뾪u4ZK!*>>%RJ)Do݊:cw/#u-tweUV@YS4iXp&CȂq"tkl?rq5i"u@d@ǨYW1hFLmՔ=ΚI,ׇml4([(wQIMDHTsE(`gU:Rknq?яzc'kZ,2G.s53O~p!ˈfq$WSoulL Bw [ [7k{ÈLOb'ge{1dlSo!"֟|IAPI%(g. J f\trD!-  ]a\3HJ2ɣXܐ"ٕKYkϨ8!F)8|PX ޅڅ8J,Uw[7mZy`4a"RiV7a4Si"SڀRhoXC|.ռ|ѽ{A+sl^0b\]7`{w# /(AMflko` oa3kw5t̤J4RYIkvyaV(I6$ejJTdhDd)# 7B- `Yݍ{.LJ,PEy&PdɛY:R~f pϯ^l}E9o=1N? nlTDzsR*C[UHQ]$$DkG+zȐw,A%1E'8NcrCXlXuCv(RQ)U<-9>4~RE*&u1g*"U5RbTQT)U|O>>]*㋁GꩋQEg ߶=_TQ(i67UxME>E2F> 2v3݇9,. ڦx1~]W-ⳢEŻr,YaBVzG"-3IWWw!Z>D~ 0f>/+˲'GfɮVzݜ;|(9EeԮR =t $h^~;  W>K hn1g], @YO92Ǎ|݆ƅQ}0+Y()eWyñCUaOׇ[H3ny4&XGvf4ȷ N5S[n]4pa&!;|.27fgQsaat\q!:d1ԱcdarQ!pDU[siM۲eeQ3pSgЄ0"Vٖ0}[Q%XyʩC 6EL]R~ ޚ&E٤ΝS7*?@ɅYB~kӉݷy3QY4UOIRU &*VSxfbVhʩ*G6aEJO~iS_Rń=_:0y^xP|j [E"FˉkrLBckzM<qǑT] 7yDg* &+34JQE/&$[G"TQ=tYɑH|Т޻R]|@j9JdfG|8ܥ6:J 2Nl.B~Yx9%E_90S2^*u.ESP'0T`mF$hP1\2 56>]3&c"&(-BGs#lmcꉭX=`+]` &&N7LepK-K&C <2(pip}{U_}u:_zA^ߎƄgu󤉳g"gVTcH*ufbhi`sG7O|M6: 6I0956+ uEA0vyCE~_=̒9c *rw29u„/ۍp(y>' p ^BBxj|& .3?k׀~ IDATs7VT7 >o?5E.QjL#^ &njp5JA HBm/1XqkDn),Mg/3G-/cIj^/l s Rœ _>9RHPEN+5VTԨb7*0r ;sCx`h8K(v%=ᰋTr73c c)e?}By½ ȌEUXfNl44-S Bm*T)ٙJ,dʖDj|͌䫣VD\fb~RdRr_ъ`EU8|TnI_,S%"&4cT&Q;)Q~xzB\LnUʕ;wzu}! 8o.[VjKZ WG+i=/M5؆LXH]QkWYY1*jkGG׬YX`[@ D"o;wn:uf'U_q7L22C@RuȘCSS')UP֭RAx6X7񽨢cc%|2I >"S|۲*DEr?Yt[>5؅%>YF؃X@FQ-4ϺUEԤ}=3Oމ 參_MF ?8s%} i\Ty%0vfHey?VSnCNMNyqh~PNM v'5C]lkڍ5Y7JY/JJx,xK[@bE%GϘX*q)U<y"LJOĊbJO*7T< BHLƙGUs% %b:%U8#4~T!Rbad쎩udk oO._'Bq$T!V0m#ŋw @PMv>GSCp~!8 >+JߴT0թ%CN:pLd䵷2Cդ7뗇YĬQL/6cD>UXi{FE-Z(pdr\joM줽 \ j:a[Fmz U{i. Lt&ìKciu6N}8XbڵQl[ jJ 鮘?j |ͨm܈^yѣ۷$|P +QUU_!_vg߿Ş=۰VJM $9,@z8v&D"5-׮]c;wnڴ-2з--ʅ@Ø YFzi&Qɼ< [L0l1% $ԌTWJߏ*ٗUp1@ k+OQŭ@ә >A7F 1NovVhŵp#Lh[78XSj|taN;(/gر={ۇghy@_)!j%2b^# <@.'5%$bMK[LvpRPQaU6e{-ㄼ8|JKJ3%jYTăQ]/}T_ T|;RţPtJPΔ*$U칹zs{ibTB##Nמce*gd QZїn#JSB#U28T[פMCd[J*"*I9U ^};Ly8~Tw"*JĠKeU-rT6F[OxviޅXMMu+"O6I@4;B¬ۢ=]Q$\b6~\9sG`RAP%Q1 |8uFGʪ돩 `y*e*C0xciKĄ oCbWY==PU06+,32R[{ѣL頌9'uyVʴ1WgaQ&1V?}LС+*njoل+Q*nqU:ϬXjmAk9vxȊ0BlELM۷BڱU(c<%l"a9-k'2 8 $v;mpJ#ɛL$k --xڕMb BQT"@Tomҏ?O`CJ*?^ x;GVPι֔*UؘȆ*Wc&9+^DIvf2`w<'Zs^»fH c `%-!À1`« ~](b"`98s55PtH›n‡џcףHNCRP@Jj2=ӔD F&&)\3W+G )X>l X>P݃F cǠ D*#.1}Lg|o6=XԀA䭷ST Mz.\]X(+Cf/E9$i0bcrDLA9L1#/*##l<Հh,^ hM;C P954LO{~vHC)D' IEwӢa~̪BTQΓFP~PaT~uV4V;;iid+PX~WhS; " \ Sl;exi$@* Z1|Cnj[C (ǀ$LLTdT8TT"ؔ )U,UڴTq?C7AפT$(Ʀvwd(UkǛwU֤jz"[kOc> $T]qr MnxnͬTUGK??FMlu-b4WRjN){ĝ(~$Kψ']M.v,}6 J}ʴ4+SqEy[%gR =)L˕@b QފH =E=bQDD˲Lb+vhR"<C2SJr0cf>HjH/$)2v5r;s7Nq&BLi'B%lRj"pѤˁ7iB/K-̄e}=9s"jgxJAΠ3g9ld wu1`g˖]m[o.bWmS$<^,5$ \ +Vv4Kk?hdBMaFXqőƚ;`0F̋RZFG hP mp Jd0t*O)H \|X[03L!d(T!;6 <] \ |I?@wQ"z> Yԙ=0}KoH~)ȑgD"(ͭCj}U1_^jdoGd-Kg62i-8UPlrg.(h2\mQCbI0@4>OJnD>^5uJJB5)U<>h5;TTQ8'MM?w)^g*ro*kSh ʒW>Jjs?lЕJpxX̸H9VSl`X]>5Yu z86]<U/ߧ=Ud'r>D4sPsP`7; /"@G#)y-<@c Y(+fQ0.lxJ?R**B@RZ*C@A!'xM)JҋQ{aEz{QX=OQec;Zmk#M`@IR(hxlZ̻@5k` ? (p:ȑ *ĪFpt8qHlGlv@5Oqlr bٲ ´X l 58u;%drH6l+0SS& #Evn݊|X0PzaI9ަ::œRWkLf]>2i@BiU4GtғF(No{!a}K!7XoMwLNP`gvdoUǃh wBQ&L2I;@ auMMšhQ{U?q%N*Dy9K\"4Qg W݈QEWV˗fQ#.%0}NBaɧTdT1||wm)U<^TƔ*8͗* 3A⊀)~+7CŖ/eiBV==zŅ]%\Ts_;uOyf33gwp hF%L\ZbݏE~0]bƺfl?e<& U]-cigWs⡤DSs] Clr ^4R;ytA݄p (إl|W9ejRa$ ~fno|Յvf6Wq~^Ѐg}_]lHzZT(]X K03qτ0["ښ5=l:lƕ""Ι D8׽C&@'$۞=G|oE-. U]&eL) 6ddig'KkxuKwIܺ58Hy9kG]^g2B֑p%A!&9psTA Ij0Ay(p>N7#8+)ۭKԧ ms M F-ބ"N!Yo+H `¯UTiձLj luԘ&dY6E9%9l}j~K0i *XccA' Ɖ:!)%CL=Lƣr>*?U^JBGLŘ CgfwJJݿ{TeuwJ*"U**PԨ"pzy:4S  ιsE / IDAT6YY>-/ #OFYb5a&J(_P;ÝXPX[Ext,U5i1\0l^\tݻv֖ sj;n۷臃l+\@pbq0yə$@BY ^E^S:-<˺kBQȬ=NZ%D5*HBHegBw?hz*Sם1v)!V5eJL}@gTB͔*ѾU3.Rcׂ*NWTTTQTdJ*PHb"+%{ 9mCR`YAqZ9t OL59'%Jub@l-"kdžlq>lu1s]ݼ}Tv"8SkіܽZKuUފc"šT_]RU5͈8U`m)v䥖u3Â4g#H[ue=VwQb\*NHp31DR$QCtbPU0L!*,ʊX%HT{2FT׽,uQNA":\A?8d.7mFn"[W^e*.A[om3m71H_{ U*x !AD1wȐKܩ7l1鰬u509r#$ÂT-8l"G&Rw;l;_~!VoayƒA ˄@J1ݣ7a!Ƒkt:mГ%X=v" ,٭5ȀɨvLINyp "{ a #qc*ΝpKR6; ˬMJ(&I!H"bPi;;ggVMƎZVg'r;g)GG[[gI < O&$tFCx ˄OUO½7 hbp,kxׄBoF +@EUpDnx:(Bfgg[ 6Bm,b.z@Lsc>ŝhii`U"zb#scc[۱c׮]4l8'H䧂De=#G8H+ &Ks UJSYPKQVͫU'k8.b&MN3v@S HZD8 <^4Q5Ąuyf$i[olmnNZDx$4&U8K6lpb&#l 'x"/JQ TTTZ"o*ZF?|KۓϿU5JbbSt|J* MÅP3TT0)ƪJR&f u> UĶU851/둨PbJ͈ū0[4yJ&*_7]?G "V"z嫢l,$v:ɮ! 08Q~ Lxը Y-ofFI#L={PX}g|1j2c }FG9YV,X v+#"1Tzl=6=7\sO!qYtꘀ 1qwa-gE64GȐvMJ}B5HHa3YXWqݘ&7³*)UX٭}hyǤO",$ *22E5:EMvws (\1$T%Bb oWBzjc3PAh% |?CI +zz)U<YSxT_ Ed󓢊_Uax:'A VDT)U<h'TCEJKCّà3E_>葠$U,eR א,g*LCnȬW앛.P󻮜`%EBRɳ *1$2wT}›xa h8_:=eO/={G~j>Z]N>pHnp xu>*Ư"Sft X>mmp櫫.>3#'-RNjk aI- Qib!U hiA+5IX0\ ~Muo0aSЪzak 7oۆ7 HM+c0ɤΞQlnrc^ L/@\i(`7zUlFRw!}-W^yi۶;wC>Ubw vF4UqW,t(ʣ)L*~rVrfw4NΟ2#~rٸ"?U7^򠒎˞<:`gI bW 엶(USnCQ\*:%pE5]d&k SJUxMBakbp)U<*Ud|5͔*Udf/ʰTQqڥ'@eU#wJO*^UNQBلIbɨ"Y ;< ތ*!הw3BBuns/Iv`H}N&*8܋z9U;v@Jj8|ƪE~W)h; Đs܅vZr{b ڕG1}<Ā W5%w?ta[ÑJ\rϣOͮ.z vć5CY~߃ʤBzf?lJ].$N>Dj$GvPa׿2Jg$PI p1xB&AXFok۵ G{ŵkWF+@\);tЪUXlVg WTw˗#ݫWA 4޻P΋Eh`X! ~5H1>8p~u?+\ٻTSY#@* NԌhФG, t5i|9~vڝ;?IS3]x>C f(_جujV/ACr:B15xnsebqJ> %+A!&ªP3M4GWQJ (I+mCpe&b%qZ9+)$zj ED V:v \`_YY^9n]9Sx.iERSE>k⒁ߔXo?%STDT;'KA|p.G Nbչ/.|=M{SE*RxrT 975 sKK^F˻SxT1|THRE+sNbɩ"7 l@Ʀp㇧dW 03374$Q) uzulv/h:0B[T^*ּ uY\=*F1I_LG}%s-}%~9 !6h$_ݦEΈ "EB營#(;6v}צQIl5Ѽc)kg fIv!1K:s --o3$Otbiԏh'l)v؈؏rdMt߮]ͻv _[Tq: x8im-rU*NڷoߪUHIq#&" 4S.@ay˗ɃoP,CV(saW_8DX4 IZI_c/t۶8 CU?=~+WVF.+׮?ZQ{u߾S(RV&2a5gQL@mX8hn.+wNEP{WL~ `#fa"YCc-8P޳nLHDIs9!'H##Rv&TaLenrkJCPG>n2K%o @KqE4m0 vh_ D׏@N4J8H8&|-A!~E>cHމUh=II_y0wXsEwUd͙.&Ų"!usp7*vT񽨢.ɗ)U6I`==5HEA!Booowwuu[[J0Ŋf{miRV*^X4LSX`IZ`0v*;`kא,H[^e HSqS.Gi, %_)hoʂl,>rŴh'_GQ*)L d8u Z׭3YStqdO )sj"7uS5hl |fZ(a`K4}},Pj ]AӍwuI"$EX$P0Xvbӈ,Յ0~bꈛIJ#vLĀ@"laNɗddn͇I+BItMiQEŊkO"TQPw)U<3P܆UlnrUE#Iϑz &^p͘T%5پIxF1БP:s;5*g(Y[6e<=C{I9rݩCs71ɨ/Qz,+;<% 2.~rN*tdQ;iUg+8rcu#Qlh@jGZYa= UxoG'("Wr`]@;>?]0RlDJ4:4)j+B>|_vwQh̦Sq[[[k]{M@TQ85_چ ˖E*\2ejW=?\ANXOLAhUFl (hjW_EMX?[,[v%H`TU%U@СsPʣ H +"0KA„!!hB?,-o}{iwr#˃'jˏX崦z\huD ZF[d4uɯc dM}S$:k;Wb Dpmnb !Pxp)zQW& {cŅz9O7kRLʐSo>v&`Cr|ߺ|JTœt ? GEې8{%jLuqO'Wam???(^lO<:cY6Vst ׸r]P@:5l}{AM ˓'@))) z+<й41c#ީؘ㈀?IVT`s H&xTM3&h5znO&I7l@RϜx:mۨ  @ +4 7Qj؃cܾ  d ۶ix60Š}EՖ-.W ;v;v ᥠ/Em-"KAkpDŽ&x_4[Y p'rs "8 c  ҂{ÜtQBl ba%8FJII6k3{-F@yM4ԚS융<"iqyodKk 2G Hx4:U'_ي ٲ+mwE YBU FCW$qrg)]N>jm裱j4* V8RŃRbe[Rœl+. rgX0ϣmA$  @+PbK_8l̃8ZsPt߹sȄUkڮ]0{ `Y PlXtt0ܔ^֍s#D?Bn ^0YXLo`C7T8 (\sYGw~|DK)H2 @"ɈOs:_m Rs&U2"3' ; y"_`՛ջWDI&/Ć$)35GqoE؜^a 0:/_T=>:h2RE.{Tq|JI )U<TA*ta JU*b7̦TlPPόє**llJU{XBOA7?)nUGJ0& Q"C+g*آ=cw̉RSK\`Oֺ67mArtGKPE0K3qMPEx bJXJLGdS-S8lDg7&q dw♕#UT(t$ݐH5̔ 4j-*频x0zC +_uTIWL! =ò/o2 &ߒTľZvf9%g0֔$Qp;|c!U7o| JPgӠLiSb*WiD_~eKn{Tq Psm)U<;T1!b*C#&Ŕ*ȕ6/5Pb1e+M e=8Uܧ=%U]|DƎI]&ЎrAH67Π T/,dhzRl*bNehȩi?(zM*18TUZq5rlGhS*՝wcc'_[0}CF* jFJn` ᶶBzp#  )ݱ]{ڸݓ 4*۷jū} kx1&B|7Zhˆm&>g?l|VA/MnvINGOL$۶9rFo,ex"W&YhRi?j { D L!tLiZlv5Q~D_ <=UWƿ GvzKbĮfEH:^[\kG~?&"D|E U5p*ВGQnT OWEV]#^6ISc/Ew(Vsnwܙ8^CŔyvS٬VlȇMi@k8U8xtN5.{E nQ*Jt Bŏ=TĨ? lh*p l1UحNN,hLM$!e ?irˎrf5 .-6GQN)(Jsje2RHD椲 f*OE iX"og-S˿Ͽ2dBq;s6y3E S4Z;.!t;_*^G`5tQ=<( m=z˜iΞ!gw/QK ٯ.]bҫ0|iFV`mCObJR5 4uӧĩfK(tX ]]VBǵ*Xcv G-@.tSJޯ` D"4FCC#ͻ^> UJZ[Yh+`Q(Qd7ئ vDٛG  \F Z Ũ"KOE {˩~RT#Ii@ZJ[FVyySarFrke%%cKxVN(Lw#E~DhkAw4UO8!g*eMi?g**`(qRE;߂*^\H٣OA^REi*{DzHJ{T|;X WKcv 2o}y,7 հ `56qWBw6B@}cF0vRڣykڹ"M9w:|+n&IbՏhaS1& ((Ji*4]0cx)[2=8I3M"BxFa;&`Y7JLW]=--GQ>&`4)J_`j1z Ҵa(/ߏWッ}Q.\@Zn&s>*͍YsDDBHYAhZ6CE}}! ƒJsWRLC3ef*T1^,UTQHߜ*s"MKמGպ^a.ubuu 9?a!^K\Iz Z>YCaJ9T!Ps^I~n0tA';tTdzthtq Τ TadaXN2] W@Mnx.v]_|2 GY `TMbeJ3p/ees>>U|KHdkzTlX++XNB` ټ*+7oIî^;qiL}}j$Sz='3esL% C}ӺZҬbj's~|CcBIIT@TAf_=Vl r0 իO"1 B82(-\-hMM+>ƍ}.rĉ*++Q1 }}EE:QҥxvR)M{ao{{KjIʥ{"IftDzF$bPɌ&D_Bxhhs<"5|}]fmvJFV;[)Bexq_raťa=ñ Uͱ?nnP:H^;xL߃pj5Ԯ[TjP5ڑb%8nk{UW*atSBE0KUK$pWMiT!$PŴ,UBTXdNEb{q_^T|WBỿf3hTᴆi=EaہXv-饘(4O)P GUZzvSGĕÅga"B eÈ:ƫWnڋ׍_ YXNc{5Ta O-rt~cv>I:mys]}&UixN"\jt_:X@">o*Fkͽ="Ii ~գMMmX'1tG<}ZiMZ[;kX¼+Կ^={|sҤysH;vE@-B9/4CՐI5%"k^ &)n^,Ä!I/մAcgZPѣ[ 4S.]z<<0MÞ:n `XA`GUj.E׃^^w8kPt媵5(DcU4 5.Ҩ@EpJPNuKmw4ʻ暄q#x eEgp2Bm,68h$:4M"_EgJqƜEٴl:vFM{|ޕTvlB6KN\ȋ+F1UPW* VtMVs߈PT0~ &*vgUܙf`]U5ϠbiPEhpCI"jT#%hwMZq["Js/n,58|PEXZk-njFBE/HEHa=L1G?*"4.#4C uTrnMe={rz)v?tWDo.y:nuqfW9Ymv-ӦRK$ )48,m =?ҁhj2E4vMHŒR_5;"VT4KpC E** XO/(MM_[MM 0 IDAT(KzUlOl<L IhaժٳN]@{?(6 N`S` ҥ6 ܚh^}T ^QdFz W0͛` /MܧﭹgzmC( WW+/)?={O]=ۈ(ҾA<=ԒUV I<7)bdIɠW0p,U=XI(p@NWC僔>uҤn_'J okSZjP4g\؏%FTu$6ҥoHQEXfC~1q^f?=5ϴϕ~sMRr&15K,mST>){ /XS׿UJ>m*VTW*j[奊s" T[3ri*Z4eULP{*$tKqrRW*yĂ$kVמr"l(t]5rllKx0j -4/`aR=b縂GG74Ҩ,1,o/NgZs"Ygy$LVCuttw# 7FT)r Օyzx~Ϡ 0-N2P; _HfTK׋wjeAIQic H&UgRK ޺f&aDŪ׾>Ä.fRo&#`*B" W(P'OI?,/S X>@{EL0 Q*SLdr6hѤ xi)qiIi^GԇlSwlYt|f U= Oͅ q*l!U VCCf"]xZݔla\8tXCPT @~zĉͨX ,JYZYYWEҠA[&R^^ׇjxS7Fl2懺AϏgS긩&9@ӤSN+ta @v쭚F'Y[PJ(R {oRx2Ai%尤S*[e2ȫ4q2ȃy?6:hpޡbè촔z @zzL7/@dX="-TrjR*,&PEI6Pŵ* *R,UT!缴Tb 5'~[ۇϮfU{3FU @H LouFbH|+U<4֒U4}TV*$ T5=FUa#A[LQl )泌v3G< /G)yhX3ZO,K#`ՒP2Z@\oFΜgyyXDÂu;R &ky =`FV.Cϥ 3]׹7X}n󜗙Y< q|@̡qzI r71SK XK`E5TT`E⢿S|rR @ު¦R,A(*Z_TCZnD"Ib &SSnl kYOzޅ 0} B}Ԇ S*,ѣY>8ZjL {TPԩB8dRenrU܀C5 ix.V4}XУ oY$`N8x)̟>h.: #~YY؈2c55uA+/3 Ċ Y0opīvTEp\X@w$9a"K9(ߦ-_e>70],8GAKThUp*pU9 YUzP~S]cLxܻ*o=ZXMH=CZsv<_kd40mdߜH\ɓyҥ'O< dP\DmgЃt 7~fCz]? q+NU.=8U$v**:_U3K(U奊oEh~*^}h>!Xq衊|'TG UUQE?yƣTz^6+r 9zܯiAp8NK ~*ny*MD[*f}ՖF\~ bZZa-(8ds"܍rb!UϤB ^|'5=CyT6QZYג:[<@ˌbepup1!-d[zj)N$BOn)ZBd<7z"I=B9(. ͎)18ݍE2ESӜyƟٟ> 7fL~~opŒ灦۳ĉs}= oͧhjARnZ7Vw/ 6ZA4h0…ӧCi?~ *o_16Mǭufŏo-]z돂vԩ6l`}U=Bn [,@[ ᦠ (áX9]ZKʎ\VUuʄ &P5&.޼EGfGGkkyy]ݸqHݝ3f͛u+'V VdUQ!Z&*GN=ϋhWW@|iKE 6nfB, rƤLRf沿x9m,Ϙ"?C2D?*Nr9txT6x#˗Ysٳf=:)h*T Dۜ==*VUh QBTRȠXb蠊[?!,U ( 8vtPœvPr_hZT|xjөBJ%Q8|ҢFC}˱<-rӾ+Q?GjζZuu0>=P |Î?q9ݍ̐ə^<r7԰Hs_S].m€CgHS\2R\=o&i!|b(YQL]\'u܉ikh);;KƋ6+¸j%%ͦKۜ9  #˗ONG86Sb?U:{ҥ5۷æA ;0s'NK,GL6`yFpZ>[['jNZBB4yOqƏ>B,ѱc7oN'hk Ff[Pmda\`c|v\`6ð&02^Hk oW9@cE-.s Q} +?1MPE0OreЄVpۆ O<.5{-TlZҚW.ҼN=S(06vъ˗?~S/ ZA#Tںdׂ=|׭rΝiӶnmlD]W gڛ}=qIYK7W |T (aZU?‡,UK5!6bᛠ_CS6*^hTfjDF:U`=U|y>U X;o}TCqUUUv2jSfSӑl5^Uu"M-&$WTVC"2Ea:TV/Ԕ4}1TGC; #sxϥYɁfh:[WL'_u:߬.xߩfW&y,Ƹ-\zc ӥaclRT2˕&ŶS Ua1)(NZpx|n|DDc ޜxRDyo/4᫉X`ܿi9~SMX&17n\歷?Q!:5h hLS=P@lIL.ܹm۹s.;+ p@5ٳql,;}F)p la #Nݽ ;k-dnxk^̈́Ň9An.TBlo1^<6!ckj`Aܺ>`3*$qٔ)*qߵN4 gfM10Ux/mڻ53t| R%%%*JJ+G4U7|BtPŵLM PtҾ,U,hb$SEX\O9Bb@2P_B5Sl?%Qv8 ʃy7 >7$ dЫJ4("UVRүj380H.Ӭ T݁.ceqgũލPEZgD=|f5Z>T-ͥ-|nBD<<3RMbN>ܰTaN94n]5 w7yB|G+FŸ9 me9r*xo2iYNjjlE$gB'=׭6n>w1z"`fin:4ֺF6 3`RP8*ZMz=hjPNr59rM`-ϜS&-#hR[= RX3=7%w&^hH 0ٴ9^+I/tBҥ`عΝ'g f‚c T.\S 7]e49[qd)1+B-7q#蒱 LRj\XP`cc~~N ޛEEELݍR?RO`n {L uII1$Tq/hftvfհ^F0@< U$tDOX# Qo|顪/m"OO-¾Dp_\X[B1wzsBSVh}}7OpG3'7XUWE;/ۃnLbXSۻ|y} CXIUE'uQ j¹7Y@֍T;MdbdPE,T`RŘ@wkT1"5TwH6@e_oR?Jo!UgUлy_2U Yf*8RWTQk?0"ZGE{_g9H QEIb T/z YQTXhx$REaYXJ4`ȣ.BgBTH؋PE|??L'Uĝ1:=|O Y\HOw*d>A)U#EL>6S2_Vu?teF_oooNENW:Y>5I#|&O& t0rEPYpU0?!h TrkcGGyx "?޾gq\Lȥ¤Ǐ#T!) O>}TU 4D8}2Q)֬6 eQhyu񊤵G=d IDAT.jmmcQU}}ee7P1{uBCԯР@ RE}66o$Q -\|*A7""޿T#*UZMS*QT1:NYjTQE)S?;ǷOcRE97/*|TMD檽t݉XQUˇljXp@mcU |:Ҩv֬Dӯl%x~nMыMӉbߺ[~TaGK!ؙ#EPE,gY opx}!Tke!1#e!J, >[}wo:xfz{~ -د&Y_ ޞ\kv+\fM@9-*@J6^ tKCCjh,9J/^W^֭H2Ґ`@~d !,+SzrB4>2U,[Ę, =T=fGC"%̚+'O^dɶmB e BXȪUߔбd 0q>FlٲbƁ _ŴLq@ӨZ< W|n'yAQCGSScc_-S(aT}}MM2fV0& aeeCCS _2qŚ6f JMF,6ѯ{d sv2"\Tas2d C:6&!Ç%7sYr"+;+#Opg57!ŀKC"Ok*gp&$~#bkMt;{~/ʋ^'ʒ7~w׻.N B_-AD% MP*UhCM4G,U.ğ,U:*~WF Uw1K#*:7*nh)Tj8՟mT|2H}H|+J%B;#W URӶVF 0TIi/ϩP [eUp gp!U3OMe3tk2b5zq4अIg' Q!& J0Eq1ӱ@YL(Ʀs$U%:*z{ŏ4q=5QæxpQLf9P`qTӧa_Gd'@m/XLX:B*2S "&4عj}`ׯ9",.]#G.yV~Pȑ;[Z^}Ҥ3N%;UL*X&TJ ːT}tn…cǎ] zHOѕ+Prr[2FW|ƾ>o[cȂ)P+{1֯䓽{[6Ԛo59^PQj"0I's;"AT!PY3,UۨYFX=V5,Fg1GZK,jB.Nl; +P9>T6Ur>Tr|@=u*uzPJGaxH\ Hp2=Ws< ~+(,bґ@dI*FUԯU= TQwd<,Uhn> hY2k$PE蒇k!G!U4xdO/OTљc& T |H< ͟H)hVrO*78T{F|cjqa f):0'OJ "B, ݩj.ӝ3}7 CcK4s4g R-hԣ3890q8R@ի;; 8TOK6L4x .I+cՔsе<ϛT;PlL-k7 앥=c $*!UH` Lt63'*:bN7~3Ci|H$¶MČ6D=/**+̫U@^:ςvU(*+ssQ}@mތҭ[νzݻ#FT (Riӄ Fݸ1,d tuf|J4P8/{mrEMMSSRxC[[ * 1T>pAJ@1\U/)Řq[SnF^Z?ԐiCq *RSVuRaB'V*T{!LA.ֹ?a&27 &ϱK .UA^t<8-QځxHv~C7g*tOD*&="re .MsXv[[es&o,CCuRc2 *4V']Uқsj{0AxN>Zѫߌ*fvS1n"T{C a!B fy0s t ܖy>v58=IĨsMdBWS@U]f{?hC8 R. UF@"^ںI>B)Z[Ô&ݼWx!mmО 3g\yȣGe;@(S1@TRD)hص pVElڴ{ڍf̘;w+vPNRl QWWSԬYp (-'$g= jʔl]IB6fRl;Q3ө\;; :ݛHM ]+dvb,1cv麗GU Uf?* A%L%q,@hL5̾6p lLwOOiĉ3f,G[Q*ӸX~ghmӍR?{Awsi6_]"yYmT 8|W*CFfbQEgɇuU ZOeU 87t9 WuMLz#!%OwHs~+B "ʋ6 ˙.2q_E>,݆*g͆e8iL-~31ݼD/lAa&kkIK߬Hg?^3Pi[Tn9KU,&W+|Xky[1ZQ'ip'm"ogq˳*ҡ2D:3}=3A<,3 BQ!  'K ፰~ *o 7Ϙq B`JМbYf.S9\OICGQz:B=$H'[Rt/ފlrKRo'? dkm`7^mNĤ^p`ro | O0UBL Q:>DlUO|9]Y\ՄdϞ۷Y LQW:8H@R4edRSSP08XP XK'Ѣ@a٬:ĸDL\_ !Jm^`NT(ȇh^-*\)U5b*SwlY0TQUkޔr\E}0k e¬Ycwp:,J}{hAgOq▊@ gRNIDB.V^oX;) TefT!Ϗ:o^jHxjUGPq_U$s$yW*J@,UFIUt5tTqPq4KϢ?H렊{(U$?jU4tebPo`d"QD./3+\Mԗc?^vf;!aƉg*1ӖӌVgՁ隳P]ݹ l]Uun%G#tK]NK|jY5e3Oj3t=Q3u_TQ4 y@V*Mb:]ޓ)Dޠg1&D3!3 )e9(h%0KeIJ/ҏs]QVI4lB,6:]})+S҄,v Qmp_0Iҡ!PŬYX4PqdvT;w.sc~uGZn?,,Zbp9OS<'EC!{OHBb /Gxl.\xrC"J/I[ [7O $t>lI|9s'aL4Ç30#UUG͘(H 7{%x͝O\)* Un䡾X()U\z R$Z_ =(T+ ^=*P3tTR7)OyTqB)}dQŊW*oYTSjn3y]]{WEsQC]g};=.Ky1bsDE'! )矩 <']YL޸MWyj(=}zX{a]^yPv8@AANG$ܢ*,SS v^EfjWTm|!] C@P߂j%)mu[|ƺrh0`ҫa| uzIPE1!$W8nY S9 ~.ba÷A*=/_"98vDouH@2=AMQ\L7jٴRJjYH+'fF^D:zkPة n7B8#'noI^'} Ow04Z5UqT0U=PEm'|R褊UX4KQӯo4˵cjKlU:T*FUP"{,6\wV;#*Dܾ!f]yT+^==}}$84v\n+BZ5XD3styk I甒NwNH.xֶ5>8K=+H"C#3|TZKKJF^R1cUDfUfHɟYicB:ߍPm ׾*1\YD'Ow x1+Y %2~@0K`6SEr'RE5 8M7hП L*2˸TU,><[Muul~Xߊb*x18*@ p̡yI W b, $5A!PW8qedFPXɨ'mK`TU\ Ls?,I\{pLD.}HĶm`xϝIzx"P䝿]'^:]0+H7RD@-O :2a!:W=xKG+ ut taukL0,] b6+E(fUhi:SNج9]cRJ `zcRÁ,M-2J>>IktO7⤔CBK yT)[i*S6Sg3~SV(QGTjrSIA3,ܟMր/FZ,=̽rYW//J!;{wVnCg]PE^ W*wB|RE*JPaM*T=) U >U66SGU*$fW*K +T1b\ mqApuYg} y6WUu UPMqaA29{M s&wKLSm~qvörB4Yef>5nZCꂚH VTR~aOv/x,?|(pPE,}>9u݁_u^igC5ILUttJD䭔>b$h|?WxU8Y< IDATRןUT׻@V$+ڪ@pɻ]_Lŕq@”J)6w8<I˱枟}ٺYmDJ ӧim!Xꇹ 4D&1t͚iB/?Ua9u*$;7!9H`EDh``pє"b';;wnɒÇ9s@>sʕm@}C$vO ƍ0ඐKɯ.7˗-~Xqŋ)EFgoFJzjVѥbC&Gj? Cm`MM_{W]F3@GΟ>+&V,SoMFF<'3يpID^ SER-+Q*N!6Rc֝RI5x!~$ŗsհN²YQ)A!iRR dafTa<W`<R 7JB9Y5FK}IޝgBon"[KOg"KJ-"R/=UyTqxL }6*M߾G_O9T,T{ R pSf[hъpm`sپV>y2O =d~^X844q+66~DfhT ?xϞA&x!״వz*Ox="WNSjqTF  B>zrnH02͉:Gd'dJ`Rq2Ea%fAEX= %fYwlHWlk7lgIOKdpP>K-yߜQ^/={О=p&oMXS8")7]4Wj[Ȓ?, s0>}Y֬A)Oqc4+}ɭ#Č),@'b>P -EX~L)ʕ@m.a; "+«uu!-M`7t7e$BѲ,<?^q`{رAC{tD0F?҉DD)*:tDNtw$%,.F3dª%OC- NJ p"1}50f&Įp.LZAΦ_ >E^0P4պoY o#V ˙"<i}QuSA[ ) _5Uh^j1W~^н!+#Uq.|#*꼯Li{? v*e<Ë*Ar}Kgކ3Sw&> <-QaR!/*/*T1 T",U`Œ◙*| TqiRşƮRE;6O7?b۟FRX򱸣JTQM8g"K/B*xi">b{E,KYPE}PE*U\jlT"4X.STHv~PE,6G\_^4FRň _޽[>!8-րڙ`K;#D=тg|n.ܷY~K{5]-TEܹ4pFBUh# MӦݼHaVy 6H;w'/7 Ng .+o! MHs{lJS9pJN1ᆲNmWoT?^bHlpdHbOOڜI?EJ5  *oH+z^,7?ƕ_Mݭ uܚ(HD (QU̽qQ =IC1a*nU &kv>yr##߸q2$?Tٔ 4)Aʆ»pt@ZLy9*@  #@Çf΄b7P% ߩz0>VW-" >,^m#~({'o8ue<*+Ȋ[³7ho56""' `U:ŔARuk0IM |"2I&6a=w63i4)ޓdӈi#!lj17rzl9{jQ5*zlI}2Ԯ+qپ0ˈP\7%֧:&b}و?1"]!zag @Zt=FQgvz&U؃w#ǽrU83܋Q?w졔 ŢͿ;@"Ey/%UXe^h*U.XnrREy;eYTy$P_dV,~ l7rg E/'U_\T1bA͕]888H5Wb[bqDkm>E9}q,2er[d1&TUFt!ˣ Li<^} V = FX?pٟa7 3&L8s!2RN{Ooy<X[ PEGݓ m.x {ctAWWF(5t̬By?5D/WP5g,FaAQΡ!}J'L.%Ja1UY@|4Oe$e.gtjC:VH#= sUގ;/F"QJ9a6(S1k z`7ez 0@ C O{㍻wOBݾB_NQjLd =T x;s5Q=C#Z3dJI^83[Z{キ~cׯ1 a5vI7 b>kߖ4;N]juɵO`yl"A6nX!~󞶎f ^zc>UcGK7%+U,8TѾ:eZO~0/K*0X 8bP(ʍ󊯬LQ0[+O. ;;}w8fSXm2QU[ǭpK[;8u:ͳ+Ȕq0]egvѵ9~e iYPEdh7:>Bn\k1,rN* uvKUNII@aN6>l⭩9\MMH*{dII){ąZq-4#"R+ƍ?T8(L1~GccM2Ueĉ[}tDܱbĉnbŐ^'L0<Ul/ebTP=w}zʢW @(AJ`!d~%dž#*z7*_h!B"K*'@R8g%rBsv SF", sh겲A++wJsCTB aQad``[žCw9Eh3"j#}r(eQ)gjrsx |ܪދ=8w9 'f o3\FЦܮgE+ 5w0ӍڊI5)̸žT'+c.Z>NҙMK `{-X]_Q>ekIӔij!S>hf)J?l%ֶq$İ%?gn(RzF,$G0)Bu 4h b܉?t&@@9pӔr J}\v/ؐ P1˓*U:}*{ŲK5sٳdz]r xP`.@ ׮>o) .06dqRqҥ?8`RNѣ#?ZNp fbu I"KwRr#Kg06uSVVVi)@ b&J)S+&vH$-dMXŀeezqLCMpmRhvހ۷70G 0;;++9}}p>|erL#Ei('wàW.tvԒA*P"N1k=ߜu]<@᫊3_JrWZ@|k =Q~*5ձS oMŮ)U1e MsdBS*2QEO/k}@uG^U,0~*|&`p-DUb0U\}EA ϣ:¨"h_Y2PEàmY=TAUvvO"{AT諝q \0DB¨PbAP4ji='2D>*̘.dOsVD<;DK|O/\w=OϊYi߄*\4Ix\sHfg@稾jv}@4IM)PG/B#BD w-\ )q8oD1V㹴;l-2 ,eeDd Z?8*m{޼^SB#57風Jsn߆dpի}ӧO?|9T#3AḩDWpNDkbJM0O  \}; ϞtIp.]˝UU3g%! "MT0\8< TZ<|_)$X2s?t 'pҥsp̞_d?м}ΝÅ/]l X죏BT1gN8cS6RjmUM=8g),M(gh o*ͮT3PwdDq_ 0u!!Y͉o6Q'V6nS#)j[WܖA { ȬPW, -;!lJ(C3ˤSC[30 ) uvSEغ{ 8w:sU8Ѓ|ITa"yYIᨢ9w=/*JP,U*xo ̜?ڗF ~ZzUG|Tr3KKT? .yd0q wVFPZ>pK.ԬL+ 6[tw:(ysZk2DڵD3YG6]E-1.EPW{  J+wAiv"rz8<24֪3/<-"d3ZGzs!Gqh|_ e\wA째1|L}/n*cPէM==LdqWݰ[eYPr4Mm 61뙤Y=q h7o;GjFX?JKrsO t X@^=sMB?PWlӦ) cG@pdznN+D(+wΟGL)Rs#fQc)Lh لސ@w9|XB^M<0Zc⒉,WH|b-T!~g;w O7pBYO~}?G,ؾU\ ׬y}O3kxk?~̧vuHN RԀ+Z[Z[Ǎvw#А%aJxF0f _c! !&W|ZPXf6rJtI`,rm\B@2 ^w{'_}<9=uxZseQlZGbD~TXq4K*1.REzRųQķ,UXڏ~y$ULn7z*$RH`dYeRFVIJTILzM -垌K+zL}1v6IfIeeq]cKÌYЃ4BNDΑhӨ &`剬2.CA+iTAjv"eCT.(@H|X147Ř K_qY4F @WWWTTdژjh߈:,b)JVY}{℡ ;Θ[~ ݷnŸ"57uCE"U[J#?U]$W*Z|6RI)H@ BB!pC}Ӛ.4 IDATqvZ2_EoWU)*x-%=_hZ.pWziTh@P!4h↥-5ES(PXZZ7A!LJ:#)4 ShА& ThX7(Ң %-Z(Th(!?>s{/܀I*t?9=|Ršw o Vg?31c/U Vu ׬ٲ X`<܏mۤ*ɓ֡KΖ0M Xw7$ة%g ËKnt DX;kAͥ"Jc5RV#攗P_oM֟8[H \9TO31pr,tFbexn (ߊ{ѩtYJ3kr AB]l-r[*h̹\PX\isNk Y4<8ñzo|F*w)uπ*qӫvQLPQEB77 K>V|#TZ)b*BT`M^?pT_>b*UW?SHV\ V|3T7$"P^SBfS.rpmg,u0p`E7lczY`S 1-,\&a`ͅr=jPt>D$=*p\wXK *+i2XX=8ouPU.K%sݓKXFhR.629B^QAM:(B] +`R ^ݻ$7l8B8C y5w] =3ƈ\93o[P/|)$d~˒Pae 61G y؊an@۷Uˣ `'7Q?3 /U 6mg>ztʣR~-\jmgώpf)…JXM^ɸJNxS 8r֭+fmݺmۤ:*¡tΖbc` /OˊDhM5X_ސ6ֱJ&ǏF_R_v93%9Qw^*:Ss>|jzQt*uTѳ^$쉻Y04k$bdf:JTz3ƋkZ?Xs^c1~l"(T&$>wvsGc5l%⑸[?4pX\{UH (bgr Q[OZKe'apc::]'Y"̢%: ݣ 0C__Vּy )cQR@>v,4LGzKː޷@!i/;cdž ('MW-+.#>(Em$U(8Iv-^ M!$݅RT aFQ^Vp\`*S|{m)vիF!~tx'=Z[{QY7]go?z7/өNhpu0ˤ*vS 񚍦@__v6mQX xoL!{ v򉁚" gmRSL$5VHL2wrLկVspPDg&--QޠKuVJܬ5)Uu\3 Q$j=/֮Itq!I0//լ2anY&+JKXt$6m n=N8rL-r˰2OիnPrJaPY JXBTRfwOJ+Qڵk7B+x>)!0Ld.*/PjZ._V]w"Ur *p!Xi^A(KOj?zB[UM^,^ao,YTs} !.BG󼼓'q?+!AOTgʡYМGm-ǜOS{2C ǟ1 3nYT_&UV'+N7KɇCzKv<$SY o.\g% 7$d8jYL~}F:㘋'l&8!Ti=,j̯E{!|7,|^zɫ}vTQ4ÊgA{$bq$*~Mh[hQEcU|Q ]MϞ*b ̨"7=׭)FT o!Rp۶mٌ`}Yf⬬L']a)g2[a4]O1>)ʝ͛M߇e J+7,7kWSLcjJf"UFk!RWxD8  Ue*z>35Uxq :Wtӧqݻdɖ-uv~571TP8M4x@rrN-\5RWFJ$CњIS^B9PP, lR7!)u/1sq;T1OqrkgC#COt/&S}L?*,1i/g0 aEKubV#t &!=NaS+Wp\{` Sq~a_n5*((+uk`8SB)@__k+<ݰ0g*9ZTZ|2gUl۶bE TlܸlR?^/8?@D) lP$6W(NZ@{5(U,ZD@ڇ=Aĉ8ur6W\1EHGMMiԩ55ۋjd,DB@Q6E9ʗ"6TǨV%aL6m*n^~*!UO>ӧ#ׯ_*W@&yV* wYRݨU؈yyR) !`IZJ9 :hkHF+dy:H(jT1U򳤎-3}vpʕS!fUp8&&7$ *ں}y3±KZš6X<Jm LСv?ҨiTASeZŠ bT{D@Nl|S4;"tUx $-wlyWC"*x) =%\@Xe cq&tmRе^^qpwx 0 /QJĉ=z XTU,0Z|alCP\_pEStw6EyPl ZsMEEn=q},[FjV` &#G D&_4fj~r_̕,gRE-[\7vi8!X$_ o(=~qɟ3nXYgÜ璱}90.P&q\3Rq~DMJG ]THi-VGF U8Q]%vOI6ɡf]mڠ^!2[14 3/P!2 c_FZI uvx,G _n,pbQHm2=8<+RIIE34400PT>sO k"ZcfeuJ;qBe*$TݸJիPXLRJ/V NQ̙G@bϞkפN`3prHQkx  6 f͂} g*YF\ۄ 86Hs_@ TF xE>ڵkӧ @T{6؁* Pq# Dk*K9sSжm52V5gJh YA@ڋx!BV 7QIT;Q^;tfqiNg|%( ZYI_Rdpoa&4)Jqq6:1ɸnWǬDȩOG=gOӞ^4c6KgU'̡zz*+XjcU <zhP:Km6wnswf'x_'p@ÝE<܂~(uOW7́%\\}Pn'>>}T(Bx*TabR'QEDO*/-O**朌"A[@]+Ud!qU|kBWɂc;x0'G*UWpm#͒q*ä)Uh zXj|,P//W)^Ӆtxzec@s)adR0c ڕR͍P%WҨ"\H7n~ b6bq >ܺ,qTvX+K\hMozG!hhR UhH֎'sfIQ1  i,elc3`kW㯤 C|AnEc_|Q*5њw3ffI3X™")>T[y |ӧ* <5T?S pLq*yJi[ʓ!A)CJ?,pTQ^n!䊕Dسe ''њU TSIŕJc"2vJǟ?_Thl4-E%졠K=\z`' *ڣ^iK1t\=n(e}`/Nh 56BV`M:Vm͏9p ɒj/ KI?2c7c<˚U .[ %п)[=`8>TaDNL,n(4Ï]YyVS&~?y3&(q *׋`j1f׈~ݢ)yV=3O**"עAK"iQr[MOXrߓ)&a--u?]SԤ[JCϥmV _m1(WxY]P`gN^10}ztNS<ӕpy٘K{i#4A'l szS9R1i:ճڃq"i u&S"ÐWUE)\9gߊ9s&MG;w"NJW:eʽ{n @P\+D]_@ɋx N0͠op( ɫh~*l%XƒUձvmi֮EY %`B} ) WU84XDl}.\ciTqΝ9s\ 90Nۻ1>^ziY ,u <$1Ceg!1,\H]t6.U?\L')T p?]CmrsaiJ'%r&[@PY){Tary M>cQ_ça•Ҥs"*7s0&X>87lc.tN5<> x3W뾮zb%tBUo>e0#0=O R5eʼn"QůA=mA?QX$ϻʆ"iR`q'IvgCE2o=UcE\Bg`QR·Z[;:"F_zE~*-Na\aPФ+RuR/t.YX=m!sc)]^F IDAT~kd(IWB^yΌң.s/ox,bHi9Q67՝?xbtR;y TH˃ ԩ8o .p,8H3qr v14kUӻwĉrdBfB\A@T0St }R&vFh`=zi bA0 \taA޻1jX})Kd5i%HվR< L$RX|SeZnBE"l&3U]YϜr!@pG43ΧDj LnY3JDiD'UkUpSكNnMitZ疦Gr3+ o#Ddi}r7KNb'F3dMijUDT񤩢,{RTrXEUDT"ٿ^!" PŝXDUr41U\֐+ CCP9LUF QX:2ey 0M% j*0d"]|r=c[;w¦͛ر`hǎA {W+N]^S,8H&UI$F}ܺإ3}EV'.'=e S4osQpQVWMbƌ?)4"*(| j#%`x%Qw1 X,$Vzh. D&*#mV[1ܹǿNݵ v.qnjoƝ;7N #Hf0IW ٬1FRJʊl3f,f{mj`!Vs2 %,=֭sioY3~ɡC< ꐌQ &d.yTr>LkB -HTLzQ>]+usy򇤬%HBxoSE"GSⱨW_,"gKM9Ccٰ"*-U*z:TqE*UDT?ʹ& ]fZue((7iTtu9=p~vwoْe$sePSj9qְ\No~m]IUMLBڨ&}H8$Qqٯ҆ [45ᮘKYF ܡeu=S1E/yfYf'^d*Q~t\F I b b*Fʇ*.:yro>n`Z[Q^{lYd'(}4oذcʞ2P,$QS  hR_A{ժnZK WP̡֭(j"ޝܹK.̟\ҚҌ<ȇވW*^|DeUC5jxY۾uMXH5eEU3W^IsԺw`^)N"kfipN 2Pêlk+(\m3ރ0"tEBLլ|r-1Ң5A 2&U@C"]rQMicpݗɎXz Hbs,몕i:i[pR ُTHJu0Yf Q#\ʖf<9I+ ̙` ^Ati'Ud޼/8}{w@(6̝K+$"WtL#BHMhA/}XMx@ {+ (\m@@ ,`%Z۷Ov-rJA /,{ϿysܸqH2|9H!݊]FIB]V>p@ q+`{7|% c24Rj~`t\%\3DjΠ9= +E-S@9sݺVftTBg]2;4Ttt9&1}e/g5 kΎpx`c-S n<$gl'u\@ $+IV@,'"Z{:9\{SO캻{t㣀Q prnb##7\"a5Dz^ppk#gLaDˊLݣQdBNNp$ɔ$s{!d/ Թ,?2O6t*JXkP+ˆ*RzDϊ* V,{|ZC*"f"Šǡ6!welFTQE U~ѩ`"tUϑ#`.ϛ6aV̄FL^{WFev @vCv7v2+[6M^p20FK<*Bu :~-m 2.kާ¼9&*Dh)*#.h2Q+=Jskt! .|@O*ׂ*6"nnnFbkkY._Ŭ)֬Y"mٲcNT~ t,T]N-,*zkJݣGb5?> /\8jbȑf!bKU/htꗖ1n\MHlڮ]PºysԵkB ?_sDĻnݿiFF0EɮOXP9(c4A,!v@7E{Dv!R"'ִTf% yZ{faè6eʚ5 ۉ*~fc#`cH6F9h#l Gn.bjgPy9BOߩm[)(Sl_0G8 煘5n0ۢ.{э`ammyyp1{|=xG̾oJ1UY>/*CZV6o޼-[Nt|̼fX-e6Ū_h2Ҋ^E\*p{A\"_ ~8*PB%ycGCB#H*ETB2[?UtO[ QED U(x<3*"xVT>UhVj$RE-v>UN dD"⛢>bŦǡ"}uk0*U4[E݄UKm!E﫫"E /п!r_\ӣZ%!)(~h-݃zc΍[KZȅK"aXO/bȠq䈂yUҭz хq:нW7~1hΡeB}ՎQE,l7p3y>~{L(qw7/zBO˜45=W2h [k9'6ČG)S&b1DS` @0dV'h'\c04W|{Ծh!d.֭[,Ѕk_:6> "e?. 2u[3}6SAc&(pYXH]Ĩv.+ w! IIK Z ?*tm!4pȄ{14t[o5cFQ&#õsdHqKf$GlA{<*x6 w2lS]TIm_>9W] UPUT%BE%UDT?3i[% *B,A~UDT|PbŌG fT#PE Xⶶ+C@c?/4ހ~. ,ܴm e}Qs%R)[(6^ԢH51ja5] y ;w zH̔%/Ө7tNKMYᖦ} wqvk Q^DoPQwtceLw$ݰ U`N)#f{(`IYx:\hi `ETVii>, A~ hcinuvn)Mi@R`ƱcWO*&lU}IDUo*?'Y9ւ*NvGTQC~42RE*"B0tqA[bA jףG!&rI]->Ƙo\⌎ &3l/#93tk5XJfmS}&lVůPg0jF0twX2(}YȔ@HsǤw9Ÿ 5z<(o" yI6VGS*ReȤBT]IR;1N3!XRGD&0os2&p:i XYUՒ'1 w]gG1شa0ԣфcw7b ب^Zg \rȽ11c"ud,)}o" *jޑg!@Q8jիY[{A fʅNJ' --Lx?@H='Ǚ3˗*) (O ~!"+.L p\{ի'OD#U\PsK Rc{>X:$n2˔}T47ڊRJeUY n)BHLcRK|M3K1j6P?=mmhTH+ )B8|tW^quq)K= |t񠁟3TM L)Sù&R?Ж =(&; [O)?2z@\9Zd}Ẋ?psY韽N)3<`/5sCQ[`ΐgJSV++ͦ5aXmrUx3#U^`ere4Cu=U9*orz^4L~_FSdt&fZdM>t8"4H5  S1>IH24+ڻVVhB5"uÆN.0% u/ӗQ 0y"8oö%0r|Y_p+g_11[gQ;F~VBA|tNb["ZD:^@\c"PQĩ^ 3R3[{*+zCXa"OE*"xlflfXׅ8IUDT0Rܵ(>=EtEt?xAB*2QED+UX!?KyQdDU+/h/**b(\kG dmsU>FYƻaZ**|1y많*j"Pذ4rC!|PAQL! Z4Y]';PEvRXΆBXj56)ƏU}֬HL/ eӧ]?#DU%PJ k?=h` *uتUrlLSWʕ  `#Gvuȑ#[ZJKo8 p #uŨ֍bPwjYիw њ XM! ZPnhh('r``ӦuhZaZ%X}=0lREwB, t1? +%N:^:5c3p!SU j/hM]V$܅b7ML3擨rqnLRERc/Г?KA;frQ'͜!MIަxxnw>}7&c^T*|BI˂P { QEjPnfʫ=0Fo_q1J lq`رk֮}^06Y敪:B /*UUV hQED3U 来zw*bt*VU"QE*`,UдDlRa۷yuIWʥT]Y(T{i"Ag~2/*Pc*sE_@\r KoTQniDJK-{N NwOBEߖPExZ,e0qjyqC< )MIBFBCr8s -`U| .(ûd_WǏvaDd-It6Ec)5[2KAً'>PH*F&JY*+ ݁ڹ'N+>sJԍcbCpL*P|$sJȌKiХ©S pD `ϯ\+W\YLq +C"q@#P\TJY@71D= 55RTA-?,UM\8{*Y YnN/P{x`C&M>].\=fb)*zo&S2geb6 ؄ I:0,B*1C'EPWT 6d1-RsUXvTa\zUrKw42VA3}sG?ȍX#vOWvqS:jl%\,;WuޠÌ%`hgPkg܄59UWJ|58^J|Sr9OR=Wn)On~ T?-iԼal#<|+`k~ڵ*3EY(\L--/̎BGgDU} :[b`DQED;U+ZC3Q*|yT<77C%'TaRQ p!C/ ٓ&+Tͺ'IɓE\ ƞ&7a->Ib,USEZoJ/$؏3%u\f9o5錊ѐ_D!S^[ `}<9Qz[C9^7u +Ÿ|wb0Z{1c&׸J3Ŗu5ƓÖfR3sk0N,@HԌ]AW5w*&l7:!4I[-8qbF9?h` UܻO ګΝ;fݻׯW -qI 5AUHp"Q p5P8ۥxb$`P}֬ z{a!9u*/G !o<~?x}DkJ^(S* M?8EG2ڵ SB(HY֌>W*Q'8SnfrCôi~ͣG X du+Ul܈HMR˗Uj/1<*X%ABgsUm԰*^DiFJUe7l !ptP*1B2;~ YQbTR+\[v LYk4i'C< *U{iӌN_)Q'yZ6=FxJ q{;dO~7?KF$2en2--hM'&N|ffed.ž*} R$;fLCsM7 r{ :5AsDTy}vCj,*"'@,v#@\;#§a'*6 0-[ΠGR3[r.FHLbꃮ,W (~oӦ8ATUWu]G XSOMݚFDXSM۱k1,TP=C>쳩QBSEY4w{Z=77E;1P8\t^ʔLƳQEhc f邳t=# ny:*cC Y,-E۱oPi>>qo"5Cѷmu J;w7[lH 0])(A,s)kHZ|ԣfyqL*Dk^RSSћ7KKA$|6(^ޛA{=_AR$,8,atK/ہ/bW9ڂ@ U1N hx4(aq Ywjĉ}UwHRݻnyd˖}Y B*vA]Ks M+@ԝ3u./1zP_P_g#Eq&W>8y?\A0AyXy9U֏} }C*")rU z "R} lJ-@b@d66XQ2Q}v Hbʔ7Gm1$D ,0ޠ͘B iauni =gѣ5V@H7˟ODc=1DC*ΞEI!V _]mǜ: N wtʈA7y)x%|1 `A[j"5?\+ n>aBb5AJu*Xol_5K$W<{vlDN˟}6}hx|*~{^c4Zsx@rsgΜ+V:Ĺ \TpYF P] iv@&>i!0\ӆ*4ޒDNH^vO1j-Z]O1t왅wuuAUv ƙSm v VxuFΞ% N$ x~3?!wüb TXzl2abDqqq_߫jw=U$NXGB6"⹦ToY~i؂*U!ukQEDD*Ccǖ*TDdDaR7Vyao)i{Zs+}wܿN|9,>7&PG,9x0,Gԓ`7{ *.%= e)3K:["v /ʔS0?t)xTa~2*"p4^QAsnp1^ .hrRs^WQP~gY\#!W8+T2!,I6VB ݛkOAg"ԦB&䯄*^z4ަP7RJ7; TVY M5-ԯM`:)B2LD_r^!rW0[ҥn(}uq; JtC[#va1t* ۍlTT!U/pt*ݻOOy5qP:Y}t΢E~c5 ݻK9?_PfusP]L~a&Pz 7*C0)K=MfW+ "&YTD z6X"q~YUL#"gt,m5s%j!8_57/ч?8qh(>wJkS1DI GMA]p6䃩ڀxoBBK2LyaM;Ө‘ݸ^WwL)&.tqNMM~H/h\!>/{a"U%\3xD7U}_A?ޝQ3 0aO#ZT18An2QEpw5B52l.e)44a%5{pFr' ?}[z{<z|?52.is2V-DF-+$%]-!RYe;PZT&p Ù/bG+*d-8~-PyZ .uݍEEV4"(q/7nݻat5g̸{ uJ->pw ;wRT|G)U@42#G 0֐ל̏Rf׮&zɑ8~?O~ǁРnHR(\'<%9waʂ0IvںUrЬr HeAHWl@?%jyʑ(99ujDѣqx#`AB0yBf]/)wQhb/I@1u+ǞZ~{e>;4ЩC{zӣX|'t8V-?ss/ayT$PӔr6ZEEz5!:8pۡ4%ִ1E"jY,v{-ZEw7+V ƍ U%bV'߽+ޏ?T4k.T' ?hjLH'E-(dAݿ˗w%#0h΍0"uc 6bę3g|{A{}V/cސqZ t~ȇ"u@Ш`&b7j?TW>jfgcx /0+**CQ%) @ ^nO44ش!LX1. &_9>/?0Ma؛ WoM~u cWWXO!3Ԕ*}Ro*8upf/O6UDf[:Upha#=2.TmTU'IrVx9F &B;UJνp'\5])TݺM._.+O& %Y^a>LUT4ȸZJ.[,/ܩT̬5w-GCn$,,O6{ر\Cs7a &̋3*lDr7? HNd$*D_srcfS8D|l[._> >%EJ(JUa`O?"٤ rbfN)M8=o2JQL|Rc+_|J4پ`ȑ--R--+ x4ΙF1_,>q7]c_ٟ};xMPE~>}+--H$b,ղ+W"(ʇ(zUUP5D慣xׯ_Y NڵѣOw ⫯aI2eٲ;Quy$2F e>m uwMNZNc9iɲ_\$P5՚PTz$4Af6ηC.U$ek>ۍlMUJ&[[ݛ;޽f8OVY.-U䀃=x~Hwf!/$UO//#SE%v߱ws*@npTQpRbmU<5+*.?"PqPSQE JHw+"Й9LT.kҨBj:L҄;gJ 17T!Tg8U3ѝ|XŲ9gUH1TKBh<_*Vr"kۀ>A=U)k@2?Dv]LEE܃PlKvv(F͔º ,.رW6*Ax7 UW硾CA> `}?SJ0)o-GrF }"/jlŊ_ D^)b޼y7n >}T U(w)Us(_AG*U0A 7Ղ DcЮ\ٿ^TT8s~B4a:uyO~|;կ~Cn㠉|S'ɂeZm"AI<&癡0b7]4M%nHwRU5mO_xoj_/~= JȘ1*]XpBڼyk0֭\{Xr;L:MJ]a599F ~BмsO"+3_++[@m|W4+u˖sn20m% D1嫮 8ͯ/I4HNȝ$MeuY I &dcn:\_u.X^}D{$La-ƈ;r~!^c!wSSUgTI3[蹲=䅨q5GZwP3DkXMhu򖴀* In`ܹ??!?6ZE8W0 8$R+LD@,s@ U>3 BQD|?wH.~DSfݼib=A 0A[Pwuj~*pӣGj{ /[ xb1 V+=vE!CXVz3gnڴ1YYpn2%2w`WH8W HwA< N /!zzPM) :flgGGNNQњ5W$֨*,E .ʕ]cE &b*DUG hC=BF&uޜZl5|0 ES+w| /"#kJBTUVi@aa"pljQ= TBC_; }胀@ ^)A ^zTR+%0H: ¡aG?ZkP9qwϽ^Eђ]$A8Ӷ >=I!*`22}:_i65;{~ͳ_gHRE 5m凊 {BP^O, Px{Q)b! PּL**T*"GӐ*BHMW$ƹv x=/∴,IzIrMZ~9gO>i@ {񀤰rAYPE,pт^l.jYeo;)4uؓ잼fwΡ ?}^c3jGg ȂTATs:d%p1z$]GȂ)7Ѯq2Ǵ=lɧNĉ׬4i=xwc,yc%k V+//?ڥ T3,H" +~Jզ`HGlGQÿ@S mbڡC;t8wLAQl վ=_b իOՄN]*8s& DF"'/]L H;wclWXӧ`DiR4  ֧OGݞx=xum)v XѢ_Wzh"w 0ȑՐY"b77yخϋdj0PTqʧS(`*p2 o~LZZ^(絾}҈;w"Ux;!՝Rxx m+հT  ]"@d! CW̲fX&fuPZÑ/@ 倁C+fNR1a̶`i2ITtɅc<*;q:OehM٩\#|\  wcXd8$e7e PLaje\{֌"ǙLYW&cwyLK u'Rq`Aد|zv|Tፏřoj9BSŻyLU\ +dB *fɽUN^JH*T}$5R:i#*"iL "T|NBoό9rLUn8oIR MMr.B$B^}PNJ!OGbwޞu2m$p3;K`:}2W6,.V:_,??o֭I,dNy6Tb5Qܹݻ׬>€ 4*tst%dI[+Slڤ2Ǎc& x{ ۠_mC1c:vחnݶm֭9W޺8xy zq3gzb!uJctq9U&D©R$:Tk(%XnLF_kxwEWӗ-*F4ih$"P+Vs"08K"?u۶ݹT <22ڶܥL'B^DVz8)a^5 1XЮ  75azXB+$0䰷j:,*uuXI sP텵䆆^QqjYNaY 0F $(V\+>r&5O: 30Ң syw3qBS,zv9dS2i$ _1p\~|jSmqFMFq̆8F#G*ITU"J>CRP<|0T1ٳ|'Xy XRMTFNTq7^@"vkC"UHH,̵ $ToZB(+X(uܩ傾JuB,dhݕsouMbe3`PpedCjLeHX3!gFpNV CH9o?ߏ=CA~ѝ:T=JT^SBʞ؆3%0$XWmޣGWD*Dy*`=:(uTRPF {2>J? !~իPOQZ PӦkNJb:N mڠK744 6P*#U+"5tt,@&"5 f(>} 8yywV>}}LTHzÍ!b2ar:Bx>Sp}->g"C^UQ3w"Ce Eohv*ڷ&,]+SkҤ3s(>|,__hMkz#I+_3dHȂ_"x=*d@eN);|5:U>[\'s|BB+uD|m,eY˦lle\< ꀇY22--p *5b|b@l$Go$ƑP}hQ``D"G ?5bMa1}Hs'y|Gn*JxlHvg@M-BW>bT5O.TtWν%5!UTqgS XB[f*JKFK#/Tq +/7}_Hw755ݍ*+BT Y4'LĊⷞ۬C-Yi Xqb}uÜg 0B/ͭV 9XF:&U8B4=Dٱ IDATͭhB!;v/xIE *Xbڴnݚs5 MUHmjlLHfb?*ؑ}&a[Ta U?:(O6`%jm ?x3g)DA1f&b SlZCS UhJ@*HM g($43>sÆhwCjǎ ng"(dEEE #GpuAV\woq1j׷n:q?c!9lfde箨HO39PIx 8Gih]Z_1~IUs?k(L>>QqM֘~I4̫: oSv8T!1|ءKݙoĆ9s&+e;؉$b1 FL)4h'{{#H ˇFrDRT5}UPK.TREQEgK /HmU*ee UnVX1(LBf TqK{H<:c!UT TYxld5۞/688e5TaoFv^x)CHc1]o)-HTa+~n.2 a$%]g' |9d/14!ƎP^UX|:DQ{HpTaFKeɘMOb=!}R L P2qh.U@Ga {E(A-.A8j6βXͥ#T~µxJ> Xc?~IÇ7iE ʲW h|DRzy7=3Nɓ䕮g4G;ǡ{w,D&%TCs<8?}o B`ǜRh)*1{6 CvѢ)S>"#F> an|nq*Xy[n]XMRR|7X73f|*;#fg؊ 5ôQeRŮ%Zٮ]@ 5 -[Ρ]wքCNꞼp!/.\gO߾ Eta]};Bѣ*R3CQ@Y ,'f|ދ`sE\LE%P̛n:"D㿈[9&jus?Db9S8_VUo3e1]BZ6c3uYF C/`cy@Nw'!kf v:9*)ro_~(UЃ!w ΞlPط 9{OR7'nfa9&Tykzgpӑf]VPgO܉*"T{!UTqBkU oxTw]RvTq&꒙!Ugصiÿb"Tq2~r*+rC!i%R/+byߵlMFK. {j{Ӷ* M4U*""IJQnWBae㐣qSxRno jp뼙hA² UHyDv%q**P:4$CuA7(]r4O _QF{@VQecv.Y*"nC6%K~ Y!20.idqC56\Q'X]eX2/v@ZHsChZOnPR/)͊\AYGkd6bnXC߳g֬YCQ\m%Z(Q/֮5xBfPerr23Սb"N(in@h7*X7o2UŤxREU%?uRUD=/' rذD[@ a*J%xw^Tl,MB֭[LRDHMpn={QU(iqTKMsAmcnSG&Ժ)b/[o8pwa,*AjGFxEg}:R74 rdr:v#*~prTP\U^q[?7!޵`XN"')\Il0UMA!Stm}Q#gj@6_`ד ((o|!:577Ýu Xc12?PtР^JWW̕G,Em eX ܃4 47͊h"egT6  IC<B<֖ΚիWm#AȖ*B/TߴC{_ۜRE6ؾ byˀ*B9" rk*<]ѐ*|H 4 3Vpۤc?r4RYl? 1c*'ƅ8&`8b$ TRu\; %hk_K= +<7_}D1r5֣ .X$'* QTn;B޸>p2X7뗑d*&y赭7_r|E} i"(H<TPȒȏLz SWTR8]o>5p{ݨc|YRYCBaS^Cŏ êLXsRiTAOS(W{@=Qm`wVg»U\MΝ`1nR}R(@Ǎ[Tѵ+C2D_Dj'p&LزEjI@)* MFl* ԄF 1##YBvNLB8=`&*'k3͸ 6)AENƎgYU[ i͈fN4j-XÐ@j00Vwq"s0$"֔ko]5#Okɜ IgtT!*9w K")m<^pθ8Z0_"i_ATC Y3SEn)Obj "Bk˯?~JW)?*oU !UT0ABVf3*fǡt r=rTj̓\Smߟb@OR}Ex,p|FkHx60N: A]U JjlrǏcg@r : 8˫E>5K(l#{+VݫRaYᏦ ] A0ˡ+=1@BT*&ysp)݋]T-d9_/s^QE@1lqN ֏a lڂ2:TOVV5KqP{m"P(MKk:k7hM'a=aJiC`C/KwKYTaJ!RJ+T1ʹ!C._k׸q9nܓO%hZ]؁W:y^m4Q^9غwn= ^L DS 'n}w^C-Ɔ>}=gH,UL* ITiI۵C^)* $5?F+4Gs@W\ə1cZΟʱ\϶bjb)Q4U,, x8^%ۢYߔ|wsG(^Ư'[UH, xAa 5Uɹ S^t_wuGxǼ&>u33)MKjkd(*2!UTpbe >TuJ*BxXTѫbN7*~%V.8g7)n UX~je$GmIQ!yVlKK ZaA{khT dDZcʪ ;]Yt BXO8GnRdpŕ+Qf~=VT,n__+'U-8bʍo@V14G|U[=!Im&tE飣C&P"/@M"F^cT``%%Hor:eEa- YefΜ0رIn܀S%jУ^=Ɂu>Ɉ&Ą&o+4"dg@[&qb16>Dh}?Rp8=KJvDNz i68"LW~R.}s`b}bgg1:N8y}ZIH^fٌTRCY$QPŇ @TRàPEΒC|HREHA".zRꕲP)S$CK m\-Ӧ!f\:p!# sРb6 ÇH!} h. DͲeo} 9}:v{êv3 R< Uc9m֪U={cƎG@ұ=CqVS%\"*VW3d߾go$U)*M[[=z {;ug1֯ +(CrX.nHGcR5*XfTA+|o)`f*Aq0\)G :D }G^O'CWIOiL_udؕIGNڎSW+nVD BP\^ΙqUH$CK%@p.4˃5T!2D\/~}.޽g ZZqWz8WlpŘ}u^-B$|sD4H N%6B!Jp|TI% @2!UTbl.*ޙH"*(UTOP{Zuhe*~TA R>*ގQߡ ' " W- UP)(W+{'}\ QwiQ'1mҹ ޕXrΎާ+;.TAIIg;]'ƃէA9 IDATWlrbod4dq"t-سTq+a`~M3.UHf\E 댵Jqr fR Y-JcMW“޶-gpj.(H=1g\luY(}>K{ŬhM2[.biKy^E$V9k5l)aޮss7n=z>`1(2Zߺ-J>Q}iZ4dv]۴VZwًEҟ*r6 EREH*߯Tt-T{ú̐*BxpTQ>^O$/Uhhy?R/* טdfM u pW50 vᦫl iWKz@&N~kT%]y3~#_nW,sw [Q;&]1tVzU< n]D44^s&ܹsƂfr-ʟp*RVQN,vx+3>e t)&ߖh*]̮?[ԕm=sظw/S*XFTE>=z)NB(OS ZL1zPef~5@WDr$|E]X-L+X=i'OP\ K aϞݳ'Ĩ`ǎ=|Xҧq[r2Sle,nW^>UCXHo* ~nG |{pS<F76[K(a6j(Z }sv蚡)6@zE~>^D.QmMj* X# i 6MPXtRWn TqTіP1PũQJO*Bx0TQ.3 XЀN!UbB t QV܂>dZQAX <*\&H :.02m" ?y,$F+'y5bͅQE28 G֬_$,6%u "4(Hq*RbmUǛ!TVf]m`TRs7 xܩǷ*dsaMcle4gJi`&[.X6et^iAĆ^7= *U͢"'PMPCJ>ף٤I5  X dRњx2\!+x@Ξ]KFLۤ^h c° ;޹m -m8 ]<~ǽ ^#WT6)*1}(Y O/poC&7l@j.ے%ΘK1Un|Dj$.]jC6VqMڣ gjݚVqVn*#(N\n 淚 M.T7!XÅ #/mH>_KH~[=3kPYfj?FVwpESoS`u} ) 0n=zmLK3Y5ɚŵ7e/(}*t 8'=|hoŬ9OC\bQt/΀ÉT!.zRQF5:nGQct\9* UdW2!UTqߩ"PSTjِ*BTЙȃX_l8 Hl6D_Yё3yBB](b 2s%apKi .0|j(*_<[SJQK_^;v \qܹ#Sm(6mvxӧQ GJ>Y zaZv[x^k=ЂLA<"x5v:yc~)ꌵjuZϞ=u)X W&UP|}v!wi(_Nn6a.$kw !:'PWlܶ{r},\"3Ml6M(1+MEh2e H9\kW2P95)ULO8,R;2 }g៨\s0G KI,:7nlܘ4^RND3gTWc`TC;٨hrbP##!Yz^fy rW.v !b2tf[;;FǓs:1C : wϿq#i+,V\Ԑߨ`T{9H!v݄(dXj;HGs0ç$#" /)ҥ/o kA< S˥$VҠC֝#"l;!yK{_%7'2٫i[5&v@BTfm9f,8{寰N5N&s[SJꇜ,*1Ӕ " =weYNeR,gvn޽2 ۷g}<\AqnJ3NV)VXwn4H_)'ڷbJE(ޯ˔޴i\ÓB)1PECC6DJΝ!B5vK#F@O BU[Jڧ[\oAo}tS࿷Vx <W~h…myE4WS ٳ-Ym]g϶k׻7.RݪبQ;-h3V@;uBYP~ΠؠA۷QT i*2> PU` 0'K0,((`c4JKQ 9ss14A;&K~Ad5Sc\g43kd3Y M'G7Mij| n F,<{'gJchRpŘ!{D`Y''%\%3?qZT0IRiݙc1[i)'{-v T͒u3bQvy|K"REH4L==A "Ke*zg>&Q!UTq?ZLDUďSZ!UT"T UVd?$bEH!U(TXM9`r>9*~:USáxWBR5)JCņlkeqJW&h U:o[vzXSs}yJHaYpu{*p0Qr Ub7{39X̍Hq5M$z뵓';v[%II"DM`qy|#(iF^.k&˸J>'H!#c  :͉A֩+䈪8H*ϱ\*UZmBUK xիGCQ͚QM*=uڵs\T# 釗u*Jҏ?'V^  R( 8X c8]UpXM  S1sG Æm6p <>=Gc ҳPּzt["˖A}ǿ?䓿O>s|U K˗xc2A&B>Tq0*Pa*Xi%4 Pġ;v޽qQV +} 8wԪx _ݣǀԪXb8>ZV쵝;ظdLwV!RU*}cNV)A"'HY"DK&Ёbh:X@reoHp>Ν1hjBb# Ӝaok\]ɱ-fqW>} L( -wJZESCQxBy2Q U8VC#UЪ4aIS=y7 vw-QBo0jKoQGrθMR˵d*UAٜٔZa**~U\QjX:#TRŏ- AyպcH$%3)G.Esw &mtMl9: )LUe,A٬063*M~l0\qSnKnQX%O RREoG.oޑ*\KU'+Wx-@ܠ[p`*C3)%'u5ty:F| xWA? -Gjp|0phz: ¹^ޏY!Z?>dwAt;p)(p7)<>5@@}v55Cj2 dIjĩ)m冺: 1s 1bÆݺ5f J C֭&"6gӛoko?(扗Uĉ $)Be^HV={"mC]LA+R5SH#U‰O+J7o}o %!{wj]APW3-Тsk|G"$|@Rv*Uzz*ҩӥ IDAT(ARh䖂|T\Tqb[i5Ux1?Μ`ʸkt`LcK췡 ǣhJJ R:iiyڙ!5mqG! bXz7&&5_-UI,|èL3(!M$3W+)ա 5WB$RyO9c-0*oI̵ˌTCpRtiꠐ*BTQqL?ULPz[H!UP(9TMG9y2"5Jw ٤ MH(UHqEO?]fQFc7R< WǐR.fMy?xTq&=5U`i--uu;hD ,c1cT'-7nEv)zqhk/(c+Q >YDf6ev h г'_1 0u*5]qT5y :LClS'oxUc@P%"ҭ󑟕*.PĿTtnGHyM(!T7>[=ڿ/*~Ul4TTƾM{T@ &*2]TʢH%"ۙTcV9wI.eTQX3%G^-YG.+&5}d~R^U ȑC.ANpY/$1eN:Ta1ߕ*Dz7ULqۘXyGXrhRR[P&^3e0q86Z* T$iFn7 Qш0fDj"bΥ/n3 EEd 8=ށL % )ΩfO?ݭo; +T&TQ yE޽{_jSB MmWz*~G7 xژ1?u+'>w9 ɓoˏ=z7yuRo 5h @)ԎgqP`  ?fIqL&+U@jPŪUUSįӑS *>; SPyׯTiZ߾@D)@hxR=h_Y 1^C02 2NT^BZXzC'qvM ƩZnlRobJCuŽ3[jIR,FQ9AE`e heXmj%3XdG0;zwo߾ok{I$\?BHO^Nbش-)T! jX]c*jTlMpE(H`P&٩Z1ߐ*|R"K@O?"{zPEZ秊R/*)k R=m S:KPuFZ/I*4 -βCy&+:ͽREafP]+`lH4X^v87#/* +*֮=SI T56K5F 'JJFKc#5E;n8oTfTi$j5l8Oэ mmM.g]uՑڒ3(%x| ;#={BkQ]C%Fj1d)MGX?utRKQb|=AnnzzE7V?ؒellyT\1}O*X d%byiۡ DxvILa!.T5Ȓv5<IOeOcyTأAaŊ*B-Ux HAk~{Tn*B蠠b\EA +TOObDõH}5&Ƒx&u< ͽq))V"j[ʼnԺA 6\EJPMU΋ U^טxMP"=oˋHFp>#ۉ>qaaA3EEIktI?3)o6F37}DWM nYK5(Zi'.`7T4q"IM1] 32rс+OQQiRMM;wΘѽ똒+UQUrX̆ͨƍFr68hƍTqFfgΠyQQp УVA!$PUlj&͘U+WRC3iN_Ɖ˿UБQ4R(R?Av;ƜRbf>)eʔ*4Lia~Wxur|ᅷFh%&NdΨo~< Rj OQa^E^,pWh́{b(/a\(6myf~C YRT̻*ݽ6|8HXbz@Wњ}6LIۏDp@a"3:u/RX&`d_y,=*@HrFQbP.è5UπA Z,Q`*%ds苉3Zuu;hW>K:8VY]Mb+S*IINM~x>0L ]L >_ꬸi?e1~&3[gD;ύq8w͙]#Fݬ]9<]ekAzziRyoFFiE1L-N>U({t"/o(eIEH!U܅*VuYPҧ'2*LqV7CjBg ^uGRE"jJﴴxzd6usY,=}PemLT^LOL# Lu\PWCjbnFL>=XKTqv@n))#V w a>T'`:q2W}`"&w)B$Ra,NU :&̍lhJ _IKJos;t8z軪)S65bE:G DׄQk؀X (.uڨVՀᅦkEmѣ U@ ܖ*`_zioLi PtwΞT*N0œO x?=bI>`O??։nu eA'(}ꩿjO=kRO8!c6LQŵk\ڔ)(@n*K)HN?Ⱦ} Y0P7PkE*=pC(`1TU>|zD={{RpEibvܙ 4eVP RSZ֚-T1}1Y&U*[I,qSxC`:8r]@rz,"VڊcQ3LT!~[_ I(S*L߯- xX~UXT?C>p։⾎Z<>Udk^x>#wI[DM+ *;iX4pI**~#7O-`}&4UtU,(|Ĩ"/)}CTq|ԩWWT@&xkz@/4(-Tͽ{PY rs@v *>nOҌք'2pyyʽA,?Uф,S?' Vq⬝θ&Mt#[j̻O\A.5VF lW+A5i8e$se4 "bB9lf &_FiuDxbh* pSpL1Gc;]G<*KIe]9)1ܠ~ V| \?ULfkⅣ9D% 6k=TQXTܐ*BSŜue U*ܐ*BHM%JH+ ⟗*dw(V5-U+AMQΙ32 T\V\[B\mYrztů msuhFfSwvR|I{T[.ߖ e;i*TX}^lkoC:*U8]5d ÌlyQcdiH4h3À Swu)SZMJŁjmr{ GFƍp{l8` ǿz]fQT0MS:cFNt@ ` Q(xE5jK/u;6u34?Uܼo[=l؀͞==lMAvm$ uu*J]nW_k&PxDw+7_CYT+ו`k#a7Zȟ?NR8WW;ֻwo*}id]O?ޏCS JKǙ3#Go~Ws` Dk\d >* +`|D`hf9jee?ԠOӠ\c+g(P iC"WW#ZG2Llꃛ}0Um U@^W@&abwSQn5K0R32}\!;>+,.}X|ךcڱ]/UPС k_,e{v6(~ߑLAIvQELtw v5WTXųZU߁*/oKSGe5ڍBbdjK̟il ZBܿE =}lH_8r:}\U(nA MH)σTmNxXB]7oX~]MƉ#j?\Ϟ("ə3];[[L7*mݺyT{7߄ɤt},">e⋯n| ~*3KT\j"fb`&b4dᤞ!/2͛YWljJܹUjwfPŋnˇzi)d E&_"eep*< qÖ?9ЗU4 0:wTqxN:SL KԝBZf9~#Ө3As/ IT!q)B[*1?_Is3XBOGD|}`̹,Ц:OL(vwWHԍ'Q w"ݾb?\QՔKsߩbt#G* ke6CRŀي*ļʐ*BQE`yBj9dTRJЭuѦ¼RԊ*BpbXPœ7?TjbEʐ*BTDWb#I)"*}+hğdYTwԏk -))9zRuF]dc%s :)r@&s8}nm4:UHl {mp- vٮb?IgvffTTd݊D  gJWo߸BS K OUUSS{jѢ-{˔Q[ *Ÿ^st(ѣHKQ\x֫5 QC(*ZŌG0 dP) ޽tSK`Ɵys%mJT A.գF}}ϞT:f b۶VPژ1`Yw,-{?A _ a ]!2}Mp?@SKi q8.T+tKR2@1wn.*9Q?ʘwٳ]N#S>On =UTˑ# FT.TP?͈Q V(/G BDBu΂#GWkk UCqJIT/ʺ!"B@<>15$!6ߒ9<>HDR>!6ı|~f7p/&T, *77E[?,ALX wF-iW?FбMw~ж61RaA.U*9 rbRBKsBY,G*jn~H!U**FmUtm[S)TR?0PSEXP⟏*d}=)& w :oT3S 1(ح6+S`ِ IDAT[{Ua/]]X檖dm@KAFZ.UvQT5YޏV& 䀜9 BTQuJpxcd L.ףvОLREjϊ>UDWNU\:REHeTxT^-`@#VLoRţGYP,oR?U4*dQɻ~!`\(~_UUeR]v|J1Cjv4L#El61H GguRYCfıUre}jA UŶV 8쎿5KeuP" qBKSKTǶuO"M:38%5Vc1u]. '90 P*!x?U W }͝;7nllܹ(qW|jU%%5@N1?CA9]45Q. %{ 9]FYܼyVc6mbґ,1xKTU/Zhʔc úu;Z۶mӇTkQk۶}ѵk#Fq钒 UPYSB[QmMܹǎҮWF-'~a,!b5%R:=,I _Vi)4/߃>vdp1(q4sYBݻPCabIn.@D,F*N%hDR1YUqV#X`"NXR'L~[P1!HUZk5 Պe~oQQ6r3C? 3`Sl )+*~]s 9k eg7v5?5N |$fhs;ϙb#P~Fir*b *R?"RZXK<'ڳhq֭}`T7ڶ>@ |oERg?%rIIsOU| ^ƍ UsPưR}AVQ[7Djn۶`{thrƌG"t~䮮]ۥ˖-7a*)hM0@WuC^;u7oxѣڡȨQ+V,@[׶m;~[ES1f u5٦NU'mԝ;ϝCjҏ>꫞=_|񭷖.&B5gyؗ^B,w3.$Yl?4 PcǎٳA`Hpej c) &$ ߚ߱cnnuu~))we.E*H ؔ1J%7VSZ:kVjo1`!%:]]!g +YGhj\cDe;wb-g#&ΒCUq˶+C[UYH˧KBld A(+{rwIfD>|q20d+ce Z}I "-}./NKbKykpK] TB*v~# MyXXxlAA~>/X8晕+W-tTBS^֜Q`EN/^ =BTـ[AGl̠w۰1wr2ĝobcPfXd0˜~qRM9o[@M͚h}0K3PC J!DԳgwr}4lؽ;Du5HhqzŋuuT3;w{⣏VF9?͛7 нB"a5 ?5׆JIJ(8 5g"U3֯Y?>}.ڣV) GvӧieM/ RFk+gG*| A2 PK͡ե \ r԰fͪCkR˔:mΜ;[^CW_5isK"@R Y J.U 5@T\ iB@ bM 3fxMy1P}:N،' P IjӃ_4a0QsYlId3݉4nO6&QOfNX~O >Z>)k!GH4xb.4jǵ~zDHoPd6TqwRŗEG⋣][Qq??qo?LR/MU-T[FTqP:a06_LEwrGxV PϏL gdT 0$v,;Iv^Ͽ|EMxnد_۶ǎupIӱ07*zYQ0ښOd;pꇇob|l#/,J_t¼heTsJH@;bC XT*uem3S_n,*2*h_#d/D>)dPDё LjUvvu5Mn.VgcmTQ]U /^̙EZ߾}Oڳq8<8jɓ[lٿLA]\vmK?RIUwT?iġ#FPJ֧ϨQ3f,XD,@&2\ԍd}Sa xOQ),?>ڗ_BC8䔮[w"rJ'OF2 lV|2%;T;\ybnMRS) χWd")H 8t1dY Reג 돯cBxl)ob>piu-[8|Zۅ|m]'83Ąg6&vqzn1UaN"& =Q\ Mi:V& g[oQd8p6?뺶֦bZepeRPS~yk7%b>s9іO-r\( bys3sѱa.Ze/}mA`I' }u5+USj'A;fWx5k~TBgtH*~V XSTMS+c+TqQtl 7Jk?T/CԆ +*8t 5yͩBD6hCUt[sSّk5}T Jy[;t(77m 2tYe5Tы.Ucp0>;fFMn7c[I 8ՑΟߵ+ZThoLq$1a{ibM &a`W_2ӋͻrU4PbaJZ.)AT&]Xׇra*TV޽6sf׮p|S14iPU TS+uoVTߛ!UxDĊG?ݹ>@1oHe% QE^Ǐ]@{-beizuRBsJtr|x@R/>"54} ˖-pW@+@kn?_Zz},T0|5?-0 T1~5PAUtL#3jZdg?L۶^'y׳F~619+k߾-Zju*uwm&=` t=fֻᑀO(E|-,B s2q{:oIuXњb-|4,_r\~#Ι9ƢJ#w~%]#Lbu.upƫz'm̤v4\K"Tv,3w$U-TqPqѮ*(x߉*^?k$◣ *@s7UD+蟑;*[9M Һ?Z1rz.Q?7MMr agϞUhgeGSY$33 B./w}@&TJ\@ڿ u;nL"bLL ;簘 Iʉ2+I'7PڽMSњ.%8bZˀ ڞ-jaL9s*'T bњ׍/>]1cv'Ux&!/4XP,6NKClC&>Dd)oEiPLj笁@5kHOIs>t%,$M@V)ʞbb5SΝPE91EJ76nD矟2e * ~=b#W@kڂнBv';m6b Uok*{S;>ݻ75 WB @jn"|p.::R]x1ʍ9%K4!RG*yHuO8qunx]'OQ\ {w4 p k*^ٳ^@ Zi,xTTa֝-U ,U~s l~FU&VTqPʼnGKAOh<.TzQgp[*~)Pq:Z"]%tORBv%yx>%ctFF\!LdLI`Փݚ*BtGXԲ3슣 Ļ#RbRz%. 2ۯ^9!6$'G.U,t/N| %PґdGFz03tZJo۳oTI ƳڊAdv>rq=>[WJb NREr*62!pz$tlBsۇr٭ZAJ*WWo,^\[MQܹYsd d50 5lXM6lCAqcG|lkdTBFΜ5P`hѢ٠&!S@?yT1o>lׯkWVǍ{A9xMN.@9لfϞlt X7*<|Rzt$UOU܉ k`zW^UfS9J n؀`5l3dBl}l^?82Kh^<yTA Q_0iT|C ZRۣx𲤦C P抋ڷG |vmK2䫁R$~ [)TaZ]vzX ~]dD!z[ C*P;`eFlyt\ h"L54p43s yψ Y ZS{Y l5>TDEkWGQEx&rgPEzx "*V*8TxgPő9k@7~zP]*~hV3"?TQz>I*} W ÷!TkPK5͐B/=GB QA' h*05.Np::W/.Ɵ"}e?oߎEux@_wb|/:0%y? g"O򣏚4y&MTs~QcA({mβ_wx1I*5z2A-g*GFm49`'O^p$6]k|n*T:bE*l/yWM5o*}~Ⴍ+bpc bGׯС7j*5UT2jzh4`_|_AW)PDmE2fBy=;{>ϣ 55#Ơٍ|G< mU .*AJ $ !x1ijЉ L:CP\Nc"_aFk1[Cx<};bC-uAs(sƎaMY./y IDAT+H3Tgf)m3Vɜ321>0OV>NqL=4li'`>0&su(X=FJBH0J$BiСƹ>K6yY]!QA; . D*XNT/R"wU+ &ASxmQP[TTh"I?UTLS>BwU nU4%~S1h)BҁpU|<\+`s/ ]QRBbospX,7w!-A%QCk8\5)G?vF;h! @HhV1F< v9dA+&UB=H\g7e>ct!lr8KT%ˌ~3hmܖ䩀8|/%cWƇX\T3r @*- HEBlID<ɤҮ]gl۶gc9^I`1ld'+eRRHl\8Mu#V((vW;}||GQ}C9b#aҤ4X…e˦{3f郠v@˖}5U6m| A%d{^{aFjBJ@S?68pt#Gg"8nkhHY:hDSډЕ¢>8ʼ)y,xoIB2TPe+Gt?* ~RS:⠴ŵ" fCø+NZBLX-ٸy]>@7t5"UVJKCPa\dHnTBHު5ݨ7_ThHGW×`|[T9w.jƃx_yeRc~RbD˗U-F$x )5x6kV\OeeTE4UPKT4FwUc.e^rBjd]uO҃;{,[)`c&Zl<3so}[ǔ˦}5 % c~% $tf &NG|0yrJ 2z@d$̕I1(L]œu17,|߳lϢR:"p*s*T*Hk@Ɲ)cG!I?3U\oH[OR]D%#ISA5TqgR;*i xvOHEku@*ҔrΤej=&R 8fwx;,Yu{h|z:r'f *7m>;[_2c6+&=}%Np47l0s=3C[ES!\*$=$a |Hach`O!hbND;]N:T:L)Na{;/@j ]qbckflg%_MX  ȀHuE:P&T+eqJ1kPܰah$~tjr@֬i䭷z4Tj'|0~<>u HS DUb>8)`۹q#c>bvUF $wiii:5h,=>F7O>۶ {7%z7ߜ0aתfJY?YJ@L/CBQ 7mکӼy(j 4j2l tC AqS&\ѿR\Ӧ!_o!_ye] һȑ8p@]]@ʕHKxB!T;jT[den*"ʪVu)_܀&TQA8Fu_BDBV0hTuP!p)S>ǭ]6"a<#̔$` Pv'nBˊ*ݜL=csT8\\ܯ߱cǾv׮㣊JĤm8M=̰4nS3"FMfQm37NE]- QNҳX3wCnК TQ zut;*2ëU!ַӓTqQ)pRő+*^nQŲTX[*ZA1I?+UUuREr+&~RroE%z Ptt*R~w;"3vC Gŵ Ĩ &Lޚ[n.*p)C.6Pюa=^ UDܚ!f<͢Hz‹al|zs'iqcJ|Q7Noeƕ*vSja ʈ_PkUԚ^[NQCԷcW_mPL'ZD H#ڑJ"AM`vvXC=tȳJIYgZۣյm'(OJ9fH[?ɚ_~IGQ\ڒ%]TΝ7J?7?g}^qJ,ee3 2eʥK lܸb2.\Xv޼#-5jԩS_lل :};]{t?{{?S1U< /( #U|ת}]N#Fqbhbn<uW\i4Uhvzr*REO>9vܹ7SK8QTA 6kԩ R|K;q%A'AX-l]~}㗣ODA$CK5" MP?\ƌ=j!A$jA..I BQI-G.`36\ #`˄TA.eP-"g,ۧ0Bo)19ho69]YƝL6ǔ6טLH99xڀg'"\$QV.#&OIVs$>z o kDFLE |FAls鏥TܡT1|HPř9I{XfDl_ T1WOEr=__,I?#U.UwZaMsITA` wfDiP"QS 캹X,! +Ss.=wO- ?Q Ξq1 y `2U8Yn 4&/є"K2"vTMoRz.C&/=TNd0w$(S!zP%VrXW!t!8xRqʊ/6eg$Pij> ׯSk@QJ;wnZga&< (U(ER*9%1cʩSﻯڸq},ovU1Y:tpT}vvwGN[L4iϞ+ڵVń M~$7- ?,|pz'Pi6m, N,fضm+xMBEjf52MSN9s jPJI={d`,bIJ PxTѽ!QٳQR)xَ5U-0T(!?_W ԗ4RC4D׈Vل&Yr)IԱuG)9QpkiD쳭<.[!dM@OVT.wK\UY0IA?U GL p򡂊R8u9ycY_)\*q*$a^&09T!;eX;1E(C]@؁)(TSc+T֗QEr jH藺_*JT|r T1Y?U,?~Y*~F(T~^VuS+TQU*\x̧KK7n8&7%q)tWAq5>Z1 ~yKDknLW[v+lZr߷,XG)*K GMTDs")DvvC&3ZܤGz 5-Q{@\Jk3LX[ذBQk 0w+β2:MC?gjgrj5mQ/g82J ZZ &!h+Wڷ?vwݺuuһ7|hZYsgTYkY0MT? L ZZ>rdbUe1@ˬiԨϸ5p"jij(VT,[{l4IWRqt 08Q(^42& 2]Sh A6Γ4̩rH&G\";J=Pm03k##y`1q z@@8Řu"pCδd!6(T\j*&>p5ɓ\f5:[k9ptRǎ Ax#/ ]rIq~5_lCzv3.S$ 7A Խe!-l]L0MGPEhPŰw UQνI=RE5r T~2{ſ$UT*tK嘜$U8f^PoX k,UOjQ]aիm]I5FdqQ 5wm.w"9{\155g\`Cq'`ftHaMM@6eA+.D&GCo/]{ @p9{(IpmXu Qܨx0+Ǧ\L9֜%cpHP,+؃,څPEFN;N.rժ4@ Μ :szE.]-4Wӧϛz=&B8p˖Gwp>S?PWU q 4T(́Xln)eB m1TqťK9s}RR `OY9 /$E;ytg|8dq"ۃ*jښx,gdddmb-'2+ekΆ*b1;#b΋K_o | }Kh%#IK.e8g=";nBd6{?*rTbR^sQE(Pŕ;$UTbl஠E*^R2KT3Si*C&A񫦦a*_B*qtr,şd*,..9UWkc)U%U__3?XѮ}g j,Y"sB;2X`IEReإKcf|s:J;1oDZfUI0!N<q/$˫R+ZHQ"rCD)VV q\V=>p?rXԄu9qb߾;T^J | B8 `ѣGCdAյu̟#G+D)H!} KB Jy0 ,Ydɴicf& "0C*j^}vܸ_nhM͢E7ჍOZC˖ǏXqс-p6hɓӧ]lوkתRp|ūJSE5&~;x?-[?zy 4iР[Y||;׭jUyܹoixSǿjk|A/nVUvY!j7T-cR$nprMȷ``&@C1u߀Fb`,F%1_h S7`d'd, w39A_mvƍ\ #V Q_#GcK! }UD͡ "(En_XZ1 .UkWE ocvЂɹƗNlVO}SS+Ou~&Rf]tg]{ͭY$-aXpREǩJ*o*ITqY>xPqQE͢Nە'SE3R4*Y* ahh d4U G%%v^o=Փ2*v^nh1$g.ft2 NH-eHA~_~K,o?Uo-XzvmrE=a"(ѷ߮eIP]ڲT n#FUrԆe{[ʹX6+ ʄ Tb&]x"@Xw&ԣ+\k78`Yc'> ,k%VPz q{;vdg#z02 A"mpޙ3x'H͋Pz5@J+UJӦ!MիړO>йs@ښ:y8;Q;6hʔ\)-=~|/]‹wyGQ}t{7 _xa xU5RF wߡwߵiӴi/i'۵W+V#,4i6?\K.Mc߃W ko^9{ W>z>XTl'@@8ME׮O=p!i .|_ > G"5B_МF|H,n$->d\->]C;vZ~To=P.uys&#³g Wx>>23'3>s}W_ؒWnΆu%% ڌƳ&'dzAXNYUܚ*Z(H ߕTґzJwލTqPMg%~REٰpWQExZx*I*u`í5KO=pBDVՐaB `|T!"'#8)4e GȠA͛<9b](Ȍ} t# OȲ^6_e@ěoPڴ!z D ~\pڅ in ͶmޮVXn <ؠKK!0oUh" ?[K&B"5U*f\/_fQ!C нinM3*3! r"7 2;V%dLu*d4 .0%DiEmhH >zY1&ھz;C:l51Sd5Up&=]Zbp{=Xp &e\G`~*BOHi4/91΂UodkS} y+*@xxVB]~Tv[wM"}9@y if>v넭F77(?*IS2"zGUԾ[k5PZ&QERPEZy@"ueIwTaQh6LTШ0>:YPIɾ}yy@qTaHyp{q#0xrf7SC"31‰(ߞ/$bd'^E<FWڄ}%afxkRH& vLIF=$2Køҫr",@S.KBI3\Hk99Sojd2 k)"]Je@ D| T=>FpۑSM/Aшۄym۶ Rd\ݠDG_}yfP5zuoy=WOr=WAk{?ޥ G9BihO߲ejM@^iӦ}QV8Sw|:}]ӦB ~S4oޥˠA:RLRhvЭ[߾)Y*l7@~WPB,<Jw:jOٺ:t)ϡ]HK/kժU ۴I\"J,KQ4tD)E@/+,1nqDé8M&7PHWI$K,&?*(mk&Xe8!DFpۧg 6XG4AcΰiUGXcXrj^Ěs(q+H|㠉v,<21얈B:M~"O>{&ُ ݹܞ'ʸ Gp+%;V$qSE$r+kzfsUHTTQ}u7SEA0?EzbͣI a'PDk:&!##/k.nfMnԯiv058"e c 7m`!:]*V)õla1Zd l@̅gvt[y+7Q|6YGi=p)q 6mVeيWWm᝷=1:{ }8SILb}j6d$:XF4՚JQ,jFAYYeg[G`vq6BE! xA@^)@BSQW n?Hv+Ț5/x9Dk*oϝ;m*@-bN-^C)c5klC5 Z©-:~SA 7olf!0 ɓ!& |%Bb*?2R硁)ymҤ3{@ǏjPP WݺMR^~W #Dk"p^*6 Cg'@V)\G`=_|񭷾KaY T3UaJѽ{v6$R7Al4^k*]G2ëbd(SQ[K[Hbh@43XeD{wN|2|a4vR4.&2bc2Uyj,q>5ى6i-=>49"LۈMRsv-8(o&1Ӆ=~qd=_:d)_g ;F"6A GdܿU[KwT [yG>#qm}esTB."\DoTQobHI_Mw'UVB$U TWWىnP+ۖ ݶTᢀ hDXJ+W_Ͱ>,σ&p>@7RR6LIED|[r1>) y+T/4Q5*lLAȢBV:?*bVK2}K6akg1 \掟H8x?HV$e&siRG(I߶g< sZZzi$B62JS 9#靀 JR< 4ki^*ʕH&}X]^Zׯ8|9Y4X|gGAeTy3JǎݼTkァ-ana HF55XQ5wI_0^hWTt钢K֯4I7KQFqB>k"…AgE<%Wy/6>dR4,y~:̚UYQIQQH Յ3F%&(>l\x?UHT &DjBR{2(wiin*١apuu ='/R<_LTƲb*!TL SJ^S ͢+*Q2ej1~ 9D?=el$qհX ;(*X316P0NIyP U)M`99*WZW_H^ ٰ6p|`FU Z̔ p "l=M+P{'}GL$;g^d \DU؋,P._X &Ċ$U 8\ҏ.ڀ*^5+I*Η*bIP3I7TanóvLu;>jJ$k(ZLؙ4 ~‚^j0?"p[ݖ<*z)4Swܙy: T%C0{q¨'bPð=gY8CDH؉؞igU(SwFf\pq71s߱XdtYVpYdRbhFԔbOxCkniذSDĦ4+bM]DMP c@fc?Qjk,OGHV;9k""t3SiT2gGU* UHRmO*Iظh:w'vaAӢ$Uk^h*'UV5Jg&¡p{*no(\AŴX*,Ul, 3Tq{SEXܿBIpdHRmM4Wi&d[kܚqu@ZgoP^^P@/ٽ}(Ac]x3wVO;*gM뉋Çᾯ@4._߂*b;7u@QǶ;ЂC*g>dT}勞iR1CKj[HESQJ}c>ꀔ-E\Z\ߐ*&[2W)) .=cǎ!C._>t^Vݰ@P +^ձ>VjBBb+W E?4aL5 -,ABS0J>AEEPi۬)/5CnŽ <۷Ak1}:"QXڭ_`Qv$JN@L(f]W 7۴8Io~dh`LEv͛Cѷo^۳{ftd"pС ֘1P . 6U<رK$?zX5VPȑ'._uׯ@¡ V*E\4U*Y@(A,U6CqqJ +zHy~> 4ʔ. 4D죪\3vz;J%4@eP RocUǤ =JD?I v=;5Wp 5 b'2cm̌Pot9!0֫>p5m^ &L [9plԇk%-ghoqс6jPQr$"$MȧFs}'nPO"ӜA$U"C%|@Ei+$U PŇ^KRKgCObIPE$TQ>&G.L*nCˁޭS6:S(bͺ5rGuجdwh,g鴹r)?*3 :C-n/|s+_Ob?vVjkpnzg)0% QLk8 lXE{9Ԙc}9\LT)k;!#ӭC޹Bs<  )Cy@r\^Zz^+800$_Q?T~a!D*Pzĉ,R 1E,C";_սӨ!A怰Ab>r@R:yޫzk&H.?@'R>Pd\|ꀌZ5(Uj3GxcTTsPּEСA}gZȟ>lwn.\`}^ }5i8r Ccү[CJHQs~H l9x?߷o˖Tܳ[J>(s #)P PN{;ϝjAb3HHP@l;-۷WWjկtǾ;U=W@H30hTXj3,(~}h|AGS?r|HZ6\?&_ȧQq"9ht`o/$JbbL_)]췳99,`n }g,$S{I"lUߞ.5JT x xi+$%h-ܩkBŶ> lm wk7)>2^__>=Mr>k* v"k.'Z)TaCTq[RrI@NRIJ@%IfREۨ ۊ*#AgFe46a UH0Ad76s(Jjpeh wYBB8 BEMjpM·!uVL.#ZKl%;oPa/* }+m P ӊ Q"9-e:b O0*fi\rNEBޛvR85 )OA(X/,E5GgeRSNݱ#B7[PlP+: R]p!$5U9Lj^^W [#GvFhU@?M嗐\MKM<,Y2v,ȧJ8 : B@D)}?ޠAn>6{y$ʚ`<0NhLa Uc>A&"4׮%U0L9*p?~kw놘Mhk><4XTL49(j @ T⋨Tw0˗#R)S j6hk"Vpm ;v Fa%RP+Q@f 2юUcG@Ja}IUUT8TQUEњPv6@ *J#%(:}f̒S$BС]ߴg8tM3b0p7 c{=wx?kHV!9=UTM]QE@o>IU4+UϨJRō"3FI-ORmGzrt:ǡ_=7 c+$&Rw1ֶ_APn* Iѧ%ILIxXtMShwך|_G4& ɟ$!?6XV+ja:- gZoV52,JIA8\>gMu\HL*C沩ݪ)gRȐs#D`& }mf =z`;yDRF(Q~juʕ,ERh/LXa&Nػ#N|h]v=# JSͨk矇G}PϢ+͸vѵkdePl2}:0SHQiӧ3BQ ٿ50LWv?x4x@:thٲA--aȣCU?dC!s+ƍYm@R)%S Hc:hтJڻw HK:*JiSvxBuC!D}HUM6t6UUSx/$VSY`s>_sxЎU,j­%QUwyٖz9֗GC836!TƜ mީ 36n%6TS,]XrF{2Ӱ5/'"o&2c zNbٍ_=/yܩιdIo,3 1hrsf`q=8"gUA0PQE$Bۊ**2jTq3hyuPƝLRD*V%fTY(_Z TQD`ER[ ?*5Lo`#!7e૊ Xvo IDATŽMmUpcʁ jXNvkNwß63=X ɑ~(HQ={Ry ӿ&C wOaaU@_KD%8ܓm\q9JpE uMCx*NKUO3Ly`P󻊴6MEҳgH>Գg[Æ۷Ϝ)./Ⱥu/uu#GBm[[O>uJ a s-իQtرO>XMP5*WmSr*L7`~-C &4 0>jhJ݂M2F6֮0Jd?O,Nڷ/J.j䩧@,į xQtd8=<{!j_}D Z ÇHMEEx L 7)ZV² lp^?Q]B;8͘U(Y)//[0Ӟ> trzZ=M8`|'22RRଛ[H 5Ew;-Ѳ \3.3*Ԑ-djjWa)ʜ`2l37 kke6-m;QR"\C̲gt?W߬8؊/u.~b6yBW͜ty:=O|Z[RE$MUmlۅ*[eh*nI׿ۅ*:Rm|YE*nEѪ@ZMRMJY*P t,s X[QGXU0OtR/L/|*|њFO;ʹD]IRudJ#WFe^*{csRfnV TNCIvXeWWD!&hĥƸ` j[ژ ݬℬY'l?5Yr2K ̅g8'2d VWo0y L)0:C-_޻7Lr.C4k~A XJ{TAn~ FWc L;y*2@#{#6wU7M9o˖NP}te F߽[0x"dѮ5|*P2*XTg1?_SbJ=긟*45ϝ{1* T)ݵ W۶}WuuܰeHWY((B J)2WYYMHwhӬ,(.YnA 88b*0@%$a*XTt40 2P19na`"sMY+j's笘033C2<%fOxyR@jroEe8XouDmy9.UX#g&H*rr6$:seOrm3Pv³,\1!F%R[pGsPnnjFOIk^\05iCoU*~U󦪘I"SpVTq+vT_ہ*+Tè" T|Mv*nhUƒ=(rLMj"Qx7t75`Yo39њrɆ²↸E WfBpmWy En߶GM|0[KR_ ,ʼntKq[ĵvQ hyMf h.Q_33.f0sxu(RWJ]ȭeAuXfgq1MQ*=ŐU XrL^ձ1Jٌuu/D~Y3 ']֬y Tnu Smf䓂.ئM6'6 :X @B疾ڹsG-(_ZYTQk8X?xם-wcI-+F0Ro(1t:G@f*j]@Aǡ=xYM2[ LSeeF8\l<3Ga*ȗ7nܺaK@ ӄs#A}ѣQx[ hv&޷*XLIٴ Dl@q^^ra[I("2٤:^@T-E 6Qيa>HɱVGkbF/.--*_*:Cer ݣd}&ZsK,s-O՜7>kaM]]-kcpū`bQNj%I"˛SOd + .PǐU trG`ɱɆ>B̺9l C{(59c]ǶԐQQL޲SLr2 zc}Ta0 L`@²4.-m%3 rIrjNֱo@o5ﲲRS߃W$ j*CtYӧ]RI8u+B'5kֶR<_tx=4R -jbK Ds\ha Oֺ5BȹT#GΈ$1c %,M<|˖ǏC _?ͯLQњ}L~=w +5BH)GU`)^NLBKEk*OhUS*oKs"B8z@Fn,*ڸOzܖP8 Ԣm’iu]oOy#\<:8Q)df Y6ۿi `yZ '3ssnMPmAhP}y8w9}Ƚ+?ǿ5U[fj1IT~ _;WREZP*~Utp?WHR/HQt9$U8OU񙤊_*5Qܘ>{̙!Ael_efi{nS{@N"}Nt] boOT]EI6Me·mV+#p052m\#vRer֩S\҉.&'(k:2Ȝ'.) 5T\'~=F9w]Z2Q"-։J-mHW~wGEVDÑ'4.4RJV-b!O rgԞbrT֭/O? =k+^[t)ܐF)XDl SʤR*hMTz/@o1thi њSXhԩS۶:ծ?W7.Pt{ɓ|{wȒtREz-R^Q $.+ݶҥ]rG]NMEpt=n(^N W֙Gn n\ۤsKA7TE ?<`ǃiihuCn}Rt%1Rb7ԯCL*7u2^.0)ݮ.g'EXNUh:= {:%QGkZp%RɎ JoXCSD*,LS ̛!Ewt7 om=g:=b]5z,oeQ0fr4f8T+vQ_7,ĐyXi|?zy6oQ_ޚ*ĎR Ut. Nxٓ_J$_U 93$F*~U(⮡ Y>/\/FȈ.-}jE*~ c)c=b=nTؒRp3FZsƃ$UTS'hwURlq1"/m_*r (MRşI+TSEJRPE[$UxrLJROgUX|g"T5cP߾U. ^jsڶ8T~8U`?7krLpO1!O3OpN^;<5r!煶LN=@s)OXDYa&DH&tƂ" XңǪUXٳ;6;2f6 ~Hrߡ V6IhXUNlb)aRgX.bB*aA(2vٳ۴ YHINKM QzBJcǶnغŚ5kB@5AXM&\a4檦Νx@tf),2aPռJ`l{tWǖ~Jpb5wZ} \  pB4W-sl)S-ڸ1H"5 9({H+@ΝdĪb5_ٵKԯFV75/:56eZ݈Ѥ;”b$k)n*\Ӥ#GMδY:Xm!o^9o0"Oz&Zm1.c|bm0#acN29 f)Vkg}KnMk.HkU19 )_0͝2))ay)UYQ;! c'U9E!\![Ĵ?*hωQIP+)GgI buxx*@(2%}ǹFwU@ᣊוN$6IUhIy"rlU$UYTTQ9&/I?/U ,HNOR_D~BTPE *TPŖ6TsRi}+[TQE8 TQY*z" S TnN6ݙ)TaoC'22`+"bڇn &KS =(j) 2P\ݻQ@WL((, D5?FL3`>AǦMkÇ#L!r)7cjH)JBkD*S"<USERȈ1뗂UUiSC52_ygWW`xҘ&YYRު;d)H͚g**inː@MgMHـSKIpa&>UƜt:TMK.k1)bxc!+Jx{/3 4Eca BCPӣaeT9}Û 4މ:+m)G,$<]ծ{/ u](G OPEx*rPhTqTq4*_NWKybZ/&sTS?{T_⫢BEE$G9UzZ<#G_UDv͠gǹc.B/W{vUp])ZRB:`ګT<Z"gjƑBkKuo"k[d$+-y)؇&$˗p]G& 5dTv'g!xEM FW^p^?}ڐi3}m&C-pd xAـ$lHMinљSԢZ,ÊhFi p*hJ̊8jV ~@a˖ŋ'OT>~l ;Sc՛6xNe5>} `A6 VL0l؄ ]PdfeC.:J_iri-^{m2T~Ofx}k&=DXp|Dd)GM5Sxfft*0DW&68zLc TNdը tΝGmgΠ,)Sv/EJx@ LJp3zf F[@6rQkݰ#'gj$~"1$P 9mIZM'x4(saPSl%l+S)5Q,,iߤ|_+^GMqNpέ`!F .o"w+x=/e%;e&k~*p|2V>)*AC7smLa[ |"en=.TP'd>MqvjL)òƑ#GΙo?#GVW73_J%T~Jgpx i2"+"n*0 IDAT5-Dz -qHLBRֹ-UE~uuXh!C\f7R_ h%ͧ-xGy{Y>:6tЭؾ}z0d P I}/׭gϪTźA/Yxӡ%7d]%Oc߇'? ʒ~ +v@M?>d$@&LAM2`Ϟ `UH@*s*0 2?kcWAlO?#^>`WL)"_2 W)\U\Gb̅j[PZYca+bNu9Tq}7sTqcjnPd*G׏*1UX7S-_4ZS8 ǜFfʈ/8` \ )⁣7}V=gA dӎ*2kd6$ UCx2 neomK]WT3$ڼ4ZP LUmc4Emm)) *(ObMH5B3+**q㯱g?B敢i:PEQl  G/>/F0#G~w&E?\榧;T@RPTDqR m"fG0O>0(ſ!QYhMg ںuʕD? ?0 #F.wO8/7f2q(J i<|tLg8M>Pd4Yt1,~CzJwb̘Gٴ JJ)c +<-}vz6#VvLւG͌6B=t!DD]N< 3fLxqYؿ X dHSxcsbydvizTԠce:8p@ɓ{BJB/1W*."#ihoXS3g _>}Ҥp lP7' ƻ_c^=^@ %II O#Uy>@=Tx?BW/qt)B].b)*=A1?$NS빂)ЅoqTԯQ+U:h Uל5FF).-^w;2ZeJ˘S7Qɣz`}՚Xܩfzc샖  \aN2t[[Qљ3,)Bz%:yaoY%7K2TtCt[oUήg r#qsף ɠ ƣG$Y*T9/.]_KY2KQ}^$|run{s#hpJxSEAFnIU0U,o%TQ6 T`*nU3a*n U\P@!U ]ON^*PW×VHWot(` bGj-U-JrZQ-CMwWٞUWs!0܇ weLDdkE7Jo|WA<2 C%6Ĝ cĀ_K`nM%*_kFH1`_jA)^ ȍP=GScCo-WWRVTyJdǐY^i.F۲Y/V)^Y py1vQQ( 3>0} +S ,=* B&@i ʼ[H6@Wr(̣ qTaP,ܻY{mu4q &@wu*a"L+qF ?-L5nbɛƐyp0N@R߮Iԛڳg cR P^9yo? v}Ծ2EU'u([FfDr9TXjV Č UjI}TqUH[*nU'U÷~NWEUoUʦJQU\wHTBͧOfe]ybW ;f{.` ]`:1b&S")V4Vx}`tꐂ/HaYXO?sHm-g̀ҠAǏ*CT!њ=SAx :XT64Ae*֯Ghm(%TqXeeqK^v|u1P_ >>x^yFa!w7|MF w?<:}:Γ}iN2>pb /}P0`b)B{ذ'6;p0I(3 _}OCQÇ;kA`o] J_E4ij9qD_Q͡J%HiȀLAlDԓ@@3"ҍ_47ˍI :Y NoEx aaZzJ|Vs+J8KaW̆ex+[̩,6*.q4D1Thk 6771˦Ɉ+0砳 wl?l3=A H`:uҍX#x9KZJwuωjC?OMGmɎ$_jzUͳgW5߂TQ/ wZb}ǐ䍧]7#G7*~ ItGWC"IfmkQ"7x2r-PP+Ϙ9t Sig(LC `S_ Mj޻U3D60F;H"ΤrZQEl.m2b*#([O|NTǜipCzQ5%i&j ԛFb! q=q?_'L\)OeX9:M2a܈2mlYhA]$XV[>mXd\Z*w J!$"[OOc# gWW*P*:;׮7Uv9YꭷBz@&N,(rњ @sn| ~Gx"@F棏>`>p~\!*+*ҥg3["Dsi Ҁ"аD]wP$Dj$qt)aO>gXW{8MNle3*^=t4*(}4U@g" j믃)bHeYUt9Tv?:;%:?.5y4ݪF'(]E {hzOO:nTU"*( ` Pа BJ/^ XV* $CbU6/ zOɭ׼?h-U>2I2мMU襡ҟ` ݈GZ\e'm)Aw{nO V.pnT(aUp+rTqtDJFRE$ZnQRgTf--I 4aUӋ;3 Pʚg [6<;FFcW !4`*H^KA]#fhfa[ѱ*3/uXp3lXϼ:vǝ!x?CdX3,QVۆ jWy!JE"e&;kuԔevcueÑ1>5TQau{ԂtW]^7ww-5O?~ 'S۷`*[  4L#5/S:lb%9(@p۶)R\<`Ϝ x6d) ~䓓#FaRGOcЋ/Bl U@7` U; 4{g* +nt1l@) Q.wq78_?_F7<'CN]jV]L*N$;!JWe-@|ACkjIP6 j'pC{+wRIˀM$( ,MFU{Q1 7u]}6}}}ƌ9۸ e-~*1uzw):iq"NLIJ C&uuӗ7xt8 <ÜńpiQ?L; UP*H=T5=\.^3m!`toPg\6qs-{^D LCi,1UU VN[8BdnR[;n܅ o.0VsΝ˗S X9Yqiؘ1ۯR _ +Ƃb{?)tyBB S tz@Qx{ZιEH16\50H_}\TCAO<  jtʎ*xƏ0њa5 5ƌB;am={!{0IYdQ!TOaLeZ7eʔ RT50oVsNР` ~!鄷\q*m,eу-hY'$7_ePg%v>dxHB;:pskpWxT̩S]dN#1:{.>>1]gPp"+ҡ:sݣ&)D U b1do}0iݵGoߢLE̷jwH$G7*ha֣ Z[tMCn(UTsT*:xσ*C*R['Tq'G_UD(c?G)ULE"(Ν|0A3Γ%jt3f ]9:Ls^߁nQ=H:0p{]oJ<.ݟgQP;_\F WL&c4KⒶ^>:m5**!T|9Ƥ"ԃgf{|Hڴiǎw9נT@v>oޮ]L#XBx+ŋ8ظa` l B$J7M T,|XhݍHa'9mPZ7m$iRn r: P?Z*nr-ċ73"*NnZ Xd9qF\:~i_$L7t}R-aG]3;頋ʥ< QoY*Tam&:KiWx{G#dVw.~u /e8We)e@ʩQ xje9`RT)>3U|T1bķAΓ9 T;}jS*_)UJE%ex*mHsRPSr҄iUQ'N`Ϡ ZL~Rjxf_ Ba [Fc>f\*,W , U8یh[3>s@m,bE.] ^i!ptYm|8St}D.AR *ǚ-b ZJ:Ti<@,%TS +X}`^^u5*svj*ƍ7y;YXͱc)(5%`C<{eSoKMt&Bz ;Fd4P&NaDV$,Z@I[B8iM`\+k><:|w5s&kC KtoHsW/CJ(#LS@SS0L^xyvطLq dw*S bs8訓) q A`fx\xG%eP x.\ؕƫc ?(5hTdz ߧJ۳JwH{ Q G !T')9T!(*U|9h `U|Tiņd*UTUvi]*1Tz1o;j9"-*~?PEM*A*zHFQ!/C] <&nZk4gkK܍rnUbP9#՚!`B_fi.p>U;CWPEWa,p}Fӎ?d*[80lU7ݵO+dYmr-8949ތ`9LMZP%%$LKL%dbk%p8˲` (*w8f"mbCz(*hTWo2u*N=* hF45k6[bU ԩwɊM(PԴقT zUPbQ Rq HSd*`׭LL2"(d 4H9S@㣏 6@OCrs: "(K x3#] 0T)P~Pqȗ.{;ЎΞEIKY'R'rBmO7)Ecd0Hi[9b/^DYDV*\TESS%zfuՈG( +YQThn6q "O(F=)` Rb6V3 -m ggLOn71a xUJ[7[͈)>fR㌜.-9g8uo˽Rܮ/)½'KLsbK=,2;"C {1_v ^{J#BəÚPrMg$6N!a, ~|F]^;W>r_9*44sTEP)QF#~xrTEbH1QFXQBfF0UHS hHZ+Ŀ)f*1ѧÌېR 21~ ORw\O;xpzpv@ 5/6/#ic};v<S(YE9Q_S&9tu?9ztkKA= 5@x003Ѩv 9:P{^I@n;~E0 (o2 P3\3@^|a^|b&s?v戀T5$TqVbbxhZ[Ep.U(UN3F*RcǢB,jkx1/̙IQS538߭GLE xQ?HEEsz91`::YE+N`M3sŽui$pjv}kJEi1L&ޫl3.S_Bt>SVċ upǴ/]fɬM)GdfHô@i7ᕖyK5P MYA듟R0\_CuбsׯSy?s362:5%&8@Qոy dl**}Dhl*Ua T&*[P/;G_*CZ[륊ҩ?G_**jR_*\GrT=g@Ɠx6P1}p\*sAG e ;{I+1d @l&seuP R%*zpԘ=1` ,.fժ{O}OC>BAM)cDӧn\qf̨ݵ EJ)9d!F`j СYp|D6+=d6hqBFUen)D1 0k?fh&@Si[#M|ŠVboVT(yG *ܷܺn![XgrƏBBGX|X#߃ώ*tAcQ:nuXfPb+fu P۱XgNMdgτrWQ0TҜgREB߄g=#z1ΞΈv)*_' UQꠎn.sTURE,j"IG};G_U7?駃Pcd]e | $(Q \kc:m~>{~~~OJ"ՔJD x=6lUHm V- yY8YPq7|5G9D K9_y&s!@'v~U,TI=db!,e QuStڑ#b}hgv]z]`|hXvݏ P*p8,67Yfev_ z| jE6va.LGkJ-)JJcrTL(>G*K$d*TP+T>kSEh_.H"0~mTܰPwDsTqmi@Js/A:JÍQ=x&+tk@CRSX*Nw`w9Wxl˖:QCTIm)73 'E5o|& *? TQ 3|Q-8ty3*BHư1e⦥ -uƅ׾YT~l3m@URޭd]G 2_j^W,PV15K",`_zu)*b^(YYhMj)93g8vy3fȧ?bѢEz nXJ S0)B&c}zQd0f<{a6 yR$mr?Z[sW^Z[ϟoŰK,>AR#tG@(⡇ɝ~L &1mutR ~51:~|bD@ ! ?&HTH3ĜV7$M[淕nH h~"oiɾ w'x _+Dj+3A|e'Rro?BCΣZS= |Ӹ|7[W) o6n@=o}E')XK6ޤǾ5?fNjc]x$*3ߟ2dMD^aҿ*)PT!nmKS;tرsFOSePu}S˗S)w+U w#G)7u*Hy+twwكxMxBoE+I1N7YD`ҤQYZkM~WQTSx0e*Sд(m3gSܰA=$CT;R^hی7WF7vrq]*g%g~hNp1T*ktZg6!_ *! DfB+hU@UdPE@c >;g } Q>#$^vUֿ*/2яTQrN &jP*1T]PU\**H*iTƊ.ŊU\* T I}Y`zJjc-# l%@gzf]9}}im*v!AFM6>‡޾APgkhf09UvfjƄWظJƵkQ(ٓDl+j \Sz guwIRAx;Y= R MOOuuP&V)atqvTs؃ޣfs6Nʨo>6t1 07LZ^M &&V&m)*UQBR'%µk;; ,u ;;A#G^vǏ_?۱jbGV7De"L>l…{H3JB#\b۶M6pѣϞݽgC k֭+WΟ5UCKǦ!O.A HN7 N7|8rJ׬A>mjnٲkgbn04D̦؞=Pχ7WHBjwF# F5+ IRx[B9@3pj[()fӟ17Q±0AB4!o!tPk\(#ù9d*v9k7BUCL7~&l/<=,Ey6tAɐ!j[ÇloJ^5|㳕gL|1@TE\ocohH9G1[_ug3t6M8P E'Y ZZ&ݹѡ;QWNFL];H*|&fsTM[/";U\l8Ҝo"UMi!9NVS[oך40\*6* _1@ReC*^*Q^5;G#pR*8{I8\QwklVvww5򶶒RfT2cULeό0Hdiv%!k>āUUV]ZJRuPbeXpӨ~ODy'ʚ9 _\ZRmh*JT[<,s2Y\Kf)f @' XX0C&QݨT%y&O9/\7,C{3렣 ͝c1cPJ PFu?(5ŪN@ɓ'++۸^RJ_hʹj*\!F-t0E{ceQWHMnPL:O  `A>z{y˷nD^*Du*ׯ?w'ԧGkKcn :? S\ n(u#S$ Q[9yFExPnlAۃ$Ӧ2# ۤ),)VE4f"i-tp57ӳL.\i ~5o 9pFK!ڠxPdy".͏T[hM޶zD ۈ,YOnRd:q9Ȫ 1T H֨swkPnrCP*do Nv:'sDUI UTv6vj5('+Ձ[A#sT5PE46Fb V§BqIOKCE*T1*~UdPE?BEنU|S"ZA(QEU-bL4UКHKj?*TruD(Tl }맨g@bQ\-,TaG#NEaBtБly;8cF2lQBB%mɬ`CI|H t);}z̘#pѝ6!,hcb!yF/" lzzeQ_LRQ\H]]DdRqA窲jB:X1dh_SSӬYyy/U!C 'Ϙɓ/\XuЗ/_>q"rKA;v @sA7TAn3^RHa~A sOlٰanO U0ZS }VL&ocҤI DusPjS^)֭۽˿| 5:U)eWWiӶm(͓'q)2K.\qoat{LJ!RΏ~)o=#5'O gҭ W(f HCwwY ,0LDbƹ$B% a_QniΚ GAe~aE6 =>6sBsia1tmpBF\HkDsJ5#T[Tc|TSdoBR9H0:k"2Cd1xl WgBoƯo t6F ό,&? : =H'{n O jx` ƹ< YT} |HD73,U By ӗc!f,FvPk¦܊98k\_v7}RES*y5XD1WE=s|RryE(l<]6g4dR+AV3њIuHrupWy6ds]v2mޒqTFzB5өaw}`:<3)KAc.@c]L|jkۈ3"+A<{N,|R'WڱG3pFR|t|DW^atS̟r%܃P U@㘘d \$pٜ;wTF@912; >|"ȢYs'sJ/\@Yy+@*Xqx_56*SQ7*+rT6kNT)W9"\ZuPT={<”5 5F!e am36u񂰲.&؟s+uܢl!7%Ŋ!bm1ejoԃ 4z)0|m< NB8jYYG.vEXKӫI ºu3U@W.<$>` t ԟZ썔"/?}\_ [eDG50*Dr SRnP3f> z^ 6pbPb5i?"Q[Pp<SR {BY3QÆ= *Be%c6.ARN~@n)u:_M2eɒuV|>40^;U"$S5A>73g.A?cG^;PųR\{6`~C*47n.}s2$t.ZĂU@T1kt !U \Puh(8HPr9t@2Ք'VUpDw&O ZHƎD*ZS#C?[VU8glwy3hӕ~ i ٜ1#,_hEl#e]ʾ&G4쓓};@09CP|6@pyRBueɠ MjmtמIj!3ޯ(Q.4VH:l="h,pL:7dᄊ๛}P4n7.G_'UģZn f܎T7MWrTqPvbňU Vq;Qx8+p~栊!999";V܆TqQ|]9bt_+ͩ~n'@^) t]I"ZU ySE2Pu YJ^kP#*\gR#$c`Bn1uZЌ jAzy# d5oc{L:#QYwe{COlhk5>Bq:;Tu@h<,Nww~~O*[?>/E+@Vs uY1rAy<~|"*->Jƺs)L1f \,Nb4 胚XAU@*oH.b+Jhxh2eLyx(O|W^DI5 Cs`_kk+&Fg_x6< 'MeUOAͳg++WB-^hh"}?"O<|5kPi`ȑ3f0~ǃ),Ь[  ESRRQ ` 2F=D<.Hb z޵Śh T..ij1S&VKTQE*U_Rw9#Q }>N2de4TA(224UΪLJp憎$s@|  偸;9Ihl vKLͧ}ؒŌ@ ?xmi^E'4SDPv3y(1;;T|5NzNCHcMPF\EA߆h S.(QXw\<U.UfӽsQ+9٨X ۗ*R}EjN[ vRE`YA߂K- 2į7U8+c @X3ιZp2Ei:~QJhS, 0X8ܗMqǢU. >T\.AU9_Yp;q8)oDc~3L^j*<ō1[95X.#慈怸\Oj~\Uj#i ͛ﯫIMMR `ZmX mT2"؃"CC -[q 2<?YPtC-U TPI{R+|4@\a6^8":m Ǻ%KTq[%?@AHsԨG9SD|\6JS̞=կ~]BRXU@E H^9yOa%S %JL1wH)$*vܩhUx-\/+ `Lj5,8x<G%IYa$KD(s5{Lz m xqng؎G"Ns)Oa]:Y0eچGc )vb]$`o,g2gnJXͺlhuN4FsMoM%:)n*\?UPE`{k~ sط?^9(_^^_}>^,:-J?CBB$ٓOF6{K͒5֘vTnՋ&,lLPR*Ր⽧+ *(>ZǏՕ U#27"F]dx@w"ݺaP` U\ٹ6qPiH(+QPYD[!` kr)U(4PG}gDk",sq(Wec(E;465PV~kv1sx@iRL{` Ѕh"`S"6QAjѠLJSgr63q!Ps6 -Ym@JF*Ӥf߾UfL+ 1uZIhMӠy;tN+lH*0vA沺cQߴs5(!l)>:q^|iiֵTN"!:Ekk a=>TQrh*nZ xSn?(*F~"zQşr r3Q̣G*Go0U]*|- 6vsc x M{?74TH<{a@I;/K1&)Þ9IV:|3Y4ce?zlVCjfDFrz%X'1y(Fc], EbGu1~4"BKzrU3?1$$^3i#ɚGӭa}4UL ٹkWmɃ*W5kq]!0':)ݠr O*4USlB]\M)yX>*!6Vnv2w0@Jk z!SR:)dʕϟ2ᛃN)|?|=p}9jN9e ~%UX*>7 Urq G#ܹ>}֯߻Cc@NSwPi'._i҄A֬5Ώ MMpP|(P ѣF/?OPfuÁ@1$ dX ;"Lb xuj zL8 #]R= ,Y)1s7xcrc:X!չ:lC7PyN-.|O~`]sYRn_oI8gG"/?3شDa6@tz Z9fR0A ={lgOuu!R %@B." dsEpxC&JX?o_)%P&5!t_<Q K= ǎCgNwo3@)*0Y?0𭵕*LA@=J)+n]k+65*V Ge^9Hͽ{m3B?f (]Z W/?F&p!-_*7fW%v!Sڐ!fvvT8thI*M_|4RU0Cs6ri&֊&|%f)o'`ܐ70S#1B ']63ζq7_)=1F|GAMoшFŋMkߛ'ߔH8En-'娳Wn#B1--CX`4ш<"IlIgVZF{]]359R_񔪝KhLÅUDJFՑVÅ#Zۚ19PEٝf|~zw}wLnSF{C*8?GPO^B`=`r" sDٱV~&]Y⦦>#Vev8{9AHb*(\z9q;PEǒR UBakPEE^^u$A_*3n}'বwBAoћjrvvaJtt*civGF9#Ċ ʎ])_Y4{%0MDyLQ;#a?^p>r\nu?TVPECyxR]Ŀt:L۪= XѦq`[ IX,}ø*=qBAH<Ϛ5k@e ԗa*TRǹV/ W$S۴9Bo{Kx7]_i@4R4=wɤ,NFH2Hi=X <R>@4߈O`c٨E!H:$8 IDATc҇7i~IH edGAI)*EPPF#rsP_fɥ[ 놤<H"S* @] DUUtQ0VTMTss2@_E@Tu*}l#}t+xMBfj*MiLLyyCt넾Ţ2pF5j13 {0R~ L ּ:UhhjJqy.*UJo+MEi9Hˡ*1I0Z[&#±>yj RE {w.?Sؖr4ziP#^yڇcfrF )ROj ًh E4nD5V2<c-GUK[y懿WTѳPxG TBPwDTL|[* #r]a2.GZ;E]߂ыq&jPƷP^h \ ݦYs AȻV>pB3\/Dm&,`O?wMx6FνNT4WU-\MpR/bܺ |9gvmrBv#U w o`Wdyrһa"=;YzTF[e }AQTTUlwod) ]]] Ha!EPDk.^< -㨁n0Vرcj3,ݗ/#fu WkA#)b!j`*Mٳ@m UbXCTFn^A UJ]msL;\~9n2ŹsNQ};! 2w.J7/JA#GC)7h_A 9pٱZ,T:/j_&QcNi<'2F 0tHKyL9Qúb8 ̎sTqSşKne?U^hͩ"~Jw梊~yVܺTBf8fw e/Cj>ѥ+[`z[3.T`#ńrp9뜾,{TU^vNX7r\Q_)ޕ9ĭF%%%yyMM--nϠ z[lOW ވJ.Ȥ 2rǤ$ WٔE1X#5a,`Pk+DiβR6T&` @_VYEk"Zpy'\>9hW*v}O=%Rk dMP< њ'GHhM: .6 Q\\<]]U*DYq %S Ns`p{†X .]/A-T2"OQPݯHc91tѩSC.E'@͟~:1ZUW('6d"J:$G) (K<*zBC঒ @MXO#N%*t"S @9o@%qC7g•iWH>-_8Ǥzs0U8KuV@}k+ O'_*Znoyc: SR_ɍ,*RDNHH2cr{"ڲe fq㐇Ӟi*F*EMЍI1E~qU/A>sI~ƂTʺ޷-cبz[r*qTn/-JgUT1іyg[*ŝ9m~QqOqQwkRixX`Ϥ cN摂oea{?8Life-yTe(aÙQhWڟΰA5#-0Zݎ*tu1&)f۱|ոIQvwwvwLQC>kwۏpq/]Wܬc9|#peYvY3Iڬњ:ĔfTr5D Hf< 1$I1:ֱX'D9M_n9R[ 6T1oތ Tf px@\&;v^ c)KLb }`c@P0`zu^dy+A4A#"]u\L;Rin ̐>ߊ)p/mږz& >H᫷5.C&_>$}'Ѝ'V*֮e^ڵv:*Kr)Cj){QnM|c:i :Dcb)En|N+7rZp4\U :nvʖ%8u(TYL3jmyw"w/=3әC%lkm=!~mfR55CT?ƃsL<Y.vUmrDch*ˬNn70擺(Mo|U@6rT=!8+̰d(p?0YNl|@: R)"E,Cު<߃zݢҵ[r9PEe`ŏ_z׫PLrbP՟POQܹ6!RIWSJؿ"tWu]ۄ*nLT(&4Ѡ7B*=C" #*(4(zC =4 jiPBaCM0Q6!6o9k}νFc>gkٲ3gS}ЪUs*:'|9jmz(Gc#h4@b(n%l.3V#ZfA vmuc7UcΦfҹ9)daU$Mlt[Y|r\xs'7uX u}+-coKB橂wm*^o?SF~{Qy(0+@t5o#Pz-ɨ?'b%7P,| (M}9PISO&awCR(lM0)"Vb0P1cZ9ۆͩV>w &+"H:Q0`x*9ڈ6 'r+ݨL MT`MLa h%8-I .g>=T1AGuP* |AXǟ\PE\S1.OQNqJxQoC2)|ܨ(g*PE!5͈RTPŗA TQB T_v?-TAZ,Eܬ*P1뇊GFz6 Ups6&|вrl8ric4F6MuDo[:صҦmRl7d6tfn/%;WQK ? ܌MEJ[mqRӡۓt%`I T gϞ9Ǒ)^/ P?eGKA{eUqz*-rYULqAhDu5Cu5^hnF$uŠpB̫ Ht[m67C\+xdT44TU!FϞWHؼ~m!`)S.]B'NPljThyە\tJ9KI YnKX]MUh i:A@(gT o@w+_A*ųh9 pC)&1u*z BT@%ZD(JɁmSfe33/]~9CL=zF*(@5Mq /bښ@9@?|X6G d"v+mmERTT? La?7ܴI@];}v) ,VB"*ޥ (%U@c@%z#w9a>Tֆ<45)KًtaPŬYdTK.A٧ 1*Y9?."Js\Y9*~^aB=lDF ش{/]ULL4U <5FQj+؞ԉc7%MxWH{ bĥ5-t̯(pM h@UkqO?3G}.BUlEٵmMVg?mshrO[CGH3F<DNUc`Wor̪68dosn51vyvi=LE+s?T᳧(^񒸾DY"' TaKrVRTDS-pMIQSEj" Un\re۠pkqvDa8©B㠊4P["tF'a%o* U=q~_Y 1 Kh!BwTN֔#Ʈ#sg@V${&c0Iɉ3m`Jd ثUۯ܅*dGb&#"둼-- h*B:0LO3GnSL1wHwY#puUj4TWWU`caT_Y9s&D{zZIQ,as`]BҸ:'\h߯MMr5mM <Ϝym`kDc8txq׮5k ٺu+XbC|TqA 0xQ+ƌQ#Pc{ۻcܹڱo>|={֡/$e2RA4AS 6IetoT;w"Ost4X QD?@`oE>"K̙۷ceSB XI`d<#GB.pi 4w!UH&),2tsr-C:g  Heȍ@q v7O0BSUEvM 1d8\=pļEkm#"gLn@$ }k}#Z QֽD#1ȓp-9Q3P 6r}m챆J۶dӲz z`)'gyݩ"5ӞXBN 7I bZ\A)@; O醑KJ⼴/E7uGF.U*fÏ*D^";O/F%dpk=_tĸP4pJq(FoAU"c$sdRwIӗ?40Q3\>2/3꜎)3?ˊ疗?R`I.UE#<1@w}M;c[H\Pl*ZcFY-HxhbAx ͻ2)'Q>6Ƶ{a唱sq IDAT;n'y  vm5v& 1E'*yp=2"VdVRTQ>}E*P羻adRENn;]ۗ#UD#LjIZ`q^*d= 7&R$gW_?c<_p\/GXdA1)w(&UzAZʪ2/Óc0a*9w @:j3WvٴU @ӞZ+PHxwts᮶%Y]xCuJ|e@\RDBqK"m.9 kۤV\),U@J IC6[ޅpB#7+''gW سQҮUƏ3GE>n~۷Ul4{[xر]$1|W+Wޑ*& Kuu;wUΝ%؎CW{HȖ-fB/ŋQHyܹ@k z:uO| lMLj|= @RyՏen?f êq%KV}Of֭PwA3llض xYSGk+Oeg733=aѣYFp4X]-ə8>[ 9d$f{pƺ'cKI \':Ta]V\[W*Y3!_:vSNT^ܿGEr'&n;Xf}KarqqLsDP &ϪЈ뱴W@ѕoiLht6z+ $W~N&zXQs(2y6T_OOiplOJ'mDNQE|PEA ?{QEu9v{r\6EOUPI࣊-Q-UL3TQTo<_tKgRTlC(yTIE+Up{"堃9%?8M950CL4H wNy1'ھ|paY@t1,r+vJ"qʧ8뛣TQe6g0n7>N;!1Z*"\8O#s6\Iam/IAȃE_*JGf^tJ$(Նsx[PTvfkVs f|bJ}KW@ݙDYDAФҥ۠ ԕ ֲeˠuҥPx$[hH nPկDی)]W7oĉW!l>F ?0l!BQRL[OsR,e@C7NJ⶗* j]sSc#UsCR_(z/}if-ZgFRyjIqNY c!LYF$84@ײ?"!SBN*F.^DXJYg7}ԡLmWr6@V Ώ y{TF||g [T3C**Ccv;ACdHvz"PȒdyoKzIꞥ)x"Ts7)=TQXH*V(/bWVTUs#*U4զMQbŹ̑E3c +LL„*v;>9Cux_8*̊bLaŖNǯح ۔4@&=9b]V&,5;ciOj>ciǰ(S+mC@Q<㼕\ r3^Vɩ1 VG+Ձ W{ WEe%`L@;8 x|9R4{0B$- ZJ E99j0)SekXEEME@ )C1#MkBuBBRs3ݕR'u~$Lff&wx,MD6HKQkB ~/d]?.*$jhGB ߘҠFV9nTcpʌ~>'L8h]VGEj^&D a~4C+1tX d곲::22@0 6B}U7B-SyW0k5;:0E*z,'VMSbqcm=HsKI:@~ Ҟ}z>e>=pYW"GzRzik"@bCHkW ل'x)&1$8F%)L>Od8Al2I\wfy:\ )Z[GEM @ U{EV\ @ɪM_3Z̪ [$_dsUH.|Knrm X8VhI}{IoaҫIW]BU}p .Yxl{ M$h_ZԹ4ޞ*닋B}̙7ܽ{۶NB ۶ U![QC{'M"W\paX?@ 0ot",bE$]n]԰p PH^͝˚TA}gѣcN7XׯgC~Pb+ѿ|<(N 1iz\qw񅍓'ϘA7A| T@z$i*Yn\ENݚ* ȝˆ0(, YB2R_ ȁPA&GEA?(W fW,2 ,O?*BdLfig7}!҂~Zu߾1`Λ@E%;qlM ڛZkPE~%~8gD9l CFi -frp_>FF=,ZAmCϖ77#nНzUr]3v`CNCMB0_q9D*ϡr ' Q ?NCW/_jU?2BcŹ'*bоB?x*>T+vNTq bNоڳbKK*hRT6Tv>aQE n%*ʱP|5P=I Ta^0YBP$5캐XddDzuj 47WT [u?BNM}s<wn= [=2QQ}*g,?.a$fT[&S^nP>w 1F2԰ ;. !lZSa j!4 pCE *I.zLO{;rwo V}… R[Փ+xىwclRt<\]V\_F~vcǢ&f"!ə*;s޼ 11m1ujή<KP/"#B *X1mAUl@D;,S`3 LA3 #46 ͛&PB'~wqbd>Li3gNqqe͐ H.KhY2ua2PAD]p$nrj9"ii^}u!!WdW-m-歩,5a5u~Xes\nV:V^#[`CP<ҷ#R {0$ւPl Ág3P`CbX:: !qi!? ] //|EXAU8<˫W͉ DkسNv^ܜ~6igZ`s:gLWB#òbQEzX'@@GYV'ZxVVssZZjIQwoM J9YvUҾBe3ۍe *M8p@UΟ?v,26G&?M:qBzG.(f;Qɐ(gB&1]{'&=F"(]d֋NVJʧཹ|(ѫS0v{L!'g^k{d89WMM]]8!S@>dj.ZhhAdhR@g1ԕA kꞁ |d/**237m2)S$۷[j^G禊|%d!`+6^K3kl\|кGl: Yq=+OBڸ{[ۆ/Cgm Il78oczsmXZ[[UЊϕ3>"Wgíj P-9| X_ܾ;_|Jz}W6gϞkD&#KB$T0lP_(9vfNbQEuȗGPĜOa*RTRłcJU"**UtTc.Nwt`FB\ab6d>:i(<sTyp3lH:7"[(T"EMT klőoI,miY99\w3Iy|/Qdg|㍍6f&IgXTa'jMp"t3ܕP)3 cʚi^NbBȟ/@?IWF'=SSR7b\u_hv3¥K/@qBZ*1֭OC:a؆4WM/!.l`2@9-aXB2cB&𳊀(I]y@+jncT/_k爫e- JRA FC47 rt0%s=`4E@C]]TB5)Nٳ  JR\,\#,F%j$ĀX6",-BF~;v<|OfSZkQQ+i36g3̹(i&R͘3haN"UJ:P #(aRu͍ånTwK!MMDMWJ)3tY:[W?c47 H}HbtW3T 9Z9@"AUwuoIH#e QsKBŭxjh\Y(f%|~crVu#4V}1/K47N H.TAiP(Ej,)\1V>g}M>*CR "EɩbAϽz [PU$ˠ*Xv"VXCX&T^#E2S>#[JV\RT$T`ً/zI6PEFU$AE*@L b@A<8UT)/SO+cn Udspv&jm:W=r 2d>sC#8z)q 92Ԁp#[%b)1m"HOOqDUXl* S<|~57w9ilDѾV kܺ1ʦ UGLr%a])۠3 !;-%v~lΈ筱 v LeR tilt5%%x "Phl\DQ|ԩf@[#dEd+Хj'+IYY.ݼiSmjt HҾ>PBи.,H318OQ`)&m^~ ^M/&;wF o2Sfsx?D:hؾ3{}#hTi2* 1]XMG6kDS.waNnw67㨴CWO~Ul*ߋq`-}|$^gvOVmUN.;`qoJtt<juqHU1"$QU,Uܕ**mOUd*ӵ)HQݨ" h+{@X|h o<(UTSh[I Sd)_*q.qW q_LH4GV*gq%v+)Je/޽ UdfddFqOKϙۗx΃syёG wCI[7#( a`׶@>.WBFR1"cW-!88:A@M[U˰ G,_wH"x#3Tj3gޕ5MT  }(@8Db ԭ8y45 .ߖV";wNK U 1f ۓ2BP!eԮБQ{@*S?VqM 0X @}P)x?NE]4i9ր)߁׮!lG/mfg)*_ZU7oV\ql { @fzLeMPS8j()Jdxv|ccs~IdBbZ؁@ IDAT ubҪW#jQFz5Ta5fhU5M/O"s>'jM]G rKU;iWL?9Nl>H˖kgUίBRE!xS47ΣBnTq TQ뽈)g-upcS%!ۈ#V"-n;.zL(yB|!O ^0g`"=\!, إ _]s\; %.myFTѹ(*JBa;8C=KTa;[nx`DM 9M$v="+bC;w 1_j2"y(cءL+shu[mH6cCZ40S\V /+ DA@OEX[_PEEGtSTj26.TK-U@CuU,] }ӡ6 D6"-Ag@&# رLA@N%yk)mJW@ZL &U0@7 > d+@l. ͣI0sޒ%@&(MJb*֬9p֭ fXl7TՊ!HQgd Lt[LHo":ޫ)71!%hnF8`OL?/k?50<[)jSOH`o@$bI}RI?3~"ZF$Q*c$L r a~)wP UЭQRBc (6$kB_> N+7'bnnQl]_A=uLh\` U@iLTq˒ :Fsvfvwwt Ϯ cdPUcv$KSE@ui58N6`RVL$M|k.1(1o_3y^*@`$.]4w+n=vl8]3.{`l7o`^SS+G}Us wgG^i{kjrr&3hHw?a$:ry) D "޿3<8|xn*Ei ,ZNB:fG 0eɏ$",H`?+Q,n<(t6#YT$MFO.6{@5z΍Uz G׽S6'2Ct5XDCMr1ldơ;qpl[$eQ}zS4]O7ZSmMNp0d2%XrPX8AQfbb5+]̒0{ R'3%ZoHZrz +-Uh'%`GBo*ʳ)HQ)@?X#@RT QwT1Iee&RE^qT.uGO,4%YOJ#7 HW|]).nj*Z:z0ņ`G6vA0sۛR:k5(IhtܸO-;%Dz?tk99:#>p P* K'%Uֱb9Sg ußJV㓝"]Az'T'O:N19UT8.^mJm݋7b/ N>>4MQHb*FHQE*>0UZ xmꪏ* U6w"EI\]"SXQ3WQE5bbU8*j(0[룧 ..T$I 3×IOCnِ/'$UYy3 pTQ T P^"5 {@TF4DqL{>RfA'HON,Ct+4HIo IF-53J6FI؊o(~pgda AdնXK.3힑EEg~/C_ ~1կ1G_c#ZgeAee?>Fg' $%W5/ W4U׃d1}ر7oy‰V{+&oSr3]XLOGoNVZJy(eRA+WrsU(^@DT=Yx1L. p~^]`bJP5*tŤ,N… UTVMMH~*d/hOޮ"-_AJH{l~5!o rD^.,dn (\4>z5hB;ˆڥT Z0Q4L&>a-ibaa]u¼HDY+\v~RNO0Ao"ǤA\9I"`?%z`u$< K#h>!b3Et if;PX,e& / =:=*N]uȠM"nԖ TD];>&)|TsI. !u)?TlF?Utlh÷oQU>Ŋ*&lUDM*UUDB\-j X>?UbbOUpAzIӑ+9UOfvhf#ONv#?a=Sn`=cbDF0V*ng ks(Kl]MRjR{f6#<ו*ܣIBc\* Ta~?ݳIJzfyyT({JeWX#9m fbKh2 ::/3g``~l"qHYYzٳj5x:A3gbwAnۆXF'%ΞM,,*@u?W^e&…_W@{}8< rT2}1~UJiYJCl(oge43c&ԳVTa3=y@*iAC<(.iԗ-P3T# \MHDNLKUD#JKҠ3ɂ櫯zTqT?01pQ *P6*Fl'ZG@HpcDj%/HLШ8\9gU#!_G_(-8hxڸ).pJL)_mݵرӧ]6yeHbݴi6CwLx&bh&T__Wzז:48@7_@ۣts$P:X+.0{\m!S¡ wپ_^eTT(`a2I+$x# "aeG)z_7}ᙊV'PE)SG"YǕUܺ\oD3RK9+ĽB74@=ɯVR'U8IP wB$>JE1VJɤTA-TJr弘~iROAqUwҩQjO$4v빔IN |2  M#*I*RT1Bbe ~(8O~PE@~TpܪGC9oN RTRŊN!Co_y;T)1clDnҰЯ }rG_ϰ u᠖ HqWU~JD&乑kJo#Us!uiٮ֙ݿxu]錁,Zb/tzzP0̌M֌0H!@/)a9VVe8{r=/nMGpBy1fk "y Nk.W`d19c @f듥 1RGIx?Q4yL0@~p6D`R cf$ՖjlGge)F~j}\o<+9OC&glp~NvOhK<bDZ#2&{U8_^0%*f*VST12bg L@TuKAozlTqr;*Ι5D4PEHa-iF,U*uZo`ѐIw}'@N}Q{ee7 \J?o Um0 }swS>-tع/5-I mn)@ ۊU؃MrRBr).j[;HS}u7ҵX!&5$PII@8NB%kz H )QZ a KsUUUCâE,+D !uxUngPK O UP[uC"☌]XOAxA(]4aC_{K6s5MrD4lUo/ PRJJG7qgڲϵzPE R?ؙK+s"K 6hhi0fDQieWh5_W/VV-U/M! ,T"HGjܸ*6c /RK퇽qe8/G%fR sYYw՜TAMmN8W[YJxh`I.\|E Lqrd,WD[._>&*Ta]:F C$;1GPIB^QZT<1g_g" k Q/+)ٻ˗Ësr m=פVEk|M%`+[^-HlM^¯;w^v#ɸ{Ofܑ*e'],:`)ALÏ*&w*)IQãgퟵwBfd?UBb~EEXw?IK`W&ڔQ>UD,*:d %'@DO)=TazX2#ɨBC=R*XG?iP*d,DԲp X?,3׊} ]4g o/6\z+Ξ2˗*U=ZY e3t,%]HSQɉkעI\ @-4v,)#kRE_$q?@U%=+Dyi߾;Tj sWزE}{Ă%،s#q/coݺ8ovmk}MʦL2h}>ztzz^ީgټ ee*W j!+L%JJeu1Gϒ=^2<㖢PzhHqn:+3]Ƃ*XioBN:4] !T{\B~A-3$>#5)p=5m4(lGK!pjO++zC6zGDAk#{lwtL(õ.F_=B'"e M{?tT?v[͸~"؁/Pv|;KT X?:8ۦP㣣 &**TO廊).PЏ*f#ܶ"Rxpcw"1v'**~9lne8:Ʃ8Ta<%-qs9ܽ0g6AoN߼ 7" vޗ:fXH/k`ajF006 #:w; 5nݪ;vlhpg$iW)s$f۱TYf^`̣>H [[32T>-:Z[CCPWT A{fV "`͊&dW +Du*} *D]qŋOFRU&WzzN,W PZs+~w%Cr*'wmc0C_XT A?A@sǎŋgyC|!^ `%K(O:> Z_?S0Y"2?.]bZwui [JIѠtt?qL+s?@U3C P 3*xհTֵcz^32.B0MBJLoTE*Nl46lٜ9YY*#0$!C8ͰRfL/X>7MңyJ1&ϵiܼ1߰TGǖ0TA;@IJ|K /QvLl5 m\tf;ыF/Fj۹܈}V"pB.ť n?^88Zv.:ܚ`y8MST1pHPLC)xTqE<ޥi\~4TM?*~5 Ԓ/XTѐCaE*.⌎GI$T*+@f<qbu_ ;GeV}?DefpK.2g>s&)Uk$jRM!HT!d'М|Hp+ 4\$f k}jf32m6*!!=l~\ysUUKKM50dCSӌeeG<Ζx8Ta' vq=BL#!=#?&5 9jՔ)55F 7,]X፠X[,t遪&*/3U MM7C_ :HMq7зTUlݺcի'NxzDE;νޗsϽʺu+V9^y sLc3 j* B$KeNJr(?vckQ^>*z_WR}v>U,rɥ*Uzzm>JС9ssxtVYښ nUa*t(EC2+{(A|jUX @E둓]T F*<(͡ km-0%SX҃F6,d!ȹBDTp*Ę٭t1.]nLk^)q^ ;|a@;,e/e154`W+ #DM4^p"PDHbHL.8^0PcAP;m $ᰎٞ s΃Zr^BO|a2(}`zPהjַg2ꪺN41,srObr/C":E'|&\O q ϔ L U8XbZX\JQCq.@[AcT1@TQS6TM͐scRE$ UdIQM76UT O$Uv? f IF[?G@|XzP- Й1 REK0Dz.;t(&/Y׮vQDuO|PEX)( UID]۷m;{p:BuE h sqPHG~[ j$k76ݛ!:/oӧ/]Z(-{'rfHs:@*':NH6Gff@RM9-)W\RxLc&!_b~dk^j[o'_ʍ+V|Q@$mRMHRPt#UzШ8~?t=2ѐt-[ yFDKv= MF>Кtƕ+.E,d͚/j[֮E0 J9GCТTpak+СAD@x cy3b[d=)5#p%APBu6 +k!S4ꁗ<$-HXu5Eu5Q)3j S/Mq*bgPeS{xұ'+3 o=l-Aۏ7gsWgdfk.-eG$w[a] T!>po}pHImsD:cm/:-_`Јdb vVk4Uq0`3`ZXl8NKT5/h~HwUqAT2m /{ 3_*>VTckIց*긺Gm~Hs U`% dq!QTpTaä6@5GKCs"U\PY)OMwGQ; b\p5_Fy9~\!d0Ŏ?ҖxBvŞ|Y:'Sl܈:58vl'O޴ D:pʜ9QEU8w++ϞU65:Mh{Dců|m{P1C2j&b}պKA9sQvK}^ŠK)f.r%)&9s%ާd!; ,70sVnEw47qWG@ Rxw[B ^mEtI4bVbK]o|O AbVeyLG%>JGq  {ҩcSEHl\N79@y(+xVy A Ϣ3G}cS)ncd/c2C> ncA5aQ=U̶wF*U($T߼׿HB}9vT H*[SExP?aQE6bc; T1/"E Vt~XTabPvw$ ߕz#IPgUG6!B͐*_YkePn&Nx5kưДgJN6d̕/&@/co) U , v)Mc8=1,pd $C†۷wwCd((mlN2g"mʊ0UHB-G}TPAd$(}O?>?_Aw`!j.ߏ|#G u_f^^S@*+nSQD@ΜARP8f*(~ebJ7ҫWU@Jk˖o~׿?~._޷Gh5OvQ'J1i߲{^`i@Dq`-[+/a1kn):҃I\u+*d׬At}g϶DtINY `x,*+7#uspٚȆ~=; E555 ;tůxc-JH Ur(`1U`!BJIqqQL(5퐩h1W֓߃OIq\ЁB_8WI9_ HTGGwT镾9k֛#60TDg5HDtNX3$?{_%Lldr(ҙ.Y#")IFꏶGFŗڋ(XV`„QI3 [B/zyn]IP ķFݸ p 7q~4Ѩ0gnAƖZSZZee޽S?@RmdrY)bRJ1Bj,,x)TeRC/*")xT\$Tx$Tw*G,'dUV5PEF9PŋU4yCSy#UDU̦LTxT9:r"+|"+:܊^hUIw"@_-w4ċ6*w˭K 7Ss0xԡ &.ML*/#N.mON#;,Wy%HCKi6S5\67`bF՝V] 35,C4R84犎hݻjP% ;҂֓*>Wii+,ll,,KJJ8<ߏ4Heeeyy]j@_%t߼԰P[ Pűc&SlݪтKٳRŅ   A7og?_yeUß"2[WRcX/ϛw82=UTO5SlٲXIw(Id}/:fib\@k7"t7C 'dPśo(D3stO)Kx]U><@,ɩ)׭ G0ŦU,V DصT17GGФT46fd.Y'`2UTѢżyp:+XK;UTǮ؅V9Co"#7N>7^ "U5#!"#@DۺHp$BXQR D!VWdT#4sϴ9u1XT3!T4V'KŤ.UxE(vubu q2"3qQWE^r"x]3==r]Hxu4B[L"H> SxhyLT Utu|HhjU]>GB~M%R 4T3F9C?RX}_Tq_~X\Q?$UdX71CRuY9*JwƒBTPdX*>6TRq*6 *FU xVDmbZ˒wkfTp|,*U?+\$PT R1ud0d\ Br-R~R֡LQDDFu5x8j]׹PO+dOV\fL6ֱ'*]թv*`aު9vwKr8rhjӶڞUM V^' pXF>UhxIg[Y* U*>ULU<*JrRGE>e/U,w^9*z׀*^.yph\T1qRE!*cE]{p(Ybr(4r:* Y*k?1-w=URFvop"fbUOBITEТ& ~U^𦑕")NwQTAO,N62=,L de8?S˗GdEf$yYk+3xGlU؄8lP<Z SZ>ZF bIp@leee _o I]U,u5UN#W,c(Lbǎ]@'tLԙB|xwǎsoܸ1a–-WW/P@SP-/Y9ow<~WK6ΟTAqqgQ@[Z-@=)P)G>nU' qcn)&-< +tCsշ h;T@EH:VP ե,!{P3XC-RĈWY%s1"dUXd WLKQ;@FlAEA*UaBe*>B8?S>@kllk{á@X`T5zmqR@KQǎ* \*R`TN8aT!{Q`VyVI6!PE' xYE*"73O:ɰ, IDATCPrP6fd p"$ :rQ:.NffqN"Q܆(VFu~ht)7:_99]3=6K.T`_* ܂C x'xG͒D'XWC.PYC&|9D4M5 !o;X"9b8gDW5!4`lGjx @!~J$G%zMU@q M=cw}ks.ölI>{>{9{?͇V0PC{`Jj%N0Q@eݹ$RbobT|Pݢni|婢LD3 *Xdwe"4z[| y}J*⭙jUQVV+v G;x9ya=v"ky?U s4,\䃶7Eraynh*(6kQEyDTn*Fv_U|#ʁ*nUTAփ7*z?_\x8S|x*cU_7N U`MXhTFYqƩYB^Dz>W >2vg(~Y%Q^ y *p(g[J9Wq~_Uѧ7sfr]:o<^Qac |lϨztFeFVvƮЕHQ7Δ*4R) .2T:<"P'5,Â7*30Lu9&'Z N`ǎ] UȂZ76Y=i+ VCgtP"K%ȔH=m !1wؔXQO'},`hi;+) 0W?dpQm# w~ \4axQ2VްBwud}Ik0[30P"IivO4E{;<5o{;|6a^U|0I',hT!sT1 `> QR7bH_ T_E[2mC7noޏ*-*s, (Ӥrn22q CEA|bʇ 7Ѷ6HQt #ʲL]})d qPbTJƒ> 9ŗPy HvGd{qsrTY\gpzt4@z6.lH\ Ml=,C69 JTLeT) qydJ:B^MP%z/c1ègA5lR Y`PJ)Et$xk&N`*оurOh URI4@ L=XPG<@LCD|9&@rG_~DLA@0)R_N^,(hxU<U֭kru޽0zD<) H,u^mZކm' α䁇ND9ܨ)!G{ Sr3>x (iאRx8b@i%PU.Jq@#ejp(R\!V5WT,91KQ}Zz0̀9X)ǵIY)W:2K6HޓTQqy}7LF8ccELZSEbJ&ʞ* MFfWՓ9E 񁭡 $4^nYؐ2UsS 9`PT;D>65o@N_iA*B \gf~溩%ZWP'D2g*z+nx0⇽*  עvy9eki.H0Cܒ*ZjJ:$gϞ}ΟFHؖ,]oͰRޑ!]'T+=Iq,ꃧ@O\K"V$ymyؘw Ex~(߰6VU3DUANL@`GY-JL#wLӱ4<6l"5FI>lKK} &ZhA$S )%hl-W?RLMS@+w=]{ d48|i^~by?BI᠉Rs'@H{xu֮ݲǐBS4xK< E7n?p@5ϟf[[GCC %RbGHdHsl x a#GDL82 utBͅmǛmjl2m5K)U;FHx .%gae`34"A5PW8@S$J8F=< &_hFMOiWF QQ%Ec}#UKIXٹuF01HGD k-擕 WYqT g+ZCcr[4=Sg;p;_5=(bCN]*|yDxޚ1cWmE⬹UXA륊CC%BѱjA(USPE*FxPZAU Ta]U=/ Xk**MvTߎUTqPEĊkSEw*ޙ-[*ʍŷb|TR U3=wT;GN%¯`=q(/Zg_+˛jq*ZS+ RC{j-Fz 39_1ğYeBX!d ^fKCܪYwaNM! YFJ̓%PQաfqS82rD[۾}MMoKO%JKe\ %Խ0`K䯘@Rhd qX^ Sp@uMq@ T8t4dؾq#'|ԓi5% xV|\AN0n{8ʉbĶm=$To zR0TpяX@uS r Q LA@GB(P S%:_A@! '*w<"K)N޷iEįBFb!4}]]=bz6*ޚ $27 M %@s[0(Vj%uRt(T"ST1obJ陟 !΅4#s Ľ~ őE,a1[=! 772BV]#DԿ**,$Q-3 )z&mkG,;g9 wb_ee7e=cMg6 2tkPEH/` SI_M쇜Fq^ۉ*ZPhUUS.TQP-@+{u8yTqn*n%(R*Uh馜ͨ`IUd8BU5gil;oBKiAREPX_kV-w#܅&aw%me݀ VHWȤgfppǸ^["un)-CR_`D6(xg)*𣀊u`iRʆ d-ERȑnt`b APiMSC]Nx'{6hWd"V;TސȾ1.RE:]j TKR\XOR!do5;2*թJ.cf/DfhVIy ʊW͵\}HM@H-[zΫ_"V$wGcye#7Te"mc?%2ՠb1QnjfU qq*?lWP R`e ggW UTqPȉ%;+S@L* (V3+Sۖ*Lϫ Ûm:,aįƜm(Oi} Iw4UYjTo%9 U'QfPёGS;w쎗Sj HL73Kqúɐve{Pv5Q[bxT@&vt'CHinX& jX_y4LrE2 P$tX t,D k׫4FFI9l|8U%iˤK_aQ$0qƒ }<_FbO䧀4};A̷gz_\4O瞃Zi<K"=: U?P?ڶn8{ !M8JaӞ2ˈzn *)bl ў#==(.o7hǏ_@ѫ/cK r0Db5N4wf ݠΜ!#$洚_/U0M/q_J:1p1o䓾]75fpVglK",zZ&(%P9^o^=j^fs`#EBIRɰngZUIM ]NRE,:jodvGҶQrHXk^9KI0@rS r|TUX/5]er Sqk! UKc*n**g4[nE0g*TqP?(Qà';[RXo_([**cĊ-bb\*/7w6Ux_W.F Vu>qcyگVP._ |@_oJ+ R$xN]S955/p #20p;~駟>|x4FC Cz1 RtW8ijN+7k4!n6t}%[VV`E-1ĨIU:<:L˝ l}Uq('U'LJYJ]TF#G V匿8:~YYfZŢ 0uR&2\#yԺkr.botGsٝX(~˝9";;ZgT3O:QonA|X>Q=tR :UJ&Vdlz2; t}U?{ Rt*FzTtAUܪTQ-e2R*7π*^"pN]i v.UC֕3\w_BHPl;A~  }pOMe:> ^8 T*ځԪZ@9'jڤ |![>axr0\c=RhmQI 81ĝ\Qn|tQc`*E0I=6xGx<;W"W.U&pTDV*ȰEׂX=X<Θhz^#-Ka&TQ'W룗W2M߃ T_&۝_/+Մ&nmk[^Ư3-DrȜtb&١wMt"џjAUhnu7U|T?~P1Pœ|SEàoTQPŭLZwy('P1nΠ *\fQ˨jo唎qE8fJQ;cEή\Ri2@ƃ£v+Dh=i"f<0#wgn:–'5!C-e,rO"(-{Fx+yjs[}tO> <Ú媤8škDUoM&>ȢԁsQ(Y*di !H uuо}B̂CC{@?5 \ VH>TY5w8)߇̸P6*q]k͐P D3(Bbnx"4:#y^GD)%fD)y:rҤHMN<鮡!0JڅԩSG AOeI["I5F+ b W~w|ccčSSSXb+ IY4wF>X'RET&b})RrS8ḊYӢQЫP+HlTB/5x4GvBco2ES=XGW S)E( )S3Qm8k Inu2N"7cbi#vo}"NU"f(W&/TaBRu͡bFn IDAT{z hlztxld~/f;6n(劯=reZ3@s,ֳ)ӧ-o~BSpTB)UY?+[*zB?rP7)U'r HBnJWD 5}]$/d՟< י8c~$fiq7IZ@ v bƒ4@3LO8t9hWuk} 6pFBE-i", /XMNS ZɯB{O!=j!+fۿ@Mb`:nf&S׼Z, FLVtW0t 8ڪUk"D-`@L\& Eh U+/m 4|8%6nC;դP7a]54c tZ:~Ç](~T B o&ͿZ^ešS073ueZBTp|@(MtSx$ K<-NnZKwRsOPߨ'~":8\]PQ P&/!JaT&:0 2Cj!\5By{Ԡr G*r=} ZAp`zzkz\lQ(^3l)&}}tÇ|+\JZV?-M[h yuey: 0Aih$U2:e|3ϲ`tv+R#*"ƨVc3n/QQZ TA,!Qu`e%N(eLsnz&ѭEvK٧ (\*6!BSQg`})7E2sS-lTIP qWe7hqyUR+@A֣A>5'i.W %B**Cw_Tbvr'C> ؼVPEAUTv*L x՘ĉ[2UM:5c)! V^F7yZ.`b{Y4 U5ƌݱLnI}V Ùv77~4p9M;9Ā+کUhI%&5]*:\*PXZ h#lA՜Q5[OSR'6adFibK7wÓl(N@Ut**IܟeoL}O~~W;}w?!kPOlBWP&i(V$L4WZHu^)*h!{ ہ{e^>N67SS_/5g793gI*q)TeU81[tVgC5L9jI wjinSv%KG:{hI/I"먈&IZ@Bo/5'ԳRIE?lbY 3/9u*0(pLmTt֓*G*/9`wg^œ#< UT^3.,XҴi3N2D[n M# 1դCq2-f׾{gkt{Q1HVRu/g^4b V~,hOey[6iP!\,D,tћ`tJn$^^oM B-/924XH>$F%ēR<)TԈ+%T6Wihc[0k1!44M[ zxݿ?۟I;}FmDgBn2ҀEοuMuq;X@`SIy~0+ICxnk6VB/9&I>QHLtG==h l@z B2 90; dlzk}y"q6 %T&70, 6 uqIaQz`$Q4<#_ax8%'N߰%,-B'Qk}QzMz$We+Nd_(FyRioK-g닅z8e QI m՝v=uJoOm0.fZұ >x3]*Ԭ@ĊfegG)OȁXue*WĒ1i;oމ-5BT,;/*m! Ju6NWe![Θ(4KfeDI6H3vcU*Hk$,Μ== OMX>ih|ݠ 6k:$6M`vdUHddMZAXEG.lxHjnɻQi 7WUm?_?7Wj}98])@2EE?M&gs̞C,]m܈Q1('O1@(F>Nf#]_2\1#k"K|)޶R  B"?7SSөg2TAUX؀Qd9%?G됢Iբ!oZd.hGg__)E\P_P˳[TN+WQ|`lOTj:qNOԕb{)i|9:`cd$)V/ UjcNmPmNAv& r50_X.V4eս,G;=?Z \D)>ADk_G*󎘾 N5%\W^VA&Ju)R 5{1_>?U ؞PPŭAU[P6Y(¨$iN7xAlU.T Kw"UКM9.(U(>^.F[vAY+谟Áp5H]7Ug[J~??5\jܾYiE)_L1<Ǭ!%C&yT~׳|\m3.vQgCTwCɍ9l$e5UTFMۤM}}qv\P-@%=?6 TEto-Y8zA* 婢ZݑrnP̡w='QPEA6UH"G6a7U,TS Rی*Ck2{TaU%+0CFѧ_HlkmK9Ȑ{sU9!\hwKKR\"q,Z[KPp |hU,QQ# =P[Sf b^F]omٲi)$Ev21@:6HM_ځ*WeF3DjTAuXg)QVycd*I==##zgg':R!}r++Bi'"PBL &WqMB끄"` 3@+ Hon?wᄏmۗb!iߋM6F}(PCȅL7 $a6' P&E*J3IPűcHO|ش ˘-ԩSaT>fB VЄdDefTs7b1=0à=1; Tqф*7> 7}hCR -"xY쑦Z6%OJ:/RpHezB5B|Ȗ L Ut{JB,uxrw~~d$#V+6lZX@Dp]8EF 2hvL{2jFqvrF[pQE*@G1gfViDŽG.t *}*Jq 'cr JE#jRpR:TY`.Պ#*>m`RxW| 靀;'B([*ߕKb8b +賬d"嵨†hLtijJnCҧeӧk܇ 'ᱦs;Gy˵-!j~U",}r…-p8=zc㛛2T_LuaNiRe; ]FZ@>"Q@ & b (ՅRG,Hb DD`]iT`H[;P[#LH#_flJLMZ>xLPa(L "Q 0lM"'98pT B,I ;I)` 1 v.ݵk<:π@@DmCc,)rJfwN!^֋.GV+ַ l+\2L%hLq5V:\uz X@;8 nPyPM0[T#2ͫ6f5&M,tj:h){`x `0f/-!%ge^UUi<҂*ԙ.aVV|*Tn׵NOS.KS>abxs\>2jU |*!}+jD>JjPERFxBisiHgbΫ*m4 RxgҦWTQU̴T)So >3Ɩy <֞S'UL8 TqQAeG*PD: d{E筩^*r-=ܑ b7h/e5Wz±} Wo6kAPǮ>3>(77RxZPFz2Tltz6\‚(z #J*+Ɖ~3][3moM5taŒ 4 M9 Ḁ Z:75tS{h(zk"H(Cr@0x!"ud)Mbv*ݍW; zke[`Qޚ*L7+GCvZsI_bDYRWޙL 0ͧDouM6j6M$ɓZ%MMP@?X,C#&,!8݆1Dy5T+@ggGFB" DͲRzx LO1=a~&P%flHy3`MCmRIM"$9HRbhڌи !L#+LoTck}d~_*U娠 ټf&0f0nGb}r;TiThŤ!CUJLzV*B|T5SY9>Oh=صp܇{wTp1AǪzIP&UMp쒣ةUViPE*zPL( LRߚPV:-P*>ex&F|z~QPE*:,UL&T1u*n]QREP;*Bvsq*zrkU5FfPm.N?tO}PDoN0tZ+ M/!wJa #3kH$ۯTlCO&eW( 9r`S3%yܚ1'~pЀz`i%x t(ӈ:c [&k=d!TACC R*l tĕز<_gdi: 0_ &,˵lag69%sP2런IdDFR8g%IAhG4z E+^L}5@iy4ªvR2̨Ѓ_U\ijM8g0ȉ)zbO즕:dYX] %E6OgI$jڦ0A8| 3qMpV(#P:N 08 #DwlPu- 펇]4@&~+G`rޚ"k!*kF^m{KXdZ(ϳZVEqs絋J*?/ʝrیOAZgn VsT]rTrk6Udg*:x UD *>)3IMA3T^(Vȣ)Pт*"VTW}nyЄ-UƞzkT5"ľluszJerWg㫱tdWҜ#T* A!cଈ@T}r qF=W cT&s%U… Y}UXFo6ݚ<Oň"[zk5K[e%:us.ڰH%".H IDAT" gCf?BgDB=&/=va@z(9"ly1'xQ#KY LXw[{yh$)/JT4zCI_"QǕ+Ly\4DU2I:4t #7W-Rm*譹pm=J aLB*XAãX83s{$ߊLNWxr`;(>K])%!W!u<eƭP@&Q֚$[NvjIA f*/q(;V"#䩂O8+:ÌB@|lk~#H{"UCj~=>{ꨢoX-~IUR&5]5 (pp|{Ν&5_z)POlbyD E`Rcݿmi3A)3U`@+kG 'C^5/{PkHG1bxM| @q 6J nݺ @+Fu"O75k`݃~{vԁGX}&KԚ?AJ4Yhx;wjj(u,k4‥KAuHUטMם3׈0i<J4xԎpSzon.LK_4w 625e=_oZW&5J#ejp(צܥp| 8Z+~nO"4R*%(7]EYU*~nPђ*J/IGrO*DA#> __*j@ǿ4UTqP#b}^N_**%bAUKYGE.Nè9%.[tSn< Y-,_7\L+'&zzpksv%T~C*b&&--Bq仾jjc#ȕJ6u6z>zbU$Ҽ! mMx [je0~hax^ٷo`@en"j,ouߜq%sq> ҉P8660lJ` @&' Lp= [C̤Rxn/Q k@0P7^z L ڵu1TchJ'7R/BHK炛 >57s֭{XHLs`(|SQp`! ɹA3T dh1%E4)cAH~+10)yɴWã WMBC8l $Uow+v s9~Rd'h1t:,B9WIcQ̆E9֊Ks8@JBoz#].Ɨh* AP󢮋rT+,S*&RVT5k,'RvEC#5MI י2QP'GXWWRw9ˏeD͖Ō ˲ }n&tw6-)K_\l/Tu"ہ*e5dogNT.ZLڋ>A(A%Teb$TqakAU*T|$8[&ULU8XPE[*:$cmkT7*.|k UXIjhcIT;ܪ)'UhewђVNG7i]Yybq+QJPvv5<]l M'?&r%N_0ɤRӉ<! ed\"^w)H V5uF{;3^JRxcW$̘Rr~xP zd@:P,K^i<E(E2agB8LX9Jɻ)g" Cq&]`S_9m_xc~p/ya1XR{Pw Upc'-{_*(qz] b[A%\IPЊ 2zxh?82G$[*ehktFے*:B* ̮Aub˅mhfew$*Wb,}-whVVȰ^d }M`TqSm>:sC*n8t0QEz 9[PE[*qը,bqۚ*8 g411:kCU)j2|ӳP*Q41zP-➵2TYKb##"\?ðSPEA U}Tc~T1ݾYr[\,O*eQ w -P̡ۘ*;qfzS8E63h#m'MjCkb/nP#L- a>W${:krTzNO n*4k*>=yiP΁ƍQl"jdlAU|zT|cTQ}DbmKpB`8z7y0PTA˨bw,NFʨHSMDqC&Yg lAK4 CB5GB3f3y@ gc0)7]fC͋ٳgPټ4E&8 p doa?С!đ#[übP@˗VIQ_F0G)OeXZHU6= @ne:NLtB{g14]LZ#YؘY"/?>5u|})͂5AcC aXSou=VYJZ^WX 'UX.ל C

ծa0crdH}H!)V]'8j9 㩢A' REmfcUTS2􇥊3T! 9Tэ.l~Hh4V͈opAU"T1KX]PEA4Ut+PwS&VTQ-ⓥ.)|}*ψ1|PJ6}Ak!@׀A_TOhڞv0t/+WQq%UJ[C89OUtuu!\Yٕv4(m~ӧOS,/#+H{`-hKBM0)b6>Yۣ|r0q `I =d2sE"dZ̒DWV.et\ ${R܀>#F8PThX"orM !M=B`& vaNx)%+4;F^&ә *3t:S4`hj'tOuDNy_> ꜲĄ*6JN;k8wڒř3=,<5i@jb ')NK1 X s!Q"m}$ {QITqgSŦݚz>PBgsQPEA Ul|T *j=0|PPEVPM \hTQ9QEesT4%8=g;o"o*rZQ+MqsU"1TF[*lŌ#&Q2)?/Xx4g +uKa]2cK=^DI؈wΈ')T*[Vju.uY2:9ycNAt#1m /WCFbp5+Ġ J"xkɏ\]2c"wj ,}v&*cRƐT{T(H5{YJi3[*-obl 3֬Sԑ݆mj P#i^K 2'3RPŝLۙY**=ZPEAUxT0SjY( nU4%Kx-X(lU|۷%UDCFOƤ\ov _H[RRE&'ӱC7Z>Eʭ"ss>8Gv UHuTLFV*$'I%=f=s\%6h2,k~L:')X)0}4/Сg\ U(q ,6N&T$AHT0(W1X  s}7QI:M~Fm+Wn=Hl2xUst<'4{|ꫴ|h. i lD i)XT-4,k&h݋ 'O%IP bFءʐOOwi >CpكO܃ IDATtS+MVm*vNk L-`kL2ɪ*:l]=jh{x6eJdLX} ZSPEXPuk K]FOՂ9m/&P1fYmmsP/^V%RG>PRhV[-[rod נ ^Ei^L˗aVsDOl$1Ԛ֤YI$]Uo_h-h6GY Sn:Utzہ3H?qZMR)>T؋ZNGBSV ҞӨϣ;*w#SEYɂ* T13L*TQPEO~޹Kٝۉ*K2\2A|TlR~+Z`@e"w{ )?g[תd" P>iΥZT{R쨢X#+Gˈ dQjt?s蒣T2'^ҔJņJe|\F8 aP[PR!ؘQbQ7: !R{1p2Ze V)X$`mKX߉J#O3jctUlQowc*ZE⬉, !uҖw.zJl;d+Z:4 zhU7C8J&&!e>T.Nf%y\YF7j]Iޤ*dz//U+bkon 5]*eGd^\F(u U?$*FkBُ**, m7* ]v* v>Ta3lVK(=  A!ܸZTQAyp9/Y\*CH#KQPIʥ5"WvAA\=UG}vnZXm$Mr3ƾ{Rb=6/&H,W&OL (ҭ0A?'ʫ^kPqXȇ5dyP 1EW? rE8H+ <<,S=yFJlf2 S[=Fo' TVnCi؛6h3T.b|SpB6/Ul7TS T^* 8`ooGG/ٚFbFnou껎/DWi_LAwJu`f27XU\]|]i\os3YpnC iMְZ3a/=eZ_>21u TqGR[~x<T1AAU<8s8ɏ*+TQP͠?Rt.o'Ы볖/2ӼV-PJ.ߔk50Z)(Q CdفT ZcX%;TdXZ7.řR\kPE'z+f@P? U5]*۱Y.ה yvP8ƯZ"mx(ΛD/cKa:ZYO3VC WYК0!Ug K #?!5ħNb' uwwS>вԳ7b+Ϟ9f |_dTdT(;ݨQ\Ν]C!SCG!'(sGFf@0vtuE ,*;147L$Fe]HMf [ѣMMXf&2 'Kٝ!f-4҄v!V  Ĉ#}z?t!wg 3 >ArTabJS:'v^V1S  tdk6cw<F ]?G vb%8t޺o%Uh ?zW>hq%| Lxgv{b0@SicD2vC%T%'Y|#[%Uߪ?Hע.}4$6zN@׬>q-NU:7N՗*,}gluU^]PEA'U 'UAs; k*c[M YE"UNw%σkfP ΥV]Z“,z*ם(j]D"Dߛ f6(zUMgZ&to~п&^=C% +b  'kQe5q.lMLT CՇPY t"׬ܨ|NxS ԭs>:ڶnpu4[?^k!($  Z^(9VBrڄlXQH_JagΠZWi^c)}I_ iLv/LnS ` %^:5./ 9=_#،hv@kJu zSǏOM]GJ-Q6pOǴzvOn[gŲe3Ml>wqH?ifsjŸYdcW{k^б5-ifAug nW'8ŜPFeJ Atz:Ȣ\MV5j3#K1~%BE.J8hqWdODf]BxS{'VU4\]A Rh!~]LYa>B:PU@z,Tx*>.蕺MTQ]PEAUt/etө6^TQ.1 Nf$JZJi#=6cz2v p@`+.'V< 4a &Jߊ͇X(e,Dl%IN`h^0]<$$|7kDֽ8V*7\%ҕ+Լ`F43M4RIkI$bW9lD98JWZLyxz5Zzß%cS̫ /2"Ud*a6wt oS.72YXUPdl) T2H"7yA JTuQ#Jt a\g96FJy5P#62Ldn~%qIR n;(ѯCTftQU]PŝC#3* UԖU gAU|tx8ԙO*%BoqcAU.FbPiJUH> 0Ts9A+)!^B\T6+PE&34;9q' e)Y8 {zGFfg(-fFk@ű`)sC6{;s#_GYe%_wuOT6}Z %g[~IyJ,N/<4*@03aR]`:҄$[U6 X_L ng͇>PDf7Nkh 9K(]m~ebp6y"w -gLP`hMn#ɮxXBgpX0ɿQP%֐EGQ%S9s|jjjfsGI?62#?'W8N2q mUJt[BOk4VFtRׄD`Y 3zSw0*2򚵅x4*J1U!@% I$Btj"&6U=T't*Gj|1;Q:\ |'T-O "հ"&yǴT˂%hoLfIӓ}}G HtBiPTqPEdik|rTQ[aԂ* HT:S{KUGޕ (#REEY='@vQELY+fZøޭEAy:?pℰxάLK,smԾU/j?Zxqб8 ot!d Y57-k׎tzܐV6cI%%r,ܨǀ1&]o^=\Z4QYVƓ`^+:3YJY:S;T RsOth!-Vј0df=t9r)rHRBN)(jP鯽S Yvef* DY粒Nj~:f+O0UX9@c⮳gq'Bբ0u0xVr_ oXl.A  <,X0pX74Fǀtj@hRZx8x@ZmW,w_S\% ڜhUPȍI tLɹׂ*NEcDY ^F$Zp?pQaOS+PʧR_O`ȉG;PCd&jX\#?2ɩ#iA*UF:zcvMh =i|!`*Ԙ5׃xrO^SF2U*'~@[{LV=Se,N`QE|8uС!pմ8TXG@* 巹åO*b-Ê* a{ظ3BGI&RpnNjD 8QisɤhU#ӁA`XalW\wVH4D ݎG =v х+HmF&\cy[E}$%uˬqπ*_(*fNb=}T Tܓ_&޲ SE*mM@5{ߩ}}SōRPSM%`*zP^s'SE7ULp`[~REX$Y<޺ŨBWQ#‘>UQz͏N:xOХyTEIt;g-]Jm7n!: g۲R@Pg2C(&e}PڙB.,K2OOMp!0q\414ѹNǂ!3"XpEú41)] *wޠ4̭=2@` TQ9'|98:5si` t*Cb31raIp<,t8'p|ʷ0QE_zG&μʴ@Pz b>7SNq >VW:&~A lHK[ZZXS*HL/{z&_gf:sLI 9qy#?KSHSLzPź#{*\wQ^\0}rNt;0E`#6X/BI6GZ+TQI,))Ew-dLN&UDi.[ U4 Tэ}S PCjhc5R"O#}c*zPé{\X-DPgWw[:Cb"\v@~j]iN-\ R ڮ砐FuJwTIWzܚ*:T ] ݛJ*bWצ 1 *oB&iKw3VVPcj6Add' IDATY@!_@d=TԦUKcs9w<_+&`LPmR+K y!&r+G8E.ZHT =)L-m/2 r力 ,jT_WVdm`X3 |G>(*¨A@)JT;^x$TY,o׺%ס /Ʒ_0ꠖ)(޼tNSnBWyyJj(Cb͒Ce.3nwaw=.hW>׫UJ>y\‰Ep57qO*v"`*Tq#TqIPŅͣbŖ>U8U|V^z+>Ua)uBm8vKQOWXe3>R"RXdɩ@uJ ci#D^tQ>@fC0x>sCN|`'Ǧ0"ޜ8ȭ *KD,W :A}`ߪW'Y!ȬȯTzJB_*If>ʝ`*=BvΕv|!SZBZ old-AU(R8rk1 j~KTI7Νۻf/!Svm$Dz 潤Eh\L1_'mfU LZcI5;CIpZ=҅+@T8G MXa*214ѿ@7'5COff\rS0Y&ѐɣXn%+ڝΗcDBqݦ<5uvƩp/mA? ZٻG&hn]O*\%7*Vݧ>U\'Ur_=tjRE{cE*oXGvU*R-/Y\%wTq)D#y ͭu3Nzהvѱ%dB:/P{POd~Wؒq/F9nMӳ͝pQ i:٦䝑<94±x4נ t="t/( S8wj` TAģT ¨ smkW\IP4YǑٴ,:cE)|RH9+txR(UgMˇ,Sng,9"[-iR`(e(gPő#Rnb@9 i=6X>P:s|n#WXL}A/f" ̠5hӼ#Gr> K K tCO0+Eal QM˭ k, NH:Y̆<¡{FP@YЩتc[.`X YwCfC  ƌlIahS!(*Mi:e_VTJ\&v֥ WA}L9\M𪆇||TBySD+w4v 㯗{sv$yj6"*/JLYvoSE**&^DGZ7*>U,c!OO O XZ>^{boUlzKPr~y[iǛ<9/J c !U¬Pկ¦!QCƞYOryQLxjVI(ڇPGmK $R#(:;)}8.qo_2f5WKg.1%˲9m_K㋔e,P ͱ"e;oGnp9TKޚDW/kch.(8bXLu0R(Q(Ƶ5\]ZY;wl+"0+OS84l۶ e z0^aAc+:xk LG ;aA%hLMe`( FQ֢). a@M%WUhxNO(]<8ǟHSJ3Wdx8ϚNcLp3f4$jAH( P'Vop)!Wo.u|U9]'[eb7LD;U\*π*5n h6_UcmSśXhwQޤ*Fz\nUqR u$uaQME=[Idgý9@&̼MCP @MBĖj@y }䨂TqK~rj"iǮ*\DqXn*JC DN&  Z-78u߶i Tt\`$B9eL-? Œs>FRCc"f] ?qéSSu05ѿɈ@D6K!{61fܰPYjٴEM,vKfS54HЈ}@+8c)C[&8#@YP`鯖ຊnS;V M6a50SR@G*0x-ԋ?sF5;n?@o,oIi h0G\'fxAeX\ENz$ ,pașT<7Z>5Mj %z\^gTNmy84^V۸M(v!J{_|{}vmϊP$2DX⻥N澰&Np4{1sg+z̉t`K[U\*~TvVPc[6;UU>9Yb m=gO@+l2\mTẵiSݢgWVS^*tB[ArjR='IPuY0#m:7G]7ϊ:?U~s)n,9dzr)t*$CU`˳8K'dC--rpw{uƶ u+q%Ү`āt;qcSϾiU%X^=qʸN*6APB%,9w嗏_x/C 9 ҫuQd*$T? UK,\$%zu+ب2dP|wvwҝsTZ6UKdk e&4sRLU?Z —4XxKEOO*,u-@Y1bE*T>U\8ܭF=_ST/ M،TqL=V$oU7*\ûFix F>Ֆ?xJ~}|DI|w?\μTFcxY̭~[ȹjާH Q/aQ:~:rT5V*.Aq(˖I_b s>vjEtK`qu霺V! EyXBBibi,0at1AUC/,1ߘpqfAm%$؉7؟۔ok'?,as'P%qfeɂ[O )  "]q7'/ CGMLa "yUk.Q}1a['fh74HP&t~iz%au+磵g(N(Za.y;Lky?*#Vۉ;"-dJ%؎ ϻ?R&uENkPqpd7x*Ogjg>09w{|ʕ[_x;ʭ‹gC©򚌟(%uܵn bU[}SEO@=#ӷ"UXޱ  xqgC6U4&ҭH[^|fS;$?UҮC[z]*zFF/)6`-x 뎅BmBN/4p@ŮJΟ'8w}ϹHa΋z ebQ.Ó[*UTѧ"UT_oUh6UtbRye좊g!*GmWVBsoQEr*4E*Ux8k@ѵ)dK=w upj%_#U.ũpQs tW ; Dxz ^*{#zz`~ۖ~BX1K-&'w>})DA3Gv,F1Sr' .+0{,!O . 4.3/CpȈurAᘉ^9W8BoѓSq6q W`SBglS4##3 [7!Fc `Br•u {"y5nUT۷#AءCt }$W@ e 7?ĊiCB4f&B9ɂq;&ir\F9Wu+QٹhwfǦf,g@t'cX^xSIv=zG׼s,c2 i9p~7X@3Mp DS?.%L*^UvQJ! H:{ >")):ANF.JY~:\*N _䴥 }^}9%߂#?4oľXR֧E6h%_[*[ +O)U ܂?kTMJ?|@?ėu7!UL^U*TA`͛ByAR5J:+jנ elV{Y:=#NNvuNr}ss+5#DA~˯SuQEFKBI Yԋ*"Vc]qM"ɖR2v0j@5(u+,O˜ 3*MT!Qc&G:LPH PRc/1J ~ >*chi3;$HJGuXZ̺uTt'* |HVBF)l~ͽ$XYٿeM#@4"57a c 3xv:6D:r鵻qPprbu<Z4&+i҂+' xf;!U`=%[ yYl̓+Ymh-[3}qnmsOG`l0Ps4b$N2':({h/M3 b}"QL3MNvNr@$V\BObVY1.v|0 1@om"FJ 䆒[)k: TSD?|ɈWS–j2ɓv*UsBa }J(<+:9kR4c<Ս}mPŤT\zDQ[*+L\x*T!XR_\nT,F,ȕI]DK&݌]"`ŁM }~akhޢ5kUQ[mvwx w;IFtoqe3Z =t}ss] ſ)id-{.YVA šSh` 5?&;%fQZGi6'CQ oQ9G*%iT4g? !ΏfS؜8G^201QZv+)#30$|ύCX8?ZaPT`p9S4PPP ʐgƞĿHm &Ri$Y0\ig $')f\)=` xb^ `a`סCHj€Tb@2Svp~* NKO$=<96&gh0`FN>%BzK6XzKmfJ@-oyi;,Mm3#`+1%JGʉT+ SV),i/\0|y{l^KmJu%bDb6˨%y? **d5 zT*XhRvɋʰE-D2QjQΨVWTwv`f//];|Y$<;WU"ޠ{:deo9+P1UZVUTBg5\ۚVN_%kTq"@ŏm hҮR*Tѡ'U\o hU\:9b;/RqkS/޷1aݧ>USN-mh5U,ԧ>U>|T͍Bà]*(nW-o^L 6 UwU|7{]T%YG:*pn9`ųܝ;,>D fxԳ>. /~gzzOo]ٯ*%7BzQͣFS8:"UtEX!=Hc IDATepJHTAETK#{RalʗP$%"iP4P }.洨D * Nc!D} S?t=4?(9q* 9 G rʉ`R}RV`l C4NE 6\*VVɊ{0Rw*C > D~"MQW KគNTy+ޞ?ygh*C#&hV &SxOB|g%H0rTAc8ZrU:ּ TfBx- 鉡D Nn4 8f$at6 )Qd2#6Fh?h)968%Rʫ {H26Dd&`" .?JTFAS.3w|0DaYCqD) dȒyN)APWJPO3Ϝ9qwx,4#AƄ8nl1` v ʝ CJ8KRH\-V Ƭ+d:Xor2>*6(Ē22`%L9fQD꺁DeMvDz>?u&<; \8+{zc + RKRH2{I1ICO[؇'=Q)؈. TI^I†zf}]^6 zؾn!߭SPJy{­rS.QT+B9~Lgy9` 1KƟ^]2~Ч@mB0Z6UdZTyb g>=>Ѩ" ib sn:>g>s{P˗;_==rT1I?]qefPE}Ӡ7*r7 WIo ə&JĩSÕ Wtl?O'U`lɔңΧRO:a.\jC2RMKJ0fK/yPQE܍PE"ƣzW҉R{Sg0УJuϝ;wBE`C z0@Mp+Q(`1gNpa (P+J:K7#"&t0&LBgc$0жmz.Ctt;'.t@KIdкa ݜJP%נTLd 3kPcO3`/e:9BdAN0ƫ~wyU=*Fp, kO2$݄~Hg,Zf@q*2T3Ͳ%p;kI3Ta9a@s)Y8#)eoJ$뱊fju䒚AQa9;Ԕ25t9]SoIڟ3svWڸzTV2ojtsIlWQ'|LwN g]3滎z?ڗ{(^T]+F^%,&}pT͎':w~vg&5"Y@r͹ mz},(oHhoAŝ}؜TPU+lQEYP>Ullh~$ *oHh4.Ϩ(M udܮ*zZ7VRF'YYT>~H5W }Qv&U{:nrõf0>g痗QWuY͠-N  9LhTN1dU/W}E k~AXz$L`GQHuX01:hpg$̧XwkN3C؈mS_Q=TƘ>sc11լhd 'r'zrs\goxԘKk(e* ^b83\yt|wu(r'=e{Tǹ ڠ:qdR HN[Y9`ĺNkvGث"zR>UTr_pT`"O*Ο|T1TݸToX<O*.kCTq6oX( YފǶ_p~NaD٘.Rp„TcwWT\Wjɖ1~˫ qn rKհjɁg(Qg`TW1Ԅj̐45aG۠8nBi*$d+H"_?l}T1aF7@B߉uK-ri 8)A## E(g 0 \О@&pŋB:c)ډqGȣL_8*rJ. .qWxO|(Dޤkp>=4UVUToCMȇezs}TT*>VT Xѧ Je:o/ +^*Uk;V7*UT6+ރ* j]![`5%!<ǮX'2A'}"UES˥kaiJxxR5#K >e#6˅d哻wA2y:_wyn᝔4 Rg?@TQ\.7=5>c]tl20|;iTӰ}@•8^Jum z9W$?*(ЁQN--B1:jLšC۶;w pd ꔘuHDi_ FG2`_*`v9d2t_,*`#Fw d ωΘBJ<ç*C~G޹owK̎Z (3A3g/\|;ٲevvӄM f;"pĒ xͤ(d,-%q8jQX2e1zbFO=V׈wULĎo9)B>n9-VE% G|4]MX5NTzPr Y\ bO4EևE$+[D!APl^y)PGiW&$m}be;0W*J{AgSf{~TqƧSņ1wk稢"@1?D*uQEaKt0+;_pX9!Ͻ3}4t`hag7D4diɊ)]YѮ[ԧ[*v_;$(=`w7۷ U@} Tq/An0X\\><ѧFghHo*֡ AE\TeAV佦 ~jDNABpY^4佚a86Z>p,he:dpTY|uZ(uf~ 6‰85_O ĔE<։G1F;XE̡4 #^Jxk\Ѱti(BW,4+mFN6[g)drYlPLlc|߾f]G/.EfJ=vIu=T**oh;Fщ :Ӈ!O6}Ie.+wR7ӑt2DM)^7,XC~ #ARix/~?̠aۻ"D};曗.͟N]-$*pQ%8UT@. KۺshLAHebztك!,۵ VmoU eV=>qtǾq(S-A`'UW3`*nw|PO NTm}XTnIۖA[ڷU+˵*4JVY*ܣ$YHױ`%R9 WPBZJ)x)w􅯽}P3(g_IIl,4yWx1ۣoX\^tёƥSW_i8Us-(m>]:cCU\y2';q ebQ2j0IPHsASQTsKT(ƠB\ `_#u1 ёA;As˓ۍ*A;[HJPET\)1\"W4=é&uiVمԕw?ᩩ.(@j'*1|ZU-= RFN3]cip|}':^^r^{9<{Y*Z&oL|AQ=$w\<­>" TXtdZfޒJNqpR"©{Tڻ=pt)w2|5`P@l緞?0@yh->Y:wuS-FBB_*SuURwB4V4"JH.e&ގ'TzIZ)ȓ@R $A: IDAT hmLi-KKU7G P7{Dq:H b4Qbw ,gJT. K~ :\` 9{O'6:; 8ޢ+mv̻c Uno^TR6C hY#hNz:Up</Xys˄pi 7Tѵ=es)0]fSE~TqėOݮTѼlX`*n?T=L2)15?MA̞SE8RݮTQ3gJ}MhDhn7͇l㶥Ċ>UnT1Ii>Kz>Ul [Ec|QE%4n_&UZz9`P)3p'&Klŭ*xLH!IEr;35|i?"o. $͏w]tWdҤB‰c`\ZE8-/?́׳M匎CDTއHͻEs[@UuQeʡ_ZMMSH@m&ÐPqP+WM %q!q¤E 06FP _chڙt\H i抎ȅvdXY\*bvMD )/V#eb rdn|E:;EX Sҹ)":!@L\mPDt95?@XX%a#տ:ys}׀JB1"REGWA##wF.8C,<@P>PA?݋x1V%U( )MQ&Rz,W90c綐#ojEA:V6+{NO94shP\D/@ 8]Wr=D72_F1)剋I&1 EuA]ӵEĈ)oxRz~TvQE+:Zxǎ :O×REЛ9薎{"̙"41ʹ0fBwr+Cgr|cxt]Ċ>yN&UhŤ룆e*n:U 㵲bρ*>枿}yqO>UFTzIPX6 K{X*6U޲%U0؞RNS;˷9UJ\m{Cҧ HTwZ%~NUrR:"cOQE%"F𵯝818ȅˈigAAs/N5s.&NWq$bJFGwxᅏ>]"(69$$;>( 竈e޷%eJ$g˸1Bj) $Y\C/%UA]}VFC5B6Nh .3)Ac:@@oi,H(ڀWAP?*%lق0KW > G?߱2RX6 PVeDfgeK8sJ(j'XF @cDG f0R*mFYAG7feQG j]/A cVcxgy`$-&L3PDpȄ.hWVΝ;W^у#Eun s0e('`R2oƶ,fH(mQWx=u G%\YUfI(9z9]ƪзM.PJEAal q >&]:">D U`5;/ſ829e|J[7)ӵ&R*|I9JߴH*N* 8ٳT1Sfiٜx ShiӸE(h%~f 2n Ӭ ҬVSqKR@IYj9@#G&iXeP!=l: 4(2m3 NԞ4*~KKVWWIAĨS0_ŀ6@IV_zX(Qt**vP<0!~*&, ;sffF-f1FC ԡ%9Ko[&PN; !Fas2bų>#LHl)dnHaCVZW|XSE%ya&Vۧ[*~[+*{SE6TqPŮ=BjeÈק @"lg{/ohc,w*t-.,Hy-[S9%rk>uRkm'mq+{ Cew&lwԛ+n>laGٷ?η?mb[g]ry9oxBBSERS@PW S5mw4qAgqSW#.~eFjdqa.wݤT2 jVQтGlRMO;,oFFP5H Kbtt Np$8@#j{x`6)X4`Ѩj°iyEB୉SॉpP/ЮCpDb 62#1pxG gWWB;!G/ K4 +b3'O>Yv d@VWi P c.^;XRZy0Knc['Z?nut23AIڋXCj g\#$e!c'~bbe&&2!ɯI,m*4 Ű4xBDns2oVkc6[9SE(|rpLJ{Bq1j0Xu@R{-}ȟbKSxri%.rS/o`] }d N!REj9 9/G˝JwF>vrffqqWx%,k$QËbF>U\0Pſ6n TaTѦ>Ull~bTq`u3QE%;TqSE7c T:Ε BU,z[U*CݔSSLre\) #Y4=۔jUHKJ%3^'=mZK/e 5נdܪ qB N0eOidqOӥ +_.&=>ޠc6!)y@ ҍ(Z6H{af!b,,0vD/MV)LicªQj%J;LjFRoOEIfyjHʠո%\fFWV1G_M}@ QW [TaFO9q5a}@08T%M)0{K/ Ͱ:i䤎J4F!(irۭdlYՆ L<|pe {/8ۙa1dz;-җvMټb%tAJIn }Qv,P liRԛ V*$bmrmMQ ں!;^ HT4O .!z}&i_/MQ ym$ dT -(A햶IP+] F*3NhEilt)!0}i2?Kw>43m@2n U||W3O-*>W6U+r+bR'O*~٨\SŻF_:^P5dh**tTaX-?Uh((UkQEQ7r$+Yv ˠ"LBGiTf-5=Q_:r)uq{? PS̸U8FRG4wiחӣtZD^+llCvY*^ضh%KE*RӴp-r===lc1rZWT]XPsLN`#$@ =chKH.̗Ed`"*ƣZQqw"(4xu|…̰ MPIB ?Z+:fv ,!6: M=Nh:"Պ徚+Ձ*h'x-3g EgOM!n6X/(yUK1VݍF`[㴤J< f ܘґS7τ*/g6IHY& *Pj:mbbu B0vq%:B&JYeRve;ð{‚6';62:\^2:/0J[˞0O]R| X]Ѱ/P)\G1SۅJ;^Uǩ{hK hjT+m=&&H^p`Q~YHչVEԈU|+sxO>'Xu^Z(ŗ?T;O*'7'U0w"jTS@j[)"U |] κ*U:ۙ!֯<+5e*: Wr=O!UWK~%\)ljpIW`z&aX< QcY;Ͳ5#.Aɹyp*sF }©jdI: 0yRAZ5 6U|gF$ۖ b{f"n];G[3G;͋20:=TL&웘``P X 3& b(.#8{ؓLzX4Z-*ɾ9F(rw] i,ma-Ul88gLq楊aP7/SJ*X#ԉsyP{SPEiHOmZUusz;Yu^z3x˽6U STBIf(QVE Ϝb'6*Slb:9s珖:x9>Y:j*4"уS1ġYܚV'S"( `^pmF YMо֤6݆FM*?n p)J,Ɠc+n0[@3S@DVܒV11W_K& <1qkS "e0BLQmz3>6XQ]43!! <LʟJ款M2W11dk40*0qxإO2} gY ZKHaȸ&/PW ocRrGmHKwNm'xÜ.cۗh?i.p:bD%0 F7JBmlޞs+靮f ?Pɧw]<+~A=>FWe؅m_<ˎzTM* f6U Ux2rq!okmE N4@=:TAEnװ܍pTL:n2)u9bNU)UTC(̢5ߣ}*Ė2ıUm\R֚OKQ79ٷrQlnBY{Edka5akd6,!Дtڡ3VEyhR(:`( `.!̕%FMT3>!&P7fg5hR d 8R̴Ŋb2u(5 ٝmC/"]}0RP>֟O'MEH=Рb7I?@#9iŠnI5 äP t 퀦1{|EiuUGoKH梔[*ɩfġͅ) DQ':9&r2NB kpߜ;7^7p!5Y(U + 1,hZdF*zqKASnER|bQ~ ^o|gϞxDN="ʐ|*'fD¥KTޮ(t#T8"܅Q2yV;`љ̌fon W=kSmiMiԛb*lITAiȍn7UJ̇uxO*,Mz*QtpOU'f8ퟚ =\U|S _ ~%oȪ&vw*7N,Xləy+ـuKvS GU1OGRo˾}nIכgV]<a` =i3F'33 tN{u4gE bj& ZOoK e:$=̤7*&%ip8oR*sdB)FN" B:WHI[l%r\!SB BVQj;QF&U>[׀'Q,k_)`"}/ P|a ũeⰟ>36ώ<Y,*&?ˌFk0`sg?m:)ٛ%odk:YESFDX13T?gΌ 颊T$Gqn`ߞ;ws&UP;[ t64E eHב~pW pB͔4L (!mӭjyzAgMmrG>؟= 3!PzYn:;&[9yxT+~u T g8NeyR32ׄ~M*MrQ7ќ?SEږ*Ja B^81AOMHO* *N,@E*:Xѡ=TkP oU Kw*^J|Fk< }|7?Ud_|p27^x9wB-)MJa2:RzFr2̨BGk Y~J"!#+Gyv^.]zl^x`SgUQу*Q IDAT2eI Lt"Cu\[,3/q_)ic\33WOfP? y]&&c;.Kx^UD % A`N;@ @`U> R\DQ]-h*Bm˳%gO$ߢm#xZ_*WȪBx%F&"E$$|6QJ=6bt#kyNbm) P|Tt Reǜ̅hT)?^KI!DbZ-(ycGSY T! smYUiT;x7|Q.) *_\m4A_''C)- (Z.f/!mm<e 0X;r7z#O33y( И6"?yhPfLF =miyg: -T qՋ^7U3CE *wIHI%?yJ|2/޶lL{콅U^qk(ib9'ʮ'hlNԧ[/U4x$Tawdb~k*nu8rs}ph]1*S Sʔ*FYqݧ-)6A=ւVnhoՊ=ÿ)Uv!*;Y ̕m]]-bP&|=PܻQ3csO&pًţcȩtGnx!!Zxj_v( μdQl#P#yJף'Zwfđ Yj CR!9ކ& ԇ,T9U3Vp&'tGaSvՎfRi\A \dV~o.j|;J|/QuCGBx 1dq"X6}E^40*`,yN {XSjIPlt2@V+V̅UC%: C(b `O IPkX&ڸL ヺ~ee>aһaWzzhT,UI[ٰuѤ䌪gPm/jPUmaTq Ss>U䩢XO7F'փ*6U1H*ksPEiTqP*6US\u[F*֬+▥GN*^H `2x}QxUwݥPq|"fx0\jvQh栊@C+x:T3lT]ຩ"G=.R_2ɧ-+T*[;QUEjaBvyZP9`RaK~?mLdP>NQVc2[ ƻp"d_ hզ?.͓tH|9AoI͕zOL)Um/]!u o9I ȁxA ?F$@ u3o|񋋋?']w=gۉ \BF+ㄊVM [;_jWzDg?-WpґXA7'U^B$JTNIꧠh}pT"H,KBC$}+\jovbqqGdNxIpTq3",MvOVE"Vρ*Tы*ͣ>U*MGsA$|7 *"UzE**jU, ƒkDBRmu4t~[ʣ3{0;1\] 88U2ъGGj* iw T*Rк%'EFKʅ3;U [S7r$bA{;BˤWJfG g.^ .cd4X]eqґڒP=%dPv#+dZݻ}3?s'CC]BM|ARtà &L$0Ϙ(-F"`*;K1xy Q؉,L]E fday`z]>!"2'A0YhS I77um 1h`*&KK\(ԸJs%]dqrٜ)!+ & {S;?Ϧ 5r92>uDUH%^0LD /"uSju(0eOE 3٘% v)1ij/=g? ~/W_X$[2J$M*(5eoٕR妀С'_^3h3wH^w;XcSB{ T> 5}HLj_%:NWMTjSd8Ph[4>Uo@=jvܧ na#Z\|lK*n5@E*~Qob=hs9җ'TqTT]Taa{TQ=En"5—k Gm :UN:WtiT״a~&aӫ^3ōRE~+d, \:طဣx|.]iJ^~KEU\RTh{:G?/`)>u"J]g6iFRauJeBp<. 7Pt -J?T-TQZ`-dKSU%R(]) Q 3iXދ@_0" G' HǏ~ 7s(~hȃʉA HB̍Ak a $΄{&h>,'TfVAP}L@L{sv[k;Q9DztNLpkT~ Ib?1݅l]xӖ_c&(4m1E^1S@)8bb5q{F{UIMNB!%n& OAskeM~HUil@c#W]s^xѯ~/3|J륵)o JOIDA"Kw1{0}\ց?_=;<, H6\H5Sզx.#FoD:vl_Pl@0b9բXTU^8:#'+g\B,,֙Eק25C BϱM}PS-!}}bxϼeSթ4d}y[**,~R*+/UlA|J7Q*.R7UoMD彏* #SzU{We}?Z H L[@{, H<|1y>ٮEV ][.їrI>^ 1\alj,JeR%LPBA_(C!\9 mAPCCrgďVnX)Z@ʋ>K ]نb1QaA.ND|bK+/ƽb\Yt|;`@`ĀEİ 8/:Ao 68q24dRR|ھrN֥ΙӭK0";==63X$@ASFRЁef-dԈ+8# Lu֖K!9c$K 14116P<\Eer%FQWe?N&O785/{qQ{x|~.)~8Bx*,2^RRqRiPXo/<K? ڵFQ5zV*0pi[,T+Y&NFFv?Gٽ#T~,)*>FdhJ:a @p.ROyȜU0VĥPEUf!jσ*Tѩ"ɪ<t*Qa|Bw,>U*TqDffOT6Tq}T1nwDg|.Qߘ*@Ĝ4dYƩUg#1/8&?UM]WUtMڦE,u 5ǽ^n_t+V .mɜEwϮ)g?6Qge)iYRݻ\8Ʉ|#lHIS, ؠ"Ǧ˿Q'tWZMߠ2k֒N3MCN7U;KoAGjXgȦb:sKl,-?ߏM"mt1EYtuU=T~,Y+© U$*A!YZ0| ́т}S=b/?|X:)⧘S'!IED} B"ƱZ)T> ~0\dfH T'bb@mZJKkn8wmvJl ?{"u{:"M hݤx=iRk|uݤa5ir{wQ_1dYNvm֘nnL1x2ƴ8-2LIh1xDbnR=9o-[r,}!=<=/>q2⟺IBZ9@ӦD5mCu]o m+6tf;j\TⱑzAIdY@8jjCB Uqz}g|뿳 ʹE[; 5#vpk99{v'kBDoɐ 2SMkDk:Dyʉޚ_iFY6lyhсWmKL`@nG,C WhaaT;OyՒ*~TbPQEuWܛT%;?Ѹ>TQ[EPE;TNNi~PE{m^;Uj%.@EG۴UH n#OtS1 T:-/p)1sBaճB nL:#\gr.+5`@`0F8 HvDaHQ\Z̞Ūms˄߲e\U4{D2QFh nݨF MiU1Xk~;~677gg2*@h` Z`&)XTbA\ޡ_&(JQܹsʦyvO FnífH̅ bA_JEwiQ)+ǰ|Xte(UbRw1Ajh ܩ-,HKWU*N3Eq$||V߈6 9w3 g?x 'Ҹ3vo+x~^dTQ}"qIVcH-PZu \WӂABtTMM`Ad9e &j&¼s U.-ϳbωg35lu@ujሮ<}pӍ:NTRbzPIU,+owQ$\_pw57wsTh }/(.'>TB1 F%8;NL9MϨҐG ފ?Zo76l>8e\U̶ECFbUi 3GM#*X w ,,iLjIE/غ #o/2`4?|5J6WGIBxBRa)V"\cZ]ƈHrN~%jD4ՒqRP&gYSJzbqT>$۠5V5H wccnvp%|i JREr_u!,b T|TU * *⚨rb%Ul*fg/_=? UTܔ*:͒oUě+UTw*Vg7 ϤNDrHg9UqdsPtP)mkޯSPR}Tv'\ 8MRiP6[=Ml}6836ĴBЇ,փ?]ܣH QQ'[5^1hї&@{A;Ҧ!FOdt qH'EdSJT\4RtDŽΤ9@#Y컟9WRf82e ém{oMtLCԛdWBѫ\:AyN_'|hFٺiz_} R_$32@nHl,أa^e^!Y;I )N|챷޺|BN|lEL&>}7> (P?SEʈʦD$d0 0L1 IDAT4`2 bɿ2sw78`;&p';om@5k BArH}uLCڲ`/m P!ǭrH$qg3d 1u 'gq٨׼TaSB@#&-{PBbdhJ!CBQ- 6š{>XGA{ۼe.3u WSH^ʓ[%o)MO92C6>FfC4Lө)r06?1,b҃]>籃r`(OhS_ !{8=(e2}ZӢ|e(8ŞYH* bl4ΜyD<Q΁( Q;ayeTt9^Tqb@H|fbT1*: X͒*>t8τg%Ud8,QEe5q%U|hTq 80U:Uf_:o**i|MT;Q6%*_"tݳ◉?e#ͩ=<*9(totp@ 殺4|a ao=ebOuX2Xv7s=:‚@%T#b_$Qt?R'q %:Evop(dQ1j+Mf^Pf̎~Ҿ}И R䖫@ lO ,B3g^W/_G>*VG&6cM#U0G@#04D⣱1hy{SP* h[X\7g+7G@ ӆRE6Gh;:j,շ?xbQݽ`l(E'f*RTλqdKco[ѷ c1C"rr(>=|Btۜg/etK&)_KHnd2FNqRֲe]33?EWT"TY^hR`3ղI~MqJ-FgGG#d8{@R$&ii+YY; bffrra?@½" 4U:3ґ[DÑԩe-PE%UO!VKPR=͒*{TQm2BNI&UT|~^*P;2ŵU(&Qþ8^}z7*}2d+ThL^JxRLO~}n*[+_M3WQ5Q֞M¾ӇbUNa4 e4j *QBC8>C#@ gf}_߶mt ^w'(M%Ai {Qlܹs߾'8uȑ#}64JLᇬB٭9m% 6@zmfTMkE 48i1&U}BC-1CUV*E3j5.-a}z2u30 &GmIY*oT$әGLκ33*b.I_h8vP9M$ɗD[| SWϾ:۶r3xm嗩a3"T .$_]dv_&B*sEGw'F0OϹ GV>83#)0g8LZz~ BG%?wrQN/.xb#"XIdcIĊ%U|XT%PvI*:%UD O0ME6x%U/U}?8Nq ,*Ӭ)U9~55m3.U`{SLQ/86(O[W887 LGRn Fj&vNIM.ewdNb]zdعlΥ؁ޚ>W t ̍ =aGJ[=ߨ0a8yrj>2M"h*Bp*B3BHtߒǦɍ'XPQ.^;G $7Ґ)dDL*Nzo/h ![:ōf [CDAKݤ_ipNx`m_2}UF2raYa:4BRXgg¥]/)M)~a 8H ɾ2 "dP9TJ ntUQ~eך4EW) R"c7mGD_K8%)*^CTUfPOUD#&-yz*@w} *R/ʂNk ?VKnr 3=#Mť]*,TO&.)U0v%S twc~ͨ䙙'zh^옉*n[)J!eoI7*fTz*6e")à1}%UdکrO;<]REE'_U<\+@wS%UΨl0PQQRŦT1WJT1g9@EE^RES(][Y+"9>UTzX(-Q>Δ(ݺ%D JzUl*7HY'Yiw>H*Һ$_tG~$R%ώ]4mBi7%k7~Ad,O $V) KFN>EYW~i̪˰8(fVx0^RzTݞKK$86CF  S.GQDLOIg85-,K01ͳMg FJ#0Q @]GB Q**awM1. Q6ʁ* Oڻ'TI}p]opdqXJC*E_ Bae{fCr@=7;$rIL/j.i(C@p#R+^]#Đ{\*;{IGKTI͐fQhaO_Ral /3oa&\uJF ?^$T`QWb3P:Ș KA>334to{}gB&>kٻ}2@QcJ\}32o3s]¡Hnť*n,U>vIד*jCL\K*RR6m*+o96 }1HBg9UH_S*AgiGMƝ3i׸  -IOY ; ."ǍTZɀ078840ӏ>(,5S !y-?a,Pu;eVӣr6DUJЀTqtBB݁)f̄YM&1u.(4BM 0c a^p2)f@ӧYEKP4h`ŋ3D XaBMg&;a&AڞAaHӡy8[}zǞ<\ԘX2Rʎ)`Zx@H2 \[ʇAMxEyӴPIu5A`E ,Ҝi ]>K6w֟/yeC4V3b:%ZmaEspձFc]y(I{rc\_]ܠ" "2+#MPIl[]&\)UUl 82kCShZ)ذh3&5 }]!SBS0k%1l:(}oO\ TDϓ+rm<Skb_?v{F۫t3ء˖T*,~Pml%U\oh4lI7*.U=)zSE}ĊnI7*:hczIכ*XM":*y< ^n;hB>!Q7K5;Z&jt&\Cj FrU|RdV W豻zZ Y]ɻxܴ"tu2PjvghTPI6ߙ+oQ0E '>cd.1K` Ϲ,eFᓴ27/ X/( PsM) QEkZR1w>Ww({r=5:wYJU}RH'">W涫)X8q1[fDW2s霼aNe̶>9mջ1zhp.5%~<p-f+h1q[V/_>ѡ!%ZqԁyPoQ8z_~Q?$W_mb-UI7*yyyXI7*_Gщ*nUL֏*^Tq#baZI7**SL\qOZ<"h$(I&bHGQA"YHoC:Ѩ*jj&|j{..~/ejUZ |cfB-k,!v*~POoRm[\N@` _:qRhB%xPH上FW1` tZ_s07SpP+p*,cdPHT!57U~A K.'%n4BZ8ܚJ93!>͌ALxmD dZF)$&" S{UQ֐jÆϯ/΁*6𛙙Uxwdqil*iwH4mlVP@nPvm(!<83dF% 7m+p9&+%SRijKe!u2N`5?==16P~"G5 ñ|%R~ɴӟ*P?9 =g$Y\4#67͗MQ/Ʒ;ve.m+ZTnU,-mqK@:)ѨdLhxp`09s03Ne9 Aë-=Z:0#!iLEoPy%}jRVL 6„FW^BTUc**ʓ U wla[D'^t+-o1oŜ. HDEvN1*(s4'cp>EK`Хs7rd!<ܤ[ *|& N+)•PTRKy`Hwf*q&z8x1?f=NTJzs2v*v4):i TZL˸ !QeBN0nQB(BXG/jU;w4qpդdPUr ZYY__;<M[*N(>W3Gr:@U,…]Nݑ=Tq=bPvI*.CT1Tqa}Iד*vl k;t*nUtU8VD95Ԡ#١CNheTQJYbi*|[ƆP%\cNw>-R^T#|uƶ6;sNz}=ڛ?Maie5{P _M <1n8*|! G+u[-4ө.tY(_Q `ؐo1]'PB>;3E%am정޾lglT_Nn/<7>6kv1gJ=߿w͊2JJHgT?"CinT`u*ÁHR"t3O裊LCrznUH 2ʷa:9Gx}H…_z衞[n f*t(L5lv `áV} Acl*iX,&$}ևYjq\9S Tdƃ; Uf§FE=VmˏM<&|&P+*Ӑ|P95E$W2@AW6!ug&=#ǀyufm>Uaôkg!G?Lu|UM*$ũ7j~ebhrUcUL}26̗ˇ(&=y!4Oti <=4h*B)E HBb*看 n)Ò2",yPxopl`DF@3vHHԌCMT`x4gS“ U܉_ݔ*Zú>7*T߾V"y;%U$ nNPN:bHKo7**$TqT'*>8Utw]TqCB4w 'Oj?d>ݱ %ud`8si'@@!YM~9\,כ^!toHV'`=WA:g#}[wݿlvqfFxb_>I$7 Ub(A͌S_TQ%L7 IDATUpU"s'JMSb?@٪YI5`AcM`kBj<7w)Hy6Urq`MQ@C.4{OiP>$LřG "DUkg,Y4YRyCEɲHzq^#Gum c 5C9'lBuncӲoNf0G8lI=˚rBSq_&K`qgp5==^4I{ag\qnܸpǜ>zt>mMaѺT?G?:~X7/PFF$|gJʪ*EdT{o Xp+-Mx7 }Lk,L진XU=@҇…}%q&lk9[EoMNh6֔wjѳXR>Dž*x5e:bF Tq[*ZQ-RE6_F8gKk?c?4*>Q]HvxRRY\ׅ**Tb_UlKxTq1슮dtbU<Ɵ*֎5RREbW!jIUTVQg@;l"w㓟 T|IGqIGE|8!F)=V>u vbmwxw=ړ4k͊@ck!{rHz?~={vڅaî忺|$gEE*YF؋Ϋ+(OD;&#o_龙-״&v93`(Mr)g$òZ\EirHT瓰!rو iظ`h, о}0Lr@CPQ&>"c:" TnO񀛤-:,7BŪ֞U֩R R+|\R;JQҏ! ϐhZh:oOes3be0LiTղUYrmSE̓EfCuKYq>NSsT:裊 z]Y:&s2bR1 "$#٩"UTU|~_}wUk1$tbm*ZgV,E(کǿYSRŵSEPb{i_%U\+Ul*>bIUT:#VTÊp4QBܶ mNjr!\;U0r6ǪCl-Dq}{X]}?{v15:ezuw 86NWW_xᥗzk6ksSOC5^}.ڌ*(z%2v=f-U Awrrܤ'Q]r9gG*UXr̫qǏI]-nR.#?28zs&T G=B$tK~9`-й2ɜ==5l>WOi?GmsJ$sd)&|6EciKZkd5HLOfS5Қ X\ٽ = / ϿϾ(crGJF^o\kxlz:qyW I[n3SWp#_TgbMѵ*j5ȗo~G?mk'vi9ram+Gm0v*oHO-zi54(@}gҊ㚫0}T<3Ry+EIQcuݗ44#KQjȒON8@mgPl}ALtTaq;9OqRA`i,**bB,T{.J_s@t[{"*_DT,ڻ{|pUULvT [|{q|!/lQEHꖩb@]jdI*UT*^+QTkTboPD^*@++KxT!!%U|TQ})&VUal㪤 Ry|DMЂA)uHv4sDB_]_~s5y(ȱ_^FX=U2114tw Z;>En6vktR{Yzt-~*s%QFJ1)5|R+ϷӮ~hjzPIhDV`5m"ڱsK/9){65)$2$Vj#hX+=$]\H !<Lv!H@pS/0)FaCab0']9-?佸2:(Ffag,|j̆MT*sMe`2v^!<Ҍ=.uɓV/%AdMGyr0O-p C6wܣuم9m#ܓC:>oL{ʋ[y"`s1xJN`_р6m@l<4SX_߷?}F/WWQW/l<%>5H&q+ ܅vz+w@e:2#(>5nKVYmF*yW_\KtGAk[)qg? MHSQ>I])F+3y l BAb{v mlV4CG4 D(WZ( M:7`PrQo}/\:{wԠ/vnn $+ŋ'arXifTpL1VR**.TqTbO͔Tb?{[>|eN<**PQRŇN+{XnƑŔ*- &]]0G~& _WU%;8}v{_'~x1G'j_8>ޏo.VOxؗifJ vU UPEPpK-,||@H#KSVՎRD"{W_ݽ*C׋ [)",j į= Nq#+&q@kx3uƈR&fyq-`N1˖Vq TȨS X/9vrB][^,p-ME0_YRTDroI2$,xK۬{ g[zY@rSQ0FG Ly; osKg!q<"UEi3-a^9(/-^aZ?o'*V\L#XoSE]X;_?2]n**.JI3h.X:6UR5QE*zTq*>8U*yUh{^I@6l*ãټ@p6ޛ*&~DH/ nTqbTq[T<9[**VLTuhْ*U܍TOWJĊ*N ڝxT!REm(8VyB&)֨ )ґŴnFT(eTQ/ ox:~F^X3x<Ăäb?m YP0'=9$) Hٱ_ Np:O0-8Lt MG|2&(3u C<‚CVXI 2 [)$\*VL&BT+#To.6(t#KEE%T ;=ߌwѓbq`.tDN#RHBP<7 ss y-H Mۈg9rdC fMHS@4q"ud+U Īp;Ze>@[@O%xxMDzsn3$wnm"LgDw!;^=G{7;yrv |ϥ$,"5 5]%eGB*xmTRW,=$tN֑{oE GW.EL.3f+ 2So}-1ِ c9D7HDP,.NỎnѧ'$ěprRӇpb'JL'gfLmr6M>d}7/U4 *>&ViH1S:U^ N*/w@@+k;JUL|#%U\9YCAnFwXR֨b0 *(jZI"UT:Vޭ79Ic$k\ծpa `U{k?q] >U$*ouą&U'Tky7PD8r'La:L2هݘ ػf))VNUpj$S?4^W_Åy[ق JFTlEΓ_S{gXZ:oo!13"ň[=+[˚#ͦmLVo?# >G*\{ =/Ƙ(y2i=V>&˧Ǐ 6_ޅJmvS;DVg3ZI'|n.Y:M~1ӎ=W%tjb?uuCN ^w|:SzϻkB-"]wadTArE4pu//Vw HjW !d ng"o7@e߁*vVR,IN1QT+,~jl̢:ݽ ]b2,3F[[s_d@ccyW&ueŞ<~2~vO'DZNFOVnRIQ .T.~z'6 T1KU4S)à꣠oT9Ulⵙ*Ut0Pz*PEe{%UlN{·G;%U|TrW=cUi,U[='~FA:qոzjHQ © Ze֜(3o}n%/Go/~ۓj;姟ZW׳gqO`a"M!}TOμ5)jt(S xĂ6.0Tgg-l\;k J+ OE+#\rp ;Y6SAg>;TBU56 *I7ZaH~}4ה˲Dp}}w8HSY\s$nlĉ;{W'9ir\FS`Gk^?&:F^D]o>T6>P8iS#zɱ4}}K:?ZL*(REA, fqEPoB&s[MmȱJ3+(Tp=㰂MN{# FU%ߪBc,~XIi , /d0qt%B~0iSTC/p.0^yMf"E-P om|e$BNWjKd'rl¶dΗ3GG:k_O~b&PoF$R4vj|DuIdi<71 *7I P-_> ;y|3!\&Zm]Hݎ=OaLUϦw#A/*6K"UK͖TquVŭSr0|?{.Br Tm.Tt+R6>P Q 7PH.UMzv͸KĠѾ: [TzjBXIgE}S,zy큂GR,3H1y*^Mo(j- ?Lyg+uH{Y.aH3.wc{4JϪ]x^>LAh 4R!45!A>%\i.A$7w e.;)#MN{e{`bƆlFd`qq_xFܹ0%ɓwֻڛo5Bb=TO#ָk:$YՅ.TxŊ̬sD5MY n{l>l WYn$XDtڸ]4:nȟ%I,걟xrl*p6 OXh. E]F@)z y[6J-^ 7/aAy|=V= 4a- [$! cɄg8w =sOMt;A9LbWg?cUTܭ FFSxa^YAQI3}*$J"%ĒS!dB "HJ2I(Ye*ՂUj4_SrH& |TCV;'Gj^trrjܹi:g66VW`/nvソũS>Ԅ)R?Pԫ}T/oҤx.ƷvwU#䤼Hm&*5}eL+77UT-N^U4o%U|D}-D-H#%U(PH.PEm+"!j}%U|du@\*iV}W*j_e̬,9UǑ^*ܽ= ;~z F@osGc!uwk.'gͧfTΥ~CO&&&Nצ -e)n׷96쾚2pӓwFT"#ݝ뎮IJC20_V?p0B,&Vl%*au;b6pYr =צ$n6 s~Ңm FFFGVM O){w9D3 J[&),¹1.Ɖ@R"@C eJAiD*B5ds$..DaXь%18sZ=t}wxI,}4hVә?q\ahӯm*lƞCNDfTQXfEoάxx.Hm2?tFNss냉:nb+H`LzT9BDD2n(U3gHss^Ruk7D`ЭԡCVY ѯ{ؿ缢$}]#'$t0yd.Jݰ\wiߏgE\p[[I)ಪyA{FrJULnbs}AIu-TQCل(G]%UT9Pś͒*>TQ /Bg!KX*jaHA2Qט|WTشCPhta ÇG!qy(U7D[jNYwv,&ю7a˛۫ageF>!^Q>YdjH{ƒWb51q+NI l$WzT!F\9NPH0BtBJJVU}:WJR awU' ́ UU:$  J)!,+4T % `:os 6l΢-##dEzNh{vnNL,沐{ =!4;<p1 DnQ{ܖ npj;3Nt\ '_IS8FGA؇tۮSu*ֈ|׬!' =}0޷8O>M y$@Nw $s]j`Tq,D|ŋ0_פ8-Xd˾S{_Td\WX%&-Qo;5}Ɔ57,-J&M(nV63ʦl-1^ID\WA\mѭC"N^Xֳ* zu T;V^nTѧn b^vK_X,O π*vTcW%U.RUlq(6R@M+zkM"rLLc6NPNp!nZG\Y ]".PE_X[\}TQXo}a=t.S%s]Kvuh)r!M~U2Hi 2q>N$. *2bofpE VGFn+\Y3qϟ _PX.~;pTb&cvVW}iyyn_apl*8HPZiPDnPPqS&_b)E&3~vjDA0ʗK'q$˵~\Gvz=4ΑT@ԑf $\/}kT6L@wPF! e,|TvemԸܣ­"%xD2!Dqo!MO,.{RgMA))::6Ǡ NBg`XD UTv +'V$J˲dplC7ׂ(.$]X)K=ZyƠ %~hiJ,};ܚa3YhPL<2cEyfyL6M<-Ӆh"˛o۱n*^miU %YbנE:^}*C-aQ b85Cir2!RT*>'w"dCd1؝"M8}OKv3-;C KZPHմzy4CtBXy2wޛU~hDOc:r̗ Zs=poJx^w'?1Ux%U6qS“+(J :T!ouE(:X~.yjnr{uk, Rq0SWH& sMv_Y_GB86>A eܗH8⭩(ÀA*ιXּeEYWlOOOޚ|OxUi-oSFӧiYin:<ѢY+++ q{2 1Suٺ:{Y2M&D fEhv& CE犆g^4'cH# ͑7LL8HU"ElFmGTuALB>YR Z9h<16:S2LLJp?[%036KcS].#[3yto_~ޚ)1 QPlFHK(k$ZH~RA`_i0]cbJT#WTvЙk>r͗bʮ\ۄl0N JI zLVwy M"y}a𑻀&: PcizϥM">ۙ*A%UdTQbeL#}FChI7 Uog`ڙt7WTvÒ*>TPUg?W4u}PeBOJ~5P7LvaR>f, %\GfT2>7 8~-O4[.krSIa,ӅHBGxetiiE/& *ٞ@s<̨߻N=xo N);MdAi67{%+AtMlP@:)L+Kx jZV<ݶ GHWm91t ӓKD>ͥKP0W ؀ۿ'JhXϼE {;P:k ǤRt^ ɩJg%UA(xU}Ic3ڟvF`#\:V**ޞ@,C ;|A:EH-|3BHr*\E䗊zUG OWmRc[&FzU;xJvȁ\4@%ΆT;9;hrf+v6R>uW*U_k>QyY{f*/$7КbV=H*ѰVv2}E|j --P RMbI$\l%UlTzT|JgUiTq3RbJg20_+ bzG#O^@*vSREcˠ;%U] TqYRI2Bkv 7TqQZb+ >W;6&AP s*CQE~9%]3MS{F=* !p0"T[Xc@:SI;ȣ69y>J Sľ"Uɨ;c71:u ;чf* Q˔,|%((T+*q.Yz&w0WqÄ(ɏV+f)Wж>ڣԜpYf0}Ц/6f~0ay#ZѢp` Qf0q\@..DK/FF,j[Z1Ń=q%8:mNڹshHC]JͥidR=*$ +.^*ɋB4ᕚTEՎK KD&>vthRLQjr=QA]DP1\1ЈThT%4>>r&Ynfr |TԜzo֫PY5u%+{@9kTL;o&J`zbvS mA1QC>ۋ*=Q-tRAP7[U xpSRKcP~X+6eJB7đb}D!ҋ3PW8~ԽD'S\ܥ64%m.-LsYuVf!(C]B& БVlk%wT 'ᒧZ< {l6vd_  duJTVL¨5T`'wfG'M뮴QE`$ZD,ao0l Uې¬z4y@{r_"IsSh0 gM@ 0û(vo..*蔀H>nv"ViY$fce1! Wqے[q SF\vsG7m=|l.iP˦e.Ý|#8Qg(`@Bg "+i>*$â3[#כ~RuV:cUGip]J@&(VQ7UW}L\;SJ^`,EцL)7RXbu. M̷Uͤ5AjSS'N{ՁU3D+ꈗNxQ1)O#gD2%+px4;66ڿx89UP -*2(~˴Lqs0 ӊ@N:)$䖩}n'o%UTqKOˏNT< BI77UԺw*VBۆ*CQ}TqsPEUߧ" K{4$03\υ3nGY UVCUS)LX+M ק7h=܆ᙔſ)ULr{]t`%g_U a8u|FY"T(2'Nɧ=)e($ B 'Y`ab Np8( +m 4Ʃ);.eB@S8_)3Bkwq 5żw"c۵+_y;Q'4%zjlx.) +R4'T_&̆ #2F?6ڠC%mBzvq$[õn6QW>2;i&>=lhi7BrRRjĥ ,/z$=*ZiꋵWĆ4{QZ/]𩇫IKRD<Iֿ~U_jo*TW%٘>zZ`1TՉ F)x&M[+|&u2WrSHMoqgf²~/j»wf^0>-ȴvbӤUNk PSЖTQT|vT,(= lf/mE7,f =7GfSg<`}&E44jU^zUT#sO(|àsB{R9yrl;-x1:s\W8لDZȩv:PU$"ͻDT!a/-lRq:;ө§fyDJdq:UX3{y|›g֖/;S ʻ fؤ?DΠ(۲LiDŽf(BrZ~'B*}1hf):u*eUaJكo+ٽvמx  YH.i;&QOiѨxT$Z"ݥ5s%F‘S-šΚ5( h͟q U<<c;|Ӄ8^oj @g˜T;N<5]pŅ̞T!"^$?&EƭR;Y |Wo*OD+ߜ;`YYbǻEb UYVzUfgz y7l,5r8DJJmDlbRٟϣ^֧}WT-uFukC?^ 3##^jv>_\UT/WoAB%UT1xT|@'Ǜ*n\UbG#Y^) w߭ {Ui/Mh(AMNn+bF- 2 ?fV8 J@,qrcT(sj6v@mZڐ\Xp3M%U(GCT}>tt [˸|._~ㄾU7; C"YS@JettǎgGF"V4t0|ݢ՜*/ܾlNTeI%7m-:WO)UBލ}kPML%A(=&\ t#"qIyŻJk:Ud S2ƺ_-@  IDAT ]UM#%"|yyt1 )ZD!liW*hƲӿ-V EJ)42s(aV?-# i=%ʋHQJPr皲_aCB &UHMM ]hq'ZH}5hŨbPqVڿ^Rŭ@AپӾũ |[*A_թbkMtK9U‚-/<9[x3-;6 ZxvPAWjL>@Xe_pԜ8wnxT\VpU 2,(ÔK xk {w~'Or2KN{&RSYք*4Yl;(J^sD8X:dyI&ͯVT*@/nT]BHyC㧩W]oMM2 K:+u^BMe\S͉$q]FۨYoEQf1*GQ} GUµ`^;z3fdCIh!]S\bʊB $U*a*;lȈbe"̌^xĎgΜӀhghrdK}~hRGibCs׎UbtAN}kVwFZmH?rR*EŧwV}(zPs,I\5/إOb'0d 9t³@}b&PSeRdM{z+{BOͲ_̬\BzM8mC]t43WW|PE`H[*2("hy7Ub%`ŭI3U<ުTq+RE{?b֤*yQRED7 UH^7X0y]A&G>ՒW {T /EH:`sԒ%{QqʐYFbgW2o*U6093ϛlvTd_U(S囙S&q8}VTY8MF V~qN:ƩzŠ*6[ gh6U۷_X:as&1EJ̔RLeJDa+88>+N^S 1" )a M!Q Okԗ?m DD%@ 5r` w #˽F U*mkk=}Ϟؠp _PqҼ@N+EsXej6fSlj$w`?z-,*i,M,~?Y]=sfFJ[`;0U<*Z@rD}[g]kG.BV8 NJW&3\O=fg+=}ôPuX`!NmFї]*U|7PnB NOHYT e}K5S=u%LWZM_웊- s1Jg1f9o/_>SO;wntꐆx33O{g̡O %UZTXqQЃAo4:%UܲTywP.$n͔2/$2TTQ,Fwa'4ȏhciYP9g+I(=[vdlz|EBVL{p\myŋ/,h]/L"KE&s荧},[M!LUhH<~ɳbvk(ᾚ&쨚 ns3V΀Ep"-.Ax ^TjTlRVY|tT8Άtb $gI>C=v 9>mt"u/.& >1{LLL`?s8~Fn YMwD0)duS& swT$VOl=<|I~k $ƈU(`p0rN&"OS:!CAG(9la֔NXr$4ޭO|&^yyw~8yRX.d>٥{w=RRD-y &1țB2KIN"FHZ>:GrOH2[\CR}hrBF2C92 q U/{aQ*+7+!*{+"2krҋX,Xbch$tgmEJg-f Ge;%(ŃgC亮|_Gp1"7)hTL1snaFυF X; aD:"[c4 $yt3$ψny8t3$B8FMZ{i4d8g^~))ⷑ0g~r$֕ȝqVFyTx!/wߟpai`sC<^H+Wr + Hkݍ`IDFwN6;[I]V'd'RIEQM/xhcՌ$U`&3"짤xԃPj[^n6-W:5^*;)iΆEAq@OLͅ oۏ?ѣ~xĉV bh:]🧊Ox j_QM}<՚*l'S<_SOĊ:Y5UiT櫘Wed;`v el!SpJ׊hѴ +KvLqTQSuߋֵWW!P=>ɐ\7VxP$]UdF9D"V Mhf>86OMO8g%Cۺ?un]53;2X(Hպx6 GϻMmF~-+%F4/3r!w),{߂j/u8GnC2΅3?7'j{,qNKgf$0,l+j9҅cYaZ5oB1S\y/(#a[fb D1Kr%`q!f2Co7U* 3{\D2#!OKu:2A-ퟛ۫a>\c* R(`y+fm6/TC`sxd O< W4Q$1*bx,Pxaك~;2$"Be5S(EQBF){:1ɠ4]Jo.%"Fڍ`Vp .Vr"F m ZUe*߄4TCH6'Nqji,U= E+QZǎ]=VG=5J(VTQbL?uPQ `+_}GUSŝMלөb*μ5U TPITqSu'fFwk{ܹnW{) \qK6fF"#puQE:H~64wݦn7#n=_J7HVRRMq!=T"ĕTQEXxQ(Z-nᜪ5wvVC{h5U}GXCL0Q&́%OOOL`%ТAxa({|e;o!  0"9bREljy@7@beuG֞'CJT|7J>g_TYUH0\,)$@DH8)  ~~$jIAGP+\ QgusK"[ \_ 6TIA Ho|:&ʝ㦆}vҍr=Ag`9ߌ+FSs0`Dx -F ",i;UEV}U0٘vK-ܸKG3GڟȨhETqЉjn0Vt CJ_e-vlPZ(JQӈ* _Dc5)a ,\*C8#iA˘G3D-ˆ"y<+_D3Ǧ3bAwp*Д:[ -ȿ.Sx@8fAÙf?+LZ묑%5## ޥQ3MeLia0Ʉ&^YX0;?bu5FT6Rd¬\L= FKw$N2ЙdCNL|x78xp&գRzڸ+FEo_|!$TUAck'pC D"WW|sc6y8Ob[U_F1O%1BTAUc 48Β%ăTp/.}ٞ( L84C`t&/*!ٲ  T/H#1n0i4 +(GS8b| aTԭŽ :J }PऄɋT^X:?]DIBTf JB9{sD1C-ŌpR }ʇM\>[[Ço4Ups_pHƯJ1U,/9sґ#Gd.,!hR՞FZZ1 wmT^*BzDJ 5#Fjb` `" Rtc#*y$S|ug:! gl>W^x pJ\"1VBp3Sg?C0|KBʅUjTŕ*%kL |6#ofrKS_RʗW^:7d%U6A4qݬ**$|^I,9»*ޯP xV$&E*?qae(?*?xƝD[gBGgj^[;*:O!ܵT<~A6.r Di)WZRU(_M %1l;TSQv TKYʂO$FL$tz02(d-$ T'_ʳϾ~!?Irѕg}W IDATnOÃرwyGI;\55M & ׈K8. 'O*)f @-8ÅaѠV : qwאAjMZ j#AL>1-^ɢQ@ 7(͸Dn5h_e5GҳP1e0To"4bk_4D>gF>md5G(*;DJsϥ2@(pcRX)$ nˎ*ο{Pg*vj*%XqPũʥt&lY^0%o~>PJ~\#Egԉ#$)k/ܑΝ]Wi=N;C?[o9&ߟwI 9!%kf}FJJZ*PMy`G|v)UBq֌d&rD+SEb󶘸xO|H<a;Ab:3( ]N}'Aa=W& 5uKu{J0z=(Lxo~<9)7t ,Q"-szqrI L"vJhH'ZX&X|M;ѪcPKS=Zu?}?CP*Na1łCiŷ  ؤ[IDCJ̄_ Oʪ9h,F4ҕ~L1+$7C&JTWI|v7Ә`7Լi3/3g.4g-AE1n \?g(G cE'ln";*.]8~ꖠYTX U ~'_i|ЊV4ݓ>˧G)ʥ(67Di8REx .SE.Y4fuB!3?YŒ.M^?`S wPq2 #ܪsTqj(8 ZvMLQZVoJLNu`|6oc8g$: ĶzQ&^Ύ[g| K)Lb H͠N9sN~$WVu]3.KNB&l[au&{"CD]hKHG#H܆rO>yF&1fM1ԫAnMu)Ԏ%*L=^GA A։ǎ_phqY# g!,AּXLiS.$ژat$f҃" wSxZ &U(PoFrPvMlVq"d\3+?!Wt=9վy)ر~ν[KhD,|mxW_]Yyfsw@'?DƑ]&=aʔ⤝nU~so+H_*')Uo s))w4U N U?pSZKݚ*j08NUleUH_WPBE9U}gCE`X絓K; JF KvKbpmǴp 蹨guɥ=zLȭiPӦiEG9r6&i[IJg0xl)zdi^ Mj9-FtchaWC2)br:pB J,KW^V?l̐Z2i@(^a/D_6Sxc5*|-8W6G` LT, = bHu}DUek/ ph…8TVi%Gt{?WخKB8R]."+,[I0&8+QE"!|1N?PZm_D4=^]1/3tD%U]* jr{$غ.-}ӆ9Uē]-,ћ“`m&Xh)drX+hhߛ]œ@7$ڳ|PzASWpTRm+ o'&MJ#ʖ=.m1:KK/~~ 0JTaWN/8m:L6 㹒:h퍧[B>{1QE#g,UZkƹ(xd~cfؖ*YWהܸ uC='g2/MK^И9DPo5R^_TAOEK_5}-Ͳ5N u fV14867 ~I;X)cњ V}\[QljVKlqDb 1dQ,5J[M9!c r8D5FX[x9?Y{疫K96* Y15%WXQ4. 5`l &w3Kh5Y)cluUJ; }.z/9hJKqVeMtQ\dꛨRn-//->򳟭><=8f;Pr Ʀ*UxcR^za+D BA@oV۬,T1{dU%_[k \Q~$C{WSEC/|?x݊?NLTTugbvPۓ*z/ UǨpQT< ]EfDFk~ ,ވ~GU NEiIXXͫFk"^u&s_̺`v9zm|x͇@Ph&>LJAX<6E0͕:E0 lJg UpI3*\*%dj,4j12= d&!oG|B^ vQ1&/zmAgR5VJz!1)ch!fS炀 CH/;vds2!HEqZBL,*7 :T*УU&rCqA@2}̸ Vݩ{ARcЍAFJZؼjŅ?*qpQi%S/>"*^.݁*ܓe>c/茰&t06ݯ< &uwcyufXrP#FTI[ŗHkP*6\䏔5hԆ< !pYeԖ|0dpZCJqϟW"!nRlh?ֲ Kg<'w.Dd^.OM] {ШޜM酞 ]}mGo(> qPm!ؙrˆ C/HԵ͠9*Zکb}ꮦr>|L,)G}_=~ m4aQ VT|ފ' c4׫#Kwg] יxkTͅzh+oю9C DJ;yL~* 33 F1YMo>)\[[Gpo훙?_{\/ n?XGV sESh_gmoh-FT{+BGe**5^T!qX|WSE K ߵTaF)5J8ä4dc+-țJZM㩤"R5Vz\JTnapTUqNbH{TUP60tКlc+)t࠷>'8 hNQQ'3,q+VS#vfGÒt̪)}ˠBu@OІt"Ym1XI\v/{[~|H@[g]Gޙ#4=pYJ1M21.%淄)g31P zDWQ~hziKVְND`ےmgǗ<@D& NH IR9&VSyTûMو+^QS*tK]OdK*%R_;c멂&KgMiX RH/ |D!I xKc:^;)REdefPgSDQZZ[8vlkÃ5^$矟*G=sjPROȗ˿J3g$Ӧ񝅶 rQ"˶ T%\By(jR,l񈛩濦*k HTqPfVS"E}R׵ˇї:,O}*~͇K`|Vm)w4% I%1Fk e^c|"> AE, #0,jrn>/S p ~Zk?{M*Wab²F.7A.ဏAT0g_4iH+iuyyxL'~!6a >.Tr}Qc3MM-/$D %p6?bAS{CDpC <&6u7G s % ӏ҂L!J:(#ZX&i|u4>cm ::G#CV6z.LZ*۷c}֮T€v:wk=ÿhUR*t%Ւpz_؇MPCoFic$}H<l'cwY+ H)УO#_olζG\D|0—_ =sP,<:h3PE,p -9?V}ÿUT7޸ƭ ??]M5U\+U %ؤQŮBkz8`3=n*lfW|c. S9ȅa QELr #ѿ/-hMb"tSjmAV+n \ƨ)V`)3l6T-|%w)F~R+hEՔBUɩCNv%H: 5j϶:d40\stvfI =pi ~4f4A]:6ۢ溒*@CX}*x?ꆺ1Ekn!J鸀\-+C]Hh[Qǫ uY'ˈ@ +:a'.'EJ3aLk ZpMJMmIkl+STXV  g9eO K`a[ JsUUE!x_& %aPEzsS٪zȚ`=*AB{j4|*hK q ir;4"IT48TPEL`x[)̩#p`W8SN'$.rnh{R,^TX x hh*dTsn|E %(=+*υ*}&TE߬kliţτ*^ѕ'Oe5UT\\UpaIn!UZȎ*=}|g?dL\oFǞ0~ 3cf*b&r[>4yWDXXэq`~zBN)ag|N:U IDATmc4b!5ZmrMZ!Ϻ8TaU}etdФN/,je<#" Fb3XŬ{ /k*e8g|Tb[Gr MB=eP\P<1E73x3*cDAK֡284OqBKʕJg#ٔT f OX0{]+Yx$ll933`Qb9%Evqe?a1_!ijĸK5A ,=T/= 7WW;c#Lz?46TQߨD;~QeWfh9[`U"V XHRcmb|ɵWѯInv6=Bؙ*,l?Kt4t:0bEXܩwޜ6 'ʁ*`YfUϷ* oSwOM5U\;U}|X*'e#ţì*> U s7*zfMkTX*Q<-Ǎv9{RA:a~*aiiG%qR,6O˲1o4Z-hvتm+EMB+y5;Q*P.sslTjgAAۈT1{HJQզǏsV>r f l[ V1vRߒYzjtL_K0ܜ8Z]]Zj4]l5^rXzp{(%8m%j8y]zFa6nn Hc@ HBp`Tֲ/ )ԏ3_j=]j )a栣r"= \']a$:z_jZ׫]Xv*ReqHId=wjv1Be K^JgJ/r*2ys$h.j]ià^ hMyT j[ĸveff.]zɰט}@³0F34|ݮl[ UDwT @p)[cUMREsίl"ߨ:_SEQSRK*L0QSEM*o+*؋5kW§(4QSA-GX )fh4Ӳ~LtFp[-,=y+Wȱk̻K(lP̀0 ~ ߣ(;|O+|TvG'L6:k,)c͠#̜H MTPM= RJD<S@>HQT^NH#vQ6j* Jڙ'ΝsnrD16ʹ 6O ޒA|Up^^xD|#rt~rkrT܃%O]},nDՃ U\ ]Eq-r (jUlA9!$46,v禦2Gqu 'l9Y.t>_s3T,ᕤ5X.o/G ,S E.:555Bk<W/\<$RʥAq$-k,|qB[YNYP(T^d?ցˮL=EpbS#ʥ5M7!)9G_&қĖL?;Swl'=۷g8! l6 U1Vkj)L)6yT4Mۙ۳)я- hkx@ v|tڭ]>yrE0*>5Uٶݷ*>rq{G5U\#UpVP`lTpQUM ĄJu#b|UlLB\` &Bp_*Ayѻk8?mBMT6|!1Ϸ~Ϟ}ML\%&CB&MTFMyS̃BAǕ6 xۃ}qWpq8bB@#4)!Fq~ mDV,#raĽ-7({~Y^;em$-?Fsxn& :2{m}IUT!eaakkbbm5pG+ 2ĚIGy㠍 uRw5UJ,F `Ty7TPtc a6+q6FBs]QʶSE}2лTGTt*nUٶd]Tl=xpjTSEM7*VDmw"f**@TX/ߔU#B eػw> ;yKrRAԱ<:nq^h*L(qcYCGrs9zO2uU>,|it.;> cNW)]6 IBSi7N`'TƏpR2S~,ޕaSS9t:*އ*tKaB ͨ-Nx~n=Kkt`#puSBt`A^*QZG!k\E#S|X64;Hc?ssCw4JT/wNFB_:(+Ti{/4e?ia}褒.Br[pd>1%Q"+SkCQADdN Go4*U"RgY˕5DyQI X<ւPEWffcAUPm!΁XB>,3T_,r:-vd)';7f`zY(>]3u9w6&)v…_>rYr4}<5 ?zX&H9M|k I ډys4:{D<*ԡ/TJfe>qYd#p:~um4z=& …76ć2 [GBb_>xGTPdB ctP2w>r[,G#}3I=풺s*_>Ufc4h~2z/qu哂-%AO*ɝia S9GT C`B/}U(Q1Ɏ:E(7zª6݄Z$bIWwgAp]9TO.d5UAPSōlv]poU,u!G檦 5U\X˿#U C**ʽFr)p)b~n_>Hf p&]"=wѸ0C,_tA1Q#'Ϯ˲Ӵl{\n['-cm°"r\=Dșe 6cT*J0Css*G*x^e7[(RP%cb0;tcfB^A1b@>vluuLYU;ع! -ؼX|혓 {'A% ]ك8(Zq6|PMMg6e„X\-]?v FG kT 4&W_HYUxuo;DLKR}q&7QܴU5U$uSzůwsqlNViV멧ڿ7{=xPU 5b&"UPgD_ +Pfrl\#aKhr5M"Ƒ^=6t@o!i$^aAr$Y"* v{7y䱋րpᇏ/i倒Ƌ>rKX6K*;F0Hʠ_WÜW,J@݆ù9t׷ז cpBҜKaeG\[ T { X/cwrH@ \:z0x5bD.i5 kiegх~rщPHb$$lU,`Y (ڵ<]%94]Dvc1 qaV-,z3*v p>KەlWF]Kbvm<6&Շ;f>i}@K6jOY"ae5>S2[WO>9ΒĞbX3}ٌ D{-Ta04Z'DYߴܨARyh :ߌRJl\P e3"{ XV?AӀ͚*L&PEa==T٢tர*nUfXT lZ{*a88wNQ.zmϞ=/^g6#|>.YZي֯?[j~f\A>ExD>`0ӗ]>ܜ͍h};2 F:R3Q~ C~ sKwKWr0Od!"fg;|%W;4%iQ7?d[3APv1!r2qrS,\s!>% Ǣ$-4yaL`Wx]ytp27>S*bWW4L! nP%;"E5If[ZMJN$ CskVRD+\!4 RP^9?9=dJY38|aʹ,􂠘&&(p{6Fȩ}&ƓQOƆQq71^ xGSZ~G&ER`n~GLEb7..mz~سG۬sLŲn ZYYʦ $JDXoShMxJX^8ኈ*NZ;[N`8p@ T%%ݥg_{Ta3H`; g/E!#~ 6T!D{OH @"C ,CsBmHRME#EP6ۆӵo*`T5nV|>~;=3~q\QUWTC΂]JCNq ؔ16 [. Uu,Mn\R6LX.Ïp]ioh=B0 Pu66٫Ȧ{(_D0zbFup` 'x(UUC2=eҒ,aؘ޵ 9s*0g= cu>p&0Z k ʎlIw]!c:e}R7JJc4]wH6@N]{  o~P\;ɺKGTS`ܐOB$!Tslz%}__/*}&1V{rBU<iXiG77L|b&VĐ"Y&(yЂx56R VɤUQ7UR VBcL0sۘ.y]f8APFSqE ph]_f>yCDc܌1ȕTZK=S3Rf3q'(Mg/'"Riθ.A;+;}^Yi) kgM.y\>PTQS-*X񩨢u/f_ܗTqxXq|Tw/C驩")UJ&Zbff}4j4SSMj #KFF̸|a(rQju dK.b G#w߆*tB ?PˆA}XnP0ԂTQ}JYy)NJ{SA:6_lhW/jqO@ a+c]c@Dxj qCui듉oY?sa*֥2'b-A.>pzzfәEF0hMQ'B%?hĂTP3֥qch\Yke IDATgw>QImo).(7BH";6@M̸yXXExJ/pO@@۷yJM OꉩY-/y94h*?}]!7 èP&1Nv4 ?X*q@P#Q &M gbym %a +lU*oNjlus'i{ yMsR(bّ*L[I[.hej7oH0}QP OUeRkd$ ;zCSqHݘ5U4١5U\C3Tqޥ9DT|#b+ B^SE:oUXqT7J;ܲ p/PYSMjEIm MNN ZH8b4 \qEW]4% (vLl:XJT \&!A+@o{/<7r~Vr7>* K=Rp.J |Fq}6E8?ŧ 9ߌ7)cmԵڝ<\3x}¬<2ڊN`d~jV_s"w5؀soj%}S?@mDGu 9elk|^zr\q˲u\h4jn4k-<Ag!÷שIdu2X(ħ2c; pGnC(oqTQW9с)Uv:'ݍyyƝBQD3HYD 7MBk6MUjWKTQ-/6^s#(zǓMJs~[}GC7kTrN[aFrڄ+D+T#ص uEUӅx׵ *BJx99@yvE%LSZbd⎢ve"Gv~6l*윚*nU מvU͚*n6Us V\U<.u$k` 3pv[t-C7 0TytOhBEƸf8ޥt3_$a85Ʒ!4R(ImPpEzX&&~O]?PEmT.4:xQ)) &KW{b/sr\BaH"X f A*= Գۂ3t&&WvkwwZ]w/|0 W`:]V3Bk90~/`nHH\y0f#T 7m"tUq'#kM#V\8s+`UQ$TAMCRYUZt%D[HvqI]PIЪˢKYI"hnCwERNg}V?uTFu#\SEM*+O\/Uϟ?*PqRW0b ۚ**.׼Td>RE.'sj"vǵclOǭ Fgù  .maZuz݉\Z+rմd*TDv* ;m"*(jB183{왚"8K>30jURG:E;9AR~/: u0tZ9I ᏼFyFQ\Ϊs.(C{25UD([07]E8fۦ4 `X 愱ven_,t#qXBj_/"OGTPBZrAaos95k׵k|"b9u`/8gkCLNszAم|efڶU4-Sp݅F~an * i5PEnwT>p-s=T}O驩"9pͣ3oPCڽM2)ݔ*o5U`MF?禘@T]TqR#0qA=>aAfrgP#QȘ S7ޓCY ȚDwϺ8W:&79#MEBhQvQckt/_gω ZĶlII%׌1Nf:Wp͙o>護#G\Mt!L3u*,^>s"f@21bDpR:\FL$%AA#Wۓ{;E|,P/Tl٩tn7b:陒.@HDw68D|MP\It~nJEW=&{[zHӖxe,9hZ᛭֩S2CSVOyT!$w]yYaICɭ'spOdUT:d50l@CA$OlpVM޲? =ƫPFk 78M'/,ӶI@J')Z[[c%Ru[ݡTQtt释k f (5UTSAV Tup+@zeXps5U+\+UL=4k"*N27v궓 &:3"K#cʶϥPʃYQ w3upjϼ F'J*u yρއq_G_|ァ/]pYǶߕ,%Ued3Oҋ(rNeHf:z_Vc@^^v4Ϭ^ A_Jr==tt:SN>|@kH 3$@ObBASE_$w5gЭ=^K鹓TJ*2 ˊsb}bY+umMWbn2 +Kix68Tg_Q#23;)UmMP›v<ŎD g3H3獗KmyE5R(؊h6v)|ʕ@ӗ ہ*FBc؁*^}oS>M~[GY}C;P,D8ae5UT}zlIjuB^ƅd9'>-1rfP&QqQC^⌳|b'͂l3zN (pP; s9 D&OM]/?|S%\!q H*ܒ}a"!9hq{x;jFf :r׿}ƕw~ىnpUX PP#;^$Ux|slʇ+Q&2 hM3<.9jo0ozJŲR %+h3,WF*JE9KKF̂ ^*DT<~7X\4+?C{~=wu) \gT^)0S"0mQ츆q|wlͻ-U<(5UTqP|XQ*_`ͥT1'Y~/USŭ MVlK cS7YM5UTQ%VXdP^QSEMUd?\<U'BM ׼)UVTM* PšvVSEMREkQ=mM/b=]b=T^ctPQEHoBbH闙>ipm3LEJTXX.Z^@e-*bE \k??]җpE5K,Qэ L|i8. ࡰ"0nG dl\[$!1|%Ti+.& U*/U`IBΨ̇)@!?\M~M0"C$CEUۻ``~ȏ{o{ϟ74 *~/"ga4_ѻ:uvP :\n Hyjjuujn+v5’ UC%3>#/+ZÖ$\\`vۆJ,p(> qu0AAttSS[[0Vё-R[ͥ 33ԔNdfF.!w,nHo d &'jISV8*$1wۯo^R)18va =fpu^4G|=(NϯBi6G3d)Ru/;b"j^.'j6pqp"bR {_+ BC_HKrj-#urrjJ:]fʓ*@xRS LQ:..TkgЋHsп^FN*ǷQ^J q *xD)MBpOG4rEuUc`(|`iyC}G\FZ64+L9^Br8Vg0&2A:RtŕrCoՒWR\Sg]ӇA!E`a]kwջܶTy0gvM5UT1P^>`@xm=oL0#6?2c4њjC]UpW i*V8\kQR]JI;]/Uњ@T!߬a7?xuG UPU7#~VE$GBi<϶TQh?A3U+ ^i]Hq1W%ө* l{ SrKh+Yۣ^ojJtҥKxw@K4vZN~k #*]+Z]~ZelbWj@xBZ&L1MHG`R %⶘fIB qXIwF87wXN"4FB_ggBq7H01QH =?@@I=g:әs!'-&4!_b9Ĕ5&'LNWh4?LL\w#u*lmg">,,dDဲH@ ׾y&@?E{?WvOSƫ_PdڻH#*}ATQGI4fW88b7*m\f\!g:5E;3JTASO;SƷZ4}4IdlƮa,lD= $\Wj1N;RE 4b5UGQX2^6;1n8_6MĐ b9noh;[5ثfM5U!T1(TQ6<4O*t,/K **5PwB玻UMTQM\cYƚ^/V mB]s>f(l\ise/c[;kLO&y ɑ,$AV'Vfa%$pN1!ŶI*&QLE>JcIf#dX +xAn0F&n%(P !?0 I<} s 4/ԒW\mI= ']7 %!l]})C1n-R(U$ ް<"6ɼ[r@e )E)dؖ4Px<66VW%FS~/%4sjs̙KpAbϝIGBnZ.Eqﲋ0THD]NC_8g )l$%KI.:}&kU>}[ʋ~@q*Lz1[j㦆y2BlBլPE2zbm WéV*cBK*n0 _ְDk{x$A)M==[:tiAA{{E$`>O2 c;xע了wyZWNb:sxy>dR^@904I."VrX{roPbn,,[LN"^3dmx񜴯>)ٲ 1{ST+mut40~njIFF#"*O'lXMa%U3հ(y/0  b5Q$Ɔ%,k5wFf|€ʳV M096NFo6GwѶYUT^o.\ hL;>k%a#F,kEf./C#c.d:/ѭ su,`?@vy<}jT݁"g]tWu}Pن%--㤣mnN9-loL1U~iTÊ_a+1UTFkSw~}UkUyL1ULK2\<5xc4j  wTVzcWɗ# g yqkP?~D9r)nZ+fF42RʳS_`$ ہcEJ*wMпV백-,ln^x۶rAUyiw b-pd{zqHs+$妢%f7Eyof?Цflg@+H49B @jCFFƑel Q_?>^\lK(-eW u=z(k0T:%U$2UBdUymIrzOF7ٹcǎ*l*&%> /QųB\/;C?eM꾒GV?Qkjm@f,LHfZ/}姠 mTbG"°R(9A[\TZG0/t3pg:U9X~ 1U$c-G~FcP% H<'w9oSELS񿔄6# kL fv]&!tYq?s8h4TQQU{wAA~zarg'$'EJ* {I%f{OE7ǎU-0'i sD4Q.z'RJ/u1}O堢&z"[D\(NZ@[DDuLN*vi;:ˇ[Zv,.b9AHPACE9Xg5HccSQ1ȃ{ײ겷H9+JpiL*@r%eees ٹ!FeYFزƸP|"c^TAi6dkbⷉ*2` ybJL3*lY*b n2KS=Upd-w$Z&G%\hT Np݆{U*ari㋦bl6pgmp@'8RԾ0+ɻ:?n' b_-%g6xh4dU}[4Xzc;q96b6@ 8;r0882hk@ڪƶl)/oi蘜lg­b#)5L!&fI"bJ=>b$jc G)ҟv L4PGNHc"vϝ;w:TdtQGMM| h>UG1AͿڽj:{Df{XA WTAYy0q*R4ab }#*p''$Y* XQR (Rk thArA7Fe"VCSrv[΂Ȏ6̦,gϕ62T1US э$Tq`ALnT1é-mc؍*fQ3pA(r[XTDh_8I=o6bH r>w0U? ɿBK*1d^9JwյbPUHB,)G .e4b` g QG9MTа{wSn24dB,!a+vI݊ڟG.HR14DQCd|0L Q?iI.dִI[T썈 QNSB9$y54lq3DS:@ޫq@.;P--uu-RUURR^^UU51aCs3rv rs|| ׃` b@ǰs+ Kp43g dh|¸ I P{nCZHvu*0yr\[ hH<&RR@5JFWz!m讬AB6]Ҕh(%}VbPv v*x {Ʒ EDgL5:jӗ!eQ&1<ݡWr('\tKλ䗳SEX4_ ۞۠TD+7+bbSEMOAE6;%PŞb$M%|"wL1ULKZ^ t]hM p |~h\h&]V)8͛֫L&L,L̈i˹QQs^IZ/Vr^T;?%DQx4xHG2b+ P$I&3s}APɑlr:~Ҳyc Y)f.r<~)h#ihbhX|:t,R 3n|T ԄL/ ?`׵3?2pq֍L&Mclr?Qw¹MEEZ&5Q~8=-2(/esKJu[?Hanwc10קje`PWjBpA:3@g$AsrV"8RiX"<_CTAiisBCj5,Iƺ#Tݐ:[4QҬ3Po-Mtx2rl[9]4P %.bw 7kB*rhXst4Sr~T cKSãJvHg*PUH1~=a~SWblGх\'ɓŠ*bTaT0C Ϩ~TΘ*ḅ.Q;cⷑ*x- P$뗵TSŌ2#7f4UdGW*3*'3*mMiPXSELSS/b5ec[9е-("UM1 z#!4}Lqi+i&*s6\;%"O&AHؼdCD)?żeZr(J" =Tݵ πNnٲ}{u5{-W.DC'`gBh7QiB%^9 U$D5Z稊:5<1@aaQQCC~>I!S&d<1-4T+y׷w}'t8z SSJ)*rDQ^^RRUXWW^˛((khصq8 ň+HSO] <·uvGCӠNAu$@>DD}vp~=8=F`HDhŰK nIQP 2>~qڀ+ƅyˆIwtQ/Τ=DS tU 3\tL_+k<iZqy͈ *o$?S/sﳸ `; 4;t͕J,;DrLTS̤9}7FT1:zTӓ1UDT1BAE*W*b*deZ6dx:/DB5t]JNy' G[`$8e9Rza :C(~vm:UGxgG%rFM9ܣBplvU0qc *9a<^<8ߘr# YH+4Lڧ [}ID.H3`|Jfr;p26Q~E  fD0歭UU46щyæřÇGFR)l050\OޏULg֭[,H`S ';v()klGU:PE%rLl l |xNL @V?#Ĝ B1H:s6O<|Հ@` Lm) T oY,Y[M*Bu}9HxrS2Tww#0 AYRb("Wv۰a77=1hlI&&Qeج5Qd)hIM|@`WR sy %~ L~xd""P|K҇< =0%/$1: )!m?+MfR GsiB9(..,~^ %-@~LU3٠1{'\rMnHsYR^tԯR*lj`p>}c<(HxUQ9Tؕh$*+ls"BNfA+WRLRUhRс3dh8lU&$δ(Gv!Գ0k,v\`H]C&"C#zz`XSEL(3*ᘕ$rbXROd5<,T%/ī IDAT7h, e3}* 3Qs7G<>W"ؘ(*B B?< zt38Oz>ۂ6p2o# %ԛ6z*xaҼ?WT!Q, npCAzLltC#M-/زYda֜I+'+`Tq2ha!7>CwdEHfnubGM{2&/3;J)R,k [Vp*9T (gv`Ń."A .t8cUhcOac@[ "^8^X-AEU뎗KkB(#aFhE3sF>U(bcWIOQ5*(l1b7!5`:XLg!?DE҉[6N}3;,!@akdKHLX= lBTA Qf RmXHB66zx'xpm&9Pg&jQ ܦR It֭=I 3>ns!V3z{ojk,;L>;'mni9c5Ӂ̐B>O1ƨSYZkMMz񐴳U:p2!߿a۵0Vpl0{| B$"vS& F'(@ܨPӟ"OWg6BT!X 1U|,BZphX '=Ё<ũtњ٣I66Jz@ueC̪YW jRU‚T߬Gn9m+EMqn;ˑ@$Pv 2V?p3V~n;zi4RS.i+GIaU5L:{-U"K!*ITD&ݢJK O v]Ė-w㼭V󀇓BDQ/g{Û/tV{S⾾={^A}Pn%ގaԩùmûvm۶f͓O>bŜ97;| `9xbDk" 肰 T$p,p chX3RF8&DZ #L5cy8D6Dh%㥥6'h) xb( =[%j;4URa8Wшx$ aKVOw IU3*YɤniDhRB^$F9X 6$8T!֢sꤓ f:?Cq<|wbݚAL<%hԭ̴Kt[B3*F7n'UDHjPZZρek5fØ*TQPE'bO&3UO*>%*..U:~$"bpgңRSELTY)`5Dg %Db) e EE<Oک*b"?Vz'n|g0&,08bv3Q\pBlF7jeXO2S;Bt-%meIŶMK44V8Cཉz %iYh -+2P4`@g8USmǴPVU2'`GF:::JJ&&n[w3럿项0y ]&ہzt&K U/x0"5 SUQUUPK[47774oh֯+W_l٢EYoܹeewQf Xm.Efy% ,S,FehYF/D?! .J6VSX)tD=0œ t;eUK%N0}(4ҝNG*2mN$'g?>Sk$֡ZtL㠊ri*KgIycRBϋ*`٪+L^|+rcq{;&cmP8 `Z,xdBoq%eՒ/~s֬,_*JXm{U (ȥsS#i,fUT,u)QEM \{,]~8) *>T1)%1}PE5CR@S*.8UTa?TDQEw<:kRmۋ" ,Y)Gf~f{ov`MH$KS{scrͬ`YjrCI,,{C8с}gX˶aYEh`f~/h_)IG_ℐRb Nb ךg U:r4)ڦM|"B)MħLz/1;l͡D̅t.qD'0|jǎ񊊊I8BPB `2ac$c*WARtϕ+`# 2$C;[Fu/3\JxޥXq\vxE؇ISۓ ݾpAViS+,t$W Klm--١B?/rűqŇ&RdQ=DS?օ4ޔ0mCN"6~hoZ}|8>ڸ󢢼oW U)֬!8tE^~n8ztڵkÇ6lؽaz"lQb2vR$ j*M6ymVtuɞ3peX$"aL)VlMaiFp*#f8+N@@mXZ5 bZC .E[#^k}*"b5({9is BskNU:}4#V/*ʵ;Csye)"M^;ՈCI$,B{U2?%7lHHe桙})x|`([o0݉54t tx\O0#Im-mt>a~e5FQ~8p:@' L6PőUS7WƂ|SELSP<#!t䆫^eW;U:Mv_h^tGL1UPq?ub>PpPf:|3*bÿ3˻9cŧ\nThb*Vw| (|TqS_QL1U\(/lP% zT1dU$LL1UxT:B)D{6* ]YzgJ!X,iN\#zq\K ˱olD/Igpb2tO3?v[mIa&q($֟ k@)Jh/Yի YԑĄ0.g<,i:*R: vգ\#>j(m9~k@{؊OHP8Һ:챱_C8~}K/tӧ>꫿3r zZu\%GW*V's؃ē1;q:&T@OaU\s%T0Ud_4@"KL1U&g9PEϐro+8SEL*&WXx_wᕡ UNj|H/5k;cR*/DGG, PE; KL1U\m7[yv(RbNàɹ}+TSŅ#GA/1:CTa+~tڢ*b`] $tдHD% sh Zm+|'oOv5ɾpH$sjŋ̙絾~⛺t_E|#$ڗPpΦURZ29CEn9Sդ]8;(@,J)PuΧ@_Jn<l XѠZ/vΑ}5@CJ͙2ҁt:kԧ_ӭQ94IgÉ0uuEE[|+_W|قl@T1geH*JyvvN 05>Js XrJO "y0>v q@ Ҹ!c -be}&%yu );h*+(B+ vW:n qusaI Xj׮ց71o8G/+dA oY*U)`BFΡ+1b]τDv#\U"z20_FIkwx#~[W'Lc<."Uh jN_9U{&=U`ǝTD蜍*P*'U\suL1UDA6N)\]7 ][d4:9TbS IDATHCa9_NQ/Jwk6g|iz LTIiuCHHB/Ak཰xiLT|#m.$IM1I7"Tꚛ/lݻ+*N@u>5][Y9eزQAAJJvLN y5m2[o1YV>(G|o¿Faj׳.WReK TAjر,&ʌDe^k0O&?=aK.Dwo^V80NvnUWwT{W OLJ@?>T+$玠5LL*K^UuQŕi*/b\bbQ2zQU@w*:PŞFcSocЈfwWb4_n喠xXIS-ȭx]-;9b98 nE]Y-5{%ՠGj8:4_%+ QO[AnNw+ae7:5$IW:,o*lt&GMue5IwN䀠p12}Pa'-+{?cڰa\)+[ԩ}|wYg:+P~Uytw--8L˭n@mPNE^5H jkM0TK*PU8ai& [R-ũ#DVq|ɽBx(u?ʴ>(R49Y]G vs3YJrJbPbDZ/s5} Dbl/5R84u$jTq|ATa8ps*ճ TS CU{ǝGBw*{4Tq BŬYp0 7b*P1U@^QITbS oa H=j݈Ѱk98~y> x$A%@+bwNf45986tJht,Xp=,Ƃ沲Ç7o7o7oƩvm۶~5Ν?ğ^t8ĉ{/^f߾Sʰa,%G6B4/K Lv<2 iÛg2%;sKi;EXM.}啱1b ##!9%y@nVDSrDi_,Δ7vї*Hrfb68 u 1WInm7U=s2,x::zzM?v7z2sRdyn`Z)m%3TȂP5ɵ: xNf~Ѳ!}*j4("ҩ ! [5FFfr"RL"d;_*Rq͇A+ YSc-oihL1UDPE?A: PY0U؊sUܷ렊*jjg_G #6*FGP1%Ul0dM>ULM_+Ǔ*8Ɗꯖ:ht׬J:I+UIH8Ǚ e(KIi=. u Ai* Zg[-x:<.㓍=NW`(1Yi9'YQdʳNuv22WT8Mc]!]W` _UTWM7 Bf9Xn#(ڋNRTuuUV"pQQi)zWIɩSOLTW gŜ ?>~xó7׫UW_w?cdaai)6"+[|c:S#8D@.j;y`W,ҊX]J<y-gٲe6=+6Xbٲ;0 /xOo~ӟ^?(֙ hwi^N/EfUUՒ%;vh r`yifY2"3Oi`H12ź2*kYmms>W$ԽzuT3 ɮ.Ъrd`GMLvv GPs)ZbUZ4_H|x%EeΕ;MM:8!6ojo14Pra:uI2Q ,%s t: OL;uJ~5lS 䕥F! E.v߿S(wWQr3X%w1^q.$[avLJpF&*r̴r\hȿ bs#j4aE1_Zc"*=eRE?>hؾPEmGK6]֞ETA 'c| TStTa(NOڼ|ES+A]jZT1 2ᶟ pLJ]z&eAPE]9c৬I)g?v r0j4/yR9\"92TvmGve@UE5/rtw74lߞo1P/чAjlC&j3Q 酄yءb4+-`@P+ɦH[HVgd:񟒍قcu|[/h8p`Mm+/Grn9*bdI{7ȬVnի-ZdfAQcc#\`"6ʪz %XFDT,֙jdLS**dMxfz/~Wڻsu˖͞ˏ\7?y>;_6nܴ׬RCAn/mں:|HewIpUHJ# ޯ"j ;<;U>;5=f ^Nk%<!g%\ &';vlp̆ D&I|x+,c8f26] *NBK(<~;͇\1|{ץ??:uWS*+PrR!=0T#<JFVAX +V\"T~ ɣ#dPSE9ośIji(Ae%fx߀R:񅥊#*U uY"*HH_[yџER^ #*^}kS*9WAc"5U$x]ܩ"a0:U6Q7eb8R\uy*{5h*wM}FbKEMxDT/NCGj*բKq|K;*@RZ'7  j{"ٹcGsŖICX*׃y$Ϳ^DB˱O0YJQZXjt^Tѯ 3ΦMQaFFN]{'Nʕց* رc ,_L;Q([`|,0ngnk.1A8@6@"+ TQTaAힶ`6-U$9p+B\(߈\ ^ !WS6 ߹†eh#_r jH~w63ж:%X5gzT-U聢tGfݏ48{r\1Jc[I_{ @8VLa5o)\™E_F0O[hdP$Sy6b9K(LWç9)O]H>GHx3Oci$* >5oscUta6@T| o⧨㿆O1UTM)M9PE2y7=Qq4(ŷ6GE1T[FI'ocgi~9fQDO)7дx$!EG;G78uLPYpeUQE"= lȉT kI V2dOlwnLo'}$:D(2! -b&UBb<Œg ^;B?|YJnWjsb(jӮ̣_ cOZ+N+`H~z<>>^^~{*(WX*r_QL1UDQE>A@m΍*\ݾ|]Eh\~\*u⨎%x4@vJ7~gCE27Eܼ/y6$6.xIk@hVP8[=X)`i O9RBVTAo4Q?VQԐ.Fef3|Fw+!b(VFaj'myuKXqйQwnf! L VQ Jű{b $0 |*A`;\Μ.1UG|Uith8yxxpиDtsy;,$< t,yaawwwQ͋ߜSb=JZDjj"(Rzrh! ) $= N=J>Nbcn?aQhes{m'NxCУ?WD?9k?zOUW 7w/XaCLL*eFFpzz^wWSZAgaLxY$ځE+ /MJK[*H ^ Q[z4PdC+ Y% `[ƄfĔ[ֶyUWZ쳵V0:'h-+դEr?5N֎IpdHϥT)$5Q}@"YDXQFWd iIZ" o-<{E< }7WsAH3#*Ĉ&/{7<`ĸvV戶ۥ|@5{?_k4?'_*1I\2^0H Qғ٘*b*v./*ʯ3TQEUk<Tab"L>T\@Xqb23hx[A-Rx}efI(ҷci6ei0<UK o)J{ChLYIzQTAkCm䓇uisJjNH--ӈg3̰izEj%Ɖ{kȱI`MQ"An*aWjuuAAqq1m{"ԔD68洂fwR:n),Budq= U_XXQP06V^>8m(m۹>4b"@6桄@xCv%p #G$*//((>p`3? s_w~_'?A}[og&+җ ĉuL{}Y ZŜ.㦀+鴿0'J`PQe"~]~Ck" y^h5a; BT^yK/]v㏟81{EW_={'ygٲ{9vln@^l> Y6Q PESq@uy! Q HvМ` 괦܀3*̑G4*)/ ߝ'򬟧 gpPZD%bu#\Amnyz.epnPF*'TZ|Xva&1$L !B,RsnXh-V8=Xত"(qn/t&}A afL]]wbLCBdnI[(4˭rN OpJ}8SBn ,ނA:T IDAT.F-ƪUgc$5 4OO`ȗ裷ߙ ׮_n;rΝ+V }Y!Klْ/Ƞ\@Z7#@Qs .@w%>2Ui;dM-w}u*vօIM>VIBdwިIFkxǜ,;5>6$IiG}9 u]utI1fı.zY|qC;\eY7[9y㫨B p`ghxv %L[B99<7=*$uIpta!2vJcD^s]M|xK˱cvbX>U$z0W*"beZL(TPU"sV@Ş2*6U|+?UlxP_cOL1Uh O6*lTLh RE0*RA8L,_nd;r@L".j ~E ;;F  6VuRfK]fФ2$|Ad~kNaPf]aJ8sW|QD#)nKjJɊi]jhehXW +; 4lq+:tTn_RjӕBoW-V;e{S3EJMr\( .q)3)@3r?+PFJ'Bs6M[(*42|NN"`wmm6l(+;ԩ]^~zyn ?ĭ~ꍯ#<SnݡCo۶~͛wڼG6ǎ>|ؙ3eecc卍H9>*{H 3efΫ袈\F&2Ii=ɫWϲ0K$3CT {gbh ֠ԢPiHVi] nh'S~YGPiFRjyREpg8-e|Wi"BB&V+q'vӅ$ dPwxD(jkR$*ɓ~VZl9r)D^A%-' rP~M*ZX'G "5io1@,8|}W_}KV>K[0l[nٸĉev3v~ĩS˗b-9h {{Ɛj6Qw"1 /\hπyʛ؝&dÅ!VۺTӁ?C=Ba,dFwk0U$ً#bHRzZ<'1?,Jpwfjiu#ory5wB$@A:tmf웧ϴ=֢U/Hr~sݑolC;K:|4pnTA$Uh[A}Q(31aIS'N7]z{#Y \.U:7TvXPE 1UT* P'?~P"" uǝ*Bt~pTebSlhx1gfUvX=O(#zKVЬ#&Svy%y&3B:<7CdJ|c_=Iioik-%}̐؞oour[}^o.̙ 4ۏ)hg2G/5-!nc#]|B8;T{ȴͬX{-"a_h6CUX N-y@T3`ىZ}! S\=O0Ҏ?eVlv$Z}떈Ԥ L/袣`9ݰvɒSm뮓Wϛk׾?ky͇yXxffb>Emmoo^n:1g VGmgEF,5K+m/{JTy!SXo} /ўu^3#%r}Ĥag)A¾St(`} J+xl<7RĴʉ z&H1缃YA)]Mѷ䊘HC6z FC/rŊ ӖWUd-D yX>t'3hdp̓] p(@['jv2\T*$b r*6?}T![!AJ3G}& wȒ7yU%4~NsJ'/w#ŴR 0U$GމLK+dMrJ}Ybef4JU%Y"Bx]Kb(fRM"@v9B*F)9l)Вo(O6"#W,UD{TLth: 4سQ!#UFVB+4k9Ъ7\Cl̻1<˫XJN^Cɧ`&˩bzH\@SR: !W5m&(+irndlx C[>}ܩ_SS!=TԤ_"2%N::!ɴ(*XHŶC9J*kӟf lM:lllliey;f%'1dk"*]8xJE:^ T%Nĵ@N>LKcIN:܀,.F7 S_Rg D9kmSL9ZsM3},ȩd.]XWo+nTǁlp=Y Z"H6 'ÉBRI +$-(//)Ap ˗/ɕ׃+W$gy䑗^Zz({k-[xq>®ҹ(re-[#5ٲcsᛰŖԢ̩nɐM)._IMVUGuZ \Ks**$CuE4JTTR:1KX+75[mNzu̚ 5j:wT(rW\RWErcARUHN˪:n-}zj#yI2!ef:{Ҽɝ9I +jprcCT7~wz8PtLi Tɼ;BaaGuww.3̝x v 1 GAjmRE%PŋvOx8@f1UvSE#AљK;+ƯT!% **&W8tE lDXSj . Gǿv|BVdZh"Efݔ |=5zBbM>U [_-i ZprYv͑*Z_?t'RTa6dͷvɓEE##==ɫy`{Ƥ*E`[# l"*B£+lrA$q4\&>Ds3XMwtv:BK$@ x{nIP*d Ԉ'SRSL9Ř,an''sr7aoBr{)Ѷ)4jT/W`Ub8]J3qp!%SPr\Q+t"zCCmmCz]Gwߺիw'\ǹ!SS/@ٿ>~0QEw ¹jMM*8.hpcT=~ Bu|@<%hL<-珎utɡ DPIզg.U+CUg2wԉ- :ٲeѢo./TA* bϡLmts\#ocnsΏ*^DX_Sӱ .1+{-|{wx|<.pss]p;6mjhؿy|~KofV՘ #i|BrY tE谋fXb WHU +E,7EutTK57 B#8!hHMq'mZUA1+.x4xxwg'3uW J*Ii@Ad`jI!nBCXo<9::.l/mq7_t顇6l@8c?O}{ً/?kΝ?o?$R_r't vd'KGRFy4:c \;{{kkHgqx9W7j! !WCC]]O<"ae.peƀ6‘  s~hf,¤ɓ ekNnB*Ƒ8mnT֗3+a bö t~_Q靝Z9[MwڡCe#l+P+FILjR~iH8ʣ|)&Q[|OM[%[^l VF9?XI[=jɮόf(5P,>~h`u*@I,?[/tROU>`ڠYvTki&VAeJ UQ&  M/MaTu0Բp KXeT[w5[n룜cʺ'P'ɱUVBf ۿ|wdXFe W(0x2-љ܎OvDmĜ^npϩ"ZN W<(XƳςdJ'R8thϞ[׮]}=#oWtϹ5k6mڴrOcmڴ?.A#G}{s4,`C qM7 v}AWKZ4Mm@-M[28::z{y<gz@ݜ0rYwL|! = tE z5"E!% X 7qp$6}H͔² .S UL3 u;3ŬI0Z}3jțm1<[¦0&mLk0ܐ)lRTJs]`SyAkV;Ō,+YIFʇ,/E J:E:X]ZRE(tSE+9TuϠ |^eJct1[&TQ U|ݷWJm~.4vf  Vªk*槇_]_B? >Aڛz'ގka 4 ]hU /Mի::`dAFRh~-7'A^Oϖ-1V/$}%5,LMc͚Q(R|AÃc wX~F|vZ*MW3ġu`z*jk[[ɨPuP` K 7Zu,6\&]~;=#JY,E bX} P_ްe)HߝWܝDkx%Tar;Ѯj|9+IJP?=$[/U "kF1T,wN#+*)M*U,GA2~Qś^RōN-*f2a+ (l&VVv5D<Ɤ*:lmUUl*&+STud$*U,CEPśRōM-)f[a+MMzu*#MZаhB0 RTA Nȹ!gBdn9^%?"{7Zq1Tb#Bt@kFzDl{(\w1 0>)3ɶ'gr3AZL3weWفyZ@U"[ZE\yz30JrOT┕߼F6&$/sIex+A6F&Χ7̟҅?sgDƼ9x!3P9 Ocl%vBghmƈzʹ9V;HWRR)[lX\gnwlU #Gm۶e.m޼}=qHKKWWE @5d Wa WeHh AIq,̈ BGJ8fDzeA^B}~fMўF. S?FZ&Yadʠ%}!I; ՖTa߰[ '/]¨V5|%h ٣᭐:۳c[Qjʔ.#!AT02oXa)S2졥(^P1cSE:PRdU8 ꢯ҆6-q@D43TSo| :.C~mPqD?Y6Tx UQKuӊ*܇ UX~Tq~Q}TRj*PGSuRE1Yk*"HRf)iwEjdda?񗾚֜kFnVAT ;F+n<1;ln{C1>{Ϡ iQVmt< WEED@ b ] ersjezA#*;V[g5}EZhVG8ZP;$;Rx䎡@`Aw_~gJc:ϔ+xK1=' PAFG }j @< ;v4)=@*d4knǏopC*}o(bݻ7mBRSv^r%#gϮ_u+@VL؂TL\Fd1!, LdA~ANQ(EtD풑[S%S`eE"z UqQOi4}4Tl,E.qfNLpAd;GL;X*&$vZ' u Ձq3B{U"fƋH<+ߦq,iq5TlML%TZ{\UxX 2QD-oG8UXE(ZPE"2\'?rhṂ9w$oWbQG@w4O.O88{TF 'xmyREa 8~[ Vc9RE2&$T3)=ޑM=̠ )V0ҫ1YUJ%MԜ*6FdMG[a.O0;mGt_] :_h{~-eWv{hMF &NNyugt 14 $/k3 immnF190[;մH9kz+1yDybb`G2eiތ=V;8-K!7#2ǎ*"“tx3kočZp\ R d9yر{8XvӦ|mp"/sOGlٲnʕ_c?iӑ#/~=-Y (ϟrET0IPvcs9~jJTFES, d3(NL.AX#m@mKoA\-'͢Ta#'cüܟ/EZ`)ûENn} 8fUXA ,ClRsѣyy賌bP|jr-K^ U친!f!tNWJjۮS2dgVʢ5e%'(RmΓJWObQż9>ʨ|NҎS?-?Tk*:Zɦ83bI-ay~Fww}LNٱcu!Ӈӳg7lx9$`[jU.]7?۾ns ǟԛ_z׾k׳ϮYm {0VCC=,}}Sʓ[W9ME݈}Jh诤l˨dLMͨӡ,e6E4hv[*RE4o DFT}i*MZLB3@EsHi|b ]>ΐʆ+Y}UjaC$+.l2p|BF_2';eIlSMvb*FG7nt3̛~wGwߏL9{vƽ{ADh_BE {]Tϓ*|jL)h,CtO*E7/}ՊXgh '&N[*I{~~Ϟ͛7 Cpࠜp;=v|4e74u-djX\;,4tk'rWo\11<輖?.hlASږ7=K0OՑf]&[ `/rvoTڮ)IZatQ(1 dHK*_T7|p&5TY@U|BkoǷoY #Z~xXm@.mժ˫Hz@&MwfHï*V* +VREpS*o>d TqQ:$CB*J_pXJUƆ[?kj乖WHڦͫJ7cDDc^k>:ފ >gR>Ifh?eFceG&{ &mjjB'I ,rn2S|Iь4Pثy*6Y KFB˜'&v;fT8V`S*f+HRE&t Yf87+ݡLJj; Y- c6m.UR&c c܄>@hooiCCݳg֭'N:uD *ԩKWʩo~#xԶ{_dJ-_|qN^3Afmnv:{ݥ`1kʺ0jh텄 $V[S+y~$ s\$p%l 'd zZ*1?E|ed!3qR)߀~c`!S2) G|-MQQjUDssk+pģXTE-%u2*Xq Ṳ rUQgvc*KpP1XTqop´7{7?g翭RD>qԾ*J؊}*U-ON+ŅsN'1Uok {-[@5Bb v '&E|# <=6677WWԄu>7V}a]2ֹ{)OKd5x+qY'kӢe*UW +*X9!WwSrzx`_r+l33Q^vP1}lYͲ]jdOVkg΋bx c)p`n#;Z[kkɔqv:thժ_|m6l!bGT$}oϬSO}v=?|M'N_w.-6030 uw3QA\Lx*ʽ`|Kt;P\; mq2f Lu^Fc+4 (}xEL4.O|rt81QLNf qMڟvV>RwKEԴc2;(ڼoR5SavOm \1nm\zmr1UȣyMP, o<.B"H ۔ cJT!xxGIf -FMIЋsGjX~s VB%0׷noB *慎 I Fazȑgݵk۶WH*;XqJffX"fxSEy߸IeI,/웟#|'V"V˗*Ul@*yj~J˜*؊RHDT}(#Q^WC@V_3YYGWƒUaf} *(mf&T ɥiv'NY5O^&bAj%=*ZIfAT{/5 ~jzE"!b-OKJԴj1/CR )GK[v:}S_Mo|鲹ol/St3j43ɉ'\ Qؙ9HCj97G 333p]{mw.RDh}x~~_ĭǏYs2w>]zzFGu`{K `VKКI#adF!RO:KMo0hUF/*+Oj42F:"ӰO돁cWGpA@NMD_6 SChHط?c$dɤOQUƪ lEΜS}IKW5V,J*D"f7vdDkZ(&DŬ )\}}F_D-Y*8 EQ1&{n@6MP UP_Hqɲ7 j*/8l޼cb;SLoUvuq˹5k^s*~m?UF ;%uIĊ*U,[ɳn#d[&6%0x l*b|h 8;v`iIlGdOg uBXN9]x['cyz?[9IrJR#h?IfJY*~#vkw~#y}ef8!+" ", 7:414xQ9ʒo(!cSqΘ{>uJ('gIUHp_*ȼ%ѕ6oւώ--u Rш*t?ga;jkV0؀ CkA^FS+]+C&{A[{ҋ//_7rȏ?_'>xCZ5@,,77#Τ$`F6bx/1N kOq&^DÎ rtwjFR:&Ԇ[#rdvvv4-&ePvd&UDOk$DTA-iZey|F8Eq 0Ӿ}eޯz{NTO|~@rvMM]-U8GB*z^UyJUxBx cmLÛ~?[޿Tw*U?+U*n]TuXQJaa y6 _]+UШhFBb:E<`䰨 f+Mp*3j5/'`^pwN?mm2_#Y:<.Be{vdjM+NXfӃ#yVG0'~ZN:-I ,UMUȈqSV8]"9%t$S㩭zK]݊Gn޼8__Zuĉ-[V|aV_X7}-o_S}}vK9v}} U@\|[ʅ7T:3sÏ>v]Ёx);i`#6w ?RQZ D U:pal_Ms7z`4/8⑪PE~B$"&ƟT[\;ye1\`u*cL39 'n,)OpZ_GƇOw6(࿯* )rȗ{!VYY Uhg_`{S`Ih*i{+c Hj_Sr-x\#THh}SEP-U^Lx>@r]T'흠?{J2 ;U;xTV⺤ 7Ut*Ɵ8 TeLw6&Ÿ+ U8U V,?zb.UXvTcLxfؙ y#'lRu+ ޾bQWkoO_#QH옟Kv*1:* u(~c#(1|ddf}&rX )M񿊱@j|&Zp}?F<6?EJ:Qz5^G 8;X.ww/,#cr[ ^ՍE3;" bH, pLC(:@T+8:a|̾㗹kt#p#{xu^򭲺-Nm|ر&p)0Q*᪄-*L`@fQy!Yx[uǎC6mzMn,¬7KffK2I4%()QAQ q '%Kl :% }J4ٸNK!/POye Mӌ;5m*f0b5\q)R77v"R4$xBE&2eH/ -vv~_?g/HL/z>$k&C:7,D<$5z St1]֖,C(;n'Y5ϰ{ R!S 篜*&?!>'…"cm*?UsUHޔ'H- T}-_eLͅ*:[ޢh*UڦEz_Uto)tUE[7d[p)E%/=z˧Mb,l}g#ڌ{?YYm.XP&ry OHGJߪ 1"[zE'fq4%*646̙eyKP@뙸c«Œ/@P5\tGruXyadnKaTuxO!*Z6U e +ڊpLMa{_";Ο9th*6o^j}A|w_'~-vg? wz-[|ō7=z;v+Z[;s"ģznoϞtС) B4Tb Ʀs$k>,V%"kHRV`~ÛĆY-j/𹯚X;c(pRRy~ʄ4kr%w4JۥԋW+SEv"8SC9i~ H "%þUGc)(SĞ(؉SyA]r&Hg4=9Dް*Ro((ȈRE,1Pbk\_⯁*>{'>REQ&r xcQEGH7UbYQqYuIZ+ˮrj;d: z?r y=PJHING7 0&Vs̘KV%.BU3wUv-W"f>/<$2SCcߒ׎HIα3S&䊖w Z1>I3.!1MTCv5fh*Z1 vTFWj8ow_oqWO>ymG:⋕_]~GX7:ԞYѯJHBL;f_DDMQEdI8䖺zKBA-!Ab$(p ȱAsuT ~ ЯzSQ. yr(H]+Ο?Glp=/Cg>S 3n?Xj{l߾R6ӆ٬n9*9!焍z{_%V }.Q|_ja@/KXRYwylD/ՕY ~DuF6yRњPף'i WxU_̄yݲ7]vvG&UxD'3M)r_D.B4Ui(qC&:Un:13774hJ 3%DQLMO‡wbTaj]J)VY u,wolnm=u~`O))r] UŻ/oPRE4bs5}%ˇ*f5X$UϠ_ebTQС\6T|v7 UӯT"`l0ݲ\D]r$V4Nk~UDCkI"HQE-v :Ƿ \46̌ByA!@s3=-FTKSRq G#TܨB_oTR;ޔ(oz~JF- )n\`ٷTQ=Bmw8WXGmL~UɄLZJYɓbRjN 䍅ht]cH)3( `-W-ˍ U0J!L]iV*hd&#~HOq{72 U*Mȯs⋀]˒kY&j*U!jayh+h44#M"Nin1u71SL n{Wdl[+LW5ySq6c*/U>oz[XY\_T]GTq]/Pťo |?H`[>wێ*~*U,'X}7ntot;kTk*dNۙRC2V$X+2~E3v TW7i ƅJ Ua@e૑iR-9ǯI\#}yhh6P!BcvoeAPt2(i"0S YxpWWץK>xٳ]]\F;#0{¯ hKP!V\Jp<}x3E9kQHU|OG18?~0ŦMW~>Oy 3H1U,Hi(]{Fd"W,IkHJQNK<#*8"!|$-<,;CTѿ?0V,X(-A_X HreJqmYY[J+U4mdWn U;߹o߭UWbPfniﱋ] HGMU%ZDii<3!Ir8c\GQ2Yl{| 7}.hL\V3NgU,1)"qxMDŸ gݡ!T(:e  XXv,sCaQA65br .z+U8<8Dʒy*`إ)H>33f;}ܲOr*Eʛ! ;d9DB{">&yan4ɶKj`t~'k4t52vspxG¥F;{8}`g"__۶orˮ]Ν۲eS֮zbs6 '(ؿ rY!Vu 2(1>*+Rgs)0P--Ǐ@8MC\طBV'WN<&h4:9nmj cb$$ٴʲt$ ۺtR.quN?ޏOV%fgv4i9\ũB> y ʟK۽TDz4U+"xT eق,Il`vC",|3 T}v@͝5Np޺eU UJ{U0r{R][K.I=engvvW9褐_LVT[ϋM!Ţ@}Qawa9scz,"Iy'4И!9gob8yAh:0ӳ7=GZOXf.>pؖti={:yiGW{ǟg|j%#W@k+Z< "̉A[WB`yX/]jlp@ҫj<5mAYxCKcav%ENBQ1;A C!?|1ԁbf_nV42@J| \WWM,z wF?-!M6L6oTl2pgQJSCXnE-yԤ(u;O."ʲ%,%K2/Tb(E^{4e:4c*ch-yY*N9yo*U[jRŵME̾+H;v444xAoL*mTaJYJ*i`dR~t;Tg܆\PCj͵q/Nl(UXeϬYyB4Z`*;_>bJ,ilr_NN#Z[B'ǡwu!P FȻB+VTk+塇Ν{Mzٳo 8vlꦦP+=3yyG>U\JpO dj8yF^.wtPӜd.wz` T(n\l- sKo_0hl]~|`tIz7]reNF9wS6fPEĤh;aBl}+#yEFP@՞T)|al[*$BzF4é2&ZKQRjB~xiQ e]*$Мr "oeW;+# 9+zE%wvOFneQEygVBXxbe*x;6ڡ ࠢJYT1 PVڤ&L]*UDVNMB*XyCbo.~… uP}^奔5~eV::|uT"a/v-2E-/WNnrLyrBSv.{=[[{Wt;Rٷ\B\TǡX$z6U3YdɕESYW-RIoqkrZojjpU_61$GaEJYе.Z ÒEjA̖}Fa;4 1>` E.V$fIV_;"~5v[FQnR;S| ;ϝ DggvJ*&>*U\;Tۇ832zW"AL~PRŵCotPXDش3>>~wwM& u,.4OT MYP }bBC.=IZ8nI9TyuT,Uˏ_S\Q ɊƐv *V +a2 zXEIj E퀙*b#pnzOH~g:],&Lx@ |O؞=έZhCR"//5h^ZͻVECPx[Taoʣݍ_d^ o'(^^:8+<0Q_6&$*tʈB-RKR#97Z-ܢh[Lc_M2Of@lF Ԫe>F%X%o M{D;{9HƤf^N >1)-y8jkK-μ{Θ&U5xTFT TtTqTreC*RTϮn~1RG\ mX+Ċ*U\TqR_V"*yuJUAZ-U~ɑ>ʎ7jC'2?48 dn[ S̡LM`Qs:tHY)O_Վ.:wo|-.%2+uAeMQVϩspw GZpR 2He[y+bKƬmhMTTx"Â^Ʋ.MczHgs*뵕 Sr5mL{^*$ӈ9[_5tarXvPȶb-NjA 4+6I*nC}@ ɯ҉`Qܓ&68ޢćj˝n>lX 3)C'#7 {tvwwq4H}="8T.=bEOv0N0QkkY?G>G2̃H9+ r<~jjS1Efi^?,X9#pzynDϘߢ{ymp]I=YԜM\/g47w uFkYY=GTA$$7iRǮRZlBg\--x- Bɦ~k,vI2P ׫2%HJl gբa|w/\Hu3rxCIL+sau#'マ79wPE7SI7SJ**UUP_iNPE3nuqfEJWCU|*Ud)7Ulu'/*0Z8T"٬R?UU3&vZ-TTգQ{%Ԭy6 Td͜yS3LO$M^BAP P$b"F932@XO>-/K:K1U$ZvdZoܘ6ZɴkhL-HUTVS]MO>Xyӧ+vMF E 3.H oBIZ=n>iS6)ͨSUzՋiB vlhhr~86 U8 UelJp-,XyՍXGgD [*r3B~[x!wN\,I APȼ]Gutzд sj^E2j2*sq) mo udg{i6ϸTqN U]D%<4*@.D=sua!4HMP}A(?yyP|q|~Gロ;jkI-zQ*\_vVSKU1 UU\Wj㝠'>[˔ח*/u[M!UXt VT⟋*>n {>LG9*h|_Q>EYu UX:"مC-m]w%LSH gg[?cJQEo4-"EhXrj Nrr_!QlC%׸me\mOut,,]w|{_U{FV$4A 'y(g8 d#,mmfAxs4BTEE\5f6l&gQ &Jz2z:#t[SGAUNLxR$ơ 91.inno?Q⑟!*x؍\\ss U_SNUAO,|I\gCǏVa6Q2O45n_s(*,qD^53/+t*ۇft413Ւ "=QboQNj#LSQ5G;Sv1F_Ux8qͫ pIr['jw3O?9U-J:on ۾͠ W,Yo꒢؄J!݈ޱcGSS]ݡo{ۻzz2: xo݅WL;#`TQ̌CUpiU<qM*^G{Au)U }ZMtzqU_{kȇan@P% OV-:SÉ0jS!%2B^s Q |EC;[KRJ%̈Ċķ06ZHLucc2\s_vMn[ x;Wz;[[+k 0XFB6 Shkp >wWdfVoit]hc%lp&Kt*C w* TkDd*8rpzx/4pXcs("SSuuCCpw WVsoL1|rrÙ/}Fg-h-A:8(} 5l1pgstcڵV4*Q3.ti[V4鵎Kh4A,U0/^ueT@[31@LAK\O;k I&Q^h[dDBȗo!M.ع,U!. EqQ>2j ~@諗KIQ O(A "8V¶Z J tEt{{W| LSV9yћƋ+|7UW mRE嶐ʠ SE }*Ub(U1SjwҰ*U\5Ur"Tuo;b\D`sd߼eִ*]mCx慭/_|eߕ45fPS²zU;Ԕf\9Z[̢d⢺a2^"YPh9{jm&UȾkƒUR&Bs5"ֻǕ. Xq=/uu8Q{Eq473;!-ECkm3鲫ŊRU4tZM`㯍HfWB^T*%-[滍jL=f CmOrBk5F_\-UHuCe|Ky@dTad;RE^ξREpvTU3xBt;Wo/FEX%:#4M\q.M1TA&#̌tt ^}޽kyuT#UgZ1tcQEc'UxHSw+kKxӫ@3UxT7.fP*/_ U4X5^EbES5UxB{g*x n D1 /S3TD5?)N:|/>y‚ۥb?@Bd*ڢ;Y NbZZ< Jp?v2qcGVCP\ݓʪ>KK!F&5Ĕ*:<(o],` X##ý55O_t|m-4>rkM N֩ Q )Q]зӥqmAOpdDA:ox[7%3Ebttm>/y$d$&(EyT:`Lp|ЎSSp:p @\'9Äܐ;+tͼ&ѣB2kYT%Bp\Ȟ7=][Ӄ@SGN0DH,c[- Z_|K6YsFEp||LeUPu_Tŀ }|xZzC;R~LJe-f%&u"j4׼hM]CܒZ]xx|_nMzvKxB\a|`z.)E2n:QSqoiyȗϿy ss}}WXWxTbsPEQ`TQ?NKQŏ %UP\hoRe.]ULWa+TQɚ\Up\*^=U3ivk5Ux=STqgIif#*6xnvN?|{g'**IM%-A\?.M.f/?s(K8] =>AiA#Ҹ%+ݫǾAT;kocYJevcJ8RC*wzӝ(]A(Wv9vT3~wü3zR<=zV"MX8Eϖ:ERI,_?8.\7qª*7aL^3dJK4ң9&JR*ZY0.l T - IDAT?jkGGt깻~qNۧj)ԝ bvz\Ww0Y*tɠ 5{ӜGcc#lhsppY !:RRH{tcDȤn~%!:!IS/Tȕe\a&PΠԭ5WӢX$T ^ KsU Ifcf SHהq ׼FCa ɱy;|x5[>7uk]&3qc66*&"rz8.KTj,&GVGP upXq|z*RſJP鏹Ŋ*xw|*!N|ϛxMBlRE*fݘKP>PȧTSE0CTPEfPř4VTⵧܾ3 iƚvY2gi$V@0kd'O+eCJƧR-LM8DlVU-NJePsݠbm%b.+Zw KHK$TjGt_Ό݊`*O{9ERT  hɂp- g$*}"4T}kzVЕ H*I]JܡD&pwrb:sߏxMGU`Qa:}~_Ra+ R}"v愎{ q)i1Ȥ H`,CD%v+%Yr$j$UM!XTmȠ W:uLLf*";C0<xΐⅥ5f^bbq|.\6-YiKM{ઞZL~9QEؒZꨂ_A59C30յzM_ UWSTqV>* 8RVTQfկz7wfTQxWUȦ! 7S6Ww*UT1IUzJQÊ3iRkM*TA}\,vEvdT|Fc/^|nmiΊW8\YX88L+H39YSVXr|*<&d(E]='5K5>)* y[1-{}{ydN(j`D@LMMq{ả+]-NʶFטּXnQ}v-ތk8fIHs'{"pWMVVx\NHxh!!?yQ.hV8%3d.kX5]}+^/"XMӉR?9D Do 댃]`,T޸̝Vy'&~}3/\Ww'; ~,wqiwN] P?ge)ȭvXݎUxŸ&Wט*ڶaUⵦnA~BPT_Π[+*{U<憦dp ^+vVW"*>ŦBMMoUDXQ׃*u2A Uxm+]}j2P Q^Tߦhcp}BĂD tDJ,0< Ԋ ^thBʢ+MISռ…#<ä՗2Yt-M&^:ABgS+㦧{{E"dEF l@ J2 uP`ڲĺF,%378vKtIh=CܠCsʹA-\U4HBWNm L&EwyEXPs\qtGi;l&qHT! Klx(9[>0]VY#% 3yeh+dUdChNPMPGPʅOk%P̧:;ZZff^%U 2P`7(Ut b|l1"7tˏrn=xuTQcf[<*UTmɺ*f܆%BbM*^w]L*UrB>I/C>J^UXAwzPET!Z=XXEPX䋔R*K\}Rxܐ%Kӎ{b86A/b!OlYTm ^Gv"n\ nQLɐH-AM58.7QXޅ<%zU I WaғbZu'1qڂ%@hpZDziEKpCei L4׽HȊ*xe^ El{νUw&.`]s?s=thd n}"GOn\]܇*w+qbOKX*$gWMbTQ8z%U˧ @ŇՒ*էհ+ůιex|ڏ* e UM>֨5|lG2ΈDYY>~,0" 6r2S33r:< 6bM ~P09, ?5s8 3?r=&YRx' 5AØTVI;ժ]Ԋt-HĦ҉yr\{WszǦ4P;آ *|!mH(pjBb>K$w 0AMAλJJ ]Vk|\"y?Gy?+_ڹ;DZ#p8RW9=bX}Go;ڼ*gx %૽_ -C" 6&jU Gx0O4mq/=TWYREtU?ֱn4d]8`( PE]a;V)Ǻ~;$A%`Cc'݂j=}uעUX )UH AGxԴYGf,A.K+ڙH%J+-:/JS>ێ#1JYÇ*:. UohiIW*ijt|^RjTSAwCtIW*s%U|TQˎx,.QŸKS1śըBN0jeKGa o:""fr?\u `AB; 28Qө`z}f&ΜW&?ĺ|%@u*kP^YƎp>TVTg׫,<&\kJ*n=wl HR^`E{-PY) Zo*m TU?B#*BOV)9ivUS {: <'"kw;\Y9Js3T񞃊/TQ/Tqn{IW*GSPRE?{ _QuREvʝ,XIW*|ATsb\RŕRE8~צ˥}u6U0>dZ#n\̐{+fNEvy`1s"n\SIDA/DĖ! tQR 33cm ;rToq1^zXUiVdmP4Zb]h}*W\\ź~1gJH-a^I> Wb\RU bˣPlg=T(9/hT_ܔrM5TQ 0}USҦͺ6) ٘&S24YH8u>P]\Mnh MoaިTfȹ{5|6\SL&ugf9N]SeDR0-I%*ADu}W8 8>>l^TnՐWw?^樂y9rî;$Z)JN# $\-)o r{uNj#*WD oݽgrg>?kȗ\Ÿ$jZ& U@JNL{ Z΀$VKp"dH8 F_QpC` j$OuC@,.U,X:A8<)v`"$[=Tq:n4*|`0gD]AN.A6cr:qbe!.\DlIZP Ta殐* *TGnpprSwukxt$9PWozwmslqq?4N +Zt6rxUw`]Rn{jQ%UT*/%U*$a?S?XKHo;Tr_Qt(ⓣ1vM5*bmnsY:]UhG'Wx84D'T>Q@kX@1O䖭WI$O W­%5̷8ިjN{H˿ƥ$XRwVkwhJPrDIOt釷ǘ_I2,0\KꚌΔtdB sBFչ/ބQc8dԔ5/ d_y(`֮Op2F=S˫%%7r$4v|,ՐD kTt,ТRM؃n;w|ٗ_~gyU>\ vSHU>_:ۇ5P9x`_Q{A;|t_ӡWp2qN^7)N /X]1Q;!Cuu-!{ JN4DDi WaZ@[5FTQ V {UΨt,/_p(}̌?,f }<oӖ]ZYt16ZL!^~ar! U`!W7g_w U|uuR EYgm7 Y|_,f%UX&Tqə*.*v.!jQTq˗FĊՒ*.*:Oar>&'%U|BTQkݺT%UE=x|sTs+Cԥ?uxf> tIcQI9[U-\[ؕMUo&l6 j.;F#(ި ܲUeMw6w֓Ӗ*t(Av^-E:l"m=aWrlz6zNU/<-?:4r aj& S׈16s+~b?CsBJl,R~c+= G_7G?|}g:tڝc?N>5:(^+yԷH&UV!fB=AR/ )*옇h|TchOWM) w/Q}"k"{?H&'Lfт%~`mjhWg$ +oPr iEJA N#* N:|R?P?Q]}߯yX^ɵ.3}_<)p!Iӻ#'a dv7mUPoIpTQ1 wfIK!!aI륊-Ǖ*v=zTFKAE*oNJĨF'^V+"PQˢ ',BJ8(oa۽0rS*uTnְ :*Vq̙;3Z?-}osBFdbiikQnVy)nOE{3)t ]E>z'Q @hЙ0FP7gC?g~ͥClK0WSj #6-eF+d~Axmv' BJ54z|Q#Ԡ]ؑ@Pfn Y1]@ӿ؁ǎ ?]U)8W&,t ,?pZ& J˧r<,alEbPHԌ‰TQTNMΗ,UpiPh*#}pR{(ZnRZ7UGZuV~Xsޢejwk)9˜Պh[s]g^tŷ 8c#;pKFeK†\禂֑\nP+ Wq[JvfȽ}334%U|TQzL%UT/*_(TTWRźb'//*n֬K# 뀊*j UTx| em6Hˣ *5-c:PV]4Y{N{T )`q^2hg,5.aTAvɿ@8b.ЋjJCe8էnaK%wqӉ=LQ$ـL%'ܔh*@s8 ^T[ IDATب#kB:MGt!{Xs`1)B:bf8Ac^г1UpHF.Y0rZ$[ o֖Gw5%%iϿ,W'B?UE_nanN6JEHNlH !Z|Z5Pt,XdqvȨ^"㐅Â=T r~4VKN&bBUt*ٜ> D51-Vقw 'BUΔ`PRE%mfc*Adw+P`c+sT<@کiDD;Os7Cpc! U0]Nׄ6brt&&ti}PEㄝoebf擠>_XwOߊԐݒ*.* U<)⒩b~1ThpNv{K *%U䍗*B- rT6Uۮ?A'j BtO|^'R܊λQz-wCՏ'7xLb_Dfщ-%rQzfc'OUB{C:oo*XFVLXb.anBE$VbE!UHKP nJM?ﱢ6~ =͈_9q4ϧ@ׅ`~^sI@-4$o'**Y0Οn3?H#?%/!NerRW@o$~m*FwSRT޵S{mB|E~œYIG?>W'\J+n7KX'Ul3%UBaIYR: T*>MG+W 闧;TXeVoF3I+"(EL'7u JZ殛*L``'焀[lsُ?4%&&S CZjX[QϜc 5IYC]&$ >~ly5QMYƹYjɍVbhM\+Y}U+٩oy;9 DtJAKyvINΛFkFym^=YaJuҪ0PMbMS %*!v@?/l}Nݦ\LYZo%mck9Q/QDEFUIJѥ':Q`L @_&پ+O U:]"[X3?Plnnh/.jv_+ "QnС?ޱc uԾd3A 03VbFF+t/T`Vu&>;${$!"`sHŇ+).wvDyՋ_tξrzp m1PRTq%Ul h5O~w >TU߅_l-WMz>+bmhYؒTYqląT_継?ZRREpPxB/T T(ysSpKSEMKKd%UEM9?ennKveT - =ޏƛ?nqm 6= y}{ޱDrkq Ⱥv@脛դ/CE?= v!Z(p>pN4ޕ@d^Wp?'bΚE 1aQb lj@mSVA5AǴ*FDb T%yUOp7E729 :k֌U9ԳIIGnLBŐɓCC򕘁6˾aYao&FzJUKF^`?~g`f&bt=enKĹ50$8V8GB.2tB5Pϔ092:) ZϪ bbJŖNBX-q1̷DdvX%s]H*>BMğY*˜Ѯ^ruW\\s|"_o'[ܑi1FO@h&MfW*mT={޽{EqQMĐLL݋Bw~ 3ň!ӸAR8 p0]tx6ma6k,.*nuWk m**[{(bms_:X*>ex*;JX*-iX PI UԪ;*WT {SEDT*abLD~=4?fslСGG{!m>Ta< ӿs U -\jPNbhG! 9h+]UhGP@5=l(|v7A&о¦TF=áX-i{TMT]cɋvMcI.*dE5*VN$̘/FO>Dk9z sK95lxv{}dB=UHxɓrz%V4 0<+?{w!jH-' OQ|-nzkee|<=F9SW2;=[Cx,rE7y[5/8^eV]*B=*BwHK`:FiIj枉LhTkCno ;L}kjq) jUZ;kJ뗱0'\p3^:k}QV Fgg ' ۀQ3YVˡ!TbPE{++>RŰ*S78Ud-bEI}brli(bQ3;GbTIZ*Bƥ i)WF1^RE?xnAbD2aTR:LLp payYBSsR~7]}`%jSGDȿ] K7 v_$}=BAly j {NC%NFZW-8–ɇ81Da8y5,X+,,n_U"q38%U=.Tqx:*>uhx$J__ߪYL bǛnzWJ,wTMuw]H4pq|fygz7onU,ÿ[o=4|eXts%S=25"(UW+" *wUH, #/G PJ)b-}U/}},&2_.*:NZU& X~:Rҵ*zW i;a2r/)*6|VP|%,n{0J\L5ft5;0QTXEp[חpw:tH>SZ''bx[n2'>FcRULͽ⹩n|n"$jo?:dL2JE #"/{qbȝ`X7.dv(~ɽ*d}W[jcC|" VTx3\9hZrB!U"_V(~SSE`E:$-W0JRK۶4.kUNNbf F%yD4񿎩Takڔ̂=ٳqs<*S)5G_d(rTlDmrT!ǘL+{SEPq['w#?Jڝ%'e v8zt`@7^9p@+*"->x'+K9@a|{(/uYOiUB7GHV|up=I"Ν'yD#LRczǨJ3Zڅ3聼@4m|#bG"Tw巋g5{QP DqEZ*QwTԢ5Ǽ"nBV:o|z%[=˥ncT`#Y'm?vx9F1IU{ٰ*akހrzL j2_Պ 5~֪$MHVPhKU lzCD|H5rսɐ&nMD:᭴v#:<^ӿP5 WLAnkpߴԂw t-kS:8|z0E-s!Njut__| +;7K둡#tB_bo99SRI z/fNNOPw篔T%={!4K*66UTbV374U*> h")LWŒ*.*&&d #ږ@gV/MI~|{}K'##3 r\j \.mцeddrR 秡^/#αdPrE4`8U:/Ubw$LѤ!,)^6Y/֎kCLҘm"ՋZY9{V2"0* Qp=No'A\ TcpstnfT?Dz?{v'np3!<&N#*֬E7rZ4Q״0fv7> Ryo)씑:U Ggղ&U7˜3Q2*Z~Q,_IlZZ %^V\ZjY~ama!Uрf-/NQA ՚)nrh Uģ`0˭iAv8$ [@2vZMah웓Pt G de7 sS?tب4:a h)Ziάh?xjCIR WSnȚ}˅WfI{T)B{M/ڴ1lO5btXZVΨ%T-#_E kb-6GQK?-:E@ՙu;UMP63KbteTq 4)U<c*v9(+")\[r[)V**%@,̹sϚq0}PŎ9*OW*Č~PI+/3*QRZT5|XU|SW@*[U~aTA6 oH#nFG$Rgfp^]*W@ҝ}3,U`*t w0ΠlEk:>P(TTͽڻ9@YRg;eub.q*M Y5^Fr!w~*ĄuӔ[8{ 75bxxtSj`<Wr*zp2E1UBr34tv Wɝgg l'wn&iV`>(*53/N7BHTƀ QhGZocjoz6ǰS}|*a.`eω:LO:owlo?'fUbP0"k WJKS߾J5~`u*ӎw%F73O25p_`"'/ ULUHz:_? 9=-T]=XZxDLў\|ۖ"s^U$7K3Icpw> T-7=8YRE?5a֞7U%U\kT!9F,VN8TQIꓠWŐShՒ*okQńk*4g[\&UHxŇkqr IDATkR3kP7}Xu]VhfO=3#L{z8cU3ov T1u2A=1ϵB?zb{[@e%ԞsLf8g}.Ci {N/e*tꆠK`l*,En4Oj*I.1Vf ͔vbh -6 a110+PEG,T11MbJ" yEz/ OʪC@BC#5P꬜ f{R% NӦԧ۝т^)SWVT;Jat6Ζ1[as[x8W@^!xҗoeT-2|I~+7Ul xK0Œ*bi6=ٍD(ET"  BLYǼT!?*?JSErk*uR֧ݔ|rbe[x#_* ]rTI>5q|Z[LơW!lcm|&0-)U o=$AԬ_@JRm?HbVm iR֮ZâcyQ9ߜ޾$=wp?,qݘڷk:xlͱWRp=Ց9`ow/~T1?~QxJD\SRTO9ec<ܦk*So(w=ĩx7OǮ8PRQNJs#*Ɲg G]Q*V 7X\tXqU ޾?N:%U\!Ud`T%U\Tն*c3U#?S8&+ T =yx_>p)T=B*TbpwU@ 8 җxBUCXC՝PbXU#v5-rjEAm1>.4F'"P+'!>嶂LkVAƙTp$IE&cG:p`߾|,<j[VL- ߖL_ZTae65Hc rzNf v :cIPᆩo}/j&Tпm i*tihG\R`YKؒ_` )n,J!u&HjxA$VgvސMgo?,'ixAZImHCĻE gsM'''b_$SRUk"ۼ1CH- UL؍* Z5iSE+X#*fmE}sTqITqu>)v62U3|?*AE?l+S)UV)y=}ۡ}kg\:3N0<<0 X[5kFQMWB3%/)ff"8'=0 iN cl;w{X#KL)ƍg'N &'(@G's :cu4T!PP&>ȄJfTQv\jQPE.ZS.8T58^کJÝl;U=Y0ycn; UJp@|̏5,} eVF,5"sQF`@THǤbA0]KĦ'U pFq1\Iuƈ*# {OõWRrwL.&A:Ç[^^ENs Uz![pZB 5Y8v)*NѼ;^]3>zNǺe#JPYE!iؘ_[ uVjqsV3x@*V.ۚ+LגaRSE-NFv J-:$ZyTELEhH#_vQ S_wGܳC>?:=-b;D,>\aB3ؐfwos۴I¥3T)~PE{e]7U46*b-k*;*se'NX/%U\=HcRYxVS#%CU b\{x#w:c]S+x_Pcêƍ33Rl n4 tGTܽCw6/f%9?WL]_՟DZ k3:sf߾atZ Ʃ;x뭿'?|ۏI iŖX|w,51ƕu_w78>^#NrՒ*6UTf+ULwoLTQMfk*>]sA;x*6U>uiUKT11&wiiφ]RӅuQ'ωA_JY@.R;Z3")* )G(Y(5i!NFS}``hhzgl&[sTQ0v(UoՍU E6sU r2)oԥr1n4^֎ U,Lu'B @KjEt- \ ,SZDF[VQqN& S* 78z|.CV #CSҏTMĈ]*pfv(<ßٕwbrׄa]sؘX\P`OyFucuoSmw;HČfSh4ma@LڎvQ`a/oϩЊCrTA!T>x@43 &}xӄ*<Ļ?2| _9lbbmPeOb)SɶM H ])d1z^d>jEC/렊=DKmr4E>Av)Tŏ3_`jg ޫGGR98+)ozkѣv8qb_>䬍Ұm=ɉREW\^f>aq;ɡ$߳%UlL87U.%U\TQ>.TquI[*jWl*>Uԧq *ߐ7T$fצ >+iV U4$Uh _腢TS**Gh\+P+#U"sL.,A+CϜ54=3\ #ßH,^!#E;hvL1pčcg\Ƹ($q+tnca=,LRTTb9nK E 3€XyFfV3##.\=}?-șCd|g2XEoQ~q1x򷤢lT I\as氚*+Vx$Ø]?T!ԃv*| Ƥne߸K_K/~>TTlpmTёtW7P9$8j<|(҄*9ZhY `H {2Ruj=Hß*0faV1e%@ʠu0j\@c'풨C &Έ !4g;u8ajs*t Jv"V\T]vŗfV0PE?U Y,UH.O 5b". WQHͲo$ P)yrֵd[vl3<jUuSEý?4ESf#eˡhR{b$hqqrRIZ؁ I@C*$W0[nSOcA?A_ҿٵ>mv![Wѷ;ӡdae]&ce\||a4-bR,g\OTQ=^ SRGz9`D(%UdT*jٽ I*nI+<B.** ?ʴR;u4Uؕ8D(kRbv,ϡ5xDVQ.̐͢Wy,-ZK ZY/u er頜k*t~y?=gsUŊ%VJmP5t ep)ɇ'@X"Rjƻ[pwr 05[UĂTg">4w9ȩeJEsFf MN.ΘefHɥQEظٽR}%0::{z*tXoS0j܇8 s59l~hȾTqw3:Ta-I (69?Ѷd%UlX8zIp^Ka*.*cX4T<ݿ"R~b6U*C/*}~~1y=,y6WXblqQ@2[*4BI0,YAfX v)+R`-Uk5~˘ >a0ctIۓ_t:E݁s͎">u,l4Vq%9%5zoz8:!uz R ' +VE9 *0z*}& 4Z%ؒQ:Rءa IDAT kcI&پ2j$K|`/ZU'1 7Su֦gpL)+(/fY@6NKVNivv)[R|<`/zg>{Vn!+cR2;4 UqOLnٯώm m# YY͔X},Fr)OױDƫ`fXߡP!>Ojʹ^I[֠\L4¦*jlm( Z'T鞵~h(h59wrAg]}rw=Ude+ B5A9 URKBswǑ&U/qn 'RYRY?ZT,(A=[렊r_]UjN$8M ´~ Cee8*S=UD+ai7kOm'.aΨtU?>CPBc+p Mpz\"DQ4Ұ:_Xi"j*U7FK{&iH%\X؜s.*X{&B 4Z3aTAe7̆9]^ɇZ"ߏ,sF;la,EҵU nT r߄h͠q1#'i*==9){ejs|\@C<%#*Zn?,+EfGdyyϞOHH5W#z!UN  "!X(e4Ϟ=+W`,>$2H4bh9{)RXsȂX&8iSE*Q`ьy X;+rHT;՚'PʁmD?'+4ۨ'6{yO5"~`*mK^}Vbx'[Z3N;ٜJ§]\TᡢtI7U|XhD1o=^_!Ut:#͛nLf⸍BACbݨNzO'0@OEo"1)蓙LHFR(*nP>w 3|H_eײmBKMZXcy.xX0.bZN$ʣ+lyW'وƔ 9QO| H,63še-B`T*ȂRIJw `n}mA}wŌy.Z41Ag*GTeUس)#aP$/^tqh|rR`cxXDӗk14 "pWV8}ZxD#ӚP705lHU[_.eW,}.\8|xf&o=C=T;؂$V(^)iͼX/K+QN7&a FXHy* dfs;i[uAeפ q_$(agY譗*<,X0WG8yP9WF:n% T^ʘWL($b2'Lu.O*vHO_U.k**cƨo!ⴤ\T=vO_6Q#Xؒ*n(jҭk**TK(PEuѮvt}TQ؜*n^>ZGP [RōE'ֵHt 'O2qШxZHs024RJYQE~ݥ) zZ%Ԉ^3j9(u:P=fDlBAtL[.9_˭{K9UA@!wE'+Lc6с*xiBW6<###陥eIm_v5­=w*u!=!#=#%]?9ԾpnPV)W:*2+3yfinuDZ322U$lbd!CŦ9*%A(;7!B6%$C+a.[Uakam렊;=C%DaE㧙kuv0kU^ү J?y= )P.r,r쇓,-c`Lˑq'`JڎP*:Sz\% wSRs D4Mnk[>;E*;[,ђZoj3L9WREDZȕ*jdm*e-v% eU`"V.P5>83U|ևu!U899)lpJQMFeg>|ɓg./ _wRug,>tZ=q\csT-R?1i;k**[*k*ԧSI8TQlL/.Tz1bs\{t DǗ*u @>=K43!-\C˾\~tx5J=*C 22MnG K5_OA 69y)UjT)/9M&}Mg@oAaY j >wN3,xT11!tZ2/<^BPL@9MVs ĚӎuPƏuu]ĕNt%.P/|zu$C!USpH^_1n fe<( R1UQ⟙!. CLLOJ'7e;ș<2kC9?H|Cģ!xo^9|ccrDZcޕǎ3$2rpAfS>h4'{l6&VG3/|TNq;a @Tja͍(^ߺͱ}f毾ebѐ3Xx"lBۿ>:00/"cS*X(pƌnIAvb CZ`*؉@QixeCmzHVITkd4`eݗ1kf=ܿ$THfB1A lI5}FIU0PadSO=6PG*%llX*ޛ], 0jO U<Hf\]+4?j5[\j0W V\X޼hZpSܹRA6  D`e2#.6)kim]̸ ԑ2'~ȧZ 6cCCRI4c@eN:4{^IckTR(vӗPOk!UX .P_93%@T}ak( XVے h<ܳիPE-0Ba+ARFuO­?yr={?/,!XYطoddd}"۳gLccc6>-'s~H.p]oJG8EU OS5roj9#Ŭ /}}EV$(E ٴip!mOz啷޷OB(+/zje kt>|XU5u]ER^IJhdb™l?0 s)9ɿeh-.*h"_!U6HYb$si,6a,ANaXEqm3*U`*ұT*jkx]RE,yCPE+6&U5x99DB-o^$*6ŘȠNɈ~ΠBEؘ9?Uq64ōD]+X{[T4`WKPn&‚l- S %p_[D a>[9aMBcnȼU~e`XwBU+f%oc{ ( j.Լ$zQa8t993xqwӛͽ{-[ÎRiVCtzgA6i n$F'aJ>+C&vnhg$iv'S:f``hhHr_b(.edD …wy3gNr̙G|s[7mzS}lݺulL"p "NUȣ{8wǨ#=k]HJ,G v]R`I͋*H\;:zWZ-|/߃*WVBb|"K,od^\җxi%+ӊ,KF_ 'e"-J~ubr<뻾kjY54-vM9 Å+ 2d #m)m6wpVlGǧșjk1JXdrR!V|7W~/ɢ-jId90# 9Il`@6><# Ή=z޽vw=q[wv޽w<; #B!)ΑcdOpYh4ZsñĎbWiB;jf[(Zu~d jT!ogg7 6%I{Oz ٥Xs_dSDg϶Z T]O$ZpRݥ˰k\>W =۷ov7QĽq=}u-ቷ߾߿ݻO8#w6o޳Gر%=ǎ~KM.^_F绚ˆfaluO /#u0rݯ^~Q,juF tsT$kw߽cl|;! LP3F(MO~TЖ/iOzF!sOl&4/AHHżu(w{@z}(MCECb*淼n˙k*;b8Tq;8B%UTLTVvU}q~cT1ٯ9h-T֧SݍF~ĩ#^+ZdD5#_~Ӎ⢿L@-ԥ5Qx*M Q1FԬ H3,vqȗTt _+ (mZ֒a"@`b>̚]r :O!c}+r P>ruI_Vid}H0 +%:B$j_lQjcPV/MA 5<9ɠpB*Am% ىU@/ s-"!/dSUH"H`]k74=7Gb52$_SW:9)|!btppyر6o:ǣ> ooo&^xW=zPʅ { Q5vw}[/fm+ꏛ./TH6Vʮ ƝX(ѕj VG݀Jot -2`Y='qu0x& n[aÛea >omI2zː_ gDI<Ԧc4 w;7c(- ONFySV򮧯z8)UL 7P_JUdۉr.tv _ǒ*,Ps+2U'p?>zo|r}Ti_U: IDAT5SREIQEVm"󫥊RfWMUh(_دQ,YaEp6,V0$]U^1Xͫf.Np5j5+X_~@8f*luÀ1tIil?(d;6Pj:֨odrolQPڌK{~/*ү KTAͥgG\Ԑ*,{ðMUY -ÅJ >Y0TAI0B0]\E|Vm⋅kNi]U IagJϸ>{];~~_MǑ>}n䵧~ᅷ߾]ܽ).9tȜ[f/ِ g ۉkQd>0xuv A-WL 5qfIټ0Q ζS[~T%5?hbR].kc66ߕ [T}VJ] =b0eLuV, p^i` VNMJ7gE%A58 [I^YTaepJNҙ| nVmGg#VU{GyVUz``1Z{u-xʈE`=_eEUĂVgulDQXe_QEY>EE""!ވGdkYfSz-a}V̲`3cs=L|0|9~{+50 ,,*”BUuBaKj_EǛ !Pw- J͞k.]:s6mx߽{rx>|Z:pرgi< z]H7o~M^^V}ï}g0*k4vhY ZjNb,=IhWX*x HK hґ uSB"Sؠ5PK-&8ocC"Y**7dohznU ]ޒIBmjP+yS=1~ʉQc2NP1`YSBk\Y*^})!+^}uժU=70 ( * :J?3`LVTQxTV&xEW={m۶~͛/> TqgݲF?o?ȓO>쿀O}+Wn/[::z]v}N(C*(D23N'Hb,'q[fEkTaeφb8wϪot*x|>t &wjk a%D26-PeB(uQEEPp~uTj\g(EJ V<h"Ni=GǜpQuKvHKjK8=P` >*=?;Kg[UC!J?R]K5}z.ꂻh#E%+PQ2*R@(X$TPżRQ1j(xUPŚo5 'TU԰b`E e {*C^@׳&Eڢ I r.uSic{J!s{ ,zZ ?`;@hQf_U* U٣r}| ]J*USj:StH R!WJtSpM=KroUc49TA絭tg ]pUpih4JgkQWMI[0y녽8R1Y9cؚp8QkYHMbV3 4C,5KǫHQUWB…\mu+[w{UV=z?䓇g?Uݻ۶r-?>>CSxx)RE[QJ=3UEso |^u "hxPL諅QPx9Q RM0nt ';tOEGj_+?TA ՆM1ԈhR| B9W8C '꠸)b"ު 㯛mB*@cNT1ل*X8UT_VG s>UJ*6PB U,*sRVU.S5rd ?45#Y&3_Q5ic&q 0X2|g7SH*oٹ/Um4L+\=_QRE ;K yTFG7v4;7h֫`~/r,4f jN:`}I<4dԶ*䉋6yTA UP펑{fP:T&[U-*<5 l~vG8wzZv`]-s=~ 3 +yޙ##³ovȢ"J&Ύ II2v 1"CʎE--wT❥*('FلS`H|]f 5~}mFX% [Ȗuh1#ѷ:T딕Hh["U2 UeKasZ*}e>se/bz@/j8MwlkCw]@Sl,GL 5\"#7׶ U,oU X{K U$TQa6Aj;PҍO*^ЗPEBtY_6_6N{*Z4 +ݒYv<3}eI#wZz~njEJ̺Kk2T\sSd'M؛DT+1{W{1tlX!6֪NJgilB*[]ϔ*5Tj.r" #N^i\7O\;$ͪ(ʎ5d23]"`ZKJ1d唒(> Q\ 5be$H蕏C.-O*cX~vv&4M"LBM(C^|x=ZZ {Kkٮ+[[]p 8AҮ]w^r?zV:w|cnӧo\~5~뭵kVj,z" Ţz GBFI* V|NT7PPEB ɣ;NoiI߭bӣoUt_WB$ UpŐ*T<əsC(-sW9 .9(|$NCnc~@H("ҿ\912'Cљb%$ UX5[Gyڒs8d]#v{'4y6 Kz{aR)k^T]]A "rJ/hv UUߤUI%QQ͉:$OɓC$/Wz"iVS:TǨb_!Sr;bO>o_oo/lI%h[(uB~m:X7jT16}G\,juwwbpp-16ܺu  rʤŠ{ƍW[z79+N]%]][=} J*`g)~;G BkiTJfIs м⤭EpܕbKJ}*HFn:[?TAcM`Ta&.pi0T!03끤 *dNJ^#yny+  U` 4iEg U@IJ/8H>Gv7*ĔrbQ}JPjoPbƧE+ϳ9E hI-SJd+rz_jSx)eCƦ8nnڟrXѤ^I= Wg*p FR`>GvJe`8xw<{VT4 ]tR1  U$Tp@](UܽNǿyץ5Qk U$TaERE95[qeybtawƽB07rj'wNU?G48QyfGte`;a ɆhQ"V|XP;;h% F3PiE><.uјTh?tZsd,(.ԍ jq+{ЋP:43;Lj/U`I!poDZWzTAd- LM< NEq*p'>lI"ШBc_fo/,xǝͅirUW~ ܡW Ǒ+D%<Vm=WK==L+,ڼzut7޻gTW!՚5ַx׿+*Ξoiz템э ld`-IQTMa'<1JmNI) N~?ĵ2QEOڣ>71:nɌ ;gR"SqvW/2\Mè>̼RDAKLVlz[*9^QL 2 5lR* Uzxn*4%- MmŇHonTѐ$-NKs&TubeVk2v$#=uBX̦69|ZIb8^$U8;mI𢞱XpJGSU gȈ<1w4:i"V$)X٭a]>PGFU\MMΎ'dx!.M˫_<{מ=Bhj B{ٳܯ?qp9aǧp&D(XtEpɒ ݦwio<ĸ;LV62+@T[ꚯִկ3K/䒧,RE04599P5#|=\:Q_:P &CSsd=U#;Ђ1rpeLƶV=- IDATI+&"Jniuzjl)azrE /wHOOWWOOGʕnT:ĸtJǏ߼ Oxenoױ`G),,1Xx!VD̒m7#0J.Խi_@(\WbqJSUA3bm%rLɲ׬z9f,O'&KXqmESn^GYTƍs5= ZDe۰ལ7`Clx "b쩾tMB U._ZVWU\޾cbb'**r* \bF =MT{{Wב#<-&ް^v*<;WK`70"|\99 U W͝B=YJb;tr,N`yd9|/Kfr͹ɕqtL77[19qzi2Zk)R__q< bk DOzڣ Iu d0cRlM< %"*$>QeͨcNc"2H!Dia#pZjg}6998xі2D.RIO |)`~ߏt+0{2@ <2WwZз}Gk#SSCCmm@Afa$lf?P䆀$-*b+} UȔPE=8ѥ?@GF Uw;ڹ͕*Y y7ZBw3]{*0+i&Y? 6H 5:faMHw~TVhpO4Ld<@>{jn mo/Un} :Ml"]S.˫HBiڞEe#ە]V^Gnbgn4 a;xІބ*` WREىt*D_ UQ,U\*v'TP=}B/U\ UP'TʴIEx$d08PqFTq+. t::TQs*.>bʄ*0O_F0}*v*LU*Y)&T )ӱ(4ܩ[F#Xv}6#baV`s$*'/;T!m)G(IIǢYF]''X I eGt"i~ˤA&!3Sh'o8WWX31|8J&Ql̙:@Qɕi$NJ(즷(QtxER2dkPJuwk; 9SYn ɫb^DGVrS&pT(O!&ZoLDcW4H4ɚ4I^ۊӸ3~~c2Q*LlDHΌPeG[)Nt Oߐр4_ \hHݪZAϚ".ɻ _vji@wYߜQ xP&6 H̑Q6| *81Q,B[6Lw5\*dHG+&͏*")ǵ*&~(⃂>;u(%T!PE(?TBAf*O"$TDT-|">QyWc;Td .U3ܶi,b dꒇ31XQ&qjB8in!phWebQ W7=+ ЛQއƖJg/(l@y}~UJ*0ğm`&Yqt*f8v j<{wk+Fd,- A3z٤2z ƼOtO$4 bTBoFD=@i y"U w/0ܨdxOGS&$yF_ԸTA(` W$LSui[< k1 }2[=0 %a<#*Ԫbk6}ISF6!PF5*MDN6nB^c֩Ŭɯq PEGM$&TY{rQ7s%C=H5#@ʼno4O-xP#B:CA([},KuŠ0WB7`e@ @+y/xrGJ=C'yvx^*'4ҤQffr:NVl(5{EPE0X<}kR*PĉއRppeTѱZ~ j%H*ThBi R#}6&kY`>-S&T9ť ^cV\9T&m rq趕ɢ m-Y ̄@B eCKQfkې:s3g^_,Vp1K 3.ZaK2m XG9@KG be}'z6D *&j /,V17Ve_c¦Q̄vrXĒ"V[N\ \G 妀JZ@R(v o~;-B &DȏR sQ*`ie1T!Mb| so8;}1oxH(5yh2{z?ۣ ;1s;x(s&65_Wڹ 9 VXᶩ5Hfa۷{ĪNd-Yʕ+ F{RQ28ÇBS| UdTɥ󥊼׺U< =rUT`Pצ>UT*8qi!Tq*X^w@ۇBjWsUP*p0|~z)Uda!Zaj͎) =*n,H!zT E†W/F^0UpHeT=l7ILQd''KT{p阗!DFztg&qDuEWG36 R9~O?]wOO? YB]Kh)3SJ'*ncBʲ.2CժrHPVE@ dB4;1^*2_u<]s$i"H `3LSvgD5f'& TMTm ymTr]0sㆤ5 es˯6}L@aE8atr@AIcgLD_4 U|"UkyREžF|Ojf*.m U U𽍩F7K7_=#F'TTKg$V̕*vC`CUIS5"Zv]d@ݱsY v5& g'1ЀѸqM""W4ûJQ42sUp$ ʴ1@W0RX?Ri8;oC){f>?vlO>9wܫ921s%!5NfwdUT #Z| &*PLtv `.n}BS64͉*r)-J [AGFpq{JXZhk<ϜԾZԤ R;Ei͚ku*!7&uʎs+)i %5Uao}]FF8.ŲkR_ʎ;r0I퉊GHZkb&Lﱩǩ$:6U.F80 `C8UU¥ $UqоDk LmMetRA՚Du"^xf!"=ByTWѡ63g.^ܵk4XM2N|A*FEQFp]}NLMRE/`1}8/^F`рa/m{+X+nd)XtdJT@U[s#Ӳ\@Sbn"M*+T_ۍB S斬~l܆;_Qm G n[]өnF`5@&WHDFcͩzt"`UKHbTQybͩΣ8}PEB)-<6?UίV8;GPTYȘi*SL-t 3 5dN:_x2bЇ)eA6u%> --"nY,0049l,=d-*qWknei{n+CI|i)%VjMjUOw$L oMQF<BTQevRͩT0>744W*(L=RY>ZCDBK61:g0f??=]44*8VN*1U)rqT"O/ H'FxIW& {FG7l[rq#(100}5nUࡅ¨!i_]Ќ*MFxW8l\g\{M :jB;M"،,ShdF=TW:6rSB@"w-V.%TPܩbbvSQՉ*f U^oI Ck~9伨"@4ha2;f婩qeIJ%s ɭV{bo@*c+Į]"9D4[TfMI ]BcPkآ;J;~{+"8r^CQcܹ:FU Hƒ"&S5QE6{bԌ|=[ҥlk:&Vuv5aTixRTAqZ֔^j*l7]0iQC)OUpX!K\۫|1rT!z"):Y4$p>T~]DbcKS:2 Ņ[z\]lUfnU83; tqZԩ2n\aqA$U_ecɩJ ~D:7*d R0f~ȢYyѯ1@{FU/;&joJ9@]x8cGkh_ߖ&YiX!wʚ5SS4|fe[OB]vm4 =Q4m*GB7o Knţm+KqD`_. If you read the tutorial there (chapter 2), you should skip the parts about creating a repository and importing files -- we've done that already, and the step above just did the `Creating a working copy `_ step. Carry on to `Basic work cycle `_. astrometry.net-0.67/doc/index.rst000644 000765 000024 00000001562 12651445460 017200 0ustar00dstnstaff000000 000000 .. Astrometry.net documentation master file, created by sphinx-quickstart on Fri May 18 13:56:06 2012. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to Astrometry.net's documentation! ========================================== Contents: .. toctree:: :maxdepth: 1 readme changelog build build-index net/api libkd api nova oaq .. toctree:: :hidden: net/orientation net/api net/models dev backups api api-util-py Other places: * `This document on the web `_ * `home page `_ * `web service `_ Internal docs: * :ref:`nova_orient` * :ref:`svn_checkout` * :ref:`backups` Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` astrometry.net-0.67/doc/libkd.rst000644 000765 000024 00000003650 12651445460 017156 0ustar00dstnstaff000000 000000 libkd documentation =================== C API ----- .. highlight:: c .. c:function:: kdtree_t* kdtree_build(kdtree_t* kd, void *data, int N, int D, int Nleaf, int treetype, unsigned int options); Build a tree from an array of data, of size N*D*sizeof(data_item). *kd*: NULL to allocate a new *kdtree_t* structure, or the address of the structure in which to store the result. *data*: your N x D-dimensional data, stored in N-major direction: data[n*D + d] is the address of data item "n", dimension "d". If 3-dimensional data, eg, order is x0,y0,z0,x1,y1,z1,x2,y2,z2. *N*: number of vectors *D*: dimensionality of vectors *Nleaf*: number of element in a kd-tree leaf node. Typical value would be about 32. *treetype*: * if your data are doubles, *KDTT_DOUBLE* * if your data are floats, *KDTT_FLOAT* For fancier options, see *kd_tree_types*. *options*: bitfield of *kd_build_options* values. Specify one of: * *KD_BUILD_BBOX*: keep a full bounding-box at each node; * *KD_BUILD_SPLIT*: just keep the split dimension and value at each node. see *kd_build_options* for additional fancy stuff. NOTE that this function will *permute* the contents of the *data* array! When you're done with your tree, be sure to *kdtree_free()* it. Example: .. code-block:: c double mydata[] = { 1,1, 2,2, 3,3, 4,4, 5,5, 6,6, 7,7, 8,8 }; int D = 2; int N = sizeof(mydata) / (D * sizeof(double)); kdtree_t* kd = kdtree_build(NULL, mydata, N, D, 4, KDTT_DOUBLE, KD_BUILD_BBOX); kdtree_print(kd); kdtree_free(kd); .. c:function:: void kdtree_free(kdtree_t *kd); Frees the given *kd*. By default, the *kd->data* is NOT freed. Set *kd->free_data = 1* to free the data when *kdtree_free()* is called. Python API ---------- Code Internals -------------- astrometry.net-0.67/doc/Makefile000644 000765 000024 00000011140 12651445460 016770 0ustar00dstnstaff000000 000000 # Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build STAGEDIR = . # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." cp -a $(BUILDDIR)/html $(STAGEDIR) @echo "Copied to $(STAGEDIR)/html" dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Astrometrynet.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Astrometrynet.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Astrometrynet" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Astrometrynet" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." astrometry.net-0.67/doc/net000755 000765 000024 00000000000 12651445460 017526 2../net/docustar00dstnstaff000000 000000 astrometry.net-0.67/doc/nova.rst000644 000765 000024 00000015046 12651445460 017036 0ustar00dstnstaff000000 000000 Setting up a copy of the web service nova.astrometry.net ======================================================== These are instructions for how to set up a web service like our http://nova.astrometry.net . This requires a bit of sysadmin savvy. Roadmap ------- The code for the web service lives in the "net" subdirectory of the git repository; https://github.com/dstndstn/astrometry.net/tree/master/net . It is *not* included in the source code releases, so you'll need to *git clone* the code. The web service has several parts: * the web front-end. This is a Django app that we run in Apache via WSGI. Other deployment options are possible but untested. * the database. The Django app uses a database. We use postgres. Other databases (sqlite3, mysql) would work but are, you guessed it, untested. * front-end processing. The front-end server has to do some asynchronous processing. That is, the web-facing part of it queues submissions that are processed in a separate process, called `*process-submissions.py* `_. On nova, we run this inside a *screen* process on the web server. * the solve server. On nova, we have the web front-end running on one machine, and the "engine" running on another machine; the web server runs *ssh* to connect to the solve server. Setup -- web front-end ---------------------- I would recommend creating a new user on your system, running the Apache server as that user, and creating a database account for that user. On nova that user is called (you guessed it), "nova". As that user, you'll want to check out the code, eg:: cd git clone https://github.com/dstndstn/astrometry.net.git nova See :ref:`web_local` for how to run the web server using sqlite3 and Django's development web server. For "real" use, you may want to set up a postgres database and run the web service via Apache. Notice that in the *net/* directory we have a bunch of *settings_XXX.py* files. Each of these describes the setup of a deployment of the web site. We use symlinks to determine which one runs, eg, on the nova server we have:: ln -s settings_nova.py settings.py Note also that we store the database secrets in a separate, secret SVN repository, which we check out into the directory *net/secrets*; ie, on the nova server:: $ ls -1 net/secrets/ django_db.py __init__.py where *__init__.py* is empty, and *django_db.py* contains:: DATABASE_USER = 'nova' DATABASE_PASSWORD = 'SOSECRET' DATABASE_HOST = 'localhost' DATABASE_PORT = '' Setting up your database is sort of beyond the scope of this document. The django docs should have some material to get you started. The following *may* work to set up a postgres database:: # as root, run the "psql" program, and enter: create role nova; alter role nova createdb; # as user "nova", run "psql" and create database "an-nova"; Then, to initialize the database, cd into the *astrometry/net* directory and run the Django setup scripts:: python manage.py syncdb python manage.py migrate and test it out:: python manage.py runserver You probably want to run the web app under Apache. The Apache configuration files for nova are not public, but your *apache2.conf* file might end up containing entries such as:: User nova Group nova Include /etc/apache2/mods-available/wsgi.load Include /etc/apache2/mods-available/wsgi.conf WSGIScriptAlias / /home/nova/nova/net/nova.wsgi See the Django deployment docs for much more detailed setup help. Setup -- front-end processing ----------------------------- You need to run the *process_submissions.py* script on the web server to actually process user submissions. On nova, we run this inside a *screen* session; unfortunately this means we have to manually start it whenever the web server is rebooted. cd into the *astrometry/net* subdirectory and run, eg:: python -u process_submissions.py --jobthreads=8 --subthreads=4 < /dev/null >> proc.log 2>&1 & Setup -- solve-server processing -------------------------------- For actually running the astrometry engine, the web server uses *ssh* to connect to a solve server. One could probably use a local version (running on the web server) without *too* many changes to the code, but that has not been implemented yet. When the web server wants to run the astrometry engine, it executes the following crazy code (https://github.com/dstndstn/astrometry.net/blob/master/net/process_submissions.py#L288):: cmd = ('(echo %(jobid)s; ' 'tar cf - --ignore-failed-read -C %(jobdir)s %(axyfile)s) | ' 'ssh -x -T %(sshconfig)s 2>>%(logfile)s | ' 'tar xf - --atime-preserve -m --exclude=%(axyfile)s -C %(jobdir)s ' '>>%(logfile)s 2>&1' % dict(jobid='job-%s-%i' % (settings.sitename, job.id), axyfile=axyfn, jobdir=jobdir, sshconfig=settings.ssh_solver_config, logfile=logfn)) So it first sends the job id, then a *tar* stream of the required input files, and pipes that to *ssh*. It streams the error output to the *logfile*, and pipes the standard out to *tar* to receive the results. It's sweet. Notice that *sshconfig* string there, which come from the *settings.py* file. For nova, for example, *ssh_solver_config = 'an-nova'*. We then have an entry in the *nova* user's *~/.ssh/config* file:: Host an-nova Hostname solveserver.domain.org User solve IdentityFile ~/.ssh/id_nova_backend And, naturally, we use SSH keys to automate the login. On the solve server, the *solve* user has an entry in *~/.ssh/authorized_keys* for the *id_nova_backend.pub* public key, that tells the *ssh* server what should be run when that key is used to log in:: # id_nova_backend # command="cd /home/solve/nova/blind; ../net/testscript-astro",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA[.....] nova@webserver That script (https://github.com/dstndstn/astrometry.net/blob/master/net/testscript-astro) first reads the job id, creates a working directory for the job, uses *tar* to receive the input files, and then runs the *astrometry-engine* program to actually run the requested job. Finally, it uses *tar* to bundle up and send back the results. (Note that, at present, the *testscript-astro* script still tries to run the *astrometry-engine* by its old name, *backend* ... we haven't updated that script in a while. That script also includes hard-coded paths, so you will have to edit for your site.) astrometry.net-0.67/doc/oaq.rst000644 000765 000024 00000005607 12651445460 016655 0ustar00dstnstaff000000 000000 Once-Asked Questions ==================== Q: I don't have *numpy*. What do I do? --------------------------------------- "import error: no module named numpy" A: Disable things that require numpy. ------------------------------------- Some parts of the code need the "numpy" python package. To disable things that need numpy:: solve-field --no-fits2fits --no-remove-lines --uniformize 0 [....usual arguments...] Q: Is there a way to plot a grid of RA and Dec on the images? ------------------------------------------------------------- A: Yes ------ You'll have to run the "plot-constellations" program separately. For example, if you have an image 1.jpg and WCS 1.wcs: jpegtopnm 1.jpg | plot-constellations -w 1.wcs -o grid.png -i - -N -C -G 60 will plot an RA,Dec grid with 60-arcminute spacings. Unfortunately they're not labelled... [Note, see *plotann.py* also for more annotation options.] Q: Is there a way to get out the center of the image (RA,Dec) and pixel scale of the image? ------------------------------------------------------------------------------------------- A: Yes, with the *wcsinfo* program ---------------------------------- Yes, run the "wcsinfo" program on a WCS file -- it prints out a bunch of stats, in a form that's meant to be easy to parse by programs (so it's not particularly friendly for people). "ra_center" and "dec_center" (in degrees) and "pixscale" (in arcsec/pixel) are what you want. Q: Is there a way to plot N and E vectors on the image? ------------------------------------------------------- A: Not yet. ----------- Q: Is there a way to plot a list of your own objects on the image by inputing RA,Dec? ------------------------------------------------------------------------------------- A: Check out *plotann.py*, or try these older instructions... ------------------------------------------------------------- Yes -- but it's roundabout... First, project your RA,Dec objects into pixel x,y positions: wcs-rd2xy -w 1.wcs -i your-objs.rd -o your-objs.xy Then plot them over the image (or annotated image). There's not currently a way to label them. : pngtopnm grid.png | plotxy -i your-objs.xy -I - -x 1 -y 1 -s X -C green -b black > objs.png The "-x 1 -y 1" compensate for the fact that FITS calls the center of the first pixel (1,1) rather than (0,0). Q: Would your code work on all-sky images? ------------------------------------------ A: Not very well ---------------- We assume a TAN projection, so all-sky images typically don't work, but it should certainly be possible with a bit of tweaking, since all-sky is really a much easier recognition problem! One thing you can try, if your image is big enough, is to cut out a small section near the middle. Q: I want to build an index from my own catalog. How do I proceed? ------------------------------------------------------------------- A: See :ref:`genindex` ---------------------- astrometry.net-0.67/doc/quads1b.png000644 000765 000024 00000555643 12651445460 017423 0ustar00dstnstaff000000 000000 PNG  IHDRUUJPLTEkkk}}}$$$666HHHZZZlll~~~%%%777III[[[mmm&&&888JJJ\\\nnn'''999KKK]]]ooo(((:::LLL^^^ppp)));;;MMM___qqq***<<>>PPPbbb ttt---???QQQccc uuu...@@@RRRddd vvv///AAASSSeee www000BBBTTTfff xxx111CCCUUUgggyyy 222DDDVVVhhhzzz!!!333EEEWWWiii{{{"""444FFFXXXjjj|||###555GGGYYY IDATxo\WzY#O!h KM1&PlYLc-ӵzQ8ɆpC4a*z'-9 % jZf8r 7ȄZ"ol=[u_9sRYMV{}>xG<~V|0Fp7bSx;3ۀ~}Pؘ$\nW/?]L`aO~Pc]#/ |ȗGtDC}q9۞>8|:EHcȊCvfR_!_{RͷQG73q59_md"Khs{tƥw9׆ؖ +mOC O )LщJx:s۞u|X]*(>TIVR.s_)V1kxu9w.Q[7qw?Y BI}H0>EC_ x] 2dox?)}DKeQ Cڗ~xqCUd. >\D苣Zu6;.ѳ(WlM]2"O :JɊ۲VjEhF1@Je*}E YA6e|PͶ)5 FVb*]2gPTTPIV6J3W_' ۬Ba-r&᥺8^߹?v߿ 4V {xG4hȊtS%d/W?!ۄPj. )\J̶e?(_qP܍ d] _9.sY5HeEY{׎aA2Z~o[ઃ8c tx6܇S""]~WrdQYiMBTM: X<{ȌPg'|-bbΝNy :FV Zց&TJɕ |N'@[66ܞǧ[5+ VR0-W4vňa'Ls]0+ІF7ZbUaq%|D5T\6Q(l2벢Dk5Դ j/E=ӈ$ 6ܜ?}jೈP}QZh^Uy'Ը.4ZJ o?B'0~"{Z%+V#TOװb Rf{!CUyߤb3H̚@YƗa>cdETj.J ң ƒWwTayi'b7 IPmɷ2fD ,kܺ 6.1XD*v[BU65UpEUULU(q V#]WsfSIZ:Y1+e+|a#5k@L8Xr7j6ocEx:vdȊRUͮD"BM~ uR,ޢ 7ZuY "yN|{{ f NV $BܚϥSDJm՘oM\*M*1sRF~|驺T`ev2RYaF1+u;ՃBH#KUQ}'P{`o*2lĦF4pJx@U-*;VEN^C-$AiгxD<vMtyܒ_Y5Km]U2Q"$+#?^}DU\!mo 8hSGn'4u @R@ wߞ}eGb@{Kn4]=] 7 Z@&f,_ت"RB#?MDU<+UD[f~dK S)ۅx^*3W>d]0WyoU] qUYkJn.wU2wPOF~/aOL(>?a`>ZyN&+Rwa`8;o)xn^!vM&Ieͥx"RTVdfDm7 :6N2V^iQ0dDr  < mQԮY:L֯0 F[yrux9Jc8.sfɐ;e6JcTt*l,:B5̙pYYU/ۉM:4-F=K=lv.GFV 4nI;ٮ誂gHCVu*T!Fy{)≞&3pon"Z ل=3TvA#KEȡ)FEy$Djs4ȗ~nE1T8՟~ɘ~RCgZ#+ /H qd)G-TSO Rt]QUEDňh+I?Cqbq{cS#NV*l-X #Ap@EW\Nx:PsOYdxiGhώ?|>U\**rC,FGVsOWiU_x8CՒ`j{vUT7k2a5NЪ!b ?l x]_&Jp7" uː>]UE~E+rCcrɄӇFV+D0KҪbzF@>PϞܨIi.* *=sn8C0a,5 0ͽN#Ha=4Kyz*b]38ҹ_\LjUVUq_&~>.{2"D%Ȉٜ6KѶN@2\ -q @h2URUOw  PдRt-ٕuv L,P8 :ђF6 =t*,wS5' aH}Sϴ{ҋyN$a-=_w5+kVFV2^,]TVH J*&}.yNˊ-3aˤb`\ahpy=έPe* *KEdш JCUO~6SA\tvz^ʁ{b՗v܅5*$~zmrqqqחĞـt 7HRj@ę0f1_Y!h-#I /ML35zA[ZSP>H0Q?-&O >]mUEװ'=MmEnM*cM&Q9ptvIeśq*4KNf 5' fxbx^J۩ Sur3Phڃ9ti3Y gCia-᥉|֕<#+17vQLT|hDE YP bxq8>yNhpEj]txG-Wq4󈼓7C ; { ]UيP :KVYDU۾GyXfxi|X B| I!Vޑ`"o<,>Qg50hBq  -3â 0͑)Iʲ1᝝^g#mS.:yw8l@?`rO@<ӊŹ[`IYѾu; I}xuXLh&D5yu*UNRmsA STmq4T0i-0Ms^Ѳ,lOtxu/Ğ% F Vx9Z yAV-Jml"'la^j`NkMYRyNt Bz )B1I;5ߩ5'P"~E!.DאXRQ*Lp HyUƗѩ*^+$0feMVD ]"fMf]o/aLDŬ(E욼?`dʭ?<<|xޚw: UAEWFTD.+se`% TbS.L64K[/u;yL`:qwrs5Mb&3̳)\(Į te=mPkJY:۠gˆ\_OCTŠMU$0fQ-eli1+u;Ew@u {Chv@uJZ'ۿ8;5YILL`Wkˆܽx˸R,ٚ<yN < ]jAaEp@,AvM-*+ 0,PuZM*NPQ[O9ɽ}[U܆ c|hli6dE=f'3kZ|Oҗg4 o;AXxJ]`Z]3S1xxF̝d@Wǝ4Jx#Cϣ*Ȅ1.[ HTcV2DX&`#WXIrF@9|T]`d.qR{7ĖP!2a̢'+L]TTbLDz1+iX5,Y! 71#*<򃻬QӜ&YeŔL%$bRQY5ei^ Ɵv;_J@V H]`DU:|`] mQdϻ`LqLV^nxa,NӚt$8OGd.H m$Y!`DE 66 ^li;T;cyN8ɊT GBLꟆH[X\@H&LOW)ms '4 \{5a&-(+hR'yY4kR9i)BCZ@P&44 §d܅%Pag^Ub,<`d/IrYQǸ r?;dB*H_!#kG?Z19Uڲg̨p4T(+ULۄd^#A$=@^7n[7QriH@J+`׼%aU6gTE(*pk'bڭ*8NXo3,u;I&7Ot- 7b]3 id] *BPaW?QnQQXjuҞ2/?u k ,k+5sxmRi5 *mk4- vZc*j/_^gsSP򠋊 1+vW1>ޯE'mb욀7KJۛhCP[*W\'YPYHFfē$N:)yWJ̬RDvMk.24D,Qi*8CǢ0*r0f1\t"vV%$e6 JˮI0yXquyd6 CzDEϣ?@U^*ƥ$?]ZOzR~rvDYqzY%})b`܏:dFVUje0""F Y1/ 2av(l}G^󺝰j[PmCWiJ3 *YiNzQ8댳PÂ"F`U{X?'>0kf6I$Y q+4C-Q12r#@^Bdimqtt\U1Tj8+HUp0fs`*yx^4z4 dŬ^ @)~2B2ػJTTnk6babOU[ "bSueI0yN,hwK5hJۡn9@9kiR3FU@ + va PYqR@\z^pȘ ֤Ճq)=&`dErl]FUx /b*$Av E.*r:Iב7Z 7Fpt?LE;`*}gVFUӑPa5 T0h))+T7tN̚v؊Tꊊ#@^IӮ |еUɽmT ; b6U0&_*7rRL.򺝴{TI 2PJ VvM@]'Mhv~MEEg**-1Tx3Z㿍q|:@U0fQ-8TZ&Nkn* A=EH*Xs?}SitF|86I /CyXUQ/>+6XVp.: IDAT*|uu \P$4G.GX5 ujC4jݨ\ 6ʊL[. 5DE~?8M6CD&X `ה`H4rӁQ ކ a]3â eڟ)yݩLP _YJMf[dǬDbU0#+auFd4 Pa#^&AU!h˜ERLUYTF4"TVQ}vb TT4D{*FD*l93-T l3\tU@SG򺝸e >bu ĚG%5EPvz"6BN<,BU cՙ΢LӘ εe JC!덪Xr*]{oT@C貢6abLꈊu;2qQ!f%"0>(+/M!:4Ȼk9 `UQ,U]*-ۅ%1>ڏR_֓lX7uOP 5e!Y U}1ߪBNTYq1XU|@FeŔjv|%)zn (>-{~BS}Q]kUF֪LLJ8RI/yN@ߛ=p(b ĪIkMU~) 6a*Mk%wbՓ1DT4񽼩 Y ;[| g=ʘbgj!V LJU<=*eb{"v++G})z6hG9S vBaU?;âʊ C^)jSui*XJR = sm*=5$az׳Pф\ ;adQ-Tb񚰩6ҝu׊Z|Tڸ.ݮI08'U4kws**lf>â0MC'3wܨHu J=a KV_g &5@VQLBHEȅu}@1@b 0>|͓>U3**lamP)L(^7_%R 71+\'POb ;?Kn}^ b< Ff8W)z^| &7ŠC VǮIg쟽@X]cQ*߾@6U o 8P" cLV]Կ-u)JCrbɍSSǮIUk#4#t~TZ*laUET7{0KnYB R*Ǭp'q V 5 ?| e BCjWVCb1E:T^njiѕ߭X%DHX7|4pȜPaǛNU7â0&+Xsm%D}TGjǬ i 8@5MneEہ"tZ0cB/CU񛶪 cc<j!*F\u "TS=E욲?\H{I^eKUfCoWl*~S|tzjd&9kUl/9I]ȥhh#tZ֫, v\1pLK7]1Tor>i?Yۺ9bM Z)^=feoRkhxUƛ4INU:â0{Io}}fDJPUhÕ܊dX횄bnҞ6@VT <@#*8 0gQC^X8 %+rݏHp@q<]aG]ҹv@FTΆ vYTmI<8"s$;rPT1P!Ք|I(/Q횄U6ij3+Xc7d@e{'LW)xj*8<<5һ;dPagoSӰ"7c.v uW"-aT5{@.*ʤ,vǬЮg Q8CDD6TDya-$ _?ٗU(U!a˜E]V6vOz3NN->0C@,0+k$df֒0WU\% c4dPauPPB„1 6=pQl^PbtVeN1+>ߍvM­Vg/W)Ԡu=^h˙XxBy&[xiUj~İsTĬ $p L<*fPڨ I,E׽M Tg@@,-욀v9A]# Xi)P]TKPџCc_URV|\,^1âʊ 괘8 nem"c[ՃqvMB6dOeWf- lͶ.ΝD?:G *jKDVSkYRE\v-k<uK3r\E6zгIq2\ ,5 Y]V0nak88:{דk͑l&+ZaI0fjOz3`Lؚ8 ̂0JpX`׼ D],?WU[f{g,NPUB7h\qUڄ1 &+|}z[ ̡?駯<<цv?:J( C; ?Uh*o%w!Μ*6UQʊyX/OKΕ `뗲kh`1u@Ci^z[V"0Xs`LW&@j[@V`Wi vo6_~ YcȻ3T0l" .`/ؙ:'r"m&i+ YWOXĮ)BƲ8'Ut*~>ب ECh`UEFaMK0f:d3z.]C+ f>m{"`?*C]욀"Ux*hGoo\*.UQkxK~TVmX>]n*~fBM)k ;?6k$6TW5VmP !0f%,SRy,!NUSCcPPY/Tk";Y朋Ξt#Q1tE#IG7>i1gtԗFTą ZbieK,]dwMUPuZ| xEǸ~rk`xTE<,,q}dD`\k4}d1Nf +fEВցXs!o1]t1@ RwKUAt'F^+u˜ _?/;VUpuTfqPmR McV#0k̮IФֲUsH*V::H&Pa*jO5@rz8p_Q*0ZWR3v<)8MNwib-jhŭ}R }oȲ۽kch㾪E c'\^\r 5C54t5MriAgDhD]@VJ Ui7*hU,+O\}r_iri–P+_ӚTVR@ tNbii<ĬJTE!'倁 I U<"S|ɺxA.vU1UUqC@yN  z rֳZbhSLquQT9 と`ׯ1TU*b6Ʉ1٢zI`߃62RY; #{.]Y N1ި,+4pk_ vM@AĬ8J<-bITELV2*<^ \ L{*r~9Ֆ6&8+bvLurkW @fvQ!mc`TR@]Y*-⫊vc< cRm*~#}sQqu16wѝ .֔u/AZQg)iZCUYIvx`Tp{.vrtz&ت[/tD{ˠ≋;L!Q{ҺG,6QAZ@F4+ل`5OZIQ(N35U; xEȨyغJ~qU5M, b';k{A(şqVUXyX%GLoE1DE4Ȋ0+]s!~ZqD9 b Tj)Y;X V}~3ӮIPQVRQ@LUBBN;ȜsJiT=AU cCO:DȊӱ K vFVAvCbiޜquw3+v 3ʗ/PeU*l*Ģx4dPQEb+zv񏩬WtF?-$7m/M?Bno|bC.\%Z H Bk: 5_'OGj[Ūm!NR@U&{vP͏'?}>kUᓇE&mdaJEsCƵsܰGo9Dt? '#+NS sRCù2@~R~[ԏ}W78fkf|agf]enb%'iڴ *(޻#.ōP *Sr yD9"m^FKXrX/zQ-N3R8F .‰-_nL;1M̹-N#Ifw7 ¾.L5hvu: *ڊ omIƪDTvJMb\} 6kT= +hX,+? +p6$i+S4+Whx앑k)> 7Mɹ)'"&NlTZC,=ϳm^󕋤BVUnYq@B+>n@M ߺ֒r3~cK۰Xɒz,Evpz.}WX3CL{3 G`!+˽/d7t]&D*tQ"gj/o_nbiLwuV(Qm ZFBxM4Uai: r&sgc1T-5& "paD„1G 68饡Q}% z:MPW[8 T IDAT@نԷiHdhRqDj VXvMMk="(Ķm-7K }[u缤VQ`"KQEU&dbZd0QX:csso?בcІ4Ǘ c8͉#LۏR/_ z;ލɨK;3bB\-ECϤthĶظnGhO;FAZ?{ꉷ"KU3 &;G͍)7>mkq Ѕ3d qA݀|3a>hB ^jkR!FA~=hY ),#/a\ $[ԼVOT5 hXɊH"p ƪP؜?!%<:>aUWZQ4 2U`i DIn:FV۬j̬Bfb| }SUEibOj (eťL " *ΆViֽZm焱u 174)_'&&ba]B:dOh Y43AUXც 4סgDE̓V Vmkm*Y!)`}WaU+=ITٳYYq m+Gkmb%l„X>I]BLTu 7#yyNgg8=TZAЪԍ$YL@~b45q[ )%E!_Ȭ)b"X!U&!74bXcx&TYTDWA*+zhE[u JCVF&>^$bp޺8DD:qfղVXq4k( ߈itٴCʥԺD2,UYjƶ/"P"4* gx?YY.ο(85V{"F1֖BCtXK{n a4oǿt }kY+XFqA@ "XüQVQ*A7VQgj1`Bn_=UטxӘD#ȭyζr*l?gՖ(hvh+χ XCTV,NO1L ۾w^hP,nzb?Ѓhv&BUě& 68z/5 ןw$+;K"{u~288/?ȝߺsAk 2%pv2ݢT4!SZ%@kHCOvLFN T hm-v~LZ5M,>WK?ZvxX|ALgr+gT3^4/!bp+E;Ν~|mh!f"/̓ vU5t1M8ԱVT1>h5@!rKKefm!+̅xK;UaڪH̚G0~pYr{/kvY0,Qsq#TECCA/yzv^Ե [V[FgФp?"ΥNוuRk4N36%ŎN`-]U"Lf6"4U[:A{?XZ.tY%*m׹Y۳O:2j!>tZsOl`.(b8%jZ7zHKVސ[}]MƤUm 1PI,ZUD&fQoӖxKVFB6ը('8(6_zRCTl{eEwz}!! SC85޽O ]0Ckr6set.tu` KEtMY0m-5D 4h1P'qɝ"㛟 (_,% ZfU4 ^(E~[zvH񿋊1#*' +B~EnТFiRQ`;KkO+oM)lc PU{ j!j2!pOh˸#wlj=HCpWfo |WܚIkbTlxBf ,i}%z_[KaKM+l.Ymǂ%ĜǼ^>? ݮ0{W,ĭ;#wQdE7khŁ_-pfevv`[QfpXŜX+J.h9kb' -L4ED/'A7]>Pg+Y!nGW* gMLfV?ŋY(Wr{;-𪊓r9[˾\+=z#Iū_N{ -25Dˉ[~miҗTUa|,t:rho֊EoՆR7M!M8 .×9ָUEibA8BEkOS ֘CX42kʨx-46Τ #\Q(;B /d/`µ9ٗwwx&m&ˇ8w- 鋿~j?Dlm=!I̶ '[ I*q4S QB tbem*+R Jd_REŮSU?M%CȔj]27WYQ5D 5NTJ*0.nVyk"ZqV߃8{Kiy4*Ҳc /d^wUĎƜ&P@CXtCd[Ft U:4Oz~V bDUt?B@6H^!3pdY]U$&ƃjT_5o*,,ߕږ&U:B#|.tSDz@kCيӜJ%pW)xb#* )p'AGM滦H8M [73A~j9 QZ{7a S%, V}L%yxeTIjgБd{xjvw UqLC9yF3 2j-slUPb@#*gU2R/BjFISu{3hȰ@'o@6Qc$sRcS*Kj%}YYf`u8M"4)dvOz]+KK&+1M EZvc`~OcnhFyk VVqq{ Kו;cH: ef6Z3%eնgbh-cV軀=t{|R|b#* LH}w.lՊ6=@UXĒpuOe*zXUlWRsu5r; '}GhahWgGՊYkQ6ŎJAM~ߍzR9MQYO,~,:$rEˊlDE{"_7DUș'VTq,wmhkfMZό=ڮ/JsNatgzޯCF`SVPAcVTVO/Ua0fu)"VRKh纚r[5B Fmb,ܚ$@Ҫd#d37LVM6apVa.C/-JVq\1W_Wf gDV[9Tv~jޟ,+ބ֊jj~,9qS`xdIOY<\#,#Ȕm_',3W\U6ΰKU c-`E>ࡖZQ.a|qCLXx7AoT嘥%ֆYHCjA"BuUd$S ^5a3yK$֊ u]꽻3FQ8Ƣ&ٮ{ěab7wO|nڽNeNuU]5 oخ%&~kE:$N .-OQ!zoy Ok^ iwfNyU]~4nNb @|AaPkB䳴JZC^YL6Ԅdů9$5CSix+ mlj W2|`+Y cMVd#*CQOiN`췯<) } w{Œdv{I3 w 5Ppc.KVS c63fQNVD3׈4D1s a<0B_;bS9Y!QYq(*l&ٰ Dž֊x]5DduC[jZUķсƿΧnTy =.w~P0%+_ݠ*z-kKئ]Dͺ1V0ukBHaOss1SwewwrT~ƚOJ!)Q8Mc bvQ!dξjnvuCǢY}zf'ϓ*` ţwu,ʜP֊:ssYySb#&;!73BUNT*Ȅ|}X+Hf?NwG9l2uQa3ݕ>Uvw':OUM8Ekh6@QZQD(d4j&˕yZ6ڂBcj2YOv7_UQݾ(}icAZai"UseAXMl.NClli*rMTE[+zXCLFAĕ9tyVl8 q`G~&TE~w'ٲLWY+ NsZ` +fW!zxѨeG3, TEn9 c&[S-i&Ʀ%LX~xCGYfK`˾ʔ,KU%{Xĸ߯{9^ϐTZY+%rdG, 5PfzEGv7gUA&y:63KyDzV;29Qe3q\px"!CK o[J$rBx`,*?b=g &"ޫ536TE.WzLg7髡vN28biB6B{Pkk]k߆3ݗxCv7oU[ m#-+d {= 0O"q^ՙiW)j.x%2"5T,;ˍ**aUi$i>D/Ëe7i^(k.*|{ i[_k*>n ^I7ck6!i;,jiDk^ȧ͓T8BiXE a áUUl. QX#+F/Ԋ^}]PǙC*^lm;3 pA[D|Dj>fVVP1#,XV %܌2 yIe3t kHL&- aKm .=N o0΂Y* h?BycOx`d:P}%a2!(f%ɿTUEAUq>Z0j9B"Vd̀NXFJ 67t&TDlXPE.!,=C4T t:U3(+D-|Ձ(!/ͨi,/0նОR6lzcJ4D8h*2!@UQ.S#+0cse)MMԽ0"V;SJW\bS}e֪"H>:[M4Vd2-!"/F#a)q4(=iKQ[Y40 IDAT,fwPWzJDWVd2MH,b)6)tzJWL_i\bti*2ݍP7gUQفWMwjbM!CiF8 "s}\UśTTlƯajE y+.ϛ#)qSZvնLewwTCDS<9 _S+l?<<{}xg`? Ѡ=QQ^)EEXfնlewTTT<Ś9hdQU >Lh0{JiqT8=i&3*݉JTU**ԵW =C 03}- \2ն u + N/YUNVsQNQhi0"r)TDֱ_ޞRHe5ݰbV8(dqVT7{Fߨ!^:ID7H3>~Vd%>L k{IJナḀJG=O\õȌ`$ wsp<U'o7K,WYkْ 絛aAc$;ǜJnx*ݗ5Cp H|<ޠþ?lnVdJ6=^L+MY!UiѯEUXW79 tF53-zJpe'( DlN, Or*U+*FVAH}zJjJ#!,Δ؞{m$v:ly'G U1|#AJi7(kŭ)QzȊlkDE 6YA@vd$QmD@#+ bHg`=KFbw4VF*RUgIUUqΑM82rT㫊稨(*8 ŠlЎhF;3oPaOpu]]m˒ t8jC?Ƣ3F+A7y# =Iߤt-KR]|+7džP` 7&Q&tZaJ[e_UYbGr++Tԟ!«d TYoedԨAOi &i5Yi|Ԩ*,Ybuf: *4(Gn~y!2 =/JT2i*|fY((aUE&TT?+erVd(GȕXPnI7%}0i*%??`#T?rG ŬQIrS `{RF*% *"f_Q,QAKx nU9֓A t4>PƖWNxХ h*0ƕ{X* 5#+ rPqQV_g%e[%QDoba4h=DEE}Q'7b{WʊlPU7r!Ce"ϚAj ]U"T!?N6UPQYV٠*.YHEH~ꡐ1ҍR=U%PG&bTD} Y BoAyzJRДvCKDjš%VNUɾbh쥲(ޮC߿ |םJ38`M?UڦhxDNU$6 2wmebą`̙ᓢB1%` ,l #ʇErb22,[8B߰j(/*ک ,,VUE@M_*x ]0‘j^BU ԅNBGUduUYTo3`GE.+nV= 4M>l9;!ڦ,1/bT|.HYv!N.˃Rnhx1Hi*0K `ZFK>OI bINHmf̡,feXKᄤ7,1/h«*OQFS٠ ޟ%7=d"l$}tPٞ%GU˾SN }- E)膦BVPUĺf= QNmFMƕ 6k Yجd{PsChoQN΍<+A tXD)?z0PX$ UEgyq NY:t~R5$GEY@ "s#WJ~Lš%0A$̩﮺!9 eqԞR@|.I Jٞ%9T+)Yt0$G'=@oY0}YJڦ,1/U!TT>fdE^I2 YR ng_9&,<]8Bߺ|=.ҕʪbS5lzY?2(k Q(=ׅJZOJ!C*~GQUUgNҘ q"J^+ ɐUӠ(=@W$vE_FEUEfyUҿ_ehQSVОZe! չOE-]TV| W)*r5K SLTt8Hm2dI@e;]3-E ` >&UT%.U.w@&) 2a,h AdIۍ&NO)€ \!-Y,1DU瘤lIp]@ Y\GFN#}`!SGj]Iڦ,1DU=F JPH7D4idST%ֶ C:KTEfyDS t`'VBRyd1+c~O1,1YPjݏK9W]Dnq.1O{8aVd$+*RnOBR ]UOX)US,1,IWq-]L>ꥴY25)R*ฤ𭒪,1>:;/HT<5RPd>zoY&rS5)})RP ! f-W$+4y%;k7E/iEEE BUYb.ƦAU$_=2"`<~aR浯_ᘈv**r[mSCUX9 r]U| $[ dXږ~E~ĢҷSST9H55˪mp%T&!%fj1p jӗ3]*5Bb/g)Z(HHqj"l[xu%PU, Z xg@N^{rGf+[m;sqW!*3H!OB*r>K; VrW,TȊM9O'FVd|-jb/ S H0o+Aׇt9h̊& %PGC*"xV[x,QJ1JJ"mDaqsHD] {0>N<%OXU$ 3KY? xRׯ_0ՈpqD;wb=hQVNtw=TAC񔀍=VTĘj\Uaf5 ṵzBt^~cUTf%6g C]C8_)s&)WIF,2ULH;E,WT^<dè1W Iӓ3}%Om%OzŪm* QB0sۖx|ʊ-fxuDhWY8V#+'ed=)[FSfXo1h od H faՕ8r#ɐz_993vv{eɳPJ')tE3(6YkBDD u, P OAbLqt)/U.*lHp:U)WKe>ҞR'䬯4_1+^~IkB(FXb{{_L1Lt(w5(Uj5w3,=%l7dHRN<ߝHOiRQAZs4;AiS"uUafi<5J#uUA|#ƾyOq>f* C9M/oF ;0r٢{JyqxRP%նU%f6敀 2P? 95ZocŞ!cd?Ĭ?6#U$fU`?IE&">߉VT9p"yP8czOu`BЃ Hg٩ =K̅zݫ+ptqS#C˟( /z׹H^ыVL)MZŲrir TSг\ضxveN8*é`wS ^NKF oDO)@};F8CuVfUuHMǛӕyӋ:+o c- hŁ8Y_ JEهeO) ;n,Q+SzBӸȆ 8XM4Nc+rL'|[gc|<&je ع,DUYbn<ej-lZ#.- OV~f řC3@YZTt@UسĊMϱ$ eoWOgЋrUxyJ+U?IetSCzϚOY;O;&Ϟ.&3S+r\2(+2,)gjˊU%foE?^BX?K~њA9#TIE/~R RG;гxTޞl!LMV.$RVx^ 2zKph,`)"]&I>) =KYrŤWwVLa:_5N/ ibR\C\Ee-*@V*. 6͏ﳂ҉cQ ġ;e-ޭ6>E9Zs[1LL, Jږг:='Xġrp-YcG&揝^bQISsS :e 蘕Į*,2XV`$lx"%$'Q1:ɝJ Ey-Uguq,5GPAōJ:zmVP'O)4T%AVr |-[lmy*b@`U~k6Wv֢"&\) =Kvz[er#Qh>{@7}c1+aHг:{<pf9@$Ŝ=-R1+IQm*,N2]d7IhŪa a[]CM,1+~vm{R:w IDATxYUYbX3x&T_z+wO)NJгzV탈oJRJUj; # {zNd`XV1G 8^^b=S(G$@T !+ ֳ:KZ}^S7<l"jY#| mU%M5#jC+G%5kѢ"}<hX.U5Kg('X+wzYMV) +lA;瘪ճ:ez 0FD_~WB"k"wzdq񟑞ȆgjQZvX T2wz񗞧XAz-*atYgQ7B;Z m)zJ v1+m(͈%gC+6%Htؤ򚄄TT)vF{ò(?ܹHw%^ )&iU(gKXS#*-XSUDz/Ñ&a+hQ5!dV)U]a{񭶁8X{P7Bp/h&'aRПPUۨ8~<гA|Bl H6#}٥C^sx̙`Pݻ-esTVYby3B=|,2s&1]eqR@@(cPNoHVHѲ"9zQG74-4 mفL>zX/B+SH#kAƘQmKS*ۇ-* g2Yᝇe9EZu 6FˊE(7HM\VoNBOVXH%EBbVuي D =4q?n j[SUyaYbݐdQQ`Dᒼ;=4xJEÐ"|qVTгĺ!9VhŎd#(B0XL_p.&U% p(:{DHMhQf+bdhqDaF$jFč =F T8 NUёguC"Q/BQЋ26jۿeAzJU#l4eKU{ zCYb]CB+K ZU hX@;Eo!a pa,!Rl;CC+h\u*qE#zPEtF6Uђ;U=K Z!̈́W ZT;yڞR`0IiC;p֕vUaa>{K낄VЊ4ZH" JﳣZX !?vT +~7 B5"EBQ'nfd  V'5%,E21p*~솞%9U)}3;:-W~Y|9nEjLY*V6/-w)>VH:|H7(TMp[sbYbwGGGQ FEYgV%jhN@5tGnHom^Ybn~GNia Ɛ<H1gJrr 9}(ED0)u[JbFT4:%ZrXE'jf^R7_TcMp-%V *pٖ✪H0aL#|bmnj <,Rh%Hn[5wz4b*$ ͋ʊ~pSkLVp >~V^ ,@r:Ss%B/ӏ,t?\(t0ܴLC+6e ꊲoeTYQR\e4ɰOP|  $B'Q y]eM zCp,.AU1 gr z7Ywz )IEUmVZTD n󔆎7Yd˘bII\w9!ȕ?WTTLL4BV,!#MzО}YEnyJâ}BӉ"_[*T߿;PQZ!2U(#gC[pO &AǬHLDUY СrLà|B 䰠R7VSѵD 4R6+hE9|hTcYlŬ<}4c6eȟѢBj"\aC+MɃGTn 27YprUBPn BV?á6Aى)u4 T"Q1D$P}+^ +Q$~%Zsp|Oz1Ci鍂؁mRJˊ\MZqQ4(:݅EvxJ$4!̧rش NxBabC+d؎+#]m)BԇQM{J]XyX"eE\?b*'@!$Pi\~pLsΛ.N/,'%*l6"*XfGm]pPUsj%:B+c.͢gxJ]/3Yfuo H; g _ N E*£BC+Њab䋉^@ LD<,!^Bt"!jf^cuݯH*$!N/ThRPmS3<,M$YZz*J=UKͼXhE@iV c- h#J֔1.?:騐Sb\쵡Px"/,vMxYsTͮLs+6c ebeO}Wdx dpVTgZ" N/pWwlݗaU&#FSPUzr]*nvT4)aB+ TQ^nq S.Q(+f^ؘYA؁H>_iGUHwo;= (u]Pt oM^)usPqUۏ62ݪVVi]37Gg*d]JHphSY>"%.g)u6a3K4p29UODfn48kX7U!g%V/MVl3h'%F[AqeIS"@d'ɣ-3Ub lu{:iTsOUx $5C+9!p. wzy$5O: KpRvI9 xOWWի_w6[}k>\H vɐeBыbPhŊ&$)zJaaJ)*bSPmթdr>N*-frSUHvhQFphgr}rKR7LV|u[&iP;v`w+_x"R̚iJ 8 fĘDϵhZAf4HE$POi&"( xڢNH~mYY]lJ 8WUH׋r'9#]cV mOU &# ?k_H[IZ}!pV qFub:( en6;|NU;eBT<<} \ҢyPeoB+yӸ#,'N/Od)uW*2nMqggpg9,.]UHqhQCPhN: +$i&i;͝s,ky;RPN@H/tYe={@ HS'kzE$ +Ä5zB^pq*^ ;=B+#O7r^<]j[V }:xj|A”>ΙVgM>TTjYѯwzݘZYZTB#CO<)$qج|)i|28>Ί}  (=B cb" zJt ,\O錊-SgJ"բ"2%WNj`X?WvaVq~pO+`[|Qi {*?E=b:8 rBR7yXs(T} V..:oeLMU |T`Ӑ*|F{EE9{%+U`W V%#`iqhqLOU 2yH '7T Y)uB[-X{'F}*XjMρXqʊE1iJޥSV \T F 4D9?8DatCś,XPaĦR&FU:<,bLWU`Wt c,iwr{)F:yJ#Hfn(UDEҐ@wsǹ3eU@ 4]iJQOu6,y`46ꗙ]-ew > -7^4t 4!_=6xA(mZTȃhOuؔXvkg 娰 3&:/0T۔>MI>u>PY7fDT|4$VVgC`gDZTKh@xXbcđc_u'/. MX0xJ݌?Å`|R)$~[DDqf*Zƾj#Dy֤TVbz$yQ Ɉ}T2ƎWD&ꈊ^!ҰTD}g*@~(HhE0DSӿH1OZ )e.]h'iP0J}ࠂ3U4h_.N <zD;ZTO)ppa=?yW7&X\T<o+ ʪsY˦3U!;V\SzѾަg j"򑃱j6񔂨(XbǸ}аy"_g3);-DZyJznߠ[,B>yҐoqf*25JFj> ,NeJ|R[V@YbDDVC$M3ijYDqf*2͔7&IwB*n{qJ,aSXbaOZ)eXqc wes1Dn+ IG'LUE -%X rؼ_W1|,p!4H*O%+:{ʙV鴗zz}٪ wXEZQ1]&vez2Է1/)̵(%z@Wd/QT[).>b!-vD}g*2;Т~4D_\T28=jΗ;=τ1p6<dEYն3i h+ I{H"3kU1[X1 =hn9)'ueFye#Y9ٚIOՆ$a#)+#l[ꉊJWD)Ǚ ;sUE7|B+06Xq̯ӓ,d*28إ1:+yJ]|vsݿ?OU|'4$+\8c?Aj? OL)ЊqC ctԾ]eV_UDߑMN?jCg oXrSJ* 5XD6[bSH̢ 0& dk~—to0uvz^o`6_kUS_IBҰtq QʊԷ9 !RNc݃0\4a |*%a-C13^<Q["1N>ih/SV>pQbTEe,xVԥ0FRn+O:tWEzB;=j{" "R%*'=eEj ;uDOBQ[iH*#q R|ZTgB}8Kʢ/-2LDLlj#HdR_WfȈt@)k@ IDATđvYPm_pr"rFJ  '3"RjIVwg(U4}]gh0/:>#Rn !?* ߮pdĞYU, YP|W0@m!.,"&;a"R;=DxVH:aE;u q(te=/=.)+| BEK]ﮀˈ{F}S)Ȋ,4 Z4f06ѱ[r]4[N_/0{JmQaSv _Ylaܸ1B@ewVW;>S>"q T-x h!]sY8_xN[8D)=DEڒ`YqXȁpʚIl!90fq U|ŭ)BC+=iRN8r0_;H7YBmpY51{JY9#p8p\gd_Nڣ ۳;sWhEI c|OW Qtʊq=8p^JDB SXTVW`UN4bu#5BU^΍IN`ҎY$Ӓ5r8;BH |^: we~'%HpoaQV{hE͐įaa4l*4 Zn gW:x%Bۺ8[(oRo5.3W&]C+1}b?VכsS PXwѕI85DHoóVmA*,=B c)VERSvuS DJAՕj4["Y}~ <"YZG 2NK7#Ec> W9<@D}KN5?Z5G]Mr'mq@*"]=vz}޵|4Oʑfbt3_BS (M*h@a0w߹-BNPB&U6ųe8glV cU-̡1yi&BrRsx#7 _Tv5i|m@*"-I4h Ɯ! o&TH$R dS?kP4 )/KHU|gf4:TE0E9_@7C+w% AIu=SmEEC: Jo#QS{{w؉m2mʛﴭ4TEc -*DZZ aaDhr^{cd!=~Ռdmv )C|aF}*BOtZ' 'GӛlͼN{+TǕ2D4kOݰoV?L9Vt" ƴЊx[" #+P-㎐f_^ Iq/|ҷI2|a l?ȇnosPU-0KË>BfZ28'i[[s9ICH]s1JBʜh10F D2)QEdI+umdc`Ǐ\2&SU);.Ik.2 &*~EXXh'yaɇ3_E$*Z][ep4xOz_~3T<&,tS0ƎSp6K,[жUU r>qVDbUh+֟XT̯?c>=NͲrP\R9^h%]wxɴ:R6 YӈVSDaYWC)*X8W×Z'"749ݣz 4AjO.<ٺ%g-8-QSm @*lsQ) :a,[e.#azFGV*SU[[nebm8ryJ.C.X/o{djk%R^VQ[˫fUfע4;XcVp$&'}--NͬZ҂zs)a`M7atta]P@;0dMVܪ¹;tQ+Њ㨶YG 9pFNջll)*qQiJch(| 6+\I}bvDӡ]*ʆ_z,Eljs]FN<e("}mW09&*ooX]5_G[iU\\`WoEY D4C+1餿WTg WVܦ#9X#'>{%p)\"dj; L5DEbAT3CB.% ?7mr^*ۡ}lؼ9f_2Yq罫G>qkǠsȹN#|RĿe9}Oy0j2]#PkU Nw% 0e(F31Wgޘ⥎@VVFC7rUR8t}Mv|)g2նdH*&Ӱ*F ƺ?}ҵjwFXE;sSM+B&O)0M䯃}?o  ㇊*m+;ӵ ءzX>{{k]| x/rYu6rJ:yJ{d!MVAM&Vw^eYU` W=WgPa+&{LQܟAZ\|lܵ9%QKlA͏S5#~G _nlRWdto;"Ы Z6bG >w嫾ΏE[H)9o䓅b ":[髫U Xz˜ͼ):BϦ:@g99%QG@1K)8yme`=Z&Si'V@YC. -UCKXE_ƅZ'y?ފY*А 3YAINO &Zlgd}Gc*lL<ȱ 2m3֜35'`]:1>/gȺK]o[dś]."]Bd,QN^$M^ؘjLbVNϮ`;Ĕ8+bk.tObU9:Xz9E=aλaXgt/}ABO)+w/d|JV] Lu{_;eb"sO{ٶ@ xl cNמuMLCmQ.T0E *1D850 -xEe zgi1SoLo q;rL36O[9A/L"|u\w>ۭpdTwNR|9k] on,x稬X f2q4zB?z9\9ǭsW?nTU7fpj3x $4}31i6el =Og7#OrL˯mCsyX@LK,Y wCe[);hELw9ǔCL҄9bֆӡkXvi,.+/6NxQfd9Y.\IflP_iB!ܹɌ;^kd b L}`+/N5$T1k999F9FTWZV`B+ݝu$7h?ܿVk?:0,Y2ϞSZ&<.[#m3CadZk4ڶRZp$W9ǻ's;9RC/笓?s7O}Mùdq 87( B`9*e&d[&kor*dcZVf2[f%+;8?8>= /&lU[sjY~ӘrE3dɎwu+:6 ^֟sڟ|]kU!m0жYpkh9jJ0u.s_E>:UetQ,cVM9WX;bd-%6Ns1+.(lN)ЈN@}I&CJ&DR'+d֨R*Vqu"s*$\F^6\W|Y{ⱀ aKUC>߰c$e*a Vޫ:Fv`Jg"_E菑dto!w9_u#`5E?^B , c} ŮIl8]dX]:}-ƒ_#gecu mZ+`, It-(؄â ²RU[[&׫+==2)C\Dŧ|"JBCOcCW->/D@d^mc 3B:(f R2,FgFZN^;P^e2ݵ em{nh2fp@?JʟD*gXBbc^s.To+UbHU> XAl2-Bga/{1h=,fh@3OhTEf1oH<XtQbĹ3-C!焹ܗ>wE@#1 _o/blJ_@5t-t[CZMV0) J) p+WđlP.QɺțXƼCZAI$; SK.\gIWMe׭R aTwD4fcJ [ &+ yu&eXTx 9i^oZqa bQIc2/I LI$J,ߥe˨P_73Zmc?~ :)I+#.2ٵ J [}[Ꝏg1䋪_Ws$?BVû1NguɨU.gfs]:1ޜW(|Ҕ+bJ q<Ƃ+BJdk4H/t0+m+n}.ӔCUȖ|;|q20<" :M}ʰvO3ʞW;8Z)Zx,Cc,)G/]H5r#h) `3Cڶ';n}IUˡ*|ԬıY#bC1bŬtA|F8(}:!om82l+$wEVM,+ 8L`+$Ń'C?յB+\z5 &*Iުe0~bZ~EyB2R:eTo4SXV#'STmAe6p }b0Fȡh7E5gA?*Z&S ]`+b9CsXRvc`UQ det@BWTako겘{3k}v?' 2DqF[l֝_ފVpS1|JdP 4GD٤\ 8L󹰕z2ڮY8/ZUp]Iu(X]a̛8UP i f|cӆ UD6|ն,.;cd8C|<뗙x3 J%pgbn\Ī ǒW3}8fU1o]KT|i,`'G/(VV8l\[w+HY`H!GX1 hL#p&7R/Cƒ13@UCMau2)~nK6\;ѫͲAc/(Ưw[;+bؘx䆚CVh& y:1Ί3TEn:-+D1^@X45.k_#9u1y^' ZjzE{6 dXHAfBDɴDFV b;(]քuRX4e216Qڽwf|d ?"eim +WkY7mR 7D8nj8i26?93ȱX1KZ>u̦0\1߀+3MJgBz+ 񳑎2 vCрalb,WP_ix%5ɂ+)/j2 G[)VOχ|d sDiOeSSkLK_)tCv,֛}jWR s[ IDATmT1"Bbgb8EHr$:$^G<,`Z2\ri+rRw !/<,.(4odERqzT: g g.,*,lC j Bĝ!uB sől4H5eGf b+Nd_xФJ7XCOԜt[iaue l*+ 9T#n탶yX5 r<.ǧΊ1ۤ@d'S_ai#Qv? }; CBEyBw&9s.+G_47voA`E{'d2RA$Y0g6dTUVxP 54K ZVh"~Q.xCڅGBK-lX G 2bVG4f^݈'O@V\Z  2Lrm+ep.V Tس:Ƥ l‹F,sp?ІVBŁm8=ˉo>TxDz qwEMâP4jd7dFD*͢IOϧT+<Sai 'lQnhY<> !X3L},]Fͳ^d˨Hfi2ͻsU{UvJ&?O(__O:[mag )GCE5sk Ϟ?6Ά ֌'Vg3V XT r2FUF޴eAaixeJ z:;dB|t. 3߭*zIeEdEצ2+ {Gm_!вB×lyIQ 'ePA@~]Gkw\o4D(+  tVjsȘ*茗t6vfg6{AYզRF" x7؆>Px1j2~|Ѷ&٪՝nԚ6=uLzɨF&@`EG,rWgi2Mks n+X(+dM,|F>FY+^0ųPJ)TPq}a, m2)rV{)6%l3Aeၨ&>% I0}|dM:pi2)4/"\wM=6ٶo1\֡߆ O3҄*baiLT[m s*ü1P_So"YLF"G (  cT]a5FnĶ&'dh:VhSfjzuBOI;(V"cѪyL…聾Z}Pd[qLKLh. ִwޘLF7hTEP؟40 @Z NG3NE0%?^Q닝EARhԶ6x T{'e/ZThF|gNOP:*Fhp!r>zɸAja. _zWĔ\dZMa4! N U2H6_dKATJ;WK=$TӼ1 DHJqmWw&k z[n+$T жR7|y 1owD -+4r􏳧b96fP~G4fIxYA"U&S~>C|T6I{eQHjYQ;T3 "׻krk(kf$1 hC\|vJP#2[)! nAh[Ş7㢌 NB~PܬZ iD<Ğ1@Ǧ.i`MrYF$6L3i8\(E«^s!c 24mYVJ㱌#X[{55`#$ ͆ 9n>zɨFp߂ *K\udq"ݘ3[%"E!c@Fayc &"Lt&!ŽޞPM .\AbW|Gp<, 5% ")jlnUT@ݞ%Q!`,l$G֝U̷H裡$E6wWpMaT$3νdEGJRilN! *+ymMBnQ0?34}0vB5Q4T磧:p |)oI(d4H >"-)$*+KB4o < Qt?`ddQuPG?|:Ul* YfT"+IL92l1,*+ !p*%Szٚ^Qey >Dټ5TH}>aJ_=fyXV Mf=KN PET^qZa\ 7&â<1 _30Ƭt/hfzc kp8w8Ekn+տldc4HlM,Y,*+lN7捑r WXd/|eE <w5THw>z4-]V2w#tlMY *ND/Dx}W6Yf LT9yG8#:uR:PM .hT:+v{+xڊaQ QL`+͡U&*+ 2 =dTU4!Sg\y:1P"zLcV@Up5r-ihU9\Jm* +Df]HиITxifnL .Қi̒biV<8b2TyMU%2Vдz1\rڭɎ{]4T. Go󕦺LU]7LMȥ{QbE1E67& YC bKNB5*\2"kھʔKM\q9Ma`Vz\7O|;.IIVX&)YV(s@,OD/VޕycA eF^QlPjB5W$jpy>|h`E 7<,N8i>mfZT ;=vؤ u7YpwQ)@2زJCd .Go8]<&h'+ɴ0>6zCFg(9뻥!2 B64i `)LF<ʔ*\rikfRoT4I+f?$"’vW;܋rLMZ>~~2ɀ])*\nhpP6pN'0<,)?_$w;TD\1xKqjB|CnQ!{E ;kLYw>W/'mCnwWڗ+Rzł+TB4B{W`+чb"rd fώyW?M*hYW7hgaA+P-eC NWZ|W#7Rˎ╇Ef2KmdW:9d Trk2e\zI(OHk$E7O^}czh 7mpg>: |k*X{0ph_bu&DtPq"+lN,,,f# j<]4Qm'#O/,l?|W4 .8G_5r;u8;|dqd~V*XdE0_mi?团/$[e6/>XCŐ .G3NNnay[&n ò|JkXb7n>ƤBvMTҭA\??2ipt>zɨ>a|jLVpW *z#DĚNUkǭn'GXN5DiR:eTW,?&jpl>z|M wXjK_Y26o5{XTEȊV͊7 ˂(n_! =G?kpd>ʳ&]j&>hnwj+MD!cLUĉp捕%{݀O23T  o^3GL}޲LͻFOV{\1d`1Q#+ڼ@UfU 9Tա'VCźUP_G_Zw2+lxˊtXJcXQotАS>Mwi#U=:P,ҕ0::#BɻvN}eS0!G1TEȊ:5=oPw:1jxL]f9=4*:B#|𷣣ƬÝmý4Cm}>dR#+ Uд g7m:o2p Ր 7)a<^<ߎg9*' 2i)m+E-!bujY#(wtEFz4PGT6V}䠡En“/q(8(b\xon3OT#+lU%捝L` e5(4JjvndEC(|W]xH/Vd17j[eG_裳\推Cƚ"|d[^^v5ZVJ (J{[/-%MCi /b"x\~Ӆ] ꐱY($#\-R}\`b\QNC5>a婡ETT/|(KPΨۑ믿xcy'b*BFVNUJ0"yh2I*WIK*+P$|tfdH敜*Y\m3wۗ~=t\tU&܇!tsiSycP񣱱D"jZ-"_CXO0+U[_煇hCZ"LdEX3E6oT+T3glp46m9[ɓWVMm &TD uq_Xj1P D< {6T:6X5D!xAj|}\'6QUYI=.ZX hL TڵyN<<7T{7 !ٿL}*2I(+mskxQ12d̡*uH%){XQ'.I؛YLydE*\Gw%J_XXKttN jnJO]ӣ6#jkkUYTT `ߖiSmW4 *yX…|tƮ+:D4Gzzz.ii4s{l@"+O;U)uckR&A PAs>zEr6옂تA<|"YQi6JOӷ1PEh2Z /,9U(y~ǘ`؀ƴPD 5cxDz DfGtCE]-SlVDlxlXMQCƾvL-֦%z^xw5_QXz_.7t{YQ) >RPNpa]7Tx4\"%Y` YQ2^y}85^ Y|7>z;wL-dk ԔKU X$[S)1PͰf, ~8f &_A%A`Ep2oj[wնAMw cJapT O~__-qiiOڴDcqgpjH[nFn*4:"6eH:X7TtÞ?3QՈֲOVۦV5}dqv*6 7f?׿vqc5mJ;oLS|\g2lF("6Ʌ[^ۙ_9=e6UY1UbUyc=zo[ Б;뗙x3nӿ*拷 c 2ӃP]m1>LcG5_ڜ][i}} E Y/DgeJycϳ:?Nn~ҩb tCE0kݗ7X:Gމ#KGfrĭyJA&S˙Gn-Ajz_dbEpGVp]`1Jܴ(e{3S&$6T醊XW ZP>_j͗y`]mx^,[=DiGVM>EKnŊvUጬbdt"?/:4D N3@*fuCE1+ A>6Β2~z2,%%o[KQ,/ox4_@KDlut Gd/獩6*[P,D hmbA?`ѡ}7lCP'K:mg(PT|A$5mC -Ym i,iӦ*9YjP27 3I}VPǁ+ȇʤĞ#Ēd^!.|U2IR|0ŊҎH)9ەvޘEu.ѻ>Sln' *Y9|XkA}dDL`MTYQ7JݜMBܳ!| HPe-?ּ 6"e~)I@˰oĺp5APQ1NG*iXSY^VuXm[[aUEc:Øf2͗Z"qe`&`a#D*kڔsޘmVT(#cmA-i]!TK]LV*YO:I63.B͈ a+uL* ufH2 s"^z:Ͷ.hڄS/X BEroV[ȊfCEY7T`Ŭ췺2dD?LdzeEs~]*ն0/nFhq&zb lbECU[X}fsN IDATrFg*OZc',q"?WRTO8ߏeO"6"kOY SX2_)%ZE| CJ4M|u8OC;don\4m¼196<hvYAB5,ta醊dby2HiTgW1L6p ln`2jlݚ/?3zr.,ekN67eE+\:c2PPD^rLVWl*n^D{@Li&2†ׂQlnh; /y9ѭX1NUa. oLlΖ$m|>D_~3 ;=5.5ۑvFyX"2^1+[Hn4}VfwW7 p)4aUm[1&SޣA5_.g|!ctei+a>LUb+N KXRUߗJPN2"2V̊ o[Uٚ}*0O-wJf2|!c;=T}Ɇ Gd7v RlOÎcaz,Qq&+< ٕn9- >Z>dhر"p;",4h4暣Ab]<͗q)VX5$M0U̟sJycߋgާ m#xkjp>|-)lꆊY`ջeF]1+x߇q VZ*&:J8Axy}0Rn"f6]}5m8oLˊtE_ N壗BnEyj\h]p UwK2:m^;XWA}7_͗1h2*5U{wr3;XbzEBQ(_>]hݬ 7+-[V膊xX1+],e%!ιuPnUێ)O(ryG_͗ 5_5dm)TE$a] R6mjYqL.N@aQB5SkrbtCE<ĬaOh`[8eQ@A./zߢV%֠F뿼U2bE!-ߝrlgYaSuޘK >1.ΉVxH&"|SysÂn01+52Kb ۠}:"!+Qqe+e"dfǠ%~^XZz;_3V2pAW5 KT|pdi!ycRӲ/a%L_OSX&#t{X U`Q(꣏ͳN-!cA*<"+$ݛ1dPjX;ǼƄCYQd%g.yXt\nCCCdI`(DXac**A=?453>g X.wjpiiVKKթcQЩ` *2F$7~hפq*wlPʹdŎn|Ol{d9K7#ﱯNAZHn?>V/4eG旿| /F;Zs"&w7nu|#+lycE*W3Î91'X1+7\c )SȘyX"0l2KlLmv۰t8Z&? `Ą|\xgwga:8oL(TKj2;#+hCEU7T##Jk_Q0+,&u .w[͗!k6_/cC7//yGGvD(gYaE&j0Y1+*1uY.h5xF7T$J!2b3Yl*ߟ5hLs}m:B^9 EiS4q+< ef PqJ7T%&d@P17Y`Gj[e|y޽It|LYm?&g; .M"+l@ %F]̏X'V^nTC5;Wzh@CŀnMSӽLyא1 1N6WDVH:oL<">{G.iR:E<,Ph1+}HXg?0$cLs h&S 16YӦd#7A+e'`¹ P^W:MkYB jG]S+7*p<]UŴ Mִ)WmLyMX6E_Gj4X.DnHLԘ+M³>ݏ_op'Rdj~8_f鮪vU0JF`˚7VĤt0T*L(+tCER1+[+]N3 zWTpQ {>Dګy 7i95dAWU1,(fК7D1,!i⢼.T: x;P!W"O䰩TW3,f_KTPiF7'7*EV@&7X6\XdqyX|9r.Ji?NU5zKV̋0@V|ի /qDMi]PT@U` @ W-Y XP}DH.>^"Ys)U R IvrD_z\` y#Sw~t]-*d("#+ RU;:Q/iXPi>Fxn65` P"#+lIycg4"Vu5S%+nHL^]"h^*0V:1>,~p=/&S-V|2?sЯ2MJtܮdnHȽX1+W`"oϮxkaV^BZ&SR7n\"xڐpޘɃ0!U:)+.יnHHLG4E+UXU{Pl;áy&.#mGOAJtdE-ɴU usy :dkpC*w9mB,{4Bl0Gpc '.$?|6W}/YotƬ"#C5y+lV&BD/^MJ쮭 Q"+l輱") !TS׊͝zD,Qq)+,J☕e87 hB!FV 7 c >M!X:}JUTDV>pșܼlb.7ENr| Wh$F@@MkX}ϧo_7_#'_D19j}|(U*fHc ~>'|Y6OC5E+wPan7EESV|}KT$89#G|PA8B Kgg'hg`v2ߵ*Rm(6V t#?]e/-xg5TR|!* Gt/yT"jdW)u\azMs%+[8]"Yac+J]aIwzPPM\)+3-##f|e^ċ)$F@@eg>=? :@r̫hNUl!YIҴ4'N՚&FUY5TZ;ZVD&\x +:D YcYq><<2RP~]ܻDh]-\[pbb -` hXkuj6*jw-*O<7x"C#| Cxcq a='h.Oޚ 8.f-86ߟ,LѠ۷gg_SR kq,z'Bz76͑K+Ec:+lȊCm2mL|D0߱T0Wd wNKbp{4 &#O`**vkhA؜yK 'G4A+@ym1W<ϼf>f7Y`)+q/}'ɶiaU ,|Kwòbv s6T@0pK;U!Y`<,x\޳L#&@h_6CvUW`?Eִ)tX[{rEnⓧho>Zm !в"n!nPTUcgV\gItTl70~"H;m> C6+iSܼy[Jl?m IoYlq=S-z{pD n v;҄b0;٦N@+t\%Z.בAA"q`Ȓm H"X"3ơm]-~Y/ks,aoMrΩT/&"YlVyIie;? >0CLǟ'tW*k U!]`G~wV4O[UeU8A_ *FVXIsUhvZ3I%tWن>+"; df&\q\yX nM;tkmۮU$q26%8ycQ缿@57Nȯ`}5CE`{ ߈5d:Bc6t|TUao,.K+ %:oLxj /[KT7){]6h5CEȒް|];TTV)gQצL|W/UAaX߀x斧~Zfgrj!VT3TJ_'LVQ`+%В yX${*QvOnFqdE˼qo1vAH`< R ~@b@ -c:+@U/!blT 761on=6)unp2QAC5J 1uH {c_&$Wp'ʐe ݐ ܑe7v\3pLt'i6&__Քu5mVFrdC%av6bjik V n8YqT;/-TUlMzc9@YaQ?owG;c +{]jwc0BX*0ːL5&ƔӎumM 7hpB~~?a;.YaQ0`R}$m6~ވLlL|e(P$mJ97n*ڞc跭#,yG]_Y8Q"&4DU*gei{XJIyFק]yXωэ-TywTE R}s52іyݐC9(=6/A Ea\DԞ $q_ q10ߔ7*#6ԟִ#i{dGDȦDC0s8I`7l -+r1viGYMlDp*ڬ 4inx4TrDVH3 0m:Ec^ޤ񟊊$*a+ LY^_N]0Df=n<^Xa!(DPUY@+I㼱+=CKjMOkV ziiRAjwz?J7, ؛YAR|޸A&CdEVaؚsؖOC 1CcH5_{7/S ;.m( tgra_Μq9p$(BVp.'d ivΌ [-C[ŭq+#Hg+C&~ 'iԇ*?޾<z\8p$8"d"6UTU 9"+XƬ1R$3i`Q>b:g^Z|1T8IRz\ IDAT2ˊPƱV)"dt44*U.@ 0k> !2i/mDE)k'9 3T8I,(*Zcb]Ƕ%+wo2pÂޯUIU!ޫ0(klI g"ڮt6,P$]C@viBvAѴ+e3QQ>YVLb=? ǒ{nWAA^ +tb{Q4h:)PGr5VJnSllNYPTpÚ6mѨ ં m`nqP|ᛧyNsMi*Y 鑊4WjI}&0:ֵ+j-+ 4f.ંDVU#ɚv`L[{.yH1]69G {b 2'5uF;" 6pmڷdcQQ~E+b d UW)"+nKr~5R`BG*>:?{YCŚpCtbxI;r\736!s߅*'|g& *Hdyuط8zn71/$;RС_ѓMAE  R +G`RL{dzf ׅ3/0d xs3vcPܛB 9"+,Ya@E//!ߪ+BDZE !ebtSq)b8z@UXarUF2)ÀDVN%+ڦ26a smplh>3~{2 ~܄8UEAf4;x $8è I"+,YDEUP'[VWTlPM> Nާ⳸σ庍 s"H`@UXA*Fu{A^g\a \w!$ei06_7YHeśL'bbB I"+d% wRad>ӛj$T3ˡ l*6~r̿4?D=akh)9N=ѸU S<()"+धG#{V?HB5mC2C$J9p5aq:GdN(1Q (+c-+`X)$lT5E1yzӳ]#ɓ)4Ty5^qQ^w*u()L'+a<\L %#0M=Su6B05_Mpg@;ֵ!;Ad1Ƿ9⩠`^)]F6I`@Vt#+8UcȉrDV8뎗wt}"U$?QL@f^bAjp/2.ʏ`2 9ȚA |8+ܳ?Ɋ7hpZ? OU4TE9"+jG x̛Baˮ1ߤ 7s`DbP$9JjojJG= ^9-*bp16;IdϜbj}YQ5dEVX 1*$EVXX9] K(::03wLN{覲 LQUm {vi̱xљcoS8Ҵx&ED-*6e&rCdLt,Rٝ!h iq2ÊqӰ^ؼs*G(a=I/ɮP$ mn:@j=@&uS`ΣaNV'|Q{0 -NmWԙzet4m,7`743!Iapp<Qv2{jaHUE!܆<"W7\Lx](U{jy;fDh޲beǐY܆$ BJ$!R^3W$ǟMdtUQfl{B sbwƋ%Bcd}1ek0 "+! [(j~ W,\x{@ {@tI+"6bh *h{EJG_bdu'G2=:p?Y}"!⭴ݜ*TS.CS',̫p[# 0:eX,O!T7pQ%CD$DBESi;=qFPM66 mG5^RiC Rm YWB [ 5<1YD[B4!b'wgIO3ZvMft Y6aӯiAhX `hUS]pUAv堇 X;`@Vt}}I%츩imr,‰R\lV%R[X9+A2#ˊbq-ַ ZՎA!Agcv.VzvߛPC5ˋ '"\l(Y1x?<|LqP*sYiJpU1nە+ښ#16+%qZAfw֡){Glt4$5T8M}#5̶yv@ 1KpoUiƚFcΊ;)OSГlyУimr*%+sfȒV#HTE?O%宐I'C}s&`' 6'Q/2ݨe:W> jop;%%й팛I̢"?9)Kp8}LU1kӏFWK@hȊ81-˰m8 HcxsoP"+PIUV4-{4j,|B? T&UpdrmvsaJB5bp ˜x4y6UQW<Ka g֘T@ : ] ̃蓻b_M*q}(K>:9mMףC| ű=@!did@U%"tVApdU\O{ Ȯ_gH!K:LH/)rb"! qx>:E !ͦNUTo5 UN!;K绻B__Z{C6V 񟊊/6Ifh/5T%P!*Xa2 *7/WE7MO!R>iA-yRsI I2T8bVmPUS/*Bތ|C8"tde62;Lq:cJT vkGJipbn><@(&eJz=PpŢ U.t1|=|CV`05}\שBPͤ*JTg/r"fSp1ГO+2-o!0 uz^b)PP:Ɇ (?JH`X_a ?(B 3[NmYo9:Bd.5CV^q C`CmCE! 8AѲ %dRUaˌ ܣ+!RB ;^>l A-ʄb= efF "J"̌=LVLOUP(茽Gm[BaڍP0e'J6Tt'P_'=yVXÂb|xnTE~x=״gYBHyX߇wb&s4pSPr6Tmpg {;IVX (.RUis%y!v"oApdbkmj ΰѢ, ~Na`4bsqUvaUE>ޯ8BLVxm1D]T4T3M 'x!6W a7T6#6E !% :LXԢlCB5SfpEVXTSb8-RP⍶rpk"BȞ0-i227(5%*l3T81c~Q=C+ے<~å gUaBNfe,miD 瀃em/XSi N0,fq9§:\ { wU !% !f)Vo:.H`Z ӫۢ, X!٣"shsm+VAUpz*ep;IO" F7IɊc>P UƎaz:6$T~2TsQMJA}ъl*C7e R,hWxQu !@a*vTexjko\[V]&>VXFUTV5M+`s:j9m}2TCT1Lz U+l 0xUE^BH!K:LQ%+ԓ^|&^%bYP* U滸UTsXs+|Mh*-P1X FlQ 4$#KPbo_UX# !c :LjQG[[ቡbT*| `Ŵ.1t_xW]qr; "oB쌼bv~OEŗJTP#]jPѧ >}yaғP*‰g֢>LU#QV!d}!dʸ? 0kzP?vkab()Conғh-U/Yrl^r&)+pQԴ ]oTJ PӶ-,*ƒ<fdhC*Bac˘ fUڔ4laUP׸3 Hj*4ȊiVB;\RAZ) mԓul\ )_9/6JT^L@`E4r@eś0\/ؙݘ[A)-;2Td|;c4NW%*X \yX;lƀH|OU !S !CV 0PjNy]$Pђs5MAt;ΘH)XQsNYf,w(U 0E ^V(Qfxj*CEk3n{5$yғMx_~e.KO" y|HUB9ll&ש- 肦ҬvZP4F钽]q#* ԅUw2}8SOz hڬW~PF#WB8F?=u+-2ѣeU`Eޠedjì* o!0]02,f\ =P͚R&a?ddàK8V`yXчI|[U&BAÔB-,kC}p*>?Nk,&)+YaB}?ti~R,0jsTVc@[|]U1BSԭ lؔ+TS*3wmH><_$hbx-u34oߍ6\L2s!dx,rX,jQ`7Mu׃2T.ٖ8:J70kF,TI(C@glL0b'QTdBUaB&B'%^T^ P4;N@eIߨ0+Pm&n=QxU!]$"oBBӮ_Dm'M'Ba~TS*pXִ?Xq6qRBjg7b.nB>UQ_YDQ)O0 HB5ͦReD0j 1A QEYH#|i}NW5OËB'//,(,ac9Oa*Q*'ܣa ZJ" !NY:+ @}rh &k!|KpXmFVRQ!BvMѕeܫpt*|eE"* ! fOtI͖c[+*xg&?ڐKkmHD,R@xE?ZޝÎ{iJ2*\8v*1= )1Is׸j vEuRoD>! IDAT8>13he:am*dKU4R|LU*_G1q^ (7r*Α @U_%+Z-ٶ=1cWM+lsQ2.zIiKBBVK텹ôQV(QӕQ:]0bkOȓ474YF6d Hh'XUB !f:V4ncJ2.NE(p~Ru]poRvn= T]b.\"9"٪"Bʎ0{SOz4qe:]Pb+i}>"LТ, &$lX|m 6`G.$5%\UttU)O6V"Fylo.y}a@M +Qf&OǷ\#4lSeZ.q&. br\s'ZJfÈ U$2\< md5˔ *psXv 2]eUvT1TjSjE؋SAZG爐UDfSKU{ݶqQ >\l;MeOc*aL+jQnq*"CULWXQiϽݶbV1i0It n͍`~kq.^DEjTE>BHI7Pw^{ +8ݝE2[iRMƺFT1V65_~*9r؅2H)a|g榪 ɧHUT)dI)V \_[W&3~*ȹ1Dd]%+›_r~m)cm&˴|v޹_Ś}$/T r2+fZ%˝?>٫xAY5bm_;>+/F1V}W=׆h?Jtꃌ vE=\Iy^TE*Bǘ;L+.=N'ɆA5X,26AUNc.H-Xa"\᜵ڙ;gPμ~#ӧ*BȞBal*%ԞYc\gp1xTB+ּ1;ls:etMs>jK.fav_:HTSUE CV`0cTf+F p15V1+* ;ƣI26\}R~QPW}tBayLRF?̜=RLQ7GcE#Xb vA&+9Gj睇Dhhb#P3Q"RoOack R% 1 pG/0Vԧx!aI ۤaZ PYOUq^ϓOۖbU*v jؘ{y'NJ@9\ @qw{t)Za )9O>$<:krvR*W:tNK+HSl&Ŋ@M5\ 7V m.o͊eK*i]"kZsPΈ6 JU#bv MgH{X:vۤ656+sI?|P;U* ǿ5\mBp#CZ.`>#Ha%+S~~ {6(kmHe ̗^`EV`1\ X'+A(Y, Rm'zQwp^~P|{R)Ut]h+HK5Vdf?Ɗ IJVHCOXg \< CKO+ЧĹ翹|D+Njs#JUg!ZAfZc/_ lֆX:t6Xe*$lY6ωl@~Au pn|ĐZP%JUY9fCWa$gHp1+[jMHfDr]PW~ 1~O>P8z\ *,L1tX(Ppe CjKމ~ ܴ6 ,Xn<\TM7'갷.r|B {b*|,TXB Y1 4 +Yp1+n܅xPX"`t,a%p mŧqꕟ޺uhZo/mJUW!0j {}JmEV`9\ (2VYiD ܴ6-\(';;k?ssP_=/^ ~ޒ)U>ha~/Mf+30\^(57V/1SYR@6K6ʧ󦰸< A^fX ,h !,0;l,G^ϐ5uŀƊcVQmRcm2-Wt𛝝/Pq+mt޹" ciGƍ$彩B n/*[A %+<.i& Hx lqئOv34sW,VLB}MP+Uq0ZĐ֊Lp1\"jCb؅.5X` w ?MQtN~T,=4MdRa_1;L9D(e"+3X?(ƊVOELa Oӝ/.WOtko8K pn*Br`ȊN,C%"+ӣeݪXm4V)Y,9M;i_0T?|5Vaâ87ۮ)UR`V*S 6sXu+35 Y*[b{pc}+ↄm# ۄ9Oˣ9sk%CU{C;sS.Y:33Y &p;LY^yq #¹_r@m R^O %*J}O<:}SMdEFloQxbvv3la{%*Y`q` c( a{(6=p{O:ĹyD !AƨLFyɂ]!kSlqYq=jJ7l'}w?)pWl*I !l0e 8,YpsXaƬ0JVH ۄvL}_~@D+iP 8͝˲ۖ! kPѴJ*QىbY2dqe5S\e)YumY4^XCxO(x3cmd8i?i.**p?@ĹYhvEg*.b褽!,g8FG'g!d1S>T!fb ~2VebVQm22kf+ | C^[q87$U:&Oz*DM!0]u)Y`.6qX|aWB=eOTI?Nf,DՏmA{8C4ݲX;QŐ(|S~w hڨdKD,,F0IR G#sGCY΍FJVH ۜY~ҍ gG* sv92ÑFUԊ!!AZɰ0?[UBmwDT_5Q ,*vIf XW* Vss87\[UTŐyZ ɩbH"BԊ`+yȾɁp*͜wڪ x Rɒw@B\A;LE^jXx0W?u+/a'd naa >q0TH¸,RqnگuĻm~TP88/twUB谱6b 5@޾p™[8~E=%%YBg_9TwRSZMD, Q 7U1 !8a*ƒ3@*; C:q jMf lsCf6LU3QQbp:7L"Ch1dYCSW ._?${PU\Z> ⃏.g29/zn nZanb-!lT|PSTW67X gyܜ!u8jŐ*Q_V5M+}G"+𒛯CPXfH&<2- 5UaOye" ߢY P8 !Yewa5~:u7ۊ8usDT]PBjzM&]fU~Jh k۹{8CHB WU1$ a !氱Jk9(rQ YM{ƸΘWyMTTWzvJ ,Gl6W_Ujt2USM8VKŐ*$x!,:LCvM> a3ˮ=f\tkM**H}Lw&JV.t1ۄ૗40EŚ3\+$DX,\E(+ R =m3 /[AB؇'3L PB-K&>F4Ņ1&p LXr vt2<="}U*jH`nt8Ch1dFC2eG6Á.FRm"gHmYq@4sDT40`(Y,;y)ls=\_dU8!G҆@06j wꈑa}.O:JV(Rp_zgB{<k"~ee ,+! >zT0\+ĹWҶqu_idk҆ sزN{ՂMu.Қǖ}`CB_@jEVePFآ٩QMz6JK ۜ W:;;7BlTxg_9U3٣o\mc*P b!mTFR֣4T=Fh/ٮX "+вOܑ? ]%22"y%+@ \X1I_ApMQ{**^iG~qX;Ln\xo nkUA~өbH*xbvvZAˀwsRv܎P1ZhUcM(4VH DͽaVՋ*ͳlrOsUƍ|;? Ő.U BJ> !0 u<Rz bFj5 6VjM~vmB?PW~D.WUW4t[ ^Q іgTgR!acam=px? (Yͺ6OCՋb, 4(}&+A6W|uU i -̶-ƬkS!qi79s ZƊ`l>W\|9DATArX; >6t/;K0|,[UVYU _!0] lOoB(Rzkt+J'2m!:^UT">'ON27c, RU(,4C08KPWi&W u65Ob)ҼSDuk…X㴔HVfo૚k#*ksgȊp⺿S@ᠡ2w)8 !40? YRU2fd\uF"p؀MmiئOmSU+RUǷ}=۫XU4CC&]8 !]/mp* S&+|jJ'];lӣ |DTbB}U/ Oݛ1Bī2O!9Ő[ݾ}e8Ң}!dQO^wn^nMN'oz-1{JV$9 ed'}1T?i2GEh/*x k]ib(ɴtXT`CFN>!ήmwShS)Oߺu|0Iw Uο㸌 aLIf]"RUOͷ;;?*e"+.O$-͊`fl跋!m!r&J-4/W?||š&3LCR_h)X5T90!gUAl @Ɋ`mf[;^< OZ|op1Z#7V87D:7cU L-dC} 38ӤBKǰ1_;߿df񳋯 2.g,~K]SѴ!Gئ|tX;d_|yX&g+2|Ls3nU!]źۥUؾ2l+஘gqݣB8.bGgZ%%I pUdF6:И( kA)>cvے m®b SOPTTr񨊚VH=@s!({bɈ-+1X1E$n"[?l7u/(9tTSBywdX |` fHW+ʡ* b 1׿@sSHYCh1dCznvҽ9D IDATY;JBțTTI dX.Ծyj_[\b%~GIk k"dqI6;?tv7P^Uܓftmy:7sHUbH. ߝ=,g)wasg ^û[W2̷TmUr!y%+EGN;b_ 2S[T.W~YMMsbtŬTh!dc;n}ssiV^fԶn3UTV*$[u`I߈XW8Y /_O~q WUj\V,7q:7:7 jrw/.:ChחIooݺZG EN]aY=E Դ61aw]xz睝/)5EE6'ܓɳˊj:7sssVɮc7t3dk#s/^|㟾)d P bJV(,њ-X^zNWv:rPCw7;;; ƫb0>p͉qnUC1x/bwK{ڧ./ B 86^#BWe0-w(_99XE P}Ѳm#X:WbNӠظ᫝5 zO/e\7EĹc?}t 6W%ͤ#d)Ai\W!McPԣy(Pѣ z:~cdL ܴ'04H/H+srB{c쇏WspB1րi8!Re#*P2CwުJxyTPBjnvkl֪%: 3xSTTUEuʊ\SYUù^U *3u"E{9Ƣc㢝*]aiƼU(y{j@&KuerE|WNU!~<,'fsx gu"= Bto44خPzyM^; uv|"vfxw0i EUeϫ[ MeEu87ssG*ƽ Щ*d v !P,K#GcQ"xQtLkuLNX1k5kA~ܦ Q6pM\\yXOy?.Mb޸5>:UEj*ާggpVcTV`x/>}x5gQz cE^b)]״>]zۂˋƲyL[6vtobP 1uppnWĮ9G>tdkB$BjN [Bt}?n;\ !ƊRi5c]4@]-6W 9bYiDb1VpVN * WS>.vfw(}Twc@&xa9q87#97%PvxʫآG]H ?+2Gז%D"w"4{+>1Vh#(Y,Og+n/eYTTc.榽ss87 ᝛2 j4KWNL&9M״ }vgS jOo>`K7|`Ɣ 1_/**TE LRxӤ* t<\DmyLIœ}6KU2V,'= j |.l3|SU<Ĥ*Za9ܔCUTq_nݦ[/?v%2 (C/-gPe+Y+}Q=+v&2H#P-PD& hR!5 QDUԪ -k27/cQm=%+@ˎ ?ŀUdƊ=<=ubIFu=b )p1-L qnUҨkL+ønc{{r} *C/ 1+SMțڑ/UQfȫ6sW Fo2e"*@U"SeE@qnʣ*Ľww^iY9kP (Yty} v.cA8މD 4mh]U+QB5Jdb@Kn= 14mQJP>.TQd @bjLiOa?y1.`5VSp *1ȅloTͰMeCq+\M*j2`x2c~Ah>)=>YƊ(1'5q\ao .2unL3RxհvT7`D=/Eu% +m̊bVcE^Ɋ|1VU.ש(|87@C{Y ]vm5J!~Shy;Ku+xmVW&ILAsVVj87gssTB G,~x_:Y(Y D.F%}*+>/>~]ҼFEuEXT2\,@Y Kmc)٨(ڟ.,;lP {EMS*FZ>P"6D?^2^-h'JVD؛hbr]|Hc[iZ8x6ԽM_bm2}p17Tf=:FO$h'_*b&ybBBVe}:En"ka D{2'alORc6k(U.Zy,Yo)A5D.V ?uMcE^ fA>XA՞Y8|)ĭMBo^M2\L.UQ}Wm**/*vU?zK V;q%: B)S8z75I{P-7X4Raen)(U BV/I[JQzRc]+ cE Ƅj#kq|>tIӰ͜ dRqA 92N;gb+܈&K& !q|?r 5+rߔPU0Q\JU'.?T?U?RWBl@D(YP/kGOg5ى 3lW淏^e4VU$ dR Տ0uvDu$jD@U!dUPMӲ{DX2kT#G}qN[a 5I ;c6UɪTpwOBShARpJ Dns6\~$,=f!bX^ꞬHa5K ]CV?d7:IO2+%+"JOk ] >fa'Ecm~sLmWDHKe@HYs>E=oAr+&W Yy`oAfVXJvA6oWt[L?coWgymGG*U1-:A+| go)Aua-2$XWm!ckp>XdB,DEyHu_~yOڥOK$YTH> B >*co)A |n:\{R+!+L]s ״i (,Mn .Xa%SmtQ?1S_0Y{K V`2x}e+Y 0Vda ͣy",?q1ʾj tOŏ*bsDVVҀT8.ʛf#5,3 +f%]r߂^ȋ&"dE$Α[cȱs]TX1~x9ң΍a 55{; T0=Keܣ'Wm(8xn 'dHfvdj3|Yf_5].V~j(XBo(U!rAR5VCꗃ#lj- |DGd6zfEcacbD*H櫠*ʎ9+ *PT@c"ZPW[^n7ͤf[Ȓ9?bc¢j9+OH]?a p16Cb \ӌRBfLV @o:_+jn圔dqӤ2w]ƌ0E gSYy* EPB {҃G)z qo)E5[cwbƊ|E:M19LaqR1nEzk|sOmгqCb kT~VX!jlcVUl0}>\ (Kj+Y튆 CX4X˾rc'VL DRJ}*hQfX$-%x ҆ŀIy%+"[Sx 3b|RQQAT}aTE.ٱC^N Qafa>ŀƊ|1Ŋ0v9 Wu;]ȩRskwa@*xs5ȢX5Y[TJUp#MpFӲR `b:<|ޒijMkzcXyV_KV򰔪E {~~t+ %%E48m؇.T7)Y,Dz;㌱rϭ3~)+ B Nx҃ -%Q2pPױƊ¨o3c,f8qƎ`t -*կhpEl\*gc1Xj pŀy%2B~R'g yXJUp̷AX'd:v:Q.FJo+Y!Ji.k(kuX1n>dR<糪!Z_$doxBbF Sy Q*,m_<ߍ#?yXJU'0~BDgEFT_ 9JP/-+$c,ʫs .hdR7XՏiWCrzK)JVGˆV+0=AF5cQc YvR{ LNFo)3L 6dQ'^CXS •vyXJU0,A8T/̘^7ŀ؎]*,ASMS *+V-j(AHRo)Ś{l} =\ ƊNM( E yVv7Xc,L*+Zae ~U{Qdžx :x}< *"!ynj ɄE}L7Y5 UoQՏY!BRN-+zΉB#dfn;49)*Ƃ9BeE@U`|ߧ@zK)e:GLSHe! ?\ XHҞ[eq A|QEa3Gh!+2f!Tb'={x sugqu IDAT|~ܺ6AU$XW1(XvCL7Ȋ}7hp\qhSV~W?-qm1bqᇋ+dxlT gĉyXDU\xJ؉D(Տ~]JVo)%qzwݢ`XT?\f&%+Xfcݙ?v@D!+eE 2$ V~EŮY~tKrl4YqJux7ј?ETKFQkftV>.{>2]eh*vhV?[$Co%[EKO0\ 8u-9 i8TXX1Ӓu SVd| CZUeV? R$+Nsj"ٮ F. %6AƊ<0T_eXJc!*+꼙MqUU\7"@zKQg}HoTHsdbeJ^dqA$!+Up/LjMH`He;N }".f>cQQݦnLof iOB{*|PAHbEځ:f/))!9p12t"I,0Kʠcѧb,oUEdH@*-ʱW?ЈĬ}]SOp=p1`1 @ɊlceXIz3? ̚@V`SrY!~+0C!sy> /6L@3DňDC|Ab@"X4_nG>P n2UoQ4|[JC2 ) H 2 -DD+%+KcElYTp _7uZX5]G[J]Vԍ;H7\btBy;7]̆V2b,[>TEƨN,YqGIUzCS-%H,+'&c\QgQ1 /V'9xEHdXP1 |EnUZV R~&#~wl#6ԉ!ö*>;>Λv :\hq,, Ɍb,Z>T<,<Ϣ Տ!齥9;v*HUH һ>+ŀi}>;0رR1g?TeUg T?&T?-Mi/bٜs'":cv<\ XLD-*DtUq(CO0~CoܘR#a0uU7:u Пtױm@%**,wKU¡* tB{K) Zʛ$ ªY-?b\##+TV|yWhYcQ*ϾRVPרu+QAXcE,q_|TK,VOzч`Ht|X h_W>VMU<, Ǣn5L{qb@2ȗq[gi"4Q8eU)&~踪DQéӐ X+*p1 qnbaPaaXV f)"~UcQՏ, |L|o)A=Wԩ ?(=*ʉ7V䕬ccV쪢\ՏcT<)-%H$+zs{4v42~qU܋2bN8;u"[Dzb,*6]_]\LONZ"_ ;vĭ*'!Տ(kڲ,^⾇gzmoe2 '!0.TR$=TR VE_b, S YٵV]V̪] s@zKŽb1#m=:ri},TEJzJ@E\VeXܾGtCInll d5UU0AJzl0`j,uqʰ`1\ (Q,XRMv7X>b,V;6Ffg穒\T U_1fC_oD&Lتc#iq &ŀw3-c\X=sx?BK.]z-W$(!X__,XU6W& ݌i1i/*fKuR ƽSIp1Bۆ$cqklDyn~ćMQ0Jbssn*o ɍTEE' +v='n&#@'Y|0.cz82CWm",\wA#_?a8iT˛3==m ڪ LyX&"v>5€dQf2\ ͘A\qGH9M4Ƣn—.p!4kufGOO'Z"+RmrT?-%a Ws $"Q1V|IČb,ZҜ nQAd +D`| $cX꿃zuQ){$z<MeDD`4"&]h\B%mow  \{猆 icڣ *m\\"*_ A\4+)}̳@.fc@B*@wR%*w^%#|%ϯ[SaTElyXbTEkQ!y3/ʠ*}uLycSeѿ*8ޙ#4e4GVP"g|JN98c\ iĢP<# +*bkF"m]0rԥXD[VU^9HZ!q_R}9/NŠB(ә^8wNUҲX郷DR@ͬ+<9*be1([G's/qwz;+0pi=yNU-=gBlP[伢B f*]g !&8_$H>=B,_U]Ac&\z3{Uo1s1Cmom=d1\p1bcs)&Jf͊ -)F1qa1W;=?qg@,Ϧڨ(+TZY@D+fӬ=o;^aAB|Ee ]e^-+XXT, n}~%vm[^ VIT07;K?73pD RyZzX#~>]/GI;C)(36kHN~| '7{vz(Q!%HXU>-]qAHAx {^}a{KèŬC[s2xg0D ftQMNԬWU`]QMc;+~ipSU(@-ө uTT>Rl\lIlƢBa.% q$3 ПRKV(5k<pӄ Ht+ yX=LVzPIm1w RA۱4i<L"2 ُSf?u-%2cFIs:yv d,қz"̘P1қ:d. R;S󰲨ȝd?n@DiP}Qfj.v5 p@8ޚK<>sf3;H bdEtEKU`*+2NA}[eIUmTUHaw<33"6CԮCY,qXD@*lҽyXC,R "jQ6>sjrR'R!~hr)lҳ 2UggQ4yfNrXS Ys:D"Vm6xpk+TEl,N@_DvdksHq,L<~{f"K~4<,U#*^cd3Hloij vzz8-JFXO.X[kXV|IpEy~$O2*^b|#芘n;!baP ĖAފ aoԇAب@yXUEڿe?.-R:y!+[9@)kyO2UlE6xiUg^6-%% >b@ /b+aT=~$IR?oݜ{L"[GՐŎMmU]A++ҩ OT|6[J72%>?]\adE\zIV-Im$ꈶKU`۱qd߳W,./TExQQHb]|{;xlьqȊuIVD^Jx>pSvtҨُ~$溎-%jQ~LaUDEU.wܢm=w*uEcBVP d?fm4#Yᙋy ئ@Kk6fBWU6Тl)c[J> eOV\)Ȋ;pVA۱ݐ=*BeH6[V NT+o%ޢAkmH3Dz"~"(_ُ~țɂaxwx r)0*u<>{/^ُ-q/[YNˊ!߰*xcY+tꈶdBTMhXWWF*Bh𼌴?pvmo),k+?v:WT:N KYlEG#*B;= c6+*,]WQ"<U%*Z?}f?pǶBEo,E);{} 5Y,9dE/76A 1X|A &DV9dcV,*zmÊTEf?i1=@E%aS d ,J^4P#m~d$ZJf!*ei6)rhmzwD[KU/I+FZ(Q?3,q,еqdLiKO۲[:#+J6B]͊ KMzyXkۭ*Xُu9 @#+t_=Q1v*dUAӈyGyM{maki9TE@WL 7,ʐ8e,p۶4#Ԃӛ7CT쁪PvlS TT VTXz!M^˵_WtE<6[ʀ4°Ey)TU[vL 5?HK,|z-1H*x6鯼HY᫊o ٷ<x U8%RUe,}̊ _ɤ*|;[yX,6[M<;[k*~Dm $dEbic諼%/ GVgoYjWyُKoc&\Kj쀪xH6>Km!UU̠/eSʥgVAWtYyok[-Xk^cS7Mwqy$%8]DpYx6D_ʧ*w ӎ8Q_w ~n\2"^V(xbطq96aTGs0)@b3+^2qu⋟{\S@\AfrpYS}s1Q!{g N[Qa&`THW|2 `~AXT ?o9pR&D 3厹( b,D6j;IؔTUpO&'yk[3XG^k_f2$Af`/>)mVTXy`cWnUѺݓlǣnTūOsuݻ KR#+ ^!6l7 >²aN~ۼh cD>j:㣲 (EwWWW]e})-C\T@îL7XT6캳?LM?(/Mb!cniʭˮ**#Qg/'_xa|uwǡBRe ;!XN|hs1O^Q N@Y式"1wryUEe`_N~ _s]w)аͫ*7[ʎ-Q6dk`G 4a}P~UJKW'c>MxyыKy_t0#ɉhU;g\|ܾ笨$א_U W? Pz+-BݲLyCSϴguŹσ<גmOUCU|uS&_w]fׅ.VF`{K. / 쁪y 7PXn~׏=V02Q='XtJz >C˧| ɸ>NWkh Yq=h֗gQy}*eAsg7Kjg}gRU1oQ~"ȩ^VkvԲ@-y@x{d3"~G6,!ѹr(h-+pw{F`,=͙uIC|Ǒ bk1DъDyc,))AM6$:,.˭*N57}DUS8{y_ !W'l.6K7Z_ H z#(_²גmYjVxQ@_|WQ8 sloi2v/Ԙxf@7X#5gTFad_38fǠS팺YUxGGUlYV;rl&3^eTY!\ @o\D[L@nr߿/yL)9PK*71udŇhy;*zKyrTn |γ-Ь`sF'ylɐ2J SeKepNɫ*: Uu?*zVUpR\W#h+ Uw%+M>@X] wA 3wϠ"Xtol,G_ʪںW2V0UA* ܂;ZxLt'B%b6K2לRRUUt/ܑNٽ(4Bؘk.Q']v>Dڝؠ6K";]"ޙ MH7Qs{Kq#a,$+5>2ޝ?~s[LRUګJj tk5mgiju;N-Sl:]뿛]kgܹ7@S s2r_w/mfBX#\ ;L tbKROU^g{nX2zKE}AQ@ T ϥdThs14 F#@!(;?i&s[Ya\rY }SwWWO=O†7fcN~q~3%w6 R2NN8 d?(`5++8`RoҶ|nL,,_>MWV^n[v\[ވ6;\pl_%mj*-=Jz|v@UA~C hDzMqKCoiIs$?:cN<NĞힺ-T-C]" Yܡ"6Tʁ%2ͣmU4-ȰyX[>j|]ኸ@E k͡jː.4Bdmt3ʤ!ylc;Xq81mNzzM(,n&kۖ![OpNXmP~``@UaCD*X[Y*Sw%C;n+/yXi¦Obۜnt]oreH/65kYSv)j C(Oa"s϶s719Ω)z3ym̯x-uMo`s5=ePRFXJYme>@"{mq|Flh}=eNJțXTIu͛ygҿ~Sag\h+6Ti7++L`_&`nC`زZ5-);Ѱ9)%^ːdB Ug_C CfJ͈}T9 &^Q余"o^@NVzINf2$;􄚋mey-+WBh)-RTj F`bJzK/1زўϽ@N{mz^PBb>瘔&tCgK3ߦk P=n}Xn졻 VXY-ղIn9F Z͝Mox>"Ő U~P[:lCeZ^] tرgoiۜI]"-ᩮy-W{і!u4pmeJ9l~6]@؄UD|nR^T~cYAaJ-%Ζ(UQb)YpiHEq+5\T[A_~?S5E.sRJ.`QH{-Oy!M:Y-f,a8TJM U8JVyXXpIzm JV4Y0iK#mDRAU\g\(< V^x /vpEF]Ѩ%?2xtߩtpf4{{)v3C u/Z̵xU>V,v#- E¬n'`Ԩ_&Xb $ЎǙuݔ vRh鲲 uwK:ޜ8/7~)0s1뀞 1Ub +5nD .*X^+2zK^him'sp =7e.fS!C +0FSh +Bթv5->Xt7ÇZ ab6TZmmO[ U9ߢzKwklN ːE=Qb?B`D,0*5 ~9`ŀ] zK3zp/ oBw>(.+.1)1Eۘ:XrI& PU~6\Vɡ`YRWk1B*7/ONN˿µ\3l/K<,-&ĩ RZR&5eȯ=s:3BeeOx4 Dq^~6CPSfeEVkb$~x92DBŚ;nmgo+5KDZQ{ +zׯ7-,;loRqg3Ƽ)\ ^_]}g>A=!#\:%TvTI& HUE+<[œ' d߽ﵜb.f?la%O:NLUV6x f0]HR>XTK[eBcl@ly7yX*8=U!& 󰲡foR{>7 U7PWWz=!#\:'µ?~Ck>ݒ"y& BU2aǙ>VVd*[ZaaNXl}rس Q!/%\:'8BK% amU<#تszK 1'!;!<7AUd>֏Hw]CB5h*5B\N+JoâGRFrTnK6=*Y- IDAT!W0CfoTZ(ky7JMiȣ3PY,|n,AYP,CMYCvXR"Kgd 8 `E -UefeN!],CpfUMd."du@OBD]:ևy%-Ųuwi>|UEvU81q5CRV>/nZMs1뀞L3d:K RN9* W*G\Avݺ|nF/T%qq~SŎs@ ~D".%VV(ŠSu]:$90UOXYA"I}d+ߞom.f!灅Y8<) VFmCvp'I=v>kMF?x,Cp&n92u@G6Q!O騥/KeJM'@Qv|nJR-PY7Yl;u†*brF:; %!JMȩwh7I{DR=~9I%*dPBBbH)*=,K\I]KU~IVH,W}{KYz[/R]Bmː<7mԭX4^P]BY()U,b٩'XYA -iI0M~H,*Ҕ{of8Uu@A=,!3ͰrQƹvRrɅp㿥%y{KMd)eqUMb=-2VjB1&fRqPy+aSR>_Jo^t7s j.fУ]Tp&s)eثEt VH7׽/X1*ESNo A6 Tu@D yI,av2VjUo[iƐ$W-ekNꣂh[^WS\̆*"Qj!%ZJM"5sXqȑR95z06'Q ,CNy!/Gs1ȫEVrl# 9?Uo1C~wTy~H>%MXIJ өc\l:А)P?TP t3VjlU,7Ocݒ Woi{>7M 4OS@^Wͱ~u@E!QTU"*+I ,27'P: ,Co^f.6oC=(UQ$[c`jVpIv`ᛸLF}ARd椻I=d0Mmk̯[/PT>H Q&zvBְSJ>H|lscTE۪k^^fߐE{B޹i$&7s1ރwĜB"앚3U\&prT|Â{E>>j Y'vEY$jsw^!Nb)QQ&JU~v)b}R.2r0'V4@ m .t3o \̆*|GPeS 0R /XE@Boi 2u w}'l?%PY7{B] z4's1(PEu+JfRMSU!Lh*0 WJVEʓ|{K}0U-CFpޘ=1 Ŭz7~$%m\y*zz+5YUVPIg4J?U ļzK;93EEKV77U WT ze"1[ R5ѠЀ3>X0Pߪ+S7.{KKƺcҮ?,cs}r HU0? Pdw4XY7URȬ*7FNѶ~7[܌`tstMPE).}RdZ dSZ)+$ߵ6nh{7uw˹& r2')BM e7fGZB#Qa.BV 뽨LNE&U!{%–ӟ.3B};TeNW5 ϸ˫-T,CڡsPX{xYr6VVA)X,ǜD/XV܀PsPD4+Bb^lo)D]pC~qkތ`.¬(u@[-T=pZ[o@U@ȪXk,r-+(\z XE];n>M)&7 Y:50ps"VUp0 y僧B7Fˈ7ckS=\:cπOCшN~0ȃ~t X׹r5'Е  + l9Ng)ks1뀎ݷ5~ZY!mx2yB1QA7~y~-mrR\I}-eYbݳHTL$\N;@ ;# ;RKXU7Wu[RUbpj I5C|Q8 u.I}d<`/+[o}bv=ks1^Q.ڶR*5BU_0#&#*Σ9||I!\he:|j*52UhmW%9aO@oiZj:,nZs{wCb"ygj.fC5e \V  UlP<+ SV-nN!m .'7w#ϵ3Y^WH-֥ b]xe|>+.YrԪ"(***ԦP^xMGQ#?Yۜ9`{Fua U|35gMg_&VU(~kpW _%xxBlk%R|>rȈM.:iKs%Fw(|++SE<S oyo#(XACV\ ƌZ9;Qqx=ȄWM~$ȧZ243 ŷro&NU~k8#!z_R!1k̺!Zg=$""eqNQL133n++2̹RH* mBI{$D+B؇nh>. u=FfYфHyQ;s1C*31cg d7.4b:Xp4ssR`Aq<__tdSU']w&R\Qob {X+5K׫BQ~LAoi{>7˜PBTd%?E!#AUɏlt0!':)@_U٨.* XQw]ʭ0: Q9j.Yh;IO 6E"n Mvs iF,OUh}B Z6g(ŐT9#Y hT7M +s1C71 ,9Vk3CLU1M`\>}\;y>7Uk DEKV3A|֑Ոv0c\VSmtg>o3JM YU~8|88ZWR=~9ϛ\\[{65ʗʊTk7S beRSԶ"TEl+H[*Ԝԇo9mhL\K,PK7]ɨ*֠8[1[7ݟQl:Q]^.1V6'j׎yݧmN+X=4)PTV(N"VTAx:[0]^T8' a͞zK,a>c1/񞉚(A?YqL% Lt@׷1Z1eV5߅T {0=s%}zK`Q?wGBj>ènͤ*L Uh|{Qlܘ]1+_խ*Us:oބ3GGu{ V$tad\lOL|`1Ͷ|hE >Oi Ϯ'YGucLr@7VVth:n(`o )<:N˭o=dys3e&-zs1B%q2飼#NiJ@f|]`u7 'a?zM8 _}oNjC葘˛_zwrLjͺV5V̊ WTJLExv nZw>_w]4m!mjs1cЍmEzUTjP0fqS}Z'n+|O^xՅ`ë66XQI/oiŌq@8`O*2QX'_LCEUS(0E .̞EiPż `;XY+5q'|g`_V@UCd0Z*uU9y>X% &X`+fKxUDfMwk{ʙ**ט+ P@U +u8Je`+O?t xߊ fQCEVzb8[Qk`gfb V> e:Dz,Iv^^c΃Ψn&\t;Z'^rǑKe{PY-R3E+(cZVAbJ׮SX]jE{uw՝Cv~p@7;/CVTjz*+|APfᝀY톐]nBLOzz4bk*FLQWj5EJ_6^UTvx+҄r gGΠ J4ܞ1>BӚ۪ԟH)+hPay mtETj,Xn)<5}]*/" GOku4:h<]Qgxᔂ>"8hB޶bVTøS].פ{;**;`al (0~QM !Zǚ7y$DYAa.f/ ȌY>+NiԭsK=ɪ V]3LY]wnHS,_kSWPCjEhTR%,+hJ)w@72ٟ#FJMed*`|Ӛs jKWVwg3vw`f-QxEGy9$+jlVjޭA Ly:}3c'uoB<1Vs)hH2~D"7;L}M-}Ε$wVUT ^)XhB(]ƞbˡ;FS !obQo@p)n%mоJjy`Y/6Wj5YU ֊KvIc-] [3 QPʊmgLU,h0(J IDAT/H;]]X$jBaHp=sn3i4l`&:HP E Jdq&")0JM;*|慏}7p5!uB.IsOwItU2IR[架Nު (q6ByLz)YKI( UD(v9)+pf#Ϊ6 §P,Ǭ 4^\ĥ('1kbfUD SWI|gUE=~9w?t[JKq$Шnjz`.VOy:y"ɊK0F8.تUr V=i!04c*,7;Բ\L[t$(79dFK8[.[.dhH:}d*p UkU+*$DRZΪ(Xw0)HE(L(Otu@'(BcC}dEVΪʊ>ٔ:YQ&q>m@4u@. Tr" `shv`PyKm.i!pP4<+53 **ʊOgH-(M0޸ȗJjs1s_刎}up tkUE;N{BAk ,|:coja"1$#Uƚ`SKt+*F>qyLdh6K=j̒΂jUY=!=.tXWG]YQVI|WmbI1{I%q"̀SPeBl 9IyuvMU UW^bZȻp&}/aI^_IqR{`UEC_Q.⾀_El]$x?ge1 - c;RPĚ(L] jJM'm&t:)_F?+xt´R.>cjp0!qb۩i瀮~"<)1w4s4Jm{q0@N4}J>TYuU V( +֠OH{;ѩq*"]V)YvЃdX2\ˊ=Ǚ*6 3OB}FFP湮൳91^X77۝ՙۗb*"v)A R0 X?E8Y2H&C/fF \|Q*VJ{8n1T"m17䝇Q_c p)bz9|llX TiPqq>"&'5N.qCufUQ`EՋ!,OLaL_D>#JëH&|RiPwR6Ƣ@&r8J|R3=qتH+dj cc!$ dB&d*PB[1o;#S5ONGHND"Wfǝ*"YSVl0˜H4vz6ЁD""b:9+g *h8pxǤו)(=1S`UE4U..~a \w""fM3E"GyW N?s1k"`]S)Fwr=4ROq"<{s̪h[no֦NoMqCu#瀫H k.QB,rgaY; 3,T!aT֢#5k5}S`UE Up1\uR7ШFu1cC !y#~bW=&Eҍzz2κ4G+WJ?敚}qP./<S#!(MmC EbGV\K6]E# 6ԪeٖxQ:߅W{!〮@6^uf'~W6lg0S1d. cSNW_{e a-3hS.yˋHy<\LPfK۸:uٹfq=@++p&lH?;VUIJ#:X!Ͳӳcd4{3&p*\ *4SdSv*u>y* %PK:8[d&\xSG4;VUR,;u},+K{aB ^?y5g_ tBtD kWgo,`EҮ{NbMWj2j7NU8%>V H1K67hjǒ=O<;XU?f%TgxR3au ^Q =ב*tGYO9y SS`UE<(X<$=r!}k$hR~^?~}8UIB<xeՙEN/n}{ȲT> UVJMy=:fw H `(skjQcig?SOobm+ p8W2ј Tgfנr/_>z5!8`\WW_ǝ*(_VY~p t*0s =%ĎPun3c9ƒn8EFṼ;r]%Mo4S`UE&,:X \C[[g񼙚uKpqs?KfL{"e$nVgF\(q%).R lI'osoUEs V4 qsYc!<3+Hxj VtbCm̅44nգ8gCآl|3L@Si(| >/kh? ecvuW"[Í-*xWjR;7l8n.wXUȧ/V+MTiቊ|~z7y }Tw2jq\wmTŦ'O{tBGQWgnWg&3BSyyJjK8n*cB< T'jP?yf-@\8&E `8j-]4=[h:Ǫ\/X!TVpm ^[1ժ6U4>0Xı ]l(",ΌUl=_-6L4@Gp*8y+yX\s\vzf;]z0Aǟ<ȆaPMITWܓ?|z,a^Ec(Wl$+vP&aUg8nmVU %uLV9 c\y뮹STrcnߗznBػd_&E^fDO:WqbXU=ggBo-huC,.7.iLh_[p;HU@ %wWWXU[1}D (6]w _sR↏f8n*ҀF1$y/f:mgqI^߿F mˋܭ'X$ (QŦl/`_MJ8n\})(ê48~!EEHdϳwO5~WAN⯐|}u]Z̾_ t6_):{R:3kUE*v V🇵kqcY^OWu -P׶su*^y}rו>82 :3 |y`D \ü3 *RQ,;y+xˊ*䰫CTF9gy3}f'!%Ԇ_v>AF7fO>x BWª3بjy@D WjqFeϥNުt@~S'17p"̡2r9g<2yCeDzGgK-E1e`.!A͙ Wg&ŗQuat>UgF.CNSFws3_.{,8r^a)LaTiQy &љTxȢVVP{CEӻqg(2%Quf:4kQn}noe[h}Dq1.* b|Ӳ$͜gvL2,x-Up8=uzqՍ/LUgF1Bccݼ$6g#4?O9;שׁ aq;he\>0( m v6@љ)w]~ⶳQ',s8 sufMZ1_ 6OH)M}%8hYUA64˰e3$ P3((XzљYv+hmJgVBd"`O(PŦ+Lz܎@@L{ 8{GIwRwVU?_f xysC籔 ԣ3nrky۞Q"&r"_T(QEcz5dp?_r-t9Wg:3uGIJ C`yXM]rr; lf6`Sݾ؅12 >ΌWlYj ோe?:A㎁MGv cO`EvY$՝aC^:xtfN.e{0ZHӋA(6]wmh4WⳠ*pGk:>S4uVUR)?R+2e0:k OyHzHbCI1js1~_(V=ҁ(wh#," c軑;V!]UT 8Q$%\K)A^_}aD7:LGS ]q7Ov}>N**y,3SpEĶtΌd( h+Σu$?ANQaU%CЗ/%؄O9=~<1?xkF7:sibӟ52~ĵ~{΋ӹ=ވQWO#7L K|gU(X\>+%\bq=G^9~ON68%7P.ƹ w}ʱ'&.uN몣CAVgF]ŦEQfQaU5Î3%]hvEPcrkN#+NzyIqџ+KdBˡo@av{"s1B OR2̅N&UgFบUlr7YUAͶu%\q:Oy3wâPxpc~I$)^Ǟ}DtqgЯM_:[߀{ p@h?1bڊ.R쓁w@uI3!nhį,7YUA Vh8kMC(;y OlB{$xIl6ǎC{GzMOSv/*pZQ@/Ȓr_Y/XŦ vD ұ2hwVU#g\~ĺ"!JSPˇ@CJ)>y{ 5z=!TzlAG }:!`r'g:_ j@u fdufkbˡ,𿻤o%9_vkoBaa6'Hn)׮@bTZ@>r`Q1RsaWhdcJ$e ªLTS.e>g"dFj?1'\A-hR|ϚaN;ITw{{9pzGps8(5Ekëp?pugP%û>d~|gUEP:͕},+켲Ff#$@̷)']Xd@6\ɭ@D 8ѫ ^UNh 7=Y_6bUl$Lt)|gUE& VBrᷜ<C]ҫ)bs&ՅPRvֹwd Oc VdGę+ONҊ wCE`PIѱc`!㕰dU̍r45wqP.>,OGXVPZ(D*0 ΒhB{f"f]`"Kk &G+mA_{\l' 8k3^ {hHfW8NYJN!ab2 Ǣ^5S_O]ruTɸ#Q@2lPB J[֚#,o||=6y~>yL{϶s"#,1R'C>v*?>R ZurӭS4^ uPɱ"$'gz-yřtaMlEm2d`:*:\ XCbE*ɻW~)pԪi>}~Nb Jɮc7n7/R@h^'lT%BoI禼x,DѼB] n-NJ j*SXXeՌἣ6xVKu-~R DCLPFNHP*d=6U Nl_r*)3@UvFb2*L䜎|SiǮ?GIa5E'=W#_ͬD \+4VԌTE!_LNR!8(Hc"R?XAhN?Ф $= SXu[Ԫ`ϡbSFھе>ʂ"-vN^V0?T Y}O`Γ"3"?'IO.H;fxHc-yz0L̾gEϾbMlg]A+%2ѰYM0pbx]wp3ݤ8Ʌ4cWOo}a 4h xU7@oeqLʴ)#u"Nr 2Apz2l,VH}vYF xj "M` 6?ȪmV$0?bu+WW뼿*ȴ$eI*klE,VCJH)K1d![u "6ZFl?HKxX喙LM͉,y4,UDUDMqräVX ?Ҏ"kRA c c䬺c\0FXr|?qxқ=Vۆ1۠X9yXE{b|0 6 TneܔB|?$D fQVtۭ}e&ۮ-^e-Qsb3-TH*Pcp~VTg cA-.ECi&%!CS[u_^1}aPS"Ȼ)ok 4y'/@/㭉BaBZO~(r[0Ƕ?8g䭺 ,ed+/;+J+3]ic,EL:*pH&` XZa2ifBMY*D%͛mGaN]hqԒhrhbsA s d`8t6,t@!l U?FFiO2 BZM?}gpX6-~/N*4/a״VX9y)X׬8!QYMĔX1(_Ϋ,’ǖ-VqG٥OF:^ɘ71KW@f(:ʞCHR! =ʁ3y TT o5SN dUߑA H[ OT?Hn ,vt2UbSxRL`xJщeƜ@ geF5&i MWEhAL⽬<dzd8ȅMkMվ&69#VA*da!ѕY*PB?b7LeNz!<6n>:t́%_-H J3,L}Ȧ Z SE|WiHRd=ٷ'Lb+081F(|cm:d/K;?c^Yjg -VTXYR9\Pwb3ڦbt[F\!`0$FbFݔ7a6e%}O±꾇ik ՜79WtS1B wt?q~Ru0ٓӋG ŊbEQdM*~:ş#RXU̠q1-(&eNz}@[@]C|TAp*4'_93)W֢ 2jcQ#?G,W@!tyf=#^}kg$h^{ږ* Xq*8+ZHaJgJ>,5֍&䁕GTfZᳯo^4d̔*Q%},ic"p 4ȃuiln÷\t IDAT=,5B pMiJ̶;{\W:SNFS0,bXM+ 2I+Ħus&y3d];h0j43$]CG̳ȒclDcXʪi}EMN)΅dTFVUSd=bxlEoDrvMQdQ5&Ų3D|]Q8'=?Aӊ&6 ؗ׾Ol2$M]Q[U!'Q)[11 F%6`f@?e4-W̋TKU ܍gyd6JT(غ\cg)g lvfY"a+X?vE XU6?bѭŊg״2 cA$VS.<[#<|2=8o񬚳K++` zb38- GeǺ* ߟP3hoIhZ<+֤#.^f$lLb.8<Ȳch dաXʣOn8TxRaMlRq`% phFTHl[{fS `~뾙z=,; sIT= iZ+dG!.xN Ij[m"XQdٱi<kX͖Jӊ+V{է.8{.RsP fb2I`CLyy. Lm"ˎ Xܜd0o.l%)08c^U08GvHx%!iq6fHچXzf3Ei3]Y I* aL Ωoܗ+&߬q[M(kBDZQ/ !V6+"וP5j Eɻ9 JboV'~:yMҶ-WmF_gbMiC8LL|ŊU\ xQ],Q&`XƑ7д8'+{&&6YvmMȼ" /6Ċ&@?\ob\4Q}]hQx7e1A4Xqܛ 1L&H< :h%Xiy)`b,ṼB?,[[]Lfwm[Z4y;5oٿ۾n k_zD3RMg=bԆX!NU/zI G?AXs<UvZ s}/Tuè!^Tf&6 ~VA^^ڳ jY\р'FBﳓThZAU*P`) ,I6庫 8^,(He6TTPىMwAp 0iył! aWz,&"+[6 @SRQzZ&+*ŀ7Ј+LC~O~ȴ&xVۂbKZ^ صCLpEXpZ^MY&o5O&>I)L"f8E2+&XiL  /8XVXG+/&GDoh\=el/8}EmJ8!6k~c /!,/ІXaN(Vt6e@krZuX家\ĝys$1)Xg4:yFbab*X1!д8֍ bD`|;$b8ŵ{}ErG ttE=ܤxVa=IC}vXzlˆgݩt&(شXE͘]r.)%0zQ W<Ҿb %]h"/@E kfM؅e''RƓ.6a|f༛*݅'fJ}EK,iMlz)KdfUБ!VftpTh~\?,kE}"iq ^&}EÄw\<~~&x˭*K{! ;ES2or*9qa".vr4Ȁ!mLs0.EROdz a /]iSm"X D\TfS  gVK5 l~Sb5E你ex~,bOX-/1˻lb{c$X@UudߔUx ֞ o*c1< xżyJT }"UPV!VC02X@Vᑬ{Ø*jZ 57ߔ?l_1#}Et*g[s 4>f\m gX^JӯQN|Qdm`Qqʀhr@*4-Ί ϾB^qCD#Sx2@S5pVAM^ÆX3Ɣ6@Ŋ>PcS6֍6g"XjlʚVd+:7oc;D8Lm?[:J~/2mCF ,/M̋6}Q !ŊyHux":"SzUHqųXHE$v_A|m'f:z q }Liq&/!CmecqX ~aΦ\W0k7>,PI*a5xI v*i@^MlF_J}[GgE [^KKv z_bm NsX]fRŞ2[BնxO @  &}J[h"ry*bx;F R +C0@b7`_W,X!Ǐ<媨p 4Ȍ*ؤ񜣟-6庴|qWhkRѻifMxQVC|(VAQ^ Xh6Bk?ܛR3Y~G$֘,nB-s&B\/{9 XFvIYZToQ-UДڦfzfsM~DMYՇ MW\a0hs b~i 8ԥ®X]TXUyib5kH ^sN˙g 8`ĢYE3}9ib hgmky eFشbR U;AΌeT7 XEmϮZg;Jn)59`p>]pucK^5%UN |= ת.`C+bYEEy) ke_Yl} YJ M+2tY2 kflR)[bNWr q*z݀azxVAW^ ņXWEwd4~%mWF F`݀IґlW׫iq^TfӊwCӀ(ҧ ~0n ?mdl{f>ѫɓP0Kc6Xms#[`Y8jg6 ֹۊIwZ/QM]wh$VAY^ _mUҙMdrmހb>j[_?Ck ·,|.J@*Y1K_yM+RоI\U6:SZCs)ͅN |#QGH Bn6XYK"Ѵ"R +X #_:O>u^.zfeݯt׍1R 12o)ú;?g\~n`H=C/PF .x`}?WMYӊ  VYޚE+,+Zw>=;sD"e*VA_^ C҅9{ۼͥ^0 eԩ"AGe. ,-I`4-N pio#k>8<Т<Ѥ?jbif 7˥9q2JF1ַ((#\ V\K5:]J~XgQ`٣u@S¾"P 6( )K{kLXu[E*^>8q ϯ[7Z_TW:д" ԁ%ݔ=6oC7Y3RGK 01N6XXnPVukO>=%Va=;둜WzVF^ja6ʐi$-Nq _G|j^OUS("1x`%GTz&eT{Q:xkKK}7˷xŒ 3mcy)Vc:`乍jϝ8aKрSM41v/4sM.6Xs0P3)[]m#sx{Km{_| V/ѳNsdFъ !}$N"'q%Ox G\iE4֍ >k$jy~OE}Ӭ5m l/s5yEg7>{^Sd೰ ,/e!ej IDAT֚jXވfmeX'NvNÒȿ Ȋl,~lRM*hZ\hp+l7&VN'idf| նLB#lnXN1L VE.rC)C~BE`x Kabmwvh@ǤrI0Xt 8φz*# 1U >&mه1MN<} vBq-QdE0%B>gs4M%"a㿉a׾U#YϿ_$Za=mbR1{-k/N̢ :s6VL^ #j+0跉F4iqyt_\ q [ BQ5&`-Q~hZQ3 ۮ-we*T|΢c{D"n9W5'Ha;YkFVL^ Cѐ>ԅ[dF4.$Qr$\iE Vg.#WeЂ8 %xZ {{D+Px6-=⌬0nF >0W~K@cN%Y  5kEj0hZ 70Hp/W!8 Ƃ"~o%!.T(hZҐ䑍3m;~fhxl qw}QN3b;;P^ XVPb]#H,%\X7l(, M+Jusx}ĮM Va-?[tIzSJm9(;y)`bK6*I YHHG D1qpFa06-rwTJDjClZQp'0jGo4SD)@锧 lEhb9rN*\V=xC8OaM "U\r+~jm@5r5Ә'uwvF{N߱__KϩNC[oSޞ TˣyXCyi6Ī0qmP\yI2Ac+4`FHKC33w Ot O.j݇֓@&2 *m{`~hZ OLyݎ g<:ўo-}gw"s6Ձ~r6ĉ59pqBQZouk ?\LjAgn?R{_E% ] |56X-s=/zгYH`xbƣj`I# jF[ȃ .m ?xĊPX $hE: u71o-`b,>D#O0y_E$0X`u8?=ң"ixbyw<}9w Tv[G>ŘWZI;k`H*ԁ]m˕܃Bg4l}DPi" HW\q3M+lL Y ,[_%|P'婶 O'D,dE (.($+rW$C ZQ&,u`'/tq?L7c.C}RkuU0Z9YPjvppxb!0<Tv:k#8d'axl_',CM:|Ҋ29vVf#cRNQdkPۊIPtM+lkY@`5dSmSpz`xjx"v*6_@9+҈:;vhcV)],yvK{]LW$gSeHG?+ ljN:-פ";TE䑍vxtJ?΅|v۞}E|:iT,9 KV:նMv&szciChl3Pw[:iBY؄ +Q*}lW5Dl@xa`xqx"IX†g_Jqc=߲6sRB؞|$yi&VX.@r~7H\ V0>8 @W''s O$؍͝g?k60He_A|K'L3/$I%/mV*AZhFe'r\+ZWtM+W)rl%3P 3Vt@ŲH:[LsWQm -.&EZui&M,hԐ!v8En$tLMqrG sRLbpxbDt"s@f.l/X|#;(*%iEqR f&9)^aD)(Pdi<#LE1a[ n42}PxQ"qϡ_b{U;l뷠eX*yV =b+/H~gC( r@zQdu5;QK5(iHaK3|eygHPzZu(jD VV"!!Ϡn^"Q((^v ºEY`XE4I+G†'x >ms4&<^QT|g=gjV\T<ԡHgvJq5"gTyLH*kY4 KX `Z78<16'? JO+¬K6GTz+ 2>l~&C܇~m:W(]I`=sƈזWx hE(t饞;!R S#%H/3؄ U OBU0:?;<~v`x:9-D+R3!-&*䥎OE&؆X܇[~}d^`bSK:Bn ʆpsbZ2z動\1hx Of1k])`4ҩvSߝ';V`dXE}1V^_Qvi·پ\QĿF4u"y_EArҊuc2So-R5x ﷮iE'YL'ⰛM[bgGYbC 5HU1R&ZѰ lT0E8uIܹixiEj)V#/ tS`uoxJܓ=$&.?i-s>lb~Xp{]2ӧZ73M* HF5Q[Zwѧ}7h_QVذcmXEJ? 40B)u}/b3hf^lHAE^ <4准}>zS5([w5eL?KI'e'7rg_KjV@+rUB"-&*"~aӊkbg9B߸Kkpg}`K燅5imZwIE~<9pFftն+UUõDW8fזC֧7UIK Wެ1r8xkYe␊eU0iڇTEPR~ӊvppxb!0I׈ 2 OiK?+@uMniZŘj[?N^oM7>:MLOr.|N,φP@zSŀt{y]'&جB<O-h0;WmZ<;qƅ)=|:0e"x_EAـam(4%3 iEf 0 OpiiGxqX4V¥g_QG=5 uc2>&Pp'4 =O>xYO߿ hHmݶ^gL*z8 }AЊMh.["OiEF W OlYb鯼S8tRjKӥ ^QܾB 6{c | ")*V%nX~u}gϼ(u |;pjfɝxS~{"7 ]r=q o}M+r>:04#'oD>pǼ4F?Ԃ0ϾXF"{Hz/UH+Ϙ`[w;}Z?P0udU}e5KU5jn+Gmo9^,8n O^"'oXp#Q[jh>Ha-D+2s)iL+ q?Gy;XkOe 'T_|^ǤbDhR%]EV `Ei:H*66Viv1! >/8FV0<( My 4l Ͼ"?h&4P;͑= +5 0z+`s[,3q,* j XxڤqM+˴V-XD,1!6z }ikZ@;,/%q-$Q?b*1oݝv̽`' UKA+:yaRǰOӊ0'Pc o' 4c3}ų+4p1@pi!CKo+MebiGZq2te8T'9#Fº*hTUD*vl]mZ <$;[ 8e4t0amiN*b_1hRdzpQn]\ip߹ Nbm}K/L5_ ;+ G+_5K`nѐl{Âw #Z6 :Z~ N*!Wztx88W=\,-Z-]Q|ztGI ^NizyTt^-UTH=U77P1 }CF°uOՈE*p8E+4Ȁ޴f}ʘqKK7+Bu)Td|--vlrViZlBBU )!: =*ti\\6DNY*W֦ Vg$`r7ls&pj;kf(VDas'PXgp}ЊǚV Y؆cDi'y)R;˦9 eQ7Y|fmvq3ϓT HEV C`Ev^2$ZmV.VH> -k//[ִ!2d_+g Z~VARI^,C5쩊aP3HD r)g*d&=%ҕUxLd$Ue t'+F<]{_@2U9cL ~IJ&][SV(p3ZNҦX_b|I[C<|b'yL*ޑT FՂ{%PR1]CŒb7[ϢNk`IN]B:AY#v~ V`8mAVARG^z\l޾ql}}Մaǐ=Mk$G>ufytB% sU23uU0 d<~ !mIYZuM+B-}` }qUWdZblR [ciyoQt&; ?>Ǥį- H"`vI}=s!EBF$!woYG~QB0 ~_nN M+|~Vk'yivͻt-® ^Q̙Btu֍&1>x` IsVǔhK=+5&ЊUfŀ]Y98)4X+.` )<_2]2_W$qLYZq *+)"51]GZ0eNɁ}|MjДLn_1hEW 4CX?^ڹq_ӛ8~7:D,P B,LtE6H vFX Ȅ"z֖р(Q<7x,EvM+|hE 6^/±c(Ҡn'_^,NK,ӕ&@U혧V7)R# yl O5RGH9cwY+,Z1SӴ\( F+.J/uESw^3X&^l2!Hv@\ RQx ,(g_əܢܹ v}>e^}|M FYWzFŊ}4mQÌE&[B(~XU,<i!52@M+X@Z IDATGVh[ZVAVLL RN :Rh3m1XؤbD1R\@m"  q`FQ3σ<8m)g_JӷhP09*8+^.P :<)sYGۉ"ML,aʺ/H?L@~X* 7WvKOC dfŁ~&X Xb_iHVAjҖԅ~ G^^wxG=/bbZwXL*žr1z1Vj.h? =3 `ɰLc=߁E+چ8VQ}ӊ;~7y1'N"z7rc9| c J۴=e+-VQFJ*5&_z}iv!^B 1Ba1v^ҞW'$ѐ ^l`b1۾)AQRt֭ V`Gv@ڒa\| >TM{V[(U Oyixn:8.ޔF@iM 9qEnz>(7˃]k~-D+J?*阷MpB t5R̞ +T e{*+9dke[PK"XO GoG?g_Ҵ!URbq2j=8}p0}Vc/T Hg:EM;M|7Q4"b`\])˽\x٥3{yE: KO+XE"Ϸ]:)d/qjX +䇅5E" TĄaʖB&/ HWVTa/H%'h"k4~B˄s/ҩF+}EhE瓒YRp.d?ov2 5mx_Gq(4`xlwHᥥ3\+i}Eh*󝔂UPay)7yfZoGN@2~Xq& VRלсX;,6{N@d M+Ұ Ks;Y7}X"Nf*fҧ}(mmE@[>Zӗ;rž,邝<'g_+,Z16YfZUGB|5;=} eZ7RM |chQfMg\a~}L}EiE:VA@W^:K2Wob1B6v HWV\762qZ8W0HC4SD5:>1W _BiYEI|N zV$eUڴXEF L*BK)'+mlݒҊԬB DφgQy* teyY4(*GJH+;M#ŴYEaZU^qѳ'ȑXiEב`[ P>?8 }bT]^)3hřZIiEVQXU^Gr3>4L=.V&Tb&$"XzeI_LR))* R/=-lRgS bH@oM+PvM8K}g9LF`&ĸb@݅;q&\^!3iL~?h_(/Bz ue$ >H+>ˠTD45^a6N%**xK)䤐)F@dT)iBм,届:L!1>LxXɲҊ>w*Gyi0=vTߚb\;Zbݺ{ҍ;g>Ղ; pjpze !3g5cbԑhYYEQGyi@|} ҥT̃} Ѫʀ@XԷ~D+CY-VdgiGyi@t[cOmOoG U۸bH5]-+@ʂ G @RaˏB>yZ2M^:oRX+LգwNzg^[U4׫:<{}xE+B =$ Q ]RZQco<7͇KESdu\vʤŽ>"^b_qhENVQVT G^~W?$n@O}:2lb9%PZxTFhJC@U?%}E@Jl G3"/(t'/M D䤐J!? ]N?,(`'yXJЃߴ$#A[*T FhŔNYE!Zх0yiB y./ܺ;}p0}V`XȪ]6 gVHe\1܏ȕeA* =T@⼈x> _]d"?H 7yi| zBيٓGeՈ2adžJ,'"d[)A. R Ֆx> XE#/ DO ӕ3i7)dN@zW1? iuc#UWiZqsn];P+ƈrlSB֔dPV-ó¢gjeYE~?Ҩ #,=TA8odӃ2BߒV ((@hr4i Ж"W3}E+f@+v䥃I?sEz 6!>&m@T~XscR{pּߙ ~XAM ϾxEV}rܓb!AUV!y)U+'QU9=B Ooe0* ?V`) i!>dЖm.0n:}N)y"w'2@^k.9f3 QrƷ EC;'q`4& 48 REx+)BϨ~VfAUUqѓF^M[zO,P@caAepުi~HL+:x~zJ-j/w,Z`}$AU@ -zSX|2T==׼+4AUy: y5Q.P BdHk3|й7׋|m6-x6y.{YNҐ+obq j}rv`pO^c9|(J%'Fmv:AŊr )~d%,*i~8R*\~\+.!plPbc)CG^j2uYE"ءwAU؟f0L&Ooҥêp +^'Rn ~䠒|~X9AڲJlXǙrŠ @VdzC<䥝43zN x. yB$HVTk B3zsPQJ1pehE^El˜uhb0c}y.(2"d) 0HJ&ygKKJ:gQ Q]3GƱ;2 i҅syFj4''Kzi~Uh +iK1E2SVl^yaAUR豗;OR\MtZX6g 7 ]rbذnH/xz 3RH=.jɮI`#^0x^APxaZIbtĉCӶ+ƿwQlCS:OoY1-LPMB`d@3  _R{, jsUT. GX>%㝹11 Sw\@= ={VrZH O}/gd4N3*Ko8=" R BN0ϾL X2Րd4t?C"ty*o+: =2ҊMQ^z?GL*.B6#l  Ho>wx_ |;< h{Вww G9fDG?nǬs zAW!"m,/6%R~@Db0]|{z"aNc3 BbJM^B" ^ YY[y'}7?ԚJ zQ\ /Vǿ !ba*( }!ˠ滐l :W-wx&ZċGٴ̱bEfR!F#$% / "^x^2:)g,! k^+a}1 +ަyiLm!ނTdBtA0ōc}~x:H+FDmR-_FJC?ߑ9' >9wpZe )iH^Z#:ӛb h RY"J!BQP H(Q@Ҋ&̈@U4E*'u* = y"L`Ҍғsq3$=' rIa &|| 4z4'_JKChK5#3(HK ! ڸs2 aN8MmwP) 'u֍ ReR`x;'$ l6V.' [\"Tʅ@ \V&=G3||C#J덙%[[4X, =@bB.BX ?@* HV$ل*:/֩8 `'Z-+Ծe6\`*2 rR;=@aD* Ѻ Abw\ZT Hi',fheH7ok\nͿ`@4t m0/T#XE{.o$@!D* fAؾpM!{6E*r<cRq*Zց6 =6D̦REUd7KVDH]ӊF*z"*Ki#foy24),YE+D?%S[b Ap~5wD*d HgY#QU37t`)c0NCVDSV^w4C DHc2B.E, 7mRu~a!Rѕ`+ZC8;Z(+Y`*ӊR;&$wA0S1x21A@Swo\n,DX`bCۭ Ƭ"Bo4[ /"R&  0Wƛ+eh^wARM}h}hE*]ahm`*ҊbҌy6( h Ru*yonLaZqOI֝A"LB4t?lT1VPkK{V1k巖9x{I]TXax 3NvsM%Ei~0x3ҼXHp`iz{z+滳_;ET`RqqV|?,!܀iER4h^ % ݏeZ6R kim*QeKuoMTIh(yx);Hi[+G7ddZ\;I0!u\c!UT]ATYoo?|_R* ⒊C+:)dG2G4 H釕|oT LOxMZE|Wm"""44Rm.^d/^G*|b0-p҅/W\9ŝ1q:I|PikO3cU8ez0ٔI2?~,bѺ R4.iBgY,RSzwE1-WD/VNY^T<}7OK r.H*\ZqB1.En~3"]keX(* Ju֖ n>:BhXhɴ\xtС_:SG D{K!Cb% ֋@\2 Arˆ 1T>fT8cz䥹z@*~Gf?DX$h+܈.x6AX#^3F郃黷Q`.3̚" H+/͗gBϺCѭLBt;R~ J.{y>ܣ'gٓGy_ =pMC\C- YEd?&~R١CQ ̉*WN|*m ,0zoz+y pYE yinRa^rIEm(VP pdhE6+T**̶XXGWp_r4r +/[Wypg?qhqfT|G*:t\.[bқۄ9hO<2ы'8@#Z[*"$yi[?bӏKA`J,H/na3Y8 d~ OT\;i5L+VNC Ovsrה-hI XE2H洉Ee趠XA4)o!BF+DH4MPаMD"ι{zEg"{_*?U8 "zҜ9L*~gݍCOL]va!2ʡ#Y/ܗ jYG6QVӑB Z[*`y)IRCf1GtA33xM E(PRq" @P:wn1x_Mb  = ( 2e,a͟ʼlB44z_e6T$*ӘV S4l` 4=EHO?~gú* ت⣣2G4t~{&-cBŖxބ'/[~K&,P @Xxc8Ҋ6@BPUX;HHEZ^V%p"vuy{;[@*}C*X< =UARlߎi>E$"8U@i~ }@[(X XElٖ-"lP M'LdPcsƹ`Nq.cه73Z[*dqK-gE*% F+S @',Dbad+D}h(YcIu낥I ʏ9bKYE,d.WnS"֌+1I~Ek  }@WkKE"|>uh5Y-D*, `]B(PØɭK { 黷ܝfhiD;@ŖZSe/f" P ঐ59< E*]c!슘ޯ*- = ֖aY̯ÛjcY=[T D@.ɰhuHzp;ƭJTTELC#V$CaO,ؒC`V1(Oz@zi"w  H, }F̀AWW>4ܬB0~N1{Іi~خhW~ +/DfGMa,jI@T`)dcSDHѐ[nfNq7:{*^GT`mHvЬ"؆ڌNM1B*P.)O]; }]1? }&V TصxBr1 ݏΈ/ITz5@lVQ-V8iO/M"/,`tA ҽdR`嫞nA!3 +_l!8pz}sE*P.bg Hwm j:IC+>ǤBUZ[*Dg6xo'=74T0D,]_DWȒ {Ι",>RB4l*/2-/g(6g9RpSF):x7tAUQҁ}5<&/ E"iUO AZ!8Ѝ= >Y'tC z% % ߳|2 KK Qx }Җ -'$`{^M%/]EyH@JApRK!5 ߢg51-V;ie  Xǯ ~FV.R%=ruA ׯb0f̵6 ,-/NCwѹ 5!-cK Y睵Hŀ+a|% !g+gyœE=,=+/NCTj6"' Ym$IRT\mjAO!-X@c}Y7&hXQs,DNCGmG^`_MH[*iUaiXyE*>z@ yB HlV#L+AMeΈXZZ{8;ϳ0@F9>ZoPfVvF,GfzAiNCdMa `^s7Dq@HĴ2lde1Ojx{Hϗꮯ]STT^?d[U|>۴,oA 0";TH*: B(,PBLqB 7(@Y&NC,Ԕ6CnK %WօƚM.cQqaDEb Bm1 n=bʊvA)&: }y<O}N 7ܓU1޹xz^Zp'>ݴ]LRecE1? | Z!e{K%.n>$VڄKBTH0BwA0Btgm­M k1 NCGd%}{2 psnҪx"DT$X]tk*,^- =̭aMȣ{#U4t9 ɃK4_( pBg'(WD-4wù;ـQyk2$,,Y=r n 4Ȫ*!JJQƨ _M`Q?I[.ǚBh^qAB@#gِ0 ҏHU9ۈqϊ7]R u.+R"@t 1` I ݯqȊkד!_p 4GBUz;&ˎKgtHQA%|B; e !g!]S"*te[ ȉ#FlvYv{iSbEK6tAL̲βsgw5XFX*=hiw, |+ FSl y4QA3$)V@KXsq"bRc~x1B4tMWidMU^nmmb/]Ǣ{bE bAX +$NUKC@Hܸ&Ies[I#`/ g?$-O`UQ^ H!+yOGDT01kV4'&$݇ c:*Z׍O߉DTHn .ң+WFCBq|>e,4k.ե*-Tr |O(DX]w 6Qh9ϝuY9\I g&NA]Й5"TՂ$ɡѮy-LVfEURTiiUlWMXm`&BVn]a!{( }_{v=Hy"{L!N5@C~/$xY|:,'4Df7!bJivoi,oiԚ񘘪}W% b+GoV_g `qb}1B@t+Oޯאٴcrr*lnl̶? 5PZa8KKi)+sYaűbU<4fL HJU0Y ₚ2$bt~g9(FUn ԧ2{9Dǽ#.Q㳗=ͥ uvOmә-ܿIM!4tƵUEC)NYaU0QdžIHU#"iE.T?t}Į~Z<OC<ɐ쀷4\UU"* %*SE&{]?=!]wn LREU qcӫ1]-b1 Eu}i\n dyKM\i\L,yYCQwEkKTPa =]Jcn;!;!:![. 8t@6д~[MN fggxEat"ƺKC#EYSYMz(mO|21S:#fNm|\ոD>jFG 󇈊Q}6S;^еBNā 4 r\xW/˝+Ek٭{V K6i|j)XnbICy wjV s =. Z^R~݉῟- 7:j͏G*VUoHUT<.XZ;!wBy IDATD]F}h-X'VÞ~;VˏJ5"DOiT\_RwsbXoidԚ^8UE脪h$*瀵\tiwNȃHWx"y ҽmjn+𨯒eڭ/^wPj ;V{Ws,b}q70>U{<%؁%;Ѧ8wrzh?ƒ5與d7??S ^0*4Z,1[WǝWtBp c& 0Ky7[/R7⺵_M%ܹINianNknq> xKC_dF7·MU}E25u  =tA;U34Fb9<*b" ٧~;{QF;ЕiS@NjՕd^tǶEg X ~ى0 =Fc.*ϭ40w]adgj~`bRw_~F) 2vBH :IӎTzn SLէ2;> w7೓ГJؿ g&U!FT ~ruB>[xBƘ 2HU$*!+S;/0@Dh}]w58@GZ]+ 4TOD2·9#POtĠ*5 "*x ?-V,D_(i iQQ[ } Z}b\/uEǤ_(]FS 6*f۴豷7 1!Qb[ {NH`.5-@HUDW԰(Ԏ]~W?^UpצiDȊ?kǯ*Ʒ>rU!`+NȀ_'g)n pWaNYAKHV]ڤ^'K zK@|z١*W2 V' ^7ngE.TJN:oU-@8:H2ceRsZl?ځ7m* : ]QqHqA@*ok9 $ZU!JTB vBpN: vU!E*+H$SyG&G7lSU}:<qá*dUYa(kVQq;^  Zڝ#NܵWӚV4^pvU}%XTE^tB,3b[T)W@ą5[S}`,R{ۑWГp]]OpyuGRQZ(QH8 "I' +NY|]T(T.*L6 zFzxk96XpǦeqDۈSUo)?x]ګrzqaET⢀5HTnAMI'7?!BﬠIUfl v,"=6SQwc (S~(-w`DL"'z@H;ٻG*D쾊DTl/:!:Voj4Ao" .5m*(exUU,KL@ P1nGjqen;$ 5DE;%qmJ)Ns'dks )\8%FtAU/TU,* 8s/h]99S ir9[oin>{&xc|ߣPBv_2d%IWwBſU]+uUP"3fYHUZ \,wzbuÑ?v@u8 Π1UAEE\ܬ!;?hP&*r#qyNmtt5wdxDq緍@RXuDSY1XTĴ@Z(T>p#d(UqBuEFS[s v=i.wT&[gsxE*{Jo-I4$֬ -*x;z vG( 1PHR"68qQRM72)~UUay1XZHxOC[>PU"rYRQ/* >YR4mYa"`OW 9:NCOdJNVD=p "!HU}&6[̒kC) 1:zj_1PhƳjIiqx)5:*}5)?2l!k*B}P2*—+3tO)"L#-eFLC(dME"(:t[>n-f %)*:F)8VaJhT K' =QQQvF ڗ:V?D 1dngNnd]#"NBnv`)GabKHT$ T֣˺ NZ?«0(-I ÚUsfꂘ֬*JW¨ "t!ijIi.e瓇 Q8i涻{ 0' Q6 q+ϸ>AqPsA$*Jy:)OE8|^p$ %UEnCV5EУO@(X֣/-HW*5"!T] z,d4wAkVT3&V_Cyͳ/듫o[ 㗆nmD/+2Wv_!Q!HlJNR~Hz[SRUX W?їєZk~v?3*1foM@4b*R+*@VXIgu͊RпB/u}fqbnR6i쾊 Y4V\!PU}EEER_$YFV a5x8U/RXϾUz ( =Ţ0&4xK#LU=,*,T1uA<ꩊ:Aw|PMU|>0C֘Mj (-B@~rYEz"HU\%⽴{%e]5+ʩ2I wWg6^ioъ=mbATWHTdJ 깥8  cUY=G=0/kYQ 4tz';-F 6} jV Q1"Ya#E]5+XA.BNm_@1ŀ<Л. ]WZF;Z#vWU}%84^ .ļ-**c8.د >0@b-v 5eIG4-_!*֛*ĉ<"9bifiPKUNX:4T!h#JH,zX]ᖆD%TcJKo⢨59DϪDi&)dULU`C*ŁgdFs24&_lYUtEFNU!l P h!@B|@}* = B%iMfM+L:o+Q?TEv\ň 7vo͊bBC|UU / +TVx o2 {zل-uEGU}EEI~Qь'rcT\@*4<^/☨c]} aMCoƕeE']_*D vA׬lh]J=xd~{+ha@04lǒW}YīohB+TuABԆE.xQLU: HULSPszs 0*D,*vnk산8'RiͪՌmWtf}3>swn`@<4浹vw*>T/E-QQS"GӀz]آ7j ,E[ c\\D]Ad~(B- yE&2xKT(A&U!p*>]Q VLU-XE9$ǓfFG*T7}a srzI$+ q zwM+}D juA׬`UA90*pbCkȑ?elOX!iM߃`oiOҿSyִb; *RST4ﬔ7tA2:$.{21pm|߈:ibd ?oi oW"E,%NvT邰YQMU`Hf9e.fl? UM+>XoaYH*$+OU}ĢB*sfA5 W;p]*.Vdi#:EVzgdӋC1Mf'Qa(qD##J@2_y*äDuMя| +dWބa-izSaOU;D^eEEe }LX=Uqx&j"fUUF𦱺\ D"|zYןǚ(>B+,*:ɻ ꩊó #;g3Q+> oAƪȻE 7dTe>A nj  xanB[PU`QDBbA(r r NC}AJ-֝w@SR@ ݯ^{`NCon -B?? Er kT&{ @PxwDpxYS?h_xK4PH"Cӄ],\$UU >DQV+s: =OjmIjg-zܹT ؇|]@~MQRUX@|YW;s:Pma2Qt]o4tyDHJDEUV\YaG.H xconיVs'B4 [ʪAm5 GWU!v+]a"U$RYUaa5}0"5MJ&rSTT|(hk (81 A3*LA ,\#i@҄Z _vQH!FЉ)NeFMUE aɌDГ>"lZ-OrD.D? R(/x"/#U:OuAVȋm+u#vЬG-e+xY\lyJ^Q 3V.H w/>n :1Txaa8<:t'#L67wbS{Km"%$"g m؇<2(..Hȅkں3r؇%z4\t(+J*_*]D,Bu%բd; I2wƈe]m;~ ZTB%}IH9P>]K ? e VkEӠ馢EĚH"S-WB}*9@>,2lhi.iB7t1&*"˃(R/{4Hx䆪+ y; Vf3PhSRUM-EAG?Ljc9/%$ ޷mꋶBE? 5=|\A 5@ ޠihB#oi%_ 5QeXF9Dr o=n珢,VPv9r+ Ò! ~YQA6f.-Qb(* gƢ +BZ6b!EaVUA fBOh8'i nBwvajH##$BPuָ4M684d(raD7b(!77 3+y|i\a8 *hBpUZ4}X& hStºV/+B.rDo@p k4Ь)j>¹>a= IDAT D Uq1Ey_j#*jȷ~P\Q%;G;? qG*o_ތ%LdE'*JLDMJ-nlL?$SnHD*,4 1sW#b}2va--q}i&E< Ͽ5G"z/wvDɡ$:&'K(**JX?t8Wg~*}XZ!4t8fې5BT Q&䅤qDň~S QqvΏ8#(VXE ;>&Ckk}ǔ"nd! Y,SѮiQOmL;m{bD6e<3e\.J;(b/JxEs߈1lGۆTUA C$>}Ϸ yi 074Jawљpwzt^;<6[_Ȼp%VQQ>tYAEFE /f3N]Y`!p|+ +b0}! #-9 Ҫ:"mTϸ0ci@ze}/D~Tv'kQb%&j&"g5Xxp 䂰b| Й`mB7?/zhX 3،apVZQQBܾg?"Y3pu,n }Xn_eŌ~Y?wB Y{bSH"q=4f>#M^]UBtb 4{2(3e=bo)D^fՐ4Y agD%x<Ե(mpYOdv,GߍT+ A öY :c&>@:+,M2nn oi4[pn}>jt+L&[u EC/G!T^NPT~NHpLwYvdE|.; i̻of0^Um~!Ǟ1aVnZŭ̮IVQOpz2i*?('RU McD@ Gd:{WܫA$j6*2Ɋ'UQɼBVXO Y b^U T8b. paEdr|iˊzK?ZL< T\n&+oO٬9A]^NPT pwVpyzU%8FD4l }X%}>ޜ> ?BھV&m_E'}Fz*O'zVqGaPYUau/J8 v3++4߯LlYwCn6hj4nM0Dg *h=DOaMYU@|?g]KnD 87v[:UK>o+%0r@p^mD s@̲/OmOXOT "0lC>&=[>,)A:>7[*,dZbMZ *m`S6Yfi]VQTF3C?=^N(S)Mu5uA ƸO"R L++ +Ds+24t>ro)DP**NWSyf5)Ow-E T(Jy_aU@ghA( tPl22љN8k NC?f%wn!r}mthUA7?w6@n3Cz/WOxeŝWݝ RJ s6RMUΫR?aR`Hyi$+ h)R,𪢛9zkj唶Ek}=սo;~{d=35m]UUa St&$bϾ1WF+$D4tn,DRGoz8Ͱ p|=+Hu[OP+Ktݨҳ/MEp brʙWz|nDi4>GR-`W!@UMTh)Ur]ZS= !p bʪڒƺ /ģ-o 1}4t~n{f=boij?h'lB/\HGco= z쮿7a"+>F7- n*lA LŊz ׌M?  #BUhK HŖ6r= z\V&Y**lA x"Cic q|?d::+-,= +B#ЃdVeCpWTQxl(iXC^멼TDTlM\o R ڃ@nmbv|*xC 8cG.4@x}&V-`}UG@9նuLЊХzF멨v;e8 us!A YY 3X\͂ϱ8("M4W_$Hƚ֥ 3 q쾪#@UTFWNۿ5'kQV,*\e8NDŽٰX@52VwVy Km:9YAz`]v8[:%AlWP4@Μ\2c[# pVХTVQ.+$ 5-TT\_SYUX@0~(:$l o"-c{n- s;}U'{Y_Ĕ(5멼z*Q0dőCەVE+ ,nB<5Q?Ѓ"+rz)}R"@2?9jH!z&YOu]OƏ&ʪRhfy_hM?9K:48 [D&55G[S|u-Jx9A9A=j.WF*]3d k(gF7A!t408dJEE`Ug#3䛭7ܺOn0meQ“nǥªB{[Vyl>>40|NN>q 8ț TE(+Hd, 멼z*2AE7ZKUV +lJn% Yi衰~}U'b{xzW82iF7h**^ԔGzUQdC=$oGA ꪊ^oU|[&CǓ:f =$[CAן[*hU ~|oӊ&nm@(mmeo'hT!S8I=RYU؃@,LEG7Pm'U@R產T6/kWcbWՇ\Sy9AT[|YObªbnMk'\. /HC ȼ?2gs "k*jP1JjӅZe>U4%|u]OEJNą>VE`yMōi1݉coi*^2m@U\@a|=X[!["7Tϣǿ]Jb= %[Y8go2̣ +@k+EX̒&OyKg5mD/6@kQDUȑB743 z \ ֱp:AS_$;LdI? IreBLU۩nV꣛ %f6.mh}[Dx!ePx&_^zG@ ǁNШ1j :R;ytӨ) m 8K?bU-'4@F NЉv4y,=T$Ȫ vo1Ăn$)@jkع{0nyK'mŊGWuUּKLEaNSY؉z,K sJhMTVU4  ?nMIs -qIGQ`Ȋ4xK?e A79 +$^WW[U4ɇޟiD5ߤ')M"#H|xo1AXJ5:::#k*n xcH|x=:MK=e) |HUp/%R4ld!jE޵مHΚ_/}U'@/f9oBŦq6N$){.䉷tG?WIח$c2er-ȨoF+Px[I!"EEU5n^߶EVlztL BiU[j䏕~Dga zGLku /Ȗ_jSrF{8a@8w_OPdjh  -ؚ YR ovI'Xӊ*F+CzKF7n ϛ\G7z5sobն⒣zV7CToQS62>7t,,%2+Z 4oh-LF7G^?ibYGdGizif `E8~\30V1ۻ0%8kG aQ岣b˴yKVrӨh-u@F7U]VbiOh8$a|PW[m2ޙJM謹%Ӧ=ҿ,{w_5[e˽HUHf{"fp6|RCI!hIAmUpeo2rΉWZ1'#Q3i]簰ͼZ,?:10R#5[\X]>%*+m:6~BZIpڇSaPӟ2#o*|@yKfJW Hj!5+h[(@6;k%):lh^ =Wg'z)m ?p祳"aj 6@%T D #oi1W~UV"Zb1T㗪qb g'Wv*kPDElՑG[G=좢LdD=&w|ƻ4AnҶW$vRkxzH#rn*tS}Vv [} {$L ּ4GEczf m{z}|S{{WUZ֤^f_Se%# ^+ԦVf[G uB8t5-T n/'H/dD7a|~Nzb#>mLl>C 9tUW ^j hY! [JNh&ãn&ф3GCݳ}AEOK.tEnq$pxZK u㬹>ebqW>5!olTdĵU'YQ![O{sQ`ުS c)LfǸkB;o돴~$Ⱥ LI1߼z؄8AUȆ*a5*|VvpXHK'$ 6M1ꙇΉqV0q[|u@UHHe'oewR%b>%X#)ݔ}̱%t: Z>gMiψ:mX8*$*DQ\o9ɣzK1t'O/cts})<9M78oZR6{<6`'+uh#WBN$!_Ҫ!$o)+ttWMuˈ[R:+h>t5Ɍw} ϖ i#ۃ}ZT$ۼ TT(*VvWA{K i{5F7\b$EhV?îE\wU!+FspAa/1jo)+dswBfAس`|ӝq'cYtY~qݦc?ʰWT$f Eڪ!$GdŐXG7'ݔH,\77!0:[4ܽZ[beP3j?]B/ߛ۞}P򒒋X ^wew9Phڤª!$&o)6Y\?EIDATfIʹ$,f-Z!Wxbhl̀#oM*@1yK }Xttݔ6Q9:7&ޞ4΅T^SCL*FIV8AW+4FzcYqxXϤݔt|1Yi^Ș[JWvXRp/TAUȎq4H:鋉5UKH|R>,nI;ZQC-Zo m[ޝfg2P*/BmU'ҙ@92dLooؼLD٘;*GO(cC4cbdq'f,nِ:eo4ޡiC/ .*Go2 HU'}y DaY(%nifڏvc|4O`^M;|Kwq@U(ڲBRmUBqyNY"ݔ&,%ufN,st|S|xK1Y%j|T A=VִUUXU2)E'Dg|6~(u![RPJMg+*ʌ"No)YV.57wR?z|@|oJ% 5P5jTB(vE U'}q [&^nG(F`|7Q[J@%7[|( PK]ޡlbEqUQaT{K Ltΐc2c '=-:9bod-(uH$YZU *(uО*@QRBYqX۩6*r< %XbT'҆ΪtuUj\xNWA y-= [etSe0J7'4,r 5dE5mP ѕvUcH>o)6Y\LknhL鉵oVsָFw>6.&,}@U(ϳie7>[Jڇe䏕F7ATbo!jo4?:Pg? t$~QVV#0o<돴 &w{,;TǍW(zU£gA ļ}X$t>P7yh/~ģυ~pwwCrPj|[J+TH2|QcP4CqUO&-ń݇eayIE#wHU7|3$9RK27g3UmuI"+*G,)4mReU@X>%-%ϸM@.fY!E940@}Xp$UoSvy6P\UpH-%߇epJmt~y".N,st|S>##I IzAJmʫ ֕2xK dY*V 8ziLJ A.+U-I=Y}Ky,TE Hh&Q_S\U +"'Yvq-*/UmnTN/7w&}S41]e**I_B" h*no,Px[QHɣ{KwH,<52eU- ; b"_P\Ubdq'!W`HfvOWsL] 5/o%1PɃHq9_uQP_U0%“3eܳŒo"&XTHɊ驮*@dNY4O=LYϑo/l+ߜ47c.Y>o)&_H2@Uv\!T'㽄'D*o)!>3[V*3x *fzb-My|"esLE9=$/ZVgl>h_Mv=1ٻj7[JY6.DɆHqd%].Fʫ t🰲k_׾nT;=tB7cC@O9cK9yP#_7.UW*\ib{E,`a 4C*1-诎 P)$jYbQU'^"+BջW[ 쥚S2`#\ o)!s*Hc&Ąꪂ+$/#b ^ZoN1߬Dڷ8وTV( *@Uo}׮ A^rHYaN/U 3K7׍CzK D琣HB"D:llDU"~ ^xP c|oFS(d@RLd;P)%gK,nB0䑷$ TVK0Heq0M4Ig,^z1ų@ Q^UpT-婗_~477H/ÉE:yo;wbo)21YUvȊ`??-eGv U!# }"S&+> hw8K4!t|{) )2Uz +]x W=*|% oRB}X?spnA@zob D& z^RŶal5=dFyURePVo)4OXU P17,Jd}|(*ǡFs?YP=6 -%ۇe2KZ ;9IkB+f L -EQbmZ]iUϷ-%CCa5㛚1-%ЬA.5 ωPMATlꡀ5,!~^,(*:ѵgeR7VAbJ/c|<,>Iۓv_Ց%lD[}VsBӊՓmDwF`-/$/t<ɸ]-  =4CY7xK AJ PB0YFTthNkڪw4mp!<[JD|S|NM/C,DIWu@U4 F/ZiCZYZR*>$M$r[ M%d/| 0~-BUQ஦,SZC/sإi/8cMn%A y-]K8e{i򰅎o!咾 - KGwTE181YϳSZnחgЩ@R[ ͛Ew7ȟ ] r]pQ55@U4tFklxlzNZrTf,Ҡ*@XaU4^ W'3w7L*?ɍON` m`BbBX>7woѫ iU{Տf,i@BV7@jxK sNv ;'j劏fp _VM??|/1;|8*ETc?ɩEܥeƱ+f,itR{, $)2&\fU_!/͏}sِ'A7jEh_{YWu@U4# +loZ(3nXښ$PA xK1 eEy7`/mn6IGMj/vA_W8CݨiGF֣2te>>PPPbbb ttt---???QQQccc uuu...@@@RRRddd vvv///AAASSSeee www000BBBTTTfff xxx111CCCUUUgggyyy 222DDDVVVhhhzzz!!!333EEEWWWiii{{{"""444FFFXXXjjj|||###555GGGYYY/3: IDATx콏OgcG:0dD-l#BN[q\<˽$'={EL8}w?ҽǴ3z<x_ &t=t MtHtfs],ǣ*K@czYv}MН1~0{0LWdh:|;gToiJ hp;ى 6([JS@|%5r\n G ]~'ϙ ^cfX3R3k#2 -*߁eEod9| MWd=Mdu+x.+Yv{!~p# 7y;JsMtHS_"㴬d.N"au" S],[_I#}|xӦ ÕlSlFuPK"'Ŏ%+^+贉rJv ^=>latQdE$+Tݫ7 >/rƋ5S`mxMd NVx dH&DN=!˚:l;f;1.hC㽸۰rQ!ʊ2w [\5T{s5'hGWX_e8Tѝlu=EM8@T'Owc[98`υ;bF9xgiBXG+E oe{Bfeu B$fC$*nI^DĂ|M{Qt_^KɁH$:iG҅`xqch7 XC*ca  \Dv/\),F9qnt|IV`;Sp̻{Yv%VY# uVե="1TH}HDDgF|[ @AP )f`jwdK`֦k'a* m/Os5L˱Km,*l:9 kY;XD [пV)_fqde}ƕ\4 )sE:,*.ھ!*jT 2@lUq0 RB# T)`CU0=&6&&u%`G [<=e wc;n)a'#Y1.F,9RT )| ֤}W Q&wAUS>ڄ etMػ uJ`xoEDDFvj~HFxMUʸ͚!;-na"LO c4@C*6Cy #ha#?G#k%Ya4\j1 j$;U XV(*yp`<gs:j:6^C5*tNk)+40jvcu&vuy#eE@݂+>C! Ds|\>?E/q;|*:zUu9å,`$;U XUTVkt|yy>bU7Z4Ea%HX4ekP◼n9^aD8 R@,Let`C\ 2uHJ"W-7ԔF&u+Q6<:$PVlAWNancc h?yr}\pw*@t'͛3*5k8?-K KwG@$S (2<Ȋ utxbrjiC6PR ?@os҈HVil^@'[,<WSlX:);VÿU=y~~O 6BM:zem`#.*,,v;=lWփo\#\B_,Ii3*0?}᫼n9aAyiRP!孷_Jp"& e?i4Sϭ$9KWqxȒ!@>U V *\"cOs+(M5風3FfӂU[v sk$"{g4g|yh`Ps* ܕ֣XV|G<*Xh;åh^<|0*â-*ܰ"_h-Xushd'r` BòIAFIa29QUu奢Q*\b%Z xȐ8# 9SIUQ<ɠtDP$=v ~Z Y} L/`;E%#oy.Nu٫M\^CX1+bNQShȗda.p#g3U SxáW8(+v]qiū$u=GƩ(;JQi6F )+d#1s%YUl#cnbSmDCEd@H{@,Rfױcs~1klbg4cw$w0*K?:eEAJ6l⍽9 *y<'+lBvZNq6b+j#=@ef=O~Q>˚p骽R(^+2vhD'#✪"%/ Ml0 L F^{"ΰд7 ,OPyi.*E Ӕ`kE1HOIV+-EQ*$ءMC*$TEr1vU~gSoy L]V4U Q>8lcwheޛc Pے@]߭eH"@oclJi{;S7lzmdPD@i3Od.ut'0}jQ* *-Veԡ ګF <*N'Ɇ`W7Nj_~[`@,cg݁->"(;Oni5Rd8Q2T``ǁX Ֆ](Z#åætwi# S(-@%Q"cC@֡iPi6xU[ JVF#nuY^Na);AFcYӥ0lrbYAghdP?s׆:;8I8N/  \0bqtHmRU'9++suvMDIVr鈽pїuO# SEW%Q!#+x9ѡiPTER9 c'(L L"C#ibeT@0G;!./)*Ա fF# dxb"Џz Zt47>U 4O>ZVdМ<(3Z3T UDE^Ø߭9W_ˊ*\ vaI8 !9:yXz%C:V@,֤9MƮ( $*44}P؍mW:Ζ^# S( %6CsԡiP#QظaLE}&_`WY)pVo麃QqYVh `\@]>+C '9 kC:~KΏ^[8(NIs8MTE)#Xe7`a#qǺDU@Øj\IY,ó4nme%lbf*`Q#-`ԁ`xkK*HdĎY0d@aWaaEh. Wa,6jI 0ح*ԤJghKCsӞN*$t4XGi/zENq3ctpjaM\^z=G?9 Z؊Y[ 9&P [$Ô A0VUJ1L\E`e>5UELV<94m[ Pj0 |'+'^[w6-:l;cƕm'׋CGvdPæ=@43LQ"(|g鰸KwiPM?DR!!JUEiGw~CSrG*6uԴ*}y c=|/zjǨBv$}eh@@x\fʥ<'S%C*@9WrWRA. Pm<-NZ"5Ԣ8d[[K[7c%UQ:ड़ʲMiVPaiA*PØFd;3ךfb;S\w|eʣcS㦬}67_dЂO k\.3*rO2W[*}Ν; *Y_KojyMgZ*ƤafݭG)p^=#fEPNzYsD}?M Q Q&+GU輖zoSjD\[TEi}cYV ۭĠ*UlPnЭS4)L*eTLƵqz9z}udPw|a# {(^Jف*e/)Y^{ DEB'䪊R>\{9`H6TUE@==XVCa\ KB R{pEMǰ)޼O"_^ZQ]LP97@VvMDiHQ |n٨OFӕ>DE*cVrTEinGޡoѤlLU1)]Uay)$n@zB=ׁqw~"b`몐&A>p_ .Dk"JB|E+ySA-L *Uyǖ\UD8XLP1DP3)S cRweoЋai5% y+ םgp RƱ5)4#@ UKvX_w^-DpGhBbY T_w2Uax34bfc9COӋ =Xw[-9X4$`!N׻l?kG,XEݙ=}*C{mz ?*{AҢ&8CKvU`ggp,a`T׳QiYxu0Jw&sŷՁʂ輬[fݑs(b?cdpq"fXzy/ 'ՓG`M H 1U*lSJ-j?Zn;/4(f*uRWq27# LNSRVVUfAnSS6 6?n%kUbq1 հ&`졻[\"Llܼn]TJ 16-r7(܅]oYA k:qY) {baD}TUߗDEx^!Cdſ_O5TJTj3dB<W@u fWj1ԝۻLyLp)+#9ͼg;sś5ۖHϓxc.ɱ5թR*JO CSx/?_S'iU 1):ٰ{xl)]Qu Yc4?޻j ʈz0#?uRZbs}NQ>jyTiUP=eWKrn>b'֗0FsTErQaLJ>rmvQx;s/ VqTV`eT8{n^;WJێND{]-9  # *S91+HUEJBCSi텄C$n,Rm M IDAT|n~i6"FSeŅfql!;EQ-:{ њSiN6$_l8E*|*xE1)G욈5Ti; TEiW ޡY*nKpl#San|7eNV ;E'eN~ғ-:sl$K˞{^ {t%1+b15%Ya|wHox[ ޡ٩H*%  cR=;.0v tpNp) qm \-J#y3ٳbj.= g"x,2Ehtg"Z BvvJSYȒT]͇Md$T²gb9~Øbݩ*lb(zEG,R^@@0Lu4:p^ܗW]xE2S\F bV< z8qVs]J/tcfXR* XV5ÞGw z ;.3qZ2V0〬tw%c{g g!eQ-pµM5Q ìG"~RrȢT]䠕" Rǟ PdXØߝVnr᨝EGna0kjF'W Qmi. g-܋Y f5댌YkF@JU,YҴCSmV6?8-W$h{6 l8缝p u  ?f V9sb|˽gXQfA&P&FOQ*Uyh* @lRW~ m;E6ɊNNZaڋE!hP5k˲k&TF.™,X k"JyX094U:|*; VM|C$+Lب*PØ- `Uq=ɕSp#pjtA ռn@ց` ]i,b"h>vfo5YYYo9GXN5%Ya>hbViTz* CP2THe<,EUaaLf|#R(ߣ)\pIoS+[nCHV s'Ag{9zG3^+-"\`YYNDX6L`5mVz^whthn*$[DP"laLlʞMX/+,{\TuCDr_`戶CsSP!dV#*ظcQ:fJ{ԎW&4%2.T{sQ ց` EEӄ-`p9fEXif4@Od1̍OjΌ:MCBYU@Øʏ5IQ lBik+A)ǐ:GOz׭EQ-ںsaf>Ҭ3F cVX.b?<))aF@ MZUsh: )8 *rU1)=ò M;Y;{/xtQh\*2[*kt;f%_d1`p@TExUEduF RHl"U+*_b Ƥhx6s%YwӗedIO3[$u i8N* deԃ\@]+sgN 9_!M̌N94G *aYCeUl]_W~سyF\{{v `9EN^HMǪfkj"E<~ݩDX]k<,<01;Uo*NU:yP4TPچ )d.* c՚f wXVAS8\ sD(u :Z 8M v[edif &(_ # 9SbVPUޡKk frouʪɆ1 B|d[R=4vr'=nց`VGUɰk YYbiĬ(n [vMD)K# 9SF|E** ;47%IEO"KEU$bTҗӞB)1'=wU3zyc:!NLJQXwǬBq5D\, ȧJ ]KUzO,VTavET{IJ⎑7Lh|8Ozy"D̾#FV> VݩgW058Rp w ȧJ_0RL; 947*$WtY cR:`ϟ}/z >@b@]y7 fMnׁ`L7LtƤݗ*u3ZKTz"rMMhZTAU M**$RSI|Øߝfov \ f$e#yh\E*_wŮ:b2S.w\'T"QC!&oh`0'+@U)}bQdg\`.+*Ugx ǢmϞu:;~Ŗ}Z]Xst ;4PSnWυR:tTTq|Q М4 7*RU$cf"_bYqV])X/F\1vir,N"~;.fEUDIVr~llD2UjbUvh2  RlɊ+j"9naLJ'+&XZ/zSRV.FG@$Sf ]U+PaSئBE,+,WL}8ER+¬iJ1*ܡ; dJM [Ul1yƾBMuUHllRIVpIlHq?\ u G[V s'Egj17W]؁+Jr`2jv\J2wf7C IjPEUXn0ٜ  5\ كQ砣n3h9d!NqQ;u\t%kD\?<,'8Ujr`U̡i 2ۛ e`9k*$E6{kٙ0.uu\{y[:+(5u3)boDQyJNCseBUY*PX FAf5+_`zA01㸎Qa<[r]QY4{?>![wݺSe_)x V75a/aF@t/Ti|! ޡyиCsB6"*l4I<,+&{f@Lv 6:[JӴu^Ǭ@ef=Ǽ$+r !L+p*3J+#|&wOq֝ YYԝGT@b15R:## x]A MYrP!B*PØfE'(w3HR˩Xڰ)1sQFyfȯ-Бe(5 u~Y1Xozc$+TSdipT%榣 )e0&wgfvvso`bd\r sy"AHi*GNb 'fvM%*/UqCsiCyXWWQ{ cR.J=MbgNQT=Sl:2e>(hJ@x}4}<9; :Nb])qIVd9k`MY+ U!uhUpP!Ŭ8mu@hvv5̽Cuz3-:\}+4+̓&[wTݩO&M\ Ť"՞`})3# htPwh1RᆡB«8ISU1Ot9Itl4VDzy?דټn0xu3Dž͹u6)*P ֢#XQ욈R&:7SV**̈́Di aئ*7IR+SC |wQn2-PL>_}`iZX)Dy Z?{whŲ;~PGyZ|+J $Ƭ[UTtP! Y⴪oaA%j,Nkx(+|&*uByj|v?NC/1+Vp(ykzHKyXTi[͇ءiaUCyXڪXl&Cͥ)*~D{A +&<(h,:M9Q[x8&N -|b g횈8# a_RږlQTvWU fy&ಡBqYѨ*4=/{)FQ]ҟ|'*6E&)*u 0PxcaH֝h"bQ̲vMzcһtF@Sm-m >$PUaݡ酡B<ئ\*i'X,eyuӋ/?c%[|8M@k{MMY; b|2^5R&a/AT(* "/whVwhnzdb0KOU|=ES+NjŮ昴/C۲‡nׁd4r\ݩbV,@ vM=|jz# 7#h- &0xwhvZphnzgg,+^ MUlmZ|ǻX|CndEeITlZj]kMAE:_s/T1+_1+=}!_<>E)VѕZK>f4Uaá xgb(KWUܷ0 qNR &n 3_aY[k (C^XTwlNf;} c:-A<aF~1UQ 4][[K@ҊM ؒaM R *4T-h[`;4)mwn ʮ#sŸb3ɞ::ܵw?=]w귉h[ĺ]QIJXwH*̃phnP!T cweo5dEm-Y'=y٣:8bO)֝т/x}b bȂxq 4H~"=sx`TEԡiN5T,yf*,6EAS`;ZHWC,v]~CmCIMۛAu Ya tϊ\VW;LJ_lW[_N]>p`Y?}i*~iDw?`E3Bl4"*&4THhT%N cui;} ".7>u ܳ*{VlH&U8GGo.QC^#| ,_3LvMDi:,U ?K'*.4ӢCے^4T=6THWaTXWhWoȼW8YBugg@@)w, _TwI\DOHb1LvMDѮdS2{Hv? ޡZthnJ ɠ#+ c`v 2 ߳ L(fE, (Ns)6~'>;]lT1+v($HT?te'@,5bŪ# DEt':47CE_ RpC<:jZOUj)Vwƞ;eS //JF^@@nqgU>E?եD5pםn ^T\ V](NY:"֖7{~Vء9b١ C)*hlPh PŬ"lEqSjn+]@*T?E>/XGպS]"Xk`NJ_m-*# h|JܹWU`cMPq_ )uXVD h324dq77n8'+f󥨰-@Ձ4( =9S$욾2j=ۘԸ+p^U}&N7C<,P}:~C c@ >rr=|Ńs}%`+[rHS2]EJJu "pw bǮ 8eŗ^ qQ0T)SEF!ƟʾCBYaDUh+)ftr8;)|+,+|d+[|AiVxQ%l_:eEE@HŊ# '@*Z4sNÇU̡ixφ jyXTE/vUal~.k4bm<u;ՋG̾-:U7+Y4]ILM*~RUͤUf ~+4TFX7S1+lwXTfn^xPPiQzY u{84Pw{b} C j?|;X01UIUTph0THPÚUE!68ʤB.+bg#Sg_ æ@Pf.3Sܲ K^bݩ,+]QLmy# " SjoTvhvZA1THˊIU-S\EWrس)zB/:S,*̰7luGu Ǝb1/$74pOi[Xf=G06rr3Xw; @nCGfIXThTpE5wܖ [,Sa'kهvMD1bd-S;uv?UŃCv*$򰌪}8E͏ue Ķhq3@u:6LiQ\Uګx*sh5 RYAQ h[8Nv@Rgs{у#*P^ycDy< *GT( @ZwZ;r 3C&eqF OQdM'x <ͼz)B,[Ձǰ9o/L,Jdɫ;EN_-pY zV-NSmѩRC몢jKY֡jϰ 滰= [w[Zjb}'r{6n`A4}OqLY2ΓȐםYY^/"f=w- {?mccǣ={C &P )| *t3NW®Gc J>l&^k"WE|TvJ qjȯGٺSYVO@,kV|CXm+ƲwƦJ~O~ BB2TH3WtTŶ>_{}h=动H&4Ѳ܋,QA2[ׁsFI5 ~}םS0ZĚ4L](dY|d9>y?i&P ^utuzS$ՙ(Gl&HŞMɊZsoaQQ9L4[ՁxlشFNyRpzx&bk" tMƻwhj`SqUq `whB5THhx`M=,)W"NoŜ*p{ e_ 0]F`4BWUN@.wc&ۂ\m_ȆJM~UQ$#=$2Zcf/Ӿ` ݠ*:rdmNQvtwvh> 7k01DrhhtN1t44l%pweŪ1?:܁|^@wu 8N3OMST |Pw1v͟{R`mDZzЙ*w?hvnª$wGꇰ(7gdܬ‘˼TE }]Il@"k-*p| 4V`+Uy"^ՁٻNO/qݩ@kyL _6!ә*w?۹ɪAAȝHe$N[0ToA"UѺdv,l*gsNi솞⣠ '<iW4U) bݩKF 2f|orЍ / ٖTaMVU|xU&)~^$p҂b V' ^s۪"]dE7 yԁqj|뷱 KnݣSX_3L횈xeIKst@VUUwut vɊorlEdAbw׮Tw]Wɻ}8[pUE6Yl@NQztX Ô(Y}Nzј*-vkhWl7rb^kufPéQdX_?8X*n0&wSsZ sakQw@Tqv0w-Ѭ,cX`oA|Rb!(JS|g&Kw?daf:VPjQ*xī@xՆ1)y&/+~tj8-nHqi'p9YT \;5LE.{%_Xmy@RT56xXVD%͝Ef@43ZN1=dŊ^P0lzU4WT#b,yg^`ˊ¨pH 5{b`sXtĥ:Ujs **8e?s?x2mXCE;tnjc+5yLvQx,ʊ@OZ#AF@@ 朳qj|BWQ;%oBvܥ,%ñǒRQUqc " NV\ 3WDT˻ǘ1Ɋu>$ ʮR/3 tnl.6!f3H~F)bjbȮ VVH?xʹdDm@PUT5Z o?s請O* C&"8Q2 +ƒ;}>6rij\VX7"yl.!YHr~CIVu G@˚hҦB)+S7+¬Ʈ m_DŬܡ;Rt_dLNUTehSp9P5Ȇ.KD0AcRPL^XV,Z呬H&p|{g d9$'Cu :cq'@EٺSthbʮ T/ ɊTj\,ChUFE;H,*ew cŖ}w=>9pVӑ]gF c'u BKP?,"q IibݩJ V 횀O嘕HTAsО`п hlBD\ȋvyv  UaMW\-o$ܥFGG=6T`heىigFtt|HsyG"4 YYbݩ)uQvSL*Rf Ŕg&~舘-Uq,Ƚ),+ <_)pUB%dTEZEUl"3HV0L,10q? ]Ҕ 8)F?ˊp{S@5%/ox_%fEM yG N.YXV(lY1֕MvW i5U]7r^aLGGT<SV<3Q؋Tt5ː4^ITcTĒȊ%k׿E+U?Yu90nɦJw?몂oK~(DCE&~%nN1񅶪P:i^4QS"+bXⴎPO}8Efj96Z7)؉pNf#:Tm)bXNi^xegjP :^@i~jR"ǘ;N1k"(+46fһXvV2U`QU1FNeX3m-'y|ĬH0U찛ۂᣯ,MYCŘkXʻv[#m A U񺞪ʕ5勊dnIRq~2܎Ej #yykDx[> "NgXYUzkY8A# '&U61-hhp] pC>仡ɑPȐ@BWTax0v7DLa.I?܎&Dڜq03ӓΟ@]hD0`t:|G}p0*uR,b%vKFVh{[~ʎ}`VUkvbNJ'SM ZΏ>۪Nto۟g[AFtb|ԫk,XI#feѓשӻIU񀏾2aT=Nݠ'S)СCf]M2<*4 Rx"b`H#aTUDY\IXF[*ѩri*uh7MuMhLt?5_WQq0W֝>̫;@q.'}'=޷V۴>C[.d٘SB D^hz=*(C&g~.- bE UuÃ11*}G_jJ>!{p}8:"K7U?_ NSi+u `u IWGt~p~?A_lW?Jw8wMАT61 o4=*b/?sn8~v4< #kBTQ@[ QA^T˾rc[dɁT(>'Mh7$aMDOMS[+pi&iA̯տャ)XNWP S9gߠ5i-Z"e׿G3\\z]sfK@s+Sw|LXYaFTp"bXUbnoA-DdA7@b:)@h`t؄JѕUyk:@i֓^ HNY,Rb&yZ[Y%*`K4IM<$GF8ib~DA7];j`Km+6NBh jjĜ0*dᆱ/`~"jF5<%DZ#pVlh pPԆ֊1j5Y i x9}GVw }uf*x)s =]mbV?:;z4*nBVf؎sgP܅klz 4VZCeWQحHjJT UQcXUDO`݆-uĐXg;C&Br^V<%Ex  vE°@bڸl֬,i.PY8 q}+pxᗎ-Jx|Ċd/S婩qf@P?Mj4doTw WSO-oQމ?`r׮kܣ xҠLE_}n7<0rɊ.aqXl4jh3-*̫h1ah0!7:r`7'9~q%qV,( IDATԍБdF6D,4Eje9UἵTy-`yx1_^uFjk]qXe ON%%Mu<̃o$T6,3{x~dEYV2u ӧH(]4*<,1q,CWC4BbdfhhhyQ([n<9,Ռ+MZQNRW)XM>&@qjr=D"/ 粇t]#ˑcÍE!#BRX;R.T~t1Kk' &b^pk/Uxm)Ѳi>B5>^Ce 1!ҰQ1!_Hl%Ec$k/Oq @ӫkߖlosOZAS @Nw1JW#<.WeⓀUw_뎞fHdkdC( T61H •"kdϼ|S!`+ hXL*\YJ{L^Ц8]|4 Kۥ"вp}Hh 5*uZa9J{%QNqs-(+l;R`$>"\XQDn,M $,Z) "I%+PmLcV^ژ>i@Vd2N2m4D ,lqL|,K4DA5 ~QH}7䲂-cj 3W(j0uu :LJpKVx_P !{^Fq֔j)V:|%$w mbYW! b+1wTp€]T-&[mD^$,v͋!"+X__w#Cc-LIH1m-[%AMC(pf4UowWP5S Is. EYM=ՐzZ-Y4TRܯ#}^_9vzYAo LYRW ۅ̺[b_-yr 420uuuK牊KTgL[.]{Ps||(sˠ3Ο5˰5dy9ʿΏڨ h}%?N kwg-m8Y!]Rn%D>U:O7w/[~r2'!.wLjZ{Th ; ƯԮ\OOO?KQmrx薤f.rbr?81ⶈ3MAyˎ[+T@v&X\i'>sJ_ =p,692\pSQV5: h_7۔ >ܡK7oDW_4J5DTKB4ZK,Co9]m?={3 :ʷHX*8%+L.5Q *)@ %', 8%9}3&6h9 6!4D '!z K=9ͦg6efe>5/^ !*x#j %vZP2i6+}l ߵ}3|gVް VJ+v+ hKoS`v:؞{,V^]`޴TD:>ⓤXkYK !T$io^ Pa"9 3#]|5m/ZUB" ǭyu aYy8UQ%‰s ȎüK BhSj3NBbX ԡCHQ+e/qIϦ\C\ h5!$}~q P:ũfh)4S3 M"}6tuXSdPDՍ֊yT;;oD4 /+<(a mvbV|y61|~h΄c8^$*$N ܯ5d3! E`4NbB yb[,FQne X`bQ6IQ|M8)8)jJqkEE dU֙5V/jp²8@ѹzuy컠+/עd"ű } aR)Dh`hWU|-PWn!Y1b8+ǚ oM65s BN,IYᒦ@ Т֊t<; zrQGJȇsDE4{⃩NXP3pn ѝB(4hX(-XVUrƄȷf&e yx=\)j(=:nʵ-_\&<ED@ T̊\U\&f @ \<dzJ^V2![*HdNp5S>|PDoDMBMMAZakPP7Nх#HZ8\D>dEbVdZn NXd!^Ew#aSU܊V /+򰔬@sXT931$d˚"醚SZ+?asK7}e.% BEvY;TUlzNU㮜|B!p|yp`,K $\* A*ݚ~2d#uXo͔C4Pg6OBbd5EJCh֊<|&/S %}9VHư3Vrs_:/ն7,|@Ƭ UQuH.җKW?6Ǭ/X-~q~+3{W X3☊߹[[MA7ZqŁo_fJ)j"y舗 o>W%\pn٩jy-1+*61bŊ~fv~ egA,XS-jldo}9NJ5S+x)2|Uy# Y &UHj4AOЏuWA(/⒅\?="&FOAvV$ L/{/4Q5<)jN'tr**)Ph)X+.V }m|DX>Ooj!Oz%,$#ӞodS1!h&&f4y:{'۲(&@D,]6,0[]f>{><ִf }E)f5&8c k}DT/,{_+ђ($x4ȼ8zSH{83ߓ+h i9`fm) LmZkPU,Tat"Bƺ bkM/FYDeՋea4jd7[ZG\aX^ ;jzΩz9uΩ:ll}ػ{ؘN |m1,^Z.6mQHCcvJKNEk %X֊k8؏wژQMP~JdA/IY;rˌG{:[Ms֗w)e@UZ"* OB$`'S/i?䤩5m wQq/Q0B+J&Z1kKK:s\\=2zRTd hvO@WDž nmhXPXT~:1.,X'g痴)Skf</Ms@RW/V{^}ZqvaNf*xܺY=Gb2.-%Q~k_c7lU:# G*/a~s%햹5sA!*G;MC+DJrt<Gamio./6 |'.~p qY ~T na9M̋&~hIb3hSA Pؽ(7d/Ljy⠽4b2͟ЙЊt LbD#x ˊlbQI{.k|'RUq ui*+}-Ly]Ҵm]IUT ^2Qҁg"V0Y)i VqZ+Z'q %,+vn;^ JXs`(EE9:3'e^i|Ŋj(Ss-N]UTΣpR,"Ů)(lC*%pg`1_~ӘC @C+HuV8;_8M oG?B9':Jmc_VAXۖX#eլĬp*? O+ MUqu6|a_0Rahq~/|!TElw>^kͼhá`q} DghjcQ!C+BV41Sڪi$H6ǹZ9fGmbVP.\{Iܚ郹`˄F3ſ! k]"jJV,m8`CQ 4{XāȊcIKFAA@ ]T9=w$ "?Դ#Ofѿ `qaiX-&]YVBhMQTZQ4^y) 8'RTХ6s\b-St'͌#ZUQρX\ƥ t~M;њxwe/},!.*VVֲ;]STElH Z1[QͣzLYB0듂X|NYG sZhlmV߂73BUV:EM1•zɶm+?`} h ܽ B+bS D4)Ě`6[Hŀ:V06 fx/ )¨,gwG HUgA2h ^&Ov_EyV` MQ=Q WVP0k#EE8굊߲ޓLsEQѾ(&Fe_E|d%;=S%b;(ց ( 9iN@F&`Ӭٱ MQMK;]BZ+jq*RYzJ[W x UuBtO6)cn@"ݸ5.)XG@U$wBbJ?h*Ux@4һJwc03VЊ҆vA蔪;p֍J.i(F<$4dWcXK{3S&TEkDQSOŪ"_4ܦuk( IDATE=MV4Ed^AU 9\:C "xRvAƵH!pN= 2B ^l_gi=,F< =ՙ:` d.s8M@zJ#МrU tOO %C:pdċQ'0B6oލf:pQ.jO_ߺno'GDžg Y8 +#έtݱ2㉋zF 536Tݍa[k  o%%PsC6)*q)[+teh[4MzJ#NlT&bJ6UDYU9}J TpLܚ@Ҫb@E{`vӗPph,keE$\J넢 -%A} sLH,8 Ԕ&~xYU qKdD *?eAҚR1ڳC'6}!aa^ih xH.a֏[nRQN41SIٚ( /-]ȡ򸌿bG6dBnskf5PI",*Wot(- ]YaϳS!: Bi.UՋ>}f vkSP&>0<*E?4bV2dw*ADT8߲Ԛyۧ5ӁU4,7_|o,2 \ MB+ ۆ !Rijk˒C*ja=^oU!j{H5P ,Bs^f覂\q&VpEN5AZkZXB%4o6^) K ?k r6H!0eȪJB6ȊL%Lhe.ZyX3:/l h4j[Zn%Ol| Nn,YC'jE "$@eETnSkL@Uta@j1 caXu]]_fKM cYѲv̱}3S0?>ex NT*f9HgAUPnfޚigsm"*ɘ0o}˷(XHMaڻ-ͼ_- HGį5cFbpc@ \-"[3KRUƏV;N7t«\hhCgX_&QO? RVxJ-b " DT:~_ږ U\v7L;I "*3HdWxJ`!5 vؤ) 9]?/t $l8>̡LjfO) 8 bTI*,ΈH$ۡ5suj!)Uq #ƪNEmN m )y^yI%UTDigu~` /\-1 aHKVdDUfK5:T'*Buj s!Q“CrQݯDǸ5!XU~="ռ>ۭ"EMv+57e B/]URp=Oid ̊q9\,(m Zv~w-]V6 ,rҚ@"}eٸK wq~G9=99yn9(,=aᦓQU=)'Z@qh bB@#* udIUԲ ;,yjtbQTTW!+V(/o)ʅ9֗nQh:O!#s /;8yJpb]%H/Щ+"3*pv?n 3~Dkt UzY4nXF3˪Z(w[WC_Yne!=R,C/m=` bX!Ȗwl5ӁꝘi/Ĺ]eO~`~ҭ9eh<B,x^Q&vUeP0 'hΞRMW AtJ _(ژeLUT[XI~>xmPo5ӁUX$1oۿ'ŊK]]]{^;=Y%f[Hqo֓aL[!&B-kL5cd ϭUMW"Nb:u,Xpm#7t?v^ g=!hx%ǀC9͘"[ad/6%5L@U^"14Z(ݧ+_`)XfleܒDz"[jgZ]-iHZE$U+*ixGb1T,#Md\@݅sKT)~]jO/1 n08RrrAU+n2|# +&7>OSRK`  *N6S˝o\ᥬ=n|ѰTB̊4]-UqTuM~pN} _DPer} Y'y_ 1 SPP<*6e ګ1]̳ηC/ {yJm5=haT6TgJU#|T]^fo$zB R]-*)9#4'wXWb*]pB+H3Z.+<=ռa|Qc@af(J#RӃ t5E *%*)AdE)K+X<&eh,ӋOO)p@/@ˣK;8;bF#^_+)?U@6diwQFSTdy,X<(]Kh: WU9n6l#8vS iZ[ 얪G"+\Ac_-w}~U]FUj6TDV"])51r"֗=S Ur c.jGoFTŀ~ޠ4#T'݂HwAT:o}~?ŵ2JЊE=xJ7rk?AMdCU,->-5UT)O8\)aEsSh62V' ?O)p*^id/9`& z0Nս;be%*fnLQQ]k8Mj$MoAkvќ,6`Oi 7|ҞgN0wDTxfjE'NdqTEiv.bjwrp9$ue14EC@ 2ia3o5&t5}5.Und4OjOsan#w:*׃x$+bjb)Xa<U~+}]%I xJ=*0Oǵ` T ^ky;O6U43t^TUu¼bDT\rIV:DVѵE e@ڃ* |52HTR`^ӴW9 W>LR,,TUȾj@DPhj ,e`)58"]oar%+.B(Zt;DkG*8@ /09WYG6Ui",,N * QAT_흤B<~*,Xx}vC+|Ɲ<3* c@0ɏ,YU  TE+BMT9L»){ WO ~;=  J  ~: *+w\ڀb.'sTE+i _q͂(jX"쀪(9RꯞYSX!!pE W\V|'eq. "`5Ubڰ1 qb*ϙrT1KL,1;*>KQ^&MQ\z=%}__)++X6( "G.Ն+H) xx4my *[Uo&(*bt+4Nͭ&1;@0,F낫3y 0^de&8kT5`P@4obY IT0⨊sEUDvMﮗ߸D Y!J"2VD-IY{h < kgdw\"X^MP8Y•L0 QόɱUDaiπxƼe c@maAUd{UESSD<, #,fCUO{U5G- 89(v@P>UUPUozH PhGS,)Fa AYQ-sY)51]=)ՍW)ƴKڼe uHfXbUb)۳쀪R֢B MQP6!plEdl`Ѫ(]Kу?Xr5f$R#Jl5 IDATwUYbvUE /\5aAM+,"zJtЊ bE u#_j˦q>iLeù[+ž0R#ЙHa Dsj-^pT qenhB ئiY&CU!~gM@U%V,1;EUKhh ($eyFN =Vd5E;=@lYS  Fr9$ .m<|cQEIS<{Q;aA򲂓))BGaimt0BTGt)bUENfQUTW )te1Ia, v V*_{q.=imBTo{ nUEnf1ⰚLCD34dE` K.X%1C+Η٠Z_MkUūMfs7DܘGT^UE~f٩Ps4k L,YvO[a1 %݂E 3^hEDEk9$"l5m*6mDySb4懑SUYbv@UEfK!5Er1IaY)J`ҥ,4 wUN}b ) ]M;m4mRQO>'*H^"+>T%fPh $*a4e*Q~?kly`R87L3Z;= q'GvTUO (mkmfR<|q0Q51a,!0 aYH`DY؝F MO)@lؑbAHKV*6K:*\z);&5)+R.X\Qr u2t+œr_ߋD*=z?G݀$= jFܨ.wR;UYb6ix :!TH}+̲Nx+X$)m0Z'+G}6EX:<*ƚ7bY9>&|.yS%fcډ޻a͖5LSF)XT]IQeMg$"'edHR Ncⓢ\s"zJi7 G?QI͓,1%O>1ue_YHلBZ@.X$[=܅LVdPM\bzJ16oۚ1 qEUQ%v./ A.ե ƃ7`]q9zgbZL<,SOyTJ^ 4 BWxzJ_A[S̓TTEEE U1YbMpaQ1}\;DJN5aM+T U@hEN}#{J+]m Xa;ݨA_ZWTK [DJRpmlb$_HSڠ\ O;g{Jmo[mCUf |uUy]Bh' +FL c.PòpGQ- BDŝF!vuU!^&{TjT UHHEv#~u}8yģror\p"_'Ӝ0`iɊD 4<&!00*\_jDR(,8fXegUYb&>'_zMUIPc+b\!cK;mMk@;BRkbt RuA=GN/ޏtvgHh[UE}@ǀITPUEg0Q]T)В /㦉.eX? k(f~ӕ,hyJ, !@uRn9sմ6M^o3bǐ[ffR,j]U`)6= B.]A芢!}ۓUEIp kKDZ*E ț4F>};fz.LP1VrXIT-6//!@>bȑxҔ'H#)X saE=OiZ!v2W=ꝨACV}bǀ|@^JOVUYbuM_5HMM>} T- qI٭_¶1T^Io˜ҖqDWG(XP)D}h;…Vpx}Mǖ~Ԉ)Mr}UM2te*`Z!}wzl˵~19& JslO"E'R;xxk0` ZHYzAfX+ .wz}ΩF'c@zXyȩ%+ 9KN?,3תG'AS@3EyڥLG &5`!+",({Jt Q=)ۡS < rHǀ]>ШSrXֽͣHo΀8i]b׸AM+P. -Tō'5a= [hMKTЊ "VYTpS tbh8wmT%֠vR}?{tI1HBeZƕa(cT%t\X 8 H_ҋٴ`ASڠC+ɄI?=XYpɦx0߱V$3RrX#o RMu/ D$)~+fCDp iK , LOb 8,oZ;C:-NSWT| mr&ǀ8!YY̘V`}[#Kp1s(k\9C+bf˜c6̌6(X잻FBC4+)IlR JW;}#V$ZmK[UYb&ډwzЫoű=wOyB6oeucJB+⪊96LY6_^<)XY~_+5Ž%C+0t-hE]\SYQYnp I~SVr x.[oأ_\TȰk qU5qJ+L,t 낧t ,+Mq_Fk+3;PV$)^CߚN;TU%f*G5ڷ갮*Ghk phvR 0V xYֲV濿:,ΐ l枔P7סNf/J Xq.xgNUHGt34UE%fvg|9Zkܼ[;PWݣo;]5_ c XaYtX)ƛR܏p+']m? hs~)U!EdEzB`ӃV/kZUU-,t$Mv H3芢*(yFp!+ŗ4P@Tc܍A: 'e' sRS@~i: T*,1 /N?Rj@v [\Pcʊ%eR:\yWcE/ KHmNG,u/rRT8bY.Uu`ɘg\*`XITpx,s۪.d"dt|u6)K1U c aw^KT>PlCq5c3[IمeE2RUAt*;bF U1=(gq*4=b)Vls:IE} #|Њ[x> ?C,!ӮUghsh0-gd@^p/j:y08uBk{G?BqmZqAzX#͒ rc3#_`iZ!@{(AO)1UvUè;ZIZHQ'!=2Frwz-C+1taYlk]b?:زI9t-TJ ,v. ELFKUYb6#'$;XbX2 c\p`:YC+ dD=J1+\m*,1ɟ-3IVa˜ yXn4pCЭo`^h]6!oaUY EmlPkjAh[ЊEcϨWNuz38iӋps#"O7` c@7G:#cOCUYb6蝔-V cȰzmːAnĬJQ:FS |AWmzI1 RTD$څlнmX̷)Vh/߅߇b2f%mI 9KN*'FڥODT*'yX|0 zƬH\H ֬VE.%*,1;J -wm''o)K=т+0`DV0o`~Z(B%3@R@4MqvLTUHGt\BUrGzP_= rHeXyX|0mAd媼ӋM=jXyx B%*,1ҾK6M6BVU*|}`I eE&[ Ϊ=QXu H-fEbR'*,1ht0aZm+lj˜ : oKVDIU{& *dJBi9K&wz ]-Mubӄ1Lc6y`:7'H襤))b0D@UYIP5I 9KZz>\QO!8%h~-s0a,{$'kr F-EE$qA.*#:i$T% _;){kS*p-a c r5]픺^ĻmQ7 TH^T`_gHͬ*?-EEU%;52X{fpŕ-#m2\V:ck*G<) NL)O)p@V{= 7\.67Yb 2*_B}F@-Mk ؗٴB+Cj GՔyJAU /cVSU+rOʣ@opX|au 4C+ʓ2%" TA#X905-cVhbT% sQC+lXp8aA5ϲJhӣa0d7%O) ,x~;.& "c,U)AIy3KXLpRwV *7JS ,誢S몢 *dE U!,1aƀHQ=9K DFZab1kX\S|Nk_Y1C+h|I9=R(,"+VۄFhi/vᔂ*c3>B6]np``% 'e ӋFţ/mCG;򚇵 ʇȩ(Њ!ρ9R䘮*}3i%_sC^O>6mG&/iYi"B+"n҃>8WUp-zr+mnUG dXϹYbRZaau|NaX2{AҸ*f%o8T;{J]U~jFx"E{^=ce6/*ЊVU}꺢\ʊ0=˓2@:~̢)u2+ IDAT>brES> 7YQ!!r5% ZQ{ayM.,:n0m)\BqC+f}O)]h80§|/նpsYb^rRơavxX sEA wz`>)z⇾u |h gY!gyUORh o^-[,Ɖ~ EC+ON&ixJE4aSU._O&&U`/,۪zNT8 IV[BK-Ú.Aw~Tc}1_’zxJCF@p* SӬ*l9K DEЊY4ZɊqh~Z!Oʼa4i_$2QXyae>ǀȘިb-gyR&Z1uۛs!`1 T?1+y~Rz<)(n]U|7jª*=%~ pA;UC+ qEb63FX'eRW ܦ@Xe6ZaϑwIU4dbIûz?!J.un[,v̙my-B >y]]}IS g7{KAwWU[%恀'C+*vpb<,p;=^YDٱ iTA[+o(]d:z`"ZT=U--˜X[%+f"V;=^Ynoll;i|Ǎ| 8ح'>\*I9|hE [Z,JX,kNvy+/һSūa`pD&\ U1=;4}]]?NN/|hL[Q~bQ"_bI[HP?,Rm; x gc@d |oW0KJWW?VO^rRNTp3pfbE"+fA@cNt:x^WcA8WLw9!n|: O=z|a Ŭ8$@ +^CA ¬Qs?M>KCT|(Za0UZ,<#Y1C+;=~1)%Y3ΛA!sUUfqpN~R>nZo0O-ê@^Y"x1+ᢪmtSS-h@70U!EUuȥ~Z.*BVa>L<ɊrB+<</sJ&oA)" # QP]0Ybd̋DTmA4XUexhUނY{4s'P'"/yX{'O U챃Ag"<тC**ơl-%sz^B9Pn8vyz>dVn+lnuZ:jPc;$3}f lK읔CVK [,4Ɋ-7k"'yXV5VHs8ϸyJ$]m[ >B )*ģ%m6ph`J c~PjEEXoțc WOZ-k~Pc*|?+.-,1_rzv;0'AfKX7 3|1 V< ic@.,-Uh6o}IVxD6'bP Et B+׀,ŬdoO$e4, "c9DT|=Q*bx[,.*(yc K y7~R+Df1 lTEAU9yRIzOЊhjyfN"'yXZA No=V-hv)*D%ۜiQ*b G0GSEe,+EE>d~k9L*S8:_gȊ#R~QY4PszfTTUVSb4Ӊpu1~ T )*&J2VTG" !쟔V ceXZ,M Y**r u<)sao}tEWECƬLHUYale4Y8w˜ih gQˊD<2)*U^Kڦh~ b5傰=þ ZQAZ=EV%bQn"yX=uNʟ}$!įȍDWRTMhUw<o4hh05.6bUq#/+K_d#*6z*`PE3ow_(,<0\̋3KUQ˛&BЊ&bmm6jDrNyvlLzw?~E%B\Y}N`\MU Z$rV~@)?" c>DjT4q yXde˥; :%A)CVW?<1 \Y~|N3+?zW#KQ g"phrb "+ͦ0,G ZAVR+mguU?;h rG*ݝ֩X gDU]Sx(aZZ'є-T9Q3f)'NI"{JDQ67ETXX+!f"LgA o1 )4dQ\;FOgU}YKw 8$B 5yBpgp` [&1أB>\(B[Sawr9ֹz{a/Hߨ(b$~-!B̦K^B%m}IRU$)JV_<=RWkUڿ'pFYCέY? 3 ,eDT|WQaVfS0G fZ 4w?,~BWJg#vKe-ğySI$6_ŗE Z11XC<,wYT.PpGJpY 7: _K |1n 0a,@X[,#F0sw KSj%,UE1AǀPU WoxswοRw`ͽ9wq4"UᎍbV<0L&amg₸1>z%Hqĉ=VvDVtU)~bqrrRiT[6MuR? =uH ܚŰI#PWLC+`˜׭-!RbLTZ*R dp1![pcEgɑΙo:2Fk =.-M'g }otZ,D 9> $PZUia =U.d?|X|gRlGv~iɅ`{ia"Rؓ>;\K„h c~nx@8YaZjR_m;឵Bs }dmOQqoئ(ʦy8O#5i=|&-3"@E2Fͭ~l'9nhyXGWC|YN)Wm[ = EU!0+Z~"7u<^v,V"_}ƌuHQфhŬ~ۛXhlKVmЊ7A#8_|{@~)a %UaT눖w&eȡ \ފA|6_,b >N]Zd3rfļ@Dos/O"l `Oi*Ob,3R"y;[8r,\[j,jcg,">ULx$8bU7 c~h'k˳*eğy'ZӰ -U!ZEJ:(X`sd$M҃Dz?b_hED)FoyX#C+q;қ1cf烞B>o54֊kqb芭\KFFg%[}om'K?Nj7VFQ[,2VEH!&)^m.im!MePX<2遡bKKq;w6 őFppV8)  &BY:[CV0A8-gǜKOAeXb]b?: gzpb,gI{/iqݹ o+*Y5` i˜Z,5u~+Vpg=,U<: &iU!*+(OOEI(X8UnH7 U{)@b 3B+aH+F0-|lF*TVV)1L7A0Sb  ]''o (XL4 .X]Z4868 IEUp-+ƏpdTU{Vp9ab!x)Vh޾)*)zJ8'tUq6Qݧ0LU3wtŶ`~0EYjqIGUplF N'aX bo벹3iԊ]Vȍ3'*2f L+PT@D#{c5[>NJ[E*E{Sy c~ [,x5ph@-1bIXاbzxbew}Zi`H󁊥M}E}RFW ЊE@ BXGG.ԊGR+ͲxXW}Iɂ lKDE)ۛqSFԷ}TU^+(|QiHn|O#D"Ver[H*ZtU1IQ)IU ][c@=`iqjqỏPV|.PUFxV>ȁ-GHeAV O,U>sp亨2ab߄ 퍀QUE(m[*xVE8/X@Ln:1`)b7OQJr g:,\ü){qW~*RTV4 c4k($+h['a)`TZ*XL_:ɛQEE`Mb[']UQ[Ha2W s`<Z8uUw0"ퟴ4)=- YKA0 ZlnU;t>l&]U?9-T_숊oIJ:b>hD}*/@HQ Њ28(-wGF~|0bVV$3C+x#[Nl!1 lNVZLTTTa޳|8LEUȮYE"*c#B c}}EƗrFfr:DT[wSt;Rdsp kh4B H\ļ}T8XԌo%y_+dh/ e%,*tYkc@bl:a.rEwj(n KZ!성^8lMwsj`EGT "ekޕ{GO?TX&+z!X~EEKB1 3}xRXatǙ`!EE,\C+E0\͛thH_VPZwЊB&w6 7yJ9P(X|ҶR' }xg"ZhF2ιVLCǟD=޴m06ckH;-Z=3VZͼtSZúd1?dmNüfc]\*>4UEʇYZ\96^S7X|gđcoٹ/O)ڥ?0k Hwx)y[ ySU [KhpGM{-wH_M.!ӥB+>}ԒқנW;!mo IDATqTEwViJ=;q*RlZ nqXxb-CZ, YuEpRl"^ޖI;1"΋8V}M#%s7f4[N cƿӺݩ~aXtzݱM~M+Hs7R}ū6$ *x9 R0 k㑇eOTut$UUQy=4qƈN]UrIQ.N{.! |LZ,n+|g<kְVlw`GHxZs"*}8q=Ȣ. [y{3H'UAU > ZQB0V7A/rŢs^ˊߜ՛F2F[cB>.7 \Qm ",sf|mO**c y{نЈBU.%d 0&H5m0b1ե;yӠ$?ӭA.ZЛpIx֙~W^V F.I]zR'0]W)X<,"~}LT]YADWRT$˪:ltQKx%#K2 7t]u2 Ic{zz&x}9%NbOO)?e  ϦHVyXa d*|RT$VuZ1_zXZ4~b<($ hf_5ݭT@{("҅[Oi.*?o5f0Nd^?^5I?{/}k +][tüH!-Q>NVHOYch0N־*NBfcXDkH#ZAq쨭;oѬɳ*Bˊ9CrMojIi ;.}.?9yh<}v7Q$'vЊƒ$_bQ!0#0fh&Vo--³eİ*W]VY✍r/~//1 'pߚUER',a#iZMq.E&V`'ЊYˁTAU}XÑ[,R˾j%GˁhcSj rQWÍ-sMqq} [-á)02iöݬ5#y{K ZU$$+ҙgB+\/BxJN jh$gigQRa: %VʛZ,ӊ}8b.-$(pieɓU$NNO$^M#$x)mNhiP.:MvQ,iwޟx33ĵxfk7UB0rB+19헅X\>iT<)%_޻*ߟV%R@?*.{r`w~-cjg9゚y?k.V#{ otbVH7e3qXYt8~?⇽0e Szu-rS0iYl `2DY\f+U#aޔ >p 90GHx;-剖_ ڵX{`Y$;[xJWz_?6-7.3LUƔN?6H\t}̞0oXE1 N>2oSB-~7= Q f?@h0v=/.*q" V'?*_ w*H;;`20Le} WJՠ\CDaM^(B+F1% t)>Wc'9D AXv4 ^筍g]zSOcG.#`+}iJ@yS*Jӊ/f jȆV@ҠӛDJKxNS+!{4.pov Sr6|#XSx<^>8ۻy3dcqug|lA1\>F#(5(PV@хJ/'‘aѼNb9frUuT?c>XsCPFUcZtjWe8O1H&SR5ü* _cT8 Z15yG?V}ISy@F7=g_QYhEK2JȦmzcVXaE`GL }5?ZAȉ rf-t,\3V&"_ɳ9$TH6e VzK= M9(@M+V1_WL@lOݖH,ntWX?Ӛ]-rm AnW *xVq!\/Gġ0VeQ6Vʇ/ :!V cEo^69@NbsV9rlM\ș 9]Q=| ? _b9j[3-*`+ VaW? }]B+p1uenFb?w1rޑ 9E! ;*mA%7Z1f"w#bM iLmJ$n:}ywüg}XJ#Њ[Hޘ$H,A$R-\%tXsz_6hjjmǂ,FjןV!c Y&yB @ʫ ӊOME? JbhU.tYGY5eR̞~Usuk;Q *6˚L]CUQ f/NxwrV!U7ɇBh0۳1+i1Q.U4'(shFՊerR`f.jQ5Mb+ 1-a޵YB=f0&%܀ = %ALb\.Y`QwyԸS J^+&~^'0x?u 3N秪N';Pw{,ĸ}ş' S`,R{/*9XUwz}ZAphj󈯌R(VȀ؋ueHRO)`!QFw&tCɔAT1 [l;w9y-杮k+dʕg)f `Zs# c?ZIOr$F.7]Pek7'ځ{۟s0Tųʩ7OI|&ZrAk2>󶭴"Et)K(%oˮsqel],e|ZA!phoCX}?E)d3[?AeGS#=+FjD FI6D+ lbH&7+󶭔 bK._:RecDARke"wT21 -vX2mWJ,o W  쉼;h?Nl\EV(-g+ԍ Vzƫ؇?Nq7yڊ}^1 G=r28yrxG`003Wy2 L1 /fZDgH,N?xGZ~W ڐanoݜ r ZV8rV\b~ )mcd/@ș]IZQl* \Ywz7򕮗Ԋ'l` \V xf'Tc\y[ FdQG!9#KLye5gu;ڂs@ж->i|Bq~LWB;iqaűyŧF XG[`_ "{J3<^/R+*G&U wo%'8*GѰbɓMJM@"xѹȓ| OǕݬBâ O(V'&'|ڦ.8!ͻiqGU eQ|čŠtg$uewPчi>Ǹdu[)k"WiG$GOt)N4؄W?8m2V &^;VPlg*ۡgaǴ-Gbx<ɲch<(u?pͤWVyV'69=PԊU^Y)ݪMJ3Y]E&s;ر :uXEssMh`_XP*ݿ`c^We聿9YvC߲Q|iX 9* XU,d *0;0u5{mڍcݪQ7)t 1q-ʐX BJy4 +jxbzǕ)U08_U]k^-<GwQ&)5=7f|Oj}]K,w3gCTWDܴD\iWU4q,\ȸYܨZ1u8*ZU_5fLo^/cs×}qjWqwC&X8شmg2Va@aRt, c:lѶiXKg0H,nB殕4Ro eka7@\G_<1an"π,ZB **Vc)n+͈ٚc;v\^hjSySj4 yI9N2bhpfߴmp ̊?v *eee㚢-loQ&qi鷥5 eGTx<,jYm=Jc_-BhX1m&I&i 97ӓmpaQq|ab%0:vqچB8X8? MX;ʞ (u?:F xV 4]SXs+ >C+ɴH$son(`4 1h^az`B5M5y0[Jc-~"P[a!ܕ :lڤ"P*r.W ״?_+1-cajL`+q]>xz YV??M'U?adQ7e^% hVEU R([w!Ulշ0Ln׌+ bϗA`ŝhмɔj ,B)?ݛػ C:Xū3V8  ;0o-z٭$tڊN>G[:Zt2Gv 7=qO*÷7wܰyVqIӅQEI83Z(B<,@ m&gb޷惃1r L $Vj?2H)lMC1+yeچ>:.{@qn e02kOL$?۲w0jt[Ѩ⿕6A`EM+Vj:L?[!gt6:*0мTͧTMav;>Jb ۹xF5_ !Z4b~YYPP8FXJQ#J fp`!+}'eM46V:}[i>%c$@K  \>㿏<`1hD%{"rǯ 7po ya [ѫcX#^P8H"W b ?0"q`b6B5&ӿ4ْ1"@eDϤ~noYu iE)_xhdcS7_wa? w Ҧ(*;"YOQ/kP W3 ӊulrP l=N_aE?>;QKRS߯ >}ڼ73RbbPyO;qq wc~]E, R|m- +V֟hC`A Rg@2ׂrm 5?9ݢZm< Ywhxf{ -6t` 2 7ЅEO9{CPz~5u&MI'M*@a%!YXXa603\{##e/91ˍ.ab=P8Fw5#wτQ\ɤ?Ǽ4\5HJ! k1ZѼ:̂uJv}ӚneJh(3* 5gBT4l aa\Ab*bZލZFru;aFc0!'VN+!,mа"AU4"NX*K|X +1hER9$7h[It2,Vb9QfJqUhZfΞ \ aAoHbKj+@zXhlU>a)=֖Q֏ &R @: y@|u~dG dh{nP<&|S3oAvO<,2:Q {;}aw= %cTbN򫾟:X_eG R0]Gy8@wǍd>ǦNaWRُ+vLkf ǎAZJY. $FϙY9Ji`T9^ԇ`i<,i AEJu=DIc?%v=/bÇajIIpp[z+-R5C^3"04ZϲǤ-VNxC)-'Lac_ *ڰYVk^=/>7BLNJj  LQƾjcN_֝>EUO|v9?<,V(e YA Ȭf,WpPA]?5m/nlo3]Z+DaZ74]vLVAdg+IUiG &['aG>*KSQ  q69uc`g4HN8hukzJA*@4$K~*v.[u9~*S0T6YMVAtX$;Y\-/ iWLjw4eAB6jޯ _|>z = 1qoUb2},vmH uY+ڴۙ@`o*hT QE-c=?zS<(+E˧nD7*Ic1dZ~J X2& 0~&B'OPPh%0v.%*6zJbJV68f` I&SKUV*" !}uf睸}{ópdeTx!T L0[T3GGPTk"#"UQLns|[AVf+V\bICc? 8%1fC^0 {̧3{Џd}|}g:0!B2X7[WsZ@d, oϑǒnMipN;s~&@]Pdrܜ9- <[!52zyVaDd4 PkJo;}5JƔbo0=tҎAL!8qŃLCϡ`K yG =Cc *xV1jؚlV`u ;TbÊ@؃M=![g=~̦spCô0\2YHPg5p?`"O#a \!"itnaZ i`+]tZNH ,$7e[|xNF{L,PPP axnc oYErAʣqL7>"g8 UYJs@d,U}cVA&NJ|+s~2 (PM,hPT ,xc 4U?.VrG8}cr!i҂j_bgSB V3HDSK$Q̧>yR!~@l*łeUA0b,AG?h dY]U*{ #<,5&SV}tn*@[B}c4<,HJLN0LWyjbASX|M1c Nc ҘT\ۃIF_0cV vA+4dJY äCIO+|-V|!!A 43IP;dFsaCBFd2%TJU@df}#k9 ǯޯRKyjTpVB7D? ,\SorRafTєwT4^AHLcE/aEAVAo"RAZ׀./S/ ,WSiIAbX*ԏn_5𕾦%[w0$~ǤchA~JT$J o,j&j$OmF}k i$(;#$J *N4ٌTyVѦ_bZ![+&?"fLd2%|l9} /~DX1VRC'c䐮;=W}Gi8kfVPQ|X.`Ke~eч1[(fFMLofiŐX bdlA/LR 0(*p6 e}Ja} cUy\nQ1Pf *JVQ7i,U|;џe''ٯT2{ *2R/?avQ6"$@cXECEri<)7A+hYɇo i{r *J̳XR(KlI__/kD PnZALLM&b\)@W $T=|X DoNRA㲌AW9+ $,1~v-$AElT! Z1XAei'T /]%cDhD>ڐJ`aVAsac 0a\JCy #M* E2LułHJlJQTd20XcUh0Zn]Z4"iE5 մH 4 *X+~+}.A-[6T+&!tJTfHYiJD0_2n"(;=>(ڏGsՇ !Fye2Y]8eVL8ԙB@&S rT0_2Z>D]}ct(pW 2 5tT IKe@-G DzG,Z12Z6c2-3[)H&J ÊFNK >C|^R =Py[NeGPpeu.k2Xޏ;XyXPp*悮'`El-D1`t"VT%cFZq4aLsI[ecVQϢPM)>A $R1\xVS!Ԋ8 r/1l25P RfR (M*̖4}cLuKw z>[bNV] eTKчb,dۋyjDTaEP܇i pM?[!{TA%HF@D4myi'Z> x([:D*TS`IKe@FkѿY7RH*`Ɉ|BX d 2f.&]%x1ÊFYӥ6z N&w?'KoC!'k c cd[x9-PiVL &YB"k2* >0W2F.oR5wzVPMBu.XB55xŽ BX*ìUI3Z\(A8zDVkLbKD qڠ]W1W24!01Nʒjegȧ(T3R&R# ,R9G_K:+5g1γ rR`2*QRL +!&-B䏨T4 YÇ}pK+z/Y&iC @}Nc __kQO@ M".O0Zde&SR]yAVc1 m>ﺓrnO}XWL\PhET `,2q!ޏϳ6l mjM&cem+Ք`d,0 &+Yrߝ ,>,[E6 @Xˌ2GbnkkDLbІg4DK}6%7m== 7hKkdR§>K*!T3YCFpy1[h,p?$OBb XaE$ 6iyJuu x rFr`ҟŗɽ'e7E n/i TPM 2GOlUTe˄rL%A*Vle.mpX{GVu(ͤ]!> n&u.e&ОȬ5QI=Ƴ Sb *l nvCi+%x @+B;OʒV0NFM\s0#@Xm,\?k+ !г5k$R8Dp HċQAaE/Z'(Ig->V[8`AE AOjX+Ke0ߏg EB@V@/02H$D IDATӂ DXVRS0T2X 9u+7*xa݇xE;aT| Ke0ُ>c&aY`k90"Vȧei+5CU QbJ᤹ ];0iCC&T `l4`+;F1t XaFRdiqd*6_tp Cٙ[.lv Ci` TԀa\- `T3蟰.D ɭNfmu]a!Nv\m`d #[o,j$qxB43j5d/{$)TKe0؏~#GQxgew:i$^U7ļhk ^bߘSO2GQxF\lCAH;J5kcF/=rt0ˤu&H1id2ݦX"qK dL`:#+U ڄ5P62 5;HoЊMJ%oeKeݏ;ɳgDkDyG8m#/b1Vj!#ku}yR rwtPwH*hqo qv *K׏QX ـ.xGҕ{q +3sX! =E|7[5M̢xJj =an \2ʠw G$* >*nXaG+ӶibG]WhWBoɘ*GVs[,6X,|Z]xIk._0`L *pV˔cR'BVL {LE/1O;xR5[2& %$xeR-~v W0R1B5վ".@{BKe؏Ԍ8dCw!Z1 0ζ) \ o^w">VHBcdTK?-4wH򡀗> Uh&RZA^P :j,AS?:6ߝ=7ɲQ9*xjay`>Ӷwp]l; .s">YńȊ=4t=X꾱WLJT)~H׊Icc{zڎלL ѳiJ!~|3$m5Vx "(TZ\X# 8o,h?6O*؇  Yf2X'ɶS`0u봻aU,}c8;% zd*-*sSE X 2*c3gB*UX"VaC` ޽4{jwAOɘU"+tľJ+p$0RY"`=*AXcѳPc b"Zj#Pb=mZKmm`M%cW_윚59w6=u{[XaH7HLrGe "X:2W (4{VL}onc{6bmmm}>VԬ^\:$B*a Pdӭ<_HDDP]@+T TCyaQ+5R9~ti+"O1ݟ YUC$h;ٓ{i"ikX\2DrKW\/EVD?]c7V1Vx#8TSS-L+:{hAX *`d,!]!1X`'{3SXؚH⟁tX*?i.iWഒV\ zӸdl<Kx2s6$ z]FQ[᥈rG&*YD* yXAJP 'KP+wk7cIp X![@&ө` ]V"Vz{ǎG|s*KD.!U ;3[Rcyk`5 ԪqTҊi+ETKe+5𕾦^,i@+RmƏD[in0p5Ⱦ@@I+zߵh4Z b,=.ќzg@d9OZ˸oSUG#VRb AkKw2!NA*g1P;WgͲ%avvlbdE%HEW Eu[w<ӊL $ EVA>)hӵ}c^[//xN3Z-t  *8hs+eRp?{C7ݠVԊ5^kxjPJ@&SoW(hERqq߾h;K?p```pfLLFrD!VYa#E@}c=I }˗ڰ3V# wr!+,T LmR,uRx|Hŏ~VLvV0ELe"T\GT*K.iݸtا <7rmt"fKj|)òAP *ꑦX*[ߍz+@כoŪt XQQ2R%"b5gMȒ өT ־LDzG*"+q{ߘN}l0֭Oôm_d@ *J`Pj,˿ /,r]cҊ;m VHܻwuK`djVΣY \r#KdnK#Gu r!:C.{ _3I/ݎW>uzCaC5AMTܶVPp֊Jpi,@Ά7)L(;gĺZ1 ze0HzC BpD90U_t\Pг>+6oTlJ$jϘL˸D*6ė"[22e 2qYF1Zo JU% C>`!L3@.0Q ΂^c,feoazU]Yy= ghTv*Tj i-¬ժ͂KQ{\.l.sV YdyƼmxӪSiRp5&vNŚJc[ IP1n_C R#4h,U:{z;0uVeWrf!TtN[iq jdė\B|YP|).2bԎDo,l$Mb&sǒ͊J@OlKlS8&Ò!QKKk(ʉY_({#V5 T ;& k$0LC"j*!L*ɗ*ɗėx@"+[)&o{JTb6zo^ɏh$oBTDmT hPi, -U455ĖXVp~sDzV6gb:tYqڦE]:HŴP HiD*VъlsVQɬǻ7n|sx}c4.h^fц+=$MCH_4d7IPbm ]R혺ʊfLe-OfhTa3]VA5JL6W_JT]YRAVòGPa7gh)=]x*ZWAɗyxs^I*DZqܟU/ Ҽk9^s[g܍M/f,уmKxAD«KP|B+T h ZX*ĬNAKXI-ekU?d mVd`-Ӷw`TV{MdJX|O+IxV䗌u_XO*&sgN捫gl n{;|=1/#g <%y˶!PM7.r 8#,-fڌV"dE.VL Uh;VjT>@1D&,_Ɠ=Ӥ"gXq(9p b~U' vZѥ}c](Jp⡵Z^ջɔP|X鐠A[2ccVVޓRгVl`Jg@d2ծڴZ|io=b:^S‹PZ "Q I-bK`Ѧ|Za@ٯt_L?@J*!To5pLP,mVWdyG.`N8߃ `x[ %L/ vlAL(Z**:kg"{Re{]B])g<KW|Qv&UŖQ`@?(B}ڼ aAA,-oĬ@_i,lWj0RPЊr%f.9p6%9355s??dذŗ [H!BW75=۔H4 *R;-D7Vʾ1Vhl>i氀b:'N |ԕCD:Rbr]0C^k HV :,ԣn=JC憜7`Vha9֖ $lc$9s~jjaAP寠STYE |"ѓDIF*TOʶEVHQD: ʼnމ7wM9`ڸGe=18tc 4ۀ)RUișH tTP4+[0j[Dmds|yCI˞Z1 Z$B4mKO!4^bCO&ĩ.L`p0% U ٢GѲJ!Qx8K$3`Rq,#gwz6FV@}c .>T,6E>19&(KU+Pn tp̌ee, մސ张Pe:Vn0*wXeSn}b2L]>>~o=}lt;$hqi2_AP4P0jYͳwo_z<6/M5EC)8ŃL4cV>u [\$Z4EAOqcAVsl)/d֊5& uqjngjuPwW;H+^x!83V1%H<,$AP>cDC IDAT+ ఱTO ~i1b*d+l_ <-ih 6ǒ/Lbh2sGhE,ml"q3gEmч&r- hK =? 6kPhC*8ò Ev}mehT4!@pX&*6׊Io e¬bf-/HhĜB(4dqXEųD,D(@d6B+ItQX7wOMK7xQB.vXzҖjtAE % UvuXot&Ʋ=ae @\Q *Vksz@yvKɰ Cm#ӲJX?[HV@םp BK<<@ P4_ac  2"Ђ׃)6#Ӿ*Ld-R4a% ZqX/fkU\oA[fFU3]V Ȧm- P]n_/5{uD)*u.zLXB2?4Œ1X3"bf]M/ (P/- t Sbץ'wρ…=oi **a&IcNG}Rk$0)Gh1bbچH p.17rOdJdC|2(*;Y!bh67)j[4hSH>6!D0\GP@Q+ jco3Q8 6WA!>=|RАE3 ࠱To J۔nw ;b\ <_<@r9L/s\jRļbɻ(.o,JːUT/EbO`rˆgb]\H#̘$NP04LcR1_s Lبw47C/`ZobA xc#rdJpCB:P2&CQVUQ+UJڠ.NHnQP\]OLNM-(i\?\0'j#+R *R<,}vWI[Dz" HBTTJpM+y듲'޺Cn w3KdJg5E,ruR#± i9ܹ֜_+E+ 1r%V@Q=]A'{ywMIWA,sByXYAeqc:k2~IE]WZ%sVL U3Z{x vۈvត=L*zoݓce~/+;k)cR_BN}Qg>FbXnNn9D4:^ bբG7ЈfG Vdd2.=DoV>DXw2d$kvcп6MHv{+h, 6ap9TXh26˖E,?ڏ) bظ{VARERة`|\뙺`wmJQXot.TSV <{ԭJ45+Rj$@ JCVmC$iqY*:MXUY!D7B+W ˩d7)(Nw-xP/GTd.vwqkIy LHːnIHVc@@^fВV]`P$&6Xj&jJ_Q*FPW͢n#W5Ƭ X]"ľKz‡fo'PVa*f+J߅iTš<;_qsavrl]Ziw,_)84Oel( m:7v~iJxpzB=XyD7zCXr2(}:a dEc!о9Th%`_Xj6_>ۛ5&.e+{ppEgoGX*E:>5ŀVAgdi,toL_WG(&_nQXr2H*A*U0|}ڙ|A!9\Q 4KVK<ͥVL8*\X!<,u V,YşvPk:A xJvOUeLz҄sΫm\pynQίGӊxbc(}kh B B3k - 47etdTnT@nRрX]* #:0h]35BD7V{gA@%M?M:vgD띟~֝:FU@"I7Q9R#, t]% *뜿Ĵ[+& ZXJ&#X u 8haemp PVz~2+,dg?FU|)G4ykf8b26k7!"ހ;ox#o_nPLUU,'cT|d] h?Љ۾HqԣW댥$ 6Z1hpMHtl*2kg Lf?;97[;7Bĭ$W ݢ Yw،HFb*\@Pu|a`STU.^@u r T3+0x,0XJr|ҹjDTpe`>L+޷_1\ AM.V/d%<|_*wKYaB(#;Vg;hZqSqv;6瞼\ hE*\>AN0:mZ)+0.-ɟ'74LEZe,%J$_)m ʺUؚ嚁U(=;S:Xő" ڴo,-5x&"H{^g$Х(hȾ`pA]*ޙPM 4XJVo*ϕ08QQ+&Ł"h#xъc?VᄉXEl3Hɰu #+D@nNNݢb6,m;7Njt"HE& B>V4B5#6k *dxA'f`K {cW:BS0.U؛ qn*z-N9 *莬ϙ^lhRn$]ʉvhg9e+P& Η5Cy)bH]S4 WGɦ28e2 `pauг `'H\lY ]u; .] #o93ʹӽ-0u˩.rS؏yZٓɴѧs}`hOqt9e")];QVI1Jic&:GMNP#ljܺ6JA<~FpAdo\FfYOd;nd -jA-$}"ήmˉr؜Vy?~Iŗdc M%.Tç v kGA;U B6G -qD-:'Eĭ55'<iŋ Z.eO+Lh bv07 ‗eG!7l)᳻%j&Ʋ7hQahGpa6=OGvCd8 n0ؖ};Eݢ}q$ל.V,nM\wTDM}({HU3iA va,g 6W3j$p"ٴ)k wDVH.#ܢ h[EuS7AFK/Sڮ均EDYR ^5|-H>C?{U VWyKG*`T UxWX.r"zZL*<~u wDV@b2JJՇ'_vv O\W.HLkm ˀsėDqTJ 8i\_qp T Oτ1E7:r戌-9: )5}8(UBF\i:V.{Vz{׮_~~H`cֳ<ϛX眸޹ir~.$@H11ac *m_‹ IDAT\1 kdR\0+并b2fbf(;/W~!',[4/OFweJU͢Yqaurmqe# t@UPC1 #tQ+= q2"y%5܉9ҁt͂ +[,`Y mlJֳ[J0E\jQ85%6/kU'BJlJ[tJnQ"Rl* |v:Fciq %b`f,xl/@䭵]P wguyE`[r8#^cv '鞱z6$wZPǔrb9k7A+vR[ye $]#)>|XgJO+X`XBucJm={˃m$43v% H]ipŒ# r) 1+FY"+x6{;q;݀ΚuU8M\ᩢb`X?-LX@tԆYiTSK^PDB `XXa#o+`[1 w "ZAj}h{f$U^vx.C=ia_=8U(YyX? H .6`AA 6Xؘ̤E|ݪF+ i3Rʹ \P~njU ԿF:FQ\on1&P*m` UYsdްЀ {tXP2; YJFֳm^l+&?RI+ X[K㬂Adŕu `i'^L>: LubqQ1m.4ԘG1Yf X``b,}Ӿ+Ŷb2f+)V 'VqVA"+vfr ΠQ.' Լ8.i-A:,50Ջi45q9{F8l\QAŚ la\=wR{ ^ު#j_I4If/D3l6gQir qwb9R:6Iô&8F׍t1:A.vDP1B`lDwy6[Z=2b8L.)P:T؛К7.ݡu&Xz3yCl`jV<,>"(>K?6&O蠢 lf{fԱl,[l+&l1ObJ*036aV&X?"+⬣J+rF*W;79W1o7yBC5ʐsUPخL$ѠcXj{<6~o• {!6a=f&X;2ڡ(df 6B+;^HO%GYm-P†mRqwR羁J/ުwY6-i.@a3'JZJgeDxb h ˹AhljhT(-1{yFYR;Gfǟ``.VH{V@>d\m]gެ:V 5ZљJ:iE?FƗ2b&(6Kih`<ٲBp}Т`, `Xj'xdXuҞF"V0"-K;KdE  r܁UtoZa%Ha92XB|%|K<5vhz OlHSgXj|d f1p-B$ъJ+>ah.&Ƭc_1*|YQD+zyL+uM @$7PNF1 , *JkX,cbSc?}~ ` `Cuq9X`U# ӊsTGiVg3z:Ҽ4_EhP!B5eA%wc Te`,eQ`IZ WSv)&$kb+ii4z"&Y/"+͂9;ȋhSCHV8%Bm.X6 ɼ9Aa啠XVR[`>1=𬴂Y]cP&jG+am\vG sQ3^؋#~pSAuX 1%(3#AfABVm+>;r8d|A)ؚ˶py66 'E2 cC+zЀ9RaU$B. q!sJ0xM.Nʢ ;ʛ dP!!3k,yP,Xi[?4 mDhqԞ?g$_ъhpE'4sU[wb$GdE~TB+1Xua*6034=Flwag9 L#oϐ\AnʵFc $TJX5c,oM~=4x`as_G-a=w+~VB(`G+U#uTfDžeA맜9(N+aڏЖcV LV f8p*$ƜRRv"$_*xNoeRjXĠ,U¤Bj+=|EpyXoXpk6Ƭ,?{FIE.}:ƴ"ôxSA\%:#Q)ј㫅K7[/ `mYIK|Ůudxe< F15s**⩱B2 BUu!Ҋ av eV;-i74/-"q2'}$P}WQSU!9f6T-pmRp]:̋LԆM *f ,1c2i1g75RGVyX\iV!Ŭ8gM B Ӽ3o@00rT|vh`*XIAW+7[$iFcss<-0^OlQPJ.XCRӕs~ maY_q|g|i|s1G50*F]v8.l4 C_i% i鿘MU+j!!8hEm=T3=)P°`1R1:;(?Ej=H̟6Y~ 7K+zg3߿p:Й8M쥬. #L tg+H LrheR)nER&{xw%}+P¨Cyֶ1c+5Sh\o.tUfXh5OgIx{z.q~RaT~» EN dYoAƆ;fՈRz)8Z)NzA0nl/%Zc" @z~6ތ|2(7wƒŏ LVx˺XM;% T  %_3⻱7s RgS5E C;a)bg_aU:޾y;~!<&DJ_iED0Xt*e ᑮh\Bٿy LֶBP9zm,}Ӎ^LR6;]K`;#BZ[α 7IiV1d}6} Y|캷XJ STͦVxFZZWZ!FH.Z*ouck,ugP;^ߤq+vWhH c w"4BVR~b MhW4C*9j*vJ`yXQ} VqKĜe7 ;"znCP[\K"#M>[0Aʼn*T(s#X]_3(r̎cۯDBYQaV2#ؗ?q[yb{!8kW&JnuyA3LX+HL1=4g5RtKfn46OB5M?TPqjJЍ?#k[Ե%]Y*vN`yX#­<Ͽ",uqpB"vb N:LM50<$ZP)[-ðtm?DP&A -|ľfX*:N*Z)5˧v 0I+j.>0*zXg >ÁXl%Lj4aTS۴sB!5)Jl4fcRZCߪT(-i;:yRHPpňCO}VP` DܐZ|$ZmHz ȸH,LA1saj D}ߛ|6OC*%,Y %*A,dQX U c"iws1ʬbH2~KnpPnOVbc bPEr9+u:b1TVL 27WZ"t8_bH 7<A6`K=4(? >]SBk^+ b\*pX,\Ǽk95ih ӊIgʆ"0%x߆,j b1!tcLF;IPJ͡duۣ,c, H *i˕aAeYŝK`&aNA B8n}+ 6MLJwa:a)D 5N`li &&PV6JTRa R>J+>/'m.&lPUD& B0xiJ,BW9<~L@_t L1nL{VxTȢ~mTg+5;OPh->iK@X꩕0F( yX:Ињ?%"-uJEvbD\yhoq LMK;P9.+h6ķ63DAE" 2u^ Z(] Ɂt [yThS#cO! d'Ȣ |&ԏ%Qc60”;Ѕ:ҼɦAvHNT($^ڠ@`3 F b?i/59Yt ?@Q"1!K@sV| bq L3Z~t%ACz $!;XP0 "40 Hٱtl\{1+j?+ !%X0vQ/f&80ŴbpWhe,C Rvj46 v;[P@VP7zn#gje|B+ʮ&F {X~J*t;ø<˘XH-Ć,AEt{vz Jy[z󰴣R@YaP*%GĢBw&dYE`̡l Lw*nV^F |} ,鋪@P}(tqƾ%Rև;vș G%Zv8ݘ Ə3(.(UAS|y,rvsC5bJBԪt<ڛB z22|ϔcWeo"4bI#"lCsO A2~8`w()`b,!+M3m6;QBA&.W/l4Uh,JOgV!C;+ ¢Ǭ^vDcVѲG"pfI!8!hَ40xM70uRff4j [3ӕC5AE{Q /jf1+dh żL*3i P)yba*!+F-Q8Lmo6fs? 5bASZ @PQUK2RO>%> <'cVf*M_1{E IDATVbpKsVTs_ibV9ZA$vۛ 6l#!5} Fy0*cŒy(`yh|R1e)JǬPfҲɢBX 肅~b8L)0Dp$gWzg(FcF} xvZs1ŬUT.DbCbsUh)ܪjɾ*F:5hh>:w"`*- ]g͵8rXaƳ}s<_ XjUTUȅvB@,N X8e) JP\IȶPј@PC0=_kk;A8{ [p[1rxx^.@ %bݷ6yV?  !e !pX,%u)Di>?-_ (ekVYx kʡ$TSAHAnItmOLNC7T/<+npZ@yKw8+g' Uȅ<ǎSĢ4:LiS2Tkʾ*Fz5b1x~@*cmm09؀u@+Ԍ <='&lLM1|<>ycߚ:)X[ž v fujٴi ӊ0]J*T\C4 -u)ֶ'JZA6xw1xXJHE@+)Sq+c? F)[._.2vB,.wH 9Qo1 ".˹r5hL`af 0j9~=@fc6 b#XIE*8'X1/Qhv:]~I%(,D8bdD|MP5R;L-50Lj'QB *!)R 0 UC[6FO`]5Hߒc|@*$)+.VB7|}YEa!d0_pا @Pa}_n[XꮗaG *u(  ACǏaM7 7|J** !RߏnVW XǴb^ef_a9DžrmM7[(&~ē7Um&œiQyRZDa~O@* 8G0 BkS9mU_yӶkh*T !3w6֝)AXd!:Lm@ӐZa!jՑԑ楚CCO?~*LhA<(ެ)/@Pa$'?YEVl똏a]>!\ Hs<x_k&)cBbs1Ϥb{{֌hA"qeiE$!h`yn)sUYf[E[kŚb Ě6ixCJ+*m9F5d;x> cpxNr*J0" Q+/MVM !n>}2־.ې%:L9oy&P.@6Lak/.D:8пt4TX7%4mAWP_V y'N>Ǯ:o>`8.-t?JYԟWyTBH[Z"{!V"% Ÿ~Pk L]V՟}Uek tsx7n@PaOӊ*?"]WO H@+aNEx^Y|(k`0)AgxA.~Dy$|}G0R2W&dYfc͠bSu˾*Kn,x /6SÑ;<“ӏn?~ 2*V%z J* BaHLin 8Iy76m|4i.VtT濫ZXE E81}1TӁM&~)G*H4pezxLJmBs:SDm#]WyTHvb)M04ScfXo`*^ Tsb*Dr)R?j:VU0Xz9!?z8I6p-2Ul~ۂh湗%+]PY~Ƭb;'o`R^n ͺvq ɝY .>kg_QB@sCNiMV%Z;B*RTPbtlt5_tR"q>'RY ft7/>N(FY.\^x\LUy*WȠ^Be0d:s(c3Ť)CYV]ȦP)6-L'>R 0!`V1gAX=,٫TUTZ+y67_+Ŕ{(<['V1-_i)h!争B&t i1H&wfU܇->b׃PkI Q d?XO-+fĚut10;Q)l&;\t)oETUsNT؄ɀB!4zSW0 G<~,ZL]H5ǟGc'1l q5-HǍe*c6{ rBUI+^ج`[h54Y)3uӊ9Vʁ~L4ԅMX\ԩ` `S*VWb\*(0z"^v3BHiBJA+Ȗ|ÚEk1ZL}Aa~fXE9nΌB$QZLB`,Z@&+.ls!C~&T@YU XJMLBO Еvuh`jVjcisԠSZ?,m@UtrnnԄZ"0z$ls6^B+jw(x|auU XE"L !aü4!ɰߦfc~FIŠt1J)6DiV x"Z j 6*r!ŠBRA0Jb+cg0$mڲr qUxe 4Sz27VTClEn_ o BJE pcZaOi@>J">-w`ԇ @bh?:ɑA J*"0z$ls6;db]fS}MJ"#9w9lYE  !oLZs= L(DߚhSA'j1u@ιxV55*Za45 %OX%ܹ$m&lH "-?cbId5 J-\) S[ F(<Ѻn-. ~<\,O@XcЮbo|Rx(BK .ӭpq!KDZNQ%Q":R !X$u$d-9r!;vz3mi!-.A f\¬r|N]!3$0zjW @* wEy5giB}Z)MZ*msF tPK?Y pX M 5;1'1 {AaTNP^X1TS& ؎fPxb[՚+=%Ta6/|**i"=\'d]Ji?B[6t LF^9S*?z#ŠRPԋhiumVOzFazK^\+J*fS}߳ RY/$dnaiŘZAyÚo^s#!\bB:Sn?Ջ:*F0A~N,ؖ62>62c7!m >/ Z<%E8&e0PFU؎<,߳$ZMv, !DVG,5ZL]Bh04 D #ԣM 6 V`t01,j.Vơ) *9rcRĢLB ^ kq L1m^b .@` /V<04R4]M|v.EfZ`PIͳ =6aUhttB\Y*dJ7Aqz }bLNgE-ZL]H'}h!ŀU0qzFRCfK= yaS6Zrq ȅ9Pn xmK>~gRBȂB ,٘] L3ZLo|&Z̰ZL]5 b )vZ% Roc>"m0:g IDATP'i!*8<-ÁCx8Csً$b;6|sV1Ob)I$Au9L:G_Qcw i1a Viu6C',>+ + E$0zیx%bpYdw XXulm!M& |sVWV % Yô_FfQAۈ$:+][@VGX!%AϥhE`,<oe&rx OhE(5k; +TYWaOʆ>YF M{HVL32$ L0FhLE-W bIs1\VACg cA6e꫰h9͢ZC FK+*W!!`e!dBHqBֱUdZVm`j"3-NM Ih^UVŠ}+} V}61hL"^0<$ʾzo0?%b׾ 7WZ e!Z!0!k8}0aMޤV,zg>yJ++1b<0ۋPaEy`#Dsb۴H +^rf2B2/mԙ%[8n)0CqXP ӊ0QM +[;sU_$,d䄬lvR`\Bn r:JyR2zGVV:MDQP\ tb#<$k +jcܟ|fSxl-Dif1[{ \Pn * _aU&%DBbcfcd)(h`j[fZ Ԭ=s6OZb\)$GRqI:bxݰkV|BI^*|kyh6=++0*RRfn1feF0a5 _{}X,dhB[o{fl55@+ HEM%Z!k1S` [bDY`qόAmF x㐪BU){eo6y8l8."cܭ5=B.aYE:|`)B&'"Ȏ){ L1s [bf-fٓg/,h1)ӊ=&x^o-4>ŀUV% S:kCogLabzKBJp'c*䘕tWҁf^rϬJ BH&O'7O2%#FAI@bc B.f! `juEl[Aq(wUEXa,бtA$?izɎVTHsU"I VL"沯:._Iw6H怇6e`9o:Yʱ妿hq6 aY_i)BE&vB+gIG*}ӊ'~'xV9+ӊ_H'|H* p?ZEPaE\qa}Mc/;CRfT:j{iU!|HP¤"X[in妯hE ^{:pDLs`Xi|`!0{JqL+Hg1s1  Db"aE8g_ArR;5Omj_*27$Ap2d[Dy(7ˍ/FڨBb"tiR8v?4bZ@ٖE/KzVz^) ˤ\gIhHVPa M EC/Kbfݵ'TqW`n˲ PnBH2\AݶP?3̂A4rWZ e!R!ӊ& uy%GZ܃lvx_"" +$cP)Q_HHh;a]I?]]y0!iRN%-'# Q М(XB> lfSRT1p?SR)%4*0Ƞ~!Qn.an[M9Y,)xs: _i)f"V !/ZlJ'ΤD:w:2dOno3bc> ]wu/PwHs5%Vf3n`8(qGth=- *Dv4RRAɠ?Ji(7}VSr^K!lH wRNcb!$Y0#^77og'Dd6:?tN{Y:0#uR#)j @U?s_ Q]q}5`,-§ a' ی4eqj'T|O_Va)BrSmʝ/vbFLj!dwXAd'SG±n޾ cxnzLiIŁ$rVҊLPaM6k+RoRZ;5GİM+Y|7UܐSc(7O"i:1,!bB!S33XyzrܠVI-ۗX hޘ uS^dJ*'X yX ҊoDI ӏia^rN{m21i| P6'2 ޯȓ `9S(7rzqZ*r1$46T1dkRX*zOQ`|'S?EG D}J+nXFiBSz+ʳZUb.˙f_I(1}Ntc[L*/:+m^ܤsⲬOCⰺѫu !oc7>n"qA9FXCo /T?.Z+bFI\/Gtj * ڀԊUMh Y%bc  a2+l3-_*>Mnޯ]! ,ފrӻmYփNJ!B, ) O݊ɸz*=KĦX~^V-V4J0uBw X i쇍l> 'O}vDXkV$l3e[攡Wɿ?K/SVbZ=]GiG__4/Y>5 5Db/M9cFJX*A5a^-6CA?)ɾ}lO:Q[M^0-*bF3R1b h܃f!ӷI҉UN}Iw`W)tKЊ$(Vg5S>ՇY~`7ݾv!qqf y`0TR >0m66|%j.>Q05 k.V J%Q]ZaUjŐ-7!4*v !̗oN*D:lH-ݵdaQ'"&fz0˟!􃼟S9a^V cGny)lsB 6* [sx W1R\/ Vƴb|…D"qlTkiӷʔ'mJVYhEE 7odA\7a??]UaEc O;Tmc9c. $c*0 Y`|sa1$D1$ڹVKo bvƲkVhЊ5Lh(Lkxo} pf5` 2:\[6{(D ^e_W6*y$3hq\ 67%?񡞒i {q[Vُn$^ *%Ő̈-a_rRUA'h.c5P pČd\`=*'d/:lW<؉b" Viy).v{P]{??- 3PX*;ca!WuDcRAR ڀ0HwU4_~9ZlUŐUZ ٴ"93,qu֔Nw*c\LM_ m[gvfmچ„,L,duE>hV5`TP1S~Db&<$/bV\a+o,]^}͇6x8jO*"VaX%( &(L\ zFt"T]Ib/V0-i\tLb=pJ$Q?q v"H݇ןUfo'K;D^ nnlTԑkRzѲG ,[id2YIL1XUQn6&[o^y_s*`*)(L tL(:1zuqUG3 rrc: !0GhKeONMȂM%ެ)ƂiVK;(@ Iҽw{/įzCKTX*A6̅mB$,LlTnW#B!@6{$Unw?6Nr]Fcm+tA[h(j*?K*ϩ87QE>b7¯AoB,yyX j c?$M]Lmۖd}X*!P#ݧtԌT3J*|${r}b *7 BG춱fbH-4ʍuzo6QF !4\{la<=%Yb9¯ ڔ4q"{~4D]˻➚8 3tz2CϞ0f4lOjF'e_)ݛ0ü_//)!-_>-1BG Sc}&#}Di<(Bg~@Izkb+_ʤ"@:+tKex\2 ~^SW*: %贙UlI$w2yO{/tU*ɠ4R)PYiN_٘qJÓepȊjъRq ZnP=0N.%nرgɣb(g,-wy2WrZUޘ(̰i.Vs$у++fuIl C0+_C=uB:+BfcT;$!k(D3FQz}8gsOZy _@ bV07w7w؅LXX*#ê6+SRDDAfV ÷Wu.oX*bbHmR[A :Q쩬4:|TTX=:kk[f p)vZVB b&~XKyn#~,{3`.k,Њj@YaVC7jN1.#}òX%D]2cVf`oZ "d LbB0:|M#}P#4W> 8\jC=/ϯ I z5 t~`ٓO.BTFU NaMʙ )cUiÈdnrϟ2XR 11?oTQAioBV f<05bh]Eęb'Ģ}uVR `KRqcñtQaE1`,Њ.)lS_(X+%H,Ybq/1= "Q !α @|I1Ĩ>N-1( !)r8L]"ԅD* ӵ6 n_*h-^ v5/Ȯ= T' ׿ZpSĆ9+>tG=b`I;MNq6eCI)n뗾Џ+P4iuUPR 1R I#>`Nb?~w |Y9bӉh@J1_d&^zvCw *f RAVZYP|%g_)p^q }P{|ܥTQ1蟛MSYl zړX ͤU5Nڋ0P1A`Xl1k R AV5?'+w*f_)VsŊQ\V*7/ٻAV\,!Вk?,*^xąw1Ύڐher)7OM,maM 06- hI ,j:ź3XP [&捥ZQ=37Xfp\9OH*5pM`*B,ڶ4Un)V*3igz/Np|3y]b¡SA'|,E4SVbN~СN|&6O #y2GG,\[$[ȀH,t7w 9nG@fREAE X{&رDbY([Z1JO+ cWɶ}vbc3{Њ(8b fRۄrꬢ5d.$nOZc-fhq&lA&fA,'  y?'x:`:~B%[fj1C^pxͤEʱ&qHL&;vµaEc 瀞'\^m N}#^W %jbP/B $H]b;"lj1]q:Yi'Zܝ J%v ´"0ޅ_NȨ;%BPmwJVj 䁾D3)Aq{ Շtc~{V2Zk59hxFejDoyST>⇢ô56hCVA* a9Q=?R-&mp#4Rl.TH"xMT\7m~L0 /> O<:#;%;fBJՉ&H3)AIlDUcUvL_R=}|yjK*T ҿkҕ}Jsbh[XŲNATV:sES3Uܝlj$_jTm>Sd Ce՛;$K؁5 fRMZ$dΨ=fӧof֍2<,✀_{=vCO aTW _Vm FܜeXB };{``,awٌz6=o1p5v T"IGVQ^frbt6q)%fwB0%?>s1=R-D Ѱ<-X 3zͤTfh1_%NgMVK%wi|{ ~^sX&l3J**mh"%kBs1K:} maDSVL~ Yu*,(1CL_\rYqh01Ի5%BFRB:3)=#/`w5vơnoX*# pO&(˴Yej J^s"T*B7miQnZn~QV&o8@,*1CI*\Fes)TH ꃻI %LX\@0қLk23h),aj"| ^t]m)$ `Cv٨YwUU.UbQb}WR!w F G- (zZAj l E3)f9WA*N'n撦4쌥2ޤ= * W:iZ۬+ e_) ,5eEhrΒrBX(!d)Qb6*1wVbov.gqqgsLދ>-PYN\%H'a6.C@zCͨX&vl=5GTFt @= DM2U 4K*hfl.V ڶ(Qn&ͨyOXBNm&+L-QbF +1àM[8/kN3Oq=>4-rb67^$Wq dH@{oJa,O\Ff:25>+7͌ 1/:8nqbRpLb&M |zbϡ DKJI%f~G{~["ݬ8 ؿ 8GPB2y[Hy)rU/|ZB̤ͤe ^Mh :e2cE3{l2<,Ղʁm(4}njm+7}*wנ'^&%5%޻qeyl Lۘm -S^hvvZ Ee-61 . 5B(p4T(ZX[PCHhh5ZIk(ƔⲅY¹I8Ȍwq#l1`f22twiǺvu)VGAUQl!tzsAL@8Yd&%km^ PZY7l~e'UQ0[;vw7jdyX2mfҬZ4pM*VS>fۊdXLUl1BoL0Uq/3o.,NMbG'xNb:OUVrl|?#Z9 { .jQS3zkDXa,?0 ){XZ%AgVJgTYu9hᚪC@UQ>؟4dr3a3 FY>rǛI{Ob:pl(SWfTG4}Cm!}҂(rRQeݰ,$JLxh:,C.J[aw{P.d,Bf?΂+D`x!|_;UئW ]NrR'MhߓS *qIL&zeߗEh*(ք{@^hL ^|R, T*q IW?]sZ.T7$ͬ-7^*Y̦Pg?2hy景/M{39_9.r13No+Z2Nn.%OUKd n~sT9A&*Quy+p>Y*Xzt[+Ǝm I|*z ̤bHu VH7$ɧ>32(r)ʵM`dw2'𿔩d MVcNwӅ@~G?Vߜ+'/dK_{UVTC\Klķ\ cVT ܥM#]\pGܬ(},VS#TUm>#$)dbj/D$fhw? pg lm!4{d:ӛ"ͤޗܯ8/C cM_^*YV Bl.S_mPL_!݋Aܜ&LU5 :&*脨wkIza[ȴɅT(̤&r1a VT|KK|Ed7|Kv~ҍ=Y"Vep|L@U<+r13dW2M&.;eOF}ąmQc2:!$3Q/Qt?JKo44[YH-DܭL b&E|M~,#x0V?]XZ%Ê geA}Kz ^5 XFpkU9!&TUCTNC"&1 b~},o,ҽv>G7EH:3U{$T̤#.mqE`,ɊhUTgS X!֏l~.#~6߆\̸kwF7YMn *FT91wHqĕ+;:iO%0ƣ 3Z}\iNJ NOCS` YITdK!\ 6wi$*A>`|~}:O6{k`ϥ PAtfܜ&7S[ɉOv1 MkӚIAvKv?z 8`)ѶP[H)>oID# *|I n{r17gwiD*Yf:3?醷&ϰX ,z'7RsNęV) })Ds))3׏m!-$ӛSM4I ; nk@m V6/Bo]b$P"NnvfQUA&1ujB:xe_i((aϓɗ/"w~ k ,-B89=`fR)rbHn g{vFg,2:NFgԙI}+1l\.SP*ˊ -q ĜˉVUݏ[SUQѓ|YݏAވa6 m$Ktٿ xw].hp^ݥJgԂLV{yᆊY+7Kz$Bb&|Ҳ_4ʉik&U:QtYAz} ~:w?xK _Y@l!4{!iӛE{ zLͤNԁbt@UچKt³4Jci,|O&\ t9!kLUFO7tLcE)ΐ͈TE$A$0$ˊS$f # IDAT[JǶSm[Nj C$:/h@ohvbHn VxuVǯ% 4y nTja .VT瓣*BaMΪ}sNbzO0k'IiNG Al!Zw)1aXELI}T'y٪@7O+Kq<,q2@K$Ij|^!7膱 OR4ޏgɯaCx*+U6ڇm椻&NY؟<} 15L\t?^G-ELP[HBVogH#.̤'a /gmØn‹4ciLV0cDW;27Ue~1O*"ijۄW7'1BT{K@ҼfOB7GіpfRB;=Oa +5,"  NU5.8[q4kjٯ*bP,lBI̝'1Uۆ䕒|7<5m[,-\R:遄4t4ĝb-͓jkw)KpY&#@BPº5ÓowBDxa@6oۄmJ%OUT yh$IL/FU~zKEO3Zl!iqz !ͤHbDC7`Ū4DS` @wǺ...]c( }f|%5 9B R<^TUDqR֓щ^HVݏeFyK ~CJ7\fRwr;ޖ!tVhn،U<,ȞYj+g^pýA@O-ޛDC檪*// d7U$ҡ*|H1d/_E/&Yh ^pz\eo/+ͤHؓ*1`4>ci2YO*kq \z0^>׬ )yP8>"*Le --^.SeJswt|2\!L;!Ʋ$bU7)ېpU>O!e'[Jc_'ӛ˃ -d<Hc)+}}, e(pػK0jd"M'=P(P].VaqUA@ᑒʡgo E9FV[\۲q|YM,B+.7ԭQNP*5; &[Jx_qDۖS-$PDy71"R/#7da\Sgw`,#aIJ8@DXxQQ 2Y-[ |^T:I8B o uJ쓘^Hy$[JУufQQ~h& o&Eߚb0_u a,laH&,N",D o< N 'x e-jʊQ&1`UST@c_Ro]007j2߬P~rڊ̤c0s8]* z#LF4ŀHDXDgDT|!tJ}yآ*ӄKb (U'Ç T]pCPжr>1`Q 3nr1rv'pB?s b,aaP-Z^5&, ZT| #ՁO2N]X\AMU0dE*yd$R#?h Lo`ۿf&edr\ !̃RQUFdh9lV -k i5̟&FSb3y {^PX"w/x^ё 5A{4 VĽ*22/Pe]a{ L:L0]c"?+lܥKdyXL OlyeA',b,~GDQRVI$g8g? @½C^ۖbr^̤lx&|,CFH^`T ciLV2+wNaAc,QETؿ֪Nɭʼn+:Uq(]%e_'S%*Xv?{6,8B4}Ol!qzO+ʌ\ITPd_U)Y. c̃RgXT@*|,-&Tjּƶ$Wbns֮;|jg7/1G]N ;h:\rzs jz LͤH_1!dXn]*T#bK1X"bQQ9 %II״f9s.9~eE*8zvt?-d_Ķr z \bkf5VUU_0+,ݥK5jq?$3+s.V ECEJTT~CҤR'gi9 |xi 4 4ue1#p ,5-$Pi)rI梂 xal%`T4ci,+4V@h>֙/mv̾boY zpW vӎ"*xlHw"TO|U>w?!kbo{-$>(񏄵aYr1l S]* g\Cw[/8甏ŜxiW~S)fic(bzYUTlT?8ʆԫm_j$ssQBVX@I`Obf=dV-fw*YfXXY67U]qD2Xp5>8~\کLiԁPEY nWd!RO?R[HM0Szͤ*>!sa +.XZ >ն+'}?N$|,.[v]"/*|2U {~~ Bi}᧥!2>BMoNA=5{3)B^e,*.CȆ10]*JŊԊ>bw;MZOeE»T'|;1å56[8r z ̤W5`X40f5Xav j,Ɋpx.VhÅ13YTll|) >0B~ -en9 ͪo ^奡{ <̤^r17j.Xaciꟛǫb푉 ܙw29"pi,* z <̤/?.C0^d1Xark,dE(+C X/TLDţQ|/OfLUO~7o)!6qEXLϾwB6=e5Xapl,hG0^b 5Otam*Mr=kAMQx99d=>am)`u'\R-%DУvj aꝇH1L/ek@ G,+RU<,+^Ǣ‚kE5\/HVd9k0jݏ>GCz4ԻNo.~QÁq2"<(ATqlXVݥbKЅ<k#TXh1_rj|dLUuk*HEiN;ߐQ^Kdzsy-{@NQMLp!dØ`]*Jb'cyeA',8X,kF` Nrg1޽ct?h7sْ:ڶ*l!%62@O,2"{^}U%r17=5p2.XZ%)ŊrH"‚Xz۴54 jWʊq.oۙ` ܽ~ i^ȊF-NoXLob$|֐LL Ԭ`*]X Fx]*D%YrDOX-IU>Q3RY|h`H=t?~ k>ˏz-B– F*8I<րQaxw5w*YV`r]ẘ)Ƃ[ `GV4p³`$#ж C[Htꁠt-Jb0V]ci:]-5+ʹ "`Ny7TV8_57GTɯhȂRJ/2/Pe] |CwV/MOwb&UIWU#Tn`udK52Y,V+=ac!IOt="u61B&w?yK ^CiRda ) Mݜ{Ԁ~iL\ cO Vwi)!*YV0Xa^vDWvxk=:Qp@U=P*{̗ Fv|ͤPUv.=㷢x /3j+9|,)|>֜t$8n ->ύkR-%}l!S'̜j&Egq@0 t..^#fAsi Z\pq |M1!~*U^/mhW۞zK m!B@gn"+9IWU-C`΁փ]|5)*8f(VD=X\>*Ƣ ;4phjL74iqQ[=ݚwʈk? _pLT].n \j7Y:qD8yt .1+| npM8{`b76*<1c~ TzKAzm-B ʴ4K/tcg)マFr4RyU|Y!x6Gg|dMLK|Be^>q:3)otPD=tn |h/HҹŎ|Bgʼn`^+#[*k1;XH5x"ul p[2ҡޘo8z% ̮}t ?}A!ae Ut\qp0I[A~ͅcCo{p͑H\:90ehsOSVt?)N}7Ryw3Jp3.D0`u֖Ţ3ˎ(Sy]>{Ŝt,5tSLUxsGlH Coz:l!|Ox_^Wr\Uy0r1o+nH,K^f o;nEܴ7X8 VQ:&zXEmt?xmp81eE-*ԻW:r?D+z};xc@xv V`z/ %'U;-M/;Ec, H V/% B OI1m3-5/N:-No.KWOgF.x=yw<'gU.w/C`oYVL*MUȧwܽK:,,6Gf MVuIUx*W " UXAj 1:TYn[%(/W5 c]Hs &Tf.n)ݯ=59=cU::º>e@52Xҧ ʹޠh"bҷm9UyδF?_]e~,1\ 9&8;prB΀oNJY }\/cՇ7E V2^,p8‹ %AHڽzBCKԭ@k|Gg*r16]8g5Xq"Vp|bݥ=D|qz7˽}|,sf ׬ KU!FU+wW.~gMѾyIpYMj l!phhhhTvb?L IDATl[VDKƕK{66~ҖXLiXE>U 8X-BQ^n'qYWfDxxжO&fƇuМOv-HR|\N[ vĺKѫmqis!BӹM%& ׬ ma* H$Ȋ-zYT\}Q;r16%}];h,hw)uu?iH@/e9ůb[..=` b,E.#~doXaAc,NuP[糙S_\pOyȸ" s YnlQT|_  *ޖ8`~>R VX 9ac ;]DDe||OU"aŮ*EE)XȣIHdE%*Ҫ@i8|>G:r16~b! Rf2t'돴` c];qubbq1_I0eez|ׇ*Ngol[U'! HCTrII r荂g50P7XQv9%]E&+t؎JaBȩ=EYFKKZ__BI ͵esU0Yp0!v,RBuh/0̯"r1dD~yBg,E.$0h !:Οtc4%!]D4/č!C9LNv?ܣÀ8v k4 cZMŐc҇g^2O}ꌥHݥ@&+4w+6@GVyu' t[[Jbvvvhcqs*fnƤ*EEz@6` AB](j^g3t?w|ޕs4bRnEȶ"~ůYSm"o) (=!<_܂e\ !ݿRc&c)w)eNeVbŸ߶i֩b,5/*n}c $|-OR85Rܸ].ܔw`,͛_*ܥ=UY,x D-VS]azE+G=*!_<ۘDo<&3S5XT[mK%S[JHCIiargICQҿ|ŐCҹ+R$ҞT۸ ZhܼDc|KoYKKDP{b+tzڣC J$m"muMcAa3="rjĪ¥ݏdu?{!\2,X,CF$inX] l6YiŊnAu~q.ꊓ0oi&Q?& Ō&+b[#GU>pAc0ad3zK 8Y nmCbZOr1䘴tIpڰ>|O`َ_F)n,Hi|;v<ܙGdYUPpNRVJ#:|M-&{ `szK9|3%5 bqiaIѾ4ow)j[PbZ[Ljzriȿzns]]]'aBy[DU1OUpI~ y_'+Ld8WUp؈XLN{vIx& YƓXһ{/?uLiU{P 8==VBG?įx"ƳU+v?M-Ehwg (*6z٬A$;ڗVR$EҞ$@{"+5\$%ܭ.7wޓwBdǗTœǚT]p.m#ݏ`ؙd0Bz-CZ'vRmS.$|g tִ^ 78qIhr5 ɊT ~6QB\!i{FŐ0XqIK4KUx|dHbElИS//r۽=ƇJPZ3 ہQM;[JHC "*. &*pnt]`IHX7!fR+R*[Q+,v^tŃ'j]*bK׉FU8w?7%DɊSR- b! {c)qFσa>K+@U cddm6߾y7zLUԹBU8ߠ1/?e_U5+U1"<|xV8KTK?~VYrIXaIxAݻ/.qOzsIyg]1JJ7vA>&_}-d@@U@U|,b,w&T`~-Eny=y A[얋!<|V8KtKb_)BiObEzzz¬,7[kh9TUh_E*oXN|R$9"u4M{GOP-C߹R$]R "eIVEHŊ5OB!SAq؂v 'QS[J- [ޚW5` fb7?\_:KK{g: /Zb\hy05u%HH,PmrR)PQo*o~ }tz@V7.C|bX]ړjGؼ RU!\Ipf2mS/:}t A/늦Z#nFUD*2)~ [JH^6< }UETU ,~KK{:BŸDh+Y4 )x#gacԬ0{ϫ 3H¡7j(>% V]T\. 9^XJ{ܥ@Bd' `$CmH\Y(yР(atE;`\ qu] $ W!V%H}I XWD*.-)~[JIbzWUX.C.Jos=R$R v`Y*T+sp/<^+rȊ0,*h[ӽu?>eXqx/CKa¡VFDūb ;VUTxU/R$R !"+W-UZ٠b9/Q=M .ȤXWDIUؗߠQJ]YӦ"aR*L!oM{ы>ԹK͒lH 6ؘ-cnGU=m+Z!4yBc_zK &(6􄈊ŐX]ړY'/RZ W# wn[W4Chj\Tm i~ y C_^ŐՉ7kOҍu]ړhY(Rb\iFcDbZW4̋Pדw?[%e VXnC>v3V ;&ޜc8 )5}*x^C!OyGj &M rIbE F~-48qQz4~>o+ D\UVǚ%[&9d_Uia\ 9 jUV۾y|y( Qh i`i1 B UDTe9-,dR 3>I̗ 3ʋ'!,3XQUn_"&8ҩຂ{-G>W s %Yx_HX/T+ Y~W lt#i|,VcZQ\@XPxDW x̬*zzgէ7L-+ت zy8ĤdR3v1s 'ݓԬxX%G:vkw觹E9WqD9`wFΓ XpL2v. ) д^U] vL78y癪 ;e)HII^P+B7Ntrw&&*:yNc{<4* \mx)+㢣OUlM91դhJU\#yX ;Q9Ȉ)5++F)OJU]?1}huw<|fBqtCqHy`;)&;fSాB"!֪B=zC~ul=SUa31 ݏM@2o;zmܬQ U2]. /~8Ⱥe 62b㊲= H$OSbEEl1_?3ZÆ0TEOOеc۽TM g6E(Q-5!x-TrɾxO@,|]TU*V5_lonWN@YrA`DP-p~E)VC WG#:W( MUE`]OVRvIt`$$ZlݹcDQz:h81$PnyFҥ]q@+:X,\H"pRAu?HUؔ6U@B=!Co "*.&8]`䈪[P[h@Uj)VF FCtEYUrB+Zx6EbuQ AŢ o#t6FTlo'NrߕX_ L]|| 0W2\RK'Vr.+›oDX"[(VvfFe1Up)&B %0=t?JdRkDtͪ]yg=J g. b8ԞZa5Zxdz?]YmD܄(VLre̖{+t~Y 8uԗrX֔}r!J }*iW5@U䘩ZbmbJi-[*tV՝H՞l`#$Ѯ+"/V@ ,m*@W~uE9AV0PoX.{7c.$m[YD>dJ 7r1mR:q|\:K_yeU1K@YD=󑃴 pMZ$i0ET];ީ,p *o_v~31yK_)rҲ^.y@*&>` .sS6JUŷ뚞_!eB+ \clH,B|= LˊЪbv?>%h~"**rTU~讛̫M:nQQnkWWn7i2}UY88.BOfidT-Z{t kQgU@WTVUX6kɼo?36o_X/l~c-[gk]r~ Wt?r@j[,OHbnmlIgQc M*ݏ@YtĒñքe_Ua\ц#7_!*2LUԏUl͆(E goM5;e +T٘xŊxpp "nXS֎y*!.8VTeEe,&z4v9#`*~^~R<3 ]V^Eqg*&څw0 <00Dq z`/8pMKH,$ ֙M *,o۬$:"_=)q~LP/S=Wţߛ1t4_946xW+pmH]&EYamzN#J7QD_*,dRGwzٱ~̵0^.EUßK҉rag21D1>-d!> vQz!%?kimpUaU~G ujNlYr1'kAew.[]E Yk+1bE5uH,+)>֎1 *. YgRgb23@/ 6x7N*q IDAT* O}t/^xkUlTY=A}@?_|[F*uk,XFb"[hP]WY~NPUa-jv?,TݦQg%z;mruzPUE[?=7 ͳW/dzY>> .o⯶=1wojkG+Bش VyXUUp~,;әԍeE<*+JBe0bn~#I`'+]UQ=bEwL?Ъm1\.V,ի"; &*"'e^%|Bi@O& 68$QJޞ@,$odBaMB8nM]SJc@`QzH9LaJ(ekꛚyK]ŬI":Xz%ik3L;d(#pb /bpM#M$BӰA^uYDUwAЃҡAvs `^R`~$lv͜znNg<]dq:YHX1X9\8פO+B9. ݏQeJQ3o+8Lwz =#&9$Q_s.UἜK&P?8rgŊqGbt1KuIg[UXQu?dRO!+Nʲ/UIg\̌H44h;G XiZ*j.f[b5#.5mS lVyZgʯ ޺g ̺zF[z)8+z1*<@ ;2z&*j *f,# XUH,E{|[ z$rI_^Wna\̌Ȋ@Hw=2cGO,˧R,[q[ 42Ze^q9 VӚŸN/~XQi-E#V!`8J֘/3qS (dʥqkJ+qg_bEle>Pѿh-a2 ة OkIpůWR'aM%Ju S>`a^Z ]>E~9ߩjw8St"K Qʊ\'v`"Igq_ I) MY /LCaQuv?A[d͝)ykܓPpX.fZ . ZwVnU2*"K!HŊ|t&\"٪ bȊl|'FH//ETʔhMvwzp%L`Er1qtO+ʰ\o{ pr1]+HcPM`pZU 3mU DwUQwݏ4P6D!+OK5csLy} pZyG,VEi">?,c*\׎^UϦzoͺdR?}N/'ƻ9i@ qkJoQGY,JS+]ۦ^9Db-4*tE<,u?1CO1iEq0urWo*Z TjBpEּeEN +V}[/]Zsf+ UWtEPYMUPQEUTd2o?hdk|u;- =uȊrW8Ɋt¡BL&@z pE0\+I }e[5|1uĢO+Bj^k5uIpQ O|R,Zɺ)Ùzp=)WlC?Ml"& !ImoEGݑ K { `#8Sܪmu;(B4mW5 5vZEl腦U( q'H-K]wz۠&+r1**8mDwjL5Faa% 4$˃+ʠ*b?|,*Ȇ] ]UNY#Ʉ#IyB9OeM\.WT8@JJg:EKކ2Ȋ:hG*e񯮃=XnXp9 ڱSſpU1ᕑgvN نNdgUޢmԛJkU9YMpY,b8?%}fv;-}PEU:"+W It?YÕ[^:eV.%i:/n 8(Medcޏ \j+k^]AD_ް}d\uTxwހH,B {]7EUुE7@oiz˽`++a"Ax-TZúe_\  Ϫ_!h,Vavnܭ>/S DU פ7uG$jgGUaU5e$qmt ,dt}N+#"QAZ urTZŦB+Ze`)!*h"G߾QQ/].X[[;/IU?ƕfYN^>Nʰ =9:YYTHTZ{ V;VɧR;\ϫʖ3DVC ?c}ک/izAG*lt/Y*+~_0ΖyK}Y?wz䙄mC?lSx@B@ZJXv,8D *+i{$y uEZWòWƓrxKv) po'~IT.2Uaq0Vi+vK6If6rd'+x s0K<ފ~G*,פu>~-~aD+eqGڇ`zstHf¥RGȶX;DŊh=*)_#VVL${p0u?yKޡGUa^!kFTы"~xeYSɅDV=)BjSSQkMUs GUuTZ{ yGQ BZd_i+ȥȷ*+zjotEΎSU֤B+.ͪB>یz[ց/^>Nqq>QDVܺQU@ b*^\h6۷I;S<\_"$UTD^ ⰨBZqhYsX<03u2 i<~&įqRZ6BqE*JMVp⽚Jk4򰓹;\+',bETE1E_hdܪ +EVUnC`Rʼa7NoU'`? bYTHJd9YMp?Y+XhEJ}XXYeQZֺ Ú?CY+ Н-˺aɼax)̝^¶+JGUUp@Tw+VZKŒ \J+|ȊP- :>Qׅ&~_J+U]A5a*y̯P[;yXzU̺ᶴv{`;=YL6tESҋ W!FBJ?&++ؾbI`YXs C׷&2plLmc .lfb;k )BTQC"zL2,{DFTNDU4U'h#y@ yKY9flN3J)#*0إ|`+pEVGj[rLDS8}i{_#pQE]Qq@eT%@WQQUNʣPQ:e9HqΒ3w?ƕ3o'Z zpq9plKI8FTDUo?  HwPUڱ@W|m\>O6XHZȼNKq\,"ޖN^X[>?/;]DLpj%.o69}e"bn!BEb| *PW_~ tűOk;:Gu?i $Lr`Boi"aԱTu "H;Y&QŊȊ- Z{?xL!:tO-@]qt{4ApzAu?xVmeZV0<)6oԖE!iK!,*t;],ͣl "7+Z +!  ̟mlPRm;y֤V=~'2*؆ C5,{/*Q Ikqܢs^8\)8W&"-VHm;%2frUChCY=EX1k-Λ͝RBo&'IG ܇zll0﶑dP!y'(]Nҩ$^u~5xY=- IaKYN"ǿ 3X~E\1i*µ@TW\Heyϴ@,W&XtR#,ZEߡ8cǗ:5m׭\MH-eoM`EoN(1?A "cdܧ(rJSj[E-VDGSUEn|FbMcr^[U^ 8X?}e) `R}Oa2boKҤR* f9_Yz$ +p{pU~NU"³9v4鄶%-[n;6؆`Q/.n؈$) !7@^Qʳi8=W&+V@f.U 1Ut 'wtu`Bf/Ǿ9N6t*"N6ȖS)-0m@dRrV,)p^Υrȉ3YaOtŊqh.rӘiֻpqBOVG'W_H&?6+cLޫhϘbކn6,@TS)#w~'`t)C V\Hp++V#"5hiKx_^ڱuQ)A~XfazKcNMG?-zYa'*"[.FLbDՅ'Ȉl[7Baغ,]h&4)X"11XzF 2]#%e )U}wugW"񹼛kr"$nHl>EQ/ێdMMV؊S6kUnsaw_O=2\,˧R8\<9~v-sdqSn]LN䜀8T8~lJ2o)n k~Ebc߆^ULO+Nުh*NLF58=+E:\Q3Zj5*VTAK DbYyLɤu's³K +X<_gњ()31a@ P|f/+dn*ebI5S -+宣^)j4˩Pƕ==o8)VC,e$ִ}Vi'G**ʊLL/wtF}p^z ˾8(&~~"kK,VOhт!U%6)02“yK{ ZOXifX-¼bΟWyܹ;[dˊ&r ,V~iI2Ys$Vys_URnf+^y*/G 獮|S79W艎G!ؖZ\Jkk@\< o$=-(y mb^m(hOhc&5EVu'5{ln6I<ƮkQ"i[^,7ǹ ]i'+z9!R]rixzK?xF<Zil]m̶Ƽ&Q+mb7Lj *,νM{⇏Ԍ+x& IDAT͛[ڄ}#6&} ^"f1FV^.f0Y(o}"XUH l~ȑrڂ+(V.1Xz KP4)h<1!M왂a=!GMLzdWƬy\,'IL|x甃WNTx"SP66 taEQPi/pRQUU;>Effs{K~&+fXʊQkby‰ʊw uT@cW.X)a=Wr.nR4+ \3:ڶtұۆIMAUu۷{Z WЬ<;O. >,tp-V\QDl{T\$6k !vL|{FWXI,B +B+Eo*+TpMYu؈C)^Zj?vnl3b|@oi*抂pIA%oCVCެ\o*"=b\d*Ez`Ei)Xq<)}n`غ47|gM*ebň2&UvJ>usƝp ~plgnd S[ W-_,AYTzvն VM{y#<헤z1gCsOm95pŜ,&i7խcb\U*um01&}-vIyIn;vk*+^yl^[`_y9+\,+cy;=׍z0X;0 buR꜔~Պ+?(O^%α/ýU0\Q˕ WxLcV(#\SRs;%iLUx-gyLV𠲙p :"aN>¢"<(綍:wzg&+ >;qX$]66&ye$o#XXE =)m,!Iv; ^') XŊmnK3|R_7ǠX .` \3owuae tVc߅?%ψ XrQg*.a"ϡwh^*j8VV9B_J7yX-)W+./T?trPIy^=@g<,-]pRD60]Y<ߴ*Y=ϲ1Ο=!RܖS>fEQ5GIk }Cz eY>%p@dbE15H,C6(%鄈;K}ݼ3=oiO\H ?ݼ~5_E ߜ7e=mG[.Vg*Q GzrQ=)O j❽4`3z @^?*<,,V%EeyVZ7wS4U<Sj*ʊ'-m̩ҽo.cݕ"HC/` 4J6-o/5[0Q I)x#b-Xd7(yԯ,~.Q4ջVR/;TJ7A{ rnCwe ې]}L뜩TX1$ÝLenEd5 BbHWbkb~6cx *rPظ" `{@>f~)4+IK7$xi~#z`rcޚtiкRb<}. C&KV,VC8WȀ6b }6Vl6'=R v8gI,OM4ɸ zel/3iRzz^uZ;i,A>H%N'oSgd VN뉆_|XU+U,+gba+p㦈P+(< j5P/Ċtةi&ӭ+Ahgl 8 &g`Qq-MisLn|Bfj7ʩ|?"܆^+"x`O(qT=UmW!.̷QĊH)\O¬j*XQ#i9mrB"$VlZ=2&zQ3NZ>hWLDڥ2hEQΊk`P.VTZ#C AAjX&V>!mcCb+?Nm ,Ŋ܍7m͛(jVx,o[3vKWr@uFVP rz#c/L9#kCwveƥRRQ* F, bENnS˜+h"j(XB> Χ;b"s#پXN=2pM zWI>TuS%u F闋Ry,ewNKEM5M*$ )%jVFbT\mMz4-; ieRn9ߚXs=#i֏S;6cC_.JIN\)aJ[ĊP3lA3Z fFURVA|eR2 ˏXnB٤\jfjV0+TVNNMQ 3y)ko=.j%wSؤ^ktueinCXA\lW:F饊2TaCO 35Z% % h-6NĊ؇k۱! 6-wЊOX;5[Z~%:A8]o+CetNb.+- ΍IwĊp r`PhpNZ (" W&At`f+yXTR{674fVnAGMVTNtW*d -[F zJcY2 \(8~uњ_>,2Vل]5uZA[kz9i6℟XBwmZxr+-D6ka bR(*JK05W?ZbE+e #5sE1*)QpUa1+6 \3WsAUГp\Pâ-5}gr rzߴ 8 _ K-[DzEiRU,hc0WD,dFh+XElcbXE> [괂.jOmsB0_pGo.7[V+V àcRinXQZHuX%]W@pjJ014@P;'`#V@敨_Zmk wV": N+ fje4d9f]e!!Щ J0( &+ $M&0WPyJPyXl )J^94oVZ9vIPwj*זC?ԛ]S=w¿٦7Wxpx$Z,.t  t3(0i zS׌'x6ymhHX1Ũ_9g3`$Y9vyXS# Tʐ}V\@~nfV.[G*J$U+Z)>YZ1WpLҷ&vX1cxZ7&/xf^LrqFrR`(MVU|~,b*ҁSEi͠)Vc)&+FT?X1p4vjz?й v3=zVxk`4t9f$[O~;_yX׆A\l \_WOthP MaW^Ȭ;疎Fi'X8\&qhpdz cN+Bc4߂ P&47{۳f׿ O) K1SEi)R]5Ae'hQY+[➇ *h[>_NM?VV.t3dB~vƕ|;'g4@_p86ǷOC %Q0 q-QNw#'MT^T(WXeσ‹|[7gǗ*JK'UP+ ğ@lfhKE( â/V^5˲zc #zVs|)>(/f ߬ 1p>"8 n<*{(츣\;)N9&h\ҢUrpm*#&!?5~GeѯTAY>Z3Q3W^bI+lo|XE&=7bMK=+8[JTnWJrt2DB:-w,[iy>{|RNbzGGm~`"%yP[?F: b4 >Mr;SUY bEM-x||t@+@d#-j!H y\X+땶.rKj*AW8OqiTt9X G^(OBe ik2em\lWӯM,V 2h gTc C31: c^bEF4[Z~PPqRykyy|\eGz,%%W3} TA] 4M-6Bz_+dFo%8G_5I`l.^f""jI(-ڑ~P)'AHBm5sQIjEq(Vr rc"IXq'$r=<9 I*}Z.*V@'Sqjbow qػ4I5kqP@F0NZÒ}@T.6,I늲ը<LŹ1b,Vg3toD? w_D 4ŊQpE\@ϦlXEYj)9x 1$088%d1uS:^I()¾}6@[XMў`sEwk 4Ŋ#w54L1Vu l&pCRRz™'ܑ mD7 J5E鼬_ۀnm +ZdRe8 bSԩ `*a%RQ1=>&l/+erʸ2OC}}?R$ R+Nrwȡ\!E6LiO!Pe - IDATobELFb`fz9yx-i$B""?sskT.)ʝ=|,T bE+e>ms@̦ dZX1 Ҩ_5Fa"X#cދX?nG:[IsvHaږGd, Z.6RixtyT*(ŊKlf p\acF* "V?;l;5)cB)Z`VF#qe&`tԮ)Ϳyߤ|1X.v\i~aRit3f =)FH;x+V¥+U|װ=)nXŗbUw)'h'4A9x ]5rŢ2;T.4_Ruru4T V3t3I9euIb7bX>DpMJNM-V!&~wDaA97c: &C9]F ٗv5{xvHE TJQ`!V0l:lic?bE+9`B +Pb }0qE4zaK)5MhGhP*`7ʸP.UIbRT)4N,Uкl+@H Ykr(Mh$V85,a2N:a 2 "EDf͢Tdl..8h1hY2ƿ]F4XQre㏧g,OG&fREF*Rʂ j'm&bEk@E7W|4ĊtFb4.ۥ&fZw‘ _ޚ:pG^ؑ얲)'P B&{h܆U! "YD:<0t)TRTJyR+ɇ /d_/[=ACE݂`G+TXV!2_FIoaTNB*M**iqn9R`o[xqeD~ 'X.Wk"K. &0+2lo7CXR. R!m bTp4BdRoH\~-"--s1S#ȢNp\ob#(|MCsr1Q D_epEoK, &b$i}򁠙ޏyᮜ pMYhc}'4S%W}ך~=kd o2rRP&鰊^r(B-,/+{J+^rxJbR 7kEQ*hgA+@s`mo .VCgCa NMz;U!Yz yDDT?#X-7MV!# $u^_VѱFHټlVZpEiɧyV 3xl.(y,hExbRUhhP{}ԁ"ivI9飇n)|n"۟lnC_6ƫ x ,Y9CERj &+@>d@bz(~J@AV!L nY7GYs/e5m0pŹ1dz!42hټJi6B l{e QkThS#Xѧ2XA5;5AYE{ 9|WpZ[ʲTC f$/ >p̝;bjPe?\sV*tTQsTFZ3cJZm:S aŊQUEkXE,t* {4.l2F+#*f5{We?a*Zͨw8;17,>MTܓK+&bEW DYމ\Bdyħa Q585AXE,<5%`J؋ΧHH-e8gM K p&pbh׌Wၫ{M\BeEϥR f0+X@Ej\!z%UD?jM@Jd*O }?!@i[2-'!VJ2 ?*Vbbl 6O7T.4TSr͛v l 3B*5hUey>+O+ A5̲8g1#A q?!'Q~-eW˴Tv\x݅цs7Ҋɱ\8tݷĠ*K~?cXA}bV/rCI9Q# Éi!5b&9oV\U+sg {QwTwE 6jSahMkœC@őEW ,եr1(f(p=,TqYfxӘg 61+9hkS5b5Xidx lO~YT5!9ZĐ$TDG+ŸT+ LCR%i Nq+ Upp`Ab߂҉MbץR f+ pmc/d~ٷl!xo%+zu\lieq髭>Y>?>LOTDG+hn)rR} =gi^`h*J ՟]_97K>K,%ZqO Vϵhc%ʼnikfT꭮U ĊT& m6ۨ%$5=sp|Fc Ϭ=B*GRՕVrO0wDG+e]NC#05`MHL+TIu Ó\l4UB[*I`&VxNB?<\6> FbE&BMmr1Kt lp9ploBd qVQGn)|nN?I}M$⥪GAEZ"keLjLDqWehbvyuER &+ $ky %s"X,L;5XEIEWޠb IVQG`n¯('A QxQP Z{2CU5.MUGҠQ`&VH;[rizݘbM "xK `},&cV >^њ ,VPխLFp)'Ր(6aa$/Eim"hqI0)Epy_y*J/T1V 2 =dN"t&)j"KbDG*Sj< .~vvKK1&Z!0A^Sȟ`'rdQzucג)K`%Vy2!tMJf_ZeOČ ŕ}*$+q}ϮbƝTXfN+(ò^O9n Z!2RB+~T`Ԣ;c/>kiTʾVbEM{ RD _G6XUi2nvgOŊٝ䀐I51 I1VhqطanGftOo*ʔVmTNPk@mcbV+*%B…Uh Ċ:( X|j%Z!8 zWx4oTNvMomcwA+FAd[y85άB୞%V腁;F -|3Iu|ƤE (:aUFuvf#\QzVͭW4UA:sϥπC 3bɩ0W+_7" ,mM̝GVQ[Ca Iur>!g ވ2:>6Q`b!qjXşC{%GzVI_p~]ۗbA*~-"#]Xev#cZElm]?u@Ri TI?FRC F̊fs7Ċfqǩ p`bJNfC< X~X/ŁTPa_𝇕j"G-P}Yŏ{{P K UR+VXdws8KaB6`V`$k^ťx#Հn3@<}['106q#GtPlxز AWyB"XPUnrR lU bT+룪\+mS Uvj1HR)t؉x^1,9hV``ל&;VQ"Drzֿ}֞!Sg)6بwZqOYdZHF40OWÏ1 KI Ŋ+p rg +_s? Hp+^9R5#REt8m[PL!9=XNRZ "&t b]B35?50Pk\T {j*NhMȏf cVB ^owD3(pݲ<ɩ d"Lp؈zYYN'Tʩ9+Mv7||PQJH*:skkc_ـn;b;6I%+80Vvmϣ b)~NMoZ@SJi-=n>F*,L *_ ]Tw Y G(JV_ Vq׈{~l|ѢG[t؉F;@X Ys5޾C+)_ VkS|Bjf٭D=+f7N"QSxZc10& [MRQ(PYRn8cG%I{+*X.3 bA6V hŪk(pME{͂Uh-^/7(uZmk9vZSLbr%!>&~"}G+T$M)47fVp쪒y$I )Y+Vb FfZ!5*59\S/U x u VlD=p#[Z*'FiV@ E8k DӰ^ fUWP 25(ʵ떮ɻ vb aJ:Й@,tbE3\|\.e(]@ͬI;; : @>3?5 E Pbt'KkjTQ^ [VɟȬa1tdbHǬ9r}nhpM.| 5N$m*2*۴i|Ces9B*>f^ՏiNX]IcvQe If++OsOeݹ4TneAQc#產1a4jXAf URj&0W0yQ\!֞"$Uj--|t|%o> yXsAx]^Տ[n8lBT[AKOT*XEQE"7Try] c(j*P 3;LcV0zԄBL%|Ms ġk;#0 0pin|n\1RVn]BM]S(6,QS .Zlԣh@7XA*g \6*Jʉ0Wt[ȫdtS|=4 4%$V见W!XGr/'\'F] +]STw =8 (D* b#k JcK{E$ & +R΀Wpe2ST>+')0ă]'~8U:h܆nĿd]8;>(fBgr1Td׾ SM`*Vf o&1 @ab4,ѱNj> IDATr& HH,VPءyX/*M0DPNc~<v='xʧIk(3.VAL}D*؊HI90W\BZO`;5y{*| bμlh'~^M?v{VQ\&_FukA]5U(+lmR9 FRVL 2f W{sfUk{ͬ5WSPNé/ߕV!҂/&Z/wkrgI9p6VyXm%] ~x kGbKf|] ۼ%5T3oG3Cmboe{j!W {95-vLR+֙ksO ]:X]N?cխ"Giy9CX)uBp *n7tEۀnSirSI%nUui\!#j!(E Oi^NM]z^Hȋ^&ykiE2hO&?[ 4R ;0ƍ5s[w)Iϟ/)OPr1*;T*Sٵk+6 Md̜ Ɲ/"F&z `#lGe0XvKwʎz"pc;Ȟ ,v%飔HQlK{s/F+2!h-!hͰ'3aP+XAz']ްRve".'~<;]vaApESc={tx\znhb[[J5;:|=t3o9b¤bu~/nZ3WB1!a&qjrXc+' +v38/ՔTO=Lv) њMggfEHk=76|!rR1y GR+(PcG&-ɢNIZ$Ғ1*NlmJJm k o_z?V;+PeTl戚\AryXŊdvC{]K*@xF7tg1ihqykdYf@}TRIm|?vM׀xY*5aBQǧB$yj`"Vwӑ ь,|1B +lE7`{So`,[Niɏu#+i糨 ϘvjC/› *=)ngb`j8륃ӕ& ğXXQn"ͥ' b8S <6 ltr5 ,VPv¨:*L%mRy?)fcL,TP}9 =W|#b]NŞz^*5J$)2}!V++)/߽QNTnw"zZa*;5/f;/lVA_ ڧ۹$jJ&,':__ETB .bJۣVTWrIUHeג@,*IEy5U^q 4+*-ŨI6nz!3e]t H NnzvЖr;Ut].V PB` յ;gCNR1W'0 sv|Gu2 -Ah$U3)Ą1~qk. #|ʔ 090Z+,Vdշ:؍ X+|n;UB)]C,BC=8CY>5FX1Wi \v8JC*VIS୦dj qs}+;5QGu:$iM&mip]!5-g}.VHL#+HEԴ"]2#CyX^kByljO~UO{G_3h7=-Y+vs:*e( ̴T}FiiTnvϥEy^Z[8ޫD ^|gpkFL+\"?})M(GTo|Y+h8-a&e蟃q : hC"%Id%oӴH"[okTrqAD BMR (CeJay+FQ7.m;U0+tBg{L;7~ߎ]wB;":І~U[%U`3,IRgaĊU; T%?f|Wg]cK>FhӹհhJa!ч7`\n = &ްҧGRKT)%XݭM \C(If&F;>Y>s\T# jsEW+ bQڇ(k;5}-Y&j ްNz51hyv6|zmVQ4:ъJw@tcR}Qv+<{u7dA.۳~؉<#"vjZ * p{ʢgS'GƊTZUCEi;Tbr,<ʺԻ(]*Tam0#af`f ,s DLa*E CY*0j*?iȅz #(+S$z>UDVQB+UTt98ҫ>UtV֊9b} P3֡^bo^;QJĩɐXQS\CyX Ŋ?};0(gahE- ![MS3]U w>1`*y}6u#:PBouU)d*ZWU(MiKdXR,*$lsA=u+0!qf =+6WDONv+*%NMf>:ЁŊ$#|GmbE"F,T'L&(Z,ޘaݒ֟!lKC࣫3F(Uxx~n<:ĊG"33LD{ly> ^p̈́39\&"BeHY |Ċ8ъfHa9(ay;.qF;ͨ 5NI-`I(ڹ2Lhſ{%iy"cXtW;ǘmڈcJʉ+xarX1Œ?AKVr[n 7 a Xg`i\?.OL ŘI90+d"nYU~'ȿKg8rNW+U"NMDŽfDNUCE~7w[if54'~ ObXc#UHjŰ@Xu=zDU*M~/NI,i_ĝ)6:+|Z|pRvi#0~<{E+ng64(WQObaQ dqcW%V0W\3toZ\Q.2p4yBɜ^(41X([i7XD@zN>` 0<,J8e;qjz]ܙdcRgոM>+z>M_p:5^F詢s2^{:Ikr1R9FߣS)Vh9Sb\ĜlFq&Q/AϩVVf}kv<˅7R>Gh*,0MVa#mv;] N=s!ndln#Ie8.AF4.(dl@wEsb} d{ HO'b6zl1+ ֻk#[ee73]n4 z#T,K'bB*ӫh5IM$-Z2{I&p_?PQ6N4u3P&b.Co0z'OX1`&Us^‡\ Q6 ߶ܿեBHI%?h76Z&sa'đU`v#L:ǰXG] D@k4Pzy6Oډf ,Vܵ+F}krj: 8n K*VI+&@=0p&c-9a$Lv<:'yAHjG3 3?"^.Fsr&~|r: IDAT0g L2,ܛNccGGG1ojMY8\c qjR8n iZ'k|njeP6wh $s˳Je#RgeN4fo?K1i@w \S/nh/bEF8*P6BVGY7`E(+͸v+D}AڎTw k44~rxyX\>,ثhJBcPK瘼_KRXW s Cp-@8Ns,2woy%8!f SV&o6JD1!`7RX19{vjR'>8n إ;ć;'o E>d[B*WBHy,T8$eԳEB!S/ΐVco썢{*ڨHQ|q&r?gL6 6I *k19Z8j\tAu8;5-]=*l` aU@U6,B@%LP7ؽj(.Tjzx+KhEstW̕6i]ң̝_`ҚkBfAإMX>قm~N(ҭq@kJΚ/)[fk;kh_L*⸃JYx|3!hzk;# Ay,hPG{DRi Itr}XEvxť\m+(vIq沿' DJQX Ħ$oՔې7 AI%52©iuVaU+.[Eߥ0x+E<hCY#Q(+ 2=Vq,T(w:zH*K//~ELnpJW;]c^ e=(ĩIY$=*la`Њ"Guyrmӎvn4*j@KQtK IL+;ay#pX{1Rfawk;%@}( d5x%W`BAgϳdy㝏F>_qPgqhV0Yf:T|כ'ީ,Z_G$*Z `YtstWY]Q@]JqaX|chzD[X8,!7 q.85)G}q{@U3KU"+F_῿Ez3~ٸP2{b0yW:VF!Ue|A:mwzەեLAf ]c1h{HxJtl;Vn~*%\(5N9U[8#̒$wEw^zTz7*Olݗe`>a^*ՐE'.og?TYŬCc 7@( 0(Qcأq'OWyXUi`΢pZN7?uV( xA-_Ty-wФ&,ABʘ_[?zS,*~N8As;>#QM'C,PΔ“DHF v!% cvݳJ*@8n 7ŊiEٺ<\~qr4>D'&f[,bY|AKk;6McJnbpLrgZ\W+Iš̳؂iYHkgԜ"{0q{@U8a7|y,ERz,'f.՛΢7ǗPll/V/R僛-XtW6} x}&Vt ʝi2|F3luN`J+N 8t6[;5O=ʨqPgHȋخ#TcM ֛ГEcWg|Xy( K*A+Z!T9VO8kbδ,ԟz`=>aҿ]5S"bgQgK8n G`N,QW^vo)z%-̎_}\u8A)LJ3ޟ=%LbaVJV1O*SXq ɝiЕiT&M+Xa+*?b&Z]\[};ӌ:p+"NEN <֫{c&ԓռ8$mTZ8yD j--hE4 9R(7 ͝iaƱRE{Z"RC31X4EũqO:pFDbEB+&VyyT{4>;P=.~'^*Qj@宋@+n YET X9f7'V0ݙ)OǽҠكGYaVXy>|}8UJsOuVĊ6 7uv]y,*tJ[R kIr R)&~^LE  bL /UJcaRq(V0ܙv*4sR{b(m._*C YB+N'_HhkA6q'V4?LZPб;63U/Vl&pN8ruVyXdR}E/v2cJP^y4wzt'@!~3łt "WyX7b%9$Q 3gjw5+i$(1wl2Ŋ״|PNISa1[:p>Y>a=kyѰzXN[S]iJIǨGrt{%pU./oA?. "JR00uG`-`dD`D0uy yg /;ӄ-W86$W^bE*%7}]qo$:<Ӣ3?uVPqO/glKl O*vZz*/8Kngʁg)%G^-V!P(Ϋ(_윝}.V#Hu S6\|ܙ& lnBF,VUkOɏ}958nM>qܖJ /bxa5#4Ħ˜fjɢvIZ\3 EX1aX*͕q|+35;^HIK޼Vmh  R^xf ܙX4kbl`f1nCKEITQkїSMܙMCo9.i /X~]ִ?XhEM*vNب;VQemOq vIC<󣇦֗)`q&*) ׋ņfg6ffnӸq2kh O@ڐ)3MP`wl2ŊQtyŇSҝ)L#F+VG;_~Nh[BI9R鈦;ϥGEQaBܟ?>C (cR&ipU 3/LRAle270X? NMw?qδx uV )y(J5HAwb @7Mj>M<*?^Q$բ6z5F~)&1ͣ2<I)EܸU*/N54t9+&7Qwg`g$!ZFu1ʆeԹVWS/k*p(E.3:7ޠ{MchCC18}qQ;[&F3vl!LA,pMS}j-Y7AFD2k H7n(ȸ<: iކ>tz)SLhóJR!MZٙъ`C:t6-U9:36L`@_{ < 7~ lrik(GU5"[ ba_ȝ%?y?*neШ"(msCTw szIA7aP9SdNqDJW`Z'QX  iacXuvbrgsgp0kb f7sqT6h;548nkD瓯 ^`fY#jy *J-lN:hCﵻ\σ&6ƊGJ=a`Ml$78E>?Li$)4IP+r3Kor= +VM:˝i¢4MZb-,wKo8nD 'XA5kIwe_9"cPQI*JK=UxɢNCmqG{<ИC<WH͖IS,IOV Um ~1}&Gބ<ѱ5{u;ݬzM86iߎT>=]m9 _BV=Z|+R1CEi Qel.oǔ6SDRf a 8;iI(àjmEUL`M9gfrW3eO'v@fҎr+.p,{|u|;ӄ<}gz,=D(u5a 9i=",YU kHpǡ+F?9!cCEOQ:!V (E|= _m:տ]b@(T_Dr_~۴ք8)=6B֡̚"jeG:#Lc8|mCEX _@"j:G[ ĮyLiVTPn/\f{V&}=lmWy 5U K(0>lX\*::{3kblbf-DwwQq{H`za BO0mX _ %0Jha~TOy"^c:aխ/. ,ڞ/< wtnN^> }K6baye;$lssXz)nL)4 ( z &IsN7v,Պ_w#Y?#V*BD?,]!QT*Ju\[Tw3ـ_KGgYX*ܼl]/JX˔XE'‡cnѡsXLm31o߭2opo$VqlҎۋ UqkU{v華mZ XFO+qK1EM2ޤ+>cZEӅGu;=o}]M_=2 ,>7~94;m?J8U < tKE$𷜒d"V,eEM&G1nĘF4)zKPSqqH30>:"X:+OyA/ ġy,+J .QݓzAp)aG^i],'\Lr*a X)mV+Lld2dۥPxJ86C V*h"  C*/Ve@dG+cAfza!|T*Ju8FukSzXR) M%4ȳ>xդcb\b)$ǶsXavgTH{caepʩf [ *H%` |Wg~ z5 8qp~j?0:?clj|Wg~!X& ?R{[đh@sEan-O2%20c٩c]U4K4D h@8"puƝi<)𝁀Y$vlR.aAaDW .hwZEXwuV{+s?5)>yL(Ǭ陦GImQUe;egJ9pc.4K`LIUr&b9^03{! IDAT<\g ǁLoƎMz73Q#*'^{6;kX)n-,X)sC.q< zV!>n$[j}ᵠB$(v{js-˪"čO+A|FBDxTr 9p<3̐!93y_KبBZc::0C ~XioBڙJ(J)q;Z/VD#9H%bTq_?ar\̱M{Ŋruf&z,52UZ, "3ݟ< QX+Vl}D+*xJ޹bg%݌$eDh]a1`.}UM++ [,=ipRE[?,zc(w)S9fX!3 3UnL׬4cXI,v41ݜu䢛+eq*bI?)o1ՈR Ӄ\/Z~:rwMݽqKˉKR`.6 hşQt*3QՙCՙj=Vo" ִt}*'8WъۄHn$h]UXB#c SBDu)]5A*!ǤRwQ!=ʭ3 y᭷0XM\5S!Kڥg# ݲ]OȢLg104ZX:Nԙ̩3N1B@e-&"%F5sXTŒ:8<5{7eX_GΩw~=הWά+'b׹o6ol4 b̖* ^a gk$cXq냏_8tN#uu R( sc:3"Gܽ5Z렂S}mU$uVa~<0L+`@f#RtvVҤ6k+<LDa 6caUå9h E!Mv?~+k{m$|d51 45hMg~Y ,I,[~XUja1/ b@xrq\twVg{ öX# A\?c*+,+V Hmq:DrTB. WFGÉja0Cyti\c 6gqg.&:d}rO)8|}[CcettާpuWE7`_ۼ)áO-VTaG^7`;yL*UL"5>nh(ߨ.sΥ&9Ԛ, SkRU/#͹%#,N )sj|(@h/^+@8n iߘؔ_TD2|WgaXuW rJc ?$ssbP~(q T>4Yͦl%;zJU1;BFqC"Z?'}i4y:Z'Ѻ1@ ֤S &yw@W|UMvJ?u[%l$}(rwN؍3`m`/*s'aU<=wҹ'Ɨjl-]m% N;Iq'Drx-L"sDaFA= ӡrj;r{þS:)$"fwBEPjlGb 3o[# 쇵cȥ5[?R $.'Fč!6Yy5G([r p&pgfO) pTK\9+h)Q@yGz w8QkbdbEKTl6|VQzkH6>nbkGF)oN*dkb%Vĝ[CͥWՉf ,/K祟?[oU bOS, E^q]I' 3=a j +xMe}*J bCQfteIo \@BZV񨋛ŧJ`DzVEw]\/ݏE^r^8V9lUeNZuw4完E)dtiřH?]&FT%(go#a_KsC_Y:.Vо(" ؅G"b+>VB轗Ӗo!φ]HPZo]~\?kխdz-* u;V\M!:]pnԑH5nıbӖAOX~n'?> -o#IZuOi~P?kBÿi~kz_IheifM[Wnr)^ 89 bMDH`@/oG|9|Vq&JIՊg<;"%f.VdQsnU,WjǦ.r'ϖ/ت[#6j?;wL39XqsPS?oswo% 0K[Ký*M*{;p'ŊB ǚ:76a4yTtNFyӴ^E U? k:] k { X̃Tӈ3v?!\nuZ׼R1gv}"oz}:QaNORVqJe152ï!:1 B+꤂"&}i(۷Јc5F7ci視sG?̷\tq$WP\x[h##bMpqMVfZɾUVQ'[܈#)=8ZNJYww[%!_|P8T6hԀZ*F&i>- cc)4KCKݪssS+?)Z0qs/}p>D@yW&Xfo K8d%x.ߑsjCc/xr8j`X1>ehF: #c}hA7"S +yŶSvN0!* >LGCRq. oGr[+/ٿizE/SG`ϰO ٯUt_dX_zJ:' $ VebĨ;7]R7aVHi bUaE0Ӧ\ne%k>MFƪBGTlvT $~е0a^üB؃֊SQ)rT8*cRXZ%1 Ҽ`Н&M%ꤨGWT²?Hܧ+h@kbbsר30UN>:y>x19o4T+ ' b*VGp0t*0f@=B*T} V9aV x 4{ ;jΓa`*6  U~od~S|xk*K<ҀXG)?N#N*G1y,]1P,J+Uw4ak2>WS(!3m&w Q<x#?r=p,c{2 V`[;+*@-u45.,)-i4FŚtHFwl*>@ɇ/q*Бvx訂S-wbm^2\cU"K6-f>DIXjB bpuBB;w3N]> ,-XT="&RŪnJӾ\G>NWRq6ĨM;A+A*dVYgL:}RZ8亇I/ ݯRM?HkAy2_xݑRw~ODM\XB_ /YD0oJ SyN*=An̕[\ Ա\88Y IDATڝ<Y&Ƈ)ɵ?xȔ(S~9pطV ?s[;w%`&R~Xb؟yuLتb:6DMIW}2S͙kb [;_ZTz q{&K!Ɍ)) w*ZXCbVI3V໢us4q7npĘ2$VƩ'so`U]MKXMhHE&F+6' |B$pp !`M 9<,V)U"ƿ);gaל›Rr%mUav+@AwL,^h^=T9+ܱ&> ҌipMHNtM&]u/9]}+RV×o矿9o־cc'ygZFXp Dag/mPO^^ Vuz 6M:a_xO7@g* AQDmϘZ \T4)0cj+jgLRa W`+`ݲҲ]=;"ޝz邒^$ƚ._RVQF*0o#@qV@ohtD+@.cfؔe*9a=H4i,yUh\+e 3`| qNלJH.V)_(_,{䁵xWI* $?x, 0~$+p ObM PlJKWQd0 X륔{8E"6xPg,w7" <\w[%, ==g#ss{p^|16֜M|VeZQB*>NZB#`Q L/+Ț}:Z ttEDi (vrAa*a0TbgLaOT-EM3^|Њ*\&wrL4v@2ɞHdn@RػŻER8 4+m6]ĪMA&Fёg;-LMrO؇+6DeъRVQ ')`S Ip I`uZ nX1pkXq#[K°]/ /|aU ,-rAXF_| s[UTbb]-Ft3`_!+z@XӓDU ρ21;HMh yxQ?XR%YK[O4wŷ._oz wO܁Š^E| 3>iqҜ}HĚ^(b5zz 4UX1Z(i3im9 \pė|;aPz'n`4C~FBtet_x{>?tCViMm-M}ntn/D=&VeJ@|sdZ+aH+QALL 6Gh*XxV15wqT;m{\^cU"OݜfS++'mٞ]I2O#…# U`2@jGѮ5Sbsc)HD5sى BmNZEꬢ#*alϿWwfbt ?~_s)qGׯ/kٕ VXU1eu2{b6˜W̐HTI(6}س *dC,% ϘAkŊ4:b4ϐ8Rdb)n] 8}ZeIGZa`1)sz8%/_, 0h=uߪ8ss{ql|b ͼ-"34ϳXEaU`4q7S#_4tP<]B[4BMGWZa|x.G"&z{(E~cMRиql(B9v^w/yEID=^51~̿#>oBkB!+ЊrC,qt>cj+8}wH]͐oqwN6JH`ugUoRx ,/()B*g7>ΪBlZ7ȢY=ŚkpoY:pbN10\p^ 10C+!49: }q8/`ZRx<]/RW03bUI,: sL^Q}5f2X# 4sOsZUӁrC,qƴ>cZ+j5l`KF~$Bhš0憴ӰA\2--zybV|1;V"vkJ̱Ƿ0Yޮ@O6j>bQuX15sn+&h^Ol&AC(Vq"r|jTA|1XQ7W0K>(*u䒶bw >l_1i^KՇx:yL@UȆXv?RF1|"eQ_Rd_b' L79WVsMi}!Cg)_K2/zUȝ*ka1aU9v =,tMAwkmBWc[iU2cZmAX":.V$1SP>"m 79| ~*2aj^#CK*/ĝP(MklWD'=GSN+ < c[UTdkxbrAb 䖍L AzV|XUȆXb'3U0ïULRE \ax~E:B6Z?VzMteJ|6:Xfe~c(4+23^KV4ֳT1}ĉuG+߫j_{ 5 t-@X OYE!j%!〈?+J-K|#r- P체G=$|(_/ZW E+C# 1R.bs bN;PzL >RlZ.V`94ĪϘŊB|QuZ"" Y%׬*BT)tUZ4e * Nw¸3xyh0¤"_dmoN|}E ;A51bӘ,S|jVA fQe3& :[yX8hW+:Df.D)4C> ߊŪ-p_3Y7\/J;r.g]T46eH++!:sV fa?K^ùV5uS`װUp!c]2cgLvKJ}0Ք-(/66/7ya9u ZkrD@"1e 4IE*< 2)9&Xx}>{ s#bMUk?4=|'Q XyPgL` &J JjZ㷶kh?o8Cج,|шчPo8,Ik)j\ZHZS֒iŧIE$ - ck¦}:Xm%K#/IBiS&QV!bU2PiW1D ڎ܈c8j'> ?5C~C[jJ.xC_i,J] VeZH+X!LV4z f¦o1∦}EHJ@72}@haVQX&!2.p‘,?:pQo ХVXm.Fznb~rWֺ& "ԜOSq2Svc</W=lʔpFz<:ϚYq![b0&gLT"5*d]Q}:Q33H Gxٓvvw}s73x|$Tĥ!J6,[U@#9BþZ-&F VlmMy/ZaU5 3Pϸ# W;aS͒p\*\V(K4!%uk-R(ҊцS\Gf@Lf|7K@';?kx5_)($׫bE mS tX>gC%FWȷ7+U;f w.w 8wx^HUU 1s++HD3֖SHf}Twb~jBck+o,}^#Uăa^X;K(k}'E΁qB .cH+\g1c™(Zk5V1.%ݷ/Z>:gZ >`n`U4oFپBbV-^ʜX+6obZlUY՝w}T7ő* ;Vlt7)Pb)hJOIǥp]u3w,'@UDL\Zg/|aUQ b ms$^Q6fG˚=lʔX#սЦY6ĚT1"3xlI+b Y:qK3'jJ؀!br GZ1}AARxSJ|;d]EoR;fg;^1Y6|m뤓>!&f3KU+2:=aN:rĦbӁohyV!b,>c Ŋjg:pDZj Uߞ zT|w޳RAKWnmoO峩rgPU HpǛȖ)H?bM>Þb>iB[`i-C+m@u%)φ6}ORd@a)X9Fdd`X5)= !;>i\ZK._'HyMֶ]žb]6>Iϩ?hVQXl%XjQ׃AGFc`ORdjVk Alċ Jj r+kHŖѲ*wq(7yŧŊ̱3K1WKf=:iq-9|ě=3EXbG>cFPђ;M?׹g I2SM aKԗJ GXꆦ6(k-Tzz*abXm¾Br 0Vl8YQC"(!qKf̘6VXA3)\Gak9{F3!^}\]5^L r:TĦOTԜuzCN@:OZ@F6<޽S☩Fdؐ^#Ґ\bz*!@.&}Jv#b2B327- dL1ɌLmΛ7c3eb/J2Ǻ. G8׌ч9Eڭ#b-YvYE%X>qƴ Pa{u2_n)J1WvHZ StIIVP^Q勊Tcg%\ңǰ XM6Co6:XZ}Ɣbߒ`]W}6W\r#G/>a[V2 oI0K+Bu!yU7gL L)V*)ƸuhjJAbe4^LSV8\}ešqm6o,_xfU9&Wn^_yŚXidn )8$Bu&7fS}+Gk IDATϘL][ w 6ތz-Ef hzNŐFL 8[Td}#%MX>QpZdM+E^mOkbv'mBTYcq%?S8LeOyfY8bTSdHAA\MY$ڃupkT4^ V߾`6u!k-lZ ݌9. i(R9oNx~ߓ~U/-&[dmÌiXZF^pk;Rdqn*`e<^LH)z}eIGEUu/ԜiZkd ;n'8nv:H;>KL6CyJFK ϘֺhNBsŬfmijJhV6XYE& ~ڛ2 Tc`&(z#kZk9 N2ZE#j6ڐ%oL:mN 4*B!X!P #C^-C,;>c}zb]yUVc)EsMb2B{S ,uJ j릭*ClyQ`P7[gWrё)v^y@lcRs+199gLk;DآY+VLiukM"-SM`sV2#ƥ up'^F)rw҄5g̱m_g9^LF +6c.~%oӶR(Q/fsV[^1ú-,SmĂ cDL5% A Mċɠ+o3(2} t*C\ZL9v̽!%:'Tlޓ;!#ʓoBπ!:9,? cb-6"|ڊ17fN}g(@#^rYLŋIdiJ+bTKº͸1w7d"mowCrç$t]cl (zW0 v.ъ!1 Ӳ7nT=btZ3T1Ք暘YZc4/mgKj\6b*ZV̱yL$o~{iO:-A:V.}chv(—M/h"PPG3}q:K p#VHEV1լާ^X*ċwipܲ#6 oԠ5GCC\ZPa 0j:nQ M&*xih$,;#_W3,+ 01Uc+Zy06)U U/m*"܂gFA[kUu/쇻 <.Wl"%h+6"l `dZj@bRF+vHgLƕ1q]lG؀-&I%3YjT=Z [@mۯCq tz*11gV8 4Q lL.VK6028dL(jJNb2"kRY-~LV99_u65a?кAQ2D ,0)`VEsT@2 UB+v((4cc; ?`*0`)@hU ۆ4|aKV g&bL5%O`X[H+"\UZ}vӧkZ LF6>|8 yE, 7M$ U/MB+V*Hb-Ϙ4SeF%li4OJ`dLАVq4KRHw# Op5̦Gx9v(:¶FWTs—wı`Hx)}-2q9_bq VtXn4ٚaL5% β%_J+82EFS(f2aPQܲg|Zc ?`ji^ŠMGFبZ! تӝJ~<.2O>&ɰ}E& b]M"/㥀,5*`1Jk0+ M=X\~Cm$6X/f:;$gׅҖ_^U)@hoͪ[ &{DK1Wa^)QlR6{lU*hDu5;cjXeRf_ؾ8HaTS*od-^LVX/D ,eJ`%:2Zggx&T!g/]xؤ7}!. Baъ:1m%CŊ2Q-TLɸXLfYaOZhKQ /0ՎO-/ xyb_Q`\ŊM[_ ϗRVAw_>G+Ȍi)G +B*Bm18< [aKZa.C 6/>i<îIM4]*`GCs}= ]Z1Q3Ks23g Ȍ rؑVD=QX6C*ZÎ2-~F]~<&tS:(@Yfc~*yلK x㸣*U xS ݭBJ}R~ᯣuyJ@$-Njh15G'z_*:%|*QUM=vf+&Ҩb;%~*YRTC>Ӫ Lmlt)3ՔFmV]mMH`P8E]oc8q!+g]C nӰ]ݻJ.:ERQ($9n>3jkt{b҆O7@\ |٦` 6X= #hZsڎas5gն/dNq[Lx}˴U 嬂xic ($'54B<ӶnrN+J`Tx9I¶^H+,7,eq9)?~ ZfiԐ365{yE+XP/}TdC!ofLFX 6 1otO * e݅H+ΚS,%G E;[_%{LWdZ#ZQ*荗QJ*!tmZqk;ָ -7=ph+iB pP δ¦זO$d-̗'(W$3XY4;~IU/TAnd0zZ1 Ŧv_EfVlt6Ք06Xb2I+8n^`Hl80ƞ}E ݺbO,*xi q)JrSd4R3:Ŋl? B(ciSM - s)(r" :u?"6L4hzyVF&m:iݷK?y*ٍM/h0V3-V!^g9a \i V9Mͣh_ /`j\ %79ZFijZ3Č).Viߵ!6`TSB b `;^LMwi'+@lUDV*Wd.XQ])YA|<>xhE~*B:TțS5X/5U'5lVSMhs Q)VjǃPy!EfTӲ1)PjI [;7R;Ҋ;$>@/.§8P I9S'p S`[Y:R@D {1Ŋԇ^4xo fJ=G[#jڋ,kDҰˊIEqJ5GiWib ^SL<2W;~[*/ 2q|!h3udPAo9Osq9 QCA5Ք0E/tʧ*3 OI ֳPhxyYYV'qYӊ{@&d3Nc :9^Z X ;czNCKKB';O}k~Bj)-P-VA-DB;fK_0`UDVX@T&fv1%='Ov_*jdG9XU8=^ CnA1}&n򭳽h·'^x@ӊn,np\qz_aK!fm!爌웝+^"rx%p?zl͎ GiquVx)!jt8X Bwwon>(,]j`)XED,npk_Xj\'B*hcVJD "ZRySZcv~8ujԣk;uV`H@e:ota ?Xhp} L+bTN";"dqWLh&G~d$w xANB&+fW$ؾI9b^r>Z+_|cPfLXn}3:1t>23P1Ք6Xôdic&ԯ¸UAQB*JhEx wT8JN[G¥ִ2Uf /x)ЊabZ]o.Ϙ4fׄw=üP "mTV kn ]iYm}UoAU 2X5hjd_1UZ_q&@Ͼ!r,+GCRU10h`[G/ |`NKSM I4)=x1ҊPÌU"-,h:>Q VFW1ppDNIc "ݠpt-6*`tR@hU`8u0EF7IԚA:R2Ք\ziE;os#sT؁t`Uhɵto^3W?%0EZQ_Hi 7K ׀!V`fLw<C}X)G^: 6R g"`I 6XxwUE˖p`OitĔU\D|]@*nFx {U Њ4/Њe9æ -x)!V-fL{h:(D^)Q~+8(EpI`).b2X7g0%F VJ;].3+\AhT hQVx) f Ml?gLێCoN&qqXMGABo2ՔOtGsf@tS*{H`_-ZhҪBW.bxHe/vgw9hU2^ aC2?Ϙ.='cUᾳ@")-UkAVcRd/@TS>IuU:g"L*U=}Vh'X¼BҩtdݎGfUNK+!֠C4VnS/!,}nD =Rf6=rT3kPW_e)=`1InXZU LAB*\ΠB* 83CYWϡSn##~O8pgThe`ӝN:";ߩp}fQ >,ĘCRdM5taKXx1XZ/3$ @*l=L*p~]p5֪AmZlUht bѧȌi73`c $ilUoʛb()ӳ1 v!y0לV@UikVy3Ħ#Y-[U(j87Bπ~W~vl( ¥R@Ĩ!8c3X|ű 3ٕ y͟k)!ƀUx1n1i}`Y4o_}z]cE!GOL#;hlׇ>wfN fX/sU`C1CX[̘esZ IDATJ4;K򟶶d3%d+"lY]h`5( $Ҋ~|}IEƖU8,{y> ڬ4hED}!yy6S­R<6 )& lϘ.mNq 8E\(o{_:驩KYFgL|ESM )hN8/&cJ i />XT:B-$m:7 :9Oe`e+ҊOKj-Wۨd=bdR*p1C,?̘ⱏviC 6#%}%*c;c <-"I'%vr&-aC>_{[b3 Ib)'Wnb?"ΓWR"jJȢ^nXEAO S^DZXRGͪB b߾w}|o۽rJ6Pϟ67ۿR:rkTSݴpꍎ6D h?<}SnvZ؁0k|LqԢF>AoEr,Z.DCHw{)Ôr*Rd`IO*+\g=DRkRfVJ;,[,O4lܺR+\~w)Ò> ?F¿~ArX T+?|YE~W U)VaVڰY/k7n)7KgMbNofL1+KawW+Ǧ([PNj Ҋc\JWッip՚X44r ZVSMc~*VF`MgvIսgt|9*ŽXU(mvQ!XQ' ]^yU :y^ۥr*-VaݒvUn x) q{f"9cvQ k*R(ޔk" zNjJ bXEePxӲ]Gs(UŌ gomJ-x"_!k2-gX O+̖ = /?d] BUvshj7/@p4oҌvKxZ3><;=1N@+vbSMq4b2rWrx_Zr̪B k P12 GGxi w8%ubZIm)!WMC-V nbn>^Z Xy5 [3>cQɳZHήYSw=Is /R _@YOT/22W7:| ~@+H洚"VtXEwQ)(w/]de:?cZ̭wӿ)r5Ք+b&rz"@x_V$Z$L]<5,_|k[+\X0g¾KSmUmkYBNmŻ7L+IQsL؈D֐AHŏj! 6c6t(T>]_FC*\Pj[u' CX(W112\8"⪬B9 RTL+dC,yǪ,H pꦌRsTS6bE K1wbKd<8 ֫m:"ଊ'fKGGx! sw{J9@?GS(j7x%R")f-42"K3UKN3jJ a.Xv(ݺ`cUXm/j}MJ%b8/qf#G .j7šy}~3T7E ^X])藠1xi<`["; M5e8RϰWD*v畝D& Vn)N'arKQpqx]fOw4>iiZaUXRj7[aCI+ bյ҆PhϘP{ձwzHgt ϧ6ՔELV*ZQp@x_atŪBfV=Y-å\|.Wh6濾e/x$kUtr Ͱ݌/-4HEΚ+;zcϳHM9 ݢYSudQ@݊=_ۛwTW(-#y$x4ՏW jIV <ި2V9늴 X S8S\q9|@:znjJ }XŲ;b˶02OfKiUB)ح&NQ+*.w@+uZ!f=igݼXn&.t=:^* jhel\yҌin쵰<pHk-I+\3VV]/›\;2+VJϘ8}j 741Xec:yV .n.7r"JT & $c"3$ |@:czTh&]&G,*nO;:\̅t4:ULT~^]<FW--RѾW S".j7gs+ƴHEJ f͘:srthE-` U/6%fapc|ޥ>V=;av"^OP-S-5,bEd:wL+\8aLT۬n0[5i-R! " 3X$[ZeuZ0Qm*A Gw_?q\ HH 1JSp2w{cF>w9< L5%<`AM8 bU@*uVŦݗS{fUė='~xN\<2 %hK###Yj:,1ZLU6kOv`bnJ> T b ĕ3'fLsBұS>8,Lh)!.9gBV$XǤ!)ZAX2Q D]ZQxDOs0[z§[.\Ӫ'f괂*$ITVX#?._9B+zSgxqIPItl$X4(GܖIq0b7rp7ز4p<e`{ XІ7ז7:X;D SoUח}_bwvo=|-~3GrokS'k+G}DQj@6X-ҮXkK@b5T {;"ǯתŠ"E,Y Ox2mi[>ۿoVB2\_n ͠ pV|#h;m' 4;jB+5C,KYc#5>V 5•ټK,Hr@?E(3KlAe+Ƌh"{Pj~K#G |#Ig Uh18 / mYie bJ+|UX̪oξRݼhV!V3!z65g+R>4D}b@z\ԕ!ba1tZ?18' RVD(za lU! 'xD-m- V Z֣Gkoqmt9#0yFB+ 3dL+5vyDxE̳a$k_=2SMm`5$XY< ٱ5JLVFs@+Z,-f*Z/[vB nbRqX*xbAҕޮwZ&p=2w4Lj8EyBW$"6ԁ57^L6 uh(DTA=l:N*sCJ+0 vnJZ^,!ZVCL;Wu5.O{N>WT': ߳7 4ZqThSqaUw1xOL['V4< YޘNrܿu_+T^Vhq Qz f7f75b B3ZQrlig,uyD?S~Rfzƺk{vO݃}<8秃X}x= SMJ4BKCkBBN섶*kc S7JMv7X|7D,~>R+A G|ٺt]'ׁl&_n S@<`Ҋo"s04_kGK~v&4Yyv='ԂP 7@̵ H`-ċF*R3phfg!"UEk|Ⱥӌ`x459O8=aZ G,oN IDATK<:qbqQV/(Kl;v (@WPy@kN56Hc)SҮema8!>"Њc!9(btE4&Ƕf2p{J+6!VR볚Wӷ YY̻&h %H[ui tVQBp/Za"샏5"'_@r!ǃVn~uChG$TN6@=#M3ڒ2TI2-:TV ``R̾Xҫ&4Z`lml7OҪ*Zt'uzo[]V6H\/-Ta[ V$vZg2Uj.f QҀWXbP{_`Zqs5"KW  ( }"aalE>:: x1CR) ъRnmBW(DmU8WwOgߓSwt-Vi .`nx ~R"s2V F+"@0g2+u'%utWv 7#/w`@@+VAz6d`J+KmbM7o×- aqíKf*^ i ~$ H/Ef*1e`sY\CrI u/i~`= _l1;ҊFSsظbj\a'Y[`Jh5C1]e# )RYnR G1s=RUlOѵ*߶F|'K8x_ aam5OIXfefDc -G+@@5ߩ_g2ʍ~k#a9M[Fո)}E>hEZ0 3`//at(ۘ =/[7KBSNo֙q.bL*lY<_`Xq]"6I?hOU{H_V]5+ZsՂi#{^)_H_+=̲&拶X7eYD+ZPbF @"/)<9f7OnI,/ Rۥx.54&cJ*rEmLT`' ^o-|.uiEkUr?}?Y-]߽--!,o!+VUi>fe,zdRM, i!ݼ>b%%DۍLэ>Б>uC֙ %Yjis7欈RU[3`Ub Hq>K9ɷ OV8I[9yT[C;+6VVdzn [3qVd;F,y*N><1t(2 d8jQJ3-\lVn*1h_7+ޖӊKvQf/PWTi dgHPPKȷ @>y%?æXH؇}ٍbvb}3ÚoC锦PX/}k<< ! \*زB*,70۸UZQm)}٢*@+jrc hڥU fG$۵s<1# .\Mj3cѳK=RnIH[Z!`&^M= =bĢVs 8NSm4oZ{l\W5(Yޝ6ڇ椻%i"hCPhB; 9Uo,PKmjxvu)!g6 =զ HgX3b  Bb/Ǥ;X/g@V~+.!a?3 iYVHUYeҖhoWH>dUZaJ+XZjy c⏈2z_!ihE:II *<e,LJQުbV0=7hKub8?3}J+6GVVOuv70ёi+ͣ`z!M+{K]xSNH^@lı(^Obx1/b`?K"U zOjV/>TxG5}E+WVřU0;u䥶ݢ M#s{59k[@Yԥ1r~)lh: *~C SH!|΃%YUq8)0ל*-: ]x}2B;pahE# Mfe!4zE@t<^&wd؈š۷ԥR H׌ ELl1 6X?!y_y D+c Uh16P^jèuvゼ(I=wۥt:=Y"qW.('\AME21%x|-VD[Z-JVz F5EАy_u Z;iJ+ lG~KϤɾ|;biKPdV'aLn0tqd fxe`9ere }osdSwaWXAL5u, V-]8VЋBVTAHSqQ9W|+FxedWWŸ}Њ Ejqt^Uu$dx?tݼcĵEXܵA@Oĺ{ CZ"TE1ԁ5?VAQz. tfxw\8V3)ꇅ5'ca_QnWް(sPeL6<Е ;}vs+w" ΫĢy׍(ͶJ  HbjhÊOh@|)0H>hDѮU0Bd : ^a$L+az>ȍ=ȭHlǾ"B"cih|(&k"1Ԡ򬢘!/6i@6dHos*jl"+y>bjge;}fJ3HC7@ l\Wq&ǎ%y)}ڸh_+TB!J2lc.*Z?Ǵ+7it69g`H6UL,RI& HM41 ,^ 7|ج Z~{V A+[$ ( NQSP~X?{EN>f[6D+ qDzZbۢy,7Ԇ!gIpulssõrER}ҊcTSċqS9O؄Oh*DT `Z1Et}MU J4Eu-5aއ}EiEX搟VVD /A NRžͧDj1؊opg1x41*9@B*P`i\!XViHL e'w>E^*3UiŞTLiy,8Y(t}vyPgo݃¦<9xrڍ),$?/ƓG|IР,Hҟǟ~T̏l@ވG+8X"k1ؖ4tĹʣؤ/geRWPh#УX HXE`Z<94raNY}+fܯ*X$$ ?bjƋ1NXj HfU;^q) b\Qb.ӿ}BP. ^ߧo4_>49N֏(~Z3QKȷͨ֘ڦV ^ h:HXŷx%hVi08B`Hm e+։2ˍeUÊP^jggg(wzȢy-l"H\ő(G/^̯mъ@0aKC7@`. "ğ=bhKMh4l?bX YE떏1/y3'S=Xxw1X4k>nO,U>vg!ULHBO)XF+`KC7ͤRgH: kϧJj_яA1RV+byɓƅ?Up?vM9itbtjۀ::锟x1W:P`)z$rbLAibÄ= E.zЊ>, "m)A80+:'`*$pdqO* C7k乽 @Yn/M٥>lO$oRmTSGA}ċ 4Gŵ`OC7@^~Xnb@RawBiLS` V)@G[jhKq^ׂmS &Xc\p(FLSMCxMz廰Mśܯʴ9 -:|Qn K^BSYy)|:(OV(2y,3x,4"y)B̹] nUVl}v~e &IHw"jX,Le.Q#iU4 E.zc )-5f_!LDad~@*Z_£R=_t ^j5gBg7%r?4 o J!K@@-m[-AUVSyZ" Vx"rdM= e{4 E.z!~X^#dyPR ZțVt;esE*aIVM|w.-EBB^J+6Ѡ#2^Xib7F+{-%V PGX\YY|  hy,d,"G|V, M4F4ZA8Hi(r_~c ͓.}B݁yE}E6% &X&Y%YE ZQ6Bf2yzppkC^0WҊz̎2]@*ZQ6 nR4!01>.{*LxB@ik^v!,^zeGl39i>$U4t4I1T[j6 MQ XfDX  ~Xh!/hF`wg*ntԥSb 2= ^}5&ZT*n*Ƚt,L]NdUq.ihrUZ}b\1.Oa__bkȴbX 1M__on~&GMPNh8%;dA*TR<,=Ib$ԂZQ TAx nihrY[j V4Y\y,N0VAM^Z2'*}cݜ1]aƄaډD ˀtV=RI$*t̨T< b@>]X So)eyRjXm Њsh%BlGG/8 ]dLHrUv!^,XG7x"P *4E/$$OO>+zMiy,sX ݸq'Xa[}7*)( FL6vcV\;˸eAfئOhaM/ъBgMiVB+ ZDזaWJ+XъcFy,SG KOshVJUݛ{Ք9ĮzT3ЁK m@:>r|H,^*J+(}÷hE,*4rkI/ȚC+7{OO`CE Vb@+2xK:"8h}_W𒗢@t31 ae\x6^wPقƫÌ HǀG~֑yE_V1h  Ox8mA&.<= @>E`JvIDhKxOh4+Y X)ЃX  j?H4 V[Zn+=bdn6Za q H/Ҋ##NŨtp2V`ذX4tT|& IDAT*d&+qЖmtts@A2]UnV`yign4d=XF)ҝğl<H*Hc>lUVa+&y{ E!GXUhJC7@^d %Aa_1 H+v~7_>4)VAI^jDb\Ac}p&ۥ=A>JT '( )fcٟbV19"Jt(=d 1KG#bK*bҼ hBӊ9L*{46RX|?2ζpb~!2]HG+8Ḱ7-p{S{V^ޑnUO1%zk YSo>PPf3N*p`iHG%3C|*4\Lh 0-ZHbg\AauVԄzþ&x4Z\ \-c@c.`v\>RS ?6#8VϭTw+~׽X"a!q Ho\3>W6:G!eLTYEz(8Pz(vTC{a; ].zlm6i*@~cCW@QB%}zsc.`Wç#/EPrYb#ΜLoJ_M#ZXy b4^%cD+*ły_PZhh*4IC7@^; "s+mt e"(~aV8e^(zty{TȦzO.ؓRx=crٚB'O8>'V4o8TVq/&&LapgF+:`D0 ʤ??,q%y)}IF+6]AbwGpX)#Fkyi>fZ_ߊXS:,M>ٔihsXH|wal|hE"]V1JGx`HYV˪B |yBQZA]/Ӽ'7M6iT~~w\<2]U .RD_;]Am&ވgg&idP"'bK,\tkN㣊iі`nR (ҕP#Rޯ 3-YUh(n>!J';m _D3b҄K̸lV0eT~XS TBB}W3*K1RSbI-bZB" ċ{Qe%R+6eR{[tl*fB4ttA.@4~+}B1l5u0phEl-rYedw" "/6Nvx(@r2]dV|QKzBI/fT%fqAKu0J:DA~XKuc[S{=M*(cF, H4ns LÐ2)uG'YSrT1]F+:_B&G`AZS`|!}Eєb@+nTYE9ӊ(y|<%R(vRւd"`ċX~]6Fx|c\$#R1 $j42VOJC7@^Җ8a!V|<8­ݷs^:~iVӪB4t8}QAXj'-0]< L}#,q}W\F\S0|́0 ;]]'>ϣ W\ H) ݏ䈕q%k| ӾE]/msf͖ ihsљ]كS_JF.XU3'x[Bs$ÊD^jX2 T)^wX| i)d I+= iRc#""W ~ ;- ZT#A_,#T2ԞXx!da a&Ya//w˗q ;| ]X q p觽-H=xJceF+h?; @mb"픧-m}ш$tv:!턄EH+΀swRL*1Fp ;.ȱ PL!;$l  H  Y"bZf'"wl-c:R+h_`UQ~Z`OC7 jZW1`hKb}V?~i'$g1xOcy)8A uNRŵ ߫ŀtLF{E+߅9NA-3c)e" ,F+ԪBAV F+bfO(5vلN*v;!M1M )9NR ߯BtoSRC+eZM;ZOUP' IC7LS]u?&gmiqB~!ʱa ;!!/qų~q5tfCyRIE/XYlbx&aW\5TU8džUDU1ъx֪BIqy>"x:!섄*’MލBYձX.Ȟ޼73,~X&k"^c*Zq` 1@n>Prrw1׹"m׼Oh0t?ݛ,q"tVAF+ɆiJ$ bR!F(=N%^lWsA| Vı⍵ !s舷U4t1Bxeyc|~1`鄰 ݸc_K=F!¡IH.Fb҃p~k~jT]u'T 4jYEw XN׃, ݀~XK:;`$y:} 8@ ţ â+znJh@ b9(]k \Hh@iM.<`k¤2aY0lIiX9P*4[mi< g#RX:!qD*ZǴq{ywgAqD$"uA\Bށ! ، + hF|d.ha蕾΁!0 @\t~X! nmxЈ;!kqD*XKˍ9g D,\ D*jEvՄrETn'(v(ÃuC SP< @n [s),n=WmiNȡ8tB"blCxSJѳ視\"T%f[F+&< L5K77(uRY6b3JZd".0@n @.:G?q쵥:!wBb$~X,>lHp]{X;fZTDNfY >~XNE!eCMS.whP*4EF+~m_: V\[J k'$$U vR_@MT"5uAb"B*#Ho"Bce\zXEj+D=3?ZU U{,^#5uiK}BFs' f'$:V6xOl[7 R0L.3E*rEDĦi~/ZMpE"d(R QA A*M\%{P^aYy%GrZ'dFNH+D^w΄TA0<1čTG>FM+\ 6JRpF7*H(\o*tP[mL+bzi@FY U>+XָԷ̀)]%S Hź]XzhDωTDNeYhſ큒PId/RРK [Uiӄ4tr Qa۶і!t'$RV;P DWwU6B.J,Z25R/,$t:SRDI++#rP *Fa V h-6] 2HbI^JPhYZX^Jߠ$wA0-TLL!C /v1*ʰGC9zIbZkAQ?-qO3. @\B~XQLqi'+NHNNHĬ¿VK8D@ vA0~74t<#B\pH9΋ъYUhKC7$=2Z1vhU:! "g֡@ߵ R*rQ}榇TbZ&s;F2\wAR+ʎV Eti$RWD--es'dYNHYL+^*cA-X ERҊEf@z SM٬|+TV!3WLkj4IV EhKyPP"NM¯|U&u T|6pVB!Y ʰ V,+WUV}C ,0 ĺ2u@g2)Vh ht 5/d ]Q o#-q%6%U~+)AD=wQԨ7-^cO*hbKND+!চ FA 被鲇fggoIEN+v)dی0;B HG۬d=:*^mPVkY0!h] EZ͒t]V Hg[1Rx##,ٙj" ?eccr]x!eΣC@ÓeUX4t*8V1T},jZ^jK6pm'E$/+ʬHGYk!RD%m)7bQ H\nSͰ:{ZWڡ 1Ԋ˙ԡъXU#P- @J̥B:iKcNH*‚3WVV`y?c!)Kt P_MuAv>l<>ҪF,ҙjY1|` dS2`Ǘ.eJt:*lJU@i27ʌ-uNWV K:sbZ\fB.o O HB1<,t+pwHb $`y[ɴ, @\t<@T |+ ⌷:!|YZW^w7wx?- 2 @,7,mW"駴)W`C@m0)v=u0})eOghn@Њ,蔧Roh:!YEWظsAs(fRQٞ Bȉ*W Ho``4Iz8w`h.wm5dZUhn_+y - 3*:p')NoVˏT(&Ŋy, {z HφaY 6LU:yW0V1DlъTaIϻw74 @GS-VH['4tB-rgiqzԚeEOv(BYZ˳Kڟ&y^3E/ЊG0`H[Y02 U% obRQKL*<ې![I" a{zHw]L|]E`8Ox:]#}%#c?B4tAs Մo Wf\;!"֏qΓvy)\f%@t XVl IDAT HTd+(;,l݅P᭺t>Gjj|FiHi(kK}Bc Ia=_NP14wnAb Z `:[' ܐb6@"9%-ߦ@#,QKAJ Zoi#+PJC74@}eYy- c UnُiGk{nS.G*DuA.~&BSR4С4=WeZ\ןʘ:F*il|sI/"Uy$3{hX)܁N<"݂duA#F@o>L5ޟOZAoCy/$Tl+yq3iMip. h]*Z(!a,jKY`L[UxҊtoxD a]Јg@|ĦgkT)7\yEY5$ C(n, Eik%KR>'4!GL_ܤ۶zaiN" D q]pRȼң7,EcHjV?s&M(B[voA.zs"w8/Tи *h~moА?[Y ᄅR Ņ #ChSCL07A}5mQ 9p)m כ  EWiE01@R7*""h W|_ /}ogT2 _ˆ-Hb! bQ H+j{̀,zr ,ƫ!ڻUώA2S;D "IMkenӊ r⑊B?vWL;!p"$:;a-Hfa~2Z(dE /ZA}eBVn%䁅euW? 8eqetgk$dd`n8zy`Z}0!M-m}Br"&h}L+JUk58sT*A`2+tnШTxUR?*,1Z׬f.N:]M ++E`n@W񾲠- Z'd"(pz?kokʧ;@t A`M,NsFy_(]͞K)z9rM;䴖\j4f$x6 ݀|1eڍ i*~X6ILGd8݂ 0!S7{adzXiA}<"fX)e"s&bJaGQOj\9nLVx4UIů촢4n* @H,ڐvrE_Y21(\wS,,x`m`p]qw,4WY, IC7 HX:VUm)NȚ UhW_,䥁3Q zH65Py]{ h$>Ƥ{V)FB~Y7Ɛ2-OSP`iAI?vT) tmwjM`_M H[53ZuBDgECMͦpk>>0Ce@ tfJ1Sޔ†aGV8k>Ħa-QY3h5IMug2Vy)CRs3һ b{W j\1H"$eG+n6_Y(vRرz0BRP c+ ͿOH -BTV;WJzKRy[P yY +81xɝobhh L 9IRr寅nb(JaxU^)U=)%IC7?E fiKV8acRGRR>yw-Bw{ oO쵶B@t * C_|ME) '|◎_w=nJ1ĸKgU=))"JC7PTժ@_Hg=U8?TՖr¯yו\v}L^kttfV D ڲȉXws]VF=!mu1j@#Y͔jUOJ rѵ]n_\h]>N)l*¤qgo*8=xA&/kXcU(݂ XM5}X@+t94ȸHg~;{~Z**myTzN0{)z( t,e#V,[[Y0?Um)w*J}߂J*ͼc560*Wnh%uA4gvc/I!3?kY1H_~+9%}WwGաځrbT'wI,O1RU=)5JC7`E/䨵o5kVvg!H*k3M )~sDQB@t+ Qj?BN酒]腃N(i ӧ= \YЊ4|j8U=i@Dn@E?\ubNH;jVhN}bWHtU[Y6f4 ghgshџGdz*lXWJjoĢGBcWjzFǤb bօUnj},i~EB1EzՊ`a!4tZ.+geՉ).ވêjKr;2 a]6U@t * 2BhM!S ;}ihhY {`$5m0ZxU=)Dnxu/\u"-ӝ\ A$dlmxъ@m7زT CHhO0VY[Q ]` yч`ŊTgL+%xJ -Gq{|]H/ғNUaV{s$mfP~X-m}F+2T/_VA} H׎H^:NǏD D gD, A7hU 4=?{2\=K1-{Q&u=i:QuuZ^8b-˙Lfj•Uhch4@.aI:Wv[._SMRa Hk[M8a~5ih>6"5}qѼzkAͶɦ!4" bcQհq0X53Z6*x_!Aa|sZuDQJhz]/*\ #SM!L}vfIJwO=KC}<]LfU4 S X^RkJI/U i}=3V看Aϊu-P7,GVTdb}=H4%-+$ Bh4{UYwd޽Ln|)o b Q)wXSR'ہ!MCG@?;=霋:ma5g܅+<*@g'y Prmꅘg_ UC3GsvG5Iqg*f-2݂wA.gR{B8kTuXOV!:pa![SOٟI3 IEq٧Ӻ)Qm8 +2MOZd׋)Ԁ ZtӂaVQ(ōUB"g!xn >+QZ%ܺp)QA@t+3, 4o+O<Ҋ/N.]P{nzzz֎oAiWN Ӕ+O2iR\w7:y-"NCw&z 8EhEU[1LxgMK/PJ*%bӏ;%#t@@t i q'DDՕ*>12s*b4A^/-(_81A˳̕?\O'{LtO{QOZ{a$HU) |>vH!}h@*z_FaWL`$~K+[onA" jFebf{ wvJg@mv2 00xlDEQ#(|A)ߟb6pEtU'eHߴtpPρAt:Z!@RgR`m~ aID*fl#7貅r< r۾(B@t+a`X3ܝR:7t@zGz꩷zkaaʋ/U%m'Nϣ/b c!rVʃTh~C h E=3:![.{SM@.kdx2L˭?՞xꩧN-,|HTĘE 햭H݀M)+l{yj}y{?N1 ,=顪4D>bϡ\tEõ״~[]7DwT¥5 _ =@~We="p \=k0yf/S]86|ѽXm͸'5SZ=r<#:=*3QՓH]FYWZ[oҐ@UjnRZGgtB 1fF2 j.!\ .5Ϲ>O3*b0#O<{Σ6S }Ne u I+`{zp94tL*pbRrsvZf3/>Ʌ{!ZV:Pe.W,el Y2:݂$tA0ՄFf.rˣ]3JaXj"[<ď{ 'lO>+UԡE;b ] 4RՓн[1XqC4*T=6c\3UxHˑǃTX&gg^8Ҿ qKM؁Ŀ Xh)MGw1W\LN=SXjWċ >_^]WeJt3<,f.| +@+t:- ǐJURѴՏ`wtm7Nd**wBD ]hJs*cF~w(mDr[G^D*+*y`R*W/^G8Ck=FS)4D 7 ]]t_m2`:W{))L+~O,F8+/y$h~_c[c(Hٺ|[鄠@t3Lwj2C> bS̐Ik]w޻}يA#(kMg@y^_PՓFpKІsI- eW 1TI54:dLuBDD ]榚mf ɪ/à{/M)&@Ԟimy?}#IKU]B4 HQQ[021omV%|`*o4.w͸fZQ tTꦧQ~ HÔ7\݉!%BKC'QD\Kj@[ާ4زߪg!V%&x ZL+t~@t ai4`T< f \.^Ѓ9ʢ>ymz~,I]UO)JC'YE'?,-SSlƎ (XEp ק 9Q2bTcjQ_u5绳 Wȷݴq82RZ,(cJzy$W\Vk-(5&VՓFP]l?NE."]ՖRcZ'„BYlSR.hλg nqtg29FhJyJ`ݖHEvHD%2uɹs9*!7'XJzF:"Z 0eG+a>ħS|{gTW!|V ƘTWG1l-ī L5L)MO ZFlJ, }ZצЛCۅ&Wk܃#=iXhB6^KU4Z .@U[J-G`;yP~L ZqBR{.;!:!(c,ĩ T34տL|3ĔgL+ѾE5#}IG)o:A",Iy}:"z5Zm1R YޘhR35V~+OȬ 0X [-LW;[.+SMl1W8 lI-h[λ m wA3`^@y}JDiaE-;FQ بnhަ;)F2j2kzR`fu.z~XgIg4~@{(=ϷQiИ81'ι'aZ,lVdd@Njf6VbmQOtvG( 9ʵqua&`fXZ9S|yyK?$v}}|om43 <@c|dR uh_,v'VA\j.N*hTlJA"3VLTn㤁ŢyR?Ktq+j'Qw@ ~ U+x5^UԷ! wPQSA]x JdC6;( f-= TP T3~=Lvi]tOܓSȎ"S ?AcJA+P+t~r!zIԣy@G:ljh޹OR&vͷA\{[!Tp\2+!ɣZ yJtg@VAL o]͑vA c43nvS 'CS( ׄ40@򤧙RLi=RF|Ap T h' Cn^U|]&3i!faKS?߂ŷx`:5&yҠ% KL]C~XKNwixġ*x_>oo^0~y,_ ISMԥ!wTT+ǔD Ta%d ڝN?&ZcdPI8VD4QE!xxXib}ő32 |ꕔrw~,X6+*Ut`wMfܝsÛE-SXp]N4OPQ 0հXqۢRRp >WlBz@t(:(%jW ʷ*]͡w]cֶM)*Ujt@YjK+GC!2y;ϣK0}Sd)Ey6o ͓(е!68Sq?Kà5| ]]C?+=:T|Q HWA(M5.5fQnJ/(e1VƐ19n4<)@h""OC}eĊƑRX!+͖ 5qtI| s|O_VSx^3j]IwODTqͦ0(+@F,ZKKyp8 GVs`v%39OEб3}1Wiu=1DCW<⎯PXVAz&)".\4KlVDR )E9I,r`eowt fKޥ;UPѼ10P[T0% rpmD￸Ԣ(ѕ.%T5?hOXR۹?' z{\t>h?j" VAHM5af#ț6WBq%bn}!/}`.ͺup EnpQT!qy= @VT1#7>Ot}9;YЃ9bŔ3+>nlD?TµʏmȦTB 6Tg0<(WYmYҤL)vGєғ^zhG%vƖ)՗icлlH_+}1-Zp tȷ5Jl 9W袩XL5aYunrS PIWAA*a Xe]R ]ˡ)cz%.=V{@bTౖh*@a"*H]ɲ87#Sf͔"EŤ PPJ/'Rf+B"LǛ"Y\Bd\q'hTxÙ*VfCl\N++^RxVAP쮾6B?453n2S *WTq`8v|]|%#V+S$*D'mY?!ql߻M8SzQցnݯԛO"*;*"?,;UAΚbwuibSfJq)UL-0 &xZ`-S(XEX{<|gLC墫XGX wG@hOdw=U9S}"K1Gr 6҇޻>f<&і*e8v"òU*2ޤ`q~n0RXŸљ"n dMONV߁ia\;~^R"gJ*Dq 0$1J$m: ZݔªKlU*&Nc IS2 kI( dKr nAcŪ-_ U>\BUAlW2%&af\nM)X*ږPQ)%UDX`4 EW2k}ݿ>KtYbIO[t( Gc *v֟_(iU5@3D]ԤqRXFYiUL  c2Scr+iaUzs\ ?sܪ-]@ۥTacY JV%UϟyzH|#8GKqfJq_3t=CfxI+*A S(t'fT}-_/./!\Ź,{ذ(ҿD?"~ U,;<5Z8rEBE2TA aJ]\KQqM)8)]iB g c h@K衸#2X_3 +0kS:yϖ hfp(g2,WP1B&Qeb!cDwlK,M)ݘRXuҥ\*4p R1) DPiIwsNd.:3V,OG%DeF+T5TDXa/\mLIwzLQԼ[9S"Š憎19NW8!p(@ tx" ?;UT(.WT;T6c:  [{t,O)U/㷇 R+ma S GbT$9 w%LiVDVlYCNOzT*Tܩn4ɟ7̶VyN:76͸ ~{#TkÖCQ. ?,0[ `fLSFOz*"?,{7>0 r I< ^ٯ=Fyo/=.*$AͯJ)VVTA FE~XP;4t]"s ,Xљ^g2dbIlBE&d,F6Y|19!A/q1KwTap4cSP:;h+Ty0`5--\B19w*.*V4L{?2 l޶S"Ŕª-t.`V(M+>Ĩ!Ðo(uK{pTdd I\O"2(088uCO΂ZǶkΧO捫*ڀGաlC`+hډ)ݹs۷ZpQ'"< KŠm?2KIX4t]Bsѩlj{XiɌu5\{AjJ64,vuu)8v %/4+PQ5 O¯C09jBmV` 1) Ql+2TŊ8ŠOj-Xݺ=uIoٸ\a|jbkc\(%:vozz1 )7`,+6v4dq ݲ U@6TlA &b=@$C8!MC%6@釕H/Rq؀?e(t+~:hf~к0jF]EYiaY!B*xnwHFzTȰ>LaT i.: ?Wc5 \idmX * +@ӥӢ1(\ggf t*mPAnuH2<ќRby1Ĩ#*X$B\XuE/hc${mjT\a.VSS2X{]f]X@$1홶ã\>s!Z ?%2xX.JK%&33uuM%7ޜA[Eglx;(j8tA FE~Xދt(i{M^߀()Ԓ{vAi+um9Ӑ#NSA~a/\>uF?,< 5g]%%&D1CL% #&喷T)V؃@k7Ɇ7 ]\tU!;=fKd|:X&8'pm邫߃a*EBA[C?HyeDyQeQ.J.J8 Ůիt# c 5(T)\ay+ɛ^z̖J jAoX2w2)ZA`B=|,哇L&A%Die,J̔_pR==ax]⾱= LQ>o"kVx6$!NC%8]Ŋ2A:9Q@oCp;#8tUPr(w !TĔá@a=yvQ,\ ɺ/~_sʥfz;A Ch$CB#2.: s.~Xi?=퓏iz^B|}q̖ 嘾u"7r6`Ľ-+XC`=$=c611Ppfȼ>C^DX#"RQԝNCׅs\ȸbq-q7@SpvUqc]%6˙l!*/ 8 j(4 NzrXND8sõ=$=UIPAz8xF;R*qLs3jx@􋼏HHLY{,+ ?2[*a'"}XBN/qp9]Ư%οJu>f2^W";+L r q+rH Uc b*lA{X+HvZ%RC+G+iP.Hzlbo$aB">{vTQ(.rE%#oClnf@q+^%GqvQiΞkMu+*D2]ȳ__qh&" b }.$~XKD XF!RLuCh>_(S+*\G*.󨊽n =$=պ-J8h­C eQX ,:d-%݅i!7NpT f?JF H1}:QdF[iC$ 5XAI$(7{*yRP.AT!)VP\;ɲH؄*ߔDʩ+> ]0 NgK{e[0e;`:ONh[י*LFgc,ln6'G|X/쩼Iy#U8p)A ;@%|#񬀊Pua R Ζ徃F溼eS)[*4.kx*Kh/XB4}qQiT=ISaULAy 6p 7D"5'uVG]L @UkDtzV|bҹ*-8kan4)R%;ydL{V;JTa2k{,~\#BdCE`6 b bŧ'A}N3Dy_M15'p@ӛsŚDF3Naw*~ՐKx.z)x;)TTvj[`=t ԭL B粵Czk*TR.7V|Nc( XrhU af\1fk\fK&8|`l|ҧHDB`m#qIP;{{\\h^]So$)a+uT8VO.*V ㊅㊥-*g8?phR['*&BI(0 zޞ%('Au 8 7Y<T v=W$.c~ԺB*b9DSEil %`.Yت5f +i]*T$DݢK{*#TbŪГn+]W@?3EاĢuᲭV8n*JCA.V_{:gKJSB j$۰wڌTapx IIp2 ZMPanBV 0x T\b kSߴ={ۧw]B+jݜE咡1(@Jq*JCA.z Ζ>iF7[171t,҃sRq3Uh\ӝ;wϥm|OvTN=LP4w +ЛtCx_j` z'gKzjCغjW\w4t]l"^Rwp eٜ5*[ع5+ڲNȞi֞vD\/*ŊI}C+U)A &]G3ʭIj;`غ::~VFgg* ];?,8[J",Ro~zFr+*77|_~9ES*6 j(4 z$(W=u!l^Ѯ2_Uzr+UlA6?r9H 14*j U|W\`佾dmQcmy=UR䢄\jIF^y_Tq$SgtX_EXA,! V]ip.z%'h'OtMbIc )z[j\Pʼna:nk\S:$m&A5{d._IF"!TSE`&ĨlJQ.ITgBo|¶usb1,TYV?lu͖2?F!RHS**/Rů%2{NͧՊJ%rj% V݄ތJ mz_jP4T 1P;z6K%SZ+$huybEa'p,e/b)RZs*%i* J4:e<G~Tc쩂&! /PT( 1j]3ngkn^ĭJȫ+V&a3Ֆ  ֦*-d;)Rc OKF@'~9}7V+~ I2Tg]SOlB^ar+U}i=0-h1x̧/VliS+X&HKͿ7'\`Z{EU0l/“`y֞J`OL 1 c>d>Q)`묵UU.Xaojغ^"Ws0 ]ӓ8--g)&^D xE"564PtKd Tq|Jϩ?^I8 woCl.} BmϴIP4k+UTr>0Dp)<[UP΁{u[7#(' U  NJP+zOTli?\TǚH'PC+TLdLT =ಓim]/~x w`,\QS ^E Gշ!"^*hnȦTQ>9LeLա@Z&8nv꭛ i%xJ& L8<Š,7%cR:8-hWy+T52h3Ej{WWTfn7?ͩyc]o^ $( :dKqʠJT\(n-E*ӳغGX k>R,y/OLUXXQ=b9Di+R")T2Q,w\pIҾCK C1(s{=v'yZ*| *ZPEBl)҈zwZ& CX=:~;xwo$Vh҇-T혳"5 jZښv*,TѠm1F=k5/ZZ-i.x-H =@,Z?l*t)!G6STqOz6K˫&qԺV HxvnIPOz-P0śKVktPq@.Q8gDҝ꧝f{>oec\.hgkɃU*2ș*@'abצMf"Š:/]K/T)VNS:|fK0T1RHAs[K'XO,TKgm?ܮ֟sZجCEK8 Q*||s3E v4[qNسYᴟX<珁U?D̓}Zۣ%=E/ {Ӊϖ c%-A-v^/M-\ =Y>FFy_겥00E <[j*lb[7(^p76އ#fHŊsUc{.%֊gȱQaԤȦ!͙Zix^)`c_t;8GWdH@kv,ADR*0Tlxy-[*Xv;͖"%|@p!7 nMxz Rbzv=Rlz^@O{߬ l}c!!+&ST q-JMQ{?wiL^LĀeߡz4ͳgeM.zL=lp5ۊ=oϛe?)OW tu)T2^f!'IӤjݜفU,8iLtbC.B#[lgBy^(|rtká[m{Pz@wɦHAPPQTب@zE_/*u-2$J>j"UdT\* T:^n)WD{Ժ[+8ZU1w,˝K9>#xQ0oQ.z۽{ Y`Z8EzOtW}!qwTQ苕hL2* Q@U=7c6w+])L!d @e-Ζ"ePf0xjZ7)+67cH rSrNFv@Kc+=;%ST )?[Z|MMVz&qcSU$5әk ,B=w>1UDQà(tKGtp2E v0[8[(W{6&ϩXS 1ëjBAnS? UW+mcYZ.)\!\*Rvs&3ЯV^Pn(QtPQZ]A?Kb|g}g;-e#QbŚT(Pȯ61S̅:=Xl)(e&__`1BL,˦uD,w`|ף_ l߬.yu:|bйɏt=`Ʀ>N \ * +TQ S #)5~oJxܡ_TtAc֞fiq̠RHR$г ) {.%Txn]nfEBF ":U Zޔw?[Nzqy&Ai:}/! =]:Ȝh" *yXރxum`Fb=se"WaApxTKnvx2Ċa1R<$U[;ܪoCXVdd{XF6,m@lXR%.lb+}?vcS(%*zmEDAt Ql>.oPobl܃7DW)BCT>ah΁ PAk6\p7G.=ΚB[Zz=/@UU'T+ ƫmD8  Ҡ }WK غYOhCcy`Xzٍ=J#ςw}"ji"=NoH<^? aTĽ\.1ߥ:ҐEWK T\B5~R}f VSEO/*"T5bEU*SLM|zFU)hCWf֯yT};0l[7yW,a(Qs?3 ސHݪh"=^JtQERPqyHќKb[{]npK@.@hm466J+lT1JHFQ*8UX1ИBO[v 6N4[^Yz6_{(0}3Tc&jmأ {@HuT1F-}1srco\t 鋉Ŀ+;󤬞ZWrNE˃*tYqNّF.-1%F'^)*x P`"8W:SԮ+pU !-EbējM?[7;uc:#!4IVJA23Eew;l)VAoV٬oUB`R qأ|Q"Ń}Sx.M@g=~j 5pSS #ݞxcg 1KUMV<}|؟[&;MZCJ"TQ1tK=洢jGn}v؃tNQƒ$Wټp WVz5B!,7+"R^{Wμg`od֫/["/u(ȨBB3D*@(`x_AP2(7Uio?LMZ&V_Z7C?f0~>1 {е>T օB߾Y` ̖>Y ?m*.nK-$~6z5*RF!TcV +&>U*"TQɲbidNl :L,{UкN8QNIh7H&-+lił^ٺΏ7t5D֫'4!%Xwd`EP72P"jR6RD?nߜ7C"2a)E,-5l%vt'!SE-+]B3Do響L~hM;[BtsI)Ժ6$NpSnT6 }s.O%04[D8lủMe!Z=U4K-2Ux -\g ` @ z+M){6BM$aؒHkS\R =YV@+`j¥OޘDs;,FQSżȢ܍ FI*+p3eMA ԳXL=?,&pf j x%*zm|.(ppf\[P |\t8[ʶ=  Fnˎ+}=q*FF(B6ؾz_e6$D" Գ9MճY+ MusC[7Iísn=DbN}־Yt-DX.yH{[ws%V *}ԻTx" V"e_";!c ̒0~C?[z6IR'sI޺y:BؑFj>+֖n Td|RQƜ̪hbB.(# Ğ!*~S*+` ̒4XZ7zAlݬ=ԥ^RPx7E墟+-E҆opjl7*݂1٥l/ IDATƊaRIIut(rP YaOPA*z ™CR,ܳI0+Wej\ͲuȺmأ󰇃ȺgԄ 8Zf*훂r龜 "4f } `+EKҡTXfJSzh<40M%S䫆JHQ,*uϦIo n:LaauLNkĈt7!BLN7̖B+OyBREÇ IUxpcET*"TAgK<u+pfnhw( {xbNJB75a/&f>YEKMZ1|W(U:˩hSQLw\X*c 4KRdgYus nb7qx\z+*afm7Sr;Vt7lE$;T+;n^7M:wlgK5ʬlL9Q{KQ Fx媧j嫆*YgKQ&Փb%?,L>ng#k밇/N RL׾)"\z)Ċ5 ph,W+ΌIˆT )"T1GH쳥HV$5l ߳3z/"m'ܾ)k@o Eﴟ-EB4hTQhb># Vd*.^\1GUH \̖"%}w売Y"W:o> {KfoHk\د-޾sѩNZ8jtދXmk^{oj!SӨ`N߳-E¾%mޮ#8=b;T(bXTqBWOmH˼Axݳ[k=UH#"̖"eYz6nq릇cS?ki9,7jqo=§ζ& P~n<-݂NJaQ|$]aj! UzՁ"(Й" REpj"]t?[UP)ʞMXQҺ0M-KKma`kz1e"Lq \t&/|ģGFls"i*C@H^VdZDX`b#Γ)D/yR,gMeR nMnǬoaOz8h+=}S )xRzl)7EhFnaWPH$WG>UvDa|4QT)*HSy̖"1l ͧik{r^n6pICFHSs+͖"iY" c =cbŰbNQPO AQ`X~g Di lvKRgsWZ7?/ +kr㴖a TTph훭orE+Zj|z_AUê@%LK),Lr qL.#QX$K5lr͵Ab~y !F[><쁟]|gaMEl&\ R$-}ibT|,dAn T* 3eTJ)p|\IkEqWP@TTgфDp-EJNMl\Aa dbZ7/MmurI*2o7 j!rϥsd" "HS LXJ a9&L_Si,PA l)ֳI,ܺ~ͯ a:'=>!6: k䔋~@sf`Op *KȨz)%:ɅNIy U@qGS*ȃ@ΖbMv28onbc%(){pQ&\tR$Eh!&GAGYV9@PJe,+"r5u\T1TA|i8[(Wz6aةēuUt=,BP~NTnl7S+F,O^b6+D^HeU7P(4 V1RE1 STY;Rьrk$M_Pȩ3=Y劁8TqlU𽯊Y >vw&\|z< t{cOyŊa9SLJ)܊|ĿOg;P$P"TA5!w)Wz6aQZ7mZ_"@T!4~ۏ\u]wXH<[ ŷDt6'u ͨ#"~XϫprqD{`0"TAy);Gݳ+jUncsCpcڅ2?q͔O %ĊiĹn Xyd=2tb h#Bn$'@PG^EĊʰ>☏g~fufs<­qEA ]| @ UQ 9~L)fK|=&r ݨhNŕY~a:T)S (p;U%R,ܳI W@N/\R9 oELϖ"q &nolV `qŞ*P1 ɋVd|qaz;2ʭIj&/o?+hrDP BAװ<$D@=N5$WE<:dwʹ}SŊ}tzs.?sZӽœhbn${Ѝ*A$,vnT++ x?b )zvA fKؾ{J |$З$8I4I/anߔ8M~Q͖"qmC>ݔP i-UƕF?,- TgI&ـ#r0[vVZ&('8@ sp7;c9}j1*7p]].LY{#-] />~2&גQ)5&jWtշkE&իd 7gD̖"eէKT=|Ĵ~ /,Az6P{oj!nJpvm,Og^H6Tap*J/ ufOL~A ptY'}"Sǥ]B̰='l1j $q~z:SVHQΖ"iYl>:1T X1,+U$dn+ny?7'wzQl)|q#+@G} &+]]4aM KNO3ɻhTAXi z_quK?,]T#S АSMR$g|+WCvC*NasFqjq`J?[ Ŏ >AW7R)U%iԈR6FqawXAuQ` qH#sJg{ϱ :g .԰ng}PSHgYh@Ζ"e\n~X)Fxr +`کoNltNKlbLE~zn'*JQ'(+=L|7~X?@ܭ|UATϲfK 2逾9Ml\=@|{Ғ/tWf®uZ`ji`E̖#SUP MˉhX1,Unt,J$~X'x"@` Aha/hZe:MwOzEٍ[oj!> \t8[8:6R[jz ,K&(5(4T-g+@B87STUy/ (=y w28θkjG@ R$0Oє^H8*ozWO)blE&Ӌ )3*@ϖ"M0 RKzIUT#k*%TTZfF̜ޙH+g zno2V K Q~Ӆ> by b wmRv,p++q$|'V+a* R*mskZf\tR/'}_FG/RN']Dq!nE>}Dv̀b6PLQTA"|K$* Bt 9T GvaG;on,s'R("4O^HUU)PJcˆcB==0 iH =\bN/}}OP7לmhdEҳRs.4L#-n#RƊaiT1m1S%o?}k"pLQTA]x>[S4='V3ЄKC}U p:vF}37rl.fK*Ňi}f\Шƨh0*WQW_C6xLQTA7$ ~)ۅz6^׹aaM-*(r'ڶMMBln>`E@>*BZB'bU%FqnEq~RGV@ كR,*ugVсO*T2#zoٴo"ɻ-E*F }Ԓ{\)"^ Oblo;hN\50EmkU@̖"f[$ig#V߮00 .Zՠ&ܾ٨oJ$C.X/>GGe{/f9U@ŕLT HZIj*jn#.X&zPOQsE`QDF>l)e<2xĕqbO7[Kæ.֪R$uPۏd[>eG?&G2JW7R BYF/~X }{ہHJy0T@TC fK){6a}=H,%cJnϽn5QPVQƢ?,7|q^| hP_zfjB, l)ֳIړ+ӿw>K=w"@L}S7㭗L9̖"(}M"*Xby'PW֊LހE */'j6zh>"LBO ༥r)RK=x{0!4vi pˏchXcД>{_A1ƊaQj'L<Ľ͉ĕڟx9[5z6鰂dƓN7'x`AX{ NO *cŰbNo<<08mHk-+6~Vό;+kQ& V?Xgs>NVHE\^D"7>b$jAK{.LcÑL|":B:x̒Ewz?O a:3mT."tSm+tW{h/Pt./e8ciT%O15[laE%?,I/R#"6cgn}+Wvgli<ӦFF}r+eKٌ2@Xe\{_NP2Gt4`g,`ͪ fKg,'_~R-9^ "r5oj:}WWo^E*NϿrKYVp{`Z.UYxIENDB`astrometry.net-0.67/doc/quads3b.jpg000644 000765 000024 00002143353 12651445460 017412 0ustar00dstnstaff000000 000000 JFIFC    $.' ",#(7),01444'9=82<.342 UU }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?ܢ{W‡Þ4{So+lrֻJ(.b}srIu]q!=-,`ʍr'}j֏mp Q~UhWvr?VMyBqάE+Jsu-^}{]ӟ\kv6 WH2@?Bkr cDjޗmw+Ck}k)4-!r?گkPOO5dW=zN%c}+* KErׯwUA(nCYѰq+}*鲆E܌pz6'?#aQ]菽)q>J",n`<>袊B 5FKi-Ͷ'}*O֪xIZt 9kM3*دrKbKoʦc}O[Vj m%ե4e:-m/LQEQEQEti\>jQERMfi6Z)0'8?w4QEVfeUwXvu]naq-}ϩ P.v=X^qJO e?QWEˢZ)ZE.;[^Ig!p>[:ڭWb^p-mTs 46:Wkz&=6' ¸Ml~?BBBI7(ɶo2CH5\#.yp:]go1%ª(wl۠$q 5R2/jV˶$4Q[&裩)&S=xO. F?GQQ9_0*|bC]3zw9nzz֢_ǀ/U+^[#瞍xcƿV_w{oΆ܀U @7$rJ0׭-.ėv6oTHWwX21G|8x"O'e'x݌gP%daei{%g`㞫֧jzA WzPKEEq:[BҿAzJW.^PbVQ֣kx_D*ӭ[YcMB=t,?*5cL:U}9}J>䏠45~u"7@ruNGV}F*E6jj@ijyY#)bj|Smdͫw;W!t(ly$e'0x5QEQX~#[oW%ǥZi~g;sVi-2y5r+=.|7&q4b~e[*QEQ\}?E# tڧ.z"W?x+FfU)oYT{kNXajTnדSEJB'r6M_#$z{X mk|p9 签{>W%YR:z0]'ҬYzEYG'p~'PfO͹gW+𡻎IEG<$\fhEQQ\[mn]PGY2NJ"ZPGRݫMV[OS+FfVVZQ8/3KϷΤ]B'U)>O4(~IkOg˹޵4d~nB¹s:Cu*.W>Ձ,s!v#X)0YZ|qV5k"133ZCUwO𦶫 ꭏң}[l-8hn)?pjj(((([e)m8|cQEV^rRCm OQYq+?:(5ƍOvf\>|Xoak 55P}oW97zj.ow pIqJ-[U?J˜Gu$9ǿqc<),g( 袊<^~XbŬ:(Ϻ0zƺ&.M@Ǡ8u_ֳO8DOVڴ:Ő?KV|}`]HDCwx_! lUsɚ+Ki|GJEongV`0O&5랼;-]z<}k<> Jo/ސ~4Q\淢6}b ȧsϨ:& Q85oir27)`͓Mgq\ R{j4tqX'V,"dE :nc]i Fc% 8 ̼XGާ׮nRD̨N3ֺ-öb dQ%2Y ]b"G?ƲꍺV1g me (~ܚY:bߦjŎ$lv+~8$ Q I%!$TqTf\k>_3d,!UWѩ;A5t{PՈXW9J @)h]t%$k,4I\<?CL~uUۧ\dʹ޲ Ԣ(yZD 6k`kKhld{757/P>ZJ8[m>c"vG5kUKM^Ę%GTb֢dlՙ爯<إ:e+XP*/@*ZmGCiUs-\{W#ݛ) ;ӱ>E1>V7/z4% =A OukxA gCm9Bf2Yi }Cptc/?cBEHZSec^?Ebmò2~f?ҏG.]v:<0ݓLZM.۶dh$UbuUKKo&9,F+B>Š%].naG9'&$ïnWU7+ǷQTUk8p+f6$z'~5qJDFA Nr+D׿]55DP0)QEQEQMdGʭ}n8F DBۮ.!97[5(2BrA瞴$J4+O BIHߓ<}?QY dsŜ0^@+Ш(VW u3N|eC csUETs—I )"akͭ^k)xGCZ֢*+m[!vQo 5ǕHMY*BדRQEdFXZ"ӿ_ZmĦi>WQU#_*'kϼ)q%uOIׂ?/]5;Aηrn.9?KQES袊+;^};XǨiKiMAm `^Agl{x^̗.Ӓ yFP]u8~UJ1zekȬgάO۴J!&7Q?QTmCI`{gիi[]Cl=j z+N+sYvi1jQETsBQfm>l}y`K9Jok{ 6@z/mie~W(*a#y,-U$"o}FjRGoj3-b+F"0oE&ԍƣ9?ަ6fq9FӤ"7=䚝ƭrx?J͝ V"9 Ƕim8jQT zz7a =G)#Lr=jjFv̙j\:݌,Gt3G4MnvqM_S|V?5a|Ga"EȉĖ{xND[VF?;YIcf9'4((jMO|֨X Z)$f(;*Yյ*3һz(ֵS'tǎ;UM@S헄wQC,Q DQ>+Νc][ReX"=6Pr8xvOl^@?KawjU>Uu$>뢢+YGZoĖ`ǫ((Ze763kiSd[_#[ g1(ÿlW7cu? &&h&ܭC]-D whۧƪCI;0帐c?J")tRXkxKU}-J=l$O?zmQ\淢6}b ȧsϨnGeU=M FbnƽBQwcVh)hWHȁ~_e3<#-O5_2ScNY 3}2d=[l- PDooluF[T~H}z/^ӡoIT71[&u5ZSb:?+FM/K\.?F4ɤ;?閱PsUGQEQ\uCdqWP`ږk/I>́XZ(ƞƴ((Y ~^%NPJ]#]X-^ CD0kKC5ܚ4K[^+^κܤ:kla-o'9B@y̒߷y_Ra]I2iW'OL)e?BWDQ^E^m#?Dx? #!EszŤherWVojqA.fy#{m"7)ҷOH?~%$Sê^k6wM˾(ؒ#8hj1˨\7m*s^6eqC%{B6:W={'Fl&!E' UfCOʽzW k#Ֆ`zYӣ~$0 =GWcAc:0K{YbmOj/˷ Q xFX((* kEq:F;nnOW=xKv'!ʿYkz!-1G_7{uK^tȤ{~%,'XxPz߿*l쑗y3怖6͛ ߢ(z٬$|ڿS\?Dn)^qxÖ>ZOʺj(kbbQ`/P0z0Ҥ\>\|ӽ4& 䏛Tι9rqڝ d>H}QEUX8."`Mo#<-SDbSWq(5 nW̓T5oMXuf0;z U*U(;ռ'~c| 0xe8RԼ[鴉SmOO>۽o8rUKn*OSe Λl㸨nc^FdnO˕KGV4i3֬}&NH'޷ `=Ar 5I!K[X''=}ZpNcl}֬QEQEOPH7tAY6e̷S+ rpa5:[5z֮ES]5zT.5xb1E澽atsoʲ籀j,QYe ^]9 fqt;GřZF[I$qneQ~nze0auK"wF=h_4 )Zr)d.C'"$j w J:Zͨ}?´k (5]Y蜏cOK!fRGե`{8Z?XT}2?BDA#'jj6R}ۨud0a cK\oPLu~lw<}Mdxgs)p?kkBzy qEVVpvzN[hNӣH3}?EV-6t烏xr]տWnQB KEW-3>zNF>’%qZ~?޷-LrCWVe A/u3 ށ_mpV̟uqREr&9ԭP0 (3J,_EQEQExbAjxrp?YA=FzcJOEql@A/QUѡV<*v𬱶[p*G+^J^\O?]OD.F{*#LuKtOso ʨӞEgr|z9QE2i̒0 +4kJwC. OO[uU__WaL]ڈ1ǺZ T4~`^-YDY o_k:sHŕ_~\[iciڪD{u6P\R":$\IfT8JoƄ<? ̨bGrp*Y̡?jǻRc{y@C}':)VzT$G ǥڧ,!sV4aTzuQEQEAyrr7DRq{Ώ{sK1ؤ'? Jd 22TN }[N;;yi gyo>:GUGӵ/*r^5OY 5eO8k3GbA+>FUYXeX -QXp1Ҭ#NAU;2P\L?g^W=>夷v oxsx?uIkr(/N,>k[^/RLmtDU !^܋5$jLѬ{0Ȯ~V\Q=Gi^6 jVqi)ɕ?? RdIS{m|YMq'^xrV.o.KBbSI;N{7?=|Jh((IL$P{ûҥs=P:񤶿YPOՉI)"*A.6HQ=W$呀d8#RzTI{sh;,=}F cn{TQE},<{DmվںƊ6(^69ͱ&,q}Z;,!=* P>Ykeg>ɪgmW95f+XaW-ɩ)H.ySX>\ڙ9/nZ%3mc彍5NE0);Ӏ=k8VDbIڬ=Z20 AF[d,Ԍ2>b5U9d;-Ťk^ t6EY̹~f^D4c~W|O0ٷÕ:zG+"KA? X ?%48h/|n}^[$cljcSU#mȒ밊}b'o2P<~u\52azYw۫srF=/_Xx4 kl,Qp2MRjZL>D;>?]Q\yٝӞ}jx\}YesAEQEq k_#AjaˎR56n_>'W8( օ|´t;'描÷~zx_֡C46N3#WOEf?#Q7$5QEQEQEqc$\ֵ)C4Rtayc6= gRܺ(!⢵ԵYh~}JX7 Z>*?>++UO0L|@=u|QhJ訢O&m礹#}:EZ¥7 W={k~V /:`lGQO.>+M6Aui `r>,rp!*QE#cud7ʿU_?#x=lZxX'º= M ? Ѣ."!GҴ㟵\rǕzL gqu9?d1ڷۓ8٫(fp2MrjܷDS֮Rῶ|f[6'WEQERu(:[y0+n2lY݈*Rs?:Y{ ACqqu/8㊑m`jy0 h7jG-Y@MA*xiM^ C|ʐzDM7 >KȚ]g !U-ATaq*hB@o)w <̚E<ڮj^$aNXrh.i ܱ?{WE^g<ԏm1]QEQEQYTW@~>>;&5zEeik̗n7DvVUl9>#~DZuWQȰxKLBn>^4vVtYS##LPݼ'Js;&n .$5,vQ~K-`(r 8Ǿ{HyÓVLr?܍W*֥DEYITvK'{{'L'+PkM[Ž BGPZYf>3wrdOң_h6Tkk2 oFK:GwfNYsR}}]r+S'"1:v 0jtHE|=ߋM8kӨ9/XlH>()3¨565̪|};j޻/%wL~Vy=f I7+s/iT0JK[Wr"0eaGqN,:V Oh+y8'۳~[Q\E¿ri?)*/4ئ? huƯS$)~jQTmΪ6Rm9LxϱTdkl~8֦4SY)aPox|Y(wF+_NU9eƭ\Ėv@Ul,Wtkݭʃ ~6FT>s7-&/u<s/=ޗst(y `}/WD>d(7ֶk>'u[ۦVyQ?ʫ$#F{?Wm<Y̓XIBlpaB?O´h* {rDž_S\ܖ>ʳ)9y>WWX^*Dc}10U5{@H#6CwwQE\Oe擏ÿ~5,~HT?V 9vؤ򮒊({riFᇝǮӏYbmC}H8ԃГyjKU4`2>lVL6=~e${׋ՕOSdžyI ւ񃼒SRq?jA(ѥ8)K#SńZ&k&]d}O(U?GeHqUOҨ,pɱ9H JQfV|}ޢ-.<}ЊZ|}}KnoO~fXD\?iEQEQEM4@@2Lp=@k.JҬR>|}+R9SIOtAed fq-W dKW Z!?OQ[ƝRE2XvȁfͦIyr;G[#[#y:OzA]Q|z Ԣhk:}eAn>*-̮Q u?o#==])0ZR3R@5E%*Hsel8 '*y߉ڜv8rz~[e(,}MS`'.U1TŵT•$&!Z)ܠs~4FPqQ+=^Ur{q8Rj8bY"`íQtpɜVͭ\ǐ~n⤒)~XnCp:=V7~Z0jEG/^}GZN}395+DI5 GƷJvF@#{IEQEW%G#](9"֛^&dGD?ZѬZ/.s} o?kL屆Xh^'V5OMe}%ǂp3?]]Gwtew>mf?𮪊((%Ǔ#¨iy:t a<պ+B2Y+zk͒(>jH^V-K~Mdß xSN "H#'|?sioN>O-NN1uw{?uGSYq4snod!VV_&/.%o"3do!*ƐXFl?5>xHW Z;+)  1xX[O]ήiw >{]UW-⳾3֫QEQEdj5cNH/u-J҉f'K%_ozм E6H&#oQ:=*ZO#uH:G#zל3#ϔVEO.H7멡uv_*O$7g|Is l=6 T?fO´((dGT,ծ)=߈Yep?1IPkTepѡ#DOOѰA^EQ\Ʊ'uXT?jqyk`=:Vk-> ~6=z5j)KKG =g\k1 >*5%U}CBHZFO(orvދ 8–\Ekj>9mڼN(tgz?xִdrͦO0p##"2?[Ic|p}QE2YG8U5`l㈣r6ԯyGVe^_4[dÿҥ#X~79-KUO؂Rս_Q$y~*oCO5"خ>V ҷ+xef9P}9ܒiZ֕pq=7EQEQE5gWuՕ}ْ㝽YKlMڞ8ݎG֭Oo C8<|+ԑּ68q*OO*b#c]r S&ҿ{͎Z V*Â1ZoZ ?9jdQ5I!q)V8FRQYz$TwiDtV=_ \Qhd|5omm~ĚҬF2'#Zm>:O#=iROAYWR@nn>0 ȣa=i KdLA5 VN?YK" bb/Ɲ,K2aYGͰumrSqSR`GYFܡ(}SRK?K 9Z[2>VE?pxO˱'ڬ} zu Yйƞ\/ƞ/\CnJ5ej4JN>|3HzΩڜJ~sR!gG bxçNҲiZ+bH,sj5y*25jY {W%3Mՙf^{oҺxn!,ݓƷh(+"}f-}8UoBTrGSFXAр"d NRY{}GZ:Yϱ`o}:~3mիCc cE,}\ }M%ƣ;ы,w>ˎq_GEn)ŗ݈۶pA5xSLuQEQEW+i @}?RX$\أz1Z/_$O*Umg۷?tpSH~V^"\᾵<Ҭ@TRğj#SxkWObjR O6{V=ab'o:.RCS.-A㉑eeUO\f_I:~9(h] I5 Sk7 =R( qa~-X('%MqSv#?Zz)?CĖ)zZ+Ig5ofaoo$W?Zt2Mt5ɻl͟E zmNutUis#YjJ[FG6O=VCޥFsFk6biI꺂2zKDGT袊Ľ95R:qfM66Gךii8<廌2?`~5kd$n*IWH9 nFYsuܗry(&p}*ݕd7]gB9k-Z[ 'Y +LY>;'J-Ó2}G$IV".m[~Zv}~r, sU!Pb!WFk(NK.n~#VΫdm韭TӆcZY*#(u* ?hm)ٛ-8֧,MJnpN󮾛$m$dpru yW>@E.?y'ζ(((;Gυ?Vӿfj F2Tn_5I=cbzkkȮӌ ?ϵuLF3HO=#fj*×M#N 5wf:Ddu 0T=+¼=mZoN?6((Q)fU2j(}7_HoAwoA_8= b8$۹ӎ1\0I xNyqy >Ƴ;iÐkoº}f;̒~}*]5b#T_&6~ a0HzSԠg{k1,ԱZ3K7jK.ʶéU,l3FϠy~Y2͒ˀKַXYn'O%I$u "F  2sFB?zm E߆2n~_:~ֲ4r?*ův^ەad[y~jQEQEQE2YW8TR K65Y7OgQErZoۄB:AZtQE[ɧ]hJ}~izz̄:^/䷓kd};PNC1ٞET"4ˋ)W?=pktGLt)?OҺZ(*>uՙe9 >vR6Fu!j2@r;"҃J#nv*=Pʬ3׏Kxw OکVђE*B{}*WڢF9?¼5 Nw*qʞO&aXݢn;ji/Kkv\}O'ji SpSgc$4[AG=? բu-5 sՐp Ax:!Ȳ?~oάjY#4/?,W'uwA%٦8O?Σ$y } xđH}$YNko=}}ϵt֖"}O9mWB&z`d}O\ˉ[0ř?ALvyno;@$)բוj;~ʳ/f<5V{H_1)'*Ӹ!xI徼D>ʟ`!2~ZU 0)hj RysTpsSZQEdn'tP@#{H_⳯i8P{ȴ6<#9=Wm8':kEQ=[Kx!oZEhCn:+"=!?=EkQYW1tpp' twiynч~!tKp.ϧ\/`Bw?=#멢((=jF5l"?*^uQƱD  (4iW'?FKa`Hr;MSq\؉>xxnҫpU=7WDozFk[,yXҶ՝wk1P}O!_l՘a\&]L?׃Y/ek˄S{OV!*A3*)f kԅ=+-6;`~PRw.aѽ}g2X[B'T0 xy5Gcx=?4+GYw/59~U.nnk8U @ _CEFSRrRE>Ҵ!Զe/nZ3 s'CtBsm& Eoq RE! XDLgۥCRzVWĤ+;{D;>c{M,nszDR}kf;Tڃ![i`q 5ҵlF.8U`ps{Wh^=T'{z WAAx՚}wIp>=H.l4 ߸#EVt%F1}:WU w{*wy >\u+oz;Fmf@J[:ʽ(+\#^Ka7~UNvt yVf7U n-XV9:#Ov:gǮHa[+e\0[ko2>;lNҺ>,- ?yW5 bۨ"fA.&G sW?I9)&袸GP}k.HA׋ yOajk=6d)_hE'ޯk < xjj(kƅGZ]VՂr"N>]E p-QMF k!JU(BVԵ%g{§AR}M[s.0,)cEqlU lj'J&QX{*hqCϱ@WYdnFcP`敩Gډ ""zE 0HmFIh]R: }R3 巙M9vTQEQEZle8{? ڴ5,Ī'KEW#̷6iO֧Dƨ*Csga+-KҶQ4 G@)%!B0QT<۝Aue#ҳςmɑhg\FGr;*{Sk}ݱ9w8kKz ae*faw(<˻HGұD42XNd^S 5ŻZTmonUuo˽](+?|a3 M-G^EQ\m5;aVj(^cnf;ՏNinɞykz[7 yݿʊ((.chd>KB$үZ2~={WkH##U=pwPpO?nQY΍sdnud ALגrwYIdVه(FPUA"&y17_qW  5[Q`n`V%h^&WlY|]נV/_7d|\DKE\2귚tOPpҲ>iMڎv^vQ}=+׼1]G> \09 { 5EQEgQIsfsPFA<(IcY#`!NuwnĎG/<g3wRpT:5 6,2 fZ5 @_.S,[VWՀ֐+bŏvD=)SЌU_bnr'5v"FTw'X2#̍ 5MFsd`9Meizb4mserp3=^:>٣ \lr<Pxf,[dOt1[QEQEs'i Ӣ wcֺ ;ez">z(IdҭWI](W{R}>O2#3jx.RuxaOQSQEQT/B?35u$pzhV@C'?Yy4F_kYkvxV>TX~;Zclc+qp6K%X'岓k~K}jPGA' ѶɁ9ԵZO ALrؗ5k#4;s@)ycHѨWS]E I%kNd܇=*5N8qmԖSyoں(Y2 2NW. 0v:oloZ) `=SMh2r/?hYi m,QU̻;X ZKVR6&Epr!Oֻ kKAdBΣFbOTpO^(((K 'IKMZ JЍnO- rXKYDǨOYz[B>xakKD6 o+Jj{o1"+\bw7+Sݍ_%4>6K57 ^"7UfK +DMuo,O)H2p֧M~yU-8#SfgZo[@ ETw UB?J|ֽq&VAefEyA޳, Ln5vKR[tqklXQKl~ayڷtZKU,W햖~q8 ;>Zʻj()>hk<(uEOQaӠ%9cuc{9mkw=SkJX-23BO--(}jj((il<|O(}}߆u>1cpH8MxºZti쪹<{+.rEIj֢?`- 1@&2\@Fr4(* e}FCm.Aw(5GQe*]2O2w}5r!Ki׃r?aqmä~#5%`Kh2+#m'ժ}Ev ( 'c2{0ܡxsł6M9?ϥ69˅jS]5,;zT BZvztv3a>v`+"@=՛KB}cDZxnPjۜq/ ҵUB(UP0Uu1yddҳY,q ޣQB?>~c[UgI7i'!px5S Vrjq*>j) # bZ;h%7qQ_Y ܼH?ZexrdqojLH|VQ$KSO(N:X"| Y:35cVwzn_,36g?qOsVu˭O#+B 㜎llKB6+>fe }}Mi¢VLC0AE-QEQE@Y:?jޯ7/uFIXrȃscXs<537mk 'u=#UM#9ٝly3Ж%xC=9>/VxdDLqױܺ}1T2lPd+Uh1s]Ɨoin&{tgmӟڱf˟WbjpC?P*J( dڱզ='I Ԣ+7X4}Yץyxj&sQiߊ ":FFG?4 ִy?{) \;w 1Xa5' <8<j(oɇq]7-H<;ZfʶFT=[&+P~j]qWt41?VekvuZ|udOV((z5LsiXxn̺}$tߟCSc`-Bܿf]Y?'+JE+O=`1;פKiݠԟ5n(n˳ҹMxW֭isȟVq\a ?BVYpV?$j;{ifL>nEQEQEcjo Pu@=5d,<q+NX>l0#{jsnFr2*JF5(3CƼg˖CDw&zGCEQE_Gï[\D. Vn!-Y>"~yok~jI@PiN])"CV\݊?fHOsUba'}_5EQEQEU+c  }Eq3x:q,r/kZcWĻ lzLWgE \֯}U f?I^pu -Ōke/Gg\ڲ\DQ}[Q8Zyyt 'LBi3>T%m@N8z]W.n2EГPjPU~c֬QE2>n Y(BdYU[՗?C$rRrLN: *!txRQEQEfg}LՊηRq$!KmrkǨ}+VeE[O5oyovU`yOXz. J zV mȟī>-((_]S !|bI~tjחQgBGe9Uo\ou'Yǟ~Yh$YnEDZe_׏]EVp`pNp (6.Gs C)?ʴ'W֣/GPځbwn}tdQTQ ˰mkU2>Bv_?]QEQEQEF `%u$w=;O]ŝW<'*çp} {i%p}c\Ni}ʬo ܢv & |:g?TuЂ2)QEPFF qhmPǷJpݔd*f|5XqPj1yuz#9}ܐ71صֶaFι/mnHN?\_j 9yEQEQEW''ƳTM7n@^kmCڈZHqa>q]ur8t?y^uZY Nԟ¸x[O6Q]- s{IV+~tthRՋ&T*@QZ6p].a7? [IT5[K/7*qX/;N˵ ~qھ)yE(^]-_힃mM#ʃ̯(bm)xҢ(/sV(:q.~FytI$JXbW彽_*RcGSUᵟQ|,c[P[n#\zhiV6ȼ=RL:uQaK]U0yk U03-UO_IN~xuQEҹPu4f{{l ʛ[VkϮ2«W95jH`nxRZ!a ?V%樻ar~v ``QEQEeh ~±$f 3n'lt(|M 2ɉs(pyEr]~(㏔´>vTx GcX%̠})J&`sBv+F"qS5'S3P?}U#2z@4S V?ZEQETbŌʒm}OoOiu3BWuA=tȲe*z)˲'ZMR.wTd";| #S{|s0t V%u'8ӯz_ qF3O6!H?vy2~aOޭ_M'K[Q\gڲ_xY䍡WAߞJP`)7F5_Dq%jޮ6cKZض-\[N@qEv$jr2 :(+ ijՉc4GT )H ׎:ր.iFJ0>u%r}IKq ;! qZ֑ vjSL}*b +,sRK)J+~DW;iY[#fTpӯ~sX-2Fݏ^);e<5t,tS۱>X^i%AnQEE=v^BD?+Z?*Ns((U>f#uHV"Pw\7~; ;{ g?7[+*c~簩]Ii~P ZԢ(kH]F .|W`O%dS2 4Ik()H!y*5rkE{>¢:(Ugޫ4Eh!>ޭ%dJEU]B-:Kʣݏ`+#2'+8O`=kU[t jfqF[1XCedIlwFЅW4U!}ϽoTw+ilҷ$pS<95v+(((حϻ"hΰѹnVSc=eWRR0A+?nuwֶAikƼEd|-*)[I᎛![dt(>)Oerbj fKf(~bw?yIif+*ufao'H?]\'?ƺ*>m=VE4/x]ŭxCG򮾊()3U$Hbzr3A׮+;tڊ??sST7idv~s ek{kq6!kԴ]b opw`Sí_W}⏙d9G`W{7O7hUҳtɸՂ²'d}i?+ V]kB;V<!g%CIEQMwuA&];3_\\7^95EGUҬyN['v5灦կxںnY0+TK`U-9cʟ{m2]O #Ty!IΙn3Ӱ:(Rѭccе!iY,ckjNnr̋=S!{1?ϭvQPYbq^i/iEQEQETw-?E, fa돠Ы(y_Dz9GmÑ=Es`9G;%>޷m{N GL4w;pQ~)C"H!ȧ9WuT#3cIIcS袊(((P.|FsCV54jZ{ 2?gD%ZSȾ{ZS:.f̃J+ӄ.{nv7[QE>@ 쵌eyI1\ТLUYp6/q4Fc=WY~! q}q .VSS~'XenB?Zc<^w?1^4)*aO( V} %q1 K,cV?j=Ù/XT<5memh%_~59=+ּ?%o7.ӹN}W !.{q/m,Bߐ 72hғmc$2;3t IHJ`3޵9>7 ]okacsgטo_\ʊ#pQp08^=?Z5=-9?D_E컈yi4s&]}A8a _twخh]-;䎧ڴlVo|OOaW[~T8^ OV\;Z{rܱ裩OɾO &6Ƹ=KEVQEW+ FTw,.mAedbĶĵiRdyt,CJ|:~"M;RjF~?ʱ-lNtRYs?ʽ("b4 NvJύ?5M=ӏCO*ܢj:N\V?ge}av>UQݿϠY4M"ml9'R{"^1e٩Ћ{h^_TQEVu֢Ky6{-[Ӵ?ϼ1i~[)hi_!68p?rz=mu܇jv*F WщlH==k'O,9oOjHV{*p]5YK95Z`- /?uEe6ImrD|~5-ǐ/8KV` Z(:ajl%?Z&m#A>گi׸`NAk^;mrA*N¬jW5XNcg*EO~* <~R] Wɓ9K6o/( MP"zsnz/ZѴ@˸vBW۶ecއa p[z]Ouޣ*]&(rR7EoB5E'{pO:` Vk9o5TW0-ͻ|?xg)p+~(ky:l?k'JcBX*v 8/׵XW;*lb$WeȾFQmůgHqhEQEQEVn6Eh杲?*;fv#.G~µhkƌQFKqڮsg&8$pdjE[@G^xwM_~/)|1ۢo5ZŚKs_C]o5 (ڀ 2uI>R`3+((((aI]B+lgVk<|5xocԭl?~?W-&3CV "_Po xHE Ic}t?C] QEckMHZlk]H_!I(_SK(d FSVu-ʴθaHqTr˭ja#D<ŧq~UUBQEsKlxy9J{;Ë!VNToqۡ!yVUe]9+do<*j_ǯvұ?Lnu?RuӞrq?s> n|ӾtNKτߟ7wKg2V֯y6?2[3[tU;,;["v(FeE,IsW{ ֫:u[[# ^YY? k+i_ݎN};ƻ:*Rc aSYl\SP-QEI&UZOL㊫'ado/[&XG3hB$_1WANR=ݚO$z,x]4VݤxsdqjؓzTKQ

mnstvyi¬T8;]O:=UZ謻k["8#k[dr=z(IJ0ۯS>SF8E u5cFw`$¼̚෷$[GFizzƊ|>.$n<-SYdl w7|UCK&q+d>^ c! L?]ޓߙZΆnꞑ<2}P%H;VG௳tV- sU;IGOo?IEQEQEVo-y?Q*9g  j7#VHV Gںm+HҠ+}_}eHbiTdҴ^%sG?֬j/Y>G<;Ų_&>GZ:_7Butַ֗ʽ6qQEQEQES]Ddu 0A+oNZNO=k85;E*5XV%#Vq?4A-k^kЯcܟQEVu^On_ǔF=yn' NWS/dNwP[WK>5?4Ra [Eqw ߕ$~=V*3Ymmg)r6ϧ(]V`3NO u_^]1#*2@?gD_NVFOCx:EQEW.;*aQrOGV=9kmҷTzfrm?SIl`:oI&yjXxs`ַ{=.(Dž;e>h>SYzt0zqYisZfh8rFҙ dVD d6ؘ=m?5f(qs#\D$Ɖ9'ՀA"Ut>Tf^ B3-)ڽ*qǩ(($*@M0ܱUG%`֨h[vqҬ73[v).hE*`GRYk?r((* gZPNu=*Z(##ͦ[rcoTJ[͞C8WquhB]FXz֭msbXıY8RzɢYhߣ U} ^c\J袊宛~ X?δh#:sahٌ9_>Jo_jۚh/! V]ν~HR/\޺6T~TC̜`S#qpvĬ0;~c6okʮ` AE-QEQEQEW١*oim^.p ևZ!ȇ͏O_©iwmG=4Q ʡJExl|R6ǿtoֺJ(-ϛK/lUOcjg_[q<|sֳ[SU?@zַkm^Ɏ2>[נQ\F@8?kkF̰k?V3 |!\NƽGա US8kLxYR]jzGKXl#9¯+w*Ʒ3 (}렢(( g걷sZƞ+G3c9[exA=W]o`#͐}+) #*ק89c=X#e 5#k-k9D>ފ_-=Az{=Jj$TZS]E*OPFA-[B6,Y&-lu]*9P'7.*,a~T5B -oFֱY5kĿ{h o"z5 t?ʿַgH,rǢCo>&ckj xlkSԴQEQEjQEQMD6F 2X\ 6zxmGS,4ԵI9݇ҭ \BH2\ӵm7S"+9aelֱ/,F~SX{ [e!Pu-j{j+g7ߏֽ:UH5:kh#D{RQ\~ˠ Ӹ<~u[HHwǟТ͹K?h72֮S|yy·@(((/ψ_U]EQX٥œ>,3y1sdJ>AֈnJ.PAQEQEQE0FA`ᗔ?Pgy5Co}W8}jq(OAko=ʇv9=?Jkt'c_נ֍~%8c8TvhgV(N#||~+yh7t`;EG<$\Ɣs;AҴF-bk+vp;{}kҴ_6LA[\Gj4lpsC-J@y?WEkaK-:2叨?B IqޣntDW (eU%6#G[5U/^#S袊(۫u;tiwG =k#=Mqvp_٩)kYcsL(({BNnl*;GMK-Sās{Պ*iQՏI"UɎ3(=>al[>ާx.*ơwKbÙASxoM7۟AEQM4 HXd闙hUd=az/a;MlG?Lի/2?ٲ0C}Tt:CsEQEQEkKtxzU {o+0>V5hטN=khAW7E7P갩!r~S?U_ CNbyFTwHœV.,V)?*E_ ֹ,tUZ#fB y@L5m<ouVKXaʸ >&w3G@N#W}oZ`ۓEÜnE4ϛqʃG+((,(FXi4yq3ui!Of#oǡ4 J}4V $qz.osI6x hti[yD~.qϜ0pr?jǁ-z!?~g#?SP\G~$}FO`=եEVv[mד+1 )}X_L~T?Qҹۏzc,2G ᚆdyB8.vj$WIVlKa[PF#p)fDy0OX:uHs{º!`1ElƑIqJ M +s-ݓ{-v>~1wu?+B\R+_OV!*A^9kֺrjb$[kD`,y*uK!=ϥo\6(tU((+ljFaKgcO_?ڸO0Ez̽ 3#EQOI h|=B7Hidy~Pq҂Q4AЏCIo3Z4QES?SUyu4R 01yHs3ndz[dIBp Mqe=V^X/QG+}Iq!=?ZxU(I"ƹ={ Jwᄹ($b(Ž+ TJ+[[;yhGZZvl7'AQ]mc*QEQMgDMwKaL7~G4y/E_:iNiZ%ɉd=z֙D2*V%ψvsmc-n)PۘOoֺ}> 0" 0wZvuu]+aY׾e ?M $fC]V&,ʻ^-Y"mFH_ }b7f][$ 5[fsZyQUE5dFFV" c~Fj+3]Xwr9Ǟ7ƨ[M.Ԣ0C?YZ˨d'Fd-i%XM˗ǹM Bǰ]6qqǩ c8mϴjg?j]a\|y{ٌb5EQEUӇ'$/K4l9;»]S]WMIJ4/#z@^ԭ,"s,lx;H}NFÄyZ wֹ]{Tm4Z(6( b">?ʽ"iV;o<޹{; ޛeQk+X$j0TQ\joܻr{ ؤ[w?g=+UT`ږ((en# >r+"4ۣF1xmM<?[Z4ۼ%Y_P+XI" 4((+T{Yƣk*A/[,xC8 q)VWSZ3QgOYt?W'ب:WKESe@ҩXDSV*yI1Tl?V*9dރ#[\q~95&d9]S0stsfqHTa~q]mm5 :;"B0z֮ooGR1`Um>P_9A5ڊzX\FOC58L<:>˪]˼`d{WZU h((r#JǯLJ$'KI\Z})5s?i2 a(r\vz4qV֡x*ZŲ?zCõs^33K rB w'@]1p2Ms&xszOh(U)hGr?>EdkI^b>M7\|~-un~AӝƧN"^8]?o}mrU2Lvpjswzf) '-]F̎ oO`+ӣ '*QEԁQ }XTgPnmZzGsQsN7V$e#m?SJOK?Zl,"'%#@{55!zzVWvpF#ANѶ?[/5H['B6Xzap'$V]7v+D FU8oSHK{aVz62ՏnB?Z?` n, 05qML\Hc9pj_X]f-F̘uU<{r+_Cw)u)~K2zj>x[G-fRS gQ}+b%~\:nJ~!vvziOz~9xQnrijɡqؠ3ك|[FY '$*=-_>!ktoWO,m bLFOJ&ou+I)mı'vo MzyV]R `4/d3TgyCN.GRMG$gI ou &"BOR=Eᗆ?f/٥Gdi 9~޵VrK|/O m|l?TߑqR0OU m9XnA=KFkF1m_:2z m[J0{RES]F{i.G=3 tY*t[4zk:W7 kn?E=Oy.csHM&⧄OPG# z5G\{.?­'_+#ߙ3`;Wwm N((|Ct`LHy9ӿ]WtaDa]ek::T;F>ΰ4"\7Ny࿰Z45H*(P0QE\4ڌE@'8k4*<QEQEQAEbjүG!8~_ӧ\ִy UّzO ZȖX.Jti*$?V_5EQER V|?$xl'ٻkpv4uOC^y7Gek}jpBHGfc_O[W{άV&!=riѮȑ}r~U/OՊ|߹ ZZ;:m~Q,[AbBKQ5cu{i/#e#Gmm<뻰> ?TA?Udѐnn[{q̤[t aڠ`MVdb68WIJYpXO?Yv36`g6:p9t)vMs[#9=߆9t}NS$lNAYOVsӂhƏk}sLψAGu1V_h+YxGf]ƔxaG3jEt ͯM1`J|9dZf hx[D%{y +[2?Tٶo.wcd(| H_5m݃! 9?ZVcM/hf?3KX?瘪:Q"* j9 `H t$3(][Tح1>ÛgcVgge o=M& pdf$}:J.g$ev{61^]F|-1ЭC?6oᇡk9YaP XN ,7xsEPt}3ReyG5 Y 1E*g=cIѴ釙4Q4|QY()Ekkn:[? JR5*{&Aė} T^[c1B&>;>MP$c}\~UCZsk1uYsH*1P>'H W1$syfm?$]Mab=)MK6ժ(!g-卣>T_uE^y܍]'}ڈ)-6n'}as5t24Oլ@#D 'kڷA`G:k5Rj BU9'ސ!iBg=MAs5 5yl{gAn ۵^0+T`I/xqz'F5-QEE41*S?b(s@``R$޳K5mQ譐?^OVK0>Zu ޿ZF.-.r?]-mr[H@e*FA"鎙tϡ񮦸ؗUfYa`pھ.|KA8 vDʷlɮ殽=&@ ;wcZZĝSSECv]:$~U(t=Iֽ"XOGRJ41=psJl_nQEQU[m&?$OWk7Y7Vdc;/o#~Tz^]-?3ö%ؙ#?w]@́a ysjA$ ltwp!ꦭQEQEMk~* 1B;wc^Uvk`tGN=Ͽe hj{9ܨ_{NxQEVK+H;V-s{u8]s(((/.OG\⹝Csef{v|#ãmʵ4Ÿ́/ֺ[k{ȼi=QMEQEEqo *{ Ο<]&QǸY3ZJG#|t؏b1VǪw2ِ{׏ho&]i7knl uWKX5#TUk/OՊoa :5j>"n|*8=X[Fe;]3J.̺db>Ǹ ioeb2!}gnܮi&qI嬀٣jD%fWPסz=sl/FCޥ((56N„~?5G_mC`\׊j ۺl?ʸM6$P˜=Yg!s6؞@FnGpOP3G:4Kلڄo==tH* 0)Z/!8[4]X;iݸ.{?uK_ӵGӴ26 vv BNC|]L^*S$]![fֽ Cnycb=^&wQn 9I &L><.-${#9u|YrvF=<_TMnOo%zMG͛RA[RW1~5XʪHNմc8FȪr66s}c*¶:Sd\O^bi)ӑޫpUuq )j -5o',z)wJґ*c:ϒI/g֌ChC sQNޟrzޮeQR> xz--"I9۾1[o }h(_[٦ I+ _&Rzncv[xziοy*XMni"TOzh"7AպS"@c>MLd3xyݸa\Zt9s"V?rOSMxs)<~+o6&CUW:kxFxƺT@8iǨS/jټΌ u5["L{)6O83֪{>P$Z!78)t慌dr "]8JXo~&"FȊ!5'+{O"+[J2OҸAU08 >iR|1qȮEH@{w?f$\o~=آ*4ɏ\6<B[UQ!$.n"ƶ袊(Z|gdk 3R\ľE͹ړd;x[M%@TS]oi̇?A}N|G;|u1Xז3is-\}El麜Z\|jEQECwp#Rq{ o=u9bv=kk]n!:3Bt?RR1ܱ?A5~((iDZGsW> Ϥޱ#LL:֑ U2W]~pkUjQ?! _ק[]FEQERԬd6>Jy 姑0q=qv}kJe?k~$Ocvˍn#}]EqݑA{V9>vܟWh6gONe:L6xNgP>SK/|g,]qGo4TG \ͦkjW\9n"[zr@on/UrKGhe63=q[db>kR2Iz>T6OZ[d"}jn%^3m!aEQEQHHU,xd)bLIR>v)󫵟 ߭B=6ֺJ֮<=W1c1{UiI:OU#m-s1=Ci* džʖoEQA8=*r?Ե_$-eXsMt\] yT=ϽlQEȢK q7C #\sr. ǽw6om$SEQEQEz-*\Wzlq?KK(s՚(gs+{}O*&P{V}}!fTªZ)Hv,04O@=rB?&̲YdQn,[,oO>,bG@+gqtOTI/=^-+62 uV@߅NƬMxսDUI:orHoeQ}jHdF??`jhާ3 sǹڤɪYe\(kN 0ěwzQۄ֘t@֭Xq洄p5nf{VQEWMzVƻuy'a .{,k٦6SPrkv HA{QEU9h$DYZ+saè袳[o2/4Gi0_̢Q?ViOKCkFd ǧY="7: 6r:Lh5sЭ^ԣWt1# XXngw՝ C4vo+N(|OGQBH!&2#ys^e [jo NV8;pYܜ`zU焼=jmѬm!Tet?V൅۬?  q{]QEQES%)1Hk<eZ/txIxw?ή7+Vx~jvZn^2@<*VF`nA%XdY*F__Z4{L2&蛰aʟגz$ӧLytV}}kZi>5z.രf“ݹ+[\ ku+miryɀr:}*$=OF+gGU(|!#gjV6dx!5wM<ǿd]9:A;~qZz"HO ] 6DFb{;AxҽuI ԴQEQESSӦnv|Virl|Ni{`֍Q tUj2PFH\ƭ}>S}k'="WkW3Ԭ-[dlR֛x\[)`A䚾k-ܣ Vծmɾjf)Oa.XrcVw+7c \-͑/ nN?Nyoժ(當 \1AE[.n)gSQ›G9.vGGU\UGAKES%fq ʳScDZ(7U(HZ0146XW\SVZԭghF F 8$\7SOG1V) sP#y;} tj,O&=Wp(cSd@,K{۷0jZ*1d1e,KTÎ֝gw,e?ʴ(WiyB/R ¸n$l!e|eS|;,ry*I޷=F-QEQA5HﱜI/j؆e0x=GIE#(u* ?xԟ:"r:v>G}:20k1]K uƛ'1iQ֩?58Cҷj"cu1=7ZUPHQA?Z^dU,w>Ih]m&l|9 iVQ<Ġ= Gʷ. մV maN>5QEs'sƒ}]|c SSN<`e~&b?Bk(Z7X'S]hcB- z5,zY\G5:V`0?E5I#  r'~#ZȟnAVqE>X.YE$\@^C%j%_Obyk4==1Da: [tQESdbsQk+FmoVk ϳDy~" ɫQEm5ojq<U,C??k&.,qJDRsEzl$Q:(3=I[ kk":ld-z׵QEQEQEQT Iqwl7Ms\灞7VpGчUUG 4#38?ZefkYi~8t+) ӫ״ƶo[ݱ;+z}V5M9@O8? #鍤ki[#tчUt¯f%S!]-WĐnl-+&HeS}Ӱ:$5 >lxzrl_gRL6'qo8(%!d5]>Vv8=>-{{A>Ʈ)5n̓+z"r$$ uO+}((OͲ8I֠#a GkL_i=[=0yĭ[w3 {i%jOKƌAb#$~UhZ-2/%@>m,ڽGE f嘄?!LA8'kM} ?4|A>SB;VAҫZkkZ1=X*J}jŮHjٿ?5oƚ|k.xG&=ZM&z0?-`{4gw>QF.aPM#xSa'%z|̀ӣlz#Cx^5'?֓ߗzU :L?6"2(a+3#;MULZl|3o%%AMt[mcT_@*J5Sg2z&XIun$/UogɴgLgˁZ2JީMtI'b~-L H>ch6__O^Jī/oxw^[HQckNOK,,3m}dÑ}jƆTrG!IF=N#oϡ<օb!UçOmLST7Zl76?²;(y>t~uñ=jTw $bF"`p≤;PqնDĎsYgX)ݏNjd$\QVQUQGJQgکDw)r*A#8G=KHoB;l?J#HW 慴cJHTNia*س01{]P^ l?Zr*x] m IEdYug̼8im[u'qD˞eS<;$ry*I޷=F-QEQER2R2 TWrcom#e9K2!*XWe\6p޿:g߈e=WmksݺMʰ}+&~ϩ':m[܁N4WZ`$㪜Y[dfR>rZszXSԚfn{{q 4Yb2G8;F P~PJ. 7cfss)l(#bOj4+ 2ֽQEm>PGk?#p֖g^)qf} QEPx*YOճP] hCעSXqdk2I'nSS^0[fM1ȹYAxnm].R=?o+֓운W##}y7lYGǽ7JKkxq Uc[v dpr% Dg}~|:УӴu{=?BJ((MZwM-jUMABxmBR/ @*cRZ[s$W ڶ=jj(B햹WSz4q5HN٪]\~=+B` ٢UoSY@Ljhi7VnY+F2N8Bdv.{԰ßFZNf,YA?Jх4 n?Z20j)(9LP2S g";-.9N MZU7rL-0b!%J5hW42Ұ]e݅e[Ab2zml2đs5T15U{X̷ J^Y]`cgvf%e{WJC)GzZ(1)?:Б&@JFb OVn%d_N*+m#FmlrZkcx"CWBU` u"{3[*3,1y>kά5=5Cg Gc}+jaPa/em?QVhWH[2Å}ꖝ56/}Cqus܈-Ԭ#=ZSvt>Z[t?@*Z(*xV/W<"w4drv?󮦹oI=w5,+O((((((*ݍ~]ռrm˒>sO>(Qu.wtmQ\f?TK!d7:Զ2GceJ5m|. x~b/ B8ԂFMkmCֹ;D9ϰI>(Lp@K9<$MnCV(۽2:^WS7>mO̝>Yz9s# ki6^d=jbB|$2:A V[ ׵W\Ѹu /!6V[ OҠ{G~DP:N(i,.*=u[l1W=+He#\TTFIYOfKDO)8cTmGHo&e7A /tZڣ$Įquv35R3{ [CeqKqtŸ*ܿ.qڴ` 3d~QEQECun.`h^} Pn Rs & - OƬ$xۺ%ޔ:AL7,xH3Tn1ޘnX[DI5 5T=*1?+n_ʺsT*^2UH:r[wH\FgyS Fǩ^2OVKe%ts]NG27c2jm<^HI<$MlV(ڤn|8j{;4yn~qОv(((2qÎ~/p3ڴz+.Y ~?֠N.!C?M#P7i GQ5JLiPGЃ[ZxƟof;xDsZ֭?lQ:ji-+$Ϡ5]K>eY8!20Waah,!X՚ƹ2jYj'>AZ!W3=7Jo퍅bWZn%d=V #-Q\u;aioϳ?SmQl~Ubn@?i4i|1CZQETVlz|}VȃSUb}¬ҪHg#[tVy]si;z?FXD`2uG*~wo+55*(S'QEQEQEQEQEQEQEW%KTc|6N={IU:4-:`[k+ėå&Ȏ W!t$ztUWP?o:g:M-|˩%]u¬ip:tC4 eU^s< nKUIe2?5Ġ}6ኂb|=Gq]>0pUK1$ל[x\ihbsOEn?I4P:p$$מ?J±$+.yH9\$z}kg%O5%QEZ_&g!?s$~>;T/Bʡ_km*tHzĀ6$>õe\^- ?(5sÚiՃ誒7p{1ԚA(c}K+Ԫ }g7~Gjj(Hc'׽g^.Ӡ=k 3+zU TlrOJ~j#Xwz%̐1p+Yc@Q uT[+2Bp"WW q֝2Iu+1ZTNOZ q& mf6qj:)q>Z0>6H3x5=ZOQVlc~r(((uoy*Յn~qޯR0 H#V.g|P8 Ͻ/V!1=]RH58nHoz¸/>\AFs _ ߔc"xQ;n#;-lF*S?T'ż!v;tvD:vv{Z> _$}o+R#:=kS@lWxHKԣ nyi,# Vu),&%v/q]*e FAh\N碩5+n@:ֲXY[he[ GY#S뭚(_Cn;k˶NUOW-򊹥Yv 6A~hϽ\nf$%3~UQ\cRAykB^c)X?WZߙ!)gAk O$RGVڭOήxZGmwy3bV=;WAp$8Z]";fnd=N ~Kx4$*x(}>V妪WbYH Ȭf:Gض9cY7Z6؞+ubER)5++kyc@0QH˹ -GqnOk=Yw=\WW{ I $LW57TJ]}X qo" cdn1^qFkZN@Tm?A׫z{9I>>EQEc.PlEAegcnOXO ZF *n9?Aw3j '*֛-^Y ma%"iM_GNkU T-Q)=[1RȬY۲17_WſmgmHCc)?uGV5 Zכ1)dt޺(j(XgͰWO/ GN.t+gxÞ}[J[ A&G'TZr?Ps8lIP3+oYeV`RzZ_jק0?dצ2@?R=ٛԉ~S֍'̒<pGji&a{pO1>GpGs&$i"QEQEQ\V&s/);cGU71(AZtVnr*qTIjU@֍ L1)X°&ώ͘-jٲH ,AxEQEԫTk!^A[ 0 re.rO4䴼|MO",W6p6(꾿J\ojw4sƲR+miU9,c =kfݣk 'ˌ|UR IEPN:fh4܏V? gf r}qP0p?[Җ~ jA cks u>{Eu`<*P[nJΟ}Oj(iQ#{ x{VGҒ$*o.x~${6K(DlUHԳomHWj(dU&okִt3n;T3ZE)4 Y} ICz#NW)w{iÂ=yz Z xpPb#0͋wVwbu [((AՔ~4hYhz/HnaS~ S(9?ZѶ1\ F?/?ƨ3Xr$vo}͛E*sdZ寤yn"bBp3O7d?g\^M>\DqVn iW0dE.t55YZl* e_߰?zzqp-{ jڜ`7$]T 3F~SC}FFPWYEW[Ycp} |;Katq 3#[wvw>5),g6y {jA yR]Eiӟ!qj WkaUJT9eDlȮ¾z֊(Jjieՙtd}E$F k_.0xrb:mW-=?Lև5|D&`-w(_n^jV.5h '=}|'roR'q6ûSF %*Ə'PQIpNݵIkck{ ?vLupʳBXdS袊+כ6pLSo᱅C&ٮ5 pvǐ3ZGu#DwjO^܈yo±NeHF~b+hm7OzEAxd??L[=?{tk> u V%f@kN=`-r:23>Vx`(Q\XƷ41jPIF?dDM|yO𮵨Wqм~.wSf69.CQֺ{? P,y4{?CZSIO bǡq}O˻/˸RD XFd_ʟahV G,ާ4QES>]fQ}V~5QEQEQEPNMe^^Ax'Ion!\\5i6FDw;=;yvy,r~\icbK7 u$EvQޱ/6qvQ޳൛Pw݌X[[G5ǩiy͚M` mx60s]([ނ0~qߝW2sSGe@ǣta}zm֩qna{z'q3 9*?V&Ӭb=?rm$Om#\@֥(`;iS "}*;o"~r}GlN]}yj 3pNjY_PkN O(sON\R@Ğ]UzԫkDCTfi_'hZXɐεU*T5Y?Č~x{O´5/CQ?%{g꬟SQE cUx`k%'ooӎՑXί'\aLcUx-Zپmǡ֬ΣѪZ(g~:lyvT{uST2+=j>zH$2=>*_ŏU'@׷j ߕhj>%XÃ*L ? YZ }>ҿJV(AY~ / [yb?K9/u1Ki (izzpӼ8i0f;*O 2x45|ձPӗ&HN&yݿձlG X8MZ_(?jĊQ9F8P>-W3-jqsq嗩Q5&ٸ^Ư%x<8:L䱛y {j yVv'8giOz3VnF_QZ5JC}i,(4MYl~U(S7OlՋHw3r@Hgr?(KwAޫxOR}?PKll nһ =}MZ=M$g(O?zʎ51,_+[N[k)bNJ ~HκKT"Z(5걿xj)Ffy `d^?ºIYcm >u_¥"K{v?2oJ(pIQA8=+ĚԏA;X ~ʹk$Lrz&3N@\׍.嶱֪_>1n$1Yn֒&3WWҊvtܧX7[;o6Gpz5&IpckѭMJrY}r(Yq0Mhjd?lrrJ jz(((pSY7pD:sժb@< Ϳ:z_,#\H~^=*ކ+u{uҒD!aVun&BZC9 ,׹a5Bv^UE nVtӛ15H0νyr?>7F:0ETrNu9>@ 5n >8_>*+xhSzҵ; >L{Y#Q?j%{U a!l֪IiQpC,"X0Z%=HGu$rI+A'ִqm>Trn,pTN%{ Q+rwvR#ޜlo ome屳oF鑏ϡgN|Uuq Z*g -#d޶-l @ zzU(gY{ 俷C6N;7_kJk#:1z䏺)ue<~uCP=$;2Kғʏ'~U !̕X§?ړA(m<]QEy4]5;5v;h\Gunr2)vw>59,f%B>ڬQ(%O$T 5TjCm].4g1qlw[S&q/!Mao&bՌg[Uk6[0_wKʳS*QEck_D|w__¶jˤ { Ri:#C-Tn}[ڙpbװC?ZҢe2K1HҬF}X\*9d 5^X^j];58]F[;d_<ލVvC>T֯[Jj~Q?EY7ķru\յEQEQEQEQEQEQEV ijkweinH+ӴE!՛ƭs!S+Ǿ7Zc_wWS]XeX`Q^I A!;k&Ys|̷q?~^OE^Ej?ZٲcW;FuiEpQE֊A^,5!߂}PToz~?ttUb<#:wQ<"ȇ*"ECsu {pa+Եk[q%>"~g-qMfMγK$\G\fJ~^ 9?U9b*{1=?i&kiM"u>ӿФXysѱ^8o؜tZ< {1u^X2UHqs HI Ϲ Q尚)!(qODj)_=6Oo ֟S$}[WTuZx" kظb٫SՏ58+ GVqQh00QEU~5Hk_RM ߕhRb֕QEQEW]]ԞL#<VtAQoqzr,^oSPN}G#m>uUD*Z9s,q5cDK>N{5E6jm+=S5|59BZӟ}5jd$C\HVl7*-\4{Öv }8$9 Ku'ZQU-B$/g~ϹGQWtIk nGƮ6#ݶh LjW;UhFG"v1x= `hHҐjhIy=iQEU4'UKScvj:ձ wHu FTF `T#-R =BoG/D̲sVҭSf*"@}qKEQQ O7ri&s+];2nD:nT~?ư[tU^.aW={{,3auC{q]@ AR8\xηFa%l ZtVFulg*Γ1$EQ85BQEj9XYz_ؚo}bnB8WAEax+˟Z|2 I(4ſ׋aE\צED6GPH"WIЮ?l c>W<3v,|%GSW ERI=5y{<gܢ(((((($:$#/+tP0 >vEgk-%a9k~NjB^~i!׮U131n9|R&98<v5b^tD ,OzUTKPH6;?[]"9xS>I=G2 &7'o."MѶ}GqREgk toP%yTK,'7_̑ώZF/~sǯh N<*N:j:`7хZxN2@?ulHyz{ [{FO:PR-t*5 ۟1vqg|KG AXC=|BF{bh0A\z%֣$06dgsѓcWi)<m@+:i0r÷Kˆ޺KiY u VRB KTۮFsԯWC" #t=QxfC0q(((+8OzN[iB|;~vGlE`jIpVQT[a /&-ЁdQEG?{U&*G"}1D}C$c.Us4T{LZT=-QEcx9_i:gqX6PD7rIH|=ZD.ݚ"3?|]G>\;e,xis=0;f܎: Ĺ<%Q6VXI/~?SKhG [U[X'XXG<+3ZH"u܁H=:U*[Pt#jMF+Ev=(yÑ[V0*M{5v([b&c>֣B>f"sv5ESԇ0?J7Q?ZTnn>T<#Smxy9~ҟ,ˋx$U[QUj+j85[<{jؽ\Zw95WlcBۯڥIpGob(P:`U" r+k0?$0FEU9Q&,6!tp3*Ҳ,KUP cj4)z2KE1zf o+$֡{{>jeGS1Wm~@OpylFcwF?*HLlƂDwk\Qe:~_ڂ ? (([*ކJh_`g w4s)6xW+@+sTӖcB`6;Ʊn+jc??*掠[q1=>DVnmX g4Ko/]ܨIBQ:e)z[z 4+${G @$_IC=ܗ :r?ֶ+QYdN R}OKlvBM^Zn~/=EkCW?d{s?*ԠF*c7t3z}4vrm?k3[~š0?񮞊(uTӡǙN7B;,T꾣t|=XTcA'* n$l!\fz٢((((((mEE9~ty!ݢGW@7Mtڢ [x{3^a]MOrm:^X¸wG?Me Ks!'.wMٱ!j3k7{0_p IzFMCVE*{ۿl}*Ow֐ A=-VMRAʳtͶsk=+=Un!s*O K04K&0ENQ~<qTO!cc?wK|D6 XuHӖ"$%W %&`'Ywڻ1 A uÊب/%,8!N>uĒJֺ΀Õ՝̀NG:լlXw= $A3Od'hV~fTv9F+bcS1(ɋqҭ,m&uE%4$ ί%Hs?zXan(3SKkx$YGa~h[V_SN,sL6?洢 {1Y#[]IГvː߁RIj@^G0ߘCO8J|g&FUrE2HU qY%kSbIы~4c!B?ڜ7LfT6@$ PE? p=jj(5q?ҹ5D~ۺj'%d}Vob+3*eJL9 HS[ZF}(S#yqs rB<ByQ`4 Wy,~`n\$VA+ \J(^q4 tZ(E S0jIxqڮZܧ &h\$la>j6yH#o :OƮAL0oF{2 G#LicO?Y tOk8q U@ ɐ}S&$2½~<Ԡ0(FypZ6 qGEMPi`^/M t pGЊzȄ#[V7V AREQEPmFdzW n|UChk‚xKduV9n,8ʰj>pP}Wֵt4{W;X0~UzEZĖ.ò[6VXA:J|>jʰbO_VČ!MרoYjpGb3af%Cu )QE0y!dֺ~&HQv+bRxRXr85ϓ7KXKxa[ң?wk8 ;NVꮋΣpbm*02w/s\.m䀞cn>cwr!C^(c*-\{LʳSݹ E $:XWڔ}pHjif 1W)̚&r6q=zW[\GwmGtr.Es*b䇢T1U E_U 7Z8aKx#1B`S袊}vV3rG WLg+;sݻåuxRN8Sxs+{\ICu4U-]iG\(((((* (E5cz!\j`w nQEVP-JGm?g2!-k`0uM؈Um=a7?*0%/]KepV ߼] 1[y/صn{}kݹ%?җ]Ӌ@0cvWB$^{՚+NLmݎ~-[$Kۖ>oҬgaUb!>"/@{7^hqBg|b'Ihb7AZʣ:UcQ!?yGԃL:TrC>J ##ž.ue)tjq?ʜch4fo2V_mxH?qWAEQEy&+ooֳc$Ēz,iTm^݇u0:QXW {r 4%T( 7Eaƪ]xvl%onWִDdp2](pУz#Kn1@5f*+*-UM H.#Op>D(d`zN=X!4>K@X{ cz_QjwSA(`rqW9tlYz܏Y-uSkBkk>_f?$$*5Ȏ!OZviJҷ9ޮ[, zTBǂש4#a7k*S-lAɗj×Vu71YDȝu[Gq}Kecm B1?Ɵ ؈o)%O*sw=6ݩI0%^x=jT3E_?Z`^8zV;bsӴֳHG/y`3Y6Fޠ{}F&soՄۭמiZN2>մ?52¨TS[G8V{hK!ܟ>+sV5=QTO6?N tܽ{JBƩMKGz~U cSӎ`z/kF N˸JBW m^]2? ERK1I=I尲 b ?+fDM3)JlF OcqޯYMA̜̽meܠϖq~5\ Ygч?&|vzpߩ0oѾ\<IezvzQ[6Fη袊*ūZɀO(לiɦ_˥]1ٻ[?֙`|=q.coJýsQ]e A_Bηh9'J֮-׀Q?Ji =ۓIh>i E^om#>v&rv=Z:|?dWͯo5iq uTQEe #ݽWw I)k` }x}Ix{ 4UHbJ7]ehDž`CLGŏkF((((() dgj톟;FQ[$±Bk}}\=zOlALj.'k Z>n_v.G=<>Ww ?YFn&ψ;o *E{\*ُ~WW==I?֯]fs?uSTmuCIu=?-'1kOipg4~HPIR\;N{ p jYL&OH5.2O*e-oaW&@wVGtoJt\H "AcT(em=vT+yWJAV*5T}jMAsl i?ebk#1{U@V`f}${KI1 ֶ?hqTW3 2.ssz'jF{OsMY@0wE''W1 {@qJє,6`cvj\'x€?E_]3RpSYW߻NZGvL~u>( rV GCX>$ָH?zvhJFO# mB<@YcYXdj <č@{tilbBg5EVf:^aD'8 Z*q c5OBW`O(4((h"7Aͅu?W .Kfrמ8J"HS@ջ1-$yE l&oAʶA Fj]>CZTRdj;a]Gpw1^1ĒQ9޶yr(ߡIQEoyX(u=Ơ8ȇ^{{3mn=hZq|k%%vyۮ; -K/nOVz2Whi֗Rΰo<74α<0U%{\֥iq_oGy#;)Zt,~CMt[nP}OsK4θq=TWӟrw=Z]Yi6glӃ׬I pUH~[1H;i7}z~5}Y]C)f=jAbT9 ϵhwVi+'{SmDq#STmbXn9?YF jzu#62zJ<\\yU?}kbLVHbN:-ڬm/$<~'nEp$TQ(Ҩo'Yfؒ%81ʸ4سcL~F8Pa5>-kj) UfdVnR(K".>i~KML:5[;G[gGNXsO]""ƁB0-!8'pSxQpJ&?,U4sgyĤT6SGo{3(?\i~55w#uSO#) {Ē)ٸ'c׫J t9ʟQMss؎giژumɞQ޵V+wONj&wOCUۋt`:ƖQr?!55h<@m袕'eCak%5ӯ8ԳZO#kgaXcՊ*#ڮuާ mj$$i½5v@~OmYZ-!x~5 B7=Mb۩?(935w(Q)QECPg;G= sR<LOGլ$gO9޵e@"$>u5Jk"[oo§J*G#Z2AE-NLևwhLeO~;Hu -y q.,=<֕Er$`#ڸ&PK~__blxFwz0 M~c?on/w55d,mrd'ieCޒlun=hגzMWQ$1YѯU? %cuاȢD:*f21ۼpބr+v[10r_Qݬe#a"{ԺJ*si*Lq?L҈.1)b:ԫi'j7[%wO"fЯ*U>S1?Nu2RlKU( 2*]!|_&Ȗ/SYeDԯ(nJ`=QN Bp}*XdN;("XN ArCڵ!gMJ(Nm2S6N?J:{n)?QW/Lan`*>kz}~4'FO+Zmʱ -6$ұݚL@gҶ~fя,ShY闓5xb\LJ~]W5}B=?o~QY> [8@#ӿges X"?ǷmgO"ys{EVvt{pCҼɠGpi~~c=kGY]* Tueb}k:82xe7,C?8] A==bm!99jد#"ui>t&PƵ4iSWj-\{Lɳ^9n®TW1ZeOjS[Z#pS(ln20GsEgvv=6~5*l5ۋ6ܯZ(dd_UԟP_ݩ_]vQEV>A#AK^yꗺ,J!g{kʝ:أ_)páEQEQETrO#2ʈ?`*ޟs8c蠟ץPv&嚦%=xU ~O\1R`nem݌FSRl?4V-?Xh]*MdC ۡa}뱂Xb\"*J({2Lw=>#jOa!HW ;y5Z6m <ʀn#kQEdZ܀|'Zy:3ܑ\HH?[ټG=yY]Ǹk8xe=f>uU;G7r6MU#IPe=[ |Nc=}X'LuST '?zd|Gczv5FZN7g*=Mz|霕?ÞU T@*Ihqjek,FlxWXBM y|u~XW%o۟OTQ G@1Yp:mPa_&i3x[nh*xc^=hGāP`:}V̀G6Gڴhțdt*`z?­[o.،!t~e9)&0?OEr;;1skГɅQ9z(( vYGF5i{%g`㞫֫0Ԃ 8""9ÎDGm"z(([AioN;𥵶[hXkRθbI a#P; }Vnř#ƥ(t^x4c'Ӡs zA0ަEWѸ}l\]Y߱ʏ|?JԤfTR@QԚȺg,r~CcS~5z[e8AW%[XQkKSΐ|=J@; ͨ]hH{ q-`*X!ǎycRETS$ Q>0 gV~ALy-$n8%֝g~rG8?+ y'#pGЊu}cIaM"ta?X]a]{Iֲe yw緎u{0*s\={kȮ8nzՊ(zucwg^~5k$wjmܸ8#ޫ52;,>p;z{zi"P̞[~y_GRAL}H?jonf_+:/'շgxFϩD:*&:ȿD }4\!ptLs(*zbmt[-UVtT6𭞤O5EukxXl:-caU9}*.PZ#VRч)E85e_®ETs[:XվEfϢoΡbq2OVj>co~um9dSЊ-cרlidFAz # \jE*uG>(u%gk+Hҍ]XC)t>kyJ"iJ ϨɑD6T+M0ÑkMj=“ =GҽY]C)H#p3ӌ0:֭dNo-zKVV^tTRFAL$Cg9>QEQ\GK(oq1W=.Խr1 "&!KEQE V,f)> z__x(K{UmT bGMDw_&AM]F9\~:h֋}]­Gio1P55QE+gX[[nas+bsMjQEPbڏ2soAw̢ێm^ ҴU?ױrSmPAR2wlWN_cdRюUh*C Ƚ{g=?k`U5l8?enR!B6Oho2%G?Ɯu)@={SV n̸b:"XTrqRX܋Va]C٧'g`[S}*P׭j˼>e/V+'_EhlXP4FB] "Q)QT`?SmZzEeJ=@B:;d?z ElpAY Wvo?U8٫ncc?^w\֤F;g?ZT1v4yz(*ݜwqn}iga|vR,P:0e(9JhfG(([Q̍QVJs+u,P@'Z0(+ʹ"qwOUl77\N?ZٍđB3N}8{ڢ-q>ͯE7@X:S\jnOEMduIB?Ht]i`7qp{BiRǀ8wF23VmgoT%X[lJqA*QETXAU *K w8;O'=ZYEh ث5դwQqޕ:_.@L_WD =]ԫe=A<5csw=ӧkZC#9ŧʟ.܂8-m/$j9l6-nZՁ>]*Íu` ЊZ+׮yl) ɬӛXt07T~2Yɕ8"&rI@y859-{ ;GXzC5Mۗk0ēK>{m@nɭ;??on8)})k#sp^GΞT_̓V#Ҡ_YV<0{}Y"X#ڧѾ=QETq\]$OXgn7o[+#7M>M7نxa#9e_®EQEz)iBm~E/lky /?OXtm1GR򫁭/[5ZKiIhSEtv*fPUAl1ՊU(_^aleW9uֻϔ>ں)h^6~Ysnۃa E}+Mt#p Q͕ÀOoC^lr?ǧ\.vUu@~爵WIiv|?{mY|u=W? Xf& ea}choS zv?MOob:M_B#-_rqw[ft=JQ+n)c5' Њ}s^.PF=?/N5Q s]AA!Trjk.t&jG!ֲml'MվDP8S(ݮ.c;@?ϭzXl#@=\v h ~),z~ziH#ۧҪZح /2^Ҽ 2ɝw?]%QEQ\wNV.`Mao.#aOA·ysˏQkg}z}XC }7dUFotgKXm{dUYn@=/j&V]pOPO҄3mXHLsMZbW'IEQEQEd_Iw7mrrp{ 414`V;*QH̨P2I< Ź&rqtVΏር &<<}tu^9oN!뱭QEI!zn:hKF*W XKi緣U,{;g?8L>Qwr?QX6WlXN_C\uCֱtټsQV,i= l `Q_>اT\sG#p?:;X$)e鷻݇oQRnOa<ZK1Ta+"^kyc@0` uW[X n<(8V~=ϭVcT$խ3EyM?( >*9I) U4_&=;5jt܇;u^\@ЏsX7~*erOEW]SZ%m$}3 ZknM݋t$!n ٷssOQPjY&LG k{in$eH"XP }VF&.ɩV7Z1%X3Uf#9ki#5tnP8#D񅼈-CFÅqGWԌȭzj`Mͼ= %b~C]5MĈI/뷢nm>_7i0'UUk{ SGb:Ҹ۽>HylǧѲ-7>\Z|l4r(dpU+n޸6u>G[GÂ;=jp#ɊɡOgʯZEۖ46p>zTv7m'8_֪> Sb?{Nϰi)olTusR-i*N0_A5%j,UoopKEQERNA-cWY֘%|nXfF%dV/ z#0U,I=-JB(U(v(FeQ Rkf|Kn &v=x,k* dVr1kkwD3@$H$$m } mٛf0>e>#gb=.3'OIF0=bEQEQEQEfjẆ5aU?ƶ(y}{nOQվ)GlN{o]~[irHG'^YIȨy "c#؁`Er"+I-&KF'k4dJee}q\t}ї^`c>C=j6FD;Wg*U{u6лǀ$7oճS卞RsdAP0qV)C 0zκ&;3Ȩa)p9 zCQC#BZO\?zK3MBh­Y\fꀟ³EЃ˞[Z4O 'O#+!\(Vg[O?]%Gq'|qƜc#&t|%SrdEb~+5EҴכ#o0}} KVP%"=q5ECun0ۯcksm/?.{JEQEWPaWL9*AO"].t[wocjQܴyV#Eqр"ETwIi!G. x?S?wSZM",ǐ)g}ZĥWۯWmHw7jVL< U+5l ĚENRme?m+Prȥjܵkfkc}t'z}jGzU`QMy5,帖O*hN2DZ (!GPT.΀)pp㪞5R6Ҥ>6;I+, V#YMXPS'--㍿2Oȸ"M;}H&72Lcq?56ړyB+B-OWc,ǥt_-aMFS<~=O\ޣdCYLろZ:>:!$UfNr?ڹ^VV3$<λ cgۜ5RGBqY(([迳}b69 Uu?CV-g'r9*ԏrkvľDЬɴ{J0MVF25ȤRBNь{ٵKVQEQEQEje;67qV{זw޽NCbXʰՈsO*X'63ZOyo"Y&DCгcJ59؁yG;ȅO-"Xb>=S%E9X&~Y{Zm$I'֥Z>|Ȯ}좹ԯZk)i s7`D5kK*)`0p>ϷO·\KmVQGc:05:VEw.~wv7p?Z'%Cu >M46I20R2 r:f/%G%W$5`U< QYZ-c KRIR=?ҩK =<uq*uOGu+;I{[D` zMM=w}DAuZ:nXQEQE4E?<`zNYhpݢ&H5{S3+1ֻyմx3q@䯪ֻMM]2c[>hE2IcwHMic[Vl0"8 TsZYRT}+>x5u sz\\iI$zm_vw!B(z lGm!QV_cTaKYz𑎧ƤE/6QרԚ\d&#yEd>!#{J!&\1HC>?oou'FIw0kE6>|dAʩypTy1AW!ka EdjeZ8k*wSİRQECqse=P+Vp!=td6H0_JEQE\BzTV_wRkj?iZ4`D5d./D+:O)_?=tBya5:h댖?a͒vz[O[M7D<H5 ; #]k`Tu˩MpNrz]KJHdAx$.ߐ9zzWxNEy]D~uXZo+Ա !{܃ҨN2teV'W5x}[\[پhLdehf[Rukk-d'j(jt0z Z2p㡧X^#Z2]Y?VVvQz*QEQEQEG,N5a+6C0~uwd+X5#=_EEz2z+ώߡ%r>Z "i/mpweٽ~k}8ɭ!BY`t _A#z)t%ۣ ޝrWȋ`Aa3ׇt y8 Õ=멢((ø_AdB<^F:mRBX 5(tpGH+9'3xL9GdR^?~sTZzv+?o CMcD\^z\&f9 g6[FJfE!*n,O >ç뚹x-$?d'ymQEV.j FzzJVh~ԔQE^fOusK9_bjCwT# ְ-Vv%~kuHLO_qW NMso܋x#2Y-׭ 3K42@=E]"P#oNƮEc;SU/Y({}ζ.qc^%Ȳo?4+vnl9}kxcGzokqMO & !k?Z$dopWngGxQFdY7$>ETw޹ą嬝=@RZ.X}U;O2JP͟!3޺{h 551>N*NmNI*3HN閥K÷=O~FQʞ4_t%t _#ji6i,}XՅLm0G}!d̶kvvwq7^QX1$^SӐOtz/]Oz]^m*W!.zZ$R*~U'^-gqGq~UH|@3ɋw.WiWp8Uڿ2|ƍ|l?Z˻5LwʼnK.'v5ON ^iۀ%H hkNc~s F8'iE^>݆2ÑYrnܕkV<t}=Ptdy>?~5f[ێ=Y;Wa}^Z0p9un^Fjk=cJeS2L0Z<[ï,/%dzӯ?ze FAiH"IDRߐA\w'l5wQcÍÁEsT^xSZBH2bNWּ]#Se KAWhR?@mR9c2>³509vqkKgHgҺ`A{EQEQQ\LLIoqʊ!wIS.cX_/OoYԧ Mc\&]}>f>qdϢqH!UF ^סU,5}-d41|nsϡx8#Sf(+ӏ9z(um n ;iO]ѵľQ-@Oj٢((;hZY~CMY77+z U* ;RT8lɏݍz>RHfmxv6vPX"EQHKd׌8]_R gPqF@;uo]j, DGʻ(e3\֥yJa A=QԴ(DYiGg]^[g# ; spfm{{֬>QǭMEdj7#3{AZ͸Dg8;P1gCed:S'2:(9R+uM[C2; KÀ{T N8A@<Ҥ' Mh ڊQEUM?p%yxtǝzY`.V!5f~^]|UnQESdE6GR0E`vUoZ r QECt3k/>se(Ut#x#sKI{Y>c rQzV" 8WoGpqQ٭iA+cMDywZTQEpSZ;;4}BHEp^zIE =+X5k.e(qv*;Y'_L{߲ӡ\!P8cy'.z{jDX"(UW#8- gQYBڔw,>P";*n4}J&'9urHZaA*ze֮|mOp*}>̆O 98,t ԂU*>SƉu'ێP\?>ǣZ'Uf*FL0{ S( 1/U9!Wj{bDgëlax-3LdkeӒǜg'5Q#@+CjFAf韠fN+<܀ҴM3D0iPF~徧j`D5i,3+SR}Lj#kGg+. ]!؛1S`ۗ1>Q :g,CjEƧ`HqZŴWP@OrZq۶m-#c]ZWV>Lg[18YAۭ֦{mRHu&V$KkpJgvWIia n z{ o[$ƹYoMh_5:OmҊ({#Pcrjt,AU[qs'5%V/Ò7?u:f-bYv2F0Mh&h>^ĚGтhHVVO#7_5GM K_J讌XdЊZ(("vRkGﮛ^(mk}ǽ.ZtWEQEQMwXgv 2I!^mӑaBDQF) $:Xzm9K82c?Z?"./y)a9](@@)h(gg5Űt,0Yr>Nj!H((b}EMtH1|GS\ψn̂woYVD:/57\sqQEQU-VTE\˟W=p*E??6}#kOve+9xǸ7PyX[a]` 5EQ\]2HU#U\OdbVQ[7kz6K7wbMY*R<<;{ d?*]>* zw+͇ˋ 'aQXXcXy,Tk+RiP  `Kp͏Hn:Oo% qJ|觪+n6Dq\Μ)~rz '?_Uz0>߭+5EdY %΋@Z6 qGEMTlAg~ѷsƵ((( M~ֹ.d'ӎޝZ5jBs]QP]MH?1TzE;U T`+SQE^>ݔ VuSWҳo.Б5je.bs*DM%u7`{=+l?ϧqRFASc=?Ͻniw닛tla9[\XnFᄓ~TzGu(2G'4iWDm=stFC)5˧8a{ ĸ鵅d'zur?¹~Tm dtnEP85+q1'}֜7qKh.7B2sڲn.fԦ@GOmdĿ3 o^s]30U,xdm3=Է.=O٬DŽrT1:й&NHVҠռЎq֫[/ߠͭ;E'4wT6R~e'[;t?^jeUQP6/_<WOkƌp2MQ-SQӰIo&;O޳u _m!$O7?6#߾e3{j袊(߶:o\?s;zG+R(+Y[tFѸ RjAo񮖊(($p+VY[[qzos]mV6 cݏ6qy>a+&8gz54AZ4QEQEcO+Z/Z%ܝWkݟ.9,VgN:m qժyⶈ3A/\j[`GR=aEK)f=OS+Iu2O<qv+Ukzmd9SXfw?wip.!)=?XU0(6LOE OX 4h/ YxUmYpijgj5=GcU$ `K`wԳĶ^XOH5:Ȉ3y?V^U<xuڙ#oү*gOo.>t<7/ ?Xd0SFsnVzLWL:ơ~pdda\¬חnfc֌ǗazKJ%\ۏz((Z _ǒ;}@ 1:w`:X:OZ+`6ZZA&Vf_g] J;pHj#[tao3#'=mx)['s{eTuk> D3p\ִ>[M}"~p9 (0(Hq?]h6U8lmfFKsPƠ|tk a` }W2-GSYWf? +Ӡ jQEQEQEIftcX5V%ԊtHGnsa7juiF9W>fXntk5 D$X$,!S* N^px´h6FֵC܏xw,QhU; uQ\O /8 k-t@񾏨¦x0\V߃v9ʰc+2Ut2F;a֭ 2-A$IWtnr+񭱓O O;ZȈEJww NcA=q_0!X91cEs:&PK+R\·>K#ڿ@>jUm>mwkJȳl0jg0>=RVhï=*Jyd+t>Zkxyd_kЊZ((7in࿧`^]Yzꦥ?!3 PAO(K_cPquvkn3܊}+ÙcW袊({ؙͭGܟO%hÎ}<2Z"ɞǸTA& K{lH7}}z;m#=qSfFx*vtw9GV{_dgx Zl69U D0I?N/ׇgv] )OLѼYc!0S5GrZr/#XBx^Qܔ4/%K;8C5}>,;22b?nz#;E>x!h ywpi#H0 9jlg;yRx`9䐥 Fq^:'9OlTo,aG4iH3aГNxgxH+hcǵ-QEUn>c##jM^𕗑` >iNWCEe7 e'a]%ڤ+rՊ},%xEsL$l7B!G|@#?zuWPBr.GX(I?+E\XnҴh(h2&{t~èh'X:R AEVE̗\9^WI@F?`Y;/֝xvP^jNO  ð"bzRQEQEW5_+qW3=G;~Q\~ *u뼬KXԂCz}k"ZK;zqVnX-dIp«饛ͻmga00:QEbk6pA$m#akӮ?=_sǭbWMtV6жjsu ՛'}Y~G )42r9RA?>*+ < =gT9ϥsP7c>ݫ|~;}\;IWgEQEVY\!*r,SiR0ʑQhGEf2,6)֨2Ā?.+< Vf#N^ƨir}pAE2YwJ޲uennl5of:Vr:ȁЂ+.蝁RJaUKdەLݪEovAk5R-D5nڦ`>ǓS_]?ouB%sOz'Ay8̯߽oז_پ6Bڸ-i_k{ۦ?{`w>vASM?iqxEQ^[2:>'H%̻z$O'QWN-_M.72qW۽ O|~+wVdk羷Fm|!G5mǙ_rf(pj? w#jѤoެQTuk_X8,0M2]Иќ~BַuюE%z0ȧUm4nX(=+"UFPTUQoXZ"Si^.ҳทO0&?ȭdu!OB)QENEJǹH'3Ջ /L>s^By+?$ t<6!\o?[z*sA?V">wgG;mұtĭثQETpy",Z>Zj 7<[2k;/oZxK 2\O!H%p%~c'#+: t|HD9lu_jѴe%6b<{w׶iCrӊӜBIx#W] :KG F/][9:X\eJQO̾:m@D[9QE $x޻x8-WGT˱;IMnErصBWZKI-{^ˣݝ ޽($`?\JWnEQEV~CEa&_ +FD6wvQ]\r$ѬdaiQY)%>s}?lhB $a|Oj"CF ԓX]}NGx>}=t:?8YgMnEQEQEq*٣_?Ҩx&?/!v5T+ge=t6|zWxrڜoc-ij^!gX,x'V[μ>d@ԷڭiX,׺v)c{XlkݏSSQE#Ycdqa+F-p7s_H \V!,xuq"UnI a#nlpH¿eo X|\t؋2vTn(Mk)(71=:B#"hYSCv'֭9Ui$M@U :ծ?3uVdR_[s_?7FoW) U?_ vvyֱK ()ijDѸ )?ձZQPhyh[Ğ'MlƲ8 b}~ڇuXӏC˙}vz7!-? [4QXvSDw[)^OW9oY~ҵb g!~S5v+xRix:=I5E08EȆ>l)wqr o7 ݫ>F1n֖)!!j C4cGJ2A>`֫$sRֶ㶏dc{jPLNϸ>v׷c(C}+Q}aX+*pLV6y҈!ot#?U-v(8A=j!A$..d5$*Ѽ6oFJ(((*Ρ +qW T=`%>mo Ku8up[m EIEV'>ϥeq/n Nԑ$`:Ϩ?t:vq/O_qW #kz@1>ݢ,hQaN(jU鷋 (=}+Js_Ok( m-5n(+3mt'AR_@./'Uk4 ~d})ڍ6ty8}k"_5z.5-=\eOOZ5uR:1&*kVNW#ִ+\ա%]>`HXDc͙b?QZ&)l:~5jɳ2$yTRg<?޵཰s0X`=Տ 3ɩ\Z!S.IKE mӤ>S Ѯ{KlKV[ <gΎ m` )w5ժ EUvI+39֥A,) C$zBv?WYu*;4|_ǭjQEV[ZWjŅjJEV6G}Gj 3N񎁪ΰZj1GVBOOҷ(ij0yr0:n÷D^9<Eu FEITuﲠ<OzhRˑF75}b9!ST-4L%vx>>Oˁ1=[V((ͤy它~HV51}m1ZTB 2@?#ҡ?Ivn?Cok\ޑYm앹# L.H?ƴh(jBز >;>R/^%rsïU^G4L,z/dIuuT&>(Əq̥'b&d+t"\.%.v6Aϡ5eH"z} j5sX<#&٦n=ꌷW:L V>OsZztV1^#ă- u0At&|s׷X"֮QH@`A+ 6F k)uDۧOaRV(*(+(p(9hR_c#lMEQEQEQU/a;e"MSVܤ(c?k?]OUK 1Ϡ; :[7wEE QEW5/"\x[a#r~U*T* ;W1oy7zx)"_G+6H15WMhu=QEQE? 5Zh?zւtEr:c+W}t4;ƁVr2(f.SvϽt>Dyix+V;[F~y>; ҬEbF彽QT8>ѧʸp+I6c?E6e`Am5eѿO(sůhԱ_RB!}ҟE@նݱ{kmn mK, B,G$jLj~=hHncRr'<տ!մɬnؼ{v%uQE7*zQ\o.?[5S}4M)7r#o5{HN OSW Q,' UU*(U)h((+̾0˶J3JߐQkb48yp"EOGomSOZj W_cI^jlBA"Z"U͙E+B xdKSԴQEQEgjƇ?zeueBzGYc Ȼя]$S*Y EolRyӓjt[H fۊO/rj8d=0FA+@Tl m2{]uShEnO)gd(\ŵ3PcMn8?yOz,"F1d9+|Gu71gηgG\}kYg(O ޭZ+LrGcQX@8?<,[]B$'t/!\\((15KH#ey(fk/.dߞiI} 1H*\U=>KNy֭@Nk,2n{5VFqk++e E-r#o]@ ʱ KcsčկEUoӬR0OS^OXu9YXMˣ:ɫ6]?pJ@^zgig"(*=֧((*)a]ҸX/hx~8ϙtPEQ1LJ#]B_j1SWPBjZ(gi\?=? 4jR&>Z<kmOA_ePY#c>JӵI,$]?QR>D1]QEQE|ox=OO}#Q~?<{]M7֑\ۢC)=j((Ze|tf?8oW?}p|d}\jKi<57crgPiW |,kn(=+"U(*K )FGSV5ɥKeOcB\jҖ;(266EO (;wcO?ntKѬ8tnCkmJ1Te~*TS/gxп?wVr2+#:cƇimke(꾉hWM{8#~]%QEk~ŭI_ 1VekΈ~}q]iFO,.tQEr,;巈u#\+~.[[W#ZZ7w#ҵ((((@X"fV[Uf!xǹΟ wN7;K_slyfSϧʺkm1c"IȒNE_((ZYCB8inII9P\n!hۿCkٚ᭤DZꗱ@i^[I"uzR )w)4L5~5\Čw~0&^I~*س {bheNIByZ1IÃzM㸩<ۅAڦ" Džd/uOhEppx555:=GL`kw=N֯~*Wqq#׮((2QXWPv$@LmJAw˪J=KVf$G1?r3ZTȠ ?\ +U*PS4Qj:.~ ttQETsCF9T24)2mѣUN;>rzNqMT#;I,?]Kݐu_V$e8?ִ(99GQURK9{~5rMY&G tzM@`@W&nP+bK1OjOk$§w?U! ÷US!ݒ-@08'cpXӽz"ƁB:(())G ܿgd~,mǶr[C $SYV-kn?[HКG,wߩ>QEQErK붚MU#v韠fv; -!W V+;Z6v _?ZŎ.y?#{~}*' %,uwPV0cAGdEt` QEQEbðxlWa}5^EPIA 8W'RiHd%q֬hsŢލzmé[K-FEg*QEAq7Mew-:g]7InVx{z _j]6%9{+j_*'YmCon:{H~jF`Xɬ voa]XzQYZbԓ:Xؑ} }QES^De/u4c,A3X_NЪ8YK(dy2VD؂#s=>~-wnb}uo?fA7GVNw?uVdךF9>sg`7SH3?o\ψt<5ɒw Iee+*pZ,5o LdRy eOv?5iYKlC3X?ZkMw+R(n-㡨bԚqVɯ_o\u5p_QKHEn}Z Kx$*}jJ(+FnsG*ҰtVS"$ WJ>ޕ6[<-92cREr";UAEU kH4.|:va+Bf=&G'? ?O6Pmfq/G}½ú4`;K)27skQE$Hik+*SQ^MN5{GQ?Chw>[(oP}zˈ~"z{QZQEQEQEV.+}5Z8Ȓq ZDߌoS*}:{9UYmaw+J²eZB;!:sB.9JgT,[(\BAcèAb/sMݝɹ'yẋU,sF2ڬZ^,k`IV2vM%?_*>^yuQT/&R{JL3QXD֧((TբNK~*]\}*ӊ/&ɪmۘgURGMV?J.Ȓ'R\V-֬V"HN:=k&_I$n::=JϷ\yA'?#+eO>s4˒O+V誗ZOEP`2Z |߇zϴi6^Ns WhvKcs1N4}6KY0 u"yt4S>X?ZYUԫTAOYdŏ۩Q?q=ΓUaJ,Ÿ*jTԬPxuFn/5 E*I}wTQ\|"~ hEQEQE5cBUFI'W-s{w=A,4sq[Wx{6TӨ^F}O+eWB# ᵿOhw2?qnpS{VQEQETsMM,Ψԓ\Ie6zj7D׿SEQE v$e i W5XK]F9 ںtC$?MN|a^?O!6!N׭*(h]uvоu>DkPFVnoX| :|GjZωQ  d /Gc -gMJ(qʪ[#ߎw^QFJ֨YN6zEZj(x"xHeB8e#¾tմ^7x[{i|DS w$k"0d` 9((~kvrxZSq3Q"M-qz0?»`NT;SArf:V--Vhqѹ\6څHPQSǩSUa[jJ(85F'U>&SnMEwCҫڵԆ%IխEgLpG%G G0~$<MO[7OSbI۰'|; i'nOT3y1~p^ݤ ?κbX!XנIEV.j5fK" j&OT -Ǫ/ƶ5q>ioo?_Q?>EA-hd?P. Ƥ{ q5c;b()CV`)f 51ZW=%Z*C v#^QdWiXa Q\|KXJ((*6i?uS\P5@v^=+<=]G%}lQEx PC+)ЧP}W?*&kxʗc}((SY#;<0y}+]Cy+`x=#w VI{^}z[kR_>?x+ %#>+N_xWp?묢()ʐDHpeUaMZ>Fd{D֓M!9gfl)2v۠jE_^j{TnAMX˻М;EZ[;UiN1"3}UU' 2z-WiZEQLxIZKiQ֭,J'#5yֱK ( ?͗WVm5vq)OV^-} C,pr[0LuGhȻd"ICj((5˥,x",Dƣ>[m pBa?Tӧo&<OOmXEl%їJPDHzR .I 8 j+=܈bV__n[#A}MITuOAqtV_N8R]uG(FuŽo»_jz|59{oS'7OYeyֿjh ?5ro3IT?z'd?ֵQEFS"R/pڡ1P:/[z]SsnOJEʈY*IZbV1 r+cIc{3{ Ӣ() 'rI/ Zx|N~'5tW?k Bh2?:ǧ+@ @jZ(,QE*F*Ã\.k1up={}3UPB_cVQE|BÏH d>чy/u*5"hra+~ʊ((؋) _8w>ț&$L~xS3it3CDR2r?! O _};fH8?*ܢk OY?69bRβ.<9ip{b?!tg$Z-ā>}A\=q/Ozi7 oO,z/eAE0WRQEab9#֘-$]:x5G"s1W)f8QLq WBt{b\8B@'޹B0R>қ&v?X^\}=岌  MBfAjjWM-dtmS`gq,-V0[ɫ ʃ,G8jV1^jpc횕P+:pgy9lC*Hd'j1V%U=-n7=+, 3#q[4 -Dcoi4tENd?mN _YI CTav$MZ]2/fFUtdu 0A^]o c m%ꞟQFXdUnZEU?kb~& c \GE AڸϗtXq*bΌ H=sZ~>JAMYmc$id,1y=}>6dO9((k]OQ]ppO?*Q*9KQ jOkriO\^EqͫZ((/5PaIzT[OILCj:ֶ袊(S~Qk9v}x}G^ ,568;RWqz~^mQEʊYU$+Q xItZpjbr"r}MPG6I@=u%H|ٿz_y!k[K3t ~B Msx$EQE#bI5]ɩQeb^آHcu dڹٵ)jsZ|vQiO=V>lȷQ ZɆ@1ޭFW;y I,yU~J'|3o\[b!xw"z`UjLC~?*!y1ϯY9hYsAY]b#PC{ nPpX$A:(l$"OOza_O9*1k}X2R= JS{{t=/"R8$zx<ϠUEvS*j h6nɉy+S?R@Ҷ袊(]]ސQXw6瓆 ~~Ѣ,h :NM sJ^ZoQCsOCku eOnޘYG_T{g5@zڮ]"NKu#Ҵ,Ŭ<7_ojES+'^թ.M7bOcqʮYޑ=MqL9oUڴ欬>mv}QEQE1nmBx=_2Ig/nYv+Cm֊(ڍ; >S1[rҷ"E+=zLooN]'TX, Vh(ƥ {[Vu COkYcm/}*H'V?ʷ(OuǝW?h֝&HB(w#oq\\kRI8],s Fj$#NxC>KHwӮ<{D2GzZ*L}ugu Z\dyr8#]ŞRCɩ/D$ƥ5ƅ| 3u_t "R;n:$#5EW|죒j C}5co?okt(nna }ry;* RqG?ֺk 4?\q S ~sۦuwWH r QEcBGR ri0lqJ(0k ]A,u=GL+XL~d &Z!S/ݶK'QEW=ko1#GΠCUv>5m.ϖ[0VN5u"_^C dzm ;x`ިZD&p9Đ"fPUC7AZ;9?n$cTor^6 i' *ƣqskR#c<ԶjP0޴7qG?Λ|?hjaE#_*H FZI&1}}kcúŻo{@1먵Il/ڪҒSc?k:z&n om)׭4uC#qN(zvBVveG׮;gq&X}Q"c2$(4([`Ǜ*G ֝ĞMwU$}kL\zVQU-Z *z}Eq-dž kv9A/ڜCZQ^E}Ebqq31]R,dnSꮥ2~U Z?fV~{#?ҬXmۓSz}agʿubm:oރt=q=#񄻱ԡ`^U.Xe}MR7WFȧ>ohx~8ϙt߮D"QuQEV,GV>K^sۡ{([HlX`M?2}MMEQEQEQMq =X¯4;6*c=pׯM"+#.$ }5EQEQEbWK8nƹ[JZ+%>eu 2A4QEyŏnږI dQ~>x7[;fryt=k(|VX`có~G}:M6n7 hu?t# ·Þ()Czln?ʺko-?dW栰_}*V+y$ZPkw?AܚȷmR1" T-G,L1$jVuƅ 11Cy=A"UhHqV:V)U| V | XuU6Ip N|I$wu<}Uc@WM5s>#n;Xbc<Ԏv 8u: M淤|+7;St{+SWe^3n?QX4yͷ8jak݅~08QE#2Sj(,cq5X̌U}¦8'h M~ֳ rNK|?!Tof~b/OJRd~Gӷ ܣr1\:^F3 }kCI%I#c֮77ai"=ɪ~j0>]gkvfL(Of< }F6ْz~u4S%'CFU זI_MO?֬x]h"Y#y+H(*fkSmXҶumѭAQXH_*6#t,yVbf); =}}J'p;׿;K{ؼyUq}E6n#~StUd%@] A4QEW1+OjU ^Bő֧jo vw6%6uB?^$IiER@Ojɸԥ I'`VԄ>y; >uuK!ŽICG&֯"=?QkU T`ږ((+/Z} (ܠrڹ =jMg6:ջOf7=rc{V*2JK~y?O(-U5&]Jj\OSXzF"nj B f-S$%\:Ҫmd׭ mB9 BjQECP[ KXZ.!)=?O 4aס* AsjOu ֎cQEZ+ s,Z\gq ٽ$KC xbFN0}jƙ$MeG;WhB@;-݇$Rv4V]LJ/OAB=AY]C) dx"V7:- wPblDZGth_Ϗ]7!1r(5e,rc ?Ңj1[In~j|Atl>+8+WZ_p]O. AOj!($H}IEQERu(t7w9띵ٹb5vPDQIEQEQE&Zi61VWn~qZC!@b4s/<p~``t((+;V{r.$Gj}ᛳmrcU>տ BцA%Q_>x@0TŅ#Q~?azWOgw WP6P֧(Y/s´q8:n_&KxC 7_Qs-q;]:銮ٖc#Zt󇜟Gy||xv| Q\\GmCaܚNJ[,@^¶4)QE[Ǩ]m vQEݠ-xބYl#RIO[BnwnMf.+,j }ӟ\N}F? NͰI?jx^wV6yPF1OćU(kT@;a\S_ʞS q}(KtrǢ_6S< DTP0fިYթ0[&1tǧWG?KGZƺ\QK2"kE|ؖVOj٪J/u{R˴ uoZ>]tVq;m8q (o諭imDyh?F2C6wʥSwRҰڍͣz[5oD<7r>GkƼ|rye [%^GFEsruM{cdw%ͬqd_~OJ.?uc/4X㝹=j[o'Q ! Y"u-$SF=d?j:EV?%P?|TSyq?|`EOEx4# qksA:t|=zVT7pGVz(~7Bv;}}>]A.ܱjUi;ۡXG:Ƶ"9r0?Ҥ*>hObCꢝM56GR9N(۩ne-G9Sv&wOBN* Ҝ m5<[u?讞8(8*(ckf(X4dyE?RE\[(H?Zp^q?x5bλfҷ,,}MThuM9OC}u)5UmRY]eG4DcC) "Ѯ|hX=FMðnQEQEQEUk }F٠Mz}EpW/m<ŝ `|SjV/;oiYd#\>ׄVCn<=Ҫ~䃂CEQ\<CzrدB5M{p ?ǧ\O-#3uJH>[þ'{w'򝠟us: ɮ6;.%(A q_az)#$vMcڵɑ=m *NBB$?}֪2"Lz 3ȻݶJy!yry- kuwnaw{ng3I j{\Wi!kkÆ!aMCHn®#;EnA6~(0?:hAm[\ublF 'Չ4ב"vU NW'5itGrjq$CP=QEW[uAT^iUԮ~fUVjfo(lM0PZmYW=WU*%^ՙf;ZJqOcR9>UkN++(/rөInpp=Gν1@w_Ih3].ny?+$1h@8YrIXLfNrzvVQXZSݏQEQEQMD6Gf8=_+m8ПʹIn|\U>ù<}jXtɮܜyM_6F< m˲^nz2=zC]Eh#} X(ƒl ǁęvxgO^;Wmcn-la QEQo, p==&٥OǕv%m\4p泬toU%U-QMy1uQqUPC3qQ<,Ѕ'˴ s-ܛPF:p0 5`ǺӴ<ʚES]EU 6;wWmu$o^U=GDۭcXTUkQu^7k&fG6s] wې?[TT771Z@LQ+.5e-{M QESF{)'20zU$^Cy%ݞ˹=O#bhFv޽ZN-H?xÌZtV74({m s%ٗRdlTtJ)FQ25)A/-S>ѹz%dnc> {ElWF^j^jpw!XǠM\C͎\M[[%?u& }3~p}GKsIe};8a4QYƴzܑӲ{+F_j1ܨ_{J-QEQEQ\Ɏ :3LwɏU~Ə[ZM|~NM`iv>#30ʹ]?E(((x"Mpzwܛ-<0sNbߌ_z+>1xD x-ޤǥfxkZ֔9i}~}+f(gl?zym|V.q[sVdW+kK,GiOkYP͏(ms_ӣX̪y㷈!ֱf6Vֶ!cA^MgTf{& tʫ>3U뚧%“nG~jۧ܅>qUe,qQ*yq = `>\q⢱6iwXq]IM,;g9BًElL@v({dFc 鷞Ɍ[G+ovZC"s隬uI47hT-kI)x?B+v;0zEU,܏Y `3j us9j!m$t~VR4a uQET̟ʠi[Ο'<{kJu)[P.Bz?ҷm[x(*X"UZŶqWN@Eۑ#(gM]!_}]Gm{A Ziqvt VR$nD2}?W_֊(Z>ů Z4QY:b׬=R͒ ؁(|wv.Ȫ=֩/쑖3ՇVVA`$s~ZV̺e݇+G{W]qiv5yvϧүEQEQEQԵkm2"e`dD`W O.Tt5_f;ekZXCh2tSjh# kعbԎ1֮NԠԠO+QEr?g_\(X'Fou JDc(׷g fsV{ٍJ*s 1U-sF}nR3*zP=uyS_g ׁMiڔ%*?T}seV#ꅾ*v"E`̊} [4sɯ[;+Ute U/.UJ zbw'̀zWŹ=dUi$;`Ygִf@sS}O0SRP\Iu=i=j;%0|ެUTLUdI% i .@w볨_Z{Zߦ&n׆iZkWi"Jz{O!SxDGԫPAdޛ4~l/%"I0fZQET3[$𨣹` jԂ;{֦zcֽͤ? +/U> ?ggTV<1##tm K+E~Tf޺:cn? oWV,W-9Y$Vئaأ1 @|;gmMq&1C÷5>alEyǍ!_c")Vm6oړH[v|QW YEkR~ÐzGЉaw~ HN卽}[ں:(((B@:^E&38?[~f-?G5x_LvMmEQEQEQEUe#EqZ%CK,>ba/s0oqEG<1\$FE"taF5󮱧Otܣu </C]:KȌV ޝEV%|}<}}k/FFd;'?rZvi*:USܓ 5p6Wq鎪ϩYTF ֬ &Waϯұ}v z6]qYl!8dc5Mhiߠ#<[I!̎IhsYad0[XLɽOj[X擯*Ǖ%faHXHBsջWqb4 ]*{pWMahmο=s6?C]Ե(#$c֍1NdSNE2v H?X71O?>ιX$DA%%YS1߹^Gִ-JoYUjO4>\+MVgV7iKH>qT,QaT->z宧umham'!=QEs=kBvX0^cv0Ge@=xU-b3D{wRH)ѵjikr" sIO#ử8эY܅tlzµã*aNq#ҽ(j\7Ie %Ε/p{zӎDSЊu#*u `2 s[9 ~ P&NQ{u]F/2eqzj%#zO?ԴV?қss yn71XZBewLRCԌ=H{;K{H[Fwu-EcBLò{C詥uhq#Ҷ((($I85k^+Z+6 뇹|i%c&[i-!^@UTPQҖ($X`2 rq}śuOc+oJԢ :?=F@u|Fnhg2E!]eT77)k zJ1@~Jp _eo m/US{zCn?"T >5*hfVGe~#$,pAUCDOժ]ߏP ƫ7>*am:rsHmꅏ1 >k"yZ·@HF+=JށU >l$6:}*QΫFV0u'{Aޭ]ޣb%Sdo¥cI*98e53̑O'RYN;tZ0vbGu60YG%UodTsf 7dQްV>{|ֽk{cjѵ^H(( 0 Ajڴm݈#UbS˸0V/k@AȭK(V(20kO!6q}}mݓ\\xG)n+H ?2}MME=<ʊY䚥o7{"%E KUc_-.QWuv7r?µ#9Wtn}Aobyuq?Hnaq-6E~'G}6)[e Q&"^bKI˴hU/x=MV^%ߗ=}ķ*+j+i0\QTӦ˜A8?Z9-MFJ⢛ōwV{/hBm ?USOnEQEQEQX&6QnNz@<<[H}v]A I[C6pM]3~'עQEQEQEQEQEr!O'SՓk,d$sckn M|W!%zFyu[VXauΊ(s?^Xֵ OndV g){47d8 U',pJCrpkV>LlŽʾ-<- ;*䐟 <9TٌEmDRҬE\Xո|&ǤƒF*uVj? n_7aҙsڟ3vf Ωx}*ϖ[U}hV,gzҝmǛ]`Wi]`,c>;sޯ5uiy-G|7yh[ gc}35]9_[6#Z#»[AWg-bsJ)EqNazAڨZg禋yvQHRVִh[}+Xq ۵lΥX}ER֬N.˒908taWiWO{YIXQߌ|s(ʟF*Pi6);k.!y%Hany$`ԓ\.7Ud[ #<\'t$!╏`}21UѴe[+3= L2\"@]MEIyP x?_ֺ]?M[FCݢ9E^ǸG;OzE ͬWq\ǸW5seuMEO#W-LZKW0}Յ,!wa{4~/ X鋲q}X6a/9⻊(ZבT\7eݧ޶h(((e-ľ3I0B {PT` Z{qgLnlEQEQEQEQE CF\@_z9éNՑt<)k,^]YbihW7\֮hZƙXsXu*V_q'nd'i: WIklro^5VLOqzZ(ot;?*e:.͏nX~mœ3# AOҰ-he›ߢѰʞA]5Il}TV:vLCVXEKPs`$dF zج3,3֘n q~ Y*9oGk΋k< j΢A$xºz(s?rvjRy>?ߖ* ^TZubD7V)2]ZIK.}階R7kc^iw7qt ªVs ?QՈv~*Z d+2o& x$w6k{}*$Xгt4ēti.}rkF́2/k/im&F2Gr@Z|*𥽪52I1?E ʼޣNFv۶C=U9$ml/ xnYxszH,hJڡ.oYϵZR%{{Z%*ƓF&"6lïj{MWZ2+s }j{Q^+yghc[MD=NeWRA\IȰ8GPYPoѾzyfIvʿuQ[]japTi:)iav *Ymu+-}tqRt?S 0)h((Ɲ;?UdYݔҲ,qrsfc=Zu In=P$/**Cq&:dirz1(ZkBҟ543)*c^\Konv/ϞXjQEROB[Ҵ [<++6PB0'>FŔwVA68z/#?] {8;袊(kgdO$-])׭hIP:0e=>QK1@'r̍kj>sZ^ J -ݸS\/_OqW? Zu(RR`\ݝ֟/K{[ZvpHTҭfjKfc?㦓Wғ~m)u u" UWo. }fs6xof@qYWQIq';5in6YT`d{ s\լ"Z%CH~oŋ;[Y0R^}68ܤl_BןFwPG[(KJ`?V Hen7_E5dFFV#ڼI?wʜ2QUjQ<熙{U{`'>lXYZKJٯ2n5֊(((:~5?8O4ͽڔ- ,BIkE:E&>tttQEQEQEQEQEV^k ,)&ѳFknǩQ=EtJFDцCڮkw:uoB;B=y>Ώ[/N~؃ڻ)v 573x;\O0kw}9n0EsO ,{yD%==¹.܏$vP=ǥBjp]Hdw oi^0N9ԗ:^̝R:t+Ѻ~t5fu08HN3ۡ嶒l`HW?y*.yKXQu?^Wc7W3sbC.duL"Kw$WhWZ#vZʓP%`RD:j 47@*P ZlRDWSنEezlB?#\](T^#_DI^7ta`ԭ.0P pjˢH]UaY:( M.m*ZHck2]NyϔɁoiXeO@) N٤k/*h"簭XD?r}Ozc$t_Q̏p{U]:lWd .v3Ri^OUw>:+#,-Ҵ9a$S]}MR*n12/=uq3F:|zkf+'N2NWSLjqfKݟ8ЧAרCxi]uOcm"mN6%M_Odw3 F*7A&rv~EE5SH-mGd}&a.2ЯIye&{ub-xr9Z9Zn ~JM+Ukw˷O֧-K2yp~pz|=rJx܃nhSA̲\ϲB2#c}vC@; >bE *3i!A۫ IO=3iU T`ږ((+hZY"/RkK3Z؃@<+ԤL/f#]6%cՊ( d %Yq*}1:daUs"YS80O1T^W9y G)#HuIi"#,qTd9gSi'IOF1zΏ 4mHoD-)G9\̫s9$Oֻ [|v䁸rH>n@VrOMڶl"?yV袊(((YX|iVӯ MbAI$έ 3g#ϩ]5pJ {$۠J *21 :S ]kXdyٞT`QikҢF!T8U"77M;[QECwg4xe8˘&~?ѻ˹d^>r׾ls8%#*C?)c1$N)ȧETW#6}*},UaIkG{.l_̅'_w]RxB]VYYb ?O_﷩ ~'Cקk%X]-֋[sn8ajz(J}zp#nPivR\_M3r}jMir; C;9dl>9U$QL@Rj'one^)`ԥ2h}WֵcmU#O-}Gk]F\9QIXTw%M^ L^I#eRh8ktZƟ4B Z{PmWKgͱq׎ۭhk" #1C(D7y L}!Y^"f%0&Ѣd]Jo4n}*oIXFh-?++t` E2+Xi$j2X׋oC3H0{& >vF29jU[$]~CMuY,-;GCY]C)O QEQEW/iۍX3ۀ: 8-!AZ m#?/z`t.%Q?/[QEQEQEQEQEQU56S0&êj--xAS-t>V7 p0} p 5 N<ة8"G; oGO훫azv?Oֺ+/#`vs\\jmO={4Ģ׺wrTWDd>¹{BmM+嘞zS^RYsI{TnWv+ϸ9$]z0SQM*Gqh;ͷq*>+2+_cOr?*;oiq,d|Lȃ?RG/I)9ۋŸ"80>f<5CJAœ=~*+wU;_9&eOCXg{8u}# N]|ZnS$Q~HKt ڶ4cʎ:~ 4jjXċ#7 vGc̊=]>GZ ED?W A be;}*>?Z;~*ZJڔK3Q6:c8>$6˦\3C7$g|=ԯ袊dG2z{ ǧRN|J\Fj&Э~m>kuf]WV7V_?SX9wZqn#xT.O*c!OOk+RS# mЗf2{}k6]E=먓+LY5Gom]ɸ*~wO%h mJ1-J},оF<q[T$HiTd͵XXRkN R&WX\R溗5lNð:vnzֶ@EE%5>UY?,GTQi_/UǪoֲ|a(k˚ȸSN7;v$ke E.ֿgj>=SZkO9z=:!@ iW1J̨5q;D+zj͟].UOG>6G7-mVh`# Xet8 hXP.^m<&3T{Ŷ~^]}=nmD@G?yJآ((((M|Eu*_Ue@B'+*dZUZ6GtS:V}1M@\|VTNksI=I$+{=Mj.س`>٨7?w?ҭUϗOER nOҵ-`@ߩQEt @EtU CGԗLq"4SCv>#?'+lAE-TsǼJ?*r/$ h5Cqn;f|p@C)V`\/~E_FW@rdZ+.h&yWh'5_OѦ'3M1E+}tO/@&}U Y2īұV[db85i="N+[kYf[KxHlrG*{ϵpV-I7"a`{AXܴ1s#F15 񽯉VYbU~x/u\D'Я+Мp9gWѠa|$}Esv߇n9+LyoU}?wl8?vrڡʳO=WmE0"IETVGaXuZPK gb&d+t"EQETWpcU?:s:JޟAWR@dڱ4+cx%\~'ν ((((((ݠ0Pk{]2^ُ9}޴4F F8k h_Ei KeH0ߌҥMqR휋w´0jL'job|Tu5,4&rXW2+VOwMz֭ޅhR[BQv9flV>wcDxt~%TzDn =Tm?ʮUn/b0ڱ.T1#>G))k[v>pz;MN?6kKmB9+b!:f vpІ̹so=d_Tw  {j{GW\F*m W-gw3js*lQEQXNw,[*UK5oy.!IA۸{T2D̀FG׹Ñ"JP?9?Z:tV n'^Eis2YZ1)aHĝpx#JKedZZm 7Ď EeuܬzZ* Ëf* lzi;H!늯}̧⟦O=SUIx 6]vWڳ-&9\:m.ɉ-!N9LV· x2%a*{w]m]Ρ2I3iwi{fC[sO?znbIlV-yc;CνE[doe85I ;:~5HOF5r=vոF=()0"K[CȥR!nzZ}T|шe=?jc%bv=Y-"~U@v7GdͧZgp/U$WZ7C;zVtQwQǶUЮ#fQĎ3bGoʺ-KQ(`*~îKnO֕Ŵ7pdVBoMNB=_,jq+nuKf nt>溫kh`X>K^Wr:a bOS xM:e!w:Z(h]*IxA4  jsQ3H?֢kF8G=#'Y|iHb PŗFӅTԖqIlJ.]1hNM@DgGs&Hn7Sz3#~z G+<co0Gr2ZҊ(w (Mg6>a\io]Q$1,q*T5]"-J,j׮3L3($:>]LjD,Np>Qv[$w{$ִmTp?Ἱ`jطssOQSQEQEQEQEaߟ7VD5G%]>Imȓˉb_1( cW߲6&fU\_۵Kogl(E*iRnW'{s?_Jߊ55 }UIy5E#0E,zPiq9 ע(5_]bcb袊Լ;ge|Gz^=_ïoyذ-o3s{֝Faqɧi=hV5ğcdnQefa7"uƩ5[1 qH5AdmaO9rB*+d>g{+'cZTVnTXTR4U@;>J[)`/5ݹT|/ICV,WzD'cRx46UԥH':)R,}V'˵ʇ?Һ;G>X&ǥx}6M>kr]WGrѲ6> K%ZQE8ԏQh>c$,?WuJLn*}wiOn=>k _y}:0JHV7VE#\߇txԟ&(<"+V(;r Ǹ5BF<,zo5Eu&ʟ{TQEQ\Ɋ >3Lw8zWV֥q.z]? 7;tIwƺLcBO?kQEQEQEQEQEQEQM46E 0T+|bqMG/'&]տ#8?Qi]vdz J# L R֩{؉o}jwt *AX;HMc7G;cgaK SRb'+n9Rh"U籶[ J[E na4/P\d}sZ1kP0,3gv=C]ƑgpcǺqt jm0MY^7oGgD*1niE BQϭ=:=qse['5Tn̕cdͩ_$^n;)"0* fB7O *+\H"t$_]aׯ^$K'p̶~;V4lA!a+Е2 RWVuk,]H{gmَ9 s;VEy|V1?^EQERCTӣc"bon2;?iA]Bx*>i}F~O+2_6iscp?˚td[jznE߈UQE!/5Vz -bXu5M|K1.b#`߮?lwg2BќuC:C:v ={i58"֧[D><>T_?hӥiS++[Lm"Q7 Ճ(e #bxM7VbH?{ ]_EL+~?=r}_N{ Us^L ǹc" vBOMCHJ[c?xrcyV,$Ukm ҿz&3wx*>]$?Dڜ9ocbs zǬ]S1jdͺg,Zclүgmo袊(kƅ܀56pXW;m[o}\WC-~oojX^"ҭhٝui]α;\b2 |-Iݩ0 p{2gekI>3PӤvy H_VZ% 2K7f#5jVw#k7cV B)h((+@+;Q]䞇ȳmVS~Q Zuc}߰[c~pOj͋͹8Pp: 6S*v)X}MuZfmkȣ|}:}=*7>v?Y*6lV-oUx`^ZЈ TjZ(+#nP9FBKXB* X)C)V {Sd" ?~ KOCAy<]oYj>~ *{ⷅi48l[Tc*q߾*ƣq& }\4ճ{gaﰭ (V$$ ¯X]XC"?oAZ̛C]"u2-&E+6VB-K ~aJ'e?,,o<\jQBJG= TӢrJqL?W]Hw?fɨ\_&.IJ/n$j2'_/9o*53h'^ߏoin.ݰ܁(c1H@)W3"y8׮sHeG`Z+4I9Qqz\t?J6hE8cg:ud]Em C Gj B٠MyQ\Mykp ?[KTH)C+(,I4f92jƍpkG^QEPHp`V/{"m 3j}k֙FI=b~յI}*gp} z QEQEQEQEQEQEҸd1y2'$?P4_)$<MP7<~b{j/aQ_:lzVXWHx$p9"5){a` 8$/LLi← E`:pG YZ}ɧ2|Q\kO *3UlwA}MXIi~U1iGDPc講U،*\ŬC$qF4߱ۙCCk|`,λZQ[VYn/!N7ڀ /u$Qʻd\z0PD d~H֤i?Ґj՗GrvN$ ]Skv29>$SO5)}TsRW;OU˝J x碃>mJo\#~ڶ4*ˋxb12;ⱁn0~h ;A,1skn2?XzۥƢYU 8]W#fGQ;nb.?ݬn~uu a,7ù`mlӢW))aT0^䀟C+[G̝~f<*wfneFiiV_eU5|6O~liLsZ|dOUUm:azғq'~6Ŭ}<+r=ӵ=DS,~\OXn{Տֽ"b[[\O:)33REQES%!B0 XZ>1[xKܯ֍ވDl?[<. 97Pָ˝-1HdHkZcz~GX-m|HAKrVE"%',p+xn?O9y|xO2ʟA`DI1cʟ]WxC *__ŚΦ4x\ gy:$1e0>Ee_w62UG[6umpqP³5}sBCgN8';ƹ'c-򧐪U赋U)goHѩ`"'uIS~ f#!ݳt+((((h] :DV +=m9LzݚЬs]bxhTq'KJn5{_ydg}+DX"(UQjLs.}uS\&`zE_үA>W֨j:kI<JjjIz[ 0꾾mn:i͜׷ZEQEQEˉMai/3Tuѱ($2)$։ IN+.JzeʹǮO4֙mO=$&bVз`86doۧ׵%{ ET7KݽG5fZ"vt،ӵÎ?jע(i}?ҩx?ֵQEEshD=Uk<-䆹)nٺc\\s^+FHxoH;=N[Be+$/s{q5>d<M@%} *"i}Ȋ#.fէ~ʝkosoqbhmUR[e̓%m]}XX#g[ <{~'lhրG´ -FezVqʲ 8RXTnN$h}C^ȶbGGx+O?nĠp?XExzo.D2GJմ-}T_W'79PZҿֵ(OT6<|ktWEfп|JOxR 6lWH#nLvc빢xÐkuY/)V-1p}=Tժ()UԫTA}.aqluiWeH.QW(-Қ$?>ZSq[- iIYq-$'WCvV|?3J2w>J((((((dGM,cYα9o,ǦGzoUMi1i뽏pzC ɯ)֚d*@dcNOּL=:E(ʱxg ]*1^H\u#ЊqGse2b?yɜ`A Y:n"xP wӟ\k%$7,ѣ{q*)DlC]%pAVɷ'8cYnEtdT!]ҞKqNʮH8W$ PAsO_zin$\U:Q~Jj 2*HǦ[TQAESK% }Sϗ@e;q~izSC@e'S-.O, 3ZJ/`#eG H59[bGܥO53KkuJNJʕ&fcmО45d<uc@0:Sg^Aud%=8Vtz'`|vju.>u[ 6*q#I88F.|; 09C܊ϒS ?CEgjz˭GY X&31ri:n~Hdube ч4uПhzVm[µFFƼ`H#,:?Ɩ]I/ ڴgwc=zfeFSw_]Oj?|bz+Vh$ rw+Хߧ´袊(sz|Go2N,Bv ݆$jjJqa,_2'cVPɾcT+6a5<>Սcׅ.X rSQwϭpqZEL'ovws̝s oC2n9ʯ_'h( ODw9 :budNu?iu$zm\UMKwg79''JMm d~26cL /{$;~I]Q޺t~7󫊡FaKEQEQEQE6I$. ;|qͫ\ca^pzs] 0i¢>@=V0X :<%]0S[I&ծNdsU}O=+(KEEqm yΩcs}]f/m&v̽ߴ,Mzⲵ-1v`YWnYQqZd`)yv5-7t^%@((~,>fmbj6A?W'?EYZ` 9T!dX}F?2Q7~\6v9[@~|zuU4R@cWd{+!u+K (#SEd]MLLL'{Q[:v,>dگQEQA=+.[9~gA{5X+cE̬ Od!o,\=4_VO-[Z&Sw{G»((((((}o[4GAݏ Q=يZ {4Qv]?tsSU_^?ƭŸmkVְ0˃:d7,Y{*Ҿm>̨G(N^?_qѸy`FNz\ , \4##&k[Ԅ6#n2FG$G]l~1Y"[bSjsjDͪ07wS2ӏ֫=F"wo3?ΰ@W'o$q֬We {ưmWUȒBSqqi# y=r3R\bbt߱ãM'ٵa+A]Qs7[6~ku) ~xNN(۽F/O—R.K|dUi[wr>im:‡mK4Qʺ+'ֺw!SEMS2$o B=>;+UJ<e#M Od3w&P!9 }0(*EXIm <=y?h/.WoPk<>򞢳u--h`rʽY5EQ,VG,1̻]s{œ\V #QEQE@Ң]яEP4ܻ Z'TGηm4ąˆ`:vjƞTXg8)^60b'JE"Ƅ=_LRZ7 a \}&iA EZA̻sWL5Î}kZ((/?|A'x5Eu`?a%2e87i)S>3[4ېbPARz=ZՒ@Hq gSQo\\iS3z:=SjG)!HuA Q[ԟrvCmpMI'h}Ql\Ɣͫr~ˏdՙ7fxد̻[z5ynL+չ8eԵG)mFOjձ1Nd~Tʷ#8P$hQl[Dd({9֥=o'xsWIrN $K88OQEcjԕs{1E/cwt=H̷7HG9+>.~jWYI;9=VCʡ}r2=n1 u. TִCt~hkg>ӳJ՘}o}AC :5n~MV^Ic/,KSGKգQ'ٽiQEQEfز?-~Wg{֞-v8k-ZidzU߆9S2c=qՏ].;1u4*(F߀袊(((((m"ҐґOm-ѹvK\cE  w wzѷ-=ϩ>ec ["'9ƪ%[2"9G00mNĞcݏ2&XOQt8VnysM]9hC]Ӭ4ZQmWJڸէs=G_f|ݔtүڵBz85ehOR8JP2ۜe>^w 'MpCG*m]v_kBIR!`*c9MR/ 4;su1vV@`}u< t_e,k}x¶-q7&QYeުryڥtT)#4QEV^l& s:Vh̄{}}[X]Cz]&^B&sn?IBӉ,U>E:QǶ 1Ȧ[S ڰo䵳+:nѴzI^IXeÀ1HYt#mƷԐA5~=^?Z ~OykUP?SViE˶DW_F LonG\4 1$u*0Mo=IbUӟmYdzRa^qSSPCIr8ݺ>Ͻ_o^nJբgfQ)OҺyZͪl$+ަҖdfdYA+ҼiCAG ꢖ9D"7FSkS>'e襱+n(;u˞OEMT VNFA}}MnYCh|5b()3¨5>{˫Sȉw*-L̅wm=dys|/5&}۴yѰ`滔Қ-%ڨ0ݿo^$B;~}j`HO"rLTQE#E4۱ɂ"}SMxM:} Sf<ƢO#$UGGζWVGA,""iiU"u_#Af!3ǯZע-oks8P}Mdi~c4U>Z.cP܀F?J?:FC*xrMiGS|?lbjwϥi[_^^8h= {Ziqg=qW]oOs^K'5r(G[Y7u O\ܻ>;Ԓo$d=PG$zUڏk:'ioy-7R>z6G& V:C Zq'>x${ɏM:ݭ%(կe-WimXkcKm(]yοďN'X# ֝&.摗fjHkFڝݬs ѶE 8??ҝc .~ӇgjE\ |D#3<(4M=|'~?²uݭ!.Ř?u> ѡ9m :ơzܜsוxxS!t8z}TOZM>őY ȧA.--C肞! E+bRxkZRI΄^1K;l{\ uK}*#Mo$R]J1 WaT+Atʶ?J}7iZ?e#=+ҭnmdWCjti~wJ.euY"0?3(kPC6r&@cb^WiGqyhǼq\:,YdڤkJ i?E/z'uz^ vzzgZ˕u;#N [:_hc%%GC^{qsnz&#[̎nAVqE?¬iZ ?@{?^袊(^y΃ 0kJr~vJ3_IkVMCFx. νn +LHXmc$:F55qz袊(((((ME ,>B}}.5;}![{W@U jۙfnOQիkv1کG@=-ⵄE QԴW*?F@Mܹ>\Z\xVgFi7G,2XǷ;sՅDP:KyӹHXcS껃5: c}=j_jGנ+j*jSBζΗ qYv 7=?V!n=jz({EoU?M[`$ /T{5 ż*2=1d&dIQתZ?ټ_.GZ; 8Y/pG'gI &XWIየ/a7p3ѽP@#dTg i,eH_AL6+:j)&J^W5e/mߤ}xHnk'rYsVʁ$Y@\ƻ C\PMv! uqkT \xz7}Y ZٻLu^Jk/yʁ0>-.|ǁ*[&6&#Nl9,?+Pϭt7ma:³cd2h֩j7\:݃ǧO XRAJ >*Bc'sTZC}9v{{W )KkQIEQE"2:V "Rke&O4/,OǵZӵ2U]_CYID@:z4k-ag z6VX0Ǎ19kE}̣sfGV l~Nq)awIVaYڄK||ǤH?jďHյM"߶2qs`gz߹΍^vxSv3]oiH#Mú#GbX3L]sLKDar}?Dԯu b<174aT[ҳl9s:;mxD؜pM8xI{תz"3 01֨iD݃瑁WFkݤ? mD@܏+].xU6z0zՁXbO 8i6 `[ʼnIec FCozUtLrGH+;6Y-`}n.R:hQǥ S'q }Əmn"|4v c]EOFQUAPpzkoYtF̭d2c+}o7dk8faS-ƉB$GF淓WyEQEQY>$CY3ָNՈ^1YZO7>ҡO~z+٬/U8ߎGִՕ2zKEak VAt4VFa.p{?Oxխh(W~ϡZ?]ZtFܪ=pr]y7lYGǽ7JKkxq Uۿ((FI)mޠv5Ë]vKD.vkP1^ 28l`m|3J=4i\P{~+J(((((+W屳IyX}*4S$'ڢ5}f .3W'ַpnY'\{z DX"(UQSKz6H@<$7Zίuw#l$wc?ZŮ?|,j?h rԟY~$ҵ Y7?_z^ `|95>qr;H>՗iXI$ϺDןq'ڲ@Nϧ]%cjo 8$w4>At* rQsRzNO&_+jBu֑hTLVme.>j+B`d+&K>j SGVU]͆oO\] \6ƣN,e۠k,nqVgkQ*ߡջ1&ζn7ҵﭢ`ʈqV/%3ʸ{ +-Apq 1}R(yU3STgRx'[ۦʌh1p5yu<IM v\d11O5$MީɦHAj}z*DPni wbfk Ԗ.ahXx ԬJB̐_OEG@1U/e|ueg{C<7hpAHz]uE:CF @ 嗌Zu2<<[uݭ ˔ CZH!w`;i5 #\7O_hVתn,JS?XNʖbD*rOq봴6Y#0QX(;/f\|xr?~\x sWʹ<:)E"UG#<)޾dFqkFRaě`)h;x6jϙ' tO 1ıƻTTo.El<9Ono乌iz`>@e'Z f|ˎ:+[h F8Or}jj((մ_2{O+Fx%}:*O-+q7YqNu_4.N%Qj7MͨÖQqKk>~-{zڢqe$]A/[ݮcomb2"氤/yŮ ˑ= yҞL`g}ia$&x6УdV5{{;)`ABzx4OO"vvI ;~5h~3 ē€=NUoH#!s&֭Uis9qdZEdkR½O85qVAcjC(`r"<m!(mkȢݱ-r~ ́ϯmiiAʭQEQESdA$lʰ +Ø5 GN?u4QEQY~ ,9!7t~7EmҹiemK@ؿέklmvu~]e.&ʸ %iY*@aKUu*SHQZzMξwrbpuCak[*ca 3{x"{)<C)C?/JĤO S\OOz2e # QES&;xZYcFY ,,~wnh,:NkyA+FZл==uOgwH^?zv?jݭWK:*fqy;UoEV2&g=($P|}t܆'U%G頂 4QYZ~MzfKv޺r2((\+?4sm<= 3b)L y?\t*_ou$-<{W4wиxeXwEQEQEQEQES%8"iep% jӝ?LV z{f|˖4*+ \ Zr40pkM_9bNwo𭾃{X&fIjWՙMt8<~'QlK͔[ƹŬgL,nvF,u%;sV"ơQBs1оkdH~p:=<9∮t&ɻ`?׫SjWlR =;qr]^DXj(Q6y時FYW 6Y#$a8;zJc:Ջ;]Ns[(- ɧ.2Z`f30WUETȔ[QEG9BmX;W%ynח`՛Em0"X?ԎTw#LkzRNk*yZ} BUMF=BkQ&hD:UWE[hcsWiXE1j-CM[d/ѿ1fk^+jMέFv]Ť<~lw>D6KsSA ~O*`GD?&3\dQi$Mgq<1%x<աy"1R-g",6Jg>O(\g8U٥uyT8׶֭@emsȨqut x5rԬ<uޝ G\a [^%es_AkzB[ 5m2&}*;8™m{}/C^;w?ګ`C 0 jxVxZ6{D0NSc_^/"O?Yq{L]qk7@ 0ߥ] }A=<ʟcZW7ֺ4i"7\O^3XzB=")h8=9i7d)+RR.wQk0>)urU'МFEqPЌI47F59mJ5.b#^c+yu9/ֺH"XP>}El-OF#ֹYDBE sw׉o642H OMƩzM,K콇^XXZmpr[ܞbO&Y!\%vpdbWW7w<$c=}ϵU-c WH֚~-3'VLdXY4~MOצۮh 3RQX2urz\T0 JAW1 >l|}jm6͏o>riD14i噮dOZѺO2U~SAu&yV?իEQEQErx[Jw :袊*~uMCŖ/٣y)7?ƪxA׏r]2|K n)=A$D ʵh5{{W#W[Es"𕖺Q{>Yua*洟];T'Rr1O#Y,eѐ0jQP]elNk<_ kT1ڡxQޕm}e ˒+x!Ҹ>.?ֶ)C)Vaj[ϳ%\sGҩ, 7W&G9\Ú2G ^Z]}n۸toz((((*n8Tv>WmP}ϩ>c¼zEs6i`K)t_;I\OkTsOfI"+4bǍ=*Sm`?w>Xs\wno/,#WN8gooiHN~g54:mp+*})o2GlרRm(An:y F ё4Vmɑzt1ԔQE-ʏ9SSdfC^W?}`kpjr}֭CAA+{Kv- X(WJ#*\oI#}WU(B.V@3 c! = j$n)딒&FGZ7Xe܌:5Kη1rE))b1x'p~SՄ.d=OjVpġkVՃ +&o?OԶj1܎9p;bպfUǹ@2Gҝ*ԜfA;&7\zrM f<Z("]_ps+c$~2$=Ou+{kZV>HM֤yQOGarOҴ`n,"=Pxo-lf C:TW7xOrv3@};}*WBN"_z^os\r\T}ޞ®EQEQEbIxP$6u>پkp@ :b^. JK9>xU8_M zh-'X%+ ;Uۿک{[د.zFY#iۃ{?J YijTM8{kJċ8"P$ܭAN8GoOxUC3ӯ'5-i fm{Vo}=PadЁ}̈́ܿ `/kWSl[}+b?.g?5q >OZQQ'ֱtϛ)vY>4A( jJ8kk8jԓ}X{A K KQZ7q4C׭((+\E&NϦ9ֺ8%2u ?RU[J>})9?汮|W%mm~U[5Oϧ,OUSkOJnu@Ǔ+|7jIx1[tQ^?'D}\\\G;nlt9mnR;럧MEWL>V,~~EH^+$<+?Ӯs7c cV}jא,7f}A}ϯt-gwTgKU}teUxS!T+ktd?]}WPmF}8ucp2MCde7V}3E(Wdw vp?sޑ&S$YztoeDl;5ECYҧFs\wNbb^|A>q L)=Gw"+F A* [\m}֬K[˝\0秠Z"&d# )VVvm֍g>Z;GҼ=F֘y{?kOvjj3/ʧpGTW6]́Oz†{ ^V2Z9OB=ӵ+}NMn}QEQEQEQEgjͶy4ecs};PpQk~ xaX@)v 2I8 c_Sc*8,=vCs\7OaWNMbj>#IJ{{RO6F;;V6P|O5>-̞EIǙAZ:o>s䟩k:힝(D8b-?:ʒP%b#?>t晌 PT7v_ZIm27>iSxkZ蟳9g]|ڕC?|䭼xg\id ۂg$sXeյϗow"m:u@iFP7ȫμVʡSMl"`GJqwħ‡G}f-*y=MoGXc @ɥ>}WMu?9פu{L?5IG(Ϩ5h6e݃9L"vd9]q\2!S}BTe'}w?M'}F㴄fT. ՝${r ۹IR*M45V}+Q4 3E?M=k.ΡT Y>;LڍHSޕq,p6#aSUB,};TlO?J/#qR/*{e'=Gwjp~xu%IWox5gΏ—͏߄ؐr|ÚLG !'jz%ڐTC)} 4۟cUcp}TJ flGӃV#]>K`%Ӌm`_´[j{HE"1g֝ciaypYg+n =Gh^m}&' .u{ hȤ .q3oX˧iބ EdOL*4mV#Z;ûiJUUՁe f:qR3R@dڹk5k DW|椵[hXke"3T[ ?Zf?7Z`Y򶓩GZ;GؙERަ٣8#I5̰1.~bkfŎ@I@Hӕ?>Ie|QV袊*OqP6V_cȨ7 rnKw1{Okو00Ns F>L$^}6V dkz-g`#'?Qޛa4fG#Ϳ!hʟU?ַ֤R}5b((( i̊Z3?CDl5_O{?,| eZ^ͥk>W>aoulocX־"-yN)c׮Hj My1?[i kH0FQYڦEFR8Zzef$+=O3HkrxN>\sray#pr6{31by4 ;`~̷B:?tP@1\u^OVv7jX/*Xh׾2jjFPUA5lo ]JP|+ڟ']#ctTQEQEW=#ʌ"Cӧ^L9ϓ S`&[xR?AʶmKLy23YyMK:L"`|ϧFP~nnjڻKH,1IEM\,m\Hy qaWQL$2(e=A [ҟOkV 1?Ϝ!I)ёC qv`nUb8:Qhzƅu+ܟڽ&*á*7rXuS\r]h7~\| sFIoq+,-OjZ-+EɆ&HXOʻj\te^: Ӵ®L$6E 0T5ϼWvnmsfv>mۇ2yVQEQEQEVX4(s>Z:n1ܱϠT*PjZ+XZi"/Rku[v)={Ulb˟T7ŭA \׺'עiZ%OJ[FO򞈽JokNckӭ # 7WZaTa`|V:tHCH|UΔT3]C>Yk9;`'y?ckmޯ cO'ڪxj)I̟vǷ]$GkQc,ݯ8ٴ;+^@ѹÄ zv?ҵ*䛧 :MIeb*Xnqӽu'@*!e c=jh0Ǡl~Jd{WTyb;y>쫟ClYJ٫z*ǻF_aXX ֹuaZa;x(*(EQ\3]cLV`,cMeg )7cYۮm`| $G GԆ"1V]kk}$.N9zʎ<*[;TpX8_٫=?O'hHrI@g\DDFAdiS;$(oiCq2[+=8~?{m" =Y$[Y[ZHA2s-/n&T.WSUo.9AW!v8cb4U }V\M'~5j,{)Hq޺-'V`Gz2>WL t` E-s֢,$}fNe9vj+S ޷:=* Iřǘү]W>ت6c$Պ([ 9SQX_4UUBT(P)VF[Ȼ'`GW!cs5o$OCU97JVAϓ7֯Xx ߩGycod`zr -QQ2A?AUme͗!+qQQ*c VuA^?g_[v~s!Ԯ;2AXm6ʳʐTTm}HyPFqor+{I-3ƭG?SINE"I}2 ?Pkl8?H5[90S9QEQEW%nUr|vo_Z}^ڤxa{Xz`|F^~Ҳ-tqj "12:U}:MYq!?=4=~KiF #S]mjcD {v=׹'9Dn9<4$RHc6;{W;4nSM(5QE?t_wYJ>@T/;pzTo!q+u>w=i5Ӄ4_/Ӂqns!ҶDr{> |F SMu}wAD?4&39oaQđ "SY&lv?֦md Q=ҙ e~{h۷n1m [wOJ rg"C2~ȃa<kn*m`dHuJmL,hY͕H>kN:䯿$v$ 9SYɹ3юں5X1Nwۻx_uAZ_[Đӭ]q3I5Ho.Lht >h1֩b^(5H !ǧc]6|/\]Mwv l@idZ洘 d9>ƺ̍$w՗l 2Lݺ}M\(Z[:Au--EBz;*;\qir(ecZZjioz5-82v>X#kQEQTotk̹_.^'0]jrmrp2;Vx_ܷ'>Fln%|U;8y~>NNPZ5]Mp_};α4|_1)~mmA횖(CC-\av#w7i}h'~zEqq }Hqq*[)I/l[u'*ybm㤣~>G Zcö́?.Ʒln 7z0A)j)H#{ZKAp+qUQBG@)jdiHWNJw^ޓ {UmnwLq- w!9PYNL@U⫶G1NنiVMRq L` i/Vd>?ʭfq&s`uj+MRU:F5jiV۠Xov~UNGEKtJHRUds< rq;oL\?TR BBOA`[=(uD6n.z{TDA7'?iZdOlz1[Ѻ ?[oYPgSQHΨIs> JeoH^'/ckvXԈk!qFP^v8׆t I*⤢K:tYXd~(gx#w_BǏ5QEOTӡմ Щ?=ӄq^ ^zJ(wX}gc4UEŴ}{S|?0k9yp~Rh?Oƺ(}o^KCxm#CTCSg(pV' $kso$(ceHp:ǃotkxrYGwy*z{uG?6KhD焐tN{c+kRIIN+UWZע(v7LcZd,"UOSwCX7:uŃw늒'[ҰU VG8}0r?#q$jE:.Qaj~'̖y>v0[ #a dG1b#S";D-Egj\9rR2WZ/1ڎ#z eaAmG8Ro`g,~jC pF$^jQZɿZMo$[r(ÿ֮1cvO*SVl(n[i1_2O5p@kzլ,$B'?KAv,HBi[tuf+Xa3y55S%aX`zzeO>f!]"* uQEQՎ,RIGprW;{.y R}RM0 Ϡi=g h0 m?5xZ<=c2/2?:洟 -}Zt0=؜U> kKc{㺐#ҺokZ[pI»|x9{OH؀2I)ERB d DX"N20jƛ7ji;]KlCSqt=jZ(:aF2C'ӱ?ƻ;;gCҹ- ơs)ПO 8[&WPr+S]-t>X]xպ(l$#lLrM{DtP0T+\@  d+h2eL'|S$ 5;-.Tu?J]1c-w&^vGӭo%ݭldm(~E6뉲{?hæZ# GwROi :1\2(%+SSӧ_Es\52[tQEQP]ܭ%7=kMu{SgҪC^2dS ;O=m/+7]-TvڮU Q/mEQE!8gL*}j]Afo9OOcuQ\mwCʏNG?QMG/?^bd)"Sdl]{Y$8",L h}[V8˵LtjK ?1SŴh#ʝm-?w<jIl۞4>ҮU]F_*yogX&}ǫjQYIjtg͍~8Zd=CLҮ9S3W}gZUkω, ȍfAk1RXmB}sz3o#֥-]Zfs+R8D?F>(o)ԭ/?U9#Eu9Vږ*73# sMh|=ty#I袊(3Eڮ<$bWP aQ.yS~&f^UE[}(>~wkkwޏkEK|,[Z'Djxu_j`1ܱ?R}[+|G=l5mC% Fkv5xK\*tnW}˫kKYT IyF\nk^(δ>szCO[w*+*GI$G\ =SӟΫr_ʮQPEw U=p}Eg麕o3%z;;/RFߘ>ާ-i+?ius{_ hC [?4k+lՄ19{13^ f  _o[4QEQXڮfswe iw"r,Ru;C>]eQEQP^^AanHO PoKvmGj}ϩ>aò!KW;[Ҫy6ɐ׫Q̒O[~>G+[@EݏȆ9빤55!^ճy[iFpjŚ~?γn*Fc^AT-dπW/=$W*QEe/rjZ}d^WEfjr(xڧ{MB-nT= U=(ė3e;Vts0Gn?uo\)ıTģvem8?3ռS Gx>]>[Gtk<جD;qz(۷⧰MxԭLЉP~>G+_@E堉bֽ^V3C_SHonzܣڴ.l_;)xzn~3->mHGTv<ոu 0ߡjs 'BâvC}nsF>>x#O%O'cVr7GBQEQE#*(#Њ}aSG@TEw^_ 5/c\R̳ ?Tɩj|J"nZd8Lb%@~Q5.j>1Y;pru?_ֽ;Föv{aZ9%ѵhr>H?];Op{V(]kS8H6|{}km&IoӑcOuUT]0}GUݾpmxzZy n H#AߠY)`;V~U'p9_O:TL?2kz<89zm:vsn}շmy P֤'˅zqjDP:(:*+ޝlp֞t^r:*t_7^h]Ȩ=XV\Kou `=[Tբ)mX2x?ڮv}]Elü?JUTP@-QEQX(Ҽ'<QVt9U?+F+ӒYB+շ|;d?0ZQETip :o L?gٻ=U_jCyW2Nk5+AaQ`/\e8C6 R sa#]އ}/VHZuIhKv9 麫vh'?llbv=O;B_.g]%QEr8ys{dI> |-uUx6:Y" ФX{::Zע(HܰVҴ袩Vjr72Wu"jن&)z+LRT,<3~LykoU}Gu>޲Ir|Ϗ3eYh_]Ǣ! M>,lx'rzӦ7*ѧXǷǪ+: =ǿQEV^%";7f5&i-d2>P=ǿAGzZ(յm"3e#\35h?o[k EKEr^%񅾜mm&'?ƸR\=k1BD:_R8AZk6@`g {l܏+}.` aO~XhoeU;[ő >5z8ϯ?g? 1»cEQ)kQQhQEYky/؟*Vcb@0:/6~޳5--y`?:µ4mD_JAnqdX8AY =+{&9!D/y볢(-SY!-!z4}[ef$/qk]/Ҥ.y,;d<2qCkmg񷂷XdVib=T}(؛(Vf8z<=􄴌o^jb#G9P?ƱN=:i#V׸YVzL3|Kwmh`$Tmop_(]C"ay$SȢkƒ.P޳n4v gn\!"#NBvӯ;v!d=V--lU $30)m5@i+;$m!珥Z 2 e]= H֫6wr66QW('&} p~.XZV"gzT~hPgS=*cF{h]ݥ19}_~o~0\0v>~(Z>eN\=9?cİyz`0}ؿg?.*QGJ¾kہ'Ram-QZVOsjJ+_2'=To!ʎ>ƮL!Kh2}*QEU91kR5:I!9oq]3%),g( ԔWG CByAL{<5mtjG+,:9ڴĖڴ+7 "oLxft7w+ƬE6D!)1}odp9DQS(()ϧ[!JU8Wq=<ߵ?­E/P-clMΧi*ºU]>P {$#Z0j݊mu_FN˸ P?ZsZ턶rN&][ #=Lj&/8G0#WSX|ۜx$v>ީYXȞ~f=e+ĵ`@fq\ciQ $wj>S֬e`oQQX>krjʯ5 Ux1=ƥu?qYnhqZ6 bdQfzZmL ~:V겺R=-U XS޶dVIR5O?f\x2SzY#7 mOШ#j:%wsOkF*!ϫMΝ{)}?է8V|CUEQEQUM%Ё'ͽX8F?ttQ\XN[ݎT54@P=t?bn?*dgu D|A[7Q!GcP?$ʸյ-zh#цa\Hb3HgMcs'˹IeǠ]Q ^t5cO+Ӡ!-`RQEW)Fkh:'?ү ڸ{^C2pOex[ſcV _4Tkc%dцUiQE+kPيCQ\$OM lҟu[v +6MVQ w4Rdnn<3~$B^=zC]O&_פ=mǘT~I^{7Rg#~WcEr!u )JLsDd7Wc=UE*MFVO׼IoFѡ\_W'mSg!<{WBUB )j+-!i%X^#7D)p>gzf*h$&nJE"Q-znR.S/ ~r*9aeè>fͦ -؟aQSu:SbxAk*Nkؤ}kwZdk)xe@Q:ZoX׮]`^@?R*ҨE :KGN1n01PǯQ g4MJU{?B._krJEXG8G~UwrڥtVdE 3T#%XHy2}?|/8|?ֺJG޲%tOqa'{򮲨YIoGERH# T9M- ?Ͻ+r$rT?diN J} hQE^.XU<|ERoڬQHHU$5+Mo?W9aeè>d淺gִutqB)h(u;.Z*+>v'fX>(mp9C_k9iӦa\XK7>k R$-]$֬[BO$ĩαti]jqn%wmK;-p0܏ZAq36P2һ}NrG'ήEQEQER3*)g`9$XZHNG'agw /.Y?_v6ְZB!cvQN(5q5NMQZ#UΗwotݕ?u8.^@lkd~Gk76_Yy̲I 3W0x~=*&Yȹ>S ?1z%iey黀Nի=p@efGL }N馗P==}XirQzqXΠ5H@Eeu&p~ڶt߾rs5XzXGkM_6>@tu~|Z45n4T.ķIGq ŋnBZ>qZV\3z|fU>*QƄ[75tW[pc֜upX?jvv1ܟ֤6?zDzm&Aw?ʯT7Py>OT.jr:pEvQEQE1>SmW c+a9Q*;uʺ6՛-[PUto3k/HM[ƁT?_m?W % 3*E[3] WdD&G=63ԁZO鉏lwo 'K8?Մ(hxcH&@H) κrrFO߇C5ubU~\Het#4ZfO8+xH!&WS{@ @GB/K9ĒH3v++OQkkeXCiAh*#OV"OvMx/qSLt]F8q<֍W!xx!?δMpضDdug_L<6<~F?fXm$~6*QX^&uR <# IE?`p@'܃銺FEWyo eV&]s=)CVu-~P2xnH䅉|^3·kj~C%~?|C[Q\Lj,,@KjPOIII_F뱢(a(k3Mկ|7x-ntoq}u]Cyn xۡ5r ZO>d^y_SYn`>yNBS[IwXmy,03GּU=wH=>ζ*Ld+?~CժigQk0i?gGIu)/I`sZqZ'٪{s4փP;%ؾ]XLe27U(}*L?r:~iAZ($pc=Ԃ~԰°׹(V}csRiyP#oWk;\-*Sp2;Y.bs,zz>-Űx zҽ'$:E F־ǪiZIXt?r> $gѮRv.:wTʊYU$SjsK0Y8_AZny8y|=f^{WEQEEsq , ;zJ凙޴SӱYbݿ-8 QETrA~5or96}~uQy9oȑQ-R.0S&2:,x"M}xc sa&@7QU ew$($=5_VgUC~m}tΓ)e)փœn}6@3>cUkgOYD1b?~B?hH 0ph򭮡'#>(4{([*P-`x܁pÂ}#f| ?m_B`CkE5U us7^"FsɇX2SFAKRK23ҵ럴٣_QYzp';IZf^7?Z qVU=BZŀxÏozhĜ.|ʃV~qY擏ÿp?jY>[xíWSubۑ'|QZV3?ߥ_OAP髺I%?5ETY {Wd$yÏ_ƯT7p Ia8ԁǵq7?eiܫ֍\??OZ0fTR@Q&.%%=;?/sZ6V)hސ|XѝXˁ&T?[6 2$D}2I^i]qY@=1\~<{->yK ִcC⢋NmKpF>*SKG͏S%rH W-~Ta43ګZi:1߅OJAǺ\`ßҴ()$< !8&6}qsGv?$czaCUÑn'b9:-u!7Pp7 ~m(b^E-ClZ7A=, Ȓ ď'O:[ {sՍ6m%Ÿ)o{U2T;}_kG4?Un>n#wqʮR]{_UUyWv9QUZ$ſUV/ }~QuY,2.}׽j\ުZơOZB(U` Z(Zԫ _ZX&u= HYW54pEu akZ/)84ۏirѩ\qϻgSv6 MjNxѵ99{_iN\ <3_N^I_Sbğ|Cgo QmfH<ڤ0#E%5G;*I? -ơ8n?/^EQEQ\o kÇP0nr@!}םxgR7w)FqO¯jk+^tlrUSxO? 2_{ 2 kS",8N1|rqZ5ǝdP`- ^}XOl^[G(Xr>R7󴛶ȎSçoqRf?ISuOtmSjT\~]V`l1F6S/iisǿi߉l|MF"K 3G٢Րݜzm SiseW~}NY]C) dr(t {$ɺC}ƣ@у~u>cH/}inCyGS{WkwlUxX"F;kPfzԲӮ. վQu5YiU%*@)QEQE`Җ0yz3Yl^V+<ժ+&"A=} XS=OKEd[K, =aZBڜC?S%¡q|8OPmV$K1q]n!krݹ[?T ,@m+06V }1 tb ;uAJ3Xusws܋{u+sڷl4!ڜz[dqQER3*)f ($ZM^C+ ZI K * }coĻaEP)QEQETRE  +y׮pnӚ0 XIKa'p7I(@b- -Q|s$S,ź,nM$"t;^&tk3YMk/uSio>jc"_Pҵ-% vT>ӂ9{o9bG^OM')>_Wd9@~Q]^NeQ\'5%N֭).}MEW9S#8o?3۰kVlQE!`YSm$씆PAdޠ[dCVWcw+o=@2ITu&&}R* Dc5kkX^ǽPԵG!銥h:ib?aXh/wkWy~>?}, V DR=g?w>𥯅#s5̸2@a]d`DÏʱPҎ!~Ya;I1n20zT/im'x8O"Uw֏'[%j!?ݐZ{M#,SĽe95&ծ4M,zWKo~d^MJ#/tj+~ }T,οҚ|+8?'n.Щ8Xic4?vi΍fn {*=ۀÂ\ ǚ鷺{6~ #>ҵⶉcU\$wG_i.GYbfUYoU\Ja} hEq _ea /t>Ԑ]ͣNaQ[]\(VS9Aӿzl"UG3/Wg槓MGsj6K3&Q˯I#lз$no9UtXW]^-߿Jfu?:ywn bxw.#τ9տhX?pUlӼEDz15i:?)ҵ ЬLS1~WCA_ n,ٲiZ6,W Z6%<MN~:mO kP*^QEQEs~34g}F9>XR}U>vl.?t,)4Ғ uQEQE z_;Ix5oM&&=>xj߼_һ8ٷp9bk9ا{SZ;ﱛ~\jm{vޭ q'{u5uXfi=Q<#ǥt# tQs>?ƺ)J$Eta2 st^uyb ^*n֪ "31(#heF=GQskym{xOTlR5n?ֵ( kjRqި)ЮG#¼yd ue24bXdu+/1Yn"ǻXe*rET7WPNP~¸OP$i b=?ުI֬^܎~][GқP48ּVϣMG0Do1iWB+ ]?/B_s0Mt<߁m( 3_&=| p=o9OMnp* U!_z(F gڮRy#^nl6:A5my7纞b*ڭ_zFֶڛY3/}=? Ӵ׸dZ!6(Yve4i$Un5k%?EtGcXz-Ømt_SWr.o,y O[:d\+cd`z> M:?D(F5{[\~;!Pk$] Z O7QHHU,9$;si:y]|{J/5]i⻻+ ]: +wSOzEQE#*(#UYt:a W§5mQic' ;T6 ђ,hSԬ4Ims'kYf<..L%N?!X-<%2(S}.C{m*կG4WvW6ڴoy=H5uVMQ_4s1D)r }, \7i+OQE3HM80z`~uN0=0qVvױXYZ\I!ruK4ᣯy?OJL1zt7w5 QN3@XW&K5O*~{5s.z~n[]tn{*z*d.Q=+7O2Fas*y/rV#s>6t+հ#{բ((տڴkr?ex6fJ|[/%<.OQ !VaO'&袊((⾓ixE&tKV'ATWwi%axv$d {뮊;xq~OCߡ4=߆6$x 'V{tުoN狓cIv*I˧(Z&=5Cj6 c|8ߧz˛74b:鞆bMj\*ׇ[+g̡nnt4QU5 6Snc? -_FC-*}v>v,>hXku7]{9a+J(<zűr܃ELf9 a?ϭuӦA?zZKd3ڱhm/lJ##da2RšjL+dϗ 6!+(3A?z訢Xd^cTQ\uxKP6w^ՎJ!\ylUKEKQ<ɛ,~wϙ#Gk6T,Q/$ĚԼG ohk7˒wknW'˭>툭zWYqxN|@l!l$0y#R[=b$VlwS%`ʊ ?KŌI1[zfwZNCH -zo$u|}n4Os8M2cI4GOxeSO.4mɥmS[*t cr*&u3hZMwYQ7ZRԯu/toJ>HdPΩ\6# I ǯ+5(5#~.O]P,*E5h#ښ_+ȇ+)H[ m8-zV^SK:ӿ_^~۪-vx>JStZjeFuV4X6:#cCm<'?qT\|x:-vRĎM-?GPRRm' %OFi<客o;z]?̟4𦈇dsHѐi~9? +CŮ'(f&[~Qs_i.cMWp\$`=Upx EK$hvcP(Q gqxEdWOOqj;+G:SBc 0@t4QEU-KLRdl8+.Җ55cZKãczh`⠲εB~[*-Vj:|q!=tƹݔ2XKK ?>W7\FOCut(aӤK#taDKI9?ʷhբI8yՙFgT[@r3Vlާ֬CUOIEV&pYNO1JS誷Ij=QE@̼Uu*{%#orsjŶ,-]!8[0nRT7AYmi-z>Vlc^aysat<ibUIyΙA#l@K}=@ ݚ (pw׬9&gŎ2:tFuf_|<#~_ֻ ٥S[4QEQHJMop CӷZcmL 2X4֚vyUJϴ3SsͶoE5Vh[ݎjwMkEE,2ǒpUϧ  A0HXavz<1psgSgw}mm(Yqj]0ېC]dsEh4y7ۅ:Mo?OhQHȮYC) ge-xnyCWls܍8ݏ+]X2R=Tk+|UYcWSaCo*h;r?#3ou;du0L$~VTQEQEd`3dxĜ+nP=J?Lg\ƭԼYc`Ul`REQEV/OcC%o2cǚCaTu\t/C|I Ś0nAtu>kO#f9~`}A΢\Kֶ-#M|/ u^@޶`+7Oz!~ꨢ K0+<ۊX}Ez߃ek,|_Fx#"zz(mZ{VT/[y yj>=Gu>v5j5z .2U1_W1ƭ?- x-^kQ\\_t5zG"/Qܫ(?—O7; JZ   *ԳCA2E(zF#^:O_+baíU{-;^j۴ Q'zԷ- t#kfkYxƤc-aU}nZsoκJ((5ox !F'‘i|ABGEzQEQGJS}"3]7 G#\^OX$J(QR5UQ+ [*s ?߈WZcwo(WIty,n">5E2h4gpQNxՈ:n?]%Q 2@%Awm].N]>S;Т>C`#*T RdVC\>yϸ@#dȽYP'~]+'?\,}H^QEr2mIRQ6_:)Ե\m[?ʺi_gȸn#WYEZ ʼaW;=&xIvpݡ̍W9iwZ3Idޣt?x j(<};W[E坽[6{Qk<c-=u\Vύ7 ÎZ f&̐${zsjaBt881BD:_S}hQ^iCbGO;+];l$c?OEu}nq,0tś؎sڽK![4iTA?J7.7c@(?ҡkr"maǹ,Zr-necjt,}YQ?P*J(|Kq}AL ew]/ g,OoV--J6^d=jQEsڬ-V`HE*+㵷y8D5閲kO8;Wv0@)k']ʾ晡jWlLcåXMSlץ:Zw>`;\g_jn3ud գ!uIwg=Y?L~Y8r=WcEAyw1¯n 7A(=x`QEW)|S#pVUY[~P[ɬۍ|l1=U6k2jXWP)Z|x7= mOeVCgj~b?σ|;1{plQ{/(+kV:Ɣ8*?Z]F?&l%+b(zUE\}~gFhQNd#ڠ^{zb%_RO굒mAUKiZVIl_Vmj5=oOw1\+MVNq) e?G~Z2Yk{Ԙ~Vufˋ7;}/S= iYRrnojA],b=j}jw}TeA3i[̶mooҧ'nqjMZ. Rd頜$Q5E<3I, SAs_ @I̋{((o3 m_cnye+}z!P7I'-z=QET77PBe@;JYY؎Oc+;72hlX9p_]o āGM`TMi2=Qk<0ɥ^WRwE -K0~1׏ɥuq4Js}g[X,h #'*gK۲.,AʜsNQrm?ZYRe68Q\ή|rW)owL?VU[6qqF`\xbO;MmVm>?j\JȾ6Ã]&=7P¤9?cV5{H4ɢ7`s\v7Ik:G)z;4O[j{a>~~8Jas,_kF,mk ( {?ֽ^HWgԴQE#(e*x -CB2U;A}*Q~CWِ8 /Wx#Px+Ӡ{{vTR;!w`I'WOy?[~Ak~3U,z3]JLU#w3SEQEQ\O-Ia.Ļ58Q{{֍QEW[3g+#Fr,=>տEr^-Fc]f.``y>~u-Qm,4_RҞ5'xT>|?/?C+R. ?*.I9?QDWBXdR W^#ǫq;c/OO]D$6e`x 4ࡹd#ԟ𮾚;UQO@+!m+n?j vQ.Q*J(mO]I 662k*ăv# mEpHvk^: ŕOkMkgҷm+LmX?tV~CM"gn+:D&e>twJZ((4񗄞ci@VQPhjppΟVQ\hkb1q~Z4bIhP}2}84>ƬhwhPIS\-Jߍn#ʶ-.9ӣkoc_κm2_i\ge֭t^4uXdS-iָUPi?"}sF<_߉č3O(rO1!:r( w^𩨢"E_ANo,m^\[\6^IޯU;Tʱͱr>\OKVF¬-zW7#1d83ڽ5BDǴH+X62I?Ҟn\`8imnsIS5~>MkEQT5bL_>O݉9cmic16`pz7CT8S]%QE2Xc32+Լ%ͱ-!IGk'횖 }H~} i[.aO~fcBUFI=YKق#'{U;(ڼzVh{ZZY$6;kYMX[Kv=zSZR`޸wѵ?1A0?*VuX0+`:[p09-j{Z篹`*k[bn bA4d#siiҬc w'ߡH˘*h1^100(*7O|sP6z{V|Ns63kbxɥiϊdoNeϥc5__i׼nCSYW 4m*}xT9t]?\ z6rSxSP .7sI5<7rz(Gp̹hi*}/C}oq4̒mm*jϊu{(#jdWO[F%r}kJ)F%ɵ䳛d~5bKW<ڥۙmjhA9x?NڴkcF+Flk:EQL(BƮȬ; ͗vj_Д`ch$Ka-zEZtmA ޝ$k! rt4+:tWG*o#_8gHd2K,k4/}Rk C{sncЎ:t׀"J4w?:((Wdw vp?sDKz #+QJH5} %d?O­I]t2;H1C!sS@ڮZ|0)?ZKBO[y0[Y$%(k=[jզq8'vOVo+EL0;}kԞ2]ҹE9UOGuO Is[R" 㚫6d1ß|/:jzQ- rCGgs-jX`OgmR!I@1@n_kQEQEQEVvEAfOzmPI{B&9^RZݢ(^s<ºs% w vnd*\6sB\f)4gv 2X+̯&ωܲC7S<=mmEUKEQEQE#(e*#.=մ9`?})FotZTUkI.pMsL_\~E#*e `c.4Ĉ S 0꾾⥾K)m{N%{0?ϥn^ۋ9`?ƸǷY#ϱ A؏SP]29_My?2r>ZRĀ$ }9Em'$_fofqA&Z1iMo@ubكoXEU{h0ZyV8JEV|Gu÷OET <; Тm*Iy' ]IaQBGjoi$͘:O'ȴ$=?IX1,4q u 7:tҤߊo767#̀7گkzڴ:[ #=oPr5}JG?[_euķ}v/_J?lU(XZYX^ƹvTZhI8m7*4J.2y1'ba54TAҟEQETsf9Ya +1BB WI1Q3"r0#Y7kſt:=ڴ--#b zVNH1XsY}|GtQd9{;jW$'^WB(U` Z֢{LycW[jm`[kdF09Q\ψ &->{\ ṢVufVŵ/E_'a-{I -u[ QEQEG/6W%⛋7XN[1qXo+6!U@@=O}u K2T3N=ꝕxh#n I&,v3~Ii#%ealֵGuNzٌ߽elzKُ*rP}wNiŘ[lenGr妕 *$g5LC-~Pђs}N⽂-m1ETQEQE2HhHh7vl88#q s\fh677wQt`A>Vy"9E01܏_zIDWc%@5vi3ϳnu:j]ЌT I@Ջ.B:&>k:Cq$?ں}S>€:yl1W=e}=̷(N@>*FEO]BɎܟiGFF*qk,݁st?(((:9825km%krrS?Xw,#K<e_=WQn\,obŠRHGf;+upzn[#܎#s Mvdt PH?չAA=^}I8lw>#ak9f>J K a}k^˹t[̎?3*QXzIcC?>4ƨ:(:)vAl>OEnwssWj.JyA,@{Qo"d{F9aK{.ެO gadۆ@Aku[-&߈E ԼKoj@.n??*MW5̗ U;NaYHܻOZ4QEQEQLh"k/e%}O |"O1?ZݔU, 0Zp\r0;¡/عsƒ\u9(sZQYZq==?emx~oVjJz/֨m\kXna8FUkYN`>ٮ^[ :8ǡ4Q\7Vmk.~ժ.pf̍^Q*isj~Oju 0=EoUy_4A}-RWHIr0"EU+R; Sɟ-"Ǿ7Wriz}ٺ8%`1<\ī=>L_C)j[J1Ɍ998º9s+WJ N${֭2Yc Tw5u+6r{T0̺my^(@tI5v+8Om?] vCj="{[5`䏽6( YIl9_Jk:)?2qv>գT+s5U-@M ㌯FU!s+zCV'W?u+B((miJMïX 7ixǸ} b]dr֓c:~u_Gy ;CQ;vV{s+y<7V'H4-ؽՙUi u9Ov4QEQE*xn?-u{gYlIV{t}7 <>[|G0J .]*Ey?}DSH Gggk M Ջ_.Y.Lwؼ/ĘHOv$&œϰ+"чosְ4 K -<0s{RU`ea v~++~v=2*~Xk>¯l̷`pO^—R$_F*_F5#P1Q% 3-۷rC9h2xGc4hx6LA@. b Qi1X)>%D~?ұSQ\$eB9U%a6÷wcHmq&]/aZ[8˰ fb?)U#?h?Op?+Ry$UxjFI]ń'<&;¶7-$I Oe%%eVjif 1+B*:]6_6#FʭvunўTеtmHDX_Ld6܌2 eDOhS6 q>דh?4[")O呄'IxS]7>3iZ{Z\Y]C+6V^5 9D]TKB7AxBy,wNzWwEQEQEQEG<\́qS޼~/rszH/Bu?X6ouin[r>ZQEEsH>NrKnw꾥&a%qQyk%7tY)t돗s{0*2x?ҵ|?y"N^?ݷjU[|bW)DJ|8Ϣ² f=ի[qs˷5=gk0}9[ vGS]q¨ɮnn9M_*;b[g榢v {SZ.4M^\-I@5< ǟJĸO.gҳ/umX#YUȝ0Gm@=IT5kgfv_iBH?y0rMBKk\*߇,P;stQEJj鋷O֮QQsgY((֚1i#ڳ,s(&+iiu]ǽRZM~kn px5]?Ym2HFUiE=i`Sw%2YۄV=ֻ_EہԔ#4-">5r=nAVO'᚟QExSHoѝ'^u/];Ry.\^0݃z {F7lsocu=,.vlp-^ŧKZJ˹><X~K4Ee';4XD'qžw|ރ\U71ŋ{'+2=5k?!4nZvOۖݓQ\֗Y>aN|GoOo( p? eӿ_Kc߱Toy*??ʏ?G.KAvF5 ]J駺_g{}*@V騋*"U QEQEQEQP{lh`^1&WfKr~?Lt#TM,F;w袊+ԓz'Wk/RҖfGf%j\>VhVn#>*,SC6JHcg&k-Z{ O/[5Tw+k v#ֹ6Wܮ}¶,nr7=W'.a8n?ֺ`:u\60ysU,~cSE^~%T%5acN\ }*{kP͗^6 "3.2AMZ/lAcSYi]$)~պDP:N(m_s:ɑbO?AJ><-7If#oʩ v%[VPН z:'E%f͂%GWD0D}:~z%p,ФQ/DAREQEQEV48T^_]xcCײ_sZY¸Q'RK1Oj5;uknH{SVͅX QG\5ց$MHr;gUcfo.#ՀQZ1Mɺ7 =Rkf"$1\QTfO"S]?LC /|GuDLwGaO}55ok83e6zv`3+B6\[ݙv1d׎9D ҄+ dzfA",!EɨnɲZhq5=c]۵܍pJӯ1pEQPKZM/VVyJ::]o< %'-HU,9$-G\%d 1p7WΤ8'YW:R!ojl"|r-X^LR!.z8*V% ~GSEuWu"XjˤNf >`p* yr4QE`:Y_($FyD(!Ƥ.(zȗOHP? Ԣ=p*γEhQEC-ݼg0ɮ&B}?lc#-JK?'5n. cѥ5;x 5 NNO4}NY#iv݆ R;gkz<%gJ7b+ˡ4Di]Q3Z[xE`IO)xm.9\`Zdž)>h(5]G}TPyȦ `_R f>gCg!}Bf/۷ș~犹c *OfSV9cfk6[0y`!A?Z&Xn8m~^8?'<)ɭ ; 6~"J>XQ_0jm~Ua@׎VܶGzEMƉ(q5e4vrG+"E(e2 ֗v?*>mk<6?*>k<6?*>k<6?* hB=Fh UTKox(DA`1?Lp*_<ey>}+.8@U:)fi ch?hkuR̊$VT;lKo5keKxG,{}Movo<cB!G琣vQ;*zFэOr:[?֟?Ht#L:>mP5uZZ\-;0K۽(q7GJ4YnH]7|gsҽ^xG72^MQi&#zN=k#rKq&sy)p~=QEW7i h`_GI]M@|(jkzzQ W*xw/WihdvpG2>9vjТ((((Ț{s ¸mKM΢dnOnK F~ҧ+;X'?T%mW?y>SUt_,c?!^I^eUic?Vk-Vdt$]֫pl5^]ZG5T$Xp+no>Nr4PFAVe$#W|M]>ݪƟQET8EZUP=-U9>indxC5 'lc5Wjw?֥iCȵZ:~\ykEQEjwhuY&)n?քzlj8>5xۅ `zoz"t;|0K-$ln:2[g[*^QqxLՂpҊ((*lij/O&wkZ+H(W ?3jZ(k_Y3s[86v5j 4aq%Xq?eܛfBy؊dW%Ҡ0G' θn/j/r:&mwG}=.]iosSUnڋ mSC>8AͶy9v?^+ 8>G{x9%s؎ ֗+q}nA2 ȽoJ(zM[ #WEةhG-]B;Apq #*֭)y_SRv]K#sNzaXrKu]q);(>lV5w)U˷tۘ?(@t+/[0Z#?ݭl\`reZ}!4C0vTn?褛 EyƓ388pQEgmG̣\|Ga]9øugi+g{J $fk̺?j7:nqn@AzZyCKmD$g׷X>%n.ے`'EQETOo ~$cTT 7"2X-4PMdzBmOQkxgi.< &2Zݷ;=rpid)nFdVS×q]3w^}>O"IJi ;=-.V˃'ʹh {VM\f{Vr,XdN͏2սϳOiQEQQ:[dG\뼺f%aSE G@)W!?ڼI9Toh(Ɂ<d`Sk8uk+?|ҩlX[m15-QEU (A$#@7K"uЖCIڭ@dΣk:u M~]I*S!򣌟7'-$OA8EQEr>=m,,OO**Z(xO=Z4W+ ,K_0EbLRsثfZja'cɴdDjѷn1U{6׍ }8 آĽ.T8?:DmۿU>f1_bi1珠QEJRQEC4r׹,F&79MZq21{w6N%B=ڶ41KQEQEQծ~`O"?j+6u>qv(뼜>=}4h5=o,$nJ|= &XމCN鑎<+,_2TXڏ/5p~X_W frxA[k,d}2?jcOf1;*rK,Է<"!v~.u@`c' {w>4)q *G"i:pf>%ތ:!\֣^{V[V:ןvtpy+mH݇#nD&Y*}))n>BjIC:cpw 3[J G Ųξ: ?0;Z  ~V[EߩOǚNXfu1 qyfʆ,sgy5r̽W#dһ+;tÑ{",0N֗-m)I(/qkQI2H 9ݼVMdw9 3'm6 Vֽue֌C߶}}ꏕu~eò'lj cP=OsRQE { ΪJkմMl"ʠG׭Uc5hѫž]I1t9t_i?ui:3+ӉmEY%DX6"5 X$Ưkѣ6^Hy)"\U? }K#¾0Zzléܼ?D~$aށ@}[ڏZpzçW42ʤtPд5Lګ`OҺHq 1=@U%QEQ\Ƥg㓳_Ssi<?{F.naoEQEQEJl|?z}k_5$~URH>^yL1:WXGvoG)^>S"{y8=EcOksFOBFF= tMwYdrta}A6~b:*=zѼ c*zЃ] nm/_}F).mvRGe9 4S\>Tt-C=~%6 IT-Co^:(d4(vynXWWb@0:F`Xɮ/N&}B'5EVUۛq4Aqz8]եs\Σ'lzz}oo J` ((?Ӱ̲oRoK?8,ǟUJ)|oCVt@ͬ&Sv_ fo\G ]&vךf?fOOCzQEW%#Z`b(ypp{<9OzmgQێEc?zUQEQEQEQExpG˹@OKqki":d:C*b:W ׇ5I=>kxbFr(LrtQJ7FdSDH2X{jimƨڻBOiǧb+)RKYU+Ro>~֦uA+LFá=nc-vzuH(1z5>U [H#(*)b]Ҹ_A1_K1[ڣaxQܓnis(r0r6+@'v';)cަ/Ag1'9;x\-mba"@=h]JR0A fEW'=[|eϯgA墫^Xͺьq?h[Cj_8.'=u>qjKG$zz-GirMå_WWP -g3 Mf_8bE`NTYz5+s4`ڒcG}XV4vFV=&-eRM ²{z]ڈO1BTTI,Sr1ڮN'-iUF Z|TW|XcެS:JY2Z*NAKLA? hrrΔۣ$NfV({ )zwB*j*9Yhۣʏ ^/a7?*ꨪA*?QW۱snzE#0U,:\m}USZ4%!e,o/*?5)w!c /n'Ab+u>Yy?{}*QE=D.̲ oG-?AuTUMSA?7Ǥ!\xŲ=1jxSIK)+]T$3׫i>Ϯ9;$ԇN_+Y֓ExO׭i:sqh_`M&ȍFq) k&\E~q,jT `skK*s]R GqQǤͿrZ'+Z((D@e23ZINSXΣH,J&#c*袊(({/37OGS// 1nϩkt&:(qSl??RnV!9#|}hUh~U$:+k!Yl;5,G2l/{2KہNR'G\jىt794Z]:f֥On w=qmo2$0d<+Nmm 69kA]\e04)HF $;us.sǕO]$00OW ܮϊ4ūH+B* gȿu~p&K;s#s#p\Wfʎv:,øjQEQES&O2OPES@8sM=,rx;K[u"B{Ԥe Xd+HsN:VkG8?^؛A4C|;54D홡sԯc?uEQEp/>g,cjEznj|E`1oOzmVv˶(z՚((((B@:CxK3Gp(cHVhGO5;n|?~b7N9G޺fK*J*h1+I3x-a?nkT\d7:p57 ~Ƶ-.&H4R knxr?=:=tLSaj* -"u5rE3# ȵqy%'5~(uLR'-S`fKy"¨ E)$U-:[:c ߎ$0UEQE2Y7Wޱf1ڡU ]xy?[պ&xA}S?H죩>?#|0#]4;NHܒ$p2ߒy(*9#z n9qg(te;L#y՜\؎7?~56n'I=?EUO3Lv>3x+S:}QG kj>*9V(ɮ:G]Y"BU0KExĐV.?\cuz;%zcJؠ=H}]*͔@7xuy62Zeȵ xt6a ḠzV+4vtqOkۛ*¹-~ ./K+F۰#kXn.=om䝼N3=(gi )؇rbUyҨ-<_IQ|ʩHs. *`)j9!Wp޵JFe~BJy[TVfAxLrb_ XD.lǤͿrZ حj(("t? OYley)*˺ƌp2O_èo5{2~f(((׷kk4­gJInW>zWmbH뉤g|O(`m5ϢZڞ>Il$oZXřYGҳ,on|?ml,pه{msݺO FTE:=eOK -\_ḂeGb2s Sѫh&'#>$apECFOn`UtT;WӇ?vMƝn u%2?J˻{PujQr3Uļ~'q`A{RX>)eqgb!תV&0Bjj(7B%?(jrB,9ǧPfN}jߴOH"r}vQEQEf]j%oOqֲ- K3q>Xij'QU-ySY^];~a^_Ǩ٤O 5?|@9 =?DD$6 )EW7'ea(/^!6dZ6ng+T/iGDẉ퓀ҟw+((((|Ez,9KnbX|֝QY:j@W%Ή|`1BqC4k"t\c=?Zq:[d~^妑s)Z%=srm.'O E 󩤎m6mџ^֝\ǹ=qPݩTx*؆A4K )@ϕk*q~uqp`oXuS'SQEPNk6 }* V܊D?/"zVf]r&=B` ((v 5w˹n# {.d*nj¸E߹:vՎǥO\}I3#?xJ<}\I7 ׮I#t`A<9)I&scEQEZ/.v'϶wHl8=Jܴiaf^tK3z=Or˹@V83+ZeE5]#f682EAG5$iAD`|zbE 'u5jע%=WKhV(~-oWKVT[ifJ3{zg;œ#>UQBQKEQERtg=ߥr'N`W4ּ5S-2.y>66S.N՛ z*qi졆=괖`ҪM *g߿U#9Hde)*æ~ZO-0Rx5E)*?`}ddB2 bm'~˷8}`th8v~VhKFa÷g|3+~]md=CT-n\ H%6s5-3( /[HeM>J%]F9~nc&܄jنxOqoQEQUo.ź^eo==[p,rOA}tm14.U3#c>P]g fR}aKiys4˷6 v^?SV|1oƸcsJ+q8uk,q2^:z 7^! Nk`v5=UԣIteXb|-~ַ,EzFzMC=}zΰdѵEV܀Nu+[;ȋ#so^Γ/ҷ((*+Yc@5>z6Myppb13QjUbAZآ((KXK'V]1Gnh:s^\1=WW\WR h?oW'ۯLGSD{WIy V0k'JЯLR1{{ Bqý>{Xn$^:Tmū-?P N2 PAsjًscRgxpЊaM H?fHPI8KǼȃ;?&8ٴ7##YۿX}8L s>] ?Ξ5;BOOoSW y}/n}ELI3 LV!#2#㢙e %S +7ngnw6Vgj/^}MX(*9;Țk!N؇ST(Vm n֫bX] tdt(sMͯn}w >פV:mچ$+5ԴE 7Sx3V2tI@Q?Jh+Ϧo?/ EeZ%?,HùK4 s!Z-?vJ(((((+ijCYSc}+MT*Q(Oh1jʃ\7f PzkD0"YD6pOu\-zS-a20>v5?:\ oM>1ObʮX5=S{ w2t|rMLAhZVm ҹy[U ܅ȕEU{'V:3HkBaPqSnn`NPI=koCHݦpڷh(f RMeQEooSY.|U{g;Um|v=jZ:VM}RiS)޻ G_h8P T-y$菆?((+|~T徝Ƒ3GW-( ,՚OAzV]yLmZ hxuTHy5|,f<]G3Q1]W7 T c|w>Lp`+rV $:X V?\.BudAV- X(iø}>K[uc^ܓjj()K(^Yuf8>1Zq'Gֵܪb]>k'yYCD0~ WQ@Z,F=_QFf[5\@ qP_s9^O:s!9QH@a^K5nP9q"g|G8;՛k\/8Va'S g9hHʑ ݼț)x5ne-Rm_0wO˲w#wP'7N~Ο$*֚+WEeOON"IWk/EMj*)f Ԛ˹VsJK#. "aZ1};:\q>kk GkvOl]-XXz+Q?0(-t#}ժ@ RU?{~m)%.Hc#ڽ}Ec_摾cfu\ VxOuWo\EQ5x|܏IQEWOkڋ=}'PeݕW};֧"1Ȃ9_zߢj.cэx?\e'oD>Bz}GWSUj>NKe Q xX`tGJL?>5K7?:0AE-QEW)\.>#JZGuǩ'~q/E ?O(( EQV3͕?A=B8W#mLwj졅-H\"RW#qϯ+AշכyOZz[n(qw2u՟"^rjZzH8:&.tm2m=?ݣFt"E^wídasg?QXq ~q=gú΍m! -\{~Gs֧ۭ`r7MEQErE޹#TUf)fRQʲno!\89 (c;@GJP-aomxy-|2?3]" Pf(w~Q&k*M ^8%Mk%mQsQj c'gQEdiȇmQCmprX?]Npq"?rizZ@޿C>^Ge_u#b(:>we7dܐUREz J>Y?zĈȧW?Ya1+7?ZM7V֤]ʞsܱJ?N!ҵzQEgڧOzֽosPw/yl-oI`$V߳)aSQEP@#WOXvk0bCЏFD:Ϻ`Aj>aa[>ƫ7n ү[0;_5WP&[^xIT(P\#"1Gtdҧ_$l20j~t-9Fϭl<߿,`*tH@jɎ'ծ.j/n}r6:u|iX]#M]:)n\{Vj/>8@ϢZ/d7xZVD/"ܦ&U4希ȣ 9㷽G돦;|zpj #-QU.t.;vV6*N~^QbῈonQEQQII'TM! +F˿Cq==Cs}sPFT$ n*ǴL6+28H-cW0E8O4L"R*T?yՄoT _pr{*-͜O-?,cz׆00?IQΞdEuR(ucxS70~>Wڪ\LD~:w7PC$Wlv=t j2iM[ 黱G)c לw/}|䀃'?] p6佺MN˻0l&u>"д\4Lj֢((((a|a!@*1C 4QEQEs>%^0)AMͦos=G֩{@S'SoawVEY 3*!٤cGtVN-TvU SyN$m'yOO5RpuGC*\t<ֈ9TRΑy>L.NI43bXq6KI]Q$1pAxrcO|֜I%_A}UVD_԰E~wjEQXׅH)ǯNFk\ >m,(RH犳ECuk$}OǙhʜQEU=CP, =2s},]k[RX`~3B֚9Ƕr+CH̳y*`s]Q=EbxzѾ/Lf!·9U"'{V6g ;°.0! ܎U5])=>(p=tVmP4?\򶯩;ƵE^sq:'<í`^x$%-!.ݙV-|?$h?j+m"K{+TeUG(&K}>xaW,.[疉?Lq^gu!kֵ@ ~UL{w3WOMEQEEr$ t_CX0khV& r2=EVĐPd\zUY 9e9h^yҡ 2qZHUޢ׶8oUn3'sxwoj@E[>UpOj SG>)V?3hQEb11?Lm9;6U*+{rzj;3 ԯMP`6ƾ^G&p3#޲Wcmk<'^~E/+|տºz*/@<]@J*m\\6pW1iu_2\e䎈=Wiki$Eq- i~gE?q4Xktv/C.wDUlnOkI6pGפ++u!A~8%B} x[+dZ訢 >TZټI@NV`aGFٶ-QEs~2>NAQ=+#KtG2?(($ vV[xA}y:=sfW=ϭtQ\x&^m5}!ZX|W(Bop G u<ucjhq0GC֩;W7 *袊o~K Xf<*hڙmӪ?ơa  7qMvZ+;[wrJӓeKHpz̸{`i>ja9nzթ[{vc电ŏO+l HaW)mOUiᵉw0*{yƆKnʃ qK%H2} Ē+jG4  a5h[+X[vd} WOIc?(S6k+6ӯ 51en3V 's]싒{IN9><ϗБVa`]͌YZ(vxleܜH~]Uy\W'fgzgOv$jr2)QE5IWke#5B])~3Ȣ=KQӰ'RQZݥoֈ {}>4mGW}?/S`4y jQEQEuy-{Xy |KEQETHAU?*%y۹e`P)-vf<ִ vj =/f }Fjuky'#m-,O]m׉aEXMfݾaP>VFv*s^C4ɡKZ)U d*Yt˦± vokޤcM&pIPOo=kKEokk+IП:+;]=ckӴۗҭ.0-QEQEQEQEVvx,\;?l5RѮ|6#Z(@iX׬1iyjzqL:P\u-+!t^yx-B٦z`Ӱ%͝y>eqiGdk"яoc>Z-uRl=?zp]n:U`?{HuQ1^9䃚M!QGԩ@y隅/W)횴1\}IXK 0UnuYnϗm_c֝o[ʅ,y' ^լ1.>sEtSZinەOQTrR!*6>Qwc֩I:Ʋ8>Z-ճps哆zn Vi#'0O@:duڷM, >k6RVwݹHu@Ӡ 08*/̼+NVlFP?j$g;-qTKewVP }QEQY~"}?A*@4++ͩȆMnH#8jgY!B0ZJ.6p˺CW+]ri%vbʰȨ&A6nQ{o#GjZu?NIM?-=MIYӣZ\ P|DN~VfmB[QZ:e&BmQӭ.]z ]1OT]QH.^1GO\SU\u_WI}kn)Uʟ£.S1W4+q1Vfk=ݢoMn{S;\5K*CU+kyuK1/?ƺ(HG@*~llIC>HVu'd|z'qwq;o(3CK_jEɿIUhףSב:V=P\Eea^iiv,p0*z(+ $Īw/RIG=/R7N5Ecjm:)WiɫR,eeQ}hN߆^FQZQEQTm%UKN9̑/V榺׉#lDmd?1[z4NkZ(+6oa{Ε-!9>3ܭ-ߎҺ>,-nަQEZ7AvuK 5\u!}9(Nz /\:etApޥ+VOOhz}·<7l#v}[Q bC#^ZZ>l2nGQ?JԱ GiަFaѽ}e^e!BbsE\Je8>а׫qO(⹭^e}eC$d˟lQ1{тj{Zt{Q܋KbG<(K`f?vmn/nQE#0U,;θi[ʀ{?M!3{Ȝ|ٹ'EQEU_+uJӵ26*b3Q5%*&?wz}5eG"/THܭOCZ][Ud,UL?Lr/Z0޷p 7O?WXՎ5;K}:z"Ko˥]'t h7Zƥ!Kkuv;xo>EX-;vݑƮN9Hp1땻l $-.O95ү%gq6~}$ 11]QE"(umun qΥb?ao!ѳQ/[ψ/*6Fj~26/gVrGM[`>[bO#xZ› ?whSM>,X#Zi6vŇE:vB&R8@0OZ]HU@/u$ !Ji25'~vH4i[>ҍLxq^4Es)`Rp;rZɂI|Bj?GT%:u_}y*A]8 k=`Ͷ=8MiU\ȧMNI }EsvM>`:zӴ}atq2oQQ>֗&mR\In\Y,d};VݢλC!v&3ϥ$qsz a2𱎽MY &I ?h.DP#5iv1(yW"H&F g{TD_?GOU[߲[ţ1hfǛol3b“8b0!E,,* KI+?3Gح74}yƏ[?x[{xN{k#b|ώI]O= י[9 ?cN8~I7֤>iǸaE,?G"_׾21eHU7[{qGULu>>BoS[Pg弐t/X&>)5otL}տD?!Tz_/'"-?E߿7)?PO%%7UNOX^M!?K"orxeӮ{w)+?>6.\u68IƱ 7~"18cxǍǞgS)VYˬrp8qmqe,._,g<ӌS~<;lOO_Rç\]{* ւekZ((] rzsYk?88QpsֹXV0!z,t!Ѿ$qRMG_3§d6I@ri.{vOB8 Ⱜ[M񻱭eea`GYG'+ҳk!Els9 Z,k,e*c hQYe}HQmGP2+>^}ZdE?J-Dq>!p~bwf<Hp)ҫbI*rc/s?n}+ihITWd)Ź?J>`EX/NG[yl~tW30 W$k֤1K\/a(qS뜷Er胩+Eg[[HvOLD2|G'^(7FW XZmm c (.gW7/<'3 Vq:'V?L 8֝#(u*# \)-o*)uzCHw+6A}WqcG,k" uQES&`I[?A\PMǦz|zdsL-'9'z֜:а3R0ֵ\wOQEFT>{(trǞֳ^I_V""\(Zk..[>bG%((O2_Q?Iu'B+3\IG5-H?ˊHʬ0+a_)AqX:|W1]=7=c4E|\3 OMג\((93\7qdopO ƞ>Od:Z4afk#[¿v(E<*4 /+R;O yOy';Iֶ(( $NJ!`V9p,W!ԓDS }=*9R1,]K>n\ӡǯYvir>%Ntjc =2Rejs%̥lB:ԲZ(>*8a}ƤI*boQ/)lc^fHFH9zmNk2IUTʌZDxq+}=J*vEXU 0)0תW,.0I;8#O*^F6s][\pCpz.+>[HD!9QK1G$5TʤF~=].ݣn@[jbQVJ%*=jx/W74|3Glz :ՏQER7?J4o#O(>2^qֲtłI?]Kj VuCz隟q>Ǩ:Z݌2} VJ}۹B{7z]s=zit;Uᗐ+f(+ķ>F+:Ԟ>FL*U3ˢH]CB*htPt)c/xK~umN_r*ൌoԚ6Ieʆ[SLBp2jd^\/=1(q(L"~KODZ٢(h>eV}y:{U ~sڳS$xunKGu<]>b)H ?(7b;*ۂQ4) !RTV^E>u[|m3{CU|B [Gbx~u_Id, AM>]=?fOrL"`/U;m9*do/U?rڻEPF*ŕO}*@798=Q;JT99v`Uj((_<]@z(hgMcC?Ztt *X u3xZC1=Jöt nmտz q={sva~1yA¶:f:-$m??zLze~è|P4.>V]>jU-kWPٿBWtqe5r;y@(((O^y~iOU4YF|noTQEQYz֨U!=k$eqQASkȅeOQ\NyZ-67>gqvb?:>gn TP:tVMa,+w@b}ZتVld>rTwOԣO&p7 פއ֮vBan>ZQ]4{1k:f7ȿ0Ҡm<ߟʣh#p(ogSz'CϥRJtҮ1 g$= yRy&&H,yk˧3EnSL%p}+:H lAIj+ )~`FAȥC';HSb* +M PnmkFZ3 OGJ;C#ѳ}j2(߿KO4r>sQx^3J1NF=?̚Ӽ$@o hw51C7=PA+(%QEQ^{ȩqwjZ((oɶ)OeZXMnngOAYzs1aS׳VtFy<3y03ge1fYA޹s.rxD gn|*տmdA)ik6o*qD6?gdUG. vF-ջ(()o㓱?mEPL;pEIxHX<+׭Ju_Q%l.zԞ(O7ob?Z]f %5CP`Hڶ *su5bPd+:RK{WWrO8>cKkHKp)or1=cxKh$+lh}:gN^6E ?a]m 'UVKU{7UcP>WR/u"j.AQ9_ӥJo&p;`7OŨ ]R`2Ȅj۔eZIcf9Ǫ袊(>O?1Fy/ZQEQUܷE_S\ ̺A-mn^OV>(uUFve@cO#sJ}뷦k7Qz1δ9xَ6r\1x 2#lZOP ]0Z?Gino56|~CSEJcBpdGԮȉzOM=[ D0;RYIt};OOm*(U(-ssx]_UTPTtR W_/|JVMSWC47,dI {k|'ls'VwbpXWMiv AJU&!RdoEϚyrؾMA8jF%AKyHiD죮?]$v)W>1d3?Vs, GW#ăZآ]>tH:ޛq ăOcVu]:=Np7uB{3 +!sUCcޭG/TQEQ\[|B:ZEW y =J:XZmr¡uYꦒKj<90؎]REʟCOk' >(+?cI(O]]Uc,&wdibb*$?Zei&rgoOa[r[́Z%`Gsb;)p>jM&r%q#k]}ix(5n(] ;9'8ʏym4&LʤMksdQ?ֶh(+(nY;IAkR*ݷ|î;).-VSiZzFe:QZU eޯv"Viu'گ ! zڷto7/ 0OXU `NK &?_Ȩd_\}bAǧX,|Foʻ ,0qGZΒԗ/TgR5kCUl*q$K9QK1PymPB aG=ϭKEQEQEVv*_[j,ʧo *6 M!< ZRQ~f6)[ S[~lOwxIq÷J@` EVPfu%?.xU'[9?F6vz~X#ΟU]Q.b$#MnŮ,v05.Xs!+R(d146FIZ$.jHQX x0c}[(l$0z(-{YW֍l[#gTle9Cw"/ U=mZA)cS`ʅSjNZWAPpɪip൴?>j4[nN2W!"U(J騨7JGa-έ=Ә:'2 8᷷{0vs x˞̶-gކ>uKvZS]5,GsT$VP*ͮ7v'rճ1#@ڟEQd̀z7?ݿ¹jYɢesYe} 7cp0%׮*c iU}fI[q[t7<V^[58 എ?Xܘ,) wl)x_t?UMgΘEN,oV}}HH{VN[\/4 ymsi4Gi5[̞ݶʥS2J>Sϧz+NwZw _WX$‚}/d;rOjF40Y0T%ֲq$ſT2}܈GC9&iX~PGOj2e~ |ܯSº([6Gn c׮_o*yIס-Ilw%qǭljtZ-U[OZn.{ː>h"57eak|3sJYgudN3E06^>V~[}Uo&v08ߎ3;V`H KEQEQLxbHC5ZM.N(??W}/g<} Ȯ[h` I'y0˫DYcoN=Q6nT- 1S?.$W4gQG*\J6CzSͻjBfO2> u"c wm~Z)D!yF Mgqc@o9*Wi?DPXw [eNSV*hF[?xv>6c+8|~Bdn\G1-iI( }VᦕEQEʃxV?øEQPǜͿyޣh$%@\*\,Rc[ƚֳ7Dk[:V{Y8`N>mEx䷵^Kwַŭ0 |ǯ֧K^4v@JH$8GN=嗈BO. 1 = SjB(tVm>) I>LSk45FQF20jƓm1܀WK9;e%\~]j˨@R]$"i{ 崸k9>4xĴG6P?p/~\ETsΐF]z?//!>X}\( P@ 2 d;Un(o,SvVtR˥ܭ͹>^pA}}p]izV4C_[gT#[ɤ$)cW%sTP'N>5̜et3t]BG) "қs}%Aj|IӤ+䞃֨u2=)OQn9Nߺކ($sU&b}ץR}bi[mQ]!U=fWiAWUʼ. 1ZQ֪1s~]}QEgjVb,O=rc `?ϊoCB6kՁ:i1TŁ.޸߇zV߇u4Ę*__ZkK7`\8W>Jɳy)[08mof7#*GzMB;dQTQEQER;*#;*\7-9S֭J*'N^cTUwҭ[2UcPw.?m(?\`7Vi@$G>VI1=9=v_֬%G׏S4QEQYz+hN 4V]U<}=FmUqްh1B1Ì֖ĄOҒ'bsQé'µbk]5>aSU渼Qתnqz7F)w(>2R8xvʳX)$GGls$5"q#2[gMLğv4AOn%ǥV07UmZɴ'޶9a-L=DckӭfFV(OTɂC# igbYyKW+YІu;N?ƦIo5dIFFsv HȹnzQT峀9{{?mnϧ;DeV5R{%SQYjD4d_ͮWsxOJEQGJ6Gj+' g_.>xڣM0!O}A= RKkETY2gzlf,'< +{*ˇdNnb҈OƝ/ptaޣWmoCD/ku֧jW?ewSʟSV9i "kw&}),~X.zxop*]/FqVeXciE`w%?V Asl\tjϸip0d?jpU3ZS%oa]!B-A?E WEeNj91ŻzʻuSAn#U=SLhTTml"6u=* W`CSIYQAV5yEy׸Xu 1F`օ [?jCCiY%p_ҫgoǯjn>^  gWEiHk9*P{i#UQ]V A5RKɒpk=G,n#c1Va>`; aɇ-OΛX?~})em#{:_kX*|Okw)NZ[Y&h1hOS^OK$Z\s\kvPdzWcaTRE#Df=rX-sq!J(<mKS/t?Ұ|C R|΋PrRprz rZ{g?_CV{k3Rx=jkխ(K*Cw8fi5 bDc B-^>ER*co=YBRN~xÖ>7G0޽=DZ+uʞ>#k(ꇟjXTly:L~=L9dg̟#? D5n^]*"&hd<}TZӮhW׭*{`r砦Y=ӓZ##iJ OJi8p];g+NKMy5=IRW-!dqUyrv÷ ~=(eq6>q[H !hWR4v*EQEMRNmERٮ]xWeEQA=+0& [~3 im']outX VJ$D6E 9F,lꇡ}kU(e woֺYaܨ&Q-5-G·?`b3YE1U6i[( `{cTgȿF}EkG"J`ziQEQEe_g(' :&s?[(:6ŷq\tI&vdrBkaQUGi]>l$SJ}FxԯbY>¥Mq ŏpjjՙ~*tHΪQܚɻYʵGS 6\oXZy:[@M"2pkem\a6եzV"3͑t'[Um75dqT_ƱĊ焈g梊k)]Ew-Wr6M1 uP!m^ ZךX>*)QERz IEOY0۶P/vGez- u@(B.x%l? )~-V˙:Țp.N_sLdzZCxwXi &6gqqҺ{;ǷҭQQ\[Cud׷ҹkNvՋc<{Oz+OkNSeo.G|sZH"F'V5#?*]FkGoڽU'_w+Zxűo14vTz XW-}p 1FFGECqn ;W5-\a#V۬ףCIqwT?}vۜOҬkF(tW\0U9l9`UK%[ys#=V^Ae^uX68DwýZ(*>T6O8,m'$m%9YZc[f%vr*EBF1ؙ#Pd~"YxpK*–CCenDA'%KO٥>Ԟ p=0pz &]5m 1J^W;Lcv?{dikO+=DMn09;V}8-CqWAgㆍFث ?"[-f V_¯׏knr0ǍbUe *K/00q֜BdQw~ ۘ0{?(5){8Ҥ?gtue(@ sai #zChQET7?soXz_z?xoT3Y1mqĸz]"rimx'=JtKsַ(n֒zFRsvv]5?Q˿vV]EPCI`]zCnoU,ۇ~{ >iڱUމcqq[y.ŗ](*OMپsk%rvhJd@Њ4K&xO"ڝ坤bT- XZF}ͷ*:E֊l,H]id|r#_V4 S˽024BBIeݿ;O֫PYGD0 9?TfE֡E? ?ƻ(fI*=.Covx'T+m0C["|Q ~5.cE3=}XӬIK?rkP^ $CwXVyZճ$iE Ȋ=+̒m{?Ʃ}Tp+=s]\d[tXFz Z((#uն26ԴV~|HfA?һZ(+!_ `WmCtf,'2G}_2`f Q}y^h I`ѺVWPŗUK`S7ek3ʼl.w*?lEϩ$T?Ǹ"u;Ըm :`8}SXNg7S\彉5AQ7h_ H'+RfDi$^;M :wr}6&wF˓>79ԖD:=y`0Jqn 6'n75f["pǭ?N \x'֕QEUKNDK׽ޫj7gbU Y]2{>L_?һȳG'?jѢ(]OS,~lK+Tfz*ά]O|sUy}O;Af(URM5Ϩ'V^;H9c~8.5XWSDQQ֪푕}{BD/sOUUE :KETl?y Tvr2*$h$ARIihkAmSvu3F1w6taYD Tw5w3hOUhF.<5xM}:-Vlc?tVr*QXKp#ހ` r>eSIq-GwoL6&ww758f,Umc?5ưԟ[^,xl*e>yvOETpCqn66\YI$bbn3;ւp%v@Veo7q=Y!9#$V32:zz0{ 󩨢(l6oA$M6EW?v'֬g8.9JdF ySpk$ZsX@daw}*ƭtL1zlvu{@:}NqO~DFW?J{h.Sd$VD?oƒ-G:6Ҹ]Oϩ\I,EXӨkƒ :+B3U$UoT5ZY!}{}*gih&3(u[c*}Tk7ݙs:EyOUWO*Me y yjAbh=,W[̷$Ck>VL~犹[}HH2oǟТ|Mmo؝5WLgC\kԅ7UBekO_'PTx\ vko#;`|[hwdaGңnf{~&0 Q * 49s"Op/ljos2X9Zu:p=j6ԭڮ=ԯ]omd՗k[FάNHejKh'9GKUtsa>[$3 Z*n>.V+H>6qVb@0:(,bXe'YwXгw5,KOOj[=[֦Kʅ[>,A7A0gh\x;Q]%ão pQ~_FTu.'{'8=YIniqִ5Om@p)j'w/Бښt1$~kOg֝e~k8_lim$A9?@ sҡί}4hjXtN'O5ioܟ֬:,05qw7V[Мw5f9RU04((}jm*Msʟjb|a+(fo!%i) }Ii%VUx\`[H;]Iv=uW tmb-fmW|:ֻ:-J+O wSE#Ȍ EqZυgCE.N}{:EW]tY?.x_O?XKɼB~^`=8eRQEI{ڹ*2-d;TNER3*!f ($osxI8jk+Uqf() NYZ,xUhY̸9'up+B3LJAܚCH;sC<]/}3–O[y>zS+GYCc ֭(qõKEѵGBMM&ѿ\PA*ّW 5,ap$&~(Aepf27SҧKCp@k,oc&G ;U[v'>dn}ꥍ߳.:d]G<m#Vv"[qZേgnsU(r-Ee߿]ʢ̢{jư{g0$+qd@r)SdcBpe˱([/g_F5Kg-2FzSĬ/R4QEUk6T}t@+[?KA_0q'ag+K0K!Gյwd-8ʟCW|INHu%벮vhnz~޽ N **(UNGa6׏s›C[7PYa=0GPzu 'KtPʰ39 rO^k_6If"ȩjO^a7ݹAnml?ςQ6؞O5ͮp (>tZ$'~HhEQEcxLAzNvBKxYW"?>Ȧ,7e=Ҧ]f.!+UuY>?縆k)UvxW/hةR3dܕN$^/,nºZ5uAd\)$X}x-"s3}j}Kًە p{RUXde5|J+hSgF `~S'6d.vQEQUX^i$kjZRE7rxrվ㺟pUfܑWjjˉYOqY6_hA<5iE.%&2r_/uqQGz[<6n^jxCd5z90ϧz(DTJI&Ԝ}jC @P}OsRQEE< :` dB\*CwZI.ln-dNh?|cY26>cz;Km0?:]62KLh9giʃ'<~-W{࿯aI>gYCDXX- y'ԃ.]щn[hVC3J#oU)Φ(IJ]CzΟKd;ӡ;'CZGYr0#ڝEQEWʺӐ?ZVS/8Cb(+hfH2aFBCksGgUjnbmNF򿡯Aut4Ԙ恉\Pap}b=q^@&/#OF?Jh5 A SdFk"7YGڇhvdx{:;mBsh\eX5^762bP:#2VIE;;d֝o"1ԔQEs!1n'ӹ:uY9s ((rùn'}񩡷HGǭKEjQ"*o. BWf )w=jdY: C~mi OXw5YF/4OwO !'rΦa QRYïgVw6>՝ ؚӨ/15P\[,랎: ?0;Z  ϕGʧU=pԞD&xB Nyڵ袂@< u2mqdBo׫Y~wQEZ7[Pj--gT)jT+7S/3*_q{)H.TzYꠝљj5<ʵ llc.V~P](wl@HbX=Ć5;U{-D}5bs+`Q$֠;uCG!$=U(Mhy.na:?<'S7)?ğnttQEEs:I3EڡnnQP uI E ^X-/=?ҹ:Ee½n;5 69z7)opaXfwvn*ȏ]O..#{Me*MYX{COأEQY[ɤQ(y y#m4÷ jI1'zc @?U˪[*ƮW' C "1u֭c/}Z- V izu6͟qW`cMҟsVp 5Aդwqm~:ȆyA11[qȓF6 ($( S@!AzZ*9`a~fe۱>ï^K§lxtJT=E-QUIlmQXY}~5EQ\m#W/F8bASG.n~ %֌-}OT6܌2 s>3Ѿf/_ۏğn]sOfnQE趚ſpU#ڸا|y̾u-cNu[a=}5S@p~,9PaGV7i'T9 I+e?qiEcncV qW7ڴVQEU Ic"׵SKy'o2yjڨP)hiIv\ctgXۖ'z*HP :*K{_Vm! cT^ETI7ڽS|->RX hVHβNwEOUaTVsFOj %-U6۾GCt!TS:JY Oȭeu {Zw6:QN~RVFSS]daUö$qzc(5*)"{%x}BOX#<:TvzR7dhQERIbI@1ZKxC1޺MJ".\{Tl?y Tvr2*oa%>xl. ?˩ CU{8-nuK;QԓY>Ucs v睹Mh"*(TP; Z(+׬;A`t ~ֺȯ⹄3CU(=nfx,"!W{Y.ClQ~cǓW&,a^{DP >]Auj[25n<_k}[k(+f_%0G>Z]C**&jnseKs=maHyv55S%fqa\CaxnqOcOS`ʞٰdE ŠuswlܓhQP]Z%aaѽ+PG%>[t>k+&"#'9l{+4TE 0-Eks&jgv%xG&izmlz)cawqk?Xvw]Yz,}uOLREgסЊZFP؊|5Q5+1\Ef{r~G[no7Pˌc뚸^'2yƽ]^\[(yCWh(z!Wh(no;Tʮ0" RMC9;~R-B{n֣n$B>anh<,ԏojĶ}@fe >DrH>t*؊xZ-R]r0+2yE5]KEME3yWMXɩܛtP`ږtT~ui~u罻-aT 㯽ve XXc 8V($M#*I6ܶIu #9UE^gOgW=-!^k;u,P ؂09'hB Ueӭ FQUZH:?,H~ˎQ[i7e~w_aZkm{nQ~Q WCʼn!8"Z|[ezc*Ȼb>OOHG''ҳ2_+#q> S0tyGxf9(28x.q!դXcߍYzGw~*xmG]VŷV::ѸukTWcdv=cq`1 mArчqмIm+>h$QD"CÏOv 9#XܖOM`{viQl)ߟnz*Hn qQ,RvZU T`(!M5׌ca;$_1Ƨ7 Qw?s"VhP7 E۷*$ M Uծ(zRHy 8+D"Q1{tϥeFFoMy:Zν pG$՜sG=?cսjQEZU%-ֳPצuKmYh֦GG}b#s7`H{]ɪSpDv2BRN"Sgօa p۸^_ZXϗ~YǻFY K.(lz Xm#@v=OSQTo5H-APCXךnvcAkz((QjR[L>W{Er:..xv+$O#*I>mGWR~T;}~Wy\|'~\qwy2AɮgXӌwg< \*+ddmKgNRA❠ /^g 9(e,8̎~S \߮Qv#/ΠkFPΚllm*}M<>UҏQo]yž^oq պO$N2 B=BhFT>DZ 韔L?'气g_c浹i"K$ ؿUL69iT& |Y1n?Wz; Bđ'^#ŠݚN[-:P^3"U<Ư- s*@z~ʸ5wIm-!豄2kf(*ZCƳs֫kswCSŪ:sЊ)Nj!3[ҲetXot^?SS˦߃\maW5-ܒ{U)!9`OsP\j*THQi%Xnz2譭$v8I6lP 7=w?t@̠K#5񤋇PЌ}օcuǸk ɶ`m5]=H-Yyv+B~Ly^nTS'"SXE>qFKDǿC}^;}+2_]tA(#Fߥ+1|m}+>| >EUyrῼ+6KK2Z3?1Nlo~fM=SiroOzuvvz{oӭ[%?QExg/ɀ~Sիz=j[T0bk(r5Zc4 qN6gt-P_v9hz)52Ks(cه=+fI&u 1:袊(0k|"K#s)aS}W~T8տu0;D0 oC+jv`\}OY^h|zXջ[خuFVj9KxZYEpskzTHaX"~%QER#BATS]?;smQB uG4[dEEɮ~ĥ LA5?j`]O&y+M7RHඉc8 ^Ymc#.pYzC\1H{]WoVU L"?V-׈Yʳ=2*,nn̻{-\D}ƥ7Jz.5;1ZUh2c?AWh((ijt+'[jφ+.V +c[uܑvh~iN[vzE ÁU˩i,I^):cM~~Ww\oPBvSL62q9UZkO&KF:g=qI-/Gl$CVr ߥ[(l6CU-lyoU- 0f:]";Jop|JC5; fȟMJzuS]k w2IŠ|\05LyQ@ڬhs,09V 2)hf k?L:fqtQeg%*u=熵l:}?Pԭ6G)ժ@Δe5ROpU*[vT}>Ցkz/9Cq>SM5k5:B;ERN#:|kʼCk"n<ES&. O\ʴ((no;LEQX'џRIn!_Or׺v^DD۔qVa496U(c? h ;-c\=~EfjeZ{'#Em`ezVLh!7AN|lJsTGEҏ]6GC:LT-m ~g2>mJPK !c-*I:~"8|+gjR0BW>å_o[c廔uo)?-,Z!vߩ_zOCPcӑXڕ57a +sҲ#T_1dgYV0jU?=_٬vSGuU<G۵!1?I8\~"LU`]Uk{~V0p'?Ɔլx#G uh>ht?emBmJ;WFx''Ջit[UhJp\dYwL.-@rzj׳%S\rsjiQƥ搰8Zr3-㑧 cv;}D#RP85u9Z!rrpI^x>W˴:`jnd]y6C?ƻȦI )C 0zU&-O²n|3d>)[V)qZtw#;VW\fSպ8*"Mm#*8}ޣ>$\ O[/_h,o 1>zRZScchSms0ֺ/6_p~EQEV8ޢ#?,WQކ-!>jl(?κ?.*QHN>D~G󮦪jiO`lu֟{mÕXS-u/wkJ{9#OD&:z{W 2K;<a^:7k8}6;cċE_( [kd\Cv 7zUk-R'x|Y鞿e]3f%֝k|6K{*ImO|)hBH2? ҊxCϡRQToo Nc\Sis³?Fsky8R#W광4ME܁T5Ŭ ~jW΍n}QGHu_l{s55pQFv2Hpk0δ Xjص lb}2t:C.=)ހv̻OV 2{g!'-º-"XXW5h(BKލ}..ml z+wF]ޕ[;d_<ޠ_مfg:l9\ An7~.$i,\Z V^ [ٔ2y_E*Q(>1qiOr(=&p*ӿr(U"\Z@@7cJNӴujU@qZtTKinҷ'?5ͨ\vW=Һz((-٬?<ToYajV&yY9v>Lm$|VNkӿJ(Ͻmgꂓv]0Z!)c&h\ME9`n;O^,t$rI~ޟZ{rԢ3shڅ3A$U"x䚂K.|s{#NjiE$*b{V5ΐw5:̛b#O >k\1do (7wIXvQie2@=x ]4jV{&M\oN*ډmwT: 鱿oqE!dՕsnoAYWHʞӧ+5 vI ~Lg7hQE#0E,z bEXF5%ӿhiSiq&0v~Sy ,r1@o/XWRE=Y=>֤BBI}zn=*H4Ir{jIŚ'FnW$G\󵿙sjpDv2tQ/ɇa;?}j}/ÑۯtnJ٭%*@)l3+޹5H\k,]I* ?Zyo56;"j+qnzQEQEQEQT]:=SOk,aF.W'^8iDd%o\v5\δjբOsJD9¨?UK7?\T sTupyQ˚'s~J+#QKpN{泓ɻVqhA lѶ sh5vL>j?ca)ZD OhQEf_iQScju0$SCxaZq}R#ʻ#⧤f'ڂGܰUcƴbM>֟Yd⺴P:(Tp>uíf\ZMb4o8 FmU9{ RWGuo$ Stj} 7 ǡ~UE·r/o$Ocv]j[B%m/9ʙfQE"2:V*FA闚 ԴFqE?4OQ+muJz{:9g&VM]$C+3\}  W]qA袊(no;CC\(734}*E&\^a _UBBII5Rk":Ak45*(EQERKI5ƼVC&3tz(}cV`c#֨XY73Es:oDz;ZQEf^_o&$ *[+J^*+m!2T~¹{JWn!AsGo18pfuFWSV*95vm(L%`&=OC& FT cIX [Q+H?!WgDOV<(iVds',zg֭`j"^uox5 %ZG@ w02C#[v1=ǥMEQEvg|KQ{Rߔ~bcǸTsƲ?m˜=iٳ S~G֒;;Nl'5(u SwV\~l1WẂS#@yj(*nF@;OV[L%rk/RULosַ#uF2O^Z(~tkJ>rˁWEEsp'V>kB$k,l20k6 $S+}=cZE6NjI1翪_κj[H{=Zn\ۂˁ/qG^~fŸ''ctk(٤~Fw~5$i4m0UA?S.tߥ;^JY?P7i̒(K01O>Փ=$+>KpZ<#v?Yk'VektͩkoDY8Q5gAo{jQEg]^o& XwTBdUrF~폫TQUoc܁QF{o֪ VH\M^hwh\!Z)CVNխ35DX*̌h4Mjaϩ_?M[ȔjJ*ԥD@S9s>,OcǮUeHB ^9p%Q׳}=̺\YX>fR Z*ȇlcnEeu|Cc ւ Uʁ9fV,kPV/`qY,c:}(﹐cvz((((uY5-B}B HqW]V#1a'__ڶbp5Y5)[{ToPݎֳᲶ9#'/v'lj0?n(%ڃ}j-^ʼaW9qewɾ35b;qOQTg B=7Kmo.VP+b gkzEW;[5D?v8bNASV]l?eݧ_=zk܆P))wj1xQU{f~TU*_0u4QXZ k B$jTWbR;y `7v?@U?ݐZ<^;H枚6˛qʟu9x.c>?^IEU9QP^'k *K?zPK\&cI^+dG Wv/]||zW ' ;iWg8ҳ<&?[)![W=|ҹ GXs*V.SgGֺPQA I2_ɀjkh듃!}>f|mj{fk*{$yw$v5r]{g֌r5 ?]dr,r2 :!5kn#{-彪,cSXu} ?I>12|ǯs*1ǓR\GkK!v>M|=OLU&;T*2LNw\9chW5 S~e~aUo6/t8?ZIj8Kqnzz^?t¯BcPڟEQEQEQEQEg7FK/Dž4Eg0jea:c5ȷO6{Ixëm,j+$61XVyK9C#!=l:yV4OҲ홮$|֕N|s[(saNk+lr6?;=,e[G1ܮ:o#k-'tgkzv4zЎDw#)TW0- =zݚ孥DZuJ6잏Zû^|2K^d6+F̾ R$PsdI֕'ʮܴcg $n) rēFQT+[t*LM_tH"C# ӨU>n *r(*#NP!W(]+9{{mN/}?6I3P^en{id~W?((&˙X#:~ֵWTKb8eh'*ҢgszwH̨5qs-D~ڴ--8VS$8WtqYyJ}z üׯOlݏ֟e׮A<[Y[ʉA'袰/k"U8~|RɺWXF?A]eڬC~i {} 6{-|$WMmu BH\2֦ȂHF+2b#&`/!܀yJߑ9)?ʶFAT$K| ٞGZ,<VEQEiKt ת~?ٯ p{ۦIrHQT % Cm0e$%ղ#˞j9;nF{g*1M?" 4^ C2WԬYٸt>]:0]oUMSIP:ü+l܆j_jUg}Eh4s&0zmѮ?~P4#-yvM èVG#4QYWq}Q#ֶxo)~\^Vt.`WKidFek.ˢr&=k+$u} g*"*T&F 2I;FJּۡ+c [P du+&K۞S*\ D3*"\y۟IYqFTn v윓M$Z:η->XX@U1SQEʊYu&KQml,zOEGQnE8 (QEQ_*q yn\UAs*_i2@O·rLW47YK)%3Vg8WC (5ty\ڍĈzuW1\,hnwgg5,i)rv)9sLȷ$pDžt'd*}?]R?1 qIH>HSآHcUCM^굮 CVėW(گZ1B7LCj["#tT*s&c 4ɨrD`?mgeoa0I5b^jJIe\F~M};R}jžPYvzm9t./56zog n~jQEQEQEQEQXb&GFv?6?GDXQ ¼W'|^H%Wnb1c\յ SZ[ bcgAug6ڳd>Ww5NN{pw*RgׄϪO$v MbOs>?"?O_sZqGc//d?Z礊IkOC5v tmPz{ȻX*[v =;ի}A$d[׵]Ee^t^z>/m*M0ԯɬɶ>OAuZGN(9[~|U#oZV5>a}5Z[%vϩjj(iY%v%h6qCz?h>-Zl9}j] M*-P^pv>]QEi;d%_*SGpZh7i+p9SW%E>c9ЂEs|uK_(<tNBQP\i&FLgZ(OƠ`d zuo#*¤UM6DL;zk(KEQEQYZәAk'I0y?y)~GRԒ2򯧹KgwY99U=jQEEƵ? BgO?1ִ"B(YK67"1֝vAJK1}ƵiBTN1KHJF>Y#jb5rw9ȱsG=Ն~yQE2z 浧Yfmoxj͈_I<.{D\}EKYi2s\bkӮM͛D:;uo'Vai{tz_]cKisS.bD\xHb[%]qٿi1#OUCֵhM* u;N wy';Ip&֟Pmܙ#TIcn#^XjAsw=u5rsc\L)V鞭EVED4Eys䒷!rP56шQG`*FUu*{Ϟ $۽ESauZȢ$s+-]Bm1=h[>-QYG}/?Ʀ(n|'sTZzSnFt |<0#Z!{[v5Z\ݲLr=qSQX7vb*!S=Pr|u>$l5~9\CI1T0S#8BZpoOȧf߸kӅzqănz#b@0H.`ީ5 !,ri $F{U&j -iZ<8V?"oylgVM@ *Ο($Gt{WKia#P8U;Z_{_YKDRý<\ ѵKXB(}MOES%8St{MƩ,bR=_gO49nvȮqm1)h((((uk{ 9O7U''ګx_Tӭmy>U `c>۵oǪxTb}LzWgJM/Rm&ei%m3=r |QtD/m2V ׵y޿j zm2bāc;gRi ^z[fXO W'KI 3v`%X# Gb*Qx_+kpFH\ 2=Ͻkem؏RG$Ձ{nzJ?E<\T?/'O:kijEUarBQEQE5eu `{\nz/.4˷)m:vc<5i. *eձm) 0dn5}=E|谗}=vc/uʪv7T>ӂ KEQ\#M[-xoJ4A\8V85X%sZ4QEQP^ǜӿ?t?Uʎy˷=MAch璘00:QEr5??ۤj14 BK+DHS$ZEQEQEqkb59>5T ,#ZP9PZQE\=:mfH/^CϚOsv5^5톟$NI>FMn;r Hߕ:=R`r_OZm|=eofoWS-^H` eqceq9XGN8Em[Ek% ;KEQT؞Xz;[x EobF,Lp"m߁֝-]\-{{zVQXfkLG/]:ܶ}QVxG#-I͍#e'l)*r<XWviq31z֥ظL1ǭZ3ۼJ⴬oOOZEQEUKc|Zmnҧ6*LYǵo"Jу+ )QE!z.m/m?QG3 ymhTnHo,HeVBÜ:_X6;q rmndF*MA?#REwFB?Z־)pViWȪ*D1˖P$F4h.m۲=GzЇTO-nVe zUu4ߧ=?ei0b?QT o6?5]#zR.;WC۴2A߷j4ȵ]< ]s q9F,lꇡ}kU(e w?^y~iOUtYF|nocnٝtk0Zdde檱nVl83׮X*w?g!+9\ZA%eUQj ^J矨5bT+,7t+N*| +=Ͳ2~jwbc? MM?!׭8HP" O(w1U(U!x̘i" }jgI; uD4mʰᬯccݿ?𮎊&y?Wъ$KeQk*+y.g*:*K?혥,G#R[^:|{BOߥhQU'-<-\kii%Xa~sM-俼27s5Cv¢^Ke=7j7y`w~]Rߺٞe\DV]s霟fB "G!>ՇsJ2 w=GtF\?swZZ)PqzƱe5 LJD{_Ͻ> .$!c+? UypcN¾d[r(Yzpb÷oP^?p̪{wUHWj( sZvqm?Y((oII#n=}=QOj'n1fkjԣYsb_)W~C+ :KEUR>eyQ0 d>wZ֠qikOtBzU)yqOUy?Ȫ(|G ) W1׵R;}:QylP>V+ ca]/eb:z}=15>&{+GxRr>`ϧV&~յ'%%C-&91=g5z߄tJGY =dynnq#vdmѡ_lMOCX(F,JrW#U"R5Dd:. rg+)ˀYA K6Iq| n\vA  m ~$Ƒ_Wc3=]1$Q"{S袊(^ĹۓN_κps,;HkЭ/A!DRQSSWUoY?ѮYlOO4k_+y J{Q]R:JANY7Mp!֢mKK Oz` ЊZ*ӉW:T͔q" Ot_U((/?_Md*Ԓ,H]vIdFET@0` Z(Gب?6\* iIdHη袊((rZsp|kG>yb;( rj8n >Vx7{}+X(5]RKiFpEpk{%䎋3Z隭lkN6`+zlCo m$}boW*M!9YZCh%մP Z(k gs*bGJɱV_{$+-[hDkSRERO=}Es0-y4DSz+Z"CX^b>)ֽ=}S+VF%GqW5P$zEQEU{8! }T$R>\,s{3Gq& (_YH=ʟZZXaez;dmb=Ev2w?:=j>~l={ u뵀? iw9+BǼMW)o ˧X @T'TU爴.M-ܮSx}G?ZY^_XoHH'?CQP6++U_难WS)HO73'lhQEZ%q+5 UzEhzM摺4j@:,>YX沣c˸^J ʴe8Hې7:W0~E8SJ]R!ðJ'ZDfF-裥hZ\^jhQGNjGq.TzO˛gO&b"]T׿jpstR=EtVVFFz 00*Xy,iT99@{֍U{mo-֠PmZGƬQM1Q貑BG8pkEQEQ\:bD_ Kz_-sg+ipd[+F-RX {u }ܢ̄aN@Ϧx56mC#m?>jƿs6v H(r æCq) L#+)l<ӊM:F>)GJ`7oUKMi'#t#P~~MP_k f__6Vm,WѮh&"[v*9X"ik"I/n%y~m7Av?Vh((?U۩(pq:JuuUvtfڵ@ T Z(no-}Ŀ3~vl{|5wk9xcqXGO$U=3TC}#ylNvFSXU }k~HLs\2[4dcՆyQEQYڅ <hn 9ǯ˙b}3aN»YbIXӨ)J$Px \~ɧ^%ݓ0^A}qVe'wI;7f ֪joAGg #<ޣִ,_zt<8_\8Jq Z4QEQEEqo&9W*0}E`s| n]Ew&;jj(BCWМ?qZ]d?+o)S0aKJ\GK9*DSA]IYrI=Οgx-X^&3~uJ i?PxkK[B&:}kfVsagGa^ k3@yz*9YhۿCk+LIB7 [lwwǨ`nF4Ԛ[OZE6d6[]3k0Ϡh@ ;t+Nӧn qUȯMs)(ך6V2ײxLffR~_U#Y.[:M4'~OZQET6]GAfEdu̓OŽWQQLKT kY/e ծBaI3{ΖkR^#קEr򿡩袢m}TGsI(LdLVie#T.@>" A$DµC)V`ŶF'~ g?ƺzɾmzfGzS"$ޱvdhy>UfHϧ&lA!zT]aJ?CTQDHf>B7TN=ȿ(;+<79<ѷ] mn+7t(h]*Ojot lIikw* bxZpiC>eVTV@brA߁MBK3rGp}>R'=?iQMD ;QMΪ7j'CcsW ; Z(DfՁs[QEQH;6a p}UJOv)iֶͥFw'cTm~fcpHzNV$Jʃ=gѴ>(㶴| W-yQEY5VH0fQݏ ?_ֽkLL- \95n(/-Kw=yi\Ҍ zU1<6껿>jJ+=5y>՟Ovo.Ɋ#`}v&lvh8?\[H^bzg*G?Eִs8V ^hd~b9|R+}QE}ْ #w KmʺVr>mE*oU /0|Ǯ+lbҧIz=E2LFϷqOA|P=pr2)Fj`1?_hM<=S39?WLUOPV x5:pHGSEwH n HB ѿơo ڟ>^8HWu!Қt^?+7M01uR0jqataI2֠ggҁzz*fkod_RO=#7fnu֭QEQP^e7?2b>?Jm >֦+4V()Đ鱠«8^ҜIY:ցE[((÷ʿ\֞RK2}yJq+Mc@P0S$8P1{:+ kh?55klc8b\U?]\j'wkR{MÈ%CK>(yu~ݨ(pSS'( chGLֶk;T-sb>X}\yӹXA+f+Hpsjj((Cna6I?tE^2lk4?Vn\& t?\E'-c?OEQERlNlW֡Ο)=j }BMh+v1$NOqT!d|JnxF´e@r :]Zy̋AziC9Î?֥QEQL$6E Gb#[6w^Ž}=EY(ٵ=j["񝃞'WQEAXy8ǯV/m.hc ƠH9F`wQ<-u)\S+u5(_G mr?Uk ׹a! dr1N۹j5ks)Y;~@J"]ڌeOkB zl>?⛩巟T >ִ[B@~?q֫zvJL{0'Q^s-/$҆o%Iä#Rj&16{Sz|MokUO?XomH/[:(7>iEQE׍%Bm.}zjM0[QER%0U1$ͲU%_YIEܧ"U/iEQEg̾]#Y BNjM_+P +!]=Pm>mG#{~kCUHNEOV{8Zf5oN)`k"\Ϝzg5j('DpXdUɉ$uS_phZ}5vռ/JO:twR:Ywy^C0<(;lt{[_2NZQQ\E:NG9϶"ٙԎiOl6Tn]@ LJVws|bP EǩjJ(*[Vy9ԔSYsURY<9AT7} >8Շ-͌cU#]x@X~͍+t# GS%n-TUO}]/dcw8UC7Qk-M `@=Z|S 3յkrQ^ǥOEQY\%+ `~'EUż}jBd~ooj}4 }@oz EQEPHN+]"aVD˫܄_zzҍ +.ĺeAΐ?7Iuh[ܸչK]\#A1,1^'HS?'1\ٿ 1W[EQE#(e*y`6B7]Dc7ǸVz_հ#>QW(ԗk(7Vv:yj(/z&CmWe mF=89v8hf5e>L{o~C&h%ܽWi>Opg GZ6l'1֪Z< RWPq_ٺ]|1?pUd6[ʟVS>_%Vx'Ek6P7SҼojRB\ZYi6=6yB2y2^^:XG1ćsu?(?ƶ(((2w?vV5,y %mWgMo&aZhkƒ.PEgMc$-@I$WAjw: 9h(yw8ܹRW "Wd ZÜ6ݱ?q&Q'c9V}sXaWN)1i#mѩL`~zl'-qU-bVoW MHEk<9AhKd]H3$S3<~uuV!OOc]LT=hQ<?ҺxHc QS袊կG%$w>Y>￞hӋ$=;cBjjَ ysޭf4QEQEAyF2 8~i * Gץ9= ;?v7[&ms-|$1Z6-:EW-۵]@@REQ\׊.Wiy3O>ogWtws:(+k{Yp}c֮~-$jg]ۭi3OGD0'r-ZڨL@QZ~l)VS]E*OPFAY܂c&~_X>c"B7n>u)z°<Zf}.A8k-WLmpQv\2AץhzKY'L|ʒ(8ztY6"Y fVi zҥ%0ݘT[})S W?To[?("H ݟ5DkXs?_W{EQEQEr=PxNvF?oఐyVld }LVkklyskBK7Gɡd =tvjx;F XL|A8Q@>mwJXZdc'0kOx6rTu_qV590{V.-Rq±[}M#R1zVRɹ"@`A*2i!Ә"a'HTQT/n٠sW"L4ϷTOQP-%'SIsw?${Zۮ7sOyW׬_QEQ\ḢӴ?wyIWs_[ɑXf ̋O![6zcMv+-qiG >S',Owc5V%;G?o-p,N;!5AmB;xc?J絝tKRvhE7UCs[W+Kln.$ĥ c5f$8$gjiQY#a ((y?ʲOAKc F[ӭDoa]پ-I:$ 7y֊(+WuV A# 5y+vҢSX }_uK0~uHg0Mg֭ *ͨn_Ail5q8Vr2((B=A;6KY>fH Q~wN 0;7Ҵ(_91~aV]egS gmaȭǸho +w 6QX^)~l~c*ˍ>1C!rjƉg?D1z~Fd.kIZIKq">eg tlI_ƚw,Oާ[v`r?5G ?7) R^kH-⸖=H W.ܜ.nH77zV|.{r85i@e 8*tխ1&C횛QEVmsۜBe,2uzТ^Gv?gAuq\)1VRч))QEWpN6İ^oTW#dSS袊(2=Te=gH1c]>/J1WjnR)eOM2?vGں vEʡ-u5)#Utlxe9O\Dc~XW0@| jL/6r}qZ>).z{zoŔꐫe=VnGs\&-5-׀OJҭ⽓Ϟ`I)8']@ Z(u]@ZcCH3q9#ҫ]jś˶RI8dҝM=S?ΩfhU?jc%l,U($3$Վ*Ŝg !EUmby[m'Tk׽$>1Vt{U@u6s=GLWkGa@(Am$Tƹ 3>6NNOk($ O$K1=ضyiP0Ac?j(('So? :}8p>etQEQEd"T^rB{)h]کxu_O½c&Xt >(eWB# m}" 5D$L*[4/9XfX='XqȒd`E:ӟ>a%WSHMg8oո%7/'Xd_Zӵx8JdB2Si4۝Q5 t9SӪߒPzJעOor:'F>z|@O׿Vh(>uYo zjNNrlpwHE܃Ʒ ֬z CIm3C' OT6:+ dAQEQEb:Q nm 9(Tn.1 ,zԢ2=n8۪_ћ~`t*W lɭXE\Z(&q@ _:xOօ=RH1l'qt  @}kIէ q'IqFK!G`=ꔖN2Ej8V ll}Kiyri!>|$e-ㆼs͝>;bu)*N?Q}N]n>qYxZV_fo9}F5{_0֚5YSS&n{rEYK$YWI˻iȶY[pe?\*)㹌JxtwD#[KȮ(pêQEMw#0yMdA 9Q%SQVȢ(}xY30OPݜ[5sS+Er]K\%ޖg #Ўp7CD˼?Φ$ywDv4syS5{x2rrEkk5|t爍z{[ʇXvŢDa őXZ6@Ňw ׷ad*}WҴ⸊qVk<}k\kk8E>@۝ךTB6W9\m /"oS*7F)lAV8'h4}AU*K=^']2$r7^&h!yO/okezg,!Sǥ׼x1j ur jsMLwvҊ]đ(%f .W9##W_N( ϕb#9_˲i?/5EQEs*1cėd?A4 .٤dОEQE#2b@$^9"N!azOA1q].-m[ Iq"d{M{ J[)x N??lU{mDžJVQEQL(B3Xמ- 17c\êh4|QW4pkTB | ީV;vº&h;kJdJS 0Gnp ֺ-c92`AK[g7lp:$]ױ=֫h08V%$BJœnֺ j:!B= ?]!=AN6iڔWdadEQYյ!Oǁ4'ޱ͔v26OֽgkvsGm}M}2gz?]QERuk 5+x9'W:ee& `gڷ.,fs,)*K{?,JYO@2GfFyWI †?ֶꤶ[̀ i+2]$2>^g0MV)w ΟiśW9\}3kLV|+:VQiNO͎ջeh1XEq>z 7b_{-b2M1#5tkVܽ܃*g\ߍG|M'6n{1YxrC.xŘcY~'vƘOHUzCb׶,nǘ8QIJ%X>zֻM K8섭1ouiez|Eh p)C9ZK$ȳ!E'wOs:>?جlpH tx6´'kbL ew;9%5GP׬"0a:5~ĺϖO?X_JMjWj~,o_K%_=="Ig{=iuZ_2CtsXR)՞E><6y%REN5Ia#N "--AR Z)C)V-}=jŎ\$V[dNހ̳U0֧#*XY87(*+  N*]2_'R8uMAn>RnauqD+i䶞M=ǿo;߭%:ӔP}ET2YŎ<kY!rEګio+gҺkNYlđ4KϺư#K㿽tzB:R51-ۡ o?zkoO-cXqGZmBMr̠`zz~]e,hx1`SK:'PGUkAߥ5H5]Kd>Gs ;mNUogx4rg.KԢ= OFD7qfA»؎=COvDʋ豐??R{)R#"a)m?{J/mO*5LVx! >qZ.r>=~?Хcte?.)h=z?RO}Ȳ<`y5b(@+ՙ7M۩kXG?^EQE2Yc&W  1s]ץ{-9\[(,qp:_j&;u&v+s' {#t?]Z0=n)caT?/?oQEQEQ\~Z=GC~6d,~^^ >6slK9IUƣqlJ]xT`°ծ'k㗎9<f-'(783EE%֝[1ޣ늻6}hAh~jY5xs'O@KsIܣ3oQW㸄`'Ko4HsU|go9UAE Fdew5$Zs]kn1==eg/ڭ29*;{5X ,èU%(Q Ueu OBE-gkրcxSX_6C5 D'.w?ε}?4@x ԚOz`e7_h76F;CZ|}/Y;RAZ6Hcޔ:V$ &i}x2 ׺loAMY# G+ NAks5UA ZK|?2RAotooj\Gc5g|rޥuX3`8Ԛ.&lnf0+֬mOέ]^YZ 2\?oE9tKvqߟZ|9"kcwkn̏(:Ѣ()"X-FߙilO5aj- EQ\`g}3:쨢(sGp*u`t#") x",CpZ/w#ѿ]Kp#ǿnY^-xzEE< :mnAkw-L(Em*zN(+;RLɾOOy3u_c[dt/%? MkR;?ֺ (]̞=Qևmٮ(^I5!qU5U0Wj_6kP?Eծb[h]x3J}c!gՆԷwPIs;m5_?֡_<+~aSBVtxe,ҏ/!c] N?.qF&GPu'~WWRqo5z :~B*fyڤchvf󦴷ƏZ,s,dUc~X?Zc*TN V##2"ǫ[?)u~{8 I͵ hͷofA'HtI?C(ˏz6)t#& \KnHVOb0./uʑRxoJ G}u|[[|Jw%X7Oy)GGSc?N_XȔ{?Ɲ &OO!Xmd,8 6"MSW,8J5{qWSӤ$o2\<ܢ1sǷ֣h-Y'=Gh.!,P~iXy#? uK5=/)3_?V`TDg#MNu;CHnu6G*e}Z4o .x"x&kMxѫ ?}+]۟W -EGc5*Z/Khyw"mgI 6/۱q+ծd t9Vtqíswt%>L–Si⋻4O:7 {,'g{Ve yTw_|ѕ!M眘At`è@N# 'Q-iq“bjYgzI";*anڍQWG`QEx}]*Ө[\vvZe2 >bHP8Q?e\7|@w_\SF"sVZQEQEd_=֬6ijn->)wkZ(浼kV:ᾥObU`謧* EQUu|7~a~`(zVxVx7} Q8͝ʽwC:~>jPeCФq>V]:o.O6*FM:((Zg;tv?5z"hw 0 H>|4)<~TZh[K%mxDdՎQ[]oH?juig$TɥkCְo.~#3nghQںX4kϫߧJT`)h̚EnEl:3w?AQk"xd+2n={T^m+\OIOU?Z6 @ӿ2c-?NSol)ԾiyЌsKJڢ,͵GOm^؃d >K8lD1ޞIR}.>wm Vo?B?Ƣ}&G}X7i 'GVK;Rq6r@N'XnbuVztẆHV .֨Eխx=y펍 :CBlQjau{vj>jQwn&OYI"IW ?J%ļg+zӣ\?+z*edONG H$j{m-j1SES=*̆5Bcδ'nxϥjy/0&F]pzu*,{N3[ |WST0%DXavDžɦkS&לƇO /~z5mS4cJH`UO]kN$hėhuH/lby&>0?R%ާwZb?YOk1E=?!K/ë;Y%=^?z\xAuIfrm5{/O(~cׯֱMGoq+׮-w2jj V=QEQ4ԽM 0޾Ƴl l%-`"Ճ(e #-QEg}WIz+`J((j*fys*̯)Q(>#Zɶǧ+EQUo`{ڣ{ZWGV1O }:AnI=X9|%+?KO/Mz3Eax̲-c je`d04xaT>T{T߳g<ƐVFQ-}4xl-k=.gZL<= R/lT)PzgmݖZiO몑abfu# hC[ܮ`v*jk{w[ʠ1!oVFm+PW$ecpar׶ZDFpG|I#L,LJYJKjJ0'ǩ[j2GF 3LY5,wquY< E} P̑(V]Ywy1S<*ҫy[was]0.S >{l"]BGz!JuxڠJ5XxϽYׇփѿJQ۞b~4vFА n#G5"Ӯ%`SǵL5-X~*GJONJ4_XKP;d>^km:@FXP +#] dI׀ -tGCvmm=Ҳ]2R yrڜtFFvsZ4mPzZA?׫:Z?տ5 km(>t6% tOjn!dTuc\q]k~dd qEIoo+KGREQE! Bv\TY~5ZM2F :Ċ&|3~ y7:L΅%%{MrZ%2Иn ê`(/=f?9l]ʯԕD:$gLg>QXN?R H#6*AG6Ni^Xʒ#FxJ!%gYvǜx;[Equn)\˧\Y7FzW oZsq]&{Fp@⢹X2>IZӴՖ/6R'Җ(-$$ n3sW|7c:XoE DӰ_gtxs޽OU-F~mdQWT= =*{*V|YOE\)X8Z무0DAmҴ` (bhC Yѣ#y ȣyk?h'*@ǐz5ns,d9y?~iY]or+EV++㨬{kͽ“9XH2 uQTu4J?ڱβQEW7O]DzjhVsZQE^-9d{UM'ZQuQ'?utQERԵ;}.͙DŽAՏ\oKd8}»+[Xl#w>5s-m1O?:*J)ƳDѸʰV Ҝ#}X;Ѵ_5%ic7r@]W` '9#?tQER;!v *{W)u3H:5B-V'152(DU-fO.ao^P\Yݮ'_߸kXi)Vx÷\%L\~B]3^! yEA(*U})ωxaiVl;;OAԟ cM6%L <3{vu!>jiw;n+Ocyspk:{ŤҪ>Lo<| KojVqzxHɰ'!kQE!U=@?dj\qަ0zƇ)<"% : g G} ?$ur>ueY#}O\p?F& (RdC=VVGsV5gafT5cr@ȫR?Џ N bUcAMEͦO2iQEPnQֹ{X]cn@}Ao&URS=(:Vpng8=qZC;UQzVՕd|ڭQEQEEsԯY^+%͛GWWEQEQz?REqЌӨ*5.~lv>dAekVS^3ѽ~q2:Vq' Ҥk"qj2Uyu$2}VhRNH}1-0g/_DSD] @u 5d oε}ΠtoK9-{`5Ғ֭ZW?ib!]$Q$1,qTQ>(((+ sT3b5?qbXrc^?,&?g9:OzЗÖXU9<1 U6?&F튧-#j ?4L>4+WSԆn= K+zS}NX@ fڍ[o3iDK3uaȭv(U ֭82dmC%BqkEpBCn޷;6?IE<hnHPr?ES]#;pd#5c-ƻcBP)QEM'2|a#R$5 UG`:S袳u}b *30y>W9~!7 }cbF >|L|JhU(YBp \u*I? ,l֩u8_T?:ksP2Нq{ᾷ6f0cϿQWeEQ\4 +~I8lw>:m`9n}MOEW?;X?9r_i#װQE#(e*z+*W@_)yb5M4s$c)k?m>IH#K ~_ʸOE-bs+g'ei׾wnc2Z_QjmszTVЭޡ(u b^YqP=+ETY}mEVVF֦+Piڔ:.X{57uݑsC~QEc)o-1(O@_\ބxWpztjhP.qW>½Κl[Z5Ryag}J XQ=՛jmGLzgaZ0j3&B67㦳r{MSQu}*J x$UM&&zoʷc#y班jEQEW7fOD0?]QEUk7\d~a1~n(2# EQGnɉ{;0~daEsF7?OqTeE֥ ~I{ԎU .0t95msazTQQIs _~E#mi}(u\vS֝+5D[0cpOvW-cH"D[;?3V-a BA>|'#=;m7Y2щ5=R;0򧧹CP.<ǻ+ѯOFP6:Ҵ((((p2k>mg5Y2&#ݛ5gs}X8T{z&d#rQImaPj.sU|-n1JEQ):A-ןYթãmd~b_$#6[edpW0DqLZM&m\z5o|^ 3>O+Ҵ %[N <-.\$@[) GC^ɛF?ZTQEdxIʪ rZk)"jӞ5ZM>+0AKX٪ޥ)58<689;7ۅ?y>SVhgYrnAɈquVe5y<qҶ@2#j26ijE}ͽ8 oQ\[sUʟްY.t[ockv+7SQEQoE:+׮(Mqw=: ??]]QET,zVeԥ| vQYֻ1%wzo 5EW|T/R YL{0zew5Y rnRQNF>TGn'ec*\wɮ7-UEIQEgj!O\q=k#M* ̣AZQEͩ]*Тg'??{EQQɦx n*:OWgsN>ݿZy^YoH7/>i.y[/}k_ E|$deXGfفc$bnC}많Ű4Z)tV^#J:QE պ[<-ч4Mos.ppXè@+cY<æu5Z~1Ã\L@Jj $%ӃVa$Bqj9QV$[#mۺNm9VYZhcAp?T[ xγnJI'GE/P=۞}wZ8r7c֩%' x#گ(u c1>ocB \L,˰#8ecO7NeqOU(&[xZFzfhHsrs{nQYzJbGM^O_d9 [WD\'CoovbKrG5gϨKE܇7W@DPS$I*mq<g;=Ƶ2Ҧ:͠{OdF) jcbǑG.--(k1z(?ķ2$P05((T/Uep.`z 'QEQX~˪4}QEQQ F۶Sk7ƴ}+'{9 U{9>G볠?OJXxȽ9ZV  2R5#60 y5f~JQwypq~J]JBZA9a8 w<֬QEszRc]QH^: K1q~W5iwmdqu6mG<;Ω!ߜ^EQQ]EMЯ+w4k eʯsm-?µz/`G3Wh/-H4 Xَ?/KI݁ݏ#>[H [X?̪% Y( B+B 1&N{G]x!  Z(((* l8M-u#yAWP_C̹a~{\d~ݏk-#)f(qX=w`WYCs9"˨oY$G̽1 =kn-&4%Ca} [ЬʛxpGY)=ֻ-w+0^x8Wv" o񞟁uXl($8aʑ) u}=P+c^. }<7'` #Zt]Zh$$t+r(oioa|fcw)wlчOCR][-[O 9V43Pki  ֭a#׫$0y~ɩ4GWu} IL}ƹE{2smtzzچc~$589FgmHQQNTԟZ܁=jYbI1ȡ'.<GFlrp!*Iax9OФ}W;ϾuJ$G ۢ(wT2jݶ;Xgy^ikV $JME`!M=Mtz?Q|< L,w,oov :QEWn|\kQEh֚%ryta^N|%="i7rDnGN2UM_g|Qp:V$oq^[vZ&!]?=jTW7 kK!{zJ_5ħb}>h)8'sT4љ'Z4W3kVWskہt4T7WvP4SG Kݰ+~$&?A,ϲ?+i#<>p/oPt+3iXxf_i$H/#QԚ/i6jv*oo4K!O|kӟݦxkk!|юGZj:Ε Nm$ar?隧Ȼ^ /ҩ_w9SZ{)r|ji- *Rdo.NG~zGY20 !JT9OQE0GfC/RӡL|[tU KY~?Һ`CARWOZ㪡#NLAF?uiA$#EbO>roYa/U}hv8.kTLwXѴTY[rDR3Fiíhl]{pVMvQ_jѵI;$z+m$rpSc[詏5e!sh[8($U Rq8?XZ u}[{{l?X^&QoUi )E+3={{#bcAQNmWYi3vOGpn[" 1k^*6J:3*+ihND#W5n[zV() # 5M V\I ٟJ?dt:Ӣ(N䢈m ̏u[0XKj't?YMJxHY#] Gګ@dQEQECYF:(?i|%sim <coEQEdkQμ}#ԑ5qцiQEU[s*?xe踋sn }}*o"-Qjp2"㽾tG<͟uDܓ`;Hz=<~gi&( <j/bm°n(I MQBd~hxsBKG"FeaEp΃u]iiN;Y_ 5֯fcJe^EQEpoX2n?JvxAyc ;]եhfn߀+c;늿EkkqdٻZ봽o,~rw˾%'8=A>Ԛ\9%|rӬoN ?}j,&SȇɞWAEQEQEQEg2lyҩX&(ǨVh$i,m`޹*Mv UV|rb9;7+LQ zﭣ*ykP/VcqUY1?SQ{TI|]'&7ӯmW3Jmm<9C|$1lo4ӴY)1޽x#N[xYg]#¹gd"2L`kG%SC!'lc"iE%VU?Ҳ2Hvrxo@啄$Y;W}oÖ6֟ v$|{LAK'u{x`r@VxYҜG\m'Ãݗۼ+H`V²R==ihnba`{ם&%c=~yj.r**M+Q9-Å' Lz?Sm#z5vpOC qS袪ju:>뎪}. -@]>ꇨ5`]wQUYA{wӣ9wZ0W,zkR+{*9VE区tjc1ǎP>e{9U6ot?kJBB$kO,`~?jt0[?[r(/.V[苜z™5}ZU'ǒ#郞k]Mn"{/h>J_̑vZ(d#=IW3]??Zע(4}r'W0y-d?$?lQEMrwآHbXaT`S袊*^)'L\Zn?\/c'2x ukK] 8cx9r;a\$6-ڲ:W*ȋú':ԑ! _z/Km^9{~J8jkfbO^M[H혏G$]V쓕zOh(U(KX#':txrk'#]cXͽMu%q~5VN [o1W+1sUVnk `7;хVɷœ\R_Gqj¬sgQEGq\qGEu t˃#a}WyEW3Zr|̷'🧡<5+ii<ŏ`ˇ8R}>#hp5Or y䑟³tiZrp&Oq]f]?F~-(cfdg.~\˨ஙknʩMR\(tBx8OtȒx2)WPAk*H$w=P JQgNVFIQ ױ٠'<{UkȻ]CB*zCȥlj2=yjYԣ*#^2hA*OP1"C=kCI~+BuMd6D'k:%[b{~zھg[|G\ :.1P?>]oC}j(e*zXيH*QEUYrL|v4/Z4S0'~IuETsJ!YnZgQzEao-sڴ)`nW(٨ncmb-[lɃWoN-QE!5q͎=rr9]QETy֒.2qchT<} \($( SP= yˋ!9~kD E@qhM(%ZN&T̫з kx^#F3qsEƟ/ڴbE]uȮnZd`䳗6 J{V͆YUv(p7]֚ak/D?ƻzkFĀFx4{{CN `\Ww-JvQGEEQ\NedR~5TzXZ94dæ;zԷ;[t!ARA8j/w<hXf$p]{ u^nH܃WAKϳ{)̠g:ZjQݠX8G22 -rnl0ށk;뎞袊((+b(OHdj)t^?*UWOUZ!'Mc^wNf?) Am{(&(Gd5~>9TEq7uA'5n=G;M^N&?dx\;SaF0^0E%džD,giN<՝5k;^ ~ d%qa+28a{KNh۞q3 t1m}I8z?CVƚ /R9Ϸң|My ;=Hcp`ps^ua ~um"HweRXys+:ºuZ5kw=+MsGbc3ZVhw AOZ -f .VZ\tabnc_B9V__α4{ulb.v5Tm<ī {i)֫pO~ ];?Kq=ZŰr$  U(!h@S\2ə}WQPO.E 7t=NDۡclJ.SJ00$rK G*x?ǃ5r-J{cܡe{t=#1V-ڈ;vohSGۓZߢj6/W7fI };p+U G Z(~g!gQܞQ^ئhջέOZ I 0,voexy4[Q޷(z^rީ;.,!"+;J!|O"$Xy Nu_O]q*>R}#ǿjcihrj(dfY 6Zĸ3SU{k(̱~/~!["H;u<h>,X6As`vQq]ƛJmUl`ܹkBuX/ְ N_>Fz" .1dD֮ECXIZQOO?z=a6u gVG476Ilb3UE2?+7_uLSF l$1ONseg]3ڷ-;;!C {u("KONAvƉ(%p1ZL.Q=*J(Zd 1FWT"o#lvaP\vgj~8іHdVE&ڕ-1[y$D'_Jf4&ͽ'/,@:ԅafae8?x:V4g6%OJ| m t]֙-"kwh%8ע")rf[sZv 5\iZ34[vm5 r[t:Y]]C#SЃ\ݲ3FcY6DCjI?7@޵~[ |çTS-V(# *%qZ+A-VŸawO wÂmGk4-,s+*#vkGqtkԵY/$,,[{U/IKI²|CtEf걟}UYhZUw!v?CE S{/^Ă4QEQES`ImY8\ń 20G[jrZ(}Fs<ZurMoKES^4aV{ 9E*[pಎE[TN? 0aiQ\֯ zs܎]! A(u&W9үQP}5jWv]B14i$9oԓW"ҭ꥾*Ȇ%B#֩A+W=D*FA[NÎXP} ju-+#oPծt~~TqEtQK"p7o'-%GoqZv޵~( |]a/`#9CAitB9C*ru ?vN>~#ԟ<_̌چgSO>Ox]X%D(,6n>|uQN}̐foϧJ([e!?`_^$I Ԛ¾Ԥ`cGVU;LK5iJX~kh#;;a*u(M%0oB;UcScDqv մwvA(ʸ޹M'TN8Gl7c?]eQEQEQQIq _%E>\αIDłC`EOlFP!Qfo$NO*4ƿA1)o(M$[-4:lhw>MHgk$.oj5e4mAqS\uypI=F+4^ҬH# kL.TWnc}Wժ[ o>29'fSo_%[SQ[b s| <|IٟZtQEQXZoGqZQ8zO#M=P\Ij3OPsՍZDAҧ=Iryk~0ڝ7*k?w9!*ԯQkmm-iƛ fy=?=R4IqJu?n&Lqr>P15ºq媇d}J?dqsS|Sp<-"+J K1H}4MF{ $? ?q:mTzf&֭I"10=V%$D?-ϕ9{}kN[njpÓQ/?|uhoT?BcV5Ɵ'DvrОZڲtxwF;M?ZmmInK;]ѧD +pu]j !]cn xK~;=[ }=n([ÎqQۿ7|sRQEQECuͬJP=Ԫ#ՠdlLTTZ[ۓGY}K',ƺhz((^J @mB}Dԧ3_/>VkĐyz18?4hNYa8X*(*).`ʠg&pŽq`{ZXgZ(gSs73ˁNJo-*v#U5%QQ\@n;j=*6g[5ۀ vSnV-Æ2A{2gчUWѣBsC?B*}iz[iɍ2`3zQ wdc^_>K@C bUY]j\`i݇ x˭]; &'0̳f6>SdiXbğʳ.f&5+jհ㲏B>gQYšmvBK?'ٺO*Ң|K]?{V-KB9/ jQEQMyceTqUd-#wњ/"_q?UU*=BSQzvضA gdg2=Nsڴ@£N>"vm E>/^âW_5~+H!>SQPCw d W959/<ه==7A <=됍gկ$%"ҝϏUhqhZ i3,{W̙_ˁW?]YX,xϻzo].Aaza+F((wŲ?RO֝yVG(+2+⿩_-->SYt:VbLG5["=aZ`8(k6:b"55^ =0 ?Lŏ%T䟩{X-cJ:jZ&Oo|=R~*zꤑ"GRkզYz}:-v;=XUյsQڋts#}*Ts!S)>]N̟]Cve: ~U ?GJOk8+?{w{ðOXto`s[]&W51 :Y*Ak}}ks`sm%Q{?s%KI׸Q5X;o"1O1:~"!7Y"=J 7}n܍4|6=;tLjTSU$xwz֋)lbjNa~QBbe 28T=^-Gı_LbcexZ}WR)''Œ.Zu+ 5^ZA7t7[7`,{~# υiz̉cV\=6wP:*ONY|WVFEZH\/;Ʉiwԏکh%u*>X šfuwUm^qlFǮzIYͷ8~ꕦ]'kި]@a6>G 7zS+[Uƺ=?A?ő )% s1ǹ67/Cj-BNҭp\jz/)%WOn~K}}+XM>(́q?Cպ((?OMr_/:##mozzUnE$kЫMFƴh((= W{(2ۥ1EݷܾNnme0]Jv=m"а?Һ)M_~E_8^C0*1uypq }cRqRP0'2;1D݌UAǨRj6}RcSWMe֦M6~g>jCr5_UIi t^k畢,poe}s)NUthSU\j椢(_ef\c^et_]4I3{ n2G֥3\<պ*h}O߲xa' .>G[FյOqjMJŴKԸ_wZ҆T%3akUK n3WC^}-*p7mO.G@F>ҹKH_Z=tdW-ɗuQExFc ~UmւPL/J6#I!N ~%xa'p*γZˀO(֮;7 r0Xk'q~(*Pys#MpFv<o?ص-6}TZ[T%mwXed`HsR\:dHMn~Z\m+@\]47~{ShP M&H/&$ܟQE#3TdVWڵ k{p?/S~ Lvs}uzno\c{U((|N|FhXU(+->_E2S+,*⼿UKme1'=kuc^O+3Q3+4ۥ>[k`ӡhy[OfuNJ!=M:(O&5H=MiQECve~Ve蕰$?jOsuB)G1'3UE?=Hת6V?J?zݿ*QYܾ^.:~'3] gV؏'SV2Xh)2:e=\/~4Mr-nDX7lJty?=1FX~Z-$'ޫ_WXß/]qW~ti-:?Q[['TqճiP<֢:Ȼ(tY#dqa=[Ff̤&O:\~5W9"`SUCIyJߞ81O j<~d ||4N1w?^QEd ͈P~P?C+>oHN?8Cԏ5>;-9\24<siyJb}%:*2Qw'W\\.~HT& ;X-(ܟz(S5 ;ں_ _Hwpw)k/F[MOL OEe&&.ɉGסwͰUnJe?Ұ NH^{Ų[j\Rj۶%xV*z((+Z)wzouEQEeIljmz?v5j~n=klqujk Z7_f+#R&V͘8=skzּ+(z,oX)v)+~(1HyRkN^%V뫴QUn#B8.{zVG`7WH M?zDE"Q uRo<OzȳiS9PhQEV'dȵ\]ٴh#P~\# tbs:ТOuzKk^fws,:70~]XnҮkO 0* ;{V>\ޯKY@ߎak<N^(YֲYX0GWCiAr}Ajd!'Eic+[6>8_%ZD]I-^^( [@!cohȋ,m ܶKL1 һ:(<[vçBrέA ETQL(B3\^LԷKfo1폔כk>4f)unq $O[ִ㷼=_=-턅&iHߝ@T\ָmLd :vTֱ} ȱۧ,{ }:R2Fx>i:[-nv_5ES$%] a*`t?nE>-OP L ?Z[;yMOδA zYd^T0Fih(J3 U5YCB#q@+&7,FFȮYCs%rZh"CN(($( zO};GwS שSH̲dsY^ k{^ge*Oe ȡU6lIL7Uun'؜=j"}N N|bMn?ZEAz>[&$RQEQEԫ 0Eg+W90Oq"4uʑis A} sRV A= -\bkӮ͛D:;  ms1i$ rEoֻ/ 3z1`5it6'.NUdji<|)ns]]WPиtnW35?Uo|,~X0uy1XWzzW8=ZQE~E_jo. yYZ>}joI~\CϿgOVYFG,G-s[K+hBN=׬ P {ذ[Dx'YPeMUQ\\C Tɣ]\2zU4{X~> kTzufkluf^6Y?OEQET {W jjB=}40>On(e3}?O0чQYdXn= jzV!sO*(u-&&kLG/RzVj_"2ʜ H{7usg0[9#BTgaz"iuÏj=ryCgl)+F )HfbpMyM/yQ[(J裍!cBaPY}narT|7{=-\CNnl0zF0jΣE+}}W7WlDY8(#Pr!cW`Ht$mctfI>dMBu;DG__MзP~~9ٓL0{ Vf1ҏ3tOܮ.+C5b mrqZ4S%&e`m&: sǦ;5nI8ZC0*5cھ3*zk;hCZBVp(QRE:NUtREQEq#O3IÕ#-| OF?oS[B (/eϫqU-l[W槦JC)k&kYdؔ}z;w__&c""k&O'4Cߡz>hn\|p>sv+l0we=k?MH~U˞^koZ_!TC zU$~vzy5ERt}N.e\uZAԼ'zI{rxB=]Z+FI}V+nWZ l;7PI#iQL%28?`}+Sg1޺U~uJHN?NMw;Oǭ\۷w'Mi[v8 (VjQEdj :cw8ݛ5SbUz܎DS"P^Ǥq2R$*ZqkL zTyی@N]M0>kP[nvLWW/wkraIsõ8'"=m^l`~ :((8ERkї3HPkEQY{iOj7RkZ"D zMiEƃ RR@dڸxK?nS=Ksĉ9H {ֵ|3gmģ@@)h@3*)f Ԛɺ{0_,3>61PנO:[Hp\2jFI2!S (  Z(+7)q2=G+2d(PiW%}3͵Ry&;<~Guo\C7< ?'iҵ+2e"KvN\ߎF1icзO?(5cq(⥇C\;@b}b+ e~gmcU[.-粻,j@=^9ޣgBzIPEP"ڠ{kn8hO8򮶊+}h~y>fӰC8qj((n {{X\aAZ:m*6֮^k618ʫc#O֭F5 u1c OV/{ 3`LB_AOʫl&3PIl43gMF3}JݟI4G2k6﫧Sh'_NJ\BFDK=KK g85<, dt`uzjx%†εm+[+uYQAkP{VzYă E0zUGo2x\YVNޑGBxkզ{jU' YL>XUi!?=EQHJ#Vd6Zœ*=ʞ?LcEQQS HZiS J܊rj\Lw?01BvvR?AEQE][2÷;kG"m|ڮV]}D>Zb(۽76aIkqf 5!z֏k÷kKJhC7A޷3E2HvȊ5q[ɓ 4MU?w111~aTk띷1=?µ fUSQES4}J.u}Vbczص/2&Ϩ=G֠u< ݍhEQX/bƥt79$k0,caV"!]>( mp$g\&w2/?ƯDQS(%m[Žv??һ(v/3LcZ>>#1U)D$2hJ=\?tKL&)bQ>~Fcmv,7S%:4qȩ!md-kso; r$A"s $ncd:ȼ4cdֳ`HYEj&$@\+)A0MOˑ|rvhλ@99 sj7lXsֺ8t#XѰ<^xb"T}#sp>f 5)?f}7Qd`{O5-7zKXOR֐L80hГxJ5}R@wWR~Th<ыy|?GsQY%]d5+B3)E^lwn~t}{} _=;΋z')w}n Y@`pJV+%vG#85j=^hH[0kBy}EQEV+=@k AWNҠ5W1Z_ݳۣ`>d>Z<h0V11uP\] 2?z:T̟{xU(f7PcHnexJ 秨uXk!\ Mw4Zm[A#=3{k+[i.7y8s?ZIIbuxC+)`z}+zh|*}}OZ Bj+9nzrkbm~>{TĒHqon [*.zO\Z.gf^~|ި?ݗffsQ}N3c[w>\~IjQETR\EߐްkOݺ0+t颋R%^~P~BY9wS[[A.GsɫW%&%̇8=J`;hQA(('P7~+B(l(/elT۬<=~Zг)AzJӨʅ}k6rZS߁V+ĬP;v{A 2+u/>0Wm aB.2UyY5ˋ:H}gPNWz}Vv&n@6=s ԚL$ٌcOֺzuާk4+wc׮( AWZo4ܤɍuԸ#W?ܣ2S.: ϸeWp}cZR2Rd\[xI v}nZQEA=Jס.}uO`*j!1݆G*m.o~GZI"Hue=S9d5Gvl{zzo%~2uq'5ҫPá72w?vv܂I)GSkfխp3uQ l5-r~\Ztf7?62y33$>ebɾ !+"RQEQY^"\yҳ4٦pOsW(+?W,GuV?tZ 4*f? 3ևص{3Cy?O:Ӽ78ΘIykYͧk'3qjEQ\GpYI1P,r?1!o_\UT`ԴPNOJ5yм|5P@O(+;\Ҥ 5xRADq#3 ۢ'θO`i "vCR6y\)a)Xw^0,,OB1?ΕOtgVNy6v$i^3o߄#U\WH5EQEB:o@qA#9?]h^+Niv?U]F2D>2чJ:h~xeӸtkg2mqɎEQEW5x-gbۦ azFQKTE7;}ϩ4M;r[ؕeH=֥u%ŜZs?Pd}Ǧ+; i4̫=A#jPV1\[`ƿtWFaU%R1Tg C1P#Yub.??}n-4 y_ε#9Pom9I(劒ngSVVW3^nU1u!btTi>ǫ;Gٵp:k:fw^6B\'bk#M^ÆO6% *ArLV ǖs^Լ_>KǡOxU&SmWj8[HxHFqS J^ӓ}(۽GH jjnchdl}uޣeoin - ۂ/5áȶQWSF#ci zW)W`ݜc+"9f+a2y!vB/kLn.ȏ-{=+r=%PW`0>QVcc{V 0V&&;{zvy$\ T<>RM|g5[+ zξӤVe妪6ϻ 2%}xTH^*.H39~q 'œw?}/׫PЧ21c8RX[#PqsMe]ͦNpI;GCGڔں#s=_Z4QUKw!ƹ=e˖;3ٽ?ֺ()?&1rӿ VQEfz]c36 /Rr755T` ugj2ezZz D :N*9&Hwg_hEP."P*JlFnO?֭Ed:?RsJw?*Ճe wk_ l0pq?ҵQEQE+Bl4Xi5{Bin.@{uڔj70 7z~vqYoOjCul[\c^AhkO (C$ƾU]3W{]:ȊAVS.m&Hn?jen7{yԵ->O*ض;jgtBpjQEG<~tֱ4#zkƒ :+FVR)d⳯<;oHeT\m,Y!lѷс($i*u5DytblGtSb((}x;>Z5acʑ"!_EQEW;|cN'z*9mbD ީw[A95>&R;GZ6ʹ>c>)iWxvPceOzWucOD%ש!fb+';ϩ~?ٯC8?W@ e!kմ糘^Z(`hr 7ַ֭eŐҮ4R"pzVK׫A5sJ N${֭2T!t\i7ZZg Zꃷ%I CKfp2jGyMa?=tˎfrN?AW! v8cb4U }VaKOC>_m;~]~ҩ铙mB7ߏ?ҮEs% @0o\v?ZF5 jQESf)p?ZWa-V袊j֭|`*-t8Um z"=ɬs5ݿ[I/yj2{%*=nb3nUk'{% mQ] mJ)%hOre^ -g}fHYFpIO^˅+Pɏ)c%& 2Ebkb^|QhmOU_̡S?ՕHQ9b~/Sm6nnæ;*r,r2)QERԴmR$o?YִEl2Rђ*ލiO=lPE[wGֲ_h𜏥-͹'͌|@x?ZEQEDJ)"n4;irb-{r?*ǿFC~Tѫ<2Z mM,AU˖؏)'WZDE1;*͌Q[Y&Z1SϽtuim{:vj!\cK291a w1` F-3 &"F]3E!V叩ϧҵ`cAj8[uDt(RQEZ}и4|ꕄuVu& .\l_DmGcBJb?tTQTn*>XqPTzHk-(*QEV,(?һkoNȚ7O?oiNG+b(FeD.Tdp;VէUlvd[Z.%eV;߱Z^e1V+}{0̲}zZ(oDz#?֊r.7|zX&ttH]UߍgEEqhD?\ O &i_˨;nhӑvX.]ʮ=#hf_j^A U%E%bc{tgw})?.Iσu'?$`0fZ>o4FI'>N^I,du sܟһ"fk FmT-طэB U yOܸ#W+I-b/;7h50uOSSe qQҠ:qH%9}+b6S(Y٣RʴWrGOqg8 (([No]#+(++]mV@9C?z_:78QEZ[yyٵU6yw{g[ u>`jA\clIVW[ W؟Wt15G Ҩ.m"L8:֏.>xI BH)>_˥]h5v !$g*J{0U,I=|kh4.&柸O/bk÷>">Ri!33aA~qWEEH9Ku<۵y˘.} Yi8*^f_7BzΩDd,;sKkCqi؂?u m462G,Y #!=] wPx{ Ҿ}k>n=zՇ_\,?Wԭ&(SUA#ڹȇJWٕFX=I[Qm #bGl繅^ sja!gZ!ҭ ~\DHB@1N(Z9 =X|<m6e 0JPFxC?´袑dFG=r_úF$IO=k0AKEVN&DNCLM/p5-T771Z[6Qyu>AG)i~XU-Fm[ҙ~\*IQck $@u=?UcO-n:\fKiCFKǞ?l_h~DxX =믊Xe# )U=Vi n_xxŪh2YSuIt{y{ Ǐ*Iq3XV}ZM³| jETW]BLѺ\.h읚 ko^";yIcie_1"c~?C*v/-$^zEc\uUNugv1PNcwc cdgvqb=Ԛ&Ě pD{2(ȮEʜH?kJ([j<"rI^u0G@qVea43b\sqՑ$.q?$9h! ey$1Y+ l 1Ud^#Kc'';0=khKJMŨ >ލ3U8/cZU0=g\!ONB{Tڅ7W8UBBOv`H "~n8#_y;cx>]pX+7mP__ [ =7^y珼KqzLK$ sԟNs]nIyA s-GwWRmفns^v5)ӫ:껷9AMaiBz}^P8*Z}Q?D頭Nlkj( pǍjEUKN"YpB|Rk ,zXhԵ}ZYC<,p1ӠG73sYRKi "2ч6,p?:V B+'Z9?4K&p5^[\Co^ԑ]ސҶ<ʴ-Baݪ2hb462\:&u9sg}:VqG kHUEQEQHUXa?QPxU+_8? ociyWX:U.tQ N1]}ZOf/vN;, _#jk1}Rēq-*x#`¬'[>JHOsqxb*@8}O]N{#l|-\t?Τȋaƽ2K,q5M7u`Edes]egwlv JfVݙ Շj4=*,'e2>490x#L[e]BK%O1%R7[7,_rqjCQY2scJӶܸ7rjV kI<օ@ҨZZ݃,XY_z #5EQEV>C}\CG[/l"mc>9j0Z+7[ӆbBGF}}D !g~QEu >U("EI#E$W&֯E)SV!++m}M%-s1Aҵh]}^¦xǟA֠qrq_o0ȿ4quT(€n=5B9nQl}^=GFE,sIJA+/r}^Ȝ+~}k":T ¡^sk< N$C3W8][~8*tg֮QEUMI7)?phNVDc |L}SFǿwQVܧus= rB)jou_P[I@KZ'H+צOU%3]6piVō% ֭2F=7co+c Z袢mFyR6vXOkKKE;yyo\VeC䌐Χ⸭yԙ0 y+sK%F\$qMk'Ě4,4ZCBԢ^.69T:0)sXQ Uy?'m۹?c$RLS׏k@3~E$)H} )Hi>ЈNJiiS< l~\V_uU}'_zod 41^DzBGCƹ UKa[w/F7'~U7 BRx31\gsڝ.mnH3#' 2{!- XԎHjAyt#u mu9=ϭhTuOAm袊+R¶Ay޹?7Qsv+YUQBR^,h:Hj)j)PvÓؿO}8f;G(HNAMVl4 O"I#6wLZo`04?uoG`KVsB,~ 5*x6YOX1G:V:c7VEZEֵX9EQEk}_A3Wtx>b;ԏ:G@OMJωкօm6{?:q}kiln'!O_T|Dg8ܣp?Ή$cI!z~8eQl~΀v#ڵAEb+y>:o]zy/SGm>?l,H#x5%V6srKu]q/>=O[--(Xgwְum -V3Ql ""'I! 21P7/!>j r^*[o*Ͷ\e>ẕH `t}?-hr85؅8⑆GFTbs=i,]-I7uu5^R{'=1Et 2TKEQES->`̟QW|!|\|%iKk'VQ\k&ǩ[ ln,?㧡*z(vB?ƯQA q^ ֞c ’m"W?yˀ&cE(Swv\Yq2N?ƴ`ӑ9>p(QAKU<\*]J=?]zU*>C ;a}ZQTu+_O9?ݫ4QEdŘ?Q.uǐΨL`36FQYcOB?ƬTsJ]YS#պ(}?J_ jV֖RxU;m,{5%ί}h=?! yZC8z+x`5_p9(Z`: +kAccEQYnvoPZX8j([TվgSN{g+jڴOӟ?ֺٸ /܌tM)/ߗ,iO]>ԫkt=4|&.0\?~VQEs(!#J- 4  WCڴrџtOƺ(u::Ud?USx >`M:}OXIej?o=OaQx_My}NeesݿuQES%'e#ڸX}nKI߱krxq$kvzҵy|Դ9kh!Yap (fTRBIYR ?Ɩ PIt"p?֔aI1Az~>j[A)H8V^Ѳ]ZXGvQqO_[XSE=̒#6{bo?AZS[t Gf[/e[zE2GkfcB~o[%$x#junOnjN?#~8R\c[%URY a]Qkeﱺi#ႎ{+43}:Q+׭;l2JQՏs/irhO?)ƺ;U!n0xe{X.WlѫzS~ډ60x#޳mOu?zuuާFpx>Hʮ0" uJ7ES _"t-\@&PYHSW>SQEVsĉpe;WMᾇ89*VhRE4(n FU>2i:u;` (Cj3kF|Ic66,xv;N:ys+ue$)^E|ǭOPs\P8JYl"w`㧽jPUkĴLQޛi2j3}>_aw}kRM#L, l >}u1"OAWQEW>n>Iqf&Kx$P}%żwPS߸>nt;&l xa= u+,LpERe4DH?kow_jɌ:7-]#ps3EZe SGZsEBAG~v}6f jE7)N?5T 6R㨮PL2SvUC]NA[,6>d ]R3:VB3KHJ=EeOcnqnFx8jzd%Hey *b!0s%a+ޡ#t[&Q88O5UsWE[ZǕdebH簫:5u3]eQE5or9CVW?kKk"}?+ae5h22z`y.";@Vlꭾ_OcUG}d*dM +<8a \fu)$ 7]ƅ}"GAgɘ|ӓ,=OiXjw:<=Q+M[˴(7n+Ld[x~'/579;#d'UF{h]Uj͌7o6*MDfR9Z\w`:XWnmx' [[%cSս>jjv}`>dTf2CΜVk7SvHUecBpe;ޑ@R2AߑAj"LV _] (ׁMs*p3u[jsԴQEZ--QQ'ߑGPk9IjǴbK}I*Hui\Y >@);>MgKjFHO=;Ui빾5%X%NFlr/'ZТ(V6:"IES]4gsQ}q3jZԗN>X=*جb+(v]Nt/,}{՚jiVd.$cVצ[)#Q]V,0 H`RXL]R3=Z;xTQEQ\4ߴ "M2Jx+qVUУU=p-'ݰku`|Yy[o`Y}0} MHΨI>C+xihچK)P`~ 5Yi6  ۓzU+}VG +.mL)5wW2;;YQSYփ2cjQEQEQEPFF Q6ؑJWu5!dZѢ(SPox8G*uLuEQEcvfnߡ(G'ߍ ظP?@wݛ}&_\h\O+oN/ {_{Jfs_,j{k^??JYͥ%͐rX '`pRGi"Lz`9e$SV ,>8O±uqmm)VS`ŧ5Nx$s'Isif/Ddt#ֻ?Ɵli#x.P=;i#\1 '@+ŭ*dU OSE2hc&dW 5j>Cs/{:x;- C7O3La9M0$S`T3k#Yq ٴN8e?8.,WHpcz7՚*h VGӮ6M&G=iGk -e\Soվ5*kDq<_ju% $(YկlK?:QZюeas?Tz\KVܠwEVtߴ[ a6;[jօhX3򿿡JI_CaikJW,66gaGӬ~8˞"Lc cNIVe.  oE2|ڭM"۳Y6JYfxryxzCW֙i_y{{WRb4\\}x̶;'\(!BFTtt(iReߍѓهOk).6CK >u5żwPS߸>ln4;*\޺r0x_X=ʟ'[ ^2c!?5Z[ y1DJ=`=ctQcRkZx2 giFhRv(nl'N? *Homt =nmn Ilp;WMQ_G!&zwl댞lhT<}*E 5V }~zVWPrCUoᱏt R0xvڈ ֢-cY$.HA=}Y5տY,-~SSt2?P=֮jJVHfvA4?A((^}(}T25 ;t%A= I%ctQ'&xz ۘy6sLb]aPdF8iAl̉@76Jaf xhZἷA=c+w\,  sz`R.䓦}=+ȼțQSs[p'$OGPEb^CLɍZd~GbWZk$VO=T4XzdP#Z"xAyzm9)n5Yv [nP}IjZ( q#qdl݀&li03U&{AsJ[ڦ֑F;u5Nme'տª])DdrÁV(>Vta騢(d_j'S]SV- U[}'qPbgU~iԥ S &$ҍ?1tbt 2f$c$eqH_̻PC*zlѸʰ\r}k))f85s(kh+ėf~i"igP}vL% ᫦[ Nxʵ5j *=<ڹ7I׮/=vQƐƱơQF@ uޘ Me{4#&d((",nV{66<O)ۓ[ͼwp42{wgq%o㷣 ͕n9t'ڿF'a}j8o! FSj%K G =&`6QX%su<[p>GÖMѥ_+^~jۺXG銋]ҍ f@9^ /Mo93-⃁O_b|4Vi-ul=fac@UFS([j`ȸz}Gshoi-JOnS?Y.Y6;;Sjs5FF R-~Uw\K'cJQVՕT=E2h#"OXMoɿŽwQGqR@ f979n  xQ\s{fTB ,|:(UE؞WmȢ;U–Y2@s|h#Pt{zJuF% Ԁr'Ykb@osknN3K7QEQEqv䑷:n!kdhRE ԕżwPS߸>ln4;*\޵-{[tRwƳ)"?B+[jWv?6=:X?zqGLL&9Wk RzvjxVD?+ +q?[jV?4yheE̱5-J%"xV"~P >zEZH  fk\1WKUFs+t jqz]?ȪVR2fu$!k^yCA\ݜ2kz\kWʹ{U6fyCkN({tw5qt+D zj>Dc ?kDp} W'!Eg*c9oZZA/߉s SF@vFEsz,wbouE\+ݣK G~24e*܊z s#Һm?R?W?U=TN?#EXEtAVE߸A Q~U\sm6fݱHk:BmF8:~ٸ(u[}Ԑ2wGaN%D6(a@G@IA54/Y~5_@OT->5&iG) ߐ~d}]jR;arA{ZuBܚa>j>EQX/Q;֭Ef_q{_SXʗh9_K_hiNd_O~kƅGSY2^ŐSE BT}O{j%L:tQEqkkG0uExS]*)7'ih:<]SPfhX_A+U T`RLdd,_Wt!OOe((ily~xnGǑ"B2s:/6Ae#k.Z8I‰><[@dz{{]jn~D?VQEEsjGҹr[~V2iIuHRpI5 m4̣8gw P)%:@Y|&o`?C[`[rv Ok6>f1\0|)a?Y>ۘ.? m) !0eH "((('\0taUh.gӤ'?[p?IEUԭצAC{G늡k~Zh(֠c/hOVh({[52D*B~ҹh,5 eg7Y3E szۢ(>ΟKrѳp}+Σ.-y2`)cKXX[;C&nf'i=}Z5UDTQQ=-QEUcO-n:X Itٲ2Y??k#?v4LJ~zP-G O5"p0'&lL[a:{XΥeſLkix=֭W=|6kޤ~v(CWm+Q[WOOqE{è'Zmŧ5ڱp +[dX0M$ jwtlOn?ZeAd6$Ӳimspl)ӯZ4'ZkRoj n˵xBrNu&|6ܢ OsikCzSST>%rQEt ;QܚȻ>]c s\tgs~GDcPڟL$3OPk}oDš< 55\[v8zjipyӵ[}jswwW"5 F~{ؘ-0oj ̖yz5 j|ͼe^Gap-Jlu]KT$E(Tn?`V]&zV-Պ3aVsM0/eii~ UDqf^zWD,ӊx~X~( u#uIj-Bkr(+yzbY8?OE6HX7V5ܶ=?ֻ*l,H]ym?OX%6볍еt[>5 4MaRQYӤ`p?`i|jҢum7[ڐ+5=L7"1>^RZIrG+RMF=:woO; 8=Y((iVT}rW)MSίm:ɦ"{1ոF4>Ưhh(+mc-23_<%ᥗA]$m!A?t^ + oce((+>vqm|h[<o2U%53 O|E[FPUA"ohR>tZӸOj?}̖VQV}0bsJjv }Sů;g8?uKI͇ѸzW i-SfducnΠjޕPWH.ӥt0411I-#ul-@JEU R.~^T O֡[Tڿ4W~5,_jK*A#Db{ ɗ_w@zykҼ=b-<ݠQ?[4QEQEk>éۏF@? 99I2cRQP^Z{k%*ex?Xn崛-WpE}A}n}G?Ki7,᛻'ޖ`xdV5ǨEԞ Թz76m3*1zVfteC ֯QX۩@պ(_Z%S{k+NǡF=sM&(Ak$G{w )o/+0[аo%F\>Y5܇&:+j"${[( nbtwe9a-x"o^#pVDq3$jmM*AzVVu6S+RCFE-+6Xװ+y}[+qמz(S^G% Y6{5cʣO=fjZʪ =R)F?_J['95Qoe&]}]&O?N^Bg >_/&۸\/Rү`xyv:VE2YHR -&}xhE躵;EFnn+Ѿm6jZ=fՎ$iŸ>[/a~CŬ9[XZFs"][o#'G޼-ϽHv?RK~c[[-'r:~?j[|d @[S?yDN pP:)hS/P0#]MQESm^BƏE ebEQEejlIx?z+7S55V6lvp=;M.h_ƪ,|׫QƱ UEzEH2{~}.zmnI0]x!2AwK^F~U;IZ *(Җc]!-#"/IhBm ?UN׭ǝM֣AHrGq]:Ȋr2U-NV_{կ _g3,tֺJ((dGfIdTA՘V%ψLiЙy0?~uWY99Usv1KXv©Wːc}+RK+"Ϸ_}6_@U'/V-e~vuSաx5%Oo7h鬯tYL^ֵb oZ4QE5$]s&LGi=+ӯ4+l j@6j]ļxsZQE+}PE([UڣtWԚ> ܰnUO}}A}%iV&쿇[ZN461rv#Wt00((:ƞ5-6[| =tƱe{ XuV浟H觠WEEr6/l|\EiixtF2Im*L7ǧyb%ꐾj7sʆv]-QU5(ZP=.o:3Wzm}+[Hlz(Hcj(j4!Ad'c|m˸Yl}̐=xuoziK!O˟W}Sx VU-J 9aҌ {:;0;b@1=Ʒ?]Gn$/zZ.46M|[ό Ǡן;Ÿo16B>XW-ۦJҭwt?yK&^r mB؃?׺8>RYn 1_NKhb%ik[ټ3*N872TRQ?1_5].sLNGӮ*T8REQEuVӨ2A,G#((Y3nq*l->)VvS/j(|!^Q{JM7;s",jFQEzeU[6yF4h:E'.R=ҷE8rDFY&|j$ps%aӲ_DQ4={zآjViuQ̟QW<5}%OJf dڱl-Ϙh{/һP@ h(x2M"qX+NI}SVl'jr-Ʃ3* ?E[cFz20zWjxZz~G{\^K]d1SU [ĖzfcSfΥD7k  tw?5%M_?V6"}r$md~6g+F($I Ԛ¿ԞOقCpXuo[Mf ȪYsr| 3^Pqע>?eEQEQEJwU-8NY5%&k[QEQEQ\f:$m~#.m#C)5%Gn6ֺ(Z7\7 +Nψ浓-c{aYbm-s~"0YN[Eo4Z+HkMVK^5Y LFބR@ۭoUMw ;mQ댟Zo2B[εq=H讌+ {/`mW'nW?Z5}^[Lҭ88 (UvGECJV|HE'@ֺiU^;\0_y]\۔ VT)=z{ߋ텶nvcw<7Iuu[zL0QQ)QECs41V0#aڝ̍%#>o1^0QEɥXbiWҭZ=¢GSb_?ƴ)c$}f׷ROlUNJOz,2d7^1\E2~ջ#WdSe(tc ˽6h,,#\˼#Gniƭy\lZe8G''P<7w[ʩRlmϏ{omVve'CqYSE%"X[̉Ժt'XۇѹuD_b1VAdG {8.鵏@5ϦrsxNmKTW.n"-6,<>gեEVM:=!4^LzU髦X,Xcr (*93$,h;bk;ZlF'G:eFEgev-]me-*QX~(ƥ;*XAe+/ fCc+^dG<-`\5̉CG[JDFAu/\ڨK^OS;(4?C~F#W cHG82ǁWq\oe<t} nXjvgEQYz.34,Hzk<3ޮ: :U4ˋb^*4d;n# ©xYq v=A\16;0PJ'$9ԔW ueČ?jȰ;)nfPĩ Vm\4 >֜hZĩ oEOh+31j"g<s]-Go+Dc\k'ָk ~kΣ_(AkUTEEUREQEQEQ4ioç~5 @M!%Nf*~i,Xeڝ[2H jQol~·t{w<?;VXr5HʮX`W}m&y z~d/H!Yzmt0HyT>DZpB1)1㧽kZpņVFP)Sd"{W!<"",OS=g;-KYF=H?Jt]GJY2G׳}jOK[b"R=9"p!}"/u@edLd`V֑;+xwsyo{O:j?{) ֢kƥk.W˶RX?i,\A4h tQEQY/V.QO} Կ48ETtvA0W+SiϹFZ@:Y2kTN$y2C~]xG'n~oumJ&[k,Dg#|9f ,kLϰx-m5K18o)Kqʶ4iя6d1]-Z`cntmySͼLJ:`KCt6rʪ.N#GGs-^Vzheb>X\I8Fe cR=%~kr6O;ec<?*n#o֥sHȮ0zUeӠ*}2N jcys[ܘ WԠ~х[WWV =A-WC_;T~n KEQETs$_U5bx}?[c }"9"iu=k8}NV@ RH,l20k7Ek M%?,oZ袽2l,Q4p 5Mu pv,mz1*nO"ۮ7/ou:nߐcv(9Q?ϥj6pwIsW{EQQq fIXwcğ^2ݝH;*ݗ/o[Rr3ٹotl4=51m P}Zu b3HcGkiD+c89?LV! E-QX~t?_hJӢ,m$GRk{bɄٳ-21jqԟ> [e9,'տE忓bό8\خS+9EfCkPM=#VOEQEQEsTPSk'Ll<VQHJH`,Uϗch׊Wf1V  QEg:b^"aff Id- /UV̰Crz8a5{y:xt<[.2Cg+OJC4~SjU :Ůnn+{Pƣ8ڬhioڮ;@JӢ(SS[(dž}Ufl[+ׯdԯҬ8oO=+= FX"Co9ϥkh^E瓧Jآ(((3_}vN|6M?uL6H_#h !|V4H1_cgQs#kk +z?k&܍PVY_dd*OTmJi_.&lF~NjigDiyNz(OKHjTsM,5=ֻu¥a^pz}~|Izgs\l1cZv}ccCt$aW~%V- 0:/M3^KfR }OU;W',w.{Zq ɬV(r׷^]^v_vP \繩j,rt lZ[FSQEUK~Z?z.,|J0kv^ *q|6O[{i *ψIԥPګYjm:̒ t:jZB$nWDEr]j`QsՂ{l-Ԟ5[\Gu>-QEc:-|‡}O&l:@*?5QEE=6'c_V5>=:e1nҮX>AqF5wZwe8kju} Z :@:{Q\杪]x~ߣ3E,sIJ!1Vv7OQlUl\kR((()  zYW"/%c~]+ j6 ^b p5Yu[g1[FWxQU(<6?ֵ,k:ؑ!QGv?[:~+AZQXljltpQι GO&0}ku?tpθ3ڶjb5KZ?yV袊?'b\ǴNտQ\\Ek V̟AX$W8$*[ZB#p;[KInj[4w/,FOsOν^"(gާ/LEojdž RO* ?LVQEQE7ę\V\ceN (*o~qP8u}k ee̷''{,ྏt-zEU;>;,>Օg}67ٮ=GY:FAVpޢFGOZ08IXPI{W:%xye\ǻ/]qQ4iؙ}맰4#n[ګjƿOַ5(ccEi o^6gee}O?s뗚MɊ ³]vkqf=wVֱdSO]JK;eQ$LyTAG}$?Ҵ(.᳄3`u'W;r?k+Or}MMQ\Aջ(8 V5N3-1O$-9^r#FMr7,. 9?jJr޻ -KP^=]eUN%֠p,_Y ƬQEGqr8ӴY۴g֝!!A$sT4gNU |UfC<DZ  "glPcrY/JӬ2|V =}C5MN/1)i[߮?h_ tKƞWnB;tk} @ѭZe-߻.OlcBڅٻ@Oʠ`=mQECsu^dw?JuXeƫֲ-.$5Hd!A=?MD%6 VQP{Ie׵;¶]џ?Ҷ6HǵrZ;帶n;m ~mB'UP>qkWԤ=}}ϵZ}I>=G4\&ɢIS9aɌING~1Xl~u Vmw}FTu\Dތ6:MI~1ɑiKGF)E2*qNhU;Rbi0ɂ e-nE i/S$^{+/\6Y*PWSYxFFӡp0݆ӑM-oMϛIp\/_ Q򩨢(iQ\n Y$yIp?Q5ZwEO>&ED"lq: 4w78?ҷh$k,m .R{9Oo?]U!`:>V >34e|G`=뭷ڣ4cIheX`ϲHBGWTԂdޖ+?U0!^>mM6aq,'=7^w>huzEb9p6_Ƭ]Ai<Xkrtv%˒~W|u{ g`O+m4BXM[((+ϵVеSHw=_V:ȊAVw(Ě AEe:Co9z֝R}RʘaܐT[]_x^){g9<dRc T \+fxLSkz?iQEQEQEQEQQ\Zt'$Jki M~}dKeY$4\}zҖn#>Eh,s.]}TEUԭӧO%2Uoﲚܞc`%CQѽ~Z-8+VRM$G'{xQ.>ţC$jn_5wFLQq0^J}OcEDP@FPT0EsvR۷F}GZhfc/tJwy;<5W:ϙ!+ dt޷;xq(U%x˳O3e|~Ui\r8+1y-c?fr?d2]dKJ((+>nq'l1ڨ֣~G1Wh($i,e$Pz2+f:{7~a=jƝ$Cw鿢mEZ+ض8èh..4{&`Z"z+Z(=96 eAc᫫k̙Q[rǰ-W^9hӜڴ,ty#0ڠqj (?Yboj_@,W@FbuI#@U(GR 9A [ -yp?jѢ;[wV \Ɠg'5Sh%{c]٭I^Z,_9'OEQEQEQEk>éۏF@? 99I2cRU]J>Ux 9ʹ:ayF9$kDgF%%FFN" O GY6 ?\]BIMSڵPCLwaW:uVP6O*#SYOYd+e ދG`= hAT`چ0_ζi0n.'p33X j+(bF»+Hm>9>;Uz6G_J%Q 8UQ\~u&"$@s5ik *N6A! TϹfoAZqƑ DP:YXIܬ:_©hzƒkh!Yap 2ۏm0Wb I>% $ZuWoa{OcqEH~$CGX}Ҵ}J:<JL(B"n1䪴- _AI|9 kPM;m/ 6q֧0(E9*ӡnK1ITr-#+.F9GQb)y/ퟏ0)a{Cop2Q=Yty>e?sƟ,76D`ˊqIB8SWOm Seu=Yw^Yʞ8+6M?\Ӻ1)eN.m}Y9*ROjVN6]'nQfrh[qzJosCdX74۹ D9:UqqFsZjN%S*ڰ` A)hb6]'xb?C[Vڬri;ɍG]WWeGA^jsC#֮Bn$k˦"6;A/ֶjJB/a* dpzzGZcetp3=K*CH &ho{pSOau^[h\n Oҹ뷑_IIVe$t {]Շn.9?ZlM=6@ uc5j(((״ѩRD2\ɉe?<<{[Q\gQY|}~NK}vE[0jnS#Q\~/+=-\Fq-fTҺ;R,wjM ?Qsa  XFy2\jm*B }=z.mT_?EQX:fzjCAR1ڌރ5LAW%ReGefg$mAzSmlg77$ϰH"(UQ:+`5n`6'9f[XrrH VA?]QEQE5dlހtU$2GVt4QEQEf:<ֲ`e]!x{ dO]7 !pø>5T76]cr;禸ò3w[뛗geJ@=>v#{`tİı¨R_NŏQlSު0$z],Mݡ/l°-MtI#T%\u 4AkC@<^ީįs}O[m<~gPʧbumJ=*Pltf5|Zevt^Y,+33]ZE (((iReߍѓهOk.6CK >mjY?Y!.ojz$S2z.sm 3UYbI>U܍XW^ l=V8!`1_ 6N8o&ѭuIgPqˍjlEJÈVe폕z $T`:S+6t|QZ^-Ad@:`8V\ޟ-(sQ `ϧZ5 PX=kK&hUc;AtCGwrNv|e'bV#^d'7.emCq齲O*V>*?f~m5k.G{_:tXEґ?\շt[\m._?♨[մCtVhRUOkgm3~T ?cT=~ lI&U}s}Es8w{UjbTvbiFժ+S lwx95m`xw19N?ZҢth =?j$Ge㳏Qk܇ h6;oxZQxCRse\|o2m.1+sɢZ0;J< k.GRi? 0Vj ]s8ս@4ݏ c!~~g$rɷs~Ң,h*P0uK&?ļVTMթ/n凢Dmd\Dw#䱬-6NB B9U T@+tY~cc2jqD? 000:QEN>&NoDH.{}kf{ԱwoOºxdzz&svNd$]ӿLۏloXش{k(x!]'=A'D[nS=q՚((((YG@?j֎E%Q uR2RR0A\FMߋPL zz֭+kY9VǵKQ\CwA:^m}&A.`b]C$ќ>ѽU5n=p*tZTQEQEQEQEQEQM(B""o|-ct 0+p^, :Z9mĂ㏭g:GMnL#L$,zv*{WO%TCk:\<+@˵zcgE OPk=Nηf1[6:WB}~v(Z}|Ia?4girk#N\ua*phs^䝙wou`PjZ(вӧO? [t oWhpy:jIҴ xxJJ쨢(*l~|V?oYY!Ch"?SQEQETsF9:ƹۭ.Kػ2uwk9?oV$Hbi$`,yγO=E`n_KS"C܃5lN~i-{՘mc$>v\lս=ڈ'uKXH( nzқjj瑐3YwţmkczT]<ۨ>uU?lcNZТAgq7D.?w57t_uWMn}ՙ~|:k0?Ҷ((((QK3QԓY1)+ng(kl5 }R-O13nR{Z='EHԑϷڨU :XMZ:?Jr+ע[O%_2骄1C?CZTTs-d[\xrrdsOB=P$p2 uAv&HtUn知gYE~'yC8(%HnHVyԺl|OG9VĨx+yisDok^+^Elͪ~ ծ7w*]_o͎ \9l%1[a= zvuYtՉ#Q)S@(j|ϟQJ֦K"CI!(5پ|pڼZז`GGSV5mE4<0{Kgs}>KkVw`9$;kml{Y-oO\+1ZstW?yn̡Oq\xb᧌>]Mx'i'Һ+ķn0f~QC 2Sz*9KZ9Sod.>YEt<($*z4}q1~g?ҵ([ FLe+}6bQc'OqW"uVS0Ȭ۟ddbZmv?Zѯ.9KS򓑚ﭼCc9 #4(M$@z9Y~ MCrƮ; #fy; v?N?'0NT ? Fif}0Do SPZ\Oc+tݙ#%:j~JѢ((((((=k$W:~gXE`8eN;V:f-r-lVoQ67`8==_"T¡%{֮G9Ƶ袂j@z7VWQm2{~h k1X31$Im3]d kh$բ+e"9,|iK[ 9G̋"E F:">+U?ڹ)O2|E?2kzM/!vZ0*"2JsjX$*zjvrzjj(գͺ1EnOUMxh0`}Hiwڱ1 gZWO#G?ScӭC\ŝ)9PjθOkމ!y*Ez]RhW?) Oc}BO/O|~|V?ZQEjp+A1*e KE`? QY%VrEn| XM?#| عL쭱xk&RִyV?)v?Λkg?e0K+*0q3EXI" 4)`GTJ >*͟¶d#!Qj6\EWx^]^>|u,G!ߘRcGJT g3C!KFs{W5i$Hp5RK-i*NH3Kͭ2~~Zo\GIr24{G2w?,:e!O5~Xcvȁ9U۟o~YԅlkؼApe8?Suf8(5* uQQMq'%-c*2q=iu5wك|=3^ᢛѬbHeA'hEjz BA?߈pLG4g)"SjJ((((?Y>Ū/q~#δ. I9GP¤*EZ426> lHk =R+HŞ5 =#\Ѥ[5RYGT[zwQn?jߢ((((((WRqľb@;'bĺNQ3l=F<*~MZ810GojơU@*ރawb\~+7deEho<ҦvWkKՊ~O;V-5m2Oe7 {ڵܨ2AC*z\qG n=T5،sEr?SEu"\u@ks0= 'MU>q+V(WMO0x]u}_g걷(|kg:~e'#U{xf(+oW<ơ]p%O2'CJEscaOpkF(((.!2q5Ԛ]6W% ?Т2=mBf[Xգ+o ƽSk>6ȏ;Ӗَ6VZoU_zj<:V[u긊K_vfק/BH7KX2{]PK5A4[iW,9%ʝ595B> rx-ܓ?ƻ6 >+{|Q=:_Z,_9'OEQEQEU{{QoOYP*\#-vgLw;[ֶcDԟƬEp^$B%m~#-#&OC# T<%1.,\Of֣"p0'&hwE-);^E}GkRA$8>ʱ5A6;r{n~F\ޭb/m ki:|wS?«sQ<[[d^F(o:=18=TOy^܄!8^Ks_jGl#סiIxy!OsW?} .ќX֥QHJz Ki7rw[wl]}Ր}+"w WÃWK ;\2=j߅نezI\69ֵնC#'VV|XZݩGOU{tbpOV58lCKX ƫ/p̱ނ"@TtEQE2hмg);en*O$]R2+tY20R2'\dV22@>'KSj 8V-Ɋ+)?%AYΈbeLJE&iR|܁R?gOO.TQEZ]Z:c,9_b|ny9__o_4ӧ?Z|i(~*GJt&T2"lg$򜎘Y7 5}5mG19 "]Sĺ["C O$%?+r)1$2$z20 "EUymgϛoo?gOyMct\G8%IuXgw<[ A\Z]me[ S~`4C cQ_p+=>bU2=c9?Ս6wlHobP|ڵ,G?>ql'n2nG4s "4+Vњt&Tlaһ7ݿ8$ZQQOs W ;on˴{UOo6BXMO~c.hK~޸>];LN<翷T.&{i:=>%#)QT[?iD>qկjikG?<_2c?κ((((j in#(Of+gky&ʲуzߢ({FMRԲ)wIpa$J!?c+b_m`QO1S]|AL%eZV@ApB׭z((((((gRue9AjSf'ϯvv;R%~RG}鶳}9{׽ME2Xb Kȧ ƻkvh/׬b6^?xmǜ2zDh뻫*~ihgt`?³-'TKGUQsYCK&38/@o\[aPKif9sZؑ}?o7C?}?jEgWbg9x-~ǣO~搝_?t'?ҷa,}G{@Э6'Ҵ(NXPuT6QbǓʝZQEQEQEs&v܃c\Ə~r2+3Rj‚HNګiB*rG zZN&pBA7JɆA(=T-JqBxڊKj`1ƭ29; Ýz|-$/o}TV+mb߶Tŵ{ie[䓵IkN|Og/sj<# ZoڮЭ+ۏSh׶$²u4JgieS]C$K2h((W:+̓UGF+o>V⌇}ԪU [cT_E%QEgkjLf7FOf?jLcJ$D`~a]b\ӼE w#?/Z2la_%r=ts~r@:u~KNn`k:r_}м>r菨OaNr/h*Tg?z͚)th\﷓3Kܢ;ZM*F0S֨9(*9!&F F}IӠZvT0zg]v$QlHH^~j(+<5]?VмYsN4e_bewʓD*rVfYKn'ۿ~OȅB`8עpY,4!$*z\a܏㪧a?ʥ,FIG彇U0Ҟ7q5m`xw19yJ((a-)Vyǯ]m˴o3y?i\}ky[tOOAk".ʩE4mm/A>^ EQ`i2~HOXۏ&hC~xy?RЀƺ((t}FTEsu߳U(((wYG.pӿ>¸m>]N p[w?ºeD,NFOcƭ_`|Wo 7R:Zc,wF#i}kC֠աΣ!sqboˆ ߨ$tMˍm?=k-]E>5KoWauX"'˴'$S "?3QEag% Ϲ=_zd#֤/6v=פUMF춌T~[I`eB34Lr;giU1ٿ{6;֍Ԁ*z(F`Yu&!BV3? ?+-WV剎ڲ奨A濿ZꪊT* KEQEWKy4/A.V@?;h"mȡסdB SEzG9y]c9*ĒNSbjγs?ɭCJsbK4ֵx 7#Uw#$u;)[pvPKI!'U}66:}iQE⋯hSpYH))=]CL |C4Be>ke#ꫀ(([F0*Uju=OLnzgou=OmuKE:Ўƨk׭I~ml8>svU)Rf(P뎧?ҲLͨ\#S[P$= K;U((+ -,>}w~brorxSXĈThkx`Xkt"؍^{Ӵmw"훢7e>î}:(T>v*?.C*>p. 2yj-nR"~#QEZ]ZxֱtH nSϥ_1֯Z%3h:t䵴dv\ń_ڿH{ {uQE5$BXdOxT Mٜ?WRu ǰ b\V4(GYS8̉WmS9Fδ[}+"?WQEZ9AA~_ʷ<% !c'2A·(((&a-CLWis@{z((7_$WQWЂQEQEQEQEQEQkO${%t9c yφ_OkR+c6ZwJ>V98 QEV]­u ׮fY!`XO1FjR#Ov_sӦ?¬[xݖ;C:Eƭijyrm Z٦m5OB)ȔqWfm%Vѯ ; BjܣYq+Vį\F _Һ-8!IqOvkhۍQE2hItu*\+% zc J袊(/O5@?j׆Q9((j:e~U/v=<Zܓ:Et@fwZ$nǯaW-K;\> GoZAR5wo:Еa#Q| \6һ>HWpǿ$~5a}0oUCo|<Ű t9#_zKy~NՑ*}jO&ɭW~?֭b2q>ZUʇ??Zjx[K9?סZ@0gjdlm[ZH*3#?ڻ%UDTP淆6MҰ|/2B+k1 s;n7zm\j2Y7MfM;-".IvRCy!D_UnV`{~!Ҵh((5um&kl3'5&1ͥNH"^0z?0?xItu*mF;;{nCs1ss]>2(c-WuiTcaG'hQEbx7ijq O?ҥ$6E 0A7RhKp{} \l~p:{OZirP CSEq;Ų@RU]?Á6*-1m?m?G!k&(* H/ đcz-Rp3* gy- yvW3g*uIt*I vTzWff)/`=OTq ˷N:/mk{cz((+je^B?Vm5n-k~,9s˷4QX΄-[z1sJFyvno)$E:]*ʮXeOVtRɥ^s ~] \$K"ȻHs1qM7^"!z~u;0y~ OVS|mVH'$c67Fs4YcxRN@rr~qG,c6G;БZg-.² G/5Ug{ pXf(T-Ӈ=:inӛ-i4x~M}Tbks:ƻmi{ Ǐӥs׿ Re5EvôA?QX6^ ќ.,sak;SD0ˎC_\][7"6C,m!+EKV jJD?qV~ڝy޿WkEVvl.48ӿ2o2#}*QEE=VЙfp;9,Z؊ R9e>4Kx?v>k:ݶc3}2C8ߎ 'no?f,G|9}#[[ JMi|v{W[mcK&i"QV "RdV.a)yں +c% q$ߺ_ǯ際,"iVB?Xt ]KTarTGxY1VE܌=T\n;:2(?A]QEQ\Gg~n#*+3]}`9VoMEQETwZۼ8Heל7%vOD_SkfX\*m{=2ܳ9$MNۮ֎5/ANuSt۰\vzO2rT8 c^cjeխo }.[qzWfC)# NEF]1ҏ76PϿVOqҮj 4 p*?›Z(o3}MdxX66?;ǧZ~>:bq#^UMF춌Wc~5瓧nQEU2\ijQQg\M[QE7JڥI?YZkxבպ(((+% +n tCbzrߴ@Osָ5ε#ͫcI=MueSgsoҊ(}7T62l+ K?ZC|a֭w?0붞~MoZ'k VHɒLװtm]4M IÏ\WM >N}2Ol?i?KO&OMfi6k\u;vĪ3ְcROH:ؐJkxՋeot+yðjٲ0MKiPObB;pm 1Je=eR2)/mucjwmǍEs[Knȱ TzUPC]E,@aï EbԽ]ySk5")KfD5EQEQEQETYm/ݑqCuCON6bW0?h(_igo2E%GͻI}k[5׳;EG!G'Sx.~xۄ\=*|yFNI7pYG?J(wt7mqp9jµE681gtW1maKZ@?0p7egΕA+?M:?7t8:gS* B/0D?o_™ ~?i}7o7tU8J3iGvG&|yG g'O_7~[9`*9>"[*ld?Y]x7th9 ]Lᶁ!G(Ui|Q E5|P-iЁ\Hǧ@cOX˩1-t *4@Ց[ f>sެ|L["ɔz fR"_wŮ,b`cTSj+7I33&ګi%/jj(٪"F-UZԕ/I?jڳĝ[[F]%T3]%}u q\2Xd5:} 2?V3p]}T椢((+kk&4w aˎ_p7~ ΚSPe35jztVmTޤץlk#K]]0GO1i*U=Y<*˟\ٲe*Ңj|zD c&PX֒'-Hgcz_&Y3jIMu ?uZ^V8 B(>8?mc>с EQEQY#Y,Y-ǁ޹o*2qʼ=9`W$tk8=&B_AY~y&GQjCH}36⧂Jd }p?SM͗D~?^3)ӼteYԣM?#J4Q,4el?Ӆ15Ookjb(įBT.[, d t.XfP;N?1kA4 %EPy5i+og/&5ҟ+{jּN#V=qmMZTRi74p3QEbjpkpNO׽YFFEVԓ~t?Véhsfҵz];L/W&]h#nNj4!ю/m̑/aIh-In ?µa+ "f23z}ƫ0tºX`!JGaRQEV=z0|0ݎW[gjV槢(] Ha$Zp16`M>(՜|'ƚu~Onɑ`:~'_k*.Tc,~o+w?\TO;:TaKz²]o5[#+#[5Z!e+rw9b99=khjl1-E>=LcuJU9!# z>5$;OF kB GPa>V°uSl{{xTttz> TqZ+m1ShB/N+'Y'^*tR bW>ww{QL0OOHw#"$jG@)Wi&ڞ9fgnz=+P7/cg5i^%tP?z=!j~##d:6$2O$~N,O+֏\ϨؒZgxEQEp=%IRЫ}Nd}:V|>0*:ͧZE<'P8(Z5sĩ$Gr?JݼF>TlmoY+FlDHsLlI:{EQE_i:]$V_?޵-9lOaW;SڿgC7ǧ>ō#2QV-|9'hQY4e33/詧Pr?YyG3ZPdocx,u]Z`]f?AO,;o"ſ@!gڒVռ+r,[^ WGNzkԺDa.v'ĺ,~z\$ym$&>U#6~vҳZSձd#K+ zT+1SSW<5ak?='HHPKMf\q'?t~5 Vzε_ϩkwO𭕠 7Ӣq#@SyZ_¥8oι [9Nvk*귖RyW0߈Kkk2Џ¬QEQEU WVJ'#}X^x;-8mzrQ$ st?_/TKDw$C֏ Iʹϩ`~uGAc0E ySaW)7rZQX^ #p?q n'*@oc5i2MV&\.h֥*I&4dg\ecbⶮ"7Ӑ2s jٲ+^(* i'SF`{?,I۞ַ?[Ңk:f*.`r@ԟZЬ$l9?" û`sox*ɨ\jr1 VsՏk(({xgΤO{'3{VPPHX'lCiEV+E-լ77qqW3{%Δ>&LLsV#YP6=U[o4yQV92׭(\[}cXQݸ+nd ?~fZLZUA=I8ʽV(F*J(((k\ѭHwq{A\C$ԯeS*'oėwzWOEd^i`"{V=KڬN]?J ]y>B܎?R]3:[֧g$ʧ*Үt#xH_y'WZTy"o1'WZɏ B%JP:x<[)z&74îx_ }x;*aO^c;Jiӵߦ4sM~d\8xnO#dž+ Jx՘ܿ?¤GXY7/t`xM2X~f+}3W{haK ?7\J[[t/BP>d10T^I5}$o0u1ڼ-o]WܐR SvA֙㛛 "NGW?s%Lrzw+c.䲒Rsow!N3ܶ:~[VY6J#VuQEQEV~z-*G5Wq7=]]QETW1yr8-2BU{|٤=ε_\BU*pllNފMrW-Tdǵ;rwԇ<;&?nW?߳B=mOmxCO$bI|ߏO, KycY"L)Vv{G{W=Gֲ>sl=O#$Gڴl8/#>ytZ.cQU(Wǐ c@qqXɜTqUE!P ͤTfKgɊVCRmTrt ~F5kROnaʜ ̅sϯJҵ8D:I$r:֤wɗ>c͠uSm~yUEQEs*"6Ve<5B|ר&[xZFzͱ+Nx#=]& U(ǞOp̽o:i$G+Vhͼsӓ]jxmw<ǩj/f~.=\;Ki>?BĨ=r8a5vvo K(+ÿ O9Ky l(Nvbq*L גCcV VJ\yb']~Ziz\X8#؂ w6WۉlSk?cj¤Q>׼  Ys롎(L{pihK qup?WEc Jg+V((=IJ/CҹFJQ!X#YM>KLطnZ֗D(.OIQEVVåEbK$y}`iz5Ƶro)yWd(TQ`T55um&kl3'5&1ͥNH"^0z?0?*OGn>%g)+}r?^+b) 5iKˤ=HSVP@#dkcrd @ASЎ -%{C*}{Q#$-X|g+ɳ= G[]޸?Һ=Ͷ2)LzJ%֝QEPNMeƍAW"}4TAQ)W|H'"8qrM0[E,vv/'zuVM:o>Tݒ5Gl%NpV(*u=k5{ٍ`֩䜎ǧ*f?t޺ (X?)YtBv[݆sՙ\z&C[0\Gs3w-U7D<Rn0un(]Ror1'ާG"#"-fϗl M>%|{DNvڲ,:CxF?^~W?7֛>UѯbķIySqLѢߔf 8_ HƘNߏp+0🪜ԋYOBI"ETS̰D]kDWԖ595A[@00*J((욊8F9?Cؘ֛iOnU,Aվղ0QEEtqk)d\S?Jɧ[_E6W.m#P}Hy_ÿroqzsiI6vʽ(2xTQUQKi:J7`0aA+:hBAh:㴛ݒŎ c[V=̍x~E85komxbXcZ}e^=̿e8,tFw#aZv7p%|.n? GGg`;\^ok8d`^GGe$u=lH` =:¥txn :㵵Z#ŀu'ӥo>'/o"n9xPɬk^ɂ#x;5dMմFo3S?8JjcxG[X2KEQEQES]D)"2 au_aKg農=~eҦ-!'OkL ЊZ+]zj !#>՛2`rs:tQ\-мElI[qfIQc[ 0T{=Vݵ\jj(nyZƱsA8d]hM} سqP((x=1Zԫ">ߟn.6b~}[ڻ^x}pD??[~ŮUuEgk{WLy#`?\Z]*{r;UaʱXg]֓q +t[ϒǯa* "(QK1G$MFˏ"5X" T5P/ok}"*`RUuF#|DuQW袊+YCo}ʎ 8?Ҳ%r0HM^tWR.m&ӥE>_>եe{q>ժ)C)V1mLMJގE5t9SҝE`KSHůCv5 {ie ?ōvQEQEx"صۮ;?Ѿ𹉅'rD>ק[Eq)o?\2GԒLVG˹^PEiVSy-/5%v@Hk,pI @e\=GXSEQEyUCsp4۠4 ɥg9s֮(((5 g_d`KSQ/_oE唐S{T g!~|5QEQEQEQEW771cӱjoHk Ὢ?/~g'! =ϩZ(\Ӭcޕ>]7Ч=_ZTQEu=Kº~Τ]NY8:FAQEcj:{C<_)~/rHG z/^ U(*lϹΩDUOlU=*I鱿MAVaw|~UoOma+|?nNM՘umlGAk! ĽBŸEQE]Dc%C. [kr 88n8Ҷsl=C.?<>;j0\kisd~aE[|J|RhU(fn[!}&ͭFDV : 7ibY%$,ඵ1dzWEb,a|Բ4Hƣ,p׌[W:^qb$W'=N;n-7W,R9j6hZۘ&Oa?2?*Y6ɻ8{XQd@8/^\ӳ{j(U&,.2ePgWK~cIa>jq"icVo˨?GgG?5K9ww1mF.yRI+b%zia**r)QEWZP6 &c#1>_ʨX|<ӑ/c5&&wfU:0ն\*GSExMPjJۈ7G5xbm[\ ӏƓIk]Z?S(KXWa2Ҵh+ēHoˏ^k q 0"ݪ+I-`{H{=`Fw@ tC$g;X&Qdg?S#\t`QEVVյ?Hz3]TQ$1,h00>+|+pkm !<_kQRTuM95 |p%^Qҳ4]E>*AEtKǻ[sSA EO*hyA?( Aj mf袊+3]~$cpkE;P?/]iH@ 2cXזji$*@jc%l,r=~vd,єq*e9C A=hk1izxMKա>캅o#o1 %xw!EP{+oWꍌ#W״mNO27)=A qW(q~ 91ʱVyxz㩥Ӵy9oa]TpB(*5SvQEWQj"ӾJ 7N˕ps]=H/1킌"~c?o^.kc袊((FAftK zv}f[p} dx;ZDWB #QEQEQEQE6I(I*(bpqν&ͧ#28*ǡa+w#GEWL|\*4ۣX`QEQEb~A)4+5}c-珙k{4!9 }c[:^.6;'En׭j(m`.qzMK eOs^gkv_SC 0zuG*&j*YOjh23~Ƣ6 8F˸N&:zH=N2+.[[5 {j4J^crZUBQNҥđ3N(\G߹} t6^+z+?]\(3zs*.B}G`5wÿ?dCBO3ץfm#?T-|W_EQEQ\%xߢdwTo}?RVak+#eF!%FQ@!oinn?ƺm}?4S$DFFW+7BsZ4QES#4Ǡ.ٳ+^"CI#" 1ּ].|SV3kEelB0OMNsup-cT{gSZi\LFѓIW+& ydS(rڮ\ͦ) l) z oN&- {i1>U/S꒏;XḚ/ϊt! o>T ڼQյ_͙n8E桸Z([IȜxZ#^)=iI ^yH6#^ 7VZ߈'ȈǏnnlcTE >CE֤YO_^cB!݀*h׮}WڧѵպmtB[nQEQE2Hv:0ȪhTz1Sb+3GÚԗxH(1=?O,;OѲj5< =Jҵ->)XI6RG+n:h$gֵە&i;e^RܞEᠩӮVN=ik$d q5MygPiXB}ˊEV~rQguX +PXbG>Ҵh-LZYˤiXWp<5EV6> ~}/&S=~E_?fN;R[[\SyvGSƬ0V˟W袊Ν`r:҂t4QECX`4T=#1-浨ȾJ-ArU{{OԅL@zѢǎ9SIޘO{FeE,GRN9-^/f,j@8HH֨AMxNhJlO.CC)ǶqL4x,wΩP9kӨ)3E,N~!.?4ve/-ohGK&o|}kr) n5[?UOXKkl<Ɂd? h%e1+7ټ[,cs+(Lփb͑ٷq԰jw6OQ,dJ=2Ynl)`z`PƵmi4sCфy5kXeP#9bm݁giSܷM2῕MEQEQL$&Eʰaw.JK@HM/ JMVi:k6o$]3NM:`H*KR0? Xس7nH@Yҽާ8ppsug"AG=j".U E%z%?TF2q&qlcK=.,8VVh [xxhsϿf[iO(. Ǡ]U!O\[2~bqֱ.??5?&D7X56}gUz U}–LFۏҷ+M??y/O[pݢ$t7}Y95=pbHkV 6,Y:Qh-/Yڲ7{EEQEQEUi;fϫ '۟ 62]$#]irj7e.'1ǘ2O[:~h=#+!>ޘhS G?tgkԘ;XqVzqgvo*ʝ-R3RǀMqjQ3ɮKIΑw} t "q1e>1aHX9ֵ{lD usic%e۾ O\ś?uzfhe~?:ٽ^2+(%kkx+@NXZQ_GjQEsŃ5 L,_}65 `E\JSgEew7y/$n[Ù:#s¬._{ɊF9#[[ZHG'O𦫢˪fLA=I9Y֗Yitc(?bMow{Ff?,Ǡ#L*9g  W ׾'v-Ӧ?uZ&oAė >yHAZQESfMԅ22{g2Mo`H2/VyQYy=wq޲4E7~c[4V-} lһ(++Hg(+SVO;$NMF?`r?Zt+[uNTKE3'ɪLdv?z(4o-uT~Hv((((xNYF#XS.%wN돨u8[LyS$7VSЩȬfF<XJ1+s2N{k(dGM,5\]\w?gRzniC1?ySV袊/bՃ4kSIZEe񪯢.s} KE:P>,?92D{wuRʰ#=:w[cns qXڬbaax5f_i-F\;'=|w|ᤅ :zdGID:}. bQEQEW#iIJC?-t:k5Gn$ 8Rs3Rw)A>KRA c^LL(ֳΫvْnxCNTO]xZ'mcDsɈ*GCҺz+ kUUQqzF,37Sܳ)ؒ?#[GYƈf r^ҵ,;CT>9((*9gԚ.nCv Rs{tzvڮQMtIk0QC>C劣' 2C쯑S=MTfZw&`zEd1{aGV?QTrxEs4۹8$~:gy"?qБW'ͪ"YX?uW=:/nn5?]G I,[35,3ᶣ\דW'+45M6ؓbD`3FތG֨u **7s fZOxRv' q Q5z]敦oÁ] q h=,nJ0QzДxppqo6Jcmn|g;ʗ~%\Ƈb{º!KxV(F*J(4(^C^KxkܓQ]6kBV袊)UԫT{aBxr`s?cYa`YZinh%*ozER~өUNG(k6Cц CQnVQXoᇷW̴:^O2 SEV^mnPdHs o#f_Zfu&8?ջ}C84km&߼1wKϞ;/o`[:t$ݴ?z7riVnl rF3Z>0[c[z<>.YqV^'[;didt;D}DV dx".d I=MpWz)@=y='H-|,yyW?_*+aipI+WwՓ4vLånSIL`ؠ빜NNGҷkWݷmSۢ5Ķ)zWqo()GG@ߘ(uhvp! ޟEQHa#Yt)~~_TD>&tG_CriМ$8.e 28Vݗ<DkOvZ-&=\~ֶ74rҤX1$|NwzT |ol$mW=JJ?~/9xFZ((( ođX؇aSMaZiD$1>0QX"v&UŮ?oj0&_*m((((WIR$>Gڹ& !}jz5މӮIʘu1.VvB}4-uu?x5r(+H 6>{zj!zS]6P\'ާ(nδ~e7j~[*To R}ѾF4@FFprI} Vbo|I{PS]E66u=EQEQPMekq?@k>o REcr?N17uDd7\UPNKnFc랞6⫫M!S#*vSd~5 AG>{чWzR29G%`-l~Gr+ijb(^?r~5ȰՏvvvcf8no5ݰ#ؓ꫈mf_?#Yz];L=SS[d` H } b$Ok~ҠԮ1?=kOEŝvq߰:(زf'ӟ\lp$![76Wh(ZA'a8Z3ߏ1޺`H ;PI[;w֦KAMhEQYɬ,O5QEvOe'r%añbK p~?^QK1 RN+>Z! Tߒє_UԐO#ozfˢZr%W_܃qUVҰe yVn Tb9?ưgMo q.Dc_JAɩ |;w4QYܨ%Y}᫡jmꇸ\ףOiicPB >B%Ϡ˽qu/j;#?UV< t>L[{dڃOV>ժ(_0io܌ucY~[qtLvxUC[ T%xD:"I\Ep}f}3 ?眊K.(}vKVY"x?(((i" Ity0>qTffΡ¨۸E?95>A"yр<~"l}ؐ9GQ kn[2Fl|i_%eqkr)"H#?J,@GqX6_4 \I [Yb /OiitTt[D-& =H!O=/Uִۨmd,B:yQEQH̨$+Zj~,mlQvbvv}zk֦ӤK}pq\׀'eyo1 (kOI̊Wxo7EWk򧇾+ũ\i N3lcMg-գHN06j ©Q, zOW4(=&-iU{ˑk<(6ٮf3pùyuOӏWSimP ?үQEu U$G\iUmw>㯢UK.#Hn纎;h'Mu&d': 䑾ִ#1kY^us/sҳ[D*>f}GXֺtTFnƦܮLYTGj:l:$\}]~\h  ;VX\:7 (jid$:n {^yӒpHUoo (h((/z}OZ ^ eШcC+uoQF8i7?-YzO/nZ#urM>KmB`p6d+Cqb IOtQ\_T걟|LvֽU6# [Џy}|GX~7oaY?kb|:Z_OOuoT/n|t=kM]JOPk-M_= 0 kh(5{Sʞނ(+y@l4 }O<mxr74/D>*QEG:`i4;vǥup̓IJV(]Յ{Wc.gzܙO/s>ѱ׻x~L:^Չ>~EV^GcNitO ϨL5 Q) "cB"Qp-(?OEj\o-.z/IZ4UMN?7L_ ~\J <ߢ>ťM&p6/ +qWultp?yuQEQEQEQQ3MLa}T|/ tu>O29JqXmqq(IHϣzt;gKl0=|;koH4h$Dá8W#O\\c(T<9l'JZ(*lip?_a\f^kO>ݏsWltlc|!jQEVV`/,̑G}#I3[yNy}cZ~<t?ҽJ(((+ h X_Rl5T0$^~?\VCNt:P[IV쬧cU?J۷1$ꧥAj0E?uS֬K[+f1篯WII kj`O(+[ssjף Z(vVu\ΫXFlTGC`fԵ%v",>jQ\4;kG+u#e_xG$<7iI#LZ@<*qypQ^ƺ00:R$čS r^YZ/7c 6-: U(, M$d\ηt-mZGoQ 7Sݏ֣YN[j]PD 5rvHMLZZ?<*z$9+g<;tp>t kOjQvH؟Za,"V s]a~WUI Kj`ڟEQEQEV~z`C?iBM"^g. [v>?oP;x c'gUGwuLuU!xEЃ 4iGNVE'-“5 o+KpV@o.ث8#?] ]D z&  <xHTtZ 4>ieG?RЋ{XTV^hJ2^W#ٺ?_iֱHC(5Fvt-#BzeН-BO+{V(+$][>IK6UhUo9k?ZТ):ƅGSX3K&seb_]DX*()ՙijΈ~GOJnyTpOZhiKuT?QETsGxb@1I u8*vS7$~|VK<'*ω"LFC~]ejڜBYCFуEIfv81@bPz(>(_% __dZi]^Qծ.t_xGv cATg."hZu]ٶ$H ;vEv"SXvmƵrooY$ {A];[jm0f8so;Jl#Qúפo6~!HF^zUEaj/ߞRv3e5 %.Ǚ9;78>kyLo+;uuR}~bu5Or76~`А+u\]yήE D ~TQEQEQEQEQEa#{ uQ:Gy|lx@:ש|(,=gvo7|q9m$*x#mPK = ";Ǫފ(z[.G<ǻ^͕v[D";ԴQEQEY?ҵ^W~T(((}@Y[8βݥ*ZYoߢZMJG#L0&vwV[xۨ?Wqm}{>݋9'}u;}R̈́ޮCHmݺ9} yψ> M2켧8uiq;r$~WoismskY axǶ;TQEQEWQN~ɘZ"yv+fڤdD=]!i~>?pH m%qP?*ʷBF:(-pퟦ*߅y3|4I֯OVWPC)((DAGE3wtQEs-m)X!jHS˂4S袊%>Urǜ{[hR/?t6G?Qe Yz疟gC7e5,0;I>itZte|uU(xie`IjY* RO~6.Oc¯iQ'Yfj4P[3aR4{3"sC+RAPwH $O[^Y5qG#z=Q\WtA-B'ZI7GbU=Ek+I:` 5DEȚLoc]-W #?/pjR1 @2kch`# +wפ5g35E:ü{5f wEa- mʐrv>rR[* 25{Ed !EQEU f&?^'uK;Qԓ+"Ė6Xt5Zl^\,qǖ?jfǒs y<ܶӭ-1By?M<~tZHcU(ywI9?½ɬk;Yu[urOO_a[ E .O&2M:0__kx w} t6w$SOuގ9V46l\{z(}³4[~ݨ*pVWPU h 2 s:=YN }W?U[vڔBR Q1UoJњ]!n  ?ϵv􈕈\[4R3RǠ5:n5kۖ@O򮆊<"]Bֲ4i<&zW8VffE?g~o]bsPX@+-82G8gIr(((((7|~o_)_AX^'Od?;sqԖ^Ծyv8`s3q5?/Hvzd[39gsD~X]=QX׈aQ_jmޢ͵Dd_A[jT*v((u}2G/-*u!j .FpT(((-id8USWLP[ֺ?hF(Ϋt L[տvS&;Z)Pc"xǿ%YN ]QEQEx6sb(o2](P?'?x?3@yoE o.tQsG  Mwn< Z?NOdc,~V袊+HY ?2}sg^ p!SZ1g`$k[NҖ fzԯ2n̐~-׭ݏ*%lU 5P)z|IsQjla+MO2GDMRln7\T-at2~#>mФ2V:Ds鲋mrTu_+[P@BOپZQ\1M (CtR[9viēFȡ5i3>x3C8aZ6kqH@NUœyVgoQXiz&N'܃OCso5zZIbE}k6<Г؜Պ(()f 2IY&_v1DıFQF׋ː4ퟬZ+~˭ϟW aP=j䑤RDWS، pma鵋]/֥m.' Kh0!I2quzguyn l:鞽{v5hN<+݇tw-Oy~eMii|n#w#;UoܬL~⩧^OsHCoWi^ q<#(u*<k)E&~>^{3>U*/Lޫ⼷Muc2Hν}+G?֕V6z?٠'juǁXQE# ]q vdMr=qV袊(vL ^Ms-̨m *G<+NII.6smZxz3?˥AXjdP:urfՁ^QEvд~Ұbmj&V=A] "ƊUFia{a iDq2<<:~u,QG*F 5sis\v-ql5ܜ8zdx5;mnàZw6D?;^QEV%lާ\|Et6qrA[]gG"10;L>u=z׮Xd09zTu?qO9#d@^z~nts+?rS&mfd.86UQX(S 8iNuX|~*xG%ү[]f((((Y7!RF1FGq^TV<קEQEQEW1_mdX 4-xUDXTE U)QHʮC+ FAj z?pz[k;MJw$ouQEUӭ5UH}Q\f)"sq\6FmֱWtɼN[nzٴM+Џ4QEVNm[9^ӷ;Yd~`jRBI3[K)OZ4h@mGoRT7IUd '虂c !y'[im8eF>`?t"O__OEQEQ\w͵vCuti-g$JErZKekF(Zٴ8fGbQmiHlon2c זRJ bVUAqҩ5|FlX2F'lCt9aY<?Z촙GCxPrp3W(^CefǢ}sνtet{( gaغdujܰӣ@N^W aq?׍7G].1b}55u{:۠3XͼS-fL\~u[CM IS4 k|JշᶔuU5mx^e-~"J(07$J > EU׍>]Z(sZ (CJk+H22ƺ FUu*<GZa:?tg\ fVp*릠FJ%zϨUgYM"{E5`ԭ:T6,;U|Kn#etŪYKuSέ+ zKEQYN,-r@|w> .ù ExOBb0Lme5^9֥GF:0SÏnEa]RE ӊ;&?%W1@8p8^\[˧'"b3ZJIɖw_bV$X2jzBDD8̃p]YRhC[FOaZ}3,rUHX\̉.yl&H" NeX e2ͤ\$Oں[+دaFpG_J\>ˤ9+?8Mr_myrGRd+#z)?s`v`+B\T6J~dnڬEQY5A~UmQ1ɖ~{DWF 2)QQOsUAz=ω"\FC~]U٬xQ_o[dž>Z2ĶrC J"S[ԩo(eOB0kѳw}+\;I.Q]n$\t`W 4;NaZEx]V܆!ỏZ?/ 8z((($v 5\DzS+4t><[Bz\f]k3;+y?՛ 6+$|7ސ=](((jEk~!y6a,XiO\м: @=:K[!RsF>wB _!.CI(X]@CڸW9ҧ*㐌p}J?سmo0J Z)D&n1\ݤiסVk|l}lnnd`8=NHu͜:cJ֢.Vg'</kWP˳|uo~5GʰSW;ͥ^bYmO^Pzz̄ WT֥QEQ\ rGTݮO)+j+fO+pZQEs";]?n}bKvtAge{PeV4VGg?owgBZr -bQj?񭚆Z}eV6&&h*'!y$o>_Oʸ[=Km}>E+*$\i K&>ںxH27B)W?o íۙ# j>Vqzn-ӵ-vMOXy$^}+GK5NGN>OS]#%QsJD3?ڵh*)-dHԎj6Yx-5}t#>STj}E<^% 8j:Ք~h^hDNj{XBFs4(ҾfW\ݢ"3d׉ s}~?2»CXIJfthBTպû5>UlMcY $mbMG=&z6HҟG4wgsQkSK~[몷7C aTVapd~ZOŷqI_h=+G6nx)ƭIJܗ^7t!۾s'nkGI:2NAR2RSf.Da'c]-W#8#/q?.lЃԬ1*ǃmi?l^YOUz72xGT-->t=r(dyQ;tfEǩ?oP044린;S8 ]#2f 'VeοgB3ө꺑+iD͏ZòJeֽii* U-9˫Gs+p;Z.?_/:DI}kO?r>3*)f ($zy$孴v>5s"{t`Y {ֻMM'L0Jc d+Եgv9`{ozfl<~ *lʅ9(W{{U+WKK~O IMVG@^G{n%N} V,a~cJWfnv7Spj:mjmܽ4OXqSOcc5:a !se&HC?axrЃsj{x6D:"IEHf|= 歊+'_LG r~t{V q*{˕῁IqZ$fk$v)=ndÏf_] Ľ|d٩<ϑ&JQ47$߻˵>kk "(Sj=55QEQEQEV?_sʅ݀>/ir$zutWSa}ih((nRݦ~>]^3lD߷+k#;v 9c~uE#2v 2I8Wg7;I^AKA$_+׼:'-ybg3=ixPmdn7{ׯMEQPZ[b%Cنq;V;n97uo}oV"ǣkZTo®QP\Gk<3T3j"t z=8RgP@ejֺt`?>Qlo'ֵGSo"}Py_e'I%0'cĂ(1@)UԫT{cš\[ֲOWunۣqp{V((kpC& {۴3snk4j3OsZQHKIRݍ-tL=?JԪKin7^=MxysMKL8ݱ'&'Kl4РT2\}M_j:Z|YoF; y5 !;Vŵۧ@GEooB8jZ(_Ә7YOҸ}93ozm_rO՛R ׬ZMB5ܿc$㬍Vh&N5;;Jh7yy/0|m{,/VS(nm*v=ҳaЮOnǯc5_A sJzHw`$yx``̣ _AXŻk=E6͝V]mɹe/Vmtq/Es^޶(kƒ :+FiB*͇biV䀽 ~=pҢd}0k0VCZ0x\d~֌7#b{gd˹Cm }0+jMЫe[F svYhVb. ZT)6ZUez:oiHҺAѻ J+3P/b\u{}SAyDnt?Z)>M>m"ֲmiLAW(+Z/&4uK;L&/&^VQilD=YAEw-.J29$Z;+|C+zV@@)h+;P+g^' óљg ֍QX2/ub?>E]2kR1sZVQ@#NXjU/K>Q{ -.?wʊYU$SjsK Y8_AZny8y|=hēud 9d^3=fK[ cTkoL6L;wktx鈖Fw ׭(x"57eakR}dke9`91}tڭ#]$Y8$?ZDg-?/:*\/iVo7FGj/HPw=:S,me=~oz^a2vgo#\:ȁO Өe\7^ҡylk8ISrO(*ZAin>(b"=몊(c)QTY|&LFV44ˉ˷k!=O++ז7KU=U:ZK>dSսt~YE(gEQEQEQEVod?Ҹo c+ =t|}+V((jwm^xVsY}x\rppGVU!BƊTvE2iF,ǵqwc` N{WGhiP~y||>`GA'޳_Im/52˴YFQEŴp!Ic?" _0LLl)"7'uk{gBC@ؿjY8ZƧr1nO33裸GdoUF}[?ΥQEjQ\a9R@=k+7̑oIJ=}޾xSPn?ֽZXm<2eaTQP[EynLFVY]kY'va^"0da`rQEQHJ#W v6ڵ}?UlQQ]?i4F?rZ"ֵ̞V~q}9_ÿYZ\F;0HwWf8d\yrH%$?%ǯZ[孥Z .O7J|䘗?\U㇙ʟVrm 0~Q3->[|/ WCiE (o3`k LO0?higA*7Vzku)Gr;Q߂*+'Ug:m3XhZ_eH;CP}k~(( P{{a-XU##ޫK@}WUUD7'|¨jvZ%p-iҸogۈ+H1S]lZ~5v=F^(?qP Z9A։\#SNsR;ag?uW.5Z+bQV# _ECh$ >=6M[2efO_Hu 1'~0G]B\k,Lu08f'qa\-弚&~xAB áSh<~UqiͬOS\.!+ai֮9Bc?/ 9#׭Z^Gy<qIYӥ7ɬ3MjТ(kmt*sְnuJ -gTŢ&[xr<5č)(׆d1/V._U'R]B>EQEVʹp:? u QW5'JEVFs/QQkPԞm' Gs-;OKyJyW+I.COֽ+ (ma%=OԞjYeIX*(&n[۩XsջaasSd"BTu&CM[-7JMm m C`>_ηt{krI Ճe w(/4b,z@()12]sQaYs}Jh/B[L@#?B5iIu2hİgS ."'?Ҩ\}Q߂?^٢_Ƿ&o]ȏjF\ta/qZ` E#"ajlzS(.Rr7qSQEQY0[r.ogO}qbj?sm9pEJ܀KGvm'XKs~(YcYX:(((+У޸Q/|߷٭~٬5~V9?^YcYXdS(u"/Fs#zz~5jM rB_kм3.2q&S过mQP]Cgn#^!\m/u)l zL-o*<jEQEdZZ[ܨ_>ՅkW<N#&?_+GY:0eaA"(5f9óUȯ÷֧Mܲ7!_{І^D]˹_eqk|Cj9|~V= ';G_'lC `3Il~x+!/'G1z|??ZucIß\S]f#? xRbY.=3MtQEQ4mv,oŸS 2ޟC]QEW ch ]]wtU-]*?,K~BVW5JnoC<p 0ck7đi,Nϥs;49CB;W?5o^ G|6<3'*YOO5]Y,ˏ95mj'گ#wooo]..zQE%5XXGQi÷Rٶq!Mji voSօb'~rG򪺃 G?fʢ9sJUX$Dڏ7tB}6隘dvo] 1ߡuN Il%`p +V #-QE3%V`6p6k/Vӧ9` -Ž\麫z$G\U5y"B_i u@H::`<RjyZdǹ34˅z(H׾2[XrȢF]SZEt=UEszɚŶ8!?d6i%F9$aEm^v UtJ2AEPl12:.~9s[4V~mtV+ҬE)F~$[y F?r?kV_-ŁơMOA(+iT*Q: Z(QK1 RN+>Z! Tߒє^AM9tG]rHSZ: [ N+z(\ƣi.zDON}o^G}lG߂;QEVV8?El&HSQEQXG8_A[x * ;Oy|_—G X']ss&Yj̟A\۽޽wH }Mt6vpB#cՏX;XzQ+{Kbp|+Hq.sk?WcٽtD2#}A/+()!c 4}s3u y?ʙ zMͮ"'r/\6|VW#eYNAl&]pPҤtf/W=e{wvoDS M[`Ŵ,>iGOZWqwa,qZ_AH>J筦{9 OJҢ1U$o2W-oV`V袐@55ײk%bJtHd_kEQ\ό&;HfscMi^N%FϵZ[qOVVf_ѾN+A֢գ.} I5:d?EQEQEQEr>?mz[zlF?WiY)!8yR{'LӸj((ielҷ^=MrMp#IuKJ|v)?ҽ}l>裫A\x[_c+OX-jSV((մ{}V |$"F×f/f!CRQE#2bIV%h- H^t;A'5ZVo\|rj<K2:{\N7MI,+|MMIbS$~A6R5&9~98Qi{kF"3dWDlCdǧ^6pn)Cx?bͫ^붱hzmMVc8袽;DGK7II (tj_Ac]H5KagrQ]UQEx W=n?^?ҳt٦=F3E6GXgcPIV7Z/9՝BYۖ(e޻rW=s~aEV#U5?CD~Ǣs9|z( [c'7'cNvbk;Oz(((tPrA?j桌79vٯ'TӿVMG86g$~_Z]Nrʴ}i m8㒄/Wfn9GI `WMFʼnF#?LWAEQUo;`vQՏaėvqz-!X`]?2}MA}%ާdãƛSiKmWS4k$ldN/xnrزK#ǵp]ӵ0ɰW~}t4U-GMP >jƳ ړ{WI,k$ldޝEU[k -8\.ܮnQEV_g>E\+LV~mQY:{q4V08nH^kF!$8[Y+d*͞9|zd`NkV~3V_*jBBIY6B= @KEAweo} %u=3}j̭hYy8a5f_d uv:YTʟi>ln:uOMTcBSEf^A<`Bێs\ȹ3ڦ[t0JQ2V#{m( DgnGo+&JE#lh#Ap`ֽwHJ@t_akڣ5-UKoQModW=WF DP:N]&-J.pjtp1+,8.[QETˆ>B?>?sz"K'8Vgj=LrUKB6KHZzʽNQKIVX/>ڠk]ߑg@|ZԢ_Jqy6vİ‘'E ? }W.>ɦ\^O^_kRYW+~9bu]1oހy8hzV5+}|)=B([n;=jK[|#ZeH#/#QYZT*VMu:~\QETSGo=s\F; eS2k;tڃOSR?cFls?Chiѭ%OqUzCwp7_k.mh?Oj(((>"HDVJiA |q"U++FZ <)*E>(*b$!"?tP?5lտS;xWlqU-Q5K}*̔܌ucܹKe8$tCia#QKEQEQESt}NʝyqU>=3%ta꾇WciwnѿCjzyⶅ kUch8?ֶiF]}a?uv}l L(ǫSVjv1ZmŜa߭|fٵig;T4o1?6 ryڵ[/OR6uwFx?e]FAvTI'_ZYA@v(*q[TQEQ\g.v5[UHx{\[Ā:%A=kEW?ֺY͜F?I$'l]IhvȰ(!:Oγm4doc"T.DG/cSNNh'R煽Aʲu<+pG>pZL:;KKEHKF((^*#HBaA*"t֫!5_Se?j>NdJqo?ƪIEjK`_Dbi9B~lը@| w)0/UxC-wQERu(t7w9ٹb5 vPD^%դWql~:gS[DGpzX/xnrزK#=]?PJ:nNw{NZ|F:gЮxAW5EN>1LjE}M 1T6oXɷMEIۮ{fA&Ěݸ(d#O?Ǵӊ,eTM0MBe{uH=يQZ1k?FSsv=B_2u`FA{R8ZN\L7g^W9uifbԔ".|<*̉c~6Dzf'dCa\'Ȑy_0`\'1Mibk '֣ ]ˏʮ&=꾠w{k.B$o?Ml/n9_Rśq⿘淬u%@Hё5NEqjJ*u4g(*w [ְ4Ʋ2x'_(` Vƛ/d-\umQl"v(﹪z6v;[B5Xe$u*d`:+gM;՟ sut2go=*kgs\"]$Q$1,qTQ>+:P;4 u & Oݍy[QEOQӡ`auS{W2x~qVٜ>f@9zբV.?/MzϚEV- <~$G3YHpsXz7?q^k^#ݭe&Gozt=GX?ҶFI2lj\s^  YBk,Wf?dQXΗ7ގXZcw*OZETS@aq6N uGOcas&w=HDPU>(_GheX濓͙{Ve,0;TlWλJ*/nໟ;Fh9:z3]Csn6 ta=G֊Y,'8lG_κj(((+"fEu^o-$\#[Kc(+^(@pp`s}l!9e<~uxOC>DU}~5j*p >H{MҮ3 _A]q1qDQ`N((*nC=x+lJ"$OWЊ)6kbAt%Y$_&3ְ۬F5MEQ^~icG98PhWN ;=g~ ;~zc\lǡ]Y VmOz*V$jm Wo#kB() Xs<-ݩ?fsO^GunG{VoyUo# OrɏUB#Vr*o2ԏr+df9U88O2;,"55Y YR(Y[ ÷e q$ VmtuGWEQEɤ$QKZc85VsD/?uj66cA>z˸dD3Pd{=p*d%=JƢtڿ\gۃS|Om1ẽF+;Ub;?M;L.>|z",h*` uQM42(e=AGu*=Kc!&)k Ğ\,RCxO'ҮNES]>ӧGECuk&)*z.>x?+GqCSTKն{-`X֥(_N~iJc֢ɻp= OMi=b+dWfv<EШ&D[ѤM̼ST=L7$-zޢ+ <1٪:xi['>Օ{1rj誺^m@!Y9'ҹVg]2 zlku E>QUQB `8R3R@Meu5g [+oMbPM~ZTQEQU,0ιW*jxIkvl[+}^Y[vtjR! y9$~@Z$Ĉ:*S袙,QG*+ akWPҥ^Hp}W֗>;G<չ%=cuTW/K6xSη62taKESQ[RE".tIvԓMYv&IޮQ E]o_LC X{BRCS,pV'uT* : Z(((+/XXYc=}*jRHa{^HRmppTv ;/zdQGKHaTtEQExWyhr>?PԻHPuYဍȡU9?MO Xs}P8>RO;~gOACuFKF<7&UJf[A,.2А{ƺC( A(;we܎0Ec躥DžsmpKIƽ>9hH28 (A_!YX9>]ErzEe9EG<VMqxbi-[=M:آ~ǰ.ŧ(8r60?C{gɧZH'USM'H-_o1k袊( g?p>cח~=!׮_q]]cH|PI;X Y^Y=5d@!P)QYTcQLdl}wWf mI^ăi?5VFaܑӲ}³K~ݨn!ϷQEQEe]h\=+OH]72} oV'9o[K$W c}q]7S j?ӧCEG41DJ\Žևt&@OS5^WKq"VA+tcn ްzVQEW%r[moSЗff??5ECV̳O@u]MsvG̽/?hFc ꀞ~lk!O.OAIdѵьKzE KEQY*AG"[8%\)R )ZpQ.=H̋WjrkA gjLSYUd udO ߐMqc 2"8 j+?_u2:-QT/ hM,rFqЄpa+^_.boG֚V  EVMJ{b 'AZҢyI]8q+?*IښKٰO+V+s+<+ ){$ں`&]3Z%agϷv ``QEG4Fڢ.u"sºK+lbǩ4QEQE ͬ7񇍆52_/Wdg'WlٿCO_O_o?]s#?δ((?זNnX0N9#[|QaDc}%~ϵKǻL֧i1֭y̗:u@ GP(0k4籘][p- ՟s|MǂßʴtC!O8#*`=A 2yPvVwj@U)f ԚǼ^v- 9u3L;\:*&m:iHC` J־AOuTQEQEQEQYmly!~$Q=2iº}ͨ{sv_ҳ]^j;Srb>O<9[}ziW3$^/_r(]~E!O^tm7P[W: :ݬ ~ӯO9)b?ie-һ >Z@G*p<5xe!>Sz1\iމgЏ^y~!AƵ yREQT->=F,oM$N[^EcB7u*!l+cww\pԢ|Mzv~|W),$/'~\.MvqZnGVU3Ji[V&4h0 |6GU޿Zϲݕտ# ((O^eWh_?[5J=]3kϗC!K4ހk:sww~UzO]7[V+AȦxJjnO#BU.m>~fx[n!:'GЎw~ HN卹[ں*((*_sh5lԯDXdx5/Z.|Wgq7RVTC]тQUV>!*-{6EbɌ6GJբԢ :?((kZ'c1?I]=?pQL?6O+_& <щ%>'ޫⲼ/}wUJbqny=+VZ9¬EQTDbv-=Gbyb۹6w3[c.h5bIjn[`4-K8"ubV9e*:0 ڢI2g3ȤgȔ*Ђu2:-UIA#kҐ6m!ʩPPm'V5 #'ԍ+fZN?^##EW5YI]-ʛ@ m^l%NF_U57b bmlVtNSTtgקY$Au*"UvQEcZ,7(ߨ_orZ-uN$`j`2 -^;Trjq'%b=#GQRQEQEQECwk ΁q+ {MS̅^>>oYGzvOnі?ZQEW9EqCZs xo=Oq璿+-͛`" :9wZMH?WE^]kKn&jk)"28X`޹{Y4>>ao^_iTq VEblrޟJТ*ÒUMfs'֯M2Ay,S2l~CMeshm$O~5;h]]D*UT㹫4vH\|Rh,/4OFGHoz|7 c֢փA]' #ףE" Ju0}ې<ǧ]&z/R\(((O`<97H?t4Q\׉Z;Ft?-ղL9M\~H,$~ .losu І WWGEQEQEQE#2bIV%Ʃ8ն1qվޮE :([Q#?OS]W-{7?V i  x ן³w&X>g}WvtNj"P[\GNOu#)6ȝ׆_=Ċ:~?< dv#*StǾ:S'Ie ?dGꑕS1hK蛿.rH5[V𖛪ac}ס qzi-j9;rˏqilG#Co'OڶU2T<Z(ִF. qxBat1!nc?ZhMP<֑@?8Ubvs7m9z+uu3ZqFƱLKKYg&Koodt''V`y}}o(U wνl?JmN|cXMq^g/e5of($OJ?jؽjQ7-kPef)n֨1b[TypC? ݼǙ58QEfqoQx}6we O5Y/aijL:[QEQEQEW=GaU[._< uvpB%;`-O H>IcnΛ+*)ڬc>WB*Fdf@>՝gc!OF?,(ٍq=+4il%vX*W{QZzF)0 }?µ(?Ard?٧.s~+ֿѯꍺyWE~[TW|%o# D\4VCu(((S}7*z6:ΨۍS[UufpǞ5}(Ϩ,#}k6Ǩl7ڹ=9lzj IIh"MucP/62=:K[i%Hf?Ǎ?Χ[ۄYau[ Q u$ ('Y#qRNOJO_2w:Ӣ)"u =RIM$]SO9[Ѷ^AGGkfUu ?zMXC+ {06L+h!Yb` v&tORO4QFM`]#57h^@Ҷh5UfI$>¹f& ";sW½Q-@dwcJdU?z3r^j ZMўwU'A+ (.b+`vҲ$YR}M1e>JێE5t` uQEg"$_0&fy5̡nلc{ڷTH \-M.)Iih_i|hA1Zۼ8Hd^mPہ#tNkb4xjb++ӄ7v ʮE#*aaqYEҵf};]}QEQEQ^Q0\ܞVF#р/ܢ1BĶKe/UVXڒ `j7\|<-I^ƺb=9VCܞ@ѿvQUu6)^0!r?#^,Ր-c,?FW:W=8b`''~-hٸ.~S ''c?vёC |7R:ܢ5_ 險4Bc't?θۿ z4NfaQgL.DwV:ȁу)9EW?Xip5[-CHk޽`.cHCk>?8l~?o;VI- 4U?U^Ic̒악nO}cX[֬Q\ޯ21WSN1V4munܐQEy̚rgq+5_@:(Sğ# ãs!vZp0Hɠ/B)f4 :((=9\hzgVHW1A#9OSO'VM^IR|O׹MtV\ҝ=W/=u5ĴGz{u!~q>7BN?JWwA7*~`|ȘK']NF<|´tنV'W(($Q̻dEa*DG]>E$sjwi#)BvC)kM2iĶFf$ec95yYMkV"7q[ =B}몶1:SP#}V \!!A$$¾Ԥ`cGVT"~}j45M^mnnX+CA"20ʰ jlklǯ73,iz*[- /\p}MlQEQEQEQE Q&,ȸָ2ؕ\Q߭u6ApBmQEUa<2^:`Z9E'+?<:ۨnm2S+¾ 'Ft?^ZQ84$dgFTo v9? wu6?(-_Ot{f8}k\ ۀ벷A$htņjK<|򭟺}k׭m4`'9{VȹhS _63zx~uNQHAXgQ[I;O&\:ڡ[)<P+T7VS\DŽ- U=0S5B`B}JNSm6'fnI1^EU{K!׵Y-ϙO71WE ?y?U[z%\doC}+J((+~>^e >R6&袊Yl[i鎇~UW4ҮVK*:!aϥM.m}B>uhWmOrAtr#}x,SݏF!Ңq%OOaV((({} [9cPucYZu޽q['Qϵi+F/W=H;{9n?ƶ袊(GMG}^udz2NĚNzm|k|A'ݷּ~ 5+7j|QؼE9GQbCU},߆-ϣ!2߇AZ٢{,sf袊<3jXDs7~\eu m:Fim|Fa~eO2e9E0FAnAqV;3vnSJ3QU ջW+f+ ኲu7ḩxD\Y~BGVn٥nz5 ^ %>} v6@U,OrƳpa ^Nz}꾏,+s5EX.5k{2-~0?ҽy\] QEW׌#OkKEpv۹Cj%|:tv)UR꽔.jὸzxG?U{[TQH̨Mb]^KK{`v^ڥ cMk dVc>H^#4 =YȵzQEQEQEQ`MΝ%i%H91TyНokY o迾;\}yۯ޶,jUY꾇WP# (gB;mYvG뤰%dj~ ]Q^g(l"G? ( z CtFk07 d]y!o vryQ-xaZz};r}QEU[m ۟z{TԟТm}F*$|C'_J++;YXqFm,GZ!osZj,֒XzZ3qcɫxQ:όt ? fgQw+[mŷ#25b=VbџFi%QXsO(%[܎:.-ȮF r˺R9lW%+I\"n–8 ZZYZ3+w0WqXRAu ]A>Tk^ k5&n&'5+jհ㲏C Kx/sWVB./sL~J̶fA?o\?oT7$$5F\'?&cg/)lֈ\3KwK7AQR=6z˼m.P֯@3.Rpq/>knn|JH|1qhif OP'c}-/u?CS%է59m˷ [U`ckRVFwPm?Aׯͧ7}.O?g(zǵtSu\} )iSl')G ”x> ptDǷDS, }v'؊pUt}_Jl/;4J,?/N%2bוF sҩq [C ?)/;{—sNq•u=\H^K3skݷ{C'`jNA$켺#j\)ʛEK͢HF@q}< YrK+3zꨢ(((GTK?<˃==7K펣V,n2?%ƹ:ilf;An%niɏ{VQEQ\߉)lW>iaxwEFDw_C]2 X+gey^7y?²7Fጟ֦㱶2&w~ףA(;}F((Sún k 5xCVѝ%iDc;"V A+"9E""Qw0<2dq b:Dž5&Ri/z|, }2k }CBD)ۘ`C:$۩XTokv!<;AzMY'ߏJEV ~v,UewpE uu_eo#WaEQE䷎oa59Rrlr8s#OjJoUyrĶ/f=Uw~m3TWXUnLC)GzZ+XLЀ ~}ꆕIi/u S]FA4Q^cI=9O]QU=Yv1lŇ.܏"k;@ĺ̗Rr3'LikFpr>jڢ(+u#;ɟRv@boN®VN6M^o}Ni"]* &_Aɏuj(7dRt5AV 2^ ZaOO_˽-r(>»[;Ļ@`9֬d%]"0Ȭ+ ,qt+aT}?YQƧ G82:?;T\ݡ]+U DG#5[x$n ski$D-LWBFQT#1QݔyqkuSX#S=u6vqYE1~4. ǧýgbVI?y]V%lùVl,nvR{7#uǷZ#i$~}kE9Xzsuet cRxL V%,zMݛy8#i5XB72 "ldE6En-~hQمpnu &++YWP'QCҰ,L+ZId.1=jXaXGjJ(#"ڧ/|Qx!Lvs4.JrQEQEV7m[爮~l~?]zZ?ف<}W;2_,2G ^{ၽCD5Yoo'r 6<{5khiɌr?1_OIACVh(u=OՔcTqW J^ ~+' d+r⸌I "sPj668a?u5tu=ROO[x<^ J,B8p>Oԯ+(,aB\t3CiM3u{ 쭯|IzvEz(Tgs\7 ?#jQEV C xU+xZ3Zݹ5QEQHK1$׏h5k$rs5U[}NiT;4~X؇[[.hǶj"3GuQ7:\h?ܟW* J(OEQEQEQE#0U,I=")5Hc":A5CETGAuU:p {qk_[l<] "er{.άn9|^mTe FAhWHRp\(_V.Ϥ\+o(sOdEt` .o3ǧ9QEˈ1?ƠKӌӶ5ԟAku{Fg8q>4y;cq}kԴk6Op}QMwXԳUevKY-%˗<<E =:&enU ?슒/Oz`Zđ~Y47[;+WN8r$2|ARzY}B3$ySՙ%uNUiZvWaŬ?+ӵ{^?ZtQEG,PȘ|+G C#޺8*/@(% "oT5en-_ZQEQEQEQEk-kPD??FPU*F5ˣ^\> 6ZY`c_cYzn>?دՄjp +VW@A*cIR7 9S7#}UMEsdǺZ5#OHcCge?܍WY[K,R:8Nżz*Z1;dVƥ>|u%jxY_wU{ibP=?v}1SQEUeAp?Q]Z:+ʰ>QEQETfxGkHƒӷףO"Fg`wMGM+ԃ|.?5x[X 3c,Օ>pC]j w;{d΅zI5J2P:[zneLpJnt=:u_]1Nc,ʨ/~}WVFDQ%QEQER3*)f ($q}qO==[czzޱ,=i0w_z,/Qz$E]}nPu'Պ((( ]gd^cĠj~鷀npʞ1?:V[9g#PGֶ/\IxΥ:/<XiFxAwPLG2}P(r;F^w~G5h< 6;xQ}OELPpmOO\!{4 Z(?wo/MwZ֭xy&L;0ԟD(͠_˜#יm>K=X/کp7FΗ[l$#JuiCH?A~M#ګGΪ=Uuu[~5sdJ=n(RqU*ν~J?|%^W+%u iҞN[TQEQEQEVF;\-O 9ϥtmi®QQW14Rd=AQy^ۡ'Fִ7ƺnWѯO${U_υiz ǝC)GzZ*CAAAuS^fKA5eã +u|K Fvjk+ѫ*u ^LlK9#3Gla`nI \UFYo[##GJϺb޽RzZ\"ܞ*ﴐz };*d|~&V4_}Y?tpVMߔ*V'} >铟֎e^ZjK w8zn&HDN sYs2KG'O?zȞ-Ic}$2뺢XBMO_]e 'HsȮ6wv1I,>d 1k-Ǹjowps4~&KTsѫ* R$)$3Tf,茇5'$Cq|oZVuۿQ9 `goRI S U'H5VKp Vt]ZK6#a5kv07i.F kQ ,t Z-edos/$~@Wi:.onрQEr:ac1*((((YiQQ \D2ViWbLMzt}VdJ9n===ڶukƕ,)CLʳV?zC=+7[]~V}ꦸV9E#y}n@9ڹ'4k#f'}{00A[5Ma'ޅoUb?ƞ-~a?Fʥb@:^6"\+t=ܓ?C}S>7ag%CpEQEQQܢ((i:mW8q/Q5唆HJjeLRGh+RVuRYd8`gӭ?:C] c$>1zٯ.0H/q(kF+ p~1ոXXaT`S++BU|g?y<Y͜o1F6(s?ᙔWqMf?VVQRP̺=֞D;?A5WUm$C3VmckltIm쿅Iok61մDP8S= sD[Lh kev%''- ?PQEQEQEUJNޯx{J,"Q.z5ER@ A[6kקNLjy%M"V0V^qjz={>g gȬ 3K02cz}cN_!H#.7lLaGSne Wgr#vϺ{TO4mpj\V'|}ϯLE^܀x#++HX2ՙ[)a}yA\-b+?u-)O4IHo^Q?of~e枚X yaMk[IAdⳮ->'T_d 8\ȇ 9O=$IhQxd!j{aEs1mjkq*+}Wʭ[dL[U}b$3Ni#?V-v?*=U?\S&]>5o3k2NGIE2h$ -?Һ(˹auszag%CaO+7P״3"f3~C\,cm2ǀOaO'uÛ"?!GTt# Gj$almp;W[$nvV\ܱBmG!~ +V|<»ws RrrTbA?Ak1 :"P}HW* ^֍n提=η(*61nAՍP/5=1۩vj.n4+U[u>~Vؘ t=>EE ((((1(m{ƿ5F(.# y֗Z d'=N0ǨAMR RT zy1zU ^{EcmVW :},?1((( >coEe\xKV?W$񞦒3O,@l!I9Rq5FjV1sǧ# ^HԌwVZKpsSW#]^{)r@>O(++_\أzH?c?~XpyF~?ֽU:+(#O+h3}ߡ)<.}W?5rٍބT} '`٩l\P*I)+GɫlFCz}k;NkO͸RrGʺQEj~l0OW=&<}Q(((KXY U=+ƽ@z}+(4;툎g]uSʺb+zrWO6~V==V))hna!D{ޱM"Ȯ+ȼȏOPjz*/d-g&`ǫԚȵL+K).%R p2y?Zٵ,t>n@?9һn0dTLcRSMA 1ޝ\((@7^ :5oSQ[{fko]-Erqm'⍼BXՂg5YGl>R #"Pl}[Un=V#֑n>vP|1~(whA$|L=ǥOk#đ)۞mh\IpԝRk=A޿<qӽPX;H%OU=9 =YG#e8t:ɸevGrZb]Y`'ymMU:(i èa*0XzLS!}A+$ݰ߅`EM }Ł Ht޾uPfݳj ~0C}EM?vV#֢f?<c+Ķ&_H?Wbe8S+;Y$Sr*Yl"$K[Ĺ^8~QY9a!]QECs۴Mߡ4 0'?Ͻo[JNMw11?A+|CrX7MSW=q\ @݇̏ΣÉ]Uoioj`OSVnӈp+t,Ll]^>XV_ZdvFV$u$k Nda}X$$5  jkzg?κ+!$:V;4QEQEg:Y0$=Ѥx~kEUX{z ԵH>0:F=OUaCT˳{oo] ((((+#I F?Ʈئ u#\UamidY!+tŒx=&lRkGWh7im^_LVQET[[Y>&"0Y-BK|W?k]R}{3n#RǢ9Tz]X#D=k̼M;6t;{ahonm/#6SsLw7 ۞; ֽR$"(Pkc2w7~@?ң:ާ(k+K؃Ļ cef]|}u?Dvfa\@](4?C?tשO.4TVͶ<:qŋvpZ"-;>SGa֬x-a27vϹ'֮Y N} z(+[Mo0Jj Y|GR~KǬMWQEQEQE2Nc[Ԗ(Wc@ĸE%QEQToYݐuj;6/ ϓ/oV&M\+̵8 W^))h$.o P2ۛ[&L^ƶ,+O#V#[.y"*1\߈)8JzĶLa !R\_y) K(85.]ǙܝÞ[E =:((fQGyQrFw0Yf* `:TO4D0UćY,jιAاֵn>j?OM2]!;1y.[ʸkOO% U>/ixnum"!Pz(:xŞ8s[''F)U w^^, TU Llg7~c0Y3±"o?t6\n⹽CG#cKKlܺw\r>{f=zϵnY,ߝmE4s.0Yچ (H2=P饛@yխMwZ}9bvX&`\4`vwA͵k *` #:5OxLr@}1VtE̸3L[Hd(tI?F) OF5nG.*3Yϓ6Ӥ'(iIn4W_̏NWNv'SNƧ޷fyT+[lz??Z_Z>5'jٝ桕YԬ`T% T#*wq4SH$}ɨtf1ICL=g(#SAsɮO 1~O:սWZZtr}uRd[ՐbT$(xm2M*Fj)[&i{jt9?Uv Y!#b1U#gs%,ܐ$IK]20#[kƥs_3D8ߜ<nĪ}Mk_j^bs .篷^q.f@+4m*NKh[j#PI|5c5OtU Zγ2(;ӿ}]骤Oӷ~EQEd_[Rp\ O ,nv7<[5I pxfZ;|V((((oIgao,0?u'd,`urAc,,aiV 5xfAYQWW4?K;]x>jtv{ ZNĐ?] x |Rqc?ҙe/edqOE2IcwHqAʛ2H--~U]j﹉Oh$z.y*:urϫrZEGq:[@p?:UR3o֐^pr [Uy\㧘~+̛}Q^&ǔW~s\4nڮ-ӏҶ((j Os\ЈVJ7i-[8xR_7eOQEy/g}J>[TN\)vXuf*gc2wQվQ|8EsJҴ, /j};O:ע(yta\my4xdmɖdEt9Vw((+'Sid0d`9ʺ='N]:&ܹ~((+LS e?ҹoB)MaXzN.rl3lzy=TJ압2e# E-yķҎ2:` z尗VN:(Si+*}WUC5 v|>M8PWBUr1ձ#Mle ($3$՘ .Cb?ʩK2?fU9|dU7?u{[%9lŗ =cx4}~f/3,w~ kH *tsLmug*ԏDӢ9[T?έGo?ꡍ?P+Z%u;b:'mESOQEV~ѩ?[4Ts0}jm&ʇa?OiW/?]E#*` =ޘjOQ5E>Ks^3Y# ͛ .=:V허[k=欮U-u=M?Mq:=Uluo*EdF $.DUid+$Z(e9dAA޼^Ibm/?O_x5/L]/uQEbx̵I@Niyܯ?^5QEQERV۷X#?Qh`_Ê׬mDRrxc}iJTQHt7 >O./ݸ uX1o?Μ/DіUq] 9s}QDǴg$r1֭?L9Xs'qU)uF'fX tDz餷v$r?YQ$?ҡnDeBͅaY6`;uQ@5j>t*Uȇ1-Ա"SOމQFa492SF% T-*j5 Uw2}Tz)_֧YS0ć-Oʌm6즛um5ppqZV/խUQo!*۷{դn=@*OV@"z UfohqǘLR?SXw>3oǧ@#7xrZ}uxbii; >SlXwʫ˭oxk]}`B>\t$WSEUkAk0sU=]aD'uIUE- |5ˎG]jg|2?Z<Z ۄI~PzjleQZ4>N/銿Ed`"SkmlĈ}O_ER3*)f ($q}qN,mp\[=Ѵ4Ďcv_-arkJx{1ih({B((((+OOu-&|*r:?*iVvWic- ?<5lK-e: gc~Uu[J^. #)#Zce$CpPiՙh>P[Lr@zj}vm=GwDhF^IߞP}y?jhOMkmזP1Q}eڴ{if1֪j]kϷ^H޴/䓌REYCle@ 짝z~5'&0%``ue@<ۋ?쐣thLŦsUVs9_4M!w +^[://jqh-QQ\.⟤ŲsZUPU0=p [V2qp0 EQc5hU%G~i6ɽdFv2q'mLR t#t6~"?Kms ){Tzc+H ZOIv_s]Ga '}ng;~|WϴYyd*զ$r(d`UA)G#Ghk#M} ZjDBμMyFT}X\&mkJ(((CGҠ?W(* ɼW|`Eo.Dž(z\eÏmVFbLjǒ p~ZI:p}+7Rd 0vNOVɧD|ΊϭhZst)(Ebެ19=X>{$|cNOOEQEQ֢h ښhQTwǶUÎU!OjQv!SPi##0q:ֈz>gӊR/L#4848u*dZtDϸ*)5 kJSaQ'Sm ho_6zFWYz3^ۯ^< Aj@EÄGcteؽ\屆EG<[Be kVW>THc8>vvm>yjjW h{>g=QEQEQEQER3RǠ &ɓ5ɕϸZuEgh@+"0p77Lo{9?xnLu*=z~y? |E g9 zۓEU=S?Oajq܄VaJm*>)Fp=뢊?D5-QEQY-0Fxvzcl-`ie?o6 SlZmUI;[E=N+QT* ^mp1o38\?v讧* S(`]gaIlBՊƶ|.ԪHECVlYҼLotZTz"?eK3NdXA>6׈zslHĨ\z<%A@Ϯk /X/zEEsm ݴH]XpExF.mrrd=WhZ宽ͱ$PQkN+Okމ!y(((+ϝH_*)"]0gYeuR{u$AbvW` l!VNSrr riVk /HF \7bX8pZӟǐn@* \!_dGqZQEQEQE!wv 2N~JeNGJ}6̬0N[J EN*RVEF7UMqTt#[ )&RwH58V<:$R{Y"{Z5Tέ_a ǫU 7<=sBo'M!e6w-:I÷ʿStqIqr}jxrϴ6~x{mEQḚ;I5B$vs^|@?^EV'gq<~*&ej:ުWIPMeI3άijBs2i"g|Z 8J*'>µh(b~!CǨMY?:((iLƠs~[h-ʣ((( :\w;-麿©([ GH@>\5y#rʑ*w֫MlcF. 'tvwo#3>O64>y>- w@t[⺿X+ɭ[-H!GuvVaQ?՚v Q'8?QҷKauQEQEco˄u=eYq$^~U+C>+OAYc)0{RERFqj"cMU7mq TVTYʿ4i<,GQMD6F 2I~V=zSZz|630؎jy7jH#Ds|5%Vqo~ꎬk-y|<.ь_X-TQ!g?Qep`&"}9SWIe\@)Zmu&o^"[?6& A}kSD6!IiQYzd[K;,1Rчuj#W֬7K5E5cRTw5s),{UQk$tgegU¯ *Eiҳ'lRpWkܠ5^?ĊB25nJ ?qU)elQL?XcYz0j3KҮKEQEQEU+_0|èˉ|>!@ h8<{ΥK<0ҧWW :]GV񦙢Qw~%qgoz(wV2vcgjY Y@;}j`kH2iu6V/!].9 9x O^ MczvY'黥QE[K“}cRMp6wvGy6Z{X2)i߂;?1_B's[PȮƹ{uD!@zTS#I}K1m^+<9&* ğ4Vy0I'To2z.S+z(55k[oc>>qĖѴI4ZHErK-+(0 )cCz{ieq=Xպ((((( ԚE 6Feq׎W Hnn-q#S]O{PG95xww/$7|X8+@!FV?JH% *(Es>0m#Av=:%ޗtRonϤ\?R #CɏEKmWFcn:,VQERHrIZk dWA~@W8JqqiV.%?QiXE)?yc=#/VQ#TQ+iȹ׫@rdZZ((zv?5Ab7Y+=+(U1ݍc\R?5$s+g ǧ֬xQ7$P`MnҮ鋒z֍!j=ZԢ(֣aok+PRVhϾ$~c(nb[.},EQEQEQEU{H/KyhF=.Wwgo*i>CuI?+2ĒܟF[8'+_]֛&5~H'5pOBH \yWHR<hIvF ªhlwih [ShlGXѼ\9*޲m`{u(oAs5nƥuܘin~yjEn/VXȭ9EQXWG ^J&5k;ۉ#{ *BCEϲ{oi˅ª]H@ {[f$]wa׮wwknL3]R) :m>kJ5'sCVts7Tpcnڻ.\"qTWOݻ_D b`=;7i:5s |!<0>j|/=C_Ե;qR{3zywū(Rm6Bov'h7[ b35EQEQEUmA ų?NOJϺբ޽RSzZ8'u Vۊf zjQYlGΧ]ߙF+*ֶ*BUuV4xݛi7tLڝƏ~DN[kv%aFfgc>iM F+"}ԒC, U88ZFXpDeqZjEw_?am>FrXǔJ)Q1Zv_aϵw֖pX۬'QEQEQEQEUKN>}HG~Cļo <=~PYxXȱ*"NJ~׷a\3#Y!ЭmkV`($Gz9[KcrӏkK8gF l(u8r]?Eej-`FϽTa*EZ\gJ2k~m-$"SW#Os5ܜ=MjVvkB2*oy?<]=mQEQE`j&nST:bAR}YٯW+\H:K8'VNkBqzLmBl12X.QVtOWm08͑٧?֦mj5?OZTQEQQ]EZvRָspl;'ԫ{ A=(_^-~xE4x{Lgcs19\>EQEQEQEkVduM^w7Yi-1"1<2Cy*{p1ww'<0&4?y=,5v Ӣ((+7[e7^㽂5's}y<Ŀ6?C\.y~k{6icr2K}1z=QExkPߠX8ZV k:d:*șxêZ ۖ {h2-QU5ձ.Hx@}}ki7d?δf8dCSi[Z Ѧ(EoDSqpܐ[i(!c`? ?M[ۤCG>KH@ U~o`Uc jQE$Xi2I i5H "=>UE –(((yobG$]kwlw*H=?~̢Ix *t\I;u6`d ӟ}S SQk*qAW' r$,Y(1'5mf4 ap]=Z)tk*PZ:q]3GhýiwhL|U(Z dN;#cX[yp.IU5}u0Gӧ1#$Aሥ6щ}t\Pюj۳l eq=нb>'0n-TUFPuuO?_nƣF)QE9RcѭnϜG»(HcXP)V~AʞEL꺻,7W?tvVkw1GGE]0o EJ=<\&$·u P ^=N .}_D ;;Vŗ@0xKkKg7goQTZo$C*݋*ǐ港hS݈>zHMNvd޾0GDKKB7/1|皡HJnS>r?KXE}QEQE6_-{Tj44@ {݅\EG95h I3s}{(F]1\yv7CTxmбfY :KUN*8S>٧=\/؜sN Jpw4e.\5I6R2^~T܊*j((+3Fn4ݰOku:aF+wNcoڬG"ʁiΐ&<$s&?(o;0 =:T 9t)a0@TYqFRK1&U:)dl}{o*E$[ڃ S^JqȞ&1̤G'ZQ1n9qʊd #}`|Cu&<|>'U~TIv q_S]l'"0>kۇF:5QMm hǸVt"̇Ȩ4GU ZeC`q+Y\anh[u[]ݦyUﵳMQ4v%`;Un<NOdC,~TzKpOOsTWb=?j w€?~QEQEQEA,@5s.h?Vߏ!SػϓX&ogفZt y}#'5v OeoJw~+E#P:($1ǟ5ų=]JFEg$v]eQE;!yɁN-`"cvoWnbeW[yդ$8==f2nr2ǿq4 ЃOS](TdfD"=ִ pfkW~M~Jen7֬Vv?k<K,qd\C~UEb*ׇ~g?(+ h_RқgFj^|͏P"G:+:vvEQEc?ROAio~:` h*ax}%k0MB<Ee] fk fxQ6X~U hd*94QMŒƣ-/.OlsVnn;*i\nG7}ݫLjR5"6u5*@&O0 )jdiOE5%=;r=[)r {`.>WOEfjz =e5oAԵnA¿{ojۊ9Ј !S[EiW'Q\Ot5;y0_דZTMtx2Egf%QGjQGqѤA;{SFc-29dG楱9R#B?u!`8?-wCh ԏf[j6i1GѾxKT0LL2)/{z]{gYbe?QYZLhX؏í_()(^G v{&a$]9$jԢ*(Y@unMGo|djZ(k8VKU$q̭o#zld>e3R֓>8jYvj+R>ΦQER2V"O23=jGKEQETWJ’*i=H)ēFQT7s).`x0k"QM굻_R|1y5¼abr;Rڕ"OU[lOq]?g~sRH_[TsKŶΙgu$+k5kWݜ}Tp&E7Oч^tj^V2=8E+d[]#e9ORE0[_D5kC-@v7SºҦA=^EQEQU.uKՃlK%~&8ڣ+B_)YQtNҬ͆S[a M0oH?t4TW'ҧ-?_U((?ƹƤ“Zl < egcdM%ŮEzzu92Z?]>S%91ȡѮǽKEQEsyQvRfS&O2 Ea=?^OO5A"~mhB*UMAus´bl#qj(u=Duw5Mv` TMgl`\T-Y#Ơ}q9I~Zԅƞ|K~^E"Ylf{!{q}+l#9>rcꮊV.xǑjnZ-cN&?22=+i]rmں+(mQEW1qSMWPC){}+ntLZ.5wCoܐuC*#(e* Tty~F;A?>F?R S-c?Q%yj 3EOaH 7eN9Q9'jtzh !>%/͕3ٹi5iͩ|?Jݢ(@5yE޽]_?pz6@cP=OsR>n#wqʮE;}QUS EQEs#=.݃>"ObesStgTmZη +E`]_p -3Ì{ƺ()FAY۽~jg\tqTQEQT7b?Z9?Un<>5G u?ơѥKTFzTC_Uǐy=*|SMU޵v _J$TCT`Ĝ|8.aAG&UaMn?^[ۏ8ꛏ&wg8bHLa޳'gZAIe-v;nQTgiOOUnVOAҞyʷc_*χ&8ͻ1˥c14JiOs~O[A.֬Y?7}H<Wi+ѵ@Is|MmV/KڥϺ]g[2 Q5ETSl8 ǻnjc+o\1K uc~u}~ }ZDC+ FAWP.4{سy J{QVωbO;~K`BmJs({ ЬjɶU-?}fՊy0tE珧Jע(z'ȃ\ݓb:ֵFO:Z]DOFV"0[t-/^c]^N}ߴkd5//nui>]zݦ{rJES%C I5i?w>MjQ\Cr&?vKp~[tT jVA8=8I;A#'zkȅC)\KbZ[rL'}kx_S[َ#+(vF,݆HOV)cGjbAanhb':WhSHp5O! N>4Akj20v(mWY ;9=VT*nPe:PG~G}@6#NO.]|koTʦ~NaoEc c|@_33`OH֠+|vkOUoQokꌿ΅`=U*eOߎxJ6csgITʑ/ "I@H 3ҬGb bj:֟#vʨ 7kc."uX rP]t.\屆ժ+S֟cSh:q!wSңrWqkΙ|cbsƷu }^ae'r/;MrQq_}*>ڻ}N4w,VA[m^[oFr2:QEQ 5^jmנzog n7ZE5"3feϰQPKۻֲSiO[FuA`}o8<ιɞ}l89#SgfۜЄfiRk7SNapn8Uy-Kc^)gBuQEQEP1F9 vTBaVhdzёFGek8wdS4E…ݾNO`=j͎4/)=??:}W̡dcl&?*nl2jk`\`U{HT!Ll ՀQFn]v~u[ٮE#x?n,#=j⏒& *-Du-gNOY׊M[Ě`Z4 ܽzIa[ҝ:~TP:0)QEQEQEQEy/|dTh|:f#IgJ(*j/l&=]x=Zt)LrOdNӸ-6;eIG5$2yG'7)ınKr=}ί4gH6Uoz_/&p:voi3Rp5:ҷ9Efk3c9?}^Oiޫl|tVQE5:2b-m/V=uPihwNW!mֺM]7[$ʰ7Moq=!]^{{uh܀u /^+3N @} =o@o6(䶑(wcˏI O!ȭ* ?<Z((##pb_[!Xo4ʊY I="5LV>J죍"cE 0QEQEQUo5 k4d(M6hR>h#.'.QEV^q3̇*e?ycժ+}HCNڳm%c8^Cş6v䓴Jע} jhYD#f2+D:B=AcQJR̕\꧿]N~fETyVrpv>RI*z<]U'I663{Wf@2j鮤I?_6}|2NpA] QX:Ėbv^s?ƧҴe = ?P;'^袸UŲ^pz`{A4ml}nyّ~ٮP>''kF#ҭ30vէETr[0İɣiҏ1_7Btl>e[6IYIN9),|tWj653L:ϿYԙa,F緭aWE˹-`A5u5a!أ nCgvU'ںd,pS2}ɣoRQ\߉<%e;v9FNB=kLVlp=qSj7ڵ<$9>/oI6=vQ[ZA#/,?N?ZM;Đ+;!IS-..AW^N^MRRZGܩ44BS?AU(>)OerbjV^)% ^r%R@ 1Q= yUwqdQ& ʐZ/5"ĽWq5(P=F;{URmm2},bA|:}2K.գ#+O6"(1=딒9,. -x=Ru vt=?Z_=?3G{wgHtzGwc;QƎ@2D0ʛk\u٣z~fQ?TA C`' -88=Cs:[;ώN+N8",d'y?NzT@d>֬eeF ؓNJLL2xYРQ 8u5i|gڡtcAU-u*y=jO'E\i' r)EwN`#E S}?SQO F]Nnd;?C-D!$Ά#q$6q[+dqGCTݮ~=wtΧ9Sۊ`1]4[A*I6/]џ3zT`p 9?Z[a{?)OkQE7)p[:n ^;=[_AOLTI&Z>Xxمp^OO'k2_VXb8cOj[C)'qRicm=rkf{~<QEQEx+QI{61+th;^'{ە }+ӬSOXzEQEQQ^)G_?zGCY^"-Z~l60=?tU*: ١e ?uvbV>@Ms%c U /IDOeEjڅ̾NKEԗqTWacdgߎ[VgkR|@ñ^"+( 4?t((.bB5E\bkԴ ,$76ʲEPqֲ/#h,S)">b]NlC# 4|'ne*xZ?@}mP }LX!Kj+n"_h+k/un])c5O9jCLwf=b@Cȫ旦*4^b(2Pɸ0ƮsjvE Km6 pI֭UxkH ZQ)q$g0l%[>5'?ƏМ U-ZggݘT@:>ýLnYB}n#'U]}§ܰoOyv҂d` }ڥS )A"'ё+;T7rG9iˁq(=Tzm_ι[*H\=lbd"TR84gm?#k(( A1;ZVf!'U35 M+^8 BXW{rڗme ;\S*^A=*Cʉ~p*$)vsTutޢ?>lzm{$uQPaF)%TJoZ1h*)%i[d}?2 _+ӽt $bYj"5=IAQ Cۏ8DE$RDx˸pE^kOjP$zdQÓI%*[tqʚ.JA,Rep_UѦG8>1d}!Z ԫ ڳLr4ٌ}*憲jR?s\vVqYǵ[w54$H]*_F8%+9翹+vF27sSI4P"hOCљ#dy:hR~/ebj\~|XqGǦzƴ!diu`Ui65 ?g (~ЂC)REQEQEQEWxG\8mm=j((E`kmCUQYnCT3?*SZ0+F3p*{ k^?S[z%wk9֭)v 2I=+WQ?MVƝŧ+RHrIvYvk2_z]߇|7oKy1o~o峃? w5~N91Qע("2.kB3VQEsφr>~<1KIY_; PAGzZ(KG"F2Gy^3BK99rq^76^h^5< ʗ1>` G M:f#tWw$qdHӘ` 7MˏEp?W[VI;_h z8QԲ[E_>UkZ~ $v+pS?`+ Nd \x6}o^յa18'^mLAnqR E'?^פe?!a?9ת463dUZ˫_\L#&S;~]? +?~M{ $s746U%tWszΪ^+IG'zu"[̔#gQEQEQPMw#+2x_1GԖ6.puA *<_ZtGM$RkUɄ?D,s뮚F`Yp$ .|ɏm:sǰnbQLL㨧VHNf!Gn85wQ#/"iJd;bNȌ~k a` owִ7tVo&V>Х kU#) $*~Yd-+cz~}SG71yEkIqqs۬.h;c?n?YqhVU?+|Ejo#J(((+?b z|aMȮ d͹$uEɯ.cA' =()"28ʰ W jkYd܎ΰtҵk.U}H<~jvדrZV^wyJ~gP-o3}j-#;oSy1ڧgGְɼ`[oQXB#T[QEQEdkŀ \YD?E6I(Tu&&}R&Dc5lwǾW5ivW)| G8#׫HF՛&Xom MbO@٫ NO/N_߾Bǵ?O'?ҴǗo$0)oSzVSGJ*|ZԵREQEVnˣN|!;&9ʪ{1^EQEVfZ؂}Msj:g>\ziAiNܟ[((#N~yYd^]jR m:k?Zɵ/g% \VԴQQǼJCz# m䵓Ϸ'ҴuPOO_]"N(p~n>hg-7֩B^,-5KL՞OeBozAdr+-m߲dAW被&)Gerb*3MWBcC8vOi4fR$a: 8 (4*S9&W Ԛ縺nT s{ޱzTR3*!w`$Oswa# c;]&?A*mSR"05oAw(8V}#I]wrrW?δ<;Cqsd瑟N?]}QET7Y\G~b=7?ճEQEs>&x@C؟ZuTqɴk \=pny;OEQm>c)GW_k}!*wRsiwV@CkK=Zٞ+bFOP`n;uch]M0C>cEt 'jԷ@rJ6oB+9>yr/i'sH!'9:SRBF=QL{Y8TDm#$ [X0^REu܅U$YuT[H'?zEkoHP! \֩I}83>=Zy=YMs堊x+z笛7msMRN!LYn~B5p Uq~'ᩩ~?ԣQ^hOQɫItvSW-mpXkb8F#Gy5|Yl~IqGҩ/B:cV ֶR0qPzXgvb[_lz~PAT/F?ZK{;|+AaBn=sS~uYw9֝8UwzEL]e'YJ7T p JWvQǶ+"}jyLH?ҫk7#9c+ QEStH$鬋yZSo6@՛O p$.o-l@3ZFDu>^E?A'µS{( hO\&z`uMf}H @]x\cz8#W1O(*hux|g~}#ET6V׉v9Cڰ|'-cr?̿?Z}`>ucBJa/kw|uuZgscd?EQEQEbx\>𦣫(F,Ưй!W>"C>-^yi8LL,͎qc{u;xN:O:lNv(9 uwmvݓl AOMq!Ѳx> oo6';>B񆈷/{%%J;G;nO28[7Ҧ.bvE3O=,#c')m+#c]ok<(v=MX;VFad^;Z$,=V`pv\!w B# 2GzƳ[gn{ޯEVs-iv,&W,Z&i\woVgTiv1c#қefwJyQmd>a^w#2\)ç˟ o&4=U*i3?4'b6紇T\~dR}j7xe ~ F{ kmnkⵢW je{6#}Ռ1P=[:kvԤ.d}B961^Dmʪ]21D?֪I$r1 SUl?Ң>(eUdFzΥ9#(?.*37߻۞+J|wMFF4H%(P  Κ3O f$c+۴ME1i#Ҳ(Z^/~i/PAXа>tQEQEW#k-|>3쿏^fmh#?T-sG#W)՗]6R*E oY;gƸSw?{+dG^]56ȧk k8h8((խs׽[5XN+eGv%b^aH#ƻTS:T֞@b+3CU9+_@_?֮i >+9T1?5f+%{WDi"{MӗcR7j*HU1GEQEFc#hIUejyƸ˩F𒱋b;F_BQE[FdEE5_xIancQ@z |I:`nXWzz ;x(*/@*J*9g k(Y-ђNNz 'Hs%v0ooۄAՍCh_BnRr{]W7k?qUu+{荂}kӮ>էA19,wpZEQEZ/i1jڢ(G ڽuvG\Oq][?Z&D`o?{HF2g^T$,k3UTVp[pZ&,7`$EZrƣk`;ӻr|ar. ?:&Mʩi6-j_tktUkُk Og>¯S$9FV>d<%q,sF}yԆ} X5[Nz{;;qܮg~}kmgU@s+pH=S͗#ҮU.R ɯ19g/va#w-QPs}NO\]6ԅ5vIU9>kP4n)lY~޲Z.e#?f%-׌D`<H:m J˻X-LKgmVSIb~%_X*T壆3csB&رPCnX[3FX!cT]?E-q.v=gJv)zUH H`u>ɞPvϵ>+Id7ץ{0)yk|<[$H+]tujՔ u({@6ѨQ r3R xW1xP:+3@ ,[~==vVI/&ͬYxKaE\)3Kj SZ {O=nn?]3jj71?֟g6/p #%@"EQEGTm; '_$p*'C } [$8?@MW}~;}i#O6˜umV_/ΘkWbˁʳ'%&ҪXXgzdYxJ"ՠrM)d?;?L]UUU{ Z(^[[(M(©57? }t ؞ǻ;yO_j,@O8BŒ)Vt[7oqk~ 㹈IeOjJ+S^$\gI*MH?^K1HǶj;F"S?* f#uQiJu3jƳ a+455 0Nfڋ ĴnTgEJtm*mSjI=XO!UXU-JY7׹eֻUUD @p-;H(}cƿo\eU;MxIɍ>]QEWr<|3ZQEUCW7(lp5k>"mf''Vrn&* [>{՚%?mMᵼ_[`ǽd>,Dr֭7":B+/BO8ZŒM@q\Ge:p&7Uɱq1[HNA=>dku#yW@8?Ư^J`Ԃ#ߊſպ+ӨAV 0@#i,(JEr2!*kmZFgªx_F:h$^?fjQ#ֲl,wgnT֍E=VW ;E'k"ѡ..HwHٶ?Z7)qw>?68$'V1YT277m5!O^U~iOhiN@iXWQR+u)I9"#$Z“#5'hZϿv8ʎӤyPA%sQ}Y[$~5gl4Ke%bpHsin-U ޒLS e?W-i3dO@{S Tq93Kj)4j6)@?NFru*O֮utrOS~\mi.rz.7yM"'u_B׶xDڵ [j gTm][lBjZ^Cz)Kd?қr2\.8i wxoj:wm|osu/뗷ojqd-ʁ(ǶH "YkAA A=}?ZdetWF 29REE:l4}fn<7l䵬nރ_p\CǓ#Mx[zw(\ c-WeXj+K=v ?\.i<U=LTmBrОQEQEQE6II*('yiY"Mp>}֒/W̰qve^?ZVG9?xL9&_m%9QoX'dU`:@`APqqj*ؿ(($e en&yG;Jݢ?떷+ w.Ś 1ZFիҬlmU$kOsR\iM+aG}e MRN==$%5 0OC.{Ӛ!4e} &pQJ*)pчQY7XCѳ~45C W26?p>n* mbmoUⰄWZ[<:JuK]>+ cOrGj^kZH;-M˜=IcRTu$t]'!V׮ryrOV0a"@+ŗ~N)d;~ʰ4x cnj%IAUG-YA7L֊41 x/|{RG iҟ/M(҇y?Of߼0&. daVŬCZp!#tE%ךc%Xf&D2[:t?YRÞ1S(})..z?-45z\݈FAohe>l9W _Ê1ޫAn "jQrP:fүYZl2n2yg|&6m+9>\^XpLT$@;CyO&Aµ+P兹ǂGaXڅ p 2gdjz~=r׺ޡΒu@NFZ?$9X*zYXAN]ƭ&~qg ^sm? ^iO* @!RQ5Z291ҳZÌ3 $@?&[(aOPSk"}:E; 8?[֬N]Gdh]Jч v^\=+J^_}mwcɒܞZ!T=k?R˅T9ͪI܌7֧(BwBctǻBA7y̭w`~󒛐 qWCEQEZbs`}k"oJmŰޟAzS,b^[YK*T yf )N GS2hs+F*7f<+csr)yBUk}NkN%/J!W do.(LZit8V({~ 8ej ;5P@ÑXsPWg]h AݥAk+J?޻]lUxu]?.kWॣĮ?#̞ZButWE6" t *j?v[ƛ7pyNRdkqVQEV{XVc[İD~ܵypSq^}fâjl`B#jN}agya nB?*>9G'9%F@auxIA+]7Ij((((Mm^ai~r-ʃI>*3}>c*!C }\U_󮊊lDEcY$gu\'thQEQESԠ[n#% ]>kDD8lZJn&`5E6Hh92[&LY lY_E{CS5Db }Qқ+Y+V,VݏTZl!31#D8[OusEUO2y:h)]cC:(_SVY[kH0S8"ie`$Ƶ -95[kC E(\=~ {?I-nrG5ݣʰjuQE#:v 'U[NccߥEqȁ=?ƪ>^SQenO]ctmBs(Z7ͽ..;V[&ؐSTixjO^y59uE#0D,z\/j7w7 $LKn=G+б *cqh;\Crsֵ-.Vwq"t{ip. p=8th{rF??ʭZAVgiۂB9~G1N" vHEi{Q6{V?؟ƹx.ne7)!(3*Hg?a2p]=$\F1ƄM(}Iu_SJE8q Q>5%j=/$vOHft>}?!}4C7hoOdW=H1>H1DҬ>$졣^;RI1 H5Cx~ovqPxQ;Q_ <֣aɵfxg5C@y -Ӛ,v/Ω U%b:;?:Ɩhd^u`U75 4g]?Z蕕2e# ih(Ut#|sFld MkEyW6\G c>!7H7TQX Ȭ 6=%s+kJ\ 1z)FA dY};G8WWlRv,U+:P٘a9~oZ~&e=E[bTt.?)^.>imEw.kbto+u܌oU_^݌*W N-ݜP}8?ʠM1Z/DbQQ7J}ֵWJZ?7aj({9ϑo´,Ŭ<7_ojUno픗pHz}}+ԵۭcvBd~RwgoXhoΛ㵻]~)_ j4y4R<%‘\s6>%TM[mՑUv '9z^sBVx5q0_PG[%:XYYW̑GgV}CĶC7Zo:H-ӛgYź{q,w{|~ *o{+WV)?pKEQEU]FJx&?ܼǬZ^Ii\֯s}>zar9s}+b+e5Of8jlFh(2_ųGiQIē֭;ӌW*U*F=]>_ZsUWQ 6Ôts}>A#_KL\N7ڴ<9u#u8SgEOQԡӠ'焌ucT/BQ 8aUF;hTdڰ.QEQ\VdLm?4 0qtN J|b($p*ΟmDd\q ׵-h ~f3Rmw~%X~%ѭV Џ񭈠Htb3+GS\ƥy9vE{ԖtP|zQE#6%}qWVr2ZN1o֬m%6=dbT6]GE0+ִ4Y?ƫiOvr :?SMR'GZ`!*.lnϖʶ  4z|M~՚{td?V47G{Aڶ&\Ϩ*J*zV" Vn;?]FIkmiI?Awa|Ͻk[i&Vhq Ity gDzgR{Mn巣?:~t-`yqHW/4f-zgrcq2OuO+E*I՘tj5r!\A_k~[QդUiau͂8HPh d CRJ4ZF^s!%'VQEQES.H?&-޿#=׍%B" 5߅'%k! UHb..ZX#nT<ַ4uk"pYU<~-7zNkxC,o+V(n#yl" ၓ_՞a/E {Wv|ltP5zF`XɮYk'8=\! )RUe =15EV]F}F9*;{g9z.EI<5 $AQEAw #/"l&WYdTso"yH+m%_\3/Iˑ~(\Эɷ~@rzZ:L9컍eLۦcU13r[Ut]B^t֔G0QOsE:ڢ(ngExQit2OfsW'լ]K[Wl=!k>!al>DI?װDt( aQ(ק>Ӽa^7@ڥK[b`=3{08^[{uRԥҎPG!}wD-&+h]C>K69,ǒ~EQPOeit1qk FlЮ~ ۱& @x?Ҩýv?dWhvScV}ƶc$=L3UQ%֚t?I\ӜT7銵4XM[_Ҧv+'x8?ʥNDq[VN! n~fU6"4>iJ#g=\>+I(^Mtv kXSQEeG(?Hf})4/EQEVzkR,tUxζ%Goh)r'PFFJ4Ɓg%Wjʴp-W?o4kHg滋}94gۅg>Y#?(8yF:sQwWOOeXHXEDQURHrI)d^[KP~'s+ӴtQ C'tQEQ\ &.IGV2X>TGx ir8ZMZKrz2⫵|sutub~*X aK1'[4>yz+xEW $d o3VjK*Ztz%EE G@-QEZ_YhacbK6hKOi`ʷ?6BG>ٽx @+bvU'&c~-k;YOBC>2rUX|JF댑{_zTچIn=*+l᷅Qo:ħ݄Q(Q,Ƥzw5{Ox=V)u&Pr"%=O "P {sV.Vǀ*f5=JVc2N ?oDGw_qq䳎9i,}qW͌qȘ :Q\֓ 7߅4gf}?#ZJK! cWSDQ%EcX`PZ\\Cj"nqs҃g cQ}yedb.rG8VUZ Rx?ZևXI)fc I?CVxNcڵUcuTW1y2w>|- u^G>T4 ֑1=X.9'f0M,'Z4-fG(O!ӿ"Hx.mdCxoWX yI>OZJ2AA*+U}"nZeA}tQET6v׉3aN.Z?oӭx{[\} ~Ui_,.v@ /G]eGYE2܏?\gu)5+ӭ(?AW-mHc*֦%Tuw5!~wx+?f#oVGV.Iz;`;ҵc}?ZQE! II+GѓOMI rq)8V?ʶ(([}/Ӹ>cv*tH1kbKfALz3s5-ho4?RȽ>@3ԓZbaR_T1I5n^}z`x%U#:[4QE5Q 1$RηW[QGa6dG,NX}-XhVO4d}zSOFMGNdcWO4qڽ Kt8amHPhͧt@lܣr+Z/ƶ袊((=ŤioYKAtK\OEe|89OD}5q$c<_T_kj@;/F?Z.46T&hNz+;{ՇuAz6C6/.R'eUmZd+,ܟI}Y=S-<:[]H!Oֺz(_Z?5Fɷ[z"R7?Jf$?iEQE/o?Ajƕ1*зQTm o6$GYsn?ֵ(fdڼ[&ԥkd;_8h$À$g@NEv*`CF?@+7Uգ؀IrS5iu)r'/BUTP )k ]VXYe-e3IҢDjڴ(*ơik:4#suAtYrxQȲ=P~'ұ]gQdkvYq޳t}*)P,%JR$M(G ފ(uzB%v5VLJB&o61TeEQEQYjLACj  sZ}[@?'(K[B?iEŨi녔 8c\/:{Nӯ/ Ee ?7֤W+-vk.eo~[vjpke_}k"{6P6]֙,6:r[i9$unT i>vݏrO\zJ,ᱷTu=5=QEGq0?3=in_NOjKl7Xֳ}6'tZ 2|VQP]]g VǠMs3Oq\d{SW $c~kƻU nf Q>fTRz 3ZDm#[ҭ(L+q @';EGivB`]0$uFLZTV=N g>=Gec.qnk5NGa5]E̲1€NrU=k1QRҹF6s===$oW%H:mz=hx^c!euOERkkʂջc E:@I?>/uU[5yLlmnjc?_j e9ENNIdְdkvH[( 4t)eaЃP%"튡2x!aSƬđ5hOVC/DF9#tiq rToTQEUl[DsYsNLd/G[/cy\OixNwp%mͷDoI~OZk,m1~uI_\(8FEQEU&{d.~VcIIe^Ud8#M爴8 7H2@q׉tV{0\Ըʁ)c1$R,z2fdڸ֐J;:a:c?! {k2I\϶GM\/~eS׃ c7֬QPsHJ)u&'_&B?sZjrT7pdO (EA=EQU#>dYPVmtȮ8~Ux-$>sOkgPӢc#IsUlGY˙3Jӱ Ej2ܜCR[]MU?/ mʹԵV>uQG(Fj~~uc.<+'Ñ1,>^?"ܥ.ĮF3۱"¾|!k$Ga0+(:h|_$8((((j7?d8*o?Z-6ڿAJ._jt> 6vV%7޳A+r*tEOnqӷehU\l(+]o R?Z=0T_hi*ZZuRlȥd #rgۉO9?l((ۙIQ̵{B;/dZ1g&(|Em MǛh}Z]GU{kI[xSW-a+ч*j^lL~V=jňž15;Df=e[$+}?Efjz?& -]At֭\Ӧ0]oh6 Lܱ?}µ(mvKtŽFrr#_c^( ҃?e/j< X__c9sS=kiE G@)^{9oJn[sDT\(QES"N6? #?Rkt 34V“Pnueacɫ@>EW[CT8/o -x%{}*1%njk۴4#fS+œs]>`x27.] F#W#zmr|LG׿֥%>λwMh@aQ횡t^Q.2AGkqs!ʺ%d;X5Ŭ,B,~Fś?Ÿ\z??Ut4QT5stg {s9 EGqI#V5";PybK96(ZԎE!ȧTmM5?U,C/#0exB/s̊pRՇO!*EHgǏ ڿRS?SVR4ZOϟmEy\&kd~Xh\,.% >i@q}/?j|Eo,Y}Z&qvź-X ?[K)D=iQEQECur+bQ{dz1Nl.Nވ:U*O7O.;m~;?8U{Ji:;?Cgŵ痮?}w?SW\@_]7GR FĘ.~ 9u86v&zܢֽN\)3zίQLT ^I) ;{dj{榢^Y%YCjE!G=WZ "(XK(~]}F?Nڰ5O7 k[q?A;#80>kcso+GU3?2vH]S%{i',֒.U.}65V[ʶ ɪƤ`?:jZ_rlgz[ճۢaY7Zrnk1c4k{tzW#फ़e -T5?>>h*"E*S(/V_/*r?-żs/ݑCƤ(((cy\?A?Gco[a*zֹ5Vr3??Y%> }yߊMƦbL5[K(`z(dmOU$дzڨ?쒿3v MB<:l\;+P7(2@Umj4s3}9m{/]szZuS.f~:j6r.c:#}iTWOHbw~ y~aV`3qU*îk .n[w$@]K ɗw#5-ޞ ш}W#|!F>5wd/9OcZ"30C7>Wڻ L ?Α9i»z+#T_ح 37a[:6mۉ'alaSM#H~g7fY Un?[a&AnGsV3si2yClH]*\@ɱRx Yif`3YKjF{hg/nAU<7[l˲TV£SD\jy +0;J-Bi 7ajډ\A˞P tx{Twƥx'GY:0e=QE!!A$MshUyC{ʱ. naS˒WXЍXz.C+Z-R;*0{ o7Dga<(z{Su]V33+2Mr\,|pF1V;2[R3RpSYw/u' y4k!V, VwGKc?li'} xAV>"c:٢+/S \80VRS gQE0FA{6e#U {-dsxcZGQzT e&9kJ tܧҥ?og7O(hyk+vN*#G.>*S_vMGx/TW xa [QzZۯ*: MNLI5+yϩϭe?L&6k5'i;ߦixJǝ?AWm>".BؐGVS5i ^KJ?Zنxn#A*JTQA8=+nUDkk *N,1N%dSنEcxrІG#sˬAw6i~a)X6";rдƺK=N\# k ~nf,.Q:JWJQ*K$juT/A=0+N=uj=Su`IlcS=ZVtw?Yljh?*s?\_ww r5͑4FǿO1_Csº?l~˥Z,Y̕B;wt((Eh/4KY_5r}{[r_ʶ((((ZO$#lZ73?Ar:jײsBsZרe-MyޛDw]?\WcEQEc9GPH҈$`GO= A߹7kro? SA%6Xjܒ*#U<:t3(GZuD֞ V~j# J֙oU{wsVWV?xL:Mr'#:^cַD̨{zka FQp+)-گٖhs_Za\xvj p{Iy1x՗6fv=p;ѤXk$ 'nAsMy[u#ոt[pL^czså^DH**0)QEQEx>Ϫ[?Cb?0ڍŹ*qՇ}CZp1ČZkcrǫI4QQ\Y~ip:Ң((|U͂c,>V\Q`ZtQEq;ĩ \EcxH51Շ놙%Nkyu±f*[,Jyk ={6 /1xjK-]-mӡwj!Ҭm*F;V1QtU*)M/Ў$Z\<߈;o8~5j܈,IT,,+OJϴd矗=ϭV;U*aonj4p}Ozޘ/UK)l !#eMhbr3Z5 )*26I:F(iQE! OAT슞t 4Ǡ ߙ]cq/'G -18{ Ҋ%5E2,c5TqKEROPZ[tLS֬Gdoy^vVv=֓@M5Z & _]>nzAֳ\E v'Ҷ<+z[IjpT߇"c:˞K@Eji`, 袊+Qh\\HZXPޣ/U{Y|>OzEQTt޿Zas͵:}=R;OnƚѽvIpU{ʲV}rzOEQE,ntCu1esV~1Pn~duƣm3rv k踊qf"z]Aax.c]oRIvQF]#C1HPrhxLm7n#J9jFSxnZxE7 q֍_YKq 1~N)6fWTQEfkW~E~V"n5:bxU󬹴u!~Gڳ GXӤK*tf;ׯzn|]3{XU9`SU%Ӭ[[Ypd,}Oڼ&-ebGЃчu4UkZmci.ncsrOEMfE ڌd+^8$:(.cǸĒm6m7F#+Z)Rd4H!yQ% u0IiU-wSk"'++;VE'Cں09:KZ FBq'<~4sSN-G,uqtUovV >8趼,ky*vW7D4U}*ƕiZw'[W|kUz`;6ou\o*C^o7E&-%U)7"ǩ{Q$$Q(TAQS袊(( A؝eF{?󮂊(((qki,YlzenI;O(!#ca}m-ŭpSަ_]Fsʰ+kIrÙ[?~(Eʽ?kL|۴}ш*WfQEVu0J UDneKv6ppyʢC [dnmT;ec|fz,,Ƚ oT5-AHO#OӚзʸn2Ho!3j\1XאeuDc$7@ lixŶr69ZԵh)תW~SOː(Gkp'ʆ9]4;(((+C8 @G+ڻԠ+U m?&:3bF88֮@#KERGr_up֥QEQE 1A ?SS,d&G ttQEs~,>LJ9FMmi:Q~Ey>ϭ}>'{bvG&Xe. tD˵#Yڵ*gbE(G@g>,GL,yPhQE5#ykvgzUg'ʺXq+`AjR}SXAp~goHq/ZBV<6O+;^ O@*sȑDsj)O&Tz]ekL${)I;!'ENy>b(w)$D{蕶B&l:GJlĈ~~Ÿn/,B'棰B4ZUk˵<?tUXrM99Px_2NVU tx3~ha&^!8WZzsb{kЎ~u%ԲnzJb֠amdn=qF&ioj~ w&}d8>o+Jmڦϵ`ο2jƑ4-t?/VRz$')zQ]c#-"pEQH@`A;WO=WnbP} 65p:֧(;H~M̰Mg,bH 6v0?LF Ca{w>խEQE! IMQRdD>EP0:(cCѾ*[YcHK"9}3}?G5䋶h}V51ki"sЧBca0>)?.V:cI*͉3kFǬmݢBTկ;BǴFEYu ?KG* ¬n v좸t]W]<5)UI~Be2z^ɐS?VcOK~\NJ7qWl4P'ԃҸ ʌ:~^2:Tʫsu5y[0Itº`yWjöx mP3Unan4y`*MS\OdTSҨRG+jOPaeEL>5*Yje}Q¦M_O~q~'Φ[GP7@jeuq`斊hRxH2Y$OOFߑDĆKgч~=Etׁp)“ջi"2Do+W)̱H( rH^ge!Fk"K[nEF|˧~VR}irƮ 2j%}OJd pµ4{xp\n+Nqf4?*UំzgMK_[kf{UlzhBy>[ǩFbnU(((ƶk1x'ʟ#ddC`>Ө((+ŷg@ҷ?>5c8ڛܞ3l[R%|r>?lW7Oo&RȂ>v,z^y|BZӰq? zv I 8qַ((1\ո6,'d|FxwZ((sw5~ɓ_j[@ќ40O@XL*U*- +tQ:O32s{^4+.%i!tRFּVj7SC @v}\JXHvNJ7kz敧EL wa;ZQT[8nҠ:mq_\@?S?·ov7j=OPz5f((FeE,G$+Q*F|%B4۫IۻfrN9R͢U #r0)ڴ{lҶ:&*6EQ\٭'l0袊((n6N$UrAOa/~|WLMrEGXNq2BQgR䀞b|[FR"R!:r>}kSHO#`m&e~wzƯn 4x% {CRCp27?9%|EQEG<(zU8PdnOT+1F}_I;6Ľ҈ˌ/Z鰁V?]ˁGsɩju=Me†CsrvO_aZ@roa5==UT"Q: ut<|ڹk;z4+U3 !]>A<2cγ/ojh=2ˏZ-4$a|2 oZ˚3<HQXOƙ_niY=OjzDȊ Z jzxzިjʴ!q“ڨR~cֻ^@x^c|ҧR1V'P8uEQE5dB2)M27_q5V nyK 4a^Ҥ(F" >e;GV[?88%|Hާ˛8b'^9XB)QEBVQmPp{~55.屒 !)AJ{z_ kgGL>j>'myWTW^6Xk)5ZuuTUIUpAnQgT֥YJ=<0>EIq"bh`Um#}[@Uԗ-krp2FN =? ٖLbSj)I_hi;{ֆIy'/0o+us]P(0A%m >IOUW!?C,j<[v?-U^@QUo(?co+MA1_AJe¾)4K"O815^T>Il.O6!X:}Λp$2=Ug,`P 譊ދʕjk.3 ;,\1]jA%s#p^}c<[OHG'OB*=q[ֶα R յ %M9w@CNS9"OǧN{K|Go/u~kGL?Jpl>w_n-gOS7eSڂ}/&ϠRoCսewkO5HnY͢C6wVLb+P(u>'5r|akr(O*I?ɚOR~Yږc/֩c?گ2A9 [Umo`~bHe]~ ͺ/~r[kz[}."3A}0sxOSX^+]%n~xfĬ>^SL],NxsڬxsX\5ܲ/@;{qn׎t}_5 {yg=ʹ7p4xۨ5\xb\[1{f8L-K6~2yS{(( jX<I>Kypgw֖Z sےjT#M?07R3њ1,/EGmۨEQ\Y((O&WSjO6Uj)Ԛ8(;NM#^|mu`$tR#j҇q!鐿aj6wR !>b^!%*#㨪z|?js"J޻g_? t\z #K*E-`;jЊT}QEVr'aAi""$<j\~weޮ7!oENk[n qjݦO%WkN;xa]zy"a"zVȤpQEQHHUcs7"B?9YwHn5Y(N@O󪉙ZF?Y}+ZteHc.V>^s,+{zo]8dIkYc@0ckY؇OPj=vXֽFҗN <=+ROF$0)+GDT+w[ImG+)Hn>Y2Mvg((({F翥A Ž[nu45?V?Ҕ&?RqEi2MYGLn,hJg%ŽK{+ ?yṴA]'X  W+ R6E>c 4XK8?:׉|͎>λ]3ޏk7V ʫ?ҭK]LDY rB{5ʅFrT՝˨wYw`C5hh7Ii@\,8[EF2gF8wcB%e~u`7؏rLUs`[)gi!GgfG-"_}{+z-TZ# =h(_x6{tbsI;In짧=ֹ$JMN d6}zb_B[AG1 nKzҴ:(((lFѸʰ PkCYk76n~S5EQEGھ19()<" uȱyHK+";ۋ7 `L䓓\,#$6(cS t}KRSej VFı#ƹ'ȂkK&〤uH#C*$ox ޿OUO, I%SCלO(a,ÁʟPIanEQY̾]?V V4ɍ3@eKxx};sO]PR3L3\xEQPi ;+׮6ʽ]!.O0({7U+5Y֏=|!׮(Hy~!F#\U((v7?ȪIľꎥcYr}li?jG',8oZ8|{wu}'i(?ŏcjZ9ӵx.&;v{ 4*WdُW0Dwf?AQil;xb\|;GSĺ _DIG԰SH:f(Zw9^s˷`+AMhojb{?JǚT58Sx?ZT+ޣK{{?.zNOt @K+Zx> up%㜌E4QEUKOZH@;X>\\BE68<$Jr;8qB\`wie.&nmxlʊY :XJavTQ%9"āT` 5m}ͦK1;L'-p7)Q5h:GfVA}zd2p\ܲjZ'j۷hF.Z1QV,| G=Nl·j[lYZvVya]?iZs Ff>YsH^T?\Vr xO9>>y!WRVy[ۀ x . 2PN3ENCօQEQP]ڥ%tVK5?jcpQ՟##QETsAe%Pg-mb_.oAӣ]6YP}kT1$lOCOe"۠5h3FxҶ(:u?*SY `ocdU]?A >;A޼ִzmVR4aW1N+/Pдi-cZMԐG^nU-u@&#=#޻=mr6 <],v3hm?"%?ƶnR#ױ ծ^~/ErQY J3Էw\]4$A2 XaKۃ"C_h IUX 9` iL|=L`+#@}QUw/R3oS>J,ҍ+P_da_[ii_,Ih`'SoV#du?ҭG}5?E#ոY٣o Z^ҥo)ygp1qΘNBV#aOjӳSKz8\E%Ug&5 kkw93a4@{,a+0 fKvI®=)Oi[,=zic}!Kpy=~H𽎏e_:i̮:q# 6`vn$Ԛ'm6:.D)=< %ڈ0IEQEQEQEq~'0_(;X?ȏiҊ((n.SuD8_X~2ѭA1_p+ .X,~rXgKRF@Z4{z 6m-4y7,YӬ㷀2ƪ sWi357)d@G~?a>OQ8 xϵw7NKLWȮ(*IcI^> LXCSh#?ηh(=}<0/SOZ/3ťIןTnM8 7P;/^("D݂kɨ(7-7^)kMHP?Ƶ(FP?1 Ԇ QTQEs%:?Յ`t#"uU),; G D?A(ѷVot?QEQE1q?3h )C)V`O׷CIքڙv{7;&vzz xd({wOqˎQ?4QM ͟&O/e'TAclؚE 5sÚ#$"=Ua={`MV.w#;mb6~q[e㝣Ҩzv yδdE|Ca;>'f e׽s:|PNVr3 U_hXU^eN j5`D2gV7+/u+:70D!Sި)6oiП*cW袊*9FO~N$[L3ܗ>\Y9ޥ *R G/]ɸ.~f\$cZH8Qֲ.Z_&#S}ťA{U2Y?\j[c8/iA[[_c?Ƶ4=-7cr  j9Kx&y)bV%*JPp Vm$n0㒣u)>zy쯸Tӥ>rOnz'lcz5j\a+>!OLukkWFc`W8g=ojtMJiR* .r~&"l݆N̖To*ѱMu8aU'?\#hIo쟝lo쟝lo쟝TQ%O1G=}\4fyem#28b{UA=jz >})>o=?CG-he !#?5Y[2ھ"oŪZJC0xB 8Ʃ d++@M;Jz㦓N4i|4jZ|TK__^}j d8ohx,,qs=ßZDTxұW#Ң~%rZ(бfJTP2J[SWl[vO6ޏ666SM䗲 ~YPij3yVx@֬.l|j0 :=: m[e2t<~ioZuOWW3$a?^ilZ " 3WPpHA 5xm89=GTGV x,:aSiُ2D/1W[);*-W% 's_ Rq$=0Ȭw{7/oxEOa|,5?_tr,qԟۉ<ۉ<'{G{QIZK'x*iRu!Ug_ej~~_hUM.&c&9ĦH`SҖXԗv$,Xm9.nYynBd݌{TllVn4Qq /݀UIbե[vےO.v9!,,Wwd??PRVyH# ۙ'd|=DAhVbNa#Tt˦f"_i*Bm>+o ƽSYr*Gרj ]okf<ޣtQEQEs{~ˬ}>g[QEkԵ",#?kbYwLG_+BswQֳ.#d;C`;Th) ޻}?vZ54؜ZS%!kċ>+ms{Hin)HCMP%Tlqe&GZ&ȆzMJxl͸iOATwF<'#Kef\V5$uy"/sԟ^7~ENvzEf>yV>i2pD*yz U* ;TwF]z2SrDCUU0cYǮ\{`&̑$?T%xv5\+N6[ jS*yQUu96«s:ʿt-ѷ9:°Kd1;xhY b&Xr(& O]cu,,T}zIm[RFBs=~sHٳR$|}ҭFRyW֫ a /t_ߓNχ?H߼vZ6q!S^L6>[:s֬}/:_E:>$^zΏ:>$?MWmvfao=ўԉa K)sՠ e(2y4hb -ԿaQ_ʙ2DdcDK ĒmRqk}7BooU ,|rǿ\}(UT +B[`E{iAbmdCVcO6Ip?L~uf۫c8ou׳JDakhU12?ư /#"E wL=XBGHEEtbtEb&4=OQ<y14ESm*?^ fw{mtlCVa G5.ؿڿ`zQF`zW7pC6 A@9\G__RrIܢI 8mC9Sm~RwP.;a9OG#1ie}+V+'KN t&{I/g\c߂ T?񮦊(((*9[y!oT5v:ywkwux;px=ҭ!YgnGXxQb}PG*xS]p!m_Ec>z Nnd;NJ4TQF:(f &)n B2rA o<(6T?,3ԪZ_ eB#<?]QEQX:a)43b袊kƅ݂{W3jSjr{PD#pϠt;%Y?4 [5EP%a>fIsxr~Yҭ\Du*z͖-;F}z]e#2bOjH ۂ-$uhWigeeX# HfFݺ>ֽͺ][I{!`aKc7 ׭d$Ѵr(enN.K< Z ں;SQtḡ?UڊXɤ!Si4Y%<{B9'Z`p؀ REQECwg4xd8oHl,u~ =5<G(2f&$/m%QETsA$Rk-4 ? =VlejQJEֵH$l20jpַYJzo+ D`3;*yd,p2Uu()(#gsv\xT R1w?SzWZdZeĊ7# Es*fn"\D:_OfFͭf?0v5ޖ^s?)D!I2ưo4P>#Dxg֮kQݷ"5;nZ8BDze@r{OYm CчC,rY~C#[O^o4f q۽@DŽ D$=Jܼ G'%_FEVܦEލ>mTU;®~@u>Z + r{QG򫲷Tcev?tb*Vs[b?;rv6m#9?j]i%ߘdq_akӭ|He>([X{S]v,1.G71ǽ=bb]Fc$* dC覲lG#z*QYWVb 끟^ի+]dմ rCMpmjC&lػC{ʓii"LI'=OOU-SBO7#zS♠(@\|7ךPd-&tw{oJ YFUaPGQhbzCаUu 3>.l穕W|yÎ(*RͿ/9CZbKy g;}jΟvUDП];ί43Mjz=`f?ZKKxK#&(*x-ا?!ThdqZ+*\ؘo@~Uv]OVǐXuuZfeAZB#s7*c^Y4L͎!ӤāO ֲa< >h%!&BW *D*7cw5%E8pἚ̈́s oO֬3:nFϨ*@ԏ0Ǩ'4QE#*`=A 1nvF-ܡ8,r*H.`ڝEQEW=>_i-dùn最0AX ɴ mRMlVn|oF t @,ZUQN@?\uhI jE2iRG8U#kwNwk/ ݉? 6SܰUQEQEQE!!A$Rk.5D;U#\;}7K-噇w!g9 kWNاl}KqU NѺ?Ⱟ6Zmsu$(6mir –((ZM(r-!I?ֵTP`)j)/kw5BRQ.kPcrB2?\u?l޶ltجޟJSgIb XZ ;DcwV>f5Tk{/#89 [u >޵q4Ya$]æZ®:/i nz|M`Y!BSlEݪK]zH@`Al]Q}ǵX_A,8'{#G8-ⶏdH}f%.@ 'ZAcnPju_c]8 h(!_kr6@CZu3}Yq¶ :+'+M-b(+7\Km9V[6FKcZz".N<5UB582v1]Z0Ñ{v\b }5j:% %cݽOXVTL2]K$prsw>[zZvu*{tn(LejvCj3d[2ʑj6x[;Y^= OQP5ozҥ]NhRPZWϰi4;M(I О{Vʶn4&1XjC/r Hu:~fZQEQE,v5kۖsW被Ǿy/s0EXV=] VZXYB܎y"a!]EQEySJTlrWUy |Ucl|~VɬkjjMn[Emnax#zr@lʞ6Eu*{Knd HYubOg=vľRQEQQsCVDddbGw| 0޽\#"(i<]drp+3PoSÏҲ细.#  sֱ8)9&p71Z7ia!l<ɷKL!xЎ]{[( |POZܢm={S Dڭ)wȮPMMσJ좺(("DuEYkhv@#hrߊ61qig$W <5FŕB`fɦxT \!åMF ;TzԷLy6q:1yV?m%P?|U{)898EQEQ\.vO ~U}1D)Zkq'ڮQH2=gA>Lh?\S)sgc=~uEQE2hİg2u[8Fk,ͅr}s S(+[HlBOKcw?j.#"([X\j2 z~ 5 ?̶4GOZAi{نNr>j訨n6BzڱFPG#GӽzNE[|?*+B]QpLV2Xh7V"]?=5Tu+{%;/ /uf+z_B"ۑqlIrsk_K֖lArv8 xϱ+7Vԣ0 >W>Ջ3[SEuh"+V(e~Ϭ7@I?Uzhnȭ6o?O*V~=?eg:t^QETMgOo.7MqzNM<"{v]V@REɢYxۣ TC6b .` G¸{a&I{pw(l&\0籪 615uX;JwvnXZDS4=|0AKERmժ a1횖* Vā9p[l<'U56p8nI[&Osϰ؞|yB{Mʜ?:zIWN k]7w2FXV[gT?eQdS]>حZ3*0FEP#oNK̸m)e׫Q̒g۸EQG^ H1}8k/ɹ$f=j5eua(}s*di6YM9z5a4W[ƿjJB@*h#\CK8+na< 9WEВL:HFX4k*e;{{贝m%@_^[=(½1wf",hFF`YrIX_͐yo_ֵ4__J/5sG`" (/mG ɷ td9+S\wRrS3ָbSĤAvP*J5|F=5~ξYQ:zӂs lsn;(*̈́7 6-~cSAw/EV~6g9$V32F{+^r\GaYrCV&RGeRHsIS ҧq o lQXʐLl 8#R4E$)8ʵt}c_Ů>a=kXdѺ2Tu$ZC˿#/O[`k}ojM՟k4 )] ȭ(?2xOHGkAvK~?Z/~)¤~JG\*vż/~mTB5 3KH߭Zv p\ԷӬ0`2?(֭QEQQ\.->Ҝn`JӢ((SWxZq5E(wXл2j]5ă8B(yKA^,VpuQEQEr?*gkCHrOAՍ`CֻuLJdt{I±DQz -bjTr8հŸ:s[``t_i*vuB$H>UԔVNz+\'{e#Z >iFoW+Pr4W/H7Y(TuuR}~b?jfUh$o]|G=+7>V#jX4]vZ w qI~Nuz']!2AޖjZd:;ddr@9j/ktp9Z;X:0"EQX^&urCKmryA/:H'w(ӧ水ͣ/d"EJRR?PiEv[zu-2=ՃtjIuEQEeQ]H }cZ[,CŸzqw1i#=yk{i#aRӵM-%fȑ zj:~ϔrC*(PLg~5|a0gӺG%pVU@t}P}_Q[;f(pOv?֭CA ă FPUAT'h̄}{,z*j̡GGyPGZTtDG\GH^_|}KKW= 8V=\4eO^Ƴ٠x:$lG|/O(bFIECpPUj/* 1q'=Դ/r3[LQX^ϖ sy ;*rI_ @nniu &{tf H: enT֥ZGAsk(Ϝ֭QE6"EɥEMy5,Grk2YPvۮ^^HhfPyA]=md78}?juJF7 u$\ciMgC GcPN)#ҴK6>ԗO<^]lrչM.}q\Njm28*׺j0+ǯ5EEv4v gOlS[WW]A@&kSkپR nWHT{?J4hH!hۿVq֧kXL<ќ'4wuRGO}#VR)>*ôxjն[xϭ>Xı21L*nxPZAyxá3S ų3W* +E(o<ʠ#nXJTK{m򞑯SBMyϥm,k۩5-QY|j'i'/ J9C_ζt럶iOY~oj(+B5)f^ߟl[$zI2&SY6v7ڮ؈/a+455 0MhEfդRǩ5_G5 eqQ'ҷ?f,>MXP9wOkjo37R?khz2&~áX֭ ?y ޿_Ҷ|3|/4Bro+f4"mBFv0okE~O+? xd5mui%O ~(uSxjI%#_Rk2XlqTIްBVixj5* "wsWyʷR´gI Ebkn%݆AZ}&2##{cVgYOQ-NyԵxZ͜ :95L`#6ߡo2Բ~z2FS&ǥw7Vj=REG<+<0>^Q!: tS( >N%m;v늚DrǠO¯.4gGU(*}bK0cq]8ף u!=AcY˺m~!/^Oȼ-}봷!$MJ* G{XyM̼r%uDI56uL-t8,A /d\d{k8cFT`QEQEkiє\=*z{öЦ#}AG23ղ1a\ǀgkmNNmb{22R2`¶4M?֍s>'LBޘg)H ā"~uRv~=ҴS_¢m^!PprmÚd:ơgC8*Zd>PEj.,[Ƽ?[v0NiP&bHTQEQEQEQX~$nʝ>ݗz(+}6QXS[@-s0(4EI?Z(Ԇ$ǸIW~K=PQx?޺:((R-@7MGaSRh:k %U[]ZU v(=ZLԤLV>akjb(U Sb %?}5EeƇV۹>ժP0`ږCɇvG]дoPG:1R>kuBMgFu8WiښmR&g[vd6;~_oWk;YvD;. .Wx#"~CqsOKkwBH>Xo hg@0}GrEy$dn= B,-} Yl%=H?rY)qq pxl:ԬL^' z:>B2z)|7 {?δe8|}9noʳ?ŎOҴ,|>|۶.璹f4G@:sQ@k'Ke,jQYVd;k,Cs~mòzC)5 *k[Sg+U%~ W[o.;G<+ o*-Jk*t}6n2y?kKu;G=SZM-!!5R >izy]V " n. Z8Q\CΜ']R3R ԯ*Ų-ۚ\`ƳVaS\Td$+JDцUyk6f uz-K{7ui]W[=W* PKr0t5 F:rDyqU8pұ>e]!msNaR/=Ͻu.Te߫9KxIja.xn'B;( ¨袳!{Z\Y7qƷu qk)# s\\YчV0dYcMR1d u)QUNc]VXKUF`Y$ ĭm/?ͽ`YSFWĒ-ma?^_^h:<>] 1io+B(($][ߞ%MgHaY:hyM!'pX*o(Qԁk/Lք~7yfZ68XeV"ҧoO"t2RQEQEQEU{>e,X+t>I`?CZTQER3Fv8U&5~ D%TB"^E KEQT5͠o0?ֶs%^,Hoѿ*((WX[Pa!zwts%ݸnji\@q`AW,f'Zn~J]8,bʳ1݉|{Q] yS\M w4Rta rv7zкrxjtNJѝ<]_xg$~|֍TԢ,_S[5i;֕TMpWCkZC׮V6ɲ ;(vCO8?KHEP)T71[&[;FV>3OHHw>dU*+D4gCFtYe@q_X?5*z]Ddqa+:MrZ?WR$CljZܿ,!$uoYح|ǫz{ Eyߊ5ӭH1F طvvk8OIذO*!!A$ Ξvˏ˼Ir'EV@`tUTIU zѐkuFZ˫vۉE@Vʷ>0X4qaĊ?ᚵi/y)IsYRjm"vGW2=%[8j8.H`qҵ~KrAjvGIjI گU%k*pn.) vƿyotk/W'PteD,$ˆ𫕁;zz'LX OsT`iϸ$)fQE0&=±5f*#ш?AIstm39o$Vé0<=B-f=7c[&9w 5"N1Eˉ&i%󫤀 =T#,2 z_,v}܀rB֫z엀F( ~իuK%assم0]׮OB>Z_ *_0gӟWtGXŶLfAR{ zhYvvSU4F>yGPfnc?ʡmf?E5N_UOտ$i5I8Kv_/Θn=TSLZzM̸s.kRu$`aV4 DO{<-k~m-פ"!Ekf&#_{[fHv8~uae*FA"6AoFsB1}Ē!ՉN؜)zίQET3[$ܟ0Ŷ֭H.c\=jj(YfF۽fͩ+lC֬ C{{i`WMy5LhNYK*'^ƤP_/i 8檋h6$v`T3!$f,-XvbTfHlHqy' UkpxqzՊ*׈2֙{d(وz}+DRau)Pjum'\U9b;mji%` ~u5V,n=M3E^_^u4QEa:դv)RGA5xW/ku3E$zuvWmke{!/w?SV+_a]<:(zd\r_J;Z+EQAEeg%iA{3WB9 7zӤtY2pEr>?ls%>b-J= pLեEs"S #\Ur2)RdU|=!kV>k7Z6~_o-CY`nZNM#F;9·(cPoUy$Y7Ew黷T{n?ÞOүiE QE>-A.4>!8yMUn`U?XDGb_M=s̟٠@]vsՊ+faxU{ǧ\֏d` ?J5{<^r(d\2H3Q[jPv.?y0_SYvXU+6s^c55U'\s5k}R1k9Y-7[T~J8ʑ;n籮J/߶ڍ鉱ϡ? ͥcU5uX2;xnk1/xqVɾex8⋩Eױ⹊ L6=׭!DeΠ'wSQEc$s'鞭EA[~\J!WkJfy5KEE SXך1VmÞGho6io|AQHʮYA5u+kqjl]|r*r0EP,2>q8lw l_ZEQU#Wtex?ҭQEE%2}ԟ\`9>ͤ2EVsa=m} oV+cBh ;DTzQ L)=1z?*VVF jV?58!)foH412~jE^GԫicU S袊=aXĝג}խ+G[0&ZQX~.ox}L'Bd?\IYڵ̝~{)"~[UԗGUj䚳EQE!cUo2ܑvU]L18ÌhޖxYjrJ-zD!;3SۻTf\<.EزP0X35F/Lq%<՘cK"1\ 0Y6bvJIAF?:ҵyϥ\6F9 vTb\#έUw?ջkZ+hܓhÏMԯ4yS ~uwo{*QQKmaPj""M܋7R%gyQ$J O(1VCSwwq֥͌~ˀQGJ=]9l׫{ozhfӟ>j-E=vKR ItP]G,"O@*KY|X~Z+ zI:AZU]^ա]r,$rڝ\ɽ#v(gZk+伈|r~ȲƲ)ʰȧQEQYmԯ@zBL[ݝ77?[t[EOi)ȼGD3a.@{Vdx28~c'e qV+=/ZIl+aN91Ӽ=mfJ{~خKS_?Uh))c&M?3\7\c'5rE̍vQחzl^wcVh(.E'u_sٓJldb?.ot8ȁp=B}!JXOΜDr5ᵁ@y_pkm*j;Il[x?FmkV>z>U=gڻ( 28\9Ӽ ,3ݱg>`k2yZ>ꞋTs٘R;h>fjTds-W"m#ʨkqC Q(cx֭F8EU I #/]1H+񮔇LkFt>Znck? Wږ(V0ݯ هZĖLmßjŽWV(Xcvȡ򬫍*H[͵bqۿ^pOMqWTqKUo. J#OZ1 |ǒ?*;[˸?kEX:SzREuO[EU fjL7+akx$FATNdWZwó,=J^5*$Ou{}s-Q7y"Xa>IXX9|5˟劮 ?.8TMoKB*gGl>WZG"{S'Aά++ {f 2I\桪KK; VG`9($k,O=A56;:Cۓ7WqH@`A+6wal2lNEҏV~m((IO هZ.[c==¤:ɹ-F`soHڕ>?T_0s u;ۑ T l^@1IkdsR*&DP}Hj;Tsx"Xj#`Щ'U{ijvK^38lYK[/QT7fHnZr7@}jIիϸVSD(OPk2K+)N31\+G'MVQEQMxAEa5R]"_lϗUGyED4FٷZޮ}yCTxύHCk.h[@<%Vo5*HCpy^*sHNx?֕QT5kofN޹8ͽR}w}㙥[hn+fo:QEQERϓvbQkOxJ򮶑QK1 dxSjS}1qVEEiڙ=d $ʴt ķ?<֬i4hVi9 ~=ɛWbr5Q]K'uRGֹ%3GWmi_ΡЭyaZn.#GOg3Wh½8(B;SK1u,q\BX!f<IB.[ܱ<֪"ƁBUMF6N|/U ^?|`|rcb?1QYB(3OEڼG#*} szlg'Tޢ袊(X·dãzit^KW- =G蕕2TK\cyb >f{z~-oٺ+{z"tGs\q6,F?=Vqc$6@1Aug<S]&nȡF9Er"5WCEQTiž3FܟzLv-$bwcSyͻbI9ٟjU :KEQEW/-3] #c\O ֏yV"ƁB:kI< }kv./C\?uWum1F[Z-m(}jZ:VUkͲ 5VZ׊Z~没/3v?Z} ]'JB1{IX(*6܂fPVd 28 GT 1q}MVѷPkF[=oo&n7l[ͥB|)=W/mi[]FVD3{dfGH$YNʎk8Pޔ1mnT?j8U; < {Fo^6Z%Or3h[ZtܿP=?r]_޸G$Le-2^HY%Af(dHTQMwXԳUI5,p7F7Ig E#$g+PI}?p{7H&y$'h'6$Q+LyeKeqӵvڦP({K~g,Xe8<+sYI < ??[W/KyGP?(_jv*C6?3^ԣ@NI$vjݕv"X5f((|bZڲCfc?4GgF.gc=J :KE#(e* kֵ)tx`HR!{>OEK$Wҵ(ۻ+y0R;aDzPP/OjCZ!QjJF`KY3tS@)5fm.zQk6Ss&O?.^;Z)LЮͱ-nN=u{4mo ?_Jͣޗe-Qm)$}.̬=4W=1cfC `MdY/N@>}W5K6H5#jv2JΓ[&8"h׹NO{U-6zqַb8 *}1?"bj!wsE٤8sdz̤P0ƒ@|m'kVDӛhfb@={Sh1U=I\M./*1bQE#X&,}<Ǯ?RsWq 5&Y۩?^O(}<c8˟X#o>[ٻ"luLm^:ΰԦf%agY]C) dx4QE ŬWIUϡ+Nnۣ_G1U(*cI_֯ ({=O& +t#:V\puUЫ "OOky7/(z_jiq~?ʯQEPT#)WZTwxQY&w~XnER?Jw!?́}((g\xC)n8=Ii\C˹ƭr[/ȑPj=MSVV_?Y?w=Q5oʙu5ϱ+܉ygkp"txdq=~mTIO,+8pj++ =fkdL\F+,@"Gkz(d #yլ|.?L .+Te.N3LM9S_)g}?^j`F=iDz"Y%<2[r)¨Uc8xv/-2~D}O +sIH*G%}*yS̉W3yeѸl*r`85c"û~~KxWҶu`N9,֙lz(S,I2C)k1|7bk^E/L lQEQEQEV6IcG?T0FE-G%2(gs*Vx:0urшZh26Ub?Ol%ƯC[8a"qUKF;ZV 2 -QEgk _κ_̂7T~_v?Zt7ɱFQS}km{u1&g\1 z{aWGQ5 +7O8[}C]ur~!OkݎhW;I ?̟-+I-@'8fjH}v"=1k!>wocGSW3u^!H??>J$+B(`n >hOHfQqm,_BGEl=^~5ETs·\t_]}۵HW#6eUmnWle FAk7GxH <]u7Z t RS%!GRk\g0Y+dAoe۶vv_ZțV>U csWh((\) QN;ZX"k{qcisZU ~u #yA(ncSA\5F[ՃӷOִ0HakN.˟&s#B"\\5-j &aA=bm=EXwT]p*<ā bQLpjXd|j9+nemFbDP S]D(X`2 qr:,`FP}Ewzci~)Z;`g{gTP%OtLxLߛP@?Pn}?N) I?5ó?fUբn}=jՎYKv[*T*ekD_V'mmKTVuf'*EU-U]FO*S6|VF/&BoU(/W|g_SVA} Pszxʞx=i֗>bcTQES^2p~f7Ʈf*'rMb}w_WA`.rw9N>z]QE^ s4}r귾$߻CAMu6[0&Or}MOEQE X~'ѭ;@Qt*%1 {k{y  c?푊4-?ozu FUlR%'I>J )bn?nq݋[ wlչ&lsqU[Y" ֡a\h=AM61ӱSl0}O&3s!ǰUb(${{YGŸ1uj9NIE> X mN=otA2tϭ_K5rB zߧVdj-+:ßSAq./0%?du)OB)QEQRrdr?Z[nN[+4cz{Qos BH\:NZ((*dr7`vժ+#P], xf&땅;| ѱa3*Hʮ0"i'XC,=Q: ^WTy|kHT|Sj"t?¯ŭi UaGmIsf[v B]&9fnQՈ+$-λrdt~OsYqobXE+l ܆*t;|KpilQEa#YV9d%iy9;p~^!X?ΣU:A~nVu{R-;j-mmMd>PɱRx YiHf`9'kV8$ QN(kȌ20GRgKc! AGW!.>#j(x>p,Ͳ]z(* m27=u5@W&) ᇷ!Cn(d/wiCnP9O=BiQCfPTI.OHj݀a=Ǩ9hH:0`r ejy-xϸ9,I"V'v`۴s^X<<ay$E+B+d5/A歏5)=OkF((ʾ԰||\T=Z ߗ /ѽǡ+VX[rԴQES%9Ф}I֌u I{uщq?=j`-8iQE2X H=֊möp:ϖb`B +r9=Ү&OFEMEw#;JtmG#u+ż|(! a{'ԔT _G_g_P(zN\Xs֗~ E:ckXa@ ((bxN9I|!סVV>5PT˔#'?ңѯ%CXf3pCF+^((Q2H59DE\=2EB9[E٘N" l+OF~4AA)'C3L\Zbn.DkbBqӡ-=VČϞjTvNV&ˌ.t>X5+.tq֢i (` =jQ=mO*ۜo>*ʘ ֊C?;pGzٸK+1$Lcџ֊TeM>(;JLuF:wi#ބOZ(() =n ~"s!}k܅In5CM;(({Ky>(O97ޟ ȧ1\/Ԭ*9?0 V>$[?6_άkK[Oj,J9u䎣@s6z&W@YCִͲ8aϨ+}hq?Z4V(";?v|> .mm0޺qwcZ+-s+-P֜IU ,v;yQRXZBʧRM2@wv5^Ck)ZX4M*W5g1`9< $zj 29P*S_iGkb{K|D3ǰ=<9hb0 ˛xeI{5x%!dCȑqv'iWz0hw@O 9^#4u2E YI= [uZڪ1#jjGkk1 m#0߮kcS6(w~"QLҮ5oV@=*J*m-Y 1?rm& Qe9P{[DyDRY;QMmXG:Szk*G2f ׿[dQEC`T:˿UBN?+( ß"BIpHXCY˹Omná{75C{&yOU>b(+3Vkv;cawv ̑gz+mꧨ*HnOfEs*=Yg{;6p3[QJFOEg\l..@RFdcpur*G;<T+;Ub;<ڱ42Ym7O~ A]TqQ"Et(((-MTN$ !>~[kGY]H* ⳵57n_.< !s0|ԫ 6Iy/OҨ[׺^]QðPy#޴iIOq¡m cn5dpe/§i ?] 4uOM&: $8\!F 2Fŵzi79ҭT-8>$w;dVdr(ZI͘ ).TfқjC[=* 6ѷC- Mj2,Xɔ1VnQY5Z lA pzV^}_궗wS=W]=A'Kr;⤢(1d&HN㱩zkI?WK D$áEIEQEQXy7q'*9IKȖ Z-;MY((%Hz/R.X޿jЬL&$(Nm-4Ͽ,meTdNҤ{qXz..c$x@#p ֵYkevBa5QؠZrvYbSiMXsGsSgNE!es}]:HՔSY>%%pHLna+u'ӭExǂq*.jUN$WL {+NI"$>l´((]ZIr8x^ڹޡd{Zuc?C׫J0FE-QEdk?h|Ʃ?hotR$|R|-t[^(=ڷ!M_S55QYo{l$HzZE nƪhqU8o3T#Q\߇Yy_8%lg_ҵ5/f Ce5^ꖓOv쩷 * ;DPEhEeklT,sEkkz/?Z()H!w`w;uՈ-0ՏSR%osU#—Hz}s]vO+ad^MoU{)zuu1t$TPón\7Z Z~8%Y0}jP[9"H;pv{zկ:b0Q|~nVtX,Oƣ!@QɧFlniAV5 kOfŸ1+Š%;*;_j h7x~=jy#%ZVyc QlgD-hoS;}3k/m 8ǡMcŧwoBfJ3M|&@;\/Jދ4{}LdRb3:u0Ǩ޹bV7#ecn3WU}k5ۨJ6S]5cts.p}>h"bIoȲVr~q[Nz(O`NhQYzPF HgZrլ" ;.Q5~Mz#?BͪzPX=בV̹<:…ӫK7P2A*yPuI%=I ٢(H5N3 4OEbx9T20K\[1hs& B+w'>V袊))f8P2Ixdor'Oa5yy-L`ciV}Ý}=jFU`q~#hC)REV6ADΨlr@zi7Y=0Ղ9kƬR$X;s9J[~n*q'WEdibrGN³t[~ݨecUjZ(((vhWjkiFON|7h_)?LUdgO? ϶8l"i(zϸFC/MjbM;o't҄oTy-˜稫,ٔ"?iiJIL`nP0}uMdGhFYLe3tilZV$ [u)A$_ҫdS Pd$'=VG*8TN\=?*.zNST#i)uZSJ:HM'lևQ*94,_ARy)SG)؜Ο0fSqCiZ]Ä~U({hSlCVz5/ ?tno(\VQEQTX|2{P ,Yk&d MVHj[Oh((Wl'赙˸%~M9!Ӱ+Xa1b(e?[b#o򮚊k"èaFjMzo򬡡[#Yc8ѯ{1xP5kkƹ!p7pOUosmgPC @5 [h1D8R6:0]/=$@\S @?5P(O?Qj_I֧M?AQ %Ė14vOi#쟧 Cd_;~!5 /9@ֿu0vܭ{Z]ks#d(SUXjGlot?),?8GŇ)v,3t /-ݶO=;´:~5^[YVI?In#/B_oYCYVxZAeW~i?1b}~a.`#"x|R)D7IPR}:{e ܎8_c\֛=!NW:=EvK":GVS ڌjyFsWqwkFK&aUGUaF,G^{of0EW@VSL7iM$¢Qz8NNrM>/>y"ZZ[L ƕ4MT!C=[:ihW!GW"MC$s52[@7E_jn^UOZUkZM4FGF'fOEDI;yۏ^`[5_ ϗozn,32x׮_~LVZc :yoΨVښ]f(_^>u ?ЌoN3!SLJ^.nLy=u5J+kb_lGgc {c_EQ\mZtV]7:Ip)h&>d(Y:hJHѶTdaǭX8u",mR0x)riUoFeJ(+WP{Y7Zwl$RZ^B?vāG?il> 3"TQEf1~;\ӼC$/{n8G>G"Kx2uQEPz0FVY-{y,@Ԗkw|pQEQEVn1s'B}?ZMO2PqIom=sSUj1IF۝/NG?lY\ 8ąRW\+Dfx$ .q :y 165Iėwē~’S8Ps}zՋmOBkIo.nÞy={[?Ql$Ѣ^xAX^0ǿ5oß oc:{7L.)fMxI?q#Ңeۻ&R:\kJUӮxuS-?!20QHRy$ED??M%| >m>ϼ_| 4a Pl-HPRԴf.ެ[Yh2|דAȪZ^hέ(}5{.xhʳ_O?AҬ#hɵѣ*YƗdyUݒk]Dcg巅b$ӚGD?oyH~td(h_d$"tGɓ~^u u~cN³Sт\J|n?ÎJ[%3 5>(mn Ht5`1*!'Vvmt&,O_6念ڗԿmX.vJyU͚ړn=4&K?РͩS aVsK_?&J}@K|Wtm;:hV!J. 3HI#=MlYGUL1}Icef9=~-]`{UKS,E#kF;i*aX 8WJ?&̟y?;T( ;U+=9w\><?:k\2;U\5VgD L5UJyx 5mn[u$w;w0BIzcfz!);֞i[A~ORnkk *UmF;+Wb~}hV{i%_u_d }r2'hQ?|C ~)-t/tVkrb3zi׃^8j "G,>k+wm2L[U.]&u+Bg,jVo"MFЅQ=jsl<7W,4GzXo,h*S(lFc + pRڵg<$Á]5QY> ߠ*~U+ܮOTUv} 5Ick(g?P֒d?֩>yom>Glgc w^=ꈥ?'ZUF‚_,;ZQE!PkAIOjv8nq՝y7o#ZI"Jу)E:(o^ѷ/`#Z!-(o_Jq$֜'2拝D%B޸Y|VV_ S1+k5ӸX__EtmZy &h(((渊7 Aް@UdqWn7{kƲT=nQ]çȱ^=KO՚(]JƲl3[$BCWU(b8Ⲟ(ؕt##&x#CopVyj1?Q5R%֚`>g4*}ut0U `fjsZ 6 l٭Xt9g'zW`2J9sahJ3ssT"oN+F7әZQEd` Vrڝx6ʋ:Ft;:=NЁ:_kFW~u}X2R=4T6]&$^GFER{]'Ct~o v QET2Mpڜq{v/,ZiŏߓMOVOEQEVF3 Siz!Ȟu [ꪊ@t"F[P>xA'\&Ge9?mS\w,8-VN/nat>5fi**짿nYf 3j{kXmA0>FESV4}6fGAWk[D;&sJ4/>.w^R[T5QUn+X>ǭs.rm=_ְvDeoRm[VGe6?\V$_+N)wE"H}QEPFFJ요nw&P}Oia)uqpx8uJ($k:K_ʳ2OU/mc\&_ڍ#PIaM7۸?´(e9dZ((u{ F(\qqƬ%$qҝki ZaFXϵ5Z}6]wD5c ;{֭r&i}5GQҤ%Q?GG[BTl,NG=vO*GXrI*QEUKe `f ܿ98<{(doE&`1Է彰+dX GY%U>:$KH?,gW{UQjŦHߚDy=QTnn*IT*27$z &(\Q*:ԵRP<~#@?:ʻvbSխ?OtIs厸V;KkKF`ͽU8晢}UNtra1ҙ/$}TסRI'rMQ:Ӹ+OVT+>ڂZU!sSv[cqt<)犩eI{]L1cǠ$ox7^u9u=:Ksz2{0bxKQe2iwWBLacPӌ,?׮÷4{9vlz-ك.H{r!]m,wIcq{_]H#-QEU{a9?vG\?q+zkBɵL8<7h?/]mQExp[al ATteV-URH?(%>dIγ(̇ߑ5Ι-q8%eH8@V֟aA`/i oԗOC׫ozDK.䎽5EQEQEQQTPJ[4m׎U{9j߶6€zꞥf/lU% mI3S^DPQlVnٷ+"2R5AO:vU![#mONhu$6~+GMVg!ff֥gݏ"Mlu5QT/o93Jfg庅=n(]VhWz"`E9[6zEQY!/Â?.Z{A;Ջ{ew6 >?VYG@o&MьҬT[j*_Aټrh(>~"} g+ 6rVr[O2$Yz\fC 6v  Kz✚h]="{m7ܙsNV(mcHIaJ,:V~p_HR4;Coz""F((48.hON+Ow]#:ִa9|N*݋hvEoh湝WONsX[ g?PFt= 8A<19Goƥ21'z?:u;7Zm+HM<<>gڴh((iM%߈rUe ?BYAr~ hm _SԴW7?xquYZ|'$V?EQEŬw)nYLX>7Fj9RU܇#UBrH:֫l2:k^((/Au>ÏR]M2$d}j#] aS]BpO]iը'Rȡ㸨m!& Vk(ul\Ո\9P`lT$C qf~qքLӔ5gV8#БQ=I) I4:}LP.#4q,}EAqlfH֒.cj׍$u =TO^9Cyweˠ_TюX]Ѻ~auRE+|?kԭDaQVWP2T=; "HZT>̿wֵQEۡiՋ$:oK[M&/D3OͮZGo0?Zmn4cկ?JQOflTx~%voe2Ǧ+#}7~Inxh+MXix 21*00+]Tb?1:ܰ01PN={bݭYO?^ڿ}bw2~}o6֒V 4$$*rOoz<]c 60$łsVޟFE/jǣLAoO[r2Z+KY$>[Z]Wt^z(kZk;ԽpNH?qȲƲ!ʰȧQEU;F5!?ұKQNȻ߀v[>cՏSSR2R ,s4G_ˊEc_[WVGMՒU$ I{ToFyObmKJb^G7U,Eăsu2\UQEf^j& xNdUf(z"k../ݧTtIpǧZ qڻˑ0+^\W ~sU(o$pH~ҭ:7QbRnw=ܞ\@Z 1&I=XkKr}+hh7seOWAHߩ49OY(\nj336KҶ4A[|VCH{~hk9[tQ[4gc&P5]H>U9 vxfZF6kͱ$t,:ZojCI}+:VZ[Kaٽϰ-:8oJG z*DŽ l?]A{mݔO-{kK J]"6Gڬ~n~~2xbyk{' F5VP)g#FʷV^7ocWWlj"t\r Yt:Exi^./uT3rSWPe FAh(*92e\=읈@UBuP$SZ5%F9A+H1VRчCh1,LiK r$ʹ/6 jV.b{8?~UQEQE5dB[wx[ֲߗ?[5amGߠN5l $V6V1+*z(GW c R;:~U86X)iUD5z*D!֩^0PTylc2*40= CCw~Up*Phg˻#5ET~٦b_VG.Mlǘr_ZŽ=GRjɨNnգ ;@]Dl9"?]QEPHi7/l?:Cq݅4(ɸR? }.6\Ii*9Vow\9s>{iڴMctk=GNmF9Twaco٥-hb|>V;CVn;ٝA*HS=ZzeћItBT+_|v+5Ck` (* ex[?t 䳓 *oQZtQLT Tw5wI36OT0i'{u_EV5 ^QUoujasfBʼF"K0`KVPI׽tikv ag}ka a躌)f Ԛɺ{`-TQPh/~ziğ/e$S]K;:48%֮kM&Pz8ƜՉj{ }UH.lzjicaitr$v [Ρ&(Zl"{ݪOW2&seDk֥{~XF"g9*Q1To 5*\7WtC$c:JpZ-]1,KF)QZGKT s4z>p߹^9&sn=J-׎Xc޳uXZW"K54]*FdڪK/*m@f_O>]ݣɫ==~7Bv;}/xf;KVJ#WEiH:Q^}/o4TOκ=n:o_cN_ev?֦B["įcJKyX&;KYSzJ(Gޤ𽤹1!>#k S]ѓo(.pA+]SWP@e<{ z YuSeZϏ.t$'5b(($($&Z5DCbV5We֔DlAs6纞q۴n{J{4RZ2\G>k0ްeyn?YkP@H{P}?z̾ S;F9{Uw}^Σ+{nt.wSQEQQ4p&]Q}I[Uc$d ;.erj6ˈSQEQ^aG%`1[s*ӿIQEQE}?n6שjzav #ysPe lGsɢO.nR_袠ˈP@S'sRs-ۀ{qLUP6NISo2d',"ͺKYT9s8#iƾ|IcT WY5ږGo/{AGhG?Zm\CL?iN{> '[3\jW:NY3Ld7?Vꚍǟ$.QO@a[}"*GEQPVmj*wqO攆_=J4uIapV?8g#Rl?PaOƋT羌3T_C!Hbjf^Ƣ<P+/nOcj&Av?TQ_vrs?Hɤon8c]QޛQG^n%_Gt'P<4O޻l3YNIGߏ\6+ $'Ϣ#iVY|Ԯ25zQռ-VC/;x b=& 9h#9Q޽J:]MaZ##QEk{ 8Ԗ- *aԵBUROA}k ֤dR>aW;t5%QEckKHpAFY2BG8qm) =^g%=YQlҩ$\xɝo6K)~r=W[ 4kXlAeˏA}jxaXS ׹(K4pF^W5w;d'd̆IOU'?U-"{;*u]q'5ۦU;9Kub 4D7'ViAcrIIp4X~샬G*x1YAUUQ1KUh*}jaKJG,m5 [G\Uwq'nc޺[/3QlS<~Xz}kZ(R uCT0?q=kgú \ο85k\˳,AEAgiۓIR?f=+q.[:WsS^:߳a# 8cātHX928*z{Wh/~6Ot'>>Yj$ @?ce$CpH UK ɗ>#X{Y>|0O>SE:+'FMW'n=bEeu # QEszߨE5rɳ*X`crkb(IJ!zqDQ*~US@Oj]~(+$eZ<&Ŵ>qZߢ(KKs#rz*A^s] s(:oyS 8ʟ1b}ZsS+|hvcmy,EWxqwe+ǥ>=n.C$gr*Wֳ˝ =X+^<.{,m~>adB4fF#j7˺]8ߏW zYZ6Y)A1WleCpbKlo+Zdey_Y~*-gkП&Ikd9AW'3ѫrrD~#nSU*G*)A:Y7Mbxn#'DY޿w+(=U-a\Dz񩨢(+gg|11WfYe cҢ(*r ?3~㍥D, !`"}MGsi0ݚ6 c2~bZzU :Z(o\?OE6OMYܟY^*a#޲/-cKmHߕW|ssҠe?.=*hVnVԮ.!`]fQiإg6vߌ~ڭ8hۨP@#kX_c⫾}#Bl&yc!{M#4k/ .oLĎJGU=3#4R7܄~DNxv}M2?*&k>(}Pb<>z񎵘|mjhb1,\[oH wPoj1j/;bC0љ:0?4Ū[ӧ"I?HdoSf?~Ƥ6mO c袞QEcj>%$.y=axCM 8>_}_?*մe5Yĝg+bqkI vFB5$Mƃ%Ӵ8iqq )^7uyX OOAu0e ԑ=u<9G<˧L=}{urlyո5z/궘v0+Ґ-E 7 REFTTs·v\1z{ ڰ!͉eG֭V/% cg2gv0`zշ4>#F&sK̭!oksq}jX`P{A=k@ " 6 m1P#JѨ5 ԪEC4ZEǓUAl2NHv#|JqI\jWIQ]Zf**Ƞ`f? \?3Lz|1j^G;B 좹%'`>էmn,h}C_-< ҷ֦?I܁_uu7< YwHгUdM{۫r{wObKvצX v=LjOSX,?,K|cWOC5ǫF~_<j>1L-t}b/JamnOqX> њs,_:0z0G^7bvY+$^G蹫EYC0Bz(^ӯuTo?5=U܍~+OG.ߠ浨(O //v9GQES]4gr&m ]ԷtJ죍bcE 0N*l\&T#Q\~o+.?kPYr=TUfl3[Op01Y&'d'dCT6C@:|AGvRzTp)#>ȩ'"iRdfʤ+f瓳=sZQU!_pݘunOʦx?TlQ5ÕQ=گj,w6۠Y#V6xw}~xR{T75DnQЭWxY iM5ZU[>6' 8"Ms5N(b^b^x.='*2F@{g-֫Zl=SQEQEQEaxeUrӥc|c5QEQE#D, ngk m|3tUkDg=bCWdtjY,g)T7 ;U(.vU 2z&TjK0UtB_ǺBV2Rdx pT)lgO08-#R/1qGUVZYH B{wJo!M0scιz R9]s̫ΔBZB쁺4ѷIGfۂb V=8\UϘ@5:#e&Ҝ,SʗQd[[^Fsmy])Tژ\:PSҬ5khTj7N\/Ҷ`HEGoCSY^jo+b=låd1|M)e&uaDmf?ƣmb12~u sIp~<i>z##I ؏SHncj$#<Ԟ@g*:-H(ZI '=OoZպ-[O;rǒ*H%Rr3[TU]Z ʽUQ\}bLsVQEQEQE!!A,@Oj|Yag8 vCf#Ox501=VkҼ m웹G8#?]AamxTQ 7i§CEWj3EǶ[^# \/_ek΄%ʮQW%wi:(T썛=;{H.l+CX,eRuǦ{{Z`NGS\fCQs*-y7_i lcIbi?K?lI>c<[ .:ҭ4mj5 ZEQETW)Zȝʜ}kNoDgUApbv;MZԟ#ԏi-mbtVv p9RIJ`U)ozXdmIl/qV浊h|P՘66?{uhr>}k0}w3&JGϽvU=?[Ab8P"N%UkحSa/N'W'0ą v1'ʬ *=Ast~nnfy'mNxϵj~ p8_˞JGV#"*މXbi5A"#}MNp ͚84Df7zTizi\)n;؏I@3K൶!cZF[μJ08압2( KpsV.c:SU4].M^ndZ@ 8R)-ZIOFJV-u9ZoL.>Cm>-Ƀ~Ztgߤ۟@GHQ^s km4j~v\Ҳ u}Z"S}A+^YGy\r:̎v[N'TlgiޢVK 6.9ʞںW]Nk.#q=k^+y۸Yk#+))c 4Ϩ\N@Niugϓn?tyETSQEQEs8M#~WMH>W[EQXɨݭYCa#XYGaj'7TQETW6[xۨ5\x^^2Gu5K}R̈́QETN-~1\jfFd{_Ƥ¾P-eʯUQxCRs&IcxϮ2*WvcdIʪjzvUp{˰ԥ7wĘۜh}âT[gr>kqۭ,9m-.~oq<\=iu|&Rek|Oi1Һ *92Ȩ:yVQsb?+ }a׏sTn6&ryWmn?ҭEQEQEk-ʺ#^YiYsVSʊ(+/UʿΏ'S^HYkWr*hRtܓ`zR5D˴{Is$O֤XJBO">aĀ޵Pi'/Dd3Z}īcַ"gPt{i!+֯l]({?SJ,&-?*pDQ(wZvd <.rOQ&80Dc׿x!k%%)9?\~UV}:) 'ҹ vEQESd"#"YwP񅥹h?ǿCxh=ßc}k"[YmXÓTibSt7N&wWGYw>4=6!\z~ڑ0TC[kv3 M Ҵ20e=9QEQX#R. ~* ~eEnzO9u]N9*zzbHZv'=4Old$jtQJ?ǵe-v~?[GL!YOPõLkNR3ce#̗t Т ׹$-x f Pz'6bJ3U|DTU^Z6-U[qpdU)6S[wWqo-VRh7ӿJOAORnb w78U4:*Cq2j9-/Ļ6D 1=*c 5gC5@>RMt[xwmA)x5EV[pD]TQϵeY D1-kHbP a->fW#Z֢4mz&=tƼf+|S$q׮uwg[aaMs1mW'OfϖHپLOcꦻ:J.a<{ Z3\|O\Zd~O>k=HtQES%ُr6|V&21?ҙ_E ~\ꨢ(zo !d|=l ӏ?ֻ:(K !?qֵt(Xۉd_8#kb((KsJapkt݋cy=vޣ޺=#YVN猞VV?Hd|jgKkU*}~Ϩ?rVj ת>HR界OV\j6OeʕҞ]%>ȩ$6Z.{sqdGߎ?\Χn/ڭlocXڜ?`{r,:`נx'FhvU\[`ehG ҽ5o$KeeWX{ֱoNUsb?'y3 =Z6pZ"ݏ$5=0FEdh0\7֬%]#ힿWm\STQE:񏫊i)Q^Mճ cjֻx.~^]wr^(K!eccZWR~4Өũ?$E}SG~z@?J?[Y51cAֱ#%8ɭt%#pIvz)F)̚ʽ,@y5hhz͸[bTíZl~LIN 뚣 W,dKu$b6 dHAx|.:KEEeԃBAkNʘy{1zU1nTgFb6=UVM{;qYN>abe0ʊ;ںk-:%e=M[+C_Iǰt T*ڱD-.6֕kdbK'QEVP9g) [W{YԪ';KSQ܅h@FV K4 \}3L7ɩrP'bU50Sn'kBR8HrdBCօ=ؖ2˥[k8PWb戄>5;YI?jFEQES%]:KOy/֮-bS\` Atv?1kfqugkF󮒣[EN۶J]5QETsCmyR4YsW2IN_u?Ao{.&eh ' J1+Ҽ+A]aA*!2Hx;+>[B_a]|Q$,QTQ>[Z93feuے('$!]sa #zX֒n?F.PrZ^)kcz^u3R@OjԼH*y7c?YJRc.IV9OoҜ3Z<'իo]Y&#Aiޏ t*>+C˟5A3S vÑ\銡?X?F(Ojaݹt10⤋狈pVv#0̏?MEVH={s]Z}rݏI=v;nyvF!?Ji+XӜT1VQ'}?SXnʍo.Pu 5Ga"z0?Z袊ϊzEۮYqُ5O Ϝx?lEAuk&9чPklgduC+RC$0=~)c%& 2;mv?Q\֐,ugPʱR6NJAiWoq5EV'fi$OLE+p99yXr?j訢(yq }9ltQEWK;s#rz*@^s] 9\??J(((eWR) +94`w^^TAW{𭊯}v63GOO| vg?Ҷ(g]KZY}q>ލBȻ<7;}ϽtUYI U?-ɍOSmPy5x\T %0 ?+Ͼ"Yܪd<⻍M #v֩6k j}vXbF~qo#W[iN9m:]@hՀjn@/e-&]h#p7Oc YW]eda`T-v$pІQMu=ĝ?*hZvORܑ܃'Srb yԫ`9 x)?OB_sjh#X4XKq?ּźz toֺ].<4`1>ֈDQSQ\zgC4!"F1/:)8E5iqq/p8M伧tTrƒFD_J$t0sr9VQ5%QP۝zFPaiT58:)c25oQUonyf8$OGT2D0U-V,[µ4TEW;36IBOnGwo*oI+XK;J=iP׽Hez 5 xON]g'ϫWf ?94<'j؀0HǠ>I#$ڞ6fx5,q)8j6l.`T$V-QVL@=kMjUn|/4[<@1S!w(Lc>*NPk,sH֬t/cOKc{SV?\=V',Z]e;n"p*҃Pen Y*ҵĞD9 ;Uku,_łkO 2rQȬ \oܞcmέO]-VtèkKp t4QE^mzz/|_$yU3$j[Oj̢Vh]7Iۃ(|1ZQQ\\Gk S: αG(%% 0X*[[RrzSr>nh;Ylu' \޿lVrN {CW4RI$|w5i ov֫tS$9ɴsg)B9Ǐm&]7Yyogos'[򮆎u闙-1(SuĵSH;GVdOtS|яOjc;n#C5~ ^ㅝUutǘvNȑPNMs.H?2P84jwj9$r*H4}'3VgM$U|?ZIAm¦V b:>v aK2.<9+Zv1(1U5XW}Rmpk0I~ǥ_̀A:ˏ\?sŭ QasjI>\+4&;|K*/PRgƨԟ[V^v- 'k^7jqkZq!A$Ə^"^֥1y~!T"Q8Je#5-L]U Qs}kfn1OE;FcB|?ndc{ f y+GQW;?5m`TW#u~l$J\П񮞊(:Λ]xGuK"Y[*OׁWQE ʹWp\WRҔa9FϥYƻ9Ef?)?kn3Eb+-rTzȄwm/"(~Z(eѬC)PG?R˱|u~?l֎.IҴ(?o Mq_["=2?½kƌ@U$U[t?آ,Q"Uv(((Moí0e;$[мD-RtcYB؅;w?iGƃ SkWg6zy,IΜ_z6@Op\j(>%ٛK"yR\O, ,Zi`ZxGyխ O/NGY~4RyMp:h^ [ca~B6(zaWMEGUʴ+? el1j)BO8T5ASz\[*"d-U,>d9*82vIz5=T ʴjg+R<{^L-(1jB|~ǟ{3aULq+:0t4"/Vg*ϓw!,;J.su[KK#1ݙRKrbԚ˹ MǍ[p*p"SZELdsONI=4ON ZԪJ?ک?mWcHLu9n2Rpj m.:i"򦭤qOGDʷ<r=5dOp*&31CzT_np:z;k Ao13!) ?vn yI+qxRD?/e~Ř#9Xm:FFV#ڹ8)g#Q^kDhv9?AUai̺b?=FK9*TtN1x^W 2xzڢ)HC)sχVkVъH0C>'_[ݩqwkԭoɇ?[b9}7($} ax3N^@~|/kZzu<~\+\RJOm)hxj,fERk"RV I~XIq2S+fy[t6kAG>-yV@?:A$v)OzaQT{;lvɧ2yypã!/V%=MEwCqdYCr=;U:7?if^ >1 ¶c(WUKR2ocfwܓ/Svɯ,p1 7j,V|O;QUئ"ą 5+]IƻTqNR5Ģp}*v!laVto"ybaZ22$*G[VwjY'sSEQ\.WVЫo,$e?]Q\3]B7q+`T_Ljj(]]D~5f 3jl[rGQY L7A>nwn>0gU gժ*qz:?jQQ\Hb @ط<+F"pju!PG226ֳe"SZVW~aY5itLh&EN;t{VP 䑺ϩR1ڤUcpp0f|3Ʈ%I?Z=3EofddcS*,'m+H7Q֢4cBjyIɭAӪ)7+ռW|[Tbo jtI{{s+|2cXנYizl>UDO?Z(+vƳ1T-Qc%5 0E|QL}֕@kSGAbcvMvg:c)8+b+tՏSSQ\TfB[onzWiwt^@_ (these are built from the 2MASS catalog). Or, for wide-angle images, _ (these are built from the Tycho-2 catalog). We used to have the "4000-series" files, but these suffer from a bug where parts of the sky do are not covered by the reference catalog. Each index file is designed to solve images within a narrow range of scales. The index files designed to solve small (angular size) images are rather large files, so you probably only want to grab the index files required for the images you wish to solve. If you grab extra index files, the solver will run more slowly, but the results should be the same. The files are named like *index-42XX.fits* or *index-42XX-YY.fits*. *XX* is the "scale", *YY* is the "healpix" number. These are called the "4200-series" index files. Each index file contains a large number of "skymarks" (landmarks for the sky) that allow our solver to identify your images. The skymarks contained in each index file have sizes (diameters) within a narrow range. You probably want to download index files whose quads are, say, 10% to 100% of the sizes of the images you want to solve. For example, let's say you have some 1-degree square images. You should grab index files that contain skymarks of size 0.1 to 1 degree, or 6 to 60 arcminutes. Referring to the table below, you should grab index files 4203 through 4209. You might find that the same number of fields solve, and faster, using just one or two of the index files in the middle of that range - in our example you might try 4205, 4206 and 4207. For reference, we used index files 202 alone for our SDSS tests (13x9 arcmin fields); these are the same scale is the new 4202 files. The medium-sized index files are split into 12 "healpix" tiles; each one covers 1/12th of the sky. The small-sized ones are split into 48 healpixes. See the maps here; you might not need all of them. http://trac.astrometry.net/browser/trunk/src/astrometry/util/hp.png http://trac.astrometry.net/browser/trunk/src/astrometry/util/hp2.png +-----------------------+-----------------------------------------+ | Index Filename | Range of skymark diameters (arcminutes) | +=======================+=========================================+ | ``index-4219.fits`` | 1400--2000 | +-----------------------+-----------------------------------------+ | ``index-4218.fits`` | 1000--1400 | +-----------------------+-----------------------------------------+ | ``index-4217.fits`` | 680--1000 | +-----------------------+-----------------------------------------+ | ``index-4216.fits`` | 480--680 | +-----------------------+-----------------------------------------+ | ``index-4215.fits`` | 340--480 | +-----------------------+-----------------------------------------+ | ``index-4214.fits`` | 240--340 | +-----------------------+-----------------------------------------+ | ``index-4213.fits`` | 170--240 | +-----------------------+-----------------------------------------+ | ``index-4212.fits`` | 120--170 | +-----------------------+-----------------------------------------+ | ``index-4211.fits`` | 85--120 | +-----------------------+-----------------------------------------+ | ``index-4210.fits`` | 60---85 | +-----------------------+-----------------------------------------+ | ``index-4209.fits`` | 42--60 | +-----------------------+-----------------------------------------+ | ``index-4208.fits`` | 30--42 | +-----------------------+-----------------------------------------+ | ``index-4207-*.fits`` | 22--30 | +-----------------------+-----------------------------------------+ | ``index-4206-*.fits`` | 16--22 | +-----------------------+-----------------------------------------+ | ``index-4205-*.fits`` | 11--16 | +-----------------------+-----------------------------------------+ | ``index-4204-*.fits`` | 8--11 | +-----------------------+-----------------------------------------+ | ``index-4203-*.fits`` | 5.6--8.0 | +-----------------------+-----------------------------------------+ | ``index-4202-*.fits`` | 4.0--5.6 | +-----------------------+-----------------------------------------+ | ``index-4201-*.fits`` | 2.8--4.0 | +-----------------------+-----------------------------------------+ | ``index-4200-*.fits`` | 2.0--2.8 | +-----------------------+-----------------------------------------+ Download the index files you need and then either: * Copy the files to the ``data`` directory wherever you installed the Astrometry.net code (``INSTALL_DIR/data``, perhaps ``/usr/local/astrometry/data``); OR * Copy the files to the top-level (astrometry-$VERSION) source directory, and run:: $ make install-indexes Next, you can (optionally) configure the solver by editing the file:: INSTALL_DIR/etc/astrometry.cfg Big-Endian Machines ------------------- Most CPUs these days are little-endian. If you have an Intel or AMD chip, you can skip this section. The most common big-endian CPU in recent times is the PowerPC used in Macs. If you have one of these, read on. The index files we are distributing are for little-endian machines. For big-endian machines, you must do the following:: cd /usr/local/astrometry/data for f in index-*.fits; do fits-flip-endian -i $f -o flip-$f -e 1 -s 4 -e 3 -s 4 -e 4 -s 2 -e 5 -s 8 -e 6 -s 2 -e 8 -s 4 -e 9 -s 4 -e 10 -s 8 -e 11 -s 4 for e in 0 2 7; do modhead flip-$f"[$e]" ENDIAN 01:02:03:04 done done assuming ``fits-flip-endian`` and ``modhead`` are in your path. The files ``flip-index-*.fits`` will contain the flipped index files. If that worked, you can swap the flipped ones into place (while saving the originals) with:: cd /usr/local/astrometry/data mkdir -p orig for f in index-*.fits; do echo "backing up $f" mv -n $f orig/$f echo "moving $f into place" mv -n flip-$f $f done Solving ======= Finally, solve some fields. (If you didn't build the plotting commands, add "--no-plots" to the command lines below.) (These lists of index files have not been updated; usually replacing "2xx" by "42xx" should work; for some of them the exact set that will solve has changed.) If you have any of index files 4112 to 4118 (213 to 218):: $ solve-field --scale-low 10 demo/apod4.jpg If you have any of index files 4115 to 4119 (219):: $ solve-field --scale-low 45 demo/apod5.jpg If you have any of index files 210 to 214:: $ solve-field --scale-low 1 demo/apod3.jpg If you have any of index files 206 to 211:: $ solve-field --scale-low 1 demo/apod2.jpg If you have any of index files 203 to 205:: $ solve-field apod1.jpg If you have any of index files 200 to 203:: $ solve-field demo/sdss.jpg Copyrights and credits for the demo images are listed in the file ``demo/CREDITS`` . Note that you can also give solve-field a URL rather than a file as input:: $ solve-field --out apod1b http://antwrp.gsfc.nasa.gov/apod/image/0302/ngc2264_croman_c3.jpg If you don't have the netpbm tools (eg jpegtopnm), do this instead: If you have any of index files 213 to 218:: $ solve-field --scale-low 10 demo/apod4.xyls If you have index 219:: $ solve-field --scale-low 30 demo/apod5.xyls If you have any of index files 210 to 214:: $ solve-field --scale-low 1 demo/apod3.xyls If you have any of index files 206 to 211:: $ solve-field --scale-low 1 demo/apod2.xyls If you have any of index files 203 to 205:: $ solve-field demo/apod1.xyls If you have any of index files 200 to 203:: $ solve-field demo/sdss.xyls Output files ------------ +--------------------+-------------------------------------------------------------+ | -ngc.png | an annotation of the image. | +--------------------+-------------------------------------------------------------+ | .wcs | a FITS WCS header for the solution. | +--------------------+-------------------------------------------------------------+ | .new | a new FITS file containing the WCS header. | +--------------------+-------------------------------------------------------------+ | -objs.png | a plot of the sources (stars) we extracted from | | | the image. | +--------------------+-------------------------------------------------------------+ | -indx.png | sources (red), plus stars from the index (green), | | | plus the skymark ("quad") used to solve the | | | image. | +--------------------+-------------------------------------------------------------+ | -indx.xyls | a FITS BINTABLE with the pixel locations of | | | stars from the index. | +--------------------+-------------------------------------------------------------+ | .rdls | a FITS BINTABLE with the RA,Dec of sources we | | | extracted from the image. | +--------------------+-------------------------------------------------------------+ | .axy | a FITS BINTABLE of the sources we extracted, plus | | | headers that describe the job (how the image is | | | going to be solved). | +--------------------+-------------------------------------------------------------+ | .solved | exists and contains (binary) 1 if the field solved. | +--------------------+-------------------------------------------------------------+ | .match | a FITS BINTABLE describing the quad match that | | | solved the image. | +--------------------+-------------------------------------------------------------+ | .kmz | (optional) KMZ file for Google Sky-in-Earth. You need | | | to have "wcs2kml" in your PATH. See | | | http://code.google.com/p/wcs2kml/downloads/list | | | http://code.google.com/p/google-gflags/downloads/list | +--------------------+-------------------------------------------------------------+ Tricks and Tips =============== * To lower the CPU time limit before giving up:: $ solve-field --cpulimit 30 ... will make it give up after 30 seconds. (Note, however, that the "backend" configuration file (astrometry.cfg) puts a limit on the CPU time that is spent on an image; solve-field can reduce this but not increase it.) * Scale of the image: if you provide bounds (lower and upper limits) on the size of the image you are trying to solve, solving can be much faster. In the last examples above, for example, we specified that the field is at least 30 degrees wide: this means that we don't need to search for matches in the index files that contain only tiny skymarks. Eg, to specify that the image is between 1 and 2 degrees wide:: $ solve-field --scale-units degwidth --scale-low 1 --scale-high 2 ... If you know the pixel scale instead:: $ solve-field --scale-units arcsecperpix \ --scale-low 0.386 --scale-high 0.406 ... When you tell solve-field the scale of your image, it uses this to decide which index files to try to use to solve your image; each index file contains quads whose scale is within a certain range, so if these quads are too big or too small to be in your image, there is no need to look in that index file. It is also used while matching quads: a small quad in your image is not allowed to match a large quad in the index file if such a match would cause the image scale to be outside the bounds you specified. However, all these checks are done before computing a best-fit WCS solution and polynomial distortion terms, so it is possible (though rare) for the final solution to fall outside the limits you specified. This should only happen when the solution is correct, but you gave incorrect inputs, so you shouldn't be complaining! :) * Guess the scale: solve-field can try to guess your image's scale from a number of different FITS header values. When it's right, this often speeds up solving a lot, and when it's wrong it doesn't cost much. Enable this with:: $ solve-field --guess-scale ... * If you've got big images: you might want to downsample them before doing source extraction:: $ solve-field --downsample 2 ... $ solve-field --downsample 4 ... * Depth. The solver works by looking at sources in your image, starting with the brightest. It searches for all "skymarks" that can be built from the N brightest stars before considering star N+1. When using several index files, it can be much faster to search for many skymarks in one index file before switching to the next one. This flag lets you control when the solver switches between index files. It also lets you control how much effort the solver puts in before giving up - by default it looks at all the sources in your image, and usually times out before this finishes. Eg, to first look at sources 1-20 in all index files, then sources 21-30 in all index files, then 31-40:: $ solve-field --depth 20,30,40 ... or:: $ solve-field --depth 1-20 --depth 21-30 --depth 31-40 ... Sources are numbered starting at one, and ranges are inclusive. If you don't give a lower limit, it will take 1 + the previous upper limit. To look at a single source, do:: $ solve-field --depth 42-42 ... * Our source extractor sometimes estimates the background badly, so by default we sort the stars by brightness using a compromise between the raw and background-subtracted flux estimates. For images without much nebulosity, you might find that using the background-subtracted fluxes yields faster results. Enable this by:: $ solve-field --resort ... * If you've got big images: you might want to downsample them before doing source extraction:: $ solve-field --downsample 2 ... or:: $ solve-field --downsample 4 ... * When solve-field processes FITS files, it runs them through a "sanitizer" which tries to clean up non-standards-compliant images. If your FITS files are compliant, this is a waste of time, and you can avoid doing it:: $ solve-field --no-fits2fits ... * When solve-field processes FITS images, it looks for an existing WCS header. If one is found, it tries to verify that header before trying to solve the image blindly. You can prevent this with:: $ solve-field --no-verify ... Note that currently solve-field only understands a small subset of valid WCS headers: essentially just the TAN projection with a CD matrix (not CROT). * If you don't want the plots to be produced:: $ solve-field --no-plots ... * "I know where my image is to within 1 arcminute, how can I tell solve-field to only look there?" :: $ solve-field --ra, --dec, --radius Tells it to look within "radius" degrees of the given RA,Dec position. * To convert a list of pixel coordinates to RA,Dec coordinates:: $ wcs-xy2rd -w wcs-file -i xy-list -o radec-list Where xy-list is a FITS BINTABLE of the pixel locations of sources; recall that FITS specifies that the center of the first pixel is pixel coordinate (1,1). * To convert from RA,Dec to pixels:: $ wcs-rd2xy -w wcs-file -i radec-list -o xy-list * To make cool overlay plots: see ``plotxy``, ``plot-constellations``. * To change the output filenames when processing multiple input files: each of the output filename options listed below can include "%s", which will be replaced by the base output filename. (Eg, the default for --wcs is "%s.wcs"). If you really want a "%" character in your output filename, you have to put "%%". Outputs include: * --new-fits * --kmz * --solved * --cancel * --match * --rdls * --corr * --wcs * --keep-xylist * --pnm also included: * --solved-in * --verify * Reusing files between runs: The first time you run solve-field, save the source extraction results:: $ solve-field --keep-xylist %s.xy input.fits ... On subsequent runs, instead of using the original input file, use the saved xylist instead. Also add ``--continue`` to overwrite any output file that already exists. :: $ solve-field input.xy --no-fits2fits --continue ... To skip previously solved inputs (note that this assumes single-HDU inputs):: $ solve-field --skip-solved ... Optimizing the code ------------------- Here are some things you can do to make the code run faster: * we try to guess "-mtune" settings that will work for you; if we're wrong, you can set the environment variable ARCH_FLAGS before compiling: $ ARCH_FLAGS="-mtune=nocona" make You can find details in the gcc manual: http://gcc.gnu.org/onlinedocs/ You probably want to look in the section: "GCC Command Options" -> "Hardware Models and Configurations" -> "Intel 386 and AMD x86-64 Options" http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options What are all these programs? ---------------------------- When you "make install", you'll get a bunch of programs in /usr/local/astrometry/bin. Here's a brief synopsis of what each one does. For more details, run the program without arguments (most of them give at least a brief summary of what they do). Image-solving programs: ^^^^^^^^^^^^^^^^^^^^^^^ * solve-field: main high-level command-line user interface. * backend: higher-level solver that reads "augmented xylists"; called by solve-field. * augment-xylist: creates "augmented xylists" from images, which include star positions and hints and instructions for solving. * blind: low-level command-line solver. * image2xy: source extractor. Plotting programs: ^^^^^^^^^^^^^^^^^^ * plotxy: plots circles, crosses, etc over images. * plotquad: draws polygons over images. * plot-constellations: annotates images with constellations, bright stars, Messier/NGC objects, Henry Draper catalog stars, etc. * plotcat: produces density plots given lists of stars. WCS utilities: ^^^^^^^^^^^^^^ * new-wcs: merge a WCS solution with existing FITS header cards; can be used to create a new image file containing the WCS headers. * fits-guess-scale: try to guess the scale of an image based on FITS headers. * wcsinfo: print simple properties of WCS headers (scale, rotation, etc) * wcs-xy2rd, wcs-rd2xy: convert between lists of pixel (x,y) and (RA,Dec) positions. * wcs-resample: projects one FITS image onto another image. * wcs-grab/get-wcs: try to interpret an existing WCS header. Miscellany: ^^^^^^^^^^^ * an-fitstopnm: converts FITS images into ugly PNM images. * get-healpix: which healpix covers a given RA,Dec? * hpowned: which small healpixels are inside a big healpixel? * control-program: sample code for how you might use the Astrometry.net code in your own software. * xylist2fits: converts a text list of x,y positions to a FITS binary table. * rdlsinfo: print stats about a list of RA,Dec positions (rdlist). * xylsinfo: print stats about a list of x,y positions (xylist). FITS utilities ^^^^^^^^^^^^^^ * tablist: list values in a FITS binary table. * modhead: print or modify FITS header cards. * fitscopy: general FITS image / table copier. * tabmerge: combines rows in two FITS tables. * fitstomatlab: prints out FITS binary tables in a silly format. * liststruc: shows the structure of a FITS file. * listhead: prints FITS header cards. * imcopy: copies FITS images. * imarith: does (very) simple arithmetic on FITS images. * imstat: computes statistics on FITS images. * fitsgetext: pull out individual header or data blocks from multi-HDU FITS files. * subtable: pull out a set of columns from a many-column FITS binary table. * tabsort: sort a FITS binary table based on values in one column. * column-merge: create a FITS binary table that includes columns from two input tables. * add-healpix-column: given a FITS binary table containing RA and DEC columns, compute the HEALPIX and add it as a column. * resort-xylist: used by solve-field to sort a list of stars using a compromise between background-subtracted and non-background-subtracted flux (because our source extractor sometimes messes up the background subtraction). * fits-flip-endian: does endian-swapping of FITS binary tables. * fits-dedup: removes duplicate header cards. Index-building programs ^^^^^^^^^^^^^^^^^^^^^^^ * build-index: given a FITS binary table with RA,Dec, build an index file. This is the "easy", recent way. The old way uses the rest of these programs: * usnobtofits, tycho2tofits, nomadtofits, 2masstofits: convert catalogs into FITS binary tables. * build-an-catalog: convert input catalogs into a standard FITS binary table format. * cut-an: grab a bright, uniform subset of stars from a catalog. * startree: build a star kdtree from a catalog. * hpquads: find a bright, uniform set of N-star features. * codetree: build a kdtree from N-star shape descriptors. * unpermute-quads, unpermute-stars: reorder index files for efficiency. * hpsplit: splits a list of FITS tables into healpix tiles Source lists ("xylists") ------------------------ The solve-field program accepts either images or "xylists" (xyls), which are just FITS BINTABLE files which contain two columns (float or double (E or D) format) which list the pixel coordinates of sources (stars, etc) in the image. To specify the column names (eg, "XIMAGE" and "YIMAGE"):: $ solve-field --x-column XIMAGE --y-column YIMAGE ... Our solver assumes that the sources are listed in order of brightness, with the brightest sources first. If your files aren't sorted, you can specify a column by which the file should be sorted. :: $ solve-field --sort-column FLUX ... By default it sorts with the largest value first (so it works correctly if the column contains FLUX values), but you can reverse that by:: $ solve-field --sort-ascending --sort-column MAG ... When using xylists, you should also specify the original width and height of the image, in pixels:: $ solve-field --width 2000 --height 1500 ... Alternatively, if the FITS header contains "IMAGEW" and "IMAGEH" keys, these will be used. The solver can deal with multi-extension xylists; indeed, this is a convenient way to solve a large number of fields at once. You can tell it which extensions it should solve by:: $ solve-field --fields 1-100,120,130-200 (Ranges of fields are inclusive, and the first FITS extension is 1, as per the FITS standard.) Unfortunately, the plotting code isn't smart about handling multiple fields, so if you're using multi-extension xylists you probably want to turn off plotting:: $ solve-field --no-plots ... Backend config -------------- Because we also operate a web service using most of the same software, the local version of the solver is a bit more complicated than it really needs to be. The "solve-field" program takes your input files, does source extraction on them to produce an "xylist" -- a FITS BINTABLE of source positions -- then takes the information you supplied about your fields on the command-line and adds FITS headers encoding this information. We call this file an "augmented xylist"; we use the filename suffix ".axy". "solve-field" then calls the "backend" program, passing it your axy file. "backend" reads a config file (by default /usr/local/astrometry/etc/astrometry.cfg) that describes things like where to find index files, whether to load all the index files at once or run them one at a time, how long to spend on each field, and so on. If you want to force only a certain set of index files to load, you can copy the astrometry.cfg file to a local version and change the list of index files that are loaded, and then tell solve-field to use this config file:: $ solve-field --config myastrometry.cfg ... SExtractor ---------- http://www.astromatic.net/software/sextractor The "Source Extractor" aka "SExtractor" program by Emmanuel Bertin can be used to do source extraction if you don't want to use our own bundled "image2xy" program. NOTE: users have reported that SExtractor 2.4.4 (available in some Ubuntu distributions) DOES NOT WORK -- it prints out correct source positions as it runs, but the "xyls" output file it produces contains all (0,0). We haven't looked into why this is or how to work around it. Later versions of SExtractor such as 2.8.6 work fine. You can tell solve-field to use SExtractor like this:: $ solve-field --use-sextractor ... By default we use almost all SExtractor's default settings. The exceptions are: 1) We write a PARAMETERS_NAME file containing: X_IMAGE Y_IMAGE MAG_AUTO 2) We write a FILTER_NAME file containing a Gaussian PSF with FWHM of 2 pixels. (See blind/augment-xylist.c "filterstr" for the exact string.) 3) We set CATALOG_TYPE FITS_1.0 4) We set CATALOG_NAME to a temp filename. If you want to override any of the settings we use, you can use:: $ solve-field --use-sextractor --sextractor-config In order to reproduce the default behavior, you must:: 1) Create a parameters file like the one we make, and set PARAMETERS_NAME to its filename 2) Set:: $ solve-field --x-column X_IMAGE --y-column Y_IMAGE \ --sort-column MAG_AUTO --sort-ascending 3) Create a filter file like the one we make, and set FILTER_NAME to its filename Note that you can tell solve-field where to find SExtractor with:: $ solve-field --use-sextractor --sextractor-path Workarounds ----------- * No python There are two places we use python: handling images, and filtering FITS files. You can avoid the image-handling code by doing source extraction yourself; see the "No netpbm" section below. You can avoid filtering FITS files by using the "--no-fits2fits" option to solve-field. * No netpbm We use the netpbm tools (jpegtopnm, pnmtofits, etc) to convert from all sorts of image formats to PNM and FITS. If you don't have these programs installed, you must do source extraction yourself and use "xylists" rather than images as the input to solve-field. See SEXTRACTOR and XYLIST sections above. ERROR MESSAGES during compiling ------------------------------- 1. ``/bin/sh: line 1: /dev/null: No such file or directory`` We've seen this happen on Macs a couple of times. Reboot and it goes away... 2. ``makefile.deps:40: deps: No such file or directory`` Not a problem. We use automatic dependency tracking: "make" keeps track of which source files depend on which other source files. These dependencies get stored in a file named "deps"; when it doesn't exist, "make" tries to rebuild it, but not before printing this message. 3. :: os-features-test.c: In function 'main': os-features-test.c:23: warning: implicit declaration of function 'canonicalize_file_name' os-features-test.c:23: warning: initialization makes pointer from integer without a cast /usr/bin/ld: Undefined symbols: _canonicalize_file_name collect2: ld returned 1 exit status Not a problem. We provide replacements for a couple of OS-specific functions, but we need to decide whether to use them or not. We do that by trying to build a test program and checking whether it works. This failure tells us your OS doesn't provide the canonicalize_file_name() function, so we plug in a replacement. 4. :: configure: WARNING: cfitsio: == No acceptable f77 found in $PATH configure: WARNING: cfitsio: == Cfitsio will be built without Fortran wrapper support drvrfile.c: In function 'file_truncate': drvrfile.c:360: warning: implicit declaration of function 'ftruncate' drvrnet.c: In function 'http_open': drvrnet.c:300: warning: implicit declaration of function 'alarm' drvrnet.c: In function 'http_open_network': drvrnet.c:810: warning: implicit declaration of function 'close' drvrsmem.c: In function 'shared_cleanup': drvrsmem.c:154: warning: implicit declaration of function 'close' group.c: In function 'fits_get_cwd': group.c:5439: warning: implicit declaration of function 'getcwd' ar: creating archive libcfitsio.a Not a problem; these errors come from cfitsio and we just haven't fixed them. License ======= The Astrometry.net code suite is free software licensed under the GNU GPL, version 2. See the file LICENSE for the full terms of the GNU GPL. The index files come with their own license conditions. See the file GETTING-INDEXES for details. Contact ======= You can post questions (or maybe even find the answer to your questions) at http://forum.astrometry.net . However, please also send an email to "code2 at astrometry dot net" pointing out your post to the forum -- we never remember to check the forum! We would also be happy to hear via email any bug reports, comments, critiques, feature requests, and in general any reports on your experiences, good or bad. astrometry.net-0.67/doc/UCAC3_guide/000755 000765 000024 00000000000 12651445460 017306 5ustar00dstnstaff000000 000000 astrometry.net-0.67/doc/UCAC4_guide/000755 000765 000024 00000000000 12651445460 017307 5ustar00dstnstaff000000 000000 astrometry.net-0.67/doc/usnob-grid.jpg000644 000765 000024 00001702520 12651445460 020115 0ustar00dstnstaff000000 000000 JFIFC    $.' ",#(7),01444'9=82<.342 UU }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?Px*iǰ_usj_o^OM ~A"£t &f>u|ş <- ">RkBL|;4'>ģsZ_Gĭ+Y4,,KX?x` dw?M(e9^zSX.A'c8md7k$n+1ZY+ upڵyz @z<;aXOgy M C# #^+&J#E&c?zѺ3yĽnþDlQd1$ ?m`Na^U@GGZS` d}*?\tWLfUvFc <;gPjwQ3ϰN5}>KN+i >r+ǾG?>3j^{9D`!G܌_D Ԫ8bK@E'&MozU"sI؊hv 4bLQw$E1 88DkR)A'SOi(4~aO(`M2g؅)ͺF(4f)sX^$Ͷmb9Q%x׿8S$dQzWC,sBʲ=.Pi(ڔ sIMiWZăxZ)םx7|rz5-E$܀Gs>$wq_\{b^ # Ef35voAlH֜fI1EA4 B6+?Qxfk]6h$q^oa %kmؑ9cXבfnt%nW̢`V@ @w=+>x]1{!)3 \5ԑf9c@Hy Q3@I;c&grU4(9;W~#_9$9HmÌ>MzY y4wlKs&#^Io ^|v/6JCׯp GL"t=F 7p$jv8=U;M"% v>w5_F`nFr_ ]3KѬ0>Ԟ"ir(m!9CGQT^JEl2  { >z_|07ljK7^X$Pr'\,>!)N'|+<ցLSSg ^~ oKAլ %F@N w WXsޜ{|L᷈dK90;I'tV]|rQv?"Uv4 qx-h OR0AHQvP?՟ޡxH]S3P*<ҭoyYېH (z_ h.ڥ|DD.RQz&GN\kƗ2"A1HZ~("JQmGL$#n- c'{߄|Qc [k6' (,D ~ qK<R搜R/4#K3Fi:I=Fi3Р{-w`>x>'E-5Fh=iWlR@A4уUR{MɮnyϠAU3J >& =+Ѵ6KK[8q/O=X\3{ԂWoK!U?/[+CQG<7T4 2[=v/W}Sq˰91{b;VoeH#phgfUw 7zSҕN4)qGug)swved`\:(j:3c~-p_QFKYVX\eYڬ8/malWqD`AuM^-ZDžӪƲ@2]F~Ҡ'2kxǺ'9 asc2݈:C QGC𭞇_Aac &F< ۏnĿ1>k-n.eݱs{+~i;1w}157p=>&\h|HXH$p?W5}6(E0FHy(UDRo`3ɬ#@uxKs@!w~cֽtt˴@9'N_i7:h*wUk|Ol!j{CWЖ7WASJa֜ 8vix'qғqX A9F1R xrRPu3COjQ^U1k"96#Zbp݌ӧzNӚ4H &Z 'q84A6)sIOMN-fk:Şfnn >WAkTM,"8}_V?a^[iiki$sOsV41BS M 9J4њ)1(@sN:CMUTT{3jDg-gk׬UĠjtOSFId F3O^ksw2 HW'adSҞ8('xuWI銆6szU s?d׀Z܈_푈D8>ד|i_]Byn-oQ!1bG=1c7 e}ZnG'q^X'e讟28h?+{־M!aFpU+R`eHjŔdT$~/nϥ41݊G5e]23$c8H-WW 438TWqNxW2D{˙QcMJ! rpąg:íH)OؾcںOH!x>Bk## \UPGJwj7QHyȠzA ;QHHJZuW{IG^ Oǵ}"y E4 Hx?kdR5V@OK}+g5t;K'cm#NJ#7u=MkvnO>A5j<>x>^?zEiB8P`(gՎh9 fOz^?0i0s@Mxg('J)?e$]z_KHm=њa6.?J~w &"rO!GY,UN06ls׮x%)siZ5pYaxPJ=|1}c-v[.i7cv8O Ez% k#5wwNv5oc=^g[-.ۺ907۱/SLFȮҟWqd2h {+ڭf;yRXe@ȇ*FAuSE;#Iv1n1.({rW4#Sޙ pysT]"[k[:ȧ|R{ Np8WѽGXעV]&ƠIgWt}=+AbJ~iݷ@qMqsL`.?trt9|AZӠ"E΄8ܕ^i#2}+yt_A;=Hyܕ\`ۉh{m2K˨wI,Tzx֏7_Vfm6É1Dώ?}q"8dczOd @P)s'|5xZ7c%&$LF2 gzV]#0S7}’4_ũׇT H,A铏jYNXl4}N;R4h4N:ъ1K!i漻(ipƕuumb4T4UP08TKY8""–));ӁgҐN◧Z\Rbґ+1|w"V߹O4gh;8_ iz-^yM=RGz9\7biC7uAJvp)9#4=h8_ǾҮG0>mU(׆i^'}IM֕-('$*LԚ/O:&=RVV;סWs=;EyY%Iy2t$gj/} OO4T[A$j2xI SVB9[SqaxĶ%wrz|Ozu}irx2zzפEC*" *ShJӺJNWiQ|⯅'𗉥/f-XB,O>q/2> [Li4_*>w{WoxUW|P7o=2I==9\5>3#&a3nrRr4ɧn(=)(/mGd=ǡ8<}|uc#[,ū0$>kG'֔ AAsڢc4S9FɜicKO>! =} $8Uה^ +Ek  S? f6}Ũ/F@1o+߾`6ru Ǿ3^x##>b1V"#ҘOSN(6K WF)E< Pi:ן|noݴ.wQ* .ELH%9<23 YkѡH #|GfK>t9okIڔRu^=[hZՒ_jh9&p]v0x_,յ9NB@ev32,M9S`MrTyrǯ\t׆i{mʣn+ם!xk/S)TǧzMz7>ۢA1e8*}LsKRF){SWڑ)@T,-+GI>ל\j>o%8+zA=n\Z7NCE]H8p94LS⼏j2zMfr2)8*Iqk}5 g& @޽| =V$t`skKރsMfP?Nji4zru[ Ӻ@)`PLZ &iE4( fN#u AS\_(xȼucGן@kS~C_@|uji7 (3Z6: Q1@*ZOiy&8W:3 C\Wi:Ŧd6d!"RLRKғu/Z1F)ZP)N).is&iݩ}W^3jzw1fV|۱֦Ҽ?haYX፴ oƴzu!P:QE!Ri9yHRzRt)?-" Br)>j#&=FJ:RniF)AҞ9Er)t:mmnV[/Q{V''6puwtCbս}J\g4#qM^OZyZkHFWʝHG⛚P3KRtҎ:Ѻ摑xoJi<1IqB<ґ@=cWyk*9=]Y]Fw, Ԩ=؞ܟQ48J+/ĺ(/ig4HU?o,&MynL.?S>j1OlNb pFW|Pt/iȰUGDz.3ަҊN=(zOFUN ~xhֶeaӪ=O'>}ws;.}_ڽ`Mښ94j6r4wjGt?YطDǟ/{i)oNt;gӮ7mY[)00F Zr+Hnbl4k"PFE<)hj7^iCJ84I5#R)Ȧ\[wo%i$2 27B+͵]R^5=.F{2pr3g=@ k@vN/z=iIE4)1HH݇PZwGUi P9a!p,?:uM'Nu/#Sn5x:3B&%L <鹰vB|aKWŚkFmdhq>׸x_o5.BKQ6Ub?+hr)K @z[&ܟΥ' \sHG)ZPZ6Z: =1KERqL28 2EPǚibW'EYٕ{^~~~|S []$w2>W~0(< nM.3FCйGzF4dqNZLJI4Ruq^CO_&^_VмϓRO~xR/^&ռOpoTr6O?0~}7Jմ7+ЩLcޝ+Ih=rVSI mQFzdw'9%-Ask1,0Ã^mZ5!X~w:iى;ePxCWz!\G82~ꏩd<{1e(ؤ X{#5¯x*w mz7HOn=y,W7_0]Y4ZFc$J>>nrH@&<⒊(S0\od,[ / /#>տ֡σTtzB=w7/NzxHu4B5!3FiP@nUU*Yt~lbqߵx7\^. ry}PO<{-}LJxyttX*ZK_¼2G_CcźUU|:}I%GYNk˥ji$jf)ݩ47(!J6}"VTVlY^Z{kA# 0> oVoYY`3 P2={Dž<h[D /*E-뮶A'ǽCMjb6N3iqH81X>;,a=OysIs鐀D;xkN["HQ叫1叹&)JoZP/Zi%sOS/ZcU/od#!z~=i4tAw49g=i(!?74gp9Kژ ה|O@+ЮXUѾUmÕp8|q_gI`E܊ ֲ{r{w9|7.|楣?w# sڽ;>5|d.5Չ|Sk᣼5i=ߖ^Oh>43ׂGAmeюV\j66,w7**?@MZ2nR=ÊD4F84A&b# =?e|>8 j!itV-@(ǖ~EыeFIu>wu׳i6Y<;ZD֌q!)gR+^qSQҼlUU0rאxR; -(e .Bk7Ķ^Yy4L_ozXM73\-nffv=IyE^L ށa#Oj|5{oox2?ٛ:%[}ۇzRIu74E!u DF?pREP0zS9? :t"QwZ:R C4zWOyZZ2-Yo!(u◊B Rg<FP4wҞPAb;tgAff8>.ӭ5i,$$$cG5DxsQ RK/,J}co^muW64x千+AEIю曚\Rם&}?V )w,tޙ8 Ӯ1^xLj"o[g({zhuL&aGE\8u8!SO5 VoXt _ |SU⦚nv)fy|Ė#Ns[:'W, %z_M}w҆q$)?rU}A8g=} OH&,ֈšINNY3ryZ+N<% gc$ +1V5k s<`Aw&U|Pp( Nb6T)ڐqAqJ:QI&tڅ-;X.}rohV1qr0F~|CMq 4؎=;k[͜|A;N>Ƿ_r >@򂜎HV$S dRh4P5F|~jrO#R)҃ARI J)IqJ);E&)q@cސhێxjvԴ?WxO?keuVva07?^kX JG[&@{f8+LTO=UQ9Sȧ;yiu"9SBɤ#&iR@JG}E.E!k&{Rq4ҚFxӚQC2b@$^skwCFЃHvIץТK[4ǽtRRe(9i.qKNQPMuii%*_>^|SZkoXIggrQoc$ w5k&oVgڞR$*AU8nF1+| Z qke{slO}3\77 I=#db @"OU! Q.HFm*NO4|)Ćkxͬxb, +, {9k"h|c/]nۡ\ʮ|T=:4NY-5K6-mw #k ;=h4J1GҎhhp+aTԥҝqܾ_o]?To.|# o^'CK7 KvȊ BYܓY~d5ɭtr8$3Z)OZ7z] li*}sӊ|^]xNa}־ݚBr) ˒zVv/!^sK"𖥧F*ޤ2@Oãh:Fi?o#F>69ö3Ns׃+zHl_ȭ_ rPӭ{Y8!qdryKƿ |=&#ӭl=`1o8uznbEfa iǫZ*J:SG4gN8uҚ̱w`:p"H)A4iأ?/\M+WJ *]vWk["}O% JpsC^$Q4: ,ԓ_,iK/4ڟcL--^J%} $7c^O&c0|)ˁsAhKQU䅞RRڠS2;RHx'ҌFGSGJ:G#4~H4#*p1H Csek{ MqNѴ%6e[@t 4P[4-HNiT֑KRM/8w~9+$Q:(,ܚ{ė$J/Q>Ou>Ůo$?_AAЌ+|9E7:\js& vN@bH>E1$Q"(TD @aOaMGzp`yȤ$ i6`RdR %=Ǜ\tJ[Ai3)fFwt:֐u-!<K@JH) r1֓րO>=aZ,wsK}k'NZ9i4O~d3+ZPE44)#!iiMSޝj?0nۚd-*jRA$$|oϊ>- X4đ1ȃ# udOֱ?۝H a5k Xֳž%֒2aϨfǯNy?]"gQ5RpGm ϽI[Ğ+|37neTwy{pZ~ӳ[D2[{fr&#jE»!<}wV'*mH9ǚ1݁M,=hi@ѼӮ#k9l),?J|C>е#5TI2 -Xizp6rS{5e⮘e9ʾ[ d}kt ĩuF#АH=hg9MNt8M4ώGr+ƿg[˽C> yr?#Ǩ1H#lR=kfV]BἛ8|d~xƟ^$q"_Ni2 smn7N)zDe3^Qzj^D_Xs̚@MGqo ݴ1$J$UGpExc~֛Tgl>pT$\};K|i|cNɈ\đŒjhZJno.5&tvQxӔGz9d_o~QNj4isؓI'>={{Qޗ"A8& >cR2!4fH;P*4n+R )1))oi;L n$1N4tw=I>)E&1֝vdZnqR7R6qq"c, WY|i3KFK0rrqkx~Ao0kwq3nib1@8潥oKR#Ԟ>Ú~tSú=v-Yfh^;g=8f=@f!}k-wO.ms֓#pA! ܘ>"Hda(".i)E<)E!jP~cX0x|IhHM>vwymWq'5ِxQrz97M0s^ˋ⏆, @ !Ta2s~#8ҎR7KSJn)Z(9iR[\JB,y5ڎLYXE`@?t;M Als2R>iJB3BM튋+=׷A#> -xcLlW6f\1 RE0|6/<_XmR-qM @6Hֹ?Wɭxr9]cnsl^AY/|s-^{o6HV(I?M}#iֺ>kGZİĹFOsW .Ni 8dRSH:Pyt յ3C}CT:+ rk?|g%=>.?;? =֕{o4?us|VfUQYH#Wm|9szO.-! MpIpp[8 ~YMu~M.xXcI'zdH\ n=1HdVlHsHA T-2` W0.B?ξvE=["Ҩ 3HL 70z|־ Vi%UWq :Ҿx+~h4!bCHGGm@Oih^֔PzR`SI8\`S)zSO48޴`3HE ▌T7u]ʱD$=OyީTZ#Cag{A5h-d-W$9?ZywsvqKGSG4:EEvN(viz]FT,/In,oєׅ߳myOK)H~^^ յ<_a{8vxNi3:#ɐ*ʹ1~g{ a˸{MG;$_%Pmq{bt#};T[2*qyѿ>$m- qɎsjw!)湟Jr3qo+9H=k~+Ү#;Y:}}`FAQHh&sHI4ii)GJR2M4ƔF)QA43E(6)K c4O4ҔC ҢFpM!v0ǁPj:dWn${=MyZ?"LPy[zZB0:skK$v9N(P =8ih|w:FY鈊GPOFׅ,mnDHF[$@y=%Fiͳڒ0PvG#Wھ (iB{ѐi7(R҅ ]n,soGy ? }OxqI . ƤFICc*SKHO4MIuo`pi1J)s;f6i?'SHxv;HCJqU=OS,Mu,}k΋j>p3r3xzfgY%{Qz}Ij#M ɥ4E ǥ/M#4qJ!u:ёA #ќjGW;Ox[S$Γ 0&Vhǡd r+'K7]..cyPM(I]P*ɨ䷂fVݗ,0i3ڜ) R1ɤ/JlG h:O,ΰ J+w3W wj@"Wl$ܙ%Eʇ8]#$@z?<*G(r:v'5-.l$phр5 {;R3Wk:NPx<"&c)RHe]NA#gÖBV̲n-nE R#"ǟ 4oNlc .:pzsgMT71 z~hsʛ%jצIWvu/hP8cMis&Nz\fAg~ZSM(Lѐ{F)A! Zz=]^H 9; xUكOz&ZIigHשԞ4Rc/Z u#~̟0 㡤u?vtgf4&1FGA=8E)cւS`v^7Qf,&z̓ۤdwh 8Nq 1ڮf$j?8!:`wVuzo [A`SyHdd}I{¯ a ݑ5![ Q߹'+4h"\b[ްEo[+`?C?OZ#Z̧ HɌg_=+9Ybu7WSG4zPh=)ӹ'=z8i'pbRwca$P9KiOJQIFEF" \Kښ>;7QC(M=h9kD,ry lOjdC58^?>k,oHmfY!qA8@ k68#A֝ i]ƕWoZI#Y20VVd>ڢtOY0֮j\QM'pi`n)"&h<}EP47RGJi&JLnB7Mk 4D*zH~ T >'j~ԭl R| By`3_Y"QiQGIbܽFF2+M6_uO.7uvq}+P1q_<њf<,a@su^aݛq%B}p1U5]0\rb3 =CS>lov$}}G.;YXdVSp}R0E8R78HH4A91Ӆ4Nh 8r3EGSA-4&N94R) ;!94R&NqS@4+3\l/>#dE?3=MpVvP_XcP^kgoajֱ,PªOI`r(&`ҰI)(֗@of9;!\M4S4@8 84MN{hj]3p5#`t&>oN_28d*?{gW'<>ӏ-}q%xeeg7W~⽣w-O[MJ+K{YhncHql Ihz=)ONiq4¹4ek da]Q+ӵ]Oi,r1*k{hmYae]z By<MxFXXޕ$#89⠹GMI,YZiٙ;`|AA\>^6ԎGd?3^mml,Q ¢Z(C?fT7`O4nzP\|xHbwE4gD2^wiޝ<987!a(`kX\׉/΢Tm`8{ ;g Kx"PjQG@+ELiڊ!KxdWQibG_F+ǧ l<.Ôua{J+%d+.03r=XNR斊nzR:W4piN4m&1E!v494Sq8NR(iN(=8KUm5[yQҠƋy=Xq]/zkxV37BǦ%Ryp1_G4E Nr)3 p'⢵S"3ݳڭ^qާxM98-5<ў+o񏇖L9g9?y쬏>A.jH$gx{X5Nm~t93 >nZPƏ ʻkHTF31#'Wiغ1סxWǞ񝩗I *dm?sd{#ֵ)rIc 4q\Dyqi.aKctksvM/Zo6;v4ߑv@895 i:USI,0~Ƽ:u]3d+^v]3v5s"}#֙ `uD!y_D r.qg#k-͟l^ .wKg8*B:r 34v(RJ9y4cLdRM4җ<&# ~!;z~%[]8 >@numeZd}kҡ+xRQR4UT`J=)#?$c%6GHi$eHfcM|Bğ͠oaMt1'(8Iq⶛ ^ZQo$c kU[Pֵi<+XfdV_#bݎԡzF>Zi)Qڅ%ZN3J( SZw\QIږKӭ|:HoBԯ~ɛI?4Y -^XKtDw#{%^ 5b>im\s?{VWo,_.tړj4}~`?#^04n8('#Mayؠs!GV,&LX}>מ$_*@g珺uM-K4v5nA#4h:3ɡjySq&(INFGZ8<`8#&КR22)ԃA8=(~9^9ށyΞ3$Sؒ=˼T}%رӕʛ®F}#~kOo `旨wi Ԝ?SG^Zcy F&BY%bq~оOk_yQ1RF}ğ'žnU \rhU$8ۼ ah X#͏`NbA\MP"Iޝ7:KCBn (4g3P1ֆ jZ,&mLsI'ךM[kCԴ(aFON1ot˄p$@1)xqM9&iqF) (`BSc>ӷҞy 9SJ5ϭSwLL:wJJSp$㊈Nc6\|UoGk$Y}ۿ\߇1u]lȍ_B}ۿҽcEDPUz qM)⎔i@i8RME#GS}#ᖿy`RG~kƿg[kSf@uohzw|}ܠTh ǥ|{}ockpsJ8Mn @=i|;OqKXOZ(4p4/jPx)ݩf)9g|:X- 8' 5׈< ⅟d2`zR?>ֺ|i׼Uck{ yT i'Sr{ggmOYKk|Ƹ!Tv21mM1dyXn[h r}Mv !>lRIN&RsٌAq"$3*[20v Ȅ22R;Oi@ @퍶i%K$.0T1kͯ,uOks57a]n]HCƴqA6|QK/ vY'ɷ\_#G8ukJMO?F-4P&9*9XW=M-RIӍ[q)p׸4 ͺA&B?|@їOxpK}ą*@2zLA_L"ȇ(2sJG4h)iE!L-ڝQҗ4 N~njiQ2p7dᄈȠ:攍ŐhQ!-3{w{þ֮ue'}zvo_4>b]sO Z!8 >$4? |D&6) $ΰ[GB0]AV T'kҕi^! #ó'K9&>J`UT~5gRfN B ZJJLsK~"x}AeH XWJ&5ӦV%xbu&r}M7P~(|&˪62 +GN2dž ma?甠 }s]5!qQzQt/gÛoh"[v zcOB3?<Jl!ͱE^kLx`t3o=J;KiOVWК&eIӢ-c 'ԓOS sAњBGzh$␊amYBH_==yͮ-W6g\uzZkbpCEi@2sA^h#R P0)M`ӹt'j cM5WM#Img W˿b?,򜤖q4^5↱Aas5m¹$;csq*oxo4/q=Ɲ}ۆ$2ȟ11ҳ y⎞X28|9㑒=9}=-zUW7Cl2ݿ±|9i[}s{;):}[z  `ӲژsI99j\pigK3J]GSFE'&bCR[f᧻{4%ާao;En5IM8HA摹Rbin)pi9.M!hɣ ^/㏎iԚ_%K~cE9c3 o&&&X$k2zoßZw'Z [b/M{#G^/ќZ0i((v8F@';|j?'ܡ{}pV^DPt.0W/- \}ɼu;sWkNGǶzmiL`ѸH FxwĶ!܄%(2CV#Q3d )Iȣ8Jt֜ hP;yӳsFzS&- 2i(-Iלџʗ r)Ar~+z@k+"_E}OIq2NKWһNiGJJ0hRHFiGN9+'MYU#g Ú-p-]3[ZJp= kڭh/ |tY.EFPǓ.29WWĹ)Oyș+JT zRN1}^Ʊ vM4ҍI9=( AvM$)r})r*K[ؼhgIP02+;` H"*6.0 mӮW|AcxQ5)ݵEGBOBwc+<0_y0?~!Ӵm=}J֚sH3N<Ӻ 2*+!5)F^mhZii_]Iiw?{ <sLy'4\R@ː]KSA@]:=x2ū> pxχ5ot/ʫ$e =8=`oz I(ŭAoh흢!;@#P'>5$B(PI8 JnӺ 2=h 4 >^KU;#YP*@ :b=5' bM\`e+J`Mr:75?Zij[!weOg}7Oh4IޣL4|=@22=r>)i!J|xf!*<$W\Vg; y$|*/~>i>GhK.D`ct20=H3^_σ׍-^+&{*gt= pc1PFkJcCѯ$CsqO9:^̡5 v.GaßcڻBE*)Ɠږ]*MZN^* )/4k0$<{oh%KwIq}3Ұs\!ⴊO:rY\p?Nq>8Ҍғ}sItH6uOJi^1a&3̡k]V֑*C*@cjSкJ26דS9pnc O38^Hh֌R78")!p' maRJv3H/ZJzS;#))ҎÏ֝BqMߵG<[k,R 20}WG|OK̜ǿ8@ -뙗MS^hvށ;$Ai1^sx^/IB@ >u %Ƒ\ڲG~x/tʩjDw@NvsIJi:w44IHI`ӸHi;KsڌGu蝣+9<^mR>^a<P5ܵrRqIcS˔`+üKFJ oTJz8㰯Ni7fih)搜pE$`=w]è_2;3H>e* o x7e5-Uw8,V_^A&J)LIJ('E9n/xIfڞ+,{GcsvxxݿZ5qx3J<*v>ׄxS7;xg,FŢGm'r'Ս'~Galf3(Ơ<s 7oJd8!=Uqo_~hZV(PȻV0z^I+=iԇ4N=r1G8Brx4}Zݩkm_k6Pȉg"S<~9 K};0r7$;2{vɭo<𗇾XIQ^LŤ.d@03g88kS|I}'IG^dּ56[ti|#DNr3znxWQ9Sʻ#־yC'9%f\mS!~=VQFV B- N1X0;wVKwi .VQĝLE{)(M4U-Nխo-ۖxĈ1Xp=tcImP}`(AiR.h=iأ5Jƾ}<4YZALwy8IX&-&[0"F16z<|az{xs=m|o]@Z]_JqsN1׏8'2NzZ|}2SB;c]~Suo%P\ӿѨ٩E!

,5? x'2-ˀpURAc]6t.B[H$^s6Ght2HqƧnf_JdQKqv7 PT oN}釂= C^7+޳'rIn$Ǝ玸sS-ϪkQ]7 i zzφf5uxht?fsБ  >ӥkۍ%u@9;=z,υhe\O #,S0ž0UU+V&zouis^6񝇂u+u…Rwoz9;_Ư x^Cͩ]+*YeāacVErtP/앛U*8Zu+=_ONa9bl;U9nri{ ҌSqɤ4ir 5Ɵt I4i *l 2猕#G}cXlVZ}V֐(?;5xWO|{%.&hqH>j lHYS=@VjQ7)@S{gS4!z!E)qK(4)Z@)Bh4i}(i;b҅RӅ43G9.xLum4n{S_ixSjwcK=փZM5 ;k,U4;4{ '=Z#'Vg<N3ޚO4zRJނxcuP^^Zi]\EooY\*$0Կh?Y\jWNX=pFO_>Rg(x/gT&K9_N7!`_[mqe^ʲU\t)|uiNma1X0y)p1~<)Iw!Sg5Phz'3w~ CJ: fy4f9p) (M8z1oմk I=~CnfQ{2Rj@lS3CZ\O4)0(*1֐uӲ(}h3Iph`g\qAޚNkoj d9 }} ꅰF ~j"U?tx1팜{~]O=+Kp2G"+ލs)\ + &I4QLzxAEң41Qcf\[guzGz5K7_w7A3p9F:a@?Zˀ5euYv(HǢO㧊SI`CѡLv'ag~R>0Ѿ 581e950M\A" U=6zRH,Gjv)qF)q4P4fҼgn|CeokՕC+cN=uog6ojGgUe`:Br?NGhCEƫ",bU""8e1JA'Tzz-sVE)k AESM:0{[4IE7O48⫖a'")9.q!|Yþ3D:kKNTznGȮ6βI{LyH@"+4] K~c 1ՏNM^4SA֝ސixgk폇t;_Q˵{ = s_;6q&vt"+<61j{τ|!nu-^7M^+KIcW9z?I5MZ v(0b :zaPkSQX+ %\aV:8hEܒD#^ z6ee 9Qcǎ&Ѽ!#qG/9sX+xvt^z7+/9Kإҝ+ލ{~ǧmW/ ˀ‡C4{|.Zihc4 `M_x'Yԣ]lU}Oj\˶ͯ@c"~Uv}H#HQE [ir0yl_F+o k6wk"x,={]&NiiqF(#^ԂM=i):4}⟇Bv]i s ~ԤRx)1Nb(#)3Nu:h RtQ):iGjZ(4 YvKFy}zbn]tY;VGfoۚLW^|3α>:UMo?ccn{O pwkSͻ Umr-R:-S$r( szp>5+][Ll-bYbluR2>l3-&3Me4C|4YJ1(g,d^op}CrI&2NiMiQd Y%cPeʲu'{dO#Z]ݩhM)QφUb| cir#pbWZR9÷@9q9*P@(A   RQȤxiӚ"T&9GZn9 PyQM"iSDp)ޥEI44z tiX)"9ҧZN@4⛃KE&k-_[𿍡AIq Wi,e?O"43òثjzV\[HX~@k5= Be!9`q۞eӵF$oH}:I4n Ag9<`+f]kC u.i7·ӧҙW>hIok, -w\~p3D r7x8u4.!ȺQGbg]jhlQ7D _^ǩ]6s#d`+ӏ"+Wb֕B~rxCϋ]C%`os?|#{V>$UL .18e ٳOK/~#4,J7)Pv@zFΉbS^aQ6`ňs\[ӾX!"n-QLn1ے;n?L5+Α"Q'=V7_v7|+kq+^&[pQKg89 R[ _JnOH&}&^1MNQMw(| vi`b&y8nfc2|Pt;K|Z┮[Oa}q6/|s7#qnp)'3Vl~ ڤw7ST(\K-4}*NaGk}Os^{GUk<# tUNєc?J࿊uXtc&b#vg]{gA5vy%(xGɥ-cı$hiC` dh;rqG?,Es#r=>u-p]$>\Fqe pjPR^isAS1hSHԜU [Gӵ:]?TQE r+5OٿFɦkh\.h`9S_1{;Ȉh#aJs1^|f🅯ɦPBD*3}H+L/wuWZ`UdDbS+itr(ViYONI`x=JLsN'kȱPgό%i:hĚ^ ~uT]~S D|q!H;mϗ~WFNscwJ[0fxKVc#'K0`Wю()iԽE@|8>=i?خ<}TyORsq_Bio5WrG,xB Av渏"_"}QO[ԶHq<֪fc!_\poNs9= 3FBnj.n E(fyj>3Կ4d$}=Af#ofa1ڵHPb((H4i7( u i K֌sM+☱*6TT@l) A\M.rj\PF)x7zP3B9Rb"p4zSHS {ҎzQ q'?9{Ju- l; 玄Nό%akb']W :4@:҉}qQphn:H 8V1P 5r5VIp%jӞ/SP;׋|HEYpssڼؐq9d-%?8Vs=GK/RdG6@绰? b9 Vњjg=zW|l/th/tPћ,tz>"{tS[V6#-|Nm|3{WڅfzC 1fgy%۟?FqN{*UP )6ӈiǭJG 7"TdsUu]>UӦe Ite ?ZSW K崭uFhV{;xgz;: W2_qK:|;zQq=vάqtOJbqJ9LKkmzx͎취_ro<9wVawWGoJͥR7hgPv|2曣.3븐bxKYa]=Σ@.wr3KGzM5VNU$Oa}ήOj>67ut]CIs´1($r"0* Pnl%Hb9 '#~ RD\J_Έr#WG4W$HE"GFʰ<qQKm"$/O'uvçiEoJvU_ŚCq7C)Wo4.d*'՘sW5 ? 0h^Z$aqKJNi7.qqH9)(P ⢕wjqRIKF2iI?J>`QR1{w=:T,?Zg9F})<*6?6*DK)GJ9joαwZZI5E'*$`z8q4p@( 5cmi!܋i1ʳ+Fz^T~sQI6ჼ5i844gm)t"W7 glWʿ,ٿǵsUΉuTYU?ӧ))i(1Ls Pí;P͊zl4nw52G 닌)n >=꼥Q$|՟y OpP~d V㲏SjEe`0Jԯ+&V;RA؜+km:$%*Eir9yi!$ f&#uݵc-wҮ"w+yC5;"7Q2/&3O^^4ڥrr`$pi'4u7 hWIyI62r(XA: #ڽM@S$҃K֌JpIx/u&GCM“iIN)x qKzA8EfN( G~| {鑴Yv[tilnՆ@\5z:74n$.ʶ88Glס7SJRi4՗L.܈-#!scTI?z^-}D25$ݗԪ5OK?iMB/okREՃ+ Av_\e2K5/'L#g'#;F~ko-E)UEN2*)yeR4RvrI=+  ȿҩ5^)Onڕ#o=7)~"1MgT:BկmPVˊ0AM g=.h:i5p9g>zםj>w`걏A?L-t$$kcOsY$%ɮjpy(,G1\ŷkDH+;i2IVpEI1􎀌GNX3ieӮyyj֬_%Йy(?@U:%+sg8^h3r{'!WiU8@!BzV89>|AiÎE/I|6yGfc`?. =NÛ ":?2#kc= ϮGjӼ%f;F飷w,}[޸?5k>!%ҫXսM}3Ni{SJEӱIE(h?ZoZNis^EPX>/5i)P=+?]=bR '`RDG綰X&a7sg#ߜI>}CH$C 988\ҽrPf[[%er ?\ӁfOڇ5H?MRc`|=_a|3φZ0.eu1>}{{kuhbPřzg!)g`[ҒPH!X'Ut;`S- +}/Q8~w!d }%ӑvMh-LPތsA5hgo=iwR更ۊLwT⟜j#Am.K(wN⛞isK3K)/ZMRKҀv!ix <`dɕ7yҔzv.>rԯ-Em:+;}рpk񯃵5ĺW2]$esrOm-WK🅑;M.c92~7JSYZoTfr)H;xq(RRE7?-? p#A{Q\_xF:nmvg}Ez<3Gq M ʲ)8蠷j]*6"ʒuG!(7>.qDN XCܦ(űµ..WV]&k`A˶t}BBZˏ\@ FEe*eq`_xΜPcA}ºH++U qtYwl玕j|D*ۆdWᔓWqu6N3]j0YKҬ7". Lx\E+ F)NM5BҖ̀MQ+u[(gªܓҼS:墎ckW2  |H6m2߆kq)4Ȥ(i(ہ@Zi4H)1h\ҁ^)1^m,Jb>S2!A=O`Ol,;(pt~Yvv*)xV1 =2q^ߊ)i6i1 ʅeP7 fxZtfvڑ3@)qF1K_<|it/pkeQJ#oӟZ 6Z4Z~d@ps3S\W xzBn#U%F~|ծ_tf ϠTxcF썵{C y:_ܩS>/zIQ$OЎί_|?_ʷDY>Y ,5Gthu <#d*~>ޟ _3030 cz0sўĞӵǜn9_geݠxC+wn5u@,geLj<vY@q`O׏UѼA-;dE?3=MpvnL_XWPפ[Gmk c z5Dž5=i9En𗄟R_ŗrIn73(tPx 摔ă֢Qq=BA-̌>":#zWX S[^qOjͪN *!Oo5Δ1d,'8^ϊz݀LevK/(,Sbd1CIMހgq^4).yܰ>ԹQEqLn I"J:8e#WgY$ghsDu&WI^"2Oy-/?kwhijKY/+GњNcRRN4GjJ1A֎WѺUr:nR-K(#d4yzcCԴ鑋7Xv?QȨ|w=?AvѲAoCOa_2x R+[1HhRJTp=yg8>ӡ+p{mKTF M(öϽs<}Խ4KA|]:h's#4lzzdcp6s岎t[$Q4@\N;x⦚[yYdb#ff'$zkOw+s *'ЕzzbREifwP\珴u|f$^7(R)u/k\6UorGt0Z1Bes0ROg5jZ>?4YtWim,DN"&G?L\=k#?ҧpڜMQE&iw4"NhfiX*~g?{ :#N؂@#סk[ZD"1E ERh<҃N(ΦScF#S=;Rp4ђh#I;4Sy攞(L{P/2G?ϥ-m+fvB4ߝs~,]4VsGOjǾ?crl,BퟙLƞ?5_Z N{\x,7#4%hc#NH Z>y VG'xOcc;Xr:9y|߳vnU%6c`w^ i&jް*ח$<=@3583K# T2cy1Hө)sA?-zRf4;Mvrq.P>hϷ Q +il\Џ!K{XmeYaqe<h\5#A@֛HaP,xrOK^֋|;(7!rђ8qqΉyMgVhb&)nKK%p35]$>hY% 0ӊ5-n]׬\>IOU9L&)(f!EvGmoN(o8JXH~,߇>xž+nN7{d`5ـ)xd M`K(gR(4ڛ<A SM(sHFzSBL/Z֣qrIH+t~SŪE{u+9oҽ'E״i_wlOʟb8h_;mO/mJ_i-ߑózq^h-/uiEJ͌  Kmue+6/qק5{}I?5I丒Lmc$qGG@+ܹ >4u|AgkjZ?'q 9m{epW|bj>c\&k%C\c A㓃ؑp2[_wxghB7 V=F&)P8ROe^sFjZmkyxƼHu_tDa)$|C?q^kZO_\JY1 ׯjI.X>ֹ/r[h JEkɢHPmf`=P?Cֻ6|-RT Z#0<^YO,_%|y%3jD A?ҍĦ?_/h\կ?h5oJU;}k~&-~lKtpA\~jW]ũ<d}פGv0hҔv5|aPULݎEv|EhHuT :k߁Ncvv}{|GL GtC*rɋ.5+a_H&2+; BkVvvq8#G/gwڟyީ(Vc0Kq8)!u$rY4; cMw{f͜5(*oI'_F{ґP9 _'gړi7{Q9x<ߊ9pQ"pi}-"qHǞ(\LќIRw=jX]Η[ dq8 A?gFK x@%h+kþ&yqo冊=;ޕ@yY޿{>-Mufyx8忼+Wh" %߰g쿼7g5^s;RsKizQHsH2)W?kLhR(%9Iޤ6=Yz_oh+skBfBZylЀ@)898w(!EN+|y2-oU[iڌyC.DEVQ9ҹ9|OzcΥ4 AF%vabҵ[=^n S<)zQE44("){V'|Omlq-bˑ;{}jG3'_=kb8bXEHaUF}HH?vx-zґN1IR*ݫżil5F)ǩ^S\Jg6@ȮzOt7;-OO s^ZWfWYH,Ayx#S7(@?F?QV zd=V)FC &6m4e#bFz;_GC,rבSeQq)KzP=E)4TqSOziǏj!&]sRd 3^5/fx1Y.d};.9~{= Rl:mN80ƸG'<'?{ǨPJְRD`Y8/7'KѨA j/5KO\ C:dخ|Te^Y6LF=GE:WM9.EbI u(ukx<1I9|SIwr΃ho  ◭i Ƽw4˃o}vב'Ҷ\Eq t'0M:Ro>+ Mݑ%.In1ڝi'VNmy*O+u-T.m#u/o{"NrIkGn;hAH+}5ַ~2Zio6w+`NG`W|bs/Xo4Xϔ'C2z2wkϋ/1u]Vũb4r~=y<וmmvAiMs@7LTp#~V<9Z%*s{Guq&/m3w69/Z"r=ᐃ\/iφ:V]c)قzsJ/|#YK摖U;Kccڻ;q!5fk}v_ީG&FEx]E ǰ} > 2bYaqF? YE%a<+;5ah(ik(uQ=\<~'bElh <]/GA-`LHITsBsHB((WC)FEg3+⑾ՑIqbG%K [inp#麳l4O|M׿/+\/ >;k>) e ~QҠ=g[>AKiO88Lzr+|7M7Ś)\0#ñqA`x1Кٯp?v k7_:;ze'}h@U)桖V^2вJ 2=xZ_ث9aj}ZϛMBt\l[O$ >xkT$""^<8 Wiъ/㝔֟u%9[?| z^xEޟ e0B#X=UqoifsOn?A-g7f/ZQMa5 HZ\Rf^c%;RmjZ^r)HPִ]wFүM=Q+&^vq(;O7}:C]Q[j|e7 >Usᶣ7*:8էE+nt8`Ny<{){P }i 6Rfbm v4QF)ҁ i-YaqV=}ͯOژvnuǯW{kzlu#QkVƔ)N(=8 : p4AHÊh\ot ms!iXn?J)E(HFkK|7awILJ:2&AF|均_ĒB}y+cNLzWj3Km<q*A m=|HZⰼU"CǗ2ciJ^|UoiM v2q랤 u%xD7ֳW |;ǓEFcOGu%<)wqN7>Z݉JSЃ<1ōb>b/Eu%[۔ڷ< )GA8(h)M9J  k IREk>0x.Ylc G\cy6Gd0cR7dEWE*2mX2O^[Z&.\ 88q](8=jo, iϥ*uM8-Zi`R4BFz oyw_\xwqYH#].̱ǹʯэr ~$ML(db#FJ#Kſ |9[J麢1HYI 0G1^u;V&Z!A|A<`)e$zQ`M}b&ޫXrZF$AC^oyaTed80Chզd.-[q$m~j ɣ8* k -UҼL1m乆pM*[*9hr xl+4i $&szfmm-v(idm hh&Eđ*(\9t]_SdLŸ`#ז?W++tTT  whifx+2X~!kYxdP #ֺ5ݟfR|m5eE׮J EYU{terMNpxCw̍,^WqPGu;֮G<,ӥ܅;]+=iӿg:U]kZk^E(Xߥs΁ZͮjOu0VɎ|S7`BF }k lu{Lp>~4P8 ci83ScDǟjQrsJ~zfݩN}'|5}63.즅d ~'5Ǩ~Y_ƌvv=Ͻ} p=~{[CдYⶕ7m˃({= }׭xo'a# ɆX[U+Fz6h/,m@8x#y?잝|[H3,oi6s5[\Vf2j g. 8;L>h^jHZȏ<gK?0⚹WҝZ:s,hóZTg 8*-~Piig5+w;2==}ADY#W`%I _'iKgNFd 4 3'o } 9ǭ/4Q̉Ou^--JEx2Cޣ*܉zR9Q-(:9Q~5㟴f֞t7-#:FsǨ|;ͧcmo%5ԃyYrr{NiK 'UgYOU\aOi^0/gxRY#a 9GŞ1M(5,džn/>ߟQ𿃝IHdȢP@=ۊiQؑ@w K4kdM ֹ.rO|sM,J{UF Beb?\SˌO+A$zQގhIHM(9FlQךQI ԀM֞'9xfExeaEy_Jj3?ޫpkmAmwH?{ ==Ǩ 8K A֜xKo9ts /O9ݿJojҙ.Hd>ݻӺX)pM7u)`E !ґKS{ҶvŝN}jú얖Va1zWHf(-nv8:qE>˔H.p~~Vkꏅǚ HkB4V;]}=]>ԋJE&7 ƀ&FFs8`!'x>(c`cc 7'w99zߏ<=ܚ˷p[yWqU2O9gώVdf~TH {pԺx{V;I,ld0kX-#fߥymRݕĉbY^֯|V/ ^~鑰y5u=4{h8/`qM<Ҁ1K܊^)g)PޢUA$A;S`vʤ,'h? -]$=·r!iYO,Nһ4B*L pڔLvܲ?jc+˝?UiizR(&<xvtIе44?),>!hxm<+^Ee=md]ǀ95 6jʫ"Qx7=?^hZ.& | GI[&HP W0H0 _D;Lv.;"Dw?yna՝UUJ@LV7mҢI-hR+{tg_jEvp*ݍO&iIN ZFH/&K;۸8kt?+l5? :A%,as.=R^[U$v2iX!I[Aݖֽom{nR0H~mqLFyQz -(P;vagTO\H"f8tH܊o6]__H(QY?V$$rCVN )[$+ר/d 7 BuZLR"hӼIoo!!nv@e4z?Q}GoF-v~$c-Jv+>T?@j: ,cQӵ(7RUP`HA9{V>*cev ~ʒgyq?]_ŷGA m7pQP}+OZtLvI* ?\uo~^OOe55^#'"?sʻ3֓CS0gdM~AAftoNQ@sZֆ<҃EqM R:SwxnQi) ORg&J 0AW·:-΄]3NL^z: q3mG̙;WFJp?.q@lbǚp3mJXÝ4|s}.zZSMUTI|yT<ŽuRIb3M06HF(fh _>nXs|ֽ{ý+\Z uMH29A|yt3FEie;N‰(θ߃inb͔n;}z޾R]n=x<Ҏ_ߕ$~g=čB xMnL6zl27_"ew;ֿ/鶫sql& `=`J#~ I-*/]O>!4$qU@vT#"i -.(4PzRdx ҖbEBmȧ 4*@_H*TP = S\Hx `Bc rҎzSpq(@"nF/2 8=zpAgntGUꙑa{=At?7H5Dҭ$+ʡ9?R+ [Mw4|H~W=]rxA[X-< Im>-O(O\@FɶXC^ZKsb~>SV;.GyL@n#@J]SJGAn+ cBY:GvWEo'&دT|g_on߭tH)\T2qkOgvx>GQj}C<[eo- ?pJύ$u9 [G (IOҺxm]Է\(~%⬤cf4 BUY>q֛HtPTq"WR&qG3B)`bbtӱA$j]=3n0ٯ#ķPØMf`uïcx8xv _"{1^y)DRWlH%c'ۓQj?<A-zUކd|gk ~k߾Z0u̓WD- ‹:tn_LtҘ*ޗ]7l3.) 28> c!tPR> =w'gž1MD-;¹K :C^iOׯZ~]lDl}v@U-}.-PyST0X5U{kXWveۻ?R=iW6^$E/c"]{^ 4R(Jy&3Ig&ɨ_n+珈 .#eo)}BB?qz:KO d{jƉe(5z_~xKaʤ1Gq_JX_Eַ5)4DVPGj)v;R:\ғ5FyEp'tu] Z9xbcW<+PW /JqIiH!©$&Ğ+էЃ$;T'/oáF..6~HǢt;bWH%ܣuzSPF)|^aEMf"BrįR:s3x#O1xyzgϦY[[E_. xy8Q$W]j"Gfea+Pz`zׯ+t_ 䃂 'ُҽ/ȶHa-9rv?Fx'/ZP1T5{m4kT"(It:c™2#'F 5+smj^.<J1'녯ы b0H(c@J8jq&G֚b ٧NM  c9)'ޕG)JnzE]9XSFO4\P2Jt1NRun8H)Bϥ(u挀ylbMv޵<3^Ax;o H-B>';g?=W7Gk&1%,~N3g9 yy_H>&4-CBȺiFf9"7ݕWO\oo1=" |>zV|_gxV;8%=N) x?!֡. dxľ$[NCN z/nh/m̓;@OOJ|SK6q.$` ]"$|IT#^{;YG!bT}= 2NZK<W*H{I_'ODW%, .Ydl}9a k;/=U ѳ>~U0hœ *T6V0O5( "E8ԁ)N Ӱ0i1;bS[ڔSI|78NF1NE'zqWɟoe{ i0}T]w$5=V$Cw%ٷ **`g%Һ߉ qڢDU k_]=[ܫ} g8y*xZ qEKLPGO(e4FsN& 62ciRi5<掴8MF'4hۑHˁ;">'BHtY 82HÐ#h4$*5*>pĎqZ|/ x<Y%ugX SvϜ}ldtcx9u-j,/7֪[MizImC׺=*9XCK+Fs3s^?/UϥkˑdsqW6.jwG,21Tq߯4`c׊1ѥS=XA4*lJNF^qZNlG̔$:{Wh/Ih6VB4T{>P6@qNIR3ϭL~(ьhcH) )Zi8ԜZSB(h:Fëiѡ%JI3k gxoOVx¤t#vqWQ(h)1qSsOc)&G7zN \Taє#r W<]^BEo!m&;{ҭ/ipZ+y]_f }+m-m!!qƃ  !F(3J)visHƍؤݚR)6Ѵ4o_;0x?h[_05QW\$T.}=+hxZ;Igب=2?O,|޵~;gjjX^N巘 A)zxq-Ƴd9py`R+x+nt9ZnWgyb=޾-m*ˆp|px+]|S{M) (Ue+(235&|e"[t) 2֭A&2aF=%mgOnCZy|Hl`H b wE4ǥg]Zx5!nZD)}z_L(#4)ӟ8R &h4b+7ZtjV^C9cA^M{FPܕo"2GH?+ l[ !cO0$>TQFiFM ~Z?ƙ3?<|iV94u&sFhq@)S@bqh@R{.em4"!"Ƿ;d?`z%k[(npnﰇVx9?54I]Zwi(!~7 ' 9c&LLG C,cԒ}}80h)('\RwPxZǁA; ;w4s@KHsڐHs\׊!xgc5[%#Ԩ=BeǕ,:glWFcWiaw լ+,MocV'4?MqN.N+/ďtfl0g㟳dvn }ʽ`^@љu/$dƠOݑݿOz99hkW"7bQA^C|dּ)>C=-qGӜ~u/^7v.XN(Npg$+xeho-e,~ǢBm:dKi$ -cppWp澥>ּYE%[Čb+ݞƏ\<+g n@2b}O;ׂOC$tZi4%^{~qV\2c\G"ZM䴵TmnH^W8Qǧ=+=Z ;G6vC]L*12~lw\R({H P3׭/֚̀qMF8zJBH▊SқMq)89nj.uMBDjO$}૩(M<?u*,dae9S(9PM A8.sւr0)A4M&^)n0QҐG F)NhqHy7zύ)UsiQ҂EN|U澒XQ*(@zSSry<4=qJ┌ L80_B-n#uk-AG^P;0?'ݴaViܞ܏CU5WSƤ49;%9 gλ no0AZqQZJ1Jy GqJ(RM9TԘSH}|(izʵruP\q.b2ʎO 8|Őx]|-he%eT8{J]/Flp)'9 [)x4y6:[?ފhé rk|nvruֶEooڑBGRf֐cIgc^_ ,1GmNDDP C6e:`svoQ/UmRFc]8G.RJ܌PUn6:T)qsM(A) jޗXZ +pqg R}5/߇?5!/4RWNA SyWRcRIhP9cFiCAKc+|{.mA7Sg=kYdG{Tfa(q|?g'gyge6סx7&Iψ_*<kÐSvtkV6̒{I$F~h1r~)Z5ݘX%>L/x/+*'r}Q]֋VB e˶ 9AY?ca`,%$),? k>0Jj UM+ԅ^|DuuwI,~U=8j K2ڋ:0NA_z]Z_[opA22+x~CGw\3 GcWK GҮ"sS >>8S朡s*O)2۽] (NV8i1&w'4=MN9Z2sOjQ z5?Z@9 ^U*Ope]!#]T9M+kh(*{ך(44яzisNE!/Nh:PMIPyz@OV'5F#k*iň U/_rKwܕHsdaϧ |@lh7C5Ծ|bX^%7E $s_Gc)E74iA1A =A_qxzf, B*ANy"%T~]GyS=Y4SO\D u8C]k#qM+S ]*K˹BD>}k;RT.ܯ<ܟp7¾<桨+70+7}+ek%ދZi=ϙʭ4.ҍ㌞}Ǡ ְ$|6Ad|Y#*>z`~9'F}E.hh^gNsNQKԘRS0O4nZP@▌Ҋ 'Z0:OzvsMZ;7o&zP*A73EgʸmsҾBy|KkS-U܈mbuڣr}ILv ;}`mݟ?r>rh:IC7wjz? w{=ʧ>t跡w?zA݉E=ߥ+tz8qHS"j:dWr6>w5}/To&$!!*ǹ?ixWXM8w ɏ#/,rIJ2qH_<8-4JM4\qE4(IF)y\~h~;AD^DaDp{0cqוt%ھ)ݍk< B4zRlmy#88)3NZn9枿vfE.(֔N3N!<ӳQҚZ+_%5=>/- XڽSZ"mp[\(d' 7g A0&8Phϔj78ןC^K>j;LQ0z|q]!9t4Rΰ%l{ӳ4#䐀 1=_0hf̖E`L1vFq ?> cj,r0&[;gkʹԾ |Q7FF $dn:B@wҞ%SI49)Ii: hsڟ5AuZi=ܛ#^XהjzUĭNI"mp£cZ3AB̛~d>x{Ju520ʲ=EE,1DJeaAxo5 C%ޗ+`$hfg;%N cD~ᨣ!IIBv?\֯χ:)Rܙ!F9w:Ezr7CQ4jOƌ0/Y,UŹrGTaExoZg^䭕@ 9V:ƽ-cH Nہ7]q^㋛|DB"0GjB9o_sҾKkxa#@`\HҬEJS*R1-.)iJ%< Ru(sI LFsBNz RڜHc"S[␜Ё\dpN:}j+hԟYg44NV'GAI9;xәG!ӆ1H8cIzp99K⮗&]1`^a&=rm/<.dEZ'9 ӏQ^=+Zxuct?~"Z Lo, OyzWdsKҨjڽdWr:" <}fOrAnj ߆ڦgL>{YJ: =~UHu+Z𕾉7/ؖ0J1uBIݍ=y?*<u5i{"9'cNzM[F#>'$яAHi9ɥ)84.H\N0=M/S6JzsBN49J jUVS ݯ6''[8Dqݰg''=+Oq݊oth3jT1W=Az'xd"xiφ4 ^;4G3ߠ~(u8c~f?yrv^6zƙm1"{j^i`mcpq!'4bsFp!4h.y9҂hN !4杊iȥUMwj$hx^0pWrׁZ[aF#3y{ïnZĊw3_;z: Ĭᷢ󇕐"8hz  Gv\ަo0JIӉ 8}.+3[t;CqrÞ1 -5_ic GAoSeZD#:-{z02ĠjcQftQ9HEu*bsғ8)Cg->zw4J@K֗h (i(= d2iBsGJ>4dҕG)&(9LzH李))ZvE4[lXzmЌZngbϜm\cHk|-scZQ+P9$,zqUHԱŎ8{SpQl"(" M}E<(  i܁JhZI1N斐hHNi)\wS^ )Խ) k9\^+3$lbLL0" } 6Iw^9+B. Nڔ 13^mmmemK(0UmcFx[lJsvٞ.v{TV}y| Ǩ?ƽMԭk$''#8GC`~׍wj?\5496/Q^}ƫ-SȸS5<}_FXףڥ]ZJ$բh 3Fih?"cBNbQKiAS78I5wv$Ӡ)2EYHW?uG)M׵I<Ѿ@ <Υtm?j!H3AϽu_ Z$)[\w;uwssN#4QHS'4tOT]2Qn7+QO`$^#~/%xwrrܹQ¦h$[Ohd_aFFq$k{8n&IA$R!ʺAAA9ӁhQ!!9oxB# .\~y>{zum]Zg1A}Mz<A 0lJh剷_d }GWmuxS6JXHzdz-d6,8j)`q0:QI =5rߥD?{~Ϋ\)c()NK`TțsJpU~;n=xRgڑMGuwocnw[zI\"x7u%wu;O7жBߡN,T2щǀohXXxÉo}(ڮ/Sh럥u>j:%(27y1H0ܻgǣx%u9Ǜ?h~5Sd@M>1QF`S}*LPO*dq"q==yŮ-P\1Sއ+t}f[6}>i<(AR8# Rt&4i))N4w1M#5⟴v%4&6uKۇM08>.Evl}> Ku(t qVJ-Kiq /O<=3G`dG{_@tnj\ښN: Lg֝Ҍg\q^@xj=I6Ep>hѿ1aH4t?njWςkn F'zϭ`x7t_hKZ,F1ݞ[ tz`)wuJod|7v5[psKցF){TdԊh\QKQւ9&)OҚA4,S;qKN:t\Sovz1ރhƷ#w*__+`cUQFT`(RnϵU4mV.Dߘ>53AV}>R$|Cñ'XlC!"jNRSIP˸zP)RHN)9?7RIsғpO?JUsJzR85IJx4))GZu&1M$(w Rq=){uN)&أJ^?Vsu Xֹ V\'!/>FjAA@' P{OTӭuk7sd|=1ZzT%۵ ľKcFzz0)oJM4Q>S )1|bϾ,4K˶3lE#fa^4(Ro֐Sr>@QA(SAEi:Ҋu!HTs>)|:*5YopD^+~Tw?w2uӯ/Ni (#Y"aWjz>@jz\d3\w}vz :̿=X@4p HNhg.QmqM(JE҆1gzZBHnF2@s+W|+*KMJRԊkm($(Nz⹯÷x2!vBGRbQKCPi)“WG zojoq ^i%,Q}?<ļKYSāPAuZp4\њBzSRM-ҐӔSȨrҞA搊LSHFi3P)AJ(UtU6eaӪ=O5 C;9ސϫ{W*Ӊ39P:ӱ@<⡺bYaaSu/jcQ]$O#qA5?:@a'CGlci8)“w4&hJG bnfu#rqT#J[wWW*1xڀ-'փLnhU1I3L=hҝja*7444gR J'B)6+hLX~3GwmIvoqsЏY~#h孵o o|}3qqA !/˵g=!U g|ݧ"uqjk!Tb2D9.(xg cᕲ8?ֻςMV~!iu egyrѹXurxIiI:i`~;V-<)Zxzvf,+WYe#"jZSPa#Azׇ0{xXt*݋ރ{W Zvi&ޖSq;"ix=ɢњ31AMbK1@$+,f?xj$֥I&3-T}9|^˫D/|Gsg+uI#aL8;Gž,Zf` )8H=O\1_B$BXeJ=i8ZBp3^)ߏjMxON]Nus&6nE^\gGN3}HaKYط+ټ=#94mA(đ63?B98;CAO<йj5iS h&iFiq@bҐR`6NJL⌊)q)1E.8/~2 60"3=[T~iƧ{;'a빽[}zw zgA)(Ri֑IhEx B+5^^j#ٔrc^'"E?}G ҔF)6i ; f404@\@QIgPW'> _K2|8;#+`ޔьRCwgmYiyOm2)*z+uE}VQDE),Rj~zvND&?&"{dIgʽ~(8P0`ANiÚ cn dgW̻H:M8δxR.olm5+)`{YФH2Ƽ_\4Egcj6xΧ.@y1đ"(c(PUQv&|U/;iA.yPga?¾~ Mϖ}O/NϣS҂9-׊().948pUA΃}KGSoU]Wh?y ?6j aG5ZI|VA\ dSԌ`KgO3?{V[ƒfxN Qo}[}L fo9 ,c:o*Kh ᵆk:$>|.tZoDϽgsy'<.iUO")Qɧ(A4`QFM):QQN3M<Crs@G5?]G&ouݏc5/LV{"b[שEA]j-;4'Џ5DWY1J"9>W%K#Q̵MQ0 +&K Z/Vky1s,.ðts?M? ~'W춊ۈeo۟ҽӼ!iD1es՘': (GzSҒQ:u,1HNWA@AE^O3_Ry݁uzvҹۘM҂oB3[^ɩI[!E8`r8[5%1ɨܭ8>^fhٍ? :~Ϫ·&DGTLт3/tiRXǰ֑$Gc#v#ב^-2A;Ioq6)W9  Rv^ynΝw;XH=6;^~jeo$<"/o]u8 .ON` Bs@E"ȹJqR7jqľ_BCᏪTVυ[GN(WAcX\n!yg'QN_?_/_M>v^W zf_F3z Ժ~,[IRIB9f@ת-iEGis d+= +h)M\Qp 3\QҊ:ҐuQE0^]H~B]j kYn_ʽQk% ܌J O ^\7nFX#P*5fy$XD*;]6FzREy}fmᎦSܔG^f⁇\ ZԵfu9UU='<054-cU+$ReaPs^KI<B^xnk șX1G3}k):qAQQ҃#nИ{T4t$ӶSRQBx)3NؤݚCցNM9/W4JЙW;x$u? x>=$-d/U}/~IJ(ypqր iWC5$U΃{a=\IYw1'b[O]ڎ#N 93^KYxo&[?0I {^^(? '4ji=(=))RR\V +\b |{WJGXlF;JIaN fcսvQ,nhR== Is}Kۓl֤}22y|sݖiZdeɌGhs5G c QqLwIӈGZ)4iqHIR)qE!I1Kq@҆"k-t;#Pf7=| W1[YCFdDdLtcclu<<_XOχ˄2Fȹ^H8k~|0ONt5}Dgz$s>$NM.KZ8T)&Sm>/_7''o, dzL0U$yPHᥥO%Pe5 0wYZoE\AUpP@BsN )I&xFA9(-ւ=(P)F4LњZ0i07RA]kĄމKcu)\)ڎHc}OߴGOItN+h=ņG+)#6A(A'W 9!z(9澟Sx_LDN h6U/>r:?*Bԛq|;u⏇c 4=s^eO x->kINv#1r cש_x^ZZrG$zmUԊ/q^iVv#O6$yB_E1iWޚJ:P)❚HO(IGN”:FMPFďJr֔m#.iV9旎8E,*$^yk?G!' '_S:𥾃]_8I={Ik ;NHG4Z\qҁ旁M  f*Pxc$zn^|)$JiGʒ7+&>{SI/4`1LVJ^dy!C+QDdf=Z\(~jCz֔ H@b;bxw$|ݭiߕy? x/6M%-8_~7 ׅ4]~+ 8DIF;A{m⿄)A(";^K$NXw''8yq/ҺvQ|ųڥ'CRIb>)wt4)8CuhCᏃ&:oҮW+epK zWO&]UJ\Oz@iB1AQހ2a#ڑSgG{aiIi}mͼX{\[y@@չ/i.-e #}O5ݭR8M92S7 ֓QE(I%H=)@4 ^cn%CFF)őց<ӏNi)A=iM晕݁NQE(43<ғrM=h=+}M/n5_4F0 0$q@zC@|q k;`RH‘{גx\>8Ntkim`vf58+ sa 8Ȏ1m4VWi9$F< Hx3cVqJ MRR(4IsK֎xɪnӀro4hC&OM}?~NisIi)H94f(RSJEh#Iך;RRIRI0ȥe✿*M <ӸSμMO%kƝr䴍`!*T 7&E;P3$(PU@JN1q4Qӳ7Rg4Q) Rm(9N~f|eoiEks!fژT7Wjզ!,@ ߌxE[ç rb=mm[iwʊn'GI$$$ G;עg/h();P H l橋yn,JBtm;>w4 }ǣ:t`TI_ǦF wAOSfIրQM8(!8݃4q: 4<{TnjTva_JwlFNipM}p(&4Eрr)s/ HG8G)94Pvm8 HA j3@l LUE7SS fKJY>S e>\+| H4瘻oֻúGgoԈ,}Y,}&1IT7wpXss" c,zW_z5?=+%9 yhzg[72LsmsB)XJ:g$nyKsK{Z0n>WPǁ[M:J b^ 6G' 2=Z Mx{\!%ŰLH8dtakX>--4[< `"BG=iHiNO%mHrPߠ>QiO"g;4v>t[bE{Wgwbg]zMPIw{dӸҼm*XLa$ۮކԣҌzbbÓKzP=iqJC֔֎٠r 9(PzS3N Ӊ7ӱ\}.MSn#<.B0, ; S0bMgBN #9eq>l}G=EzV6iYR8w;mUI_Szp/a%/gX繵;? w~-=oo->:85O0)Cq^57Fi9%ChwS?"Si#2G A$g OIƻO:[(ZKKs9׌]6 >$ʻAW>$R^iN=hi1K7Qy {ӱi5徟i%ܫ)3W^?XEc~]w&iY-.yR>g>ނ)ɥ)ϵ;4斎!4ڍ4)#4t1\ߊ|%lW8sAX>dE6ؒ?X}oOA+eR2<J 8QHO⛜IPp:Q|QNvQi}q&Jy 5*[F &)曻9*N98=OuHi8ӌRPn[7'4֚8HyW[-<yG MzPyz vsI\v`ܼo&݉@wN&x7V {Mk'(usCS[p"=z97^ (QhNXgE1RtK[mG%>dxosi?,NIr;ޜJIS\yٻ<`^4H8=N٦j3@j]ŽS8N1M 3֟RJMRcZr)s)i>Jn}x>pzQz6֌FN0)fQ#NG"0E+F8iC֗&qFMTԵ;]*$ םI&TG0XB=O ס:MdqA1WzQF2isALQ5 Ek&c,ҫ="_ |;⶚ 6:ېE`Z{]u/ 麭' 7F^~e=Qk40Ӵu&eUHGʉlq<i7- zE?ͬCw{2c0!S+f)A/b9cO5vy;PF)sKьRSM(Ҏ-`RQX^#ͮm"AUh~ F`pcIX&pYNAp(V"EI#"pI5~$|9]ImZO:peFDOb ?\c5[B4˝09\O{)6V֐O(x千+AjbxNMNR)RHyIZ)ZBӔҷ(1F)6P .8p'4Ph4>[PqFigcJF#4 i٦)lR ґJqnih'GT4k&jG,ZRa2;YH܈=0~Z + n+u(? WO xpZw.ı3o$*9IED́RiؤsJA"_`Jji[4})2f^xscz\K ^dkjBy?dWp.4L!Day4I qInZkFp.P>hϷ P [$_QJ-U+/Sg"p-^-aue 4-5a' +6v[=h$fR]UǪ1ҭ|^MĬ[vWyac+: JQGCҙ␨M4K&4(g u!N5&)FsAPu7údyC}9?i-6_ndP]>8xkב]$U,kpCG#Cz~P֬RӗH)RFs?Gx,+: 5{z.5i_n1Ӆǥx?_N$N_w >(?*y 1c/uzZܧs~6vK^g}®ZFGp{pG[O%Н4۔hS> ;odӴxW{Aƅk鱔M,f=9&E(⎴;Ri& 9*)ՙvz n_.x ~g>\ Sb*8}OXWZ[DCQy5>isIZigJ]HsIRԘRw@׬7ls(Q+ӵ]Oi,r1WZ[Zsk()Ukh/\ҭ&1>+,z(˟lᖉ XAu\³M<1.3I_I6oya]n_P{t;5k{x1׺ʑizҞKJ(4!FvA8F>ҦVby(g&qi٠sHs@'<╗"niݩy< 0O4QHTڜs89|@9SHPsR~aN'#h4ǭ n5xC22\p~Vm4VJq0S^ievֱp089i=()Rnu :DlxWCє܁IA8@yn ԛp:A6Kj cM8d056qe`9CGp~3Qm7R̜}=E(緐IU^h ;҂sڜL\;Sx4cвaǽ. lҰ8 dQMۓJx94hRLb9PPR Q(I XidSPNyI]c'P(< J=Ri FQҁI0i@"|?kBwʄ[qN=H꺫2Yn=km 5$DQK<#IkWI"`?x'yR|h!<)=UyWp?ue=J]n3q:#^yF'r{]Q\RlwDԅx4(*3KRmEERb(4QGZiVGƼW9c?AWzfVo#SGcWߍ>o4VbVBJ?,8ISKɦ܅̖Wpʤ7a^O3ͧ;{BU' A>|(21B;!;xk{R`S 4ڒZ):5/zpbRMg!Hg/ןE&Wdϰ珺u#M5[$H'r(Ws6/\^ H$qZ'F-}SSQ#Rcp3vD?sxcyyw"@Gf.z|)6.)C)TڔIgE%' ѴR 3Fi3N HZE(F !sNF)=sHis⛝p!)ȥ:4)@4A$|Kk>lKtp 4_P:bxt=}5iQqUF.1H4 ݨ+ZfH83gSkI\ l8ߌoe>xt ?kmoΆWeU39>/q;'UFKA9\`^i -܈#-Ew~8e#c5ٌSIrhH2I4x4 )N*2ҫGY,WL>Q^ym>=[əLx=Wчq5vhV"oNգԋғ(ʓq)@ɦqQ(+֦V'qMHSxNׇTS ]ųZpzz; sޞ+) u%)Mii:UIoeO$tc?c "94ķ3Y}?ֹfWgY2ʍKZxcQQAHiW=|a=MY-+ EpH_HX\4 G媀 O¶P^)C~.VUz*z z59蚅;\OeJ0YO]IFi [<{ju֔tIz\(<3IC((FҪ奮f1,0U|A>-c2՘sdPrzzwWxiwSX@=Z R[D"xPu *D>zzJѤw2'B8vk<BcѡVL5_3Ma)\uw6w_4YcdICżVּ\m@yHnY$L>>栰F.|YQ:wyda@1F4}/L[{;ukϹ$I>) Q}(( QS"Ҏ.sK(AFoa衎ZC9c+VDd?3ȇbP׍\<'JB=WВ;])1A)P&Rwu\3N1қ4ɓBF3ORLΏ6\@e$='ҼBo$^(?!-+Lc5lK;'oabqzd9u !A)i94Nn9o-У0Ak&xݿ°<9Kbk].!ޑY} _AUUPdz{悢sIi1 l>]c鶽m^ X*!161}k9>co3'9x7׸\ibmdqɷ__A-h #.:R+nN$ L`qށӚ^M Zy\hI`7Tt]RnDߘ>ןXM39dñ#X֬ի糡}I9s@);)F0)WS1yϭMEfLҀi Z4(QE-7RR[( ^QC҅5}x;KMn/ŁWoG~hY\JsH=?YҤX5rl>}NJ486$x$ ߂׿Ңl԰f&Fh&֝HN0eb?!q\<_Z2~">_ E@D9"N;Yݛ`*߆/x"OBp# $ ]2:zb drvu[Ugҵ)$St5:w<%uOig+H+ Wbݧ.t x`CAhĒࢢg'#+ܼ%axkLث=P/F`1S)h4 ▒ h B]ԉH9#\Кv9i{-/ζl: KҸ;]o wOa2H p:z|mi[ߠXo6?u#s^;f7˘\vyR z׺y6>! i1y]{O߁.tc:C$afa*=I8> 7W 8]$tqf~SנmRm:(f4 PԹT]kKƫZBN{B>=O+_~ 0C]?~qv}`ºPAQQKE4rizVX*-^-ѶO2Ǔ=Ex|;V''kn}+o߳u:anV6o9qǾzW@SDOtQF(JhFp)ԹɥZ8p)A'&)?x=!ZĬ`~~7yyHd+Z2Ȥ4KWi.B&{/hg c?2FSʟbjLќ":w}w[D7I,Tzx_< o8;۫"mu<`t]N;﵀8WAթz5;j)ỷx."YbqFVujTҤwy ;q]+M~|'d?{ R1Ӧ5O<'jIwk@VZLsԍIҗޘA&s٠rivю()٤ +M9KNi+#Go'a,G|(ZCҼ'ǧiv=71>|S7Rӭ_ԩW]j?tB͟[U|`WF)46 _Ž?JҍW[ $w2yO&LM4 &h^_x_0Qc5->; c^?%њQf6B&>\0:8cC\ov>.AINeD'ls0Qa5۩68A죿rIM!&Ӈ 3JyS)((4(#Qނ@SсjKX/`5)Xpk='RN56FȜ\zzk5MzK*K <޵fj@b2iYyLSHQϭ.M$PyfEQF(gҕOKIK֐J49.3^^/4X RcvAC=Hp_ 4iZvo崒0^X($0t<' hz}QJ7cfld \k;QSau/C4bڊ)Pv{r~h!/~2lneU>տעxSS̻c"az/KZ].en#N=@{W!ͻl8n1׌|{!pP^*F~fG >>? ᗇd#~Q ^Ѽ[j.a(NCFުÐ~{ו~ͺ]R"#vY+y.oA 5jRZCHsJZp(;Qi@QGIڒu\Ӗ7ڛM-TS`f<{{~-g)V)bXcB-!`=H/&e(Eo KźŸSۗ^ۀ`RSY\(+/[e5+{(XLςGSW/mȁIQ=Hd׿ތEKT@?w*Qғ7FzMbRusw|Emk)VV~]7#F@W a`-ZB^w)z~+-_-q 吀A C{'d*]۬rAuumgm-p[ĥV RI [ԖpjÏ:cof? iϟM|[TYb3q=Ή$l(daVzm7~(w2)ɋW|3}~-|2E~ny#wUxr/u`BI+ 9w rr'5בO-u >2M TհV9SIuBnA>{qڌEfH܊hq1Ғ?ҚM|ݥj0=5S1i 3 {`WH"F 2+?hXgiK[L7Xބ>}:}%ȷ1Y$,FYOВ? !OAOs 98(?-'9GP8'nspSHO'Rtv[ZaL=f̎V DT?῎>-ѯլ43c]Fs4 rĚ%[\SO +O8ݞW|wto2|0h: cr Xύ|?*;>#2[;&U88g+V0pC3:5cWn_}F9utFUUso N8%p)G:^K;hv) 1t⚆ޟ">#ҕ i dTarx4u9aY0? ƒơ@Ly?LZNSJiaIb0Zk78Sz:grxM1 棞49^7YXdk xfj#1zS[k8!'6~|cpyO8,:SwӇ#41ENhF1EK1KE5\uRNMJOJu04:RJ:R(r>$e]OICvG3m 1 f_=w 9VO](`ŽK(4Tj+)䕘0W{f+Gd:i$s插OS/ x>=!V,p:_OSzW_(sBf F#c7 }V?nRk)[}PA^e__c5e*X$9fe|gj'ש@FZDZ0x`qkCtZ@ 49 )␌t\q.iIڛ^sW76-͠pԣӞAs^8{i-ݔp:$dOGį/(_8 F_.3;cWFehV1i}I9$$Ko1=ȇ{T+Kž0WU+/~^M=iI8QYj^;;wڤ{c< GxėE.fGUsu$wZIWvSgI=G\mOXq:_yWRi|f9v0}:W{ZA# yiw;H [Vu9fܤB]ƕE:M:j-Ӽ`%u9ŗP_Ey/)dӅ4M/AI\旵'z)@' H9tр E>aB)Թ⓽=iqGJ1Gy|a5gg;h|-te[߰(4 \ :PM6R!Ӂg&ksOZ<<7BHr7_i.AiЬ6E ߏCDҴiܛ0A8 ']ܦ6es *5B^Ԙ䐡'{x3)ch1:R63nkoKe?{CU?OooUkxW(b%nRB2N8|4k {p\A!.]v>޽{^=+:lU`]/ &>0dWѐ')@Cc9FjL⎢|TǃQÁghCx ^v&gǮ6c^߈mM*k&eTWޗ4j |6|gڝu/#*%8(O4:g$*ŨOp? UOԵ(͎(K } z@3+0ruBwՆv(jkX+H? Afh/ZeȆ *"U Q{]\LE:(I듞xᧅ3gkss b2H$2yK^rIGak.q\_G# :>[Gsi:)ApA2+Ny4v{8XC<m)5oѮWY9Xˇ>A%Œ <IkI+} tǖ>L}OoŢ.nB~cQ6884-lUuK-ɯom<5\?`>#WM}]\G{w \"ĿR?z\Mx剃+ASgozZ(n{h 斊+_E>/x>wxo f]ڝ+[ѿׯmIFiԄf/1 1Hѥ!r?~5~w֗PƷ׌&G ^YI!Lk<]u?i= {xe'c#;+?*Ym#Y` rF!Gƥ? A6OcBI4^9ɯto\ I !!~WuS95Z]y?1ǹ99JJ)VSqKJf$40۸Sړ8h0;R NԝO4S99QEjp$,he^5߈4s KZ|3k}{K{/+x҅QȤ8t4Rw<M'NZ-x߆ A'tXKj0].M7ue0|m?HcE $;>)'IEo~Xuzn=i)GJ #58?ǶC2V)nY=x95:x~i|Ki yFL0h[ඹk˯xõK6WbH q^+ozBwjwHqy}z¾0[4X#p%7K߁5+yfn ƿ4Lr.p  oA^~/|?_Ryٷ?+Ƶ]Bě->H4{AAGA3kSM`x7@XP56m˸ =) 7;_jrwֶj@Fr j?TMCygu>ǎxI;sFrA8?R0qMd/<7<>܈ c]f?4'nhiT;&0)OJJo `t6Jؤv4  A^qڐH$Py^'A>RҭG!)TN=*8I"CK#F3s^sףHU pXpe_]g1m[n[?_A&ďj)#C=6Iqq,p,HUG'+|Ca>(7z6YK/wtw G28ϘTQ{|h/av^qQlRъ1E-QJqLf 427COʚ\SHSSU(4 uQEPi(PzSibH4 G5V<ȱă,p8uCtxZg}=O\r}qKFygph#ҁZS֊(ח|x5ރdʛS8V\>o? ?xVX- Bar`(F c$=_ 6 M:Oa լkY;n L:b&+'@o<6鸩ǩ>v>n(9(((+_Q~oc?l [95v,uS]z4N#":22V*FAxž"_yt[am$oDyjƳZŰllXܾ}$8U#w >%V'Zvϙ`SX8ϩ@sN:(F1Ihɥ֐b;_x&CsNJ(=E)IwQM\EV^mHԵ:O\]$mW, -F=ݽ'H4aU$gc+͵]kQ4*6K<Woh"~b9c=bE&Zԏ&8x-.9D |3/'YόB-SK{9]]n$܎D68x9Zv ӭ{ť6v,6 (`"SPy r~*|zXtY~歯49[lsNxۦ uSp#ޗ<ǿ~OZ Ú?4cXCg՘ܓZDoZ{Hn?i]GOJ^՜-T+Ԋ Ac$v 2eYI</ㅼ6ey [[p'j <]/-c3YNJw`W`dji)[&25N(j(=)y(R0)ZC֜ORisH)iJXHfdE(!Gq^ k MlG${sXzgIPjZiofOp^/ i^ KңqK!sL@[t\j+,c1f+=[Q426Gzkм?iP 6<وը3Q#>/jQHGk}J]㹴6t \ϖi~DC=J{LGR'N6ž(ysfUvFX_]X3fhfE>V;uڽ&FJbRגQ/dP$vy9lq\lzwǛQEl@d"A k[??QgL'/%B(J0#٣F(3UJ1bU+Ki6N 9(-ҏzB}*:HXϭX# E(QEQAIESNsNIJ(W$E c,kͯ/OcV3S?C셽2JyϿV!I׊BHn:THM1J)H=u)i \_-6%$ p# ~5z~j.krHmY>y߅tV8rѻ($"H'r ϩ|;5 a$3\n^D v;Ghj{릊,FcTqq+~Guľ&$HVS2I&= nQ)3@%7x<ҀG\~Lpފ+?m<^c@=燮a gjd^UGGI]2ʲ=E:hS '>A5Sq2qSJ]8Zwl2>tg1A<ފ( 35:)4$/FIʀ=KmB8(JL:N׋|r}'Ú,[^\G\h$zpI<^>xb $4Gr@[vrxާ[:Lhc9q{c|Z[5HlNynNhB9<|}Mijᮔh^(Q`}iHȦ*=瞴Q;ҚiFJu-4ҭ)SF@'ҚNѓx5 i C IWK說F^yE~j3̉JP#/$]ikSnWh-.+7-LmFN={W7\W?G؎ØVEу+ SEDw)z9&3ښո 9R8=3?ųxUgKt1kO g3s鰞%q-$$W]x 6S6Kw(/R})&'ҍSM>(Ҕp1E(Fi'44搓v֖sJ8ގiqF !TR9@ 8cJ)s7-Uot7Gcs^s=ƫWȀ4<ǫz?'Hl<9&GJL`E$evH]coRfˋtnH,\b?Q^-.X5;+݌HwLk۷̌@v,v?S^O^+o+7-oHiמx(jVRٍv[rXr:qO ]aSDڳx/4nyݻ$pH䜓fݚw"ڐ^ Fc4I&sF)9ь t416?Z1JAxFNޢ#" kHdI24Ѩna봨?BOjo>2xwY-w5X|d 걏L4$dk=KR{QZ@k6vzrʬQ%UPvki:擯@:hpo*{t>ƴOJJqH)M IMUl5۟HNߛ@PLՁJ⿉x/y#8k]qPx8k>xjS)Y~whATnI;q"޽CVZ拨Is\KʇO("N x~h^T8+oޓ@m;*!|ƫ[/`Im9̗2Pq?p׆ i\>]99cv=YrZ@=)ZZ)z⩭32mN 5te9tQFM'Zpk =k]ݦe͔A%O+Iu'KcwF9!=zU7v=$N2 } ӅҀ1EҪC##9EQn1ĉ&p(4R4;ӏJmL\) qBޒ;ڀE$jM-'k䟎1\GSQiRHhA-~O}iBwJۜ*0Os\ϊ}K^/u?c)bT;(^IkSO*4R vT¾4gsԚZ)( J) &sJ(bɠAJ=im#W|lеON6f;2#>oXa wh.w&u2A,.9ȤWK⵿lž+PK11DS@^x?v;F$7 z8|WL444 dw(?w8#4r:utsh`')"* He]NA!g4%<A4G&í<KM#@+ϠUg4}Ǣ½#Oӭt$GucOsSQқyvp)՗^ 㯆>"X`ڄaw*-ߊ |*F>c {V]ox+_[jswd99,qs|LW[Lm3aL4Eii}p&긎z$8'>y4qKh'4ɎU Jjѱڝ);GZRM FSNE4֘MCփּh< Y@ɼF턅{3㓓F8#7WQ8[D1[a}Ao|h4y<=?#clzx`k݇y5ok2]5rc 봂x{࿃4Er} 6 EvSQu ߝ#ZG0<1_oUzsGqM r=j@p)TWjLOq꾌;G ]R.%D>v5"|ZĶ+RGu<$`FGS".ǁ&so)6Zp}2^U_d>+|I ??ƽ&RKIVXRw4I(Q}h47;IO(ϭ!;pB)n9$`Izdק~ϾVŗ1G԰[!{Sk~@R@i|٣9.)<HrE48E:Rv[8H8EMth)QdVF PGzu/^.얶vm-tS8nxk6NI@I`WK4mGsw7SJ^Id`:OA^M~NԶyq sU|zyiR8oM z TRg 9N8oB׬+*>\MSwXr<zMh6ʰ<r04-)i&^i8P}iOZZ8J-&)'*%( Z)3Gzw RSH._-<~yspfQ:@AzM6v[DD T3I}=v)p84FʽiUF2€ҨҜW+ךgJ}criA4pzҀ|Kqk .F*28p 7qRz~IҞ0x & |+H|QFk7:,hX֤OozJA{ot tfG>ܷ b4f,Q99kZqLQ.VnF EɊU2=Epz~xSKb8^F?K{XmY!eY{Aokw&=yjDГ>+cAawVZO4gWYF٭@>Y~ ?4e{K+t #Ö_c,Jĸ,}IO03A Tr/JAV-&&ko.:^v?ywݩZ7},: ĺA\">?LZs-?`9wN1<VRr}Ɗ)(4;ZZC@IE54 ӨEQX"-r}q6k8'7~rka+hRcXAESEP+;SHPp!uWw<31Z~8^Y+-d'haX೉'>C,_ tƔmYgs;O^N4(4>x/xqj9HznQ(sO"G!@'JkXm-㷶8`BGjQG@ { \sOj\S":RM HzLdҜMԴQE&:IU5k=J\RL'J)kh\Ŧn}\!@yu cҩxྔ|Rf[đY48 ^Kg MQםkwkMwIy g;w~Zއz$QA&TQڽ}OzRivœG3#Ƽu_a3d+c^jvYɽP~B;3N4PzR4@L$ғIӚ 4F)8R %u#Q~1H֛9h*E`ķ?w==?^=5sn!O_@=zףƂ(QUPvbšre97@wb8ݷ#v3Ji.i 'J;  XZ|5公껌2Nv5tV6zݭKOeWu:q +Q5Q}}vQCp2N|AiVt$+iA6 جDCgK mOη:ԁq޹xZ\:κ!ܱ '_A:"@UQ(4v3x/NJ fv' <}vCA綞7XFy\_"Muc$$RIZxMr 6GR~e.8}aZu+ b8^` )E!RNȐ dHi%uDPY&ğ-9wC*"}O5WB[ۘt5Xt_s@k7a]OB"Pu?cPݤs5zf'm/CGQA9;`)F61MzR4qKIތR&}iH}r:RJ5>*Ş&?J~nlp*2YCؼKqq:)J}l)5)$13yd/lc=:;K^k:wYt[}[ƨ\` =h,/\f柀 ) &VWQCR(Kץ!$qQȤ7"zҎ))0sRq֐hzRd/Z7g 4`RWο"kZ.r۵0)F,>{'ҽwDlqn;):ރu@šipzeb.j=ry4 f84yI&|ϏK,p_Pcc8*3 -Cmﶤַ> k ӏt]kdx]p @kBߕװڷFs@:pA^hKɥ߽&Z421J{'=h)?6;R3ҁئHaJi\H0J7K:ʶ0w/$DW[xtM2+P}YKVJ1UcXܧV@; :Rʚ01U쭵 'd ޼zx뤽ܶܐxw>:lz f Y=p:{ڼn|]_]%5mӺGA9*_|C<'-R2{n)xu7r($NJ[:S%!8rOAlN^ÑF0iqނxҌEQHWu ]IEb:=s)Iq]}2:~&:]\@z]i6q7 `cX|&N7ԭn` jSdė>> m9dLpHz`;:iA1 ;^Y"qFW/ƭHu3XwSpOe1;GFMs^4}zw\0E`9']$~ hBϷiO>|zմ\i9 ;A()bv#>wx`x$IaCʲAJB=M.i1ӱ  {W~ %_"Ym'й@pdw$O| ͔mYxԘnGq*3 1n[~4,/U' 7#Iw^#!\њP(iG5k^r" x5Ʃ% 8'=[۷קqIi1^ԄuQF . y< Nz+ٽaWׂ(BrK1~~+صKF fM㿴6--=)v8l/%1jq8hc8䍋hMfyG(\SH֓/j(RrɳR^gS`tQ5)$i9Ҋu4 uQFfёGi٣$v^/Fhs^x[Li "H}"Wm:<%c$W$w1?H>֏$lBfn~4Ue#Ey)qܝgBgEx_U7/5żbQvAFic%Fbv.}qO(S FlTfQsRn_JZNs)QKM=h8ך_ZU;gSQH[ȴ鐂r}g5Y_/KIW#0%sr'\c⏁τ'ּ;x-њXf)DxA!Gqp~ /ɵP{62>G?۝FP2LPyJK@8|k&5H^ .Tϑ(OצE} )~KE tNLPXqQҌR@4qI)M%fri{RPVbqڐuR 6EWR# ^B8y1{UӧKЈe c{vC_9|R_K:GH(@ϰ}Z=|+[֡ysjN[Wk. .} P=)5 36WR@pf` iIB sIr)IQӚMސ҃zNif ܑ2i unEygYP>`s +ׯE^Lq_x'EG-AlB&K0'u}„d( $RpG\/c#HVZIy9cW<)҂j!^򫜈Ž/Z21րY١NR҃Nizkgv)@$-~žҥ-$n1G"fyqEj>؃'kj_vkþ?A/4X R6E2,C fBÜ͏s׻y/t9u, Zi5 Pgjduaٌ{ֵI@NQEQF)Hj.ňO_SL,& r!Ԍkõzp\gH 5_MK|UA2Ķ/#?km@m2mlq'$I$Oh;P+O]em[E w1zjl5#+c_ooҺ1Jm8Ps(Z<1Z8AҌރEROZ(hN4RЦ[k\<~n߭{6%xsLȁfm"0LWKt+2 辧u=mr;>Nl@ #s/#(Q!Zb CL;bQh'ANM-6hɧ)M!xC)մ5d>y? =Uw0E}/AtKA>h1+hزf;Yw4}^bU`0j/|VѮ<=q%xxy4$+tbxdc=Iᛟ x!õVl`pA9m(<J(#4i+ym@JOFR0E|_1t LN "G.?h,KOݵ^WEId|=׈>!"J~#vc#4sEzF玵ןlmOkc6_c50@) 摨Qhniȿ(G*Mǥ2X!<1ꎡ Gmagc;H-~ciA8x)NӉ⚿zIoS)pE ׊ ~4C3RzRO41ISGJZ3E- /lWO 8{~O1e]+Z-v$ ub"K_9U>ɖt;'½{Tu[IS5]/4, Y)Y$2y?5ĚSIL Nz -!` -l$Q:(3=I8KyK}sF S [ho;eq&A9;P2>4ԴQERNz# FJP081N|ӻQIɣ$Psր2)@'֫;tHMXc6vIRRgⓚQҖO4)3H@=ER(a SE(7Ş ]G~|K=_2fiz1ܡؓIHFf:Tl~;S(jSȦsf8Rj QIE Q4pC$HwsI'xFWsE7AK,4M'p+f\o{':AWu\hܛiťͳyNpmfv:`x ZE'@<Ӎi74ޜsn)xF:)@1M3֗V("ɦKx^iR4^o,Fby# oEW] Z~[~VɌ z6: xbzFE RZF+ĝfiowEgFOe85a,G}q^࿈-25-,3GNA=Fpx<ӆvM{Z<)ηljbK!~BaXDqߌWѺ^ku"Q ~ޭQ3N:tdYtTW70۽ċQUuj#Lңd''?ya+<;iZyp|ڵ ^J摤"(EFTR⒁NH:x4QKM&U'c4ݜKx\S!R3Fi(4bbh&RfsKEQ1Er*:msl+{ٽ aoœ?ŖNFt5 Ah>mg,Hn`Oȹ =r{g&i7"!E &`9ϥ| tyd[;%4LаUG_MhЬ|T<+\AZʁP*;)OJJC֌ҼşEO>2rk1#ˎ \#r+>m'㮕Bw۾HR9ovu+~~dzzV pV3Qtٵ RK!Q{wֿh29S<c] jmK8Y: !A_mkܵ]OJ{|&<ݥ]OO!‹oHHxPz g3dx:(,>jNiR( 8()G=i:S 9'&&yaxGjvI94xQݠX}_c?l xk5v$uCנNR 0D8u NSXciĚxH(\ߊF꓾ [D7h8<+!C-P5Z&xO[ftg8uSB** { Y.neXe͵ ORƦ,,C79B A켛ql%#si07fM!sLI<ƥ2kL_Ej+ܐP`:fnX]R18*g!YZY9̛Bܫ k 0ZL(1M`x'=}UкnK!+W"32A4PCu֣uli֗&q֗b(Ӎ&hIjfWrN>w57Z_[)#AoA56gYkDyϩ5ڒ.8`4I๷'Ȟ9qIҲ@⒗"!Ni)9'Rh JO5@O!rqLYCmiFiO4ڎ(8ڗqE!8pzӸQE&})rhɠX%𽶿m~luoQ)xG֕Χ ǓGjx%dee9Wi6ҝLsҗnG")=R^AF8h=i1E(x+ⷅ/x3Kqy^?yd$WM> ͮc+m%`0n|Q^}ݻcZ>= 9n!;buU 9{ ұNuS%9zN@#{RcvLR|.qHS[kGI@Ȍe!H#GXSZ%c&3ۇ7`I+,%qw(ڷW|ʪ=`[^ihK1UC"i[OhpljmųFf.A01 {ofcɓvN}J𯋚,~BtwڦXwf 2; :~JWx4QIG4@)Fs֚GJO):c֜);h;PHPh'c'1Ջ ֤E%h6rd^cĠQ\&~>!p9+ҭn-ceAaަQҗ Aw?ZV83Wou|$2Aʹ횿x_RyZ6os0s$~ъv1FqMi”iGJz-]]ɵG 98u_la {.zFZVIig%'4Ԕc4+/|?{ֱ߱`X ܒΖ:o~9jS]j g.>TGTA'ׯAZznF]w#Þ"fm^K+֑}O$=6Ѹ/&4EޖR1L qQ 5 sMEPxzMOtf)(&fRQEPzRKZ)R Z)Ɛu׼?iy3(>TrQ\&j~ ԎFY!פ\ymʹ,2 ˓KёK) Rt4JQHhON)Z\U _Y,tDyϠ}m3j >&OjgۦrG~Y5+S&YUQTWYYZqY[EmmQ UQXQM8rx4cB۷ԫs^5Ve1&Եá`c9h AkRh}݈OFzAA^O^e4sUY?+?N׸OΓiLj V1n,~PNy+Z_j04>dqq)"צ@h))r曹s8P~ 3ľemdHș9o{Þ!kŨ)C*c™ b3b?^W~v6ַ JO.TxeJ4m _HYV ;|Ň];AuB`D˓˱=ItCA9zs)rhE5K'|vmZU qx=9yRO؛ٝqO?W7Qǻmd"8u GQ:tOGjm;iox =Gb;o_|.C伴.Jn$Szu5{Ijym\ cIو?u?J>M%qF@d3:Hv)I KyT4RG޼~VopU$rQ:<>S[SK)jLԠ~)18O(J]f&' P}kϑoj3N ar+ѴNUKIGu>v5r<(T^iIxǟ_}C:jJ$p셶`Bi>!Pe@dUM]$VğV_DK-?7냞1^x0_{o!`0VR}]4pb׵MpۥoPAkӴO3P_^ikvֱ,P0MQJm(ϟ hs|H->Ϧ+ ̏+ ޼I.>XEKl9߻~WRufSg !;1=7ձҊڒ(9+b>)9%E#VSЂ:x!It^>t}f] G/$QNYQ:eƍ.&/tIMrdj9%c􏆿<}YMm^;$вqzdry5vhF}zhK@JQ@h4J8)9;gj=dquGy5jL3>)z?ƽM-uK$IzuЎƭi"5(4 tUf.^@DFP[ QHN&3k'\L0*~g?{u#f7(==O56YGoo cj'$ INnhQB9 4=k珎G klDvA1LY|cԴnlWtY"6|AG{ \8) l S5>%msKKɃ{(- QھBHPz884AxW 㨬a4WD; $@Qt{ {K5;d]FyrԿgK/#0&s\ F7unw)ݢl;rU7>_Fkf;qcto9bAA7rVIL_:ozKm#M˵]%R{rMi9Nh=ibRt1o;;RΩzc$U5 RXFF *QPM 4jP(֓4RP9E(ҐS)(ST.=k?XѬ#mvRE}A?<L>/zGԭRQ$/Ўv5h)`dpOګI6$䚲җ)0Oz )So0qR҆}Ƽ{<̚oP_9ᑊ&єeNyy==Vݴyřͩ1IL6ܳ+t_V^\hkQnR:2O\Jhujg8Mz<6[Ʊă 06gS: A) R%.;H) p-HܷJP/MP)haFR:RZSցK! wEzҎڹ|= Qڑr;YPzg#s^rn.7/M;^> 0ep2z{ jsHMdxOtg5{ PEQNxI\Ӽ;7 qpK2aO?h`WYѮ8l2s~׫>$|S3(p}O*}]i3)Le&94qA^1J8Bq@i܏JBi4 )S<Ҋ *hq,P{{C^muexUVi =u\Wv吸~GFȮiQ1Nr|lޭvOأ[Y9as׽]{"3^Ϧ9x=6k{h:l_ٷo-&IRUT+uZRYǧO722ɜv5]xCMWI"vI󖙭xn=.y%w"z9vdGzh_U:D7 @'=3u"W]^J F9fs8y$aB;ځ--%.):RAK^_2XJ"S,[I}灟F=Y >x~Zֽe{ wG 0ܫ[#WxK-;NR %:g>Ϟ!?ڞȿ@>@jSX0Ԥj0Y쥒";8Sxt;U<"[啭bv䢄Wl{ßo{ qq+#DzՄ^jZb TQ(H G?NFE&HitiNҐRcgC&hx>;jh]J9^)K9'(V4|6 ;[) z:y6k]aisĚ䗖`/$g)_wZnYHk|',0y_8~KZN5ܡ#r>U;ӏZm.)M Pi(fund)0V2yF;]GNl 7ƼH_lda).=[ȯDҵMfn$ܧSW!Ïb_ ǶU91j௅:狭ԛeۏ܆/B 9'#{X?.m% &``ĜS^A.|8mc|}ڃJ7+#AHtYbI`aXSZAcF]{ |/״Fٮt>Ug@~e#AFE}qgs 啽͹ Y# uR2?CSJ(#4cKM|C!zj];Cғ uR`RҊo;JV +ʂBegԏZ~xŞӮ-G;t1cTv=׷V~.MNa2;O@;񟀑Oxľ#hE"'hd߀}ھKTu6=gC4N#>ԮZῌ[o5_ x'I~yKyRc9(ˎG< M{= 7lo2Cd./~0|jh5rd6,ݷ;gs.kqQIJ%)h;(-ZsRR3I'kh? a+HWō$4,S!<d6?2=_Z1J4 ))ۍ>|I$COWןx-LJoXyܧ;A &s^ף 3Ʊ)ͩ|/Ӿ<ߒU[+ ~^M p;R(h4R;cN!Q`<r|q> mFF'Fy/~#TWx.W:{Wit eq3ןjCiB֗HC Cь)E.!%|9@^- };G$~;Ӛ3Gk vEcE  ?J~*I_ u `0 zmǰ~'ji #Mc nv9=N9㰯{g4(旡$0;@4@84bM;ZR̐ *s֔;Pjݤ[D #w7tO4i,215=zmx?25 ֔xJ6);5F F+_#ѣk;BߑC}OKy?NK?~~ߞ8p)H={T7V6]]Ct'+?M~OZZEugqżrK V MAe׊)yǥZ8r=()"N(SzӁPA7.1қҁ"qJGPusւJ[8  @ vfe%~VVHf^*QN\/a 6lgœzg>IDTdKQ2 +s}uvΒ'ڂbI)fϮd0=+쭾ma$\IzSh*AHE&)T;i{ӱHh)SF)yP~Z@iƁKIEEC# 2#ל~Άΰw2/&/_gVgi}Gkxu󟍾'~axWUV  N;3OU<7_aqk$ .dRFķ<qѿ7G>Gg_V}O=zW#F%V8bN=9:5Box#W f"\2d9Ö>4OhX4UG$3'8>?|;sxMW++T{W5&rjɦ&;嚪H fE;JRI#IhEtpUA75{@(;^(Nد~i}G}RъJ:71_=$/d񯃢[i8y'V:{`lȷgk2-T-vmߍUτOgxŰ4Z:a+嬈9XSO-s^ <%^@2# <"—c8izoN)3 8⍠iPyN&A M 5xMKhFz2^8@=`$ӕAiT iC 9ߑeRާ6vJ ~_)g+[bHncVq=e̚\ GAaA\^-~mnO2 c c #c$+fdENK ]M*@0zR)U94W|fc?-tX#x q j ㏈'ahk #Sp@$:VPrIފ6֚֜('Bhi( QR)qMNMGAJ9ю)%H57daG5|?{k}91CY[k`b+Q?t^޳qWa󮕼.v}ty=O |gUM~qi~OZ|[fOƐ:*+s'dzd#s^:Rg+g[Mқ};$yϠowu-\ylw$O[}zv(ҫu\Ӳ1g9)?&lA$hN< ǧp Bnw~1ଦ|B+#+rBkJRF)sjgJCQҗ4GJ@86IJ=iӡTnK6^1$ymV"x-%D`\v G9խ'. I!fhV9#^>e(6ȣ۟~1_A[Cumż,xFʺA7AQ\-dt;|)w8&QC3׎x^˨h7cK&X)z\ݮqC\Ӡ?z^V#BֽѼ fBy9fO'F:W 0Z+.yjz˞i⟃^#Ctjim`AVF[d{g|VgYxXr2m*q# )mx͊?g$L9=}"PP::0 ZQFhiGJ^RCI@I}ؠqրl>8J1I z0 q(NM!nvR)QEjâڥc ;B$~+ 7ZIͨj7=XvLW?ej7PH * G׊xB޹s_(@::Cb+ρ^$Ll99fh)JW`襢 0)(|e>47wpIi~qЄy;|ָoٿAf{oQ,R5D8$WZ-t+Ke9ڃ>O,}hviqM!# ľO|N>t:-Xt(ǿ?Ҕnfrғ |q}qQ=b=?ۂ%kFG )+1PeI>~L+g4. to\Ot/Z+ZQ6 Ɏ8t}H484® ?±@QHsI8R4%;8QIE!uM&J҃ⓚ)@`KڎԄ`:` =;=m>+j:Զ )WWDq؈/Ѐ} o\I=Ės71__hY2-#~Gb*4ҜO=|YR6J2cΧz֧|+oD%'qe;0}=O׌b4}0qޜ@oW+$EvFUoBG~`ݼڏl#%I4 =J^l 8#"ƪyKҌyP[Sr}h-rGZ@zxd|j(UȥI^ؤiǸqRTc8gZMؤߓN\I 7u;$d$042Xzx"&n@?wlmH@9Ss(Ri/;(=(UɐlqH41e9(#(ĶJ!+fw8P0^,!3׷}kY o&DE,Yg7OP=*+ǹQ [q1=@]+s: Lњ|[*mb,3C|=By8u/7qa"$\g#zgKN5Wptm є?S˻SOy7_ x^uVǘ}?^ȃJ—-9 I85~#mƫqq!>辧u𷄡eauEhҊ(P)h4 CIKH:ҊCH(MF*6R/3J܊BiU KH@Sq.s5/"Sb*6vy" Mv|C8U$) \(4EwOm_ Nn-_#QI3G4sIKKE 0iƌbP4+OZWmSG;;$8f𧌅RB0$>ѿv 584?"y41TBUFI' xZЃv4E?ӯC [P5{/5.>ZSҐts&B'!lglB!dz0% ;Xӧfn\2%ޣzBbĎzc=OhV "نݏGNU>FӍ.--EW!sH*>M9gA|=1ĺuyv)hGKqEj~M=rO")K}b: NNq3OZYhzLu27*~ztOZ-|{oIalyy7q^1ώorjw+'n$Vtv!9/DYdXnk>hN潃tOsb 06Z2zpp} rk寊,~"|?,v)z &1:FBGPOqܩ3xo GHHQFY^sⴶֿ >9en [t|AgM8&ipFF>ۥQ|̺;zFFOA,D')m5u@Rh.A{]婎~|Uf|Nw A8(Z_ 5O7< !距%LDx!9Sz>%aM6H{wj?Sj>&_F8;Yt &8 00>oԬԮ$Ӯ5AfE ~&Mm%+Yy|<5UUO!A䓃Ϧ._[jr}xTEޞf%.<|Fג99@1&IR}q +㗉|=;z#"2dxqzYkyIrdTZzV{X*υ?ixVG{hF+z.zU`zsֽC}<5+H(|u;^c6VVWM&ACݷ!=;dg)Ǭ+^YrGEfxc4pHbM'GkY]R4fc7|E{Ѥhَ'=O]o1mlKxM}[QER⒊(H4R\qnSX^%g =*Ag]?dn}B ( y.O\ԟa\An!wW)qaumyc͝W.' =Aj&QEތь ?ZPҗT/A{uy\(ɧ"?`h''9 (ҵcŞNG{u`(ɥgXAֿ}hОOC'Mv>ͮlbKA99$I hrtY|CZm2y"t!rWyok˔RF #rUsՃn8?\{5՝w 4TzzWF~"jreY0Fآ\}>8k0sҚ1~U4|-mK)d6|*<dd ]NKP12O=Są]dPqRG;}kꏄ&u Egeͤ Upù ryy}eg]B7qX O7į(m\in&%"mcJLtiK9D&8[#TXo^8v2)3Fi:SIF9F1A\y1^G;'FbCAJG|T-J~49RҚrM;RM3K旀:Q ɤ4tϥ)3Ja;ښM79tJ˺WiJW\c4A RN8IѸӹ5s4S⦤(H21E(<]wUts1.)—8ӳP /ѤH]A PA+';놟ۘAq"/ |7 D?& a_ r^_08B7JO-cM[)C!5οi{]iu6ǹ5js;ּW.6ZN;IbH8^Zy7o [c ^s(nu2JTuу# )#TWWPY[=̫(2ǁ^oj/9;%9 g9λ@lu+j=)((Z){Rg3Hh4+EOHFzmVNol4EPI|ek7p0Fی`أ#&6ogkH`]38=s%J \k~,G{Ηc+9Aᇠ=p },8QE!b 0i< 裰m.W{Ey 1.}yEY3)ntt!mτ|Gq-ǟ$1F2YY:u':׷|;~9r]Ĺeb#u^yc? ,Q؈/  %cQ;+˴=hƷy%۳Dc }*GMbXu5?gArQ֬2=cq) m4RQEqFE51Nw4dR`P9Ei)å7v n)1N z`f(o]o|$o\|Usckc;G>ODVWPC)*{ Y.nXAf?'ڼQuhtGADl+ۮ]e?z w2H0a X#)KP*2 L(''v]^åV<ېTԃnE>x=[6f=demw^h^IJCOq)$tq5d{l2n?=AV'ynyܡ%{EѴK{BKR0A $کj:nvwx&3±c y%HAo.KP1U;{Y>:^txcdRF{d?o_t Z\x[rv%ICrxֵO>4溛Z|W";Yi ^;/ glm\q&{=2+ _MYotɉ[Rk{÷~tmX4BdWSsr+jǍ1ekCڍ$1ggRߟjo]Wo5ޟjKD9XGlz_LTv5>4-]IHwI4 %'!O .ln$@+ #X x[G4Aw;o3[ұ|Sx~GPeW_Gz_sE[׻c4bv֕Uu ~*kK;N\^o i-}91 C,s'A[$ Sp{R_M<Si3H7f+)\);y$6F%x0ƜQ֐u4xK{@2i4F)(F;fxM]*-T@f y) 7xFh#Mզ# 4 p?mߌߌ\ћz|5:e[^>ͭvᇡJ-_|=s\}{#E>ZGTǁ'ww~]̍u<}јUϾkӬa3$9T  o]Fc`1FO^5oĺwŭDoѦDdF<j_Fi:OnPl]q} ZxlGrS>ڸ?wm;\V9d=G"07FCzS]+H,=N~RjP(84RQFhh>(&/ZHѹ84QEbxmC3OV1yGߪڝVw(KseUzױgq_`־8x{M1<V]'i#xɯ3EQE.(FM!u+gPg?ݵ4q"}Y~*keoۿJ/ٽ]]o 7mmcm{<MyQ>_<|[ s6&jU#{B6ֹfw5Ԙ4#OE8`#pg> #7?씔AH X6x8`I4IP)xiTEpӇSr)wvҠ M4F:Q֍Z9=(,9%bV L}EqZwpvm9)SO\SݧõJCi@qFqHpiWnrzё/4RsN{H=)i@*18A֕4څ!4m(RRdfdbt2qHQh8ǽ'8J` Iݢ97U+\fwe۞ϥ"j|@0ў#3^閺EYDz5}IjN(* [;iRi{#@ SxsJw7iGSAPE&.:bRn&JB4qG&M(;4( S x>ƌƞ0 iR@8`nӶ⑍4 ӛ4њR2h4qH9a֔IѰ:P@QhlSA=+~<6wwW֏:DcfSsq"bOm0Wx"? ~al37 <У^qҐ {Ӎ6!$wx fܚ^RFA K{c Tȡ2վx/Ry~g[Alx[''tOsxqxFCA5W:_ >8>IwDiOn]~u$i,m2=ATh!~U~klmXeC ʰ^Ƭ3M4QGZ1F)(yzPhkF(Gj(Ɵ5+ďo)^C!Al$(y%N18rk5K[ kζXI}WWaԛ^#Ke1x39rFz Nr=s4QEfќEyſ^mgDrg ĺ]UQ?P>:{3,_8yW8ҽH4Kp]J @&Um#^cϊm[FFU_%N Jy=\h+&i+Ѯ%&#F#n99exg~* hk1 *nP8sڽ"Gmu5ԋ`2Gu(=i)E!SݚJp&/JHUϩR|qږR`fҎI +.~jm8VvhVF=!(flғځI1Uq=.aJȽis5 ^wZ%oJ#ЏBzOiN,w"JU_US~ xTYt3ͥ)?{׆4 ?:TNarHǫ1O[#7O)Zo,4ȩH n*gguMoZuUڷQ +6Gl/8kGњiE8tZx9H4T7"PizS#BR#3xU_|[]q푕Ͻy'¯>Rjr:q3yc$Q6qzsx㯃 NmRFq`G_=_ĚuUܙV+6Gl#ƽ@&;op)pVQ:#%8;s^6mo *( S-5[|m= Ƽ.-Wp|A9ViY%՜~B;GbsK֒^fEЧ4 s@ SIE(R)N@y$Қ!>0qHIP{u]%l,ynkXդnB;GqE!P 8t~@y4ޣU-CVt_j뉖1RAymq)>I&!R4jlۥ^+dSq޾ty4ZjNK?yP\W\hRK0HMx&D?x"ߛϩE-iH1C*91Ȧ9;isKRQA 39,EeEQpPk˖լ'C+fP{ֈxn4Y.Z +LyPl9 nAs9 OT[Dc0W27^wg 1^E_ ]|n'c9[;H1:w:~YnI_? 5|Tq#{ FY5(_ד:}<"@H. 2}K}*|y+?y5[MHmb2dv+}g^/UҬ;y܈,arzG$m4ϴYvwJU#㶨|8x/XMn'EMo6K[vgzNgzR<)4iv6^$[cFnrF־itk2Go*ȹ$U0yQ\&>j]7n9@Gz vM#iJxסĉK( vzӆ1J4`P@ sL9&o)1J;ҊP&њf3AS3((׫RkģzP\mp:߁ך9X,ub. 51n3 ykj9ue!Nz:>բ=.WH|R G ' +@')7bujiƃfu]KkX^iX d}|ԫώ&vltg+dGߐ_ͱgN.-ϧ+ |s/~,y3Eo$͹u۸ʟ8qҎ~4u[Fx$(- miY+{(R s.?O_3Zڤdbxϗ2C#z忉|9aکX'%BAkNȤ(JOzC&s(88FޞGȧ֜9jg5^v@bW3D`l>Tuk$;7O UT /Zvfy]COԭ!$.99|}ؙ%8?ލZͣ糣}>VЩiisKCsB<@QNȠax4P߈mH *oKpV5{wv^mkk2+F9$pkyjqhzXjH")cnr{^ҌLdKҁތ N)GJ\PzQ)63H~R)@8nM*IJ)ZzZ))/40?Om^݊=FGP̄^b _L]I?3N# ޾cb>=BFB'_N0G0~j=jDRȠ)9F+O x8*% @)GAp+spbu;T<٭_J3RմtndIapڦhyHKpd{+|oV/01Te^Qٛp;s@})3C{P1$`MUlM:p&ARAS^/EF+-V!}τ&׃;9ސϫ{Wvn6MI+^Y#qFW3Ϭz"FZF?]ύSk:xwVIcQLQYܫvS&)ƒҐPFE \tj4(KEJC.>Z1F(!UVfv$F(4&OjAh=AAKڒsv>I5k <$|HLT;::xq?şC^_𡣻[,@iC0nrJ_DS y4jH$zRA6K6>6U+gb8= OnHI!@4^tvigV#jAh.(pit \_gdVK9{Sg5mwt9ސrX]()r*+hnxgdAAƉx;P֙v.;#D|Wzz֌QHi@b84ɯHa-I-„ǶY.\wHGVy YrV?gE UD?nœo-sm{)RS&^=Kڗn)|٨.$}2Gca{4O_{˥wO(!AUqq^9jhxJ-GrbD8 A^-fms.v3Z uY3K"u2T.) P|M8ғM$֛4Xs\ĸ? |D-؇!<=t.!`1{Dx׊x'#%%l獅s]v6jmYk(K::n1k ̖Y>|֣/?̿?f OJTWVZ[qo*x@ЃAx Kr$muznigAglv(#w6O=Ͼ1ZvPPC+߯٭޾Su++kۛmn1B)G/x=)^aOs3ejڴ9ް$~~(FsJO0Cyo%k$2 20}SG|OKv{2pr3g=Bi@|d$#޶GNIQM{R揥.8HJ #ri( kφ<ͭkz-Kn~bbʽm_I(ZO#ֶ~'Ax}i#KF^wjҵ 3 ֖̀1CPiJIQ8FҌQ\qIEydR&piI(7 nHH4r{{bCrMxG~o$_c3 -l~T8)5_7؝u Wk捫xTS9x`wn2\{@@w8t;'=k#^5ňY?w7-TB$ň(?0}?QaTk3Zɍ-r)=O?W:Ï dIMHf# G9]uqi[G q+I?rՕ?c\\^v s5A 9K(ږJCJ($RzqF1޸LvKvϠo+)zoV_^3֎qG9)bi9og⏉:߉5DIL[&9ĒC==znṴx}R3?O)wgǤkD±)ǚ}0א3;|?83 QگE-'9J)zяzLQE((RETJp/z\J(+ QQ`>P>^q֭E!8J' cxV^.֋|E:(7p>)~#3CHf.3MnV^Pޟ}/~=ymbo%,A ~Uy 5Mb{Fr'CC@zFI>sCqҀGq1H4h1@1CUz1֎_i-]Nv+|%h˩]8۟,/N̞hzQ.&Ԏ*2:FeaG};^ gco࿉Ao{*2_Py#۵vCESA4fSP:s^scƏyD`VU?y &⏊|l4?6RtC8k_ƟtHS8y Gz) vN~okCǗR0e[B-Sڕ_#2+r~YUi(*uzeAN ձ]$r)9CCҼwKN8ܫcA1ň86㩯Y_]*Dyv3?&u(=2 45~])wgҠ{K[yѢ669K@[v۝Et*Xgˣxv &P(ƺ u|C/^5 Io 8`WZ21J1FF M ?OËȷտw5K?MɈ@)۰ck3þ![#JVw)9I$זgċ9nNx8?,s8^q^Ust/5 dzղef'Apzp)xr~k1ז2fʐ5o_KiP?ݖ#E8ܱF~bN>㎼b4{(kx8@?9N+I9=i iSz p'(?vOSJC^eύ:7LmSS,h#ٟ_Vq .i~+QNF}V< G°jk6my ?1Xcig} ciYwesŴtrᕇ9^R@aރ7DXd{^ujw#U+Mu>M؊d=G/r1&yM/8qO"xE!H ƾ $S\[i79<{v^%:1)ݖ)cԼ_ˢxjh'.vC1G|(Gz߹tk>/VGqBW1!ҌюfIgqF)qHN)h)ޝ NM&ON3KivRtxTBQTҧ2gz})W5l-v-8 l)O}o.%Eњ7;{X{`z$zڎF?j9`+dks* !Ry@o}k%rXAyT0##g5Z $kyZ)p1Fr:pE}b i1M$pE%š? xvXԜbT\nD_s'xZ|D빟V ibG٥cwJqK7wd4P}X7}sv׈hƛ!kyוoñGxIٞW;x$u?/ x6=!VV[2>sJiq1J){SA_{'y{ZmnN7 {ŏg|CnJ4NmmNYxKMmY^R+/I QvYT zJLSJ((Z4uQE;(4QP[[surI^░ݨьTRΖ<=i@ I =HKi qF)€sN)\OxQ `y֌0T0 ş|9>-Z ,HuN;ğu@-7dc, dPM7oվ+%<;xnY9܇\Rg4c4Rc^iiMnhQNHhR X~2A^D&fMOxY$WWgF,%Ik/ 4H|3mQ_ާ S⌏<1#7kZVx1XbAQ =x=jMrBP+ */'s_FҒHWўwci<ٮC` B_knc>!~>xVh-Zix3-4o^kZna{ ݫ&A< 7fIK)4)8N bkO3ŧQ^%GOa?bH.TW$N榸XZ䛨}^:W7 i~4Mes#W?\c3JE!4 3NNթQPi3ڌZ3ڝڢhy$HAyQIXIIs's'<`jDxԫ+  Z& (#*I#& d(< B֑b;TxizPYUN O=BiBc!C q"_iM句͆3^^Y,+Ծ2 ~٪\(YmzAsԁAS+})iERQL^zߴh.v';YUUc7E|9 A#tsy'Pk63i9Ex<7<JS$4 8Gu$rlN2_Cx_h - 4ǽtGcR^`v^"ӚWٹ"ꧪq^}') sĂ߭w;#mZ}3+~ ڎwxH}G:ž23:zS9_o~^fxREQIJ:IQIJ:i(4f:ъ+׎htJ[Z@yu('GR@?5k~/jkk`lŏ9( ZCLwD>Rh/!s*֔)KHM/j(n(ZSIsA94m h\ӨHiqLvH՝*(3=Myψyq/WAm.isKMj@)qk k2@#c~aW#UӒH&I-^9YN#dπ5Yo]LPZKo,RHxg j[6H1Uw#rf𗌾LՏvĕG?^ې8M)8RF '@h˚)G TxaɠQ;]اQ)8hni>Gz;Y L\ iP?)vIh Hxnmo~F+1V[a ;vG"be'Go29KQQRw'4ӚSJ)PϴP◩.1H"ӱA@4dHy$uDQ,y[KhxpN~8m'x\$n0U}k/2oY5ki&n)4JlTC cߎ'mS @bDAs`$a>iFg`>w` x+)g@ɥ fR\OB}5;;u}jXm&ę $l{⯃K0tm9 FgϷO~I%f]"3c'9? }d1@L◨)杌QF@qLmd Q`9|A#WhmdUvʤ9R(# wSѾ[C$N-lR,h㌰cS:6S4~2֡x49H#9HP,~ J:Sӗ (BrMFh!hY $¾e_X]IiZ>|e4]-XuInH6L@*< |}"8bQ7XnaR+06IA8.0)ebRIF  !`)N( rF~aC/9RCMb&E494Z^)Sqhb_^(M%;$^ woâNKCtcpsp1yf-gI42Los>z}*q-u.-ϻՑ?s94Q 6j)Ӊ;R7J|Suk]_JcFG[6p4}w|eĖN G@ r -7:QKB3L(-!3@ZqIE63GJQKE7H.|e|=Y{ǾmͷNxL^1p=xWSMdOiϷTNsǨWּ?-Ѧ~,҃{c+ HP ZCȥjEe'JMQHh"g9JJW?75 c֥\Z(mד,6%*k5_$uGNFnL?{b(_ O%џiiZ~3׷xOzoum1䣣7UzEg4c4QEai6Fv{:(\$t;ȸA iw+|1 zFӓ3J;{pVo|wf+=~3ek{D;i8+]4i{S ohKMf#Ul]A6qjB7cڟmJ(<`To*r]dCSކ4@aN@o98P)dсJ>0E0'ojF{Ӏ4dQJiM5iWF>2DUFK1^{j"Zezʮ# yX ԑiAɧqMn)'$PG4}j m-c1vyj^4?d'''>Zh\|f3=f;M<7׃ӚGpעZu~ߐ?ZL|M=iju~vY1$WxOZ_tH*6/$^W=YocJn9lis@}7kUbug4 è,AkĿg-f#hSGv1+p {C^wGwt 4XsKړrƗ3IJRJ)(Rr')NEƭ3R+ &pzzՊrezXuŭh$eaE{_GxHU.3XuVG_hWS,q Wp;j~_mҍCx/1SVC?><$IX${Xnx#dW;8⚝HO*iMcj:c%܁"A=MyƫWȷS?uz? Fѭ4[mh]sM_)ɥqF )Aޜ86^ƾ!|5M4Si "҃A4 [)M=iqQ-'z 4jBx2§.7ǚ==];֐zJ)i9vE]]5ՏyM}?fkpiezIPh|ܥĶZw}(dϺc"c@UU xqF8M#4اCxD_}^x%y':G)ܥ;+ '_>oxidڥ #\=H| qn&f-Dl!I$Rx>۷-p%1Mw<}zq،׮,ׅԭCv3c!vA1]dk<ɔ~e2=Gz5Dg'#;A$>פ\ymŴ$R B*LSsC @3C0\fFi16HsJ()RڛEbC-%QH@Ѓ0?g_ܴIXPLzk B]Xٽۛ:{)Up)ԄE(ӱM4QE!Ƞ\f>(xX V57|^iooZZ}m!Eas}c5}q4 IAڼ bRWn牼Oͺb02΁X0_|uowşx^A V1,7K<)A⿃/K-i^>E f}7uj5|0Yt>vF(.(&{QSy-r}m+E-iNR 7GT>x+L|eKhiz rO|3iޜӔ=7)Q^'R|Gn&m=ovv,zWW{f >&cyGtm*-, =զG+J2)h=3JFܚqRuQӭ##QL"J~x/_jp)>l4dE]~d@|}/IKգgsyuG"ẁ'HnV^AaPUsNczi:hER=yRsN|W+fVF)r#w$:20x*D=wy³7"MK;h "cG+5R1xQ; ֔68⑨(Qy4L҃qB92v|KN1IT5n{YV#8r)^'5l bI?y>p0=ssFXZďsoZ-+mr >+ϔ2rziԎ >&q֐qMߓJvk?X-4[&p }=-Sǚf0i1V1=X:mfq^'(4wj]٣/ji)h425qKMR.u fvd1+g{C5 ` rp}H^]Xmt3]yƔFR|V+ >uo Yx~(5KV):1JgoCNz+>TG)@?xG-Wwq6^c,w9=p z-ieockk1*N)9hҐ4n86xgE.1Kgʜ2U<杜Qњ LA$S[%a־zLK-~FFy|{,2yߴ6?hpF~9qƽKc؉ygrwmWfx@BޚJJl=H3#}9(ѻqJR=h SpM)!84)Mn֑v=/җ9~Soo6[> l\G`U:p1I|Cx[A4Sog78%yNOLW|8<>XnYof>mѤAJ*Zoky&8W:3 <,uc>iY-ͤƇ!"書RNJJ(ZCH)M4/zu R R,O&%-֝R= -F(mxKpıٳuZG] ܡGS?k~&vS¶[GMyp@ U,I8 c|3x_L7;dFsrբUB4vLњ  +K}2bXĂH۟ VyREחIM Lޕ%YڋzO$蹬mSZ/kVrG=«I^KiZՅ'ʆY9Z@cҗ)F*VYUHTmc@qH'ڛ+9F)p 1^ԧ344QK7&4n484%K(hi(bG Ҝb;^)((8+M ;9өzqMTIrys+ab5 }zwknuvC2Eӯ* DP-uIE;AHxGX@-mrI_a}+"OQ[pd|3%݁=ѽR>-xƖ$Q- 60<`?]fI59K8$1Y~td6~d?{֡^sKQނi3ZJJCE-F(CHiG4bQ@ɠ.IQ3GZ8Z:E%[Q, ,Hnex@޼..VHQ@yֻ xÞG.Ib^F'Ê訢$u*OJCڝ4QҊ;P+O У6m ?v ߅.utзNTP0P}+>/oxUE46r2 yσI55jw5Vy#nHLzk^y Xy7@#1ysǷ4j,_SJ4;=8);$coz)6v$ \q@4>juO4ԣA֑ CwkoZ=K,.0ySY9[G\#]懮^}bE"~d?{֥!cqP '4nIfAғ.qK֚V4"1ڢ64cfQrwR4\c5^ݿTVy=*`Җ P(/=xiݓE!怴ڌ @+=rOjađ1h?{@)ƒM&ri{JvS81H4)R,8 xk ^"?4s}J u!9Ԕ"\)h) (n)&IEQQ4'z$qI( s֟Z)(J( )@jC@q?~1M/uVK62"*(uNzC!=?n) ׀~ҰL[w&.[g {m͑Sm4 $[zm V]܊F^GlInF)f(p(SNim(/Jxaniv:R&wqHIN搃Gj)2O>M&1_Kn>jSҒdw? K*#6掔nZ|W!^*ujҙ.XHdoNnyvރn)mQҐ?4eI&0 JFi@⛎ iKJF &њ{x`xgdd^qZ/ƭH?7}ú\xĶ~ #A V9?Zt&v Чp;!4GzVfoz(RHz `Q(`nPNi1KHO4S6x4IE!<֜Ni>AhRFLf※v)XwbRҔ)NqHqw:f|˦;da}[}z;žn5QDHF}O*ғh &}iRb4RqHM*ښ9B?JsNSed(wG+|)ߥE!&/wrrJaB<[=,3N= {o<i_ Ǧ[>e1?5F)>Ԋ)֢ jL9#qWZ^uɦ:qNiN="iƔi4eX`"~t&tXw>z꾣ӦYo l79L'_𮒓Fi2qUc4bR>npx)4B`pM=iJ0PkgwH3N03Ӛi< u!.;OF9?wif OM$摘ӐJVE$I4E2P\#Kzd p4'5x'E-$vI4c'?Lw5o |:.oZaw\Q\̸cW6]\qm(8eaEXcP/)4x6"[vxQҖҚ҂C848HiSP0sJ1ސ3C*FX` + B-5Ub^@P>F()h9F)HqHLp4sIiqINih3I֑@6=\7|!4U1ܡH$>sDŽd?RaRC{7+ JMHhRg\њ:ѷހ1KC֊biFFh46QKQQF(QN4 ҃ERjʐG4(4 $מGз?v4/?Ӯׅ% -ER4P8 0RuvXEH"YO_Г5z_yVak)Cө"j `hi/4αĊY@I=y| r263(@{kr =Mwsqrq~~(xYxc58"o.N1 NsԚ^gEa)pTp~'ֽ//49KsJhKdGo 3q }s*ёO$@ދꮻþ-\KvA\}:Kz3>꺖?@XkK:\riHE#:=>{onU[,@`zҼ#Qx}KL>uneUl,0bp9QU#y418"NsAP )isg"9K jM?֐:f){R zښ:]3jUxͩic˼sļyz7gdniywJv$oqieNzzCikޖg>ɯ3 TVڭ8)np0+_ ɼ* 6.\fq;vJRsҚ=wҟ94Z^q֚O(VGyM"i}ipiyZJZ(&E8JAKM=h}iӆ=i‚)(JNE4S֣+XyXAv8W^?nEdn1i=AzUY۽ċ1+_˫y m\x~۾;8沽PGnG'[\ KIEhFpA48h)ԙ#4bxE.zJH '}Hi=]SgWMeJ_"#ҽ>4ѼoFB Ht]ӻRQGz;QEs(f _Hfߊ4{mtAj_Ě-YPDr(&e~g\&AQPXҎER)F):QHhE(bh׊/8/1%?!;mbC Rx'jrq$P)2G4#Gc !)A:?15MV\\ʱC;yj^6F9sx~@`<وժ(V)8@8;9GjcPr1F9xm'z 98.(Azk>5ke?d љv*\7º+4[$PKap 7u]Igd2a$N@$|M'ks*NbL8ZҘųֹxN-j6K7ˏ}{rygbM'XzC:wf`S"QiM9Z94ێilRH3JxE*s RsL4P9aJݦьӻR.wPs^/Fh]xcKcX4r܊3G[K͞q>$wK.& YQwH'>9?Zlif8G2JBǦ+gkK#"(cH0>&3A88v)$ԘR Y.neXeo=O,d8< yhf!]6 AZi"4n 25":<rX۴'?Ž>sY☿A8'#qK~"gí;dA) ]:-{c}iM9cԧ RyAJJoSCi6Zk b"J]LG*8~(Q|ʣw 2/\Fj9ن941\!wh+A/?O|_-NYb'U?o]wW6vO6!y%I=xEh7/jjtF >WǏGZ\hY̋~'NM{zT17:.gf^.yGşpxKxY䳍.U^ 弙9*ɜA=c~ľҵD][|0̃4JIޝA4RiRiؤ(E&ihkRJM/;Ҋ^ƚ+)%A{}o=ԫ(2&Pg>ނoͽQ#r'Lŗqy4T !T8,=i|yƕ.T']h_$; rﻞW~A=NYā IC_Xg;ёE(G_[s~`?C?rZo)}#)<Hh!Iau7OA!"ъ>b=ZGAk#8P%Tg8W|[?ͨH!aE1r93kjZQ=T00@C!ppWp+ƾ6ZA|P55+Ds?3 z }v3A\iE!qKLg)yGJCF8Zi\?E \iL;a5 g؂A5_@gĺ$d`v>tڴ5ڎ緺bmIG"4Q{;ukǂyD۫_|YȌt\?Ϩ]GQQKs^o,Q yXǩkдE[kH:ԚzR ZZSM҂9SI )rOJM٧rE+dɨqʤ 8\L(z\zRfHZC@^/¿K9|*4^Qo!^˪h3_ʲ *FAxUÿ /nCu}"a˜b uh]G;szJFހ 5O k+?t?xfڿ1;zW#$28 S]&4N)) HN\q4b`R) Ҙd (”ҟLvjE\a&Bv%ĸ=@._?J @Ӽ1pV (',YrMju(y‚II=/mc~\{ aO!p)l]GSlPAݏy܏UؙO=O -'IѬ=9fjR)G 0ǽc6(S=()I5IšP4qR`RqG?JC&LU_@9:RR&{ӲF0:nsޔ Ok}z1vzooW|S-22:B\$g0l\Lp=+ռ=o |=mmsxk׏{HdڼoS|+~"Eo1R]t˿'?׈nu_ i3JNp 8_6~B#__L)ϡv_=u+/ټҥv@]qJ>MiҊ 7dPcO4sMqAiH4sN(= 0xR).)P1K(4'+@:iY5ܛ#^Xמ(ռ#16?fi٭{#^I=X/ ÑiŌ[-f$Hb}vOJ/ӵK9XT:< v h:=֩L[F^G?;+gt^"%P"|,Xq08ھ)NQFh74sIM柌2ix"yIFq_#W.<3\ uO9p}A+H[VsE+IjTX'qw grΑ}cKN&l`c@3I_4mHңY&`~T*):6=ϥ}`9QE!p4QAb5^.ls(Q+=O5i,cI;iVHdV^=P)sH@=kiu/gЖZkȃiHm ٛLJ%ѴxGڞ$Yc \96ִZF-ݨd`>@ t#z#OGŘ56Fѳq#nW SS)isM<48R%REiekI?kIQ(fY%qʻN~]khlb" h0`=1Oj.qIE;6msL(M/'Nԣi, zkmnKiVH\e]NAA Hɠ HOˁH \֔4 8nM.)A;M*7ұJe?- qw*ꑃ sAH94`SqN)ojq"m/A5[jnᎾIqޖPJO4Ru4nh(HihsM ޜ=xF 3G;66VP>|`rV55*(_61dztG^d_ x;?`>Iʕ,r#'Cx 4Y5EXm!e{;WxKe~6WPYfWi| ܰgs+iH(ژxVܠъ3@o4y 4AKFi qA撃qoˊ8Gݥ ҅3N8ڀpu~D36X@}Mpz~L޻Ea pSGKkX(PaUjJic-IԢmnScчQ^quV[Hr'ðuot«[soj\ JvƇf}+1;ZugɈd<MLҁ78ESNAqKڐuc>ax/cySHe[Ӑp2 y \kHIe>?Y7+ \?bto=!%lcs7sV4RQGPA& ;:iY5{8d>מ#vH |>uz>Z)ui xۨЎƬv\o?s1$k g/"I3z=wZ?!>c9W  W!= LGd@`p'?ɯ<>G ZD&X F@[5ڀzb;GZBM&k>"b|te5p0c##y`q\ A"o ,B.tہ];/i9iۛ \!$q3\^KE9V/1'q;<ъ)[$Pwc@?|̉O0 v: AHy$א;hZKgk>?OxIe`,Ycg8'؞_E6z93Bsp^xR pAK;{x8cU%:RQ\'ſI ys,=^]߂^/OxWFQ*FwSdrt-7ּ!qf D 7@>`;c<׏񧆦QbڦV9l3޽iŽh(47ZɠуIJw);i4giffZwZh4iN0;wH$g]fַi8}A?}W:83xd_FXףdV"oB;޽iy4bzPqސON(!O4p: i'u(HFzR 4m>ҙZ*38߰u eqj?(iqNoAҐ [R|iwB3Nc#tҐcvګ_rvd`\> 8R3zi%Q^C~ٺbȊ~b _B[bcqy5Zh>eÃB:>޸+F?/m?uGe$zM1[[0\7.CRZ\߽yyO9 9nPڑ3[dయT4dt<(&P Q1K@#48p袐J('4"z(Gj4Z0J3N4ڕIJ{{C^msiUUH?ލZ,ͫ82~d>kK9E kP8!'%*qq?lM>6tj=y''5/ע7.z正I1qѥ|qёӞ/jAKE} %W_pDҶ=d*^[xZ_:~hʙ,K6=@iv ߎqq_>ibt?hq}{3GN@7>A,I"`ڝE-!/z7Ӂ4d 85x |-eNU^i77U#Iz$qc ׳{k翌O ڜݢiب2O>%EѶ[=?oAZt xc[w09 Glz/C*F*aNR8:/^ xj}¦ c*2o-o *Nu"h^GsU$x/7~#d]bI79 HiA4w~c4r;у֗8(&u6sB4iæ)fKCґG4i ֘^JSlFGmd=7]CO-^ ?=yu_>3i9=чcVi G~CWq.iu+@9(J:R)Iq4Niɨkxi˃փqK(aӇ"niO4 Sf'N H5猼xOx")dr

Hk.Cvuq!ܨ}>誑Ɗ 06Hٜ! )͌ U&MR֎M"S:.i@NIڐ@91 4#c(<ќ +S␚n3A:8)#}$v"}8]mˍkؽaoO=yD=ϑ^z͒Z><2Њy$R)3HN([(F-֤ .=)(]UI8SOc]"3Ci@+I :RӀQɥ< oV5Ph1b - }ݿýsֹunw,oI}NTP0SW.-r4<ʲ f_| g?xN~(o..BF#98?\|6\JNbz+b4J BNiݩ1iOzRvjI柚\QE%:qKM4 ;qRp:ёA%QEM (eG8< c4cށ֗Esm ݼ\FD 24tmG4v.;q]EiAIOER-&99朴-2XX7GRpkOk{x6rNNݹ11>W< ?-xq9^ddh R6mfR )x+T*RKHi3EsL8e~'5gpj@.HHƍRsj83;4-O4buIȣ#֌zQh1IzF柰JxQ)zP'j;Xo-dAFEyj^ ƥ;=894-~_`;&_QZݩi7vi!JyJ:P!4Rp_ J:P=) Px hS'(@9Ԙ9<qr+|:4mifVKSxg];ްՏ?U t\r)Y))wb54)T'zv:6i{P:Q%) 49JGqKڐ6iIIQ sI9RLwgڤ 3G\}h~1*/&5xA!QPq@>ݥ1,0{כfLj{LpK g*4M~^lĐQkOR=i A=Kc`p($0E;8wSґO4/Gi? ^w+dEH H־wt|iWյeb򑿻`q RM_~<>*/?u]W+CfE4`we$k84$9S0u.[$d4ǥ5 &ќR#&CN=kWce#__S x>IްI'w^/FO=3P@̶ׅ STƺ Zᦖ - .UM'#؃ZZGΙhyrݞzJ뱷KI'"K(ɥhi0@⌞qEfL⎴QGLrT'Lg"j1FQF}h'=))N?J^N{~.vu<cK!aDrÏӽbM'mGVKF<o?߈2pMF=n!A i"2:FeaG:1w۱lEtUE) iAf8Q\ϋ[{<΋+ɣu=Gݡ}qusboҽ#~<f`H nd;KHid9{GZ1KڛRѓ\wd,,/O=*ž 1H 1Nsy[۷קsi&G'@sQE(PzoZp⒎қ@=Iȣ(M&Jp84ZɣNi֔(0I<P$ӲiGzr>ZBHL#6DWGYXd{{×w2LC}WZ7m~aC/_xf7$S(#gտף|+q]ޑ9[}zvi` isN)JAQIGSҢg"OjNRCgI֌S#1I)Xќ(ҞE7RbMIO S1 HT8RiT֔xc&TWXdEy ^kfS=]gտvRi0jY:UΛ ksH۸?Ȏ"ߍ!y}e '@+?ԑծ:V׀Q_Fw$1;&y4E G4cMԢ4gFxQHPW]ץQ *+|_ ݭhA2HUʓBOΰi:v#c'򮗶h.v0_`ӺQցҊ*rh u먋 @ cZ}{3z nK)!l?01^)5>b`2 G ._Lo$8x$44qy!-dt;|)[K±ߨ㰛{۫)h(Y^Ԡ`RE)hTp)}%s@`z^Ƙҟ\c$+Cc$v4I?ž_cҕood<{^ 9cdz$74QփZ~EF.&@4LZSҘXRx ֗&)P=ĊARMxNz֏<#yxK2Q8h8@"H0zPX2H5lNB^<妑H`!Kڀ;) s.j7r-$WSN $b` uIRsKIMl*1@⡶g~gҜP#&2;hOoz🄢]]^JҎSW4c * &P{Q 0MTr0$>朧RFON!Ү旨44ќR vSJ7bۨ')2ƔqH[S ca'4GlQFYkμAk~CWh%Y׃/ҺO xNB͓l>yqJUR!E oS)'ANdV^hap*&,%Xޝ( dRn+)må7Jd$D!\֟iM#+@ޔni9fb!j4q\ď7<ydmt>lw+~|#oS#vhW8rpH +o v3 O=+Y8 uCҠNK>cO< #e "{NG@+IӺi&riH7(c(Ep(k:'CᏂNs=[j[lu_ofW^z(M4n5\M4yqFRU TpZکX y!.*:3(4fH8.&ih!F[{of Wҧt)-.Xmidv(s^U6C# Hvg%=+ (*G4)0I4FE!)x\>kdI؁t qX}s^u|<7kOqݛ;I%)@~Pv<#/U>m{h$\p0>dm>{VLRDqLq^=㾝kjٲBX k~P r*|zʵXׯe?gQH 1֝r)1(#` )h)JiZz~ @$յKK|Dʅ++NVuZ{݀ u4[M" p7uߍ'GGyvoExsvbKV;4M c>3yL歃MNRo%K)|BaiP#\g_g-|EY[^Cግqg~VO|qaqkimrWv'pN8xu'&i~&<{.Qs/q{z1IЊv~n:S%H)BSzRcRti8zS(4PGGRMTN8O/ZB 4py4sH>#8zQփMSJH":W#{b嗠T|1 ciZhCfֻ<7Z7N  'SK4zS 9d )S'+84'Ӛw#&Њ J:҇>j+{cs;+5]gP~4!ms7OOxv@.~b9>{V)PN:qJ9 ъ83f6H(&A9ZB * 6KM0ӭFKJ"Ҝ ;ri9qKG )L ?3'4(=8 Bi@m0)x⼏F K}B7u`?j6M -U?rDXs5ٗ7s$ yp{׆1-kX6NI!F1԰-1yl%Դri眪}=r>.|M1XiY`]& ~@:׸x#6^ :MG=(>水z84% SR~":;IU 8eqQYp(JBFIGj@ihC\NynE<; d^o9&O[i4esU C·[^H(#>jjɫ^V`isP'G{U彅JB,OyTV(X!}}Bl.2~=iE|xⷍ&𯄮-%7+0r* $2vp~8ɩ$6Dяrq/ߞRx/$cx|!ٞ]6Bfޱ$&WC g?7Er:A5.iY {U#}>*JA֔H84.@)w3z3'NKe3+ߎI=v9)w1Y~uXo5|<ֱOfZcdn ,m`GNn(80q^B*Np ]);ҞvbudbR R4N)q/JJ7fkE]iz"kK)"ЏB=K94y>@ vڛyqǰfMrnT[+u5? >[xE*\W$5®D_G?RI=h>oF+]׼D%is0}/&:@9?T9R~*BI270}k3>vɈP~`9{Wk<$=W[ <H7+)"W[7 ;Ym܌fGP{_ 4WEľ#vKnv$`^?״-Ҡnq$nQP:מ| u=:ѩ94l'澀4SK("PN)ȥ!5mgc,TY1}2µ~ Z^,Ů`WTS9ϡ9 ku5fI9wBNDc%p~bszBڷl`ny=cp+4&G[[H>5{RLl.uL}Vzoq#i0y$܌q?{-1!n䨯io\ϗ1T7&~;<"?7fѿ椣"im"I` rF*F#"+]Sx/\$W4^"HT-r&WR[x_Ks&;^ ~tLvr9{ cڀhȠ_(a0[@ES֜FzB1F87<❁Ў1K((*H@41Mg9u?QH)3M /'Ґ@sqnj>c8?ZAM(dPh$y')Kӏ֐X#寈-@hΓ#Px<")&ExeYNA dPɧGjnq@I#,= gI'(uRzU-OUѬWמռ}9&=?oEt]&-, Ov==\ɠRgc4:PE8;--][[m̗qG!YSWpYޥ1˒sv5(ѼB4WRC8 aײ~Ǚsiςe8=zGԣ>IF|TqA;rA&)9(4֣ t49i2I⛎i`Pi9 q7h40+K2n,!௘<~k?geˍ}V㔉pLq׏A^uuK22Ρw8 4ZMU } Q0X&oڷh]e=V4mG$+m{$xҖxX\6ďXR=_j*+b# GE4Ru8JP 0RriTNWxg?#o÷$P(I(QJ+>#-wHD.?w5۵_3Js"=RUӅդGu>v5ba9^->1#IYB?{.hӣҬⶉ@}Y>5x8u;%4:1z񎆷> m>+M=hH\YF}S@3Ҥ18HNA=)֕qJNWh~|C[]-.~zA\~_xP:#Rx㲯\xKx(cT 0LswF*9IқScޙiA)p;R>hZgk$=T y俳LT?\)C-s>0htv+x0=hzRc4֐3J*O4sHA0A IݩvJ^E91ҁsB5iCdR91n1J3KڀixG1H)z)R1J9Le_~ό_WӕPm[X(Qrr׃mnDjH?ӨS(Q^iz~cg v(WhܞM]4BRPմ{=fɭn<Ȧ|yR=  QÁ oß$ľ2{bBif Ҽ/ɩimj.,Ǣ= xƥJ@,gXKSAZ/RT}F 0LMք-e[p. ߒ?ZMmOƢ^uGaM#'1Xb 3A%RKg8VipBb͑ϠPx?\ vğW>26r@;6E=L&+dهS:Ph##G(9%W#NZ)>(GjBE/Ls<-$Ag5knsJE&*;ⴶT$pd{+mW89؟"h3IA=Ho¿< ݪOnIhnsz?|ϡՑ72.r|^8#< WTVQ,+yT.9Џ?4=r^͵XC=)C>^14ȥ4;SzQFi+7LQx_v7 :;F:>^,hAAE-QIE/AIE-8riSI-y*piR)⛜SIENw}($ȤW,{Uh.Y4uP@AQHm@<۠^3Bޔ'4&)IqLUnyjdcN8ZnVؔUg KM{{脑9zFRF6e-ч\v>+kXy!g-C c \jd>较uW`94ҠSIE(SE֒u8jXI Z$2>^WF/O^Ef\Mh0k7?i^ۚu;@IOn<8k?~;xY퍦k&,p/V?~B08_MZac෍b iW-+\ZBbowrk<=iM?J!P+{n}yUnIaegIZόp9 Ik7!me-{G{Idc;y\]4`fxO'M-G4P<0n3[U|9mX#  nzz&Ӽ#WPCD[Nʣ'xtf^;kc!AA^gME!R6n:uPzA})x&fK=(42I<SzP8)7E)b\sR?iȩqH @f#;?/=iA'82|@MNܻ4jwABX:zR†SFsJN)zR5GJ~@M!;G"y7&н֢fޤW6R2+ V^g&ዿ=-ۃ;xvݮ>]BO#zz^дi궫qj62Tr\t5W4OOʗʧ )amH[jgB!hd UR1 y)i=/=SM*qҞAJ=i|S҃Xzxf"U? x>Ie$w2rI?ߟwSFvW |R#Q fua4ruF\sȧv`ҶZA* PM"п1zp$R1O"y8J?4 /&Uey{+|fNƙZEkkGw8Mp<7eO^SYtPyX㑷$zZUij&G{9^L0Wqڽ=(`I"58ڎ)@H $7=)Ji=hihh=k_WMa9OvUo x9TNpzSӹ'4A Rˏzc 4h=iq@Z4ӻSiGZZ\Pi3i&_:|2 / 7+ޘ$8J&^" tei")˰bu< igFӴXyKp.pAbֆέiYX:=e\2/˸݃ ӮxN_:|U ե-kY]$Av}}k]sM^um lcȯ6;Kຎ]V,Mn <2j7\ GI9Uʅ8DC(iVZsj0,(RX۸=G&josO3*M?\Ăx$ #t4 I ;dkzܓOrjqUlʘT:mn;SdqMb1v;0sF9#J4d#4++e9?%Pִ5J$CyT0##u$'tMv̩/#C7a~յ>$VNIʻV|^Z?Dro$q-ԟ's߽}E#*2 `2:ntKE#;4GӡmV ~Nں\@)M U#li ]}[}zhdԵU.Mϖ}O/N5׶E=7\u ! B)ҖЦL#'z (RbPO4fiJ 5l|vy4O@4PG<M#4|6[wj= oLQU_%,bXpI6<=qχv^B]rF݀^;W~X/$)w+h 9ݖ.)Ef2(֓4N@9KGқ"@Qpi۳JzPi &N9=).piW0˗#)MoEz=i k▭l}2' 2V((>}} oaGtvj/Lcޘ~-f?>-uw,|J ¯Op3aeA+v j9=kҼ]ɥkv!UaєExy̏xV&${S~C5/Gѯ[:yp?2K8װmR"hM'C(4h=*3 3#< A4c)5*UƔ\b9A73B׺+T`W8p~K7׃얚oxً»o^cq(rr}+@4P\[F#@>Q!Ǟ}=b?? 5<cƎ u`gOcJ4N>8ncrcwW +fHe:J:g}?*UkvDw%P)=e qH6G Tm{ ϵ 0= HiIľ,P ,|=N:"-Yo} {z9;P'$BIp\R(*znݣRƐq54N!y2)Zy{myy2Am YTw&]tK+Fn5%S>IN9yN@GZC$uGQ֗PHk|K l?Phc=W>/ZZ]Q?Ozſ?ƃ9|*RLnVRyhv".2 #s_=|l4^4.?۞F`!Ih }15MıNITRсMYI'yqd;X쾋{:xWphq߰"1]5&(@bA⛿SP))(&bRCsEs$i&1q8:ur7]rn$fTPTp5/ zӇ4m>{d]3Fxzfgdc3ZBSh(4Q&(J)5svh=8;Ljy_R BJg I|闟%jSIvK({gpUTQH ^q=hޥS &hzԺN$D~Avq'[-q=/+g;`srkrC֓)OJozp 4fC.[mZr+!,(r"E0k|?:eHܦ z??4߈Rp=N=>7/cA?/,G! xtdr[ѽz''@HPA\J)hJ)3Efc8Cx4m \!μ}~zWO [hG-\p?]4u?j۳ ~<5+۷o9/dj NL"<rj'*8;<ټwl)RdRth#QҎ( 1҂1^?NqW4?C(ݹm9O$ou/ۮ@ 1yH=pd$Ex uJr]̈́^y'$4`KI;ҏjFcwb9"qHxqQҁ?Jݜ){T0q^3㿋ZZܞ_{O5t$w'#z礇L![$$skOŸdgL$igy 13X,Ol}8<3jA B[Z!7Yϧk)5D$eoi< -Ar8.+%^q^k7ZٝCM]Sz7.3ӵYxkķ?y6:-8&F3M.hE,: zT)IWn{׆~:?l`yxS'0}ڻ xA& [Aq~d3$~`xZ|;q6ͼM,B@;9r= _SniLD[N Up `tz .~aKJpE78+†84xLE 2֞!m&B8"أcH@f=2z cJҎУR\ӆ)q6:W㎇[4vկb$ryqrGАk  @[,+?dicQ"06>=֒qMy9iB)h(IY P\_jzBwJwI_F^^hV;=u^|}B0uON!kTEYq}_|$| (Pն\F"d䞼q^ڒdO,ƃs3=Myƹ_ #EG31NzE'Һxb@ķn?y1ζRb|G<l^̅q$Usp+[Ԍl~ZÆf9=ѼsC̫d~T%m|  F3M( wji&sNyHy◌r3M@*izZS@ vq֔\CIڜ1H#3⚧u:ѐi1Gj1(SOZPq֓LvF~6&oI< D}F'25(h ȋ,gUੑy~k{VhMxא|dk(;j b*H9"oh8kK݈H!TI3'<<33:,i۔͞{Q(i S%Ӡk7\ՆjymUzHenXդUvC'E9,57)8==k6KXc? B XNff[[~ڧ|}+S?PoV?{0(=Yr?XV slwdľ-ŬKYd8*}kѣdxF*95$kW\HQ4ۛ,yX KVԼe~45-Gzkд =ʃ癿sldb_94Ax/=(bnM֔g=(޴X)#ښnR{S*0sW~КmͶ60ͧz])IHAP^{/G x;]10]q'<-qJ1HHڹ5].IJ^ԃKE̶zS`X&𽶿+oQC>$> BY1_ҽ9RXX^7{~he]ʱĝI=MyTZګCz z\Em4;oj$?yϩ 4 @@4Q\Z3Atށ:Jh((4i1RA(⛎i+ω DE-9XG&7$lhjyۏ3~(ko-eAuEAj5]^I syWǺɂ=+Ѵ6JKkHF'Տ=]i51ؒJm#pz )BT bMqؤ#qJ%c()~1-뛡uq.kY-#giR$Xx Q٣q^Ft 40 oΩZd>`!5Q''^d 5%mr='s2]O. "ae$}xW":Ӱ}h#4Fy4{S)Y]D=1S#fkmNSQ\#=r1_os^oq <,8ʺ*ZhMuw'A !|{f68cսOXWiud_͏=X)4 gI!N:R_gibf8'J021IR 8LҺuL4(.?vi|6^;FZhչ$r {\:쬱, sthĆ1x04>e<wWh7/x{N{Xo(?֯7^ Wy9fݸzt~4S_Z3Kތ`zѻIJZ^~6xQQn_IU<Ȥ'vd`{W#k7p%B[b,f4oi?EGmJ?`VրiNqns֜H۴Uqdjp\)& '"3ޣBs4L RRzCXz5\Ib){Q\v_GP:VmO]?yOu> DSqM$N2 vz%~O }p֚u_1#GAoS6eZ#:ܞ4IIOÚ|iBݪ. u#={Sg5~s ?k#~:o% {{WiSw0z^ނ)IӅKzQKA˒)5/~x9[RG!beaԶ:g{RC:U-_GMduG2Q^m&|4h,Ğ;M|@Ӽexu؃צYZGkm c L@QNxjXؑΥM8RRbH)EnhF ˊhNp٥Mah&㷄nu vQlgt!wrYCFDÕs=4cm;'zLPz/jPqJpE0d~8''.y4iíңC\)h\RME\i MVsQ*IUC]EbƠVq"S\ P95趚Ňry W 3Yɒ:IҞǦF;:lAW kh,`H-XAU*o34?jR(8q$qLE9Bym@jp~^j 59NiSҳq־dԛR9NP6> 6!fT/O|Ryy5}C㇏,4*Km."Ƅ83 kQ-!8"@HN@(1ΑFڞp)2 QiO"4L(xn(4l!8֚KH%Io4+W v8F:*N<jSL(z+?^-b-m %W~Zdwl<=wqp^k[~}XOXS8'סw41Rp9H ;RS["N8ޗz3J1FiW r:SXP^C\ޕZ_EZ\pފ@=(@kBlK*>ޢk|}aoFSދ^_QJvץCin[ıD 0KKьPi`ӱAgHFW#AO0 63ScR(niƛJNJͿ>p XA6ܻT[iGRx̐LX%دxUKy-q7 nO-^QzFxD* Hv>(RKF)hB)GfyRLѴҁKMF)E-&i .E}h(ъZBh$Hf)b>sN4R7riǥA$=F_)GҟvK79ֲa6yhtm/_]9Oed!za\tucFgXͤƇ!"IRގ();Rfr3ERbqKi>)M%&)1pjN.sNȢqM-JJo&^)(ap~ EIu6md9'oϾ2iC+ws)-L].}z;BGAE4Tg()r=8'sHA)q&@ &sҀ}i٠dR"H} QJrqLD# N ACAp O49y<4@/jE 1MhFҲdR5EqZ < _,Nqr xKwOxC8@oA!VŒ>6r3mQIգn)ǡ^jz͊ZI CG\])I#1A9Ԝ)b+N̂) bO1Lbǡ*㨥Jgzec%eլz)2y)o=+ȱ=wgC4iGrՉ叹$֖=i@Z8#p4.`\r)wc/@qւFr)Abu`=zí~ Iծu̱ΌP{]_jiJ8p9Aq#ӜqMe0iI0v5sւE攜 ibҟZF9JHE*) `nq}Gj;Kq;W9$N Ǿ<'l ;G4MPi斊Z-!Fi M$Th_T@4*qޑO4֌Rt"M c֌҃A)1Fi@[9(\ߊ|Yl8Nуݿ°<9K^g].!_Bދ?_AcUT(tV^ms 85準x#R]GM$O#q5> T6yCGjAu! v)7REu4@O=(RM&NvHi ҎzTp8( (8ڎiiӤ^Y_zWj IrC?˥G|մE-|[ gktxAN1^o qgp{PA aԹ1c,z"O)SE79H:b@iCJyq֔g榑PHTMSȨsQ曻T:=_U8mnBrQ\á}jY2\Ul}V?|)>?ýb=^aq;U{X$IXv>5/j_ns%d1mkݟld^$H_z_֔Pn p1a< 0zRj7 (W{xr$OS$*̧cVnj]hv;Sbh*:p(1 3JVQK95fӕ9/Y>$O0لW3!F%zÇ'u$[O e>3:W*j%xK*\¼wE\ůwbvI<˺Œ7&|:N_5 Λ;_/a ܌2?C/U#v ' ^w6=ׄ%_] a?AP^YZB kͯS,8#?u=r]6q$L~d>ކ:B3@ ;ƟxzZmB3[> qQhܥsj!? }I讌Xd09zci'u/"fҀxG.*zb-ONt[@?Ӽ9K,k{d ))ۍ=3_;dGy=p\$'зÌEϙ8\ M߮}M{ff:n2g6y;tFsIE)@t-%RKAqHzRJ8RQB)ZRƐs֝F(h)p)#"ϭfj~%g٩:})~B1YT4TFdt!@9֥(&('xKnȒ9{A`; $=?n)FFJ+ c^oxnX·,]_Om }ExK?ޣ:Qf S(.(ؤ,OEzO|7v6.Z5kʍɌ@IvkžӼaϥ0#STo2䟳v4)hЏ6+؜/mnp>9x!_jC 8N6瑽.G0kIOxʷpvsWx{'̕㻉CMi0Ĉ3ч3]baV.08`̃8(=) ϥ5zRRɧS8ɠ3HjSg1GCB@7I~үXp{Sc<̧q8cǮ+/M+%^LdG-? x=QJdc"?ݾ;FxMDX*ɘ\cncxExeaEy_x^[Gw0' rcz%m0!'ӉȦRڔ8˾G"lԆ4~p=ʪj*@=Hi<ѼH٥W=(;$ 49N$m")XfUvW[k'[w-E&#.KA9᝵qWo\.3ןxP]+?K%H$uRad$ q0E}Mwy': $l{b1֚=)x@Sdur\:= 9ɧgzQץs46)l4uxh." IP{<@{_1F93N=3MӹAM)sKq4JZjiu|=ľ6RKc#*cGQɌob6bg]+{'H?ZWѿ {*Cb;8uﵹǡs؏JNE旊J)h>2ez+.y z~^|%Ӷj/Öy_v_v4QE!R=A6GIDoi ؿ@[uGRN:d jW mKD_um=i U`i 8PXJA'(20A\|-q\cDgEB]N_Q>+[G)Ǫo&Ryhc;`B鞕$m;48BvSKgHc745IږvA,FB/i兇~W#V5;v{ȴdү`$9P~gszy"m7nӚ<}i6j^i@H܀rix=(HgK}hҪr\.xb~% t$S+c]9(B'jClsL | Q$dμ~3Hd௾Oj~- zHൻITN==ps^mpG(UDP@jy^k?yNy\y$u1/Z_ţ%>ÀqN$)jU!M,E ,# ^CЙ81{UӧI밈e>ںy81W:lz 0: T}רk\wNee%Yu@0GbCR΅wjm.q'=Mxo==jX«+ ]س}=} ғ7S1@g4t?4nQp :R%Sm'O{t6p:JaRjnR@4i6֗'+n֓!;~GqoL%ې= n} AydFH$sOSSt9t _X.l*-9 ]?xRAe]ayXB20}kA)@=hQKC@I2c}:?,ɑײ'zATur}@juV_ xo.L2Z6:@_o$v]ZKakg4E II=/g.?4}d=S:x_P葭YorD~k-RUWE;;\Io xu~;򤇁/ѿv8Q7PM4U&IZ LqRIB=))–u#P{R}&r %!=sސ Q֗< X4)U=Eygj\iWwKIϔ%OnǦ)iQOj7:ß+`6Kc+ +khc$qFU 68 ӷU j5}L.䁾|oQxCR<)H4fr2z `z+(Y(#]gpRI|Q>'|eͅ 8VPz qF:eMǽ8r}J[=(U EFA^iX7y[<Kz皁Ĥb$_jYi~㎴rR8'ZAWSլ[2SZ^@2R vԨ9c,*I<+'45wW%D/] Z k s}i]Iv;i`P ivF8iJB8HɯG|#ճMK~B1Ɋ@9a"G.]OR/y??OxgYx`*( rF2rO~y}"5tpz9(ہK4B9_څ]z梚(4 v'PiH8M(4.x=is90)sHy)O4I|M)Ss)wwL`|{R l@E,N^!=ֽwr9tbY6| /e=~eg>? #vN8m{dhڃsހ N$whW1ʖW̱_{~^#0{RP{hZV : + xZ> Hd*y?#cԟR/O2k~M̲y̟"Gҽ^'\em.Vcܟ *F; v@Isq@#4)i;1Oo%u: (F)iƒW!&O 8{~S1uiZhS&`1F(4QIE/zVH3Px YNi0GiP) \R8qKiIܹIg BNhnSޕH>M wHĻ07@lӜ WٻP2RxjNO_p^oZ-:7T 5.9sz F #?giAN9ԃJ M;ӷaR*2FK1ɦ g}+ .)yFA_5#z fg\v1Od5k|@z3tOW >Mkºd!-wnHyaϩz7k[bKz cSqL*wdSocKܚiNE0Ơ^OPd /\]51)(IH>{\ S1)Yr)lS~ S@7z~t 3|d'ǫoA#XܕTH{\׼$ҢA'ʞ}v*/K%/&L'c${?:=։HGxߪr=Ҽzhq3O&}i٥'4@⌒qMwӈ }iA S@,M#dW:~n[yͪWs{Ep:7x׼K5J14fyJFF9sz_\/c^q`DD1DIy9LtbJo9of R))^KD~[T}^"'TQ݀~?umuKc xz0Bun_U`v8vt'/hVSz窞O *v)zRiM қt'J:ъ1KJLQ)9viw C`QE4QE65ET1 ʠ2?PGpH;_AȑDȑ6y'8}Mb_7emAٳy2=2Fߠ5\&sG>գ $Dw{7cc휫5"z2ENi0sKF(Q) )1JEkЪ8M Hgg4(%FhqBsNq9)0/>Y@+е7$H$8BNֵqo<- I"($r}V#߬xTVXVԍd׾6A8s43=)服=$R+4֔1^㴌 U+?!ak\E|A'5ͦ\'\.ŕ1FtKy?*1ߊC3B֜s܊H˓N1AݜdQyV/#xH <`Dmc=Gx߳ޭm;hNH>dmm;I]7i:xu[X ~?-zٽ'jMo~+I;8APbuXMd?9@sJhSN(^3J2h#&)sGRB8 w9`zъo;Cy{mIuw" c%כj;>d g8=A5d-W$$iiJ6lPh)4HkO"ZG^(>ߋ#],bM'T>^Sy x#ھrj?&e &8YN,k5۫HzW9iVcGǀ*SîYqy3HF !#$5뢔:oj84R`NȧwGJ(4f4b)qF(QA2N))h(\jڝBd|#R=5q%H P w_&o1'W@ )(J I&()zQJ┌ʅdb[Pmt'Gdל>Wɋ0iNV1}[ktF[kHsZ!*mwZ]M4Td߁_4M{p@p|mDXsϿAWз3*?#x3FhJ3FT'JZLmeq10rAc9+hmߖ{ep'+m>>j t N_"K'a)A<_^k^iҐhI97ґIiYWҘ{R1YTry#")GͷI+Ÿ|K}jh%fX݆%* 9Anx|k+6q% 9qG#t_~!x@y5[޳K!N }`m```ax4됵!CHϵ;nZC٦9q L*0+5|J6R@YLہ<= m|mKbʢ9$2<S5'ڸORG(3 xH񅁾ѮD OfSpMtb:ӏ4ocAcW[t3m5j9he8܄O~8kδ dKxCk@# $GMR`S֫k]u468\[#̐ULr:).R){ֺ ֔-5I8(Py[8SsRt4xEPzҊ()K֎ڛiIɪzk5ܛQz(}kΈ|}g42Mm4$k=K歃JM798M(4FsIu! xxZo#G[/ҹmķ;Ud+Ez::KU HxjZ^&PEXP1et9V'8՟К\R[Jj -#wTNGӷ7?7Bx_:5Arl.B(<ܐ3^ƒ~ њEs%ċ'À8qJO&w5%4^(F)1NhsF9L.)@Ɣc"63 )4w3Tyu- g83Sۆ$#GhOuU6?ǭy?7o,tO+!80n%?* ORI鏤<iZ.Te*r r=)(iR!4RHN(&yMUeH}*8kz-]^>2pyϠ[=~p >#>zFm2-m"ĝ}IjѠ)qB=(5=3ΧbzS"덻^M⇇+?hvYT*I  ^Z{3T[7!Cᔌvޒ<֟ 6J`(voAl|\yzKS6loil\ #O?zMսw6҉aeYO)iqi"F`:p 2TpsEbr*82zH+Ũ3`i%v=5o6vSsCr Hy'O)Oar˴LA$ y|9]/H,}||{[+A'8=h+h&ԛ47;@g4&q)n?LUM1sJ(\f*2M(oa^AFG3N2aMEw:1c < oU5Bxb d.,I9k7+aNA%H繤> 4ݩn14cFɦ"%O=剤#H s j2 kZ~t$b8s?Ƹ+{}Kf3>}OXW[imm  >7ױr}>M43{SYzS w%x& 0N܁T/e*{N\EΤ O4g:V^떾T,*Uڸ OQntA$O^is \A*!ԧ'pE#Hr83Jq4blRN};T8&wS:ӽIPi(WҬY#"6+dtP2*FW>a(3זvQt~FH$Qh:**n!94d Ҝ"N):B~TOS1iɣhI)G" Sɠ)2M-QJp֊ozZֵM ps ~iSΧhPPzUz=ZıD N16Ӛi1KFE&ӂ[m4wZ= UZx)jZ(QGzZ@h-MԻh=h (' FR]ZG ܟ@kxǶx^{hnG\v*@!kE})g~VHVTmY"o3kxƞ,$&)GSpA/jdÚG4( 0V5E~dpkS/L!Q/R8fyiㅤ(4p~._]5ķJD9^ʥ柩Z#6<"l@׬zEiq]ZJ2؎㨫NF:hLoVJPp(M'4(Ym4 O2sfO=ҴmGƚI,៺g5VGoo c 8ޔPiEdyN# d̞q#vZHl"8PNk#ZZ:fسUVϢ=G[+tJVKIGu>v5v߉~:~{EPo&&_9>xikmomp @󩑙}R0Br=qiuυ2_n!0[ n7U2X:qdgӢǨKv8eaϱvvқޖ;u486M8=KL,dm!a)כ]Ͼ ڝg>T7 V?ut}9#B^R=7`WLih]ZGjLQJm8P-0dƞI+iSUhBhcMAj^ dÖ^,ލ~p:aJ_M?SpDM, (t8 OOv5`٤QZZoߤdۂ=jTn)۸49pS sNSB4ԻjsqJ@nϯZ!<:@>?WGp^,%v?w zchͨ]BY_j $^k Ӭe}3_Imrx2E$qCJ;ҔV^iUW=(' HWbwT撃ҕzUoXt[WQEkkyԓrE||s'^4~M>,GmV\};E:G|ŦZprF18]m#[}B݂][ed#OhF9RۊQPWB1@RhP ZLw8ӇL'IkZ%ӏB_s+ѴVš<p?}ף V$0Ʊƃ 06)`њ)){SM;4޴қޗ{~yz \R&1K1F)6ւ(|L%Dž|eVUb]O^Mƛtx^u.fs3K+3=r8^soxK ?clg "ʣ5Kux#Σk2v@D]  I͎Ը.(A=i;ڂk/m?\f8syG-xjė۹V82^i kh6 uVzU6 8U5iqBle?uQk0.=@=GuAU=Vu=A$$)ּ | 5g:ח H6"n?j5}e5ψrZuŅbf$פxsgt9Oex;WadqWPui;<ky>nx rsǷ|#Ǎ<7YT 3 wc@hi3Uשּׂ+Gd ޼T.tqw.iY V`I}ׇ~_mOy1^=: %n81U7$sQnC l9+f~[7 zu}(K;R(AH4p)ir)A=h;}h4M&xi˷b;E&O\0#HqNR4qֆc4Mrp\JF)R:~н{Q_qQ449/A@ 9M\uFO9gbT|QmBc@޸" |1ucZghTn E=+HbPmUHJFsmBoXU&Q4'@ j65J-JIXuOje㟺ѱѽ\WzŐ9} h(cp[w#B SOP6{ThH~jF|p)ǥ9P)pJAҜs}) N/ր=ʼuGIN./P̈́ۑr=s\r|55?[3I;5 6]>Km29igt?^9,wt9ˎS8_lʹBH3rqڴtۋx%T9j1GxdW.T\UeG9C掆9=i9Tӏ7Rix7u8 iKi=h& "2ݿýsηrutz4/} T( Tzp*3B9""98U{K?槱8 W:3JpN>W I5rЊiON%04q9= =XEPzю):4vR8GJ7Gۏm?;b:3 d~#?о6i6˥xEyM21"6>oSNGğDžtI4+UD韧'V%˱@xiXq}3޺SݠR( ּf.R#i%hB\+|R𬏁"ӯpLlU0zWV1isI~G jZI$`Uuث#$cLuQk RRq!g;9[^/EF+-V!}8 \(ruAk{[@B;{5V?>h0&DRv,qy KXc !(O8y#ܼizӪ0@t:mk> MkFK Y2$SDUsɮ5dN'6 ɵL#bJ{[MP^[+F WPU3.{h. %DVR29k;7]YEUo>eQjlR[ם>ҽ-5zӏZJnM(żWP<ƲDk# +͵}Pv5]%٭3;\w_Mgomofd|csѱ9ş6<5m K!Y\,i`6u?mĚ]io GNs~^&-WHn+ ߄djw;9-_wa|JoUݚ1MĐ/zԌ^*-ý BS ⣗\Hh-d58݊NB}(S8zxr>V<ӡ\& QԴ- ׊᮴mKii3p+O]΅Z떆XNɐ~~eZgz\DRZߵ)#acsOUɧ@W})60¥ɦ39 m旜04Ӱ. ܸ7his#d^ɧ3B3F) ;4p+񧂮 aqj[sǶAelג|;}lKF)?B:t88_;c<;g[2LF+%f!o𿃞iu+ߟwxi5Bj+f *9ɣnhF0h#4)”RbQEdb;74TW6^=K,2 20כjZVKCNvŎ n]N=6=+Z@i奈"g,#.}}O% )𙱷oYxt{n(i8kϾ&.mnb+"GL y%VixY!GrT,*3a}į-r|J$Op DiyvvcI'֕RRfg4"2:FeaG:1w bdNL^U 4-N]ٯm7J>x%PA=WCmimg(#s@ޟJZC(E׊ҔZa_5C\8;fa!p}A"𭏆 go_ge˄aE=1sj-47weJH8=r+~ φ>.JfB!n69'}O&[T ?@pzR4Fi'4)"OZv tzs뤤cG֗ S4}if6F7%@93m_z˞I┓L$q(wٝ$.y_V_^DŽ DHa>;:B\8ی.vE2^GO.1ii zA()%g@Ҟا,sF`nȧo+Ҁ?8> qR˞sN1׊o|ICJJH|eOƲKqg݅X#P{yu>?"jEDTl" ^ߥj>!mg#pAQ"s~ѝ w2_k-m^ _uU:b#Ҏi h8a4H\w^ SAbOJD)'+1=ip)9irIIq@JK`1@K;(#ךCz LyLGf?6qR:SP+^oOuE- _Qs^ƚNݜ@LhN)8<4MuB2iTN4 1GAHisIN(&ɧM"Z)(u&NH-)Mf# GZ@)(f1I?h_±i(wad##zߧ*CfnpC+9R, q5irMFS3A,ޫ,sq' qliC[EHnhus2I`W|d-|@#yp'RJ+׮Ti\6t8a@ƀT`exO_xSNmd6H*߁\ _ÚcdC?ypF;}5`jBPާru/(D[ :{pGLw{R6=PޗҊ % %qңTp$TG8RюsFyx⚦ӏ4Az^yO O܍cBނ3g}G7aojDg/ }nҐRh~\Rb #RT N~!Uֹs+HvI=N|%o&oaǽt+L}iST擥/R`n4r9#Қ,Ar)sNLRHx1 aђOJj-iC˻SC}z~3f7Vo.+p7?^gFlma.=(9'4*1) '4QA%y~gr^X.rP1z~jҿg"uTncVϗ "Н,Wz]iZ1Q}I䚺M/^)0AN7qJ[(9ԜFǮh,JҎB]#5xh8?Zk{7aMefR.zRCc( M&$gpRc'&%.Teuۑ)uZ7m͐,>y1/+kwґI#M M0ep(T/'~}qIie^juF84'ҜNIһcNiUV.8=I-ȩּg.-lG`OR2r=?\xcu=2鍍Y7ݔp81sֱgIЮto3\w[,"6CIt9v? |-u|.eKF jTSlwtAWo yږ6\!oc,&XAڒ7C}Cmݳ]o!'F3R*@r9 *XBI98Ӧ(+&C `#q4t7bF S^O>ԘQ֮Fi%YQR@~joʅIѡO[_>|{M ^̥rZ']Q_E x(!cAZEsMAN~4.=)H擞Jpɧcs <$QF݂Ԓz 1x&`E%R]Ķ>^F 埙SEl0ߥ8iP~z\:fId=gu&?xO<3z$ ߓQ] 5A5̈́M_4EqN:|z~!98y)ڲx"9VawϢ>o;ٯ~lte}AѳA'*8h8r nri@ɠR{❁IE!ǹi qFpiI n9K3HO5SES |dy=[>;,5ޏd< OoW`1'SIE/t4oH#<I' k07#f? >Y_xK5;B9?6p2:5k6Fhɏ{!_C^cS/+_J% }"znAwҾMv;iv(-j;y|>ƦHӝ(Ԁi1GJ3FhQF(u4) )O/4,q ;+uvtxZgQpe Z\ijF(nh Jx旵iNV;Ӫ,)IqGJZ(4sC 56G*ih=+Gakߨ%>Nj^iZŚ^ ~DR43CqHIh#"O4iR \ CJ sFERc4(n|; 4i$7HOL'8(ϥ#9)IyQUa\Fڏp sU~ԾfsSq{ID m6<,q3+]bte9wN{o4=BqɈ彇bvTl|1 %F)L2$vsJ*2Qii栖BQbL).4hcҜJ査#uO~էM4!51~ރ[1M٦s#/+**?f[c]QZ*^K>QNjdI5dNŚNu8sJӇ<0WHwzSŸTB=xfG;$nR1ObqE,=jNwb3У)I"2o5o>>[`7*t^qcy>3alC3yޏu5Z{)#8. =+{RNz3Lb^OC$y#>j0)Ks{p47j@3N҃g;珊Z߉px Kʴ@|>g5_t+PwӞ3N\g<-sRW6M6$<ܟ-oF ,^/wN"MyK9Hs#bx.H̱'/&ypW'wWQHhuWw?N]e%Z>o2OPG|z_7m[FЉK98й "Wܻ o0AZ38HGNiTS 4O74fQ(hۚi5a'{,*_IHz#$W\~Җ tW2[y. G]*oҋKIdy"w9 (]ձwIfmTQČ^]M8lfs(PAHt,z?9#=(◧z\;RqGRf24FS<:j@:Q9/lRPMQ&Gi|nXAf75?jcF3 >k4;= Als̒z Ӥ8Bh-&;6 g4n*C)YJPi”@Rf4џzFPbR ֝u {W;o eBޠ$ ^0dae9zv1F? 1GSM`OCOQ&c'9giɣ4M/NPzq1֌J>YZp#R {ӷqqI[zi ڑSsqI*F:R.x3w r=j8+'5c*, OjC '+?ME"튥_sڭx.1֠ӬU%OS-c7s]֍ZhB e[fjBIZ;{fnH 9dl-;E$Ҝ%b8L243J.}om#.g#Zƛ,uKu&Wjlcp x=>04jhje`NqҤPA_x?HqVE.F@$xS)p9ɥQʀw0g4 :U`ZE >H|:pV74qiӲ5Iff`=+ӾKc@P=1\u'JqA|P4E֛k[nd\}>bƐ<5.`E"YnA  c5_ƿlX"@=O[%|.|eAt ɹ+3 #pl['ͰD VYp'c7`s&-!ӏ4)G5T2|Y}apzsȻDp鹎I{^e?+eiEn.np$ds^ |YZ#E WA}ӑӁZ j۞ҵf 9W($~"IqNISR7JNrs>%:F _IawwE65IsoU?ӧ@AR2E5N)qHEE($ bS'9Ȋ:V*FA#Z|3vgソ5?>3xkZCdH'M=Y-ȯ[{N}Ku}rAu [G$צ;搌SiE qHjL 0)(*Қ)sIJB(8ԣ(9 JO4QEQE7MSUM}kj?q7 Wiz]fqy$cOsWhSqN(=)f4.OZ%N Ӈ--5zӍ70sqojJm5M>{Wzug1={nIde9TqA8&P ө= JFFM8(Qւ(i7sAnh-&N:SJO@W3Leg.Ի2 5G)qiQL*4N(xw=*,RuKM&ͮ.ڣQsySƧ&~տYiֺ]ZFԞj4r:f z N wrip*BM.E$STfsI1Q=jT;iY(qI/ x~RwG{w>גh>!5NHKK"sױ? $]CR sޟWMƷZ3:6daOOn} }# K $N0=#YemcM:oޭОa;V3%Q+#ϣ7FӮr.-Il?\zӀaQO^8X^#շ-Wh?w0ʹ-7֑LC}WW,sēD$n7+)#֔ǭ< Qh4p4qJ)( XG4! u=(#4֝J\Qn8FK6B[b >ZI?AOMva1v6ҽCm=o{Vє؀kL8bJzP(GJ QE^sY޷g˞#Og;zg}OXWXm[ZF#Gձ((hPMu&r(F)@4)Z1F1KӀi)ŒQڀ1JI4(=)x)V~k&9 }GWj Ҵ|?#k,/uDK}X i;R(Ja(A7p'~FLH4zE<@ONÜӆ1 Ѽ 3Ibd7R68WybNqRt(`/^A0SM3,Tav7 $qE9w^m<Dq/sYXj>2~~;48ck %(E=_zei D594 +D1Gn[W 9f/$T.S y`R,1Q]J]v<%o ڕV/x>?t.| ,$l2Cֵɐ[.\f[b|$o+Un;TELҜISSk.d>\5G엨Hr<[KomE' *DJ:t7BzRqJ0sM6PA#!bw SqSқɧzQi1&nE&~\m_SK/j2)A!4繈]R"vqqO@4&AgkB_jG{<_N^|̈DOfSyq5h94Ei0A6v]ҢGTiڴ3Jx(ҐY:gYyҰ>T z#QuFF68?oҮllX/!eQ¨&4k&ҭZcڢQ5Σv_ /nDY+#ּWxoԴ-mekB.pW ?*>hBsJsM4f]0\Q!W j53Y9K{hme ʲv')1s=2=i斘G4`R(PԹ4CrhޔS7Rguk,Q#Hd̾ ƏgX/M|NO_ų^/OMcCTLpYd<5eySVO.~P3ʹ# oR+qFxzӈ␝HiqIQ(_xė.?u})4S6<!<`v6WR\JE;RVs9eb?ٿ5;:<j Ƀ+E^)h ޞz CҘ:ө o>мwfuN$=>漚O٪L~(ݚȆ^/[gՂ\˴ #bt\'+3H)4ҎmcS{4yQNcI<Zxn)W+u5GUm5rU ZȟU@gݐzbN-5{8$uWŽ8ۚu=~΁̀y= j8tK1ڐ R&Fi1Kn=֌RъiuHwO:u=81Swi,z߳mk>J<(3:Gq5k:^)wMtkf[yT0Ydq9nH=xI LQA"JiZv(⛚wxph1b- }ݿýsλsre>?_EX"(UQi (IKJJ(5HiO`+MԾ:|@ul%b#A#Kc++i{vdB2u6}yl~1[}G;hcyK⡋y:oCb+֓4 E&PiH8'h(!A4fԙ#)9⒆!qU`1$2 2yơj~ԾߧعO#p?C]懯Zk^}muX5ԓv@qR g cҌ1)3*80S !&'k?i;LVa aP?!`Ӡkiv(}9$&%BmsF3{u 2 2+|umJM-(mRH/0sVN94⎬)L9xŰ葵Yo}ޢ/v Olk;:ރN(  p_Cx@Ь|`](+.oFmP3 fnyERsH.s@Z 6D.MJpMIލr;[R"8 I?<2$:UTef3ڦo?Ko#[16wa&~xCq+dWVVWkz/;@=}usĶ qBO?Q?msNy <Ұ⃌HfJ:'g-CӱaKq^O"𽶩cI.R6L9ߠ]h>(k+QcixPpzg Hi@.l1;^F%#l w jufGH|Bw1Ǧ>Հ4cw5 j0BҲVE~53Z滮jOmT >\K1s]FAAWx/d}yǽG:Ε≼V]jem")TeOwF=TL"gTҒh=2iSi[8[-]5Z/O D qjw;'99|RGSL-.χדwJf឴wazc8nf.5DsJiR4QR1ފk=V"ɾ)gmgihSrn#a^HIeс//mO"§1\{9!өU A2H zp*dNU'HŏAԨ~NjxsN=Fi`nC+V@ 3\m<_];MvԴx!'=EiՁE?*+imPJOu#WswmA`ɎTT1rA=y"KBCl*xyh{X{qU;^񇍏W Ʈ'Yo T@zqkޝޥphj]g"8\JzS41j?,|[}6 ?U837*ޤg8Mqr|{TOeYdԧt+ Wz߆O"t5I˖hUU8+X69␚i43BSLphqH"WN$?+9{VUTցNpO>zoNފP3Aڗ8CM\ґBh;MO4RtF)i ;u&sFqMiJ(4p(hށJzVG zUsgl1vR}^++Q|Y広%|LBT '4i-7!'#?C//<F=ͻNԤXY\Iq~_c=Œ# 5#eƃ<~=G_AF;bQs/:iJ(K-7RQ-!IKHh-7pRo}>S`C$7@?W͞(]VV`?v'ŁOxSǶW5,M37?=* x~-N({Id/HR$C=p@헉 =gObQ]Np}iaOjPAدdi=JtZhpN`hJ큁QuK\?>3Wr]">4[Q\dh t5r[R\'hk7@sovS5bvߥϊ5fh,Y(g^agg b(!@xTZ>驣x Js֔Q3&6 c= =+ԣk1s\kꑝ΋?q꾣t|55Ȅ2Gf_] 9PѣVPF# l^ѭ^#O-*Z3Wd.[=R aHq)z Q  қޜ(# 數Au8$Sqғ8s֖O4 8l@ U94R#4qxtIy9cW|)_%W[Rhw4c* N'PN޴~PiQ 8O/JAE!SS (QɤK 4;R)Тqڂ0pz֝|L_WoDd6*gs!띸|;>Кd֗ 2Ōlش[6@C |9n7G2Ca:e_1Ar:oƾ!uCr"0$yF0;e! #:i;S%h y5kXDUY?xtM3◅P-;K8xVA_{cھS[i"Y#u(!AWɷvz68|pA_!Y.?޽L #Y KD[^ <ŹP )\2k7&#B,cW>ZZ*-YouAOSn9'P&NIޗShњCIފ)EQHhiM47qO)`҃HrA[~j\qM4JS1`4d| PDaU?y۞QftP·{/{l5#+c_ooҺ(XJZ4JM F\,t܂( 9/4.i9u+*eΣ}(3${Ϸz?Qş|Ysuee5OpV㞅 T.ܞ1מx3jZ.v4Ϣ{NZ:-da#9P5DWT}ZFGʫ+N*sQѺ8SIj L^9#Ɋ֤EXEHyiBMJdՄtwjt*jY'1^i~}&F')+0,sk㟉tYuo ɵdnjHz\"h%"zdzpGC]"GeYIl8⡊6+/ch* }AO+O/UU+>ߗdfrʹ5&6mdn?J^1@aҘ&rjPқ3J)z@9H3NoSJ4җf-⛜)hj2ꀳU$ynp1^W_%ƪhZ5[w,*s>L\<,~񓤃JG:4?|>wFq@lQ1ނi4hM3%[&(aV.2G&;_-W},(ӤO.Q(EmCf-8еdO4QE/jLdWS:}S{ Ͳr6*Xr+;Yq=mjŔďq~oK>Kr  :J7l`Ldz{bDG~4%mw6q_`Kv𽎉jL4Ifol'V74dHi$uDPYלk%>9̣__kׅ|?ķ1$ރ?7p( IkGZA3%4z &MJ1h$84 RI$BTO8曊P)ئPIҎiF(^u>bp)M&iCu Q*F#gwM!3!8[H*"E Z0)15wxSizPI$ ~^#9qMf$N(hSҕJH`E7c' xj\ps&BT=SR;U~N?Z`ʓL ֝Ҽ%.B;( sh~x%KLm8R^kGbgLjVM8F1 M0`+"BsJ08j2ryIt;Fj #&W2 k_-Ҵ!OR}WCxzCDn?y/_AO]ÚR5Ȧg@in*64)f٦)L\qU$n%}{T!O3Mb0㱩 }j`*"<j@}iKc(jp4qR8)S"T>:W#k%ǒ"FSS#Ќ'l|4|G4 58Ar/$6O+ЭuK=K-;)2 k|9j|tt)s7r쭁kry@IhbjXqx r)xΣ/x>gxQΙ5cNĕs״CJn3G8cP@zЪ7TjrT2~4`uNDK4HxHlӋp) qM;SI4E2ycgX@Y޽{f'=[}Uxo6]s17-1LPJ'Ғ@'h%l庚/?O8ÚDO!;g&N)n4 Sh8'Rԡ})?(GVҴߩvJyLjlu[ R/7N,Rj(8[vH$riI,PydTAf`)Rd2RsJE yl1`A'V3if)E-#hiOZ^tמ;aŹ1Y۲GK Gs^פx?>K&8 YIE4f@9s>]A?i=ktkmt:,d"Hb 꾇ӧ+,X2A"Rb^) Ph'KH|BSrV,w2+0{$ŗ$s'DmB^.>\}1I5.ZK©-Mpls"; q^?|Cҽ K6=1gQE'ß xqsr<٢s*F5.p ȍ~3HgiPkAioQ 0%ī1 }WYԼi3Kn=8-<@yd>fZ qM%M*(mvwVJiIERisJG4N^3Hh-qU|EݧCVAizMӷQܞtF3FGN.s@ub"QLJM-fK޹F n& ٽ axwsŚNFt r "ip)N@ygM qץRk m TzH6pK$@'9$½QLHru՛;u5RoAe\̱Bf< OW,lH=1?]6FǙ)ڭ3=j'^zK`51&v$Ǡ'3޺g4R;┃@@j R[m2ĝI}k.u_g y?ޭ?Iѭ4Kmfyϩ5|zӉ&i>N) ҃ړ9OC/N#N&?B=WJGğ xFmCQY&Cmm$e=$\|?O % dHFp=H5.xo[Cè<<Ap: LfG43O+҂xQ9z('pQPÜE+#[W4kkAGzei ]-žʤ3v#ȝUsi `n&Jg42j[iosu(H']S:0DrF~T}[t*Fsj6WB&oNjKi Jiq1M#14sAb4PI(5ZI}I@GZbf*` vD3j9. W,{Աp2>ÂsP rM<6P(2G48TQf8{g%Z`s]qZq:0ʲAƌG\ ~GR+qS#*LҬ#=DcbǭXBx0՘hj²& O [*{_OrLVS>5~vq,@ml͏ʽ;Fvf9m,Mt.voX9#'.)Ǩ&zsR`/#$Ӄ As"[a%QޣW5x×H!ڬFL_WB2FVSGje=(STA*=QF>i6z:p4 L484gBqJhtSȥUԵ;]& ל|}\XǩzhKkiԟZĚhy&ڔ7m.CIסhGZQZ) (>'\n ?ӶBx eǻ2_D<[op#VeLHs 9f7/ j1$7H`N9+'j/[qr'Sւ1ސ3@֞5("G|Sri <9o i~1ц̪3FTC^:gZ#ț ~F* iEp Tst+=zrd\Q!ڸ=?S PFpy EzUݽ\ʲ ʲ)4ԴPƓ.iAQ JG` æ)b~ju4i[ J*YMsw&(>@+#UL|Gz7 };NҬ!KOsVBF3ҚWpү 1)NMCɥ Z &is7Fh@Pi((Q֊(4vi;GҚ RNRRaҗxۊh棕!ڞs2ZO4^"CDSە {־#"0sK)Ac!R#u&Ni Qi d`uI;;x)\( LrIN)3izsQCʳ}fF7Nq}>W}L\ g}ާ+mV0(zSh*#Pzip:v7Bvkrؓ;Ӟ"?A/s{7 գMv5zFZISƸ/*9$VK4998X$g'4|SR2)q^Q^j>;3sINԓ}=j¶ѕm}zf#Pmiq|=VS4d';i)8RiõYA*`bQ`(/T状naINҧ*ڜ Fj;t%ִ\Ү:Sj֤8q.Ygys (djgPftR6{2r1OC{#{{n㸷dAu<SiɂsHf&ܚ^Qi6S5\KqFi3k]Gi wR}ȯS}d}jM 2)qEp>'i(5+- 0\ pIǖ[⾩jfF0i<"qץ0Zi6̓ZǹO*!ּ953xYEzFIwk(6;#w3J=|[@:UYh'U3qdw_bZ~Zq~T$#FOpgֽ>'|]aXv<JiR Ғ 'ZdiF"]0*Jn)9)GLQek , V^}H:8AJ%p*L&vS`h=i@J) \=)=hFMLKHIJ?h :|ˏ8ۯOL[ܞ^[t<79MZj$@+89B ߎ1]aJ(w4 \QI4 PE)GqMbE sގ )g3FM.ic^7vn&Q~E^_3ힵΓ$r;W MnX={/I֎SLPH>#p@1C}<}>]i,Ɗ2]nP=Wm'cep}2>7;zә)2;S=)y[c B>|g!Q@ 4̧H|[ʸ6]$6`C^gDS࢐\)!R+/=+, P Hh{*ed$9uE })KvA"`!:}IN*U@OJT6A5i'M` _ojp$8Aؠ;5$yT9=O5 ѓqWm‚M;i"`*Egj%dm:>muT=ʙ%9??ƽTKi?B;{CV}i0}h?'֚4E'i#l'4Q)sHN:Pyy枼MS.)ֱ|E;Mt>޸#DH F$n:Z^7hKǩjlihǪ gt/ 9mEm)6o*e^Xm#L`g#ۯx6KMB_6L@+-xaa޽Az-.+ ?UMN?e8Ԏ8{]Btv}Q}=>?xzoi~,JLd,Wjjyi]A5ءyN383AqIiJTMimҢn幩LS=iG+֜8\Ss|hY4Ɗʲ '&m}~:+{qǃ5I>Sj('k?{!c֖$BM8N;Rsj0=( /`ڌԤzVn.^`FN~|ꚧYkY(S < H0+y(ލ[ ʠ סx⾷ мSk}-U•ӌ*A)b=Қ~oY̳ZF$EyJF)3* ]FYbq=ǡ4| }k 2z0Ǯ\W{f\E8xCƵyr]xg-Ӯ%񬿂 tZkZ&~ gPZ(BuϰA4762麥WvRE:B;ȯ Sσ~5j cّcҾ=)ȥM#4Zpg!

|i(>9=}x+KOtwϙ3gux'ď7ïˤʶ*[yA#}IeC#V]~>l[x'NPzQ% ^ih砤QV搚PԹ֥6XDH7Vc7l,<Qy EMuҽJdԣ)JI\zF x$7.1h[14^bgkm>RQ;kżs9i ߦ}$k#@K#ʜOtjŭnS\/f?i]|yQ[ou)eSW}EzZVshCkMSޑKqHTvdRJS4nzP쫓TY$\pձsA47֗ S|gLcI{}`ķ>Hݽrz/mar EwIB(ª=*7qPLv*=j69&xPVV$2÷Z2M`ҥS\r$Caxt- tg &1Ts׬sF!>gKIE3gI^w8X,#On&5x1~5PJyZ#ob^hȤ}:xX%,,Q)@~Z>);X (E>ߠ;]g%"DW TPync||w!Xݟ*6mnu=91N!TF XFJa@XŻ<Ԉڤ8ǭ5 sJ8fP1(A5SP[GI~`םW΋3JqqEzZkVL!")g'9D9KQze~R0'j`p)5" 4iHh^M+Jp:48?9iTd|Km{fqEݽ3 ;E!ܨ}>zW*,q"EUQ/+d6ib(3Oo]I*nO_ m.cF8VxpޝT'#+HUmNCK,T\@n)־Ga 7C[쮋 9#;agflDbC A ռMhR1N@gF}:^=.mz%ʺ\hdn`~WCHEA4ȥ@RHJ8qZwzi-z`Si@=+SVҭ=Ʋ@F^_WFkJY`ij#°lsWռq}/%@#;?U$^+o~ lmm܅&3Ii&qHp=Jz$mŴv[FE 6Kz#=89 ;kмEiyXcR)XqJ$lw`JasHS=i6pNBqIGJoSK8_z^b#rt[+GF+%:ǩ'o]gtNKVh݇NZVj;#) UfpsҪizR1tXW~[ͤ-fl4?Jǧ[ڣrZr~vea͖8aăɦVYW&ҧQ{`IL5mhּA?xP1 GpAoa^3pp^;ңkH|a!_ʽ]Z[`5rզ`k=Oȥb\/J䞵J6R 9U#ڼLib"5hOSP;Wx_t79?s, TBtm>8+|y%4$'nW9+  Կ4i,X~еMzMlvJCGl5dM;s֐Nr6WK$S6A >}()ɧ0vEdaq>ߟ_|-VCHw2X~~ )H7n)bii:S֚O=+~<_OQ du8OB9  xw*߉ |%FmCpn햎C?-x:7>5L6Zq4~EϮ^^t6! EO'{W/5'[O,b' 8O0r˺-WV2rPlkwo x'2i% yr#35׀);F:R=zqӀ8i(擠vIޗ&20zPG4()wMJx)7j@($`sKiz\Aմʅ$F `E|~ Q9}9H.9ʬ:}WF;M/Ke\e>~;@Ե+5?Q$!]hƚzEĻ9Uy7#$c*}8R pcH}E/zŞe]3:/(s8GQ^M'ॷet{d͎Ap2y:g&0}[ٿ ,ʎO]>VnP``0AN4R(-LMHR5 Ґh)7RQ7▊(#4b`dͲ&`9e*e¥'E^{}_:K߹&ISAܚlf뷷1nʤ1,\zKg1^Z_"+KTbՉid i>֝*9#ThUtaVz^ur×#8U_}k׭œEzK?[돛P$08.y&)Fi֔`ג@g}uR&+M9fǮA?߉pп%t|1n>5^x9#'Ԡ@ڻ.q=E^j0vi q&Yko?+HϠoPo†]KV],wOsz|o>+jScnJ5EPӘB;K8`Oj*B5yo U*IPIt3 GEUe1ޖф(ޡlA=*3lH Ja%^i:-T!Tf^Nk]ML bD2*#*hr{TR$RRpGXL<֤PqJ4q 8i6MHOˑBprx2X&X2^qx~WўO)?c]Ex2ß}Ge4 {/,BdS8Zuul'Sޜ`R qQm*E9Ӏ_ɭm7Io2蝏*soJjZdH,/N4qJ99KM JN"wM38RiM4SKIisFFN(RQ o8i pMKE(bc4lIޔ@YA 88bSP^ G/1N9ݞ1ggt۩;L'Jq[ @_= k{鸟nkRCJ('g~jqx>[Y Ѻ \?O+S¾1XE+~^Q4}៭@h)A●JCER` IyjcS@ND_P(cg3ׯhK6[ SaxԒNIbޗ5h6";Ȏ$p?,~Fe#0d{t/n%3r'Ӷ=IhUtaVz\ρ<=,BNHIXg¸'c(eB2qA 5\w\?i׮^@6~9Oku &}n F~}XRq^ O['J$cpOA81SM*X(;F{~j,U8n0:zrR6tɦSH2{S qSJ)1( וecM=3v0sFA p>$]4-#;(}Wzo-\[\mG+I]:S4w]Th'<֥qA4uiX tG@k'滛'Bfݶ4[ֵ|+t[ߑE=O*Z\Qi{}'>ԇjU搖8&`b4Rgڗ$߭=)S#ǥ7|ӉQH!^hK.8рGz??š )z:SOZQҁҌh֐ȁK@$+PRCG:9lu%xW|YeclSL&>췻1 0lLeE,@' =εp4;#"p{E?Ӯ߇|/.oX|={ħrqL]wHKHڣ=)ܨ0IڑȪMF[cj ^14ÚQ;dU݉ȨZz=jh `sLE"Kޗ4P OcIDV9=ji B{۷\c)3:Z01WS>a%M%q;ºt52 NڔԑU$ QjkjAPpi*C,Bv?=ӊ(x9[G1 )TJ~Q@ c!4U1)O]}.zRۧEc*J}=ۿ]h P4dZQȤ=h83qE1ל'>Hv__K y[:/lWNnYc! r o xK:Pec e|p[n7{ׯcX&߶@=8'ֽh-QARb Ʊ8 ze"PY.cKL 2i@QA@S%+x^YR4^oxw*?ى9_qn~b?A?nQGixsc&M9AZZ(h hEfi7M/|PN:W _>w%Ʋ\FpmnQ>xw_Qt-4b&#"Th05g4S$Dv8F0K׭!ZCƒM"9 2h43KLkE!Tbm94J=A=7_Jty4xZP94c?e4 7 qқӹ#HX A"O>=P5킬wdA/~ǣ%o~!ُ'gVvHƃ,p8յ_ /JGzoiW[x~)\8ĒYԞ* Q6TNҡb;NFڨwu␸w҆␰$cHH)4\9FO=)0Tduo'vH[ңc5 I"c&  iH䑊`h4pҊ\'>ɩ8S&ԨEZU < tqSFqS8z֞;qNesJۂhMH6T/4’:҂[ҁq^7'24U9I:RZo)25xKڎwÖAQx_O.IIkӞa{ hnjCӭ7ӱMӺjN7S.n!ycY^kzu(gs= 4~d_=ÁG,}|BJO4ҚFiZv҆JoޗIO/4ނiZ^ }i fHxϝϽL4twghp*t6Q7Bug5ph#8An>,|nlnXqU!b ?j'š6Ggbm P[sϭxox*MgӋ\hc:x{džu_ ZVgU ȭSݼP}{׌z$~5hw6, mȃߊ,c F! 4r($g {[潧xODS.V+x lp;/ij,9vNN֑{}HnV'|1xAHbfB]"GC^! /.S_h͸Zs|Iwmyp͌䪖Pu韥{֗]ako(װvmn?g/-|M$ϙe{z/K+|A^5I=[sx?i>y{n żb]wZt[bQ7Dq#U?ӧoVr@ EFO8j\Js֢/T{V8PdсTB)2DڠXSM+4G&sGXnPmH H-.9KQje( N$[YlF~␜iŒ◭A{gmey m3Mq_ZYIDƾ))N#׊S暤1C9Z m/|ۻGbfգ9'4i[hO [pd[v:N=~5S^?ŏEo@*YrƤa'9,R8 ?Z"?zCk5QdFDܒĶw"[NG/!g"qls9 '8o(|wG鯥ge4j&D ٳ}1ڽwpSQ\^> Fg9?#^]@"r*LAUuK]* ל&[d`sc}?zhKkgYϩ>{&is&Rg栎gMjk8BJ#"y:Ө'Уu?@G kҮe#b^\DTC"VcbNYPtdc;8cU61+Ӵ}*-#$rԞ歳NT8UpΑj xǽxīxV7c >R?_ZtxgJ[uҭXkĮב`W~xLFHR 2:qs'X_G)N3#xcңje0T.5FQ3P!MQ2j~܊aؠVy@2jF^j 5ٌ֧' Ӑib [ϸ?SS) Y~ #=(oj@Rc j6 ep:SZXtqS;T*A!jdPJ:US$qڤMz M9w/tѴ1ҕgjUߥ#:Ҝ3N c R)9y"gւӵ7ip)ǧ<7krWh?w0ʹ-7֑1zGh!Yu6i֣qo_J^)U=cQҬP~g>zםZ5]͘4[cyGӴM&-l =աZ2(i<ܰlvTs@xUQ'_\\bMN{Ӂ?ܞdrii 9".ib÷x%TuĞۏv~WKI`ϫ5"'$K8}}q)"4fIt?ǟ4oZF/w@`(=te8Q5ͦuc/4Y:<SHZtu=N& ۲(b[ܟfO')4.E!94x@ui)xF:b򦐰niTlد#X綊I"ܤ@%xVۃo*_|cj'6tʰy%mg$WܴPཤ#f}2+W_'땳Tlڻktev-SyVG4̣ΟJsIx~߄ӯ^_5fDWZ7Q`x q\ -kQ?T 6c"RǸ O 4χekF=Ө^Ԓz5h푷NFLrp6Ckv5/GCkmJ.%Ybq sJEgkZզ`OG?3A5Z5Cutާ+ll-Dbw>FPEA:IcԱn9jxSqiqTZA]Fa fIvԓr@wď.K;(1!8Y>P}w>"8XI.oX($s^_X|@Іlg\ڗ7np2r=GPkPb4RB3GJCzO?_. >3>>&jI|>u`69j3^e{xI4؛7~zOfrH[E~C['- r[qI'vxvwH) 6 pcQbnbTҐSJnh:x1-\Q^4Pih-5)M81M4H9QOhlkxg.BSHekMfmW3̇W cj~z-:>^iowVaV f++Z֬K3=e1ϷiixSU۴VHp>+-l!K{hq QS3S@IJvnPGJvB \ dn iLr )O-5 qФHF]NCЃ\7j  Y74v8R*vg{C"i\pN@u5M!8Y Nj6']M])LhgȝJdpG@ u -@i,ٞ7Vÿ Ow +xe)FǕNPIzp)r0:҂{S&()A;bP)Z$PH# E(F~ZJ1F=MD0Ҥ`i#qHNJ|_?rWclQ,ھ{:Fb1nsS<߽TZGڷ\R5o`F{Wgῄ> WQ\]SŽ>[.|E>qfl}5]ϋ< ei4@!V\5ތfGz)IJ&*OkyxۡƼݓVIO ?ar+-gۦI@kĵo :xcCmpgst|Kզ54%n [ס麝dVn3 B;2̹qAA\nꚳ'g\H-#5HaUF +UƢ^ⓐ:5P}kU@gQ<^jv]H6ЎƨĶ͉n~yAѼ='ى }^o Alh+OE(6b$$ŏF#Ч>"xNM) y8GdtWm.%ҵ.B%hs O^槚LdҞ8R݃~wp? = }m Bq2 YO_t-/gkbD[:#^xd(*_ dHyh᜸aۭeP]IZ874#аϷPsHi3KKn1җ'nk;4x>OFS I Kɕ ?ALw+#4oX^0!1(,q!:Oq.; ՞ZE{;~txvH`'H?*tM{K.ݥͬ >ƴZq(pJ~4W SL'npo9Rg6CRqoJP{[0\yN'W\g_CW<'IjwQ&;0쾟ju  T`03,6g֨;A4٦E!V54f֗7*,<w<{t:o^T4P]ieȧ$Iz>m"rbp˞=9'< \į ci"`p-PFA# |}:zΊgL[ƿ9SzOQ}+h-!Z7zPrOJG+:Əcύ7?Rns~G&3k^PvʻH@=i@(b8Al#(-gmWDgy~79DNei0]tp38kl gގh}iEnpih#4tMf()Q(>5qFzPxM(ϭ杸 Hw1iVNQ(:ןgχ^Ii;Asy"ZG"[bj> H|%gMB+N#ywpAsw^ńm`1ppU 3Ҽ ^:kkI >QJxI#ܼm=}*L8BiA'<smHH'ڕpRA8' X@+yǭ~}Kgi7.8L[Ip>P}G]3_>"Mm32Z Jbo[} wVA V%g,+11EѼyo{ !nT,bTTn+ycmpW3DktcBP\AiPp_j\Ey:ietK/;\4bU<`{"wkK&# z|}N}<Eo=G]b{tYn xTUrI'hH4m.ST8O!r  qj%g >|M㈣Y$Jn";A鴎߷ף+߳2zlwNsoV_^%O ȥ]AV`Qs5knleh #v]=FYEn9p-|=Cž*t%D ?j곚(4fAu1?#iE)/ōrDd a$#H>Ǟ\X?3,_o%7i7}lgε9ʼ,!T HvF{uGb :QHE.8v(^Qғ[RBVb84}ơPUR1j<O03HMH W>A+nqvGoF^ѭ搦n]LXvu#uXw:R[e 3 z#KQկA)nʃ<+\KkB1oAԠk?]dm/Ec%ː4|OSDž<vCRQ%"#YC#25:.;x5 Bs"btM|<7CҐhU43)`Ҋ &RPV4FsIqFr1@uL*s4m4c(\PGcx:)`WL<ɟ» xO:Nc(0G$1Xe瞿X- =iDs0}z"emoM[xnc$ﻨ~ˑU~y4rB95&+E;}S?/JGpA/ۓFqnQ1;QHxUKӸ Q9^!4ئQSUvni7qU.j]=1PM'6[Ƣi12m5Y>ˋW㎕Zz]ˈ+@W=OCD7!eau{/i!T(gwmu$XYJ4޿kMqEmsmwmͤ rKV p%|wdt;*G'S0YD+oq}/nP:QIRȠN7n)gړ!4 qM4w^Yܨ4a*T(# i¨)F *x$֓?5 O-em$cB~?zƃ}VzuhU@&`>ώzTdoqO`u,]e#?3K(ׂ~]Ka/H!ʵύзux|{Vq/2kS@lr0A#- 4_jڬ"{:Gna0[gڽT`ڊ)ɮ;~ ]D;7k_ Mw:BrU%݂F?dWص/۱MZ F;27)8Ԃc WHdiv /jkp G&~yBҊSMsKڎQI9C!~+v1֦\)I)hF((hP1-␮i1EQ >Ԍ +m8!(n٥b"Llp e:&-.]7UKiG̏ AssfMZNR+]sUV] KɶB}>⽲+[X x$qTQVP9/ᛏx,]Y(y 'viq޸ 'ռ5g-K 2 K3>^6#iWkCoƇ[P}O/-,5^#A%N1brHUٶ 䃓LsU\<1k<s 9m^qpԑ}?^sJOn*~٨sHWg) 1&p*qUٸѸbF e +֨951^2_&+qY~ESAZw2ʛO^jlo)`21  _m:|e3 `qN-xȧY#)U<"5 PNTpZc?dx6ֱI@~i\_r.OA^ iTu5ƍq.l K|zg Q1ϪOs.nZ%+>ig o '˻ -2?ڻ&.7~]r>/!ʊdQj731Ԛsw'>v8f=I_}+׆ |-M}[ٯuG^ow-mZ3 |pep>GNMuwZWվьy ݙǶ.߁:Kͳ"9P]W/pAj3\On\z@x7wb.4Q]9[0F^)RCM#ɴnʃ8KLͦ[[`(-m޸9;uEy|l?xVtn 6ߥz?ϋ:Oش-a6ۖ@:n3MzqFriA99RiZqJ('4 hIKSO4@E!h :J)szҩ8=&ig"s@NPqE(bW*qzZq8H8ּw.8:$2{g'Ytoih4od/Ub98x_Ζik37l8 ?HTdRP)x'ironcP8ujB1A Z~zb\ܰgc`?%^ Ӆds71#mV<ȱǀ+*:msl+{ٽ axsųwG׷v,u7?ӧ)AzKHsMɥh<ҁ)f}I3A{ciIi{m ͼX{r_Eڿ=mvYZmoE aGS@MaĻ{bяjQҖ(M4uNRHEB紣O*V;Ӈj Q3F)1E&@N#ޠ7*jpQ'֐摇Qz1K\}yC)(8AQұ9 F$8x!8ׇSJWR}=4ciBziRL!<)wUaLx8$VHjxrQV|Jy JJXNE9@@#( K PvRHɧ!is83Ҕ:^#HNhs$;~UѼCbK(k@D5 &e,S7R/ r9otIU)B%L?F=y_BH28B !J*˨l^UY+/]OڈӴ;%9 1??0Peo˟=mr$oHV8ϿZk!nK2p^j_m&(Uf2}? hR YHC_FH?̈D`d{i}ܟoO򯝾xql3HX#zrռGo̰6>׃W!g/fs7<dwKP'1=4sH#Ң4x4RJ0)sH4"sF3NGJc2uٷgTvAA/V8@ȠucM?1x8>Ƙɧ{AZv8sN) R{y@"iN'h攊5+jXkTfl6s"~#Ex7ׯ67od3~&mX0-^h;F>gxi1KE%(^M{V(dzj{SǚF6G=p?F-4+ojd>+Eh4 _Γ1G8|Km~w^ /^#)±G^K2=E8&sKM4aN94J9R4 (8֛JQKFZbJ죨 ;"J9Z0&9wdRwџj? 2}(>ԘjsPKmo3Ϡ8H= 8H{ҳqқׯ4iCp?N:sqMn)0=i 3y[iwy $OR}kήo5OL61oVs]敤vB>WXr0j) `9A&'iکrHȨ03Mfc[zVFCmG'UiZ։qI+]jC#  F$9FML&wojg]j^9K2"UAf-Q.I0i֓S Q'Um(忳5m2V6t)^_Dt:=6C˹,®R)n0jUE[L*Tb2J\ՄVR#5:zj^7֤SG@VTaqVjKVAlԡwT.58&mI3JzjC*@Jr*Eh]i旧Niiǭp/|%O6p3 {⼿?ң׋t!*G8\1޵|WM]6k/ \젢MD#y,}[| y"Zբ+KhHdR(N[<ZiqjVoww(%9mWǺ0XDcսH-4[ϩ5xڊLx_񗁋-s4МH 8 g⪠o .$>Cc?=)=a*[\6@0?LcA呖"UsS-dw.}21S\)mdl7>IqJ?⋭ƇbrbWx͵уp`r=%8ܟNh.==iˌS.![yWtrGῈ_PopU$)!rQQqGlo@ޕqK^!P|]hO&kRrK)F< {`v&pzbғ#ޘۃbuzC>mF"jn.,nไ G8lRK))Z;9 ъ3曀qNH~)wdԣ\E sMsfRf4 n  ֔i:qJVRG8pq9"{sҞ)3M8}m+6.xNɤfR5kMɮ$ڃQ^pWMUz7Wimby'R{ORf4JM SY5?&mACGpnx#R:v%$9zMsm* ԝ)APzRQQ1IJ.(Fh&;zדBaMBM#I )f0IzgA?Oo)Xf}>xg-C$0z kIMĹ tg#=d{ bD#8ة;` ԀS!EtR7ZJANnY2h JNsG474էgMs@\Rڠ O֜YMP57J~kh޸c=1 at8Zkصܘ}=UޫL={z&Vmi%'Djiɨr:p>bMBdPˉV%ϽU$w7T9Qck/X-k} ܔWGrv:M?y};hE:Ҍg8dv+94F$l494Kn)AǥutҗbdTJƲzB[sDQ9cj~8V(q?;8,-#b1U=je*MSsp R('Lڜ)JJhՓZǐ~돼|2>)$d?ƽOmu[$I~`ՠ1HM jvsE-(! \RgR)(X,E@Yc’+?g ^7xQm Gxֽ~\[AC^-&K7WJ\:)@ȦE(E;R&((4 R(RLҎPhJ)iҚ:ԇqb4iu5M(4MeܣڠK@د<|  7>S<<9GVE*֧k%'e#8탎TK? c>%ֵ,[`ѧ,k\dרS⅖x yRl9隗5.GACb1U sHs^@3%{p;KjZ*_ƘFӊ$-M0P1;mZ,8L3:C5|xzo omx:7OcMs4 4j͊F4j0T)&8sE99n31P;h=*rj@З5i?84j0HP⬕RY@}ǂjO5!SIZ|* 5b![r*ҧ5:201TEK8EXFIT━@R /\ӜMLxZ18.(f9m.i+ĚՆeNwohөjNd7 9M;{x8TQ6))ȣPɷҦR0*844vxɠVfkfy }GWg}xT6hfa=L\6gذ%1-WG'|V!mHq2)u%#~Weo3n$p+SIV UHOH8_:&Թi Ikݵt/\v_[Qַ(#جeOsoh6$z ^)QFqHi4g#4@H:ӨMlfc R 4N=)4Ni҃M=hiǥ4u84R)w֔`өr(x8 4.hH aֺݸ > ,]ŮFC }5+%KuE4UTyRL {U9I1M8 \b4Q׊&5)SUMBS!$Owz]WZ-ϧqqoC͞f.m=!"Ih4dii K@g4RV~j:[ym$oRk矄2泪KH1I8>kD3 pCOͨI=/v ,}&IN#L"duREG yfpx2:1x5[FA8#mGݤ'5dž óX7'\RdJ׵xM{ǡw\O,r)T lv/ᓭǩ\ʊTH} ) ,q(ª=6^VJQÌn?A"U>j20x&n* ؃H_9T.Uݬ6X/} =zC]%l@ħCS)#5B[il)y&&j9U9%uY*ÑVtcBSQ}ǵ2qf|j.21U V*iw|$jCN,3VdQR(\3TUUVUjeZp*IȫQ 0^:UgJԈ[5.ib 7G"PjjW,6dF=k' zx.KKX͎qOj;{#]GVInl E:`yQ3xZ)O"sj_q=;ں`E;"昩Ӏ4M#w"'V8 /- }[oAQh>ƶ9ܪ__+!T54TDUQ oRҢdb2iE!SH-*q ԆfNFv~Wo_BvN c/zP>jv(%hQ]Aci5ԩ dG8dx>ZյfFnTY4?(NM~3Axm~eٟ\mhQTbf(xuV8<")GZZCEq4iQxT$ Pq61iA숈}G^ Edpd$wf<<[t-&1!J:Pi;i QԵ7Fke ;D3,`@I5Oj6%Lyn>v3WLҊC \Z)9()c9"z(&3Tnp>-Zns{pvm TA_6|`/gxbؔEQ9I57 qc34+ 54 CᏉ5 Oڝl$%qޙ{[kX~[_:kr;mMU8(y'TA־ e6^84Mp_=ꥹX[2^Nq޼MOOgLYM0Utnͽ4Lۥ<1zp }x'iPl2IH ib7B9 I-4ܓT8AR0QI=j#' iP]$W0Rx`:bы[] o3~2ySgx"HA#pEDynWA3SLi'G,d+x)`s%Vn"@8aA֌ԊըaSĹVTյ4 ߍ\=^2 I[iYiQ>aV@sVUVѮjjjK`r:p*zc8>++JdP*{\_*1@?u t-ᮊXeH>>էYI GFPC) 1^/>7xGl(T1 *J6"MbTJp2)O \O*E J^I$`I$wO<>\YFyoxOg<@'\W1mgz>l{*>+YcTee# :T QjZu&)1@4?-*r)R(%[}u 1jiak{jIq dpyk:zfeC}>Ԋx搚CRx^Ai3i Bi?5iǑoZwQNHO4 wJ0)1N QB4hJ1Kژ)=<LӺ旭&rIsI␀:S7Î#|܊8bBHI݅(_Z\ RQ@5x)ӘI|xf"*#J5]l4ސrsSWwOZ\z[鼈2c,EI9W|O0;馘Cy*P8vSiK(M46DWF2#Њ{Ww2&/_}k׊m6Ez2C?z 3G('+3^l<3]j]bK@IW_> um-#8 "V_OֹO#xe[;_޽'Sׁؑ^GY' _*PxOӵ[5tȧ#9_oiwW=&9JjaEmkdb;5yړTFq};C{Q׸^c^e{mX{e:Om: "C)EO(iPzѝN04GSKzPM=h沼I j—K8Ls~{P?)c6rI|8U׹CJgѵMBW ,FA8+ӥ%,5ݲGqB_XӤҦ <țGO?I[祿#e5>k~gUO^Mg,U3RN{p9i'Jѻ/SM93~0M;}Cޟr"oU_ D֓͝uOn^1JFF\2E3P*Bd*‘Ңq3ޙ)Z+O95W94^B8I|G]'&M%qH.Ng8?J6 Hyq񎕟$Sj`?CLU\2oF$pz{ 5ͤny9F]2Hx댚]}HG-*VC=jҥ2A[*B=jJFZ1 T*@*tRWZfm Ԫ=A5O ⤉2v8 VAOzVNi"#57QN sgSCaL@#5$U #gc(_JxPG8q|%7saky e'uml`=ȯ2mr@^*{+(:r8~2x?J}0"%[vŕN=IU~_R75RaO`Hz}0֜I`:ZLӁ@zӓɤSֆfaҭ9H}qeԻ@KCcR/.ycIR)h! GqU9ϵSz¯k]_Gw0:ޫ뮿Þ%\Gtzb۵FION4W ¨XƾQz-Gfekq$$z20`N9sN4j2q>9⌊G) BM.rzR`P)MFGJE5Tu:BuI1QHiӰ4g=MzP3ޝziǩM4\gӲ1HqI޸xȤKXrc͂1ս}zO?SPԔIz~dCȋʊ;zTS[ N5HPZZӿ֬zZit9siQKAFG7؄l'b#*\J:GZxBk}22 }PlxW1[_eޗޭ^Jj3%)a 4;P4 ^#Ub9|OrI&K M%Ο0Hs"ewy_z毦k6vi:0u붽o|&[}VQ(|kR\U$ԮU #i;cO}e |3AO\d1šw55ݺ}bckr"px봐2;pG8k7w:&Lr%rBݹGʃV5R3 N=ip*`g&#9=#qNҜ)^WkH;ʄC³~g|+BKiIC,3aWke#|s4ZQv.uGul壃m+j'#RF1M䞔)F1 $qHZq^F:MKA"iX뺼oRTwK }YyFx9<>WmqWS3R Xyz1NVbCV9j5隝H p榋8F2'ږ<;Z j줨Sx!~u!`>PF}('$xǭs~!oʳDS\=唂+?K=}&;ehTJ'iEv: R)V5ʩ"Ҁp 0yN3qM(sA 2R0A~Ѯ?t"ȱuԏUӦY}(;I]> ǭ4j6y-!y2v$ߊ>5ּs=LjĤ# ݱ&]/E斲떶wG-|0)=ac޸ _ QTpp1g|p\AuYM*"qg$s9!o_ [^ٵHT|O ۧ=g X]qyqj|dUTcjz]piH*ČWg>+46Cs z@.l܍=TGr*?G&pZ 5V2OSQ4"֗oS34uT s9n`=)KښZ@(gTRT N#UƱsurQN_S{>B\O[h] `yn!9*N*dj`y"jA"Y ۷8翽*j6nj)MUcP?ZbۅBjZiVu!X>u'W sFeŶ4$}:Vp^ c}4^M݈ xϸin;fz?#u ֣oU!/b1T.#g@n=jڡU6bsǽAdv>>5.%$y+jtxXKl?{i?WK2+x' x>"bh Ut}jJrSRALa[SRE4/5,k[zU׊ZqV#f1ZUGH#9>57Jv JlR#Q6ήzӈ7o"A!4S*NM+`q@QKU$+μE⛝vCWh;^E4}Oxg¶ Biv| 'e=οh? ]-g4r2[}EѵXMl:ߖ7w)2'$Ҭw5M6zϏ~?Z$YGmCR/,ج#=x |K׾NJ4Y)\ Otz_׾:\jvMqyiA<| ~ |=qј[c p:MA.9fE*SR)M(6ѐzSqN,UG: g?Lw*j-ূ V[9W)Ezp0)3PYjsZ]“L$Au<Exν8WwOqki7?f/=T]ޗ߳ev.shFmňmd *(; SaMإZZFzR41IҞA4sJ@@8◭!^ ?);b0sG&u@iݩPn94iĊoSJx ANE8ipƣ$4'^iR4^uk+Nby= ս]w|5k[|&#ε܍=)cK4NCqMvaP33|0`91P3byx zv &Xڀd|U|oQ;DkʼXhbb˹? t]/NAmc 0I@Ry5xvXZ%&j0 $WKJ]WvS銕sTj-WG@o=#XeqkzJ;Uۏ˾N=*9IXTgHX{8UY݃QDY+De r5&g8Bq  `DTp~]E=q p񕦋 7Q/&vԯ=k|MUi }>D`g=Ns-? xrEɊ0\1$Ҷ N ԵYgл0Uϰ- x/ǐ\Cs3a$3;@@u ,$NLrHaRA? ~k߀ ƓR9H(?0Q|aISOFy)<FSF));ӱF)@␌N'`<ԛOzZiۑ@3ӺL1M<{U+جAb535皖xR~Gd$?k/~ |U]M7zeYWo]G+q^mwWv_k:PhEیy]?iż%;Ud~CUp+ 'MH 1Z@!=vʯRR` kEkv)9 h4v("M4c0dzQEP40.sKHIh\<)oBflW0ڹBU8đ^}"+R29SGJfIgր8n9W4 y F ;I8p)֔q PHHP]Ass* c,^oj^9` 4-A-%a9VBSy=<N nj+gҘ[}1ZNWj*f{qg5VP_BG!f⪴94ҝ: XɩTXD9 sN[@ښ`0j.1NU;L@|vI58,M 0I/om-c1cy5ڟQgdg8'?w.kY {UdIڜK8*U^*5ޔ Pz1-Ϲk;լ s[V?@NkA$IcWцC)4&q9E+HTbkx,pdWj|EjxDiM3 *|T_hu`-=c RG4j bہBY$ef o s7gY_ Xd-$7 B]IAsC]6=X־}>&n5=4e^AT=cFqF(4r٦6ru5'jMb[W·0*cs@\R-KIޔf*x{Dյ <[X˻w=W>#/fo8? \'@3oBv]w .F2pqٯQƐϥk1'" 0'`r0:תKڣTnF)Ċj}jvOwy(%Oyua *` cՏa56i<sKhna%e ݬU>>^y7Kx$Z1s \Xv~VDӢ=[Қm)qHH+@Q $SHNp*m`'gSEW.0 Ӏ>QEQL 硥QN&iA)%#tOnؓw(?w8c+CIsiOS}EzT\A""QA9қHy4Ru(nzT7<!ps:Fh(#8⛞ii8Ri:ӳ}7qkgRH>ƀƔ#fi@€CRbq@niH4*6Mww(Hwcs^tϪUؿS< -3I09f}Ic&FÚ0N)J>2)0*lPJvd)9*DXj I'jQLsj8QQSsJܩ+Uw?5dkd-rH +Փ2麼b&<?P3Wo Jr)ܱBzbP c+3R>eu>ՉteVLJn]H QysP/y@y#hqHgڠcE=AqR b8i1 ~tgl֚ :~t5MqI׭*HYxVc^:UǨ1:Vc_jCSƞPAS 5a@8:Sig T8#񶍣=' v>8JN=(BxʞW+ IɧtPIZiXܛPtQ9;U`c3z>iIkgHגz>5sZdFhIԄݧ8!zTHӰ+~)]*HkJd:xi9[6^ h}>fX!W+v׺˖)>T ~`}9#5{oi%'7#AҀsNb)SV3/oR)1U~~ooKz'Z.-.ZN$*zW| 7_21 .G_Dޞ)A氼K{m~w^ z-w:>t8V<_=+ёhX]nVSGOƖy(R84)8༵$ Pʲ|#񯂵5?_4UIy\? }[;㏋mΛ}-$;%f0.:0̾dJo 钃*XEDAGO'0i4 b₣u)@ښ(,9$5x'n|?B91F8%# N2 )ff=IfU prG=~u?x<e'u;'o0E}JMҎh")hJ{Q!_7XVp08>۝OJ~ w:8]Mv0>v &H9R:dn-4V $`(;c|esGjҵ&j7ﺮzdYiY舿yϠV`8 >KKKHq :OsVF(KLRH3U,N7| /?9<oެ׊n4<$RoS[SQDmLx# |jm&~jÖ_ =L ^p?"u(j0xVŞͼng.TTz+IsGEr7kq rF:NxO|a5oݕ>M768ÅIhMc:͎3dݗc{FTqIӻP h9wqeϕ0ڸm?WԼ;QGȒ@yעYj0_ē[HB*3Mǭ-␩=v@SSGĞQ:[ X&Ć~&( P:G!};zn?W~e"??]yǭ5M>J}޸󏗏}oƂ~(⌟Z('bN)Z򏏞g61@>GЅ'ڼk/eq n7(>ׅ(y=}9R g] M{A -XB=GwR^^PWāw#>^8=h#ޓzudki\6\*~g?zk3MC0vڀz.zd|+-ƃsk-ޥf'-:1SOP}G=.>5ԎHf7~[h,c1EHF{i#yxW~.u;Z#DlᥓFp}:krˮjMy]|Lz+ ~s%ށtwLrຩ@5C(e9E2ܸ?Zcny9imq8Pi)3J ֥?B1TM2W{K܂::ƭ[#3JE쭏Ez6)ug&n>v5s4bQbIڔg4LR)qIMe Ҟ(^h 4c9()3JM9 A?WWPYZuu4pAY*Wk/-PP cmIծԭ46R$BÑ*+bt47WG0=4)F.})OZi}(4O4F+_gS\8 {h5#ji1ue5P[mn[Ʊăji`qQg @CPjCFTf!?ZOCQHҠb{> Vn br*&$3Qz89T &3`怼RQ LcLPHijMuR3Ucӊk95RUsP*׊ym dOs&ҧۍ1ՊD:6AǵI|^s)~ nzR7#F1I pW\m RcP[$O 9PeD`*KV8Ƶ:[Lb^*dnOZ*-Ӏe\u,p\=#g#5)&})Q֤ lR:ojSRv)-tl$qGs+t_[Xš?(W}Mz4PCo kh0 x43AGJpJF;;OO̿O\L̑S[]D%xGu`֒Omk8kߡC  ,?.[V/dhy ~UM?~2kmSP= ۝%TJħ'c-5Qc5 ޑYvVY?2Od6s>|fru CiGs2"?Bkӭ5 ơU@RPzS*Ei (#QMA cG֬-C yOxWC=#=GXwc^VZJ&>v5dtLfo446ib434N4qMҁKC@PE 4qMb-qUz妽d'l8H>ކ:үg4a$TvݴB~jSIFhi:PO/CE;78'4SqHq^Dx-'öD T"7dEMk |?<.#w*bbv1<{¾nt(m5hci!Q%|-wLem.T8;W=Uҽu(# NIZ RcF8/>V>Zmx_v\χ/wlkrpe/^k*"EUQ? GHMr`phPvmcGPJpsUbEFOUe1 5#GjnWj$ ;u#)=魷A)xiyqV2Hi_&~gq!gĒ$MbSsߡ5os[<^ː)1i,8 =PJ楏*EjxҧE<ԑGiF J^2XEp\"`Tь tʫO09|zT>(9Kښ $5JHŀӁR=iR ByW7ha->޹ZZ:κ]Cc~_B}NR0 )Z4I4)<+>2D<:[).#O=~!k*淺FacFc{`{Vx7T2FߟG<%=ui %??J% BI1JI^{PN>SI9c銀=0Q#BXQHŞWw>9Q;1Ud4xkP75ކӭ5 c9R#kҞR)HdSu(zSw*Xr)adp 5<2yLV]Wy}*gm |jAjq MZ: QRJJͷržjb6(SFU^XDp*S. 15:'5a8H7%B 徵v7Gnǜ#2 _wkUzwX3<J$n7w|tz5hh'//iWx7/9)A Mii~ǏEXﶝj<%_>4-v,yXRs'$I#p0('iƓ4M+ޔ5NihiH(L& iJS$1KSEUe#Ey׈|-s]lLꑝr꾣t<35|NںSҁ.i 4^ʬ}yC)҂ji)qF҅H /H< tH8ַ `؃Ծ^O#*MTOJQKx >[;<=Z~kXXZ۠(Ӣ@RK\QqIҘ8L ⸯ62ǕFv+<+jj>YoV_^▂r1Mъ1So@qMQAx;W9 Q85^LT=rj'lT%]nF84c5 «4棐櫖c7= (894* 5\Q'NXv$&EҪhڐ!z# wa%Rp9 u_iit[ (꾾p3A\pwV#J#:9VXCT'&xM^\(6eNLNڬƼȗ5f8A9XT ҧAҦE5&T~F'4$cjP9 f &Ҭx&T4b[E9Oَs@;\?lm%ܓIga}[߷ץ xA-Jj:$c#nDgȩ4h=)!Oґ~ePGӈ ם|Xt;ѣY0ol,q }G`I5Ҿ1xvxCk\mrZv-t>(ƆM#L҅\4<;)(H~ 𝟃|-kZ^iHC@op(BN)7RLSI(- )\ѐi8 ֓SHQKTR AH@eSVȩ~Ѵr"8+ =95y@s*b& x_a z~cv!K4+˿ b$ '>o~![ybsW!;#|REy'ϋ:.h{hd+nfrڧNxwsLU8 T3ZIbH8i C*`3W F)qF)TҒ=i:JGJCQUg?zcw֬Qޜi=ix5 Oz͹ǥhAG9 -&i3(#)"9ºxg)GAFi1H)ؤ"i–IHhxE9t0*\G'Z^zX·A7~^▓x4R)O#gobF)qfv{4Zq#x/J4BY]SGu O $R(dt`UAE?N(N3qO ANqF8#jK'xk1߰1=#UDi{HƄ(J`R*(uÎdYAP p*R(FE|v杞)ӱLF)xQHi4n3E*pNiJsRASAniå!Pzb BNh#p ^OMa9-w1Cӊ֑m.~N(R!QZBI$լT#%Op99{,4{k|+9|޸={⟈>%2xoÚ<سK| ªQ^ I@drgR3M tM#Yqsy#>"Xۼ|=^e X)Uuڑgy$Mz1) =8h8 Z\ SG=i#.Fi>&nsFzQk|IۍVBC召}u#eauE:AzZ2=)qA\T`wz 4ѶOz:RA7piR \J8QGneh)sIh=)fPi;ҶhAi@4H\g/,GFucH^.Wy鵽߿ׯnPI"ǾFϭIt969QW'JJox$Tny<I+*"p&]/UsÃ(O]G<3k +-M쯠tnM;)1)W'HCp8h')rHȧ/x&9N</\PyNAcњ\RGq;49o44cFҁAE/JU< cSN7r7ž2tUwIC]sYt=]z>z\$~, X輛K{XGH"@UB.)(ݠ B84u([vhf()SSNi3hw4ɥY]R4fc5o|Sx4718b ^mķn1${8YFE"˓֤S/J(4 -6y VvF0?: 7iZZ(&i4A(h&p8L1ANH=vFM"HeԃuK(zCRS hSr;()r)Z5ըXu%#>.O>2"K'=zK@|eɗ ΃p;𡧈YG7ϩŞeXz)u9VE M.zS◵*59N\aO44$)g8^ycY۠xQ^rs=]pA=Ga 򩊜g)4$RJ3֑#΂EDFEDOμS\*qMLBZWE?WeP>Pi;H*i*3֠uF)% "v8=Z0!sQI1ґFOҥ(TNGJ*\! C+=* NjEˌ)i>S_< bɪ"ݡq=3JZ >}*p{񮋓ڜ(a\֨^Lƿ(JsUӎe#X8(f4URO U(Fn0jhSi楋qnvzذ Os)|.6r+2?0ASzӾ771Isq Y:RnGfNx3]]3Lsi 5)zzu^)&iH9fJPuȤEG@>zvI86|۩ǥ'O4 RJE&8@= (&GJ-i4p;Px攊iJ @yN&ޔ))ATo'NM)HN(#9>tl)ǫ+^*|J_FF%> BY1_ҽ9RhH]VSA)[%:c Oi*EVXH, ~~`4sRhhR>+|q>D+& Z y1TTO- XSoM&4\F8? xCo3.a{`t+܏JNobr( E;&jhWRq'R{Ak.nOjZ$?ޭ?E셽yC |Ir?3<6Wyxww@_r@ p-U @|dJgvAO!𷋮])9u[6<#輊3N4QcsL-AJS[kdiPxɨ0g&IDNJ3UuW Gj6Y ĞjXg+1DPQU1"VB:9sP9$R8UxX6qޘaf?Z (N*/(g S o:⥊=ݺUqV2Jǹp򷯱?SNW)'+FGzGCQךNF#k*ZENJ{UTZ *)O6*eCAT✧.j@/*c*X&>|҂Cf0[44 OX{#CM<늫&oa슈Rrx5_j0XDoV=\נi5d-}M^(l0uݸSwKiå88늊Vt&i0i8OJLsJiA⓭+Py 3O oCN#5zu-c2HzpHXW5DFf(摱9Ǡ"[v4-}d đǩžsNpϥkZ]v[dp9Q+r)ǥ7pR@iEN#4'$Ӏⓥ(n)M8)s^دad=.;ãvG}WN8 H NiqQisRzP)M&h)WeE,GRNFY:2C)4)4)أƃ֔n.sK)ZVOww Hcs^w$_.0`矺yrkд&F[[H>qMrJ[(HmӁIZ\RRbJ(4`QKץBi9&)sJ:PE'zCJ:QE# x4ՙQRc =hA8NRb+?^7#úYi)o?٭mG^n@#a (`WߴKA=sV.2U~;2 vD1UGd ?gv>nXCiÑX5O*qeĠj_RVtQ!A$>[/-dAeEJpi b9&S23R pzӁȦiisB 3IR CSA#)Iސu攀i0riFNh Z0(5궺=]]*Z|{Lp~XǠ{!];Ml0Sݏ=M0mq;7tݎ3pɪx*]ꚥMns>-4>krV|q׽,M7뼤?V>hJiR[8n;SCJGsQ>zcp*&$sM=jm^:m35GYԜcJXj7 L4㚌H4*L2֋uɥ4*F3FPSYcIc.LtX3ޞ Z1ҧQyl>KQ!lujò.1A\ 0j=ՌcV1=X:uhq2}Ijy"E RJjLKi h]M#osJ7(GKsZ^1H/7PUYoo&&d r}xf_EuOx[kkYhu.XtD }39k_ euǹ۩}Z2Hu뎸^=~RǨKwf?PGj7)ӰsBƎ=(VnhvF<$c9 kMSǚc G m6-m"ă;ՊCҕ@" )4)&'qU?ÒӅ-.8uE*QE.i (F^t4XR((S9-< 14UKik&5)CvC=TjrbF0Ns[2~ґ2c C2~}k|Mxzuug1lQJgrzM}J\gۿϦ+$H[#OJ]%b_ڮX߻>|8:QF99ƍgk>Pkm5_E™[<}ø}>TKID?P}jl`zӇ8A \}*UV9)&\2CH8HbEM 84(9#hJxRl4ӔqAw^l F8T5if}OvJq01פZckK1*j_;$oicdOrʪ[^7Aɏ= O $oX_f 5O¾'_Ci)JYUyXRs'$眜di_#EwrH$\҆i[aKw=VzbDj =)T MWBRla*"Nk'>j.iR[5}qmZcH>ۍ#TeMiAEVuaTLypzTʀp\Tp)j;- ieHNYݰr|7snOAglv[2?4dZ]Gt[qX55*Ñ"1VR.ivMZ^*dPZWҦSTu8X)$ҕ#\h=).7[6٦*cڬ {^-RNF)ҷALu݊UMJܮ)4R٤4憥^9RԀ)hgmY{qG"G2+ Ŀot'ӚR車)_Cfl4ް½Ј}pdUխ;'KsHw J;iR8)4Qjkd^qJ)Fi-x ]]-*>#':4:n/.<,tU _;63[Z\n `|YN:X\ `p;Aec{fhmW 9P>d>ޢ+;SFC'c^gwoZuk* F 8QLH)ъi Qwo??Zykil 6,5x8KS V^3= xXj$c9ܣ9s\n⾁8cRs@␿4攜47ђ8x@1;B-޸+F|gSUw[='zZPFz.@En91A@JicJ 1)rnWLYYD 8A]oyQ%z*_:Zj3階.,zn@Rp2'[:_ - 鰉,y1ddq^("Je)[.,Ǒy<{iSsҡ4]Ro"D޽TלOW΅|xY[чciŦhV?yA=WI+eԸ wN=hF}{SOJ/|f<#y&ojZGC Hϣ>>wq@b(b~2|iȩ4Nd?>FA))G=ip3A2iĄSIqX^#=m%qAOuhU#e_^ Q E,qª=9iqQꑢfcrI_мѱİ9Ǚ$UO`1 !i~$}H̐js g"5-WY¾,jHfd˝Ѹc}#Ş(wnu@#b4@ ^>,D@Zvv $h?NY}O.`Đ=NN#toj*ޛkcIuo$ -zgnc@OzY&laf1^MWgYUA$kFo`["U88Y7 .|1Iuu[ HyjI$V,QǸ ׸:T'XT[Xr¬FKap} T6'YD)gXKÚ]4YȖDVBEmihҐ(H4s/9N(4> ³ ے}'͑6w ΍Hح&G1ۣ'%ǨG7?*;+a*:[ ă BYB+FG4ɪkٽ{nATםo簙?V"Jmu{527O]N4f?ZFR/ZQ>(x|uV5fl`aDZ^3PnN%ZD4Rƙ#u p:]c⦻[wׅ4-))Fi p.8'Q^?duꗤKvT.ڀ I1O?vANQAݢH8Ji-8SW?_[0yj.ݽ\]lkl;WƋ*"EUQNiIҀy )ricU|>(1JqIQC`)@Rcތ{Ҝ8S@ NڐJ] A2ɥۓ@늎Y =[)U94)NѴNIޑYP0UAmciemnX䘢TUHMI%Auk1,0Ã^mu4D?#]Ɓ Mz̀1O(uKJiCJ9h{zwΫ9o%$o8=~b+ž >NVhY`H9KsЩ=n=3T{ Bن RaoO¾|t+"DwG/_zE}(c)sHiMT4x3oopݿ¹ xRWκ]B#~z_A:*@RNiA攜W+"Yo&7Hd I+-m72j 6Ս 3שf)}^,hkij=`e*UG܍wJAYI',JM+CD#@p1$OñzņDM#bq#د$d'^/a'[8{҅␱,95 #Ȩ֚Òj6e*l*p*&!xI?5WmIuv;TnW'BiwqQ<-TR+iARH<QaԱBO&$Q*x9TF(RjAӕMHhۺcBT N,#FukR+M7lh'rP}{`קn׉1lUwS֗piռ:؆ 79 $Z2[ #s %`8&渊X TMD;It" }Z(2/5exos7WwIHރu `R 8GJ9##)ʸaJIҧ1<}(lR;ozcHCl!#8BSqIޝڌ֌ 8PFE4ZwfST`LfbS\ PiZF 8\њJ:R)s(桪a5w)I"eXWwv|Lr =W뚳B.XV)ȇb'IdZR(c*")BM7]D zכ^麟u1{d-Uz垻d'l8H>ކڛE()KM5ŝ^Uݴ3P0-^U6r(TԸ{}QER+CF֖eda{Axkwsa?1@#Rx"8NE ҐSY~E)H#җZ@)H恃KH"QEP ӥF>~jDyH9.~8iz (0'Rq{^1Mlv@(~NMy?>kDLmbT2B!?P&o?EH}NF82(WOlae6UZ'hiiG4b))"GYXd{}ww S}WZ3{mziW?yz_ϠG͚Rp=~I\s#z֗ fYc ޑ~dҊ~5Ӯ<)Nr[ 03уqw{k%6ь8EQM|c7įSӒf,$WYqEcѹ_H Jq(4ZCNxt:s,qȋ[U+2 WZRސ9#/ 8#4= ;QT;u]2OBJ*T5nxO줽._'(]Uc] Q*Oƙ`Jiw>;>=rGmk}Uf =:x2ľlҋFKoǩAǦkvm|S,#7I:LPHlu'>:hF*ܡ\MB;໯ b{EMC 4q;cq޽@@& 4rJ@Q1 @N[iҡlj'֚XȪ A@zޙj?0iCQڪ\O-p:᥵dJ##GW-jzXvܸqN' 㯴K7\:U@#qWh e9OfF=A ig}_½WhvA#ucv7{D{z# ަ=H^9"OR@)qןKHTH8_JT|G:xvconwn_->Qؐ[XJIK8: x]~$/o33< 6]PgkmSg,mf?R k@P?*U3Xi$?+9VU_tuM\c"i{vQhӸp)}iAjvf'CIjP3AzqN4qҗvF:Q}MqAxhٓwJ1` o~(RJEq9y4i\sJ fO!'ҜLaxfdd^o7#@~a`'^~a'=El q(Fs֑)̣R u!ICw`(/JY!fϦM^^|=[}z7¾;2v7/N=sҀ֚N)ÑMn(֟\ SEp 43Қ9jk'4N<Fh QEQEf6ix%dKiqN42捴9h#Fn1QzPW|y·kg76?ٜV_\*f5_g]E}e { UU<2zqCxMM`uǃ^sV|E6Mod^"8G?Zv(2PkϼI)˟zyg{XN|:kku+wGQIMq1fNWxu++ҵ[tΑRzc$y2T@([{ g } ?ZD>L-R &#OL QNw!6+OIǚ>pO۞'Ӷ_J$?2D}}߷]y&e=3KMaygkڽ60Px5oO\xgIY2o!qWFxPkx?Woyh}h]f>i1NѢIL+)Bpu(݀)89$REG('5)q֫|{Tn1QgG MP#)Fj9DdD5MDcf9?Uڡ,sL-(r)SVƌ@JnB=jD\H5(ǥ=c)0CM=dywm> jp\03?uf 'IMq48 sOBR+o4ԐvZ8!zS39iRgRJv{SzS7ԛ\btc4旣 qKڌqHKNMɥќ 鹤4tJ)#N4ښq@$H0Ao#4`3VZu!ѐqڍ)3G|G$Q)974(J*7FA#Ƈ SCܩѧ&?R=WNG|QoyC|揠u(&HOE4W C4>ѣ0w"'h98?Ry)(8Gj1@Ҍf=5*ڟ4WhS*zS=)޽)QzRSGJ(QAQ,'96Z:P4]c]p,ldr)Ni4='hx GjXt&)"4YZ6t])[+S ? M[]@7~:lg>uW4WTH-3*ycW|Z߉ 2;j01ܩ$F7벤M%jP 4(F{83ғ NRMy߉sq!C辋] J !qq[Qtݩ(pT[iAzO#R1]* crtVn3TzffclrA;JGWۺSdTUȤ'̝M xS"Hj&bIqLg$(HzDsNu<6:<7=gL1֑L9-qHt iI8 +onWVK:X~U'񭲋y4AwrU6 gz TIø>k JhNڹ}{CLR'R}W2jlHK±IںSSZ~aSmsҜTZx_ )a gH5=0Vf+2pkIu{ kJ1nrdeX}8 eX@'Ȟ< iUχ^ox?`\4HPZi89IO^Z (JLPqIV-PSUԒcCOC}%P>փq=Ha 4P) j}ś9zgޯvNR1/# jD$Ȋ%ʽs"OJBc[? %$-%y5){UU!G^i MphNj6C=G) F"4izBv)rWXs֘m="#5>6K <9{o]+F#Yuuyci O,Ґc?ʼn=EGOꪧO%<>I%ɷ*Pq=Hs_BB֗881eR)i>2Xgf.8Ojۘ䞿1l- eiXl,@?^9>#?-<yx+Z#E WA}ӑӁZ ۾ҵf yiΫY?Z-7/Z);ҕȤ S JhUs֔wP3KM#ҐzF1NzxN v#<;bQ={W=\GF׃v,/@}WN))F(8QizVOGAP$cJ=£o7skGC,+U2[ })eů0x;JΑz b~ Ei.ma$[s$p7g<סi [%څG0[ʨ@럭p~Zb5Y_Lg 42%:\#[_6Ooc2R ^)sHs8.N9$&)yHWҐ)&|JE\<̻SGԌx?kڌ?L F 4} ='޳__mRPmBՃ\&O{ï~?ӥo$ZjEGCOx'*=kŷx3Z]oc4}! uΙfV2#^4\@đ|?H[߳gҼW⍔:MRXvE ~i\n>?^c`#ݣsɨd`UFj,j"Meɨ@O@1PL /&":Uoltgs+1Hm'Pq PGjh3uDJ +7k|SIȤ 7Ӏn-#.aCR~t)g}mps)UkCot43ڰQ(9{#'ާ^kompWoSѵ GtwПzף?į&-`0=}p*$i:ŞTc2OAws 7ڎLYY#Ebi?u6̘9nR#-5Hw4wt9Rw4SMVZT(.%~$Ib~η6WE{7.@e % ׎&_iR%̜M꬧>[GR~zEf]ijFX`Ʈ\I=EddiGq@ d⓱^ibpq8R|4ޗd"vFr()H!KN})3JZ.F)2:QJ3jM@APztg< ęIoSWgMᧇbڑRw[+̏ !㗉lH[T[5_b̻qcW0$V0;SAɧsM/CFVbQCF7_5c>ZK'{NGˑ5?^$5{ol(8;rI'&[P'HhTrYrIU//E֯V[:DxO"~SunyD{ϩ+cCGҬ싀+82Ok_4F* m:KV8d5qmer7sl/Z@Q*Ȥ)_1fy )8A@^KtPhaV b;m~wHQͨ<1ٗ}&E7O'\n9␱Jpny5:f? Uz=ޟmFq* U?17}nYxW.`^3$ +ɨ .4헯A?1ާ<=^; Ơ.G?^ԃ(A3qJ(&JT| 2bVмOePIUמ&ѼG-VYf[cV 6OUh/z=B]iwS4NҢ8bdŽk4M_JӦh4۲2OP'Gq56cNY 6=mVQln"h5ou1tMvK>b 4@d%LAgz<~EzN vN:?S\WSn rh|3O7 grG|͒~ Ї7oZԓT.0qQ?3P>B1Q"uȪD܊vO,b*lSqUzmu'Ʊ4(%r;oa Io`nM/:cU'#Vp|ܧܱAuokβV :|A][itԴ~Q]p?\V.s5ގ$" 8U 6NJ_xZH 8"S_o]\qڦX*Q#$sFӸ q\O .Hq+~`~UxJӼC\B08ºsM*+UC^=~-k:eFxUUWs@M{tq089Yv*(J@-Y^!ݶm#A}G[E9{gS$d3z谘^ )"XTdӰu ǥBJҜF)bjdWrx@;=ՂasV1^vE*V?yϩ=YL#J niͅ#=v>S'ZKjkxPvg⽋]Y7 >qOTSCj3!3ן  4?08;eۼ|~خ848)vRRsN֐?Q֓iZP=}48<ҷ(9"KvFCҗ @'(J)}) 94i8f48ӊтO)@zR)с\os+3A#=^1èO[޼6|B?eH9F1O"]51^}PQ&UQ?Ī@p>+[o+{ki,Z4`|ď!>yTdf984MSN&)/~0o 3dA|ֽD6; &+[t#\>z5< j~ qj!eycP r_c[>Xw+5S Tgڽt S3OSmt{'*Gss^xVMuz^閚5 5ǹ'GUW@"xROZv!Hii7sNNCR撕iZQJE4fњMR 6XcdY"J0`x JX>ms+5ޛ#`E PrGՀ9-|Sa^E6l"P8PkQCeOYd%_{D͝йO$=>ގ\1IG491_ xfmĺdԁdv.z=\H7 ud2A8( ?kt}cMص.+IFRHB:"/j"]~ i^Unۡ;6EBK{dfPg TfEI" H< sނrii 4ҊLf94g#4c(4g RqM^kyoj6ʲ2K*o/cp=Q): rsA5?:Qya#c`7ڧy߇!MioD-b3:ή@HcܑWa⿍><1.KF&D<;,ޜc?su W`.\Kj"¸Xs@Hq>QŧYpo}fw~{t!o;mK:`;d{nU6Zđ[8AةLPA9lBxbOK>C[M[C4v@{pW>ht/?f]>MʫqsВ?xFMnYn07;rFz!7>.fm;O@D1\Í$Aw5UڊyLB?.5ǓYztWʉ(}U*}ȧO$C6]ƗAgam@% >zE TsݚG E6ZE$EN*,ڐ  NiqP0j>^' |H$ݎWi?X6 ڣEZO$wi T}[~biKI1<`5Ԁ4iFz I\vN{8F=7 ~#?\֔ʣ=+<Ros `xdzdX\g?>c&tj2]:{Os\$^و*X|ɆdUݧ@ӭ -$ŏ@;qߊx] %@J3}2s}РM3ŝEE)hzҡ*/<ԡ d?{Wzlr9C?z=sm*KӲA QMdi$t.ysȩpM&NxO&kZͮdn.[$kTh#8QS½O%$3ji@$Rv*qj:<@]N(=(ҟ W|^oz>.9!n"#Հc=y/VӠ&/](p}z~"㖵jeo'R!'cck+L4M66[ZDF'beN)HiӜӇLf}Eғp8s8GJR{Rdbwv4lu9<)PnG#.R| MdP[=ifx>ֱ[{u݁Wܜ Xnik42'* HqK3s  |]ym--*Av%=Hrx^-'X Vԅ3i B{MJLRqN֔i6)V,<-2YKWʜrjAJ0E!V?(C>8W*{TLT0V&A6$c΍9#?j:}L4ϴH ?0*M Tpy@ `:ӓjD杷~ǒjk&2a\$rAS\zF>SmK1f: W^*⛝S'1qR99=?[|Mޯ̈ H|7+oI] yg r %lzǏt5@&$qAA\P:춙?}עA KQ0( ҂@) *1җ<ӹ#7$PO+:QJ)L#mE$PLf9NTjA hzSA RZ8gX4wRh iRIK9@'(4E7.F)G\2OCTȍr;]ÛKkQQ"eC1&r) =q&6EVKqӌ_E)څ-(psvE-mRF(KWԭ$d = y톩=T^Y9CFC\->j܌ #?ypzMm [.ݽ\Ɓ᫿]lk;//ȉJ(ª=xh$v4E.h08ğ0$:F &h#4޽($VWAi W6ڽ]T}X7_PV5OiqHU!(c$ےkwW߇@_C0q׸[~"ZׅDhUò )y<ϰ r)[$bA?ALۓ(AZʡ !r(n~=*2vHP3)OF;Lz֡8;TmJ;-!CBQ4{҄'IC/"wG( ڠe9T3SGEV|?JXpWf0"v2aa.AL~ HFLTsRm!SLjaSZvv9+n:JUS*^Jhi(&I50uX8R0} ]7wJށ bw72L1μ'_\՘]<.~o=֯f/-LQV.=[;xzƴe/CDHUUQtA..U#A%|Aw]m%Qˎ)2ۙV)+? !0k*g;? kW_;ze'}芡*U-exQH08>Դ4JFz0%F68j0 84ȡ[4Aj9"bK)旵%-gRFisCqHԫzOϰ\jP!bg%u{`_jqK∞ e%07U{o|'x7EM/Hs՘<n+k.} d sFh=i=i8d20)EUdqT.u"-n[.brkA$Y:0d!ިD[d`uioi尷wزTOC>z J暤(c4i^jea>*JaJSlz !a֧ Oj(jdP*E~9x'qRiu* )q.N;Snfe(`kWF7Mi $;fxIqчLҺ ,7]@2]E=N>6Υw#a{OrߟU*\)u 6iNI>wi%[;@ ,du4g5&) SB1O&14QOPpi1p3HqNZRF)4RZQF))424+/Vމme|Pq QH*_ snaRagS$~uRgĭj<&qF{Cq^di`gS9JITѾS$nHȯt}KN2%'7#AY4/z8^4h\ҌNEbRL:aAcl_ 7.,[<=ûKFjNS_`_']ks՗=r>o={ʯV=G$4x~>jdaR( `H~|45ҔH z'\ד^:G^ 9+җ=i #0[)?ʢv*Oҡ,z'4Q3sQiEEH*=鬀.a>&Mq5Gx戋S_0CA`VZ2}~x-T)R?B^Ky>V̒[s'qA{TE0 WڤUQNKL"5"FjO/R*JT3ߵ9cNP S6)X뚓^)W=)9$IݖWbJ>B)eB=lSCh,Z Ftc}?>=ѼGh.KL/VM=_L,i"e#4ҝ֗#TL]d\ W7^+ɧHcZ,pѩV, k¡<9ayi~# 0NqG.9==:?Ï$oȑoic?/|z|)d74F8`}OzYNȥ'sASFpphNPH=):u!QQw#1ҙ"G4o2=xg>]/q#|P{Ot7nSDhx/פ3m*֡a`omf&3R[Ashx0?@=z xb9!B(\RFF(ʈTI<_5㏉og-آ:,7gp8:}-F);Pi )M4Ҋ %SQIKEbҐr)GKCII񟉿 /[>"T8Y<֎Czg98sm<SS*ye~As G1K7{;m<هǦ2nJ]K?JOHG,_'Ԋ G_}276N|lWTzP(4QHO4RCvy1@瞕a hҗwɥCIO n&:NZIyhWh귷e#bz/ĞΫD; ?ZzXCezoa|tI^a F@f_07ލ* 19DZtׄZ7?dEn$־ab*PiGZSM:5"jfbo&FE'\/4Ƒ"))90ۃC0 LcM!\5DHl*6 z[=j74sQ9XqQ5D㊄L$XSQM5=+O#dz_M%;eF7#qzP!_h&y)!*UxStdw?1OZ ӭВD*RXez%K-H{T>"gҟiqqS/J>ӗiUFԡ998K xa[Yo}V/a/|xF[)0w1SV|[kvV+A/N=(SCNF4 b4H&8IS{*C3BĖZ-KXmԅ$Ҿ_;?{NӡW(`zqj (PjcxIմ[[y%FIF;4vB9ʰ61.piKzi KQRJFRAүZK(=(@R#dNc7(; l%ͼ>I_6!ayg~#agXҝF[nI+8n;p$f<7nW5| ~fԘZI *GUP:f5%I!@QȥߴN-ׂloFagz ZG⟊pjeiƤ`n$q0G􎡭iqw{*m$(5뺆(%43;cܗ=4%f-vϾ3]OcQ4;ݶ`U@:Rmɥ<(4bIoҕpRk|I+} taOe?Ӯ߅! 5N27.4- }c+=GOCƶEbQz }Ҙ 5_>#O" -D `$?۞ C xx\ &1{3 75,@z٩UXa\C.p3~/!O*RLW9WEt`4f) PN)84b)RրkAR[.>8rWփZ7/3cR={U!(‘ɥ -!RRN;FqAM()斊(4 SқEex:_t5=^[ڡ 1Iešh:v5ĥԢ?3[tRm5<[ rQ{0u*z\Ҏ_8 =g>_DmHTJ<|gWkޯ/.!U6+Ҽ𝮟لrjLctQ`psKcBZv../ehTB* /7mu/%mݳTN+rq F 8--Xb5"S4P) )5BGHR0x4oCJUqHӶ(3\ Rc4dR#q*1לz6J3Y}q辧Һ_ RAK&ٯ|_etXZj4^3:Z{Ƽ oaZxHԃp#|`}}G_)?n3O& C(#5zϊ|Co<>^JwúA~c{dNnTFϼ„ߓ\zR4tp>Rg֐sNj )~xzI^Ŀ%U'GޗF˧,Evժ"&i*pJJT1ROOUdgNy;nz pqҤٸԂ TF]J`4ѡp֬#k)4P8nRyA_"*"'ˁP8^y>ԼH1!g 2N.Ew+g=~]?+eq%=#+?ÝOH]ҝqܾeE릛;RVH}?vGJ}{eXKw}sC/,T{^[~>hmm+S:80+ş xYgz oz6)>ϵwJSȧvzR.Td9 #h9lHN)1ּ/;\ۭVlEFF9';F8=Ep[o¸ۻ'J vqʺ]շ5aG8G]sGk&R0A+]+S> |L{'6Bve$Sp;$BK[akM cǎŽVNry8=}wYEiv| HPUP*O)ŀQߠ䎴=)܁3P)E8Z J8))bJB=?Z\ښ *+½mZK-MSb^D3:^}y3 [{3ֽ/? OB^ꌛQ{z2=qHz҃'ZB0rjX^B&,mє_+xE}^Gapʺ9\ B> Una27ח\?jXu]>?=nV0DQF=ܑ@αiK)ekKm/l֓;ʎw4,;XȮ? ǨG8ۛp͟c6o9F,F;h}56C Q$j% tSъ:R7jvp)!\M/CJnZ]O_z~j):A'4LSCs~2*+yXAW C+HG?WiZhcKOյA.s\wh+A/?Ga-dd;i:{Tyu JZөcSvG)MUy#46-| i E>t$9Xc齇SO_\S.,<$77B}AOc?:*3jZdͽGSF~~C9BT-+ 1"q}U֓{~eyb:ar9$:)i@i{QH4Sv r%D5 FSښSښRcڍٞOX!N OH R=)=*MivԈҜx-F~b9oձK[r"OB=T5ݐX$tY~I $v$pA|?ּ.x&]>uXEsǜoeB}i>Ě?- `eZk>zGD6]mK}]iM_]̒_DZRx'ܮ?Z(QNR P U\(#-WK >LpDҶ=d*6QxV_]Zm' !bϏQ?}30\Wǎ4}Vl`2wcpϯ>hQѰ>5[mb{G&xb'#6z?]xKYAß v5׼;#cG8u˖N&y֔Tg e-ڔn8g- )A41Fii}h %yK P;hR1I⎔uFJ94)sJǚiS-*g%76 :iZWtX<e#@А1~ 𥧃<1kZ2JF {]p3IqLevM(f3'ץ!J `<ԄdSv`KnjAQ[.)i{Ri3-њuOUK=j%v 0"LP)hhFi {zRbo=k篍v v{Q41% ןJDfUSaFqʺ+~2xD1}YOm>|CG ~oJ wmBfÕV In7b緕v\zx">x KteEO6Һ;K,MrDPFswx.hxM^&3 8\U}5KC◍$O g^Kᤐm'S|kwX|sf?ys׽iֺoXγ ))Db% \QIۥ i%ԫ(2X!koOjdS g8n?w.i؋{UdS(=)?. sס.bAٽ\Ɓ[^ch;Ud+Ez,le9SRZLRIh sJ~Tl8rE k_;QGpZjkx"`([׺jחvS'P|`F-ڪ,N1WF=%Udj2E<3йnՏJ|J5?SvHjcz`^94n=j6mx4#dQg|l͜Tf,*"р:̈́FcEZ_'NJzsS{b/J@Ԡ iʇҤT9Ng`T"E. )vzS#3CxTJWPlӔ6ch52 Z0NHп/84:Jnj'(zTzdW2A=Ϡ5;>lH?uս\֚N95uS6ƍ >[MK}z#4[bQˎٿǵ|6<'Ko}c1|t=TJ>:wwngrŠrq c;-O1>vʖhѫ:g Rzρ *Bj'+Q*8RvzT10$N2xh7V579Tvݟi& 7qv>xGV7MҴ8(_ )0p;W{t)42 z mҝ}*wI,*b LSrx@†@A֔eb֚ AӻRN -&Gz^? hnH84ڂ’2GJBhz9&QO 3ȱ$v8 d?Z,G$I70yd?#-IotXϢOOEt >)jZ/&=Op? Iѭ4[%}IҚLn9eOҎ+?#7Gٿǵs.ti΍EI^= W6pI#?05*qh:%ko <^T IoWtZLMPi-|^ ̰iv^ZiZu :*~&~?xnVKw89Klؚg[n< }e+[[bڬ`5dQb()F*houw T*.Wsf >&c< ]3Ll0$cOsW{RRNS R4O5k\˝G\^j> :^=9\sdE'WSEIG4v1M~iۍP @;)A9.kþ5;VZׇWg%9Y@;L/b\m~"bXB8GƟOto wV\DRry#G:~18n(۹Igm=Hj$d.5ǖ$ÌT`p,J qIE1gi\qQp@F&4Me0M9PҔE R⍹,x@N4z~E!B28$YsۯjT'Rlȣ&E22[;" SӀ!"{VArhWOT-4K& (>@+ULzXWiUZD%հIBSOSMn삹زpz#w=بِ|A׎NWv?G-_ -F=X/B~ץO%A^ooUE0iqPz/+ ].-m"ğ>5hANP1JH? wH0hΑ#Px<p}Y"qYNA&sNz)1J(h*\QiJ8g&?5-8 qGZ1EP1!4;zft.F3J񮜤,3C鹈'ovMM F/P<.W<q}Er~1xnBо4ʊ6nOb2O<`?'w_*W4jUB{s۱^ҔO&,TqMQE.)++]׭4/>@5Xiڟ3}|2----RU_K(/x5C+Aڼ2[q5LJbL y"޻O(G߇EuidOOk|xv ^M `ZU?޷&rjZkf>!Vk3XJs~Vޣk5 }J.%D}jrM!>h搟Ƒý'4dx?Si<9 ԕt-'AtK|ooLsׯINқN)s JG{Op#>$ҐM24eO֑5S_ c¤LnXRm$gQf,2s֚b4͸`4X=iBڍ'=TJ2qN*00i|iV,h/̸R 7 /~BeO'52jpPx Rcϭ)Й;VU@N|c=8ei@s1iD`R|mMUTu~AmҷTO5/j_vJpAz=v,PªNThl/$4FP6>ZW=aH錄Nq+?+̉ d#W|!4Z}wQ?e 1%y[nƾNx{uAsc~ϯԄڅs @i0 v1Ih-HiXa$vȦo p:҅8 v);Rci@.)z0GzCZ&ߛ9Ҙؠ Rњ3K4ҀsHz^cfjz|ƕyݩ6ppv 85fxOE snB:>P7D{ҿ(dH%I${`gڳK]OxwmE+9RGO3^iJ9#)P@4iå\c.KINR˜A .9O4 *05Zx~̝p)A\F>4N;%8 nPz{3^im v,p0mqP .h/U~k;\Э53 îLR!Wcjԍ4.I#}}G&PUVSp}p) '4RJ=-;\fG&Rf&1FrzS4sOcGMAXw Tt.?(q K =ONR[gk  Q_ONUA &ړff@'mtMB,Qt8}vI)N)KMzxri RT|(-n7S 5A1n`p Q8♃&p3L-="ȣ8PrMƘ@(4' S~ i[zPA0!"T҅&FyvHE&ࠒ MK&qVXR)XF:~*٩Kv.iH*Hpq 攌THю7Rg;R"&/Kkcof8sA;y{}e1ʌ3z/"%(F {Ri91O4QK)24ܒxU-2Vk[܃O=yî-Wr=Y-yzNk-դ~B;IEs@┎* 9H4/JGzcA &֛[wRQJ)ݩ;RwvM-g曷Ӆ.jX62^7pZ[G(Ozgs[IsWckz^`/t/-_8>>ǚb6IW8JpzRR7JANJʁAk;qm"^;(Sq[2(+M}.sI9)i\caG5*TRF>Z@9(4OSC_VFwHbU.cPAn8F y,H]xZk30Ux ~%:{hEjWg@xZ(g1Iԧ(;P)0sSHM4qE◚((ɤMuf<> qIҊ9=)17iq4dAL&T=j꜠R(Q)$Rp))E!a9cs\׊ 7l xSҮK 18ܤ618"DFܒ(e#,iq|KSsJAM&-$K ?zz{-S,w.k VI}>kLJ h>Rc#p?J'-Rgx(֌҂i㡦'4j^t'ڗhF=~%ֵ7nVV9q9,/>=ƃN `bS tǙ~$޺u]z?:I氓 WJuJ3AӨy6Gwd%ԮUbgwGB;{/tѫFRH^oswG4(d6 Bt<` bn2h8#zӆz4h91ߟwx.c@zSms\%kSDK妍'c~оx?wy营һ}Wy8>MiR56HTWXd+͵^Z_Ewr]wOm`b+?77 ''/FqJ$y8S riɠv{QIҬۚ7 L EIiڎ #4zQSҒ^֔/.iqM=iN(@vN0h`J už[_9*ej-gڻvy>SQ;[yZf"Mjq{W[4T3g51*x#4 MZu!b Y"meaƇx?Pm3/_T~y{M"h#4tܜS6N)JQZn4h) ZGZ\QkR <o(׀JXI\3O1N+vzU@ŖYè^B'DwlQN0I#|O&%\"r> \G rT<~=Dep(> 'yǭ4ڔs֔Hbr:y(3KERW7q'ޮ.x)N)3NHxILѓN) iE/qFqIHFh!KFM(8p)#/F&K;hv) 5t횆K$go]ь4cIiiNU$bPzS0G4RSwviqF)R=A<'4-#;(}Wz.\[\G+I]#*7\;,=|e+l28gg걎7TP<ۿ}q;%6`Ol_A J4Ӕ 08b@މRjNF4 4J#d V{T{qT$W4G1ɠ ҠcMَTҁh^rJq\tۂ F r1n#&y ݤ Sz`P)zSQwTyS>4rz4licEg>A!c*IہM!'WѴoobe噂>Z y+-;PUlyV5a2s[o^-M5됱zDVs O8z+4X u1^׼+_ _U+{k9f hªOum*D3L<Eyd+U_hWSj~6)9#@'3ɯwy&^!,BU~5}xo*O Odk(wmMᖭǯ\cCcn x}+x %Ӥ!9i((=4/|AކE"ǟҕGґI44攱lGԹ'RJ(=(iE0|J:P3IJ8 O)&Z3OS/ZOG"^ߪ~!z?OVOY;˚zE jя§܎Y^;]T9Z7}BkӨ@f 1捰;?YxA4-kt#9S $Rzq⒐)*2:FeaG;. #B]z_Q]'h0_]lRf1KLPq@xIuO1Iƍ).qRRoZZp=iE6F7Rg4RN{UlbaHu GciLmm3$I v8?޾݅Ʃ\$dG1z׈ |K_)E*8ye~)hRPzP>%֗FE!#!8HE-6RG=j^OZv)C@LbpRkI;}scMY=BS:W0葋߰ݢ_SONzS@hi1Jqo4a@ɥ Rcb4f1\/|ShcCᏌ'g¾3]GfVCFu8.ͨDP=7x7ֶw܁r:!3?A^,}j97^#G~961'£wBThcmyq%?5H ۂsJm?h?I>۝/R B>? קΟ =5 &+W Ю<;Ig$Ϊs9 LCv&6H$קk?h!<3m#NjEvǸʱǨ_J<]xSjs-ά#]FyqFA rHbl`iz? /Y ښlP82뷡=OHiN'Ҝ7ZDi2<'jӈⓠy 4P\x3^̱C=h>+xR^i1"!`8ODXC[} 8.F'^|񆍠^jVrmd<˸m-؝g_y RA^ip1M#m"4KE!is<%4 (jx94ӊAE/jkq\/)hEd{NDD G^W.|{S\;z{W|=q XjK wm v6N9kwu^5\[ψ:"ܲ)pp=.9hּ9et"2V}nY@f=:Դ |k `2BE{ж'="i13~-k?wdtoéL}[/Ik]\wY\|Rq?1oJ"ҰS94 3p>'dҝ[D !1/J#l~8>ߗY8)sO4sF)YPQ$ҦSin)zӳ(4@q@l#B;S!RRWlgfCᔌ^|mY|owd\~=jkF>ʭ%{O6MYh -ćp@8|fxnN#UM)gQYG}V?:ke?־׈x~X$-o:aXAxn!E&lf7X ƸW)OH,mzx=f%9HS3={j,?N*,T٣4NJ1֒֗9֗4:Rf #ph"R;wI!&N;.p%O ɕƕؓI'=WB<=}Y5w%Ջwش<7I!<<烊c~|-åiPy6rǫ1O[>U@ZjQFC7N 8HI_JN)y8ȤeĚOԵh'%*<=x%m-xyl![=o`$;9X '@r+j 5Dwx_qΡ^Lw*v$|#׹+y1'#5udQqڪIo\wybWa{f ֝?>SI#fӭ0 CJ>QZ $┯ ["s(BRiz95]Q FZFwuv5JnUyM0H;KQ4Rs~" t ?:jikH9F!I~9l;:ֻIThdw{N{CFKiFE Ȥ lR/9E'wj#'NiPOj\I' _2|7m EּIFno&Wf$F9ʪvߏm( Nͷ^OGC)n[{*˵['#}}#ct/mYY#74y8eƻh?7mDzO;/xv@ڀIr ^㿆^$ϊౕeڇCўR?~%2bϸٻ{x[Zx^a8;yI 8E^@0_zFI۞xP[+RZvO9R#Y9rG>vp[&Su8O"dCu#z=`M[솔?ݎA8 qH79m_=tpǹij7Вq=i.r)15Tv9n8+WE}KK_.|$>ѿ׫|+/隻wjv$1uzG"<84ԝ;P4P E’pP)C)p%QGzhny5'Bmۮ~VvbFN@M'UDDOp!$猐:+7ž>[xqYkQ{D(DtnJ]uk5MxO, Ϋe'o+߅;;4-h"xaN^H ;4QE%#vv1I޾ K\e8yCt9슸o=xޯoDI.-,^L 1I&m"@$h !C W|xkX5Ž^d`߷#85NMO~zZiK_My(UIG\z}"h4f@=iOJojSi)GEH4*5ؠSs\ϊ|'lW8sA\|QqckȨv,uٽWNXz.- 2&O݊a0y0ɤ?(sA84@T7 R<ޙg4'ڞyi)J(85 r8! u | Qq5DTaHTg8qE}BBFiLSz7w0[sq"c,ƾ_:׆fc4Ļ2kֵOHY#+|^J߾y݄8A澡$8R4P0 qC',u{[d=c៌7xv$974~kg6 F5#p#rzEugōv 8?]b{cx_ >4]^Zh#(In;#kbɍ 끚A/{׋n?坉4c = CrAEFb.3%}=_ 8t lҨ#ZRD| $)E8Rm4th") g>ނ w9R7C"O4)ҜSM4珁y_^$]GBD9|{o^gv鷒KTvjO4 vvvQƻa˯^< e> X-sMli1Ngboc+Y'ѵ(u#?n Ƿ+|c񷀵 6`bu\ˑ##h}5/lW_7A+9qExK=iz.M"ѓH: iO@)yJI;SOZ\S/ZLRⓚgM|cԯw "=`HVoj.5+m=FKoɸ{ޢT7ؼw/p$][ XZ|6mP\!x.gX1e<(8zפx^KWIjbo?@ޕ P .i9< 3^^*)){RQQ妨 柜h^M q@? +\ _d1ف'=}UI4NrJpSGM):Iȥۑ֑u9SW!~cI<Q 8qC>Fy )>^׍;Ni>0Ә M%N) S34c'S^>F) u:uFE i62ܟzPNUe<>`g 3 ~8SFs#= Q `xŞњ_( 1FBO@ϱ5xkX{[籿|eXxe#pEOx\%/ K]8|^#2QVgC8lfN{cu|83@NkY=#^@;}Wǚ6yc+д&I[[H >ՓFp`1#zP~5 ڌ rimc0g׃|^-\yy³n>vx+B4]ă$(-#ccXÖ^5Mݽղim$7E \`Nq=׆m6_0ipD͝89Q+^ь֌m>rEq FUiAԁrO4i$:8_||-ջY}1RcԌqoXkzWLJŘ{ O M.mB͍&Ճ = 8."5qn&/B=WJExd`YNA849q֐t㯽G95e:+cS坻*?ğu)kqghf+,nPs`G8 g⟁ncRup&>%>k~|PǖZ l7GFkx "~v>^ɥ1qޢ,Z.:Ґ@ {S;;7*8SƟ?[*jn#]]vzr+ke0^LmG1+F| H*Eڪ0@=8wi*r)I;s'𵾻+ G/cc@-߇nĐBj ȯFIXH]eYNA<Ҟh9$SHhnG杚~sғfNNhғQFKҌ3^EvҼK o [6;3Q\¾3K i:7L@BH w өqS 4ہq4׵f_j;@EL?}d__5ysCa 6f^\sQ|΋N/*]VE0zT|K1Jx J81_ˌ3jNm# IqSqRJ@W^+Ş|ggEmImxʟr=ox;TuWc\w)u88;vQɬ$EF?cV5}KQ i-t@@gc$qgkآHH"(UTY:iS>Trj4ORNtIK"Ir1'ֽ.mYaqejªSOAt9$B4;U WnMŲ!4Σ`?@~i}+R8 e`zq=Q_;[OZRG"h)uۡLisH܊@S (#8jm@Nh$ҡʭRd8rF:~UyvB9R@RL^;G<j(j+U|;>q-U eMt>vMŲUEDbu~ }Ln:b;'*M};-{w''f=uI49Z魢e9G>O|DwqΦuK8a5d}:"l|_m^ɆF$R~PNJU9(LM4Yֹi_.x ~g>ަ; SZv3@W[XڥK(0'5[L7%3\d:\D_oLeuToF<_hCтџFSʟlE!Qz QS.s@IX뚏+DEFGSf4Z1^)07qQv;P3RM 4C8MN}++^i<~p2WGqZV3P:f=9\sg!=z=vqo*56qFhRsAM&ӺP1O4i)4JQHN lihQސRdP;iJ[4+&u[49ȅ{ W7:5wZ'"9$$'I׬T`84PFE#qb@r2~(JA֖v)MN) )1iqޓ$E($v o;VN=̜S7z4Qu=Q,A{3^oiv,qF6({{#ᣕ+}A$>|^^̶Q·0ty8 Hz֗!֗849G0484Ґ)9)OVҭ5&rU Z|la+gd?Ez6iui xۨЎƮg7iڗn(PWW/1ۂJM|@^)X{LnGά>!O}9╀ ǑO+AI V>+]t̝>޸+D<_OU^].Ums~^@) 4irD\A8P>)cC($d`&j]e%i ݴO{|_G]Bv:F6+eXgnvBr}O<և-0v8]"[kky5ͪ T0̦}>bH az>ZvIwg(&#}hғ㷄nE85;.4y^1ա`7F?@~ >-YɣjNh^z 21\o/n"j3V9$$qNy$uZ;#ZxѣW\A HO}:QFGjk A9BBR ? pi1;TfFj8gLbCS<ӗ/l)G<~ xB/JHgHS%\'Mxo>$Yo xGKhIh"O=__i.O>Ԟ>D\㞽u~]^[ch[ ! Y;`wz68B2+Rogmz|?EZ<[q $Q#ʅ +}CMmod&yv$.Ob+Zy rs޽0tT|i7Sg$ Ru40X"r̺qA}q6k8'_E5C 1qª*jgm$}vl~}cVgl%㐪Gx{Wnd*LVb7P>טY[%ccctd3*A+mс"_3֐FM;)stӊx@^i玔cdsK1=)K1BMt{]jI~IC y=\܃5?y}z]eդH>ՀihTgJk.y p"A6ԝE4ucGjLf&(vIڔREJ16`斔PE!s@&E+ڐgo4Q\|SmAb[iG-xjė۹V82^ikh }!(sH8I^nȤ<(;Si &3Fp_qK);>U<J`0>M;nj兵IJ{{C^ougxTVXHzw.iY}I}hP;u ~qMߚ\rn5b1tzQe>h!O"OwOcSgF }5E;0,vVz,S:=*'x%xpj8>eQ_>-?Ă*Nc֞5VLzҺ<5r:P |Ekmmx_v\1ulklrpe/^jTaUF)q1cN6cҁ):{2`STۀi!植ѻԅݘ4K43H)ئNqɥ#RwAi3R+KԊR|1U!$N9>5wO[S~z@ѵ{Mn\>GGC+F81.+xK4]K峐œW5g$κc^{ S?w ڞ)q l'NNA#p)/Iyc4M'i JM5y3ӗ!Pjy_ܸd_Ɂw4]!i>dǫ[$d ہQ!FH$h}ne@OK 5!5#;YIO3ϥck~0Y im%ي#UQKux|[|.>rF=Cunwmpxphqa-/do\|+sl$;7'}芪@UbL}gΛX;\W|NxYu[ȬdYZ0=F^}e_AdLWT|Si{X䵴\R,s:9_VRh4@9N֚GRiN'妡fg;fy2SuCR98 CJ9F((yj={O M/X5G-`2yL|N3GI"a#U* =)qP/S?jF)✨X6i Z~+)6S0)LoLSMxsR(;rW$c=)sSشtkK2_q>ߟg|!%VHw2|/һЇ8?.9Gb)&$ ړ$aBOYx s@R9jhp5#7N0 RG50< LIE(CRp9'F#9.3@}y(U2}=-%FEy^ ԆfNFv~4kd-u̧ziҢ &隘ic! RrNf'/qq֕ RR Ө(Ƞb49@>ԤdRRm^4N:P94sҎӭ1sMv\o rږeq;t $lzj]š崭&/@9趌t O֕Hvi;҃xiAJ~F u}Oi_K0յdNI?oһ֊kqGlW˿=g?Ż]3F";'gq}rN=b?|a 2Ky?gkxVT|QsNp}F=S߉n|S{זr7}$;Yr{zr8)RctZv(i4j4Pz̞0ӤPJ0Ȫ~G "JcVv$QGN:ܞMp_~ ֒TӔJ΀Ǹ =9?VVeh.^G{9W9(+z/Ѱ(●Ja=ORѴۍJe vA׃|juI-<2B~ bK?44;dM>PM_˳It˕$蛼Rߑ iYl$^hi?vi旊p=iA]jzqNE@֚)@4QFxZF)@:Ӎ4BӘBJNTЧ'q)fӴ^Q|z.HoJzRQAݹaCKNӾo(5r*^R v(&)٤'4E&(NM;Rf DaA ށwQ̋ɋt\7,ں^qҼ??5VZxAW] Gb*xwB/[[DdcmKyA#(I,p9׽1;҇up(+⚣9q,d>q2Ɠ?\]KdP.%a,`seoPƧ?^CZI-9pa_1~_B`JF0pE<.G4r49-qbAcpɧ)7jV&r2M9I҂riU'F)xq~)dm7I>e*'_ ?쬺e;&9}[տקfڔt$Пz,iGާm5@{2NUXVʃGZW4P)vE.9IhNQL~ /P)F$if䕦eyp`usɥK"+XdEyƽ^lh;W5xk 8Fdy}GNK3Q'*`Ԭuf5|HswM8ړiA>sHhqoSuۊ)ǥ4zT"w-iN.7)sJFWҸYf:V$v4IZ^tzJd/U}/SN3A88IhhӳM=iA8Mh9H nlSi2hcpփZi*)=@5 v\FY\*$yt*KZr5xcO]1ҵ57@g)C~u{{JzXp>&|jaxc௺c~^_C*^b+8#/>ߗVoxfѵ܃)"'u~# $ӋoUhM,xmGŶv%G7¿kOe'dIՌV1:vÕ<v=h+sޣٛ 0*lAAJ'HO&tH6)H․RJ!A$RkϼMٵ<=BzgDnB~ïQ==823FSOh̞26A[govU? {Cyo3;` Xb4("" P0? !b; L #5{iHriJr9qoO,h_Q?M xn%+W}@q\W|beucS9_{qA܂;3Zc0JvHx c%å*9ǽXCOJLIұ杌i 8i`*A"@J8it-cg/un[]& 6p8Qz 5maUgiLV\ aֳCZE,J#c<|GԊd:I}^ijd@:9%?h-6nO&1Rqƹ7-\BGm1;OP9WP[1@yċh,![]̪wJ$a7ȩ3KJnhEHقN^ Uֻqr"_a辧u/K} 4ea/*+m-"$/$pd{+ϏgB`ē(4 ߜyg|?s x >mq׶SŚ_8]*F11(qXv<)i:RR(8(ܚ);Ҟ(_!4 \WO8|HhL7AIA-!ӗR+n.Ǿ(>‹ i^ilTi#?0!=1'žӵ[kehкg]I4wA;@#4`W}KJ]`x׏0?T𿌾˦j˻S%qvoF^zN9bqUv8<4p8֚˚@<ҜG3֔68`u4889H"9Tlo`Pdg9'4 .wR䖥)_)NێiʱD]*(f8zם& 4P)u2+ m<.j?>%3L,>lk;Wnj> Mjj$,"{,F 0?$W>|9gZ/S ߭nޖULc؊h<)ӁJ7zX=AEvnOqL$;ҁ^CccHP Ч o8q@&Nm*j7oJFO+Ǻ r(nà[ Dr0 uf=Ͳ=*~!xt[! ;9o?$C4/O-ԫ/pp;5$k/d"' J??fwM{# Cѿyoa-aݿkz)Q֯ FqM(4{ө; Ru;q &OJF}ņiiȐHꑠ,S^oķ"9VawϢ]g-m[8&OW?ҷ&8 C[84҂(M!8@֌ i8cO 4ڃhv40x48C-̛s [|49 |!k[+^[>H+|d'i)q4zn {(dϺPGzdHFƊ*@?6i$3Hu=Lw(w1rzn^|)%ԶiGʒٿ]s~*Z5հXu%#-NwPIdӧAhNx1ۈ 'JE!$n[o?ZRp%Tv%.hF֔u&9i9⹟^|5 pW2?~ םZxQӒA7I U6~V4;=B{}+ZֲMʸ,U!Ky9c`pU 5>QnSկ"][VĻH\ #$z-ݾJ|cbȇY?LW֞D۳WH+x^yXAv8WƓП}yGa+H]^$Rc-m!𽏇\A }QK>W>=OL4ˍ;PKK)$n2?MΉ!+*Fhߝ}Fi2E)M% cN J9=8\Ӈ4֖( SWy)SH_7=26gg{+챯md^Qs'=g7+ɄhIS8׫rh8=i Sa@tR!yVO)eGo5‹O[R60V~xOPFG9{B+𖟮G4`+U{8F:SwdӸacԤќRg'RzSii)pzy#43⡎M⢺K(cfnWjzMDib2Y2?3]ƃMʀoskJCU\Tf3HǚLO;SvӀŠo&x/OFKqvbE܊ÌFs;߈?,$KGV L֢8SW1qjVBs~ w쮽=zRJR 5(R1J(4Ҍf x$sN:QBNh8('0_S9UnX|Wԃ_iG|9eS𿌜HN9I$u=Oo knbA/<7yVU~W[Mφ%KjPLqxinDX~:VՎCr ExY#$ zǨ.<ߩIXe\6h؜S kkaHGc%C,Pp kؾ 5ߋ;uVEv* irO::Vaإg v(P(Sy5xF:PuWRp2&P4bK̷V3-F\(`{bq|#-4r :/WW|EKwcXF,=M[}r$abAKٽ~h'.Ώ+c;Uۓ}?½7VU6  ޤ#4qL2v E8 i删=M4N:| >))qGaINs\q֝W~nOiL} #1'.)[Ozweӕ=}ymZ=IԞל]]:,#`H=y[wZ>o-d$?yϩ 9$bi]ioh˝b||Y$O$ vA]䑭*r}T-s!1m4 IzI\d 5g?ZhL^;uFNYԓnF (FSNu9fbNUx4Wi8D }✼hSk_xmVkOinO?쎧H>(|MSM=xbe;#@r}M>c6چ,{q_ 88t7m5kQ(+AWFvk?*]Gإ!IxV.~8') +tҀPwnǿ=4^Z Q,J?|ca}>SN>cF[Nգ@y,rn=ppG=G5_ƝMl5Yhx>ht'·KV3ڳ#ć'%0k֖RYTy$xkNڹxCU8đ}WNу+ A%!̲ZX]CGNrMӀhBP{j)43FiJ(ь cMJhjGަ$SGjoNhݚ0i&wW5îDn  oWNMlg@ﵐzGSY:5?*aeU2izH麚3ٓp?#^mu w,2xFnmS4F{TbUv)43F(RqM FsO-QIi@=+o4I3Lȹ<۱>Lu֣q{iiopŢsc,[g1b?=fkXغ@d%R>oCME,4)nb2xAǢs_cx3Vz᷇bD 03f?kJIdª5S+W#G>>_+#_-6L6\(rjtnWLՐ OQkmndUѲ L)׊0)@⚹y*HDXRsi9NZo h ֌Js~⛸7җvUPPptZHlҤѐ)  KU-4k&|(T}>Wƚu],"=AˊM7MҬ0cOsV*i |8 2h ’\âQ :_!A4ܼRirG IS% U@1޻{P !#)k%orwz_$Tj~ z0ȷ]mᮃ63 ,HMkZNGW|"H~9NjEhl(wSH: pH }jgm3K H,R܊ʧ y ;W-g~[2B}vT~T1;ϲM<|q"*ybxvw(?w8c+ѵ_+Xͦ~^?yOuEsM$N2  7(F0`z󏊿 cݤ72o.y2ur0ydV#86y|% i_4i y^RĶ17ܔ{q Iǯ_DYYiko,qF ? 9>byU3K]SA<i3ApiɧKV~ZhMsw&DA^} _>r`lqc_V=XWi}f_NՒ2i@FM?mֵlYϢ台O^^3 LnWxG=ѵo !e< V(!Pp9 RUY[v=I,RkP)mğgQ*m~r3.+OoM`hW#t`3%q}πJ/n@yl~V{g;3~*x&7y i&@۟6}߉Ik Le"BƾUXQPp{ \QKiv.8N˚P8 S'CHnƃ`” Ln.iwv&RdcMvzV~i%L0=2+LHh_G썵yQC yu_"u3x=Wчq5~kY%ݤHvY(rQI2)JqM斓4"֜)M%!@GEd(X`2^o91x@*o5!6ņc[Vvr/N[jR۔i|BRxGʋx""Xg2k|:\Ok%iشGX'w^66s@dXn@Z/o-I/4{<"0e-dq}-K)4b˸c4m4F(?g6eƙũnE}$gsڼwh|12hJU@aVW1qӥݍܗ)TUD# ,G:? h&XE|ϞrǠ~=| wzq撊){SI(R43)@4n攚C5]PW Qlb&>^hR@j^#IcxUtpUA"oĿ֍޵΋ɥ$ ?}Tt u.S\^eiuv֐.AO$Mx5Y51Y#v9c$|Oi68ϵKxW:Au0V蒮qb ؚ |Mh[BĬvK'1pqkT:w4.vφu'9nx5|{wM>Zch[s,i ;S=8iJF2Gփ֐zp01HҌnYFpØQ! m/OZk@3H-#dUՐ9"ܜ擽)fA)@tYR@>^\斂) ERJQJ4OYzdžt={gg|Pq (=##zO)Nvag)73dκҎJQޓ<撔p('z^})3(hN4Ѹw4r( +a\zӔoCOWϟxp0;.6wy6׶麄/CP"8)!tGe%꣞AE|cZЯu;eg>R#}?{^k}+UlMxe<2B=j\f繣i#pqHSO4N){JF]('4@Lu$Sץ!jpϥhaL'nJAH p lhcqi9)1X!-pKv1ß\^[Yw19Px2AzעEih0 tʌg=Q[f޸%ªt^14\iq$ܘ$$#8Wx69"* c#r#keFkVɼWD&lρnqԚOt- Z5vn= ZJs\/]bM~sF_Ga~(W9hvGG5։?eGaV8nW6w\[ʻdT =|Ik] ďd ]o)}CᏇ>Iңy3I ʼnc5L^Aj6בr%" W<7hvXYvH@29"K@8)ޣ98CSt)A4hQsjzmf֗pT 5Y|q%o el+ѴVXK9!!#њ0 !!挐 Spn65p=i38 3;RqGemjt  g^uotס['_4 { >b=k1AQQ\Cym%k$2 27B+u=RV5-2FȜtZk~ldɏ6<޵OJhS4RSqEpiĎQHzSEi@N Q4(do\|+sg].!ޱ />?_Ec@(8|8qm$I-@jFW#+#C]/Fu述@[d 7rxldr {wx3EtV{7N;޼#Ѿ!kA 13܍_Cҁ)sA4fњJ)1BSNaHRhuqF(4AE& 8 0{ҕO'SH4i٤4dxisGj~'x#mXf-ofw!02>P>p}p~e4x$ (|PNJ>zmbKͫ, ݙ6kυ?nu&K#X g>svfwZ>|Ԇݥ2cDG X=x5}AMO+QAP? pE!@HM 2hA('E(sIGQ@`SrsA)7q@ӷ2iwR^('S@4q_<}Sv2Vx2P;zV>Xp$T= 0=At=~)j$ܣ?F#+?@yPoto lx;0k;_ϩW0o",#${p=9*\QGqGSOާU x.yNC[4鏨ױZZISRx9'?=Q6 Rx{ֺ!=G*24j@} QL98K"i=X))\>QO$4q!sQF~&w?0cK8EݿJo0jʙ'c!sO}M.sHáWԬ,==/!d 5jZ [=Skpzph)rrn:O z]5YNN1ry5O[X'>/˘'4sp3bc_ Gc3ݰ9P{9={Rhzil0) 7M+p9w xK_HŤe')ϸ=\Ο7hOPo. 1,9ߘ^hzgt(-SԞxx>O֚FJ1J!ϧ7mU&88*6J~p Lܹ5(u*)bi85FMhnO4rAohjZ\3s 2 #qFW oƭJ-x\Gt2OOq+k;?gHO[]l.JC mMn{[3dQ8|hR .x8s׏q<j> "UK5e H?",sHx4f<ӍD'NTpF`LT2Pk|K)냬h[(wQc_oQ:mxWhEbQӴwuٯ qx;{ym p3\C{Kȍu\$M#@'={;W| $)>s7NR);_#'A o&A`N8$w J3Y! ca߄@U>cSmi>Lڎ3t/)O9| 澉=>e5))RNh@11K+/}UɱuvĒ;2M{&:=xOt۵I빘sҼO]3CŞt 0ed}G>3xZNrA"1F(J񮞐:W*i[f)q3Fi 4֊\S}i;r V=+h5>v)S9I JX#%UƄ]us,\[mG*:H=W+ <JFE*y]8u8|E&M4 pQ֑ֆ\p*r4p)63LH=6W `}DG sN<*p JLҞiCriR *8G#a'w, D%#"O3J[Xt;"+נx3g.ThӖԏUӧE lW>dxۊSҘ4gB~SH,i͚)(40(5WQMn Cm aUI?~TRf_]A^,rT=t{uσ|,`ZOH`29Դ7O}6v]&a*;tcܩzxZ/3<|O𧿿W)KY/*D?uKI&9vNM>rii qP4?sO_uH3o #>A'߼Nnt9vK.: ] =xuo:H5|1ΟQʺ$Esǡx# Ť&&:ӱK)KZ1\7ev4u1ܩ$Hqy}ۿ׬eӵ2#jFv>볢Mt>axt&$c 9iI4#,p$mFB!s叓'zgDE-D@"Eyƻ)o~jH,И*;Ȼ!V/]kL:\'ڬ$xu]SB_cZƝԍU>($Y'IPca`} }P)-sG9s5_ڡPʓf4qܝ}{p;Oq8>;Z|-%Tm,2BH1TfOF̪[}3½@8((Cu?hѬ$/RH;{r+y๷KycrIVpEy/XYx5:&W H&8уoLUL~w*Ce)^+:QK:Q/mM#֑h<җJLӁMf qJ=(8y(RT?0C RmR8O2SFRoxcOCs߅^[Ewsۿ]yi6{Ҁ:Tx8(9<р:QJv!T?8=*FqHpHTfP>"aU5=RE.uٖ2K#vA׃^|^u9m|C%+,s;7șO&߈^fc5LQ=zitmgCű/7GnQW*䎘(4N@>Č(Aڔ8jpQ8lʲNh݁4AW"-|q-u+fҁ6?}T, ?j_xFǠi1%Ic^3op=Y ~izRJVM֗);M8R M)#4QiS1ғOz~F95o?y=>孴[6`2I k.Fbpgh!Pվ>h:6c}냉^xJ|-?nIK ]9.Wi%ș*F $c_>|QS+I GodxvlzWx_v+>s޽(<qHzc( vhj01Aݨюy4Rh) 1H- wOto<w9n艏cE3.iPMr>+tz5킬wÖ^o>IŞN#_ґI1F('4rh((IyIQfck^xDG010;^-8N/jhH'dE(!A|g>_ YDrDavȿ_nZs|qD'M{d;%ffg> xgyTǝpT{ғQS.s^ Ηkh &;P</?n.]-$,ϡz:=J^'OecsѿWLκf;;#7[ѽzk ͞0`g^ԘQM#S h'49HM^M/i5 5LnlrӑNkʭ' _g I}xGK-2q2;8F1Dzki uXh`w^kUY#ed` piƎiZ&%.hkZ54k'Qʹ؏B>W/^vot!l`p=ks[{n[h~TRmb@~炵[0-0 mӰi֒GruK9E$b)zSzv'Nh#4 ;RR(S{ң9ӳfҎM)qޓR`0sCGo?:qЊ湟^*ƧS+o2JGV'1K5h*}BQ^e}kYwes ʹ),.X{Ґ)6RGJV&9F:cҔZRr)qM8r0kO֣7bQǤѿư;⫍.#]3%gѽWNN2RFRzg(ȤP2\) NNii &ys72p2ݫ>$k|HӤmcsJ>g ܂p=x >*xsDG.;VYe_V#%Hg9&/|o𶍦45R"clp]3OsgP 2eHH&x*NXR`SXv"|[#v!u ᦀ-@Yk7085 u^ \7d`~;rxs\?ZWI'vԡR3]Ĺ#W{͖pƸ@v WnuH]Lk3g4 v4ZP0(dL#8py)QRyȦJ(wafNh#&ƝsT7Sfe #*l{簮F/NXQ+'$©Nx6/xNy y$ $f{Y<_}7YQ.eFIzoF*Oqvt dڛNYčn3Mmlq'<}r=sO?5yI?`|+O |Ax$qK¨ P)wZoSDd]ki8Qy*5m \koiSˊ6oîFVbQ G#>-Mh%{z>VyRPYy7HJȖJH#d鿴7nR ]F1ǝ$jk׋`/KcҠnHLO<xSL];HJC7$/?axV1>ǃo}#*py>X>}ͅ[(ϱ,=IA4`gp┌1(oLJovr \.:0 ּB/|]$h=ޜr^'zG'*y=i6GoZ<6~QnW 4;M#Mem\cԱ$䟭i:R1!r)Y"QQך:JjҚnHh8 NBсEA4JiG5 w0[F2LG< Wo^M_sլw6G<.' =AR)j|AkwH?u0c+ߝ'X͠?)P_UM)42,8ʺ*CQP(4)zsI)0=h#6]]#}zs^q=ƫTA0i6y7ktD֑uw?yϩ5)1wAI֛ރ 9M=)dĖޯ!~TE'z H|OSuM7LRS0?{yf3끚Ku+:6K7ڣ9ֽ8燗QQ m[nɉ?^TN)zpGJQHA"%w4{0R撎)) 9piH=iHP81ւsҍSqK(D +o-WZ@%9_ ¾S5;krZL\Zگ31+tek[6}" ۝OjTk_LH #ޒ(pBS֝mNSJ^c$V*@اO k8#\ _dkQف“ɌzU#ҽhX]^7)#ڥ~E(;SffPb"Lׁxo~(?3w0jPh olgF+ nw!1A9Ǩ-%[`yeWh\.띹Ͻz9'8gyGҎHdM.iqޓZͶWoV$*Ǐmmw5D?հ #9X WiUdE9'9Rw49QA5OuᏇKc)eU1b=#=\ͮYEyzlQ\.袌ߔĎrzdcL?? ^KMOQX1 K1 `{=J |*<[jNxwY]tbCt9.[IUd*#^-Хbזu>j>[_Jn43fhRQ@5r49!q_2%U G#k齾bN+;[Э5#|@>ޢ+-CT&+iG]z=御j6ʲ`tvE!4F3QSHyi8ƱgXtDyϠS<`lqPz/+:K[[H8ө>5l`M!\)ZaRM. \wki;c4%Os,ތF:ý"GZ4J[~?it`m29TT=Aɯ ;/y,O3rV鎌zCcOuƌӗr+Ͼ+CAE VXeP nr=0; yfƿ-[s";r *xAU_ x[LվӥII=$T Etg@7P4c@MSpCS^i/'SN4)AQ)3KJdTdV:`ՕP;PدI-xz o=Gб'+௅!h7771_j4WBtsA|=wh6#OȎeQ6ᱜcm]Gt.$i_RQ=sק9sڡwl~5-(4 iqJā@dJiI7rxCQSh7N1O'#VNk~Eye2=Ep~#S%F3KocK * ^qM=iIZSқb@ɪgX#|;P$]݀zCϨ>Igm?ٚLfdf)a~ekK=k 580I]Gܬk׿Eei PĂ8;*HOj1HOSRQI\`QENy>[H,`r5β۷/bt\3(?L ~t$_n zWвc5xz^&\S!ڸ3XԼ7S'#yF x-Y"e]zS4t4fhc5OR۰3R +7Z4+#qtcq)pvvO^3OS½O%GԲ)'iP;R#<Өv#UzzУ)HדZTc  ĖLvF lv^#s[[ΫwanBOЀ?^C0%G.%#WYY-7"=r#0L:zkt_Sޯ /- p"Ƿ9k6x.Lq5H80Vhg5ĿEgVUq>88LCھi)(QFhPE#XԜRbLub!P޴sF0sHG94@4QJiN8IW|s&"{u̟`uHcO^_JfY7h  f?%֭UR@XT춀,7^ZO99UQ wID8ܼkuξL94a RjvœGƼ:u\a+}AWidVro#SGcW1KMҁA45Zhl| izFmHZ8#==O5VY[%k1* vJZNiwb`I\B T.r@$ OzxidA̖|o'{לAM;zno0 9 ABrd 2E_ltAEmPEh`aUFr1sϏzE5"{ADx,}z?^uꑼWQ2.8'-Nqz1HizRR`Y/xf?p.;p^_ <?CO}:][pd8P{I/G @+J RL)Rg4wj@ii1KM8=iq&)OJ@qJ)tp1RMa_=֒xúdA 2}?\J5AZ-3Eɒ zB:c<'eET`#|x Ͽ f$Ŧkz?},v9^@PY}k܊1TĹ'`c҃ґsO)6惆X 4 \|_'@VK0d0ޙE$Q>$V}3A tp?2J6}Ie#ƌB0e#!#1;RtmGOfI}Gj07U=WIl=yV2P}kM[:@g=uvkwi xSGcW"x48#ZwGZnA8 yN*սϠ/HujS$u8=k!!c` 5)lSz8&4ipE.rŸ>q;ip(o6EKZ?>;խ<᧞;뭆y ;dm =Ij p6toXe(D>`K}p+?IcQ%Mi;m#LS?BxW6+𽆹jGQ*fOFxi{h@43M3784֜k~4|Bo.SU7mG00 8q~ q _7W@J`ngcZgoK kWo)U4J{8t鑏#${OÏ|!cF ${A;W[HPFi(D<Rf(J(m5 $l2H؃_9j>jK"v#3e3玛3㯌O|9wmf)&t' s]_Z/ZnK;|ql@ǵ@4h֚ݑL!OU'}>VvAazFIui(&Y \Q(&X"%&$qA\n_Ď-3;/ɯI+h#XAESi1KlR=RQJ)u&8Rb❚Li"<KmsKRHe]HwW_um7W:j>lG<gȀ}q5H|)(WFe㪩?W_?$[rVEU?{n*F9#J;׼UKo4:‘#^F/W8zM C'𼇠ہ8o\\нiSj퍾i%K$2 27_jmvCC]lųaDy֖i0Nzm5Ohmeqslkn![(E#ֽ((ƪڪ m3P=`Rg=h v) 5/~.t+m,d>$ug)CrEcFG'ˏ^iUcќn^zǟh4Ohw7Dfc[3/|H'33$nd?8>%Irgz48>]hi ]u7ȥ <\?o6_F/5:p$HOnD?z\g'1g{O5.Op5ǐ"0N7kwzWG4sĒ"dt9  S&;1Za47J`R4\cxZoTBK-:/7bozZ<;C '޽89XSȤtVڝ]$C^qsixT6H@$oF.i Gq$g!?WrI y|(E- W5O1l>HsnEvumrpe-zH(TP=)ӊH=? 5L$K`T}' C%%NN9WpXҊ|oA%<;dTɓ?M)˶x<Z$_L R4#5(>Hg@fs{K4 Sv.)6nN+,|5y ܱogb?{50$q?ឲ1 6Q $ وI5 'У- 8sW)I'҂HW9ߦ>64+`y Fx8~*x) ]}I3>̄1 #w֛ey\ ЭAߟO#5gw;9,O?SM'85 \ȱ[K,UFI?@+Kſd R qNثӭ.p9/W5TKT'^3H̃+^i iZߋ %P>֭Wfm:@'8[/_|/ׇ[YFᇸYO5vL`p~xZ(;I#@&B-tVOaԞ+Z?B+=z>ӴxGj~&!53倊GN3=z?\¤̝AvxC㮃y/N!1r(` _}.HHyb&82Eْ9°?ys؁5ď?-WG3skhqlT yEj>14z\_شC#h8<3-zgzgm տS34pGa1F^<?φx{mX,FysNqߴEJ!xq)RGCϩEj(Uzx_[(t/ Hh0fWl+W/PW^\7Dҳ}qNO]Юt&#tN{UӧEB!lW2ں-q,fӴ$?+HDgz<+%?oVtRށ9-Kxf5+G$l,c7 $)L>`pN9Z?Cs;/%igkMՐdפ⍴qGӌRȠr &)ÁIӗs@ڎ80:"xNE 7 *ҭ:qB{Q:|s%NJb}y?x+ N)a}}wSH0Z:RȡXdk5 xzk83yh~xgV[xou@4\WcINқ};$yϠoiu=Y|˶;'a=տקd͸*R3\ăp~x>&s|g w \sLca~RM|o æ~?7o_38o_@i1LVVezvN%[i5~=*S? 7p8M!(6DIH# ҙޖSJ]oږͰ^[IR3g5oU<'⨚&)R)ݎ) =c> mFOi "19OT?~5YvOvri<SM}3(Ji4) \RgRw~$Ky1B?d~;@#>Moi@oǨ}1n:x 6-J{@Ȃ;Ixl^"H˨[S*$pqI>Ҿ;b"񤢍C֗(.h#4g(J9&pUA9|7{@(;^)^9^20;iC.yS8ھ%~˨j$'rF0V_Z1֐RpsIނu(ɥ9=O(sO8?ZPFiA5K(d:GZ_RMIE8sG Ju1jANN  ~ߛ58E&ɧbx^ UƢ+m2JG{ -?h/]NǛ5*}FcW麝ay ݬ ێݪ>C1t5d>?O+Gž2VUe =s*XZK`l{ WIxc ϣq;4I Đ=tˎԛivVl#ЭnVYӡ|KWlu'5y%#rNA"ɡE?*-im"O[ |F-DbrZ'9EuɢO'{G o#$AK".\&Jgp8|?,PVhϗ"GȤ46q8rM)84u4zR(<Ѱ:p{;X$rOS֭,=M[It w1Ty?ZtZ­XqK=7wEjXxn(a$ʡuᇀuCxũ*\2[0ď!*xkPKz'"}?1R0S(rA8>x4P9敀"nZ(b4P84Fiy%~l]!&va⸨g/ ,յgM<1_OZ5Vum,՘ַ4u֕F)X♜ӻQJ !4(9::*-YouAOR>^yhKښ)hiqGlYU[>O4ZB :2ЏC^!~ΛvxkĨ} &s| em|/|MЩDfmcڽ$DcQ@ 0.)EQҊCHW=y^1HrzLӏ(ϭ/jNxA/lќ6'Z\bi H_?|LxRic\ܴmΓ0"Ag4 ,Q3̙H2 d_K[]yi ͻdY#p>#R&3ғIAa_;|F?gt omm8 f2}5ڕ@*z)`: a[{gNJ)=p_QOldz P@)P(')AzRQJ:RwcԪH)r7vK`Jx1`ƚ? ZW Ͳ(c(z׌:hY=m/}ӵ}A4eH4[lzLqM(fHiUFY52Ub8HckՅjv(=?ҽ8fF8'"AzH2Bc5 A.6Yfgs\- ͰrOz{t[_5Ak1]ִK\4rq 8mĺ_tu.K6;25]gOQjps $SW524h&BߊMvRg>994&rqNHO4  Q\%!sE, ᖇ" L6첽x+fl4çbͬ7̐.v&?`Ïr:bEU2\Z)K`d@pu4H44v(QFphc4gsMzpEm.GjI(IQnfcMxX|1o v$zGVu|:ӬkK 9'~9!^ރH3E;=p"ҁқڒ(Iފ(4`ӏZF Rj7sҜ9KHi1F)@ K)xzױ_8>4Ӧȓ[YC+Aw< 1QM4VмHă,p6u_'Gš?1_o]|7iZ1%ӏG'z C#]ZG^(>cgX\dk(v$uCӑ҇$RM)Rf K9* vR^ XaE =X8'֐e#[@:K]ݩ1NJq4izP(=AM$rM(8("RoCJ} Jy4 A4tJ|%xCglo5wR\&,?2Xt2Do+^t} e?`1`<خ(49h3sC{ZcvJ؃=99/x*th?j夷jq`OZ}UPcё Rm׿k~cl.]1MmhxL)gBsMy>B)sH큟J sOmk|yAxninVqX1Iϰ0Geç[km"6㿄4"H+#ycLfCz z`UW~h\"<,휰G* z."E$^o뚇/ƕ-y_o];iZ1՛E+^Y{ }|5 m'VZ7C&ϟ}Kj>h5Z R'$iW}yng^Qꢳ>|0mk$J@[9f#q+MC"!Hn{U`m7~c5x ,P0,L[lt?uL`W%^5 xe)ډ$ec{wVJ_& ~1:ҾzC :/<:k6 ;䐮uU n5* F@Q-\P-%-!z4:ai2 ]{t:2i:ō슻 ]z Vh!҅4ARP\Cem%ċ(2ǀ+McR4-,s{3]M˄ocdx׶c,_C^L4ps!سzizJ;ғB)1JgɥQE!0(!R)K{RdzPyzF1Fi6Q5/e9R/)_)נd|lנm3S%̍f#^Y,+>|1k45K 5MTsP3Z=ԫ(2{CTީ+hx}}BЬ˗82JGVњ\|/mq G6:ޣ~.7y#VnL_WUXwP]2 *#~0mkPIi@C1vD3+H!HbEHBP8SFgݛG$= 8.jUHp(g)3G4sN4K1Z߉a%Q[֭r cz0<yךZflQѻϙEǦ^i|{WƖYJ@ RGxc =kKHoYmA$r/FS i$'j@ƟG ¾s/<f2\ʥx݈rceEVd?) ?{ 1_ܺ}m bp3aÄNPł zǻw [D0F{s]揢hv"982H~S)z9 밙W>Iq{7j4]~ڸ2Y1z}WBU#֚tCۊm0Z㐎\GjxkLMݲ)71c 'zӧ ԭ-N[vbQ)K)Rs ۡ5|'ѫyVq*>pT L1ȧ3(]ئ(`Y1֛N)wciwn9/Z0sր9Nwc!> SRLF)q0k=܂8uOyΫT[۩O矺ǰG,`uw?yϩ5cxpkNڹxDCFvG(d`UA Z;Rw&A4QFi3@斒ZD~%X1Ԛ_U̾$ ǖ/c'>Z C) dЊpP cE(vR vM& =ivhJ:R04MA֜i1J('G2Rr=QIKHI&N1N(>dcg4c4Z^)xQJޞt⏻^KS-4'dc%y`?fK-4{$j/R~R{Cp8VNMz˘lGQ/j4cQ^tQOC{#^ksw,2O_|ዹ,e{ҲBTaO ]u먭 վs)GwE5݃Ac5K R?2gG$`Hf;uσEKPյ M}_\;x=2{ ߁WVl6v~n8u>&7mvn(#O< 8(yސi.8yc<ҐRQE!=2E'E sN<\6x#hi[|ԙ<өi33@$t8Cl]IAۑL'ST,Ii%p?^KC//,KYbenIgK#v|8D3Jצޞk.V'@XV~3ĺcŜwVwmn fR9"?f g-x,{a)eU,ð֡,D +qܓg"GUكO+cp+2HK[8FOv>5eFP 6Mc׭.`9_c=5CKo/+IPdžOS!t\hQN* Wکb`bcz'+t:KK[8q/O=QO~Xԟ0zW=}t2XI9HҔEqq wx\ǫZTl{WҞF [L4R 6rʉ,!׸hQu <Ӎ7.@S)yKQSsK\N41L?5 g}Z$Z[icQq0LzF\n?Li;◵!Q-7杻"0A.1I4qE 4A(C S4A"Y޹gY[.x%?3ooS\L޻Ec pSI#bGՂqM;Q^XÝ}*jy&\n>fC/ |2<3k{-Ɏ8Gn nFrq1߆A\xbcƥ. LyHbv|տ>/tK̏61#it=E9b?6+i8CVF[Erus|IsN[RL,m{kJX,ZԱ|xOSI}r=#+!k,JNGN^56LZ^ WZ븇[u= Տam;.{fHޑIyb0р'?Qh?[gqAFz"sc$'Y#C#`y8"YG]Cn7K AԱȓFFy ӳ(41&)E.("9U\sH0NGQH)rw~h'4n8"4׭&sZk.M;8ݚ}M-F\f;9SB W?h ;(rVc]Lg ?+f-W$~+㞑MF=;U:U<Ȥcn*IF=֘qQ8&G4Xk~0hZKOióڹ1}>F{כk*fY:'YW\Ck[\<=8+NenzyHRy Ԫ9k'Zm4C=n%?3=녰u?jF;%81ףZYchAUaNF)qM2餌pEekZEfmWryz5#kt5F_C#k-RA$L8#5 0Iqw$t}n6X%e"H~=1P:|OԵ+ge w1cGQ-"6G#VI+ >+i \)s -?U^ PLbXu"*ե8+OSdӗ|}SsO֔qII18)<9PolՀ c^z\f-;dBsJ,hIqHԭ,v>3^k_4ퟍzO#Z RHNx@Q)M(Qhz_4a~*} pmr%]6߭v΋k|6pْ}YK~&\x1'j.hR!=X$7Г% os{Wşq6%DZ?hYAX[_[6."YcoU`?Zމi{Ì{z5%{j2*$ [38y@1yi|Շ$n |~`AMx់ύm5lՉ "?VLF+ jI;"i\b1ޛizviS4sTDX8kfm(xDx{½x'7 R'.:>+5 C9>ҊZ);E-ԍH(4SRQNE QރJ(5ߏ-џ c"Ƈ&<r5R7JE84$sM421F)F0xKގi)d(cBE&"`XbֺdėN?u2G}>fom EnH q 4][^\gq?៮x7?dMwD ƞ]Ri#BK$m=8}_mekMj|(+,Dːp"iBNR3<ҞF*9P(=)bR .)4*@\nSiU-wNe dR(&7qNwhPN)cxĖ~z GY>nS<{mi}{r̮#OobG]>k 3))QOZ #=מ)ԓQ#Koe#XXgOj5߸_Kx7Ŷ^6XhdTA  ixW!fonJ-ъl5M>9`w {TTz]C AzՏm>5x62G.T*_TXLc^GaڵE+$R1X~$-m n~ߩι׾(d@<@쾋G88bEH@UQLHZ 4dS3lA9o*>{la82Gʣ{W_Eb`ss 0s':UY%k=yh_ف_ZGxLԆrLgEpe"uv$WE-FlNQޜ^?h"g\3Qֳj5KeRrX[Z>w⋵k|2TrT^E_[ztoje*p0~#)4:R6ǞM4d]U/K2Guglpd*ps]<;: F\u GNT|{=W<%1⻽/-~Ѥ_$Οu2GUgr7$)>Cn$Ѱ=|YPu/r_7]7=A=補qHid@$Tb8*SNi{;}1[Xom 1T0;O=ߋNp9W|d`xǧc']C[:Oɂ9(!mo &xQ>)&{rx4i=sAE/!lRJ2hA7+M[P2.Džq_$ㅾ xL% 5l_B=Ƕq]^(4ё֝\RҌiLך_94)kĞ'%qsr|OzumreG$54TDUT`)Ԡ<u? [jztfk)%gݏR6Ǧ~ǾxFNjnk /rfˡ2u8o^ya1 #N:`^9i%3l[6=wfx @Nsʍ :W_M{ž&]e34 Lv6޻XہY!dѱMrm(i"RPv~~y%=i7.ӸFN{dkK"ғ֜8qM44H4ɨ#I|U))Eߌ~x-ŞIՉvw; `z Gύ$SaƩ@RG_k-Oxe' Y%}>uQ\RQE.)Z)h=iMPE6ڒZ)--!S_%n7`5}?^Jw\o>f[+qru>V~<7?k>s ?~5Z'?4u4^f4zSC(y4bh<(Z&0hϭzKV\YoBal>X'z=[rc\gh;7>?_GET@T ֖4n9=++Z;#Q}m8{2pExŸ  ]hiXF衽)7qd<_]k]=ng6Q_L}cgi^M2/xcz(J=(a(=2)Ғ5UPy8PH~J1BHGܯ 1iW_u樎6<>Փ>x/|gN{mq@oGrz.<ۧ^iv)ZwښN;fiKqHyxCM/^cG^isN9DAg=YϿ})'E;4A$RAi9xZz{^[)g 3=OF3nkY벻[FUOA ` KL[QO3uy-|=oJ9Ӯa7I?W` m$3L̍m אF3<{ԾN2 e,nÎAW|&~!IQm3+?_Jq=&Oe] O|1bMkzO]}=\xɋS,X4>+uWO]) q{q⮬ֹx eagaww:uCoOv_A:*JsA'fIAZi %X?l8y(@? XM7CcA0"&?_ƲÝ3VxW(bR9#9+ͮ4iNJq?,?ZgYZ%rpϵKmO:?6_d>>~9nuZ16 r7ޣ f(U֣1%v<}=omͷ ~ٷmhޜ ׭|-m4cKO# k@<'?R7MlP;Xddv85s$w#$ΚҮqOF"F))sIH+I4,GydTf1|ܝǽpIexJO KpYe2DvG}2=k}9yV4Q$Wj)FM2KeU˅>d_HPi)z oC-i{n); lyo:`b;R'SկKuOm~xbk|N?< 0K3rK(뺆>6{Kymv#6Wx?4}[Evncʨ_lNF9G5pܚu|☛RARN'NPWS)yq5xhֶeaӴ^N/%>qo;):ރu :JzRR=+>+| CK.^'2N+š|Q_(Fԭk'\=G"5{UQ%ZZIHr\`n'Q"FUF;~oKo C$|LXȒϖO nCi:%y ,]:ҵQk7|I&"=nz?Wei- PxIz4Qr1JzP)iZB֘*LqI֔/R&94&E)()(RGRi&[&F(|>8ƾIlfew,ܺLg5[l$s?gxw& x6D=[q_I @uRC6:Tjj4m'KbL`YHPА+^m!Rd$!xJ)LYCz~U dv%e'8r*:EHb{_.Xj?<uwrzME;QGM͂KtA^'lB}nx>?.5Zr(5΍ IڲDͷ~:jc)#s6>3+M  ϗ"_7x;Om}2ۣc=^FA^ <jߕVo*A|!] SE~(#!ܨvz1נxnge?:{Рx$ H͎c8d|I+ R}+fSMqP4jG#ϹR>U-c U!@*dN0r(雬t^"/ooUW𷃙]SZIHdSw(8`I.=)T~&ǁbV%9&GFB?֌a{=ϼ=LDEםf!Id4y cfHǹ?J5 oi]x$k?eV Ԑ0GsQaǨYJg:1C"ƧFIu73DlD? +<'MN hgtJo=/\Ԯ[ZbKfA$@ϫq_Bl^k*I1ǘH cuZv$]Zo5wɳjzQX?$Qc|9?nj!+M5-P I$u|sV~$ֶ-JK{7bMOq 7z@ZS⑘"1md2 g?- [U ߦvo)e_9܌`xmKG$[Pe q^?Wt!g|@ uz5PhNM9n ~8}(=3Fi LAF7UMcOMSDӤWwm$ u*|gxWVռ+J frReY#=>_q^zek$ F@ԒzWxP_ME/qih &OBgWӤC}izLKB1@"ksғNsA (=i5yȋz|-֎E5dc!s{v(v8qIҖ'?%輓BzN֑,fdkcm$(21qgBմy?uu5wĖS $=ǨGz\qEP84LbځRFx.i AJiƒIJZ3Fi3FhRh Ns8}i)@&S4MCť#5Yȹk;vq昆}z8B8R?7÷:l4ڼ&?U4:4fmA{y}Ϯ?!ҙqWrjw2:jFrqI+ z Z1;'L2ʟQAҺLӁ8P99 FGJn>jQփqA\ґH: vҴdcNvWտפXәu-QDHSʻ|搊QҐ撊)ݩI(w0Ȥ Jx x ןS⏬~?M xn5 q}7qҌ79#LsNJ)d$3ecQpC˟EQ5ryG\e$wVwVw\[7$8eaGxSgJZ qH9v0*)]~ (Iip)3\ю)I8S@!PSqP&A4޴ݣxcO4f+zTބO/igkm:r4r\Z:R@#-fY(g˞0O"G_D_;|zWƁZm2~Qr8Wh6:㹥%Cskoy)=RT ?#U,t]+KӴ;1,}zſ_I{^5fg7œr=+ӿf]ښ01_P׶SZOt2F[|;ny[?lj$␥ Vx*Fjn+?]d:^K;hz˞)ӊ*$?2D}}߷]4sGJD94u8ak`u٬ s^ץu]"b|׌sƩ^ ރ"Kh֐M˳t?yWďxJe{AO0W.X0 놡9WaBx^5}Rt,'IA_gmݜmo igh?j1^ 42)  ;!Q 9hfh}izRc4cS4u-bQKRQM*IKӥ/^ӥ CӱQ[r֞2; 0xɤ%ki;xv, c<6O[޵mMQ-mT@nzwѼYEFy*}N3hƜ=(M($&ľ. ,|>9;|Z2/DaOY*<Nݚ3AjMԴҚ iTsM4K"w žmͫhr{ć#O)O%G< 8}x`RAKV"4{JpL6<]+ xz/Xt\)X<أv$z >_۵Ŵx;K|6W+Zk^*FsN~V\SE8QHiOJf2i|R0(3qI'Jv4O)yShcAx6#x(PxU_1 ÂIxhbxI#~+UЃic!_E?Ӯ߅%-[ƺcR+R:RW/*M4 j=).:v\TL*^*Ŭ28w2EV,.}ϼUUqerXzjkiv_}Ϯ: no?_j@C&!O*q^֎S uӎކ~)iVդ7AaK3LwH"19 G>2*d_zǽN'*ҀԢ0NsJįJԛ4p957bץpiI'u&LWS]}~gF)o' +3m&^{skU|]$4k6GnA]K+/  @~A=ݫ ]i;ծ-3lpIz68C7$dF+ q֗Wȿ(֤=i0Jh)1iÊCEQE3*)f`I' xZ6CN z/z xN !8ǽtbNOJ /j)(5⓽.1Ep~'lJum 4roh#*|ee~ M>ߗ뗥%M/SA@jwjBhuAlQ֊i<hF1@j3F;hS4h#i(4QIE'95i̲ jZ1N7&F^g7>.s5 9h&T#Q#n;חwf<:?|r[p\A0^iYx^)漘.F2=+Ѿ&PU ?`۟F;#^s\֊QE.sANi:Q׭2CI#*"pyƽKc%Y(E}+ׅ }l?y6:R6@ 4sޔ`&Q)(G4r)\Uȵ@xX,T1qkeĚN#_=:1N({Vsjm"V; א,^%ع(XʋCC XIc=!|wbRi-M̹;\JY 5p ZvqF=iN4nM O҆,T ,yǥ)/zRhSxW v+>Y5Oٹ1۬s8ܖPxνGhY*AB8PʪDt J=ַ6%*sڼi[/8^~Vzc׽u/xri٥E4iI⮣{?M[b6_L'׶O*}|1Q-jrn'9_wry|[)4=08't4׎K[DdNcPjِ|8I?$`6p !PiP *aн@[m˂ȎIvA#+ ;o!O G@AR2=hۚi V4׼9X @lwxoZJmq%ɉ8܌NG8zW_|fgnPj˷+o zc,힩3ľ4CJ$Pb(#'۶E}jg%V 8UQMyǟwwpYǰJ3x躜sȜ, HXz=I1KL;4$+hiXAv8WkZƓ#By= Dz\ 9_q%Ԁyz ۢ2GJ3í.sI pIҘSF)3 sIKzmGK;ѿEOta])kz7^4g&(1KP RA[җ䛯 ]>H?{mNk&v/J6 <çcHi 8);RRˋ--{HT}IkxNq%DB%Sg3j*F/+?^ _g&SD-Ca^ o8G3 acȷ0Mc^jvzΙmN\)?ƭi 7g+Y}WE292A?xυ<9pfoϺGS# SBf)M% 4 9=h>v\\"1fyj>4F#%998?3]ƃMˀofa9ڵEސ48i-Nh4S4dRzQH4i3FG&hs(fxv|哳7þ+nNDY>OFWW2* 5gv ,NSjSAM47ց.("isM;zfo-OoAI:P3t4N=yƯxQ^i񼚎^HQ,mvA u+b!|_kt6BnO!瞔1e}KB]n0#QXc< ~ y)jLM1 b~I>ڽ#4 NqA\R݊PM)⑰U`Ϳ8|Zί Ώ m=7qǨ)xn8bO_|ׂ|a#:c}߽̑}?++ QenBhTSH"ek%̫11^o}j~5ԆF)c?yuhZh"]ҷ2Lsjr)Πc0 Iip{4)2FX"yee4(I=5> gxc;>TA"17>,~<13m8UdSln<-j&tq|774Aq | !=^}O~&;%O, qчOwW<]a6Gc?AǩZ;gH⺞ffewzkݾi^DzK,MW<ר h)9\pZU5-{K!Yu=BL |F!~ߴ Xœ '2*`ϭLjvڛڜ=N4 Q M)S}ҁB+Ý V{g8=sc51 n:͚"fF1 S0vH9|>gRCo56~c޾ KxpA0*SQbC" xsJ[u4<+LjvIJ[!s_(~/]<.nnWw?P;p0;[a]ܪц>?f|3^idGŜ(O>[ vr+R >;I&~;4Ҕ'E{];O`Aq`?ORy-Zƍ$PI=Ǘ*)*sgMq_,Ԭ$rkyw5ϪU >&?uz?'H셵x],Ԛ杝n-@j^(1*bOj|{vIqHd!ϠryGSѿh _\Go<#_;{xx&PWR8 &PE7;6i^GqHpEb6 b;W:FP~SԧK"_]|6\I6rv(r ¼xx/WT]`>m?^\`o^V8;xjqu'%"T$*Xj 80byRѻyњ2A`i)z\M&ih)֝.)JZ\MN4Ҋ;'#8W9x#մ;Ka۲B?\7KftK;imYn;eZhqM - S4A87Ov`=n07qcϗwPix@0 c=|}zƫtƒ Jnu޽ObjZdwr6>w5IU Pz6;.Mz&ZhKkiYϩ5{v sR"CrS0E/8ۊ9b#ψu_J6H\YhO#'꾕hcԭTYFTg8'޹_?4;x֒Z,Bݗ$G\gs>mg~x }ʲ?JsP:dFqTD zUI#aҠeU9^@9˦鶱^Cd\dܪ?9Ea4 }^KGI&15r#\`Sqx/VN.D~\Qf/ÑڼB%ςuZ8rÂPՃd1ʠF+Z.zt"~?W-ɯj6P>[y`C`j3NGI`qyGn15 FߘZ2;d2PzQN:׼'+NF)Ѯ:rRg5ǾeV3k4/a{ן/8i:Z Ck.<ȏ$De<8gk֟"}ST }rIbd]BeUV.vWiW<|C>XK|/ и1qakm٥ӱIҗ=1IjvM^K5Տy:uL XBzg+٘ [;KuHdӹՏsZ <iNc(j:ъF`T"7㏭L3KIJJZCQL2~hHo RښIҀ+ľEzsc-?y= ėBLC=WJII#uxVSA)ih)9)4iݨg٠4`Ri(_Fu6".3OTW|񮑤xzhnn.~6՗*=r=wS' jZZF$P>/\m6N7ֶUp[_[sE;4f^)(s_o>#X>tǎ!$~Y0 p:(9;Y# p;|nOJgq>1zҼK CjwOI cV1辬{Gm4Gu'Ԟpz󎴋bEQgn_Cae7.1B>).ԕؑޤ_A|3cjuw sa U98 x[x[R%cuR,d>c{/A[&k=P*LQ> ?c9νx'{|UZ/=I#p(tSTJ!N 4攵6N9)Bphs+ER03MSh4-4@gh4Vv$u{-cໞ>Ú-Gan]Faq]G>4xcŗ`]6B(R{+3pNF3^M"SH5V%~O }yT1#@Pu}[z5fNw' GzrJN (Z`f :"(jZmYn=]J?A\m5@[hP2*=`N'Z@O͚ڡu]r*Ε`Hl,0|Uq| " fa80nx|oe{h9{! "FFznOӽrdQĬOI9$OifFf* u:cLNZ6I'JMВΰAim4L׷|ge ۼʃC\GEx )P2\v+c4Z4ؕ:k}+)P(O{rvSJq12kWOxkxYBT9lT==kolºX\+rF0>yd>*iUċb#c=^⾟^Fk>>^j19BIL9IGֽ~)æiV H;`>+? .$O++wTy@[fyk5k\$% (!Az'QQPM6Z(/%=XO3 ( gG/WW0[;!+zs9^!iM@HWq`+,`K[H(cT3j`A_JQހ2M-R:h'pAǭ%),@P2I+ਥ$$yQ'ʄRð 2O~: C<6rOp89|.խumIɒss#=c=i2ƒFUU+ Y#ϲ}]xj.R{޸i \"85ڽ)nҎ+_6n~i{,Ьp6'Ӆ=߮IRQ`=ǿhOYǡa%ngDEV %\qP BD-_h30Qm'HOyF_s]Ȳ2`rg|GOenkB`=xbqo\|'kwQ(.9c C7 ǷQsOLjv$1PzY7}c693ʅO.L5/jZY8uf& +XඉcRN#RHM(4 3F{ 隴q壐DInDᯋ,|Y>x. ! 4r($gH>5MN΍>,68$nv;+g{O>#$"0(O;Iy_@1BHV7pvi1hjF8[V既H3L7̤TpǰsR.(!CrAqS֝ڀEңc3_:Nǟ|Ɋْ>:($܅gj.^D&*pG+W#6F:1\*kz:ZS$е%#$t|TO&5xYKqvـG~Hg4c4GJ'.h|AM|}ÏB,}O#KuTdd8;s^kH0Tb4R4{R]S1)@8b)r9N*6{h_w 0xLkĨ=WK*9O42\ d.Mp6${ED㈘RC|q9SMޙt y`C!ۭg!qefZEwێx\n/-}BY] Ul`>%ž? xOw:~UƬQ">eAO;Ǧ>6\MM&yQ@QE c"X!$q>WZ5k0:oH+X#XAETH#EiҒi1(&J(Rphl C69g4bRs\gŽBM3fPkϠ|'S>+g}wc^ckإդHӨ>v5aWӇT];Gjr`;4AJx6IRFhRQFh8Ph@)qIҍԜ\qIE(#H _ Jz VP/\瞠A~V"[?;5U`'5?]7Euj_e2LHÝ2A\4x㷍n-dmH`'!IQHܞ8j?χ-thQnB#l~5x Ě?AMbgnXDYcA^W҄IZhzךZXh?" '8zt r޸9z\_kn9 x2_^$Qj6s< ij]R wԄfUlm!YCᔌ^~o|K^9# 9P:u=j_K,!˞KH^~4 hpiZ\MbNKܓZDR ҮM;of8Sf_[oku 27OjmfCCZ,ūaDy֍9M@h 4)iH!ҊCBiH4œHE'Ju74`f$);M"`c4{SYw҅ńb(Aab$zUº#C{5ۙ:oK}p={ނuxʥQxc&L^0]Icdo3}3{:G|7JZ컄1ξau+o8:H=)q\|Sm@cM8" ރus rp}cXQ*(UF4 4ފ4dKb);c4GM(MG5E!&(#Z>3U&a~,үP4RFHYk ہѿ5 ;3ۦd}#Nֻ𕆓GC 8r[Ԛ?ZhW3[i#TgWOFӭOD},NEr^* 0̯s p3>ghMjЅEt>* KG𽉵l$'2HGvnVj8jNJ lҬb(݃K^U͗e4՜3x3[tgL\[|(qYI֬ 6OlW|8Exn.>ݬ:2BP{

@sFAO:?xr+](MuܖFi ~P}ڻp❚LHi3O)1:(( /*=_8Gz=krc]gh;}ѢƊUF;G4th{QIьP:N7<ҊtOҀ܃HXgp(4':ʲO͑ƧU'gWѝIӺU]GM,!$MP{o|ϧ?ތ;A5=j\>GGCZ@ȧqG=3J:P)O"1K1J(eQ(4摨 LxUIA@-q9`Rާ Mׄu{BE̶3Dvswmm7^E-ȃ} g*+oI|;ة7%V( 89E}FIҰdfj.A&-Ԭ:u Olkۤ.wRrdooA:((9)Ú1HE)AbD{OGAS֜5.1HzRwnQE.h) д!IxHaA·xFj3qI4.ZRfZP01FѸ>&Cv QM$0M.B?q@ߚwzP)RRsڹ/KƊtId%Q|k ׮tIn4VM4RFxG=3𦍤><@=nqjn:fnFO ߃Ԛ/n"Ox-Z̬9!>ׄ&_] z'%?U߁Pޗ4n3NRiTr)N9`34c SJaO#j<$J9=ꨏtOUgrOZϹ3u>VLwO^K@"57enKFԴ3v容i#t_ך/;R\ivkľ6"Wֵ(y 8 2q^|y<׬ JsbJ+V,MO,L}=U814NHHdV|<<[KC.#71-Eu!m3^ |>~mVW/nć=N2_v\Rjwm ǟW?{BռYψZʔ@iYJ:%yȣ80>vR!,>)mv:Q^g[OFE0/Kejm&Laeq<9v,@_»A󷄭1w"D+E`6yJdJms,x*(R(Ji4(5x*V,ߑz__Vw<$ҍW\Vy\X$O]w I9ih1I1/JdUimNF)u.I\߉<* sMJ I2qҹ?677#9 5_n1ziV.@ԔRմ[DC #t"S5/j#R$i,8qAivLyQZ'V4R4h(4S@pH:Ӎ4vh84f%>J:-_ xi#BQ4O#I1H4#{oN(u*"׋gF 'llFSdsI4)ɥ=qAy#p>+|6GS/<Kke$ z8/mmaQ/Ah!'? erZw 4^va{tCb{ldS]gƚnyVY'G"q*-idIz~W ϠoPO)Tr|q9V)[oCNNzӉ!9)irJg;qҢdr{R"4)Hԃ;%uy'HZQސ Uu(X`WZ΄Αwk?N>+]E.د|ںQLaN8MQNF);:P1JO2{QדIA 1A4P8SI9g;5՛ڗJ)ZL.ʥjiZu%*ҾbgW<ǫ9}gZ֢|BpϷ9}wmݿo1?(nuy`H%A'ٳnkea:ks)?Ʈf84/Z-w6Uk) :v<~+yayp zg hrQ:$ 9uvKEDw;P$uMώKg# ڹ?.r@ߕ}G̬>xڻ[o'cʼg}[}z;ž 3 OWe'տקl(zҚB=(m.sF8%(A硥4]0pqRh d($0[4Ƀ7S ☲v½yPȥeÚԷQQu}i!7?TOtW20R2 [ރt5}3rL^U'!"Aٽ~ҏZqn:SD99Q׵d>xFOy4gK Ġ~xwUּQxW ̋ dǛ#@8k1HXuHGOix=(4wx#iC.yS8ھ$E.r#>տvtf(ޗ84ii sF .)0izMy>6x32[ɵ 8tHHSMgE|"F#nHD#9-FN})ԝ(hL \ e2n'Ou^E-^9( 3E 88'Ҕih(9 ap+hdnxI[)\P~KbQ~gcy<NP$isQ_p+yI1ǚ>pO_G-Zy9-=jfJt cO'?O֮WJ$<O[NsCtBן7/vld}BIGb3X H+imFCM&&𖀂ݮ%Q?SSN+_x|Jۼ=>:VeVڝ=bH^#؎NJs@Hi[R("C$9¢I׿hV}A|#ʤ!xٍ~l}H>©~:{>*Č~o!,4hjUa Xv"zюԇ)3FhӱNha41Fs8AM4A,+?)t5d{A'~^?E*_|tY~i=)%-R8RLbsKPy#sJ0G4}(ϭQڙbER}EKӱiZqFח|~KȢQ?ohV^J~Q d ?$wyd4]@6㜖p8NZ]G[*ц.e>D+W׌yײ|88,$%Œng85O/CEw;h-h[ѭY/㸋z߭tPi8}J)iyړ4hqM$zV)qL$fќxXCB-ޔsޑM1PÊD$ zIQ"8њ" 6⥍>SEf:3ZtZ-XN_q}/nRxMTgLR:(}H^e=w^Լ<"rB<^6U\L;KAhh^|WDhS,c iT0r4U}N 'z9 +8K\I  }|Z:5"WE9yI#U z;t—lq <pk>cLmXzzqHSZJ`^hO& AMCc8+^n= e[rGm T*4f-9QFp2x/ s;hOo"Qn~ïUzzqI1J(4Ji) 2zP$g\Q^Eŗzt'Ռ,BQpL4KjFD9h^sRM@];U İE1+g$g"[wxrEs#F1y1>/Bj\)3- vHx4R9jS֒Bz^{_ M\cBB]⏃zo¾/[E+wuRozpBqK7K`Rn= j7ڍ( u'9.xA"gִo|އn:`Z=ʓ)ߎ0i=;YO]}vgg?wԻ?hmbkXA3FoU$ݳW x/N8#\\y\ٟ@N3޺xLN6$J@-c3 =ލxVY?tK  ;G}H[G^Mp)szLNVm@gi<4i@x(C=>"zwJv$kz7^RzRiZP8giR&} ԸIsA<Ӱ=h) qH*Uz"֓& &(#s^=xzSLs0O5ARZ$.8#Wx<=-qǔ67sn691^9֯7^Rwj 230c tҾwwlt^Av^c=@ڕRv+,VA4M!#:$m#TQf8zx_Е)u_Һo VA$-\}W߽tXi{R/4A4e7*qsM$z4Qo.sASsAnߜWxs/>ѣG8#GGס[ʧw|TF L#˻{ħϪ7<'v݃9[ѽz`|ƝGƿ_> 3c!c'_' Ûu[L+B6yw}O <^ zNsHE RwM)y6z~`QyO)^}=p .[wIMϧmx9*T\9#Wð~QO}q&x|Any$gg'k&ŗ<)<& 8p] 8z䞘ϼRRL,sp4fbjP@A4c4qF)3Hi43Ct-6I(IQfc5o߳eQt,a(f {ђh3N)Kڊ3IDžtˆ ^&M}GVOu>žm%较֔;WBj^Q^(&oGw  K&;! l_鷲CP˅ 1p:]Ư]Yiv>"sP67S5IbRTYniPpp=vĭ ˧=(rY3wF+{x.[WtC!pXTCtQ^Y÷:׀/2m68'C'NgMү/`Ԭ [vw 檀OR@se⏈~-ޡo-S i%~p03x?tGo"*!G=$wpG5D⃒)qJy;H-(wަMǥ-s84q5ٶ+'Ƴ#[/S}ȧMa85PI5 \ړ'40@ZwPir)敻QFx49(#h\q.iQQHqH ׼#xu*+9~?]/ m֑Ag#лks9⎔x=8QLhitb桺+hy8nfcxiZLly_op+4 ]~f#ڶ ֔cuqJM 88!PS;u}ZiMBAqkO\k /nG~1nϾs\6 |o:$lgXJLAw9^& 2*NOS^XV Cfxg4tnbM/O]+2$*>oZS SG(r <{לk=ZϦdAQN?7 tlgNT߸Apr;PX8RJ)94#ie@5)?5#c=()sFsKQQIJi;lc1vyj^4Ԇ%998{ok|=iZyp7ɘ|ڶ@GzZZ>n(A┎)q6(fx'ЮN" e=<~|Dex3Y3Hr9.#|\T|F-`k'lfOOGҽþ-[hde-,YrO5E4.ZQE!jWSF[w1 ogR#r>c3+íSZHvE܊H\ n:vp0h$E,zn<=x]S↡6۩YO)f< q.3ȥMQO?ŞV{`e&7(xc2E0u̇b'/{3Kڐў(~xR!%Fh:S$!Jv3:MyZ()g  ң 4Uk,Ugc6u]KӴh~v41t?{13=P Ui)YBK淒S9Ӳ{QGGFxT76]Kmqc7 `=?v?(݉o޳+ sw +kWv~Oj$i2~8rb]o Ó7?[`NSή}Bf$;PNON)bR2\Sy?xoZKH@!>gh߳ip΢ra!;E{iV[Gmk ( J(x^TFl=He=)~l&z:RS1!gԊOzLdP^鶏uw* I=OyTZ#CAp?CЬpd>+H i"W#6-Z@O89?+ |PnӮbS>(|%TLl4* W=2:t&4dž `9aR2>=tcJiqޓD$ٸnҥ=hRKBN(ݑ@sE'ZpsMip1M #3o=) )̣ 0jXZ|68U^u{SmN!Tdi\ ?Ҽg }hp-/]?8]x*MC s$zƏ'73+(?T=})鍧BM4 >P: VޜA'zhȮ{נ2&د|oo~ߥs^E߇gjrbW,讎XVSA)KR4OJu#p)x4ъf8hޔ@Pi \n)B\Sqh(ҕNM79jR2sAnycI3IFiŠ T5 m.ğ>ל\\=~n >#~7kt}D։>4P.9RmzwN(=) r) -)3(4QF3HN4CE|un,/krH|Gq#[W+?g` ˨Hfc5{ |,"Zg( ?cԀ c/=x w*3J8њL5xzcg.)Ur=B$~i.='[*)ɏ]Jخob3ö+,ٿǵsMΉuFv,GTe!AԆO4F)AN!Awr6o@(uvkE8ʢ? yf+Ak[t<ĎVf`yD*J_a}GKFK?elQ.bZ܋k{KX#9Y"dF 4 T5}7Fke 8s2ƤHɬWS[k?i#[ ޝEiiHNAHS/Zx7>iEzמ|}r`lq= ];M, Sݏ=Z)sO_<~#|R$8%?/_A6CnƁ#T `튭^hׁM:Ldl*A+ÿfĐb۶1“^߁,:P󿍼oo>5 H)$Jw걎}pnOYMT񧉾x/ xwK|* Ȏy)Nx_G0=)RbъZZN"xQšFKbi1|[DKo*"Fc3>zW[6 dH u(r}pV6q^`LoF\nV#8ϱ_.![vq6;W}忄c5k$`O,'zwVy4tRⰼUڞ,-G-@-ϭ|5wmBԮ,1Hc>`;5үŸV?ں7RW_02<ذ+MN^fNJMf ~[JW;׳G>-#1@+|}& >& =2½#Nmt4GdլbO p4g=)ph-u.iJ;R\RJ:R@2('B8 ;qIz(4)sKW|\X7RLQV˳6՞>N{0'AGhw)'E_[a E0c+ѵ_'X͠?)_o^ \A""'QFxj:3`u3R"((# Z|qxjmRy˷ 4aܞw ^̼toݴh8°۾NO9Ҧğ~M ƶ:^v\?s=̍WG1嶱`$FNZ)C?Q޷H&uwV 4Æ۳^svmGwW?m{bƺ|3)*~rρ%kƙMZ45Yt Z qgm$ H\ƾ_<=74A5MHQcϸ nA1[^3S[i!XXF1jAx'ֺqGZM .䷰&+%$sts|+^/7V0H7ryhP1Zۑu_ST'˪#mf}2ߋIdnlrW?b˃}A^fr$&OY @=y䎓Q\?xe#PGלzgƺZׁ|F=վl6猧ވ { u4:b (Hidc֕c :Ҏxs  HyPA(4QGz;zӇJoCA4QtkMn]GTu}EyΫ-W f9_FXףfV "~>գE! APsK(#4ݧ4x Z0sdI(z mb Q@L9JpF)n8J$ B})}i bzV6}n%?3=MpVfS4v*qS^igv,P00\{g)#k2xoj[TӋIy[=;?.<9b'gWpDr>a뜞~HeB;/VGymZo-soqLJCSm(*)ݕRxPqRҎ$QL`sҟ@__(cF<"w r)9bSH붚 sVʄ\Ak4}Kډu);%8xOSz]6VDCªM Az mN9F͸S(֎sM9^f4iiE#sLRɠyޜ84`ӳ@U$=Hip=h'0p ߻?{woiWeM$m鴀EZ{X፤*O^6j$5n$r=LZL`Yޅi.S9P>hϷP< [@3I-RUV_Xn!<`S ?9Rqg4x((?h^>݄P5.ꤟP&p $6#TpJ]_zzb xu!`bI W`Nvʽ䑊h?yƯ^[aMSO]$Ŝ)$'stR^[-w cF# 8={ o{z/-\Gm;*,GʉAE{ោ4CXrL2Opn#W]bX.a6 `VCARI\ċ 5/ XlEU,Sq^Ch|G[>jE4>:ی>:·/Mlb"*N:qN\t浸[i³66(%bO(3ms>4e~% [̍j;'^ld< O>- sfŗی;cft}6LLZ ~X8px\OƋ3Z\w ;BH_Ҽ@7oB@>,Ü%*W3Gw^+6l"9U[%_{8 Ev5yϾ}kŭ}^ĞhL(A~&+>k!a}]lW~6>NM]^9rc @5b/HfspnN~zj+_^2>+hd(+%EcO; 9-Z(?tЇN%78nmy4zӀqIj>GJq)EFQ!&E͞zSt4f\)#ҀE*qM6i)sւFh❊+ľ(-Kxpݽ\_Zg;9QE#ֽ&8V8QPu5M(r:FktojeKlz(IxT &'fk{O;n?q>V>&9##H {i\}1=+ެ+(/lYIxe#  1Api٤4 13()1-Q)GJZZJ(b6Io.Ld 9 xfscN*-92cŻۮO%Y0˓:c⚦&v'[= ,A?C^Yаϙup @=IgVlc&GANSMejVewêP{mU el+tRW[97~B;MOjRwKAKGq@=+9x>Դk/{t\7ma;࿏h`Z\A}8q[p+x㥖ϢxN n/knnEX]\x?u1(D>$B^QdYZ4-eOF$Ų;Čז|Y~ׄm`;ǒh3{F?^j'פ K8$g瑏-k? _5f̊HWo<, Sؑ_@x'Ė.𝞵n?<$GY{+tu R^om'2$ǯӀ#A'[%R;t\@Hk3 5=ƥҞk#`;פ/y3p&+em].D78Ji$ e~iZڑmCo$1G6 ANڟkT-珙>G>kؼ;s-44C#d=5)2)i5KV״ %V,QL > xKV[ki͵#3g>6 +i k/tku ]_HG8gd_?FӮtGT}88ߓĚ5h/K/ 0 UG&Oi>"ɟ\@.-d1D odwI_ u; ;`3,3̌|@=Fj \bG'ܞ,ka֑t<< I;oc_C,Q,1"ht<{am_P sB2eo Y.;9dP{cGzdEa "&Kޓ)H:RgҌсE&Mud[ڻm) p + c?SpH^oWK$ =QOENbXc5|½A[#ER5*"wRwvk Pbű{g܁r>~'ڔ˥jRh41Xqzк-|4 䵑cR*z+|@P-%ծ Sa@sJ1QҌ3H zR1 JNWHҁ)GZ^ndU[ -N٭oືoCɴ7nŷhSlk%K$2 2yj~ߧId##qwzgىlĐQkTbxŸZl.X6F9RFnz` u;Lrp'9$¼WS'<8eݽ̄]8^a{~"Ҏ {;׵ކ}i9ZǽM4A߇%蝏d ƥ~xW,Fmo:,͙$rHޛq~ Q<ѽ*o3;'⺯_dJYɌLWϊ?q$W77d+|Geww?Y\Gkī"ܟC񕧂*^xiiL4mmܹ0##*ONO7^6eܟh]E%P*OzuC_c y#eGG鹶q.ǂtv[+$B8)?[?ܭ^ܶQ?'uPH5<~mSySZ[M#*26 AT@r GAԯ U-,‚Gj i.샴2Lt^&=N l B U_3x/L_W ٧Xg5>uE팫,h| S@,Ojz7|.HTlHTsg#k*jZMQsLܠƮbSA"k~Z2I-d wYe9SB}9 :oE}{t'>+xgZ}/w,{"921^ŧ>ۉ vm(\EHiIH1ARc4R 8%4cE$< ˬx 3G",G~`hwlQ{6R}prQWtm1e ʄL8ɯ<7Zgö:5L Xf>a"yM##LG&VVƼ^/F;;^(^$i}G{Cړe!?)ZDsvӻRq@" @z74(:W=h(h"\҃A5?u[[6X搡A8'ՙ"Jִ:yk>BԏY\׷"E#"pI5oγK(I<ͽcHa;}It( AɨTSA IK-Zlcna^7io6ekqiDQҞ :da窢l+lc^ :FR6zXrOִRSҀxiÁGZ1KM=hs4?|Рw;~ t]'ᦈۭ̽^G$E\akw|k[R)DnTt2!E$wkִ IV[,1P~g rOX`W77:o}5Nٮ UإԂ21؜?XԼ5ԏ'.Pgʆ %_G$i%?ƚ"}R/Jo{ gk6 9LҹIxk×1_\ރ"2`1p2yz7 S1A~;ɚHsP}I߁3"SA4 iJNH(&;Ҋ\I4H( N=)hҞGdG(fuSZ֭W~]1lt 2=\|NVdIsVݱ~W{@lY-R빉^O2Kk(D-3 ћn}p+g~-RGUXTv>ٺqu稯A<{ (4 ~?.O CľԴ 'T1}^ tW\#տס_S̻c"azЮ}FMɸ=I8|gK}E.~5Niqץ%>"W̍$k~r~u}kEk xKm/QCIې9g}EllQ !e&IC!8+*:  sw,6U=QOzMzEܵ!_Q8*N@kZ=~y'Դ )TcYpOW4_ xۛG,eEGn~5vXdSjY pi9Bwb8IF(iqK1E h 4 旚i)TY/⥒A EXs@&7]KF3ڵ-lav9~.JLsJH88 QC“URTq>$t:> ~?M xiX}ҏQGN&ƐZ]ƔRwRM4oRSHyȧMbMy"֖KR\'|dSdc插M}.zXǂazi=ԃK>> is`i)"𫏼5?>1x/kCdH./TܬY׮?{IF!nB p죜 1GjJNRyn`qK "` NisHGZiJ &>ZA֟ڐph'2)23FEH0M.1xǟ^kV"!ic1\B,0'i'#щ\V^b|E AnHCmC^8#=q3QKI?[\Cmp6tU䞙?g^Zs(٣ RAi>('>i9Nݧدd _FTq6O v4^MҼUx"&Y#r韮O^xA֑ ޝwjm,-U\>)G/.UDvlgnN܆|Ю4yw&rg=ZGzHx$ȢRcM<5<#d`?3R8܃?> 'y#$9xx4ZV.KߵZ7e`y(0 sЊ> RvQY#cTlc^hQ;.xI1Ҵ2LcM$)_𧃓J {~%WO]48sAW8(7<Gj78 &E*ȡ<^c|vr-]f]=p[AZA? %彜A{ϪBui1#v -J@H( '@O e L3 SLNIJ4fxr3ӽv>uF=)VPF# VDЋqrz꾣t1}vbAG;WI= уKGF=J:wz:Q֎ 4$DI'f?] ~ ٧*̡d3< ?>WCglV-?"9&fkrc5Ц5}"# &6_cJOEE B/ F\l gWpZhŜC{Lcd[sZ_ |Cx;m.]K4v8Pzs_OI[Ӆ3}6c\|β>.Gt=^[rcYWpb s@QWq0)ŀp>'36G;hI>z֟<yz[2Uz4Qژq_:|QxS㶏)ͤgTn*܃޽Sz}Lj,lt[RĨT+lFOs>aBuVZŁI$;V>XKefp/.?o B2*3־oVO$3gBfIm[>gntM{)$RAЃ$5 >-6[֊}fbYcXI2q+nO iKz]tʡU]/oh͌R 37I54QC$FE"tqx WGtC'%uY4,wIUA`#շ??'~z7>>u}ch<Sv#EO)K(Z@E/~)iN Nh4)h&sF)1Ae H Šp!'ҔsF1EKƌg4By~|p=룧 1ڗSAҌB;FqP|ƥWW/Jpw6ʑA $T O_C6xb66.u @"Ngs88->.fGP?ZDWF 2)ԹMu4 RAIHN .xexZOt5R .Ǣק=?i\\oK3uU h_ru9tvC?Rq^nbUp$}5x:RO4R\qE 4sMv I8FEFE3&\$3[C !GzU x=YR;no\h(4PhC(WW{Eu0!w|xƣ?.Iא.cx[)#9:roXa^D>RK}8 xVTt qyè@=+ѼY}VKmhO$D{W?`n;[+?v/ w)u D>Ͻkx߇qNْ5l=3Ўzb~v_k|Mql ߏcNwM7.n;zg 4gv 2S^skF:e/WK [0d5\p쯷ҺAMc(Fph5xgt#jx̷ 7zw 1x<5˝ow僞7ƒou]uO* f4AL:׾[[gkI8aU@zRc4}L֜p|?<-N][O1S>=^gLңߋ-n6?#"< qCf+=V9G7,G\c> lqޗ&44}g C)U4bA ;9iOAH r>+tz{Yz ~K39F3G24|kiqHWҔ}@)OɧcHi 8txB3|O&FpGpH3NQԒ8ZI]d$s.]2]6M;N|7@رl?JBKa,|˫`!}ɮ<GZdo 4h2 x T YAӟlH@;>&x~؀slvܲj0å qo11L{Gtل֗)u rEhQҐڔ+~%|rӵKžJ ]EyQH9<.㏊izw; W:`>?K죽d"n H+K,.RY.cG"ЎUz}jݙMiMZ?)*Ҋ~2]Mi]x>$q1VBEci!>ws+Nsm >YuzY78\k/N$.|o$;}kݵ ht&VSs? g_>N@/— ^qAKڔwE#"}_Oq)mgFrI<95Z"XMI $s[b?_ޭ.ʀqD:HYH 2s_;V{|f˥TLp|=N¿nkҗ^?o hip@T;ZgoO8 ta ׇ$&92; /֌avІGbƾɆd9mȡԎiƖCJ3EMu߁sARiG x4_j:XރS!/ RN~7[ѽzFhPh8i(U/NoY[zqȿ xsLheK +5ӥz@Ԧqe6m-U,Ga$WS>tdq' VlvkhT7Wv6]\ʱC;v7uMOhp1д -ɷ]ҷɘ|\9CN)(qxv4)Rc4Q8JH8iiE)1MP47v b ISQk每~:RG+\ly28Ϡׂ~ xbo Y^y$gǔ Zs%֑4Y0^#Hc>Qqwoxjmڠ yU-%OՏ{FqNa)F@47;9҄RM AE'z @1@R5Pk}_AX^\M>gbJc>꾇t%`܂<) x@c*$ )H8x6(h.d*Gl݁XAhfu!g ;סxo:GlӤެqF~Y#'/QߞV\zO*߭Vi;Dyo:`T ,I`I#?'IkM2pezYZw,Wi.2~wU<[ J_ٷQ]][Mn _׼tɣPA|O.=cPKKke4vT$*Ha*ncq6m XmmGkh=ƶ8侵꣒ z vxKTv,aghucʓr3@ZP1KEbxV[ԡWr5?M:} U$p N%\|5L mCDȏn2G$`z?|5^h\z ck!75yK .8#$u =NCV}9^AE~zX0Hf7?C`y;(((?hr+AI[Go}vfU'?w^Az kOu'IrH$>2UUSšDŽ-P{MqFENGCs oķZC"鮍nX#wIc{69>+%ǂ~3~0KgkIR/Gd$Avk+djztu3=I=GrkO4sIޔQKڐнh=i;y4@9nhR s+:muj+z @}ϋ&0S?B Њ\RGqAZi+H0))H8-54zSԁHpMUӭU,>7w5?Z!3E-4;!oj$?yϩ IKڏƊLOZ<њ;ќR~яZLr.XRt𓶧]A_zs&$dߦq\h|Gzӝ.D޶_ʾ[/X=԰@, ;cO!<)Ta`pMf1IGҗwPQ ih8fphFs@KBhqE)=(1"Q; |of[OZrfiĀ+^ox[L-nT `* H"|rc3.#Hm@c=k__uBC ۆ+g``={Wрs;"M- lPx {38o/B_"N%}AD[R?E5 vͺdBvL (<2==+ FiZ (Pi)x/f8# N1QzW,sĒ$n2 QN=2*1wҎ 5^P7dWxwxfu t*==ׅk5WQ=퓎GeQ:mJb#ԯ˘ '1Y7 fGv-0zTUnPJ*a<+&=#>h~ Լ7 *ϴe=A 㦾mcDDbI{ c5R?,>-V"+'f$ask><'X wmB6s1Yu/j:Dڒ7UCV>'<k葵 {&]UU#9q5u> FzD>ҹ^xonGI-^W_zWA@fUi1\*Tgى l+]7T%Ԃ$r8܌GOaäj6ږ4e [g"u㎸OQ=^HyQ0+LI %+G+P ][W+fu Hc>('n4^i)q_:~i:H>#º2C7k|?3Ǟߦ^m rï< V>α{ KK($z{kӧK}{St" (#l}]Źܿ{Y^!"M/X[g! :2#̎ׄtkyQ~EpVsjVK;KГd{WxyDO'3\#RIzמj?w10i7cxni-A#^IԞ SҒ.z1Q⑺G48QM RM#6▛NҘ ~84JwdSQSSOV8HEzҎRt.r1Ev6)L斛Iޝڅ46w$Tvd>O[Э5#&)@?+u?f[$:>^i{mgͬ,.2X748S54:sFsAKQYֵiY5Ȏ0~g> [=SǺnH}_V?a^gakYkit=X8▊LfzRfqGZpRw8iE-Ass W2,PB$1U$`||]-Ε9d lI 8L<9 n>xHG-7:Cq$.t'z̾fFdgM@i{{/m~|}W$6Gn aX \e,I }+< Bճ>3%JkI#{l⺰)})C1$O\a,c״ =zʸ]1̣CGO5/_4Lr9O?zEʲ ʲi5`եr)y[7;vxTD ҺbG_;7ul֖"TW^qˢ(+DkW_BCv/$ٳq{v$zX7p5+ 5y`8c^ϩ3%68Q՘~ [xNm-[!Y\ǭ}UdFGPVzMwGu׺^;FQ}B}ڟxw"T9XLYت3$j+j`H$94ִ'V&X༷֨z2=pTg^޾r{<:v+ok4BC{R␀A➼.)(wDsjp .kB;b>޿:vrZ].X08O#>u./"m{PlI>85.x{FҴD6ɵI=9$4E(2*1Ϟj^(4b)GJu4SRH&Md ,ɗT>d?{WjjhdNF9OQzE[ȲC ʺ"AETdF c>++'HAYsB($Qo]l-FȊ ~g?{ a9ԍexuOJcb@<HZ(h 44Z8EGt"ۻtyQHŚy4mV`6v%NElI.i7Q9HI47J5_5%nE쭏Ez6jIug&t*}jCFxI⛼1Nh xJw{S5x~|}ÏB-:.=D꺬y c &Ktc`N?7J1! zgҜP3ތZ)sMRC/j6H>B@s)c\|>gPq9 DՍz|㥎d%g[3?Ŷ~'澉ȠuڐS0iRHzQ4@gA֌sKJ(`Ji84OƗAA V2r>_ZT)y4(  =8ڧY>(Гľti[0ꭎ ¾{.jMc&1Bǂ7g8A9#OLk¹HO`Lכ&bU򄡹 n9Ez+g}wc^j]ZJ$:GcVh5GN(xbsJhabaĶ͉n~yA<=.f'=}uA$00)+8*i$/ᴶC=OI5s~~ Dj'B5yt]E'xBT~dQGS/S{;\| YI8+gB;?dW<%٤Z\7_q^ǝ]# u$^2՗_JK+WHL7nE? ߾3_LIyO_.Mu8>E8I<*9?5c㯎&k'd"iu zv͙5G+nF<X9g^ iڍ]$z{=SfB'z74]N[M}֌q^-ᵭƕ/4[2,\ygMOpI9xςtT[xLeR3Z|/g[ Kj(#rF:9\vP2^uSpjvK;0yt,Pr$r9W T[@gзq0³+oamt۩Ć3,Qo^]J8 IWtѦjpjwKlX2)w{? -xP[ -7|F'ezBPJ٩9W 3NJ5*MMž -!(ZQEc j4`+c z0+Y֬͜CkL6iHH;h'4H)ŒҒ+O`6m )e 'isy^I~sғQFiO8)r)IftG4s<_MN)u>=wf5GH-}~MRrzd x^sh/DV0E Ӻ#}kV"ѭ]6a5nFGbA#U9~925m \úL"HVBJ9tϵE0)'[&xR(h9>8x{b$&ʆa ?>-:; *(LT%8坺/L ~2=u v֑[1ExV=@5t1^t?gYK?:_6<nbq*loî諞$ih־j$?hMF=K| ,x1v_;=}ePĐB‹"BW)XoXn^%+l`^'_3Ķ%w~ҁFhECqm ջ2"Wѵj iNgy=+{@sbBVQa7qL9gs5.j8/혱} t>cx^7zW.$c+d~kCK4He.2ʼnb 2D=s3c\V?﹒]SnV }7qgτDŽ|65{.v̱,@8?W)[#hN&91xR'i.%Sygë\jIw'XpZu,WZ̫xU@?C^*T`0qӚQt!BxG8(&J\HM1x#UU()R^⮕ eM#T.݇\ 8ּ-4]2 yh5_WCzE=F00xNzjeX\ȶ cp9 W-|@lAg7٭kIWFa3^ /\8Q=q>_6Fy}.&6hCN=7tlx6泱Bk ~8,-,XmAQT S8LY4 ;nd{bz*>¼cR KM/Ï,\f8te6q#̅6#4X:|/=4{8x^w\~5oKtr6JNm><~5~5I^ /:b5h,]_\4xR1rR,ǂ _KC pC0HP` }4Rp7<w8!GjJh IQ9lR\u ҆4QF9btj("Z24҃H :V +μC{gBgH;4<=WN4vK*v8V=8)(4f|=E =o1%w`YI Uo< o ~@.^SürA8 5#6Y{*~_j8WPko |%O|WN<ѹhyA4ngiJm(/jJQ־wow៉!gKS'e6qJ_ xgRn{w Ÿ3Uj2M<i$u-Ggac8?|Ѯ)5:5]DUSCWQ7QPqXg*Q98 b3Q3Q+ҜxEZP2)13E _o֮YFGr99ǰk4oR[nz\x> O>=XE,2*G1q[Þ 4mQ%ryh7|Ѷ2xеh6zƚŭSprS +L'˜Rl\pO۞<+Ӷj/Öy_v_vړ5sFn>н:1?P?C^ oY\5;yz{6jpnk fU>TOLs1Oޡ& XX#;d}k<Jm;[Oo͎c";r\t#4sN4 M\ hv]ozyE))r7 E RiJzןYhcğյ6?ePDÀĂ= ہv+}cBV E,?pS@V$:$.R=BEr'Mz /y<[5.vyH +~xIM*fV$rW@3]nisHhE%QE.IE!4RBiVESsQޗWEJ)1vi)1Bɥ>ԝ 32sKcXc9 G,~Уx9[V@y#Ix+;QjZvwX5td2Dh^qExO Σld>_@OĶ>.害`HqFz72p>z42PkK)4-є%( ~?M mlW:t{btI85$l>C较N" ߰庈Py(0+-Av+4o^hm$RUO@M.⯉!>sčLܭ81=+ھx~[ R[Ȓu z4ϭ/4׊9)"+ P[cH~B;I=iWɤI2j hR-{5`( J~lS4Yh+S"3|}y[?޸O'm*g~5kU[i"qq4 RfA\H?֊%_1aTyErB#ށ%ѳ jr|.@{Ը-.hIڛҞ>iC0(◨ۭ8t)iiӗQNJFXu,lY2i:)A)E)M"׭ž]AbgtʌxU|=a]+O09v?ξ(Hi(cBz )FȊ+ PEy'gjR\WsGv=1U/A}_TU-^kkock1o (*T8iH:њJ)JC0$p4QEMiX:ӖAъJNC@ԙJk>Y,|bхf# Z_ <%axNV]O93oPs}OS[LJl5 !IHdas=>EuD|=<Puhڬ}8'W7Qq2[xwȍ5̂& \ il2"+JPk_*t  CZNʳۀl}W"'l UV.cJ&p9>׺}cEsm"ᣑr>ЎExHmKQg(,(#vۑZGP)hӸ)JSi;MN&RR7c$]ni /bTv2<`dzHC_xzX`U.X.*6v:pA Wخce̶ C$*Y͔0O ?pm kGISIY =+yoEW~Ȥi eB;}fu [ZGXAܪe?/aWGQz&GN\kƗ2"A1HZ~("JQmGL$#n- c'{߄|Qc [k6' (,D ~ qK<R搜R/4#K3Fi:I=Fi3Р{-w`>x>'E-5Fh=iWlR@A4уU;!Xi=AKҫ\aeqypa*WNuIe*O-»+{Ⱦgyvp҇8=}SZW1|J鷲Qrvʀ8aW3*;)J i:ӳKRh9 ;ӻQڒiNqP^}&Z ;Ue4e!=qԌ mA2ON_?d"tO hry1͈Yr =cFڣeu׆'⎇q[=X1 bM) x'G~#cú|Z\>]#ch/,wb)J cknw {ה|M&yǣ"|;bnu B.U7י47$-CՉ]L! -o?گG22í8 qJ>N) &;tLs2b@判?x zfT-l'jīc3E?smGŶ*4 A+N4hKm(LHOqHiƒ@lSI=ڛޝZa41RiZ.(K)ry@p[9[)O҂x7ZqQLqmn#n?X;vO xXՠ.xmȅC y7麶?uu'.F~$sx=_z>`Weяz5_/\C똳ҹ k0@$g R&TLYFEKirM7KKSCدMt~~]U.ޣ;H9\Q^mE{ E{k sC1*ÎOy/g$G87' H\@O}តs:,/rod]> =O)bT&90ϵ_etv \Sqɥ  ӺQE>]Ꮞz G{Hd|he{W'?Y]IĊ׏sA#Uddҽ_sXx'CxaY121x;wSEbh9 fOz^?0i0s@Mxg('J)?e$]z_KHm=њa6.?J~w &"rO!GY,UN06ls׮x%)siZ5pYaxPJ=|1}c-v[.i7cv8O Ez% k#5wwNHڻPd%_^>VZs ́Z;xd g4c4/4A9"SO8JLNocҜ2z"|Ϙ jtnkʹמ&i4xz~5߳ݤ4.NlO6[$cGxʼnԾ7rP $v<E$p:R)B1KiN:PiqҚA)FqȦ)Fh&KbQyOon_T:~Tn:nNJOOx1"Ji\ozïzoКv2y]=B/lHD#i0y7ZO|vז>;rhB0?8m3~Kjʍ+'"&>M8-b]JT{ q08^>amvwnzz`z6<ŀi扮־RV"@➡<9[ӱM(`)z)01J8BpsY(ơܦxL{{e|k|Q FhFE#HQsמ}NH)WN/mb6e6#xg=JwW>]mLdyA#pxaisW49$p3N ;jpg6i-6iBKu#&iҩz\j:[Yۮe~?'$ mcodtL{J?A8*LJh:-)蛏C!TAg^k47V[ʒ*D9WR2#"Z(i'jLq)vF(=3ޓhIʞ XSKZpI55ߒp+:k9%\}msO+Qv¥ 50 jAӞ|IýkN6w̉:rWyA}#rUsՃn$z=y)..%$UQIWZ>hxu[G$6O>8kqWi&]<`mWg=dl|cT_ľ9M%m'㡕##8r)h cO/>`ҹ:xR}*R#6l>$b{3G>k:9ӣbaYI 2r|@ 8'"վ*->.+.@x>nJIN*gjarOlW}4T5]Jm>˪[^31mwF/ ڳ%gbv0ƱƊV<Bm3SW QxÆVIu;^L ڋj~p;S?8<6;PI'ڌF)G$R`H敺PiAVEsK@)hJӺJNWiQ|⯅'𗉥/f-XB,O>q/2> [Li4_*>w{WoxUW|P7o=2I==9\5>3#&a3nrRr4ɧn(=)(^֓'֔ AAsڢc4S9FɜicKO>! =} $8Uה^ +Ek  S? f6}Ũ/F@1o+߾`6ru Ǿ3^x##>b1V"#ҘOSN(6K WF)E< Pi:ן|noݴ.wQ* .ELH%9<23 YkѡH #|GfK>t9okIڔRu^=[hZՒ_jh9&p]v0x_,յ9NB@ev32,M9SԍG/QHJ)f~LS6R43i ))88#+ڌvtٜ̊F=N2 y${s#|M}"ǫm{|Ɉ;_o4_ig!I)2z9Y!OS"ښM! )f8ޜ]AVF41A)""փIp4QM#4m`ӈAjPO47QHMӎ)8q4fV"Խ)7biw8⓽8KRnx# 튫@v-) i) -7||Py#,7- Ǣ>ל.j#&=FJ:RniF)AҞ9E!8(9Rn#7p=HSW֞VQR.x w:tn9d^ҚvqORtP4{0zsAn)2Oj0})/Zu"wFIAR*G'O#Fjrk> Gi'JM"M]"=Ft%L>q5FIOjMlOS^~Ϳ_lr_OXN8!eTb׊PR`c *Zr2sHK>֞r)vSv֔pHi".,o"Y#h2+k|@Q\_xEgta]Fvr2~eqO6YJQY~%H𾯩D {K9PuBG4+y`I4bkлrcw9ϱ5QZ{dsf68'ڼ⅔^xNE$sq5^RqFG(#ւ}*2Zw Sh=h@$юiݩK1M&g*3NI7v{mGCUMqK([|y@6> 6Ti~ gpzgn|U˘嘭Z%$-b2O8 ڟO+|6bzՃ4gC}:vՕ]A`=񕯧-."&SF!dSZ_ZNbFpU0@R9"p'= = 'ibҞ@##vB}j iBCQVz(*VM@儇3Y4:{+XOAOlw/gu04cڣ럭 ._h!٠gqH^i.`4 A.AGxuV2Ȥ",~d%Ior:P)q!0=iBG=h=hh'Fh-QIǭ0#󧃐(@wiQLSRF)(E7&m!G\ph\#B28-&y$)q`S 8/ZCIϡQԯLү/+h^g©'W?<)/j'87 |FRi'Tv?A>Oj|uڕ`hT1oNtG{JԴiL+)$b#=2;F⒖)hCp )'#J9њJ9uzLsN!@&iZ\L 硧M!Ӳ5XF 稧Q֓ҭ 5V|[e ]xq@!>aڼHWSŖbc}g$T׿ aXn$KF1H@䝙!kԾ|F>:%غŖ<*oB=}2z9Hؤ3F4OmHJ ө;Z?~w mz7HOn=y,W7_0]Y4ZFc$J>>nrH@&<⒊(S0KSd&203NCrF)z}#M26 HAњF8n)UUz izƝ>[%ŤXp^)~Wˢin`k>KEq0yb5r<Ѷ6=GOX :(bˆ5Ơ* +_Ѵx#ȸW?RO^94 i62$`ePۥiJ:t4K@5<}iTR\))&ҘBM 2hXSLNc;$*i|WxㄱOf;G(n& g*ýy׋D5 xńJ<9 2eYc+vHgFf M|f/?]#Bm-dHD7,U@Gj[t4uFhx?!(յ5[3xT ~?|v>p!ȳmV<9Rs|W<7V= $+Ђ8"J -JM$84KсTD =Wj<ӱk )HMA8x/4ЃM1]c?xjO .Ǿ _|M /UTms~U9$d?:. h;ixvRnM[Jҵkp G^A`}k?gۛ7ľ#FBb= APg R%62 89 CE"(<JwzBzH=Ww;ZiڜzqILd-cH,`ӔB84B!R94J4(gK)2p!g'vQpN)U7ji%ꮌ0 C^k+֞rVU X>σWki-g)%6 \q]ٌqҥTriNzSxJ999=(fPPHhiN(('#CҁғuX>$fuZaȟFڸtל:>KN~?MúG,!uXXjaqҚMx$tOX_Oq]jƣci"syo ¬ՠC& P9Kڛ ,8OsN$cAK!K{тh)i8\zS\?YAF./'m۶'޾>#|A ^ϯŤڷ#dH>^PfFSQ-anrEivZ14ўJ`yMFJVVS^AK(|0ϻ-8$(, ye/1|ca4_Xpͺ9T'½?<;Sa{2(z] =#}+fooln ^K;Ӌ&riӁ֚BHiîiIq@L 玔8IЊS RQFh8H)zS()sIIE/RO"969/# 1ۣ<Ψ 31u$וƑu%oqHa!!'=O= t/#ÚPjzY~ bSF*k/m9C,l]OB*Mw4g4ҔftoN3Mkdq/_ÚLͥ6ږD?`pzg'g ^[Y^%BlVž$} `]ڽ( r:ҀM!ZxL-J@)a<(^iHJ JE&(4+tZu&y(AQzBn;pH 5,ypsңNT- =R*'(hԁp)dSSpKSr<sP:@z)IK)It#>颗"sE5~=@8iMxsJuD 1R r1Q^[2c|%[]#,3ۛdfRx nH>oZN,.s$p3Rz 0O<_wF5oxFiVpyH$0%sXmcċgHm̡X`[߁sYCzw ^UsLR\ԀE})vΑiYkkVh;XgAQ>sE(4F(h)pkY Z[DPX&z? {_c&^Mko(X̳ @GjO}A4-JKg M$Wd0Td\랜Vw}vC O0޵&Ln\ҳ| sGr^>'-:0!x$cd A 8"AM:;Pe9ݺuP39[x8R4UT$}:RPxg4Glj9AU.iRt<b) R `}ޥ*;(3@94ԝ)ǚu!Riؠhcߴ'4 vSRZ$rK/dVz9gwiڽK,DHD 29<_fpֶz0]߷ z`:{=[÷r1K"[Fz0ńݴՏ{F)gzA3'|R:yMfXԻUI8$WP p4QZt .&W C%}g஻k5ӭ>ӧoqP%O9ϡBy(IQfcI| x,?>P>a1٥pi6xjZUy!g7gM,ddHdAd@:2 kX埉mΤHbdI/5'şx3A<2$mFo H<{ZKsړ74N(iÚ;Nƌ Qx8֎Ԅ(1M*sN)@4>KA qSBP .N:Tdr҂ZPy↠俴%ֿb<)=+?4_ʴom2X}O;Wy' /ovBطĸFXl9 T4}'[l*=FNUy>;qxz/tMգ2?r o?zp Ovk}H9fKrx@|<~8lԴۙC_|mHWp#2D'?8$M \98_:{b0)(dҌwN!Mݓk+;DskѬ.BG BԌ3)R&$˖ sGS\<}csͥ>k5ˡOyN?\_!_cƁ(w'?*l39K֛mѵJxfAg\؎W> ?7S]rv`=H#.1һ/zs7"=衇 g"h>ట` *rI WESzU4-3rҚ=(Қ <))H8bPx(iɥh#=)2sڔ9pџQGJ3F3MiA=M7Ӆ-1)˒NzQӚ/?GAxvi"Q \2ϫZ_> ĩuF#АH=hg9MNt8M4ώGr+ƿg[˽C> yr?#Ǩ1H#lR=kfV]BἛ8|d~xƟ^$q"_Ni2 smn7N)zDe3^Qzj^D_Xs̚@MGqo ݴ1$J$UGpExc~֛Tgl>pT$\};K|i|cNɈ\đŒjhZJno.5&tvQ_ڣ(Kfj;Q('dуGsJAF@&icjF}*R&01E#60 '~) ԤF)y7=9ߥ;?(:Ӷ3P̕!M*@x@1҃O&9q3nib1@8潥oKR#Ԟ>Ú~tSú=v-Yfh^;g=8f=@f!}k-wO.ms֓#pA,5 $PO 43J8\QJ:G4i,1NSO=)"(=hR 棒]Jh@88'4fZsE(>>L^4Zam8TQ)?1㠚GJӭt}*M˶as* ޮ \p4(ȥȦ8tLJ)Y5k:f`} uW=O~8lKz}]J9CsZ{ ݜq J;ͺxkQdխAKf*H=|j_~S6sBN3q~Sxkmfv]O\ >'BPqC"`FSB\ǩiV3bpz`Au/E@i*G*dOA@h3I*JP1>=f?_m @q3GR?UG?8}(j ~x/CKB4ҐI*䨧c1KҚy x4B)b)sHdRM).sMMt`EvMM8|٥Uu MSO'CFS^~烼Ce?u.dxOa"z,>xV#C,@6FEѬ<=iZd ;uڈ{{I$ ;n(@j&B*9Q2 .ik16׳ (|@#qi1čaQlL35濳Fl1s&9ݫ:Aޗt`hS)#QJ) ێi 4& 7Ӎ QE(JFV 柸Җ 8(?54|٦r()aLvQ怀zR(c!:TH|Վ #X)^a)Ѷ(ӲGjacҀyZZCӊh&W)[@)TґI8AN4q3r)AӿE/j2qIh)ꇜsNt(j@A"QHg`y.b)O4b#mNE69 z&hQZpPyUyQ Աڜ$ЃF|RcqE9HO&:;㦋>*"Q'!BϮW?!^ⶃrUԭ5[XPl՛G\`w-?RtV[iVW%'=r}+3t͵+vEtՏWU$d(Ϩ>Qtc+^>DNQ<yחkn5FdW6QgzXyᆯ P8 1YGS{6~9JW-+ {KđHGv5dNQNqL$=is)J)(ȣ4R@2SdRK){SGާvJ(c4FIF}qށZ(mpG;8һ*޴F##da2|){Eqܞ-a \ԸO45)TӁݚRE!jLњxhn#&.2)qMԔ8R4lSAS@){RdSw59iԂ#@6ѐ{S2S)9 'm-(!4 1)Mڸ>=U&;EaGpz5+/~'HgrIL$J9$Ez: <]W ݾchx"{=W$r?*_? VZxzW)>aq!`(8hJYtkm^ۉXז_0EN:~XAn͸> ~>@3M#S#sN3Mp8S@$Ӈ#4Q]u4H:RуHrhNsAQڐ)"ӺJNE PzRd4N'zS3NQE&M(ao@S?*P.swZCI@4⛀ix iqAGj@pih'q^+ƚ>|Ի^gY,jG9MG|ޝ%e$p#3T`ϠOx|-ZKkr * |ԑybzx p8(C?fT7`O4nzP\|xHbwE4gD2^wiޝ<987!a(`kX\׉/΢Tm`8{ ;g Kx"PjQG@+ELiڊ!KxdWQibG_F+ǧ l<.Ôua{J+%d+.03r=XNR斊nzR:W4piN4m&1E!v494Sq8NR(iN(=88\f<Z+A9 nzu0[B7b‼ӏlP9␊80Ґ)iiA3M&Ө<E7RbԔozp^ 4du)ÃF#k:o ##"H4҇>![{GK{ۨc;Z8@U= ~< 5O,]9\ *gܒ:} izv˖3߂ Z |Ik35\9XV=dsԂs'ԦS4AUtLƜȧ8,w# {S4=MU;?q@aFE!i"*:ߍmu{̶a42/}0;=݂n[]Xުʏ̉r3G߈?.$>t2\2FB 1$>O x>Fitil{p= Ԥn 9 NiԆ\+uQA8Iҁ1STz OS4;)/+m-K3Osָ 7qZMA]i_iW?I"lj5[f;d ~}Gu.ӯx@Mb{Oʧ2*Oڟ5KmK\A獍qB<B|>vL9S5=D"HfU*1tda=5%de wҁGJ)qI)1A6|QK/ vY'ɷ\_#G8ukJMO?F-4P&9*9XW=M-RIӍ[q)p׸4 ͺA&B?|@їOxpK}ą*@2zLA_L"ȇ(2sJG4h)iE!L-ڝQҗ4 N~njiQ2p7dᄈȠ:攍QUu]?L{mi/<Z^j1 ่xdbUQse"h{ a? gX-FqCs.+TMOq5J} Z%ly̥0~?3)3IF`Ss! -%&9r?i>eM gyQt|#L^OZxjG0PGӐA> v8=(:W3ͷDD-;RZG=Q'luik\6p"A+'MYU#g Ú-p-]3[ZJp= kڭh/ |tY.EFPǓ.29WWĹ)Oyș+JT zRN1}^Ʊ vM4ҍI9=( AvM$)r})r*K[ؼhgIP02+;` H"*6.0 mӮW|AcxQ5)ݵEGBOBwc+<0_y0?~!Ӵm=}J֚sH3N<Ӻ 2)2(&h9`漃yz.DO rS@g]BA.er< gÚ 7e͗U2ZO07Ǎ~=c{΋$|b֠4_ vAxyW (Q۟C_IEF !($Srirh7niPLFu^Zwc%*@ݨwSq  yˮx0i%kܰ&ƚí{g4p^-;23Ҿ4@$oQ [Y>Ycʞgb<ן[I"?GjYr# qGQ|ּin"^5(U;XJĿ 56f;_Sx {㎠ײ|/ׄe [v8.Cf)TM<~4VԴu]*ORmx%e juo UޟYIy]?Y$m k{Eq,t}R["N#3Ú|~? oRyXrsw ('dKLZFa4frzW?cHm E# 1e ǰ ^}0bR$hT0TuT&Ua?ּj~#sխn8R|ǧCGNgҐ)P<枹I 84Km 6zSF!zbUn3Ҝ=i HqHv~nCf2h(?xR1B›w/QIҍޓ$CKRޔӒ)vh# 74뷭B@ H3ɨ@;1?[ؤJom>n}W#_ !c|gr7 1TUxkDFx'I5L[VfAI-c&I{lZ'H>aք?q)zSZUqR:wHAP9l`yQQ9ȧ#6yUS^)_xcJmKo&%=>뙗MS^hvށ;$Ai1^sx^/IB@ >u %Ƒ\ڲG~x/tʩjDw@NvsIJi:w44IHI`ӸHi;KsڌGu蝣+9<^mR>^a<P5ܵrRqIcS˔`+üKFJ oTJz8㰯Ni7fih)搜pE$`=w]è_ [Sեevny[wnj5- ۡ9n\r@cߴSj+L͔F{Z`H*FA (ֹ|:όɫiܨrа=q\}k$Y)@Q^:~ag v(P(SO&N(#gM?4ڒ'4dRuڗ 9 W> _^j:I.,duqyȱ hy \lLc?Joוּkm$BbLp\8Px Z g)wqIނqM5qx3J<*v>ׄxS7;xg,FŢGm'r'Ս'~Galf3(Ơ<s 7oJd8!=Uqo_~hZV(PȻV0z^I+=iԇ4N=r1G8Brx4}Zݩkm_k6Pȉg"S<~9 K};0r7$;2{vɭo<𗇾XIQ^LŤ.d@03g88kS|I}'IG_YxS[$𦗬Tkuz+ؠh?Ir|THuߏ|tQt;4h9SV='NՀ`F>@vr`k˿fA7E$'A?Q^wJ:M(Sk[K{v增1"V?|t~C T `Ft :@F)2)s&h#LRHGMt9اd͊ N1L"c֐ȸZ>}foKfuhwn~W{GC֮5=MhbQ՛ӑltƯ:Ml)uFd'VPeӽr:t6cxdxc4eXa}9#fyYW;62O1ԉ}(ižޔg4Hz◍٥'&g)Fߥ*5y/ \30>o]@Z]_JqsN1׏8'2NzZ|}2SB;c]~Suo%P\ӿѨ٩E!

!G\IMa(\iꀶ?*W5,|R,g58CSƕ:.)f<(5/CJ0NjP07Rj-[p*HiNdUcUZ|NTсH ҧAZ^H5 !Pw4?F,ΜqORHp(Q\}jF$nx0hXoWȌ[<Axx[ -YGY Y#u⟄Rxw[kHIlt2UӠz^|>7𝶮#&D@ b+nm SqxQȠ БҚiE;7JM Ӻ AdSv5 Hϵ<)QIi@#Z^haRS \n擌{S0Rp;RI0 ^t.D98">㯏&Ǩ[9boֽǓjpi>( n$7dqk%(S **$ee=\ ՁAqAqAjSMM/5RFZi NRBsҌ'%ŭ:(Yn!gi\US-澳KcDd C)*([^4~2}s&m} |–:`/i$naųP}p6c"_ F@V{ð钀O=0=σƾ+~>W[u!ŵyWpqNIFAIZ:Ӏ4gQtPM4('U<4pQH7J^)(1R`i4N@M R4P0išO4 H.)i/~)HqMl/ZadW~d+h(ơkmvD*]6*p(DžnDdrBFI)so[TdX.H ac?{P(sJHC8 BZSSG'Ԍi& @̽@[bw ;^NrEC 0*CқUR#HT֛Miۈԃ#(<u`&*@J_JRo=c$m\Px( VAW"U\VcLjtNjqDo^*Kxy& gR;`Tz8 9OcR‘!FXPB9.)4|SddҶm (_<|c+ O$A;o1_C5S8nq|?<97S7yk1VNl$#iJXcҁ֐K /Q@{SP&ҩF) =9&Iyjc`PZw4f_ρl-=p<FOl8EZMqigJ8tD3w >ߤ241뵕CQW~;g) GҶy)ii>27z4DxA5eH?kWt+X?, y"v=g4 jZco n=Wj>o.41y[qf $3] (h"u^@Qk--h-Hx S{Or{xL 7{ Ԋ>:Q=z4RQA4|xᗍfay H꫼DE @&4c"cwNf 5S/CiqtRPq9ٓ{$m8Sf SCE4I֌qLJzf4c4`R S֔PxJ u4r)gp)(ҁ.i 4^ʬ}yC)҂ji)qF҅H /H< tH8ַ `؃Ծ^O#*MTOJQKx >[;<=Z~kXXZ۠(Ӣ@RK\QqIҘ8L 6 S)GS-bcӊڢ Mwrqj#+{NبKsPUw4܌qMhj=W!M*iAG!W-FǚnzPpri] UIPjl)5,OݨPHLUpѷ!mMS"h+n*iVu2GRyx*j`Du#Oɫ˅õL8{Uך'9 zT2:TȼfۚP b&dr1J@!SP<$U/ T6WR+sH=1hcip ԱȣiARZiQ0zSB"J;Rɧ :wG-E`YTr۠ ^k|bD6Ml<2[8郎}MUQ㿍 F ](iywSQА+;?ZFm<ґ,7 Qڅf-ҝARnk4fP>ZR q&)HJ;sQ b M=( Ґˆ,*Ri {A.1.;N+oanh@j$H .H@rgǖ,?<r7˥vbpdd2s&s&)A.iR<_hڥmg&i`'#kõ}m;z S$_m~~"zfgB]g yǁ_GxL4%X?cU@'#5 4iF(AKS@W F)qF)TҒ=i:JGJCQUg?zcw֬Qޜi=ix5 Oz͹ǥhAG9 -&i3(#)"9ºxg)GAFi1H)ؤ"i–IHh▓x4R)O#gobF)qfv{4Zq#x/J4BY]SGu O $R(dt`UAE?N(N3qO ANqF8 3)L`s('&Miޠ)w_CNS_> \cAq!q*'o90j'5Yj  5A12q7N$5] D"sQg&nlќ1#q'5^E!M0x^GQF1qZüt1aH!L7J@qp:Rw8AǭO㱩LޤP1ڜ$ cL=i[9SSҥEUOj EXT8V"xh\r AL)l#h;mJTcVn*!W1$g'*<ԠcBR:N#RD%9K&8N ߊF4 xF:PcWC(wN "c'R@42(ȣ-64Mf`J1K:CH9qr)SsJTR " sN) HRsA(9k~5|<V"ВI5kpF `S$N}@ %F;< G:66^åa~.̞,6,ƭ#pu?x"ufmCV UnvY^pqI'^x< ByOcN"(JCHV*F翨w2~Ξ68=Yn0q+n}ʹ{)S0)&69QW'JJox$Tny M#HriݱI1NP=(BGZ8c'A=KFE9}M)1 ȦZq@'4)z'zwjݣ(68 ӎi94y?w{7 Z)zSIb#|;S$#`jŖeE[:Ga)w1H$@R'9f-Q@SFhȤ4@Nܚp3Is@;8YFE"˓֤S/J(4 -6y VvF0?: 7iZZ(&i4A(h&p8L1ANH=vFM"HeԃuK(zCRS hSr;()('=(P]ۭ[‹ke(S +GZb3q)7p'BH(E.H4cЧw4(UbtK-Km"FA"־| H5[x^?.%v_CY4[,oCS^CO <;"|6SN:rЊ@'\/j Tks֜žihHS*8RGR*[&/7ʦ*qƐ:sHiI*hOZF\?: u!Oy|*U&E*&;S})8Zz-V*=jϾ*k/W=EX8VR>Uӊ@VcN*eZOE$Rf6jX*i j`Yqϭ=00i<^Rg!Zr## m7;pM'ӲSI;28INsӯ8]_pm<Șxt?gŖcn7? #?Vßzωnj7œ (l0uݸSwKiå88늊Vt&i0i8OJLsJiA⓭+Py 3O oCN#5zu-c2HzpHXW5DFf(摱9Ǡ"[v4-}d đǩžsNpϥkZ]v[dp9Q+r)ǥ7pR@iEN#4'$Ӏⓥ(n)M8)94KE7ӈX;nXCiÑM(47ZBؤNI挌4/~hr)Ziи#L{TcH Rxy fr斌 3AfN<݇ft5OyCw]벽ST՛\`R|מ忴:FgbnJϜw?iwgjҗp= qM*KgjhcC(j'LnDĎi>ǭWMZp>:U@q‸4W#FP)f5\sQiڣqB隆PBn4`7Hy k i6sQF{[=8Q:T1R/4ҍR6㊔ !PEL" *uS"=jt| u`&EL)E$*®yBsRޜN3֧EڼSOZPqҜ'4c=i S8-҅/ 9dNl挊Pl'JvC(!3.09,vM4(ܣp9Rޛ߭.()ix#PJx4qM4j9lgylj']3˼~ -Қy`s@+nΎ71XI4a.͓FxҚ;R7qK{Rsޖ$HxF&r VaWrIIrI?h{˛LJ|q%Nj΁EDim!-ٛaj23'׶]Eyk մ5$D w<ѷ$/xRMAUe8rq}׍>+.zx(a"d#6dvg# {d8לNcHٔ$`^$ /1刔89LWmI<0GNJĿ]ȱ-2 sw<|q_Dt?)FrsR1F)N KFisUXoF%ܴ㗍rcn9SI9*!>ٟ?SIWPŰ4ZJmdRU^V8Ԝ='5Y=<-"WQFoܒ(>FV)nR#U$sQ6گ)JnAUP"sjSE~5 gDz@(j%VO06HlSZPi1UXbS*fc&\2" \ r H{R(wl\t$ao1xW#΁5P'X /mƛ1;?*yg[LRMYIS*_ Vm-e2?Bz}G^kt.jU#5:EVc\< TȠ:MH(9HR+qN-:S0I*F)4>)#SzR\oH/ZmLT3ǵYOAf4m' w=841OE& cRmzVqM)'4p'945*- <␜v4KE(V/<;o wNc< 8!w_>xgƞ%3?CI>җEW,FO\zh3`&vC$"|oĩ:_܆X#bCPO@8.:WރHݨ<ґqH84.yCS[$P)O3H nk?hmRX|1o)U~vf?L?^ѡt|='zZPFz.@En91A@JicJ 1)rnWLYYD 8A]oyQ%z*_:Zj3階.,zn@Rp2'[:_ - 鰉,y1ddq^("Je)[.,Ǒy<{iSsҤ($z)ޜEtyX-"\ MKzDS֊:gڗ42m7i񶥨q$0T3|WiJy@O&+̲@+<'-ƚiѮLDHIdҔs֗4M& HI?4s@CKW'GT3M|_M>N%N<${0MVG Nv$@dPecf?,j̾fUrC3&v\M ,E;s)@ᦐ_sOj|ag%rӳy#Er;?6_|Vys$4vqTV^öھw(!cD#{{;'Ƥۚ d&֙!sMrEWf9Jڛ&i:kRAUݰ GSni\i FG˚fzTlңe ! KM!ۊ7S҇@SKgv@'sRhCOjU~GJr+G8/zd 9s ƧPڥX;v>Nq@.jxi9`R=*G(wqNH@UpҐ9;S9Oi <B979J9R)$HIU[>T6'YD)gXKÚ]4YȖDVBEmihҐ(H4s/9N(4> ³ ے}'͑6w ΍Hح&G1ۣ'%ǨG7?*;+a*:[ ă BYB+FG4ɦSzSN4f?ZFR/ZQ>(x|uV5fl`aDZ^3PnN%ZD4Rƙ#u p:]c⦻[wׅ4-))Fi p.8'Q^?duꗤKvT.ڀ I1O?vANQAݢH8Ji-8SP &HzJa'4$N@NVhY`H9KsЩ=n=3T{ Bن RaoO¾|t+"DwG/_zE}(c)sHiMT49/NiA攜W+"Yo&7Hd I+-m72j 6Ս 3שf)}^,hkij=`e*UG܍wJAYI',JM+CD#@p1$OñzņDM#bq#د$d'^/a'[8{҅␱,95 #Ȩ֚Òj6e*l*p*&!xI?5WmIuv;TnW'BiwqQ<-TR+iARH<QaԱBO&$Q*x9TF(RjAӕMHhۺcBT N,#FukR+M7lh'rP}{`קn׉1lUwS֗PiݴZf$+sI'?_Z~!jZP,1Y-Pdw95%RGa8YNk &GHh%Ǧ֊&LYD2 ڦvnjD2Tb ۺqVyS:SUH5*x?l̚`|Xܓ¯#^R>7Γ{vSo4˩tGjgMfo.'Vz.O*IxWF|ԡzq~n>~tօni[# ⑇͑҂X\ @0٥$NiSރ׊>6p)VF!\Ӑ֜NE!^)8NFhF @(#"O;N3C)0i3aN)(N4qL# .h%)APVS;iH2+Hytmf}>&9KqYiiq_ͫC1$2{P)HƊFvE!&iIZv8P9bQ\Y]C<ܕZZ[Co" MKڀi %QJ-ihb3JOSӉȡzR8zk;֟ޑhy8PIzRH)0}ip=R1Ht}(ҏRH"9֔gM/AaE҆ӊPN1ޏcK)hZւ@RII'? hrZͬJH\$;~Gw iX@ׯ71\̻&ʰDM-(P%LPS4f_'lfk!y_ll j\ᶇ 1`w^{}iy{s c/,T{_: +䙴 \mQr3n{Ҝf 9֐Ӱ@4M 0`4GS!t˽>ou ()Sͺv?>*DNtnBW=v~l4]F[|?g݃1+ᧆuqr !U ? rNk˯fQFJ./movEL^۠$l0!A!׌w<飝Owwr1r4i<Kco3hou6I ,0Ơ ;=zO`8' 7)G5BM;l?J9woZi`G"KfOzfp99u2jGjaG~*6lB\~i5FE344`TLqLhPƙ4ӟEa ~8.9=iZ- sPhKgHζo[4놖DVu*o\m&kcQre9h+.4pWE HHg^'u?88 r9+37Zc’ !UsM>ɤX gHǽL 0hO㚒 U $ byT TKԊ_ @ig͌q޾>7~ k16v}YUύtX}~@TѠczLjnu poQBI210k>u v('M')wdcޗ.~ZAɧsҗ%(CqҀr9w4ckdAn(^ij99r~#O'h捙9tFiE+t_OӗHzy84)dR})q@m)dr=isJ(>S!Hx Rr8tIj-NxϭNSޓ4זvsnz)Xϟt "tg  o&ᇃEvڟ;&cvin.!t4Ҳn$)WZ(ⓃE dTr{^0_.j7F{Tr*b8TfTFMTN3QQHݤF9cc ]4҇"=E;aLhM1ޘT i t-Q֤E4RzS0iilS;x FIחxA3ѫ7V` d:XH4)" sMI -G xCN4*.Gq#0!UQkq}ce$κ |9Ӽ9pJחeaSw$܅@"ml S;Rj?5J JaoƞdR)l#C 3 Gq]-rv:㝣#mt7uu>핔+c:9sAG߅W}[?е薚'kutOGtxScnP3 અߎ[ϹEo:ƕM>U. h< X_ּwOK@z2 |gzbIHMQi '4)^iF=hL"Y0MvNgH=)0iizjAȥ)y8(H q@;&O4R ւ}(})FFiPM?ӕqb;04/'3e_ƫ :R8*қ'J'ZFNE!8dZl5@c"@Q3H`#<$yBEWu{W#p50=g1L=h8Z`x"gMϽ)mE,8(NsLbI(d-\7|u}zB^.6te=?m[ɤ?򩴏k> DOa >OҮ8̞*却01Qqs pNIzw_a{QJ2E?iQQ*H84W"4gq+Lӈ=iSF >Ԅg&JF8PmtG2;]##rI7p"ԓǭzJA^i@J1J24ӚCȦ{ pz~F):RdQHhF=iۇJ>Zi89IO^Z (JLPqIV-PSUԒcCOC}%P>փq=Ha 4P) j}ś9zgޯvNR1/# jD$Ȋ%ʽs"OJPp%cߚ ly Q@?XK4H&@84c'5!ݞ#yӅ#bHx4E!;x9\S 9Lg6J|`%=.x:`tr:N*eTLsVzS`"fAS/N 3ޟ& )O##g8F*ESM3iiiH7 ;Va{{0.W t CϡA8itZ7r[m;uGX+|7]t{E[I Vc׿ԥ=EGOʔ'cR8І)F)i&A5 rYqԣZO5L2|Ye;6?qڧ9'}/ h:uZh1[.׎OO^i-gC0tttqֽzYZG3VeVKMK֊Nr)4<Қ8\! H2ьS9 NbLQA\zUHA&at_Q|EF>~/ڼ*?Vw<{;;B±_c,e@Җ_|Z}s NJ,OclXzdfhZ xe1n/rc.p1'1 [%gHn*cp_~Zb5Y_Lg 42%:\#[_6Ooc2R ^)sHs8.N9$&)yHWҐ)&|JE\<̻SGԌx?kڌ?L F 4} ='޳__mRPmBՃ\&O{ï~?ӥo$ZjEGCOx'*=kŷx3Z]oc4}! uΙfV2#^4\@đ|?H[߳gҼW⍔:MRXvE ~i\n>?^c`#ݣsɨd`UFj,j"Meɨ@O@1PL /&":Uoltgs+1Hm'Pq PGjh3uDJ +7k|SIȤ 7Ӏn-#.aCR~t)g}mps)UkCot43ڰQ(9{#'ާ^kompWoSѵ GtwПzף?į&-`0=}p*$i:ŞTc2OAws ?J[qjW7`_ƬR#-5Hw4wt9Rw4SMVZT(.%~$Ib~η6WE{7.@e % ׎&_iR%̜M꬧>[GR~zEf]ijFX`Ʈ\I=EddiGq@ d⓱^ibpq8R|4ޗd"vFr()H!KN})3JZ.F)2:QJ3jM@APztg< ęIoSWgMᧇbڑRw[+̏ !㗉lH[T[5_b̻qcW0$V0;SAɧsMRn┌+'~#Ҽ+IjBPqv=@O@MxHO%æЩ$= 䒪>^=+{_^ft$!c!$SEzszW q'v3RW5GƇ+Y;AVp:e־09hPON$Ґ0axQ:R}h&hRhFE Biir)N=()qF( ьG^+ |2@Hqd^[ODT\E;LNM `{$:#Cb7k>?E##ھM*;SRғZh3A}E>|{TSoi{$Ѭ¬r$Gϧ۟C_IZη0$Ѻre E] cȱ,x0=kټ'Mx?FI7QG.N~pw?\rBi@N6h ғNiKJ9M4M'J))EJhR'\n9␱Jpny5:f? U+LlV@px$rIMmk:Uw -n1ȧu~4_`|/;8n?*=]-Ŵ:gH8AW%Q\iw3//^$2~cՙ)O=ix{w@\ʽaJQKփ5fPM '6qQjeyʠ-"i$Erp@/i⾕{Lie]!g$dOL5Ejm3MUKIƜAm1{WHye\ DH=Uk n޵'\`f|7jb*EFUߊXFT 80⫲^Oˍc0hQ˲Jv%?Z=Vl ^t?ʪx@KޘfhLa<+ˬxrr 줌8[j3HRd&e*ST.zg`¸š$nwWUKV!F1#mx6^=Ϙzg{f:sMwW|OG֬ ioOb+Adl< ^u[`iL~][kHD*pm~<>&]qD?ʺLT FH捧p⸟\ \V8ox+L"n$`9fp 't'TWԫ+ "{+Zts Ԁ1`qsHU(Q*:Z*1"ǸJ9c(qRNQր7m N*OJq8rpo]TitS_-ґT9g4nݣ9<q8_x4Mk➫ ^.fiā:]g7/|R&.&lwnHy$YvъO9Qy8k7cn%n%d#s紿GIT4$f G)^ãnŨwq]J2FxPyx){Wχ7cR^Efs>#&?lixl/4Y:|KJZtu-N ٲ(b[#5ꆓ8H2/HAԅw`?wPKHIRc4}ɣ9A{UΣRt4@2k92P2LdLzN=X6)Agv{;xs8@Hlu|x#,/4-ϔx-Kc_Cxc=ֻ/\}Xq-Jh bA 9"wG7/guJ7~xcCeoY.<뉀HQN}VZCikEo({bH}1AR 敲i Pq3CH ?.Fz n5mP[I)__0мOUtF7*mlOBJ|?5T ;r69F|@Wj+0Ji ?H׾;cOe|Kg=^G*$VW"<#'h\{?w^cAV(*SQ/Q?vjt5;'UiQ8|OjBR$T%91Bבx& ^\v:)]חWIb**#jQi>}*ARIoxKY-&R ҹ )\/%s8?8a L$m,cpBsZP#*89I j$LUic~U8\bbMq>WdѨt8==pwh{f a&VmGv]NT3H=~+Ӽ w4{ (vWϹcB4ϋvi``~JTR$ҦgÓx³Yۀnba< (<~ /Vz6'X>JG?[?urn Rn"܁Hx=+3~ Eۮx WwO]I9P`C]~glfxko툵omiR -q@Z?m}<Ɛj- u;NAzdi4p3J^ZMRsKP(xԄix)k?V.Y_!d+$d~OLo4kӴ :Vd]ldVri g(ǿ4` @8Rw^ åx;g{YLR36:g(u|MxNI!CO5/N߇lTrG#,[ gn.C0IzWвgsv8IqIwc~0('miGJNisF@J SizsFARQE&y4Ly2TgOP|)F4)F3 |K׽ѐ]F!HM_<9y펊>RkR$k})KtiE\>aGEGHF1dE~d$h:~&ZuaC2?#\WnS:~.ܼsA^l߳.n/59YI]}3^߁>Ѡ8VRǑ8dznJ#HE \LfRsA#ƛdJ%#e8P'B5*[EcsM,jɨ]MFTqX"է, ȄR_A|[f?RS$&үi? $g/E.7,_#8zM.) *&3lth5&k aЊKiSw{V7d)xçU-ϋxK6YLG6?U> |cԾ(֬tJP}Kᮇ}wQ [B,vS^R~2ES|T!Xׁ;)ږ\:6(T9o 0>"s#8W;O+D t6OT RS%NNyvi Ib TFHQfc޾w|E⯋)|5;~c#?N =ȍnѮpď*ZO r /oVxAN(szPR9JTc/*yrGJnH W$ti&S"FڊHr2tLՌ818J4qHαN;qh/ &89F8"sM!zJNPiA3oZ\R5?ei߂w>»6? ;E+m˺cMtRP{M;㟉l 5,i⾊R57 ('ZPxд8 Ӈ<)pi3Id^/zR) ))484 pxwKF&ڭūI rcQ]ŮQ!]Z M6ʉHW$q^)1F)AM/җ -4R޴ݼ/O=Ne Ta5&{RIJGc.)vǭ1KIA4f))sKҚxF)pi+9h ^I,'K2p2~]Y_ɥ!TfRȇأGnI_w7~M}8f,ß@~S^o|k7^fYWʤ+#ܧG>T1ȥla3nOIjc*4>iGem#8;Q@j砦>(Q2jZ֢*3H@Q}*6#P42G -FSqJ&iBSҔ Ԡ0zHzjRϥMdu[Q*c ^|zc %I9Vi11"A2EREI qO2yCuNipiۀҜx})TOPGy+Ӛ$u|w!@Qq節@><ݜ;xSVeڍ$㝁o^bFI3ׄZ+ Z 22@@i6 ignuۚ6zw4InE<g^i?~|H8񧄮td x'-\@A#=j|[l|1*$DU@U H9c&ӥƟv qtG ,}?Kw i,z\qLs=*}iؤt;ȡNxh"Pqm詥BzmtϵCd Q1cRhQǭ!ǭ#F#H#l*λYݥ֫aÜ,Rܢ`NMh$"F r -F1֔M4`P@=i*4SIJ) (#-!.)i`RGfIHY?U5Sln VX.B@&^iq w)0{S~lJN)sL9@RsҼ~].a3ZݾaB}߯?LWnn<ϺCG/Mt;K4BQ?+5V&`6 QB"MœqjN ZvH$L50XnZa S:NMD ilF[댐ٺ xh%%SӏIg ϋa%Yżr,E# fFzTi%[;@ ,du4g5&) SB1O&14QOPpi1p3HqNZRF)4RZQF))424+/Vމme|Pq QH*_ snaRagS$~uRgĭj<&qF{Cq^di`gS9JI&}=(4h`tsVt~G)a̐וPUr0߳RYcP%/݂1 氘x?R[nqDϕ:oے2+]>Rӭ̶f#Vi ނ=(48h!l$$F3Gb43:FsK떞|O#Uz= |{)]ST& TH]F0 Ad[5ty c`v>܎o&u?ϩ[0K0^7XuϱGpQ5`}SOZq?.)?>ԜzR@H$"k;%PBq|uS0=|gq㯂 eY7(L s` оBw<>-fCZA c߅Mƹ/NnGo0pNй=z֚:61\HIܖL9UR~ `w9皉sLdR*,m82APMduI2hیTl>8}+4D]_hBٕ֯ݎuYj0>`?yJ:M[d6s?_ۊ/=SڥXR,`@T"5*jpBX*a3Ryxw$җZyY@:? t((X?aeؒϐPa5iP v<1|FᏏtop} $ Uhu첸OlW1:H(H +g%ק2}Lbl48::Ӕ4ށA4 Jp4J(4QNE%-QJJAȥvE.i %&+~&[4l[0P9gDZ9DE\q 9W˴QO[L56?,./-LGgf3##=+w/7}+?hy!Iֶ,z|?R+h% |; (;q]Q@QE!~4W܎r{]Bx7Q}jș䤄lcWNEё+87{(>k׬,VNBJP1Kc>).zjTNjP"!R`TJ~2yL*TN^9UR4#/@)ALSx\P94g~ܮ)ӆS)Mj4Ҁ%4?l@(ۑHN2ic7"40#4 9A\IeDI}HR@+?g[M:;|y †v@…8v>?h:[KEGQ `Dtc9#H:a(n Cc]E `P)OJ JM4M*(/Ji9ҍ"6O483qJ~IM/Zm#\ J5ov:|76he)ډ$ecӱ}wLVmvϥ|c\8м7>mIn!;uU l㯦kxXXԒ9nk"Z=Hws3*|?~{JKHlbVb'hۜ55iIqMQIsf UZd`j&ܚSIKF(v)ƛNaBN04jUf4W'$d˜ 8w񷄭Sʔ_U={]=MC@N ;7Jy-4{4|=O06dsMnvXԯ^HA?J0rip1sKHhќPzSi3J h9(Y^ ]"MOWBbz(}xwqvh~q)ge(Džh]'T[M{O:V\lykT{=q^J#ޗ4?bYW/R7#q$1#ˈnc)'k~%aa=aк֝Ei~ Z"*y#Њþ5[]K0Ie@wl,Jܳcw8x Kh+x#XG0T!8 BGJC F$FaR/')1)"ҕF'R(9 6 Ɨ4K1Ռ); oGw_^3{=|~=!$6fDMP:6G1=}?jǟx}`vũWhA+ qܩTy =ݏ'&hF}hϭ!֜37,#$xޛixh~}I4nPG֘F7?x#kZ✪ a>`]ژvHOzF@#Ve 61BTڢaF4ݣ p*&6M)a\PS>OP5KFx[A}rR*VJ6O]/@OX}c=T.E(LTJc*"cUZ}AufPddo#qcW ,,F+Mtg@qN񼫥[}X Fts9(zu{w88yvla#Uҵ=C{Gpcd'iܶRE=7 }3x=rO[+ߴم>ּ/ >,x[,m'{nWzuZfiU~)œXߥ HH3ҝ;q QC`uqHPqRhґ((#p)PR?Z1Hi|+|vj6%C9ugך; L`q8kD'T/%ɱpPAǹ#ޗ4(ݪ\I?2C{0`r{SS4 z4нT$n)j9a򚅐b)M)M)L1SqFi {Rljz?t}RHRA&jDSN<E8 o˚TSqpi:IQ@m)Y+B59 )ALHz6aϥ)HSqG'vRF0>&t}f/4.0lܗF==?(Ş$^O]~Pp#@4QFZt}ܙlz(Um/X6juhNABş8fa N>>-ii>#b5̭&PeǾ^}M}3$$a+ Ş |k`Ŧ>LO]G+˛mZ4~"[^񵺗;^>"k]ypwG`p3;-֜M4ӭ)Z@[(* ; qL[ .@SMibq.(8J1l84w (4b( (G"Ҕr9iOS@敏4JZ U{;MFK;hnmx@[*Ġԛ[$DWQ[CZd6e;?-%2BKwbK׭&y.Q֔qLbXNQs@u 4xjfr_4HntYϒ!Ix'q4~3.m \mp v[i169드][>:iZWtX<e#@А1~ 𥧃<1kZ2JF {]p3IqLevM(f3'ץ!J `<ԄdSv`KnjAQ[.)i{Ri3-њuOUK=j%v 0"LP)hhFi {zRbo=k篍v v{Q41% ןJDfUSaFqʺ+~2xD1}YOm>|CG ~oJ wmBfÕV In7b緕v\zx">x KteEO6Һ;K,MrDPFswx.hxM^&3 8\U}5KC◍$O g^Kᤐm'S|kwX|sf?ys׽iֺoXγ ))Db% \QIۥ h'&4u#ͧ=h )=J@0sOIBi3AyiO֔jHMc}k}j(ڎ MC oW,E:MZqjdJҸ_(եUV*bǹ ,\Hcz-z^A8Ö"nӸ)pLr2@L &|c'Fͱ}ƜS$sLpj=lrҙŞDSSZ0_ҙґtKOXJzlTҝH9PT=) < 1< #ޤPWsӥ.Jz~ rhsSyJ푚r´ mAyF 'C)M0S0t3J*6(:jvQL;6֞Gw6;Xn)H_0a.fHf&3 m>o(r/6ݻ] +Ăsc|sԴm?s\l*YFw.F}H>k77H4 mBVHHC$o\pԬF1G;xIS;4IxGXSDn7;RIIRLr: r<+[3v|MV8&93IJwp9$ȪrU51MAS iZSޑ?Zj)NKӭ8s҂@4x)"j J() vGq<6" Hd*OWzokij[&gs'`3O &=>(j̾_˪Y c;&wFps_gҁHH_Z;4@`^JMR4ď~y\Am܊p4sAJ^) KRJ:SRJi3)杕=J8i>(I*+"N8M>& CA9*~h2{ԍԠ)ҁֆ>б.戡q`v'h}{{mxHǭr>4|Uy B"xvw>D6wɏŘlǶ+tFM3;iCTx &$pDFA<&b&G4l 1bU49L)ZfEt`2)5ab_Ɯ 49<Ҳ @JJ 9h@JCd҂1Lb)@i9wQHNў)E-r^!kq6n:k/'MA#W=FUee1F1ȯxXZ LRii/@>^mRFsٮ#l#3Ikoeo?LU{ޗi3kȨpO42)I#h);HA&/j@z;Ѹ$) x47/ZANP1JHҠQȣ9cRu4.(4ȥ 3KFq@jk):S L=SV]>KR;X8Q=ϷZqmHWi֙ on7#>ǚE>i 4]94߂*_zNKJ7P)hh3ZLCJP8z"Jm(搚p=3H:f#xO_yxNR~rb!Fֻ |g𦿦چ|GM䫞 8>I<7yxv_]^`tSE 7'1'0z𯀕uF5*UmدCJ~'Pr *jr8Z(iI) 4њgl<cPo1`ҹ= oſ\xv),tG(ڿ|]q4WZ=kKDd-`>P$ЖuS={7xU7p9j݃ggJaaMϧ|ߥ#='ŒQ hcZWIHH2ǧH Ú)1aRy7,)6qKj3ipM1gfQ_,AFJҞyȥ N84Y4{S\Sm{2T?8(<)1֔ZhL٫*'N>P1ҞdR440>P6ɩqFR C`iy'9'7b84Ht^GF}%ztX^dNO9 >¹_RCx3 ;@X^o  WM1ŝ;+ysV H@PY: ;@M;&x ҂sҌ4jE8uQF)1F(NirsHУZFb{ҧ4Rezd~t,1O,i$N]eXWk|]Iq ws;n)g( ee`i_<+vR^] s^5ܜ#+ګj g*Ŏ !!RJQҐAARb })vcx?ܠxzn3z3 ~ }WeX(mm Ɓ:s4KN4:%6DaWӼw#CǶrW {JSh9R&x!8/4}yR!ɦshP3HzqQx)N4Bi:w-zfi-DfܚE0@hk"Aʩ4wc)4NП042MS1mAiSJv(U柁ڔg!H'6;,YaJpiaOPCf-ڀ##U3H2R3AR"F;ӀHx}HӀNӀR44Ó=90)J)r&@曒OZ)5sOIEs@┎* 9H4/JGzcA &֛[wRQJ)ݩ;RwvM-g曷Ӆ.jX62^7pZ[G(Ozgs[IsWckz^`/t/-_8>>ǚb6IW8JpzRR7JANJʁAk;qm"^;(Sq[2(+M}.sI9)i\caG5*TRF>Z@9(4OSKgAnKãHcEӎ5$Oj:˜nCGLGֻj'|GjvAy,%>:=f-塅#'ԅF)6sڔ8j&sJi ([RE4`)ǂ֜N=):QG'!9M88p5Ijǭ]SJ_"8¥OΔ)qNIVzJ?Zn3— 8n"Tۓ")r0i@*[{wGJxz)ʹ 9"<874ti:MdܸJpis9 P[F\I\čY:M"J:gryH<3yH7 IBKP|ix'NaVڪ&cp֐.69sZ@)qnrxO)҃I(7 }F #}~"rN[7=)NQ9ӳCMbO@i2HO.֌{׎K=wk o ܭs㣣sX^|{^Ħv83IϽt?6~)u%o6;fa'gA#j43M'Ҕg9Qo|mKq\!!ŊBŀ8T4:vp_q 4J)Ғ4`U \\#8C w<Ӝdpi94dp;Sx=۞())ҜH3Lbz~H*0=E1t7X?-$rF(Q8})1ASwy}(sP@4QM&(~='MdPq 5gpXwW*ihzR"q C/h}ԁ+Y剷+v؊(lF0i\air ;oP9dA!ȥ=iF4)';p)h9@$vIOq8“9Tq }Z?^cjyֳ7mӮyおB}?m~(yT=ֆhF)2is;83<i曂M)^(^F 7R3()sNҌHA(ߚFj= hY>%ч<1iHQd+;I¼_coj^T2ZChBL ۀ ^ACρWAk>#&Wo`+ȼ!4l7Tϔ ھ4٧mE r?SPhjөR4`PySrqN+L;8^M+d)F}h֝ږIp&jiqF)H3Ok;8x^)a's-<8dBXm+W}Zg{}uQF8$?¯LKosgcʠq5MSX],)Hd\OjQZSU!8t-J\T`gz8;!&i3FM; iz i&pG5HIb0*3Юi9&)3Ac@AқI94нO4]ǞI4b@JFLJ)I@g6TSҢ$ M})˞iU@$h3Ӹ})1CT4BOygimk3Q}+̵VVZvxBjd|){*[$k !c*I T|j k9f hªOum*D3L<Eyd+U_hWvmwQ~ |@@iKO2Xǯk@PwvM4pz uy(t+ckWkY>F;Atϭ>@|GĆWE'*vAusྡo5ty\ 3K`Fo,I{Mʜ}h)G8IHOh8Z)3G&(8 <`u:'UFsH8) 7-8RNu3)I^=Eir^x*P6^0dƺ^#W4&p6muEP;d{o_\XxnT. Ku2I#=IRk~ω>%/o"ĕ<?@oj4bR)r(=(vK"ڐ QȤ"֖iJ)F{Tm#/';`E!wAK֛OMwM))ц9&6IQLsKҌњ(# ]kifp"(qk[;n@H[pjr@u?LۃFQ RFAmaQsxb*sO4ڃNj9&x9MnSL\h ѐܞ)m+UO Ky & il޴ iFCfǨRgp9Ni")~^)9Ic⇆1t{$9r$mΗ@ԍkgOyݫ3yWy9kߚ"־l;xCfꤐ\g 켏z׏v,Txec";=ȧn+Ok+cm`[DNWOӿ Z(~jJ;w?Oylg|s^ 㟈t{/pgsڤw9ֺ~0Ѵ CJM}GYw 8ъP(+.)mV攞ir b#xA O&qH>Mn+-hLyț㴈ػ؟jϛؼ/jt˔goOjON4!k Xand8 pMz4Z)å![Qi˸d o :٪.|GhV KYsq|Go6({VY(J++utdbΪ1q֥.4Pk_t5< Xg~2+ߥt֩9L+nYkk FJca~M']㽕b“yzW敇>ɠphaohAPG9@9,JuRNS)4 7sHMR=i 8sJ 6GlgsS Zn))XfY[63B[\!XpFվk6;2A?U~ |@5~#eV=ç~Q{|&,nO؆Cnv8t׾?StL'&K3_,>kZ5L_Gkzw?mi~pѰBj:Rg4҂qI\nFb[ Sn{LR:Qړ'<\A$I^Y]R4(I5Ɵ\Y7 mw_k?ox:FB7Ia>)QO;!>4h?^NIEoi[3)%qm^B4t&F:R4擧JLӁn dRb@yni?FRq_7xÞ"GYOvEqaFɎ@0BykH,/dYx<1g|3?8Ş(b+"|@+`$yɯK"`Tҫ:R#8 1ȡmi\~.iI4c8JcBCQLcJZyPT=ȡ{ aa~aQŒR3pM=`xm9.O5O$N7n)$M9G\SmQS891RpW҃ӊby2)1Y~!&m)-b- gnʠrOOA^={I[Gtaf{Vkgx=>94X$I3oV?®O!dP܊L`R+BMoJTZByvr:Rt@1p5'}6]kĚf v@lvbDjÜ=n]ZM|qx<=h*?b巿̻YXŲr167BAU%1jsK4h Ji82'|W'<mn3,L~<:0*)د#>}tsߧ_:ߊ^: @I6Q*^::_j2M&҂ݱ_+]oRö77z|&ͺy2˒=;J4zy 3Bojd4v d@o GO&=7f%lV9N)sI)ӱq1@89HxKqH2)s)sHiAIӵ 1K3EPˑHQޜ)(2Hx \QEw[t ݺgf* )dh4 $| XQTIq4M4 ]Nx|[<_a57nBtGFP v]g4` [Rq6"SLSSIRNZB)FA`ӳERR7jc ԵXxLc/%&u+ktrؒ:5}h-4m/l*ģ=@큎4Q^3CvƎ7)EQځAФqOlPq)M7nrItZ-w־ii$f*2Y{u 0Dű+ 1M!E+x J"  &9Fͣ9d88 ;GMe!OJUqD c15!  Gni~)b,i( -DDNF)qNH%sNsVp%Ҝ@ k~:I, H,]D~5QOmzo KG3&ifF $aH73 _6xe4Sc9" B9줃b+4N:b֍7+篋 5\xOumrLV rzz{WX$Ou Xs^/ȵ_GvVv%~bLg5 q$ƊUQtSr< e '_5 g\K'̡ߘu][94~iw3R+>,kYǡh5Nsm kiu/RK?G- / =vHNW隍L[\F$EGG&HM8&qe=1*ʙC})e)TCsҐ1@Z"ㅧ壱+92V+[9| 2?%YV/0@'LN86MNG@|#9`Bi@FLEoгtUw'^LhO\ Ԝri F)qFc \g!{U J'{Uܿ4pQ٥PGNrJH7)Rq8۞hE&(Sx!&"4y+oU%YO_*d^kqGK$6GPyk7xI D`cT zd~WqF]iF*]GbW惜6sM)A4r8)3(40(4ZF>5S/Vu :䘼ӒrLRq\OpEzΗ_G%.O[8.G:/<.jKrbITH_n+(-!4F!-|;aE)!l'iN)њN/.!_"`tϜg=s|3^o;RŪ;~dgx g;k;;{I~(c]0ׯxG Ѕ²,&4qJhE`>;)N=i(7y 8E!`яZ\Rc&) >RcQAiik0F<a3171~,o ZhڔVEܷMwcێ1ZφN1j:T[Godg>jAe+i }y{ qJ8SH&N{R}hɤMI4JaLV$'.)b&)rqI|q>1Wλݑh0$}*O_K}jV'sgeׁ3ƒ8ǭzG|D-/N&#TL_J PO曓c9M1HzR"җ%~ZjiȦhQF(sFrh)3Ȧ !$RuK##tsM=h<5ȦBƓ,yMX5lp8} @L yR :}SK: gqkg&F0{F<'4Q@cu!lbk;?Tְqclʰ GnR}mK_Rq^G/-neN )p̜'>NqNf1J8 Tf(52(bGOf+xjAӵ9`=ys5޽ Zg!?M}k3NVoiaHPZF,njS,k{d7+nIn@\;?gJ{ lad;@prW8k޽4(})W m+miI*)ӰH$uL1z@z^q a9]y2ίY=ZoC\[G)YAz֗h*64849q֐t㯽G95e:+cS坻*?ğu)kqghf+,nPs`G8 g⟁ncRup&>%>k~|PǖZ l7GFkx "~v>^ɥ1qޢ,Z.:Ґ@ {S;;7*8SƟ?[*jn#]]vzr+ke֭Ž siq2Dվpjr0(Zk+;RZ01O'BքA)Z8҂SYriBR)˃O`qJ3p)u Iޔ41Y}n%V-oU~b'Vfl=lVU;?0J۳ڗh#&v\=i=PiI? +hOس ïX`co>=k HOks"xu2}k//Oh~}BSmdK3/îq9xjE}Ƨu."=L*>B~bz3KMeO9<|: Z .`Sn}q[ v޻sCd"~lnADZrM 3L1 q35Q$Q$q*@*J bHA)ʪNN9?ғ{W~WҬӔ ӸXU7]_[{67Ȇ[4:YVYKK2Z}E|fYm>-iIwp!n}3W`f#r)N4⑩i9J*JmUګ 旂iIbHi3Exi-#|Wu( sĶUT:t.B}?5bxNw4C/U(>i2Ÿ#x75ccܞTq?w&Ӭ%krG^)m{&%2rH>qҊQC)W8#)3A4 <HIZ_ Eko2yb"/7&}:EFO7ZGV/kxhϣ)Oֶh(=()Ɨ ڏ,uGxZUC"r#FsښNJ\(ݻ)&!v'>E.x(JNh4 wTqJ; ;4iW) -;LP^YjsYqm2)T2 אk}s$Nu9btOaRjxgFS}^DG2R$ #* x>"߭4>JzXcȧ Ro qqA\58 PxJh#/˜җisJ*) XeRG"WS[1qauy|xjׇWFKƸeAw[|${WƀF@ BxC8\Q$@#=꫎qC@hg8PqFF 0q4cYIeCwm 2SĿ==csг]z iV0ۃ\S}5AKL&8n(ڕF/Z)F1A'xN N<ˍ%WuhX zOywCrhڽ:Sx,s5㷇t[7ڌI! DIpֲH4hUFagB_C`f V['Z%cH?~rF;j.htnvφu'9nxc]G_~=VB_Cs^͎0*&㔭}ucG<9VC:C"TH@,< -fPu[ {w] c؀ ?gi:B\\e!*q9*U7Zv1M4HM ;P4gkzh8ܶvNWj_;1zG5oxYH9 z`mׇvI!Qf#q8u y_6667FM/S1~ѻor+=i4dӰ)qҐ<Z\?H=M8=o^xHxF8p(Ni@81'8zRi*A)9C:fxLp 4sL4sO*3K5<8RINKGjN:ұ sO&3Kғb;RvJ)h %qF0sKJ("|˓HH3(/j9w9N$Z7dRh ڔQޝ)m8/IZ8SMRZm*CizE^ycf&4()3@E4ZNHSF7 s\7kMGX]/ކiYOSH;vѢf>p`Mu#NL EK?<sJ94I1F9 G}Ȁ/#] ǹ⹋o k~pkf}mmﭣ)nIbpv㧈p.7|y>+nEգ6b&Fj>< xLI~5ڨ;G+oT?"+y *zA HFъH8 PPO Oe41 Jb03MgU'icWK[HZمU r9#i9&sJM4 3}izP)84~ZjZAJ7q@n ޑQOijS^WBNxW//Čy$m!\l[gc1 .bbȧ<^ 2 ;x.i$NEy"҃J0i HI&AtZ7 A; Z@x&zf4bJL)G4RHG4: 9JQ/J(=* Clk yjXc-N'#4f>ԴgڌL'lo&S0*pUHx Q:~ݧ9HyG hSHh(A'j1Jz LRM#qMj:4Nigy&a<꿭!9#N@0K xV :C  jQ8x'அoxιKU" _:OEI5]m0 㷸;bMҊ 2D۟R6LwɯT 1O s!<%#V^xV'uF)k;XK"(?V W|7|@?n'I؃7E裀Ns随4oa(]qY~ מ2< :ײ,9W $QrOej^,˪&֞pĈO91|Y–wYo6Y'rT I٤\~4`u@By42;2(1{P)ri 8M.0i8L\ASy')c=x:ܭ6Y\N1 0ZD𦅠m+IrKGn-(Rbn0sN) g49!E58+ߌ^ݮD^jk3s8i>'0qƃ?ߟ3ҵKNEuqZMqY>r䏍W9'8>oķ>)}o=k9ZY> {=k9aP)i1K:Tj;fsV\(sM=qKPk?O|i|(n%[H|dU?p#}^eaxsOO+;X('IO&/^Ini%I@g@Fc{O|2/#Zɜ\=@ qKǥ0jZhmƥ2ilI]Ϡk5x:!Q c?yGj/Z|<-gD_dO+ۼ'7Z ZĤ7㪰knhi?vi旊p=iA]jzqNE@֚)@4QFxZF)@:Ӎ4BӘBJNTЧ'b SҒ \v80&G'5qRݴ&S(A4N!9 )1Eri4f(JR0)ǵ$ls?Zi8^ IXˏ_ފaYh}_q.?Vws<>N- :7'V]4KIY黷</?9fWxG>ݾ`2W 49ڶ)[ Q6$]<{Qj)6e 0T+As:߀o rl&I';CٱZu|n$M%+W܌  i42 [ v'|gwAGVP;[L)21]~m9/JBE*ӐiBMz]ة~/)N iJjL/0=˒pjΡic0Y4.oJC)5198.T1>4d6zhwSO8QF&1*QҔ1\=0)1N7"PT8j,4;NT*L/jӁ$d9N940GJk1F.9Sڐ(<Ғy=P[M#G pH`@H88u }6O.'WvIw~;x8A0Gϕ ~B<+~k"ĝ?[>Ŷv%G7¿kOe'dIՌV1:vÕ<v=h+sޣٛ 0*lAAJ'HO&tH6)H․RJ!h 3K4J^Յ ~3Kcc`)ug৏ O xR՛ w-*֎ PNmocyqp}{1GopCGjŸCN&XOښ=4{H94H9gў3H fP(5hvKjZJ>h>So..~"sOh2<7ľ]Z23pbFMz\XQ7 ԣޔEy ]˭:omq׶SŚ_8]*F11(qXv<)i:RR(8(ܚ);Ҟ(_!4 \WO8|HhL7AIA-!ӗR+n.Ǿ(>‹ i^ilTi#?0!=1'žӵ[kehкg]I4wA;@#4`SA\$7Q@zN9bqUv8<4p8֚˚@<ҜG3֔68`u4889H"9Tlo`Pdg9'4 .wR䖥)_)Nێhv!irk~2|G.5{ Cc z`W| յ|Kk{qf3<#X|9v|-kFվզI Y$D!Yc$@`H|';orZ#_37 AZ?Z-!)F3ޘDZ*!x~U?wztOp+ee+:pbcDb}rzU9~.B} ȶB4vs' 'Iih^)% [o)ϩV_w] mNBC?;c9^KpҌ1OG@[0uMߞ}mϵ} R:zOz\R7Jb) NMq y7#/~^`@@D&8]ST MèkWF#8fњMԂ):baN H^M#>ӊUb4R v) &8 C[84҂(M!8@֌ i8cO 4ڃhv40x48C-̛s [|49 |!k[+^[>H+|d'i)q4zn {(dϺPGzdHFƊ*@?6i$҆NM 97J97n f3Ɛm))miJ Sic'4iZR2iԘ~#y1\Xw 7G^w?k}mGNIwP$Tl1VDaWZs0i 'J5E1:\A .|^!~PxݎI9G~?jz֫$5\74sI4QjVsZ4K4k*7Cz Ti-hdh千V 'G=OVuo#[ ap39\v[}+Kፋ"ugl2z_GZy3nO] zRb( R>}yGa+H]^$Rc-m!𽏇\A }QK>W>=OL4ˍ;PKK)$n2?MΉ!+*Fhߝ}Fi2E)M% cN J9=8\Ӈ4֖( SWy)SH_7p;zR̼;@n*U8JhP}i|잔=I֕@Cw4sH5ߍF?i=HgǦFL`s=5M 5ǶWfy00O +ė*󯌩 Kr A.)*k PcPi =)WMH杌t1pQHN; a$8 3HrFܱ43jxQH$Ss}pj jij[yr?ORњ\R⒚z4g4b3Hx92:V*FA׈x&흎- [8S#36 ͤ6$|x_› j?JԠy%3'>|x^|[Q'8qt?E=7K$FI#;QZ\x7KS ʸmѱ8#ڧg}2*J Xױ|kvS֭.$T䟛ut"CK.KXPQ>j$t1KE&j7Fi b٧f5|1uҥf[#^0`=8X{{bLrN"!N8==g_ޗ-ewld;Gx4GW^Es`<8w+1~)*3Aޱɶ3*8WM\Iq9P`K3נ-w?S< FԖ@8 q#z?PxDy-;R G\' Hx)E8SOZZ( f\dR8;W!HCmy-mt=AWZ'/ЮkL YpWaW&&G*͖A>T_s펵p[kopā#D `; Sb@$漗.4X[L6s˷U%?]Em|*Niע6omymp0:";1 ,n#lzdm9q b8҅3(L&y2IS"4m8MR x/,8#-u&NzR=:RmSHUqZv\RQ?w2mP,d֦cn:Sdw!=^sLaNT`)vznԇ8Wbm?-sYc߷ϋ$ 0$9>X|n?K5NOjx=:^-)>ZI!댒"🆬'Mɋn]1xҶHiÎڜ64P[ҕJ8SM rMr?aڼNiuԾähuUE=N~k?>[6m!̎2P2IW+C_hy-badS]G0Gc߂qNR3JzzElPz}h^U K}AcLG0H*1e!y.Pns0 XA3J% Gl2Ҳp@=hkwiڴho?R8ޭgBӠ͖|#m.2.~)?6t#>]u^Z[6h(\X Xlb6{4{6. Ecԅ[?QK &[،^z> 𕞏F /nXn p֌Ax?|3๾w=KOxKN^8[( mp?x}z/E^5uI*_Nz ^MLgP [‘$1,qD#D `=0(-o=Zޅ6ȒnJ_ٮiZPo&$x.8 Cx iiT־roh;D5 HXZQcQU\ok1%D3G%<e<Vo+n2mܰdž8~}9s:Iǃ4lamoʻ]+Lm2&>f@X븚ֵ_| Ds5.Q#Yi>P8_C3 ئ3fX"Y0eO|vw%Zϧd /c%wdxS|EhO z1Q UO8i{Sp(G/<AM/E(/ZB2i@FM?mֵlYϢ台O^^3 LnWxG=ѵo !e< V(!Pp9 RUY[v=I,RkP)mğgQ*m~r3.+OoM`hW#t`3%q}πJ/n@yl~V{g;3~*x&7y i&@۟6}߉Ik Le"BƾUXQPp{ \QKiv.8N˚P8 S'CHnƃ`” Ln.iwv&RdcMvzQ<Hh\ LKI1HW q"Nii3J)OJB)i”R tVB# ygQ|TbaX[Z9NBmlXi:uegok "@T嶩,MO֟\5<1}[XoK #a^5_X.|YXܰ)9yI⽛K]6 ;NH8I䚸[ڸ:O\ƫ&r+8dn,}~d޼{B['E5w#t:*Q3 i5߅._ú\Gn7N!sգ%s}qO9~[c-ɻzoC/}Glcf#4T _,*"qS)<ӱ($)9$( i@*q3J\`T2CNiLw&6RI v*!)x\@]2͠jSh>CmrrLg.E5Mbd8&4LNֺ-3㏌?vވlM: cʜIaVÕlUa؏˜L*ޕ8.]i6hKkR1& a(e4sMVpjQּG wֲDsH>׈Kn xF&%cX<'tqS+_ğ Ӽ)]Eys|3<|s?ۿ i:ֳGߍKQg?7LpH5 OZPxx'1>fFfB))f4IYHy,$mpAq+r "H342`tc Ӏ=*)32;]5$~2Ok%>`q{\ۥG9k\E!!b8$k@1t;Kpw%ǖ>ְHF)GLf[riXP(')wbF{҅.)14ҐqJ(M^ KJ^N NQQFi)GRi 8psF()q3E&)Ҋ(PM.8ikʾ|PҼ3P`c3do/5/eaFX-\u@ :$ts\?x*{gk{ӑAr u^cE׋-t]nF}fLR|Ĥ}r;c-R41N4i<ʲ z}&!fP{FGTSD.4 Ro(3ft'y"(&y%(QNSy-N#gJQޝi9pi$'m*/ PA4JW4¸)C)9474ކ۠?i3)av\m8mmu_ʆEq;Tړ"Q2(DpsWA$ ݶ8d?{r1o捤bé Nr9E0) *x f *06*Leia)`u4t=x) -Q ޾{縟y I''=imx{OtG k82H~$:boj%;ıHH:§:9] 1ta# RT:; Xr2A3VsB6qJ"4;H9|L~cDR&;8_1۾tHg#ȴχ>j5sZ{{;<+p2DU_N&=S~ƚ."[7cdg/>US\Rd}Awt RT@b7}͚Y: ?I΅9}+Fx-`2kS@kˬI/V{7 g-#}2c@-Q+yWlJ5<-k|Sø$ >>[|1:Tq>Fi$ر; f1I5RKh 3;RqGemjt  g^uotס['_4 { >b=k1AQESҚ(M<ԔQE \q#%RGZB;P:Ӆ!418|8qm$I-@jFW#+#C]/Fu述@[d 7rxldr {wx3EtV{7N;޼#Ѿ!kA 13܍_Cҁ)sA4fњJ)1BSNaHRhuqF(4AE& 8 0{ҕO'SH4i٤4dxisGj~'x#mXf-ofw7(k>9x7<*<ǷZ6v3zd ȋ IN}JQQT'$qA}9"h8H>^(4h9SP3úc:VCԞ:khqGn# ## ?cr,2A 3j(I)OZCӇJ421I{G 7֕A4ҀzэҸI:[?(Z: 3$Pkk{X!DB ` nrqJ anBA5 >ԄKmќuNLN,Ai(@'sF8M䍣?Jn;rR~Oit4ܹ7VpLQ}MKAkwmn_?C!.^QW@)AG*jqQx,ON@J39@NQ߭5>o.to8crd'|:GvKxFk0"}_9#O&+k>gz%sr2>^Nxs_ || (fu*6`'v}jB9QM-F8APy❒})psNc5>.5_=tZ`,e#'kf a#%#В[+ִML~er1Տ98HsF=A9FʤޜFOb5 |⛗>E,M"0 IH-8KKiP{Q(擽;˜·G=)F0  /ashR\$旎ԜQޗ{RP i4q_#l⦩$v!3ZR? F}sZUޖZG# A A cC4)j']:t'"3`Պm./S2gڹsAӈ7.){RQNRLS[MɥPA#M_/S䶈yJ B}0϶k~|7:-yb\6pr<1Gr#eai.rW <H 9 ^_|B}0hw9 *}3CGSNI⼻GDPizB.rɐnXb;=N =->]<R rH|łXwOo|AOa64bSG+~C9tmOOfeEFA'>(" fRC|AiŹlm]c]$팁^ɤ|<`v6ge@zft)Lga]:H&Aq D +p<Ϭ|; )ܐne eъ1钹k4; 掦 JV晊\bњBsH8*ZNƜj7DOp,1NRBҖ4 us4 <JFE*y]8u8|E&M4 pQ֑ֆ\p*r4p)63Lrii qP4?sO_uH3o #>A'߼Nnt9vK.: ] =xuo:H5|1ΟQʺ$Esǡx# Ť&&:ӱK)KZ1M#R7^)3O4ct4;i&tRbQh>e-­[GuYw2 5{k|)KdU񎫺BqA}+[Þӵ\#޼Jk$#*Tpl,`#v sNhq㯊 x|M`nl| d\ {/햾'K@ ckUmJ&g߂{^+yE0\ ^zt-MuڨPykGPqհᘁN; y4w=)TqHzsN֑=hu R42)ŃҠ{| O'›ǭ/SNw`qiOJSHFh[9`c'\s_2kךhz}[hld"<\p=MwϞC.}|"ul3yoo5ԗzF՚>0\$^>s_N* "SipzIϭi98s֛JFGb#n9❃M;)1h/O!уw.+;^<;-e>Я v$@Iø~JHN~ZvJ$.:0=@}+~3ީs:&;ǥ&0(8Ss\//<:%yc(B52LwBx<_h ]=?4{_[*IXB8=kuόz7O$,yHs'y8O hx[~n㴋a|c{K6;e?lfHiEzO4w4$X=zS _4RK"+٭=Y?k#VnH$nhف]eӜc4QIޗ4fNzGRuRJ@49Rc=i4M$ӿӚkdin3L$riIR8H4ғ(ي =|n7jsqNX36٧Ƞ F8w*)I1V?Ecoɝ¨$϶~4]Ovشtr| T>-TֺRAƊԴ2u<^KxNS1jw9AO@G\M 4JU_6x?QwXɵ[tCUw w= }>)F0;׊~>&wtw"yc`w7G>e<) Z{k8,%F<ӶPLVHG4҅JESHNFi:ҁ1U)$J)#ڣ)quG<[@O"EjY*I'=>8xs R26==kϏ1hmV9eu1V=FEt)`QO*G+MNvnЊ_ tiV6=.EdInCRQE3q .E ґ7ÚDڦr$z$A^)x G%̤b;/ ~:^xbE!0G׷ZttVHY qZoɧFi1IK8֍c Ibm.)"#Ѓ7|3n`92{OZoۤ/kn$ؐ'kyo_"KG.Ccf{t3Zu{\ ys]GQI?o4 ^ަIix(c Nɤ488wsO=))q@EҾN?ׄ  sp+{Rf$ʟWY_Zq\sm(K VpjA:cr>AF1I3J=hS>ԭ}(ȿh_>?V-ĸHF}]譢i P"'b#xyw[DIOc\OsqfX/;7Ÿk(OxWϺI}p8`8> ]8▛TQ~(;hi(eF Me[xwT⼍I(RFi:zbqJX K| \)zQɤ.1ERRF&y\F)WxO/z^l%,l;3}HY:o ;۔Q qIkſ k5Kut [6S#?>?~8N< & ctX^8LqyᏰjA:ʩ+}|.Ogwsar33K`RPy8#4bii61F+,qtݜW- ={;zu| $Zw܆<ʞyOZ| &ֳ gB_gq~aHcmlW=X,}I9'ZfA掔H\bcȩ0iy#gu控4Қg491ip⓭P`QF(M*ҚACy{mai%6ь8DQO6is6u0\ukʹ%+PGTJp#Pi:R據3KR`zFFiA&3N):{y@")78¾0/ʀ9A^ *|N]ɦJfcOo4vp3Iuw.{y>F߽ifTx=G=x׵^<6!m1?R9/ZnJ=4dQB@zF\Q;E! !i) F2zNzQn)qR⒘QResҰ|mEH1+!!S>ۘW~Ƨyx]KQI[Uf<;ep2xL_8t{f/]S"c"U 1! 8 cnpisVRZF|1|+{!̠(rE9S29ߎQ~g4y& nJb~Uqzh[F>%ݤ"-ױEu-u$VB /d%bQy$[4qM旵.8fę ߮)?m?#R9=iiɤ`iTq#>Z0H);QR 4J8ܚ2iEQ_9x? ~ʖsZKoL*и]G;szsNqL4ҏ)@ɠZ\'ST+m+OԮm/4HUA_6x㿉t+WʫeUFɎI8~Ͷ vrx7p@:fLFap2cF^.8&4qF(8< : P)M%bL%ۑSIG4Q^'4NQޗG4ҐJ(&?1ile0̶ʿy,GڤgkCC>(/S͊+QOLtɇ㞇= ii7 !1 f!1g|^ᯅZg~ CI֖Ok=뷎y @n75 v<)*l\t$pø <+ؿgnŷVα\G }p=+MƜyMJ(iIb#L9ɧӆh0i0֗`sN^Rg4QKEDSM)sEJ:Q{ d$Q: ,ԓ_;k|-; C/88^s+uw2['!8'3 \.55ӵp-䍀;t`y8#=/ k84]B4KPy"6V;D!YHz= }7֌PqIץ;ZQҀiu)GM!硤Ғґ9iFj ьRzL❀9$(|Ѷ7=AT2Ƞ(oʻ c|;,xK8h%XjGK V<3)I#I @ Ӿ"I=#??(Unǯזi? 7|R҃AHFHy4j`w*?*G0)E;tr05r:R=(H&G֔)~Q=)Ά$ M rLԛn('/j(<^):IZ#|;P$]݀zCϨ>Igm?ٚLfdf)a~ekK=k 580I]Gܬk׿Eei PĂ8;*HOj1HOSRQI\`QENy>[H,`r5β۷/bt\3(?L ~t$_n zWвc4,)c4t4fhc5OR۰3R )@Ru44Z (iRG;TɪHćSqVp=i=hQPSkh-*[BK&;#B6ZM;/9ӭU[K!Eڧ@pkt#H,9&A=HR͏E5K:/t)WŐisiw8Qɑ[pۃ5xf }W_7&-3[^!c̓w/^Tn%=]~qIw47|PAic7:Y;!>z(''ⷍ_ f0[ɒQ\c*K/~6v4fC)Wڕj:|5bH^#;U ?58Hh)G"x48#ZwGZnA8dPmf|ԤaM@\99 ~>ZH ;G֐>)u1Z@f?PAS]ƕ7_ƻm!ts3cq^ iѣ&2I;ǹ?n 4u J()Z^œ!zME-Rwi1p8!RP)1Hi@4ךVbnFJiRکj0A]X]&{W=U~Foӵ/| Mݭ͔%Iʤ]ki 'KF2r*!pnIR1T޽|T^Y,YFPn 5|J0Ć[hm}?= (L`zR'Hwg*4sIF=isFi0Nzm4Aϭ4n֝p{i0)3ACJE;wo'<oKJHA*2}IP}ꯀs~}CSfܦp T=sջ⯅~8ӭ4@0D#@'ҼƑx-W$m,tޤ6` Zῃ?r:fm6BҲP\Һ"ŒR1#ނs^enjH/4ݪn1Hh7/=wϴ?l'4;@"3o1Enj$xCl72Hlg?j~ J$v3HV{LqҎ.ъ:HRzx7ě/|[|Px]8Pzt$yU7x=. avD=jGV`K'ʁ;=+ߣ9Ibd2:A)?00M)AsdM.sֱQ7 Ə!h%WN&Ob?^A׆¬૙ ţFf}i)8( V^Қ95ɧqKq%G6WC&\(i2%-_R15?:{H[c;G#8_^cJ+|}-TDjRyRK&LH6.0}k}27/|6%Hz ק:x) XMo՛pe7!:gFGֻ .Sp1Mػct3R )84|a+rž՝DܑOCX#+z4D7f"0'8$š7oBF8ソ^ԧփ'J _?|B~GPp`o(9sct;4%ӟkھ|^mbuBѴg pP`9Nyz!ƔKF SV?/Q/,`j[[KVvc?!V1H)hh'jBGzU0) ӚC?TYjQ֐ʨ!sX߷Xz?Skر?_oj;h nSuIIoQ}nVk&g$d`z|̱QO+')3QR.Mf]N`4)E0@AD`nQ7"+6)qJLkþ>xj =rlF? |aBu[IT pBt{\ϋ!ށ᫃}q}i2#6` Gq#|߅y}1xFT*| رGR;R?0JM'#m=@Fqd R qNثӭ.p9/W5TKT'^3H̃+^i iZߋ %P>֭Wfm:@'8[/_|/ׇ[YFᇸYO5vL`p~xZ(;I#@&B-tVOaԞ+Z?B+=z>ӴxGj~&!53倊GN3=z?\¤̝AvxC㮃y/N!1r(` _}.HHyb&82Eْ9°?ys؁5ď?-WG3skhqlT yEj>14z\_شC#h8<3-zgzgm տS34pGa1F^<?φx{mX,FysNq½gzMB乸&`r .(uqړ&4m(>;h)ih_7f[4mX*9%&$AJjjz]͖ Ke\~Hٍ: rmb [ג>R詨k6^0#?pH`r=?}hbtC*yӠmQae ci!MdQq=xJIy+K>;Zon+'/'m8dbEi1N L朼fh<8tı|I<r,L鼐HIUvofAӌ:o$:ۙ-"rT7s+)P1[OqOs Jc*n#b"qHۯÍ?#5dл1fǶX++aP(&sJ1[OFrE2JQ5Hqg~n?kwk}G@A6!ۃHFN^940l5)2+ =9>x+WKӝs}P+{hxcO1vVF?=ܞc)kE*ߒ@Q4"Ҝx ` ygO㠏c6>qHr qc 1㻫L's ?1oI5fh/Oݽ|4?}7uvO2MYY A8lmYNvL*744ut&i D0sS7JgzZJQNRbu)ujZS6ym$HΟ [WT🊢kHbLKv:0G'LyWiSYgڴzV>\}bml=O58(9SX Z\SH)qIQHRނkm-o an#ƾtO4x I!'Lm(,x)e"$,xƍ#SxV3.n"N|{$J'4Q\ƒ6)Z\ ZJ(ќR3@(曎hSMKOK\zwh2is&NhnǓ S֔.њPsMl)0iG.E֗>Դ@4yQN84AL`@⁐if)&)$߷N3iO4QGp)4.߻O^ўii@ LyHrڎwpx.)Ҟ RRR)T[U:nH)[smun׸2:k*x1Wdůo c&nC$UN-ӑ~]+I,v죆ePɭ@2iخc^?׃UFsF t O 77)WS@ql :naXG}Cwk e)㿷jcFO.)sF3HNէ5#DC@Jh4ܑF}ir@&s4>`D`iaxi`e2iӲ f(|b$~V:[H-|GG,((@:A=xWk#B~B# #XZmG#mdUDWɉk- ^|GCiWq[JO*qXva2xN 0#z ov\gp>i7Z_t:뗸_#iopٯP\BEx4k6I1HDlYyI(掼SNCTW6[ou sA"xPЃן {9,n-I%ܰS6p=+׀<1gwc$zbHejM⌍u4i+6_V+kq>B%+: TdТ46M^M-mt GWQ#J"J1܂9-֢:^\~u'k#~7GOsZ{ %k.z %Y3Or8WxPx–zQM(+4Dˑxa#؊{Rd8⌜P&: =)h[CD8=Ꝭ9f'VOjcPqK 2OW4-(73t3]s `U A+| u;G°%3 Iz 9qk_x_AyAǘ`A􍲽7GtZ֚)ufMD2מGRs@iG77Zu֌Ҏ(RҌfjN((4i)qIt ֗4{SE-R8(k* u8U8'C\'4iozqM4qZ(}iy҃INRuxk $9l!P{. >'5њ^|7MSX "+Nx'¿Pg*#Wϓd뚗/jzy‚kCדx]GY=ȗNDIM8nBWRѺLxcӿB{RP)9!P:0$@#^=j)⺶eQe#Wʺz햩c (k+``9#&^Eó eg+O6:@Dr}Tzc~#]+V[HAᑇFR:k5Yno xX}𺯡dxAZ쭯V԰w}(;{ }{WDq(UF(\:QHi /+)OQI:qIޜ931FtKRA4 k3׼[a/ M,q{P>l犖p6;o|I *?ۏ-Oqrߊ硸GZ^\r&|8bA L+kko-!`̋$nR2j@qڤzRr;i<ҟH8+oN-ͱ͢WOpƽREOE,AYL6 |@oq:|Z?g>.+2A^ 9( яJJ)GJNqڕI?0.@#l88WRo1xG^JYE ct3Z~?xQA-:9ǹMWEv&컉Fq SR1^Ɏ)(sFi1B7qi49M# *ۭ֔fj35Ωr 2K6>PkOiEl8V~:7vZӭ.msk`=X+ٴo~)!t,`xhۺF Evzױ_8>4Ӧȓ[YC+Aw< 1IIFE`P:9"dnN4hwj\q)PVB\D (ea b ?[(O  \RVLarS NcҁAJ i&iFiqA/ zjSF~^iZSɤ4.(b Su,w8O=K`}~k5dU'aa_Wђ<D~w#}ߩZO )΃HvtgFI4ȦHEyů24F՘+sMrPA\<1xVAT-%VS[8=rz[?`O$R/l<޽^𷇬{+dvNYԒkh6CD"d-IL=h=(v<kMSGl TPHg֧x;h_8xwSH4rS*ɏBNF}y;->IW!_x=IGY`0BֳֺGvgl9U$(^{mR~Zfisq$Kj>h5Z R'$iW}yng^Qꢳ>|0mk$J@[9f#q+MC"!Hn{U`m7~c5x ,P0,L[lt?uL`W%^5 xe)ډ$ec{wVJ_& ~1:ҾzC :/<:k6 ;䐮uU n5* F@Q-\P-%-!z4:ai2 ]{t:2i:ō슻 ]z Vh!҅4ARM)qHhw'"Rb0 K(By201VQ (PTwF(4 9+GjR4i?uozp旽7ԔQ(hJzg0ɡ3O=8oݴ})`QCȤRNڌc:m Jk<_:qjs!^SSA={V, ٯ@fK}G_YW|6ccij kBbg+ \0)6vijrҌ 4GZ1PnbQN RԵ7FԵK(Fcb*Vӵ:O[ܣkUw4`Ҋ4;R(''Zi`bZZC֗O4z3N9? 旂)b-!AIy\Bxk!V\C ?Gyϡh-z!kxfwxsH>/xZTZh0P c)统 >8RR4P08(⑅7fI$k CN qڕ@ )JLQ擹 qּwĘ| cVEu\bD8dgx5斶?[n!sD컇`pqsךu_?񥼷R7Hh^Oo}*)V[yIєZI& 㚐1c$ |lٌW,^7b1=txoĶYJH*~w=çºEW7.hxzDpX =~~ ;Ҵ^iNŰ} u_JF_=nog`y+i Rf0x1K)Ҁ)zњ0 &1J84QGjNS~u#ޤ"&(&hɯCHK`g=tz 6K Wku @cwIA?7ֺouƻp7[ reRq'OJOhXSyH4bSjLўi4 :tjM.iȦ)$)sAPSSKCN)" ┌1\_:8Z-EUaT~,"@-޽Pm4f4U% V2o$ 3r^i>Y"E~OV5遗+S ,+?\]1b;V;[)zבjuӼGqoO=2*_^P˩CE%"aPqs`cZjLlsJkx{flyHbu IIE}fE _b?6r?Z/|?Y*Dn!rmTɻ'Mu-&Keԭ$G`^Vu?]&[7>Dcմ-B+)(RrW qҵTyJ9xƁxiJN{RG^h4S4uM 9 r(4M.JfgMQA;)s&Gz:~5,-]\Z4>\1@ͻ=7 X_n,Dx]q/?Q^GjotB6pI%^QId@;+xV hm5N44ӚFE|¥%A(|ALJ/aad2½nRh HPA A1TE}kcmVb xa=?٪ K<A/>½ѺRi{~ 3AsKIE(@iα>!aQ~z"=|ej:s)(!.#!q8WA-*PV43ƨe<+7 (hx~ñ[TH Qފ(8t)x!(RE S^@&guOo6r9"Td}cWU'ߣ}O_ ͿZ$1θW= {? |A;ͤ\|ţ@ ,ya+=nF1H4MKP.)h4 ^in?- <Ӎ6S$Bjd֥9֯XbL!iSNHGg M9nȦiˌRu8.QH)s.i7sFi1:…1A!4HdE* 7Hy/i$R޼g+षyHmĠᣏ/A\W࿄m5n-1G6 lO8tAo~ n.<1RƗH<1;sj:%ށ|GyMG좂hъ1IW s+-̋"PTA:$E-&Ua6ݽRxz[vy%,Lc|X>視}.3Lg杜Jr)ɡ+w4oibX9+ 1&`3 y~Zt B`+{T?ZH&*g ydR17`$#L8ȨLңbb,G54-KN%4\>U#=͵\]Nxm,w actQzӮn!ѭr[dϞ'] m2o7NdA$_Bk)<{x?[,O'}+*Mp5#h$Wkx<A0щa؊"8(sV*u?5N N_*qqNA?8?ZPriǭ%&4;QCqGV0:Qizi\O>*csKⴴP =+|9%˭#REdcz~#SP/~7~< hKE!9 S7FwP884RGlV~~ ӞWPz5o5ȔZ^*tO~:/~ǢN[fK9f9-)siz4LfNqK\_ZÍbBL 3pq8?^3?~?<0 !QĈA'AMfHۭ97!|mnyᘶYp3{ǃ<#c [_>ϞyS Nis:-7ւiZSMuw/e/$DD0|ߝyil|xA;-^r}$ĞKWi4}nwFR4I^K :3@-ն~Y{lo%6Vq#^sx' 9y;dAʬ~[u_ė۟[ L"GN'u⿆~.>7I ycV$,Y3lRp)'4_Riq(zn9i٦N49Rc}+Sb>TeLj]~ O? k-Kވbې0E rӇJ)hKEP{R5 NIE:AQGz (~<ωFo ɆPH>_9IrXk)Wpzdt>.xVrhzm[r$&yS\ps8I5S v0!q=fsKkq@?Ӛku;G;+3ϦWW~zež"!oCy@V nbgvP?G5W|e?}3H}$ȋ8݃ܐ@i@綼76{3 n?\o~ Ț )=Ӟ+WD@,9xKb>8zvCF6lNKc#kkG.Qv~c/JJ8A:Ћ}NBWc}&PP5=&Xɶfb+fH핎 U} kLJt=ZV6ah{KTrHʏ~;>ǪyǙ>ߜWwxEE4@FS#w&v]0ȵǩGԌVė'Hc-ĞZ65.NK&+f|g#<<֘ Os)s,dGJsI/z|s<km>V1 f?~i'wߙ.C*쓌89~d(kx'AY0G57 7M#rdӯ;7r[ھM'8|heqW A:(.)(R("NIE-fҊ)qv G՟/%q73?-8:+o\׋~҂ݟn?ݟn?y/3w]FsҚ=)E!RK֔ @ь1Hx4y -4g֏GݥiqM+IȥE4 `3g= 7R#}=Oq_HF;FM'@48<мv&qڗj1Ni4'SHT" ֬ߊ>ѓ"v)C g 4i?Du(6K/}8˞'A沮턈 x'n&q\kht'xe>qnM+XA G mi]ZhHⳕm?~S~|aauce Ms;?ڽ:wKjWH"3 w>$Ӯd)V\>j]/e_˴Fю>:5grH'7RMl\h2۰ѯ W+pZc]X$ΰˍ#56gf/#nO;sk95oOW{+/+ݳ3ҼF ^D`H#Oh~(񅞕M"[w* T{tqeC/ݳ_T2vzs.}j6ou MaFGcW2Gzz2I*lўzR!$b>4ZDMrw@&EAcی{ ĖZԷ X$Lwdzg#ֽ>NӚKcEـrIx==m$}U^a^ksgٗk@B1i8x׉lc[cGմWk}6謦<$czdz_N ɧP:qIڇ)5 4!4x4x>nyI(=))Fj z/ubBԃy'(/GjV5LA]߃ֽè[--$$W9Y0sizǨ#EDP@ҝ| ᷏%!m>giK,EdI'x:v?a?.>ُ oMM6n܀0rR2~cPFF@(9x=(^!]gLXUNB&8JތsF)@у\BhQKKQP)O֣{Ҏ)E4JNbx߂KI_C$r3O2ƻn]]&3LJAa -}N69Ƴ;|`񅿉sd%Q+|?v٭}6& .Gv=I֟Zv+~15ƚdZu%ڨXFr8U#QR> \"¦DSޞ4#d❀ ' R3i␚k֣X ߋ a 3˜Z1AFw>gh]2-W^uVx "@$㑜.isW35#iP $c~5u f8G+ƦXBɱد$)=@k[ş#Rh4c:y'~z֥q63Mv\]6Hێ+1GU$ \/Crebq+VRfYΡLmPȱFxQ~jQ!BJ CtķSyh%'R>ƼK5+֩RِI#}3t8DЧ[b m q1R+qּ㶱:7Vōwlڃ~^VFw-O?jJMKkI#s_1\<{q=5KjG+,p{⾍XE@mC ?)$G^3F9'8fjY 9@E_ƿU}gwݼk[YcWw#(%9#0+=c %g&HB0W:Hl统P>:^{Mu4S@i)9JjLњ_“'QSXT/?I}J_;4յo $҃T~VF'HOW>nE 摦EP6$)7mGKZZ:f#~dSн9E^ bPSH#Jjn9)ݩ)h!Rt4Ecz/$дǺ^e TEE@`KE)Ž(qFh4!'8I\;{Ӆ4ffњ)hApRMFh'9JFj7{rv81 qք'aZp)onu i?u'xL~%*iti%tT۸4>\~C2[壼etl;Lh }{`9=W'>5cbvOld>ӥtq8r)sN9|ԣ₹"uȁ 684"t9wj@zd 2)ҞGJB}F:Qy4qIiݩE4sĚ?l٬j0YBNys9c8~7x[(댠P}~8R+yF' =82o*lKA)4NE57 xc}C֞P#֜}84;n&qK11)8T h#yn*&֛o i搌Cc4`‘SoJs֛КI9v͵QFKYbG^YH~uŬ:\s QH+oWP84+Aא&Oޕj6G>j-\w4nmm"1][^m/ E+39kh'XOpԂyfzwo_A@KhqҼW|a"fkTYnzoϭtOxQ[Y4pfe(Σ$\`~?WZYZ[Ʊj0T`UmÊbE8)&)f8/5 S|6Pf=r:x8iKs|5n-nw^r]Bsޒ% {ߥzLr$"n+`z{ԄCJPx1ڸp#4bpM"ءZs (j@@c5V'- oOy35\GxboxLintKo))_}B7|ۻ8,A3,IyWC= uHI=@>A8 A(R0)‚i(L#-JV(jANHhj.NQF1Kך4FE!a@v4 9A'4umO/JLfbp4nQ0ixJ)I9)ztzth`:v4 +nUGz@2y4x'w8Oe g? [֭)ZX*%jp@ NYz7"W(Da)Nzo+E]^.'%Y#; <)ؠFp8qPMXӀ4 SMh[4qQ搚vњ RnuhJny-]A<ed[k%Z (]!8$;__MFLma!H߾O=DnԴ]{IۯJ_ƾW |[&U? +R2Ay,[Ws)Ww?y$O&iiX^% kWlqI*9?^GǜiZ|)vvzUm?{z23N$bsMl㎵ ,E2Ϟ:ULb1LsE~jP23GJCҐ ╾T4IMU~'#ZˊBRG#2fPHŅϽaK\ȱwnɯ|g뺃[x{O-s]=)u{y'"T0 ySO xNִu.H[mv5KJ0.$Qu($λWr_IcAV*9^QS"ո=p<ԡTsV%zPO& 壁ɨ̩( sO8 I85f=O=26Ky8IYl7ۜ\Z$Q\I8`@EP;tz wv\\x]eHP텀R >\g5φ ]:WIޭqicH!zomnaA$3 7XdÎRBsIECQ@"QN'gu7vh-rMg ՙCaO?q?֑moUiU},]v5ߥylOlJ4cqnO EF AIZSGAINR(( Z);wA=(4PcN{M*h R(NHMҎ-:M'Sh( FsHm wRf qM"Ef)(8!69CRs@Cu1†Ht+3x&}>3&3M@dʄ|=zzL_GGTW\Z.U n  :R[-2K/ <דёcTޙwz7_WG;]sq$vkَqK:J(h"i'J:4f)E-!qMA=IbJ(Q)Fs~aKv8u=iEs:Pkn%zHOƼEݽ5d.@26T\P GwzJLcGq^g s㿇IjmmfeR`}93RӳR749H3O(RtɥwfiZ}7ݬd]*m]@c=)HȤ{ғ@b S_=ɪxvɎcć䲃~u7= FMR"ƈ@UR#]XjQ)(uS_M̠xp1~39x7-ݦSsN-)sN0t2OuVm2|Gg?t&x1SK kTg#q>x:uk㴜Gmp2OU`ï<@k[y+@}A- qQ"P0xi[BOZN 4 ?5#)R9~ +eiIj6^ ATk>3\Ii`.n*ZmNs JٝAp6~?MqNca)D>G]oKdms N621kO.bÞ t$|N$nbgº;xº~!S$~oMl~$ּMքl3Y^jeȫFjP0)Sš%G 9#N,=iA |iGuxR;cG2,3E$vtLl6?/$Ǿ+|7 Ri_ za@?6q3\OlǷiȝ#>?ó q4H۴m1]!44Bڡ"zTÊ4A{ށ3+_->ٗp,GVjwB/C7I 5dzѷ41@i)xsQ{m$񝅔_;> uK(lsˎs+V `g^z9u89xX}{G֓bE wjix4IԔQFHFs֓bui6N):SjzZ(&qAni0irOZ)Aќ( B(.q@4AJEM &+̼uCܺmjq6bGyW oJ^ n7 @X`EtC( ~}9tؼX($$##] 94@H:J:S{..`ifSI#Q&m;xGS2Oi XNkŞ+<ͫnR`z*@Mxw-2Mȵ x-ti*Ňx_U \g"63?+a{Ι:ea:irH^#;4'RfݜW3>fi]{t˘lt)&>i%Wr>Og$º)M qBsHGo#x4ӳQ)2=ihzCҜ⒊2i;9 NLёKFE <1EAM .i5gv ,NSjSAM47ց.("isM;zfo-OoAI:P3t4N=yƯxQ^i񼚎^HQ,mvA u+b!|_kt6BnO!瞔1e}KB]n0#QXc< ~ y)jLM1 b~I>ڽ#4 NqA\R݊PM)⑰U`Ϳ8|Zί Ώ m=7qǨ)xn8bO_|ׂ|a#:c}߽̑}?++ QenBhTSH"A47CR',Ҝ1CAA .3Ih"zS$e'VX@YԓڼX&w;AoCsUO+_|#˱i[/[ܡs`I9ӏ\UVI78vsB^ƢoZjL7sxAjʂ rBiZ)X ptz_G-{phW>䑀~ZL N>9AUl@rCW|<Ҽ&4m79)$LXxPAb?RsEڹִ2wjZBz9™ ;KL FC :h'x+OeyUZX탵7'8+ziA8 ޚS'8W!:F'%  p{28ku5sEeOy9O :|i;b@ z` r+}Wk}?mGUL8}{ik54T`T!QֆEl9@收)(i;yW=#K\d@"Cѝ*, Q;_$x\1n =2@v`ww߳YUɁ }yah$ёTnMɝ?QޯbZLV/!a4oQ*u! r< i!$ƻK;m>;K;x]UOھquHo9V6C$;2{cƽ7N+[ lGמg.y_߇ M܅$+ԡ BNk߼-SL5J!Xȭ~h:)J8))qFiSF(* ւ=)2M/4K֚˓J(.hi"ER⒖(t0;zRNAsH94iF1FE!\uV)SAjK|7ʇ;\>¼o; 6شZHcS ]$oƻ.;6w $$0cm4r4j+m-常"$/$pd{+5ߏ [_u }N}eN=K;rO2G3ھh#֘P߭=T)KMzBUiF}irygm!KP3Lv dڼ_+ݽ\j'Y-s~ToW67ps8H|f;ic h~xKp|ӧ '5柳Ŵ#zJ;lXԨϦYZE7B;JgW6>,eLʧ!T}PI'&$%Jؤ.Vxђ +M'Ki3K@LqH:RoZv0)Qސi9)¹s6\N 6ݒZ]6YNjtw-D@cnpihPh)j yďZӵv9us| .BOZWUFqWmŧ5[`'WE Ow^0G?+bqz7F l.buM;ޭFT4䏭kxF^f.Or}?Zף_qD~Y"')wk;\ִꚥȷeI: ^Im pv;v4?Oо;izqðI}Ն='ڽ +iRH%@g*FAuIiGȤm6\QIޗzQ/1|,c8,<ûG]g=} ۽3Q i|ˉ#!$8Gz_C/esO^X ҹ|QO+JТm)gԚv1ތJh=.~ڈ$X໹ytOar[۝'a];~6n6]kn(ޝLg!LPG ֫ Sա\ 41Ҕ5h#r0*q֦-!I?v@4@$ 7xHJANM$Ҍ@-6ⓜҚJSMځFph F-$igXqY*sh"9dExOMM#mYr3#qE2}^lO!Uk|fn|ymkh\W1 %@54SFh⒊:W5 9fs5gLxG |jAP/"0K$:pǯ+$]6t4l8\aJ}߭ῴi~/ӓ&Gݺ7,=?<)m.jiztwrx#\=;ށoI^_DI4C1E 1X@q~xbÞ2_GjdjVmدKj]QLz~8ϢrzdE8r3qqWx]v)(%sgμoׂ-i.𣵌OrV$E6 @lC|1U s)Y?Z(ێ(i~i7׉taY՟Vm6Bh.p\t `}ORkŖx8?ƺriA4ɧmRRAR;x=iyZEZP1M"(ۊ3^SķZ/ʗS!xJHR|/W>ԵM:UgwH*@O\qZ9axUNe&+"|p[h0k<'}!ŘCmN=Iu47攜ZqZiL"|Sɤ!Vv mjqktIבj? t0/<G7(jZmYn=]J?A\m5@[hP2*=`N'Z@O͚ڡu]r*Ε`Hl,0|Uq| " fa80nx|oe{h9{! "FFznOӽr']TRjֺ6o 9 bx^cI#u**wz_os ^iqUYN>wǃ5r)k=o\I.}^K^U7niGLR|7WT?ghVY8TI\I‚{gZ{^\$(0~^~ߴ' C0η3s墫ВϨxBxw"Z/($R#}'b2Lb5ΡX018W_>uk (k !ۨ|RZb;v؏ƽ,KzQĚ1 R= )Nhn)@&Rx=߅tZ8rW$r}"WsŖ>,f<א@Ð9`3$dC&xgFUxT7;vUeb'$HnH@+GRbK44M(\0t twjLNMF+֥w"Iwp9JAK4( 4(V敹R 4)1'ԤFsK)?Pܐh'4fvAοkrbd $|w!x﹪4@Gᗇ-% ʷ3\͑ W#oxJގFT4-nI`z_ŶɢjMj VR]v`1ߒ;ҀIKbi)0sAE.3G(3<Ҟ) ӆ)␌/:Ў|LRoA}Gb3~/x$kJ.#._}q񟋵tެBQ׻im+ b8^` ii0 T-1!p*b?㭳z ]6YNw]x\ \ڹ=OF}k}? iSC%B hN[DMN8$1#?Pka/%YG>jħU /Ji\.y9w7UG[\l`A5 >b@}tWLs+6Q7ĿA$v{aRēu^1*o9k̟vSI<lNeqVPS^8ATyw5CZV 5ݴ78ԯ>jVZ}]u4$i*yw״Gm?ּG^+xkHkiݶWqB2{sMoMh^1-$n^2~n}~ށ2+R$ bnpGm šk{έ{ۤ0IqG98+|.tK{w&q'wA^qq WPąT O`||X4YI 1ıƭ$ ljx>// ۝JynmJ zzc43jbVDyqszQHEFiqMs^M~"𽶩`mƒ] >fGAǦ~3_<=,ċ$-$S(8=3:mx7LXR=bXOBۊǓdgw WGH%i>'XK)sA4 i4EqENiiޥ'FR.sNnIF)A4fQ@"sCg9">-i 5`㰑31c~-,"̓D;U}A?ҽjs¿݈#!7c`H ќ5O xbY˗$27'Bu5m9x}cֵ~E[׶Nq84~|Rs< ij]R wԄfUlm!YCᔌ^~o|K^9# 9P:u=j_K,!˞KH^~4 hpiZ\MbNKܓZDR ҮM;of8Sf}h R%9M@h 4)iH!ҊCBiH4œHE'Ju74`f$);M"`c4{SYw҅ńb(Aab$zUº#C{5ۙ:oK}p={ނuxʥQxc&L^0]Icdo3}3{:G|7JZ컄1ξau+o8:H=)q@4STdӈ"g<z(/LffxIZa544G0thT3 YCJCJZ'A"lxCofC7nGFoʟ\Rx37"_ֶn:ZVN *0@yoRki\ϹmnRS]g#hJ`HlN=o|?ѼPhB<>b>&re/Ȫ<^ h6MdI~"QxGUb@- FZhHmVJIo 7sK@R^iS]̰@IdsI5_x[ODF4,yxɨ.~7x>]sui% \ F ~ms{w&FG㴙ݞ(NrH=IBG^Eyk H>O2;WnSI) &iE&9Q@QEQCJ)qsGAH &4s-(MwD( 4x bisLbs5 xšΨn4v Tk~|BowUm46rO6GVB sǨj_ c`n RK{x{{|H9geDs|+Y Kj{\}~};%f)(h>r)QzLҎ SȠ Rf3FhE;bA 4j0E8(yPzP@NE 3²SmqufБs-~n-[M׭FxE#sFA BŢYʊA?*MU>/'3r_EA=)44IsKIIQsMS4bS‚)("g 8;S9~j]bH(J)(\ќRiGzC֓~qH& l\h9&ښhBn$Z ޜ})vg6niqZ\c%r`b9q4}LJ8I`\ZP⁻4=)@4S8s~5^ڒK' #Q\iҬdht唎zgiiMH}Lxuqym"Es$2(ߎˎN2 >UMq]]?UYt@WlTsGU I=k>U[}0?y-*q㨫juL,kNzv FO45_x{+Zp<kYnimS|?zNXk wk'ܖ& >* 'zFmRPӲ+ƾ-~ǖ確OI> +hfbc_C/t;Y.tn5;XcH+=j,-eJ y ,NRGpkQS ;`)nJIu(3}-F"]W%}~5sඓk|0c2E /] VkZHF"@pv 0@k2BUO?\QF)Ew4QEcP){R("*sKEb4c^0ȪCSbNR)iGJ\ҹx#þ,T'ܔ/e ۥs< HlnnFrkھc#;K+m>;K;x]UN)ݩ()M7Ԧ^RfJhNPiZq@nf^IGZſt@2Gq1|M %-;:$AկvqoLnK^󡷔.ь/ccO|TkS ڀp(V^S\1miZq8'4=.@LzZ~:TLOjU$Sf =itvR/$R)J;֓(ˀ3߭ROxtQj>!}8|gۜ޻߷_OhhW$Y@WϷZ{K52QgI}GcW3IsJ bš-[bQ*뵔;k翍?toZiw6L=Up00y tXXUvX0ϱ 5 */Wks68AZܒK#/R7A6x/_]ͧ!-b0OJĊ@r3BnҝIҌfP'[&sϭMϥ-QKA4њ"3H)I4Z)@Jp@4bdӱF(<8KXy/fm1~LV/͜nS~Xdg3/"~V}.8(qߒدaF#-4i=)y!&!>) @|L jZ;!40h47Jh. y3xKfI.ԑ$v*#>ŀϰ$h Fl?1\>p8䭻01c^jVZΕmN\$E=x'4 Ԇi0ipj;m-"$2I#*($ {g:!~Q d ?$wyd4]@6㜖p8NZ]G[*ц.e>D+W׌yײ|88,$%Ž(;Tp?k#NtPi8}J)iyړ4hqM$zV)qL$fќxXCB-ޔsޑM1PÊD$ zIQ"8њ" 6⥍0rM(G8RxMTgLR:(}H^e=w^Լ<"rB<^6U\L;KAhh^|WDhS,c iT0r4U}N 'z9 +8K\I  }|Z:5"WE9yI#U z;t—lq <pk>cLmXzzqHSZJ`^hO& AMCc8+^n= e[rGm T*4f-9QJ(!9RbR RJBB )yEW|eޅ{]"5c"K !Pzn#;? 3Dч&$y c$='SF,NbB,'LG; 1Ȩ?goQA#LO *GЁڽ}49JLKH)ݩ8R ZL)GZ 78RbQE!8EzCH0)i7PXFy:ғI x}oCk|-sIU_WH,.Տmp33V|;?<$H4d U$r;s?s_Gr)ihڌqKM/!M#_L~zR)??QCt>⛯ ?k)L7R,Gڧ"h/gƆkT 2Is1]G @r+o2 d9s#;'GS?ZkYv^ \l{;h1I20?dW%8sOcMw,),`v'޽sPxN43K&=4f,5RJm?*xKN飂1[m t=iO@$Ѷ0I</8'esDHzWTKuсIG94QjvFvC)1sIOGln<RzRiZP8giR&} ԸIsA<Ӱ=h) qH*Uz"֓& &(#s^=xzSLs0O5ARZ$.8#Wx<=-qǔ67sn691^9֯7^Rwj 230c tҾwwlt^Av^c=@ڕRv+,VA4M!(.~Z0 =)(z^iƒiBo|THF)qFh43\85*҃&߅;ix Qm\̌zyZo X Z;u#N!G'ӽyomc<*<}q8@狴_}Gp?Gdg#v'ugoN[$4Z(4RR 63E`w F5'҅S@Aip=i=(ґ!N UXV_5ܜdy9ڜc;Қw]JR0AV@ݯs0{u0; ғ#=ihFOJ\Zig4jifd:+.hc2z~UФڗf8qA;ɿh-.[…xɎC!?-y5tm!f(`BdnWcVZ]FpGT#=ŵRmkXԮ[fT)$nkݼE+Dh|=jmVbÌ~^ !Ʃ(\&}3?B+;(4`W|yε̛MeI0jt-5+ݢy*ԐG\5x|#Ksw[t6qHI_ y&QȊxQI;0}{8rRE6/J8bqKA\N#1Gj &sMvm ? ntp)ÑM<`sL=i}(n܊@4nQ1M>hG˚E';bRRA99Ⱶ&E]kJ(0"z`>R_sOKw¡4{GqPY.Ķ?x/^zS,w9枀F2i ֔cuqJM 88!PS;u}ZiMBAqkO\k /nG~1nϾs\6 |o:$lgXJLAw9^& 2*NO 8bȐjlqL+c@1NsAS4*@ A^qnt)k>+a"G;%ѳQ9S~EeAcҌqJ +K TXӀ9SnRuL|Ԥԍt.FE%)Ҋ ֎ H|ݽQ҃M)Rm8QE'Z;|B,cWZ b-N2:u aӝI(hX2x=z鞻 Bm^? kS]pSp y*@=\gK )M=h4f!gh߳ip΢ra!;E{iV[Gmk ( J(x^TFl=He=)~l&z:RS1!gj}FBɶw+:d^O[xjw0)@NAƺ|IKQ}?fK7cRJ)y!'nȠp98Pp94iqҙQڀpO5WR,t>KB^Y*:)ĶV*24k.A^3ԴvT||rCqռ}&y߆z cG퓋H*w玞⾔t!&(+UAN =A4dR$@84h$FSAi )ŰqKӽ(4\R4$ю)E! P3+ 3.;nrԤdJǧ֓4fӅozZZ4P.9RmzwN(=) r) -)3(4QF3HN4CE|un,/krH|Gq#[W+?g` ˨Hfc5{ |,"Zg( ?cԀ c/=x w*3J8њL5xzcg.)Ur=B$~i.='[*)ɏ]JآQ^ԆO4F)AN!Awr6o@(uvkE8ʢ? yf+Ak[t<ĎVf`yD*J_a}GKFK?elRE)`khEHc@ P0Vm4{kX& 26 ߳LHw1@mISNSR(Z77M$VHD ~XL8~7d '\V,L{* V WPv|[I/0I&7.7+y Mk/VoYʊ8[HcmrWjP0H'lg;׫c N<:R)qQ\Cek-īI*Oo|W$_k .x0ydv&E7H[_̎7Eu )kڌ@ øC!iJz:qxxc"ɧg2@RRҭFy4M9*iN)RJrEi8RJy)q&)t9sޜcf})9K@ih)sHzQڔR␊QҐёA |(5?-(s&F pp2rΊ;W|` ۩j `?==^uு]55jw51H<7$sdq1t-5jWsf Va 98OcO KziHd`v9H?LI8ɥ(QFl&q\RQ@EEd\ώ!}ܺnV;w=:Tx)]GKkn2>,bHE }0{P8οUnu## s^û&`C.KWd,!8UI s'⟈>&iI lyAT= 01F+c½+zkm?d6 (29r T4H<ZORu2u?u"œ_@kCIWǘ4[:V"DߊS }L_IA# c4&a4WHx&};|ms"K{ BbhiORG;GLw9x¿ Esuc 0Ysw'A -u_;uK|9cT ӑ^W/ĖI7)1!Us,>^Ek/.OMRht-JD מ}NH55̓ak7zP]࿴<4ND?}{g[}wgjs֔8 QF84ԥ#&Z/51q5y'%'y#ԍ^ M)FuS^3FgOѴdt{5&ݣ>Ikؼ1e&]"U[{(buQ*=6ʰniH҄~4=i3\_ũ`]ۄ qUZk Y.-c\M}'>Z.I'ɵa^ԊY38f[O<1HE8)6ҁIB['Jz (HhZB@=E= )i )Ub9c(pJ8N}(ZozQH/jB2h4i(474)iI ORZ\Z(=k?ih&L\&1·;^]ESm< $[zm V.`;xci%w8 dWͱ'v[m8%|:֓P(4Q@E|E!"G#AwU$ױ7m,!AH8 :VtVt}ݸ<y+f KI3s~U$SA5xދ jz1'ޖ,iI$=+KHyo=:1n9V7~&|-m;iUNeb>TL 2+|h %ińe{ۊC?)%[Te(aTgŖ0^A|.ZkdՁRqןcv 5"MᱱD$+xFk ĺ#^J-RȦ$bpsϨ{㟉~d ڊB.vHNEI}GO/H][ ڽD]sp@>x'νx? xPo+) =rIvn1J@E4ݺsKR)9<҃A +q/ISƺs0nS6k;7GlltŬG働W^h<p@ks$+tv|_.r9Rzu|/{S4wba.#UUsP~Wa+WּZxjYg9=Lh{<+6pJZ[9 9y}1g5:k>e77-k)S0O_SL׾)|']ri5=2Fٺc$өsAF(ni1)@ y/~AV֮@g}(xPrzg8Zω- \+y u5hhȣ#zb++Rt]J_65'#}`Q!&b)~Z^Rm&N) QE2I>HIQҜxH)ݨ)>? Mx&P+_ >_jzdۯ $W/ 'KpWf?z}宣iݍ76Ҍ,.X{sJ ;)`Q|9U/\ -bFEKwE3ؖcmn >3Ҭ/w."C{.9 wSЭ4Ȧ3y}"G,GLҰ~#|:[WWQMIE^7p}<`o_yxۭd6 82C0Ͼk'_ Pb"LyrEI|. " ӯ^߭Q|KkPxvev$qa'%@sKEi٤▚SO&Zp)>GԚה|OC'5 -5Q6%VruUCӭpiْZ;VBߩ9F^$Ȟ[Gb8㲌=1ۍH~F8ӻSqFj[z5uȻᐩ2='X]Z=ęIq&n2`쯿h onv$`bHT~O\/eD0Xmv˴-T`NZNM.95"QJҪҜqQQsHI3B3gA4 (4qJHJfi CJr0xbN;Rd41K@GJkQZu= T21\Qē ECM'O"1 v Hin}ҭ|MY,v\-ɆAѱrA?Z>T:[:rdNjw\Ja'<u)uC5M"M%>O{hX~ #ӡa-˟2 d?{z]ά*Lgvwˌw=iiiJW5p1H)h(@@y?/^xöږM{cn66~{ML>+K/Q]70zxot4yO u--vڭK12k3=P]yb#%d[q3ڌ0++Q慬}߸Gaϋ>0~|G{8$zķWJGq;Kwwb=A⟃"wBNm$͹P dױ4D yғ$eU?J'_Hd'<9_ԋo`y&Ɋ|.o6yR7+w,J9>c]GشvAbI;~CQbac@UF kj/Lr +~W~2$yqo^";׳'<(# i)4^OJAғ>f )2h=("oH[QXdemsŸ}GZ6½M ^) hIj?%-#(w3 0By{~| 4sFhzzњ\i?izӸL.=E($EEm4JNM%)F)9I\qցh@wJ ҞE$&[7Qv ;9ǵy?>)ӛŞ(/`8!$[#ER5*"wRwvk Pbű{g܁r>~'ڔ˥jRh41Xqzк-|4 䵑cR*z+|@P-%ծ Sa@sJ1QҌ3H zR1 JNWHҁ)GZ^ndU[ -N٭oືoCɴ7nŷhSo:RPOSM=P(MQAŒYηxITnVv$Wd޼ qGѫ,/oZQӕ_C!\dqzgD)::S Ҝi11fi^g4} #U(c'c,:)h#N>iisH =iއ.h&YuY2H3 Iӽ795Ax  {NTgo˜vO+u_?6 6^xVĖrڅ픑b۔`5S~К4~:yuyg ̘>;ğ<_xnvhבNqںĚw-߇$e~Q燌ܨq@ɬOuXP)‚ Lז|`u5=>Fդ*V6$G*|935^z5-&T& nPpGW1A)ב|s5ai-$MRE;,2㜩ǡ>SN nBͺIqEr Nx3->FOʽrp{WYGuĆB;6`MvdnN)1\K)?ER⒌1ZCҢm?moᄙn#nJ}Txfѿi ET4;(=)G>b f}{(߫h6T2p eBx&~ |dўЭ|3& HnzrI?i⌌bx<Ӊ& 8t4RS!IF"9L;Piݩ8A rh=ibL+RRH .iAύlHŽjm_E` #_>ZʦMgxّA}ALD7GTD:k? '?iKgOĖQyzƑyJ=2v_F(AP8Q / 5 #A\a [̵ٸR8#¼n'Ôm>PӢ8cqΣۏ=Kuɧ鱐UENXW'ֽt+MNm\cԱ$䟭iSOޥ4M<ӇczALi&i<gnCAw+6OMmQA[z2IQyxcKeVqY[ +?g +|RFbO_RMZ\NwJzJJ.i m:T: hĜgX|K4Dnk^_> lsr>=ׇ.b9X刮08Uâ ERX~ ⨒-oK&B;Ԇ~׀,Y@IN@yd_嘃t|%عo@vYdTm+~0J džlh|yroOA^*_"MPe~av(Rz_^iK_ 9my'c&pYG{_)w/o\I{nkpq>JMw 8Z~^. Aa䬊6} Fq_:x2hcRӂ5r\C(R ׻_΅u2lMXQI+?_gb)t5vwL%G )/'P4di%\x\/XxS_izH܄ =+feI .2J]1_?fT9 hhe;eB|ƾlWK, BW7WrsZ >YMge#.֒(= u#' VOO'"ZL1@K\Q)@ Py4sIM~W~G,b,JŗÚ1t2\̞7cկmikcȎ6iwzRcRAǵ)7hH&ƐZ]ƔRwRM4oRSHyȧMbMy"֖KRHzH,M WnkWmeh?®>cl⨾m 8Rrgw^ &KkYu \p2zk8);qJA摸R+I.843֝)9!giS($ciZjAhȤdM 45| yY[xLq .xF's 5YxsAA7 " ;]x<8G/|>#&=mq ss8 ΝT{zdc<yk-ϊchof0]I|\l pid;SvMڕ3q) x7g=;qҝ)I,L'&'s֟g# ӧJ)gqNJlȨmCRIi)&֛{xBEdL²F?\S@f":#.23X[/^|Sޏ_i]G>{[I2.ǹ \i*MJz!T)?SbzM IE)yN^k2xG50&>gp  2=sŗ}%NG`I$s;&h2][—׿joPa@'|ό<75&G$Ǭ޽4УuwJ\*2>n)œ &qN@(N1M"4ڍ*)⹂H.!IJr(e`zWܽ }b;YfO\V`VxO·yog-cĆ3"и9h#LsHݱH3KF(ҁA9P)x3J)h'4r #A$lS x4uWCglV-?"9&fkrc5Ц5}"# &6_cJOEE B/ F\l gWpZhŜC{Lcd[sZ_ |Cx;m.]K4v8Pzs_OI[Ӆ3}6c\|β>.Gt=^[rcYWpb s@QWq0)dRуEM>;h"\K{aO}¨8=g[ȷjJɆ666.u @"Ngs88->.fGP?ZDWF 2)ԹMu4 RAIHN .xexZOt5R .Ǣק=?i\\oK3uU h_ru9tvC?Rq^nbUp$}5x:RO4R\qE 4sMv I8FEFE3&EFiAh@ )E??m LR+Q + xğ5?rOwcO9OGOtд[z B!’[OczHqsH^VFzx^2[m^{G*x"'#ڼfv?ܭxYxo烼+ilu:y q??`ޕYkuW YqȜWG#4>Y/R$F8?!b:| ]gym]%R](!.8#g{3gST ׊wќA֗9biS (P )Fi|'Zy|+&mR;nhNDa>^I}Af D?Ž? ~vRQFE'Z)GJ3E硧qM=iii4QA$ri9(&Hz|Ss sʒ"I#` SN(''"+ X57ozMQFG#ցچHh9 g$١皍T/A~pLfrAxlfdsI iQ^)L's3𥗍<7>xB3|O&FpGpH3NQԒ8ZI]d$s.]2]6M;N|7@رl?JBKa,|˫`!}ɮ<GZ GY֬<=꺔Kd=MxUxPsupٞ`36ӵs4/^. :RnYC׹͏t{]WMMirч_B V) !AW+;T<)@%X >qpxsp:8M-旨j{sx ϰ@[x;QLR/&e1$r/pE['֨ٙ6ը#' (%֟ ׃2GEi[$V? K_]Bw29Vڠ@?#]=GX7 .ylƾ>bMg lbKm_ֽP &N.a? e= W3\| $X\)pɟu9OJmGzJ^Qނ2+?WWrp.$l$^%!.eDDOw1( ~:ek[i K@iX x$IaCە'5gm/ܺZAD7+|湻)|u𦈱iz΋C~Fd@Mv xA{qkkI,o 0 `  +!jMhnMl,ބz-kfK#&Hȩ(ih44P:O4]40)q!p Z(hQ3E)(yJ:UK6SVpD/F+6^.Dk09h@lG^=E*)P(A4 Fi1ZNIޝHi-a5g2 u`6ԆT_> \ Fܒ3)NҺBhRiFMP1A(4Q (%&)E攊8hS\<)xq)(\lqBvh.i3Ev)7fؠ(N4 `ⓃތfRȠ!OJw sBўizm!Kp3Ciƚ)v4ykYn>_Fp0cX[@֗x"h48J(sG"M?Jp9b((R)1n7v0h'Ji8ST -!MiݱH.(Fnߎ/<@ᱳ ;[|>=s1^W#I/Yq,*r8%Fs888go\]|v.mUKaSc^둜Sd Q) 7 Nx49sH;i)QIނP1P8ԍֆ<`Ty `1JYFHr2*ѕwEi̎:dQ80o*O;}~c+5OQ2^\˧L-%A}<R4wS#`_nȬE3pC:kм7#6_ioVP#?,ٗC+m=[ho֫ KIMڝJNhYObt%u,5ܵO.~6ߞ{JL9Q+'~5TSLweBGtk6~8Kg}k .qƽOzѭ,kayn#K\Ϊ9.@ri87Kbmvv+vAD`ֲOg K:h~ Լ7 *ϴe=A 㦾mcDDbI{ c5R?,>-V"+'f$ask><'X wmB6s1Yu/j:Dڒ7UCZ|h%rѣr ']/\~h Q3nS$zoxof7I,\ #p+Ǡޫn3'c8U"'}ϳ/, Vn KHq=qԞ=AHm-Rh@$D'q>3{ޑf#F`VvKWI)sBxdcGsoݬ(hCW3RX\Y ImrU*Gc^~u&%m%>?ǎS&,^DHhs`2{I'_D߆<wzi1H۱WRF3T]F-'Gԧiu*X*~SĞ%Q$My/QWI]/#j'pB ^5i'ϋpx_WtMFXR5pRC$HW|1EH3nd~`@\Y]g35H6djyHSj I_:l-14|R+W$4W:%< ǹr}G#QHN(is4Rt49Xu卍}Gufe܆o׮zg<)L2ە3@H!^y2+,<CH}B;b("sFvn>PH8?קND4PF̻s:ֲC+zD^jCte#G? mՖ)kt7+BNcEܗw#=%#'?FT' jĉNfGy>鑁 ( >J.i;xfii(h=i (q@H:ҚJ\IE.E7#=iiPdf'QE.iiOJg49qIH)OJJ^}:1F2( FҊNF4_4J4hKZm8P:ҷJcpp)sM)ށO F1L wN"N =[p! iJ:RQIғ4QڎrӨ3K)3Zm'zwjO˄Q۹<⓱$mw>jv9qGNhh=iqJ)օ)8Q֜N)QKP\gk5̋I$p@'_:_|KsxNY,t;C8+r?#j[9!k#đΐI 6st (z/|YY k&wF=}uE.)ZuJZAփ֓4QE@/PeY]$Xv>x4~ }GuZܟð#= Gu_?+_kno62vؕ>- #K,Ayf8 3Hmo›o-iG /q|JBмulϥuaHǯ8 _jJCPI֨z2=pTg^޾r{<:v+ok4BC{R␀A➼.)(wDsjp .kB;b>޿:vrZ].X08O#>u./"m{PlI>85.x{FҴD6ɵI=9$4E(2*1Ϟj^(4b)GJu4SRH&M:ihPhU%Y<тϭJDRr:V\Ы pih=)RxKIآ֌ѓIKQHk~.xK' 8?gG|Y7Fm6]#obTV^usKK@CtsɨD{T\O5G(KC'4\ӐR|Լc! R(" C֗Qړ&z1K1M4):Ӏ f &\E)C┷/ ڮ R3 X#;lNH00sc^s_3c˿Sa?I|бಃ+u?~dRi5 -/<]}o|:>pzJK[yv(F:`bb|'j3r3DBmU##o4N* k(a~ʐj~1M4M,G$T>b#=RӬ=U# ڇn Y1as,A/hZvÍ2G56Mð yO>ZIyrDbUzgbMFQ8$pAEQE]-c֬m&$E=q3xbU򄡹 n9Ez/nR\!<+l{d=4n;"A^ئsO<+>&|@׼AA|,2vꪸ;<j[͗r,';tȠ~k,']^ ] yxYz"'&"Vs@xɯtK0tnB:}k?i4Xt+#r걩ʒOӏª|*~_ 41d]ga@ 1T5gO6%#/#I>^3~v]ՠ ,P;8G^3t'sֹɮdcv$`9UY0Hsү_YAgk53Hѡn$a?gZV/4èSى fX,^+9ё`pA"7Lı)dSϰ8'߀~4[j6 HV>ZnO˞Ct+bUS sR1J1HAf! kT&<ZCJ:QE%)(A0i.x-ufE#Rf(()w MHz(=hQKE!'QKE)"EdѸP :j6,٥#4 iҵ 23JH<S]`T,C n=Mfu zF2,o3bqGP+{L-4~M!`!'<򟈞$ҼQi;Gqż0rde=+#QXlu8F"t0uw/ZnD }Ϡ5'i[5oby"0:ԐkCWo۝k:^]Z15vaqg#>+>|F\:dpDp<qAGzC֛=(p?LQjp\4m%َ#m}-S>[pO4 Ϫ5'9NҞ)qSR=)}ޏiM|y.R }z}.kim[jqvym^3? woηq|V4dQtR>ZdbG={R va\I!,g}Npڑ|3:p/e!) I8MLju>&AunCYέ;=8r$5a q[4wJLQSъBqJiqJzRg/ZLbQӚ爾 > n"@i\f#^ hӣҬj$ASY۩''/'Wmic3āL,d;f| ƹ82MNց@K4(J^񢝜78=(43;-s^}Z'%k#jn]LqACq՞A(9 U/mV*ɯ&:=N+&֊Nk毲GcԷaa,ǃ'`Q#ѶQE I) (R(*+h?خm+u;]b8fga^-R}oZ%;\KhWq˺A?o (fdRG# n7P//.?)cUXMk8G$F{mዽ#K꡻f,|C]^5׍ޕ.vcJ<+ D˶F̬GbvGLa\LWdABvM~5x. ^ ,rlDjA8Oi~&HZnso91xVu]CWrWqտ5$UVK| ,8{-t{ź+EUpȯEUTT 0T(:S!cgt kZyUј{ W|%) >N/0q\~kO!WͶƿ@4ѧ_@ˉ;듏M*[/?}{b#吨}H+K+Km2 +8VhGh8UT2F}Mg5=^-crXrOԿiHK?,;N?3]>=:YjͣHcy%!bx| ǽz8V_ o 6]}9['\ҵ;;C6ӬOhMR{ׂKx6])elzx7xW!kMG<18= (("(AM1M(HzڃҚ)F{RTN[?->=|ԥ;AGzBi94M%Qiؤ#)sڊ0c֌M'4QPM(u!&tM i6!;ķٲ npd ¾6I&I31bz{g^9Mfn\ebr;kZP]|GA{ׇRe`<4h<׿Zݏ4=cMb)9SЩ~)6dtW0Mis o2䍇 `^!?4s_=9P>߳η5gT.ŤrOҽ~Ӽ/Ai,rǫ1OX`+`p()#M"sOsOF(8)KR(vm Ƶ fHg`UAZ6(Bү m vDg,GXI6xHYM)ILA.ѺҼw~ ^^Ī[M[9o HOIE#H5 1 #cb 0("(4 Z\RIE\Pi(qM'p4y \PjZB4nP997:T/@W0a`&Gn}?A@ v  lw{Ց/iE_@Wοg'ܺZb y>gB_ҴiY|pB0 E=1z1xHq>-@HFϏC@9J~ _,uhi$rn c/=5ǚ^Zx Y%|ͅ&9޳=9ɦ$o>'2*ǟ,ۏ7_0 mm* 4 eМ0:2kܼ,g9Ezb+8j'Q,мGSf xjZ/PجB.[-upk4l_7RK$|Mz;߈wޔ(%e0v`n'_kCfRiƓ\t4 x7otRxIPB(J>c+GųI6rXv&䊎k9⿈AY\ V(rs"@Ư؈[Ao+u-!ۂ^Fi3Mӗ`4c(!Goy^[[C"Ƹ)+|Y~L)"ǹpڇd&\ b:R Sfh"n9)SA\qIOzsO+ O4N4g4vIE|ˢmwo2) BϺ9w0@k4fi9ֿcq5)2&|n9- q_~&\BmK/+9dV,2r~b9<5v|*" 8'1W6/VṰvIO1끅|fъ)3KJJ(]’Bhҭ8(棽."RcRbQJ};{g4d4p *sOɮXF$sjd/ʀ>ArG|hRfQ֎)A):P4`W/Zxisu>mU }=+4wWhHѾۥIC,-,* <']C_>(B4}3Ek-:[qc=0zW|8%4@%߰j5ך3Fi9Z^isFRDWSVim ؐ(X'wzүIғhd Ф[jPiا&ikVl7I1EɉK>I}7c_Bt KL!ɅPA06ZCHB(J:ӈq/z < @H SIEQ@4ކȣ9ihKiZP(4 S4@=)JuSOZQNc"C}iQ @4K(AS֖=#P$Wȶ)#D`s7=+c Ɩ5+ݨv>+0|In'𭽪Y@feNpA#y{í~Ҭ-;cuX`RMn͠dNS ^1:SLiiihZZLX)^;k,CXprA3ٷE7^ѡoWMc7v m>5\Ms v> {]Vc'F-kH#бjN{ҚAF(4J) &ihQE!sN(4=iiVӅ!KE8F{\ b ýZqfGQcVrS}r$\>.9oJO d<cpqWkr[61 :ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km  pC  #* #2,541,108?PD8;L<01F_FLSUZ[Z6CbibWiPXZVZ !1AqQa"2B#R3$bC%r4S5?@'+;?# q?u:t4g(SYϨ8jnfap?l1oYp.K{XJPv,9[/ɝ:)=ȷ.F^29\8-:(hu3JfRٳ =c)R##f/q=6KK<6nX5b-l~kh4uti޺Jw۽P锵HR5>v5[> K+ RtZw_YoZ|3I>}/Q+D {rL〲g vOQuEEvG%m8r~Fʮ>{f浃/.cRtR:xL}Hn׻4Xl8=Nu}wQ*Z8}'QvzmM7v9s|` alΌ іtVò+jJǩڭKh(}sN7n̨J}]ܒI<;#kN׽W! +yB`Faص*&pcy6icR.j=cSuҗO-#enO w-'0f< =ONtnGI)FrzZn5aQ;EH@OgzS*JZgg,5m^.+UYC8HCp-'igakǦ?[k^ G[#G]躎S]^G Ű|x,-9!?>c,nWA[n.?-gZ'nJͷB^ T !V !/TY^om8i Bߑ%!Y6vgz7Yt:UXv5ޯ35VM*Zw/,󜝲F#),,,_>*R}}A-[Z MNG l8'|0WapM"<ǥz}Y_UB]>>ڎ[G*b?'ً܂G.=ࣶD-{fۀ,,1aatZx]|X)aB^RT-- QYt4ե p<26 `l 1`6x5cQx&OO U7N45MDR>;9pOV zUhaS[ʕIQQwF^j*9ԓ|(#K}?UFkTԅ)'?ѭ}M'VƝDʴI8F Ž(E"_! G? 4%FR/I:Ojh֥A]o/< *yVQ zjEO/oFkv*>ܘ[x`_`!@@\ ӺjUPx8J{.>Yu]Hd  l>Wbk͇!7,ٱ#6rdԕϧR+2S[ʛjjƙFKخ GcgO1pN 3dhTEhcf)ׄG)_Z}L秣`#{eyӿ>?;cvQdAbB}_WM%iRx]}myVTJwr48'XP{@/< HhVgs۷r"$ܡ%[ Zyk,ȹt^S[TT< ,r> ?#` vt=q/䜻vwhWSjkj%Vrmp._=/*%vDW'-'oOzSikN45WSVug,Mݚy g67)8?b%| a }xv[d m+6 xmP)zWޡzZ]8:Oh+EͨTXGWxg5޲z:\T`RQ|M+[l |ɗn/tL !y&=l`Ct55$ߒm]@V*n`69Ƚtq[$!`0-SѭR%/Ϻ6c2BCa *- 49BSUkvNu#)%쏌iTHF|W?;jSyG$8a%,mb])JԪ8jvGR:R0ҕ78G~p@kd+.LYI[KWDS[[z}e;8_UTX_/sb`e}=y_!'#@27a*?'*pQx n< gsP?@ r ^ K` ;X ]b?m|XX|s`cr~Fm`NLJ0m]'5ڷWO-/lq_\4<Ep-9`{ra鿦ua Xp27|G%MrO70M%os6R)-Uoէwv%{y>~?u1t1O3/Nc)9*W#p[1lNBJ2oVKe浹nB>Uze*MECrOך]&S8G-#9݅|]pVKAеCOROR)^ǟR>.ֱIb巒l#$EAG!H?sQ)IOv^QӚ7GӪխ^:e>.q_*YK=Ϗ䀙nX!fJmažȰX6S,G=JmNj fK yb2q X| _anw Aݑ? J^{rBUqhݭju>Jy9I!B)8*2D̞_;BC1O=JuGBVR<;%[xܹ%u[!ed G?'_KSWMբ ghkTQ-/d@ϸ r r8-dNJ>ߋ28l(q8 e਀ɨO_%ɲ3|Qηԣ:NY~Ktg^n ]+|G=SlJQ׭)2f)\)%_(9Q$+ ]mMYTw`Xx%aK '#NJxią r/m] a: Rt$Vp ͅ`^kD2U%Ű r,8Tomݽ> +vOp]iӝGjqrv G# Ax@Sž9 +ro7\\ӊn&3Vv'"ܱɑnI.]QT/|n/p >}7yaTuj*ieT _{)ؤ[2>c d#-aovby9&Y|RTں''eds?ʝIA>L^〳{&e'rk_&lA8[+B6`~,9ǰ)i6RvfsGc8 AxrܪqHދ'Uԏ'&륧G5G༒x26E K6~B* #ԚHàM RpR_2elb (n%fDr˸%1MYEvˬkjN`Z_*2dsPk?/ﳸ!G#Y-9Gel EȌsl4($\~Gt[M6TAp\reF0XnۭBv]Hp٢̯l;l>q8=:fݏr~zEnݗY%ث{/A]hp'ڤr%92ܞ]VJe/|V?erͯ|%#+%KX"[koyZ=5:mR4VW3JX՚5xÃ^Д~c}# (IfO1q .VoSH(KwbWō6c!2bF(2ܚY0(A ˰6a%'dܜY<['{ r=մi*u)ҚFz(xIr̵-FP)NH+3G *~ 騳މ>U69Sx{Yϓ{-l0F#.$dwBVvOኒusF!ȵy '%|YKx}k;ǡGJkNt(֓<6Ĺ0Cn|׍(4Ͽv0`9~ E'r8..-q&@b{oU5'f?M%J LZ|/_:%K/ +hdyM]MR]uZnCWU ͝Ճخ-[rfy29veסR'jkఌb1ml@<[`[[LUDVV1OaُKcc(KJKtwzQBJPV%6<تN;`JNO$~CkޥKURk*rRO\5SGE /f]eF*ɸ a[fẸ9Fܞ ݌5ortфZ2ȋ'7Qs6T:j5Y|a e{; psRgNjЩMI^=j'l"`8]`~Íɝ)(M6zYʝ5M{#Uv8s3NV%s~g'W}rNz֣Ħ6 #vo4?؃uGVRcS^G Kd>ߓ_ }0ͲUIvsI7|>v7;nMޫNPqQ:2j2FuF8JN.YK_I^TNqÌ4,饫T.k(Х;d _"[8 g;3RrJ>Os{v@8[V-ϩt- RNun[kj wwv97 >F=,m|Np< EOukxw8  l]nEqFp#SG}gƬi9t^SKV'(t19>G'nL|~ /PR n6IEܟܼlBd]Xw3MYÛSJn^1lrl O;R-b = xlO0Ñ9g<6# -/7b G "r71p,9E[`rKde:%fc3`L\_##S[OKJCt-RںiIkwx!q͇ql6G_LvׅRs?tʗ4kKNF`{ INpn=D;M}[_C鵠i%)⒧sjħ'lzzz=J}e^Mrgmv :%? vH=/hzNF ~ǯTzӆKg_s>?nSSOkRr}͓ 21{06 wnEH^cbr[X{ek܅ II$ig#[U k?qlT-ŷ'&V;4kS(SSos WZ=u>5ޯK&:]>Hi%ؽ|NjSOvK{-uBIٟU].:(SwMRDZŌn#>;?@r/~Ƚ/8 a[pT%pZpMIܞB^Q__lM|Au:yңV)B.%dyښ.iSW? {led΍NQ9*|ohi%Jc>..lZT*n3Nk-f*J弤j2鶾^G<n@qwDn/|{ PmSZэIE/cT8jir`p@!~LܒD{d["Ñl| 6e)Iُa ?`y +roRT(O_TIwNNOݘ0X%޽}--:jPjMwӂƝ:9w~摹V.!$tN fAobv,ہFOƾV;In:S=GWYpc `a-t?q͎:MRWwvOɏ8/or@@S̬1~(tM/I[[SO%ZQ-WM}Vz<{tXO<8)N4Ԝ_kٚF!/#x~F=jql_"V0>Nޕ**9B*srJ*5(L0 B˶ɶ:Ƅ.oIx`E Js*MWF `pp]~LoܛiSr?G_ڝuةEB+_N}C5!'M۵br/u[ߡTԹ}+ݻؽB:XSssY MI+  <G y,c݅$Fy 8ܞ 7x?q)9;g*mEJ[7'6%>65؃+F&/sd*JdŶɰ&qf/~Ip2j6tz+Jt+\`7c~H9Xy!|Ԩ[Q`9r!%#٢jRV1䡍<bΕݱuLP: j5'x3`-Xp"ܑ 9c6*B~x0oV:}{lv6iMW'/sVJ8lCvZ0ID:7OUiԂ]YZYn;Ӆn9ZtQs[Eڭ%}+կnʯx,؜e[I-8%xqTP뿷o9;<#enos[ӵ8ץ8w+pL$El/䱗kgSւQkY%{?Ĝ/ &J չӣCqܻuFNW)9IYM%7md ` \{I\ʭӕ#݌8BJ_jjiFO7_mCA \j:u5a~nl& Gxc@Jl8'%n8&ŰFN,_$ W :^*p}nr 6PINJر?`7|ditj:4դv9}ǚhhy r[.YgU^?EGH{ <QN=}OiU' },@_&tj:U#8Zs|dg0/ mg`n87.I_vzԽBU71QW,B* p89:sRVk֕zUYVjm٩rm6ϬKSTMJWO7XB%0-wE d,pKp]1r>۾ղ ¤ee䛼dل? rnUGU ::PRʽ=5=<_SXGRt#Jg8*kZS*Wv:3QSԊU?K/!KRױ:aBNk#'_'辒G!i2NV}F8Twwf "r fǀ9|\xpNJ;TG7il=`r- 5+sBF?p҇|{|Mv׹8nUM44icE998c_+vnB9`/cvѭ9=RzUR^(*[J+,]5=J%Vk$[ gp/}>&T{$o_&r/9v\EQllܜVe_&,_%E/G`\Xn[exD`q; YeN5%gorJ]ͷnGk^"! ߑڷՕ)s]1UN?2|K.胐K%@ȰbD_ i಩),p[0 [o[vtU=zV4-cuRh 3r|86gNII6}&֚_BK**c[il|!JT:=ʹ mrbR{by/ -ض@LE9;"=O#~ иa S!EI'$bV38FRvY$6'Oʋ=1Y,n7. I51]yN5+vK%VFת:M> VFq-<Xٱ {n[ ًs:NSQ~l3Tg:tD> F}[}旾0r 8 ̒FTTMۻy@W_Bɸ]le'J6BXܱ߰cvuQڭF KXԻZɋkٍǁɝ>Nr9eG R*2iK{a%Ea1 `SǦkXR jn3Z-GNOIiΟۇs#|3FPICCbf=HҭkيU7]v8|uBhe NwRO ^{2y/+܏a? H^f݄pPQӶЯԣJ7Ż i:WPש:~[>prU۷qd/ȸW($D8*3t).C:j ,t{!Z{c=QS*(;v>^K$/+l9@)vkihkutӷq:m=}eI}MB7w=nOKE^u?7=#G\*B8"Ո͔ZUݿ_: }4ܾߗkV9Ic#`<l<8xBmlN@e\^@ :tz*M:4)scήuںw97Q%O?5$ѮKK9O J8qd,.K8ʜd>AjJB5I<+z*ju]JwmX!_kp /nB2Tmkar ]! _(ʌf?ӪJk}:}7l_W_{bTM=?"  - ڭ/c)J͞5JnGa.9r[[qr] 8(C,Bn,R첱r؜Yep8P˷%K6РY_,հApSpinTj:Rmݓ!P9n/\59;[XbG[r\lHpB^jKᚹp6/ܳo QI+rc 0<QvOѯzRPݝ3Γ Kc(RxEVWQ?BtiSpP#nN{cA]wN('=.T]hUtZ÷-;rrSN3SM൅rqR<-,<ba _n`8V>gG5BSocU T4fk7jQ6YVv%?WitUt+k[+7&$]@W܀dr.@GUor?rH8;VtG^ 5f+յ5ZsyDU}5꺵 z(s]Zh;OPA%Kw??J/ +פϷ?x([@*MiJ5)?/c {rG?0=ʿr|ʕ֕ū;5̣ 51dŊ38 < @ll6&`T]tA? {6Y gp T^rr]>GS(E9wO  Y]-཭,܃ r2^0-mg|B6:Sa:Zjo~a3ظk## d+v؃8l8C>ߖ`|u1Nk =u]/UNJ5)kunҲ[%<0c09 dp=K ?$V@@_ +a$lF_ I/dGXw/usgQ5QO( zJzxdO޻zR\#Ý^ osdA+d`e=ӸrCU*t+T$kғr XAXJ1IYN  ?퇐_1#`X<֮ЧM=gDJ6bl^Gww X'9p ڂ& <Rk"l8@r^fMBXi-b5kEt6@ X\C aXneWl< @{^- i+`[ [[pqǹyvHSG}VEj5J6NҺ_ڣGrN%:tz)wP.%fJkժsM(oiPucJNI`Ӷ|qy \06[;k* >}Ƒ7!8] U+Ma8rr<2DUclceh{}#k!tt4`Y˵#gZzލz.jO4n؁be!xÀ%#/:*Rӭ% 7Bfg*T>d{;:\4r^`sQcUr,9M. ו)K{q_ς{d؎M~G# |t%ԋoQ+Hy%o? j(y~Be.䬑'r0AG2FWr~EEMQg='NHԻԓ&a_/#%J#fOSO%m\٤IllF1sVRWF>~E,o`śR $nHeJ=RoQMBkσ}#\duU8+:45# Lݓxϣe)I9($Egc꾣POa 3srKޡuʑ}b.G&tjԧ9a?c]؀qौ%tINSwnpeEԿmbTsob)>wݾ o;A >@,RU-<>%GЈ ]|r7r]B^J?O?|\JJJjq1Yn#p90 et0v\b ݁q`/bJͲxnTfSr1ݬj_fKt[RJ_}Sxitt%f ۑ ~@ݔVos%!< tFuJ4#Οu:2:Eo{'u$U'<D@XjۤOU*v&֔%(]Ѯ$,fʴ]&$o|_^Fc,$agzcCԣ*3W`OYuשt/ЂlV~8>s 2Rqmݛtaҗj%HMI56#p%[x' Y%|r7伍gOwYǎ]|XX[ P(8[1qv! p8໋n1o"x%9 |$sQU}(Grݜ8pMb=]lONJE;]@ }ps>I(al4=Y4k49o+RFRH?cZQN?s?Lmd\IrOE_!3#vJFkr~E|@"T}_43W'(}%˶-}o:>ҫFjJ%ܢ>hJ!%قn BܛJ-n@N.||Ō}4FǸ$/e9&Yg9M8ز%?`!sq2&4Zt՝)F&#M 8IJ/+&꺏NJRnOs@Xw;X˧- OdOu?Z8)5miT>TU^1V1E 2n;Ku-Nj4*8S5q'c"<A!a"ȶ?%)826mc6w#\_owAx*"2KFV=qTVӥOvg'}3SR5)T%pm^tTjƶBW~Xxf_RM[Է>O2 TiJpj=C[[_7:wm;7mbװ{ a.o}^0~4דT5th95 -<~@[Xd[aびv6(lrȸ(qktEvsХԵN!K4='vth45:}-7R5:-D)ʝH;J2YFpb/>^@y-@n]RRj2{x5z[KRX_'ſ=mlk'q? a ?!a|' leJ}Os랠uUӏѦ#kS6Y aԫ*}5k {Wd 1VF wF9.?#Tӷ ",+J9'|aInB'ŷ `k$eY"b}A?[5ZWP/8Iݝlx [_`NKÀRW:tP0ٻөt%R3?)VGUk}J1xE1* ʥiINnVx `1kHUJYW#jKr6xǐ9 E ?7 %rmG䜔pA| gM3ы |wtm-VSԮʛgQR5*JQ|. j Y6r9,%}7SJ|*R?{&BOYUrѥ:8;_2VyD'qlaoqYw/m]LQ;%dilN[Jf.Y{-%rmݢ:n>t.(˴`rZ2F*q&W@\-9k<M6/3_k ,c=-oA}mZiP%s# f| ?bqa7p8l9 q^7'r wFO Vhū6J'9?#.6/8*W؏9[Yv\<1m)!ey9 1Gd)){c9qNn |rflsA[P=9"<1+ܘ.6R%N*0QkwkXeܬ،s`n=th5VNT*Kk5ډWԔMR>n3q`n?% XݐKuk[MFŰ{ Ž,XùnVO{ecYNRYwHv==@kzM~F1t(4dd]9|!d c:tgRj0k-rMM r?"m6^Hn-^Lk&d{SX݀)WV&Pt]+OGWKSHlc[\=܀~ ŋJ[&Kp<͂>"}G,ZU*t='WU]=O-=]}9kubF۹[E}eZ+J|\X G'FQޜfVK59q'o ^1:%GO"վac.,ob~]ɓtuUJjlX |}Xq'IJѹ lP| @EceM5jpIQKksY7({ OdQ}@y, G<+t)*m/&5"+^1l9-UIE5Z{ dm%rAÌ9I|+,g qBr_$< dkD,y#>C6Ðk2Pj Hc.֭'9T}ҕ<x`|:P8[( al7rƤl}@p,8Ág䶷2b8rbZ(Nr7)n>e]S{3ԻNm|lA9n,RiR2JU(G-X::KCSӵNK.xY_iJUhn6H,]&,wTfC]{_*u}*psRt}OMKS Dcy@<>| 9e٧pNU$| A l< ܏_9 Ña? 共2pkp&&9,Sef[oBcQy,Nʪ9JKfJ'uw 7En-gR;hW(bXwk]ϭ+>hRx]sj޵us,$}1;-GQUw|{]JKڄvGFtUF ɼ|!`ܭ {r vo2?y:z?sRmو9,]9w;\ʔgW9iZkku=mwS|GQIEN]_^KhIKҟwR]l. {n@/rE3}Ow`Gd/n.M2O}cY>=q<7*6R&9+x'yࣁnUqM_77t$uѕXR:FYZ^ ;;„J!.Q%rNJz *Zj:U]#̭STTo5璐pf\*n9'EIcٓy}9 ZoLzw4@,,  |c`iYIWd~nIn[|lŽǀ2N@~G[)OFr-StU= =UX}x}C+"ΧtTl@ P \$p/[` n ;-^x8=iK\ QgH/nX< ?'zoCQ: ?d߱u:'f7!Z=/^ѽ/| {l0?~@ ozzѨGiԺZi<˲6r>qCl(Sݠ6ɜUސ:IWzдWF?t^~oV_ 8䜖`y \ZW&elT^YlczӚ~=~Ue|ʹ)&&s&ۻ1r<uh:NSՕ)=ٜ*:r{a|؛Xqr~#l #`yG)F5{-zQP^ֲ5eBjC-jԕJM p9 "gS?aG G'nMR:pKca> (b3).J-c(G(-'J3&8L]^kuJHAv2QDZ8ck [,5vN}V>SMRuT`滕&o>81g p vkI}I>Gi{{vϘvS_QCj:]xnN-;pgR10I;O%/C.-'&]X/vQW*$23lG N ፖ#nJr~s[ፁHe$2(JDZ{1vBqܲ}bsb0]zwUOZ)Q9wIp8!_#-8f<ۋaBX$* p8 n[˵rp89a,;ߐ"ہ܀aGкξTSpUe6{WUk=NpWM=Ǒ \==<%l.8㐶D wqnmVJQilkً @/ a#aa@)rUKAԝ[~/5T^XJVT>]ޜSKR~U?OVzSo%<)qLlO#r?{%G!p F.NjfXJ`Ν9Tw~Vj4-N%QwE-]LcWZ R;ckrVJ&ُ _.86B7 ,rAOKituUb*4qr-l-p N[ {=ԺFpOnWW[}D:w|."e (dZ4,gp{!9({8? @~c*u%M-G'{(Mi:}J5U.GiieUZb~Y^֜9>re䜀gBiNf X'X7<2S.tk..+xpadb^2Ok! kr6C 0{ r/2#q6-XN_On`t\Җu =EiT׶7k^㑃(v}qXd/r[>dttso>!Ice:R~{+l?XB"1~K'8NPQrmpb{@*fĶ,F,UA7 p CCVy1^o#Bo2j<5F3q3g+&rf<`;J 8{ ;-)g lK Is>/qٙ/{3/دk^@xGFCBFPHEnsWWiڱ 7r< )w c.u#;L9o{"/ ,9e0{68?6܀oy#}ʁTuNk_kjy &x{ m;rNA<Bv "p@p -dO#vTR|]JUkJTEi29++l[r7E&Ð |}^;'8.ݗ.SS4uTdh/PU+R{u>c8H7l|-x'[CG?!-=[^ AygQT+Y5%RNoq SjM˵F# 6[{2n\vOXpXU%((;]E}TԳa)w2VLE  nW9KvߓCAKPӛ8"~Ð=ų,,-q9#mŇ8ܼ+Dr<P _p Ŋ_{X(;Q4'^WN>e{ot-L[jP~ɯ>u&_өzO}5V}l/2\Uٝ fviu(?M?sUm !R{zmSfN,~Ff%(r'4W_ l1?Ńܱh/$-p/U}Z#Y8,v(~C+%>G> 1dNLp-9/%J윓 ,12}%Im1b@$uzj:SqC|qq-@K|X~p˾'8Kl,r0m^T8+v|ۂXynoBM˾u4= #K΢ꖚkKqTJ3i;bx]΍_PNNqo~A Nl,;{MmA˷Ӌ`^ \m 9C \r N Ƭ!N0V& @38r(KbՈB6ܮV\Ky1-!6Rr/c0/%^\y@%]N(øW>Aӕz*5~2ǶM^X.,z]ACu:Z}Nio^u9P)%~Lv'$!~BYÀE]D-߀NThO9ʭݹaf^pBl F 9Z|,-)8p0[]B=Ҳ7j44j j^KCNoo{|ړxv[/.`(4y #pmc)ǵx[5Fn_n0`mY[EYŶK nP7ب1`1oA9ة]dN܅,{W&?`+&7)6ak-_ !pʜVr2ͷOb@AJ^~8Mngz]]K1XQP#xG ΕIRUi}||ӊ%thy1GOF~}I(j}E狰m첉aÑpOq ՄZrSI<3 @RrP8S}Ėܽo/6cy0Ӕc~]1פ5nFPN?>YuމCUOŭ6Mr9GۄiZvepqoKzJU%WuS.j_X^n,K99e0XGt^е>kKTeޯov|.RiGOM+JJmIvk0YS"M\^ &R(` MwI+wunK@zZ()>dz֍*{q|N][V%n_s検^QeVs[]p%Շn>8f6D\^b[نݷ7c`/e8(1yp?$|ݨ P94ؖ !~Gp[AFFּxVIٹ;^l!k`l" D[08#~G%6݁!y-p 4yrm}MdB\cd(l,<@ Xdc(o(dأR0[|p1x{~.E7-ˋ^!crICc]srg!-9@ t^RKMl6| GŬ?m) 9oE l2[GuNzJʔ `'9I'Ɏl7e$??r .[Ru[XFtubsSv=-s~n>2[Xs fʚ)Ncocu'Mqf ;p-BX`rP#6څnri! a2䰛D~M/>Q@ݏErݤVtRrfpD $ظ X_##\1r8*xpGqc(*-8@^@J,F#?XtT7gnL\BG6O]9j)QR5%mFO)K.O-߹5J7k^U)F#~B`<#RWtF%LuUtνGFXG5/vrcϰ>p6dVd|!| \ۥ-Frz>z)ԕ L.y.ػbYxG oqI/p9 nG6Sgn$j)olYTV4Ȝ2 តGӦKשM*o5{σ_&cے_ G{ TCvNGWMINU*d:<եJ{%f\p,7 _O]Xlإ\;zFtS*R|p /d9y&q1`zZMh.NOG?VzNo}7gqx'<_#q 9;{ sQWM:t#Br%',[y vH.A @FVLn'U:~Rkh>m-Uv2Vtvwd*vhm~|O7dslU@?J9r[d$mr\!n\r|jG7kkK'LJ\,%uO:L4sk&"}SRz)%E>%8tu _JjcQZzV7egJIUwBY|)0/v_l6[Z!|`@߁فmW\n>9G| 6_<U#FTVN;"50`, H I&ݏKi]- u3RQFݬqaq ,rm7:?=n|/r0VC~CNr8.E~UN*s8>lB-7T*Ռ8J]5f@qø9mv c8l|l"ϸ[OWSY*yӌ>nj^Lp 1o9&ENPo}| X^n,Ba $C -f ŷ~7`pLr7r8[n<@K `RkfGvɸ.=?-O$7j*w=7sa/uHU7WKKOUSOR4j~8ȿ_ 唅RdywUk-[q Op仰'''HG9)  `Ȱdn3|6@rXŲ< `r?#:}>m/ќ!9w_U)˹e_.^Gp=n^v6P7V?UZ0\ -p^ܝj:PL?wdCj}?ԝ-U89Ícd],7axd9 48"7Tm|Tn616{ #{ T$[0s=ʼn |y y!|d["s$);ocI+lBт+}u3K.)<ˇRHʣpX9۠zMQY١GNj!F' HTj#o Bl/eMvv˥kVk^nqb ^rXa!xlFP'NB[f,TLr2'- |&ϯW}>m~ p.V bq[ obr<vjԾ;o&/44~Nq` '"a:jWٞަ=#M_GW/Nq{-zYIEE70|J,#oZʪӍF{$xc䣑n.,>.<@yI0HXn[X9̑fRheݦ:mv0k*$V9r9"!.6&E]~E66ѦTQg_BzwDPj5!hQ>V*xDZ־wF+/^0D0Bg6x #-}Y[ϨӦ\kߒBZs Y r7#aR5b-WV/cӱ/W/v;:{Aj3{>@T{i}?GJ)n'Rr7);<{`fT,1,ON[EWUOҲNFN2F H-@mb$\[wbp^ x~F`^OOM6PQ9Wֽ/kժ|dg7oB_q)v7}AʜjFI]|ܝ#qnFܰ*\;5bpez{GVR{؅R?/! mfXK(JRlr,_X-v-eN(ֹGzOtzZ87JI~u%C[_QSK(> Blxd'wi:ƻGBtt3iH㔥RmL~G$p͂6NJqNpqoX`_.9~@ ak㑖 ]㧗Y)_kwJhToWO֫:')Iݶk R"+v7++G#=*}[qJ|W?];=VT}%z{q|*9X۪5JRSPVWѹk[{BvE[" %\s[2ʟlo}ȷ6ǁp[|"* ン=?Ԟ7Gw_5*}޳kO \:|5?ZRvܿ,/#XV_/$dA2][}StU"Z$WCit}a%kR;ɷ~@^v 4ܓ~;2ew;6U`˫u|1 MS(_BU6fWv<-NZӫSIݚ8 Cې 3JSj*S9ZH/SY^5NU$උ y![n8Nrk[+n`'J[C9+܀?%M IS=Hu*3!ܡ>Ko]VW_~p^ sap?~I00NvX1Pm,6؟6nki(Bnqƣ:eN1rYFX'${%!E%+KYd//ԮeS;%pB"m +0<ÀB䰓VR'ɤ/ /` ap\BMEhңNsvQ캭5]&Tkӕ:vqLG opnBJ3fʽYT`~^0y>z"O.sOut JӒ]͋2g }TizF|v<}.ASj+-D$ֹڴt_6^ڹjuu>Io:4^gHO *vWn~UJ:\.ۄ-0y xW2++p W5}>WSRk(9hR5#QVt}5)Rv|+jyؘ*ةG+?0핓}_8| 'm  el?pO `6:)jjQ8Fݳ&cl r[ $XFN2 ܈dث8ar_B]O^uZ4iWj BG? !֒ξ;qgaobX`9(-Ok]:StXwFǞ,{l^'r\6/U#@pa`09/8 p>r.ԫtL+ЗluXu^z}F'bSc,p9os)Ԕk12Ri[; [sq|< "0eo[ya1/rmSJ!9BJ/#} #}6{h=abϧK麎VBETJ/ʱ~X ;\<@%Jdz}3-FKW߃ɩ S-}su'sz%*PӎR)5ocZ[Bd|*PZiFP[NnD *Y{y2;ڊ=ҨҩӸB{+b r>@WvGVC--:SsH.{y98e/T(wq2}`*-?' ^H_Oc$!`/r6' Y*QpX:KHO5}|Q.G^&9GzkQiF?ToQ{Y5o_kx}K;>/9[qʅO7bK X'# G -tt麊jM| dXh rn0B])pe}MGR|b@6`np odnnh-<;e'Wihj*+WQْw%s>׵B]Ҕ2?5]]Wҩ'[N@2t8'@pGp9ew%wؾT:}hEqo,@Gl~L(<08v~K_uSv0wm bj74qض]$`q{9+_$ dbøT}ߟsJMvsک9} |px'!./Ŋ mي < `=̡' )En:Rs m佸D [euke.RIn]?OFx% N{==NtuUFH+2͒Q9 rK=G>ql;2Kwv{Z1h?2@r eJG}UtJ2thTL~܎܏- s:n a# ;7͇;4< 4m]nXz]yӥNҡMGv߹ _)^C#6r- aaepO#}آ7^᫂gdmlfՍ/%orr6 q*Cv7D1:5*߲.V[%`9'J}o+MEMF{$o|QGB5#UBV9ϵ,ꞝ=+OJ+G//ܖWGEg&ugZFn"G9tɪ$y UB|ƪu}fQT/أc>zLtQ)Tkkj/U:5(Dgc ;?.oـ3p8-#{p"r#< Ȱ r- c΄TEI7}% :=GօcX_<'`ʶ]FCW َJ FR$ryI|RZNRh:MhGA2Wi4cO?ɍ9CI[r=ɱG8brW r٧:N{'dٞG_C E9SgphIQ(v|,Z=6ҭ8vܭ]. l[?Ƚqɒ_Ӛizd8_NөiZ?MvKQm*qk-79;j:v5eNNF=Kz:N]/#p6ov.@7er<}=uFCfͬ<`X7| 8jBSJ溑qM9v?~_ܻvᑏAXXovG[O)ǹ|\,=YU3|l\nM-.HERyqae#:S|x0{$=_JЧ?.WZ4?qV͓/6fjj57eJ4:_N::LSسX@C7 x/BS]BPOYW*2(ӿڤkٟEzz{O =W뺏4TRMz>]Tb~ǘAkKnYԕI^mc{1ab48v5mǀ y[\46-¸&K{p?|8,pk"ܱy:Ii}nO؛4lpMX`ԣZZGӔc.3I^ȗYXs HU{>Z~j!BvdG'^Q +t~.>{d;fpRIy0%% ;#d[dӧ)<'ե*r|(N޽~ڕp2`gd]7W=4p%v\$䭄KAxpolU' YlNkXG?馲iIB5%.WJaVt֩s}^rtR*j(Gb2[8 r9=JX-=\|rog 'vE^@ 1.6zjpj{efc^l.0/T&ݍ/>Ԍ׼]~kKSӨTPJ}ՕYc'a)JYl99E''nFMvd dy ltE!#+#G ԕ9)AUT79>[5,/ \ by 娒}+GMeNGНMh`.4s&v;QBn"׹ r8IU7O)70~!Fl `xlo'gC]fU;>gy^7g)]\}·o 8&}7=IGӭR:ĻZ<~#:]L(Bf `pM wrExs:T|.ݮR]tc#k`s{`lrJ,;Sɋ)>@8WѥJrS9e&t+iOQGΗWv*5?}kaI% |8)?xؗ ,}NF]*H)q}ί3@66}y={paLo>ح3+*:Nkd; {|`-?-ٜ*J镌e''vsw7-Oa!E_,?",-խc= k:PRSϡPZmYZrӧ*lǶnFg~3d:Qrm/CjK\׻ XsMom+rF,^{k_X/b'^UWKZ5iMk{}]FJܥ'vsYœsq)KȽ\I~cv8[; F򱔩10>B-ŮZ $_kۓf,q)9a[؅De2vf/.`9`mc*} ʜ~rK咤TfjV-<}nUM}jpsiC<.c5LB}Oӏ-<(G`^3Q]~ :qFw{_SSdct4|\l?)ӕ;wŬ\` "$>-Iۀ1ap6ɋ6P;K[=R];:ucvv_^O|qRJoÌ":W(]?zۓԑQ2]Ss{ ^%eٕlŇm[zvjZK}*~6²nŶ B-I٬n.,E䛏`9*؃"{`8GIHX)rcsz]2N[BUj(ݏ]|JXx1= wdmj馣Uv 7,deģ$4VUɝ-*o,`#ٿQAzl?!my nLpܷv'anɞT;ь~MC8pr,d\;c--6.ù|pC-uԴtJQ 5:TU}6h?؈rV2 {yc~(İ1Bؠ *n]|{?`TKd L|K`/ 8٧=5xUgtKzu*?,-[WKV8Tli?;MX΃jUpO)4jwi8ƚ_N-D߲F @ ornl N蕅J79Q{='ml@K) jz qgn.jhZ{r}6V8BG qQk@ /rdk%`F9 x pw /mS/sK m o8U&yYyi^ mHMS}&m. orpaoqͮ6/n N;;-]9jw.-tcV:~M|ɦx&moq{3k7ݑd&T爫R[,(~A6snLZ:9PL<%| BQyD%}'i^JSIpeVj/>'6b6_ض# \/UKNbN{;7htR>VUtVsO*v[Խ3tN W9bgp'+e.σlꪵc{z-F֡NOk4kҍJ5B{'pl { %bowe-Mõy1*L j5i} &Vv%7scr=;|E^O )ԭ]+yޡR¯gD `_n}4}Q˫jBq_XF 9^72Jj5S{_ש#A^Y<ڔNn2]OcZr<6 1ss [JNO-yp e{r<9-v1͋gU'^!`oգNXԥ9/_]MZQs=Et']tzvɾ 9-p0oݞ])tG?[o~nyb^@g`( `+{@adJb!l(ԕ6$$sm|2n=ۙу5}4 ?G]w(|JR'+8`p=Ȱ;<Gv8*7Q΢Sqqvh5)RBzReyBϩu*ih} rwPrYM.dr؄[Qp܌mBe)KM!RE}F7\y.9pD>C->_wȷ \seB!bn'%Oyd(*kTYS]UkT7*s]řZ+IE4H'b=ʐv}1|s-Փ'6'p?#-_r^00̪B13ؒ_w92owtb 2^@rMKr?ɓTxF!`g/P~}q{pO%F.N&uh5 %cPᇸ|\v-XKizdG=Ӿ1Zw5jJ:*s& m\~_&e[cp$ߑ\_,OOۦU*J5ԛ');܁(-$PI^=oRu?XNtt4tQa{ Ivv_>? r7GeJ.rQK,}YƖl%32`- AcpOCliEvkv$v ؒF6A?7\7:hUj })=NNRu}>'SP[EGmds91?bnQq,#n.dI{`p]#"oAҩ(|jRU%96& Ak%ȿ9+9?;.ROIF+wsܦ#d^6Ay2jܮ?/2lJkOFNJ=YnLn}K?'uk?cpx [p< E ?gևת5U:_YQ<-96pػAkr^{p2%$Ůw 8R.WU;^8]<7 ֝8B]Vf/9`|xgܖ 77*U9f)=:=20uܾoVS:RNMfGaqk2~G%WHn}5C=}Jq,'8v=-_LϥRPXR~px r6b7 Zi^RG};u!e8=˶W< *j#I{uASi.9ȷ,gN4 pj{ bpk8V㑀،>zu.mm\h΢r.?S$e6 ZNG cp8{ ޏWGCS)Jv/XuZt:oJWT{#^VWB aO7^=dp<F|\~ŰPQac^I n<^v ܛX~H3d%ՄbS+cmaFJdLSYեEA;py+ puKܡgH+aq`-<Pd!_OȶpÛ[{9tߺ= _E26¬3+(rg6r~@e͐p>) .ׇcemUjҽZKf7)O]Ҵ:g(8'TTE-ݤrq|E_$__n,}яr{ġ(In~KFQJ?v _*ڊInV 仍82[xrE]E'ݚvſ1l7H^A`RbzeQϷO϶]̌//%`5aſ`P<x(jۑ ]p7/nS--hԧn+Uuw. ).FPGYU%6{[Z]7FGM_FK|-8>wfʏd7ir6ٳQV$;!/8k;-|Mbr  D?r6(Wd@xbq8L7C{P{pe+]K$ ݋:r+Mv s:U))EKf6kz]%-Uzvhn/7'eVp8-Ǒ{0,_ .m]5mk?6ԣSNӜ% ]zZz9s%~dFU&ݳzZ'NeKFt\ק(5y3HD"+9ߪ=Os~8mG'6UO9N^qp%f^%C@ q&pܨ={˹:nRInwAvKR=,ڌotQ .-;4/#_{o_Kw}4x=9;)uSCdd|p@*21j$pw5aң''~? `_gp,penC1r.L*!lK Һ7c}r!awcu(j/$m@a6]JCYj7RGն'8 c_R(N{bsէ*SpַL >.[i϶jKu*MNN Lx%[ G9`W_]= e/ןx #Ay'ܙ9/|\XF^@A _Lu%_RvorO75]7YgSPth=ߎ&*!nunKNj \dŌ?{ _fd _6 XZ'@ҩS'e.w<#ȷ~KbǸp{or 7C0 /X@L1~Fȩ^,ISt=_ӺZ]EJQj+ԯUԫ'97٨r>#69ڗBR_C+gv x{NKw@[ %9"  %&O;%rdx'2jDv2n!`?p7/O!SqS:5t*_MiˁZ&e{rVюaMv*?x@ U);,ۨ 즡el6B߰{BvC/a.,@mMTdt~Ӵt=J:Hy>c>Ȱ 9eu.Xۻ':QBtiTf/"2]Mnnjjjm+gU|4aSRM(Qt$>;Itijr~]Rtw4A'71l93T*JQ}`75u~ OkVu9JNBaX erC'+[0]; /a&Âd9C1+o[;8c\mrT81`N^쿀(`{Gv%EX{WZzWPEK{?ixQTj<9cm#Vqṃk{uZ05aT+$~h44jү F] *F)H׏$@[Ab}w_F^>n7ݾLy(,mѕjvY&Ez=FZt)XGд:}KONq%d*)q Z r$9)zƳV] WJzEMMyU+YlbAA? Cp0.ׂܛ ZM5+v_9_97i)R>~m{8%ua saG~@UK]_%]o9!1|Xs8٥r ,= bGKIX-%_nA p '/l#|u:ШS}ݿujK+mw@r96QTVŌΔTy(FY9 n7Dqqͅ>9lG-cf/p9ʲK:=\eU.RQ[$hetZw„b$'dwz~4uO( 'ﱛ)GO0!m"_|6C}ȷ2hՕ9' }֝^i?kuu:l{~Gp6X&K;;;` C 2(`qrG{2,dݗeRJB8G^㏒?%[uu碅(ַg'OnS(j|dyBJg%%}.QG#9GNQ-=xՃS>Η8R굟}NPJMȄÜ<[3RWwyp< GIG'J&c n,ȶAV0tT}(olK-ʭin=[ҾSO[GԜKO_ISĥcc,2.62zNJLtQڳ̣.tI6{oq{*WX .݌ӝzѧ O OMOԏ ϧk%ӭm;w+ۻ>ucY*ݽ<Ò&# X.Y>ޓ_j5F7m/ECsT +'e>Wuj-˟94clcpX %8@k[^ ]c,w? >Sܵ)rq{c5c9AMEߵu#ZFn׃cTU^Ҷ iԕ9^ {w@zON괺rN{Ec̚JM&1^`f#P sNuF}[GWgJǦV̠rX;Yw;z'L]S-3S]JX9T*}їk㱮yG}J뤺ƦZz n*Zz:ڐUek]\/!~@nGɹ ̒-0wEVYbPqvf;! ~߸ EnJ@k^CBÀlc"/ crn6p-,]"K^=?`leھ׹08  /  L+&eL45jF2PbϯUuWdHb{x5 298$y?!k!a`$7K%$9rl"`y-qlFu NOz޻eusNrm圜w1X&?--w7STV屪:*JV= 3&ٓ䩴-.B1M# @CU@݌JPri3P7l_i2vEucӺFGvsη we#wHoamX΄7/(0B.rQ^OSOS%ku8wX7k0K+_ R Fp<<83y&Iuc8lX#:}X1x2K궮\mp>.Sz{]=JM4uzS7 q{3^. ɕ:)/-+z>=% 5V=)wdl_!۟.<w|f0[48t6!MkΌj5uu.g)?hryG _=˱X!͑\(+4J2\UOIN^b1#+Eݘ7r۔Bq:rumma{x -fZ(V8稫*g)N5.2^ Ux*}Ez5Kt ɸԲ;;~Fx "{~r쌩GzG6OPUx&oSW.v,)9o{p#!OX~:nRx[ZWMTRVr_,N?sK]cQbBN.VmdycHdP.gk [`8eVU'ؾkTp8f.]һ܂΍)UyK eB]\~G;/N مv n1pݍXq(8.gLV_Օ((c{U(ͨ;%7({c'2c!n-Ukgcٶ ѩIEUѭ-X'2r29*rp=䱦M`9=j4'NvQGOڞ_i*ΔcgTzΧ5-Vu17r'cvGWOKE[F*;5id ^G;p-aؼ{ ,wt^_hs-#']=.ENk8-<7*yɜ+[zsYQi)v+ݗp>隹itJk##,F2S/cJǑ`_V㌑O$b.bgMǁy[ne)G;b#ҹJ]RRv69wutZUe-]V6veOb,oQ>aRrىm-^r0 ʹ7 rUkXng:u&(Mlre?M:ڕݵKYk)ҥ(O<2 rB!l y qtӧ: ݯsUԺ/4MֲrJ߱ /lk*%Qrf6' lmln9&n9lw9-~$IO^>=>));x:m]~QIdrC#^p9` 26Cd?&q(&-Ƚ[4 `pUnv< p @q*3vY[SFG5گ4DF<>(%(TvdldZ _䀿?_ ~nN7v/ X[ʝտӋK}7-#+ѧB Xu^9Gw ]$r_N2ݑ%fK=mcp CY,"J 0@2OّMF?\2R?^L!n;l^p9& dX!nNAG>/X7 sa >GTeu$ܝI)8wG{OHuXtNv7M5nN1|'~˳6p `"RryXl6o1| {3P@Umxv nMoGG֪*\!sǨӜW$;oKk*zjR'U]GA_A-E)S+3+hk*ׄZd{R|/cakP]H:viuTz+j*ʔ\ĭ{-p<#+l̛0dz~zrV FQ<\zZ=Dץ*s-.L2uaMF=ח?~ X2-8* #(Jʼn+Eܛ8l865t9BKiE֫RMO<5abW}7a[RJ^ZvTO*VKlL-S"a27%o,eO7' @\2mqoؼ)[Ƕ \D)Iqp e=5jV(Gy%k{XXyHRpX5,YCv9-쀶6a\G9NVHU*nV0'[J/eط61p ,`F:Vu4ݝ |3GZv0 x(cdXt%''1/&R\QϿ-b3Z}`B{znPZA?5z麟RI'Y pսbvGF]SB.G6|䜁 B~G#de1rD/:=U}Oзh*jܺm*}C`q!r,.^K9;gLy`|0 rŲ> kr>G96}:>QjKe3Χԩ)M~,ao~=g>N{CemlKI-M_ܾ8'8./#pXtu5)֓#B}*8{ֵd.M-&̷'yrm>.9[\pqU\]_ll?/U#\QQO_k4=50lj[+5MΤ.Y&TڍKw|ݬy% ,ɻMC/ylj{]O#ӖQQRJTG֛ |c}EڹWzΜ h,%_ أgf2. ebpKcD!1!F/+[䅍쌪 _q0 wWōE_Q4X@ y}kǒ; @Koc8 &uhZ,iANU-.>M d!%}E~zvuuR|nN_M5 o_9v MUQ=ݯfuu~ON-N6G o<=bs\p8ظl7+V'Ì J-֣SSqUiZ ߴpabr2u>G*$[#LB2ݓ{]?E/CZ)Ol"|97tNN7^Ƌł6uUt9Bv,rsm8/4}gWzzk+np7^|!p1qr_cNU/9.n8~@{Ԯf0g GE&#@,VOeՔΟlWsQ%ХE;Ż{~mb ~y.p= O#V%VO'E]L'IQe.o/޼1U_#fW AJ!Snǹ,MʓϸrKs`J8٧UW¥^Uur$l 8ܜ2]x,dҺ#w!y.YtA%_O`.8_H[d``@CT<0_ pX䠫m͔v}w%SSu8G{:mM%OR}HUYd .vfUT?((E XmE˺!G%An eC8 RzgA=VT]ZSQqqL/6`79 1pT@ R\mnrG;n%/ wݱ[W,{RLARm4I l ɺNTkjƩKN@!DVMI5jܚ ؅ې-[g芝 S.94;'ug*˦Q}^&UWQڬ|L|{0X,co8ZΝiw|s]ى``2y\?q#'7'#l,y!o1 aydxWrVݬBvz+uӿyyȲ7'Q">-N [8YI{Bውcx_BQTwG=A듄lRb eܯ`?F9B {@ۜ r,-#|@<=#wORЯ֕XvO~Q/ ،1rSZeoUԵ9Era(3cT vȷ9$<LlK7".EG8pWOka X&ATr0GȆXV a-}ܯ)\2zlS_'zWLTcN?^~'|qv ݋X/ [;E0siky\Np]&./<@ ߥJܪɢoNQݖI88;IY 0ҹTRm΢PW~ȓ(6B ɲsga2^ք&M*ښHT*nu$Gj4Ի`叓*TxMXt9.ȟ,{Vaۂŀ_ޮcQ¿1?! Ls-OE{ JtU#S~ڙj3Qsw9G#`,9p?qa@ZD"̬nq Žlqoqa.{ YBVؾA6+%|XqiBd bn]7.Iqa8/X-G^Z]Ȗ{#qm8r/p^p>H7x7]w/orTjSn*^? |@{  G%٧c Sc QIX ٦ϩ]m TT>>3'7)6Y8+r en'7)]3`d\ʝ)֚89NN$*S)8T:,g}Y[+!J5Q kK|HLIE8abN2Lb 09y X{ob\fÂp8.H ݓC.\,p> {1l3-aT5'JJw{SIY#o`&2%NML{Z:ҌJP02ZqyFuu9M_YA6-HM q<CIl p'*Z}JPVrvݯ]nÀ G 9 ,/vh׌(9(.555gbr_~Ko@`pXuc)Ũk y=56}Z]Z~]QνYN^g.- Vf>Ư}]&5*w}+?g*u"84VJõ[! %db;䨖M[<*ԕ;Z hi۟=7[w/\zޜ괺7Szhj{/h]u~:=1<.Av>euzХZTj+OZ~TԛQ|_:/S8NPy /dgoI~>*QZϷ8GT)٢F/./?ȾVZ7N=vrrvD% ol{%Y*N {vWe[wv&Y6*@o{RFOV\[[#k4u 3}lX#-k9s?#-2}VMlBl,7|E9`8Cn>aq-nj׺NSi]fG~HpW9+r-| NE`ݰv1"\b*}aɲU)BJ?[k\~GF_R,9_bp^ A9&{3rŨtu9Rj VK~E8|`~ 9` M7XjTyvU/cSNuZ 6'x6Q:3z%Sw4I$7_'68*WN4н@YJ\9 ar3R3*> "y?n> fʧj F[}!Xe$h6P: M, ٫[gV4{=oRy-D)UGQ{-o Y؞Kb (8}v2- pca6w&n_,M @ oyHpn#ace:)FQ9EK .Mwm?Eɤ88KG.++r"rT@}̩(JU͉QG>ܢ%z]C.(iakJ7?H>zomhFR_?*RU(kQ*nN6TC)躝 si~Pm'~3Yj3wVNR9['pEќnv=u~ -)rKMoDןeM;|^ʔe8K(k\/"xxY3Ft"VobƤDGd+VV8/e:nc^:luIJ4GT>]5_c+οhk>O*WZ'GRtzTPW8+֝zIJNXDl,߹b۩z>i}:ZW8Ðfgg)6$kJ)ɭ Eqf9(+wbl$qၸ#gy/(("Wgz~tL: +M竸}Y}4oC@{ @fqy.!_{|pXQw^K)9+/\V`9aC(˵8rUcJWM]/{nxRV5(Kd[?Nֽ> kD;E>6_$`B=Q}ZHznQ.1rz}-XI4ce*R {_sнctej{|oX[QTh7<oa}zIRhU!gΜMҏl5mFR*ݫvYlth5S)iYN|sjz֭5]ڬyRos]WTn bNL\vVrujeWG'FgZ?W_iOFijO)%\y=khznNS9GŊ͐\]6p,>V;>:=zңu#kVY IJ=N˂)Y-_ v")8 |R%R09"A%-8ߺVF<(u-z}5n:]UJ*qrٚ<+ð6ܸ#_ }TnuD}Xg&x^G[oro ku]&:tW/,|l7[;G(-7!om6 p8sW7^"I)4\KJװ"@p9V=7A~[U})v)K~!A ʷ>њ_A^}b#ShwM/)iiuTJQE 8G ;]/cm Qt1|zz2V4/svACWFTGx//`ln@8/-)9~ |Yz}/뺭 մt~(+)XAӛУ%d}gV=oti{[p|-O#_>cbo7S5񡥚sKjڭFXwW>i$'fc/;,J. X裫Nь䢸αtT#CEOO:pP[<qc%6iʅER푄&'GMSAԢ9#oZuР ;k{nn  i l^sS=&:M-|?'zE{s"TֿCu9գ*U܏"&[C vQG$)TY7qHPbTn.Z%jѩ+^2_rjͻ9 Ű0G <09x07Y &@0.[@h| . p X;[ ; Xo9!vldy O 689/u|#΅EJfv&zOZUTN p]]ޑ:ʅ)ڍhFth/3̌\N=9ne:%9v|}tDZk8.ݣ{IZj4:u-4õ;C ]A>q"҈ܜ{ "/eJM8sɚ./pzz*t}5hrUmd{D{{ d|1F&jJHNF]fOuj2ruޟK*z:j!e8wO+"Ssۻ'X#-s UON@p7zco͉S;`-bQYrvFU)J+ C(X]Lګ1_ 8%@p\ JsXO'\މGM}-LRڣo|']{D>7Fl{g vcr2/XW#!kn.<=`p<| ][F35R_HpEʗKש=N8,Qh>[Fu4*Tpէ*sq[`, * .y0 ΍iQM.FnQu5gZo;7` gxHsYXl,P=S-:jM.ߒҺZHUQN-|ܿ{B9Քe%=1N#Y7zλћ*w/ nYv+l_wǀ ̀ࠅ1k$@70 {ӌlkP?#-MKWq{3dՔ;%9vlѽx1_"mY~$~p~Ûaǰacv*GQ7 m+JO:â꿡%ѿ7NQ # "' ˂n8((I8.|@m*^, p1q̤ӗڬ!2p2p`CGn>@ !89MF9ocv:uo;'oš%.p`ȱISBu*IF1\t_Hս>ӨK+wa]<n9-7 s,ZK*q%O62<٘v = X3*stf'''w76 SfLG-"סWO7 $MʚI$#U#۶WU@ r-&p-?onu(Bσޝ2*jt!Tȵ7s]W .e;299nM0'r1$oq@Y,y7)4K]hHU&-U?΅*ЎU?9%JW>/1X6ͺrVFYˁ6ҡ*n-$5bl^>B+rA+aܜ-}7}W/NҬYK|lx[_j8r98x'%}y l@[QsgNTiE|[lǐyy=?wQiU>2TZ9IѿݽtmPsWv56y9xnBѨڝV}=>1[w<!K(bG>gJ]4kNME^b҄l9y ?#q|@A׵MB:rrNm]-gr}@řl..z=:Fi5ɗZ$QGhb!9-x[,[pN@#(=![cce9:qvK*5[,rOEF^ϳ \Qw[ 8s) `662o5! *;M]z3+Z^N7ؚ3MR)UmvJr~BrP@Vl[tQrp[CuiJ; gQke}Ei~w99'8v,#6ȎpJ;E ќ2{\.7xHBL$I˹ay .[F1wc? _? {dp 8re 3r\r1رn2oUԮSw0"- pl֩8Gtͺ~V*黳QOcܘGd(XCw  s\7&Kk+p<_M__ʝIR,٭Wuu%Rݚ6oJ$+JooXfUj}Fv\%C,b+] ǶVAzo_Guj:S9_SO54zM;e)M%ϤlM-d[ c}=-ZgV1!5{<p%H-EO"Z tUjSw;vľEĕ6ܶf J]UZ߮nHYܜ~HeJ sQ&f]׹5b༗#~JOH_ r X?93qm1  ةpg*N1`>leNӒwQQH].-aY# wE[Z윣uwI`<(ѝiWHc)$,iqp6p^k.-^1p_$bHѼ{X9T e n[ A Y?a;{ ķ/A'p^[ 3NSj)ʜLU-_ܴʤa'%4No@0 JMpUS-; K Bl7 [9=UZ7&+&O#X)*^K2tFOE  _%J N1v[c />I)R8/϶>Кӵqk0[u WgL9v۽flRRr5~~BQ68D_#ʛArr#+F+\v<ŀ-Ǒ'6Jtf⪮'r|~E"ܤ7w,{-?7܃Iq cp#$< `7pOql ŋBcnO-MxQME iʜfj`p^^{8ŀ)e(Ydm7bV=ڝ;u+ђ.N2^G_ M;B ۑf<v|X%]nwbrA~ K^# nIJm}9y;4=+WSORd{!*rqi]?%U%D{_#;%MFR*hwgG5=3Ye>?$2{b;Xn܀C&&c7}Ot*ty|!_N:COUcQwvGOrpUgw4j:=5j_|T7aI~zjB]l,$SEӺ=Fէ&Y^5џM}KG{:MjQ*JfxRb ~KѭUh[5:z1­:є?9 {3mz+ƚ8j*}.Lw/ll`e_PN}AӴc*& SmzOɍ]ٷMїlju5<"9RtZ,׾LҝD"lpb,=6ZF=}Ɖc , /n\zɐO`s  M8\UJПt} Tsn&ѝ[G;2hWb݉l5%8E2X-̦Ĝ| IŊ,.H/#tPU& rG,/6+ ɜc&1%Pwy0*[{ |q F6&ȫc([8#AŒ Il5'%|G\c-r@z=k:iAJPs^֕9J8hP9/_d]7we{G1V#qEǀ"ʜ{fvw '%c*VRwn?dȼNȗdwŀޓJmu('Ewc-(tKAVԫvS_ױXD,nF|)*ɖU'<96G&LF1`6we sYӔMy&G fօ(ۺN;D5_CQ*r%sisbpzku^TtnN '/Qts[t-^գ ,*;|Uϩ ں'VNV9 9 $lyeNV[$&/0<9 l"osdS?5K 8J E& ȭ[g? J8q FJ< vB}bp㌑xi|x)-v}|<~YWLFn)WRܪ_$*ң j\~駥F?EBVG^~ODы24L\|cz5:涧KOu4]>O7}lpMm :jiiՕEh[[vtӋsk$ m7{lg,!:R7>Me3U)?>N*/wc ?!r<ݑy3־ 9.|V6٧ B-cSVZg:=8ߓ+﹍ Dx#l X[ W2Y:_ Mɶٝ:ҧ F65FN?PCKWOMʶV5j4hb޻O2Z QVu IE}n̜ɲiOn=ʐs^?%qwMmtYR d ׂA;{ [ܤl,?~K6 l9C{ʤ@߸N1wpr=˸l3`8,-q7e~nQ;Gر)<8ـ@_dGQ:p`զjݍ* eb[!/܌|\0Xγ)}9>u=jʓ,`m.֪ij!TQO_[Ν8=FqMN./(;,w&6ob;۔NKr$/vd ]nFRrVn.Fu&'vJTl` p_\|8,lb`l- ^~Kܕ{37W_իFtžh+tm]6=)˵r83TҖC-U.GOJ6m`qS/p 4*ӳ}?f|I:r[-/R%.^'sIi:~Q=]*snRSy%6=:U%BgM.է^RNS{fT#Sܢ5=D姃64E+3}zN>,z|`3qk^IoN=T%4 EHT)A4K%о?_^ALi쳽~Wm WPsWM |"ۍFQkY=ue=/Ѕyg+{r;] djQ/\NQqcF8YCTMxҌ]Hfttѯ%O#quѧ=D\^Q\e.:}*:eX7d;uUA8=j5p7_lzZ³/--:2;r9 qےn-V/%^A!)lf-oc\`JnM\m9VtsB\ԶW4< LX Fb=$/!;@[sS(RkD'E5ԟ =A?!!lVײ`p-p-ay"S*!=%}%O*S24n<v}=%M}OE.7NN7g6ȃ.9-?[$07eX6iʵE+UKOB:]9Ź>6Rَ(c6YE8`I企{!ȶF Xk`#|dȸȽa`AWX {P6BQic{\6#Yn7rvy-NG?$ c.ܻ"r<v TO3D)IbNwE+BfNYo&<Q[؅qw.c*j}$o?~IKH6.rO\8l`Ň9-@(+_˷F&ZZMGrzεG9~Ybcp_.]߱Ϥ#kPչYK\Z,dm6 nj• rRnьVYj}oRRV9ٕ~G(S~<XcqPJ?҇ꕮs:^Qt~Ǔyyd\)8q ;d lRÑx^C r[]5>A-FaIPJwuo7#G#-8&qDxellTg*nJ/b漒/%QW%ԕ=J oy@/X{mGoȾ@ 夆ќFg_ө*wT`^LǑ?yy2ݕ`[ې@>G{7 YٕFx\A#qB:tRSrVMi~ߑᏁYOKi;vŎ>M=KOCW*6/|݌䅷%KIZ9ԧNRSKʶBur59]|./K4}Ã<7 LMFe޳# .݈rd~^8<-2`qeT[b`=I~dor~G-?{dt8 Μ#*rni5ǹ@X|.*Me/#gyȔ<3V57H)NE')<$.qORr[G-}?Q %7$rlmdpTT͔8ӽ#ΗڊJwޱT8NrL;a-1sv[F-or,E,]QMK_h=KznMlVGwZLus/!;;ΤIw'Ȇ{? ` (/䃁J_ȳ / rT#mAoSr2[9sjJ+d&b"2IE}eJk'X?8,w&r9 ݣ8j!*n>Z]:/Ԟc~E9:4w[\V1p1#c)w+34^T4g rcq8MJ;su&)]$e82ĮQ.^I2؋q{/|mBuUH%w ہl\IQzm-3c+٘<=Ňo+{l<7'%CT̪O0(NSRuvoQ -OM髧?&p9v,\Z n %G- !x%o]/ WR-$# vjӥ)O)HQox2}aCr<bd[ ے!*JfYuG\X=׻H+[ܤ/ JWQ$[7-OɔTܡ|6N@@ʓeyǺ$QsߺςqA8<)5h<\~E&s%NPI߹&Ȱ[ɩGr_sHO%>|[k7e[ѥ*Ӎ:jGoU8['%tQ߆F 8lNr]*[*c1EM-MeeJN.ƺpk4yk•8Nn%uJu>B4R/ga@hk:q \9Y`;&^nPv Mc {Tkbr[cQLsrܾ6AbeʭO>Լw08 |F jNF+wKdwzӽYQzzS[֔#\xvd.A: 8c&ۻy&Ed$0ln#ǐՋr5`9勎p,L_%!<ڨEɪķG9';/Rkb]oŏ)#?ӻ R XSlЌ^$-/}/$``$ _`q8/bq 7XJ..V]3O*TZe-$!$2JWwv7/c H7#ɕN0l`r@p8 uٱn"r!$*2틦ۖoSnΟиSB.G6|UgMcȷ Eۍ!M4ja U*nV}d}zI3;eos X At}7u:٭R((5'bnnJwli p9grӗd٨OQSf̔[Wɹ[n! lnRqin8-bX I|%}Bٖ1rv\TJ_" r\ڊZƊ9؈^EX,||w ǀ^Ih[pB6S˱lgg4)RV91r#l \5!l~,-ة\=M-.]m%Y[=ާBU*z9(|^!l`[w'2[{vJ~ԋo7>GC.Yi]3WitQ&g:>jCk _$#7(ry k fO|[*7UEi(T}F O(U~MLFw#ck5 3MFSNRwl۱9>?[*W؟ၰn_K! R)ɳA ;`#A| {!nUcR1a GwNjz|M-iQ]'Rl?#[¯ӌÐ!A J..́Xsqv9 ^Qc.֚6juUuSR>ZƝYVGWqU ܮ\T$J8dݛi}%9(^=~vYD~A7٣"頿qM쌻lXL2 /8#1nŇ[Gπvۧ׺:zԝsuR]Y^7#}9/`s"`lypXt*-E*V0~o?Ez?ju/S*jR~*Qq -`?vlQѫx~qZ٩++A/y.6=k)iiWuaݭc9&m-B?À |a2e~[ X81eEI#|q6ܻ,09'7@ `bm)9nm{}FPF}'SM; G,=`g'%GujS]b.RWM3t:RSXhQQLvj87Ww:T>ܾ{\mOByӏsD_l%w[j+Ύ?t~ƧjݔڗUQ\MRV,FX [;ƃIOK %ny_N隮URu&HNT5fPvW!FWlJ>D,e(M I÷gr`lK<'DЍU|#Cct/Nӵ3jKSJԏ1nx] BR&-8 `X JRj#-%M.;c* _d_&8of^G (p<ҴEOMk GOOR3/ w秬55]+O*J풇yG+,nKyc'B2RY H̸apbc䃀.e{RrwdxE?%; !Hȱ~sǰ[v؍{`s{gyṊo~ mF)NR8'ƗO n8y2'wDm[9ɶJ(J9qy&Dcvc}.}dDņ`^뢨v G,_^/n r96Qed,)7'#tr1o;8 s}7 onW2Uv.M{Q9yyQr...q#xD Zĵ@ %`r^"?,X5t):aȾ~Aӡia)Y)WO/l6a,vE |קM$iTV}}3ZnЎ:}=_QQtu~_ޟQ湄G&#,dN'+5gb.+vwD[8`/#| 7v9,]a˛-qf!| '|MmWmip9y-P 1VA ;84b,7w5cOSԔ?DZ}sKRS~ yD>?60-?an_O麾VT*VWszJ%f q|<4҄k.t~7htzyVsV[ >  ^~蛁QO}KJq~K围B.һ>ҥMUni#絚Fj*ʭI;K-͇l^ki;,U p(a[1$wyd{GSNiI9˥ %}8!Wᑫn6'LIj:u J1{J0̩IM5f]tz:z.*rr5:5WL6vئpJ45kIݚ +tZ]wVC_]ilꞛJTvVNx*%̢stOWKI웱+]M6=)J7G 9(:cSI-JqPyϷI=ۓmAW_&B%xvoeM5ZtRPj~9%7[rLڭd]0S':OM]SGW|;aTSS9itoqk7Xy d0?F.>@cdhPsQn+v7i­FW&+2X+,t]jyI8S1vjwuUE&-łKr_؅q%qPDcoŌ;ᴃW;KtSڭG@ ':QCUR\_::zQ+FqG4&rD x/7Fdgܭw`po'TXN]ъMo'%qI~bsm M]4M\99;\n/.Z\)CJrI;OU5t %*]JlOİr@!^ǥzOKMJ+w;Zt Oゔク%nܼX(BRx_*NͫŐ?RCu`9xO[&&ȟ( #.֕lmHIGq`2㌎K8({|Yv=-OFTuέ)B?yG[HQ _;_cr_Jу埥_O a=]>ʿI82;T4m_WKU%Nk>SQV/?N]^OK"%`=U$^ ~9oWѫJӜݯW:դ9ej| N@*!2-䢤^̉`*}CRCOԞ4JcYENHЉ.@ ӃtƬF\qc׀w7l@FP :tn=U :Wja]NԢns_PNW/~h2w[:eZnU%y3^r.ʲK| n%J dnSHj:e]}:wҒ~NYBqx kXl!| LpUvz}Yu:ZfjiAֵz]gQ[IZzrwPOc|6E8ہXQwR;wLr>;<.|-/^o,GݤUUteJkiA٣ժj*g)\k#ܜ;)4rE)-nBSV&ʮtc8M]d*NNi5ǹEv<1ɶTaƒ7ˌsk a%Y(dbq[E=NWFho'7<#/|ޞAVh?Q][SmW6)iktOW&*wYEkjR)KFчeW< eKԏmGfQ:y9AmxM>dK{v:t]?UZj3]^4'a\[bx/9`7-쌩V*pvJSnQ>5|c+4fyD#Qi+v3 oI}>f]ILB1ji0 ;Y(hhάضFUJ EL޵tcZq<. _t_j+굪h/t~xQvdc@{?q݌_KȾOFEtq^vO^i}=OOTJ4b#d1svJJg?K_䛗Jj:4 =>:bTftu.,GȱI{`q.2brYW[=qa@哂./aqr_UUEҍI(;w!)V'­j]+_I 7 9] >೜y[9͔+JX/)WiY^U5hNr-Xrx%Hp?"Ph .ەCrZzi9A'?\zƑ!FWeyA?(c8X|/b9]w$n)֌C)>SRJ(vGf rD<0UbKbΕIӚR.jSMD(t?WWNӱj:zwMzO4fqurNRO1Ez>ڋgcw]?V?LRG@Cbǵ,#MA]Ӻu}+jtxB<9\ef ZGmjʌljNr!Rj+vvuN5OWOR `7E /֣RԄT8osCܱlJV*eY1OyJtoclOp?r2Aq~Lu%vw~nqY;6r$[dS!Z9 Pw_.8ʗgzo۱lŰ8/')5gZpk٘sq9Ҕ!+ZF n?%dͰ9K[%ޱֺe->Nbķ>I8=SIOQ3Nq\S:kF5aحȷ[?ciR7!JX\87]pvj{^3RV4#b->[7f-}# nTx2'v`6!sLIoT+v.JG=IBO]>Kfz}#^-)Բ͖?R~TNK+`tNrku }mU^rvV9^À}+G6 w>Ҟ(*U x;gE3 m vTcAF]ͱ3s8Ԕ?KZudRrfr{(MEڙﰰd/kJ`8űKcWC ^F@6y#Ywl 6+;nb9-mn{TWfo]|ZfQ | 1%mq\0KquJۧACԧi1 R ;Kl7Pa[uNpqsk<ʲ7ڛ%#gjW=%!d${p)^\Kr8 8/` {ǀ Z)65U&caXyX!nҨkCQ>JIJ^/YNLjh5-%T| &( ,b݂r<|./6wRTmkcy%sFzGK:k\'aеU]M|9fTmbNn3 -ymӛI٬mRrlnT+M4 !\rr.9QqEw,#4ۮNyBx֏p8-;݀9ܿR(9lcb~AorgMEdW=+KdujIٵ<+tӕ]^֚puP.avvEKK[SRT)1oAp~GV7QsY?_gNkuj'/ԞjTMws䀠@[-%! -8 V09/ÁɓQ1(%oL.ZUUҏM;t*iS~$0Q?tM% gRGU[Q)ڍޤ.]-jq4y8cXcg[{yɲnEEC#|l[g p,<2qk60,VYF*)db"&ReVSqR&zL5ZUҿcZ_s6Fc>NmHAF\\wZ!@|"fU9vwpb8-gt}IPz9i-y]KzU5gVN!UZnӋejj:d)eVCYr>FpTIaWSQVU*˺Ok9X_%-f<`jA퍛p,8o!" ld_Lʎ qpk}}iUUIҾZ55uI_)Fg_RHNTkųX4u=NRMT;b4K 8+d0NKs^KL+3?_OQNHR;v;]#n[IJt5Ƿf+ԤSWo5U֨M?l&w9 G5eNOd~G%""_n)9s9e #b& }/JQ/ԏb=ѿi>UmMYTg AbGk1q pʰ @E%%5;j+KQYԝ | dr%o`9T}I~t2 F2'xUʍIBJҋ@/p+|!C8?l8b,J#~I/8/yFF;"{K"8n@)mGҵuzTu0_a߹$bgUӸXw.cH rdK9W;}>8*ȷx7hOGxF2tMfZDJ1Uvn7@rYZ7r>rd?:b~=UrtJ7ΧMM= X΍iК)2[J$R]w1) CnSfQSOQN]_]YTs9&Bv>}@Ac:59x&zUM]WRN_ @-qkN<i7M4WiZX`,1]̟P)90@[{6Bٻ;nTKG)j:mmDtN式5/8.#_F-y|Gԫ](A=ڞMR+ܮx<=N5g-<ҋ69Q-ӱdw"ۄ9)7/ "mӍ9MO p alہ$z]ZZjKO]5%cV~u^U$$cG]g-<su]~UUS|89-[SpOl_p8فg*3TFɯXldygf4婅~Ҵ2:)('}BWh~cQAHuKa6P6l:WV --?dF׷'O_coOUwo7cll?ÀR]- ;9%̮%ʾՂywɔRSq^~Ia< X_ Ð8n1aAx-MAڿfnXzةOR/(de~lP䘱y&̣]<\'dq2OԌٳW=ߥNG[RimM^.*Pkom7)TxHū?m$@tQUSp5I;E@,JdSOV8tKf5l_&ʮ썝kņ܏X(Ba?oؾG"ÍllG!ZH <1s*pK{=/t%kBKmsncط\moulI Ÿ,mleZ0Rэ8`~HlOYt LrUttIHzIIݲƤomW =?&q'"-H"܂,EWfU%+G+vݤ%u}7}GIZe(˵Z2nx}S:iUUI>Yɐ/$[\Al-8[<7VSnwRZ?*B:>lcftTv/k^ǀf(csK~GX|R;4} G+{3&V7 *]1l 9.y-fe:2\a$ԲLqt#'kp-'o{^~PϲssםThU݋o|N xfU%N_ܲQըv?(ίVw&Ly| a%l{vIvLK#W_ 31qpyDI^\%I.$|6sy'×l5pF9E' p^c(sO $]ϣ?;%l{X X픢x}Q\^w#@2-v@BN@~n@7!#-а'[x8+M.H,DP8ŭ$v~K `p#/ l< \1ob.;O_RZT9w?79B`y}.۲#q[ Ina{}=-6[ը֫J=úot.׹67/Ȼ&Gp<>.2Q=?]Khti;WW>~IT=;~@gu?# [F?ep$5 ,|mov2ObۖY9{}GRNSehAvl/\ʯgg~d oGɔ]g^5ZJzj:{~Á ɫP8l-epSGKLT׬O~sJj`p=&}&=NK2]M1)7*;ZmYCY>3+]t>ӴԪtD~v%>{OIRՂ]&6p@g r[\|Gam o{/s( { mOץ9Q&-68w+7m<+a+vy3[1es627{?H*Ε8ʅ5cZm{|(&l*_V?Ym}%R_K5]&BBIȰE'%_!︰4!ȶw{F-$N̲T[/)(-<j7QE}Ž8k1WGдM(?-GM*1OԔ}=OQ4x=KWnhRB;DIRرY"sS()+}^ҿ^Ӡq׶oOCOFBvTq0cJJ­i}ӓlbZd zNzjuiQj]xҽ&tg(wF~ r?`@< `BmlCrV3IսV\0Ae{L|;ȶ) 85ɻH8%D zK O .[^[}5l<18.$s֧U..OJ]ow'2>m*ǵjg^jm*iIԋxv5'`>]학(E|\nWmů$\ 1Ȕ\R1J6Mң9+{N8 }Au ХG*6{sQOx0++sɶAՃz(lGܡn2&Ž9qle?j}LiRo{Vi#"O9E ml?ܱm$mFPI/$vwɟӓjI`ȲYa|)*ӌ *[kn! $Eq _ lt)cN6W|QKVprѭ g֛}<puk #BOnϭt_SK^P̀K܉;~0629Y$ 2Te~B.'6(Ug,nNԩs]E9(;ĜKJopy"M;^~ {G ~6>@ΕIR'VUn݈$N¸r\~arGBQ:y5)ՔT{b1~ͅ6uUU*9heQB T%db1e[tqd >JB6P֍8y;dYJN^w*uqOON]}8,F, 砺Q᪩ ; X<ܖre'ubҧ*"/dISei+5&phrX{5aqʸe؟.B5,[ò |ol6S4>z;]ʬcƾO=>S:5(J<4q4ANLt:RTfc?vzmDV w-k/7&dyvKϷз,_kNQ^L?q~G$伛)R)c ]=5T%{]F:qJyg\-9ܖ|y!?J/\M{S*k^ r}9 $,/8*DԢr]abق0N@-<<_jz}+r]Ҕ"~]#[-6=q,܃ N.#+N)+ۿ4YE+;܄R+Kc^d $cl`{JhOKWܫ/?H.^ gpbNC@1m;&l r08Fr=ǐ<nL\?d8-nOJyyX NJ,`n8%Vlx!W)-%ld9݆8x/ȓov!b-{5ʾקF*Z<fZL(/qp91hn qeS7 s9֩;wɅ#qp7`&enx&K͐_~[Q +}g[>r*O.?SEʎR} ~*Tt/c㜙6ߋ3}m_ҧ^+sK]SQIz]~5M:0mT1q h(Ԕ;^ d Mʍ5c} ^NZ^*W>TGX^59~y|`=0`V| K y2NSKvd79rU( bˑr$)V)^_%Jܧ'&]sɽikJ'4Zd8،|0*8'nw0`VU͍}(FNQ}ٱ%eGVʔT)Ji߃Z%^B#ٔخ-n`퀶+Vゆ-dEtdr$-@X qwF4eZj0M7k4'jNP܎K{ 6=ʔ%>>Ik~  YB=ҵw&UЕZ4\ӌp]y;dYMMbg:XҎh[({:Z(Q힦 /cg( #Z:Y {" y2omaohX$8`m$HݤExNv>~AQT*xjݭ>|hk*ДR93gW:ޯQKYVp knctb_༖Lj tbΧښF#2d'}%Ӵ=CFRPwn|O4:gGj{~y<$411>]|#?#|.兛Vc`th(RjӭUQ'iMMet+NkElOqV/WS}M%YRN[_]mMYT-'sqa`9ÂGyy/-dz'\enO!WJ>MNJ@<FdE.伐91:zJu#Oc+˸Q orXf,. !8tdF8c@Qqx`y"n> ' q܆Osj6 ة^njt:Zz2JuisR<"+sS%RQحg d~B9_`!@2Mz_Eh%^zqlr[&ti5(K_Uթ)q||jݳ]_D֪R9սWԺ_Q/lNt䠧V s?PCսRjzjJ\Z796ܲf);x'-Za_؃|k#_&PޔkK+ǪU+~w}}JzXRr}|# eRbvr6?q8FJvLݬ02,_ۥU^EsvI-Ku>Fu:iFYI;%}$| X"ذk6}}өN-99}-{VR7>JK{@,)dB*WfʺjF%5l]ܾI@q/x*~ U9V]Mw/swVFc4 M*jҒVOao["¹iY'°v[cIӽfO֢3?Dޠ7M95]9|u=L5:ʵiҍ(WQ:}V}^Uj-c]HI?c7п{Ƭ_6ƄpjNnduUtsSԝbSQ})ѕF>lUou%MFn͹:ttkꪪjr9miNtJb%FP'b d' 83(Gwc8,.[ۿ˪d4*}!k#SI}>p_wxŌBXxaoؒJ'";~Ka|lpV@gb %[1b7*̕ϳNe%[Y8FQ>kE]OT_YTھY1aw"aa /ߧ}u"w}'wrY%?p^HX 8FZ:4+ӄ!np;6[ |g8M{lnijFSQQ\oS麎UʑyW8*=΅ht.525iTrQQOkrOk[[G/ZZj*WMƚk2T/%G?oܜdlX8id#8p #gwX,?#a48@,킏b͕55*~MO,${I7%˳&ب˲V%oLpn4cG.uox# /"%@K'9%d$ؼX|=/ZGY2,f8l4ۃ Gv@6+_r_  0 ,VC(QwN9]Aa~ B[ق.R<9#kypX{Τ7r\q<Ԍ$a!:WUF)яlpr,;!{?#Wi`A Ϊdoڮ H/%*-Muz=Z4*Ӥ9F7Q9\Zvx`oDmGQ' &n/ORuN:-2|.~O#.^ Xo㑲c_Ԇ/LeC` ۑqmq%FRqrfݼr2/r^``B,-q *NoɎp5[tenI2Vt͢T缮"Q8`϶~@ hv6$ P&ۆTl)p%xf$2+vʕYQ98hTg)ݳ[p,qB'A3b[l< | K`> X` H+8؜mb?l?`MzjucطitZ:MO׍k3 }pP[38R0qܷIa{=/qY(=8離T7.'< @  [, B 9 pOCt_T٣:Y}cNAjeGSNtJd-m< *]`(J1}εk5?SGK.<ۂ-YA/|1v2^l}7Go4JJ6GT}pa[dr wd9#/><p@9ed=~OVН(M)*9`Ānb-)\ʽUR}F d{1Z*t(U4.9[ IYcVTdεݕ$O01fX_-VʺUc+Z cRtXPObfdH+{;iTǦNZ28K x3uoOW*tM.N Wf)R66ܻw+J׹9 (r8q* 8p2ZЍi~G ۓf;~J?'WMZ0\kS*%f8 x ~F?"GCw n7[2|/gmsE]kCL$Hi=#FmEvO]qd X"p e8/+%*3'(,Gp;RqwFVOvYn7c 120 7b [ p_0K{y2S}vmC+MXXʝGND/_K_u!KMGnяz:4k86<ȃ^@,9͇ _3)j7iiU ,cŃ-7E2b 46%U~!ӸsF~W:e(;^.,[`!xFMgCI9>M, `n^K\?.r-a ʆ}ůpʗqX(Oo'" ]s/; [awV&,,TAwޯzoJN|SDZ]rQRtq{#ܞJO6X!s<}5].vraH Rp] }-mDhӝI,s ǵJ6@K"-_W; @i1sz~U{}_fpԕ=CYQ(S]wvx[0 .q,LOb]X,wȕk[pA.,2jjK_O~jr- n Rit)a%ȭF ʝH8IaŚK9ģɰc<B1If`:_M5PqSsK'=z2RT]kcB*V'aܜ86b@r o$H-,Wn=|jdw@r=.u=F'D'S5OQJP*Ǜ`N 6'%DpYr?EΞ[KZ^n9?}VA~,6t6E{HWKVQIKi$~I[_%Q _9%K?鑕o8U\y>/@aŇp. Uf_دnKdsrd4WdrKm"EPvy>޶n4Τr]ϐ]J}WV +pp0F=ӲY,' / 0Mɋ{`[QZD.ۋ=bs-/oMUuu[O9BkfM[kTvR{wY*prb{&ܟ%:u*˶e9vZ*]W'G8'{BrWWe Ur$ 8ˆ@/kEq.e[5^k qA'9[p7CrLp klKWN9Mܳ?WA`5 nn J- p/XEr@[~ VTc&,&JAC]WJtu~K[εYN0nd-5̟ _nʢ E6Ild#65'rm[&N3nEhdY5mb>C+ܞG# ~M5Dl=|Ӥڭd*MBUJ=WG4N̘rp8-I5{v?~j44Z֓oB7SZ*]Qg~q)]@SZX5bS{rcobrA|<k| +}c9W*js\"^JlZT[pX/7cm`B#o^${kr?%kx- 9E` a N;2NNݐ%bTܜؽJ?97Ң)egIe9Vnr{4@ _#Gp,,/1˸O< O; cS jXTJn5Z-6.}af[6'7C{08&ű0[q7>9~J@Yop-L6^ρ̡RP2hrm&%'b,[ "6B=t[W(Ҕx>QO%Z#|)tUZk-M+2nG9 p@Rc-GUʰ-O[81俒y`/ `:?S+*ZjSQFOOjΔ6g;qa~XA^-/A7i)FxӜ#'g'hurGQ[N>קZU:p"?Xz*TƬ'(<O*%6_|֝*qvi'a6"C~]l/B=fq6p7 =5]*''T:ޫSW^uZ۹ ?Q\*;_''w.6 xd/u ӣwMXݧӺ#^RxGޙrZSO?N۞/+-ijh.,/r?a{c`9-k6-{cܑ~JʌYƔK sp\I}.WhT⩧}4=B*}4i_[ -p p8#`\?!OL_kyf/;b?a|5|9'9+|7Ik4u4*S1m#Qkǒpq-c*stdvz(jU9E؁1:z^ӥTdu_u3wGfh{ K cq0/lLr-,+'@uJ:J.n1mvQ*:R8J9^Kt?' 4UNnSs?]6Rq*ԌV##⪪[4>O#rpFQaf9r .nڛ<wʭITtbUf}At:jv]v{r|v^q>e/sP r<ȃH2Ų཮&R-OQP:gG)÷>^KF$O|YC}Co۹6*vbVIE]QqjXl?rAliPTct_>;vw0xgn _V&x5ys|ݚGϥz}X/wrnȍY\8.N*LkЛHf/=_֧*GdX7tuuںzj Gn/S5k)T8ؾ92l֖zcJ}{?ZU)By㴑Nr[{+cp-ZKdf{BoL=z?cz Vs/SJ v|ےf,r3xM$'x伎@!NK/)Jv\P N-IpjgݬK^ZoRog{l| |H[<F*,EkEmg4,6GqR_,[WN>n>Y:lk~ ]#9Rj=`2ó^on%L[cbBNSK[y.tۨ%)^摰)֕8IF֞ w si[uWԆM}8('$,~s h ~r JRl[Y×?VV L p>BW J?%[o [T:vWy5U _ǒ훓7IZZWQM;_b _r,%8-[O X Wh[ rte PvYh39FN.׋4XԔb-шc%c(Νn#Z)UNY^_g+y'#kk+*ZzrJ:^nc@x' "yeʼnGRSIQvTݝ탎c enEܲ})quO}k&z=*.-(7>nYV*Ry5yJ|\ @YALoTNpq{G*qRMfW~Rskl7+k#'Eٟw/X:'K͹wwEٞ=C/Pu*Pypgv什G蚎=d(]I/R)~cڹjʤrylr N0-t4nkIRzzYԅ%y5/sΫFTfR.2Xib*קT8?=|_&j{na\yb rE@ة_ݛjP#(4-v*m)c}KEiR-y'Mo{onOq#(ʜuNCYF)i)toKFu.6+8K%e˘%ŶG7VRn&= ۍ~oxޡ]:=ZN__L,e:;Җ}M7q02R`px6P*QWmѽSO?]_sklbs:5gFjPn2Y-}E]DNSN槁 FWh΁jKKN9w_ [RҲ(ct0?#=?P?(RnFpYt~QK ,99B:-oXkIJ)gQ{>S>J Egly[8G 8 {nRTu|[oRUQ꺥FToa{Sz.ѵjhSi?G}&)]:\RgAht理ZJ[Kc fz]LTlhZ"r[ɲ Rnrɇ9'/w>]b GQFՖщ)R8Hb,Nr9ط'%aZ>_C?oԇdQ9737Ֆpa 7*Wؖ I I; ]o}mKd#Jїqc2YNoɍ/6 ԔenvɁԟgjQV_K0 V|MpCu-KSUKL\<U}*0<-|,۱%'-ߐ?/s- c^Nµ}w?AzISHRUcόjjsJ+rw%O#b?V蔺\lU'pyь [Y7wrd͕I+q5{*,k+MS~bSmcc۳]u =*5JtK !Ⱦx*|08Vh.]\otwF]zK׫RZ]7li_#XK p97`lȷɓ$WfeXZg.^(tRY|TrTl,|3-O.һ7jMK0ڍ( 8]cˑ/n@9FQ.oc?M;j(U#F퍞w4)3l^ɢMb a KT=>ZMe o6NW=EiU')ݶa|Mlyؖ||B=I#]+!JUTmR=σ- qࣁJV1U$Y6cronHSӝEx{eXtΩm5e$+ 1|G%E^O 2OTQm/jsRFor=[zc]zXU٩dC/ W<O/%kr0ov!MYJ~-NUl{ZǴcऱv9Mwڮ`{F=lG'% 0 *FZggs1I+6Hl C+}`K$hopPۓ,eBZRҽ5=MXR{M ɶY ../tRպZIpjN~n!\6-qÍ=@ GiOI^O,7ԗm`L-cYFpwvoU4ΞҜ+>iV96۽^.0iFU5|ӯFotʾgg]aVZHŪk.Ru* T8T}ܟbO}\ԜKRrlĩ{n&`6Y_BYر=u^=Z!^1YJWRw<r؄[%X=Jzf^յN~NCKihc&;Zvq1{^7ਜ/ ^H8@G&=Xѓ֑NHZ:NSTn4̔Xd{Gmf%QM~ 8- O ꥨN,w N%jېۂ9"6JT58c^r!wkgqɳ(J巹rgN]zzURjӦd#[~J8U&?#ulld\9;. 4Md{` Wmc`8Ca[`rZ{%Y"p[x'~; v8kFR|qɷKV4jr%bV6ToDZ)8}^F.K\?"ap@x$Qbgg]kUkTarXrX󰝯{lEf. {/?Ӱ/a:4::BRxc6;5t*Q/l.0bwFEz0Rqr9C+UԪihT-s^C_C^Tu4JkxYػ{\JHgB$q1`9_طoBTSiukֻCUV2i'KڞRu4PݸgZcY'?%Z-|9Y]<9:8o/dٱ9݃@|lD-_A -*kp<-7';p. 2Xd\w_ط  Y>MOJQV&)9]I;)Y<{Hөo.yڭM]nuԕIOvj؃$9 `Fˁb۟b!An?/nNB {%ܮAX8M=4zQle7d쉨-=gNm7l;UۗEXg%&%sr:RbM(GV.}?t Zw.]ɰ!09{ !C\}WU> 'r81=/W'~[mx Oh$%-c]vG[S*KK&%? 3kFS]NzjcSC )v_ybG $/#t2I|Y0eNJ;ZU*9 p` q XlW)\ew861l>PBKsʼnp߃/ҬܟV,[]?A=uIBع79Xcc\d-*D.[/nՑg0K!MPW훳< ׶ @lmȱOzB)v8s( c^r7gѩ~>p:ϩu$w(9aa|^ܒ?֯{}gQJRNfޡ, %$ق6[\mr~F`r/oGuz^:U GuGU(J  !a@Wi,X}j=֔}_Y;58Y)z^}҄lR˷O _k*'Jt/ϸ=Gt rKcOz]UJNQ}xgmm ` [/o`n-9ÑW@ /V#V}or*ӵs~,_x'%;zMm6_J֣y۹{괚}J-?d8ypĬbp{Kz>%7c+6y:^էCGp#n f7%6:uNv/EGXX9R1[n>Xa^.LE79FQkYٓ@- #{V9. b aa__.gIBOn<{l9c92v%ܥ/1n<`e`;(J]r`-7w3SN;}K뺟bםUoҺIc7wcal` 䛲#pd {`߸{/X&*j䜁rkYC.MMvg"tERr,\9 @@ 8nISO:t mw( $Xr.^rEiܜDX;ڊtV]ʚ4 ŘCy# ltj5kѧJr]գpUd(PrQnf<^29[[Pjʽ?} T{bh+,WVEYd<)8]x#d_:_=Dw<웍 @i`9pM/&te5)+{6Mt#jlr5`|N-ZJ> 0?s;6XJJQI-xX[[pIJrE.l^Uiɴk űX-ł/uH3NU(EfOfGWGYҪ4i-$/+" _ޝ5Ih+-ZRRPG GY4-a_^lfs(Ik9-܎CqiѕZ'*|$|ཫ>'$[cry߃ WǧSN'os/At}U\a7?OB"pLJ0oE O @{aȰq^ItϨi㥅EQ]9|VO825b[\6BF}p.ȖI@2x"^Jl(NQ# )zC[zQUIEV~'zgTWi-yhH\".?sa`mRi^FM =NuU{c Nr[y bs 1>P` [3ے]Ɇ$(l[ۀ9#BbvYNRwlűc':V|t{Wх TӨF2&-pn0CJ.Oj&)ې7d(܃-d. rwPG2#7y ,ȍʸd/#G1Cw!ag#zL)UnMK>ί_MU}쇲8Oq# #po7m(bIX3Bt'QY^t:}ZU޻Q:R/MB7S3j.Ǜ 8  O"n[q?FK"KQW0*n.r7}0&!n<e܅yAYp=6QrݣWSM*t rҴg-?{qȷzFI+[Ҫk4ӢWrȽ$c̻/xN]c`YCdQK.i'~PzikH}6=/UҪЮp[ݎAFoȸ|m9뀟.ebUr[Ql3b+S3j:44:hz[_!h_ܲ br.{s6nS(G醓KR5QhYE>>Og˦>%Usoj[ׁlql_?_[ nm%JMKƦa*kXrQ¯KE:j=c4T%ʞLk"J1[;E];[|>E /BF̜ef2>F<%K[!nevCv9JrQqO>}OPKWRFJ:ʔ%/vr9pmEœfmV5?MMY|'`-te5nN'YGG MM5Xџ雋 I9AVhh$L[//`RG` blFTV54K jI\>-&JTu5EuF=kJ-+[ɷOQ5J7&br8/26ُȸ al#sA a66C{{ 0/~KKQJhT0'!G`9`-^H /ql`|rg:2ɀNnU#}=Ű1qvDC@.bx"^Vv1vaA?br_=z0G=#YRsr&Ü 3b73T)+/s$na9Z)8J욳O3EJJ}x'ߍW<cO?e?mR /%v7{ ݑ X;\ Abgۨ}v :s_&,#oqvg`?'>a۽]{v*:J=ٌF9fw˪՗MB{e'c'mFJWά)I}jӧ/eJkgVS7kəމ躿priK[#'rX[ | X]u%$`D7,q^KB`+N;6lLw2 D|x ه9l;:>P4kFg%R[G;:ΓAMXZZ&?YfR8I].=W_44IQ(֗URٚ9C讟CT };ߓ=mz5:tՠv;9?kr~W4ĩ{dw9;F7G c ^ (A+-.Oo/%َ#/9p8+\Ғwk|lǀ>z U]TT!.M,&s-qۋFV/J:ӢƜ#՞HP0O%^bzhzM8!r3 `rc{q~B'k6V r_ {OKi4Յ*R%# E&bǐ tK(1x,7p8|8(ٓ5͹e:|:y¦F}6vMBttoy,m9| ݳ[vd{4Bjv]55V'vk8J|/ m9L`[;+#6_}G`<"J.+#a6Nb?wb6w^+ =%]eeJ%RLbَOWOZTS'8f{l6MN2Rub|@~ |@ʼn` of}Gcӥݙ$~ӺN壥J..~'J?[ES2?cZWǀ^(2'^FZyDU&PiKWBtM#lCÁB0e$/'Y,- \x`#bj}^M|2f_tً1_y'7Ż[[d7xKR')?k#\N1Q_wa͊mɋ[v61` ?! J!V*7uN[k'vIcu3O bR22=˽Xp pŴܟ S~.U{>OM㥥_Z4Ջl~}ZRS{| R쨤zk:rZj4{ J60p8R)F1mx p?J ńY˺W r9ය X}Ǣh>v>[- ze\}G(9ȹS(ǔ*v;I`[pm!/w#% ޼Mr9`DߦMNdFzvW>e?,濒 p?aqr6:>rxm>`>G{'B2zӨuHU괝]w[k${n< Dy2+ClŠ-ȜYw2vv&H !n_ێTlNB?O#k-}mp )E{;~K-`lQҫr{>VROSIRV]~2Uڹ5;]$r kqv/v%O>FI5$ΕӪƝY탦'r2p-vNn!g{/ǀ#r#x6.BsV8AWɾ#Jg{RԥEEOHէZNNR[fr[Xf@3{ol{X=MH09#m1r䜏!0ፃxd`Eߨj4фЩMN=ru SI-C:#J&⤢gOSEuJ=k(O89?kJT8F k6CElД)]@nx*.,OatkijBER_ J샒DȾp@X,o`MɹE#{6˷'c[(8_%JK5g.c N [~ Ik7o6CQfU)JX&{&9n?[ +r`5i8R8'؄]섦+ى^A1хȸ་`>z/YֺttjSbbv< nU:UN],Pv,b!Tn 8F{[?)QaJ-B_|-f]+ )ob !>Q݌6_ct*Ӕu T,5{[k  8勴t5kUJ;#+\N~B_$伀B,7A,` ʜe7dѤڝeRO!EJrQqqktyFN:cNR-8 .3L4}G:OMR!/>~T*I'ܯ1˵ȷ#a!?Vl,>Gpl#|8bֹ<7ԭF]y#[tjB ReksYxMv!_LXp,0rpqyFLzL)VU{?=O.}-< ?rO9=:Zx)KU:*I1u}U>t).YK'lo:@jt5VJ5y;ԃ?$-^d8fIRtsNURwWQRMR~F +;< /8 l\ʔNjQr*TIM呒Ó+X'_#`~;oȸ@%,?n LqplÑtxT}{azTuӍ>)8RLG-8#FFJji5Whyl<Zy2}}ֺ_H]ekK<_\zvNVs~-EǑ`r8%܆Wĺ6e2Ie&bilUx!Pb- "ȾM5 j!?M~tH::zcKv?1U]DF* ld0d{27l2r/7@[[o$ܤǜ(6w>0Qoa lX!o`vOujZw>ˮ:ONo,v?4VU&^Mw%%ѤJZQӥ).%7uZZçVZ 8?`d8]K>ŚN܌[)%7-oar?oPnb㜂0Q՝o;bK;\#[|䜅70_!+Eʜ%RjWvH۬VtF[9@ ~HWB>k=iu ~K[E E9S 8YFdG+䟑_=cz~KF)Uٹ=IwIɘrP JsvGϳQFtkJKd=pW̜RZQ۫ǵ;ùpNKK_qb[c#š- qwikmE{Q^U;c{Dl ܂ !x>x]oma݋\{89(QGѽBVNK~{gcaȿ!lUގCV*4i/[# OiEW[Ք [U:N*v;wCfhlXII̤YlEiIE65ܛrح0TgMAJ%H+#  =µW[cij”-y;+}ExRA2N'5-'{nYFrygWV ׅwd/kn-[Cln XݧVUҕI?킹9ћHn0l8la.vvnI^Dr8v=ӿ8 n @@ e(߻&K2W3BpI65X dC'&Q܄KXZG?W2OFlX]jҩ+^N5pŇe$)TOYaŦ0YQ뚇6a[PuΙꚅCGJUjoڍ:-myRS*AK(v\BѨ|5sϺmc~IzYvJW4Z$ /|oG72ICɯ|͔BqZX^e8y$tzʆVyߥ[[~lG [#rX,w `'ng9/-1jL\OR/#c*R쨛]R{n^Vd wܲ[ߤJFQR};|6mmmI8|%6NGoF<6ߐO,K˶ѹV'8n?Zr{߂xcmm*8&5jʤIk2/coX'#v?%Sz*67k\:T̓WbQqvk7IvM<{_p_ۓG ?w1b~B2ھ܄@p<7 G0m%w\ { #,k;5EU}8^_$ x gRPo썬thzC5Z&jsm|{EW"#o {lYNR_!nRӪ1F2>zh:o=SqGTRw_b7&r8(6[ X :ԡ+4lzOGNcj_oɬ/2:sc_*RXXv4cp˵s!]09K-Dhd[\xoF(m-AlvzԵYNrIRݚI/?q[# q <'?pSb\rC~QwN7OgTQWOx^ od=oM鴚B}w/W=?[&SN_tc.!{ll c/&?ܼE.]*tOWB1u)ܮ5uNWjkJ]`2~ETtVI9Z9&vB)՚"Q학;`*3{`[iZ =*pp}zVT{:u_Ν*wXr9GF!{XǁXrl9/"SGy6o|?'×s8) 1}0GK<M81bP{z=MMEqguF'_nZR>V;'nL%F|I~Pd\y G6 *tUĶE?"^2MW{hJ4kSk55UJ4U~Ų5i4iФ䢏_ԾzzT9Ƥnϱ؞eHNzQzd_Vc,SWg^_u *vy-aop,9`[HA?m )'J2Zv8OKKW iʥF.͘k'FrPڛ" /Zσ?ӭIкucOQ%>UTW~E}zӪ]V9-(֯N]KІ[Rly}x_[~ձǫj'F9Sg+4hXl[dbqne&F6%["2 { q-$'#}8# X?!]-^6Qj(_::huIW[zu]8Fdwt~SaC*=Aޡ)*ZQd࣯O5z3BZc{dcs8NT̥Q2l6x'1e'efc 4gF*SGV/s~,|\S8 U5Qӗc1u]8hQdۓC_FCSSNUT&4ՇeGx "p\2r7Ln6qPK/7/'a p\ [BϹlE2)9nɱVe^ROpIݟz<dݥVTrRPVq wQ:;IKa9JsAmadn#XG$- v~KOK_S9Ҥc89 ȅy6Ⱦ 9QXե:6чH/&^Ntdt ZOyKT.r@o|*!l[,lD6'%V~Ƿ]DZѬQ (O3~Xl gO :eх7Ru\U4~/ig+Br}Ǎx۸?%-`շv{A8H7CXl[k"r@7qV3ZTf 5(3u]gSSRqr6EXy'#d\e S[.>G@ق]/VzzM4SQ&NtmM.%:rvw9y |΍/>%%;~K*.9' 2x(*qwF?P>z.>G|Ԣl~-{] QKVWZRM+UV5kJpd^5~a`q8*c:T{z^HCZ/xNJ8~fSz*s'ƇЛ?ԝ{?O螛K]ӦůoUVjs);o` vHC? (ѷ=O*F*.W^uIcxWcw!.݊|rCp/}ùUD /J>.FZeWzTNz=xd(䜗l9:qӾ:L5Z7=sOkhFIq/DKrEmᗐ.NK[Fk}b؜+Hų؃bO0blWn,~/*nH̙8b/1̕s=3:= KM'ՓrjVOXӄ>bP7 un*ׄg.طz3֧2m/cd)ҍI/[lɾY7S뺺5?]яo>O1H!J.]9dNUj(SW2FV*r'8~,wC)/EYnXBțp/~Av!nby\iNsW rr7E#?xbņٰle wvFU)JMjycab8,1 l0e'%{0X{RS|cGHRKE#Sxw~K =?=g]իt|NMeHat@M rO/z:KUrSRi7ŏk1xWam-Jm% b0/ bsAΥz髸ROY_Tu-~Sjg(NnR#eNRq$;|'{@7tjҕHþJ=m}UG_Fٞv=Fu)T)]B;#E$= 'CmCr?rH dVO9 8qkucl)&]iAz6)9'ޠP`M= ]Z9C3]Z.ͷa%|El^lx~Eh^ |[pB[ 7) 7$}6OA֓OY%v>Y:RnY ~ ̓ ]][!Y5#ܿ 6)>=/?#pxl~{:5zT*(ҭ׺G5G,`/8EŅ[avѠ+U jS+rWGSY'Ry^ƒXd{r _aϰWl^ ҧǾ W}Qkz~W:vZvK>}#.c#a)*J%ϰVuRnRymlR~G9'n ^/n MhBa8Ռ~$7AX2<>|7VE \G[/ &ȷ:6UQNTۧگ.Tc6+ǃ y  @rv6)loRZZΩN9j-<^V9E٣[ r?7'<hA{'uH^jPqJ7-=U]M¬%.[_]^U5%R'{ &^իOWܡU,{_:IվűjUMfT0fg)CK[PNjW5*  NxrQ{WSO7N% $7#T ˸Xe._;w8^"^K[8`d  *]`/`UIJ[6 ]9.[?q@(ǹΥ)BQkky&(C"/#Ƚ"n>i|?d6@06ؖےy Z _a \X ?{l6[%\56aHδ#Nlk.N-䃀6jfW~ X /qCB?/틆R#9@{pX ZuZkh$: ԞWpJ9)$'f^1-+Xp7/]<\\XXxc \ex 0 2<dNk^}&D ͑0,9 3jHv.RN6/Bmmrd⭽F@ ( r6 bgIT];:}iC=;hg uWTbR*5k]?GS_ׅ/*ЋFW'[SVU*K.Rݚ,M/M+X |d*Ոv? /?8ћޠW&E5XBJR_OSh:*T%NPޣ`&L\1U첲0䤂3VLm\%HHC>Zuc:mE=ROWKN~,؜nGsFy/tkʊcՌЕhiɫfK.=Yfr rn5^wZxS7:RW)e>^ Nr^#.NNJ p6crTN.RIn=]OZ}I^q vީhwYCAԣ't#NSJ!˱<;fA٧aGzԺ^JO%g(>gv7Eɳ8CctW sf"\9?]torhvJ>IU-ق ҹ7(p992RTfQWUQԭ9Nov5N[c[#?>|ѷz?FcSk'uw2`+?"L~y/%D)7*ĶK`v")GB\pp#a࿰~.0LXx/9|ܿ`lǒre80 ttӥ(IMStGK)ݮ?~G X[;dDn`A{/ZÀ['xdI~ߑ:MF]o  ;~@6 XD9+l{?2'ry!rxv b\[ݐ+wln?nT^q{0 /`p1/&K'~MMu*7v-Er1"+o܋rd636an7`/,eL\m4g-/]~fZ4:Tǵv6q 2ǀ7CNn+thgG'' 0@# %,ٲ1q LK Ilv6ߧ_48%%< O X-p.6^Upث|kkC䅾C 翦oPtit2hI4J7NG 7Dp=SQCCSKNISg%m7nFTO%)M(¼%8E;/Tu]-Z>OM:{6X),thtUPRJ1˨tONJT[J0HʣA^-Jѽ=GuܯccUյKy|1rjF^QQuԥܮk$/"B ?%Rvy-N@_İdQop\ 䣑ܜX]%HmIT{]G7+_^0qUeRXo#kһ8 R˿!琑;^+B9rgѐ}&/I֣bUBTj8Ie`+-cp}MIG7nగdYjMԨcܢ8XÌreJv\f6a1r2yW/Qlg"X1 r'Fm^T$l9wJmCVEdf #.w%8!x'XȱgL Qf].>ry&%܋|;16ۢiNeN7eqH[>v59SmJ2Tdxn nO%؛jg,\Xo Grȿdp$a6x+`08+/~KFST#~Lcn쇾rER\]ɲ 79ekË2 Dȿv x=K"'`[fK|nX=kqqÑ-2NU(SNR|!SOU¬\ezhwSi?ϹkRLԤc~tHzΤ{T^zzuJƌ'+Gh`9? \_$Evc #ww߂@d9/Z!/&eZq8JO #gNaU&s͟YS: *ʶWL&=WOFGQKI8QWτʍ]?75Eh2qxRFDz֔b7Y/y(ܲh%bb8sc#( se7d+9?ч$rܜ`T"ZfSf;leti4O ½Q= V ZF];Y%JG8lL/pTfJ0 [N=Ҳi ʕYRtms Kݓ|-as*q.c;:_RpgRWUNQpعہrd7h} D*4}SRQڷϙ`k9.<ŀbc+nBZSf |[!lX| 7x7GKVt]HN V4y x!-o XnVLC,0BN 5{E7ws~!$?SOѩ*pQg[c(Ӄ:WlG9iR^cqv1.`2B3vM_n4Nҧ9[]nϫ.|'&i*.UقF4%UmhjPSkkNYbrP.p,6B6E^KlS莅[UrIV'JԪqrg(i_ l6([| e<H~|R|[|`2OO}3iDc~QtY:jo Ν]=_Z77hb%El[?lk c)F)7$x%.?ȶ" ;{a ̣? @I N脷,[ZÀ>;A,y?1oX["ÀwL%yM/_9~U{ql[ϵ)0c!8F<*NNs*J}LZc~H[r?#a`umcO!l6 s=J/]-O~|aIk9"m'&:ҪQJTSg^JMov{1 H<<qDۓ PRi^%sO$̡.)nukݟR1]P7\p[ESič;#*QjM^W͌> NK('E'fq>y3SQk&r *ҤaRf?#(/szCC> ՒseI~ [ Ò-NK8BC#p=ATlѕJـ_D^l8Rv#b\rҹinY;Z4[>[ٛpZiا4w>p/p)8ɞΏԚEhƟѬ6Ɣ9'  ŊB A໇@IGwFU<1G$qdwn?~!\ޮUeHzWiʟOK_4ZʎUMOs bFKBnYR틒?&13i}oarm9AԤڥd;!-,] Wwij3첌ZϤ'B.9ZkQ*%k[wUO%,gm.r9~y&lij*R'9MRico,qQ%`Gϸ-Y (n܀~X/6*F:JoTY՜d݌ .a~C ~RJ6W ȱ9caŌѝySKv*ST> Hr=>pvk%ʇ'7.V^e GLҧѕH<9֓ȷaar/'nqg*qJ6j0ɵ~1۰[ e.%dqr_#-IeZOӂGEKiѿF '8؜VC^]mhZiTsfpQGxؖL~G b/ȹ[Ë>S8֔hqk0?!'V+j"gNyh?HuԺ:.Ifd~>NTbֶ|?!wBG(B7`Fێ~l9={[LĶ? ; OFUFNR>YCgRiwJtW>Jqf Ya;,0^>P$PrwM=h~r%d`mX@x/y8ZV-oBQZ4@VYRvLőR1/ظ bp7Ul|t:nN<˥կ(g/,3Uַu9[9al_͌St\UAGdk#V.Օ9[6McQ( `7 \lŷ72+?ap-?%؁adrМRhX)T%l"Z2sd<aks $99;Y8c%$ ~r29nf6#lQKA59;wIץj87gl^n_[Brrw5܌`-8"/88䟑ryyEkN  [!AS=KQUj:z~f. :XZ~彎@l%_,qܜ؜e z?NzZOcUkzZ:ң'!vam J-K1rN ^7!RvQCM/_f.BOOVڨjtM21jʾnRiݶ'F->Ð-1,-u}9ޚj&A @lT>X K+h}(#y#j"3+OTIuZ]?QujcRZ*g34Sw\TihptK;H''_%&\ǜ7/XwLjY0xm *Y߳sEeQ;v-q2+S(j%).:%I4NVrg~5u֭9Nsm'sFO< >Ѻ-ӏTtln¹zAдiZ?V_9E|/1-Xk%ӯII_ԝvC-=TiJqD|4:r1]|S*tR}jut괨R{vgսsuH>.$ջžI_%V}zn^VIT㾧ojGzJ]J4J oRݣ> `B_&T”S9,=ņ_ p< r^I7o%g@YW#s~9?xeEV :KFtN18ۻ{N}[6!7-ypQMvT-9vJؕ'>%c)ReMӕtne^܃u:+VѧS_jSlMc6}yeBEydNҺ1܃t m_`0F?_ 92Rqo<wr^%S5%EJܞn@aÒ~AQ|k,r< #|Η=.֥%Y_3|1D],y!w%W{ʝ586\{5 kX `o%Qff}:1bh1-䜠/`p7WqĖǛbjMBXZagmtj 5kV^nu')_Ri 4r p:/WУ)ҡ4< p8'}gNbYJn;nWok۹9ObrK! Bſ&姩*riniq2mp.NENGXef;083IB'7&b .-A s)>J-IUz& l92,pUFU@r2Áǰ <.LRMYɴGp27hMҧ)jk{gbԇdb&5;SrFn& ar_X_X?VB]XqyEK$,ti+B-t>vjn=r] 0]UGU!rpm;nNf% ~r/9OYR *j.QEN4%`SqSNK>ĜxFڤc~Y%;;]FL-x*&JM㒧n@8yk,_#6ᐷn %/z dv/"9䟑v_$nl+ vMd7kPWO_BZƊS욒K:_PӝUG/:psi['ONIR>֭my&Q}=eyRor1D2HRsa`/`1adspG9L仝Fa.=Mdmr:'էع}=H _$Ɯ~ضNIIGq}&݁!ϣu)^/,$y{WZЭM~*`.ػ"׼#ܰm񿹋{r`n83>u{#̓2[$oao8B %fk|802<,rpl?G#g'KǶlrP1pYGz~KZn|NR]V0LUd]SUGOR:xs k+E'ܮc=gB[W$JUKo bn(F\tީtgJ=I|ϱ/aZ D[\lEac:p{fDGAޙQsOEE5Qൕc[Q9=o9X([dp@@J`?I @#Dwn h*e-5T%CgJYөE}Uƴ/#:%Q`mK'a]ۅZkq[^?Cq(` ؈ ,%'جѧ֡*S;ɦNl^CY7@X˹۴SWՕf4h}9Օէoc,Qqc  _cgcٗp6C؜%QWI(b|A Νn_ٽ5>x開OVR1R_>]7ouwqc=^շ'rA*r5GO #-E zZ5ո/~@XE!P~@ ,efK!+b\/)xҧ)˵^ƽw ٲRr.bշ12\vɋ&v/y@{8d?`Avd)8 zstP lC| w{`_8x;^ ԵpEuqԒ0'ؼbmlTTBMb_QhU:T4գܾonZMJ?\s5cm}%{3 | '~nJb'|rܿbnIn Hn G+'Iʍ&丹Ͷ?) ܓmAW6eM z='*Ө7^O-/KF5NƺPIQSKR>A }^SuasBTmiAIg];RkwՌ.ji_hK#or[7k: ֜cc{#&V2h*vز{X+=ШuZ*jS:);._{='4QpiJx~>O\rbJqC7A/rbɛlF.b6 +KkʋQQk YC%~!U<7d>+ =_|l{`u=8Tr}&ݑvFt8;}O-͌ݰZvf#v>:ʚ=L+їl{3uZGdko 9E! my ߑ {J6bXp//a/b\~7}˰Ốv!^_ t!FQ~81mv@nmQ)'}Y_u:zӫ'̝K O(FeR=_*]{+K8Zgz=oJ裢IoHvov !,-V]_OP9TIwM )ѕHNqWPɅI{{6:GSӪM-YR]5jmMYԜ'v!mhn@"`~G pwni4ݿVWk`Ѭם.&Ay2dOWiVZ}7;!zsz^VjK ~qJ фU~Hm[2SuΥ?x ~d2\=@ h]]{ 7eb8{\_˺rݽZШN߶#V n5)J v~ {scHK$n.?!1|2QOEA00-<?MDy`ȵ8d[%D{F*vxp?n3aa" a[w5R圜rdAG vlK7Uwcwkd襤R 69Y슅 f[{؁ ar- J7 _.j>Kwn\Z΍zR ,A.OsE(: m}M}3hH$&x*lT䩩p` =Sյ O>tu Յ,wG(E1p9ܷo|re`1_{2'#y'7 , l<F{a`lÿ%0OHN. ^ ܳS%^r l om4z?i6z o_ݩ}ovx`/4kE֋/Uýqj7eõ`T0 G# oIx2%?ЛbZ{An)V3T(9L<-U q+ \r6mlR;l/{JK1ɖ_&-F*iJ+M~@!G#vP K M)ՙ:ң+N2F3nMb3~K&A9)|~on}enNvb,dKw1r`^vYKG?ĵ m@,Yӕ.Gv?{Z}1!^KNۓp^.c`_=/Otu>GKR o'BOmWN_'~Il^ȭСSQS\߲0wMH*r]9 a|R"8_ 88a&ߒ9{RNɋVw#~G/qt  ͸ٶct V>ڑqf/alm%?қ%vd*W\$MZ֣*.5I(M/X8ϲJw1ptj_4TN[3LnGkOFúrT}o^R6?,/3^5?[iv]ǧFTuyzZ)ƜV,"dsa LܮNVN *v{u/QtJuiSs ?Y &8KԟIv2u%D#梁ƾS̥쏷]6)I z-M5yҫ٦s_'_PPVZ:UfNM+~uZyCSZʓfDٱyP$XVE 7؟ >G#qӄ5z_=Gh5T{iWRL`v٥j!F\7hLS*U ې@ŋ8$>Jݑe CM?pNFGd3 8 = 鯥҅:u77/1-Hn-l Xn9lr.01maX|6[\yH\[/qp*ܭ8yQRx5^!8wXʦ*W#5ӗk;#5(pr nCܜSdAь>潙:]ܷf$dg`O~@gZ Fb[V%Q`o{6)(rlAM}MM4KcS}pm*28vk1]ZGIX@6_OqoU:m::ԫ9S.[_'Nɇ8/7" |'q%ڬO~}oС)9B OMmgAӂovj{nt֯ZNݓpŋ8.Tnibo؀e>rq1I^%3oqoaC oۥpҕY52,X}98wZ>HQ6' `@ {;J8%䷾ b[<^@aD^ ǂo jM].OJ zq (T90n1ciQEzӭ+nO &TΌ[`mwM-GOkUm#OUnN^J |m1A"nJXx1e  KGe j*j\ZJl\pGk ~I| oa+S,$>MM}eNf5hԥnJW5dMvWSJw׃L+"2rT!;I?c:Yޤ`ۖ%1pd8p#ݧN}E ,ZK&Qn-;zֲ:_>5&'&2l~ntW=VҒw>rI[ÌG XGzu[Zy p6ܲv6.S6,1T}G=EKe*rR=ksq鐔IMYG~iTVZsf1p6ӭ(?Mu%'0!t@9(bUKemgq8 ݑ n7EHŮ^0gN_NJkuٯZFZa F2lmjg86kVuuuZJWg?'pvt=Ru\"+pYV| e{u%GmK^&"1}y2Zu7y ornJAF9I"ӴW0Nv0601@r r RujNz-M%yRf>.{_ 2fÌ=ǁ`ӳ:5;;EEvls]9s*qe58^VH6'~29%x(l[:*Tt$/W,}OfYҵjn _eAdp7#rG,c|@0w 9Fon.)M9^$+샏n1mr}'ѺU]CW,# z_RS~9|?%Vrldaȸ@2w'_:hUM,:ЃcyN`y/6cr)GQ QLPz }/Y \*:kZsL%O 1-*7ieZ\_N6TOء8IwNZǁ|VLy q-' ,, 61[&Kc5-G zV6]x:HAAIEpipU (+;e%٧ϹOݰG(ɕY;T~,".ؑx('y1|`p.OUkm@ qm)BI)8?J$KspR^%ʜ{ostYazqR=Ѧף*5NV01+;Tf{xrn rkE,_ߧ}ypI/$/n/=.еNO:ݙ}cШR.2[kN3a炥 秫*5 aI2S{٨Jөߌ3 UgEޜg79w;a+X[/;~]9(wvrpAln`2rQ? &<bg?EFcM'_ۃO>Z7'nxpG-~@˱>b?ϑ>IXl[sʼna cr,<wEkrIc[|بtOS!Nůg{_Ot)rtY5 x`HKp9?!|6Hߥu.pk]nO֓l:q}-ZVE܁ {?p%y-?pK{1 [b70GEcH(Ot';PrJr~w )JNs>OQZӜZLO}ܣ-FZk'ȵ-  9lOWaHQ[mlP@kqj7 o`qkor.-<*mFJպĺ(ZzT5M}8#_Aap[\Bam3(}WOKzbRToMqŷgԏkiY6U4',gStiQUsQQ7*\:-xZ}2O>8wO8[;yLRd `BrmujmV c #aaX3iœ5ɁIB(o1\t wDkivwI>h:~M- &x<'ϲJ^Ǿ_!ӿ)Z<*{Nr˹yD[d;c rmprx1KV:TmKzR:M]{w}{\W#n8~j58?MȻd4c.H6/9JKv!?]ےC p/Ðox3^~ rHܱW<@6`|{ wllK pÔ2MѧIє;Oj*1`T{lJ:rkYhFpj篫t=Z7 ԫWU[8C<{{'R2ɯsNux9]W Tn ѾJ[~=qy p  [>݀\ ԡ:qJ<7id2N܋N@-lO\ͅݙƌM~1Rw=;[r/qmB*s.$`べq|nck ͂YpX4ǫ:M驪*#N=N.7W=6ӜMZzNh;]=EQ U5k9JsɩNPv "<{B%Obp[CtE:S.ߺG8jݲ+C^n,MbG-/fV,6 }'^v6;gjOmboptH,wW;CZҥ8Bn_u1oqA8/dÀp9nN wk_`x*pG`p?#+r/6u;(BSJNp@8n@ {d'SuKQjHiNl@2^G!6bYO+W˱Y{& d0/C#~GpwDm'oT/~UtP_( >n|3FRm\=XqAv7:4QmԤcfig}$Nr6 9 r˵?ÁZ]ص]rv!sor@4Ucѽ.Ӟ]X>;Uң%}]")lb9(RvmIlIÐT<Q1{+)tޚa2pi+s*k '-9Yjtf&7vO_n,i*e Y2YH _Y/$`r@%71Y2+Z)Y&ܧNoKM?79~}A:Ԩ:Rs'Ϳ?$hh)Sj f8,Wԥ(² nl~re r%)>gNTݥ/!uRNj]G__zhFO\9"'WrA|Ȳ)j0pOsR@ ܓu?#-什!1acѡҧhiNvj=UhzVZun&~OF{'voO]{>VԨS smӅJT%G$8..oȾ~ ͊'3hzP=~RRI].gGCUo{ITI):ngu G=>i}H|Zrf!0 | :j:(4u򫨫*f Ք6Y%)JYd,Rl^J Cn,mŃkͱ辁UUO)/fkt4Ϩ;iF2H%?QwnL?ujΟgY.y܏mK6k+RR*IYYWݎG/f,Jqw+XJ-FB ԩ:1lk?b;= ꕿԖ8 9, ?` r<P6 rTc(8߹&,1=>tug5 '=/Sdk==:*1QۙRӖdzz>ѧAЇot#y<0eׂ7},[tƕVoe aۂ +):qrWflLq,l]I]YBP~Ē\&92[U/GiUQ,vx]kOu*IԅIR 8`r{_a|Lýt$ΪKSR*\6r\ŏ[ԗmkAi>ҏwu4ӊmE{M${ৡuVbI控u55T''ڬs+sIZ1Vթ2%NYqO$FmRqfhal!k"V1;{`0[<I;x]?~Br<7l; rU& nbI=ΎYKPrRQv6.*t,ӍF8 as:u]%.UFcMm+S%8.{4viSSdYdF ӆ#&c').s؃mr/,<p;JD | JQff2H vN3`9 l\%w͏O>osS8 qeu:1T#5R.Oxr>Cx *?Kwc$Dѩ 6WSrz]NOڧ>dj:PS(JK*Qxg>Ib67SեBrjwn#lByb]`ۑ\d@Lp7fN.)7%V,< _aEGR(Ϩu]V}ڝEJړg L] K$ܜ+mzPS4ub ^G|l;Ō, I|Rf6bG, N%-Rkÿ |'"m<`[m.jnr<G7%9vv- XG/kDtlSݟlr w(2pge8ZWckF16)BzH*F9J2O撶S1*uJUz7SO^qFT^+M-=&*`.wHua[ 6@%8aʕ p컝5gfM#2GN]y*:d'0;<nҔ(W5-ecITۓ|#7|b٦tZU7 {jIRP4k]|GEz_OI֩ڥeY^ &8,osAXmArK \, 9 p.TeV1 w" ߒyXfŲ9 {`^ (J)]K1ǭק5삅+^njnL<9| tJn\Ƣ]MG:Ӕ%:'Cf5AeN1r+') p܎6d@\d-~ @{orR n _vX&(N;䰏|teb~K>@|p[pWbl3'>/ql8b-$q. {`NXK`-\^/f DI+] l*Fa $RxcܼXX '[#;ضE^ 9Kſfta*F=E=IGPw>| d-Ze*.j*RsiHtѾ sUorOxH'p|#e-EZtܬ1nظgk03q6x= ]cp7212\䢲ٷYj)_'}Zs*o߸򵊌u3Zw'NoqXf$Ŷ'7 /`, [8.,xɝ:r҂m$c%(< Oos ȂvGziu:4trG(8;/QwqqfP}un.GONT(T N6rKmܮcay `%*n &I.k^|oŸrUZ9'ٗ'"`%ȶr#P(lEFr9),6np9 nӅmL!Vӄg+lt&I-)8c龡N:^9Rni_<r0Q03ꯨڅa]RU_һɅ䭎m{,c9(E6rpU ŋ|7PM *%;mwԺCVuUo<ڲ& ʔ;NV&/d&}gj#GleD*r iŃ(Ӕڛ1j;V[wvl a̛V<-_alȻ~#aP&GװW%L\<"kR{dZ:5# Tդ2^׵Q8;Y(-䰂EΟԺSԪT\=ezgMꝝ/TqIvk|!H8F{6뤟cp -v;_6.,9vŧSlV_lb0i,?#WئTi#ΩkwMKD,,/<r_'#}D[@ `|p0-m۸mgnTݤ5NRr{1y%K'p mo |Kbϭ螹~-*4[=պkgOZj y;#뾟IRZҗՂy#]ꎥ.j5۲Y,1ѦO 2]%+'7' c^w%W;)%n}+.2ö~ĕ.BG|#ٹ9ܔ)@̓y _vw Yr#R{~!-n bBN.ug=1BRry 8,e{sLK?Լ| ]3e}M]CNVɫuM}8+pj+'J+VUKvS ?q{`yEߐZp/-f>lS*SM;{"nYap rr!| ?b|{'uwtFJv*[ry&H7SSVW+76[X&p r?$dؖ@#{`1`) >QG|ijƝ8N#gP]QF~Vg3 ^p//8a#I&IЄ%;Zj_kpi ͅJJU#w;:QԵүK mzB:TՔSj+ZW֜#7{E`0=l f|.6xclT;#[)Y {&嵸".X`Ip+VDqdx.E77Wp--Gte+϶归 sJNo,%ǀA` Rp-b욹ʛd1[~Ee~F ut]TkJ < {29Cf/ie(.N.٢ljjIjd|eYS_m` H\koveSlL0>CX yb0/̡)B]rկR9K0EC<#r,?q!?y(Qec6.̊'dznzG~9wO ,r?"r\\^Ll__ KK;:bSu)H]uT=5)0G<6v>A9(WSY+spl9`MY"1q6!|z_aa|4nck1_#ap+l,e%eRjS"qm1r3xvzOH*Ꞛ1+S5٫y@n9,PBe 8! Xvkn+OND 2k,F9A Cr Z`p% =w~,c |{0ۏEVEg=]׭=9F .)l>~>RO8x/q~[2R,@/<=l>@r6-kҝZGui<3)zRGLB{&|+K`?R3le7$Zg(MK$#Cc 8?t7[3| >,SgQ+YOܝckzeSY^Ud<|Yo~CPѝi<lw[CrK| | eAWѥw񔓏s_ {}8Y>vӧ:PR݌$N<K$Z%'&Spq]'$a br=An͚y(URyK6>>V4Qҥ=oaIspK8ByB ˳ ΥIԕ9y2;3aS(_zFu0E]>ݽ./G9VM^QΫѕM5<ƣ0X/y.O.c?&'~Kvj>Iw?;Y,H; ar??p?pDܤ*Wd# ^+01lUIqqm x&L^Bna|2Z&rJl\l7afw)7~ n,8,nl;ܻn edd݉r8'!x/l aݡkq`,? L"n^2YvQÒht`ݒF^Qhԣ?g3BȲpd䀢r}$G[ۛɾH{>H6ʥ?#P r +c$lwdj\]ŗb[nEq[ef.?a#1@y'Q́ihu&ԒF(r7 rtue q{c:> EdZVi1}#- R2NvONr0dzCzաRф\zCuSU>a);w?dxu΅YS8Gu]|kQRPNw?kVR,Mry2{LOMI$ؓ}ҽc䈯s*u9)E٭Ե]JוiZד8o/p8fӱy pGtuKMZ4ԞմT)ׅxT Kb/?8 ~CY/X}'WkZ*4=]-iR BpÌ4r2Fʑ Kj|Fȏ"*) !lg~ v xʕGJ7Dsܜl?r2^_7hS)T57n<#wUCC u#e8m#&tON>ӵzV=ݕ%g/Vqv|ܗ2Mv<uu!]œ BO}/M*ښVXt:RPu1}IZ'م>V"l%'3ިtznZ)q~꺇WSZUe<#wH-IRQ48O?@4Xeڃky1 rs\(oŔ$xVTy 2XpUg:]bPw~[g)J2g~d\~@pߜ`8HW9n8{roN-t8]mc\VYգڭc*Vq]B +I8{colT.?#pG.r#5i"lArbg`#[/ -GF SXK2ɣzֳ뻵ھ=ao@P'E> ųΗgԏzykPTP\S} oJSJ*sQn6{@#rɏb_%`o B b\l8+I-ͫQ?;/}"6T}?X;ZUmk~޻[WP:l9mbp73b5>Cqp<pt#ȸrV p -9%w;v*u%MBN23)IֿǓ[ܑvweqvd3)ɛZU_KƜʍ& n7ج_lK$, QSkÒ^IHɶS(+;=Wm2Sj6oX]7("|X2M՚7b9SV @[Xr8_!nzQIJDԕIMRQRry [1acH8!ce}VUu;bt#ݬ5ThtQl\#f&وT`{Gbl0-{ d{I-$EC·ZuRQqkzDMO l9+J`lAppn76S)uJ74Z}7zeNN:+IԌ]wEGAkVUӛf QbFnlX$݄|26rKWv\*т6فEI>8 o*̗FJN;6F}M!=?"Yԡ]$hz}էO[se$rm|iw+PzJHLSOU՛$ [#t*5zI5mUGE+vɞ;mxǁvYE ԴBuThpM; F'%q$n 22Y(v'G$伃vK-UIFji_.ƩEN,rBBܓr9Y#)E_8{B~ղ1cy- Q5eX/" .ېAmp(@9cISOOץ{h~Y6o|r>E|(Ii+QUvm #'D|cZJn 2㕬gsӍ8IU_s > _,SiT53쬛vqh*6r5E*rnI +nʴguvklFTJ#gc}IS~'ۃ˩')_Br?! rovE6@b~@ l,7΂GKFhu%(s9v_cob`ǀUPo+$&srw'@z:e9wUvL~yCJ\ԧ(%{}0`l|0 M+wpl{繮t7iѻ_Zj)}hx_']ľݙR[]iJ0_܌hQjyI=_z>ZmZj{J`6l9 (osd!}z#TIUFakoj:tQJq住kQ94V %cէCURy*y%V5sb&p7Mr$dnK x؜ YF=M&aȷzwh:lK].KJݏ􇣺wV赵Z[a$̏Z(uըҫ&89 b`l" t,Qa2$u~M >URti wmI^H9).P8{\+%8$1%X(f2O? {  ݧME,~*_mySV/jNӳ ob{ܯ# YeQ<^+K7iR)c;d8 pxdH,=doȸ 'mlQb[r%Rkb6.鵥VԓF'%Jb \~/UFo#735Ng;:SS*JmN6G?l؀ZÔHڕuq5MEJwG#ܜ`sp;B=ǂ/%[<灁YZ!HR:Fi5ǹg%zνYN6y!I;pgK]Kֵ~ZYY>O.7q \rv#T6`nSڙե r0VF {0#+"//"iP_~ ᧫RJQ,#]uqIԖv=N]/@COW)ǵ)U}LF$FJ\lXDsq|f"໡~E iVP{bMʫ8xFgrtkoLoԶ.plv-K%]ܝ׍A@_ lӤc:eNYLҶ䖶0ŽGi7RG35%J]vc+ޕEђot c [#3S{m5e*RNUkK-]okvwbKu$1bNKqoijj*(S|#ܗ7QtM[vUӁ󲳖,/a-rdǁr?%'ѣQ{wۿiȦvOX` ۍ͉a/mJQ8Җ5cK n ob<;[{C kj!Rtܩ|܅!R[5~=M:ݟNi(/ݻn^1oaۜr2Nw/ま@G$N7/r_!,ԣ(SX1 2RTxI}{v'~.ԖUTnK{#St:4өG; r 1ȶE.l#fi{ ;#ac`sKյz-}-үnsWQҖfmG.yd|my -ܶJw=oI}?I^}Dn'`Jm#(-d?䱄sr7 {a lEl-svtꐧ*NKS~髵:ʊXou#NMdi'_r-ǁ[#9?#v[q5or.maobH8vmen9?c"Z+cOnnH s+£Zvo܌`QJ5ɩ&ǹ7{X&X`@% s-r%qYZm9;+|#wpvfTYl@nu)Mzw4 q-ڲ@оG!y&``2 ݲb ˌ'mbsp`|(ebc:ާBӧ9_mкOh51Z{#S{'?Y ak3%ۦUIʌdծkܧ-uDi?s.֣tEqɲ0m]4N|KL_@$ӎw,Ukjc4}ttyY[)/jBk07 19I[szw(Fo͏ ~uBVE81I@*Fpec`6a.z+ƽQԏwo&a9( p^nWBQi,'`!@+2<:m}U)ASW;]$c[ء 1r}ݖ9қӌ)߈+#WS".+uȧJ\Ws cϱ0x3m Dʜ[VRrwll`UGoQ 455FnћXfE,B ٙ9w#y ~",llV;#6a"l>&*WM^F^j;3*GEQ9 IKr$csS8F!ػo~M/j,;I]u"[PŇ;aG2Fuƕ5yI")Q5fx AMIRU+6h4ӎvIIYǐ?%حcllGF/;k&" =NOjwmyp^Q>kCb?a p?""X'=nÒ06x+m ぞ Erǥt7WWut+;mԺ'Q}#MGK|Z܃ /?%x/ 'l))f{Nj}&=J =<?,7#M{^snU8ۺXɻ+tDQ^ R̋,OMVNRݤjvd.vȷOEԨ螀Dתw\)%~ }G6 yS'gڎ ST=AwZNjvѽ8b']{ [+dw?{_[|Z6iUUi>٭5j*JYwIX`!?p3FUh+eJT/& %rH|@.ۏQd9<8/ K_K[b[~@C +/6k 8CXlPEMeY1uTe[+t:wi9=o`iwi.֞gJ&6Ȱd/r>X0 f;0 RZj'Bpp՟ɍ%G84&;[5B>ğׁb`#ޢm6{gUZQ6c7.3a.֤jՕIԓ|Yeda{rl3o9BrHlwq!)ģ(- ge.OVBZoq{m k˶%7%԰ p9ti5Bnԏl4NOLgbl ' }Fӷc]",(cN -ʕѵ/Ih?V6>v5FQ+#drvgU^i:r|'%cnA< !+_" r9?x2^{ȸ-otM@~ 4iҍIRa?4\ܟ.le4&(KQR}ofe]Pta(NNh +T}wGK꾝a'm>cQf.M;_{qwnQ@g.֒+[*JO:Ҍ{)ʍG q3m>Yƌ()an[_؟?qo#2rf/nw/Ibp.O#eúiS/DwKuWW5ӿqoԚrOM>_W8TWOfy\6D JÀ,9ݍ?sZ8 v<Pij;F(]ЫzJ=t(- -! # ]R=]_zCASS/{TnmBROGH˵NNn웍NT ZӝI^wf}'Hm^ѫhiMWV>v_~C[_O}Gtmkk R*ޛZ4uT?ҝ-Rt!]j ?_?;1(Х>NO0lrXu];GOCYj&V+dqT~nǀ#r*F*V(Ƣeh!m`7-~) | iYF,9਱h{rÏqoX4O[WRRh3Ȓ"' a~@au5-V-EUF䔧j;OzwN֪};[U;]O`ȾG./8ay J8y /8)`l \[0G?P!~.]5jaYW}Qӊ P4㷓os6@ brQ!EY"u}nM.ڴ{uZέG9;j-J{cE]GKkU35tZWM7/fmw]դNVoZ]nkj*Jy6yޮZJxէ8/xG9ol?JOě! }s1y,[`n9!R ;#)ҜrI ͇caoq N7w[E˨ ZhO?&S-Z\߈ޤ]9lk%[MNVYg;kİ@~p[oc^AֽM*P\m?u =}]UH.棄q [%@Vdd5.xvm}ǔ> b\-卙I(SFU#xvs=kugK. /dly@ k;nvh碭:եӂXg%~Gl^$*la-RmpR~my p<E򯹿Jz:N7":4Jvф7Nn2VkbLՃ ry _<,/QLhjKN G'?%{n6x-ù$仱XP:t]uKxsr0{-ǂm| BMQq3欲{ս3/F rEjV]7u>UMni- n Xf8ݎ0^3pB>rd!/Vf5/V*gz7t嫧jՇsφUT]+Z2n&6,/f.vOfjݝ=~J5ޭ.r^Qz%RryrwgDk^Sڥ)wb7<}Y5t[Zʒ< sw"#\R7[/%#%6utT*iU>._t*.PqU4ޑIY]CӬszN.WdBM#+`Gz=~ 57)HG wF"RxrRg4q2EV(-7ycaÓ.Z͘!xDڨR7y5 C2G+ȹAXstiAr=kKQCUSOZ4'*88߰rZ-ڥ8vGv9K` ጲ۔'6['( /q8%QJRbV>LGr" \y!Crr[<m`Kn. .tz5=>*9(o޶^% #rM~RޫCMJؕ%47o-'oc_?U&.9&ﱕtOTMՓE/Uҵr)JHqPjtNSkWjKS^UZI6~G:z~QuPJYF%=7SuRJHs[$ !mf{Z~թ:x! ?v:NM.QQVꟓaɔ,71mJ_=JFLoM (|W`_ne Uj)I-t/*q곝->pY9z4Tr%k/lОQ Tyܻϩ-եSFc-v9 ~ ,R0.[D\Fj̭=OY>>*ԵJ:h&Bv-.?nњZFMҦ=N]SU=NT-7ɕ(N?Hwkѫ5OO'5dxcGa'tÔi%>޲tJ5!J4+g\}\iZ)+(O7ER'9%܅䶺 x [*y>|zNAicVS}['Su*eRW8v@[/;7ɓilH%޻6F3)5nO{}~Cʥj}{qןzT)Wr>ݒ윇_S}XP$ ^}M[ɷɯ-@Abyvf7"h|ӥJԤue~y}؛92=}_OʪQ0f8Cw;brdԝҲ'r_$/# (!B[I\ _2r^,?r p-r=-/bı@AliҧR>9ޤrT';\,_=[[_d9yc:zvm**„g.R{GCM .Ue4 EN@a"[%+ٌ߰XIk _-\x6BqPqNXڋM5Z)'5x4A*.d {Y_#'FFI6 ǹ{Qqmҥ*nuzNEF+ѩ^-8< WIWNcޮe QXM^=Ct=GӥZMe>՝ˡթ4J?g~H0HŶVgE}~QF*e:tաgÂu\4)P[?'4;c?ܨ\48 potc;70m0쌻ղalEt IϪ'OP*Pmǃ_ <9v|tI˷nid`r x~G!l8/ iYά(K,!{)- L!bCqomv wJ5/^.QFccor drq or+Rw[\x1qwa!~E ds#ЭUJnݟ' 398AF䮡okjF98|VݮI!4ۋ R*FM*튻=oSJE<NON-rKwzΙ%U)U5Ky +<lK^1%y *6CbAk)b؅26iөVjvC¢QwH ?!/$CD n86x`7|xN! Q̖4~y!I'cI{r8!v2bَ=K'JrK;op1H :4:e-5+:d+zMtlߩg);;dHrDd)+F~a|VRR*/hWh {P90zjΫm5:]mvU:8T$fL Kܡ< ;-;slYsv*5ҍh/|Jm=6B`xLocr/a-^][Z>Ыu(M6ϹozU~WIF?ԪsF<7 ѝJtܽnthuJqr::Xݩ:3`6TN1PI}OpeZ9jj.qIvrew9~ G&Rm.B5r2qx&,0+rO!s'bTOUޣTM;ZzGŰpN). a ;⑋9s]=J3yٻ  SR];{݈E;lbIk H5=Q۩ӥO_Zj)ӌ.K|F 7 nκմӧNh߾wG& dr7!C l;mi)Y G/+܊ŜC~P@{pP3 R90h}=OOZ*UF56sNxn[B^/>O~,_dx= {Caoaa#0iR&*ՕGy ňl "r<2`Xp,7enUX_JGQT:NyޡQPr/ql%dai\W /:h5NI҇XEkK34֭RG*rok"xc>ςmN*AQ Eg^=CދAƥT85s=}}.iFv18[$Ń/7ood8#*I9~}shԭS?E#(8J)ūY~qzZKR0Hbx{}Oiޞ*/x%n= r?,9/'tS.JQ%dxcR_O+o _{rsqo/~@DۂؤK[69ϰ&k߀ JqI`Ra]{{d4ak; +C_GjY /nC`Zm,~-m)ηҌ_F]d0V |Q:fUZDtz^=x#%$0EJuf d@ ԕ)^U:'9?sNwDx(6/s.܌9?m_*3}VW9ekly` 7Դ'CUGSK5Ba9w(Gdq~F'`ev/Azc;J_VI;J>:TYNۣns' q`<J˻v  &T}N旦z5U'k}jҩڗs|ؖIqy.1AO^Zzm܌'7RnOvN=̡'ejzP᪫Ki,ei^vc0燰e-n8-/\_蜁q{_>Áp6 !?"'6JNn3d b Kor^\'gZΏ)6̩Q^]d e*R5')7d&NtKUF8ٜ q}_]/e:ҧNPg [ |lT/qm@,g ݃=QM;!+y<͸'HJq~ƣV][O8Gu']:Ui2ĒsfW9l"i'^Kw} _t~+vV>kԕ:unV].jyD,0QrC$wk4ZZ:==J:ի88[3v&8apsr#nM[PҝGc{/s\Lv" 9QgK7E;{w&Ģ`q<{ΝYR'b߻&}#.Aap en;{V%_9\62"^~ J46؍ܙEUopO"qܪsexB sPlluj8v;y0x0Q_ 8Áqq8Zܕ =6C䱊NXnE ң5R-dnԍ:Y>ש*E*R)[tSǰn=5; *~/ <҇Ԓ:zfMvKcq&3VTCvbi֨RNRo/^!I7\x*K ŋkɲiїu9I>8C伄8GEJF2)w%$z]OPʔ^(So|#!Xe{/c cl4'FU#;ɲIR׹''9>Lv '7,7{|d=>JJl~2)YQR':v_kK>\Qiֶ*UdQ5~9F+[[ odsM`K0{ rϲmA,Srw,K`o RوK/KWR.䥱~^Ӟ;wɻ !OuYkPm'?'MvF! XټsPn*+%X#w͇6ܗ/9 K a6'%,X/B|`lVC#(N Z!ao"K?o0NH^ecw՗ҵ59b["܏7/~# #.T!%N=$5-./)=NcGGS<yˌ.=~U:z~KuZSFIӦ9F7Qsf'9 mSLB@\\peM^Gt}/O4zNME"1݋{܅{]ܡ^ʖGNr? ֯0X}97Q՛Y{iJ&Ivpث%eZ.>8' -k`ۦTx}fob?ZK{5I~Ӱu3}FלOÀVK)>c}}:/'F2.YE|ɻIQѪ{Z2{}TnдJZ3dbQFJ1q= *VķQ{b_#tBĎY#(MI_9数xrNG|dr\\ \} qp1aݐn n+õ| [kA 8 9~V/dA{0 p7?x%nǐKvΥj\/k^op-YIg7nB Yp{Wdj1!~T}=KtjД11{|]<`.FNn/nY  |o,[d59v(p1B`/tBÔ6H|\-UBSzskKYK0]^O;՞\'jMs[ ǁ~C{-`or-K%İHlۆ6x+`lZy?A>;oW e\dwm8 gyd[;'6oɕ9YݥKdB`7c/hت.M$eRbdɃ܋b໫dp09|enFTjn NAT'81NmM=x8fyֶۀC8CV1jpWŮ/ak|PomٕZS80݀_`÷f( *d`d ߩ:VZM}o9;}cYViJ~oGA<xXܾI삍+lV5^OR+qqvx' ~QG!a@G2x`YG_-l\l<R G "2T/wc O^ |Eɔ1n]^5s,O&RZ^ 8ʚI@[XI41{f <srmj8}яj1'7J raop Ňܞ m28[8C pܟ[vMׅ7N3W479pۑ d:z}:Z(.qG I5 j)i Q;pqՏӛ8D]eec(/zOQMy>Nq^/d'%o$gN';[`dp? em ZX[+tVIKQV:' 0oǹ,8.,Bnw6UVӾٹ2CEv؅W(܁e^@<%#l.7F쿒ӊғ6UppjeN]\3=Fw&ƫXGP9 ckeS~ *v;zMhSӕOФ~ң(•zTPЂT.ɬ%,?qdV"Dٔ_?eʭ=&5ow)5ɨOQ79jG!IQ<mAp r<1|рG | nC8IӒwBYUݘKZtX˷9Nb? r6/`LYBNEF a 1#K[`[xX=/!·V0vvtUW;^ƪk5 w,w^(L,9M=}muGMJUKh]]Jr7 ~G! d)SVؘp/ n2pcgar 8эG$j{o/%6l >}GQ}b>#^Z֥ s` B<, CVB't}/Y.^=J 6xul6kbcÒ r3aanuvT%RxJl,otk$-DX(li]B;æy݀?eRs{ _'zMNt)եIwTjŨ֕7kn*t85IW"aȸ{ cˁp#zvTuPx}$)w]{ohiT)J鸭] IǑ#?^P)9[M/9VCI=;UiV iW<HtS׫*PĤ?% gl˹ǖc@UK}Iv{\ŕD7fQ4{wdjIѩ(J׏Kn8رS$'[ qF%n8l<ت/^[ߓuM]zcJufқCV&#fU jÛI) p}'ѽCtZFK2iu^l0،@2(fs:5])w-Rn옶Imlɧ!0m r8_'#8*v%9+6ؖ2bݸd! ,[Oz6v5NnF$ܠepȜXEqTxcd`R `(jorـ8y p-X+٭YZUgˈP܃% !o~6R~ 8Fpd~K`a*Uu^e9I)K4=/EQZڲgz>rԬM5rti eT]IsC9NJ?dA-xWc8.ΜZrpeLjjZ%bm:Toi,0+>_(Gi\QGJKpо xۻ'R?p9Ño7/$`g{ Siv]7.R׷o-6hJhR=g]CJj*#f"9x,^m=4$)ٺNo 1qsUQOKQV4q q3(¤e8$ui֬N4 .86ܣZBY=_=%ENo--eam_+CZT)]EIOBtZԡq? -xp]ӣK7%V܎zxY8(:zwS_ܑ5W?T+[ `9a7/Z*(N !4cn79 n_qʑ`ڱ; =?Jztakͨ}I5:CSF%%'#Q*cN?N_T5Vj{;.r)S];Up8( B6oarŤH,9e#8#FbžE.%nnVSlɥ˶'Xn]Ubx#,U;5zj4 M:{., .;x'%'#_JsVtP%ghÑ &|nK/]X)&;`3(䃀[;e`ؖ%v|{y%7cPx(o3b?Zܑn~H^G97-D^G;#@ʹ誔'5&[[Y1Xl-8H[]D7U&x#}-al$Fm*tuzڈfV1G.F>J#D,SrsRr ?-pq) lD5*W>}VRT$>ޔU5{iP#GFg?lCv ]X%䜏&}|UM&|X[7{r1r{_Gb~`ؿJ_!%./a7EɻM^T*TVZ/+%n>~A6/1,CnH}3Uuh:fˬt}gGս>L% @e+b܇_9%s赩Q4V#$PH9֨J߹.SVnþ]K滾ľrT@R螞u)w[jz^T5TJk-6YLIWEsrym/p/R #~G;{ l>@AԌ>Q|=ඳ1`cI JsZ{T8|l2 7P`$~oDh[:U;Y'KG]UJIsxQMTdׯ:UV1JmN29Su:EP>44z7} _GzNhA(u]^ԪfJ]RU%yMr2,nW=Fە~#J2jԴN5࿺89~>p] 7 &Lx2/I ؅/:QUԃH߶U%&ҵZ'% dAA ݤͽDmMSkYI%gw |2%= bۢmad{͌]7l?TG"Ŷ ӲzPttʍ)wMiꮑ=Chqjlxn",VY8(9Tl"߂Yak1@ ^ [/ӗlqصM1QF,~Xȶ~| { +mPB<7?lyje&/M5]MEN%9 EdQV2k&{I/˾~WPӮ_s#{W{{&$Fm" a#L[܀_ɻKR)IԦ}Iiv,/?%N09Q6!d/'%[=wSu?WLɿzuj*Ou\߻"|!y |aTJ Of@ű?!|nN_X*8%<$ܬmpRprdv,Ǔu)RTө7"Sj)+a\ =M=Nڊs^.Ox́96BaV˹7lVBb?.OdZ߁ܥqC(^^i Ѻk#MFuλ뚥[YWIYY$<t=>QèUtt_|tm?P躉Ue{? ΓOI5uiٓVCpL_+8le˷bIY؃r.8^= _Rx6i} Ѩ㟻b+6Wzu:TORӔƔqXdq<=9JOw-lK.Zps# :'j*4gL;$y5$TsYFT!ZJq4p}/@CX2pQJ\o 2]D<Gz=oMcEЏo|\ +#=3-OW)+-OEʖ_G?'#ve([P/{nh7,LXGXhUwNo_գT'#Pkr y!b8#ub <Nܚe.9{[bq@%^H_tJ19T,. Br\SVB\$//= dl:42 L%^=O+˩U[W9i*t|b>9'wDNp Cd! S$ab Tw#m~8IpbB{7~ų li)˷淖jȷ ZR [I9#.[1{~>B+7lg'9Nt:mo:ӵaiNT( ǒo>.9)zk:PNtӧMSܦݿz?[SM]%:mY9F7ǩ:._;P)Y*ub(s1VB+pO(=>ZOPJ餷=^뎫O .g/^Yn{5=ODKSvŸ;zWP]>} uQ]d.6v1qv~HL<|"v5Ӛ;y1n㟀/p8ؼ؛1ȰGGZ]ROOfKVf%[.Nկ ][ >^]NƥOukOUN[F;Ei/eZ.7 oDR|EJ-;3-~GJFԕo8=8c^3rŤBV-L/8bÑIKe jօ:Уy>Hznpv]R[l{KŁyqiw4 #lcg[3Z'#rnRn[gb0.fIWSBFV"rB˻c*0 F5r8&\-*,#;#zKhE.R3So;~=uWSVQjx>k;*Tt'~7Qn ReE&gS0{Dշݑ[I|܁َFb nB [2x IA ɕ8w'.ۛ5t#BjF&%C=j{rV_ÛOpeJnL$_r,^,NKm m s$ѿOR*o~jIzL!ϙQzOZJW[C%tkףJP^zպKO?tlW6c+d Ny/х]D!V}o,z]Y٠J;/ZNpT+UjrVPw /lYhZ7h Yn8r

WLʵS=To'n> NC#=^ \,nb޼EŌgw"VzVTTܟW7r4xքQmY0]gs"_zj:}Zʍ))Է^}kIKGZIpsq%LcaXgbZw}mqȱ>E9?bp|?[Խwi{Lt҂kqk4jgFH*kTc9F+ݳ *# ӟWI '9R:?*Z=g';Mo2{]l$l^texKu9MËnT;o@^-ͺxBR}ҹ29\ZQ0nNMIQ]?b<0༣mMDQ9[yPAs/9AG{Z~,EJN+ѕ)Yr>6cnP;gYTij8evM$ ~BB}k:u= ]L+(CM=]]4NP{]^uYoݳB`y/ qb-O&_gf{.B 6?"~{K Z6iu Ɯ{W55fcp 9 b -͍GESrn c'ME9#vti]9,}4K| Xǹ؍Xp. l/2D1bkz~^aVQOusiT58= 2 9' /6A W 7VhNQR'(ws8**?qۋZ}&4Uzpwtum] fz#'u7`>G4'IUfKpxgֽk:VT`'ͷݹ9y`f*k%bRRI,ʷ+Y#lf};+,ɱKgVJM}HJWWF^dyC`` = }YUmow߱'iKd0R93:\#vv gs~OǪ=MKRr#_OoS贪VZR;ayJU&|]'4-MI_zxF ݷpPI(Jr`~ߒp,k؛_9 v vg:lDs\yl9 螣MV}Q:9vRW¤;[i,{Rc{,Ia-E~C/lQk=v~JP"(=9.-ab䈤A gJT"N=m.RXݢ:4:VQ36A)T{ss +[d|20RT&F܋N9.>@V24L{J' ʜI8̎'6|09'q+p@lK=k93J2om?e̙8` <_7~[%E-_$h2)fV1jȜ?q{ȵɝYBMvG| /w6aelb{0 9Qy;4zZKU 4Ro${}g}K?EJWkR>acۂ\p,KZ}D*vٞIν:pqb;_CCRn[ oky+W..kw OB4hQ%F6k?5s9V`8 sy |X.[r6aぐVobppR>~@K$Nn]Jq/7AGs$m x&l-7c=u]%V}>ݯIT{fdnldK~F`+ Tv{H۾SOOEwT.دwR麎Svi;=5_d:[uDjkkʧj}u9叆T2YTIJNV{r>K|F?m-iwdJr9?!Ep[+|ɛ{R0LnBgNTݧkO2)>8X()l(B䒳ù9@X{XKW=]_+OO&Fӻ-&Q]z-oX#R]#Μ\1Hq""peU莹躉sr(8=[4cQҪOݞ!p+V[Vx/rlnVB1(64Gv=L:F_LRTח/cƔ52 9Alkԕ7xRU$0!a>}TϬBԤў\S^EVY>O1I;2p<6" .nv -Ŭm|th_آᵋ.3T&S_s@4/!39S]:XG55+vGWXMG J$ܞF-[Y+4$-[ZKn>P`[X]"#n?#}yp/waa{_qvR%Hp]9!x /$a<,Riұ2"(? ?%8jW"8 e%xc7)-a`-lp.OΤ"ـ*+~KSRkOO:ΟSIIJ??_L隮IO[J.f }ft;S+;\i+Kdc8,Í*r51SpOb 8D&yݕlGd\k:yvͮۚ''9tm!(^RTfhjiR8wYy5 zKIҢ`~rq`~MգJ1қnu%%`qq?"x \8)7@oR$.EFsd|[hN5>Իew=AU֚,vOnyop9,p$ܝذ7l8F2S(8-ɕ,l8p_8mijΜf.y7'8#1b쌒˱ r{ v8 ل>Cqk`F|uʚЩ*l%993Qv  2[<a{AU&3Iw7z_:3ZfmFjQ*st~x`đomWw˹[<Mg8 {-nVȭ|KIo?6lK=AIalR{ Y-܌{qo"Ðl #b 6vv_Qڱ=Cbk ~À! fGCHx.7b a`qԏceJVO s<͆g b`#^cئ&wrRZ6V1--dU'I$qnKnzZ>ijUԲyl6ې<~Dw6j(*]_]،XrGs:PiK{Y#Gv+2?ԗKi;̾ ߸bvOÀp8 r^=lB:q<_;rwi5zZZ jcRKvTo2h+ktr\l^,K-Xr #ZjΟ}>}?/~VA ` `~E,[b?&$hŪ}ǒ#=rw(&$~@pR l}7'/PF֡Q$WwW[2iUi(vlZOɽF͹K G|[^}'Wq]Ӈ )ԥ^#,ZW6jeJU/F=,]tSSY9(9{H2r_?2WٍfNǜ/BojS9)G׺j+}q;![$_gN+.dx` ܴ%K1n+vi=B+XɔiI&w~(qm lO#;~2<`,ݥZ-S_i~殱uj} 2 p/9?<?f6X.n {xF6\ G\}I}>-zzwPUE8zjsSpŃ<܀p<(JiOk~zNgϖ{dv1*{T0"À _؀Eɤc}WR ;_GeNOM_ܚ6PӺRK_&'qBN7I4kF]vKjSė>ԝ.6 %xaƬf8(νdtJ/qy b؉X˺V1p8rK໋d r/-#l)JK F1߱^L'ujVGyɿ,ǵb?NJOJM٫)!G" d-d27rGVpA M!++|wnbÐ-Y;7-{"︵<1p?"n,=/ `$6[kVa:c4epx*lZKvp2gwSi4KMZN SJ6엱?bD<|r?_q6}:}.W lX8-9F˾p9b| ;(o[9IYɻGx/ŅIAč0?ÐDu=N/քiԔTԒ(@3IRvSػ3֓+]cS:6̯QDJ}о%jŎض7B?]}1$kO9cbG#`Xs ;4WUQRrpz]VQM56-ao Δ\Kۥӥ*tT(?8:}W%Q'k[r 8ȍc" >IࣁŽ.L͓T] KaGF-b1r/ٟi=]龘ӧY{J>6OUE+~N=Kޫ蕢.')A,>OUBehsSY 9*ۨJa(VFV = ` 2-ʍթFUc;Y-x%+3p-ONR{#\'+4A ob@{br1r'#/UnH" )ԩN?m5yK$bs~GRu%i3G$H:2V8'd~IFBMe]C奟+Mk^EUBvw@nmj=C>ZEU*=M_y?:ԦV=c৫ޥGu:ZcUSw|~~j:(iV}coI}5jkO\t߫R?GiV!>6RVO]*gs~dnlrwA@BxO1r/"VI:U>_Ʉ/b/- rf?I2ߦ+(dg;PիV {vYt(t^*4F$>Ok [֌xn->КΛ2ԒqPwk/zKsm(ooqpw#-I ^X= .#5R]σ!JPFj-{.-g*iSRSW0'䠖x,.߰a|G x `o9lRK9,nFmn/9 {,x9ʝ9T_M٬:%fsF`Zbn>KAKd_; Ȱlp'?osإ E> tۏ'dcnCxZw~@& Սc 7%er1`7,>Ÿ J*/-mioA6/Dˏbl_!b^ȃ73(l{W#WѢ*Wj;BgzG:z?5{ݹ322uQ夜yC+bױ0FNEatW_OIKTvWx:I_ FJ {=ѱ.TB3~zjeF4Zss Gg՗ӿms_ns%µK-(\r{nUkJ.MFiRWis>^u(Q4iŸIa~Oǵ4~IA탞2;Ksꞓ;?U/,nO!sW]OKBsXuFPf̔>ܘ'L~߀2ӗgubVCkr<WȰt'WƵ)Q5#Gt|"dEȷfU8ş_GD4rMCEYTj-Wj'[QRU''w&s<]Oػ?-[6UN)}96j_"r(ǹՠ k vsn86i˺_2jeVYʝ7RGS隮[k)JcXc [{[,Xsȶ2 lۍʙe;FxopCY='#[<9N ]\iv'ܯ{v+Ft(;SKKՖ봾c2mS١ԺWlzҡV5!5^u&8AthT)veD1!H em9 7g o9`wY`!^rA~b\$o: zwwf׵xvqdCq۾A?p[d,0۽`W$ػ d1p'< .]O92Qɺ7SoAeSj*Ǐ^sN462~EeNI4cٝZ }^^5M¤r6u>굕MfusJ }{pʹ$QI}nutaj>>NȖ{/%bk]|"~JC9R %cke2<0QhOO=fUj9I yA,+==y3췹&58B?.hj'NH& yt55j7$/pGf-|bÑ,ɔb.FbohuHu {~Qb: jsRuI'ln+s/~I偿 `p-n'._ ]F=͏^U:74g|X=W+ʖ8_Ft(6hlf[alK{kɝzWɆ a,٧gZ1bݜ_;h50KWwmmb۹eVK\_Fq{<s[q80@-dS!H<9P|U&{rP٘w:Rw{ql2YfД!uV(C)Q~GMn&wOR,}I~oT%VgoU2#RĢPzYJiIY/2ϏܛYi:ҍ*W# % \BM2jkjwש*` =/U_G=U:mѦ){N/*bpNr7E y| gv|2_; 9_k0@1mZHyd #w/ ;{o"vb |KWBJNƧ&ȬTKs9 ;0Y/(vWX#.?=/rOVDr8 E >B { bc]- SWuӊJK.#qE-P~NONTu1zǽ+G ?9F[lG:yMʝ5:oc= 4O{=մ}Steo~Qu>RK59b< /t-X%޻٫R>u5TPdq5-ӱ{ۻ/]_nW,-W -г-\*n b{R0U&1bD٧N N/59;\^I `/< <"/q8 akpgFH-^NۛU*5% J<`%[crv`,Z;{).݀ -ȶ>Gl-pB]G涇C]>:I(v}Nܨ#9Rm܄y)JvfWw[%8}Is:-PWC5*lGo8m,p?PԢ򍺽emdywKkE08l ܀r>lXy7j8Ҍ;Rh~B<`~X BdYNMZĻXm/| WSɜu2ros;n7p _ =?7 EˆCvxo,SC(ݬVwo>&'`N=DZ~/k]e ,r`F <7ؤ.+،+ؗwkQCXl=gN*RI6Fl9]_[R߀8*4ʙtN٪YU?J9::uJ ?RMAY#` sMnhu:9%:MwF9ӵTSOw9y_8{ 9o =8m N@~B1r{5fK`〇9 ;l,\b; ):#=ޭީ֤?Wq|DCG'ڳbv,Vd[%-*Y5Y`2Zrox&@@Hcw;dFPO]:ԪkkB-&zB*}%jK۹_/ZECy =/ ].yŒ/'+'"//nb/!"ryx+8 48&.8Eز 8 c9Eo+,pqyV1W,-؋| e?b[?6O瀇z^u]Z>YE&i:Z]3Pyx,bFFM;8a~Lyp? & |KpLp I/ac ~H K;2W!@ٙA+\'+ g^ n `u<(6QORQ^Ol(Fѹi:S=FRQU6_'8AB-id˹!Q'G'|BۍGf5:y֡:t(ŵ''okd~@y{`pG-_b:jMGvA:psx[:c8`uh')U9N=.9ӛbl=Ҧtpbݙt-t:wT>5.҆4aM}ϕ:i^OKzmXUOQRJ=?rUdY>v0 v.HE zV`{u *Κ%%hUkc`,?n 72_vqy or,0E ǑYZ㟁 ^P|oo$%ZՍEz:VMZ.c'ϰb~JN@{ncx %rt53BtcnWthy=4 wl _R^zKFpW~?=bX5%ڹ/ܖgt+Kc7@[q=ClG p/1Oy3Y]7V&MGW*5e a5Y1&#\?Fu*F*id%zugITyVl`+n>OLc+&:4Ri8{5ZzTNmEY4k=ޙ9?o*v'=?:~/\n|oY~Rɿ~tz~L!o'N\Yq6Z}N}^ت{m`\QN]uPըJ?E?6JRyGgZj'VnN4Jjdp6doX秽5벟V'du=#W->׿(y%xg.31&q?XŲ r]Jr7| {\ l[)RE}y0S:>i*a5)Aq׭tޱ>=қJ-;QӦ:z%)49_vة_b2%fbor^w'._TْX8 0Y;KzyjJ}ǡ:ߡ:/ovj4*ץcg%)1xΟoru&=:鴪QN{˖y?ܱdj ,o!o { 8/sn9Ȱ@]ۻf-Ž!orǸ@RV9-P]+ZD)Fz|nT%VKt%tr-;\l8r/?llɲG29f<,Uvj^IZWeUxAw`n6s[,68*CC*y>zQ<:z5:e9n5^70D? s(SbdC8cU`9! d{H kU/߭t:ZhzCG`$_pecb3N0jjM 8;*wRS~=rXjN*8V~2}r (IJ;:RT*J h`  #|=7UwJ5~%^p}*tMY#883~>\ҷzs4w;:_TUN8_ǹW:*FQvi@ xZ"Fl 7CIZUNNq)pLs<^r-؈Q6UUM•WN}u}vSRcI`M2TX,-R {&,R<09B1p7( r/̣.֙_S(٫.Ru$1 akB^L܁kd{V6䑲5tu?OG /K6F=*u^ը($攗-zg.]GKMMwq-MY96߳]MNs~3C 2czT)yHE5]Y&L#NK$ܑbdF$¼]x9,\]Ud=}-% wԗj;=G_pgt,<-oeoOЫ4QTI_]:U+Ia$y%_ܻkJObrG{<z}V)ЌMT'#wd[ `G̡RJ.*N͘`_1> 3r-ٲGJf]Ύju=LՌݿBϱ.?#vLJaŅnG dӜz)y;*](Y[cy#^y\p SpSR{&wXF#-'KgNGbS}{{bŌT&mV ȟĸ`>='u*W׭4! ;]ңRG6Cu jy_E. 5js /r6t@nKn7*-;[;B {Tb' -F"[ܭr@qQ;ֽCtŤ:pʼnڊVZ|tRu.r[ rpV^(G&ycfi 1meH^|c.f%|`ފ?y0 vDHlQM0$!Rv0BR1힇^u6U78)ӕse%@-a`,4^>Jp6%`~Kֹ?^@ vܞSU4 .u:(W|_8dftOnKgOM pk㧎kK)J-s~@*;'YRMV)7G6[2={=kIRkt:J򡋷3Vws=BzwTkka]In`я@Lv=)-?F֡ݞ<_Uz_E*tiY>ȳps~@FYWGZ5NPsEU~JM9 Z! w":zn[Nj;rFЭT'~ղ4 r4]Yp{Me6'GV);"&,H-! Whn6Ғ55х[9Y۶6RNm&s ݔܝz&NzZO7Զ?b~B/b[%HywB^7K;ݛ$9m3,XYl?fXHS*5 <}f)B] !+8lb ,p EpK`y x&r#-9w{##=ac'?9/\X܀MR.7/㹛笫-2O~EE,<-06l)nwdhG7/Olc;2d} =eaHr~-aaqT})밫:V)Nj)TLE[l_ gq?'M-mz:yЄa?Խ}Jھ `.4_l"tmFSWeB#FxUͨ> -fvt꒜48<#qtVd[ p~U)8{E:.b[xy(ΉhkGESrI Pt~nC=E1Q\=TiRRFT w{r!nH)?'N ʭ^F?bg;J'`[-Y~٧Th[_6VV_I>)9%IX9/sr$Á^LmOMKꕧSO;^Rt=GEֺUqa($x$~I C[;6!x2qܤ,RvBI'A^n`SңEz.J:vʛn,dG6D:_NkƖ2/XZzR/inyܛlP)* iV`6o7I^ p0%HGgoevůrrN@o6.FJ87Rd!r'䨜_%&)09\nZjN*rtӳsN_# ̾{\H ؼmcw &p}hu|޲;dj=.uWI^:y҄J"ipȖϐ/E \RPSݵh"Mwq[@q%` ݗVhP@ dO,㺱,`Xps:y}:N=DCOo݀F8@r@ - R5͍~EuRp<XpMɜmɏ!m$ɶZ$3F7jƫ`˲VE7{Wd%`QY`l~>k؃?cm:nxItӅ\|V"Mnbk,bZi!?Mw`l te m{W95fD{ 0ey{"x;:GMu{wv]ˬ'_=..k89ȰA~Y-]E)B1KV=^oM5tg­I9[ #4^ 7mi몱Qr\I\VQ6aq:_FPkEQǹ<ǵcm\MUzuC5 <EZmvG-ั.W-KaqlN@ dȷzo x L7[n#lnP,6iJXӆe'dz{CRSWN=[Wϱ.۝=>zKW9Brq#. uWOBc8qh<9l-l%*ro]EY"._{9) %CKT+c=i>ҥ(T{kUujgwR+ov71?xK$b8p)Rw5vHp6 _ l[6KB޺9l.8al|k\KQ:nJ'M٪)(ǵ;Q>z}BYэ{<ue˹''=OCY*rm> QGJVGl^r6Ғo,yJϦz'Ss8,-ݓez} wjnտvDp/I`Go65aZqvG<]*TVt)a$Z'*Ub84e7)E<.fR{/[{Y܀ RG@qwgV~q]/QuCKmrV*S'X? _Jnkٲ:7URZJa&Qq|;4WYVQR*IEG+O$}ŝ[nO`wctoJ˫YI5OϿӏl܃p}6US}$ecOKtu^Jwӧ9(ʣ'%o k| RCv4vn-TTx/lŅ c8T{ko`_ 1o?qSER{#LTq$fcY qHm bԣ:o-O-JNft9Hņ aپL|ƜRdw[=3GYMRm޿WDER5驯=tv9s?pU>_2_SOOqjLjR=<[w)Q>}w=/>'RrT> &='Vˬt7U:"^Z-\+*Q5ΫaRtNML"#kWSM q~tcRRByalpXǹ5pY9 _} -c$|?jPQZ"Y-WJ8MNh;>Yi֟uIkX @.I{-0Ni5)]+ bȵBqÁd<2lfJ+ neÓo@WG`aJ;.9wnpa:QRc)v2QJ:Fp%o`B6=,=YFtkNHԧ''t̪VRNR_TuJ0y|E&o諩-3t^~mocjn4?#abw~)jCQJdx:U$0R'9;. Y?;,G*Ӣ^996Ƚ60VLuu,_kGNzt*֜SV[NWF)#G|7n@O5k/7rp? 9NQWKr= BZntTq9y\(`? #$$ݝ󌻕9=F]_C&%NRVRR)NNGe> Jr4̄gsR%FWk^<$E<^ _~w(#vBĮ6A;"wkU9&@?a1#~MlvifSBZ4*T5y'$ڵOE \ʔ>H :?UXC:)^kyn9j1In$] kSmlc%mpojB8n{\GQzp{v9 { `J6||C}H)XwZ ܃%, w;JG)= M@cN[Q*NRw'OKM*QfPN]G6SRھ5ܜl??V^{]E" 8!!@Cdf[%͒R4W5n9 '#3ofq@!V 2B#qk[FJm߂wln;pYI6;#54r¬JYq[3=sdΗk7&zm2Žr9|Ml&Z G7 p/ `\lY6]yۃ$Tն28#͇bRmz}?Τ*5 bX8kdiF1Ķ 9E,q9y-3TZ7u]^v.w0uJ-uJ0ӓX\| )˳&(D]mT$!@!Z" /Aln稨VQHj+Fy]}%J=Cp5ޣKP%(CGRХ PgI;IO{[S:^YF(GN'rxU Qc-pP3/K qsnT%(fG&q]97+I&9n[b6e =ͺ}EM5UV&^:Us7)>[5ob{\rU b plN@e mŰA/l p2-pC:}vQ݀E1rcWtbh-sl%>}l9r!ax!l,O =,RX ]nQ`\[,ZʜSyv1#Ec͑ќi5Ͱk_6^C 'n,o`E~FI&l\Kub-\ܷl .lXNQXv#= 㛎Jbܲ~WcE* &;$pk(M%8ϵٚl3ܻ&JY7Υ$I,AZ]:mkzCU*xR~?5-cp8,Wv|ܯ!a.~~F0<-^Y ~nca69F+),d(Fg(b6Μ#)}Ҳ1vO-?>F#ȿ0BrEz kUM?|Dp9l&,!\,tPVNRJSQWK٘,?x{d"^w_ k+K;{ù]Q-v4o-_'=;i~Q˒Wgұj_ -IG&=N%ijfh} nJC> Q? ~nc#p= 䛖ύNCXp@|E\^Q8Tŝ8-`&Y8 qϸ͌vIɻc^̪=oMh:MX)Fӱ>MГhU"T|rk撄sR}VQI>b̯b1XE.7AWFTU!/9(پnc-/roF Ν7Rz5 Qz}Xw._xV^IХ9?'go&Z"XxBDh1wvI:5]%yQ ٦j#._fPY1~ȌЖ(_tj΁BjӧR[jȤlT~܋{p^pN2?( +kdWد{+1_l (v1.%y3N%(iG fN@rNUu1(εYmjZQҕ*vdѠ rŲL|qbrNG Ee= n7wL\X/8` 7`,qyɲUFj?唜"d|\m2m 6a+8EIbI.Sۋ*U* /8TWbL[_ܲ.9OT~|oW>HU\XlFY~CECQRyY^7SשhR JIa7ry䀾^ br7=#ib/n,TYIwreOotc PH -lU\2OV[zzN(]Mw|\n3%&ϣ>P:n}޿́Ia@K`ss(*;r=LVVyBnb^Sv+p/aH:Ώ)Vt8=EykJis\ 6VJyVJn OoךY1QO䬕IS}/[ O@oR5.IG d'b#G$+wxe@,_qrkh!-1p7G|仄nӨʬSgf*#gU+g?*?j?>l- ـANzũIF]F=[[=V}&쬎2  _7G p_ 伄;q{ gnC n'#$M!n.m8%pPA;2">?(TsU?O$p65H΄jNjONF6E~'|@.ɱ|W!ɾ <8.YpŅnC(vvrİ%ʟ %7w)8Zا%[3 Bq!gE: ^EWab?tXE9Guc ^ qԂ0֯赮U=E.h/sUt'^008/`7 ʲjE>߶>y*^ń^%ITsd\6=˹tOjJJ](9VG->^zg*i^+ll>};aa!'aȊgdL1p=7RݟMֽ}PzRsV"23m9}zNHrzw4:NMrQksGի-=,}]g9/rO~r>J͚q[asb/qfΊzE-$J967+ۯ=K.JUJOG)oGk'B1uCi֟S:Jqc㱫+[/pS xJu*>rNtTnX }x 8Jؔ{wD*^ũMuk>kՔ;^ƙ;cdg u:M>'Tk-w})GlT麓QD{eDZ9W Xr6.j~}־> *s=IOEFXB{ Krdco\wLnm_?2cJeKsZ-] U#%8a9A\"oPwܒ["װ3gMٮ6iQB wui[QB!<(ծN6a;d-g9ld m+^{\%<#r RQVN-{[َp.%FQyNIJ)}vӷю6lÐ>Ҋ>:@:?Oiz~9Ӻ|{qcdJ}' IspM=%,8UE&odSM5Qn뫼nMkcr28Q&/m"_[tGQN:9RtG8iG 'Cǐ=r79Zv@n*SJ槸'2|=я;v;-A x,b9:]j5Ԫi*ԡ$N^Oz[裥zըG˷O޻/NOERZ.> Ȱ/_ks*0_z4k= QqVD˰7Eܜ,],9d0 |ɰ_ WE8BKvkqQ7iiŹ>sejk5 xج9OR2cuoSZ򨠻bov؜\]![C`ap.AnQ2M<*q-l1<@ʜݛ5zZb%\Ep?}X,7kp߸3Z0oYԺuuJv pl8C| $/ o#`oȶ@l CkÁkR|b` p"1X {{vߥ5{ObTYUu)M,nc8AR}quG~lK[?pG!/ зL.յx2anB˻&=[9YƧ+\/CWQԧ#}~'Hk:z i6|;TW}ݶL' V9B`7SgR:JR9%G<ϵ[؟8|y kn9^$A%qr3f4U}YJ0Kb[N*K'"5m K9*=OM*}+Οr|TGn4M5{O|Ot.Ծm_\#ˬ5 wF =ŀ~`<ol\wg,)acq2?ɏb[X3^u5 blȶ1n?" 0bl(l?#skv.Bx_\Zr [56iu5F7͚%CUIҩ J,ۂy^EgvI N|oud`.?`BrǑqp82IAI.LXϰql{'6d0 aYlUjQnσJІ_ ZqRrٞEgno.7 X*TV} N2dn^@~Fȩ!qp,kD @`T/A ]G;lop9%e#f0K| ;r_!lZML+vF}9u]t5)ӧ)lű gpWfceG8a_sr!l,N a-q!nna($o  =̢];2Ԝ黳`@/LޛF. dʥ>nNIgx8 ɲx)9n;l rp6x`v6j~ߓWd2p7,2-fЩ*nKN.ƙY9r6@n_DiuzϥRͯcoER8&gkK">X&]v|`ݣ{U:5;jEmd)JQ!p92 TSHT:spqkN2@[| ![a (RuYn:פ:IS^鵞~|O[#@s-'}}{ppXJĵ3a?cCGC-y_IEbOWXx/["0>PeOON9j&6eF_1l{"q0iǀaB-=%嗁{"NFW-ZtW#~.-w[(5yx[`ݤ!^*BWZe}UYju~J6@-&}5~ӟ(Q w:Ϙd@-AaC^(k!"xaqn/B6KJ=a01nka F ]drm+kP"эo' e:rkQFMMmcOMMW ![`an0Cਈm s@Ň rH ͷn2\kn+Y:4T}L)dݲ~hzzV_Z>UJDZX(`R~\KmAd~Q䷾3QRIۆerI{`y G% 8 K#i%\]'%?[&/录!{#w9 (o>WumDՌ/3­}I*yc#v=oW2u_zRoWpNN 8 P r / Ч*#N 2ОTV]{pK1gB] p^. U8[ s \| и$n\Zܟ j5yX6.#fa} y@xc]Ip[U'+rtK__J?p#q*]rqr8ӛ%uf'VOҽ кfQ:N_{!M+SJ+>R|';t+OV5i7KغEMUiT79- IK_ {\f I|]CZ5=njkޒEZOv t= gi;5aL{}n%őc'hwV $/"[c(+cOC !bW'k6Ny؟2qkǵ age&oa8@|fےr?[ e; nG:('Tos  )#+lws컓ϸr7JգT8Ք$-1{p\dy6m0Bۆ62p]dda9FS^rdi,US`Np -`RY{SlGk큲 Y?#8r?&T*,j6] Xq\e?ӗ|^ۍ@,n3cy,`veRNΟSw9bp8nql<:kӥQ/ϱGcOWSSQgi.ҮqKϟHK<͚m-mUN9%{EgNskp-9-җ{}cSr k2v#_p{YgSk)Xu7O9ܮyo r&ُ#`>@,wG&>kn_[|̚o%wqnA !g"/|5-VT-rzhT}i?GAq|l9:a#)JOql7p9-H;|n%nqA<^r37_ Ӿz<4ښR+CڎSR!M *rjĵ챹 qRq'iiJ1ݯ'dVZn;qrX2r_c;GrQTQR]Rcv~{#eJKY(5Fx>:=[[OF!BO0R_Qrz[z/)(Qtg}5Z#Jٞ1#6BA#{ay. 97S֫ J9N1Wv[\ZcDXbqK+_y7UF47MN@;G*+Qj/*k%0:ntP3b.:zjJ `{ d<.?`7w`5d7Y//[  l9+;HQsb:PԵS_Odyp8B1*s龢3:J[k5^T'v?,ܫsvWWKS%n)Jn-9*W"XfQMӝGYy$yU!(IIc9{n&n66Q:=N], ٻ7V]oG䤱NI'|Paǰn?!̡Qӓ&//redXl8ܨ_r  qI!C? =ǹ_7 <GgZ̭dvb[=ű#v}H􎿪*jtV/UW*Д'g-7EQV.a:FQkiiKOK|[0):ׂU:0%dIʾRN{g꾵Ӵ='QKS8UX8ƕv~/ZQݢjmX7&va%ȽYvn=r=ʝOC.9'.tBKPӧڢɆ1 l[- ; 1ӖD'[%Al6@9/|%UaEgVnb ԧɤjrrmthtU{5jԕJRf.'u[F1Y#Unz~彎$-X+p1S> D mFx.tNa'c9orr~LBFrݝ6Apa,kU;쎞kDjМ87u>_jjQNWO3GtMtjSXh:fO:wx_=m >zmy?sw9{¸ X1 ۑJQ:o,Ň IZ+zs]&(VG~?OVԲsƠe_`n.0gF0Hr囵jJtk1lr<ttiE\ٯ]ՕJqX{ qX>lNGk b/ű`0e>k+~L_< p0H[㑓)Jd AaCb} [hQ^0W&?#ܕ0n91[%7_%r=pAo ݀rb] UzZ=j*=+ӕi¥:Q<ֳiFJ^]^}_zm]MKwԓ8r^~H9 (s?ۧTՓ1c[K[m" ௛09[˹X`,-#7Rj)97u>zf:zaQwEY3=:{_S8KP<;5jJ1Nӊ',l pE'أc 84[]]!JzǺn6ҭ:3ZQYޤܟɢ&;#GIP9{]1y-v /^w2~`?#8mp[{;eZjs 5ÒEw4o_UӺ6ԩJT*1| -M}^ǽ=%Ժ֖u ^RJ*eI5-A8 qbX{8MF;NEF+_cay)Lҝ/ FWFg߃]w.6C%bsSnnn SZG|r8r~'#8Ŋ.OeKwZmMG e4~!}T4QO3[6y%JZ[>\vܜ20-al /;d(cp ڪST{/'ƾIrn䛂 -K\BTѥWԩ} 3ڮUjK(/ϰXc_% Z䱌RHB;4=/WRJ1doesT*sqiVK"ķȸ<{'m-3TRքop r)N&U)ʜdk$7r?C,g[±?V{rP9"->!Gnom/8@EWg&W}:zwMu:E9ӕ94щR-<Z }] xU7 5oV:+cѧ7@~JM5*1lΌN3->@+n-sq'}d9 ࿒ ΅?UB_{ UnF %Ӌ soaWX3u^aFT}>Vv%!Gx*DZ&OgT]ҏo"ߒ~Kbo/ɋp?&IتOb_OGKo?=sD*T'ݟ+lXȊi#fO=5OR3VcKGOVʦ9!R d ' .ޥuJ㪯:{cw8? VR{#*ZT9=syB*qFU&ڊ1kޕOP5cEQۻ>YU:2\ {c9FWq|c{!ɫx5zUS FKy59ݮ `!Vz)r'쯱)Μa58ݽhŒԛU5^C!t];E=6Q*P'RIr{ap<gBZ4u>~gV֧+3ȷ0BNOv-(CEM$EJϵs5ҟlmm\*js0NYy{\yBȸsv6n7"E&efnppB8!<ק=;ڧGO)IE5] [56wW婴c>FA-έnN?N#t<!k䣒#n#aap}!lJ_(= lQ(ԗotF޿%ѺNoAny8` Xخm. GB>Ҿj_iiw[zu uML}Iwv Bc$:S=%iV(ȥqan9[ ` ,f9*aťwWd?{߰ᇾ̩}=_OI~Ӻ|Y2JP?+a6p^2N ⻝OEv\#]JXJ/fr6c}@{v0nPWvOc^ Y&%_9ɓn{nt}.FRt"W_=O_>t! VӇlm|g$v|,%(Ҕb=l>Fl,?^[";'ƴ4>'VQiK0 E&6 x*=oNtu~OK/}[uҺzNgX)<>N&nzj6x 5$MNt~;T]6u gtO߶  ,i*Є*TO͕NQ\ZY0l.=l8 cb6DZ.@y3iҋ䕩JISG _9#M7pK1) !B#. 荷`e[׹Rr% Zs(AJQv& ci:l=jR2]p'lbuhҥܫкJ*kt_SUjJQt]Zu}vUUgV9d=TKF7vuҨt]-}.TOҷ<1-A2B.U'*vks*Qrra|X1`Tg}W>8}}Cҝ7W%BoktzGҵ4էcʔ,8'pew |Lԕ?8d'#+' -,< 2T)S[\6ErBSVwncTά88 !l< Hua?n[`wr&`AJd\y*?W3VTD g)MNOɈbal_,At1r LNtyAoGr1x  |H )GiέIm+ jQR.JƱ|ے؛ <`n6p ~O)P;׹^WF;jj8<[~Ov[>0Inmu _0ma}ȿRz/U#־*R-R }}`Gb,`p7vnͬ  QeKS.9/5rZyIҾ.h~@ | ٥=FNJlejax q{ ߓg[ӡR::ly8NUf7v.wt~ٮSsWU{D.M[VG굺N5N~҆* Y/e9FOK=)F>U/t>Yn; l*oQ/[˥t~вljv:kF0pJʣdu_Sn*`v_b#+GǀA8-93Rlь*oL.ۤ6{c.{KfeKYi1swj*  RYvӋ|'{4zޢynA l8ᅹ%`tiY]+jCN7>X'sX_@Qn)./lJ=^e-/D1eZtGQ8}9)YonSMCSj{Rlm[ /l8nXg+ mju0黨>^DOO˵lc\ʜi8*Կiv'9/qU BIa5@Ew; )J*.X[\ǂnZA(7@tޞjg׽Yztuu" cks X~IJD(i麕&vCkh7%tӺymnd 2(JB*/XrW/̢>~}L֭5NlGuO^.,zb^O:TԵu5)km3y}* qf/a݀@.qվ/ce*nIN/uyRn̫|ӦME+uoMu._Wt?! ࿛9`S֝?T:'N:ϹG\nG'#Áp7d;i]M>- gFrk/ ,b_Rrx'HߠUa^*A2O)sCԌ1Y<D H!alp$] ` lm`/l/lgN4\\o'ϱ 6x<7'2&wM C)O¬{u&&#rn8xǐ v7b`8wbK;#d3ao̕o44Ss]?eKNFOCI>^ZJb~ǝMzBg^]fik+BE+;܊*؄">GzwӚnӵZN/2?Z e=хn$܃% K@,6xr(Iž#y/nQ؃25MݎHAM+7`Ց-FxېXEkjTԨJPrOGџN#~W蛲y&ᓒ7r#.th4rt(nvFǶN/P/ [wZb\ @_uNNzJ(ͫwBVfeV}G'v1ےnNb ~ERIY½HR8ɨtk !nFÀUa(X/X1NqK"Q\Ch:iBex6<[ ]`r8 &qsH}~UNJJ񌝜hi55iV(Nd97 Խ ӚOLӭGv>Rb81#_[ce]EZ}Znƫp\EFM 8 ZU56LEN!*${G6bǁqC |DKec-GҕGSQ5 ce^ʵYE4j ڨi9:E.ݤKMS)7kd9wMǐ[{wu_ABJ UzprbR(q4'͋o?\~lG>MZ}LhFyd@<!k ȶr?丱:nrʺ:(3 doqu`B ti#es-MUú315pUdCO{E9y6R*5;+?tvj:UIFy-{2wf7#*mal䈅#1#;%7v F8V5ɓKvkMs"%I-8 *B$ttR0}+5k~zу-%:&jGQ)9`CWV<T:~Mbn dx/9`?8%Rq8 'k  &#`Xx6(XtڋRVrV*sqV J䲓{iuc7|ξ?u-5=myMv X\Zɝ)O~=OGKIJJ1Jǎ-2 &QIhR3ZqQR|'VQ/,1/H1ɗ՜a_#oa]'U Is'&do(:g/)?ɯ`<A1s(s'=O\ReTb._zjY_&8<h7ec}pDd؜WOkg*vKp4LGȿlL\vg6x`p gRsIJMLE:)OK:_J 9d,s,ԊSeܽ@ bX?(O$ +MiJ>kc{k}5SKw)GV-Wط JQa,KGn*8;mR=hrp9bl^.N@mgn<ŀ{l?RJ%BH;Rē2Rg;aY-ݝRq{W)(wϵr}7lճ_j[Ԃo{>HRҧ'+Rt89FV/.lD ΚhCI V.Mc)< !;;q| d-oy@6EJ 5ϸ -Kˬie9?kI%e?OSTTZ Iq~wRqƦ1oq^1[r9 yGtm;_ol-DR0K|~ARb!m^G X ?"S! `dFGTrX˵Zsy 5{^ N 5SQt:wL')#i4򧬠Nu[R(# Y`3b['-ɒ^`7,8?#TD؛ nI[0qd? mJS{4=?Wx'xr{,_/ǰ?KWljdH 2QӨS;zXuBTSJG"\r<R7hʵhe~O誝yj"~kz}Nk*Rqx8F(_'oFQ7r;e#j)O\nIGۑ(mpU+;/_^=4*rWOԾgZ1cQ_bD | d/7x\ B1z or =?#UFi-vߏc}*H5trɕ7i+}M:w#3BWlYͤjl?#O ()Ӕ撋|X ͩE{;;Zk4K. p6LU*(;ESZC'y`n6v ]|N$x/cLڔۊ1tJj%' k,ŘlXMTRQ[+`^_\WB4`.< {p^.thaBZS7wcT9:wni |ackȿ9pd~I`T[\qygތ7ITQc{)Cuy4>=<-YO rE< 2>w#WVF%cs{XX"r/l ж 7=gB=m[K-S|!-|M'9 /; abش;.I8˶ {I讇:ST,42qzz_VjcBXd^Xs o@ٔpaE_dcyn}f)-7:PMST`Q |jВk.O*SKI윬rt^t~ 7=Gޣ䴲8<\˹݆gBU/rc9; σ(rjutqj攸B x(`y!r_4؅"e\d!9:~OQQﵲs֨s|roj3N֧] sp8(^0<ԡ:t9Z&*n1'F܅KG 4)ʤvˮ4:PR*x69l-afV?RގZ=g<)='պ-9+wKdmFDN+8m(laSҩjY>Yd6Unt+Ƥ^VOkӣBa #+֝zI9JNMm E*N1LY:j1 E?( [//RR4Gv<_ +S.轉',6~;zTSIZt.ƭ~Q*IId9_8'&|m^@ =Ju=W[O7V{OUu]wUKM \.~Yqn9[*QNYƻJ/[gh>.or:pI(.MKu ?J_Y)5pqj¾sMS"Zm]D proGgXޔ-U SWNQ>ў =zڍjw\zˢ)QRy癨Vrw5X`l/^B _w:KMWPs_r6!Jw${GC8s(Zn/}rrgO96?#@.fFs\!m6,wdOP2\\uBN4'cAK_ZQuJ4jpfg J|Ȕ\]9 w@Xp\`.ɘpO̩仗'a w&Q $(8vd1 /ݓB|qx dǸ[By [ [5-qvۂ~Gی[l'(/"v21{Kl㒈]GYSMR:znlbG+$*sI.Jt5۝^pܟnt*JUs&& }Ţ^iU˶%o“Ww}i㨟N[{('.U'oskodilwJ3W5s^nRB˺pܤoK%I{2WQ]tVQdo~U)w;c(Ӝ}\@*C`\x ka l< B'#orWI>n9.pM/y!vk`rX_ !dVMd-_el`G Em}ZXij #q߀<"Ñ#X!xl#m ҡQN8kkOSWS۷=,+s;Xx" 6HH07EOßo>%4< :uZtTZ+XlOvt٧Pu/|455MSGݜ6<G ؖ{dQ-44җQYEoBRFWŎ7/ aqk7䔓=g:钨I_PNW^%%݇7Gb// X^8'džR=_Àx 2sbC ֡;;qj]'ZNjC0A-G;{wq*`۪ЫF0Qqŋ4ڲ^)}s#ɸ*Wv^@չ l.0mu|0- Á{beRmpR݃QZj֡R~G.q,U}oNS7JVT?2?"^wI+n}FKWK ^1ȑiiʕX_!c*DHRr6BBV{b6XO&9Pw#x~=aWx2qw[ݼJ|p_sZMqq$0 ,$CQ VNPOKn.[:=?нq;KK K}7C. rFM:mN.F %wy>ޝum&_"۵u'ifg-N=^_<ܲ8I)%It .nSui5nM쎯WbѭJd(nIrI@|N['s-?xcrەl!C x-8 Kde 83:?\<b8E.OWCW =NN4>OU]II~|_uVTjZQ.ד:Sw1)9-TnΘh.}rs5gfBmlp,Ff_07R]ҕٍ~X"=~,/-FWjbn/?"r*e*QX0䶸䛀8..-q_qv Ӝgga8'U^^囏#Wʹџz<"%s/gteR5|f87*iwui `p@ W1?.8l9\tfJn-].9=و i*rIar7i#Nu˶=bm)SKy{&JV_,[ ݋B|p,UmFRX0{^Ln9wK_$9rnFΜ&k:5SGGI~hE+M*rnՓ1p%܌XJ VsVrv0 ŏSӽ>Rt*4+JoOJ}R]?W%.EM9UW=}^gR>CB{3KGMUTOǫ_fN6]%b]0hǐV}ښ#r-9qw%z=G[qk4PC/s=n]I#c֣CS _Z]=uuiJtqn+G<r?Ap?"(Qv#yi`NI0( _}^ k|"r.^07;WWWKQӟL:TJʮI+.{dYX2(;vFŎn7y~ 6࿑!|Ƚb㒎C%pQkkl+C.fosuII=}y-,U;~|v:,/>{/XsnWT׼M-[p_% #tR~H6[#c%Cvw:>SSKZ47ߴˤmOU0iY?Źf=kz6z]TRyNev{o~-q^F{#4(٤ O ^C_}G="CCQSIZ;ҽ&t(kI,>K{ pWA֣7sy+sˣ5T5YJ]v]}Ui՜O&k]؛p9.AA, r@6*/kJ>F@.TCAB}G]^7NYB2үRyf_OiӞJq9w#,סҨk*J<퉶7Zėfz F[ko1lp71H}_7^ܛjjњ&p̫+WRRog& ,7eKT]F}M=ML*tsv%Ӻ7YZT~}hŽल#(H[brgGn k؛q킵MKONG y#l.?r<wfiU׳0m;8x09R{8|^KlzZM:#R=_Qzc[?jFPwWMD!+o!F\$7*Ya9a r>.Q<nLp[g=QA%ɮQv?[X[%cdEN./,Á-*5}Z=>:hW첷r_u7^J'v&ɑIgm/c^1r1n8B^B'0#cuӥݼ;$t!s{=?aҥ1QᯛJT)kkCOQΔd$tq&/`yrmjN{+|I8ao,@9ثԍ>&-p7gE ,Ν&(Jm5ZyTٚyc-e{rS!SRrR3+…: rG!8͋!\[ߛ>odNF0l<B2r콝~ ,x,&V2N5u3sRSj#?1n ,HV1%ѿׯߧȶ() vN#KYh%9I-OKu\4ROPujiы9@\y,RXlŲ/`d&-21فB?#O\[!Iv=g-['em̨R|3]kGCKZ(BY'vNPPsm`U V&-%'dJi;?4nȾ_<ž@C!F7g?T=-QY7QFzzR.2X4I5fdXx .WrNCGG%X:Cկ.E] KO-eGR+9bϒ[ [%!{pl0yBhYc ~n~IaV@`snUU!+J.飷u~+B/ZJ*FҎRj|"+msv:UQTV8 2΢گkF1Q {S:M;QJJ7ԴUujpr^ǫz~:Xc[ՒdjNLr@L;Tv/"l3rrTO* 1 ᏄoA O>ErI 䛌6VNm ,e \L(L|E}7.(|繎 l~6r[6@q.RSl/c#pe 3Ztj)_r= o:iWT"yrd{؃p rr0UkJ45ēӯKSYJp-cػ_p-5(+m!_jQNAS>;/үSWV4?)-=s}e5*iֵϑd bw;Xs n>IȾxq\J!|wp?q^|)릭xKpNp@%q';*EqirKI1a{*rj@' ,itTjCPR'!(FtTodݮz~Zn^=>2pHt6,<oh؟~KwE[!Y4qX#B!y9/?غX%`  dױDXcqo@9:t(zQ-9d=ǒD+=Ol/[Xf ou@w.8'`t.O#g(>֋7*s|:.k?K9OOVs\X?pCiY1pù٬SB>8}8*8poe dr8` @PQt:NU*?dc<PUuJ˹[ل.8A;"2_#/kn9Ř7U#tnO~P/yA{Xl [{܎#_셚ys,8ع/9 6n(}'}a| _q+:SY07RnRb<IBnYd nԍ𜢦::SsʿѧFӍ80W(RգO.kUZ}Lg=Nz^өg8/cƨ~@ Qw}< -PXq 8-X3Ju.%we.l9aslBqK{ X~MZZ*K>aa-Ϯo}1_I}MF.>NIY_ąJ-MիVw۟NeFdO+zaSA0kQ/8 `fJ 2jeVYZDڲBوtbw->CY<ȹ^pA+TUJiII(a "'oc:Zrj0oRMK:U/\cH*_!!EH'GM:Zm4TUlV5][-6# `yFKLm|,,OĹ@#/l6/KT*sS[2֫RO7f'F&r_]=ɶ;sy9e ಓ˿9&0H,ܶ ?6'ev#䁗%[{UΝ9v^r8tj8Ibp/"[|Ŗ S'gfr(An9pR6J8NMZj@Zv0FuUu^iu*ݽ'P&n olVB\W"Es*tDc@!l^Hg:_N)o]u뚥_W>敔VG/n xr?` QA{F  r2kI+`,eV_+?WWӴ=RRaOUu-S겯RUlؼhij/inUr՟B#bܘ`<v{oOSJBV?G`{9 BN\E |ـUg iNNu6<]Nfܹ5Ч ե8Bd,5`OG\[cnҫ{;iwGBFU{O]cSnǘ.NJpnZ0{aE\k1[m _yy.E6YUUt,%C؃ qwZrY;$Bwr6xv"M2p.ēm|lU[OYҵZ^8з9ZS8ٴc]/cnSvGOMhRT9N=bÀŲM݋lܜ`rɩlAñhԥF= -ߒ7 :rPSa6 bo rFS @ rweO˷a^ag|6-g675UtV 2Lk5uw[SVUjKyIݚ݆ {W1@y!09XaxBDcrImǵ M(`Z^Eq}"l0 drp-p ]{ڟHuZ":1^<rCYStdNmM:RKApiRq'XN'I#" VM\{HQa!:ɵdy ~a `mʭRvG'/4AVT9?F¯ӗo|2ŀI@y T>YK܌ACwDxr )VricӝYOc%B KGW#ΚAE:R]vXvMH[_~F$6ӣ),D/Ł ͎?v9!y `al ;lǁ^Kr&[a7)?P:k=$aV=RW֩*%9o&k/grb`=Mۻ..`G>p,R |r0;^ a-Q()3rV]^*F{`8n^]*rkY,yEOY;4+Y9T.8žqX~̀#cb~_#ak7 #=ŀܻqol~Y؛ =t*B-ף*3qiH&T4tu%=%oN++,<n6iQ)l}O4д\Zv3{X#\EOw;z= ]4*իe< ݙ*wۧSQUS9I%ɷtWOT*QlGkʝG ^.QuZ`iVWJFr4pjPxAT8.Tf`/ 8LdXʍ/YBvo7J  mȽDZGskncrwR9\Z+ȱeX+z],;de:Fk%Sgkݒ X[9Jﰓr܁ 5|,\R' \w!dK{硔p|\~s %nžF0-Ph~@'^@ 8Y~F#7xl_pvǩNMBdێs d䖳J"HN:}HY1Z0bU=p;%Q/~S٪OIMfZ>>>SI Zvjus+diY ?Vط RR4ԜZOgm-Őq?%[drO"(Oɝj+NFott4hՕ>>kmbɔ!)]̍Z馉54*Qg%氹t΃z VFev+7S6F ?@V` lC(5@V @^C`ƋGjw5=LRTѸ  llRT)GstV/ݏ) ٙNnr^AMOOֽ=ޟNZnZлw7> ֝DΕʥ9.Ϟx1c0_r/\*$IGVc d#{qrN~H[9ؿ}%Kr< {%ͅP.%.vE<^wDUv=L'ZY:j/#ʓ7E5 -rnINcW8:zJ3sV]}ҽ%:ܲVv8Cѥ[WNJtz=--]Hʭ5fdałȍk;r/`rs}7JMըo.[WQ(G78pD{=<8n.ǀQ@(s(5|Ju9ՏRݜO?ԥ}-2I/܎-X $'*}DC(8\r<w\y+6ؽܟdݧQR0# K )F[9D"Rqxavݞ@_]JM}3^*B)%ZjTUn XfJI,AγОQ&M&T=M(;XirA7-9}9-*Tu&{@,[RvvwNYy"*w (Jp,#MQH,?`gNP'J986hg@:wPӵifR9=KU.#!E'x,k=Τa+IY 伓>R|pK:teR7\Fk \&<JCh4ZWkV%G b!_qEwܛv?B ,Ŏ(SI)$FN5{!މCyjhoy= Q[1*MD-5)/ C!K؛OT(U_Qn9S',iX9Ek9}1ف bnSO R aǰ^w`-pT9"ܯ"XC:U%N}m4c)9;1$҃VϹܛ!^pg$f3qqopF9p>;c|eJE&zޚ˭jZ7^4c=/6Gu9iᩍxהx؃XI&Ғ (%l?eڳlİp WMoT:p*]+~7Ų[; /FlQӚ]CBtz|t{TSi-VWmEIT7w)<`c0ա[Q2ly3>p8 r{&tbQ󐱑'Vl8 ߁p< {x-,d[KQ[Ũ$gqO 1Gߑa{,ْ r7׍҇doҽ2`'rg,MKNr/g%oc/`XJ7&|n+F*_c.]"llF"yd.䱗mwV#'_FnF":xvf%7y6aAѴu:e%Rj7{#=g 'D5w}>$w"݁%6Zmn ɕIGjkQg鞡Guj:Tc]]WEӸBOc[nN7,m|qVv38˷ 6F`-zCХ]3Wԧs˾wvWߥtE]F¼-~sk6[~ΝIS9r| aF< ʑe EeXyl_"kl >ۮx0ض# `(;_VQn7N]8g.w}V.Il \wvսɸXϐ9yju4J.o2ʚypvn霶9<`l>G\;>w qT>F-ʔ{F7͚*^8cMtj8`^S[('R~ϧ.SUMF)ɽ%jmr# e>^UcMwcqqvf,/^-J}=Ktm'XΖ[ %8˺\^O >tU#e%9ȳ K8NMik~De6%>1p.9'%svSjʝEB,]9#F˺ZYV}I9Kݚ @ ,*PN*R{6JJNI4*Ϲ%$7fm-\/68Q(mr-`>$-e2@3qm`sZ)%!%uutkm{  G{ #| 2c`lJ${vh:v_UQҩZoa^ץ*u"(٣*vrRm*UG_%2pE<9!qaa8yp#aloSZڌ[Y>OIʵ[}'`x Ì~ dnpw&㑾KX/v%bp^Ip[iT]so7ONTbvŗOoK:YU]8UԔз' EIcsq& 82 Ek-,Vx'ȸ-n=ǧh:SҪ0xZJiAMNtjA8_䨋|V>P+k,. jVF;*ۨigJ }K?l9,,cG|\r]{-'>xܤ99Ti&S->hOMSRm)e,>Gp>$~_Gh:CUZqm.֭ nωhhjƴ!'8#%YzU_׍SYm]zHѺM-iFREY ^b[7x-Q9F~ {  nAK Y {#FJn.ؒr' v 1!n  [<+t;~/[it=::=ljvmSҖJ-;wy̼R}1M8Us#^J0$JV25wrGI]J8)Pa˹$nKi({6BiD׽-&6I҄kMpiVA9~F\<2n@r18>n8'{;zoI7?Nӏ|xG$Xh۹-FIut@Rm ڵZo ɽ-2K^ZtdQJY=λy^MJ=:\V}eIEےpf&vG8-ag8،[Jf /?rY^{nB {r8^ՍjZ%wuэZTŒ <^ءl gI_ă}n#?pBn?#?#|"^1p wzu=?u#ۉvMgT XQ<݋~ l{/G*;NV&9Sԕ||bq`FJ [#VN Cs1~ʽeV%N H{\%-JnɯLSPޝư  e❥bMU+Y8v)3N麵Ht=*>ϩtOLOMR-9'9C\`XRSlcR|9AlgJ=ӳ``rB$cRW+^l {?s8JXNNO&X&ev꺹iן_sRm<2|{E< @pn]56SU FT$5wvOl<]ȅq }^ӣʟn-!;{ka_"r3ben9[Y, 訜›2EL0./d  |ɷON5%i˶&lN܃0B.2co܀  n_)> 6܅`[ݏܓG'߁p.%,Zɉcx CQOԴ=2Z-%wJǜI7vR Xgm  l lFu8ɄY1y==@jU~J,cm(vǓ^ a࿒mV)U J좿}]&C~J7粍? ~ËyqCdj7JLr=&hS\\ZTskL{_%A }߁໭nɂL_!-sD.54ᢅUZ.rn9Pl>*_]L b&7cl^ @|ݖwLʥIOG [t6Ed*sqCp[\p^H|{!RGfKRS셿S8bp@pmSZ5TNN}NKVK "M=UMxV' w]_j}MIT-MKG]b2,}U% kNH#a [p ASK.ǐllT{zhtDZ *Vj4kcxv'J6pI+OSӽ;K(5qiT|`QCW:t}XEkA NJg*>S}7g!2??m?a]&Hctc^JfQw# f<ୖ1͒3tF GlRp_a T[#!@r[dq ߐBwҾ5u)GSNӃskKO)MI?#ɲt;iF}}|Ax#7';5VFыRFR '\r8C8B+_!6AޅO}jF6oчO)jbэ|cv28 O,E>X%BT*vVL.R鞆=GUJRnJ=Tק(T.w{ X c rv?8d% qqgKOV'*qn05! Fy[ʬ߃ -u%dw6K =d2H!À[Su,$~'Y=6)N8vgY;oIuZ3+_ .MSOY¤% 4ѧ[U |.)f1N]n#JyOS4{Bv{?}?_-m؟䣺/8.Xy؟^?qd5u:l4.ox7(ٜ>FqE#m);6ERqX"'{ld~J8¦ qygzAGU*ϷWObܱRVX~́7 1SޣW}OL q=Euiʥt}H-qA\dG|p)ؤEEpNiI8^Ogj`#iSu&ƳSKVq#}l\n>HqI,9ج[D;#&5,/sv89Gtq-/dJ1m+<̘ 28|Aէz.ttRO)y9e.0p[r6*y#cOqp!yFrSR+KYp<F E੆I9Ep]m s+ oZJJp"i. |l9rZȟm݉`[b8[#a.K8e:FqRܑN}؃y@ʜJؒU kl\\=7WMKQ^ey%XF5Pz5_v%՚sv070nwU~Qa4hkk*%4GN*9)NWg^Co=VϞ{dXspT+0,ؾ0 gCEտg6j??es^ yK#fZqGOPE8SI(i_q.Ey] ۇp@e)Fٯ裡mZR B˵Gn` o2]Xϲ' xqp%rrȐ啮Y 2qwW2r0 {a' wE+N@9F.kޕMp(OSTR)vHuR='G>ʓ}⻬]/S*35đ',bhvCrYa#mp@/p^ Vx Yg8EJK@OUi?m";篇d45(˻s8RRVm8΢䢽ٌp#l ӵSY 6՛Q]oGm R~8 r@pl[Rp˽`i41HZq w+_c?#b \˳f%k-Qm8pD殗ZQʜ;#k GpXs&&$ bֿ?ܻ{N3 [#m՘$ܬ~GL= [rx ,p/X1p,=ȸ|b\|YZȃZ7]d 09p%sL?dCUJ}/yV! 8^N]CQCMR**?+Е M<_e-q)leJo`9 2Jf4z5u4eWt$G&mTUɮ`_ c=?cc. _,] nYlo{9*U//ɺ=weL8rı| F7ؖ84@9Np%B&R&%#I)a܄/Sc[NNSmNH^UI&*AӕLb! rrTے rFr?%LEv.d O% JN4[]|r8]_EANZ};dYzȵ(T+E7v| !bwewcGTOSFib=Y΅zrRҌ4%|Io vO"n g&7hЭIt7/<`7`gtZn12WYzf=!i?g!7wvOn9 E=_NCWEE;\>NuBZHSQ}cv{)zwK\oҶyr09SLSE[*vAc:wC x)9/wdtB5e8wpqMMW/i)eEʭppKrr8 83cڗF7> N@@#`qqb =!_j:jVvJϛYUI F2]F)\[ l8+1b_vpF9 Z䛁/lCx<>{-I=K]2,Em`n-mzxueѾ BAdb`r}?իWe% m>VMq A,_ҽ#c9ȵضK c#W*cIE7YJDF+ni`n0*77R NGp)r9\qp_&tTQ[z]sވ-dcR jҹܭr-n~v8݀=gls,2p9X7N@B܅yApmtZ*nw$>o{?u1kO|?$( ܜ2N냧WԵZS^B{`ڎb.ې3m %HnKdܼ"{G6{ \ݤ֋8r%9QqvEܜnRl*2nޒjYjkTڬCgal8i]ÝpR&/߀-FΔd7Dt*t'BS%h;\n*uWWV*2+7<`| X~F[%[#aPsaǑ&BgJUTXK[*Z?JRC!Z$2AmpG9Eacp<F.XO q%̜c n8[tPʴa:56Eէ().Qf?#K{{JDٕOAC+`nNJ,92qOMG[*3Qt$U6ϹF 硭躭Ojv*zxY]wX!d;\x g:p{dcttzgZ+8P~V% [q6ܷ-9K;n[_Y$՝F;V'6Qo)lg<8ņtAr r,8dM',ogbx ?f//ߒ[ؿ8v.qC rr808y%_=JHzFQ]M 44VΊzSNJ_4sr (ۛ߰GEzoTOH8f-JzU+Z0!?K4=NLQTOE4'|[worF=ȍX -}K@%(< "|^zΔ%huj~n͔iʵX .7F+]`~<5}/Q:/B0;GsMx'(cRh&Obqv" {(˷ԩ*󓗓,G#^Qk[Y^#Nud|#C'_NՓչ(v;vsT}F$}#By`^ދthjk+JkG4zQQ?9"l_RY6^#p.UM)u| L]p@ӛ(+kV;Y9>/Wjhᥕi00o%}/Y:=6t$YY-#^F u QI;rb^{ GFҊF9wE=eAl!p n@|У*#6t5t5;+,ufs wR*1BQcvy|d-1q` TX U$vRe1;Ғ_k12=̉{~@݄a|09-$-cnD.ɨ(Vq7(p٫WH\sgNҵ1j{l<+"ߔKÐWI.OM4zmOTvӇt#.Y^L]z?faeɋQ$l@pgpŲT0aalE./gnx/7\;rgRZ&f[_7)(S197 kSFTz^;}ҽym]lD< @[l9bΛlO׍]4kJ{c)g&ovRQ_'9 {ܿ7/dn16+ X7L1%9 a୻vQp[l6] t"I,yrR0=` MwNߒK"$JTRŰkkpf`\?#k00NJe/t[+ev{q=?MӺZ]DuD"/l{;Qm/HݓgZ]:UQ΅yK7'佷$Ke_NKaWepEDdAl-^ q`IwݐS[ݑ dKb!!l? sp[[r=QklWFT'̵ZYR./lXYb9)8c{ZVdw*K wq^6)TWnw1C`?p-7ƾGvù,pl'p/ub#Fn^效+J X+&oȜTedbA+}=<{sԄTpTJjםgzr|dtɭ]9'W6B C(WwloBM}/}+C~F/=_VkP+t?ФcƃwW1KY ! k1Pɺzu .sTy98p9E;u Ν9M>䘰*d``9<sɗtiuRQKWuj|sOl2J@?KO/onٻw~B?GM!&C Ñr3l-7ZÁ/ k`]8by/`p#*c:I2& <{?"8O YdlB` =s)d1Y2>Gz>utJrsԤUލ5=c[. U%}ݑGLOMeH;; d,!Z ;`!JE9Ctэ0 6'.ȷ!G,ǒd6 3~2[zt^JmI}>2}DpTΝF4iRp}}꾝U2m;|V8IEQ869f/`n!MZ+Q78. ֔{Pk 3|eYR슄rf:pl);pVrݖj1ܟ.Kq/_eN1sMiY-߹?r~p) 8*\M䲄]&^P(ɵ}ы|ao]?\lN o||'%#b')N1evXsӫS@iq+6G$^r%'-Ȭ^B/o乱wN3^rN k܎7#acl|Xب_Nw-nM_? #l|[%[ZsumoՖİp>A (;U:l+ev$/ .vDߐ~BA~l^m]ڴU8Eܯl\pKSk:TNU[YmMYT'w);in-\X@tӍ:OcG%IGKLEv-W+Lt}~[ʜĢ[uUVWg6F%Y aoqc+ 9 H.vv1adO, Bu>;]all2I6#e4IB-9wnb^_ȾH~J@A s٬:}FtW),H!>ų%ՌFԗl[7k᧥4>NmBeJǹE询tq)rdkGN:rT۲٤X*FnƧܣ kjgJ2J_קIU%g;w 2</$$v&)S=Ce8yC/mx(BU'y1R϶j2<\ R|PXeCҩ׎S'R໐., ٲxOha$j`H.7M*FPl)teM 9Rvd`ܗ.dpwca-8|./}Űq%k_N=6=VVWQW},*ZJnv|[\\Rm`/a*E ;N2KX,VUaacفqظ7ijFhNqwq:P5SKMOLCdy">@=. 5J*MFR|#Bt]M8hYIf 5G;?#C/멣CQbV{\ظF T5[r~U8 p˞-VAk )ՙ;K>8$ecMo~ wٗؤ dylYy6v[8:Q?7EbMJN 2wyDy< Bz"YS8({?'V4PV /on(.Hfx2GNputjӨ`仟=ѣ.Uj?+ KGx`r97ۓTݟ}5Sv>-mϪ=kJ#n /`8)~Axs13tZoÒl.7ì!MoД[[bRqK,rw["sbIp/~@tTPgz7OgW+3%۳l[]]Դ}6}=<;`< , ,cЇU:T*;ܭSrN"cUSSJ7%d9L@ArJcv߻&>Rc~ Sf%F<Jь}g;ѺgF4:Zqܟv7Ǔ,26^L@) \l ,_ SrW0qgal-b1Sjb-hze;jhCO$oԺ*i}:[OOp !+EZ ѩRK_&ƭi1QOk@,<, |X \Xqpy;9ܓqRmdqk㒭ne:5)9E>G?dlE'Mw񱈰#qp.v(i*´U>9g$~tc|$`,]ف6R*yB'zɮoq)٥ec<2l bgr@ORX~NѥjO*VjڏE>K֏JMy@*R N֚5-ŎٻUzvF=F[v5a_Kfy:tiK*KiE8N1svr`9ÏG]/x#< JNiP:]> sb6+"F[ӡ:ݐdckn,gw+t~ޡ]Y'WoޱіoO> \69Qlp2!G n<lm(Jm+Kv,g(seJRTRV4^ȾigZM]ݚY12rΤ'sZݲy=On\=>MVz=2V)Y6^|&"߀A་RO)XrT/b[&P}ݨWF1Vs0{98 `-q@U`s[48vk#?::CЍ(83F+zߣ}#ijҜj͑zv&U}py/_/obt~_RPѕW;.qpf0Zy؃ʟVfu.7#HX'&.u?3On%:)FH(IXw.[>liG~$顫:yq/v,^1ّ,7%k_؟`R`lXMnoH(Τf,tOlAb$.]6%ђܽPwF7 *F8\#nj}Rg3Iّ|s2̎px ӌe;JVF.X؞Eu;TOMۓ)WnҲɭx,8+ {8Bx'/<fU+Ttr2࿑l{k7|@\]>2,e/N:n]\VDd|҃%Iʣ}ȸB ^9Qû;z}JtcӺr-9w_^rT<=//stu;W96G a["l>ڊz;hzp)%l7zECC.TR茏`O[`n` !X'YȰ^re >VyUrce|K]nvۘsc_A\\RlRTn[#ticWEɻvTҗj1{Su]GMeq_ZMΣor s'RVndC 0/?Fsgu?}d+rm)[nM((֣NVs@n-97I}3Z-A} Fg4ݝЌ{ݕ-Js(,I5UQRPRߵWj o-^R|#O5+KURW>91CSӄ[\FM湸j$nv}:骭<ݕN?ěr%p°mp<^"d]Y |'/!b$o p|vfIے^ۘIo^,,{!v+x1O y'+䛍(ʶz5J+_F.l{,+n{dK`P+ZέPMZ%؛(Sjݻ$z]W:V45f>s[QujJm|zN:M&Z9v; Qsǵ9Iԛى VQoEuu> M)B2fYwb NK`7^UoNƿУNVgԽ^uK,5ZfV.-g VIFxݐ8¬#wy ُp 2989-- /k?!ޓ?4۴~۶x>棠k2t%*T4R׫*եR[G(G/NO(B]ӓOOJ#V5Uvg~nTg*NS`L ! ̣' '|t]^eRYNQ۹gR5nN:VRT&9^Ag V7x1Va9 9yZ؃ 8c:Ww'&hU*(9(-zJW54FAIɔ;E?o>,q@ ǐld1k6-DEӋ^p ̀ }C^cT).Gu޷z{E,(dy^ʤFdgRSR1 <=y =gs׀gJ r1RIܙ4y{~@s`Ǒ|J6c r |QSSߧ%N1Qy`2ҚocoOm*Kx' #?rp܍|aaTmΚ?UCM h~,~Fd{>ϫʵ%h.YPt9>ؾ']oY%9誺S{\ɫUjgZINܥ5/ kzjhEý_]OTWCGPo8iLr QnSQۅ7 `Yaqa@/N"Ñl9'^7r- Aiq'uinSMʕwӛfAZIF{GZrdPKv䫵,WysɕjNF#AԵ]>RQrj%VnSw1r?Oc=]oRjٔ%stV>YQRkp/`6AvfNUTRVFdcΗZm:Mm=M辗ME:ҥVT&~i5nH>D[pl` [ Xr 7Pm]EFCW}m͉Sj8¥,ӟ?}p l-r7-z5:Fj)R!Nެj@*4՝n?q{n>NJBA˹߱RڋHqE7EF\JrG뫪:jQF횪ӕ.2\<7hN1PRSϱ H"NJߒJ{vcD^@1p9^ŊW~K}NW!ӣөR*?T!, FJN aIr ~ K+la7 b x@!O]3 JOuGE]3N o\*v1/UVwF2}ݣM"p8%(GӝKGikk*F_#k9`^ `,V-wn+E({"7v;uZjgOS ;.ade n%S<\^ uqR6{O-x ue4Y)KѵF...> Eo^%L +.7@-?GKU~4; 仿픢LJc?$Tԭ.pr qvxfFG]ԬNb ߒ]kiф%RvU=:o=wz(=Եպ.YX~ G#'' 1aÀQ91>>k-)nU3c(xr/tF8X\<2taQpܒ|>E$c5CCSTg4XF?6 XrEM 4"Rn+=vU:8T0AgfY*'vl YMR<)6K /-EYQTbTXr09PnQ`Ň pc998* {۝Cl[ym ݥI#]Ho \ISpA͊ u;klaa9f2-G-<;R9fX'9=pThNqQrzz G]jV7%'54u+FQGaMj*šmCitzO[KTVC[UJQr8".p]ǍDے!xVx l¬%''y;BmN,Qh_EdjX |FqDZyCZ" IS p-n@"ӷzܝz#=/RsQWGN֮sGF:_RHOni:9wR?b1vFʺjb$dNO9C ~+#yAmU!@#vISU>iwZ5J.̟3~W[SFc1ے1ɒogeŎMy[e*MKrL$l|< oi5y/B:N }[|v~U,x ~F`~/~Fȅ~V-mξT *\GWSuz5^jq w/ X_%:SWSTTX̘1{ܗ(]]ɏ%`p8`fr 6Xp[dڱ-༏ΛkGKvjsԫ*jJ]r< ɽVϵgNQuSjzK q=Yx}I/?Ⱦ27CGQhJ n_~Gv3d8#y`x{_.猍B'*W 2ggRikFPNQS8KE.F1Ƞn6 1ʷ ;dtg~b Ep/`ao/OH< sRL%RR嘐| ÷Xamqy*O8;]V*Ju$4ȷ iԕ9BYKvc<\plzz8IEjXbf[X4Ezlz|^5{x<`FRہc˰Fm IFم6?4|/&k|n<1X`{֥CY HE/WCKKMvXNԵ,R]}gU+0]+ɔOż]AG ]6~(UJӭu|?)t_o7?)WSIK3ىNSskkNBMsFonOv^@'%yp89= p wEӄkNVGcc{Lԕ< 䀥U$d;% 7ekrKؼ /Q ]~Ԛ L婶n:ZusjevKyGN(k!:قy>>OGE6ջg4bV>Y#EZ508(NPukN:8Q+lQl{qr1 RPkhǜ<y2#J'K+UӪbUcQ/5߰fjh1lYYAUN|[tS zmt5Iۦx@`-|9{DF5eJjpvkfY_YWQVuf:#׽E(Ty؛  ,]` 6{Hv؜,dr _$; {  Yَ0G]19 ]a@ rl)-rVe:#4"An[Nj(iUE^Rnq-6 NEwfI[" [ Fqi٘pPb-eJcapUr=#qmG'~K6@~P [\~㑻 {Gt.g.OR<7 N=I664VSbi~sVv7~ZR6NnC-x%65UJ{-+S*-Mx =\ EVb4Gms#f?ax2ő8p9(-`p ni-SdBYVY9>rkm<?QRjkϪVTsRS廜'#~ qk{^KFU!;FW0A9B0j`MrGȾHsxdv2ia?s` x9%1 ݀!d+ɷQJIR <1oa[r #n>G;|nziIPY)*،}y;`ZJSJU*6ԭpͻ"#< -=%4Ϥ۪hzw*l읏W:Js[4'#cSuzZGP\-{`zPktOJoG 7M;M!|E ԩSSh؀x0U%K87R}.\!7^ C*qKT%RhoU݋g$n^@d仱k>@/&TcR*nѾLQTdlt*m*WV1d| n9 qa-p.oaa ȵ{qb os+2r@-ŸnܘWtTkzgJ8Ɲoxߋ$.G agl dX?Ϥ_Duk*j.Xi9|#;K:M>POOo @^ܷ\&*=BZ8Bi2GMv[eSAF:vK|=N 8[,==.1mJrBpAarB9kB\8~Kϸ/dc$,r\ʼnݧ._uu5eRv9l5Q}rVӽ훘ҫ*3SkɶY!o{ ,DQ ɍ^/7 { p-*XL1lc"UɾuTb٦Qqy1W5jVϹ<FE 9-Ci vwb/?MD1eKoINֻ]ƥXU{I?^_߳HVP:TZj'-j5(Tp BK\r-JXSQV6R FFLEBd*m^WF-!wS)ʣ"V /q'y{^ Qw~X(>l8a*K‹n"Qqy#YƗbK;w+Vu_#0[daVYeNI]??'wMiQu?F0/9+s(rd\/{p+܌nۀGܰ튻bp7Y1 y7LpQpR?p -8bwZpn9y{{sa`,nN9NkK ݚy['ȷÌ'o{f [1ɺ{'Sk}=-)Ԗ_JzrԕrNH[27e?{,1TN@+# vOdnVlgo\h4Sډj('yZ4MfQ:5(NҌfd]ؖCd/KbwR:ztg-59v|&p=T}Kpkѽҧ%]_Mqs0-9_i֝?L'wǑqe[9"($/PNEŋ /rl7%-; evtRΤ'qqy#D|X|o?" Rtf\)-x2K) `[~LpΥnF=%`)8+~G ϐ ՖeZQYvX[9T>=>]!zl*YT$o'|%d $c7BmaB:U?Ou_$~ϽkV=)~ߛN7vMԨٕZnG ZDZ)pD >w$I;Ȁ 9w(ݮ`P3ѧֺ-,%-쏥)tmW|bg?YNԥӂF=WVu 9c|`[}_qhn qf.8!lCB,/#t7=?(=NJTqq~RGb2JU(SW2ΝHJ8iM)ש.)?K,x|K`l.8$UD6Q:NOJ. b ՟K.-߸0-,T)9n@._bp8PMv/\ ^K!W6QmD~{CGNU))3T]]u*hB.m>Z:u}҅Ov/Xő62? `<x';8o^C#~B+wܗbۆc9|-.{g=KҍZWo^zvGT&*˹E~Lmr`ldk?!,v2ح'wbWov@'e'6^<%go(}(Ԓ3oN9d[X vI<]1( U8m8E# !ORss ;?Vt\uY8MrtuRuN E~$@_" ʭbOd'e1"!ͅ6 XV7}Jj3Gx+Mn\%MT^|ܪ7{aӽ Wu:i7ov|7+$=l[q|XRvI/{6(XT# "٠0An4Rvnwk:>KjKgۆyֳ&EXK/}qF6Zzvg Lg>7c^JZt4[躇YSTeksÔn>=cj=3C]Iqbn9ErnZzc M_ZU;T{6؋qbv9q*v' $-72%9MҹBFSm|l~t%inA&4e.֒ra=jR4MR'ǻcȰٕry J-X5-ܸf#:uGSSԫ'F!9I2E nv'"1F^}VZqeGs'pNKg\&In3[zp?K{Ǩ=):eR>mߒ }y Yx}#ȷd*=>֫=_:eWw+Q-Uy՝'sլ-E:0(ö~i%kmV% ̩3-ﱏC,K3%LMJer5B'6+'nVCNm]8WӦ䔥iP 5_III]Koed};;8 ȱH#C`a<$g7\,_sq :lj?9Ԝ_7mK8+#/%؈!!9 1am ҅Xw{.V6ѨR?@J)i]M>;}OY:?WͫFWK [ȷ{0x'` ~lk.KFc-ݰAlD^ |,_lKATe]շ&H ,"#FOYj-9=bwW'"̽|8)`ݧ鳫 {'kA%[ RR? $_ Tѕ(44Z쌠~BaNpz]+ktZyqY[}t5N7g+4h"E_m>ؼnO_ 8v"f+ʗugm7' y/"[nC8w;}VEOJҧeҔiɇA, +`؜{E,ERRqOGԫԣiEf~7ZqQv5x v1k-7Tm{.n>8%% -SqN#9 -a`wpgVp Y~GR(thzr^.o6{O 8w`;\˻;t}'WPJN9ǵJi'dZ|3?$~GŁI8) yd=MYuOK vw'}c)ԅx֣S ҿ#ݑn-,]e*rr6lKQ>]kU(.z􎗥hV틗k=5XXT\8+l؀%g}ƾ$c=J]_WOY -gFE'Y!| _nOO K{]m<TƝ%}޳~*j&I-%yҜZpvfS jrRnьVY5J=D ԃiȲ 0B؃NTZOcd%'oc JIYܜP,J;gllN.Ȱ\~Ë v>ޮj}Iwwnx>{f\u5{F+ h[$B%aE 8v/qoijk5PJ.SHC4t5'NXnkg2yyK'}dF@96v@6/9f:JJJ[)Sl՟h\fho|sQzzj)Y?s̶9-[S:M5X 6BmYB`G78 `9H~AFqd\dhk28ԍ_pnĊrQmh|=J3kGpX;{ry/S*-\y^y9.\l9Ka@>zޑU+ujJT-ߟ׫=J]BRby%wlov?sBYkأ'8"YKz4ΪKO%%5>?$)6ggOGG9BqqYKmĥٕ+Uu:]=*h.7#/'6kcҥܞ4^_k qd~@ P? U3 ;Zہl/|n7eshΕ**~'5ܜ)|2{VڔU8B]r^ơ;:oRӫyN.Z*U{r"9Jyܫs}]7ӡ q}r# 8KktSuOEߦ}ckneyTo yܒy<ߧ3kGj*<#祯*UfDbtGTBeME.Op93S_O`9Y7! k `%༎,^w4G$,[K#!ػ#%L0<Tʴ IG}Z(7<dbCv L`n y֋k={=7JrN| Jk*P;ڸ9Hy*ti*u`Ǿ L'(ηtWj|MN:]IuS7Xϕ^Ocud}qGΔT-~Z:R!I~;^f]4-OGBNH;Q׬וjrܙl9EI2rqhbQrv[[$("֝HF2wQ /fT^FەElmWg~ Z?6l?#p>kVjw5[۷bx//o]x܄9gJjib9wE^_Q딣GUWsdxLܿRy&/c'xnZTNۥNn1jI{ ن?Vn[Ǧ:.ԡAWp-iW}gT:Pg'@f6*9};TNq7'drԇӓk MX/Ņ79d٨jl'%a!y/?{)+o%ȅ.eNN&Uԯ>s~._!%qr'fJ2Ś(`Y] Y k",l[>*q>9}G='R ?s{\!,8%eHCt7V:ٸ҄^T4=~U:*}5rNrPC`Lo$[${=,#yd뫭t4''Rs82{(u4Lm9I>5B[U]%YRkw#Y:ڊRNRwlp-rm. &2+-fNv-[c-mE3}&ѽKSҞR~'T*udӶL&܂?|G/F= pR/1a<nesܣ9' 2y-Xǹ؍d~9Yd Bj6 {jC˵> )#ܝݬᑿvCoMR:J#ivRMmOvv/g2+ __-aar8Ŭ8 \x {TT+_87`(pO&QۓH 'z#4=A^ו(Rcx=Z5Z0vY`9BQc. He8pK;\%pv؅"儮$eRRM#w ݧ*#&=OC#IKYSOV[oQ f4vNG)Jݚ#r2T[kdDW΍ N=٫pV]j|=vcpa9KR7nb7iƽe ԍ5s5=iIJܣ(ت.G:PoM){򁄣l4Kd`oh.? 7XnKWOJTѥe=GgMz[ʬ&j'B9RQ9_7w'<~[;w~HROLuNT%v۲<*QR-J8fKp7}XzUPӣzO;r_7fЧgj伕GFRRdŘAFIad~C~2Dz TX|G9Sة5%[H0-byur:U%J}vij5u5]JrXk"-yr7@,?ܮ`n 6' =[6U6R]$kiWcZM"Q9U;#YE-K`ǀO "rzZNGKzT&iNǝ~a~Ill*ESoY,w8M.}}ӺU^KQBh.ڝ_Tf# 챋t^MN]=HRfvC؋Kk͈6*WJ($Ooz~*ө vMR4RWH諧ix*rwp|K}hkGS5FO39ܠnP8H6qdM֎VtӶ?sU_qlvtNiNcѺU)ե'g(VS7kvBҕ6cnʎEOQ OkGם'Iҩ8ƤB *ps.%:mT:rvRn"Kk|'# qa `A)?ov1bΛL Crm%{=^nݎ ydEk-2[bmbl 2M7i(Nƪ=Ϸnd# 0 Dv=ܜGyfn-q-P.E0?xdBÂ\{؋ߦ'jJYrI9Iى<َ7f. =*ƕ$9$J*ulч9%̔#FꪧXRQvsW_\>ӵbNM#dȽ ֩Iq~阹96?+se qYFqQIBv6eW81 StGSMԖщuG.zoM(;>t ErJ{PE]2ٚX;4>Y>AkKթxڍx5)8Dm`܌7`0XKW6j55u }IYXB~@r}KSӵ*UJR=z8:UuSWi~ | `8 Ì{]h=C:}wJ?Wo'VmMvl8!#yvji:p[FٗF*RpOHW+ ߐ/9 ;[rbUJ6_%0众vn8=n Zԝg QPvg;]`䖾-$AΊu)ҍ$%q7O}55.iFUrܶ= :> KC_\yoBeO'CO**YKiKplRj)e޷]SGңEۺS\ ^Ix@KئT5)+'][ORul}9IͶdn-K`Kd/{XcK"abN0"N;Ļ(kPxѥVZRq]7>R*V۹/ruTziY}699 m؟-@ r_"߱+Fj\w>KEMvõͻˆ|ww1cX?S E8;ŮηN֬8GhdozG[u5i>~SA5.5kcd~̊2svEp!e(MGc:B/N5:mzS>4dc{ ` _*v{q[Á ɛ5apRr=ʢV\K/(Iqa{ bf 9]Fv|x \/$)clPSj! \VُsIkcVZz2ۄh\_kܘ9 ٫śRwH<~ -_{8'%Ey 6^&T{\ޓAIh5.tӛj֗'BI* zmj arUe}I+y;֕){3UH_~B9|-e*QT.-*TIM,B0.ù@MdU&+{r6c~klJ2d ,< 0Nns6zzY[oN=SZWPgmƇNO9 :SEJw=V/'*%]/tgKuf}%U+BiӣN1ջRŏӝm:yQ:UZhux9ŐI|@C ~@(A?y2u]DZ!@RQ}ʭz]MɯGq򇑑>J7 .BÐ Udȶ.C'%/ӗos| ࿑v9cvXSK*taRR_wڭF' `a+v GFЯ_6>z]Ɲ:T'"DUCW5>CYZer眀#. < 0$؅%ʬh#Q-[pJN ͈rʽ TiqZ;:At_PWO&7F݌9HlqsGV7I($o+jmJMuiʔ'0 %yDsaE8-aRj y`ʔ%1Ͳu8wkp=ȰG<JN7/|䜎JH b2Qx%:tJǵ؟#,_bX6^\+Ȋ?,Ͽ4GWgu]ANԍHN=kXYl%X!QqfKc+(aNOQЩ{׽QksS7}cAUCO<;?:wu5^ ۧ8VǾ s 7dm?pSF.Rz^/i}X)8=ѾjeGNC絴S:Jjj.׎ƀ9 x r?"/'KПFZFBЫ_WFV (QOsaTM]<'OMFu  u$Rz4F`݄8i]7;%osdt[dZ@pʊ9GTtz[Qm('ѺoLR}j]΍|gkLrG' }oEWQJSڻwG]aNHƭ<}#N.ԨhJR\n~a=Vrsnd朝`%!8[lQp<ɝ*N=dxX&X\,qRɯl~aøJmHÁbBNQ=EQn&U-E^{p06l 6VȾ3 -tALjș) .-q`>G#ܿ%NNr̮K|,6XH2^Q99/';T}?NFUUEl]}JcEN]ݱ[69/-Emlbg5;G';[` 8F &{؃-@e`ѡY JHO _ѫ^)Ʈ>׳>we&l\ 1pJ M&)6(;\l{ɸ|p[eoa#PMӣN%ti|Fİr8,_"6nǩLHN?R=^À#1&ذ7/'^Յ3uOPF}.~uU%v5F[Era'nYZ$K]K /||t[fIE֯ifL=7Ajþps'ٴK]؋KlB?#.زQ-_rgWfp+ŴױOR(m$aRU$|9/#-k[pb08*"8{GN.Mz][zjy-nW[>옿 } -Z_NڮUiqy-ΔE+^⬜94k\@ {In%X/`O-_Du))B4Z_NOZMdJ\Ĝd,G,FCEzVT |3~C9э*+킊G7d@y nX*uT<:skzrrQ,%NKEORVkm71 ه9㛖;:ښYBtaiLX?}B ?ry( о &StwJ?cO৷5:^Jp=y~?cūNyD"F1q/}ɺ (x {ZCv-(r1/ pY-(E!ť{` p<ػ3>)]d% c:Z.]0{gkS|b8'"(%O*Uԓ9||[؀*orpTJԣ6juu]J%9={x:ZxҲw4 N0 Zڗjr)L:n1TOX=9O5NPJRYSQ(>m (QoEtէ{-4wiuOC(' 'Sɋ1G85k6+n ?#_a̩jYgoSΗXwB8p op-YÓ~USIZ5i>)wRާ5-ff>"pCEn73m8^k8?P?4[O#AB:%Eԗk|$cdbrG?)rI1˹Ԓl٫T#o}sGr?NpJ7:KSԯ I&ԣFkBg9yܢ.p6eN=.ȱ馢0 h0t}7TS饧(ь79գBzWYx+ {ܗBVlz^ֶ7uj7x<1q#qK%|+BdjYI|TQO5n#8zK=Oi.<+1's%-6jMJ$O%QrX2FTW0&P+E\z.QR$GtOitӗD~@^B{`G/U7 r2oY.=}B~NAA07a{17Xso_醞n9G;XLoݭIK'4445B5^4)?̫n)nMN y/'zk:MM:ZjU'jէQdk %b2;CW]07d;@Cd. DO,Y(B.SH^j>״7B*rtl'7'v"삅Z)]cc?QS}5^LvFi^>ĜcگOP=3Yz:U娏otbxu$60nriܜṇ$ $ s88%7/r_buåjt׮O9s n8 /s}˸e $~I_$n -J -lRҷo}'9Io"zJ:g{ow{]Ƚǰr{ޙ/Y Tu MKxTa+<3Y/81@XlMH^"|ܜw쓏r Z$BY`m8,Sd#/+w7GL(?$߹ p?" cOL禝^40r~Ŀse p|lMor[ ȳ p@.ZY9AE[(9wJ_ ҟI@-{x|OiST*ʝv4RoG%:4G_Q~σMNߨ/cnISRjɦPqk'7e %tNd߻1'pcg,3UKATSj8Z x2)T#n]MKQVuZV]9"lmR;4: ڹR&CWG]ӫ .8mxa{n%gs/t ,¯gZ~xKoqorXlb7dH_%ʾYEe++,.PbeJ/ b8#!q.IA9.p<`L,Nk2nPKw?T躏)(|V*%νB!w&u #}6/\m"@H0C a@y/s9.HLZo++r@.-0|~Gn[d@+tQ4 ;5]v\ܨ%wx6/./G$[G6zfB8<:mM*1rP,op  >Ge7ɕ7 qat7)9/!+82NHS1閂(:ݿ1V0S+*WO˥n f AӲHk-=ۑ/GV߁0"{nMNj;Y0स\o`._%> Q3t]0[|?b/!Xn^ {_"n# ~H fK9>#g.\bNNrS[Y稫:,Umb- kji-ِ˵~K]\ʤ;&i~Zu-E4tZjurVbuf/T{97'p#<! $8+'*ն =?<ϳ_sεJKg!\_${Ce)Kwr]NzQUͥΝYw'II2ܱsVvF'R}LErd/)ZF%RpRpǀ<c?(ț 9ʹ^{uCKYdzOYl?|c,E\+5 dnȫ&}tvdb8-ż8pe ar zjzīGOؾ7R]ҶR71^r4Ոy}ݤt'#oTt:M9-HtcNSa+)cb#.fb`BVY%l@,y!HsZEM2魣|nln rB=,#`>C!@6 A-ʒrD]M_;tWUN4+NVYuI7iϽvv,<q|'_rtIYiҗۺ4lO#qQmm /!e:4gZ8R|#9.2O) | =8 8zGG(WT`, gs'm09 l?=m u2O:i4R_Qϗ|ܿ_"t\cUwf<=OUVRTbV\| \-;` ?߄Gkn/`egRwLHF6[_)?g~t x6`NFr%5^{vkAP)j# >QN Si#.׌p٤+U)4Uڛr5fc~JN@8,?rW*{.x,%ϰ~tޕ%4\ZTMݳ|u F᧭:jk&d/NVuᛩ4;K4lQvۀv+JcܘLN6m;{$ >^T%.ع|}eGN=RyvS>{ =ocwgx-y ICf.E\/s)(f?,8"EHr8`pkrP샋E7xᅗsB>CWSt>zo}muGL;F~Y6WZm]+ؒy&@>Iɖ^K[QBJwH97 h*RU%l6Y%efNC 9_lTn s:u|wP8q/$QKNCѮZ-l+'+wb-Cp-tf4W/F5.-p2Ri4z>htV^C<_s_Tu4e& }RKzGO)kU2n~ѿjzWTTu8kWFSJz_Du57Tخ#{5TQ¤dM؀ $)TSOJiِ[ (I J%-nOU\ 6 S*qLH:IӮZ+E>Eȍ[grl_r+1{sd7#~-UkhRFT)SiSg{X{nW- ͑ 4LV#RJ *Ya(i!vSyO!jMxP#lo]79)Iїl㴽uNINyfaob7?pgMiJYBty~2r]ϹƔy /~IÜ ȸE(P-<PiӋF)ʔfdobM<4#R}Y~r<\ 6k**Cў4uZJꦭ݈>>U8!mc/w}47g=^x$ bl/\8-d a^x(KY 4j+pEE(Yسe%fBI(<ڵ)ʔ#Yidr !|T |/kxHO&ߵSYrw'>H '#n-E^T8ds@qT϶辉}7=}]_ѝ{+ug]jp.92ry1DdS [MCƹՔnJapL= EtS[Q%+Y2 1{-r5%ȟtoҥJPǹ0 'kkcSGSthqi٣}=ihQkg07mY)BSQmIb,r+\HR[pl_#m O#-#Rۆ@0VutgzN5fW_D(w;#N Iv;d @2,+IKYԨЯ]P9ZU%F=&:~{!|pK0t}6UeTĢ;1̀y_ \ǁ8%J86u5:Ro F]Yrq ж. ]V0y y Nx gtg*Ғrv0K[֌hJ&zw:ojzW:]^齒a+5s==C4_w|;7oORu[ZƟ{Wny` =>t:+twŲ mYfT]I{2ޱ֞M<=*1S.5PNF}[3Hظ3Qw[wvb}#u5OI>{z}N7S< C~KmɆ31p "񐝌G,93lH~Pl9*? 8 q|^Lrr1  ɱP*Np[fIWUV0 JmE+ϨWNT*Qfr͝::4*:;"J-FqqeӶ_`08(p< 8& %<0͊T]4h~K*>#@ߒcr, |kpȿ/!ě09( /iOQZyj*J7սO׭V=4tv-?'ؗ2Y,M.!b5{:rbzTPzjZKxM&y.wkKGӗҽ49{"ϑ/rmb%]Xp8=Ō]UNܧ`؄oKȶH9;_XĿ%p?r/*6iOS^o#t]_D} \T'kWoQWFTN3bfGw_rg]4z-S>~@~@ǰeu=7Q[ESUҧ9'[ 0? E <*UWk$67ۅs &JJ+cZ¦ [?O:K=9=7J'5}Ǔd(k FAVe$YY0ǹx.?#Fmfo*+}:*5ʜ'fM,~HkQmH{֞Ut[f@28|Q` a/~B0[]Xs9؟ctT>Qx=Nw%E`Eb\-$I7-@89 a}ŰX_b{ sq_ el>G[~{oI7(V 7i,l:Mtvs? xv6vQwkr8\k。ݶ嵇1'~@iS(M}~j#>G#\J)ӌ),|rXhk0*';:~T54:Ì4mn!8Ac(y X| ʕݮGr^vfu+&kCx_,=Vo<`(39ђɩb+[rK8y Cpm>jW&!%gr4Drf˵Jf<apD? nʝ:U0!E! ԨWUJզ7e9(+9Rl,_ojr&T\)5`BpnzyBn-[m*iƥ)8.i5CU+m]i֨s_BS⻤۲5un:鵔:{3r :Ytmlu:yK>_NzxҬ՜eMnuSos_;! or2vM=UeJX1Жr|F?"Qc˷=NsWQ]ݒ9:Htm|>8IWޛ55:ߣV?tʧIn꺰s[!w 8\r=swUcK)CۃKdE(V0/%Qڸ@Tg*l? :OhzEI QzI!ݏKѺ:h99IM߱5o[WT跋+_llKr|\ \3Zt웍՝Nk:4aOtu ? Dn>B!/j;!O%ѸV \ҽ%*tvԏQÀ ~ARbQeO؟,vt>ShU4e4?W'W3OԧZuty6SR2FT*J=/9Y_n/J+-Ů^ |)4Z*-nJݿQ~.`n\G5SIG5v #[77'Ϲ]c*p梲۱UWlѢ/m1{pp@p7` ~pzshSKJ^cѝ%IšteFJ{.OkABXِx` {`?o[2M[eQs6DrY'p& p9,[NʥY{oɆNCu:Xy_&^t:TQ[|,iJp 9LZ:*r;'99Ų"ؽ$1&TNcړ\[lcp )û>hƒc^UB5/M˺OԡV.3pX>@[uWB=FIIŧkepɺ<;i^cHP/c2Ju)JS()JkMYِ8Tqm6NrQQvH^KkMN>q)wJ[}cj];vd]_L zuHnyOjzzUGR8T'$YGPMõ>O=tQqTNZܯec?J/O:toX1>R8*ӻA, ;zVTiG{5GQ8S|S4qXb=1r ٦o-l`8mxJvŕ݈SW؋s%RInlu& kɷUAòfڻ ܼ 8vfJ;믠kJ5gi|=S_>U$pKcl607bXZ筫zjOjmʷ2Z4%/'__ +26~ _, {8vJ&,~lp.7$_#y!xvMضK6i u*>(ά5 ||^߁,n`\m+,'7Ⱦ}|~@ll*Kku^j>ԂԸ)Ewhvv-M^],lti(K1G馲JF3p~r}i+d?.uGҾҧIKbVJ;pV_" / vg}Aѧ 3u%RMOrںU/.%f 3{mclb%Ǹ {LRz'$*ӝTl0>Xܻ! ?Zٔ}7Epv6S<Gcx` #[zWOQuM֧ f>O3b՝6`5f-kiQQuѨk,a;6FRCy dnଛX] ~!e8:ΥBZs5q1}R?aq`1X6Q*WNڔZjx I)4EȰiI{$bXE72BKnK[WZtRsv`5:zjҥZ%fiSI(-S\!-f5x#`.Kfv$݋! `aB!=. u 锗^z*T=9CO ( ll `[35)5tc,ұH8܋aqt`l<)ǎLX[Gk"rn7  CWOMB=*JCBkONZZ_;>F܁[K!ne>1ſs9U<"MGQ[;ni 2XgnUhT&O'}k5SPvvV+WGy;W:zGPZzuSj+U['QEEI˂4u==)՛+UZr7 Ŧfr^n^b2p`-?9vM<u]_o*~G˾VD{Âò؜F?#ؽ..ԸVJԡYϷcNq!}[9y#%,dU-d8)bĔ\] rȰKsvSSM?J][?c %V1<企`B#s?r" `6ngFQm2r]@&VBXɧt*96I4PvoN~;lw-f_NiG{2lL-*-JݑK~J.eG" _Gq '{}WЧ4m\ok ,P-丱EHm(rΗ5Qѥkڈ5f 1o`l8@yr9p>Go6rdNju*WP?m.J/[ݕOo?;1_s*m)&=#]<4h=?x,]O~rjnM@Z2[4/԰z^5:'Qc9RVYK뺅eNW3W =O _)BZtSmd)q}|$@27'੼;;bn-wp-90 r %]0[X91?}pLx À|ϱV\utӥ1sr96Fb/$/1sbeq鮣u4a=MKxw6>2|^TVnm_l.6CܱkMJ.,?#r5[-D_ tWF6ϑ{Eo"2a< +-|z=JEIzպZ=5B[#⯂0D㐐2bÁ؀YMIn$.ۋ\ l}'=KN֝i;?}Az][ ]<~Z:Qvrg?}'>oI5ch!Sb}XX@,փG]OR jۃz*GYOIi(/]WKq'O["]{Fk//mO_}v_rrݲ\Man>E FMGNQԣVǶ'' nbVr9+VE5 p9!!7kBȰoBv ;6GFߩ+ӧ^q.'k3ZtԔ$݇c HR> @e+.O7螔$:Vxwv(MOVNTc~ǩTV==*sHպ~:ݕ2YdAh*jQm(4]wRu ήJrQ8 ;dUgb}krŌ\ly::4drr9 .WirXے<vA`Eb2ZuR]^Es*rꮗkOΛok}o(u+GKo6|L<Ep>G9l_rovmӵbktVt>4ttzGuzTRWG|`]f+ S_v8:t8j/Z4cwH稔dɎ67^?UσE-dOGeݹİBsr81 `r8؅H1k1{d|=v7,cvxI;&{U gp9\ck!6n\JvNFq _c-"Yɝ^wɭrK]m>Bca!ɗucXE1>9g_!QQ.|#Y=ݛ(SU')| Fs~Qթ]=2%KOBTջ!)rσ]#W~ݎGǐV`3̠$[(pOm*-t]EUkMLH)|Q{ ]Q?%bRosWYp9CwJjo 8-^(t!M#FHc$2v{8s^ڶd^/~E9e3:i)қ*՝iԓalr?aEǸp/K` ű)I3p<{ J|ɾ4 ɛN*]1x'lQ|=pTrܗA> NJ$wWO`Aa{\"5^ٮqLxv p@P7.PNG*v 'zm'VHun:i*d*8Fi(qwxxۏ55U(*37Mm۲mNTWy::Sߧ0]w  \X@|G#'grvgs(Kw[VU/r|Em^T(wp.ax)7-UnD&{zZ5+OFiʕX8N8jJ?^XS?OE[I W{9Ád#`p\]2uurK -abr"铂스$c<ٱy[q2jSQ[wn\dXoُxY*[ܗ=L*u,+nvө^Rci>8Aq#p E., hʴcoɃk$[}ۋg#*@n-%|4Nm.utE=.jV0wdf:Du:P5'~s< 4OVE䬖@lO%@1'G8:=BUTN;$i7'vb]XZֹFf:YWOvK ǝn aabgOb6Eq SQYi[=՝)BN/lۻw%̻o8ܾ e-,c} )'rɍ9 d[y^ -؞@_"$ۗv8 [Ƕ _q`{BC#Cr[ 9f Jm'eɇ ,{(p=]l 7Nm(OCՍ)7fy`ݡ(w=GTH*_>pȸX0䫒l b-$luF5mvt-ZFqp8^1 1a/s 9%l@ þVZzaO<_Wur*:?bC  r/|>Fl#r.NǰxCc:\(-2}>> >McR1>zch}+KV$}ɧ~,|l~7,cxܫt>о]A]j?7{7>{r^ӣn{6ғ)BR1٧˲9N^W5. ܏E` X~2RŻxe%l\/p8 5x<^@[!yצѩFU*UPxuʽ]7KOӚ?dl9F-'b&L,J-c`bXRq؃p^p@E䷾ <SUQF#꾕h}-K% 9Ry5&l+98ư@ʕ)UhF͒Q=,s:7N=0Y`?a|q7X p_ {41v+Kd|U-dӵ~BVO〇,6佷ji'OQoė}'EMn9Gm|PJ(O'ɠ=Ǜ"h?kSGuGWƔ%/URpd[F ,WtNdM΍:ݒjrq훍bx '%aa| rTOfb=-Fk:f]NPT[JYw>ֺ\u51]R]>YSO)FNj9lUpA*vw3RTFzU]LNSIHx`cEZjtv7| !Eq 2 `r,w>6B_n_8\÷؎:P# wk/* .Tk*k]覕5  @Rõ, q<00M3s_NgG8*v؞[bmضnl2T~a>uM9&&> ۰%2rd~+]؋}OuGG:[*s[:VSCr P݁EU:2Jq~ -}lb!Xy/?܌"X'KIflŬ, | ;GXKeiJ&FS\W9 nnm'V͇9ةF < p.#n08-K{2Q.5%-?SOu]5To?osӅjrR*POU};VJk<;R}̭N]#[[O[KORzx;Jvg V`6QuH:wKIGNRޟ?4}i;_#*;2Ju.+. ]ɲgwK-..Gk G% YikAՏkjN7 OMi^L~>?(FVNR_|gnL|".Ex!`Xl{{_r_ ٙq&%af9 CV_"2dqLl[7C([ (#ry-L@8<8hWOr;+(*Pn׻ϯR4ڏ7ܞ@`z]^]5Ӯ iSryl7' mnCEp#6 NWV1~B؞2[?Ck7]tlyD bp<+Xs}N=/_y 9,G86vGw&n7F5gQEOVSPQ ? \j筧'QtҤecʜܦlǑ_y v!Br!~Gn' SgAnW6N z=MuJtwCNTGMC_R:''G TmYEU)]i+ W>էF+wJyֺU~jh6pA_J#}=E**olj-5yғM 5gN 7!l6 E!Kی~I?䤹sɕ'­NAA{9JQ`[>TғIc0сQ<G,<]\pN@!l6~O-V'd}w>іj9GR^'SҨѳ]Yݥdsŀl8J?8%pf'vK2 2'I_9_õg pŀ*n[d R$Ql6v1ȱqr\b\7 )+-ǫ=1zNUKXY} d~@6:sOo1 ^ V3}ߢ=]wթvIJ9]EzҒ?3zDԛ'+ ɗy=j^PϦRNV%&N@,_m͓RjR_&Cn϶O'Ist(hs'1#o NSvm=rN:%}}99-|/ʭiw0ŽCa=ݒO:CsNR?=> d.dlXCoqIn^HQZU:}Ivz|n)ٸ;qm'OG^zR JV4=9> KmYc`Eȷ)ʤadbձm\=IYBZ_Y ?"Q]ױJ!K[+0/ma {06Hy[nN)6Yݏx [?XrO%U%%f݌p9%;+q*ò\o8ǸଅDRxgI*:_ _RJ=xF]gjhVT|vg_ 9/$QjVzzh[\ۭO[j? d aEшnK}+G~uETԞ2tSON+6g%[YJ 'mr 2r=^}.wEsSQx]}nu5eVܤ٠k:.J|{eG<');@,m|F ɕ:S"%Y7>ѾWR]tBcUS|veb <07-SW0I]WO[iYޗ Զ"|POE(w/=OcevY{C,sp-qd/nF}n@r~@{-Q6tiꪴX]Z[FR2{,=X[ lEor|؍`qOk6v'AEna@7FAQ鞟z?SI2VO՛#mɶU;4Uo r6n_䁅G;دl{F! !y".n-lXY!kmtju>]f0PGp?k,/y93I8E_+\_ s` 踰&7 Od\zޚ/RTwc,fTk~)rqȇ:Qo+.q핮9{62Q{FLɕy%܉eȱd(lpq)YԔ0 {B_q'([sdr s ra 7 {n .ldw,s1C˥ujPM?OW d`ry.?ȶ'%CFTm֕ pv:ZUZK/w۸{`َ ahۍ,b_ /d^SuUu~rr} /j*k.OPv>#SGzu.kS%U )nO~A彑T 6e*nb:uF/Jt3pyx-o c9X#,nޫQ Qi9]십K.϶Vrp4(lm@+n,UKh#R5*4ȥ=3:fyƛc,FjaN5 IC%{{ _[,(^55:Y;5U^Ѳα-$o{woc _L]?:q,woܯu&Iɻs k7*qףƾI׍7qmu?L\Zǹ*j6ɯth4uuڨPQ*rarl IaeGa|߰ dv-Z>rf<GPYr//cϩ;ۓ ̩ܛ=εY>н=(CK(YeNU/دo&Xw7"D໋ȵC%/Ȼ݈˵6%Yn<t8cI\ɬv٧0{ d?a-ҵΎ˨zS]U~꒗FkY\=Ȑi ;"k9~@X'%]“[`I4ZgžFG3l 7? M+'"l9/ǸLRj8Jr(Ƥ%N]M5 @|ug[8!ca*tVa XHۭVVtǶK,Xcrt] d]_z}vG1JMy>^ssrm@/s(ke[7(K[+qy7Ƿ@X3⒍Ʌm9 aC՘ @-̤b?U08p#<qbabTEp9!nXb p|tʼnpec/$c*e-28 V#C7[l-[(Mǁ [|$/"eZ|#nAVЩJ{69@қfuq*0T9fQRvgd[-̤Y0^pllByR7ij`Oܨ\sIkWu(II\?\A0h蹵.Ri'.8 RRdȳuiv8nTF*i'|Iqً|~!^HQpiS)Ji[oS~0d݉bn?COXKGk~:T*GI{QuzD;NJVGZMoKҔTS_" /bx2S1gqfoMk:Wv(ic.翏dM[3[a8?7g_OK_[qy;,99v`6MQ3uA{m$Ϡ&c:_f+t*MԤc)Y˵{IQzsq JNr 72RvևE괨 CN\sO:ԴUOϰY9 K<#p-2{tM#|ߺ_k9%Ґ/~@ B龫KiM(M`٥z]JԭM+Ei*+`6)XNF6zL(WFtuu**7wGF @rU#qBWc ڣ|y1EXsv2{1]{~ G[/9! 5B骑k䚺ѯHAI˃HuN;_R]DZ֩n; } 0UT.s~aɷr܀  l B9/mAك? / YOB =1qxenor[qp8F.%䅹+_pk"--#FÁ`$Ʌ eF5#)_}:Q6Ò!lp[G蚞[ʤpk/Sҵ2*sŏz?i:WYA|]S!J|TNw%9l%rr$ば[g$-;z_TJTqq*%Z`)SVeo91s`,n,CROYҔBK7Xx 7 A`=W l*s;_;_mGCZYUi}SjZeGRo|92!MGgLi4k>ZԪxj.O/ Ȁ0σRiӡBJeWo%n `FQ[!Brm26'[2䶹ۧIiN?5OcALs Յ۹/W[Y^UueR)n&~C- J$ɋ|81|8 \r@[opBr[41CQuI}w}>:Mwa[X Q;SoU ؀L:=5mL4iR[#[B:}TjqrPLRȽ rl''dUg:)VV5ߢjaSJvW'OY_Nm]Y5 ]u n8r @w;!(5b!@WoJLuO+ԏm~E͟Z_O5 dr9{r-%~F!E G$e(d,!B~Kf w l2o:85 WHp[\gJϾ[|I՛'%NFC#B%V]Ƚo _ ݒ|6g8T b,؜?Td?D\/֎Qݫ{O=OCUGIO_t>AZr.qwY~G `!p8B|ǀ3<_ /kӛE%ɷQ]F3wKcF `RE&UJU~>ԕZ.2{cZV!~(H \5fxHrQ@!xݤ5UQTKUVRJ͌#VPa M~h!^ԣ:q{C7 ҟӨ^UjTW,op1nG X>J l:ʔhֿdΟu}JЩZi^Ѝ3*spiѲ Oc}?+a4xCj'Je;'#[ _6!C+7#dB{ X˶3qy [:m%MD)E;M==W ǵ,hn#qb]ӪҕIA]@73 -F[3'ۑqxuZyvզή׵sPkj4O(%Ҵ_ӡo_Vޟ:Oףx-+{<[tWU->QNI_C L*AQ|H"dL!aZ*w&-Bb} /I+aظ>m&O?%LlYxI^P!G>_Uwޡ] CvA}n|b #{EX]x؟8I(Y>t-oO5t(Ճ*[.SRU77( 6_-dtN98s RnRm0 b%؟ { .G+n _9x[!bxe䃁|y(|2"ܯp8@ErW_8yÍŭr^wx1?s KjWүNCGGO*?y؅dNJtIo>[5Z=UJcG!bR? #UVGgKպM}\׺j)Ku(yA]Y=7MWOSsҍ71$sASMM ]55ZZ9}8G?2\n7;6[ EZٜiN1QMdh|@ ps8"ŋKurh {+ʚyvOg|ݜZÁ" ^npc)JsXLV^i4JG4߄|o8t4zK ]z+iO-_r6} ex *'cM&OF +ae?}9F2 ۹̽I~*+/΋Ʒ,wE"aotRs`C;Wme 4(iaA҂g$[{,<13-DS9˜?WVG[F: ԂRUV&FP9yGAG"*!Q wv~`-/ _22E0Xy6:%\d p{% KX2qՙn^;lwW`l pp݌|>69. gŤG? ;G{] j:OM}/Z=m?FUʭ<1[#tF|eXpUƭJQ׳5zӨhjp ,p6r\-"Y(D\6C6/% n8''>pGm܂[.n ߀F$6|kUy5ة?#%ʆ-"gGG(J/sϫRUNNR{`NJKyfI̬8'$gJM }J'Xp ŮB*/U NJ5!u~7xɲISrvdul!3ӵzM:tiwJV$2Ox*`_-O|m|{,J,KY Vd1f#T`3He@7o| 3b=S|-b"pOK|cwk ^ZQRvNR߱8 -^M)}MGعc&eSlit개zjTیny3Qө 3]^FCRR6WɢJEwc(d[/sm:;OJ躝 &PKSIUR5 qw>wӣjO:PV~ɳ)2Iy1l~FNJ3MZk+Œ)+%h; {2-_܌X;p%D6B5˹吀ۜTHPH [YGSZ},%k>g]Z]UJ=}F(ngQA?*2RO BP)rh*ks8ő+p1B Fsp5ex!@# [^J>>WBnoihhm>ק vkqf̍!G}~RSK78+Cȷjp8$G?V{Kd`e w]Z^B*&xx&,RrRJfi7c_/ Ϭi5g~G*Z ]f4m>^eO#bž,F?䈤"m ӨhS=egObK28sK|^ w-a -^H^nuj*i)Sj_|˹rV& Fłݷ$v?|X-6AZ ru=>-Uݴr< 86ѧwME$jxv_#`1ʓLiծJ {Gk,N,r -c7Al-=/rX ʦɳ õ٘7{O%Ε~SU)T!i>jjJY"F0-? e'^ǀJK཯#'\ _ 0G"ǵ275'uq7Rjm?,#7^Ca6BwI؀ @U9XQrsyCsHæN:ugcC?:mc]W;HuOO4iQrrL&蠥R7Szz.aVI{\௪iMݜҗv`|\l݇58ԯɤ:uPSV'GdIǵG!ŭx}伓7y,m|KGP}_MC)# ![/$ @nA/~AQ\l7t@E n9BYB2V}Fܞwd ٕZr.ZN=ǵ@ <@Px@Q)+JqE qFZE;+WQ-$>'/7`X| [6dc(LQ \rQ<K EݘȨs +$e//vn)Fr|&kyy,!#Q )N0g6Q.%'-96*9_ݯZO+zvO2[s-kp'FASwgJjH<, قzztʟӬl{g!_=Ϧk6ƥ)fPgNLᧄh)as:W'Bq2. bK4#7 ^_Kӹ_ rvzm}TӤFK==IB\Z{~Kr9n~Xp,][d1oXG P3|)*qɘX=ł ^aܣVVp/ hqeqlN3*iIfRI*m8 \9t^EeY[ϝr?{~;?Ow6>{ϾJ6Rv1+n/!n? =CB[{cBs퉩Ny*=umz|tp Kp_#77:RQ[摀+\i SZ|GOOԵRj(Uz]WKS&mx! y;E^>>'ٗ8Y-7i#JZ*Ɲu kISw٬rÖ/m<lէe%$a-ʙ8I%ɕH:rp {lRU{ӟlJ1{nɻȎ_i4Ҍd-':&ޗSWRGor 'O襤{#wV[Namp *Eױr47܀r? -ܤtit:]XRFu'7h+rCWBtjGdQ )˻`<LmfBN=<r6{x}O|e}'MLW|H NU, @9GP͙57E5 n6RRoc HS㜁J]jۘࣀP@X/s'*\+rA`, g<VΒNQj#fc /klR6$V1~T7*#]FJ;alZw”pzzt ˷xX!m=JhZz?M9^AJӹiE)FѧspJf 9nG`$4~W@*J)}Rn6>V砃E_{~JK\ KI$xyY~C~E y b ww#髩FbἽ]6Q5'1s~_OUץ.3zujB/JOGz{UROw6ڇ;ׯPןcS+STL5}MWR|dd8Xy-{ӗ})l1`|3eѹD,e( N2Jnvi`?po ]++\SbHe/lRuH]JzF(U׸' wL7$oHl"ems@b#WF=|Zz;Q#B89IvycK:4ɨOOӫ֣:Gxf-'2c(ҹ;=O^wq#]j*Js߱ { lɕ8wG CkU6>MZM&>@%`G;{F=%VkfR2Rm۫Wʟץ(wǾ=th 5TbM!ϓcTO?j%=Bӣk5ous׉| ` x%H[_9(^_8"~KrPv{ %طvղy"伓^I% #qe YVнܛ:IA39kK˷c{_Xۻ;:%' Fo3?su.ҴI[OsԻO%;:^:-l+ʜjlϨWE{#X1 `=BiuWJR_tmxÓ)Ҕ"y q-M-9.#2y3lj|gv7A/d0 PM_ MrQw>{#[N.~ Vl<!ʸot8rA~SuE{ޯBuǡ1WgCg.?hTäiqRW}cm?4tBwWC`Id'={9BMM@ -b@-@ İ{gu@(F'QvQPVN#OOJEVJK@)N'RiJw<u].*5)c'cZҭ=Mf0,=?FQ\ݮ:AWGGSOP]7ty2pABnm6t.{'Vnu$'0pU Δeq'wsp#JNV|#߸ 1|/sLHQ6دnUWPVFﱺz#8ӛU)O?ڔoXpV{I({'U{6!8)؛ҒJx0vQ8걿,S?t_ס$Z _]Sӌ(^˵Y7˱! zJ$st-qղwW8c6"a6b >JR<`'99-K[CK[URT`P-rc͵fGq2\ӗkO~_TQϲ='l7/# 顮QJR(O;MH:sqw19NqO;>AѡGKYRN%5VԨW{2[>IHQ{-EBVh!bS>Mu^,%*1a,-m2み$`/#/q``aA`{ nEBSw/E,;+ [C<G"-,Qrf!{9֝D۲VFb[rthޞ.oR%mhn'rF;F;?l N]b9]f7rr]g(h߀{((lq| {ߧ=G[S)N>޶<]j_D"/%~n/^ 8x:tӡTUa~{`^MJoײ(iu4UXAZkGiT!jZ#'U|sY.x كe)F ]`XyIܜ`kq:t]?U٥Rz984@r}uCPY)A\ONMd妏m&s}=B Ƭ&voc}cMtjT4t΄;\xT}/IQ-vk5UEITQRHPnΜN]m?NnNݓb Xܑr΍?V0uKΜi.~ǘFWf}Z,j'`÷a B );,fſtlIu~SOOJKy?vyNXKVre>PnO~9;p8ܖ*ݬ+ \`  cnPC7..,F܇jcdKz_WץU qRk4ҭ+3[pXdo+{[ىFtЍJݢ߱O4ژCj'Z R\eU^j$/d{^4q;ҍϛcbXl\lU*Rq\_!9ȳ Y[̜ vY)7F0`,7lz~QZtSQvr9;& Ec#9RQsp7 #|nW i7h5(ǦUQ}8N@vISm(9qR9(OLR]oGS==QOW;~ሮPqY'ExdFdJx-:iRj'J51.kg*s&f*_Pӟr]ϹKJ'ﰷȽ*nQq͋|ʍGFіQ=MYT+k'" H?aȰ #f t-}^-u=<姃?sqՀAfKh=5ԺKJ4yUa*spJe:rkūB q~ޗsUOr萡 j"tn y<[r9*X`c^[7w{2| ؗ ¶_'fAijuzPwthkukƄ*IB;DӣUZ4NOBKZMMEwNwq>JKّdp8*=,S:Eبאr[;q9 |6ra.wF:.6#\yc@sar߄-pKd 7B>>PZ}$t;oGp6 8,\ ca{y&w”%Ŷ%v?!mammsBN.LJ8/kL'!`k ȑ.Tjd]M oN/0p \ptWpV4cjPdHǁ BΌc:U%hx5;Æk#BƢ2WLSUW(= 9[ ]nrʲl]4!@ v#w܀.uzwC=]ZYGKBLR>DIl ̡nx)s }p Gr  +p}o{*R QE+<JnM$?2PPTtWkTQ&rRryiKzizQp5fXtzV_nA- j*B=NE} t};PRSEŴ1}O+}*M)5% ~c1pT1o%bp 1.+leەg9I}lNE{]bu9>?C-u=B\'.7RuӪʦM9n7`UbI(Gpfj‹ =2Ia`1ߥWTTRoh]UZr7 qnMvNl _kt:]=>붪>.|֝IRwfbd_䱗l7uJ ?k4̜c _}>SԫN{Fsl#bA2tV*J0?tr7/q] a,[M߰`X06=x7SRHFWq|u Zʕ)R(ɷ RgoTޖ-]MԂ3ʓQܗ3jM`"lV sNϓ[Yn9'%\xlN,YʱO;ꧯN:jJ9y l ;]l-ɸ1ѳ/lMLMSs<ܜ!k@ e*DZېXN;;Ta).,TmZ5!j&eNk_]*:Mы_ܾO{˷7ob!A*ݭrS|}ͺ3V}PU'X#iY8)`FBgn,lmUM=E:sq٣֯n}ںe7cϡ-LjI&޳ֵ]kQsV_6T~5MfN@uZ;Jj]oPԪ*i} )Ջ>sݘbleXľEWXF:Rpƙ7'vpenOn+u ~)S}3(C`lKXl[ݝ~= dp^N&3jvV(KHӿ8 g!?Bʞplr9B.ا'{^VFYC=cFTuuTTIjf8e Sn$b8"/C-$[["FW[CYVpK FVry5lR dr8lFtR1]JIUՂKkOIj){cD;&͏:'۰ro{pAߨTSZ(`_q| ٛ+j!T`487|S=#طm-=JN]ƹ+7ry8&E!o Anװ9d*÷'J]ݯy2J.$+N.n$mjeVW4lNUj(B-n;Uӫ}-e glϲ XxVd yD>A~ /:~WJ:\J=x9y* ~G$/``8@GAX-^DG'{C:u>OQz(UiUqj{$r['_?{{5s!{>ce*#IU$хN|MKyJSoI`=5SGKii4zHˤэ8Qj/`˽?#*'v5)w7|Mn%a^IG]lndl! [nH 0(EV==WzST Mny@"*n'AWj{ڝfxSyQxF}7}/㚸*uZUU|Iy>d$ӓkb Omݐ9ar{ >-ѽ POWR|coiTi+HZ? . p| _$ y G [~*`$0r"Y( pF8CSWNJn80)Ttl9n\9 p.8{ܥo-}5ijvS}A^t;cI[KHu][V(P$8.6 Lꤔ6fEwarP:jZIwɾzJOvMJTVJ!5ՌcRQLy,lroqd] M`PuꚵҕJ(ZU:O&q#f? ؾEleܾj1卌+'t|28 ~G%l.=^H py#z>8Tܣ)<S~եj<-ϡ_CjҡN%;,շgbvZKQwNr^ʔt#NOW$#8G7- rq+{/ nlIEg> ;uI锴JP'$y^ϐbpl<Ez=U:Pr:]u_QVHrcE6FI9ɷKSVSV(풒5|2MO=VݖџmEi{<_v{drl5;G\b1"/ / DG+v^6hrW˛pClew*W,;IX4~mk%XfT\ғ~YIDcJB?$/[o#f8NW0nx &V]}Ax`[.O_Spu3gNjԏ~z >ӌT'>do.8Ԓb0@ WYoS*H !@nR4ic:^VMiԾ=h$zORu-ڪ-ecͭVURNR횊s\]9 <|ÁH`9GuSi'ٳ{{ 0ǁY;+GV9s? 6#(!nu'>߯z~ RV8GCa Zos1ȶ cKUյkƜa̎/9C,ݱb-`|& x!luhzJSt(G=Z79ُ9-A`xc^JNG*GG:HZE>i\ڴ*ӱK:n0WL Z#c^[d9|Tѕ+^W5؛5R%'.ُ93HlT$ܷ~́Rj)a"ף==W wO_ nUW& k,6 cP^j4/d}_z?B?կ{>LIr6=lm\+ܜ[p$v_ocBI7"À B`~2!Cj͖2iԜMnse.qiMceRR]5\ŐL-aDZ7|{9q` 88[bQ'|82%QFtԩԯB8T]ДҒG-.9ɔ_kMnI˹}8 ath](ʼ{).}zUӵJU:fz(!6[KaF{y9*,l؀l9}:U:tJ{[89./@C8 Yq1X|uEUtqյ}"]Jd<*웋VhĀ g.k\-$bv\(2SvDdŒe?5 ddm6 G~aq䫛2~w\O6v12TW&?&AM=M! oC͘y Ε֗e(9ɦȶkJ!8EXy)!n<z^O75QM[෗mqݐls= r  `r6a|\?.>F:r`NF*}9}&l8Vume-!FNed7JzGuZzf ױGM]&m]Dtnr8TNOuɉ /!Bp!+O%BGpO̶t>h铷|wޣ7LשNng2IJe ʻ2Nz 㡧T}7OKyrʝ9U"&Jt8nǐMZ%1NWXM'HS &c}[:}sFfy>=GeM'SM+c`a|࠘{ dtO{lN  ^ٸ,c`.-pJQ&ʺy n644omL>AQiuJQ9㽍ޢNU[oO9,-7` pXǺI_q8:4N UoꮁF)R펞1Si͵E=':>O)6|#g79=ـ YM$n@rB M[ 8nMV@Bͻŀl-cb|QMn߭}gE=>hM+pQw|j.k%gBME41{k Y[s+!8]?UTu(>ƊeVnR2Ruj+Nt:$]ML6g0^TԻsn>dةE}}}ERI:p1ᅾCr?cc+ΏGW'g/4| I#OJYNj(c%apX b؛ 0p7x-6clB*Uny܈`+CL r!0[@.j(YIp.i:5jvPo0~Oo91pVJnt+yln,/a@ CDUVKMI辣U咱/7e%llM0-#BA|/s@G"p[^\aل]e3V1ϹѨ)rn_w>G~NO[OKuZ\]TVN]W4lgBjԚ*Kmca`q*+*%.aj5'[Zq6Y]jQ%BE;e<Cً _kFaj ݣOI^bp}Lzժ9ߓN͍)Po78xL7+_cd/ZHm71yan<:jT'Jpi}rw6 ,"ARQ|ɚjt8a-[9(O˵K6 ?fp=ʏKEڊtНZ'otz}_GS,UOU* J F]y?$q4֏ 'ԫpԕS<@-@``$U{pB6+{䀀UZÀ0gNKȓ*spX1 `<#Bx7ituU(o %qtR9풳4<yZہ @[_)/۳d8Aُ~cSJ(u>隹Jw99?l~HSe ΍U8s_.-,RT{Z.RwLA?usEofTE.Q$Twlgԃlѣ#!^6'÷o #qE4t:#J蛋R1y &&R;I=*֝ju$'0D[^ oف{k`"pgJ1EU6С]O?rr8^@`~-:Ů˱T᳈A2c s$݋Ej%8Aʶ _@_bŲŎJMu].zU*1*J_~OgJTP)I(Z*u8XfEG-{G|Frvb[؀7|2)ݯȚш -K{9[y=mU]-URd˻S^u?gs 8 PIZ}7Eut^Z}ak<0eROMF*:{~}ρhiiMkj*Fj{& !] Q1 gtUܾM`& -ܮZ҄Ӎ骪R٘W:JIlb ,b썕h5iVXa}zNںr-v::zZF+3ꟓ2 Ցanɽ+N4( xk'cdfn_s5o]z~=MTMǶ\4*֋kdI6/u?D[rLxa3by`Xr],lߑl+%kŘ nʟepL|dcp@ %f8{rOl -.2?$^yd<%eZPۄ{Q`1r]}j' rCJJk/YF=.N3s ڹ=}L5CWt{evj>NuS?++)JTkz{[CjE? sRq=?Z5P :qe#.ya"XC`!Ap>C<BJb唏뾵ze-*ӌc)el{"vM=^)ۺo\zuN(tfK_Ȳrp_q ?qPQW ؃y  Kl%Gg.}&=9(_5`vn?Xد$ca r*͔Joϡk Vnz=K*ZNT~ɏ\:QSwv<>@[B% I9[F Okk̄xp B*؀p6Aɽ,ΕGNUIEN*=}xHJXs2ꔴk%G]~N P2}.ԝZ N1TE7 3Y\0(SlU!HSօ T*T|bz ^:0بE(R{\:O5^}:_RVy57U=6R3++#0^"؛9n۔O/QZUw5H^y!xgة]UhW8(WIoCM]FNo0K-~LRRaWC6PpU"Q.Knd>sb ʕj0-/<,gNB WjiNY8ԨtTYT͸8rNrJټ Y<-[ _#bq3vZ:15ث=-F܏[Υ)Szj>xD`H4;;0[|"n<GFX{@G༁9Ak̩ϲiG뺕 Tu:Ε%hn/|\[܀xe%6l٬N^uUEm@aksqq0lU}9:uJQ+Y:Jо ],˫T϶{_@6Q*2d Q0d*@ENzc)ՕNe|XVu=f_&{!ql]9%XaV:, ,rn `vNaԯR뜥mkh/ levO(pV ry.Ò2e Ɲhj/cwPY^U{# e4tt\:j r=cW-NJS8^#dڜQ  sy'{};/uSli7K9d:!BNsilNkg_#p'?9PʱrNWw)Ӝ'$6ԬN0MmI/`CY6!6o"〖mcTOS^S-2,6N7rV?$2AqBX|r rg:ڤnYIK:gL]JնFtj8TN2\3_Qܸ̽V*s0AJG`1LIB>͞Ǭ=ޥN>߱?Bۑy=26xA8Je镙rwnxÂ- 9ΝjқGWQj8/M`qq،ݦj!F\9v.NwDŽ8uzH&,/H!alF7Pqy9x@  p @@LScdy0:dі t$VZ4)U 8C[ NTiɈ ;'@_Mn:B!p1~rd3[,+`{0w Tn.{ڍ'oA+uӴ#J .}NoRW~<(p,Ws3FtRjl`/8̀l`Xwܢ0J }n֋)zhE(rwGȷvN ;6r^8y,-d,N |ЌU?O&5;;ӽ1 ~  ݣ6D2OFUJ'Ϩt_LJT/.NYWD贜rrȰ'nIo@\0  /Ug_IQөgZԕI˺RfX izV_(1WPo3R=KJB-d:XJ>-݉BTJ`'l6a 'cަ_T}UpGS 8TiLz2IJNy>-'X=$y1Pqqob2Qe.(K '%?~S-%hզ8;k[[[Yԗv!ToKn[dr,{ 8F2MV0 M뜖\H\e&ȅ'p RªII4Ps^5)Bi+Ap((^WX1 2.٦}>.zZZqTf.N.Jj*V6ٌi[Eu >`n$(@0>y'hq7d#rCӕgcSE^ZOښ9 Bs7͠6 l.9 F x!y" q@r9pecwtNթ´{NJEx(IɎ3`8y~ 9)ZĶo\or./(BU%$&Zd+WawoGoq#`+mT$7jr^[r2*_p܎TV~ӟ[JLJԄ^%hl\S*L6v`xA`HX5ro^Iӧ9F j?^ l4. )()eo mGȶBXX#*h54T]N](Ϫ]WWS9X;HIV?'dLF/ȽjڥwZ.UeOj/ړ49'%JF#pBOo߱:4^7{'')]r eR۹[(aaSe 5+ԍ*PsݔRfvSӵʕXnrpwOɋQ{5Uj*?!@Wj F4tjƴg*+NP}CtZORjZ^OМȐok&JV[ B/l NJ8!w[ Cj+뾟tl*+F󤿰 a2nl"ۀ&jœT{om~JQר}M=^ܐ&-\!9,a'䰹V`ۤKKUTf%Rrde'&ARD{[Lo p,*_n[rúJz?њ}wMZkmK8ǹ޵j^Ub} nW({m9+ ,7SF)d')]AC`,8 r9AAp=_%#~^Kգۧ]$Nj-?adgO9:ZZFj9FS_K}B4^ׇo)v(K" BǺvn=JnnI.ab-r2<y%90< F22ɷO^Zzѫ1TVZ'y6jnSQUBy>~ھS#Koa#/ȶl, ]ʬVnM# X0 ?p7d!d,Vҋ+J:x[9K`.6t 'n.9@ɔbb&u+N]򽕑4ZN)IJ/Vd:wT h bp^@[X,l~([&Uj5GTzN^Tt*OOE#jBz]O_GҏgԵ߹N@@v\=f]7KTD;2OM(6׃?U뮏N2Hn9gzUEENWHuticAΒ&ieEk@T@jSN?S42IeKI.J˅?]?nb}U5h\ڿ]vWSOY%R]s ] @Ňfܒ,<.N'gMOkac)wv7^שMJvֱMݲ7e#I%lY=(EW?Y}>TPUG)YՔ0UJ= VV{`e;^jͤt$m|/E_MΛOZ}級IJn3MJQʣr|aQvw2iFWδ7זy-E..%*k62Y{GUU6\g9 q!dj8qV5aŇ% KmS >u'+E.YֺԌ5M4*jJL|2{78\ {7 [Q܌QE9G!yvn8v'#qrX6^ OjM^ǯ}M:m= *AE(رw&;1Xہrq``pł %y'3]7K8vjcWQ !ۀ*>.uݾS,:TZVwjW1qi٢nGsb<`n؃}6WR)I|ͽ!|0G83FU/دd}+uڨ㦎.S>r:=ɥɂ%"mݷ{&"}$࣋>G伐$+!t>.)29w%-QzY 񞧶1#l|q|r7pnŦ,],]UIF)GQH+gQj"n^Eq~'L#r'Q?cx*nb#K"2X< 6ml< /(;7t/_wLu=^:upaڸ :QueJiŻobXIv\TNK.^1(ٛ%8J1Ϲ^VjRe&q=Ku鯵ZH's8!-Fiwn:.]*-:K\p-MSVrsBRrjIF}Uޡ.ǭ֍+l/U:orr ٿI*4Z=6K X|yx[*ȋy9`X^8n쑋 k}_jKFmEFӧ(wJ%Jzm8-oo8/X= J.Sٮjz~T5TeJwZkgj=R窄\Ϲ 2v8ʜdZSNd[OY'6rQ䀪N9L7wIm\|x.RM[EkQ**iZzKt[J.=|QRx/aqÑ'8(r72IF.FƗS&jyb/q?^@r-l9.5RvQnmYY݄ؗ@2qQw߃G { #r] Xc"e#\q]q=M5=*NDRq v0bݝ};jPҕZ_'=ZrQJnQ8VaN0횓jURIBPmaxʧo Gbb[ [7،n[`}`ȸŇܖG ^@ y \am*ңvY v9w;Klp.8o+`ől ps?VA{K P ^oHխ黟g_ k]MOm9_7vb,ֶt)N982Sojx|:rP@@ bT(JV1c)Y,С8Cvp@x@dJ+ q+ܴ{vUe M5d`YSqWd~He{`.tl_Vn~Y6zB.sY==z<`iҌex;v S%Rtδ)Og BMI4^|>I+2lnXVI8@rY{9?qgk#a):F֕-2tbdqUTpG%;`T7d&︄{؏p9Hwt.St{.^u=_[-N}'E]ӨzUҫ^Z1oҩ*uknNM06{ Y_ nR STe+N:UƚMQբ u_JRy/u%૒vÞIx{P '09@Ƚ2;1&zM:R]Iڝ^:jfNJEQLϵɘU dh`V#m *@9_t1 -č#.;%ɏ.;]sq1)/ijSz~OPBxQThA%{) ӡTl~ƚ%Vgѵ:-$SWCF/k}YFU+^v* j#7ikOSE6s܃ ݦ9KIlSu ]m<%Ui OQV9K|#[Vyp?$(؁mr!{=lT^.O<( ?!7d9uWi`<rW >I=@X*(dbKabGH씝Mi—ImX' n9 NRnʹ+OOQNvwjUUJeRow'vjLr-cѣ8(߽Ѣ^%[#toi*9ԛQ=[kL5yRrWW[yG6`Cjhi+:E/kdQ+/c@W-le]?t=%SƝU.Rk5,Ix{r>Dx6a-)ѤWwOVT^99>6 ai)6o;;y ܋qFn,Jȸqq+]یvC2;:^WN(NrQHOo/׌)_^.~s-=yӚ?䱌҉ >r q bFښ*J"GԦKV[d,0..?%{ڕ߰NT8Kl|ڊ4%JYBI=v'X&Y Qob-46N 4iek4Vj1ݕjvf*vrFpeM7ΫFhEG@<Xݏ鎟E/f;x'Δ#:2j0w@ r=Ĥ)%Ok+Cյӥ5B0rR5tiЯR(&9tΒ\왮V؀7ikO^R:zXuOJI(Z?]GQ)4Gz?Ք; o/c75>*F ``mBe-,?}>R֧IE^_j~>Q=UJVF9''997vKF`r`r8| <]{k6&6G~OeNki<։`@#-NGU[9` !ATݗ*fMSU_cvOCG T F߲g1LRGh&g Yog0Tvv }{VG:E~i4||mGCj\]<@%cP  /+_ B8  _$p,>%伏-Őxr`_ dXd[!mknBb\X㝀 "J-L9[/8rUx/&T4^ON:Z$;&'&SjYY0_(r$ȶ/9{UYG"㏐77i:գGкnQbJkY{%/<$'s)ӕ7i#a>o#셭/b1bC+he)Pkq9799ʥgl^1IJ+&F^F[HU9!dZLx `ca@[\[ p͂` -4Ɣ$l#O/v `ZqWEt'IlkԭINp_tY'%En=-bjx<bx+aSYv]Y֧}O?xlV_ףFeNr:GO:2jInp=-g:5)JPqRʺ58g (%nV.L`. hn/$l>,088{]щC6Az_X]S6[?H>itrLa? JQUwvynDl1MlA^zTEO]>S|NN\+V!@O'+*3ABr[gX;I3=5i'>]>^!V[t%)TNeXQuk_JV| hG)O[)}l25z&ҧWW8U]Г[炅G1(}?:mo*UҎV*ʥI;IG% R#((Ķ!x"!Vv,ࣁŁmeROlڣy{p@y Ȁ\H Ce ^b;7pN`<ؽSgU~[O*ܶ w';5f?^BbyrV[]`Ol N_7oc [ 637ZkBQR c,E䛱q`2R?p!|ܰ]UcH^:U&vV鶴9;NKI9*y,+NFQ-Xs,Uc:%F}|  -;}Jۓp*_.֖y#_#ŀ NJO+A|]QrWlN'Z?kzQjgKO:pt=u= ^ԧ.-_q̀ !u`<#~ oa%ٯcڧMEOKSϾR[y9b΍N7]G7#^~Ֆ8Bt׭^6SR9͙nC(Ŵ,lSdi/~G4CU]%Ko~HK~eֲ}~]./_RQ,[lT'>kئPEG^.-k+QUVaۧr}*t,vs @n? \ RQl\vB}/H}nTve'mKrVmSocMG\ѪNtR}ϞO«%)!H kAOSTzjڟ _~ޣ4u 9ǹ_GF-YOWVDqwRkiWQ:tl"M:<ҝƐʜIE~ 2V< w V{b.MWI^t5tA/t H8w{n|s~kj! IF-om.VᣪK71*~>w2b')gK#`BNj0bjbK UhjjN V])/` r=pP &Q;LV""- }~ĸ2p[_kՅϴG_] G)ךJ=(nUѣ0#nZ6)Jɮ,eޕ>Ԍ p/!m%~Hwbqq|C { OGNeOO$G=H8MK9 4<P|" /b9JRx|#9[u*G1QJt`qJC(w:gxI]݉'7E!pK SѮ>'r_ t2\%]wRm=meI}*m.[ЪՌr5^MRfeGugIzҥ)ǵUNIT79v5l װ`@)2?#7@&*qR\]5-7՜'VifQ--hՇjʬ9o'st8ܣB 2=XzCKE EHіR]9ToMDelP>9ܛ\f܋|4Bkw4w<\lamǃtu5aEҌڄKIMJ3d´#Ndkf<0$.~-6eo@*c8lYI7b_ X-'#f>LYvv]7:)UۓMHJe>hn-4fblW-!F]s@P{HPcp thU[MVTG1]1kj:7 ]#ҽ-[^ɞOEJZdŐ) XK( XuwN4'nRp{ 55tS')]8T.mEZY^Ml@.*DR=^ǗjgMΤfb)(:VoVzu8CEa֯Rij/>[[%v䜍ۍr8b)nD/C{~ 4۴g糧$0>R|`<62v1 ;ӷ}j(@PPߠu=oq&iõ|O-& J71{؀:jc=,(Ɣcܳgs/G=6Ƿ{7T꺮YVU*K)zgu:G.%_RQ%np|p=Z:~453B[.<7'vى@V+_=n.MRp\vRT)]wfEi}*Su>FV/_*o ҧ'{\۬Jw u~W&"< nƓyZP}Y} _5 Kn /鎋.թi#>mNQ}FZzZY(] T,NnFap6X}G=?Tuu3RWU5UR{[$p\y%G NsU]3}gԽ7.KE(өVHC'\[;l c I)[ G9wWsa!sk _uwQ?K辁j:<*jNkC= >>ժi*Tsx<`8f㑰!rDܡ2TQ -`G蹹XԊ+WzAr]s]CzwKi^x| :ri[ - -A =>KDԧ?жQ><@J!#`Ņ/7"yl_Z| XV*U+S:eJF'+drqaw7X8q/qaÜ X eNNjʭNoRJ5})wvzˮJJ4#K_^]=$*Iԏk,1UM`(;b@. @X!@A J?^!}>M$ڿVp+` N pZvof6jғM]UYU9NrݾM\Y>kX8k8JvcȰZ߸p#YFsbCn{*ۡ:U'-OJ7WiT{`)Ycq=}$~]?5j9<6ihQ7ڛ:J֩ ;LIJWJ \ٞ}I^!}'7Qɬ`]H 6=]7A=U:Tg 799Iݲ(ú ҪtjUu?RJлqO}U:m%:ѫYOn@ڕ@*Wv;_ .} .̚UmUGRITN:OFRXQ[kDuyWNKsz;KiWGZ1߶7<*ӫ*r5=@/t:uW:]J0lXż-$I{\?- @MMmm$%N[^.µzRr~تZXf PcN@وk?c[+-my&P߷1o| d`r]8M**KHtQj_QQΤs9yy/T'<7\ᦕ'vh[]/n}?ޓ}L\nuz֟xԝ*sϏF#~KtPKtVIRRR\;l9r%D81G|mz`fi-OܬqpXX1nZ!rr_ب=qcp0V837-J*N^L.Oaq97D(&J3kG 08z{SsRs]+8a/UUcoezSJƾ >C9.7*2iy.MnaIEژQΜज!MAӿz¥i֛IIݳ` _cXj/GZM?;~uS H(-`vƮtMҾ߃ ']=߫izoT5XR[ש^VnrymQC}CUo}UKM2-;/SR0h|VW/)(%HRG=ִ=J2iJ+1:}s*v4:.4i|]tZlzߦ_NӺ'^mFK>GUާOQ-^BIŴ $c'u7꣤rdg&sN]ҽr c6rdGQ7EXy2}$.엱mqaM3bg-(Y?Z5FiF[(61<9 !{fr9ÐPV'#]`|#q``,_nW6D ?EOq쵳pB OɒXw@8*!^U*Υ{+#R& p, l_$ɜdF#}ܼmRS9FJ4( ݤTUiKqٚTI9Iݽ^2 bp@i9MIn&8Cϑ@[/Ev'Z4bFE5Jg5dl`7(܋A.ȅRo|>/ ]\JDRB-p՞H-I&QEO`'Xp-97,.& 3Y4*BQi1&ŵmT'*nI;{Z*ib rB9"J./& ;c:FiERu*[Y^un(9pVyNR1 6QvR?Uֹ@rlRzPRwžHpi$c)E\/e$SUkdvl^֟wj-Z˰\efsx\=L::R.zxQ4uVWjP%/ǚz:me:R3}BOTSNfD8<?n X9V)(KI\JxHy<`䝶1pv 7 >A .̜NӥԺ,R5GޟthQխMweg}xqr,! `<|l/<<\d..{| ثv2M)\OX%ɒ]v9b1}ѲiIͻc[/{mjy:%/`tePYI=tjJ.Pv}lm(njy`6`=2*k(cJ{T/&흌_vY >قn/lIΊD%7{u+O-D+^8?6>͌/* 8p ;,QqviNO=Ű8v{Qv%JsvQ8Lҵ4ڨԋȮO"l [[  `rpdnF)d=;_]㦊&쑫Y_OWOK12<ڎg(Qm6c ZGR.rR L*NRw1ۧub3Ύ4~OҌ|Oɵ.NTirvjDVñڱpWܛ\X Y>5z>VYk4/h5t^FiSv0B/0gJQnjF ;7I|4HUF]sjz&zMZJq4yV BUX* -ZtZJk4ɦee{+M;22ΞKO[U۪hOV75ؤ6EB:Di]o/ϩPNք]-['$~Yp՝* @.|9@`HJg,XFJeZӭ'*r~^,p?aeNiI`ȿ8 0-f%qi+#-tMZZKﴯOS/PbB#{'~Krpҋ9w+{Һα5Ziv.px)9J>f1Wv=Q9qupBlj7U*Vc? \y[p&uhԣ.ڰq5UBϼN7걭CvQv{'^uVS(~sRr9FM[o['#eIBJ6V5pT /kK-w:Ư-iғr55u5\Sj oJuV,j,Ojzz]WRf-+ƚf#7(xmBUܻZ]fvf-݀@HRJKbr@j2k'e1n윙6VF Cޣ:KRi;{TSSB.^nۻ $Qir@+ -YbI'd@ B#]N0@H(|`l, &ٔۥMZvzt:=?f5ԍAo|l7cU EE9NVU-Xa8a` |}Y(vw;y0>@ 5[ O ίڢuthS5µiJPOcw,8ax =ŀ!y3^uƭJ]TT~Pƾn9;0_XrH[%b$8ȷ,*RjF1K(c[^@ 8 #Y l*s?Vf . #Rlkd ,#NE.nm4ҡ5 KO7,1lAlzmtjԡUf哾I,!y|X|9oVbi![ǥǦjz%GcX Ym>GV{M{ߨ PU;ܣwh^İ[O38໓7d5l/!;nOmM.J7rww'6RrX!2h٫TVs.i cKuzJra*Nܧ&f/ 83MTyVd*!A{ڏmݙ0AN*ڸNWF+e>_r[ʕ4%e,lD^O w]j?Vٳ/ "Zb"nut4UΤ jɷMFZO2O麹븹 -9ܫ(?q {x@&/ofgFwTdF8;ml?ې?a@{e_܎_>XFTO1NPvZlDd{WLi4WT e$sӳ1sB)_U~ Jŀ R`r8w~m}'vMӨԅ~|-}os8SsZ0R$9fAr7`6#p6C}];M:ݪ\P(T4y W [IK9Er}X􆷤>w~C!lKpP@ dMR!_k!c- Y؀m*)'7 ,rgNHNMwW]ig\ڞM7 /t[OIUJjR~tVB4#9_`H u[_igi#A@ ܆Qrm?BBEV7Y7ϞI*rn>ƙU&'vJՈXd{:~NZʢA_LOi(ҍQNU*JRݘm^[TAy S  7 g8p!}\8 .ȲA[K"s ̭`e (߫VըƬخ9lBiZ9M# 2{ ;>J%dN0 H7Cz.ҵZuJ%WN}rf <N B pPr0Yv-N/ܴʔIrRrrosC kv+VfKb|Kȷ !^c?Y%TOQC]5nY0 Օ4qtmVtӌ7{@$-Bry/$b*}ʵi֗t0a,Bjڽǽ?VZ:GJPK^|lL`GC%6U/^{nmEn?%7rles 봖{Of>==wJ֣#)݆`\]m48@jF?p!^Dw>z{A^Y;d']d:AlӒQ|t_Ij` IȚRy1xFժ&'iM~r5LTu;zOCSRVxG? p9 ܀rG&%-ϫ{trLaO~d6G,RԌ3``1$QO O53H?Li9(G35ңv֝ܪG6??r.Kt'ںt>i?'kRT+Jr H ;GHuZh: ^[jFZmm'Nxg P*inBۧh9ms(z}7Jj#ESJ?n~[N۱:5gB98l'9NNS~ {] i9;uOSKS*%l%wd?AGEVTkSn=g~Pi=? rvFE i6jRT~YrzhMR-M@PlFo؀rtޟ_Cݒ6u~u w8 V,lFuJ.R{$ԡQӭ SwF#I&@~n8J?gqppC\)g]! rA~仳GUv>¯yKK__>3S*u!(J;ĽrneIQ9,~-4#V=G)wM@J.:tQqxn`pB-iQI} Zor< !]݋Xqb6!@,+F728P22Zo[8O.Y?=oOKQS{`-nUKRԒoit}*sNK_O1rnŽ?x*JĸKTQEj? ?apv+GR!&[80DG"G<99-teO~m[cdtܔ48(kd\`Con蜋Y\%ǐ8*ޫ6&хj+M5x~e).!}y(hVY@^͇l.K_`8@[(髮SGOM wh, m z7nMgoOuNj~Ɛy,mte (u{܃ @8/dʬa%w{Bj^$eu_sqvL-A$9{DΪzD)q5yԔ۹N.v#m )  {j3q\u{j{J*# Y\e~)k*qU { MAЩe.Ԏv@!F5F}@3NUjF_t{4Fфpk8޽hTY9'( ;zwWz-Dɫ^.=zu5]Z%Rr˔5 bW+{*m;a)9;ɶNRI7Nn2ӧ*Q\Bp9M8nH]{( I4 ?Kr=TWǻOyF׸.Ck2ГRDw{`aܖؿ=_Miz څzpTI\Uz}juWUU:r|nq\8X\x<!)+s@l9/-Ò G)՞:TSoQU(Wtkj)F-9A?2j7 Y0dz<%?":4j >G\ě#)g(*TZ+N=qóʭUZ*ͬBA&̼^ pT߻1+#ez.&EYy:ut'U嵞AH k[`_RA[MJݵ[wm7roc:1^O=%JzVZ|࿲pN ̢uHt":SvN6u}zSںOnAc伓`TB?ۓH< B/9)a%v|R\̏q|VMJl %OI҃iǺOep Xlo \u=ZԩBsa܅sgNE_C5rrG6 dKbQk{(_lO!@!)އJ5uzӍ(.O4QTBԄ]pAN f/"OdFEMƟ';w71[*W uښO; U~uO NJ]t6G>ZӧZ2^džS jrRn1ץzE ;%}yhbZi٣|u70}z2f=:_?y;뺛jڄoc9S%f }Kչ\XNe:#;lj磮I9WS*]'v@M;0oݥk`P.<Rv33ݣu*@]=;Ti5R6fUE;U뿽-{ &? a{T@'e )lOg:-/`<<ISme/ \C=9,_rrww ?o~@O r-v^ﴛ # ڈeMo*%9}r5~Kvz]_OEN98=YpCGEڛI/'-v> lG}]9Y[Eg%cvL&^Gy À73TR1v0!>ݷAzν#xǺRHt-d v)NjFPX0 ԵU(Ҝ!'&,P6Eّ ntRW rR\ߒ .uSWS>svM|nDC09 'lEZۂoyc>թiq/e~Nt4RO\reB8שv QUӄR:V%Kg{eN*JW_y@ mҪRAWv//~n@6S>U{fqώOtSA/?:p@{+J= tK^WGK*٩I|US[nv4:hj#JӋirh.Z1r {m Eq,坄R+!()TVLnk$&. ?y! r$-@&vpWOb! 9ad5ggd =̥ԝ~ xUWԕ|tFQ}3zS](P(Sbd!#.r{='BzwSTO"xؗ&6l8 g/N+\u:Y(Տ镯cN_WTJ˔8-0 9*_)Щi-L)9.Gz}.^NMD_:qjyX 䜕0rvFzz*eWf5Tq{w??rF?! B\ }d p9x;-mlP(i&Ry.nj[=VO%D إk$qoxmXBT5֛}9({k&r)S?#tOP赔хIj6GR_R0 {9t?P=%R=_4ޣu''|ɇ>WF4A vQ 9\ 1-΍VM|{O _nC 71=kZl㛝={G-ew(Gb?p>G ^Il\R!w r@8pmT>JEkS].u KMZ*)ӔM^MpjzMCQTjP gԏlNA:unT(YXNTjJ80 -2eԚ1_ +s'BޣuZGfһK87>cPwxfR-hN+ 9R(TuiNG K|nݻy4(9p y;bͧ6шmO(¤'  /7 `=/p. KtI[c.4b[  &!y6R]H:6Һ}D5}'4ŀ[:?QJOdsl^OG#[6݀Ab)8Ry1$e9pc,0Cܞ,U,n[ !EǀX-IEVFZ[{7Cx ,lEEF n. ɓJ7Ie{"nB-b߂ȯl6JtRr e8jUO&1 J˓z54}^1V)5cXh۵{)VF].mΤ5c˾] 7oh)T$-gxڽMMfu;n}њ Gݿk좚{%&Vrr %i&*  l9@ --n`e8 r^pn||&}P}M|۟!@~[vєk-a 876ت+%UQn\J2Oِ6||_8~R=:l=V1cWuzTSj+)ӧܟ4 N BYB8-2~ np,?k@0.R-6'%G4E^(TQmX٬*uڣ78@pB/ qA}>ХNiN_Mޡuju%=:<םEI'b=RϬfԟъo2<*OK߲0Oo\Q j8:NҺ]%W:rq}$ *`r(b`8o>Jb#r@ܤj=rb>+InaɾvhOG=N;"ђDF:TPIG;x2Uggr) ΍iѨSl]MYT79-6w5)˽bbeuwlA(),@uJ hTM} ppvv3>g|}ToЧASڻ9,]WywTwh+ (r?&Qni[ejAQudkٙ*ɍb20 mF /gj}0[nJEB'%O8[neJ}bwZW UmXUs?MtZ?Zwg]Nҍ?.Dmdذ\?pJDYYJddrb n7`{ /Kr%8C$y(a? &ȶ|l7GȰܥx#^ D伣}_YҔ壭*2q8uj*ʥINYmiq {2 `~Rlru=~SR/Io'0n1`ΕVv`׻,`5_NKV:ry k @-Ial4*jkƕN{"V:% J.6y@Nt'7$x55Z})=@a{X -%wc)ǵ4bP+P@[{%Yy7(Ѥo/'8*zo;{rv/ }=%)҅5Nutښj*kBR5c.֢^h5sujQFdT3:6֭(M Lt}>Ҥu ]-^ʐp~Y!61-Ś~Wn `4h\Zb'#t\NJNK{`/r/lJUj˓=PzkSЩi婝6C/1x+>J~? 9 %vMvu?Shw}89;$rJ.2d|_r8q`r7 S(rr-FMGUӺj>j<@* !n[.|܃"Z_ l#l n,-@1;5'Sѭl+G(!q|+i4twBYú/NU$ɛuZ-GöKthv Q$ eE{$,le870| /[`F8TSYZYg}C:QM߹ᓒgJszGNbs==?D[ER)If(:m#S|W,ʽ Pv5خ-E3>@rA`U.8'%mOx)c9E4#AڸU{{]/\Q=hw)~Id XrR09(V 9vljMNRwo)O9 rڷCT~ B )5RJfcbҦME-ϭBA]C}1>BI4)pqVYoDޒYzVTv)+J*$ ul|Yl-DXb  ݑGλIuZMЭ{evǎnRtiNbU/{,z֓Rzq45vnR`rt(U7ҵϿO:/J$r|,l".G%ܭc8ɦ-(Su&3BZzj{8^NZzz)W⮣m>LѬMN9FwP}MUi՗kS{l' C2{F>ӹp^=kuR oxzz)jq9zzS)%nQݛ7cf m`-"f/[)GI{@赝SVkU]>}ϣzOi OWO r=;Gz}6(?=xM#C v"̪P? -ʀadrmp>C lZqxsdb]ͺe}WjRSQV,nU6̩ԕ9Y-z5u*ɾM{1GADZSyӎIu>zݾsie{I[QQKR->KKNaY6| :]܎.- I^N6+<#卢!lA^Kv}ǦH]SOZIhut򒜩Ÿr@<0 s)%ewr F.iT-{eU?}CDZǹH8 { ݩӪrO)zWuU93TkJN5R|Xenm@ zFgS}C[#Nl#y 9c]WY- QQiӿ2϶c:dN7͹ϕ>}/VNqMŸ@(vv˺T*R [bӗusSqw[oQSM @r8){a'tĤb/c4>Ӻ^y=Wn Ctr8)9(*NNnt܍ddF1l 2@ ̩RlV^ VI[:rkt{O֒UCTuWic"%VNSmɬ^]MlmP@ٖ+&9$\F Rϱe<öq7b'gN_S-x#@l<Y 8,bIEr$"ӧ*(&IǶm_cX-w[D7219̎I|LZ^B 4}G.աVM2~[ս"׎51u~iRU:4iB)|)ncyec[O^)IK-kXawXq2%żQ[UsJ#]' pCgSh:2xgRnlr~E+%[_NzKuMNq5tm\l)y컏w@hUӳKuhY+[m7|p:ii3 r xرFXE]֕`` oAꮥt諺T罷{5ZRS'vـ? 4FRrObUG$ohW*`|/Ry; H* [;^:]FjtjnQWh/ItzFjIDGiE{r|/sOia>ڋk3)jzJN3hSj*ʤ2w4.WYZcI]=& SG:+'@6NHSIEfk a=dCd7!V[? ~H,n^N-]͙8+!{]lXvhέWU%!@/zn梣4|[ap l<vYZ@/`> Ų@ 8]yW^Z}]RBG' 6c;)_R:j삎98C/ݥ^m>Zt(B>N)٦s`D]/-I`yV ^4)pFBl`pTYoi6R \ܰ? `?p rnY8PM85^iy#BBKR:QM8Qܱq A (vujIyK3hhϾ-9OhO6ӥQ+55ِuFSMVTt]yרT2w5>Fp[8%vO "2qw ܜ VHǐŀ}pEe;!@2]kF2>{N"eVi.kwQE  SqwDܱt7辇1z[St zzq j)6xJ󓧦5ғR%$Gʦ,;3=WG^JqqxGjԌڋ/WɃ Pzk:gKGFU$ݝ:DtmC*R_ix|pEmO RJd𰑌,坉+]b|q9'`f~p7~@Xp .p:qjq Ip܀ ]pP{kn,BXrw q* dڭ~ZJ("61%`ېlRHP Xdl91qNU'/}"߀m<2d @_nWc- `'a)$bQqvio |} rM.K=?iRթ=>[:Pdx7IAorQB:hɬI|y/NK!x2nsmD}&ݿMvU+\\x@Ȱp8Amrِx+On^n哐,r )Q#^eG%QiQϥj};_J;*Pr|Dn ,X/)CMErϡzvQ\*QAc1y2QӒ]ʭzVnOݳ 6@[ևQt-^jsRl[䅸LӕGh''bﰰr Aȵl Z@9FGTZm? 8Jq .VUTc6fGgT M)9;ɶ%i  9O6b{?]/UOQ(%<`.R>Χu +6kJr7 In3Rj+vogRQjk*';W vy_j)ƕ/B}|Hŀ6QU*8ʣpV^,Ό2){!G ]Kx c Oa ? pQ |vܛ%Zgsr BBG[B 0>wCe`} ȿcvql],?pޓ]OQ:jcծUY9]"r92ZْF-XTMRkcn+j#Fj,';^9ZY=ֵ=J vB+ym:kNwƛ-ȶ-?p_ J:YBTIs\̇z}.ըiTj26oVj?e-%' .b8=MtwoS:xŷ% }=J!G-2q_&uhF.%xߓP䭮b͔JR[WUt1@'l'|IZw{6قڛ9 7Nxfuuk')[ +'pU1{ +; 2A--YRw0ncC B-@tZj4.V5Vo5觢WK=D :^=B)nÐI+:\K[h5ZtkvG]o{󋌬Ռ@.zM:RJ+=Pz{YDh;$)ِ +w܀wǢkޢ<:៤/KixSPWji3^ ON`WFg|m<$yۿ n6Nkrj@S)? =Pj2$u(SqXYdvKOFUA]=o7RVwq>}ǃ] p,)դK 45wsIݶ@BI8/G G[UG twwJWC"p_s*]Y]cPJ2i}*W'.==7GSԺr-F1yc3svc:jѷԄuu܌ wBF.{/a0w;F@-VʋrXGY4P E{4$%'@zoCk骰{]cit/ΏNNג_7'&V#شNE qrŠ!*S$я%3Nn ,`@/nIpy"> @@bp_.[H2Qڛ1x p9\%^ǥ6UF̵ܳԕ?II .L>z6LʭmT{ 7'՗|wf ^豕UMOoԕUI}uJtcyv:5tGKKH#}*S}Wc`7!nY%ݏ$~F::tUsԼdԷ䐋9)R9#o@*dt;X oclcUn^*I\۩WҴѝ>ܻ<`p Z(4 rاD4U1xCD2^OPUTS~N@/p@+GCUV5!JQwK`9pO*1쓻Fniƍ6 ԝ*b`Q?WKӚMU8PUeZ7uzNn6R*5cRҋf}OPk+NڵCСžI. zRq.iXI3_jzNKO麒<k*J4okHBiByoUN9Sv lNieoc)5f6)Y+)7ŌA P4IF)Tjf`mըjkS%'s}Sʺ=QUlMܝݒ`CJ}k<^N ,F=L5G}9vc[ *l_$(V5B%OHߪTR9bբ~!y2o;#G:UKSB0P[mt5Ne2#Ⱥ FvΧuAֵdL)[:[)Gko0| v1vF?oԏOީWtz_OF(ɬI!|Y dq_&P6 8Jj2}~Ll*;4OW*tT&%k*JrlݤӽF#:*Fr>Otz*ݦfjʭINyloXH1` ռwȶ'5uX>Nm96J leJ>)9I!  *̷-E+EgBjR\5zk9#GS:ֳD*q}L rX8 A=7 8/AX齒C;F_ԝCiiԥ 1Q1ɍ%Dx/\p ev=Qy3Nu&'#lUj~8Jt I:5=,V\Whպn*YΤq.첋9 (Kwj޷W^N,B?/bl\]@iJTV,l ZOUTkUjsyn 8d=u?KOIj%Su^v@X* dۥ==xUOSzFQ)S,#AMj|n6]Q {w :]=YBUJR,#kT#)ҍ qU\Si:Pz $ny#<Ex8W7 i΍I}+^旆Ol8 p``rVrr8(+Ԋ|Nj:GM'*xC\Ԛ&khit%7ؒ#SB*qUܬgBEqq8!a)E1R @ N9I5hȶEnCATmEɥ{3Ӻm%>KSMU¤Zg5՝)T98GJF@Ju)NjEf`BFP{{'n۱-w,j[Wԝ >IEXTǧGId |@ېOuՅ+[$rkPО-| @E_&R)~cocm5u::zzjyA8 . {q$kW I]BQOQuInC8R0>}mP\qqw G~ ;"߹Vec#]zSaM/s[l8W.Xm)leYC?ߓ^ゥ%o{ xnp6xaܧZ7Jӯ$X'jЩ*;;ctyQF.Cf<8p$$Yf/dXm;wGu*4*Tp\gtl)Cxs|bnF;2p:]aMyv5{q,9MLREAۻ|:&ِIneV7 . U1fAXΔ{$>ǯ}9I'qR'ŽNU+ S*+ryug5iIlbutʔiTCdcPGYӡJj#T nҷE2%<+)Ԩw lݖ{^ӯԩm}QVIGEPW sQJCSUu*M1[gc}9MCSϻ|92&65U5~Wwh wDB45SpRQO9nmCJT[KVL @Y܀8 T[Qtckd(UNU!NrT58G'.?ë:ZtW6>'uu7%UAdYFzN#^PҥӭЧ780-,;nxVi)Z)ñMɹ71- =AE`oDJV#ǟrKFx8K|pR=8 7'[敮~tguՏe4n Vb,;Z -lŀ$+^GpE֩ESu%oh{pXUkpHrdX::qV]k7QTjFtsF*R?]D:5 %Kx V6'%Qo伎@x IEZ/0TmiE$٪Q핮F-169T(V 29Bww7k4өR=s[0eܔ;8#nnէR8(/A@rmg`Bś+u-V5y/e^h?F:S 2>~_| `Xo|tWF96/Df㕸v0 k!ocG 49EA}ԺWL8)^}gf),̀rr[R{7t-, 8-:8)2}vg8-U_NTH:<ujdɈ /ZZugQRrwM/ۘ}>ԞuK^X1_(OQF*R%+=S=EJх:tգx -$J CzcNrҦPQ:RwqX4 &Mʵ 'V5"fɞhM.0NuV&̀Sk龗j4mYRtIn ɶ@ދQ,u.>>4ۂ:t NZ)’j̅lΕIR''9Kwb*۩):0Vt_VKN\#d |X 8fv=CQecSD䮑:uΗeRTڻV_81rvKsnI[I5pm)+`HP8 6Q:4J1b=g::)ҷs]r^>rJ̅ *idCŨHyy&"r TJ4QrI+#%+=ѯBGQgZ}jRm+&CkG/,a`p?#6T8ǹ5ha NAxr  39A('|HI c#`8\硩*si_su*6f$C~F3Oj7f2V<-kU%%\ sx`ɕ(Qg_TTVU~׿ϧth(RpIT'Y ^snaX~J/oa,C` %j'_6PQIۃޠGjcdtҩS5[):߰< W6d%!A Ky䭑nivw>k?$:@uӥ(CW>)Q5i'R\\ d-\r{tWU+_Vzu>= );n _"SnsOSO.ڱvv)6r uihSFnrjxGtAu-oKzq{ ;JGuSj-e-<-b Xni'ӻ:T|,lW7КSgo4eMI뮫t:ZJ1|~5^Quj)&vf l*vgie#M[|*rm{>io\QRNjO;u/^qGJҗAA S˲&N!Sý?@kI7(spp]>z^*Q=@k+TJjbIrinsݖ7J^«9A%i= l5t#j[m,gNB xH]tSKRj+ny$шugTU'){R[nTkƣWw>z]ԺcӧN7ٸ, HTm8);dʤk@ۣmMLR'Gd>I)Һ~Pg>߶Nb6 [%6xF3Vpd{~G 4O_jozGLz5')kogNߔ~xGdnɶ_!l+s`%O-SRLyor_| yn*`~H-|~lҍ%Y}qa-,[~Ñkq2X5OlAcxr1# c B:*N!SaLƜfe~Gl\q? \xRmΥRzWF՞AqGY9 ]/Fr}ܳ^N 9&K|2;jdj%iRub&RU&'v1@LǺI-ϧ~I:N-Tg*Mӵn,/(r8^U)N댣uusTeVOfXl6{|O߯FpXIRK{ON]z}N8ʤkbuzӨ]F8)(TRN3VQ*F8V3j[&k{TSMSRec[Vr2g# Wtk X,짢S:N2P`3f;&+$- grR+HvJO"$kzkM.9F:jKuWd@ڿ赔v4_z5N*\<9vMJױU}K^4P@,h% P 76oel9*r—qqy@N1b2 X]] Pਞ1v>@"XE\tV Ov~sNO61ǰ1N~Fo,8 nA"/#E| 8bXn {U||̦]XkNŷeO7lLRjr7556`m vRٺ˲3Vݘj;>/XYbVL+"p/  À)lt;]G Τ`vLe 8ZsG+0vBQq}[9ќ#JͭQb[:r?gNۦaZcֵԺuP<(GAf,Uz]KGtjZ!zXG5/jNwgZ^[OvM#}%:kZӫMZ})s(Bn U* rB؅!Q֦^*wM>=ۓZn}p>XfU&JҔ`(E@[bgnP=}_B?Ѩ?(>O J/G*_ow3@KQNIt/9ox F@tN:i4>޳Ӻ:sStgtp` stTZ>+6{Kk:VI˖&U[Rrߎ J =VrQSľm8BjU#ܗJ"{ qoxɔpϲ6ZTϻOJ-wq:&AT_ O | P?*6i~i{}.tB1[6>@r._$ؤCk!G>@IlSaMu:zkN|R ` XxBd1W7iӟwԟbKM2N POҽcmn8XVlt])]Jr(v@p6:4UiRVmEG&brUkխ4Ws|l^I*ysPc1n09.yג8K>MoP7ڿT8:AtK|xY!I7_B-Mca[ݥV%+&߱tKꥨ_M}I7OFUx>O[}uI'%ܢ׃5zZjV2%k?%d@`~Cv8ظeE'LӨu*ԕZrfp:-81n/,luW[ДcPdl8V4]9ʭoҾ2' AӤ-*)9Ƿ+cvqr3Y6ʷ '%nc7KKZ:hWpNn~曓 e%ڣ|#vg=A>4zJ-&[{)Hb+%wZNn3?U+O*ZlWE jңZy{Xԓ[+F]:65kRUc|5#ZF NP^C2qVESQcsMj2RQk)@SrBSz[OUu$+G8.;~H:r%&i8lӒ;wsSI].I nm*م |N^FH  '<8@. ]ekHtNj=_SaJ6RQw)ҧh˾x~ [~ r/MKZC0>]5tΡWJ·ӕ9B,o%b'61 lQ&.^PpXz 0D_vq佸'> Gu z7U5pv~}7ӷlcݟ3u :TtuerK.X:=-nFPr]55ZF>c c>я~?FJzRrӫRڍ 8FNOutCoUhu-;<[;_܀vlW&ծ9,dě OSӕR%K)%~î7IhzsW`)~E?ݺWڣ%t.AX,ZX"xک5O뵳Cw2s}@r^W"JNÀF7HU)$%il@]@ m#5 PY]t\:Z$NJI>LP55URNNױX㥓=GtTS4p@DZ$YWY9TחuIGƻlk_& [\W_U vݟ/JhtZ:nγWw\z5PSU(;YM/X T;p@ Msdk[2  ԕ7x;3}܂ɵk23cՕ>7|0Hߥ:+CcTYW.k0ōSlc{2 ؼ jFjZkjkV9;jtuJ.eVm}p}bȸ|HC/n%lUfڛp,N [Z 'Pk26탛P5*dpqn,w2 Ybѕ'R&n:q.G? rtzFeOY6hRnSwovbBݐ .8.ۅl< lǁllR4Wm[u$Rϰ?OSV햦_m5q>Jԟ!xg ޯ#J0|_oV֔Srgob^#򵯂?>HW +o?r"XZsVrl-=%Vk}=M=G l[g; [UNw%Xd Q-I)Jn  Xp9oq,ں[=ӧJW2W:u)=ynF9 *_k.NtVԤGqrG=8MGL 6Z=_שRX'_*ބ.dAF;ɗމ]&hrewb<,/DGG4grn p[^/ &ݑS# W:jr9 XSg_>{3PSɕzJSRaukVtޯtދ!S[QK_;9;lElݐe .NȴG*B08Ƥj({K^ +vnYY,ӛ[nVvd־Η}_[.VJ:-mQ l4J6Wu:|І8$w<IC}FSvd?q&LWǓo3C9sKjҔ%.T6ʜے,4}A/N鞙V0>6]jmWMF){8K{gK=vTv=WwMеiI_c@pRx dHG9)Ri%PWR4(.lsKؼ9_=ņ@f 0/ @07] prr_BP#.X7%}=6ݹ9!ɱe&p9#(~@D-B/Q%/@8/ 2]9 G!N ȹs \p,J1A'aGr9!]uPdڱE \nWQ k׺~±|ϠץsRxIgXZWʑx/s'"X 騝[CGE:q]V| T;;~C})tf5KN'>jiFyIH֔hJٚɒצssEt:^ORVT~6ǹTt𧨜a5(r`zOz^WZgRꚅtkCԫiR59GfqM8ӫˆ{ުmNF T.^/Nrryf<os=3Z I* 9}A.} Q~ȫ;H7Vk<n<mN4rI}}[/PҡKxReo~O or =SklPu(ǵ_&գ:գM[=>WթQwF;$@-6;A?Ġln$u=/WNV;Ipj*ʵiNPBN^(*n.]mhߩ.&ՔmJ7qi>L-= u6jcFY׽\4TkE}7Qt:ʔ+FӦdN)&MMNT&sii:-Ux*}S>Qƌ c>eugI 2T:roݘ`@[#``6J{܈&%!y \:ZS qߖC: }dK@ V'Q7u kjէMSbG(1# Zpv"6/Ucѭѫ:i+b `ra_FQ䅷-pn|![ܼv7J)$ F]ǐAo ȵ}XX!|PBiRoëS]5lY˽Ŗ"}(Fb/; ݇e"% ~TMEntu_Zvϵ;_9kuTSS}S]YTjҨgn=>B0ȶAL=پ ǸaQcT}Wjrr qf[ܧCS=SOSS5O?'Ofuj}Ҏ9 r7T7(,ޙOOҧB{uStU% yE]Rp{YN=a%`;29f/  54`~K9. k"3~oW(tC[x:?l\sx~)4iҡ˾d|,6C.֕#ףꎧECU:tdcȜ'vX@lXP@[bz5:,QX4 RVtiR.쾝OMtZ2F(2vx[7o[i*h4:|rf/d{%s:4jVmR2;$ ,29;FX9WҨF0{4W+9z->S^4)wEf{wZBkMV:‹Wk5SRMrrg ɉQtWjaJo);$}=鮥>ڵ\"υiF5$\p,8&,~Hg$ڰFj~} Q9(Mʽg^J&vԔlIJPN"1rQdzޖZ]*I87~~FJ/O lB\1\Zq7!n27iNMu,cn^=de'6PUFN{fij|rRY]y e"Àl7&GHj#uWt8:y~4t7T>1[ Yْ+q $Q UWy^ާN 1W)*rdWu-v1 8+FtN}q0`sEZI2pn伒#lIl`6FTS&B%XB*U9Gu=NZnr|Qv7S׍Zr^ֻVPcqF|87N_ҝGK^$!uUxJq7V-06w% *ɿr4e cWo@/6p rKOT5B5'V= _WRD+}9W}oPUNT{5+_nHl@ <77S:Bjw'&s)S[!FUvƷT lh"dɔ47kH<B؅LH;4VIR ҄*i?r7v@H2myQPq/iFm't1ѽ*_c&~>Ngkb 8IRryf E'([}+$--Z4<^USOYZtѤ W^#jn->Jm>wOϫWJrnkowV1n2v;:M %(v)S8@7kFouc \\CSR+w+6jn$mjjt*AӛD@%s(ce:6U8瓻1{;e%G5~YvUCIBUcJwϪjiSJxkFKF Ӹ' (ݧo&Qm$Z%Ʌ{`,BNlgߓ'ط8/Y \t՞u%C;?sV K9I&!*8&)e]-a[;uZϹF+ +T'-=? 9)9r8-%؀- @ђm} 8#2ĕ{H^H6ɝ8M#=/YuuuK}l=>_Jzj풹KW,wB&> KPp`@8/! ?%XzOOP8NhBrsVv/nTM n^/,Al a|$gNӱ> NZMg:z-5 FF-gۃH,}}e]E*t;j4z鲜zє'kIUI9IգZjS9Ƣ_q,m|}5N Ģ+IY6R:298s[(_ )ӣNURaʼ)F}\ݓv S0QqY˳v{z FU-<%[kqToNLy;Gh)aN*0us~hj!RkE_^:'Nl#v(+ݘ<=@YN o(!H[(Ruj%_U )Ղh;߆rTYNRW_q6( {!v@ ^H7& 8;Ca̡7Kf~EH3]!`_}/Q5Q)gQwE*Z?Mtt'?ac-r@9:!}K4ܞ2' AIsor { 76RmE|h :ڒ>3}QuQ]#U2M):TקciwIUkcd` ly Z8'2 M)e%gcͲՍ/˱l\MyT{^h4%Bҏjvgj:P8V^Ǒa\k]r\t..h5.꾅'Ug4^NE9>O:]=իAj_t?iZ_k۶O- vr8}Wqu8Ʀn?#E4hʏw}J=s(i?U .J;HCO׺fU_Y~*RSQvmΜ+Uc0*Z-Y;zON}OWhRwt9jt uvv`诧*Nj>8,e+T*0 j;4idVU4Fpg^9&-YXL9GfL@QAZI\ǀvM"RٵG k؜Qlҩi zF}Tmrz>&ޮe^ߋ8|Kk1 ȱSܕSrS~ lAbx§cOƤIKvK6Ō/|`ŰȰ}AGj*W~EQj)4SMBg ұ7Y-,#M}77-WOHzVP1ux}uzXJOؔm)oȌ{-ɰb<ny:iT $(wTd){<.Gvnm>ڪR?T?)Sg羨^zB6WNGx(%.sp0^ /Kv6"N;.`[`HKq>@/.cOsjދW JRƽ]yjkJTѻIثtn՟ӊK nLǐB駨텰h.pgM]]]%UR gfuVrܝjٖ<0 C73b❓$UQmӓՙmou&snMժΜ\;w޳dhS~طvYsd!E3O}ɹfU}z)UTg4)ݘ@(RUdӗjJ0l{d @ >ޛz9FeRn>oP+ZQe;77y6[#i۹, 7WԓK9Fj tSWFTՔa-xfiK*<`e 1?4 g3l^캘҅yFf ՞H2o 2nլ>ޒ(ըPY^ZZTF0j$~oJKCQ4ʄ?+t嘴sĀ7ݑZh!(+pKiӎYՇty7~Ềk/7dt$}%u 'Z8A6ݞtR7J6Xq>K՞uQ4)Rύm!o6tOhu4֞Z%~yt&pBÀeNKWRPThjgp,!lRb#m 7 L/qW \s?`/I lN 9%s8S'ؼ@Al ʷ |Х_IR)%+ڏ==Xi)|#qv*~ɾI {((J* <؛dסڽz&UN=WH{]X.E@(l΅ (Jr|,jXh@SiJW^vĹ3{? eRqq ɈlPrؒ@ IFŦ*ev8HƟ5KNw}ݹ_uj\F hV( =9=jQ8ISO eTtG)0=9_u5)i88IfډҨ(;3P;WIuj)bԕݬ8M@sލVKָNݪ>&J͢eF*OGu}/h%{unx-YِiـO˾ƷdtLV]zK裪VI߳ϙ#*NV AJQw @تEIY` ,III]hِ(˷hk)ԚS?R?MJ-բ+O֔nsX*m;7wz;]OUItrg׺zOOOB_Gy&6i}ӱzzj3Bт~=G|ϩNԡ.jeRE~σe*;ޏEhu/P@ vhB5"3/K E}4ܧ+&Nhi*Ԝ~Q54+VUh%RumVlW`|ɽ>{||4T'u9l+,J2f/;gܦV})5d`@p l p 9v9,cxGt/@i~)Nv cC7"e4tnMKQ_KVR>w&@XZ*Q T\#g/OWZ7TYIhmݼr Ac "df80ݙpHjn֔FWtS:OG0ٵI-p86jFU9ǹG61QU)0VO-B7`F>R]_ɭ|؜1p9-9 :_Yt::ҥ6xF[_WRU+Tܝv@9@ &PqI݌WU(mL~@< K}O``,[6TTe95e>;ދNmz<[tJU(h+}Hns v :t:ziSIK_tD ,U݃Vv RV \]  6rrym s(I/Nj-Ͽ^S*98c}C uJI}:kS9?s=5mD΅IRrlVzmeUEpyp*MmR4sl*vbN9vwbMǾj+n͍$!HQ{ݹ RX ~A8r<8*؜% vY[{oN@ |_{2}K6=ONޭBӹ}ɷ~:}&rr7i'%?p6,-`μRwTQ}sswl n[c76:qW>?uJ?ZlnZPQ9'[U'~H? J儭8 `<0੝߻b r ni穭T7d{>ӱӟՍ׷4Aa8|/82Ue8d0%,ᕻOq8SftԼ⦭VApltVN0>8_=C2K["|b܎p À 9 'dBోU6``%IZwlwtޑS-<*Qu!*sqis*kp8, `@ mWzzJO݉4ec:.b@[:IԾ{~oN*3HvZ{oQU:ښ*KLqbޝPt}'tNj85|QսwPp>ܻc6]hiu:RVuzWT㪧 QbVYɍ.@=M=Ei''m}%nyor@ kc't{zNѸuclyZVZ[5`X 3j:m,;(ӬUjB{gfc {ʭYV٬\@P c+'c >7g ؽ jNӪeԕjMm7!9 M+U}?պfӚyKWFaIGzGK]OO&b7CqpFT{bjp8vK˓[_~E|R06p d7iuVJnҋ:zWuJSY^Ues9%/SkPit2R4WG3l_` lb5tKTT2vHӪ֔n75 ttХNӨ'{3f d..[&N @ ,Bnp^Tv:\Ɯi;ds@ <R ~@C }C'(c\rա[4+\Rjpl!Ot-&1+6MrsįVUʤT٬(8̀ 9dI%ݍAwME٪ 5)Ͻ.Q eݬbgtw e*5+w}89v^zG_oSt gTju:ut2Xv [Ӻ?B:vXN _|6:@S,P ,l +P .f`נSj:u-n9Uju$'flEGbQ,S] )`[9;7pۋ` ݐ@=jUv5}#1jEaA{\\v\~ 7T֕Њ]ݜY=鎫մ+ҩN˺Y^QN2[XQs-Jn6k vz?ZϱTGޛ{WN K#yrXnRju*B}O gkȶE÷pZʇ՝XZ6k553b'+EY#8蜗 X qsT8v߻YCw /eɈ @z{{`ztV]YAFpy;~oL ZyPVQ/4 wkM6[X,h}2u4SQ5jm;vc؀(3{4BXl {}Q@TʤbH.u!OOktMuWOjG=y+GTXE1`p`rm W;:WMuhTU݇Uպ^Q)˵)B@nB=ؽ.XWɔ_[_rsJjm={Ooz8K)a~jgԯQu٣8,ctU{OOGkNNKWG)QB_sK^0? :tZʶ9RUW*{NNw ߒpr-zRhe*/svK|b9/l7굕u]#ھ m 5!O%O$C) p]Pm'v٘V7)4Ğ[ `%+ FzOOh_p7W ;)cOASNROvBPBuhQD"ڷ,畓 \^>%,&5J;E6c:rN2WctL5G[D)((zWQMuIyK>}T zZNZ ):sӇ}[WBxwG_pN3ec(`ΏoԏvuUiu6EŞ/|@r@PPfL@pu 4:]M2Ty؀Pv{th%F2Ǻra :PwQ\Q41^WՕ]5GNKtiZVns{k p#55V"ݓgGT{4]X%BrKKr=M;5L1O\88~I(JQIZϓ-bK\n}?Lstj.#޼u}[)]&"nRp8t֟n5@6ܫ*pv-w Tn {ߧɺJ' nزiO݇M̵uV:s܄(|T& ͐,9@o 6i*c%ٍHͥ+B#)F#ŷKZWw.ߩosp@,';G9u=|4%Nm]CS:qz&>@ʹ)c=ToMI*+SSZ7>l,A9( X  7`bǡ_=;CRJPx5gb-?Jjť~T!)JqF+TMjV(fRvGu/CҜN-Hӗcn$l䯱8:#'dZԥF-t`Qfܞ]& astrometry.net-0.67/doc/UCAC4_guide/get_ucac4.py000644 000765 000024 00000005634 12651445460 021527 0ustar00dstnstaff000000 000000 # Script for automatically downloading UCAC4 catalogue # Last revision: Jan 08, 2015 # Author: Denis Vida, denis.vida@gmail.com # This file is part of the Astrometry.net suite. # Copyright 2014 Denis Vida. # The Astrometry.net suite 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, version 2. # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Start dectination (in degrees, e.g. +50.0) start_dec = +90.0 # End declination (in degrees, e.g. -30.0) end_dec = -90.0 import urllib import os from shutil import copyfileobj import bz2 # Retry failed downloads (how many times?) No_retries = 5 # The URL prefix to the FTP repository prefix = 'http://cdsarc.u-strasbg.fr/viz-bin/ftp-index?/ftp/cats/aliases/U/UCAC4/UCAC4/u4b/' def Convert_Dec_to_Znum(start_dec, end_dec): """ Convert declination range to UCAC4 file number range. """ z_file_constatnt = 180.0/900 if start_dec < end_dec: temp = start_dec start_dec = end_dec end_dec = start_dec if start_dec > +90.0: start_dec = +90.0 if end_dec < -90.0: end_dec = -90.0 start_z = int(-(start_dec-90)/z_file_constatnt) + 1 end_z = int(-(end_dec-90)/z_file_constatnt) return start_z, end_z def Download_File(name): """ Download UCAC4 file. """ url_name = prefix+name ucac_file = urllib.URLopener() ucac_file.retrieve(url_name, name) inp = open(name, 'rb') bz2_file = bz2.BZ2File(name+'.bz2', 'wb', compresslevel=1) copyfileobj(inp, bz2_file) inp.close() bz2_file.close() os.remove(name) return 0 start_z, end_z = Convert_Dec_to_Znum(start_dec, end_dec) # Downloading the catalogue fail_list = [] successes = 0 for i in range(start_z, end_z+1): name = 'z'+str(i).zfill(3) print 'Downloading: '+name try: Download_File(name) successes += 1 except: fail_list.append(name) print 'ERROR downloading file: ', name # Retry failed downloads for i in range(No_retries): for name in fail_list: print 'Retrying:', name try: Download_File(name) successes += 1 fail_list.pop(fail_list.index(name)) except: print 'Will retry', name, 'again...' if len(fail_list) == 0: print 'SUCCESS! All files downloaded successfully!' elif successes > 0: print 'WARNING! PARTIAL SUCCESS:' print successes, 'files downloaded successfully,', len(fail_list), 'failed!' print 'These files were NOT downloaded:', fail_list else: print 'ERROR! ALL FILES FAILED TO DOWNLOAD!' print 'Check your internet connection or try downloading later...'astrometry.net-0.67/doc/UCAC4_guide/README.txt000644 000765 000024 00000011164 12651445460 021010 0ustar00dstnstaff000000 000000 # Last revision: Dec 20, 2014 # Author: Denis Vida, denis.vida@gmail.com # NOTICE: This guide was developed on CentOS 6.6, but the author sees no reason why it wouldn't work on any other distribution, provided that you have Python and other prerequisites installed. # This file is part of the Astrometry.net suite. # Copyright 2014 Denis Vida. # The Astrometry.net suite 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, version 2. # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ------------------------------------------------------------------------------------- PREPARATION: 0.1) Install astrometry.net and make sure you can run astrometry.net commands from the shell. Test by running: hpsplit 0.2) Go to astrometry.net folder (make sure you have the "catalogs" folder present there, if not, get it from astrometry.net github) and run the following commands: # cd catalogs # make ucac4tofits # mkdir /tmp/UCAC4 # cp ucac4tofits /tmp/UCAC4 # cd /tmp/UCAC4 This will compile the ucac4tofits program, make a working directory in the /tmp and copy the executable to your working directory (where you will be downloading UCAC4 and running the scripts) ------------------------------------------------------------------------------------- MAIN GUIDE: 1.1) Determine which parts of the sky you need. UCAC4 is divided into 900 individual files and each covers 0.2 degrees of declination. Let's say your observatory covers the sky from +50 to -30 degrees of declination. Edit the get_ucac4.py by modifying the start_dec (starting declination) to +50 and end_dec (ending declination) to -30. Naturally, you will enter the values according to your needs. Save the file. 1.2) copy get_ucac4.py and build-index.py from this directory into the working directory # cp /path/to/this/directory/*.py /tmp/UCAC4 1.3) Download UCAC4 by running (this will take some time): # python get_ucac4.py 2) Run this command to convert UCAC4 format to fits tables: # ./ucac4tofits -N 1 z???.bz2 3) Run this command to split the fits tables into 12 healpix tiles with 1 deg overlap (-m 1): # hpsplit -o split-%02i.fits -n 1 -m 1 ucac4_???.fits 4) To trim out unnecessary FITS table columns, run the following commands: fitscopy split-00.fits"[col RA;DEC;MAG]" cut-00.fits fitscopy split-01.fits"[col RA;DEC;MAG]" cut-01.fits fitscopy split-02.fits"[col RA;DEC;MAG]" cut-02.fits fitscopy split-03.fits"[col RA;DEC;MAG]" cut-03.fits fitscopy split-04.fits"[col RA;DEC;MAG]" cut-04.fits fitscopy split-05.fits"[col RA;DEC;MAG]" cut-05.fits fitscopy split-06.fits"[col RA;DEC;MAG]" cut-06.fits fitscopy split-07.fits"[col RA;DEC;MAG]" cut-07.fits fitscopy split-08.fits"[col RA;DEC;MAG]" cut-08.fits fitscopy split-09.fits"[col RA;DEC;MAG]" cut-09.fits fitscopy split-10.fits"[col RA;DEC;MAG]" cut-10.fits fitscopy split-11.fits"[col RA;DEC;MAG]" cut-11.fits 5) Determine the required scales of index files (refer to the astrometry.net documentation for determining your scales). I am using 1.5°x1.5° FOV images, so I use scales 5, 6 and 7. 6) Edit the build-index.py according to your scale requirements (make other edits if needed). Editing is easy, just change the scale_range variable to whatever you need. After editing and saving, run the script (this will take some time): # python build-index.py If everything goes well, you should have 12*[number of different scales] files (in my case I have 36 files, as I have 3 different scales). 7) After building the index files, you need to add an entry to /usr/local/astrometry/etc/astrometry.cfg to use the index files with astrometry.net. Open that file and add: add_path /tmp/UCAC4 autoindex 8) You can delete all files from the /tmp/UCAC4 folder EXCEPT those beginning with index-ucac4* 9) Enjoy using your UCAC4 index files! OPTIONAL - TEST IMAGE 1) I have provided a test image (by La Sagra Sky Survey) which will work for scales 5 to 7 and declination range from +24° to +20°. Copy the centu1.jpg image to the directory of your choice and run: # solve-field centu1.jpg --overwrite --downsample 2 --tweak-order 4 The solved image should have a center in (RA H:M:S, Dec D:M:S) = (07:38:20.142, +22:18:57.895). Congratulations, you made it! astrometry.net-0.67/doc/UCAC3_guide/build-index.py000644 000765 000024 00000003642 12651445460 022071 0ustar00dstnstaff000000 000000 #Script for automatically running astrometry.net index building #Last revision: Dec 15, 2014 #Author: Denis Vida, denis.vida@gmail.com # This file is part of the Astrometry.net suite. # Copyright 2014 Denis Vida. # The Astrometry.net suite 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, version 2. # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import time import os #Determine the range of scales (default: from 5 to 7): scale_range = [5, 7] #Base file name base_file_name = 'cut-' extenstion = '.fits' #Determine the file naming range, e.g. the output names will be cut-00.fits, cut-01.fits, ..., cut-11.fits file_range = [0, 11] #Run name (number to identify the indexing run, default is current date + scale) run_name = time.strftime('%Y%m%d') print 'Running index generation with following parameters:' print '\t Scale range: ', scale_range print '\t Base file name: ', base_file_name + '??' + extenstion print '\t File range: ', file_range print '\t Run name: ', run_name for file_no in range(file_range[0], file_range[1]+1): for scale in range(scale_range[0], scale_range[1]+1): file_no = str(file_no).zfill(2) scale = str(scale) base_command = 'build-astrometry-index -i '+base_file_name+file_no+extenstion+' -o index-ucac3-'+scale+'-'+file_no+'.fits -P '+scale+' -S MAG -H '+file_no+' -s 1 -I '+run_name+scale.zfill(2) print base_command #Run command os.system(base_command) astrometry.net-0.67/doc/UCAC3_guide/centu1.jpg000644 000765 000024 00004301775 12651445460 021230 0ustar00dstnstaff000000 000000 JFIFExifII*nv(1 ~2iHHACDSee Pro 62014:12:15 17:54:34166p XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km  pC    " ( #$&'&*-*%-"%&%b !1AQa"q2B#R3br$C4%SD&?URn"7McD1TR 6(焑M EHH78kKIq"H`N luFe682boxH.?IH'?EHt0bF"0P6Zo81&6.V*È^oRagܓk"G+S3U T`e0ccZ,$n,-<Gج6"f.$WQ ZwyM.~_wi 𵍚~>3qoOE+ZKK=ȅs,ka Fnb8)SltA.2"tzKGq~ I ~`mj3V&6'.Vu0Dr 6 Gaę1o3 1kp6SW~PAi3A5UZI"Mb|RɑȪ֒Hl_嗧9:C1c.5babHE5Qn`]d:G3Q@ F"h$,JM->.:_b,BLsk-e22 -+*ii`ž[{ܥ&$OR)!v gn&$ A{@N;aPvEL$ "HY'yKGj0OeZb.8esfdwS+0 +\h9 pd;%!N.k1`0tv/}9O@F]i.&`7i&jM04)FL#Lbe=Kk`Y7!aL̮W8_Iu? CpAeݖa^1; F|:@kLTrDlsZ@ړ@&vnNkZ t8Gv3!1Bu3)tT1ZS !AP<88nq~V(paz'PCԛ8Ma @t[s @tΥ>vTHl;Q캭:G櫘f  /oCuˉq0,i"z3C508;,ēUi)Y}߆oOUxw 8'1@@^//Լ)s+eqf# !yPQH7Db7Shdp$ɲ Rה%;J|žG /L69̚\O)bt$0t[s/x{=K};:k0Kj;'9 U%`w@b$)ξpX `Z<?TRBW3;"0K5B@*p DEKKk>jV($T5ot\wP&*dڊ$_@8S I&&+;m%"5IZh@6Y?P R-$ȕ;90,@JL%i W&# \W#G%D 't@$֫Qv _~;u5339<_ xqx- "FnbJ}EF), $5h48Qaf|MW&&+ c8\Fb(w$7vQᇂq㜇E c1ئxҁ}G9ܫ]W74a29pwJ'mH|:U>)uoy\nb/=sğ1ps~ o 1'_u cDEIʙD *B"Od45 8ɟx-8ڍ$`EQ1 /nM%H ;kqe͕I7I_s~{o~6#lY)@|QrFɈʃL B >0dJ; W³~T(}V3j[$z=5=HmZM 0Cu5\M+U"G`~#CePM.~:Hj3 1?93p֍@8ɓcQWi;<)/ )$*l5ʈk]-z=TtS+W tI'L 6]Bi\n8Ȥ"Gn$ f-4m ʍ{$B&{$LT*%nuCuiT@tQ&C3(A'jo ]!DQrppf kMa,q_| ׈d[n ]1Hin>KWPUs5ܖ&K?pl=6_,GyA+.ttw,T+Qs3xFY-R"ZI?͖CZz I$ްh1^Aud+rx*qp}WHTAOzѤ^6Z$a$ETP4LR@(#jnђ݄!]-:Ns]CCk(,SOe\<h䬑4K#I}-q$j*;&< Bv|xD#!MTHk ku8\(r,&~ZtP56ARK\6_u|Bu.1rEc?oeqs/0a L-+Cu$.A D4E6%%֭>$@LyNVk4  ȁY+_+@ԓȴL Z~]%Y ֶ*Πb M$Jz*AA(LLYf EDBnrl7r!]׶?7ٲN>Au "8CLכfÀ?E7|VA*p|а(f dAL] xKᏈ|]}?1fe |TY12ØZ} À#DODJ4D򩙠@m#Ei53AH6QI4Nș ک"*[<4mCYofR O SO* Ƚ"pI(o[T@Ixʜqg-~DIAL  $ڒdIpvURER铱TϖH& @)Q|7陎ιv['|GיҰ#z....ZHaĀTMn,Al>,yIKz+AQ?I* 3>f SJ o 'm Uӡ |Q^s>`aT^q.$JusdxgX!vZx9ٷ3X9=yV+j[YQ LSZl#N[A!oOxY<B@歖٬dug[?c&`.pD5&5 ִj>ȁH죰BC%{ a=Nu0 z-lLJjn $L@9& FahP LZ۔/c7Iۥ< h+, 3 Mˋ;TY~S>PӘ^,wKH_fp bL$ _n$RJ ish oY L͵ @0,MGvzvY0 z3$|12v^v1fm\e*kD4V]h@Ew`JwU,26LBR2Ƚ+kԮU8I\H!D2cP)eE$]C$މ.쨂(U jiap:.w#3u 34jib5.&LP[a|&y N537oorXhr*&@;) 3I1KDXxP%꫒ &%5qʃ|T}x(6u[rJ)tnȘ$m;"";Ȭ覴QBITA&l& A@SnwU]Ti]c3jVڕ^C?7"]_>rX+148/s+-cA++  5q2w*IkL ~ۄ%̅ $ DҞk|¦RerF~E/+ؤ Hb|ZwIۙYlVDGe8!@ES%],c*0&.F]Η, lkl.?s1'#]%!;W4&MxZ $yD&ب@wsm5*EwDyh ̃};s~Cf[ 8d}%w@EC;}+IA) hAVi$Pe 1R)&>ii2Z$,"lN%}sּ92xtyoL\Vs8\W̯< TW`+ANDKH$}FH& m+@"f8G8RV_1^S 6_ UsjA۲ZK+~37`ʴ89brӆKZ"8Y'P~TM(iKai-4]N$jRf@JOb ) `җ?";Fąx  nK!#l@"ȻcbfZd9bSatDȕ@38IԘ4ڝ`5TCdxCF:*iO } IDH'V tH`H8\HRbȂb163e8/aS/㗹Lq4n(0$w2Kb7+ZYid.꘧?~qqt.o(v(fV$:xF*itT@#>[7 Xs`RuL- @d\vXDC* hY Qp<#t4xo=[™YK0|pE bgzs7:Rn%"f"j n;DvjUH<&&uk*5PSr YMn/]$K'z/!l@h0E((5A2nW8QۺZFMJx<_Mmآ )he̻݀Vֵ\TdL u[&ӥpTFSTT$kUdTl(FnuEإ8+1k;(;eiD^ȃ@BMD ĺК * 8 +&9Li PⰓ & &HU9q0taZlv KHp ooejbsj`&K\`RV@ h4+Sd@0iT+@q&A  du15Iȧ,~Vp6Nֻ@ T5;SFb=A Sou"M']4*I҇K_5qF3pDL_ͽObtΧӯŎ-2([?mƀFbD47Q@I@v@- >-j B/EDY# j2@Zq&r`8n-"iQ誓Yzw^Xln aڜn8Zn[;`6t D3JV--~uCh'{SNl\I^T汰[:d.c|B47%pFQwIkegmQ5 oҠt1…;II ]5TiM"܅y̶Ke9aM /tFa#hѫy6A (}&.;_?SZF@4WL&="Y꠽&+xXؘ/7B}SrlF?TTLD_?$ l$s&d.L7rt w:'Jx8X0d>ydXq6PdSd5Q̩A4(G#W&3(qxX1?g||nյ`~TY$p0`(4+25JF/Iezz]@H.{'s1cKE3S$xQ/]'bM TA"b/6i?+5옡o]J|\/c3D Ox;fW;vW41f`#?Įǧ=r `7 L`'@$T "tN=5*c ڱ0Z509N0kn٥!q&HP ?R"Ĩ#<(a]P!3N 2u12l;("MXn)Pl B mʀ&HuLQjAĒ%v {$2q@q3MM (Ă`"\)M$}-)dDZ~/d""JAV Ih!`MuO}#u{oƱX6A('q$p\v y6E\pZ& ]&R$ Yvr?1s9\4\N}e. <$ HE<#OLuѲ bPjvM?|ߌGK+zQgRc99?5C/.ĆW;*y:M/?~Y kqI3W0A$vQʐdʁ&+E#i 2 SIvL9!P zIA~W : Dn&vPPY-I jhrH" ngCt;ȑQ>҂ wHߋ tlH>6];/c]]'8M\}{Ě." p[AGd$I%:i[p'4S$=!L {H EoebyAApx(ꖂL6 Κf\ }ɀ㨙Z) 8Y5+3EO ji)j 2.{IP "ZwC#8ر.LAIkHYh^yI5Gdܓur+M$pT@3OTGi@h.hV>iH8^q|.bc-it^ 6 37Hn $UGSOLƤuO 1Q:I&#~$+ZbN,3@@L(6G&mdh M- ._S5 c11q_|m|dP >pm Q,1Ʊ' g ,D??^Cb? x'\G+ˏA slŐD~&> |.ܐb 1 ~pk yQ^el9 i80x\HR))o A,i$e3ڽLTpX4;n`#x3u>0>7]r}ފ"7qUv#x Bg> \|@[P%dP26f1l9u`AYFG# l6CM&8y@bP5H Mr95dD~˔ `B loEZgPAGT;JD kU1;:D `6Cg &N"$V"al"H ,@!i.vD|E5A=HH(T\m]5ڢe~lhD$[uhl͔5)$]ʀ!햠tZ* ފ$6˗A~$\ts" k(R+ISuE`#IlE/|ո4BSSQ$r?KVkqp`O鹖tf;ΐm]AV(c(LD`&Q+j]2Oȃ's~(wE ":H#"W̤MW3;@lE77HaiV-D)ޢ Ь%O-LtRH"t@]^m)?_[2DRTiJQh.2٩N- בHT ,Gi0E=w*N8H8*" [T\T$GA\KI& u| \#`\z@.CZ&YT+ ^.[ ZLR+;JEI&VfHJKih։AdizP$8?)&as$2&6@o$~RYTH H#Dix Weª>cܥqC[ZT4wv]&_27[ZKv#i.NJ~ tZԉ_=)(X\M\ߵtMwP4H:b mȚΪM\b Er$A\!ƃX"A@THH7$T`з{NJu6cP7䨆! ۨ P{LES^~lMdP$\,['HU4 c Z*{zBe@tP&6DIPRyACR5Pc@K-͒^&cxiQ`PvշQ`U#H#}&kHd8 g'f6"-7__q)._)Ōhyl[\HLX~7cI0;:;?XF7LͥuvA3B74m)I N>ЎێʩV1' R@0 ~c5L+t t5"<6Ikə) 1- /O1_U"GJgz'Kg2f~ ?e9.[0ṧIAo7\$O$2UfPL<7bcA0ϑDdeR,PZ\.:BI7S q-H& 7H1&)DAD4E%b9ڒI}D Pa&D@u@.0&]p& IULlWڀhjk+Q 6 bȈ6@L`$fdpV0?ob$Vu_sQ+g`Ǔ@?S>.wKo8곘,bL$~&`.5@Va^J Z ?hxp1]q;zOffk~.l9b {i$kx$@$dNoFke#˵7NDH\U:s//l+30j \ ?:lU2o&4Pp.mAޥAA4D{}$$\ jApB+  mwX$^VOz$K=b? c`3!wTo7W\fsx.;}O"]R O(Rd [*HPi4u"eO _!KK 4t͍& ]}?e^Dbr&/IA'Q:I$*$;D4Iߟd*"V]jJtDZcCC4{4F( &)0q>}&@lC@sHZ@|L^ %ehS2@칛s[n Pw;̙Z&,ju ʳa՝OJ MA$MꚀS>LjjAaUF(0HQSR`n i5ɛ)*3 }'LL,mU.9ڦ> z3K$ju " kX!ʓR`"Ls9I0op KPW]Z.X)*)Ux&Lr=Moɽ7Hۺ$Ӹ\K k=T].J-Gv0[C@^^0u7b;+.4WSG/ֲcu:_o|X΋2H0q%>u 6>1Ո3^{KNYn;K>j Z~4^vcIy X,; 9mf˷̖45@v]wo$[X4 L>)1&7Yh%3V \(b~5$ȢI- +mfd՚0@ l]`A5ͿC\f~ʶĠq?٫ Z$Xmr7漺* YAbFl7 eju Kd( So"}P t~ܠ];GAĐwتLNccU`DPA jMDAJBeA}Ŗ4D8 O`\?Kea/kIk 'mH: uf'U6Dpa3Xㄏ4 %KN@ la;Asu91e׼[0oT$H >@D6%4 nȐ* Lpb4 b{ZmE\+iikO\cd$-@$MuYQ KMhd ˢ۔$VQ{XK`Wh<Is;*!@:~Օ38I?$M*O @cӚ@ p N@ZTL}N hLV5 =+&[)v\t `C;u+>ƗGOTSM,wSoRA.uT$P~E#TcH n9Y8ne$ILTդĶDT!x&bTp3ss H|mLR8&"0#n&u~T(6(;viM\~#u*#RأT.%h^|5~q0!+ ZEh&MA"P$G=Z.Ilq"]$G(xlVvP:i* ҦyTت. 7 :"mNhsǕi+TIV>eU{&4A"ߢbY@& nW>Sfp D׏pLģfk ZR({ZTZ5-t,O6A]DŽyL1EN4J SyHA"; } t!hA$G`H.䤶lT 6ZHIwT}'F;</ s!ȸܥZ FwP ۅCOPf'JuDP .l|fsMC_E LԦ {Oo'edwt Nis Y-|R`7Mj+Ko@/`dPz),-O5Y|s6t@ HP@XEVDGQ7E33d4#+T lAVҡk n0ql/[^ vC-8xM!HW7Qj$RT/#"(WuQeYvi6^q$R)?dz5U/)-PuTLª\ ߅InpGg$NhhtMWhQ$N` f7H2V)0 J e7< SmLI 3 zowF|h5s  \yB"xY,٬Wb5[$ɀ,RdLz§@W6_5|=A\o]I߅#y1So-k.Q1VI! 1YSUhf(ZM*Ǻ`Enǣ⎄3 /4. Vi1 $VwL1 Cv#z*,7S$&A'Z5i,.iAEC\HPU =BZjIǥ#Q* =q%סi:d3]@ܔ$vrC1XWiubapbbGE3_ hq"Ci7x nA17e)e^Pt>` ,AVP T  f@TN;&G*cI'+F@dU.1C;~& ̮W㵭+C"|:{:2y@د~#;|K:kcVpWǹ zZLTqʴX ki%SۖGDOxZpmmIuP*ފGAo ظ51EgVΓ-[ '53~I-uH/SÙlgeٟYr.HO~ Tޑ_u-9LL ~&!V[i+?${]R8AUVU,bV& ]Y5P M-Ꚇͽ>DrTFʚ\!%ܭ646Y& ڠZɉ4a\' !X?gMoe)@|?‘PA=UHM vه k'WP]1H 5;!mV -$PC@mL_yOD̕j)$S4d KH&90ĈkIl/XS^Nlu؆Y nNv 1"nIHZ5l;.D wL6 A-E4~3 k?d")A"֋Ā&ҝ'kB4$0!h\P$iYo@L$@cnblSmE$BZ.Du/*xA& E^ZbS4ߺIMlJCRSOtsI~l,>. ǹv) @H`Lb-)lT2A*IiU7`j"m\ &N27͕I-QnGQ*1xHP2AhfAYhѓ0bde%Y\,Le0dj#^OgGͻ3$/ uA}C"ݤeH~id8wQ$0HG-1^5Y.rx8m\muǘ-vX#h~Q4oZ}L!GSHPRGsZ k3z'޹ut\!DIc';bkĖV,LX &A ܚTR(4u6lĊךIe8`tmB!<;)ןU@%-MPDzPV<&c r_,biDA+$& & Vۦ0Q#MH#iS^ iqp@]Oa8+ &`ҵ^hQkȎe$;tn zt:koB, J ЕC" RLI+UD݊4ϵTgF m)-"k5Gb PLj+Np1] [BY>K Q-seWNUx3'. --Z Mv|Cn7WSk0FaY.=:ofqFg85_IgzO:w:v|5$,`⟔lXf/ ۔ ̦QHVKDA?* wI^9C< lS͗˿10u8\Cfv!ab1A]70S+x88ٓ $7W\COIlxY$cr\Ač3ɘ$@ʃ|K :'Kjm VRo?d5ĸ>g;`yhkt\ UHۄi5 M9HHmT=QEwOui5}&f-|V0߉*ISgY,b9`( -|ˉt2[LWb;d .34OFA5vToEExĹ_ x'32bkدo|ď3t冹.Y[ =6WklV(KFɉ湍p;F T ) ZWܤl$ާ%;BjJ֨ +' #^$mA$7t7}&c8a5V^d wSH_p-\rk@juiЁzyt6{y=זZPۊ$ ꨥ]D?CL! L(&b ,?͗c5\0lFD{;,Z jZlv8'Pc@# $  tUՆqpAxKWH5+E>#d o4oP쯤ZB^?D -NՅ .>'NR`߲E&,.@_Jh H$4 Ce1c6 lQ˟g0:P~6W*̳ID8-M6RuWdRhji@}tAh><&,qW;oOzf::#{jZ{?:ow1@-nLTwT4i㛄6"i- $Ϫɠ04NFy(`.p^T17ENIh"g Z4|dY8?w@>;P3wHOd f.Oj<+)݄]gAOV.k_Н&~'I8$Tzj5Xg;n]ٜC*0YtnNą`Q&UdHV9w ",/e;XԹ`:FbdS+:_4`{@Pl1E H"Y2/UY5*|[nW2G%q׶\+E떻Hdަ(1 XZDE]17Tpý+C};_H5?ΐm5Hpjc5f&9DJk2soc!pPvP VTIsLYM>Y1iZ9 }D۴LA w7z%i`x3hbg=Ye3M:~-9Ø̻[/ '$ɚjQ&eT$ W j3Z@AqIL"M WX4R^:$1H 5 ix0O,i&#W& >n h_|>[zO'e3p/&\;~Ƌ gMI4DR$0/hLlv d$ |6ߔ7!Dy<$-cC;2y\iU@UH9SǪIU&L*&m~w:o&ƨ~ܐ"5Źe'5g@*VFXl9EboS]T  V&er;L&O5IJ0#E”VLĀ {)\@۹L$"S }TuR[jn&ac(A"\W PV4-yi \oդ֔  Ʋ@#C ϖ&44Q^C &`MĨWIlXNa5A!B{pH"}j#e6 MpyU^4hLILzTIuSMmj)&+ MtM&>qT@cJq‰@#Y z(- iМ?1vDMlbhcv$^"[@S35PYՎ ;zg($%@JJfIHi1ygTKA4zk-պcSca= =>?!f.`6X=bv UڱE͕ٗaqkK \%8CX4 4 v2lc]ΗZו‰7A]τL `4w+x{rY;0!-i^LȗI&S跄8d4p`Eh8@h&d R.`0uA@uMp'sEĘpLs#P\\ L a{al\UQ9Ndsp 8nA]כ0PnlJ@>*;kU@4;Fȵ&< PڃYYe@;L#0qb09gMOc?eR$A LuewÎ2+UcA!TxKA/5RӺ $ B]KDtT}Qe;JAJz.E^R&RdϪ#M: d" 7$$^,R\# ED}Heh;HW }1$ҊneE(M9Q#_ q0_~k1j Gsa_7_axC7(:C;?XcH&peͷA'Vu7OPk)"W.AMLPi9]ޓ]0Ndp.#ߍᮉqsyq,hI$p3%7g:o618``I >?e:sO˼?,㙡|U'Eg3=CgH8pXi1S@_ n(0MUbYDd:L š`D T4TEF&>us⼓,;I`;P;\tq;xiro4uE⫽zgÒv# "v],LGb<97Y#wLXDHu70_~ù\nS3NQ 'PK $( ɉN"bEm.@)K[?Lh2N) 0T'"RdDMU uC$֠Q&M@߅$B 5 ;(tkd(O;,wnEaY0=gHi(PJVɏ)¿RHE}^ fi }v[.hi Vxؘmf#6.'7H Wˍnq ngPV&N$&6P~(oo+$L5$cdIq\DnD"X$tM`&f@Y*[5Q-I UE=6[t6 ;5+a.[$g4V{Uc7v[̈EWT ;JVc% m]&T;\ILA%I4W }A,iM5HH-h%Oeq" ZHoB54 `I6|ߔ֨:MKX)$ĒcY|&6&68Xs1*  jѨ@S]C32VƝkAArbl4(~ۤꅭR!āmAJ:DJ[` /3c%<. X5 5W ⽥nK\;Qu5y* A;~dyP|Gtҷ/#I *4m$0kj!V.2l>\fgrXnt_uTH>Cq RGT 2*)͂"=]63 7Mγ1{Xom OeֺQK;ճX%]\{K w?,4Z  u@TOƳSI͒HMBĨH3Z(oAdߟMI1H"aoXf9tTQ@e4l&i ZD X&j)* uMf 3m(@S#Y\ Puveson3ZH+3ϹK=Tش)'t6'y$E@-ʋ]hu6ӪסV#`֫Qh0LNE8@q#F(6&9V`reNH}pb1By˜k;rbcb^T&"dwz?S[;pnc |qB4|v40pf9_61 b T'T~ LLCbf7RHqDL8 ϩI "¦H-HI*DRczLJ>$Ƙ a D\ rj?6Z :GƒNA)bܬԝTJI@fTM)Eh TY2h|nR$af0v^A?. GMHixIZAk$F{,@zITp,">ʉ4CuhL3"c {*II&!DENykFHtbf < n񿈿x +59A }=C -caeq~~Ctjb'A1K@%jvJmi8V&F; vpDVCY#+4?pxT &'h0}QDV9ZpH0m KM{(5I&ࠐuDdKrZq½ xW.~W7% 8S)G:׌:!hWq H-H;oQ鏺PO;U@_G~#9,w1>S8mwF lG?BIJ o`CnwZgFA`oš0DLv *@۔ Ii"H.-mK8X/#*eU} N:7YWGŸi-n 8A$[~3 ??+֒ӈr٨i??4$@tima(dDE,)1b|lˢMB&&@R` @nfbE`j D͡b( غ%ǕW,P'x\"fg IgoЭw;5˸M0̨HtЙM45k Ѓ+TCu-XDxw2WbbPW<9׼IL78FR$M6QP"mӆXfuq D F+ɧ.'.y2I<iN(M&,Rd]1j$5}8ӨZVhk*K]%®+:WL( x`u^Ժ+2Y@;/?HFh 3;&KdM7Pɂ,I}EL"wÁ1LUH iQ>g2aM GD2j`¤A BG.U-HS}EhN`$xAzZ& қT;"ϠN&"&+mpc6 #M-I :dɉJN{|  8(P=ﺃʦ>$2b*Q 3 hܤXk(XesdY5|!׺oNofF~!ӽ|b|[kPEHI H3k~J.^+Qe`o3i@&+ 76%(;hAIn%"{%Ek+DMKhV\[2HtT>?3A &hdU3znh51THҀC`ʼn\q/,"뎔@&BLەss9.4@ujv_) Gh ұrX|̻#z1t 1+C,~7-}xLʈl*#HbE;!f]wVE8'ď׼<f'Aq~>ćXAӮbD@ A-5/2Cy|Wя{[t _= :$u@DAs $$J Uj Ĉkʴ3-&6CUIM&EXuH`J<3s>!aub,h{>٩O<=)O uחv&#%o0c5v6@hQ o$I1H@tmTQ$y/B ? "w+x'cKLG)vA\8m:Z5%03 0HM"e[MIJ S@.9[-ճ75݄̓F$0C3 u&+e $wD<8Ml) p0I " 4Iu &-K(FZZ4u( Q#~W){F17`)I$m[x1*:}HC`) B-1FC n*"E N%tq-3Ud6`p[J w'}8x}"+p]i2j+HkdCP`Х1neMn'ڈ&L֢Ugi;-68vzSlk󘃬߅<|GSF2H# NJ ea$o r'>7I v<@CHfH3lP9D4?ZuU}VOs79f88ĉ.Qdj@J[~.S\84KUXV|b(}Xp> G!`4nHm5ѩS$g<zro53X};4O̻ b`^,34Q" #vF$@H5(Z+c +=;W7Jc7gzI LA$?˫I&EI}Īf&%+;'aD$MbNLC&ny\a2DYpI7:MkUn<,|"Xuou 2)]KOTPaJEM-gUMmʅAZCS9@F8XPis؟1PsiOJdCmֈRD &;4BCꍩ۳ratN&8ɚ&|;μIu| 'kDB2tw[`xe"EOUI5L&/nJi:Ise]n+tk1#:ݍx/yG]i.zEz.58Fۢ&M"UrF-׊Tq#e͕s[`\JvY?t dCϻ"C2n~R"vseJC|ՋL)f}UH4Z^&Ci*scV*H&A[t_tSL?+:@ՠDT 7T:$BG!^KZM11aɴeZ#A3y U2 @@@U˃XHJ'Sq&+0GSKVM"`XwoD+5 E 9ws)Y|Pʷ9: RW`xXJ7,kn4 ZѩO "))6D.Jsx3 iu<{bceq$ax]B#UZ&֗7y/NrW5є̓+`PĎHָ eH#LzP ڟ3 h}vL2 !m oKWiۺ MLRf="q.EH$i)w@:E\ui? c@ޠgt 'hm5E@Hi?Xx;{{//?+t?b Yq1O꿟q8$ϪqDVcd쩩0G{?۔ -hs0z(v0q"&wU -H)#LGu)K˿IY ?u$17IVP$ɤ(%",, -v0-b={4jLT- $;oziA/߲APɟDq#3_R<) Iړ)sd8loEK@-4}F]i `RP}-h&aB7e:<  p*ML4v9SxdP"犭I4"˓+tHh1qKujk+<&4q)i"y%-{L8P$ ,bc51a/|,??Nk]vwW6 0?db{%.vjes $4nKt7b4hT;I"6&nALie*I8s,$TNqcKAiؓ(w]92B7}S'fRKq0CLI$ń/ u83 yDM[`tMt&< |6_0 =U`!& L8*&t\ln&9LaH@`5%r݇@1p.wa MV 60,SAu.J7L##m$ANUH"/Gb)N[_Ej z `w$ @z(VmM(d#Ӧ@3谨U _PY wRI-7`P1M$7`ӤO\+p`: u5d BG B. ʵ Rﲛ25 *$UoLPOYT#5"8HQ #x@q G*-̤&R 'TV$1&W)2xyM`֫L(&!đJ{d\kc)$HoMIu"N.;Tb7Ki{B!HMh=W6[2;1X#P\xp$5d"c`9Gʉ(HR_e5ˣ+2LǢ6I  p!QgPfH4St .w(9z mdNܮG97ÅBAľ&93<\b@+ Z  A$=ժB}D{ 28 ӕ6[oT9ja"K6%@ 'k-(5CA4 Bjm0;%ky"ml64QrvEb#{vvہB4B|DZT1  LzwP`c5aA_|j3ѺvUO9\ 3%@OU Lmr p ۔`K@ YBpKEq o<Y5HH53-6@PPIܞ&I3#@s&БJIQ(`IH/ɠLwv( ٳǹ:dfq1q;WeIQ6 *7P=w-ZeBHojJb~at?̀U yb C uBFGY<+q]↙ ?ύzol'O8Y \݉ 6@e-U6^8YDThS#ɭ(q d%seqZVՂW=or]=l,,<~ak4Ti$q$+"LgI'dL氡V$ X ӥm.˚c =c[un q\HRb';PǢ]Co4)] -ԲXWM$GYkv d Hq'E5@TAsP%1Z֫1p^R(|O*a*)$QN`Ӥ")굦Uʠ$z)0;oe6;Lt' ,A\@ʏ v0|נlzP 4rBDȦYsL -AS1r@ >: L\vYA7P]E4b3ik<򱇄wn6(L{U˃ւV> Z+uHmd_ ܬknV45ۚyiH$,zZ$Mn}?rS/q[- &Eeo& 2H{pZ@جo;PikR.H24%Qb ^' ^ W?^%~xw5߉20Mʒ @<@I" C%ށs9gI3q3# ڋX!uB&\L&waaɆʼnpc .E@U1kTD CPue"XHiR,$_d, @@$&+Z-"k˅3ߺ(b?*A nVLiMwLA}@j@1ovDHؙMdo4e_IHV31pMSZ$l ?e4M<ׁ+;%򊓨o[(EH2fhcrN(OwQn) h6QoHUJu6dn%$3p.q|CBL /A MH]lɲ&/UD'@L Kek ^)_;v(~,L&EΜ-$2]>Y*f|8dXH$,7@u@$ h$?Q2 #@+4Iu 3axu \|ىbM|)v3dUwZ͞ޞ1I53`Ht r[SA7DVS ,I\41FKZALD^bOeH$$[L1Y hs]@ 1\&iWN1,hAbgqQpq9}|Ɠ6q .4nC2TE'Mʛڵ[$h[/jФ ,4#ҊmlGm>S\F!q+4*O(Hq2E7"#%FuaPL"9O%Dm꣤im&"A5.CУtvz*DXQ+_h)f8Cq4#{ uг][%8,7%DIy˽ ͇3ܨBbIuQ_ec4!Sʢċht$Yfu f@>.1Nw>& ~a ]U.oɠ@P2dr >d?lO0kB@h\yDFÕ 3-f[3 "'$@'e.p|Ą"*!fuRg5ޥ BL>Av4\NCI|㙒Z@LwChɿt&3-$@~Ps|rZ߉$0?k~6?EkSΗk*6_7洃d~@ih1 ,[fq 2YLcP*@ 5eI%T܀&=AeD5ȑI#h8 ,=sfy,>]aWF纋߅+Me,#I5zJH M>X1Hli~n^k7X3VDw+5uȢDM7N5$js;kCAiY"hk AaMnrwC3-_PPCs(#LT{&b&f W13 f+NP]$=Ţ - W;5qh+ hAI o;98崙kDV{^E"=v }gP< 1|yIisvOSf< ҆Q.14|C saI"u-3.(^f"( i$PEZjYPU2)*p U;KGJ&IpJĐMU XD4'dZh_J8P>I6}a\&=,]r hbw'u@ağujH˴0M+Eߑ`q~ $T{Yx$DžCg MA""vPwhMtەɀqo qs67(L~?½/^=t0[VXr=A sbH(t_ɩTbI IH< .41,LTXNƷ!TқbMncb?(|vd ${sӼO$C fGicԺg1rG#{˙@;I d9HjGuT|.4Wx+Ѻsuf '>_ëxeYlG )Ö m{KEy2ee Wc$74Gh6_юS7|+g_0;2_ҵ Ԛq]c>%&ԕ֘Su -&ׄDNսLN"ʠ44M̸_t6eK`}]S,cܠyMs%j#3Zܑ[w&P%2'a:% AɡƊ5Ui4<&нN^lMb3 <<<6q4xᧈSecÃ;8+L 2x7ED׳M4'oNs囆f$z^!|v7f1Ɔv#t6LL3Mu:9At iV6QT z :Id gd3PDԙiUkGPbkE˗Xs #oY2trxxw{>~3_x1:o5v#` (hAxq% V6U`7WԈH0;R V$7n0umOEo06"&EP5$Hz$?H,5bh1Z5I8nӨMf&)xhAkE "jDHZ 0M K& 56z3#kpKWObtLwSDLNё!BTء2 #l p&[aI}fY-@ ^wtHEabD@A2YJ?- &?P""yZ"2@#e'2jOkOb aZ ca9Wm T]1-5[Ә\-xp`4+8!0oZO8xfcKθ+%Qd2@D dn N2K\k3loC:si@ 7Ǣ|LW=2U ˍT vKD\$L}ccG 1#z(8D$1*@5I-s<c$֛L y@]H6FƢ P$i؈5bKDv MlhkIܣP'd ҟUȼ] R $H碌A2PQz$D싺t÷$hbDZsH0ndȨkDhDG@;)3?Ye q֚+ C+&vQNLIxK h?@ sr X2 6NsCS&"'TKph>q4 ɬEHPOEتKPk] TM`5'bZe"O r i6Nid8̃3Jl&C`ʇ3e8]6SLL%կ)0 sUL&"lE=L, ZU0%ѦbeVs4] $Aġ]B(Rdn甶=ɤ/爺'JUN3Y5|˞Z_/.h,[ O +&H)H-6.4d6׿]xIϠ\Y|Lg$g#!z&YId3Vw_=4K h G?ؘ ! TLP4oį؏ @` >?2;z{V'2&56M=e)V'Ye0ٍsp"u|hnoҲU@ o^'K 'Iݔ((H@ ﺝq6FQl ˫ʣA1t$wA MDFOhBH ɩTj6%z*Z . 3Atjb:bBjoTreΉG { U__y:SjQjU譣c)l^{_Llv{ x/⮣s8xzD/7`e2K# FK*LW3YqWfX8.&,azti;RO-}M\^10r9??ZWG9D%d\Mo;"l[tȊARujYքD$iku<6TꭖA۲^9KҀ Q\D]Y@1R"H‰6iH>h&NQnUQk(Ih;$8.&EjP:kj&G"z  9P:f-LLTőACVI+.򚚃ʋ$EdR`<۔Z K(->]Ou,O{t ^QAQ"JubX_Y n:^cuSeÐr0<'IL .%YLUi8IeM50:8bFi F߄>T>\dT.|C1-%p-{NInpwblRP&D zګLĂtzAFt"jG@:mu/_t _*tR s5".32@ V ܬ,vZ:AIcC"EhdDHppÚ-NVL"$Ri$uX6iQdˍA̝#b(jPZ5]]P<DT3 ě-vSpTdiO{yo|O+p־||CqqyZ2"Lh7H5O:"M=XY25McDcI4X-lD'6PZ+(aAVEދ[S tA=V[ptBkl[C?I.D&(#`jRh hhtu|yJ-n6KAD+puv`C|XgZu.V~[ C7xO"u&Mvan0ִp MNNI#zڍUID)d(]>I(]5Gl"ch4A0 `[,LK"J͕ $&(A9I,榿T.(f$?d8"t@f)6M4QQ&(DZsLD*GХ ;%A[\L4dk  ȷ&}ʈIZdߺj dhŒIO5A$@qm㕢e'hvr pk*t`.70[c7b Ar+35´@jbY- BmS+~xxa,aP<FE5xgҠ}ZK֜Bn~[pDyLT<'P5xX5l x 2wNtj$2&'TnE D8j}T@*`fHREv8 ֗ \nɴD1$*tHµ@D T?U);hI$~X*&z"B @6eĐ&R*/km(2^I&@Fұ3 B hT0<Ŵ*) lDF|7aa4 B-3JlkRn&1 =*P ܏N$Lײ `|b A34yf$*m`IILH9/E`@Ri!(R A@DIcb(IL-I-.3Po[%柅 29*Pz"5:1X8ASc6YhB.4}^|;ܗT.Xf9|@i^ 18_z?:?k?8m8luj(yI3Pt6H4F7Kcn\'We{?nqs15yq>7 .s(HSwwYh].`1aⵇH>hkATEb(j8K&)&M 8O)c5$U(͍%"Z 8`kL]w(q>xiդ <%1D>y6PZ&- .:H#k8z I ,&L%M~27i>d09A%pP%8EO.$u1:\n=ÜC Jb & wF4Db {F$֤ۨG&ީ#uw l-k 1Cph+\g|2'05Ðۑ/xܻb 60+h?Þ'.=c1Ce&@#$o;L$qDPT4 $:dPR)&ka]1ZZvYʄ[MtT&[^U.D4T  |KV5(bkaJH ?7`-%܁ j@CI t@0&&@E7VE7PH xϪs9.ށsq:hѴה/3V@fPDos^ g]fTK\]6y+({|'x1X :.q̸h2DsK1pvg̚.$ɕ^H0;(*N5vǢ PdxDi;Қ(@ T'IhDz ]a.@JQ.E\i+bNO 891uA![G\AMA0[VUsuRYh&=MB u,5(lECuDÄTvDrwPPcMAԘsL<ۯ 8bB^+ωs\o qx {_u2Eāhra1pE`+s2IqJͨL C;%]/ic{#B*wGKO)&H}Iu n{ x1 kDnĚ7Ml@5Pd֛.gf3=IZrBhONtj ɨkk_&60t8\'K^xXCHT7C:@6Vse`CTMZlTY%QGd:IlD$ TG6= q`#KuN!s;-i,-ngp`G|;O溞Obl~%Ihw,EonBĘ) p1»H#j: p m^B&vEĺK4&WlO]fq2p\RIWvPŸ,qXA8L$;,I$CE;ZX uv6f@92? 1 cOunԼ#~_T?pW?;~6&ē@]p|mtJ"*" In E, 8bw\e+)  Yq G番PU p꘼Y$Relj@F@09I$m akd&*L~ȓkZF\֒?E Yl Eon[x_f߭"LΐtV; jIz(A$S@-Q5CxcQoTED4qʋM`ME*7UiA =NThoQQwzCr'a*8p:G:و RJk0kA-"+0*<@kti3'Qvzvc:Z>,v&LeG{4麌50*Q1P&/ \p zIP@"D)>Bl $U Q @-bMt8Zj71bxA}+XX ӪN( "dA\t*Lmy+_|Dbt#Ly|w2sL|M:j(\+UnBqne!bbJ%\x.gFKAyظp:āS85T:<+OP"6q#\N{ H:Ҳ"(i2&AM 7 ⻥0gaHff@k]. - @tT4HZXDQ G(#`Z";J&AlPRP)TV4M ElfuA*$Ȱn諁h1;r bݒ#UL6$OA B+&(@5#0"M4pan ZH1>"MCfR%MTq[JX o%%w?jdĂ 1?>h)Et(D ,>[NXg%i( \jgKk"li'oDy 6P `  z)n1Ѕ]EI Ci&TS PS>@ԍ~I6:gfX؟U{<+!u  VJVTuA![h`€ t)[I#S Ed5(SP&Ht ->,3>45<aba`c l1v9cOsÚeUZ'Th8  -o{@!Ÿ\jDDVHQ`ZMM#EbM]@Ti3_DDRA@q RfߎU9M̻Hv'rLp34gdΆ`8o~g&_͔n>iop]įNo 9`,<61 +`iʉ%CgSiZ3uZk|Z]&tȘ+/ L2015ey܃* 55n y;a$PT%V=ٙv dD^md8ys%R ߲IPLS~%jIQ4P$֙6PuJGU*u `  5<Gz-/d=N). 67TZ/"/b5U A$g's]C_7[ ѹ\x' SRM6EiQl-$$\DƓRAkH.p#ʛTD7Q?t0"(54E0SXpZ1ꤏ|Q-?")j(W6v]14h9qiuDµE$J]tR6$&CV yZvI!lk6Z b qN' v`(#ϭ(h+̠bE;TD$D6:Vߏ9*6\`RZ'n>k]H&~.SaCA=]9"dQ$@U`)/ʈj$1k@i jDlL@KVڶ>H:wHF1;,[V I(zlL)i T5QoA?NMW.W1t8T:VK!ճlaWJ}G#氳f9YGIP@ƛ%`*)hVp3 h.pC Xl=jZ%F*)CDT,}ozj Akb#Np&) - Ȋ_xc%^%8<Q7?iQ5n VisEFbgus>^=Il5 sV @1"cP9L  s"83 8IH q;tb.5P^ȡpZvC].7A!Ζw]17.d 9]4McH P/|;>[Ժ{X=Kg16H&I55u`c\d4lϺI O$X1[J$]΍qVe4LC @;#tΣ{ݩ.hq.=KdAdM s".J8y)$Dž͈ av(&-!E<'c-i&$pӈdiM2 lhY?<7gu. \8TyLVw~9x$Kq<vao i31OnP<&@ޡ/0X1X!x@ "آmXNZIM%}Pm$DoAqTG22ӕ0b4KG{,~uL D2+K$ I*1i k4: W2ܘܐc4w*L$&f"kE#s5n4upșHu tKHZ"f\$O j-?L ֤So (D ">[ĦbB&mQɘG*Yk1$r%ZA؉($5ӡש~➉陜Df9c\>GRW[nwbbeXN-z<⏈NN|,a1hiu񺦀S14U-?7eL0yUD{zCIA4 M }F}vSeA LzM + `b4#\3qDiEd,1'tid2b@ (hkw'@@UtWT,o&Au(Db@%Ey(<ReSB'ZaW^+5ˌ0\,<|_҄ؓ}|~ׂp3pqF+0\O׋ӹ6Gc - 3gNC5Wۦ#u14y ۪4Z/T$Sš%$%UTl "K?H#Q R L`Itc;"FE`-%@2"MIToy\lk]zP &)J؊-U]c#ط E$5+Hu16ˁ&j9`H@^hZ5 4Fop %Z"=bfDR$d{s!ڌ+Xٌ\ñ1_bq~Pq?Q8NRdɉy-m.="$e1HpK ⒈HQ IjHKFVfSKz T L sҫSdS4G6A [`hw[~3q0]gb8]S9n;jv+do^b.='u<)ܮ >u#dzi|FgsWuAe?MmxX1p@~N[]1hHER1M@ki (cN1tE̍H )KAf.ޫкnw#3NgZ`WCN2J]N58`k$:" $AVZFe \  i: lB 5<$Azn .$ϭjf O-G%e4#R["!zJZ)FG .5V"$,HᾟHáh4?D P+JNR )DC[mDGrAMA2V@$n+ #LWJ6 B@- M.SyyY$1I@\łR2&(D:e Cˊp/2X2AI [% JYE}#@M_+ f9<=8^']o k%Cn !A5ʝ@`{$"j{wT}zW[70;)e56m\cW307S&^3i43#K~8hzMLJI $:ZykL 2H-aƖj14Q2b b #it=TI&\+DOu[J&Z}w2y <_ h-y.ƚ' lDX@Nc\LH5dELE7[031:Pf}ʍ귽KA0T )ʉ1J\ d4F@*.3P$VMN)$I*"fi1YhHÀi4U$֕;Vd!D7U4P_ImD;=?/ 2"!&ոE%{Ju`P Q4xDwP6$z*-C>cQt -2].m$y\;Vuٜ}Yl-à ɏUG5*#Q2w 4Hxji~ DzȂ.| ll݁Xs+tjJކnH1h* C#تeVΰQ @T-i .\f}hYX.;u9 =6N)2!Ê`4AiPE:dV?pkS546x?1s"4 Ac"E T (H曥u+uN"=I&bPL@ 'Z 5H$֫Ï|?-92:[sD^;|R9D@;]2@ O- Ȁ + .yyDpDgӺLj>P2Ù8vo%ι;,2DѲh;.qqi;q9'Q.neAn<-m&ihq_3ݿNWGsS {M҅ l Ih$cKZA$Iyy.Y-hv 'q01%@%rWi8#\%Η\nwDk7 DUiLv]Q0F#pN(̞y8X uu[ FkCvR1P*aGaŲK~Ҁ $:T> e`&SyTA'I;Lp3JzMAI!jIP\s[&6DɁIKDM/SKzR$;A5a*Ff#"+$~Gf_絢 %yOc;i߅$}#d{Bh78`w^DhMWr3!axNA=ךv45Y1k2 i7بD5=MTAU&ŭUF)#MEHƅfbޕs=vP cWjU$ieH ęLK@@hpprfa=5 {>M_vKuW TLAL`3.$*b6u}$itLIqT$EDNheHզ4雔Q v.ͱI&,WK=kxS3j$  xs=ួ}c S^V4Ȧb"CQI5h"WDHL64A7NoU_[\ p0 T} #q\H Z$ 0:O*(F+MfA)6_|?&x|K?+0$TA?d&Ky qs}5`bAsf($` o >h4?rq mp$۽:WaѸ5\f e&'E4ԎL#AM0@]h<3 ؕPްiy[k@ :G5ГcI3~!C1 5"E{jj;DV)@pK6 "(  zv2>0c6.JY,#LV?U9H( TVS#a5Yb=VftM#<34= 2k.L6G l#O\fW5,'a #}!~:q=c#׻nψ L?y|vAXM{f16#9\adT{D@RѫsEߕA0 VkOm%fdI lQ[滊(dWitTs2 I01\F ".t BI 5h.A3_ ?lkLqM[8HZ6D2/(_5"I 8:]XP\\ J!ke-~gbDV"Jt T5)rvQNl$@gil>o#ʐ&னCm_ rL,-AJt NB; 'kʄ̘C&fc{ U̓fl:+K}%@A1[ʤM6'Hq&#:*(@[~TCr$|湺Wc˷ b5UjtM&u"E eu4)T ڼk|ː8&dRusP` &@H}bh3#AnKH4$u6ÇP$8މ I0"bH71_5A}VH1EL€6# Z@!`'dV yD\>6P$W^!yޛs|-s`̙}j{jG) Mp 24دSx?ѱ/Lx'Bk=3Gf85~#˜/t?"8~8YwqpbD H ܣWkl"ުk4Am虖b"DwM ILHJȉ/$DfPYAsʴKȠP $TRP_)T%#cx@ A"2xH։= G+L,n 轎K/`I0=%nOuᑦQA@Ǥ8WT`8I1RKt}<蟖&L؅h,0dj",iST8odMZO OEju MAA- SBA3S 3>.\c.8#].M}H8i2dC_&]R?z]#3~7~fba EYHKI&IW~׾dqz>*ֹD|D2c*,˸5XK&+lq~fQӄ 4 G'{tLLf w1\>S7P&I1@E#qPm@Xs@$<=-^k'L4F4^FY(0!k/hp ߱]|S纚H4!NH &>hWNl7q q#ԈTD$w*IK;Dd Q@ZgQ NZ4E,D$pXC?6+ܩU/4>oE@FȒH"nR7 `H⋐HoFN4n;Q&ff#2 [xA2%)TO&+1K+4$ a iC`;LNAxt͒oUT0⪠yLVwAp?H#1p67zg=_`aL.;2XMq 6 5Bbx1u CHIkâ$SP 6!lO6 " Vt6Mp.7I[8.8zaŢdjB`+x8Nnz=s9\˰q1`/0j .&t"KM sL(hez8!x7qݕp!,oH.4_M L"v ( 9N Eńy+ *FAԐ9DןUIqf&ܨ2|ԬAY@ ڲ4"/K%dPI(Y4<,]MMTfN6Pso¤D75"a MIUo~A((B6n!ě9Aڅ"xUI#-m/,Ӥvryn)\ ޷<,Oa3b@GĞ"qߘf^ܕp} n0>i!ŤI&D^ MdY3dޖIkjӦNXz""J!#@ELT*`M7+c@iqV\8䴙)' ؊lЃ ">&fesp1cXmb |C _e Y|? 1?΍PLTs  &AJ2$_ ;)j-9t 3@Uk‹a.`*6V+;R dKM7Cً -:o+^QFfu1ʚ [Ci,MehM0-eN#͔|^|TJ?: L ea\bO?Q0AUc`=j.ij%EKi"E_&&d:{ S"T2l!D^@QMٟpQq: д "h QDDe4-%ig;q u(%:%!@oPmk)AaBSﲴ$ i$ŕN!@2G= IImOj"2+o k><EOT$ą4A5@;z16 .H" ׹Y EL~%j{$[mlZnH,4 nɁsš0Gށ,>ȀM;P LT7U`fR `^xlL7 "ZH $_J~.v,P`P<+bgТ`7Y@a`"Р.JAHd^ +)hfps-7?yLH&`l+Y2Z u @XuFÕ@ I5HQ`Qq` 4ۿ%Q-3tȋYf ". KZD 7+.<* S=& S8Ȃ~R0$Z֞4bFR 1yThk(?I_|K@$^Kp*mdti0\⃈`j1- vǷt4=vQW  *"$p OZ$E"*ͬ{\kU, NBH1Qʨ)숞dv=v&d#&n&P2 A 2"&5 MKtTlMH&a QB&Iڋ@y,9@:4L^ ɒU7I;v&,EfAht&UCIl<Щ/#%O5~3-25^& 8f}LbP,^*7#\52\ { (Ԯ@*I˜X;pDΙi֝pȐa00hm}A(BH(:3u4tĺ9( L4!ިt$G'o = " w(7Q̔BmDF Q5آ* ZGL:#E +C $ny&@M"AVĺ^x'zaaǵW߆~ r{=kz~| Y|I.Y@l$;dI%h-R]Uf#ȵ {uba@$T)FOhLVbNp- &AqFֺS=uɃ!`6&E4A D{j-*aԍlP$[xPH AQ4 M*PKʈ$~fk$A4b4뮼^(\ژA шncKDeAL@!dNA^ dPbGP7P%dyT<[@\Hlœ Onn2@".5%f5:DI#rZU 9]!I%-OX)h3RdodyߕdEP"M:HI1xLaw iZ?UG$Ț {JIhYpkȺ1OD6aud94i9^%$5odńdi"-^DV*&;* "@ @I,-588 p M O!EACGFYALCk*2kNˊ$E`TD@Ea GhTj5iAYP%BḓP?{bAmLJnMh6PbAYk")ꨛ:iޜNMNTê} *@= ;&|Lɘ;I >S›%]hPn]QJOmX-$Y&W X {Ap?_48ܧ0P= R.  APhQ[$4ݶ\s m;Oxxg`6c-:V#ؽCfq3gktH jE6 5&ZH2H>H?3"Pǡd4 WM$ÆRjjZ1iN+89`v#YAhQh& m[_XW .,. Q)ʚAuDAtk<"LPIQkne:'Qo.DS Yb\H}M10p0Kq@ up*4TvITn $[QJTD^Cn0ApoBb0atV l!ߕnYs~TÀW>c-j9P .fب@;ATDX JAUK pN&K-ba|M+STZS`Z-TQ5y߄L5N~ 6Hh #Z}%P"ThJ*kohDo*m@~w^ar39s +kCɇ 琹#S&hG+di3t#h9D5F'P'MS(5oHQu5 UŽ!GDGb\R衄 %"CNHF9خ@2L]\bZu}OEQA4$(.%F)Vv/ZoOtiNE4RfO 'hh8˓9o Lo&cb<6X pFI*FTaWO=w'XO=n188N\/oyiˋDMDE I$m DAyP|ߕP ؙJɼEH3dm&?U3-U1A 崽!u.)u,A8YK[>{kJ "~C|Li(a_MsM5vEn@24EU2dTP4&Q`ʈtm Rq* hZfC,%D._?0r&Ahm{F5+D8IRa wd]H!WݪL5s<͛q5\Z Y@Bh(N4tcQ$hPd]H A.l;p8Ύzi<6א N3kq$I+ Eh \u q(Y4?Cj~@%1?c-鼈 MY--l,#W]:$ 5 .}[6T %5i<[Ϝfc;/0ˮ|k0THʤU-DR5R$0Y6چ%,&͕c"̤ԏ]#sPIFHy[*uG"2տbi="WMASjZI;Aj š"'eO+Q&uOEEGeA-/ 6cPu\LڼMed{)"GTo,e $8324z$dI6[3b9(cڋ;\}dVIiZ4 cTTGxHp/ƜCߨ0bH'k^TD VZ wQ PC;@pl=/K-;VvDi#PM LznM@@pI޿+QO)J4.Zerxx#Ss.& mRTGh@Iq> bL@h1fIn.\,.L{1/ĮApix#ԗ ϲÚK0" `MjM@oeqHZk}#w߂}sni+6N>`V͐ O|: )׎ZE_(@"pAK0cIX""j Ȃ"@dM6%yie@62{h D+u >\W俦s ͑KĢDQS_EEy-mL) EFs+׾C\$Wp)Z ' KH2{1ܳr>. >2Ze0I?'xF)1?xg-ezVo`t|@Ù>\0w+'y/xt \]5D- z]J ˷:@u^l*,; H$o.U&-eɇVѹ,sKn&nR PohDEkR***iC RPhZdPq @eOe$mT@$iRjZ$D JۮmP^%]3er=d̀'7|/f0yΛ'T9\W }_{{?zxk?o'~|UOo=!_ Y̓`beɌ#&;~2ݺH#n?\zl CCD ("w@Y-JӉTk( : S|U+`vW4 |@'MW}Kt|~尾?H}v_=W$,8C"P\&&(MU-@?L`/lŹH1B=LްlLKpj`is+sHqWA nfr?&TdI7FaMxZ _:C1TTukAUKgQ= qYwzPl1ە%tt"[ 'jTۈ%WER[$AQ0)oJ߄:fϲ+0ZAN ya?e&ED"A :ťi&?W#0&p5XQIA )oQ HҪ2ME h!kaS~:fD!̐8ZdI0r{UnC@DHD} ̎A#)RtdixQh8K\5^ˤA-65YCKA e.>YSv'=aqxxp- -*~V8標wPAڷU&PIP(d꘨oGH$@tCD\cca5+m\N@suDlf&%M{)E~uILSqQ;ik6*1 >N*i3+Ydudwa`"c XڃlA\#"@(d7*IlS{ "m_碈&:g wTGm h6Iu &I"둹\&9X ADZ2/c2󉍈^7\Fi5i($ i&kHAs>h@0CR:x.\n_7;X\WϬ D\A?U)ڴ+I&+Tip1[fP1iEMc?-@ITZsJ-q0ᅈY bk&L;(hA썴=@LdϺHEDZ3"5J75@ր- T.WepZZC2h[4!Zy y4OAW~"I(-y{q"S;Yb!b&+3n.iO8_07Cn !y;/=MN# 3 o Ҟ/[\3b%4;Ծ7:rg!ǏoŏRcm);oUͧLn&q4Q5ZRd#$R *4'[Au HR[Э?DzLA5  0bisE Z0}QP؁Zpl \5e%Gs8eVw͝@+XUML<f2STɀ!=VYaY~m`꾇ǝs~~qi0hG0>dgm"LjjJHܭ7Q$?)Q"?kj$4\Q UE+ p]櫳v]? H6+ᾉG;f!0QCx]=r5a¼^LS(b(kt1\ e20Ͱ~{"g*kohI$M"e=b=0$LېDh!tV;F5Wh_/{b3zeYyjkA_!Wld5]qP)Xf&N^ yME 0 hO  vM$zv&YëF+{-Y&y8+^#Y3:``-KIv]"ۨoEhOtKe@|w D<ƽ^yLaQBS6f)b$$2vI6L檃;ʀ5BCb=Jl\ivHhؕɬ16X"@$}S&)3"nڄZ\lC`@\BLPא "5]"LÄYnDGn Vm.Mjaz=7!l$}<2>c|& i"/H\d0b 8E" .L@ڊh21pYXh#u'I;oI &oM3pRLq6*50LEv@ mujޔcX d5cSO"" >oΨh4KouâЛJnOUiCI:I2q0.q4oUx6ܿSv wJu4H 8Km QTĂܨ5KA"kPp$M}&TPhtI6(IR$T 603 L=2&HJyܢic6Y-'rv;X\m,!R cHI{"k`L]o|HK32` kf`_ \[, ]c t~hEɣK鬊^=G22Aچ_Y:m+51$Ip$''际 lE)ʢde8DTeL7u iCeKH*ITdd'P @"[LAk0"*Ri$Ȃ+o$j`^'&EM]FI܈Qz#g8`_Agpb-.ŋI[7zS}QisBH" 5}'M*+T7 x9l\&9h ^Cy\L.t~W#|^6#M׌Gɥ?nW0~ kߘa迕'߃-tD[깥떎G& 1𵤚3a P%$I@)-fh P-PeyZ~# QG@$o }A&!Na3ZLM-^-!Nm$ V9# Zv &w3@|' C='\ x#T;߅>`^+YNṸ`~#:M܀N'8 S 4>aD;Jʈts*`7@;+z3cb'¡yyqseˠ6B4xZ%P[=@:&5 L TMcCe0PLDEhS5))YfuOAb`n*ii`MP ʾt&.(IM$l&:i4L$EbA=}BT (E]6mcPkfyba$lu ߁`}Vдa=u >tHh#CG֛L2/62 H$KY؈qzvo3$bi5XsYcb8Itp A l^oBL{-AP@s"AJ׭Au֘$Mցy;ujEPu@@T60C ?s bZ5R "x)cl*i$~Uge>2r]@N6]0=h2PxYpz*]&Gt А#er)u:pK 'L<'9!p|EPfvVOnkctCY ??;H/: ED.\dG+>7_`e:W00qK`4 ؂'QGd> HM-YIty$r( Z/ $_u_k),Y`ɹbbbZMh%'qD\V$i:≃`@"Fйg D~ ߇X$ce0AidHt6HVH $(zdZ,7Q:aMD#OUkڛ$iĬ`YF 4QMl@ 4nUi&.xDܢk1SII5(i$/暘;%"C]pV}…`N.?Ǹߗ@2%ttP8ɨ@6@Q @1Mo D40f"> xyl&6Nz'42n355\q6W2&搳[A5wSeLInVM$r@Fh"HBI Pgy>č㺤6‚2MDڵ(ΙpeCdcD0iL[y~K_zDG;꓇$cInj*+pi?1Cn LV-EwIO+ӱ_'0jy_%1Hp"lMIX֘և X\F $T;E A-i&ZnIɀ'xTI&u"ѶV%ΓsB^ZCkX]n` 1 (t$hQ"Ob7S]"7\sy<\f v#}oďxKG> wX8M8؟(\?pf*66)4EMD+eB+Dwz%HixQ2IR '$ȭE",TD('yR`Ȱ^:oMbᷥuN-;Fh4nFuH=ּзpۊ>pn,JӰ.)m q$ ljf$`;]&KFĠDHجH.$͐^HOzJ Tt1"&L@DFgًSa<*$?MĄ O+P"V"" R7 v-ʉ n6PzP7I+BDLsʉXS"-l샥o$ lfiCOE %5 #FH."IuH$( 'H&8]B)B'y@o@m S,"ye8LJ+4=6W4 .0dr9psj)EA45hoU+EH&~U0"4k D^3H2eh|U1,Ω 7 cd`+QDD{z,$:aj7IEWmw2}eh8m}"@G͜PO0m07+b 7 s#QAUWo D G* 6u2{Z gbêx'{:Nf6Q'>F6$w 7G0m;+H.?0[p M(4 ud75TPn"iEEϧ)5zUH2){?uLZ/TAl$ԠE^qἨR$/H(5?Qi6Α 'QR(Vp.+1I|OL׆3y|7n#N x6Ej8%T{e\TҞo-h$\vq;H@T?xkXy0zY-v[#n$/fps}Al dI1 AlMj4 mI1S"44ԓx bƢ(LeB3K-aMsKLi,:&@ 6 ToIQK^A/f"!Zh3PiI $;J5NfI"@sFyʌ'5 ZG 0I@t VoaAo|Ӹ@H0Q vH5NQ#TEM(0H,3?t@p!"w> ]賎֌Wi*v&n F댊A%!P檮ZW|'TTCX!ABb6 }s5kq4n@_֟xc8/?nin!ؓp9WK.|30p$_(KXh0 w&}Wޭq{Z@^s/3EMdV5IDLq:l &!Q.MAՏߺI"H/Zq I޷RCA Xx93]׺[{]sX1/3@$V;u,{5V7C E'׃1:Myqcb Ri{𿟜A HoUd.֗u3k8VH5  \4a mQ$p JdVB~>ő$ ͌!lD Ơ mDJ |\cO{ā[T6Ht ,$d:2k3aV`ZϲdE8!M9U@Q ,3# 㟐aoH5S 7A'$~P"Ebf%w$IMEw AG־*Ot40$RS'8Ax)w&yӨ7Cu?d8(qq L"n ۪A( Hf4yRGf%]WB—MִY€[{ L`V "Z>s@ jnA1uAcK[C].ly؁{u'-6t;I nEM@I+Qqn+B P iMG =OɅ'k*kS5>kCk(5t#ދxNkqAx$ SX!X-&Ť(:n+4& .j2U$j. l$Wu"r.k躴/Qߪ6Ĕ^Qi$4F>P$TM$oS+P+DJL (A1b30˵WXp,bHʞDW8wZos .&DH${2umXCCK6 @yf ""^A"R~q Zک DN@GPj ʉlIDico5jveĺ1RЊ h0HL*^)Z04Q]&U@70A&m@݈yPin#t-i$ғZ r5]3l1l5kj쎱:&6G*2n DL:*?T ĥ2/(R+N&TDqh$Vdjtgj(ȩHroVLPM /sT$E%'Kկ y&?"FqnA&*L.%E= 3GbnL;Q]jYhI4+xx/}Kk\_4 jB~ fNIc[ru-p̯F,|caƜHU7P~OPQiŷ@T{MS rcIyەZsexD[LitI fӚ)V@n{R~7U O`Tdq:v$Zi$mH0MBq Kh9HT"'wC5iL2Dȿ6VEdc-p w5#"M&u4j&$ʃ|3]t $Hiҭfdl&5rk$"SuUѣuLRhj7R_S஥Ο̿M ȕ DF3%-ziLdQSZD_[(@UV 8j2RA-@`@"HJ@!cc >&o,"a}"}e^&gD@5Oz m$Ȉ[8䶐 F7_0Y :`Q-kHp&l ʦM&R TU54D f+}.7솵DvQlH @VFXBٙ3pVtL0f%G=#ebZEDGirf3n_>Σv9p9v2xDT& YP$8fx"f(15MBQ+*eDԤ}R}t Idf(6.&VL`A *hi6*o*Өjm.(&ObV$&)铪\` 0濢Iȝ "0 &=L6"7iY,R#P"H(I싶p/ZِI*ZYK"@4AXF_eA/S5 &9-D s_Z%:^SM+[|p0`yq>s4ln lPG>jOڜedbUM:b-j*E 3l5OeZAN5HΖ' R6QMBEIUxPh;ˀNmDs#Dg'LjE+S30h-ƴ DH QV7\Xd79 LXwI5Y{#Qq3$ײ Z A2쫊KEfQ}EQʄ@R`G9ӀY %,:\܅.6TϲWv3d M'I.֊>1 s|"Ake@"fK&ED(LIq]$;,4FMNТu?EMl̋YqT4PH;EVHEn&"* ͞DI],IAmo'%Kh;';O͑x\q(h/'Lc,Mk|T&fTumt # /Z*;i""O1bIj+/r0WkL^vgtS ,؆ItScA]-1"B Ք;+T@uA-$V!%ګK DwA0 (|H" E{- 3bA4A@3xM (Ę&)I+-CJELf A4De+>$ NMr*t˜Z&y~c`a|Q+L?,ɋIA"^" r Gi0i%ކ^y79GbP~iw;i a@lR?U/.\JZ݈uGPCMu@$g $HY&⢔3U"_+|{n6TLjh] S{M"dwT%o"{B Ud |WMۚ)jIYhIKY-9T&"R $d(qvvV=@1uׇ>w!x;G`j8y XHֱɱF3ABeGe#x_Y=;ž3tεY2f=I|MoH_zwDnh()دk)BM`FR? FTr"*CFB&HlR Ai=$}5fPgI։IV  dԓ&TH"ZA!EDv[v^%`LAN54Ai;XLA5 ͧzLGf1z1ar8bExT&EOdF,O5̭۲ GSh j ĆbÄ2$_M` Q UM Nl@+0ED@qP:=CKsV 7W檤T+桧DPt5w;J%^)e}@ڻ#Ht|r26Dăy']7*7XMjo+`9!"@Rl#AP2Z+{B$̸얝D盢5jGu41 dH\Bd!Zk#a wdƓ=W]12#`I ERDnP5I\iS|&j(45wMnK]8Rd[yu!PL RNPA ›5(9Al&iSUiɦ񲆒P'I ]@,("2%N[cK(; 8fh&87jLX!WIIĈ@0qT@&*D@4KZtRlmId 'UY3̤.ցUh˜L`("'r! O@289L-:]/TPjm}!`Z0Hkf(a*S}$;DNAdjn"fTLj,TH#dPth>r ;I(5\عCG= N@!L4wIu=+*b* VILP NI6   iI*5Wg#f;8xlU + IAkVH$JhlD2LTdTD%DHtI}&&7P3ZuEѼ/ؾ83+2u4b v/+|Dyp4 p4*%lC~wE"e٢\I#iIU)i 'f[˸9lF3f?n ,vc?Kcdd 8rWi7F$(AXPpEo&𨣣ҫ8-hI9ZjLrT*|h9' ~0ipֵ"2<֝>ED ."V"Iߛ } {1K+D@F)n64GFyc6\||A< (dX &( Pjjqndmˆ&%$TA&YD}BJ#{%  h|"dBi(BDMIZ"$HOr"C"lDzwDIaDMH*$DIPP*{]F"l%v2Xeb4M#[~OTL&1#[_Y{t.#^e؂.?/--e4V4MA"I?I.:Xw|3h]L7\<;`_ s? 222ٜl6, I`tL/ʺ;c׌x$=T,H2VfIbb/ 3Sq4!7ZtO誖ӞA|}VO/E&mA$4m}@ M.v{sJT%I(LU6DjU8ӿ]uD'I,6@&K/x_)"A6Pg$Rd4@AM0w + 8򷍊b^$( إk1jе m|u_x '_pe07,$"@kL Do3O&k2I"o&h.m,D@Oc0Km=Y{^-GtmcpaT'_8bGD܀A]d?(kipUˌ0%qtޗDnESuH&͓¦H<?M V"!2y@0<\ Y0`4‡ָ4;)"o40<]0Vq 0H2I1 &/hf- b&p#dfo~[@"W<(D] dROma,jnM#h4ZBGz/oL_,LF@ !Ѩi; hH@hRڙZ=*L~& *k\Dy""$R2i i &Zk hj kJ{r?3|{\N$) 0S&)Z-th> Pt NsƾOa`b#+Js'_%ul7gIvYCfU-& u.lAgxyp@tR" bmt\Ciq閉q67&tᆗyo4&FYvT=&$N z-DAN9H @? Zd8#m;:i}+n c^CfH.64NTy(")Qӱ?)?QV"-{^Dn 8@|j]{]_^e1t<'.ޙ~O.kߘt54 dr9 3.h$T SsϔA82 TE#Ip!&bHH N@ %` qDD0hu?Pب IwP&mX)C0<)ҡ?ɤr ^Pҁ.j-] l{ZQpZ9Y  (W#\0Ϛf(LYd48St`PM=F%SI4&fkeL(H͔C )OKHd;yV뽐aG@]'0g &eokD2%q\HiH([I5gd4 2'Z "xK8"Ԭr6B\-kq"9 {'R 3y*i"&Al)B4I&nҰ%@GH1]&_Cqq̴+|ew1r9rn;q_V b;q:÷ 4:DRT^ j3ScdY2ԙ KK%D^A&|y3L$5#'n!-i{މVDͥNKgZ(.44ɬL#S*&鹝M/aAPMfTpQB=\ͼك-i9Ch-_` %4(O0j"MӤ7-4ߺӳ8(żu@U;DMdZDQ!ۚ urI\lq**;.A]Ņ-5& <>DkU6"CHDNR2DgD]ܗKq_˿b:Y6}DY@AzQNa KbOeiPAJͯCKd4+{~R+m/.dRiBɡ֋putUY1C<ÈPMEwAhd @4e!U-wRL(A$,3UHdҾmh{@!` v #T@3X%gPLLԸƭ` =}+9fE/80qp/Q~C|?~/K <1ރ?+|I+W{CZ>^!M_7oSEQhwQ8T1U:g&I"\D]s>Iy@uiD CIpj@ vH:\7kd ԈTݢzn`1U87UTSx! ǰZ΁4//x[™K;N&# =Ϡ~i]_xG&6i5?ē.MNlV? n2EG&˓91^֍  3A¤y+Hx5!d6 lQAPL2D"<+Pp(;$yl+Uu n64=Eg2DA,O8k0D #oUt:H=-5c TtQ"O $_JHtq⫓@4۲$LG$Z$({RDRt ]qO)$dPnUwȈ$`\ L]G80ہf̒`KI̒wD) khm^薚Lb}-AD$ޜEhU"Ҡh%MrD6h >2}&C1p1oJ}C lcKN Ad<7)6tْ8T:l$7'dh!?Z%b$UԤJ"ELGP[I`43Ye&!x7QNʪHtȨ! Gl4ɃmdC74  N5)tjG$V ׺ Hh3b$X,.ʮd$ (eOc-x9AE P#L$6&D=e!-qh%03V½_t ppIw^~6^[\.(STOA# &ii ƜnX*&L 84@ުVӲbeDVHe^⪊A'y +62>& v!j`B7[DB1#PӪ5B-M#De? 2\d׍-HHZ2"  &L) ըOKb% &2E B@qMN qQ'T利j5"p{*K Iu`i'i FepVihq|O+:ˍkfR.UCyZSbHTn`-4tWڤڂI ƒ hH/. -]ٓ1e}0+~li%}( $;fwH6V C+I̖f2&F-`U(j<(f~t@,d}6&A2D[NLH3nk+9) _ ;q\b8q3'r(hp.'L<aKLZ&DɒId1L {9esu^5'Sɞ$ $@j*dHm8Qj*!#r֦-5 P\I2Ozm*D~ %c쫋&4@`P&Ml^HH@?nb;幠5ZYrdgیaW: VT.5e$LHCjb1A6R3't0H"E:lZ#ҵCЎhwȀdIGA2Y CD-:@DMM8U?0<$ST'c<&h!ͽ9PmDiW  4>Rb:7F=~!k&u`;/Hk q"ߔ6A"" "8@&j;&‹$ylv m TtIL4n8@5VeƞT跄ߛdhXCbp3M!TCI5PL4U"+MⲊ6\Q?P* uld [Nei&ARF4 ւ˵M L  /cw hAh|J HtA"撃`&YQjDe:b s´ySф|`4fhIQk&P&T o~ܩ'` 8vrC3cvnPKMwdI"Gereq]%M8s5arfE_-spp `WB o)1YRf E\M5E1mT[I^hAquɕn3Hy/>tca yw<8[GDstr#A5JDP&]'ijkL fօmSH0")Aoe0]<]8OٸXyX)=@'jUiЀD[3⮯]/13O`O˻0^P *\?q/ٱlb}(;S\LQ--iKd&͇xti@^S%Zu zv'U,"&;ۆ M*O Au)h3:fMT$&=E\@&{Hp5;&+1Q>O0n9lΗG5pu_']x3 *`Qy~1w>%~p< Ax F5Yh;w< ԐE&ҝ"t80noS<֋VLLPb țD6: P*%RIppy{"^ 즈t rBrޏLc-LL\<"m&)/Շ-sM+ 8:隑5!dXEŨSOւE ejH "K0` ~7K"87tI5o^a$ڒ+Jt u*Fוm~TEN,]/%r<1؍ yOt/YOlo|M8p|vu6h4i;-3 1c B{H"u4kp|_^[pڞI5#I~Q KKK\&7l*y MGhtk*P:gPnRf[ ߄ DMQ65(X-H$~"I.! ֱLB7Y"(@' 4 Z@ l+@L @(8R)r92  dQ塈MU$fУ *Fި#`tMMkˑ"auXIi3۔Hq(tKwsCoqL{uT8ao@i,;wa rpXC @5Aȩ@,tY*~SY,2 H#kL8}bEEM5FTllWϹ90R $JN궛Ud$<$yDa"$`@@PY2Po56`dݳVIĹڈSMZy@Z D cH n2x@ȡ\qiEi`T(}Fzʛv 1UutNvw+ViÑ7]+dz  쨥*y~ l҉-kQm+&QnP4$!F@hl*cjGzѲjePl1tjA>ZwDWLHv@j_tbk:m{_ꖒ; _o3Ϛ~^!-6p EЀKAp'u27?Y 6Ѥ`oUș@[҆kTWkƓY"*pM;L(zNײ``=lJ7}W_NֳK%[&õWLkhL L(NUt Dy{IqWjwQHUơC5PIL86wGF"AP&5T$MDR7NLM$wS#I訇[$A\+Z[[$i"SM'H %h#EPRNgZ$ 2kTa?T4I1uo01͂$T{/ÍMg6Qr!p/ ը0i@$Q"\)Ȃ@&ᵍ3fj DEK[$7I$QsR G{&fAjD@O*$j$zz ©7׿H ?Ѥ51TAE4z(yoZ"n{J 4TG4H8}MP*m `7ڋF\(CM@P ?i  @7t 4 4HExPޕ3~ʹ<5TLȲE"䂂JY'PӪ@}lLXrP ;XJH ">Ү$(*)(\ة;+H7$$C5ߖƖbus7sPPl^Af̠Q! 'Yp0Ssƈ;h$dV(v ^n i ."*#Ik|hAKpK&OdJ tHldtBCI0f(Mt5i߶hCEUפ 5m5-@UdT U"~x{xƙl:zGOxq8Ni v#7Ž#t_沝,ihh& M ;YT1~eDG*LHۈTi6@$kspZ-+-/ivQ>S (i'Ak>' `Zy#aE;^^)kդڿ1"kY$)0Nabe_7SD}PLdU5 1"AҴK 'EHKyMyګZb%DH^"K[  Ee (i )$q9H.&պGZ,鹌\0 L7#6sٌR.+M@_H$yk<*`cFOHtJEiT`ͩeHn.A F$HmTkaAf4pF.W $X\1J_gs!t9]y$^Zk?]|2X`_")B H&H'jL)VLI `v .(&5t6JGD]4?bϪ-k2- s&$^Kz1?cCKO y|ߎ/ &(` ao'<i}ӲNhՆ D:Edjt\8mBvHA=L]5^+A5 kIiFZF_Eijt_ʅ`VbfQH$͒-H;SdU Z4S Z&&RۚP?E3$z(qkPT(&&7K)@q7-VV:[_Qt5yDH2 /‡ H*o@{]$X*hV 5-qMZ\zvT.N`agY8M>l>{+ceqد 7nt캒&g*@o#`)L8D HHnJ\Ob4ީq *"{M7I깇2$wU@ 6&Il2c:8xa\FM >Y]VI5;/H~Ct lk59\=#_4zT) ݓSTN]j0IP>O[`iit-a5ӊ(rBbaj u.NW|3ԇ ~2'yE5&tZSH2i Nbk$LoH>K膖NNi+\WWzn@PUCs#}%EW&_?Uf^U/S9\_?~6[5t4l;/*H4#N*7Ay"ko)sy,Ger Z 9Z}6?!,$Tpun">{(dޤR.dHdەIGap+AP)xQh "OiY0YV´fDhV qe*@#Z%7S}7Yte3@XAeÕ7Wȷu<|60yoav鶄8_dkȧfD7  b2c `yD @~SH~$idQ1H4U $IjA/$,)y@2d1Dt LP˳{qui7]h`Di7SM#\$"EڌU'HdDB6N{(i(aQbI$PIRTy[~!{|Ę,4ɨQ0dC7W@qXT {I IΝ.$} X@eSPiv$?EH%mƒddDNL Z@A³@"5@wI'~MHuLPV$ ̸*걩cBEH?u'gy[ pXI3PJ G0Cfs,Ho)3hI\ۅ4KIu$B@I1[(0nRnt"p%3 o$:I@R@l:<l=#4f?EL ~ms q6Yqs72Q옹Q0ӿ#b*&ejgxlm}X I#-j #E huzʌIu`Rs鹜`a c|{KHw왆4]kƫ$ 8282R^[tֵؿչ[oyz)AEILQnئ-0q!?Zo>L궢 @i $@@bXq畒\ ie&7(4d!rb"q@0dI0 ;{I~˟b}I] 庇X888x,'͆:OG7|#Ѿg/9l˱p02Bk&uq7lߗd4;.sbCV6 ,vA@~ 2Hn0mKF GwE4ǧ UkPD$P@!DP*QM8^a<1̻,qnp=a3u< k 8|g f:u, G) ކ*Ʊ$&L oYDp U抏`uT-#cŕ6 I:dROd6rZlق[ 0=.]Fp[@8@6PWJY^'@ 7陿Yq< \pYb $ÂͫOH$Ef$͕@v@MUIH߄'zQN9I.2B$+"Vx3B6P0'e7ՠI0R13 EEA&$7LV;X(ɛhe^)A`P}u #h1CZHq"T.D{4L׋ H2#x6!+sI jBM$'t$8NEIGh@ D4I"bk:Lpgh&QDKK$ PBE4@dic$r0uh~Rd$!BHZD6 7QđaE"}-.Ӏ$ tHr A&b(Dzyh D*)~p>h ͠l:j[&i5N?+16 c5'#uMF=T kO琴>;C:^(氱,@aX׼7Q6]M͜l2 C˪k#~VVԉDV *۰_ָn+ $}otHZ-' 4;0\jw~pOQpw`4ٜ2[; 3yLVa3 q!\<4(>Q4QRM{;wp o]γ)6eô :u =A֥7i €$ [ JD(tEDuYZf#0;_ߊ ĚT& B.akjBƑʤ'S#9Mc#2@ k 4=RNTbI.:Kbk$ZDIJ.e im'(R} U dΪ,a@ ?0G`o $ԃZ|dD<tRm<CK.7j dM$6@:֊&%h)dIaQ-$2 6SdZiJ(2LӋh;Vh 2AnJH{̏E54r5y ˚ AleFMa@^mUE); G"' QM ? [}:'^L|xn&;MF/nBd4b+CI>(ӱ xMhF!հJPY#Uv)(;UQ揥 "}}06ffI>_( 77WT~/AӤDL@JHthԐKT(f*@)E 򷃗ne!u^L aswi\|Q׻ <6(шk (bas5rΖH isXwcIT6b"{KK@u]+,ò4'ی"h )ĒU=He@v.i=`zp`fDp@1 =!ē2B(D zH& bw $ RvDP Lt= dgLT$dfB6It 'xI\n`"H2i^h@bAfLaNDoG7H?-ia(;9hz]GýEfN.&7kRPu6o1e.s^}LI؏ʮkɢ۞꣛$Dmʦ ׀f-FHۅAO6ry.7cb ׌:\f汰X<~!!uI@BZg Px E$ F%LDl 8E@VM$FР%H 2fedODzHl>&L \A17_F/F1O:@~ɊK0,ERKE~򦰖X82"0f63@VAPpU"M@ crO*wVEDz.jѲs .-\fDMQ 1ʩC !MĂOejYVhƠL ? -zUfz P odvq1@_Š$Q`iJ-qߕcIY$7"Ouѽ 1vD㛩!U(dʁ)PDz:N}8A .'rF? ut&`RK_$ @:D}ʂ\Ϡn4i{NB7Qqyi C4  Y11EϓiIӷqbbf `N\uLV"MgK`T&ޫ-8=sciS@F;(ײԐDRG%o$wM4$?Z( ZFÄk nfڦ"AfIbo%vk4 $'~ |6F7PfpK010׆ ul547U Du"f8AiPt=EA4$(`D)*&ݿd/; i< լ* F?c_\Ap#C|$= $v"Ku(f{$^/IH>Q6㰃b'pwUD4T*J Tj,{J3ƗyDr|&7BAt Ne Ljdbf$P ܡ .FQN;=w=\NJ2ftAMbZMu:K@Z`L 2bܭ@$J*Mo3ƒu4.P^%?0n = [ؠ0&!M2%FTDjLE$֖+H1d@7A-&<)hZW,{n|VMXDf֕#rѨ VL@dH 9UAAQ}Sl#Ԥ, ]BTR4D緺`At`ܩܚ~>ax){E<5_:(gֳ?]g;-y]E>˷b~^Qao 'd8TD~ք7֘ K0{H%qH5 L(=l6Zld]#V)5zJ"WsDIc y"y$d2 cI <Dž3A&i Yd&Q n] p""% (:g0\]ڼH;Y{!.+Ѐf`'H( 44VizYjB1ujU44᱈)DmtIS:;$,ք!^BbMcU&O;i{#tAfyUC|vI,)<~Gk<$ F&?e0G lMhAQ ۠;*4 #2$PZ$Jˌ}7ʠWX 4mU_ ukƝu|.]Xxnhvmq2,?Λk1rg'{˰KhnWrf} uuZ%{5@$6 e9K..$p*iAGHK*v)[ T˙a `. hC&?@CMDI!-~p,;rtXk$!I&wpLL#T$Ħq+l8iKAk&tQ-X\-a9S n &>g3_v+r%pPO+^$Hlޱ>g>gF>P/!d A5_"lG(G!@wiQiPRn.8ظk,-3ayQ#/H;0hLoeOmreva`5ؘkEIY~356;"f]AQ&@~q!*f)Y&:X/:-v2bBdf`dzD-A5麃di"4&"۪|HDi R% ^#.1jk_Fb;ʛQ{«A‰nAUdo$  IJbM[-F+ LE|O( &y\򘘙M!'Q] @54 GZcDNԢKwL LRK\=u.?2]6XfF氠u:OPNf 56~F$iUz *dOt E tȁ^Y hđߕ'Yl2'LWO[i02}G=?b5wNPN? A"$S 3NtP[ L4Ɉ*4="@&F id"iS[<.\/1\sS=EB]3"݅Td"&ltz*hdO-_2`ЊRjf6mK@G\CI"|[o b>12LRK&- \;1\D̝$ׂ\&0wzd'I&LӠ}j~_ > EkQr3Np ]%Ax1S; H )+xSu TaP׈d8tPԒ&uM"=8IT+P?*!{ #Ts|MqAZTO"A)xY$A"cx jt6ݖ;Dk0bN):@nbƂ0h-P@)&$EOt4ҽA?HygA#p 6NȂ#̈zjJfGTňUn)>`&P)+VQyD.}wnҼEnA?!MVW|xg<+2iϘqpfGPBˤIۺ\CKcjMT>nN(l&.r8XwhH0k\d7TpM}y!d4A1) hɲ,;-5Ptt8Iu]#5zG">#p~L/gCҺ`px{`_.vL&>p"@6Yb)œ`0jɭ$wQH)Pd&i~_P X-PSZU?Ï~#3dٍp~q2Ya8  r}!F۲hiYDjRiWV(`>8mDdIPЋ4!zgȒEPq:,HiAhsH ԴGZNQ.""44S~S~TDQUDms@$z%-A.ڧrfrӑ}N\56*uSvK6ztڗ vf*Ȫ -CHP8 !I (M jz(;̯ŸxۢV6k/nG=GO7柁~#MZW[x^U}|DxY #j L¿%W7aKM]hU x'ɐdhH:S66(8H"YE mqn#5 Ox=C3`-1fռ=Ժ8=K'󛭅mr5A^c&&3@nM.:+TĘ ,"U’ 0RD/7P i=ʵuvH[Sj,^/%$5J A H~-YbQ?/n.I55쯨I|" q>(So]!Hdi#L[iAd/"EK\ѳZ xM4(7$ ,&",)"G㪱\A+,cug\yc3,~ 㤞tL^ajgB;Q!2 {.=TzG"Ecӌq t4'i5 3E 6*sD7Iڪ2YrT[Hl;G* Dm 3-e7L "iz즒ov"ˀж khqq a"BrmEMM@$4򷅀ovba b<Fԁ1JGhd tvImL0`po-M>AKl?-N HhkiTH27H$L ?CD辛}y,W'-ߘ!|;vkryN`a?91I3EId +Ub$eE/A ޒgf˶FbM+e 2 Dw 'o-0iK@P5$kLs` 8T@ޑ4(` 5Z0&/~zfk;:Fs;6&xޤ X1_bC`꧱\Q6[8di4E3P:aAՋ<*cjqR&Zc$4"i6"ߕ ~(>n3p`K\ `eK|Py0X8-1Z|D@iTɃVWxhV, #[gpi;/Ӻdgce3Mi-ylmc+jA'E0.}I^5j2FOD&>"G*X) H4Vkkڡ$t=bHRX(A5N KI*lyZt8={.m`=@ j;5d j`@4"'pP5wF=Ay>kzP.JYd🋋@c $.|%<+kxf>aBpt'd"DLG]FFVy̙Rd lY6S3gI%.uIY57Hiڈu pHrt`˓&AjaY/d<;6i)k@X{Qf M eMdMb&H5S.!7J,R bhG?ʬ&I,Pt~v39 &e B?"@U$G¦O,ׄeq qw^ z@PI7MIAVJÉ:=䉂HbFn cbD[d 5i~ܬCԕ8CꆁBmSA{Z&l7IG AB源c44DeSH1+.2 i'tu?v0r? P c1b+/psXxhs pj#3xh>Z~qyt̚l+I% DÃguɁ, 7<٭O1p0q"!bextd3-o5ggwEV )QQ "Aj-AR9<6k3q#`gqA+И2"V8.i"@l3A2BMz)e@"hÛG;(7$E*BLm=[Hح Ibh@ M[142N ;X6b6HthO]b+c,['\lW5lΰC긙.pݥx-sOpW@Chas`KA';Y11q00Y5_'9lb@["ˍFEEza\!5zO")2DPCfKS-7K|z ɣ am!!P &F`; qP]PdPXUhEޏ9̶q?Hs}9̳-Q >sTLIbsURd}O2l>j &AT ϱ@>UD*$iS <&AƇm&o(B $MsH$ Qq{̭u*p<$FqWI(ֺSN4d, EDtG@RQ2`̞ALȎTiAGDﺎ+K!}FL>eXXcq6^..&oՉRjIq>X4n d*3Qw\+ֵ> di9(l;+S ? 9p 8r;6Oڊ4mrTI$Oaꈂf;W"$O7DA1xPn@=ժ$eynb0ѵlP,dj fwQ1Vl6VEUnCI6+7JJWA5Dz8LĉYu E9 &N@/ؘ$DRh@FNSԧL:o^JČpZ`h.8}>:x^rG:pY CE wq3Gbbb8$&bN?4L൸A횅NP)P@[..dAu( L}hP(J=lj@m_'S˵\$GM#$R$yǍ]7af5>~C,xS]:rlיd6mL;0;--2*_OaL.30[t>n M @Z8Oh7@$6'VKn]/%bbʈn DM֛qy vFƋ4`?t$ 'S+kJX- PHPnSdݒ 2 j.Ћ "$egL@2E@r@~TiM4ɁHM6;#Iw4;J] ".N..X.G -IqA4~*/2dI 1+ZdƓE@:!W5 6yQi29LI=~A'sS4CLO7PSWLp˧H%.Ai}׻t\\ikL8k>go=L  #;@wmDUuĉPQy dKh^o¸Tgn#~NW=YmIhfZ҆ H;lQa[B+>`}btI<-[1KˏHQi$G M*R:C@MGrA :0ir\Dn`"6KHu@E9_ux?x`@dz^v1&6Gy̷d჌᤽BG O Z@1 6\أC8Z4"/c+Qt׻ $ƿ>D:'AxCFgn{5zBi @H54~jAŗ.YsqU3sSU 胆KoJ́ s$/Cf݇a 7OY L2 B6^V?rV E6Zke  O~eˠؑ"&^t,ۚc0(D_Y]Wn͙qsDzqE ַH!Բww }lDf(N&Apy]JE-ܨITMP`썅DyZ mjIlp\7bDfxW l"qTtNiK.W-v60sDgQu\փE_ݠ}&!# oha LXI5S[@h'Eh# :Aizʁ$Cii ]h%(=;"&PE艙) l҆7ET"$*}$vkT#d@S !BME>@>c?CR෋wWc3,H"}DϏ?<;zKs^'9ZUz Q.iwXQj|/r7,A.+&n2E `ssSPHu 0`Yy纀t4!y5P#STipFhLDF VsuyN<[-\df5Z`@{)$D`ݢ [!U0bjF2x gI9\[s1ʠH_T6dL`(BQ0&@(0?I@ޖ_Xn- LA]C-P1V"THYJ3 OZ&Q#IEOh,S" S::AH=Am$D"ޫ/'.0˄A-5m1I"O 2p;& cIca9Yd>-AmI5ܨ%-MO73 @@nMe@@"~ˏ  kShP 0("jA5Q` M*Kx5fCk&?utATdj)4A'$ "x[v0iLkulZ̜{;t nopm XA0 k#%^!:*s\%1b-O" 8Ap&N0Zf}LԡI-J(;M睑jYG )1<0KIoC긙p\X,VZhjfmB&}j@ުiR#jfpI5P28&JNWV0]"` sgq3YN.#q7Z ғd $&`<@Dz* .; jU"oHAދo [X ?G=W_[WOn_ Ӎ ?R;#z$6Ia̓f)" v7LwE$; QP]I$\4ML/q Yqy>KM4hy_ |;߁R|e:_+dgh_! ykdTV{,Ζ%$P (7aZЙڛc@=Kn$HOt-*i<'OMoE E.3_5.FP{WOre,wp A$+AJ3 :_t,U  o28W⑨ AE $JӲ9=ObOx|3frx91j-; u/o`1I19`J ~hHjyY12M˾P.jA=)xTE'.E+$\4SFXr3C.s] z'iT]q6 Z+ZVX(R+h}K?Ҿ'z{εuַ.To|3L?g19T :d^?\aPTt x,,ap+\D. v|Rָ86\dϺ( +J@>`9Q 4Dyj&7 6LK+<œH%ZuT:Ȃ"OA|&`6d@b}SZ"f"{(# vװNǐ_+abH;TY{GrB`HbcO~P*IS&*HNq$b7*ɤ +uO|-# :AB/#EǦ{ndj'h8Am̓;l'TI#T}U@L_ʍ 9z [)stXQ:E6G8XXI s^\w+-3&=fe+iu$kQp-3U Q%`α^u1nOn[8!XݨAAeGo0 ; o-41f^:&g#$c3&("O;eoʄIA:D M?)ڀara?xR_E⿇~!vW)׺{`l-x_0華E \fT q|H<63c(-m2 ^(+&F-Q;VۈDIV5X#0j*o d Hy@o"M)*[®ZA!Ó $}.䟪6M-l* bJ;ujif{}_tSps\.|zzI[FcpHP"W殈:gmjccE P"iq6KX˗7R!p-RIދfd0pG [RoAU64%@A5.3  5l:i 4" Qj$K b^q?y0h/66 57d@U$4IE8`wQ{"OT xZ. 5f $";XŬ }~ 8=Al8I.#Ae}^A/N1yp?`tI_g}/,SXY>^5r ?+ߍ~ Tyua`fXP'ma |LQuql,S}ae=dnv'WZV*MNdS/* Mll A+eZj /:f&fG{ k 1Xk6Twcă)pp`cϑph@9~dr9|~[ćdӇpi \bڿJ9 ȓ kIʼ#aK0M**,Z01e`sz6.6\6\` aڤVIB+Qu 33d #$ZIrdYaqQ]b:i4hvU4"b*T@qyl 6 $ x']w?/\,@DCQCQ5_"EixHT:fH *j(T CeLdNM #~UaKh uctlS/hxqlᱥ@4R ?xxDq*MN:dMCy( 8Ii"A1]f?0N$Oey10mTˤ#MDi$PDH LZT$8#ҸwQNF̚B[oZK^˲28˜X%oy l@.p?p"dҼ3Jpkڊ*NI@`{"4IB}A.@XK3DɺY\@l\| 8i[v# NȐBFM(,=BCZy+Xl/$  AV[5#`ވ'k4oĸ9څs<(8DNkvP4#Iʈ t ѽ&bEM!R@ .| 5ʡ*Fo0Y-4ފxhid4Uz=9'6I(кdj˟Mi:|ʹ,3\`]H M? ~g>%\\\IӆѼ-| g<,S3?#|D DF0M ""@Q.;B4֚֝ZG+<tDOPM+ni ;z嘺J4pDQvq5QD)>xpubBhZ`{򙈰ZBKu3I9\at0L~aDA6؎B:AyDSB7S@5} ?}&bLk F0و~Chܮ2t؉PPAT Ϭ9AL9YqFML;"(A>>Z$eg(Gh6\8~!v#ܮ"k~.11(-u vTj/kN٤͋U"dQLߙY0{KOEa7=awe]kէTS7*>Xw#`B֢n kkF"j*Cdn~ZX0n.*I:CeEv|>TVҨbm` +i(Id6)k%@s i.&D]$*.vO$&$a5 Mp2CLV݉0#5rRj  [-v3w1 ڿw_5@em fO C5DidOiQ^1ATium"ENx*h1+6D'`v)$FlHTkAMij8f@YKH Ma.lG.Gb1/S I"Pjf*yoB N.i4ȀI 2P?z@- ]3qA4*pɭ$H~ [v.+qxxcdsWa';p nMj6SIH}w':٬YfrՅ_xn)k` ˎJGӽ?%DО0&pa0}.T*(TpE"<*j|l$H3;<M)*g)"<(Ip rq4{Z.N.#Njt \ISmsY$$`.ըV[B"SA#mSHj(*6ceˀF#q ?'5u?|6r dxr]+8(qh4T&ֿ%D6 RhH;@(E3i]X1Gb 8D4Pjw ԋD7dV@ II H.1Ĩ(ln)N 6Q ( D>b8D8E.W}P4$ɘ o*:k$TcVsbnQ|BTx(7ꋓ u]#b;53eE>h1+D4.dv&R)]S)$Y@ɛ́:1wPCHeF ;ȠK2̶.\ЂҺ!@Y^8u&ǎ0~T[@E0a\,2\A"8|Dc3sNq]b,7?fQa0 |[]H4yQ@I:Q &㲏U tjMkuCi@6;Zi5쨬ni<@DVղ ku8ۚ+P$^N_X9|M;tb b=ڍɿt鎜3Jq83ܸ#GqG>A]}|3p#Y.mD"M\(ʁ;t+I*Px?K$s[v30gxX  `j-y@ M7>hz%]@7f4LM,RǺg͔*8ʜLn/r{ARN4[ $9*hK@LOBni&X yF PT}A"dH#h&(4 ؑ[i;Z72[&7'ޔI hkqzbun̮nWFK; f0aц v:7Lg;Iw_6斾دwB_`abb1/$5A$ğgψN× XxNF٬zWRՕ~Wڻ*4Ђ`£P Lc\^HnT:i2{I* =^%Q G`4Nبc(T}U\AFl>bˏ5ÛIdКqAkEx?axsř.gn)cYTEfWƞ(ulG,C'"mL]|6$B=9@gzet48j#IB> HऀIL#K\bDu|܋QUu-ꦀ֘3]Q-hګlq7B |Geb8b0É|ߍߖ'Ӳ.n:j&~:I&t(dFD…hؒIx[Oz-H;KH(Ш$4JA-s~ʉ%u_E·qè}N LL^(.=>Xt?fZ,$$7Z %T6ƚ!ӱ`a'USWw]3,]YC!~}4AqdZYK*ئߪI { D ",Pm.s\xi#8X_53?H_Pn:7\ٗg0F0+IhUc o UA2; ȉ<8^7ߍO~)A"0l{,n9Q@RZ0d{Y@(DPd=5@"t`nU?S`&hS(h _IICI{$ Y,mLfiR4Ԕ8@nV wʀ  a۲&o  Oa n0ܯw'Q؟E$."u4ɥ#yP w;}8(@iQ:y2hcZM˽a[*}Pi?P o.Rrabh vXJ h 1l40aFAG 'AP8b}HdeИ4`,ځd)C@i$Gd:"AzV~T]呧F}fh j)5Hl²D^SoE,zVU4<8iTi$z 9:AV&92EE T`7K۠#"$Pjkx{n^U?Q;K_:]ou]c;9 \B:X ^;Zh F6KU@_@gET.wI0<{P")(&S|Hm%i$7nт""7X alvHo bN`2O+zGF{x35_x_u8PğY7( ,vZcƹě |R1ZAĐ+@(~GtmODy7U;dSڿHvu-U'; ژtY+@-ƺT@BLXpp݉$Q~?GLB>"WOIoqqxɈyx;|1Oa>< \NFqG#L?IV+ʞN.#:@Gi=KiT.o Cu&  Q)?+A }?KۺvI@^bhV 3yIuv3gA.#/.mDfU@-Jh;>h5'ɬrڋBP` 4I6 s}%tЃYCMLQh)5Lc@Iz&lh^@Ii wT(+)HPRLry 5^$DB $鈡jKʙ Ya+RE$,P& N$$³@t(cӎm64A.C 68 ΋zp;.Z ŌI1<C@1~"En $ 7!>@"$s7C]TOd AMLT&/D82Km1APahn̙<|d"hUL͉;#eH3&&JFbIB ԑPC;$DWA4@H1KHP_+hIw2cZq᪢G":*n!e:8eqZLS}_^?RSx=_ᙈ% ~h0ŸK옂j"lw tݑhyL6Z@hp0O&Hl%ah{:+cCoI$ ; Qi&7JA@}ɉ'ἇ bT6S$ފq"RL@0ִPF&uVr$޾6A5SM 3Z˳Ӻ~?QergdN&zPU_-a8x Nm^ǼJ6;뷇nC18<ց:j&&i>AmZ\ܞꝢgHeێ%%0d($ 5M5Νm]̦L>c+tFu @ ^"ު1#걥&ժKl}4E=nCiI*$T+duHit_14_m~Η,cX/ H_>11GW4=+>x0y|1; 2{ɶliWuO .SZ;Q22bi-ppPCɨ|ˆEc&3njDI$hMe3VhѤmqqKy oa 5hX$ץ`@*k661&f{ I=Uk\H-ZiI060d58MҢ%@;W,hz2n>dupCYӎZ [ο/sG uH]r H"(IXP3Qc*pDOuAz(F{Oi+UQs7x.cԒA1Aq&=qFc;S>&MmS5MawOWc+f'Xy]wq ܪcCZL08FT wu77:>Sr,Yb}i_#3g1sXcK̐O $j3KIC<@LVAkI3'|T2}AYtU@p"EnW{03ٸa#u^&\e\^#*t̶Cu\g-hXn4I.Ld LzA))HO1H2G7\Kb@Tr&Q [ Ri y9vؚY.3 MAZj? &JZ Lw+fsLCF)sz~GN܃Y>Xoy/3#uԟ7ffeo-+p&M֑YIT+K Mج(Ve JYdКԒBp 8Wu|6g^a{Ȃ]&WE3{(:w@}-uf@iP;E" (j!NxidA*-0VCqYY$hwP0jI],6> !S p F}P nTs.+(EE"{-Hn7576 ./|̎nf҉&fT_-X]`*O)=]fIMhY _/n.g*Y1+p9c[ .iyk]^@YMxe-'sMi1 ш|3 UB&V0#KuV,'UiBI1kUdyCOs l7hFұI&ؑpȠiqeh)UA )E=1.;B4H46Pw]s_yW7V9`x/Cj d30DT @= S{m^R lP}wZJ΢$\J%L5PUɕ01&ޫֺ9Ö0vW'@I5\ŧiH4Q0h wॎNG7+nih&joXh.L&; je`:H7[% f`Z$rLr,,oZ1 \Rx$0jdbfP5LqY~SGfg=t]~\A )oE=N]~.=· 4ԅ!'jIS@-@TRR`}0M$DV(f*nR 6 tLEVjj I3T4 zW|MOSH/"$FZd$PMHddfUHIS[ V#B "EJL8b,H]RfK?`t F&+&$.5A [A(@(Ge!HOaE$dڐK@"ZNCd /tZ${MisMk@vr cAg\`AKD(A QI'Iɸ*Hw7Q]@ꥆꖓ8KG1DKEeZS3f6켼@ MWK⿫c7Qn;/Yr~~Di_%~W6c14ieMHxܠAjʆ%g֫SE@5 \t4|]ݚf4b b q+_uWܟA%8Ւ,1O6TA-0kI#I3TwHst_ xkx-``^W41 wKoN=y(t7No_8Ƃ   6_)їc'X%hv^\gNk fvy;1ʂ u{]r#X|u|kuāS^QM¶"~"DDحy7 q phVi:&OB hNmu2MQ%IM MV&A q4 ECd nȖ Qm#֓eII W\s_Rj@q ҩlY1  T$R$U8ɯ7A4( :nA>%@o-L krؽ /guEy;Aa |?? ?#YL7@:d_~q:.oؘ؎.q&jLS.7^z{!յ"Ё""&澟$A@uDܭV.DALCMiZƆ P$ef&g14q,Zfp;LRDiSF%@GL" ҩhh1ڎ )dN$|7 UzШHVFɯzAEa 'q&WN ` +*FȢ֦.uXvKA-=ߪFzE$nV Vo4d߲f6t&`ɓ[pp2g}0AڶTQ 5TuDM iw3d;9"E "D5SQ"E"L A)io*"$CAA$ڄk`X(5"nV4SR\ &\xؘUc& .'1ɪh'c<(LMHR.MVI*57-2xKjIJˌ78RCbiunjq 4YkA/3XcL8g3نi&YPx |S2~i`5o `0z>K|^F#\&>[Iߔiqt8M{4FDƒr+'x7I7uj{¤hlTjDU!DC`5gy@-"DYonOCA g3p[13Ufۢ@4l&M7XfFMs1ppñ_:WNS*0E?*5ܢldfj%UҖQz93L C.+425"ʀ& yGn @)0M, ;cetQBw" lAI 4Q0$Oz(k]?1 L=ֈ@YFENXb"} 7UA$"2/;#gH' u@wH%7HڃcQr 0v:~h35K/Cp~O/Mע"r'^N\qK{q  { fG`=2p_X> ~+~tٖ`hMW8KAV/A< ̒l'~`KoeSMخ7KO-4- ;$I'Zù15Z {-.l{.!Glk1A'kł1!0vE WegO纎gOZrSy_=-.;,4K=H. 4QDp ꨗD)Z(Fy4ȘDS_UFA" ,(P 8]R  ME $ڗNlk}.:YY-8Zqh1@7E54l6["fl7]_ v&6jh _VH#nꓶC6h;VKii6 9KZIj-W$L2J|ďJq4'PM5h=ʉhA&U3ASšA&Ilb7xyK-'"m*sA1 (Amha"(T$}@IT kD4#h9u)`u? kLPoQ[rY~ >$gQ&@TyEmEC妦½C.հGӱyl̞.&d9ܾ&tj8N?Q 2ַ7b yYvtI᰽᭙={tlI̷ <ц0:5q!t~0:jM V 9@:$ ɢvN ꪚCu7\t62b/x y @0`5*F j*gzJe9f3V?>+ s^y*`pU4 5r\ c*@D7K@@ܨE+j@rO,%7NB+D6{H!,%@ $rjvMIud ɏ4VxVG>杗& g>hv:&K3ab7 j V˥"~*4=O0"|;aMwQ0oZR4f&Q2 op$Cf&(GbxYZt_u>X/$ȰpӪA?,#H1"}j. j4&$} 4@a 6$ϢE ^dž*6O٬#p<\t{ߡ`F+4iiX8BE6ZV(@{ LWuPME~Et4B@R@dwd4 Uw]O"h8eZbѺA;s qf iHD@h6@E$bj-)/3DžixL_U -ƒn/­j6\9ve_qZ,j@?'uA`5VC<rꡤM bJiQ Hӽn2oIPN0h=TGշeA `@<" )S}lAX tΥzw$:EA]uy_a_ A1Aa1TÏl ;ʋc:H>#L SVArLM]Ee2c1VtH-DvH$EeXf\ t͓1h O`nQIEA"+T &c$֐v:{0xƹ,p֘!otaaĆ] a68A kLV(18$` $TI$W oa[(BnN) OE" 5Y(`M"A ڴPINf $*H c R&D"d QvC$#-Xgbo2qqiU&@C4f<³_.&FĄ8R]&*VMNQ4ePI;$VoXK^X&jܨT@E)n{ƙ&]l\/|gNncAHf0 HWWy8sMZ۱$ra3Kt0`D &]jUA e -J(r=ʄ 4odjNMu(O; ȥ#Lɨ%@|< ԡDSIeV:r2\LF%d9LGn>Q&T C;$d\ʵ 0)EAJ{*\Di;L@+C{Q"ժRˁq\\cQ T{Jbw0͇1x d ĐMv\aq4Hhiɀ ˹Z$VdcbM- :[@H] .MFl8`RXᇖ&Jdʤ5H+Osq l Ay &A @{EA"̓JeYcyilq]Wfu@Fgr3N$X%Ȩ<`@a%`na4&&7LJ~~UbVCB@DiݾuM%fA; ƛlڑG$dR6S!.iiz9{-Cߑicx^LobXY>@-nh47&THt1y& ko9s:jie H*J[ 0h/p@uL6:3M̪yDΓB+ .d?sXݶ]RM  p 09GzT $/v9-iyH5n+ .MxiK@q߼Z)oL@"@3Drw5HD}4$~_1ܤBud E];ֳ?t.cIpf@c``c; kb ߺYWÝKI^ M7 ҹcHlq010ifG 6P$F E.ppu@ lVl<N]̱v|.o*'O@3B cc;@LePDMȊ V1y5DIVۄfA*2At@ ަ?[WIACe px_z$8@6TI,^Tp$RXZ lA0I]D<~T~)w+@yC'J1<{71 u8W~|WLLf)n+.5hMs9egq_~YFxGXxM~! ӡۏ.,>5H6AH ;ۥChy@`7UF3A?&1L 6u~IchE/ u^t--&LxONY OI@quȿ?]MQщ D" 1T)PhFPRT (U y U9Lq(yB}n2dA,ICd23lب1=֚âu  .t%ĶVey:Hq3!G`6T[_M0I#3/{ U!@J$چ)v378}C>mS+@.$4rP\I νR>ҠAA311tC t:NH?Tj7.cچe T Muv(U? 0>(L[99,, /c59@$r|K0|D=C/8&&'b65|4F1$hCML{ˆA-H'K_|:ZXf0B3GR=೨?'_*x\/daWB|J-/wPw%VOfo8z & Z/e1Xi ƲwFlL"ZHyL@.!GH1"e},#{REM=]T7۲كJA䆓KdR'QqG>U$dHHlOH[ ;'qEd1ߔ&N #7*@c &OkCF< t AT_AUP1@WA7 "vktq8- i +d40Tǔ-7؍A`2%q(.']7 -8 5(TG4KwaE7 㒽>evo7L378oP|LV`84`&o:_Pݫs=h u3EDo{j"(u^B ]K$l@_t@"l B"bl&OgtڳIU "Ml8Ia(=?q 5v6ѣ~k[*͔>)c\9|l' õdE2&&NS1Ʌb5sH,c?sgs^Y1JST*I1(2D)B0h\~`g.F%vo2,*84w_ȌƦFaaq v!%~Ebe1_Ḃ AIʅt,YāedMiTQ½QbuM/_u@]&޵uYP3X H,bh?$˽陌cIi캘.ykdr'fLt K%9 v&t|O,ou.պg3:q\W3<@+ƃA rc`1\!vZkGG -+3 dЋ(IN)yi#U}U2LmQK9 7ʨ۽vSgUL8&. 8#[:1ENshDC|ڽ&&6&( s!qfA*ZYnI+Lh{LJ̷O!qE9դԂ7Y2Z\(\j"E*#d  }~&'YkH?Iqœ oVl,pubZCw%BA:j) Z|P.5SuL0P[Xd?+\6E P 6Q$1 {^(]."M "fx0)T'@PqIjvCcXmk[i"O vC$F!̀H qy GRE GR VJ62j5A^J7Rw79$_ =K7݋~6#ډ\E@|1&bAKV 452Dd~NhmktI# &l߆pɬq*ҾsyȂE1MeN$H5̨@ Ze8At޳[4 BD9SVDv7i$o~" Cd`@F gnC#- i{+THtGZhIr0 1W Lk6|LLcZ$˹]pVwaj+d`Ni\xzÜ\s2DЎI"IGj{Qp GS[[B[RA"IҒ4TDثmu[Bt 1;q µ3W\? gmpei6OdvAb8Q r\E"uŠ W.P CHخ2H0D@m}I}>R&"@1`eԿdp"P4; .PÉ́YX)-8.aj`21M'M=MM/S!{pi1Dԯ߃͸3<1٦|<7;!&{̇N`&M T!(Q0$HtĄF?j!jdVie ]n8ʁܑ\LE !$ htu) .R dXm悓M*\6I: q ^%\|:wdSei@ٵLA𨚛~ +Q{O+1+Uh-u:;JX-n6A&vDjȹz9魌gBfs8cƮ&eqI=*$HR E)v2m%*%&CUyØZ'A XlVb͗iAx/>929@꙼i-"4'|8q.$r_pERb@~7#Pr#r6⃌ ӰF6f2n"a7 ,yTR9YC!&e@5Y;҉@S`+즰4wbܥeu7M<x/6YrWԉV$e1mtH/0._9P^:_Gq:v]\%دt$ *ɓEM4ǧL\&\A,"nGhHl #u1m&} E( RA gW`.\c=Uء| d}:W8@khtjgPt Őh ҈Pl *AvuCh&iD i\lc-̶!nnygɧMYA?Q4HdfiT"0(#WQlz uNRDI=[~d6(cV\0;u`&=؟6k8XٌWb=ܒetp݇Z; l,0&"/4+5֢KǤ$ =7(Ѵ' ^6Ɉ`eaFh7=~]SukboKb%l 8 [8Yo2yC-m{]so&>c6q{k1_e$ T1 $iEt94تNI.Nu45䝿+!|*Ì_ Yl<'c F. jH5QChA zl TC<߄.GѪM$**"'uta~tRr ^_*Ɣ<LE=jzu5YMi.1dL ]B @F˟/^1pnJƓq6[I< bDNБHAH,o`֩LP6PR7QE‰5P 509@j}AERU坅tER}UpdHY (HLi`I?,*Dp|&#tA> sdlyYu Z([nM&^O)$~vIdi*pMH2$ I,OkObsXka$,? \\uk &bղ+ᾯIwSe݄51X$ _K3rdpNkfH$ɦCT@DI۰G΀bͤNURkJĔQh@kWEb$7TR*'U @a,fd3&ceiIzdsHbg0٧]\1 @KA D"ɐEl7S$ {Hr`; XA xo; asW"&ĽS?X)?+s5AL@DFש;@J E@33 }iJCHh*@2DyLEI=A P(&tQg Ura9le'P3# χ6/?_ u|? B DqT#u,T` eCKlb"t QH(sp6DI4() M`$ɝB1P?kL7~kuVy(`oYyZɴ- Mᾭб:C4dLDv^di;Lš}.&$Yi'AA?(֦ әb7ih; %"n6dM0fT?@$De $ -7*'EV1+$vD3? ^\A5-FC)A&&DjliEL:&\_Qډu' 5l̒R#uAA‹jF沚+& \ٗ4=Q DEmM 5j@Q["H5r Aܮ @.sKL̛VDM-u4. |ۉ_~ s `fq1&a<|>>t^N+)y +}0XIYX m*`MxLBi[@KAc 'DQ0 "NvSH VA~[ޡdlc&O d)$\i";[V*$mbbP5#RS~ 0\HSdR"!?fЈﲄ Hs3-&$8@ $&<ͽ =@p[eKI?I5\Fd>0M; `-G)sl@"kTXZ [-M/yFT*+OdǞ{] t.̖&]6C\zM,S؀M7+Nbuc51khM%Tgc W 23IAnH0f1376uN4APi7Y)$ HFA:+h mlڦd rPjKg{tЙZ-"0ahs8 37c"JRUxHFc5Do-,itewj$V([Fծi{'#n7\9#@k_^|F%h dؠSjhyKL`v4HZ,u<$,K 6%[HSA5Z^X q=Y"7"NI5۔v`q{Xµjqx"3=T]dPG)}$@%!#m/v&=HBUskI˨7e=;7 k[̴q\Is֒'r9L;0@/ݾ>/;bW  1w W7Xo_uL& iDb;/{ WzB;?*q2hmB $@2nB'P'z y4Õaqq&W0z^b<爗o!92ZEa0մ,^`?T&I07@5Q ӺFsFC-X$_|\L,fB㙡$ PaB[ =FePbʂ GtTˆ77S T}Rh~5++FvPhw*?6!bTEGl"Y H -n&dH?fE",X~՚YiTLT+iAjitT j$ yȑs\dD2nMa%"=]&xE qC@$崐+ -5iH>$"nQ45B#X F=]Ιӱ-|ǝ r陷N# k]#ZiJ{${MKPSqˌ"({~qtLC_ {0߰^'Vv_eq򸬡f+KHU. =QaOS q$Q@KDlvYq:I$׺Hh("$@#pDQb m8_pc-v.3X.w|;=ksY^{0}G˰8N{pp ]\N9&H<(2_Q~y'7h|!kdXiIQ @mjc$4Rܧy?c&`;ߩE/ L8`& H3SK@ަ $WtJbVA3`6\xkC&7]"6$ZS$A6Q#M'Rzf@mlY_G>s^"9v$;sqE6I7iO XPUikȺ<{( B.5QVDD(G HtsStgdSHyH&;LIDS^E@<2LEfb^j,:H'=V $/Dj tI[PD@1<@L\7d 'd{fVGgy51I Lx`;VY1M*ѤA:}@Ah&) LSUjg&Rd ~vkw5ӱqن(Qxؘ% qȘ";dtPRUhO%_LnBi|' kll[h囇7;|HiɍrA֪i36]-7sD-$iOSgH5ٌ;0#X\"qry`fNau=]8H"+6*\@M`"wZk;((;QLPAhjDP&k6Q>ߙ\Ǻ_|‡ c؏-ƺvXM 8S\$EE$lKHI$IScMHs` ZDT˥wQƕZ-R}OΥ0K&71f$ĺA"6C--9R* wNȶboUDG6-G2iKBq`POzrMO&@ cbQZMN@i{j@ĝA *&!`dU"5v  ':<@/\`ޡ|!ָŦ>- c ]:<v6DKp^)-1KC`juɖ7' F L+tpZ_ Ĵҝ!@txQ , vj+oW@nB(AbUo <5 t?r38? qĉm4_bbB.3hAR"Z'B.6yok$A9Ċ;QAT 74Ru"~@ZrJ?MHSSI򈵕&mT׼%M1%s8?fL!H煑A$EN@oDaOtҲi MdH p:dwA֖Htz=Cc3J8.8_3I-i\150{)"dPS7U? Ո{#E IM o1@iT@".y Q"wFYa hr`BAāHb QŦ&+QܟzJ5y;VK[)4'/aoXTi^-1ȺGe t '7(?v!J=@[ mRk|„@H[4Degd5 P)S\n5j c%P$h{2;BL^'t"fBA&kM1XB"b,$(ƚyUQMIkت&fR$ƫmR|(IDnhLLIҐe'Vdn{p[HCH #se݆8LW Jú6]| tT >וu$RߍP%h%GxPieu6q_M Lsb^-tP7=#sv\a4nEh\`.&+44Jo? M\6A$$^#@A'Z7#`ZJ]jyYha- ;H;Q&&&&+NZIX @!Wwp3e/nkakW| VdDW F.d.…\YU悑Qvs8n@vfĮª+ER~ ]38؍]Lw1s̸bb88pqs+c#S|%MH5۲+a l+LH1Q%ڪIDfHC3[tHIJ,Mr 0i:Y"h&9F͓ ?dˢRgqAE5N1n[QnP A2dz0 -F;-Dɓs?6L+U5J׺>?& 4'꿧1wa78N*ͬVt T hp<24_P+o?(0IE@\.bL ϸHݦk[-0TdBjqwZCHQecbap[q&ded"B4UĴw)'jpR3CE;nAai[ay+o??碻 _7sif!!H e|h~)|'/"̳>[@:kW@п1uQ;8 n9=A.ǼGL RfT$t9i3fr7|eXEY&(Kke7N>CHe] 0̯k2]W,..2MegNۇƴ G<9W /sR|@ggVg %&!B͌HE" N*lZ쳱)щ4f*q`p`Z&`LӲ>gZBCqˆNYk M ?JpL`R; :k L|OxGH@! b_ Z`C5D@r` - L"A""!H@;\yzZv.)'{IhP& 5À"%T" -4V7 43Tt:M.x+t"RR:OE>P]J@0VdZZ@6Po2Bt9gHuVvv!)?+7si"Bi>®$DFmD 3%|ީZPF]E7KIZ/w}?gAgst0Kٹux'Ѻo:EachH]eƯpLLM$LPG& UzǾm ^SIл3 ˆKظpP 8G/O@Y.W&\@ ;Ҽ,Αr٦ 3C3V/?0f%ik5ӟEK4 rD‰EfL旉*h{Mh4:ZH2}lY, Tc dQԨARo!_oED\e8OM$TGm ժt@֎)vQ4i=|tDU6TH5NFDNaD\DB'] )"/cXS\PˣdzobCo("=8lWYYp&P{tۇm.0g[y*7[C@$Rej?H5M$n|j .;KpZTL +m:pA."|IYI3q;:\uPP0 PZ +$cP)!4H-[.k\և~ɪMIZ !QE$B7"InUh5ߔ_?M .#HB e5% 2uM`@=!͋@Ae^uO0ؙ¯hdyXkt58U4F5R)&i~!ѣma^05֋`ȏd:Q}@hP?EH߲GqpZ[~{wP8H ց\)م J^EU&+:6G67b7 kjIP24 f&l_t%[6IGMh4$tndQMq?qY @A~ Am6)u**"eFy; Յf t٬ֱV}$7Gp +RrV 'X5#x4B<=uI75VGZnٛi\&P0 EoUoқ4A(i*adMooYn3TM'hꊁJK(p5\0iG)H(Js2tR0&U4="l.$D&uM\\l ZH.l `nTGSA#/ACWvA&@iP "Y" $Gjz}ctΥ8D9OVxx02G6@͹~I_=K=W=Xwt|!3"W"A#-$6*Σ5@)܃dEII(6[ @yHIQjHh5S.H0C6 {$7D  bkuO A.1qq(*nlp Vh08 ;mRvTŮ,-N1ti@&k?uO[XHfebnZd\טOsOu:39|,L,h7,Cq1O+;&@\_P7Kd2{$ DDfcAcYF؍TiHB dycx{7ÙLSӞv#|ݢ|k 9X{; DGpVdh%i4A#bR]PވP6Yt3Kmr0K B1Py1\0 +zz'LGesXFy':'A\ xn*?E@?ՏL3:;QVO;~Wu/|ƧAX݀q v#^e2޴&!fan!7DXށ;grM7 B6d KhAsG(-M: ;$˝i8@u8?sY =s)"|o?|esYeh{_ #cu'Z&T>sA޼ć7CI-e-;?w']kY:" {[7BKqtCuED$"ZZߕ8c17_W3wT#v 3"H."~C@<k&uH );TmEX,#D5^YqNA?1ڣQH{c?ax+ _5bv_"杖Z"Eu8KA5r.dЊ#ިH0_A3^+%O).S~&&=דպyG-pFuiWWHiȡ54/"A [NbNSv}N޷\F|B긝7g& Pch|r]7#,BQ# Isf6y2s6UEBA"7aZpR !q:fD_N~DKӔ(E&M{- |@ &jDRe$SnAhQhwE;̨71*CH4@\` ^TMf=d d7eG#tQATH"Qi&lv.(n\ี)a$ !`pa-" БϺ$HpG5`]H(?(#~H|M*eeI(s} 2vL>R: В%QqMbONLDi vNuce3b+sDXaZLɏQwH@$A1?0N"KKHhH;pL0ڶK@&A4P&etud*- OZSK ~UF0Mx;nKV+ jPqi d*'PR &U^¾5& ҁgLInJF&"zDLZYf4ID}OtR[kW88MmdtnnI]G3(p)S$E|ҨA@P-Sdo*#A3aȱ'}ovQ$w*ok5 LO*D f!xk I&/ޝʦ 9CKؘmU@(-q14'U[o.|g?RwV9c] AEcc;N#ˏuA$G@1ښAu" =D{- hj`TꈰIgVs|lS_ueٔͻ 3l}]O= D;j`T trʀRK?B>Yh D LlI28m#hH{| @EtHo R :{5kυIuחMȸ55yuEkHd7ԙˆM"IM0+y ;B(M t:iCH&hTE >GLI‹@0#-6JfLwQETi^t3-.3Um اz#Ihf =>.O.c'KJ&o6M$ &dZ q̀ZC.Yڢk*Gȹ4m$:X$ T5@\l,<\VWha+Y&'dpr䍗k+?[[Ug4f5 lj麈 D})P#d7MH;]@ځ"Բ"ى kysX Mr"Z4ps[6(h )#Nl +H1Bv('HE왁iZAiDɅWOsW `"i "A-"(T@jLM!ϢG-e '1 . QY9`@:HN3.>1f61pe&u"v. @ M0 T#Nv Zh2M EtL,~30GT"j"δh8k+I\1<{"e<,˩C9@D"eCVŮnUwA,aI;We]:`;l \- K|qUF˟*py̴y\oCEy3{'`=&.ف%ď¿ Q dXV$?@o6i'rl\Φa\ VaD4 /lQBd87-OHA_Ku ?s9'8^QY籱1u;]H [kZp mkSeH$Fd_Ka\Tn&q >g` ȺÉ&II$cmJXYfmq >tG,P^ұvY ,L<uy~Qdq.i -R6otPTE%DF@7H&0Pe>>M%=gC9_fC B#_cbc14v\1Z;uüp9~PhLOYDI>dtЀ v(I H8Ut8D7 &IY0ZZ`226f~ox?t[ nfdfkh4U+d6'% 4 - EVM7ˋj(4Ӆ" Dr1OQj>kB]u`¤dv(07dR{AŰ0; P+ I_|LպUٜ&1KcSIPB7|LRGȵI3DP5Cfv^^3X1>qĐz8Kf=R)5F"],LR׹U[<8k%fN:D@iZ* 8IyP{ƖIq 0w^+ 5\ ;Nl^TKFO AN Fh ~Acǵ &`1A[$8Di)\ h0GA;p!)fLM^$DKt /pIZ"o?t6Z4҂fYqnFJeEHZ OqZIA&‹Crx^r7$05xzKv+͵xf1dbc ..cEqE $QZtq;bZ#k`4 Y`Q>`nB PھH!ii<H.(-`;D(D:eS&}?5n|\& m.i9 "B&l o=%2d?3;* 39Oh QxD4@3@bT4Ʉ/X.=1۷ Ī )%E0nv .U:ײ{W SSL5I8Yd -^.L<."2&`ݐiSZUjjcEooz>k1<\@q&}о~6G53LKNIH]|D/̳u<|@; ȽAIX Oon'p^Q[sQZ/k~#eu4H"c'545 DcEJ Gf{d477Q5i(ސ *B? HUKGE:CdP|M{ *ok2ddM( ߺeȷ*8܅_GO//(k|t5$O\~4oSG3# i?-px^GaAѰ &"Ij$ˤgZak.Ѳf>.5?9O~"s-9_;5=pcEj1Sx_= u^XL.Fr9@I$Y pq14ƕnDȊ B֘`.2 Q:+샧V@C&eff"rh3hZC3a7R"G kY$6Cll;uFto$밪 ~AoK8{yۚH<~8tX2 ZOYD4Z& .2DtCD&/7UWbTI_\ؘ_/Kk6B2tӅ77YuM ;Q88gh bI.|Ocb5,?e՘},dQP"{$"[ȩ1HQ8d\D(@3nlMS \"fhUK@n U4tqM~Yh+u\H@I3xo9ѲYL^~sm~q+ɁEL$$}B O$$7^0 M[w]׵V[f1sy{q@>--IQD$ο0&k6VIx\.cZ~cuX\rLS0Aw(Zh?h 7`yGMzk0p3-d]xSq&H ~^ o8<{ם𙃫c̦S%172s8 q #N.Nʷ&BAi=*K('u@G 1HX@q$wyAT8o &cISNt?b9)48~o $\REH/_x\[cg[0X紏/u:#ф\61H$\D4º`A4u GcE!H$%-+Oh $[8Xqɘf\/}Ο\:F;"Iu (Im^%f ];W%G#P?3eA73=Wfs/8WD̏\[Yb Sc*H1$6_Q$$ tjER*&k50ZܟDMotX}I{*Ȣ[U@s`OE/uDq4C@0&관Ba 0-QpArbl,6 B@?R K!j%<JM(A3kSZtƋ&CI}#4 %PaŽ"mP]C n ~ @L{ ڑڟ"-S.DNh$ERS&EU,CvZipWԺ`au ˱Goy"D(dKf"k>uLGeTކD&&It6D4okL$40rqyc sLbtÌ%tnu07DR PV{* ZR Hb *Hu{O̥KI ZP؍k]1Q3&@%w@~Tj^ 7QU4P!΂ʽ)ZQDAwi'@$.kCGA]B vnOEϗ3W Q lqF,+p..0.kO2gGHvM7Axeh@Dz͟g!VaFʉ"raS`I&&eDZl ?DTEw@8\X8n!+Đ")I%PDyH7\IAqxh0Z=@@0ޭyӳ>\L7Aqgsv6sK뽥m 0f<d63+hKw[H;/־|x29Odx9Tw_Vlnֱ0# `Yp>\A4";% ZD!:~ۦ(#VSD8i3 4" Luy@[Zz/YOQ-nOq_bLNȬ*T\@EjMv![Po1k1aHyIN,p$VZ({D!@Em\"<\,-xo/NqѨPw Ji;MĞ G+ a;LshYnJK%d[ߕVT TT $#a_t)r]L ]WhHվDD}K 9I5ivjiꦏ)$-$6볟~SPh&euB O+x&L.*3JwɨHDK[}äs0MmJ-D M s!ሑ-ŧ[D~bN$?EX}}V3DjYq~@ Nù S|dQ$^h@wck\ _m1 k\#qӥb!*<-2bbۆ]-fupdJCAS=4E4L$-BI>+3$oM((At ȩ2f"_I&`)H!,ұ7+Xm>GH,i3cS"y\gXLgC4̓u_=Csb*Yz!I-278bH6a&O&TE80/G`d=[.ާ,>cpٯ{_zg:g411ﰟ_!P Mt;$ d%@U` ~X(2wAG T!D"4I&6.H}C_埙 /ӆ$.6\ DD黧T@Y AR-P5]IfrXS/a-dM:FR@@I7P%N"gurfDГ7M"dX*[J@DV" 鰥?U7 Ae\˽-%]6tEjjy@ 6@lApUn-(V7@Q$"T`aR9\6>(fI4Vo'ӊ]x;wi& 8j ۋ%. lKHh$rCކ(;?!QПZ-32=RNSH?D  PDd"wZfZ$̡3uDCܦ3K_O?gq}e.g.nxЯfߞͿ1IH]r( r~pK@ * y {a9 .\W8G6\ V-H'sba;,Ƴ  I.C*2R"ϙf1 IŸA T /> Y5OeZ@5HK_I3Ol4÷sb`_$baRH&o &;h A Tdf*} ?& h$/Sxcxx෭tOa7 cak;W )w@0c=3&$&?TI2f}D^c]F}qIBA֘SD6 T;>v3ܤ>ޑ\-88HF@U0`̪EִP:gzS V & G Rg-\ zK hڸ7pf5nK5ilaf15dW5yK)4@Xט)$4NҠ!WzQRO,Dʁ15k<%Zk8IRXpqPq:\ꏵ*Fi;YCͼD\tLTTE}""Тp~hVH;ʤItQ0E 5LwP` Lwv:uQ_^UI p74Qx@%!!Gu* b\?dMD@QHQ]ΛL5kERU}Mț7/HK[d62syLlwUĺy\NbÕ3B0~ʵ#uIȁN%Db] T$neN"}(_rDEI4Mi>Y&A@ٚ/P̣83=GrN^^bi7 ik%ԟʁkouY AܥϬS;/oÍ蘽W8zk *Sy x.q''duKEh@i'$o!O(M  7vK__='a2]%"6/K|Q׍beK4ܴ^A1Y7+!TWF]%I.$C7An$LI!duIpkXc{kn` E7`kT ;Y KϤp?"7(]DM*ϠWg+9l<\6cOO.|HXV.vqkQ@ɧH_OZKK@n yib$ v(PiIqH0KܫP"6R4.u*I9⦴ x_to9|9/`1:foz7Q깇3XĹ2dG+,~+~`t䬽n{Za_ < t8T MyZ$.2Aܪl:.` m+8G14k0Ex3"|Y0M@p&q_3A]fe_ 0uaѸ\eĸx㺜>*yZDRl^ ]ra@cw:VwU͜W0H8^uEP|pčIiĨ:Lh %4*{ҷA0o&4R?Dht;wL2~'^~mu;M=/ d@QDS˺,& ? Nu4ba%$E 3;\#H}G qKQA0ɏEDӊY&ÕjG C]7A KiQei#\Ě}(h+O;RhnIbYQo.խT$jM-05Nmƛyh4,d+3Ep'mPw3_m-r0#(%u&LO$K:7SCHu2L &djh <NJnD _ f?M2^$1d_N2*nڿ ,0opß1*|\YgUUui?:`Q4 Z#qʀ@${ K["4aP*@Ƨ@҅j H]wuA-0o@]KX5pev3y \i~IXY<e,Z"K< nCXQ(2cui&eT={4A OX/W~zwz}_Xf30 !4_g&gZ,6\-Ceͬ"FKQ=oTa|y R1 qo^ꓫ1p4?O fULKFbjEmUy~nK̃ōwW2(a6=ΞI?uM2LLVakEfJccEFDwWf`H-о`Sf|ZA5 @(0^<&%"dV6HPq u@=ᨊAFc%ٿsRP#ASD: m4 ""dFZ-q¨f. Dj"'HӴe@LDI Z4$fn}\5njjY{2ٮnw-LO\0+x7h\DEPA4Ԧ$Od0sxlqk\,3IvN6_$jHqhClI7~4@Ԁc*T@&v-Q AմoD Ă=syJدvCØ:n?xm' 1IS5e_пA'u$DVhpPԠDd؀OGC\d$b&Du%֚Y v_@.Z#IH J1<@@aisTGRGs$^@K 8+S4u \-kzyέl28x20Oi'i$Z+SE!,?]EyL$ q,}Zl>4KP G.5;Ҵ[v\!g.qNZ.%))k\'LMup2Ae1pDl X AdLdUzo΀N*Atӿudn}OA]-ΰȣ'Ƽ syd:.&M1yD4&sA_8E& qB(l%hA6At S&'Q"wө^Cp@ؘ$mao ؍f.su uozvk' @|2D'cE-4HkWZ E̪gŕ@E _iG)c1۔8Nj.h"#jꘓan߅<cPef?7YS}(H0jEkZ @rh"iJ)[Q}ӤWQ AK1P0O75n s7I0YLDp-6Y.jf*<ځ D=ր du&bN}VMf  q6 H&65׸Thy͂ïk$B 4No ބÝ։N\ZCf"L "lZHj^U3x*Iȼ#_F#\ 6:Of؀L^m֠͡DV ߄)gV:kzE)&d$ӛ,Qh DXmOti.}AP&B/åQuHY!LQU' 嘭pgeS hJNB<%.q /ъqA%8x`~#IwL6bM}kI@u@u=bIr$DG"ꘚH.p&z$X0Ċzn &. * IT$6JR@+xxku9H3o赆CC4fm"=Hpm@L >.?ܨ O bFA3R` $ MAeMjPvoCɍ@H&<+QD <ݽf*1'j‹j5_Ao ohB<=:P $ʈv$#jWu2#Z$וim@enLQhѴ'I1Ŗk d$qpv9ѓ*+* ^QS@hj9@&"7SOz!ҳ(m ILquNNŠԪ6 ~V\<ߛ( LR(t$z ya0`-Ή9`f_Gˊ&$Tv458sD@>6Q%؞mlK mA!GL wDP8\ `Av@CF¿&y9I8vkrD_.un̿ȋ/! KNܠTŶ+$Ɏ*ֶFL.Lp)9qW iP,%l<B7T;ZyvQ2j pH0Ao6$9MM| ȉkDک Q #p쩨 I$; uh:(xGDC{quU$Oe M!"ut@SEAw$8@CuzYQNfQ4D4FHl¸w*5S->Xu冓]dcZk`@2 @ )6f17s9ev)R`U|s'Ϳ3,F5pX+ mGz ql M ӵfT>f{b[0(VjH"ʸ%DU2EA$Tސ 9DЊ%=e*ٟTye&Y:C '@MoTIk`Mv3 9YA7$Lq5DCx1*0@n4Χ(4q3'd{v(W37&С!2R>ICF H @kę.zgLi#?1İio.4oSp\P0K`e=N9lL4pLh120ZfZ8N.^,|&8Аq0~C$˰dKj"@ XL ٸ>$ @Rr)J @t@T)Vu-6H}vC$7Q=S]]PZM#zURSEP;P&]XL %e!-P 4vr+ -Jf"GU=8( &0*aET($R4؃DOmzmiW$i!hD; In$q;4yL6eDi߉pLn"mt;Qlr.-.*fc7@qiIod̷gGnbڵ RkJ AxVv"H" ):\Mح7z`2xA;'UoDIH fԢbI~f'.4%Isaܙ=PL?;s+3 f_ t㵇9<:0zۈG`3]Cvט_X,>Xo7'd jMT1 煇Imt շ-#tDI\%A: I@RyHo -Т@ Pk¢I5&`*%b |E'*/.ˡ ܉d߉-!cXb`=acBB E=ު'T XTY!Jىt1O"vn/q&ɂoZ+d>fjEZnfWk3<<׉MN]{ 7" t-{/Srk4&>gY.Ȍ&i0.F2YW3xkG :SP\~!-{u^c3{fz.#d#SMy*x@ EAsA$];I t.%O 8"k E6[wHl3}]p,-uŘ{),E?UD>`I0~UdN2 6G@ 4uICCM&/ kEaz'yDAj( 7$ +P"Aԇ6Y*"P8 R6\o#YP*%`Ư)+0U?P!-"e@Șt,=fjIe܊n8p0xTЇM "we<7nj fx0`+ar6I؁O-{agY?* $ִ숐 Ð@$A=52Gi7Z1YȡRDAQ噸@T6ͮ5(->jz$Qډ]5R S:_Hik I`&dTުIЊ@DA"w|uBD#:-WYT؁D f؈D@"P ׾P2]SP}Q[7N@X}qiV&E`"tjTa)4f0H%I?AP'Q -@D3RZHo$F%spTLohj,5>$A]折Hu4],8q7nW`$2?@lKL:P*=lc"ܬ;I&*}QVL8A)dxI%Ρ-%7߄W=뚺h"ުI3 "AtTyUؚƢ*w@7'@埴H:gQLPdv~i};1[?Weىs֝ !Z?t/C<̀Y B*Gk5AAji;-Ȋ 驂5 PNq$R S :a@o0- %R/dc  DHə  Xt=n[ ƸHh\9ac=x "ƴ+q`ҹ؟/x?-L`<)ry `@LX_s㮈qM9%Uu &T T*A:TbG+&!A{ I5*+&/dḴo+4N6; bI~?P6@դUbnx<% Bd*oJh\!ѫ"*#!լE.\O=f_)\lGicZIcda;#WLE(iC{ ۼS⼏H9vak>Vjp{/>5_/$is~^+HL%թ#.;Nղfg xx5[jIJ"[)hF8`|B W Ǻ-6&P:H1<H-yFdp) &O*EpT"%&DMkhTӥm, `h$;}d: r&U &!k&8@+ԝ&`U.4-U8HHtjl6@v"I -i_JtDI$}.&URI07Z'"QfI"t隋 qgE887PDR+tɷʢh=@ ?u qD85e ;Ώ)ӺIQ5i=Xt^Cj"\hqPno?(DfO 1xʄL۲bcV:aY aCx\Uh1>l7* ځ{*dL@ VU3HWҩakƢR;mre&cdlb$4H'M:OK@2/)cyS)yNV&=_ YHtA 4SV x;3ugHG !@wsY&&pj+ Io5N4=cx_'z|Mӳ9.0?Qwg3瓄%4&vH2Nm;*Hw3P#g s~K^"9Vab\ߚrAъO`g~g01  X;& Rm< E6{M=[.i;8hh‘(&ҝ'H:lV2kKJ.1R Orၪ8"xydżUg(lNhY$VtMluEtzc&Yfך; Aj2ڍ=DIk":{BN `ֆ ;B9"Kx%X{3rT`\A +We?9<`N|dؠ 6E m;I*l Xo+#. sJ zOfii ]SĝW)Ҳq0ՊkV~I#4t,c-~ji6|yd ;b@cBeEU1H=#tA idA&c߅KH؉qlL @u"3\Ō2$͖"7#RǑ~ٳpC/@:tA6$5~Tdק-&*Z78[v304(v!ieq#iQOԤ>Ĩ e PJ{ifMxHQ؀7T ;%EB~V:m+0"*CvP7SDfJO;U. i:LlkUMQ%ꍮ@rCTΧy4Wֈ1 (7ҧ@pu ${Ei  1 -*Qpt_b b T XH:>҇Y8b l@ӋFMeG'ӛղQ;(L2,@?e4"4R( D&#b#t4i % eNtM,2` A*d;-t6QQQ-ފ ]E~s@5EEwtK@K*)?ep˜\'l4j"$m'ƙkI&)`CAI;&;A\fDV,[" F.`ӲEE\I>h& j?<-E$xTӤW4 ]@tH4WP`{$Hc֊GImIRʂi  ȬIӘZ ,1 m\VRk9(+z>w7!9`sMg9bpra|bFúq[BFr:4t  X$Cf o}A$l4Ǻc`RC 6CF#IE '&ItD-Z-,d0@E_~衒Lֲ+]DZGyUf`})&Q]VC>$_ IP iYFSDTD "i3$D.8I"GԘTI"2bixTRk]@ۓdi#y+Y{废J89&$UXWƹ^={7LcqX?M0 RWg#1~8Tj?SCbkYlߒ" R"T>C@c^xT4o?(D{A(G2f@ăoĭ &uZ+$m#L"\ n&Qlk(!2Z湦u>I]P@I&!x \nN$ n $m)A; HvQ76$BAd7V;ETׁ@ߺ$.$En4&I". -DUfp8 \nc1%Y0lMdW#~O*4$W NpIWqu ~es@Y+05=:2&(-pf4Pɺ-[%0CG*L}.g4K WrI>C$Z8jm%TIA@ŊNj{P4""B+;PrkK;ƒE/h26<6I=qpD KLk."zQihC:8qdÍ4k^Ak^%bWTXW/9FՖt&hGr_ZgHQI3m$ɨTF)"H-1SF43Nl4"Yf2%md&jtRt@)0EL(0P1KDQ2EFM$NDI"РV[u9ԒS_u~t8!JMjcYp&`)#yV&@1Cd&A@ Ҿ`n~;^QliCd7ZZLJD;T82LL]dChi0,a_tȺj&&*w(&%N2 n"u(5"N$(t:!Mc ^"=&OdtHQ2 Mҿ iTɰ%S%`MnT~ЀFDR. ygFW,O+f(民wu b.*&LDMH:@uR`ְpaI >1~^ lLS/Mer?,Q4\ma1֛ dRby; K3/ksN-'Z*0Fi$w67b"j>oFˆbWbrE3GyIp;Ɂ6Y!`7 -庘dٙc2,k\En!jE" +Te=M-qE |?Eut/fM'<]r{Z?u^ dZd W0;oRs ~~g9l\G=2L".arvTW> yeǺBX״UA0d5T&Ii0n3z!T^ DTeiKߺ~cZH&<_Au<rٙ,-&9 p?4E7ʠ&izUs\AMp,s`8AUse*s@f"Oh1gEH" tnx0SpbDŽe)ei Iޫ&Bk6@ i31 еȐIt& $Ў.jN5M j"y0-膑AEeU?\,$G 5G;//9?\tgʿ q0ϻCk:m+EAI7}4Dq(:tDHh/M^$Ni1DAZ5 $L O{u AժH@=7QDWa6L@ >..(Ȋ^YHq0ߩ jSrMɒJoh?D "hDTH0ɠ$~ Nީ  VOdFS[U@T T Zt5W@*H& i`\'apd\^BD"7TTdOB \X øq`a;5A|Nz[Ncqu5/k [:_0h-:k<1H+*x2Dt=iVCވ`8[`h?xj@@G L,#̐"h, k3(Ffv2P@{%]KtһHd@D)sJSe Pe &cnRؑz۲^ZZ f!d.Li(oʯJATKʜ+0Dw"H2Otk$RmL z$2cL(d[z1Yo`xc㸷3q/~Džoyiw*Q'I"Gϔ(|B1ac$85†?j-N; Ckt]43´)@]PdZ~LHėYDI"CI;*K]cϢ$II.m[qK\yLi5nA>RL͚{=m 6vS^O"Vu@@"шf"$}$@D]@mDiɂ7@A~B&xa`h Yqm&$DY"1TƘ@ZkH?st=bl'A"uXQIt=H#koI m,-FuA=j#5֛Ys AЮ&QآAo$dG@#s5jH}@w@4p>R&9-ZE'鬉Ep2&Dtz…XQE{lnLʮ@,teǖF$nyS"uV ieL,#V;"EdP37z( B0 u/SdlE8@S{&߲KN'k #fcD&"U5 < {Ii yWxIe$A#Lʍ@j6P5L6qSfK`ipWyf.g؎nkA&L '5 b6+8\zi"bs|hY FP2q@/M4@hu$z$[纀h5! k>cX%߲4Hq 6ljYV#fhw)̊B6e|@\M NժJt$Q $RZ$+L LmI}P<݌2I4zo}W?ӱ 1ݨ26@x37̣lÈ+\B.f5 =ML !'p$T43TΈjT(nwAhӱpUdA& + zXKb'P?UV$VADSĬε%;Iih P?|I'+xY,'kn[Z]'r_;0V瘥I.9 I)I ωad٘~$c66eƤ boEP/u1Ձ1x\c` CAMޥpsu QsEq.q %@-jU1jr ij#VޟcYiQU eH׹J<0]_u]`亖)ncc}~׺g8?@$͢ 5NBIUbIhH5+2KEeDȉAu?*&Y43Bְ:&:7@3cṘa 1=I T{ɤhh}F4RlQҖ7"e#LwPkAt(SBВCkE4<qZ./Yb&32!tItrwZ uA^3Y-W ny6Zn$]N exY"i}Mv{U_I 6߅14Z nY{VhEkeFu` 8ڰk 5n5_Qor4a^lЃ?r^]&&˟ 6^ZɃz'u%~k@ U`hE&蠉&d4Tۉ UZ($8 nА )TIZl$Ǣ]c.Z⻫Iu[*$E SI!#"" Ш  ffT-lUGuSS$a10A܏U4lPQFEBCԥp$ɘڊ4 $=*e @3G_ʉrR,6Mt:5)>fOG6gGN9,615 n#x@0?%۩SPQMs#[n)f!s 'oStqZ `0 FvqM@@Iq2"O5\4A[ūKe$|4YI]H Um\CtOeW+u@1CIvWbG$s%~>H$0OT.`AxM 'd sMDV ,+<"H!5 #I.7 &;/e<1ռacd:Sþf6i(_3Ĺsp0qtɃCYuVI @-XK|VJ$XA@K㴍$"~ *tc!I{UxgA!VAcx(Tֲ ; fiM5CN>*̀}كMqw%e ćLj4%Aba 8N/qoɟ3cm&VmSDCCm0E}RZE 77 ߅9~'&Rw#ܸkF&LL/ʂLjQ'cd4iOC@y& 0leϋf!p DTe͉)D?摈 e-A&N b0C#XCϢ 5jL-&ju8.nu@~$7Y5EZؚpF6Dڤ*MyW'kMS"oN- uD0$FZ @ݗ3Ӆ$ ~LQ4 ʃoKj Tn Z5C얻qlpP;v>h Zϡ@޺D]S#H]07[1˳1׻ ^دS#ĸGtJ22yO_70'WxA@Ak "%o L\`֮JKk5&氈 -Ev .0^sD#cT6kg*I ahf8 *S2w dTF˓0G%ŢDKM? .kU 6f3 fR\LW~7PRKI1JAEIQ"q CuU EfTj"X&#$›@gcŕX۽(aA3Ti}!w 17S_$pT۽dT֊piֶdQ@dd7@:$zlL@Kp?gL4E>0 3\KDU!Ot5@UQT(f9k 䈯u#<}_>hb~dRDͬi^~!gsti`f]l0(&tAzcd8餑IR  |[ d{uL˚j{L0Te;٘ @`ƚYmB3zIl*l Lt|.ۮ$,Ψ{(souyAPOudžA"2x.SLOz>~I- m Pv e 4г,Tf7Uʿ9Մi.+v&m˵a2xB j$A7'b1  Xm:׀Џ 9g~#Ɨ6+B=gMF_T^7?Gr~^&t6@&+n&hn {p^P˼eIn! WkaqHr MIP1~~/u-?'lf.>&mb1^@%h(ދc dr\0 CS.`hCoEu 7 BIVLZ֒(t*rP61"0AwES >3?U4E4VDy%U8*tD 2#6j "9S@-$iJ9lo1?;c ?䇿 PjtPV lqq\= ;;qP TpuPTQ ܪ{4-{(DîfdHxTALH<$IHGjV x@O!{P񗈲|ii0RvWo~Gz3 ,ps\} 3p/ h$L@7<lVH wDP\p294H4;!LQ54u MϢlKAB)HSKtֱb. ߕ>\=G9HZ`I/޾xkQQ|Ba 7C`˛6/|m/<5t,W7 41 %j@)@'EZI @% ~*bDl +K]SU$D5 G)?L\FA'dXK}=H> ndqqƉez^dX^+`?/@W&, ZnwHj$[2w5J@'seHEЩtk?rio \r` Vk"bLLgq:DA6 yeFމ".gkHʨ E H #~5y'5C $I|g.e80ASfmZk1P9o|&K ùV/?aDK[REnW.sU,ceP&@IpL -UC-V"ZUl„CLiw[ 2VMXx$<r}׉[zfw%t I e3(M-vRO&z T Z TIHS6("I0dMD4-P*,Z@II2{l حMĮ:DpH * HPFq^ 5XKKAc+uSFcM3;N^|Wzd1N{~|FgNP@k|eQVbdA͊KTּ\ ?Q)ƒ^( PiI 4nd?-%'HȮVgR& X*bVpmDcuϤӾ |] gQ DT`;@e@BE7}/DҀŠ$yP4w l 7Q8yI\HDRIM㙄;cLZ~ʠ   `։"nT&L̊$Q3dɟELRK*C`UPF'HěLJ\U ^BKZjۃ˅U!IS~'d$HvU<Tҳe8vVHJL~($ GhIk(@"#TZ>Xt%@(ӤMAUp$2@ZdVȞI-}=7 S"ESLd #55~e;Fc=-.78dk@`\A5LȱMuVm_ d5t 4 Z*H| ''u-$uR`ʁLGO-:EǺM~.$N_`Eef[atlWcaz.qL?/CG^lij57T 'YlR 8,=4gIѲC5U/tη̆C8حn>e7^ x%N:Oi/H26./ľ KKd0 񰌻7 Y$Ay*S@4q"Dlj( "Sz#XdDnE T;H6$ּ$Mx+Xnkp̈$RO 'NCOZp9 EA#=n` V 8R<-Lp1q1N3]FCHiDPP v' 7/_6D;حΆu\J3@&ե\ۛ4 kl,9@E6 K_1  ЙMI5(tH<~0հ: [2׍H_;,pl\w1^RV ""j"}"6C6f ;EP<?TŠh G M;HN e Dk^LqY" ojgPDh5P DUEMv ŔAoz ~T@(ODӺo~ȓ ӆW3/3. gP2M}+!ӵ*HٓZvMZCHW1B'8l $BZGrW>k%ъ$r DDAFAM-2I FobDH*#Ht`,؎~$|5lIdž-`9-4 M2;uQsvp#IP74܂/ecp.гMwO3S[Kh8wN s\(f@q2f$ILI!;NTxVQ-? `Ԁ7*y5SU&8;I=b&-I Ұ?3X(Z{R+5ULMUXT aAh;BL:%o&,7DeemuAp[`MldL#i{iQ1ML-&$J 6"(TRT[Mɀ}B3y4Bf.9ʨ>ߟMi#!&- BÖzáG>V {0jMo"I"Kn,iSzq8LCdM"}@֊>"QNi` wY_0u d1 و@.ܨ}@zCI= 0iL~0}S3=Z F^S=K7|~0W {`k j ٞsy~9$Y|s); e.$Y@@+u䙙~.6]y$$A&${I Zds3W 0g]>L>w06xtA>ʬ <m^j2+$_-m)h Bo#zpx 2}*@:ES @LjI6 jL!X,V$Bu(@aAM Zd8_|&/_/ձzksp̽kNC g8̞d|'8V5S7M ]X1PR7uÈU&VʈDfBv1f`<7K4\D-T4`/о|Oq{-\F:xyðr; _3Rk^㧹*R`K6UK ʀ&;0Z0ˌiܝG;48UD"l U-"K\A<͔I =\@$ )SxC\`ET6pv65{o(MZBREj*@A!<Ӹ ~%^4q+T"j~& h&ɶ$"O# hn@lb1mh?UlDׄ"R!Gܠi#;}Kܔ>2S؞% 5*$F=XY$4sK[IF;+H5 F-&J@{d dJW&x50}հ(aD*l.s}4N"xT:A6 īIj.( tJIir+u|>v_*灈Qh܀MA {9{{6ɬ/C~lG78HlhPLb"9|} vgDQyd&`ŗ>U|LAFup;?=Q4YPi0)2VtlgXXm{?+:z_2f8TH _: 8H跈ZqIdz0CKl۽s-eWVl&#Q\(({L;QxUN(CUvbEuQj;EA O XocXN#u8RދI08&SCcM U5(%DLԦ5m^Pk uj3TԈi@k~D\rwKps~{3ʝx.-tjsd&N1Ar8K:BM(All@&DVnZu\|weq״.2RmEZ+SYZ͛{\+pq`$f@Άru陗|\VLsH#)9r5k eǝ+jQ Kb'ӅMN&eZ(JH"wK| ޫ1abKD.oKC"$d0$PԂR@Suf6SYXŔang*k٧AZѨj:cKꉧiӽS$ yT$7?gq`4MWxOӰs]cf/h# <5_Z芊k0^U*w(w "UJZn`"ez}31OtƀɋhCD;hD UD\<& 0dn%e?;Q+\L&hԒNMR4Sd Rf"B"@@HPaϺ :.4&7EKH~tG5_UFHkZ] m [HS`}6dmYD$U}e5v1oD@^VEodVh HTUM P4Tbt0.M`" VG2隢H>b4&TTKDĭ o=@H{ |IܗJ~g*3X~61b\xCb O|3z W5ָŚ*74CpȾX.:E¦iH0"KD\0UDF *W4LmE/s#u7b4p݁3ʊިf4ȡ1DuA>{Z ps*t` PӪ I}$ϧ(a>R'Ht؊eΚ≠${?^%V-վ hmj m _vAdST76Hדĩ˱8K%e YzfyٶCi_x9ߖʜ#N a${ od 2A_ʦ*IYtEiEI 쏨 1ZDM[Q@6" 68@o SD6_ER>5Jf FMA7T5fXicqr1Apn$iHt&(Rn3 uۺͷ6LA.H">KhFlj^0]Q1&I_c /;]٦t7 tH:K<=3d1c`LPd䯉qDEL{l[>2"p e"ʮ#!Ԓ'bT@ a?e6G0L@t["u㚢wnHPIAVQ2`{H_k{_:ns)nnW3ouaQ8O8nH1BRl&9) +'eDO*gImUh@t:\ g!A>ݕ ը}O'x;>n5exOi',v2#Y!5LAfikiU0ƈp Aj`@";P$hL'@h?t-6 p@~9VL? NR,CHcefL;꬀M) !m]#o kN:M{,i8xH!d e* X2E{n*둍-vK2 ASf"+g/tȑPD'uOC) n\ؓp].`҈'S{ & DBIi@9 yo~ A4<**2 @H o)AqYHo$Ɋ&|T9 z OQp $ Dވ ʣK&՘l;ޢ +e0m2>$+[ilHlxTE(4 &辗 sx!v]n&B(/4p]kO%06g9v&miA"+#guzɱ4JFҲDfGj%'jp ִ`b=l0A ʁcZstd]MkoT'bL%X:}}ըIpLQ0 k+#V` $@4۔M PcN mL'N@RvH Z콎⾧ss8cH!=sŝS[=q3}J '& vsI!1ʴȵ;,v,Lj- X`I ,zS'v& F6C1phv1躠bSdAp="\l q&m A4&jn #q11Y@ Qj"hn7i.d鍶\Xxo׉\L\H!"d'P6@Pnj&v$AEisuR-_2td0'zdȧMT& šU#%uA{ FE ɟAS HM[Rf mEѰ@#6 k"Jn"N>ZUM7=M}[]d K;\{R..@t вM4 ԋ7@i}((ku@* (3 ~& 5CgH x߇ڂ/+=s]Gbgqq,j>W4*)` A0"ʣ[ILvf*+hPNo Jag2Xp{1pcAeNJzfscx^@O6T`EH?*ۅ b }HF{VʈdTRJD^(Zd#35h$:-E7[ bu;a3E R@";L򲴢.tZD E@($*y 2T"S+qO&_tXy2i]hQOV&V`+HM.A3JKRك%yZ MLǯ; fSB7 6CՉJ>]+9f:tN˃t +ُ1Cew:]"Oul&g3|د>gh>MwQi5m2j,w?L@@D@ @yVb<I1YP"5C+M!&/fs4i]p+R!H.px ]S.aa3[@'ulZb&ܯ[lwG.|<(x&$/>,?[fp55 q.#>@ZHBd$Mh{@2 LheG ;~ ;U*k>_{QE}~"CikbՅI4 WټNa|&TAĬڠǦmDFAq S^H ܤO [FAY<O`Prɧ6EK@G Mp`cqdj.*;R7Ahq>Tkv"ja,w^FsdY\?q%xi,5#qf Э2MD"hpĬmUb4PIE a2'R?ʋ ,Ƙ63d@E" ֢H," `_8j٪H tW&$ҳ 1>f-\αAȀ ^|xUE}te6 nUD3xi8f;W"nO=E=Ti  ʪ"#\{ sқNfZde/D 4}T"DLR`e@!ÂBM)kM5.*$EP PQHl:\F10'i_yuHK\@CdR-@;O41!.tq nC@\Z'QqdmY$@m߅\k& x,0PT It Ugho{R(1#zl6*ki&vqrob GJHv&seG+|" =Og:m+E{sQwVAS [[$YMpy0=֯VȾĤ@Q0F\p$1DQ;vYd  M0 ]w3ؘZA+\I vL QkحLXwMZdNΓ<(f#b31I&P`^o?뵒cMp? /VqYoj6U@&I.k+8xs5~dF-~Ȑr $EG$QPfdM"$niVho*ZL{giMA26 PO Zh i&7 m0=BCA-sQ^S扬,3!b V LBUSfZ& MB y%Hi@0"'&E/ fZXyc3\\G<Ē}#k&˛,_:iY~-s4q8|ܦ$H0ĀL8-ΩI,/E#M$\`$UeswSdFK['nPiPӦ(} (r(mXP=Funk b+ L">v$;U@QI- v*KHP0M"Zb.|W|frlbF2ZɧNaq!\\6ga݈>ˏ<̂(A &$Kw2ȡP(+PUEPAwzvKLn% D PD6(i(޳V2D5Dnț0)dfLbME`&@u$DłS[rtA: w[dY}~!@t ]]hшr;/9[M7Qqّ€ TQnSivQ3Me"7(ULc`4lLzMg>p0ˁptx I:鯲h$QM9iA yDA,߂&NP1HS;4l@6 ->rvL:Z칟Y '}k U&cD#pVE=* =@! bI8 AI e̖.&.> 1c` LME)31BP,9VEH;z@؉Q0aTxZe"Dahg@&)y,O$جF&(~h HLnڶ.qvSu7z'+Ln6Kp^=- Ǥu/Qr#)X؃ 0cOHP ~`a\FK889[6KIp䥠 D *FyUkA[i#):m]6[ci s gQtH1; t2|c,P|qq|S.xbtޞE0wXĘ_ :ERE ;A=8Y" 7ZG&|fA&f"&M"$(6ܠ#Pʁ #A5œm$zdRd ROvz%I6V[PAI%YRLO57TmD ̨$B…9ZԤ Srku㺱qq5 qkj>@>UcMEPo GR &<=2xXAϑ{/L[RA ʉ$TlВ\$N3S8[&$X͑zt~h$5 #TySgH B$55= E9?P:fu|l;u@6"np㴹ǚ9,<*|=L u!36~H׿VllaZh R'eƢ!9L %+/8y+ď/զL"DI4P?`/{S%ܕ<)5;L6 M'Ud[d#D^k^@h\$3vg2WĒ$1G֔mwSmIY"beU0`ۤ6j"bAHL *F@~fCWr_:_ ⑇Kd^GOg, J!7 V" Ѩ D9s#@_U[t,LCv7V/e߀Qb 3H;MjcScxotL.ӳ,b8aPi4knj*O".v: j;!V褞TAE;L9Z?-,A$^"7L)h6;e/ NNE`lҥiHFH`rÛ-0&SB mI$ ɒgz8^;7V<YHD $L4ouvSyfI;) Ebbbc2CO8C]Ip]T1M-!gO U=6Q̈&h3T@VAly*3TMlTH 6P B7Kb d+ۮErg0 o= ?O8\tba4I$DGE6i5 @N@#1 2.ޠQLDTق"]M@)d;Iɸiuۅ@d]r60k~ag opc(ѵ 3!@ Oz :L6H"e;AhR.8\M-qv)a^W+9yZĔ4*>M&b 0b lpk #hcST& ؑ.DT6TT(I=Q" X'bd`Nh,7㗇>cxS;:CF2x2*qCOڦ7H@cT$27ުhuV\ $йY-q.o0q1^?ܳ_9a\&@3-wQh)JB>&X~jqn]I A;ĬŢQ>k6@H[ ҽE6)l; "@2$R t5Z`9a"FOu̲2w k7&{̎7R89L'Q}}KZ;山CXDǴsZ#W@ Lʁl@;nd]@cZ@@.ӹ_x/V{g0qx,nLxo2؟ u#tIi[-M 0uv%""?)$Ȑd-`.kQˈ@©2{4Oe˗f10.]c%lj @$I"'q[X&0G OTDAp["G_XA?U֚A} 8Cd$]@:`਀BKNd+[ A1uI[ ^tA: j8S^;*xQEI%@ЉBI$[QxR,M2 ~Gl?daQ[2M&'d[j7j`XL,FDI M' p.-Һw?WO~ pgk~3tu ɚVC/ &r0~WxC/U ؀8=/#t OaB6.ao?_Ŀ_e6&ab fY~Pu@)ϗTEY:iZح4o-}Gf|g+ ہF4[ہ2V SOLs;!7oex'V w9J!*j@B@6P'OIS.@@E/W >rO.vseޥd/{ &𢕐9=ILS`^&ZE,hO,HLeA003G 0˄vů ( qq&&G?a \nh@۲ 0[+P/<z 3u4A$Ohh#D4 hHC@Tv"Z@;(HLD;A %sXD6Op.8r7ʉ .UuP<ΖABPnH$=VK 4o .?̶oa`1كq%z]W911vG|'77/ A$rҀ:5ykoDɘdV P[I0u -Bn1FA; R4"XEg hQdHܨHk`Mi.~p={ L̙'I&A "; n-$JZ7( Ǣt+M.'b p>Y.t\~1\8{o$u \.a]Wu@'NCeAEtoD̛2ӊf*=KOaa;4b6wi]#W0O0#p #eLA '+O u|k4Fa7Wͪj=;K\B#M~S4?[NS]1c3#t Hu_ʀ` L*ӐV$j;NV7DΙ(wdwIl}a d} mDە" ҄v>${Tyb=B$r"‘I`/sә'u,&eP0 Z MvPl޻l VHU@u wY6@Zhu& lw]̗Sefu\LQ3mu(솏5-FH[l t?wY:Z\I |#}3oSlXI$/Q3ༀ00mV2vNvW F0.~lX+YXӃ:T]pE79`\ RtE=-G "F1L*(yKZfik7D)eON.{-Ϫ:GzBwIfric曃 ~gؘ.{4RA旲] ,o\zIMA ty(X(Ko EIHALB꡼@p&"SQq M(y@I(@@R6.ڶHs@&O7) T|Z6 SEeD陀 ,-5帒.I.*5Q0gAvIET*gU.LU "*f Uhg؂v_.~'tw2\ ?>E>){¾"9lCȑ{Qxv}֐\`!s)pݥslGt neI/ s%xYI5Rny>`LSU \; ""n$ Tsz=y@1u&? V\=1p,~Eɍ3Gp6k$DU2&EvDrEbdq& S\ :{)j]oIM&8CH:ft?d& Dlh JṽUCi ex7)ѳ~(a1ba;[5>xk#Lk\Do| λOB\\EI(6%hR$I Mt#`I!ek>m8m08ÿ+O~#5b" ˆѤSBIp%F412jv*$(UrnHդ_U8ߺ,I^ ˤ$f O?d&D@% 2 }M[-oAYb@ְsY#[5 HY2\L,@?ej2LFI:Zd/jMA3VݔGZ`d$il'(HKjl#s"tV vf^"ui.H ֦d[(}T> b 0 M, qQ$GI6&tHSLG$A2I@Bɩ%1K&L4H*"`Q !.v*#RA6h G¼?=?ǘu@  tBc 6&Y[ x$PwQiGﲜ8tVM~+2i &ƲM"3@cD{ {]l.jhڛOI HZ?*+ R&Ɉ~_U}J ÛSu=Ēe`cO$O'tx7S|t0Sex9Ҳ>2:s9,fb8i=꾿w޳:pkt 6 C4-1i f#KX`;U65СMD Sj D֊u $wXsiI5[Rh)Zd7͔N6x#|TABx;ċrf6Z.e^c) "L*vl ndmW Y&w2lWK$+P"HEvu,St$b`vY}57.v4re݊Ewe9 c^g'Vо75p݆ZYB pL D/t@'G" Zߺ/'>4H$@"bp]Rn"EBY&zp_Hau[XlA$(d4J`nSʴp[4jG;=D͏Z quw9l^lGC;_e@ S?e $7+:cgFk&a7wp38sɓa[7 zUMqmYqc ,% f`0}&=j^J +qDžN\g1el{FWY/y&1Bt6~ ,VMt]hu@*0!\Loz#Up3DݍLb"#rl[$Uf'޻ & iy0.6ȸBH0GڲbPhm"kZ#qMr9Ya;l EAY&}$A?1DH{(LLb @P5]_Q&D+- pMt Q-1( o6\zw-c 1'KEɥM UdIib?ϲI@&;Q0`Q)PHd3It2  GhPkuT ȉjR=I"$$}Rٝ'CI琇84D>\8PƢZ`HT1cIzVy 깬\|L"wcuq1N#߭tZK` Ph('ub9"AYw4PMp3ڔI ~+ wvs)ry_41v7]2Wdԓ R@XfZjbp{p >!ADD. #l8.vY' %vT ;tI=$ASqe f3NVIvЉkGpPI4Z LRVdh7 2&=T.D6 0EdQBw" 浸a5"jE4 TCЛR)qZ֜wA1 Io0KZ|&8lB?I$E=HY7FCmQTmUN?­3&n< iL G?&jʋ$H'],+i )~%sDr/yh4i&^6Lc(uuI7M穓Pu!eKk鴏U x$] ٌ.y֐X6D FbI?P/?Oc[r|30f>i >pW?Y|Qyfk @բi[,@7y+$jne@TiHT(" ɤE#{M*I};; t0BVLRiiYq" "kNL_uMQ  4ÃIL˻ ;SpCa*c0g ج/sN-L,pR N( LvRu4FO)nF3(pskZGq>k_[ת\Ž5Kaqrt  w1;S0 H̵ ~>7x 'P%@iptH<c;2KBf(V8,Ѫ;M<Ȉh$Ԃ2b;D Hȱ͂`~~?xsf& tR/38b9K+,s &6J12cb0w+G88_ .Y<>P4a1I5M|Ӏkji- "LR)6p!DR@"d͔޿]ofW  ښj sQf3xy8@=g.kn9vXX ~psc̖PDPI1}E@S7qh@%Aƒ٬G?  Y`Ev[u9(mcLsaeK401ti"էuXq]6I\SRH$ ZS8J\vo`i*-?k}zH/Gf:vS`|fχtÀv\]O7v.-.N<_^>ߧ=[ -k_62}_?AӼM7OqKhBBoZ_Tv%DWZŒ2HEZYE 3",/rab74Blw)OO8YsB7_5|RG,qIM7K'TjӺffS=Uؤ;+8N6a>HHTqw.ֈ&€؛^vL_PwP즴Ȥ%s`@.D/u$Nzj"Hq$(#Q1W>O 1qZ{u=' 3cbegQ, 1;(Ώ0jKH{>eCnʳ; Ery t‚3ndU6״w_$unj,O5TmUPڊ_ ^"V&@{QηM>[bcU i"HiA0n)iws/?lRCDG).[2MXv;%|ڨI װHPA3G'H)hWNƪ,s!oq"hW#pQXF=d2 }"{()84SZ[RkPvCZHZF A$R | &1y\x.l֫H>YAEfÔ+$mD?cd= $/mHuPDM "i:UZ-Q`f_`d\Qys+nٓaYF!.$85:}JK&)tcoR@t l+euPʳIAZu6}7Z'[G {Vo('y@p FCWdmAX#{XU&"yI%Q@h;llLTdHAT5mZn iix'I;V Cb T ߀l%UoK-3^L{}@ 4ZH'TV6'RI:hO63M\{mL  G-I0(4$U\IOʋq>IqtAEn$I"Ij*jk-]R[NvRZH .72! z -n0~TpDމ Gn[s34\Qz$ӫklȎAI 0Lœ  U]tA)*&Dqp R,b<ĺIMQu@ڻ$"yCh2ДOÉր&an j$*8CK[$tu >@(gLNSzZdy]3Z:k(U75R{( ->{CBc'i\Mq,j[Xa1$WUz:A8/2BNb1wy.?t" DN )A<&ʒdm7D* A`lN=(q1\p38x8y2."a켹T$2dou9Ă<ߪȍp層F RV>YUSNPhZ#uD -0npMR 2&&"=R.AkUIDV,EPTZ VE jABj;ޞCg?48@ +F"?)l̂ ._C~zw*3@b4cqJ3b;Qk  qDPb-CŤZc]k _7N/-wLV_Hl@& M Fn@́X4ZmNfOWc2vpCH2iA[@ˏs6T.܅4kZ4‰&m*[-V.@FA[[yaHfdz( UPcd ʵ@$^BZZg ~V0g:MRi& h+sؿ#C\[ĮNxYaP&i7UkA?udS`QhoU;j'@'B[rlDי7P hJO" 4SS a`cePLAZuAܭ\e\H2k(i:v%TU.$m; cUhƗDä\ sLl9 ]ޯ7RfNy[PqLwA >\7f%׋wyln%-,C֫w@n"f@`im5 p7TD);'L 5`>"DS"d!oVbiIDS$[R'f%C ' DȚ5F"-f5h"An]sG14-}\ Wg1rLbfq]tfrXYZ׾|eb;Q0!ačZd͊ ~D.d$ ($ӨoyQIvQwSw.!@ lj.tabF"S#G5)4y6솴1<$@oyTRh{XtO^Bv& kZ&g.1r=V#5wPSq4㶥8l`sK\Z<td]$Q3 0ty`n?H -*5F,VO˨'um`r2M7lH. mICTnO' ,&%p /"$qAi&ò@tn%isv]Χs,0g0;ЁG? ~n陥iE7e@a=Apgŝk oWY`ϟ ?^955I?NuIF30hl?[Pײ"BsЂyZ E MqMId+~H.TȞM"eTH[դMucb>i $i5 @4MԙKORMo$ C$V8O0-Eklh(lUD FAjK85]֓:]74 8( \BbTTӕiSv2\miv߈373Xrt^p"f^JH.4;.\Y˶\J39lL9in 0AYO+!bV̾W$ ӭtO9;bv#52 e]_C4#dHV ZF2=)<-=2wTɟQ+do} %LXljd$JHq2苠Z~`JPZ?E: Q !1ޕ@^Z~AJk /' C$גUZl:h6Hm( KH0 r 6@#:St&k3<,6hcDO13^X,8B̀$#EdH26ALHDCPAU˃&=-mkt #PZku$̑z&4M 1AU{LTj}YuKD^vߺCPBZb9I`K[5{/~ |Jc2<3o^gWSYf~F> !~lĸ_ܣP&6nAI*~3*$銀aj%jI׆} PbyTsY샼Mx >l@1.9#~PF ǢEȯ Ϻѫ&0‹M 6$ :GiD iG&gU.i jo~P <1pϝ Au|("rg/gxg&ޜfGbOODH4Qi].f)HTC q( </Yԭ)2Gix1Q wYiDՄ&l@h Wzo0/$U-6@ tq}DrDP}Y˫wm545Et0#tȵ,N?eH.2Wc7 R V G02'Ы7iGaQq\'ak=n~]dlM.b"I { m;A@5B)kh\S%Pf|ݸQp2P\hZ{iP1SdyQgS~mШUI(FThQx4R".{~#x Ӎ{+ֿ=cFKn! 6LUH&,4Lrg@͗f{<(UruENM:Ӽf!D*4 "9NW  f}I0n[?9lZH@1Y$V0c<5M\A+M.eeఐir! >mS3uT RBR[%UZ`¢OȤJB1D˿e|,l1݊,{[]%LΎe`Nd\{qNC^NfX"bvnpT"y ;mꫴCG{(NtZl &dL# ޗ8xW3q 48gji_8Si[,"[cz5\oI1̐+i։ L rNYL6.|DZNyޏ80Ϙʃ#. $EV F=R\g_DBHH㺷쨁Ho`uĩvBY &@0`r"bE"Il^JϵAFɿvq2bf:j]7~Q QlGZzr[^]{_&Qe @,= 3숽I ն@|'tiID;?y$HuDWktT6VITЁ[fHV-1 "FR>]b (TM~. @֐yL;H@F#do't~mi;-3 "Z@zfsӺWD m`&.ֻ ɰHm5Qʞ<ˌyXԙI'A?EiGndQTCH2Ht8NHP0lLTp@JQVdzz.I(v2|<\#ߎ9Y±K}4ֵ&$j"&ەs\\M\DԈ1U6aMI*C\aGP5(9[n$yV`Me$^?24/q[=5.PD@خC%3/c1t&> fc =/58gdjq̟aM'ehdm&J$.."+D O!L_jh{! RJi2@&Ys(.2 7 -0%3R|t(&^BL@= f]Lb _7;|8t,[Qq .f}v =}O-~NkgE)_Ϗ\oX 8;«Eh!d4r q>PR/(R"b b IuH)p:u Pym\A= HiIׂb5.)1Bn )&me0~^=G7̸b ;2"&bl Ѩ\SZk?e-'PpMK_dz}&>o7ߟJSS#8cw`A}(ȏ˪4GH* V"7R'dN$u1LqH, 3>ȀA2Ϫk".>X1d\Z I#ZA$3-Yo.e'*k#nؒ Fi&7\5&k2 b2iSF. @%_Lp>du % $V!*"G顐DI] 0[Qm?7i.7H-ziA(K6D€M 40QJ@NN~=PGi"~JEj0xMbik!cڱ &]z5017 eHm)(pq;R,A.&QqAnZ~S8\d9H SQ-"_ $s >bx8.avTuLqs% PYtZSGV} 7@'yZlHTk'>kz)4Z]S%$F H*޼#T[vPG+8̬} Bfle~XikVUX<6L̉?txAnM&"JK`TBt҂o@ɣj$lG\lHM#x 6 UPImNꚊ{T\] ,o~^ƨ6]N;߁8xn\ G>\ZIQ 0aP ;jJCL8("HEz#7Se 1o2$SI&/Ř F[tUă7ZpslepۂxYvikGk7+PwDZf\ ?XCgL*m5S'7&-цhfiz/؝CxNss8ccz{!=iq~ p ~'"i,wq0 PZt@ :BDQ'P&q4e Az#WSj`Dn&&{)HVRDB֭ە?_Ncb lWA׾"uvu>V1S`|7T \\.%.d2 ɈKJdɉ`:`Stn)j0-u>RiInR ^bjg8E DSRIU@Pm+HixHڛ.tk N|ut ՠ\1zr6Q <`.VEQզ Є7$rg"73n. sCdPЯOz`e乸Yl8lRI~k5Wh!+T,lآTA=@/jYH4:d!bf;>$Ac8eMsCGi$a,7HsMvY$4}'DDV,@o HVCVrc cz?SNLTpi"޿Zu`.A$h=,Ef\jXII6H'IV. O=:d(Q>ayG "? B@ qYE,!@):`ڨGVj5Ҳ" )q6G0$O5@LICDj@ R[wYG<&I*R}DCH07CU{(IW3&7?d_9ɜëao? px3/2O pl'| -Xp.lBMo*W<6 f:NS?`|qil}G3x<qVGC3抛$?|qb2.9M5+BT$I&`͉2q\A/)$@ @1p"iY_ۛzLafh5@ $ I0)zd&@ l왠P?p>ScDDEvP.4H[>dKIiЏug; 2qzbci+%6Iw"V|#s7 u[RYuum͌]ޟf9^eq5 &Lǰf醷@?}'zI>%gMgS_ĠE⮩Һ׈sY[r؏.516Z/Q,: kb_HiKw@̑24nApP!DH("5>L6M\+I5VmvL=V$)T .LmXt\IG@[' A R<ɥe@y3Z7)&M1EeAq/"9LDsC{ln ɤ(4Țn$f/7A:?T xt}[-  skZ7ipIA`!vYӨ'tHD@5#t\ Lo碚 )HA)"ADp\czQעE}Ct騒ip qXL A%*RgT&p$&DxVn"Hi|ǟz-!ދ0A BW x;gz&_ HvȧOxg+l|Kf0@ubWFFƠlVEi6+@VDG *fJ(Ic0;nSh'P3HBys@lZW2!H4>,X;p 1 ldŒ@ TPU-u@[MfF@P"t[Q2I.&I7c㸍 5SFh{I.u 骫y TӁd~h'yRlؿ?4Q97"O֕T .L,!Sb:w?cmƃX\DKЬ<}֭Cb{zA"DDPv*n 5Ek+xX DJi"vDUI..4+DIIis¤S̷6⌳߉Cؖ`R -#Lme~vhk@EDSr2{Mha|84ni7[214eKj!4#u ``QZU 2A$\⽔ka"!AUbb tQvq|LXU]aH;(2Dx.l$^=EDO\6 4hQr=d1Jj,b[5N1(2L2.|; wN'^Cw]76֋< cQR9,\g-iv&#rv 'L;.S{l`:!lcmPaAN+45ʙ"}vGJi;ɒqڏCiKLM.tLVAkwO !S,ubҭ;TLՍ+Odv'HzfIQ GK&/Ct|]Ϸ)H"e݁p5Wot~԰2y<31DO|ozfQ]=bS`b;WEXgo2ʦ Q SIbUC2 ^φ9^cv&|M-!bWa8ZڦAD">256D >17wIآ+OI$kR_%"ҡNj73($w @ ̐ &]iUAi ~ʐkeK[&F&+OZdyPD@ r5!ְ =aM8 [-ңu9Z 6Yun77I{%O+,? ??0O3fx฀&.N"ԧI-(@DUk 0gO+998Lej!p(N@.p3WT L;-dO&w~uI}X+&Dn"-biR t@d{ A3vtIe+IUDR~YP\D2IPԤJ6}7 ^4Sɷ3qL5{n~:nG ez0tpɃ=LuL ^gK, 즸pk̑.Y đLEl_5%o:t;~VL*-JmtaR F c$3{$I m Mot<k&Wg?"Pzn#f j056NzPw.dC {vҳv0hh2D  8ؚ.2t3AL, lq ۅ>lI:F$W@K2dFP?,4y"uDtК& ZWbQ'ig+d4"I_a/z^\]؍~=N#Z9+rbxFW 8cr/x 6%X8'0&$eTe3tڅAo„Dܢ NGPɗev0|6iڱ($JzrH 3#ARh QQhA3&gЭ5QԨmCjm;stA2OΧ)>Q@AG?¡X` $7Ow^1!qZ$[hE@4 RD~VH'Uou4ȡ?]0Ô2 ۅ!?<4i=*Vbj7EDDFP 8 Cg8^|Wt~ Aiegsof\f CCr443qaA.3LB]VQ|MHB FuEfo$4?` 0 SPG7W d1 EW(ǘ(i nڠL$ V4S 0 SD & EiPqW@t$_e6@f CͨJ&{H։`f1ZVʈ^Ar:FAL ja@R}$7,cl0.+U DĤy`y9t u?fK?k<&j |L`㰱0ZPD'˿F.pd^:O8X$Ϝp4z_#%IV;dԃ+F#8C;IQKA}"V[W"G Z 8&M Ts̩\;d(ؼ{JC#Aml@@"ON "=TG <ƒ F#LH#_ oqn6 v +A`tdA{pGpSeIy\H&Y.Y1ke,3Yqv100cی]:Aу.KY԰]3+83 yI^]O} Yf:1Sakou,s lqE.$Ϻ\SN\@<ŧtLX+n 0UHD|(a A&K\ZA@qwh'!ZIrQxH4@)OqfN-d!F0N (#oXI2A7I"qu{DI`1LNM>:_O/ߔO&q?kXȐ$ 3Ȕh$D Ϫ&5A4tDi2otL<(d-nt$?`Y78Q츴 :{m kdV$TR (T 55Dp2! BD&85\L`9 +1]N6\`Iiହ7NGN( T+@Ʃu<>[hF&UEm8P1Z.\+%p&pACI@ U׃ފJՊŨFMDs:TD7dɁjÁ)HRk"D;iI4N) pIIlAdAgSVռLpdA(IQfƆu6]ĈorE<.QQ:#eiW&M"N~~];5meu9#tV*[k- m Rn[@N] V>YY8:iC"AAD $OvDRU& @q3]{7H1d a _l)qxQ3z wH1X&РR l Ž he  yA$I$5 eyKN(o…KE^@庇Yu rgc|xt~_\[[y=@mc0ECa Eot (~\k@ I%,#j M>4߅'Es? Wx14tKDT~n+4=ZO#q1󥙍@3 4P2?UL CU90 pg:H%^Q$r8x`dMDSW5oR=)9Ϫ1\}DzAi$HYIE;KaLw\dU=M$(IPCKIh G ?Qm%; t=Q@ %kQvL $6eip.zz.F0K$LY즈 WR#Unw@RIPid O F(7̀l{˹$ȠL)I3u8OZk ؁`퀹\e|X!3xXaخ_>>O#ah0ɉ-v8d4UQ6ߔԞ?tΑ;^i$TVn$bL1s}$i2`-64]PI ii;E1"DY2gQqRU~I d4x-aGI;vGy(td=k !.SImbEdЈ-@#>+-\6>s(0 l p7QU@2`Z'u 0Lf#Cy,QkR4}kiZbLJ*41!j10 6J߅ٌa N %n84|\L\w44LcN5G  (sDoD( ^΢i`ОTEIRMx$f? h4-:EMPnhO/|:.|G7c5Ǻ>,:n*عӇnbh8A 6b{$DL Ұ4E6"/dv1t77.EUuHH ؤS&r䣍¶EA,x@2c)2v1=D VT.<YQi-!DѦ ;4ҧr@d8mI@YF+?n?ޟl| b a9aśfH~' 7;xg|к^Qa \e]t;@4xp Da|$ #`Dp0aqdMA4Il˓ԟqDԘ<2G1'[2 "ܨj d2jIE?*w;E7A $ uip5&+B}Uh&LRcIq(&@snkQiI"H6>]S Ηsaeiu ߊL͓p5yu&bHVdLDqڱZh/u4}hD]dv#]x0#* S*`}wYtM/r3ęoh Kng[sߠI؅FEebhI&AI+?LiHҒMoJ(֑;ҊDFP Z{DuRj'H&*"wHN, ƕCj#TF&n$EOm=P$iܠLcf)5Y.tWi;IPmإve`0x$ .1( i1R;^U hf S?I%MyH-"o]җpAa,'{ ZDEl@jD?DH- @fy*=#p&( iT("@ [Mf= 9< yKtj@( nRfjwDA@~_n!11B$6䤝Hx(:} $@#rT#q7THLȱ7Y}kOzx[2BcdÆḴ=כn<2MI\ LTrwS]^ }hET /5?%"\$\vonw d6Cw ERSDjG-aQ0*v!ks$&OI3 ӾK*mE"eNGZjWr$E'6SeDSPYvYqs42M ~Hh2 d RD+@Jox=?eG8M`YAw;~>F7Wn8OH_2 ASH{➛oSNQV˵0Nyt (.FF;( ܧP T:Yd\"o"7aߔ ht*M~;Xh\WƗ6D\J&$-4!I; ۔B84$ ?pAI Lv$` \=Xw],Ws#]h pHY$I 8 LsdI)UAV@6 \QY<ؐMdvS$ laK64 <ԓKmT`_Q lJ"NH$yiSΪKGN2bOrR⇱aPgtɻ#?8ִ\3>y%; ,0fEd"!'*x >I|:A|*TP uC@'CL4M*DžH:&@S&AhouH n%ݐ`ʦ|/i@>J, \mt$/B}?4ީ͜v&`#KƖ_7$O2`D*Ci[x&LA"w@2 P _t Ā9H`4_iῆ=[ !YN#11tϲL7a`ް_#Hn0ZPtY)hpOH0څX;!"$$, j6]vC;€'F<{GݗaӷCK0ZWP7%|[d -,qz>K;78 ]{5\L.0``'M60iPmK@5p $XG[ wle6H4[h&k"L S.)idʈk{QAŨA> &D6DV)3 7SL*"1535@~ɩ~+O-b&05e-%] `]Z NYZv-íK"&6+qH cة\F`WQ.*A>05 11J%R M `4nh-][G|ď}7Asky:e2 E5 q~(]Jfd_TD Ti,@,d1YPl T0m`T`@b>DPiR;^ `no~ f;,$Vqݷ\p f<Һsa|mv_Mˏ bb5u`?-̜F9Yx&V𝋈֗pعwbv!04 -~Od52 }W3ճ;8G]0H"$5 $*"i G Sɛz N{tPLAPiSޗ6UqZ*'qz:~C)0Ƨisˢ yz ]ӳ]G3rxgHkVqpZZ -O xS}Oxnu!9\ix/1@eBI&?+Mf108v5B3N5 v+ZjF!yޒH|Ρ2D9$%TL;0`wY& CuAH$4i\v˂!ҸD}bLPb =ZBwA7<CI-C3!v[ 0kOae9"mSaxFo=S16Sa4;/~?Z9Lܛ-I(-SXeawr`;1ۺL#1sG9KE*=W\5-`l8\A!2h";*d6JmDwQ`Whdhy]Ť!\AT ܃eđ$RGjpH/HrXbK+iU ̛\H ^@c懰H;Wx;ޥYLg:\ñ>!7WGSvw˯\v+ʻ>: ^a-3y^X7 ;T@+usP/I+<f"LC vHY"#*6'x܋LQ/3)‘1#7KZ\Fdw]Idc[ш _4+qKrSG( DUH*ɯ+-[cMlOe|&[1x5k^h53^.P K(& ؤ4&MXkLT[Ȁ7A0d1V7Y#MZE)ɐdPlATAh$ɉܫt,Ôf pʉ44(7.KE pe[cu86 \s pTdYI#I4Qa LNaP *{uH@1Y =R=2a3˷#]M dҢwTfVg{-к܄SIsZilNePR`*x_I4 &'tG6(5kfǃeAL 5$[(47QHa<ᮯ⮿991@Lx=Ow"^@Ye>&FOR A͹)[S& %Af% L7+&d$ i;TIm^f k+N+uk\M9xڌv6N3e8g HL)Qp?u.l: N`JA-)LJ$[*OE7T@sc`a`.lV\&$M@dHB+'. vۃeb?$6\`Uc$*Ka!2Gxw DxI8lڗX d D]7iHFՅQ$/;ǡC1 ϺL?DG 1 1SIkΒL}T5Rj~9SHA6*pڛ~CLrhCt-EGTɭD0 T$͐Z|Vwޒ P{8]FPK4`7Y6%j~g#~Ak]|C;St\4KT } ԓ:`nyIdN$@q1UH#ʤ Iʁ EJ处);I5rDqu D-1؀4Iq.8x̂VM()e5A+xc9h H""M{-0v&xq `&`.Lvj.fSvnAY@IYi E9څG< X(ĀA@NEA[޻'q$֝dLLAT w{"ljII z5 yYT^ cId8 Ly`TV^w'eTLG" mTL )"h Dȹ55P"#E !eM"Mg(n=M2$f9U@^\8o, KV=(o$@T@Q@y̤t]@1t1a:+!y+0꬚XK҈h5]60v6l}$s$6f x DI/L^'D_ NT6!yy˹阨\ca6#Xh uop`e6Mn%]#Lj>lDTQ# ./1c$04ouwSL0czM 632ϥx+><8zO~c2q_/3:p]B$H11XSwݔ@}U'Ts 'j1LDi- LUqm=+$57:H&k>{5p0- ˰a1Ǯ$ԙAhv&EZ Ϋ^d- [+iQ- V(:k>e<22"6=nT!2.Lb0$ĄuIߔЉ#zp}z"i?;gܦO+0N>iسbB֗yCP@ SI4'NX&RHf4;V=z\֪-( *ٹ  3ҒM UF.EUY j}?c_&~4CߕF 9Z@8i$QN.h%t۞ .VϢM( بl35Y )2b\u U&? fPLS~A5H :@m'A#-0qY5|mPL>}`~daMEBgb?xa?3 w6} 0I>11)iIQqy=i59^Y^fq+%i?Ӈnk-?A1 GnGYV)KF \ ?e%m=$L~TF$" TliY cV\(4T# a6_Wc=,q3L qf;_3Sg1Xg@vt ˱be\-vŴ+؟1a R16 3t5Ť؃ y.:ƣMAN![Q,kq$.: [sM#m„' $9KL4SK&7Y EaZ;Azr.t:Pq鹬l#Z] Z~csY'\Q4?e UA15Iٲ&vY!2)~D{]o Ihſ)Y?O긟'(VWjW<x#1<_C0򹓏ZEK'z/箛ӝԺS?$?x/x'?ucvKqq|&hAndGWQ?LW~VCDH6\#}*!K4 ap= ;LW.L Zt+CKP"m@+2CN£PMQvTjH*=H&v^.Qa`sH/|'/d2=™n45  yD ɕ#Hu.0tVIsv@yZ& $ 訐G4S"geIAb3;Q,%;6PsILhH 3@z.fK2)U% ?tviAə 0;M1S]c$ < o\F%j8Fg(E DWd:H!j39]u\ {pC>͓uKds^o0=LːF4;/̺X$fq+-:k"IX@ДL؃HvZvsdL+pZbT@IE7@;5i$~U/@&B|X`X%ه{Y>YcR.LQӪ&QiZ\mR4H(=)&#FK804˷\`b{E#a1{ \^VhA>Qv[L5;3~ ,CPn6g8KR6rk1dÝV3Cq0Wq7^5O\}=,ŒjMC=~G6!i{E خD$h2M@s{ v&6P2@4N0CTJ ncTD6 } l8]~[ F#KtMMI2NBY^VJ&77I6H/cOdzz:fCbLII4%v.xO~.KduLpym-Q/dOqxp+eˆW^ռu<0ǒֹ $j'Q_0YgbaQyQ {:LmH!BZDChwɞ$}pk3бz77k/,B 7'tok@9sMK :{ĐR=Ll&EIs?sO/baj鴍@s5s\kqtQuhuYZa".>"[Cj) T}a!uHgj Ri7(-IR,E7)HfxSܨa^X@&bϚl$Ҽ¬n U9We㞄zx &iT~uG73',U%eZ & ~0P ~[cAJh-8(@LPci~xf- ( WjN"MBh˔kKL"4Ǣ13KbTZ@CDn Ot;Zk&!kI$Emh]ra \V5&*:/[8m-o"\t3žbfGRu8״+O57I&U;Jo+1֪"Ig.b({e{o)~[1oϿ9L.3#CA2P_170 Fk&H/7UA4kD`*Eo0Ć쾯|7_yd2e4gMrY- Zz.Z\-568IrdTm ?K#X44A"7]Ǭ%gtLTN L2 0p%HѢE r$R7Q@v&MDɘZH( B~IPwHxQl4Ck3m-#e H'-gIB#zmuIܢj}iUɃp V/8;͕?/dzobjsɍ+@1i9*2!TZ /RR"A\dn+y_G#3}0?p+ E]LR9Ll>I>aA2O7"'W&{X˜`F:/_ `Σ8=74f |E*,Qė4z6Q@ah-@z]f@pئd t.7+f +k|/gេw,2ÓkO-I"qq0.l`Dqe 'J>.<1"k|<OU,gp0St+?UhkI 0jb8\mh*$e6`C]+ۚFbXhgK`TtSCDkrqMcC@o!.w:? |?31p\ങ @>=[7z>b5%tH$Cs`DD'j*@C RK4YH5n2#d4'" CD8D:5Cf c1E.>`o뀊H!:LL\.Cf 1q00:\l}Yce#ùo)S/qc&.jK.s, uO-n> bn%y;F15TMI'qH'$I&h */!A /v. nm|+r];7n%Cؕ9`DWe iZm(FW ϿtMր ;ȴ4oNɒ&F 7*{j{jA vԂjSu3+0ul&ab=3^??܇UC ن˲m/Y|Cte_ 3Yc5f2dV_y빌D;%~!v~d4;A+xX 9dz\{f]׈]b4FLj 7E΀)=^L_ ±Nl ֜TQD`HZDӦDD05<&RAQ k<.ʛ.dܕYxu?q׺G|g",LvQyL҆ [ vo?Ηy{2p!v_:IpnGY$v "R2ʖ<.L:wP7D[ցnA~yfFo)db༵"˃=3]O<{\I'uT7I~qZloO‰*6Y1<.V=zCP AAbPHweA;+AZ3bM"dQ`lyyCLDBTr-w5ڱ<s39`b=ZL-:fc#cqEWMVIjԀ$I=,1].M0놴.M ċQiŐ4؝$Zd7 i;&oOqqI4h^}f7"gtZQCSP]jK@7ouVCO" $V% h@:GmPuJ4 H ;$O @ AAۅj-3&$M+EDEDCd0=R!kAE&u+4 Q.%+DM+fg'40Aud$uH$ ^-TH6&M'HUF&S3_><oAmla"x~g |wf5$i6HtpT N4<u<.L/ }WFש\& BH_?sƧ!4KLn 򏺈 i5xʭ;Αs^39dbfEWT`͑n[pV#0!a"$KHYnbM$ TAmdD:BZw>&9|>q\c]ǰ^F> 1]4W$ KI괠f<)V"BJMfYNsOdw@e0$ߔ($ J&ddAqKLދ)晘~VT8\+5ٗy'~W/R׽8XZ @d.,yaۭQsi4" 0 DN~,cR LVxPiP0 ) t>P0kDD}rbal&Ѷɤ+PK>]o僨Lyi.q4e -5 j@%i#u 'eXx4ЀM{&I  ґ#Wĉ{^&b`g!c`gX*Il|4ayI wCS鬧Vy > Y @8fǺ ͉o]ZMW,>{,5zMIr7y`@o _=G}Ou79\G0 1^Xdr.xB&oxQZ4o#VDW0CH塡mY@C@ܔIpP& y$e#BhDl/@ia1 Z^bm(:\MDվOY,;dWkOįGE]zv[hsPh&b(gXts'*iTjcxL(* -kL6  pAE5 =PA Fc&"Ab.L,'7N._0 C.*뙧;}֮<Å._R#P))"PZ\ vH귄@;nH/z<|9Ӽ1沃GM`WWx#SG^>Pc? pW̘h"iÉeFERho47Hwʉ $ d5G(;I2#RPZvHsD$˝$&},5ܤ 4iAAu Z6(30I+@بfdέ 7 5I%eMU"43h&d E42a{{^ tq91}O*EgS9Vce`e30,O"NN\eNkdHm@IpA.r A43u(> k=3.#ԯ'Q3&Xs`"7\`79Α$> j#@?\gYͷ?!]-&.᷋<]Jul Zri|7y~2_9Բ;`Apz/hkj9Do;t@dv)D WUipځ$t%ST4) &f-\;I q$l.4baCT$aB"@eH D}kjj:v\Yg%L." `7R "t0"*7\ؙlL 8(+'mxQ$4A=%u?A % ҲL!\Dbv1sDHYh'bNEgt~p213li1$^qO2-‚ TAjaʁ#jEyDQ3s1q03 %A_AwمxX,ӆ1\0P/s1K\3Q6EWΆlTHh2cK˟Wy!dM{&[L `$H?N+ 昛\*(u4/rASuwO< ʷR4`|B-3亖&\/d l3=L@w2iw ./*eX * :$",ʐ &BiȚeƮMZI3̛(& ^}KDKa ' .$f ;:luk&%M`&P@HP0& y$F,.-DM26+bf)[!ʑv`-}Bw&_5RB 3TnmQ@2#(A75%.mm_`$ LcD:"ɤҠ?aG&v]1AZhy M䶪)*MmZku3Vڋ5heMcU@hH+sa=Ѫ9$iLE?܀D @ yXnUT .\\.8k1iqp6V0)1<߲1 ?UtRV@J"wyN LUP $Ipi"G^Cx=S4fY& ?rW0֐1M e^+c3xSOXۛ$txo~C+l/av71`F; \إfB=bcz ڡ I<,60+MZ5Su Itls}4pq6MN,$1oP~[;<\2ZXV% _ OPT] 15 q 5־ixӷ+ bi1kfXx8kĴPp!$"`QR'S;Qra`;`hXO>q!a dP0gIs(%{Gt>PYXecT yo-jFaI <f! @Gi("%\ҦadD@)sZ7u4&)zJ!J<ڤaZD Β}P*6"9 Nނi$~LuoeO?xn&an`.9ǐXM0GyNǖm >%'9<_57^f6+q8+4x$=%z%$#p36NMDm‹XkDlK04ɤ)\deuFtz[\&=טHsj&$R$bHIm= @Zly2 6rj1I5kl4 l& CK uxR'Tdک"bI1$@,%|kG+fq0!- W$U'E"*MD!$֛ă*jdBDyIfC~@JEiQ0nA&_uT ރ4|5㮻c<|8+:H5Xڶ]._4\cjZIV3xmq0 5 Ūk{4,*@A]w4$j("Ӳ;QS0O\Zbf1&3L܉H5~ʑX=Ѥ<@ pk2O5E""BWo2y<|C毡-.fYp_(Ih5T֖jLScm7#tK P<;A V 1&-$.[H08ZB"P4~Ȁ[SaEB]:-Q'ː8COԜL V 3)O"*HMA&@&Z Z`I-*i0Wr_(;ƠH&x}!yНdq ⌸tE@$N~5$M+(DȐiX53dTfPHq$P@2` Y@˫@1eV4 :Q T3M$b @tHѐhA&GR4DĊHQ2]&K$r9Til 4K$l9QT &G$@1HTHVo0+E$:$}8o8fZ`Ь?4&&o/qqD"AZ(N Q{Rk5 s9|96 Ꙝo=ˌ20d4pm"A M\( P5RiJ!H:]@ 1R3MwP րVIە'ry|ew :R,㱺cdĸLgY- S[BDB\v㉐ w MGfs/9Lv5c{ߦxCD6dceqZׇav۴R2 7x( +^T( Y!ڇ}7|u< Y;iEG]_|I1|E8Yp~VZN D YOD0$@5<"O v -2 Ȃ0gI4& a-tIFxc '{_A{DP~48Q"{p!`= /~|[? ]AO?5`hMM_[ys00myot&1 "+{U ;'_7H\28SѺ=Ӳ]O|fGӌH Y`0߭uV]v3q7]>SbPtd AZ 6%Bb]ܨP8G#2g~g3Vp`{y5k \W75gQx.TCc?-؂ZS]oP^; 6{QImXnײ.ڪQmuw01槦rgf&}'~xOxcPp->=X tl-hBItKPE e"A8P`O]6Hӛ Ex@( D7%Nq2 *qeD 7I"&bPASťNHi (;!A@ 0,hmCTV$ @TM`TH"ԕϓ0Ù8SP˓UŊk?(m>;))CA#i4cX~%NV`ĝ֨>xF$~v3,Lm8sO+{"\uceG*7Zscd2O +^K`h M=Us*$̣zm֨8dc]SYuHh qy B;G#:›T;#C{b%d~&ls$0ii۟4N7 k_|ϭ t␇0Tk7{NObTPA>#` XFF׿e R/H B $}162R,0VO}rd("!@O)K"+Z'@0a0Zq$$kAUlIn)2f u/Sft &f j29L衧_K@IM0(4B$\wDxIӮ^@S'S'b. `Ut,nv_77zP/$+xs;S\1<`& X$ItꁦJBm0 beav.Ӧ@&ceSʌ7Uvzc=Cbe;` ]=[?/qaڈ|>gw8̾96 Hl>C;1Gq7"LJj?Ec)&ěh&`@fi'18xؘa-65_|W̗Cc)9vPCӆ hm+aQ"36QE?s=)\gNXvc {&H|a9~dl|,݆BEkz/E TIp q*bl,'Y1`A=L5iުw+c5DY_^/~=LlK[w{~mcdX=%AW,;Ц+2#eTYAi eR`!ؠ ju(Q PLA`Kf諄<d@kswF𵤸tmrcSY {X2)'Pn./.oȐLh6 :u:P>c5IMzzwPa h" hKNTֆBf "Wg%  5lxKGu8 @ s~VZ\|ͮЃ+Mhr,@\TNrUwI 1YPlDj{BI% vY#&bH&$ttiMVnPdDUWuf@"YȚU!PqSo䨒ɲaJ.\f#LEezf_3+64gzq+s]${$#4ìguM$$dIi8sR{ BdL\a[ˈ8Z4W78"3'"cW>b$B"ʛUފ t4z)~9Lf-]̿&%A\-:_:HS>xOƙ>ֺnQ`?Y:#h"vNEt !Vdl`Eou жTlOKjdxZkEd]s~UQ DH P3&j'HmH6T&-5_yEj~˿zK MLA;tq4DV'bC&A%tU $yZhAVD@ċ3i]SIV] 2\""bhѤbZ"["M)@Dðz$SᵡbuK2!ÌWw1*ԃ!Xc;H&uS|=x59̾/c]ċyuᳶ5u3NSH UɅpKP;*ܥR֊qqt8\]gZ-j fI$cȪA ~QdTDd-47Q&Ob@;("-c|ckPI MըZHjTwSD<&f&$ߕE &A69pQ6su  TêRbI4)` uχ~_2\۵ gN8&Һ⡥8TMBȥA MMi]+6tޙϽ#q]5uSdb:`$//⼻Oy?_;";:i-d|ǘV/~kM 򈲯r (G=WgceXL%u̸Q#J +F5\xQ$:L E*WкWId}L1pA?53,3&wZ88]A\%D"Қ ;'@J}$Qw6@1@cEI+dO H")UQ3{ ÚM;H1=ǿuDĮlSd]{L%f3d #Y. v^F#̿ ii44+ZZ w]-Wѳ$J֢57H#LFBSEO7\nc-'֡lA=A>] opv;*kCG VGMW.>M8aa 5\$@@2 PKۨEc&.\a|F j+0z{]k,t0aB-l|0a$ Z q7}wugNCK[/9?uxCk%ղx\V,aiax HW>,ayi{|K|7}K02".$Apd6rhy*&Po 'I-$:Ei(cHQ!7E Dڋln"I? gz0n[)/!ӕu.̿  $ndFx%V~i >0@X`PUkZDTG*m]/3;)"(fuLf˲99|B6KOj Qr ($mJJm )1pO*&PQnܠ@1 *u{MA MN  MF7H%~A#K A y+ašͼŌMmM#&G N=!@V ZT̀ٛ1i/S&m ;ʹ\ tPο1v.+̹tWVAiNНd(PUɁZEj`Qci7.-0$fsf oE>˅KM7mH(Q#D;*BM 6 Dz!sdDI2;"gy"lk(:~F7E:dqQDZ;HHf{ 'k~QBGtϺM" ڔd6R`Bw-VdĀ6S-lAU̴OE*j@ @6?e649Qcp+cEfTb=Zj(NܨЍ6։%ȴAH-@!b.7P&T֑ӕ=8ѢK8h& Ryb5Kb7).`]3 ~M$ %.]2,Ө!@dai " Z7]  7z.OfmEK?OF2 3YL`f.3@$D4yx;3 cf] 4x$4Y RP-  wRKMmoMAS꺖)lMhT r*a:LK"L]NGK=靶eCjpZ h+[o=;fGW<#.q$lTJ]Og!f[>n$E7"RBCIn S6I!] AEP+2)iT$cts!ۇqs̾v#h^EZo}C˅ˀp\XEA=ֳYwؙ|LWI+w`A0Ge@ԤV 3 {0ZWKi&"-6^;Q5Hs[YfUi,!ei%Mlf 0@._5iɪ'-#@J.`ʬ WD|MDP$wDV d 0q7CD A0UN M?¢h0.7Tor;1>Vhnˈ))Du~==.}3bsXa8eT%h4 @ ;gQ:[I-"/OEtG33Ziԃ+!TZH*HRVE$@lȯuyhA) u&V#K@֐ZmY=DmeDA S KvU-Ev6LB]Q= ZZV%Q oц1@q 2&m)"$@ gB,)axVLaL&7 e/f?Ś ak3w\:y"{iqw"k%D4\/cbgF&Y&}Q=;xC~S7 sX q-i]o0hPJ n2bo,ǜ8hc4gi] 7]wA1nHY$y{-D o(dl.3pZ4ꅜ\@BFb+{).3>"\ D 2[mZY.}2`Rf5L ]3$#&@34DCEtI(1I#Gx"NܩEH6I"HlRD۲\Yc?دs(4[n#%sfhƩT1PT62-i|ռ ,1ȅ?#~(7b+dI_|sށL,߅Rc`C ˄';/ cX'H M+FI7$A6lIH6MHM +nDɋ-&uHs4I}Ѵ@L4}U 1%.h{h 5ܢdl4-Kdh;P1oE3yt (?$H6Pqi2&f}ݵ@S":cA1LzvLMT]BfK&&.-4\Xz=]>w[1ppiK %~yN_ᯉ0FCb Hi؏hivZVg5v'RH%d;Ok57Z!m11ab-껝zwTu <جi#M9eL6;ʫFDTv.>fnB)$FҦ 7#pND(&s*vG-)$&b=b pIa#yϋc`1Pi7I"pAЂؒevrv;IpxN~ ^g]`3 {h_X9.y^qa b4|\.hl56)<0? -!׭mu3ĢjcS&*FѤ(dabA40{-EɒTQH$4ު5wO3|t8s_įgVS_5S %c5M2#[C.Dj r%k 5U"ktk6sl3lӸH7Pi 4?P iu`n*Î㾨̧Ms0nI{~`10ɐsRX'c$OVo5uϗbd.3c?aD͗1 $ył{ ‰ fE?Z)W_ 2 籚Qs1A2A)5.%ƠNcn|A[SuPKX!|@RMmsdjAnz 'P m`Ey(! qbA_?'z?|R~o8b;$@~W?^lYɻ'Գ8belamZw1V@.&oŔ`$pT(ׅuLD&$Z8ZGd6 &w(Hooe5791 1E='Hܐ~CtHE> ®DL B 6T 8w\)I5@cUCy`DMQ]5&E@JC3u8Kk"D8D!S.dfTn=t{Ϻ˘ i 6Y" ,$WnV\L~$Kh- '4a%.$#Ptkq crfM&jLZ%#@ s|S; , 7"bf}@1`Zah ӵn8+0C /DA"1$TVLӄip<]3ma @DZt"Qh)t*'ZOdX RZ OU5+RV!M.+BRM eSW2#f`-Za M3ss1E4~q.TDUӤ= mHKxCZ3 < g%od.:*~CC_D0c0h5¢[h~{G yN鱎RbHeRoSZR@W1$/_^(N'U};/ϗˈm57~K#O xG85׋c,2WQCl4@2*ldē*ڝȧOW ޻COb)MWG~-~Oug&-`J!=gr89@ǀax !Dv R8vDxD*%fd@06MۏTT4OvKM+ZLQ@P @ϪDo?I G FT)"I݄RiSQIP i4$iL|6O m @ÎpJ[n[|a2+긪/4UN^xn戎  N3aN]mblmU~(WU_W>s2.1`=@$ .~1n{ 7qf6Ø,EWWbb;]!$ A8yK A f$Ƹ> AUdEp@=\AƩ3seߖf.-{p3G3sؙ/yەՊTHp 1IA $h R&i~SfDJ0?Vp"{cbc^-3hY\(cdVH$f7Sj2:Z[언D9NɌ<2׸8+]v(lQV߅ ^m1"Ժ'i!iI9P2HZ AT1)t2$Nl!' |bGV&C,LO o~)>%8ޫc?^lTkX,n@$;,Dfp3: :NZ Rm"Oo"iV1lps{b ,;{\o[p'@;}.dDyM a-?:A>ItPbh솊I(lhڥQk;䈧*4Zb I$ZhI'm'W&!f&;_x?@^ilba:m gg9}MN;Y$ɓ@lԒ7 r+p)an1N눉Tu Zq&C`4A]XZӠOhA"{Yk iD7b"t?K`oZWp131\]/RO>gHy -l1q^Q@HkILzБcM) D&dZ/udE/T">5cDzd$V,Mo_ٯtfeKp1#I ^%~qbsx|fiqi'~$jk3u6\8Ꙉf"D Z J&wP` ~4L*eDGZkZXI'V$m4]THb'B#ª6h.mA*I]:@vZx*$B 'cb sh I~$?hT@bA05(f͔$җU P솴 vNy2[5"KE\ b ?$NS %a[UM#t mP61)4t U FOA5?dr O8y>Y!0Y9|<2~Q$7N1KNfM }ƽ`@A:+!$+Qj yŔI,Zm" hD@NVbll4 FQſ|B+bftm-$0Lah'U@"Y&O7i&+PWzZ9|,,\\$r :X}[=7 0t[y` ItԘB\%wKCu 0QOtZIT>@8.Va9}N(-cf)w_|aM9N<_ܦL"^c_˘G⹏P1QˀmS(뱒f:val\,VոdXbqN&3\d&OuL88A> &zUhL'Y)^=!J$X ):+0,<ד1 .ڌh0b;BiJ L;k&I@t陦f2psrue!{A!dCqtB+C`6AP%j ]dIhl Φ_u gvqf { MEp& &]`S0?U@֗VwwAQ"ߕrڑ"9v2Ye3 ; "Y95؄.AQ&$ۊ-X4 ,@'eHT$R?u POYtsui^ h]@ \@ HH+$b 8yED?,ܓJ̈́#E*z]7緦_5Rxn-\(ed;)545L#_2! IhH&*@)c"$Vqi!fIjoxPM?E3fMP=&Z#VN""wSz(HiwK2 އIһ𾯢?)!k)Y'V1|6GdLR`li{QVAkcyUE۴@0@A6QN\4$EZW%&l AAH6(^nP5V Zp"w_C|[zsN_ 7=q=@':^zFk+噇7{/~lVdWe>e<~sML'0]gr1cL3PCN!.i"ՎH TuH" [V Ֆց^#alwpON#36뭄bLI\WF317]R!#I&-L$AiH2%0;y$KLY^g)tAb7 h'rUS԰๚F%*fH/K'if#ZXvo~oTޙ2-kqPQsb;ݩxdKϡ&<;u#*?;, 29BD$X A>ZNLip$]"O gD$&(&,dl pk-+_2c@ zKL5hTŻ;֥v128ɷ4]hHIH#҅i$VV;׵<7Y.hY>ྛmfcq-Q ?|yx}d7 p%õ Wolpbu D6xX0AǺXp@ H ] n_3h:H??ӯOI_-ohĀقۼ[6uq-U "Xp Xԙ$7H RL@ܧI ,ɋ4 lV2k;*NUdBADmSEDH_UɭźdZ&@5&"-&CHI5dփEo-$* ;& D_]ВEUq$$&7|&C0ܛ3?)kB֚lKsE/D4?i3NaCdU`fGXa th v(ڍKf!,/[PAr)&$DH6Z\cYeʄi3EX)D*ȑT-; ZSa…A HPz(O'ԍ:@&f-tA1h&dM.W7bj~@dMX/Xs۬LPqaډJ-Jy&L DĒ Aq߅PZ5$K^ѥ܈Aq{Y'̒UAU-tje}WI􎩚 8,pa|6c5~6ay5sܧ;95$u& <ȫLJ g0q j=Y"\(cI\1 dP{}-0c7H5?j-ȭ xi6ײM. >@L}ECKA1M7T6`IDra?Ejɍ01[ȱ.\k-8x%9&dwWU4ub)_6/|i踝i'/0@ $UP|enհϗ1d8\rWyNBa(yDMdCIU-hvp #qEIP'}2)\I&]ki$(6Ij\tPqCR5~n T8zq2ElVɢÊ <0 $VMU}p!-@@R& U2~kp p(,8 ^)H+:"y H`$lQMo"ZApLnm}ǂK̿!=09/ % /.Oc f3y&<\Fi.o$lW+QHwS@$Q@nt)=3 uO1fW 5NIx½;ž(W[tT8H6`yah $P{[_-Mi`ZvW |TI7F;p ym"Aq@j'T  5-EPQ,t~):GE9SK@$1ċ~>+1\\dZY>Q3=1YE I'ȖքM|ZL$2 #~OA7Aa4Yt $y6IRWHL TrJG"}`jĪ͉کvAa@E N )6hT-AD&fg@ЖG_ 8]Q 0M&yĴm`Q>T"*A"ڀ& ٢uQHA (vSuHpgE f$:6$EB H"RO( ZBfZQ0.QI$@+;Yk{V&HHZ4EMPmqtk_4T:ZD.|{3 9g&\4Z`8ouxNf&v8e)|$ :LF=d.$UZHy.A> p~I޻qXiy&SMmeaivP*QI'xDyeުi&R_A!EOQZy@ٵɲe1r849x\aSvRD`ims . Lz\Xc8m]߇3ӺW$RÆqADۯk9৽"<᣸efqKWQ]@HFMC@aua? #\@ ! OY0D4 RJ#U>A&+Z17CDn)-0 'LNq"m5S]"ƗPE~"ot211pǹs&/˻i56Ll@ & &)Scbj2;^w#LyA/ZL #-|Oţ4AJӁ.߄IsMƙ!(ZD }7P4V),h\#^}ɪk`خ\Tsx,# " 4 zGbe388Մi^p2  G2yI֫>4NGĝwejbbt@]MOt+xOxKƹ~ί[7"-"|@iu+Y7Y Fդmd ֒U45ǖk+AqD˧=k b׽H L## bZbBbb;ڞ7CcTlaPfݔg%MQdL˨J@ 0 '%V暒O'utS+eqpq*Ǹw]8L_Z@뵛vUl |ě-U+RZ M& =hMM|7ӱ\AmT VjnO WM&|MfHUKQQ,۝O#Ԉ4@T-fD´ Rt45$\TZ5&%5*N*`EP%$ \u\TsPyZW&_5s_f> x "=;11 FbX11 Œ;^j!I-@ %-a}"uvyp~ąw'5X Ӽj* -' I͝˷NY zZ-wfkRkW@솸m҃~3ydȂd.ho*'K 92|Mʌ6bv[-_[ƘV_eb`<84_xU_y<3 fp Ou̻5v&+˜I'tfqpfJ{^nMJ"n}e5z_DžU"x? Dzf>+ V\yg;0^pK\P?_k@ F oY1DvV ӬG5*+DLIHziuC6+yaZ1m-LBчcI4X&+7IdA}V:Lef  _t?33 a8XaY_ƽO=C9ճxg[=lGman+ѿfE6x BI!9TꩈɮșѬTHwȬ`n+lv+޾k]o4ܥDR}U0ѲI:H1 0PwPi&e1vP ѧu'.˳؇"ܿa\)Y+$iu.Ө h M8YsnPKF4 ʄPkHlJ@/.&r5T/oc^oRMJ0v^)cN& a}/?/`0y-#HZ(8" B@:('dH"v &$G!L'u٬GѮOEH!ԙ:=j~PHl12f  n50a1vX"h2;(I4]G2; +FuXͪ^o K @-E+ozM+X!CN A}0 EVm+(nQد=.d^|bO6> 3~'9>h:c[y6M;uBdXL1H8:&chi(M i- ?VjAs͌t-]qqYƀ.| {ƖWb}8 HdtOJnqI0q˃~[ eF79{^/+5$ Wr6q3Q$WiC[..BEUD)ҙf Q@0AZ L~g,O55 {a;ڎ?Ĉk?#I34A4wRt\Z*E?)'NFҹ3X"CY;b5%qZ1ڈ U57TuZE ~TDJ ނ!msY85؎%I`ccA16[&.71 !uIE Zogrk>V= d Dy"f)W!R Lމ"A71J @HuSk lu5ɏL̛A2O4'oELtʚZO R6O{] 0Qqq3Oe5ԙ6fƧD"x\ <g(l38D;31a"D@~6k)^#R ׌d@00i@m)I%ԁQyPl&7dd7JDLC{˄i։s֙0+O}iIFATO: 1){ȗjM ^S"+C`"Yh8O8zI0v_UҼ33̆=(_X  ixA3Iujp`Zu8G HV֊*6v.$@ poTekzje>~De3U ?/̳9\ews5\$,D5tꃪ-Bt5m}q(煙ӦDX4TkbI?+ @h6V Ace\hT*!ګu`ſ*71NB5Q2 L\LyP q"~$B$bEn>+`oE\nء8I.#FZHd#O̿FUҰ?y dj-L 8˩xAwH;ra`sYOOI`"az|65GިQDD3iSF#%]S[OUu\wUd`ʓb?)4Po…BII5I$ WuɄk^WT]+ҳ\&DMׂѳT;l36`IDRR$E rmeu^ }5e2x$=*pt5U2Oت<7Aɷ B kGSX&Kl)D dzL6Q  ?uKfG8eEh&JԂA^dž9cI/;.[ꈺt?9O?ѷ72: lvLjm$$ȝU#iI&͟ 4,-6NU^qgr &R%R5DZRZf43#Q3N$QBmdP@H S.vZ{ZRhXT@0 YD:-dTqP4HtArdNd eLgy [Q$( icUنYR %C-(df=ə/C1ӛҰ{N'[ל-}Pitu>1kŊߓb_MNҽ tZ\ ~9a~8X~k:(+O1SyE&{ 2-X@+7131ԒWT+ LƓa.V1 {+x2@6IVO;=/Ca+FC8|\,Gะ 18U$U@5h۹Sd['j@?}3`AyzvLf ֕j'pE+Kd>DwY$Rv 2;5*5N M>ifL d.;fIla!sɽ=LidN 'h֤@i$Fܩ[XMI1k"'e"IkS"e͔;;1acI Z TdYQtnA+XEc D F8Hl@`[tEAHDzĦN[$8e4*-ླྀdP`IlW&3eip/ ج"?e4&o(1EyI'H›;VR$ˠz-9&,QA- /{|osrI6q_#8.<农"|WX< _0A@.m T @0b Ы`ЁœW: IJ@Z!We)LO噕bb <:;&\Iܢ(u"dytI1 t Tؑ ZEКq$Lڑ+:OS`7b`=ȭ?c]clW8aH@ˎA2vo Ζti4 +$d:ij(6h?&54 [NVӈd)a,ĉ.c(!TDI#HU$,De"I% OO -goeq*@( AD N>i6f+1F$ Z-i9C\NX` {~ {@** `U'PLZhL$z!8NI"@,$БxSԤqQGIP=T 5q"&?+~]c c00^ \yv,ŐE7+'~@R-H؂ppf 7 sY-9fi IҥxXky-B")ۄ VSL8Ѧ@e=LuMw3/9~wC\~o'i8ӘN<38Dm5%j s@ $Fʤ#tMUA& )Y?('H^ըOpyDKORATfCNn8\+"۔VmSp  |spY!j&H_ucF\EbR/lGǢh 7-:4TC13y*g_ u;W~EO%vO7f10Gu{ uMꆂOʢdVK Dv qEln" = MMZ),j0 ^#|k⼧D1xc55灳NgL\&6S]c 懖&/H0\Zn`0 1LJ{کncE)ULꯪ'r-#M)AAZfiĐ=l9@pjêgt\$RAM5OhWk* Y1O @6 CT2-tKVpIH&iH1MSd{ ۚmB$\ȓT;Se'1M6.i>P h KM&yC]rJtG7ximf愈͉Y<Us6X/#rI*n>0acߤLJHPt"Q77;z((E*!aa2\.M \ VF.&㹍!#7Xq2IZ@iA4I"Ad=uuLms*_9#hW>1GHny砼.Oȿ.hv+\ozTf_:IcÛ^y$HA3,{ @@-u;zTH

"n ~Z1h[ o81aBOIX4$R P?e4H"Ҁo \\(f_ h$-i"-s\0(  R+r_s 001 Rb䠉 NiL8ZO@$sK>rx5i*C+UW&L ׽kB&3*iIySCuXzӼIl@$ vź̙154(G fk)hE(;A- (=NKd&!hOMmDvrWf3 c${772ag%~a g51=S/H-{H#9m~ +3! (+bE+YcxS`c?'܎;݅#tѺs.|n߲fgخkZ\f)uFSˀaIY)ޓy `D MFM)& ˫ʛWU4bW|7mվ$k&&&3fDIwy4gW'zW^wE;M:HQ$mw }JH~4Tlfb H "j@<A]!A]|tV΂ T 60ZBi{gIG@&4APT9Pd]"ĸɠ [-v-hT4u&8M&;NO g[{Ե$bHjW l{p2F Lh~ j=4@L /\<:*bo$aC!d5׵P D\N {AgFL 4tT{ R*lZUA0fJIpkdՔq1Z]`e',1 DpLOBK[$A6G84-!`BlkCnZ6Ll;ZxeTV!ĹQ2EI@86+MhEDҢYDůQtA U %1[]#PL'E=Y _eDXB4cu=±!d>^`#n$"M66&6!c3+ @R2dH:dժ 1̐L ng &LВ| &M鲱YM IpR{E5%!SnHK;^kVߺE3 8g~N;%K˱lōEM?~q:'Yf3 <`AӨv s1🉃 OsD<4ȏocO`z$N:Eg^$z.Y+@"iRsc94CFѺ$'iɪ]3R[K&{FИ߲O# P*l/TB"U!LXZvAl@&M l\ Tմ4M9R<͡",4" LwHL `p8dRޣtuL'?>a Mͨ?;~t/o1ؘ8eɸĈӧS4_O_~&Cb8;[2L88K 2*Wu8YZ ?91--q VuKeNW-2.2N}_7_r=+abN)ݭ?W? > JefӤOSh#eۃsdCuAB D"ꊍ2BD[nE? #Lh7]̷QW<79F0~  lPɊ6Syo|@DE.;(֡Bh$dE/U6jl6]N9< ,GZAC1d-?Uӫ82EZ}&&*lv'jz-6 MWk1fW yxE6uP)@K %d $E9(H& )h"Π@$sPo706mnIZ~{`ΒH&D)6U Mz%iHJ:AHkk6VR!M;ɴSSMD,M* $ nU."hʠ/l. Y)ȧtA nJH66Y&E H3iPUPF-_I?Mf_ړ4#_N#0ƼV0? ^H~Uӈ$D1q?{Tb Ch&pDIH`Yqq4YxD$A>7Hi5G$6Q ! NT !RK}P aO5 Q(M@(&vHTh]@wTM)/Fo[uM\:?T85GiI2hbT*EH[BF   &=?D@2fT<b SIJ;:R44l-5c3Pu,cbb⸸+1JJdHVCYzDeltu2Nafq&]E.fo#p-*Fh7QCIwiuj%ht3hCIhk%LH_x5OeO`:XPKs1.ku,<cq򙥲O c3q ! mZMUA)M6@"Df"uHqM6)DDJi'Svw2]?=,8kDs]O6 &1H[P}ˆdD@#ywzwFuŏ_aG:Z.{k"+"*iL ^."DPDV1W& O&!}/Jw.[t\G"Gèl_2;ȺyJvkd.ˑ,}@/.Hs N=# '2}/Gh, b5~Qp pf0bH M_P6Yq声C Siw1:w$)˶\0 L.%hd6DxVz(ɴF^˼\`d6I`.\'NNhw$ZMbS[AYQEeh߄>h'HeZa" hꙵ$KeE Ѳ,,\L&/?qtlPy nk]M=xgbo7=L3Юߌ uٍsz /q(f#$Mh@8LRwS7ML}b昁*M6eyE8H"L *OdV 0Zc$ˮ?uּ!zGM~Ktn_p" .* U2K.dr1&lHr&FiP&\v"m+CFo~gžOp3Ϸ%Kh×`juWC߆9of2,j1;O#P(WC: EXYaa; ΜAخ,cI'Kl q'6@TƤjUIb|1 YFA"LjZp4gz\Dt"] WxOƽ_s)Z10t:z:&fYJי1/ naAL&PIECHH`Ěy-JMdƷ]n<kn5I3utj}+ﺆ[>d2KN#{\[ I=IML mja,&@-1'qZ" ;D 5b3Q2L%4f$dA!HL[ڊ Z$ D* lyH򺀉TmI^EkesXYQ754: ė3hA8@LA4W#pI ƝlV@Cv #- VxDHʊH ZGy\$Y.pd@ 6=N`ÄǵqPvT0i$MMlI3QIgR!4^k,Cwⴀhy@*h10VM@o!QCL(i( 󲉝‹_J]B H USR$U*bB,\+1CfA7dF#kD+2m+ b;-:@hErwLr=`*$hVR뙹L<˴48ӷ+L x6Qi~ZIc~^jMM&nHcywTȉt*?$HHl XKf6CEdH1;u OD op׽073ƾLH^9|~{ Ep$V?oaZl<7 kMi/Gu|MLsxuB?c+{zz*H-"aP*/?ph23zayl"$fw/󲙬?0qB/FPPf<8p 0kkCjüEw2ppdI>yP PI.$Sap:A$*xKA{ ; \W/-& wYs@"$Ftj$M*0[p6'.F`bbŌq"opee0'eo~J q1#:Rp]1Nu^oJ˳N.#Z6+5;LE(ۅ:5ʁɀ{#Ў8]$`J;\tȿ ؊.\ `p"&w Yc wE0-HUIʘIH  եj&ވkt21d} ܔR` u Z*#\q'ۙ_nҺ_\l<9nĀ vPx⇄#ѱSpΜ#o_7dXإp3WV~|N֝m'Y0cogۘ1؄4I#lN"f ]*V:kHܞSy7]φWas$gy)_A]y`DbaqMV LJ‡K t#A[桺 R{h UE*#$5EItfw@,wA/AT<:PNLTFԅLo E h# MR<ʠTH Q[ybgd8gq6!ި|[h$ĮdtSl}DFQg;4ǽ &ު4MZp qj ,BfyYOK-me &%5kiy"M4L9Z7B `Btu ^DY:Չ!E ir r7Y O@u70.MfS9KxQW1gh\ ڛ."$׺SVZz'hRPldÏ RhjSGU^м='DOq" > _@|gOKOfe-&b"#%^\!?hTlUtεObHq+Gc<2Ot8FraTp]QARZF>=^N] 3ҺoRrY|7qca^縹ĒNDƩ2[Bd@fHo{{d\< w3+\1V0ue];⏉r]/ fۓ#_1Xgy5$ߐOAq 4&kS7Edr(q^>H-PkUI-d5yd$(EBث=ԝE~])c$: ƨ(l(Le@hL[ M}gHfw:WLunɵKH\La9t~ˇȎQ%ݢ$Bf_%uhqq!^$oQD Qd6m LzHĠpM޲f! iH(U2ꊟTM(pTRȎIKf  "$LTIP3_e vAs:w8 +򋫤^0N .uMNyQv- QĀ!';)m %7QhwLXAppAWi0)T(*L$:|ho7%Sr$Vi+3@M( }؋r _?F -Uh:B@E(Si""Ě C~ 7#&5DT$2Hp/ӱCXHhY66ce">n$[P'JMT OhPhOWq[)pn S,8)e.bue@€V{o!8;p6 @@A7HM$P HiPhIQ5D|tIkiA|jl*ѦQ{'Q Ɨ:3y_|2+׾&%\,,<e(R3+](W(>6csi.yhsЙ&aEw^}s5ѱks١+k2:?<<NNpIDA#*&#AnE2 ))&dn{߿* V qq^Kok.8;Ho#ejTvN ^|\{]zO @^`\0p`Hf~#` ӱ?eFc ̈́@+9|= 3 oJ 9|ŴvV]z.oNll>%Nw]W%xҺKh$DA$F a%$efj7NvC6RL()2;+P&zsD-$Z{,1Š oB* U8BDs.\}zC}.?Xqޖf` R*@{3)p1V0!! ҸJPj?QEK\+(4.D۟hNN MMe@ TR~p"#q5;|(?xjkCbf&+ 3|AodY^c,MyUc]otˠWY [ʉ"AQAiM,0K~i:GeV\aHجϚ.L챆@i}؀æo T"fD##U 2$?t;ް2Ծ (K>늄PIoA&M d+lMxwHP_}L!:2;q8Wc !V%.I @( Vƒ~1|7.{y ,L,?%8H$Vl  | a+zx8XRp[ɘ )Į Hp]*b⸒ jKN ZmT LNM:Aki(8%,"鸮utޱp0q?fq$Vw^v#EkMPALRV:C&L  Ly:ׅIyN KZ50aT#5 kMn>rfPj4.mR~dD^Su I #}->G8j[|@qf+STd t -kl< $c<K]Q-vw_Kv3n0RW7J/t9"#CEFIdP6)iŗ_~%tNxku\^vep~@_3 mympiHQ<//izM+`^)g"YFUNsf_u;C7CgI7+ɇ*ߘ$~,>hG6P{N둸$Mƣ 7FqP40MMwʚA(HB1")C2DvA>X.tlva{K[}\xi$q䤈Q"a T7A#N RPnqA4MA;߱ĤD pcuXu><,LVP;$1+T6*z6T3HPb@$ $DI)i#ˢ}VyoUMKEu,u[47Ee4 J"]2]AqփJ`S\DyAmE6=06' 减;Hy`N>k ]Ԁ wKO5-hF4 JKG}4biB)pVo@Iw Z\@Q0LZHPAo (\xac[y'S\GK{9wckLS#s'L4 ~t1@$%7&6-&6&\]4 -24I ۅD)u!c"{YM!:IwC!BEHBEi6PM:Ib")`w!$Ŷ%@PQ ` S[o)? N.Df"ewjoſx !ualbyC,`*Wu_Gq39w?ė]1m\?Obf5 )?Uy5< &hwYs[1cTsF'Qo6 S"л961_ ~xA xgpIAό>>$g2W" ΓIhp{/ \Dy|XY(fbL5d^W#?s>,鹧b44LL:&BQdq_v#7Pf vS0 TfUwHua jnV)z}uug.k+«1pΗ7Юs;YsxyjO~ d2H12!)hKH8g%D72T@ML̉FH&?*ӵʁ R?tIciQ AZZ`Tr=NȐ1SW.-Q b9VJ즙$ S;4dRLX} d 2 %Lrwͭb (5;Ꚑ P/(h j\%` ^ӆk3=ƄOj(EV2 Il -? 5yh`#42Z/{#cuDnB~XmU 6Hv:@dɒ6Iq0=lȥ+Z3;LʴI"=Wu{]g ,#b: Q [AFmnPѨ h0: I\ٌ6Xf00Ap#P6!pSf̃] EyAR!Usu ii;J`uhRehJ#I_IMQv'ҁPmF$ǡ\Ygi!LLw+~N3fFg4zǒ>$`҂itM"c僷LL4im * e;jI'TH {IpQ$;ai`M=1}d5 |TRDΚVF@A HDE#HMO),11E V`}Xs wx]MĝLفe.>)s,DT@pL[D&hAzQsd?\Gb0-k濩11 u=Ē0E4ܞB" ;H #KbmuF,ڦNu#H&ҭBKDL[j(Ru#h@C)"?ui*h@Q`?bD K}$-27Q:&, DgUJ( T㔆hM`Y@p7_dHRR * p@5?dH"{D( ť:a3cLVcL8uT b$P^x@pA2jO&T DZh}) @̉+ ͍MVCv&6Z"\ʢSJ dJ 6Q*bq#𪖒I*0-T !+o qHh+i>R][iIZh R4 [P,4[PFcpXnp#`tn0UG?FEGpN,4hT70E_IOdcPi'h IyP0Aɯ?hr$Ј'Q6s1p1ˁegEZ.a_(\*jv*X:AlAlӽ?:A:t/7ĨDXuDj"ը0RcLRi *Wx30̖IgbWb? P@:_$|Ējo6Y?H&ToKo$j32oPX(&(M!Z54I r5TL]b$Z-/dE#N}TCF'$wm $9X eBē;p [PD7TD= E=vSD0Se1!NvM>p]QrwIVQp.?HRQMG*NIePPIQ{C(~^2|#F r~/ ? \Yc|\5e]ahp!S\ti0LO$TVA7WrwSh';,>VwHQiOi$Su M:!U W|sԺV6O `Fb8loMH_vW07N\F @AEk$.<(vPClAUAށ $Z.DZ6@1[Ta9"`hun_P(UDw#A-p"HO*ހ oh6`.w)d|nF ֋cZ M*";Y:N>,k=@;zy@;fB/#y$ o cK\H\ AuAz?U7hIVe*LE}UG*Pkv*8,vUf36#հ JϘP *v2 L; DFfZ>:gz&Z$ 'N:H:]4{H5@-STz&/QZydLR$D}4PPpd&$֪o+$v}S;,)zuhRL@-ra1w{\ 1=f"j8}PHQi I|vYbj eL* J 9L߇p1:Z,q1~+Sy&&cXt Rh @iQr4Qک 8ͽh:MO*$3YS AQy5xinAMFy:DH.֔ܘGNZAAl:'$M(Unjo]֚*)S`jN9SDPyQ+B(}D @ET4oo2IP7T< ڛH ڃI斒{o0q^#K. L>3-cq|>;W8MJ 9U1DM۴U>_OswK;/1YL ap2;X Ҩ08QuPLȉ52U23Em #1{$qbm"`G5YnU"]@ yPNբu W$\&e\J B90D^{-4 0 ҂OzDNiB"-dsSQEʀ;Zc{eIt85t쫶D̡d*vi LnmQ& 0lhtCH0r]#Pqk[g "&j<;H4?:Pw+Ea3&lcAY6^AIw=.@܏rDE&&$1&ZذZn#Ha=ʼn@y1?d$>`$;w\F0I^iI#Q$A0=͉PW~,֜@L.V`n:rId5&Vj*"\4QX֓ lyc:n%VE!sOk8.Eqɽ3"VHH6]"h Q{^#ľ)tf23?8x@'`c_Ӿu,K[akf846!~jAg4E@;W1%tCг>?4LLa89 yfyV Жn%c%ɬ=2$@{O?л`a5 S3yqf&]|v]'En6eq Dd,>g}QrFШ aN4۔H*""L"~7ާi$ l-.Adb;ަpqeA-H7B+h0ŦhFbh֪wh0`6T[Mk;(A0j)*APb [ğ, b8yhj[cN) 7fVDd ސ} [$8yd< ʃHc i*'H Rh`wPniQ6t|DN w@ BhCH y<%I9[@UGt4TLf ضSI&/+m4__s^γ wT*rYHW=?]xӨf3vK98.t_7$ zEdTVEb7Z(Im{6t:a-q 7oE՘(59 !Y]'c-6CO6+2 &v,ԋ nvCET'kP0D+A@t\!I0q A; (QOPH܎mf!UMȃ&SŸ .ÂA'u,9O Ewt|UvNq 69˭pq4b5$C¦U@4PEߔ52$yh7>n ?5)p|zJAB;O)$r(kI#E-&dԛsE֋2}+P5c@Zf`$ \L.|P1[BZA P}@u sCD1EL7bl4IFFw<]IAYii <0LESPvt5&`'FgL.v~54N&`D@Q-_ ;r2T71NEg@~VLJ@2d &@UdA?WŝENur?Xe@>vȸ5_+ M}Qj~hU6 `ӎ $B v8Ys5),Z*"`%ƓG+*J]UAn7 \r\Ha sp=^(m@ W Z-RP$Z3DِDOdf3DB*=r94[kZnfWw5sy\3/-n,y] L8-5S2⁤@)b5>M!;.FL5 Y Q-$DБSQ6K l:cdN0 H ?7 _[l_`g;컛WF77 3AS edy l1>2`=A?h@* N$~J+&,=E yE H׹8EnH*"nT\b~bsb;pQ1V nC7Y quT;Q0疷~TMY{FGֱ8jƙ'x)7d7T`߰=֎8U aT^:*PLA$D*4W6?JoObtfqXߗQt8}+eH'E/b1sZ mȇDCkwI@ODL\tyIE˅N4\OnA41m66YhA޷Q ,.͔h3(&)qc(8= &=*|@b `zXi.y 2M JD$Zw74ҐAI2MsD R`_ŝG½I{C+^".A3YcqHd̓]Lɸ`SFuoc230:hvkFW58Y<\|AR681/{5.'` +[@@KʚvHgeO1`PN0 LęޓEɹisCM,c nL gabPie@%[Yj*)V(\H>kH4h9-Ph@@3oz >2E}%enyYM!WCְN#^ +z7R;:")fj*5#RJ R \$T zY@& ;I8DduC-pe3;cQ QR) 򈋁ʋ UHtdo $Rf=,  UdU&`ԨЛ]-2FFuLkkI;j4؎ 10{n`]>˓ P788p|6kqq L. @qn *NѲ֘ ")4>nljӥD!T81#@3J4\ {@%}'^oMؙL<10jWԺ{oRbs88u4#L@L$ vXOI | á POu $ ɛ( q!2L 5}uT oR " {^ft ̮_3auq3$dX&L4e=g,`ynD &.f\5i캎3޲*Z0-~QB(E?DD̨j~n)|qZo>}i*A$EDYNy >ũͣM?,y}ʁA"?I*{P&)hy$6z$D[hZ4NhD>jd\iإ¦fE: o(sC\.&`Ou$R hH_KP)§`O>MK0fNb3Qa"O$<תHHFcp9D?‰UZc15dqE米w7LZ5-yl_[r$o#ڔ(5i>&vA$vɒ} [LdTD ﱢIj"{ַ 0$ :`q*h`x1\Z4YN]\LR:G; njyaotK$V'IhZn - hW'sqh6LAA8@$R',7&VY ]6*1'qc$9jo r*;$my:[?ːIL$sF $UW~s2V&ċ/|13x9|O>L6'zG90vkzEI,VUBD.68?Sд7;leLZXms p+&A#eE)Ji:N& ;des 42E LCb8LOdP}]<A{T{s`;~[#a6X8e4#܋L &vV3wa⹮l8PZFl"`]$, "TNzP6.R:MAuiCDӽM @b9ge[S\["y+JZ( f 0@MN}ދ7Ѻng6̞8L.m'W3 tߺ LPI"C2vLj"Ey@0h,#m ^^`p]s+_,ޅ[岹W3G4~>ft:u3eܘM1qN JVk iy뱘;+n"DRުD l|*ڈp PlG͗ `>c~˄>74AbRDqT D9RSEfA9VÅ G)d X$P}D͹N#9ݯT L#K!Y\2 DkTDrKo`qUg2.{KZdM]fu e@1&WȝVdD[F`_E9t'DGӕZ?Md#r*=95TVHǿ _ 1UHHQ%;%zwQ3:;P)q$ Mf9\qCIL*hMe@3L㲄XTH ^oJ[rT`LY:jwBy7IA(j 4 $n Z[u52,力V@O!ф{VZXTIPK<򓤓@ j4U`e<3FX q1_Gqu(5G< kDa`'.VfYv1\WCsY+@LȠ; .OHȐHe*W=,g成87^"}. Ȳ-c Vw(n$v&S1$j}]'[-AQ0RL!ÙV57hJ()5 Ȏ0@TVw*4 hU L4 |*fR~T̂T7("n&Ie.(Ue,qkZub4 {/AJ;R>>B>[{i#oL&"N8P$A ȗ+sIsj92*kʢA"zEVedifgLL,lÃXO.Sٮ0\$BH@9Y5DU@k AA$8ŭ!h8,tGJbw*@iXd"֩LE3`bYf -`;URщSJʤ**}A!Ƴجȩ?)3<-з7DfRe}Gf$drډ0 ԍC4p%FH0J`fc7IxQB Sf4xF(2 Yf֩ GLf;!$tMdCH.T*&hMO(*hՈf,*7OQh$ G 1%"d; YI s J@:fkD,a1YqS&jw+5ÈԕG9K댈LI4 a續*kP H6+i7'l:EW1gHi!FbMx{* M!=b 'j.8TH ^iZ RVDP.Č93N}?RL\+ޫtP`bg<|*˓;d ~;=3.׷e,f4?Kn 'M\tA֋31MKf2k1eG>oKLȵ}U@p!&jt" У$h_vZӽljۄH@ CE0`'Чy sdʞ֋eU^H"UmR%MVOIshWL-mRh>5pR&gvAUk@2-&ފ4V[7QϚ!ϨDߺ'SD} -0oo|=n2]%̺Cp0ˉY]w!f8y2ǀE(Ef 4 \A&C ̍1 :"T\㴕 yji3*p:i'X"0vIow^-;E&R_$V$P .w>K u<,c|xLR`c?[RdIu-1 &_ S-q-DrY^{^ ) $7 VNI;*uwdy$d "ijJĎE3X66M`¬A5 zu<0pFTr|k0ی˿xKoZ蹞qYab1Ůc꼲݈gZ4V?qOf7;bj()_eX]?ns 1B񱱝LGԓfPdTm0Ad tDm-M  b;HX) 8 m^볗e X`4 n1OW3jHD:=8Tin Hi7d즰Ђl$o Rs? ESerpzn_)%~Uyfe:.cn-t;M3DMB@!@ "hVIwYwIh$jMP益Cdsd $vA42T`O&SKM?CD4 (MyEmYm1qN8W-k[LAiih-LhiZOi?MjbPyF yPL׹E)As$OvPm$4C \"6jTtKK=S]B؆ě, >E6@#quyMj$QbnH6[aÍīc.Xd%֪5P"Hﺁ<+ jZ/N$)x M9P1z4ǂSz^6K؏a@A],1Z + @Dpۅh-xFY屛!bn;yrV 5-@U$M+>6$^T@hlVk)f"GW6O/]p=Ar$I}(fGeu $\]oEfk=O%1#'eC7 gGa- ;Ɔᰵ騹V_y0 -&!p;Z(lI M`m15:Au 0N`tTHyCDDUNCH(an<7b3@V_,f +Q7ǷyAw"҄EvȥH2Ka@I.;))TB$Et7)\]XѦ)UHH $r5wSD4m HAi"YtCIPB0pN"AEHϻ'<2H%d@) nQt Emo _ω,̫Iy! 4ȏm#pH;TG.*R.4u3G-YعÚ8dC7\ -^YOnkP&NƫZΗ7Q-=X$?1CN^*tw"]1i_@-4S&_A׺E>ҳyLccaa9gZx8GZE,IX ЭIX)?А$O6d̦ &k < "$(o2]P)b;QsDHE%6vout,NG &/x^;B< "'cAS1uO/5̶L&c1%pޏ60~fqi7AS@&~i&HoQT@iͿ$$WBkM-LJ$:u6 d'b$ AS[@;vV'5(/V @6@{/.l\.? q-ÝC][#\x,-+cX*I Lv\N&]N"l7__铧t^qː4FS_^x}'̑3f!#i>߀gVMbWYY+j1hhbP"(6T}b$YP=A HAaNi]FDVG6~&"APl7P*?& K`HxPĮrniV*JhP$q0q 䴃Bff+ˋLH P4 m8$ >xoxău&98gD;I8_< Wcaeqc -n'o]8&ޓP'. 4@")"oQ"֬<{LeM .@OxxhL!hRҢ&֚ztCOmR ot,'Lod5tH ؘD˄HSe+~3OeֳYO".bLdL0ZuG)$&{VӁouxY"CXz^9uܷJlII waޯobeFk 5488A /\k j+T&E)I?a{`{B ]fy<p0&jMw_c_Sa6|aq] W@  Q(M ӻrX/n H94(@ (ԘWcS~ ZR,tNR5$I74 &0Zl .P׃?+|e{!?&t:L+!lC؃Kw__k)Pl\f@"΋lZ (6(Ki*@4NOx@ӷ`5tD>3bEIAxDHy { H;cdT(2KO@"b:Dc2x' ΁09\,Pv Q"vA29 hk[f&2BR0Hmn:*¨X#T 5M"}T"p 5޶\x,Fh/nHMBTT-2KP'…u ( E LMOk CzK`G.lK*Zq5BL8)F:% @ VIyP p4 A @;]p?3ұMW^{ALY&"T5 N7U;-^D7Qh*[Z @*bI:TKC+a[ a: {Ad4x$5,"=(9d\^Z*&Z0Em"3u^,p`sez./@ .#Z_HP cnW.omxf'ѿ"G;J@ 1/uz)5uk.\6`WpM̱{?JNy^,||i7@x5w΅г n{㌾g` v 5-ulK e^.Usbp;A J,榓B',+$lʠ&Mb)ʃIp}סкKY=$x7 ~UxiܖK1qqo1?oo1ؙw9؏%q5&WMD@:N$C{‹ZvA  ' @("LgLbV:pl>Hm{i@+<~9z>c5ɷV#͟{/dqraKk(`m,$[֔^MnIӘ-hӱ2KT&P$+L 6iDi##d "b/Ң$wK6<c{%ݿ%ш ;s+kv%p TBkyCnoʀhtt13喉rٗ+ !fAi'ڈA-06wE'q;-I'm֚Ɛ%v=7111pֺsHt`tɘD֠+.7-}Y:υnCs/[a:l,l2.&7 oY҈(LxHqlA;eHߘ@w5h:h ; q!ݽT% T+\lF=€/wz_ Et0~[0[JJR6]܎}?`n Wb1sq5L\QM=I"լiOS;LQ05G} }+A..9gLVe$8N-&ݜ:1"+?.[KFiV_ -uv)z/zoiI&JLJ@7)$ #R v#p[\@78&615@6 LPA&v2n]ėGu^R}!c֔ꨒ& p0fQH]IQ?uudˋjcd4OMSRVv~G9fs~վæx39qN\3Y- @F/1p-?j.ls#n6]o9 깓9\|W].+$&? 2 dC$;W.ۇ&+_8Q9߇L[0zChlGoOz.:[;0Rbdғ*$Oe:8PWm zm"@pFsT1‡H^4z9& 7<3͸u~w Q/Ρ{,{٘z/ÏR7Z5pN45QX_p~Nilpơ}xNXcsN/Bx?~u,&Kq1cF)}'[Y3ǵƭ }טҠͮRwM&Y+d2hvP.Т :kyQ+f$/Kg˄ff֒ip i4$j?Q{%FHE*`@9N-q͇L D8;*KDOQ@o^0K ?IJ`ew=O]k&o9 nI']K%v_3YA.KiN*2doe%F 6=MPh He:E!ϗ@4$5HQz*>jL h" u3F- ,4Z "쉡"I5 ]XhęOCA#m@ N~*ұ~WX':n*oqsyLc8Q0 K{D ("0jw]zp̼uv-H"uEc 1Fi+!Pw[`etb|qbEwS  [g1ϊ F`.>Z2iQު#fQ_`&[ ǪcaiX#w\I =?y[̖ O#( zQ+Zڊ;P hέ.\悀C{s T@ MM~3[W55SɭyUHA $ MX-fOO٧CL nax=C&2yLc70K>5+j%!A?B(*BńCH Sh*2 m8fZ@2D&# ڀܕI SXuG/bK"w]wu=Ȋ*=H>(B7+x_31$X88uj,Q $}P*HHV=":vb.y~.!~#8$Z$h0t3r>'NOu38!|IĬC U`A7qZhj+(7U*baRjJhb6O*0@(H满C*[D^8?K3 "LyIlnӲIw #|>y_=7L0 bu/eкPɇZ6, XɘITET걭Q) ]UI=|*CVРA<ʋA\W3XfWy\x`074w\t.vI gİ5OOį u3}7\&6|82d Oh_: P'I5{6TZj %2H\k T.$ buϘ̜}2Ƃl .q.AV,ѴY;M7%G7-ā"HN"? U4iUNUإMDL1\`ڝ}W`>kCcuJE*ޒ)T`ѱܠMla $@ $H3i($Wz*$ i<<|,18C%E\u&Ak`ç8֚DA@+;*A")Kv[c46{H&L3.iJS N q:%yqBx@qC #.#mbAL ˉY4BylPrM6"MhCWB訬/.<88xhZUϰqSn) Hj65hDQ$&Gx+Pi$r@3OHtm;,O,R<EyP DO4mC"ha7 k1 Vs,2\70 (8V&n0p+j믻oYp#C E+HtHDQhQ9M &$!SdJDjs\VUA-e:@'u1\טw{Y{85Uf ")H!kPA2cP4NTdċ*iFТA4ڞfHy*H oqBH)ILorږ V#s ,VN ?e|:\6hv;qzQ2?Sr]')ճG wEcc{Kdu A("ҏ$ o[R $ȟYy`$ݿA3Ma^O%Qi)Q E7(b &0X=3 \ƟǿVRAxTCiʮ$Zop}DraÞ$;lLJznCٜQӜg\ XT UDIMh i~%Ơ!x&\l[D.I0+Nh ` I{*[n6Lo3d21;e &i<%/Gtp\潮 /u j `7_9~O3Ougxn9nmK\ɀD"MN(L Ph@"HCh&)AI%kuIA6jOܨMMMQЈepI;U o0H(Hh)6+y( AAQDӘA2$ h&qM'(DOjDP>ʑ[U,312X8w B@B>p+.&"L0=J.jl ʁ5%3jXZ&кzK:xɽ8\LG:[RTbrWKBKbЛ l &]  URK`;fu@>bbamms !q L!0)hfAr40K HRLm]}$V=2d G5^F&9{ye_B3`> v_D:dZ $I6SZ@w" H ;- v &ՅIR]I4 g(dp񛏆KX [꺠ipNY' lT]$3@<$2 AEwSA "W7-3 :⫌ߑ*&NCCSPTj3dDǪu t]jN`wChH'o?TjAq4n<ƒ.\18/xסdO\'+hfC@ir 0\f8)eDi QNcHAd2Pi:[8uTH$QA 6tBhf›DAH#eDQ b/UQN3yc([_ >f^<&a,Һ]\[ -bk S& >ij@$p0KG@ 5R.1'Hp'\j)7KIgbh q5Z]Q"/`qˠ\"!=0*d |$JЉ; Z SN2VJ1i3" 6չ42wKZ&@`;A&KR )-{.kf;7(250RG `1?$L_t:&&/<)4AhL@t%Ura 2|mXKdiƛ(^&Yh`ADhߎɽz*A*0'ҔPf~?I&pE~'VMHE#Ф=P7%v0%l}$iI"I&h'H$7SEo]NsE)2EǥQa&/~R stDqh"{OtzC39c qo _鹬0"G>Đ "Lg4l }Jզ24ZsوK=Nr9L{/<.y-o^]+dO1u@sd ΩI1jF k}_}cӗ};3Ƃ=]?wwbzW'aac0د, MdI B({8j*?ZVhhuO%k3z}Wø;-ƽp!xH`D z:I;!dKj'sQ&険:$@U-$ B4{ªdНG{ ?fkYR^ts{Z[B=?^#V]s糘8Tf63hoQ_ DG LO{*I+'㎭6k9Š\ ^o4;aq`.Sk;O436 H=*& q [쉓"Z C).$ P@3Hb + ;)v>EG%`\L xD&IT˫qT\uLQ&]ZKA]\TB>?PXthQ`jWFS>Fʊ?iya#٤."!:A5iϪ(j@4(7S' gH2"$Pj $PE.ȸ @[CDւmUi2U49L]F֙I$C@TXPML&GH8AD;MY5N  :uD YL=$ D("WY@A*8Z."$#+IڷWj ި\L̛EtV!DxL\5eC_}lIQ$#1ڇuPU`O%HI5<6lpKq;V " 0Y}h9u'\[HZhU:hă]fI$94S#^;H"v py0ad l˚ +NpCg w"|3h~`c]Q.6C,g Ù9y P庿Wc1^\GIsoU ͫĢAE/Y1"lLEL}QN0 nJA]{mE7$ɚwH"i5YpĤ\|驸( iUT<=5 0I}hWұJlo$S@HKtb?(n`%\}MV6@t 5PLJAܡ" LVf3At4 E@h-"eyKil7uU4@*q(atN029cƻ4 ^s7bbwnj/FUD=%ג#`"@;+LoXD7W#q@tznu8P7QiXTm)<2\\wSm~O DF#dd\.c&`w੼@ ˃q0I7=x7rt\8-A2&dTHesiA90؊pI'ˤt!7[t\S YFT0~jvYp1`j(N]d+$)Hz껝-8]G0ϛׇ9e_Wu,υ?k>K15@S &&*-ʉi ~VZj l=Kt&VMN Wc3PM{= D <\#`LvˤĪ=Qm5jZhgHkEW.>K/\QzXhd^l$b ($[1P( &)(-) t"&DJW F4DӁWHb,W#qp#ƺnA;(mUjLM ^t@AoXֶ~PM>] BΠd ̨| k\0].6+|?2UD:un*Er$L-k`egHO1EDz_^x9,7b؁&$`dqi[T$D}]"ȈAĈ2=) VnF,.+T3[֩i$5ڊ H?`j AĶT4Z("v q_eٰ` <* W.6ل֡etԊpJx=WeNʳ ᇘ~b$6_f0Ni$Ӥdz&LXF*". `85Wt4H=)ĵ6'L^nW7xKn'AѪ'L7DYF m{hT ϹQ$]Ksa jM IeS$@`-MYS&5Ɨ"|S rJ=~-bZ-O6I~\ڠHUtFco S"/ۏӲlXf+ 1jq&xY…>Y ci.#uO}"qP50ڞt3ʢnl,'uum I͕#Q~㎫1 ѲY e,%4Y~t{wɉZ$y(cxu4 S}虇o uuZ@ 'M {U?h*I#t\4Ϻ]Z{;,Gc+D: !p 3d `(8q@kQ4z/Os XEeݭ͑+8Zw=I?KBi-gR"3! 8DI1)R'K`X (v))ΗvIkbHIh;5D&j;MQT%[ A,  P1^Df+h`4a7t_9԰p>xtޗqr7?icӮe:mPozTh$bk_[& wnÐSq-=VO`@vI6D?u7t|w9;-%5흥o=cus#3,]q+竫I3X( $ EOeov57SN,`5EguE0S PlpVP7"%4bȋR"$$oʵaԴ(xHL{>|+?:q%``ak {c4IT$ M S:wu8}|(6 t*Z&>TEht(g33ІQ: ,itM\EQ`@tAZH Pf54CjOڛ: !vr|&qu-yFn]bOH ȮꈠxPJj@<xLqÕ8+ lLlfd֛)Άh5Zi{֙w|.Oy71HDrUu> &(H^BfSɂY(hN'#n`x솺D1yNtP蘥 nJId`vP",%!Ң8SbW.]a-l/ZLb }T$nѦg972 GiiS-wX?@ -yQCzfhI l7 5\1HH1d&EB&fM) `E;rBG`M \U!EȨqXsDznL0t/"*")艟2f wF#>6r!67CL OE Fe1; DɅ!{i}BDh2@3)V DMniT.mʼu6*@w$ L~P`jW&3A<6μBihiz:a7A~V\ EAp$DV!# ]l\(& $.:kBqcMv@ -uˇS}+i ;YVWT(:LN醒D$ NW2|(\Bloto$Ik+2 $DH$w&S]AP&1C{R-w !5.QM@P PtPw2wZctܯ Mw ovc= +0_ᬻlq1?61ubj2O>A!TTOz]zs-):ZhxTs0DkOuvF]"$@ G )}Ǿ BtԳ\pFc CŅqW$Օ$Ҧ* wI&b)~R dQւ A[cέ[@Z/8 [?DY֜6ו-'yŶ=.#q@$-ƒ~7Bp]ȩT6TD1€@}RZErR m=˜"Dw:3W)bFe0  5VX ›I`Ŕ$ ~qnI&Gp.ZRL] ҃V@8V b=卻VRhCB.Hlɥlhho F^-zwd2L#NY`4yDJ.MpTh@k-Xk? kCEJ\-s sA1ST$0i(ݶ7z-4&W&ہA xXXH77.-!'׺u5Rè&IZ-HwYh|kJ( Td{HtW4h.i%qĉd" ;ҊLD.ah #Mi+|⬯RwRdFO.qI#[_3aCn$RH5ީs]t@h59~hh"E@mJYIvR|&3 n o=3GŞ'OCaF`)"k&d\|[r۝nbW^C]X8X&B˘X@$oD{&QdR焃A)l֖ Uo[o@÷fկmd2H^93#'P@LS7(5$SM N!=bDPrVi=w4Țp94Ъ 0})Erwdx "!DR2C_u͉LJᑥSG{Bd O߄\XQi5Ԙ5DjjfoѤ t{j3#&~0L"T5wU3o""P@uRPPO4]Qg01I]Y5vSKA$HlIS(pM"irB I H5&faE@PlHSՆ4Z8,5IMFBP(Ȭ '晁]T]г} ;)ffI4itS`SdA0ijj@;VSh}i(  hUD\E"@0]*}| ZFw/^Z;lK#氎&?Z}^2PN&i.C2>?Zf4׍L]r3 ؘɱ[vW ]qbs4E 7H;;ey(gZe1pnF$gN踧7YόBX?e!_?? :4ۙCF6A1<}o?Xstpˌ dC$nEw4aMG@-+zgXx~u|4TD.>.=[";|] -"?jiB` .mQ"\l9 l, }xAIq>p "mbAB%wU)c2he"dP2Cꦸ" 'SZVϛajw@& )lɎSҟNV(m%6~DT *8< 1" +fZ^hM_0Apzi$nF;gGTmzƟSQCODH" ~1-2w[| ^,a[ P鱋 IpFtəhJIe.ep)U@L"߅>3I SZ$ 0MBɝ1& 5IU$o"Jȡ^D Â$jP*. Pl`"1C2` hI"H .=O &A[i2 H;I~!4EKix$4J-[f I^[8/9`X@-UA&6Cd\~$ h]-A\hQ4q= PP2GPLs@@EH- L^bEcU-p%ͬY^x]^_T6ˈ;GBv.xVXu,89v`c~X ܺӦ5G S$`(fF&Cdh5v҇Uבd'`Ei.0=nP8bq[f)ps^굋Nq1A&66)i~s߆|q>+Ff_ pcƢ.+޷[!ͳЅ @XDRTk3mRdZ/2XX%OTETb\ & "}6S"izQEYQATוPd Gd zL?6s芊Z"HE=2&M&?LZsIpRVxt*8V.pDY/ujS֫@ڊ ` V =BH'u7ἑ X+%E=9Y'f۫ p_.8oNvG01..} ĭZЇA&*$.O 9Xku~YMlA?$+Yo4Sl MMgy32Ѣò@I(NԲ @6BNVTi3(jd%r`.״ȍf8٬R`˝%qs@:`Ƀ6Z Ca"dKۤZ֫$bh.p`-[iD? bEFZKn +/Ι9,dfKۘilrž)xԾY+ "M vK`w]kkL.E 3SA2IMpgA  5eX.wO_5 / ?f85nŠ"SsKZQB›P|ީ B֢Zbo(\j?]V݈`4?شVߙv n>/.;M)EcbH%!ԯP[ tۺth6t?W.G1ߍ8l])k1y,vZnw\m4R+m>X&`0A3b%-Aq*ש"hE۾QEM8P0Fr;B v\r hpGTA-P j Y$I^sEI;H$Y:dWǭ*vK-~ѤpdYH45e\&$PtT""Ap AD1 ]抟 i&@DRsmAEF&xChOԢxQh &g}!eߞ!jDAt>S`fA  }ouLs^]( 4{43?eFp5vA&|1bi56$lB %.:?AvF@<&E5p :l$ꍷ +C Xks 4 Sԭ4A09%}7Ed}_"_}@||1O,>eW,p߀i>E'4\`BxKtD" (EO+f"XtVL4F2t$wI#D߲V rHy?`xtl}mwX|gˠוd4]@3czPș@j1lMZeIdY:,].R;I1PG&y1htlJ&&UL~D%~'Kp3YGccS :.p:nO*܏Mv_tD_Hu˙9o/;D  4ۥ+$.] :h4 V& ӵɲiZH"AHA 7(%7"U64.4=V"fui=@BBf "cK4E g/eqq0X5đi]0InJ0A 3>PH& H!wzGFuޥY|Lk8xm;ulli99$ HR341;rk-SE#dpFu<>Py߲4q!N>nNҢH-8"ɝ>bbBz{zYaɷ9f.'Ic"^~K1Hs0 ]yQ&Z;(hLה T&# (ƐgiP ` @G["7*& i]ȺIM!FHk`n7 lK|g@5:5 >VEo@vA/|I|n0|f>ٯ 3 _SD^۬ã(?M4cah2P 5M]iT\UDU5IM֝Mn$DY}ZtUfAw ͋nlM&Sɍ@1N$xVb$"szncc,C 4UdOԳL\<0pþn$_9Xy7 0 E4=E oGTfRcE$&1@;(1wVˤqVip;ީHQ \L` '` 7L+QEP O}KgP 'Q6u_92GnxYqCA:4̕P֮PRc 1"i-)Dkb8Rk"?eMbZ虀b$ڴ .ih1[ 35Hx V+bc H_UD&d @,Le8D} ;d:ªQ"W>20XuIrXfRΧnBfPM 1y aQ'`UiDUh7TE{MBN +Yj(ZjwXXYfq0L޶^<盗Jᩇ9|Уj-;i(&\‹vʹ͐r bcP< zj1r eŰ Y\xc@Ï)$E&r3 pi/e? ~HP陎K݋&"+ G~̻tFXH GSy"G)޾ׄ˃i̟i:nl'-N)Q -$I;?T] " ^Ur$%$a-S-ܔh}TږX3-4s j=J}RǪof(MHO{-7@pFM!16H6Q "'SM8TTs(wZ#; ́ҫ!Yr)x:,*~ ~)}?屳nWځ}?>$.[ 1r'9ĊJ 畂DRZ$i`mڋ)A #K=H#P+-R yH=̥ VB&^ Í D LRn-dT·3X}C3 = n]RIu_9ìQ|L6#ؠQӽ m&mQ m{Qi'm@ P!F! AqQ)Ȫ К+NMT e ZY}wqr̎muءy?Ȩ#Oj#ΪPɊ-5z{.iahknx,a ]+`PpUn+vϨ,dp# {RKIWUT" u8R;+DU;r1$֠"Iu&`TG_ܻlݗAҥk_fA}@pEao1 cFQq 2b,V`H~Q4kA4%جjHQna" @p V.fm/ad2I'ID 4 HSen\-vtE"6%ru 9L"ڪoϢK`Kʑ *+;P0PAӕ3*..fiJ$nc.k'q|)l]+uerwrlncuNO!k+zG&B01C qI&HEHh sQQ`k@1h'L nqWi:V fr%Ç4mB%O}BK3+L1ʷ0Fidy]; 16A|HATlM%gF˅qIw x#+;~DnAeu{~m,-JI@woex{eyޣcp !yٖO&?P{4ޖY0*OܧUnd0t^O>iUen>R-QCJR%P hSI2A$7*fnH?tyiO*dyT5k(4. ]ܮke鹠LĚn E!!|I3]#pn w_!f'@:_M˷`%7It&79~?yԱV ,թHl I{Y~WiB tBVHSQb:o|v.&ucq1IYبVA$֕1Dyyf]$@&H`y,6If Z.4nVCwIh3GAkk1 ^6Y Dnw 724+; ]i5` X@Mp!FT q!4H+2O: T Di_u `;1UG%5 5LJ".9(uvko^RԂz!DRlmqSCbir$ъ Lp2xKRZlDI4DZN4F~mb$(gBCӷ쵆5<0J[2̌qA{.{,#٢crm6p@e,fր 04A@7Lg% /^i7t"[-Y'{zjtgm~1&nhUg;I3Z(f{Kiy%%D36+߅u pKA*MOijs< PDLF+pUy < CEA @ 6LyG@f  SkK (m :upT:R4A@()e FDE?Haet$XQ_]MYM/Z8"2/)7"{E5PU06T.$@eJ.,\gbsq t4$L(@};ɺ&M=bh 7Zu *I1o(BShFX.l!HlW oj,<< 2ĉGZ0 H7H3Ⱥjp7SAk(q6% YVϜg2֫6PucY(q3JʅAwUED$Ag` A QT$:7%vv.U`k.7t *5wLBk.㍬00=Π '1v9 \Fbn v_A|;陎8 -x8x89 6i%RGhLw&Geը@f⪊{k-OS8J~[12.R,l"DOMAH gt9C+*LhG"``E8N2'(:6uSd} 㿴8yȋ(PV 6M։ IUةS)ܨ0L t@Ӥ3L MCbUN3R#?AoRy7QVV@n˻ԺI' 5@מ\H-i h$$‹+l8q<*'`K7yZpOiFGbĨ9sM20HѸ]sh䤈0ew/v /v)cAi8+߄AV;f*(%vrC1|W0y]p%rM+4b>hoeb@$@A0' Ilz즒&[o7SLw)vU&"&tĒHI47'n.Fj,q$ICA yar; c\H IpڈHB֝-L<SBQQJvQpktܙҝ feI D `lyZo]P k.;Μ7CWǝ^#xG1pۊD2 ~Ac9|>6h|=@5&_y@(IX'S@~TtOJ {(= .0}@l6Ap&Yr`\4؎ ѿd8k<$R+*fUGESm(xT 5WiH2 AP&x([D\qO/ -%ԭl<,L\@6[RZce\dj1"4(Z"5Tw XCƓG@xŹ>];17Hӄv^ߎz*~30qgb3`#A$-Cj\RQr085y#_ tLj913J6 Z@4$CDqV ygU#@2eō?@yPl"N+xXhv#KC/[U`lDIrHҒT]od BRKb=V[5LVlVH`}7 D{1_(Nu~n)ߤ}D;]<-Lo䠓PMmuHE9C$ӀlA2Hhf7K$,ԀڣeC1rP fco|ybB ̟Et_7Y{KwmӺJ.6z/P5b|%4POFȯ &`TD*E/USE{Etfeoh,i&?E? Y|E˵ʳ+C"s׋"A(\CdUWz &n4Z8o#P 0klKy se.!XiK ;IeFhPJAhA=77 Yx?e)C m$ju<n1e͋f#ḂZy}x}+e:S1S~6'BKoFYs89ϙe"ϮVPG›AgI0` ! ~*ug]ZcT`z{>=|=Okc`t c&pp#[}_c^j.2KIiM[$O)8v<lɂꟺTCڊ`2&VȀ[P< jͨZi"j\\J#P0 ;SAgDF2A_d'~l B "H@M fY3]"s,n!%թQI! ^kH"5I(C]52,U]0jt=,B`aQ ^*k 1FJ4:i6MK0ܨ8 kk2FIȡe带j̥?d KTO@Ac@4Dž44Zs'ܰ8On0[B$wELu$dydLzsg+5Ơ2Ou 6QnO RhCCffOxWz޾jQt:`6!P\5#+ut c9vb5=,yk驚"`Ai kIl4IYRFv#e6aqYιuK?60&/  coUFVnI;Ahw[ZxP }ʛZDaƇxVTC6ngMpYA-uKvmP"f%EZ%؎- spJ"hX4˻mujcB&d*4LO};(I€,"-aGFmzD^:^s)b`QOW"D"E]$m #`ZXP (܍&w'e˄9[oe6guyLtQ/4UDRsz.'>P[#UaSrdN:p=&mv>A0-pA)tPdGޠ" P4tf)A,jOd<(IªZfEI$9Y{DzHac/_(X|Xta`?bf yhr0$KlB3 ;&Tqi| 2i M t "~7eK)[,8Mޛ(f7PH&pldIj dɿSI өNZ0D@Ot<}0S .0vgPto(NcyMgu \{b8-;LAx-\c? n2Z  &.O Q1 ;C26HYlhjL( "hE@U#K\AB1 k;͌}gIi+0IܕA@}me@14D%YĞNo .(m Ԅa.plD :u"u.HahwT$ xMR֒DI*vHxvY  )ѓkl\|#8eI1z?_# 7\SuwSs H=A33qUA-hp}I -"D1+7׺2}73 a4<}37&[e01·ὥi.i$qTH"&Ns;1V͠&DRi M^Kʞ- \nT־$S{ǥ[Hs ܩEf&nPfs i1Q'(]*$kyL1_^Wx#arCc5@|1o 3dxOF0nbE|_ xk3k4 >Y\JEhy  gr7<jTI(bMP <}.uc<[L|VIwƊ8ŏ$ - e[_m >ʈ M! N" n"vV7Sm7PI=ęcLmbm͆l]CP*&\LEW.+CI\bX9˅޲VH;VQ]DuL Ud6V7ރɲ(\\phsyY# 6}ZumeD:].s/ʸ?9{5gqfq\7s{J&F;~mkD@nҹ1ۆsx׀L%X:Ge5I;e(:d Z $NmZLmʉ~V;@dʤ^n0Ro*4(9K`T5Y>g=2~4 L7HoZV$ƃ#*Hbbt~hv& "A"˿en~QcS>/+*s vpaP 9v)8ms[+H17NdzJ}.PlL-.?D:&)hۥ۴OidIEt#$b^5 PvD"&n7Zk]6$M)$5 +U7:NvSb^.iwn߹PF>+On8-h2aGW|=Ӟʌv# 2Y6w2o0{De1if6+u['_IH=|I09b]Dz$ \"H`cHfW6.o qcD Ea3TBf` UD"BI {BZ&O2ӝ{½;|ߎt6T'M$O ] gg^S)pL?1+&ʥf7\li5 MoU}n'@܈KDb H.LXj{xZ_88-{L`D9ĈCk*#oS%ڀ; ".Ap.MYPA2@nAZ>5㞩Vp?lGbᏖAμ'edەe"K%f:gKy~>L^r>T4éUkwZIHeN ,8cc ф izq 5\9wckL I" R$  X#uϓ|qtDq_ 2,<_HׄZHBMOk|L{ʀ SY-oY5EbG( 4yo&%bgUTIw̬>{l@p&%ګP"AVO[ZV\#!q@} 1!YQˤL[gMUH`h (@WiZ oʛ"#H"@N!UTIq8c ANac9fJyBdۺ7E M"=4) Z~g1&TptAQ䰾Xly洋rk[U 4!4AY xQ""+.P-Crb`更_E4 ^+TބAb*aDDZL4Āz((ܘYM& A4?U)0Hk&I;mZ&)Ld_6L_=+ 5\,,Ivҝ}3:g!n|!c֟ [~t@f03X:i0-'p*Z]UH$6ҞIHf&?QM7-j2Ie%.7Mp".Limx,81+ 0CZ 40*nLI$6 "NA˨ [0 @A0a5q:X^HL UH.G2[2 "lKD qtI4- |;Nq٠Ly u d7+^/S|;9D0wS*#&Ɵ$AInjM" Tح0;܂=!Sd0FӺ7M2,{ P]?{2 f1(?z:\cpEI:I I\\|GsC D=~dRkD,3H&/SEm%n;[} f aKjMwW)0xLGh(]i2 :^-bV1u`KUd I'SyZG=ʛd )d09I%-[nb$zExpҚa@]puzȱ5P:D'&<Q51jT `Ǫb[{VAAӪx!@LI CdDQղ4 HƘT{-9mk "2"t 7^a|/ԇ>3 @:HM2x_5˗ lD64wYo) 'utXUD/xT5h\* 7UP߲@$ ˀ.~}tO3"N`.f}&hhfYDUH;1TE/"+& o*DF~%XD[-1鲿&?Di@KG<@i-#tE,EA/D LPfOy7VnGb֢/U6 9ұs9|8DxDp( $/]'ᧈ<_7i" BHSW䤉cH4/"YZ;[&@  $}``y$@Ve$Ѫ0E|$Kz*O T@@\%"MHs33n! \Sɘ0n@)Jqmh{.YpLu k$$Bn=!]f77~؈H[x(v  D遫LU R=!hIUg MY'PtLY D`$R ""ޗX?.F9@2NA5V0@A@r$Z"HTyz(S$%f}ĉ;8H _Q s)XFGn@[M=VI.g3 ͪ`,0icZP+ j\LP)8oݲn6Hجs̽ظ/q$q lW.&$q4۲ ?OATiZ &f'E4ޫ:LTM)JFSbD^;(4h3@$Yn kZ ]'DDX2C;+p[[TneLS SƑi@.ɩh=M@6ޞ`)W'W .l }HIK@z"KzH*GH`IPwHm-W$hP !ߎ#ZTT-cb-z^IP l^2"T E$ɿ膈@x:@F.L<\L2 LzlʣG oe.Zyh8Pc m%$AFuHqQ^#Dq$^lTˀQ&hPٚ$i2 HA/:f8̟[I M'-O7Ud5qm?& SKDm1H #MAP4DEZm:le"iLmZTDED6Q Mvu 4$U;7Ti Ai[` 0c@Tn;? "ep@k0RãHiZUhH-L֌l)zO;'0 J׾%Ync2ӁII=jpn&50e"ȣ ˿ߊ0۠m]xhq:`K$ԓ &3"ۅpx5(/'h%fl8:֏eR1#dBJ ²%Qi&M]TAJ;yb 2bdCIZ:V.&fE @)JJa߮.ڲJlK¥L8h`T'aZE#u \juR=-2]K9$a? 7dqpp0sP+L{?1K$p47\E`hn t0wڰAeA$}LKdFO0+(i)8Na$LdWi k ZëIzQkKAii"dVputo]o-{vޝX i`u!EdTh6,w CYIs8,&$$pa@Wnn`͝]YkJ\htq p:4O5T$m+QB׬n@?VV3z-3 ؏Lȅ? uN~o.|1L2g w ?\bMfaΚ^hZ;189Lc7 -k)|bB}1<12ǠlT&IDFA6"t}'T:$IhB$Dץ:.oFOa$o%f 1Q Dn'QNӧIR8++@if,wE@O)?CEH-: 5P5&jw)vkqdcbccbBEI@D E!vMLm>"J$ǔR7eiވ1u9Mh`O֤@P-A^]t[,ޗv]ÌC05l6,tH6 =MVK^>3dC5]MCzPt;@?4TIL"ְX;ake` Xj *,DO4]K#j$b?@:͕Q3B;JxAZZ W+wZkQsbd1kWU(ȁ E $'e H&u[Y*͘f*dbwS@q LT*|܍&3N ay\. D츉"t߅4P]Oh?tיN)h!dM@Z. Bl։$E8Z[Ghm"@$ !0b @&!@t-$7&-ddTiR3IrH$Tdyki%Ht(Cu671%$Ӳ!epխ iTw4:tEDAi Y2wq6={ph46&=`0I& s-}Pee6btccȑlG◽RIN;_5IF.;KAs+fiG\e#$X'hiI47P2ѧod$ h$\xxn.{AeM.? ʉʁ>l1]Q}{jGbA>`[OAAIu }Tß>!xC1ֺvk)ㅆg@b+ӯtLׇc٣18ol^̀R)iDARʦ'FXZr5k2)Ba#ʈsxKI7#h3B4&#K()JEX 71 NP75Z4m4 ѠxLվ@kXu*&|27$bA+L⒭.8n>&C-` Qu?H6 hJΝ.yZ8DOb%R2b(H@l {ֈ߈,\Cb6EIv4 Yb0>oeÍT1Y t4ju8pi\'e ەW`y}'zH2ZlT>$wQczs$oK+w@5 ){$|6Y^1pz1rb7&umj7TPL BCH '+C y.PgWW!Go;~04 ʀ}y הZZTMkpE }:"S[%q*2+-)@Z˗<7 @ {CѺ~o; /| ^vk)? 17ØzG:[@(IEiw* 3U[ř f~n6xw׍9xL.|EwL;?.uּS9Aʼn0N)7_pfkC=;.2EI0]+AB)zE&I0 0\ UAn`Ee$ÉY@4"P"5ALCZ|?dEw.U.l6Q" $tTEGM-`n"@0F͉ۡkQKJF⒩L(\cp Q3iHd Q35o;*$>`g۔Xi[8SX;Ngy<d ٬C+Z0K!WB")Pj2M "O5yIL 1qqV=ͣ]`$I&͐`;=7Η&6Li" "ҧwy) +4 $UX@JIi`A4yt\/VUͼ VY-%źGiP\X0l;'.l#e 0i$PO+c,l3FX 'vc`+w8@7q" ␈R3Hʉ(U7-h0/ 1X Eo$.%TZ b%ƶ<  :j&&5J3p|AOȳ0\ɨ^]Htk1';$; @kO,[dcO+/|ޡ0svkaaRZ~3~9k,C`D74WK3&5滭uXr`H @qT<ۄOdJN& i& ?*ʀ Pԍ":( #&&7Dɡ$Ǻ $MwZ#A "(?ʁ%h&ZpFҹnE`Q+#e1]APev1zc3Ky/?ƞgaK8{ e@4liQT@@kCV)%5$"阥Do(y V:o6I"A 3y$y 'PvSHk]^T9kLM&yQ$A=u߉+)Nʃ-@$ę$aJ /f ^H~Βem1; 43=V]H%Ɛ6_Qa⮟|s'1ҳO, D  v<i_#cf.;9ɪ>Sc詡0H">ؠ4?I|ջHtߒZf&gxLsuu,I. 14 4ב]jF4GqhS0a v@A uD t]}YH4%$һF#GoE1n uiZ|l&6kȁj %X6 0qq 01;.MlVP3 #~"@&L 0+o[4DIV E k4-EC #{LVDR? 2/5H-nb+"%:%:@5"wJBMG>~ʈM;Ki.YӚ^-s/3=w q2" xèce5Gᝈc.yɯq'욹 &)Eԙ70Γz(Ԁ]ѺU7?@ sΣTL629 ÉZd@ }M%c4^Aа3e33۫K^&+f!{[M bhFfr@GNFʊ$D>V֊9"IQhUyN؟$Lp<-j+Sd3rKp,QpEN/uΙ0s1r 3 |[ HA(}F==֪$  C iTKQA'apV*i_| g0!e>9oNk[ *&u<Wf8l#m6o&>7NC Pjd_1XQ <8IP)iݢc%_Ipt8LXHEPIq#f$Ȑ%B6PjnxA$T{(j&IGꋉP,u} 6PdO&LjwYuNkOXp5~syox)#CTI'Kx3iP`Ȯ.G+;9f]\q$nڥP'X,'Pp&"F^G1:Sbb4b⵲Xj@^xlNkfLD dҞH(5e@5(Zps>,VXxHޥrc3;O+44YU|&DDTNp}:ZP(i{ʆaiQ;VL?en Ay@N4f5EA 5(y5vMD(DF5*i$Kދb5`;OK- XH4cL*F! ڴTUoXBjkDCLDCǹUWjInNXP1u`h*0i7p%ޙ3A9]!tt aj$V*l@Hu[I}NK-1,˳ocZ>VWB%ICS$I Z\w*͓Ltm$:4`>-溠`TÍyOϪ|"HH&)PIQL1IsAENvZd5(Q1Y$in*2v&["y\\&k0 ִ\P~Kc65A4\JzL%>pKnO*t S8"LVp!~PA&f (@H#z#~*t<ĘsD8Tݪ-u_ ,阙<fqCpȂq?|MA/G%3#mm+4ƶ(b Q3OT 叐W/FG][88NkZÉ_M=.FDبHDp4L-4@m`$M\Lj͕:DP:uWKE8 s9ߝ>8I+cTD(á)\ p`'nU;B8 .TTgWoe$ʌГNwP=Œ&$T 5[^R?qOV%yb{+CI;$1^Rh@ "k j= ?lu.sK D42MLN Or8$ LۺؒbET+@8qU& d$9uYM ~gui-0ILRxHōQ@+"3<D?TMZX+CyQ&@i$b9L;-b6\I<ē 4&4A U&$=4 D8J֩FA -NB4 (y$`⇗ .#sΐ#hV55Yq  ɰT]M ̕9; 6N۱Qwol[M@Nɡ% xN(cX$7%ɹEj54K|N#Ϳ qGa/LXX;ILlon7 I_:h'! PI$vYk7(i~o-i4hi2gTp*y*(I4HadD7VQ1$iSA5wQotrI(Q nd:~k1ؘxnspڌQyxŖHEV -J:*;d;Ew2'ddIA ;T;5 V K]Q ;6cr/W]6D7tF O\{&sթՉYS,HAl873N& ܋(,,'dǖ[ \$}Wsfr?1p0|.LSN4Ru XvL.0 :{wQDʵ PyPA$Syk[Y:@#$.I+;! 40bbbINe#ZqK`ab,V;S11 4W*! JhR3 +7g:3?KEtY i:t˵N5A+[udu!N `a W7ţ\/ \CM~(h]Νb=&(>Q &t\RDϴkKo &D`Cqy$m4 }DHu%rk7<xMm6Yh\=@da X5DP@&8@.n@\DJ,hu 4aZLd $֮ۺnOej cmH*" 2mbI$:ZW{fTH( ,p.F'`hku<׈*(`we #H"_45d8CMk%p:$LЀ'Vfv)s!$*)1KVڏyX4_kXK4 T-SƑ0DwHicE"e-P.YΑR+SRE[t NUz!i-.f6@HSm/H;4o Q#tEҡAY44A@!YZ3vHtKcȏ,Fõ@h15%RjxXCWofg菦w]CcJwY1BS$J*G 4IR K@.A+fr8\3Y1 7 VAoDYA N r5ZFqYZ@@WDss@@t*P|{n4R'Tװ^BX߉zg!/,qo6^^w993q.{/ނlj">A`ÄȟT]Ϻ FH Dr(LA"j$nQW9@Mgײ`.>xqq ﴮ$X bi>-A.5d %U)h9&Rv Ǚ^seK8Dܑ{/Wĸ8W_#Ί~jTG`3X'؁Y#S h߄h7>$Xckp s"Efk&IACIҾ_ MR2ynDKbGuT[-`/ikFW@${iBH&[vA"!I$ghTÀ>$PH*EjU:KMotͰi}+uWncul1|=Ohl7~#f"EG55ʈ7ڼ5v60f\Lu:deG)XDy,QoK!oN0=np@EY ipne:$6Z2(D*i"-qCɂ v\qkd ;~'h  >oRɷsݜٺ}dM&,2b u5H46vDlH#t  ͢e$iFϪΠZM*DǨ@i{B ej V7 Po( :*D Ҩ#AJj-tc"\ShE!* *qNHQD@eQ$= 4C;)(А {)~kFZ|1߇^#=Q+!p0M4ou^8yB]Ypb$~je ͍I't5Sh-do$HqF 1RPȀ,p8I EP57]T~M$͕cE)(q(gQ"規 'up=W?~ Sfd75L lme>O _9`|9 "D͌l< tvg5\Z10LnZKx2$Ƀ"1xys@&P]@AM "O'֟nl<*p&dveG$U5i iTsִ]Ldpݘ,nu@DzF! +$O2VFj4Li܏d-4J}ʷ)!&XLqIIZv`|mb`#e1ui?"Uț-ˤK@31^ jM;$9P wD ~RCN#I*$p;MWt^2Y} i~ +dqFey% o~wA 1QG5}[%uNm6P9c'a9sʢ)Wwe3}EYCE^ό7B]a>ra$FW DPhiaoEO*M+uHu)ӭ1EY֘`(<%$ e-"$awgHu+)uZ\OrwfcAQdHmpeD({$GA(YT**JVi-PvZ>_z*\Mͅ\2TO3r嵡/(r"i+%@6U oi1&j-sΑ0kv$mIQq&dzPx顅L@C;*MT`g EUP8;bRj; I&A_MyQ7NTdИeMKb.2M{YN2B@hiz{[TWP'$$Jw\X2};.ֻ E$.?mfL^]5_E8꥿u$w@LƶYur{X`H;*Tiܭ:A5 e Qhʁ C[7Uț?; tNTK]頠>Bg:.k4;ڈm{.e t<:i>C|CIq4NbyQl ފPKR  M $pP$t`j_xQ(~&D*y-Z3=B }өV:;4IcknDa`פ|Qtݔ~0Ul)<@iZi?Md$?E(/<+>ޟܖ&s2Apn\E=z.Kqr? 9P@#M$4Yh@! q}T&9 {un;M6/O|;f: flAC_.3"S`5oJrh@ddP ,MeL;P3.l6#̑D;~yLc ف4iie1*1JP]_9^:_Nd1zoWfw? 0׺j07L$@pH*ӼoR} suHiY2 JE=AD-PG{֊-4<("b[ ' Ť6:\jA t"f% ]?H1<N;5!ޡmه.lS70Oq%c@)抎;*"{oERH(h#mÇ2./k14K./'@PBA$V)8ZDϪÌm.kZhOd€>V6TAYa<'[TpjNh}m-$%q ~VÞ y^F3ٷ3?L0T(#S-~xL *Gc 7n\+>'I plm 4VZ |“b;"x)@&YJJ24R[h3HQ11M]oZVZvibeT*'{ v&d'=\8'Q$)[؝ZfHE )bDa4Qt)6PIAZk$A) .If&]lTM|$HAZI'-Q€ T{8ý7CLZAm MLFrefH{j ףQkF߅6H?.\ &c`5؎;48ncqlETrI`\IdKf12v.4YyXh 2Yejى]ίs =3, 8ItɊ]i[J,0 > }~{Mk~[Wvmiq xW¹|.Ӱ116I$_x5x^=WC݆hJS1b7\$53$EiU}#XHT4YVH_$w<&%G?ʨ6! nfd(I TTZ = =ء L!kdb zy|5t(ԪG.u- @ -t5`dj /%F[&eFK͈ተ6]p|Z9Q6Mw B B 6 6 2cׅԃ7PhsIۺiNL{QNQL>yo쾿>뮞F5B|[|I[3~B/@Q" oTV$TU1CA7ج + BdE!NĬUD5FFf]Q<2_9K48 kC΁& 0'MhT)B Xm6C=rkJ!V( T8P+.&` !l4JMLB-4Cd & MA3D'ip4RA [ L~#INA!QD40B[H0A3*#fRA@f*iDSza)$Z@^1wr+ la ڞ}GO>*wOhw_8ǬHB̉l,~O7O?XyL1ۀN޾?^`WJޜփZ"DV+͗:m0(L.l>[1M+(%'rc) @m0lOH&qKWd iZ3x?NQ3 xT=FLV_'}R@P/k7 xXlcʒ>D~Г\|ASiUF5Z "ZUO{؛5F Dҝ`p8Hq WnT@7NiC_DHI]|`cbCB݌Qh}881$* j} @T@4*6@6DMI&6dEe8pg Ct@$6KA}Oc3#]akh>|8zQl8'F$nĞ:fg- WЏBloM5q#Ph|դ^ T ]xDR~p"ED A>%;Kc;MIqm \tmn"ǥ;#Vs3Da4n"Z@ doJ`M2c(-1?e{Ӿ 3;։h)4EnOPb UIw28h&q!?DJ{Xq9Yt@c 0gsE j{d &}DD1+E"h lj0bKZQ1^C9fS0 ܕ>xx-ȶ0h2 -"(%pbMtˈ5Q!$x2Ìf#$8$V>7]Nb`M Ar`EClA0كz6 Ehi]Aav3دʝ# Ru,q~TO@ &D]&c\cZ..L]{]?`g<79|L47.e84`i?n#5X{9󿪁i3Sq^I!r&i3/E9,DecZSo#Qڊ$$jnZf:&&h tL;f6a |EKv N>; <D7_@#} 6H%Bu\ RR}Ѥ ȨY$M"gTIdZl'<;SviMNڝ)ĞW/4šgF6(G0H@2}ujV8jqVPTR$ ydQWT'G ܨ#T$8 -LX. vA>*kC@5IBܭD Ƙ)TG2UNRN!Ѧ~"bs* ksaa<4! <:œ~$;$ 4@ѧF]F3yT2{&A\=A.#HS7A6dM¿4H5A-mAcrE$`jAB-g꘦TH2"TDI#NZ`2:D^v[n'&CrӢ(LMcuiIv60A۞S̘Q- Q:Dos m 8nrw? #԰-` Əz%?gN# *+1[df1 I$u~ Oc+ᇷì[Nch>?MVHL E> x/bܱ5†/xOx;Xr>xDH`i ӤXbT;&Z%$GŐLjNDc%ΠqE"&f#Dx}4QoQ>[rD_BvC\O_dq0p^J8tϙh*GPz(# 3'+c?عNL,'isW\d3]_`b`pj-elfL`bTT&́Rߔ m4cFHQQ ;:- Wc 5o+;1>g|Q#-Z֐uX^\wn+z>c/,im#; o:Tc^C[ /1&eIh$.H纖_`: _Q½C/Wn& _X,~|P*I9U(ՠX$wb& _EN=؊n=TLi7TN'$'Nn VVeq/7wf3Kd6y+] =yl\g ŏikEypL `^u )¤-khH(Z& "KB f("-ŔKtHEh8H>ZIpS~8)12A Յ}  j 8n[ebvF 7حΓXi+n{ Sd3OCѤD:yZ-1Q4HA?Aq;nIY'z$ĵ 1g`<=H$J1dQ*<~և8W{Hqo(Neު:FEz0E+(M[.;^;y irH i>4 $RoZ" k;7vr9O3La .6Oqa|k˸ep[CeWIP;<( m +z"7t@8a$ +VE Hj"dk>.3ę~Ӝg͹ $|p?|2][2d``01O>\ckx?u6ktk \9$ zAHusf1rV #\c|W=ě ]@88Vq@LVlp;ZÔIZ.LG`hakqFO5qKp)ͨrXM0(+pXp&bpp>M>;M*-@}C7uwK3(KWX^\O  "A60/f2Xxx?#' k)-ȤZH3%P +Y4"{r [dmЛY(Ef*@}U l&oe{"M;; & 2B&3>I䬓z%x&^k3SgRBTHmA$=ZgVnӪ3Ȑ'oIr/9s )5\DTO>!+nVCL1nZq5=\a?TT֗0tnkd$u5&nRA%h$ `t[(KBT<ƍZqis&ASD:ϑ s|G 5z%^~;1K! 8A @W+U\ZcH*hdH DV*Ru?"u7)"*bcUF CukA$quw@5MgP;ŦR HzP J`LvL !{>>(N. c\@ϊ-]#1e$0}bkC/p$5л,>[q]N0.k 7 3NB$Ht[DR(Gh ;.F2,Me!$z ceHL ~Q=aAD%!"=VA-MߞvP3j$>ܭ3;ڛ$m≖Qr`WD_?FTA 3 `Wӧ'ޘ<1:ii5]v2L;q0Ic`[7U+_ճk +..ks4 5(hUew3ٜ\Qy+זH_o㯋%Nк&[,|CdP ຯTY1_YX@j\A>dW?k\e0 !q6]xg\ 0ESIhs.a@nE+{ !P& YH.;]D$Ol-4$RYT6?rM0b B6!s@l,S1BfxVY1Z訬 ?,hf8T¬ 8u<#N:6X391}OO*s|CXɋkخocg?xK&3Q l$˥Mu\~p `ϜTm*y'iN!2^ hViT`*$[QyZ OT;pA(HtRG 4 /̑qtATIl ;@6'IBƠ\~+"RJǼg28%ØpxӋpL_Sl-ϪG|67J=g1]qX:C"׊QlVeg؇ IPI1Xv:i j@6F'Vp!7C@B) 9Υxnpy_cK^Qax3ăaba?8n'}|Xc2+;.7KxyV:`Ԯ/݊+Qv>lCH B]k7/7ba01&|$@! @5"ǺKH !ZDfkKAm)5A'M+#bb>M&{ł.6Gt-0DsIaLAOs @sqf;@sTAy5 ދF&aC|Ċe13`eZ_\e:~og`?cBEDm +’xHs>CU J؍ M'LCiA$gkbaқu : WAkSA'u2}@ad tnR~u\n$RgLWuvO׌WU'SzI?|x |zVo7ݖ/qh{hA_  uI/˒ױ𼦼4 (5Tp6KX:0k^'^/!Aib#*5t~GHe n;f3tCW߇}3Wprck*Qh3:A>@ܨ*c\@NS@1M5)>Pboz 1nd`>0%cIk-d,Ɋ_"@=]JdAOi(~MW1بVM[z[xj~ߍ+DŽz/Qv_&ǜAOTHĿ|Yn̯VfØi@_v.)q#E1S+.uA܇Y,Sn?+0/uUO&̞&!s0pϕ yE@bU{-'L40w+CC0^J;mTNU"Z%(t T(#$RA?;Rf뱓{ka/oʷ.&6>(Y3򿟱\11$sbPm7X )5lyd'qKJ _iD`ܐȓU1#KiC]A"!{XG8(({PA|N jA,u vf,(FZ $Eਓ }3 cdU!Lx1u ~F]ؘS// x׃--|Cp(3*RD\CLW" R $L[xZ%I,g MMuˁ lb4pJs|9c?S$\#`ڊLIfot'X GIFcGTX'16kS0}fHi2-U_b0-)]I /t N0XVew^qCje@ە\[ꦴɢH2n&=@&dJ M.}C4Hկ֋i7N@(i4$MiP*`%h  vHKO7{XtNBJt*ZR4AS$KN`M0Ҁg۴(iÈ]S$X p3fq1.wlҰf0$~/^RXg+;K Zi XX.tUOM]xe[q ~(x5eY',?8 ?vL12L'&.[4Rw "AobP W5 sQiqg l#dH0)m!@`L'l%HOd4$+@ Vʦ&@ Chd~hDhvTG0IA A$w4 T娝C .VIH֬ᚸ=( Ǯ`5L?SXO4|p lY l )EAkp%Di :$TI.󼬁@M(Lb57HEV"yPbcmh?L\s-f)pv^$MD'zculw38/~!J? ?NjLqci!P- ;jwMu/ LJ?47޴U 3ށrab j,ΡacA4]2u B}@yZk2i:]WH " @@ œDɧ 2ssZHbyoUz5-1 @u\e5b(m"+C'޽]B*&f-3$_.\|ωތ7[j]W^LJbDSZvP^\/˜L[a7|i7=גLu8xT.E@Lȿ7FI$* (eh&.BY}LZlb,0&5q$JI4ZH! fЉ-;ۅ"]K^V_VD+UaAS?u}D1Zvq66 Ln+[`,l71e5K ud(L u깘kqU}1,$JnSPn 4KiM -bPӦF55 $;{o 2f6eDjvA&M(ۅj ^{'dD'uB*U4R O?)'O1ڪRh"AH@u=k$8H06D@8yR5=DX7NlRTUB --Dw%4)2.hb%Ee!B]H'rn= _[㿆][,Ȟqe٘`n: K曠U36;SI%1W~mUU #3I:v{kLھ[ OuVFSJb)S $Av-"h+~TL̷jfTj6KB #HPsZHMju}TGwj _@-5ң@:/vSA`&;/-QyP  3AvH"FIPBn70HjAI0M+d8F3$CHSAJ27ou99 $L0RTҔު7>V$+%ƫ LE .'b=L,3ֵr}H^7|)< Hqvucj+$8L?E-PJS8Úf(zTfIY+?u&]MoaDQpZ ZI?x]su Z`w_|GS=+f2㰰f G=?Luظs˝$kzN6S,Οf{|ԊP/ 6 i%0=[2<|a{S nbt߆pHne^Ƅw(#@ldRTpA @ RfL"3Rpp,=?ӳ]+2,i /蓆p/n  3crHxAX5k E9ڬMӡ d@&Va]tvkZM8D{CT3HmLR'-CP2L 0Yoœʠs&Aj.`[8"*,lkpkVƓU4؄cA" & "L&p(v4 VDu׼( }`U`T h)E L;% ~}DWjB!I2Z\i&$@4AsED 0hH[b3dԉ{".M3.2.ڨlM5-bK}֭K] ǢHIѢ b6aD&Ƿ)87%N #G4F!lna?bxCA161K$iPHlOYLbA˱KMHh u~tHU:ƚH'A2/#eFM봦|@s 낍u} .6z.\11@.l[1X'P]B  :!gBE1uMhf*-$-Y4L˫^DAeo0ו2QV@iUSk>͇Ѕ@6+K` _j"O[A45(Z M4IpiA ki0I7YP&#ER, Am xgVHѬ(F蚍FD0OFʏ4]5ZܨD!\% Ғ,jZ. , s+7QP c\1q@}w|?5ټ^cuP겣Q?e#^t[0n&Y#(Z懵gU  }'LD>ڦGɹMӦ#"hI'smj&Lzn!";Sƒ71[\ ${$&m 6%4I @AZS_\A3+*k\@80H$@ ʢ)&#xPAME:l4>Ҡ$$$4UZEx#/4:f33%1l \ & 6 oE'0  XQTxq!q{̨1wU@4 b *tM$H.3eɇAܮ"Z{(LUGq1b R=:D""Eg }l0IplGuZ+n]tD"G%f(@\߄L9ӕ6crxf5rSD")p0r`b`*?'(:>Phk~cʴJd&tbS>jf&s6\S>kAmhM71XSid 쨙 BUQd:R@pb`( uulH +t D@Q>Z5hviRG*@f } >MVKIjfi5Ț/s}O \K~D71༻[=|fuxsd:>+zQfC .sIs8L985 _f|Iܮ6?Hq,#y_+B'nKCS E5PTRi$ ;Pͻ/- ׀ASuA[L˿ @K@j&bdgmɠ Hqf G d !!WRDsYRƴ^aح2JM c<>|+`ԏee9[c8 q 3o]ۮ0E7DyL8u 5ܠ_ R4)aWq. qQt̙D&LmU }dIǢD,@TWl:Iu,l1?pnMynv ]24/ K;L MI-,/YP]1dsYEd7阍R77 Shcbז2\I "Q| <i'tLUDŶ*Wj DZ ɐհsZu=7Yr]+/cKLLA"LX&g6|I{K5Y5/""@p.>iu \ ~q:bʢ.Yqemb-5t9 c` 91GL);$PAj}E d6NbC{3JR  )"Lq0'K| -:KLY]a:AjbA &jS5cA\AN7$M쪇Ilp#.rLaO,{s\su>zc1.s.>ulDZ-2Xd1Gah%_ T0f -)iYy<Ф,7LKI\csdNeUf&n{4 2A X %-'eǡa ?@_iCLC.ӿ-ҴM 6LRץ:Pv!kn$>嘂 )oD ~PL(HndiEhjS J>ЀH$+ TC|P& mFgn UB AO&-TiґeP(U&)b$Gp&7gK UHPfwPb$(!DꉟT-ϗyZEB5o&@82h(-^l]3n6#\2`<eߌ>y,>CC,_Nl;;tIJUw$E'@ZӤNR2{(RLP]@A2IJ@kr+;.'8[^ʙXT*ZHʛZu^*'zDjvd́@6)IcF+nU.fZg} on@5{(( Pq<.$lxș:h豮ȍ'Vփaꈇ4,.5#AԳy`B }(bvҷC<.I M訃B碚7/DƲ$] Q07E@VOd00MT8¢DpLE h1&ZNP )JV4 ;!kwJ` op'Mo$TI'Mq$䥮DҋXx52dyuXWS"F$4D#WI")ʛW OrD3w<4"#$BBI5" A5Ƀ v M V63q582OeRVa-jrKAU5G(&MHP0@(0MQ HdtwmlAnehCyYHn\NH|C@b$EL#}Lr-N]GiP>bl pww5zS='.q?U~k97=# `|!R͗&a8X`Fx $:C@Aފ & Js͝d4y uR2߅D@>#j-Lѵ-tN_qU$Lo͒\`DSd^.4@(B 麄VRD@.ࡢj }¾I4Lq*cQZ/dLj"SBb52 c |nj6?I vpY^Q09\ //_xtQ<r- \x`( |C+< ul#X1+%ZVRi dҳYJBE}$N$45iAl{߉'C/U;ey}q`V7ED^{m+DrU.GFyk`DjA&dDԤ*$ Q4l,i"iTyFʡ@9@Jmq溈O\Amw7(G MKv]C3io W "ä"A DB:pI<]g%A !hqp~U/䜰1&l,wul\f'b0̴JIKKc*8w*"t44(T(kN1M!ߺR)dHEAcGOšFn+%A)e  iΡQ sZp!iH2ۊAA[ʌT%Ĝ@fy-$v?˜K%1`H iڲ\d+OH (K vV"@R#G{$Ӱl`) x%Ǜ/Һ_t鸙|>5 pJ3q"IHq.1Fmda Q ~dM֠D:(7Utbma&$@hV$QL@;Q.1<6^K=Og5ѲxfW4ZV1^H4$ #mBI#-zƻldo3d?WlDZʸmCm"&HdȐkWscae&caſϊ^Dd=LIʂ)/uUM`@"Af(( $djb$ԟ;zOx`汌aas/z'NleV+ HkWO8 Le+inv˂'u>[?x>wKظc.|y?C~;>6u.g)yGXe`I8XOmizcýS;ds9O|"@$T/-E(%@&ܬ-?@7(&Jr1;'(HLУ99MK$D.#^g &O Mpakdm_r55 )PG&+7Q2 )wlLICdPH[6P%ߔMەLP>P2l b{gHm}VKc{f8tꉡ -$NeY;r\ H$Y)ŔEU`j*eDE]DMvi%>5T7<( ];ʵAN:@5:iyaZ^)f+$ H"SCȲ\imV&;0p4.~W@$<ޞIڜ%~n^- KNUwD vQ GhfkZTB*:HtE{IMra7?kpĴLAPX4Zf|c~ MjeFnPujEj7@j$MjWPԋ j $HI:HX&y&.$ͷ@I&D<]ZkP[4۷.pV\d40*$oUTqšw'} '^{1,Lv$𝇥6! VeA$@*<Ę@RxXa2 n\DrMwI gMN1 R ZʪiC"&]U @$I/CUE(@@ 4oI VCpĉ[?]Lv6%34e8@JLdGNoLBH@Vܝ@?"DGZ4i"P ť@{Ji0$l]$$MT阀tX()%uΩ.lve%=~eAV\@yu5Z@Y#-ɪ\%է1=ʈt ӨAM,CHIF#%I;ZQ0&=tHoEP o'38(Kx.' T:k*Aߺ!%'TH9Q ,9)+ (.'qpm<$#d̨m 8R hhi" &WiSZC7`Pؠ@$nj d445AqBFҲ̫MHidG^NI:u .>JZ)Pa 2 x#qehzـ.LSgcq`1Qٞ~_;<\2C T%!Jo~$|g+ <c;^O溏C:VSہ~z /9;Ͽxy[50ی^!ͨ>R/2WYufK#/f:p&hDۺQB mAQ$27AQfI6N57@Pd/sYTC"}Z"X7'n?H>ASz,U,:G~Gz~GG?87'Yr_AR$܁x"n(k& U"&DgPcT青zA*h_U5t dH0y!wHjp]v~Cfp2ot5i&Nou `xg:~#ۭ1=C J+6tKk_~s=K4Z5$Clo3:GY"K#ˌ Ә޼u\<+-n#dPkf&3n]F565"AZ29HX \IaBA3ʚmIcPl4&>35TvTH'H!7M}bG5TD΢;7Yi0V`2wj m"&AVc~cبI0meSIbSC]X<?xwTA=+p 1&nPdhG t.$0HQP27Zk|b5LUo0c E66SdADO׺6ydP<(b;M@e~s#, LiäZdưۑ<ʷH1V$4А&qk]$EXM48\=$-VIz&joxV)F@&I6˥6ELIh4@f㔐BZt Ђ>iL@Ik$5 @0()MfTOxK`Ɨ1"2 SclPƽɀAk{4\<&O10t9\[Yo)r=?j#6W Wm &%ޡ޿պ&7`rxӬ筿x8e." pe᠁&D&]kʉ!wNB 8-1zDgKdAbE\ӚC/>'|h>[5`dt4bO$ֈTM"i£'}D NhuH"(DA?B;c 3K HzphV 1uQ/f̑4e@P ;{%A˿C`rxn{ =q]Y:/ ~4=@`^$Iv ll$ʼn7Y?MgHttcA TI8$n#خs`5 zl6` ۅa0XX  Co1HhL}c7V̸1x;S[̨cv.+:_`sgq?a%db $:TM=Q[ԃtL]?3<25뵒DPw=790\x]MkqZگ ykZA 0 {vQ6 #ykXnF eTؤi[8L:gKAI;zH8DO%hUiv 4AZ2֊Vn3 EOu'K7Hr Ǿ .q| 1c]A$/ྉc fu )BG#Kgc0ZYDҺIHChh9AA;Q%bOMR`65 wH ?LD 6Lp ,Ԉ+N&(fi,[əHQgQiT[ @\bqF/u5sm"PQP`P3.1Xz5߲%Mw#@HqbgdH0i{訓CDvP"*&9N1D;)ZK|z 1 /xLGcOCcu'e]vM.q,ku}Bb?uxw=2=HcueAH~&ian2JiЃAJ@&/+Duiv]aa^h y\ k8QJւ۫GM*F=N&ΩM)dȒgyt@4TDS4&#^I*>QAgxK@$@MAl(N$HDoEd{w` ! } o%4j(5& 8HviwI.#uHe](yS OD¶odh"O$juIVHPlEuɂZ׸M n+YmDq c(iTsOmӨ!dN I7I;F$6P7@d ]B-lQ^1}>Z8S]?,5 V%*kTiV G ͑s}5x؞IhƏLteAqo(LV}a~uZf=LJ"~331(pV P4\`?pHCC^"P]5HWQ$ ?@ V+80gO/1*$V+dV ]IrG:L߲oDy k Mlv^SR\{5`kٰ/<;h#ڛ;"h4S^v*/H40ө pyHKtfeWÜvTs׌K>LBD;"X"AL H}L6yTɆDA1 T67Sij ײIE,撓 1H@;(l~L6V.%͹QH&khH.㪄QI1>B`umM)`` *Jy-W.k3 (UCeOئ@5D5jt8>QSK{>>`pELv32}ɨ$A@M$ $]iDpuKDw|D^ Ssbowq/z^{>2aƼC@9v>+~Һ !kHJ &Iro깗tkk'sKyiDD$n:vS>1s<̘v# ;60LKǁPI\||01\%ˮ_$s~w @ps(]- MY-; B5Bcf6+0[q4^/Hv]0AoG:_TfzS k0n&O1/#ž grXn̵Dÿi} geNQ/f!yOgj >X;HPl DPQȽ!nHhfKhӄ2";B͟褘 PH[:$ Tj"mU SIsIC.dEIIY=˨+M`]$Ofp0LʈZ$&ABaMiH"3 *;&U۔E*+T:ץ虼2Nxh$fK^_Kel>3sl 5\Pⲃ Q3)IZ(by\i EhheNeT %nUC$'@ #@PA3Y甊i SF᰸8b@A4 sdd5PgWҼ!k d@ԬB gsr9f_'lWKX.qufw氟tAohpS戯(H#a)DZ@"n$-n9PHS u@^!FZhv;)CӃ\â j:ZH3kKb(IV AStDϽTkbN}C)3ʝS}_R,4Tf?t.i#F";Uvz^.Wabfv\ H=[1u G_ %s:G D PoӶET ' (*۝Սvj0fz.gp ׳T.c VUD\v[~#H4%bd,M-TH Xo8`V%P/HLkygx$rb @[ƴ7W#P5@>b\lM M;4騸Pk7O+d \l'I~ݕgw7_a~W a8rƺ$tD$$+OE$sQ͔L,"@3A>h$XIDWT$ ApS['纎&Uթ/ Z.}W|)ܮ!a,vH<R {X-HʌTHH6HbDFxcQm3坕 iUQPOQ0AGIOUd-329\ Qy.oeL6 ZiEM`FDPD:["P-5T 7 l2,8$PICnR؃[4T8:[B4@kI@ 7=VP2kU &"3jAuVߢL5ԓ+Ik=duɨa`^7IN3S~c3DP&)H 1OAPOʀ H˔&'k4 >@yIrX kބst2)T2f vAA3Z(@u]iט].sوZ:MQ3"(* D4V o<?فZtV t4 `T@5*HzZp855YEVy"CpߧSR;$~%A$QH ܄5yZ?=cϖv_mn֣ulgb?S̐՝.4[@dq %YΣ٬O=ˆ O;/]l8\%֔DIE,I>ZSv"*&D)MW+0хIF6]D̮)2fU _(LM$NjHLI:yC퉨&(~nO0<Ӫ 4_|lL&Mܖ;0ip#pvB~'ޭ:~2?2;~+BHp%dY&gu tD: (騩8Pȡh[$~AAS&i6YedRDmpΝZsH#pl(jM* qSD׾ˍY~hA]4%rHlwS") Q~濪̐jD72$)v+d޷ ԨI5-TEgH*rDxnE@ "id4*vZkB tYxnC5~ /@vsX0b;;,O_>gP[ \@U$VEv5P-${G)@TI 3V3mR!ڿϺ]u*uCa6f@mL ̓I% eoY\(,cuQmO >؎?3Ep!ϯ7_爾"s%wbk HiJ@6M/At vI( K d\l&[aÉ$4B˟<7voup(Gh!MvZ0/@!DpƌLM:I];k?t"`FMF#E4M;eky u1o,XxIi\}[:X[ؘ/.;ivF$> # (8`OZM@l"wAQj&lNͨ@B R#5B4uD&f#8PZu[bm`?eϘt`l;1(7 $.rRgI6sD?qgd "Tx7]P T[a'PH17vF XLnm! $,A;u:kD9#aă~‚ \N؁Cp3Üټ]2t"4{ ^=UjAfArM7Ȏ]pPO'Ho(i;e@6 k-Gjw%{U`a I$ac>~0Vg/pu ԙ^90jǓ~/>Sc12`pIe|dQt|^qN~0Blv+_/ {7H3sn#F_.KO$Zmv;(Kt`A֞_h:*N1u2ir쪐l=VAs;_6BP\mi/+dHȀ,;@wo?u$Z &QGUPEE'CA.MU"OdVD 9tH; v!@wĠX hIEM¬D{>眠k ˷6.83I.ր_VVXd*- 8od@UIL{ σ:[5}ÿٿxdLFu]W.z@. th2Gwc6&6>;ēSR4kzmiqdQ6t SehEwH74D$TjD+ρ߈>!pot~ `pVl _C?z.{*goN>S+AO}.$?Dkn$Tt!+rtlvP(ƨ!-ؙ,nNez A~_+ewψqzgNdrg2ƸI`oH_Y8q.yMjӺ3\"dw2LXE);Zjo`<|c`a*O112ic2H\R$^632 6E{>s5p~v_ d8/;d[8|=8a8)_i\3='ţy\`T`H.Ty.@MkUD\FJT"LJdc>&0\9P ΑKQZÜcnRI'eA$AۅY쳤* oy)k4p16H2[ACPpi -'wZ4{Zb +C~ę3Ha.55?39ī]]c4Tz? #qt &KHih=& m؎p {($P4?Q% Qu}7,S7\4CwWb9q{mdHDe4 B D<2 0"dU~Ѥd{fw}_Ǟ*89CLfN6?>w]8slG0eݩ ġ1mZGhA*oʛ~"0:Zjq$j1Jj*\ @ELUt~a6;u_ĸfK!{p '/ºS~c[1%ē$uwn 1b\ {@1ui-0ʃGEa"0MJrl+Ժ3xxP!]&mZ4s;;򝇆絆i u] ppRHU'5ZNiOZ#ΐ`, M=H p#tSQĨ:LMGI2 ODj6D]pT"Y*EZvM=|N<:K`iP؈$}5bQ2318ZINM &FV3h4 i.c!A.>j 6K  r ŽӾSXxTq 8+APQ'L+PHn "dTۅ$m2&bgaqVۆF@&uUl &Z>u˂DJ߅|Sghc8 C\N ~$ezsY̆U< lG=-& fцcasɰk|&6qc aiA0vTKu;? zzoǙs3 ٓpS`34Sdaeg LJ9̚psL" kIP СhliZvqH<ηk"7K91}+/ ˂C@w57+0v 5@Oլj!fi9 CS yN LɟU6 bk<%B76}##X+M%kk N#KafPR@M.n?\6o A$A"A1 @kI$yS>@*Hm D_rQYZ\ʚ.u8&MV |{Yl)e8ͯZ :gT`ltDZ?P7^C_tKu W41Z1//$"ELȞVah0o.d;齢T.e ]>&IA`S{ 50>2@"Q1H@0~Q4ۅ<LS$ Sc"?MqlRS7-$U n!c*cQ8Faɱ j @xZcu$LLغsni^YrdӷHc!rw^SF5%,(d5N@p +cbeۓ>Yt2uuX#K1>K`gQ@_/kt%qCGT$:qb;90X ·> 8XxXx۳yL +PS#u3j`Zeq0u#iq-"& s@ ןC'cdH?W d@%\ep)1@($@jy[n+`EF y~ވn*>F & Oe 7:!sס:PwI:kiKX.\3ن-!lewb@sBd2I p&E:A$7kpjhEO@, ֚*77F(nd6]G}ui%ˈ zR;} L͔`DzH;) jRuV`l6d򾋭x;ku\LK ,`_W,]~3 4uW]vPM(z -A4gAؠ:I;Up('TO"U r`x8դՎ:Su\dpxp)dDryX&POihP[pB4Ih.3ei4HdA$MḱlH2+REdKODC`ZI!6 LH&=? ߪ$nd l~>P\ÖXv&{1mSc{-xRHD+@yhh 7IfhJʜ 2@"XZтd hA< QOkվh(ia*E4_U( :i6;bCuZح tjO{$Rﺢn6DhI UA=p_uˍ{11bm"*hװ4-@[SuLЀ@mTH">Ƀ}(meP;BΠH`J}Y]̗Hu&9,&?is[I.}ḾTA.LӉ29 0 E+ TR@.K4pZӈ@s Bc;snj4"HZ8 @PLWjVU42-YPրI!j 4!}&.F"ge['9KLڦL 4MH:i2i|@'dϹrE_nSD8I5 e,I:mFU#}CW*lT"(TzI$D+)BH"FEF1dj#A"/Kt|~suO #2uiޫ:e)æH,;\Ew@y$ Mc}H O&5A5M%K@p-/TUEHZch-V@$D I+'IMd:ʁ\oA31PLQ%VD37Ѓ]BM 5yMb. k'QWH̬ LJޯ( EK^=3h86@4\5I3dEv~ɬxY- wKt4R˽ihi4ilic*8YY>{/X5 %ВeT"G+ Ђ&#Pb+DITL6 zޱUb:N9KLfVGe րZP0K]S'mtS78P$D9&+QM*L]i*k7d0 &*Bi㹍,kZ!}# k]tiDzq̳-tGVsZ֗a4C[^-fI.|]kCeB/+Wbbe5\s,3?ὅ R'ot3|;wcd9cq /9Π a6yCDt/{[&]q)hkD $jH7t}.[]"|eDL[U2k73rR\I2@š q"IHjR:搊juH5(`k(C@(DTH&"7-$بW}Ő`߰DOȓ]O.ъ 4&1O3XJ˚Z0miCtUO7+ _+a.6;fE _{(DDYzw5`|'bús?+f : h4mBj$3¢cQ3B@|,.(q{l& '`@V`Iku )AG;I;zՄ‰,/hH!AB~63Ѷ I;.| ~|-d114|?1Ye$:͔ p V?E@2y;.S2@o9_MMφ3Mc~vd(ĈiyH*4T,D  ɊV42t@v=i 3&QH`$1.\52MYGe8AaunL 0p iA w.@7Cx4L ~A$M`9l-DMP 6T kySUjPMrdyϲÇ`2' 5TF/4;&@5?u8M$O'tiQynh; cIkp 7H0ڊ߲S֎p* KHVq^] 11:ˌ.B$$oSMd43Y0,[TP\$ĚETy( WxDEbK#w7 |'9cI-4-Oիk/s_)O8zYf#[[ԙ,jk ~}/ @%M" cqYX/5Pe8NbED׎WL"+Uj40B 4^˗ -c3KJۺ$,IYet3Xls!1٧0AU֝zIߛ d10pso7V\ i? /% l~+U+M ~l~˓e˵+QiOe~ {SaTA SAhlϚj!0LIsd <"Ucq;ICIRv֤4;r10M9v2sC6?<1hhE &_?~xW'3a&5ͺ\dDũps ?ձ_' %`h/9q4`R Bus*kcD"ʉX $+MLPAߺIvUd3`iO[[08Ed ?&q:@nGhZkA-V[Cd l$\GU+Po qrGkf*LT7!N5&#m/M$R:\bldְ>A29&7 GuDExSY)zVf[I$m[|޹fp0sm'V &7S:(8Mc1.$Pw+ӳY&_W]4o'e™O&t^G:@KCb8z~Jި"0BCJ#Ay F9xȁj͖ I<gAFh`IYރZ@D5iIhm$n>ɀL8Dj[H_P d]F5 &=A'*p6* @5PE9HZjhg 1Yrl"CLکmn?U . HqsK^\x-%Ț." RĨH!2d S$~_cECC}ROVlaO?Ϲ[!K"[+sS̿Z$iWĒL'aHȲ Vb ז =դN7Q]FO9oA3y]*?Dޱ[y{uAlMMH)k^ɉA gj]kZې&m¼=k) fwiĤUx `̓Rښ/kKE6 `^߆OCɟn;mi|ڢ̌so]Ghu_џ?3u|; $4B|%8|_n<{MMñYQeW̢U$ L.86{ N鈝.3pa $(A˔cgs aLG-kjI/RΕu .[{1Ai]9&HI4S$ǩQ5Ugm#L4"*v1t)1<oTX>>M"nj>50z n>P,Aܨ\hE5wA2+D""$ΣEZ(:"#%o C&adT.EXC@c  G;*cuLZ630$DU }a i~T)jF l7@C[V›v='9԰_b KO Fy.yH%p]DzA3$LZ@긜< sK.1/~NLI\N&C?YQ3hY2>ʠ'TҕT@oP~塠Q?M(d 5HY"p޻bb;dhafHIڑ{i%ƲS %gW>ܨ\ޢo?Ęd ԛZ*iI$&fR*"YZBH5WK`E>(H#anf [ު4xPAܢ  WGZUC1&6ZL  i!Fck0 ߿n)>D=.L"$i2#M-<"C$$d:cɂ u8P'E(\jvKN@]&8]i2I$*I ^&M9)Pl>>gPwHf]ݕ8M&|k68@u"ᑯ*9AXH" . NSk[4nH`#!Գ1fUq~ec\bc.0%Ԣf:>k-n0cM l/ SEWۖv{.] (M}tbo9L|77u<7&;ocf:D]u֗yAWx ˍ;h}B=Q k ]PiH&dQ}|aޛaG3Vҿ3?3ӳ.pq0Xt9lGe ꪋvGeIbUKjM[NRa`qAPct4pȿ@KTA1c‰p:l  Qi Q+ _7ƽS3Lv&W$ƁqOD];¸(fA.kq2wIa5ׅ2G{,8A2`Vmf I@" 4 "HVƨO5 9P?@;~Sbp>&I JZh .R(@ hH(kH iq'D&i&5RG?I#zr?Nd:{YAcqh &tCjLnhD>hLDKKCD60LAii I$'j..lg-%qh+jxYc[i z6M6S^0"H[MZ[ ŠuR(! EʸT\{H20k\mxGN:W2w-\',ƣ$#x?CHo)ԺwNu\G xdEG"_=}+#}^A&Y-$C-SۅG 4$;@w Qt"ou QO -7u.;lk2ͻ0eZX|&.W33xOĆh zB)j:iJdDn7SBg򉨺Fk[? 6'QsuHA@(AS0hH!akH.6#NCz^s=gtWaf010 _x3έ?/ ;iOLE(,='H.7K~gvl >_2[4B v ý{ǹLc)?1v&wB{zq> avq;+3zld L տW}L[˃1ZMd󸙼celIHJִ X&rpֽޥ{ceC-2n3WkZ"ȲӜֺ &i&xHy*v3 \D4H ʍ `IwyjS i@M&4ֱXA7Sq(Qzu͗ gk+oG;-=/e(41PʞMI!){(D ۪~VZ7TR`kKI<}rHou O規6l$v=zN;UtZ^y.q7Jm ̟QGZ$jI)P!KZ$y.&P h q&TC5#DIdWx+GK)ұr˿0㏊0Ɩ"Ne̻ yAҸA|I"adx$ײ [HH\pnB?S؝YOv#[~-t #xA7lᗒ]bFE@A2$~TF=ʻs PI% 'tCMH]yPRwP4aťT(kLw H l?HP :s[ 01h:K!"S>ZLI?r#7IԳN빌l<_X ?P`C;'L=_ aƢkŸp9t8-Ġ Ӳ[ ϚiĜItIYq$4\%Iw^s:296WR~_bZ 7 ID#싂Hd`Z?uu_%gI)v1Н| |lnװݦZpA_:>…i# o$ZVneRKz۰DZt9JĜ05"DS쾛/S ŽOFp(xMYN.'K$.U-IE SwRvq ^!L x"N:hUz60 ߇YGe:C < Z|U2 N+[؎dI-~.|i|@ Y~o ft\Uӄf-/^>Lg=>Vv_i+PGy'+N``eX\]w2|:[q?/ RU@l }ݑVi[$ܮxX9/d2pP8Pp`nIcD8n F] /uooܻ͞`f#q-""S#$.~.w&04۽? mCGgbG*"_7 = }Oxk/\p_ӈC7"A_"vxW G( H>[p?4$FL* F#T +5ZiAco|7ba /a (_ε.XΑ{\tjK!DT0@(b:yt0M&-XQ}i* LDdHdTI$jG 6Ì0LM&}Wk;2%uA־ |gpr?-n ~dFLFҿnv>'ȑ4iA ޛK{~q3MY`5$M,*"3V00õI$@Pf`(@NU,X0jxP0W2+z᪆X(t Q&@M Φ[¤M #uF7 \X f'HMQ}f8E+TǖD(UH7N%NBq|#,\:~_7qu ve# y}AO/Lv\67t?ۺŨA2I!l £\^3*jn$i R9UY-zU'D @Ϩ ʚjC@h:TQIf*ZJГC>]6c#U)T8@ce`n 4 0D y:?UKb@$l}BYZZ]"\ EN,%0u㕦 .l%ڝ0dj*;Mn:4Cۦ&('yQtZ8&#AVx7K@$-0`UAhVM&e&L `/_3La8x^9zz0t]@[ 8Z&m {6rUBmSB= w5:P؟+15bb2me憟nP@~ɻAGo œ$ L ,AJKƕ.Ƌ-A@y#i gj'-6bi.#{ك0e3X<1pi<KLx!|>1c= ~iuogoK^\k+(nEA0BA c DG'Leƾ~RMfZ@'J!ƐAZ[d qKAt0+§AtLA$aYLmET"bo`R%l9=uSn?D F@qFiou5dtDLLoրx\;V++[$LַɐIH& h!$y'{&]3V9LLii6\`TXf zj?+ dABdXq>S- 'C;wTb,bD.l#plv(h x_O<[:K e[5_##Q-$ S$&%-4~7!)h6+IVyR/˨d]lPI~QM>Q5ZwkB˄+S(abI$j.qFHDvONg0. 0RB{/{xN>VjpSM7ģP\ @ČΝWb6;M\$ QAk+山Z]ڜiUE~H- d2dw \\=TɂH1N]"'Vݮ"Չ{~WVw@-n6 \oP}guߞ|cv.+˜ܕ܃4 lf,s@5 \A$@!N%͉n'HiPRc&udI$I=&&{;KG"y "1PahFS.)eV`L ~=>D ]E5D'yof7R 8D t鿹*i3ZZ pp~+A ra}wY^yΓ97;7%.A0SZU|2̬9@āI; QP& }φmG n+eE:ީ.c0[ X&ۚd[Hl$p0-'n/?467ND j  3E E><; p7.UKc5S;̖֜W@ ^yDjr\L@(꙾R& TES q4A@ϪyDD ֍HbqĞVMi$,k7%[RxMG+9L,\ӝ!.# B"#@) QؘE{DVNѤװOZGYp\4M@R31iOp_Bi^?:M̿(Fa O+st]RKT JxI 4Ad!is$=G7!)+ jW66;q0ϖ0+g" hF6; dy+@Z\$ۍA'h|8dyZ R~EIs36iKZ2 LN$pݫd3SۚQDCm0+ a"N HY:I",h62#MVvMAdOZe)062dDm&$E 8PJ( $i 5ۙShْ)PT~} r>3|aE3&ef]u8eP@QP$;xZ-@DJtq7)-ȦɪI$yZbdoXQ0ZI(Pj$PKi PmfSrZ;R+d TfuCksZJdDA>thGۀH4 ǺIWGE)k$̈4SD4'E>Np~H^u6 1:HG^>63sN!qh7 _uL<@yYpz0LǺ@"o¤.& 6,Rf,N⛢$la^ h9ʀǺj$P*PUAy\f]l~uP̭"xI:&M I6;&Mlbj ӱM")6[.v$zS'3Y݇ ~)kE ! m +c4>$6D3z"+] fDϢZI7 1B ;.Ig4V e$~~z3^$dw?cZasA ec>Rx[n IbeqYn%mˬ=D>S-3p48.!"Cci0| u71/1'G-{\:\pu(Ah38I;Ps8UTF$}+I{IC J9LPG&(oS Wޑm$rH>i+.#KpU!HyVimhֺLj{pyAQK`lR]rj/0uSS|U5'eDGoZa0)ULI2 1J5mLtƣ }PIpRfQP wDǞTTR(q" A';bU8)kbQ„+E8et41&V a`bK61챨3os&+*$xHBA$MIP[b3C;U:d7ro'U)tE+J`+cdzc\.&C`uǙ35GRI\'+7pF!k'i$ [A&IkLs[L02D]4UC@M6 4CDɁ*&RVT+3;I%=%FA" ШxPsN%"Ab0`țz-3?fq1^0Ζ /&.o3Lcį fTD崵ӐIhlʦF(dLA"U;DDb"BjG)T[yV'ej$QdA=&B쫙.3( p&1[D-2B%nsO`TLSH{vY<ΊOe.'ʁ4ׄ 8rg^DŽ9,?cfq0Os^9k31v`p&:>c+3D6'IVQqX&=Tw6Vۋ(q+\I\ .Otw;晫́-Nj`L&fc"'c (i); Pl)E"}9@͔I2g.4*.p7VlE(OJD&$H";wOv6$HlITz(&h+6Ej@>\*{(b` dw/ k 6,| d1_?uōg9sw5+JpuKgH  +V)D'Q0l9$'jl> ?殬ˀ< uh $7`wA gsǪ;MS~ҡaA@jD}ZMt7Qt\"B4=;&5*0I`7<o "@#Pn =ch u vI2DSʟ4H a_E PE濪\M 2 m#&]CKSU 5D$(` Djw@hhgK[:e)SD?BF虈 haq],lj&,‚j ZJ˨lO2ߧ &Ӥz!5+Q/ ἷQgK{+.|cUOhU$P"&QLK3_^gHRNLgtդՄ)@N4V<ᧄ1G3y (k}PzC09\R6nbf 2*`LvTi2*06K]cS A:Y\k6p1[fq2fj@t;{손Z}nbkKM:Ose10p3qNCt16Ѥ4O0g`$A bZ U8l&yP>SL*L\ "\PX @0ϴ$Zi@n;{M=UPAh'Ph1I%O$xLNúpwϕ;3 >c\N`dvPk1+.PC(-mj(f I.%j55lf`vZp m{ @HAtH3֦(h` W{&Im@ߢ$T*p_˷{PZ۔H'sE .G*w $ V7;w@#*O5SIaMEw5ylL.ؘY$W.o!y7a'KPFJ'E`YIe LpF .74iP"Z~#biKX\Z+Se#qF,?~ f7&]AE=gtkpۆ\U$ui$  $!"TL~m*|aF,6\` DIhD'^O2sc(py6cx{AG.9hi RZCh2jI5 7 =L/O>GN{:^C7m.qZQ<#Ѿ$fr ̷/5^n@X10F(A]Ε`eۆG Lx_,<*ˀ<gx`+'ӕ|k(WLOk ht!ŴR4 +t"(Ah;pAP3@ XVITZ1O&x+R AձY1j tJp:{pl6AUM7[kDOKxaD4RW@y?2ٌ1"LӅ 5hV@4ǷA3d,#bNk #LmDfVP ~cǾ)a6.!Z*WIyg]԰\щǁ:>g,O;,ls : 1kY7.Q2 )p'T@[Q.3kWȒ{w `x+;:N.VfZ5a`֮sR_ysO䮩p >XC^,hAk=>Dx3 0$lN0$@1P8t!\\ He$MtBq$LB#UpV&Qh}Pi[vZ$.\&c0,).qK?!WK܈[ k0F $Nc[.f 7`[.Hpr7 wa˽tq2yt)QCuᙈYsLd(ȁj;Ka܍C:t =*p*@0ڙ&Ҙ# ٬JpZ\0I._.Cq?`\u vY2'n0% wULMACX;;GhCuOA]3YAEjF Ljۃ6}#H4+?O)oZkq݉ӛ`LPL֢ EuYDEr@QuHU i$@u_mJ!['HN.RIu u@.8|sT5L &='QjfMimCA"kIt_H5&fLmkM@kF$6$XQΪ EOmMI0NҐDW&F.UHePMMDX$:fK4D;{a'N$‹5&HRO!@HlM+Z-x*.& L R8nZt n%dHh0fBA 3mYΥn3,˪=M.QS3Xs\c0b+3ճ8d ln|_-q/ f:s] '0݂@1 kw)m@Sk w 11@U2dA FBD^Jx-8Wz% 6_;q/-tl~?#%qؒu ?\FZWxC5LCsYl\ xr;/3`dlLj&?QjIv,6־Oi b.x*&M@oZjVXpƒgV)"LTB諯E0REbu?HخhfIc9ՈJ]_nI ]n2N<4hC6/S!гGfsl6-"h)&E aց.\NA ȩ 4`[d2Deϓv^fb5j0V ZA$q(DFܭ{$H5P In RdK@$qxP2Ns 9LWaF1~gV^L\eZ"-{V Pm5(:k:kAQ@5UD" {H{z(^k'm PxM@€ ڗD@e= Ӳ+) /ц S]vjV\AlP'II4gK'Qj`7@ǘDʩ . pyUxZ"'M@]1 * P~LD@U@"nFtx@IdA+UAhQX-4 "kAX(Ouj!hnOI1.l0y 5q1]83IS5ss@:L OgLe8/Xk1Oq,&q5EIa5Z[S1dje*/ePR7P0!Pf(&dIm! zA0BDs"g1n$ Dӱh50!uv;ShSmsrx_51:[ Nk[.sh^ T$J*h3C#WTBbfCO3rT`1ajBΣgyGv4PI1%-m?´jIJ@pB_|:^!軝OCM.C3N. k..~N\P 8^J뙞fet4c3Z 7^~.10N) F-Y"M}e,yk&}C9Eki<p#aKG10ÅwX̨M([";V i>hYoFqL)0H?eQL[B_:kZEX ک 2umEv-{v77~Kψ12?[ Ȟ /ؼ}:VW? 8FN;tmdV깞q3ywcb8v6_ 4e84^UwR"n%$Ea-$ԱY|6skq8Įvi(.idT&ҏ2E-Ah˜@0'>D6\Dq-kzOKz6`>wkO9%'Ts}լH+Xxx,Eeڜ` Xs ک5TY*0_SA;Mh\̀! 'rN)]13isE~uΫ`eƜ(H$}ͦ3jBˠT #q0hLv\BI LZ@:fUi|fU;A汙 Hp)Si% AV29=Ak+. .\ֺD$[Ql\%b%żE) 3d؞ySpQBKkDFTĈ2u.7qQt÷e7b|ϓ`LO/4<tH,3CD }P$ɠEje" HV1ou5.&I'm!Y2"DYUC$mRX%gȟE"fߔ o_S`5b̤3CI$zE@ 򝖃!-s;3sK ߥp@E6Zv9cT (e,9Fc}TF.`P&'az!>ޟ԰v\He㖍@*kH=-?G5P>Mm[TkQMF7 Ϫ y|CEAA29Ld*e@L׽:2b <a; OԸ\fŠJy.4 _P$!AI7]ޛ QMG*x"p 阫fIHn&2=`:iĭ|uonQK$lkV:C.-?N6I׽($ˍhhyAp"+Olb4պ;SP$0@DP F W8.S+ ٠I+:^s9'ȟv ikA&H"b IA",)r| ζ:z"Qql"ƨ$DLU4Kdͩuj& '^itQ"d(lE6YA-5`,RF sg.:[.xW+)5^RܰcrM*ȉ;;Ω%o Ly<b~ii4 /10hO \jd C( R* >*H=N$VZITȆl\lPiqGei鹳\' ڇu8 5}qLMbݥLQs;tW xSjš-̅5J>a0kL _{ʀ:*u4ڄBjP;83SpيӼMyDk@ zN6cy 4wv^Fh0f0]HlЕxZ[8.|SaKA؊ { Q0"HlAJNfR"(y3@J(I2,pbQl4ϺCvLE88j&&wA#P7$TK%ѱ-kƪ-f^lBpx.6pl \$7H4QNlH޹x8f KK qq\:\㫹YozFEԶ"n _+Z*cئ@lc쾷unPu3@A˙@_+?uA- mJZ_8~554Qm@Rl{ }=2l RDHu;ʄ;ΓQII.A ( 1Mkp ˶[| uadS{$V{-&sd=HC]L"KАF"h.DUiVdI$ZSBt&~[ïOtZ\]5Vg`š|cY$WBGQG [N߆昋\f.;_. *9Y.V#Kk!'5  V2#x@'`Z)y2O7 x۬ιXsXnu)33]'?r=3e ` p:cY1%BB ^lq&xVD". 5JCt\ pi꘹&1&yTiʿ֩VvSDoE L e ɧ4LpTɯI9HK- &F ֭e2RoN:^'Va> uM`Cks3SM;?u1|7Oa3GQ443Q󎯝l|] yspfVtjmiQ٭iMIi<+xl,hqq4s;",kpHH \HHl`2$t2xixh؎ՈѦL,iXoECP zH#zN<:Ls͜75f4-m]{О$Cb[~caa@\ M|= GWmTɚ2+ADD $PE%$?3R`M$,EŪit nPt J+ߪC<(Ϥ} Mx&]JSmlH&*&M̪"Yh!Ƅ vlR trbeXbba5A-5\-}khH:U.M!OSSR#ܶ.692 WA" I.0fse68aY-n庆W=YG57`]?jԅ:6[4ba՘#TɐV$4R'i*1*\%Mo-8 J., H.|Cv] urn6ZNkTiRI;$^YHiIv%fϜYɇdbj;2 -6 kN j#x'У dX6tk'P& qtx`O-'O ~vo X嘎  aSZ~#`ODdN2)1"MdOIodvq^w &[|BZW4\y|yhsDIq,O,!bZ @k )bkba<{ {ō|S\Rn&$I ZD'JKi3% yGf+\c7.1N4tSqlܓ0f(#EN#T0A* DV6ɪ4ڀ$-z1@Tb"wN$({ .D0jObn"ItA1Ғ (pPT@B:d7Do17&TIbkh.sj@5g\&l $V};$LѾc3BmFCP)k\6 O ap\$i]G$E^zG| zӅma@bCM. beZ|b̅SK(m$-% .ƒieR==O"fp$y hAGX J@qJj't7 uS@DEA-] QHrtا2AG$-&9U$ Tú ș4~wXGވ&9A焘FdP)s]#>ki:aK3 8( -N.0b<Ւ0 ʜdk$jM)MhU/"M*ZQM{YT1bMk2T REQlHM&z-6&^f~;^ U^j!Ů}ៈ3+Ӽ=1ysZ? @ e:f(4 p tz D(f=DK2 +WJ]2?-lc\2 v_8A$UAmIR(IجLPoJjvH1P@>4+TqL1=jg=^ B+sdA,O*$'9|q.m`Syf>a2`B QPxӡI]`#n47E: : s`H j%޶m1H'ϧuK12 5 Z^kKbk {Kqdȣ)jAlaʧQ 鹐`؍ǔDij"ӴPP)Ufځi͖ۄZCMi, OiSܤ F/6nFrh$w5J*& mBa$j0E&kPEcv@"Pb:]ȹnfe$ɃrkM~ʁcϖχfnĹL9N,6n㇎p0CXM$&LJI"EN.K&3١qpIs=#4b8LZ5sKl,F3r@}mq[CFT߹PL~2`[X"?g"2إ+cK(TPDַdEi(@;B "ʒbM]S*y~? &@ Al!} -i>s@Mtr'[bTd 1 Xl/pm+^|<1zIY2$: 竨) "orPdZk!ف~APB|AĞ$dXr@ <lW9|o3T7!vP=G3N_ `ic`&Hl2CbDʴLo4l7PPy'*m6(rCi(n. H;U:28@?  XP0;vUm !6 f'TL;AN3*&`#N"$Ę?π蠠Y5@6۔6uRJ]ZZx x`4_xoW\߈zr]_ _4igffp#OnQ2LPa3eaeX?BZ 4MbO4l$t|C82B }Jf#a蘐K*LP/> w;%xLH;.-*BwT nE[R? w tC0k#r;?;PRL;`QN0Oi5"(B-4_uv& L.u)iViyiZ$Tΐ4xf0"{=_2=?9FG ɭϺ2>s4 ZTZf=MDHӦނag288n\du#5ֺC!q<,6.q0+|y_9Ah,kG$lW7|wυ:JNE35g`7y!N _rF3qZuC~;/!2S(X4F tHuc^##.2I#j"ǴA%$n+k 6DPPLl.3y|EB$0=eA"OuM4mMU&-u=T<)I iXc^Q+#U P$M)|†ӄC#TkY_ws8yQ|?=I_ݡPf M˯sDI;q\x" VE`$F d4&&f7H ^ʮcP 2E}#80Wc` 2:l P}Vڀ`0>VN)!M(U '@&!O d7E\ +ha􃺫 XA00c~QePDᗟ(-R~LخKvI]D< .J#IڔX { I"A3~'c'~}\HøCUV P5(ӤLu8YvA @=zC¨l"ilŀ6V5Hq A=%&Dv4Vb H"!R@G&"f-S'* Ge٫?H0B&9Q0jTST9bE̅;KL@| py wI 6% B FPּDeęp=oKk{ V3#IqK˜A#!`G_@H&($y`UA3] ![I͕c"J=6K_LxkCaH @h" 6Kk${We }T«iMD>"mm z*H&'t2M9T>7`;ʉ7Sdͽ6I80JuD*8I-2^Q!ZAA7iZin ,hb,H˯aI $4L5NliU SUAcqCQ"DjqPһy\l 5EO4+d2f,sxP4pMb+n0vMv5&=y(\r`m&@iߤTHӷ&iZ;K 4=A0o>iH%-u lW>6M8 ?F *5&'H^j:(7T6ԒAUKVm>XP&.Q@C$@sCF h= P NJ Gw1 a'뷔c7c}beVH NG'$i10;$IވI T(y @7H*_v 'tj& |l z MP{\Wqd$n. 5*piv6 R(|UiGhC`Rd4+R)J\ Bn&6GC@+z^`epOkBj*/&.QưT&mD3 hH Th;baA!q'B@V4k*?ɐ[2 `km~Pi0`q0\F -uXؘ0k@wU$\@OQ#Hj rM6鿮cLL:o3o .wQZ  6[ S-u I\XIiڰgY$I0h9"7:7@ʈy]&JDϘTm(1c`1DSQ˓ Čg`` 2=dڰQwQF@H5?e#eR}G $@.kœ7J@U.&X?5f6>&(%-@`"$?Q0iYLZەzj r;7-oЮ& (67ɣ{za~!hk s&"4QdwDZoTDi4* Dm$꘼Y4CQCIVȯh1+_)4RQ$H,b"v; \ W3Tb=&^L|'⌯XeN˻XacBY8Ftv $\UT.ŒI\xN:X &ho|L8c9hp"A踁ʘ4bhh 4LW u΍6YYpRϓbKh[0p3v XLz.: *T\G3NvM5Mw@}2hOmI$iCwA$`}Pv=P -;Qd'[h.ac?S8z]C<7O%C]mP*}xH>b>Q<p.Jpv. u$IW{ulFfXp{Pfz-|m.vtt/t^2oPDG5`G&_A W+?f˓|=C_%2#'~H!u3x8A'>t" Hu8mf} *M;I$#mC7c{*$IT4Hii C`p{"4 $ADY:3+xY1L!]0=J MeRʁ_U4lV҆dW#E4:( ^f2A9}DRj$<_1MDY{Hin;[Ct>ұ2x9p݉#% EǠItS4;6bw fp`TƂDz)͂m(Hv'M"dQTDדIqO_D8TrvPR$H:k]H߀DZI"0 UBMIZq %F+P3ܔ6v Y]j\VE <.T#Iփ80H1MIE H-~RںK7Q(ߙBb@A"&Aqʜ Is?kO ,Li\` .>7}0\D2+:fwLb.1~Z8\;eA1IEfneRLS6!Ƞ1>i:P&&nM JZ:tO/xĭ '..xc$O`~?UftL' H_MBDi>7d2\v&'jXgE?[zo Q#z$4yvY.~ HnCKbfDLH`,*M"EpH 1c݃\.3Hq1JӅ\T[Q#K;rbiYʭ>dV&$RjdQhMm40LD-0q݀M50sLֵX޲| \z7sx Ehy0߄\z=k&koŗ@"1HLMF.1Q=KdNd8%#ois٫aSE:seOFnR 5$ײF &^&DF$izGP*`A0ѳLMX@k<+ñXMՅC4O2q^d '\n#uIh%rdj(}F4C8^@'QbyK@.L_>P  mR$Hz,M@4@fdE%E{&a)NӰB\(Nn@ g$aOL.+J u.oT6N>Hw.h4YrShL8QF$.$A@T@3oD\ ͕JIl?2[U͈6.ak 0Fq Nɭ,= <Tb Kl"id.;.L|όv9W= cZ\j12y5ωzra3X؁ ]Yð\XK|BXF +q6%PުiZv]ߕ~+kW]?t;+Q&nG3N.&_-pR0I1~TswTd3M&Dh0(*l"+N& T(6iA"8)@QA;JZ 'PVKcM{-@KZ'K2lQ[*"\ ;ϺIMDM."ҹߕnq|ĉ?uH XoJ(/!y\HL ™_[S?Q򢺵~!y10m|YN~K.^.-zJ'[emq.{N;L,g̈́(HGW`CSiM"z*$d&&D^w#`bg0#AW.eS[">S-I- f Aߔnoe&2ݸYplwK~+r*e0]ַv+ :Ay1Gx7 v,$}%„B'I ŗh,5Uui>՝1&ěK"?+2\fkH$P0&ghFʉO( $ lTVywPpr ƕYL ؂|<Wcqx~TeGQ>adg c/po+1\W<&\r`ASQ`nI>Y&XM=VEy.s2L9&\t`v(:dyf#A^l iVi! 8 P.\&#pȌAVOb |qiLbG9qIVfUdl` 7]A]ZQ,0P$g%]ϲAw|1^bt~kyLrȺ A ;@ gq@>Q5&-H` ~߄ "rH]I(#I0~H(Ɛj 4+qZ")7=<l6pRg`AJAP!E}PZ 6Ie)Pܪ @3Z\| @V {:ot9X zJ8loH$4hǺ\Id pDȑ?t-jR-fwm/ u%Ns l&NUTHHޗT H4AiHl<N2$p33 ڈӫ3ē')"wv$EQ{(M&$P` Jʠ4'Z<-@7>:AJu"LYjjW EfI"(d*5،qlګ w`b@9UnG?<"U0C}Ox[5eq 0/Pڱ)tv1);?2G1.y{} &J4t'V'zID)i$[5+X= :p0bXcH0A컾7~/R2NPˀ55i ǖOk,sJ'ZLm+gMng ؏X#oX@hAXYd;$'tymxZ āMYM'OdΝe}BT TO!uF1q\j-xq]_psX9Ƃy@ ;UΙgIc崈{/۾ތ DzJ:Č=9'N[ܯq1NPYcI3sb"\`Zj"!DD7(܉6U6?H~Wa- qd. $jLI5uMc-Qh|KͿl#Ȃk.ŸI: bZDCC`@7 FMG6 @`T08OEvH 4DMd9)"VCIDPybf :AhsNw ޖHOuj0LFA ?C$L֋x-o`$6k ԰l͹9ѺWL"!>2)5tiS.tR[b 7D#)#+Xx@&= qi TC M#QdT+rnDNۨjD2akT(QIYH\5vAP`sM epӤQ\ftᵣ|wNajӴ=;$ f&Lr>穎W|;P]@DˉƸO cc1H"!  j oYHxW5h&chv ;&nRiP$lØʼn;-fr'W_I\*`D4}( 3+bM; vZ,5 D% H0"q Tj jܔ[~@l05-:G sَ܎&kl2|Yt 3`Dh,r"u};?Z{TFf1_R*9y sD&J~i&Y-Ď&E0D 2{ -e{/sg?4::^h@+-D~- w3CM(dUbuGb$t z-5!،wI\ i`vj-dAE OhnWon6Y$6nR~u1.BafظGkWѩ;)ZqNK9쳳]3 ; .hH^λf q:nM@&=%|"Q('m AuI2n d56#8E]!0aϵA5-r>٠RaESinP*i굦N20yX.ۄp&{ۑV"ETP3X|77cipi.\N'd11Y I>ď*ٙAVwDL"[1#p3/ l"5,zcߙ\r$ bs 3*c]-Wq:.OU0 Afsx=؏yI.\3"MUb i VbҩIR<5t׊ 4B&"S }UhM%R4čZv]eÇk(KwzuWb3/7ˀw^yRhLn N8bMj+A D*$A ei \P LQq&ԄZ 5~W8&s+-U 6Gl >PihFQG#;$la3 ϙq0)cA!d˄ԍ]P"iyPxL(XH7P .1pB`seI] RХTC Xn`atb&)dC5-Y.UI)J l8NoR{haY4qi t#PhMi'A)L ڄy*̂b.i*mO>bkXP:o1[ϢabF."b&ߕP5 2 ,a{ b 6I"ZZ~ְLj; 8%x4(b$R޾-20fiU3_I'VW3:Г LUƦwr)-f煜P<. r!bGWԢ.!mOc ԭ Ѳ98KZ,M8VѶۤL @wQAX*401mVqF8,kM.R11 q@P$H bCIf~PH6AI܄ aQ;q0Cl @2.%iq0VlOW.^ vXp :Di i^.A",*YwYUE$\֛T음BE^\lS;V`LP>$R{ɱ Md0tv-Vfz£"ۤM4&=wI @_k*tW-pfrba7 1 P5IvqS*dQbH-X+kɂXmUQ _@wD( "kXt ꍔha )\ ë5 & kt^  $RMZ*ozlǪ,L5T([n$cKch6=D YAD@ IE¤\;M$(/_dKNeDD6e.$LJ:xjLHap$"eԕ`LmJ)[.ㅼ6jHYyڟP WPjPBh9SZ +F$|ؠ<[AD" $(kT8ZqQ LFΣ1wZ&[E$i@ÀhYU"Pm#k"g=PIP"a;JCcnW.3j@z<]l:0Ao,8"Alʍ]33$#¼;VhipS-.2M&P#u$">.%%Zf#'oT ǛU潑s}$A# } J`Im*A5-xFDo٩mY\,A O^]/;6C?9N&ED)tuBH.)ue@7ނ7A 7j61J"bd~WNε GM 8>V@3=3oC 7lFݍh??bFj V fA>$Glťvr}S9Ӄݒvn9e.&\Lq\.14K4 HFH%B*ڠqB@A1;4Z%S.c;,T(LSK l? $MD`HY2~nVA&cVʾ*;%@L* `U ;TUuHlT RUdvDR&(\LڕKZ\]9^ @4$e eϖbf̻\5.,Fba8`>Q߲o@rIrSAXEnH]7,pe˯I5 o&ԩ$ӂϚ 1 zz/T}.LJF&l7'|.q]@E`V#LE =ګkE^I4;U&)h>P I AJl0\8s`^?wOyL^vb52#5 o%I*n 4`H& ȬdFt4hUD$), RB0;6@ړNU2$62$/B8Ki .-ۥܩ8'fv@u$]R&AؠL(#(Fe;Tē DIQh$Zm薱Ӥy$ %!՚p8_|#ҳgrxx`bj?x/?O/VG.: {m"@=TCN&A<隁0lj\\ohX%xZ 2Ew PҩuM#i*< W\=sc6A14РZ4.OCk:_S; >s&M_7f ^MadBCCa {,܃MPp4s r6"cTGT7 Pˆ`[L'Qv֗SEg-f 2EI` Gܮ|XvEC6?,yF]X ą&`iJ6VA\oimNӂD uI3x*[#JwLɣ!ZEKRׅ4X qNLMa .wWq`baUi:Z" ZA%DLo~=暉ҩ 2/k,iGJ t&&ʁӵ[4IUj iHIo1Nު0A6.mT8כi"=U5 R{RsT@qP WEƤM;?$MG^De_/[5ŤS DĹ:0{yCFʃ$sj@  "@p')"Zۅs{hT hMӱ/_\fQ5C$L#xLPcQ3PRZ,>To$=TZ6Q>SÀS V(6$4ɟec~e% ɓQ6ʐxh48 v(LIJHu?7u |.״``5׍/xX3U q^T,>w5 Cwo&VlSCE d/eHaZd^S:Cf]$@8UI#H"(J!WpTf DU$F" 'd"t2عqS(#I󚒐GyI eՒm-cI ?OE RS"MHt7@+r>4RQ>~=6\! q8 \G:92e búF#oN3ZӴyV`DTOaeρbyk0}[3 fq_E$tē_&`EqpsL\S-2c&VNɈaux@6F 7 3[m*L?u0+B-h"I6"MEHdi1$ S}nOy\q7}eNm&n$PNp4* @iAsF>Eseo?ND ;Y~WB/oP~+u,|vlH0 $Sp?D d1p4;L3qq2~:rkJ]-{'kHsbjS ,wsS(96;#ԈTM -7,Ah *dxa@")E&#u Di>Q(U L~xY"1n4 pIc~ A@0yKL4kFCkTIM4TMGMaA$E"dXM/t N˱鹾0|\F A?eՇ^6(yO-El(I1}I HH`-0 1C ؕ$ /)u>TN#dK|t6/ܬ&BBl4O pH ~!?᷊2< 6Zp#jU}[)ɻ3^pɘ/ ESœ*T(Mv@A6EuM 0)PV-.3.im5赆*$;S/ik@x $M<4`."DTmIڗ)t+(89YE;(6>of13߉^j@&@tf@E A16m)ku%ׂa1-J M@ - m~T\b&I6Te$`t<NӜ"ᬋ/e:~sٜiyͰmV 4tV"i  NL֫p[UqIުy> ?.f-n&&](KM!z_|_/ pDHMo@*$^6Y`PPߒnQZ. M#}K8h}Hcp[yPM{$ WMLIi+~oE͒c;^WI3ټN&R$N6@ aISdۋ[u=WgzRu,&c1K1q qq5&WH'QjbAELCi$|ԑKD# *nu0H*3o ؔLWc$Y[ᬶ'3(@2@p\Y 8^NqNꁨ4Se:Lm)`NX]G1|FᾮkL{י7EѼh&EP`d#o@#DPzG7Lk'a"A:ou&`RUE[J# ʴ_@r`c;SCZk2y:@]@GD Is7T_eXv}^?=vT5oz/bWv.ΨuAt?u@  \pj3VtP/Z.l\cv d46\N-ՊPL6AYIb{RMi:|5 h6¢H;( sQ,p~[ uj7\āAbTHe=A0ϗiI:^CodAwCZQ]KCE4YvƳ}e|[\- lI&l IPwQ~'wU&a5؃ cD3YyxYxKƿ7e_k w3Ө꺞F@,p*] 1HFudŅVDȁfs;-Mrap Ck/uCG0 (0L*}HEf1]0Kp٤.2yoYөĒM}UL;e3@>o- F jY4 HmO)hnwT ?͖8XlMO+xokChJu@lE6]ޙճ+78Fy]<\Wcc;S<'eźLvXy/6 $53r Pq&HpEG)L\( I0}ei 3#gQ\יIR$ LcnPgHT E6H|HT$:nKAiqoHVtɣͭ[6P{Ap(Mra<7A0)jWVFrxkqIa7"}2T1\g0d6,ogY#^#UxL>9bj;O66u )XWc|c^'YL>t4ƃ1115:Y5X m[-?Q}oc 6`ߺ1 (I[AWy?քK`l..09UD5w 04iA۟D#&ݔA#7d`&MA*7s1#DؙؠZv#~ˎd@FZH^6D1 `"52x*D@P.F#֫!Zt:!puI5]"H&2BH}mz$ l<7ڈp0g8IR!$E" EL{WB-sdA iY4o qiU$E8*H4thElpAPΦ=~;.chbY& 6cC=@ N|fE}e2 osؙZ8Q+1"h.Mm"eShS T#idH;]6 ۂZ`ԍ)"DyLT"V>k]Dj4"@jV:K\47UcH2a5"7U0pq$er8hn.y#&Cxq ?SA>mA83 ԭ.wtLNbt=d Qu L ZjM`3MF gahEA$^I]u k.݄5^Ot~Oh/O|a__ǘFEQUUa3=TI(GiCFI$l!s<D$Wy@ڞQ ۋ-ᴹe#r8a0HЕH#k(T&P1ZvΉiT8>eOR dI O~T`5e<] -؃#e٘z/k>~"t\ +0z&Vsn\H!y&IgccZ(D?"ܧI޿bi[ pAq&+I= HEj A2^m vQ!] Mv+$ި5 vCk b# 2& R8FWwgv;FЛ.Ikx u@=>uV2oqiLPR'q E\"L1&}CfD(R@$m?'<|812hI2{R$*s| ~B#Oi"cnj#zQ$IST֖V.6Lgd<orF :`PQ &T 18҇UɃ\8c:U$"PjӐ{T9(#@MHՏY10$Zl1J:G{,Zx#?0K P]";FGl ^R".,EѨˀN4䘎Bn<{&j Otv028/inT.JUo' bj42Oҽ? u~3oȱ "pxGڈ0( PRA=A2.!:i$8E`5#0ؚǧ(&GUNNj a ȁx'Qg0-juR M@̚XބPdMDvA2M %Ake:uT#LMM߆'ÈqIOձT pjeFA.fr)ELCie Exh`e_U@&߅x72+'K$ 6IeABfMDÔ$[H%Ndߕ4$;A1' @ɐ<-JDF#ͶȒ&ֺ\KT$ kp.3]ӱ;\LZt\I7߿oP$ff@U +P`pEFj(ޱ>6"hRj?d@.4Ϳ[ p ݏ䱶.7^HNM!P$^>ɁUTF43Jh&?'m$l]FdD˜@#\D Zny=Ch^@sE. 4B9Vq$\M<5dH xQ vH\l.2+IV.np-6S0Z9؁EW"HDA\d@iII;GG58N!x;WŽI^~cƭE/uogS-}.nrlIV R\C& "ljV4,5;ʤP8`L8@P6dFdf tIA&i6DhzX` o`"%hвH8@ 6[i&\fb InI VP gu6b zU'۔]N/7b4pU=C`e0 v0 H A5ZiHq|S^(a;a0r~v#bM~4\;xTDGҿei< Y2ZȀ-tY$j0]SclA%q$@>mR1 7TLlࢗx2N8lyS'2_05'5G pwKx<"DR֒h D$0!f!0dwX&fgp?ʮĈS)C;U4#S"n>`b%*dZc5 櫹3xxg/%+0{rVCcQPbpIBAk3t.J(@6=Y4F ?Z/!AKtX!xTA ? ''b.IHVW$֥doDnwm'`H$y\R7X] QLș `yK@4YkeD~Zu}zfE PAiti3in$+D&#LVoz6 &D8Y-ԩ1&Q7A0 h~TdPg~3K> gM,#3f]Ţk~k.z/y԰S ̱ F"[Xo h#q ȻŸls@\Y&_C>X+ReQ¤=R'V7ښRI<(QFj/xE~YZ]ReQ i+Ht+I;ʜy6"SpSA(\H#n"p#rG0Qf/$@oI" pA+`P\ kHSXsEwT;PPi۝E=$Rf7S&($~U w.G 6f#a7^] +Z1p\f![m+6#k;q*Uj´*`{ 0hhiw߱$q=Uaʋ׺ӟlXmy";B<55MDz?O2 Ӥ P[ZȢhi(i 5E@#J%[!. 3UGFETղ%F UJlE }V@6 T )p$&HT#N@8L\|̘_~tLp1F2Onkټ&$T_]z^H Z G&A *qudT^in ͒d&yCjJ֒@4VϪ'gx!,-;V0-dD iDmTV M&V/$$$elPRbdM.&HN}HP "Nq8GC]֚tQU~z?0?+9_|z3 an^Zo&e=tG/4H[̠));" m #$TLVbd ;,'di> 4"@Cl"6D"f$ vHI"̨$ʠpS Gd$@vՔV+4pxv>Р54ԍ-кocg,|L^`HtIHdFIo"*'t  CK?( O%yfTNe͙3>l` ʁgˈ3Xv6*i:gj}3#F]ٞ  <'a7IwLȸp7~#^:Oag i{` }gXf˗09s @"ۄc1tݦ Q#diKpi暪i$oXEjDA7.[0@#nW$8@V0w*n'j#e7꘭RI **p*=T@1zӀL252ghImE 2f'~"DOkSC_X '^aPNU1Qj{AqRZw"A -$Ir O%iu 7=6M7Q5p3ӄ;S)w5Q#HmA1ey[CED[DH #MT#L>;@"(=]S !]-4S~"DB"? hf4)eI&tq?ʴhP6T7߲LcyKL Z@_SOF` A~ gۚQ4i0 _4f? bE̯Gxoxs4̿Zc䱜c0 ײIM”P8"@_M*mNnP\QwCjd-iX4$*hDD]"(bmI \#.P h?e2MB){$KJͻ.  NY@ˍ @l$^HxXvc ?Uyt;8ƣuV+XS~pk' VL +iT5˩;j귇,K P8/Ĭ\"f0na1db$I ~is?U oRr7N>dcGmt@`+`y$n0bh:cE쫸H{D0Z_ i''(9 {)H{\c|GLl|M&COYsfsXټbSQp h rEX;QCJDqs2p\uB jeiZj "> BISX_Q%sᴸZ x?n/~!hp ٌ\,-ϥ[?!~_cKHp]]FӶ%LҊ{XF[=QQTYA?2"G\yB`|4>\L z?[X'M5)1$p$G>˃M#χ.Nc#0IF% .`)7^g[u퀪;V,&XZ0jB-X \iP0ȚE&uy* J j=7;Nh@%VHJ&= @Mnnjx߅4O˨NATz+D6#Q0MLOYXhN΁]VSd}bL>X}AH-aKSth&$bCHTiHlFbiTشE]kO#PPu\P[#˸YNVR<]H@b' A4F}}W6_ E(B{EDRV94$z(jmz-sH&YCwQ֧xUH1.iS2jiu$PZl.v%-0  (,J]S";7I.;dUסLI4mZhH@چ .hiZ-"Eon~ )h!1@MYcR"*""T@&yKH0 b(MO &TK3K"3J ֌HqSNC;-88pmd li>cy*7 E6Zݷ5X>Q4IdͯMfJN||4G@ Do7A'TsTËդMGM! Tk{C)OjUXMeGN#YT HZ;),-EAKwVHtw)l4̫L(ED b}nH-ʝZ©`^?d&HWjbO|D̚DQ>yLQ(}>b- a5G`f9B@$O( ))$_¤P`[dB\Lyq1-kjdG+zSqn䱀8H4+Ki&}`rpnPHmmEK5G`Q4klG܍ {{ #ed֣@@U- Ҩ+м(-h T8t+%ٙ2@ҰCF+aņ-6lb9yߖ0" tEAxDowPt\L}IL&k-p02Q$ փiU ME )u4&^~VlJIMH5eTi;Q&b ncAa"q&HU:H-(c@ړU7-AZnIE!ځ<LPVlxgzM`냱Dbjݗ̹\dDiHH"m쵩Ew2"/+=G-0۩LLlXNyn$4,IZLI iSCCݻ,9ڱ@ؘ ` U6$$vU4VnCvL"I#LA堊h0:" 2N#.dH z)\ PIl`IuPDS($0jUI$PU 6B)h&t" huN'HTn}@U ށ 4kn py^01+2w=wY{qZc[i@4AI;S$R'y2e&DgIٴ <S WU,Lʤ,XI$z&(բv챆 v : mt6 Lb&*kk'r=w=@ : $6%yrٷa:I\pO -3 ؏Ӈ/&$h X\\<,pګ\`V b]NG{ UO޽D}Lײ;X7&Geݕi8qنBq~$ dME( 29D eph'+N~|i ?~,b82/څ|3"tI @Ϙ h P (6Dy+#t&;2X'1EB+gqf#aͼq NST}9S]󃷴. J3n:K ]F =ۨ+&&{m$SuiYx<t]蠨;y<.ӱMLvr[  (ɽ=Pp tj H8ZL_@\@LAq6D@ 4Mk m#W44X5u֘3@'/<+<)=,p2䱍~ `Ρv{+af6,{M`/3O/.f k˚ÈG9wg_ <! e9u$ؓ1+;G,/d '.\<5o걍qKҸyKmM@J$S.\lqkeOugFo l(h`~+,Igq7Qts_Q#ȓ-Y{K:h,t^%ΓŐ)tr1@H3~ M" EWPk-辣^g}+,H5׎]/w-fvOe 2ǀhBldC.njN$1*ۊlϚE @®7zִ0 .&}(5?d?TT!wFN֛, df!fŗLyI#hAeailaId&^g `Rhpi'! Z'k(D; C3R6nk$6b{+dx ]}'q,q~>kO :F\<۲ym ؇\jBĂ-LLQ@?M}j6H?u\%MdIRc:Vfpxat1Ow_aEyaM7\$"oH$Zdv*kpB9|p4H1+/+x"mE!t/tl\Y`LCg/xƝGe0?v&1A$|j"#SA{L3DN 7uNHCRD$ղ,a&ɈU>`м>ʿf݆ ❍׃_gz{7`^CGesJwC#qREx kl, Tœ}p+¤LM/k`].fa$ ~5fܩ&=~s 5%eD+VM&$|\D,E/oAp[K$.78;S${YbyU4%Hk*/#r?E $*,"EyAR W&LҒؘ@5׸8dNڭ{&A"˓/&BږׅIsqʜi;q<+Fբ[O nby?˫}"5q+S45B4lA&I3Ju"?gH 0S$7o^f-υf s=; .`$M7^o~Ꭵ\?rx^#N=$}Hdb6b#)]f$TJ\5 2{… yֵ3DMIE!US&@Ww̚ܤPE}Fm( p7SfcrIVH= IkyUho@$L^Fn}md$'IxA16SL)'Q IA'd0$WV7q~[-70d..J9Wpg y4#jL"*ÝB+~}؃uL8n Zѹec?-Ya2*" Ktimxo`-$G;ɝN?da&gUMvUOj=\7\&yH.1K r#@'yZv#)XwR\tSD7Qh`œCEL pLPR y@"ڦӤOdA DEEѨyLN%i$!dĀH7E ilXQ@q^T6EDM쾧>s/|kbex 0ask$ES]߉~wr M0fܯwa=l܂ELH ?e8Mri۸PjA6 u8*)b6"Zu_Z @RH; B SQ>eV-ܟD5+E4H4ϕjk ??B~_eͳK ~>]c1M˳a51+wqd AX(B("x@ L { H1TlTvTR&Ac"T߅5A-C} ?gT8o `@$=kNp8ڕ3xWq@Q-B8m0@i$ .ZC ' ?UIURT] -5Ai"j;VƵ .z?(d\i>LEh;b/ '5P[Nl@}hjl5_|!υ]t,.oI{T /|M/f& 8/l8^T ſDB6Z1i `TEfP (fI6'>.]8M%l%qaD9Qk!.2+P}+$FDBvB2\y 2 @&HQ2SK(:Ho/'sU@iPI lH9B  BC`O]fnH'JI0A&U*H}&֡S$v@R T B[~Qrd &hD(uHU x, 71( Pp T' $#? z`CE9&A#GB@7\|.Uxv2ؘI:QK<ukYӲ9LLW ,/ 08L"s˜\5q"(^1Kn*AL TF@& :iE58&.-x*%nvZ6(Edm IE:ՎB"4 U̩&;N pXA&"U? F,NL; Eb&,B"T2tv__sPxsXg }/Q3Oc|a؏;ԯ,,V nCj3{LXTL}[ KLGӚߖ4IYBGm$JB̍Uj}9 k{HjtZIT LE!MaH[-Ơ} @XX#͞? [uI>Y0~viz6?kf[ a;5-vg nԱk+/Q/?2lwa!|0+QrA$PRPC_U % TI2$pvAbU'X4D`HʠdVAluɆ4b-;!e$Ir+h7߄AA&s[jeɊ6:0\K)z-371/c!#_.ZLDMR64*RI=O(}` As֪L(0"D-A fÎ=SryDfU*#P Od&Ļu$yw2\< Q_j6~Av*[ THt_u&QA5Au%nI#iQ w$MFDP2 C4Mk s)+_ 6w ܞmN4ϖbJ xĹίf1s8`kA&hZ& MBAAG1f;6='P`ܮ7"'u@nj.l( /K $zl+%lK- O&{!j e RQ%CD.(E;|@ [ksfV6t4\dEj\8Z~.VA2&l`M7ɂƹ 1Uɞ˳Jbs~BdzYs埁GC\D4P1{4S2A\H(}DLI5ZpQ8wؔΛ$֐L}\~9—,긓5yl CHT_PwIu}+ER$T FMW.>1mԝzPc4Ԑ `Ęy=]7QwPyXl7onb; q7+c_ӌ90ېP֖T74Z@HɃ<|j/GR>c}'+u23K1mh"IL|D ~€!{ ğ hi3Ug_3i|_N:GQϓK\/9s& [PD--wO&Jp^vZvMIQdduy]Glq0C0`8uѣA ځB$hA c7\4Ȃ=e V ǢbfKcZk[It5YSn%kX2f>hyYb,pZX]&Pĉ0XZٗsCJ$AU=f0-c Χ],L7ab  "c*AS.YHol'ʹpK@V I dޕo$PnJAS1nuY-GaP+~&ee;,OtHzS̓L'CdtvEKj=fdooyY Lu5mI 6®I0dSJ^->6F@"ZdFҫ%sLi)kfԧ6DY* ędA(ƨ"?* KOuPOySHAiR5ߺdJTK7Lj4$4D#j &{ ^ML!Ei_^pJɂ XEeD80K@Dy`ӊWfnW绪dlaa:;ؤᴁn 9FE)I$}xdMNh>]5L46,Z#7)e :5f ¶YzDhb$-c?-׋ g,n~c3uh"W]iOe"/t$i .5FҕA[H4< 74H%Jl2y׭z.P7Pʻ.aL♈1Hi(LW^Bi(blAbPd(.u4;H&-^TvwulZ1C1P*=ׄHE&U7"Ykt UC&6 AV` C;se2xm,pI>c8D1 8 po_b~)xKă8rӽfq9S$4Bi2Vt'2m͔hhbh+u$D4^"Zhr8Þq's;,q" [HR ߕDj'R 1#LħT@/EI=uv< 2KF}4Glmd 5]0q3xc5pKm.PX/BٌN+6$ /4@&@H .GF 0PtF ʝMvQIm8 pvC@O`ff܅ܻ p= "Jps.V@*ik-i4TA1_]w'Գ9c; I6kGI\ RD7[HO |>zLj1x8o>I؝)~?Gp/sw?s>7 wY(aBbҊEgT7 T oU66[qJz(@k4 0I7Y-45(>`ە e\L*OzqMLA4;@3$)BZb$R7ZTk 7 oE&G 3EQ_M F\8wi/I.}W,@{ΆKz0k pд{ خUHwbTc;Fs%HD ]S ĸT[V&I?tZYl^GEj`EhYAz yH*il:4Hv.FpiZpc{$5U Rfdו .(ǚj1Ȧ.$o 4wKAmE(ؑ[ q6pI&imiDb4lt ?Mk4즐 v|&cCZR %:LDRMBAiT%( Y$I ni"=fTA@Q>P2MLۄۑECi,E$V7EP!@j A7$@52? !]YHZ6<(6[f#aD@e3YZfIِDV<&o'b; Zs8zx٬f݌CY@\$ ** 1*36G7 @jRj>P 'q&ew8$!(ZP[a:4PsDiiM;qxHS9Z$Ρ@P}>Gl1KCtPo0Unw#4@mpu(M>*sYͤ,&TP'IdHBi?˧{,ε3 (὘.x @. VKIa#z$έB`JM+Y8f&GS@Vf= O3!Hmhߏ {-oEv@1#b:+xxm2[7J2|PA>T&lbekfMIaGF'[0?&Ȯ :͘:Oj 0;r-V\mX_Gg< >1hc`Zh{9Lrֱvm]y2k7L]7.@k yHHQA &pݚhƍ3Uώ>Gu6 b{j$&G A,& xT48"BE, AT;+*k Ȁf,7@2R Ϫ LR==aG7KKIw)C# jh7r4 k)2!ڵ@aڢ" DzvA7 9b N XȄ{ Lѱv"A.c]Vg2xlbt@DhPߤHB7 `t ӕS b &'V.i%0 dSEU_H.B%Ai{*$t$fm„|^t?㏮) @=37bce0K}x]b k?⾻zSX,x`1[Y}/tYަ 7[ 󞵜]g1q\&},tKDNj-wBcTZ0m &jE ER'TlZFL6 ä@qr}Q13X0"*x] oJL@‹VG" GyvSA 4)Ѩ>t0Ltr1N+!Jw=I$y *@2L 74bm#QFWc/8غ-S똝+9 1S3+ X AJ*0}evp1005e3?P]g[x$Q$-4ջiC 4 M7<ܪ(fj$I4Y"&~|(G0gPI.34;IHQZO L!/#;QEK; و܈DH&-ZRSܐ.'|!GAl&dA\H-YKqt(#mD 7NI$f`4ZTn^F.04o1޷LKE֧P5SD($9͐Ae5iPTB ~!^+*dE=jRyZhc Ee.oCks<i4F$d~.2[rgb L>&3{W]MR I d$zA+u0 EVA`/ ~k_t>"ͳ*w㾍4otx[2Q-n3Ax3sߢ6=W=p.s'+q($KPTHmLIBI XY'hP a@eQ *(@QdM+{Yz7Ο9yp TmX] LWbbg\Y) -"$BӌPI&`pk&9Ca@B]жLPbϲuM u F!j^ T8CIilE {[}dʜ^,[@ieZth]IQR v mUI>ջf6o 4vCA"#M  J P"䘸S5I'd0mŜRbFm* Xu@j-P:Gq"$qtj@2B4? ZhٞD6ո3U UH>C>k DxP:H]_7 1+$8׃u$lh*;ETiBP"f.:* rERb`ZZn17P4$7Wc)8?\xs^Ap'UH׀RAQ6 Dj@=;m[쵇%4́y@`H=P>m@Eyh>Z X>ʏ,!h?_1$DIW1KIY5BA2-L s'Oa;X.t$}YPi#]G9Y~, Op7|/ [?bxKX}+0 pO-yo ^`\d2fƫPM"<@z)~VpF;QA׆Z)TA⛨ UVI&v5HWҕeh2 6ߊ+ w\ޟp0w p"Y :Ikahn QAb`۟( kZ$VM(cTJIn{v;_ҟlu  C2l'oǯ:zOn?Jcij_`>d,KliU yZ5H16Eۚ8#auq+̻/n&-p_]~+?|^7O8G0E؂5I+q>x"g40|#AmwcLHWĎvZ@ @HZ.4EUy`d1I=XO'g~Ns1_biv)- kI\[Huj LUߴ`0P[yZwedCD FkHJ$ ,& iL4ZacZH0&"d*id5 "IUKvHEv)$ "HFn@x؍92p51Ĭ? fS偈]uyWS&;,i yYc2&-R $TS&QAV@r9fk;L ki%@5&vD 4aժH{)d1qc]f ^ղb\+?ƷNcHuV@`\$H2/Y! ӝ.4 .2vT,%.J* !"#°A84*2 x lG\ c'o2hU&-4 E)0}-hӏ@X4In$@;M@6)AB;,abἺ h&Z{\^0NOۇgQqWoOTPr<[q8Ox)L7*h$I  #a`4^Qcj,&I0EIvP$:xP%J~TC ԊJ>cА|rm A47 w3K@ dҨ*#P&d'i$ZrL"dM;GG-&zCUCdH .Tԃ6I634z fۆe1bIf?TPvKBY j BHפQiCYs0#C5U3ksoy DH1Q($Si<{.5Ő A#&_1L\@8X ATTwY֦{BJ{ &-M īH|D 5 d;ʦ5F3h ]44ʇn IRaꩇ8TIHSe8C&†^׆39|_~K1į.< |тL\1h>XI6_=g:ޡճ<b9 y[;.4+"d!NwⰡ$M@ښӽa Ro~Y 6mZF@%mD*fbCEvoQ }N++^UmM]"Zt쨃6TA+.`.h #p/+S`&R^͖  H-4{}NL TN hP,DjS46P\MU/‰ SeL3!1GӪg,Aw%p|*tͩ I";<@F ;A#W :K&=ְ:$j&\|@^t"YP&)dkd(!dԓxQK]YVt33c@B..uVELq' L S`;cej̿ 혎 _Ķ+Qs%e A$Ri-73T\&Ak^Re\@8{CD\EkNQ:t46 5SE@Mk(VD"eE$ޅW@iSf@tAA .F!6dT'QO ~}VE ĕintrcyc4Nq]ƀ 3XDYZ/3s_q 0ai8 -hkeKܦ@?+~k)*ю`jG xhZ֎M bq>E0ң55Am\ӆ8X)ȓ.m)o`0EHS(sl?CHlAwY$9@M$mbbH"IAh6QĚEȁ@bQ5ԢdjAečUB8iWZf0 q߇l*B) ED&Fl K+Y]LZn)`"򆑦jyo‹Kg`jHUɀl"S4A"|:];>3\6;pqOi"Jo~~[3nΤ0̌cث}&݌8:VI2A=I3V-sL#sy,ăKv-"Q A:`B>!bMjRßD05: mCt q+%-wuCv/Nxiip..aIq2{z;z^_҃ .4_4Nnar3jiU'6Q^Xl˱a`\`Hc5=}STi X%VPw6A$ܑ8\sC.0=-3]g|aX=Ƶ<@ە?~ {87/ 1[6:1@ #, ICNP % 4Q  0 H&H -p1ZX@u@|<RΟSe`ce]sgUf?X `尼x@繓nPMV@H.>Jn|9)81"dє"&/) \?u͕c3-`Ɖ$e1`pf \ F@\fkE(CQS$7+-0Ȳ/z/ bt쓲lN: &? 񞡛gq1Ǚ u $f"v 6$RՊ/;bgF%X?(=:/AY^sp},7I d VҪ'[DQ.'۱YѤ " @. pEx(5 T@\h8wHl67!"¿ 𛚁U5oE[6]rĿ6W\A7-,0[@C7A1&= h*!#uj^M6  $1 #dH$DBA p}P@FdBH'u j"@?R{z]N i%;IEWU(>A&*{""kڪz-:k4"f*J37ށ#l$D[a.UhI-"M n"d8 D-$ \yl<W1\d VA:k5L 즴HW>Y؏n5'* ➪ j ދ ykz-9͉$&C[ PjZ$ۙNHNiMZ쨅G؝")QIM5y[2Ln㕫MIv\LV0t5wE֏[Kʗ4`K@Xme@˽,`a3-6A{D\s'ӈƓ 7^"/%-"$ 4Q$=H$6A5`j  "w&`Sky]Rf."f=DeUI4 =3&hIPg6KIQYZ L }?:^#2-aaw u1]煉`&~\j*1 tL :@b lwlbFy@IUS?2 ZnEJqS3%qn;CE60LG25pB8Or3"M@o3hZ6IGc͇8ǭf-tDheDFAkpjr$SVh]n̑VR[|h& oPnbO*{ ҒW& V(q tb=Ksgaa m 4Q"t Zo&Xڛ+?I28RH bDCU75Գbxnv'Pv+ N.nE$p1 sy>f% Qp}իK}+'h&6|$Hi[eD@ $R u j)g"t1LE\{;@-dTIt1[F$2 >2~o C˻5X$^clðhPm6Md Vd44WDZCǖ iBey檦1*$  X b˟%,Uq t۰3 ;II9TCd"$7Pl0G[lK"p(xHUw:>.QOO 5F//xWf0W4̈́/icp.8% T4z" >57\d1$wPlv<CNtzyw%Z@5޻rI:;#[d|ᇨA_1ղ^Mq.TQ6T©xC0 56eu65 ZB*)xPE:N$ڽf =D$U@NyQpsNh$fyQaB ߺ8;U.4pk*5u.6Q U^ lv.yyq,ߕ S">"ƴPM)W t zwPIhj/Dˈ?E[)o< MOP_kw;|O4F$ GN-$DmLPK@ >i_qx_+EΗ%,&<~xeg,< Xv<ւz ?E@*ڷAR SfMPAMV٧{\Ϣ@: QlQ;$Fk#Qm7@BfScxH8̍R{5% .K-t i&3;/0f l{ψh'֩0NpM>c Z)ȚP>&I'15EUKA{;E;.J鸽O:̶ o!Q2'{}[!ԛ1<8TMȢg4Mj F߲uDowr#;;/g4o.DEc˄NlP`H4>Lumh$ 7?1|:Σ3m |=X,"\x' ;RX<؃_ ]Wj(U[HN V$DdžƐ\y3S$O~Um`rv!0H.G fVD;Sr\0k5a#7\!͐$   6 dfj&D ^PKBI{$3EhAq$*VdCE+)3SEZ4mDكB?DNsbOw:_St3y'vcJQ9gqN.+sML~( .ͻLDq)`]-tQ7eU EG!і`sv3=O57^}fEܠ3BI+bb30kncK)`,DW6iT<"ޫSϘɤ\!cR vH @&ZA$@ AoK,5;(@k橈5&J&)Aj&a1![nOtoK "@y MwK1\s%9H]-̉ޕF_ljnh&G HhI=AN,4&E. #H&j mUPL3ak)p$SQN mZ"*8Zi3hTy~!ZiĪN AcS3KAKH6;-% 5u91J~:e ("TDpN:o[`p~Ik/&Cq@2wTDRFV-$00N.#i_tWu\2fBL\lozF3\dy^ԟ0D5!q{^$E ']&oSKI^ u&lcH2w)1 ?@T=L&&@$:y5Md6_o $C}X)_TN5f\{"7;wA/N۩֭#qwaR&\4 k{(3EsnT`6eG1TE'TZ@("cNI 0V+3Ü?^45hhe_ǟ}~]e.hpWavð&۬Au&Oi 0ؘlbŤju^b]($ݴ!@I1zYPbۯK1-0^qt'Y65VMH}d̴yaɐ-DԲlA-i+Bbv4bhvUH Y6[׆i[AEEf$ʠ& #-.@i߄aLR}6E4&] ,At@-5c&wDZxLs FSN`n2bf9KQTE+m|5DuDc9[cgs.E]2x(#T@t|Q ZnCpbBiP=09"ȠGcdCod hD854LI2.AZ@nZ6ȱ֚ډXaSA+-5(mMn:Ht@crf7ZMA>h:X}iSdrN`S OU5^H@\J ̟U60 r`f1p15ี܂]<͡CZ}M%ڇTPpkQkp//LU3[ >5V+Phj}o53Lk) {C\u@~?u0q}d?hyu  4 ߲j$52w-$ +d8$.ڒy>1-iv# 7!~hkv^ljeMkKFծr D5ޜ~|"`c80K:|zt,ni5^i]sAdV}0f+Lk\1 M@ӸCװYo/vag.q7ܬO(4#0K- TMj ఇ4C&x^υexo3XglnOR|S柗; 5+WUt\N0X;1 bW92@.hyHq.4xPqidSDkɒwa#dfN,Q5qEImWUKH#f"Ï`CMoC vP·]0D@MMĨy) j9Pk^Ɗ*K4&- #6KPI*aQw|pjbn6Wb㵄aG uv2 >QVi4^~32`]rpn/s#y}w]#')nr m  r%ɷ4=cÚ؋[ %PahV7dR/tI̪bUd$R'Tj] P~ Q&!B(67n }X⮳ f'3@L^ĸS3;~5ě]-'\;"A]Oka.' x 8< y$C} )n&\<-gqb#jq]srD<ݳr@$I_hu@^W /ޡ2X -4Лc$ |;_t?xcm${>Oht3<@ ȞW1}]oP̶&bw~.x#pzY\ f^N0|{`tp~J[灭rOq'I>p9r?eZSk=_ )溆O 2xX}cW L1(I0+@ՀTZ$rL4nRf Ql2LQ$LAHx4qp.Zp'H2 ,r$$=j' fc|!7"A &DV5 }V0nsv$^Ixs(lcD4W" [K7UDI _s| _x#e&<܅i -T.D ,11 ʣ)H$8LϯetY>K%sme1Z\0MOW|X🅼+&|2;>DֳA{HO *krR?x  7ը]U D%lQ<7PZ$(ѱ1J 5Kd;UcT&j恹I?t̐#qk %&@R ppȗ@?DX#ӔfD<{(TjvP {Ƴ &)MDK) &f 32l~vFޕHG3/3w0d5{WpdI"tH?tYt4=Uue#y&N&҃$귞QwMx>;~Pj+DH&n(Q@kN(+= zF"f[7e P-~),Pe+v~=}_]LB8vj٪_vLm#q]" I16YDPA)ҊEi)$f._2[ZiQHӱ*ph/H&9A@ $Ps#"lwUM&x%@K`'5UcSEu:H;* ߕUW NkL Y#FW6>K.ƿcĶZ`\0 l>t6+Xfg쫼bfmYQt;dM=MCi`lI<*dV0:qHPH8Iqy.sma->$ؘ(-3po~+N&c@Ċ /sк ?xDy_ʹ'e%2ZH%Ժ/P\vKS sr 4 ؟TTV쭠W`?۠+A4I "]v$ )$=֛!@}߉x DvpHzA^Qsc58nML/ 3@Ay*D^m ;u):NZ B`$3Bkt TH4-,I!t"k?hY5l S lPk$SIS[IݶQعU #Mwb{q*ڸA"wcez&q]:FwfV(3$T~`w KxKoHTH&,I &x/ӈ` /OŞ盕N:0tPTEou'iC,A th*p]Z* EASI>qtoAX6DU׃$IZSQ-L a"&ҽ|uLNvG)ULy w^f6cp`G󲤀 $0@JUW*IňwXPߪ^Lj$>b7V5r50_Lb0Æ]4~x7G`btu Ha#PQB=W5z.s?cb"tX$OmeGoUt\F8TQp|Mg^Zh.-Ukd i[K*yR yS[0 ?Hv,@u&(w;\!ĊOdEjZIV4ЈP2$̚(Ѧ:Mk.Kf#pitaˮ; 9lvY xD"LD}!Zd7Uv:|4Ё"N`6EPNLe:a1{XO$;2,g3-9<|b04WG%깜#4⼝#^3FauD*15rԓp;>mBl=jAh8@|h/;PD¹'֪4iwL B]i[%_*AZ-M0-5 hï>x#+ײ7 GP0nWτC&bb_&[Ӳ:ÿr)-o ~ZHy- c51@]w q!ܬ C ;95X)ԁPdD.#OSI᥾bf+46ZbAQgTbU6` Z +dԯ_Y>&W f_$@1qK[W7;#|>f9l]=/ox;#;v u?|s7]/UՖ YkFې!1"`ÔsfM#<;ӄMì$u=g2s8aڴ3$ /_'LFR$C /$M.ii &.Kb]44*&MLqO+RIw4QLDmY3转zCÙ~y.eNo@tA^i^(YA")"JA;$ItzYBJALőV-{ h'AW6EeLLSh[eDo1Ml$N$k1;8`Ӛ)U`f"bta hG-UA@0 JLA&@73i6S$L}ʁtjbJZjHs!fhf[HmP\43ZBѬOn0]CuILqJq14HI<@Hhm&G<4 @!AʮŖ@5TVOjRHʭA1s;Z7r w0ϘtLl(LFtQ]yQ*.U:DT4Zu*D"+2N0D fʀߨW@ 4Ȃ%!Y5\E#<=O辣M7V_Χ {-}w&\L1c]DzBψ:.wg1Yo5,&i?`+ZHi;- d5V 6TW$$$Z#4ƒ *k o>itڭF!sH$mD-kDƘdSyDMk"dV ܁&ADyD UuH$ vA: mDUL*"H'rWFT%eZm[e2~W`VzTQ?NVMLLаnuwZaIV@.w۰ɞ q jmhI i%Š- MϪHqK{% M I{F.~ k/~'Su,-`<=A7Q>.Dx򘭌F`3_ֲ[b Z=@s!$*q䂠!@EHEBCl;lx99 ڀnp!7>in0{*v1BOQbhiz-&O*.IiH@T,2$B{{E'/ƠkX5 |a⮝&dGO~r y'.;7Wt/dzs/b}0{~D/ )v..0A8'pO/8:DKO.8 8H56^}_s}7"0qиZ]~Q2+*A@4*DcUL@-3 *t _h+} 8bDŽ7:M#}Q⾡X[6h M+_&GeHq BӁX)ƤLz h2!FDDhe:#{pق\\Fi4jtNYl/cr].h/JQ:kØ{S[hJ(~XCDZ'u~x*`U}_cc2Y갃y%Ť>rI"1 J&Z(RCp ;{hz.Yb(++p)BwDq ŽG-5Y'EFnmP d lAo)h6fknR'߲τ>#/0 3R &70u /:3\-шsbi&EE}\*61&*72&X2@P4a,x`:i EϘ?dQ\-\ѽR ¦?L]91ZB^vNeM̸[-co:7ULk{np(lqskZ/꞉C~ag:V \~dfƼ7pڐOp{gkDH]bL4B!  dAa3y0ZØh0ٯ`}[ %?񸘮f:guG" 8FŗbR>S"Rzv!sMd A gt:1M _KL4b-`IMg$j%#MD$ zYNX~fNˊ'7Z w 4k\od4Zb%< yϕH#Jh-uf ?3yZDPECnؑhMe [k>c2bykO9NRk)yhVfiCu@'H8 :HI7l֕TUO*oh'ubi'FD@CH"8A;.L'8C}Z^L13 `:r𮼋q xTX L{3Mʚ466|MN"AIk嘆jGƵ+ۉ\h, $iITy Dn{(tqoU#uDRIjI4A 40LrjM REh`tBӹp o oE 7 LE}T$VVQ@ #LRE4QEiUF&(o+Q$ltZRvRȺ@ 3s5M/IQD6Ӑi 6ǎTE@u4X)|Vl%zQ R)YHٵLe$40Lj"DnM@"6Z(Id.;e@E*6Z4l6}$BK9gLS*pp_] i ̀^6k.3kNˮ l/I"u'˨#eB'Vƻ ֋45 kiuqĠ>hěp@6B;Q =ʋ|X-%F$twc7fqF?Vgslt`o+qME*#z,`,j)K \xLn|a$2Djq.cCdT(Qt!<薈"A!ZrT{B&Fb}bŠ&|@&5UQC*A!:"yQ6dBD¦o+emk5+Px\OCe [1CAPBw6a4`$12'DAmEqQZ #ei"LC8+n?;+SU_RH-d}ɭO m 65H4,.OM~k1p`y4d:A* "DPq3ZD&Bт3&@ň {.C`eP44<DLG;H Q^R E# CK HY{[$M!'a >IU>뱍5Vf?0\$@ WT&uɌ#t P.!|@""9S]X'Nl[NU?ʬH I7Zj `S>I5l{Du阙,,ޮ\ ;Uuq_%& #s?d8H^ƪ")m &q\R.;&Zdi4\o` E8To*P+R<3X)L6CThWSun,AhoE|A_zO87 - h`_02 M x$81ir e]0|λH4vA$o*lBpsM cZ̑5^z3MF6 lj$6VAMx'Q.3n,lND *;}S@07u4$遦{~OPR|.WF&\̭xŽkřR1^@JCL46EdOʑMHiͨ SjA>VzZ'ڪh6Q*%y@Tז 'oU$[' 7eėaAwg_anq,jb8K]9lWH4>˦]Q.oE(mhoY湛6WGsea 9a8]|Kަq?fFiIZ6G6=I&od2+X'P}*dZ uILu;- ;pPZ I3b"L~PM"UkD˶K W~xK>?sX?+.H'c?Kؤp2#56I8|087"ܬ I@41&UBk}UM M#_{lVFfSxHp.\,O, wZf[Hld B`DH[iqwI&j$?N<Οn% _#+={/xnvc10K/~!ufrYWm; 4*ȹ-? fe :A (mc $TgIuˇ<' L6y0fZ/6YEi ڋ6lAZ#ފ$ׁI0 rUb\cHyn J$ē&w*u wSqD7$[r#|ځ$ 64ʦpit߲i޵I1AR/$5*iZ2֑ YqZj(imbDV26,tHKý5oe:V@1ٜ+ppKKSAR0S73!v'4M/StoH)hLn}3Fɡ" {q)kQ?37`\as- 8}G ] "jfzsbb_%:05(ITײ@EiP-7:AgHE4$#43$;*I'~"I?*(tN}7^ʌkA! hh$y~ u~bb1­p?H'z^~WDmګSa"VI"9KE&yEk;T`Dti" 6!1)HMji@$mYGMB 3Y[8:s/q 4͌ *ft1t*CZг>ԙapX :hޫe\Yk\n?!U&,5AEeB$#dڧcrT1]k_T'?9&S{1E ߂E'm hÌ<6oF+f&0 }kAG wLx\%v3|󱝉nLQpMzng  50B|IεAzc4@.I"NܣH-$ĠLPPER%vYep9 nzi+ /Pr?ׇz[fߒ!nv pY5p?c+Lخ^-b /EɋIodq DԬRP 0F.0+UKfE˭; +2{inThZ%qYmGM H$ۏIRr-k˴3le+د-I."*\Aҁ$l 2A>u E TMgN jWRwK@Q0{fYa⹸xC - ĭFd<&"relF>.o :p {Q+E\9h6C`4;PuTBkP8Q u Evj(M)ڪH,l'h$lAE "jNƼ-i.l1 YU W371'M.#Q.s⟕_#qY%¤w]*5~a{ZX#:guxJ Ncgkb G51ȪD`]U6h ޫm;$C $4N?Pi/hIq~ZkF oE9wm*4uLڷSh=%$4 '$O3"kJEjli"h6A5i HT $<6Op1 HFo;y~>!|$.)Pi* =Z d r= ,&gmU [جITL$K(el*iiAHdm*GLdʴ& @hZIR~b]I"h#Z`6_ )eXL_'C]5q u/.tn'L7K^$ޫH;]P ! " "P8N\""œ7K"PoC[dR+cK6" ?.7j3(Hun&ʗ;P;OE$<Xnv$Xh\bNd#㱄i'eM:!sz~cƒǐWC=3=C4l3^W8@ml )1Z'@>t \I I%˵ǹU#N&gPQZ p$Jd7C/]G3~#,-iM vߺ.d )$v\lH+Mn{`_ 9psYlsf$Xh?gMDCxLz(D*`ydi6#V\ (DmaO>ZͿ Ms-)u (  pP؟DHMf;$Z-)&jO -1#W{4?R m"nU?tɛ> :7r͎T$7IC@ .7<8醝 A4)ll>X&xGu MyDcSA+S]@)@$uLPMEZWHtj,F"+ZdC|ӹ\YLG!0 4ϧ&STZY4V72KKjCWd:4V&pšb*2H4Zk^ DJc4E\ِf#mrtԒAhi6YuK$q#Ui Q47P!ēvZ4^R$NuIv!Dӈ7 dCIPnPQ>T \CDHn7 <1Ņ-b , $)uɁ`1sI9~gO0L 8J``Dtp{@n0ڿ_q+5=g`l&$A%PDexOx9:L|1=ׁ8^Kb"&cuquΒhxQmTBP.L։$4uោGg&3y=|4cRe7uY|^;$18Fqu6y3@ z+H9P & MA8*~)ytu $V$Մ+F{ $L?HY`߅ A+Mh$af|꘨ARD0\ }  O?_xKv[7W~CtMF9uLC3Ϛ,0 noJُd Ch50.:b~B"94Y5>Q&6K4 f>ʁP$DB5AHl.2L&fi]Νqzfy?1pcf̻ѩOe@ȽIQr H2G~;T:v+X _W~xWzNy; 8譪AƘ1`YR}R^ٜNeΆ{3`Pt}`:` 8QTYEmnVn]3^ h 7A] :T#iؒVIu4+3vީ .8ʨ oJb^1-LHJ}[BMd4ֶKcykT;?km& tY܈Ilqc/- 5bmCˆ Hl'OIh1=C )BZGhKLo.."1^IoΣgi]Pe1ppKF74VQ2JΡi=ƜGil $4COT *iJM $Dʚ5jzè\0E`[c'3_Y_?C6q]b6+4V[_Amjfw)$+?zzEi ;_??T?yۄ\]؂t"&CD{ 55HO4-qkmh{V ٪ :7D"w3DB^Ǵ:vYdu3Z!5,+x(kTjQ;G`c0 ThIz"f֧tVNmJ,oA@$ W_]Nfف 5I0Srٿtl[/6x<>~7a9$5tME 5U9"%Q"UtQBU!WltIEHTBѤȏ(4(l8;|a/zn>WÙe[`35 L_汼q$V& iwL`U5 A5ZnFh)5r ;M fI 88Cb.OUgn $/*\\#HhxD̐d*IpfA?czhF@ _NмL3#34_So\Fu6IDwA)RKCIPs`jAAuzpd-j=-N@ be WSKsy8Y}e,MxfDi$&;8=0i$D~&bk, Ā"#dDW\AoE`nySH(yI2iJ@Clj&cM{( LآD.%)  iZQz]aέ˳1%G]_9ˌW|  hDA⊘2IwSQ^DX͆Dϩ(K; *'e Q1ɤ suU{J)3I@ϗkM/dşzzOML 2p0hؘ'8Do.00Z Bj9+z:o3-F1O]&-€RԤ #0(険 Ԫ|E vy:þc_М `vo6[V6k| e];/0iڅW'V0FLĨR, ڲn&f02`|\e496I]s{Y\0 EW͑(7ɂv!4E)F\ i"$^yQqn Pm ^ǺAf!D "l (`8hFtAB;gxm ET4S$I82H ɂlfr4E s2I&gdR:C 7 YKISCCBLŅUR UMUO,Hڕu_\蚺7\d * ΗjHI/61E;( >n?қ&&n.>BT (6? 5V[IH&m;" AI5hu; _ qCC`LQ`Wܮs*1oʌ LD5h'A!a5:{(2A* %P] Q"&3XEbnIni琂)抏UikQZ"oJDnb>Uǘ޽ :7eRAk\)XZ5L@ھ; aAm4Z&ZF~k(&MП@gi b VDOPhbE+mĢ}dBʚvTV=CLtDbE)hBm^M$&(#Tk.L,6 "Edjp'GmMl}y@k3%$`Z 2DLIwr|.A֊+3Xy^é~GwÓ0Y|\|GhhFE L/l|C^ɢ];AU`㤐t \ZfԑEĄMhFһx+3,?p MR0ťQ3MZi؉TH7gL:3ĮG33P\xv+\d CAj 6ڱrQ!¦.JPA LKH2mه׸6MZ9Pfaaj`/K#yoC ^Wx3!,v&q4@qp~м~>(u6/ _=w2yF`fD̯ pkH±R  faj0 ioTbZcU3(CHpcW&6ckL[sp1IeLC#}A$^l<l`M& 8Y#:4D3yh;% ؙ%h)<-"5OqwZ!a\`&!U&&O "iz $(;-a1ӆ q)bAU aTw#pZjA7 [v4y6  D" ;ʧI&+79>n(:Ij?S.Cdq|G8"YDS!fjiDNnFރuYb0]8y7I3G T+u( "6PˆC ,:E$ ToBxZEfSV}aͬ2S3*\(5 6?A\dɉuLJ9@A.In]$ L!HCP)^}U$l2irn Hp\f P4K7@uD44@ Ai]^`Jؠ0#nT>fO i.L>0IOh&kz} .["v@:@~pIhm{r8Ke @ w) !E$L 3q NJx&E0L3VdsOrhSFk5Kf6R u ņMq7;liߺ80|tv(h~P55 fHDq 6uHj'4Vi; as ?PpMR\6*!(F$$Ր!|`M)B+J[p%=1ns߅lznN(9nᾯղ9Oٜ[*XXewO$ _ Zf@a $Ä\"TTlت vDDIiwr]S1q,K ]7d$ (@60lPq(N."i_FָRhpE˗h~ bJ/|χE:g2@qu 20`O!$H63 3z$0T@SУU $Xj*Loe6QBA+26>Ho%E3'UIZ$16@h&L&0bjy3lL߄ &ݪ|4Ca*RfZk ЭEfh*l4) i DRe?U^ ּ/så($R׺i˱]qVHQYĆu&r9c^8-CblD; œ`&h D$Ҋh-6 @h$Kfutexx? յu IҎK0~r"[(MKM)Q`_?OxhJC426w:S2nX#*^>n;.N:cz/HN#\m1eXEhI_x|.-twDD@A@dw+4Sz#me0 CN˸`dQNv;O+9? 亣SWn49(oS9QHu'oTE BuMj{Uo g4"]OHV bnFmE]L(/ .  Uˇq1Ko tcu>c_Ydo4_b3 zʸ  $J`ITLH0<ܥ$ *H?EK#H ; $+M[8OP 4l{]k_u: q9TV>bO* # -k@6uɆu:M_pu3rnc?$4tA%b@ikA Q*- oL7T (1i'm^OD@kf sFM(@aQQ4[TT1&۩@k(I&tKt4õ:oX4G^V8AAIp D%&uy_8kDϺh4Q^xZLodHlDJ)Ƶ4Kj*"yGM;K+Nb!DEbM+[Bdw^ui?aCLp?u ?Q"LE-v5Yt:E6Edo ڂ,h m$BȘ"Mm m* dȑ/U ^ղh&dpedj+PvShcrp3E $O3)&H&;BOnMcRt h (.&\d$M h[AiKL܅.p$wTǢP ȚHII0ւfZ8O"!s溆k8 Cu:`.~q'Q$x*t2,` bT\ INR IE!o`f!2,WI=P>cQ#SjMl&U. K(G:]" dH#SLt[v6Hvs=[;n.gmKtęU"+nI$h-6_,+5A5,]g`*Eb!@A<;O!bJ$Z枨"㄁{O~ Yo KI >aaL?]7`VAcu:b>gG-dM$}[v#]p00hm q&$TzNP0I̛"S.+HXcIKbH#Y$ D&9ndO2pX~` eo4RK0D.Ѧ;GHÀ/ Q0A7I&@u9$CA"E7<,vB$?LG$Vz8se`1pn%yq.Mw7YR!dHnăd+%jOS$d$Ṟl b I.S.e{0Yo b'0d+ @fW%ؒf(ITiPP&;?V(Di0LIjc@YGk(>,/u | ^~9?K]}#xC-v H+e!R4E (J&Ƶ6Z~KI v4_d| A -^2h$A|{Z*xi 餃uOwj P6@@1T$0CT#II&wPHFɛU$C<ꖐ\ h{VMM!v2٢`Zq+0]\;J 4خ7PdlPϪ 3/upD)#P,i? 5ZP"BKZZQ=X"it4nDۿE U:O auZc H5+~+:{&Z DEk4;)ҰdlKZ)'@NDZڊpr16ˁh$V2oH%@ Ee{tI!IE]JEDST58XZ$V2L1`$Y` *W@gDE6[f&K}K溾`?9 "E Ls-!;jtV$ SKLK zȶhbUl.&{-ᆜF @CImQWլl)8%i Ѝx;`eIY8+>?܎L0C $Ӱ_*!xkry6,G4kx$Se&!.$Ьj!dw mhq2h= IY#K VO-0@d@TK"0Sya-u?Z0 ~ H.n<(P-q&MamD`DDi.9BfiA. &w:_P=383Lf#V#\U̻1yt}D >eq\D U12KA(I, 6Zrl d=7'P_dDRb+[($(MI7pvA)3iL飀1kl)$I6/"&)6ej& Lm*0g7>QBD P}d H#T*$Wx XE%gu@JYdLMytWe Us=>. ثrI?tI'(vH dHv;Í@DJ53NPO+ $YsГ1?tLX$Į| WeG0+Y.sعj{˂TzYBۜXm=?1\g9Ē雮3s)o*V}2@‡Rlh#A )@< uD98(450TPMD A-!ȠSq~a`IiYYAQ!sti3$b-4C^K;-O.ء³Flp0&&lxB$VA IǠG* $P0j8V|`4@P؎NR D8DvI#6P;8 GrchAZRU"`u31ʁTH N&Œj.Wg!(w`0p?@vtf1!z)<<9L=K7 p1#tw 8-ɡk3!Q& reSF4PawTI+>dzi+I@ˤn& /ĊFgs8[:*`.k+vic%+%JDIPi1UAK[Ū3<g64+$'lѺ2&P@P5y>lLO+[ ,mSaL'𙓼9 LW?z_ǂz/:o+Y{0zs"3e̿Y'I7"Wqz 0 T-Z  hKL;Uf$Ϣ\ j4&Z~d{(I@MHZO 3AR(`y~U ii*DsN ۺ@Ro gnncYع]+ IW&mդ <)Ԉː5CCsXKELK eS"`+ D쩨C,"O~ (R" f"(Tyd*q/+)~]M7OwBuLuf# ;ysę(5I6"ؤOe˘?,M 9º 5)$n >. ^`joJ)!ܟt@&/ꋈ2wPE;}$A \M _OO{ןry̞Mv)b1+9'slB2A +B+wrl]Fu1_\Dj[($T JC97V@h-KI:EL] @e\6e2V_g+ upRI"nI^⯉<3 9ľHiyCd`{ѿԿOxK̳!Ա9SbusYxu O:_W1znO2̮vIL/=\Ӷ( .ֵz.#:bVa](O˓>1&-Xw[[ɪrOf01KCI~˂kA$~U]H&%C&8PO#췄0\E- ƿ #\dILQqHÌr&HVePh$DVI${Dm"6j>h uv@.6jlnEQ.A! &4+ 0IP ThwD$h V%Xp7/\epwuΡY,s"0; @]E9O#ui>OGnd4jU>OvsfH3Fni7D# b$ILb&gHbf) \H*oIpSo/xw=9F0q!%ir'i_fgh pFƴDZO03%[LI"TƗMǪ JbEU7**3c>D }6xIn*2 @Ŕ* cV$QV lYdng0/}\`i +4.2f-?d߰BD6ݤb§)=u 1$Dz iNT-Pq'SFNaU.>$tXECi;T\56+.2%4LF%-c pqUM%=Iu0GVdA6͓* F@Vوp8Q(Lh;e pA Jɚ銊_ͽhjMLMʦjz%Ia۩b. Xl 6 P0qPIM!-uO F070}O;sx}\WL*1MF3M\ oʴˤj(Ѵ36$QV޳=@?聪(虲myfFmDT[F/R?U*K~բ1HJ<ǢeS")EQ#H$„]5i5"9ʹ%@7/~!AĴlW -HE. O%v2γ3 ÉFomisAAY$ly&&lPãZD$E! 7 `uN)yi*_ N R5ʴ 6ɠ2nSpfL6E÷jd&F)m־c4650H޼ A0qAbqᾥ}#-՚a7a"nf6q8McFq6(8DEcP$\@@L Kb{@NpIi&&4Zl,I(@!i[kLoPdAʶ36{4w-. $vK2ry,v9GPkG!v[C9~!6(@LEAA TIL6Y4I'H3h%N4 |E GA\O EK[hYEl4osE|{!8fd1y-w;P,@P3Q&dRFY4h>m Hv$a`Ѵ$0-6YiS[0!fS@%𦁼AQrceXip%X@b㓏@L71 ,<a4P"D YQN M&"A ȑ5jy@H@էHv OKKùWt479>/#\V*&#x,%: $q"Ӻcf&WÎK31>fs5$DCNNYLb`GoǻbG,@saca*epoQezQ&ag4ɒA c3>'t@?G%ld5>^9\|PAo) =& jf-%0^i-b; !v3_99.6v!&pIA(/} d}օ/pw?鸹,#rC\D./:Jz,`8KM^C AjT@06J߅ˁqs f$uzyc|b4n+@"HSf$0%̟Ш =hȓ6CA2>!2zRK$0.y~ 縹$L; Y&@;R3R#Gd?P'auH^wNk-$5'k bd7|ZA}Ä"& 1ͽ W 6$-4 jo73bhȝH&@8N`]#x~#L_ O~6.7i`b۹_]I2}[X'NwzGMY]3~ -{&k]}_SzFʠ? x aȪ:Wc0t\&>`.0y+$iO(A [ 6EQ6pvNL"R gH=C":J"{_uE100\bPB:Iܚ:klDm#@yfLWc%acƵS7!r[=3-:hGv@`͑`n*{U76 eo$ԉ͒'T'*)@. Dz]LN I"6SNs]LS1@i>b_d4V᠒GdfW{埘5%@*}G࿊;<nW@y?,1EXc)" -$tΝ&%F#8TA$M2M&CEEdvK[bd@OQIF@Q AwS gRlLpޯֲBa74mW]o~ ^1C :Iw05V&.Z&"i}C oEkPB/>/Azv+2xbE{/73x a.m( *U/]C}/UOmj*AڞZ*Ez-c wHeϢLjM=s6b)pev$bnm&{T@1?jkX: S@A$Q~MM46^SLg.v_5 ]I0EY.G;@\Kkh¾Zi? DFu,uYQSSLX5ELkN@&L@$K`Q#buLDʄE+z-@PnV\ẗMI VS3i\P@֤3XHtI;AKLde˅OD< qu1[EFF\lnw &?@/O^˰t|jS"K~ wWyULO?`1+^狼|dqk_88 yG'˹f~l]A("H7H  iiS̓$ n Dd $@G"$A-!'jm,;&b"-&&- I;*L4lZ6P|.ָ9m ~$H$>2"*U@)ߪ!_.ҠIix t4jP!ƒe PT ).T/@W&/mh/ܡjQykG}a-'y]@ l5$8; ,Y j Y5@u iG7<8/D)$)&4-\˄ЀhyeFC'rfp&&3x0 )!./eV@: ;KGJunCIc&Mu$=RF1>$`yf0 Ysrٌw'2v.3KHs\PAW ͪ!I2 Ȃa[OT3j$u@P;4H$*"q+ZCXH&6*DEL)#M>Nt+UR %j eDJjTZ9ZYT"b @22̇|::IwZc0'S'u@j]PȠ5IkLvD@cDCInn,f&P"T 'ղC@ T`Ek( Nd>Pc˷z$5Zi~TPݰOI'd$vU$PP7sghTi"Q\&LF"+Ħv֬%"@4{'\JA-6d6'r%L"! }f +mNl4aZI]P@KiaSwq-MjdƢR &LR 4b6.ŔI5؛(6'^I 6_t ~Y&Z`Y4jjMhA3;//܁`: QYtƑ 3@uAV\X"dYbn뻲%ǡY&ZtmEbI\8Fp h'""- HQ΢%S`MwSrR7f#u ̀%QApQ3Cu4_ OzOzہ~cH~ԎWfF[00KI -(F"$(r4OZEPDP SNOtΡ*4ӝ:o[rbntIp$^߅.GsԺM s~ %9^Ns6&bF+-5b, 4+$@- dp)EI"jԙ-d>#Ӻ kN'O h yE~4iPaH(}>?\ Ӻ۸ 0sLmP յE 5B -N;V4p3H)b mUIT/~Gc#EC^asˈԉ(ڶȭ ctB zzC1=#K'EQ쪑Y@S-F$'4|]G0MI z-}9_y_xuJ;܅ǿ~.k+OQnj$U{0} l_+CstdT.Uf:kt#0)E4p$nW&>q!: 87 ieL-dBIi@.0A0lUReƀ@_]&DH/ڈkHRdRp&ܪL„"Px4";-L֑DV4["5n8e$4 +nɁV o+ pmH%m@H.o ΣKlcE ;"\7-6 !ފ0)bJliv10ȇ7iH jZب 1'fQ@nEMJ56 &% O- 2?J @hK݄- +2w͵;,-$]k"m{,^fc=f_}ߏ^5g?K#kZq@܁.W1`:+$2 T}.;$@i'mBDNYuca1'u:n{!@Z Lb1{z$EA$ "6Q0 3Cݥ{~X0:Ox;m$&qN<&[0*$5b 0otmI<(@L2oD\B ֪yUb; Lz*)۞Pn:&G;!Z' D]`I$G?2G!e<7b$Z*l6.nHIL%v 0fd* ="_K\O' ;p5nG ;=vy` vEտ=s58x?;hca`\R9r?X-0,E6@P*6@&"G @$HAeW׼ys:C0Z<Ϡk}\h/uo^2xLvn#~zJbE:V$IQMq2vڿ5[f+ [vaG723S{5]WH;!D= 5*715$LyH$scQ:AqTϢOjT Q:HE Ϣ@A*R)ΖE{քAZ$& &&Y<⽸Nl<.eSPE13c!DOE6Hn+; !&ZG0H34n"gn8@`)p#z._٬c\1~H4@4t ܄C@=d~L;):]hDMD* >hGlsa\f2WO|A/v~ɝ$o@$8Ț 0ަ:j@աwO~.G'\9\k(I0++ko/~]pnpVd_/xg9z>e_?)p7#uf3x]XtUē+L|"eh v:k n-ĀeQj *Qm %ߢ tN lV@I?)˅gnA$OeffmpNGGt^LX]CF6-L$4i,,FF!E3Z#YSlI=ALNi@0/*FFNP9\ֱ'u@ڻO* 6 Lc|udLR4ɭLV[T ) Mjdt2@N^bNҐFT7QtLLz%P1_6>2HDI4A2GsyDuD=CC\gUHAh/ /eH Df$86P$AW&kT u|^si!C.;qI6h qi|oEj*DOQ4Ntϙz$1!ߕְ@ܮ3A6tއ{GѨM4*5GrA$[tH{,"@nmNqIZp+X:íMAHP<@ySS5 toct\v .n<`BӤԚP:HPe4ڈ~&*4 6H RkP6dN[K gP1Y'Lv^yse11s 1`/g:'ʚZ& ]B ZHdT``Ur Fe^*'P%@u'PoC~ejo&jO*-ɶ +TD n`MbA4 -0,s k-[3v.p2b/*8wU'zD@D%!I%!Ԥej`R dv-h<ت6x#dƪ$Ln hJ%VsDf^J@jDəF{a8q8ׄ4 86&OAt4L[DinU!#D}Vwr1_f`۹]g3,h _]D z=g:q^:Z6{LtL l3cC]0>P)^?5cE[ m+:u Gtp]XCXګY[[ 0O? E&];!4/e4jdRkP7AsM`h8QN kS)>k}nCoU9Ks@ᖱ$bO-/.h i 1*EdDUMBĝQy!: dE,/4Ys`Ͻ.$~DT@>WF` 2D ğgPx$h7T&GI7 2˄t}.E QeX$+zb0Hi#9Yf1u21R&Pz3^hA؎G!ag\27/`vāMW?3H 8r Y#aEjQ9 1.h8KA dn Y@R Z  2=;i25vo2rMn+N:euI8^( ^>ɊܔZf9t$*2H+& F̉SU5;\=TRdҦi~UqmѨ8@R 5  %s4 ᖸ`s8g`? ګy> jc}[c75 -7Rp3S0݈0ĺAim;) -y[: TE~ym xk\x?C$'y]Ir&,nI$u"dQxǝ[> 9kATO>"E`kCZֵ(+WɊɀf&)/L]Oƹ⁏.c}#_Cee~+8 6s$Xr@t @%~w} mA \*ՐGt<7Rft~y,j(jK f oujSsX?)Dy]_),{KLY:Z Iܪ4 A}TV%sn~iӺ80a48H@|c|LL>9,KX^y7.WM-@p6hE ϖ wKA"CP|_;[d ,W7O_yvc;lG\I]@\`^= Yl8y@u-k]"M)^H r &&DnuQ&#Uiy 'sq[2F-b\O atnf pq>[K8$z:g3Ywcc8yIy]BeA2/?x4' "rRAH$V6ST޼*@1>5j cH."$SI [$4=T]Y67*+Ad^e(45<4h@\.Qc Z|jȥB́:r@S'LDA:Gs21eYt4 M }Tk9(I]s$p^AsH&\ &H$r(UD ]-h.g7G5LIM(#I%DZP "; yhBjfv^ugGvC$HiǵoC2u3,hؘ!m˦c4H^y"+Ofe@'NKA.ºOP.l &DB$Dd[KT{N"HػةS)/eA&z/{ž >4ce<;vk ه4¼l&W8p#X$6PRhLAQފkKA5HPy yIo;P4Ha b@{P8JMld‡h 6 nz 3M?A *uI &6"\I$̃Œyd}PmکOtiէF61D7BZSjy\ 63պ7#;-v4z>"t&&c >;5Ӱ3A#Cݱ:}_wE8xtB\HP{8,zۺni9m'|ƨ^$6{M"+,XMVhTfbZ޾РmC?rӺcspFo;;!:o@~Y.9qIG~xACaN4"СM~҂ ɛ0EHȗ&cPF#V5% RR{@ 2tǖ,ET4Vh'aB3MVMOtPZ)q1h7PI¿b \||lq`B'I@L( S&*+Kdl2 & r]W~"=| Yk<)KeFe[p gPb]J&zab iC̚+P M;9}DDd\hq-&-Acf |{Ƃl% _'Ou/ ~2\ y"Zx:D(,4Ejo*$2 A @̙4 ]E:Qڟ( &iʏs( )Dܠ 11pjD"}M34\@[]Ӥ NVA6!(yFEñl&ə"NJET58Ek\w1&'`P`SKM7 ̩GW3LVf\IAƨ bu.MZ׿e ۅÎp3f踦RE3~7P0[e$_A&72 ;c7|Eݸet!F?"`P>5U2{2b{>QH&3pf-i=6IqF3Q;%ďfnTbUCʁ#Fb8 񪕡z\عLL^:_uj7hB!݌LyL7I4K P2&9dikb&&[I.mqB#e1iCԗA5N44ֈ)`IY`L]fAL1Q`ީ#InkRc΂Z n#i? xO92= &J |,˞n.[Cep@i>FS!Z{_P'C<b.J׽JÁ 'pR0΂u"j$xd\Wm&c 1 NqYH9UH>V$ J$9PONƪ55"bMZ);I4 .'U`L~ʁT--Pj(`!2>\}[dcP^ ?dIY0H?]<yH0 McL70IYÎKp -t&'w REU АA $MT{7yj@;| OL\U2XsnZl,lLk%)eb8H% "b[CH$' Y}lj!|A$։HošZM`sEM"+v\s9E/ͳGHo_2(ufeI 4l0X D9QigCk; Z0qɛi?K1z4Hd͒-'EuM"TI~0'zh #rH jb@T izOW='aa8b|Gb@H I15@i ".%UF`$-߷ h'M=\ ДEG4鈈!Uj+ Qes38lV`tf3wbcSfԤO{&NlR]ZmXT&ʑx =(bd !,NKIp2 I?d)" fw․FBv2833L_=~._,4ѫ+2&d IuH$TDd 8C~0}AbcS0LIكiT@w%@V LƒeHWL_`,!k{7s??q6Q\t kGW]&h}U%O&$ r@I@!`@DfC J[ɉSWHe`FX=ViTjm6 .nؠNM'EO(h~560ѫ4"E $DKUlkD#dAB  Eg/k_f J]_(D7\G}V;D֥B( ĨE?88PT={cT,+oD &=Ŕ @"E  Ģ)ZzYrI6_KII P]p TQPE"Lm]]2?BHPJ!00&A:Ge5]g hu<L5hqUSg_ }BG$`-HiU4nvshфI􍬸\lL@_I Uh*d)`R `F \78$.'Q?$6-+& PBNNʊ4Vo? Lce; Ii$.6+.&n~/2] oPE@^DU|e:.C1i.Xg*Lh#.W8ncj0Iq&`{y$0o|:y)@dwHT  uoYGe2a~.a `($K^x[ys蓫z3q&{/rkcd8dE^$Q4]?pAe5X.Xto2ara0/I_y_/ `lԓ~$ FM`Rv_A\?). Ni5 xa5ӤR 敓tВM%Ma.]ou-:\ kP"I)*)z €-"wH)ĩ2SBΞި0|ϗ %urن˝1 B{l|d N1-Gn! _3IA@*Gl\(bވ;C6H_oE^9l_U'MH \Ǒ"E bhJuSIDH }-j.!NIĤ6$XsUVhM\hnY8{ +ΊjvT(c 3Y&c MF@ I$- 43".4@' e~>Ga,ַ5E8ŹP3 Cp( _ho '/Ӆ 8IuE}L{(0[;4d8hOd A 8SǛz\$E5[f^ 1pǖ!}WÏ>4tfph8񹡁^Y,VxcɊڶ_^yUbﺮ ؂6ZL&=w_%?G\] fb/Ew@Y G` ښH1C^a$eR>`~Ȑ)40pA MIth{"G܉H2 FZi(""t.ZvшNj:}TE< =S3u4D̎WwgpFys>!mI  R%5I50Nh]C\INkY V5n>s-"<,"@Dlb-t4TD$^M] 7պ_McQKp}WÜ/+ c4(5\l. p4Uj-#i ֻ>vʌM~:lFlTI!{ &4I.L I U~,>7g9#Z\݁KIԄ6\plHjmP?%%λ8pf3{WO^ۨto1F[*8~3;nWiN?<[n(IMbpAWfQ5UDmDzKErd~Fi`xk-6;WCuL88b]3 :8P8l? EnyΣ37*t$mDAZ ׺j"4p{ZA<tH$݂\Z .cr *fp.O8{Ƨ4X-v氠`#s32Q~[1Zs>[x@@d5wPȎmSq&%`"‰j&J 9V&"/qfxu !Y=o4H 7Uu #@U9 c ?DV5n!1ec@;G` 6Kt髀ފ1 }@sxmiZ/970v5;/ɿĿ |:d1>a2ܽ 8\LR&R,?5.< EVII{Ā{ *$ <պDCuLw-f&&_h2Zig/ FY HˈN> sN$%d@mB4p( QWg% q1:1uTƨOh`'T6w0"dtnﺀו5`ەPI EH#SjM$vX `o^@S;w`7+GIxC+=L^>x.W;ܾ fC7'u&G94 \7X:`u9d FIcnM%CJA/6Y1ZD4H0(;J0l"rfֆบI šR5Vn_` )M,i<O($D̑ , u@(i-"0{تI kCC3_d6D4bfqs;?:Bf2x7 41iQx7eϏp$6& H2'.OnU -5g3*3xЗInX]VHؤċZLSYU}M6D) V}H߭ULQl)l""$GA3@bCAbHdk(zD䦺uRRVo!-#n6K#얱<;][ܸOPI>`I 5@-.L vP Ѥ4.:uSs7Ol ~qvL ~ eλuX$4+uu,_+q0򙁏C_ -v.dJ,"MC Z;}ʈ2`]MpDD]IYeNZ򟨐;:Y3^%Bh H#uc(9[ )  ;eFg0!&s||?7I 2\(&~E>y$wN}U#ITwWL7 DNSv#k'j@0LZ5\T \MkJʚ"I+Z\HT3d b)8<^Džrl_`~^];6jW^o#7xaWM-'c=GS*"NR-(A"-NKh⒁Cd Fx̆j TӹQ4Vh1atz]#U5QųX>-Nq䲃 F"I?W.>KV_-;l0$ u{l]ؤ?a5I<{(lۑFZ%,{?[oY.6oBYos x1qx>4ey\$FtN1߅~ 0b4@.+>F!؛.l16_ݿ=3'#ӱ0q1eٗ5M}}귭G=Բy~1qc#O]¾sQ/E,<ߕ:H"FVةhmd O옘!*uwP֒Ai;rN2=q6 [cIh}aq=PC?j4>  <uM ѧL;ҋwZ.*dɷPa#SZ VXxjAmdrgq$x+Ѱ,|Nv3!.070 #.7apsׄy]H6i_,D @iODQ3R *Inf.o0rj${.nIEcIGQ $r`/o='!ռSulr9<|f4[?%5>;x1XoUɱ4Lr4uK\kTH.pE{$hXꊎu? lvPji^MyQi榑(7؎cpqA|(<$"]{Vb Oe1 t=f`]a죧P"gY¾$4 {G , &@)ȨGYi"ofV0Xzo00 \ &kď:6&])ؓ %x=oN/,~$ˡ}+NIiv7^#^Ӱfc1,&X0?Ŀ rxޭc`bjkZlAZm 0E GQɍ++ #M4Z ďz3}9:MB.t'0DF1aC±3q3e,Ob7Yybv#ihM=2ت&fs*2 j*u 6=֘ւmNcC{HJ NuЅ?P.O>HkZ&Y\{րʺ1g7-uEuևD꟨ӄLVmb R5 fJ$L߲d "Uw}g9-cjIcv.#OVOu(PE}gddwʁf;- :$i;A&w( % {uI&IXt@/. #u@>Kbc@MwsW3b"etLqENC*E2S439&YG$ eui f3B!WqQ$45a[\ 0E%m4܁eNA2-IN!k%ta&7ujB܋'Шڇ7D w_Ez3]u l r> 1#؇[Iq$`EwTInʡi^TH66VC/uưn"{즊ޤ$*&$jBiyʈW._[PϮ^__[ù`c0&$I71|; z(]n0+('1L F漂 ٯbc<.{&y5ukGoT iTcTS]Hj~LΙ{ԛJ2}P悧N$#q?S*-=C_u&E.&f57QqPZN^j8(1ujϲA7+@!44AII#HPa*i %W$F! U}@.FmfNުk*se5~opV2eW&.文ȉv:oK\G#T٥u0*DWe8AwSRZv H;QUP iQ`%l ĘXN0JdF$LvEDV'ͤI?uQ̻*G;i7 ?*'kMA?7+EP">g5Quh?Z5qϪ ˆInQ:)^I~BqN}C!,'p")ZO(ʏ 7 (o 86@72N[MȚAPoT[K  b*_ ְRH;l~0v^N?Q`;7ǀߕg3٬bg.~a˟ !’ z:+& -E5A߂`}TbJ{zUcxDu (P0 )*6;'1y'bA-}ijwT"@]z P`aߒ,bb-ak+lكȉPh-D̦6-a0QuO}o4A3z/Œ¬?;хۓ8G1 \4Sۘê"&iږA(HB/6<%́J]S5ˌ0uLw=QLN3u@$}O'o0EDGi@} ,1!֍"LSJś4I& #PPAjS<-a-$~5g'˄Sdܠtz$F;QY; )"Sj$|Ԩ7QtS^Rhfo#M' PRf!7b&OIH 4AA(n4AK\DdMH{3}7no/2;ŝ"sCF 7LDԄM5A1iPZ`Qp5Sat%. f$5ښY`vS ${u1DCbe$&'6rfIqʈ$@3Q;7 1>|#?Ԏ(\|Άa4CEɁn뫉2 {, ; C$,$֠? IPӼc:vO)0q>5yY.gy5S+\[%H5Uw@6 . Z-TZ 0 6LybmD\ р.gs(RL (z w6fklh/ q%x&fi-.8||2esQ>!dsb`>N&3XH&;tKesmщs{ sZA@j|ET4H*%4L\ySGA a70II3VaNaVL0ۄV AےY<>m/ ؓXh*|L( X"$y#}N1ti!N\Dg?$ jV%2[$!JcbA1H8Q QLv@uAKϚˉZ-@$E'`:L( $Wj&}W@?Gø*>Gp13Xn&+Nwsns`^]*L̸R["CZtY5L"JZ@DSԤTgdޒpv@i"H>mLtA@\[D ~" ] So@. ZeL}E"C6h\w>h`M}D8LCEI0q0 *H숇*&.~?t m+:@ ~=,iVYAuDI&&bF$INV'gMG#$P~ iTsCִ *7Lngb0v$XKX6=M$u|& n5S\7K&5"zE<nvHb`|69q+'![5:a.U+4H$N5i-i ^?uˁW` 9q!3 ,vfLu$ҋ$W 6TZろF" (e!ؚO ;;>Suyd Ѽ(MLXraĉ"8WgK(Lԙl]ٖ:4X8x7an (4"*=w8ngCb"ҧ}RVؽ AiT TҶ$ɤ^Q6;Ș" b;uBhI`@% Avʳ-q#!qԺ Kv*p{PIJo2DvA>ax5].!bk%uA " Uhhө H"ܭ5bPYs6V@Q(0̅AՀfa{yW&O4GF\+nxQG{ײGRO4PQVTUP4I"tϸQʬFц*I$*I$!IZm*pgvF,Ux B@%X6AAIqTJIA%ra\Mk?Ӯb͗n&$?@{t+Z'ꨵTIM(V۸H")M"=TZ"d@l@"))7 7N8 7_YAĭp=\$HAOTyI $WF,A3Zh";wNXMx+"Z"%M'Tf@ "gCZZuȥdK J@6 !B5$oRxK^٨:Ii&uy!C}C"{]a$:O^-ټq2qKۈp /ȟZ- `M Etɑ,IIv |K@ &=z:WU'x WO'gS-`ጻ4D^IMu5. D4S3Qn6dP7б$`Q5Lld@ǥŸE@L"(.$Doh4ն)uE AX$6~迢Oen?-븟/$fok_џ|1\>[nC C{HdϺO <7L uFJbu .pEױI)lΐkz!ēN"!:U&E+At Vw(FY)T 4jM&>!j8YSS$;Ds)Pںe3#oD$HFdo(D5`5AܫEeHHډhިy?0ĈGǪ}AyQ"oKI;,jT$Pd2ىPZ`Hp'j5`Zw(|芋]IoLŸ[k klAflVI>@D́;!չ vު?QsdHSh/*I6aUH/Om w;սv-|׆ip5tZJ$ݔMdQpdS";(A"ee0@R A$P~HAʁ%D7v4 $Q}iM/ees)kO*. {*dXI@_O7;`3K H{1f>!.s̓7T`. wP0bmX8ZT4@%2vQ&\@Ȥ}hcrWc[bjf.ḰK\jkXP#a@cd 5 \lO.\<.ep0#h.,? "#{XAr3bfsX иeO|C:pYw=xp ĎtLĈ2$Q]o|Dg}C5abE_-C0?bVΧ(ăuӏsx\Z`j=WǙNz>]ٱ3q-m508_/1CB DvA-"*i%MIȣ*T(lyn`!@ywZ b$L} QSMI[_χ_;q݉Z|6b`U_5ǽǾ9} !I1Ue"QxP Ě'kJ* ӚuN7YV iLT!Ԉ҉#M*7@:H#jL1Q5Axzy[ABDXg3XiܭyY3("*h;(ϔ:-5;i3 19̙qB S]O?,#inO4|#G\wQ~E'kYqtZjJ+1$D~2{84@H8WpDnPt8ShAP2h䓴-TTMiTDXROL@fhV$ĝFK!Cd' @Kk37ULcXA12(CoԑAC"i_4 -PNs.=EK DꖘXHI]o?8_ b 'O 1d~&E \ 3ia yN]2gn){ $@<-1̮&&=C3,2gߘ\q\E/%aT浴`$w1ډ&P]əL Ef12b`ͱEǞ! ;Ι&{{Lwba6 /.VeH|Ԉ"jY:Us{@P>>[1ɐ344P\O#u$B7Zh{,O¢B"mwZZk HQcT&MhGO4n?Y{S* xlk9iBQ*V)LnT"iU[7 Fީ"[H@%׬ ;N-&kئkh""!͡H5UqwVIY60)6L@ߺI:ZT4MHI&(є.PbbDrYeDp"R dD6 L1*n!! 4&dИ( ou"UYS[@)[TWtd[54S ӲlEeEPE )DN@ ?PdTq:周J +}H DlEJKKsi&'{*6pܙ1 j8̪ehAD@=uN8%kN(LH\ &Tp{ 7sE|ur[53 t7K׼)VϗCw Zъ\y( 8{WY}-Fspޤ.]QUu|&[ ť_^i (Ă#p$JA $VSPd<ϕ?fpFd˴f'kKlM4N6L\k'oViE([6NJ2hh}`i փg LT>[k ~:7N.e\Fb Ԑ# |EZ3U:wPaZK @~Q$"bJOwFK$- -N:+4$Ah'ײHՖsh +U 1RP7F P$nF:ީL"( &h 7 #L@VoP q HD"h+{)zrcIxZ`nZ*v(6742nT>A6Eu@"@@lL+ʤd($^5 Q DthvNI /~|W_%`ǧ$)~H_q0 A[ENd$DM@/0ㄗ  fi wtaNfkYISRjVGL@* wˤ{l iȣbiE*LLe5{4Hc1vi`ZA0{XBo+EXrMVW)o̤xY# UHsX9UkhoH1fn Mj=q;K$A-{a"`EŊ꘡ >]>~Ccp_7` bA쾇,/&gR~!ŋQ/G{^.CH1@>auM&M2L@&Q&XrKInb[7I yV%/|HO%P* Wg/n>sOiEZm<$@'$Au +2") A]h\Ae4rbEkp`\-E6ytU2[',SUA-V$ia`+SY"*#vX8q$&{.(шZ-(9ZB`2빿 cObt.e:NxCe7j߅tq.Y"fdQa4VRM .{(3ZP @Q2@AAHE)S2L[ar⿟GK &fbf(tqP!H*|3yu\b/+Ab@t WHIlnJ$؁-Zi89AugH1[ucb ,G8$EzSYÕ,Ktca"кyg7cpz6[20~N2L@) i$PȺu:4Ll")I.b`~ P |"`m AoppÈHpVI:fo.A I3@, ҿϲ)]AU@E,} :? p DyYLrF&[)Q!?MEoet'YX$Weu<'Ap` +~[^lQdk st".T\nA>@FUEIT⴬Bq {4 :nl@^СqwuWMDډ2@4L$0$ȼ$X7X̙* CdHp K;@aX_xCǕbj&(]"Vuj5+~ S3Xlh'w=3f115 2Mc.MȻgwI}τٟx9c~9!Y.v_X:T IHJ% HC4 E#Hs@}V "s[Z+'`TIZuAL$iMŬ uH쫚VQ"E l>LR$*xHWuO0$R(c]dn#5:| wwߕ93Z(S2Pa*tY@8 :MLM}I0M-0!@IEZ 3tb]@uI`ITIJ iyvݸ@$\M.Q'\#`V@&AFh1;uׅz.FbhcU'I$$}GY@3U@ʠ5W IQ&iSe3H lR>rx]K5Y0@4]W;\㪤̕?P £B;*$Tl)U)i y[8Ÿ:Z[^=H3 AA%F n- ĊΒ@ej YDi!ZKZnGaq`SgTbC4Qrǁ1?p? #TfK0 X UOjΐtI&2#eDV FM I: 4ʀ V$S\@{Ju̟8y,`˩2kED+3Rw ɚ ЁHDoe  W؊WV&wT" 531bWg' L8+C^C+4JAl1$4ִXS.d \l#^ 2IpHd\ȂjHg{ L3 B#MiZU j0f;iJnT?6Dx+ Qu y0xHihd2Oe.dgI}AY yFAGtI*t -:`$AoQJZ2f]Y :l|~E5ԑZ0 ~֓n&R4TBp" "HkģfǷmxes&t޳ BȀ)la 0 LoNe.H .%`r}[b` TȢS'-xSPM`llpP$otLܤ`޴E[HsS&k}h$q̯־ |1XFkq{Su=F/|Cҳyܶ6c嘍~1 |m nLN&2'@^0w~&'K"[: Ck"(T5 DN^7r=C 1>f6\}.u+_A/)A3خ{%աdV)^3X f*G+1x٭];f*3,Sj}U1ڋL'T~o 1fH1ץٞ~YM8,8hpa3Yi\S{ԨD!YEߺ> hyP%&kJ4#I[v-#QhǴXqkhW1)&?D$èmحEELIʀL=q]ucUϖb1KYux \gm `̔"&ړ-Q"ǐ)+Εɜ݄9 .hkI75E=3"Ngkl{4 En W"Q>t!G2Gэ^R8( %e4R(2 :7IMGO.,/Jw ׅEHGuHSڪ'Q&)6"֚DV@C|D,A(A #Xwf ,AH.-c( b!}g^LQ_JW8前F 0n^7x9OdqqK崒c|F_.0'iH ;[6.-m5Lko(&L6Z2"&M] o/NQ]$1j6\d6\%s`5$\=}P4ߞU:hؓcY,C"f+ me3XҌL2uG8d%Z`o^%|YԼUrc1R(`.{2y\G3d4A켣&FDTMTHuF¶-rNa.nd UD jI%F6vrX,5F/ ߈_Ns0MxuI@3"H?c,g Pi+[VyYNdMd^*ƆDA,Agq~[1\nujRkdڦIOW 6vA_tI vA4!2fR0݉0IuXHLp'OV@4$-K`u3Uv&"Aw5 ߍ-s 1qsHt01^F3崻bWK$;q=PV$4(Q˼~VQ3"]?eILVh%ԩ"gQnL.ߕbb:@&ߪ0d 6NqfӺjO{.LWp+3ͿVg#S\?-f$^vX'n4?A&[2!lY\&k7 $'Y2,#4%3[&{(4G8msrM Am@ J+' j"$Xq+!M -D$Mb:9ym?#D*ߩA*_>F"$@tsbAwS*wJ^^DR1"Q%BEEbpi4?m$3ꨤMc~PvE\<ԎKf(ydPL"P-(/Upddo DoByQi7BF =SPe4&hv kIi@ T2*dlҘڍ5 `+l~ .sg8x6&78{.&f;MώL( - {8'$(Mbj)~) F0;4L;XF&l*`M{Fb,'3@ppT.=RuX %v&Gcj =Q A5-n#TVP()I` /_/GtNYԱq1E#jJLATDVGJĦd l_c?)q.>@6Pvih:`efb \$ʃAn1IT|"2HSq-6IknTdLRy(i:ߔ͇۫Ty@xQPRL\+`DrR&lEc\4ȡ+12;!>JI1P&&&A@8: .=&MPi"@K-)K|Lb9.!ZHlֈ#x%k%PK@6kZձR\.\&];,=$+O!&@XIS`Yk:UlfIH Ĩ6~\L]A*v ߴW/>Y⌷FkisE$O~}xln+XH,WXuhh}**M)Th~p۩-]M<@aSTȲTMkB]W:vUg;"K$,i_rx=S!q0CF=?_"'6f  &v*n 3R7På:`h&,@=W"=í \a5u]Qn}T)@b\=sZ&$ DUt ŅR9h<6S,ĴS$ DEI>hTl MRgD@b`"$ q2;dD[Ah2ix?3VYHELtougFYicX\,Hyy=$tI"--w:hdKk*n$I5w1x1O+7;OkZ'L^Л49f|!в8n9i_g0q3N~Ya26 ]IA)Y$G ?QH)[v77uLGyXay@|P<(3hdX -0;pT4DȽ,sĺ2AE>D|Od|.V{,&}'{-Ncgh1uˇ ,X+2̟v&y\I&I(% a &G FO)АJ, 扥i7(&`KuL?ֽI ~MI%j5$yH "ap߉V͊X k~࿎_>{9#F)uI Y~̌ukCHhX/w`avr_?0ɗx{KŬ\\LL&b-1G4"6Z ڼ3?AԈZi!ď[QG ca6h^y4\ n斉&-TQlDH&  iMf7]Ui=QCZAPY1~D8I330 r}8]\ ~(&ߢ$͕<ԐL8(Ki^Tފap0 <]i32$w(-oemsdn]3溾u\怒!u;\.3ʘ:kA$}I:wNb:;Wd.:M$\] 0{(=Ć{RKZ+M 0oD*`Ԁ=I0j72|䁲 O; P_VG3&0@ ~WӺwsY8yV$ /4B VLNL4 H* ku^QfqNf; D$tn&nb O碚V`L'S8ylu5_ tWw0j~#ٳ#UgE8]7 s A&(%~dA%=ըD*B$HR=axdEh`r5QT6 6]DUiop`nh* u}+Myc4*oSuZ]pۛgX_G,Ftff|2<UiY.fLÝLIn6MS$jᏋ> Og2Yg^o/W_ށyÂ]&C`Iob=Uf;Xl479weY7ҥY&{u\ؗ5l xm._w9,8^Qa&`c QͶ dQHeq`!~۟RLnG䛇8;Ēz6LGb9ϥj<ڛ, ґE0B!teHUsQA(8L[0M"6DmpS\@1&A" Mq +$9>pQ"$IU5Pi.1? Sif|JH?Ib(O+̜/hp?qq.&BkOU0cֶCA2tIL$uòO1>Y_{P߹udEU:)X19^K }RyVj|>ጟrg3q%+Pk玱r<g~6 0KP2?M2(]^0\LG+ "//rD޶K|(2 @=u xgؙ1f .~o#]OOq a8J &_~8G dAj-`b&);0tڄ-q;ʃFA~vC yHpkh'zE&LGN騛e@EcH-R*Kؐ塍;HfզoE_볉krln3K 5kb&j>L7 D8K yIGF#4i>jeT3Ph$"*+Uj?Q;N`qEc2EO*.)U:d3ʛ lt:VQ2fA UGTMZedzqMcy (GE4M *$IP #pO4 ?Z7Ĩa. d,*:eQ~ਈY%ߔ %Dj wʀ%`ŪB H"2I-qR60]P Z&`^D͎uؙu6+> [RyMfuhGɘ"EUMxepK Uf#Ht$>;I谬D6[-n @'^#%O, ak>PZUpș"hSW"- @ t&A:H?xL2Z9$UcKW%P:0ؼv Gk [(6@ 8E}誆EmaWjd&KM=>_8+rOeܶ[(r89ÜMp8QU۪ Bu{'`xD @zs@~i LsX2vQޫ l#'oi-]_$ ]WhpneJniRHEZLzEs Tm0 ƒ 7AɥcP3 J I3'@-I_Ei6 2LT \bb z>QAK^=@GgIpنV fiMh7>fiQʇbB~剿xYOnu0Fehj .rȬm'oTǖӪH?;ő:vSf ED++aX@$A&V I a@TU7Z O`fzq%= ~W:rQv>n408@IwtaR#˝x13Lg%v'CtEor6H+pZmuÈP [Ce E?e͖"Y E6Qq&ƕ26k"FmEdyLPw_Cgm⬯ELo9hnCE*I /oNuw`ca4; 1? *iҊ*ۚli܅z?TܭG ߀|A[t|M:Yv[l荏د- @Auf-3"&" A *ۯE9={ceqpXz.!6q]|3X1v ]}߄tx \KdZOy^uy72<'kKu,ؒ [TۭihV@6Q5y28 ` {Z37`T1;/M.3mh<'i_|v񗇳LP` s'uax\h{..0bȉ4uK#8PzJf?7Z5@`}eSiI&+4 5& 4@6ƠLjB0^ӠME"H"HjH *dm-cpkRH1UGAF@l>in a*&M`f_1s.)nzCr8Y`? :(Dy64{]_+QѪ;'"xA%]m8H,I$S4ҡ%?HTG[1L]mބA o4IQ|T$>vW-I7}oez{ PGQXeq\0L4tu8sUXgD88zYu,C)~_ C0hmuI=ʄkP>reنq1ZٸXc)nLycuyu K( D5%A@ײ̊54{"8nf>V0+}֌ B$ 畢 l;cB LP{(j(d#U?(֦%v_w3 SCW-t‰;iZA;I<d:ȍQɕ D håh13?E͛75nX m48s`fr3xFqk| sK)IE/(#(Û_Ĥw#H1 @y@`}7AHӛ{'LO*m]bf@N6gj [nI`Tz(LnTHֶCdHAt3~ j3b<a1ӦB0`, 71s; TD 'KLL\,"RT-?^GflB'KE_^3M^~ 9O԰[8O>\C0)_]kfTt`b7-"A 'lQkO#<gO=7n~3he3r')s.-y~ҳ&\52`s+??Qf[<0e"Gq]dDg7Ig:Bl`ZdE ~5A К\'Q&U (V @&u0xO=O7M ٌM 8Ox3=Ofz7Vv whs_/sEK̼.'CIUIR-u5mTDild@p7 $W5R64 ^&Z@E[~TZ ҁW" i3I*DԤDUHw:gMyer}f;_4 V LPU'ut5jj5A ;S&T0b=Vu:.Sg 7 {۲_Y/3[ =h_]Cĝ[=ճX+K^T 2I@12h7QLgଁ¾II2o}C4+5ZsqPF%d`s-ac|9X@1+ Y%&pD;LG h3 h$37_E3:tUˆ_4YTr!P(tI`$^$}>$qvT@W)1Tk<1Rl%sALS11&W_*mfz~,XP/e12x $XA-dm}tLE{!Ge#bv uM@@q-=譨xY -$6 ""ʒ\@QXl@=[@ZFD ?-{I[$z ,8Tܒ5LQMNx@$R<ƨ 8]I#\xmcFR @ O&StI;(k5TnUjh8Sd)͡=ª @APyq(?#Z[L-6X"y U:"$LUTAP JES!?HKH"(4sQtܝGQZ6T4ACd ֧Ih4=na7&ߪsߗ]M&iY΃".OnA4ikA1v:~AC60pZ`Ee<''=c j{Lo}'t0<1՟r ^GLtg.@psLTeǽ}Hg|Gvk5p aߏti@0n@i _L Z%Ih P8'pq+%-q1oEY",=XTR2RLr H/Rdvv@u&>bA"YPv8G'4٪f""`$O*}JkK>6YA2:d謙=TeLZ"5ٴ{M}G "҈/㲉RfDzy}E;&#&KtIIc`a* kJbi>JJ Z9PuASDE6OU;%'쩌2GrI#jY@Vs(2*㕶7SM_$S4f kXhvE 4_ H+$I m>b(eCN۬HOf C ͬHZ'sa-j @$[ @ #Smi 4@I؛JL{ h<6@޶Cj$ I,#򣰉1eH&DT Pi1tIʾILz)6DIڋDϖHДi騊-P."\؎Q;.F`E9r'_+q&/м;,L. px`gWs1H4#y8g Ap8aKI\.n'kWk T.77""k5*Eɗbfl.`12Yخ3%1J-O<;\!m O3>+_}u \[O-4nW91_^|eyL<TcGYNwUeLa1 FP8sU16dIDHÅ i-/ Ei跅86Ѳfs8Ƴ1~#Z JeTy7CqhgmPvU  `Peb) &AFd=ڛ 33b?t6\XNm&O<="Nub3z}[ýOe l-b50@ohAFuw3ҲguܛLv ƱayX 9-mv\@] O5mNѺi@F'g~ҨpjH zS0 Bi(ɴQZt*p"N$6E.;k}ϨEZQ$~ @e%ဒ}g}f~e>e4n[NC7AozųG4+ ˍf(i$W7}o}K%Ἓ8xN?nx>O3# RлޙҟF_34S|FMOTk3պ.s7bq$jCC;9|<_ˉ@1ouԷ]Kޗ<9ߵ70W; @0W.9kEuuιu.e釆1 ]My?VԒGT 2nEϪ -[jd>VGjU;IQXA"o!=31r88{A>sظ{j\d$BkMm~"LPEE}r; (/?/A&((`C0@O$#Wx7r,fKvkb4h5e|TG9= |n|LOs1ہ׈Ƹ^`\346jecH H0sfl,OfalHsQX\9lKL,b?\Y@!I"y0OT\ 'Id~ i1qyQ\ߠqOejQե!2^t/d'TQ[HwA4;Uܭ9r46#zHCIt\mhUP )*0 bY@ ve3TLY_gQe?X];C18`Ⱦrblg9 4irb7.?"M}PځD@DwCh+h4MBPfLr{VMFHscd02xs\ A0SSu˕esÛV_=3Gf8A~#ˍ;dbnIܪbi< o;.<˸7G/qn)I<̢&@:\Q%͎mjl4#R`GpMjBÏ@ ҪӝEET L&TMvQ`J >ixi.UGɓKqd>;B`f_\5m+GA$&b] @6PwӦH"ut벣->_ IYFcgr$B $R&&rAI)q"nR`X*@ދOcZEA̚,XsSeDOd8`e$%*#xCMl-" s24i;B *;3 7 8O jPAܭ@iH˥Ē"KL0s*H@Y$M[kvc !r0 $?I?򵇤qhsbjH uI 3&c&<ƿ)y$b oM \IuM@ߔZ-h<ҟe!I.fI3+1}hk[S_x_kbw?T_oҾ.p7fhb">4qxDWX/8`auw'A^.dX"7<´L?~K >+x usAor/*^/gtҲئ~C"rgMELI0Y3 3u%% IE$ir`54EWoa#WaX|.@3$ <3጗\O1lx?3 Ƹ4`;],QdQ@$(pMnXqt0О0ۊF فd4" [$YZ A$-?RdwK]d~˛ $8q~`pBh ,@o[S.ǂy,>#YwbOouڌes^`m `"{xu g:Gc0a4 8Fl%&O$2d@F/mL֡w).d0б ^ $#Ф%KK ȷSHuj&nh5Mj] 9PTi܊Y  $(-Rݜ`a9؎ ܝ{ĞobdsXtՄm4/$iH1i=4Oes$DDn=t/-9hhpn(/cuu~(c10`^b}Dda4I TZ LH Pb$"(4Q*V |f#{z {DЂe@7"4]O߲CHh y7BZguVYYY&fp1~^;$Z=y1g6_mk0N\fN/n1bk ,l|LlW=\do+ \o- X({Ei(iUz}Oهct6S,qyis\ b,lb~cuL,0gQ0;onW/eH!B`OԍT-]y s+ a6u A1 IHC-dA4XO"ac钹N#Gg Ee{,xa5p cC[_u̷0_5~k 5}7>_c;-,F-A+0E2&7n\"~6TɯiiUHqJج`6EMkT $7Z@>-q GMCf:>Gf0r9c`53j!:VciPPt@~ +zu4=oid;HJj`yVM IHuޝ@khrBAO-WLV˲Ӎc<-4C6C(!cI:@H-HV`jXvLI=ɪˢ*$06~$O-c2T"IOĸp iS{1Si|C-zH"{.L<2`yek.m-=ipnMgtɐ TY&f6&E*)ګ-i=CM7@ "!rἜPl"eam-6q rIzTKj&hrDLLCAp]I2I4}gN㬆Wp4X~\S]MCV&+4A:Z}Z#v€ssKЫT7KxP @oPd3l(41ۺuXE$Is#u05Z @靿!,`.PmwC0c E_=cel7MУJ*UWdI Bפ*kK@E t  -"V9.aq"z, qj-$Bqz$45 5&?$@!е'M Ehl@2~XO6wHloY>‹\LLSuTJv6&54H(I`,)54J+OLb9c+2&-1#Pd bcvr9Vfs/m7q\97ߕ$z(ʍ-+BjH+Zqt >vr|0%}oObg3[^a72c TGWu,sb`3 ΐƊfǸiĮCWRep$;(Q6;R ě dD{&g)M@\즈b2lpR FmE h&ur*kHmt5QdEa-h4 {}7=sttc-n|\,'=c(cp>jvf;50]A+I0$a7=i ڪi0m ɐLeiɒ"$2]Di'tEϺ$)dbU lۦ"aMT SWT2v{D ̟~{f#?Hp"kA i0tO@8P@d0 kܥq_B ^W>_. m QY8/c\$He@3rkꭁ4# <w7>Q;ظl\pc0ߧͱ%y8c.8$.:6fYؤWMJ&/KeWYPZ5Wc)f31~\4W kE/+¾5u|̷)oGA_wd##ʹkI@_&#I!]3ae>i]x;xG=Cn3[Z-43?Q"9Ϛ"תt ژ =Gf.WHĂ&(bblBIs3";@7VEa"\K?$Ji Zn"dҞ$S 1_ڛAOf ؑBɐ8O@oVs l40b(]@7 *>Ĩ.1;MH&=AȓCZR%Zp |ab43R[5w1etzV{3[=nj xٽG|=l_ zG1u[x4R LMg7q\w3 t-"B3KC\PtDM $[pk "@}pk2nI+V ` /?]tg0; 7 ֲgcg-s0x.Ltl701$D)cuT|x31^ȷ8/?=V)}Kw087Js.[^n#pv&\HnHaD`EF LiC[+哲54I>JYqh ^$4b-;&5KKH1THyQx2ILy*4ڔSL@"'Mpﺀ.]P?dOhbGdi✮s4,P5QxXtLut .7P–'ryK}Kull;?VIDI i9 HD R@ƣϔ"(1MPiPL5 I$w~ko$h /v-ᴗ/~|#q3FC1qy1n|onM|j݈6#_;n$~$N7ZtH28f-t@o HcFPV9]ݗy/4pW:h 9bb81M!uy6QPjaAo;;hqLX !Ys["T@# =OeC16SE麼!61\[AUg Tz\.Wf3=75wͪ(`A*{J6va  's|Ja~xtޯ<~A}5BWTAsK4w?cu,xz>^>Ϩ^fc~e 뺇շi"A&-MHlI hasQo4Ǚf1 2yV74q;/" $8dƨfXe|6YCqxgw }?h5@@xމA*&=-4%QPGu8`T 0k.ȐH5dHY4;z(IREA4-I.!ȹY-9  1L"0 q5[h[`PMH`-s3 .`ڨ iN; j[s %q&bS5Pq*@@ :i)yQ_E]W?DSӁWZcb\H @P\[!8nAA" ѱ-M\$s0:^'W9<ƻ`/''Os%^hݬkOOĂf,0-33EӪ2%Dyji5LI0gap}:xzUii%#.; L7qs&gE.c& Dz@MV3u(dPkˈ ̀~iq > s 5uXp?8Fv@` n( { q2£/[׭\2ޥh;pWNDM(PuR DPlHZFe-1U]nxP.QA'FfZ (Tbg7@7́EAqz8~&S?)ba,|A]/k W'F!ficf  lEb ˫k(.Eiȉ'yAiP].i#Wޫa{]?1ncbk.xg[sX^ƞ=W D@!Hh&\{Wx;6k -{ zO ?'ﲜ\$IAڔQhq\hL}֤ A Hj i IfA`/vP%h@iU9~Tَkhsi'KI9QlB6I0 *3 Mj $M:"m.sQ6$$wz.{5ұz[\2@iZ  H_bB"?d Pf/8$ietG1]Hi4`yA;bH-@42Kv և@Pw4H{L,W?[$Qvs}k7n63GEÓο+108uuę| ճy\W9mljD "snIPA=Q d $ۋ K4f H5Ad0cDГvBnwnH%jA<3`NI7_W/-sKn&$ Wb3LGs#yDk[ &,d#u7&" ud@Pv#[v/ LidO@L@@ceDiUp-68Z[_u:r'Nn?*;R[B+EKԊ-P"h"} Zgp%sc&hȠcIlmx5|ױry<_ZfIdzLf&0f3j{_V\Eʽgn{毉>-Wbq]~93_3iWI.&WW#Ƶ;Bə0:%D@&oBs? 3 i; I6_37Yqhy?'08xb 7Y.Nxp ($TGy/MV50b;>Z5쨸hS AmM*"D8k 4La;P:Nʵ1 )Arb1,'Lf2ӧPv]lG򰉖4 p_[;e:/LsA@O{>u_ ']f+\ǎVn_ Dۂ$ApDiUTMtD~PZID$"`(T*L!ZjmB11`VU?0~S/nd4H4 w|c/:]- k4/.u_РC3kAAh*D/:쵍gр@IX7p >iSC"ݢtn@6t:\MCi4ɂi>,$NԈ4TL(c^..4콾:nS9̞gcq$; 2(mZ^4`M3J/%PN)i?P$cX)6CG'(DLYxD38vq@& W ZhV 'Ej$d*HP-İ'cժݖ[!Y ˲y,4N&]ݥ² BwfYlw[V#t[PjdH6-6 @'h]L`=!ڴԞ2$V‰"Ii"[r+& ϪPT.y2A6Qx 2A&C 3k8!Ʊ'ILMwc B  7&@mLYn&c0]{kN. ֖PG  MUQjUXPʄ15("u5,in.:8srG}n#;&f n)1]ˉU%&vQ ϲL xxmau嚑bZ@5.EIPhfcIM:\l&(b6/QDCw_E$-m4%9Y'ajvV\ $PP  IV==)TQ!P"I_G[;pp0K 8uE(b|Cte[b;idl}U fx jyIx:#p!܀ wt 8q3AHyF{gIWH1>ބK.\,.-uH~6)~#&LX2'ح݊>mc-b45Ÿdm12H$i v 0,u<"A:L$0+d%MTiK 5QhKbd*f >r``llky[qYfA<.#@ ̘}HQ]TH0@Cfm7-z|Q;Zt`. Rhzt"LF(4Ϻt3(.FMkP2{®bI7;Teqٳ/q ٓ҇Zbbf& ޗ샼xq]!ՋZZK{Qk_>1{~bcbtj5V=j .:Wφ~4杖1ظjx ||U~x-XY?1cTyz/QXE(V %dΩE[i'x9,Lc8lh&[RJ5ѿ KIu\Yi.uZZ ]0FMg|@unoh $Uz=3:>.I=tԂWLG{l&$F2@UgzB.}& iA"6Qi 4&|m3ŗg!ʿ1~k~ ỲXLVd:=uL-N*H.>&tVv}U|gG0 's>%gǿl&^@*"m)?G$B@ Vr6  M &x^zOryrxf6eFw0; x%^:EYLT{/$j^PI-< OOFI,w{'dwG=7/̴1؄GS7 A*qB/2ppb#Q5 ɟOra7 wqqCT[{|%ͩ.umE * Qys&@qϐ 3zMCDQ{BCQægxN)es7($A2p$?[Q$4 vD5YL(kdG!6c̟`"+}BL:muFD@2lMUI47D lAs#1!1 _ _;t0.Ai7}]K:Q1&6+]ܕQz]3; qMmזLR}.y1_H 1 K c[K߱FՉ왨_DI&Wp]̻cCˠb/D L 7V@`@֒T_N#dM5 fE沢M~;#i&xIb1aiF2"IA*9^yb Ȣ׈@/s\AШ ^8Md VKb 506IixnXJYBi13U=AuPj*.Ĉ$:wA=W!drV=F$yJRQ)Ye5΂ ; @i{@w,DSp*&('d̚ʏWTJ:6(&ă[B `Ud".o  [}犚߈|Jo:> o|f^3bbdv%[Wև.Q%>/::^g7zVs9fg6ޱk/  8f 4äEFVÅ&.h"%z9,9{78&9_ydY@k_|APYMx 9ѵ_uf3YάmN8/?q(9 38Lttq.&+pfIK$?kC~>/K==G =q2",AsxgŹG3Ǎ: xgP-GQNpx! 6ΗtaK<x_.NIAd4@vQk3 5I"hO2cOQi12f4yPI €&fv2?V.G+@0fJ0Å\m2ZDԺ8N/G Yv(;҆T 0FǏđ[В" w9 Ӄ:N#N+KF?_ KF1fqn6i /2j`9H}IըP$ 7Sl~cA-H\DooOA3t1p"h t k ApUeS`L@q4Ms 7};\{z(kY@m%acč(Z@'u0 [ށNe_,$4 Div 56 n :+ 1 1ZE `?.@߸N67͓ dPI<(\|m+'?e8!֚Q@Q$ 6<:o5??KILH/dK:F*H&e-[.>܅i17v@FdTBJvDtI$z&twZPz()nԦH32I AunSMyOӨ:EEw;/Cq:Cz{O%y7 oSYSA6Q--bwu: Qip$&I40{}UR@5MLAIS" IQD]±Fd 6Ph'&>Y0nu#1.#N&>.aد.vÛX'`TMB3ZJ1oD?W T EGuA'b*3P`PGUv>S& }$Of A1SH hH@?(ֆvZ 5Gb!+@ xDh\X+O;<<zfnCْ5D~3ox{_)/` @O.qjnfh/t.בq PLs~#KI?uԁA~ӧʴd74"; KKPWip -dɂ\g)`6ς}_N[9 2#<x_  x3zU| =<ב otj04: [6N#LCOOU tGT մZMj;]SzHm I6LUP ͷD$l:^S=C!q~[y|oFGpqqP7;4N #JEPC+iNe$"@i"T"l -D5 V䅗DVP"&M jPʀ 8F]h7(]yʃ ӾS}W[9bdp+ȐR;{p0Îp0K\Wuf0z6Xc-|O8Ɖ$<|qFxl'LEM#1$0ʩ KZvDæD^GvE?qvằٳaL488\Rjdz D 8|A04۲1JA rPq3NP y4ZMeJт&]7p~{̓ IDaU EMʵH"NA<@Dx#Qo $ &ZM MP!#K?KK+Os1@Eî ] s2k@2E _qH)g$ "@5WwuLn8}?3Ih$MhuiD|be8ۢ杪U$<-54" ߺ. E."[yaaH\&cj]MLz}#[~>v`AZ.i$OLRhI&UQq04l.&H-A DIPzb's5&5$r@D{+V0I=1c?* "가+]r7 b+ "_pzNn1[0 X[1!Ƒߕs{', |f7| ܎ܦgڥGVL22$PwWuA3PYDKlu읍I;5I+}*ٛRcwYiP[!ץw+3?)b` 8cXˤR]ު5|WYt8AmIӨF S A+ПN4 !v D#iPeˍ{ZG"W U7@*ElRjAdD h{Bl9Xw7H JI h@޶ZcG?iny\8~) f.(ocu޷I iQ-gp ދa8%E+NHL&knq ٣O^eUe`WN.[W79eQf35-tyI\trߋ& R$rkuk7"> ~PfV%ד3Cu qCI=hp- PO 4~kz#663d؀Q'uEQdd(& &* Xۄ,2kw"G0ߘGjn{^VAPcϤumE,j<ƠZ2c?TKG(XXd(3xEO`"]IF"e4 :)AE ]M"}")DJ_T 5 .&}ٱʈU3x9t3pݙ0 Mйyᬗ<[3u\# )4ؕ@Ea&'S " f'Q}77x\-H%S4PKdZ(xk&g1̷qGqRMhdkcD䁸;"L 7Mi_qJtD0 I1J6A-tkDKd@ 4"tiwXbct+Y0~'D;]$ ;d\)7CEn6J8)c157a5^;S[W1 `$i\ bWc㧊:üs8`a0揤pΗ=IKh4ߏ!t+D餓U:)ހEBkVk1IR`HT23nA ڞBi1E+? 4fRtTT5e5"tiq#悑E4@u Ο.4PxV@<¸&]SwY$h5HM[IY?K`#,7 iXF5V i> P%x[:DOTjj($͇ GQ@fh{U2@@rEΞVM>-hٿ*uE-o >h56tV"dLN? +0"O4P $_Ec$A k_ ԏJx? 䰛%AauySNG"]]rcWd ԑhE`5 vFTy)Kf6F&$AD %JMN٬s?9|\,9`lHE湬$rS[KUBt G,pq- Ob9D0GjB"Ou7?~ü9`%Cv\4E1i+R6D^d~TD rf Vn+@\M8ĥ֤qM&EA]Z4`M;ƹ@OߘQ0ATv*QZ\ @!l#>˷_/߾| 3Y|NZ?U/=WlacaոWD.Hil44ry4 X 6L%H(D[$ohQ0؃j&1$${CKcHQy@(6E+hfq,D$ҒQ2`jtڸǧ$I;*3r<5 m$qZbCH.#f#H8K` y>wi -&'z?x42'.v!m&=rX}kS *Cv;^'DЍJrޞ6&hBHPQ%薚*ϡ HzT3ts "?)䯥:zO`ch0I'k >-ײXlXi4$8O`th|?eXH$w@c++ \։$  6V& Abۥ0@N($C{:P+  l;\5qUٗס6%u髱;yiqcŒ$^Tt8N HOj2?P9 qsZӿp~^YqM# ]iRA&EKܐKD'͙4`d[q4\4b/8#A  ;lPmbP/Qp&dQN:(o`… ׽-Di:@yP D:lubE.t6<-[,IնmUi1@{#ILRb`.g6 ?[R wLSZ#y CLm͗y'82ʵ#bB[.54>ڛC%388_T)!?E" &uM?NgC ؄qwf&{n6 "~Em &$(ܞ Rv2$2p|" wLI xX-sa FƧd Zv_ٕ_S庑{Q5m%~US3c渐+A6 *ke~gOt.Լ?ӝgހ/m[uMbn<>HyMlF PH &†, =Yt@q/S!12=#3f_@ssc:O1F@֊~H4dgP@*"?3dud]}_a4AmL۞CC< z]'6T<΋ZX,9 .3&H,v D&Kq=t U,eh$6!+.ګx>v"FҸ GheDH0vTDi"1 x4V* b(n6" t^eɄ m7.~˹c&.ٷ~H:]o gpOY!|$^eN 9K A5Ȧ۠HRSPgi) ZDJ 9D6Q24)Ff=& *m@<֛5i!Tifէ?H2@5< O0(} EMDԭVufs3,hgԮ5PE;H-01E*ffZ$i<² 6 Jy;U7l'U pJ%G^\aK"#JJv #na@0BI]N #`D;F1؎Atҕ\\0F]]Rhq&4r%$ N5Q.$808;LI֠֗:MӳfFʳDHI5Y $ Xx[j ,Hi@ɍMNp v` @D2.N H YCO UQ^MuG25*6"4PHT._*r`@#/X /+ cK3rӇcD4;Xsǐd{ i:#T ][^P}b&I &/O纨{wLA ͉uˁ˂0AUpľ]&ADPA$+M_o#zS`HX{OVXXG3D  lNe@P^CGyʍD@6. T֜(?Xos$􎱉3M~+ 48ef];5y$$ҰQop f kI0Ƃ)@3H@%‘ Me}~Wa>Cbhv1&4EJ<|?c+ZjD-ފ'a6YM,M]ݫ(2$Hqe=c8ޝ+NOI]eXm .&͚ A &(TI4jkI"m b p rQù4D7+1|ޔ TdDZi`44_ Ǽۺ\fHBag`7A:f;( sTZ`U&n&i=UYSN}ddH|$|Lk&V\$Ӆxިh܍DET$CxPh͗ooNnp7ˮGȂ"Phv"ZTU%\nZCʬΙS 9Y "jSѨWktneLGrv_kωٟep;h,@LnʝB=@dzte0zqh?55X ~l<)`?0!&xdcxT֟I {VyA +&#P*J{M`EZhd޿ kFOYv2Mg c]ڎ g; l4CO0E\}ѩ&AEeTH'bKMT4 ʏ1-&މ\LAJḒCkiQ@w t8@>TDDꖶAnH22y&W'18\XH ֑UßO:fK3cDD! =O54afEѶrOHkTІZvDt A'eݻLF0_U8$(lfI@M 89,ll.>|tum+ASϐkZb:ckFvE8@:nO&+IP$P#U 2Q[X$MXzn l9_C<_yx-`n {c7f\!"DVi8HD÷AitIhi:IPТAR-P4d .O2.Ч3ԳY&6;\E>E$liql&ڙO;nH6l!rywa6Q\m54#o>oQ&~['s$Hߵ8`{ 1#P\BCNn7_|3seq1taHl=ER_1⾁|?~kdmX;u,} Lc7~$TZ.LI4)"eUu,O^q7:i'Q< $rLިǘhil/@ɂi+ sQZDy W[GwLf7vcmpL/ b04P_z1~%|;O>AqSD>gY8; EB*/Bʉ:jGuwʉA1a o"XdQU$c@8Ѣ(Zv5X$s&Ʋ:_0ObGb T V4 ~ԙD@fl4AJ?Z -%rYo+v&.! k+'eMt&S;,l'="i]hRC E]BH7L{d)3TN B)X@$?tG Pqi #O@fB6Oو$3A?:gz]?//k0#ChKq2]@"T Y[+t' x wWúi _pAuxq0,vYiKt#W!o ^[A`Yf%"~о 5c7i4W88K˄۠ it&$ N1.15"92OSA|yff @N\nKN289L/sHRB j:6$~H}LU{ƽwÙ Gubu\̯H0AvϘū;/q;Ht sH"m 谓X&'P*sjx@<3-aQ3YEj,ek = zhÒk0 ϟ;=*RMfjQj!FGe *VT'(}_xY>cc74ĕg&q1q:D XZW`zN-w|Tz#:/m fLbxp{86LPaPb1 15@P 9P 4pq PlUhU`l\tk* ħIb<<; bH^)3> 5Ψ6H6.&gd4Ӊ $ hD-^hR`8.wP0A^BRsncF l˿'~8 aZhHqHʩ+Md};lS07M$| sZx) TQ4T "bWd$&;D6ϭ bɆ7+*&} эqY"~RtmD n d1 H"D,#ЯouܿO虬88RA$$?\ZbLm6~( b<^~<-\ָp1UW,?'Vb? ᮐXp̳pDrPuKI.m^gټ` &ONG)bԉ#WBPnvQ:[BL8DP$43()@z i.ۊHQ10+){K$P//Ku|LR{Jrv^NgRoCW 3Q a/3@|SƓDDiNTM}TEKE3+gP}>f x!:Ix=//eLKZf3k" #.C*ZdYR`P-Oi7~`#hujP4JdDؕɇ1aM@C{b)JvW&4kˋDnI|Z5*~kdL’0=?u56T;$,LLLc;KIe6ĭ=l8:&A4֤<& l E!C %s1GlΧ)0#챤DF=> S{$Ж"dMְLM Kz#z :YMy5D_.Nγ3a |]'6fc$mb@*Zd-Dȓe(Z s;A -qtQ@WWLc %/5Yh$`CIج6ZB;A5AZnj&N)Y U%6udO+. UbVۊ%OEDˌ$JIbbrZmu4T h\@m l?HY$ ~VLK/WlH~3 8@b2w^^+ۉ]-; Cj H(MH2@"?& `9b+%퀚@P$}|E#TF2`:* `T5@_5PSٜ<,\O89lP~S4 O;DT8P8ڛ("!$ޫ-InGRL4:L7<ahѦH?t4A29T8(@I a5\i$U!Ȧ"[P6.L$6]-OM NԢdsg+GrS'1b6G+3'd&M2 \ M=3x ~#6͚&gA = yEW>nj1;rd/kJhh Ko¯FT Ŗѥ)$ N}C1x?q~#^:\w*פ04O*{$NIE Љ2t+6' O%v ӤU궤\/[^>6S*'ʐlpM7?HTéD*ahkdi[L ؤ0o+7I;H:c4$LA; ݖa`435 #$[ęOҾgù\L'2XD;n&E <&v]d6]p@kpb\bPm 2-:Exd->k K #uxpkk-+J%9Nw!fO/7C as`R?.s2`i [I<tl,ʍm(4&@3F g LA&f* ?V]Uj GL8Y!ğh xDJәn nXO5,aNv8 5"hׁ۸\Xnoȣ`Ŋs: 6} ^IY\8חi4 _?2 0q0 ނ 1Ӈn.g 3Y@_YX, 5،tع\# oD׺tReZ@A[^ȑ4G.lO@M4o$}..9@RMHƕFKH7$U(gyF L@A6^MwA5% +Q.yWc<8druo GP#pdUM)M͂u&uDAu~3`g}'?1p5>I11xhk]]3eXT/G:sz8a ?u/~sfq\uL!>i B0q10Kɜcs/aba= #Hq6@߄6yr㨂Uhm5pe.|E{I9m <wb5y .;]bFwSJIHlNg-pA-;6CZ B>.W1ཚƦljp: $M9(ڔ*hIIT7Zk&"bH4 '2ZFHTmff+ TPG)!ڂ# .B ҡRu+)|ϐ D."&՚ .A3SH@"iSw \)&(!hIkLyEG CB駠sx9ъѡf_4D[{tL4/T DGe"nܢo¤Җ0&"l\sM''s JyHp582/ ca3e&v]zfevah!0C^v?3鸙*H䬉r-LpE4`I{ڍ?U7i- 7@~T&ѣy03{%].\JZw\x+0Nj [Ѧ막{?.'5ZA%wh{wOONg3f;[P{6洃nN "?i3-[wA40 AZ(d4P .$Hިos>EhAN`-u#הV[dpP-0E*6$ˠ\ʉ-J'Ps Ns@WPęA$:5^%;1 T@W/>K*s-lpخk=_)ܯ2oNb; X943uf[0+^׆aQ%}oMW|=ӛq]t 7FMڐ&m&;WdCD $yDWsI-0foe:M+I"=*&$4 $E: Ӳ;0Ô)NgM@c&&hZXwH#ܤjv?uSG uq%11nvجCba4LuLXLi@7쾷#ӳy>SG+ c\$_y\nw#HLN5PCH3d@tEѪgTe Vʻ9TLB[W@ 2/I LTimck%?ubjH5S<%-ij1Ki]Mc `폢 $bNUehI03KQ&}@ Hw& *UIj5mASXbiMB:_WyMټY.n6^.&-+A!2"SzTo`h)ulǥEi>D&"F'No ZD q e:f)~SPf|D &!Ly )&5[sblJp˜0DLX-{*w@$MBkH@v3@U̳ʰ6\Qd >oAI%7^D陞<#4.$_Uk/cA݁?upZ+48&*1'xiߤ-bikHw IX$MN0h u D_4Z`h&I 3dx391Q']|3ou^_UCAj) [ =Ţ6(:j{-dn PK:j NPȬL@.p2Xv&#]=Dyw$ 5|_Ά~_$aXaQ00~#q\^d̟3PKO x[xę^p[81/ ܟB[CzOWcYb,@ ^NJ)SR#]-ߕI. -^3LRp0 f뷗Ys84#yq$J@H;-#n""9A&3`*@~P ^TJLT$F՘] Ly|DyZfce-#+]]ՁXKbݐ O YA :(AIpM;;@ 1&=L1$uZ<_PlGL{~*lWٜ<3opy0낺dvF`IXhlD~n\A '($L28> TmE7Y#3H %4Y&+$o 81o#UW>0`X@@pG $TQH;@]_um?:4J>iV!%& b(`Tj; H6vH:I!ƟIq&S@$t>B)ۺ-5Mhs&KOϢ`ұ@C A-ȊY>X2>RMD =H6cAD MeD&8ov7pbN+%`&&.IaG&1XrTYCB"gW9н?l:>[;ć? [Me䙟y IIH4)t4@ 8AE5EȍWu8lC x >(CF;s[j|ve6zx;F>03XX1|W@|C[5nI vZwS534l$,Ё КM"ʝ-St^Sݔ}Dktch Yi.dh"gV$w~@.{ct.1an+uQUЂj)5y/`$ 7F> t4 m(+/ juZahYW>@PdG({ĩ+@آK`ŷᨈ2*P Cex@ `0ﺈЩK+L ?Qo[-;iX$ Ai{.FbA ?Ïsщnf ҼG-yyd0*@eC$7ItT#ӺE=@ F 7\<9c VZF.~3}_8Qv6>%\RWGTdQ[) Ϫ @I_}$ &nnA'J TmiNN M:DM'M.?0ßv%1 ŊN8b<16kF r[V#T Ke"DzhP";XB<!BѤ0mKۊ$^KH@2.TD؀%UKzbxĹT3DhƓ7|;M mxP 1Ph74@>Z$ t/wf +3b E"m(4tm!ĞO(ǚDe>"D[쟦G=1Efv 2|\np.FMihd&78_J$Tt&`hq7 E75?RC7Tj,A3 ŵHU?ui17YMp DPld-mE`7vrns4_Y c3\H 3c8=^V&d\Z >?Y`}[;*~}ªqF{Q0$UM(kjUqJm*]T"*0*L }'P1<-75H*P[ʞl&]~5wU4I*hZk)(0Z#~7MkGtK}V741+"]hn'KE\.Y\r{o>ܦ__(#}lxQ ;L JDTЈXTHʙBd}fgjlD}1^`OAd$X\(kW3M vAMtMhHL B%Đ"dب'wZE^ZIQr87ˌ:3&!ܾ+<:`W8֧{ -%hTAPijID &쨑 Z{}iTMӲuj-i`&7'lZx(|hDLxO8;0ֶ} uN&nvȐ!q I#%]N23?na!CEKL8X$$r5 rЍUQD *1WDlm)&.it4uϒEV4ڀ9l\&%/~Ltl>88HQNFֺg  ؇h$1>c:c+CuAZW+]0̗>˄.Bfp,$[~&${.:i'C h\1C˛b"sa&+q]nw14Efnj6;$ РjZmdX D@"^/lci]LW !." |gY<^`c&3q*I/tn3< w3  prh= p~d9NoZחb=7 W#K `c׺gV`Z"& _xW_鹜Ln`)As/9weOyl]]SX\bG4*$6RT&6O q1IY"?E6h@7-0AnSl <Σ^}$$KgvS-l#pyQe;PDbl/?DMjL(=j)PAԚd\R\;L 3fNy;L~-=:RuLwbkTZ`MG.Vc rOwe&e׸>אEVI9 !o>ʹ|׆M߀Ll:&S7ՇfHo}> MM =Mj ao YHTKKf@r`j{xej5jZl$u& M O!\l?Z%u  f 1q|v4\eI +ixQ#P'p:H!Ii@j D~cuLˠ4"MHRw\`v# +AD];)i+eAMi aHEpA(LST~\\ N4Yp3^#e6 l.tT׾|1/XʷV!5,X~g<<-[ b1ϐ$ZԲ'?l>zD'&K&p eq0oB4hL+< .ԺOe-bi cKG\-='t&52ܟT@D4J"\`JЗ 0@Q.&ԙ_Plf44SG^lz^Q73XTIn(@p{+5ڃP4K9cH-"RiQs @ 22(`۝?E$Vޞ=SU\0k 1HmMMX$ح\.@ĆMHnDȨ&4pbw-&((*kEK ZX`¤A4A0<H)u$ D%h@;"82 uYjH@}$8\nqH4i EUh9$/A"L)t?(3D@>ʃfIm4;UۄH }wa.=SG@sWH"ft[&"\$0+nc~\OC[ߚ5 enz{>V{zf4as`Ui:]2jʃu HwYSR$@$(qhP:Aڨr A#@p!c@8ɈTmS7,/Iu<Đ,Ih%&[neƫΣIA]ca #Stte_9] 2id@ i3@6|q_I2g{7D$Zf ?[eq ]:Y`&;I؈L)u`uؙ~&~53}bzqZ>AR}8},j$+DaӍk & |'q6Aw[&tz]#b~ʰ|w6ˠL_@'|1LQfp3 V ~XilP"\E l`ŏE 0`r-M'+n`t)Nq$e  tM-u4һ$~H>o1ϜLW0{ 7K恠TB%DICdEQrbb V64GkPHDeqdbyy[np .rw+͔L:/CEՂI N _X$5 hjfTII$TV A'z(Hk%xN )ѤA7H8Q6CҶᇤA]bi5h&"9Ѥ1Z8dh%r.= \.X+cp7 JBcplsx-'˺ysΗ&qQl-dVDMjqr:\A1%qvf,,]'sAFMNR*J.\c)Lh]3GNs5H Ι2dAUIdQC ;K@j 4,@"O G& (?tގ10q ynd1yl~WѲH _mfqs3. %xikc 4EZ4Z \!QQ>RNl4G%vS(DJ Goz=_$q1^qhw=2(_ ~$uaֆ4~Y>6Z`:](&\t^ƨ$Z:`A$h9KKIS.&],ai\QP  $m QLߪ'~v{ aw/~c_ؠwŸ_ 1t&qpv#CHEEM()O39aa`|BbÙKN\=Bd^T"}AYs݈66ZV%tNZV*\l8O.sG, eZ>kD[=qIiM7uPLjCb SjmZ C`DŦ;tTE@\3&뻔91~g~'Dnm70 )ekkgqq:U99m*?M]܃hu?3[JCީoOŗ9n%N^V(k~.3v Kp֕pk&I.6H Q2aSOT" }@v-tD*&+;$ EұCD"~DzD"i~t v0q}^oLyQ {ӆf\At6Hv]F9b)Cq1ZZl ]?3>aQ/v.$]7(a 5h|4-Q 'Sg0 qԎt>tHp'dd:*`.*K@ͻ\*IRm&k!yV oV8@&M-1 Z[I-b?˜]d98~h!rf=FPv\B.6}+ !qPS Њ QqU&If)LpAڂIQ ԦnxIh/lT֗Ah\!D6}~geM tMY $H6`4#n# 0%qLUMO*& ޶Uj)FeZA ec1&9_]^*߆klG0c9Qmg 1GU~J`S&u  WhPuG~gN߲.aU6m؍mno:`q+xL1pKdA~~Ğ+Xyadߘ/kiQ6ɚXb+ ]71E'/76\4}TY@ "[@;&U AF Qv\-VsJMB@I2 PV$=IOu:DV%L%AC~a@ Yi`V@1G쩗yK">`C}?>"IkMYsdalhfM2n2"}T1eA. udT\ 30vQII_ʬawDiG%\R1D`}DM (@"\Eͭ+BHtЭLwSh(k껽5X6bָgen!g-Cv_.~m5S`j5ŌV|:^gR5DP,ʴ`89?D" J{$y]`Ahb~ta}G~"u oV30! ״]/xǫxxcl3CC@Z3P+3tCYJ5]sq͕bk X]Dyt6\,UFd?LM}*ɒgx0ң "*DAۋ(;ͪM)TA] j$޲ 6jEM=%B'XA 8БEQӼU@.0i odPhHV-1Y*i:ÿ*;H'Q%Q.跉{ Z>d*xk[|X[bu@-5M!6lA;Tj6<"3*2A"]!^ iĒHlD&>jdXѝ5>e~7˖-.-(̜' flە0ԺʀYZhje4Z\E6qev$&mrR",dyQ^y S0*APDR'19 ZwM537'u,,9l';;=8^pA BzɁ?[-$&\\HF"8\A  ZbX!h L{„ޫ%ERѫ8R&b,e1$GLlnDZTN'}dz6|#mbn+zg(rx؍y1]is.!AܢvS@5bJ0bʤ8wQ0b? -~[QlR+THY I$T} `0؊Z]Dl b`}bR,T(ЁȺd$^q y3Fo J|. FO\$Gk6mP{l9(Rk@z) Ϙ?HN7$بMM bI#TPUԪZt~(Qމ]h=IL˙f*Ewh@` v߅}o^:/A̻wy?>)cdO*B<,J&"gHN~HH7^!~ܠ )ۅGkr*aP0Z+ k'&a>Tj#s`Zҽ?u7Wu6ds'$nj3dMӪ|",7ɃNk7t⼼: EEt"ЩU=*YoX 8MkU=ui&PW@p""H:G_ zĬ{/ѱ2N;M $rWPuTcWIpMqb`Q.\!IEPX$7MkAb H0d2 Zc$>`~#Y O6Zxxq ]d hiu9$ˍi:*dmCT!?uh/U埛ͳS>:O}[2'@0!pW~2w9+#0?>8, &eώ|N2 pKAOPHBǴYiDA3`']U'P?IROu&a0k1E\pJpǚ,7RMjAv;H"{Iyu$1dO/n8#-~O0\|"y.qp$MŤmT4 ͽ%j~KXMWCG&(u)k`a4^X7.T # D.A o~M>; n>v16 NҺc(|G ⺗[|FfD4EljD hZC0[4fuHtnպO*q&*i~O7־cGYb0wm@y]]dM#k 8֒{$6#M.k'n g= g+VEp\mq'"*R ZNK?:焺.R>2?*,F!o6w|nm.̽FdZLpmjJ ;*$H "ҁB沚$R̸HXEE8Q4$6-ʀ h; ce汾X-1t#J5 Ɉ 0ڛ AS]@쵤 @-C?O`tA`x؃;\"fE%2$ŏ+sul'1~Ouox+?)fanc sbh$-gbf$H4iJf_{<3q4\_Kĉ=֜0y@YNתIodlhlO} ͫk Z|ɔAikۘjp E1prYq+LeP( tHhe96Z(%Z@I5 I"q&1Zk1.4޵@o#`aNIYܤ[# vr-dẦ.AqH$8'SeCS51h X2ODE:@kAYf, wKhaPIpn2 IuP>\g:Mن 1dEoS%v}Ov?dm ҄j\| "SeA LJ@,oS #'S\Ozi-Adp~0B \&t\Y^3u6H"W74F1` ˆ.ݿKH= &M[3>yi'-i1QDC w @>ZFNS0%K@-e Ԏ.3dI:)'P o3E"1*.+Ln TfSp=Y n{-1$gq[I~ y i+|c],L@ ׄ ƯI;DD&xesuB;| M3?ֱӂLl fჍ'4eᚙ5Os{BxEďպeTU\L*P@քZv@$H$ltIh+M~ʓ{Gu jH*dl-` \ wd]T ]Z!D?EK:h VƠ&w)\H0 " CMEg[|ֈ`kdK&73\( eE¼7|ݡLeϖn;0U@/0 kd$Z-TL֤.\'cc|1%ۯk~ bɳ5]i Vw7&\keƓF)TSh)}$:OETD"-E$>H+`8TJhM~ ].CudEI >]"] `HC7"lMC_cܤ5 ЄT2Bi`e[eA$v\{icW fAM;*) Tܕ> ft`Ij0UQ/Ne;V <[T3;Q&ʜ$b}|ΧsD\iʡ;3RIA(p"Pa\L#xVi.77SvIaGPpO0> ; /K|C:W2%|14As(12}(SR\=EXl)ZCI#y_gr ?3xO1> ~3FUPp7&w!댍[I`vFR'Vqw>..;("I#T"'hY&ێRbb x*XQs4 kI "LDm&EG At8[CEdpTDNՉTJ iHI48h>^Pi4CZ@H3Qz5ds %u쿀c .yNe L*@A%ȑ~xޒ MV9PI)QM"=T U"ZY,uqM2@ 9#2Ylo#P\lc|jGYL<r| k@WU¼eJfEqCюi~IN*Ϋ2ye:f@(˾w߲5 bo,m$4KI^TkϺ@6+^P'I$*om@S2`С 4!.  eϔ;-L3PD,n Oulk-8xX5d:i:Abxx[',Gb|LP2Er23Wg;*. sA6ißX8.vzgK9\ E~'e1ѲsY|a-|c:n#IA 4ɽt$çu45 1Z A7L~!A2Gb01=D4ĕo5A(~RODFf6Kޫ#:L;ol(2*h\Lqq>`shw&k (t8&{(KDvUGS--G{UwMa4-+HvIY"?Kgq$ fNո /d6>G?uXR-&NCC]Cc?/xf+]c+xxgo7tԯ.*2pȃcej1&@=LɝYbEhSP1ܠECQRYcS$Sw -X3QImHLW/x-]Sg9lLHCL.5RMQ?K-2AC.wzCuqʿ/da9/QUyq~#0I!\b?+%[K:"+ux]gٶ◘W9\7P̷{IJ9ll0N# LzLΪI$D/Wc`e.i_' _۽7\l\4|ִaei,-BqOysD@.0CMD{J 4HM{7QI&0H4 &kKfSh#n*i401 q_\-cpZxV_ H~o> _ O[+ul_-E[ҷ%nY=M|ˈ( Z\dZiZ- HabQ;UKiNhuTט\x-$z.D-"7Xu1oU"NF4ӽKf+&d k@!"RR5 LF{/ΑI3gKN)sE*9K $o$6T >sm֪G;J [҇t-eұ+ Mu a&yQ3?LBih$ ClsUh8PM5ګ\d~31h/,&u1 $z,2u*Ilۤ[ H2 lPL`׵1x_̮0|Xv@1>aMW&>+p݄pYeb& V.$'^*A2h\&"gLԓeCKp.nguaa5D6$z$˛EВ¦`$_U%͔1~yߔc?~!uKi6JvdfinBO]جWI$ 5( #)2ID S&"n 'xlH2Xa8XLnS wPR-uO?Ӻoyεf)勋F+Adrϋ1=.2iÀ eGޟ =јpWK#/rNf.HuVam9:$i4E܍$G%F&h=UHI7Th?DAfE* ܧ1ˠ .0E IvO!~>0. cUͦZZ.,.1A)E҉T]~bu_.ӲTnvu)BK.$Vd;4Ď4J5*V@krDS5Zyd.\lq"" K`ǪLTDwDlA(0$`,+',fd iR r\Ee V( -dv P>MxlERA6Gr$n 0tFPZ($@-,S@hGn:H!r``|f0nCx^@Q; 9g<8w손b'$n 18z.O `H+',u4Q( lI B#ce8b~ 4EoI!va["ox3 \rxMq"/[-#!1ζN> q qZv  a›Z}R~IP"`L2C' 7inGP)Ce4MF*tAiQCOȰM[p.q`r \"OU&SUo 1OArGXZAaMtG"f$(0  'n0D:@V kh~#iP`E]iIӦ-\Z]yFgx]?BM,:&$S0{,i:\`:DmN%Ēd|@J z4R+\|c.qU}+3/v#n}DB(8D EӪ].:x qQ gj IipC8H2 j@d--%=`,ImaB\f>$WelXp RANt17Q@"v27'@yMrxS'^ܦGe:\\ e$L:F €0b#M"}V-' ?LHY>cnV@2*/ S>Pc3& < j@dh@oʋfoU$꓈H3Si4T R@ &1T2PFѨTOD$zb'{ǚ $iIK`PP GefMs27D}TI of`"4i" - $ޝh" $&?,gk(]);y{RIuRo‹dCL@>`7&&݆Z+ `6 DMe44T9#PwAs%O*I@ & tOΌ|L9f5Oqg?>q˝'E6s-ng1i\8 7q:믇\78@ݨG&aS[Qu6Ҩ0"8u@ ><< rR"5Kj pt$KUpR@&dOhcKdiLOpꋺd^aD q469AySHid$)h8@\H"^MRi]눿Zb/Q,Lj%Kui= oOuga\AD4_ 0ָ$V船Z@$O#q;w@[*eVXZEdD$suxHp#M|Cq+2'oTC@陚gÞ*&m|'f1Zcn}8ol8R\s"(` 1X)WԪL ^1 af(" "@)\›kymEA=올:'hb ֨lC M%Β/dĺ " nA t ]2a~l-*VJ#70!״( itm]δgq0tKDC Kf߅#P&GK榻ڦ@ ) ia3IYKv ΢ki7N ĎuP:L4H6KhQ44eKPZg}㜗[eFdeq'qQCe~2`QWd>K,W_m8P$ w!ԙ^VUqql֚{3fi8aETB?Z.pwFL $y\$i3u PdH T >`C|2&;h3ZBČInk\.'t츋`$V*o)լPT"fc$6+0 KHsŒĶc }3* GnYMäһΣc$44R YuE&3t73C@A3A"m4 =o)Mbw~- DU_KbfB ޜ$"k=[íʪ1<8!&Iީ6vAiv4gDVę@oTD;! >$1`U5sCiZ3@OGSbO2(X֝G4"~Z !6#Re 1hCe$B}MR'adh,$X-wLE vH%Ή }ȒN BR[2tR$T> 4{"֚DiM֟@:& $x ~SId8 ZQ3<0@VL'?YSb}+fSd0xcIshe7d2 yd _t/ -qrAEDPA뱓ᇜystLA]wi6MI^P(iz$ l79_DU V1%$áV K1T#OQqQœi_@7"Uމ2Z o\,&q MDNܨ4-%H<D Ey=fEa,q.@DVA\p|ѥ6$![YRbF jkMI v E(DmNcy6#t;A]7*w piu&}wĿ?u L[cYLc_DBxI-',|L'~;yuo4\AI?b=PbaNM)QL¨ DE˓#'W\pZB6vP؋$!b";ʍeXʉ".z)KC]:A3'DATDlw_hؤ_V &BH3@6{f[yKMGdyIUe``Rph`; P\@✋.G 5n\Wd@ZA T_uLǸ #L䤑n^e@ )CI1䨈0HG(U!U;M n ߺA AK1&H2x%ᘖ$l{.S܀8(I#R 5dik>DӨYZ\U JU'6 եi:" Su^pؠ^LK=T+@ډn8D]=#1us{0v0Lfq0]q$NYutn[tgfp1Zap2<_='UY~cjd$O0&k &F갭?;¯GS8 'i D=#2 &-?r ~lDԛKLI@sL`EA .bO5Y&pk&T^c.Yqi-`>N@A hچM$!T;-8 RI1Y2H /1z`@09V _H~t %Mh`8:E %)&Guѣc-XV,#"O*jTCI3[*H% ۲I<"f*`e1NC=^(|TDN{|XhﺛFCau#hr tiϢ LdҔQ^Z2 VPܮ\l& q4^FgI;mYBz\g8ؕID o1UiDP3ߕA$E;3= iA7Ih$<ňN0MTX'H-͐ Mf )NJY{{*`)±*IfH$6M5ˢ8+Zd2ַ67!& Pvۺi;U- Q_:S V jC%D837M DqHF*Nh,"nske9Geޥprxk^]ax_>,Ow|>oT6]9X0i4Dދ7,4SCb$6bp!4$j`A$}4a\ Qhp"Lgeɧ 2ׅLR6TF"vH0$LEʛ*[} n0<iBE]ed j=ݢ炠IZwAhT@$$4m@*`S:I`ʚrOd"!"=HIxT *<Ttlu ~ &7b.ZG hhH+2%Qyn5`vYf͓*q6.kF8(0Eh^KmE>̉ VfQ@9 ̑Kʄ9.kEj;wM"{p{.M;v*+I\cH SV OwJ˝-A&nb`P" $ɢ^ ^dMmχ w½g3Χgp > lcJ=3xʒ0i;C@2@iߎL4VE* sJQ!$_uIH7A0XY"j"- b ԰Q"go4bLKٺ箼88LiU03{'^v`v=I*uGFOU Ы6I7$LAk FFU7KDPDr]Sg0fpkG$ruN=G'hn&]Z4/4Z~6n壍`$Z@W`c "*ijzCAv@ݔH@ )Yl ITyh n9\8XN-sN#4bcG8̮?4T ){]Dx6Q鉞`Ĕ]M+T O/:+Vb+$H5287+R?!kTc7*t:M{(UMN"@7rI&/{ <I0@iY(7A55Zn_o?9FeP]'E`~|-MC2b*~$2@"I@uP4{ 5qylj>vn\3f P]67Q$s DX@}S,; DU؛>c Xbf V3Z*DeBwB&'۔П,[:AuAi&l+D#Ph5ҢGj LKҁ m $e0 5M|%REI2Pn>{áh k@ ΨY AqBa!.nrK@$Z y M} vSH-G˰u4\ cG q!8ɘ@ ͷXA䐒fp46\nfxN%! D9 Pebȅ+bQk ]r3 yhN,a8;z,.4*0]"yB *5-vHgN̿*28-F@RxBn0f}.\ џb3E[^ IP&ʁf)CdL-?U1LCoPy\ة&(>| ^'k8l0AI/>9|6noS1  w 8R&&aZ@09 +-{Zf֛,sLLjSIf1G&6(H'YN![ IPZ&O~ Ն@.lO+s dD&Yi h?PJOD8t, !EZű zV^v+cI 4s%)cToH @".$dqBfӨ&OuD;>aLi&;D'q4" PiA&he8O28 (-,텻ئ}^Il  x K6.2`$c0"$jBr j$hq3CdDM'|*HhR{,@D( :IZ{sFqhgP*L=DT}i J&5k>&`ԭc*Ge4V2LSd ֻvۛo Zq&YL A_|G' X1G P8"EǦ]z'įt.ޞt?1:)6_#d;v2҈?+xc B0wT!k 8̚9~&xGgN0!#bT(BbO* 4Q-q4$4ni3H@RE* j+ϦpUI$zr>PjQ2 DIޜ q-nq2iKؓ3ʃdU6tVPX.Mq}%{* $\1GH#NyʡBy%0 1ϲkˑO,UXX T55 i$Q qs]Dj${CE. މluV.#̮c԰0qpyw6,le\Ƽ7ix g2P0 9H¯ } v3h11}Va"~DQ~u|7 _sXy>6_ LqsX[.T ,8A]40?euei",&p)AO$R9l@EG" Oשdq:F>6g5-:~kal&t{ zpe€O;.C8C.);h7W){=3,ZC^"]x/~v1 qq"K ?dMLZ#e {-MH(N$UR\]$wP6T3-$w`Z܏红-;n)dyO);ʜn ʤE䛨ygh@AhMLANW$\"-[lWqt|Ryx c8aIh4 *&`)@% ^J#IDVoK$~EM@*T|DsTΧ}< IӺ) Zek80K> Yp6<TǜYÐ&cFM"C"Q%;˨dy1 $r0uI&H rxY\ F`bNñuO,ơ$5%VA.t,+"(f*[F  :'P8H 15H0y7Ty l4N,"1kLy\/A#M8KX&hf?+ V26G ~+nMth$Ϫ$cxDH:RR 5iQ4":Iъ]y;61#E v6#MV\6[6?UNbݐ~ E63q 99\WT+KD"CA3"k޵Hl [pLsY_TK`f]FttЙ* Ih$Vd"( [rg-t]CMŖgTR LCk%i,1ʵlCMCbcQhZ,;It#4`;@H$iI:e ߲+>X&@2S;S2p4#3Cd:Ge#uA0 vH.17C1uI&"&@<k${쩆VƦWw":Nؠny f5p@&zMMf-Sc*hk i!A;E2 LS ؂8 8i=.ak{lKCZ& !6氽 s#ղe3_l=NS-;^#\@# 49ZGأDTA72$(4V AQ4FPA&I"&VReO+.3xtXU%jk u }+VM!h>c콜["2:q~JIc&81  dDq<_7!L`afc sOpBэq#TBTv_Gul\#Z\[L e8I1)5m{ 4{QE D2 bu .nI`E% G 9!>Qe~Z^5$rK$/Ο=HD-$Le L`~VI&= ֲLELmD娂R|3t_[e2r/v71pX2/ .-1AAD&'5?{ R(A4QX.Lw;G iH6DWh$(htGKR-+xQE~xTZum3m䘏n&#6 -isO%Z`j~ A>Q{]K$I&d )-DaE @ǎ}OyԲDLh 0hag⿊:y7-L 2`r$l;( cK{EI Ժ:4߄yhLT$h``'<Ûxs6.y$y|SI1֧TWd}^Q~9I6 8[a7 Wjq_Cv)E8:G(QBM;' 顡>kAh'{b47BhL=@1"6cM):oM㘸/.(HDIc/`j3+sI,L>M' Ӓj$|Lf̾Yˆ754T8֠B5A2)'WwzGVtsY'il"oke:>nT$h!l+MdI0keFw°$V(騾ʙjL@"6NٱiT^!A.29QmA &"~ʉpẗcIߨyq(֦. !vrl.gdągaփ0L$BMJ *,O j<ោ5C,C0/}} oat^3u G5ظPi~ ڳYVHn*^⊝4"ۭH&xÙ0,3a~_cψ| g:Mvʼn# ޠUdg\ M gkC4܆0n֟3aF/5LjV HY4l'A>D"+T!_(E 3pG4**L""Z@;PQH";hldm-2a &`^iHU մ3co+L0AĮ{Xxm- [?u';L'!j@+w7 ;" &ET(TD(HRQ`L* u8T I4 (l)xD&nM9@1F&P1+N`t4]轟 L-:׃H@O &jPUx9X9qY. M[ìK;;.@ppi$6'M)u󱝉7Q .2j}; 6P"=0 &k.ThPi?ul6LA}z!:DpnD@503Uj@yZSGڪ5 ߷ɤ*$"e&a/$ u"{ TDA b yQi_:CṌ@H_!]CyspfNH0 5oas/zӱC0%ՃTLƑ Ca5 Va :E? N %>1̰5s0Ax+~!gzC8h: u : $Pd1')v`${9E@*CZ 7H?U4ÄDˑst!`A\0XXHuu]$z~\E pRfU0=,M+[H tI"0!$XzdnLC2"$,KL,<\wc;Kܕx6kf3w\cpW `I#[I"I&M'}Ȋؚ~6(.иHM88LFDz{lu+oe@s;Ty5)*@#G2f 2omS6aLhv&6 0 $㌯GLHC@$мfuއq0 Rg MWx^7Oob37KE L_O/yOQf_#?;N`W|]C~v ḬKmC~h)XEwJ ot5]V%DҊ&5"iqN  (xT52iEST>ZĠY;CH SBtkʌi\dH!Gbt4 Ҥ6H$xYT bf0J2 ?bce2xmܕ~,#SD W$HT JKBw60 U)^G)p-&M6kA#q<)$t$T@*]$"VHx[⯉s1V#`@1ەy L gab{NlO4Y+Mhl$WIYF…l`V6XB 0no#Գr 0Ѹ+C -~PwA4.`[Z"<#lwĹHJ ]!=|G[@R%ȠGD5J ~ʠ",B`/PeR%/q#깒&wpps/b;YqI35\;* ]5+LA3&tjf|խhHt7.[[)ӀHIR4Z }F,B>& =HۺtsP$;IoH rG51FIFKS .QDNi;U2uTGފMbm&@65G7iUHeHwӌ +d+@dō5 'wAڈoʽHP2֍(Q$V-dF6*C[Y&TVPl**Dދ$yDD8r蟨UZK^ Cp5fl#_P2Q\]ǘ\sC3EDoAuQE)1LEpǿE0˗[G/|3ľ4k݇\C~a6n}9κHN9|Lcŏi lE?|PvPD췧vm7]캻~@M!n)CqzfPbZ#I_>c\iMQu ĪHC^(I'5؊X)yxL~<5X4Zϲ$ 4 R"4Wr;bf7]w)i18I]r^zzY&Ԧʡql\x`$v_CL1_108gbFx¾Ru|w7,5i(895M<5 T@>Z0A .6Iu(dG h Q' "fGp DuTPdګ =\ I)?$ F d4@M%AiO~Z L, &>-@.Q;Jm$~1oЀ{;zH~T` *zz8&{ FSv檉=L֊ITfkʌV+[L ]WS0 !W*[)kM*?*~pB1<*;RLQ6$1OU Z]!P[G[ʐrnIPA RUH\M (ӤD"[\|V9Vqq63lIƘ%[dQZV 7҅{T5 0DLbUssZSQ`wF0H؆)@ :^ $$5VU7R@' yg ~kZ@\O,ʚ|]_5˻ iL.9ΒLJ~LspQ:et3y\iSI$ 2 5ވq yl@NP}/b|J?!\֍^wl<|*ΏP1\p<&/fS("H+!BP6*R1"/tA$~Ww+ΞOqҤ74c;}M"2H0=yT2b6ZI{|"uI\X8G82%-m$W2cZB %M@&7+/hM&fd%BHnH1PM͂RZwDj3^ɤ0COځEĶ)r9yTy|)pgñ MI'##}_3d簈%4)_ 4}kl[SΖO͚_{~Ѱ2s#^+n9ڪI1>`._FյTf"Dr@A!_I>i hw& m!%đh4RD{9D;6vQ.gP*-06t]:c2yN'F)}yA紨5+q{4^@&(OjқS1N; ˠE04)]υr |~f_b>isc/E{uThfyvQvtL"q#MB+2f4Y\  -7\@Hh^'{L=<6P%H@pA| .G5F Ku7<&c,#N&#tA$*PG wA$S-ݔ[n>^V֊GYEn7DoٚXMO)Z{nAM#P&\|kKHxpSIZd ڗ)ńi.ڰ@UL ꦈh?-TfאI)T645 ,]+F53A "ȭIhjC"MDT|ӫN&uEʜ-بUH"$]6"`X-X 5 $}/pbW7$dDkFn(@Vt#SCoA4%jd*-¿oPGSZMMh3c[Hꆉ QuIc$ud):f?+aH&.#!`Q$)'e-u[ҀHMdJ ):A*L'%6gAmLmD !)0B0'3~9~oo̷ 6;`M^3<bPAsAE5]TI Iuaq" Az-:*e L,A"Kp3]]PǿD,+N&ۮ!R'ZT(dlg%<|7H_|3: d CfEş3xep!x`5_tݦA-$/ue̳ v#@ '}7t'Zyi3 ج-k)z!o|L'I>c,VgbbGo}pːrL\xn7(*/ֲ<,M=XC+,h:Ļ˄un1p;BZVRA$V`.i. O %#O(2i@`5[fdVEwShiH(hAcF?Ee{(/"606 xm{dVKd6Ocs/70p0G=c515߈&\jWAX'W`$}׭|7zkeߊܦ ٣+~qcA  ֞4(6Y& PꈽP߹uM M!NֲR  &ZL!$AJ Q@' .mxC+.O7eI2S|A4k^6P:|Dp,f(bt[c<? ޢ n)@k'h|[ ܮw(=f"E[qyY#ViEwlw@WDra0⽬_⿃=cŸGy.[XX÷HؘAt&Uv*D*sElAQյ 6PZ sAuu)?pS_jH\H1K+ 'Y+|o>=+ bb5ΉjWf.6IyҊDA(@`@>]1d`{ ;?Q5^W>L`NfK7 5=)̻ٗ*7| #S.Kn]C fۯwx^pqsxΦ+ IM@ȍ.&$íE3^&`6%d3S+#QU,6q36Dj} h 9P(3BbSO;? bK`\M%e%{4bꂑEdUPF6\2[\ު.~gt+f_Il]RdlkXtrD,8`DFQ$ DB| ʦ H-32b"xO"-RL e@=T z{ǢM\]fr8^gM..j\bt̃Dz>\ x¢B $@4+pƀn`D}R0HJIy._ީ͈@i<$ls9wLR{*$ۺ uI5ZcCj{/[guvbf~S5a0KEɀll9.-T40K `)AllZH(UD d3Kla㼭:HYLB Hv$V򵠹 $IApk ํSIVH!S%Uq֪.10wSޟh3ZJ (f{Wqxd {{,[iY L^Q0AT&D;FbsYaLA_%bscе]xIJokQQ (l-ktB@)+la.Ae|i+FR<^P@d}$Ʃ;֊$d ֔ƃ ّ((8IM 7Q#nm ({Y@OrX~^6+ Z\.?r8y88K^Mu25V{wiP 8aUm}7(P!GsZG0 E,[O4)5YZ;Dr!h_uˁxcFM3Y\\(n zTCoS@[D h1[dV w1xQ$E`@d_C@ti2`Xm6آ!]ZPd2'T(Yk \ ipm^`VI1m*$4G7vQb'z\$u8(@@I0 h6nV XRTMㄓJDɒx0'I-3ZE5A j zB4@g`ڊ^2o):i$ZK| AwS*"t Z ׽OÀ b9guS5n N|`HU@vLSB@p߅xg}cQd3; L4 %y9̮.Wf=$&K^]:Z&دc&xozf33.c`{Ş>m'Rg`qqC Qb jByic*AQLTL/!bCV_ tI pBboC7@J~H 1mf$q RHPmک]Axz av7DH5]l>W0&W]ԽfvH &@.UG64Q1$-b<8"VK?A=Ȏ; 2NjHmCLYR@ m@` Aִ@ .0 VAOEumxc!9pHUˌqzhau3{4.cZ+qXld n@KH5ltL!!΀L*)k5K]seSI+YE0r6bx14b_m$m_I|qIL+$SD0H'0L鼈7H*Z $A)>Ck&o>2DP0!-c/|YJsg 3baLĴSZ],;XX i<C}WvY?WFI6^׆F9c=_|XQ_?]&`L~WP羓Id d`>nVZ̬6\F 4vJ9khDL]dZzGVdzNs/Y\ f)p0j:A2$, ki.KQO0tD]vACjxܠ]ɅZ\ 2:\.qa  }-pܢ,A] IPmʈ-hQ:EV!df$4DCDUb8-H\>'1AcU{I&ebBK+Z ]0v}\8l u\<6Rޫ (d6&[Țtk5GNqT />|S]W;ղd 8&>ɯ`4'|6&0Ik WJADI?Gmɺ *4SdT{iÒ2 ePvC`:^e$y$u&-rG[ԭ`?9Xnt DӬ6D/> |$|T39d;Z#;Ɵk6.&0 !|Xgٍ~s  p6(yA4&J=i0Kv";d4TG ŌEán8S9ʳ-~A\< f0u긂M#NQ3?QIH86n1#eL]ܖ_#~k0醵Sf51TņAN#!"(\\9sCDy^cc`tchqq(-'01F[{g[CYq|, v &Q{" DTܥ买H4rY'c[@,Vb&d;*;UuF;BE!Ԑxio~5$hQcK1ZB ,O!$[cڊq=~]3+72}b/$)32"&U4ˁ p$_FRH5"3&~ŅOU9׊7ZH30/R:qPNLœHqX@f#p}=[g\~G|1ϛ-$& ~$[ucaf+m#n6_Ø !+ޫр5H#P(PMDO\nۈa/co+ry|1 9 )Ac~ P6;T?6&]H4 ӦA?@fa_<억 8+.#PM)$^A16&ȍ2-E[y oA]֓A4C)a+G"AmBK lRO)l =@l eBX]#W>;x[?gqNkۋtA#I$W}$ul\ 8fxq;?=kH-t *`oCk1 )-#" >[vD3K0O>|w +;6apsq DJ>*񯌳k/9Bkge&3Zӄ 'ZGe'\l m\_|0,x\p֒t4 :sdOtBz D7A!ީhCFD3J*2)t8P$wL^Yu"Zif%fuL33*H2+CmЯ@ =9g`-k?͏I3MvN#Y"`ϼ4H%EjBdVBC2=+x֍>Y\Q(Uq/d\-H/f<3xῧ;S٭R ~ ~KY| -ٱMT!8EE$J]!-.i(d@m@h\4!cHH"7R=yH29%%!ra0åQu0m(A7Q=KA%U GdΓ -$ho<,}"HH&%GPmo+d[$WZAhB4  Liti1ˈ&}@iejpfÀ5v}~9_ nG^48` 0` |s&i;.Vk"ƄtknVۄWyAw `D@,LNj }oEPGǼ*&>4SD /_l_+0^;ƧO GRen31[  >oV3P~T$A63+.H&DQ-vC^d[/Oxx0~c9N c?3v&3˜LR 2"n';9SǏ)˵^|A&W/8pl ؚY4AIHZ`G z A3ɲgw39&a^G"Gz(+ʛ.0`eq0ۗvMu#0k. -1MDlH&"]"~V&tPnCn)اLJTbI-h5p"VICYLֆީ4O陎0 7ccb85eV3,lk-8xd$H .a5V6!Wq=RI l9c""(DhTS%z$ߔE PE@#dVCL3zr$"Qړ)as`WLElyKIcb7{C &)Nʗ7z)vNۥ1(i5Bc'T&*ٚoq`n{dݒ=Cްn>,&部P Gb(GY&]3M*p 'N5i@Z lHvQ$R",WoƒIЖ`O?QXy {0@5{1CiZ LRL* %Ǒވ- @0;ː1$Mj KȄw>7lOh b=7gp|2;K[$a|YauD3V> ~7 Y,$hSBEl㢵SI?xLИ(]&NĠ߲@pcdj XBq\l ;Y?HC;d5R}YiҿASDr7 /06\>u]VzT;)s8'Vj7stmH 75OiLj$6Sf!쉴\V0Hnz.L*by\!"  :(6B- 4+&j׃h)0d^K00qFeK-Я1s޵Y4@"L"I1 tw6#TH Yey*;lbydP4ďBh h?E,s9̴1pZ@4"}Sxgw7ī1\z8 @ 1P 5RA#x"(}ñ\wxž z?Q#vsfZ@´ d h~3:LVJ\dfI$[W`dSnhi L.9Qy@ATVPRѽUOeiD )rZMC]-T^yM.+@Fd N p\ 6-0EJbe]Hq.l{4|GbyW\dl'A$/PA;ZkIe44\8N{h?xĚ3_Ӿ%'NNYDDil8zT5H$GCM HFzWdɉ {VTDQɋނVdOpGC}6w "M@Kz.lg*F&-pVq1_G FL<! N p MMduV+gbP$SX]'~D$~vxD$ډNb- 2 EMPy`K`HQ~C3,+28`01X0\4s$4 {u )/[|;~67s fa&lgx]sǽmKyf C[h si&頠"h>`:in*Cf PsЁa-5Mϲ6*hA죊] (Q9Q2 QRP|.鈥 Dhӱ5q ;, ߺ&Z0fDH!Mȕ5FѐTi!>M30yiؒf !A۞bTq.5Bt`n?ʁDOEdI$idu馼sZ DL.髛-0/cn$LC_EmXp4>?~:S`t!3 L -.q?XCAa2[嚐(q Z@4J 8a'UK. rpd tE.NʸY$If. I#@%Rn&fid[1 :O5 /oC+{bKZI, O!͇8`c2 w&==L8C=g0NߔDLӟT8֚U2d e3..0kEE<[v:^W~DӒX yKb͑.8a;* Й!n\3g?X€L*n$W;m긿s2RA։Wg+ : @;/9꫃#F۲KI34P<ċTRf; 4l$V}45GwWe4~)? шtNDHALIiWTlt 70BJŬDו!uH {'xwi/;3.?SR]S+4* ; PP]ULh>'eY\ #4xfA/3?Sγ#0e.~\@0d35 I3ߞ G S嘥h<P$ x#CsCd^/~(`uvWnɭH'֫?TNܬ\-+mPLl\._8E Zb[0ItL RvQE>Z mDFI U9ըg]tve]0Q$[}3X^F=&9Ӄ[\Wʱ̮?Rgp10Ɠ!;.iAl0 o@Zpv?/lӼGߟkM?-1x|`4`o 1K4IP7+5pq0jQsaIv\4-P9PI!74& @=B   (Hi;H'ov2GcepV {&#I2J--. I%꘩0Iw?QuL 8/ \ 8wxXOy{- Α$j1$<"LPcb3H4k(+Y:`4d )GHhWXZ}/?*YWc>Pa|9i$& % Hcʚa-SKȑAbqi6VK`@$qZ%pasb&45.D\}ty"Kw]W0C4qfp+DXZ*O'SZѤԍA:;ZRqA 'Wm33q9i?d "ਰi -7HCtt=PH1#e .PBHI Ҟ:`U k2 o4Y ,`#*ć6GjUc>hOaΘn(7}uW/nv,jk+־`RAfh"`־⑯S&oD*fra~ckRĊ@}, x%1(1A U+Uds=+9gpN.>+Æ\!*`.!{"a`.顏D!ZX?:{(6ۺoj$4顑Q .iTgTw 2۝<-yL>iIĎ_>2e>?8TcftV9]_3_e[w u~?k&Iآo5 0I%Mq zr0a4Y;!0i?)ꃉZͧ\عlL,6!t݀]@/\8>c|P`4iY)@.KID4mTj @DK]-̔ # &D򨖙 ڑT4Tj9N."@zniۗvbAWT"fS;0q"|;9 $EZZl%b hZK `w \"hu4<]#TQx}*AuM*Q&$w@$PodƓy[f  [p$,p$\7K)QJ5K$X4i^o bkŬ ky))b"gF^&GSCZC` $l*A%+V 6#H $*=Q5L}I")giH#M4*APL8&D@lmI4+.p $XKOeCOr$ʚi&"LIϺ0".S*#Zf/ Ce,:m3#b85†Rϫ++~o0<6=J|"_:&OuW6cKOc|CZdty@DvMb֨\m?"+ZwLJ̗f\>GK`AUk+@u$O'iPCPFZ$Q<AdIĈZt\UB.bMo)$LK!4 -gUK|e.*N$"*AbJ"A0+U>bG.!"(ƻNkK]E?v5P"FġB$$B~ X1VV 14CIАANt"뵞c#CDODDyQ AVEhI w "/͕iEw#sf ?['31fp݄o^{(ڑu:%D6dboMIѫ"_gVY .Ӱ5P^讐ەmKkmPf\jku0u{nh@#Cj` Q5; $ySsh ]Nu`}m'y; G&R*&J<+Q QTTn$T/TMcQ""X$I$҄Ub;Pw_Cm2=/#,XmyޫqsNՌqHQz9~r"7繲3+2&&jhCMD>pjZiYyMA:?NH-i6@=J{ǖ`~Ě[}$ʚ &J qPںb) (I7(hʚ):iD-l%oEt7X0-(7(fP$К>&UɄCZEN(`yEnۘCXDSoU{ȧX)D.k+Ih&QNa4 ƒgu(#P2+;Ċ&Q;D/]4Qi0-&&A:2nՆZ+K8/k1Z\ {\ֆ q53C2h ɂE(a` (;I ,"(EWcca|fIަ@"eB`w.L K嬐1 "PhA`F"hQZb[vTi1i*##.Rߪ6RD'8=EQkfKk@OCf3nW؎?\9̦.[0pbHY?'u$7NTi:wvDnj )qpTO߄8Zi46"ǢfWq`6\ntO^MvP@gVIȮQ2fWbU"߲l@@kH[M@ 6ωf&& Γ5W6tjG 2|j=W:}ce15pؘėLGGjlBt&Ӳ{N#K]'ad5$1J"i`Q_}ejCfyZff(@m'L(m*o.iX`ONh2b7(m)$-%G{F\HBW^RFy* ^^]?=|V8yGbc8:X_K>cx{5lk[nW;IZ1@H3Z,"iuADLG*wIAo~S;. Lr$h#~@ # gR+ߛ 6+ :Sbg ^: TEH136&MAPl/V`j oDbdvC#UHV0 Tj{0 @[Bh 46P (P ު.dRAb@kI'X{`؂}Pbjka@4 RA}&d3qMSZH5z~|120ÚPW^'7PicX N>ꛇȃJVnfjE"I6;?TiY&&(F9otZo.yROdQJH[od儖#}`+rMi5HZ$A*Nf-TDv "-0)CjK=&kZRJ6bMɥ8 kf \ Djl(D,jl(`-1W9vNd WCLKNm:fYX * Dwp}=n׊!۵tI-=H#{ʝTcTDi6@x֤i_ʁIAtKBȂ&Q5?.L06, \["he}P bG/sn n>+W FVI`@"ҢgoɇJDL$ b#Em[ܡH>u"I%Q9QK)0;s?uD6Ť(P+B.M/ T.0I` 4L?C Blv4U-R$Uj7PJRDfQ '|'>3Xcę>Ƃq]RRMl2eٗbaa?憺@Ge H7ɀۏv^R%͠N#U<H~+2&@$;2sA$72T[X6 KHhqU .$8Nف7?[~ʬa`DRv\~&ch ByZ~gϕnYv&/~e"$".&(kZBlڲ&Wg+Z|)Jm빚YA+OAu98u)@ieΤl . [ 5_c3-bb`aN4H}oxAPpپ4P'8TPBdO4wRI&.}VH%1C|w d(byH$يS(*ocP`8*NXYA_r($[&P l`9PD..$vק|L7<Zd? Ѩ"hgچH.KDMi虨 cQ?t!&ffoKBdi-0-@V" 0$Zf2'[ E!Sݫy@jX -:uT$@etHV.¦dO1fiuI򘝗|Uռ5~qÉX"D]y.wmsd HHJ1$" HS[ܑxT*x mI꘦"8P4G:H0;D]rf2GbKjke˃Գ8JU=-GÕba'KB:$M 0 :v*:FߔeɇLJ3Q"mqk"#o:M6*Jb&\()2x@i -t<Ui&=D[ nraa .|/?<3cceY iy_$G}t˛n'$û޵I4=T8؍o62bs7zS iv#]UGW93.~^#1AaBْy. I$dIv3J 31E$1 ;i30oˆPg&QO ޕvAk4MR[ L!& D>>{-TGuT͒XM5rʵy2H+NyꙩP"&~-KGu؄"gZh+#mKv?T`4?n wSdI؂S\rWKG$DArLJ// sG7'A mu4~W,8nLj^c+$s*v|;Џ>,F$CB4&fHQr*fyQ P L'Z5X)ʛWxw>#k䟏c4iݦMlWb#uCW&ܿK8x/fk /?('źd!kKe[;.$ʼn/C%e3 [F\2 @A%z 0p߉sps/mC  ^w*&[4ʌM({l2V1&{HB q6NB` D&iSGkW !S-qkq(sA.UmZG7S61]2Xo0@0}J\IUwA\ v.sAH}4nGrFfn BZ&l@:oq·(`ǪnAiD@"e H0g($ QPiU4 [A&;hAl @PCdN"hDRL$y2DiB/&`$̨Ha&y$(`l1xd=HcA#bdA߆YG8ޡ̻7v3$lt25]y4ZdVMs9Աskƌ& $w]ޭr͖!aY&9Q%đrmKIJLV9 >v;(x@j ɢ~sGsKatN.;U{*Od @K6~T*UmP< Xx'a@%?PMf˹cueoi,Dt"@0;,uR㺤F1?TUU"OE%JZ&*oK*&/޷PIuDLy.*)"E P0>ݓEdI&A$ Isd)of BI"ЊL4"P "k[*H $:ZEFY jܔˈb7 ԦЁJ+0sk.={eF$>NS4_S ί3հr..xccѺ 0$+0;575)\d8 |;9Zb ^ȷ@&@J'oH-nyDOw)"wa$%(9|)~3jKđQ4˩_EPoۺ+#PwʚjoŽvQt4v! ;!:oM7U 9S*ITCbkn}U$y\tT沈*Di @TEO6 $#dnj.զ$q軽+Lc b 'ձ^ߏ|f #4h9U !OF2i>"@prlD@@VE@*k Ё q!q0A$lFw19l%u(DrLǯ'hTbknWh@iEϓ8C0c äH?Iவ^O囅q21_~~Y޼A I$6CaP]4'>#Iٛދ`1i!&G膓}=R)y*)BK<}Fg7A4؈MLB}D2}w?ܶ6&pfq3.yqup}.U;_d|ϞպǬ b;$:7OOdi(#ڊcݦ`z` E*?<@^O/S]?1|`F30@y1q1 I.+ #ri5Lv%PH, VwZi k1N2, $OsdۖͳCz#'ze,fejq@MgUfmA(k[&A֘|*u>_Po1DH4Z"v&}Rxh$ҵQ8"CL>{Pl SX7I=ESc* Zj A3"G)y Cl H&VଁܕDVm*2Nƅewr6} R-I$d: eI$辏+32';Ӱ\f uqF-sa`E YsܣT UBDL~TޖQ3@bYhtV0E-iR&!Qc`O0ṡJifXꟛЏ.Jʈ@E`UTQdjnVk+24V \٬lvcb=e.Kb8w#jpf+2g)qC'c.lpvވ"vk b8xl#bgrU)Jgbg05B$ ,m@4;Z( m^9H:"LI5r@;Pd+ p =e YPy盂@%>'nѾ .g?33#a8~GoxƐn7X1p Z "ZNfLRʙHhK"hVb/ʁclTmI]ؚ% ,T 6vrx8. qs˰YT@U DZ ltHQx-LRjMTQ5$#ewkk;.ox?+h^htQBD'a5!FC;QZ[&-hOBvh%dA@R /ZM*5M܁ec|'*E$ t7gN43_Iut>b5p0/tn~_5'ḵ WT@*/,,>YvF+˘@\ #KAu6XsR5)<u$8Ǫ73CnI fH("D(\kA0vlMo,+1365v2ymD/ru9p1&5M6;ps/bE+ȰIqYp-1E$ɠj&*E ʜg h/1.՞ɿ%v]ؘx ja}D@;M{ԛnHw>lZCf"\xFl ׫| دq]/)6u}#!h<)5Ys꙾DžWUIXׇ1uD;Q \-sTLmX+EK$7{"G?šl΢E~1 j#{@-oRk%Im4ImEI/}N({3@QhC@?s1aix~c< k@ +kX@_Ϳ>3%2'5˗\VA y'sO^c'WYa-6V`OuAۉQZ&&P'MM oj 0 74Aq4&Auu:$ =P@,2L\G٩rc120'|QA$CǪ^RZ'@YiD@&] *>AA2"0@dεRjkRMrvA0Hhv7Z@Hv#(noZR&dXLKd 6&Q:GHޫM$.<< EF X:dQc!k'j ګdDBU_ a3#db@YidǤR47M#MwȖTC$Q F@}E'H %֎P$^&E6JPj(Z)xLn}iꚏ1>-bIp}?).6K\ $ \+XbO"o [)Nʠ5$Va6|fi$Cd+f1p`6/)nvu !|.s)8x-")Q+K¢ uޒî qy @/%k~ga)G GjDl@ ^x .Շ:Q$Ljj%h?oDVc>?."Df$'uj8gU qɍ %I#"1&\&hQIjdp4QxSʣcG?Sr F&{ ;]1Zލr1$@:@)Rج$X\4$ $rL@ G@POO>iQE(MlCL l!2kV1k䇃^"p6 &"x;Dy%:@ ^r.p٣u[!\IoȉIP8`Cd$PwfH%oXCjf *p+!BJCI`EyP@]$S̎4M 6T44z6 )u_"Go6|q;p #yF-,C`ڪ#x6 -MvSb" `4Y&#BChoN}aoaӕ6R~[CҒ|,Qa{|b @JL(S}<$i@ ~e~Gvu.`#JR{|_Ev6]嚙!|IT˼30KAWO~ka38N/oK>vSsִ԰P'\ ]eo5A5>^nP\L(TDPY1w]W1kp߈ ]\Ù= Џt|niVе fuCЀE9)q&6@@U ˶ =D mDH<ZI8"iu [+Qi(HxSE$/ EP3@0ڃ֪'D RWұI& 5Ih؎r(e ^t.3o0in v ^ + tAnOE6=e0k7F! @13R$S"*Zk5X*+r'ἴnsbCY5\I${;H\`mY@] 7TmZ)zTT@@ =14+&ZMA[ p4*L nw :)q;(?h/jXo|d8FSITmQ"L :M煩I&*h9ò--u!~ŧåfY,\Dq#u<\9/q+s3t; ](h TD'L<V[ ֵ%Y"" 16*-v2A7 4 }SURiH1о5|?xw?;~ۉ|lC0:f@""(3a0a0\!HbEiI \]SRF .L@T"LT$K1 0 1Q A4Q[>n|Gm汄/NWhh qӽx 4 F-MDi $K!H %(j&e\ "K E@j8E5SnM&d(2$V*j `wK8(12膺Ed4$<#Uʩ l-M< T4P(]I23@t{.F:]vW4Q +꿨<'̶6k0D H>"ugdbFp|s\d$LzTy'Od#(14hm>F"@DMt@m" i?e :o&'Z@+EȖ}@E8KMl5D0 LldPP Œ ȣG'Dحi Y|#+ec|c\ip>9_Pz?D8Xs kExWtޥ͐10C#u ЇE !  jv_^^*>,oF= ?LL_Lm;>G9 XCXLBw'nc!эČVY׎W>;^.5\SI1Bh%k\Ygb= hk]jMmCfg_a*`>a&7P[RoP&I6V@iCzN&]& EL(hTdP"JȡtV85D;*eמ@+`8Mo.id)  3R BS>&`S]p @eE)E@X$+#ICq `P1M|1۟8Kebi@/% JṘyQ.ut g+FXbjtiP/(HH0*HZAP#D[ydI1&xH2I78]9T0uˀ^:#50gjpexq @Yu@  ~C>2t>_5b+*ŷ]|:?EgNL$lv3\7Cf~|/auay0Y^.)&&JjTT*ah3;u<<!ګ.M,.Ӱ|oi'Lou ~f_=us74 0H+: d*`G<)!3K7uRP$;ɳ.L*+Y&Ɩ;(`HȐ e%橽5&KQo2;Q3D Ei<$LyU$G*1"Ԑ\6Y.ծTMO2<3/% 1q+?d"ft4$h.o*Mnl*kXh`j;#IޔKC˕;+10\m"ˏϹ3;,:[ ȥPAinhh-'"ObGt7>  $UU~s~7CuaQ͟lcuJĉk`K$W8ȁK:I"{`dAh/eEJӋZlńESVOtHHDjMȷ"0<.K4l0{~+|e+C=/p04 $@1ۂ{grOc2yVpKphM7Kw02/{ΐ։|1[:vg*1baIJ0)~/?Oz=fhs@?o h-uXUDi$$f|H}r9\gcV.v{?sFqq  ZQ3 Sb!$RDk‡!\e:AiIqo+%6!V@4|XvQ/xX?XeˏMP}1N5W_rDk Oib] ^n&{ @Ji&p IWVg(x`DbI fȏYTDJ!@ֆk u\}aL␠<~\!70 ڊm 4Y"ye 2N+k:I;,8VtGhm?y@#Hp$$j+]!_IVAT.. "ELm;@`vV.Dʠv~p"@dA PHa!E+e@h->T@MZL4Kݹ]80`pLn{G4 . &"kĭܶ$_eNꗒI>Ar1@R%KA`I%DEȧMC8Lhb+j R (iljg(vYD<*NxeL4YdLFp)Cĝ):_&߫^Gtb5B諁O#Ct/userhooD["**( D܅>D.)ɂ.($>Pl3uF*fIQJPozΨ`#k-yI߿(&֦'SA<h@5;tV4"$[&!o t~+pq ,"vfY D w +'VU8Ēuxrq0pqf8V!8lu`f BC/:.@Fg nE{ŐAj$wA@Rq2m~H$PXb;3fZA@ 44P&{nE=SxrD =+I#ה ȝ JL|,94Ԙr I5@A )A0MfA(ֺ *& h?U@w(#u1nPYV%&zEB Q  RF0j7nZˮ0@;Z"XMkA|-3!<`+*H$u4 zOC%,ղۘo:Xm}Z"ēKȚ~`֛5nu,_Hi0LБK7S&.0ւ T"t ^%DODʜApQɪR"ְI9/9 eof^fyt<;_9^64Ctԧ\L-6 EUHdj&jhH"=hd}9Div)q?uX ǚ&.uܦG ?9 8?u<]`ٛ$/GsKrJX]O]J ,ډ")!tICD'8$UFaU u9UOX4H1ScNyI| :#WX7xO]gL?]G_6d}e{6< n#RB(D[ʍQOJ8yH]"*mJ(+ n;3]p&}Ïbx;y.'k 꿥Ҟ/wn׎cuLñqq 8`u Se7i6;LWuKwX.%8P95O>*oC>.bMsuijux{S3G#0pr#+q]ROް<'MzwicAb Wzc uqD㰇B8É jm ē*@tG $`"IkUbֶj ;YjmV:ꈧ3xZ40$ʅDNpƙ;av(W<5]ևI:v18mq./2bbl j6XOx{9n}+ s/XM58J|y|<#!<-4_0bMfP.3@NɁm" kYxijV S7-& Dvq6As(DD<~[- J}VNd.%w9nҰ_/<3Lȗw*$8m{ &i,./iM̥`0T4A*š$x;+:`UMWo'ӳ]Ay!ua fZDZupHG.Lrؙ!;5XCdXKA XHX 3'{N#wƮ;3%V$S:Hb)6"QDD&& gk\M<\N~ 8E{KD5;Tc7hwJcYx斚s7_mǏw.k0& H<Բl`f hdInb&Ow ]1@3PVik Ad*#zdAwL{);ˣAf@nr{s(AV3y|hcf_ %Ē}qi2B qbUIwPj9@h~VA_c2:iXqw1U1i%#hiīQ憪- ,EG7\5m .yZC@۔<7YfRĠIz#No֐ IەAv&$NP< @4u`eZ>Dܨ6˓5̦{/an6P jnF ̢!jd6!;)'S#Tc==/+Xô^P!Qbi4<)iIv >ϲMԄODZJ"ACnEhC4hѨ0A >jz%r+dce5"kJ]fk30b Z#GA37dDm: iqfpI?($*fd[1"8j=4Aҷk*¼zId(ROЛLxg]NM'eQ[E%W]S!jn',V9Js{h; B"jɃ0+11qK٥6\MuI܄̋=ۚUpyKH7VcXEWNEc"&S_d8Ix9n?5⽗Cu\^13ionajѺeNCý#%sl ػN3=8Wǿ>t>ʹ0 Z[\\A44$DVTBReo'<>&xX ]Y]Bh ^&k' JDzEE%;(y@1 {-24l A8CIS$ 2IoD4lh9Z |meF['6Jdn8YWtߔLT X ڋM6 KYD 0M- UvjI$ՓPvR+aU1ju5O *Am"IpD ju5 /.{+"]h .a[NDd ?l$=P{`~E$hÁ$IjVG`bdlcLi`8*ff$`?3qQwI*i1Hxlh;KEn&E't])i;jʦ}~4՚ykjITHt V!!2LΉ0ۖրw+t6ܬE'Ɋ҆CX-A5E$ ͯ鸟 €u?Q8@$Pu@€&aU$ B.bTZMkxAdZlf&P$Z O* H9I$BH&4L6w`T]1:nmXC|rX:^ofX06$6.ep!YeF&`Ih&nX2kx\NT{-GL:K_ D< V+H<"+e+ !s` FIeASHY /+4p c'fP0y#D*lzH 4-M o A.l94e˻?sz&/Oyc)n+@޿I$lK`I%,̞E iA&ݖK@q4*ZRѪnDY 7ҁfIoA@b12[dN_cbx\FL&D"6>e >ˤpI+ Ln|%2Q\]P B\5b1uO7y;̀y@xT jO MpB"n & .F48i}Kuxto ,coy"I1Ck(}6@ 66mFjhiuFEoE d*q 6Yh!~ɠq/z mzid豋)>ghTA$ {Qx[ݖx"L֥vYD\}<H% &y,8m@7?@A"L㝐M TIJ+{dgI*Zv>Vy7.[7;žgE> f>x d[q ؂B>)|i0e8X !fI~nH0@7CL,4Z4ZE dZd(J[vsy?0߬ݻ52ߤB$h얀 bO:{Bbcցh8ki"_{|0N9v˟8Aά?~tVV@ǞAx=Cc;5ቇcA uO|C1tq08iUPQ$8xWeegNNi uM"˳gy5>u*$3šl%OOky"Ӳx9NgKuOMq"nV`@hlrH&EJduZ p:$pWdS` V@5#Pq"W6o5.2HujLa [ou4q.-\n:جĶ`+K$E"(+ c^,q 8 x&EE5 VwZ.i%4sZdӞTPH)(.Ϣ *6}0y?5(AnwP m¶ _u'9~{b9&&xƹxC7 *+6a z/[[tGf<Ȝ gHW4Ib Hbk $T47ah@ʚ$֤ɦE $(YFdȬ@Tbe6bJ+;+;Odޝ#J=5%ĒDnitM ^!LI5)OmO뱁1Z2]A~⾻O%-{ ݈ N]+=``aAi}@@ P 3Np[BZ@ith"DD;}"dA;4n<֐ TTELBA$ Bc(ixLʖg~lsiKϕڪ!eΖŁdsH3Y ٻ4y#xȑ_"[[NZwHD5pi$RZvWqs/ HYfYvq8<.L?cT&Lo'3' pA'`'췚e17gl҄(' \ qP :UXA=@)@-- OQSb?,FM6HbMWe0:'Pkpq۹.G"xwrn>L e"xM% ).Sf&dLA%Z ̙MQH_{>7:MƼgk7$WOttΧsL2 nN!)EQ".!ZK-sD]~GAA7(򵹾bf8ڵ_=o[5v^(m@hq>Y*tK7WP ғ@yl jMyEU~&j #؋,nNfnA<&"A27#[A-V1$ѷ8Om"௾G5Ř='-nKN&&;!Iw^ƿK.sLqhmHV/L*@Pxjl|98I&!dE% 2Il8jb}W66o4YLqiPqbI i6Q~Q~JEM0APʹӄ I"q۵)Ǻ ~jfQt'7Ɛw<#>_'~wFCO2,y` 'ﲾ!DpA$)ć7D˽Fڋ )UɃ@y]gsc1.0V]Sey\Kcx8%: ;$H+ !/75➽:npmh&'ҷ_:d2dz> Y-,cInI_͟~gqr975!1p^d.(Bˏr$s$6]'FMeH "n]"4܀nN l6& E%ND6N+5T{y,D4Rf$ATjuDje!@3b)d>ɞR"UW^@I&D EDt?st3p$iE4äzn\!ph{B86Z VHHSFv L ZD,ԑ@?tE$RkTàL _Rt62D`qG$6jE8]X_3'84b  bHeFl 0{=g!]kx_z:V2f2? ֻD&V$58N:ryՉ2EW ~! Ou%Ęj 25CҼp$F[fsMvtN%@ {K1 \)̬tԸ6[Qʋa" ᙭/Ѫf @C-T>Q;Q-ixzc$Cظn.aS\S&L0H TҦ6@4  'Kd F"CIN5L($ D[MZ(U׸ߕɄabjsu Xra qTFxjNN!; j?A36bt?0;$HIqPe7fK݉v["uq1N>+@qQYI lSخfgxf>#Xƫ.2h}ZB".G:3؟/qØ=_Orb\+^&?bce`cTFTKbS1n1NHdNM2HE4.1,dĊ+$ 1 E%fc7#qpuq$}R ;$*@F EPO)E ]CHŔ$@55KY 405|)33a꟠FDʈ2a,1S2\5+}CH"80'hЂ\\f!n1/wůq03 kܚ (3SH!o+ʩ(Gx*pEL2jU.~R +.yHf Yd B mD厖>.w1B$8LZ' `4 btׅ /o2=3监1q1@ 6KsCpC54y/rϥt^\_.N,a-H[YlSH+_"IL:$jB rSM) XK_>oGU;.؛l|,' ф iXKFv{\X+Es`&E$,]KѪX\L,sq$k*&evt\/7tn{/Z6TH!ۨ$խA>RE*:BFJ7O "M &$B\Aȧ03Nu7x :'Mγ54..ns!ϻ;11\/ymdS[ϯ w5, x ?P4oUxkdzwXulݩx\]c9L\|Yl'LA/8L@#t\I&(.7Sj$Aa>@f)+@#K'WS$ۅP@)r D(nI1u%Ŵ&P͑*W.6& 夏IJˉxΩfj$(jCL)פ_j?/Bncacb3n7uo2wDCU@P Wҩ'b KMœ5[d"3͍ 7QiSL9KX >Miꈥ]'F>Pk6g$h0w(aA7;v_MoYȀ?p ~32Ϸ9.ⵡ8.8 f- BDt˨A˛3a-8ph)1PPUR\)5V?'/eQ=vP`4'toɆ≬-qFnIMwA4@'+ ЇZ"yPzESQ0ABLOhE`, JIP\xʢ`&Hi2e }Ӫp0ImT[q%M-!Ά¬ #jOӴjd&(P H26͖hZ5X&W3Qٌ]/ыѱ|lfK@1__/>ʎ=Dptv"?~08:PkU mU$2ۡqp*Zkʢ@ $5JIL40d0bcI+k:vwapah7I=>hቭY50BCQ "`$h`ųS An'UK*@DC0I2jMCJ;^в@'r7S@(7WlbLm*h~ܭ@s?x )f] 3Y@ 2sS~˓6vN[q)Ğ xĘa5fc5/?f.~.ƫLג(bd !UI4[-GȈI:b`yɵ m(q-؋ӕi$@#/1l-!ʉ7hh" 2Qi?͔P'VvQVNQ$CuuAZl9U@TOuLW ZѾZ]}w%༴SLRt"tȩ6?Ck\`%&(&*rN"0Dua@i0/ &׾6~c|i:Yˌn(ksCd/v#;(M#`P ,{i ӱVOH)M( ]($;&y$(@( >Zcd -3 ؏LfD@ܮ|,POJn{ |\<<02kw_|Yχ-n߁`; u;I 쿁g 90h 4;VH86(LMM֙Bti@HYM$R$dB\M{?;tʌ/]~e̗{UN>._9kMa|" Il@&Eq3 ~Sz6TݫШl U0X^j9 `ĩnʽ+M~j@)MoI0Lm0 I? 7%7PM vQÕ sƞ-DЮl ֗qy5宀{Jto;hedd &NÀ$ʀh@A[,Ԙ[B R.BXdQ VdԊsUbfߢՙ9Hl@!kMiKP")lDU A<:i\YF @+.@B;Pq.b =Cc Zb(z"`E MiPC+H /'ᖗȤˍ6@"- *tXK)I* XCzoW汲ya<9Xk6)}IWf2yq( 3E@?^5 $"iiDSI}R[:t6@i R(᪣R4ˉ\)ZNɨhpw"SE ?L7Ym?JG%wILOu $ZЎܠE R&cQIThT&TD D(:GkI"'mt꽒 GTb҆bBYFA*}&cP(#e[T dP (+el) d'S$HiAV$V`mP::f/v(#.{Oe򙏗CDcW!yVxe"I5O!70l`gLR-{$t<.EC0AAz;Y~v?1a0j W>Q~'@{i⿢[9W4h+ .0x+-݉hXnۮ*L1rU@&Y #@ ??KϜșQʀ-"S49AG+TqߔĞ}6CkEhidHǔHo[0uj*-PAY17:/+Vs WQK~asy?@>.x'/oyagp~ <8XWÖfi@ fIlh˖qZ@'D`eN${}g$^f(oHI( 5ㄛw[c|"ׯױ6&Y/[)yo܎]c&%@vV0> Ik&PCe2& pU;ZuM &o+.llLz4nNf")\v߉Cj_技D(.h1q~Z{.8[țZQ*6z-5i/sqz> lW:uk]߰"G#zvq0pۓf#qyh I9JA`%)] GAD'u&" * =Z/*DɪI 4B$F¥@y|}mZUZw@LbU&`(AFېxF~;\lLkYMK]Qc[(N$Z-m+ _W%0:L8xOU@>ka1A5uJ??zW2m۷|g\B UqAӐI$ q3 36 UF&ZlAEj7Mdqe䯧yyCsd;^+KB}_#Y)]2D \*MUx]OĝSu>o1|\W0% f*"8Q 4.舖?Ā%43Ů @; ^% 4gt܈}S&*(Q_0C䘥dE9*>R@M:"vp0$J.9Kpwך\EPDվjGL: 5f_8$Ȁ DDR1 ˠ L4A:'N%Γ-6GbA>tl69V,zXtq39,6$ ~'~g =wi/fBɩg`,#m8 bV" uk3IK` P`m![Q2jMD$W{ӅCms"Q8NuQ&cH$əi F0L6\iDjLoPb/*>HڡgI-3uV'dH6Md7lATT^MjAH*;D+`e)JLE'\9ΗaxQLo!,@+uoEIi#֣4@26AgsoTI*!n H@/"į,BZ?8rbpcծS/3|&a9";/~&W?zӳ}[ 6H0!x'qt j=D ;$e3ER=;HvPt_Gu4 3$!MHMI6#u48_FLEȀ1QYCM@2/M< W` jBL(DVI%CIn75'SDF Jɡ) ?0+&T42tER.1ۂִ].&yhtebVCE) =mj\("5* kddZR@tm֝H 5*h.W&> ^58,$"Zc.Pd{J@(a|ä3(F{TA>Lk^d.O?#f6qACKx˜}'/Nc>XkG "/:Qysx.sI.=HQ ThnwDW>ޫP2 !ŰG_*-H&gmL2=I5e H|I_u 5KR b!LT:0kLVd&?S"vD jWԻDI5&TLC ̃dV6+K(mgX7;Ս~0 } 3Ea<8Q3|-F_+?2xY,a=G $i\-1 ;ctDznQ;4T]pA 6¨ k*'Igaᑆ𦉋? x48Pz+c; m0@%@؋Jfp)k7+ s\ tTE.vy68Zzh{MDSA[{=sme15Jnҳ  அ8i! v6NƇh¦oEP&zSÝS/W=37n!ūq \-~#.g`tOn>!ql08^$ XlZfV$Kk!ɪzEޥji B Hp y*&.~.e Q%h:ΡZD*To碈}į~'nKf~`7KK'+Sm6*]KOI77L}Y )O!Uk Ƀ6ҢI5,dE}. t}ըN Ej8c cjFQq:bޅ--uAr7H D{$TL I<&6I)fNĚڂ M4M#ڻ]n`62?Tf}huM_嘕8A!B,7 4PokP$ RKK _Yfp47IsC ox3_Й/?,< 𼆉{h9 &iqw0uv#}( 8wAp-&L$Ɉ`n"&*W iXP"HSZH@ָA3d&=T " 2bnVQM T2uio< M6B;%Oh?"uYc"ɓ=4%&EW; 6ZliU1-.0]Z+aP4Ȫm(X0 Rn*@d& 76XS"jC.N87<[ sIbx_u,xM{=?~g柗ba.uIb9\lj"W8l|v zv[%k2X pjC4!i!.Thr8x]xZaaf^ @kȸ\;o -ɹpkH'W2\V 2 K6K9ղMpqL#'/ xX9  3aߘF[qN"i̪ h!)-k]n(d$O i'oM3oײ%Ƅfq/`/['8EtH \aDH(}iX(%?eE @J=iOT)FR1.anf#E:M}HdC}0KO$HӰ@g@BI<0? 3^YD2bS@DQ`~I& ۈ \b "+r*dE{ @p8DK+?͔MH}hKDRRsA2BE7Y, -&L7=֚ua$|AA&kq Uq&F4hh&~$ܟK^b&ސ 06V"4ʄIT>IvDz.w]h+2}IPP'$5 LSOIUWɐ)m 5;IpE9QLj4lSj(`&guy$Pҫ03s"Bu C4|!25_M~(x=?'k v+K؎ c8Zd(m *|@.+N@#KD@֋%1DHHB~YV?) V[b1ry<ugV;H"lM׫.``k0٤@`[(6*@=ފU;Yig N;` P@2H>`k p("ȒZkk@)Y)##yD\O'eU75&sK8oL)w=G3 S<>^.#IL}?ψrL?,7>[#p5lpN5@z75j26WqhlLAQ~z`)ld\)(6F5`\EEp0'KfP>o(( )$5N$IbJ:IMa"LAܨ 1< :FĪPVH PϪ^7'D .$ .zA?dA(ވ&Du>SxiXoFl¦M |,y"'n0eemi ԅߕr4sb7 [Ib&H46uEp|H*4).0d ~4l-pi g֣ Os['P]d< N##7Y.Auj ;{KNqD_@$BP'E.R&JA{}Oܯ9Tn6g Vw^I*y)ƤKZe240gdaa5 v_Y#]+K-!u#P-;ݥ@+-G#M-SPH)7H)Um lT =NʡE7ALQ'1. W5 MIiu e㽸Oc^C~5EpC.# e1mQȓA5S !t٤(Lw@aGfG3钣I+[Qu]/2^KgrX1lWcǾ$/Cdzv>>)x`6 54Yi$f (dgK'+CIn`H 2FP;4N0oI'I;(n{%ہx;" E)U˗sNqpl@lp&w<DQwI[ 4i$DMcb7*3D~j ]&E" Q`H Ee,4T]wd| 6e1pK1维_}Ҿ |E^|[}N0-uljbЉ2A'[-D z# w`:bhtN̝#! @ЙpTH J ~ M+P-B]u/vB ӼolKAMf&y@@vjTR!s0rLs^0|p9 :\@$ Avj?^m)'tLJd3oټL pCDucvPDA?T̒mD ]Ma[ t4`YHhnigFq%NMu{š%VT4k5("8K+#] lyA? ^ OpD{ ?le,:M+ HXI2N >b?U]5L-Kfn*ngVj.; =*tp$OvUcd3bAm D 2يA40IGdLpy\y\ A?9l|W=$ԕmOTGu_zO39f09cEˉWr_ u unֲ8oc= [tDZ  i2G^Tj` ^ҖAkk$'pVc8jDU .|ShUP5w*y8$5s %_dW jfU5<ق46SX id8 A$[t Q&6;$}$T~ EUE"FwDOxAn(QUGPUKo@PC ě-4^~s|;7;f`Lc,gNw¹#ȵ:.uvJGQ;LM\ &e ӝib(4̃CRFA7Cͤ?fZn!a\"d L ̛T:[WRE;f$M?$Oa"ÄA}-J뙑{3A '~쟪6P\E](Ѳ/-N۫+bR@(EI&$ ̝S=D2H#p@ VZ(8llUP`6ok;M^  ?EGjkrYo ݱ2BwTKLsU4xVS@ 67#K+JD6M*@+3oUiBi*mXP0mbD_u~$-TϘLFbjH5&dKjmDsUK%BR"UۘA`XnLO6Y&ߪN m*ch"*`@?s #m G7@u 8`"؀T!yӝͤ50kMeZHQ[.@eY|i!Zq պp"k-ڡVFz4sz1-tHi&9; "aKZSsp#|n1~g2\_Qq \)SzT@u۔^wE5H{Dȉ#e5\Ɔo c5^Au<@~:&d /R$o("&ES"۸8vTsy& H(D0n !@bu h 3xyn3pgVcz6y񇈱:e2EePd2$Ǫ!=j 36*HX f}|LΫ)=A?1moWfX~cOk.# ZGnmZdچZ&MZ2aEQm$P&l$E ppo"nX/qq%VH n"4XDjU*^m_ET5V& #cP "7ꖒi;z M{*`yA1Q;ZA$REB ! Z rvA.bL6I%ZTѤR^c-fݗ~#p[ŭ=pB$UdG?d4 4Q~T"@" {Y$mbdLOyCD161թ!L&>q#k$DN-AjI .&} d3AE LֿHi!³3ZJHf(B4TSAa5ZIZA_(&xy 5kIhmHbe8U //|8?%-i&O E,#A >Xˁ=R1jY~~:=[2c6@ :$L 8b? ^tdY0A&} $rE&8+Jy&(yET\o^Y2w-nL4IK`:t79 >A3a6 P$ b+mq 1D ̋H+ ~C?v`W3S_|uܞ{uӗhn$/\H$40n$"))˪o& ]$F@>-ٝ*I-Z(5mcd78Ƞ=)qzШ\n׉jmu&HPæIs¤L6e䚑Zf@Al@I-q 'QC&.hP""lRgT11G{'UP<:f)3U8$҂EtU!fhvP"l>aUu>1q~P;/0HhS.ңd 1[=R`ZIr$D :1RC"0 z!lTrKce戨P#aء E}VW$mXD%1z$L@F7̂@TH?|iۉ0ٟB. N聺H%&дւLŭu Ӧk5Pv-)$d,C"sHʋH'LNN+E_#pW*M+x$8L BMbi-:)I5 ֖U $Yd=+sX W LɃ6P` ;p@4V%PVj7Q" ; k@#e0l,2*~kLV٬, 1HkZۓ.~?8:^\քI 42/ BޥcGhXqbk~XTap|FS@THE $D]2OlW3XvG9[4 Enehnq3yL\e9p0,bA-;@?/r"Ctܚ^e3<5DnLW8]1{p8oI$yS \05ca*"a Á "6 A -  C?Eq@ m=Z@$ W 6 ZuDN}V ynvK%yă6uAׁJ2FSmZv=XQ H"o)b;:({(A4dcnVI:H1'`u")H;d3#&-" G h9P#*`n5f;c5`k4 uK|҂ZH.d "$@He}G u79\΂A؂ >~Ժa3%yl~k=4HR !A3c>LcBȒ8tD`[@ Hh ^溴Fo$Ck$HaڈקCe`asTx{ְs+8ftbZpu,=G2aCDa=ɩ!k-iu"@@YMT7((E=VșUvH(TSR; ;0H{(^岸~=q|+q1 $u^!)O x#)^]̀A ښ>WV dY7VA06ZlH,W3>'1׌e~c(E8KdʢEMn6PA'o S 4}.*h-Y;>`V[ UoH$;,@u[F gjʈ-7A< 8}$Cp*'nUs.aHQ#A(TLЎDZZgШוGW0W5P$4d~!<%;-F9cp"{,ИD66DB"Wk!c,& ; /O9ϵ8lX2Pi]{*@>lN %rc3 -$*ϗwbKan@PIb0E*'I$mb$Ⱦ`ݦ.[ UI h0HSVϤ 5QArGQ$BƖ.&KD1k1Z2{(r4~ɬ"M]VܕD@R vQ&&DQ\o}a͒Ibjl6KI;%&dM,"]>9Ƹ\@cO?\nx a F A*ĸOXvO8É}xpbIX}$4C\e?u`7;L4R]JM ]{?t&)ADi%4M 2k BĭiNSacNHl+nQؓGeyA"$= wEaz&Zq ‹H(ɆHI3SC`ImzBkeM1tZF,}9^OkS$3-ъEWGDRy|&k11GSi$TH$y!.+1a82iXSM4ĺM&Tt- {WtLo\Se{/K癑xx؟`?Q_es^Y|+̿Enn qX{)b ȓ?G!n&]cP:Y|Sbcat{,-1sZ{a@ P& 2DMA!h?,kiJH`8HְևGa -!—ߕU69m-1JP؛%S$fPhIp q@T1F"+2VǪӈ;JM@ + 1 ..UYq1Zᇸ`:32um)kH#O4gzc<& u*N6HY6@w"qk+oD߂. U _꽎Έޏ;3[YӪix NM$׏t&)P*|6"}7ZL ٟIT["`&nkcx1D:N%} Ko=*' {&"&QJ6MVALdEBuq[Ùx):>q39AtM.h8/X:O239 ;pѤ4HɹDR@DIJɉS&XM jJ5Y| D<QK?d(h}D.TjD I6( ]t9ӆR`D܊^2I~ r@"w0@'k(hTz=Z?) MFP_sP]㺩ݮ Hi*MB/N:$f762RE=xCKV&0 Vdn,lMALyE:Em N޴ 0 &@s&diR tA;)U͖bes vp4ssgb.qJijG_#)5VhP{C>5B N҇3iH?E$V\/p~`d%Ν@wpioqAPNhd㔵Ů`Ћ؏'ڈFm6>K\A{$Pɹ 3dVH7>]DZpcpปwf$]$0G>h]3 Pno#e@i~_K?g->a'u@&?E$iH-Z݀ulWӌB&%tAUAEA6ErT@VH=@!N+7tPQPh.K&BP&UQN H*DwD,Š%B`)V[88k񟊼VPY΁QLW%j}"vP=R~Ab^EL{쩂6=*ؒ$~T TS >d*u nRS(اi\4aϘ:Vi]$J$ 4?@*My$d쩤6Lȅ'K[|)x5 8|kIWC'UQؐ&YDj!@5{I7dx"{@ۄD@ pɚZItA #TӍMKNh&q473pFU]!"IBgbMJӄZ$+TjLFʍRHШ@H AR-l^Bo 2S!4$$ԺJ&)+~2g^zKe~c2@m=WuޙqnF#,˦\)2,W9кMe,| ub=5&t \B[揨0oAA7-l":ԶܭDLy$o >Y53P}7>ry<`$گRgO^_*0X1矖@P"/ay׼P\.p1tcكx_ -/soX} ƙ>'H=TD< %wzWO}S+e oL/|.9|VdC˼&hd4+% A;%&Ҁ`MՈ!vI'je!Iˑ$ۺ.#q -nX"hgtj"<0H(vKN";Bgzo' <#' JtyP33ZQx!Pژe 6Id~,dQށhކ ͮHe tH@'{DZ EO+28n%WtN4C s11!ȕF Bt'n=Y,g.[#͵' ͗;KI-0MVZ|@ފ"amnhpqtB@$ j(Tdn yfD$)@@D4>nz@O5s峸GN[0F0W#I$ܢ@&\,Bѥ4~E8P䡵mTȯt$oTl&cu-8ZA$qF "gt*3e<ڟZ\G$'a5A\>i7(At\oEY/]/:WvI`0هˁDQ~W? $f8;cpw^4On}R +Bw kXT("E eD%5_ @1%ΖT G3yZjY ;]@ֈp7=։]._fpi6X f!7D~7'nSB^ I&v ~34Zj{Y*hcPMZtU2 Z _pI P;*e vYx7-vA>bT%G;}".ctllQ[I0_;fa@aQz64 _BΫ|"zxνI5gh_9 Tx*!] @p6餒*<ҡ3.)87~& t4ˀnSAPHlBsK / v#B?d~b&Teg5{Wo`c ?V-C BIF HTR*ĨQwϺI[BZƿx&._!YH⏗Zo0VIbMb9+MQ"7Qi&CC\oybEPgnV;{LN2݄H:BS[-򣥧ʀ Z&AACk&ەLH Mh_5ŭA I&H Q:LĨށ: ;TRZ+&\,kf&!k{k:`LrѤ" *d3t%O{) )uO8Y <|b08v o=cD1'oRT(#4*lRQs*[ ; PR( p0@0BwT."H1^W/X`-N4@A3 R ?e1CIB6J(VjT@<ֻcSQƣzEwv4V1P{l(o1cKUFʼ4HqhO `TKA"4x$Pip[&lY8eA<  `=OZNQ1A4%Yd3To.l,6@pğ{]OS+01-idDVDf You.a`LD3JwZiqPR\)~%i^T4ײlDDAxh A>1d~tήD'=0P'La/˺SgV뙌[.1^\6+ge.Xe &d1K*A$i;% R tEKB4DMn4R ,4..G3n+>C^[GzQp6G<)"muBAP(n*9QcʠwA;A\+:7Kh*]cڕNF} ǜ3$Å>f:&+ $-.-6SL>z?S0vs/7/3s\T.76kBf1`48 ØZ\׵#E*uW$+?Nq-0@L[S)p>^Al$JN ~<<5&u򹜶6WiX3ث`iN&΋J0tLIާzMc"i b7D1`>&  HuP*Q SAgL4d \XsDy.(Gv')-kJ ʤA&H*V ; ) JԴI ?şxzP~3 PRW=qD K\"bٌ]N -4&mxZi@7)l&`+,3`4 /_<3Uټ{b9a cx"eWϏra|0ßK;4ZSm2+&E?zN ~:# IFA'eA0E76vYi.H2e@3SAd it=SF[f}qKBNa=$_nMk(yF\LVHb'6Q oDICKo[= $ک+GeT bDH`bxD`L€"3(@'s TR@K;"-LꑽD *&,^P45HpZ۬{Mtw`w[and^@AP@M*JMZSb-TdYf\]5Z-anP&6 lQ@p+82gaP`U@HT &H 'LŐ]2dK?tjJ^!-4'B. Nl!Iq"J$rCSMg_rsr| 6+Ắ&QK=nqdEjL% j0u[Y컸9'?$tJP={MB&B4z/Yy;trGLbց6dПJm˻55TJ1YLR~-h3"]4^.r[62W< \h [NSdgùLE#y-pk-Q,lò5tB[.ц ]ipyq#T0WHe$L6[€&D/߾>/J_A$:"}'븞"sa`3qkdkӚ }< *;8MD@TLP0m@AP (p#-l6E /<)*GiQ_WBC4%2I*&*@1)VAd: cho &cgNIO7 HS }(ZA(A߄RTMl\5>__[~e3W 6o4 3ҟ1 ?teZOdh&)_o ``W:\ֵ],Uʇdk[#d8Ky&Mkia +MyëIOă-5gUA. \H;?"9/6E4^}TdOZHBfd8yNײ0#`0 LZfMV1y:ݫ$oӽ$+CѣN1(3<_(ǿWxᏉ|+5Kp6{/- ր^-5z&jA1_k!^jw*&^T)TG}_ß'?faWF},O*7 I2k$|zNu?.iv i e"gHM j]"EܻZf 㞙ղLnLʼ ;cn`\">fr>L3 ,'yWAn)FQ#.{łIL A4r屎[21Նd̿7lH.qrWAeQ4;E8AUEM5 P(XQOL6) n,G3_מi8f T{fs fv%V'U;]n%Li xj$ʨ}dJce12g%ASL&QA֪&L=!Nq4 "H"Asr02N~.#K 9.[Y2Ǵ &@mq`j7&p xxOu>v_5ua6?#.1;<_d`+ZG7~HTd" !,AwYe*'j,E{'&$Rf%T5!@]pp 5c/@&tFI'j5A6OOLҋ8*i&DzdH*`X hTz\,fT 8R+#nJ o@`^$VM*|.g kI0&;VׄLi6\6f!(4 +"A!]彤$]0];.{aa97+~"xgc+n޳8l.eH|yDI$Aˉ L+A5b6 Ge$čL ;UF ܪ~.>)RipvPtuDb ;b὎i3axX[d1 jFf<F)@Lȇ" L dRs0;cuʷ-K@.x;/ &?@iH{R+S#CMunk4@Sǖ@숾jKulhܮ9 p@<_DjlE?[%Z7b Y,u.y yKq j9Z $HYƜLGcǷIbI;Z"A Yh{+HtV&MT 5M5H߅4t4H^CIT!JQ;{ʩ)ѡmu4klg)1p潳qd@4)m=Q!n.D@?DZw3H/$Ce bb؂;y]x8،k,|&11ڴؕ4HCD:E XbfH"PF$ "j{5n$&"Pw=]6^I郩;2yl+[H*EiTKۅ jDSAdZ-,UdrMf nOǹ.'V6(hѻfcX//pͣm`πZ.h*UBY67 n+t<AȐ 2(JU-GԨ_EA%h9TҠ: ce3IB꽺qC[O<C`ka>4dE).=Afmku]ק}?12)mGWD&;uKCN_XI,ۄ T4dUdWd=? O.UZj@ dsOcifCS!<.Ml6lPVe~?]S?sX3?Mi"aQx,(ZtX¤FAX$P$ ޛgm8XA//t w^nc/&a.p:IUI `'mRi8oEld@sKY"v49GdꊚɁCDS01݇-1-. w$* dԟ1fh!Ԏe "4֚G@h1IHMD!-*E4$@|Vl' gVdqtwP[HqmRA0Mv ēTip;BESY%I&hq U GpD$ Z8WS[ Q꾗ydpX"5a9-c􆼊:߅ ^p٠ %k5guèPAGIqxF@RTˠ*o1W#I6ki(?Q$Η3B%s@ȏ5LMh&O6^ #g P LIdLn$nP;NjAbۚ+Y2i+&@ޔP-")$Qe6CL{/wF3s!lKq׸iq⼔q:DmTځQzBq&Juyd%FA7D4P&6fIED oyl]A.A .1q(=Ӽn'n$1VrMa.>u8hT%`[m V}L:Hh$h-5wԭ% 'a$ H3.Rh`QHbU@lm F.u$7IY)!QL" 3I2 fTk i{@JU tuX޶Cg{0}k*gT\&DN5<,8yzm IR 6cY ]\; pfs8^jL)8}P BNOr)vg:a_=߅Oxxv[1>ԯ_A;բ@E3=;vKD1M uLI~$HB=IV$YAn te AԉPHD* `L4 5-b =ضʃKA[N+XY}G2mpx\45sS*ie&W& *W)FC;nە& KGؾ0l|g S;uIm(ʚoa C7(*L |c l %uayk\>c78`/ē/q0O R6Qt)*hhE@7_Ig3ǥe8{1!mI3e&YőkKTV-b\*PrH#Hw["f韘F]Ht7@e&ն~ SַPl *i^PӠ$STŧe"Dr{!5)`dR AY";HL t1%/snu3u|Gnx{Ms^_>_wcbmi!j>Z Aڪ[<ֈA3+RIoUakeDyȉT{:{ZptKi(IGPc鿼*F.{_I8jVsAc@FXϔWRmq_uRbYW>Scf5MgdYΜ <&>K=epq$|:^JyW2[50f.MĚ@iMt–KZ5Kux<#v`t?G-P@5^`:eg>YY$D[$1ڡ`-@[}E-.&a:OtR $B"vH12ˢ'h ҃n1Th6\I8E+ [4*6X() R8ȑӅ6"UEQv4M!ZɝHu.#d&AhYJEiitGoTj6°Z"IQwk(l{p%qP.i3$1+hTvUAE wL;kΏ) ڋ$oCM&[X{ۭ yպnSpA]gt\{n!t(LL+X A@f;(d?O\GaCH V3l9b$]sy'UӨE(e2&la<)+JF겔-wVwPcTSbɨ&k5b=~ȍ@ idWg3ӳYl \c70ⵯkjBk:s3PDG5D @8I]VlsrVdDQ &'s pmBKdy &5#YʜdVA6HE!mIufuAZp`+wJpS RHOPM1!1^{L8VH2 PphjMD+ml0KB{tCC 'K$!DVGr iul1Zj'Hv@w"-@L$ʼna͜p` l6Hi3K[f x4, M䕉5m!!?cT4(mj Pe@ &.H5;?O_'SK9^̖{N0b8@Mn(W}O&ܗQ˳F;.Aɼ!@@#ebAR NuH"HDbl["Ch8"wZq{vDI[H?۸KzG$B'*AQVNn:$HE [)jCĐv6 :ܦu:h Mg E8|I?u9ԝjKLj>k"~T<6U"Aآ΃a Ȟu -$o戬{& hGqu\5//=#"zGOnY|='qܕd'$D sh @ln.]Yk,ɿum}K'GL4u~`1 ΧH3yZzF_;y,+ۏ:q1#b~c/,lۿy,Un#o߈?gu lL\|LE-I"'z[7S~jU [i[tˌO/Duz/z/2j T t8[0ȠgVNP] K ˪}+ ML~ ˍ;U2njx &=L/ -&D"b)cQi LK vP0"H*5lR$L-7Yd U-qktKA$ i@OE Hiid! 5VcqaU\gc^MG؛ ,Pl Z+cHtXiXtqު`=&k&n?v2S[N|QÞ>%?'jgI|ƏK<7dap.ygv~W.Exx$?t? oy<< zn6QYh^M/7$<0>%#gYf& LI3?ˠkȲ&IcZb/5.F0?I T$fd!a03in*v!q/vE #eء4Hl$(hwry3kem<̱,@&$3%| y{A*p^KCe39&.U3 JtDd HSY@NAv7~DSn QPm t ( b#Q31rjHCE#sS&>MnPuBAe9cͬUdA(HnZh!e6R+T<:pl4E"ޠ"͙@L2}$ &DN 㽎&*PJ'u7HE kkIBH;T:IF&lQ[X+RB/~fznc9.8bhL|q4Ŷ$njlGc8ڏ%d6z%^S8yt\W`E,(Je21/ L:"I_63(dGA$&P3KfT V ]M7 C'̬۰??a$U+AA(p y5Y'Zl- p5Ԟ(1?LrFN>wZahd% A$"\LQWr0KM! ".>4*f)62mhH=ZpDZѲ'u6I ĴDpV7T*tN\--p'MV1UBFIOKZ\\(dLVCm@0bmDҢ8*6nN :'"co:Lr716+1(;]$mH5rT H6UR$eWQ.C[ ڦ$"nq斓@ ]688s?l p0Y؆|#K Q (ZaBE"&EϺ(ַQĬ@BVl BOyDmcn,-0)ZyA v&0R^aSLubRNd`RSj Lz|7Q=j "A#cCM`&.HġWCDRD4k&RTl`|_,g{8C`xKqT@ۜM ̭6c 3mgp# l q }gu:Cd"fNdD8HL.X⹰ $9Wu YNj~Rcz8\02o8q{do>kl4tgp&`"P ~߲:Q3Y†Q<7e[ ,|n#*d 7:_:OYg#KD _ Bzt.3\" ;-pXHvlڿtV&LCЇH54$ Q}I,HM ;D(IX'h*6Y{ 'ܧQe1se|@/PpG nʫE-TqINܨ<̃En{%O!69ډetiZ+@̈́QF?-H5U:dɹ(&THodAZpMdeˁLf;Mjx aa OH$. M<|`|Y&i'n@ 5q5T*?"EVM abn  8j$7 oAɱ($Aq׈VGzxY':] ɢQ|\`; \\14%% "뉢Ks1&?"ۅ.tf9iR@PGr wW+`[fFV$孨KM\XAOs\Z^@ ? 'DKPNI;+P2 @@TE4AK|DU9M?2\)1 TLG>DUM4+nR7b-i&;͑*hdIfdd\ ɲ #i - DMN<19CAq ZD.L:j"!UMOV]QiIQB5UN-0_uaxtdr|<#Bּk1GLnW[_1?{f2.n 儎$,N3][?9L||R]WJ%mT&IE @UA7RֶȨ-*agQ BDԞ9[s+0Hu.5暂as !Bgt UlOZ\艴cp?r_O!lceq瀰 %5j"AjւMU"'{^BYuKXG5xq4s½W̩eX̉E/ aEIx7--E&D9EhloZdVQ 6&M#n#8lyycqe.L5O NV0GzT Dlhiמ LPT";U4͔^CfY&7;.ҩ1i6F邇LiЁMrII J " O\ ?t_ꉨ֦oz阕]L92ˆwaR=*S"vL뺋 LQi&vsisKH1]\Iw]s5Leˇ4fM{5X5CYQ/suě7}QA;%qNι ;jB_tb5Ҹ a8Al~P]5"bA̙73Zƒ5 KI@׎yThm7iA Q}[vVb`ȸCL NtܮkNgaaxf\r"@fɉ R E&'CXssE9\O >Gӱ7i $H")Z(dAQoca%-I`h$6H3Xpe~2+BLŽT H"&@ҩ2>.§@&7 a`qLX;I w5Nv#ӷa1 $]v3=[Q&p ŖCfU@7ܡI) w>[Kb:)vU>a&i1#&|&{_}(PմA^2H]BI FM8C]-i "} ؓDyjW9\ Yv>+@h3*D ; iA%c DTo&c*=NĥUɀ#ʳ'Q7N[|Tұ`u|MvY!fujؑ;-9[ ,{C $ƂbT4Rf"{t{pZ&ʉ1o$mĩHQkcR7Y3PE@z$fBfMgZ[G"g\Ův˘bf?y%ˀEJdI(AF7F}$ Rf;YEL U#LT*#Sk}d 89D (KZn?t@6@nPG%tάA F~Pb}EiddiI2YH&t84I){6 D&@0=i0G7mi^D)E@nRT⊒=Oho UB U54 增$ɀ.fnMwu+@AKZٸfwýC5:r[0 g渘>u .;(y$Q@eHByU]63 M.Jg:>8{]j9GVeG ) -f#DjuӍT4HHh@הhp7o 80Sz]sڊ.E@"& zMRnzku<Nvgx0A ^>⎪ֳX)b<%}¼O&./I`%Ù$ LA蘞);gMv#q[R"k(e5t6i< ڙL0G-zdwlD- ƣ$TI/$ՠTА~2ybjɊp)4\B6􋩤) uDDUN 2E#PmI;2Eget߆Oo5\,Pk< W<.'mg 1PE)4l(8I\n$Av& M&jkn"@T>`j94U-;բ&qޟt@+?m뽺lA]LoՌg[be#V6L#V8@AWJ[Pbn (E%!(qeBJLAEbL荔OI+N?PAPy_b%Gdz]P$}@h0'T IC\[SQK) (2=q%-i$ItXҜnK0I7Au H33+|G,ܖsD˫rJQdp|#oL|6RL`1˄\N}wAILZiT紕 qQP&(`P&&-`X KJ\p鴟_t&JRZmBBZ 4QB t3H.;(4 _-h3dVj -7 ˘~stG\%U.+ظ&~N>*gOXeFq7tLAXY A^khnzprfgVK>ɆIr>R q3&QsL~HMр4lR4$W\Jd40.jdUh Hn!@u .A"VDijSODQ;&>$]Aj{)""b7Q KDQ**ē}Y ~e<\C(Sbfh'N C$/<*48UD%VM,!54y: _ABLZmk9NlGOy $*& ZkȐ$i$"7_}syӺi['pz~\f]Y٣|>{(27A"[c 9&Dͪ́-Q,L:'F?zsullxrOоCh:ZuEw) XEwn$IiI!'S M) <L>IQD(U0}S RɂOZ-Zo]wLRX1X17LP1#QLr4qI@:H$d/K=G fPSZO1L5֥}~xǝ3gY=7c A4ᦝf0O Py\a"w)uA jH)p-P  8_|)Ծ~e Ř_|EͰ|xcK0߹oSzPE ńElI#t36CI6]h&@Yi%M@"XAtH7"Z58CZHxIomU쩑"@E€sqkf&U4tȁH#鋁d j &M{,btP`6}h4wLi",f,Ù'B坕8npsv+7Se XjaŽ;L2(7aXoIi&5ERVe@kX)A40 8GD\pfT#PJ]? E3f+TjrCʉ$PO{$"K--!i "L(U8 Ԓ& DbMvD0h3HKQt*oս (jL Plb}Sw#0T56oE``c汾^5[[$' @ ̂7?1Q$AۺHznf1'a6uKhmEH A-&=\\8l}gwRtWK1Z׎Яi؊$)ģ&ABZA$" 7S=H~h7즂mOd-fl2He u_>"?#1IkZ$~ay3gUGqG]nc4౤bTm}W8#b|7 '5ҳ0q0qti{.&ct9@ rBdpqL|785ξuWc`ˇDH^l}4xL|"ŀ[#oEIH"LpIY ;%-u5N /*:QQ j&tj4m2TOn?*`oouh"DĊ $H OTͦUBGe",B:Z)<կ)?O$fI4#u9σ~aǦ\<L$z MA@əIvo )DV ȷ#tiA"?P$WQ:dZvGI/+ A[n3,17L<b8FNH{( .PW*q~\~Z-c$AyQ4%u 3:&_5=xx*~?c<>k fM~H舂#4Pw\mv&HÄ;TI+.4)߲ZKj@؋,&|+w0D~;fmq:vY$h6wz~Yi68C;"h@YU&]2 5=u6$eF Ҋh5 VI5:AʇפMH5T GDLPo5QTZ c&vGx! &[Ah%f^A}$`ή9dt׽ %` H߲ q"Ä @́SfZ:~ iDңNNjACT&s[Ci 'rH? EE*E)NT(H@ iSpY`e4#-"iQI&by[f @^\vc!1s9\Fp c11lW\"i;LoOEm>ORȤs+9=G+\L0`H]\LCN,"D  B5|۬"ְ9FA3LOR$iQu2;Vdʩ5K`DZ"󲉓 3$@5*ڔQ4;Pe ݐ)JR ԛR;*d\`Vf Wd}4) ؀iU}&wL&N&)D`TTuHHTC/Sk Q &n I X"2 Q= "OuCEׄ vH?R-5CdP5bHyLT†J @&T v<%CLs ߺH Ura`!- gⓨMq@8uGH Rk p JP*֊&#ydw6iT4ۃ ps+3]R%`]&@4 M j IaM  &ZO«C`Y&5[ZIN.6&#ꠉ;,A"IoȪv`g߉v#K?.S/!:A ad@~1??x7u4Fôj@/+ͱX& PiYP;vVH&5֠?F1+O/`nˉ7SAmoBq~ e"dSu4$m4IDDzzwQuF^JLc-I3@sG'D DCUd@H:A Ȋ O[$] |G]?J:Mņu2{*&8@ ~T$vyWfs qq!}[1uF^g'@6.Ȃn?~H4]cORH@F#A-E42??"ZłIޑeM  @.5 w%-otIj H|n ]S&%Sb-@]as1¡uQ%:EtӕHu^&1>ҝRq^@ab@8L!;OF]HF06!Pdi) 07  $sa3.ܙ~!qe델 ^q 2bc˰h%ݐ&~4j|`!W1UTAc1Jʁ o:FYI_4ykq@4 8q$%&&l҅N<[SYژ!VTmy̬I XXcR* Id_~Qu#8.i"@Iq&#PF) =E;p!40M" ]Nsɦ‰ O~9& {}Q&G@hڴI3qO9*L0ӁpKgIT OtM2NRt0yYܺ)6^o (  j7cߺrvg;ceqqnI.#Hqtc =V\dzH.7: Q-EIӄH/$Vkk( Nx fUGwV7 \J2OEΙTi/3I"+;.yQӨ`%!B -i=j6=[ 娧uRu:& 16TG&Mʜ)R(~!Ok2rT4؍L`Y^bc; xi#PeعC]:lZl4l[Y2-Q!`+DOWfSHH"ɗbVbc84!Ca>KD-o@W|/t8#i~K;şu_/22x  D/Ë F]pbB D8E#A7X56\da78_o.vABl@5Iܯ:x{6i`ZC7 Q{,$6qD5rF-5ꘃP$ ֘M.E%I< vT욐4Y!ɰHҖH( \_q^GD=I_A@ykNm(:-$dʽOSDLLPM()_MQ1Q# L2틍Fϭ&_ ⵀ$ >1<=5TLx$\և۔֩&q<,c5I$A8l6Ϛ#-pt"㘺@%%NxJL4 =pq]10mobbk/qViaށ@$TQ]JD[35l 0g.fo_O~$g|U,ʆkq0&heGAC ;[ ||1:]qN+Hr; @6?€HP j/YNt~.!Wj*p H M3 JM]i$A=P%DޓBXbҰ&fME].lwCdct5pX fU$W}kIYE ߕj"dq F ~kɪL{ədǗ{@DЃu=44."t(4&T OA]xh4 #dT: teI h061&x^,޸oLsWN?,&5DMɇ(h/}70zFO7:ixX\L=/{}9\,mXi5s拏   Y.Q4H'HB/suFQ۬Tyi@)5@i RH-i/gž2ILLo0f &.ߎ~u|Ir-.^9k_2iL^ʻh&@@$'u$dIq&)OЀӽ}IF4ؤGd:kbf({" {B\teVm-w{r@w0"k&$ -"4/w=_-ѼGf6 y6t:τ}#3xG 1Cl +Ήq}4"쉇3ZRR~#cCAi2O qIHphS<+| x~)䊾&#͙4 "#TæOD @ %ѴwXӺyD+%fbo)Kdڧ`f0 '}L#FuEG* K(I$85nP&d@<Mh)p`@<FfU ch/v &eh#TY&A ? 7sIy@ױ :[Bm)tkH&I…` [ fl.gd8SCKM2 Hse7L{+x,'ؠ4÷ $@ZH?`zʉ DȖM ТHqM[ I@&,N3{$'$}D$Wq " ӎꬃ7 ' 厁 M s0٫5^Aq?e5aQ8v,x\co1Q"1"ѨMH?-$}Gօ@"Hb%ʡmzD@b]SZ)oT.\0CsU׉h uxK)Y$,,7ЊiA\xZ}AnuMwY 1K7KgIarv6IG od@#Qf6P0|Ҫ"Y4 ƃ[忥dm-kMI08/Pd@jS얓6@lH4<4X"JɆN Q_zq9f4/xi#fZΉ3;r٬ikE!t6< [c'Aq_Dy@(o<$EZ \S߬˜I"0jqCDTڸһV.h XµR"ҨLY ֚mJ,x3SX?UMf"h@wQUv2X.20ᨋvҼsFx f3G+wc?6<7_ YmPw;mk lw sMF[͇ x.8Ym̴fIp췗tCkbC:VRӿ0A[ 41_\l1:!N")uRDIA4,U@ qHEXʠ&*)@"BO?|Y{p!x}^ߌSRPer -y&W(P[(/"Hn&i"&MT5T6QQ"N(:s3'r/8mtkJhsѺ|I:Ix&[L14QeXDEP 0Z(ޕR)[)K`P.)%ByDC//Wf#u5iLw+?w |8uLO 12Xv#bϠ F1"`@un-kYP? #:~s 0Ha;!x94 yxKđ4R#%aڬ{-65Jn;5Lhvny_7䃽i84o5sTCdOvc"\E(6 M7`qLjZO511D8;PI"d܂y($T} BI&o'`XC(ţN LZZ"GBH*NM" QS-2aAH"9܅5:6"mL 'ȳ}kN_mZKVb_6,Iq Y[ o1.Q40k3$"d\ wÄZf Zm-?$8A.pd4VHӍDKt֣Ap:ֆ >Zp6 K]iD{iR 163u aFS rfM=Q03\5T=UHiU=T"<͓YEFjq W)@I=cHM{$({7D,nnk-a 8缞Z@$^/zgafa%ZߕyiXSEtibd_+&> h.136PAD&x}T7tjH"eܪ ܀hWdEU.qf_}{/xs?p 00qZMe [~_S^{52G's0 h'^+(p\#M~ߔŀ!kMfySfWRR`DU@31p dA B|ڏ0ÚmQda0d4ɁÜRE\@'HN"OˍdgNN04KY5oE $XS;HOk)P"dAQ#oO4&ceٙcb7 t&y,U鹷fn!lWGdA7UeR4RP-Ji]fi(Zip/H Mڪ"mP.AcuP HIuE߄\T^n~Nx ߑ8 fuy`˭~kw˜sXooK.LI53&H [Si&YTR $<,gx>..$U駺Vwދ,vt>--uL6g'0p`8 "*H OZ>P}@ #d".6Q`H ͔\cU7]iڋ.T+ފwMkU+>3K.fZ4KوP~}P)jnQ]RLz*@ͭTmOOM6bQԉS}BO 2}G G pIs`rpۘ̓%-lnv$K-"fZfEfE%.= )K &$}=U$ĉ䢺|VLEf$Y@`D9W"`ߝRݗ&T k|s1:SI8l-f=ԘGy_ Si׆h \b]a. MG͎Pҽ 7.7b1hI0_}?g2mk$WiD @ !d ID Dj @#/eƠ^SݤQ.Ukt04(5XuNޔQ(pܑ@ J VL,H,0C`36% M(-.Oxxc¡Fd& vM\|M⪂6P R=W)GM&E&T+"$ ԐH^ 40V9Vva5ծpO.Vb2Z\@Y$4mK3P08L4!H|(LWbMpVDl VH6DKwt9$Vleo Nwùg?Xa} %ys`B@Z?H\q 0hV[Ħ#m"c&I 0WY x山lstHgF_GϢo) 4ߕ<"3$y)qK 4ޝq/+3HH;U'cA@Q")):&oC&v4Itkz5=]@A>@HfM,QDjiiZl !ՒQփvA6&҃Jfd𩯐H*@ڶ!H*Ȫ,n <|) :#"6I+L"IK ȅZQj!@ia i#!"&)iu44xYvsxC:̮UkZ\I}׻_x}G%\cba4FTT$FGA" (4 ,zG_fv&Mͽx8x|0&!{]CsVC6O~ ŋ&3AMOȿ&h $Pl,&ТС;%Sc\/ =翲]#D^"(HjDRl{U0EEe"q D^"`pB&J7[ӎMf˭S@!Q^LEP+HJM͒Ӕ ]o;s##~ 4spWlñ\gJo'O(ca)a z4$CۄReG'e7z~ҡX&xI v$-CZ);{p/`8 qKjbv?4s$[{IkLFvܩM\JK:m,k3y@LH p; "ԑUD@A:HOdCbѼ 3NAC( ZfQA70I3@Ϻ tEwMD=]JIEzo!Ϸ125?ޫg߉nt %L/_~3>C[4o+GM$I1uQt= At;Mw3nVw}B@<@Hd" "}#L#-D}Ml? &L{pް? Vy _P wE.ޕ$m$7-:Q#M 6dA8̡n '#ZZ(uh AmTFEI?eHU5f6c:`HDC=mb쩯( ;Ui#"[:`EUaHF1]8aEv\@+i$7UgQ3C@ nXGn<{h֋SxGtL<'g-lM"}θAq%c+$1Qt$ZFIT@*<>G?»mg?_(4tfL,ծA"`m 1?DngKDTę蓪E@7($UCowI/@;BHִA n<4J͝R\xcSw%`L%VVOEtkjk5Y[AHA< I2HDz%͠, ҴP,;[%Dqa4&כ.nAP鰒WXU5eh.ZY{(wP AHiA,+Mʹiji `EUL3 I$M#Uf-Km+˹} 3PDH5}7]:_ZN̷Ra~f(. Iv_05[a.v`Ht6TLxxge-i0CA'y}Dzj0*M57Vq8TS@򘥯Jh{I=A3KD7n5p"kMb'n '7b5 .&۔4(M0uAߴ'Ik$X_g2;'хr.2>Cly[.f f6(boZJ3&>Y&=˹84IuQ&)n0IFlO[wUpr׈]1;J8b56y4)$զd v% UCLD~vYkS(#%դ;iRpeCC`^ފsdf6Px'˃bf1CeqZPo`+ elڣYCQ>ei֕[8/i3 Qٜ307 ykA ?/r>+0\X0uǔҼM # 8\Lz^H+ʤ;.L lo~L8{k;HLN4MA쨩5"A 'b&|z|gc7d ǝ Οк:O4Ftpț%ڜo AM}}4mIDǔ[n!-: waugITniQ&PC7'RKLTV#EB`ɽ{rmna|Mat(EH: >EΟ aDPL Xz$eD BJȧ F6'H^T(";3$D4A؋oTU`U&y@%RM/]3LeLL,\6cͷvW^._^90hc_I:Gu[Z z|@wp 8X.w4^V[YPH_@u|4xS1岌c]֝XKIr#Lֵd@m^@CyȽUu ce(^LLYND ?ddT̶ +S$ t.Y˰ﰅ`7/~+^hb(LRyj~ :޵]ul60aD#~U00|&j Bd @(>hQ3/Ji4*eQ[(TTRTҠ+LRDD_hPyHNf_K`}wz3 7K^P銫UI>L:o]>TaY}3~䰺_  1Oɓ$Tv7IJJu>jE8ASWBH )$@IYt+4̇Dlaiq6g2w4#.%'sVఽ0g.+h!qi^7`8ITAH-[gd[n+n_៪W64K a'bJAYk*C&2EH $ho;Hs{4$bRMXQq.DA.^Hȱ*f VnijYD& k`INF^H1?nk'xZ NMs[88r vGSeK"D*FMi$e P8uJ \Bl`eh>}PbPZ @V >o(B@ZVDCΖ:اk :`[fsZFDP$}&GHBd X@TΗ3QP `Z53PQNܥ8$dQB<5I -CDD `0AU:J7_/l]n-L/~=A x^18/NK 8 o-)]s ?6Al#κu'iM&@ܢF^sI0` ih0R$NB-T)G?)m"wJ`XSy"Oa* 0'`2vPF-;-tV 1 t;I1uL:&ս$tH{X!$PN`kf,SR*<´ l-%@ Ɂ ճjʭLo*E SX5puJA4Uip/S."Q@G1Pz;@Y.JgA3;Fe=Tfcf^h:b4Vldw~#eIuDVcBHszo40ik\I.:|;PT6@p&i6U 8kpQ@+)""QDԉ1a c6Ȩ\&L3&(HАDI{ǙķE;rq0ǭ&FTxd$B';E`aQw40;X '&Fhd wMp7 鸺ZE=QXU@.(i鲢~0! 6TW؟Z~6iZ.L|<͟){7t8Y\Đp CG5غ@\?ap]%]qVnAPwPW@<Ptԗ8 Dpj9|G`KlW}43I;Y&b?ΐ{^Ew 3e^fA{ "8Oehq?L…($ C) O SL(I264b簔Fߪ@Q54(@@,Ѝ&/)N;(MM+~tˌէpPL@ ۙ+{-Lڈ7)6$KvV%"N'TR &kII OA$ͷ3MUF^6P`a?8n[.ܠ5$)SD`3j&E~h|LFZ6E ܭPHbfu" PdC]$+"@۵L=Sa ih'cĖ6HSv,e8xGN.ޟ i:A4u᎓?:wDx}O)0 QIa3;G-O9}>$?.]f`9,yc" #|L^:ax3?aPn  whaD{,u 7T*SeX I*K_ (֟o~+)!ԍla ˛.dIiQ+^Rh`%;T(hBହY%I Pd6beOScR7TE&ťGsH U?o.&iC22 :{z LM sep߈;2/uZZ%+-i&E 舶56Ê$6hn@),yuvC1HP-Xȣe;FS`6pLE§M@`4qd4 5ʉ1"#[aD}Մ]8Y$K@QjߕAiLvPTؙ.S)%Ā t|L; 7'g^ql:2.96\ddPM+N6Apmi[µ54$yfu4ҳ۲hDv-_"x4(}\ށ@~땘25'qkI" hawqpZE4  Cmɦl(+y Y eY ;j0O*F Q #)ҡڌ+ L?dKI7mg%Cp$D [$ ]Wz]FH1̪Aoz7y˲x'$W笊P KgukFIqּI,jM6$OEm*0"$}TgZ 6I EH Zp=ZA w@Q3JiDЍDȩ-M%vIǘ ȱ*A4(uG>>1C#q *)lh=P*|MdamfTDFh8yAw(>a-dTCo1z._-|2"Ll8H2@lG"'b" $V?©&CHeBm55Z./^%D5p]`@&}eF"iMED*x}P=ݷ{LvOu{Dk sSA1H1JYD:DDU .0]X[$p+!2n~_e˓xuSsXهt^I$ (Ɂ!O}e И#Y[/o/CP1r'{/  ʨ[CCXqSd(>04Q&O{7hSr]d0j;>a!Zq5;]@AQDW6Q%#먩be&Pc[F>,6ksPx8œ T(y{-1s5HhHND T9S`e":i%fZ5|=eK5Q94L 4=T?qi I*$Dɛ-!@"B>2֒Ynے @6橙m}yQ]4P1*knd׶A*j1~ArRIp EĎcTnDVP(d $ --0bΧ0%"J$^- LuL̂ 4RM8ɡlRzUTPA͡PKxV\v\̖>I/15 \ZA0$\A2}J@Z*En T{alSk 89ha/$.7tN0VA"$b6L =5 q%1xDuE372s$6$l $uL&ͽD@HEB`37Y~\㋉$5fA{.Oٯ%fK9hglVPyH87mh7VIk@kCL:$=8>" ID 3u)4uT(e*K$y].h2RH5l@u P9P&tQY驵t9MUL즙K[ߔ$ĴNQ=>Z|EUH*+GVʁw+Iʁ+O> ~4C]I;$X=1uW'^7ԛԲXk1Cһ/` +93PL>*NPP AاP-4 Tg;ãqa:jI1sf90Tˮoa 6@6ZO ~6g"v&!y%w\d p$7KIVv9q Ht6䲧 ?^#s8inA;.-DfܬǞZEn7^G\㜻+ ԮN$8!kH >SaoioA1Gv*A -iؕ:sʢOuU5߲U2 TDM{,}.G5$("PE}n >32u7 2Rp&.%Չ+fO*:;w?HŠ]yP@E!$KH?ukI@Sui詚~e8AIDt 0j E4T}Ot,F<4f#+3 gq0#ZcP]a@ T LgVa~C(0A_s F4HEUvSu{"IA$4(+ &Q#MOvT] 0ΣKdiLm;E Ӯoù/|׊˵Ihs .tF[ 1 3\`jy l0$UK:hvP E Jn@;RTfER`6A3'$즘oi6 (2+}4Ȩ+~??r9~7If$Loċ+x7xT| .%6)i @PmU`D{(Y60;GKZ`8ے0DJ_*5nOECZ csL dV#QhTz)K}3W\w D~5TG!f4]*HݒKYY@;R t6<-sZzoog,~O:c8[QY&{OPO4Mp'lį"ᶹ[ c 8[D"HI$LV`^y 2Z&W#.^~K'1f֟+?4GOIX M_u\2W-FḴ=t$Ч;WC$z  &DP3Cs}>j?SQ'dU@":m)ށ &}**"b*t#y ZMUvJI@*BdF*u4hB.hU{yW`Qp]ΑU{ MT@Dp!Z=,$ӄ7!T&ҐN1Di"ܾ/ ijX4؎ˍ܉v<Ιr>IX 0cb?eϊ~'x+.883.|{ޥA9ۥ nHm  akwDt (-AmU!{@%Ī|P=-bb; {b'up(hsf)[-3[1YY35;oJY$SiOu8O0}mt`]Q~S+ q LJFIPBI"i1-dA2йY-: b "mnoei4U І`i '{*H[tY.PgP%OZ'lq7WKvhx]+yDʮluUB@(ڷ?r$y&7F]76V&e- >.OgmUD:tc"&&(W$WYIʌߜ8&}hltqMf MH$ DHId#duɄMB$VM!r3c{ U֤J A5aP+.3$w+b\|LƦk+ :v\N3`,k&I%*$YTL +uB\) iia'E]:c~(0OL5P msP G&"PƜB̃ron;q'ItN)='T VI&Fʠäqd$ wQZHZ__[=IC3mikqpD"}Ku_fq\^LG9t'DW1xP0Qzo$DJR@Jh'MD-ZHtTV;$v 0 N0D9ˤ*Dg6 h$6A Qds`)L:i_i+ҳyl. 83BJ2,Jn[- 4&`7pXmA$CH@DV #즺4}(ODA7~Ꭰs}#71F.O":su>w2'2C,ѭ 9֬ulbBR(ꠀZ `ȑP"dBE4.baSmjꉧ "#O8jR}'(nl0jDvIޖY'6h`_t6#(#ucѣqH9"Z>VyF0 EI7P\DHړIczUsf'8LjoęJsIdۋ($zR/ %Į(U&LJ}8k7[ip >_$ ffMf0=DB/Dzޮ;68 +7hC4IӶ!ĶoA`^& 1p6Y-GY&(Qhq !h& xkZoJ⣚HE* )P HK}F t4ot\"a?,m)8d6NbCnUL]gQ"v<]PkT09ZOtM7t@R&Q$o"%DUyZ, Iն%(~biS $כ" )P+Md8_&֐B P0 Nf˟icA'TG5U H*Bk?л22ؿ%Om ^P Le:V"gt o sg0-k&6nNީ5ͼE)zrc*LT"D (P@1"Hm&g/O{LE(|c'o$y@ڐ+4"LYnHhlkNh)@ vVHQ{@*&) 1p%-i  oMڑPfZn!ddM$@3d"5*#hL5H ^ fc-ϳ^[7Rx5}LE =C`k#층7IX.nb|'< 9]nO|sj8UבW=n=&`cSXZFˑlWV@10H_嗥] 'ԟKp- TLe B+$T HH545.. 3?Wń1΋MD&9:`Y@*}֋]>˜c0鸒I5Tw'ad܄LTFH qHDm*jI i"wOulssX^@$c:[$38xn>f5OgP5ql؈ Ȕ7@3 䬙b( dH͢T_115 7U J lgIީ j! '~Õ =XWmLD6G;TJi?tR A:}$R2$fYA?$y& L ޟvT d'nQ)I@®Uqɲ08aS9LJi.H~c3 [aP!@&H:F.ڶK)` &Z|E 2[U-|8&@bﴠM"{`ڊ@H߲MIfq]0ba+^A vHJ޼(NEF}h4)=j*+eY;(}d y_]<7r^u 1:+Ɇэ|&uCi-4e#p/vP fmI>H7ǖ{w]Y,6#NִX.l7iA+s26P&}`NׄMb ղdۛ(8pH$q}rNZIBlA6@-@*ߊ+6$$pU @>6Pus\%D\ =8UOw7^L!\QK[Wc8:apL1O&j>j>v'j@LiJ 7!B9h1mlj-QBڛP$.gQ=eBIb!DC/!~ i35z"ݒEQv 2iI I0"p7u-tj:S 8ٍ 1^Ssr.hTVfAQlD{ a7+~eᯄMxSMpƋfm܃ GAuh]g i^S0  bfy)iPd46\vj+I-OI~?LDȁ``.i MDȆ✤:ZufG4T' :bwDM䋛\\`1VXl8T:L@Ͽ@t瘂hvT֓AX@j$Yf @s@m;mŒP@UcCnm`IOrA H (oH:iiUiFSx]u |cÝlNJ2^)I<ˈcE_) ȟJD4Tּ&$ V?ᲀ  g1[|9kNk6̦gx#LkWvkῇc/[`{0A-ݏ'$$"MÓu :HytЁSZ"`' ۹<dT}He % GF>?L^SGu4,A^g7c7qUD_@1۔Fap8 %RVuǨK$iEn_2L u LY7@ HjT~Pѥ$G=E3BSSĤ)DpH nS@j-GAA;*O" RvDpek qfe,q>\f5!ek7c=- $ny+:k ⊥L7HT"#e 6Q"U>r6KptF@IwP8t$J$@$R85DT*O2NP`dv*4*Elӭ:.78YHu`)\b" ?7fpaTr'v56p{4H5E$N 0d}(Tޒ@?RL hxKtY!lxV]I^hd_]Ţ@ttX$ փDbz)>hP wVi y3uid:$>[87lKmvZ a"U+.3~= jL 4}T}UQRSu?K i~ 7̟C)gztg0X>R`j4n!ip`q8OJJ*i\Z "H\C#PH.9ڤ~8D DE"-|1Ӱz]eOX.hyLV _.'Sm~_T9o+4tyu˛2&.-,v]cmPb${!X#E5MLxEŻ8Dt:6Z51ZBICD "mv,DK @6 L ;!" $5{w&"Iց] ɐz`RmUA$ͭeA]dΟq`c@]cWo xY{4Ahix`|?w0ؘ81%EceŤ)}ִuA; 0-b$@@E \DG(u}b ?tM%uD*{FF@fv .7H>Lֽ\h P&)]Ft@=Ii$d H'o$T $0y* 1*X!@Mh5fѣ't'uϓvk6 Iy_I ?W<ϳScCEGq u$-`|fDU}g(xŝ8^0pZ^dU ڼҲy(l}Q[nxD$hi$ș" @ޫ|ilO),ÀׁYPl\-!/kc $6ْAD74[ڝ<Ϗzk_ bߗ{Y1'qZy5A5Mn'={8D^Vh%u]T6YtȀDUZy@0A .l2*V1A$TDv]Λ3}!0ḃRӱ],lG8>k+覉 ]ng?8np?riw:J3|0q0+]Ah!H3+#xd#EU`fB yR`H;*$Vyi sĀ\jO )McHrAP;X`T(itȯl +Tc&A6U*UފfU5z**RPUi.a\E7Ců阙h,c &@.M O{ X&b{/t9OQNdx .srYL \rfejB%0jM h jZL]!7CGj=Ӈ,vWպ >F`)1^i[e:$p7K%.#/,h\ox-O$!~%|4lAKq '-\&6bjӆ &<h"I.3T i2V͐RDH+:CvtgaS$7*h2܃¤'"D1Z$56Kt€4fk.ޝzP D7n5 -Id9-qhgi[71v)c:G`-xp"W`XTe[+O/~HҲ9ɯ &IR-m 4즈lG ٌ9l L@0qh:A`qEGnh7s IhqχY]7g=V2rka%B+u977*q$7i).7sڹ UCTWE&\u(?uCəQi ߿ 2gaeOc_D 4KAA)d"i_TAaW{ GI23@5otshQ3M!v+;qG/ ؀ eÈ.k'ܦkN%[&I]A.hD~G` St snBilIFUy^C3L||0.N)ou~Mw\ؘ "gdq3ՌS0W]Di"}Vq`5Q &LRk |%_}_油fܱ;缂|GSؙ<6.9IE#cVKAr~6beK1Zl IozBMI񲉚y~_tx") zğ>ѱtQonUėXl$L T@MdQu |fh@piHZ@UKIPSW>!vYd= \TA0:Jս/aA]ˉ4?D" hHT E~ DNH OZ)ޑ0fuv'oI5fo\p8x\_&3 :5!rH"3u5 bв i'Uۓ8Nf. IDbAUfȉ32W;zr0{ӪuH7{;lcL~`Ō_`C0.,aj6`PgM&dPvKDM 0\Ӻo}3#ྟΥƖGin#^֫$NU".n* 6l* Gwd 4NFfw@ R ֳ&d :6YĨJgx5Xܬ闓oLMm0@.` kH` .%z]4S5@@6%w@XU!pFo=AKȀIHj%5߅D ~V]_xe000[a0N9^n p~^+RgoWnAX-sY>bI^ RW6Wa7;ǿ:<Hny2\vuas0+_ Šv\/8,e uؠO1W*Q{AvŽ?E]^.l.9# &f&YN!'eϬ"(D*d^eDʭd`3@04pdDLVAeeM@yDT$b@>3&bHtYf$ YMf"'օrab5$D@ٚk!h3@W#t$VV2&mpW30v+Ot͐ 0A4"DM]DԚk)dKfOBhoey-B[#Kz?&Wq5D3TGdUl&T-n{V$~ޥ-X<6I( 8DJQ$'  }w106ZX r4M"n(G Zkii]`^Oc#ұ-q^VyZ:t-@0tK^ XvP" 4}LIӖ xscP*Va3Q0xœ!+z$2ALLQ4V,Vn#LȿCAM@?q݄p2^7[=0Ix+iTu(`m+$[%I g=e1 6 &,d8@4w[& L68=c .?c<[+lLCI1@.WwSc^鹼8h?/1X65^N+M" @z; 6`]4 dgR Q=6SƙI!&O*"Af4䝗2564S\)pdLI‹a!FkqE # v)>mQ?t4\ٞ͵i6 %C-8YحȽ hQBQk@SM*F,&'ܢ5) ]KgQ)vli%nȨ@ykU"Oh*2dֶH-;B HPH؃ IFE$(Ğ9@xi ظ@<_H5PlCQMZlz*i F_? x' fw0fw.18 ڊT3v2wc`d9\q~"]B$6&HA h7Z "vX&G eۊRMAe1Vih3/o4:v]O+ȱk |q_K[zNz;bfH`,& V_ظ\\ڂH+Owoe 3Vb4[ړU:ߕ}2 # j@5Rd šR4}bP#*8"bTXMMt&\~k. 4j:D4 VR蘮,qODV #`m. j&/Uk:2u.λ5h#KkL?oL$}b-tSIdb><69A`kLq!֎ɁϪb7gv#Zp"u2Xx kqD6WxSK8wa0:p{=®3Mձ:dMm3be0;Ppl+Xsn$zr k&0" 4P ;Dd ̤:o{$I YWv\ȷ ?7W]h +f`[)qw`P_B?uʀ=U#'h~($ B zC^+r{XKL7e{?Zˀ|K_a7137\9@{򗰵P#e. w_Cc1t_OP@p#b&hm;&\I.&M֚/|I6H=FQK\uLnjZ4<LcDDL<0'`9DSJfn M &ChuIۅƏ4bI{(LTfeG! d:^o9 6> iym$Aei8x6":h;(ID0v`h%3:<-5sTb7A$rV 4wobgu6i͐\+ 6>q&K{.( i'ZA;֥kU@pZAmʢANUB`{.\LL u콞~zv_#:k1ʰ3 ŸMx  i:OS!ly &6̾viګax/`a` O^%vC; qIToaojbkJA?e;0[Xr:LY00ps3h4 b] s9ayF6_^Ժo7c-@sdU}W⸥ؘyt+P(1^R(" A&f@h@" @&ZGdjptbfoAfLԢ @?@H$Q6y&/!65D&d$'p?eAou sU`髾1$yLP bI$Y"iS8J@ˉTkj*@y' q;}s"ֺ#nZ IkȂDǪAus6R w3KP5$AmyPIght8djD8DQAS[c~  R9 "O "H)F@P,HK D1XSN A'[ YL11o)`Y Jf$KM oU_ar`Z$ X&-Ei5tحڝ76ɃMV@3#ޠ CDI, M`L%5ZFwDѼ}6"}O~u=h 忨̆\ִ\xC5Һ3Yw,F:(A"(ƴRy\sMF+m'ehR!vA4$=}~2v_N9h:{@\?_ p5d/NS @:u  ' l%eLN-h8rVK&@C7"$Ek"qƙ#{'y41OBi41'MU9dFd]$OHVf+B@1l"<5lo~ `lVƬHhZb7F!k!@DB[ ,jujE+ ho߅L @ GȯtOa7n$Tg1cpg+5aO<k8s].h`R߿WN^'uQ3qۇM%#/W_ _09S f P0N$8ZM%4I;x~u\/{ٟC̍٬h@/_eщ8bkj1@<_t9Ҥ\0$QsEOc1h3M][_? 0Xgh4h>9F p3!Ŀ/6KD)7t8N-[rQ8ˈaDL@$V–AhH!AT^BJ'oDfTRA6HS-nRp]v  GNR$5 D'HWוC=RGWa }>Y'ut  7ybHөjbUhc4 L\gX}0 T?X=V`{i @H :-?NIA]f" EKvfݐI QDFk**@*~yEstI;")6O XVr7IE]^JMD a}w>#g`;/^͍C?ƍo2@\P?oNiD:HѱH0i-oeG*9,<2||3dA(/? 1{g n&9b&)gObdn#/EWX$pyc$z#R QCiBfN'P;uA+Chߺ0kJ]`)ZvEDuV0.%rc?/k^?{3cf10qM=7ZNLN.s 7(@_ĝC5պ;s TI)2E'ROlN$'j.O=yk>q3ؓyr%A)'tEJ"I$G;$F de6 IHDHK,Ure݊jQ S n ǧE q:{(Ab; ,5>wzóxs[9DžY0_6 ]C&܎qXxcLuL8ڊބ^eY e&sb ˳+5+>\0:~ݡxQ6eM/+el'e%.We *V(տzcD`*SGv\ca`G0.'3tepn>a#byPY BoiKd5;"{d'&~ʁQ>`АH-(_{]$ )EJ . 0] | ѰnW2p$;i;"W~#u&Spm٭ԞWɜG_` ռqPsX# :a&DX;BdPA5}-Okel.<|B}I\U~@te#-%BM)I5Gt$Dr ៘<@4V4LoMJdbv+p2K1g5;Oc eZX`pgAdޅU؈"H C(HrL6B&%GsSSA^;PQɖǡ2Ցl$ yET$wgK#D^YjZmBWy  ּa BZdRcdR/O5Ն?J7-* ' O+^*a&d yTT O$@\.\]A`2D>/Ӽ=Ȏew /I$+i) -47ԅT("+.JbDrR3W*(DLk?MY{f@A\ﺌMvPh"bgi1&Dm u;3ͤyz u~2K;`@ wbE$6I:\5ȅ&F cɮLraj Xf>_y;x~ dq3&N])5|Eپe㇆% +$iMMtx;? 3S'g28b11 3.;mc?q5u Z]@8Aq,hZe3*mYw|f, pܦ8n&" hbo!=@,p"hRI@ c$HCs $k5ZdI&{Y.,G7-pE9ڋ1y 8v}3Lp[A(/3sp1Bb`XhVѤ fQ:@pT0^FS$t?p1qda5؁Iέ>܏Fe ˰oi׍$r^8/ 0+g\yi\xM72Ӳ뚉PE!l0`o; }Ϣ[{ I|ևy@B.C.GPK@$gnPր :LSuH#d'c͕yH`E,"^ G(#ho $, i ƫek3/\/ Vf)4bl@Y~XGţoiY ;ZE!To Gtw$%DqL:->PҵȾe P~q,i5cf:S88v3bBȯ6C "1t]4Q oHvg Z$(?*.5&H"E Hs?: 5bpHBEĊ uQ.yQA7Z$4OdfK*$OQqpMi(dM w3u43*YRo ^s84I5yfd&06UxlD\M`Je+-" Spݬ#pS\B+ ]굉dR8DH@E:? [q($ԙNCMdkSd ^|93!0~f#0(͏$3OԶfh<{ւ&&)=!Qj"\%fMZ%p)[+d)~O?<%к|6ީhvd* vSwTf%SINתZu"oE@gzM coyp[I0-D=vM _nSmvZIǚ(C@0N"6 rTba`dS-DZD.=UQ1YU4Td}R.LDpWj#I";HtԉulSAӤ\] tPwXh=g-a? VI$imjlʸ@>ZH'@Q͵8PI$$Po*w@C`A$" PCa? ,OQ7̐"`JHAæN" 1ŕOq~Q- O`$}SdH;DQFZ.`R.Mb1Clfl:ި& 3;"A&ɼ{E\q%u=6a.c1'SQb goC9В/Ix #U@qh&+38sZs`f[2<(`J ⴚ G&~ˑ7X@8Mu %`"MP`_l12#HQfĚ#u L=1MW={=%zu!`+1e^&r; . :"Wo㯄?7/n3wc^1 u}~_"KR"bD3[7 qqiV92AZ-zcc7L-y&8^U4L geiQ"ډ=ahpa}cܒdT؀}Od<ˆo #{Y{0@T&e ]e$;* vjb-q"O𡮒z˥n}^S_[U0BlU:1) !qL`R LyPA$H1yD#nwPl&$6DI0{@&˥A3T!`A ExTyI7plR - ]M"$lg=P4Si$cLe4dMbO8[<*d\$O"+Cꫩ?o{7>>L|'4|αk7k8xnxޓES0 .2/%C/1y^q_d cX mu憓Mf`=h8ꡞЖچ9abp1Vc#ꉓEH֒H,P$$R!3$ OhkO`6d ؿ;@.O5ު-z"1 ii3"I2U5mi2T TD ,&ge >St">ꡤҠGrV@4'!DܞܨT* #r$^Z+ x[<3}7̴q0Cn]'T'S~{gwr7A A5[n $.L5A =f:5NBLV-oK•Q>inL%0׸R i" njL}";*tNM4Ei{q pZM ,.K2L=!z}kcYa^+$!j ;"iHۨF('i!FsssHy ]~YLG7 gKNDziXpA}"zAV"nM3nuVIh?eD2bv[ݦkAϩ|3C7OFw,@IEō|5P{}#s(х 02 /w2OVa01Qj>tYe IqB90ZW݂b[U nq~U>Nq]XY...m]Ѧ/A2Jda;Hv $GzrMN;@tA;i؏,ڋd=:`@@dA BWF6Q3{ dܨ4+A $"{׽ᮃ#7oSج8hex?' FP R#{3(&&. -ZH@/+)9o~+Șcuv8""*]G`9#qX٩ uZHJvQ@?TGQUL$ 0"AE A o资o lIgFw!eYxnsq7] * 5^M/0ܩh-Āe|1an003Ns1k }yx7sb\M- &]xX7 %$ D¨A -L:gN0劣Դ4Q pPnTZyەCuA%5`h~Pإa 4uoG״(0 Ebw,-$$C_dD6g2KxC N] 4bH.W23cl* 'LE6D47~o uH3EDAHp+2`ԡ@.z-u>ZI ިkQjI&}դ@ڶV`xCEDU0ZA}!&_§v#Wum @m $f 6' Ѽ۩I3Kת$>jFMGV(j 0#VA4A5.K͑ \ͦESbJ#0Ic p;…iS\KU3a H}&_5ns`4]Ov$4Ӫ`SiݣZRT9A Pv)1^x@0I V &A5T&cbtMO1pe088O-k{H%hsHb<lIIwscŠ\hi* _uVcwG&BH>M.9&g;ֻt⧂=.29S;t w1@% E鳌kCH1oƟ;_+f01CD eK&+""8k!N4:E-$ mH@dh]DZ~st(r $]Ε]gzn 8 fDb?+>X7߁yf# ̆MyD+W׹Hfhu|?I^6>-cOǔ7CT$'DKɥ{ yPuL~iHH̪MM@Mf" Z{.FaT@+Pڨ{=䈕V %Ȣf>[v:o ̣pYflSu)[$WKo:@e}@*K- >Z D^)UIR1(U$L:*$ K7զEc5*1?"7F~ ďAV7H.y#*#bl2 Q4VH JQTǖD @>K VyT'Ui;"! Tdw >@qg ](+&vDw():"&Z$=ڙ@)}55Ra u]Vh .:Hkh d XJ%dl_`5.da8w}B:g:[{䲥<Gn~ȉXh1 7A#y<%R ѡBL|cK͉ qءD[m*HlJtI;;$D,*LI|dH5%oL\z\\s"Lg^#gr A~əpn%G> glzUhb-%ĵU#Q$JA5 -${Ljֶ))s`HQdyn]'hCT Z4 1J vsHIq0 @l"gȶ;PT&&E+&IZA"Y$(L5KA5]qX̦.hM+iJ.?e6@ɏBd Kl1;dsd(ւLPD.L`ϛKn{5HajD r됡>Ʉ e>wSf5?O |23abt:+oï)1r?i$C _=,#,bk93Y&18P@+ZI]k kq!$|&Ci$DAs!Bb\O@N @.H4$G3fmV"-nkMkuz>$T3쉉iʉ @34F5s'/kN iy.0hUv!cXLMtޒ[ 7^|0l֍a`}N a7bE=n_ vP,0i}Ź\tp>ʂcʚ9j{laˍb$V+D81_D8&;S:rxN0$.tUǥ$eHsxI(*. M…H0dPZ#H<@ |4i"*d кF?Z|Qه6 &=|SMl V3_?b$$B8_HcxEf,=Rd>bti72"#suj_dxA om.&$7Qi*ڤT rऒ٩Y4h$),{K`߽n82{`IT/^STA`A.lJmTQVG^BֈR,hQf-uDOt,x#ҳy 3XvcĔ_ t԰1ng ^{i:)h ZG2"k:Igv[V&D"kz뙭VߡL׵|gGRd2 f>$NX$Ӟ2PVK91\ F64b84M{`{=';<*$ y= bKl+jڰd AyHl8H*iTIpM$b {Z'hWCD # UjFxI^W}djvQLUɁ/qkCgMgÁ҉}i:].hSqk$l֤Ei 0i@H{0I욐eLtqtЙyN$M^$$`f{CJA* #ay+#>QmZjBt1 ZLW V"d_7؄UbM=T`BnY&vIR_MRa :eEwX i.eMD6=#Hd.4T[Pqq$yfLyd1<- }_Qul&c1b0ҵ>!A~<+Y/{ցv_"]yxc'|n5r_pO xw-8xk?hZ٥!iK>г=7`8MnA+%EGuLNd cpYZ /p ixP FР*d,琀! @" ֓BdkhI #j G 0 Xwf*@?1C`d_L Tm$~ ̎Je$ɗKn"=AU͗83OUM;~&ucƸ`3 I$~!~1ٜ1b5C] Zn$PW;:8ɻ*M8O!űBWL K $'hLex{ֲ7cb5$ĕ~}c/!~s@su%!Plq#ce$>3Q Ђ$E+5"`j doMB$Hl٫bEOe Xɲ U$I;J";vYLag=C=g׳1ճ3_IWWc|7]ԲXq ɜO]K/pL xP$AȒm}M( 9F QAP$&2lUa!B"R*;kYY&E$6 dmDBd~P65H"M#-u*@EU] 8̘C`Q @1aɣd q)2*q1D*qH+ZH 6;jfցi/XwY=覻P}. IdFTТ@!'Q*i3"5kILL"sw*<$G"%AIS?PkCIRb &t\ $醈kLӀu4xKd0 ,-`:XԠ@w*uCȚ((D= 0AnDz%šfѵl56A5Hm"&YD'"b"hP|`A]EbE&hVGS v?Q&J\?eˁ~hi>q`2@ L^򾃣#u/fy,uccaa70G0 p-&AL:Ll i^t DDA5ޫ8vTCXk_`kEI撢\E{Iu}=i[ թaH3 PV*aiz$/{I+*8@E(Zmz$-z6b{BDQ)YU ud4 BwS5AKnd>O9/" s3ܦY"bhF2MM8+6ӨP ڥi XBO@v(#Wq;f~-% TLp%-q`z{@Z*Ioͪ嬉" ٘yZHDܛeQ3AM"dLu6I-p0TG14C>")&^[-#~Iؠ}Fs ..dҒ#j" Rj .3rl$Zj0+OxcH+/`9"5LT˦.W& [5!6N˷ֺg'>pY3J$"$UɃ+p.$4ez=[:K'1pOH^T)qL4%&KFa Ng?V @8PERÁ=ôvOeˇ4<3X+y@‰$ p5„D{qsgĹ&I$ܕњH *y/O<9?\ !ڌ'I /9|1қ2xΖPs|x3IH0y\;V:B|]]qZiDڛY?" %6bvGtk.#k( ɬCiU 5D̔)& W]n;:`(+l"yd@!Md ^poV%4s nPx{ gyCix242m}A;  q*Gt)(/J@5ܨ-[]b}6Z "hoYmtO5se6.S9\eZ/]NdךQutu:^K`@3壠U]bbQ2lT3kYB:Oߺd֪#[0}~-,ި2)+U/i-&MDN>K 6^[] TհX]G;ؘ *G]G$BbWc'fU.f){ DJq";8N&<RP8z)2*gQCBm[ .9KuKeP Yh@a"? +TI$ 'sQJYgS&o3ʴI4WCdi1KlV@ <ֆUO $,@/"".ǙD;IZ :zUr . ~Vi43'K$5d1O`DG@Z"$wZf92GvAvKm+0fAIY5a`*q4|ou9ch:5^KvHN֠AUN0 2 Jj(`RLs f h21 $Kw(J <PQh#J ֩$*m"+4yjm0B"7*b Ji?i Aq'{wV5D"Eld)8ܭ%&(~]V'h%bI]Czr.*/DCZDJ-7Z%m+.FƼ;9Sj [mwgRgOkc iyM*?|KRU$ IÁU{?ŝW-9Vd5×0_mU};+a{:ܧs`8/M3fk9imņ. 7:?,ONWEJZn:b%DHꙀ)hyhFUuMFsXvepߋI= M?/Y=A]hSNAZkxk!hw$35VuT`ITf ȥ Qg$I03tDDY/ozNSfY2?ӆf;-aK1Cؤ YCI #@ m͜E9LۨKDfSO6dj$"i꩗P( %ƿ[P&hk f0#I U )*`.nĮ'8|6yY$n- ӕ\A5MA@`0\9\l?򱤮48Q:D; St q]R]ؔi`Q" (MDw+MdEH2 8Ddʊ@$ )g<(,5Cm @ 42aAqr?&޴0u;~إLp!)_h_eD;ICdURho{V$A17C١4%&N*4]-{\Iܧ o!-+^ &A[YvY8Cĺ[{K!۫pLD !A&b1ǧ(2qU:XM=@EupZ?A-JiA&~B?|E/ .;P"%=GDoE]K~#UЀ% LW&&[sIi2+ܨp6T[ /CPfz8٠w^3gjdp3(}f}hsچq> Ҫp * Iڊ.=%Q *)NlbcP3B] |&\+M"~T 8j6lh5mXH&S!g6bfh3C,irOR& h"A@3…d<E oH16&S1BUj`qK& QYТBD0gn/&uYbwQ+E0yէ%N$¨S nLhĝ& /k+-2y-\@/u \LTeZb7Il]ye@Gʒq?V֥Z&#j }>s^RH @T#ULB oXV$9o){PYN@T.f`r.\{Q HnVkaLꙛMDLW /M%qI**h ߲  jPK9tϯ;!55$+3"ːa=/CEe` >YՀ>۠=L^uk:a/7+IJ>&[S1jz| LP yf+&DP8- 2 ygߺIvr"IE1"D&EShp.$҃5#o49i+!% u8 v$E)DZ T8 h1PD(2DN U7GC`p97a0Ը1<8 Y Q`Ҫ6 G+ xg 05zFN|L |bab7K` JX^"I~ R&%P -" RlB"aA@4G D [17꾇)Ncy^Ҳ؃0;/pt컘lɞS5Ezk?y,[A3Sh-8\!͎-4z.鰒vZF ݆_B\{knTI ;hB=ϲփD"Tk$;N2;=1A@,< H"vAR@wPi&"$\ )ilP ĉ?uIɁ RH.t%74p9Y7kN@"$EBAL[Bfz(0BD,3TnAM!in>``z, <gH?!@!4%h~H($ vPQ&c*)2]"Fs`z9>yq-@yNq<egKnO( :^]&O 6yܬ~{rCuT'*i1?T.7AkjO$ЀdF͓ZPb 44GN?պ]~kp2MR{̟H#Z kT8Iʦ %(ιllfȬiT:[3 1 H8fOO+hW"bb6I 4{.g<3X_-kDKEY° 9%֝#Lrj üުlGaA<+!@+T=Uj)Mf"wPTSuPZz-ßR Jb1Ml]RDDilE[KHqѰ|_ $I;/>%x ~}3,_^oAdVđY@sba<1h$٭kZo;Am"Tﺉ$$˸ 7G5༯†1pzfc89\X6k6'9oY?=|_gyց$@VS o_\9xY:M n: "1O5x'Ÿ [+ A-iڋ.x_f^+p$U+-VA%";KCEqtP zc ` A+4WQ#4Dz01Y(.|g{Ct.rUOp&V@OuY&?)sl]Ki6.tw@&&HhE)xOP:l~yGsEe"$C3Pjy0 I8GInS$4ҏE\Z;Na Z+~|F7P\eNjc'Ku3z6ml8/,3nh EP2߱1].FK/Y]Ωp،89v`0jN!mNKƖ$[OdA{E`T'D ?YQKw.- Si1 u#tI)\ -&A$v*qժI0+Qf;(7DpjMCSO$d"?E ۺ;R nMǘW{!7ی4I #u67Oc Y g]K'9_+gb_@51_̘q 6`."x4LPhܮG3j{.!Q`CIi"]4ޢhbmT?tE$;ǢD5'UHիI^T0xt9a3Hh3ߺfq2w{gKV.)s_>LPo3__e8YgRL(;@2H& #x"WYZP(I(6LV+5*i[X y9^Eu 7S$о0|/\.S$֫MAd16w]gD&Z*)"\2s1s>q kZd @1x>aPkMƨ&Hqd_\Er;kH1pP (CD,&}M i7*57PF (ǚ@$ڥe K"@n9=:[pk(SX2" x 4Po=▼b0h۲K@yLeua6~4")cQ'H[\|FHX'&5͔cg03eɜ陌P~W9pq0Η1_oպGr vg'3X'ye|6E.hfy_ME@H.iyFhO.O N:j UfAenyQI03pI>ZDW 0 i"$oak[ 5 H>AޫG00xX؎ `n{i-;X"/*s \ ZNkAsg Fv.S;--ŕ*iKp YA6Z@?i^X᱊v*pLWU."G  `G<ĔbdS>$0 b4J6lhLeElL9@ .!C9[j-DRcef 4HؤooT4Z-&*i+M Ek&$uMʤV}T4 cU ,  x[K znc56<52LH/>4xY޹ۄlNA MyII "\7\ylcCʘ.^R<_ 2,ٟu1$vΈ>[C 4O']5-7ս-R5Y tbbbeáp܅9L )+LAO$i$vPDꏩYyTc-'d8o-ȵaM`H?ShjIkfLVÆa_ED.*bLB~'L{qeԶ-OY >(kaPH)0@`))එ_UT &)Hj %xY"AG#(1"o('Nz!I) (H=LI3H0( @@?) D~RwA2(nĸ["i l7۞_DzOz `RA3S>a ~R$RhM@{ܕ @FOh`$8SfLH nA$ ?A<"A(E/IAa qker?d9qľ&EEPD`)N됷Kb&Y-&LšKll4NcAKQӓbk\@=.2o+%ա[Ev4ESWyVI$]r`tbbd؎k~^5 ,Do 0$SGMR&h6\k֑r%qCAkAu7P1e? 1<r'ُ92b#T[5).{+e)JRElYh?u~S/]9Y½7^-xeL׋0z{ǿ ,M Y8LHpA"b쨉3Y ͫrTM\A1"Z[MjR@AR%Mlci0D"&dxM~dٍղ<`\^I !6|m7Q3<-nS*i諈x:8Lȿlw|,3Rt|:2%0ߙ,kABT1!i/,Fp"@+6I` v%";JjADA^]5VO[qGQz<,x-چ puL\fqqk( 4WXl) DǨk 7! ..anhjvHl[6CnAZcq$gh{NnSSVrGMVh@Btˉl}Af.4Lg<#&S|bZ3LI H$@m\ %Mu͍ :)5Q5ԙ&1r-ɏ~_F0$A"'@=*27փM6etTLUT\ީ_c1nO7,<-   kxZ~#V&&߄0$ ¥^S*Pځ@M& ĉ2;ZSnvZaa0^1 '=]b fR~ʋ6Ҷu ^QgV}+YG䲍Ӄ~dq+ PVn?bW;/ܦ] ~+u B ("H_K\.-EH@D)$$Tr{l<>L&I'u8/?bbiq؃C~THp,E 1i6Y3B7"LPh G-q"?S `3`Dݤ6V!:IQx$seɃ'&ÈqV-L*q39EFM1_]PsOW˻7݆ӊAOuLl`4; rLz^gU0rx8+1q*LWYrv7 &! $4iتKB~B:HZunLh9$!k1* )iLQӱ08xq3Yp0P kI A2E"Hciꖈ$H!ށB5E;ZAYVni^UU]130CѪ9\dbge3#9|&W  l"WVuNnkNϢ ;H8+N:GucX7lmZDCrBZ}Đ4E)5zes{+Y鲮kqqbt7s~&t܇^`t\وbK,cy1mD S|AI&`m ԁSCIyRI%r3rG,[NjLAƨPz4l r<#Nm;pi3IB@0`:Drpd3'I#q (xV,7SdYiF#ۮF0F6cΩu@ ^ VAR`=um;ۄ7I;txs qّ%qIDZ;]3Htk%DF' CA#-LD@l4ڪ - 0Lɡ<$rka!QZHk nOAd3Fd6@4؂*PL5e}wz~>S",&],`Ou/n߸]mL1NU/գoprX!O.W? ϡ |@+_ιpf᷀`g0ه{pqu.$ Q$@UBA=e*2| ܒRLč 1"( bUQ&o);2 {8A!AhH*?Tj;I xxƸ驢K]i =TG3K$ ZMv :ZjRdp Q#KIu4I` H6 *Dp_E&kj4zY ̘;6H06[a'H3p.@Ss4P&rmXNe,{SMiuI:bM}X`AX` @K¢1Gi6keG3]@|$p meb`e0hC轥͖!E";7AG` B7md Ꙃ`&?\]K{+<ޮgf2]5%xb'4=\eԄ`Z{0乺+e^nޜ u˧.?@&7Aw( jGQګ6=t2dT(;(Wem(TII)R3ucۖxi8[`,3/eljS7+SYUM#gn#4eQ"IP;ȴCHb4$:ˑ%$(FQHixLg_mk/.:?N\\g./n4P7+-i`-["X ㅂ6*) D-;{)ohZdItR}&;Q7ku5#2b @Z$PCh5A\.qMk kc .7]/_#1~@x$KfUC nUFh4#yt FTF@A7z~iR)rGbUphHtDoAZQ!"&ӈI$lWfz28XYL%J$˩4P2bH{*H .Pf1߲TQ°SA3~Tْ;*ceId TpMDRm"YT$n#(tԐ@3KKލ3&20H1+įtg}S5&6-ŗCI"̃ccf^< ꝋbY{ yH=aj)jޑR 7%>h'HRtpҡڶFDJmsB6fhb8T;TQr75p&8I2w`lo7 @j[]!gUwETÀHz'2lM Z,@X>ɋ")?eD8qum;^L>p.5uO /꣥^h!pq$Ap@lI*pDO lHڪp8f&Dٚ顦0.UJPM.m&#!s4i5F %sd|Lfj{֪VJ9* [IgP\Fܨ d`jA)^iͿH&h㧄ӿѦqE`7Mae]pkCIkIN'\+Xd4<9`X?\q\,8 %f5q)X *[qI? !x^GpG%001n W|ZS9xg~̆O^@+`& 9ډsB&<#^6;EubQɉuM.Š'HoL^$Ғ?*i E8H"@\& t#@՘N˛5nf$޿u 'q8PIk3(m;)|yN@-Ƃ"GO/3;qKbcoM<1E+``Oz*$&,!V@@0t6f8Iot:XMDx@ EԛB@u{~ ~!otٜI4^>{G;.8\P(GTb AMo,'fZg2Fo6 <ӆ]z#ey檂}a"`ѠP~i;nhA<\6&k_ʝuL 6_q/Oz6_`KQ '?|.58yjZ ['PW8 E<ՒeQJoNMPSɃۨAn6( i08NEa- Y9p`Cu]H,PDI=%@ ږAѰ(8lС$KwQwV  :̂(dLt. H#e[VMUMJqܵ<m P[]h^/־2b 'Ӊ\Ɂ++^ A`dH8Ώl:f't>4"BLL_S|n5/;)SPȂS<D vAH-G ;J$Pv@;%Ė&"IߚJMD7iacp(PHCc`r@?e;M[vHqApC@˪jMo ϕޫysI 3B@0m$ @ T@wTbH)0D^X2>}H-lqvPH*8Qa0'LsXr0ZikC"\}H?_Cz.C3,Pm<3,[Ws+p:]I\dFA'[(T  Z .lxipHaC'zD[:dz7I'NS'qਁel" HG%w~0&r.b`#BM$&LS'q:b59֞ވl: (xP P2d #$m$%-XHC $DPFqM)+#IMdPAL%Dw#gNfd?XuN,yXGi'j~e>x;~ѳ`63p{_!p qR\dD3teDײ#"?TI>HtVdҵ \[gLӕpp>`2De&k*  χ?4Y\ s+^WW[LLß2Ӊp <Oz7D,ip B?ur30.q+=oTlٜ7-p0B3]Ӯ#M($ILDϴCTNշ\H4MA*pHA6P4wTML1BoUF7@ Ǻ۷*?BU_u*+xQe~򈥡]ROR12ظXLsZBԶ|V680Դ!j64THUU' ,'J 5m,d*"%ht.@&STCc$H5Pm͒GY̾$x?Y1 l590_&o*ھj@Un`<@ڥETSCbu t"4 mkC$[H!_D~ɇ4G 4ʞYɘA$_57n 6i47z}z[dpRI@ ?Qll,1pG^(,u H$e@tA#Wr{ 4;ڨ p1i+ 5`"[qXp>Xi4jfI1jCgbnE 'G m&D^JQBIR>Mw615t_-b <hSs'0Nj\l8c4sAܮJapCX?:zYSnUmacߨ8.&H4ԁqT l/i%VckĮ0ԓۉnAL*SS$RiPkh4ɸ%WmMUE[ȉ%7A`݉|6T h%G7XH2̭VNڻ  )OHQt|& Upi0l ; 11@P#\I";@'I[&0e_H: -k" IA2A ^tw Ȥ/c 񛃍00N+4KKsvry"o+.0$i 7"N S1X{dؘbJYvItapq0\@|8lD|k` OAAD4u!xt&8؎1 u1:fkŮ^ո{Vڦ)$I1@ 5ÇF'Ȓy)DT_E:s($I&IC$2 ǠI1^Y K|iw@0|͖H1 jhb}p-SBi[,pd14Os {;O`A/0&EL-2,& 9;˴\%LV8 M,c*S7Tj:HDq2EH,mxlj&#xsxn bE ג\]msR-jPx(Y)`EHdIC ЂIifPei >S'aQ#Qd@$ iqD/w5ٖb|1snxj؊#ǽ@fy{O65<-}-#e<#=hM"(t*@ '$WQpA FH$VR %@G.v$9'ML.\W=fY(L[CU+ZD4nMKdȠ[ÛHE qeGf}QRjiD Xo=ZvPuP ?EX9”,jNP:6P5 vv;pOoeԽWGS~܎W'e[ܮ@yhiކ#ĝYk̾b;QlF("D6;((K|‚#p9 ?@ۯOu/QaM ba:hk̆? ~W,N6J[" "$B9b)k 28CZ$M]=+ ƹ9f3 rt0Mbfx|!п<ϣ.w9Ѳ0\Q@YLO9޷z>+a-6vAa GdI!Een; ibB"kX@lϹCt_tjm0  Ma dPntVOv7Dz Ph1ݔc ZXuÝ:\ (P'9  8Cf6(&XPq APM5Vg鵨$mt DI329+Oo€Q  h@DAm447Miʄx7x>K#3:NO$ _Mpcvbu{l$=P"Cg %=7Y ΀A|I'i븙< Q?ܯtM- Ef8KD qH\E%]UH%Q$n,'BTih4d)* pi^<+&>>[XNs_i5nsIc+H} zb9ZŖ`yFN.ٚ 6-埘neu}/9ѳG/pxit5kƢwI'r =i MiXa$dx5?t<ԬLTʭB MxH*D(Hv(շFgseRIuAuA('aQ \h @4,󲁨1$Ly@`8U.opPuICd?ui!'N"sj Q +/.8T.lQu,;DubyD}V.d/UUi.4Kڵ‘" j(8X:5̥ !rsْ/">(&>ɡe ~IE  ujO24@.A왇R?$lRV I5t雀9[uT;^3h Z"<-+$xs'Q9wb?S:Z6p3Iixm_'a.x*qxS["F@`j3;UqзU7@jvLZu$әLګOϤxX~$vSōxcד{g{-9OȡWb<Ӻ{rԼ`ڃ5P{.]Ɉ%-;SꉒO)#I*Vn6KQd\Tɬi,v3moBxgq*p+Y}|JG).է{.q A+SLnv&cq&[׋= /k9 '# !kqoOx+F6Y0[ ^5-|ۀ)AC_[c4eWd^yꝣS:(TZ],(A/PKeRG'`d/tcrP7C\O&xX' NEwY>ˑgA09\SӦ-U?HP@8o E6"7yst`J#N35;Ɗ T戉l@q@fLq_N#[x_=f3ٗLWsL4``S3A=XTKUnI{{ 'CxܪdzNa%T&Ө@B%L*64Nk+ Du4OrqGDM0=ZA1AiM]h nLdHU3~ɁuMAXMj8@3TAӺPGA1^ Sd9֎M@=U#Q>6Ev\x8/8nR W۵jtAE"wThp/>zsLS _bIMOQ<6 ?#/ p7MuK|2 b Vf#c ( $Qg 3eo]즖ōds{։ u6ZV&H4YoL]@[) ڗ^Gly >6s.2z0q ٽ꼇5h$$T(HZ ۅ< \(A'S[ڪu DDi'd4pVM8ߺ-*laCc^MRI/ ~ wɹb13"/8X1eƏD8&PU" i3c%L ?/=-&c4At= @$"ו/qU$YrAZBZ<Ɯ.Y|쿴|^Otܛ yePOU~l:uw#KQo_oi3Ma.6#Sj 1Nk#SU,7c;C o7t9ޙDbE dґh"+ ?lŌ\u4?* !:k#tA82j[~r'kȿ`И3* wKL{xw|Cײ7!8V3uO\ggr b`G AuYdo#l @A( ҳ8Y\&3uH_xNuJ9`2~ 4w_=++R}],vqpC*D˫OEH~T"K NQ|ޑSW1K!De&D4vDf,Ծ0;KE&H"ЁSn!@Fe7VکY^'Btg2ҸqGUH;a9a88\DؐH1Co e?9)znLl+p1Rӥe>g-81ؘ24~I`.O!3/u )|86uL6UeFFD#x$&yz.`Ha`t/ek3nr`5]4>/u1x-q 4㉋ۊ.ݒ[N7{Q1H&I &-H.a-cYj<ffaB*ފ d=HZ$6C]?:5yff*)&TjT 6 $/^"hHOPfЮ@2` -Mft;L6D_Iq& TKe&+* ?15 &HaS &d :oʈ4^aQd7(hR$@ @4 EEF7"p:d>?Q5afF.5HNp 't䃼L"ͦObF%fQB.7CCejtA>Y"{!ڈ4fnu1}+`7 KM~ {$Rw !h"YCDS[I "ܨy\d( տV%Cf HUT(j q"T˵EE QMΘkfj^T@ T8ɧ@foj*Aɂ 1@"E@(Pe<ÈvF ns'dy`K%dTPC@4if JyFg0r9a̴>pzvk.$ 룍v.38W2h*n ipA ,j QJk \fy@2dG;$8(=T`7ߺ.QQ ދӺ~cp&55$gX3=0K AF<땸sXWUaBOi[buVtLQ"_QO1.n#`&7v O s?GN1a+pX\Ȁ@2뮨 !{%f~+tf+22>+ )N;@$}(`sc轾Nq0KNs53~c {$A/d݆ b`REhh+euoJ)77N_[,v%dmyTPAP.mTȨKbޅ:eO;' vWuWwhn&e"i;+O3$Z"m+P 3ts'J,dD=8Hie7ŸYwl#(v#pxƽOǞ+; @zQ|3"7&&hyh;,40ߛ-m!z%}JӡZM~_x{b 3v0]5N8_b8&ZL 3PҋZ{[[2( P&Cͨ9a7^Q0-v#~dTlL,=x Kktg0m c;|p*O)ɭ8fgW&#MW)/ձ:\1{X,۲`ued "@ޗɗnc_-L쾯9p/fk3xˉF/8(4LE8 4L̑~A3jer 8 A>s)".k\eҤn9 w@iDM?t? )ܭ 0]S5(Ls k|aZ?EJTC]AHu^VeN?jMv2r7Nx=3y~FQٖȀ @%Wn u2RAs/ٯ e+󘇧9'@KLʝ 67ʣITk~Ɋ̷̈2s!}d> Dtn?qCr@[܏Exa~FwG-7HJ0zyzkve U$P[%57*A@J̢(V*sx=U,-:ŤAeOOHWþc'̀3X 쿝KJPHVV7 [ !Z*1E v\ash 6̯ggs,i/qWρxћ35ЀOEt[_)st&^ho\lIf vIh_>&g^FP/8XMta"+Wt=W `#2AGdDFҐDhM5)TDQk&%X*jfR-0  dbiQ)tD coAE D;uKE#Q'M.HiNۢ mT;][NU>kWA0j.ji&{l0t ?tDHYZLLB\̽ZΑpY$P e5ք{);wfG؃+51p8M6o泏՚~$Iԙ3 Zb,$AsOtNއy* A1h)9UhMIA9Z"@. Kf/ E rk-Oo^i ZLLWuGEK&m Y i;-)AU THhQ6D ۅLyiǪ"\ )R ނyo3"B?'?#nn-\M醍jOS@dܧa]su(P]"Oq*'~Ѻ3=)ӰsXYt N2nMI D2I;)B-dؙ\MUO3%3 v"kK0oFպ LBk&?\K 3C_|@S!񇅱:[)c43,:E IHn~y$m lWuk_{dNCrGvI$!\ͻ$^ZiK(qt)Mv鈩pEPd R[%AYwNI$-7P;U쩁E:-&Z`[4ZfՍDIdD GdI ꝌO(OZk57_Ou>ω2}/e\03<|B8}IiX@2@)uPѴQ#pTt €t xkL0|HjԙYJHM33SHuK?ϔMBLj_5 R;OjlaŒ(%z8y~vk zsh&м5к[=c崻L<_ڀD*tROP0Yf54?~GdelIv\&}'\[j. `Wxc:ƫI2B;t6{WI&ދ6u Y؇m@Dԉ]A42>͔cEf즶Wz{ >̼WF dc {MC.nt:O$Mɗ6LftlAW .",)-'4ezw?YaX4oKYܦ.K2 `50ju-6 GK0yg?V i;5ɬJ$ R@0@CP{+LP $4N[9C]&۪1S)i&nF @L};D !k`tZwTz0QKz?ASL I+Kr-cp\ KE`E4$H#kT++!cQ0!26ui&{G,{(5m cu2XKtS+Ƈ -#5; <|f3 ~OcaôcP󇈛z0{TIk)jI1$)tZD)5 EERAr-UbH@4Ǣm 7<)h\'N#cOzo|/31^tjLN< 9=塠Pr38ӽ0Go<bC7Q4CAT9-{UU1b@QKhi*gk@'$KL8kBl<A&bZi᰼B\I.A9ADnutKG>Y8pi^~ hyGp1?$ d=V^u8V.pe<kH,iC$<.G1\:)uo@9Z8ufjQb~X. IA5E靨;@u|ۺ5גjIIQPxRiSe:AzdMPABE2[BRh<e4Ah_wNl^pcrΙ:L9_Α1xfu)WM@zPjӺZ?{ndNP~:T̸p{6*{ZXUbÅEj!A A.ܯxG>^n0nL.u#P*;u31_K^#kgi8pXK\8N6+I8ΒwL5Q" j@ BE*]I0~l\)PO %$m;[*X}/ loCp$7+>up~y_"R#?m=Vo7 (n&`fTwu\'I54MNЧ4S/6k `O5iU I?ڔUa""GK&y‹vK-f5|nJ C>6ވ5HnP<>^Iy=49ǜLxu%N pH$ d296eut̗Mfw]nhs\ H;¸N:~1y}7_^$Nf Ş 1VFL4[,L4qU"EcD "@K]JˣTd@8\[:b~MvP%`@23ZjvdIʈ`x*'}M&jl5~}Q'DW)k]v($Tmd55Qt6R*kc#V3I|0UJaIрYDŝTE+$ wZgtE`H}PD+-\_1>`A?IZ[aU\64#Kʀ*$DDoʁ3'.#x$VgY޴Z.ٌ0@&Jy DTdOӦD "HF[MD J#Uײrxƀ]vzInikH{YD"SKAODۺA5`EbE0A3n9w!H&d$5M&ppctA.dQ ˌ,? .b\Gdv0t4PI^cfilSi >>p9Lב¤1 ԎQI\d-;>wJKM8pRH4ei"EBؙDZYp DbT &—SZ%$[~η2,k]V؃q&Zʙ>It Tsev41~^ 4^W[,K |[*Oy-olA1&JEH.onbO Z M!i!Od$)"7 @n{r]?԰aG c 8dȂ$#EM~M 4H7Ӫ`i$̴tGzJ4S &4NhYw57 H@E>&k ..|ja|X.[K<0zSݫ PR^RL X[s8dl;QY 5l[tZQ2`YRg+O t=R*}W&֝ls`j&)dΉqG*P*}Hmu9R!~Bcs}_%l8D v$;@sznC&Vcˍܯ$.;pdVo$ Yq"\DACI+.?Kj `IO(6$Flsu#:3L,qٌoq\4a\b#C\HUjn8*R +njm2ՠו渥#ǘ@5.l32{$$dczEL UҦ1:LϪ`vTxm%\DpJKdƖ@mB|vᱲA9esMBm\khG0h˰FL0\jb=붠E`ɀlBL$jEdF  N#qK0F@S`EAS2w;a,TE MmteTдBGPLW0 +EN pVqi["CdACW u5t꧘qvR$<"(k(;򦵣a<)J[&nMPi"] = 7~RMI?&(*W:YZs Yc69:`DCiDR kh]@RfDI3IA h^Kq:EA"N+77-$4X* i(}&$!"M<@"hx(MzF@+{%1D!&j7KD *$DM(I I'dj4Bf4*R!Mhv;ܨA8)bPI1AM"Π Dk:G^)k%i-p Xcf1qK . w-PIo 4'(LyD}Tyq;J$E֠+˜D 6>lq0lX#,(PI$Uո5_|Ր[7?ͳ2N :p|a Xd0r bA Ţb<A4@X14E⺄Y!TA$RU4kUj`Ufm9DiNkl IN6#MFe:7{`kފbÍ0 \FGgL6F֪AM^RiitˈK{숉>l&_q=֚M& 7HlL[*asQ<\Z FIh!0n*[ne8<~I5Qjk -Di2 O@W&EHMkʆD,IEmRk+Lqf'߅\_ Pq-:SuL˱xؘخ5sݨٗn;bKLF駔/[T7#\a;xOoĿn.&.?8-mjW7aRbṭl4_5@f8IXw[Ok$:E gSKF;쵨y`&DP(A@%J$H2w; Y"Oe$5vn}D"}a M[ڒT`M=DCPuMh>``'-k) L @vSsg !!.TCHh] H`E&Hz@@i%MNk$$Ip'򙉡ip"Lc'ԙ1055F3.>VP]p̸{;Z"tMѠzpu"~>'K'鋭5-f("d/sŘc `?.ď16d1 x!l;^5s1ZHi/qnaӕ}R($q A 4#0^DYMv.K0P KLAHq10R?]JE_L ;V `L9v_g8b:IJV#Mơ(?HSI1xMd9:I;l&쨍Lh.+F[>SΧL#>~* P@("Im]p@ !%h2a2Dʱ$G4Kx5A`NF7)X13q Mpbotq1-U\I'R_tK(7Q jcdR `l(58EYGҪ~a'1[pY,2㹍~% f>~aؚZD!5,S6j[Fu6;TCe0};<9>|#)ƍ//pfMYؑoT pucx,hl؏/{&I݈MdUt"kp Qr;BZ ]+dGA $+^ݔ!Ң)0"ʏ)$ VqHg@ ۄppċ|+ڡq9絪_I SiD6@" CH2dQ4$j"%JGfT@&A 0 EUPit EC=vU5?*~ׄH{=2g#bbkp}&ղIdA^Q6W򙍨 Pd#Mb4%W_S `x山3 9RF_18};r-O@$*f (6r0k0653K9s;Wfd&!{D$QP@8AT5IqtZ*o)&jvB&R\t~TNJ(6EM2kRyH5W>[+̳.Wƴ /k,`5,0nHr!tHe:[% YmDGqiQ0+{q'MwpiZ(2 <@ $MN&+=aW&ݕjD7("U130."_>kpX ʏ=RG)HRyLU@(*Jԓبl/L?Bcu&;pIs0eP+U3)jvv qƖny|mntoff#], /|^>fp1&;y$L~S{cqs3qs /-.sSz.2A˾GMv"\NDM 3XszVR QyQɽSi4iT$Z NdNg ʨ]-n&6K€V〦uv&ÅQe jh2`(ȚrOT晒AT(i9'u6( SXFuޱjgHn+u4&=Iä-kVD1(kP2$uG ;  ARBM%B!}hehHiiv nLp<nK5;ad;$5=f'bYN4PR-ƅܫjo\M+ iT\H;p"({Q@1@>BMYA=.^TF',LV%`2VT>$?dt 7;/kùlC j lܒaJu?e:Yf8.dan{O.uY\_-0dPiM&~A;ҿiTDt48 g" fXh[ʈG _3$b0,@ [ĀoAupȹiߕL+=[BuV*\Aq3%U.nA1@:#"br^X&jlZ !ڍIE$jLtnM{R͈%C+/}_u  Fi :n=*W^6= is@ A[nT>$ }CaNG*z*_ܕBdFQaDF,3#P<7"TW$ݷL"yGhxSpf$ &Vfvo3eAb$鱷d -#Q-VqC_/{wzw[tsY,&;*F긺Vu|u,.g.qq?ulB]?T#DMc6d XJC5}0k4Z-h1 a4h#w5iɬXJԍ#pIeQ NIș"`B%IMo* ^D蹞fS ؎qY  @FTZbn+A-q ZMA 1c/gb0tܶ+$9&}UDywF`3 Xh iL Yn!ah$NT.8oD: fLԪAD Pc3Y.85tceSZNlB$ɯTBA[ <&+UuHt_\aKttAC6Qr41<-{=.DTh]6*DRHBlA~`Hˉ] G)p@(]&빉~[$11HXMi+ϔ_I'{z5ֺO00:F χ<0pZy̻b;Ebn@C`@?te"DF((ԉ`Ź'Q. }dbf};n ܒ bE P Hpcc*b}լ8돷~Lf&4ЍAV$?HuAPmt/:X*k.ub @?y0ywp$~6Z\H2 v1).($Nw-I2RkzUs.өPZM!3*[rJ ͩS@ޥiOfJi z :EY$uT+aS~Vd\]|˳y0 vPł b/[ H,PygC&ixfccƫc/X6[c4;`Qq aAIi)x uڛ[P%D& &~Ej4E s3z34~ҹsy|XĆ58W5L#N ʢFU R {UJo1A1Z1N}+dLG6Y`;T\'5:lyM1&aSn%r8l1pNp]s8Sf1wėQt?V"` o8y- j] ;h$޼VLTz 1 B~Wiv#$d$&w@hHOʂ/#Dn9s, l Jh5"&UYheo[)B vYXMʵ2WYJ) M6W|/Wվ(u0ch|^f:~iv& JH BLEZ"Za"MO 4h-Zz4%%3i $ Vˀt7jTNsyA%qx쾋..^h{8\ 0h 6\q\oC/uGэD dّB&cNf16;9 0ӱ{ng@qNL;O̓'tNA3b@➉0D*<”6'uKH2m` ӸWB :A}B@!͉@۟FkH\]6^ {^ oIa%a_:$QvY)2MfnBw"_FީguKGld%ڬ#-'oeh5sTf`=U.+FA+/6wQCmѺku,A  cpFuF7kt\Oaufi $_ЯRz?2~#9X 'ݦ&Xw*e9b"ˎ) #t8gToEKKȚD% . ;fcײ<꧉5 i8IbKTd?v2eC> cUNjq\Zke8(Rc7 e Etyv͙Lvʇ`= :I"@z$8PX sK.y'R;yUz!5!4`)IuyFcM tKwZy\|!րI%8y`Rwrj2LUQMk {zc}sg= b[H<|]_nҲ9|?Ac, ;n{4$z ė1*$Hv-:4k*EI(թմ\}W&k\z~4i:^Ml=t$ab%@R-6K@4'V KOq0$N蹆;vQKgwHgPMp0XGJ{8V1I<ܾ\`bIh&<.x& apMh&[c+Fm.em|`A%umeF5-6IǺt/La/cU}~3xŝtΥֳoikNt5[T_ԯ8nłD@ko.TF9%{W˽Xs,gk,2;7 ؍$͙ceߛ 'ѫ6YٌP&UHrKy\V.@#h4\Y|_LT}eb00 DғKK^D養fhG̚H RBd'5%bj>5o}H[xu (M*7"E䨘tN"*i6]L+@tC6/z7|&=76kqct{G~z:uP( $ P$Y" m tZ0L̈́RIU-ԗp7@ >spWOK??liG)q0Z'Q Pv}-`pg _?Ý;ľ*0z~U~(X@+XxὮcPߺ A$xAmDG,k8j$Eiį~|de[%Ҳy~q1⦖_LQ̽i{O $ -mH 6\"Эb@VV iP4:ׇ3$Y,kI$/ľ:v6_ LHI7_}g˼o҂TIk iM4! oZ=$2fWkf_ ظ cZ 2huOE4/ Ėlk!jA o/+@{L\BGjqF $f~8ØAɜ?%v鬮Kd^?C2ܘ3:uH3"k{&#u͓88y00d7X~em.0GJY>h.Ϩ/γXs@u\.4%:A Anp84 l2H#"gt+Ag~}f+@.ַɗMd Jƣ 鉬P(դJ_PC3;Cp G j&|P7MCkh] ,j" pv V&keX)A;se-7pց+[-5D}ற{G=3`;1Ș/ L*9+ CT*$ǽq5EY xK.͗+_h]H!ۏtDtYEpvYtWjM)1 t.!b3ЫSK]7>a3!bhqw1&QfyL hDN=1 Vh+7  ۔ܖ0K&gpBd|uN. l.#@.$4CD.1CIF$@;/C/\&[+Ɓ861u/׈\\IبȫKbL ;IHYy[f$)I HH}~^~㎲zkrG;,֐&.¢b ,s/ &)LstxydP@$ڪ$doLWlMhvCjEO0A[Uv$m+11iMKb|qA34Yq?,"t0zVO)k#~Vԏj?*#H%̠dAh {!I`FNR$Ь/ qs8ϩZ8$G T^I0,M0J"%\)N'LI47즍5\IhāTFdE9Zc#GMc椞>P-%JK&vop$AO 7(hMU†wDlvU7/-Ii\jagTH };pNWQw&<.zyP"+("NPIT>j I-^W;130@ hs^{coIreݍȆqH26?.R5RcLc1Qc56?uyL@ct\uD P4O* ȣ+KȊje AUDmU ?3;r$ ^G8ظ qs WCi&`,#mEL7 AZY [\alṠ: VZw3m\+ x Wes#~a;0-/|jda]OEBXR)IWƒhVAdO&lDF5u04#c&i/]VZ"fJ@ވ4TQj" 1UHJik1.ob=l AkRIlٞW6K>sÙ=+; Lf#p6DmTXhGIv&/ZJΰhLzfG6YeLԕΙ e@6HE9[ 0LT!1R4V]N;1ZJ:FK]M~g)C'ШQ[HֻJǃOd:6Xa#s/>=_ z~O;Һnc>< M@U)cpIMˠ\|_uD$́(UۀD&;U6y[j0oEHp ?E M Zҳ8YNŻ_wļH&WaFt_zP7k 8osI-C\_6E. h iiA=2lLs ~#5Iq}cPvS1Qx-p!y Qna[Kt樎d)vH)>Q¬IT@B%&jy32  M`t"5"/ ?TȔ@ĨTXNC&HuhP @鼘^[|)[虬\.+Wįs3Eq;pMٗ5K]#j\N R&;n_' EtꥁTh\(:@t:I $w0 I!~PIҐ*&q{"DeK]~cu0ֹ$& /߆_n. v6c `O&*׸0\2Yޝc>pحd0nnZ[a@$\3k?t1-8Ri:C2kvAZ% m & pvܨ["3b QY h[#S^hAs :K2$dY;NLv$A?´ʏ!s>P x$IgJ%ktP&֔\IGb)YZI(oˑ 56scW-f;u1lս_{KHJD9jvH&OI@8I@=>ƒ!6HTR@ d ؚ iT)5P;5#$C?&\*Ahc %aͭMWDMf. M}dꊓ1dH6,?F }H3vcP g8ۑ y˃ w(SYKHNHW@.Wq"ꆘY<X-4MM3Y iѤ 5k7Q0~hį >XS} u2 w5x)K08nI0TȧJ É{K8$}HI((P1f&E"$VEY+U u T H1F6+긾"bhDLMxVI.3dv pm5P UIZ։'J2VLEM0m\.kZ DcYlTk0>`lV8w\?귩1f[qv3 {@>I"X yA\`&9  ˩-c[]Yo!`$4V)1xYy8y {h1 ~V {RVuAEP $\RɳhGy"ZaRwC+%ԗIHjLLI~VZC#M/:) LӹV+yb"eQ&t֐Ie[K. 3G s")WG%:Ax5'hըOldK id=$5f{.HAr_iP%i !Od7DĐj7H44>phE@5ko yPA1q #m)" 5*>g&cu&s4"M>dCHa~tH.aSs5C)3 _4ĶG* 5}@T#Z- 1biDH芹 3M*ڊMNFܨEut1K(F"76D SS[Lf;=TE}{$t6$4? "u 8pRDN5@QQhZfJ4hGr;Cm?umm^`F(9T&m4p\ZYSŬPQ-8~R*,ZiODmf. 42Nֳ=33iװGu.n|!W$&O8QㄴAFCD"%VN$ȭ"|4S@ .uFŢ\8lsZuy' H1h-7;#e}@ueM{-`bc-iu]S< xEu\6^7Q`6"Pdih#v q wXfsaa !~9y'wg0rXo'Nz x'X3kA kHAMDm£Iiu-BKI?T5D" \XXxg7+Y\\e8Jӥ4 8[%z9 Α/4D8]G2ޞr~'p䮬PU h&Q" -TLl7<%jUSU }UK\D uSЭ5c-G>quHF&c}Pa%%]iP67?R7dsEDٯQJ ADHp0/.as`P{QDM Pmv?Bt;%ѠM#m80CZHh.H-+釂o9Hv9ˌLG Cis*a$[*cea {gH+.O#L!l,0OhmuKγSؘ( ĭbbc^b Vunv>#LQKQ"dЮ|w(#KL%\k$Sq4XX{ ^Z)Y Tid]'s0V5$H Hh_vga|g4.) )P$* GIufwSؓ$FVУͦxP4(kJ* Gsœ$IJ#a5l\tm|֓ JsauqT42cA5IkИ'Z o$4:AlQ5OedzH+'Ydd eM չ10LC"fQ ԗSu5VSub@DSBIB7o I0*L?Z n(֚r  $3ɺ Mp~`n Ʉ?4{G:/LAg/0_Kgk|t"KqZBn"!$ il@6[~1ӄS,"'XYpHsad,Ɛu *ց^6v&`r.lԠƑYPI&M@.>Šf*u{E~w/b P2w6AH|IA-i=5VD_ 7AʣHR<\H埚8coyهsL.*멧KMNiPgtNȡamkZ-sN VXj *6@O\vTAxS;0 uW{;(ί0f]"kenoD= T[0n( YP[i \5TRk_SI3u$̎{$TMf7NXyI3 &HG'zIPѦ($^btlLlm8 ]8x*&-màzlFpN5js&{׈3O,#uCJs-lc7y4baB VZ]YuLI)kk$΍LW}G73ȴ9xy44cL7@ZׯQ:&W1ҳff~[CWbs&dVH<6΢DyKCV_ZKE.(7- b V-a8ؒ DV;N#>c7opN'@n1$;U~"1 qV?I-2#OdVLW. !5W۠B"TM5 $80?yi#Ƈ=4} ly#H&j* &@3Z.U&R)yQMA'iDԂ GlK\+_t6HuC).DzCvcqڃJ'nݔ$mRC Lc@UKFwV@ R.o$A"f* -hMT[8Ysׄյ|"Ѽ!t7&'; / ؛j2 \`?p|cۋpyo 4W毑kXhT $)dIIӷb BitP dv$TL M({ ;W kُw@DމHJ*B 7#TPXD2f.v@ D%V^|H6[Im+OC@"D.$M\]Q6Eu-.T>bof1#.djQB*A7U ħN ,٠yXe]1(T {]h:4 6MKff"[1DAڷEޔA>^#RdVC-8 S@ M(|5]!e͒Kk(pkZ$NfI0; 0A?.Z i~?u,Ǎs5@ gq[B؝I})9}3E'{ $5fI2`L>DVB )#  ILTE1uQheLj]2$) P; @ "DIAVϝ콾ྵ&t&>S 0Wip DO('yvPq`H1~n-@YN$DĔ 2'E\Of q0#t8]g9/sι&jpi-ap 0A /-V"E/(" ֓ YYrFސG^Ő "iP&"Hb+mw4ld7P` MLkϪP.O8Xy?4 \H5]fsbt\zJ"ʙ12!]dPM-[ 8J[i_ɷE6i+zPP{Le'nuoDj`;.; 2dQ[Q=&IyWDTPIDh5Qm2k>1`JCAp kLZG>oez:`)Mʅ>&L/5;HDKyAPf g'|YDV{7̶/._/VMkq~ xt< q_Y63UI.1È͒L)h)Xohp$ wQϳaaa7 NXr+uU?D q2@Z0Es53?0Mu~fq1^\㼮L RLVA>OM&~DAYS@OIQN˃ee%LR $YtY.(#ow:HxNtk/58ssB&6F %er8/xb摪H76* Q e C}MZa5 ɭB:B )MEke=ę'eSFҩ iLUPhdȩ`H; 2!4AzrT@ nldG;w27c+WX$W'<#iDr5Ukyli~ktLs)󳘠 ,I^+ʎedz%֩` DR} M-$XAS Tu;?Td S Cd6$mN$%PtµHkXDeZD*Nʒ) {RkN£~ȻEDhkO " ˃pqln}W? OORtoU?lI3#Pk/-f3 V+46r 30\ƼM@1?\s_4qAlkwsy&OK33rb2MoDմ- mIiPf+tȓ{Р*;loekP]SXP(LԎ 78HDkZ1 7vfQy$ޡSDjݍ¤HtBj.DH*+"h7T fVR﨏d=&ʰ*ff%>{=ÙafOMlR4]ysq49GzY~7TFteۈaDklIyBf'NA"E6F eSp?F: ʩ$uMR-$t.ҳYo2qp;\oX݉H "+^U6I@AI3`ǘo VDAy&17@PxPăC@GwID+T-'eH pDwH"M&t^W3|CS[b00CuE۲up"-dOE q%Q {( ҝP%ZN(jnk,HCu.*"JC$`j=`NsYY&@0*Ҝ_t@ ".Zg$sT0OZf!k2c0aE\z8=_czw? ?@yDiO0@Rso=70 k`0p|È5Z n@+/?|9k\67@s@8+/^?u0a3` |SW 0A$ AVE ;BJ+A+ &}i\*(>B"*{D][-4Á+t~SGKx#A`.h5-kv#eYѩDO ;0KHIם:^cf>& 2Kaxl.>z.O >Wj eTG/eo< Fq9/tLbA OԿs-1~&{ɴ$@#}~gx5к.3~ mH+ ȿ 14DJE<̂oA&uH61q'W#~p \lH&Lmkj:B5KtwTP֠ $"8H)i}ILDGveW8i6\@/Yq~McATi9j*Q. Doj3A6> z$ $*M1#TEn j vS~ڂ"$X*Oa"4bDoJqޖ,"j"Y MVT$~md4]t6I<]3}c=bb9[Ɨ _uޝc@:1Xh,sy^C?8WuLc ] cpƺX  Mdw#tr? dHG+9μZs\:hk`b+Q@Ԅ@107l "oJKn b؛- d (%#dD dbBi숉-$ ߔ4D i /(J s*N5$I4ۺG"۬ÀHT|R ԓsfAfhtbuZI }(_yI؝7 (1Z${*5I)ŽXlcEh z{U6ST XrlaZz&,fbA2H&q:-HAa)LݥMa.CK"b?PuIInMiEi a8Ud]QmhhI(Ly,SI tZ3Z(魒q~3]/pY1<K>3x>#gNLs4yR\`KT4սT!*dؔ u].wYVIkI쟩:LUU jԩ$}`R@S$ XDP߂!VL-ㅑHպbq8:Z  cc H_WnПr][9b}XXXk]_3cLwܒ 'U@34.-TTKnb,\裩!ɗ3Įo @t 6{d $ISRxPk׹D''Qq&kӫƣinzdd6LN9NVJLᆗ4lJ%F+P"䬴ݔM.T`DAUU45u@"& se8;D(-X"m640dG!rsxñq!uDkF ۄHm( odMQHxKZĘ檎*}d]Ě0Cr*ukt*+koj,#W^P uc0輄&fvY- Dv "V cqp$@fҒDHBlOxH#Q@ zwQ'}7KHu]7u,Qq0I0χoZ7,8&BHY>&ne 5 n- 4akyjq~^G ޯ9C3I+/i/2顙\utU C'DO'NY i&TIQ%Koue8 E&1> q<8ZhvX%;Q䛗P@5a xLF#W/ʻa.] Cbzu4obkZ UMfMɐyNɵxzƗhtj$Ysws?) LQNhJ떉\CR Xꚬ Y+z/ M$ܮOHlVJc3".|% EꙜac Q^;gdGKhp."/ڜ"h-ʛY I(^aAĶO(-Va@Q_Sր˱~cz/?ӟzwqx b2jCv;&:a ? n! t|It"6p$v_bRE0Ph;( I@ֵZc`E7aI7)X>[uy0TWHQ@rRZ$Q5 @$l78$flTy9\fqY돖 条خ XH *G.GE`geDHc48ԈRKho b0 TB; ^@7_n1f q׍0q`%wL4&hih4TOez-ytӀ _xk.'f#vA8n;"i#z__Gt,ɗ8q>f$)aW=O9ἶS.I&A5>Kv"~2E Ƽᢒ\y6cZ[?.:Lӏ  S哲Ϳt 5r_Hm${ʴŏ h-]0ۇ MB. Ĵ"{yLs]c/O,@{*{}G3C+2h$z- P m[Ġ8k+FtVQRbY 8=F+f%E.ΫV&./Rȳ8ֱi=n&;R"DϪ٭?tMCHtW+1ڶhl;]z3o sƷaψt?!gIi`q$y^]&Î@h'NK"~ߕ gs~[ KA02M$yb4QMod$@mju0H1;wSvQ";{XEZ3Ϫj:HMR D(L*"i$ V9Y"MiU@"*ܘt _MV&a!s PR:4 ŮJEh$ i@;P TGdd P q?Th߄I!B41]ܦ[-~c1>[HT,)TA&S'xT }3I#Qqmv! HH v3;3aca3ԗjeNcʌEh* E<'b7$% +Et/gI0zwGbfsX3 KU ? nrxL-~ yIYi @LŒ kBG+DAЧM$P`%GtD9HH2lZkH8AL;p<3[a@ nL*diE 2dJ;7f-I_g'C/'7fa,e{†Ҕ"6]f \`2JsYl\)a A 4 8sn\th@E 5Aip4,s'IsI&M6'2d* E>6$ MT&~m ')lYuܡž+MbвAa\^>4U-4@& p0@&vxl7S7 {DG<.:]Ιs=#9b ok Bg>))_uc=tbcbJT^Y"WH߲-;m (t^*x߇ .66;縒joTJEJRUtە@Or[>fe^HM \eǺP@hZ$E"8f mJ$ڕ)( lEvD RL-X@d7NI$&(I+T6tz2xH$ܮ>ӱz_Qc=nt)EՃI$v@la+2I@3r U5H DeT&]{dq?.ӫT?S%F;&MEEQ/e|N긙>ߔx-fL^?| ~p[7k A "l]zʛ`-XV-$IHkT]g!erqN`r5#.=-vwӫ.߫ m+戇wQ"Lw5D?hPHPL:#M&dAO)HH2=wA0=T H@q~M$d*)O(BMU$4)ѧn :Iq1"fe$h)Dܽ7;b4Dy@ j3C<)ôEH;"=9l_ %u~"fjq.YH I"ghtTI@ZuYh/&-v#K 1 A+w'V]s.;bpY@hD+ᇇ<3;Xf3h"" _оk_o9?K(%ŭ1PٮIďM"W0fE;% FLUUcQl7DTj žOLvXwɴ Z8m%WP&eƶ"iPiq*A?+ yuy*Q>Ru&iAo?e2,a󱋧ۀ8NLAeUP0Zd⪹Q¾QN3H@&vL$ZJ1&ܫ 5x0Zi`H>ZRRm;U,ITiux/tޭ܎Wb1' F;Uz_gsc:X[kk1AEM(iq"L 񙇆%r~/Nbe얘!ݮ8 0L@0TbjP"$v*!ǔAT ni!Ay@ $5I o I"`J  PF6dP RtA, D5[uZ`hO "Ny$%""p؝C <9Tv ;Fi,IP{.$'A;4$H4'Qj PLmlu VP! Uhe!NnR9ʮAu05`o~J6DaD.r4 nۆq,P(0=vTR[ r1/+]#NG+p8zp O+$.^7[QWL_UrAu@wI+542+Z~T+ I>'K`ZtͮAf&?di,Nn_ SM>38{H$. /exܮLae:c3p3gV˛u<1YlSVv ˿:JgP kqKa;ayH;g:i~bfK_3tc4͡W- ATR0)kKQzVLKMyKaZD?dWL4MuO " A:D*310ST fc9Ō$q= ARyY4}`7n%t8Z5i`W1؆+pb n!/" {//ęn^g2SCJ񗌺Gպ9F=^4NȀ\f jJtzs^R+~Ys&bߺ8gV&5IcJ"$;&j BI͢?*6j~=z  Ĕ\uH(WM[ ȘW&[1n84}_g:yN& EaEl0G)@&v"[mA`t RP&*NZ@)'eAIT̗M,Hkjq{J {"@$H Шisv H*%$XEi@" `tɠA@E-ELȈ*-[hj֟|1i㜇FsN k'$?c,L6C.V |(mvXlvZH]P T$i|sܢD2&D[yeI &M¤`B.I@h') RfSk_UfH҆vP4)>`L)H RAM&HJ~FdQM] z ֐" u3i&hh6\ Zh&7E`E%IQ {V 1FkaMg"j;?RPYE $[^ſ@ IjEjCT!`hZtlIk"DP[JmN&* &F " ꃤ Q29vLs6{}Fh'ee #:M,vƢ56\BI7U)E s 'c1}GEdDH$R,0Zc⸁yq0w@l/o?~λQc nx(©4*.+[E5;UQphV,R"gp\b qe1<|O ˺@kq]pljn ;cP^_|o|{,^ f1Me]6TidiEWoOeQ"O=nmu16P0eȘ QB%JUHLTUzU@ʢDhDʬo T"e-0}&Da(B[ϖ"JZ'ꤠԒ"T}2A@ԝO˜ f2XL&;{dM\7Q#K0k ` \X,~-HY^\9/sI&k%R+kPJGg-~ 0LDOX >a] zH]l4hG+ #g9\|lOL@Ʌ?~O~>!Pח0sV!;_6bn- @1!a8GMk'tHhu +_Lg!̈{0ȋ]|_ռe n3Os6xz)ik@䠈m7i-7 u68My ӗށ9\o85 :Hh_n1a`;V$hHao-mN#ѱ]PA.-f Al$E@m\ks a_00_} \\`t&8cP7߄M"c&,*dڈ Aq)fبiq2L(}fI$ 0h,:t~`nT`:& LD}m5NH=S# Zl:+K G'K/1ŏkLAC\K%Hi =Srw 4Ha0 [Es1,ײbp} Zq?0ى)Hv*CTĂkt \5j .úa ا@Rdbb6.W^Y=;/1Z!F<[DXHRgC."gd. $w X26tE;$ޫL0C^C]pݿ\x$yY$n9S@DwI: ۏZZ.o<"ZMI<; ?q7LP+4UAy*qDOE)>g# LFT3S'®DԠ& "n;(ڳ 2=$__DT:$&dG& %bI`DAaj!Gdoe+AkJ=H"` G /+-3q@sM1q^I$%r5 HY'Q=TP~~R`A-[pc>jد%H7X9 LDֈժ RurN«Iy2ObJ fD_~c`Z ɑk${5\S^P&`~Y_Z]B{@,#h!}g>x¾}kNOaܻ%.E|#QptIuƕNDyHe 6P T0LF-TBӛ,T~T$<  QEI&1"/T#WGQ{j%STmVjC|(QJ Q? $Wo$0TIp0 7%Ud7`hGp6At\T6xTրO T$b)dy`JĚObAp5ܢCyݚ`&]rw)5"'2#j @<$w_dU-f( }Q\*fQQXʴl+BMȋ[}$}k-Zh;MV:@5q\7A?EeMI\lV-؝2D ;l[;Lf3^"l <rx9V̒IqgV!.f)k J2,0vf45 _=<]|Wq4I6 :O0طa{%h"vH&m͔L(NƲS*қ6H:H*|Πtjb{NBAq \+19χ=3z[ 7{ߋ>6cBE#y-~.l,%@` oɲ>H|x-L{5HF>$*{tNrx؅x '>@4m4Z8@E EH UeZڸ,TuiI< ( C5Gqi|B (0 <թ7 X  `F&IXF INi!ki{tl/,A-{w]Cg8.2gu(H2Z&6;#LSL̫yIq)m)uEt`(`iHˋ}4YA5od:2!Q^Djk i-'yUQvZ2*@gTSA 3]"THފqwQ}1­6kܢR\Jc~*O.Yc}>>/QvMN&Fq#h+lJ2dQPQ5H=솆@ Hܠ@~PnhbaUBZA 0 iwMe&$8z#|Π{0E+154Ce& bڝɺZ ASz'D0hVT] L\rNI}UI#T(0b8`TvT 7STIr6<tqj-"58 qB¶vVc-԰3xC aGg10peֱp,–rPd{+pIE `)Ht dGIlP+1y)wR8f@ cS` ?t[Q&7DPMxhp=+ ky\=,i-kqZ g 4ekDl`LLB̘~0MQMDM閂iEHySXR]qsn)WN/r˷ xٌLokٰXG}#'LU@gNK"4ǸTu?@N7Z i$TJ~ #}.( 0^M3/ {GJ!y xf8HЃ쿤汅pkZ$`ԯ|5ּn0p00 >\W Ǡ=$y}_ 2I?^Ј AAnm1eTE=eRHM@;*x$-9MTBp]L&b=VلL8+ RIuz4QUTyƒllB?' ҡpBnB%J s 6B4el9H5@4PdUCa"Q6O*2n_/3Q { |O,֜\,L0DH櫄8Ufe̓7].b -qP  (MTAZo,8ū$sU47PWt_<=Ꭳ'NWak15վ" G1' by$/ outvP&&,WtHSݻW`f?XqxLJ.=*)U@@*JZ.?e߅Yl1Ff'?p+Uwq";UhD- L)-֩XMAW)+DRhu&Iҧfh0 ^,CHhyTA*Q dG6ܾK ؘ5IVo)̻/8xd4Ђ. FBC7&Rظ0?TĪuP;wMZو DȀl`Ѵ4!Cm7Q"n:]+ $.2r  aLX*!'I: iEmIp$P$F$iiD>ZDj\bIi-"d:"e߰Q(P35o*.)2h7dH'KR=Qd|KM,5TF@@i0n(`"_ 871c=. g,`;K=#P?)$ꙁ< MCwH ~@4$GF;"I:4o ] miܕ oP'QE;%M.. f&*߫NP(Vۇ$RHAk cQA;H#LL]eo*h$ܓSL!rP%Bu 8-4 'Q1`oU %(+hfxP$hj4^ r-ĐO!NtҝdIk j0LF^.=/Գyv <&=0X4lUҞ[S9ثQ%Eֆl8L O#R/ ";ↁZx[4Ch $t@0B5mj 7AE B-rD(f&?U}&&7"YCAp0He`MOyDحhԃ,rw@4 Zsqқ"e^+Av]76Bs;){qpèdAY"  ցHH's~_n&#\Fi )0֊Z\Q7 bV ;+ q@h,> { ;rʈ#K0@N:6u Ib isND>#:_//ikA+L&oX 90_A߇>#f_}#7n;uaV6n0E4A|ɬW.BǷ9̀Mv\f\&͓גh&P2fjܣـ{a$*$ EmQ? 4ViuAͮIU b$db#싀+mRL3PNSiϙ}WÑЇzv/)92j)_Wwsf10zY 3&! "`>O1?R6I+U!(m)#x&ʢ&8[nvy  arjy&]˘[HH JL4d-t{ZA&´#ZvQ!r1i{adN&{6;NS-10 !WMdpO~l Z,E 8luZ=Td I$ֈF$DY-h#\٬Lbߚuic`DH&/ KAwIk╬ jR1 7qI5ɂ1G?9Ãik&LRCM*TDKy@j=Pjh[Ҧ D%ւ }Qֲ ˆy4DN&=>XY<<& c:tuQaCAUu<ɓ7rȿҪ8)N8@@6Ql=%@[ V C@eyIOlE@9=ʛ1mM4%|׊z[t31Eğ/AmppgN+q%,H&sKKDMAi YHQDXsl쨤Eme`DP[ Oe[m3Ǯɉi(45"@>lT~˗| W\D DI$*PU``k C3RwܓsY=(< kI6Ix h(azL9'u6i<0[@d@NR%R?ar8i9⮡335apE7/ !NgEV@}3m6Wfi#3p[4 f?dLw!.> &DW@\}eQI$E=B`5|U,=@IlH;R?C[NY1I @BoJ y$o~ [o-AFiH x{8]C]Y7NS ~оOp>Q\SZMv$I]Pn"Op X 7."H]@f`´G}Sn<$*j!{H$M?2C,0}i$Z@%@'Qߔ 2y'KHNE rh>@" '- &j\# n-x\q$n.d11>Dʜ %,L ʮD-?u][5338x\.Ҹ3y\i/y%ě \H۾XJG0iZiIl?!jnDNR D&3dAY"P2.b$s]OpYZ"d @zJ`cA(#xd65TAiR+P8 b3:p@.Ml&{$C* 5;RD Z>&)즘&@74K]bFÔڜtm &EDU$ xXc1թcfs$b=|DȐ+IQ2nyPnJnN]c _Qܯ0~'^YY<#F+ྴh⹍t5C H4Vtx.Lo4#]wywHEH;qf@eQB&+ujJ@xOdNsW${JG #L\7U3(F^8Y'Pds[d5z`Aˁ.MP 8\@}$@@k>c1L{ۡsComt87H$>.puj Btn"g%dTAP[RmR R4@0v$&c@XR$"qB@n1,  T7` -  ̛(4oy U#IP ,OmʃL# leh|͑! C$'TrOꉠ)@.>ĠFWz[Ü`Q;/'agܶ'i:\FދhLd;iؤ4-5Lgu6&!ԝ3>IG7ETmiaS.1*`A7-A.5D r"#H jMjC HTXQZ|'q) Q[fW^.LNg7ՙׁă&nF/WWCٕ!ʐÏh3m;/F\`[  5jKVH_q㟈^/}tlA3,2 bw&|`G|;~As"iFi&%EEiJ! Mjzf8~-חA7_Uٟ~-ޟ n(8ؕ>!f}^尰pmF'UoD0p^I_cZrLWW$_71Y>VС:hIv[: 2G4LH0L@얳SK2ᷬw"H lxn sS@d˄ :ZH lv{iqlTKbmѦ Q.In!k(L,)3 A` #D:5 xP"}b^biHDzp<ح oySфHxfhaE4;^{-#  F lrS؀m+djlAq҅ &? .& $M@o{YɅ*tjTL6nאbVuK}dITu(S˄h6}7Zh:tU`auzaiLh 0aQAMbd$ϥ $}6Ul&aN, Œ`3n ĆZ ۲d4`Q7+."b]=meP$l]gM" ȋWH5P$X[$UŠWk 9IYυ3r+f:d.sKFl:I߁,\>{,=qӰ]KL-l6AmyPtE@ҐT F N2LsA.Ep. <CRTZEDF*;h784&ۮQysCFRA@5-2 0ऻ'b(bsuϛUsc2omWhRXIp,E"# "oEA&/ #(l4&" ~NlV}V[.u vv+Bdu0dSd (MbS-1΋[eL'4IqDx$ D͗|2Xn#Я>-<7z6A?'˱1L_LkBE 4guPm*'P&1) 9@ꉵ X*2PHcZv!ZI1j*A/H@F j42dz-ML h*p$Q`Ĩj GdP bB*)x"?q];0 0G+r: +*jA\{"\cOŠp_ f i|̈vbOWO:x? {ڤAݍ^&ttFfzcS[pyL柅_݀I +)**s*PR$ 0]LیH fLꀨFFZ AU*VRE!JRRHP_Cd3siyk6:@Y4+DD  TU 61{K^ DP:Îx |Ӛq@iJ^iB Dǹ5r@30f-Zj`^)c$@]g5aA1h]`QCu-8 @쾟!kޢsfe b/<JL37P1f ,5Qc2I kyh'#4$ˤz¨mM q Hu8H@>ʄ"@>E,AO%s2N[GłqfhAؙAO)Y= {&I cd Rj?T8M* It b;IK&e S[ K+h(k C䨺e]Eupkڱv;6\s[.%sg:~cfXpsuMA+ا@`&$ CɊOyv^֌Nթ+s?p3\9?Yy9ϕOKv<[;4}x0"{\ۺmʚ+S TH` j&KJ# ʈ0AL*Q0Л "&@<"o4G!0]dzeԺubvUˉ&0Tim =w"'U=7khpL_|w%? c`e<DY4IMk Hrf xpו]uVdlm2.y]-l8/@?IHh$.bD1\0["dy5Y"'ULI3E$*qUz)AYs\I)J$dhTU(ydȭhu$A7؊-Kv#$8}L "ҀiIi)iTT.Vq0poˆ'~T$TSbH:edڕQ"S& EjhA'[C&*}-nɘfZn`6P0E?t4,vZhB#u:K;o403;Y"HQ* EdMTDL_sUD4ֱe@%@j T[2&`iNi`بV M' aŌCM-$…̝[ 0vN_Zmc*4Y`D4EA[y%_5 *} ZZL9I$Ls'Q>I.rbc8 =" /(IeAB&w@򴚚_e@{Lޕfe֟hϢ^Z3̄ DL ݂ k>$M1Fr%ZkM(&q q"H@, f?  $0;Q?i#E^G0sH~6CD.x +fA\dɉ5V%&ND&&FWzG?C~ pкΣ8WbjPHq>I&&j^D(Ƙ%"]DlX;Kod3^3x]@5%\fLjFbʋLNx\h#X : Tv,?=hA.=FEk$DAmsE+f~N6]b(r]]fmElA&/*ZnTK ި`"GQImPM熘Z?B-%aZz}C@ j ˌek!sjXh$k[($zO* $V`P&aA&/v]֝CLejE{x#?~7 Xl Qe?/ &hptL ݠPPK S3oP{$KMpLAk'kQM&& +0GzyDA6D?yQʨ˛3TAG0[_YHVv!D&Ց"v)OEv˘ctͩEI$^wD Z`XY-.&*E@6EK@];V7\s4V]4 <#8FG r$T 9P2d)QzЉZ =Gx?|ݔ'Ah/={r' w\ =>hqR$Ht H2DP#MeALLITT[.T53k$ɥ쨆@?+^&)Č#&)^NtT龁:g  zXr{x^C7 &. |lG +pjI3hPl<3 ܁'QHlkB7I:\H;q`.Y6dK`ʃuTD@ A`58-0eS**7S&&953u-'TSo. Ǯ w$zNfS<Ԓb$7T7.|trЗm{/5H@w0TL>Z32LDCA~ov!V5ELSbg4A2&a&w- ^ȁWfgA$ h#ӉDLcG[h: XMD i d*j2 =D^$EHvH :;0vh>o!t!ik,ـG@ &b@u56`қ!28 / 1 4/ tɢ; 6Z [f1# tBp[LHI.v@e7|KFcTvMmdY6.`V*R=ss'VOdaʩPhSbTƲ$dIHXiA oAe:M\J@3Ah&'() v$vb}To_G~к0|S12"N#V0rn-q |\MWQiY{(P޽xWQD(l>Q; b . 4!uˉ2MT ʍz!@Ŕ+eBrvcki]CR% 1K~o}/80Hw42/2+xs9}&OLƒ<>6gZȱ||]ԼklYX~g27H J(ET#C*$ŹH>X'p{z/gþ'^79ѳXl  Ůiڡk->(ϻ7zk=>!qRR* 1A$;l*E+Dy04ivvrg)%^_PYE`a\8p>SbB>dN+?GL'b9&hA3.00csi[MTiCC zf' \Xv&Gɾ+⇌qְrKvTy+ait\T{֚h@u8Si 8?_sc`7 #P6\^YMznjT؎$ q~΃qqFk=v!ĵ n+&-]dGGH&dHM dċex-LBCMx]̫,5n7@#'adH `2T׀ӦbGrOժO܍Dɕ$SD< cU$ԃ6IZ Z~ AxkHQ :@k&&}PI:-p&iSeOMÕ `%4p-f)E 0O;$-odYMM ҆iR\Xa3Sp".7d8 9Q.R&7oʏ7`O5x@ATyn2} JFΆrV5-k؂:陉k1TI`M=U金0MaQ;4DH"\ևZ҂$ER-52bqJ`}ul>.#W2 @5 TFbG&H-b  yo(8&߲GM]@% ~V&`֚9ql: ]' Zk4F ~nkgG*kuhv\cLOE|R\.WUh-"EDBMq[gN6MH4ʤ.s%U\hB[bb&Pe@)&N3$km"M%F.S,p$\V[z^$dHpE1i"u:HɼSI%jn \AH)̂=!@.hVKctMS$M!{TF}6er. ~[KKtLV*"q.&@8CuVq6;p@9u0 >af}9Ǹᆗjtyi"kyռ]M\.3%&ycubⰴ em^ySiwuSpdŅ.`l; Bf7{>d_Keqzrp0c5GPI;phO]!lP1%/0f0T Au}R LPq *fFK&bu<V`?yXg 믋S ,#M̩SX;Cb*3yL'q} vN='׶菤4Ji!JW`NMbEh:Sct{ #C0Zn#H^>$ L w"&".Q $v~ql{C}W.s}xfz>] DHk YCi7INaS`M9L5xP n]M1X9I1^5I'aTL 죤bV\b踦m&1'@Rk|)E ĐyCq%S؃^QgMkпM-/gf>_<-@;Lk{c HA+d޴e:i?Z-Rbben-A8g3[YNɃQUЬIDzb h b%2ʦ|@;DzJ<. !ԝW c˜6k 2tف&"$dܟdAIQFQmT(D6Yl Mq+!3=/6|3p{ ys1̜|+.y]p\f M؄ʧ(:^B Dfm@3JX&; A !Bլ F`TESC R 7kI˗+b7"ni: fVQ#LUMZzˈi/~@E`̭Hl`AӺP+Bɤ,XMM&XZd;HE ^+_9؄sY-"DPT0@7djPRchDKRi<eXQ@LG*DTCzƢ ϲ5;-b [ ^k+1[[QliM:_-somDE$4T@@2+盁I{#ex1niL)3+ Z"*RR% MBjT ;y%@$ FhT]-gxZ m 2L]d^BHG(ޕPOd`1dn@LO 4*2Hז8Ǫ=ayQڷF?nv K\2I^<#ռk<ybCX@&^2_Y71OrOfZ`pE(|P54UѲM+`)r柁0_א) h`ĉx)JJXBU|S}5~vUq켒K2I(F]ΓxXjkp^zO=\f:GN`1‚ \z\q/X0f9Q5鮓5-RlV p( ؟µ4HBS*LLʜdr yQxĨr'd=l!#NcUDUuQPEZ )3*5P157S\S$-9ڞH3{Hx:I01N>0%s纮sb~)qꚶ.4iPȚ[%n^ba`s8:d,Ua]GXPM&h+QCz#wZN 7-I>cMdbr6; ֢FZTÞ(̜Bfs0 /7Һ&S? l2Xb7KFt.5Йn2,&V7fe{C;|Op̀N6+_?s$MUr3ebjyc+:@C5ZWN%gd|µLHkhMi3z#PpL?)H^mcZ YPD;ObV:LGus/`Hq|7yW `aMU f$Di 1".0")Z/&E\D?uLm Ϲ s\*}@6ALN^VLsDSP@0RxPFB]x%Bu h'lV 4M(JA-AE M3;*QA"V{YIw2|/2NLd 7  k˄]|w`>K:|ěW:ZH$Y& uA"w$AF5 ]1=IVHP0IrD>ewZoT nւVPLI:7?i ilIu&KbNk?όAwKlj F{cx!,,<0W 6 W l;įjN,f@;([_eL=꼈tYtidGI߀6P Mt4I)"0APiN( V-Z#T>gPuAoUv]??8E>c3[<^.pG.u;Uh:l!@MTI.&tM g'Ilmj[KBН1#{ EM.jTZgv汥ZquؘAX pާ6s/n#d;/4;Q&wrfn'aM.R4~+tinlGd꿪I--C< %ȁ 4$^: A=EFHlDi)jI NRMHIQEP\Hک-Sc6NL$ X O5Qi}-+` ^bBI9SLE(E?J( TOIg)s8ΚtInq^WIYE@fl-e˟%9 ajpsfҽ|@^>_.cCYhh p۶m+R,?I]RHm` FnnA;,OZ~+^MZ\iSʍCDd@ S [PFHPz g(sJm+)9pfhp:O7Yp{s<v-\.s;Qhy-!Ҹ/mZI.#u ALC]֘&7A : THZ",`8eY q0 7 BrUra5 6N.>.3FKP. OpKA$%Ɵ[>hygC 8EwZ[ǽM"7Ip_흭ou^' o|P6+ԚZDi:0 ~v(@nt+I5n5;@:3GqD$j76-)fAFz"} ZGo 1ʱ}B`5* G(i0wQ)u z~52z(~+2k8.pM#I#/o5)AզϺwi~ I!'ea6>fnYٺ iIXDlLz(=H>boQYidXaP6.l+FyC>lh""˿0w_K>xxW:^w %!pk䠴#ܳ3m(Ce:~_N1H $ (0 W#VElHEץ%@3zEb߄8ɉ)l \z˄ɥyW"f@T'wz4T]d 02/(4Ti}|P$۔vUm dΫaM=L4oPioƒw}Wx#g*;0~~)aQ< _|v/Sٙէ 3PCH>/'rjUCBih@IA@IA ڄ*)YL =$a4P$h\vZae O 3fcM>"h$F4T 3[<T7KƘ4*"&"b@{P- NECAuIEփpؠV)jaӬ2'x\on,hb;{uGR纫BNḆ%"b&G ~6[]!;3G |ߔˉ W𨂄Q R$oT)(RvMAT14$*R#WۄViu2<l/QuoR M(.~ȵV`*cuCA!@ nfFP71^T#.tuMXED\AmQ "@2)H[v+4CdAYtҩq7T m&PI<&wUD&bmE ,T]/v?H hW`t>gT:E}WJ`M `s ppxovO;čw^k_(c nO'8exCF5ʠRI&(q Zٝ%,ةO|Aw03هa0I0-/Ȍ hKOxxŬ1Qv^b=Wc-rؘ4gYvoFlsٌXm.0/Ev_kH-p+/q"yday^%?PZel~EP" mI(lUfIҐLGlϲG @0@]@U&l;w+b+7X{եJ-ViO ;KI;wT(& 8 DRG@4sD5Ka&Ath|Ϫv"{'$c@ }g IX 1-| ?D B(<LԚ92 @& d  ֈk tl^ x}D $t8 vZb6R" p"[e4D ;%Υ`)?V"L$I PPz/stgs53'Rχ_ es-XDgq:^=_caṘnuI?UQmE쉊҂mqA # LÝ( 0=4vVaĥw)Mk7M @vI{Fʍ$EƧD phZH-ئ4M 5mr;$iUb Fdlad'T0'C?ʅ`|Hi$X;Sh&TIh#si'hPѾ鑪$ڥoV췇\nk꾋þp|LYzAK3u,8m0,e:",E#Ȇ̛" JMO ),k`` J*FiHu.#pmbSZ5IQ2cYDOmdh$Ȓry<\t3-\.w$QvҦ RO@ֽ5.2wZahs}^?nu<,c31 hW(?_|y/gs`7 ^az~K~#d}{5x*B0hW 8uD]ɏD†}Od pd[̨?O/O/t\; ` C_7XٌskeСi5jFV<4$U&L@אYGp Ҩ#U&cutNճp .v&!cwaY\FR> fh&& 5lJ>&$I@P3^fPCgZK΍չkI D{$ PPt&k)"'mK3?TϘ]FHʀkG5-54(ZV6R(`Q5,U:\b4E)k@Uua8 D?lA}wOY\Lr;Gn&(~w0~ܬyM qLR HdA&nR֪ Xܤ6I3nN*i7150 jH l۲ $K`@!I s$U5-SZ 6,S^ #-TP`_hQ ZѤ7Hhq&s m4X<#/cY'BgsL (aXy@R&P."h D@W&.Į#ȯlN 0fP~g3a? xZ 켳/, sll] L,֐j%$ׇ>Z虒uHD^a; @6GW!Ue+JC]Лl -i:uTraeIqoQx%}OsYr8\k\S\üG':k;vUGN"y"LuI@q>UfDɨDEWn "iIiE4쉀@3DAi#!"d`V fj^4_(Lٯ> 뙾57(ߔ^^.m hh'G> lLhWC~'/ۈq13# LM+lO6!XX!Z'Q70(QDH"f" N6Q-,^{& zʉaN*?gtRgeLT)R&H_eœ?r|X_i2H43m:LEC/%!dQ3 'AH .0"DYB6ꖑj'HP;IuS4D }VNxyxe 2;z¶(*J6\ G+@Mh7 bD3D@YS[}B{][@&j3Hc 3KpPvuWc=k &#Zf'ˍ$O&I2]buq2cXHFbMA Qc Nj$A0ϪH;}g~ u?fC38Nl1"u6w9:"HYhS#}P&+j"I4%9ds…)Uɧ6HH{'L\Znv\O#f0q0$.hwhG) Ɉh_[}Zsd Z]lJ1ʀ;Djo@ Cn {ˆlA*$jGL@$8I I>mV Dmep{TEDE0"ֈHk^\[ZɴlvTST͔@/&Q$L h\M-6Alʫ0%.S$Y -mRhfLH1mD̨I!#t76d*'0n vEM\IDĂ}E1"GK. BOPmZu6;.LG4<-4s˘nN#TsiYP 8H YB x($CCީD%Z 8;\?[>Yz8 ph;PuEFyX  yI" FPcKE@i`u#eo&QNqQ1B`).?HJ k-k{>t|X &>.KK]cy`7㤟]` `{`@vcf=F]x.5;.&l@"MP\dAFݫumbݒ&/^VX5Q1]}W1|&Lg_-&*Q6y$QSHpI3hY&"L .RD@ &HI%I0KK#T 506[nk4;\H$HhЦe3hlTIT,LDnˬ|>oLkҼJzGAF:qpw#i_M Vvd"6̓6$ۺ >i;B.lIj<ƽa'qY4XIDˀ(g;՗&]v80gu/2 0>tqѰOՙxkPCxXCOă)-t[v#epy> _>a||]SSG#I- 5@ X|\#ek̉M %6ID"poȦd4Taz&b  褈[m]73  8KuB` ?#"  sDOPl}f)HM?TO> oUD^QQҊE.GUIZS)O0Im?0t|_ٷf pp9BD/P UJiTD 6I+i,!͸]V;nr)[>|gr,PI%Ν 4Wc^||C`: c8lB_ g-Td[~{T^1XcXdPa ^RiTO7Qc!-Alk':fҨB'r0n.x bYPT!ܚ,gh7N4S&Iˌ&1&=ӺbmzA ZUߕNਈ33B$*` )j'U~\E)"6X$DvDK.NB+$I<(8H>Qxx.o+g2`7htEkH:iU@Fiؘp^H0 Pt1\f3c XXY5hmjE-M@ o2.B ߕiPֆ7PV*+2b @LIVDrHu"n陟(@% ]1.ߒ,[DG4ykY (A1кV/Y9< s^$wex<@޳3Y0it~6זcw:" PxsC(tX6(D!&(nwRADRLA6M~Y%"TwLAT~pq]$M 0" ZA34E$'Iu(I"+ݘv‘W2H2k;+Q"g舰1ʪ` V^8# s .!@.>}!֬$ yAXL26[n%p(V餐8Y #5s`~cMdO4MF; L"A*7fOV:04U p*EĊ&-!  d\r:L HHs2fMւ/1J.Lwei\EgtRd\,-hTYqyfHEґC [FZUmXjd6( 4ԈmnAtbo&k}Itx'SH|msCg00Ŕ`~ூ&9(Gnnj"i5} (N4&PiP kslpAo&7P~{JZ6Zad.`JϥxCuc #Xb ,H3՚bk81L_^ ayq{%ęW;Su.Ցr?/*/u?-P/^Mx d3 阯/``1$PR_YER,I0EH۽pK]Xe9v _ Y 8TZI(;y,7HzYr|L@0h#qODv3.щpq^~.)y|I+ à@7T E%1Q[XP>0ڕQ'U] PU MG\H7)^U0 GT]5\9\L fIljpׇ BDRjT |M[knWYpN#F4qUQݔY i Ok@>bfAT7Xa8+7<;1'.Ap{J@hP@Zרɰ, x-38C`Kព2٬#סtk_̸q2$Wt&LnV]U &I>- C]"WohE*$ҵYƀL:4,kX"h I{Nv증 ;?A "-X[ AGkTXíxQ&ctVFZDAWWW:>7\Y^,ٜA(`I+ <#lIeq,s+q=d^[s!mtH:fc"Ch V?Se1ݕ!Jq|O Hl[wI0$] " ŅHhI(HUM8N(ӵt#KCEY 2? -tYs`eX//.70EZFMʃ^,2E#x;!C"l2}S5H T"*~1'mY~i0?$m۲kM'"hiO[)_OOC Q"i 0 M$&gFDi<.L&Fi&|ylzW]-pۤa=Kq+b٫A$}GMIa&iW&$Hsb} 4 LQD #I6h5u4#{` oJ-ӱDHK"*oF{(β$Q `GUm EDE&cS@ɲCECd p#o88B jIQtZ>'kI DOMq\\f=ž\Q@|v*(/E!ޖU$t[&˄΢V@#q3E7} Mjd'֊Nd+Ip-ȅi E!2陒hM$Z/i`n #&ӨuvIiM8r*{Ƶ6 3'PF@s  2j렂I50~纠rLAHj4w0@oZ37AdIkOmiΚwLnfo*!;◊|k0pq1ȸ'D զ >ʾp TS#ީ I"$_s$ I;Zd TTlLD3H}֚[jhpc?u,i{ t}$ $ JHIn D`0A^?ʀ!B@[r?UIz>ʀxOH#6EhWEIP}֠fȂ DD]wU9l!'Gi+ 7dx;Cܫ+CX`'hGf ,8qM:&wr/ac|is{.auj?*"i@-R.k4` 崥 d4WVb&Ej(ck8A35QHm-##ްUSN>w%zsAdjtM d@kuDh@o&`S^_Pp X@OD$j NT.lT(ҰbGxN&}DӵWs̴˚u/@R~>ӆk[Kz3uA~&ШCenjvIdI+U- )Xwa1/ 8f^C'u_2gfq]<&$x7eDC-<4B~e# :\l:ߦjqN1htňVY7ɡk~UJH [%s \'J$T,w˪Muɥ,T"AZrfS#A0 ˾ d:t457`5eKU II#ܨ FW6_5ׄZLef3Xb|GI$$UȬ43'I 1I34ZL@_EY^x{%}?9L\6W<3Rfu>Mi*~H0dD,$ak jPHqkԐ]NN2֏~uTȍ2lK(dI=>S9\BǑ7q≠vA@eT_e#mqJV Iձ2D"7iQ4m5$uϒʻ9˳H'zmoV~Ƹ7_=>A :`LZh,7 M~5˓ 8zpܧ8+\9juTX'H"e u$b9[)][f(' Qt PėٗPC\@X.KS7Q>Q;'D9a~f/$Lp}3 vQ)ήW\ @p5Zc_ IPGjsA#Q pFʇi'jcYGvzv.K5 !zfHުkKAtIA-6&H46i'} ZZڊ UXKp58Ivnm,gbEV3c a. uZAS%k* ɉ0@653[D.UH:`7K=;;fK19G2n4:fj=L9O jeEFTrzlm;R V`CtPͯKMD%j$[Dhf; &=UsAPSP*ְ$?q/$I^@A  QǛҨ4TE88j6+3+$u #t+QT)h:vYB%VRzc 2 $cbcc;X6e"C?d@ $ =@"fdT$h.f"|Ly~d-SҠe 7ވl\q=5es#T26HV{@8f-t$A X@QS"6H܅<6lO,wh̋2"Mm7MHX"Z (ȕLbvAHxh 칛2Z݉ Hץ/~ 99yϕ)S4U/B#+Б4]` H6Z413N$i" ]qYF%&LE'\ (CM:I'\  @0&%YĘe ;ӲkfV4]1:nmwb꽯B'pzX\֎|30BIㄓR[` vCzΘ$[rfWDwZ4I-u$yLy鲜6I@O;Π%cdIl0NzwD[6|6ZpDOEATFG炆-uǠPLlyILG -i'f\^Q}V6왆Pn B@y+ GĿa|L.kQ L ܧVoTђ>SNKp110s_u:yO) 庚dBn+Kz@8ӭ%`uA"dTQYI> 굫KBɈ& D d" 5'<6S1Q~˗ vV tED΢@n$h$X9[[CX[ ©"bojMfI.16LLťay , Z` HcZՆKȡ."dꨗ&GtؖR dHnXm #$j.DNW% qLI+}w_af>V!n#IŢ*p)ʦ(4*t8UL_#v96&(@"5FTQ 㯼Rp;S@q[) ʁm+F@H svU5A) 7j7.d\ENmpt4e- ;U{{ 3Oy";89gb9ŏcUXc3C0ˠjlޝl U$Hb+N#O TsH$G3TDV ةSsI a1uHBD L#ra\%'e-.>a?Cf07LV~ |^ oM8q|fy& \Z6ކ1`njzL`?C/:o?@r gis>o˜FIW9wfqb$- nfe@EH T>"@(]cC.kUqH t|g10r˰<7L♰ x{YFؤ2]218i]|nr0ca8nQAoOHz^Әcfi1z~w-Z`騥\`ӅH21#.`PMM'ܠp7 qƓ*6Su[1e"C&*iKh T)aU)u b\?+ZF$AO2$xP0NK@A"R"ĭ`; ~ f35GJMw_Y >q|CGM9lrN=pۇ-xpm5M&f0- ᶛމi#p)E2+T"@&+z-b@$мyw1tod0:Nf.|ϐP;l=Ireع陮\F\ehF+?rwQ$h`ʇk1I-_+-h4dΨ:wSqNZ)-RAu^.1^B.9*h&DrB -~P D H  Ȫ1y'zSӨG:`tGA#P&wg?HudE=7&J! 2,*4DjM"-7̎uH72Zؑ0` vYxjCYOV#9bI+8~ިFKTӏ嗒ըSZkSq0aBHhtj3[@PZH?W^wHEE0 ;Pq\!LyDR7Q]TI'oU⽘eq!ffyC"CR`oM@_DͽT*?eAg `=1#tjoj&&%Z@}4 $$" sC8ܶOaO`c/8xsB`T|N&OMq ?eH;BQ-BE\)^c!Z0pI-eyƭ&Z\!6W " QD[ aYET$)yP0 Q(Q2T #^3]&W-Sk[wz.,/ "Wϩ !&z*WJRT)JJIHqk$ JUw:fy;<2'UZS^9^09 !~>3\I.q*&d?Ў ˜y({( ~3ZcwTy{  QH5FVbo0|c5F&I$fI.v@v;na J& c+"u }l;={*ӠϏ&7H+b@1I* C|0+^Q5aĪ$H pnP *l߲E`K7 R#PT憼T`tIG:di6gk4;-2 &ܮLWa4h\1A;Ȅlq @5YdS$T-)c~plaԙk&EE|x$ɂmA&O kI{l!.ܮ"ت TqP`I4Kf$!l}[ejN&u@6&xmY""fci+Gmc*'Q!h M9S4ie 1^X&ҸǙI黍6vP0$ o{9ҁitMI&QmȬ k! Z4%y xTK:d\Sr7{T.\T~9fO/GN͍KA|v玼3<;~;]1v!7N0\ Li`Q6 Cw;$@"n 'Rhc5n\a&ޫAkgSX** t{:)uQԕ]db1 inւDLOo1[CAz,7nՆH6~/~EfD(/UI2% NT%R&U$EZ A$sd NYF--)؂ ! $>.Cu^%d6u$CJ@ʮ&GyL&&&.3XX`#+ JȃX%"EkZms VH1Y>k@o-gU1oe/V^.l0hhI$Ґ|iྯc8#؂. *Θ%}<1ޟzb\_Ə'dh Z Y.8t+IuZsNA?̛Glbk (ćX~h`}B#Hn&ǿxNPE#IըRPIBꉝ;#9Zۗ8_7> L4saNa|^+bk=ęr^I$Va mJ DnЈ b]-T'7.#4SߕxkX&'+YBWh$u:@cbc;F |dw @7#|y۟@AC!}G&NpYF3[/G1KZM O o /͵CN [`bb|Tfqz~k^Ox.m b?1q1\KkWbvQ6P IPN=lb @IԏŸGNe&>wx9,z-l`b 4į;/tgr~Y0q>fM UV @ H<%db~ 撢 0LX@ai 4EKɎ$eƯ-~e kz)CH(ZdBi/eG@.9¶[T\50)iONlC˅~]Ap  "@!Tl;JRDSL)4R$GZ2)Q¢Ek%@*bnDT Q M7mCDղ*jd2:1ceMIȟPL,CA3yLl,6@j.!đ- j$V$Lȝˠz ֛kykIo"4 ꭬}aAC4EfySC)AL\aA4EH&DII-e,?d@\>J=@3Mf~$VE.@ɣ@鄃܊ @۲ ppK54\-j 2CdT^l5I hʈ>y! 7ToXwꈥLD5 "m"7nV{!2[?Ic3p$^DzkH#@2I\kkCuAdLȩ* +)H&E'iPدaKH4+1pveII)JMȊVPE@4$Nۺ1Ap rf_c` lPH wqT/;!SDM`M`MTP"][Ih'Ti60XG&t/C_I.M* mHZ?;Ѓ\8f79+y`fXеp ' d6Q.&@5B,6F5]w aA 0qF#ZƒD..@b4wA.p$vr8X9_5Ut(4@ڼON~!t,|jQwjw@SM ,d5p.0/ C A AdU[Z  m* A6@Ai褛Q(DZH}Y-)yB 3PX( ?TuV˱ w$]Bq1.iMBe8n`#JO R\hq")#uK*:H&4P5]sKAeGY$Դ"kaœ$ ?8IЂ ;͒a4&K6n#oiRHQd4;;f12S5E;. M 6 …\h)EM šd+| ㎩6޳бs ,_x˫ۮcuOݙbQvދw$].q0oZ`v@*I]ܦCGh0e}oK]s[_ ؎!@bjnQh<+Ss  k$i`af*@.{N5)U"I)hދx7f02>! 7^;152{LP@%gL&;Y2$@e5]hRj4ﺀ$po(r`{ ԏ^Pd5&N$ =ʁ6 cJxc#3x< l0I.wo|!Jg02:#Xc l~sz{u<\V8ՉIs;uH  E@tA_D5I aNkS"!՟^fwۅ"ʈ!8ĂL3e 8|aw1G45\x.5$({ĐZAx7I. 3 3h&0e°Dҕ ?^& xH4:TLm&iVN5VE TpƝ @$rѰbLȤzlV[QzpBbAB[ 5qkٶV.D(yIY"'}ֈAAw6KcQ16% 4`pߎp3NEeC2f`F};3!~w!}L=MPB;cOqhQ뵞YΜs\LkanEHAL**)8?uɽ8<(L8DV\ ILj DEo'e1Y I3-6ZFnN#Pq,`37 $XLCbQA>g9QZ,Ơ ` 6S7n6_{tAYo?}[0|gsI+2LX.o-iBer{Z$ &FDM@@",pMN 8'ShiT6gduÞM8OgS˜HٱG'~w -&Ac'aew q&SN /^Q` ($`HPgp:v.\y<ЀEؕ'0kyW  6H\!ȩKBqk,hLM$vPhw~_WOx-ҺUs8KӺzN]k131шڇA<] Sd\X|ɹA0.`mywYh[k2 uy)I7&NhwSTS"ʐfʫLM|'uLZ(~[9 PʅMQw&}6H; ۴ت"Um4WsuunVb<sjj[s Xi V..g27 9`gG[aZF D܁aZuE  DH.|s#w6#Q3cb;sWͨ%w!WD ?xO3/e:6S8AY&ZG|We#c`k:h1 u^`SE`O0=9[-bwXn$RlGyA:\ u Rn D ZBZyc+5hdI_?7< ^7+{à _~2t߈KR2Y-_4 Lg:&_8CԎti*DT)B+ET;j{ ( !hK(At>$P)i{W[ԇ>CDK kN$ӎ p⾉;"@3B 3\@pr{ɂ]'0 I$oXA-H*.K؈(N$qCdF@C\Ibl%ƣjTkT8m#~U"74f]1蝈qܨqpK! ϯ3ZyG  h\xoT8_USoSf@p4CK;9]J4@j} c"AH߲_9basAu=suRne38ǪIP"4R\HY"LG)Iޛ ; `t81g T)V8_ZVuϺ`lhTIʜKH&p~,&9$\g#e2{ƨ=El fej T 2 HhfIQuXb;'LR&x@deihodVDP&@4#W#1\HLW=S F B ngV&MyYKFРd< UD-H/Ia XvLPEh֯qHج~cǚӨ4‰@Ӛ "M c)mD Fuhv@d`CjfG6 q`yU#Q3[MeѪr$$PDw35#C_k^ 򃤝IA+1-~xd7/_oQlτ:fK&ps݌1sc¸##CW>Ay5,/tI֛ֆnDwX / P2D/E7LM$';`d\T.lR(\ 5 wG&ynD"A'sK]ЈC}'K)YSZA"LLXMnd-7ܬ&bH*mt̀U$Ѧ+PBUȨ"H0cN73ʚlKET$:G盛feH&7]|;syLf08i\`S{zGep2qx'+16%@N7fP'frl0\'5I?uճ.e.SbvK]-*PEKn! :L5>'?/Ȼaeʳ-&ǕW:V LԟĈEk15ZFMSxS.SG}E֛ɨ J F"j"`O D"ArTY,whLRIlJ".$HF)H"0`MUpyQ:xA5Z4?X é^QGXuPsچ)3 WvtmY^%]9_.,C';cG4 Sc-h~OR&l 73'WxsL]xXi|.VJk.QeǢD@ \*cu& *=߁P\uiou"LʷbE Z"-&p%Vm"dQ).@P̑^ P 8BEaPĊ i-mG ""L[lLȵZ̭"ku@q1kɅ C 5T<ͩ>l=&kY`1I\]W3 KHИ??+T;eAi!@ˤTddI#MW"uMDBZl]T$I@5\eIn!Da\4n`M'W'ssX_9/Vv#e`hU y ӳ89<<6F^ =j/)w)XP(&^(V T i BI" {VTG> >[eDIߕ ybAD߅쭿UD UDHW<-lCfn{gI81fZ1㷪)P)JBPv(R%JR> ^9WurY8lBLh&#?<%!ྫྷ:@AXbPk_71!3[J.8(7KP#b6DJѐa&&$ʁaN H^ΗܛyFHwuu~rYvH#SztJ(AV[5ߡhK\dC .Z(b"9:"H\DDB ( ÅM"5XD@Kj+I-M^@cx.q+~*x~ 9sྋ 8]|'"E?" A V$% 1QZ"O麉 KO`CpY?eft&}I$ADW6g弴>{%Vƪ*L]M/$w(L }Mh ´7H^uO#$^VAAh73&!s$TB1ؠH]P;oZ.<{8\dwY@&@i߅"XB@`m DQ '"L z86$FL9@VdA0A n@E껙Y@.o_fGT˰|;H$p'@oI$pAQtT޻3NЗ%+3oDYxd$~Sb a`YʤL!&Zm16TRGt@.5DM+&̘O~>/ue2Rcs"f#x_Ժk;̫1/4CAJTz ?fwU]S-Y'ͷ]&>42 >@Zie75WtwD@$HQr@"kS?q~Wnb66&.#1^ܝ\h$mU4!AiHiv` g.D-܊Lq;NݥpH"a0 6n@s(DXlbA!it`i|R }B@>e͂q6A > CL&h *f8=kBC5Ƒ&3cs¢Eb/)[CHZp8ahu h#Ԅl. .<ϙJbAKcnz A-41OI 0Xj8&lT6c!ZΞ A=xDZy5+@lPdR0EMj$~T"k~# aw .ٵ& M9tdBei d.d}օ]XVTDb2>Q,s{] *GiDI lMLsTcEtPb"vKGPu;H "N#2>d!}g}0<+rX#{EkwObOGy,GcAvP!b;.NWfzu0:SrKDEI<7=pg&4WH5!MEhLZ*?T1$4Gb&,$+*R)Z҉4V@7Ym"+:NG1~W\t^{ZKu8xfbugKv&w1ry|&k p_f"G6|'vJ7O0A5+M 2''cZѩަ|Gτ=; " R#[I/䏊? sv/Maf7coE6E-3?p?AnM6SdE&vɪi;"+*%ZAIas`yIit)7DInyP4XfdRhmR" :hO@hB ^3h[ӤW}gS+{FG!dp.ܾc5kaO4ُ4s߲mMBi2G]& z)#t ?d*S (61A:P֗V"YK\C}fe1熈n "[`4mu]w3_3YLlRphWNAG* %sbfB#K*BqS DU߅UPf=Uu=R}SZTA $+yUOt%QXQSt̚l)AQ^VJM%S(\ ~;[ 7w n3nt\.5)*蹰s8c#ٵ ~3%EĐI )[aO:U+XXgXGH֫4 dV*xWRwP;p3E0h`'Y=_1y{.q52>Y&wSHSMo^1-+2KI!0 M ; ֜oENcP>7]EΡ^ 5 TȦ }yhI)L~PB0+e Nh=<Țo8Gs l$Tp&S&AtIڢOL;I34C\4\fZeʡ򙖘6dXn+@L.PLo/?&ί3czǠ%PE TPMh"*`;ip"vwk4Pė:Ll]#q M$Tr/Hdn}V˓S~IsM(GKY1@lv\x$907V?ʘX~ʼMMv$V7QBM57 2 ^&&rnƪA nΑSKը@=AWsLCbmyP !PCf)5&TtLR@':@"Spv&LvS"I ́dǘGQ0gIb";p Ӹ2iQ < I:;֚ u5<~ּr(WIkS5j! ()cRӨUWdp.n2',ZΧQz/|w+zQ8ټՏ-d\s~[sH YtqQqi@ QuCXLD+EȒJ`V znp̦i$;8y\E_::Q3#04I. u{6.mX?L@qAY0kP*MR"FSC r 8ﲈn9*TD0)0bM`{҅"b[I @A-.;@6P0\JCDI#yH:M.wt7ʚ]-IRA Fdxrt P; X',: lN5iy͚ CGAx- ;z-gNK5< 0DZ  fcPu7 5MdLDT)II4K` CA2xa4n6OnEDm\/9T Rgeݴ && `'L;(yP$ XVTL uifceRPih"p\^`yxQ"$IVs)ꩋr (0:"@P@'Ꚓ~<޹պF#pYr`~5[Z=GyӘ8R`_6D()iPv2\(yc+.̿OtЕ-3j@ !"Ӽ%/gFINO+\0,m=%w_C $ ɥH7  !d6M/tyj*td/W~v1/ YNF" q0mPd 5dL҉--hKt0",oղtA>@hd:}!#IP& eO+ V.6 @-7a; o!H+0 R<pA.|IRX6"*;N5 {(RZ&CZ.Eu.nT Ci*%Ŧ`kl\ oQ6 9iұDˍCnHUɒ6ChM }7'xYs3ge`qnn$w@VPi28 F;~kM F"NH[Nn/"%y`ʣM@_iMPH&n~9g=ċ>ˊR{0c'17rZFH+$A5Q<8LLd E4 )`LN raIpkL[tjw]m~DS|e9ـVdOmffk 3-vϱ.x_c[!`cY@0"}W o8E-:N`i]lAb@aD:MHhS,@tIԯdH ST'h'Vq((7.2 M=Di.m('1‡tFT Gd{%)dF볃an+4:LQp⸗IV;@+5P&P _E:$wI$JV6 +^U& 0e_xkȨ IXTRm<,$ STPvADZD 5TT 6H>Yq5D҉1Q*{I(TY3{e-4X~C>OBY?0Xˁ!ΨЯzKoF뙜n7yf+&DAϢbQ1I")DReV* ֓3y\*u6Nz)"RU kqZ@ku(*;+) BP)IR Xڪ;);7Q<*bȡHqm+" gT/2z'ȪAI*򽎃_8һ 8` yxNv˃te쩁6hT}j (!dM*2$lL 2ek3Yh$82<]5d߲AIUN3(dX$^ӕi)5bkڼ^JLA&Md%TH'I{[QxiBSΊARI>b/@}8Y~q $Y{r@&މ&(BaBC"I<nT~40'p*H%kp5Q$2"K> DY,ٞEV6L{ eL;MIl Em{%|l oGLnGQvO𵸱kI"8~s㾍Ӽ;<LC#<,DklЯLi!Po% B{=b4 0I l u}Ccy08/ VId\o IX|uqe8\5;EPh"g0 3 5x+Q $SMdm,u8$$P(y0MA"Ceտ+$@n2dVW.0MFLd5@2*bhTH&Sdؤ4sQuˀ@8G>$>Ǥx_x,K5ɲ@M AL eQ. OMlɒ6"k@iۅ0O FsM;/fsYfqFE@;װ9AH!|rk'>΀ ΃Fp#i38qo]7 "ZA.-$5Yp-Ti)I &LmP^th$kQe7QIf+z^,@#ti? >gRFI:Z,ߔ EAiZu'k&GV o@"=lCH¾BA]}':oA ?,pIk.ĤK' p -i D4vTX5XKԊ- OepMU&BMORbCIQ" zSu H4CQ~hXKZ"ޒX&4ђ"#Hh*}@RcfzKNO%{3MiغMyj+0F՟2Eeii1Tzڻ{6UQrA@ x E56+) 4C[J pۍ8}BPqL GЉoiQuik,{ @i6u Zheh-%YmiH$ʠyU{y? Nཹ5= ;/Wh1#"~8Dyy}NnCYT I2,UR/[TK-Mc .x A.FuE4'@ d:.7a34F9RBYܶs%n_ ˆ,к%S ܚ2}-uTkM'ދ$bT $_dNui$I$j)<\u vA5"a4eP@>lH's[dAdk 6Xd@n7EE4$4Ixp sctX&4Bez~.j>[W_<_eBُ- `\H 75ih?k#9NA@$6I. @&LcEe3RMi]$E4:&HA \QXDnB-\@!mM"Ip#Um(in'Mt:$CTOj!"*gT@p$P1¿ctޡ?2Sϒb dF߉3><beەMacQĐ 72jh$<-;H+|;ngGY~0f$.oظԒI'`DT"tM b&x1eJV`A"¦ rVi߿u݅cqރ㎫`1gHq^gc=\W8Oqg=đ\/h +.&:LXA$d#\ HnM-)0[Jd&FWop]K k^ &nҺo-v&%p!x' /JE [  揙ﺜe$4{:l`TAm)jALÁ@tp  /4[^5Mkuϋ1‘4'ܠ"_@YF1X ~p׺/iA$ϛeA@ Ͻ] s\exvh=%)[D*΋-"dl-D#OTUcLm7"-iEDNsR(1IU <{/O!.29 6+tВk*-K zhP"7*&D] 6\높 7/Z :Zj1 HMx%X'k2 pv& \8~(߈s8 .r7b\Icv &; $cdAJP- 4)IAU+QeʝHL$ׅPRMV$E9Z2_KvA7$A(p=yb[1Hy-7\2  oͿ*p"P>BvI4N[ ۄqHX&xtb$R K$@Z"h$+ &"{-8˥Ơ!~QHʁ?͗,EH1 Cu4Ɛ].N>&\D"{ʉYjLLڐa-ʗ GI~+`WVWlܟk+~WMIʀclkhoˤ>n0b ET"̦C\ $kGe7|8}'}?ĹLgᅂ1?܆Ē6 A@"iq&nHa\n t [IǨ7s09# {OKI3oOő%$8~TX4LXV ŏ/ڪiPfmˆ<ʈ6$vԄ@&o*&n+]Ѫtcj$$hMfmUydZ KRI#iE H'1ܓU#rxyCZh\N0f8@DqLJHP-7rZ؎ X*bd~Ve0ݢ`}E$06 Hy>畧`+!B)Bӧ YdH0LT-9M@ċp̔y*30fUH'߅-sHM@hbP!ot a M@7ky Zk+NW6]n&fk%nM{d]Α'[C w0ts(KvinygQP?^h HC~aqOէ!{Jϯ 7US^fqXan kq\v+:fb9- ۱97$`4J"uyhXi&A3EL\㚩oڍ& -6؅gE+t?-at||'<2@YuÇAEVMRM֘C\#Я1|oЙo8].zG3 jp &+'e @&Lv H*"Z&nT ɑ1K wPLrPa$iސ\GAS;駭 6eM} puh vu7:Iޫ:h}RDچ$J[ ھf+B}DMgh+:tm&)e3BkcbiOT&wKw%]jyRiU$f,ǭLZiy(KTS]@M3 @K.qXG`L š';ˆXKu<3ྗ_Wv7^~s-Ba"gmg>oٜf0 $}*]>+ d:sk٠SMLn^*CJa-G SiH.:HMh@@?UdJ&LU5"Gu8EǢDLz}ÝOg2/#87  x_Obtt|k ikE~Rj9PLKmF`UrH:@]q3"$poe4ڕEI_ $q{IZHP4 C apJn7T0ۄ8 kH" wz@˻W' Pԉ_p| V00?Z$Bnwh}tTo(OT4҉OU l[40:DDH?j*L S#B"6PU Fʲy"&DF ;B]r#ឪǿ* 5WRvQG=r󡦤 TYJ RR%.q{I&䬥Ju\SfrZ8eI-.KKA&@;"U4ПDE}(,O'UMM?zI3uahsq"`Vo AԞOpf8E&#b+!M lڞނ (wTT*>cYk[X$LTU$nhu6Zn 88\Mm-PIȘ3_zb+*`О} ,D2#un'b ؎31k] l b1n49WX\øX8E$ > Ng[aes{@+[,̉HOL-j|D-Xa>zo@1ΣF#8X 9|S=o -nF ~v+Om4%|!"Iu{$ S왉4Ρ"]i&by8H'."` Vh2&xtۍVci4Kp\Oպ:K+i* $,[i3"=T\EuQUzt -I6T6$H>W^ֱ,DPIB$Ĥ־h[n&Tu,s X؎ch֓ {.mf:/,g6L \,uMs+A0Qcȴ+ ߓsH$Xoo`QuAޔ $ֶh(a 2`'`!jAP4@a ڗZ&eډ;Q3o EE"l5gtǡAR b=QAȺAO,l'ΓjE>[O+x_Wĝ0uLGFS4y^)n,{#ac;`Q0;/%V-薏0KBE$LTr%Q^ȈpOd6׺GCK@KfY#roO dz 8ͦ`6>m<-p1N3p9㙚U3 uUYh&HZik1J<62ja($6dLʌAk ZL f~>@6@l?E$YtdFLfo7n$w3dX\N-k^Id 2=V|}6h]6QfO&jQA iz _#I"ܨ Dʏr":4I.hNy@%UReN=V56s 5a}ZڗnvAAkQt ^)$XM81dLT\R F(UEhM!.$b8Y.1.*51 J$:=U*5 ԣp?JMD$v*5SyУִ(`ip6DDX]ΝΣ]=v⟂z'Ou=VkȒ7:O,"aT4\nI&Noj,zI&R9+lA1 un+i+.'r~( 7LM@Ai;옇# P;)=CLJd]_f &,QR ;+.J YD8@lTq8aCnl`GHj.V< /ꟁk@a:ks;H}V_Ξ>\:c¹wkrn?K&)L4KdETgiZNY0+jALvY" &=ʄ €+QPt4j1:YlϪӈ*j2$ D+P1PH( '])Rmj€& h--VFhb!D8Gu 4eEPI=q p7.;ӔH&"@:eO1s[/LO |ֿ#8뵒f[0WauW+~' ׅxkę u.8xOc"~ |e_<&eR~&_pMjC@z|#,$ v6Cd0TM0Z@3I]G"2`LIq.?T^۩+E!eOkLVL zEeR&hP@q `UlA#6A2`KCɷ@i# 'ME$ MB>Nst?~ě)yi]yDy $TPbՠP"<$LaO4 AjCGMR*TLICP$)4Iy~"N'̒IΨd;s4#(Qk(4ѤOxx x`> ЋЮW[qz]X83ƑHP̄LYli$,-r5bjbw/f13o03 шaL>3?O#(:Ks|bj~4X8ғX/Ÿq|y]M`6n]ekx5rFI:|&tS.A1!P\ͻeƀPA)P6k ہN=W30\9uY&}jU6&|K!W RBkoJ5o ${.Wf&.A$< ;W1Áޠį/CNS xBZ,%|SaDDPMI6Az(Tv"y]A<>q1DLDAÔP?X}/e^&4QP"lTA7 5mTDZFݕ$:eLBjsFqM.yZvֹgFſu> ֫xxŸ ad҈޾!FL Br1:n.a;@2ytMhQ*!$(I)$RUW+)JR+e)"$齗oӃ)+.(A;*wEJ@@ETʢەT*MTb.ʨQVf_0.FMbQ-]0E(4B4 z*THwh5Ee}ς3}|[qrؘx$噄$zr+msp^\1+]$I4i^С-^DpryJ߈;ZDalį."`_&עctU0ˈAMqV_exb?cDj>o|<7<,0>[0X'_s(ApM[.\ߘ5Fr?~>=8nn.&&~h7qߥZnY~ V'/^K \ 0MdI4*ai*lzDLM/O::zAnqsX ??unֳn汝uWƗڋ.H"(&TW xi'aЛEĽCIf1\\\WI׎e"}uAHʁ"9U&RLH*$X@?d&7.Eah{; *>Lފ["l0e͖˜;0UuPM]C|gr72ӆ4SնfsA0X/7$L>mdH"+g 4,A@MɥHe8avzvI~3pnX]l|6Cf3Sk\珖.`~˻<=Ժ.[)ˌ|?H3&0'EA z-17]s17"{c9ƁĚB3ywuk.Ûnb$1_(>)aLlTgMdWc!pV!f3 8&u$"lj9 ܐLed  n@ S*ho;D$J54Tb*d<-h/I!EʝǮ ?t `@ƪ@PD`wLLlE }RH$mMn24 ,j +xos5W?kefEv:fk(#ZMW6 tٜ\7/p<64˨@c\4qE_RI1{$T$jiDtfwE؛ʚ@.@@2)qE*V>hJYhH yU 1~kOD l?ELD=4CaCAZ@}nIT"dцr ӯId߿z6?Mp]F4/0H)p's\bI6%q?VoQ  'ʨ&S:"[ ?:k'gA; .:~cIq^^gLY:IOٝnen0Ans&@nԢ @XȤxKax{xK+$cpoPXb8˩H53>R."ʈ-u@n fj%F=$dsR缩LI! H AVӲHWBkHzɱ`upL@ w+'ajm)\vboTj1(&D]hKYʩ 4b]Ck㲴}dI4M?g{-P a`l{Qu\Bd A$k"QPFnQyQ:Ċ.i_[%6kAڊ!@LtϞ[nʝ'xDW֨DܧOoPV')LS,"ܭV MEfh--ISHT@޷]zW3)v#S T.,Mi]qiR(H"U"jy@&A-Th![u:u>2>wʪ E"ER!htZ]3$ Hl;HDE)2A]I44ɃŐ!-2H2Qy櫿ѰX#?#/Z>5:R2vY>`52fb&B$+"q{{x[_q7 NҺzW,dp~~&7+1b&_7e7\.n$Q[.2%WQ&Lϲ(n* 1@E`D E]B$IYSC_ `3bbѻ U'ꓹTDމuhdJ@6V6q3$jA4@n8-=Dp6P5ډcirrEScN&N, um+r7l5Q>cDP h 0m H-7 H1u& n ( ZUBIl0p(a1+*wBmBSRz Ax@^Q RxKogX0+0ۀ4vHEP?-k'ͳ7XV9JRH"JU)ILY~;9LYLptN~q 7Ѻq c&G\_z:^ܫN \SA TRfP4SJHd H|YBzO[0qO%z|xau\S`qsI" eSxʇiHUkz A A`˝䨍&#24ɯ ,p Q`DYIWMܨ6lww:wSo8xs|`f85\ FSfi:$[u-~:ED{.|+0 {Co~}W>Y~#t8+A{M]sT/D͇%. C^&)6"&:J檍V"$'d@3@N`-.4®f;bZR970K[. jй `l^X9Gj ldr8~S\Z җw ;(H,krv$7Y4H &Hs!1e8Y-=. /L: 䨉uH1F&LGtچh@iH0 :ED jr$S7Z;P M PlDlmUl ;EublDD l0Ƴ+:kA DFoD立ej:!,4}iy 0_3^FV?p ~ދUc?(<ǢZ@h]& Kp4*JI'JU1?7f11VA&#}g]oPx/-˴KG݁5`Rء_A̧D1]e< /6ˆ0;; x&5a^}:{-x >WyZ~k@'`ۺ Zf=SLT8THO?K;ɭ@ ~4Gk,k#\GdM)n>W0r4TW_X=&Gkr@G`ǻWSֈKiRR\ 쩇T)0r?f@P $*ʼ) "@ȵ RuG{]rKBXy/hƈdL3`U4fߺH$}'Wd:fseL4I6@S#qd{L06izOʿ/canx'^CQWC_˻-~&M0D!yv7$]AXQ7[W]ڈPD{ۣ bkp%pa$'h^@]a1y0A-qWK;Zư9Ӥ q-nTgIQkKڍjv4Tiu%dj(81^">6"AOk6$~SYiшB'~T_[k+"M;˻ /,%aq4#m6~Ҿ17|x?qb W~_W8湝1t9΃!lq*9q31IjX'efDm(2@4ܩ$jI.pD ֠DHqK4 L2P+0 o .d 75;#LLk|MIcnZ>by+kSrLn0`ڋ-c@m#stO.W0Fd跖a`ekPUߪQ2 R2{‹#Ԫ"`+ ӄAU""iMmEeDꃤZkIȏe_hMl)ùsp!]ͪthQB8~{T=3+PLN3Iw+gؘhHUUIc"iO0Dt&x- iA}?uPhZ &mr6j Os$ĈB29)Zj#?I'uGک?Lm+X;/nd`ܯ40KFR^]xif!\&Vw_ '7Aܾt|62/Ӳr}7l 3Ryq_1P2fc %gPDm,$,B A1 HD*I􄉟,ܬ+"gv8 CWXqmQOb)Et&kizvIjH-T- eJ_kTGHw2*${3Eb bk'M'8A7;U 28Dln]z cٳvk=^YsSZeq݅1" ɯf("6~Qh@ O~ <7:Ӱ3xMn0~nƏq17|g1z>9p$7+BtݖP&5T6<(^QjUQRm(RBT% \ysXn&L)o sA#=H_F9.ᬏI~C.0_lc+ԥ)-0x2WoG<aAc/ͺZxf:WsybbsnJ5,E "UAW* $!‰~QL'hW6_1.sj6;ܝiR}U=xKoK#_niMU@-2@1ie..7' P\ڌD@&k9#t}/c-9nlb|4v!|RI FMc F뵒HKIpb8:Iidithk&WmP9]sE]y (2YS6UUH*6PLuRg^$i~p TP)=E,L\B0_"`UH4TpU:(R ,.|cs v10A=xŽ/ezvW|A<V}Xιs|_:O o-BlL,*ȂAXf 쩓HI*5'-'I("&eQ>7@ i{.I;*LR^SyZrw^T @VI{I9:$+ 1$5ACV hw+o@5\EIA " @ZF@TMHQ++O(K5MN%L0O ǿxLi2M;Ƀ󟠘,} T\w PL*>ah!{L֦RAFBJ)0`{&yUD @"UYR M ED)uCLw o%\+8ad';#T :$ Qk OM>-$";\I`̃)֣ C:a}w4#Qz/~1nlQ ldm_tGٌP,BאdH+w 'T@-sM\L@CdOm=얼 ";)D8Kq4>ZM9]ֳ7ft^N$>ˎ։RT&& $Y;Zy|,SxfkM%}>~p0>,w-v'C'ԼQ,f򸘭n&!MO}>uÜc0CqβℂF'Aq UL-nلWq&-fNn kbiEvPSibWi dějDIh&o kL@L.'3Tu-DMT$72HGn{`%Q@*@eJ~(j@$Zcu9pkdⵌy !c7@buHDISt4w Sv2y,Lo /X7'\cz'Tgn-t:D.b.FixP2$n6wޕTya"K`8f#1[E]b4PM 34> H@/MlҲ4%@GvT}\ Mk?H""$mL=AL;֐K RN>-I@дh&7-9ž}kLUy'e2=4/`pc@<@DЊQLWu 1SE6(_L@-}moapV(mYߵ~"GjnVZ}S; +U$o)EwN]B}x95@mXf2a畒S&OHlf'@\dM$jP\ \vED{À!bѨԥ-J͍R  l:-'cMdăbAB즋R ̠C+AWM7(EJQ"&MTcۄ@#,7CT ]~SS3=;<hav'I+Qw|SV`abqY-ZiBUDB*"7Wxha'T,RiOUSE&,.P@L(-4[czJ@@J"Xx^COY# 7I?,yvXQJUQz)TWe)P'd)iv#X %J[)Sʨ(u`1/]:x35Ӭ:+4D/!["fH@iHDtLHLA&l/yDփE'+f.ixk,k3(q.Jhw(؛&Lְ OdY H$i& ^u7 Ce.ɕd;R&(;€i DvJ!kbV/p~ׇS`aj/pmNJyg3CbaN[Lo+Ş^t9 pb+}UD(XI0 p  $ﺤ@µG`}namfi&;)I\/ys5(U &j ׅ6D5+-uXFCoTb lwPl+MoFo.#5@鑰ؐ%աMgHT17N"?;S>#U[v&+1=]l Mf7bH0 &".|ԀyZ. Iɕحi0\`~o'žM }#f洢@ls$S]di!"`w#V L!N$AI&o ц=賈4 $Dڶ3 %$Bvrbf3 cv`(/'eukL|LwV' x X-oţe%IBHvGbgjվq:M=G h̺Pz&_5FrMu @%lm<i(A;$Iz(2'dP88D[Vf\ۊ Q")yQ|;v[8ngf7XFێhj-;@5g1" -1-Ѩ=a`fbcΘ[ 0;/ğxWfr]f2XYTZ~|s1̿5ڜaN4:;.l c\8.mN+cM "BCɸ4-uT!Mim'k0+ZQ @jQA[-o{%@D3^'V@$(?Hn9uJyV_9tbjIPբ7!sdsoٙkKDzTLP/y>ytz(:1YwIdB"ƖcxsPum;UGI$ȁTT}Phl,]"CꡩtiuP6xi"S''x'ҳ/13 o׺W46"vA_+;~+stNeG6`I \E a|^o/̿q08n.TaA+ꪖ<{l101-lES9Hg\Lla{čB'"7tE8@pp"y (9](DSPPtv>F+W18uotu,]ڝpKЮ:O}Gdp~_3Fe0I0#t:GC+] -.ʳl8n qW☌8X+/q&} kY04kQ{4[KN̎`l] G ?foLL?d 6iIHlj6W({!+?vo˾M"ȒTԂ$rEhܑn+FE0e0e7a%ka5ub:n2odMw-1_\,`SCd~3BdĊs$}|+{@KQ̀R֜G\$p5Q &x +;\e8A%i| €oI ߄j4_G.*[z3~okeeDz<-{/䰆# 4X5iq IA"*vLH뱐a35YO}#t ,q7 LdIAUQ 4eR7O >W2' ˯3=A<,+Yb]z,=}knhHZ8ai$KH${`V TD\PkXT/]۲@/#-1:`#lL6g\N>YStYթy@>484 ,N$>"`<M+oxŮo:zMv&&#F[Odg0|#tc8`?٤M;/scv(jD$ @W(A7r64CrBi~-7Y9I55ڪgB4i5>@Hƭ) :qQUɃq14 q>F$$WkuO~S5깭yˡ$.%$$=زhemSeV<+e:q^f:pX\z6K`0ᤴH'ZI2dH5!AR#HeqJJljA+O$PFвFgb3x|6]pzs uL\|Yfbo`3svz~7Qfi W?vnUy5`&fN4OqhT^bԨZi%o sx^0vk30"招> gu,6fr,pc1e1sf(0G )=n)*z즍Sk E 喆;0 Iͅv]lr$p7)[ \t4AZ;lF#]OGN1Ia&/6 ^ؠ$1iEC%wA8ǪVMMX Jj+4CLDAIo%݊$āHb.3Y8럦b`R]i62T4"Hf*O0LH? nV52%LfA3z >2C9~[4 ^h Fyc8-&J79 ۼ ӱ2ɴl5~S=57;i'?dE`lC'``qe~ zMʌI{x2@ e~/ԳG?LWrWXKD&.]S%|TR+ ]Y7R*A.+"`8[ aa$ E V#T2m(=)t0o?ti3) '|[v3\)& }UTE9Che$R G[\YjΤTRIUPz7I .;4Z9y5C>K 7GM#ynK VD0p h  k=!RV0hDvL' >kZ`0?v3Y D7'aFnpw3kꙂ.Nv'se |OS9fe[P`7TDŽ=3Lca,L/^Cz\fs b; xH+}G-:g7^,1!a`;Li.s[?x1F X 7c"Rk'ϓ{pۉZ%w\Xn.#X)5 - &LjkA4Y"b(4U&> c s^`.(D2A Z ZChyL?)h;r{(8 C$BӲIԊ if&E!DȆ"Cv[k tdN6-'Dm5.8^_ĹP2hk @Mןbg11'NM$j0ߤ!өO/ʰNh`P_uDOW!F4PA;JWoTߒ*dI>j@HfX0 #Tɉ*'H O)W>S\rAň_06\w0E0ĚN UZuTOdP-Q TAQ MA᠁"`ey\(&A&`-4I b41oLhq#"+Zhn.l*HZp#I]Bʁ TET@uYJEʔ)JR)&TRTl:u;,/^-sa.[XcCA' 3«uGayY5$0]A5u$C^;SI^eg""*u D{*d& r鉠4Hl!r?{aoȡP-)H#P2ۊG׼zz*HlU &M @ 1UGH5M2٩Gu}c3l;Z `gW!zw-Ţ(o!,\Wθ \F8.ߎ~!uXg8c[֍_-ZxV16߅VH4H噡DP\ Ab@D,b`O aC0i&.K" ֵEbDo;s2faaaLH 8 E'M3]G906t|H% 0]H[B@$:dn_.S7tɊGAtm T K^;t$Ijj}ʤF"nl`܊BI$ԅɁ<?5O'6)΢Ε` 1HdgWxYx9ֳn6k؏mL{ Eɑ(V&j"ը~ GZѠ R>hտ\=CXӺ PlIP:`@+bL:hY"c%E2]IQÒjyvTpkʋ lzýAv_5uai+og_1q\|؏%I+D7+$ւG{((Ax& H#|"$ni@`P 0~vkFiwuGB;96qؗEb6xGOUOFY^RlAi_/v4{\-w2_9q$`!DF s۲D{ n7a& *z.ޞ|39yUISIJ̀(R*/ E 7F 2b@11OTmGM?Y%Z=hEIӯMAP@ ͔NA ) n X.{?sO /? 0F}M5#rXxë i.v\ 8\qkEHb .#XvOyM6Z~Sf4tLYuqYv%G[Fjfi>ފ\]MvQ&?TAt۞jf!jVq*1@bJ|Akfk5!,I1Zt*)OjiZoU9];}(\- 3E&͐qoZ1@yZf@vNH uO 73&7Kd}` Se@VK d@r(Ӽ$NA>?Qh=̠ )Z#P"o --N " YzcOdn~.S\6 F#t05/IH>kpn-^J0rCұ1qqcE-vMLn+eHW[c")6_a3в_znsxCc5nMe^/MxؘxC 0Zܯɝ:ͪTj{PM'ؔ9|,k]LqNG9pʀӺ@.]W/ӺO ù,o0?2\\%8_76CAd2KjfM!Nbo_YZe4{T O!ϐ@ߺjDkSy=%"?dFq/<[ 4ILkbE-9ښ5@›^N 6B A*%AC8؄q㺛R[1OQ5;rQ" A d@$GE""fd +x"6@3BBRvI2T)&jV '}E'5*$I1R}TYDI쭤ln4QTG4\8N x Ÿ?AԺ&kHXiH &/"(hFb7䨍.P{*k Ǣ$9\z(=suEM. ڪid:d .gJUBe*hKEhus㮂Ϋ󲥙R:{mf+I _x~'f.cb; Ӣ=Dz/Ǿ;x ?]U~W`"?5.pj!QRP+i  SFȠ*e& U֘DF I\iY?gY.&Fdm8C2 DHPNAI(r+(3; _QA߄'dnO"XtO1e4?$d yNi%-WG(A&'ŒX?'j?dO܍xHFayI3- z," h M]Ο3/!gIcbq&;&}ѧCHtXWy%=d>.U%n Hؠv;B~Ui<^R$9D8q*"H[j>OD DϪhH+A)*fˈAu=+f HVNsubۈUT 5"3>WOEua?9 `qkH/oA|azO tӅi`qA3I+/to zP=;=#. ]Di3EAYA$ET$E+LyH]t:;mc[:KNMft4KIO tsT4m>x3~`dh۲<=<LJs9ccAk\:$Dי̿5~.$=Ҹl*j=Yl}>;.o 7q~4&6\S4߅0BȇQn./"@<%Pn YiiV0\+R{"dnX$4jm E`du7 GhD ׹/uud3Y@Kp+d37;0! D Q$3~?D8N%Y4vZ"N (A%Л"mjDM {(8܊$rm$i,f즒DQ(<온pce5rJ845uZ&_& FI3͔ 8jt(4!rhk˚"qPh H6I'OZ_"%AwzEnPRAH u4 q&kUDDaD;sMHfaޖHq'ld2(VcbQ$ndLh-Uov|Wֳc'My*lF+ o2~ λ9Ӛ#spAnˈ}u"4{&D)4<Ӿ|]uKsXO\aV60;Ϥl糘M W\8@52\mM4W"Ϋݖ2KxGXLg3.%q+('B͜"VSn"`W0&!Du&5U$SD '0*)/F=6NYIA$ qu4*}@3* T$M@Qp#45I)kkrqdfQOlfBm)oP8lRy)ppf5-I *&.(7LTPĂGfY.Ҹ 4uC"ct8yǢr"E)7 0`XKh)Nv0VM(%#uFo1vZh$F" -+F;deh-& JИO#sZFt?_KaILcHܣiTyZ m^A+ X!A&t4?&L(F6E~둤aEXִAwP`k Jb]:E9|=w io.[!w3~)=Ĝ]8lUEk v5TD]N ui u8apQ{! ס1d֊le1ZE=g %24ߖu^dwȚ VI A%"H yd625"E?*1b`RF7)p W%av\fa;085- :GPwJpkfiq]Kd4\btZ IIAB\~DA6&=U2PgIq 鷮 LV @@"'ʍjj LWt (."yʢ$m4ͫʅo 3+f pq%dGa`q׈]5&+%G^ʰMaTd~Q@ he!HY 78WpA3aWP0UBTzV R)HR)J^mwR?U5m=כxsx;wPv{3W}E>ʓBlU(I{6kj^}F΁Һ7Ye286_)b/b;˜_Rw]^ߘwN6_-#X&mu P@ ~ xET$TP $=*FQBOcEM~@HN}UZsd#U"c@UfԋQ64@=;4T-:llfBE9$IUD숡D u -纅&LJ@1R)xM wAPŔ@ )DyfԬp Wfz7U'+>E'@K"uD\?cdE+e63U]4`EUs,_ZzJq_ൡ+4'D75A5LQi5Y=tTM)S: -mU&?DEUA$@ە IJ dk#<0$Sʘ$RMm?ʀqVj?0acQp }"utlMyLLM00? v ` $ #*l)Pslm6 ?(Hug.0#_.R},i)tɊ+Aŗt dLQbcxW͸iĀgԣN9C$i%KZ߬KAQ%AZQ@DVIqs BDuD,ڵ 5Djm E}F&9ZMyK 33ʣ@${=~qq1&m<&v. /7f]GsjO+?tД/&%@&jF+J CtZd\+]ѤM ZP D7jhH &jȁ=IkP3H2W>?x ?Z1Ayn;@Gx9vO=^渶Aׂ|.Vq"1n&tj&-%#H>`A QER-D VOAMHAڛ">Hd JfnxY&HJЀMMMchD.sd M016]K5ǹDLىEZ䠉ZZ5+L#LB:EĊg`1PsK}'ubW$ubkt@&ll`YP:HI&uI.8'+X~1:`[V+&A5A C@#QKRo3"Q _DA0+ TKLPFroXADԊlO=q1qng:~?Lο/8XF ]oA3e yQy'ͨǠ[n:Z%dD_r1c Vk&=HTFOu;mв^!OS0ܾS&ZH^~|f00zc |){q{q-3ǚf,\YOeNR &cuE-a !Q1dj2BA.h{(9EZF7 n^ȇ0UD @0y@&h.i Po ]#(.A2"*%YX-r#L@& Ti1xܮa]q&h\B Ϳ $n љ\D+Pg>+#W&T36T Htu u` r))kɽj@& ɛI4F"\~-'hk cҨ#H"iQY7IdƆ 𳹂*/0NN{ϘFrf3ñs/yLub;B$#KV&. ۰ւˊ3yZk݇:DlEWc%q6;.CfuytOxLD85֥{5NA O`i$^ xN#C"MPp.7]`3fdҨ0ZHڨ3*"#T &iH5-4K @M5x54+H{kERVWMV* pnCslR-;,8^2x}k+p.Q85_KWWx5zgO@'܂}ĵc^`DJãfmp O*@@̕V5Q%( #tW}AEbYuA6VmHD_$"?2&Y)"RK&iNTiMTI][8II H ü oh=`zB˅jAZ~3U *I[v A=i$)mH DBKUg˿^W˜,V:{/ Vq0#</:Oz^֗>f+Aْ=?;ena+{e~DUit1Ul__ F`, hs@uDr| =t5!(JJR'JR+evHGTRb&ATlS4+gfyY1H6 M7Lx[n>&!h7,F"|SAY@fr88 >iU`IobN}uJ@#r˿Nmq @/Iw>fa+|byNVgTR{dNL V",7?$UĝPfq6t)eG $}WTDB@IuwwCI53U:dvڜu8e $)Od~cc  t?eab9,t,y|)sZ];=ȁo0͛ײ@=!N'D5tI IZHfLT/v:#K$l @%(Y&8't`Nk+NAX 4)qkK!Xԑ&`ZE4Pj]4DêTtRJ-&YA%T/$Rc+R Qؽ 1\[4isа湏-qi3vI:@֛R;/E aVuC7|y nLyCdʋ/4i5m6^:O؝%Գ8 G?-ZH^ؒnփC{ezSYNW%B|QN~gC1zvc;V+Ù$AF/f;H\Al׃,pn#fLNg!M5 ,l DV-]3!C +fk/yZ1x_A&ZP? ϰ AlnO{#bpNwe :kQ G)0v*>g%Z IIj65 );6efDP6 !հ_b$l # $#uCcѥ}M1ߕIODN3 $IwINv@ 3Z]]֠NV56$zLp_sW_?nՆPy6wٌ!y8KAR<[w7 mpMƹut}   W ^ȡpplk>W5v '7;V;߈OβmfoOwN9HҸ[E &A+ƪDU2@ H.Q;ؗSatq"HskFR>xvAW tpe5i3$U  ʜ٩44VL 5l@Zܢ$F4MbBH@" ?-ffXsj@ϲhH(= ؔt¿iT_Go eS,.Z?DxC(ܧPf3X`ڀh5p$1_E :ML! 54ulEEȬkI 5 `Xu3d M PED"|P~?Q$;5PHptz,E\V+"I+F LMd>@t 5LNiˉH\銉MWxž-782B<%>zCfr{3n9DPi$Ɑ-$nɐ@yIu5sb `L>cf Q0 gq MkCepv[c Y{Gx>LCe\GDQ94[d f("v%rZǐXo?,3M\SS*4L؅9֍*`D%#P8AH&$zzycuKA H.I2j/ɡeX4qi&e3sEI$ڞ #`kX'oE&A# "il?tl8E Ɋ:1B{@uf*$ִiX&aN'YӾq ncdXӲZUj5oVG6m*$@ȼA5)18I 5&g*cLDpZkK .ԻΕٍ „=͂b6w")A- ?aGLX3ZA&U(7 Eq?P Kj=x->5^*Oh̻Ã&]߉^px/Y:$RFXn P 〠m_ʮ 7\`А`+Ze7GrZL7jH ;)"( L+v[`p)8 R8+8 X6# <ͥ;d p5 Y.$McpBky+QQ0fͷ+nR ~]ɴ@$зTv?y^ׇ& I&9Il߉st8dK0v%x^RE 6>ANƕ5Y: "1'2[`/u|<}0" }o)H3r,[n.{t )$i5"$ DDٱxDVH;]- >bco^|8 y$/EҢߔ@h?d>Jiz%v$\*FPYGP%չ`@c$".p4=)ZMGkQoʚ8WW54N56Cb/i'&Tb7bdYO 3RDUo5HH0A 2Iۢb+h4 !dF@ɀ1u$}'Q@7.J=hZ FQ:X"GDߪM ~ - s;&G$dqdi."'u"_@@'=v ZEM;-0:G+]A}\m@+„0,K@~괞9Pu5P *pƒL&&.A}3 4V 4 j`Lzl.H܊V=$1T-Tމ"9Ywt3=< RE 0Ɛ-J[*uLz4܋fRn5F/Es$!kދ 3ZL@T9f"F jHĝ@^Q7*+ߙ{g4^dQA0BS#^?d\.m ʐM /c¾~0[\/?C\@zBszgS`fg-p `u-mO*.-"6v:~;2ن9bsL~"{-kCD[-\@'sCpDLCAu.5 'QE>}A#e}~+xƹ|<]٬*'Wż;IyU#FȒLɝ´;\TcH ?MG[L=P@ixc$B_zRMܾY?$O{jw~qMDMET48Z hp^GHqpˉ-% \'Z . d,sND(n6&#q][f:T_{]uI^L uLS-^vYi |'@( 8ϵ.q>04\)A$ZIm$-*]$P$>Ey@ 0v%$݊HS j hcQq0&׭[Z>Πnj&KEtO3٧`=>:H QD P؋MftlH>/SþXfC-ub:^WC7~W6' HScXcpfA?Q-?no0Lld=`(\0*D6<&140Q *lrM|LA\xA1<%4Iq]4$U`I:$}QD  bxHN^}ah#~Q@nDFZS 2g`D&+C><#Ժvw`f3yхpav_A?T0{{~ Q};#fWI|> L$_>,U F9yO+fT-pAE')54V= @ZXbG9:A| f fWɓ.a$H\ tEUn h+mP&QyBH4mLœ%&L]B @$Pa7 nP~US~ MֹKIޡg]ؚi/,$v Fɨ!}TjTDZd~Ns]V/D\¬a["۲WRc”* RP&% RRU` Įl׆s5'/ ƭlڤdA@=+@I y`Zӱ1nce:w2SL(%in|P$Uqh4ߟ5J{FfG#!Aы?/@Lwwz菢\L>{4 qa."i)lh5Y$D0 BlN6U&z- A[J֙/|' ,@[0 a/ϫ%7MȸQ)kP7nwFoVkv<8KCpH5Eku\U*1m[C+-SE3+8Nw2^ k'fV+!bd}ʬ4QdD$4H!e^ N i5j"y)@e[򭔭Q!IR)JRA-2 t)*[v+-2M R%J*h)*A&o NʓU"y]Ξ0W+!TZk!7L‡U[+Goi53ظrzi У{zI#:Hʵ=9sx2I7\["eHe9`'~ˌ*5m+ӚYo 5%v3+9\rS~cKuWRi&-_E8C{0}꧝X*j TLrT7;~W,SCq f۩&&Q?ENҺ_&#IxP%>ҫP2f>Gz/~A)$,dA%&{QODM{lPse&#wW$M8`MA`1~Zwʀq0{N,tz,&xŦD08Y1~("UĚADI6)eKt3OQ(ak& LS-|+W33jؘ/' !LfxL\ @ydh;͒ W4ͅM6QspS>O-{p&/#T#LAla6ͤZ`P QYD68^Shu Kƫ @ $ >Z ^@CE.C&&' ;sc .pQLKX9rt7K'XQC(XQS굅0Xb* "3i6 4 ^Dd鍸@@7LL#pT JBPC&JZq u\LN},SeP>PDHߕM|$_{@D+Bv`} k^D8N5MEJgY< Q%ܕёP?U84}g(7W؟tx^ _,\LB>X%ڵF>7.w`|qȗ/w?;lxh ,H uH-l!>\.l`aqR}M?Hv ɂJM@%2evqL< <0t& VòeӨoEH2+ }o/30T7]W3fzN{+Xa?SIW Dy&(|TZ"`$7*lAjQ4SDF*C`{^FcɨZ&XXE? io1vcYIy@i0D &ܨF&x%X dJzWZH =I;$@kEb]YGuuwVA&+O;}PM&yTƒA-LKNl_a/?~viǥ 85υ~I UBDּ*AS&DSut7vD\kH &f) dh#|HPh #)TֆDQii%dmV-6@@P&?3*q5*

q QE௨u`koeuIlQ;ͅDS%_HTcE@I(ֶ1.6('IZ Oz\HnVI _U"mJJ}RT)P+UaIPMUP0n&yj ="9HU3*7ˆ &MU1Pl ؎t8Jl1jG֋'v[4PLȎWR2fml&vq!hۛ\DvGdzsO&9<.u'^otBOH쨆Rp~T7eGRMzBUJ)A R)JRF+6MޞN. \[s=37?AI'&ҼH7VJ*u&B*APPl' u'jVMB" d)j }FxLHeɅX^1ayw}7D&WjRIz \Jt zoZx# a޶_s.cc&M2,?&=OK/PM~胯N ony&;,4*Mi*w\op &+[ K/fLfGK[|/%qW^ɿ+˸WmlkK[(7\@u*6Q&Q E TZ &LvSYP $jZ X2ZT`!SB QT 2&{*dțh$@QLފ 8X/51:pb4 K["IJ[$PEg0 ž$DP.6V`]D8A-3pƇA<^{.a.-*IzQkDS%zJSI'@?TE MSJ$O3)mq;SFiM`ze4?*gIs|5I571 1]fݍ /wN n9A_T S\k6)cuLmNtޫ. 8M`lEQ$Xn ,n-9dGq "5YQH-R Ƣ39„}$-FMݰ!@H>ҷ|}DJ R}Wc.|pFYq^t0VuäwSI"HIg3(H)aK>+dTr ͦfObb>4ɛ &Ub^V9HT:566#{$gh" ڊ3a3 L۔"kRjڝIE) _tǘE)r&(-2lIZ7H1+T&vQC֒ &EA;,K%)MZr[xM\|1/7ğe:YQ8N06߅DBS]eZl/ڄ*`CHMG@lOu6;VG,$TD.\01qZ:0O:vWNW6CGr@RTDTd*qHurD6OaA{; HȽ8*o5*qiʄKm5 ӽ#T&]mH4wVGJ[:'X4ؙZ$_ˆ6LL(LnLv[MIJˠ4H@M(ZɎ?.|s'L!n#j6g1]{N'u EDIؚ5S+֑) $ OS[BTɰ &!ۑuIu̘I>YӌTp1r8{`]Wݭ75dq0sf5wx+.C`05 (SWχK ot:m ?*@HS$J.4 ]U;~%ZnV4 2uTE)kN`ut͠f<2 \@itఽ@<-;Z#k~DHnQ#j4l Sub@~դqsaBA1e4"E.|+`hxټ,8eGzLqA5P`D"Ы R Sm*E`P5N3;}¯@+ېc<\yĚIG_ _ x?|7,(vdk"'&E DDhdʩeC`\wQQIERVpP.ټ(ɡ M(Dbi TRވfjmtqA+u@?O Ou4}q'jphHdU@vA0 }4R"x;)4I Zb`jVcz$wSAV%Q&H7H"# TG#H})]Oz3&D“p$ʏFʈ0V4Z~A{bFqU" >6WeF+]Ieׅ$ª}FQT[(Щ{>d{q3n<գĊ)JVM{bf\4[j۲?xxŹqc hs.;Uf z-!„3_E6&6;q@ץ:>_;sq%q8qDrzN5w)„ BΨYM9z즑)uLyexZq_`(o=֤4" \ #i iXcTD$2ZcJqqN!@E5\*9 ]Fpa`Up &I@kiײ[]%@Ad[p$D$jl~#N8bV4D4Mf-07 2ENTɚD@??š(P`7]I|uD:ޅ`^*}[[$=&"0L $[s+0&#M*0wjOu ,lv7 Yi].lCk[#MvJMqty@>KAb 3px;&"._ Oc_xf-fu^ױ.c @`#y!k0As&J?q1ߕT4.M0Af` W5Ipu< T.p(<'P*j[@xPf׭Pwd,VBWy`QaBH4u6 =W O/Tُs\>! P9@PȨ FUzx?" <8ܞZ5yI0jHR\CI?"$7Ykd˓A#Th~ΙhLv.,mhީ~#_8%q٤*DnIu)0?m1+ˌ&=pqyk9l>c-*7 K sO+2& ˹Ͽ) f˪_`]YyLdoĄH JB@Dn0T6؎.6I1LUDVKh \Sp522A! uEމpH)iP ȐfjC!7K- W|'?Gg;I=ZDC*csD̞)]13& D6( LЁXNdqGVA [QeЦTD6.\k@kj,Y=GĒ`RK|"9;rq=B@À#;TRqoT1j-`,l#QQ*ꥄSPֻl3Hth`@% uH@2LVv1󸹡WKp6 T4&3@irˤܩ*X1dE?e-Y!q.s  EC,p|b9cIp,!MQ (Ċ:!)`j4=9SM'%}րCV1t;8i}E H>aTđ:d ЊGIF &A{PC1ʢA CH܍@H1YsaĂw~k?Ď7/`Nrx_q9|A9\[C1c$7PI꿛߆@:=482"hf=Ɂ( |]VT3KQ&׺'1 bbJD@\pC5S0mi vV,N$vuGo`Idڪy7`p 7ˬ={Yi%PKb;t E!X+Rnɟ1gQm Ą9M cq2 Ns}a $y_c⿍~/gJfGu놸_c9^qcD ]OUD8L~d"& (0A$Pꊐ+fzTt'c1Yw`/:89eYⴱp=pG޳?Y sLԉ E$P[} BLmMARA wVjĎKfthHiD@.U`IJУi0$  o€0b~[\a>fj nK?6k xj"ñ_XƋkO>¢ )"D$7(uv*a3jcb ̞<UB`AqU|md Ds I0+;V焇 n\M9k'fd$z~ KHS#cI%dLyPaDzA3!h" ULzz3WrH$Hr7ԒKE=WbI RM*I< 浅oe6Q + @#8Vݒ "7Dߕ=Q[F,^JmdP-ܦvRkrΩ=*`i B"@!5d-+N%^技E 5TǺ]>"QhyoE$zHPE n:F&$dAFOE?3{ThL 5 ֌ōLWd)&DG,-55@%‚YB _𩑼 Le$6q7Ljlbn(8S` Do8$S'و^ᵠ;X4=u0)BSdW +a`6/q[s/Xwdqʇ WKPA6T\)xdٹ6?E6LU&Pʈ&=T"Gqʬbf]j-MIJAت $ReTynl( )f63P$騘Q?Lw[i$&wHq4vzk*@nu13b@kڿʨɈ'I YZX̒ j|4! MDKä5H lB _$2tYDuϬ@dss;4if Z?$ɿVM Fal.&X1nJ\/YWckN#D)3vOSOf3&&#uqijN-`Gn?E6G4Oe3@3B򺆻oa@ʚh+࠶N:xi*!-*H!Fu(0T8+B?Dpd<"Yk9ݻ }%1r؂[;_TP| 6 b1 -޾'^$s=2d#LO`fKC[&L4D{lZ$2F⿺{pN5]$߅P%$U>8n)pV;{,$ˆ11i\ ,gs0x+3.]Z\04ÄWePT"n i PI+Z(QT-}@IZ=ۆn8KKN*?H$ "k[=M:A 6;I3W#]b ou~02 baᱍ2 sx]ko#ai%ZbAh5:I +]9c?~67^f63KL$* (Fޒ;QhT4ֺmuH"el`j FJRc_jJ0 L hXQLp Pơ<@"vS A@6"6E2f%2#^8yDTRMuH/zYk 5LSg\NUquL7&ZD' _A/uuv[5c[=YLgbNq]qLIRL2P':lM +[Gp/U'Ge1:VW'.ecS4֥/ I,l 1381p%kfp]K ,{Z(TIC&6f È[ @ I< V.L8R `} raaI;Wo.htI4b[~_Lo:_|sG5b6_tt?%^gKU(-Nk~WLI;IiT"CDGb: 8zЪ8T{n;+k\8k!É_dDʚ .!SuEjH !hP:H4 #jBH H4&&kL9ܭbb| 4댂MM\bv@MD-Hʁh:v"Dɒ0~ɴ0{(@}P4i {(i<ܠΫ p@aS~[u ,MŘ/ dx_Uy@4v 拜.eK$Jpv@2v&ʴw#e1C(U du;$0 S yX=Aq15 3%@f:] e ɺh4D"* Hʖ)R5Vd$.l=8ρǿL \%b X m=;gK9Wc; +rWSCqƖeDyQUs*U nMڜ Lo]%M[GtAFƉ v*hl ,FT2A5T0`wPbi"9&$O"o@PP((2o? fv2I kKk?tn|X F"WLof|ְ3Z ~_nſpBu_E̹~]˴qze JR B)(RT&0)JVU![~'ise1~NeNwt|0.qk{ǜd572zhZCöu?3mtH]lS{&W[xnppp"Vdt6V'`*bܮgF.k\1M͢2I'MIW6oMɝFTR=Dn6LR@12 ~踙6Hs w1ZE {MAړʤm3M(CuZN)UF"M`z 2N(ڿGItwKEy4`(֠H߄4ip(ES s-l%կ%&CiCP*.#*" I;Di$78[9lC]ś/W-P.9͜=9Va˻/ I`vX$-yo 'vbR7+Eb/_R CQ]1PM T 7.(`M{wD[e-4@.(H"mdBŖ?0AP݈t# & AV"AեAeHӦ"?LXCbu4UsQ-0?E4Z jtK?tޟ|'ZVbҟ(w iGP4I?0t@5uG? AECPtD"i $ HP;Se ^WV]7%9Wa`gpf/St>9S(idi:$A$8Ny& P0r4yL&IKGEe|a5EI TTAy*9;E@ j-ku>dXHVuVoH*A&l\ج-ݨ JuV .'NΦ-7L^ACĊuˁc ,Ě5gg 8kLA@&d iOcui"D I'hI @@V } ?+wSL8 @Ysѭ("AseN+\"A?Sy3.4@Ji4]f6[@xVnZÉh2G;Ԉ;5ǖ}W>Q{> W~/tp~WWa{;?ceYq Я4AlB(L.lS9xQcCESH{"a5?eSHYP w۲*M@N LTNZt3ۺz `Y f_˂ah l+kC%3K+e2Yv{0mSbAӯE9Q ~CH ̃Nlw15Hp"h+ g[n6!trW 'jM$Fʉ-l)-Ԭ"( P%>D˄6{*2 rRƍG`/ 5+2Ӫ얘ER9Hh$XȺqbR$ u׆WtheF&̓Pa^f:^c຀AO$w3 +U:[b>dtÀkDjD M!b/ 9„.u8VME#IbުHi+] A)0t+¦( ?.#Z-Wof/ƪΠyQ"T j@@R,R$+$n7"XH @HY">fP7¸Ij"*@-P"MQCC_M)v#pѨjv]3xޫӲ-cY&-o+ ")~qdzvB_2Cp^} ~+lW51{I$췟鹾10qݥxனȈ#` &Ɖj]3?FZPW~6SC 9\ɜ!l07Iؼ}G4.5D'b1qpTnp M0gaD:!6~AHT̋M(dɠ*Sw>1'P3`җMgSʱ D5+iUAqZZO4)I" ꨝWDպ/R0$kQ` dj ;r85kqq$wD҈DԲcQ$(d$2)2uPI5έMU5q_DYq+1NU$xLcB<5֝srX !]g:_ؙQA |?mD{wy\@5f{J{;H$-ʉ'eOkʾy ̃S$=""j"P(0h}61Q$ In-$5KDc 敢"$ӝDH]`Lz&8Uɟ‰$DI$Cy?\S˲aTV^~"b8g ņ%yد8Ԓ~$h&*ZIQkH@Sd34 @ӱ#")^D0FDMvz~C3Y<k0 sM߈<3ռ-ձ:o_dxQ C /,6jbq׈ 0IHW seE: 9QI\ _kaQ[sp: g35Lkӂy*ҨQGVH*HFfJ CMf#BP.UeS=Ur*LEaJo b5nFb9bF R>K;4M^BJR&˷0֎Wso1?gɮ𷇟]=fa0.uLRRn)\UC R.=W=C 3n.ͧ"i+}{xPO! @($a/yE#1ta`$ɟU 4?BAID_ʠ"hLUjPj"G+D,TD&jfj{88 @$1NQRjnA$O )6Qw}G Ҩ6%%P2vM"W$~8P}B-C\L7 0%~Ig7Q|Ra2'.6?_HPlI p6\Xz=. Lɬsa6UZIUjcu CS<dTR LP 쩇I!4zQB "?vTb8鏾m<5M(%@CHĩخ.u {*oS;AB\D{d*#@Q47u4 Ma-4Ƚ|O㷠3bba wy \\cAy}iRMkZ يQ":F";᠀rpڷKSAH1t@5"$&i"ouax."fhf>c\}$@7~O]54l-l/u>< +ˤĊ@  j  !8C0Z&(>e]bacs \Q$  wƐiV_鹪LmT\!%=j  U} %h s4 $:,NE8BAOt$" {z,Kf*_DE&F &dIʦ =m&Lu7!e{@FA *f`@_dMDwM)"%k А :(L˹:7J8Y~^E:kgC1\_\&鹩M6]{/+ǂMG|s.x&j @Yt]=5YR$JRMTlغ4. pbhI02\kM*CIIcAEक़ sLakg|,$Q#Iv]QZ6 ^e71=M DV;*$p=$'dId 4T$y@$5~k*ZjiAT-i@@5MbDU"7@@B\D k]P|R ZF|Ԟt?|>SS n^z~G7entv/.!!M6>^BhHU=DZ;-4@5A۪U=-FוPG 10Sk *Ouf[= $;|!t,30B) "ݶ@0bl`aJyTLޅ"h(Kraa$1fE( IAYi oa @6Tc&I"K?ʉ((kj/W^ gNqfg)\7g4]xx_3d8eW4JdQ"~m`Ī֩#2 & Ӳk!1z&,h?eEb*Qj-5 *53j'tI%UDMR( XMBGSHTNDrF]6?E YF BL)JJRHIJ)JR4Il R+J7$DHGu'*emE ?*u v1DL̚hmdO7=uZr 28@8]x2087칳8yl1M+EUfғwH[W_ u\鹼npنa9ob"j5EP %FKm@0|1"+Ldxxl!rcq~kˏs0 "O`BiYRMBz 6U]!Q.Q@ީ.&EbABd 4lkf48Q+اufqAUfaBceU 걤"ܙZшgKICj$nX{Cۢ`n$M@ zRse5{:$EBGM7"pMbI&wTG顝 r}wQj @$suEgTJCJ:8F6 BYQ(61&gyuWA;9է`F[-98Z$@Y 1sXmctceS mz]d@|msasp5;T61T$ҁ4fT'ppk@J2׸mH']hF.3ح2a}oßyφC1:N&uNf6#gr+于}ObfqtLGPWS],O"UۚnTIALe@3Su Gur*10{.-Bd_H$7Yh0?E~13?qP=rPL6 SM~5ZN%aԝ46PAw$LPC+Ա~+F#ɣD?ψ~{6ObtMf,bPhi_]S;,n$Ut]eU8nQ=(3j$HPtb ä" HLeс 6뗫tNZΧʽ< V ASi#\C($pv@p# bD߅Pm).\6Ը O(^ +uO[5sj5qJ/8o5 Nثꠓ JʁZM435\$>(Z $@PLԓn& Q}xna6O%|GQ🅍t<A.$X"%r=4 R\73] t &XG5O%#D@{314aC0"Ѱ!&,؉FaEw ;F\u10&ER/^(> >c^p:;4 RJBH$t'@>.!7MiB)@CX$OMO.42)+@6@'m EG^]2GNSjӤL2&f9\.|u]QP(i{! \Lf 1V0D}o>+xľt {WM0aൺDHM?* PI(&72I$7e!^L\M4 P n!!j^)k^mYiROe-0h٧Xp P&;x' -c`.h+8qѾ@FDT^2JavTtǻ#'9͡C^򺘏~6!~#8d81UA}T )ÕAzM$:AtKA Dn s.u`Ҧ>`]#H" F@4diZCv?dj]DpwS[$Dku9oYFx}ռEv(d-J$LSEL GdDNHʍʅU1,pk_EԖG?Xs/#'LT쿟31Gи* a 15I'U1iD=z"f)Vu?2Yici]xt3_0a"`^/`Jf 0LoS7+v.; cjI^#?!ٌfbEQ$-6P ibjE"F!e8yMv uM)D@ PK|hޒT^5ML5L[(@UeK{K[d1N0\g8۰xn{L I}`tQax;Imr y@\zP&; CWg2e[07w+"рwM@#~hO)q67DHF**cV\b&HZ$}B&$@n&L@u}bOn6ب ;I H-DVP0 1CiQ2i1[sp댏!.G]樾ȑpHt׉DV1ߚ8AZQ&RcxaLv(:*k@2h(OedZ+ev)QRKv28Xx3.:huOx˶<טu&@s=s30r-1ʁߕ$VR vi&xH$۲ȓx֍$;W|='2bagω!hc x;ѳXY\!8N HEV@>"L~~tx;bc دX +_=&hX'ԅkk>!O'a]A'rWĿF L {A[wKcMr7&9AEVUH]Ix qXQq"b(qA2 ͒ ̺Y6W<61OfZ>hf0SP}K0[hA#즁ܫI-2HJ+J$Aʊ}yUw 4@p@IQe' "H:U@u[Ti,t7<[.p3̗,[Ges^+ Hu}>S6$DT\Vf lH} 4sDΡl-qoQiL[ ^jF M_ Ad#q^*Ic׼zO[J=K18960i=g\t 2gt% NۦiCMM &#NB&Wq*?TCLwS- }_Qi)+`@|-mj SY׵Ђa{&T8CM,D,TR$~2TMm)ĝBةZL߲<-aaŌ8qq{]k{7+]/5pZ1<[Jֈ&aַ%. Ý 8Y"LW;FĽ*  ĢLF.In np-\tҔI:\`&/pb *$Smm$ d4Z)w] &++Ny\y.k5.q$Ͽ&dPp&E:FwT[@ v 8b6bQq Y"ioJ$<^p%@ UuW{-\CuUĆeL7ayHJ5d:~yg^R\b#e~ĂuAYɷmjIV$HuRA(ɀ?Rp5V/DH.]M"Q`zD.SyP+߉?<>ΕatF0Oi)dVxd UӔD‚IP0ڏQOLNd&L iKJZh$UɁ1C 1j=G&'z.w9# vnEkKW= 26PD\p5(vP0׏ET_5'ul6IP TnKA L̋{"<=ʢO\$.+6(qh*4uWiAH'P+lyiړ +SyBު` ). ]y=mHx_ÿx[)l[/ʵK^JUR:'|1?xC.3%N9oƨ:+U{smF֊H`ֵPt 2j [oQbR / r7@vPkVQ*ii6^Tҥ LlUnʉ g Ѝ7PG}|r89XYA==CCly;z/㞵=o3fpF6!pc,yHB10z'p_h%a Ϝb#NW\+^5Ih$A {%sC!0 rqR)(RP9wkbT`ubC(_Q+ajRi R-k:4U)JTI%'evUWIn i!FvPd_QFt M8_U]c7J0sK$^?zo}w3:Z[4 #H\oP(S@TSKQInaS"®E4z՘QMQ ELMfr'u V$M@`bi +8Lgsܮ0AH&tE\X/!u&-Lxe3wʴTO!z^0|s7o0[yC`X /~GNx DEPtO@ҠmqުP>{4B0a\+ <@D^X ɉ3T(X޴ILǭnT`VNxܢdb9 칰K~k5@_Ӭx? q3YΩӲӈv6(k jE_S>/e8/8i9zD 5\D`gq Y;V"hwN (Rk@!#M`8yN/ځ&4֝ 曣LIzhƂ`Y!Ф@0cmA*6˃16Mea5&ICKA T- j5ؕCo芇\g6v=_kdi7 YL4m[0Ήe)D5qo61&,UQ 6i)'&=&mNsei* er4u뺧AS;;݋1 FL|)tL ⊃ *Y ML4c],Ӱ \].E DX .A5ښ̕-ByPt" Q UIdckY$z@2d@MkIz9MX10%0?|5'Ì_yAfkc4_FHpɊ41e 'JH7i(qMNU$D~ N7)đ}}Bq[_$0A#‡ 瘎0b~ A>2]iu U8{ [$OP!HzۂK&Y/l &W@cP7T`Q;Hx+Z"@fk{Rǹ1^)E\<̳ZdN_o [H;n00[ذL@`)X4(go IGsu\DQ}@3 2w7 Z"Zl0 HRIe(4Ti1DҞTsƻmZHʉ"aQQFTKNoMjx87"oBV8h7h"vSDTAh| Aʁ:HQPڔ1AكTMgȵDV% yiif$M]x]O7\|˘ K_ $Eg{]! A( 9TO@t P(P*k{<]"EXإ.&\3SQCEBJr*ŽTsTC MfTMQLit1T / `׆G鲝q#\RvRkssg2Z l46^<^x@R(7H kJ7hVN(>h;G mtb VWֳ,[/05Ws+K]' t?e1$]3GO"'kOc]"OSiyo"ە$`J";&dR a}?EzGHfK-sg`~9ӈIЇ ~z-b2V5fj otE׿?-m|67;G8-Zη-;q0Ku+^\AeBlbK\(,o$A^wT8[ NȞ踘*PtTI@&TIɤ(+kӄ=P@@*4^gy̷0:)-`k9/!@Enܦ)^߄0~!^\@8bW_zG|c/f8HG" 8k0n +Fø'q7?ZF4*\WL(߀+ <ʿzCx`hqu9 N12خkM2 pW lM,D Gq2$`|II?3BDJMb{^~亯[]K+xsآZn'O.v#p0 deK?e0p1M1 iK$$i6T4&G >SRq`y~A[7F ctX)#\c,S!g`Q"O4 jU&Ew0huNZdP-_п<5=W|Ge\ZF&9k.kA:}@~L>οgDsS摄q(tK.q nMqqkHp{I MO!n%b s_d Eia C`l2w;H.m0^p^16|wf$0 PY<fs:pm.&)9V-s)d\d:HDV0@ebO+惎 6Oeo>6]Ct., $@$GrWyܻra V=1]p4<@tL=j";YiΒ"K"&j8iceR4E֋0:CA.۴4v#6 L,ˁEN7 6U [M>z:!hMHj;SBy[h\ zFYJ-0j51;B PӀa(Nޠ MBLO}?H4bHh6A45oTBcK (arb@n _-c([Ѱ ?^$3uRLN$ E` 3R1PhM$U 1%Qd6 k 5ISL ˍ@> *  xx8Č&jI-4pb(48v-dÁqL"IM4RICG;)")TS"N="|1[%Π~[X26T aĀ`ahp(%Up" 21f}~ {mA+q*K'hj(cW2l;5UF(DVojR 8'uM-uo )"H$Q2HZ&`]wzwNUq֏~/ %?i fß ߶W4AD5PФ4$%(ﳢٕ9F80ǔ8>ˡve;* >%Eֶ?ENd\$K\#ګð_f*"umuG!4id3?4|qhx_|PGz^Cu>WFIcD@ d~鹤RܯNl.sL'16w!p亿s9ޛfK`^LBUR@J5LʦFT.\k+1p1bgخ/q.5%fa[S@ewP==O j1<ު[)JR*Ɗ R).Ѥi&b(R)JJ*^o+zF&9vef)JT0{. dXo- ,WUU!- ]4Qe}J(j8sq:6w=-k5jsD0+D88uɅp<.\w1x~ms.6u5RފlwU4L)tZb'6.C-qzh7=C~eh 'cOE2ʭn CC`@AHL݅"Ll*L<-[.I2yY g SgQ5`5x i r`j /J|$ <-5<<{f\- 06 vx<~' ,瓆j6]0D„orG !>S<$*IUG†I.N鹮p_ `ivAᮭnzG%2,fHP, &#X i{z[ CM̓1~@X$O!`IL~.8n:'-p'P>< FO^V!M~#7Pm{P=T[TAij Ho#&P`څm:#碞'YkC렙IlIhHߛ~UI"Gsu4=z#Ebt^п u.\< 2fe ?GOC0݆p ׇ2?&CYe0;q"Nտ0voBU(.RrM$7u_F_L@tH4@=Bz\,jf@Z#k~qk~dɅpa-a.9ɋ :63p4u c&h~ 1]D&Ldo3U47^׆<CeʐIl  k1T َ:TlOi죧L$ uE >N?u7gLM=OuD:U@АHˆI¾H) j$SBg63#N *fKMipnʆv 4/O$+t.:yY"loa9qN.&̞\~a3 ӰV$yiRA 20M3A̮|1R}{.' ˈhjɋ-ab; zD%8/L+=tAYTtӮm&A qD̲\8اU1ZfdfeA"+bC];̒L ;`D?Sa5 pDO~$~&H&H=) 2P$ĪRiX8P+Qoƒ |dӼ8Ojݾ*Y:_71MgNWz淼3udQo!K T\&}ct,A='*_KtD^;*dT+}rT+TLBϢb񲉏yL$޷A6JQK+aZQm+q>Qk2[4\F'P4訞B=TL H"{(+p>vØ*J.el@iХ)JHiӫd)J nXӊ,)BQB)JR% RvU6aa?3 `j@^^Ox;f024^cKRej@HZf0ʈ@R)T7ۄ5I4FDVVGpڪ(ByTRL\ᰆ=d 2 .\aV|䚎VJ fW\ qr`s D"_u0)xZ"0+1TR`VR_ 7Q5@0H#.Z[U&";[MQ;Z,"H\F0vy|g`F4A]sDw0z@/tzH &VCgФͪhw)"Mc)gO ظ"ƓUÏsqZ9 [S! 1Q͢H1M)M:L @5Ӻ) Mits|TO I$O#t" H+|^㞣XNy kCA$}杗"X`p(YHsHftULI?.R$ZJ]Q/ykX^t\rA-ְp1s42hu+3*F4kSJ2Ѫ@bMG_Ccx;Ĺnc9\A1-EO_uc E6^`b^/]gdG3f<'`iU .&Agy7L&[4\gpGc9%$`D҂TiD6.boUjvS`dNS-Z[Vk~!**l*h&# 7Zl`GP~@Rh 8lY6]U\Pb떂b\Zʌost<=ps1aY8ωy]c;f&S2jGB2WhZ.dWXYn>pn@@ =G͈ X,ٗEL0hᆁ0>iQd̒&V چT$_d؍;n쫘F18E - .4QA0ASCAV  %bA-^Mɪ`*`0<&sbE-T7('N0f ej'YI2ZQL 0!04h*_1įGt\~r7$8 _[K^kToMk0'Lx|@ L;Hs(LjaI ֋r **6XhrV&{J أPky LB}VL$"إ8Aߒ:3iح@SZx?cO'r; hd5~SXW0Bqۘ*b%$ԐJA @%)}vҤ)7u[W:i\ð݇[GA/'7_?Rep4}._!CGs|&coqA;."e T( Q 6 "ԧe@\{r)40dSɗDMDENiTt7#NNrEcH=FЩRRI[y?d:}ɨ32&MTXk @ĒiHDRP D"h$&} ʁ5Pq#$*A6Dis&iH>ǽy?iTMMd ¦ォ*եUYw^eD%TSJuLeUWiTڶ(&%S(Q_-}Fɒ-uSLHTCz*I'u\{eH PBcY4@3bӭS7]ghn*V=AJR)J_sst/LC9 ,Ow II|@/P' `|0F֑Xֽ(J)JR)JRa JtO|li4]|\~m@a̡JP*oR&OuF7Q4@#d&7]ίzC7dn+KIi#DV&#eMP',@ zn쏇nk~c^4\h.?pxψ>|K9|Rш16!„S_*hDB]V抰`3^)F\Fhn6i_i){ VX(iEX x"s3@- @n. lWEnu񱲺Ku; -&]^&29rXw;079|Laު&mtR @쉈Q R*;YJ$T5o֊m6;&T bM}e< 㬗[enY꾷_Q`̮C!_o{*_}F("-9D@Bˆ(yQ$Фߓ(#cIT*IБzYB DIz|; ZGO!t3YLq级N,.(O.6i|0p6\YdTdgn  ( $ r&'Lz4-H5+DlRl cIyXq mHGal{VXR,IuI LJK^+XZX  H<@4dRT$Sb@J[T3.1eHخF޹r3.g Xb^ܯ[_ ӈEL2AjELBȳI;Yh\I1 i$)AMfÌ 'P@ !Mht Gk>ۤ\+44\4} 5PpeGefJ \TGTe7 $5Yv/ Fz719l ncsI.d%d*kH,Z `6\Yf= -qyAAkd DiD$;\XX*;[E}P> D nl@p*R*7` F$BC& aZ\ )qrbJ[`&iNqϔaT>@f[j$ L H$*0^6$/{>xvC 7 +untCɿ-un:6W0qc؃.q쵅F7V08DSjx󲢵4ff7I=詖2NЪϪ5 I4He MbU[vFV#Hp^d׺8أ M5Ubs.a Zz8 AؓazYOt ͗{0 v I^Gfz~I8Lj\_:G4.N 6YE{TRT$snM{THD鱀IAtJdoO2~ʰNF潕*&T2ViVT1~s~њ9|ry?Ғ IH6? TlS\L <|p ˢˋ5: +1!Dp XG\AXȢDQCJ8PWKXXO~1$)QE]VR _yω^-|<dm_x}kzwTٶ,{DTKvI枧L *؅(٤'d)JJ]JBvR*hF=S  IsODEW{u/_T5pp[==Vb 4ִ@7e̿4jGq^uU P0)mo_ rҿvih-"i_|}[⯉FaX00p0$ަD~6%F#m p 2niu\nU% I)OlEz$4"n70 &!:ZAV}/2]7)eiv$aHlM^o]G溋qse&jW+N5$jM.qA=5l傗A;X$UǰU t֣P8;PUGL;&L[3ZD*7PꙇDW@B78@>h7A`qʦx)p-Ҝ,#-"O(s-0gO+a1%HhAR*NUcukU Ꚑ4ȭnR| @‰]5S:TF8P -L76".wފt&I&~Fijp(C] &f -l7Q"boDGvIMMy*Jh<ܝP0Iu43 E JtgG&͓xK{}wPҭ'TjT+CˮG:s2,si#b<.ΪDx*P*.i@HS&@hwPy:H-"k[X*4BSDd ,{1ܨT@YSDӪz&}*-dU8)X kZdH  $8WġΘ؝)]'ZkeՁ-a7  qkwViju*'u z-6jH4j[rQ0ex:e(VZ"di& McP$ˈVp_վϲ4MC[SNT2ejt%֝ -3\ f8sZ`Qw:Y\_|= *+iH>.#бkuI ]0Lp1+"jjXDqءZ0b6'...5 \OHGwLAͣU&Ib{/σ>xs8 ,1~@{zFh_u Ss7Ӳ`b9x@ UyN &GEk)":D5]jEa HTLy \e\b7,&ipR"MA@ۤH1w_a,7}sq cJz\|.S%j8xXrfÏE`$"|H"k*dQ@&8: ;$i=! ]34a9U}Wu xcurL7c`4b F_(Z\e⾫:ALݱ aX"l:Mh򙑕7kv6/q"0ZjvԳOˌp .6*i1$ Qe$;-NoYw&ciM4'D$K&#4T;d2 o41D O mfxI T oi5 Q{TYt26tY%D-B!@&2\!ŤV(uN4a@ q v ")H0Qr]7KGd@1iSPVT 4VmM 0O2Vki+>`S nI)'KeҦͻ*e64l0opHkH#4oj3lmv րCDYy0 $ťRf$FtT|!_>u˾Kw?՗Etx;)Á n;]D{V/nqQc^.+8rML3 2 n $AHqak zKy lkLȑk(]lx `j'l@-i"$XXͶ@MO)BI%}4^ā"MA"bw@$ 0It^bl\E c f\V AY0o"{)Zc* otWKݨ޵FCdJ7&|6g0bfIhnrGد .kwc[ިmh*w&)Z#{n$@0;7 _VKaLVb0A?I 4S`r8 fGCI}ȳ][>0ߙ/n1`;[|!68o4emqt8E TӾ$b -4N =-aJ~pM1Hyޔ [h,AYI gWL?DP]I?ɤ~ik &I9YX(H#[hOx7003!Fi:"-.3^n{glG0A_,pNI"jkTlL{ТE3CH&-!5A h{(ᗂ@$'L(6RcE= d%B omHAU4TPlCK(׿7PY!Dc*U[ ~/Z+jYB䉕|cʸeq'uEM7S<鷪*J *KMgu7QܷEZ>~a$[8nc`?j'I7BqA~S槵'*Gu#tf-X(R,I5 ix"`h@i+Yz\,PMzIuMfdPJi 7"6P4f~&} [@;II$(8MI,K*LXBdā0+ &t2fP :\ N:dkyEKm =S@Do[ ;du.%i:hAWG "fP>hser1k8W-OWŸ ;+=3.6& Y_66cI{Iu=VY$T-(b 굃#,-43eb<5&o+ AsTCq,!ćĂ;M4լSi[8tVuk 6բhU%?iD5&mtPᚼ`|7wKꃮ1̰|`ic,TH ezB{[0*JPqP,J4͗#Z WW6>W*̓;͗bbE*V!I@`&wU 4r? 6l"HYqIAn3ʚ)`6^@>{Ø7e#pW3].q$DCb_S5QXyj)͂A39q[bkK/ YS@A gaAq*{,."AH H@CI={X5sX )u̶#)t_n89Q Daw#hf䘒DǢ1qb 33w<,8]"c7o to:Ndu\`f%?+s+Fw\_ Bl'e8u0nQIqHL5 ;·?eMjbc%i`! g@7buGQH @zUCTD$dUrW}23!cnY$eVȎqxkZ9tO [~U(RQ&guoeXԫi-9n(4HUo w_m>&溇./0=4j{rJZ8/E=~ yV5T N"q1B ߍԱ|Sfq.s~cWĜQ^KL @irTʔ;JRR RR!#q K7ʔ)JR% RBWa<'ٜ3& LaSIVBTDU)]r8vS_Ao^%G)+1p1o?_5M,Urf]>CHlo\VE'j6 PUQ\+c"׋:&S2ߧt[wg:o3%q.q7 ʀV@QBI7E"7="P5ASl8PmZNDP9 lP 6d@H@ YkZ&ߕhYZd5_b18lYp>QZJ 鳵~% U{ s]40mucC S>nDa3;Ļ]kB_€ׅP4A6&LZw Eu/ 69ƒI/c?|LYN03s1zqUiR$VnMw M=gFw@z&w)HSk7L^n᪱\M\y$s+sAE*$Dɪ' Y2d|&{-D4A4 0]:-$4LH N$7SDAkʈiWV۔#OpVt:|ɈoVHn0MH=Y~p$ĊWevVLI ֓N` t4<] "-uHl{@ T%BZ$L]M);ĘR1TTAA v\ap-iadN$5G6 ;u4ɡIlb{mXD"@i-4my9u@4C&$!DXXAI6զ;Ȟ=`TDԒ'EdBmuPf@ K;-p?E{0Ngi 6DbZ7)?TIeZOa;xm.{+Xlg`sI+ @/.!l΁I> Hx .MLȬ)ȴpVwD MrNΡ?ϲ>^K5I(~F-7Nvt4[汱} Iי4L 0d*&ej4g#<,f\_i`l] d>n2dnpۑsdۏ .1+O`gOQaw8oK@lLڗω}tKxw:33C;]@$xYp.M6:`o}aSM&$mUkPf`~IGc!J7  b=W|6s<<\LAO;[`;+农,&71tZ]@oJ#I.=A1[/|0֊X]BO)Lk8f& Yst 6Y>wʡ6O ~)4@ M{hALRߨWVFTٚoYLߔʑq)9.]E*pw;l0\8.hT$&DvP5uHq2|,lM%Du&V3Ҵ@ +zF'<)[0^Z2>i  :ckaVˌ=-;$2fM[۲;"$F7P4 oe"fo%׼hwܪ`#0⫺{*$OuɃ ++O8ӧt|Kwu|\fê /Gߩ1V!nThGcMK;]R{ 1. Ad "Us'~ z^s=4sOK > uL |gNȈd PDdWWo?)-Mqu/?mkS ߕoeIQvl J!@UKB]O l@%yUO(:yTEOlMVTTW1NߐR"@>7 qpR+QXyT{((MEAѨI_+W/Xd1QN0cq0̶igңCM%v>W/ws9|pgI/1eο/`Bw]srMJl03CT'j]E-nLTl)[)JRJR/Ҿ*|VWP,<'cGR}+\a2M>`t L0vp d)JRI!IRW.&7G<,=!+*W&RogNZƽd8/sğ{2ex8LhkZ)_uLHiq3J&$BHT0+T6'.F$ {~{s ?? v]ұ7Uf'0$pWHH9*mUEaCޖIhH4\|8gxK/g3 1 X_5R?UYBbJ?xx嗢!ጆ&o1[Hh/:GN]l&9t=Ti+B E(^*A?HtZZNۢHDA3>ߙ$&PڂB ?uaLJAbb9C'R!"ԯ);+O >A-cGj1 Q{Yz!:6+p ֥z^6e=~o,WtTҾxju/m@1Oʉk€jOh5*"jNQd:d$/ػY8./,\BiOM0q'-H6<66;$Tl@k„@k8\88nv6!/%u` DyR % P Ej"bޗZq$Se,p;³]C3cs{h]@يtUĞ髟$H! (@; 7uށᾝsxr#0; y}:U;LҐ]Y Gt%ɓ7B e h{gʌ ^;!>SiAwe8 *I#칰݇pA5 ~i$^*@ "h#hLPm -4fOEf,jjE$'.l0%0 CuC&$Iq>YEb 2I.idHt4>"? mLl~ַ:& BZxޣr89,>)f_XHs|(I+v3#2]T9KǏ~,*N˗絹_ֈ&@S̒({*ET` t4K|wK'UjoSdv>' cc5S6E485)M_tK;5 `@m+"a }|Ɲ$49 ;ʁ")-m&AEY&*O*mEllxSi0k_þ^(bezFcA ։$/33 w7-\~WMhQi@0 =Qa;Il@`[bj A67Tƙio }2YЪfÄH]ZQt췇p̲#obcb?ƤhlTq]cei"hWI{͍R >"$tDRO扡0 {Ac3pp͹]f&ժ S\kz *ejwh#@azr 输x? ᮟԱ:_Ox`ZGu4T+2>Ґ $;)/It 'Q"@iT3)A66AU3~CLŹi"Dި2432 "a{0WG⁆fA拣1r8={e[."B>uq6OfMg13L);Q\-$J/ Ha˾p7P=% hA>ciX9Aq j'-p1ω_f8]Bc@e䱱sO_44A)aYS] "g$OQ >V72KA㦭T7?ESGnaQBG4@=R4TeYLYhy*Lz/C'ҏO  Nk?GKEH;zb,T<&piViH2n?3ٗ2涚td'~)t_?0p8]!pgp0F`7 a.n"&O~c! p,(Hpsd̚L~.7lw\6;4u9 qXoH0`DZ_JA3MFQ#@w -4&+?)+'迹SFjCUSLi[BA&xUEA[n#`h\aUO7NLI!B ImDަq qTZ$\n{$y\ܢgOs9r,ly\Mӕ<DM=wg:&6&1qu]E{,A]_,<'ـg : i/w=.;9$ԯ;һT$=bMge?u~Q`F:@@]Mse2晅@sΑ{26_C+v6 q\0]?.G{}?A_xw=3}C*r̖aP[3ӨN@ ,AGdZ/_Ì9"MGt"BDd%$ɹ1RIMNXo,p8deXٌL`>cm Ost4VQHc #Z( t x.L?6# MnWPj)42iС̎ە81jLZkHY*NOLi&m@5Ds4ToÂt *t1@`6 jSuG!-lE>S#q|'A Yr|M!nA굾Yɇ# o 7gљ{EY|;SZ".82}OF 。MR UC{p [d02d`'k""i ZrmD(jP t4m%}BKi$nKLd Z&RB.Cz0r@*i 0f)2;Lo#<]_}nl1wYoV9v`pm lC\&Oxa2D."u]+On 0$Ru(IAEg%jq-&@y eZ0HmoEAhFhKcO{;C] `{ &D%Ŧɴy@h i:hT"j`loM=n"IjA s5_5L@/}P xn!z,Ϻ P6֠Ct " I$@u4Xț6HCT;nO2vsMsZDv t&l:]1><$&DʞִyL*PE`VD"ĊBtM9 8NW bgy\ 1Raz^-o=w'a|5|jl7^+r|\+ppX췛29{L<A Iw@"O6kX0bР PQ2Gb\~V~ r!SE7Zkf=d;Lj[@>PRڢPI)&dfTx-y>ЍZHyt @%Zbוi?^^N`@(mo !&I"QaZ,DM'(]9jl#t/D˧^DD \ 'hl4M"UL2fAh8 CHZ )Tl$AA1"gq› o*/%ޕږ k6iTPpx\ ,LP?^19Va2ڜ#Wg~&k0f, ~=Β*<ƚmAەGF *q;}7Ai*7trM [4o>ʙf0 ɬ5lASLTn@$DЈZ DQ 4&`"I3@f"nv_O‹"5"33KI%(P:]}G0X;K^ɊP 6DMZ':N.t$5΂=fTd&7HzW땘Nw s+=Χ6b_ >P6f3Y y+/!K)2#Ğˌ<6c_xlV`Ȥ? HY~$C4M&Mf@"[Jȟ(HoQ5tOnu[ sbaa?08y{.(7\nP!Hi4>zQ)(!0铱<@r ·QTLܪ= +umdBHT tb W &gÜ_ae1\]nh#MPKo3?.XUR#TU RPPIN\/h+q EQJJR%HJ)HJ)JR% JYa?3W-163Uׁ?Gw VD/wzύ'Rw5`lpԥz)JIAE[)+>|AGbc|,w%'࿇>/&!̇k^b6P  ܦ`PT/|UOJ;:>W_K1G;Sd R;djkB I")0@'^.$ހg|ÏtܗZfy!'HިmI6WӴDLD{-1z=44 61 ƙe{ [A5tvV (?@Z"1 @mr,  ?<%ýO5:[W5@me#fuWαG䵍X݀EIZ} Ʃ5@0e%Ķ FH9} -uf H1*2\7J5V_.qqj{8]yg9-ћesįiip ~դZH@$  T}L[c87 }&,*VD8؇(iȀ/+^إP jOG6VL^ױApn!m6 fb aOz]g3#4 ȃ=W>:tLg 0(p~TO_ idpB`iV>S~Sc]VMhL6 qJv3}0Ij6BM@QddvPSǺ( Ul #@D *~Yؘxo8MLM(vD`3YU`"ɑ6i#M{UM *E?+%H*h<0Ƚ.-y jCKglRz>x# Aq9'Wj4 PDMB[RJI$.C1~. kL!^+ʍdPD8ˍ 1-ߍS`y ;&I>Ēlc[Ǣ}QzR2fqACt"v_:ru,\Ocpeq #MhWMme QFl &ę4SR;B Vi15Sl&椠ujo6VA#Mb&;Qȱ.Yii {'*bc@yKAjNVJo1YUlT^5>ӫvSE,ǔ@ؓ;nZZ%TgH3ZYMdJ;r6=[9H$)PWg'Yq`b<dxe׈3]C%b ,/=L֒ =,V`TE -X(d 48L*;][B(0bb!D4Ċ h>}QBkZU ?-0=k5N>k=u2D /t77(Gx<{>(|@l[N-(ui V O!Nށ8HL$OtqMwt`EN#t< 2-`9#0u=E,ZwX%RZj";(A -tXDl56n .yLەţtEOt`H'1=Ao.MdH*A(10{˪Ai~CMNq;%(0@=n7."Z&I y5$4)!9p58 w_hIO虎o;sËd?a +@$N`HDji1IT[T׷n_,W$iuE&ʒo0O N{p&A(Q.;][3Y̆#O{n" X&ocf1I/{$$WL$ȒA-rn\@@75PAzyh;%ILCdGN@Dw*v6 ͒ V*Ex!Dm=j-LNFȻM *Df8'7IpUdQf4e\{#!Ql4UI@`E E  EwQ2I0Z ajd O\l<|r,64MpnHZ/ykZMAYFMIvTdzU!UB .3`1 |)!u` sQ6:Cυ>~(4 L=o4GDT]'<t/T,4bca4{=Vk~)C3b`Ƨߩ _10 &@RcQ5"Z$7$QB s8/``.(@g+V vDMb/"y+ ?}G-|/˜̻_~|Rf18UAtğ-er ,#qڊG`"ꯢgzʱAA}K⾅LnѺg)$aἍD'F1qߏLW9$@7P**T*L =g#m$o_üso5s49 \w/w#=2< ikBlD" TMp PDDJ]BQ*RBJNR)JR)(R Z6aJR(]Ri=ᤀO !麓AzCuC Lo-p>Wmٞv#+VfQ Ph2OT|7~~F[1:Yvx׈ f^c#xECA5=ASh?u2ML^[tl&w=<  Lw=f:fo+c`7 Ůc.&-qjULq@3tM;x?uESP]b$:GRUڣHtMB6Q*L<۲a3lN9yfs%d?* U:H5)UN2R?"4LTmpA)CE<7?$ $ $^`0݋-kI5?ϲuټ+gYIs^EVI?`4 @TQ]$ZtDcc%@gK^LGh*7-L3~-›͖@VA1AǷ I3<IOzB˸a7Ҵ^U LJd$Ǩ6@<_u8tvVN ߅Ժ vyq+GĎ>Hv'~bbHi~"mk&~]$Tv_xK':Oe՚<\|V˘f{_@4_GHdҾtxI%$@&DKoʍ 4 #Q>B"kt"n'T4 e BCN!{v4d~"졨,?+$ZPۏ碣Q2U 'y$Vgf3YfVE%@nB]fn"A6+- Alz *+gt *qʹXANdixZ-$Guf[;Zt˸k=aylcfqHc+S9<\axgIˀ ϢBMZdV#T\&{,/\aP>'=['  {/EU} [~?u0 (  'L(^xP<V.aؘ@&xZipq7 :~&}Q1-"mkA3(޴phHm~@dngR+.{ʀ3P t .G컽C5a7 -#s]  Sզ,lӅgPX$@Mw4Ƀ(Dl5RNId4H4 &FA"LK 5KITCgX*䙁-PhLJ.woD"Fd{YEndNo$Z(A. II,AAӽcIiC"Dʤ}S[۵&t R6M kZdv7h&HfdTgs&4M6)G +~ Ǎɚ9냳ŊL.q${"ILdPI"*")Ap 4 s؝QS.3A50OM۝3݄ƒt@ƩmB&LRS=ӤD˻֠(D7A&nvj< ΪqU \ ̊U$R7E7`].{>|6!ֳCXGY3*.}Wgp~^׆e:*P\ ɒgP+Missl+Ƴ裾P"*-_˵Tp᱁ REhMĨp$j DV~`V D!j$W R꘬Q-P r` UVh}J`P1P ^HuhtVۊZ`mu<W5$t̞g=o#n$$žd:>Wظ#˼d ?|Yɇ f1k?7Cw8+ S)**H4)acj*'T#Mj.B`TtZ QD܄ТߺfUQK\k,>Y_ԘkOLy>cu|l S8a!N?, $ˊvVMT;jտU IFې쨃Z!A FQnACؙ2i&i6AxXc/oEh+[GK[3G3qߍy$꺳TE _q\$l]f0q5/4Xt/]1p0qDNɼ_!*R^8^Gtܮ{9vhjq-6 B)JRG<|ǘO~]>#cpI6 ̊E'ol'p"GeOEO,KwMcu ak1 5[`ռ{|MʜoZe.N/f?̿/q0иMT0OD]$$}-D"E'rQ@1;r[ @*0VbV<541798@T3dSeRU I3`"ƽGyە5VnD,vP/Pjdk N׆aƋ$ԙ$(a3+@ȃXW>6+X H']Q`P-76A>RAUSD:AyQQIbiKfﺚi-iMo@$XLHQ;V4əf,abkqkf_S 1'حꤒOۑ`~Q* ;(iGTygccMÄJ-f 83xyN];!pry<=:<؄%b0=lp0G?b=VG$6MeD&S-4N%&gﲹnX7?™u8#6uu ZN)mLE$jb30D#k#B` H$mL^VkCn;%Lə,,lD8LyPq#eΡ'k"7f4 N©L5BH%փ[ PձEPG4 hNHk(P '"# 788ĤԬ6[~;֓MY)`q`ʒTo&xchRI31 I+[Ur .5# :\a@t6"+hjDEIIH5ƃ@ b vD- @Uk@V'r}֘  Nq7p4SLDH`,ߋ&͓&9@i"J1aq56\/gcdxcq*$HT*M2`O.gHHP#On o`jl ib=6H%2ODHhH#""U\A3 Ei2E. pRIкܩIMH@P Q2  prJh AcMA$ ʠnW}"!w2#;brL|L,6#C+~pU@?(%>(Hh"Zk\ؑ;]'K)h~x]3]>Ka/w]lg7\W=q^a4H-LQ&ە{ P C  .3EIE6QhGOIM@noTD G` e8$EOcLPsb`e^Y1Eg)0 [t5Y.w(%Ib k_&7$5$LTš-G=.4*{/eLܕP .'M8D̉!ƩHTv4I17*iqv@줎,i@RK`} ]x*)qK(_oEY0> sYqvBLE JRc!=XM`d^f2` _,e+[Bf-D)JRY ln) @H Rp2rt᷀n2ʔ? p˦..L,Lway,!JNZ&\,f&;0N MIRC>\aJRԥlᇌ8HspنC@h.Fi򵋆RǂY<%CIJ`Q]#78m+)*-(HI2Zb 5*I&|(W-nՉyB8+ӿ?, GQ{DNŠ +TG?Uw<+T66TH5U$j*G=/w=S!")ř^vc(wLf,@i)OiHGe˃vé4Ɂ5 )譍H +;I6AhꝽ[MLX};|%c38œy߼5y Ȱ%Pۨk&pc Oim0aO D5彭=M@$%\`jKE&.%5#yP:v @M)xZ 6S,.qUv ܮdjH .L}*+{5S:U5}+d6Yf&oAdĕ~d~x C2ME _T @ DRf?)sN[ޟH5T W4dwZGx}Vdb Dw7Zqc54,9q`fH_}U|^Nq,ieka,&vHɁ nhxn sK5]ò .٠=#uZM[>uE{"5XQ  /NTTJvQ$H%iK ҿÎwx/`<ВnFU :Diy\;\S 04ؚ>;ze"v)ɩdKv.Ovaవ;]ťārߢ;ʷ&K3)&X´қZFȃX_I_u_x/:13x{ $[׊1/_n> ښDW˓&B#"R"&QdU@-[_eOEwWwQk[}._1YKp"WuܔmOQ"j&`QnfTwEcAGJbQkC2ЏGhIXQB/Bb:\kYMn P L}4Mdq 1DyFNs^>P ]3sm' rWI;ԭbY mZEM5(AJ@+_iOu!ƶUBdϢU DV 7Id&P($P#MAʍolk>Ғ26A5r<=.Epy j)U "bG1Q3b& T?h8E4&7& RK.N*<_V<&N+ˑBHEtЉ u˃a?1 ΁`\!=P'iQ4n6`7Le:j`Z&iIY otVIVTkZ%H?4zDKI5%-"!Nl}R8p+r nq3o h&D4MS4*f*@4v+YNgpp^ 4. Dp0"  AQibB 3pq1Y,l$&?XqTH2f+4;G5+RZIdȱ(6d6p"vZp\`2ҵ0j}R|&&` *'* T]h<6 +,%Ķ\k m~z3Hi&?DHW"G+A PHhl'n3L>v8!99b:^$PQ@]Q5 oAȒ$//][3X |j W⮧:Z;3qq'xi<)2n9LPkA5IkjAz>YxAo'~l0noI_CH%L@@&12e&au0}BI 4E'ͼ&K@f{"K_$9]?`x S{6!"-0N Þ6OV̮a嵖$Am|g<+xW<1`?WqB?~a@i7sbt?h&YxD&ȴ}h&"TA]>.`f"okxKh=*Z<*=")hI[/8':ZbxX@8Ė}'y.Ǟb8yiyOfu6&>+̗8t (&DRcxVmSwdSW:eHS`".HIYU ˽~sՆ6DlW|_ռeױ_?55{ CYcS`OvS%f-ߔUz^UY e\YFOdA.C ^uca?K no A N%3;\z&EY**947&|"/D] Q)A4]JRf#XimeQa5wkEX R!(_K_x #^z^Is6GKU}n<⊡וfĒ{nM.G*E5&)I6WjT¿=ʠBfiTDmuK`7\6d78pM6vVB{ZR]@VoQ:k7Lq$4U-JȍP˘9 KHH4c1z] n+QdzsGf0SM[G/8|`ĝ`GCiqSt%EHbUC@u%RK~j8"Gn@EPA ;*xT$44ەZ1(1q.Fx7v3=K6ǘh'P;r, T ]sLq\ P^\oN!ÄO Q;q1ti ͰOˆ@T֙ﺋN Zf`iqY"K<'KЙ#8v&r``1@4&̹gSAaqÍh :IꣿϪ&F9BIUj:Eکs*oZ%pY.H#uRj A oD_yQ:7KԴPcAڅT$Tޒ. 7U$Hd8<0cvD{2}k.ScdZ|]\tH: +J-AY 4SQCr}Wk 7&EEyZ3u2'+L )H oLQN2Aw5xPTD-@~'Ql(8@tV%" huMUDj: Z; jM`LQޛP Ê5q  H@&AZ ^TS}3-e݇4"dDOEw Fh$pkxYL Dj=bXU@I& uA&$y!RևAYKc9oↇm Uһ)Ć5PiөQ6cb @R9]N97+r;+54aE)%n3nA"A3I1sM%- y:EҪ@vEDB@bvEDVd+Pۄ6v֫Bb,9qD;3o0r-uù}&lRBKix@q[ҒAH^ׄN^"/8ޣ>k/f]ypeg`%č]ΗReF\l@ƀ7%w|U|߄7KOv6 a88LZWtRw$ $:E$L7SDӲjpnpC]@p;V?T '!ߩQP$5A\[%mu"':Dɵ\ 8ƈ\$ꭅf*"Ki$<8Ou+H }R~@4'ʐrhfFvwQ$WHisH%v~n =V. Xo-ɟr'n6QاM s$n4&b& -]SQ>N#QotKߕHwN&s3qxQ \X80.:A7V%&"Il)K$VZFD\!Aҫ+)Yb@B5&G4Q$O`w0 x!p:C*&&Mֹ*E'<I^V\+)+5]ˆ;8ąv|d&ť, @?Lu Z:G`L Fuim^"M@PH{*`yDMlG͂DMT!2QPIѺH;j-13ɋ 4#@"Rח:_Oe@D"b:;,4R&M&M{yp᪓tG7'cl 4|#Ql߅́~>(hOyuىc\(\喆X(j=Vmt,%UA`EisH ֐LL(܋gCͣEF*ʃ45S}#d&fP؁S["{]DA{([s2 6H""HLЁ>:bUZ ^V"gu$PdLfAZUsOQY7?"6w_E/xGY`s w^7Q鹮0tl+ wACdd h9Ui&!F?{B7WDXVe.*ՙ ?֥Tӝ4`:HD5WIwUGEP s`;1n%ƃeguxc03zμ[IiWdPޜF$.?MaZe $E8q" R%ڪMOU0GĚ`,lQDX"*s#18oZĮ&,"*h ra|L E$voؑIN.CW Ět=Q0H +&o)Y&ݒ *1&"Bw&T- G$_dL  sK,O Dyk*&KP IyPQCSoq$޿(!7-hZU]2IS` v570RM72-z-L6; Q6PجDf"MU8pGQt+hU-DžY \N!LS0 ?u!T5ú,pldw^X&=.`g`f"@4Wo's=C'{AqkI.n4Ug$~Psn@dLopx wI$H 7T[Lܔ9~wp T#4e8I KF@3Y"Z>P$GB8 Oh Ay`,RsH1ꨀ.3R Ҿr7Wmy|gaVh3_]@\VE P5u>D,@A-D i"n hU:ܞ.@tlح߲k+c"ki.8.ĈdW@s ۅf//.uw%n>U1h暬faعGb=KI 4MD@0 &՟_9k өA]̶{'1pyVnayeԲ$Z2YG!p7-jm!d IH ) XL"@ u8>fu)ԃG)c4;|P2h`(MBI[-Hkͳ\!~?Pq2YlS5wy 'k /˞Iu`/uk򑦳eL ~QK=٦f2xaXbqv#dƄ χ|Cxsv;48=ͼșW:/Us72pd R)-ish$)J_o=_=7R7*[)sZ>b m_#vS_KDg2ظc0C_)JR M)JZv+*h=Kbfa㹄IJJ1訄vXx_L(*|iUp:>lBGWh~֨HTE"ST`[l~ʙl)&jbP+SjzB"I`L)\ iG`}n'yW1#P xcx_G8ٜ6˟ƞ&7F_0`En*鈞HU &,QT?7UELN-$eE aaܝKCq!uL4@Voot܂dIl.lkhZDR??|Hees~n&!ԀHK̯r5I a&}%c3/ϔ QLD$m@7Y8o;i2JjZi:ƩL.LdfqK[6.}}:n{_ܾ&~с$ A_"./8dyC:AqXiʡ`幀"8Upa:G>Mspb]@LIV.}[E͔a84R BPfiѿV0i!pfC#ܣ鴃裤7oDM+nGr]~?tf3g.4ab%ܸxfC:\\ #ʼWY?,Mjp4BH; E/~47t:*Lp{+LiSoE8̂$'g jlI-@ b YSIULJ@"LCAH(dݥ$ ;]@JB6R5 ͤ4HNu:u6˜"I guʷ-{[Q%$: }A$ n4-ūlM=dw0E=S@Ln㕢XjI&aI 026Y,:E T'b Tœdi7 RcN$4AtinÆFd 5E %&"CLxQ $K $nu#cv*A\9ޥcg:`ˤ!CdE0 nRAA'mqq aH&Mi5YP^Z&S t(XPaTDLoeE2cR&ʙ dVh#LH"Y20X7qAM,~'BSQ5*hV@ UG8Vf K x : U-eHފ6(Sc?`?ie d$ C)O  ~#?GKp2`Mג], &I7 ,Cr5 /Kad_ë'Ge Aʗ!bgtsUhH1Ru4#mFJF)k(@ʀ/j= '$3SI.\V.kLGdTo&-LXb7`, jwT 2mӨ͜kpq>du1EEmDKh/&5=?0̮xcba7X|;ōqˮLa%mȨ!WP4"&nR)YTMTȽDSPdD4<$A3u^"pHD n'sC\E(|_*kNhyqXw+&$S(sc?ڰZF˜^I'r*E#IiIEU =~|O0CzN s:^ ]/?uӆ1aKX`?|& **Ta8YRbHU{C=s_'׳d3spqxHWԥ)J[O Νs_ f|В ) R.0:~i<:+qy @&! RW.W-a8KdW ~eŬ_9, c~ i.:e}5܋5ߊN>#]$CXNB4bf EƸlPKy 0dYC"q>gx ,x-Q%ϡ3ܢtʇ&RIf\8`̗Od -uFȤ_S# LsG& fW 6iu4IQ~+F,NOgdp`:[.֞8@U]2&DD-9ڀ,mIJs)uh#!\ o<"hw~(`TA ʉ&*DSfD &L6Tvj(4:EE*Pjk5Z"&D1 cY>h\vG-&.v2YGgÆ k/.m'.5\ ~>b6B }AɃ7˅q8N"x Ƶ+)~s4,2u|݇-qkfSbg3l΀Q,q \42(W Oh03Ic ,@W7ㅃ }@>S"~Uf`۴bDEAHɊU 3B - 8V/xh|\N$қ쵄cm͗g?queE$z^QtvW4M^@nK<LV}  M`BnH;ohii*dKR~ j'v_Uh0?A@l2AOe qq eL,:5L[y&LrFaahsVh8npD:OkJtXDLS:lOuE7T,@E$vk[U΁|6Gظy\3yA-"YT@;Dr$QNׅ\S*#N{rL֟U#)%*I3Bm[*H3 yZA Uĝ|;J9Wed^cYH6(5[:fDz5#suu ~K0(!y0@ETM?xPxY.F[NsLq̓A QEa3=0yf{!hf aMi戙}*M&S$P4&3RH8_ʦR US3(v\DK(LzVA_ N9u7epxM,`n_'X?d}?9LSyk1#u\=%QNGrbpQU${ }+EfZk;,V{-~T]& :I5I3A_E IH0e8hXd~꠿@S$R2wxU QA5&GWc}sU Iu &kblt}_NSt_vZiis_/XqpZ4D(V7?#ILzʄn~"3MzUJ£i"RQ. 0ى[&2"%~1֘qh-$GBDrV^GT=/s9)&&Oy&W*R*JRZk] &}/xWCf3y|a3==3X]DA|Ѳ3%/O<9bbab1_h)HJab5nl}u_ ɐWQ8K5u݈I]D)IBAGui>SXi6JR)KE- $YR/{> tR~ u|"l[)~g x0TDzt"sFJVBvRh.>]&Xji8)b>I%}c7%]1Sfw(Ɯl3ipu^]K;~lW8Jd.69K~"jkm6Z f*UM9Vʐ;j쩅E)dTO(X&m[^ToUM 5AIE&JL]c˾(@TVDQ7SGQTުWu"UQqQ56DTt`..+X&O\7>fY zrlϼt~OLHr hd/cz[Fc19q xie'HI.3ʨ"8Lit%-0nK_e=wuhF6񱝏+VՁhZkЀlH0MH^ͻ9BP9\$ib!fɢ0CX5i`/.v!PL7H$^f7AocUH+@RX$)idrbfyŨAIO nwH'IwQXJo~T"LL50+[:\ IP Lj ATvOYTGEtɑzU <I@VP;}&@&y;(׺ltp233H]C}+y7b0b6bD/Ꙥ@sH쵧Sx[Pd1 Vm d0]4iyD8>&`-u/$oe<~W.Un$8汳bb7J n$"5*En#P.$ O0gueAtA4a"A<>U}η?ޛqlv uA4?D|op2;ý=/,Nk011@u3Њ 87s5sdP@ :u9*$^Rv@u R"&8C oZAq%N2DGZwCдE>b* ։'S&6M? A` bM+nU ]mIlTLY\/3`:)0u8fEA]o D$R:@ Ͳi3 86d6eMd(+iQ; x32b5;M`w\H; D,Е< R\OToh ".(;%1Q_ig]2/8 k[0'܀n>~x'a'P0K%psXX8n G o^Jdklga 88?e{˪I7^7knhJ DF9$X[2dv5hM<ŐsEt%&"M!@ ﲄM ^O}C~8x>k[d~W;QqSS3 R?Ho =iܮSα;p,q Y 1DIS@a#IQ"&3Hs軸I-eH=d"vCDdD*y_s.̗Ef#p8:/~:nzPgsp0s$5iEi'Uv@h"g#J8$$JdUD@)t K0O+6.EE{&fdED*?UY,n;̠Q5PE e\G(;)5*a ..|N[4a 4ν=;X]SCyodK X?6Lnu+nmiEM;~TZ+/FbkZ&W F#I\P`096Y!Sd _X*L 2%>4-6 E+<#*FiT_]~>Ql]Γ Dw?uOp6][*Kq ~ADIlE()^"lyk>[fV˭*JJ*xQ$a,H 5_|Y>nՂXD:+ooxxO9|r.c4LWy_[L ;)[!JR2BWܳ/078Y:Hqvt:gYZW&J)JR)JR'Ǽ_.sYޒlW!+s 빞8D 5]*e PRT*B[%f0aJ82]!RKdYID2S$@$RfiumT &NADDUB4 FҊRE`jhKWSﲤ*?ERFmX&B'U(leBTDaw2FjmOu %QJ&r|L.0IY8%x f*60SV@5*m]ي氵 f`A$ٕD;R8-fb.ep@Gj*NGm.qiR0W Gu XUf[dR&BH+W5#b6&jD@$PIA muH蘗H)3֞5>T @ϬUCQNT օ#L֊qvH#ɠ5iY&+NҸ +%DMEP@I6UT"`v$i# ?(h&%PBA{ m[)ktj;@9abS PÉQ,.E ; [PC]Y".wZk]:QC6\# k \`$z($Y|LsFs6c!'!c}/d0p Xm h)_"c[6+VG7NfK000nk昐\#d@1X ުPCibiԸ"JIrGIXPd Z:Ou>RO^agpgN xO=gu&g3u;ē+ŸG~V4EbwAv2!&6ZkLHi_I[L- cdj*[ZZ M&}hN-}#et>Lx3DC@)1NsJ鰍NA62(6de:$ p5 xQT`at:`PSA"M o= |iMg #b( \HԷNԀ n51F);|Out9\V,0W[ecbe0䟖1Qp[-!QPv0 rf4 )i kI ;~SYQ0VF&b]hɍ/|@ ýs%e8_-+x_4]-lɥeK9TPHڻ4DT3sŽI1¦׭{-j4$ o|Tqf6c ŁԙD/g\{+0؏u' ǹ_x3Բy< .$y_5_4&A'֨"v:J'S9e~M W/Pqo†"4&Lp}*nAi*P)ӻCChru~{8Xb虡//-+UT;m,8E-T^UIHj&fRU!ՀiQ-覸 X} d"ƛvU$_Kuuup~`g qLp8Yo6] iWA,D~E(d#zފ&)o[֋BoNp.0}9AJ+U|{#rؘfb 2'zfA/|x7^7VC5w5$Lֶ)a,jkLHU_eMTk&PD]DQ{>wptbvOs\Ls:LT.  I[)$ABA(Se+hWlԩ5[b$(W)J KxX01XDVQU. &6Z8pDJӴineJJ5B@l?UOαrt3=a6EZ,ApJd^%Etj !hZ`BQC_b'i1W0*"R-$clL.,Fqj0ELwSeo('hi75!i6EoL;#QPWm )>4 ˓0?h `-q0ߊX ^Z q" moYt}HmZC?@0rR<&v jdͷP4Tn<"Ev; ފ ~ x.xQd@_ʦ@xKZ5"Nxxq"bV5["DVdv Mj؃YYhz-j$WjD^kAurv`hRgu0aN#YoIRX*@3abjˈ6TNž1 VAh&#efSYܤ8h۔;AB}B ` )qUzd l?f ~. ~fzFJb/ GB<蓨sG$S{ rBaHkJG1 $&X\odōv Nj|cχ~_ffk"%8(4I1Y7_O1˰ EtDȤZ(.Ltt8^"I1Sj1Zl! )~V;)i$Lz`K( ߸i'tYM&MaV=bA5PULE"\Kbx?_e k2}ʄMIIs ˝.&@:_`y.-"+ڶT[Q쫸ApfLFw ,&.PH  NKiu8 66PȭCIȠRh)yc\ڝB= 3 ~%q1 ̬T;Vh~'Q3{$i#VmfҡKq= 4T@ 1TTԢ@MSFNI$PI #tFO*Pq78u;e24yq٨1a㸓Kugc㼽WAJR$ rx]S=D)[Ǵpj HU~ϗH:I,VYleGbb8$R)*.$A& 0+oq:&) RT)[%$O=,JE(TLe* *R&em P*&#I=q`u }Bj DB{t_d[rG%F6ot; F]*MU[[ԊȾ&Dr~,,"ZAz)HQ" )B/@0{KK`8; &bҒN` SwϲT+QAڪ L(&mkʡ H(7=)yP Hʉ3i8QSL%µzP12%E'xLcrA)Y$QZZCAIp%ʂGQ"HT!FoӺh$0D!) LwA4&9@й>{ݔfas#Cph2<0+&q2z( &O(PpfM0lێdX33<*-nhL&@ M"M8NkHދ;14 9ڍꨐ?k EN0@2Q0nVt4I jLY6Zy>k,4SXF)& O@1")0oku2XNc ִYpjN 57uɅ5.p0q1p+1 ~ToAY6PޅBpbdG4U.t8]ZuH,J4a6T.oi5Gb"4ZMOeiJ&D/\OE<˻ab"%uދ?s29<|W=-fƒ岘_%v#R\@TL${IU/s2c쨩DH3 VRtȽѩDixRz"ImR (<ە-޵ )tX)ɚ` Ĉ ԒU"tV*hQh> ~&I#Q:b{dG%KA;H#>+Ȳ\Fx@.xnKezY 4&%LI@ X^ hZNA>{bL-5~mAY9$\DL[eV9&jd=]1^Vj"@%0M>.S 9$ [9; &>p@&M &{]tUidu:9&3RD"8R$IQL*AWt>ٳn>1l'~һ;etbF I)2c3m\W@3uaOX0Lj< -'c"Ӿx. d2XMsv)/?2x]m$ ?.Otʳbb ms$/^ Vs; $^HQ0]Jګ."cW#0ZYqbbob}&ɡjiN$dZ=B..}3PHM? -*MA[f$)ΖҁtȾȻ2m+@IH3k i2gu4B=a6)fT;Ot;Nʛ^'T6]H-Q#i442&I!Ct映$ r ZmfIPOOhhvΠv3rbZ~ɢfpSD#HEkB{ywClLG<CE;,")H dsObmI vT<Ti8N5;/7QiQbx3D7PJYS c%-i=׿?)fOnãhATLN0Lh GDS]RaU)4 A =Nɞ( 0eׅOq;^7YZDHT=jI$ M+1PŐH'`d3َfg+pp׋,og3]C؄=WPPo #Q~ɏdA1~˷䃦8Q DRfUVʵCj,N&cC@eE6rkإ.sqbP]UnUr!*R`l?uM#)J"e Fު#eQ@Ji^+e)JU줗Km+d%JR=س8b!* RP)JR$v_5夐 %)JR3/?c)JR7[f$:Nt+n`}!+Xo8x`|Qua~uT)Jq? Rҥ).`e+K)RK+}E-AUZ@HA;EmsUQ[+BM"QDUR`$6"TU)T] &C1k ~nҊ#d`d7*$RHTi GOQIZҴit;\~&kcOeZZ"His] E~ȸD%BZ{,%$s$B-U@.H-hI\krv\N+\ J*M7x& 'ʇU8Qq%H{&mv`a~K@QpI(c3}SEM`DĨYK*?D֔ 5@@ Pʀj!@#oDH0)C5aЊRR<]Bk4u\ڊmM$e&ddBv $lV&DI%$Q1ex5Ab wEH5(R4 0$򖸇CIi@ @NR"¦"fd b.bfM& $1yUf}"ʐxs%̷V pCO?_o-\Iӷ ocIf+P&wEM*bNnѪ"$+BiDѿ @$vD P2kaTl)e)ѱE"}Bm+Z3dTD}TFnon ]BMlZMcbN ل׸4u ~ܨ3 `=ki7_㮫z3~G1l0LŗEbQ xyދ9ༀKHpi4X" ӕTbi H8nvO$͐jew!Md 1;hRAYA.Bp| y\t j0mP4CEipS3c_[lڨg*sLI pH`f/=E`I"n.@;ܶhV߆4;nA4eH"t@1D&&Z2)lQ$E&*K_OU F ^9=P`iڀOXS ,<&qs\ ܎m蓨N^˟6'j[?- V e;w?k/wIh|WQb=͂ qplMA4H,3\|̷ ^suӳ.-ym iWS}x9 +۰^&.i@0R '1@L@.$3E€orTI.$ꊑ7QlZ&kk#cnZhtD .0hNv%yYAE8roX[k@CK+2$@s]O+:s<ϙpvWvGǞg@=1X.xp&@lZВIqPtH?p$M'iU`4P08> Ot>B@BmAnng'p[VPǘ~c.{:& @HP t$EbL$j55A3@Oɀ6Qj OQ87-) PWc1p.ۯ5, ,Y \DL#toR ma^ @PT]_I ep &` I1]sE|BѺfoc uM*~T|Yټv1qWWK& s{Hbe"da F9c 0*Fn(@&#fnY\|l($캦EP1DO4 pkeں_v=C678`v.:vzqYgI 4ˬf~Ɉ젩Pk(DA%TT]YUʤz*TM )DȺbwT֚q \CvY'He'V,)IU@P'&V]If I&Ljl!*RNT) Q%-isvAH4! LrCge9Gt# aԏbJR)w2#uF➛fF K 4nbu-0D)JR)}ދ΍0ԳGesSpҾJR$L u.fsgaaf[ p)IBT~RRE>tLNTf(13y|i+q^eqJJVV7Z7NHV(6Hbnf$t\ؿ5 Ĵ|GU(Tm#m I%&(Ej@M6Z- e`޷HMh<𦝦$BVp TP*Th@LSE j@%Ek*2Mv?̿(s?- ŨK ]p݌*GM>7Znq3[6O] ]C<Ud5yU#n;%]Wwcbdށ&"?e5$Ҩ[~0t\\2`U$PPV"L8.E ǢG)l .%7"A>{"$Jk"]VPDb 'I1;a9LRV٭m?'@ 7Ν( vHs7_ ѧaE4k5UT6Pm7& Q ;(qPG;$J<;ӿw*|@V{o<c::ks\@rc-*$"cqNm]IZQ@Hq8|Zs`AXv3$H$Xi:dVN˟,a8pKv|N`90"W]a46ue׏\v^6&dPb)>z at9-vaM"|SMxb<$\6WB5VNˌh2'dH4ܢ$E%-t$UUF/iLʐ } _b5Ϻ. 1+#yp.oMt1q$h= /|M+Ù0Hqt~t涒A_OR)yQh(v sZ~Hb.6IԮ\Q|& $ %4 -.NgvKb/kA$G%THB!ڻZ* 2 g: x#XDJ]i)!}$RHoSDM3ljL$Օ&ʚ$""/IAZ[ vDzL%.K\/ ]ߪu7iQ aD$h50@;RvQʤ` &A$ޅ@\M{nWC/Aߺ"Ei^PGk #i]ޫ׺YLfq16!y@ϯ)$@ApV!x㽮res8\qIn#N"^uLwf{WNK^i]DaԂFF\Ld0:X@-H61^K&O=򙃁A_./r^vh\X0ÊS+\I35hcUKL~@@6"0b i<-sbT\M15R$0XY{|!q\L% LqTև _)=\Q-X[\H3w%v~ o`uM8 81ZV#r=7!K+Xw+[L|3NNZ\p_3jkSUv]x4Yv&LB ~3ubJ LQ_t^b-i>Q?* sӰAiCh&7E]]&n|KvWꆉlQiQ6M,-S2 9U@E/dM%rB4`@@fKIjxZa~  2Ǿyުr/.fW a.4bnW)X>ocb+7; IoC[Sz R&B`udMlOT n660{ֆ^ i"{I16JD)WPTD 2 >C76\0Asx챘nDWgHgR]gYH?tɈ?-OZOQ]+x,/pW3|SƸv^qSAk( &dMkP (HDA˧|D}G;0qq3"$s_ 2luLiKT@x[0L666S.vA-1EvVת0\b `\*)V *ʊH>5+3c. U_IE lʢDJފ9@Vʺfn*WrTJJS % /OÎ' v'Z ^btB)"c݆pV#&!{L)zYuLFgdu-^b% R ߫xG=F|OEbؘ\%arae@ŭ'H5)wr]/<;)Jޭz~k,\v_Ժ^gfݗa? :Hsb JR8ve1KtƓ+- 7'HYZc zP#C0F3 4v RU2Bxo1x/Oea$ &Rq15uIydʒEFe;}d4~TiJ%ZlEIM V֙ERcrX u.:;"䮉Hvd8in6L&oɬK$Puک1@>H1"ƭNIʮlO3 1qX:wV-dLƾ_Y tL_ j̑8:n#q%΍F8ou%$niʪjfux9"wMA$1AEHf" : xI#E7P85Ph)P ++#V^>Xbf9A#zz(,P(*X\4"*VDah6LDzjDJH5޽֌ǽgUK"ע`W#ƂG![0O%ra9Y~+6SzX̝bƐ?_>-g~ ucʰhi~W'Qe' Nܳ/fK8eq115>X<` jB718v=I$!EeDEAT[*g`Dez%C]7\|+x#d 3o&s8`{ĚM{/Ծ xW+u10É&=E];5.`*ܝYtܿ:K0hy hgw+#.pW)JJ`9u$TDA B)*]3=3=b  50A\W9c%.+3;6{?a٭]w^Xm7)JPR@+#hH>?o|rb8A|kA(42 T k<,> 8Fceު1~T{Z~A8FR 6u5U:(qP o_*7#d.ca# @#n]*+C:k h_JgH[sΠLC7UY0i©5$]w='3ԃS ,a{ {Hyk}(Ժ"Zi@%Օp[0ܬoʈyYDɛ 510W>o:ۭ56]zm'I޵Vn=9Zd&BHA T"0yj̓n!w$:^.mnjIy@ 'h6P j9Q%;*d„V7Ƀ@C]@;]Ai;$Kи[!eV}w o$ E˅-CO*v|! 7Z~>!cz % m%PCL8T٪.>SEiQ/[H\Y༇ #* >I+hI.q!n1ZVF> 4qffM+pʈp8L"1FXiC:g[|v`c2H1+sɩ߅Q$VygҿhoE}.U“t}jَ"F:bZ\4Mg$-t e.SI.7). ?M{45Pxkp_G|fƻtb53S6 |_ޱιApzB *( " y@v#f NdK@ !A R?KEIE`!)jpgaaNU$I&D\&4@H)k%DH.nr$H^׊:C,̆C(00[Kk"=>nOW.SFZyK p%}I/Hu̶Y^!Zb ~=i ҫ-Ȫnޛז:Z){ \I۸N@-$N:>otc5 LC{՞*=5PeTI6*$PBaF`" DzW b)oun_"%8И LE#$o~DK$ @\9LL&0Kg\H"+ '=T 5P$*ehJSNQ- "AY4VyO:` HDL#1Kqo]סtq 13QXYJ۱ߊ4Ā%`$wXIV0wILjy U-"6MBȥDAۄg#Db:EbE+TDMuOLG*'lHdV1EG1- $ R`́;k XD O;wtԺW 0>>(|4k_Foe3؍cH&+įFܔ-N&ĕ++" -ę"ƫ/fA}*$(u@C/oPд/yL@} ~oQtey L,,FgRtnLEG3!عӄϭ=+!s$kw,^@c@De{}O9z6s) UyC:m6&6+̗bIV8EFuFUP}`IT@ª ;iN3ȨdG*h PϢ1@40O|d\@3ED4-RH;ߺj}w+]?;STHCQtQ"id֓UH iASFfHVԲ$L Z鹔DE9Lw$Dt}AQ=H[8k%awSŢeRTUTQc( TwVʊ]W쪂fLHUuM(Jɗka惶 &\a4;S]>x]0raxfm+ns#Vda&ZNW (- Ѓ!JVʺMk)JT--`,Ic݆"$ְ. ` -$1!R)IB)JR:;1w0W>[x3xo%2XJAU$U q*T>Ș R-޿e | vxE\.qsuKE$jd^P@)EaEȘU5 Y@`JhD?)+pouMcX&FQ7dAo=Xߺ+@Ǻ @whl`QDḘi P!RMD-;БW `ҧFM$֔FA~u yu1? 36O70qά?Hm_|jKƿۗ`0`ZII+}@)l ~TRƖ؉f03IhMܺ d K3=q"MEO{ mI25m%ny]<7oMf|_4 ^n  ̐m$;MĔO t҃rȭ$ɠ2z3Dxk=I{$ 7 `"6sUczۄlB-YtVy 5kAO ʤ@VDV$A$ 2Y LpbeeRPDw<* uY&מxZtبUwZ 6Y1P@h9.bL(qHYW-Vk7vˆtI'`hE )ILkX?uCEh'ȍI 5B 85&iIFҵ 0}6\4 Gfa͊8Csy Ŗq֐L\,H$ _!un'PinO< n2DԲ0ƌg#,)qJ FݷKN^yu I^ml>V5wPM^|P;-=&]4HG PWPA(P "2LTjd )rٗq[6sG31~+J& Yh$P@#d[*LWd2%fF @h=K/v3 qL ⱟ@@T׽$zS[[[ 7Z`e˛fa,mul {el&Ch09k 厙!q Lb Nʚ*U5ɕ 6PnʉәX;X5Ӧ2.jਙiRJ*L{i 1_9$̬*hEz򍔭eLez+uEUtdj"Gp) PA)HRP% R)JRl|Lw ,//|nXzֈk |))IQHB  U R\@I1EoOO;"W71o-d \[)~a0曅Ĥ%HJ*Pj1c%JR._ٜvaaN0;/G^xw:̾k`fbDKH_џ'􎣁3 qphd`G[-IӲ@8DSh_L#kM=kvrKW{,03N~]j$ol96[--f끯],‚L&)E7U;-a/i ~&dndU oB}F>eOʊRUQ4T"rbNwCh*t7kʴ[{$yQI+p*QO[K - SBx* v+BEUoZso /it` \MV;'{AT@Ī숑Al Uj/l}3, E B~"v*DyQ5%F At<[GSuӅ&`fdPkN@y Qa £P{ KAe2`.OuR5{~dS4(&M L ȉLSjEt֋]VԲuGo- 8ͣ7 ~ho߅"*B FdxNL> iPTf""$-`WOttd$DyHh@DN @I'ōfq Zk>`@U WVh'jM`zҮA"*2i&nmKAFtGH[1]Pww8\Uh48 ۤW+% C"eFXpَ@+JH!Ɩ h׿度c*˿[pP]/Szg=a;c`LǢ`եJU.G_o DؕN1<+0q 6٤HȠjMndg0"PjqZ$'P3DL9<f[~X1#Y$RA"DzF4(1 Ws3W 9p\|auιwj0H]f zkϥD>E 5@E$WwAf* rl$ &_3\* oA-?FI_/kA7IjT`VDQQP# @i&7QcI(5whwݕ74Ý%I27(%r"lb%ȑH밥@ zJ|h}hdS*[OM`wZb;QN(PGx_D$m5 `?atfg]n4v _W\aEdLM*b)-a1t5o3Fa4]w8ЍHx$;Q7¦`mDHΓY14Vq UɝPEIȈcj8LsD:$\u$Iuǻ--qI]Tu'7|\PN⫥&Vdf9?sb B I +Y( =IԋHPIlV堃10VmI4]^`6A2E?U-pvT%oL`"OI~J*EGVvvry\X]\KjBǔSF‡$e4 %hItD2T('h`g&e7Ud"q;P0FjP` THڈIe$B VxFމ0[?EMo2q!BUk~Bux+MlE&Dmb~ۮuN#v A{d4e}On̺qq]!tt6 oʅc{TҪ $+s5*ڄUzy_g129\I6^il: TL̤?D?*&&֕Gx^UgQ=C cxv0^0Z @rK>zp㽍a0!wVĜI2fP nT}ש|/u Roc-԰^$5V?_t~'Yok@HVuε9>vaD &h[)sG1/$Ƹln() @%}o22,q:.{#K0\wW9ڬ\eqvn IsaA>eL )Gd{*I'd^)REh1XĵpUS?Dq^uz~Q{_J348XW 27 N=vt#qeP (҄սTxeLC: h+ Puޡq \ m}3vLc'@!jt$YdP7ʬ nuHN$7ǪPl0j NH0:xW9&kf ~L@;QUcӦLT''iU7eJi16d@RkuHcHWXh h p` 4S <@K&GyR~˴eGc|SI~e-%Lɚ)`I&BSSl~4hw II'jJdNe4} i6ډ,XVE ThItrv?HA!ebuoʢd&ynƐNfeh-i9/Nj2'ߑ,, p&ĆI5_;n_a_'wcYV0pKpٗZ]KH4>;G^, x7Pg:!fp \i;4+'曃~.+ᶤf2عL&3497KLbw6]<;a2j$LDIQNoDZu}6Q'b{qd4"FhédL:Mfa\(k?tDiQI,]2$ﺢeo $+ `߱F  zAu)v=Z@v V"o;""IlPH6)I#Qen++8?)| 0,1sL*kꡪfH>'oUM;"F?4V$KPOj8Y'_Yּ .+zܰtaKHoe˗8/,v11#SX~uƬ qb Ep1[ 1\-h槕Ï\0/c5j$UGTT 쪓ZSM^iauJaceBE@Tp1zX\ƿ!=Joq2KI0ehyQ3SʢZlT\b E ? HG q>t<6K>0O" uGubnyyk,$.caT+Rt)JRg1z~{3qn&x7^, [5~6 $ |c`ceq &_:)HHQ%IBWd1/@WY^V˓?k $M\i?ӱ1<$WjM;k ~ n l6#Kƒ)QǪ.«E¯uLBR4L ItǺDj?@StEր. sD:px8y ufܩK\V&d>#mF"_cY n,3q]a~wR˗ R]z=8濥8ΆC6Ih<(.đ`&{%Z8AUHr.E5D8S"ztZ`{A2U,OӲ^}M%Pf Tzh}*'U&b.Yq$nⴑQiz=[fzK/Ɔe y`i #z ؏@y0ㆶ_+:x/ $17 cu|&[3-3bLjD4DĮC8zz09U"ʳIXP P 4ǖ 2׷UZ&F_=]bouϕkq3-.kgxs-N&xI/i z/ã B} .LbU7]8aY306_Ez,'0r<aq&䓽P Om AZ`8mIq)!Ɩvf Q$A\8Xkb_1101;4" ;W PmZ$ll Hީ3#cʈTQoR M]:S^);+98 ]-s`IZmp!WwCγ9xn3'Cg 3ōI $ ,ktPEW ԍ&B$4Dl(4D6 i 3c+2_'4W bb5HjmDzԘ+,\@0h/JFk(u4P ׹ ul,J̿k4x?mf[YrlMqZ`@ Lz]!wCLB&iڜ'Lrlb֚KL$Sn%+Ir (u9T#wrC3n-5\\hB>3Mg v:)" ˎ&抰@4Hp){7O**{cH-S`Q"H›vg?Ν m~]fH q@k=l0i1.LSnW3׳yӝN[l y. &]Q0huG ~hw}! { 3' 5:_ &8L>EDG C䈸LʍnI!bNfa`; uuAmID#y(7d|7\\L61`=ו R6 /xl88c$0WnU@+R{$pyYn#EĮ?.k +:!1115.3Z^J9"oFg!U"*)E؀(\q>XjfP{&$bH5P)"/*QB"b+bTɆ7 Z<=A+M.50%uǏf\L,BDh"+? ^*7P*DlL&>&[`+qyLZ+[VUO6~w2s0&u=5ѳp10^۵ Uz)^URXֻPXzE6RRɈ(H  $ 7RR) Ry\>X3F]\)K}@%HJ)IB)JRᾑ|I鹌K1q.ce:Qt7@w^.)JR)JR)IVR~_3ԱrNnGf91ߏI]mD4R)JVJe)i7 N,v/yU?>%x'ßz?9AbA&6ދ|gcth&Jʨ^CIi P\=sfߔDj63\C%+4aV阚$"T\:M bbA1A"`;QD3 J`_-1̷ٗ:y]?f>[0^y'M‰W0 ʨXJ Um{i|e6qps$b/j 3PGʶʦr lBjs-DdoQ$LUs3.40I\=ic;tEU@+>"Df;-iq]6ZHmUtB4۽M (S${$D%( |m۲ \gXMahx_|&LOa'02Xr"ԁ{+1@5 #yCX'e擿 l 1?6<" |惿$L"&Ez k4$;x:&! ^Dn%D"@t<ܮ|,cYpqC1@1$[H$ @ȕϕf3yeLGTΉll7 xX-s{dž?D JlLlS mM8d MMG~+xy޵ԋ]b ;/0fP&ZI޻fEHE5H%ϊ\O%.oeu9ă ڊmEA;{&gOҾ|C[NǧewdӺ$v"KAOAKH㼕qeC׺1`E:@O*v|@v\o"n6DHLH@OU>E=I/8iëK'b\mKL붔jŮF~A3rP \bT O^|orbc:5փuÜ,r]jt5\Jq"7)BB\#dM)<(l "m&:_T`0 PUNv22ؘsp1EA@ѬA>..'TPAB`H=;*6Җ7+d_ց:~O]c];5陜Va?ns=':o k uX.Jcqs89\gG :Y6Cp%.vRhY,KE&*I@Vl>ޝy=cW tE򾉤VV\$ko IyNs Ϝ_@flx@ ]ctFf 6kKEy{&R>'PeR\C\qd.:Mmi:&FIV^kCiRHJ.k/`⹍BT[) RP$pB)KL{"Nqsē+*R)JR)JR% RWg|SHl#p&/AE@Kh@=Lo0,wEDVge'k͒53ְM138|$6\ZI'NoUaٖ5e'tҳNa4nN|PØhr}fh;͐>@j"O&%'r9NokzII 'T0x%BA^둎h"+H&#ѩq:j\"EG (A TP^ ߊkMUܠE~>YfO22]-?zvo42|;0lMI >x&W}IpG8Se+^&V\ImQNtem!`D-VHQ$ k$hx$e6ToqjxHbC QqxvT886W\}UHo7X3.bK[i]LYר?VUY~^dHk2D@78.6EsF=΢ܸ?B~\$զȱ`vH60LF6?}PH0طn]hqc]_a!_̻ L0B` Iu7L"" ]2[m5^EPb RfފTS%U$JH R)\L;t75dUHf!kKL1q f=.nodRU[I(E&P0Ub UI% $41Q<.l,&#cc8ftW_9sY<1a+"$ۀAv4] /tr"|R~W+8p&6&asMJ᢯iE9TAtճYrms&чZL+[$!JR+^*\`\ O-xp;)Pe)JVRB!>R)JR~1\jR%.p Qt)JRiΚ::|uT)vp:nw3Uc k=Nˬ)JRvBL 3 ]o>q ]k/% h+O~&W/'Tͷ c}(Ȼ1)F&P\3i u)JRJA )RBUSnZ (TJBkQյ&VzT20zg72<9/cA%Ǚ _xˠe9Mg9lga7 /įD1paDRD5bGW~ODIӼwZF|썪DD@P(5pKn)k vQm+QARZ;(z,aQ'rc Zɂ$Mci~bΩɌc<3p %{i*:@Qʍ+cU(т=w)3; y,&+ Huqqbb<MzlSH fqȍ* 6AMch4PaZRccʈʣM {)PO<-=ȳ<"Am#ec8}%qKuz(}"@jM &]ʄ !{ սwP䢓LqVx:/Pvkٜ pp2&Ʊ' # pp<,ȫL[🫙;+MDLJ!NX"Ai1*JRdΠM?U5egy Xs~3٫Gxםj{18I7%də5SZMۅU+]@I%We9\Z_"a@M ;@7t:-P~ $I/St<]x9 q 2v_x8> k?cuc|M_^ݗ>#bT" (f*HTQ"*jwQ ZXؘ]Z]S6u)!r?ؓי\CP f(eo=m.9"MN ւY$OQ!@2a0*vDDz$2 ZtLRcdb*(SMקᾩ0Xb3$J Tq!* >ߌ/>|87@|7tl,P~c6.= تʠ!hdJIGMWqBz8Ɍ0Zuު=;JV۩I[<.s& 2%wWIJ"8s y3Ϻ R<>nG-y\^|li( wYRPHJOgṭ2l׎`^cZ  *R)J\<&G6|5ț,c?1~6):\jJnWsce]t)+?|oᮟ2L?ZAuv#.+b R], E)(R#Η tL9p[szL/2;!*R.WY?jkL|]?(2?&̮-RT)[+eB[v. cIq[.~ $U" FR!UR(-*L%Qj9 gvC! q<?יȱ2k Co_b3C\ TPVe0H;oe7$400Hhvz= X*F֊?HB I1A֐"iVS(3EDSs;)̸vaq:Տj {ZpFH5I D D@Т hӪ@-)0 Ȟ qdi"%¢)j73"|-bP2 O^ʧ/ub,Mfq385_52u\q[5Ǻw#T4T3|n;O#d H&BQIrc.`1b"˪M$}$@C lV IPdZ/Ua=VhwLPΒU7rvIR!Pd(f"ܐIZf.I2 Djz ,h8A ;n-P4j`R9@uHt<77xo9c!"}`/٬Ӝb\W&`H^n]^.+HfP.|Pf3 . v1X\! cz$7wKHGpY![3NUoԠSWT"ZkyTO@x vzЁqJ"gtH'I C DyY2 Oq.7\\ͳ .pmudSf[%fr0G[hΚ3OWn3*r cs֓0? HT 5?R.3jcW2 fssC ~)g"F{ #fW Y^Yܧ[Ѱz.h{Z-ysw&U8v612f037,56< U#~iŘ`Y Ecn6yPV`cvM,k+&`5D,J>*L@4]*4BLyk7|~wC GMt˚\OL||LasI$%q*(w@0_&tp&S+G:p SMod~N، ƃw~/vU?NM"BY]ꭕk7=Х(*h3D*U'flTB(ղzVg!_~*&n89Ĵ@!6^/:'@?8 R){Y~7TPf6 crUܕ)(RJfr @74Ay%.7&JɃ|v0`-f柁AsLKM R)JRc8 6ZQUR)JRIR8OJ~_ę9i̖I?c)JJ%JBK6e*B}Pr\\ef`vteMEOd7\A 90DQ{2+Lԑ]E/{ L̬Z?uH."!Z (jo'u $;Tfb&!@"{> F3(y]>tD31h>_SaU2 Sus<\ 3 ^xcBQq9 Wnn$.#K~"@E?#na-!V(`DJ`ɚ(7ըmaZ:-s0Îϖ1.dI"TIlTmsnc3p-g 3XuyUM,. @1*u $ o h/sQlTZԲ?EF.- i&ԷujAlS"advDU ە`ȡUfZ tj DTI'qb4Bw[4t2ߊttHT2  Dk)P^$-]`d Ϗ:׃sm\xN,q0Hk3LW9]7\D}k2 Q&I ["8v*E1P# $YP+/qG現b#wF>/Xm{tMhkAǝyAk ?tH"Ii3I7ؚ @$#i@5UR _޻-o;)O՛ 瀹9,P-ip"B@1 &9\cf>vsqEנiiTwPKNް&)zie)IsPq O氰:]?~L15ɱk@/.f>&f1(f<_ab汱_Xv}O;l˚Wj-mWՠm("[?O@uf5ŧuֺS긹,`.G$6PBة]Pه1.PE J]_w|'.sy@+V!l^O]gb<~#$ĹĚ+P$D7_Q^Z4*ӰVw`u_tt+n!/k@PI&o/~v7q &wU%T$l5Mi.dle|<uwgpqsEcN Miq5ڇ(HJ^2Da<<0_ms\>Qe2bN LI2k4 9YreaAf YӨ RdT6TemUltVT ZBd?n1NӡӦo bb-ۅi:jfi7U~7( SJ]@Ҋ${Tԁqhx3PG `+nU0iR76TyD`JQM>-W5EA@)}o{%:۲18X ׋Hkx3x6X8=g.ecc1kP{c %`ExEK7๭k`Hl _<؄ bdj"5EPȲrY-M}".xhy"& {U,7Lf} LF"ʰbiI%[ bM(M dI*4}*;-1}(~LB%Wa<54eQ Ι1#D}n0ʉSI۱bbbC5 '7'Hwu\>]]"3P*m J~6Z8XD'yD]ܮ6[af/pԆ\:`1=PжѩcnUט$h .ah7즟<~&t %$(M d8>R2 I:fTDV:,dT·B$LkܫObs" N L,!f$s@#+7@6LRZOګxNON_A`QH5PHUU ["O(}//pq? G `4sEjM¢H5* P`AU[MU!C@nT+þ=W297c[{ Y`亮>_ḆePTߪ*yI2O;' q#E 1*}k*%0JIU(feTTIna~ku?u8 Ú˼[|`uLO_ם.7 ,o9qq̸ѵR&dO,~2~C7)C̱v_Ns]1ksM&_9sxZ_/Q+ "IiiNW.g2){Vbs;'l\FK\ZaޅqCH.Szj[[+JR*%JRl*BclM])JNR)JRN4*gFx&eJ^]=˷)]7/9JR)JR)JRP)z^,l&Q^R/겄*T) Q!4'eI i0+u(ZUralJXLreCSD{*$}7| > xt\1aI;>)" G/f||=" *? b[[zGu ډW` ^1}jʂ h G}&G쨡]Ԛ"N$iA;|e xxٖ&U~> 6k1w9`:Mf ސFYtS&iU22xn{2ڴB/D{Cy=S"狍H+dM@dɬJMiDADjELh#@4L6Fi`Vvo=ц W_ H{0p1paŠ\Miu Y"@$5&gEE1 0weOH:mZ]l[!i&glh;CXʻ$*l!.-&HSlgTfHc&LBңa4yAs~35IJtӅ^hu#Xp$2FrP+ԛ.̘20'wH4.vpAj5t8&}jD` "$ȬLot 28Q5q"c[G߂ E[+YZxTyD\} ^~e;Yb E< {AZ:u $w{%|c 6&(.3kf @>ޡ%5J[f1 ұ0GKkߚ矩5x2AeH~1*)UR1 1S0K׺WJjW&?`7;S/5$PzP{$42Y}UfSQӦ-%"IQ#bL)So CQnW ؘΐ&OIǸ5?&_O)~Ԛ22D m_A kI*7!̳ N:D hCc3&ƿ1NxlL]3:.K;qkfα7\ c[@UKOBo)3y* O [^pM@$7aBO@}H@ ?{E.P&jhb}ovM#EHJEvAMƖv0iD J'!P4%FM ;i>UjWv8@=yoyv!p'`m KCۢeV9 J0?uch{AB&I(DWq'{ʍѴiUTL}b cpZ9_#{v5TֻdŦ@]^=K+7.%Ě钥 ˔ p[@8\DTq$hdPTʕtE}ϋ)fdX' ks$ޟe{$&Lo ءm.qhJg+vg x0AqRu)[z[*(l)JQR) J T% R u lm.XMtNt`oZA.)JRM,r3aq=)JR)JR)J[f$6+ JД%zYpG(~Kx+3xyf1\0fuU JUTvSQ J*) MھЙ.],8#@~?]L3d1L,F: -@DPdҋ>G? aP>cu",|wE#:#[fdѠ @ (# ATHU"؊ FDȪvP* $7Q5o`4EU2l\+pslk1,&D{75P=&&&@sM3ʌbSi\E Pd )0C`u'\'ݡOo$dL1I`\'L{/g:0iXQأ` "Ǣ6~)-^ǂ2=#?⼆1Nv#!SzK .LNv)3G?]lfKF{@_"_v%k^ʈ ފD$WrLH=S v¤0=ToC БIǬ RTbQEwU L^)K&bv&f# L~dL@=0NPWcfv7/9Kl]'DQW uL[JH13-k C[X#3tjIA&DiBi (Z@(J1裸{L:(* ނaqb0:o [n6#0ƘXf ԕIUޞZN*#*P+ܪ9e8q1ʷBLȺJEe&ބZVARoTJ#uD*͑)B]^XYK6JU0) $RvFRl}*(`-a;ḃcEƥ}O O )հeq+ZDA+*ٮԃ8x[)QEӫIb* lR) RJR06+lxf|Ǻ4FjT)J_K~'gZ+pMc56Adn!YN.cqܛ' C 5yWAJR)JR)JR)JRJR) 0bP)*B BT)[)JH(RWBWdl -ekuWA:q+?{gN=Pv&71o 1X&y_Y.p?KZj**Z6ShhyPN{'jbd<E%v7\Z@]b0}զD5LJXUvQQu@8H7"84ZLBٙ  TTufr/vDN]'_U:Hl)r;IrP meSr3_@RTg{ j(@Qkؕ|#"&!8c$jX_%$Tm\7ى$5W70ryv c/.[=lЫG$&Å4`+TBO:Bf+zVs*qXXac13X<2I$L&Ӻ06HNCk, P4NZMB>%ch3D6LP*2H(Q/HC &&Cbg{. - !ۨHs"&t&MK>&EI2~YTv A8Koj$4ȠJ4l >.C3sj+5=ƂVqi3K}Ď D^Zl*l6+?OOw7ձʰkg`W';1T 2b" @f~#$PsoURA'62n'tΛ@RX?x4_[98n/s>Ԭ8L8d VEBm ;S0wcinxc`:DeLe,͛y|fAqJ߈φzGD[=C377"0q]>X*/ M5kSu~ `zqY0aخ3H0ƾ>fxo0Lv ?`E(k=88{,[B&j?۽(Z-aO@+xK6`0qHB+C\Aq S`5P%.S BI* U&8tTҥTOQ.YCH4Ic tmUoMkԛuO n:~g*& XZ1w*;6 (wVү!^^VoE&Y H9S2uk/M4*n\&W/Q7#3bv\:42ԭ虝Ш[)JVK>9oӞ7`4b|Q ^1cp6h^;*Rg9tK .ۡcqIBT)JB͚f_9̳  su7ĥ11 \d7{l1kKo,aoi!(Hro-x6YR^XMTx7xX}97f󘀸084.I0].ѳYp˼a JR)JR)JRZCA' )JR)IR!*RahfW7N>bf03H| SE)JQ)Fz)WRNTmx|U?N+\1"e}7}tfuEH[d53_П/x[sǵ&/a?ԟpKk{ot>г-y,|kqdDGզwD @tV=* A^焼<|Gp2-k>cu;bi|6\H]O:}e'~[MU &A 8Y(nBɕ\bM6U+ [TQ75Lܪ̓m'xʧީ%ă-u:Me4LrJSF%T.(I͔@,ZF*'-14z$P"SDeBVPD$PPh0ixf\sqMlH]z>8fp2-Pa ] $[D,$OB4C~@~?܄ Svr)&UI#P o%*o I.;hI۲ WqQ+iCZ{fA8I"$V=!7uˉ $&[h{vS 9?`hyt뺉$jA%6 .;ʭ?5@¸i\O4H "+a*5;Z" &SB5I@P.!w7R/`fu'E~"|ASzf. ka PJ\XީڕeP <-Ԉ$/gM]e2fYZ8`O &7H5lp؃;/ |*'HN#q6Y*ih<(@5">U)W6nŹ^|;>[ &~f]{_7;L"<Ӫ<]oK# |Z 캤* 0`SX߃ 7=Y!\My nG3d=Sc1#X0]/, ^A$]b]3;]f0#1 =gd9 lWa?9وDm{~Ox72zf_+qY*A@_{:6[mq tx¬)744E73/ E5k4o|6wZ9/fYtŜGJZߋ<; K曖v2/@/ y,{ _`02ylcڗ8=)~Xi/~!+yj W 6Al_3d7 _2# E#*bqMhIHtRbEm̶Q yA2 nGᴌ7 ɼ_[*\7Y&oE +;Q[]D+`(n/hmҳy>֖{]?&:nS$-R\@}()Ę(L"MI*+RB+I!E[ԭM$9wIDJ,ZրJPjUA6RDJP# R kʴBJR?;33YodAJLUt>PsZf;N?/1p𠵬i'#|=)X.VLҶ'?plJH08$JR x7a^v[9:1~WOuLZxl+=5%tԥ)JR)JR)r`b25 Nɒ)JR)JRe) RT/iV$Bl9I[Smv to{Y/gWX.-ges#uF*+0#.+;m_14.[!B>0~wG/Wf+%˰|?̎{ I/b|V|l>pڟ>gG$$sfLIDEoŸu_U`EQc߯.a Qf3X=u˝%p"dFbU沩*Mյ$@r]D$FARoJĊvP>waܕZDLA0h=T| S!WWTcR.\b?1Ɵ1.0$SmPN(LQhq#YDWAhPWP~5uձ;- < Y{=[8yޑexL˴9bg ֜)n|%Kᯀd1s\G8,<=X88DVmz_7噖sHyZo>WN&'vX}0d `m "Y}$Q@˺@oK*@u?[)%re6antM³8-sX`XwL(T^cAm&LZܨ@*}cHKssGY_fqpb9aw1ŗIń/&*dֻ 134+3'MDUO=$EGLTA40o_UH'11_^-$ 2oXK3YpA+B"Hұod\!ƑZ$'$2Awi1HBE} \nۙZc3HdL.hF r0<Ɔ0\NӲj&`9CUə٬_aisH.O=UI1"L _Q- ?AZ}mtv-56`؀fi8ncZIXFmtyD5=D @JwYN{/c3t3 4I>MgKf 7άH]1--c|@]h\n#%tJe>Jv6oNPDUq-%O- 43UG8Hypw'dTM *$4sN0wd_tĂ>A &_S$"košH!#+Pk0 ĔfGTY:HyDI[̃9 vI@U"/;pĽ4rJI^<]_f>[_Tp>/rb ҽo ,_uNʂqq0i~-_>.`-fe/CʝB{/óY@ 5d  Z|"1h@#(x8;T]` oU &" N*S%5Yi&I Yk 30Y$]!BKU ".Be (Gu4K=Z$FQc( FA<ᜯo:V42Yl;01ȑ (O^ scxD$E(dH/p  Z&b;" . x77Iul6/^ZM=Gyy6[8;ZW6-$ntRhwP]MnSʤ2=P1V Q-5H v+bhTL<I=ML{1O?.{1ab9}i"W\ˉs'}Eު oÈh&JikkDLs#?QE9Laa; j`LT/~4NJ8~Opw, xW>a&{ͨ'sYN# Ő /.@c3aLȃ^_;q^\$f@ MOUz@[D!$j?.d\€Q zz~y@QGd5y$THhxZv+adutKv,Q?͔-+Q >BG訧DD!RIVʢGtwURLY&Uu\bʰR)J_U_!@[eJ@`nn_ b ,*9RDBU5$8@47!IP$XΩa[=/?rXGer pqqH8 ~UEd:@k†rخя}$4lq8/{'U)(R)JR)JR)JR)JR)JREh)JRIBP%in0Ig(1+ X\>-6!qE`l a^ rvV#XB0\hHV*QDu,a c@Yq[aKzό1:]|1'V%Mf\gv>6#N LB]'QqLEOZh$}7+GYdKq\I&xe s1 +- Vt @IA$R;dI*+UIdM䋨ݒiR!*Z2E9=we i@ H"(O hIU!"6)k\iZ,+I6ABm#w~Ba1ɀb FS 5׋bLJ("t4hYfǘGW\ Pi^B"+3)$ieR`g,rn5nPR;&캎6T鿪~g\:-%q+xOf^X`@0;;«L@)]NzqLfb?p-/t4}{9gry~8 ." "D=+#ROQ( GL .2;n-Afc(*b$;5G Q5 D-:Auw+{ lt&O RD8Z`b)0o_UtiϷVRb4M.}jLOd[Vw)`3+5vI]a;B&I7>]hX! P&w:*I&>ZM?*FCv~ 39`3 8 gntWb6pKlBu@`%CZ'@աѪ)6)|OԊ@TZ== 1?e [-")_ ]5&g;cknf:=b_y콏ž4᎟9 b03C` h_#C" }DF 4C\ cN[/nq2}U:ASEdgeعl.l5ÅWV~y<ϓhX / s#~ .8l8 '+̖˾H!qN戓QaOlqODl; M/N8]w888jgth;ITK<$ 7?BYB7Tx5˥1B2D-'Jd&[ZbADD"1XN(_Ro3 LǖM)5aQtֈm`5TkAARLM` %$hFo]Mcu17 .Re0IhV_E4ilDօ!W6S2a&è\SgzuٞlR~+$ o[r7،v[Cu~yiXnmZRM,8{v,U _Σ\l0tjm$g3.0\J.dR,]R[=FZi"")U8P7"׺ 9q.ņ4E+swr(W&g,p]k+/s'rJW~ K.gT-&ePC4Z} NNAMU4cP~ Dک[\$ X=*u(TRdVQ="mj&n ȕb; " .I}y!-uAWx5pr:] ;qjI "cgqqrxyw@e[Ed1,q{ qh$LɢO`]"mvj+(Po) @4LЙU$~V **)eS0)FR>[ L\ O>C͠&OI8Zf (6W=`^y?Hn! kEU0ejb*!B"TBADȩUPmuH{ *U;(el!AJUE^" nED+eQJ|I?Bezfw/f1"^+\IEl+%J <zWu,L0r <Ùmin k 8q^S:'N҅(]>5 q^I2Д)JR)JR)K/ƻ x4^~\ 9ʌCK/GtA!xR7^#[ I6 _?z ^r98An]#SEH~]9 _`8oaSA)JR)JR8Ou;S75Bo0n>fkٗἦ&kq?1Х)IRsYg; >[Wg8b@8]}F"id:k37/8VLJ " )VReU*h+3dٯ֪eߕ?C`X%_u7*m/5W>mV\Opan9|.<3Cc~I qs8֫q(211Bw\fI Я?'2sNf3pp뎫B鸙eLW@{ ^8-{5+󞫟fف`@U($D7TRTV\/1x5\d@0aq&rŌMa,. :E%Q E'(TIQndֽ>OtoUmnB));*2GSR#p DKXϘ֒s],?0-b>LS 4UeF]h$i$A?0 PthIWGQ "dL;uSW t=Qi e]6yW.|&@cIHX0]$E*<" I!rcq1ֹ("';.Ƿ \4158.vi3||kH+1~>=>!xW0MkFWblG"zf7j"c„ItjwRD_Y[P@ $*75J2 *in2dTjDn ELz,oZ-dT'S5$6$.F$|\.yA1InE$ h ,I\!x+81*٠<$!I2&n`:.I7*/C\\1kcz~oxw >:~_ewx$_?<G+Cp噀&^dsQ'u2V@4 Ӥs. :~Yq~4f>n:k'vt"f6v@҆'n*s]3EH2DTNfw*ߨO$QѼ½2 Q=~i׍*($@[yš~6•Pl6P4+(HL}DU.!PjLGbM]Um\mJzo|S ? Ri,Ir籮#]auwz+P5"%bB$Tʏ uP} m &ұHBöQ` a Dz]@Cj>J9 4Az$6 $DD$w8hBvw[c>Y73r><ϋ<2:X!8z$@_WexΨpߙ:qYZ4"l6׹o~{urC28MyyCU>a'yv3$R+ZpX iuDD6G^`MbPlnWx3P>Kaorbb'A5fg2Sw"/jq("Dr2@ vQ*Hە7b4]Wou/ dOc x$4ō?+$M+JV.6hBX]:"itjE F]ovq Wu^6dYܓ2Vab|Wǹ+$A,3QfĨ Džpe3oeҤUVEb G&)0"MT$qd*hz-6X-Kk;u>0?k*Hd)x[ <6uμaɌGXykrkיqAx ]\N˷ mcq^_u8MU{>n'J;T9Ux'B=S3-$G|6+^I5rdt| 0I5I/GpzgVfqǸ.+xE901+4r)"E9)D5l0"j J@mzQ$t Z+XЍT &f1LnA$œa$!5"*y$H(^UM1SLAډ=pp_j+E[g{\]Ḏ`]#1YMI;N.RyIⰍ4T\PɁ@1#>|%ީ>Q1-;.ߏxUnKĹ{H{#g nPA&9U FP7ydY- pPP)-Ꙃ 5GTڝjg==3/ˁ8WmJ?ц | l Msqi9ۺĶIf;ӄQq5YRVAh&e}TLI11xT)D uHB֏u:tz ;Fʈ7]90h;>dvgcx-f c\&j`+o?Ŀg4ߧѣ'Tҡ 1<.| ~:tlNʖ0p?> &/I<\gWoRz/l>۠I`~`֝] -7hR@D I'G[M4*v(I mu3(oϠZ8N]0@VI{)ĴDȩӦq"cb!Qd &c.7kC#N-8p+ 1I 2j+M{|.uYF%Se/3sG'LxJAN L}$HwbDˆSXSI Z%ӄ dIXGVSX"Eeo-wV.& dBU5 8l~ӫWeY,Oc ,:~d>*&OU2]  Fdw9}2 ߄ԿL_fq3y.m]6UR*ڂGtPHRIpi ]rabh&/үPy U# v#@ <9Μn0p 8v@{|WbF˪~ҾA{TUȅ[+4YI#$QAM^豢z^ꈔȚ 8\Uz=k]G O0c&OyVت/Gf>8Jx;oJzCdqr#f |LM"w]`chEWټ>ϕG/!,-7!eT I_o+gXw3HZHsMO~?Mc1f3qd:7]1u)JR qn-23O= цK[\J(RP)(R% Jq)JRQ0<_$C'ǝ063Wdw8n- .)JR)JR)JR)JR)JR)JJ)"⋙9a_p%JW*Luܦ+3nvR)^R'+Uo9qRAdQ;B/)FVZ٨ۅ5]Klv^MPChce&9wv_?.^sD}גCI:{.77C}[jD L<&u^RfQ5=ŬT(BqTM?uɆڌˍT\Nc J㮚 d5&k[p:gu5#BS6d5Zav 'a>+7 ŒUT ИPxNQқ@Pm!1@iS1ZkI1GO$M4<T[/Yz%9?.tOd28kŒ0۹+/s}G#yt; ¢j'-RŕK@7Ej<4.2Lse[X 'IBb0d D*P++:}D rXڪiTb'e1ImGuǘ?5lS.q\Zd{]Rj S%DD ީ&L $I/ O"GRZ'p?F-.N\Np$g'QT'^0 iOu&KL^ҿR#G!؝S=' aHce|Wx8ٌ ,O, 30 ;7@IELcctkta͗\Atr#PHMD4;+b8YfFgb[@" ֬3Q1]|9!|srXgX1oA@Ǐ|b߄p5zqq7)hENxx_1h$1FRa-ׅ8 jTo3}LL^cQ;`bH5Hp$^S3Ӱ:>6^I5ZӔ<M8AMQ֕d槺>`]8γoW7ter' XI42/O%|@u]e/ t0@ o+$< k<&Hq/03Xbyܤn#H(16;"Ih=P`ߎR  U58P$Z'({ 3]ӱᤸI\`Gb\ @X ^~QV& \ I1&ahS, Zn+ᘤ [2VVH&D+"#aR4 iUD65QP&m ?%$yb kުI!i&/>\8A\q%3^z;0:v,Bպ.o58rL() l9`5̓C1uI įo| 9O t,ycZp{@wqTNw"JLb}E6yZiNz˖3CqF&!,Ί@mI" ګ }+$"A DE(HiMuC35ӱp1̵d=SΫ11 s㹒ˉaZ4$MQoN-`̦4B hoKx"v"i _uKl()6*EB5"y;ZQ#d^Qȷ#b&D:Ôz NIQ)?2)TΣfMfaB?U"j"va ŭywufd;ubD*ujj3}u:qdYXDsy~3Py(H&2"E!vsA;j,Һ[tܛ2Y|bK\6&aJ㽊g{BA⊉DQBD(V"ĤījQ\Bd2mb9 ivb95d!@Ŕy7R5؀PD; [8'ܮ;*ª&2fw 4UBH7*+[+jD#j)1ʷZe_~%/<#=ˍXw P  ^OĮO/1slZw :\+j"PaIh >>ޙ2xXC#XqII_9B ۲UHR([ Uꠥl6UE[]J[(()JZv s 3-f\ .1 Xfq$S*Rr Y>11c[BIq.2MPJ RJ!*BvVR%HRwRPqn6e4i_K_ra*0T a?j qBtO 5 OW Z$DY" P$ނ- X] k@YLOytZv]N.;ޫQJ haլ\5`$Q&/<$a]!*OD)udᖃI+WKFLsdI76H:3;l 'TZ._q IuŨ°d-X%H-FQ"šOcDA?d2AN3YZ[X_eMq&$L] ]<"汸Z mt_ !†Vf[jr 7[7ITGif\`B0終\$뀶fD -tԉ$@4I&$P{'eR@0I0&L&%qQY Q$s$Ԓ'@j/%D ;(QܥTRv2L cQDR/ M&HwfY2@3*؃4-"ۛu>g'ۍԱqC٘8l֋\t A "`m>!F(TR? &jd@w%ѲM*~:@7hy5* \)k~A&{ (^CQҲ`  %yxg AXGTH+Mq&BɒFHfL͊H3JcyNyF$(E.LL6<3Se|lz=Fi6Yqa@$Q tA"KNhHI)sMId:ܢdkxSx 4:Lg[8 $ ,B״cyDRj@ )-3AZM2NZ/:]eLI0,bfB?.{LiuIffbHmnC 7v8Yd "dG!@?ta(vzNuLr &>+\I |G3!`$RDH!9E͕{@ӹXqa{L4+:Tk;Oer|ߢk+8˴Y MxQ&x<)-`+DIN 'oUoM\f$R+cH'֘ P$vŽSn "(JЫIJMU2R*E#Kb )=TP7ToTE( !lBQ1D(+M52>eoe1:Y|>\9ƞo[/>'I<]:4a`8M|t|kUqē5U * V<"TBlA\c?M_m> Aw_1C%|)1dQS N<J/!~tg ̃kO@N|/M>*|Ga ~; c$.1?Tg @M/Kb)[BV_As9nG$^c|9Dz)JR!IR%-/?k;q|@>8a02.\@i1٘1!eHJ \8/nu9_f)YCIDGuX0Bʒ\$4ŮpP)JJeT`R_M&uu8xZy/0 ,Kzd g\0Iv'R)JR $sLO37qZH;pJR)JJ)JRL8>P9\hJ,;*05s\:@IlL|qpYt+ LɅ0ίF.+&!ƕ.L75z%'>sm{hEdBT:$LmXlcCωCt~hÜ6tWy~]ǹ? M=5ZH?,_0;Zf3e_ug I{ AHb8O6wN1sEؘkvZx=ױ.nFE`wɄC+x8mi{ ZlH5V&p_ f'@HAAEOy6@Wd-+0߇66{-20JI p)_%b@*UpUuB ~ʸ{* #M$Qk1AyvL0z ȸditSeɖh~3C& |u.pg׌ב q)PEf20q34-; ZDH";)? JtI$( 0kNY L~s/<2~|G~ Nc4&o+/ ٌ>sщkAz8>g֫IOAp'D"=R  UOŸ+=S5rykX4I=pl,Vⵎm]sAHp%DAp=g\4kw*'jULh,T\^(EA(T.R*|@fOl&Y@ҼD$h}O)@bVK+5 K'o$eQڊH?dpq`þ (._*M& )=`@s5=;4aW ֋@uhA:hb8nXA$AAal^$DI'dG; V _pfG~( Bhk*-b.Q0;,A `cVNW:ADj&`G"NDi.&{7N곦 ͫ)&E\`Ix;¿s1sX>纒\ f/aYeqKk/47D"o+;^M/K虼] axdd򃦂I z>W|N]'[S~XʳNH;7CfpXoI VM[f 8s/+ za-'SfqpeupyGaDY6Mnݠ 4/8 }_>xŽ?ԺLer71،6;Î0bP iS?eKM LM#!$il}AhFԪ5]tA"x IVP6MhuyK]]hjܦD @ Ϩ&M3@.R%4&$Vdb`-Qv}g:F[! L7p\C4+DU ɶ+I#HN*&IXP"KL}Th4lR,dT)D{Z"H^z>?r ޝZs)/H>y'i>İ$}Th/=E&ETV2~(=!i ]Yϋ d.zv#Ĝ>H ;~{9<+"M j/Ѿ |%h͌[ c,h$Rw\b|;Fgbg-2F.lH$lHڰ>`a7Ygk :@km &@§PX+StT))4I SQ[&ˑŭZ88Ma? W]?GG:Գq9 y ݗ叀dxY 'Q!HB`5^_oYS}2"Gy9'Pc;I< ̭-5vl=^cV_?&t!$&ZahYD2RD{},& 6Od5Mf#T=vCfTЫjJA 7V@R I"TG*+%͂˛5]l z|& N>ST׏]7pDEMjC A'O&7% =cυv6#\NOcԭg^eQ^1"UPTFP!;^Q7U5lt& t<}a|Ylwt#^KL]ʅHP*?t7CdXKV5T^ç0s/ toT(57Q4Dܡ^JI$޲ xۭxHfA8tĴ^.g3;18q2JRs@dD.7q4FiZGJRגz6_I˹myiYT/ gΡ- .ZkX.q.2MB)JR){>g~'|c1pAew7OwDnW+Ӻ~$f`]I~0)JR)vznld:ica#hl0س/poWWzQiW2t1>;Guca򈱉/*0CB5(MF0-XY"K_Os{={ 5ẰfWS ?oF5. A&8Fvs=K5f>;QĘ.P)}_U"U)2AF%ץA#aDb$&  feH &T,I{⫟,ofզUb]ѹ3U$IaetkHUŕ0((d*({~I *Ô"nIk psM+Ꙭ{EuSRHQ#hZ ҫ1$Ys8V̨y`.&|?ǿxs?3=7™ps5|nBe@,mIE{( TU[mPƤu8v [+znuan%CI+#h+EZn@ٺ^>^!htia6PR O$wR)0QE(QD(+e+e)[)JR֜wYRTRR)IBP)IQ2i*)JLB)JR)KeaȃH)JR)JR)JR)JR)JR)JR)(JXaXH=W:qI$8A2J)[[)[)J*&i!@kP4>RA/K \4=>aog:f.k)b6n`i'ĿX2鸹L[,c $;_fzͻY|5陞g_ZI?ğ||\3 ه"U7>,DLso„dvA{e zEvQ&"PVT;*heBuWcC0 ɧ`RM7c6D Jg컌ʳk; !tT.ALn}m3T. {44Vflpc5?11  $ 6H<Ъ@%S&\-) kWA4aL]?}@勃ƍZL/8=f$Zk+ZK!d54`kZy4[j\Seah蘴BH0?( ŕ$KGZ͐[JU04NTj("4Sd¨hMU{BL[N ?bD*7@mT`ѵV* 'I Kp>[e01^3K\@5Hd4(P"K?d"V{SB\hHD@3IԤ<MQ2$o)1铠TQ LuH*Ҁ#a]S%@$x[k5)%EkZ@iM@0$E@hv+]?'$ `De|g 7M&bWޝM91^dwZ1TJ虌,UcVC~AOΖ̆G*֋sh4R}UY HU4E&Z(1q KOjMb $}@LIZ6EK~…$ybH5D>ٙ&(hxKIiw7P@>&kM֢2)b@rBGNfR[.m^J1݅!LHXn s!4-߅'hLvTϽ0º`ȃ(CkiP9 P @ ^R H 2Ca$V G$@I(\*$k6ժy&ԢKE0MOН볗f1LՇ%Λ.`t`@"lӨStڿ-RdL~$vXI*r6@DU" UF1i @w6IPPUԫypت=@@F*St 3qE*eRZ}f)5P~Y3P;.Mc1sn;}x /89637#Ƥ_?"6E L$DVZeNf*"9&L-@pCDܒ)<(Q֝$ɞz';O,f4e/3488^D\Qo#Vo7U5MBDnW$|N[8pPJZA=S"Q -(T1JT~T@P0)u4Q NܮGfqN[:c'.l\4}f/uL+yP&J"/Di^+i;aW)*$Jd-a|>`, !k_sU[uXPgK#t<v^GE]Ӵ..3 m'Wqvjr*?auA7@ FѰQvT*h;*BH+ʉFxZ{C_IYIFbҪ C:GU?K]牁ykXBe%}g/t? ;t^Χn&em0q tNJhaLI֗ %}<1ry6!fd7csOa.G-0^ZOV舚TʪQ2IekP"U&B}UCDz4$HSMAx:CoM?P n -ƠB6;.:'}ߨRJdxk2MeGD֒vI -!uj Pw(T? &dt>C{j" !˲p o~Pw&b`؂_?2y_x?gӎ{dg.C_Ƹ&|gྱྻӺC+|9q|RO2*SNÛUV6 !?1Өt8d8P,Qd*DҟH`D`nEUZI~ELdi}fYDP~.?e04+AwD}T"*Z5{XDۍkyH3@$ I쩚kKM6 P;i x^]R̷Öf! 1b{ētLPEL6@H1Pl0clO*pcGr@W|W%~adOR3k'!mD~j"Q#ۄ@&c_Qd*&dM/I PQ4 i~֝H$!DdM?DXA1Q(IaM#Q`ٜ˻F7]r[2L?*h l)E5o)1^~exgc*&&@ ܁P1IQ-[M \T` $ dWsc岹y&CO0WWވ$N߽UY15F\!@c ciLOaebV$٦喑(M )H((0Q""畠t$'*h JU A;ɭ$WC`4Cl H[Z€MS0/Z/ִSZH4C6s'LDDL@ -Z*<a@ydM xZNR!# _~M߄-L:4Ƞ4HZu)Q& 4R)*R11kL \3Q&lC[h`ST& FީC8xnv&:_[ Z@n;* TBlE*jw]KɳIn+ˤo4_CoC4|9069ms?e2هac1s `;ʢ,yB`p j6DT;`RcH"N) ā&cdlcKoy^Ah'i]LLC$W@qDwOxB23&˅\z} dUQQZ۝5aQ%ǎSe/>Y|)Icfr.[ h08 &w~"u~y!tDr(]FT+eRREzJBT)HJ)HRz!IRStD4Lw\jR#t)JJ)JJ)JR)JH0Jg:>?QFpx 5i$l !8xx=ߗ˜3N3 /txn[rAۛai /?6ְzW 3p'jMJR)JR)JRJR$) BG 6RX*()uU[*[(Y#tAIŘl.GADHآ44I7!L?g>+ÜєfǸ t*ުELSHFRySLɒw(iHvP[YSQZcKO!82yIU;\D 3GoXTV"TMb ʩ0h:G tE@H"MvA bTnbv[PMPqjᯎ<#ҾtL^n& kÉ$nI+H|ZM0r9|bQخ$ÏY悿V(Q$ "&'{*µF{_S@"&"MɧH"!P4E)d7s{:8Xml rr O@.; $; .AĮ_~A qcn4\ERPgzl%NՀ\=UvުQl7L*X%Q& 6e*Ml~)'{Tj{'&}Lɧ ?LmS6 rI v8ni+d_y]1zOQe\YM7^W ַ:L:MUAQ4 ՚St!QmnĐƸrd0d" VLQ4kd,Nڪ2D\B=o^oʀ$!n4*#M3-x 54d"Tu04`[uxgzL }%//q^^nc+;0Ǵk M*DKm5O!ԘK91\f"@wV*4[mVވI$lYJ4*mŸbD{,@$O lwE=˱h:YrV1! ҍ+rR.&3 N<.W`d:\1y].BUQRm R`Pw'e"JR'e)J7!HJ!IRhxtLV>v36v\iT R)JRP)JR)JJ)JR% R89,A .2IJR9>dpۭH4(R!8NcBT)JR)}xw~f8#uxN!iwB)JRIR_xgD%\bTDpkZD/1H$>wT13C0񕲔[$QJV*N*4WuO˹UUUSVZH8/t"+Uܫk*"T/2o u\Ju\쩴)[*@#6Tw=cyTRQ* oeVMʢhꈬqE)߲@3!R}R $«}%ZE&5@},Mu/ sf_i-0>3C4sؘ28 ;D}fj"=BE)VPL8goU.E1&"GA v\mnv%\"` n}KKA#Ԅ5Ήuɘn\фIg" J Z$+&UaP- %SK0NPnBI#z'T@.LOR+B ESL%jn12T>EItKH5oej&Efd&n\Z* dZ8DA@)qTSKu3i$ =\ڋ X]NIj7I3_tLC3XŀK$ދ>=# :W+γ110@~JkޫXʸT,&3RE[@]L, |ay68\]G/f[bnB.?&H.>P&`֊A GBڑD^65mLFꉽw5UNS?ݶfˏL"B+Ң63S5f(=5iΑ%y.yMLׄ@rdL\ ڊsGQZT*DU@3tÈ1T(dO4B5\L*a_u}4 :I)( Vw2 I+xЃH6YӼ"”Q^{` ;& B&U" D~蛒ND(rk HQl'쵇qngr7S|wղ#挛Daj-b,yi?IU >A42KP9BF@UE=Rd.]WHJL>c|$oSbqp:\ >(u\|,,'f1&6D`*cU ӺR4$3qC`$Ixn%@2Uߺ.Bհ0dJF!vqۖnO|<<;UHղoDK#) FЭɓU<*ԡJR VR VR)K ˹t8JB}j)J%JR%HRDaHRZP)JR)JR)JR)JR)vr}G5gx8JR)JIj<3Y_7'__%?bKj:5^͜5'Vp/G-X?)c?yH0dlS(R)JR)V tZv+= hKZI X *JHR<)gQ\\ShfYvfD'! !%$ jD*yڋea.{qb1|9;~xU`DVrWc氲a?IObDQ537 28DSHBECPޒ4%P .W-nu8쵙!J ]\}o|Cz'@,o3(7pYk a8%gdQ%LދMckIx$l&$7X e#Id;N⊰em#*~ TODˤDȶ蘐~PʚIV,R71Ig5 Ϫ|OGEn&k2i/)t^g+pߡGuH%544TD UaKwHT-+~B&ˀfDBL$DPA&@ DT& fE})UmHZk|H; $SAUN䀩3D 7 +4UQ*nu|1%'c0"fU@kœuDRjw2IƤ50BE?Y$n"8L T'ZaˬH͎'GiD5=qQ>md6)$i"6A "f B]" HT0RdIk"|)?]@?*M@J(Mj|ć H"{"{w^˱s[ߙV 7_SY|;= uL~3sfzq&Ϙe'&-o 4DL-_|Q.cepp.6#DI|O泾frwl l0KNu 5bE PITWxWx?ޠIgS10Ai]~ss>Ufq$b<ԕQ6UCǛ 8PDA?KPiT"*%=LH4V NuQI'T[?% @ET;I͕I*529P>jAתL f3"߲@ QDC#d P oH xSs &O[,@$AyHi?uxX?1:[qqK?+`3l9Ls*t]V^XQh$a&t@;*t@7,ʌff.*"Ph(w; Zkp׳c9`?yLNފ4z(AILL.gQp2 frL5\+"3W4$hkHuOP 7H32{($G5T my3E)I+7H37vVNpy]|..6ek.#ñ@>>(ET &6P?qIVH"lvVHFT/U@ x2$/_O/gLՙp H5~>*GӺ&y@*h?mb7@$>ePP(ŕQò6PQrVeDiq AX $RL^w+]1\,LLN3.hAWNO(u^Up\^OL2ϸH1hGetOcppل0U^f(`#  D^ȕQ&f*h@P7#mn4%&VtVHYN cMJeqr-aiB*l RZ&@JRl$+el-\v0Hqx_serx10 78Io$JB)*BvB%~x#|<ψ3XgՆo_:5"eJRWٯo~SS.s0p$_)JR)JR)JR)JRecX8xe5.-aJR)JR)JR)JR% R!IBaJBfJ&NB*U% *P1ul u,J|SQb/G?r6g^[@v`@_+?e*6Vv2' f0cΏ> t^!L\ _R}$r U!T)GuEj*PEMhBps8wvE!$̟#um*ޛ{{< 6T*l?*}WOFGx'5ҙfx_/sw-Tn (tTULʌRP#\804%\Qq4B ?u)2"U SkSø Y7/C 9lTd\6.AUsbF|SEh9콯xW>E̻-h!; C3so񝏌%=\;HCdVH VQ` B`6JpI66!?晴*eyVz#O wL3Os7"$((&";dj!Ņ$oUxQ@@6 XxnspĸwaBVmXGH]P5*IkuqZ5}R;T_7 SpH aa5\.jPlGu TĚ(x xD8 R+!f(m]3NDֵD}nM&A{+M<$[,kۄC„R*ͦn֞ʨQSai1u Hm3‡p-ЂM cKw\n.@׺ cEAPʦぺu;L}7BI:` Xxo3?i7<<5UvCLIǬcf,~^+DyǎN'G8 7N&(;;'D֫DӼZI0&I+YA@&R<$")Z\A]MI$֊3-qzI8`ɰH ¿)PE Dp/jl9Lw@$qJ ݗ6_^ :{mukStZ Yߞ>H t1ZXK@ dvF/Z&zKAӰŖ^י``HmU&|/cgzo]~odidHHX0ʨ6@ g 5};!O͙@°ߛ.vNEc?Hn#EY' lANBDkP( lm#SI<*^lvXH&LbiI3"ޡn'V7f skW=FD҈ }TdZ*O%ȀouɉZփ0 L%ł DzkEV Fj~TXA]dpmB=ho&EB֒F^[o[Fh;Ӫ"cefР^@ pGI"MLDi#M`$IP0 h(_W Y`7a|K`,@K8N+Y >1o-m0 ٷpl)آV=TDFg3X.vu_߄}'Fc=nc L;ʍQHj+7F!D vTvl Xx YAitJ8VҠ`Q]u~6UUQ!" lRLN e\+;#e_ $'Fxb q+:?Lf;08.[AK_2i~E_ֿ#==3o037C dw'[![ XYL0`0m?Ҫ,D*꺮S]q:PeƬLGJ??>,|lp^K17v .0?"ԭJ\la8:AvfBC&Q4eH\ly< kpkfҷd3|h.qi-2 p[{8.=VR% BP% R)JR)JR)JR)JR)IB&"Lp)astrometry.net-0.67/doc/UCAC3_guide/get_ucac3.py000644 000765 000024 00000002207 12651445460 021516 0ustar00dstnstaff000000 000000 #Script for automatically downloading UCAC3 catalogue #Last revision: Dec 15, 2014 #Author: Denis Vida, denis.vida@gmail.com # This file is part of the Astrometry.net suite. # Copyright 2014 Denis Vida. # The Astrometry.net suite 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, version 2. # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import urllib import os prefix = 'http://cdsarc.u-strasbg.fr/ftp/cats/aliases/U/UCAC3/UCAC3/' for i in range(1, 361): name = 'z'+str(i).zfill(3)+'.bz2' url_name = prefix+name print 'Downloading: '+url_name ucac_file = urllib.URLopener() ucac_file.retrieve(url_name, name) astrometry.net-0.67/doc/UCAC3_guide/README.txt000644 000765 000024 00000010477 12651445460 021015 0ustar00dstnstaff000000 000000 # Last revision: Dec 15, 2014 # Author: Denis Vida, denis.vida@gmail.com # NOTICE: This guide was developed on CentOS 6.6, but the author sees no reason why it wouldn't work on any other distribution, provided that you have Python and other prerequisites installed. # This file is part of the Astrometry.net suite. # Copyright 2014 Denis Vida. # The Astrometry.net suite 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, version 2. # The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ------------------------------------------------------------------------------------- PREPARATION: 0) Install astrometry.net and make sure you can run astrometry.net commands from the shell. Test by running: hpsplit 0.1) Go to astrometry.net folder and run the following commands: # cd catalogs # make ucac3tofits # mkdir /tmp/UCAC3 # cp ucac3tofits /tmp/UCAC3 # cd /tmp/UCAC3 This will compile the ucac3tofits program, make a working directory in the /tmp and copy the executable to your working directory (where you will be downloading UCAC3 and running the scripts) 0.2) copy get_ucac3.py and build-index.py from this directory into the working directory # cp /path/to/this/directory/*.py /tmp/UCAC3 ------------------------------------------------------------------------------------- MAIN GUIDE: 1) Download UCAC3 by running (this will take some time): # python get_ucac3.py 1.1) OPTIONAL: Delete sky areas you don't need (read the UCAC3 table_zones file which list which declination is covered in which file): http://cdsarc.u-strasbg.fr/ftp/cats/aliases/U/UCAC3/UCAC3/table_zones 2) Run this command to convert UCAC3 format to fits tables: # ./ucac3tofits -N 1 z???.bz2 3) Run this command to split the fits tables into 12 healpix tiles with 1 deg overlap (-m 1): # hpsplit -o split-%02i.fits -n 1 -m 1 ucac3_???.fits 4) To trim out unnecessary FITS table columns, run the following commands: fitscopy split-00.fits"[col RA;DEC;MAG]" cut-00.fits fitscopy split-01.fits"[col RA;DEC;MAG]" cut-01.fits fitscopy split-02.fits"[col RA;DEC;MAG]" cut-02.fits fitscopy split-03.fits"[col RA;DEC;MAG]" cut-03.fits fitscopy split-04.fits"[col RA;DEC;MAG]" cut-04.fits fitscopy split-05.fits"[col RA;DEC;MAG]" cut-05.fits fitscopy split-06.fits"[col RA;DEC;MAG]" cut-06.fits fitscopy split-07.fits"[col RA;DEC;MAG]" cut-07.fits fitscopy split-08.fits"[col RA;DEC;MAG]" cut-08.fits fitscopy split-09.fits"[col RA;DEC;MAG]" cut-09.fits fitscopy split-10.fits"[col RA;DEC;MAG]" cut-10.fits fitscopy split-11.fits"[col RA;DEC;MAG]" cut-11.fits 5) Determine the required scales of index files (refer to the astrometry.net documentation for determining your scales). I am using 1.5°x1.5° FOV images, so I use scales 5, 6 and 7. 6) Edit the build-index.py according to your scale requirements (make other edits if needed). Editing is easy, just change the scale_range variable to whatever you need. After editing and saving, run the script (this will take some time): # python build-index.py If everything goes well, you should have 12*[number of different scales] files (in my case I have 36 files, as I have 3 different scales). 7) After building the index files, you need to add an entry to /usr/local/astrometry/etc/astrometry.cfg to use the index files with astrometry.net. Open that file and add: add_path /tmp/UCAC3 autoindex 8) You can delete all files from the /tmp/UCAC3 folder except those beginning with index-ucac3* 9) Enjoy using your UCAC3 index files! OPTIONAL - TEST IMAGE 1) I have provided a test image (La Sagra Sky Survey) which will work for scales 5 to 7 and declination range from +24° to +20°. Copy the centu1.jpg image to the directory of your choice and run: # solve-field centu1.jpg --overwrite --downsample 2 --tweak-order 4 The solved image should have a center in (RA H:M:S, Dec D:M:S) = (07:38:20.142, +22:18:57.895). Congratulations, you made it! astrometry.net-0.67/catalogs/2mass-fits.c000644 000765 000024 00000021112 12651445460 020514 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include "2mass-fits.h" #include "fitsioutils.h" #include "starutil.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(twomass_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(twomass_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type b = fitscolumn_bool_type(); tfits_type i16 = fitscolumn_i16_type(); tfits_type j = TFITS_BIN_TYPE_J; tfits_type I = TFITS_BIN_TYPE_I; tfits_type i = fitscolumn_int_type(); tfits_type c = fitscolumn_char_type(); tfits_type logical = fitscolumn_boolean_type(); char* nil = " "; // gawk '{printf("\t%-10s %-8s %-20s %-7s %s\n", $1, $2, $3, $4, $5);}' ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(i, j, "KEY", nil, key); ADDCOL(f, f, "ERR_MAJOR", "deg", err_major); ADDCOL(f, f, "ERR_MINOR", "deg", err_minor); ADDCOL(f, u8, "ERR_ANGLE", "deg", err_angle); // FIXME - be sure to NULL-terminate this. ADDARR(c, c, "DESIGNATION", nil, designation, 17); ADDCOL(b, logical, "NORTHERN_HEMI", nil, northern_hemisphere); ADDCOL(u8, u8, "GALAXY_CONTAM", nil, galaxy_contam); ADDCOL(f, f, "PROX", "deg", proximity); ADDCOL(f, u8, "PROX_ANGLE", "deg", prox_angle); ADDCOL(i, j, "PROX_KEY", nil, prox_key); ADDCOL(i16, I, "DATE_YEAR", "yr", date_year); ADDCOL(u8, u8, "DATE_MONTH", "month", date_month); ADDCOL(u8, u8, "DATE_DAY", "day", date_day); ADDCOL(d, d, "JDATE", "day", jdate); ADDCOL(i16, i, "SCAN", nil, scan); ADDCOL(b, logical, "MINOR_PLANET", nil, minor_planet); ADDCOL(f, f, "PHI_OPT", "deg", phi_opt); ADDCOL(f, f, "GLON", "deg", glon); ADDCOL(f, f, "GLAT", "deg", glat); ADDCOL(f, f, "X_SCAN", "deg", x_scan); ADDCOL(u8, u8, "N_OPT_MATCHES", nil, nopt_mchs); ADDCOL(f, f, "DIST_OPT", "deg", dist_opt); ADDCOL(f, f, "B_M_OPT", "mag", b_m_opt); ADDCOL(f, f, "VR_M_OPT", "mag", vr_m_opt); ADDCOL(f, f, "DIST_EDGE_NS", "deg", dist_edge_ns); ADDCOL(f, f, "DIST_EDGE_EW", "deg", dist_edge_ew); ADDCOL(b, logical, "DIST_FLAG_NS", nil, dist_flag_ns); ADDCOL(b, logical, "DIST_FLAG_EW", nil, dist_flag_ew); ADDCOL(u8, u8, "DUP_SRC", nil, dup_src); ADDCOL(b, logical, "USE_SRC", nil, use_src); ADDCOL(c, c, "ASSOCIATION", nil, association); ADDCOL(i, j, "COADD_KEY", nil, coadd_key); ADDCOL(i16, I, "COADD", nil, coadd); ADDCOL(i, j, "SCAN_KEY", nil, scan_key); ADDCOL(i, j, "XSC_KEY", nil, xsc_key); ADDCOL(f, f, "J_MAG", "mag", j_m); ADDCOL(f, f, "J_CMSIG", "mag", j_cmsig); ADDCOL(f, f, "J_MSIGCOM", "mag", j_msigcom); ADDCOL(f, f, "J_M_STDAP", "mag", j_m_stdap); ADDCOL(f, f, "J_MSIG_STDAP", "mag", j_msig_stdap); ADDCOL(f, f, "J_SNR", nil, j_snr); ADDCOL(c, c, "J_QUALITY", nil, j_quality); ADDCOL(u8, u8, "J_READ", nil, j_read_flag); ADDCOL(u8, u8, "J_BLEND", nil, j_blend_flag); ADDCOL(c, c, "J_CC", nil, j_cc); ADDCOL(u8, u8, "J_NDET_M", nil, j_ndet_M); ADDCOL(u8, u8, "J_NDET_N", nil, j_ndet_N); ADDCOL(f, f, "J_PSFCHI", nil, j_psfchi); ADDCOL(f, f, "H_MAG", "mag", h_m); ADDCOL(f, f, "H_CMSIG", "mag", h_cmsig); ADDCOL(f, f, "H_MSIGCOM", "mag", h_msigcom); ADDCOL(f, f, "H_M_STDAP", "mag", h_m_stdap); ADDCOL(f, f, "H_MSIG_STDAP", "mag", h_msig_stdap); ADDCOL(f, f, "H_SNR", nil, h_snr); ADDCOL(c, c, "H_QUALITY", nil, h_quality); ADDCOL(u8, u8, "H_READ", nil, h_read_flag); ADDCOL(u8, u8, "H_BLEND", nil, h_blend_flag); ADDCOL(c, c, "H_CC", nil, h_cc); ADDCOL(u8, u8, "H_NDET_M", nil, h_ndet_M); ADDCOL(u8, u8, "H_NDET_N", nil, h_ndet_N); ADDCOL(f, f, "H_PSFCHI", nil, h_psfchi); ADDCOL(f, f, "K_MAG", "mag", k_m); ADDCOL(f, f, "K_CMSIG", "mag", k_cmsig); ADDCOL(f, f, "K_MSIGCOM", "mag", k_msigcom); ADDCOL(f, f, "K_M_STDAP", "mag", k_m_stdap); ADDCOL(f, f, "K_MSIG_STDAP", "mag", k_msig_stdap); ADDCOL(f, f, "K_SNR", nil, k_snr); ADDCOL(c, c, "K_QUALITY", nil, k_quality); ADDCOL(u8, u8, "K_READ", nil, k_read_flag); ADDCOL(u8, u8, "K_BLEND", nil, k_blend_flag); ADDCOL(c, c, "K_CC", nil, k_cc); ADDCOL(u8, u8, "K_NDET_M", nil, k_ndet_M); ADDCOL(u8, u8, "K_NDET_N", nil, k_ndet_N); ADDCOL(f, f, "K_PSFCHI", nil, k_psfchi); } #undef ADDCOL #undef ADDARR twomass_fits* twomass_fits_open(char* fn) { twomass_fits* cat = NULL; cat = fitstable_open(fn); if (!cat) return NULL; add_columns(cat, FALSE); fitstable_use_buffered_reading(cat, sizeof(twomass_entry), 1000); if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "2mass-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); twomass_fits_close(cat); return NULL; } return cat; } twomass_fits* twomass_fits_open_for_writing(char* fn) { twomass_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "2MASS", "T", "This is a 2-MASS catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_2MASS, "Astrometry.net file type", NULL); return cat; } int twomass_fits_write_headers(twomass_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int twomass_fits_fix_headers(twomass_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } int twomass_fits_read_entries(twomass_fits* cat, int offset, int count, twomass_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(twomass_entry), offset, count); } twomass_entry* twomass_fits_read_entry(twomass_fits* cat) { return (twomass_entry*)fitstable_next_struct(cat); } int twomass_fits_count_entries(twomass_fits* cat) { return fitstable_nrows(cat); } int twomass_fits_close(twomass_fits* cat) { if (fitstable_close(cat)) { fprintf(stderr, "Error closing 2MASS catalog file: %s\n", strerror(errno)); return -1; } return 0; } qfits_header* twomass_fits_get_primary_header(const twomass_fits* cat) { return fitstable_get_primary_header(cat); } int twomass_fits_write_entry(twomass_fits* cat, twomass_entry* entry) { return fitstable_write_struct(cat, entry); } astrometry.net-0.67/catalogs/2mass.c000644 000765 000024 00000037627 12651445460 017573 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include "os-features.h" #include "2mass.h" #include "starutil.h" int twomass_is_value_null(float val) { return (!isfinite(val)); } // parses a value that may be null (represented by "\N" in the 2MASS data files). // expects the value to be followed by "|". static int parse_null(const char** pcursor, float* dest) { int nchars; if (!strncmp(*pcursor, "\\N|", 3)) { *dest = TWOMASS_NULL; *pcursor += 3; return 0; } if (sscanf(*pcursor, "%f|%n", dest, &nchars) != 1) { return -1; } *pcursor += nchars; return 0; } static int parse_quality_flag(char flag, char* val) { switch (flag) { case 'X': *val = TWOMASS_QUALITY_NO_BRIGHTNESS; break; case 'U': *val = TWOMASS_QUALITY_UPPER_LIMIT_MAG; break; case 'F': *val = TWOMASS_QUALITY_NO_SIGMA; break; case 'E': *val = TWOMASS_QUALITY_BAD_FIT; break; case 'A': *val = TWOMASS_QUALITY_A; break; case 'B': *val = TWOMASS_QUALITY_B; break; case 'C': *val = TWOMASS_QUALITY_C; break; case 'D': *val = TWOMASS_QUALITY_D; break; default: return -1; } return 0; } static int parse_cc_flag(char flag, char* val) { switch (flag) { case 'p': *val = TWOMASS_CC_PERSISTENCE; break; case 'c': *val = TWOMASS_CC_CONFUSION; break; case 'd': *val = TWOMASS_CC_DIFFRACTION; break; case 's': *val = TWOMASS_CC_STRIPE; break; case 'b': *val = TWOMASS_CC_BANDMERGE; break; case '0': *val = TWOMASS_CC_NONE; break; default: return -1; } return 0; } #define ensure(c, f) { if (c!='|') { fprintf(stderr, "Expected '|' following field %s in 2MASS line.\n", f); return -1; }} //#define printval printf //#define printval(s,args...) printf(s,args) #define printval(s,args...) {} int twomass_cc_flag(unsigned char val, unsigned char flag) { return (val == flag); } int twomass_quality_flag(unsigned char val, unsigned char flag) { return (val == flag); } int twomass_is_null_float(float f) { return isnan(f); } int twomass_parse_entry(struct twomass_entry* e, const char* line) { const char* cursor; int nchars; int i; double vals1[5]; float val2; float val3; cursor = line; for (i=0; i<5; i++) { char* names[] = { "ra", "dec", "err_maj", "err_min", "err_ang" }; if (sscanf(cursor, "%lf|%n", vals1+i, &nchars) != 1) { fprintf(stderr, "Failed to parse \"%s\" entry in 2MASS line.\n", names[i]); return -1; } cursor += nchars; } // note: the bracketed units are the units used in the [source file : struct]; // if only unit is given then it's the same in both. e->ra = vals1[0]; // [deg] e->dec = vals1[1]; // [deg] e->err_major = arcsec2deg(vals1[2]); // [arcsec : deg] e->err_minor = arcsec2deg(vals1[3]); // [arcsec : deg] e->err_angle = vals1[4]; // [deg] printval("ra %g, dec %g, err_major %g, err_minor %g, err_angle %i\n", e->ra, e->dec, e->err_major, e->err_minor, e->err_angle); strncpy(e->designation, cursor, 17); e->designation[17] = '\0'; if (strlen(e->designation) != 17) { fprintf(stderr, "Failed to parse \"designation\" entry in 2MASS line.\n"); return -1; } cursor += 18; printval("designation %s\n", e->designation); for (i=0; i<12; i++) { char* names[] = { "j_m", "j_cmsig", "j_msigcom", "j_snr", "h_m", "h_cmsig", "h_msigcom", "h_snr", "k_m", "k_cmsig", "k_msigcom", "k_snr" }; float* dests[] = { &e->j_m, &e->j_cmsig, &e->j_msigcom, &e->j_snr, &e->h_m, &e->h_cmsig, &e->h_msigcom, &e->h_snr, &e->k_m, &e->k_cmsig, &e->k_msigcom, &e->k_snr }; // these are all [mag] or unitless if (parse_null(&cursor, dests[i])) { fprintf(stderr, "Failed to parse \"%s\" entry in 2MASS line.\n", names[i]); return -1; } } printval("j_m %g, j_cmsig %g, j_msigcom %g, j_snr %g.\n", e->j_m, e->j_cmsig, e->j_msigcom, e->j_snr); printval("h_m %g, h_cmsig %g, h_msigcom %g, h_snr %g.\n", e->h_m, e->h_cmsig, e->h_msigcom, e->h_snr); printval("k_m %g, k_cmsig %g, k_msigcom %g, k_snr %g.\n", e->k_m, e->k_cmsig, e->k_msigcom, e->k_snr); for (i=0; i<3; i++) { char bands[] = { 'j', 'h', 'k' }; char* quals[] = { &e->j_quality, &e->h_quality, &e->k_quality }; if (parse_quality_flag(*cursor, quals[i])) { fprintf(stderr, "Failed to parse '%c_quality' entry in 2MASS line.\n", bands[i]); return -1; } cursor++; } printval("j X=%i, U=%i, F=%i, E=%i, A=%i, B=%i, C=%i, D=%i\n", twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_NO_BRIGHTNESS), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_UPPER_LIMIT_MAG), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_NO_SIGMA), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_BAD_FIT), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_A), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_B), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_C), twomass_quality_flag(e->j_quality, TWOMASS_QUALITY_D)); printval("h X=%i, U=%i, F=%i, E=%i, A=%i, B=%i, C=%i, D=%i\n", twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_NO_BRIGHTNESS), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_UPPER_LIMIT_MAG), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_NO_SIGMA), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_BAD_FIT), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_A), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_B), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_C), twomass_quality_flag(e->h_quality, TWOMASS_QUALITY_D)); printval("k X=%i, U=%i, F=%i, E=%i, A=%i, B=%i, C=%i, D=%i\n", twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_NO_BRIGHTNESS), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_UPPER_LIMIT_MAG), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_NO_SIGMA), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_BAD_FIT), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_A), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_B), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_C), twomass_quality_flag(e->k_quality, TWOMASS_QUALITY_D)); ensure(*cursor, "flags"); cursor++; for (i=0; i<3; i++) { uint8_t* dests[] = { &e->j_read_flag, &e->h_read_flag, &e->k_read_flag }; if (*cursor < '0' || *cursor > '9') { fprintf(stderr, "Error parsing read_flag from 2MASS entry.\n"); return -1; } *(dests[i]) = *cursor - '0'; cursor++; } printval("read_flag j=%i, h=%i, k=%i.\n", e->j_read_flag, e->h_read_flag, e->k_read_flag); ensure(*cursor, "read_flag"); cursor++; for (i=0; i<3; i++) { uint8_t* dests[] = { &e->j_blend_flag, &e->h_blend_flag, &e->k_blend_flag }; if (*cursor < '0' || *cursor > '9') { fprintf(stderr, "Failed to parse blend_flag field in a 2MASS entry.\n"); return -1; } *(dests[i]) = *cursor - '0'; cursor++; } printval("blend_flag j=%i, h=%i, k=%i.\n", e->j_blend_flag, e->h_blend_flag, e->k_blend_flag); ensure(*cursor, "blend_flag"); cursor++; for (i=0; i<3; i++) { char bands[] = { 'j', 'h', 'k' }; char* ccs[] = { &e->j_cc, &e->h_cc, &e->k_cc }; if (parse_cc_flag(*cursor, ccs[i])) { fprintf(stderr, "Failed to parse '%c_cc' entry in 2MASS line.\n", bands[i]); return -1; } cursor++; } printval("j_confusion: p=%i, c=%i, d=%i, s=%i, b=%i.\n", twomass_cc_flag(e->j_cc, TWOMASS_CC_PERSISTENCE), twomass_cc_flag(e->j_cc, TWOMASS_CC_CONFUSION), twomass_cc_flag(e->j_cc, TWOMASS_CC_DIFFFRACTION), twomass_cc_flag(e->j_cc, TWOMASS_CC_STRIPE), twomass_cc_flag(e->j_cc, TWOMASS_CC_BANDMERGE)); printval("h_confusion: p=%i, c=%i, d=%i, s=%i, b=%i.\n", twomass_cc_flag(e->h_cc, TWOMASS_CC_PERSISTENCE), twomass_cc_flag(e->h_cc, TWOMASS_CC_CONFUSION), twomass_cc_flag(e->h_cc, TWOMASS_CC_DIFFFRACTION), twomass_cc_flag(e->h_cc, TWOMASS_CC_STRIPE), twomass_cc_flag(e->h_cc, TWOMASS_CC_BANDMERGE)); printval("k_confusion: p=%i, c=%i, d=%i, s=%i, b=%i.\n", twomass_cc_flag(e->k_cc, TWOMASS_CC_PERSISTENCE), twomass_cc_flag(e->k_cc, TWOMASS_CC_CONFUSION), twomass_cc_flag(e->k_cc, TWOMASS_CC_DIFFFRACTION), twomass_cc_flag(e->k_cc, TWOMASS_CC_STRIPE), twomass_cc_flag(e->k_cc, TWOMASS_CC_BANDMERGE)); ensure(*cursor, "confusion_flag"); cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->j_ndet_M = *cursor - '0'; cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->j_ndet_N = *cursor - '0'; cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->h_ndet_M = *cursor - '0'; cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->h_ndet_N = *cursor - '0'; cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->k_ndet_M = *cursor - '0'; cursor++; assert(*cursor >= '0' && *cursor <= '9'); e->k_ndet_N = *cursor - '0'; cursor++; printval("j_ndet %i/%i\n", e->j_ndet_M, e->j_ndet_N); printval("h_ndet %i/%i\n", e->h_ndet_M, e->h_ndet_N); printval("k_ndet %i/%i\n", e->k_ndet_M, e->k_ndet_N); ensure(*cursor, "ndet"); cursor++; if (sscanf(cursor, "%f|%n", &e->proximity, &nchars) != 1) { fprintf(stderr, "Failed to parse 'proximity' entry in 2MASS line.\n"); return -1; } cursor += nchars; e->proximity = arcsec2deg(e->proximity); // [arcsec : deg] printval("proximity %g\n", e->proximity); if (parse_null(&cursor, &val2)) { fprintf(stderr, "Failed to parse 'prox_angle' entry in 2MASS line.\n"); return -1; } if (twomass_is_null_float(val2)) e->prox_angle = TWOMASS_NULL; else e->prox_angle = val2; // [deg] printval("proximity_angle %i\n", e->prox_angle); if (sscanf(cursor, "%u|%n", &e->prox_key, &nchars) != 1) { fprintf(stderr, "Failed to parse 'prox_key' entry in 2MASS line.\n"); return -1; } cursor += nchars; printval("proximity_key %i\n", e->prox_key); if (*cursor < '0' || *cursor > '2') { fprintf(stderr, "Failed to parse 'galaxy_contam' entry in 2MASS line.\n"); return -1; } e->galaxy_contam = *cursor - '0'; cursor ++; printval("galaxy contamination %i\n", e->galaxy_contam); ensure(*cursor, "galaxy_contam"); cursor++; if (*cursor < '0' || *cursor > '1') { fprintf(stderr, "Failed to parse 'minor_planet' entry in 2MASS line.\n"); return -1; } e->minor_planet = (anbool)(*cursor - '0'); cursor++; printval("minor planet %i\n", e->minor_planet); ensure(*cursor, "minor_planet"); cursor++; if (sscanf(cursor, "%u|%n", &e->key, &nchars) != 1) { fprintf(stderr, "Failed to parse 'key' entry in 2MASS line.\n"); return -1; } cursor += nchars; printval("key %i\n", e->key); switch (*cursor) { case 'n': e->northern_hemisphere = TRUE; break; case 's': e->northern_hemisphere = FALSE; break; default: fprintf(stderr, "Failed to parse 'northern_hemisphere' entry in 2MASS line.\n"); return -1; } cursor ++; printval("hemisphere %s\n", (e->northern_hemisphere ? "N" : "S")); ensure(*cursor, "northern_hemisphere"); cursor++; { unsigned int yr, mon, day, scan; if (sscanf(cursor, "%u-%u-%u|%n", &yr, &mon, &day, &nchars) != 3) { fprintf(stderr, "Failed to parse 'date' entry in 2MASS line.\n"); return -1; } cursor += nchars; e->date_year = yr; e->date_month = mon; e->date_day = day; if (sscanf(cursor, "%u|%n", &scan, &nchars) != 1) { fprintf(stderr, "Failed to parse 'scan' entry in 2MASS line.\n"); return -1; } cursor += nchars; e->scan = scan; } printval("date %i/%i/%i\n", e->date_year, e->date_month, e->date_day); printval("scan %i\n", e->scan); if (sscanf(cursor, "%f|%f|%n", &e->glon, &e->glat, &nchars) != 2) { // [deg], [deg] fprintf(stderr, "Failed to parse 'glon/glat' entry in 2MASS line.\n"); return -1; } cursor += nchars; printval("glon %g, glat %g.\n", e->glon, e->glat); if (sscanf(cursor, "%f|%lf|%n", &e->x_scan, &e->jdate, &nchars) != 2) { fprintf(stderr, "Failed to parse 'x_scan/jdate' entry in 2MASS line.\n"); return -1; } cursor += nchars; e->x_scan = arcsec2deg(e->x_scan); // [arcsec : deg] printval("x_scan %g, jdate %g.\n", e->x_scan, e->jdate); // [day] for (i=0; i<9; i++) { char* names[] = { "j_psfchi", "h_psfchi", "k_psfchi", "j_m_stdap", "j_msig_stdap", "h_m_stdap", "h_msig_stdap", "k_m_stdap", "k_msig_stdap" }; // all [mag] or unitless float* dests[] = { &e->j_psfchi, &e->h_psfchi, &e->k_psfchi, &e->j_m_stdap, &e->j_msig_stdap, &e->h_m_stdap, &e->h_msig_stdap, &e->k_m_stdap, &e->k_msig_stdap, }; if (parse_null(&cursor, dests[i])) { fprintf(stderr, "Failed to parse \"%s\" entry in 2MASS line.\n", names[i]); return -1; } printval("%s: %g\n", names[i], *dests[i]); } { int dist_ns; int dist_ew; char ns; char ew; if (sscanf(cursor, "%i|%i|%c%c|%n", &dist_ns, &dist_ew, &ns, &ew, &nchars) != 4) { fprintf(stderr, "Failed to parse 'dist_edge_ns/dest_edge_ew/dist_edge_flag' entries in 2MASS line.\n"); return -1; } cursor += nchars; e->dist_edge_ns = arcsec2deg(dist_ns); // [arcsec : deg] e->dist_edge_ew = arcsec2deg(dist_ew); // [arcsec : deg] switch (ns) { case 'n': e->dist_flag_ns = TRUE; break; case 's': e->dist_flag_ns = FALSE; break; default: fprintf(stderr, "Failed to parse 'dist_edge_flag' entry in 2MASS line.\n"); return -1; } switch (ew) { case 'e': e->dist_flag_ew = TRUE; break; case 'w': e->dist_flag_ew = FALSE; break; default: fprintf(stderr, "Failed to parse 'dist_edge_flag' entry in 2MASS line.\n"); return -1; } } printval("dist_ns %f %c, dest_ew %f %c.\n", e->dist_edge_ns, (e->dist_flag_ns ? 'N' : 'S'), e->dist_edge_ew, (e->dist_flag_ew ? 'E' : 'W')); if ((*cursor < '0') || (*cursor > '9')) { fprintf(stderr, "Failed to parse 'dup_src' entry in 2MASS line.\n"); fprintf(stderr, "line: \"%s\"\n", line); fprintf(stderr, "cursor: \"%s\"\n", cursor); return -1; } e->dup_src = *cursor - '0'; cursor++; printval("dup_src %i\n", e->dup_src); ensure(*cursor, "dup_src"); cursor++; if ((*cursor == '1') || (*cursor == '0')) { e->use_src = (anbool)(*cursor - '0'); cursor++; } else { fprintf(stderr, "Failed to parse 'use_src' entry in 2MASS line.\n"); return -1; } printval("use_src %i\n", e->use_src); ensure(*cursor, "use_src"); cursor++; switch (*cursor) { case '0': e->association = TWOMASS_ASSOCIATION_NONE; break; case 'T': e->association = TWOMASS_ASSOCIATION_TYCHO; break; case 'U': e->association = TWOMASS_ASSOCIATION_USNOA2; break; } cursor++; printval("association %i\n", e->association); ensure(*cursor, "association"); cursor++; if (parse_null(&cursor, &val2) || // dist_opt parse_null(&cursor, &val3) || // phi_opt parse_null(&cursor, &e->b_m_opt) || parse_null(&cursor, &e->vr_m_opt)) { fprintf(stderr, "Failed to parse 'dist_opt/phi_opt/b_m_opt/vr_m_opt' entries in 2MASS line.\n"); return -1; } if (twomass_is_null_float(val2)) e->dist_opt = TWOMASS_NULL; else e->dist_opt = arcsec2deg(val2); // [arcsec : deg] if (twomass_is_null_float(val3)) e->phi_opt = TWOMASS_NULL; else e->phi_opt = val3; printval("dist_opt %g, phi_opt %g, b_m_opt %g, vr_m_opt %g.\n", e->dist_opt, e->phi_opt, e->b_m_opt, e->vr_m_opt); if ((*cursor >= '0') && (*cursor <= '9')) { e->nopt_mchs = *cursor - '0'; cursor++; } else { fprintf(stderr, "Failed to parse 'nopt_mchs' entry in 2MASS line.\n"); return -1; } cursor++; printval("nopt_matches %i\n", e->nopt_mchs); if (!strncmp(cursor, "\\N|", 3)) { e->xsc_key = TWOMASS_KEY_NULL; cursor += 3; } else { int ival; if (sscanf(cursor, "%i|%n", &ival, &nchars) != 1) { fprintf(stderr, "Failed to parse 'xsc_key' entry in 2MASS line.\n"); return -1; } cursor += nchars; } printval("XSC key %i\n", e->xsc_key); { int scan, coadd_key, coadd; if (sscanf(cursor, "%i|%i|%i%n", &scan, &coadd_key, &coadd, &nchars) != 3) { fprintf(stderr, "Failed to parse 'scan/coadd_key/coadd' entries in 2MASS line.\n"); return -1; } e->scan_key = scan; e->coadd_key = coadd_key; e->coadd = coadd; cursor += nchars; } printval("scan_key %i, coadd_key %i, coadd %i.\n", e->scan_key, e->coadd_key, e->coadd); return 0; } astrometry.net-0.67/catalogs/2masstofits.c000644 000765 000024 00000013731 12651445460 021012 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include "2mass.h" #include "2mass-fits.h" #include "healpix.h" #include "starutil.h" #include "boilerplate.h" #include "fitsioutils.h" #define OPTIONS "ho:N:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("usage:\n" " %s -o \n" " [-N ] (default = 8.)\n" " [ ...]\n" "\n" "Input files are gzipped 2MASS PSC catalog files, named like psc_aaa.gz." "\n", progname); } int main(int argc, char** args) { int c; char* outfn = NULL; int startoptind; int Nside = 8; int HP; int i; twomass_fits** cats; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } HP = 12 * Nside * Nside; cats = calloc((size_t)HP, sizeof(twomass_fits*)); printf("Nside = %i, using %i healpixes.\n", Nside, HP); printf("Reading 2MASS files... "); fflush(stdout); startoptind = optind; for (; optindA@ A yOYI#)A@nsIoIIIfAff@_n6XII-III:6A@g[@A@+.`u a-=sA@u}3@7K9ߛxIII> A@Q?IIINAff@WC@BkdA33@ѶrR4R(A@-|]`@ @@v5III:A@"@CGS.A@W`,(aAD8ۂIIIfAff@P%?@6i8_II-IIIZ>#n/A@C"6W II-III:=A@1YlX3p{`!IIIEA33@>-'A@ah7%*I=ޞA@ G@14]+III:%=%A~ff@p٩@( sS=,II<=dfA@ y(v--IIIhAff@:0)`.II-IIIN>A@68(;ł:3/II2A@1TE@)t0III4A@nN&wS1IIMA@gV&Q!69UIܿ2II:VA33@ W7F'L3%A33@Ԑ=(a:,4IIILA@ R2$@n:qxg5!A@ )@:o( 61A@ k@Mc7.A@ 뜫l*a+O8III2A@ h!贕9III:bA@!6rI:III3A@!:XEw@>FԌ;IIIFA@!zf~@>~տUIIIBA@!! J@H؎{uZ?!A@"BizA@2B@II-IIIIA@"u -؜@35UgAIII]A@"R-|uB/Aff@"2AN@3B"8uNCIIVA@"~ 8T@"H1wɀDII-III4A@"kP> @2Wp4LEII-III:jA@"t`ҭ7Q1FII-III:2A@")@=m(EGIII=FtAx@#E @F—JzH/Aff@#%^ÿ@"||HIIII2A@#q6OJ1A~ff@#Np@5Ar}{K*=4nAx@#e9@hCLII-III*=*dAp@$HuY@=8:mMI:2=@OA@$Gb l@: ͉NII-III:AA33@$OT@2$6OIIII=A@$0_8PIII:@A@$8]@6F2V"Q.A@$P@9hOVZRIII:}A@$wm@,UaS$Aff@$aΟw0@5hI{eCTII:L=A@$ЦJc"bUI;=T,=A{33@%=2?5V=;?V=y#A~ff@%+O#JMWIII2A@%nn: ={gXIII:=iA@%uYM"7X5YIII%A@%X. @cTcZIII]A@%5%@S d[II7A@%ޤeV@4.V"\.A33@%O*32uK ]/A33@&s?%^,A@&%pc놁:_II-III:4=ZA@'8y,@Cj{`I-II=> 'A33@&W7s7(dSPaIIIPA@'8L@4}ZQbII-III:= =A33@'ee{ D1lj<c(A@'NR"d(A@'sϿ#o}eII:ZA@(UsĊs?30fII-III'=oAvff@(@`sMr"gIIIPA@(`'j@80hII-III:2=XyA~ff@(| 2h'iII-III;A@)40u'[j%A@)#3>F?kIII;A@)lI-lIIIQA@*;7W@68|\mIII:HA@*d+8@|Qwn.A@*k 7ŠoIIIA@*KzR+thUpIII2A@*WGXr;i=qIIISA@*Ԯ0$N5?y|r+=ggA~ff@+t͵@:R sIII>IԕAff@+I?d9t0=1'A{33@,a$u(=["A@+ݣ*d:ivIII:MA@,-N%Z44wII-IIIE=49XAp@,fr0i \:xIII:4A@,ìkQ "XyIIIC=֡bA@,*:G"uzI:@A@-2{,.n5r{II:HA@-902k@E/KJL|^A@.!:J-@,y}IIIB>@A@-4g݃,myn.~I-II:3A@-<7vԈII-III::A@.?iz)-N)A@.y+L#IIgAff@.ݿ X"II-IIIBA@/Ñc- ܏III3A@/#@;rr'A@/Rk(iy5TJ/=weA~ff@/@F@+='A@/w$&6,III:dA@0o@9hOcIc> eA@0 @9 p& <II-IIIfA@0VIVM{@EA@0X|@B1.lxA@0!}@%7'cII:>A@0gt8a> III>kA@0Cv7?kҠPIII:_A@0Ț-@:;rII-III;A@0Rn4ݵmVII?A33@0 u)$IIRA@0U&>IFA@1 "@UEIII =3gAp@0**] oIII4A@1WGL@E̽bA@1O9>@*U`[=I-II7=t!A@17{c.xII:H=WsAp@1uشV@+%/.A@1lG=@YVII:lA@1@1fٹ5IIB='Ay@1š8CrII-III:3A@1+{@@mߣTAA33@1:w l,WR;II=A33@1z>@0IiF.=A~ff@1.3III3A@26d@/III"=7YA{33@2 @B~,@ ;3ơgII:KA33@3'I@C|-JA33@3-pR@AQ$A|@33$@- W+EIII:T>A@37n F~EII-III:8A@4&Q5lm GIIIDA@4sM)T@4XeȀII:MA@4s谅@3zbޤIII=` At@4xq2e`@JvI!> =qA@4}]k?II-III:JA@4zE:Z%+1A@4zf5ۇ'A@4AH@*lIII-III:NAff@46 A5x՚=IIIJA@4/֓P$7^8II8=ҽ<A@4&38 6,IIIoA@4 )ob3EII-III:9=mA@4S?MnIII2= 7LA{33@4cM#Mc!=;A@5d0r@4 *VIIIYA@5L@vII:ZA@5G%@!b,II:=Em]A@5cF;$Y LII%|2}[III:AA@5¦.u%0pHIIInAff@5]=d1w{^.A@5K.T @.jGhIII:9A@6Za_@0}E7+A@5̒;@2II-IIIoAff@6s?;]II-III:GA@6'0l*yIII7>oA@6@p|/@CuETIII:MA@6Lس9l+Y6'A@6I/i 3Oh)A@63?K!|D)A@6Me+'!mLII-III:>RAff@7^/,9H"A@753#F jrۅII:SA@7󀹽 @޿L,A@7o7p@46nQIII2A@75O: ÐIGA@7ו7qSIII:BA@8-nB㐒II-IIIF=(A@8&D! 4&<II:@=A@8$ߒg,%}_[III;Aff@8UiU,n@"O  III>A@8T7P@)d2IIEA@8x1k@2#$S#IIIGA@8]=i)JCII-III:>XbA@8}P8f)yaj~III>SA@83SIIIK>%A@8H@2 <II-III3=A~ff@8v;$~6!AIIK>FA@8? @2/)B'IIOA@8ˁ'$!>]A@8۩Hפm _$TIIIMA@84 &S#IIIhA@9$iK@8O0A33@9i$:CIII:G>?A@9/HIII-III:A@9Alm:@2Ld\II-III:L>1A A33@9 $11i nIII:JA@9; 'wcII-III::>?A@9=+?9׊/n"A@97&@Eݒ7 '&vBIII?A@9W>׬'FHIIIPA@9{0ap@yO}II-III+=}!Ay@9g?0?s!IIIDA@9|2!5,hI-II4A@9ol$vփ/=A@:DR@2{xIII=A@:d$@il䀓(=A33@:-~+ +@3ZII-III8=\)A33@:M @14NyIII9A33@:5瘯#!,II-III:OA@:w͍@4 zIII?A@:x 5Ik@3III5A@:}m3\/A@:avSIII@Aff@:[A@4qSIII=A33@: EKGfIII`A@:RO1P?DII-III:FA@:/@*QyPIIIKA@;?)X{(@+n@'II-III3=A33@;?2@7vj\,A@;3Q*'>ZA@;|n @@~lII3=rA|@;>AJ0I?=?HA@<5Ξ=a@BQpIII(<&AT@]Aff@A@=v@Ī|?MaIIICA@={B.s^ 38III7A@=r-aF7II:]A@>En[III#A@>oj@2ld&7 KA@>-;p48!II2A@>K9L]@5 [")A@>hGgsw#$Aff@>&@3&2Q$$A@>* @1.P%IIW>'Aff@>f@Y&I-II8A@>8S8e/|)0'II:3A@>Ef? c(III5A@>@9z@8)IIIPA@>1,&"_*II-III:6A@?0B2N?Ԡp+III=A@?V#{;@1(,III=A@?URVBO-III6A@?_`o8_.III5A33@?oq/ ~2/II-III2A@?ne~g@0+A@?sUA-7f1III:6Aff@?SNW'}:82II7Aff@@8N~+V@$83II-III:7A@@ {{eV4,A@@ Xi@MJ5II5Aff@@lS@8VK6IIIAA@@%@34_n17)A@@3(@z^ht8I-II?A@@BU@7Ҧ*.9IIICA@@40)ˁVq:III`A@@A0Zm0;III]A@@=hһ0*E<+A@@E{L!уt=III7A@@(v@:oA0>IIINA33@@zLs'(2ϓ?I-II:NA@@} Y@9b6W?@IIIAA@@uJZ?؜BηAIII7A@@Q07@Ԋ>B)A@@/_u8uCII-IIIBA@@q!MkHDIII:A@@14(9HtFSEII-IIIOA33@@GewYIFII:"A@@ Xk:͡ G1A33@@i^w}9H&Aff@@x" III:8A@@7@$ V5J+A@@@& `KIIIIA@@c1+3xLII-IIIAA@AWN6r@0*&YMIIIqA@A ηNIII9A@A@:(M@OIII:7A@Am"Q#4-P(A@A;vJs@1.zQIIILA@A1.X&졹`pRIII@A@A8ZRv"4VSIII6Aff@AMqunA)WگT#A@A_0[UAff@AyS9OcV@3V9VIIIKA@Acuz-5ڔtW0A@AA8 I@5\trXII-IIImA33@AMLh@+0xYIII3A@A[(K@:d֩a$ZIIIFA33@B;!q@D[II-III <0AT@Ap8!.W<,\II-III:5>IA@BKKݢ@Bih؊]:Aff@B!Űp#4D15^II-III:>A@B+{3s !s)_-A33@BYCPj @v`III::A@Bov`V6K.aII:5A@B}/?9bII-III3A@B yj'ړhc+A@BA@~S dIII:lAff@Bg=@*zX\5e#Aff@Bw *c]f"=kAy@BܟUԻ@cgI-IIhA@BDQR@8,rhIkAff@Bw&@c'_i)A@BN:Ssh~jII-IIIMA@CWz\@"C)<kIIIwA@CeWL@!^%<lII-III:`A@Ctv(r!m"A33@Cv>;";nIIIGA@CD3boIII:9A@C%^$Lo: g.p,A@C H|qIII9Aff@Cw&^prII-III(>Aff@D#3R&py@sII:DA@DsrK<@D(\t(A{33@Dn>@;tu9A@Dpyا9@/vII:WAff@DI@=w,Aff@Ddt@Bn/NtxI-II$=HK^Avff@D΋@;C_SyKA@D#]J6zIIIDA@D&&@ GG58{III:A@DyF:An |III@A33@D~~Z~JfIe}IIISA@D㻾v<|@<9;~III5A@Ey. mn[II-III:dA@EiAi4gMIIKA@DF|25C="A33@E@1).)A@E2N@<nM#A@EsGE8]IIIVA@Ei"(8Z/wHGIIa=hA~ff@EE!- .A@E>+II-IIICA@Evط*@U%A33@E:@Zڛ8II-IIICA@E]C-K9w}TIDAff@EЬI$II:RA@F1}:9@D&G%A@Fiމ(@/III#=Aq@F\ /]EgcIII@Aff@F>@*k"I-II9=nAy@F4: q@[]nXIIF=A33@GgM?+gII;A@GHFIj$A@GR[@JQIII7A@GA칠,)(A@GY?t(&pIIC=aAff@Gf=0ǴIII4A@Gq/6- xsAff@Gi)+sJ.pIII2Aff@G*27Ζ =&L0A{33@GoH' bAIII7Aff@GGo@#_҇waIII4A@Gɤ8&bgIII5A@Gȕ(9TMIIIY=9A@H"A+4=jIII:9A@H|e i!'w1i,_II-III:5Aff@Hi6z@DaKII-IIIX<AH@Hǡ@A9mBA@Hsi3~v9III/A@H7 @Bh1aZlA@I0ڣc=.Kx&A@I3l@0{IIIBA33@IY:bw"5IIlAff@IO*`)ʋvzII-III:GAff@I!"p"uehIII;A@I8C;|wII-IIICAff@Ip43@"Pi*A@I: as+!A@J}#y I-II:<A@JN@8jߪ#=ٳA@J&J%9K8III=A@JQjʇM3IIIGA@JK}, sZ)yIII:BA@Jru^gmblIII<A33@J5M$@ dI!A@KŨII-III:2A@K'#@RJ[m}4&A@K?] {KMIQA@KU;/&>IIIPA@L)@Rc8=tTA@K @7~)R(=xA33@Km;e]6ձ((A@L9:?0ܯI:0A33@L1{4III:VA33@L'N")&^XIII:JA@LRIIIBA@LTR/+d<$'IIIFA@LO2J@;"޿%SA@Lu^1$DIIIaA@LkN5?y1,A33@L8r1кydII:hA@L-V@3)=II-III?=A@M " @9;i]8A@L5π6D&$.A@Ma,K@5j9exI-II:">A33@LF>L6*cT4II-III:aA33@Me;)x,A33@M凅Y+Hs 5II-III9A@Nu31YI7III:`A@NpL1vۀ+A@O{!0Z[uKIII4A@OmT"pvTZ>III?A33@Ok&h@KII-III=A@O &9< NIIIAA@O@$SG_h=QA33@Oɧd eGB+A@O6cL?N.(=AA@Oܻ9#\ŗU1A33@Pc.b*II-III7A@Pͼ' aZUIII4A33@P:գ'MzIII2= A33@PS<@8Y_N%A@Pgl^bDIII:A@PlJ8@;MNII-III:;A@P^RAIII4A@P!Z! III!A@PhFk4p!T0A@P׈Τ*vùIII8A@QN@S >A@Q @Rs PA@P%,1)&DIIIsAff@P<:[Il'1A@Qs*~/DI:2=oAt@QM덽@%Ds|7/A@Q\3III@A@Q :l@=7OKA33@Rk}#@T8ڋ<I'=^iAs33@Q#j3IIIIX>خA@Q^!:2yL޸II-III5A33@Q_@ aIIIU>sA33@QBߏ@MPqIII:H=6zA33@QRE5OyBI=A@QT9iD_t0A@Q2k2G]E-III4A@R@(#lfxII-III >A@Qhh4mjII-III:N=tAs33@R7}@&lGIIICAff@R!y'!FeII:=>A@R'3"v}WIIIZ>eA@R5Ă3%n~́IIIV>8A@R\cLI?nu$0A@ReJF:@?III>O;A33@Rb $@o III?A@RZ <됄 IIIBA@RoW+@! |A@Rq3tM IIIJA@R>@ H! (A@R҅)$t@G=]A33@Sd+@Rl6"=xA{33@RǖI?"!IW(>FtA@Rؚ`|@qtjYA@RȺ^vɿ눆3LVA@RԸ[4p [tk:'III5A@R }@'^f1A@R6DX6==E=ATA|@SZW^@R`|g QDA@S84n]sZ5OIII8A33@S-A@Uh @PIۘ8"DAff@U܂,ףџ#YA@Uw2S]9I{$IIIO='A[33@VJ@Pl0.[%$Aff@V "$ԋ5U&gA@V. 61x'>A@W\i@SG|J(9Aff@WI<@HMD{h)II=7LAt@WTSW@Pیz**A@Wz1@hX{+9A33@XI2 @P@Do,/A@XdotKE@QM"R-"A@XV@Reţ.IIIgA@Y$di@Ql {ܥ/!=A|@Y/_h Y@Pc)0EA@Y>)i'G@QAtҕ1!A@Y @QQA2+2II-IIIF=GA@Z.Z.@QA73IIITA@ZK2*F@QtF4III8= A@Z܃@Qbw&‘5III;A@ZM@Oc_6II-III=ɅA33@ZXI@@iI7<A33@Z@A(8II-III:$=Avff@Zǥ!:@HOI%%y9II:$<.A\@[erm<@QA#:IIIeA@[n1|@Q"v{;II:TA@["%@KTodJiIII:fA33@\$@S˔ t?-A@[qs@KޓBI@III==Afff@\RlpCb@S^ʐAIII:}A@[V5@PslB,A@[WmQJ@B^5-CIIIyA@[EӲ@DXXDII-III:<Aff@[ڬpO@&3(cQE@Aff@\?bå@Dh:FIII"A33@\ E@Eڶ/GII-III:jA@\ T`3@:^QcH3Aff@\/E@Dlv%+III#A@\D+j@?C09?JI>/A33@\P!v>t@Cw K;A@\N @Q}>LIIIN># A@\Դ@OEl7MII-III:5A@\F1@ANAAff@\@E3ԁOIII:2Aff@\4e@"oPIII5=$Ap@]I@R4.QIII>glA33@] &9S@&R2A@]Mv|;@J 4 FSIII-=eAy@]9v.@R'nTIII_A@]m8kr@A^ieoU6A@]n Ti@1KVFA33@] Mc=@Q6^P,WIIIBA@]šTS@OFnXII-III:!A@]S#@A(9,Y9A@]y_@=ZX<\lZIII A|@]g@@ v@̖[II:6Aff@]),@N(\&A@]RX\D@;fThqFX]'A@]#ck@AxB; ^<A@]g@C}PVB_1A33@^#3@OdZ`II-III:9A@^$hs@OÃNaII-III?A@]*F@;ypb.A33@^|{M~@B tc8A33@^{SJ@AgGdII-III2A@^(t@FY^s9eIIIGA@^9Y@1fIII,A@^,",@?ag;A@^DC@Ggss}vhIIAA@^j$@ST>iII-III:TA@^q0@PtdjII-III:LAff@^*!$]k4Aff@^[O@FQMp=lIIISA33@^;Xk@Q.DPmIIIaAff@^vq@HnII-III9A33@^Z]^ 703_o9=a|A33@_#@S74)pIIIJAff@_º\@TqIIIkA@^zy@Hσ_krII-III:5A@^t @A\:3 sIII6A33@^u@A=نtII-III:+A~ff@^. @PuIIIN> OA@^>@D(-vIII#A33@^)b@AT w&A@^Pړ]@QQx>A@^HF@OߢIyIII:[A@^TI@M XfzIII(<ڹAnff@^U@0C1${III#A@_K,@R/!? |+Aff@^3{:@H0uvW}(A@^c@*3,t=~0A@_>w@P5(xIII>A@_A@=III5A@^mŴF@6jBj#A@_1X@> #,EIII[A@_8~@J?UA@_ %e[`IU6$III:*=-A@_h۔[y@LI['BoIII2A@_bTkg6@GqbIII0>m]Aff@_F'Ј@*EaUsJAff@_cz5@@E.III:8A@_;`@HoII(Aff@_g)@2lWA@_e8@0( *A@_F $@L6'>FsA@_\S@?l4A@_|[@CuLuIII7A@_b.@Ga z#I-II=A@_hx/@H"dIII6A@_u*5d@/' III`A33@_}Ws@/W uIII2A@_Q@3g+5Aff@_o@BkӿIII9A@_0@1@JH \IIIJA33@_[@ LT#A33@_x@AhNV,A@_VÈ@S(QA33@_ M@Pxs'III:A>9ZA@_䥔@C(G +A33@_͵_@F[Tp)A@_j2|@AbCb III9A@_1Oa@L(dF:XII<A33@`|@PVeVIIIjA@_γL,@>jII-III:&=JWAnff@_`@@=S%A33@_@.Uo=%A@_t?@2n$&A@_ X@C4=; A@_$$H@B$A@`eMY2@A\tI-II<A33@`V<"@I[{{III7A@`x1@A߼(A33@` 3q@BnO:III==A@`!6@E_VII"A@`/al@I!V'A@`$[k@?9,MiIII)A@`[g(@R3p=uIIIpA@`,B@FS,A@`4i@SmpuIIIaA@`8Y@E2`II-III:7A@`,s@/R|II-III2=,q A@`+ ?@-؜,A@`9@<(I4=aA33@`I 2@E$*"A@`G(L\@:9,&III&A@`=p]q?)0.A33@`I8N@@&5%A@`K:O@@$@III?=!A@`L95@0+_)jIII3A33@`WK@B+II-III5A33@`[Rj@DğzQIIIIA33@`dp@;ɩIII2A@`o~@By*wytIII:Aff@`|9@Cw+III"A@`wou@8̪II-III:;A@`q@@z G"DAff@`Ov@SӢ/2 A@`})(@=II-III!A@`@1AII-III$A33@a>D@T]+6rIII5A@`iZ&@CIN LII-III=A@`"Ĩz@OMMGC$A33@`W(7@?aVIII#A@`b@ClIII:AA@` p@#5m,A@`&O;A@`PV0@Kf%}I:@=\A@`eߙF@0E@- IGA@aX_eV@N$d,A@`fJ@J`III_A@aL@@SS(&A33@aBӄS@Sz~II-IIIVA@a b"}@G&JII-IIIBA@a e@E(OII-III1A@afw@BFZIII2Aff@a1o@N%III:A@a0p@$[5III:5A@aXܓ]@0202II*=LA@at@ h#A33@a,Ao@IX_IIIMA@a71`=@N/II2A@ac2@R$."II:TA33@a%A'K@ʵ ,A@a(Kf)@&Tx~III>%TA@a@TڱqE*Aff@a38ܱ@A j.3III7Aff@a$Z1G;%Aff@a&)=X#E]I-II:\=XDAs33@aD54@Hz,'A@aCL:m@H=  III7A@aFM!H@G+SIII =RAy@aDj A@EE6apIII4A33@aFo @@DgGA@a4>#ⳋ?A@a5BTF%-(  2A@axZ&k@R AB >eA@aCӞ>Q@/܀1II-III2A@aiK0ˡ@OwT5II-IIIRA33@a\ZZ~@RtȑXIII:`A33@aHXѶ0A@a@T xIIIOA@a% @Sؠ3III;A@aRs'@ x!III2A@apnQg@N6*sO&A@atN@N<IIIAA@adr@BOMIII7A@ao5Cͺ@Ik{II-III:lA@a]n(*i@+_[0A33@abjw@~II:=A33@ab§: Œ+III3A33@a©Mt@SįF III>e`BA@aoy p 6Aff@a~{H@@B I-II: <#A\@at U;(QK '=UϫA@aغ@>pm IIIaA@a֓&@I&WIIIkA33@aNli@N/EIII8A33@aމu@K|QII:@=!A@aTv@Mz0'A@aƠK@R l-=($A33@arx@R>II:j> qA33@ajBL@R$@UII:?A@a%@N<,/A@a+B}6fKAff@aX @(ֳ&III<A@a STV@Ef4 II-III:3A@a_6@I&tuv #II-III@A@a+@!MqӮ-III7A@aU @,VFIII> A@a姣@N3 sfSIII8A33@aD@1]aII-III3A@bf}@T=O[9II-III6A33@aY@M_O*&A@a-#:@B(O IIIcA@a/A@4^!II-IIIQ>Dg8A@a&"w@Pc "III;Aff@aɰBG@(B+]#1A@a$S@OGn0k$II-III:@A33@a,D@te%%A@a\M@L'S&*A@aٿwQ'III6A33@a?\d@@f33s(&A33@b@@SR)A33@aM:͒*%A33@bj!@Sa-b/+II-IIIGA33@a@Bk;,'Aff@a~-}lE-=A@bzb@R)n.II-III\A@aLy@=\b/II:>A@a*YAHz0DA33@ae@1\ϑ*1III2A@bS+@R~^42/A@a:fi@#RՊ3III$=qvA@aa˓4IIIAA@aT3p50A@aWP**not*62A@aEOLi9*:72Aff@a v@7߅8III*A@bYDA@P[' 99A@b ţ@JM: A@a㔕@J?;III7A@ahڦ@(b<)A@b0O@O7 =,A@aT@ 0>II9A@a{R SO?,A@aH@@/;l@1A@bm@%\A+A@b%O~kf@PhBIIIAff@b N.@)VYyJCII-III3A@bTU1@S8=R/DII4Aff@b (@! e EII-III4A@b١vGFIII(=OAt@bdvg@Sv.G!A33@b\^ a@S߬ H&Aff@be~ #I/A@bd4HJA@b/vp6@LI3}XKIII;A@b lv4LIII:4A@b@j_@P~t/MII\A33@b)G@6}$ºXNII:5A@b#!5@hOII-IIIgA@b\Xf@RQ{P,A33@b+N8\@5Z1Q,A@b( @)$Iw >RIIIPA@b6;z@GHVnSGA33@b0/<@=k|TIII2Aff@b1x@.ƬLU*A@b0o6#1@!QDQVIII;>SݘA@b+ nG"r+W7A33@bKJb@LF+X*A@b0ˌr6l)YkA33@b;m@t.'sZII,=mA@b=K7@!^*[III3A@b<1@aT"\III;A33@bA@bQ:Z@P!e0A33@bV$ @#42fIII>A@bynw@Pr]gII-III:4A@b}I@SPmhIIIFA@b?@QCiIII>:^5A33@buyx@M.ijIII?A@b|_@QLk/A33@bo9 K8@=HmXYlII:;A@bZLD@RLoymIII6A@bm;@s*nII-III:=Aff@bud@<ݠU")oIII=A@bm "'XpII-III:?A33@bJE.E@Q Fq,A@bz^@ GPrI0>-A@bzEc@aLsII:2Aff@b|xz;@Mt0A@bW}@O=qcft uIII?A@bmձ@L)vIIIEA@bRpQ@D,pkw$A@bD@SA@bdX%zA@b@$S@QA@bB@DE-A@b1"`D@<2 4,,A@bj@Hs{II<A@bQ8@K>III6A@bvx63@2ah2"A@bLȺ[#=^ۻ4A@bi65$W+A@b$G5w@3{,A@b+gy@N έ77III3A33@bt6@LOq&Aff@ḇ@PX WI,A33@by&Р6A@bťG@6hl_I-II:7A33@b}'@R,III:ZA@b٪w@P"II-III>RnA@bF.V&*A@bL?+@$=A~ff@bԎ]@4yIIIA>+A@cvfâ@QCzyWIIIrA@b1]!@Iv(<{[/III6A@b &3`F!z#)Aff@bNR@O@IIIBA33@cɋ@Ro1+VIIIEA@bw/:MII:<A@b*@KNK_II-III8A@bE:{@6III)A@cx{@QSdbII-III:UA33@b0P@9OG/II:2=DA@b_pl]@AEIIIK=ʌA@b@;T$gIII5A@b5tFTd@5e II:8Aff@cȏ@I)- IIIBA33@b2 @'AgII-III9A@b`96@C I-A@bI;K܄PIII:2A@b5 *~u4(A33@ciʍ@3UҐIII:2A@bX֪I?xsJIII,A~ff@cf@1A/;III=A@c2"@KW1A@c E@=[)A@c'@-@+8z0yII-IIIAA@c ^@2gwzIIIA@cI&pyA@c`[0 A0A@c {@ U II8A@cA@3IOP A@c!0@@FIIIRA@c)3_t=߇uIII2A@c=c}@QEf}FA-=6A@c#ss@7<,A@c94dd`@OvIIIMAff@cH#M@R9b; A@c#]p@,t2IIIAff@c5Cw@H趴+II-III:7A@c/M^@A[۸III:4>A@c-J[{ @3ĸ=CII-III6A33@c(f/cNS7A33@c-Lc1!91A@c'w08r0KA33@c;5%3d@GuIII4A@c/؛EǿHqzI-II:7=49XA~ff@cAjWj1@D0PjIII<A@cK|&@Md>III:7Aff@cV"&@P.yII-III:uA@cC@@5DII-IIIXA@cV @OQj0A@cII]B@C!tvI-II>RA@cD,@8܊9II2A@cUNc@HIII2A@cA]9bsoIII:CA33@cSaob`@EbL)/A@ciC@QRƃIIIwA@cT`.✱@>]Ԕ;-II-III8A@cLM%fNIII6A@c^<ü@D{"NOII:A@c_Ð@C5II-IIIBA@c[srZ@ !tWIIbA@c]wF@,Z@wII-III8A33@cu7@P(\Z*NIII:]Aff@c[Q+>Jz:A@cf&@@ III4A@cd!>} tbII7=WAy@cc.&vx'=aGAt@csc/b<@Ig"II-III:9A@cMRO@Q=h@EII-III:~A33@co@AP7 III:MA@c{\@M!IIIWA@cjv@(e759|Aff@cwY=@Jm_9III=A@clm/@,CfruRIIIBA@cmy)@֓III=A@cuC@@()w A@cpP@5@"e A@c{@HIII:A33@csb*-|@2h K"III3=9XA@ctM9@4CIII4Aff@cob2Z"υu0PIII$=ZQAnff@cv|@3TI:4A@c|@B╩III8A@cw`@.K9JIII4A@cUL@B遍III:FA@cDJP'N@PzFdII{A@czI0@)~4GII-III:!=@Ay@cJ@I)jII-IIIBA@cy^i˘IIIFA@c՗?@Hj;III2A@c!|@G %=TA@c4|t@I2bI-IILA@c bA@ch0yS@>ϗ7III2Aff@cq@$~KII-III:D=A@crF@Bԕ=4&III:7A@c l@#ZQ(A@cgDPA@cV@KNmII:EA@cɞK1@Oke$IIIWA33@clf@D ԭJIIJA@c>s@JR%ICA@cs@D3QII@A@cK75@STk9IIIQA@ckGs@>B$!.Aff@c @C\_-A@cYP;@ ,5 IIIA{33@cW_@AK III`A@cvv@2YCwi III>A@c_z@D:M II-III:^=Avff@c?X@?  (Aff@cËR@Q1 | (A@c֚4@@7I-II?A@cƠM;*A~tIp A@c;p@F-.A@c.t!Y wIII2A@c2@'AYIII3A@c-Ů@0FVIII<A@cѢuR@4II-IIIGA@cRPK^@>2II-IIIGA@ct$H@P>HIIIlA@c\6@TqII<A@cpW@Ek8 A@cF@PX=]IIIlA@c3#@FgNj)III_A@cn@G=II:6A@c=4@<Qr?III8Aff@cAp@>ѺIII7A@cꧼSI@EOK.GIIIHA@cM@B=fp-A@cZ:@D? III3A@c6D@(O;!III:A@c @A/(".A@cN(%7#III9A@cַO;Ƭr$III2<:AK33@dG([4@P'b{ %IIIcA@cfjW@/Y~&II-III:>A@c^$8@25'IIICA@c-4{Q?]W(III6A@d@Lqxi)0A@c0_b@Yx*II:DA@dX!H@DE+III2A@dH\f]@CJ>D,IGA@c<J!8#m-III-=%Aq@d5OY@Su.IIIzA@d26g@EBC0a/1A@dE@Lo0,A@d`2@BQf9w1II-IIIR>VA@d.g$@GQSL2IIMAff@dJ"#u%j3III<A@d(m܆6@MN4II-III2A@d%38@G@}@5II-IIIXA@d>?fϽ96II-III:7A@dRDD޿(7)A@d2x?e{68*A@d&i8@AUD9II-IIIS>"xA@d%X6@@/j:Y:.A@d1q^m@MӞhj;#A@d$D+Q g3A@d1=s@E;\D?-Aff@d%:Y3zϰL@*A@d3@2MglAff@d<`@;qFIIIS>M5A@d;c@.pGp8GIII]A@dA2ޕ@< iW?HII-III<Aff@dCc @?x YP{III-III&A@d?sCr zJIII A33@dG?PJ@A|.>KIII5A@dG=I6R@6%F Aff@dGA *@ō pNIII=A@dI*mH@*LJOIII0A@dE@3/1%ݡHpPIII(A33@dIï@"ܔH&QIII5Aff@dRV 2@Et.R&Aff@dKrF@ AhSKA@dN[L@073;T(A@dPN@1kߐxUII-III:5A@d\@E17v@VIII:LAff@dU/_"EtVWIIIXAff@db^s@KƄkX%A@dXZl@!Dc/YII:=A@d[l4@4&5ZIII<A@d\!jy@"Co[III8A@dakg<@(oaq\II.A@dhI_L@CCg`II-IIIaA@df-@"AoZaII-IIIQA@dl"A@BA 1b.A@dxxG@R |cIIIl=A33@d<%@Q|MdIIIZAff@dnp@$wɼeII-IIIAA@do+y@0٩fI-II:7=}VA@dq.X@-UjS&gII-III5Aff@dqL@"Np{]h+A@dt=@'%N0i!Aff@du&Rq%Ua;-j"A@d|r@%HikII-IIIMA@d̥@Ld`lIIIJ> :A@dV@H쨞!`mIII4A33@diFͫڻnII-III:VA@dH@DAc@oII:EA33@d$@!CpIII;A@d{$e@#;4=EqIII9A@dE.Pc@@}vv_rIII=A@dI?I{NFsIII$=vAp@d ƴ@@J3=t1Aff@d8Y@(vjuII-III:ZA@dVp<@%k"vII-III:#=Avff@dF @I,wIIIGA@dvٳ^@Ma.xA@dey@0%ȣyIII"A{33@d 6/NzI>bNA@db-@'z{III8A@d6ѿc,|IIINA@dtl@,e}III"=hsA@dB! @Rl*~ A@d@A34$A@d2%{c@)MrIII;A@d\9?HʴIII:TA@dW@H@kbIII3Aff@ds&@A1II-III:+A@dǬC @Gz"IIIMAff@d<6@+BXII-III5A@d2k@6:3"A@d.:M@)^[IIIAA@d]X;42Yf8A33@dˢL6YbAff@d@K@OIII>A@dϪ~5{XHA@d@5II-III:DA@drH8pO AA@d@vP@Q/) III:A@dB7@HpȍwII-III:5Aff@d7s@/B;:II-III:4Aff@dFd@EIII:I=nc A@d(@ qzMiIIIh>%TA@dŪ@;*Z+A@d?_n@X!-'A@d~9媤@DII-III:4Aff@d2FJ@E"RIIVA@dt@@"I-IIOAff@dj^fP@yFA@dgJs@5ϓI =oA{33@dCM~@AL3v_IIIg>KAff@dF7@7C%&'A@d `@O{EK;III4Aff@dW3wJ%NA@d}s@?MX/IIIiA@dY%N@(rQ|II-III=A@d>@I%·r0Aff@d_Ap@<CYII4< lAd@e@R=ՠXII-III:k=.A@dJ1@Ch8III7=.Ay@dݑ =P@59]IIIPA@d? [!$A@d){ҫ@Dl#+t<II:W=xA@dTf?^ygII-III:_A@e}[#D@Ms/A@e=$e@E8YnIII7A@eוt*@>)oII-III5A@dCU 䃁#III:8A@eߺ@J^ gIII>Aff@e R.@B=, A@ege*@>`żIIIUA@e1j@4kIII>A@ej9 >J4WIII5A@e&L@*II-IIIg>,A@e @Ghpt II-III<A@eS@D%ikcII-III:KA@e J$`@1%@~II-III6Aff@e P!@CII:?A33@e RO{3lBII4A@e@Ph`OIIIHA@e(H@q}<ӽIIIYA@e=@)8III4A@eq@0¹)III2Aff@eG$8(i,IIIYA@e);ru@L x,A@e#I<@=B/III3=?[Ah@e'BPV{m϶III=A@e;ӪP@_ bFIIIiA@e-HUIII9=VbA@e,S990~>A33@e69h-@IڔدII-III/=3A@e3fʤ@0r*IIIJA@e7]LK@BMy̰IIIDAff@e>u3@OVc5II:HA@eCP@Gg"WIIKA@eF @Fe!z+A@eGB΄@B6wII>>SAff@eJE@J/.!III+=ӎAvff@eGM2 @@a+A@eL&.@HOBa-zII-IIIp=`BA@eK67@A)wlII-III2=\)A\@eP}{zu@G:vII-IIIHAff@eM"y@6SgVIII9A@eRJfb@H=CDII:-A@ePZj@1q3-IIF>+VA33@eNakwa2>_@<A@eS~Y@5dmfIIIX>*JAff@eWo SX@3"II:z=fA@eVQ?]k1A@e[w@EkIII8Aff@eWg\`?yvK)III?=A@e_֭Q@N.}/A@e\FS@EBIIIfA@eZ%9@;5s/ϙII2A@eYd@0sR0~II-III:A@e]6 @21)=RIII7Aff@ea{@FNgp-A@e_є@@%`L#)A@e^b@5lt<II-III:>]/A@e`:Å @46mwIII:HA@e]4A3JK"A@ek/L@Q1II-III:MA@eg\2+6@D'ƵDII-IIIGA@eeDy@1} oIII9A@ec{`!>xII-III=A@eiɠMu@E>xa.Aff@evJ~@Qʉ{^III:=IA@e|Ԃy@Rb(_dIIIMA@ekL>0N|8II-III;A@ep$)@A45III*= ںAp@epZ~@9ldASIIIAA@eqmz@g%NII-IIIdA@ervu@wIII:ZA@e|`f<@H)S"II-III:;A@ew@%?Y8III`Aff@eveˉ#ypuIII2A@ey^p@1$0b@III:c>A@e֩y@D!uOIII;Aff@e&St7@BI%A@e ,@:۠ %={JAvff@ewDK@7ۚyII9A@eZ,@A3tIII6A@eOH@KbIII(=qAvff@e}ߠN#/C>IIIA@e u@7||}IIfA@e h+d2gIIIDA@e@3II-III:A@eC@BVN" yIII-=v"A{33@e}/@@=BIII6A@e9u@)ЪK*I>Aff@e߼@4ydXIII>Aff@e(@PW1 A@e\F@AVKWII?A@e;r*@@sII:=A@ed@C;III5A@eX]@N`8BIII6>sA@e@A8*G III>A@ed6h-T0II-IIIBA@e<.@6[HIII<A@eeg@PWCۀ'A@e:A,@tD˅IIIA@e7q@N`'"3 )A@e po@@˜n|t0 IIIIA@e6D@L] III==YAvff@e!N@AwR IIIh>mw2A@ex@CU< 4 III@Aff@eD:@Kt(A@e&hd YII-III:=A@e8JA$A@e'9/@SQd*%A@e*i @FgRYf-CII-III:?A@ee@@II-III:h>fA@eѩ3䐍|8R>A@eyO@Ræ]$A@eF@P JII:UA@e!\@Be.}III>A@e Q@AII-IIIP>Z6A@e 40@Ac YB3$A@eo@GMW6j"A@ec@- ,XIIGAff@eӐXcFII-III%=EA{33@eF@'_IIIPA@e2=@C)bZII-IIINAff@eB}8 ;:A33@eL`C@IJ::V III5A@e9^1@1շT!III@A@e} @H%L-""III,= qA^ff@e".@Q##A@ew @B1%$/A@e #+ H%I-II:RA@e|hO@Kzs:m&II8=ggAp@eL\@D b'IIIhAff@elZ=wIJ((A@e>(@H aM)-Aff@eT-s@O*-=eA@eB? F+III2A@e(o@L,III:A@elV?`@qF-II-III?A@e+@D,/4.IIIPAff@e,ij+`@:ƒs/II:6A@eh @B~6=<0III5A@eԶ\@QTs1I-II;A@e&#@HaD2&Aff@eF)[@O{Livn3II-III]A@eZO"v4.A@eR No@Hf51A33@eBsC=c 6'=cSA{33@e#G @Qaga7II-III3A@eq==B@@4!"8III.A@e Y}A@$O49III2=*0A@e+T@2=LF:'A33@eaɍ@RD;/A33@e 1@FoM<<-A@e[͟@$b_*x=III8A@eq_u@$%>>III5=JA@e@NSB\A? >A@e4%taLr@II-III:3A@es#ι@%`4AIII:G=AA@eaQW@*0vBII-III;=ƧAff@e 98q'CAA@e)G(%DIIIcA@eɀ2@KA(EII-IIIBA33@erA"@8LMF%A@eB@MEF{GI-II`Aff@ehH5u;H@Aff@eˋs@9 zlIII-III3A@eok@$OůJIII9=A A@ebfU@D KIII>A@e<@$ʫLII-III:M=MA@e5#@N#9M0A33@e42@ qpNII:8A@e0M7U@NO>6FA@e8@& G%PIIIB>/A@e@G-u QI-II9A33@e@SR,A@e:@EޛS)A@eGST,=TIIIJ="A@fKA@>~ UIII3=C-A{33@fd@P)VII-IIIAff@f ȩ@3>"WII-III:u< AX@f=0S@IDQXII-IIINA33@f@E-Y.A@f <%rG@HeR_uZII-III3A@f p^@/d[III7A@f ;@' hP\I-II:F=A@f ";S'1]III^>A@fV@HޖZ)q^III6A33@fj: }*'2N_0A@fIPQ>8`III2A@f:y@Kޓ>FaIII;=RAp@fXܙ@7jklhbIII>A@f<@jHc%A@f`@9g͍zdIIILA@f$Mǩ@R7SeII-III\A@f"eY@QPfII:9=קA~ff@f!9t;@KOKgIII6=v"A{33@f=D@61Z=hIII5A@f U<@'_RiIII4=0UA@f"}pJ,-̲jI-II:BA@f&$P@IϠ|mAkIIIOA@f'c@6c;g_lIII:Aff@f*' `ٱmIII(A@f, k@(FPPnII-IIIA@f. @(ɄoIZA@f4TAnp.> MA@f6$E@GsKq1Aff@f8낗@E1ԑrII-III:NAff@f6Yn m_s,A@f9 3)@Kmy1At+>A@f9@@cνu-A@f7]UvIII2Aff@f9G$wIIIR=A@f;tw@Kyjm$x&=UA@f@@B0yIII>(UA@fDM@N6J׽`z"A@fBJo<#@$LII8A@fN.G$@.&9 II-IIIHA33@fPT|@H1III6A@fOO}@BcwK&A@fZ[^ÌIII:EA@f^ 9\@R^1u(+^IIIV=A~ff@f[#g_@7_)&oI>A@f[iG@0IӢcIII:5A@f^q.v@Lť6IIIBA@f^K@% III4A@f`@AMr:III:2A@f_7[2R0A33@fb\ II-IIIIA@fd@;np@:ZYIII9A@fhd @P0,IIIAA@fiH\ l0Aff@fk w@@K}II-III:?A@flk@'<vTIII4A@fq\lb@:cjIII?A@fr<$)x}^III2A@frԩ@>{@wII-III:DA@fr"@#S"III2Aff@fxv@A].&'A@f{ȼ(^h@H`III`>WPA@f{2@>+qqII:AA@f}t@Q6+A@f}T~@9$y#III?A@f "A@fS{@%`gȰIII*A@fvnf@L >k2IIIE=MAvff@fU@ m\I-II:> A@fPzE@=5!?III:A@fe@I:=A@fJRB7`91A@fb>V@A, II-III8A@f$[@.hIIIMA@fV@7<ӜIII?Aff@fJ=@>"3IIIjA@f~ijIIIQA@f)@MeGjII-IIIU=҈A@f|@7W$0,IIIIA33@fZPHUII-III:FA@fvxB@ȉII[A@fl@f7IIIKA@f'D@J5#z*A@fOvp?2s0Aff@flWq@ * III<A@fT9Sn@JOmIII8A@f.s@EB6 II-III:(A@fbk@.( JXIII:A@fSLO@IIIEA@fԌugT@:\III:A@fGu2@@wdzIII;Aff@f*@6&TII:A@f.$_@R&e0A33@f%Ib@I {I:2=A@f@Ѡr^WcIIITA@fg@Q)K$qIII]A33@fb4@JMt2C!Aff@f&yQ@>w II:XAff@f;@>{ԌIII=Aff@f{:@-$|IIIF=.A@f-Z@8gosIII8Aff@f$Ӑ@>Ɖ*MIIIMA@fY@PIIGA@fIu@>"PIII^Aff@fКk-0++KS%A@f5/@>ʃIIIXA@fF@@/eBIIIMA@f׼oP`3oIII:"A@fnq@Am*A@ff^@RII::A33@fۺ |ge#A@fި(@>k+A@fީC@=pj"I-IIaAff@fh'r~IIIaAff@fE<@;}m4II:cAff@fZ @29k?qIII2A@f U@(A@f0ZO @A!@III3A@f !@'EIII@A@f@7M%0III:7A@foI@==^AIII{>TaA@f-KE@M2W&III:=A@f cD@:e殣II-III:e>*Aff@fm`@?F|?wII:LA@f>@-ħO[III:A@f@Rs,Ay@f 3C@On\,III9A@f`B t+JIII4A@fiV@3pVcv)A@fN?M@;'+I-IIb><A@fL~%@2XH/I-II:7A@frS @?ůsII-IIIDA@f^0@Mrg=x)A33@g S@FtIIIFAff@g#E@R4q:x&A@gtGi@4P2OIII>LIA@g@;2IIIQA@g@cbII-III2A@g\3* &II-III:#A@grx{@Oި,A@gG@:) BIIIJA@gs\*4-Aff@g1+cngIIIAAff@g@H9BIII=Aff@g*)@p$A@g-UR@[-II-IIIg> /A@g0MII-III>A@g1Ϙ 6@+z 9iIII>A@g6&@(r"Դ"A@g7ȿ@MtTIIIKAff@g:!{@Ne]S+A@g6P@OwxIIAff@g@o@LkVIIIDAff@gC[vc@4+TII-III:=Aff@gD| & ?^RIIIw>mw2A@g@t @N@A@gK)$j-/RIII2A@gFtyX@SGaII-III:>A33@gT,X9ӥ_o5A@gR3P{@LqhMII-III:2A@gRҧ@OGAl tIII`A@gY9xxE:@侜uIII:VAff@g[hd@!!V.I-II:=}A@g\@HW"=II-IIIIA@g^KWYj@>_f(A@g],֘@O6rKII:>A@ga5@Gs`3 II:5Aff@g_@P&܉h IIIVA@gdZ`6<@:5v IIIBA@gh[C"@3lu I-II>$fA@ggM@ JAff@gmFʌF@BTIII2A@gn 2@'{0IIK=jA@gv,@%%IIId>)*0Aff@gx+l=}@/$fbII-III:>A@g;*+QhIII:A@gZ %6Q_A@g6:(@Ok&rIIIYA@g28+&III$A@gz@PII2=fA@gݝ!=@.YV3{A@g-K$@QV>HA33@g E@DWII-III:M>B\A33@g!^Y@KhXTIII2A@g1G?uǠ&III:!A@gg8,@D/%IIIUA@g%[uF@P-{III[A33@g @:m;X #A@g 9@J?c III8Aff@g~@b@0o/yz!(=.A@g5 @37"II-III:NAff@gaZ+@TK\*#III>VA@g5h-b/v$II-III?Aff@g:-/%+Aff@g( %j&III0Aff@g1&L7\@:1o|'/Aff@gvwzv@O`y(IA@g1їDV6)IIIIAff@gžד@E3z*,A@gu&@Pu,+(A@gG3v@S{5:,II-IIIQA@g Y@-III2A@gcAC@J ͡J.IIIPAff@g!D/V/I-II:HAff@gƜ[& 2HS*0II:3A33@gʎ(0}ip1II-IIIA33@g@#⍾2"A@gJ,O*@;"#C3'A@g̠Ό)Ϲ@Hc)7IIIyA@gduL@= >81A@gB;d2@@"g}9 A@gE,@;~$I:II-III:9Aff@g5Y0lי;II:GA@g A@@3&3<0Aff@gm@Ru =I6A@gӛ7@=j>.A@gs+@y=?#A@g2O1F{w@%A@g==2@!+u AIIFA@gۧr@;K;9BI:;Aff@g['/)6CIII>A@gߙ|k|*7b"h$D?A@gSMQ4qEIII7A@g< ' =FIII3A@g=X@S &(ӼGIIIRA@gG;2@@_@H0A@g\3C@:mS VFIII-III:8=zAff@g' @>nJII-IIIAA@gIR5@26sKII-IIIAAff@gbrL!A@g8:@A­CMII-III:MA@g$3@QkU4:NIII3A@g7@HpN2OII-III::A@gLg@K&L1PII-III'=1A@gQ @MԖQIIIA@h$f@%GwRIII2A@h 㛏 @-A@h {@G+|7XWIIIAA@hEW@!J< XIII<Aff@hraY4gYY-A@h#07k@?SorZ-Aff@hOk7@*,[%A@h?Xq@\II-III9A33@h)5@m,(]III:5A@hy@?&o^II-III6=KA@h& =.Lx_I"=PAvff@h(2dKD@<1e`II-III:P>HA@h/X:cFmUaKA@h/Ci@?bIII:BA@h2jU!cIII5A@h+E@Og dIIIgAff@h/<%@IgeIII<A@h5c)(@2fIII!A@h8 +@$S=].vg1A@h3Ȯ@OHL@hIII=Aff@h>K%@JںA@hIH&1Z'lIID=7A{33@hJ 3-mII:@Aff@h>Od@Oxd/nA33@hK3 @4nn`oII5Aff@hX$m:3 kpDA33@hTb@# xAq#A@hV)/Tܿ _1RrI-IIr=VA@h[Ir(ٵsI-IIF=A@h]ըJt*htIII@A33@h\d_@&̤mmuII-IIICA@h[3?@>`vIA33@hR*0@PXWgPJwII-III:oA@h^\g@;.6IfxIIj< AX@h_ K% @3yII-III7A@hio,$ a |$\M"zII-III2A@hlX- b@ s}:{,A@hip@I*dU|IIIFAff@hnfA@=ѲDn}III:a>+CA@ht& =@ 2Wp1~II;A@hv3)M%1}GII:8A@h}T#87a4pAff@hy@:IIIA@hvCV8G@IIII6Aff@hz6ng@?Э/III:b>(UA@h~5bj@3ClII6A@h쉆n@3DCII-III#Aff@h@4UxIII:A@h6;II-III:GA33@h -H:@@f'II:5A@hӧ@I\'%A33@h|BY@PZII-III=bA@h@AFI"uII-III2>:^II-IIIp>;A@h]@OLIIINA33@h3@?̰IIIs>-DA@hc@CZK/A@hO@Qj%II-III:OA@h%Q7@GF\IIKA@hpNP@QqI;III@A@h@$ՎY[]III:DA@h@A` !૤,>I^A@hӗ0 @5 J?II<A@hE@M3Myy%!A@hVE|1A@h<<ضT0II-III:>9XA@hٖ@3bpnQII-III8A@hTM@CIiII@=ݘAvff@h#rD \&A@h@8]@H>?d*A@h,KE@A-*wcIII2A@hO@NՈ2III?Aff@hzW@HƠld1A@h8[,I@G =م<IIIT>;J#A@hisAӊAuII:8A@h;{_d6 ,HɋJIIIEA33@hZ 2@<III::A@hE @NG*A@h|s@F@III2Aff@h=\@I^IIzA@hZR5"@P%*TIIAff@haM8IIIJAff@hc;Q5vu )kw+A33@hF]@Eь.A@h3@%j5-A@hHb<@A"=ΣIII3A@hKlg@M T*1II-III4A@iEO@@9,@III?A@i$>W@BހII-III:8A@i?@@TIII7Aff@iܺ@DY#)WIIIBA@h %@PcWeIII^Aff@i =(@B10A@iT,@II-III.A@i7@3c+III$Aff@hPpg@QB>IIIVA@i6D!@BN֮nIII/A@i/ud@7td^PII-III::A@i m0&'O}@A S'A@i9.T@JO0III;A@iNNI@2hr %III8A33@iLNLws@BlJkII:7=qA@iWsII-III:(= A~ff@iZonQϿ0A@iW/;@?g$ .A@i]@_4JIII=Aff@i`g ^'PS(II-III3A@i]z>@/aW]2III:CA@iSs@Oȥ)A@ildu7EBC2A@idG YU@IAOKIII>\)A@io:;@4>AIII>,1A@ip̹d*@45x FIII>/4A@if04@LeސIIIrAff@i|fK4@7LHIII4A@iz2TF@D{III>?|A@iuj%@M?*A@isz@$ۑ JIIhAff@iJOe @@;.pIII6A@i @N@M!^IIA=A{33@igѝD+IEȻ?-A@i^o@;nέ5III6A@iiF@DJ6III5A@i[0:DÐ>DAff@ioNaK&+}3II-III3A@i% Rx@1`IIIB>5"Ay@iS h@D٦IIIQ>-(A@ii<+@:]bI\=rA{33@iӸ~@M (A@iҤSU@QHI-IIIA@i@&D[hIII+A@iu@G\*A@i4@bIIIGA@ix@=w0III)=Avff@iNjZ٥@+f8CII-IIIHA@iWA@K̬III/=vAff@i!E @v7IIJAff@in>@C&OI-IIZ>ZA@iR@F}P1III<A@i%{>`@Bfn 3III:Aff@iɉiI3 @J!IIIGA@i8S@C@J ,Aff@i;,zc@KVN=III:IA@i5>9r,7CA@i߳D=@>խHxVII-III6Aff@io@@$wR=III6= A33@imH:T7sMA@iR@:]Is=|PHA@i'6Pwb+IIIGA@j4(Y9`O bwA@j%W@Fv'XII-III:4A@j-~I@:[J III6A@j/Gq@41>to!III1=}!A{33@j.@>̆H"IIIfA@j1+>{@5 (7#II:D=pA@j3 8@2cn$II-III:;A@j1ةP-@C%1ڼ%III:Aff@j.'›@G)?&III8A@j9[Uq@;DN'IIIC=OAvff@j:cO @=N(III6A@jAAȈ@ S)IIIHA@j5q\@H=콗*III4A@jHEVg@Cޤ+0A@jMhvO'7>,II:)=OA{33@jN,F&P-I-II2=uA{33@jB:n'5@D|}.II-IIIA@jT\ۮd/I?A33@jL?$l@>lzM0#=eA@jO\eէ@7O41III7A@jQs Zw@1Zm|2IIIOA@jT(M@,I>dž3(Aff@jUAR@%gOx4#A@jZZB1"69o.5'A@j] ^9_Hw66qA@jUͲ^,@6sP7IIIBA@j0|\T@Rak8III:2A@j\5US@.ڨZ9III A@j^)@"AFM:II:9A@j:9@R;II-III}A@j`%U@/sbII-IIIDA@jhXx|@G,?II:7A@jp5K@90@IIILA@jtE(8$_AOA@j>dNH1B,A@jiC8@N )_QC-=WAff@j|n%M@+/pDII:AA@j{B@;EII-III::A@jR3@/-ھFII-III3A@j|{=Y@;CP8:GIIIbA@jr:@\AHIIMA@joEgO@MTI(Aff@jUc@iJIII6A@j@?%CKII3A@j@;5?EsLIII6A@j'@=r7֗MIII:'A@jV@dB:=NIII&A@j?@+g[^O A@jaE@NHpvHP'>kQA@jk/@<:UQII)=Aff@j ^an@=mBRII-IIIEA33@j @,X/zSIII:2A@j,"*^TIII5A@jwf@MDUIIG=($Aff@j@=7d GZVIII8> JA@j`_D@O̚7WII-III8Aff@jv?@6faF?XIIIC>A@jz@f=tYIII:A@jR)/HZIIIA@jt7?[)v[.A@j+9h@N> \-=#Aff@j:S&@Ecy]II-III?A@j3 6@;"ak^IIIIA@jøL-X@1l22aIIIp>>vAff@j̒b@ _I.bI-II:%=ixAx@j:l@< C cIIILA@je-ʷ@SJ=_dIIIOA@jƠ@]F@R\eIIIEA@j[_@ES!*fIII<A@jFp@QYpgIIIkA@jb"i@B佛Ih-A@j !iA@jN@9'EjIII:6A@j 8@1S;kIII!=[A@j@=@B4lIIIHA@j%@D)7vmIII:.A@j-{b'@BtnII:kA@j#>@;[E=xsoII-III5A@j s@HG1{WpII-III:S=Ay@j[h[+@0yE0cqIII^A@jQOV@1l}xj2rIII.A@jfB}@HhgsIII5A@jS@:lj\mtII:;A@kx@8k'"#uIIIOAff@k,@95$ԯRvII-III:0Aff@kww!u@Cz]3#wII-IIIP>C&A@k T@:gxIII:AA@k,bX@0@yIII5=ZQA@keOc@B zII:i>/OA@k)\)@@n{III7A@k"-jt P=g|II-III:2Aff@k &J=^@4s}III^A@k E[@OKɹq~I-II>`A@k-V@#oak#A@kA@Kh>gII-III:g>$A@k*3&@7.II?> qA@k0@4Q +III8A@k0+Vx@3HIII5A@k`[Aff@kEd@?jII<>sA@k?.OĄ@F!坸III>A@kA.6@Ged-A@k(rh@Q5R II-III:]Aff@kJ|Z @=rELII>`ĜA33@k_= )A@kS'@M!IIIc> MA@knDYֿsIII:5A@ki@8rm]II-III;=֡A@k[U3@K)8III>MA@kl`7@>/'3III8A@kt9?@ X(8III>e`BA@km6Wh@>;ܮIIIVA@knȅC:@>j^}IIILA@k8D6Gy_3A@kn|&@DĪIIIEA@kp^gF@CժOII-III:2A@kmJbg@HLda0A@k9 @2"IIIDA@k @*#!vII:EA@j_%@TҹHbII<A@k 6@<IIIk>}A@k"aD@*+uIIII,A@kg@9XA@k&(^x%/Aff@kRޟn@?GIIIkA@kn2@?4III>vȴAff@k{y@>Ȥ)IIIX>iAff@koWp@1u ~IIIEA33@k Ӄ@3VL II-III5>@7A@k(@?0or III:>mhAff@kVyn@KB>#A@kN!J@?yz.kIII`A@k3]ˉ! ,A33@kÐN@B:wQ+A@k4U@Mq܄6IIIhA@k@#IIIEAff@kl& @?ۦ/F0IIIDAff@kc,@O?W!III3A@k||yT@*/rIIIOA@k@-dU*A@k§9y@7HR&=A@k4@;qGIII~A@kImQ@R)>III8A@kl"@QJ NIII:9A@kJ@4&mIII5=iDA33@k)rV8|WrbA@k <@-0X kII:3Aff@ki@?G0`aII-IIIl>,A@k_MM@6k3FII-III2=A@k=簫8^?&A@kٵH@>n[$I-II:1A@kዂv@0ҥ҅III:3=44Avff@k|)@;"gpII]=A@kB6^@, III4A@k>@5&IIIC=A33@k a@@.u[+A@k L@4ǰx)=hA@k&X@II-III:9A@k M@<i III>A@kQ=@2=(I:<=pAvff@kyq@F8<>*Aff@k~[H?III5A@lDYVgIIIFA@k淁@MMd8A33@l ;H+7wA33@k 1@4cq$>A@lbY1?Z|V,A@kSd@K(9&ZII-IIID=ZA{33@k!@K;yyÿIII9A@lK;@6II:9=A@kAƪ/@QGEII-IIIDA@l}xoG@3sy% II-III:2>^iA@l{_@83P"=oA@lӧ7@;_oBIIIi>A@lX@3##6 II-III:=c A@lM@C-" IIIDA33@l 6$}@7"PII]>9XA@l" yի@5^|'I-II:B>A@k=?q@TI2cեII-IIINA@lLr@HM^( III2A@l.@09WJIII5>A@l6VO@N@6k\ II:[A@l{ @"!^/=lA@lA@l(OHV@=III(=YA@l80@+EU III:G=IRA{33@lʚl=@@ E3RNIIIEA@l?);@!GbݕII:?= Aq@l<)"@HQ{ %=]dA@lծk@;aܜIIIm=*Ay@lߑGh?𤾵KIIIeA@ls@>jlIII:=A{33@lt@QIIIVA@l߹@=YII-III:a=hA@lEi@AkIII:4A@l?-@BeAIII7A@l@25wRII-III:)A@lPRXn@@@DxЀ *Aff@mBƉ%RW4U!;A@ms@ j",A@m @>?,#III<=A33@m&`@AP$III9>Aff@m-@u&%III4A@l@R ;&IIIVA@lP@Qx'II-IIIMA@mcq@CnI(III3A@m%RN@<l_)IIF=*A|@m 42@NCZ*)A@m2gN%@$wt+III8A@m*jT@?&CSI,II-III7=A{33@m2Kk@BS̴-IIIZA@mDUH?yUY.IIIGA@m6^"@DBC{N/&Aff@m;k"v@B; 0IIIA@m;Z6y@Cߒ1$Aff@m@@Q`:-2III:@A@m<̍U@EǬ3III5Aff@mB&@BcAs4III>A@mPKD@(Z$5#A@m#vRu%@Qb.-6IIIEA@m_*Im\,7.A@m`cg Z8IIIYA33@mG"0@R=&A\9III:8A@mWLZ@@mms:III:EA@m^cuW:@5ŻEk;I3=,q A{33@m`X1Z@1=,A33@m] @>X>I-II6=K^A@m]z| @A3$.<?II-III>j~Aff@m_%Pj@B%DI @/Aff@ml'vQ@-GA/A@mcHEp0@EWB%Aff@m>"?@Qc1`CII-IIITAff@mq@EiI[Y.DII-III:Aff@mrD@EEIII2Aff@mtSgU@Dm~F)A@mt-'@#nG$A@mmC@A?%-qsNHIII8Aff@mXǰ@QrfIII-IIIhA33@m!@BI`XDJII-III:DA@mZE WV0K.A@m!@BVgLI2=oAy@mgq+Y@P'rMII-III>|jA@mLT@9ClNIII'A@mMإ@SXnO"A33@mJ&wj,PI-II'A@m_\@4 6QII-III4Aff@m@BH1&juRIII4Aff@m(u^@BHRWSII:EA@m{S @QycvT&A33@mB6@B$/۠UIII2Aff@m9P8@Qu}VIIIXA@m@IHP/W(A@mKhj@IU:YXIIINA@mkf`@OߛY(A@mi@@ Z(A@mp?x@PXP2[II:FA33@my@HT o U\A@m=@Xm@A[A^]IIJA@m&:!@;9$:^IIY=~A@muT@Qa/`fII-IIIOA@n)D@1GgIIIW=+A\@n*1X@0rhIII<=0A\@n6 @,*!;qi!A33@n* ?@PF-mjII-IIIFA@n:pdk@93pkIII3A@n0 ,@RL~lf"QlIIIdA@n;Ȩb@G`mIII:LA@nA0eP@ECur\n-> #:Aff@n\z$z@08o"A~ff@n[@=MspIII4A33@n+jl_@QJqII-IIITA@nc<@=.PfrII-III%=oA[33@n| ж~sw>- A@nS[ 7`@N3pt$A@nqKQ#P@: u">A33@nabb@KUV7vIII3A@nr,xt@C6kc#w+A@nh'@K)'$xIIIBA@np]>v@HyIII-A~ff@n3π@7-"zIII:&A~ff@nS65@Q {III>A33@n3@E2s|II-IIIE>_A@nn@!ˌ}3A@nIN>"@N1k~II:;A@n @=@ rII==K^A@nkK@Q;e;iII-III:A@n$@9mֿ,=}A@nI \@8Gt#II3= A@n%@E5!\LIII4> CA@n;t @G!i#III<A@nT@S_YOuIII:3A@nϩ@,;+A33@n99̚@E[q hII8> ƨA@nb%@I-II:=aGA~ff@nsM@Q A֞ III3A33@ncZd@:HA@ntd0@@X;;]*A@n9'@RJIIIFA@n%@EmIII3A@nS%@9߀/A@nt]@EV fxII-III:>>?HA@n9t@5A{ԒIII5A@nQ٢@L45{+A33@nj.@HDvلvIIILA33@n۔@DVII-III.>eA33@nd]@DtAzIIII<7A^ff@nzy@ErQi@III:U=n/A@n @CSIX<7A^ff@nL[s@<,\bg0A@n͡y@KdnI-II:_A@nM @Hi/8B)A@nԙ@RVNp IIISA@ou@Pi3RII>A@o5@)Ue III1A@n솊`@E*ӨIII7A@nݾ&@P[$TZII:KA@n쩕@MA-wCI-II:AA@n)s@Rd5f(A33@o^r@R n2>A@od-9@Dw19II-III:6> A33@o ^@HŸII-III:2A33@o$d @DB+%IIIK>#fA@o.,@B\}ې&A@o0E$6@Hl5OII-IIIDA@oC^Qb@PꓱYCIIINA33@oEz@;狊NIIIIA@o2Vp@P޲bII:>/A@oB@GX{lsIIIA33@o=\xd@J{A *=AA@oHj@EsIIIIA@oH:Ȧ@EdH#ulIIIEA@oT$7/@;lVbIII$A@o[MA@*q*;III>uA33@o=Hkw@K TII-III:2A@o3#^N@Pck+[+A@oXh@,@IXIIIGA33@o~<@=`I-II:7A33@oV@Pg!^+A@oyM]aH@HLA@o:e@Qq$hI:;A@o.#@KEIII6A@o.=d@BuII-IIIDA33@os@Msޏ|II:'A@oHJT@P60+III> OA33@oi.@@EN7?= JAy@òP+v@K6V9III&A33@osh.@A$)II?A@o@ARGI-II:Y=ƧA@oۤ@@[II?A@oUh@P I*II-III>fffA@ozj@Td8~'III#= .At@oYxZ@S@C=II"=KAx@pUFy@A:>Id(III'=Avff@p %}h@CGC III:4=oA@p"<^@8V7FII<A@p'A33@pNL@=06^)A@pwltk@S[EE/A33@pR[@@ IIIS>+CA@pKM@Nb@7A33@p[s+@K\eII-III=A@p_&5@H/#c,A33@p] @KeuG1>sgA@p5*ڜp@S;طI#=hA{33@ps@DLceIII:5A@pwg]@E1%T!A33@pOk@S[*IIInA@p`@JqII-III&A@p{:/ @POlII3A33@pqxg?@QΐIII2A@pF@C#oKIII:1A@p4A@8׮n{2Aff@pq@O},jBII-IIIOA33@p@ @P)WF_!A@p#Z @Q|TIIIOA33@p@Qiz{IA>;dZA33@pCS:@K"III:(A33@pS=_@EiDII%A@pVC_@J JII:EA33@p-.@S4P0A@p<^ @MyIII:2A33@pПr@M :yP?A@p /@RT ,A@pӆ#)@I@uBRA@p+"@J(%BA@p9i`@L5/FIII:&A@pM@UxQD'(II:aA@p߷Sv@QM~xII-III0=PA@pk @Sk]:&IA~ff@p_@E/s"+III:(A@pMP@IPII-III:%A33@q\ps@E&<Aff@pǬ@S+BIII>A@qZd@Qi7WII:"=A|@q/ iM@L,KIIIwA33@p,y@TA,A@q.Xju@Q;"JU II"A@q; Y]@Q!SD III:5A@qDz\@RF III:/A@qhA( @NM61Z II:2Aff@qfAƉ@Qj II-III'A33@q;=@SlJ III:)A|@qk@RSQʖ IICA@qKQ@QJl III<A@qI@QV: IIIJA|@q,9*w@SPi IIIYA33@qq@SS IIIyA@qLu c@Q}80 IIIBAff@q_Oٶ@TC II-IIIUA33@q&;5@QD+8 II>XbA@q1jLS@S^9ҵ IIIDA@r#F/@E-?# II-IIID=gAvff@r"@Qt U>/A33@rMUܤ@RZ% II-IIIAA@r*(&@RM81n III8A@ro8ś@T  $Aff@s!284M"c 2Aff@s8 98C Aff@s8+>@QwY :A33@s,.0@TMj CAff@s:E1ДhS/ Q>+A33@sq&x#- 8A@s'Uw6 #&r II-III[=A33@s<;p1 Aff@sk0&Df %A@s\)SX3A@tK<.4ȏoi (IIK>,=A@ttKW(CN )IIIkA33@t}x*79U *III(A@t&-]n664J9 +III:O=A33@t&ʩ&R| ,/A@t-I\x@T݆: -III?A@t0")N .(A@t9*|:E /III2A@t9//XS\ 0-A@t9_%; ef 1II-III3Aff@t?\a L-~ 2IIIQA@t=dQԃ??鋖 3IIIp=mA@t? B;?Ȇ[A 4II-III:Y=A@tBsMs7=u 5II9A@tD4/ND8 6II-III;A@t@`l@,QQ 7"A@tDM~5.b 8III@A@tLf,3݅ 9II-III2A@tR,sE7t/ :IIEA33@tT;9B5 Ea' ;III?A@tWډf4N JW I-II/=^A~ff@t[jc ,A@ ?III7A@t`^Cs3U:q @III7A@tbI2VA7 AIII:=A@tc{3$p3x1O B)A@tdZ m83 CIII=A@te)K3R D)A@tb?? EIIIOA@td;ʰ(Ip$ FIII2A@tgE3"rB\ GIII=A@tgx,':"OD- HI-II;A@tgY)$ ھ III^=zxA33@tm&3 cjLM J%A@tmy?i_\1 K-A@ty LII-IIIIA@t{̗IC@Fً MI:CA@ta=/KϭV NII-III2=A@tӴh52_^r OIIINA33@tMx3Dw PII-III=>t!A~ff@t|Ї7$ QII-III<A@t#<|@9"Fe RIA@tJr@@TȲk SeA@tP|@ x鱾 TII-III.={mA@tkPqGĐ+ UII-IIIVA33@tNO@1ooL1 VHA@t~!M.~'(p W.A@tnb ?"ۏ8 XIIIFA@t1p00 #, YIII4A@t}43:Œs ZI-II:9A@t,0@! [2A@t@(w \2A@t;WX?h3z} ]I>e`BA33@tda@© ^)A@t+;-8Eu _III4=poiAy@tI&eۀ `II:8=mA@t|$%4"+m aII8A@t!#a] b A@tg21@KWG c(A@t-/,4} d.Aff@t. ,1ӟ=tv e)A@to)%@&}ͽ~ f8A@t^R@eKk gIII4A@t7.kQ@=Q h%A@tw }@4&z iII[Aff@t>#m#ȕ]D jIII6=A@t/$! kIII?A@t5pŻJ9 l+=+A~ff@t%t@&z>DE m0A33@t^\@!LY n-A@t{t*[Ņ oIII(=tA~ff@t.Y99.Ҽ pI9A@t9-%c8l ` q A@t^:0 l rII-III:=A@t/K@1˽dȟ sIII2A33@tɁ (_B*# tIX=VAff@tʥ̤%_S uIII/Aff@tmH@bĭ vII-III::A@tf2@ &e˞ wIII>A@tbbC@*!= x8A33@tr*T@ӈ yII-III5A@tҐA@$e{ zIIIrAff@tSiJ7GT {"A@t 7$k"^Mt |II:3A@tX m@""44= }IIIxA@t"V_n ~0A@tuA@!/&% IIIZA@tNcy@pş III2A@t ,'@,-` II-III:+A@t$b ,nGhha III;A@t,K_@"TA33@u M O@9^s2 KAff@uOC/*j:E III9A@u"O@KN aB II-IIIJA@uFv: Hk= II:$=TA@u!h] Y@-8?# 1A@u$* ]a"}[ III@A@u$q@ Cը0 'A@u& !TT II<A@u%[~@0l} 1A@u(D @*+yB IIIXA@u+t+aKh U III:NA@u,Md0.&A( I2A@u/hū?[ I-II:5=tA@u.d@2''v ,A33@u2NR/PiO III!=A@u6<_@1?%Υ III4A33@u;BK5Cdy, II-III:>A@u6u IIIAAff@uB Ӧ4+֑ %A@u@}v@>w ,A@uB@ l/qfF II:=A@uAn}@(Ǫ# II:==YKA@uB-&@1>]鿂 II-III=A@uGCd@ [X III\=?A@uG`P@1MF=Z IIIIA33@uI%D+f%<( IIIgA@uLDe44Ogj IIIRAff@uJui-3 @C{ IIIFA33@uLJ)o8*@+]U III:QA@uOTN1X #A33@uRRa|1% II-III:LAff@uT4@12LQC ,A@uXP/=?1yR II3A33@u[8l1:5] II-IIIDA@u\TV'i!ҝ IIIpAff@u]Tk#@?| III=A33@uaEZ?]OB IIIDA@ubA`0j2 A@uc(@1*";e (A@ueJt4L_ef %A@uf rP7BL| III^A@udZ% II-IIIAA@ue%KarH#O II8A@ue@2᪩ޠ ,A@ui3@]B .A@ujYZa:' 0A@ui h@0ນ֍ IIIAA33@ui@% | 0A@uk#0f]d= I-IIh=A@ul^}3? ,A33@uo{v"@,5Z4 IIIEA33@ut}ݏ(69fW III:OA@uwEww9w& II-III:GA33@uw!@.G< III:9A33@u|;i$)0^ III::A@u{" ^@=w}% I-III/A33@uab-3 ; 0A@uݦo^ o³T III7A@u\KMqd@* AT II:L=A@uaaL;@ II-III:\A@u#0@,u II-III@A@uBNfr5nئ IIIF>l"hA@u j?zP III;Aff@uFՅus A@uq}@$4͖6 II5A@ur)@:@l*rC EA33@u(@Dí72S III@A@uzfP3@? > III:A@u=d]@26u. II4A@uՂSq@%E>>޳ -A@u-68*@\ IIIN> WA@uQ .) )_A33@ui@,ٖ I-II3A@u21)Ѷ[ II-III::A@uxʭ@1uiC^ III<A@uv%)#zd IIIA@uXth҃8|7 III5A33@uM9P-W; III:DA@u4w5ez< '=ÕAff@uMB6*~  II:QA@uF@3}# III3A@u!5u IIII>2GEA@u{_j@JWA@uA@DS!8: 4A33@u}`;6m=u- IIIf>IԕA@uHnΝ III3A@u13+ R II-IIIH=RTA@u xq5zr< II-III:B>1A33@uy 6)x[ II:F>A@uEӂ6: L5 IIIS=|A@uM.8~aie III9>$%A@u-ܥ II:6A@u=΃%r A@u~@|X~ #A@u#?6ag> II-IIIZ=+A@un 5 X{. IIIT>A33@uiO4m17 II-III:A=|A33@uEa)|]-j III9A@u<5 II-III:z>A33@uR @|"J~ III:A@u6@ JkA j II-III:^A@u~L8֡ I-II:LAff@u'v!5zU"i II:=A33@u W66 II-IIIH> A33@u95y)6 II-III:C=&A33@u#[ \0K III:9A@uHI@$o' /A@uz쯇C+c? I-III=SA@uX/f IIIQA@uigk@-zfXI /A@ux`@@6 LA33@uɯGD,Pe 0A@u:á@,-. )A@udL&5@з (>&A33@utf4`^ III3=$ A33@u%9 V A@uͧ2u61/ #>'A33@uץ)AX III8A@u؟6?q.U{ III8A@uI(q: II<A@uْN@2}M III =!At@uzBiV IIIEA@uDA@, III3Aff@u`F6{_% IPA33@u66hӊ III\A@u`E6u IIA@uw5ɂc III7A@uuQvN5$ל I:BA@u-?79kC: II-III>A@uI@ 0'{^ IIILA@uX@ҢZ II-III5A@uP~54lȷ III4A@uB@; II-III:.=A@uk/:=$E IIIQA@u9N4llN .A@u'j6h% IIIaA@u@"PQ III=Aff@u  @0 ĭg I(=,q At@umC@UxC II:5A@us?ҧ;Y II-III::A@u8I@2$5} -A@u8T@-Hq !II*=1[WAq@u&*@ &Pxf "II-IIIAAff@u󷀙Q4j*. #(A@u(@ *7hG[ $,A@u3P(7v2 %III+=}VA@u @;4c]8 &=A@uh7Td 'III3A@u:@6hv (III2A@u>N8l } )III>A@uȌ@5N! *II-III7A@ua#9WV +.A@v6b6>ⷆ ,A@vi7[$ -II-III6A@v}u55!h$ .II-III:NA@vB~@&О /&A@v 5K 0III;A@v %$:9D 1IIIEA33@v l@1FZ 2IIIA@v @48_/ 3IIIJA@v k2؁ 4II-IIIaA@v d*W)u 5IIXA@v055 m 6II-III6A@v87+J 7IIIrA@v@pJaċ 8II-III^>;A@v\@"nb 9II:_A@v:+6@7|ha :II#=bNA~ff@v 6I@5B ;&A@vE@@d*~ II-III:)=~\A~ff@v3W#K@p ?III:>6}A@v9'@p_ @IIIgA@v!EvQh@4 WSF A-=yrGAy@v"@5(b` BI-II/=jhAs33@v"hy@7;I CII-III2A@v$[[B8( h DIIISA@v&ؖ26KsJ EIIIdA@v&-]@/^n F==qAs33@v&]?a  GI:A@v' V"r1«:* HIII>>vAff@v( Fc@*c% 6E III:`A@v)9m@;e= JII:4<$A\@v*[cj_* KIIIyAff@v+ /#f{  LIIInAff@v,{¨Bf@5uݼZ MII<A@v1'i4-kh NII-III:{=A@v1@%j1- OII-III\A@v2qw@3 S PIII?A@v38݈ QIIIWA@v3%ђ6 R1Aff@v4m/@4qz& SIIIMA@v4ŧf?╃K TII;A@v5wc+" UII-III:>{mA@v5/$ u VIII>EA@v5CD@9BA W0A@v6Yϥ, XIIICA@v6r@8fM(j YI-II2A33@v6w?Wi@: Z9A@v7%t@57 [IIISA33@v=A$ϣ \IIIA@v><@,k_ ]IIIIA@vA@4VXE? ^III`A@vAr~5O _III:PA@vCyɑl)Z `#A@vCf@"IN֭ aIII3=) Anff@vCIJ(xV` bIII>=pA33@vDVQ.1S cII-III:A@vE4;!9w d-A33@vJ7am$"94 eIIIAff@vUȳLG@0iN33 fIIIMA@vVkQv8g2 gIIIA@vXLo( 1T hII:WA@v[՝}@r/B i"=cA|@v[}g@;%zV jI"<A\@v_$H.X:O kIA33@v`mlRd@,GA lIIIVA@vcq<ѫ@ l| mIIIMAff@vh?i z$a1 nI-II=uA{33@vl=f?@l\ oIII:QAff@vl‚@:qyG] pIIIFA@vm ?_* qIIIDA@vn?u2/?z۱ rIIITA33@vn:G!@&K*g8 sII<=OA33@vo 72@.w t%Aff@voa@A.Ic uHA@vomc5@'Rþ*< v(A33@vmMW4tyZm wIIIlA@vq#tė5 ޢh xIII~A@vu|Sa8VT! yII:6A33@vu e4o zIII@A@vvI& B9* {,A33@vxW% PT |IIIPA@vyA58gi }II-IIIEA33@v}wI4 ) ~II2=1A33?;+؝,@@P 4A?+.{@/!ш III:A?n./y{ III]A?YĈE9#b2O( &A?ͱ % )A?"B(-@(o II@Aff?J(6O3 `) IIIIA?Y&gQ@ VxO I:=2A?G@2, II-III[A?(.?c$v 'A33?䞛ikp' IIIaA?cL@yn II:SA?Iۥ4. f P II-III::A?^o@~iU0 II:;=K^A? ##-0O III;Aff?~H@?erK A?y@@0R .=JA?;IJ('DbF II-IIIbA?_l@/ 0.- III@A?D~v@&ABq III5A?nʑV$Xz II-III:2A?8.xQq-03E II:aA33?݃fl#{ III4A?692.G{?b I-II:@A?thL@9NT III:IA?ЌU2W>T IIIGA?r ؓGk~ I-II:A?a `^8Qz II-III-A?!yAU.1 IIIpA33?dUV;+ќ_ I-II,A? \ҜA9m> I-II4=KAvff?7=yD6 III:=Aff?c- III>-A@ yh@EO II-III>A@ p^ II-III8A@ MX24ᴈ IIIFA@+8'tAzL"s IIImA@ %BcO] IIEAff@7ٌz?cO!/ IIIDA@I# rG1 M IIFA@FКEkHf IIILA@pJg y II)A@91A-X݄ IIIxA@Ֆ )d3N</ II-IIIOA@VV ` III(A@cUh+ D III%A@D$ _>{ III/A@+bPce II'Aff@FAP!n7 II(A@qC;zJR II-=1A33@[mDWPdQ II-III?:Aff@t9Hz͍t II7=FA@q946 II7Aff@umP@ r7gm II-III::A@ҭKC(Fv II7Aff@Mƭ#T1ge IIDA@+PC I-II!A33@5P{N II-III!Aff@r]$pDy I-II!Aff@GHB! I-II:A@&,gEHO I-II%A@GKPk II-IIIEA@Q<%KM III3A@7d|I6* II5A@5׽TI ٜh{ IIXA@µҧ>=|ֿ III3Aff@{\NJNK I*A@I${=cL III6A@x2Q412! IIINA@EN)kJIQ II0Aff@fbMA4WF II-III A@ 5=p.# II-III:5A@OTE II-III: A@GN^0DIG II@A@y- )KhaR I-II;A@ 9;將/w III)Aff@ jnQP|fd I0Aff@ qFI II-IIIXA@! R(5 b IIIIA33@!MN)b2 II-III!A@!S}Twk? II-IIIA@"G?[ II-III9A@"k_PI;U II-III,A@"YePdm II!A@"&+ OTA_ II.A@"ȃyxPbp I-IIIAff@%@zCfO I-II7A@%W 4QĽ IIIA33@%1,Ŀkv II-III2Aff@,_䢻Ce; II-IIINA33@,=Jt II:5A@-V"LAA*Ee I-II&A@-Oi؍D_` II"Aff@-]4={n !IIIA@-@bZ= E "II-IIIfA@-xj)>i #IIAff@.@bCΘ`@ $II-III-A@.7U C߸a7 %II-IIIKA33@.h-`;ICe &I-II@Ay@.{T;E+xZ 'II-III:KA@.Ї2CU4Q2 (II-III5A@/"ܯCV& )IBAff@/PYKݜoiSu *II-IIIUA@/@c P5@˞ +II+A33@0`YCwk ,I)<ۋA@07{4*I<Ќ -III Aff@0J|0yMi .IIWA@0@tiH=j /II-III:A@0/MԠPm: 0II'A@0SA>Ôt 1III+A@01p/ 2I-IIRAff@0v 5@ɱ%` 3II-III;A@0+AKK9]H 4III\A@0LF\ 5II-III:7A33@0uGuP 6I!<Ap@0e^B]ۀ 7I\Aff@1 5{/nE1. 8III:GA@1#]oEٞ 9III=A33@1+DD,G :IOA@1XPlf ;III%A33@1Cca,LO I-II A@1z*)B> ?II-III?EA@1H/7p @I-II%A@1АTX1Z AII$Avff@10?NQ?k( BII A@2HOzB,9 CIIAAff@2F,!FBel DII-III?@A@2xThS6C| EII-III%A@2HqXNz FIII-A@2,B$i GII_A@2ϓL\*%F HIII-Aff@2su1H@PJeO II-IIA=A@3M~5 H  JII[A@31rBX KII9A@3?:A B4E LII:BA@3GTxIo]v MII:?A@3g6  NI-II$Aff@3IH; OII:>Aff@3K3nBJ/, PI,=A33@3i9LQgPK QII-III$A@3Q`A :W! RIIIXA@3P)ⰾ SII-III;Aff@4>ِ%I7 TII-IIIA@4RC9DE UIII:-A33@4nބ"4l' VII-III:&A@4l;j5Khņ WIII<A33@4B=N4- XII-III?(A@4àU2\G YII-III<Aff@4|)\;-5 ZI-II.A33@5O8au [II-IIIIA@5!9Ш@ Z$ \IIIKA@5BBWܷ ]III7A@5yL$.@( ^II-III:TA@5+B+ _I-IIHAGX aIII"A@6!jnGr@ bII-IIINA@65-Yt]=!q cII7A@6AG}(.G!= dIII-A@6l3ϑWJd4 eII<A@6ق_DHzUD% fIIIDA33@6h; gII4A33@6fbAANl{ hII-III5A@7 0hZ8 iI-II<A@7>&= jI-IIsA@7E?NY kI-II2Aff@7O\x: + lII-III1A@7ZFr mIDAff@7{uW\;'R nI-II=A@7-W`9;\ms` oII-IIIVA@7V;~\v pII-IIIIAff@8!y ~;2Y0v qII-III&A@8 >Rc sIIBA@9 A=zJ tI-IIbA@9,/SKH5 uIIIMwԻGw- yI-II7A@:*ig6; zI-II2Aff@:3;)1i8M {III-Aff@:U~z8R |IIIHA@:@ElJ N, }IIIUA@:k5՞P8 ~I-II A@;%n[? I-II@A@;gTz7)97=A) I%A33@;~};P Hf III.A@;Bˀu8WBO II0A33@;]PG9+Hٙ I-IICA33@<f8D@ZVt\ III;A@1I?=X IA@>&bF@pC II-III9A@>0wEFq7X9SU II-III/A33@>RFAsD4Y_̃ III)A@>oH*"5[)t II-IIIDA@>J8G;5ɕ III*A@>1M8DO8\ ISAff@?C"0LgA%# II-IIIHA@?MEO?7 III%A@?jW;Ir I-II/A@?:-$ II-IIILA@?};C \PZ II-III?A@?$v,<ߴv III+A@?':Kh9@ IIfAff@?˃.k9~/ I]A33@@ύ?ǥ II:)A@@dQ:]AE II+A@@#?E{a\7# III;Aff@@>N;]HY` II-IIIA@@V~Bq! II2A@@[់b @6@O III3A@@nt1DD$# I6A@@|d1  II-IIIeA33@@.w& I-II!A@@2c9B8 II,A@@J%f6:+$n IA@@BDe[ II-III7A@@+5 IIILA@@奘8ա&U I-IIE=,Aff@@$Iח2 II+A@@caI>g IIIAff@Av0 H"c[kR I-II2Aff@A*_R <^H II-III8A@A4/q3kbh II-IIIGAff@A8v 81x4At II(A@AFX`IІ'. II-IIIA@A]/A@A DXv I-II.Aff@A{E q)I III3A@BpdHM5 I-IIXA@B+EO~ II-III*A@B;LDOC3 II?7A@B@ePw II-III&A@BRS L؀( II-III:PA33@Bh2I| I-II;A33@B\q"q P II$A@BsR8mS3( III,A33@B{<:'ր III"A@BeIC,w)4 III9Aff@B NL;G II-III*Aff@BTBe- IIIXA@BФ\D @4$8 III,A@BB@;yT IIILAff@B\|CY - IIHA33@Bե%vHc II*A@BokQLʽZV IIIBA@CUsC?50 III-A@Cb8~DRS7 II-IIIA@C~e<6@?a I3Aff@C~iXPt}І III(A@Cg{#FI III>Aff@BNPUv<ǁ II:A@C.NJ3W /mZ II:<A@DI@\Y II-III:GA33@Dev]KD IIE=Aff@D+ L< 4u1 I-II>A@Dic5ܯ:8 IMA33@Du-~F<-@% I=A33@Dxv>;C z II-IIIAA@DtIO^VA II A@DĪW}A#X1l III3A@D/G:u} I-Aff@Dǒj4yS/ IIInA@DS1ZJ]ݑF III.A33@D^yKܵy II2A33@DMsL W III+A33@Dދ{;d5 I,A@Dinq@ IIIFA33@EmI>,;#SK I-IIA@E ܱ'MGQ, I-II(Aff@E2X;TO IQAff@E&|H4zT IIAff@EI9(1Kxޘs{ III?6A33@E_ٟG'QW I-II(A33@Es2l"HX7X@ II-III*A@E^P.zD II,Aff@Eڎ{9a 6H II-III0A@ECn>B]O IIICA@EA%"M@Iʟ II-IIIJA33@E%J III?PA@El(WS肋^ III,A@E/C~K4C IIIXA@E m F*sc II=A@E}6U, I-II+A@F`8GJg I5A@F#W)G I I-II(A33@F)5G΃WVa III%Aff@FE+ 56KJ III+A@F=6G&J[Ҁ IIAff@F`K7VJ"ܶ I-II&A33@FX$F s, I-II1A@F{MIO] II$A@FFIA-D I(=uAff@FYF1x I-II'Aff@F];wf8Pfy3 I-II$A@FTv!nD|@e I-II%A@F;)8Dh II-III[A@G V6_NK I(A@Gb}BzU I-II:A@FmHv III8A@Gg W8Zrl III+A@Gg 5III.=rAy@Jx} KB 6IIIK=Aff@J92SOL1Gx] 7II-III]A@JFk""JHz 8I-II=bAq@Jwӡ> 2Z 9III7Aff@JsfQyG  :III$A@Jq+ID! ;IIA@JL&Ff4 o \FxQ =III!A@JVbDd2A >II-III2Aff@J1 aCy ?IIoAt@JQJ؛? @IID=_A33@JIԜ28 AII-III.Aff@J'bFADk& BIII A@K$7 {&; CII-III:dA@K :eDQ^ DI-II-A@Ka:X0< r EII-III7A@KfxC FI-IINA@J^`odQ GI-II A@K"4V&K39\ HI-II6=-BAy@K;R@@Cz8i III-III$Aff@KK@to JII#A@K&J>OK%.Y KI-II/A@KU W'O@\S+ LISA33@K WQe>F MIIIAff@KnWc@mRg NI-II7A@KpO< OI-II4A~ff@K(q.@IWO PI-II3Aff@K@2A 䓙 QI-II@Aff@K 1@j+0ق RII-III0A@KeQ˲ SI-II!A@Kӎ,\A>H TIIIMA@Kˇ=Zd&4 UI-II?j>VA@KV99J@6 VI-IIU=qAy@L:KX@XԐ͇ WI-IIbA33@L"龚6q XIII;A@LaOAuIq YII$A@L${s=i;?L ZII-IIIMAff@L68FI۷ [I-II+A33@L:MA@L7"9 iII:1A@Lah 03c jI-II4A@M CHM )b kIII)A@M$Cw^J lIIInA@M6_>S mIIIGA@ML_;?Az nII-III4Aff@MN1ץ@ 5 oIII(A@MPEBcǧ pII-III`A@MaeP؏2|ݹ qII-IIIPAff@M moR3 rI-II>Aff@M@ke<6 sIII9Aff@MU;; i tIIICA@M+MCc uII:AA@MmE6_v! vII-IIIUA33@M^Oiu>Z wII-III!A@Mֲ04=艵 xIIA@MZ8J+-+ yI)= CAvff@M{Tu>, zIIISA@M;|AyE m@ {IIIA@M_3u |II)A@MLQ>m&u }II>A@Ne;AA( ~II2Aff@Nm72L" II-III.Aff@NOD?)Jc III[A@N&$¥3]o II-III/A@NdlJԆ@z IIA=Ay@N47@ڥx IIIPAff@N-Ǔ@Gg}-: II-III A@NHpJ:xO II-III?6A@MZsYA@N^5s;25;@ II-IIIQA33@NWJmr III Aff@NS\L%*! I-II=A33@NuF;D7Da III%Aff@N};@O II-III_A@Ny-;[ II-IIIEA@Nҝ>D. III7A@NJp2 II-III'A@NvPMΎ II-III\A@N{Ď@R>v III6Aff@N0ɖO::\ II-III<A33@NFPfi II-III>A@N{GmS8 III5A@O|h;MNi II-III,Aff@OF;; II-IIIfA33@Od[8_>ѝ IdAvff@O'ԟ0;x1\ III(Aff@O(a9M>Щ II%=1[WAy@OtM)Q<Z III@A@Oe^cFunA# III4Aff@OdgHmvk@ I-II<Aff@OdfO\so f I-II*Aff@OqIO?[ IIpA@O{xP&Ъke IIA=ixA@O/A%N\ II(A@OmPiF0Õ IIIFA33@OҦWF'{b II-IIIAff@OĥG/FyUz IIEA33@Ow,CxKRA II-III?QA33@P4l']F"(r II-III?GAff@P3;P2~ I:6A@P,O=l`6 II-III1Aff@P-x9E4\ IIICA@P(TDuONh$ II-III"A@P76:FXU II-III@A@PQݼhFb` III2A@PS#jg|~G=vđ II-III4A@PO*NPC0T/n IIICA@Pn2ՕQ III&Aff@Pk%@t I-II)A@Pi5kOs II-IIIJA33@P{GlquG ]~ II-IIIPA@PE1-B=K-8 IIFAff@PdG^g II:,Aff@P:ҿ*G3(( II:+A@P V\SB a/ I-II+A33@PYjJAl3 I-II^A@PFQgOB I-II5A33@P&pC p- IIIA33@Pݝ,Q5a1> III*A@P̰N)sb IIIVA33@P簁"TBX II2A@PzP>C 5 III^A@Pb%r)Ht+X6 II5A@Q>BNG! IGA@P N$t1 I-II[=sMjAt@Q EIK! I-II8Aff@Q9H@: III)A@Qo F} I@A@Qrk~B;h II-IIIA@Q(bЇ8G#\u II-III:?A33@Q`-NڝP III:JA@Qγ22 ; III0A@Qo_@r5 I)A@QYFpvL II-III(A@Qz~>C䱀 II-III/A@R\iFWIG I-IICA@RM$lAd> ] I-II*Aff@R$9V, IIIpA@R5Lؔa III:A@OWȄV/N II'A@R}f8,J II-III:7Aff@R1CVަ֒ IAvff@Rˉ^H III7A@RJFcNI%* II-IIIMA@R?JA9Ҕ II-IIIFAff@R+6YKC2@ I-IIUA33@RzzHٚ@ II-III?lA@Rz= F֮ I?Aff@R;>=6=8 IIIAA@R[5I$@Xbd9 I-II.A33@SB T@0"s IIIGA33@S&vX_&Hy II-III1A@Rk]LwJc IIIvA@Smpѱ@,{W< II-III@A@S+:F II-III4A@S79=#w I-II(A33@S-+ޗG< I-II??Aff@S4oʺH=M III1A@SJʴcVg}~[ II A@Sl/H؛i4 II:AA@S2 %Czk5" I-II)A@S.;'E'oh II>A@S@!F]& I:A@S>WHa II4=5A@S塥LVI,/{ II#A@SEL G I-A33@R>JӺU/j II A33@S߇R%MF< I-IIR=,A33@Tճ ?; II;A33@T7Dhْ3 I!A@T!o=IH`Q IIIA@T*(S>H"wZ1 II-III=6}Aff@TLן;u$ III7A@TVrz>.D I-IIWA33@TY\W?,K' IIWAi@T^,>E b I-IIUA33@T]t&;G_d I-II@A@Th6 o>}B IEA@Tp# ZG9V II(Aff@Tt< /G9 I-IIVA@Ty-rSWGU I-IIpA@TrF_GJ!+} I-IIJA33@Tc@ G-j IIQAff@T`9ΚHa IIIA33@T\He !I-II0A@UNc$cNۤIx "I-IIA@UGQ ^q #IA@U f?=e'. $IIKA33@Ums\54A͎C %IIDA@UcSD' &II-III(A@Uղ g8x* 'I-II!Ay@UF6.7 (I-II A@UMyN=) )II-IIIDAff@V-n@)sը *I1A33@VC 2OpГ +III{A@V<Ae5 ,I-II#A@VI_2$-U| -IIIAff@VNV5B  .II"A@Vh2eA /II-IIIAff@V aSZDb[L$ 0I*=:^5At@Vuv%44v 1I-IIAff@V(BAy@Wz16%@yL 5IE<Ak33@W!>4;BlI 6III3A@W*0jb2`Rd 7IIIRA@WdԷ\1LX$ 8I+Aff@Wפ. JaC 9II:.A33@Wv\ER4 :II-IIIJAff@W:X%9W4 ;IIIHA@W&vEO! II?Ak33@X$J0D ?I(=YcA@X1/@dA_ @IMAx@X6=j+UOry AIII7Aff@X>o@6;s> BIII<A@X8J?K3:/ CII6=KA~ff@XNjgDHa[ DI-II>A@XZ1)0JF EI-II-A33@XDjOP"ɻ FII:A@X!i{/H?Fmq GIII!A@Y 5sG4\0 HI?;A@Y $OS.#R III-III2A@Y#qH6TK JI-II-Aff@YF*kH KI-II1A@YXXQK'V% LI-II@A@YZ7\]zRI MIII#A@Z%iH* NII-III*Aff@Zx¼H OI9Avff@ZwUHw<" PI-II)Ay@_nCX71fg QIII'Aff@`3$mH1k@ RII-III2Aff@`N]f1zı4 SII7Aff@`P+1kO TII-IIIFAff@`x3t. UIIIA33@av3Yԕs VIII9A@a>mQKo50p*3u WII-IIIoA@a\% 4ώÌ XII}A@azKʃQ4:UjH YIILA@a75nW8 ZI-II:/A@a.v6N# [III:^Aff@a5ň8hbƅ \II-III2A@bxu=Je* ]III5A33@b! Ɂ;d ^II<A@b(/7< _II-IIIJA33@b2"|;#L_v `II-III^A@b;7@XU| aI-IIIA@b?j/>{« bIIIPA@bu ȍ6 A cI-IInAff@b}@5  dI.Aff@b5eB808V eI#A@b£E6Cgu fII-III8A@b~r8JyE{ gI-IIA@b8@I\* hI8Aff@bnӘ ?Fw iIIIiA33@bLA.. jIII7A33@bm5?⭶^ kIIIA@b׍m?\f lIIIXA33@cb= mIIIsA@c5( ]ubq;nq oIII:8A@c>IN=Yzㆊ pII-IIIA@cPv;5r-I qII-III-A33@cX9djs5:& rII-III;A@ci2qd@ \W sIImA33@c~]2;@jwR tII-III9A@c8zme=Ɏb5l uII-IIIQA33@cGC[H1 vIII@A@c;E2C/fgK wII-III?A@c~D@R& xII-III:Aff@cvAљ yIII+A33@cHP@˱Q" zII-III3Aff@c>!?/bu {IIIHA@d) I?*A@dbV;Mw II-III)Aff@dEA&@G III9A@d!<} IaA@dZKvF> II-III&A33@d `J?;M߼av III0A@dR`s3ĝ III<A33@d}(F>ڹ{5 IA@d'n=?Ei# IIIIA@dZp@-l ,} IIICA33@d{@ n_ III?A@dr2ٙ8 III?AAff@d8&>'Ü II-IIIgAff@e;Q>0 I-IIMA@eo17EޭI@ II-III4A@e!Cơ׻E۔ II0A@e& NEx II-III@A@e,4|@ II-III*A@e33C| II:AA33@e3Pu9[`3! II A@e7>u@;lxV II6A@eH]"z~?5Z8% I-II>A@eKqX@N5 I-II=A@eV.@|(C I-II!A@e_+ym4I; IIIFA@es|g6hl/ I-II?A33@eyK4?ya II-III+A@e BG=f II-III6A@e.?1^EE/ II-III-A@e|i;ºK_ I)A@e9X Q?:3|~:: II-III"Aff@f zPTbA8 I[A33@f(RBCf3r II*A33@fb>h@]A I-IIAff@fhn|S6%% I-II;A33@fi3Ewm]@@ I-II(A@fvAjf=Fu) IIIOA@f~.7 R) III1Aff@fxȧ:?e%:T I-II(A@f鷢j%%~ I-II$A@f+Z<ྗy# II-III*Aff@f\OLY<>?'* I-IIMA@f\f%R=-D: II-IIIHA@fį+@- I-II#A@f-NzA8۽( I-II5A@f%Lm|_u I-II)A@gؚfEv*$N I-II/A33@g-]q,5ٻ@ II-III?8A@g3%Ek II-III?(Aff@g6E2Wp9ler III;A@g=Y'YFE III A@gCTJ9/~ II-III#A@g~zņ.1׶)- III9A@g73FQ III1A@gum|`C2>= III1A@gT86 II-IIIMA@g!1<̀cQ III'A@g6 Q3}[ II-III A@g'1! III)A33@g1oAii I$A@gվ5: II-III A@hh(D% I-II:!<49XANff@h~y/ B`. I+A33@h2mM =c: IIF=bAA~ff@h::x2'ps; II-III+A@hZA I-II"Ay@hIE@uʪ‘ II"A@hJt>^Ę II-III$A|@hMXU0Z5kAz. II-III,A@hN [2m II-IIIA@hNyGjH<|X# IIIA@haCCW2h`EC II:(A@hhY b@7 .0 I-II#@Tt I-II~A@h 2i? rŵ I<Aff@hBB I-II$A~ff@hin2@SP I-II; IIdAx@imMB: I-II2A@i| ]ZAQb( II-III@A@i{A8b I-IIHA@iĔكBFW I-II=_Ax@id@nhY I~Avff@iᆺQ@z~j I-II1Avff@iCYXAWL4ߨS IKAff@i?D>LZ 6" IK InA@j^;g:RY IIgAvff@j,A/8 I-II4Ak33@j-M6LH{ II+A33@jWE[_7:t~ I2A33@j{.VJ;NZ I*As33@j*2CT> II-IIIHA@j=6MYfIN II-III0A33@jJJ 3"[II-III;A@j6#cIII9A@j׌7'%IIIDAff@j5H=}II-III:PA@j# @b"}II(Aff@jdG[9`III?)A@j;Gj@LrsIII:UA@jϜFR8]{IIFA@jJ6GII-IIIAff@jyHK3z^W II =A@jꒃI1թ IIIRA@kC<U+ II-IIIcAff@k mqB3 ? II@A@kRt3j II-III.Aff@k |S1YSIIIyA@kZ7r.I-II:A@k(p;㭁*pIIIA@k=N5 ="II:A33@kEȶ0F+1HII-IIIAA33@kJI_?͋sII-III'A~ff@kLB+ hF1NII)A@kRB;VIIA@kku@5lm$I-IIKAff@k){v4(UII-III`Aff@k& <ۄIIIA@k>PII-III&A@lc\w>0qII:-A@l79"T$^lI-II$A@ljuA<1UM} II-IIIA@lM3|ƫ!III+A@liEH,II9A@o:z Tp-I =2A@o=FRcQ.I-IIA@qhSF/II$A33@q~ۘ`G)0II:1Aff@qǬPvFo}1II:@A33@q\Kw;2I-II&A@qڜvE]N o3II-III:Aff@qǗ?F=>4I-IIA@rRmT`G5II-III"A33@r6!ٺb Ey16I-IITA@r@+z6IyQ0C7IPA@r[ \gS1A8III-Aff@rXw;l)Et'M19I-II.A@raԅTPzNϟ:I-IIFA33@rx垎/Jn ;II-III A@rUVz*S.I-IISA@rHi"LM?I-II<A@r6Fm^@IIICA33@r \j;<WAIIA@ru?AUp!BII-III*A@r=?K?CIIK=pEAvff@rbtTOhsО[DII-IIIA@rqJmEEI-II*=B\Aff@rAty@FII-IIInA@r c6FTSGII-III"A@r#DCC23@HI-II# VaKII-IIIA@r3JJ""OLII-III A33@rIP\D:VpMII-III:JA@rsnuP ŽNII-III'A@r;{_"JG) /OIIITAff@rT)?PIII@=$tA@rOϐ'J>aQIIIx>r!A@seT3=*RIIIPA@rLh#yBXSI-IIU=YAt@r"DrTI-II`A@r1C>WUII*A@r0w=aVIfA@r)JGC}K0WI-II7A@sO܂D~;0XIII&A@sZnGaJYIII(A@sˣR> zNZIIAff@sJx[iJ[II-III6A@s%SD-9B\II-III!=%zxA@s)lj(s@e]I<=+Aff@s,ېD%?#َ^II>A@s5"Qz_II-A@s7rSgQbѝ `I-II,A@s1_*@[;aaI-II:A33@s4T:&B{`bIIBA@s4JgO@NۧcI-II"A@sC]vS=5fdII A@s@~vL7/peI-II=}A@s?{:ik:fI-II$Aff@sEJQ~(uI-IIKA@sZjB@]>WvIII6A33@s`*nD VNvzwII4=A33@say?&xII(A@sf&AisyIIIdA@shvC+&vzII)< A@si#\9'G{II-IIITA33@slnKsKM|II-III6A@sjp%!r@S}I-II%A33@sǤZtUF~IIIIA@sz&"=nܙI-II5A33@s|欲@Ld*I(Aff@s~_@^III#A@s=i:II-IIIKA@shyw>(-INAff@s/p/J[&/?I-II:B=:Anff@s%jBԐII-III(A@sxdKvc)5IIvAff@s IET9'47II-III<A@s*sG=(II:JA@s`FE MIII8A@sBPށ>II-III$A33@szf,E,oIII@A33@s`EɣE3*%i(IIIHA@soWGoNII-III9A@s"r3_5#$IIIuA@s6H[BBVIIIDAff@s!T-uII-IIIBA@s8VGmII?JAff@sA]\II?(A@s'DCSp_I-II+A@sʃT8KzDII-III:-A33@s)y< |#I-II;= Avff@sG۠h;Mwu6,III$Aff@sE1PbIIIYAff@s6^EIII#=GyA@s7,@hSӣIII,Aff@sp=AEiEIII(Aff@s^hD--/IIIZA@s3Z\$Chs2I\A33@sܸ:Tz5EIA33@s䘾G a*II-III#<+Aq@so~;E%II-IIIAA@s K9{F:II-IIIFAh@s6JKGs$BII-III`Aff@s~BII,A@sE(8I-II,<Ap@sٍS]GIII2Aff@sD FIII7=oA@s)I0_H"II-III:cA@swsEEpyII-IIIA@si; 2/bII Aff@s'VV:IvI-IIA@srF˽II-III#A@sڅCE II-III"A33@siEMFII-III'A@se`pF@I-II?Aff@t\B:bYII-III*A@tr1o@sxII-IIICA33@t )߮ QL.{IIIlA33@tS%cKZII-III A@t-$U5=zWyLIIIJA@tHm3LU͛0pII-III4A@tf"^A[=yII-III5A@t0L1J͟½II-IIIFA@tHURIII:TA@tƌ(EU5鼤II-III,A33@t#BR9~KQ(III]Aff@tĮC@hUX4)IIICA@t"{Y4Ꮸ I-II(A@t&{4Ih2v8`III*=SA@t&eY7H1'A@t7^U<@ <II-III:A@t9;S>=^IIIDA33@tO׌sGIjCIII%A@tV-R.;~III2Avff@tV@hF-uښbIII0A@tD%Uq(L_III'A@tf׎csGpŸIII:A@tgD<J!{II:6A@tfDDwo93II-III:MA33@tfb$9#n\IIIBA@tjpVLǚIIs=PA@ti7H4III2Aff@ti%(:kdTIII4A33@tkhUEegeIIIIA~ff@tp9 YPy)III:LA33@tn)xGǮII?FA@tp;| @[NAIIIA33@tr?I Aff@tt>4П IIpA33@tvZ@ x[oII-III:AA@ty CKqI-II'=-Aq@t|"=kQAnff@tвSMmId=]A33@tH4WB@{II(A@tt I-II0A@tG>}aW`II-III(A@tGIIIA@t6sJC2|PIIIJA@tź?!I,}IQA@t|r5;R'U6I-II<A@t*Yj<MII-IIIGA@t@h Hu w2IIsA@tcYeCa-0I-II+A@tlHK |II-III:pAff@tɟC^@W{?II-III:>A@tύűI>:k\XII-III:iA33@tA`Vnj II-III:/Aff@t7JJ I-II!=XA|@tXq3Q$ IIIAA@tD7C(V, III+A@t/Aۮ II=A@t|E:gII-III#Aff@t2mCs]II-III}A33@t蕱C ĬXII-III+A@tmϢDA[-j'III9A@t=jB+II-III>A33@tkLnIII: Aff@tNuP B-<IIILAff@t_Ff0MII#A@t:HvII-III?A@tYm$J=}II<A@tqҏQsdII?WAff@tۭA(MII-III.A@t@|L ,GIII$A@t$!?I(?rII-III`A@tkиK*zII:1="3Aq@tk+JJW).II3A@tIXTM,k II-III<Aff@t>%J9/G II-III4Aff@tCmhp=P<ʨ!I-II8A33@tEaUS"II-IIIEA@uDԧLF !#I-II:VA@u u gGd $I$A@u  Ht7%I-IIgA@u _Q7+?1&III,A33@uQbQAG'I-IIr<4A@uMZ|>Yr(IIAy@us/@ũS)III"A@uc BCq/ !*II-III?A@ui{H! ^+II(A33@udhOgJhO,II-III A@uS3>1]X-II-III:!A@uAK_}e.III=A@u#8CcQ;/II-III$A@u)B×0I-IIk>,1A@u+:>nr1II_A33@u5IfMIg2II:?A@u7TKbM{3III A@u7c?>f#E4II-III2A33@u8(wM7 O5I'A@u9K`E6C6II-III/A@u;md BX> [7II-III/Ax@u;cBNJBA8II-IIINA33@u=$_ 1cgo9II?A@uA'O3X:III.A@uAYCK^HV;II-III%Aff@u@$97ּII-III!A@uQ&> .W:?III_A@uR_9EļJ!@IIIOAff@uS9PKd0AAII-III:CA@uTyd#Nbj>YFBIIICA@uU;@Of׫UCIII.A33@uVFmpFDIII)A@uV?cK5F$;PbEII-III2A@uW2eFF*FII-III/A@uX'6J\!ѩGII-III:=A@uY8}B 4(HII:)Ay@uiSU&III-III?CA@u]ɿN-"r@JII-III9Aff@u^xpJ2KII-III7A@uabQQnULI-II'A@uaN8?OhZMIII8Aff@ucv<PNI-II'A@ue \MՔG$OIII@A33@udAzDuPI-IIDAff@ug"d|PNTQII]A@uf~\I[;=RII-III3A@ugw NuKXSIII:A@uo bO,=pTII&Aff@uoDV{GJUII&=SZA@uo"FZgF@0@VIIIAff@ur4OUNH0CWIII[A@uq"gi@$XIII:?A@uq}oR@":O}YIII?AA@ur@?*cFZII:LA33@uv;Q9˿[II-IIIqA@ux!vR>NÆG\II-III A@uu8A@ G9W:]III@A@uvR@N^II?q>e`BAff@uyoOdއ_II-III:Aff@uw fAuZi`III_A@uy4G,a aIIIAff@u|TKʤ<bII?\Aff@u|Q'Ma+cIIIXA@u}Y6N.dIIIiA@uINy6eII-III?+Aff@uDiE^R$fI-II.A33@u7C"ܶ?III+A@vDI)>@wII-III,A@vE8}'9:I7A@vH)31 I-II(A@vIDP&`III)Aff@vJ7)J' ICA@vJ+?K @~MII-III?SA33@vL,޹Ob8III=A@vL̰;*30D{5YI5A@vYED2"f,III2A@vZbSrQ NIII7A@v[67C5PdII?UA@v^Z<_-FIII'II-III;A?!>_qII4A?^?Ur<eH2IIIsA?>G5II-III-A?OtyCGGͰ.II:-A?wwB3Ҳ(L}III<A?f^ҐG^|III(A?)tXH|g II-III@A?x4BdB>ڏIA33?O=ꇡ)I-II A~ff?CYa0*;bh=I Aff?Q>|LI-IIA?oGwFϏ II=!A?Iy@>|B IF;cb,II:6A33@rL|F-II;I-IIAff@!Akc2յAII?GA@!3".J~?II=*͟A@#ذB:Cm瓟@I-II A@$2_ϯhO25yAII-III A@$fp/J9BIIA@$|rQF?v$CII-III:]A@$~ ;ש-cDII-III:dA@$QCB=(FEIAff@%J< 6dFII-IIIAff@%\ޏOCQGI-IIAff@%gߪ @&HII-IIIAA@&X7C 0v]II-IIA@&Oo=H?nJII .;mI-II=oA|@,RagJ!ǀ/nIIIA@-&/kqEߗ0*oIII-A@-4雴`PpII={JA@.OU:2$DU7qI-II =_;dA@.i=P.~8rIA33@.َ"HupsIA@.VӎI6KtIIAy@.A>9GUTuIIIA@/ou0)s1jmtvII-IIIA@/ztm=2u)wI-II'Aff@/Ep^׶xI-IIAvff@/ QEHZiUyII:bA@0eZ D8`zI-IIAff@0mvC5:ο*{IIIA@02H Yn|II-IIIA@0 Is>F}I-II A33@05ހL̾]~IIIAff@0"HjDA#6&I-IIA@0@4TA @ХI-IIA@12WްOHԵ&IIAff@1E#`MH_#>II-IIIAff@1J5BPQP4 I-IIA~ff@1 IK7C3I-IIA@1> >?II A@1Šq;sxMZII-IIIA@1SG19IIIAff@1Uΐ=U$I-IIA33@1a Nqt#IQL%>)H|I-IIA33@2ZYɕJ1PρII-IIIA33@2o@D?0KI M&IIIA@36qvI&&&BIII:<A33@3Kș!III8A33@4HOXNIIIA33@4#6'5G$zII:6Aff@4Bk>tw I-IIA@48VUCdIϏ4III:A@43ЁM0[EIIA@4T8N<0oI-IIA33@5#GzFZKIIIFA@5nx CaI-IIAff@5qM]IIAff@6JJ1I7IIIAy@7ls;E&IIA33@78XIxPE$I-IIA@7xkF@Ck(ƓII-III Aff@7gMD?!IIA@70@ixIAff@7I&;ЙzI-IIA@7,ܿP IIIA@7Lk"II Aff@7Ř:tPQFPII-IIIA@76JQ*YVsIIA@80ձasGg9II?6A@8H0N;C#(LIIIAff@8_3-+III2Aff@8'eLRe KIIA@9GA;C"I-IIAff@9 s1M$UIIIBAff@9md1III.A@9= [:EXIIIA@9)F38pIIIA33@9 B.II<\)A@9#O!s'II-IIIA@9H_-M7OqI-IIA@9Q TN1IIAff@: /NAMwII A@:9WU-qH'zFuI-IIA@:GŚ]7L9!>5III:gAff@:rTe<ٝߊII-IIIAff@:u23Ot8 ZIIIA@:C0 @MR<̕mIIAff@:SQBf~=III A33@:Cnv$+vp69 I-IIA33@>9 gD/XrWIIA@>ES8?DK2~IIA@>h[BNԕII-IIIA@>flFT`n?I-II A@>nWrHAs8VI-IIA@>K ?!II-IIIpA@?bEbOIIIAff@?v_UIe!PIII>/A@?\"LBgI-IIAff@?6FtMII:Aff@?bN;,I-IIA@@G;0M=aJ*KIII)Aff@@KZ+߂@III:A@@P4{sEp>IIA33@@]?4`BaqII-IIIAff@@|G쮘tII-III >` A@@C";m-II-IIIA33@@n@ III Aff@@[)fA1 4II-III:A@@YHU_M1IIIAff@@F@;u?IhA@@OwQ axGI-IIA@@qK@~ *ZIIIxAff@A4v=тNII-IIIA@AɾGUI= JA33@@ڧrTMG pIIIAff@A:@BP4y͍I-IIA@Ahq?joA2III:Aff@Alَ=tdͬPIII,A33@AU aYOuII A@B91$n\=ɨIIA@B"FJMto?IIIA@B9#pAÛ IIIIA@B$`KO/II=kCA@B-æO;I-IIA33@BReA7lGLIAt@B_N/iB_II-III-A@Bj g3-! IIA@BoHG<+W; IIIA@BdKkG" I-IIA@B`1 mt I-IIA~ff@B)I|v66& II-IIIAff@B7kA:U%>II-IIIA@B÷{gCrrIA@B45EPIII A@B=1]IA|@B剷}FL$*IIDA@D{Pѧ+IIIA33@E /*)jDa,I-IIA@E3v?1-I<}Ak33@E7,*Ab}.IIIAA@E=n{+Qo|>/II=pAff@Eu&SEe˩[0I-IIAff@E~pX KrP1IIIAA@E}CpD媐,2IIA@EY<-lI})Q[T3IIA~ff@EɔsI'wO4I-IIA@EjQkNܻEy5IIA@E:K#Hunt6IIIAff@E̻E;CPuy17I-IIIIA33@Fۭ@@w?II?<A@FlDv $f@I-IIA33@G)3-GcthAIIA@FES슄'BIA@G ,LT~OCIII:?A33@GegrG`TDII =oA@G]^9I־ ҕEIIA@Gl%}JFBFIIA33@G'R΄GII A@HoG]vI1HIIA@H-kHШ:II-II=YcAff@H$ ,IuJIIA@HD6idQ;KII-IIIA@H4IIIA@LGNk IIA@LmbkAPƈII-III?PA33@JsUg_MIIA@L_IA;KՖÒI-II=wA@L~u7Ы&III?GA@L5P$#ox#II-IIIA@M \5?ZVMII-IIIA@MXuGp^II-IIIA@MNƲ_fJYI-II =!aA33@MqaBI0]II?OA33@Me#@I-II=A~ff@N5V'FTLrFII-III=?HA@NU.O"TII=PA@N}Ҍ8PvR>II-IIIFA@NvnNh8ύIIAvff@NabWVEKI-II=A@Nu*sP}mII-IIIA@N%UCnݝMII: As33@N_3G$IIIA@NƢG>@(II-IIIA@NEp!E};kYIIIA@O"%6< II:AA@Nnn*F7nlIIIAff@N;mEiII=qA A@NsUN2I-IIA@OjNhK0IAvff@O@K38bII-IIIIAff@NէR-=IIA@O*^aNu$2IIA~ff@OELmicIII:[A@OHE*?I-IIA33@OMZQW'5IIA@O8׭OIehurI=pAff@P|X*tEtp IIA@P2QK^1vn|II?:A33@P+HE,.IIA@P,HFQgkIIA33@P+IG0O?IIIA@P;O3epIII`A@P=@TE;s I-IIA@PF32m9VIIfA33@PD~Ij~B7I-IIAff@PT$Z4f1tII?A@P^NE9/`UIII1A33@P8TR0IIA@Pp;#u F@ZIIAff@P| <-d>4}-IIIA@PzkIs@䅮I-IIAff@P:f;hn<DI-IIA{33@PpyQ(PI-II Aff@P4B%Jk}IIINA@P$JKA2jIIAff@QH[r6s?I-IIA@QN c,4DA^I-IIA@QAVndIB25IIA@QIqKZ[C0!-IIA~ff@QN~HIIA33@Qaf~? aIIA@Q\ RIhɆI=OA@PUsIs?II-IIIAff@QlpV̈́=Al6IIA~ff@QYRbRI±I-IIA@Q:tFSZIIA@QYlFQ̳I=_Ap@Qӡ'=BhYI-IIA@Q^#B!Bx4 RIA|@Q4H;5II Aff@Q%I|@k|6|?uI-IIA@QCq|54uIIAff@QuC25ήII Aff@Q45JG3rI-IIA@QܳGl/ I-IIA33@Q,\rmAw^IIAy@Q\kF] RI='Ay@Q_^BNnII-IIIAff@QNqvi=>BLJI-IIA@Q볖ڸVO;'ǀ SII<Al@R"JMLrI SIII=IRA33@R/{B}TIIIA@R7 GZII-III:CA33@RqK!d`IIIVA33@R8GMΩIIAy@R,8iJbIIIyA@RӒQA8C<II-IIIA33@RM-D7?Cf6IIA@S s!B>IIAff@S,RC접3II-IIIAff@S1N4mIIA33@SPM&MBvAI-IIA|@SwH'YE`OIIA@S}jD% 3I Ak33@T mMgrIA{33@Tu7Efk^qI-IIAx@UK2C"(IIIJA@UA1dDk^ I=At@UBqafMڻ-dI-IIA@U`ldH '4I=TAy@UeVGOZ7*IIA33@UH=ݴ IIA33@Uu@JN!IIAx@UȵJ@UvR"IIA@Um/xGr4E#IA@Uo&QEw֊Q$IIAff@Uꍊ@"9%I-II=%A@U9dQAdנd&IIAx@Uk\1Hԗ'IIIA@UBGL|#q(IIA@V yCL)IIIA@VCEz4\;:*II-III`A@VSUmBL&E+IA@VY{L*ENp,IIA@VWl7_KGLUZ-I-IIA33@V`!AMJ.IIAl@V*CYZ/IIAp@VCML~#0IAt@V07ߩNJ1IA{33@V6H$;Y2I-IIA@V$Z͊@^A,>3IIA@VSuLE`4IIA33@V۝#F I3̙5IIIA@VD3oFvyf6IIAy@VᆏOgP^7IAff@WHQ;,8I-IIA33@WGGSla9I=%TA33@W/;m@G;:IIA@W:.'a@;IA@W7 Ec%QIb=DMy>(BI-IIA@WC4CIIIA@W-QjIϢDIA@WgiQ78EIIA@W{0OvIȠ FIII:cAff@W暔:`>,GIIIA@W[8JVLHI-II=AA@WN\P;T}IIs|]II-IIIAff@]ڜ J|bB^I-II Aff@]QO2UFU R_IIIA@^Bk{6L=Ȟ`II-IIIA@^S.8%S}@aII-IIIA@_d;]o.CbIAff@_FT46cIIAff@_2DrG?dIIAff@`= :[7!0;eI-II Aff@aj7^1:fIIIgA@a 6 6TM kgI-IIAff@a) ;9]YhII:qAff@b` [4WViII:Avff@b1=n4jIIA@b>Ry>!nkIII?LA@bg : QlIAff@b8.@b#mIIIA@b8dCp#nI-IIA@bȑ3ƣoIAff@b+C%GmpIIA{33@b׆"#6DqIII;Aff@b.0@#f2CrI-IIA33@b AS]sI-IIA33@bY-tC@utIAq@bB(@?]o[uIIIA33@c "QE@!lvI-IIA@c MeCe,6wIAy@cRhiA  jxII-III A33@cp uBkË)yI-IIA33@c%IIA|@d@,vibuI-IIA33@dO GЅEEKIIA@d#"EDPp8I-IIA@d)`Ch3n^III7Aff@d1~$2v4L]III:Aff@d1L8+ =XDtXI-IIA33@d@M@l(I-IIA@dI(4ElۥGI-II A@d9~I-IIA@d3ͬH$AbIIA@dA7QwO0I-IIA@d@9|IA@dxw;gMI-II^Aff@ddwG .[$IIA@dnƦGugIIAvff@dyAB@MwdgI-II{A@ebb<ㆆƺII:oA@eoZ88P{IIA@e,O70<II-III A@e6\WNC9qIIAff@eHԦRDmѶI-II Aff@eNOW\>II_A33@e\˰UEDn#IAff@ekr!3FI-IIA33@enV1mA&I =@A|@e/=6͛~II-IIIA@e+B༦hIIA@e$=‚K8(UI-IIAff@eՂI_%3qII-IIIA@e~%7fGb'IIAff@eרK9]F4aI-IIAff@e#1}74III9Aff@e ^ѢGX軃'I-II A@e>ԟEijIIIA@f_b s:>I-IIA@foM@g׏2aIIAff@f0962@C1pIIA@f5>&@@g2^:IIAff@f9 b@UJRI-IIA@fFXT?;)vI-IIA@faz-uI-IIA33@fcZB6s$-I-IITA@fe0^8?F|I-II A@fjѽ->!IIA@fSD@IIA@f\O+3(yIIIA@fiYr\Qv@ձ!UͿIA@h|93IIA~ff@hfV4oIIA@hvLB>IIA@h3y4@I-IIAff@hDnFd:?2IIA@hFB0@y^6IIA@hO;>2IIAff@hّ @lII =qA@iDW,iI-IIAff@iRr;Ox|II-IIIA@i JAҶI=LcA@i:c$" I-IIA@iAzApV׉OI-IIA@i%='@F#]I-IIAff@i(eA{K IIA@iN4c(CI-II= 'Avff@iH+d:3 ;II A@iĻϠ$cA&~3jWI-II Ax@i-N{C.I-II=%A@i@.}IA@iB=IIIA@i,A}Q"IIA|@iGB4IIA33@j8@2gxIIA33@j#A.o$II:gA@j LC,Cip I-IIA33@j.9%|I-IIA@j3)IIA@j]#=@AGI1I Ay@j}A( qOII?Ax@j%L6wiI-II A@j|6K&BJII-IIIIA@jLEi;nAOIIAvff@j\vbE2 ۇII:,A33@j\? '&I-IIA@km)7I<IIA@kJ.@8ZIIA@kS2u I@;II-IIIJA33@kU7@WGjIA33@k`v?;g%II:A@kz,;<[II-III:fA@kk5BIEc]IIA@kSiCj3loI-IIA@k!ȎE%ԓmMIA@k&35\g<I-IIA@k%EaD-6D:II-III A@kەk#BYIAvff@kq`Bz+I-IIA@k@? I-IIA@li%B3 I-II<&Ai@l #^@@ . IIIA33@l22*BhT ItA@lU#?2s  IIIRA@l"FE>YcII:Aff@l']Õ-2?N@II-IIIA@lU!4}IIIAff@mK U\8]II A@mϾ7R II-IIIA@n$p؝U%/I-II A@n_JT<ƮIIA@n|ˀTTI-IIA@oNՒ3\^PIAff@p؀Uyѕˠ)II-IIIA33@p|reTK^CI A33@p/VTM^nI-IIA33@pbxG'P;0cIIA{33@ptjRS(>IIA@pĜtp Rݙ IIAff@pO^ P_! IIA|@pﱪS.II-IIIA@q8ջQ7II?PA@qPʹ7SJ\ IA@qM,IĔs!II=QN<Ax@qOkGw"IIA33@qe;4hR8S"#II-III?7A@qt?VP$II-III\A@qkO"6[%IIIIA@rX|W @$?IAff@rk:'DR)RM@II:A33@rgFkOT'BAII-IIIAff@r]FAf(1BIIAff@r(T;JPyCII=@Ay@rJ|@U,*DIAl@rی_1T~fcEII: Aff@r`N2ACl9|gFI-II:A@raDJvGI-II:=.}VAq@r͏JKc>HI-II:}JX-q]I-IIA33@sjS~[Lt^II-IIIAff@s ܖ{Cc&_I-IIA@s Vr;5`IIIxA@sܿ@*m\%uaIIA@s^OH|{ bI-II<Aq@sn8'MD~}cIIAff@s +o4QndI A@s'buDζj4oI-IIAff@sHSMM%pII Aff@sN LӢqII-IIIA@sMo2E LrI*b%u#I-II<Aff@sƲlCnI A33@s,ȘBf[fI <Ah@sYhD"]YI-II Aff@s}0QZK8R#II-IIIbA@s8SI-II:ZA@sL/`hEaE_=IIA33@s779xBIIIuA@sj¬I k II=?HA{33@sLr'E5IA|@sFNBɪ=oxI-IIA@s"%KE6:IIIAt@sxM@BP*III>;dA@so2ylEzUZIIIA33@soYI'WII-IIImAff@sv-P=xzIAff@sgbF:< \Y,I-IIA|@s C@b:IAvff@s~.B;I-IIAt@sfGZqE|~kj-I=GyAy@sXL:VL7{II-A@sRIDFjHOII}IRII-IIIAff@t^X2H;ߣtIIIA@t5@p^@}7?*I:7Aff@t#rlC3PIII A@t(RC7=III(A@tAI=iA@t:СJ II-IIIAff@t>\XJE|wIII =oA@tA߸$LjI-II:=MA33@tE]|nGO0dIIAx@tMd`R3PIIAff@tG;[A;.N$III/A@tHԉDv;5jIIIA@tOx\6yDQIII Anff@t]~idCk,QNJI-IIA@t_w4E(PIIA@t_pKrEfyFxIII:bA33@tdE8kO54 IIA@tf6 E0I fTu I-II:=ZAt@tfQE9($oIII:5Aff@tfgT,ASkII:A@th "GBeުI-II=A~ff@thB 'SII-III?A@t$UDIIIA33@tpș0G9?II-III:=t!Aq@too0C1X@m+I-II Aff@tu^X0ZP "#I-II=^iA@ttf;q5*LII-III A33@t}B-HEF9I*~I-IIA@t_L2jn0II:Aff@tK10*R IIA@t,ZK#CIII=!Ah@tZjP] IIAff@t=Mk35ּAIA@tq&lP` 0IIA@tsV*2W,-]IIAff@tz;QiWII:XA@t6lۇ$fA@t"{oA~M[IIAvff@tGyaLeVHII-IIINA33@t2#4NJI-IIA@tT@BwI-IIA33@t b&O5;II-IIIFA@tнSFII-IIIA@tլ.N%II=.}VA@t֐iE'fIA33@t؎a7oBYeJIIA@tތ;1&vq)IA@t4.NI-IIKAff@tAC:WKIIIjA33@t',[U4IIAff@t9>:֜IIIRA@twRO VI=.}VAff@tgSB;fIIIA@tRBDIIA@u zT XI-II=EAvff@t`/;EA-.2IIIA@t8\:CTDIIA33@t(>I8II-IIIUA@t_S$:] j~:#III`A@t1i˵;Y>II?BA@u lL=cII-III=hsA{33@t)"@LUǼIIIA@u>P\bIII=[A@uK!III=SA~ff@u-S:II-IIIA@uI!3O6II?`A@u q ;XJOBIIIIA@uRb-s߫IIAff@usWB 5d:III?]A@uRJfýIII A@ut% QadyGIAff@u[@ADIIIA33@uS'Je*jIII?UA@ur\ YAO-^ IIIA@u!9-F=կ)ƫ II?Aff@u'>%L#PLg IIIA@u'0C II-IIIA@u(n oGo/ IIIVAff@u,T+Qk,2I-IIA@u+ :J:٩I-II:=bA@u-%,<_̀OI:}A33@u.&CWA}iIII:<A@u/)mKC\yI-IIA@u1#z8W'ս4IA@u3BH:g-]III~A@u3Eh$CI*eII-IIIA@u49KF#n/IIA@u4]EC59I A@u;c ?Pz84IIlAff@u<>=CȉII-IIIA@u=e)B!_IIAx@u=ސR)B틓׻sII-IIIA33@u>;gxF$NƴNII-IIIA@u? O>(II-IIIA@u@6OR(IIA@uMMPCynII=&Avff@uRB仗 I-IIA@uXŦaQy8M!IA@u\bRn ?"II-IIIA@uZmE_|NZ#IIA@uZTsG$II=Ay@ugVUj%II=Aff@u`ƎDR%}3&I-IIA@uc$FBd6y'I-IIJA@ue%mT@m FO~(II-III?A@uePD4Bߖ)I<Ay@uhLG"T*II-III?=K)_Aff@uj;F\+II-III?A~ff@uk?73a,III?XA@ut; ?F-II-IIIA@uwEzyw".II-III A@uwmWȀ1-?J/I-II={JA@uJWcr0II-III:IA@u,n>I.=V1II:0A@u},˦HN2II-III?A33@ud7>3II-IIIA@up/DnD4II?ZA33@u}8GAd&D5II-III\>wA@u7Q(h86I-IIA@u=gjJ~rg7II:+A@u^IEL8III='Aff@u&Qu)>9I-IIAff@uo H= $:III?A@uA~=HJа;II)A@ux$ E,jgI-IIA@u zQiRw)?II:A@uZ݊I;O?@II-III:^A33@uX5G$>+AIII?A@us CT<>BII3A@uU}CIA33@u'q80)ʸ1DIIIA@u wS h\UK/EII-IIIA@u8V72fv<FIII?(A@u a_Ke$GIII<A@uc{=FHI-IIA@utݱ޴RTxKIII-IIIA33@uoME;JIAff@u e7$9ZKI-IIA@u@WJ%|LIIIUA@u揤E]`4aMIII=gAff@uWK)b{ԝNIIIA33@uJ`$hF%E OII-IIIA@umQ*RzZGVIIIIA@uܗE nvWIIIAvff@uad3{K [UXIIIA@u5%Ѝ8 E4u]YIIA@uR9hZIIAff@u" KcGw[IIIAff@uꛁePW\I-II:;A@ux6L]IIIA@u&~II^IIA@uC\BC,UmII-IIIAff@v|EnIIA33@v8YٔvII-III=Ax@vCl%1M'Hh^wII A@vDڹ_OŞxIII Aff@vE?H8L0:yIIA@vGˊ)7AhȄzI-IIA~ff@vI)(lG|n+{I-II=bNAff@vJm1;DP6NA|II-III$A@vNeY RW}I-IIA33@vO=\hAZP~I-II_Aff@vQ0|<\,1II>glA@vRaE{IIIA@vUNB#GͳtIA@vU薹FOwIII A@vX~ #=E@WI-IIAvff@vYCPmIIIAff@v_ޭA5]II:=:Ak33@v`DmK3[II A@vfb,P@ҎmII-IIIA@vgHF/$NjII-III:BA@vnSHV@՟7IIIAff@voD-6kII-IIIA33@vo⛷2+).IIA~ff@vvNBϏ4IIIA33@vz+=IvXI-II<Ax@v~P'IIA?3Q|IIINA?mMJ$III:A?~^G3TOI-II A?SZ*BkJ 0ϊI-IIA?b;;yIIA~ff?̎CbHrI=LA?+oE8RpIIIAvff?B~}WIA33astrometry.net-0.67/catalogs/brightstars-data.c000644 000765 000024 00000652173 12651445460 022010 0ustar00dstnstaff000000 000000 // Autogenerated by bake_catalog.py { { "33Psc", "", 1.3337, -5.7075, 4.6 }, { "86Peg", "", 1.4250, 13.3961, 5.5 }, { "", "", 1.5667, 58.4367, 5.9 }, { "", "", 1.5792, -49.0750, 5.7 }, { "10Cas", "", 1.6104, 64.1961, 5.5 }, { "", "", 1.9450, -22.5089, 5.9 }, { "", "", 2.0146, -33.5294, 5.6 }, { "\xce\xb1""And", "Alpheratz", 2.0971, 29.0906, 2.0 }, { "", "", 2.0725, -8.8239, 5.9 }, { "\xce\xb2""Cas", "Caph", 2.2946, 59.1497, 2.2 }, { "87Peg", "", 2.2600, 18.2119, 5.5 }, { "\xce\xba""1Scl", "", 2.3375, -27.9878, 5.4 }, { "\xce\xb5""Phe", "", 2.3529, -45.7475, 3.8 }, { "34Psc", "", 2.5096, 11.1456, 5.5 }, { "22And", "", 2.5804, 46.0722, 5.0 }, { "", "", 2.5783, -5.2486, 5.8 }, { "\xce\xb3""3Oct", "", 2.5087, -82.2239, 5.2 }, { "", "", 2.6783, -12.5800, 5.8 }, { "6Cet", "", 2.8163, -15.4681, 4.8 }, { "\xce\xba""2Scl", "", 2.8933, -27.7997, 5.4 }, { "\xce\xb8""Scl", "", 2.9333, -35.1331, 5.2 }, { "", "", 3.0417, -17.9383, 5.2 }, { "\xce\xb3""Peg", "Algenib", 3.3092, 15.1836, 2.8 }, { "23And", "", 3.3783, 41.0353, 5.7 }, { "", "", 3.4254, -26.0219, 5.9 }, { "\xcf\x87""Peg", "", 3.6508, 20.2067, 4.8 }, { "", "", 3.6150, -7.7806, 5.1 }, { "", "", 3.3308, -84.9942, 5.7 }, { "7Cet", "", 3.6600, -18.9328, 4.4 }, { "35Psc", "", 3.7450, 8.8208, 5.7 }, { "", "", 3.7271, -9.5697, 5.7 }, { "", "", 4.0371, -31.4464, 5.6 }, { "", "", 4.2379, 61.5333, 5.7 }, { "", "", 4.2879, 47.9475, 5.8 }, { "\xce\xb8""And", "", 4.2729, 38.6817, 4.6 }, { "\xcf\x83""And", "", 4.5821, 36.7853, 4.5 }, { "", "", 4.6596, 31.5172, 5.8 }, { "\xce\xb9""Cet", "", 4.8571, -8.8239, 3.5 }, { "\xce\xb6""Tuc", "", 5.0179, -64.8747, 4.2 }, { "", "", 5.1017, 30.9358, 5.9 }, { "", "", 5.1896, 32.9114, 5.7 }, { "41Psc", "", 5.1496, 8.1903, 5.3 }, { "\xcf\x81""And", "", 5.2804, 37.9686, 5.1 }, { "\xcf\x80""Tuc", "", 5.1625, -69.6250, 5.5 }, { "\xce\xb9""Scl", "", 5.3800, -28.9817, 5.1 }, { "", "", 5.4429, -20.0578, 5.1 }, { "", "", 5.3692, -77.4269, 5.9 }, { "", "", 6.0650, 52.0200, 5.5 }, { "12Cas", "", 6.1979, 61.8311, 5.4 }, { "", "", 6.2767, 53.0469, 5.7 }, { "44Psc", "", 6.3508, 1.9397, 5.7 }, { "\xce\xb2""Hyi", "", 6.4379, -77.2542, 2.8 }, { "\xce\xb1""Phe", "Ankaa", 6.5708, -42.3061, 2.3 }, { "\xce\xba""Phe", "", 6.5508, -43.6800, 3.9 }, { "", "", 6.8113, -25.5472, 5.9 }, { "47Psc", "", 7.0121, 17.8931, 5.0 }, { "", "", 7.0571, 44.3944, 5.1 }, { "\xce\xb7""Scl", "", 6.9821, -33.0072, 4.8 }, { "", "", 7.1100, -39.9150, 5.4 }, { "", "", 7.5829, 59.9772, 5.9 }, { "28And", "", 7.5304, 29.7517, 5.2 }, { "12Cet", "", 7.5100, -3.9572, 5.7 }, { "", "", 7.5946, -23.7878, 5.1 }, { "", "", 7.6087, -48.2150, 5.6 }, { "", "", 7.8567, 33.5817, 5.8 }, { "\xce\xbb""Cas", "", 7.9433, 54.5222, 4.7 }, { "", "", 7.9217, 52.8394, 5.6 }, { "\xce\xbb""1Phe", "", 7.8542, -48.8036, 4.7 }, { "\xce\xb2""1Tuc", "", 7.8863, -62.9581, 4.3 }, { "\xce\xb2""2Tuc", "", 7.8900, -62.9658, 4.5 }, { "\xce\xba""Cas", "", 8.2500, 62.9317, 4.1 }, { "52Psc", "", 8.1479, 20.2944, 5.3 }, { "51Psc", "", 8.0992, 6.9556, 5.6 }, { "", "", 8.2933, 54.8950, 5.9 }, { "\xce\xb2""3Tuc", "", 8.1825, -63.0311, 5.0 }, { "", "", 8.4213, -29.5583, 5.5 }, { "", "", 8.6158, -52.3731, 5.5 }, { "13Cet", "", 8.8121, -3.5928, 5.2 }, { "14Cet", "", 8.8867, -0.5056, 5.9 }, { "", "", 9.0346, 54.1686, 5.0 }, { "", "", 9.1137, 60.3261, 5.7 }, { "\xce\xbb""2Phe", "", 8.9213, -48.0008, 5.5 }, { "", "", 9.1942, 44.4886, 5.1 }, { "\xce\xb6""Cas", "", 9.2429, 53.8969, 3.6 }, { "\xcf\x80""And", "", 9.2204, 33.7194, 4.3 }, { "53Psc", "", 9.1971, 15.2317, 5.8 }, { "", "", 9.3379, 35.3994, 5.4 }, { "", "", 9.3363, -24.7672, 5.5 }, { "\xce\xb5""And", "", 9.6387, 29.3117, 4.3 }, { "", "", 9.7913, 49.3544, 5.4 }, { "\xce\xb4""And", "", 9.8321, 30.8608, 3.2 }, { "54Psc", "", 9.8408, 21.2506, 5.8 }, { "55Psc", "", 9.9817, 21.4383, 5.3 }, { "\xce\xb1""Cas", "Schedar", 10.1271, 56.5372, 2.2 }, { "", "", 10.1767, -4.3519, 5.9 }, { "32And", "", 10.2800, 39.4586, 5.3 }, { "", "", 10.1100, -59.4544, 5.8 }, { "", "", 10.5142, 66.1475, 5.8 }, { "\xce\xbe""Cas", "", 10.5162, 50.5125, 4.8 }, { "\xce\xbc""Phe", "", 10.3317, -46.0850, 4.5 }, { "\xce\xbe""Phe", "", 10.4433, -56.5017, 5.7 }, { "\xcf\x80""Cas", "", 10.8671, 47.0247, 4.9 }, { "", "", 10.6742, -60.2625, 5.9 }, { "\xcf\x81""Tuc", "", 10.6183, -65.4681, 5.3 }, { "\xce\xb2""Cet", "Deneb Kaitos / Diphda", 10.8975, -17.9867, 2.0 }, { "", "", 11.1100, 47.8642, 5.6 }, { "\xce\xb7""Phe", "", 10.8383, -57.4631, 4.3 }, { "21Cas", "", 11.4125, 74.9881, 5.6 }, { "\xce\xbf""Cas", "", 11.1812, 48.2844, 4.5 }, { "\xcf\x86""1Cet", "", 11.0475, -10.6094, 4.7 }, { "\xce\xbb""2Scl", "", 11.0504, -38.4217, 5.9 }, { "", "", 11.3217, 55.2217, 5.4 }, { "", "", 11.1850, -22.0061, 5.2 }, { "", "", 11.2379, -42.6767, 5.9 }, { "23Cas", "", 11.9421, 74.8475, 5.4 }, { "", "", 11.4400, -47.5517, 5.8 }, { "", "", 11.5492, -22.5219, 5.5 }, { "57Psc", "", 11.6375, 15.4756, 5.3 }, { "", "", 12.0379, 72.6750, 5.8 }, { "58Psc", "", 11.7562, 11.9739, 5.5 }, { "\xce\xb6""And", "", 11.8346, 24.2672, 4.0 }, { "60Psc", "", 11.8483, 6.7408, 5.9 }, { "", "", 11.9304, -18.0614, 5.7 }, { "\xce\xb7""Cas", "", 12.2750, 57.8158, 3.4 }, { "", "", 12.0046, -21.7225, 5.5 }, { "62Psc", "", 12.0725, 7.3000, 5.9 }, { "", "", 12.0958, 5.2806, 5.7 }, { "\xce\xbd""Cas", "", 12.2088, 50.9683, 4.8 }, { "\xce\xb4""Psc", "", 12.1708, 7.5850, 4.4 }, { "64Psc", "", 12.2446, 16.9406, 5.0 }, { "\xce\xbd""And", "", 12.4533, 41.0789, 4.5 }, { "", "", 12.3567, -13.5614, 5.5 }, { "", "", 12.3079, -24.1364, 5.9 }, { "", "", 12.6817, 64.2475, 5.3 }, { "\xcf\x86""2Cet", "", 12.5317, -10.6444, 5.1 }, { "\xce\xbb""Hyi", "", 12.1475, -74.9233, 5.0 }, { "", "", 13.7213, 83.7072, 5.6 }, { "\xcf\x81""Phe", "", 12.6717, -50.9869, 5.2 }, { "", "", 13.2671, 61.1242, 4.8 }, { "", "", 13.1692, -24.0058, 5.4 }, { "20Cet", "", 13.2521, -1.1442, 4.7 }, { "\xcf\x85""1Cas", "", 13.7504, 58.9728, 4.8 }, { "66Psc", "", 13.6467, 19.1883, 5.7 }, { "", "", 13.4079, -62.8714, 5.7 }, { "36And", "", 13.7417, 23.6283, 5.4 }, { "", "", 13.9267, -7.3472, 5.8 }, { "\xce\xb3""Cas", "Navi", 14.1771, 60.7167, 2.4 }, { "\xcf\x85""2Cas", "", 14.1658, 59.1811, 4.6 }, { "", "", 14.1963, 60.3628, 5.5 }, { "\xcf\x86""3Cet", "", 14.0062, -11.2667, 5.3 }, { "\xce\xbc""And", "", 14.1883, 38.4994, 3.8 }, { "\xce\xbb""2Tuc", "", 13.7512, -69.5269, 5.4 }, { "\xce\xb7""And", "", 14.3017, 23.4175, 4.4 }, { "", "", 14.6296, 66.3522, 5.9 }, { "68Psc", "", 14.4592, 28.9922, 5.4 }, { "", "", 14.5592, 33.9508, 5.9 }, { "\xcf\x86""4Cet", "", 14.6829, -11.3800, 5.6 }, { "\xce\xb1""Scl", "", 14.6517, -29.3575, 4.3 }, { "", "", 17.1863, 86.2569, 4.2 }, { "\xce\xbe""Scl", "", 15.3262, -38.9167, 5.5 }, { "39And", "", 15.7263, 41.3450, 5.9 }, { "\xcf\x83""Psc", "", 15.7046, 31.8044, 5.5 }, { "", "", 15.9042, 61.0750, 5.9 }, { "\xcf\x83""Scl", "", 15.6100, -31.5519, 5.5 }, { "\xce\xb5""Psc", "", 15.7358, 7.8900, 4.2 }, { "25Cet", "", 15.7608, -4.8367, 5.4 }, { "", "", 16.0817, 61.5803, 5.8 }, { "", "", 16.0100, 52.5022, 5.9 }, { "", "", 15.7050, -46.3975, 5.3 }, { "72Psc", "", 16.2725, 14.9461, 5.6 }, { "\xcf\x88""1Psc", "", 16.4204, 21.4733, 5.3 }, { "\xcf\x88""1Psc", "", 16.4237, 21.4653, 5.5 }, { "28Cet", "", 16.5213, -9.8394, 5.5 }, { "\xce\xbc""Cas", "", 17.0683, 54.9203, 5.1 }, { "\xce\xb2""Phe", "", 16.5208, -46.7186, 3.3 }, { "41And", "", 17.0038, 43.9419, 5.0 }, { "", "", 17.1387, 58.2636, 5.7 }, { "\xcf\x88""2Psc", "", 16.9883, 20.7392, 5.5 }, { "30Cet", "", 16.9425, -9.7856, 5.8 }, { "80Psc", "", 17.0925, 5.6497, 5.5 }, { "\xcf\x85""Phe", "", 16.9496, -41.4869, 5.2 }, { "\xce\xb9""Tuc", "", 16.8279, -61.7753, 5.3 }, { "", "", 18.0696, 79.6739, 5.6 }, { "\xce\xb7""Cet", "", 17.1475, -10.1822, 3.4 }, { "\xcf\x86""And", "", 17.3758, 47.2419, 4.2 }, { "31Cas", "", 17.6638, 68.7786, 5.2 }, { "\xce\xb2""And", "Mirach", 17.4329, 35.6206, 2.0 }, { "\xce\xb6""Phe", "", 17.0963, -55.2458, 3.9 }, { "\xcf\x88""3Psc", "", 17.4550, 19.6586, 5.5 }, { "44And", "", 17.5783, 42.0814, 5.6 }, { "", "", 17.5808, 25.4578, 5.8 }, { "", "", 17.8567, 64.2028, 5.5 }, { "\xce\xb8""Cas", "", 17.7758, 55.1497, 4.3 }, { "32Cas", "", 17.9225, 65.0189, 5.5 }, { "33Cet", "", 17.6400, 2.4456, 5.9 }, { "45And", "", 17.7929, 37.7242, 5.8 }, { "82Psc", "", 17.7783, 31.4247, 5.1 }, { "\xcf\x87""Psc", "", 17.8633, 21.0347, 4.6 }, { "\xcf\x84""Psc", "", 17.9150, 30.0897, 4.5 }, { "34Cet", "", 17.9312, -2.2511, 5.9 }, { "", "", 18.1892, -37.8564, 5.9 }, { "\xcf\x86""Psc", "", 18.4371, 24.5836, 4.6 }, { "\xce\xb6""Psc", "", 18.4329, 7.5753, 5.2 }, { "87Psc", "", 18.5317, 16.1336, 5.9 }, { "37Cet", "", 18.6000, -7.9231, 5.1 }, { "38Cet", "", 18.7050, -0.9739, 5.7 }, { "\xce\xbd""Phe", "", 18.7963, -45.5314, 4.9 }, { "39Cet", "", 19.1512, -2.5003, 5.4 }, { "\xce\xba""Tuc", "", 18.9421, -68.8761, 4.8 }, { "89Psc", "", 19.4500, 3.6144, 5.1 }, { "\xcf\x86""Cas", "", 20.0204, 58.2317, 4.9 }, { "\xcf\x85""Psc", "", 19.8667, 27.2642, 4.7 }, { "42Cet", "", 19.9512, -0.5089, 5.8 }, { "91Psc", "", 20.2808, 28.7381, 5.2 }, { "\xce\xbe""And", "", 20.5850, 45.5289, 4.8 }, { "47And", "", 20.9192, 37.7150, 5.5 }, { "", "", 20.8537, 20.4689, 5.9 }, { "\xcf\x88""Cas", "", 21.4833, 68.1300, 4.7 }, { "", "", 20.8792, -30.9456, 5.8 }, { "\xce\xb8""Cet", "", 21.0058, -8.1833, 3.6 }, { "\xce\xb4""Cas", "Ruchbah", 21.4542, 60.2353, 2.6 }, { "", "", 21.0858, -6.9147, 5.9 }, { "", "", 21.1700, -41.4925, 5.4 }, { "", "", 21.5775, 43.4578, 5.9 }, { "46Cet", "", 21.4050, -14.5989, 4.9 }, { "\xcf\x81""Psc", "", 21.5638, 19.1722, 5.3 }, { "94Psc", "", 21.6737, 19.2403, 5.5 }, { "\xcf\x89""And", "", 21.9142, 45.4067, 4.8 }, { "", "", 21.2721, -64.3694, 5.9 }, { "47Cet", "", 21.7150, -13.0567, 5.6 }, { "", "", 21.7421, -32.5431, 5.7 }, { "\xce\xb1""UMi", "Polaris", 37.9529, 89.2642, 2.0 }, { "38Cas", "", 22.8075, 70.2647, 5.8 }, { "\xce\xb3""Phe", "", 22.0913, -43.3183, 3.4 }, { "49And", "", 22.5258, 47.0072, 5.2 }, { "48Cet", "", 22.4004, -21.6294, 5.1 }, { "\xce\xbc""Psc", "", 22.5463, 6.1439, 4.8 }, { "", "", 22.5954, -26.2078, 5.9 }, { "\xce\xb7""Psc", "", 22.8708, 15.3458, 3.6 }, { "", "", 23.3575, 58.3275, 5.7 }, { "\xce\xb4""Phe", "", 22.8129, -49.0728, 3.9 }, { "", "", 22.9304, -30.2833, 5.8 }, { "\xcf\x87""Cas", "", 23.4829, 59.2319, 4.7 }, { "", "", 23.2333, -36.8653, 5.5 }, { "", "", 23.5692, 37.2372, 5.8 }, { "", "", 23.4288, -7.0253, 5.7 }, { "", "", 23.7046, 18.4606, 5.8 }, { "49Cet", "", 23.6575, -15.6761, 5.6 }, { "", "", 24.1133, 48.7228, 5.9 }, { "40Cas", "", 24.6288, 73.0400, 5.2 }, { "", "", 23.9783, 17.4336, 5.8 }, { "\xcf\x85""And", "", 24.1992, 41.4056, 4.0 }, { "50Cet", "", 23.9958, -15.4003, 5.4 }, { "", "", 24.5317, 57.9775, 5.5 }, { "\xcf\x84""Scl", "", 24.0350, -29.9075, 5.6 }, { "\xcf\x80""Psc", "", 24.2746, 12.1417, 5.5 }, { "51And", "", 24.4983, 48.6283, 3.5 }, { "\xcf\x87""And", "", 24.8375, 44.3861, 4.9 }, { "", "", 24.6142, -36.5283, 5.9 }, { "\xce\xb1""Eri", "Achernar / Archenar", 24.4288, -57.2367, 0.4 }, { "", "", 24.7158, -21.2753, 5.5 }, { "105Psc", "", 24.9200, 16.4058, 5.9 }, { "", "", 25.1658, 43.2978, 5.6 }, { "\xcf\x84""And", "", 25.1450, 40.5769, 4.9 }, { "43Cas", "", 25.5854, 68.0431, 5.5 }, { "42Cas", "", 25.7329, 70.6225, 5.1 }, { "", "", 25.4467, 42.6136, 4.9 }, { "", "", 25.4133, 30.0472, 5.9 }, { "", "", 24.9475, -56.1981, 5.8 }, { "", "", 24.9492, -56.1947, 5.7 }, { "\xce\xbd""Psc", "", 25.3579, 5.4875, 4.4 }, { "", "", 25.5146, 35.2456, 5.6 }, { "44Cas", "", 25.8321, 60.5511, 5.7 }, { "", "", 25.4363, -11.3247, 5.7 }, { "107Psc", "", 25.6242, 20.2686, 5.2 }, { "\xcf\x86""Per", "", 25.9150, 50.6886, 4.0 }, { "\xcf\x80""Scl", "", 25.5358, -32.3269, 5.2 }, { "", "", 25.5125, -36.8325, 5.7 }, { "", "", 25.6812, -3.6903, 4.9 }, { "", "", 25.4500, -60.7894, 5.7 }, { "", "", 25.6221, -53.7406, 5.5 }, { "\xcf\x84""Cet", "", 26.0171, -15.9375, 3.5 }, { "\xce\xbf""Psc", "", 26.3483, 9.1578, 4.2 }, { "", "", 26.9367, 63.8522, 5.6 }, { "", "", 24.4817, -82.9750, 5.8 }, { "", "", 26.4971, -5.7333, 5.3 }, { "\xce\xb5""Scl", "", 26.4117, -25.0525, 5.3 }, { "", "", 26.5242, -50.8164, 5.4 }, { "", "", 26.5262, -53.5219, 5.0 }, { "", "", 27.1621, 37.9528, 5.9 }, { "4Ari", "", 27.0454, 16.9556, 5.8 }, { "", "", 27.1733, 32.6903, 5.7 }, { "", "", 24.3667, -84.7697, 5.6 }, { "", "", 27.3154, 47.8969, 5.8 }, { "", "", 27.1083, 3.6856, 5.9 }, { "", "", 27.7379, 51.9333, 5.9 }, { "1Ari", "", 27.5354, 22.2753, 5.8 }, { "\xcf\x87""Cet", "", 27.3962, -10.6864, 4.6 }, { "1Per", "", 27.9971, 55.1475, 5.5 }, { "", "", 27.7167, 11.0433, 5.9 }, { "2Per", "", 28.0392, 50.7928, 5.7 }, { "\xce\xb6""Cet", "Baten Kaitos", 27.8650, -10.3350, 3.7 }, { "", "", 27.7271, -50.2061, 5.9 }, { "\xce\xb5""Cas", "", 28.5987, 63.6700, 3.3 }, { "55And", "", 28.3221, 40.7297, 5.4 }, { "\xce\xb1""Tri", "Mothallah", 28.2704, 29.5789, 3.4 }, { "\xce\xb3""1Ari", "", 28.3825, 19.2958, 4.8 }, { "\xce\xb3""2Ari", "Mesarthim", 28.3825, 19.2936, 4.7 }, { "", "", 28.2171, -16.9292, 5.8 }, { "\xcf\x89""Cas", "", 29.0000, 68.6853, 4.9 }, { "\xce\xbe""Psc", "", 28.3887, 3.1875, 4.6 }, { "\xce\xb2""Ari", "Sheratan", 28.6600, 20.8081, 2.6 }, { "\xcf\x88""Phe", "", 28.4117, -46.3025, 4.4 }, { "", "", 28.9767, 37.2778, 5.8 }, { "56And", "", 29.0388, 37.2517, 5.6 }, { "\xcf\x86""Phe", "", 28.5917, -42.4969, 5.1 }, { "7Ari", "", 28.9625, 23.5772, 5.7 }, { "\xce\xb9""Ari", "", 29.3379, 17.8175, 5.1 }, { "", "", 29.4325, 27.8044, 5.8 }, { "56Cet", "", 29.1675, -22.5269, 4.8 }, { "\xcf\x87""Eri", "", 28.9896, -51.6089, 3.7 }, { "", "", 29.9083, 64.6214, 5.2 }, { "3Per", "", 29.6400, 49.2042, 5.6 }, { "\xce\xbb""Ari", "", 29.4821, 23.5961, 4.7 }, { "\xce\xb7""2Hyi", "", 28.7337, -67.6472, 4.6 }, { "", "", 29.2917, -47.3850, 4.8 }, { "48Cas", "", 30.4892, 70.9069, 4.5 }, { "", "", 29.8987, 21.0583, 5.8 }, { "50Cas", "", 30.8587, 72.4214, 3.9 }, { "47Cas", "", 31.2808, 77.2814, 5.3 }, { "112Psc", "", 30.0383, 3.0972, 5.8 }, { "57Cet", "", 29.9421, -20.8244, 5.4 }, { "\xcf\x85""Cet", "", 30.0013, -21.0778, 4.0 }, { "", "", 30.1121, -8.5236, 5.5 }, { "", "", 29.9117, -42.0306, 5.5 }, { "53Cas", "", 30.7512, 64.3900, 5.5 }, { "4Per", "", 30.5754, 54.4875, 5.0 }, { "\xce\xb1""Hyi", "", 29.6925, -61.5697, 2.8 }, { "49Cas", "", 31.3800, 76.1150, 5.2 }, { "\xcf\x80""For", "", 30.3113, -30.0017, 5.3 }, { "\xce\xb1""Psc", "Alrescha", 30.5117, 2.7636, 5.2 }, { "\xce\xb1""Psc", "Alrescha", 30.5117, 2.7636, 4.3 }, { "\xce\xb5""Tri", "", 30.7417, 33.2839, 5.5 }, { "", "", 30.6467, 13.4767, 5.9 }, { "\xcf\x87""Phe", "", 30.4267, -44.7136, 5.1 }, { "\xce\xb3""1And", "Almach", 30.9750, 42.3297, 2.2 }, { "\xce\xb3""2And", "", 30.9779, 42.3308, 4.8 }, { "10Ari", "", 30.9137, 25.9356, 5.6 }, { "60Cet", "", 30.7987, 0.1283, 5.4 }, { "", "", 30.7442, -15.3058, 5.8 }, { "61Cet", "", 30.9508, -0.3403, 5.9 }, { "", "", 30.9187, -4.1036, 5.6 }, { "\xce\xbd""For", "", 31.1225, -29.2969, 4.6 }, { "\xce\xba""Ari", "", 31.6412, 22.6483, 5.0 }, { "\xce\xb1""Ari", "Hamal", 31.7933, 23.4625, 2.0 }, { "", "", 32.1688, 58.4236, 5.6 }, { "58And", "", 32.1221, 37.8592, 4.8 }, { "\xce\xb2""Tri", "", 32.3858, 34.9872, 3.0 }, { "14Ari", "", 32.3554, 25.9397, 4.9 }, { "59And", "", 32.7200, 39.0394, 5.6 }, { "15Ari", "", 32.6567, 19.5003, 5.7 }, { "", "", 32.2888, -43.5167, 5.8 }, { "64Cet", "", 32.8379, 8.5697, 5.6 }, { "63Cet", "", 32.8992, -1.8253, 5.9 }, { "6Tri", "", 33.0929, 30.3031, 4.9 }, { "60And", "", 33.3054, 44.2317, 4.8 }, { "", "", 33.1562, 24.1678, 5.9 }, { "", "", 33.4012, 51.0658, 5.3 }, { "\xce\xb7""Ari", "", 33.2004, 21.2108, 5.2 }, { "19Ari", "", 33.2638, 15.2797, 5.7 }, { "\xce\xbe""1Cet", "", 33.2500, 8.8467, 4.3 }, { "66Cet", "", 33.1979, -2.3936, 5.5 }, { "", "", 33.2537, -21.0003, 5.8 }, { "\xce\xbc""For", "", 33.2271, -30.7239, 5.2 }, { "7Tri", "", 33.9842, 33.3589, 5.2 }, { "20Ari", "", 33.9417, 25.7831, 5.7 }, { "21Ari", "", 33.9283, 25.0431, 5.5 }, { "", "", 33.6333, -41.1667, 5.9 }, { "\xce\xb4""Tri", "", 34.2633, 34.2242, 4.8 }, { "8Per", "", 34.4996, 57.8997, 5.7 }, { "7Per", "", 34.5187, 57.5167, 5.9 }, { "\xce\xb3""Tri", "", 34.3287, 33.8472, 4.0 }, { "67Cet", "", 34.2458, -6.4222, 5.5 }, { "\xcf\x80""1Hyi", "", 33.5613, -67.8417, 5.5 }, { "\xce\xb8""Ari", "", 34.5312, 19.9011, 5.6 }, { "62And", "", 34.8200, 47.3800, 5.3 }, { "", "", 34.5058, 1.7578, 5.5 }, { "\xcf\x86""Eri", "", 34.1275, -51.5122, 3.5 }, { "10Tri", "", 34.7375, 28.6425, 5.0 }, { "\xcf\x80""2Hyi", "", 33.8687, -67.7464, 5.6 }, { "\xce\xbf""Cet", "Mira", 34.8362, -2.9775, 3.0 }, { "63And", "", 35.2425, 50.1514, 5.5 }, { "9Per", "", 35.5892, 55.8456, 5.1 }, { "", "", 35.7096, 41.3964, 5.8 }, { "", "", 34.9762, -55.9447, 5.8 }, { "69Cet", "", 35.4858, 0.3958, 5.2 }, { "70Cet", "", 35.5517, -0.8850, 5.4 }, { "", "", 35.5058, -10.7778, 5.4 }, { "", "", 35.5208, -17.6622, 5.8 }, { "64And", "", 36.1037, 50.0067, 5.1 }, { "\xce\xba""For", "", 35.6358, -23.8164, 5.2 }, { "65And", "", 36.4058, 50.2786, 4.7 }, { "", "", 35.7275, -51.0922, 5.9 }, { "\xce\xbe""Ari", "", 36.2042, 10.6106, 5.4 }, { "\xce\xb4""Hyi", "", 35.4371, -68.6594, 4.0 }, { "\xce\xb9""Cas", "", 37.2667, 67.4025, 4.5 }, { "\xcf\x81""Cet", "", 36.4875, -12.2906, 4.8 }, { "", "", 36.5013, -15.3411, 5.8 }, { "11Tri", "", 36.8654, 31.8014, 5.5 }, { "", "", 36.6467, -20.0428, 5.8 }, { "\xce\xbb""Hor", "", 36.2246, -60.3119, 5.3 }, { "\xce\xba""Hyi", "", 35.7179, -73.6458, 5.0 }, { "12Tri", "", 37.0417, 29.6694, 5.2 }, { "\xce\xbe""2Cet", "", 37.0396, 8.4600, 4.2 }, { "13Tri", "", 37.2021, 29.9319, 5.8 }, { "\xce\xba""Eri", "", 36.7463, -47.7039, 4.2 }, { "\xcf\x86""For", "", 37.0071, -33.8111, 5.1 }, { "", "", 37.6350, 25.2350, 5.9 }, { "14Tri", "", 38.0258, 36.1472, 5.1 }, { "", "", 37.8754, 2.2672, 5.2 }, { "", "", 38.2188, 34.5425, 5.8 }, { "75Cet", "", 38.0392, -1.0350, 5.3 }, { "\xcf\x83""Cet", "", 38.0217, -15.2447, 4.7 }, { "", "", 39.5083, 72.8183, 5.1 }, { "\xce\xbb""1For", "", 38.2792, -34.6500, 5.9 }, { "", "", 39.4004, 65.7456, 5.7 }, { "", "", 38.9117, 37.3122, 5.7 }, { "\xcf\x89""For", "", 38.4612, -28.2325, 4.9 }, { "15Tri", "", 38.9450, 34.6875, 5.3 }, { "77Cet", "", 38.6779, -7.8594, 5.7 }, { "", "", 39.0204, 6.8869, 5.8 }, { "\xce\xbd""Cet", "", 38.9688, 5.5933, 4.8 }, { "", "", 39.2383, 38.7328, 5.9 }, { "", "", 39.2604, 34.2639, 5.3 }, { "80Cet", "", 39.0000, -7.8317, 5.5 }, { "31Ari", "", 39.1579, 12.4475, 5.6 }, { "", "", 39.1463, 7.7297, 5.8 }, { "\xce\xb9""1For", "", 39.0388, -30.0447, 5.7 }, { "81Cet", "", 39.4242, -3.3961, 5.6 }, { "\xce\xbb""2For", "", 39.2442, -34.5783, 5.7 }, { "\xce\xbd""Ari", "", 39.7042, 21.9614, 5.4 }, { "", "", 41.9483, 81.4483, 5.7 }, { "\xce\xbc""Hyi", "", 37.9187, -79.1094, 5.2 }, { "\xce\xb9""2For", "", 39.5779, -30.1942, 5.8 }, { "\xce\xb7""Hor", "", 39.3517, -52.5431, 5.3 }, { "\xce\xb4""Cet", "", 39.8708, 0.3286, 4.0 }, { "\xce\xb5""Cet", "", 39.8908, -11.8722, 4.8 }, { "33Ari", "", 40.1713, 27.0608, 5.3 }, { "", "", 40.0513, -9.4531, 5.7 }, { "11Per", "", 40.7617, 55.1058, 5.7 }, { "", "", 40.7488, 53.5261, 5.8 }, { "12Per", "", 40.5621, 40.1939, 4.9 }, { "", "", 39.9500, -42.8917, 4.7 }, { "84Cet", "", 40.3079, -0.6958, 5.7 }, { "", "", 41.2071, 67.8247, 5.9 }, { "\xce\xbc""Ari", "", 40.5917, 20.0117, 5.6 }, { "\xce\xb9""Eri", "", 40.1667, -39.8556, 4.1 }, { "", "", 40.3917, -14.5494, 5.9 }, { "\xce\xb8""Per", "", 41.0500, 49.2283, 4.1 }, { "14Per", "", 41.0217, 44.2969, 5.4 }, { "35Ari", "", 40.8629, 27.7072, 4.6 }, { "\xce\xb6""Hor", "", 40.1650, -54.5500, 5.2 }, { "\xce\xb3""Cet", "", 40.8250, 3.2358, 3.4 }, { "\xce\xb5""Hyi", "", 39.8975, -68.2669, 4.1 }, { "\xce\xbf""Ari", "", 41.1371, 15.3117, 5.7 }, { "\xce\xb9""Hor", "", 40.6396, -50.8003, 5.4 }, { "\xcf\x80""Cet", "", 41.0308, -13.8586, 4.2 }, { "38Ari", "", 41.2400, 12.4458, 5.1 }, { "\xce\xbc""Cet", "", 41.2354, 10.1142, 4.2 }, { "\xcf\x84""1Eri", "", 41.2758, -18.5725, 4.4 }, { "39Ari", "", 41.9771, 29.2472, 4.5 }, { "40Ari", "", 42.1337, 18.2836, 5.8 }, { "", "", 42.9946, 68.8886, 5.8 }, { "", "", 42.1912, 25.1881, 5.8 }, { "\xce\xb3""Hor", "", 41.3646, -63.7044, 5.7 }, { "\xce\xb7""Per", "", 42.6742, 55.8956, 3.7 }, { "\xcf\x80""Ari", "", 42.3229, 17.4642, 5.2 }, { "\xce\xb6""Hyi", "", 41.3858, -67.6167, 4.8 }, { "41Ari", "", 42.4958, 27.2606, 3.6 }, { "16Per", "", 42.6463, 38.3186, 4.2 }, { "\xce\xb2""For", "", 42.2725, -32.4058, 4.4 }, { "", "", 42.9237, 46.8419, 5.8 }, { "17Per", "", 42.8783, 35.0597, 4.5 }, { "\xce\xb3""2For", "", 42.4758, -27.9417, 5.3 }, { "\xcf\x83""Ari", "", 42.8733, 15.0819, 5.4 }, { "\xce\xb7""2For", "", 42.5617, -35.8436, 5.9 }, { "\xcf\x84""2Eri", "", 42.7596, -21.0042, 4.7 }, { "\xce\xb7""3For", "", 42.6683, -35.6761, 5.4 }, { "\xce\xbd""Hor", "", 42.2562, -62.8067, 5.2 }, { "\xcf\x84""Per", "", 43.5646, 52.7625, 3.9 }, { "20Per", "", 43.4275, 38.3375, 5.3 }, { "", "", 43.9871, 61.5211, 5.5 }, { "", "", 43.3971, -22.3764, 5.9 }, { "\xcf\x88""For", "", 43.3933, -38.4369, 5.9 }, { "\xcf\x81""2Ari", "", 43.9521, 18.3317, 5.9 }, { "", "", 43.4704, -49.8903, 4.0 }, { "\xcf\x81""3Ari", "", 44.1088, 18.0231, 5.6 }, { "", "", 44.0575, 8.3817, 5.9 }, { "\xce\xbd""Hyi", "", 42.6187, -75.0669, 4.7 }, { "21Per", "", 44.3221, 31.9342, 5.1 }, { "\xce\xb7""Eri", "Azha", 44.1071, -8.8981, 3.8 }, { "", "", 44.1558, -3.7122, 5.1 }, { "47Ari", "", 44.5217, 20.6686, 5.8 }, { "\xcf\x80""Per", "", 44.6904, 39.6628, 4.7 }, { "", "", 46.5325, 79.4186, 5.4 }, { "24Per", "", 44.7654, 35.1831, 4.9 }, { "4Eri", "", 44.3488, -23.8619, 5.4 }, { "", "", 44.9579, 47.2208, 5.4 }, { "", "", 44.9162, 41.0331, 5.8 }, { "\xce\xb5""Ari", "", 44.8029, 21.3403, 4.6 }, { "\xce\xb5""Ari", "", 44.8029, 21.3403, 4.6 }, { "6Eri", "", 44.5238, -23.6061, 5.8 }, { "", "", 45.2175, 52.3517, 5.2 }, { "", "", 44.6750, -2.7825, 5.2 }, { "\xce\xbb""Cet", "", 44.9288, 8.9075, 4.7 }, { "\xce\xb8""1Eri", "Acamar", 44.5654, -40.3047, 3.2 }, { "\xce\xb8""2Eri", "", 44.5679, -40.3044, 4.3 }, { "5Eri", "", 44.9217, -2.4650, 5.5 }, { "\xce\xb6""For", "", 44.9004, -25.2742, 5.7 }, { "", "", 45.1837, 10.8703, 5.9 }, { "49Ari", "", 45.4754, 26.4622, 5.9 }, { "", "", 47.9283, 81.4706, 5.9 }, { "\xcf\x81""1Eri", "", 45.2917, -7.6628, 5.7 }, { "\xce\xb2""Hor", "", 44.6992, -64.0714, 4.9 }, { "93Cet", "", 45.5938, 4.3528, 5.6 }, { "\xce\xb1""Cet", "Menkab / Menkar", 45.5700, 4.0897, 2.5 }, { "", "", 45.4838, -9.9614, 5.8 }, { "\xce\xb5""For", "", 45.4071, -28.0917, 5.8 }, { "\xce\xb3""Per", "", 46.1992, 53.5064, 2.9 }, { "\xcf\x81""2Eri", "", 45.6763, -7.6853, 5.3 }, { "", "", 46.3850, 56.7058, 4.7 }, { "\xcf\x84""3Eri", "", 45.5979, -23.6244, 4.0 }, { "\xcf\x81""Per", "", 46.2942, 38.8403, 3.3 }, { "", "", 46.8292, 64.0578, 5.8 }, { "\xcf\x81""3Eri", "", 46.0683, -7.6008, 5.2 }, { "", "", 45.7329, -46.9750, 5.8 }, { "", "", 46.5988, 13.1872, 5.6 }, { "", "", 47.9846, 74.3936, 4.8 }, { "\xce\xbc""Hor", "", 45.9033, -59.7378, 5.1 }, { "", "", 46.6396, -6.0886, 5.2 }, { "\xce\xb2""Per", "Algol", 47.0421, 40.9556, 2.1 }, { "\xce\xb9""Per", "", 47.2667, 49.6133, 4.0 }, { "\xce\xb8""Hyi", "", 45.5642, -71.9025, 5.5 }, { "\xce\xba""Per", "", 47.3742, 44.8572, 3.8 }, { "55Ari", "", 47.4029, 29.0769, 5.7 }, { "\xcf\x89""Per", "", 47.8225, 39.6117, 4.6 }, { "", "", 47.6621, 11.8725, 5.9 }, { "\xce\xb4""Ari", "", 47.9075, 19.7267, 4.3 }, { "56Ari", "", 48.0592, 27.2569, 5.7 }, { "", "", 48.3500, 48.1769, 5.9 }, { "", "", 48.1100, 6.6608, 5.5 }, { "", "", 50.0821, 77.7347, 5.4 }, { "94Cet", "", 48.1933, -1.1961, 5.0 }, { "\xce\xb1""For", "", 48.0179, -28.9869, 3.8 }, { "", "", 48.9500, 57.1408, 5.7 }, { "", "", 53.0838, 84.9111, 5.6 }, { "", "", 48.1075, -44.4197, 5.9 }, { "", "", 49.0508, 50.9378, 5.0 }, { "", "", 48.8354, 30.5567, 5.5 }, { "\xce\xb6""Ari", "", 48.7254, 21.0444, 4.8 }, { "", "", 48.1383, -57.3217, 5.7 }, { "", "", 46.8833, -78.9894, 5.5 }, { "30Per", "", 49.4475, 44.0250, 5.4 }, { "\xce\xb6""Eri", "", 48.9583, -8.8197, 4.8 }, { "", "", 49.9975, 65.6522, 4.8 }, { "", "", 49.4408, 39.2833, 5.9 }, { "29Per", "", 49.6575, 50.2222, 5.1 }, { "31Per", "", 49.7817, 50.0950, 5.0 }, { "", "", 49.6825, 34.2228, 4.8 }, { "95Cet", "", 49.5933, -0.9303, 5.3 }, { "", "", 49.5117, -28.7969, 5.9 }, { "15Eri", "", 49.5921, -22.5114, 4.8 }, { "59Ari", "", 49.9825, 27.0711, 5.9 }, { "\xce\xba""1Cet", "", 49.8404, 3.3703, 4.8 }, { "", "", 49.6717, -18.5597, 5.7 }, { "", "", 49.3608, -47.7517, 5.8 }, { "", "", 50.0850, 29.0483, 4.4 }, { "", "", 50.4692, 49.0708, 5.9 }, { "32Per", "", 50.3604, 43.3294, 4.9 }, { "\xcf\x84""4Eri", "", 49.8792, -21.7578, 3.6 }, { "", "", 49.8950, -24.1231, 5.6 }, { "\xcf\x84""1Ari", "", 50.3067, 21.1469, 5.2 }, { "\xce\xb6""1Ret", "", 49.4425, -62.5753, 5.5 }, { "\xce\xba""2Cet", "", 50.2783, 3.6756, 5.6 }, { "", "", 49.9821, -43.0697, 4.2 }, { "", "", 51.1687, 64.5861, 5.2 }, { "\xce\xb6""2Ret", "", 49.5537, -62.5064, 5.2 }, { "", "", 50.8050, 49.2133, 5.2 }, { "62Ari", "", 50.5496, 27.6075, 5.5 }, { "\xcf\x84""2Ari", "", 50.6883, 20.7419, 5.0 }, { "", "", 50.3500, -23.6353, 5.5 }, { "\xce\xb1""Per", "Mirfak", 51.0808, 49.8611, 1.7 }, { "", "", 51.1237, 33.5358, 5.6 }, { "64Ari", "", 51.0771, 24.7242, 5.5 }, { "\xce\xb9""Hyi", "", 48.9900, -77.3883, 5.5 }, { "\xce\xbf""Tau", "", 51.2033, 9.0289, 3.6 }, { "", "", 52.0129, 49.0628, 4.9 }, { "", "", 52.2671, 59.9403, 4.2 }, { "", "", 52.2183, 49.8483, 5.5 }, { "\xce\xbe""Tau", "", 51.7925, 9.7328, 3.7 }, { "", "", 52.4787, 58.8786, 4.5 }, { "", "", 52.0867, 33.8075, 5.6 }, { "34Per", "", 52.3421, 49.5089, 4.6 }, { "", "", 51.5938, -27.3175, 5.9 }, { "", "", 52.5008, 55.4519, 5.0 }, { "", "", 52.0042, -11.2867, 5.7 }, { "", "", 52.6542, 48.1036, 5.8 }, { "\xcf\x83""Per", "", 52.6438, 47.9953, 4.3 }, { "\xcf\x87""2For", "", 51.8892, -35.6814, 5.7 }, { "", "", 52.4129, -6.8050, 5.9 }, { "4Tau", "", 52.6021, 11.3364, 5.1 }, { "", "", 52.4000, -12.6747, 5.5 }, { "", "", 53.0358, 48.0236, 5.4 }, { "", "", 51.4008, -69.3364, 5.9 }, { "", "", 52.8367, 27.5719, 5.9 }, { "5Tau", "", 52.7183, 12.9367, 4.1 }, { "", "", 52.6892, 6.1886, 5.9 }, { "36Per", "", 53.1096, 46.0569, 5.3 }, { "17Eri", "", 52.6546, -5.0753, 4.7 }, { "", "", 53.4125, 54.9747, 5.9 }, { "", "", 53.1667, 35.4617, 5.9 }, { "", "", 52.4792, -42.6342, 5.7 }, { "", "", 53.3962, 39.8994, 5.8 }, { "6Tau", "", 53.1500, 9.3736, 5.7 }, { "", "", 52.6542, -47.3753, 5.9 }, { "\xce\xba""Ret", "", 52.3446, -62.9375, 4.7 }, { "\xce\xb5""Eri", "", 53.2325, -9.4583, 3.7 }, { "7Tau", "", 53.6108, 24.4644, 5.9 }, { "\xcf\x88""Per", "", 54.1225, 48.1928, 4.2 }, { "\xcf\x84""5Eri", "", 53.4471, -21.6328, 4.2 }, { "", "", 53.1450, -50.3786, 5.6 }, { "", "", 52.7150, -66.4897, 5.8 }, { "", "", 53.9904, -11.1936, 5.5 }, { "", "", 54.1971, 0.5878, 5.7 }, { "20Eri", "", 54.0725, -17.4669, 5.2 }, { "10Tau", "", 54.2183, 0.4017, 4.2 }, { "", "", 55.5388, 63.2167, 5.1 }, { "", "", 54.2737, -40.2747, 4.5 }, { "", "", 62.5063, 86.6261, 5.8 }, { "", "", 54.6217, -7.3917, 5.8 }, { "", "", 52.4950, -78.3519, 5.7 }, { "21Eri", "", 54.7546, -5.6261, 5.9 }, { "", "", 55.6779, 59.9694, 5.7 }, { "", "", 55.2829, 37.5800, 5.5 }, { "12Tau", "", 54.9629, 3.0569, 5.5 }, { "22Eri", "", 55.1596, -5.2106, 5.5 }, { "\xce\xb4""Per", "", 55.7313, 47.7875, 3.0 }, { "40Per", "", 55.5938, 33.9650, 4.9 }, { "", "", 56.5037, 67.2017, 5.8 }, { "13Tau", "", 55.5788, 19.7003, 5.6 }, { "", "", 56.5096, 63.3450, 4.8 }, { "\xce\xbf""Per", "", 56.0796, 32.2883, 3.8 }, { "", "", 56.1308, 36.4600, 5.5 }, { "\xce\xb4""For", "", 55.5621, -31.9383, 5.0 }, { "\xce\xbd""Per", "", 56.2983, 42.5786, 3.7 }, { "\xce\xb4""Eri", "", 55.8121, -9.7633, 3.5 }, { "", "", 57.3075, 70.8711, 5.4 }, { "", "", 55.8908, -10.4856, 5.6 }, { "16Tau", "Celaeno", 56.2008, 24.2894, 5.4 }, { "", "", 56.4971, 45.6819, 5.6 }, { "17Tau", "Electra", 56.2188, 24.1133, 3.7 }, { "", "", 55.7088, -37.3136, 4.5 }, { "18Tau", "", 56.2904, 24.8392, 5.6 }, { "19Tau", "Taygeta", 56.3021, 24.4672, 4.3 }, { "24Eri", "", 56.1271, -1.1631, 5.2 }, { "\xce\xb3""Cam", "", 57.5896, 71.3322, 4.6 }, { "20Tau", "Maia", 56.4567, 24.3678, 3.8 }, { "25Eri", "", 56.2354, -0.2967, 5.5 }, { "21Tau", "Sterope I", 56.4767, 24.5547, 5.7 }, { "29Tau", "", 56.4183, 6.0500, 5.3 }, { "", "", 57.3800, 65.5261, 4.4 }, { "23Tau", "Merope", 56.5817, 23.9483, 4.1 }, { "", "", 57.4029, 63.2972, 5.8 }, { "", "", 56.5396, 6.8031, 5.9 }, { "\xcf\x80""Eri", "", 56.5354, -12.1017, 4.4 }, { "\xce\xb7""Tau", "", 56.8713, 24.1050, 2.8 }, { "", "", 56.3158, -47.3597, 5.7 }, { "\xcf\x83""For", "", 56.6142, -29.3381, 5.9 }, { "", "", 57.0871, 23.4211, 5.4 }, { "\xcf\x84""6Eri", "", 56.7121, -23.2497, 4.2 }, { "30Tau", "", 57.0679, 11.1433, 5.0 }, { "\xce\xb2""Ret", "", 56.0500, -64.8069, 3.8 }, { "", "", 57.5188, 44.9678, 5.6 }, { "42Per", "", 57.3858, 33.0914, 5.1 }, { "27Tau", "Atlas", 57.2904, 24.0533, 3.6 }, { "28Tau", "Pleione", 57.2967, 24.1367, 5.0 }, { "\xcf\x84""7Eri", "", 56.9150, -23.8747, 5.2 }, { "", "", 57.1621, 0.2278, 5.9 }, { "\xcf\x81""For", "", 56.9833, -30.1678, 5.5 }, { "", "", 57.1492, -20.9031, 5.8 }, { "", "", 57.5788, 25.5794, 5.2 }, { "", "", 57.1475, -37.6222, 5.4 }, { "", "", 57.1496, -37.6206, 4.7 }, { "", "", 57.9738, 34.3592, 5.7 }, { "", "", 58.4304, 57.9750, 5.8 }, { "", "", 57.3637, -36.2003, 4.1 }, { "", "", 58.4112, 48.6506, 5.7 }, { "31Tau", "", 58.0008, 6.5347, 5.6 }, { "", "", 58.2917, 17.3269, 5.9 }, { "30Eri", "", 58.1733, -5.3614, 5.4 }, { "\xce\xb6""Per", "Atik", 58.5329, 31.8836, 2.8 }, { "", "", 59.3563, 63.0722, 5.0 }, { "", "", 59.2846, 61.1089, 5.0 }, { "", "", 58.9925, 47.8714, 5.3 }, { "\xce\xb3""Hyi", "", 56.8096, -74.2389, 3.2 }, { "43Per", "", 59.1521, 50.6953, 5.2 }, { "32Eri", "", 58.5729, -2.9547, 4.7 }, { "\xcf\x84""8Eri", "", 58.4275, -24.6125, 4.6 }, { "", "", 58.4121, -34.7322, 5.1 }, { "", "", 59.1196, 35.0811, 5.4 }, { "", "", 58.3888, -46.8936, 5.9 }, { "32Tau", "", 59.2171, 22.4781, 5.6 }, { "", "", 58.5967, -40.3572, 5.7 }, { "\xce\xb5""Per", "", 59.4633, 40.0103, 2.8 }, { "\xce\xbe""Per", "", 59.7413, 35.7911, 4.0 }, { "", "", 62.5117, 80.6986, 5.1 }, { "\xce\xb3""Eri", "Zaurak", 59.5075, -13.5086, 2.9 }, { "", "", 59.7179, -5.4700, 5.8 }, { "", "", 59.8754, -12.5742, 5.6 }, { "", "", 60.2033, 18.1939, 5.8 }, { "\xce\xbb""Tau", "", 60.1700, 12.4903, 3.4 }, { "\xcf\x84""9Eri", "", 59.9813, -24.0164, 4.6 }, { "", "", 61.5129, 68.6800, 5.8 }, { "", "", 61.1133, 59.1556, 5.0 }, { "", "", 60.4421, 9.9978, 5.6 }, { "35Eri", "", 60.3833, -1.5497, 5.2 }, { "", "", 60.1696, -30.4908, 5.9 }, { "\xce\xb4""Ret", "", 59.6863, -61.4003, 4.5 }, { "", "", 60.6529, -0.2689, 5.3 }, { "\xce\xbd""Tau", "", 60.7892, 5.9892, 3.9 }, { "36Tau", "", 61.0904, 24.1058, 5.4 }, { "40Tau", "", 60.9358, 5.4356, 5.3 }, { "", "", 60.9858, 8.1972, 5.4 }, { "37Tau", "", 61.1737, 22.0819, 4.3 }, { "", "", 61.0412, 2.8269, 5.3 }, { "\xce\xbb""Per", "", 61.6458, 50.3514, 4.2 }, { "39Tau", "", 61.3342, 22.0089, 5.9 }, { "\xce\xb3""Ret", "", 60.2242, -62.1594, 4.5 }, { "", "", 61.0946, -12.7925, 5.6 }, { "\xce\xb9""Ret", "", 60.3258, -61.0789, 4.9 }, { "41Tau", "", 61.6517, 27.6000, 5.2 }, { "\xcf\x88""Tau", "", 61.7521, 29.0014, 5.2 }, { "48Per", "", 62.1654, 47.7125, 4.0 }, { "", "", 61.4058, -27.6517, 5.5 }, { "50Per", "", 62.1525, 38.0397, 5.5 }, { "", "", 61.9975, 17.3397, 5.8 }, { "\xcf\x89""1Tau", "", 62.2917, 19.6092, 5.5 }, { "", "", 62.2567, 13.3983, 5.9 }, { "", "", 62.7458, 33.5867, 5.7 }, { "44Tau", "", 62.7079, 26.4808, 5.4 }, { "", "", 62.3242, -16.3858, 5.3 }, { "", "", 67.0542, 83.8078, 5.5 }, { "37Eri", "", 62.5938, -6.9239, 5.4 }, { "45Tau", "", 62.8346, 5.5231, 5.7 }, { "", "", 62.6988, -8.8197, 5.7 }, { "\xce\xbf""1Eri", "Beid", 62.9663, -6.8375, 4.0 }, { "", "", 62.9008, -20.3561, 5.7 }, { "\xce\xb4""Hor", "", 62.7108, -41.9936, 4.9 }, { "\xce\xbc""Per", "", 63.7246, 48.4094, 4.1 }, { "", "", 67.5004, 83.3406, 5.4 }, { "", "", 64.2233, 61.8503, 5.7 }, { "52Per", "", 63.7221, 40.4836, 4.7 }, { "46Tau", "", 63.3879, 7.7161, 5.2 }, { "47Tau", "", 63.4850, 9.2636, 4.8 }, { "", "", 64.2842, 57.8606, 5.7 }, { "", "", 64.1796, 53.6119, 5.1 }, { "", "", 63.6512, 10.0111, 5.2 }, { "", "", 66.7617, 80.8242, 5.4 }, { "39Eri", "", 63.5988, -10.2564, 4.8 }, { "\xce\xbc""Tau", "", 63.8838, 8.8922, 4.2 }, { "", "", 64.5608, 50.2956, 4.6 }, { "\xce\xbf""2Eri", "Keid", 63.8179, -7.6528, 4.4 }, { "\xce\xb1""Hor", "", 63.5004, -42.2944, 3.8 }, { "", "", 65.1679, 65.1406, 5.2 }, { "\xcf\x89""2Tau", "", 64.3150, 20.5786, 4.9 }, { "", "", 64.8054, 50.0489, 5.4 }, { "51Tau", "", 64.5967, 21.5792, 5.6 }, { "", "", 64.3300, -6.4719, 5.9 }, { "", "", 65.0479, 50.9208, 5.5 }, { "", "", 65.4483, 60.7356, 5.3 }, { "\xce\xb1""Ret", "", 63.6062, -62.4739, 3.3 }, { "", "", 65.0600, 41.8081, 5.9 }, { "\xce\xb3""Dor", "", 64.0067, -51.4867, 4.2 }, { "53Tau", "", 64.8588, 21.1422, 5.3 }, { "", "", 63.7029, -62.1919, 5.4 }, { "56Tau", "", 64.9029, 21.7736, 5.3 }, { "", "", 65.4658, 56.5067, 5.8 }, { "54Per", "", 65.1025, 34.5667, 4.9 }, { "\xce\xb3""Tau", "", 64.9483, 15.6275, 3.6 }, { "\xcf\x85""4Eri", "", 64.4737, -33.7983, 3.5 }, { "\xcf\x86""Tau", "", 65.0888, 27.3508, 4.9 }, { "53Per", "", 65.3883, 46.4989, 4.8 }, { "57Tau", "", 64.9904, 14.0353, 5.5 }, { "\xce\xb5""Ret", "", 64.1204, -59.3019, 4.4 }, { "58Tau", "", 65.1512, 15.0953, 5.2 }, { "", "", 65.1717, 6.1308, 5.7 }, { "", "", 65.1783, -7.5925, 5.8 }, { "", "", 64.8192, -44.2681, 5.3 }, { "", "", 65.3629, -0.0981, 5.8 }, { "", "", 65.1625, -20.6397, 5.3 }, { "60Tau", "", 65.5146, 14.0772, 5.7 }, { "\xcf\x87""Tau", "", 65.6454, 25.6292, 5.3 }, { "", "", 65.5950, 20.8214, 5.9 }, { "\xce\xb8""Ret", "", 64.4175, -63.2556, 5.8 }, { "\xce\xb4""1Tau", "", 65.7338, 17.5425, 3.7 }, { "", "", 65.8850, 20.9822, 5.9 }, { "63Tau", "", 65.8542, 16.7772, 5.6 }, { "55Per", "", 66.1217, 34.1306, 5.7 }, { "56Per", "", 66.1558, 33.9597, 5.7 }, { "\xce\xb4""2Tau", "", 66.0242, 17.4439, 4.8 }, { "66Tau", "", 65.9663, 9.4608, 5.1 }, { "\xce\xbe""Eri", "", 65.9200, -3.7456, 5.1 }, { "", "", 65.7738, -24.8922, 5.8 }, { "", "", 66.2379, 19.0417, 5.9 }, { "\xce\xba""1Tau", "", 66.3421, 22.2939, 4.2 }, { "\xce\xba""2Tau", "", 66.3542, 22.1997, 5.2 }, { "\xce\xb4""3Tau", "", 66.3725, 17.9281, 4.2 }, { "", "", 66.5263, 31.4389, 5.2 }, { "\xcf\x85""Tau", "", 66.5771, 22.8136, 4.2 }, { "43Eri", "", 66.0092, -34.0169, 3.9 }, { "71Tau", "", 66.5867, 15.6183, 4.4 }, { "\xce\xb7""Ret", "", 65.4721, -63.3864, 5.2 }, { "\xcf\x80""Tau", "", 66.6517, 14.7136, 4.6 }, { "72Tau", "", 66.8229, 22.9964, 5.5 }, { "", "", 68.3779, 72.5286, 5.9 }, { "", "", 66.8700, 11.2125, 5.8 }, { "", "", 67.0033, 21.6200, 5.7 }, { "75Tau", "", 67.1100, 16.3597, 4.9 }, { "76Tau", "", 67.0975, 14.7408, 5.9 }, { "\xce\xb5""Tau", "", 67.1542, 19.1803, 3.5 }, { "\xce\xb8""1Tau", "", 67.1438, 15.9622, 3.8 }, { "\xce\xb8""2Tau", "", 67.1654, 15.8708, 3.4 }, { "79Tau", "", 67.2092, 13.0475, 5.0 }, { "", "", 67.1338, 1.3808, 5.5 }, { "", "", 66.2721, -61.2383, 5.9 }, { "1Cam", "", 68.0075, 53.9108, 5.7 }, { "", "", 67.1625, -19.4583, 5.9 }, { "80Tau", "", 67.5358, 15.6381, 5.5 }, { "", "", 67.2788, -13.0483, 5.6 }, { "\xce\xb4""Men", "", 64.4962, -80.2139, 5.6 }, { "", "", 67.6404, 16.1939, 4.7 }, { "81Tau", "", 67.6621, 15.6919, 5.4 }, { "83Tau", "", 67.6554, 13.7244, 5.4 }, { "", "", 66.9412, -62.5208, 5.7 }, { "45Eri", "", 67.9696, -0.0439, 4.9 }, { "", "", 67.6679, -35.6536, 5.9 }, { "", "", 69.1008, 64.2617, 5.9 }, { "", "", 68.1558, -3.2092, 5.8 }, { "\xce\xb4""Cae", "", 67.7088, -44.9539, 5.0 }, { "\xcf\x81""Tau", "", 68.4621, 14.8444, 4.6 }, { "", "", 68.6583, 28.9611, 5.8 }, { "", "", 68.5346, 5.5686, 5.6 }, { "46Eri", "", 68.4783, -6.7389, 5.7 }, { "47Eri", "", 68.5483, -8.2314, 5.1 }, { "", "", 68.5487, -8.9703, 5.2 }, { "\xcf\x85""1Eri", "", 68.3775, -29.7667, 4.5 }, { "58Per", "", 69.1725, 41.2647, 4.2 }, { "\xce\xbd""Men", "", 65.2412, -81.5800, 5.7 }, { "\xce\xb1""Tau", "Aldebaran", 68.9800, 16.5092, 0.8 }, { "88Tau", "", 68.9137, 10.1608, 4.2 }, { "\xce\xbd""Eri", "", 69.0796, -3.3525, 3.9 }, { "\xcf\x85""2Eri", "", 68.8875, -30.5622, 3.8 }, { "\xce\xb1""Dor", "", 68.4992, -55.0450, 3.2 }, { "2Cam", "", 69.9921, 53.4731, 5.3 }, { "3Cam", "", 69.9779, 53.0797, 5.0 }, { "", "", 69.3071, 0.9983, 5.3 }, { "", "", 69.5658, 20.6847, 5.9 }, { "89Tau", "", 69.5392, 16.0333, 5.7 }, { "90Tau", "", 69.5396, 12.5108, 4.2 }, { "51Eri", "", 69.4004, -2.4733, 5.2 }, { "", "", 68.3917, -62.8236, 5.7 }, { "\xcf\x83""1Tau", "", 69.7883, 15.7997, 5.0 }, { "\xcf\x83""2Tau", "", 69.8188, 15.9181, 4.6 }, { "", "", 69.7758, 7.8708, 5.3 }, { "53Eri", "", 69.5450, -14.3039, 3.8 }, { "", "", 70.3504, 48.3008, 5.6 }, { "", "", 69.7233, -12.1231, 5.0 }, { "93Tau", "", 70.0142, 12.1978, 5.4 }, { "", "", 69.8321, -14.3592, 5.4 }, { "", "", 70.4596, 38.2803, 5.9 }, { "", "", 70.3325, 28.6150, 5.7 }, { "", "", 69.1900, -62.0775, 5.4 }, { "", "", 70.8400, 49.9739, 5.8 }, { "59Per", "", 70.7262, 43.3650, 5.2 }, { "", "", 70.0283, -24.4825, 5.5 }, { "54Eri", "", 70.1104, -19.6717, 4.3 }, { "\xcf\x84""Tau", "Alcyone", 70.5613, 22.9569, 4.2 }, { "\xce\xb1""Cae", "", 70.1404, -41.8639, 4.4 }, { "\xce\xb2""Cae", "", 70.5146, -37.1444, 5.0 }, { "", "", 71.1075, 11.1461, 5.4 }, { "56Eri", "", 71.0221, -8.5036, 5.9 }, { "", "", 70.7887, -30.7656, 5.6 }, { "4Cam", "", 72.0012, 56.7572, 5.3 }, { "", "", 71.0333, -18.6667, 5.5 }, { "", "", 71.6850, 40.3128, 5.9 }, { "\xce\xbb""Pic", "", 70.6933, -50.4814, 5.3 }, { "", "", 71.5071, 11.7056, 5.3 }, { "\xce\xbc""Eri", "", 71.3754, -3.2547, 4.0 }, { "", "", 71.2675, -21.2836, 5.7 }, { "", "", 75.0862, 81.1939, 5.0 }, { "", "", 73.0217, 63.5053, 5.4 }, { "", "", 72.3292, 32.5883, 5.8 }, { "", "", 72.3033, 31.4372, 5.5 }, { "\xce\xba""Dor", "", 71.0879, -59.7328, 5.2 }, { "58Eri", "", 71.9012, -16.9344, 5.5 }, { "", "", 72.4775, 37.4883, 4.8 }, { "", "", 72.7887, 48.7408, 5.6 }, { "", "", 72.1512, -5.6739, 5.7 }, { "59Eri", "", 72.1354, -16.3294, 5.7 }, { "\xce\xbc""Men", "", 70.7663, -70.9311, 5.5 }, { "\xce\xb1""Cam", "", 73.5125, 66.3428, 4.2 }, { "\xcf\x80""3Ori", "", 72.4600, 6.9614, 3.1 }, { "\xcf\x80""2Ori", "", 72.6529, 8.9003, 4.3 }, { "97Tau", "", 72.8437, 18.8397, 5.1 }, { "60Eri", "", 72.5483, -16.2172, 5.0 }, { "", "", 73.1992, 42.5867, 5.7 }, { "2Aur", "", 73.1583, 36.7031, 4.7 }, { "\xcf\x80""4Ori", "", 72.8017, 5.6050, 3.6 }, { "", "", 73.1963, 27.8975, 5.9 }, { "5Cam", "", 73.7629, 55.2592, 5.5 }, { "\xce\xbf""1Ori", "", 73.1333, 14.2506, 4.7 }, { "", "", 72.8675, -34.9064, 5.8 }, { "\xcf\x89""Eri", "", 73.2237, -5.4528, 4.3 }, { "", "", 74.0296, 52.8694, 5.7 }, { "5Ori", "", 73.3450, 2.5081, 5.3 }, { "\xce\xb9""Pic", "", 72.7300, -53.4614, 5.6 }, { "\xcf\x80""5Ori", "", 73.5629, 2.4406, 3.7 }, { "7Cam", "", 74.3217, 53.7522, 4.4 }, { "6Ori", "", 73.6954, 11.4261, 5.1 }, { "\xcf\x80""1Ori", "", 73.7242, 10.1508, 4.6 }, { "", "", 73.6992, 7.7792, 5.3 }, { "", "", 73.7113, 0.4675, 5.9 }, { "", "", 73.9596, 15.0400, 5.8 }, { "\xce\xb9""Aur", "", 74.2483, 33.1661, 2.6 }, { "", "", 73.7783, -16.7406, 5.7 }, { "\xce\xbf""2Ori", "", 74.0929, 13.5144, 4.0 }, { "", "", 73.8275, -16.4178, 5.7 }, { "62Eri", "", 74.1008, -5.1714, 5.5 }, { "", "", 74.3429, 17.1536, 5.4 }, { "99Tau", "", 74.4529, 23.9486, 5.7 }, { "", "", 76.1658, 74.0669, 5.9 }, { "98Tau", "", 74.5392, 25.0503, 5.8 }, { "\xcf\x89""Aur", "", 74.8142, 37.8903, 4.9 }, { "5Aur", "", 75.0763, 39.3947, 5.9 }, { "\xcf\x80""6Ori", "", 74.6371, 1.7142, 4.4 }, { "\xce\xb2""Cam", "", 75.8546, 60.4422, 4.0 }, { "", "", 74.7554, -16.3758, 5.6 }, { "\xce\xb5""Aur", "", 75.4921, 43.8233, 2.9 }, { "63Eri", "", 74.9600, -10.2633, 5.3 }, { "64Eri", "", 74.9825, -12.5375, 4.7 }, { "\xce\xb6""Aur", "Sadatoni", 75.6196, 41.0758, 3.7 }, { "\xcf\x88""Eri", "", 75.3596, -7.1739, 4.8 }, { "", "", 75.4596, 0.7222, 5.9 }, { "\xce\xb9""Tau", "", 75.7738, 21.5900, 4.6 }, { "", "", 75.3567, -20.0519, 4.9 }, { "11Cam", "", 76.5354, 58.9725, 5.0 }, { "", "", 75.6896, -4.2097, 5.8 }, { "", "", 75.5408, -26.2750, 5.0 }, { "\xce\xb7""Men", "", 73.7967, -74.9369, 5.4 }, { "1Lep", "", 75.6871, -22.7950, 5.7 }, { "", "", 75.5950, -31.7714, 5.9 }, { "9Aur", "", 76.6692, 51.5978, 5.0 }, { "11Ori", "", 76.1421, 15.4042, 4.6 }, { "\xce\xb7""Aur", "", 76.6287, 41.2344, 3.1 }, { "", "", 78.0933, 73.9467, 5.4 }, { "", "", 75.9721, -24.3878, 5.6 }, { "\xce\xb7""1Pic", "", 75.7025, -49.1514, 5.3 }, { "\xce\xb3""1Cae", "", 76.1017, -35.4833, 4.5 }, { "\xce\xb5""Lep", "", 76.3654, -22.3711, 3.1 }, { "", "", 76.3175, -26.1525, 5.7 }, { "104Tau", "", 76.8625, 18.6450, 5.0 }, { "66Eri", "", 76.6904, -4.6550, 5.1 }, { "106Tau", "", 76.9517, 20.4183, 5.3 }, { "103Tau", "", 77.0275, 24.2653, 5.5 }, { "105Tau", "", 76.9813, 21.7047, 5.8 }, { "\xce\xb7""2Pic", "", 76.2417, -49.5778, 5.0 }, { "14Ori", "", 76.9704, 8.4983, 5.3 }, { "", "", 76.8542, -12.4906, 5.9 }, { "\xce\xb2""Eri", "Cursa", 76.9625, -5.0864, 2.7 }, { "", "", 77.6788, 46.9622, 5.6 }, { "", "", 77.0842, -8.6650, 5.7 }, { "16Ori", "", 77.3317, 9.8294, 5.4 }, { "68Eri", "", 77.1817, -4.4561, 5.1 }, { "\xce\xb6""Dor", "", 76.3775, -57.4728, 4.7 }, { "15Ori", "", 77.4250, 15.5972, 4.8 }, { "\xce\xb2""Men", "", 75.6792, -71.3144, 5.3 }, { "\xce\xbb""Eri", "", 77.2867, -8.7542, 4.2 }, { "", "", 79.5554, 73.2681, 5.7 }, { "", "", 77.9233, 16.0456, 5.1 }, { "", "", 80.6396, 79.2311, 5.0 }, { "", "", 77.8300, -2.4908, 5.9 }, { "\xce\xbc""Aur", "", 78.3571, 38.4844, 4.8 }, { "", "", 77.9388, 1.0369, 5.8 }, { "", "", 77.8450, -11.8492, 5.6 }, { "", "", 76.8917, -63.3997, 5.2 }, { "\xce\xb9""Lep", "", 78.0746, -11.8692, 4.4 }, { "", "", 78.2008, -6.0572, 5.9 }, { "\xcf\x81""Ori", "", 78.3229, 2.8611, 4.4 }, { "\xce\xbc""Lep", "", 78.2329, -16.2056, 3.3 }, { "\xce\xba""Lep", "", 78.3079, -12.9414, 4.3 }, { "14Aur", "", 78.8517, 32.6878, 5.0 }, { "\xce\xb1""Aur", "Capella", 79.1725, 45.9981, 0.0 }, { "", "", 78.6838, 5.1561, 5.5 }, { "", "", 79.0758, 34.3119, 5.9 }, { "\xce\xb2""Ori", "Rigel", 78.6346, -8.2017, 0.1 }, { "\xce\xbe""Men", "", 74.7121, -82.4706, 5.8 }, { "18Ori", "", 79.0171, 11.3414, 5.5 }, { "", "", 80.0942, 62.6536, 5.6 }, { "", "", 78.6200, -35.9772, 5.7 }, { "", "", 79.5662, 42.7922, 5.4 }, { "", "", 78.8513, -26.9433, 5.0 }, { "16Aur", "", 79.5446, 33.3717, 4.5 }, { "\xce\xbb""Aur", "", 79.7854, 40.0992, 4.7 }, { "", "", 79.7500, 33.7483, 5.4 }, { "\xcf\x84""Ori", "", 79.4017, -6.8444, 3.6 }, { "", "", 79.4175, -13.5197, 5.5 }, { "", "", 80.0617, 41.0861, 5.5 }, { "109Tau", "", 79.8192, 22.0964, 4.9 }, { "19Aur", "", 80.0037, 33.9581, 5.0 }, { "\xce\xbf""Col", "", 79.3713, -34.8953, 4.8 }, { "\xce\xb8""Dor", "", 78.4392, -67.1853, 4.8 }, { "21Ori", "", 79.7967, 2.5958, 5.3 }, { "", "", 79.7100, -18.1300, 5.9 }, { "\xcf\x81""Aur", "", 80.4517, 41.8044, 5.2 }, { "16Cam", "", 80.8658, 57.5444, 5.2 }, { "", "", 80.3029, 29.5700, 5.7 }, { "\xce\xbb""Lep", "", 79.8937, -13.1767, 4.2 }, { "\xce\xbd""Lep", "", 79.9962, -12.3156, 5.3 }, { "", "", 79.8487, -27.3689, 5.9 }, { "", "", 80.7096, 41.0294, 5.5 }, { "", "", 80.1121, -21.2394, 4.7 }, { "", "", 80.4317, 8.4286, 5.8 }, { "", "", 80.3825, -0.4164, 5.6 }, { "22Ori", "", 80.4404, -0.3825, 4.7 }, { "\xce\xb6""Pic", "", 79.8421, -50.6061, 5.4 }, { "23Ori", "", 80.7083, 3.5444, 5.0 }, { "", "", 80.4425, -24.7731, 5.0 }, { "\xcf\x83""Aur", "", 81.1633, 37.3856, 4.9 }, { "", "", 81.1604, 31.1431, 5.9 }, { "", "", 80.8271, -8.4158, 5.9 }, { "111Tau", "", 81.1058, 17.3833, 4.9 }, { "", "", 80.9263, -0.1597, 5.7 }, { "8Lep", "", 80.8758, -13.9272, 5.2 }, { "29Ori", "", 80.9867, -7.8081, 4.1 }, { "27Ori", "", 81.1204, -0.8914, 5.0 }, { "\xce\xb7""Ori", "", 81.1192, -2.3969, 3.3 }, { "\xcf\x88""1Ori", "", 81.1867, 1.8464, 4.9 }, { "\xce\xb3""Ori", "Bellatrix", 81.2829, 6.3497, 1.6 }, { "\xce\xb2""Tau", "Elnath / El Nath", 81.5729, 28.6075, 1.6 }, { "", "", 81.1183, -16.9761, 5.6 }, { "", "", 80.8500, -39.6786, 5.7 }, { "", "", 81.7037, 34.3917, 5.9 }, { "", "", 81.2567, -10.3292, 5.6 }, { "17Cam", "", 82.5425, 63.0672, 5.4 }, { "", "", 81.7846, 30.2086, 5.7 }, { "\xcf\x86""Aur", "", 81.9121, 34.4758, 5.0 }, { "115Tau", "", 81.7921, 17.9622, 5.4 }, { "114Tau", "", 81.9087, 21.9369, 4.8 }, { "\xcf\x88""2Ori", "", 81.7092, 3.0956, 4.5 }, { "", "", 81.4992, -19.6956, 5.8 }, { "116Tau", "", 81.9400, 15.8742, 5.5 }, { "117Tau", "", 82.0067, 17.2389, 5.7 }, { "118Tau", "", 82.3188, 25.1506, 5.4 }, { "", "", 81.7721, -40.9436, 5.8 }, { "\xce\xb2""Lep", "Nihal", 82.0613, -20.7594, 2.8 }, { "", "", 82.3483, -3.4464, 5.7 }, { "", "", 82.6088, 15.3603, 5.9 }, { "", "", 82.4783, 1.7892, 5.7 }, { "31Ori", "", 82.4333, -1.0922, 4.7 }, { "", "", 82.0637, -37.2306, 5.5 }, { "\xce\xbb""Dor", "", 81.5804, -58.9125, 5.1 }, { "32Ori", "", 82.6963, 5.9481, 4.2 }, { "33Ori", "", 82.8104, 3.2922, 5.4 }, { "\xcf\x87""Aur", "", 83.1821, 32.1919, 4.7 }, { "119Tau", "", 83.0533, 18.5944, 4.3 }, { "", "", 83.0592, 17.0581, 5.4 }, { "10Lep", "", 82.7817, -20.8636, 5.5 }, { "\xce\xb4""Ori", "Mintaka", 83.0017, -0.2992, 2.2 }, { "\xcf\x85""Ori", "", 82.9825, -7.3014, 4.6 }, { "", "", 82.5396, -47.0778, 5.4 }, { "120Tau", "", 83.3817, 18.5403, 5.6 }, { "", "", 83.1721, -1.5919, 5.3 }, { "\xce\xb5""Col", "", 82.8029, -35.4706, 3.8 }, { "35Ori", "", 83.4762, 14.3056, 5.6 }, { "\xce\xb1""Lep", "Arneb", 83.1825, -17.8222, 2.5 }, { "", "", 84.1467, 54.4289, 5.7 }, { "", "", 83.3808, -1.1561, 5.3 }, { "", "", 82.9004, -45.9253, 5.8 }, { "38Ori", "", 83.5696, 3.7669, 5.3 }, { "", "", 83.5167, -1.4706, 5.9 }, { "121Tau", "", 83.8629, 24.0394, 5.3 }, { "\xcf\x86""1Ori", "", 83.7050, 9.4894, 4.4 }, { "", "", 83.2137, -38.5131, 5.4 }, { "\xce\xbb""Ori", "Meissa", 83.7846, 9.9342, 3.5 }, { "\xce\xbb""Ori", "Meissa", 83.7854, 9.9350, 5.6 }, { "", "", 83.2808, -35.1397, 5.7 }, { "", "", 83.8058, 10.2400, 5.6 }, { "", "", 83.7537, -6.0092, 5.6 }, { "", "", 83.7612, -6.0019, 4.7 }, { "42Ori", "", 83.8467, -4.8383, 4.5 }, { "\xce\xb8""1Ori", "", 83.8187, -5.3897, 5.1 }, { "\xce\xb8""2Ori", "", 83.8454, -5.4161, 5.0 }, { "\xce\xb9""Ori", "", 83.8583, -5.9100, 2.7 }, { "45Ori", "", 83.9146, -4.8558, 5.2 }, { "", "", 84.2867, 26.9242, 5.8 }, { "\xce\xb5""Ori", "Alnilam", 84.0533, -1.2019, 1.7 }, { "122Tau", "", 84.2658, 17.0403, 5.5 }, { "\xcf\x86""2Ori", "", 84.2262, 9.2906, 4.0 }, { "", "", 84.2683, 11.0350, 5.9 }, { "", "", 83.8142, -33.0800, 5.7 }, { "\xce\xb6""Tau", "", 84.4113, 21.1425, 3.0 }, { "", "", 84.1487, -6.0650, 5.7 }, { "26Aur", "", 84.6587, 30.4925, 5.4 }, { "", "", 85.6100, 65.6978, 5.6 }, { "", "", 83.2483, -64.2275, 5.3 }, { "", "", 84.5046, 7.5414, 5.8 }, { "\xce\xb2""Dor", "", 83.4062, -62.4897, 3.7 }, { "", "", 84.8267, 29.2153, 5.9 }, { "125Tau", "", 84.9342, 25.8969, 5.1 }, { "\xcf\x83""Ori", "", 84.6867, -2.6000, 3.8 }, { "", "", 84.6575, -6.5739, 5.9 }, { "\xcf\x89""Ori", "", 84.7963, 4.1214, 4.5 }, { "\xce\xbd""2Col", "", 84.4358, -28.6894, 5.3 }, { "49Ori", "", 84.7212, -7.2131, 4.8 }, { "126Tau", "", 85.3238, 16.5339, 4.8 }, { "", "", 84.6817, -40.7075, 5.8 }, { "\xce\xb6""Ori", "Alnitak", 85.1896, -1.9428, 2.0 }, { "\xce\xb6""Ori", "Alnitak", 85.1900, -1.9428, 4.2 }, { "", "", 85.2108, -1.1289, 4.9 }, { "\xce\xb3""Men", "", 82.9704, -76.3411, 5.1 }, { "", "", 85.2733, 0.3378, 5.9 }, { "\xce\xb1""Col", "Phact", 84.9121, -34.0742, 2.6 }, { "", "", 84.9575, -32.6292, 5.4 }, { "51Ori", "", 85.6192, 1.4747, 4.9 }, { "", "", 83.6863, -73.7414, 5.7 }, { "12Lep", "", 85.5579, -22.3736, 5.8 }, { "26Cam", "", 86.6267, 56.1156, 5.9 }, { "\xce\xbf""Aur", "", 86.4750, 49.8264, 5.4 }, { "", "", 85.5629, -34.6678, 5.2 }, { "", "", 85.8400, -18.5575, 5.7 }, { "\xce\xb3""Lep", "", 86.1158, -22.4483, 3.6 }, { "", "", 86.7171, 9.5222, 5.7 }, { "", "", 86.6458, 1.1681, 5.9 }, { "131Tau", "", 86.8050, 14.4883, 5.7 }, { "130Tau", "", 86.8592, 17.7292, 5.4 }, { "133Tau", "", 86.9288, 13.8997, 5.2 }, { "\xcf\x84""Aur", "", 87.2938, 39.1811, 4.5 }, { "\xce\xbc""Col", "Runaway Star", 86.4996, -32.3064, 5.1 }, { "\xce\xb6""Lep", "", 86.7387, -14.8219, 3.5 }, { "52Ori", "", 87.0008, 6.4542, 5.2 }, { "132Tau", "", 87.2542, 24.5675, 4.8 }, { "\xce\xba""Ori", "Saiph", 86.9392, -9.6697, 2.0 }, { "", "", 87.1454, -4.0947, 5.9 }, { "", "", 86.6142, -46.5972, 5.3 }, { "134Tau", "", 87.3871, 12.6511, 4.9 }, { "\xcf\x85""Aur", "", 87.7600, 37.3056, 4.7 }, { "\xce\xbd""Aur", "", 87.8725, 39.1486, 3.9 }, { "", "", 87.7421, 27.9678, 5.5 }, { "", "", 87.5108, 9.8711, 5.8 }, { "\xce\xb4""Dor", "", 86.1933, -65.7356, 4.3 }, { "135Tau", "", 87.6204, 14.3056, 5.5 }, { "", "", 87.5546, 4.4233, 5.9 }, { "\xce\xb2""Pic", "", 86.8212, -51.0664, 3.8 }, { "", "", 87.4021, -14.4836, 5.4 }, { "\xcf\x80""Men", "", 84.2908, -80.4692, 5.6 }, { "", "", 87.6250, 2.0244, 5.9 }, { "", "", 87.4729, -22.9717, 5.8 }, { "31Cam", "", 88.7408, 59.8883, 5.2 }, { "", "", 88.1671, 33.9175, 5.9 }, { "\xce\xbe""Aur", "", 88.7117, 55.7069, 4.9 }, { "55Ori", "", 87.8417, -7.5181, 5.3 }, { "137Tau", "", 88.0929, 14.1717, 5.5 }, { "136Tau", "", 88.3317, 27.6122, 4.5 }, { "\xce\xb4""Lep", "", 87.8304, -20.8792, 3.8 }, { "56Ori", "", 88.1100, 1.8550, 4.7 }, { "", "", 88.0317, -9.0414, 5.9 }, { "\xce\xb2""Col", "Wazn", 87.7400, -35.7683, 3.1 }, { "\xce\xb3""Pic", "", 87.4571, -56.1667, 4.5 }, { "", "", 88.7458, 31.7017, 5.9 }, { "\xcf\x87""1Ori", "", 88.5954, 20.2761, 4.4 }, { "", "", 87.7217, -52.1089, 5.1 }, { "57Ori", "", 88.7362, 19.7497, 5.9 }, { "", "", 88.1383, -37.6311, 5.6 }, { "\xce\xbb""Col", "", 88.2787, -33.8014, 4.8 }, { "\xce\xb1""Ori", "Betelgeuse", 88.7929, 7.4069, 0.5 }, { "", "", 88.9554, 20.1750, 5.4 }, { "\xce\xb5""Dor", "", 87.4733, -66.9011, 5.1 }, { "", "", 88.6817, -11.7739, 5.6 }, { "", "", 88.8762, -4.6164, 5.8 }, { "", "", 88.0846, -57.1561, 5.9 }, { "", "", 89.1167, 9.5097, 5.9 }, { "", "", 89.2062, 11.5211, 5.8 }, { "\xce\xb4""Aur", "", 89.8817, 54.2847, 3.7 }, { "", "", 89.8408, 49.9244, 5.8 }, { "", "", 88.7188, -39.9581, 5.5 }, { "139Tau", "", 89.4988, 25.9539, 4.8 }, { "\xce\xb7""Lep", "", 89.1013, -14.1678, 3.7 }, { "", "", 89.0596, -22.8403, 5.9 }, { "\xce\xbe""Col", "", 88.8746, -37.1208, 4.9 }, { "\xce\xb2""Aur", "Menkalinan", 89.8821, 44.9475, 1.9 }, { "\xcf\x80""Aur", "", 89.9838, 45.9369, 4.2 }, { "\xcf\x83""Col", "", 89.0871, -31.3825, 5.5 }, { "", "", 88.7092, -52.6353, 5.2 }, { "\xce\xb8""Aur", "", 89.9304, 37.2125, 2.6 }, { "", "", 89.7217, 12.8086, 5.7 }, { "59Ori", "", 89.6017, 1.8369, 5.9 }, { "36Aur", "", 90.2442, 47.9019, 5.7 }, { "", "", 88.5254, -63.0900, 4.6 }, { "60Ori", "", 89.7067, 0.5531, 5.2 }, { "", "", 90.4296, 48.9594, 5.9 }, { "\xce\xb3""Col", "", 89.3842, -35.2833, 4.3 }, { "2Mon", "", 89.7679, -9.5583, 5.0 }, { "", "", 90.2925, 31.0347, 5.9 }, { "", "", 90.0142, -3.0742, 4.5 }, { "", "", 89.6567, -44.0344, 5.8 }, { "\xce\xb7""Col", "", 89.7867, -42.8153, 3.9 }, { "\xce\xbc""Ori", "", 90.5958, 9.6475, 4.1 }, { "\xce\xba""Men", "", 87.5696, -79.3614, 5.4 }, { "3Mon", "", 90.4600, -10.5981, 4.9 }, { "64Ori", "", 90.8638, 19.6906, 5.1 }, { "", "", 90.3183, -33.9117, 5.5 }, { "39Aur", "", 91.2642, 42.9817, 5.8 }, { "1Gem", "", 91.0300, 23.2633, 4.1 }, { "\xcf\x87""2Ori", "", 90.9800, 20.1383, 4.6 }, { "", "", 90.2050, -51.2164, 5.6 }, { "", "", 90.8146, -26.2844, 5.0 }, { "", "", 91.0563, -6.7092, 5.2 }, { "40Aur", "", 91.6462, 38.4828, 5.3 }, { "63Ori", "", 91.2425, 5.4200, 5.6 }, { "66Ori", "", 91.2433, 4.1586, 5.6 }, { "17Lep", "", 91.2462, -16.4844, 4.9 }, { "", "", 91.0846, -32.1725, 5.6 }, { "", "", 91.3625, -10.2428, 5.8 }, { "37Cam", "", 92.4963, 58.9358, 5.3 }, { "", "", 91.6612, -4.1939, 5.3 }, { "\xce\xb8""Lep", "", 91.5387, -14.9353, 4.6 }, { "", "", 91.1675, -45.0789, 5.9 }, { "\xce\xbd""Ori", "", 91.8929, 14.7683, 4.4 }, { "", "", 91.3629, -35.5136, 5.8 }, { "", "", 91.6333, -23.1106, 5.4 }, { "", "", 91.5229, -29.7586, 5.8 }, { "36Cam", "", 93.2129, 65.7183, 5.3 }, { "", "", 91.7400, -21.8128, 5.7 }, { "19Lep", "", 91.9233, -19.1658, 5.3 }, { "", "", 92.3850, 22.1900, 5.9 }, { "", "", 91.7654, -34.3119, 5.8 }, { "3Gem", "", 92.4333, 23.1133, 5.7 }, { "", "", 92.2413, 2.4994, 5.7 }, { "\xce\xb8""Col", "", 91.8817, -37.2531, 5.0 }, { "", "", 92.2413, -22.4275, 5.5 }, { "\xcf\x80""2Col", "", 91.9704, -42.1539, 5.5 }, { "", "", 92.3929, -14.5842, 5.5 }, { "5Gem", "", 92.8846, 24.4203, 5.8 }, { "", "", 92.4496, -22.7742, 5.7 }, { "", "", 93.0837, 32.6933, 5.7 }, { "68Ori", "", 93.0054, 19.7906, 5.7 }, { "\xce\xb7""1Dor", "", 91.5392, -66.0397, 5.7 }, { "", "", 91.7642, -62.1547, 5.0 }, { "69Ori", "", 93.0138, 16.1306, 4.9 }, { "\xce\xbe""Ori", "", 92.9850, 14.2089, 4.4 }, { "", "", 92.6442, -27.1542, 5.7 }, { "40Cam", "", 93.9192, 59.9992, 5.3 }, { "", "", 92.5429, -40.3536, 5.5 }, { "", "", 92.9658, -6.5503, 5.0 }, { "", "", 94.7117, 69.3197, 4.8 }, { "\xce\xb4""Pic", "", 92.5746, -54.9686, 4.8 }, { "", "", 93.6192, 17.9064, 5.8 }, { "1Lyn", "", 94.4783, 61.5153, 4.9 }, { "\xce\xb7""Gem", "Propus", 93.7192, 22.5067, 3.2 }, { "", "", 93.4762, -3.7414, 5.8 }, { "\xce\xba""Aur", "", 93.8446, 29.4981, 4.3 }, { "71Ori", "", 93.7121, 19.1564, 5.2 }, { "\xce\xbd""Dor", "", 92.1842, -68.8433, 5.0 }, { "", "", 93.7854, 13.8511, 5.9 }, { "72Ori", "", 93.8546, 16.1431, 5.3 }, { "", "", 93.6529, -4.5683, 5.8 }, { "\xce\xb3""Mon", "", 93.7137, -6.2747, 3.9 }, { "73Ori", "", 93.9375, 12.5511, 5.3 }, { "", "", 93.8929, -0.5122, 5.6 }, { "", "", 93.8738, -4.9153, 5.9 }, { "2Lyn", "", 94.9058, 59.0108, 4.4 }, { "74Ori", "", 94.1108, 12.2722, 5.0 }, { "", "", 93.7850, -20.2722, 5.9 }, { "", "", 93.8229, -18.4767, 5.9 }, { "", "", 93.9371, -13.7183, 5.0 }, { "\xce\xb7""2Dor", "", 92.8125, -65.5894, 5.0 }, { "75Ori", "", 94.2775, 9.9425, 5.3 }, { "", "", 94.0321, -16.6178, 5.9 }, { "", "", 94.3171, 5.1003, 5.7 }, { "\xce\xba""Col", "", 94.1379, -35.1406, 4.3 }, { "4Lyn", "", 95.5150, 59.3722, 5.9 }, { "", "", 94.4237, -16.8158, 5.1 }, { "\xce\xb1""Men", "", 92.5600, -74.7531, 5.0 }, { "", "", 94.2550, -37.7375, 5.5 }, { "45Aur", "", 95.4421, 53.4522, 5.3 }, { "", "", 94.2896, -37.2531, 5.8 }, { "", "", 94.5571, -19.9669, 5.5 }, { "", "", 94.7108, -9.3903, 5.3 }, { "", "", 95.0175, 14.6511, 5.6 }, { "", "", 94.7458, -20.9261, 5.8 }, { "7Mon", "", 94.9283, -7.8231, 5.2 }, { "", "", 94.9983, -2.9444, 4.9 }, { "", "", 94.9208, -34.3967, 5.7 }, { "\xce\xb6""CMa", "Furud", 95.0783, -30.0633, 3.0 }, { "", "", 95.3529, -11.7733, 5.6 }, { "", "", 97.0608, 70.5356, 5.9 }, { "\xce\xbc""Gem", "", 95.7400, 22.5136, 2.8 }, { "", "", 95.1512, -34.1439, 5.5 }, { "\xcf\x88""1Aur", "", 96.2246, 49.2881, 4.9 }, { "", "", 96.6075, 56.2850, 5.6 }, { "5Lyn", "", 96.7037, 58.4172, 5.2 }, { "\xce\xb2""CMa", "Mirzam", 95.6750, -17.9558, 1.9 }, { "\xce\xb4""Col", "", 95.5283, -33.4364, 3.8 }, { "\xce\xb5""Mon", "", 95.9421, 4.5928, 4.4 }, { "", "", 96.0429, -11.5303, 5.2 }, { "", "", 96.3046, 7.0858, 5.9 }, { "", "", 95.9829, -25.5778, 5.6 }, { "", "", 96.3183, -0.9461, 5.8 }, { "", "", 96.0042, -36.7078, 5.6 }, { "\xce\xbd""Pic", "", 95.7325, -56.3700, 5.6 }, { "", "", 95.9071, -52.1811, 5.9 }, { "", "", 96.6650, -1.5072, 5.8 }, { "\xce\xb1""Car", "Canopus", 95.9879, -52.6958, -0.7 }, { "6Lyn", "", 97.6967, 58.1628, 5.8 }, { "48Aur", "", 97.1421, 30.4931, 5.5 }, { "", "", 96.8350, 2.9081, 5.5 }, { "", "", 96.8075, 0.2992, 5.2 }, { "", "", 96.8150, -0.2761, 5.5 }, { "47Aur", "", 97.5125, 46.6856, 5.9 }, { "\xce\xbd""Gem", "", 97.2408, 20.2122, 4.1 }, { "10Mon", "", 96.9900, -4.7622, 5.0 }, { "", "", 96.0571, -60.2811, 5.8 }, { "", "", 96.4317, -48.1772, 5.7 }, { "\xcf\x80""1Dor", "", 95.6592, -69.9842, 5.5 }, { "\xce\xb2""Mon", "", 97.2042, -7.0328, 4.6 }, { "\xce\xb2""Mon", "", 97.2062, -7.0344, 5.4 }, { "\xce\xb2""Mon", "", 97.2062, -7.0344, 5.6 }, { "", "", 97.1554, -17.4661, 5.7 }, { "\xce\xbb""CMa", "", 97.0421, -32.5800, 4.4 }, { "", "", 100.1200, 77.9958, 5.7 }, { "", "", 97.1633, -32.3711, 5.7 }, { "", "", 97.5471, -10.0814, 5.9 }, { "", "", 96.7667, -58.0022, 5.8 }, { "", "", 98.1133, 32.4547, 5.8 }, { "", "", 97.9513, 11.5444, 5.2 }, { "\xcf\x80""2Dor", "", 96.3692, -69.6903, 5.3 }, { "", "", 97.8458, -12.3917, 5.1 }, { "", "", 97.6929, -27.7694, 5.9 }, { "", "", 97.9587, -8.1581, 5.4 }, { "12Mon", "", 98.0800, 4.8558, 5.8 }, { "", "", 97.4546, -50.2392, 5.2 }, { "13Mon", "", 98.2258, 7.3331, 4.5 }, { "", "", 98.0962, -5.8689, 5.6 }, { "\xce\xbe""1CMa", "", 97.9637, -23.4183, 4.3 }, { "", "", 97.8042, -35.2592, 5.8 }, { "", "", 97.3688, -56.8528, 5.2 }, { "", "", 98.4004, 14.1553, 5.5 }, { "8Lyn", "", 99.4225, 61.4811, 5.9 }, { "", "", 98.4079, -1.2203, 5.1 }, { "", "", 100.1342, 71.7489, 5.9 }, { "", "", 98.1625, -32.0306, 5.6 }, { "49Aur", "", 98.8004, 28.0222, 5.2 }, { "", "", 98.0888, -37.6967, 5.2 }, { "", "", 97.8263, -51.8261, 5.6 }, { "", "", 101.5588, 79.5647, 5.4 }, { "11Lyn", "", 99.4104, 56.8575, 5.8 }, { "", "", 99.1371, 38.4453, 5.2 }, { "", "", 98.8233, 9.9883, 5.8 }, { "", "", 98.8158, 0.8900, 5.8 }, { "", "", 98.4562, -36.2322, 5.4 }, { "\xce\xbc""Pic", "", 97.9933, -58.7542, 5.7 }, { "\xce\xbe""2CMa", "", 98.7642, -22.9647, 4.5 }, { "", "", 98.6471, -32.7164, 5.6 }, { "", "", 99.1471, -5.2111, 5.5 }, { "51Aur", "", 99.6646, 39.3908, 5.6 }, { "\xcf\x88""3Aur", "", 99.7050, 39.9025, 5.2 }, { "\xce\xb3""Gem", "Alhena", 99.4279, 16.3992, 1.9 }, { "\xce\xbd""1CMa", "", 99.0950, -18.6600, 5.7 }, { "", "", 98.8504, -36.7800, 5.5 }, { "53Aur", "", 99.5958, 28.9842, 5.7 }, { "\xcf\x88""2Aur", "", 99.8329, 42.4889, 4.7 }, { "", "", 99.1946, -13.3208, 5.9 }, { "\xce\xbd""2CMa", "", 99.1708, -19.2558, 3.9 }, { "", "", 98.7442, -52.9756, 4.3 }, { "\xce\xbd""3CMa", "", 99.4725, -18.2375, 4.4 }, { "", "", 99.3075, -36.9906, 5.7 }, { "", "", 99.4483, -32.3397, 5.2 }, { "", "", 99.9483, 12.9831, 5.9 }, { "", "", 99.8196, -14.1458, 4.8 }, { "\xce\xbd""Pup", "", 99.4404, -43.1961, 3.1 }, { "15Mon", "", 100.2446, 9.8956, 4.6 }, { "\xcf\x88""4Aur", "", 100.7708, 44.5244, 5.0 }, { "", "", 99.9279, -30.4703, 5.7 }, { "", "", 100.2725, 0.4953, 5.7 }, { "", "", 99.6567, -48.2203, 4.9 }, { "26Gem", "", 100.6013, 17.6453, 5.2 }, { "", "", 100.4850, -9.1672, 5.1 }, { "12Lyn", "", 101.5588, 59.4417, 4.8 }, { "\xce\xb5""Gem", "Mebsuta", 100.9829, 25.1311, 2.9 }, { "13Lyn", "", 101.7062, 57.1692, 5.3 }, { "30Gem", "", 100.9971, 13.2278, 4.4 }, { "", "", 100.9112, 3.9322, 5.9 }, { "28Gem", "", 101.1896, 28.9708, 5.4 }, { "\xcf\x88""5Aur", "", 101.6846, 43.5775, 5.2 }, { "\xce\xbe""Gem", "", 101.3225, 12.8956, 3.3 }, { "\xcf\x88""6Aur", "", 101.9150, 48.7894, 5.2 }, { "42Cam", "", 102.7379, 67.5719, 5.1 }, { "\xce\xb1""CMa", "Sirius", 101.2871, -16.7161, -1.4 }, { "10CMa", "", 101.1183, -31.0706, 5.2 }, { "16Mon", "", 101.6350, 8.5872, 5.9 }, { "", "", 101.4971, -14.7961, 5.3 }, { "", "", 101.3450, -31.7936, 5.9 }, { "", "", 101.3804, -30.9489, 5.8 }, { "", "", 101.6625, -10.1072, 5.6 }, { "17Mon", "", 101.8325, 8.0372, 4.7 }, { "11CMa", "", 101.7129, -14.4258, 5.2 }, { "18Mon", "", 101.9650, 2.4122, 4.4 }, { "", "", 101.9046, -8.9983, 5.0 }, { "43Cam", "", 103.4258, 68.8883, 5.1 }, { "", "", 102.4221, 32.6067, 5.7 }, { "", "", 102.0792, -1.3192, 5.7 }, { "", "", 101.4737, -52.4100, 5.8 }, { "\xcf\x88""7Aur", "", 102.6912, 41.7814, 5.0 }, { "", "", 101.8392, -37.9297, 5.2 }, { "33Gem", "", 102.4575, 16.2028, 5.8 }, { "14Lyn", "", 103.2712, 59.4486, 5.3 }, { "", "", 102.3183, -2.2719, 5.7 }, { "", "", 102.2408, -15.1447, 5.3 }, { "", "", 101.7200, -51.2658, 5.4 }, { "35Gem", "", 102.6062, 13.4133, 5.6 }, { "", "", 101.8279, -55.5400, 5.6 }, { "", "", 105.0167, 76.9775, 4.5 }, { "36Gem", "", 102.8875, 21.7611, 5.2 }, { "", "", 102.7079, -0.5408, 5.7 }, { "", "", 103.0000, 23.6017, 5.6 }, { "", "", 102.5913, -17.0839, 5.7 }, { "\xce\xba""CMa", "", 102.4604, -32.5086, 3.9 }, { "\xce\xb8""Gem", "", 103.1971, 33.9611, 3.6 }, { "", "", 102.5971, -31.7061, 5.7 }, { "", "", 102.4775, -46.6147, 5.1 }, { "", "", 102.7183, -34.3672, 4.9 }, { "\xce\xb1""Pic", "", 102.0475, -61.9414, 3.2 }, { "", "", 103.2058, 8.3803, 5.7 }, { "\xcf\x84""Pup", "", 102.4842, -50.6147, 2.9 }, { "", "", 102.4637, -53.6222, 4.4 }, { "", "", 102.9262, -36.2303, 5.9 }, { "\xce\xb6""Men", "", 100.0113, -80.8136, 5.6 }, { "15Lyn", "", 104.3188, 58.4225, 4.3 }, { "38Gem", "", 103.6612, 13.1778, 4.6 }, { "", "", 103.3283, -19.0328, 5.6 }, { "\xcf\x88""9Aur", "", 104.1346, 46.2742, 5.8 }, { "37Gem", "", 103.8275, 25.3756, 5.7 }, { "15CMa", "", 103.3871, -20.2242, 4.8 }, { "", "", 103.6025, -1.1269, 5.4 }, { "", "", 104.2333, 46.7050, 5.8 }, { "\xce\xb8""CMa", "", 103.5475, -12.0386, 4.0 }, { "\xce\xbf""1CMa", "", 103.5329, -24.1839, 3.8 }, { "", "", 105.3396, 70.8081, 5.6 }, { "16Lyn", "", 104.4046, 45.0942, 4.9 }, { "", "", 104.2521, 33.6811, 5.8 }, { "17CMa", "", 103.7613, -20.4047, 5.7 }, { "", "", 104.1075, 9.9564, 5.9 }, { "\xcf\x80""CMa", "", 103.9058, -20.1364, 4.6 }, { "\xce\xbc""CMa", "", 104.0275, -14.0436, 5.0 }, { "", "", 103.9450, -22.9414, 5.3 }, { "\xce\xb9""CMa", "", 104.0342, -17.0542, 4.3 }, { "\xce\xb9""Vol", "", 102.8625, -70.9633, 5.4 }, { "", "", 104.3912, -24.6306, 5.4 }, { "", "", 104.0667, -48.7211, 4.9 }, { "", "", 115.1271, 87.0200, 5.0 }, { "", "", 104.7375, 3.6022, 5.9 }, { "41Gem", "", 105.0658, 16.0789, 5.6 }, { "", "", 104.6496, -25.4139, 5.5 }, { "\xce\xb5""CMa", "Adhara / Adara", 104.6562, -28.9722, 1.5 }, { "", "", 104.6046, -34.1117, 5.0 }, { "", "", 105.0987, -8.4069, 5.9 }, { "\xcf\x89""Gem", "", 105.6033, 24.2153, 5.1 }, { "", "", 105.6062, 17.7556, 5.9 }, { "", "", 105.5725, 15.3361, 5.7 }, { "", "", 105.6396, 16.6742, 5.8 }, { "", "", 105.4850, -5.7222, 5.2 }, { "", "", 105.2746, -25.2153, 5.6 }, { "", "", 105.8767, 29.3372, 5.9 }, { "\xcf\x83""CMa", "", 105.4296, -27.9347, 3.4 }, { "", "", 105.8246, 9.1383, 5.9 }, { "19Mon", "", 105.7283, -4.2392, 4.9 }, { "", "", 105.9083, 10.9517, 5.1 }, { "\xce\xb6""Gem", "Mekbuda", 106.0271, 20.5703, 3.7 }, { "", "", 105.9650, 12.5944, 5.9 }, { "", "", 105.2146, -51.4025, 5.1 }, { "\xce\xbf""2CMa", "", 105.7562, -23.8333, 3.0 }, { "", "", 106.0217, -5.3236, 5.6 }, { "\xce\xb3""CMa", "Muliphen", 105.9396, -15.6333, 4.1 }, { "", "", 106.5483, 34.4739, 5.5 }, { "", "", 104.9604, -67.9161, 5.1 }, { "", "", 106.4129, 9.1858, 5.7 }, { "", "", 106.8429, 34.0094, 5.9 }, { "", "", 106.0117, -42.3372, 5.2 }, { "", "", 105.9887, -43.6081, 5.5 }, { "", "", 105.9737, -49.5839, 4.9 }, { "", "", 105.8150, -59.1781, 5.5 }, { "", "", 106.6696, -11.2942, 5.3 }, { "", "", 106.9562, 7.4711, 5.7 }, { "", "", 106.0763, -56.7497, 5.1 }, { "45Gem", "", 107.0917, 15.9308, 5.4 }, { "\xce\xb8""Men", "", 104.1433, -79.4203, 5.4 }, { "", "", 106.8442, -23.8403, 5.7 }, { "", "", 106.7796, -40.8933, 5.7 }, { "\xce\xb4""CMa", "Wezen", 107.0979, -26.3933, 1.8 }, { "63Aur", "", 107.9138, 39.3206, 4.9 }, { "\xcf\x84""Gem", "", 107.7850, 30.2453, 4.4 }, { "", "", 106.8054, -51.9678, 5.9 }, { "47Gem", "", 107.8462, 26.8567, 5.7 }, { "20Mon", "", 107.5571, -4.2372, 4.9 }, { "", "", 107.2129, -39.6558, 4.8 }, { "", "", 108.3475, 51.4289, 5.4 }, { "", "", 107.4288, -25.2311, 5.6 }, { "48Gem", "", 108.1100, 24.1283, 5.8 }, { "21Mon", "", 107.8483, -0.3019, 5.4 }, { "", "", 107.5808, -27.4914, 5.4 }, { "\xce\xb4""Mon", "", 107.9663, -0.4928, 4.1 }, { "18Lyn", "", 108.9788, 59.6375, 5.2 }, { "", "", 107.9233, -20.8831, 5.8 }, { "51Gem", "", 108.3429, 16.1589, 5.0 }, { "26CMa", "", 108.0508, -25.9425, 5.9 }, { "", "", 107.6979, -48.9322, 5.1 }, { "", "", 108.9588, 47.2400, 5.5 }, { "", "", 108.2800, -11.2514, 5.7 }, { "52Gem", "", 108.6746, 24.8850, 5.8 }, { "", "", 108.1071, -36.5444, 5.9 }, { "", "", 108.0658, -40.4989, 5.3 }, { "", "", 108.6358, 12.1158, 5.6 }, { "", "", 108.5833, 3.1114, 5.3 }, { "", "", 108.5458, -3.9014, 5.7 }, { "", "", 108.5646, -9.9475, 5.9 }, { "\xce\xb3""1Vol", "", 107.1758, -70.4972, 5.6 }, { "\xce\xb3""2Vol", "", 107.1871, -70.4989, 3.7 }, { "", "", 109.3904, 52.1308, 5.9 }, { "53Gem", "", 108.9879, 27.8975, 5.7 }, { "", "", 108.1400, -46.7594, 4.4 }, { "", "", 112.7683, 82.4114, 4.9 }, { "27CMa", "", 108.5633, -26.3525, 4.6 }, { "", "", 108.3058, -45.1831, 4.8 }, { "", "", 108.9142, 7.9778, 5.8 }, { "", "", 108.3850, -44.6397, 5.1 }, { "\xcf\x89""CMa", "", 108.7029, -26.7728, 3.8 }, { "", "", 108.7129, -27.0381, 5.5 }, { "", "", 109.6329, 49.4650, 5.0 }, { "", "", 108.9296, -10.5839, 5.9 }, { "64Aur", "", 109.5092, 40.8833, 5.7 }, { "", "", 108.8375, -30.6864, 5.3 }, { "", "", 109.0604, -15.5858, 5.4 }, { "", "", 108.7379, -41.4258, 5.9 }, { "", "", 108.6912, -46.8497, 5.7 }, { "", "", 108.6592, -48.2717, 4.7 }, { "\xce\xbb""Gem", "", 109.5233, 16.5403, 3.5 }, { "", "", 109.1533, -23.3156, 4.7 }, { "", "", 109.1458, -27.8811, 4.6 }, { "", "", 108.8375, -52.4997, 5.9 }, { "", "", 109.1325, -38.3189, 5.8 }, { "", "", 109.2062, -36.5928, 5.0 }, { "", "", 109.0646, -46.7744, 5.6 }, { "\xcf\x80""Pup", "", 109.2858, -37.0975, 2.7 }, { "", "", 110.3229, 45.2281, 5.7 }, { "\xce\xb4""Gem", "Wasat", 110.0308, 21.9822, 3.5 }, { "", "", 109.8433, 2.7406, 5.8 }, { "", "", 109.9483, 7.1428, 5.9 }, { "29CMa", "", 109.6679, -24.5589, 4.9 }, { "\xcf\x84""CMa", "", 109.6767, -24.9542, 4.4 }, { "19Lyn", "", 110.7171, 55.2814, 5.4 }, { "", "", 109.7133, -26.5858, 5.2 }, { "", "", 109.5767, -36.7342, 4.6 }, { "", "", 109.8671, -16.3950, 5.7 }, { "", "", 109.5175, -43.9867, 5.8 }, { "", "", 109.6592, -36.7428, 5.1 }, { "", "", 109.6400, -39.2103, 5.2 }, { "65Aur", "", 110.5108, 36.7606, 5.1 }, { "56Gem", "", 110.4867, 20.4436, 5.1 }, { "", "", 110.2425, -14.3600, 5.4 }, { "", "", 110.5146, 0.1772, 5.9 }, { "", "", 110.2679, -25.8914, 5.8 }, { "\xce\xb4""Vol", "", 109.2075, -67.9572, 3.9 }, { "", "", 111.2383, 51.8872, 5.8 }, { "66Aur", "", 111.0354, 40.6722, 5.1 }, { "57Gem", "", 110.8688, 25.0506, 5.0 }, { "", "", 110.6058, -5.9828, 5.8 }, { "", "", 110.5562, -19.0167, 4.9 }, { "", "", 110.1612, -52.0861, 5.3 }, { "59Gem", "", 111.1392, 27.6381, 5.7 }, { "21Lyn", "", 111.6783, 49.2114, 4.6 }, { "", "", 110.7525, -31.9239, 5.4 }, { "1CMi", "", 111.2425, 11.6697, 5.3 }, { "\xce\xb9""Gem", "", 111.4317, 27.7981, 3.7 }, { "", "", 110.8713, -27.8342, 5.3 }, { "", "", 110.8829, -32.2022, 5.3 }, { "", "", 111.1671, -16.2011, 5.3 }, { "\xce\xb7""CMa", "Aludra", 111.0238, -29.3031, 2.4 }, { "\xce\xb5""CMi", "", 111.4121, 9.2761, 4.9 }, { "", "", 112.7196, 68.4656, 5.6 }, { "", "", 111.2846, -13.7519, 5.7 }, { "", "", 111.4625, -5.7750, 5.9 }, { "", "", 111.1825, -31.8089, 5.3 }, { "61Gem", "", 111.7346, 20.2572, 5.9 }, { "", "", 111.3554, -25.2178, 5.7 }, { "", "", 112.2150, 48.1839, 5.7 }, { "\xce\xb2""CMi", "Gomeisa", 111.7875, 8.2894, 2.9 }, { "63Gem", "", 111.9350, 21.4450, 5.2 }, { "22Lyn", "", 112.4833, 49.6725, 5.3 }, { "\xce\xb7""CMi", "", 112.0087, 6.9419, 5.2 }, { "\xcf\x81""Gem", "", 112.2779, 31.7844, 4.1 }, { "", "", 111.7833, -17.8644, 5.6 }, { "\xce\xb3""CMi", "", 112.0408, 8.9256, 4.3 }, { "", "", 111.7475, -23.0861, 5.6 }, { "", "", 111.6763, -34.1408, 5.9 }, { "64Gem", "", 112.3350, 28.1181, 5.0 }, { "", "", 111.9654, -11.5569, 5.7 }, { "", "", 111.9288, -22.8597, 5.9 }, { "65Gem", "", 112.4529, 27.9161, 5.0 }, { "", "", 111.5913, -51.0183, 5.1 }, { "", "", 111.9967, -29.1558, 5.5 }, { "6CMi", "", 112.4492, 12.0067, 4.5 }, { "", "", 112.3279, -1.9053, 5.5 }, { "", "", 112.3571, -7.5511, 5.8 }, { "", "", 112.3421, -10.3267, 5.7 }, { "", "", 112.2704, -31.4564, 5.7 }, { "", "", 112.4642, -23.0244, 4.8 }, { "", "", 112.2738, -38.8122, 5.4 }, { "", "", 112.9517, 17.0861, 5.4 }, { "\xcf\x83""Pup", "", 112.3075, -43.3014, 3.2 }, { "\xce\xb4""1CMi", "", 113.0246, 1.9144, 5.2 }, { "", "", 112.6771, -30.9622, 4.6 }, { "", "", 113.0242, -8.8808, 5.9 }, { "", "", 112.4983, -52.6511, 5.8 }, { "68Gem", "", 113.4021, 15.8267, 5.2 }, { "\xce\xb4""2CMi", "", 113.2983, 3.2903, 5.5 }, { "\xce\xb1""Gem", "Castor", 113.6500, 31.8886, 2.8 }, { "\xce\xb1""Gem", "Castor", 113.6500, 31.8883, 1.9 }, { "", "", 112.6287, -54.3994, 5.9 }, { "", "", 114.1958, 55.7553, 5.9 }, { "", "", 113.7862, 30.9611, 5.3 }, { "", "", 113.3312, -19.4125, 5.6 }, { "", "", 113.2904, -24.7108, 5.8 }, { "\xce\xb4""3CMi", "", 113.5658, 3.3714, 5.8 }, { "", "", 113.4496, -14.5239, 4.9 }, { "", "", 114.1317, 46.1803, 5.6 }, { "\xcf\x85""Gem", "", 113.9804, 26.8958, 4.0 }, { "", "", 113.5133, -22.2961, 4.4 }, { "", "", 113.5775, -23.4736, 5.8 }, { "", "", 113.5796, -23.4747, 5.8 }, { "", "", 113.4625, -36.3383, 5.5 }, { "", "", 114.4746, 48.7736, 5.9 }, { "", "", 113.6454, -27.0119, 5.7 }, { "", "", 114.1446, 5.8617, 5.9 }, { "\xce\xb5""Men", "", 111.4083, -79.0942, 5.5 }, { "", "", 114.0162, -14.4928, 5.7 }, { "", "", 113.8450, -28.3694, 4.6 }, { "70Gem", "", 114.6367, 35.0486, 5.5 }, { "25Mon", "", 114.3196, -4.1111, 5.1 }, { "", "", 114.1708, -19.7022, 5.7 }, { "\xce\xbf""Gem", "", 114.7913, 34.5842, 4.9 }, { "", "", 113.9154, -52.5339, 4.9 }, { "", "", 115.0608, 38.3444, 5.7 }, { "", "", 114.3421, -34.9686, 4.5 }, { "74Gem", "", 114.8692, 17.6747, 5.0 }, { "", "", 115.3017, 48.1317, 5.5 }, { "", "", 114.1829, -48.8303, 5.7 }, { "\xce\xb1""CMi", "Procyon", 114.8254, 5.2250, 0.3 }, { "", "", 114.5750, -25.3647, 4.7 }, { "24Lyn", "", 115.7517, 58.7103, 4.9 }, { "", "", 114.7054, -26.8017, 4.5 }, { "", "", 114.7075, -26.8036, 4.6 }, { "", "", 115.2438, 23.0186, 5.8 }, { "", "", 114.6829, -36.4969, 5.8 }, { "", "", 114.5758, -48.6011, 5.6 }, { "", "", 115.0967, -15.2636, 4.9 }, { "", "", 115.0567, -19.6608, 5.9 }, { "", "", 114.8642, -38.3083, 4.8 }, { "", "", 114.9325, -38.1394, 5.7 }, { "", "", 114.9492, -38.2608, 5.7 }, { "", "", 115.4658, 13.4806, 5.7 }, { "", "", 115.3967, 3.6247, 5.9 }, { "", "", 115.5133, 14.2083, 5.5 }, { "", "", 116.0175, 50.4339, 5.2 }, { "\xce\xb1""Mon", "", 115.3117, -9.5511, 3.9 }, { "\xcf\x83""Gem", "", 115.8279, 28.8836, 4.2 }, { "51Cam", "", 116.6671, 65.4558, 5.9 }, { "", "", 115.3158, -38.5336, 5.4 }, { "76Gem", "", 116.0288, 25.7842, 5.3 }, { "\xce\xba""Gem", "", 116.1117, 24.3981, 3.5 }, { "", "", 115.7004, -26.3511, 5.6 }, { "\xce\xb2""Gem", "Pollux", 116.3287, 28.0261, 1.1 }, { "1Pup", "", 115.8850, -28.4111, 4.5 }, { "", "", 115.8000, -36.0503, 5.6 }, { "3Pup", "", 115.9521, -28.9547, 3.9 }, { "", "", 115.7383, -45.1733, 5.0 }, { "", "", 116.6637, 37.5175, 5.1 }, { "", "", 115.9246, -40.9339, 5.1 }, { "81Gem", "", 116.5308, 18.5100, 4.8 }, { "", "", 116.1417, -24.6739, 5.6 }, { "", "", 116.0400, -36.0628, 5.8 }, { "11CMi", "", 116.5675, 10.7683, 5.3 }, { "", "", 116.1425, -37.9431, 5.8 }, { "\xcf\x80""Gem", "", 116.8762, 33.4156, 5.1 }, { "", "", 116.5092, -6.7725, 5.4 }, { "4Pup", "", 116.4871, -14.5639, 5.0 }, { "", "", 116.3137, -37.9686, 3.6 }, { "", "", 116.3958, -34.1731, 5.3 }, { "", "", 116.5433, -37.9339, 5.8 }, { "", "", 116.8021, -22.5197, 5.9 }, { "\xce\xb6""Vol", "", 115.4550, -72.6061, 3.9 }, { "5Pup", "", 116.9862, -12.1931, 5.4 }, { "\xce\xbf""Pup", "", 117.0217, -25.9372, 4.5 }, { "", "", 116.8542, -38.5111, 5.0 }, { "", "", 116.8812, -46.6086, 5.2 }, { "", "", 117.2571, -24.9122, 5.3 }, { "6Pup", "", 117.4217, -17.2283, 5.1 }, { "\xce\xbe""Pup", "", 117.3237, -24.8597, 3.3 }, { "", "", 117.0846, -47.0778, 4.7 }, { "", "", 117.5442, -9.1833, 5.6 }, { "", "", 117.3112, -35.2433, 5.9 }, { "", "", 117.3975, -33.2889, 5.6 }, { "", "", 117.9862, 19.3253, 5.9 }, { "", "", 117.3096, -46.3733, 4.1 }, { "", "", 117.3037, -46.8578, 5.8 }, { "\xce\xb6""CMi", "", 117.9250, 1.7669, 5.1 }, { "", "", 117.2779, -56.4106, 5.5 }, { "9Pup", "", 117.9429, -13.8981, 5.1 }, { "26Lyn", "", 118.6779, 47.5647, 5.4 }, { "\xcf\x86""Gem", "", 118.3742, 26.7658, 4.9 }, { "", "", 117.9287, -21.1739, 5.6 }, { "", "", 117.3037, -60.2836, 5.7 }, { "", "", 117.5996, -50.5097, 5.9 }, { "", "", 118.1996, -5.4281, 5.7 }, { "10Pup", "", 118.0788, -14.8464, 5.6 }, { "", "", 120.0487, 73.9181, 5.4 }, { "", "", 118.0654, -34.7053, 5.0 }, { "", "", 118.0542, -40.5758, 3.7 }, { "", "", 117.4208, -66.1958, 5.7 }, { "", "", 121.1962, 79.4797, 5.4 }, { "", "", 118.1613, -38.8631, 4.4 }, { "", "", 118.2646, -36.3639, 5.4 }, { "85Gem", "", 118.9163, 19.8839, 5.3 }, { "", "", 118.8808, 8.8628, 5.8 }, { "", "", 118.1238, -54.3672, 5.7 }, { "", "", 118.2654, -49.6131, 4.6 }, { "", "", 118.3258, -48.1031, 4.2 }, { "", "", 118.5458, -35.8775, 5.4 }, { "1Cnc", "", 119.2475, 15.7903, 5.7 }, { "11Pup", "", 119.2146, -22.8800, 4.2 }, { "", "", 119.6313, 16.5186, 5.9 }, { "", "", 118.7217, -57.3031, 5.6 }, { "", "", 120.3363, 59.0475, 5.7 }, { "14CMi", "", 119.5858, 2.2247, 5.2 }, { "", "", 119.4171, -30.3347, 4.7 }, { "", "", 119.2413, -43.5003, 5.3 }, { "", "", 119.3267, -44.1097, 5.0 }, { "\xcf\x87""Car", "", 119.1946, -52.9822, 3.4 }, { "", "", 119.0775, -60.5264, 5.7 }, { "", "", 119.4658, -45.5778, 5.1 }, { "27Mon", "", 119.9338, -3.6797, 4.9 }, { "12Pup", "", 119.7738, -23.3106, 5.1 }, { "\xcf\x89""1Cnc", "", 120.2329, 25.3928, 5.8 }, { "3Cnc", "", 120.1971, 17.3086, 5.5 }, { "", "", 119.5600, -49.2450, 4.4 }, { "", "", 119.9667, -18.3992, 4.6 }, { "5Cnc", "", 120.3763, 16.4553, 5.9 }, { "", "", 120.3075, 4.8797, 5.6 }, { "", "", 119.7575, -45.2161, 5.9 }, { "", "", 119.4454, -60.3033, 5.6 }, { "", "", 119.8683, -39.2972, 5.2 }, { "28Mon", "", 120.3054, -1.3925, 4.6 }, { "", "", 120.5662, 2.3344, 4.3 }, { "", "", 119.7104, -60.8244, 5.8 }, { "\xcf\x87""Gem", "", 120.8796, 27.7942, 4.9 }, { "", "", 119.9067, -60.5869, 5.1 }, { "", "", 120.4058, -37.2836, 5.9 }, { "", "", 120.2079, -54.1514, 5.8 }, { "", "", 120.0833, -63.5675, 4.8 }, { "", "", 120.7671, -32.4639, 5.8 }, { "", "", 120.6867, -41.3100, 5.5 }, { "8Cnc", "", 121.2688, 13.1181, 5.1 }, { "\xce\xb6""Pup", "Naos", 120.8963, -40.0033, 2.2 }, { "\xce\xbc""1Cnc", "", 121.5767, 22.6356, 5.9 }, { "", "", 121.0675, -32.6750, 5.3 }, { "27Lyn", "", 122.1142, 51.5067, 4.8 }, { "", "", 122.5158, 58.2481, 5.9 }, { "\xce\xbc""2Cnc", "", 121.9408, 21.5817, 5.3 }, { "", "", 121.1767, -50.5906, 5.9 }, { "", "", 121.2667, -53.1081, 5.5 }, { "", "", 123.2033, 68.4742, 5.3 }, { "", "", 121.8250, -20.5547, 5.3 }, { "\xcf\x81""Pup", "", 121.8858, -24.3042, 2.8 }, { "", "", 121.6683, -45.2664, 5.0 }, { "\xce\xb6""Mon", "", 122.1483, -2.9839, 4.3 }, { "\xcf\x88""Cnc", "", 122.6133, 25.5072, 5.7 }, { "16Pup", "", 122.2567, -19.2450, 4.4 }, { "", "", 122.3688, -16.2489, 5.6 }, { "", "", 123.4592, 56.4522, 5.8 }, { "18Pup", "", 122.6658, -13.7992, 5.5 }, { "", "", 122.2900, -48.6844, 5.7 }, { "", "", 122.3996, -44.1228, 5.2 }, { "\xce\xb3""1Vel", "", 122.3721, -47.3458, 4.2 }, { "\xce\xb3""2Vel", "", 122.3833, -47.3367, 1.7 }, { "\xce\xb6""1Cnc", "Tegmine", 123.0529, 17.6478, 5.6 }, { "19Pup", "", 122.8179, -12.9269, 4.7 }, { "", "", 122.8875, -7.7725, 5.3 }, { "", "", 122.4300, -47.9375, 5.2 }, { "15Cnc", "", 123.2871, 29.6567, 5.6 }, { "", "", 124.8842, 75.7569, 5.5 }, { "", "", 122.3900, -56.0856, 5.6 }, { "", "", 122.2529, -61.3025, 4.7 }, { "\xce\xb5""Vol", "", 121.9825, -68.6172, 4.3 }, { "", "", 122.8396, -39.6186, 4.4 }, { "", "", 122.8579, -42.9872, 4.7 }, { "", "", 122.7962, -48.4619, 5.8 }, { "20Pup", "", 123.3333, -15.7883, 4.9 }, { "", "", 123.0000, -46.6442, 5.7 }, { "29Lyn", "", 124.4600, 59.5711, 5.6 }, { "", "", 125.1679, 72.4072, 5.9 }, { "", "", 123.3733, -35.8997, 4.7 }, { "", "", 123.4933, -36.3225, 5.0 }, { "", "", 123.5550, -35.4906, 5.7 }, { "", "", 123.5121, -40.3481, 4.4 }, { "", "", 123.4008, -46.9919, 5.1 }, { "", "", 124.8221, 62.5072, 5.7 }, { "", "", 123.3921, -50.1961, 5.5 }, { "\xce\xb2""Cnc", "", 124.1288, 9.1856, 3.5 }, { "", "", 123.5996, -45.8344, 5.8 }, { "30Lyn", "", 125.1088, 57.7433, 5.8 }, { "", "", 124.5996, -12.6319, 5.9 }, { "", "", 123.8162, -62.9158, 5.1 }, { "\xcf\x87""Cnc", "", 125.0163, 27.2178, 5.1 }, { "", "", 125.0875, 20.7478, 5.8 }, { "", "", 124.5725, -35.4517, 5.5 }, { "\xce\xbb""Cnc", "", 125.1337, 24.0222, 5.9 }, { "", "", 124.6388, -36.6594, 4.4 }, { "31Lyn", "", 125.7088, 43.1881, 4.2 }, { "", "", 125.9521, 53.2197, 5.5 }, { "", "", 125.3383, -20.0792, 5.5 }, { "", "", 124.5788, -65.6133, 5.0 }, { "", "", 125.4775, -17.5864, 5.7 }, { "", "", 125.3458, -33.0544, 4.8 }, { "", "", 125.3375, -36.4844, 5.2 }, { "20Cnc", "", 125.8408, 18.3322, 5.9 }, { "", "", 125.7250, -7.5433, 5.9 }, { "", "", 125.7079, -26.3481, 5.9 }, { "", "", 125.3000, -57.9731, 5.9 }, { "", "", 125.6317, -48.4903, 4.8 }, { "1Hya", "", 126.1458, -3.7511, 5.6 }, { "", "", 125.7300, -52.1239, 5.8 }, { "\xce\xba""1Vol", "", 124.9542, -71.5150, 5.3 }, { "\xce\xba""2Vol", "", 125.0029, -71.5053, 5.6 }, { "", "", 127.4425, 67.2975, 5.8 }, { "\xcf\x86""1Cnc", "", 126.6154, 27.8936, 5.5 }, { "", "", 126.3979, 2.1022, 5.7 }, { "", "", 126.4783, 7.5644, 5.1 }, { "\xce\xb5""Car", "Avior", 125.6283, -59.5097, 1.8 }, { "", "", 126.2296, -23.1536, 5.6 }, { "", "", 126.4150, -3.9064, 3.9 }, { "", "", 126.2654, -24.0461, 5.2 }, { "\xce\xb1""Cha", "", 124.6317, -76.9197, 4.0 }, { "27Cnc", "", 126.6829, 12.6544, 5.5 }, { "", "", 126.4817, -14.9297, 5.9 }, { "2Hya", "", 126.6133, -3.9875, 5.5 }, { "", "", 126.2383, -42.7694, 5.9 }, { "\xce\xbf""UMa", "Muscida", 127.5662, 60.7181, 3.3 }, { "", "", 126.6746, -12.5344, 5.5 }, { "", "", 126.4663, -42.1533, 5.4 }, { "", "", 126.3792, -51.7281, 5.1 }, { "29Cnc", "", 127.1554, 14.2108, 5.9 }, { "\xce\xb7""Vol", "", 125.5183, -73.4000, 5.2 }, { "\xce\xb8""Cha", "", 125.1604, -77.4844, 4.3 }, { "", "", 126.9971, -35.1139, 5.7 }, { "", "", 126.4650, -64.6008, 5.9 }, { "\xce\xb2""Vol", "", 126.4342, -66.1369, 3.7 }, { "", "", 126.9021, -53.0886, 5.0 }, { "2UMa", "", 128.6508, 65.1450, 5.4 }, { "\xcf\x85""1Cnc", "", 127.8771, 24.0811, 5.7 }, { "", "", 127.2817, -44.1606, 5.7 }, { "\xce\xb8""Cnc", "", 127.8988, 18.0944, 5.3 }, { "", "", 127.2696, -47.9292, 5.3 }, { "", "", 127.3650, -44.7250, 4.9 }, { "", "", 128.2292, 38.0164, 5.9 }, { "", "", 127.6192, -32.1594, 5.6 }, { "", "", 127.4400, -46.3319, 5.9 }, { "\xce\xb7""Cnc", "", 128.1771, 20.4411, 5.3 }, { "", "", 127.8788, -19.5775, 5.4 }, { "", "", 126.8204, -70.0933, 5.5 }, { "33Lyn", "", 128.6825, 36.4194, 5.7 }, { "", "", 128.4313, 4.7567, 5.8 }, { "", "", 128.5067, -2.1517, 5.8 }, { "", "", 128.0200, -53.2122, 5.6 }, { "", "", 128.4096, -38.8489, 5.9 }, { "\xcf\x80""1UMa", "", 129.7987, 65.0208, 5.6 }, { "", "", 126.0825, -80.9142, 5.6 }, { "", "", 128.9625, 6.6200, 5.9 }, { "3Hya", "", 128.8675, -7.9822, 5.7 }, { "", "", 129.5925, 53.4014, 5.6 }, { "", "", 128.8700, -26.8436, 5.9 }, { "\xcf\x80""2UMa", "", 130.0533, 64.3278, 4.6 }, { "36Cnc", "", 129.2742, 9.6556, 5.8 }, { "", "", 128.6817, -49.9442, 5.0 }, { "", "", 129.8233, 52.7117, 5.9 }, { "", "", 129.5792, 32.8019, 5.9 }, { "\xce\xb4""Hya", "", 129.4142, 5.7036, 4.1 }, { "", "", 128.9671, -50.9700, 5.8 }, { "", "", 128.8317, -58.0092, 4.8 }, { "", "", 128.8142, -58.2250, 5.2 }, { "\xcf\x83""Hya", "", 129.6892, 3.3414, 4.4 }, { "\xce\xb7""Pyx", "", 129.4675, -26.2550, 5.2 }, { "34Lyn", "", 130.2546, 45.8339, 5.3 }, { "", "", 129.4112, -42.9892, 4.1 }, { "", "", 129.7833, -22.6619, 5.0 }, { "6Hya", "", 130.0062, -12.4753, 4.9 }, { "", "", 129.3283, -62.8536, 5.4 }, { "\xce\xb6""Pyx", "", 129.9271, -29.5611, 4.8 }, { "\xce\xb2""Pyx", "", 130.0258, -35.3083, 3.9 }, { "", "", 130.0804, -40.2642, 5.2 }, { "", "", 129.8492, -53.4397, 5.4 }, { "9Hya", "", 130.4304, -15.9433, 4.8 }, { "", "", 129.9900, -53.0550, 5.1 }, { "", "", 130.1471, -45.1914, 5.7 }, { "", "", 130.1567, -46.6489, 3.8 }, { "", "", 130.0733, -52.9219, 3.6 }, { "", "", 130.0725, -53.0153, 5.6 }, { "\xce\xb3""Cnc", "Asellus Borealis", 130.8212, 21.4686, 4.6 }, { "45Cnc", "", 130.8013, 12.6808, 5.6 }, { "", "", 130.3046, -47.3169, 4.7 }, { "", "", 130.2721, -48.9225, 5.9 }, { "\xce\xb7""Hya", "", 130.8063, 3.3986, 4.3 }, { "", "", 130.4871, -45.4108, 5.2 }, { "", "", 130.1542, -59.7611, 4.3 }, { "", "", 130.9183, -7.2336, 4.6 }, { "\xce\xb8""Vol", "", 129.7717, -70.3869, 5.2 }, { "\xce\xb4""Cnc", "Asellus Australis", 131.1712, 18.1542, 3.9 }, { "", "", 130.5667, -48.0992, 5.5 }, { "49Cnc", "", 131.1875, 10.0817, 5.6 }, { "", "", 130.5787, -53.1000, 5.5 }, { "", "", 130.6062, -53.1139, 4.8 }, { "\xce\xb1""Pyx", "", 130.8979, -33.1864, 3.6 }, { "\xce\xb9""Cnc", "", 131.6742, 28.7600, 4.0 }, { "", "", 130.9179, -49.8228, 5.1 }, { "", "", 131.1000, -42.6492, 4.0 }, { "", "", 131.5104, -2.0489, 5.7 }, { "", "", 131.2163, -37.1472, 5.7 }, { "50Cnc", "", 131.7333, 12.1100, 5.8 }, { "\xce\xb5""Hya", "", 131.6942, 6.4189, 3.3 }, { "12Hya", "", 131.5938, -13.5478, 4.3 }, { "\xce\xb4""Vel", "", 131.1758, -54.7083, 1.9 }, { "", "", 131.8125, -1.8972, 5.2 }, { "", "", 131.5071, -46.0417, 3.9 }, { "\xcf\x81""Hya", "", 132.1083, 5.8378, 4.3 }, { "", "", 131.6275, -45.9128, 5.4 }, { "", "", 131.8288, -46.1556, 5.7 }, { "", "", 131.6771, -56.7697, 4.4 }, { "14Hya", "", 132.3404, -3.4431, 5.3 }, { "\xce\xb7""Cha", "", 130.3313, -78.9633, 5.4 }, { "5UMa", "", 133.3442, 61.9622, 5.7 }, { "35Lyn", "", 132.9867, 43.7267, 5.1 }, { "", "", 133.0483, 45.3125, 5.9 }, { "", "", 133.0417, 42.0025, 5.9 }, { "", "", 132.4646, -32.7806, 5.2 }, { "", "", 132.5092, -29.4631, 5.8 }, { "", "", 132.4133, -40.3206, 5.4 }, { "\xce\xb3""Pyx", "", 132.6329, -27.7100, 4.0 }, { "\xcf\x83""1Cnc", "", 133.1442, 32.4742, 5.6 }, { "", "", 132.4487, -45.3081, 4.9 }, { "\xcf\x81""1Cnc", "", 133.1492, 28.3308, 5.9 }, { "15Hya", "", 132.8938, -7.1772, 5.5 }, { "", "", 132.6396, -46.5292, 5.1 }, { "6UMa", "", 134.1562, 64.6039, 5.5 }, { "57Cnc", "", 133.5613, 30.5794, 5.3 }, { "", "", 133.2000, -38.7242, 5.8 }, { "", "", 132.9025, -57.6336, 5.5 }, { "", "", 132.6450, -66.7931, 5.3 }, { "", "", 133.1608, -48.3592, 5.9 }, { "\xcf\x81""2Cnc", "", 133.9154, 27.9275, 5.2 }, { "", "", 131.4800, -79.5044, 5.7 }, { "", "", 134.2083, 45.6319, 5.7 }, { "", "", 134.1271, 40.2017, 5.8 }, { "\xce\xb6""Hya", "", 133.8483, 5.9456, 3.1 }, { "60Cnc", "", 133.9817, 11.6261, 5.4 }, { "", "", 133.4613, -47.5208, 5.3 }, { "", "", 133.8017, -18.2414, 5.7 }, { "\xcf\x83""2Cnc", "", 134.2358, 32.9103, 5.4 }, { "\xce\xb4""Pyx", "", 133.8812, -27.6819, 4.8 }, { "", "", 133.4529, -60.3542, 5.7 }, { "\xce\xbf""1Cnc", "", 134.3121, 15.3228, 5.2 }, { "", "", 134.1421, -16.7094, 5.9 }, { "\xce\xbf""2Cnc", "", 134.3967, 15.5814, 5.6 }, { "\xce\xb9""UMa", "Dnoces / Talitha", 134.8017, 48.0417, 3.1 }, { "", "", 133.7996, -54.9656, 5.7 }, { "", "", 133.7617, -60.6447, 3.8 }, { "\xce\xb1""Cnc", "Acubens", 134.6217, 11.8578, 4.2 }, { "", "", 134.0808, -52.7236, 4.6 }, { "\xcf\x83""3Cnc", "", 134.8858, 32.4186, 5.2 }, { "\xcf\x81""UMa", "", 135.6362, 67.6297, 4.7 }, { "", "", 134.6829, -16.1328, 5.8 }, { "", "", 135.1600, 41.7828, 3.9 }, { "", "", 134.2433, -59.2294, 4.9 }, { "", "", 134.4825, -48.5733, 5.8 }, { "66Cnc", "", 135.3504, 32.2525, 5.8 }, { "", "", 134.7179, -47.2347, 5.1 }, { "", "", 135.0225, -41.2539, 4.4 }, { "", "", 136.0017, 54.2839, 5.7 }, { "\xce\xba""UMa", "", 135.9062, 47.1567, 3.6 }, { "\xce\xbd""Cnc", "", 135.6846, 24.4528, 5.4 }, { "", "", 135.4917, -0.4828, 5.6 }, { "", "", 134.8504, -59.0836, 5.1 }, { "", "", 135.6867, 7.2981, 5.8 }, { "", "", 135.3367, -41.8644, 5.5 }, { "", "", 136.3504, 48.5303, 5.9 }, { "", "", 135.1904, -60.9639, 5.7 }, { "", "", 135.4358, -52.1883, 5.2 }, { "\xcf\x83""1UMa", "", 137.0983, 66.8733, 5.1 }, { "", "", 135.2854, -68.6839, 5.8 }, { "", "", 136.6325, 38.4522, 4.5 }, { "\xcf\x89""Hya", "", 136.4933, 5.0922, 4.9 }, { "", "", 136.0387, -47.0978, 3.7 }, { "\xce\xb1""Vol", "", 135.6117, -66.3961, 4.0 }, { "\xcf\x83""2UMa", "", 137.5967, 67.1347, 4.8 }, { "15UMa", "", 137.2179, 51.6047, 4.4 }, { "\xcf\x84""Cnc", "", 137.0004, 29.6542, 5.4 }, { "\xce\xba""Cnc", "", 136.9367, 10.6681, 5.2 }, { "\xcf\x84""UMa", "", 137.7296, 63.5136, 4.6 }, { "", "", 137.2129, 33.8822, 5.9 }, { "75Cnc", "", 137.1971, 26.6292, 5.9 }, { "\xce\xbe""Cnc", "", 137.3396, 22.0456, 5.1 }, { "\xce\xba""Pyx", "", 137.0121, -25.8583, 4.5 }, { "19Hya", "", 137.1758, -8.5894, 5.6 }, { "\xce\xbb""Vel", "Suhail", 136.9992, -43.4325, 2.2 }, { "", "", 137.2979, -12.3578, 5.7 }, { "", "", 137.2679, -18.3286, 5.7 }, { "", "", 137.6612, 30.9631, 5.9 }, { "20Hya", "", 137.3979, -8.7878, 5.4 }, { "", "", 136.4096, -70.5389, 4.7 }, { "", "", 136.2867, -72.6028, 4.4 }, { "\xce\xb5""Pyx", "", 137.4850, -30.3653, 5.5 }, { "", "", 138.9692, 72.9461, 5.9 }, { "16UMa", "", 138.5858, 61.4233, 5.1 }, { "36Lyn", "", 138.4508, 43.2178, 5.3 }, { "", "", 137.9946, -19.7478, 5.7 }, { "", "", 137.7683, -44.8681, 5.0 }, { "", "", 137.8883, -46.5839, 5.7 }, { "", "", 137.7417, -58.9669, 3.4 }, { "17UMa", "", 138.9579, 56.7414, 5.2 }, { "", "", 138.1275, -43.6136, 5.5 }, { "18UMa", "", 139.0471, 54.0219, 4.8 }, { "", "", 137.8192, -62.3172, 3.9 }, { "", "", 138.8096, 34.6336, 5.9 }, { "\xce\xb8""Hya", "", 138.5912, 2.3142, 3.8 }, { "\xcf\x80""2Cnc", "", 138.8075, 14.9414, 5.3 }, { "", "", 138.3938, -47.3386, 5.9 }, { "", "", 138.5342, -44.1458, 5.8 }, { "", "", 138.2317, -59.4144, 5.5 }, { "", "", 138.6021, -43.2275, 5.2 }, { "", "", 139.3800, 46.8172, 5.9 }, { "", "", 138.7383, -37.6025, 5.8 }, { "\xce\xb6""Oct", "", 134.1713, -85.6631, 5.4 }, { "", "", 138.5750, -55.5697, 5.2 }, { "23Hya", "", 139.1738, -6.3531, 5.2 }, { "", "", 138.9029, -38.5700, 4.9 }, { "24Hya", "", 139.1721, -8.7447, 5.4 }, { "", "", 138.9379, -37.4133, 4.6 }, { "\xce\xb2""Car", "Miaplacidus", 138.3000, -69.7172, 1.6 }, { "", "", 139.6083, 35.3642, 5.7 }, { "", "", 139.2812, -14.5736, 5.8 }, { "38Lyn", "", 139.7113, 36.8025, 3.8 }, { "", "", 139.0962, -44.2658, 5.1 }, { "", "", 139.2383, -39.4014, 5.3 }, { "", "", 139.0508, -57.5414, 4.3 }, { "", "", 140.4304, 56.6992, 5.4 }, { "\xce\xb9""Car", "Aspidiske", 139.2725, -59.2753, 2.2 }, { "", "", 139.5242, -51.0511, 5.2 }, { "", "", 139.8883, -15.8344, 5.7 }, { "\xce\xb1""Lyn", "", 140.2637, 34.3925, 3.1 }, { "26Hya", "", 139.9433, -11.9750, 4.7 }, { "", "", 139.6758, -51.5606, 5.8 }, { "27Hya", "", 140.1208, -9.5558, 4.8 }, { "", "", 139.3217, -68.6894, 5.3 }, { "\xce\xb8""Pyx", "", 140.3733, -25.9656, 4.7 }, { "", "", 139.3558, -74.8944, 5.2 }, { "", "", 139.3642, -74.7347, 5.8 }, { "", "", 140.4621, -42.1950, 5.5 }, { "", "", 140.2367, -62.4047, 4.8 }, { "", "", 140.6000, -46.0475, 5.7 }, { "\xce\xba""Leo", "", 141.1637, 26.1822, 4.4 }, { "", "", 140.4583, -55.5150, 5.6 }, { "\xce\xbb""Pyx", "", 140.8012, -28.8339, 4.6 }, { "\xce\xba""Vel", "", 140.5283, -55.0108, 2.5 }, { "28Hya", "", 141.3500, -5.1175, 5.5 }, { "", "", 141.0238, -61.6489, 5.9 }, { "", "", 142.1667, 45.6014, 5.4 }, { "\xce\xb1""Hya", "Alphard", 141.8967, -8.6586, 1.9 }, { "", "", 141.8267, -22.3439, 4.6 }, { "", "", 141.9450, -6.0711, 5.3 }, { "", "", 144.2717, 81.3264, 4.2 }, { "", "", 141.3629, -61.9503, 5.7 }, { "", "", 141.5754, -53.3792, 5.1 }, { "\xcf\x89""Leo", "", 142.1146, 9.0567, 5.4 }, { "3Leo", "", 142.1217, 8.1883, 5.7 }, { "23UMa", "", 142.8821, 63.0619, 3.6 }, { "\xcf\x84""1Hya", "", 142.2871, -2.7689, 4.6 }, { "", "", 142.3025, -20.7486, 5.6 }, { "7LMi", "", 142.6800, 33.6556, 5.8 }, { "\xce\xb5""Ant", "", 142.3113, -35.9514, 4.5 }, { "22UMa", "", 143.7233, 72.2056, 5.7 }, { "8LMi", "", 142.8850, 35.1031, 5.3 }, { "", "", 142.4771, -26.5897, 5.4 }, { "24UMa", "", 143.6204, 69.8303, 4.5 }, { "", "", 142.5942, -15.5772, 5.8 }, { "\xce\xbb""Leo", "Alterf", 142.9300, 22.9681, 4.3 }, { "\xce\xb8""UMa", "", 143.2142, 51.6772, 3.1 }, { "", "", 142.1958, -62.2731, 5.9 }, { "", "", 141.7767, -71.6022, 5.4 }, { "6Leo", "", 142.9900, 9.7158, 5.0 }, { "\xce\xbe""Leo", "", 142.9863, 11.2997, 4.9 }, { "", "", 142.1275, -66.7019, 5.9 }, { "", "", 142.5217, -51.5172, 5.4 }, { "\xcf\x88""Vel", "", 142.6750, -40.4667, 3.6 }, { "\xcf\x84""2Hya", "", 142.9954, -1.1850, 4.5 }, { "\xce\xb6""2Ant", "", 142.8842, -31.8719, 5.9 }, { "", "", 142.8871, -35.7150, 5.8 }, { "", "", 142.5975, -58.3617, 5.8 }, { "\xce\xb9""Cha", "", 141.0379, -80.7869, 5.3 }, { "", "", 143.0850, -19.4003, 5.7 }, { "26UMa", "", 143.7062, 52.0514, 4.5 }, { "10LMi", "", 143.5558, 36.3975, 4.5 }, { "", "", 143.2325, -13.5169, 5.9 }, { "", "", 142.8054, -57.0344, 3.1 }, { "", "", 143.0804, -40.6494, 5.3 }, { "", "", 143.3021, -21.1158, 5.0 }, { "", "", 143.7658, 39.6214, 4.8 }, { "", "", 143.3592, -22.8639, 5.9 }, { "33Hya", "", 143.6362, -5.9150, 5.5 }, { "11LMi", "", 143.9150, 35.8103, 5.4 }, { "", "", 143.4354, -49.0050, 5.1 }, { "", "", 143.5367, -51.2553, 5.0 }, { "", "", 144.1787, 31.1617, 5.5 }, { "", "", 142.9013, -73.0808, 5.4 }, { "", "", 144.8663, 67.2722, 5.9 }, { "", "", 143.6112, -59.2294, 4.0 }, { "8Leo", "", 144.2608, 16.4378, 5.6 }, { "10Leo", "", 144.3029, 6.8358, 5.0 }, { "42Lyn", "", 144.5904, 40.2397, 5.2 }, { "", "", 144.2508, -25.2967, 5.7 }, { "", "", 144.2913, -32.1786, 5.6 }, { "", "", 144.6137, 4.6492, 4.6 }, { "", "", 144.3679, -36.0958, 5.9 }, { "", "", 144.2067, -49.3553, 4.3 }, { "", "", 145.5617, 69.2375, 5.6 }, { "27UMa", "", 145.7383, 72.2525, 5.1 }, { "", "", 144.3013, -53.6686, 5.4 }, { "", "", 144.5062, -43.1911, 5.5 }, { "\xce\xb9""Hya", "", 144.9642, -1.1428, 3.9 }, { "\xce\xba""Hya", "", 145.0767, -14.3322, 5.0 }, { "", "", 145.3967, 31.2781, 5.8 }, { "43Lyn", "", 145.5012, 39.7578, 5.6 }, { "\xce\xbf""Leo", "", 145.2875, 9.8922, 3.5 }, { "", "", 144.8375, -61.3281, 4.5 }, { "", "", 145.3208, -23.5917, 4.7 }, { "\xce\xb6""Cha", "", 143.4717, -80.9414, 5.1 }, { "15Leo", "", 145.8887, 29.9744, 5.6 }, { "", "", 145.5600, -23.9156, 4.9 }, { "", "", 145.1771, -57.9836, 5.3 }, { "", "", 145.2592, -57.2597, 5.8 }, { "\xcf\x88""Leo", "", 145.9329, 14.0217, 5.3 }, { "", "", 146.6321, 57.1281, 5.2 }, { "\xce\xb8""Ant", "", 146.0504, -27.7694, 4.7 }, { "\xce\xb5""Leo", "Ras Elased", 146.4629, 23.7742, 2.9 }, { "", "", 145.9258, -53.8917, 5.5 }, { "", "", 146.5417, 6.7086, 5.7 }, { "18Leo", "", 146.5971, 11.8100, 5.6 }, { "", "", 146.5983, 1.7856, 5.6 }, { "", "", 147.1475, 46.0211, 5.0 }, { "", "", 146.3117, -62.5078, 3.6 }, { "", "", 146.6267, -44.7550, 5.5 }, { "\xcf\x85""UMa", "", 147.7475, 59.0386, 3.8 }, { "\xcf\x85""Car", "", 146.7754, -65.0719, 3.0 }, { "", "", 147.3671, -37.1864, 5.9 }, { "\xcf\x86""UMa", "", 148.0267, 54.0644, 4.5 }, { "", "", 147.4879, -45.7328, 5.0 }, { "22Leo", "", 147.9708, 24.3953, 5.3 }, { "\xce\xbd""Cha", "", 146.5858, -76.7761, 5.4 }, { "\xcf\x85""1Hya", "", 147.8696, -14.8467, 4.1 }, { "", "", 147.6750, -46.9344, 5.7 }, { "\xce\xbc""Leo", "", 148.1908, 26.0069, 3.8 }, { "\xce\xb3""Sex", "", 148.1267, -8.1050, 5.0 }, { "", "", 147.8325, -46.1939, 5.6 }, { "", "", 147.9200, -46.5478, 4.5 }, { "", "", 147.8004, -59.4258, 5.7 }, { "", "", 147.7321, -62.7453, 5.5 }, { "", "", 148.4287, 5.9583, 5.9 }, { "31UMa", "", 148.9292, 49.8200, 5.2 }, { "", "", 149.5950, 72.8794, 5.8 }, { "", "", 148.5513, -25.9325, 4.8 }, { "", "", 149.3067, 57.4183, 5.9 }, { "", "", 148.7175, -19.0094, 4.9 }, { "", "", 148.4592, -51.1469, 5.9 }, { "", "", 148.5733, -45.2839, 5.7 }, { "", "", 149.1083, 8.9331, 5.8 }, { "", "", 148.7138, -50.2439, 5.7 }, { "19LMi", "", 149.4212, 41.0556, 5.1 }, { "", "", 149.1479, -33.4186, 5.8 }, { "\xce\xbd""Leo", "", 149.5558, 12.4447, 5.2 }, { "", "", 149.9654, 56.8119, 5.4 }, { "\xcf\x86""Vel", "", 149.2158, -54.5678, 3.5 }, { "", "", 149.9008, 29.6453, 5.7 }, { "\xce\xb7""Ant", "", 149.7179, -35.8911, 5.2 }, { "\xcf\x80""Leo", "", 150.0533, 8.0442, 4.7 }, { "20LMi", "", 150.2529, 31.9236, 5.3 }, { "", "", 150.7037, 21.9492, 5.6 }, { "", "", 151.1513, 53.8917, 5.7 }, { "", "", 150.5000, -60.4208, 5.9 }, { "", "", 151.0121, -18.1017, 5.8 }, { "", "", 151.0875, -24.2856, 5.7 }, { "\xcf\x85""2Hya", "", 151.2812, -13.0647, 4.6 }, { "21LMi", "", 151.8575, 35.2447, 4.4 }, { "\xce\xb7""Leo", "", 151.8333, 16.7628, 3.5 }, { "", "", 151.5471, -47.3700, 5.0 }, { "", "", 151.7896, -17.1417, 5.6 }, { "31Leo", "", 151.9762, 9.9975, 4.3 }, { "\xce\xb1""Sex", "", 151.9846, -0.3717, 4.4 }, { "\xce\xb1""Leo", "Regulus", 152.0929, 11.9672, 1.3 }, { "\xce\xbc""1Cha", "", 150.1821, -82.2147, 5.5 }, { "17Sex", "", 152.5312, -8.4083, 5.9 }, { "", "", 152.2346, -51.8111, 4.8 }, { "", "", 152.5246, -12.8161, 5.3 }, { "", "", 152.8033, 37.4019, 5.8 }, { "\xce\xbb""Hya", "", 152.6471, -12.3542, 3.6 }, { "", "", 152.1775, -65.8153, 5.2 }, { "18Sex", "", 152.7325, -8.4183, 5.6 }, { "", "", 152.3413, -61.5492, 5.6 }, { "", "", 152.6579, -41.7150, 5.9 }, { "", "", 152.3771, -68.6833, 5.8 }, { "19Sex", "", 153.2012, 4.6147, 5.7 }, { "", "", 152.9438, -58.0606, 5.7 }, { "", "", 153.4412, -40.3458, 5.9 }, { "", "", 153.3450, -51.2333, 5.2 }, { "", "", 153.3667, -51.7561, 5.7 }, { "", "", 153.6842, -42.1219, 3.8 }, { "23LMi", "", 154.0600, 29.3106, 5.3 }, { "", "", 153.3775, -66.3731, 5.1 }, { "32UMa", "", 154.5083, 65.1083, 5.8 }, { "35Leo", "", 154.1346, 23.5031, 5.9 }, { "\xce\xb6""Leo", "Adhafera", 154.1725, 23.4172, 3.4 }, { "", "", 154.1746, 25.3714, 5.8 }, { "\xce\xbb""UMa", "Tania Borealis", 154.2742, 42.9144, 3.4 }, { "37Leo", "", 154.1696, 13.7283, 5.4 }, { "", "", 153.8812, -43.1125, 5.6 }, { "\xcf\x89""Car", "", 153.4342, -70.0381, 3.3 }, { "39Leo", "", 154.3108, 23.1061, 5.8 }, { "\xce\xb5""Sex", "", 154.4075, -8.0689, 5.2 }, { "", "", 155.2642, 68.7475, 5.9 }, { "", "", 154.5317, -28.9919, 5.3 }, { "", "", 154.2708, -61.3322, 3.4 }, { "40Leo", "", 154.9338, 19.4708, 4.7 }, { "", "", 154.6175, -41.6683, 5.9 }, { "\xce\xb3""1Leo", "Algieba", 154.9929, 19.8417, 2.6 }, { "\xce\xb3""2Leo", "", 154.9942, 19.8406, 3.8 }, { "", "", 154.6567, -56.1100, 5.8 }, { "", "", 157.4229, 84.2522, 5.5 }, { "", "", 154.9033, -55.0294, 4.5 }, { "", "", 154.7700, -64.6764, 5.6 }, { "", "", 155.0696, -47.6992, 5.6 }, { "", "", 155.5437, 41.2294, 5.7 }, { "\xce\xbc""UMa", "Tania Australis / Alula Borealis", 155.5821, 41.4994, 3.0 }, { "", "", 156.0329, 65.5664, 4.9 }, { "", "", 155.2283, -56.0431, 4.5 }, { "27LMi", "", 155.7762, 33.9081, 5.9 }, { "", "", 155.5817, -41.6500, 4.8 }, { "28LMi", "", 156.0358, 33.7186, 5.5 }, { "25Sex", "", 155.8604, -4.0742, 5.9 }, { "", "", 157.7692, 82.5586, 5.2 }, { "", "", 155.8721, -38.0100, 5.3 }, { "44Leo", "", 156.3133, 8.7847, 5.6 }, { "", "", 155.7421, -66.9017, 4.9 }, { "30LMi", "", 156.4787, 33.7961, 4.7 }, { "", "", 156.4346, -7.0597, 5.5 }, { "\xce\xbc""Hya", "", 156.5225, -16.8364, 3.8 }, { "", "", 156.2475, -58.5764, 5.9 }, { "\xce\xb2""LMi", "", 156.9708, 36.7072, 4.2 }, { "", "", 156.0987, -74.0317, 4.0 }, { "\xce\xb1""Ant", "", 156.7879, -31.0678, 4.2 }, { "", "", 156.7042, -54.8775, 5.5 }, { "", "", 156.8517, -57.6389, 4.6 }, { "36UMa", "", 157.6567, 55.9806, 4.8 }, { "32LMi", "", 157.5267, 38.9253, 5.7 }, { "", "", 156.9696, -58.7394, 3.8 }, { "\xce\xb4""Sex", "", 157.3696, -2.7392, 5.2 }, { "", "", 157.3708, -29.6636, 5.5 }, { "\xce\xb4""Ant", "", 157.3975, -30.6072, 5.5 }, { "\xce\xb2""Sex", "", 157.5729, -0.6369, 5.0 }, { "", "", 157.2192, -64.1722, 5.2 }, { "", "", 157.7492, -13.5883, 5.5 }, { "33LMi", "", 157.9642, 32.3794, 5.9 }, { "", "", 158.7729, 75.7131, 4.8 }, { "46Leo", "", 158.0492, 14.1372, 5.4 }, { "", "", 158.3079, 40.4256, 4.7 }, { "\xcf\x81""Leo", "", 158.2029, 9.3067, 3.8 }, { "", "", 157.8408, -53.7156, 4.8 }, { "", "", 157.9896, -45.0667, 5.7 }, { "34LMi", "", 158.3788, 34.9886, 5.5 }, { "", "", 157.5838, -71.9931, 4.7 }, { "", "", 158.1400, -44.6189, 5.9 }, { "", "", 158.0058, -61.6853, 3.3 }, { "37UMa", "", 158.7904, 57.0828, 5.1 }, { "", "", 157.7583, -73.2217, 4.9 }, { "", "", 158.2371, -47.0033, 5.0 }, { "44Hya", "", 158.5037, -23.7453, 5.0 }, { "48Leo", "", 158.7000, 6.9536, 5.0 }, { "49Leo", "", 158.7592, 8.6503, 5.6 }, { "", "", 158.8038, -39.5628, 5.3 }, { "", "", 159.1350, -12.2303, 5.7 }, { "", "", 158.8971, -57.5578, 4.4 }, { "", "", 159.3071, -27.4125, 4.8 }, { "", "", 159.3883, -13.3844, 4.8 }, { "", "", 159.0846, -59.5647, 5.0 }, { "", "", 159.7738, 53.6683, 5.5 }, { "37LMi", "", 159.6800, 31.9761, 4.7 }, { "", "", 159.3254, -48.2258, 3.8 }, { "38LMi", "", 159.7817, 37.9100, 5.8 }, { "", "", 159.3617, -58.7333, 5.4 }, { "\xcf\x86""3Hya", "", 159.6458, -16.8767, 4.9 }, { "", "", 159.5104, -57.2564, 5.9 }, { "\xce\xb3""Cha", "", 158.8671, -78.6078, 4.1 }, { "", "", 160.4512, 68.4433, 5.7 }, { "", "", 159.6879, -59.1831, 4.6 }, { "38UMa", "", 160.4858, 65.7164, 5.1 }, { "", "", 159.7475, -58.8169, 5.9 }, { "", "", 159.8267, -55.6033, 4.2 }, { "", "", 160.7671, 69.0761, 5.0 }, { "", "", 160.0471, -65.1006, 5.5 }, { "39UMa", "", 160.9304, 57.1992, 5.8 }, { "40LMi", "", 160.7575, 26.3256, 5.5 }, { "", "", 160.8871, 46.2039, 5.1 }, { "41LMi", "", 160.8542, 23.1883, 5.0 }, { "35Sex", "", 160.8371, 4.7478, 5.7 }, { "", "", 160.6800, -32.7158, 5.6 }, { "", "", 160.5583, -64.4664, 4.8 }, { "", "", 160.6692, -59.2158, 5.3 }, { "\xce\xb8""Car", "", 160.7392, -64.3944, 2.7 }, { "", "", 160.8837, -60.5667, 4.5 }, { "42LMi", "", 161.4663, 30.6822, 5.2 }, { "", "", 160.9633, -64.2489, 5.7 }, { "", "", 161.0287, -63.9611, 4.8 }, { "", "", 160.4638, -79.7833, 5.9 }, { "51Leo", "", 161.6021, 18.8914, 5.4 }, { "52Leo", "", 161.6054, 14.1947, 5.4 }, { "", "", 161.7167, -17.2967, 5.4 }, { "\xce\xbc""Vel", "", 161.6925, -49.4200, 2.6 }, { "", "", 161.5687, -64.5150, 5.3 }, { "", "", 161.6238, -64.2633, 5.2 }, { "", "", 161.7396, -56.7572, 5.2 }, { "", "", 161.7133, -64.3833, 4.8 }, { "", "", 162.1692, -1.9589, 5.9 }, { "", "", 162.0592, -31.6883, 5.8 }, { "53Leo", "", 162.3142, 10.5453, 5.3 }, { "\xce\xb4""1Cha", "", 161.3154, -80.4697, 5.4 }, { "\xce\xbd""Hya", "", 162.4062, -16.1936, 3.1 }, { "", "", 162.4312, -9.8528, 5.8 }, { "\xce\xb4""2Cha", "", 161.4450, -80.5403, 4.4 }, { "43UMa", "", 162.7962, 56.5822, 5.6 }, { "42UMa", "", 162.8487, 59.3200, 5.5 }, { "41Sex", "", 162.5754, -8.8978, 5.7 }, { "", "", 162.4875, -34.0581, 5.6 }, { "", "", 162.3504, -59.3236, 5.9 }, { "", "", 162.7725, -3.0925, 5.9 }, { "", "", 163.3779, 69.8539, 5.9 }, { "44UMa", "", 163.3937, 54.5850, 5.1 }, { "46LMi", "", 163.3279, 34.2150, 3.8 }, { "\xcf\x89""UMa", "", 163.4946, 43.1900, 4.7 }, { "", "", 163.1288, -57.2406, 5.2 }, { "", "", 163.3729, -20.1389, 5.2 }, { "", "", 163.4321, -2.1292, 5.4 }, { "", "", 163.5742, -13.7581, 5.6 }, { "", "", 163.7425, 34.0347, 5.7 }, { "", "", 163.3733, -58.8533, 3.7 }, { "46UMa", "", 163.9350, 33.5069, 5.0 }, { "54Leo", "", 163.9033, 24.7497, 4.5 }, { "", "", 163.4250, -70.7203, 5.9 }, { "55Leo", "", 163.9267, 0.7369, 5.9 }, { "", "", 163.6233, -61.8267, 5.9 }, { "56Leo", "", 164.0062, 6.1853, 5.8 }, { "", "", 163.8217, -60.5169, 5.9 }, { "\xce\xb9""Ant", "", 164.1796, -37.1378, 4.6 }, { "", "", 164.2829, -50.7650, 5.9 }, { "47UMa", "", 164.8667, 40.4303, 5.0 }, { "", "", 165.0613, 45.5261, 5.4 }, { "", "", 164.8079, -33.7372, 5.7 }, { "", "", 164.8787, -16.3539, 5.8 }, { "\xce\xb1""Crt", "Alkes", 164.9437, -18.2989, 4.0 }, { "49UMa", "", 165.2100, 39.2122, 5.0 }, { "", "", 165.0483, -14.0833, 5.8 }, { "58Leo", "", 165.1400, 3.6175, 4.8 }, { "", "", 164.9975, -43.8072, 5.8 }, { "", "", 165.0387, -42.2258, 4.3 }, { "59Leo", "", 165.1867, 6.1014, 4.9 }, { "\xce\xb2""UMa", "Merak", 165.4604, 56.3825, 2.3 }, { "61Leo", "", 165.4571, -2.4847, 4.7 }, { "60Leo", "", 165.5825, 20.1797, 4.4 }, { "\xce\xb1""UMa", "Dubhe", 165.9321, 61.7508, 1.7 }, { "", "", 165.8121, -11.3036, 5.5 }, { "62Leo", "", 165.9025, -0.0008, 5.9 }, { "\xcf\x87""Leo", "", 166.2542, 7.3361, 4.6 }, { "", "", 166.1300, -47.6792, 5.6 }, { "", "", 166.2258, -35.8047, 5.4 }, { "\xcf\x87""1Hya", "", 166.3329, -27.2936, 4.9 }, { "\xcf\x87""2Hya", "", 166.4900, -27.2878, 5.7 }, { "65Leo", "", 166.7258, 1.9556, 5.5 }, { "", "", 166.6350, -62.4242, 4.6 }, { "", "", 166.8192, -42.6386, 5.1 }, { "", "", 166.7079, -70.8781, 5.5 }, { "67Leo", "", 167.2046, 24.6583, 5.6 }, { "", "", 167.3296, 36.3094, 5.7 }, { "", "", 167.1829, -28.0806, 5.4 }, { "\xcf\x88""UMa", "", 167.4158, 44.4986, 3.0 }, { "", "", 167.4104, 43.2075, 5.8 }, { "", "", 167.1475, -58.9750, 3.9 }, { "", "", 167.1417, -61.9472, 5.1 }, { "", "", 167.4725, -32.3675, 5.8 }, { "\xce\xb2""Crt", "", 167.9146, -22.8258, 4.4 }, { "", "", 168.1379, -49.1011, 5.3 }, { "", "", 168.1500, -60.3175, 4.6 }, { "", "", 168.3113, -44.3722, 5.8 }, { "", "", 168.1883, -64.1697, 5.2 }, { "69Leo", "", 168.4400, -0.0697, 5.4 }, { "\xce\xb4""Leo", "Zosma", 168.5271, 20.5236, 2.5 }, { "", "", 168.5075, 8.0606, 5.7 }, { "\xce\xb8""Leo", "Chertan / Chort", 168.5600, 15.4294, 3.3 }, { "", "", 168.4137, -53.2317, 5.7 }, { "", "", 168.3783, -59.6194, 5.7 }, { "72Leo", "", 168.8008, 23.0956, 4.6 }, { "73Leo", "", 168.9663, 13.3075, 5.3 }, { "", "", 169.1746, 49.4764, 5.8 }, { "\xcf\x86""Leo", "", 169.1654, -3.6517, 4.4 }, { "75Leo", "", 169.3225, 2.0106, 5.1 }, { "\xce\xbe""UMa", "Alula Australis", 169.5454, 31.5292, 4.8 }, { "\xce\xbe""UMa", "Alula Australis", 169.5458, 31.5292, 4.4 }, { "\xce\xbd""UMa", "", 169.6196, 33.0942, 3.4 }, { "55UMa", "", 169.7829, 38.1856, 4.7 }, { "76Leo", "", 169.7292, 1.6506, 5.9 }, { "\xce\xb4""Crt", "", 169.8354, -14.7786, 3.5 }, { "", "", 169.8187, -64.5825, 5.9 }, { "\xcf\x83""Leo", "", 170.2842, 6.0294, 4.0 }, { "\xcf\x80""Cen", "", 170.2517, -54.4911, 3.8 }, { "56UMa", "", 170.7067, 43.4828, 4.9 }, { "\xce\xbb""Crt", "", 170.8412, -18.7800, 5.0 }, { "", "", 170.8029, -36.1647, 5.0 }, { "", "", 170.7837, -56.7794, 5.7 }, { "\xce\xb9""Leo", "", 170.9812, 10.5292, 3.9 }, { "79Leo", "", 171.0096, 1.4078, 5.3 }, { "", "", 170.8408, -64.9550, 5.1 }, { "\xce\xb5""Crt", "", 171.1525, -10.8594, 4.8 }, { "", "", 171.2454, 11.4303, 5.8 }, { "\xce\xb3""Crt", "", 171.2204, -17.6839, 4.0 }, { "", "", 171.0462, -72.2567, 5.5 }, { "", "", 171.4879, 55.8506, 5.7 }, { "81Leo", "", 171.4017, 16.4564, 5.5 }, { "", "", 171.3725, -36.0631, 5.2 }, { "", "", 171.3879, -37.7478, 5.8 }, { "", "", 171.4300, -63.9728, 5.1 }, { "", "", 171.6471, -61.1153, 5.3 }, { "\xce\xba""Crt", "", 171.7896, -12.3567, 5.9 }, { "", "", 171.6971, -53.1600, 5.8 }, { "\xcf\x84""Leo", "", 171.9842, 2.8561, 4.9 }, { "", "", 172.2692, 61.7783, 5.8 }, { "57UMa", "", 172.2675, 39.3369, 5.3 }, { "", "", 172.1463, -42.6742, 5.0 }, { "85Leo", "", 172.4246, 15.4133, 5.7 }, { "", "", 172.4108, -24.4633, 5.7 }, { "58UMa", "", 172.6296, 43.1733, 5.9 }, { "87Leo", "", 172.5788, -3.0036, 4.7 }, { "86Leo", "", 172.6208, 18.4097, 5.5 }, { "\xce\xbb""Dra", "Giausar", 172.8508, 69.3311, 3.8 }, { "", "", 173.0867, 61.0825, 5.4 }, { "\xce\xbf""1Cen", "", 172.9421, -59.4422, 5.1 }, { "\xce\xbf""2Cen", "", 172.9533, -59.5158, 5.1 }, { "", "", 173.0671, -29.2633, 5.8 }, { "", "", 173.0679, -29.2611, 5.6 }, { "", "", 173.1979, -7.8275, 5.9 }, { "", "", 173.2004, -40.4364, 5.6 }, { "", "", 173.0829, -66.9622, 5.9 }, { "", "", 173.2254, -31.0872, 5.0 }, { "\xce\xbe""Hya", "", 173.2504, -31.8578, 3.5 }, { "", "", 173.4054, -40.5869, 5.3 }, { "89Leo", "", 173.5917, 3.0600, 5.7 }, { "90Leo", "", 173.6771, 16.7969, 5.9 }, { "", "", 173.7704, 54.7853, 5.6 }, { "", "", 173.6229, -32.8314, 5.9 }, { "", "", 173.6904, -54.2642, 4.6 }, { "2Dra", "", 174.0117, 69.3228, 5.2 }, { "", "", 173.7367, -49.1367, 5.5 }, { "", "", 173.8050, -47.3725, 5.7 }, { "", "", 174.0746, 27.7811, 5.8 }, { "", "", 173.9817, -47.6417, 5.2 }, { "\xce\xbb""Cen", "", 173.9450, -63.0197, 3.1 }, { "\xce\xb8""Crt", "", 174.1704, -9.8022, 4.7 }, { "", "", 174.1458, -33.5700, 5.7 }, { "\xcf\x85""Leo", "", 174.2371, -0.8239, 4.3 }, { "", "", 174.0929, -61.0522, 5.8 }, { "", "", 174.2525, -61.2833, 5.1 }, { "", "", 174.3913, -47.7472, 5.4 }, { "59UMa", "", 174.5858, 43.6256, 5.5 }, { "\xcf\x80""Cha", "", 174.3150, -75.8967, 5.6 }, { "\xcf\x89""Vir", "", 174.6150, 8.1342, 5.3 }, { "", "", 174.4517, -67.6203, 5.9 }, { "", "", 174.5304, -61.8264, 5.1 }, { "\xce\xb9""Crt", "", 174.6671, -13.2019, 5.4 }, { "", "", 174.8725, -65.3978, 5.1 }, { "\xce\xbf""Hya", "", 175.0533, -34.7447, 4.7 }, { "92Leo", "", 175.1962, 21.3528, 5.2 }, { "61UMa", "", 175.2625, 34.2017, 5.3 }, { "", "", 175.1775, -53.9686, 5.9 }, { "", "", 175.2233, -62.0900, 4.9 }, { "62UMa", "", 175.3929, 31.7461, 5.7 }, { "", "", 175.3325, -43.0958, 5.5 }, { "", "", 175.4333, -32.4997, 5.2 }, { "3Dra", "", 175.6183, 66.7450, 5.3 }, { "", "", 175.8633, -37.1903, 5.9 }, { "", "", 175.8800, -62.4894, 5.0 }, { "\xce\xb6""Crt", "", 176.1908, -18.3508, 4.7 }, { "\xce\xbe""Vir", "", 176.3212, 8.2583, 4.8 }, { "\xce\xbd""Vir", "", 176.4650, 6.5294, 4.0 }, { "\xcf\x87""UMa", "", 176.5125, 47.7794, 3.7 }, { "", "", 176.4329, -45.6900, 5.2 }, { "\xce\xbb""Mus", "", 176.4017, -66.7286, 3.6 }, { "", "", 176.7317, 55.6283, 5.2 }, { "", "", 176.6283, -61.1783, 4.1 }, { "", "", 176.6296, -40.5006, 4.9 }, { "", "", 176.8296, -57.6964, 5.4 }, { "93Leo", "", 176.9963, 20.2189, 4.5 }, { "4Vir", "", 176.9787, 8.2458, 5.3 }, { "\xce\xbc""Mus", "", 177.0596, -66.8147, 4.7 }, { "", "", 177.1612, 14.2842, 5.8 }, { "", "", 177.1879, -26.7497, 5.1 }, { "\xce\xb2""Leo", "Denebola", 177.2650, 14.5719, 2.1 }, { "", "", 177.4238, 34.9317, 5.7 }, { "", "", 177.4213, -63.7883, 4.3 }, { "", "", 177.4858, -70.2258, 4.9 }, { "\xce\xb2""Vir", "Zavijava", 177.6738, 1.7647, 3.6 }, { "", "", 177.6133, -62.6494, 5.7 }, { "", "", 177.7592, -5.3333, 5.6 }, { "", "", 177.7862, -45.1736, 4.4 }, { "", "", 177.9233, -30.8350, 5.8 }, { "", "", 177.9633, -65.2061, 4.9 }, { "", "", 178.0421, -56.9878, 5.5 }, { "\xce\xb2""Hya", "", 178.2275, -33.9081, 4.2 }, { "\xce\xb3""UMa", "Phad / Phecda", 178.4575, 53.6947, 2.4 }, { "", "", 178.6771, -25.7139, 5.3 }, { "6Vir", "", 178.7629, 8.4439, 5.5 }, { "", "", 178.7492, -63.2789, 5.9 }, { "95Leo", "", 178.9187, 15.6467, 5.5 }, { "", "", 178.9171, -28.4769, 5.9 }, { "66UMa", "", 178.9933, 56.5986, 5.8 }, { "\xce\xb7""Crt", "", 179.0037, -17.1508, 5.1 }, { "", "", 179.4171, -62.4489, 5.5 }, { "", "", 179.5633, -56.3172, 5.4 }, { "", "", 179.6987, -64.3392, 5.6 }, { "", "", 179.8233, 33.1675, 5.9 }, { "\xce\xb5""Cha", "", 179.9054, -78.2219, 4.9 }, { "7Vir", "", 179.9871, 3.6553, 5.3 }, { "", "", 180.1854, -10.4461, 5.5 }, { "\xcf\x80""Vir", "", 180.2183, 6.6142, 4.6 }, { "", "", 180.2133, -19.6589, 5.2 }, { "", "", 180.4146, 36.0419, 5.5 }, { "67UMa", "", 180.5283, 43.0456, 5.2 }, { "", "", 180.6571, -69.1922, 5.8 }, { "\xce\xb8""1Cru", "", 180.7562, -63.3128, 4.3 }, { "", "", 180.9150, -42.4342, 5.1 }, { "2Com", "", 181.0692, 21.4592, 5.8 }, { "\xce\xb8""2Cru", "", 181.0800, -63.1656, 4.7 }, { "", "", 181.1612, -68.3292, 5.3 }, { "\xce\xba""Cha", "", 181.1937, -76.5192, 5.0 }, { "", "", 181.2379, -60.9692, 5.9 }, { "\xce\xbf""Vir", "", 181.3021, 8.7331, 4.1 }, { "", "", 181.3129, 76.9058, 5.8 }, { "\xce\xb7""Cru", "", 181.7204, -64.6136, 4.1 }, { "", "", 181.9575, -75.3669, 5.1 }, { "", "", 182.0217, -50.6614, 4.4 }, { "", "", 182.0613, -48.6928, 5.3 }, { "\xce\xb4""Cen", "", 182.0896, -50.7225, 2.6 }, { "\xce\xb1""Crv", "Alchiba", 182.1033, -24.7289, 4.0 }, { "", "", 182.2242, -44.3261, 5.7 }, { "", "", 182.2271, -41.2314, 5.4 }, { "10Vir", "", 182.4221, 1.8978, 5.9 }, { "11Vir", "", 182.5142, 5.8069, 5.7 }, { "\xce\xb5""Crv", "", 182.5312, -22.6197, 3.0 }, { "3Crv", "", 182.7663, -23.6025, 5.4 }, { "\xcf\x81""Cen", "", 182.9129, -52.3686, 3.9 }, { "4Com", "", 182.9633, 25.8703, 5.6 }, { "5Com", "", 183.0387, 20.5419, 5.5 }, { "", "", 183.0917, -62.9508, 5.9 }, { "", "", 183.0496, 77.6164, 5.1 }, { "", "", 183.3554, -38.9292, 5.7 }, { "12Vir", "", 183.3579, 10.2622, 5.8 }, { "", "", 183.5108, -45.7239, 5.3 }, { "", "", 183.7483, -20.8442, 5.8 }, { "\xce\xb4""Cru", "", 183.7862, -58.7489, 2.8 }, { "", "", 183.7854, 70.2000, 5.7 }, { "\xce\xb4""UMa", "Megrez", 183.8567, 57.0325, 3.3 }, { "\xce\xb3""Crv", "Gienah", 183.9517, -17.5419, 2.5 }, { "6Com", "", 184.0008, 14.8989, 5.1 }, { "2CVn", "", 184.0317, 40.6603, 5.6 }, { "7Com", "", 184.0854, 23.9453, 4.9 }, { "", "", 184.1254, 33.0614, 5.0 }, { "\xce\xb5""Mus", "", 184.3921, -67.9608, 4.1 }, { "", "", 184.3729, 53.1911, 5.8 }, { "", "", 184.3771, 28.9372, 5.7 }, { "\xce\xb2""Cha", "", 184.5863, -79.3122, 4.2 }, { "\xce\xb6""Cru", "", 184.6088, -64.0031, 4.0 }, { "13Vir", "", 184.6679, -0.7872, 5.9 }, { "", "", 184.7488, -55.1431, 5.0 }, { "", "", 184.7079, 75.1606, 5.3 }, { "\xce\xb7""Vir", "Zaniah", 184.9767, -0.6669, 3.8 }, { "3CVn", "", 184.9529, 48.9842, 5.2 }, { "", "", 185.0446, -22.1756, 5.9 }, { "", "", 185.0821, 26.6194, 5.5 }, { "16Vir", "", 185.0875, 3.3125, 4.9 }, { "\xce\xb6""Crv", "", 185.1404, -22.2158, 5.2 }, { "11Com", "", 185.1792, 17.7928, 4.7 }, { "", "", 185.2321, -13.5656, 5.1 }, { "\xce\xb5""Cru", "", 185.3400, -60.4011, 3.5 }, { "70UMa", "", 185.2117, 57.8639, 5.5 }, { "", "", 185.4896, -56.3747, 5.9 }, { "\xce\xb6""2Mus", "", 185.5304, -67.5219, 5.1 }, { "\xce\xb6""1Mus", "", 185.5496, -68.3075, 5.7 }, { "", "", 185.7054, -57.6761, 5.3 }, { "12Com", "", 185.6263, 25.8461, 4.8 }, { "6Crv", "", 185.8400, -24.8406, 5.6 }, { "", "", 185.8975, -35.4128, 5.3 }, { "", "", 185.9371, -38.9111, 5.7 }, { "5CVn", "", 186.0062, 51.5622, 4.8 }, { "13Com", "", 186.0771, 26.0986, 5.1 }, { "", "", 186.2987, -11.6103, 5.9 }, { "", "", 186.3408, -35.1864, 5.7 }, { "71UMa", "", 186.2633, 56.7775, 5.8 }, { "6CVn", "", 186.4621, 39.0186, 5.0 }, { "", "", 186.6288, -63.1225, 4.8 }, { "\xce\xb1""1Cru", "", 186.6496, -63.0992, 1.3 }, { "\xce\xb1""2Cru", "", 186.6521, -63.0994, 1.7 }, { "", "", 186.6317, -51.4508, 4.8 }, { "14Com", "", 186.6004, 27.2683, 4.9 }, { "", "", 186.7154, -32.8300, 5.5 }, { "\xce\xb3""Com", "", 186.7346, 28.2683, 4.3 }, { "16Com", "", 186.7471, 26.8256, 5.0 }, { "", "", 186.8696, -58.9919, 5.5 }, { "\xcf\x83""Cen", "", 187.0100, -50.2306, 3.9 }, { "73UMa", "", 186.8963, 55.7128, 5.7 }, { "", "", 187.0938, -39.0414, 5.4 }, { "17Com", "", 187.2279, 25.9128, 5.2 }, { "18Com", "", 187.3621, 24.1089, 5.4 }, { "", "", 187.4746, -56.5247, 5.8 }, { "20Com", "", 187.4300, 20.8961, 5.6 }, { "\xce\xb4""Crv", "Algorab", 187.4663, -16.5156, 2.9 }, { "", "", 187.5729, -23.6967, 5.6 }, { "74UMa", "", 187.4888, 58.4058, 5.3 }, { "\xce\xb3""Cru", "Gacrux", 187.7913, -57.1133, 1.6 }, { "4Dra", "", 187.5279, 69.2011, 4.9 }, { "21Com", "", 187.7525, 24.5672, 5.4 }, { "", "", 187.9179, -59.4239, 5.4 }, { "", "", 188.0417, -73.0017, 5.8 }, { "", "", 187.9825, -63.5061, 5.9 }, { "\xce\xb3""Mus", "", 188.1167, -72.1331, 3.8 }, { "\xce\xb7""Crv", "", 188.0175, -16.1961, 4.3 }, { "", "", 188.1500, -13.8592, 5.7 }, { "", "", 188.3929, -12.8303, 5.5 }, { "21Vir", "", 188.4450, -9.4519, 5.4 }, { "", "", 188.4121, 33.2475, 5.4 }, { "\xce\xb2""CVn", "Chara", 188.4354, 41.3575, 4.2 }, { "\xce\xb2""Crv", "", 188.5967, -23.3967, 2.6 }, { "\xce\xba""Dra", "", 188.3708, 69.7883, 3.8 }, { "", "", 188.6762, -44.6733, 5.7 }, { "23Com", "", 188.7129, 22.6292, 4.8 }, { "24Com", "", 188.7825, 18.3769, 5.0 }, { "", "", 188.7837, 21.8814, 5.8 }, { "", "", 188.9396, -41.0219, 5.1 }, { "6Dra", "", 188.6833, 70.0219, 4.9 }, { "", "", 189.0050, -39.8700, 5.8 }, { "\xce\xb1""Mus", "", 189.2958, -69.1356, 2.6 }, { "25Vir", "", 189.1975, -5.8319, 5.8 }, { "", "", 189.0971, 59.4869, 5.5 }, { "25Com", "", 189.2429, 17.0894, 5.6 }, { "\xcf\x84""Cen", "", 189.4258, -48.5411, 3.8 }, { "", "", 189.4258, -27.1389, 5.4 }, { "", "", 189.5933, 1.8547, 5.7 }, { "", "", 189.7646, -30.4222, 5.8 }, { "\xcf\x87""Vir", "", 189.8117, -7.9956, 4.6 }, { "26Com", "", 189.7804, 21.0625, 5.4 }, { "", "", 189.9688, -39.9875, 4.6 }, { "", "", 190.3458, -46.1456, 5.8 }, { "\xce\xb3""Cen", "Muhlifain", 190.3792, -48.9597, 2.1 }, { "", "", 190.3175, -13.0150, 5.9 }, { "", "", 190.4858, -59.6858, 4.9 }, { "\xce\xb3""Vir", "Porrima", 190.4150, -1.4494, 3.6 }, { "\xce\xb3""Vir", "Porrima", 190.4150, -1.4494, 3.6 }, { "\xcf\x81""Vir", "", 190.4712, 10.2356, 4.8 }, { "31Vir", "", 190.4879, 6.8067, 5.5 }, { "", "", 190.7096, -63.0586, 5.3 }, { "", "", 190.6475, -48.8131, 4.6 }, { "", "", 190.9087, -1.5769, 5.9 }, { "", "", 191.0021, -28.3239, 5.4 }, { "\xce\xb9""Cru", "", 191.4079, -60.9811, 4.6 }, { "\xce\xb2""Mus", "", 191.5704, -68.1081, 3.0 }, { "10CVn", "", 191.2479, 39.2789, 5.9 }, { "", "", 191.2825, 45.4403, 4.9 }, { "32Vir", "", 191.4046, 7.6733, 5.2 }, { "", "", 191.5946, -56.4889, 4.6 }, { "33Vir", "", 191.5938, 9.5400, 5.6 }, { "", "", 191.6917, -33.3156, 5.8 }, { "27Com", "", 191.6612, 16.5775, 5.1 }, { "\xce\xb2""Cru", "Becrux / Mimosa", 191.9300, -59.6886, 1.2 }, { "", "", 191.8288, 62.7808, 5.8 }, { "", "", 192.1100, -27.5975, 5.6 }, { "", "", 192.4371, -71.9864, 5.5 }, { "7Dra", "", 191.8933, 66.7903, 5.4 }, { "29Com", "", 192.2258, 14.1225, 5.7 }, { "", "", 192.1642, 60.3200, 5.8 }, { "30Com", "", 192.3225, 27.5522, 5.7 }, { "\xce\xb9""Oct", "", 193.7442, -85.1233, 5.4 }, { "", "", 192.7413, -52.7875, 5.7 }, { "", "", 192.6717, -33.9994, 4.9 }, { "", "", 192.5446, 37.5169, 5.8 }, { "", "", 192.8242, -60.3297, 5.7 }, { "", "", 192.9867, -39.6808, 5.9 }, { "31Com", "", 192.9246, 27.5406, 4.9 }, { "", "", 193.2663, -54.9525, 5.9 }, { "", "", 193.3408, -60.3286, 5.7 }, { "", "", 193.2788, -48.9433, 4.3 }, { "", "", 193.3592, -40.1789, 4.2 }, { "\xce\xba""Cru", "", 193.4546, -60.3769, 5.9 }, { "", "", 192.2775, 83.4181, 5.8 }, { "", "", 192.3067, 83.4128, 5.2 }, { "35Com", "", 193.3242, 21.2450, 4.9 }, { "\xce\xbb""Cru", "", 193.6633, -59.1467, 4.6 }, { "\xce\xbc""1Cru", "", 193.6483, -57.1778, 4.0 }, { "\xce\xbc""2Cru", "", 193.6533, -57.1683, 5.1 }, { "\xcf\x88""Vir", "", 193.5883, -9.5389, 4.7 }, { "", "", 193.7438, -44.1519, 5.8 }, { "\xce\xb5""UMa", "Alioth", 193.5071, 55.9597, 1.7 }, { "", "", 193.8308, -42.9158, 5.4 }, { "", "", 194.1312, -72.1853, 5.9 }, { "", "", 193.9875, -56.8361, 5.3 }, { "", "", 193.7354, 47.1967, 5.8 }, { "\xce\xb4""Vir", "", 193.9008, 3.3975, 3.3 }, { "", "", 194.2683, -51.1986, 5.1 }, { "\xce\xb1""1CVn", "", 194.0017, 38.3147, 5.6 }, { "\xce\xb1""2CVn", "", 194.0071, 38.3183, 2.9 }, { "8Dra", "", 193.8687, 65.4386, 5.2 }, { "", "", 194.0733, 54.0994, 5.8 }, { "36Com", "", 194.7308, 17.4094, 4.7 }, { "44Vir", "", 194.9146, -3.8119, 5.7 }, { "\xce\xb4""Mus", "", 195.5675, -71.5489, 3.6 }, { "37Com", "", 195.0687, 30.7850, 4.9 }, { "46Vir", "", 195.1496, -3.3686, 5.9 }, { "9Dra", "", 194.9796, 66.5972, 5.3 }, { "38Com", "", 195.2900, 17.1231, 5.9 }, { "78UMa", "", 195.1825, 56.3664, 4.9 }, { "\xce\xb5""Vir", "Vindemiatrix", 195.5442, 10.9592, 2.8 }, { "\xce\xbe""1Cen", "", 195.8883, -49.5272, 4.8 }, { "", "", 195.9421, -20.5831, 5.5 }, { "", "", 196.5696, -48.4636, 4.7 }, { "", "", 196.6463, -41.5886, 5.5 }, { "\xce\xbe""2Cen", "", 196.7275, -49.9061, 4.2 }, { "14CVn", "", 196.4354, 35.7989, 5.2 }, { "", "", 196.8508, -59.8606, 5.9 }, { "", "", 196.4679, 45.2686, 5.6 }, { "39Com", "", 196.5883, 21.1533, 5.9 }, { "40Com", "", 196.5942, 22.6161, 5.6 }, { "", "", 196.9096, -53.4597, 5.7 }, { "\xce\xb8""Mus", "", 197.0292, -65.3064, 5.5 }, { "41Com", "", 196.7946, 27.6247, 4.8 }, { "49Vir", "", 196.9742, -10.7403, 5.1 }, { "", "", 197.1354, -8.9844, 5.5 }, { "\xcf\x88""Hya", "", 197.2638, -23.1181, 4.9 }, { "", "", 197.3017, 10.0222, 5.7 }, { "50Vir", "", 197.4387, -10.3294, 5.9 }, { "", "", 197.4492, 16.8486, 5.9 }, { "\xce\xb8""Vir", "", 197.4875, -5.5389, 4.3 }, { "", "", 197.9650, -69.9419, 5.9 }, { "\xce\xb1""Com", "", 197.4971, 17.5294, 5.2 }, { "\xce\xb1""Com", "", 197.4971, 17.5294, 5.2 }, { "", "", 197.7867, -42.2331, 5.7 }, { "17CVn", "", 197.5133, 38.4989, 5.9 }, { "", "", 197.8467, -43.3689, 5.2 }, { "", "", 198.0725, -59.9208, 4.6 }, { "", "", 198.5717, -78.4472, 5.8 }, { "", "", 198.2037, -66.2269, 5.9 }, { "", "", 198.0133, -37.8031, 4.8 }, { "53Vir", "", 198.0146, -16.1986, 5.0 }, { "\xce\xb2""Com", "", 197.9683, 27.8781, 4.2 }, { "", "", 198.3479, -50.7000, 5.8 }, { "", "", 198.1371, 11.5561, 5.7 }, { "", "", 198.5504, -58.6839, 5.8 }, { "", "", 198.5617, -59.1033, 4.9 }, { "\xce\xb7""Mus", "", 198.8121, -67.8944, 4.8 }, { "55Vir", "", 198.5454, -19.9308, 5.3 }, { "", "", 198.6796, -48.9567, 5.8 }, { "", "", 198.4292, 40.1528, 4.9 }, { "", "", 198.6304, 11.3317, 5.6 }, { "57Vir", "", 198.9950, -19.9431, 5.2 }, { "", "", 199.3042, -66.7836, 4.8 }, { "19CVn", "", 198.8833, 40.8553, 5.7 }, { "", "", 199.2212, -31.5061, 5.1 }, { "", "", 199.3079, -43.9794, 5.8 }, { "59Vir", "", 199.1938, 9.4242, 5.2 }, { "", "", 199.3150, 13.6756, 5.3 }, { "\xcf\x83""Vir", "", 199.4013, 5.4697, 4.8 }, { "20CVn", "", 199.3854, 40.5725, 4.7 }, { "61Vir", "", 199.6013, -18.3114, 4.7 }, { "\xce\xb3""Hya", "", 199.7304, -23.1717, 3.0 }, { "", "", 199.6158, 34.0981, 5.8 }, { "21CVn", "", 199.5604, 49.6819, 5.1 }, { "", "", 200.1575, -52.7481, 5.4 }, { "\xce\xb9""Cen", "", 200.1492, -36.7122, 2.7 }, { "", "", 200.2404, -46.8806, 5.7 }, { "23CVn", "", 200.0792, 40.1506, 5.6 }, { "", "", 200.6579, -60.9883, 4.5 }, { "", "", 200.5675, -52.1831, 5.8 }, { "", "", 200.4233, 2.0872, 5.6 }, { "64Vir", "", 200.5404, 5.1547, 5.8 }, { "", "", 201.0021, -64.5358, 4.5 }, { "\xce\xb9""1Mus", "", 201.2796, -74.8878, 5.0 }, { "63Vir", "", 200.7546, -17.7353, 5.3 }, { "65Vir", "", 200.8287, -4.9244, 5.8 }, { "", "", 201.3079, -64.4853, 5.3 }, { "", "", 201.4587, -70.6275, 5.6 }, { "66Vir", "", 201.1383, -5.1639, 5.7 }, { "\xce\xb6""UMa", "Mizar", 200.9812, 54.9253, 2.2 }, { "\xce\xb6""UMa", "Mizar", 200.9850, 54.9217, 3.9 }, { "\xce\xb1""Vir", "Spica", 201.2983, -11.1614, 0.9 }, { "", "", 201.2779, 23.8544, 5.7 }, { "", "", 201.5325, -39.7553, 5.0 }, { "", "", 201.5475, -1.1925, 5.9 }, { "", "", 201.7338, -41.4981, 5.6 }, { "80UMa", "Alcor", 201.3063, 54.9881, 4.0 }, { "68Vir", "", 201.6800, -12.7078, 5.2 }, { "", "", 201.5692, 46.0281, 5.8 }, { "69Vir", "", 201.8633, -15.9736, 4.7 }, { "", "", 202.3550, -51.1653, 5.0 }, { "70Vir", "", 202.1075, 13.7789, 4.9 }, { "", "", 201.5337, 72.3914, 5.7 }, { "", "", 202.4283, -23.2814, 4.9 }, { "71Vir", "", 202.3042, 10.8183, 5.6 }, { "\xce\xba""Oct", "", 205.2312, -85.7861, 5.5 }, { "", "", 202.1129, 59.9458, 5.4 }, { "", "", 202.7613, -39.4075, 3.8 }, { "", "", 201.7363, 78.6439, 5.7 }, { "74Vir", "", 202.9913, -6.2558, 4.6 }, { "", "", 203.1496, -28.6928, 5.6 }, { "75Vir", "", 203.2154, -15.3631, 5.5 }, { "76Vir", "", 203.2421, -10.1650, 5.2 }, { "78Vir", "", 203.5329, 3.6589, 4.9 }, { "", "", 203.6687, -13.2144, 5.9 }, { "\xce\xb6""Vir", "", 203.6733, -0.5958, 3.3 }, { "81UMa", "", 203.5304, 55.3486, 5.6 }, { "", "", 203.6992, 37.1825, 4.9 }, { "80Vir", "", 203.8804, -5.3961, 5.7 }, { "24CVn", "", 203.6137, 49.0161, 4.7 }, { "", "", 204.3008, -61.6919, 5.6 }, { "", "", 204.2750, -44.1433, 5.9 }, { "", "", 204.2017, -26.4950, 5.7 }, { "", "", 204.3487, -46.4283, 5.9 }, { "", "", 204.2462, 24.6133, 5.7 }, { "25CVn", "", 204.3650, 36.2950, 4.8 }, { "", "", 204.6750, -29.5608, 5.8 }, { "", "", 205.0454, -64.5769, 5.7 }, { "\xce\xb5""Cen", "", 204.9717, -53.4664, 2.3 }, { "", "", 204.9525, -40.0519, 5.6 }, { "", "", 204.8942, 10.7461, 5.5 }, { "", "", 204.2958, 71.2422, 5.5 }, { "", "", 205.5046, -58.7872, 5.3 }, { "", "", 205.4363, -54.5600, 5.0 }, { "82UMa", "", 204.8767, 52.9214, 5.4 }, { "1Boo", "", 205.1687, 19.9556, 5.7 }, { "2Boo", "", 205.2596, 22.4958, 5.6 }, { "82Vir", "", 205.4033, -8.7031, 5.0 }, { "83UMa", "", 205.1846, 54.6817, 4.6 }, { "", "", 205.7292, -41.4011, 5.9 }, { "", "", 205.9167, -42.0675, 5.9 }, { "84Vir", "", 205.7654, 3.5381, 5.3 }, { "", "", 205.6808, 34.9889, 5.9 }, { "", "", 205.3746, 64.8225, 5.8 }, { "83Vir", "", 206.1242, -16.1792, 5.6 }, { "", "", 206.4038, -26.1161, 5.8 }, { "1Cen", "", 206.4217, -33.0439, 4.2 }, { "", "", 206.6638, -51.4328, 4.6 }, { "86Vir", "", 206.4846, -12.4267, 5.5 }, { "", "", 206.7350, -36.2519, 5.1 }, { "", "", 206.8650, -50.2494, 5.9 }, { "", "", 206.9100, -50.3211, 5.4 }, { "", "", 206.5563, 41.0886, 5.8 }, { "", "", 206.5792, 38.5039, 5.9 }, { "87Vir", "", 206.8558, -17.8600, 5.4 }, { "3Boo", "", 206.6804, 25.7022, 5.9 }, { "", "", 205.6637, 78.0644, 5.9 }, { "\xcf\x84""Boo", "", 206.8154, 17.4567, 4.5 }, { "", "", 206.7492, 38.5428, 5.5 }, { "84UMa", "", 206.6488, 54.4328, 5.7 }, { "", "", 208.9112, -82.6661, 5.9 }, { "\xce\xbd""Cen", "", 207.3762, -41.6878, 3.4 }, { "\xce\xb7""UMa", "Alkaid / Benetnasch", 206.8850, 49.3133, 1.8 }, { "2Cen", "", 207.3612, -34.4508, 4.1 }, { "\xce\xbc""Cen", "", 207.4042, -42.4739, 3.0 }, { "", "", 207.9475, -69.4014, 5.7 }, { "", "", 207.1612, 31.1903, 5.6 }, { "89Vir", "", 207.4679, -18.1342, 4.9 }, { "\xcf\x85""Boo", "", 207.3692, 15.7978, 4.0 }, { "6Boo", "", 207.4283, 21.2642, 4.9 }, { "", "", 205.5962, 82.7525, 5.9 }, { "", "", 207.9467, -46.8992, 5.7 }, { "", "", 208.0200, -52.8117, 5.2 }, { "3Cen", "", 207.9567, -32.9944, 4.5 }, { "", "", 207.4396, 61.4892, 5.9 }, { "", "", 207.7883, 34.6644, 5.8 }, { "", "", 208.4296, -53.3736, 5.8 }, { "", "", 208.7038, -67.6525, 5.7 }, { "", "", 207.9479, 34.4442, 4.7 }, { "4Cen", "", 208.3021, -31.9278, 4.7 }, { "", "", 208.3867, -35.6642, 5.5 }, { "7Boo", "", 208.3037, 17.9328, 5.7 }, { "10Dra", "", 207.8579, 64.7233, 4.6 }, { "", "", 208.2929, 28.6481, 5.9 }, { "", "", 208.8008, -52.1611, 5.7 }, { "\xce\xb6""Cen", "", 208.8850, -47.2883, 2.5 }, { "90Vir", "", 208.6754, -1.5031, 5.1 }, { "\xce\xb7""Boo", "Muphrid", 208.6713, 18.3978, 2.6 }, { "86UMa", "", 208.4625, 53.7286, 5.7 }, { "", "", 209.0813, -46.5925, 5.8 }, { "", "", 209.4121, -63.6867, 4.7 }, { "92Vir", "", 209.1163, 1.0506, 5.9 }, { "9Boo", "", 209.1425, 27.4919, 5.0 }, { "\xcf\x86""Cen", "", 209.5679, -42.1008, 3.8 }, { "\xcf\x85""1Cen", "", 209.6700, -44.8036, 3.8 }, { "47Hya", "", 209.6296, -24.9722, 5.1 }, { "", "", 209.8221, -50.3700, 5.9 }, { "", "", 210.2175, -66.2686, 5.9 }, { "10Boo", "", 209.6621, 21.6961, 5.7 }, { "48Hya", "", 210.0004, -25.0103, 5.7 }, { "\xcf\x85""2Cen", "", 210.4308, -45.6036, 4.3 }, { "\xce\xb8""Aps", "", 211.3325, -76.7967, 5.5 }, { "", "", 210.3350, 8.8947, 5.9 }, { "\xcf\x84""Vir", "", 210.4117, 1.5444, 4.2 }, { "", "", 210.5950, -27.4300, 5.4 }, { "", "", 210.8592, -56.2136, 5.9 }, { "\xce\xb2""Cen", "Agena / Hadar", 210.9558, -60.3731, 0.6 }, { "\xcf\x87""Cen", "", 211.5117, -41.1797, 4.3 }, { "\xcf\x80""Hya", "", 211.5929, -26.6825, 3.2 }, { "\xce\xb8""Cen", "Menkent", 211.6708, -36.3700, 2.0 }, { "95Vir", "", 211.6783, -9.3133, 5.4 }, { "\xce\xb1""Dra", "Thuban", 211.0971, 64.3758, 3.6 }, { "", "", 212.4783, -53.4392, 4.7 }, { "", "", 211.9825, 43.8544, 5.2 }, { "13Boo", "", 212.0721, 49.4581, 5.2 }, { "", "", 212.7104, -16.3019, 4.9 }, { "\xce\xb7""Aps", "", 214.5575, -81.0078, 4.9 }, { "12Boo", "", 212.5996, 25.0917, 4.8 }, { "", "", 213.3183, -53.6658, 5.5 }, { "50Hya", "", 213.1917, -27.2611, 5.0 }, { "", "", 213.0658, 2.4094, 5.0 }, { "\xce\xba""Vir", "", 213.2242, -10.2736, 4.1 }, { "", "", 213.7375, -57.0858, 5.0 }, { "", "", 213.4200, -0.8456, 5.9 }, { "", "", 213.6775, -41.8375, 5.6 }, { "", "", 214.1608, -66.5878, 5.7 }, { "4UMi", "", 212.2121, 77.5475, 4.8 }, { "14Boo", "", 213.5217, 12.9594, 5.5 }, { "\xce\xba""2Boo", "", 213.3708, 51.7903, 4.5 }, { "15Boo", "", 213.7117, 10.1006, 5.2 }, { "", "", 213.8504, -18.2008, 5.4 }, { "", "", 213.0167, 69.4325, 5.2 }, { "\xce\xb5""Aps", "", 215.5946, -80.1089, 5.0 }, { "\xce\xb9""Vir", "Syrma", 214.0037, -6.0006, 4.0 }, { "\xce\xb4""Oct", "", 216.7287, -83.6678, 4.3 }, { "\xce\xb1""Boo", "Arcturus", 213.9154, 19.1825, -0.0 }, { "", "", 214.0175, 18.9119, 5.9 }, { "", "", 214.9646, -61.2731, 5.2 }, { "\xce\xb9""Boo", "", 214.0413, 51.3672, 4.7 }, { "\xce\xbb""Boo", "", 214.0958, 46.0883, 4.1 }, { "", "", 214.3683, 15.2633, 5.8 }, { "\xce\xb9""Lup", "", 214.8508, -46.0578, 3.5 }, { "", "", 214.6596, -18.7161, 5.9 }, { "", "", 214.7533, -25.8156, 5.8 }, { "", "", 214.8496, -37.0036, 5.9 }, { "", "", 215.0813, -56.3867, 4.3 }, { "\xce\xbb""Vir", "", 214.7775, -13.3711, 4.5 }, { "", "", 214.4992, 35.5094, 4.8 }, { "", "", 215.0404, -43.0589, 5.5 }, { "", "", 215.1771, -45.1872, 4.7 }, { "18Boo", "", 214.8179, 13.0042, 5.4 }, { "\xcf\x85""Vir", "", 214.8854, -2.2656, 5.1 }, { "\xcf\x88""Cen", "", 215.1392, -37.8853, 4.0 }, { "20Boo", "", 214.9383, 16.3069, 4.8 }, { "", "", 215.6542, -58.4594, 4.9 }, { "", "", 215.5821, -34.7869, 5.5 }, { "", "", 215.7592, -39.5122, 4.4 }, { "", "", 216.2762, -68.1953, 5.6 }, { "51Hya", "", 215.7742, -27.7539, 4.7 }, { "", "", 215.8446, 8.4467, 5.1 }, { "", "", 216.0037, 8.2436, 5.9 }, { "", "", 216.2025, -24.8064, 5.3 }, { "", "", 216.7796, -65.8217, 5.8 }, { "", "", 216.0471, 5.8200, 5.1 }, { "\xcf\x84""1Lup", "", 216.5342, -45.2214, 4.5 }, { "\xcf\x84""2Lup", "", 216.5450, -45.3794, 4.3 }, { "", "", 216.8008, -46.1344, 5.8 }, { "\xce\xb8""Boo", "", 216.2992, 51.8508, 4.0 }, { "22Boo", "", 216.6142, 19.2269, 5.3 }, { "52Hya", "", 217.0433, -29.4917, 4.9 }, { "", "", 217.8187, -67.7172, 5.8 }, { "\xcf\x86""Vir", "", 217.0504, -2.2281, 4.8 }, { "106Vir", "", 217.1738, -6.9006, 5.4 }, { "", "", 217.5358, -45.3217, 5.5 }, { "", "", 217.5871, -49.5192, 5.3 }, { "", "", 217.4604, 0.8289, 5.9 }, { "", "", 217.7950, -38.8697, 5.9 }, { "24Boo", "", 217.1575, 49.8447, 5.5 }, { "\xcf\x83""Lup", "", 218.1537, -50.4569, 4.4 }, { "", "", 218.3850, -54.9983, 5.8 }, { "", "", 218.3746, -52.6800, 5.8 }, { "\xcf\x81""Boo", "", 217.9575, 30.3714, 3.5 }, { "5UMi", "", 216.8812, 75.6961, 4.2 }, { "26Boo", "", 218.1354, 22.2600, 5.9 }, { "\xce\xb3""Boo", "Seginus", 218.0196, 38.3083, 3.0 }, { "", "", 218.8812, -41.5172, 5.8 }, { "\xce\xb7""Cen", "", 218.8767, -42.1578, 2.3 }, { "", "", 218.1287, 55.3978, 5.7 }, { "", "", 219.0792, -46.2453, 5.5 }, { "\xcf\x83""Boo", "", 218.6700, 29.7450, 4.4 }, { "", "", 219.1842, -40.2117, 5.7 }, { "", "", 219.3338, -46.1339, 5.4 }, { "", "", 218.6650, 49.3683, 5.7 }, { "\xcf\x81""Lup", "", 219.4717, -49.4258, 4.0 }, { "\xce\xb1""1Cen", "", 219.8996, -60.8353, -0.0 }, { "\xce\xb1""2Cen", "", 219.9004, -60.8356, 1.3 }, { "", "", 219.5583, 18.2983, 5.9 }, { "\xce\xb1""Cir", "", 220.6267, -64.9753, 3.1 }, { "", "", 219.5521, 43.6419, 5.7 }, { "", "", 220.2558, -36.1350, 5.6 }, { "", "", 219.5633, 54.0233, 5.8 }, { "33Boo", "", 219.7092, 44.4044, 5.3 }, { "\xce\xb1""Lup", "", 220.4825, -47.3883, 2.3 }, { "\xce\xb1""Aps", "", 221.9650, -79.0447, 3.8 }, { "", "", 220.4900, -37.7936, 4.0 }, { "", "", 220.1767, 13.5342, 5.9 }, { "\xcf\x80""1Boo", "", 220.1817, 16.4183, 4.9 }, { "\xcf\x80""2Boo", "", 220.1829, 16.4178, 5.8 }, { "\xce\xb6""Boo", "", 220.2871, 13.7283, 4.8 }, { "\xce\xb6""Boo", "", 220.2871, 13.7283, 4.4 }, { "31Boo", "", 220.4117, 8.1617, 4.8 }, { "32Boo", "", 220.4313, 11.6606, 5.5 }, { "", "", 221.3221, -62.8758, 5.3 }, { "4Lib", "", 220.8067, -24.9975, 5.7 }, { "", "", 220.9142, -35.1736, 4.0 }, { "\xce\xbc""Vir", "", 220.7650, -5.6583, 3.8 }, { "", "", 221.2467, -35.1919, 4.9 }, { "34Boo", "", 220.8558, 26.5278, 4.8 }, { "", "", 220.9350, 40.4592, 5.7 }, { "", "", 221.6213, -47.4411, 5.7 }, { "", "", 221.7554, -52.3836, 5.2 }, { "54Hya", "", 221.5004, -25.4431, 4.9 }, { "", "", 221.5283, -23.1531, 5.8 }, { "", "", 222.1850, -66.5939, 5.9 }, { "108Vir", "", 221.3758, 0.7172, 5.6 }, { "\xce\xbf""Boo", "", 221.3104, 16.9644, 4.6 }, { "\xce\xb5""Boo", "Izar / Pulcherrima", 221.2467, 27.0750, 5.1 }, { "\xce\xb5""Boo", "Izar / Pulcherrima", 221.2467, 27.0742, 2.7 }, { "", "", 221.7713, -38.2908, 5.9 }, { "109Vir", "", 221.5621, 1.8928, 3.7 }, { "", "", 221.5250, 15.1319, 5.6 }, { "55Hya", "", 221.8438, -25.6244, 5.6 }, { "56Hya", "", 221.9367, -26.0875, 5.2 }, { "57Hya", "", 221.9896, -26.6464, 5.7 }, { "", "", 223.3071, -73.1900, 5.6 }, { "", "", 222.3279, -24.2517, 5.6 }, { "\xce\xbc""Lib", "", 222.3296, -14.1489, 5.3 }, { "\xcf\x80""1Oct", "", 225.4617, -83.2278, 5.6 }, { "58Hya", "", 222.5721, -27.9603, 4.4 }, { "", "", 223.1458, -63.8100, 5.8 }, { "\xce\xbf""Lup", "", 222.9100, -43.5756, 4.3 }, { "\xce\xb1""1Lib", "", 222.6717, -15.9972, 5.1 }, { "\xce\xb1""2Lib", "Zubenelgenubi", 222.7196, -16.0417, 2.7 }, { "", "", 222.4933, 28.6158, 5.8 }, { "38Boo", "", 222.3279, 46.1161, 5.7 }, { "", "", 222.5658, 23.9119, 5.8 }, { "11Lib", "", 222.7542, -2.2992, 4.9 }, { "39Boo", "", 222.4221, 48.7206, 5.6 }, { "", "", 224.4704, -76.6628, 5.3 }, { "", "", 222.6233, 37.2719, 5.4 }, { "", "", 223.2129, -37.8033, 5.0 }, { "\xce\xbe""Boo", "", 222.8471, 19.1011, 4.5 }, { "\xcf\x80""2Oct", "", 226.1946, -83.0383, 5.6 }, { "", "", 223.8942, -60.1142, 5.2 }, { "", "", 225.0492, -77.1603, 5.9 }, { "12Lib", "", 223.5838, -24.6422, 5.3 }, { "", "", 223.6583, -33.3006, 5.8 }, { "\xce\xb8""Cir", "", 224.1833, -62.7808, 5.1 }, { "", "", 222.8600, 59.2939, 5.4 }, { "\xce\xbe""1Lib", "", 223.5954, -11.8983, 5.8 }, { "", "", 224.0721, -52.8097, 5.3 }, { "\xcf\x89""Oct", "", 227.7846, -84.7875, 5.9 }, { "", "", 223.9363, -33.8558, 5.3 }, { "", "", 224.1333, -47.8792, 5.6 }, { "\xce\xb2""UMi", "Kochab", 222.6763, 74.1556, 2.0 }, { "\xce\xbe""2Lib", "", 224.1921, -11.4097, 5.4 }, { "", "", 224.0550, 14.4464, 5.7 }, { "", "", 224.3667, -21.4156, 5.7 }, { "16Lib", "", 224.2958, -4.3464, 4.4 }, { "\xce\xb2""Lup", "", 224.6329, -43.1339, 2.6 }, { "", "", 224.3887, -0.1675, 5.5 }, { "", "", 224.2987, 16.3883, 5.7 }, { "\xce\xba""Cen", "", 224.7904, -42.1042, 3.1 }, { "59Hya", "", 224.6633, -27.6572, 5.6 }, { "", "", 224.0958, 49.6286, 5.6 }, { "18Lib", "", 224.7233, -11.1442, 5.8 }, { "", "", 224.8462, 4.5678, 5.9 }, { "", "", 225.3042, -38.0583, 5.8 }, { "\xce\xb4""Lib", "", 225.2433, -8.5189, 4.9 }, { "40Boo", "", 224.9037, 39.2653, 5.6 }, { "", "", 224.3958, 65.9325, 4.6 }, { "", "", 225.3325, -2.7550, 5.5 }, { "60Hya", "", 225.5267, -28.0606, 5.8 }, { "\xce\xb7""Cir", "", 226.2008, -64.0317, 5.1 }, { "", "", 225.4538, -0.1406, 5.7 }, { "", "", 225.7471, -32.6433, 5.4 }, { "", "", 222.5850, 82.5119, 5.6 }, { "\xcf\x89""Boo", "", 225.5271, 25.0081, 4.8 }, { "110Vir", "", 225.7250, 2.0914, 4.4 }, { "\xce\xb2""Boo", "Nekkar", 225.4867, 40.3906, 3.5 }, { "\xcf\x83""Lib", "", 226.0175, -25.2819, 3.2 }, { "\xcf\x80""Lup", "", 226.2800, -47.0511, 4.7 }, { "\xcf\x80""Lup", "", 226.2800, -47.0511, 4.8 }, { "", "", 226.3296, -41.0672, 5.1 }, { "", "", 225.3629, 60.2044, 5.9 }, { "", "", 225.7754, 35.2058, 5.5 }, { "\xcf\x88""Boo", "", 226.1112, 26.9475, 4.5 }, { "", "", 226.8579, -49.0883, 5.7 }, { "44Boo", "", 225.9475, 47.6544, 4.7 }, { "", "", 226.6387, -30.9189, 5.9 }, { "", "", 227.3746, -67.0842, 5.7 }, { "\xce\xbd""Lib", "", 226.6567, -16.2569, 5.2 }, { "", "", 227.0504, -40.5839, 5.7 }, { "", "", 227.1629, -42.8678, 5.8 }, { "\xce\xbb""Lup", "", 227.2108, -45.2797, 4.0 }, { "47Boo", "", 226.3575, 48.1511, 5.5 }, { "45Boo", "", 226.8254, 24.8692, 4.9 }, { "", "", 226.5696, 54.5564, 5.2 }, { "", "", 227.5312, -38.7925, 5.9 }, { "", "", 227.8167, -55.3461, 5.5 }, { "46Boo", "", 227.0992, 26.3011, 5.6 }, { "", "", 227.1479, 25.1086, 5.8 }, { "", "", 227.5775, -26.3328, 5.7 }, { "", "", 228.5796, -70.0794, 5.8 }, { "\xce\xba""1Lup", "", 227.9838, -48.7378, 3.8 }, { "\xce\xba""2Lup", "", 227.9900, -48.7436, 5.6 }, { "\xce\xb6""Lup", "", 228.0712, -52.0992, 3.4 }, { "", "", 228.2062, -44.5006, 4.8 }, { "\xce\xb9""1Lib", "", 228.0554, -19.7917, 4.5 }, { "", "", 228.0179, 18.9758, 5.8 }, { "", "", 228.4721, -26.1936, 5.8 }, { "1Lup", "", 228.6554, -31.5192, 4.9 }, { "", "", 229.1517, -60.9039, 5.7 }, { "", "", 228.9742, -48.0742, 5.9 }, { "\xce\xb4""Cir", "", 229.2363, -60.9575, 5.0 }, { "\xce\xb5""Cir", "", 229.4121, -63.6106, 4.8 }, { "", "", 229.0167, -41.4911, 5.1 }, { "\xce\xb2""Cir", "", 229.3783, -58.8011, 4.0 }, { "\xce\xb3""TrA", "", 229.7275, -68.6794, 2.8 }, { "", "", 228.5254, 31.7881, 5.9 }, { "3Ser", "", 228.7975, 4.9394, 5.3 }, { "\xcf\x87""Boo", "", 228.6217, 29.1642, 5.2 }, { "", "", 229.0958, -22.3994, 5.5 }, { "4Ser", "", 228.9546, 0.3722, 5.6 }, { "", "", 229.7038, -60.4964, 5.4 }, { "\xce\xb4""Boo", "", 228.8758, 33.3147, 3.4 }, { "\xce\xbc""Lup", "", 229.6333, -47.8750, 4.2 }, { "\xce\xb2""Lib", "Zubeneschamali", 229.2517, -9.3831, 2.6 }, { "2Lup", "", 229.4579, -30.1489, 4.3 }, { "", "", 229.7350, -40.7883, 5.5 }, { "", "", 229.6092, -0.4614, 5.8 }, { "", "", 228.6596, 67.3467, 5.1 }, { "", "", 229.6021, 20.5728, 5.7 }, { "5Ser", "", 229.8283, 1.7653, 5.0 }, { "\xce\xb4""Lup", "", 230.3429, -40.6475, 3.2 }, { "\xce\xbd""1Lup", "", 230.5346, -47.9278, 5.0 }, { "\xce\xbd""2Lup", "", 230.4508, -48.3178, 5.6 }, { "", "", 230.7933, -60.6569, 5.6 }, { "\xce\xb3""Cir", "", 230.8446, -59.3208, 4.5 }, { "\xcf\x86""1Lup", "", 230.4517, -36.2614, 3.5 }, { "", "", 230.2817, -5.8247, 5.5 }, { "\xce\xb5""Lup", "", 230.6704, -44.6894, 3.3 }, { "\xce\xbf""CrB", "", 230.0354, 29.6161, 5.5 }, { "6Ser", "", 230.2583, 0.7153, 5.3 }, { "\xcf\x86""2Lup", "", 230.7892, -36.8586, 4.5 }, { "", "", 231.5613, -68.3092, 5.8 }, { "11UMi", "", 229.2746, 71.8239, 5.0 }, { "", "", 230.0217, 51.9586, 5.6 }, { "50Boo", "", 230.4525, 32.9339, 5.3 }, { "\xcf\x85""Lup", "", 231.1871, -39.7103, 5.3 }, { "", "", 230.9675, -12.3694, 5.7 }, { "\xce\xb5""Lib", "", 231.0496, -10.3222, 4.9 }, { "", "", 231.3342, -38.7336, 4.6 }, { "", "", 231.8879, -64.5314, 5.7 }, { "", "", 230.6558, 39.5814, 5.5 }, { "\xce\xb7""CrB", "", 230.8012, 30.2878, 5.5 }, { "\xcf\x81""Oct", "", 235.8200, -84.4653, 5.5 }, { "\xce\xba""1Aps", "", 232.8783, -73.3894, 5.4 }, { "", "", 230.6554, 62.0472, 5.9 }, { "\xce\xbc""1Boo", "Alkalurops", 231.1225, 37.3772, 4.3 }, { "\xce\xb3""UMi", "Pherkad", 230.1821, 71.8339, 3.0 }, { "", "", 231.8258, -36.7678, 5.4 }, { "", "", 230.6600, 63.3414, 5.7 }, { "\xcf\x84""1Ser", "", 231.4475, 15.4281, 5.1 }, { "", "", 231.5725, 34.3358, 5.4 }, { "", "", 232.3512, -46.7328, 5.2 }, { "\xce\xb6""1Lib", "", 232.0642, -16.7164, 5.6 }, { "\xce\xb9""Dra", "Edasich", 231.2325, 58.9661, 3.2 }, { "10Ser", "", 232.1592, 1.8422, 5.1 }, { "\xce\xb2""CrB", "Nusakan", 231.9571, 29.1058, 3.6 }, { "\xce\xb6""3Lib", "", 232.6683, -16.6094, 5.8 }, { "", "", 231.9642, 60.6703, 5.9 }, { "", "", 233.1529, -19.6706, 5.5 }, { "\xce\xbd""1Boo", "", 232.7325, 40.8331, 5.0 }, { "\xce\xb6""4Lib", "", 233.2300, -16.8528, 5.5 }, { "", "", 233.5067, -40.0661, 5.8 }, { "\xce\xb5""TrA", "", 234.1800, -66.3169, 4.1 }, { "11Ser", "", 233.2412, -1.1864, 5.5 }, { "\xce\xbd""2Boo", "", 232.9458, 40.8994, 5.0 }, { "36Lib", "", 233.6554, -28.0469, 5.1 }, { "\xce\xb3""Lup", "", 233.7854, -41.1669, 2.7 }, { "37Lib", "", 233.5446, -10.0644, 4.6 }, { "\xce\xb8""CrB", "", 233.2325, 31.3592, 4.1 }, { "", "", 233.6108, -9.1833, 5.1 }, { "", "", 233.9717, -44.9586, 4.5 }, { "\xce\xba""2Aps", "", 235.0883, -73.4467, 5.6 }, { "", "", 234.0504, -44.3969, 5.4 }, { "", "", 232.7321, 64.2086, 5.7 }, { "", "", 235.4775, -76.0819, 5.9 }, { "\xce\xb3""Lib", "", 233.8817, -14.7894, 3.9 }, { "\xce\xb4""Ser", "", 233.7004, 10.5375, 3.8 }, { "\xce\xb4""Ser", "", 233.7004, 10.5392, 3.8 }, { "\xce\xb1""CrB", "Alphecca / Gemma", 233.6721, 26.7147, 2.2 }, { "\xcf\x85""Lib", "", 234.2562, -28.1350, 3.5 }, { "\xcf\x89""Lup", "", 234.5133, -42.5675, 4.3 }, { "", "", 234.7062, -52.3728, 5.4 }, { "\xce\xbc""CrB", "", 233.8125, 39.0100, 5.1 }, { "16Ser", "", 234.1233, 10.0100, 5.2 }, { "", "", 234.9854, -59.9083, 5.9 }, { "\xcf\x84""5Ser", "", 234.1221, 16.1189, 5.9 }, { "", "", 234.4504, -23.1417, 5.7 }, { "", "", 234.5679, -21.0161, 5.8 }, { "", "", 233.8179, 53.9219, 5.9 }, { "\xcf\x84""Lib", "", 234.6642, -29.7778, 3.6 }, { "41Lib", "", 234.7271, -19.3019, 5.3 }, { "", "", 233.9879, 54.6306, 5.7 }, { "\xcf\x88""1Lup", "", 234.9417, -34.4119, 4.6 }, { "\xcf\x86""Boo", "", 234.4567, 40.3533, 5.2 }, { "42Lib", "", 235.0704, -23.8181, 4.9 }, { "", "", 235.2971, -44.6611, 4.6 }, { "\xce\xb8""UMi", "", 232.8538, 77.3494, 4.9 }, { "", "", 234.3833, 54.5089, 5.8 }, { "", "", 234.5675, 46.7978, 5.7 }, { "\xce\xb6""2CrB", "", 234.8446, 36.6358, 5.0 }, { "", "", 234.6429, 50.4233, 5.8 }, { "", "", 235.6596, -37.4250, 5.2 }, { "\xce\xba""Lib", "", 235.4867, -19.6789, 4.7 }, { "\xcf\x88""2Lup", "", 235.6708, -34.7106, 4.7 }, { "\xce\xb9""Ser", "", 235.3879, 19.6703, 4.5 }, { "\xcf\x87""Ser", "", 235.4475, 12.8475, 5.3 }, { "", "", 234.4129, 69.2833, 5.6 }, { "\xcf\x84""7Ser", "", 235.4779, 18.4639, 5.8 }, { "", "", 236.0942, -41.8194, 5.9 }, { "\xce\xb7""Lib", "", 236.0183, -15.6728, 5.4 }, { "\xce\xb3""CrB", "", 235.6858, 26.2956, 3.8 }, { "\xcf\x88""Ser", "", 236.0075, 2.5150, 5.8 }, { "\xce\xb1""Ser", "Unukalhai", 236.0671, 6.4256, 2.6 }, { "\xcf\x80""CrB", "", 235.9971, 32.5158, 5.5 }, { "", "", 235.7113, 52.3608, 5.5 }, { "", "", 236.3479, 5.4469, 5.5 }, { "", "", 236.6842, -34.6825, 5.6 }, { "25Ser", "", 236.5233, -1.8044, 5.4 }, { "\xce\xb2""Ser", "", 236.5471, 15.4219, 3.6 }, { "\xce\xbb""Ser", "", 236.6108, 7.3531, 4.4 }, { "", "", 237.5288, -53.2094, 5.7 }, { "\xcf\x85""Ser", "", 236.8221, 14.1153, 5.7 }, { "", "", 237.4896, -48.9119, 5.8 }, { "", "", 237.7783, -55.0558, 5.7 }, { "", "", 237.2367, -3.8186, 5.5 }, { "", "", 236.6450, 55.4747, 5.9 }, { "\xce\xba""Ser", "", 237.1850, 18.1417, 4.0 }, { "", "", 237.1433, 28.1567, 5.8 }, { "\xce\xbc""Ser", "", 237.4050, -3.4303, 3.5 }, { "\xcf\x87""Lup", "", 237.7396, -33.6272, 3.9 }, { "1Sco", "", 237.7446, -25.7514, 4.6 }, { "", "", 236.6667, 62.5994, 5.1 }, { "", "", 236.9083, 55.3767, 5.8 }, { "\xcf\x89""Ser", "", 237.5729, 2.1964, 5.2 }, { "\xce\xb4""CrB", "", 237.3988, 26.0683, 4.6 }, { "\xce\xba""TrA", "", 238.8733, -68.6031, 5.0 }, { "\xce\xb5""Ser", "", 237.7042, 4.4778, 3.7 }, { "", "", 237.6738, 15.1336, 5.2 }, { "36Ser", "", 237.8150, -3.0906, 5.1 }, { "\xce\xb2""TrA", "", 238.7854, -63.4306, 2.8 }, { "\xcf\x81""Ser", "", 237.8162, 20.9778, 4.7 }, { "", "", 238.8846, -60.1778, 5.7 }, { "\xce\xba""CrB", "", 237.8079, 35.6575, 4.8 }, { "\xce\xbb""Lib", "", 238.3338, -20.1672, 5.0 }, { "\xce\xb6""UMi", "", 236.0146, 77.7944, 4.3 }, { "2Sco", "", 238.4029, -25.3272, 4.5 }, { "", "", 239.0250, -60.4828, 5.7 }, { "", "", 238.4742, -24.5331, 5.3 }, { "", "", 238.4825, -23.9781, 5.4 }, { "\xce\xb8""Lib", "", 238.4562, -16.7294, 4.1 }, { "3Sco", "", 238.6646, -25.2436, 5.8 }, { "\xcf\x87""Her", "", 238.1688, 42.4517, 4.6 }, { "47Lib", "", 238.7512, -19.3831, 5.9 }, { "4Sco", "", 238.8754, -26.2658, 5.6 }, { "", "", 239.7421, -65.0378, 5.7 }, { "", "", 238.0692, 55.8267, 5.8 }, { "", "", 238.6442, 20.3108, 5.4 }, { "\xce\xbe""1Lup", "", 239.2229, -33.9664, 5.1 }, { "\xce\xbe""2Lup", "", 239.2258, -33.9642, 5.6 }, { "\xcf\x81""Sco", "", 239.2212, -29.2142, 3.8 }, { "", "", 239.3387, -36.1850, 5.8 }, { "2Her", "", 238.6579, 43.1386, 5.3 }, { "\xce\xb3""Ser", "", 239.1133, 15.6617, 3.8 }, { "", "", 239.4183, -20.9831, 5.8 }, { "\xce\xbb""CrB", "", 238.9483, 37.9469, 5.4 }, { "4Her", "", 238.8775, 42.5661, 5.7 }, { "\xcf\x86""Ser", "", 239.3108, 14.4144, 5.5 }, { "48Lib", "", 239.5475, -14.2794, 4.8 }, { "", "", 239.6450, -24.8314, 5.4 }, { "", "", 239.8762, -41.7444, 4.9 }, { "\xcf\x80""Sco", "", 239.7129, -26.1142, 2.8 }, { "\xce\xb5""CrB", "", 239.3971, 26.8778, 4.1 }, { "\xce\xb7""Lup", "", 240.0304, -38.3969, 3.4 }, { "\xce\xb4""Sco", "Dschubba", 240.0833, -22.6217, 2.3 }, { "49Lib", "", 240.0817, -16.5333, 5.4 }, { "", "", 241.4825, -72.4008, 5.7 }, { "", "", 239.7404, 36.6439, 5.6 }, { "", "", 239.8758, 25.9203, 2.0 }, { "50Lib", "", 240.1983, -8.4114, 5.5 }, { "", "", 239.4475, 54.7497, 4.9 }, { "\xce\xb9""1Nor", "", 240.8829, -57.7753, 4.6 }, { "\xce\xb7""Nor", "", 240.8038, -49.2297, 4.6 }, { "", "", 240.2129, 4.4275, 5.8 }, { "5Her", "", 240.3096, 17.8183, 5.1 }, { "", "", 240.8508, -38.6025, 4.8 }, { "\xcf\x81""CrB", "", 240.2612, 33.3036, 5.4 }, { "", "", 240.8358, -25.8653, 5.0 }, { "\xce\xb9""CrB", "", 240.3608, 29.8511, 4.9 }, { "\xcf\x80""Ser", "", 240.5738, 22.8044, 4.8 }, { "", "", 241.1529, -37.8631, 5.9 }, { "\xce\xbe""Sco", "", 241.0921, -11.3731, 5.0 }, { "\xce\xbe""Sco", "", 241.0921, -11.3731, 4.7 }, { "\xce\xb4""Nor", "", 241.6225, -45.1733, 4.7 }, { "", "", 240.5229, 52.9158, 5.9 }, { "\xcf\x85""Her", "", 240.6996, 46.0367, 4.7 }, { "", "", 240.8308, 36.6317, 5.8 }, { "\xce\xb2""1Sco", "Graffias", 241.3592, -19.8056, 2.6 }, { "\xce\xb2""2Sco", "", 241.3604, -19.8019, 4.9 }, { "\xce\xb8""Dra", "", 240.4721, 58.5653, 4.0 }, { "\xce\xb8""Lup", "", 241.6479, -36.8022, 4.2 }, { "", "", 241.5263, -23.6064, 5.9 }, { "", "", 241.8183, -36.7556, 5.7 }, { "\xcf\x89""1Sco", "", 241.7017, -20.6692, 3.9 }, { "\xce\xb9""2Nor", "", 242.3275, -57.9344, 5.5 }, { "\xcf\x89""2Sco", "", 241.8513, -20.8686, 4.3 }, { "", "", 242.0317, -26.3267, 5.3 }, { "11Sco", "", 241.9017, -12.7456, 5.7 }, { "", "", 242.1821, -23.6856, 5.8 }, { "45Ser", "", 241.9063, 9.8917, 5.6 }, { "", "", 242.4692, -33.5458, 5.5 }, { "\xce\xba""Her", "", 242.0187, 17.0469, 5.0 }, { "47Ser", "", 242.1167, 8.5342, 5.7 }, { "", "", 242.2454, 3.4544, 5.9 }, { "", "", 242.2967, 6.3789, 5.9 }, { "", "", 242.8237, -41.1197, 5.8 }, { "", "", 242.4604, -3.4669, 5.3 }, { "", "", 242.7583, -29.4164, 5.1 }, { "\xcf\x84""CrB", "", 242.2429, 36.4908, 4.7 }, { "\xce\xb6""Nor", "", 243.3442, -55.5408, 5.8 }, { "\xce\xb4""1Aps", "", 245.0867, -78.6958, 4.6 }, { "\xce\xb4""2Aps", "", 245.1117, -78.6672, 5.2 }, { "", "", 243.3200, -53.6717, 5.8 }, { "\xcf\x86""Her", "", 242.1925, 44.9350, 4.2 }, { "\xce\xba""Nor", "", 243.3696, -54.6306, 4.9 }, { "", "", 241.5821, 67.8103, 5.4 }, { "\xce\xbd""Sco", "", 242.9988, -19.4606, 4.0 }, { "13Sco", "", 243.0758, -27.9264, 4.5 }, { "12Sco", "", 243.0662, -28.4175, 5.6 }, { "\xce\xb4""TrA", "", 243.8596, -63.6856, 3.8 }, { "\xcf\x88""Sco", "", 243.0000, -10.0642, 4.9 }, { "16Sco", "", 243.0304, -8.5475, 5.4 }, { "", "", 240.8804, 76.7936, 5.5 }, { "", "", 244.2729, -67.9414, 5.7 }, { "10Her", "", 242.9083, 23.4947, 5.7 }, { "", "", 243.9571, -57.9122, 5.6 }, { "", "", 243.5929, -33.0114, 5.9 }, { "\xce\xb8""Nor", "", 243.8137, -47.3722, 5.1 }, { "", "", 242.9500, 36.4250, 5.6 }, { "9Her", "", 243.3142, 5.0211, 5.4 }, { "\xcf\x87""Sco", "", 243.4621, -11.8375, 5.2 }, { "", "", 242.9483, 42.3744, 5.8 }, { "", "", 244.1796, -53.8111, 5.4 }, { "\xce\xb4""Oph", "Yed Prior", 243.5863, -3.6944, 2.7 }, { "\xce\xb3""1Nor", "", 244.2538, -50.0683, 4.9 }, { "18Sco", "", 243.9054, -8.3694, 5.5 }, { "\xcf\x83""CrB", "", 243.6700, 33.8586, 5.6 }, { "16Her", "", 243.8696, 18.8083, 5.6 }, { "", "", 244.5746, -28.6139, 4.7 }, { "\xce\xbb""Nor", "", 244.8237, -42.6739, 5.4 }, { "\xce\xb3""2Nor", "", 244.9600, -50.1556, 4.0 }, { "", "", 245.1050, -55.1400, 5.7 }, { "\xcf\x85""CrB", "", 244.1867, 29.1503, 5.7 }, { "\xce\xb5""Oph", "Yed Posterior", 244.5804, -4.6925, 3.2 }, { "", "", 244.8862, -30.9067, 5.4 }, { "", "", 244.7517, -14.8725, 5.9 }, { "19UMi", "", 242.7063, 75.8775, 5.4 }, { "\xce\xbf""Sco", "", 245.1592, -24.1694, 4.5 }, { "", "", 245.6167, -49.5722, 5.3 }, { "\xcf\x83""Sco", "Al Niyat", 245.2971, -25.5928, 2.8 }, { "", "", 245.6204, -43.9122, 5.8 }, { "", "", 244.3137, 59.7550, 5.4 }, { "", "", 243.6396, 73.3950, 5.9 }, { "", "", 244.7967, 49.0381, 5.9 }, { "", "", 244.9796, 39.7086, 5.4 }, { "\xcf\x84""Her", "", 244.9350, 46.3133, 3.8 }, { "\xcf\x83""Ser", "", 245.5183, 1.0292, 4.8 }, { "", "", 246.0054, -39.1931, 5.4 }, { "\xce\xb3""Her", "", 245.4800, 19.1531, 3.7 }, { "\xce\xb6""TrA", "", 247.1171, -70.0844, 4.9 }, { "", "", 246.1321, -37.5658, 5.4 }, { "\xce\xb3""Aps", "", 248.3625, -78.8972, 3.8 }, { "\xce\xbe""CrB", "", 245.5242, 30.8919, 4.8 }, { "\xcf\x88""Oph", "", 246.0258, -20.0375, 4.5 }, { "", "", 246.1654, -29.7047, 5.8 }, { "\xce\xbd""1CrB", "", 245.5892, 33.7992, 5.2 }, { "\xce\xbd""2CrB", "", 245.6217, 33.7036, 5.3 }, { "\xce\xb9""TrA", "", 246.9887, -64.0581, 5.2 }, { "21Her", "", 246.0450, 6.9481, 5.8 }, { "\xcf\x81""Oph", "", 246.3967, -23.4472, 5.0 }, { "\xcf\x81""Oph", "", 246.3963, -23.4461, 5.9 }, { "", "", 247.0633, -58.5997, 5.6 }, { "\xce\xb5""Nor", "", 246.7962, -47.5550, 4.4 }, { "\xce\xb7""UMi", "", 244.3762, 75.7553, 4.9 }, { "\xcf\x89""Her", "", 246.3542, 14.0333, 4.5 }, { "\xcf\x87""Oph", "", 246.7558, -18.4564, 4.4 }, { "", "", 247.0612, -37.1794, 5.7 }, { "25Her", "", 246.3508, 37.3939, 5.5 }, { "", "", 247.7058, -61.6336, 5.2 }, { "", "", 245.4529, 69.1094, 5.2 }, { "", "", 246.1054, 55.2050, 5.7 }, { "", "", 246.9312, -7.5981, 5.2 }, { "\xcf\x85""Oph", "", 246.9504, -8.3717, 4.6 }, { "", "", 245.9458, 61.6967, 5.6 }, { "", "", 247.4263, -46.2433, 5.3 }, { "\xce\xb7""Dra", "", 245.9979, 61.5142, 2.7 }, { "\xce\xb1""Sco", "Antares", 247.3517, -26.4319, 0.9 }, { "", "", 248.5804, -70.9881, 5.5 }, { "", "", 247.1417, 0.6650, 5.3 }, { "", "", 247.4454, -14.5508, 5.6 }, { "22Sco", "", 247.5517, -25.1150, 4.7 }, { "", "", 247.9237, -41.8169, 5.3 }, { "", "", 247.8454, -34.7044, 4.2 }, { "30Her", "", 247.1604, 41.8817, 5.0 }, { "\xcf\x86""Oph", "", 247.7846, -16.6128, 4.2 }, { "\xce\xb2""Her", "Kornephoros", 247.5550, 21.4897, 2.7 }, { "\xce\xbb""Oph", "Marfik", 247.7283, 1.9839, 3.8 }, { "\xce\xb8""TrA", "", 248.9367, -65.4953, 5.5 }, { "", "", 247.6400, 20.4792, 5.2 }, { "\xcf\x89""Oph", "", 248.0342, -21.4664, 4.4 }, { "", "", 247.8058, 22.1953, 5.7 }, { "\xce\xbc""Nor", "", 248.5208, -44.0453, 4.9 }, { "28Her", "", 248.1488, 5.5211, 5.6 }, { "29Her", "", 248.1513, 11.4881, 4.8 }, { "15Dra", "", 246.9958, 68.7681, 5.0 }, { "", "", 247.9471, 45.5983, 5.6 }, { "\xce\xb2""Aps", "", 250.7692, -77.5175, 4.2 }, { "", "", 249.0938, -42.8589, 5.4 }, { "\xcf\x84""Sco", "", 248.9708, -28.2161, 2.8 }, { "", "", 249.0938, -35.2556, 4.1 }, { "\xcf\x83""Her", "", 248.5258, 42.4369, 4.2 }, { "", "", 248.1071, 60.8233, 5.9 }, { "12Oph", "", 249.0896, -2.3247, 5.7 }, { "\xce\xb7""1TrA", "", 250.3471, -68.2961, 5.9 }, { "", "", 246.4296, 78.9639, 5.5 }, { "", "", 249.6092, -43.3986, 5.8 }, { "\xce\xb6""Oph", "", 249.2896, -10.5672, 2.5 }, { "", "", 249.7717, -37.2175, 5.9 }, { "", "", 249.0467, 46.6133, 5.7 }, { "16Dra", "", 249.0479, 52.9003, 5.5 }, { "17Dra", "", 249.0571, 52.9244, 5.0 }, { "", "", 250.3346, -48.7631, 5.6 }, { "", "", 250.4175, -49.6517, 5.6 }, { "", "", 250.4396, -33.1464, 5.8 }, { "37Her", "", 250.1613, 4.2197, 5.7 }, { "", "", 250.3933, -17.7422, 4.9 }, { "", "", 249.5017, 56.0156, 5.2 }, { "42Her", "", 249.6871, 48.9283, 4.9 }, { "", "", 250.4738, -19.9244, 5.5 }, { "", "", 251.6667, -67.1097, 5.1 }, { "14Oph", "", 250.4271, 1.1811, 5.7 }, { "", "", 251.1658, -53.1525, 5.9 }, { "\xce\xb6""Her", "", 250.3217, 31.6031, 2.8 }, { "39Her", "", 250.4029, 26.9169, 5.9 }, { "", "", 251.1775, -40.8397, 5.7 }, { "", "", 251.5883, -58.5036, 5.7 }, { "\xce\xb1""TrA", "Atria", 252.1662, -69.0278, 1.9 }, { "", "", 251.8313, -58.3414, 5.5 }, { "\xce\xb7""Her", "", 250.7242, 38.9222, 3.5 }, { "", "", 251.6992, -39.3772, 5.4 }, { "", "", 250.9654, 34.0389, 5.9 }, { "18Dra", "", 250.2296, 64.5892, 4.8 }, { "", "", 251.3438, 15.7453, 5.5 }, { "43Her", "", 251.4579, 8.5825, 5.1 }, { "\xce\xb7""Ara", "", 252.4463, -59.0414, 3.7 }, { "45Her", "", 251.9433, 5.2467, 5.2 }, { "", "", 251.3242, 56.7819, 4.8 }, { "\xce\xb5""Sco", "", 252.5408, -34.2933, 2.2 }, { "", "", 251.8325, 42.2389, 5.8 }, { "20Oph", "", 252.4583, -10.7831, 4.6 }, { "", "", 252.8904, -41.2306, 5.2 }, { "", "", 252.3942, 13.2614, 5.9 }, { "\xce\xbc""1Sco", "", 252.9675, -38.0475, 3.0 }, { "47Her", "", 252.5808, 7.2478, 5.4 }, { "", "", 253.5021, -57.9094, 5.9 }, { "\xce\xbc""2Sco", "", 253.0838, -38.0175, 3.5 }, { "52Her", "", 252.3092, 45.9833, 4.8 }, { "21Oph", "", 252.8537, 1.2161, 5.5 }, { "", "", 253.4271, -43.0508, 5.9 }, { "50Her", "", 252.6625, 29.8067, 5.7 }, { "", "", 253.5075, -41.8064, 5.4 }, { "\xce\xb6""1Sco", "", 253.4988, -42.3622, 4.7 }, { "", "", 253.6121, -42.4789, 5.8 }, { "", "", 250.7750, 77.5142, 5.9 }, { "", "", 253.3550, -20.4156, 5.8 }, { "51Her", "", 252.9387, 24.6564, 5.0 }, { "\xce\xb6""2Sco", "", 253.6458, -42.3614, 3.6 }, { "", "", 253.7433, -41.1511, 5.7 }, { "", "", 254.1196, -52.2839, 5.9 }, { "", "", 254.8908, -69.2683, 5.7 }, { "53Her", "", 253.2421, 31.7017, 5.3 }, { "23Oph", "", 253.6487, -6.1539, 5.2 }, { "\xce\xb9""Oph", "", 253.5021, 10.1653, 4.3 }, { "\xce\xb6""Ara", "", 254.6550, -55.9903, 3.1 }, { "", "", 253.7300, 20.9586, 5.4 }, { "27Sco", "", 254.2962, -33.2594, 5.4 }, { "", "", 254.5750, -50.6411, 5.5 }, { "24Oph", "", 254.2000, -23.1500, 5.5 }, { "54Her", "", 253.8425, 18.4333, 5.3 }, { "\xce\xb5""1Ara", "", 254.8963, -53.1606, 4.0 }, { "", "", 255.0258, -54.5969, 5.6 }, { "\xce\xba""Oph", "", 254.4171, 9.3750, 3.2 }, { "", "", 254.9900, -25.0919, 5.8 }, { "26Oph", "", 255.0396, -24.9892, 5.7 }, { "", "", 255.1538, -35.9342, 5.9 }, { "\xce\xb5""2Ara", "", 255.7867, -53.2369, 5.2 }, { "19Dra", "", 254.0071, 65.1347, 4.8 }, { "", "", 255.4696, -32.1436, 5.0 }, { "30Oph", "", 255.2650, -4.2225, 4.8 }, { "", "", 256.1029, -57.7122, 5.7 }, { "\xce\xb5""UMi", "", 251.4921, 82.0372, 4.2 }, { "\xce\xb5""Her", "", 255.0725, 30.9264, 3.9 }, { "", "", 255.2421, 22.6322, 5.6 }, { "", "", 255.9617, -38.1522, 5.9 }, { "59Her", "", 255.4017, 33.5683, 5.2 }, { "", "", 255.5779, 25.5056, 5.7 }, { "", "", 256.2058, -34.1228, 4.8 }, { "", "", 255.7825, 14.0919, 4.9 }, { "", "", 255.9138, 13.6053, 5.9 }, { "", "", 256.5846, -37.2275, 5.9 }, { "", "", 256.3846, -0.8919, 5.6 }, { "60Her", "", 256.3446, 12.7408, 4.9 }, { "", "", 256.5754, 22.0842, 5.5 }, { "", "", 257.0621, -17.6092, 5.9 }, { "", "", 257.1979, -30.4036, 5.9 }, { "", "", 258.3229, -67.1967, 5.8 }, { "\xce\xbc""Dra", "", 256.3325, 54.4703, 5.8 }, { "\xce\xbc""Dra", "", 256.3321, 54.4703, 5.8 }, { "", "", 257.6762, -44.5575, 5.0 }, { "", "", 257.9121, -48.8742, 5.8 }, { "", "", 257.4500, -10.5233, 5.5 }, { "", "", 257.0083, 35.9353, 5.3 }, { "\xce\xb7""Oph", "Sabik", 257.5946, -15.7247, 2.4 }, { "\xce\xb7""Sco", "", 258.0383, -43.2392, 3.3 }, { "", "", 258.0675, -39.5069, 5.6 }, { "", "", 257.3888, 40.7772, 5.0 }, { "37Oph", "", 258.1158, 10.5853, 5.3 }, { "\xce\xb6""Dra", "", 257.1967, 65.7147, 3.1 }, { "", "", 258.8304, -33.5483, 5.5 }, { "", "", 258.8996, -38.5939, 5.9 }, { "36Oph", "", 258.8375, -26.6028, 5.1 }, { "36Oph", "", 258.8367, -26.6014, 5.0 }, { "", "", 258.8346, -14.5839, 5.9 }, { "\xce\xb1""1Her", "Rasalgethi", 258.6621, 14.3903, 3.4 }, { "\xce\xb1""2Her", "", 258.6633, 14.3900, 5.3 }, { "", "", 259.8017, -59.6944, 5.9 }, { "", "", 259.2654, -32.6628, 5.5 }, { "\xce\xb4""Her", "", 258.7579, 24.8392, 3.1 }, { "\xce\xb9""Aps", "", 260.5246, -70.1233, 5.4 }, { "", "", 259.1321, 1.2106, 5.8 }, { "41Oph", "", 259.1529, -0.4453, 4.7 }, { "", "", 259.7633, -46.6339, 5.4 }, { "\xce\xb6""Aps", "", 260.4975, -67.7706, 4.7 }, { "\xcf\x80""Her", "", 258.7617, 36.8092, 3.1 }, { "", "", 258.9233, 23.7428, 5.9 }, { "", "", 259.7000, -44.1297, 5.7 }, { "", "", 258.1358, 62.8744, 5.5 }, { "\xce\xbf""Oph", "", 259.5029, -24.2869, 5.2 }, { "", "", 259.7383, -34.9897, 5.9 }, { "", "", 262.8637, -80.8592, 5.8 }, { "68Her", "", 259.3313, 33.1000, 4.8 }, { "", "", 259.6542, 10.8644, 5.0 }, { "69Her", "", 259.4179, 37.2917, 4.6 }, { "", "", 260.7292, -58.0103, 5.8 }, { "", "", 261.0046, -62.8642, 5.7 }, { "", "", 260.7788, -56.5253, 5.8 }, { "", "", 259.7021, 28.8231, 5.6 }, { "", "", 259.5971, 38.8114, 5.9 }, { "\xce\xbe""Oph", "", 260.2508, -21.1128, 4.3 }, { "\xce\xbd""Ser", "", 260.2071, -12.8469, 4.3 }, { "", "", 261.0779, -60.6736, 5.7 }, { "\xce\xb9""Ara", "", 260.8171, -47.4683, 5.2 }, { "", "", 260.0788, 18.0572, 5.0 }, { "\xce\xb8""Oph", "", 260.5025, -24.9994, 3.2 }, { "", "", 260.0408, 25.5375, 5.3 }, { "", "", 260.7288, -37.2206, 5.9 }, { "70Her", "", 260.2258, 24.4994, 5.1 }, { "72Her", "", 260.1650, 32.4678, 5.3 }, { "43Oph", "", 260.8400, -28.1431, 5.3 }, { "", "", 261.0542, -44.1625, 5.1 }, { "\xce\xb2""Ara", "", 261.3250, -55.5300, 2.8 }, { "\xce\xb3""Ara", "", 261.3483, -56.3775, 3.3 }, { "74Her", "", 260.0879, 46.2408, 5.5 }, { "\xce\xba""Ara", "", 261.5000, -50.6336, 5.2 }, { "", "", 260.4317, 39.9744, 5.5 }, { "", "", 261.1750, -21.4417, 5.8 }, { "", "", 260.9900, 8.8528, 5.7 }, { "", "", 261.7146, -45.8436, 5.2 }, { "", "", 261.8017, -50.6303, 5.9 }, { "", "", 260.4392, 53.4206, 5.6 }, { "73Her", "", 261.0275, 22.9603, 5.7 }, { "", "", 261.1312, 16.3011, 5.7 }, { "", "", 261.9900, -52.2972, 5.7 }, { "\xcf\x81""Her", "", 260.9196, 37.1467, 5.4 }, { "\xcf\x81""Her", "", 260.9208, 37.1458, 4.5 }, { "44Oph", "", 261.5925, -24.1753, 4.1 }, { "", "", 262.1612, -55.1697, 5.9 }, { "45Oph", "", 261.8388, -29.8669, 4.2 }, { "", "", 261.6579, -5.0867, 4.5 }, { "", "", 261.4767, 16.9175, 5.9 }, { "\xcf\x83""Oph", "", 261.6288, 4.1403, 4.3 }, { "\xce\xb4""Ara", "", 262.7746, -60.6839, 3.6 }, { "", "", 261.7046, 20.0808, 5.5 }, { "", "", 262.8458, -56.9206, 5.9 }, { "", "", 261.6925, 34.6958, 5.9 }, { "", "", 262.2071, 0.3306, 5.4 }, { "\xcf\x85""Sco", "Lesath", 262.6908, -37.2958, 2.6 }, { "77Her", "", 261.6842, 48.2600, 5.8 }, { "\xce\xb1""Ara", "", 262.9604, -49.8761, 2.9 }, { "", "", 261.4221, 60.0483, 5.6 }, { "", "", 262.5992, -1.0625, 5.3 }, { "51Oph", "", 262.8542, -23.9628, 4.8 }, { "", "", 263.2808, -41.1736, 5.8 }, { "", "", 262.8388, 2.7244, 5.5 }, { "\xce\xbb""Her", "", 262.6846, 26.1106, 4.4 }, { "\xce\xbb""Sco", "Shaula", 263.4021, -37.1039, 1.6 }, { "", "", 262.7308, 31.1583, 5.6 }, { "", "", 259.9042, 80.1364, 5.7 }, { "78Her", "", 262.9567, 28.4075, 5.6 }, { "", "", 263.3746, -5.7447, 5.6 }, { "", "", 263.6771, -32.5817, 5.7 }, { "\xce\xb2""Dra", "Rastaban", 262.6083, 52.3014, 2.7 }, { "\xcf\x83""Ara", "", 263.9150, -46.5056, 4.5 }, { "", "", 263.3450, 19.2567, 5.6 }, { "", "", 263.4142, 16.3175, 5.6 }, { "", "", 263.6933, -11.2419, 5.5 }, { "", "", 264.1367, -38.6353, 4.2 }, { "", "", 264.3633, -50.0600, 5.9 }, { "53Oph", "", 263.6529, 9.5867, 5.8 }, { "\xcf\x80""Ara", "", 264.5233, -54.5003, 5.2 }, { "", "", 263.2804, 41.2436, 5.7 }, { "\xce\xb8""Sco", "Girtab / Sargas", 264.3300, -42.9978, 1.8 }, { "\xce\xbd""1Dra", "", 263.0442, 55.1842, 4.8 }, { "\xce\xbd""2Dra", "", 263.0667, 55.1731, 4.8 }, { "\xce\xb1""Oph", "Rasalhague", 263.7337, 12.5600, 2.0 }, { "\xce\xbe""Ser", "", 264.3967, -15.3986, 3.5 }, { "", "", 264.4008, -15.5711, 5.9 }, { "27Dra", "", 262.9912, 68.1350, 5.0 }, { "\xce\xbc""Oph", "", 264.4613, -8.1189, 4.6 }, { "", "", 264.5396, -10.9264, 5.7 }, { "\xce\xbb""Ara", "", 265.0983, -49.4156, 4.7 }, { "79Her", "", 264.3796, 24.3100, 5.7 }, { "", "", 265.3179, -46.9219, 5.7 }, { "26Dra", "", 263.7479, 61.8750, 5.2 }, { "82Her", "", 264.1567, 48.5856, 5.3 }, { "\xce\xba""Sco", "", 265.6221, -39.0300, 2.4 }, { "\xce\xbf""Ser", "", 265.3537, -12.8753, 4.2 }, { "\xce\xb7""Pav", "", 266.4333, -64.7239, 3.6 }, { "", "", 265.7125, -36.9458, 5.5 }, { "\xce\xbc""Ara", "", 266.0362, -51.8342, 5.1 }, { "\xce\xb9""Her", "", 264.8662, 46.0064, 3.8 }, { "", "", 265.3846, 6.3128, 5.9 }, { "", "", 265.4946, 15.9519, 5.5 }, { "58Oph", "", 265.8575, -21.6833, 4.8 }, { "\xcf\x89""Dra", "", 264.2379, 68.7581, 4.8 }, { "", "", 266.1750, -42.7289, 5.8 }, { "83Her", "", 265.6183, 24.5642, 5.5 }, { "\xce\xb2""Oph", "Cebalrai / Cheleb", 265.8683, 4.5672, 2.7 }, { "", "", 264.2867, 72.4558, 5.8 }, { "", "", 265.3408, 51.8181, 5.9 }, { "84Her", "", 265.8400, 24.3278, 5.7 }, { "\xce\xb9""1Sco", "", 266.8963, -40.1269, 3.0 }, { "3Sgr", "", 266.8900, -27.8308, 4.5 }, { "", "", 265.9971, 53.8017, 5.7 }, { "", "", 266.9033, -14.7258, 5.9 }, { "", "", 267.6175, -53.6122, 5.9 }, { "\xce\xbc""Her", "", 266.6146, 27.7206, 3.4 }, { "", "", 267.8979, -60.1644, 5.7 }, { "", "", 266.7833, 17.6972, 5.7 }, { "", "", 267.2937, -31.7033, 4.8 }, { "\xce\xb3""Oph", "", 266.9733, 2.7072, 3.7 }, { "", "", 267.4646, -37.0433, 3.2 }, { "\xce\xb9""2Sco", "", 267.5467, -40.0906, 4.8 }, { "\xcf\x88""1Dra", "", 265.4846, 72.1489, 4.5 }, { "\xcf\x88""1Dra", "", 265.4917, 72.1569, 5.7 }, { "", "", 267.1033, 20.5656, 5.6 }, { "", "", 267.8867, -40.7725, 5.9 }, { "87Her", "", 267.2050, 25.6228, 5.1 }, { "", "", 268.0567, -34.7992, 5.9 }, { "", "", 268.0821, -34.4167, 5.8 }, { "", "", 267.5954, 29.3222, 5.5 }, { "", "", 267.7017, 22.3164, 5.9 }, { "30Dra", "", 267.2679, 50.7811, 5.0 }, { "", "", 268.3471, -34.8953, 5.6 }, { "", "", 268.4787, -34.7525, 5.9 }, { "", "", 268.1475, 1.3050, 5.9 }, { "", "", 268.6133, -34.4664, 5.9 }, { "", "", 268.3092, 6.1014, 5.7 }, { "", "", 269.1975, -44.3422, 4.8 }, { "90Her", "", 268.3254, 40.0081, 5.1 }, { "", "", 269.1746, -28.0653, 5.8 }, { "", "", 269.0792, -15.8125, 5.8 }, { "", "", 269.4487, -41.7161, 4.8 }, { "", "", 269.0767, 0.6703, 5.8 }, { "89Her", "", 268.8550, 26.0500, 5.4 }, { "", "", 269.1988, -4.0819, 5.4 }, { "", "", 268.9617, 22.4642, 5.5 }, { "\xce\xbe""Dra", "Grumium", 268.3821, 56.8728, 3.7 }, { "", "", 269.2679, 0.0664, 5.9 }, { "", "", 269.7317, -36.8583, 5.7 }, { "", "", 269.7717, -30.2531, 5.1 }, { "\xce\xb8""Her", "", 269.0633, 37.2506, 3.8 }, { "\xce\xbd""Oph", "", 269.7567, -9.7736, 3.3 }, { "4Sgr", "", 269.9483, -23.8161, 4.7 }, { "35Dra", "", 267.3625, 76.9628, 5.0 }, { "\xce\xbe""Her", "", 269.4412, 29.2478, 3.7 }, { "\xce\xb3""Dra", "Eltanin", 269.1517, 51.4889, 2.2 }, { "", "", 269.9029, -4.8214, 5.8 }, { "\xce\xbd""Her", "", 269.6258, 30.1894, 4.4 }, { "\xce\xb6""Ser", "", 270.1208, -3.6903, 4.6 }, { "66Oph", "", 270.0658, 4.3686, 4.6 }, { "93Her", "", 270.0142, 16.7508, 4.6 }, { "67Oph", "", 270.1612, 2.9317, 3.9 }, { "", "", 270.4767, -22.7806, 5.7 }, { "\xcf\x87""Oct", "", 283.6954, -87.6058, 5.2 }, { "68Oph", "", 270.4383, 1.3053, 4.4 }, { "7Sgr", "", 270.7129, -24.2822, 5.3 }, { "\xcf\x88""2Dra", "", 268.7967, 72.0050, 5.4 }, { "", "", 270.1517, 33.2139, 5.9 }, { "", "", 269.9842, 45.5014, 5.6 }, { "95Her", "", 270.3746, 21.5953, 5.1 }, { "95Her", "", 270.3767, 21.5956, 4.9 }, { "", "", 272.8154, -75.8914, 5.8 }, { "\xcf\x84""Oph", "", 270.7708, -8.1803, 5.9 }, { "\xcf\x84""Oph", "", 270.7704, -8.1806, 5.2 }, { "9Sgr", "", 270.9683, -24.3606, 5.9 }, { "96Her", "", 270.5962, 20.8336, 5.2 }, { "\xce\xb3""1Sgr", "", 271.2554, -29.5800, 4.6 }, { "\xce\xb8""Ara", "", 271.6579, -50.0917, 3.6 }, { "\xcf\x80""Pav", "", 272.1450, -63.6683, 4.3 }, { "\xce\xb3""2Sgr", "Alnasl", 271.4521, -30.4242, 2.9 }, { "", "", 271.5987, -36.0197, 5.9 }, { "", "", 271.7075, -43.4247, 5.7 }, { "", "", 271.7075, -43.4247, 5.7 }, { "", "", 273.1437, -73.6717, 5.8 }, { "70Oph", "", 271.3637, 2.4994, 4.0 }, { "", "", 271.5308, -8.3239, 5.8 }, { "", "", 271.5633, -4.7514, 5.7 }, { "\xce\xb9""Pav", "", 272.6087, -62.0022, 5.4 }, { "98Her", "", 271.5079, 22.2189, 5.0 }, { "", "", 272.0208, -28.4572, 4.5 }, { "", "", 271.4567, 32.2306, 5.7 }, { "", "", 271.9517, -17.1542, 5.5 }, { "71Oph", "", 271.8267, 8.7339, 4.6 }, { "72Oph", "", 271.8375, 9.5639, 3.7 }, { "99Her", "", 271.7563, 30.5619, 5.0 }, { "\xce\xbf""Her", "", 271.8858, 28.7625, 3.8 }, { "", "", 272.5238, -30.7286, 5.5 }, { "100Her", "", 271.9563, 26.1014, 5.8 }, { "100Her", "", 271.9563, 26.0975, 5.9 }, { "\xce\xb5""Tel", "", 272.8075, -45.9544, 4.5 }, { "", "", 272.7733, -41.3592, 5.8 }, { "102Her", "", 272.1896, 20.8144, 4.3 }, { "\xce\xb4""UMi", "Yildun", 263.0538, 86.5864, 4.3 }, { "", "", 271.8700, 43.4617, 5.0 }, { "", "", 272.0092, 36.4014, 5.4 }, { "101Her", "", 272.2204, 20.0453, 5.1 }, { "73Oph", "", 272.3908, 3.9933, 5.7 }, { "", "", 272.4750, 3.1197, 5.6 }, { "", "", 272.6679, 3.3242, 5.5 }, { "11Sgr", "", 272.9308, -23.7011, 4.9 }, { "", "", 273.3025, -41.3361, 5.4 }, { "", "", 273.9204, -63.0556, 5.6 }, { "", "", 272.4958, 36.4664, 5.5 }, { "41Dra", "", 270.0383, 80.0042, 5.6 }, { "24UMi", "", 262.7000, 86.9681, 5.7 }, { "\xce\xbc""Sgr", "", 273.4408, -21.0589, 3.8 }, { "", "", 272.9379, 33.4469, 5.8 }, { "104Her", "", 272.9758, 31.4053, 4.9 }, { "14Sgr", "", 273.5663, -21.7131, 5.4 }, { "", "", 272.6317, 54.2867, 5.9 }, { "", "", 273.9696, -44.2067, 5.4 }, { "", "", 274.2813, -56.0233, 5.3 }, { "15Sgr", "", 273.8038, -20.7283, 5.3 }, { "16Sgr", "", 273.8038, -20.3881, 5.9 }, { "\xcf\x86""Oct", "", 275.9004, -75.0442, 5.4 }, { "\xce\xb7""Sgr", "", 274.4067, -36.7617, 3.1 }, { "", "", 277.3313, -80.2328, 5.9 }, { "", "", 274.2983, -17.3739, 5.7 }, { "", "", 274.5133, -27.0425, 4.6 }, { "", "", 273.9117, 42.1594, 5.5 }, { "36Dra", "", 273.4742, 64.3972, 5.0 }, { "", "", 274.5321, 18.1314, 5.9 }, { "\xce\xbe""Pav", "", 275.8067, -61.4939, 4.3 }, { "", "", 274.7896, 7.2597, 5.3 }, { "", "", 275.0367, -15.8317, 5.3 }, { "\xce\xb4""Sgr", "Media", 275.2487, -29.8281, 2.7 }, { "105Her", "", 274.7946, 24.4461, 5.2 }, { "", "", 275.5775, -38.6569, 5.1 }, { "", "", 275.3462, -18.8600, 5.7 }, { "37Dra", "", 273.8208, 68.7558, 5.9 }, { "74Oph", "", 275.2171, 3.3772, 4.8 }, { "", "", 274.9671, 29.6661, 5.9 }, { "106Her", "", 275.0746, 21.9614, 4.9 }, { "\xce\xb7""Ser", "", 275.3275, -2.8989, 3.2 }, { "", "", 275.7212, -36.6694, 5.3 }, { "\xce\xba""Lyr", "", 274.9654, 36.0644, 4.3 }, { "", "", 275.8704, -36.2383, 5.5 }, { "", "", 276.0758, -44.1103, 5.2 }, { "108Her", "", 275.2379, 29.8589, 5.6 }, { "107Her", "", 275.2542, 28.8700, 5.1 }, { "\xce\xb5""Sgr", "Kaus Australis", 276.0429, -34.3847, 1.8 }, { "", "", 275.8008, -12.0147, 5.7 }, { "", "", 275.5362, 23.2853, 5.4 }, { "", "", 275.6471, 12.0289, 5.8 }, { "\xce\xb6""Sct", "", 275.9146, -8.9342, 4.6 }, { "", "", 275.7042, 17.8267, 5.2 }, { "18Sgr", "", 276.2563, -30.7567, 5.6 }, { "", "", 275.3863, 49.1217, 5.0 }, { "", "", 276.7246, -48.1169, 5.4 }, { "109Her", "", 275.9246, 21.7697, 3.8 }, { "21Sgr", "", 276.3375, -20.5417, 4.8 }, { "\xce\xb1""Tel", "", 276.7433, -45.9683, 3.5 }, { "", "", 278.2304, -73.9656, 5.8 }, { "", "", 276.4117, 8.0319, 5.6 }, { "\xce\xbc""Lyr", "", 276.0575, 39.5072, 5.1 }, { "\xce\xb6""Tel", "", 277.2079, -49.0708, 4.1 }, { "", "", 276.9563, -29.8164, 5.9 }, { "", "", 277.4863, -57.5231, 5.7 }, { "", "", 277.1129, -38.9956, 5.6 }, { "\xce\xbb""Sgr", "Kaus Borealis", 276.9925, -25.4217, 2.8 }, { "\xce\xbd""Pav", "", 277.8433, -62.2783, 4.6 }, { "", "", 276.4950, 29.8289, 5.8 }, { "59Ser", "", 276.8021, 0.1961, 5.2 }, { "\xcf\x86""Dra", "", 275.1896, 71.3378, 4.2 }, { "", "", 277.4825, -47.2203, 5.7 }, { "39Dra", "", 275.9771, 58.8006, 4.9 }, { "\xcf\x87""Dra", "", 275.2642, 72.7328, 3.5 }, { "", "", 276.9950, 6.1942, 5.7 }, { "\xce\xb3""Sct", "", 277.2996, -14.5658, 4.7 }, { "", "", 277.4450, -14.5817, 5.9 }, { "", "", 277.5496, -18.7289, 5.6 }, { "\xce\xb4""1Tel", "", 277.9392, -45.9150, 4.9 }, { "60Ser", "", 277.4208, -1.9853, 5.3 }, { "", "", 277.7700, -32.9892, 5.3 }, { "", "", 277.9842, -43.5078, 5.7 }, { "\xce\xb4""2Tel", "", 278.0083, -45.7572, 5.0 }, { "", "", 278.0892, -39.7039, 5.1 }, { "", "", 277.3988, 23.8661, 5.9 }, { "", "", 277.8596, -18.4028, 5.1 }, { "42Dra", "", 276.4963, 65.5636, 4.8 }, { "", "", 277.8571, -10.7958, 5.7 }, { "\xce\xb8""CrA", "", 278.3758, -42.3125, 4.6 }, { "\xce\xba""2CrA", "", 278.3462, -38.7261, 5.6 }, { "", "", 277.7683, 16.9286, 5.7 }, { "61Ser", "", 277.9875, -1.0031, 5.9 }, { "", "", 278.1804, -14.8656, 5.5 }, { "", "", 278.4908, -33.0167, 5.2 }, { "24Sgr", "", 278.4729, -24.0325, 5.4 }, { "", "", 278.4125, -14.8536, 5.7 }, { "", "", 278.1925, 23.6169, 5.8 }, { "", "", 278.2079, 30.5542, 5.4 }, { "", "", 278.7600, -10.9772, 5.1 }, { "\xce\xb1""Sct", "", 278.8017, -8.2442, 3.8 }, { "", "", 278.8025, 18.2033, 5.7 }, { "45Dra", "", 278.1438, 57.0456, 4.7 }, { "", "", 278.8767, 23.6056, 5.6 }, { "\xce\xb6""Pav", "", 280.7588, -71.4281, 4.0 }, { "", "", 278.4863, 52.3536, 5.3 }, { "", "", 279.1158, 9.1225, 5.3 }, { "", "", 279.8096, -47.9097, 5.8 }, { "", "", 279.1629, 6.6719, 5.4 }, { "", "", 279.4767, -21.3978, 5.9 }, { "", "", 279.6279, -23.5050, 5.8 }, { "", "", 279.8958, -43.1861, 5.3 }, { "", "", 279.4000, -0.3094, 5.7 }, { "", "", 279.1550, 33.4689, 5.4 }, { "", "", 279.7225, -21.0519, 5.8 }, { "\xce\xb1""Lyr", "Vega", 279.2346, 38.7836, 0.0 }, { "", "", 280.9050, -64.5511, 5.7 }, { "", "", 277.4371, 77.5469, 5.6 }, { "", "", 280.0021, -7.7906, 5.8 }, { "", "", 281.3621, -64.8714, 4.7 }, { "", "", 279.3896, 62.5267, 5.7 }, { "\xce\xb4""Sct", "", 280.5683, -9.0525, 4.7 }, { "\xce\xbb""CrA", "", 280.9454, -38.3236, 5.1 }, { "", "", 281.0808, -35.6419, 4.8 }, { "", "", 281.2383, -39.6864, 5.4 }, { "\xce\xb5""Sct", "", 280.8804, -8.2753, 4.9 }, { "", "", 281.2067, -25.0111, 5.8 }, { "\xce\xb8""Pav", "", 282.1575, -65.0778, 5.7 }, { "\xcf\x86""Sgr", "", 281.4142, -26.9908, 3.1 }, { "4Aql", "", 281.2079, 2.0600, 5.0 }, { "", "", 280.9650, 31.9267, 5.7 }, { "28Sgr", "", 281.5858, -22.3922, 5.3 }, { "", "", 281.3683, 5.4997, 5.8 }, { "46Dra", "", 280.6579, 55.5394, 5.0 }, { "\xce\xbc""CrA", "", 281.9358, -40.4061, 5.2 }, { "\xce\xb5""1Lyr", "", 281.0850, 39.6700, 5.0 }, { "\xce\xb5""2Lyr", "", 281.0954, 39.6131, 5.1 }, { "\xce\xb5""2Lyr", "", 281.0954, 39.6128, 5.3 }, { "", "", 281.6804, -10.1250, 5.7 }, { "\xce\xb6""1Lyr", "", 281.1933, 37.6050, 4.3 }, { "\xce\xb6""2Lyr", "", 281.2008, 37.5944, 5.7 }, { "5Aql", "", 281.6187, -0.9617, 5.9 }, { "110Her", "", 281.4154, 20.5464, 4.1 }, { "\xce\xb7""1CrA", "", 282.2104, -43.6800, 5.4 }, { "\xce\xb2""Sct", "", 281.7938, -4.7478, 4.2 }, { "", "", 281.5187, 26.6622, 4.8 }, { "", "", 282.3642, -45.8103, 5.8 }, { "", "", 281.8708, -5.7050, 5.2 }, { "\xce\xb7""2CrA", "", 282.3958, -43.4339, 5.6 }, { "111Her", "", 281.7554, 18.1814, 4.3 }, { "\xce\xbb""Pav", "", 283.0542, -62.1875, 4.2 }, { "", "", 281.0758, 61.0481, 5.9 }, { "29Sgr", "", 282.4171, -20.3247, 5.2 }, { "", "", 282.4208, -5.9128, 5.9 }, { "", "", 281.6796, 52.9881, 5.8 }, { "", "", 282.2225, 19.3286, 5.8 }, { "\xce\xba""Tel", "", 283.1650, -52.1075, 5.1 }, { "", "", 283.1129, -46.5953, 5.5 }, { "", "", 282.7437, -9.7742, 5.8 }, { "\xce\xbd""1Lyr", "", 282.4413, 32.8128, 5.9 }, { "\xce\xbd""2Lyr", "", 282.4704, 32.5508, 5.2 }, { "\xce\xb2""Lyr", "Sheliak", 282.5200, 33.3628, 3.4 }, { "\xce\xba""Pav", "", 284.2375, -67.2336, 4.4 }, { "112Her", "", 283.0683, 21.4253, 5.4 }, { "33Sgr", "", 283.5004, -21.3597, 5.6 }, { "\xce\xbd""1Sgr", "", 283.5425, -22.7450, 4.8 }, { "", "", 281.4446, 74.0856, 5.2 }, { "", "", 283.6796, -15.6031, 5.1 }, { "\xce\xbd""2Sgr", "", 283.7796, -22.6714, 4.9 }, { "\xcf\x83""Sgr", "Nunki", 283.8163, -26.2967, 2.0 }, { "", "", 284.0704, -42.7106, 5.3 }, { "", "", 282.8958, 52.9750, 5.5 }, { "50Dra", "", 281.5925, 75.4339, 5.3 }, { "\xce\xbf""Dra", "", 282.8004, 59.3883, 4.6 }, { "", "", 283.8792, -16.3767, 5.7 }, { "\xcf\x89""Pav", "", 284.6517, -60.2006, 5.1 }, { "", "", 284.0025, -23.1736, 5.9 }, { "", "", 284.1687, -37.3433, 5.3 }, { "\xce\xb4""1Lyr", "", 283.4317, 36.9717, 5.5 }, { "", "", 283.5550, 27.9094, 5.6 }, { "113Her", "", 283.6871, 22.6450, 4.5 }, { "\xce\xbb""Tel", "", 284.6154, -52.9386, 4.8 }, { "", "", 283.8646, 6.6153, 5.5 }, { "", "", 283.3067, 50.7083, 4.9 }, { "\xce\xb4""2Lyr", "", 283.6258, 36.8989, 4.3 }, { "\xce\xb8""1Ser", "Alya", 284.0550, 4.2036, 4.6 }, { "\xce\xb8""2Ser", "", 284.0608, 4.2019, 4.9 }, { "\xce\xbe""1Sgr", "", 284.3354, -20.6564, 5.0 }, { "", "", 283.7175, 41.6028, 5.4 }, { "", "", 284.0258, 18.1053, 5.6 }, { "\xce\xb7""Sct", "", 284.2654, -5.8461, 4.8 }, { "\xce\xbe""2Sgr", "", 284.4325, -21.1067, 3.5 }, { "\xce\xb5""CrA", "", 284.6808, -37.1075, 4.8 }, { "", "", 283.6962, 48.8597, 5.7 }, { "13Lyr", "", 283.8338, 43.9461, 4.0 }, { "64Ser", "", 284.3192, 2.5353, 5.5 }, { "", "", 285.8738, -68.7553, 5.8 }, { "", "", 284.2567, 32.9014, 5.2 }, { "", "", 284.5612, 17.3608, 5.3 }, { "", "", 284.8492, -12.8406, 5.5 }, { "10Aql", "", 284.6954, 13.9067, 5.8 }, { "11Aql", "", 284.7738, 13.6225, 5.2 }, { "", "", 284.5079, 38.2661, 5.8 }, { "48Dra", "", 284.1875, 57.8150, 5.6 }, { "\xce\xb5""Aql", "", 284.9058, 15.0683, 4.0 }, { "\xce\xb3""Lyr", "Sulafat", 284.7358, 32.6894, 3.2 }, { "\xcf\x85""Dra", "", 283.5996, 71.2972, 4.8 }, { "", "", 284.9396, 26.2306, 5.2 }, { "", "", 284.1067, 65.2581, 5.6 }, { "\xce\xb6""CrA", "", 285.7788, -42.0953, 4.7 }, { "", "", 285.9892, -51.0186, 5.9 }, { "\xce\xbb""Lyr", "", 285.0038, 32.1456, 4.9 }, { "12Aql", "", 285.4200, -5.7389, 4.0 }, { "\xce\xb6""Sgr", "Ascella", 285.6529, -29.8803, 2.6 }, { "", "", 285.6154, -24.8469, 5.6 }, { "", "", 285.8238, -38.2533, 5.7 }, { "", "", 285.3225, 26.2914, 5.6 }, { "14Aql", "", 285.7271, -3.6989, 5.4 }, { "", "", 285.0571, 50.5336, 5.3 }, { "", "", 286.1046, -31.0469, 5.5 }, { "\xcf\x81""Tel", "", 286.5829, -52.3408, 5.1 }, { "", "", 285.8842, 1.8189, 5.8 }, { "16Lyr", "", 285.3600, 46.9347, 5.0 }, { "\xce\xbf""Sgr", "", 286.1708, -21.7417, 3.7 }, { "49Dra", "", 285.1808, 55.6583, 5.4 }, { "", "", 287.4696, -68.4247, 5.3 }, { "", "", 286.7317, -48.2992, 5.9 }, { "15Aql", "", 286.2400, -4.0314, 5.4 }, { "\xce\xb3""CrA", "", 286.6046, -37.0633, 4.9 }, { "\xce\xb3""CrA", "", 286.6046, -37.0633, 4.9 }, { "\xcf\x83""Oct", "", 317.1925, -88.9564, 5.4 }, { "", "", 286.4217, -15.6603, 5.9 }, { "\xcf\x84""Sgr", "", 286.7350, -27.6706, 3.3 }, { "\xce\xb6""Aql", "", 286.3525, 13.8633, 2.9 }, { "\xce\xbb""Aql", "", 286.5621, -4.8825, 3.4 }, { "", "", 286.2413, 31.7444, 5.5 }, { "\xce\xb4""CrA", "", 287.0871, -40.4967, 4.5 }, { "18Aql", "", 286.7442, 11.0714, 5.0 }, { "", "", 287.0696, -19.2900, 5.5 }, { "", "", 286.6600, 24.2508, 5.7 }, { "51Dra", "", 286.2300, 53.3967, 5.3 }, { "", "", 286.6571, 28.6286, 5.5 }, { "\xce\xb1""CrA", "", 287.3679, -37.9044, 4.1 }, { "", "", 287.4908, -41.8925, 5.8 }, { "\xce\xb2""CrA", "", 287.5071, -39.3408, 4.1 }, { "17Lyr", "", 286.8567, 32.5017, 5.2 }, { "\xce\xb9""Lyr", "", 286.8254, 36.1003, 5.2 }, { "\xcf\x80""Sgr", "", 287.4408, -21.0236, 2.8 }, { "19Aql", "", 287.2496, 6.0733, 5.2 }, { "", "", 287.1075, 52.4256, 5.8 }, { "", "", 288.3071, -25.9067, 5.8 }, { "", "", 289.3000, -66.6614, 5.5 }, { "20Aql", "", 288.1696, -7.9394, 5.3 }, { "", "", 288.6654, -45.1933, 5.9 }, { "", "", 288.3146, -12.2825, 5.5 }, { "19Lyr", "", 287.9417, 31.2833, 5.9 }, { "", "", 288.1529, 21.5544, 5.9 }, { "21Aql", "", 288.4279, 2.2936, 5.1 }, { "", "", 289.0904, -45.4664, 5.4 }, { "\xcf\x88""Sgr", "", 288.8850, -25.2567, 4.8 }, { "53Dra", "", 287.9187, 56.8592, 5.1 }, { "\xce\xb7""Lyr", "", 288.4396, 39.1461, 4.3 }, { "", "", 288.8338, 15.0836, 5.5 }, { "1Sge", "", 288.8225, 21.2322, 5.6 }, { "", "", 288.8533, 30.5264, 5.8 }, { "22Aql", "", 289.1292, 4.8347, 5.5 }, { "43Sgr", "", 289.4087, -18.9531, 4.9 }, { "1Vul", "", 289.0542, 21.3903, 4.7 }, { "", "", 289.1117, 14.5447, 5.6 }, { "54Dra", "", 288.4800, 57.7050, 4.9 }, { "\xce\xb4""Dra", "Altais", 288.1388, 67.6617, 3.0 }, { "59Dra", "", 287.2908, 76.5606, 5.1 }, { "\xce\xb8""Lyr", "", 289.0921, 38.1336, 4.3 }, { "\xcf\x89""1Aql", "", 289.4542, 11.5953, 5.2 }, { "", "", 289.9167, -35.4214, 5.5 }, { "2Vul", "", 289.4317, 23.0256, 5.4 }, { "23Aql", "", 289.6354, 1.0853, 5.1 }, { "", "", 290.1587, -22.4025, 5.5 }, { "\xce\xba""Cyg", "", 289.2758, 53.3686, 3.7 }, { "\xce\xb7""Tel", "", 290.7129, -54.4236, 5.0 }, { "28Aql", "", 289.9137, 12.3747, 5.5 }, { "26Aql", "", 290.1371, -5.4158, 5.0 }, { "27Aql", "", 290.1487, -0.8922, 5.4 }, { "\xce\xb2""1Sgr", "", 290.6596, -44.4589, 4.0 }, { "\xcf\x81""1Sgr", "", 290.4183, -17.8472, 3.9 }, { "\xcf\x85""Sgr", "", 290.4317, -15.9550, 4.6 }, { "\xce\xb2""2Sgr", "", 290.8050, -44.7997, 4.2 }, { "\xcf\x81""2Sgr", "", 290.4621, -18.3083, 5.8 }, { "\xce\xb1""Sgr", "Rukbat", 290.9717, -40.6161, 3.9 }, { "", "", 290.5896, -0.2525, 5.8 }, { "\xcf\x84""Dra", "", 288.8875, 73.3556, 4.4 }, { "", "", 290.0671, 57.6453, 5.9 }, { "3Vul", "", 290.7121, 26.2625, 5.1 }, { "", "", 291.2671, -29.3092, 5.9 }, { "\xcf\x87""1Sgr", "", 291.3188, -24.5086, 5.0 }, { "\xcf\x87""3Sgr", "", 291.3738, -23.9622, 5.4 }, { "", "", 291.3400, -13.8969, 5.6 }, { "", "", 291.9504, -54.3253, 5.6 }, { "\xcf\x80""Dra", "", 290.1671, 65.7147, 4.5 }, { "2Cyg", "", 291.0317, 29.6214, 4.9 }, { "31Aql", "", 291.2425, 11.9444, 5.1 }, { "50Sgr", "", 291.5800, -21.7767, 5.5 }, { "\xce\xb4""Aql", "", 291.3746, 3.1147, 3.3 }, { "", "", 291.5462, -15.0531, 5.7 }, { "", "", 291.7354, -29.7433, 5.6 }, { "", "", 290.9854, 43.3881, 5.8 }, { "", "", 292.7954, -68.4339, 5.9 }, { "4Vul", "", 291.3692, 19.7986, 5.1 }, { "\xce\xbd""Aql", "", 291.6296, 0.3386, 4.6 }, { "", "", 291.6004, 13.0239, 5.7 }, { "5Vul", "", 291.5550, 20.0978, 5.6 }, { "", "", 291.6196, 19.8914, 5.8 }, { "", "", 292.3496, -43.4458, 5.7 }, { "4Cyg", "", 291.5379, 36.3178, 5.1 }, { "", "", 292.0867, 2.9303, 5.8 }, { "", "", 292.4675, -26.9856, 5.5 }, { "35Aql", "", 292.2542, 1.9503, 5.8 }, { "\xce\xb1""Vul", "", 292.1762, 24.6650, 4.4 }, { "8Vul", "", 292.2375, 24.7686, 5.8 }, { "", "", 292.3421, 14.5958, 5.5 }, { "\xce\xb9""1Cyg", "", 291.8579, 52.3206, 5.7 }, { "", "", 293.2242, -53.1858, 5.7 }, { "36Aql", "", 292.6658, -2.7889, 5.0 }, { "", "", 293.3400, -45.2719, 5.6 }, { "\xce\xb2""1Cyg", "Albireo", 292.6804, 27.9597, 3.0 }, { "\xce\xb2""2Cyg", "", 292.6887, 27.9653, 5.1 }, { "\xce\xb9""2Cyg", "", 292.4262, 51.7297, 3.7 }, { "", "", 292.8408, 26.6172, 5.8 }, { "", "", 293.5354, -40.0347, 5.8 }, { "\xce\xb9""Tel", "", 293.8042, -48.0992, 4.9 }, { "8Cyg", "", 292.9429, 34.4531, 4.7 }, { "", "", 292.8304, 50.3067, 5.5 }, { "\xce\xbc""Aql", "", 293.5225, 7.3789, 4.4 }, { "37Aql", "", 293.7804, -10.5603, 5.1 }, { "51Sgr", "", 294.0071, -24.7192, 5.6 }, { "9Vul", "", 293.6454, 19.7733, 5.0 }, { "52Sgr", "", 294.1767, -24.8836, 4.6 }, { "9Cyg", "", 293.7121, 29.4631, 5.3 }, { "", "", 293.4233, 49.2625, 5.9 }, { "", "", 294.2637, -18.2311, 5.6 }, { "", "", 293.6717, 42.4128, 5.3 }, { "\xce\xba""Aql", "", 294.2229, -7.0275, 4.9 }, { "\xce\xb9""Aql", "", 294.1804, -1.2864, 4.3 }, { "", "", 293.5825, 51.2367, 5.7 }, { "", "", 294.3933, -14.3017, 5.4 }, { "", "", 294.2188, 11.2733, 5.9 }, { "42Aql", "", 294.4471, -4.6475, 5.4 }, { "\xcf\x83""Dra", "", 293.0900, 69.6611, 4.6 }, { "\xce\xb5""Sge", "", 294.3225, 16.4628, 5.6 }, { "", "", 294.1579, 44.6950, 5.1 }, { "\xce\xb8""Cyg", "", 294.1104, 50.2211, 4.4 }, { "", "", 295.0296, -23.4286, 5.9 }, { "\xcf\x83""Aql", "", 294.7983, 5.3978, 5.1 }, { "\xcf\x86""Cyg", "", 294.8442, 30.1533, 4.6 }, { "\xce\xb1""Sge", "", 295.0242, 18.0139, 4.3 }, { "45Aql", "", 295.1804, -0.6211, 5.6 }, { "14Cyg", "", 294.8604, 42.8183, 5.4 }, { "", "", 294.6717, 54.9739, 5.8 }, { "\xce\xb2""Sge", "", 295.2621, 17.4761, 4.3 }, { "55Sgr", "", 295.6296, -16.1239, 5.0 }, { "", "", 295.2092, 45.5250, 5.0 }, { "", "", 295.8896, -15.4700, 5.4 }, { "\xcf\x87""Aql", "", 295.6417, 11.8267, 5.2 }, { "", "", 297.3554, -72.5033, 5.4 }, { "", "", 295.6858, 32.4267, 5.9 }, { "16Cyg", "", 295.4538, 50.5253, 5.9 }, { "10Vul", "", 295.9287, 25.7719, 5.4 }, { "", "", 296.5050, -31.9086, 5.5 }, { "\xce\xbd""Tel", "", 297.0050, -56.3625, 5.3 }, { "", "", 295.9375, 41.7731, 5.8 }, { "56Sgr", "", 296.5904, -19.7611, 4.8 }, { "15Cyg", "", 296.0692, 37.3544, 4.8 }, { "\xcf\x85""Aql", "", 296.4162, 7.6133, 5.9 }, { "\xce\xb3""Aql", "Tarazed", 296.5650, 10.6133, 2.7 }, { "\xce\xb4""Cyg", "", 296.2437, 45.1308, 2.8 }, { "", "", 297.6867, -59.1931, 5.4 }, { "17Cyg", "", 296.6067, 33.7278, 4.9 }, { "\xce\xb4""Sge", "", 296.8471, 18.5342, 3.8 }, { "", "", 297.5575, -47.5572, 5.9 }, { "", "", 296.9525, 25.3839, 5.9 }, { "", "", 296.8658, 38.4075, 5.7 }, { "\xcf\x80""Aql", "", 297.1754, 11.8158, 5.7 }, { "", "", 296.0771, 69.3369, 5.9 }, { "\xce\xb6""Sge", "", 297.2446, 19.1422, 5.0 }, { "", "", 298.1567, -54.9711, 5.7 }, { "", "", 297.9608, -39.8744, 5.3 }, { "51Aql", "", 297.6950, -10.7636, 5.3 }, { "\xce\xb1""Aql", "Altair", 297.6958, 8.8683, 0.7 }, { "\xce\xbf""Aql", "", 297.7567, 10.4156, 5.1 }, { "57Sgr", "", 298.0500, -19.0450, 5.9 }, { "\xcf\x87""Cyg", "", 297.6412, 32.9142, 4.2 }, { "12Vul", "", 297.7671, 22.6100, 4.9 }, { "19Cyg", "", 297.6417, 38.7225, 5.1 }, { "", "", 297.6554, 40.5997, 5.6 }, { "\xce\xb7""Aql", "", 298.1183, 1.0056, 3.9 }, { "", "", 298.0067, 24.9922, 5.5 }, { "", "", 298.3279, -3.1144, 5.6 }, { "20Cyg", "", 297.6571, 52.9881, 5.0 }, { "", "", 299.6721, -69.1639, 5.7 }, { "\xce\xb9""Sgr", "", 298.8154, -41.8683, 4.1 }, { "\xce\xb5""Dra", "", 297.0433, 70.2678, 3.8 }, { "56Aql", "", 298.5342, -8.5742, 5.7 }, { "", "", 299.2758, -58.9014, 5.2 }, { "", "", 297.9963, 47.0275, 5.6 }, { "\xce\xb5""Pav", "", 300.1479, -72.9106, 3.9 }, { "", "", 298.0300, 47.9319, 5.9 }, { "13Vul", "", 298.3654, 24.0797, 4.5 }, { "57Aql", "", 298.6567, -8.2272, 5.7 }, { "\xce\xbe""Aql", "", 298.5621, 8.4614, 4.7 }, { "58Aql", "", 298.6867, 0.2736, 5.6 }, { "\xcf\x89""Sgr", "", 298.9600, -26.2994, 4.7 }, { "", "", 298.6296, 24.3194, 5.5 }, { "\xce\xb2""Aql", "Alshain", 298.8283, 6.4067, 3.7 }, { "\xce\xbc""1Pav", "", 300.0958, -66.9494, 5.7 }, { "59Sgr", "", 299.2367, -27.1700, 4.5 }, { "", "", 298.7013, 36.9961, 5.7 }, { "23Cyg", "", 298.3225, 57.5236, 5.1 }, { "10Sge", "", 299.0054, 16.6347, 5.3 }, { "\xcf\x86""Aql", "", 299.0596, 11.4239, 5.2 }, { "\xce\xbc""2Pav", "", 300.4683, -66.9442, 5.3 }, { "22Cyg", "", 298.9654, 38.4867, 4.9 }, { "61Sgr", "", 299.4875, -15.4914, 5.0 }, { "\xce\xb7""Cyg", "", 299.0767, 35.0833, 3.8 }, { "60Sgr", "", 299.7383, -26.1956, 4.8 }, { "\xcf\x88""Cyg", "", 298.9075, 52.4389, 4.9 }, { "11Sge", "", 299.4392, 16.7892, 5.5 }, { "\xce\xb8""1Sgr", "", 299.9342, -35.2764, 4.3 }, { "\xce\xb8""2Sgr", "", 299.9638, -34.6978, 5.3 }, { "", "", 300.4362, -59.3761, 5.1 }, { "", "", 299.3079, 40.3681, 5.4 }, { "", "", 300.0663, -37.7022, 5.9 }, { "", "", 300.2013, -45.1131, 5.8 }, { "", "", 300.0846, -33.7039, 5.6 }, { "", "", 298.9808, 58.8461, 4.9 }, { "\xce\xb3""Sge", "", 299.6892, 19.4922, 3.4 }, { "", "", 299.9475, -9.9583, 5.8 }, { "", "", 299.6583, 30.9836, 5.4 }, { "14Vul", "", 299.7938, 23.1014, 5.6 }, { "13Sge", "", 300.0137, 17.5167, 5.3 }, { "", "", 299.8354, 45.7722, 5.9 }, { "25Cyg", "", 299.9800, 37.0428, 5.1 }, { "", "", 300.2454, 8.5581, 5.9 }, { "63Sgr", "", 300.4942, -13.6369, 5.7 }, { "62Sgr", "", 300.6646, -27.7097, 4.5 }, { "", "", 300.8896, -37.9408, 4.7 }, { "15Vul", "", 300.2754, 27.7536, 4.6 }, { "", "", 299.6196, 63.5342, 5.9 }, { "", "", 300.4362, 24.8003, 5.8 }, { "16Vul", "", 300.5058, 24.9381, 5.2 }, { "", "", 301.0817, -32.0564, 4.9 }, { "26Cyg", "", 300.3400, 50.1047, 5.0 }, { "", "", 300.8183, 18.5006, 5.9 }, { "", "", 300.8750, 16.0314, 5.6 }, { "\xce\xb4""Pav", "", 302.1817, -66.1819, 3.5 }, { "62Aql", "", 301.0967, -0.7094, 5.6 }, { "\xcf\x84""Aql", "", 301.0346, 7.2781, 5.5 }, { "", "", 300.9058, 29.8967, 5.7 }, { "15Sge", "", 301.0258, 17.0700, 5.8 }, { "\xce\xbe""Tel", "", 301.8467, -52.8808, 4.9 }, { "64Dra", "", 300.3687, 64.8211, 5.2 }, { "", "", 301.1504, 32.2186, 5.6 }, { "\xce\xb7""Sge", "", 301.2896, 19.9911, 5.1 }, { "\xcf\x81""Dra", "", 300.7046, 67.8736, 4.5 }, { "17Vul", "", 301.7225, 23.6144, 5.0 }, { "27Cyg", "", 301.5908, 35.9725, 5.3 }, { "64Aql", "", 302.0075, -0.6783, 5.9 }, { "", "", 301.5575, 53.1658, 5.8 }, { "66Dra", "", 301.3867, 61.9956, 5.3 }, { "", "", 302.7996, -36.1011, 5.3 }, { "28Cyg", "", 302.3567, 36.8397, 4.9 }, { "\xce\xb8""Aql", "", 302.8263, -0.8214, 3.2 }, { "18Vul", "", 302.6396, 26.9042, 5.5 }, { "", "", 303.5792, -52.4456, 5.6 }, { "\xce\xbe""2Cap", "", 303.1079, -12.6175, 5.8 }, { "19Vul", "", 302.9500, 26.8089, 5.4 }, { "20Vul", "", 303.0029, 26.4789, 5.9 }, { "66Aql", "", 303.3079, -1.0094, 5.4 }, { "", "", 303.8225, -27.0328, 5.7 }, { "\xcf\x81""Aql", "", 303.5692, 15.1975, 4.9 }, { "68Dra", "", 302.8954, 62.0786, 5.7 }, { "30Cyg", "", 303.3250, 46.8158, 4.8 }, { "21Vul", "", 303.5604, 28.6947, 5.1 }, { "31Cyg", "", 303.4079, 46.7414, 3.7 }, { "29Cyg", "", 303.6333, 36.8064, 4.9 }, { "", "", 303.8163, 25.5919, 4.7 }, { "33Cyg", "", 303.3496, 56.5678, 4.3 }, { "22Vul", "", 303.8758, 23.5086, 5.1 }, { "", "", 303.3654, 60.6406, 5.7 }, { "", "", 303.8487, 33.7294, 5.6 }, { "23Vul", "", 303.9421, 27.8142, 4.5 }, { "\xce\xb1""1Cap", "", 304.4121, -12.5083, 4.2 }, { "4Cap", "", 304.5058, -21.8100, 5.8 }, { "\xce\xba""Cep", "", 302.2221, 77.7114, 4.3 }, { "32Cyg", "", 303.8679, 47.7144, 3.9 }, { "24Vul", "", 304.1963, 24.6711, 5.3 }, { "\xce\xb1""2Cap", "", 304.5137, -12.5447, 3.5 }, { "", "", 304.0025, 45.5794, 5.9 }, { "", "", 304.2304, 40.3650, 5.2 }, { "\xcf\x83""Cap", "", 304.8483, -19.1186, 5.2 }, { "34Cyg", "", 304.4467, 38.0331, 4.8 }, { "", "", 304.5292, 40.7322, 5.8 }, { "36Cyg", "", 304.6192, 37.0000, 5.5 }, { "35Cyg", "", 304.6629, 34.9828, 5.1 }, { "\xce\xbd""Cap", "", 305.1658, -12.7592, 4.7 }, { "", "", 305.0008, 13.5481, 5.9 }, { "\xce\xb2""Cap", "Dabih", 305.2529, -14.7814, 3.0 }, { "\xce\xba""1Sgr", "", 305.6146, -42.0497, 5.5 }, { "", "", 305.0892, 17.7931, 5.8 }, { "", "", 304.6033, 55.3972, 5.7 }, { "", "", 304.3804, 66.8539, 5.9 }, { "", "", 308.3229, -80.9650, 5.7 }, { "\xce\xba""2Sgr", "", 305.9717, -42.4228, 5.6 }, { "25Vul", "", 305.5142, 24.4461, 5.5 }, { "\xce\xb1""Pav", "Peacock", 306.4121, -56.7350, 1.9 }, { "71Dra", "", 304.9029, 62.2575, 5.7 }, { "", "", 305.7946, 5.3431, 5.3 }, { "\xce\xb3""Cyg", "Sadr", 305.5571, 40.2567, 2.2 }, { "", "", 305.5225, 45.7950, 5.5 }, { "", "", 305.6887, 41.0261, 5.9 }, { "", "", 306.3617, -28.6633, 5.8 }, { "", "", 305.0250, 68.8803, 5.5 }, { "", "", 305.2975, 63.9803, 5.6 }, { "39Cyg", "", 305.9654, 32.1900, 4.4 }, { "", "", 305.9350, 37.4764, 5.9 }, { "", "", 306.4188, 21.4097, 5.6 }, { "", "", 309.5775, -81.2889, 5.9 }, { "\xcf\x80""Cap", "", 306.8300, -18.2117, 5.2 }, { "\xcf\x81""Cap", "", 307.2150, -17.8136, 4.7 }, { "40Cyg", "", 306.8929, 38.4403, 5.6 }, { "43Cyg", "", 306.7596, 49.3833, 5.6 }, { "\xce\xbf""Cap", "", 307.4746, -18.5833, 5.9 }, { "69Aql", "", 307.4125, -2.8856, 4.9 }, { "41Cyg", "", 307.3487, 30.3686, 4.0 }, { "42Cyg", "", 307.3350, 36.4547, 5.8 }, { "", "", 307.3629, 56.0681, 5.9 }, { "\xcf\x89""1Cyg", "", 307.5146, 48.9517, 4.9 }, { "", "", 308.0987, -9.8533, 5.6 }, { "\xce\xbd""Mic", "", 308.4796, -44.5161, 5.1 }, { "\xcf\x86""1Pav", "", 308.8950, -60.5817, 4.7 }, { "\xce\xb8""Cep", "", 307.3954, 62.9942, 4.2 }, { "\xcf\x89""2Cyg", "", 307.8283, 49.2203, 5.4 }, { "\xce\xb5""Del", "", 308.3033, 11.3033, 4.0 }, { "\xce\xb7""Del", "", 308.4875, 13.0272, 5.3 }, { "\xcf\x81""Pav", "", 309.3971, -61.5300, 4.8 }, { "47Cyg", "", 308.4758, 35.2508, 4.6 }, { "\xce\xb1""Ind", "", 309.3917, -47.2914, 3.1 }, { "", "", 308.4788, 46.6939, 5.7 }, { "\xce\xb6""Del", "", 308.8271, 14.6742, 4.6 }, { "70Aql", "", 309.1817, -2.5500, 4.8 }, { "\xcf\x86""2Pav", "", 310.0108, -60.5489, 5.1 }, { "73Dra", "", 307.8767, 74.9547, 5.2 }, { "27Vul", "", 309.2696, 26.4619, 5.5 }, { "\xcf\x85""Pav", "", 310.4879, -66.7608, 5.1 }, { "\xce\xb2""Del", "Rotanev", 309.3875, 14.5953, 3.6 }, { "\xce\xb9""Del", "", 309.4546, 11.3778, 5.4 }, { "71Aql", "", 309.5846, -1.1053, 4.3 }, { "\xcf\x84""Cap", "", 309.8183, -14.9547, 5.2 }, { "29Vul", "", 309.6304, 21.2011, 4.8 }, { "\xce\xb8""Del", "", 309.6829, 13.3150, 5.7 }, { "", "", 310.0825, -33.4319, 5.4 }, { "28Vul", "", 309.6329, 24.1161, 5.0 }, { "", "", 309.6463, 23.6806, 5.9 }, { "\xce\xba""Del", "", 309.7825, 10.0861, 5.0 }, { "1Aqr", "", 309.8537, 0.4864, 5.1 }, { "", "", 309.7708, 15.8381, 5.9 }, { "\xcf\x85""Cap", "", 310.0125, -18.1386, 5.1 }, { "75Dra", "", 307.0608, 81.4228, 5.4 }, { "", "", 309.7479, 30.3344, 5.6 }, { "", "", 310.1354, -16.1242, 5.8 }, { "\xce\xb1""Del", "Sualocin", 309.9096, 15.9119, 3.7 }, { "74Dra", "", 307.3646, 81.0914, 5.9 }, { "", "", 310.3487, -31.5983, 5.7 }, { "\xce\xb2""Pav", "", 311.2396, -66.2031, 3.4 }, { "10Del", "", 310.3175, 14.5831, 5.9 }, { "", "", 310.0129, 43.4586, 5.9 }, { "\xce\xb7""Ind", "", 311.0096, -51.9211, 4.5 }, { "49Cyg", "", 310.2608, 32.3072, 5.5 }, { "\xce\xb1""Cyg", "Deneb", 310.3579, 45.2803, 1.2 }, { "", "", 310.4854, 41.7169, 5.6 }, { "\xce\xb4""Del", "", 310.8646, 15.0744, 4.4 }, { "51Cyg", "", 310.5525, 50.3400, 5.3 }, { "", "", 311.5838, -39.1992, 5.5 }, { "\xcf\x83""Pav", "", 312.3254, -68.7764, 5.4 }, { "\xcf\x88""Cap", "", 311.5237, -25.2708, 4.1 }, { "17Cap", "", 311.5417, -21.5142, 5.9 }, { "30Vul", "", 311.2188, 25.2706, 4.9 }, { "52Cyg", "", 311.4154, 30.7197, 4.2 }, { "\xce\xb9""Mic", "", 312.1217, -43.9886, 5.1 }, { "", "", 311.0917, 56.4881, 5.7 }, { "4Cep", "", 310.7958, 66.6575, 5.5 }, { "\xce\xb3""1Del", "", 311.6612, 16.1244, 5.1 }, { "\xce\xb3""2Del", "", 311.6646, 16.1242, 4.2 }, { "\xce\xb5""Cyg", "Gienah", 311.5529, 33.9703, 2.4 }, { "\xce\xb5""Aqr", "Albali", 311.9192, -9.4958, 3.7 }, { "3Aqr", "", 311.9342, -5.0278, 4.4 }, { "\xce\xb6""Ind", "", 312.3708, -46.2269, 4.8 }, { "13Del", "", 311.9513, 6.0083, 5.5 }, { "", "", 311.3379, 57.5797, 4.5 }, { "", "", 311.7950, 34.3742, 4.9 }, { "\xce\xb7""Cep", "", 311.3225, 61.8389, 3.4 }, { "", "", 312.3233, -25.7814, 5.8 }, { "\xce\xbb""Cyg", "", 311.8521, 36.4908, 4.5 }, { "\xce\xb1""Mic", "", 312.4921, -33.7797, 4.9 }, { "\xce\xb9""Ind", "", 312.8754, -51.6083, 5.0 }, { "", "", 311.9554, 47.8319, 5.5 }, { "", "", 312.7529, -37.9133, 5.5 }, { "15Del", "", 312.4075, 12.5453, 5.9 }, { "", "", 312.6742, -12.5450, 5.8 }, { "55Cyg", "", 312.2346, 46.1142, 4.8 }, { "\xcf\x89""Cap", "", 312.9554, -26.9192, 4.1 }, { "4Aqr", "", 312.8571, -5.6264, 5.9 }, { "56Cyg", "", 312.5204, 44.0594, 5.0 }, { "5Aqr", "", 313.0362, -5.5069, 5.5 }, { "\xce\xb2""Ind", "", 313.7025, -58.4542, 3.6 }, { "", "", 313.4175, -39.8100, 5.3 }, { "", "", 312.8675, 28.2506, 5.7 }, { "\xce\xbc""Aqr", "", 313.1633, -8.9833, 4.7 }, { "31Vul", "", 313.0321, 27.0969, 4.5 }, { "19Cap", "", 313.6996, -17.9231, 5.7 }, { "57Cyg", "", 313.3117, 44.3872, 4.7 }, { "76Dra", "", 310.6467, 82.5311, 5.7 }, { "", "", 313.3275, 45.1819, 5.4 }, { "", "", 313.4746, 33.4378, 5.4 }, { "32Vul", "", 313.6400, 28.0575, 5.0 }, { "17Del", "", 313.9029, 13.7214, 5.1 }, { "16Del", "", 313.9108, 12.5686, 5.5 }, { "", "", 314.1971, -26.2964, 5.7 }, { "7Aqr", "", 314.2250, -9.6975, 5.5 }, { "", "", 311.8892, 80.5522, 5.3 }, { "", "", 314.4192, -16.0317, 5.8 }, { "", "", 313.9575, 47.4178, 5.6 }, { "\xce\xb1""Oct", "", 316.1792, -77.0239, 5.1 }, { "", "", 314.1446, 44.9250, 5.9 }, { "", "", 314.1062, 50.7286, 5.8 }, { "", "", 314.1079, 49.1958, 5.9 }, { "", "", 315.0896, -51.2653, 5.7 }, { "\xce\xbd""Cyg", "", 314.2933, 41.1672, 3.9 }, { "18Del", "", 314.6079, 10.8392, 5.4 }, { "33Vul", "", 314.5683, 22.3258, 5.3 }, { "\xce\xb5""Equ", "", 314.7683, 4.2936, 5.2 }, { "", "", 314.5812, 44.4717, 5.5 }, { "", "", 315.0163, 7.5164, 5.9 }, { "\xce\xb3""Mic", "", 315.3229, -32.2578, 4.6 }, { "", "", 314.6254, 50.4622, 5.6 }, { "", "", 315.1154, 19.3294, 5.6 }, { "", "", 315.6133, -38.5306, 5.9 }, { "59Cyg", "", 314.9567, 47.5211, 4.7 }, { "\xce\xb6""Mic", "", 315.7417, -38.6317, 5.3 }, { "", "", 314.8558, 59.4386, 5.5 }, { "", "", 315.3038, 36.0261, 5.9 }, { "60Cyg", "", 315.2954, 46.1558, 5.3 }, { "\xce\xbc""Ind", "", 316.3092, -54.7272, 5.1 }, { "12Aqr", "", 316.0196, -5.8231, 5.8 }, { "\xce\xb7""Cap", "", 316.1012, -19.8550, 4.8 }, { "", "", 317.3429, -73.1731, 5.6 }, { "", "", 315.5379, 56.6697, 5.8 }, { "3Equ", "", 316.1446, 5.5028, 5.6 }, { "\xce\xb7""Mic", "", 316.6063, -41.3861, 5.5 }, { "\xce\xb4""Mic", "", 316.5050, -30.1250, 5.6 }, { "", "", 317.1371, -63.9289, 5.7 }, { "\xce\xb8""Cap", "", 316.4867, -17.2328, 4.0 }, { "", "", 316.6029, -32.3417, 5.1 }, { "4Equ", "", 316.3612, 5.9583, 5.9 }, { "", "", 315.9483, 53.2861, 5.9 }, { "\xce\xbe""Cyg", "", 316.2329, 43.9278, 3.7 }, { "24Cap", "", 316.7821, -25.0058, 4.5 }, { "", "", 316.6263, 31.1847, 5.8 }, { "61Cyg", "", 316.7275, 38.7458, 5.2 }, { "\xcf\x87""Cap", "", 317.1400, -21.1936, 5.3 }, { "63Cyg", "", 316.6504, 47.6483, 4.5 }, { "\xce\xbf""Pav", "", 318.3354, -70.1264, 5.0 }, { "\xce\xbd""Aqr", "", 317.3987, -11.3717, 4.5 }, { "", "", 317.1621, 30.2058, 5.5 }, { "\xce\xb3""Equ", "", 317.5854, 10.1317, 4.6 }, { "", "", 316.5971, 71.4319, 5.8 }, { "", "", 318.0567, -40.2694, 5.8 }, { "", "", 318.2629, -39.4253, 5.2 }, { "", "", 317.5650, 53.5633, 5.7 }, { "", "", 318.3287, -36.4239, 5.9 }, { "", "", 318.3221, -27.6194, 5.4 }, { "", "", 316.3721, 78.1264, 5.9 }, { "", "", 318.9413, -53.2631, 5.7 }, { "\xce\xb6""Cyg", "", 318.2342, 30.2269, 3.2 }, { "", "", 317.9508, 59.9864, 5.6 }, { "\xce\xb4""Equ", "", 318.6204, 10.0069, 4.4 }, { "\xcf\x86""Cap", "", 318.9079, -20.6517, 5.2 }, { "29Cap", "", 318.9371, -15.1714, 5.2 }, { "\xcf\x84""Cyg", "", 318.6979, 38.0456, 3.7 }, { "\xce\xb1""Equ", "Kitalpha", 318.9558, 5.2478, 3.9 }, { "\xce\xb5""Mic", "", 319.4846, -32.1725, 4.7 }, { "30Cap", "", 319.4887, -17.9853, 5.4 }, { "\xce\xb8""Ind", "", 319.9667, -53.4497, 4.3 }, { "15Aqr", "", 319.5462, -4.5194, 5.8 }, { "\xcf\x83""Cyg", "", 319.3542, 39.3947, 4.2 }, { "\xcf\x85""Cyg", "", 319.4796, 34.8969, 4.4 }, { "", "", 319.7167, 11.2033, 5.9 }, { "", "", 319.3096, 55.7981, 5.9 }, { "\xce\xb8""1Mic", "", 320.1900, -40.8097, 4.8 }, { "68Cyg", "", 319.6133, 43.9458, 5.0 }, { "", "", 319.8425, 38.2375, 5.8 }, { "16Aqr", "", 320.2679, -4.5600, 5.8 }, { "", "", 319.8700, 49.5103, 5.7 }, { "\xce\xb1""Cep", "Alderamin", 319.6450, 62.5856, 2.4 }, { "9Equ", "", 320.2700, 7.3544, 5.8 }, { "", "", 319.8158, 58.6236, 5.6 }, { "", "", 320.2683, 23.8558, 5.5 }, { "", "", 320.2088, 32.4528, 5.6 }, { "\xce\xb9""Cap", "", 320.5617, -16.8344, 4.2 }, { "", "", 318.9258, 77.0122, 5.9 }, { "6Cep", "", 319.8425, 64.8719, 5.1 }, { "", "", 320.7521, -22.6689, 5.6 }, { "1Peg", "", 320.5217, 19.8044, 4.0 }, { "17Aqr", "", 320.7346, -9.3194, 5.9 }, { "\xce\xb2""Equ", "", 320.7233, 6.8111, 5.1 }, { "\xce\xb8""2Mic", "", 321.1033, -41.0067, 5.7 }, { "\xce\xb3""Pav", "", 321.6108, -65.3661, 4.2 }, { "33Cap", "", 321.0400, -20.8519, 5.4 }, { "", "", 320.5017, 49.3889, 5.6 }, { "18Aqr", "", 321.0479, -12.8781, 5.4 }, { "", "", 320.9950, 24.2742, 5.7 }, { "19Aqr", "", 321.3046, -9.7486, 5.7 }, { "", "", 322.1871, -69.5053, 5.3 }, { "", "", 321.1417, 26.1744, 5.6 }, { "21Aqr", "", 321.3208, -3.5567, 5.4 }, { "", "", 321.5954, -37.8294, 5.6 }, { "", "", 321.7567, -42.5478, 5.5 }, { "\xce\xb6""Cap", "", 321.6667, -22.4114, 3.7 }, { "35Cap", "", 321.8117, -21.1961, 5.7 }, { "", "", 321.3317, 46.7144, 5.6 }, { "69Cyg", "", 321.4458, 36.6675, 5.9 }, { "36Cap", "", 322.1808, -21.8072, 4.5 }, { "70Cyg", "", 321.8392, 37.1167, 5.3 }, { "", "", 321.7150, 48.8350, 5.3 }, { "35Vul", "", 321.9171, 27.6086, 5.4 }, { "", "", 322.0346, 32.2253, 5.8 }, { "", "", 322.2496, 22.1794, 5.9 }, { "2Peg", "", 322.4871, 23.6389, 4.5 }, { "7Cep", "", 321.9421, 66.8092, 5.4 }, { "71Cyg", "", 322.3625, 46.5406, 5.2 }, { "\xce\xbe""Gru", "", 323.0246, -41.1792, 5.2 }, { "6PsA", "", 323.0608, -33.9447, 5.9 }, { "\xce\xb2""Aqr", "Sadalsuud", 322.8896, -5.5711, 2.9 }, { "", "", 323.3479, -44.8486, 5.5 }, { "\xce\xb2""Cep", "Alfirk", 322.1650, 70.5608, 3.2 }, { "", "", 321.2071, 80.5247, 5.9 }, { "", "", 322.7471, 60.4594, 5.5 }, { "37Cap", "", 323.7125, -20.0844, 5.6 }, { "", "", 323.2358, 49.9778, 5.7 }, { "", "", 323.8233, -3.9831, 5.7 }, { "\xcf\x81""Cyg", "", 323.4954, 45.5919, 4.0 }, { "8PsA", "", 324.0458, -26.1714, 5.7 }, { "\xce\xbd""Oct", "", 325.3687, -77.3900, 3.7 }, { "72Cyg", "", 323.6942, 38.5342, 4.9 }, { "\xce\xb5""Cap", "", 324.2700, -19.4661, 4.6 }, { "", "", 324.0100, 45.3747, 5.5 }, { "\xce\xbe""Aqr", "", 324.4379, -7.8542, 4.6 }, { "74Cyg", "", 324.2375, 40.4136, 5.0 }, { "5Peg", "", 324.4392, 19.3186, 5.4 }, { "4Peg", "", 324.6329, 5.7717, 5.6 }, { "", "", 324.7546, 20.2653, 5.8 }, { "25Aqr", "", 324.8888, 2.2436, 5.1 }, { "\xce\xb3""Cap", "Nashira", 325.0229, -16.6622, 3.6 }, { "9Cep", "", 324.4800, 62.0819, 4.7 }, { "\xce\xbb""Oct", "", 327.7262, -82.7192, 5.2 }, { "", "", 324.7400, 57.4892, 5.6 }, { "42Cap", "", 325.3871, -14.0475, 5.1 }, { "75Cyg", "", 325.0462, 43.2739, 5.1 }, { "41Cap", "", 325.5033, -23.2628, 5.2 }, { "26Aqr", "", 325.5421, 1.2853, 5.6 }, { "\xce\xba""Cap", "", 325.6646, -18.8664, 4.7 }, { "7Peg", "", 325.5646, 5.6800, 5.3 }, { "44Cap", "", 325.7683, -14.3997, 5.8 }, { "77Cyg", "", 325.5954, 41.0772, 5.6 }, { "\xcf\x80""1Cyg", "", 325.5237, 51.1897, 4.6 }, { "45Cap", "", 326.0042, -14.7494, 5.9 }, { "\xce\xb9""PsA", "", 326.2367, -33.0258, 4.3 }, { "", "", 325.7767, 41.1550, 5.4 }, { "79Cyg", "", 325.8571, 38.2839, 5.6 }, { "\xce\xb5""Peg", "Enif", 326.0467, 9.8750, 2.3 }, { "\xce\xbc""1Cyg", "", 326.0358, 28.7428, 4.7 }, { "46Cap", "", 326.2512, -9.0825, 5.0 }, { "9Peg", "", 326.1279, 17.3500, 4.3 }, { "", "", 326.1304, 14.7719, 5.9 }, { "\xce\xba""Peg", "", 326.1613, 25.6450, 4.1 }, { "\xce\xbc""Cep", "Garnet Star", 325.8767, 58.7800, 4.0 }, { "11Cep", "", 325.4804, 71.3114, 4.5 }, { "\xce\xbb""Cap", "", 326.6338, -11.3658, 5.5 }, { "12Peg", "", 326.5183, 22.9489, 5.2 }, { "\xce\xb4""Cap", "Deneb Algedi", 326.7600, -16.1272, 2.8 }, { "", "", 327.0658, -47.3036, 5.5 }, { "", "", 325.7667, 72.3203, 5.1 }, { "\xce\xb8""PsA", "", 326.9342, -30.8983, 5.0 }, { "", "", 326.2221, 62.4606, 5.9 }, { "11Peg", "", 326.8083, 2.6861, 5.6 }, { "", "", 327.5004, -64.7125, 5.6 }, { "\xce\xbf""Ind", "", 327.6963, -69.6294, 5.5 }, { "\xce\xbd""Cep", "", 326.3621, 61.1208, 4.2 }, { "\xcf\x80""2Cyg", "", 326.6983, 49.3094, 4.2 }, { "12Cep", "", 326.8554, 60.6928, 5.5 }, { "14Peg", "", 327.4612, 30.1742, 5.0 }, { "13Peg", "", 327.5362, 17.2856, 5.2 }, { "", "", 327.8925, 19.8267, 5.7 }, { "\xce\xbc""Cap", "", 328.3242, -13.5517, 5.0 }, { "", "", 328.7979, -61.8864, 5.9 }, { "\xce\xb3""Gru", "", 328.4821, -37.3650, 3.0 }, { "15Peg", "", 328.1246, 28.7933, 5.5 }, { "16Peg", "", 328.2658, 25.9250, 5.0 }, { "", "", 328.0042, 55.7969, 5.7 }, { "", "", 328.4058, 19.6683, 5.6 }, { "", "", 328.5433, -4.2761, 5.7 }, { "", "", 329.0950, -37.2536, 5.4 }, { "\xce\xb4""Ind", "", 329.4796, -54.9925, 4.4 }, { "13Cep", "", 328.7217, 56.6114, 5.8 }, { "17Peg", "", 329.2350, 12.0764, 5.5 }, { "", "", 328.8796, 65.3208, 5.8 }, { "", "", 329.8246, -38.3953, 5.5 }, { "", "", 330.7658, -76.1186, 5.9 }, { "", "", 329.1629, 63.6256, 4.9 }, { "\xce\xb7""PsA", "", 330.2092, -28.4536, 5.4 }, { "\xce\xb5""Ind", "", 330.8400, -56.7861, 4.6 }, { "", "", 329.7225, 62.6983, 5.9 }, { "28Aqr", "", 330.2708, 0.6050, 5.5 }, { "20Peg", "", 330.2725, 13.1197, 5.6 }, { "19Peg", "", 330.2883, 8.2572, 5.6 }, { "16Cep", "", 329.8125, 73.1800, 5.0 }, { "30Aqr", "", 330.8183, -6.5225, 5.5 }, { "\xce\xbf""Aqr", "", 330.8288, -2.1553, 4.6 }, { "", "", 330.4608, 52.8822, 5.7 }, { "21Peg", "", 330.8292, 11.3864, 5.8 }, { "14Cep", "", 330.5192, 58.0006, 5.5 }, { "", "", 330.7363, 44.6500, 5.6 }, { "", "", 331.1533, -26.8225, 5.9 }, { "\xce\xba""2Ind", "", 331.4621, -59.6361, 5.6 }, { "32Aqr", "", 331.1975, -0.9067, 5.3 }, { "\xce\xbb""Gru", "", 331.5288, -39.5433, 4.4 }, { "\xce\xbd""Peg", "", 331.4200, 5.0586, 4.8 }, { "\xce\xb1""Aqr", "Sadalmelik", 331.4458, -0.3197, 2.9 }, { "", "", 331.2975, 26.6739, 5.7 }, { "18Cep", "", 330.9704, 63.1197, 5.2 }, { "\xce\xbe""Cep", "", 330.9475, 64.6278, 4.2 }, { "\xce\xb9""Aqr", "", 331.6092, -13.8697, 4.2 }, { "23Peg", "", 331.3946, 28.9639, 5.7 }, { "", "", 331.5083, 45.0144, 5.1 }, { "\xce\xb1""Gru", "Al Na'ir", 332.0583, -46.9611, 1.7 }, { "20Cep", "", 331.2521, 62.7856, 5.2 }, { "19Cep", "", 331.2871, 62.2800, 5.1 }, { "\xce\xb9""Peg", "", 331.7529, 25.3450, 3.7 }, { "\xce\xbc""PsA", "", 332.0958, -32.9886, 4.5 }, { "\xcf\x85""PsA", "", 332.1083, -34.0439, 4.9 }, { "", "", 331.8692, 19.4756, 5.7 }, { "25Peg", "", 331.9596, 21.7028, 5.7 }, { "35Aqr", "", 332.2458, -18.5197, 5.8 }, { "", "", 332.4821, -34.0147, 5.3 }, { "\xcf\x84""PsA", "", 332.5367, -32.5483, 4.9 }, { "\xcf\x80""1Peg", "", 332.3067, 33.1722, 5.5 }, { "\xce\xb8""Peg", "Biham", 332.5500, 6.1978, 3.5 }, { "38Aqr", "", 332.6563, -11.5650, 5.4 }, { "\xcf\x80""2Peg", "", 332.4967, 33.1783, 4.2 }, { "", "", 332.6558, 11.6244, 5.7 }, { "", "", 332.9638, 16.0406, 5.9 }, { "", "", 332.7912, 50.8233, 5.4 }, { "\xce\xb6""Cep", "", 332.7138, 58.2011, 3.3 }, { "", "", 333.0333, 24.9500, 5.9 }, { "24Cep", "", 332.4517, 72.3411, 4.7 }, { "\xce\xbb""Cep", "", 332.8779, 59.4144, 5.0 }, { "", "", 333.4350, -25.1808, 5.5 }, { "\xcf\x88""Oct", "", 334.4604, -77.5117, 5.5 }, { "", "", 332.9533, 56.8394, 5.2 }, { "", "", 332.6621, 70.1328, 5.5 }, { "", "", 333.1992, 34.6047, 5.3 }, { "\xce\xbb""PsA", "", 333.5783, -27.7669, 5.4 }, { "", "", 333.0079, 60.7594, 5.3 }, { "41Aqr", "", 333.5750, -21.0742, 5.3 }, { "\xce\xb5""Oct", "", 335.0062, -80.4397, 5.1 }, { "", "", 333.4108, 28.6083, 5.8 }, { "", "", 333.0929, 63.2914, 5.7 }, { "", "", 333.4696, 39.7150, 4.4 }, { "\xce\xbc""1Gru", "", 333.9038, -41.3467, 4.7 }, { "", "", 333.4554, 45.4408, 5.5 }, { "\xce\xbc""2Gru", "", 334.1108, -41.6275, 5.1 }, { "", "", 333.6850, 42.9539, 5.7 }, { "\xce\xb5""Cep", "", 333.7583, 57.0436, 4.1 }, { "42Aqr", "", 334.2004, -12.8314, 5.3 }, { "1Lac", "", 333.9925, 37.7489, 4.1 }, { "\xce\xb8""Aqr", "Ancha", 334.2083, -7.7833, 4.1 }, { "", "", 334.2192, -9.0400, 5.7 }, { "", "", 334.5650, -53.6278, 5.3 }, { "\xce\xb1""Tuc", "", 334.6254, -60.2597, 2.8 }, { "44Aqr", "", 334.2771, -5.3872, 5.7 }, { "\xcf\x85""Oct", "", 337.9058, -85.9672, 5.7 }, { "", "", 334.1104, 57.2203, 5.8 }, { "45Aqr", "", 334.7533, -13.3050, 5.9 }, { "25Cep", "", 334.5529, 62.8044, 5.7 }, { "\xcf\x81""Aqr", "", 335.0496, -7.8211, 5.3 }, { "30Peg", "", 335.1150, 5.7894, 5.3 }, { "\xce\xbd""Ind", "", 336.1533, -72.2556, 5.2 }, { "47Aqr", "", 335.3983, -21.5983, 5.1 }, { "\xce\xb3""Aqr", "Sadalachbia", 335.4142, -1.3872, 3.8 }, { "31Peg", "", 335.3796, 12.2053, 5.0 }, { "32Peg", "", 335.3304, 28.3306, 4.8 }, { "2Lac", "", 335.2567, 46.5367, 4.5 }, { "\xcf\x80""2Gru", "", 335.7833, -45.9286, 5.6 }, { "", "", 336.2938, -70.4317, 5.7 }, { "49Aqr", "", 335.8788, -24.7625, 5.5 }, { "", "", 335.8838, -7.1944, 5.9 }, { "", "", 336.2350, -57.7972, 5.3 }, { "51Aqr", "", 336.0287, -4.8369, 5.7 }, { "50Aqr", "", 336.1129, -13.5294, 5.7 }, { "\xce\xb2""Lac", "", 335.8900, 52.2292, 4.4 }, { "\xcf\x80""Aqr", "", 336.3192, 1.3775, 4.6 }, { "\xce\xb4""Tuc", "", 336.8333, -64.9664, 4.4 }, { "4Lac", "", 336.1292, 49.4764, 4.5 }, { "", "", 333.2942, 86.1081, 5.2 }, { "", "", 337.1571, -67.4892, 5.5 }, { "34Peg", "", 336.6558, 4.3936, 5.7 }, { "35Peg", "", 336.9646, 4.6956, 4.7 }, { "\xce\xbd""Gru", "", 337.1633, -39.1319, 5.4 }, { "", "", 336.9425, 31.8403, 5.9 }, { "\xce\xb4""1Gru", "", 337.3175, -43.4956, 3.9 }, { "", "", 336.5033, 70.7708, 5.4 }, { "\xce\xb6""1Aqr", "", 337.2071, -0.0203, 4.5 }, { "\xce\xb6""2Aqr", "", 337.2087, -0.0200, 4.4 }, { "\xce\xb4""2Gru", "", 337.4396, -43.7494, 4.1 }, { "26Cep", "", 336.7721, 65.1322, 5.4 }, { "36Peg", "", 337.2833, 9.1289, 5.5 }, { "", "", 337.4417, -27.1072, 5.9 }, { "", "", 337.2925, 26.7631, 5.7 }, { "37Peg", "", 337.4917, 4.4317, 5.4 }, { "\xce\xb4""Cep", "", 337.2929, 58.4153, 3.7 }, { "5Lac", "", 337.3825, 47.7069, 4.3 }, { "\xcf\x83""Aqr", "", 337.6617, -10.6781, 4.8 }, { "38Peg", "", 337.5075, 32.5725, 5.6 }, { "\xce\xb2""PsA", "", 337.8762, -32.3461, 4.2 }, { "\xcf\x81""1Cep", "", 336.6771, 78.7858, 5.8 }, { "6Lac", "", 337.6221, 43.1233, 4.5 }, { "\xce\xbd""Tuc", "", 338.2504, -61.9822, 4.8 }, { "\xce\xb1""Lac", "", 337.8229, 50.2825, 3.7 }, { "", "", 338.1100, 39.7797, 5.8 }, { "60Aqr", "", 338.5121, -1.5742, 5.8 }, { "\xcf\x81""2Cep", "", 337.4704, 78.8242, 5.5 }, { "\xcf\x85""Aqr", "", 338.6733, -20.7083, 5.2 }, { "", "", 338.4192, 56.6250, 5.7 }, { "", "", 338.9021, -23.9911, 5.9 }, { "\xce\xb7""Aqr", "", 338.8392, -0.1175, 4.0 }, { "", "", 338.0675, 76.2264, 5.6 }, { "", "", 339.1475, -31.6639, 5.8 }, { "\xcf\x83""2Gru", "", 339.2450, -40.5911, 5.8 }, { "8Lac", "", 338.9679, 39.6342, 5.7 }, { "\xce\xba""Aqr", "Situla", 339.4392, -4.2281, 5.0 }, { "9Lac", "", 339.3433, 51.5453, 4.6 }, { "31Cep", "", 338.9421, 73.6431, 5.0 }, { "", "", 339.7146, -33.0814, 5.6 }, { "40Peg", "", 339.7192, 19.5222, 5.8 }, { "", "", 340.2038, -57.4222, 5.9 }, { "", "", 339.6579, 56.7958, 5.2 }, { "10Lac", "", 339.8154, 39.0503, 4.8 }, { "", "", 340.0929, -30.6589, 5.8 }, { "", "", 339.3042, 75.3717, 5.7 }, { "30Cep", "", 339.6625, 63.5844, 5.1 }, { "\xce\xb5""PsA", "", 340.1642, -27.0436, 4.1 }, { "\xce\xb2""Oct", "", 341.5137, -81.3817, 4.1 }, { "", "", 340.2196, 14.5494, 5.7 }, { "11Lac", "", 340.1288, 44.2764, 4.4 }, { "", "", 340.0767, 53.8461, 5.9 }, { "\xce\xb6""Peg", "Homam", 340.3654, 10.8314, 3.4 }, { "", "", 340.6538, -47.2106, 5.9 }, { "\xce\xb2""Gru", "", 340.6671, -46.8847, 2.1 }, { "12Lac", "", 340.3692, 40.2256, 5.2 }, { "\xce\xbf""Peg", "", 340.4392, 29.3075, 4.7 }, { "", "", 340.4892, 14.5164, 5.9 }, { "", "", 340.4004, 41.5494, 5.9 }, { "\xcf\x81""Gru", "", 340.8750, -41.4144, 4.8 }, { "66Aqr", "", 340.8971, -18.8303, 4.6 }, { "\xce\xb7""Peg", "Matar", 340.7504, 30.2214, 2.9 }, { "", "", 341.0217, 39.4656, 5.9 }, { "\xce\xb7""Gru", "", 341.4079, -53.5003, 4.8 }, { "13Lac", "", 341.0229, 41.8192, 5.0 }, { "", "", 341.4196, -46.5475, 5.5 }, { "\xce\xbe""Oct", "", 342.5954, -80.1242, 5.3 }, { "\xce\xbe""Peg", "", 341.6733, 12.1728, 4.1 }, { "", "", 341.5425, 44.5461, 5.7 }, { "\xce\xbb""Peg", "", 341.6329, 23.5656, 3.9 }, { "68Aqr", "", 341.8879, -19.6133, 5.2 }, { "\xcf\x84""1Aqr", "", 341.9283, -14.0564, 5.6 }, { "\xce\xb5""Gru", "", 342.1388, -51.3169, 3.4 }, { "", "", 342.0454, 37.4167, 5.9 }, { "\xcf\x84""2Aqr", "", 342.3979, -13.5925, 4.0 }, { "\xce\xbc""Peg", "Sadalbari", 342.5008, 24.6017, 3.4 }, { "", "", 342.7592, -39.1569, 5.4 }, { "", "", 342.4425, 55.9028, 5.4 }, { "14Lac", "", 342.5908, 41.9536, 5.9 }, { "21PsA", "", 342.8371, -29.5361, 5.9 }, { "\xce\xb9""Cep", "", 342.4200, 66.2006, 3.5 }, { "\xce\xb3""PsA", "", 343.1317, -32.8756, 4.4 }, { "", "", 342.8450, 61.6969, 5.6 }, { "\xcf\x83""Peg", "", 343.1004, 9.8356, 5.1 }, { "\xce\xbb""Aqr", "", 343.1538, -7.5797, 3.7 }, { "15Lac", "", 343.0083, 43.3125, 4.9 }, { "", "", 341.8708, 83.1539, 4.7 }, { "", "", 343.2596, 16.8411, 5.6 }, { "74Aqr", "", 343.3696, -11.6167, 5.8 }, { "", "", 343.4171, 44.7492, 5.8 }, { "\xce\xb4""Aqr", "Skat", 343.6625, -15.8208, 3.2 }, { "77Aqr", "", 343.6896, -16.2719, 5.5 }, { "", "", 343.5292, 40.3769, 5.8 }, { "", "", 343.7958, -4.9878, 5.7 }, { "\xcf\x81""Peg", "", 343.8071, 8.8158, 4.9 }, { "", "", 343.7608, 37.0769, 5.9 }, { "\xce\xb4""PsA", "", 343.9871, -32.5397, 4.2 }, { "\xcf\x84""3Gru", "", 344.1992, -47.9692, 5.7 }, { "", "", 343.9354, 36.3517, 5.7 }, { "16Lac", "", 344.0983, 41.6039, 5.5 }, { "", "", 344.1083, 49.7336, 4.9 }, { "\xce\xb1""PsA", "Fomalhaut", 344.4129, -29.6222, 1.1 }, { "51Peg", "", 344.3663, 20.7689, 5.4 }, { "", "", 344.2687, 48.6842, 5.4 }, { "", "", 342.7592, 85.3736, 5.9 }, { "52Peg", "", 344.7992, 11.7289, 5.7 }, { "", "", 344.8992, -29.4622, 5.5 }, { "2Psc", "", 344.8642, 0.9628, 5.4 }, { "", "", 345.0242, -25.1642, 5.6 }, { "\xce\xb6""Gru", "", 345.2200, -52.7542, 4.1 }, { "", "", 343.6033, 84.3461, 4.7 }, { "", "", 345.2812, -50.9500, 5.6 }, { "", "", 345.1788, 3.0117, 5.8 }, { "", "", 345.0213, 56.9453, 5.0 }, { "", "", 345.3308, -28.8536, 5.5 }, { "", "", 345.3821, -4.7114, 5.9 }, { "\xce\xbf""And", "", 345.4804, 42.3261, 3.6 }, { "", "", 345.6846, -20.8706, 5.9 }, { "2And", "", 345.6513, 42.7578, 5.1 }, { "\xcf\x80""PsA", "", 345.8742, -34.7494, 5.1 }, { "", "", 346.2175, -68.8203, 5.5 }, { "", "", 345.9979, -41.4783, 5.7 }, { "\xce\xb2""Psc", "", 345.9692, 3.8200, 4.5 }, { "\xce\xba""Gru", "", 346.1650, -53.9650, 5.3 }, { "\xce\xb2""Peg", "Scheat", 345.9438, 28.0828, 2.4 }, { "", "", 345.8871, 67.2092, 5.2 }, { "3And", "", 346.0458, 50.0522, 4.6 }, { "\xce\xb1""Peg", "Markab", 346.1904, 15.2053, 2.4 }, { "83Aqr", "", 346.2908, -7.6936, 5.4 }, { "\xce\xb8""Gru", "", 346.7200, -43.5206, 4.2 }, { "86Aqr", "", 346.6704, -23.7431, 4.4 }, { "\xcf\x85""Gru", "", 346.7233, -38.8922, 5.6 }, { "", "", 346.8113, -50.6864, 5.8 }, { "55Peg", "", 346.7512, 9.4094, 4.5 }, { "56Peg", "", 346.7783, 25.4683, 4.7 }, { "1Cas", "", 346.6538, 59.4197, 4.8 }, { "", "", 346.8696, 21.1342, 5.9 }, { "", "", 347.0875, -28.8233, 5.6 }, { "4And", "", 346.9137, 46.3872, 5.3 }, { "5And", "", 346.9392, 49.2958, 5.7 }, { "5Psc", "", 347.1704, 2.1278, 5.4 }, { "88Aqr", "", 347.3617, -21.1725, 3.6 }, { "", "", 347.4358, -28.0886, 5.8 }, { "", "", 347.4887, -42.8606, 5.8 }, { "57Peg", "", 347.3812, 8.6772, 5.1 }, { "89Aqr", "", 347.4783, -22.4575, 4.6 }, { "", "", 347.5408, -40.5917, 5.8 }, { "\xcf\x80""Cep", "", 346.9746, 75.3875, 4.4 }, { "\xce\xb9""Gru", "", 347.5900, -45.2467, 3.9 }, { "58Peg", "", 347.5063, 9.8219, 5.3 }, { "2Cas", "", 347.4338, 59.3331, 5.7 }, { "", "", 347.6775, 17.5944, 5.7 }, { "6And", "", 347.6133, 43.5442, 5.9 }, { "59Peg", "", 347.9342, 8.7200, 5.1 }, { "7And", "", 348.1375, 49.4064, 4.5 }, { "", "", 348.3208, 57.1683, 5.5 }, { "", "", 348.3604, 11.0650, 5.8 }, { "\xcf\x86""Aqr", "", 348.5808, -6.0489, 4.2 }, { "", "", 348.7442, -41.1056, 5.7 }, { "", "", 348.8929, -3.4964, 5.5 }, { "\xcf\x88""1Aqr", "", 348.9729, -9.0878, 4.2 }, { "", "", 349.2404, -62.0011, 5.6 }, { "", "", 348.6554, 74.2311, 5.8 }, { "", "", 349.1654, -44.4892, 5.9 }, { "\xce\xb3""Tuc", "", 349.3575, -58.2358, 3.9 }, { "\xcf\x87""Aqr", "", 349.2121, -7.7267, 5.0 }, { "", "", 348.9075, 70.8881, 5.5 }, { "\xce\xb3""Psc", "", 349.2912, 3.2822, 3.6 }, { "", "", 349.1762, 53.2136, 5.5 }, { "\xcf\x88""2Aqr", "", 349.4758, -9.1825, 4.3 }, { "\xcf\x86""Gru", "", 349.5412, -40.8244, 5.5 }, { "8And", "", 349.4363, 49.0153, 4.8 }, { "\xcf\x84""Oct", "", 352.0154, -87.4822, 5.4 }, { "\xce\xb3""Scl", "", 349.7058, -32.5319, 4.4 }, { "\xcf\x88""3Aqr", "", 349.7404, -9.6108, 4.9 }, { "94Aqr", "", 349.7779, -13.4589, 5.0 }, { "96Aqr", "", 349.8500, -5.1244, 5.5 }, { "", "", 349.8504, -18.0753, 5.9 }, { "\xce\xbf""Cep", "", 349.6562, 68.1117, 4.7 }, { "11And", "", 349.8742, 48.6253, 5.4 }, { "10And", "", 349.9683, 42.0781, 5.7 }, { "7Psc", "", 350.0858, 5.3814, 5.0 }, { "\xcf\x84""Peg", "", 350.1592, 23.7403, 4.6 }, { "63Peg", "", 350.2067, 30.4150, 5.5 }, { "", "", 350.3146, -26.9867, 5.6 }, { "12And", "", 350.2221, 38.1822, 5.7 }, { "64Peg", "", 350.4788, 31.8125, 5.3 }, { "97Aqr", "", 350.6633, -15.0392, 5.2 }, { "98Aqr", "", 350.7425, -20.1006, 3.9 }, { "66Peg", "", 350.7692, 12.3139, 5.0 }, { "", "", 350.6354, 60.1336, 5.5 }, { "", "", 351.0546, -51.8914, 5.7 }, { "", "", 351.3308, -56.8492, 5.5 }, { "67Peg", "", 351.2117, 32.3850, 5.5 }, { "4Cas", "", 351.2096, 62.2828, 4.9 }, { "\xcf\x85""Peg", "", 351.3450, 23.4042, 4.4 }, { "99Aqr", "", 351.5117, -20.6419, 4.3 }, { "\xce\xbf""Gru", "", 351.6525, -52.7217, 5.5 }, { "", "", 351.8125, -58.4761, 5.6 }, { "\xce\xba""Psc", "", 351.7333, 1.2556, 4.9 }, { "13And", "", 351.7808, 42.9119, 5.7 }, { "69Peg", "", 351.9183, 25.1672, 5.9 }, { "\xce\xb8""Psc", "", 351.9921, 6.3789, 4.2 }, { "", "", 351.8192, 70.3597, 5.6 }, { "", "", 352.2542, -63.1108, 5.6 }, { "70Peg", "", 352.2888, 12.7606, 4.5 }, { "", "", 352.5083, 58.5489, 4.9 }, { "14And", "", 352.8225, 39.2364, 5.2 }, { "", "", 353.3313, -77.3853, 5.8 }, { "\xce\xb2""Scl", "", 353.2429, -37.8183, 4.3 }, { "", "", 351.7533, 87.3075, 5.5 }, { "101Aqr", "", 353.3192, -20.9144, 4.7 }, { "71Peg", "", 353.3671, 22.4989, 5.3 }, { "72Peg", "", 353.4883, 31.3253, 4.9 }, { "14Psc", "", 353.5375, -1.2475, 5.8 }, { "", "", 353.7058, -15.2458, 5.9 }, { "15And", "", 353.6562, 40.2364, 5.5 }, { "73Peg", "", 353.6592, 33.4972, 5.6 }, { "\xce\xb9""Phe", "", 353.7692, -42.6150, 4.7 }, { "", "", 353.7458, 71.6422, 5.8 }, { "16Psc", "", 354.0971, 2.1022, 5.6 }, { "", "", 354.4150, -13.0603, 5.6 }, { "", "", 354.4625, -45.4925, 4.7 }, { "\xce\xbb""And", "", 354.3913, 46.4581, 3.8 }, { "", "", 354.3833, 44.4292, 5.8 }, { "75Peg", "", 354.4867, 18.4006, 5.5 }, { "\xce\xb9""And", "", 354.5342, 43.2681, 4.2 }, { "18And", "", 354.7846, 50.4717, 5.3 }, { "\xcf\x89""1Aqr", "", 354.9462, -14.2217, 5.0 }, { "\xce\xb9""Psc", "", 354.9875, 5.6264, 4.1 }, { "", "", 354.9796, 9.6772, 5.9 }, { "", "", 354.7933, 75.2928, 5.9 }, { "", "", 354.8379, 74.0028, 5.9 }, { "\xce\xb3""Cep", "Errai", 354.8367, 77.6325, 3.2 }, { "\xce\xbc""Scl", "", 355.1592, -32.0731, 5.3 }, { "\xce\xba""And", "", 355.1021, 44.3339, 4.1 }, { "", "", 355.2871, -11.6806, 5.8 }, { "103Aqr", "", 355.3937, -18.0272, 5.3 }, { "104Aqr", "", 355.4408, -17.8164, 4.8 }, { "", "", 355.4863, 7.2506, 5.8 }, { "\xce\xbb""Psc", "", 355.5117, 1.7800, 4.5 }, { "", "", 355.6163, -15.4478, 5.2 }, { "\xcf\x89""2Aqr", "", 355.6804, -14.5450, 4.4 }, { "77Peg", "", 355.8433, 10.3314, 5.0 }, { "", "", 356.1696, -78.7914, 5.7 }, { "", "", 356.0500, -64.4044, 5.7 }, { "78Peg", "", 355.9979, 29.3617, 4.9 }, { "106Aqr", "", 356.0504, -18.2769, 5.2 }, { "107Aqr", "", 356.5038, -18.6781, 5.2 }, { "\xcf\x88""And", "", 356.5088, 46.4203, 4.9 }, { "19Psc", "", 356.5979, 3.4867, 5.0 }, { "", "", 356.6529, 66.7822, 5.9 }, { "\xcf\x83""Phe", "", 356.8167, -50.2267, 5.1 }, { "\xcf\x84""Cas", "", 356.7646, 58.6519, 4.8 }, { "", "", 356.8163, -11.9108, 5.7 }, { "", "", 356.7579, 57.4514, 5.5 }, { "20Psc", "", 356.9854, -2.7617, 5.4 }, { "", "", 356.9783, 67.8069, 5.0 }, { "\xce\xb4""Scl", "", 357.2317, -28.1303, 4.5 }, { "6Cas", "", 357.2092, 62.2144, 5.4 }, { "21Psc", "", 357.3646, 1.0761, 5.7 }, { "", "", 357.4208, 36.4253, 5.9 }, { "79Peg", "", 357.4142, 28.8425, 5.9 }, { "", "", 357.5612, -9.9742, 5.9 }, { "", "", 357.6388, -14.4019, 5.7 }, { "80Peg", "", 357.8383, 9.3133, 5.7 }, { "108Aqr", "", 357.8388, -18.9089, 5.1 }, { "\xce\xb3""1Oct", "", 358.0267, -82.0189, 5.1 }, { "22Psc", "", 357.9913, 2.9303, 5.5 }, { "\xcf\x86""Peg", "", 358.1221, 19.1203, 5.0 }, { "", "", 358.1250, -14.2511, 5.8 }, { "82Peg", "", 358.1546, 10.9475, 5.3 }, { "", "", 358.2104, -8.9967, 5.7 }, { "24Psc", "", 358.2317, -3.1556, 5.9 }, { "\xcf\x81""Cas", "", 358.5958, 57.4994, 4.5 }, { "", "", 358.6942, 0.1092, 5.6 }, { "", "", 359.2650, 42.6583, 5.9 }, { "", "", 359.2854, 55.7058, 5.5 }, { "", "", 359.3329, -62.9564, 5.9 }, { "\xce\xb3""2Oct", "", 359.3862, -82.1700, 5.7 }, { "\xce\xb7""Tuc", "", 359.3967, -64.2983, 5.0 }, { "\xcf\x88""Peg", "", 359.4396, 25.1414, 4.6 }, { "", "", 359.6033, 51.3886, 4.8 }, { "27Psc", "", 359.6683, -3.5561, 4.8 }, { "\xcf\x80""Phe", "", 359.7325, -52.7458, 5.1 }, { "\xcf\x83""Cas", "", 359.7521, 55.7550, 4.8 }, { "\xcf\x89""Psc", "", 359.8279, 6.8633, 4.0 }, { "", "", 359.8663, -29.4850, 5.6 }, { "\xce\xb5""Tuc", "", 359.9792, -65.5772, 4.5 }, { "\xcf\x84""Phe", "", 0.2687, -48.8100, 5.7 }, { "", "", 0.3333, -50.3372, 5.5 }, { "\xce\xb8""Oct", "", 0.3987, -77.0658, 4.7 }, { "", "", 0.4037, 61.2231, 5.5 }, { "29Psc", "", 0.4558, -3.0275, 5.1 }, { "85Peg", "", 0.5425, 27.0819, 5.7 }, { "30Psc", "", 0.4900, -6.0142, 4.4 }, { "\xce\xb6""Scl", "", 0.5829, -29.7203, 5.0 }, { "32Psc", "", 0.6238, 8.4856, 5.6 }, { "", "", 0.6504, 66.0989, 5.8 }, { "2Cet", "", 0.9350, -17.3361, 4.5 }, { "9Cas", "", 1.0567, 62.2878, 5.8 }, { "", "", 1.0821, -16.5289, 5.7 }, { "3Cet", "", 1.1254, -10.5094, 4.9 }, { "", "", 1.1750, 67.1667, 5.6 }, { "", "", 1.1721, -71.4369, 5.5 }, { "", "", 1.2758, 61.3142, 5.8 }, } astrometry.net-0.67/catalogs/brightstars-to-fits.py000644 000765 000024 00000002331 12651445460 022653 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import simplejson import re lines = open('brightstars-data.c').readlines() l = ''.join(lines[3:-2]).replace('{','[').replace('}',']') def replace_unicode(match): c1 = match.group(1) c2 = match.group(2) #s = eval('\\x%s\\x%s' s = '"\\x%s\\x%s"' % (c1, c2) #print 's', s s = eval(s) #print 's', s d = s.decode('utf8') return d + ' ' l = re.sub(r'\\x(..)\\x(..)""', replace_unicode, l) #l = re.sub(r'\\x(..)\\x(..)""', r'\u\1\2 ', l) #l = re.sub(r'\\x(..)\\x(..)""', r'\x\1\x\2 ', l) #l = l.decode('utf8') l = '[' + l + '0 ]' print l j = simplejson.loads(l) j = j[:-1] print j nm, nm2, rr, dd = [],[],[],[] vmag = [] for n1,n2,r,d,mag in j: #print 'n1', n1 j = simplejson.dumps(n1) #print 'json:', j #j = str(j) #print ' ->', j nm.append(j.replace('"', '')) nm2.append(str(n2)) vmag.append(float(mag)) rr.append(r) dd.append(d) from astrometry.util.fits import * import numpy as np T = tabledata() T.name1 = np.array(nm) T.name2 = np.array(nm2) T.vmag = np.array(vmag) T.ra = np.array(rr) T.dec = np.array(dd) T.about() T.writeto('brightstars.fits') astrometry.net-0.67/catalogs/brightstars.c000644 000765 000024 00000000665 12651445460 021072 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "brightstars.h" static brightstar_t bs[] = #include "brightstars-data.c" ; int bright_stars_n() { return sizeof(bs) / sizeof(brightstar_t); } const brightstar_t* bright_stars_get(int starindex) { assert(starindex >= 0); assert(starindex < bright_stars_n()); return bs + starindex; } astrometry.net-0.67/catalogs/brightstars.fits000644 000765 000024 00001235300 12651445460 021612 0ustar00dstnstaff000000 000000 SIMPLE = T / file does conform to FITS standard BITPIX = 16 / number of bits per data pixel NAXIS = 0 / number of data axes EXTEND = T / FITS dataset may contain extensions COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / 8-bit bytes NAXIS = 2 / 2-dimensional binary table NAXIS1 = 67 / width of table in bytes NAXIS2 = 5022 / number of rows in table PCOUNT = 0 / size of special data area GCOUNT = 1 / one data group (required keyword) TFIELDS = 5 / number of fields in each row TTYPE1 = 'name1 ' / label for field 1 TFORM1 = '11A ' / data format of field: ASCII Character TTYPE2 = 'name2 ' / label for field 2 TFORM2 = '32A ' / data format of field: ASCII Character TTYPE3 = 'vmag ' / label for field 3 TFORM3 = 'D ' / data format of field: 8-byte DOUBLE TTYPE4 = 'ra ' / label for field 4 TFORM4 = 'D ' / data format of field: 8-byte DOUBLE TTYPE5 = 'dec ' / label for field 5 TFORM5 = 'D ' / data format of field: 8-byte DOUBLE END 33Psc @ffffff?VϪ͟zG86Peg @?@*͞& @?4J@M7 @?Dg8}H10Cas @?2W@P  @?Q6GE85 @ffffff@,=@a@O\u03b1 And Alpheratz @@]cf@=1 @@zG!8YK\u03b2 Cas Caph @@[W>6z@M)^ 87Peg @@zG@26?\u03ba 1Scl @@33333;u"\u03b5 Phe @ffffff@ҽ<64F߮zH34Psc @@*0U2@&JL_22And @@TɆ@G =b @333333@[6$t\u03b3 3Oct @@N;6TT`d @333333@m()(\)6Cet @333333@K]d.͞\u03ba 2Scl @@%zxl"h;̹#x\u03b8 Scl @@weںA k~ @@UfA14m9\u03b3 Peg Algenib @ffffff@ y=b@.^ѷY23And @@ &I@D? @@ g8}H:=K\u03c7 Peg @333333@ 4֡a@44JM @ffffff@ QU= @@ zxl"hU? k7Cet @@ GzH2t35Psc @@ \(@!? @@ _p## @ffffff@%ڹ?rGE85 @@ߤ@NC,zx @333333@&A@GGz\u03b8 And @ffffff@sPH@CWAs\u03c3 And @@T@Bd? @333333@n.3@?g8}\u03b9 Cet @ @mU=!8YK\u03b6 Tuc @@T`dP7s @@h$ xG@> @@&IR@@tTɆ41Psc @333333@0 )@ aohی\u03c1 And @ffffff@!-w1@Bs\u03c0 Tuc @@fffffQh\u03b9 Scl @ffffff@Q6z@JѷY44Psc @@g8}H? ѷ\u03b2 Hyi @ffffff@hۋqSPD*\u03b1 Phe Ankaa @ffffff@H˒:*E'.H\u03ba Phe @333333@4JE =p @@>m\9L_47Psc @@ cA \@13 @ffffff@:xl"h @F2{m\u03b7 Scl @333333@U=@C @@p =qCQ @@TZ@M[28And @@!-w1@=oiDg812Cet @@ =p Xy= @ffffff@`҈p7ɭB @ffffff@oO MHQ @333333@mB@@u%F \u03bb Cas @@oiDg@KBsP @ffffff@@Jkqu!\u03bb 1Phe @@jg Hf]cf\u03b2 1Tuc @333333@:)zOzS&\u03b2 2Tuc @@\(O{U=\u03ba Cas @ffffff@ @OwAs52Psc @333333@ K~($@4K]cA51Psc @ffffff@ 2W@҈p: @@ +jg@Kr\(\u03b2 3Tuc @@ ]p =Os @@ ״3=쿱[W @@!;J#9J/13Cet @@!˒:) (14Cet @@!ڹ- qv @@"X@KO @@":6C@N)\u03bb 2Phe @@!״3H6 @ffffff@"cn.3@F>qi\u03b6 Cas @ @"|]ce@J͞&\u03c0 And @333333@"pD@@L_53Psc @333333@"dJM@.vaf @@":@A  @@"/{J#8g8}\u03b5 And @333333@#G@=O˒:) @@#%F L@H\\u03b4 And @ @# @>]ce54Psc @333333@#}Vl@5@'RT`55Psc @333333@#af@5p4m9\u03b1 Cas Schedar @@$A@N@LD7 @@$Zxl"h hXy=32And @333333@$\(@Cg @333333@$8QM)y @333333@%E84@Pp =\u03be Cas @333333@%K]c@IA\u03bc Phe @@$ԕ*G G{\u03be Phe @@$74L@73\u03c0 Cas @@%$@G)^ @@%Y0 )N!\u03c1 Tuc @333333@%LF]c21Cas @ffffff@&33333@R=K^\u03bf Cas @@&\?@H$g8}\u03c6 1Cet @@&Q%8F]d\u03bb 2Scl @@&_oC5C\ @@&?@K`d @@&^Q6o @@&y_oEV23Cas @@'Zc@R=p @333333@&GzGƞ @@'0 )6=K57Psc @333333@'Ffffff@. @333333@(g l@R+3333358Psc @@',zxl@'S&\u03b6 And @@'P{@8Dg8}60Psc @@'T`d@Fs @@']ce2r\u03b7 Cas @ 333333@(@Ll"h @@(Zc5\)62Psc @@(%Q@333333 @@(1 @U=\u03bd Cas @333333@(jfB@I{A [\u03b4 Psc @@(WsPH@W =p64Psc @@(}<64@0)^\u03bd And @@(@De+ @@(af+o @@(v8"C, @333333@)]K]@P =p\u03c6 2Cet @ffffff@):~%I\u03bb Hyi @@(KQRXe @ffffff@+qN;5@TB\u03c1 Phe @@)WrGI~R<6 @333333@*TɅ@N @@*Vaf8|Q20Cet @@*@NNT\u03c5 1Cas @333333@+4m9@M|?66Psc @@+KC,z@304m9 @@*DOo 36And @@+{6@7D @333333@+xl"h ceO\u03b3 Cas @333333@,Z>B@N[Z\u03c5 2Cas @ffffff@,TZ@M.H @@,doh@N.p:~\u03c6 3Cet @333333@,,zxl&\u03bc And @ffffff@,`hۋq@C?Vϫ\u03bb 2Tuc @@+IQQa\u03b7 And @@,xl"h @7jG{ @@-BZc@Pqi68Psc @@,C,z@<ѷY @@-Ov_خ@@|\u03c6 4Cet @ffffff@-]v&\(\u03b1 Scl @333333@-MU==[Q @@1/[W>@Uq \u03be Scl @@.CuVl!39And @@/sݗ+k@D(\\u03c3 Psc @@/hTɅ@?( @@/Mj@N\u03c3 Scl @@/8Q?IQ\u03b5 Psc @@/x)@\(25Cet @@/ݗX@ @333333@0JM@NGE85 @@0\(@J@H @333333@/h\)G2G{72Psc @ffffff@0E\(@-g8}\u03c8 1Psc @333333@0kU=@5y*0U2a\u03c8 1Psc @@0lwkP@5w,28Cet @@0sg#8Y\u03bc Cas @ffffff@1|Q@KucA \u03b2 Phe @ ffffff@0S&G[s41And @@1 k@E-  @@1#@M!\u03c8 2Psc @@0:@4<6430Cet @333333@0Gz#:)y80Psc @@1zH@JE\u03c5 Phe @@0PHDR<6\u03b9 Tuc @333333@0A [N=K^ @ffffff@2N;6@S!-w1\u03b7 Cet @ 333333@1%\($]IQ\u03c6 And @@1`4m9@GFs31Cas @@1@Q1ԕ*\u03b2 And Mirach @@1n҈p;@Ao\u03b6 Phe @333333@1Kv_ح\u03c8 3Psc @@1tzG@3u%F44And @ffffff@1 xF@E kP| @333333@1O M@9u2a| @@1P{@P >\u03b8 Cas @333333@1ƚ,<@K)^ 32Cas @@1(\@PA5Xy>33Cet @@1 =p@45And @333333@1~@Bܲ82Psc @ffffff@1>6z@?l#x\u03c7 Psc @ffffff@1:@5e+\u03c4 Psc @@1=p @>Fs34Cet @@1c @4n @@20oiDg8B힃%\u03c6 Psc @ffffff@2o@8fA\u03b6 Psc @@2n҈p;@Mqu"87Psc @@2}H@0"337Cet @ffffff@2A [38Cet @@2zG*0U2a|\u03bd Phe @@2QFJ39Cet @@3& 'IQ\u03ba Tuc @333333@2-w1Q889Psc @ffffff@3s33333@ JL\u03c6 Cas @@484֡@MXy=\u03c5 Psc @@3 qv@;Cwk42Cet @333333@3H91Psc @@4G@@<!-w\u03be And @333333@4\(@Fòm]47And @@4P{@BۅQ @@4ڌL_@4x ԕ+\u03c8 Cas @@5{~($@QQ @333333@4@N>s\u03b8 Cet @ @5|Q ]b\u03b4 Cas Ruchbah @@5tFs@NOv_ @@5!. @@5+QD =p @@5 =p@E0 46Cet @@5gzH-2S&\u03c1 Psc @333333@5U2a|@3,L_94Psc @@5wkP@3=M:\u03c9 And @333333@5 @Fߤ@ @@5EXy=P?47Cet @ffffff@5 =p*K] @@5C\@EM:\u03b1 UMi Polaris @@B-@VP38Cas @333333@6θQ@QD\u03b3 Phe @ 333333@6_oE (49And @@6,<@GC48Cet @ffffff@6fIQ5 [7\u03bc Psc @333333@6Q@Z @@6l"h :52a|\u03b7 Psc @ @6쿱[W@. @@7[Q@M)R\u03b4 Phe @333333@66HQ @333333@6.2>HYJ\u03c7 Cas @@7{U=@M1 @@7;~($Bn&I @333333@7X@B\N< @@7m8Y>BZ @333333@7`d@2uᰉ49Cet @ffffff@7Q/Z)y @@8:@H\?40Cas @@8 k@RB\( @333333@7qiC@1ohۋ\u03c5 And @@82m\@Dg50Cet @@7쿱[W.!-w @@8}H@LQ\u03c4 Scl @ffffff@8\)=Q\u03c0 Psc @@8FL/{J@(H51And @ @8@HPl"h \u03c7 And @@8fffff@F1k~( @@8<64BCU=\u03b1 Eri Achernar / Archenar ?ٙ@8m8YLL/{J @@8>6z5Fz105Psc @@8Q@0g@ @ffffff@9*qiC@EOv_\u03c4 And @@9%Q@DI43Cas @@9?@Q&I42Cas @ffffff@9U=@Q =p @@9rZc@ENqi @@9i_o@> L_ @333333@8\(L[W>6 @@8m\LC\u03bd Psc @@9[U=@33333 @ffffff@9Z@Ao44Cas @@9oi@NFqi @@9o[W>&?107Psc @@9˒:)@4D7\u03c6 Per @@9=p @IX$ xG\u03c0 Scl @@9*0U2a@) @@933333Bj\( @@9c  n/ @@9s33333Ne '0 @@9AsJt\u03c4 Cet @ @:`d/\u03bf Psc @@:Y*0U2a@"P)^ @ffffff@:˒:)@O[ @333333@8{P{Tfffff @333333@:As1\u03b5 Scl @333333@:ie+a9 p = @@:1.Ih˒:* @@: 'J͞& @@;)b}@BY}4Ari @333333@; U=@03 @@;,]ce@@X[6 @ffffff@8] qvU1B @333333@;P (@G͞& @@;~($@ |Q @@;@Iv_ح1Ari @333333@;rGE@6Fz\u03c7 Cet @ffffff@;em\%_o1Per @@;As@KG{ @@;y @&+jg2Per @@< @Iezxl"h\u03b6 Cet Baten Kaitos @ @;p =$Q @@;#9Ia|Q\u03b5 Cas Navi @ ffffff@BGGz48Cas @@>}<64@Q L/ @333333@=4K@5쿱[W50Cas @333333@>a@@R7447Cas @333333@?G@@SRu%F 112Psc @333333@> _o@)^57Cet @@=-w14 ҉\u03c5 Cet @@>U2a|5g @@>! L_ @@=e+aEg53Cas @@>NU@P\)4Per @@>MjO@K>fffff\u03b1 Hyi @ffffff@=GzNC49Cas @@?aGz@S\(\u03c0 For @333333@>O[W>>oiDg8\u03b1 Psc Alrescha @@>m\@Q\u03b1 Psc Alrescha @333333@>m\@Q\u03b5 Tri @@> qv@@VϪ @@>!R@*\u03c7 Phe @ffffff@>m<64F[W>6z\u03b3 1AndAlmach @@>@E*3\u03b3 2And @333333@>W'@E*W'10Ari @ffffff@>>BZ@9{J#:60Cet @@>wkP?l"h ԕ @333333@>%.N;61Cet @@>g ly  @ffffff@>/VjOv`\u03bd For @ffffff@?\(=Ln.\u03ba Ari @@?%1@6!.\u03b1 Ari Hamal @@?s@7vfffff @ffffff@@=K@M68YJ58And @333333@@ k@BC\\u03b2 Tri @@@1ae@A~\N<14Ari @@@-}H@9- 59And @ffffff@@\(\@C '015Ari @@@Tߤ@@3*0U @333333@@$eE#964Cet @ffffff@@k@N@!#63Cet @@@sPH4m86Tri @@@%2@>M+j60And @333333@@Xe@FXy= @@@\N@8*D @333333@@Z@Il"h \u03b7 Ari @@@ (@55!.19Ari @@@2W@.4֡a\u03be 1Cet @333333@@@! 66Cet @@@TɅo& @333333@@y=c5*0U\u03bc For @@@u>Q 7Tri @@@C\@@oiDg20Ari @@@'RT@9y=c21Ari @@@҈p;@9 u% @@@rGEDVl!\u03b4 Tri @333333@A!|@A8Per @@A?䎊r@L)^ 7Per @@ABd7@L#9\u03b3 Tri @@A*s@@q 67Cet @@Av_حU2a|\u03c0 1Hyi @@@حVPiB\u03b8 Ari @ffffff@AC\N@3}Vl62And @333333@Ah\)@G =q @@A@ (?䎊r\u03c6 Eri @ @AQIo10Tri @@A^fffff@fffff(Ʌoi @333333@B@*0.T11Tri @@Bnm\@?( @333333@BR)_4 D\u03bb Hor @333333@B[W?N'Vϫ\u03ba Hyi @@A%2RiTɅo12Tri @@BVl!@=]cA\u03be 2Cet @@Bu@ Q13Tri @333333@BiB@=$t\u03ba Eri @@B_&Ge+\u03c6 For @ffffff@B@ @@BGz@9<(\14Tri @ffffff@CMjO@BsP @@B qu@#9 @333333@Cn.@AEp =75Cet @333333@Coi\(\u03c3 Cet @@C)_.}IQ @ffffff@CrGE@R4_F\u03bb 1For @@C#ZAS33333 @@C@N@Por @@Ct@B+j\u03c9 For @@C;u%<;Q15Tri @333333@Cx\)@AX77Cet @@CVm\p @333333@CwkQ@/{J#\u03bd Cet @333333@C|n.@_  @@CIQ@C]cA @333333@CTɅo@A!y 80Cet @@CS*0U231Ari @ffffff@C64@(Q @333333@CY@6z\u03b9 1For @@Ce> qu!81Cet @ffffff@CL/{J +6z\u03bb 2For @@CAsAJn\u03bd Ari @@C#9@5Ov_ @@Dae@T\{\u03bc Hyi @@B+jShۋ\u03b9 2For @333333@C->1X\u03b7 Hor @333333@CoiJEM:\u03b4 Cet @@Cv_ح?K]d\u03b5 Cet @333333@Cn'$t33Ari @333333@D(@; @@D$t"#11Per @@Dab}@KڹZ @333333@D_حV@JW>6z12Per @@DG䎊r@DѷX @@CEr#984Cet @@D'iDg8C\N @@D@4@P@\u03bc Ari @ffffff@DKZ@4m\\u03b9 Eri @ffffff@DVl!CM: @@D2#9-JE\u03b8 Per @ffffff@Dfffff@H84֡14Per @@D)_@F&ѷY35Ari @ffffff@Dns@; '0\u03b6 Hor @@DQKFfffff\u03b3 Cet @ 333333@Di@ C,\u03b5 Hyi @ffffff@CG{Q[\u03bf Ari @@D~($ @.$tS\u03b9 Hor @@DQiBIfp:~\u03c0 Cet @@DA [+kP38Ari @ffffff@DQ@(?\u03bc Cet @@D!R<@$:xl"h \u03c4 1Eri @@DMjO2\(39Ari @@Du@=?H˒:40Ari @333333@E@2Hu%F @333333@EO M@Q8҈p @333333@Ey=c@90'RT`\u03b3 Hor @@D6zO)y\u03b7 Per @ @EVL/{J@KS&\u03c0 Ari @@E)TɅo@1vϪ͟\u03b6 Hyi @333333@DaePxF]41Ari @ @E?v_ح@;B}Vm16Per @@ERY@C(@\u03b2 For @@E"G{@3A [ @333333@Ev;5X@Gka@O17Per @@Epl"h @A?\u03b3 2For @333333@E<;@N\u03c3 Ari @@EoK]d@.)\u03b7 2For @@EGAs\u03c4 2Eri @@Ea:S5@N\u03b7 3For @@EUڹZA֊qi\u03bd Hor @@E )^OgAs\u03c4 Per @333333@ED*@Ja20Per @333333@EQ@C+33333 @@EYJ@N³g @@E,<6`[6\u03c8 For @@EW'C7Vϫ\u03c1 2Ari @@EiB@2TJM @@E64HY}\u03c1 3Ari @ffffff@F (@2ᰉ @@F\(@ n.3\u03bd Hyi @@EO1RH21Per @ffffff@F):S@?'/W\u03b7 Eri Azha @ffffff@F sh!a@ @ffffff@FA [ ᰊ47Ari @333333@FB)_@4)^ \u03c0 Per @@FX_F@C֡a @@GD(\@SW24Per @@Fa-@Ao4Eri @@F,zxl"7ܥzxl" @@FzwkQ@GC,zx @333333@FuF L0@D<쿱\u03b5 Ari @ffffff@Ffm\@5W,\u03b5 Ari @ffffff@Ffm\@5W,6Eri @333333@FC ҉7)^ @@F =p@J-oi @@FVfffffB\(\u03bb Cet @@FvC-@!У =q\u03b8 1EriAcamar @ @FH_FD'hۋ\u03b8 2Eri @333333@FH{D&Fs5Eri @@FuC\Q\u03b6 For @@Fs@N9F1. @@F{J#:@%+j49Ari @@F>B[@:vR<6 @@G҈p;@T^Ov_\u03c1 1Eri @@FVl! '\u03b2 Hor @@FYb}PN;93Cet @ffffff@Fn.@iDg8~\u03b1 Cet Menkab / Menkar @@F\)@[Q @333333@F(#<쿱\u03b5 For @333333@FQ<y \u03b3 Per @333333@Gb}@JѷX\u03c1 2Eri @333333@F֐$tH˒ @@G1Gz@LZW'\u03c4 3Eri @@Ḟ#7حV\u03c1 Per @ ffffff@G%Xy=@CkMj @333333@Gj#9@Pm]\u03c1 3Eri @@G (g8}H @333333@FϪ͞G| @ffffff@GLzxl"@*_حV @333333@G_o @R0 )\u03bc Hor @ffffff@FU=Mp:~ @@GQiBZY\u03b2 Per Algol @@Gce@DzQ_\u03b9 Per @@G#9@H΀IQ\u03b8 Hyi @@F73Q\(\u03ba Per @ffffff@G@Fm55Ari @@G:)z@=\u03c9 Per @ffffff@GGz@CL/{J @@GԿ[W?@'Q\u03b4 Ari @333333@G(\@3 56Ari @@Hݗ+@;A2W @@H,@HT @@HzG@TɆ @@I @4@SoS&94Cet @@H (#9\u03b1 For @ffffff@HJL%\u03b6 Ari @333333@H\>B[@5 ]cA @@H|L-w1 @@GqrGESRT`e30Per @@HGz@F33333\u03b6 Eri @333333@Hz ! @333333@HzH@Pi @@Hl"h @CC,zx29Per @ffffff@H(\@Iq 31Per @@Hߤ@@I (\ @333333@H\(@A?95Cet @333333@HA [oi @@Hb}<n.15Eri @333333@H6C,59Ari @@H\(@;3\u03ba 1Cet @333333@H:)z@ _ح @@HC\2H˒: @333333@H.2G73 @@I G{@= ]ce @@I<ߤ@@HrGE32Per @@I.!R<@E)y\u03c4 4Eri @ @H'RT5.H @ffffff@H\(8{J#:\u03c4 1Ari @@I'As@5%=K\u03b6 1Ret @@H =qOIn.\u03ba 2Cet @ffffff@I#U=@ g k @@HshEC @@I+j@P% \u03b6 2Ret @@Hߤ?O@ѷX @@Ig =p@HMjO62Ari @@IFYJ@;Q\u03c4 2Ari @@IX6@4( @@I,7S&\u03b1 Per Mirfak ?333333@IW'@H8YJ @ffffff@IfA@@ĕ*164Ari @@IiB@8e+a\u03b9 Hyi @@H~QSX>B[\u03bf Tau @ @In@"t @@J (@H ԕ+ @@J"0U2a|@M[6 @@JA [@H*1\u03be Tau @ @Ip =@#w1 @@J=F L0@Mpu! @ffffff@J PH@@\(34Per @ffffff@J+@H#w @@In.;QGz @@J@6@K @@J'RT&W @333333@JSZ@H B\u03c3 Per @333333@JRh ԕ@Geں\u03c7 2For @@IN;6A8}H @@J4>B[8Q4Tau @ffffff@JMu@&<쿱 @@J333333)YrGE8 @@J*1@HS& @@IMjOQUݗ @@JkPH@;h ԕ5Tau @ffffff@J[A [@)ߗ$tS @@JX73@ [736Per @333333@J_o @GH˒:17Eri @@JSMqu" @@J@K|7 @@JVl!@APH @@J=Vl!EQ-w1 @333333@J}Vm@C 6Tau @@J33333@"H˒: @@JSZG ԕ+\u03ba Ret @@J,QOx\u03b5 Eri @ @J\("L/{7Tau @@J.2@8vC-\u03c8 Per @@KzH@HU\u03c4 5Eri @@J:S5.H @ffffff@J\(I0u! @333333@J[QPW>6z @@Jm\&c  @@K:S?As20Eri @@K Gz1w&10Tau @@KA [?ٵsg @ffffff@Ke@OZ @@K#u%D#)^ @333333@O@p:@U @333333@KOݗ+_p @@J?\(Sݘ21Eri @@K` [7 @@Km\@ML_ @@K64@B=p 12Tau @@K{@N@t#22Eri @@Km8ק&\u03b4 Per @@Kݛ=K@G40Per @@Kn.@@Q @333333@L@y=c@P13Tau @ffffff@KOv`@3F]c @333333@LA:S@O(\\u03bf Per @ffffff@L 0U2a|@@$ @@L (@B:G{\u03b4 For @@K䎊r?4m9\u03bd Per @ @L&.2@EJ\u03b4 Eri @ @K䎊r#A @@L\(@Q6 @ffffff@Kn$- 16Tau Celaeno @@L|@8JOv` @ffffff@L? k@FH˒:17Tau Electra @ @Ln.@8: @@KڹYB$ xG18Tau @ffffff@L%+a@8Ϫ͟19Tau Taygeta @333333@L&6z@8wkP24Eri @@LD*ߤ@\u03b3 Cam @ffffff@LxF]@QB20Tau Maia @ffffff@L:u%F @8^($ x25Eri @@L!R*D @333333@LPH41 @@LOv`@9SMj @@LG{BϤ? @@L&Bo @@Lzxl"@A-C\ @333333@M7Xe@L @ffffff@LBn. @@M43@HSF]c31Tau @ffffff@M6@#eO @@M%Vl!@1S30Eri @@M.2rs\u03b6 Per Atik @ffffff@MD64@?3 @@M=K@O=b @@Mm8@NoiDg @333333@M =p@G \u03b3 Hyi @ @Lg kRJ#943Per @@MxF]@IX$tT32Eri @@MITɅo9\u03c4 8Eri @ffffff@M6Q8 @ffffff@M4[W?A] @@MO M@Aa|Q @@M12WGra|Q32Tau @ffffff@M@6zd7 @@ML`dD-\u03b5 Per @ffffff@MMjO@DQ \u03be Per @@MC-@AB @ffffff@OAb}@T,?\u03b3 Eri Zaurak @333333@M\)+g8} @333333@M%2Gz @ffffff@M qu)%ڹ @333333@Nn@21n.\u03bb Tau @ 333333@N\(@(u%\u03c4 9Eri @ffffff@M=K82W @333333@N (@Q+Q @@NIQ@Mg @ffffff@N8@#ߤ?35Eri @@N1rGE˒:)z @@Nsh>}v\u03b4 Ret @@MحVN=K^ @333333@NS:)z5Xy=\u03bd Tau @333333@Neoi@D36Tau @@N:)z@8s40Tau @333333@NwK]d@ ( @@N~.2@ de37Tau @333333@N;5X@6e @333333@NF L0@}H\u03bb Per @@Nҩ @I,>39Tau @@N)_@6GE85\u03b3 Ret @@NOg8} @ffffff@NQ)\(\u03b9 Ret @@N)|Ne+41Tau @@Njf@;\u03c8 Tau @@ND*@=[648Per @@O+a@G33333 @@NA [;Ϫ͟50Per @@OQ@C[ @333333@NzH@1VFs\u03c9 1Tau @@O%Vl!@3$ @@O ۋq @*C] @@O_v_ح@@PH44Tau @@OZwkQ@:{s @333333@O)b}0b @@PxF]@Tm]37Eri @@OLn.s45Tau @@Oj,<@& @@OYrGE8!\u03bf 1EriBeid @@O{Y @@OsMjO4[)^ \u03b4 Hor @@OZ~D.H\u03bc Per @ffffff@Oܿ[W?@H4g8} @@P@TcA @@PJL@N֡a52Per @@Om8@D=,=46Tau @@O (@IQ47Tau @333333@OzG@"Fs @@P0U2a|@L($ x @ffffff@P ~$@JR<6 @@OZ@$1 @@P[W?@T4[W?39Eri @333333@O̥zxl"$F]c\u03bc Tau @@O [7@!p: @ffffff@P#%2@I%8YK\u03bf 2EriKeid @@O{wkP\u03b1 Hor @ffffff@O quE%1 @@PJߤ?@PH$tT\u03c9 2Tau @@P(\@4!-w2 @@P3q @IBZc 51Tau @ffffff@P&0U2a|@5Fs @@PQ9 @@PC)^@Iu? @333333@P\{@N^($ x\u03b1 Ret @ ffffff@O͗+jOB[@G?57Tau @@P?b}V@,s\u03b5 Ret @@P3MT58Tau @@PIB@.0)^ @@PJ!.I@oiDg @333333@PKiDg8^Q @333333@P4m8F"Q_ @333333@PW9[ @333333@PJfffff4a@O60Tau @@P`4֡b@,'&\u03c7 Tau @333333@PiN;5@9@N @@PfzG@4GE85\u03b8 Ret @333333@PQO4m\u03b4 1Tau @ @PnFs@1G{ @@Px =q@4qu!63Tau @ffffff@Pv6z@0Fs55Per @@P@A4m56Per @@P-@@sP\u03b4 2Tau @333333@P~($ @1qn.66Tau @ffffff@P}@"C]\u03be Eri @ffffff@PzG{ !.I @333333@PqoiD8g8} @@P9@3 >B\u03ba 1Tau @@Pe@6K=K^\u03ba 2Tau @@P6z@63 \u03b4 3Tau @@P =p@1+j @@P1@?p[6\u03c5 Tau @@P4֡b@6H43Eri @333333@PA)y71Tau @@P~($ @/Q@0Zc88Tau @@Q:z@$RT`d\u03bd Eri @333333@QE*0 R\u03c5 2Eri @ffffff@Q8>Vϫ\u03b1 Dor @ @Q䎊rK\(2Cam @333333@Q~$@Jqj3Cam @@Q~ᰊ@J3 @333333@QS&?s @@Qd64@4H˒:89Tau @@Qb@4@0YJ90Tau @@Qbp:@)ݗ51Eri @@QY'RTaQ @@QuOik~(\u03c3 1Tau @@Qrs@/rGE8\u03c3 2Tau @ffffff@Qtg8}@/4K @333333@Qq (@{m]53Eri @ffffff@QbG{,A @ffffff@Ql!-@H&IQ @@QnJL(?Ft93Tau @@Q@(eF L0 @@QuA [,rG @@QjOv@C#҈ @@QGz@

\N4Cam @333333@R*0U@L`C @@Q!R<2>B @@Q =p@D( ԕ+\u03bb Pic @333333@Q_FI=% @333333@QtSM@'iDg8~\u03bc Eri @@Q 'RTa @@QQ5Hu%F @@RńM:@TLhۋq @@RAce@OU @333333@Ru@@KMjO @@RiDg8@?oVϫ\u03ba Dor @@QŠ'RTaMcA 58Eri @@QB04֡a @333333@R\(@BIQ @ffffff@R2z@H^҈p; @@R Bs59Eri @@Rd80TSMj\u03bc Men @@Q '0Q$tS\u03b1 Cam @@R`@PoiDg\u03c0 3Ori @@Rp =@y=c\u03c0 2Ori @333333@R)@!!-w97Tau @ffffff@R5.H@2Fs60Eri @@R#Xe07kP @@RL[W?@EKPH2Aur @@RJ!R<@BY.H\u03c0 4Ori @ @R3O M@kQ @@RL- @;\(5Cam @@RpZ@K-w1\u03bf 1Ori @@RH#@,NU @333333@R7QAtJ\u03c9 Eri @333333@RNQ_Ϫ͞ @@Re@JoH˒:5Ori @333333@RVzG@\u03b9 Pic @ffffff@R.QJ'/\u03c0 5Ori @ @Rd@YJ7Cam @@R@JH6Ori @ffffff@Rloh@&)y\u03c0 1Ori @ffffff@RnYJ@$M5Xy> @333333@Rl[W?@,= @@RmoiD?Q @333333@R}jOv@.zG\u03b9 Aur @@R%2@@B @@RqϪ͞0+j\u03bf 2Ori @@Rs@+_o @@Rt\)0jD62Eri @@Rs{J#: @@Rs@1'RT`e99Tau @@RPH@7sP @@S wkQ@RH98Tau @333333@R@4@9 u"\u03c9 Aur @@RQ@BY}5Aur @@Re+@Cݘ\u03c0 6Ori @@R??m\\u03b2 Cam @@R2X@N8u%F @ffffff@RXy=0`4m9\u03b5 Aur @333333@R~$@Eae63Eri @333333@Rp =$A64Eri @@RG{)33333\u03b6 Aur Sadatoni @ @R秆&@D|\u03c8 Eri @333333@Rs @@RjOv?C,zx\u03b9 Tau @ffffff@RoiD@5 =p @@R,<4 IQ11Cam @@S"C\@M|zG @333333@R"h ԕֻ @@RwkQ:Ffffff\u03b7 Men @@Rr!.IR+j1Lep @@RrGE96˅Q @@RzG?zxl"h9Aur @@S*,<@Ī?11Ori @ffffff@S *0@.Mj\u03b7 Aur @@S(<쿱@DѷY @@S-@R| @ffffff@R6C8cF]c\u03b7 1Pic @333333@R\)Ha@N\u03b3 1Cae @@S@4A?\u03b5 Lep @@Sb}V6_hۋ @@SQ:' =p104Tau @@S733333@2Q66Eri @ffffff@S,/{J#Q106Tau @333333@S<@4ks103Tau @@SA\(@8Cg105Tau @333333@S>͞&@5g8}\u03b7 2Pic @@SxF]HY}14Ori @333333@S>u@ !-w1 @@S66z(/V\u03b2 Eri Cursa @@S=Xy=c @ffffff@Skqu!@G{)^ @@SEce!TzG16Ori @@SU:S@#68Eri @ffffff@SK k ҉\u03b6 Dor @@S(\L?15Ori @333333@S[33333@/12W\u03b2 Men @333333@RxF]Q!-w2\u03bb Eri @@SRYJ!&IR @@S㋬q @RQ( @ffffff@S{Xe@0 q @@T(4֡b@SW @@SuQ(\u03bc Aur @333333@SڹY@C>ѷY @333333@S|L_?$tS @ffffff@SvzG'W @@S9uO)^ \u03b9 Lep @@S?'K] @@S>B[:S&\u03c1 Ori @@Sd8@eO\u03bc Lep @ ffffff@SfB043\u03ba Lep @333333@S3).H14Aur @@S@4@@X ԕ+\u03b1 Aur Capella @S =p@F @@Sa@O@حV @@S>B[@A'Vϫ\u03b2 Ori Rigel ?@SIQ gE84\u03be Men @333333@R TOv_18Ori @@S*0@&t @ffffff@T_o @OS*0U2 @@SzHA[ @@S<쿱@EefA @@S{m:|Q16Aur @@SڹY@@ݗ+\u03bb Aur @@SC\@D @@S@@K]d\u03c4 Ori @ @Sٵsh`d8 @@SڸQ+ Ov` @@T䎊r@DS&109Tau @@Sm8@6U19Aur @@T<쿱@@S&\u03bf Col @333333@Sa@OAr0 \u03b8 Dor @333333@SQP21Ori @333333@S!.I@2W @@Sp =2!Gz\u03c1 Aur @@T@DFs16Cam @@T7iDg8@LŮ1 @@Tb}V@=R\u03bb Lep @@S2a|*Zxl"h \u03bd Lep @333333@S(R<6 @@SQ_;^p:~ @@T-jOv@Da@O @@T,zxl5=IQ @333333@T k@ qu! @ffffff@TzGڦL/{J22Ori @@T/{J#zG{\u03b6 Pic @@SeIMO 23Ori @@T-TɅo@ Zc @@TQ8ᰉ\u03c3 Aur @@TJs@B[W>6 @@TJC\@?$3 @@T44֡b Z111Tau @@TFm\@1b䎊 @@T;H˒:q 8Lep @@T8 qu+ڹY29Ori @ffffff@T?&;~$27Ori @@TG3YJ\u03b7 Ori @ ffffff@TG k,>B[\u03c8 1Ori @@TK䎊r?ڹY\u03b3 Ori Bellatrix ?@TRu@f\u03b2 Tau Elnath / El Nath ?@Tdd8@<Q @ffffff@TG:)z0ᰉ' @@T6fffffC]cf @@Tm k~@A2#9 @ffffff@TPm8$17Cam @@TQ@Ou%F @@Tr6C@>5fA\u03c6 Aur @@Tz_ح@A<115Tau @@Tr2X@1R<6114Tau @333333@Tz($ x@5حV\u03c8 2Ori @@Tmce@ @333333@T_䎊r3s116Tau @@T|(\@/$tS117Tau @@Tm8@1=(118Tau @@Tg8}@9& @333333@TqjOvDx@\u03b2 Lep Nihal @ffffff@TVϫ4h ԕ @@TJL :)y @@TFs@.y=c @@TwkQ?- 31Ori @@T/Vֿy ( @@T*0UBM:\u03bb Dor @ffffff@Te%F LMt32Ori @@T- @ڹY33Ori @@Tݗ+k@ Vl!-\u03c7 Aur @@T˧&@@- 119Tau @333333@TiDg8@2*0 @@T@1ߤ?10Lep @@T_o 4[\u03b4 Ori Mintaka @@TQο&\u03c5 Ori @ffffff@TG{43 @@Tp:GY}120Tau @ffffff@Tm8@2Q_ @333333@Txl"h \u03b5 Col @ffffff@Tb}VA<쿱35Ori @ffffff@Tz@,wkP\u03b1 Lep Arneb @@TˮzH1{m @@U ce@K61 @333333@T_Fb}V @333333@T'RTaFp:~38Ori @333333@TtSM@"wkQ @@Tuݗ+121Tau @333333@T9@8 Ov`\u03c6 1Ori @@TQ@"S& @@TͭBCAB\u03bb Ori Meissa @ @T6C@#Ov_خ\u03bb Ori Meissa @ffffff@TC\@#޸Q @@T-Aᰉ' @ffffff@T:)z@$zG{ @ffffff@T<쿱 k~( @@T4ms42Ori @@T0U2a|ZkP|\u03b8 1Ori @ffffff@TeO M;\u03b8 2Ori @@TuOv`\u03b9 Ori @@Tc  =p45Ori @@Tp:lVϪ @333333@UYJ@:_\u03b5 Ori Alnilam ?333333@UiDg8:~122Tau @@Uѷ@1 Q_\u03c6 2Ori @@Uz@"Ʌoi @@U+a@&R @@TQ@=p \u03b6 Tau @@UR<6@5$zG @@U M:B\(26Aur @@U*($ x@>~zG @ffffff@Ug =p@PlTɆ @333333@T%2P\( @333333@U K]c@*d7\u03b2 Dor @ @T.HO>}Vl @@U4@=7,125Tau @ffffff@U;@9=K\u03c3 Ori @ffffff@U+䎊r @@U*zGKq \u03c9 Ori @@U2Fs@|PH\u03bd 2Col @333333@U%2<|49Ori @333333@U.($ x6C126Tau @333333@UT#x@0U @333333@U+ kDZ\(\u03b6 Ori Alnitak @@UL"h ԕsh\u03b6 Ori Alnitak @@UL(\sh @@UM}H̿rGE9\u03b3 Men @ffffff@TuSԕ* @@UQ}H?՞%\u03b1 Col Phact @@U:_حA b} @@U=Gz@P'RT51Ori @@Ug k?_F @@TVϫRosPH12Lep @333333@Uc36_?26Cam @@UQ@Lt\u03bf Aur @@Ufffff@Hy @@UdAUzxl"h @@Uu\(2Q\u03b3 Lep @ @UiDg86r @@Ue@# ]cA @@UTɅo?򰉠'RT131Tau @@UQ@,u%F 130Tau @@U!.I@1>B133Tau @@Uqu!@+̥zxl"\u03c4 Aur @@U͞&@C.H\u03bc Col Runaway Star @ffffff@UrGE9@'8}H\u03b6 Lep @ @UF]c-*052Ori @@U qu@_p132Tau @333333@UD*@8Gz\u03ba Ori Saiph @@UQ#VC- @@UN;5` k @333333@UO MGLq 134Tau @@U?@)M\\u03c5 Aur @@U =q@B,\u03bd Aur @333333@U =p@CS& @@U~$@; @333333@U{@#ѷY\u03b4 Dor @333333@U_FPo135Tau @@U索3@,wkP @@U~$@u!S\u03b2 Pic @ffffff@UqjI˒:* @@Uټn/,kP\u03c0 Men @ffffff@UwkQT_o @@U@1- @333333@UC\6TɅ31Cam @@V/iDg8@M| @@V 2X@@p =\u03be Aur @@V-~($ @K{m55Ori @333333@UiBp:137Tau @@Vs@,WrG136Tau @@V:S@;#x\u03b4 Lep @ffffff@U%F L4@N56Ori @@V =p?zG @@V_o "2a|\u03b2 Col Wazn @@U\(AW'\u03b3 Pic @@UA [LVl! @@V//V@?wk\u03c7 1Ori @@V&u@4F}Vl @ffffff@U0U2a|J oiDg57Ori @@V/,@3Vϫ @ffffff@V>B[B@\u03bb Col @333333@V8YK@Fs\u03b1 Ori Betelgeuse ?@V2ߤ?@d8 @@V=%F L@4,\u03b5 Dor @ffffff@UJLPU= @ffffff@V+ k'<쿱 @333333@V8*0Uw1 @@VjOvLs @@VGxF]@#e @333333@VM2a|@' ͞&\u03b4 Aur @ @Vxm8@K$q @333333@VuϪ͞@HR<6 @@V.ѷYCS&139Tau @333333@V_Vϫ@92W\u03b7 Lep @ @VF{m,Uᰉ @@VC|6,\u03be Col @@V7rGE9Bv_ح\u03b2 Aur Menkalinan ?ffffff@VxtSM@FyGz\u03c0 Aur @@V~Fs@FVϫ\u03c3 Col @@VE ?aR @@V-ceJQQ \u03b8 Aur @@V{q @B33333 @@Vn0U2a|@)ѷY59Ori @@Vf@4?cA [36Aur @@V k@Gqu! @ffffff@V!'RTaOQ60Ori @@Vm:S?m\ @@V~$@Hz͞&\u03b3 Col @333333@VXAC,zx2Mon @@Vq%F L#b @@VQ@?e+ @@V+j @333333@Vj_o Fg8}\u03b7 Col @333333@VrYJEh[6\u03bc Ori @ffffff@V!R<@#KQ\u03ba Men @@UtSMS!-w13Mon @@Vp =%2:)y64Ori @ffffff@VH˒:@3)^ @@V_F@39Aur @333333@V@E}Xy=1Gem @ffffff@VR@7Cg l\u03c7 2Ori @ffffff@VQ@4#g l @ffffff@VQIm] @@V"h ԕ:Hp: @@VÚkP8YJ40Aur @333333@V[W>6@C=cA 63Ori @ffffff@VυQ@zG66Ori @ffffff@Vϒ:)z@h ԕ17Lep @@V0|n. @ffffff@VjOv@zG @333333@V33333$|PH37Cam @333333@Wa@O@MwK]d @333333@VQ_ƍ\u03b8 Lep @ffffff@Vz-ߤ? @@VʸQFe+\u03bd Ori @@V%F L@-^ @333333@V9A @@V#7PH @333333@Vw1=336Cam @333333@WM'RTa@Pm- @@V\(5*0U19Lep @333333@VXe3*qiC @@W =q@60 =q @333333@VPHA'Vϫ3Gem @@W/V@7: @@Wqu!@m\\u03b8 Col @@Vm8BeO @@Wqu!6mp =\u03c0 2Col @@VuEm] @@W%F L-+C,z5Gem @333333@W8IQ@8kA @@W?61. @@WE[W>6@@X (68Ori @@W@Xy=@3d7\u03b7 1Dor @@V@4Pqi @@VO5Xy69Ori @@W@e+@0!ohی\u03be Ori @@W? =p@,jD @@W):S;'y 40Cam @333333@Wz,<@M @@W"ߤ?D-B @@W=Ϫ͞3 @333333@W~($ @QTu!\u03b4 Pic @333333@W$?K{s @333333@Wg k@1 ԕ+1Lyn @@WwkQ@NY}\u03b7 Gem Propus @ @Wn_o @6X @333333@W^z c \u03ba Aur @333333@Wv (@={J#:71Ori @@Wm @3( ԕ+\u03bd Dor @@W Q5- @@WrC\@+a@O72Ori @333333@Wv2X@0$3 @333333@WiEoiDg\u03b3 Mon @333333@WmBJE73Ori @333333@W|@))y @ffffff@Wy%F LcA [ @@WwVϫDg8~2Lyn @@W-@Mae74Ori @@WXe@(]cA @@Wr=p 4E1 @@Wtd82z  @@W{rGE9+oo\u03b7 2Dor @@W4Pe75Ori @333333@W\(@#\( @@W (0($ x @@WK]c@f '\u03ba Col @333333@WZA.H4Lyn @@W\)@M? @ffffff@W,0D\u03b1 Men @@W# =pR2W @@WQBfffff45Aur @333333@WK]c@Jᰉ' @333333@Wp:BeO @@W&3& @333333@W}H"fA @ffffff@WQ@-M\ @333333@W/V4[7Mon @@WiDg8JڹY @@W%2!R< @@Wc A2)_\u03b6 CMa Furud @@Wѷ>4m9 @ffffff@W֕ᰊ'C] @@XC%2@QGE85\u03bc Gem @ffffff@W\(@6{J#9 @@WɭBAkP|\u03c8 1Aur @@X_ح@Hu" @ffffff@X&G{@L$zG5Lyn @@X- k~@M5fA\u03b2 CMa Mirzam ?ffffff@W333331O M\u03b4 Col @ffffff@WϪ͞@\u03b5 Mon @@WK]c@_Ft @@Xߤ?'{J#: @@X~$@W @ffffff@WfB9g @333333@X_FFs @ffffff@XD*BZ0 \u03bd Pic @ffffff@WG{L/\( @@W (J.H @333333@X*\(ÿ}H\u03b1 Car Canopus ffffff@W9JYrGE6Lyn @333333@Xl@M֡a48Aur @@XI*0@>~;5X @@X5p =@C @@X3zH?& @@X4(\ѫU=47Aur @@X`@GW\u03bd Gem @ffffff@XOiDg8@46R<610Mon @@X?\( ~($ x @333333@X&N#s @@X kH}Vl\u03c0 1Dor @@W0U2a|Q~!.I\u03b2 Mon @ffffff@XMu!R<6\u03b2 Mon @@XM2a|#9\u03b2 Mon @ffffff@XM2a|#9 @@XIs1wRT`e\u03bb CMa @@XB2X@J=p @@YzH@S/V @@XJs@/4m @@Xc$)B @333333@X1uMH @333333@X@N@@:3 @@X|e+@'\u03c0 2Dor @333333@X kQl- q @ffffff@Xv!R<(Ȍ @@XlXy=;e @@X}[W>6 P{12Mon @333333@XQ@lVϪ @@X]*0I13Mon @@Xs@U*0 @ffffff@X($ xyD\u03be 1CMa @333333@X}B7ks @333333@XsxF]A-w1 @@XWkPLm( @@X'RTa@,O{J#:8Lyn @@X =p@NO @ffffff@XuYJ @@Y@QC] @ffffff@Xfffff@g49Aur @@X9@<1 @@X1B-w1 @ffffff@Xte+I齥 @@Yca@O@S$ xG11Lyn @333333@XC\@Lm\( @@X?@C8$tT @333333@X{@#u%F @333333@X64?zG{ @@X2a|B\u03bc Pic @@X:)zM`'RT\u03be 2CMa @@X6Fs @ffffff@XjOv@[m] @@XjOv*051Aur @ffffff@Xp:@Cn\u03c8 3Aur @@XQ@CQ\u03b3 Gem Alhena ?ffffff@Xb}V@0f1.\u03bd 1CMa @@XzG2\) @@Xl!-Bc =p53Aur @@X!R<@<$\u03c8 2Aur @@XN;5@E>Fs @@XtSM*?\u03bd 2CMa @333333@Xc 3A|Q @333333@X kJ|u"\u03bd 3CMa @@X=p 2< @@XӮzHB~t @@Xܰ{@+{J#9 @@X{@)Xe, @333333@XtSM,JL/{\u03bd Pup @@X/{J#E_p15Mon @ffffff@Y&@#ʌL_\u03c8 4Aur @@Y1TɅo@FC  @@Xb}V>xeO @@Yp =?߲m\ @@X_o H2W26Gem @@Y&{m@12a| @ffffff@Y =p"U=K12Lyn @333333@Yca@O@M'RT\u03b5 Gem Mebsuta @333333@Y>fB@9!o13Lyn @333333@Ym2a|@LXy=30Gem @@Y?|@*t3 @@Y:Q_@u%F L28Gem @@YL"h ԕ@C, @ffffff@Yjfffff$6C-17Mon @@YuGz@  ҉11CMa @@Ym'RTa,u%F 18Mon @@Y}\(@L/{J# @@Yye!!-w143Cam @ffffff@Y@N@Q8>B[ @@Y@@MXy= @@Yuqu! @333333@Y^Q_J4zG\u03c8 7Aur @@Y<쿱@DJ @@YushBhۋ33Gem @333333@YGz@03g14Lyn @333333@Y[W>6@Mk~( @@Y_F,>B[ @333333@YiDg8.JOv` @@YnzGIn35Gem @ffffff@Yt@*Ӝߤ @ffffff@YtPHKQ @@ZAu@S>\(36Gem @@Y@5sP @@YN;5N;5X @ffffff@Y@7  @@Y1zxl"h\u03ba CMa @333333@Yw1@A_p\u03b8 Gem @ @Y̝IQ@@S& @@Y6C?7 @ffffff@Y\(GN}Vl @@Y-A/hۋ\u03b1 Pic @ @Y =pN˒:* @@Y+a@ ¶}Vm\u03c4 Pup @333333@Y!.IIN}Vl @@YBJϤ? @@YF]cBzxl"h\u03b6 Men @ffffff@Y#xT415Lyn @333333@Zg8}@M6zG38Gem @ffffff@YQ_@*[u% @ffffff@Yѷ3eO\u03c8 9Aur @333333@ZIQ@G#PH37Gem @@Y\)@9`'RT`15CMa @333333@Y?49e+a @@Y\(ÿK]d @333333@Zc @GZ=p \u03b8 CMa @@Y =p(a@O\u03bf 1CMa @ffffff@Yu8/ @ffffff@ZUn/@Qr16Lyn @@Ze@Fߤ@ @333333@Z"h ԕ@@.H17CMa @@Y#x4gkP @@ZG{@#B\u03c0 CMa @ffffff@Y-4"C,\u03bc CMa @@Z\(,R<6 @333333@YzG6$tT\u03b9 CMa @333333@Z0U2a|1 qv\u03b9 Vol @@Y33333Q ( @@Z k~8ohی @@ZD*H\M: @@\"h ԕ@UGz @@Z/33333@ N;541Gem @ffffff@ZD64@02W @@Z) 9iY}\u03b5 CMa Adhara / Adara ?@Z).H<e+ @@Z&2XAL/{J @@ZFQ_ U2a|\u03c9 Gem @ffffff@ZfwkQ@87, @@Zft@1ohی @@Zd =q@.L_ @333333@Zh4֡b@0_ @@Z_ =peO @ffffff@ZQ 97, @@ZxQ@=VR<6\u03c3 CMa @ 333333@Z[~$;H˒: @@Zt?@"FA19Mon @@ZnwkQD @ffffff@Zz!R<@%E84\u03b6 Gem Mekbuda @ @Zn/@4.H @@Z}\(@)0U2a| @ffffff@ZMn/IQ\u03bf 2CMa @@ZpeO7S& @ffffff@ZceK]cA\u03b3 CMa Muliphen @ffffff@Z|"h ԕ/D? @@ZXe@A>t @@Zq I҈47Gem @@Z($ x@:P{20Mon @@Z㧆&䎊q @333333@Z͠'RTaCA [ @@[=p @I1 @ffffff@Zqu!9;)^ 48Gem @333333@[ =p@8 D21Mon @@ZJLRT`d @@Z+a;}cA \u03b4 Mon @ffffff@Zߊ 18Lyn @@[>T@Mљ @333333@ZXe4s51Gem @@[s@0(U26CMa @@[@N9Gz @ffffff@Zd8HwRT`e @@[=\@GQ @@[R&4m52Gem @333333@[+,zxl@8\( @@[ڹYBE1 @333333@[64D? @ffffff@[({@(;J#9 @333333@[%TɅo@%1 @@["c 64K @@[$"h ԕ#Q\u03b3 1Vol @ffffff@Z@NQ\u03b3 2Vol @ @ZrGE9QC] @@[XPH@J (53Gem @@[?9@;\( @@[\)Ga4J @@\1+a@TT`d27CMa @ffffff@[$ qu:Z=p @333333@[:)zFo @333333@[:@4@Dg8~ @ffffff@[ =qFQᰉ'\u03c9 CMa @ffffff@[,PH:8YK @@[-'RTa; D @@[hoh@HQ @@[;~$%*D64Aur @@[`@DqrGE @333333@[5>r @@[Cݗ+k/+C] @@[/9DIQ @@[,<쿱Gl7 @@[*0U2a|H")_\u03bb Gem @ @[a}H@0Q_ @@[IϪ͞7P)^ @ffffff@[ITɅo;o @@[5J?+j @333333@[HzGC(ѷX @@[M2a|BK҈ @ffffff@[D"h ԕGc \u03c0 Pup @@[RJLBzG @@[d8@F2a|\u03b4 Gem Wasat @ @[-@5qu! @333333@[u-@쿱[W? @@[|{@:)y29CMa @@[jߤ?8\u03c4 CMa @@[kO M8Fs19Lyn @@[e@KJ @@[m (:!. @ffffff@[dB]C\ @@[w~$0eQ @333333@[aQEL/{J @ffffff@[j0U2a|B_ @@[h\)CC,65Aur @ffffff@[{@Ba[W>656Gem @ffffff@[&@4qo @@[Q,Q @@[4֡b?Ʈ}Vl @333333@[%F L92W\u03b4 Vol @333333@[MGzPB @333333@[@N@Io66Aur @ffffff@[C\@DV L/57Gem @@[kP@9 !-w @333333@[m\c  @@[A3Fs @333333@[Q_J S&59Gem @@[@;Z21Lyn @ffffff@[iDg8@H'/ @@[(\?섵?1CMi @333333@[υQ@'VC-\u03b9 Gem @ @[۠ k@;PH @333333@[a@O;Վ!R @333333@[oh@ᰉ' @333333@[ʱ2X03{J#9\u03b7 CMa Aludra @333333@[oiD=M+j\u03b5 CMi @@[_ح@"\ @ffffff@\. (@QcA @@[6C+ k @@[ݙ @333333@[ˮzH?61Gem @@[@4A @@[־ߤ?97 @@\ \(@H \u03b2 CMi Gomeisa @333333@[fffff@ ,<63Gem @@[ =p@5qR22Lyn @333333@\c @HzG\u03b7 CMi @@\qj@āoh\u03c1 Gem @ffffff@\@?p: @ffffff@[!R<1IQ\u03b3 CMi @333333@\wkQ@!>BZ @ffffff@[ =p7 L/ @@[H˒:An64Gem @@\p =@<;5X @@['!.H @@[qu!6L_65Gem @@\PH@;ꅇݘ @ffffff@[IW' @@[='@6CMi @@\[W?@(n.3 @@\PH|Q @333333@\ڹY4SMj @@\e$E84 @@\N;5?t֡a @333333@\sh7? @@\oiDCg+j @@\<@1 L/\u03c3 Pup @ @\zHEFs\u03b4 1CMi @@\A ?ae @ffffff@\+U=>R<6 @@\A~($ !74 @333333@\%2JSW>6z68Gem @@\Yn/@/E84\u03b4 2CMi @@\SXe@ Rp:\u03b1 Gem Castor @ffffff@\i@?{J#9\u03b1 Gem Castor ?ffffff@\i@?g l @@\(<쿱K3  @@\#@K୫U @333333@\rQ_@> L/ @ffffff@\U2a|3i @333333@\Rᰊ8!.\u03b4 3CMi @333333@\d64@ - @@\\?- <쿱 @ffffff@\m8@G\u03c5 Gem @@\~ߤ?@:S& @@\`>B[6K5Xy @333333@\d\)7y=b @333333@\e*07yoiD @@\]B+MjO @@\_ح@HcS& @@\iN;5; ҉ @@\A [@ra|Q\u03b5 Men @@[!RB[HLD @@\0U2a|.Fs @@\à k3*0U2a @333333@\O MC'v_ح @@\zHC @@\[W?C!ae @@\Ϫ͞@*4K @@\ce@ b}V @@\>B[@,jL/{ @@]Q@I7 \u03b1 Mon @333333@\䎊r#)y\u03c3 Gem @@\PH@<351Cam @@]*2X@P]+a @@\64CDM:76Gem @333333@]@9TɅ\u03ba Gem @ @]&@8eᰉ @ffffff@\Z:Yᰉ'\u03b2 Gem Pollux ?񙙙@] k~@<}Vl1Pup @@\ =q @@],@3SF]c @ffffff@]S|G/K]d @333333@]SoGmcA \u03b6 CMi @ffffff@]{33333?E84֡ @@]QL4qj9Pup @ffffff@]|Xy=+a@26Lyn @@]b}V@GH\u03c6 Gem @@]䎊r@: xF @ffffff@]{o5,? @@]SoN$M: @@]f_حIA=b @@]?_ح10Pup @ffffff@] '0-[W>6 @@^,@Rz&I @@]/{J#AZGE85 @ @]xF]DI| @@]Zc P# @@^Lqj@S޳g @@]R<6Cnz @@]4֡bB.Fs85Gem @333333@]T@3GE85 @333333@]_F@!D @@]VϫK/hۋ @ffffff@]PHHz @@]>B[H 2a| @@]c AQ1Cnc @@] =p@/311Pup @@]ͼn/6Gz @@]g8}@07 @ffffff@]0U2a|Lt @@^oiD@MzG14CMi @@]}H@/{J# @@]ڱ2X>U1 @333333@]qu!E ԕ+ @@]F L/\u03c7 Car @ 333333@]tSMJ} @@]\)NCa@N @ffffff@]Ϫ͞FY}27Mon @@]a@O p12Pup @ffffff@]oiD7O{J#:\u03c9 1Cnc @333333@^fB@9dqj3Cnc @@^ IQ@1Ohۋ @@] =pH\( @ffffff@]iB2f1.5Cnc @@^L_@0tqj @ffffff@^zH@*0 @@]zGF*0U2 @ffffff@]܁ohN&҈p; @@]:)zC L/28Mon @ffffff@^q GzH @333333@^$<쿱@>B[ @333333@]w1NioiD\u03c7 Gem @@^8K]c@;P{ @ffffff@]_o NK  @@^-BM: @333333@^ N;5Ka@N @333333@^TɅoOȣ =q @333333@^1*0@;a@N @@^+䎊rDzH8Cnc @ffffff@^Q4J@*Q @ffffff@^kP0?r @333333@^ce@L9ᰉ'18Pup @@^wkQ+0 ) @@^\(HWkP @@^ Fr\u03b3 1Vel @@^|GC,zx\u03b3 2Vel ?333333@^#GPH\u03b6 1CncTegmine @ffffff@^b}V@18YK19Pup @@^Xy=)ڒS& @333333@^ =p @@^QG15Cnc @ffffff@^_ح@=}H @@_8@Rq @ffffff@^\)L D @@^/{J#NQ\u03b5 Vol @333333@^~G{Q'4m @@^n/C.H @@^fBE~\N< @333333@^DH; 20Pup @@^TɅo/ߤ @@^GRu%F 29Lyn @ffffff@_p =@M_p @@_Jߤ?@R @@^%2A)^ @@^ߒ:)zB)Gz @@^QAt @@^?D,qj @ffffff@^٦ (G~Fs @@_4IQ@O@C @@^*0I_p\u03b2 Cnc @ @_>BZc@"_Ft @333333@^_حF͞&30Lyn @333333@_FFs@L$tS @@_&_ح)CeO @ffffff@^<쿱Ou84֡\u03c7 Cnc @ffffff@_A '0@;7 @333333@_E@4o @@_$ =qAN;6\u03bb Cnc @@_Hqj@81 @@_(e+BTg8}31Lyn @@_m\@E*0U @@_|4֡b@J!-w2 @@_U (4Fs @@_% '0Pg@N @@_^\(1Ov_ @333333@_V!R<@Fs @@_UB>ѷY20Cnc @@_uϪ͞@2U '0 @@_nfffff,VϪ @@_mN;5:Y @@_S33333Lqj @333333@_hm8H>&I1Hya @ffffff@_TɅo@4n @333333@_nQJ\u03ba 1Vol @333333@_=uQ\)\u03ba 2Vol @ffffff@_@/{J#QVϪ @333333@_Q@P =p\u03c6 1Cnc @@_b}V@;7 @@_w1@N;5 @ffffff@_wkQ@As\u03b5 Car Avior ?@_h64M=b @ffffff@_2X7'RT`e @333333@_\(@NU @@_PH8 5Xy\u03b1 Cha @@_(m8S:]cf27Cnc @@_3@)O M; @@_,<-n.2Hya @@_@Nfffff @@_@NEb{m\u03bf UMa Muscida @ ffffff@_<쿱@N[g @@_,zxl)u @@_EU= @ffffff@_D*I2a|29Cnc @@_s@,kC]\u03b7 Vol @@_a+aRY\u03b8 Cha @333333@_JC\S_hۋ @@_|AFs @@_\(P&s\u03b2 Vol @ @_P7 @@_n/JW>6z2UMa @@`Z@PIGz\u03c5 1Cnc @@_"h ԕ@87 @@__o Fqj\u03b8 Cnc @333333@_oiD@2*0 @333333@_A [G @@_\(F\ @@`U=@Ce+ @ffffff@_ k@g8} @@_(\G*{m\u03b7 Cnc @333333@`͞@4pC @@_>BZc3 =p @@_ohQ-33Lyn @@` =p@B51 @333333@` 5Xy@]cf @333333@`6C6}Vl @ffffff@` =qJ)^ @@` qu"ClTɆ\u03c0 1UMa @ffffff@`9Mj@PATɅo @ffffff@_GzT:@4 @@`@zG{3Hya @@`\(8Y @ffffff@`2\)@Ja@N @@` =p:+j\u03c0 2UMa @ffffff@`A3@P>36Cnc @333333@`(?@#O͞ @@`|Hۋq @@`:Xy=@J[PH @@`2p:@@fT\u03b4 Hya @ffffff@`-A [@| @333333@`{I|(\ @333333@`IQM-w1 @@` (M\u03c3 Hya @@`6 (@ /V\u03b7 Pyx @@`.\):AGz34Lyn @333333@`H%1@F<64 @ffffff@`-(E~ @@`9)^6rGE86Hya @@`@2W(Z @@`*ohOmB\u03b6 Pyx @333333@`=͞=?\u03b2 Pyx @333333@`@ZAv_ح @@`BS&D!N;6 @@`;,zxlJH9Hya @333333@`M8Y/74 @ffffff@`?zHJ =p @@`D 'F˒:* @ffffff@`EGS'/ @ @`BXy=JvѷY @ffffff@`BQJY}\u03b3 Cnc Asellus Borealis @ffffff@`ZGE85@5w+j45Cnc @ffffff@`Y?@)\N; @@`IH˒G-  @@`H 'HvzG\u03b7 Hya @333333@`Y5Xy@ 0U2a| @@`OR<6F*1 @333333@`D4֡bMk~( @ffffff@`]b}V4֡a\u03b8 Vol @@`82XQ7\u03b4 Cnc Asellus Australis @333333@`ezxl"h@2'y  @@`R"h ԕH 49Cnc @ffffff@`f@$)ԕ* @@`R?J @333333@`SeںJFs\u03b1 Pyx @ @`\@\u03b9 Cnc @@`u @<\( @ffffff@`]_oHQ @@`c33333ESPH @@`pU2a|d%1 @@`fCBsP50Cnc @333333@`ww1@(8Q\u03b5 Hya @ ffffff@`v6C@!-w12Hya @333333@`shۋ+y=c\u03b4 Vel ?ffffff@`e'RTaKZ @@`zZc @333333@`p:)yGVl!\u03c1 Hya @333333@`w1@Y>BZ @@`tzGF֡a @@`zݘGg @@`u͞Lbݘ14Hya @333333@`䎊q xF]\u03b7 Cha @@`Ju%FS (5UMa @@`@N)^ 35Lyn @ffffff@` @Eoi @@`q @F @@`U=@EQ @@`ѷ@cg @333333@`K]c=v @@`9D) k~\u03b3 Pyx @@`@4n;\(\u03c3 1Cnc @ffffff@`IQ@@< @@`[6Fo\u03c1 1Cnc @@`?@SMj @333333@`fffffC\ @@`G{L_p @333333@` =qP&I @@`%F LH-C\\u03c1 2Cnc @@`JE@;p = @@`o\(SH @@`ƪd8@Fe+ @333333@`4K@DN;6\u03b6 Hya @@`%F L@K]c60Cnc @@`jOv@'@-  @333333@`7G© @@`&2=cA \u03c3 2Cnc @@`Njq @@t?\u03b4 Pyx @333333@`2W;$t @@`~($ xN-Vl!\u03bf 1Cnc @@`#@.F L0 @@`ČL_0=K\u03bf 2Cnc @ffffff@`̱2X@/)B\u03b9 UMa Dnoces / Talitha @@`٧&@HVl! @@`R<6K{A @ffffff@`_حNRݘ\u03b1 Cnc Acubens @@`e@'1 @ffffff@`•ᰊJ\쿱[\u03c3 3Cnc @@`Xy=@@5O \u03c1 UMa @@`[6@PM: @333333@`Q0!.H @333333@`Q@D2W @@`M\ @333333@`p =HIae66Cnc @333333@`6z@@ Q @ffffff@` kG L/ @@`QD˒:* @@a (@K$VϪ\u03ba UMa @ @`$tT@Gߤ@\u03bd Cnc @@`>BZ@8sg @ffffff@`n/1. @ffffff@`6zMg @333333@`rGE9@1A [ @@`?DT @@a 6z@HC҈ @@`N{a@N @@`sJ6\u03c3 1UMa @ffffff@a#%F L@P%2 @333333@`!.HQ+o @@a=p @C9ᰉ'\u03c9 Hya @@a@^iB @ @a=K^G?\u03b1 Vol @@` PY|\u03c3 2UMa @333333@a3*0@PȞ쿱[15UMa @@a& k@IfA\u03c4 Cnc @@a F]d@=y \u03ba Cnc @@arGE9@%V4K\u03c4 UMa @ffffff@a7Xe,@O @@a&*0@@C75Cnc @@a&NU@:@N\u03be Cnc @ffffff@a*ѷ@6 q \u03ba Pyx @@a c 9۹~($19Hya @ffffff@a%'RTa!-8Y\u03bb Vel Suhail @@arGE9E\( @@a)eO(1 @@a(S&2T!-w2 @@a5(@>20Hya @@a,!Z @@a qu"Q}Vl @@a ,zxlR&Fs\u03b5 Pyx @@a/Q>]M: @@a_@R<16UMa @ffffff@aRߤ?@N.236Lyn @333333@aNl!-@E҈ @@a?a@3o @@a8ᰊFo, @@aBZ@AQ_p\u03b8 Hya @ffffff@aRC,@{J#9\u03c0 2Cnc @333333@aY =p@-.H @@aLu%FGW>6z @333333@aQ*0F @@aGjOvM '0 @@aSDg8~EQ @@al(\@Ghu%F @333333@aW'RTaBQ\u03b6 Oct @@`{J#9Ujp:~ @@aRfffffKC23Hya @@aeoi @@a\䎊qCH\)24Hya @@ae!}IQ @ffffff@a^F]dB\u03b2 Car Miaplacidus ?@aIQm,= @@asw1@A @333333@ah$tT-%138Lyn @ffffff@av7@BfQ @ffffff@acF"n @333333@ag'RTaCa@N @333333@aa'RTaLL_ @@a8Y@LYb}\u03b9 Car Aspidiske @@ahQM=K^ @@ap?Iqi @@a|l!-/6z\u03b1 Lyn @@ap:~@A2=p 26Hya @@a~/{J#'33333 @333333@au'RTaI27Hya @333333@aݗ+k#N; @333333@ajK]cQ,!-w2\u03b8 Pyx @@as91 @@akb}VR=b @333333@ak&RS& @@aɅoiE\) @333333@a O35Xy @@a33333GzG\u03ba Leo @@a=K^@:.T @ffffff@ad8KR\u03bb Pyx @ffffff@an.\u03b1 Hya Alphard ?ffffff@a2X!Q4J @ffffff@atSM6X ԕ+ @333333@a=p Hp: @@b2X@TTZ @@auNn. @ffffff@aiBJ'RT\u03c9 Leo @@aê͞@"K]3Leo @@ae@ `hۋq23UMa @ @a:)y@OVϫ\u03c4 1Hya @ffffff@a/V& ' @ffffff@aɮzH4?7LMi @333333@a\(@@g\u03b5 Ant @@a+jAy 22UMa @@a%F L@R (8LMi @333333@aQ@A2a| @@aDg8~:Fs24UMa @@aQ@Qu#w @333333@a/'&\u03bb Leo Alterf @333333@a\(@6fA\u03b8 UMa @@aڹY@I֮}Vl @@aC\O"D @@aڹYQqi6Leo @@a߮zH@#n}Vl\u03be Leo @@aߏo@&rGE8 @@azGPC @@aб2XI3\u03c8 Vel @ @aՙD;Z\u03c4 2Hya @@aQ\(\u03b6 2Ant @@aK]c?4֡a @333333@ac AۅQ @333333@aQM.L/{J\u03b9 Cha @333333@a6zT2\N< @@aQ3fz26UMa @@a0 @JFs10LMi @@a@B2G{ @@ap =+ @@a8YLg8} @333333@a⒣S&DS  @@a͞5v @333333@aoh@Cϊ  @@a~$6(33Hya @@a[6\)11LMi @@aGz@Ar @ffffff@aH =q @@a,zxlIU @@br@?)e+a @@asPRE+a @@b@Pk~( @@aMjM\8Leo @ffffff@bXy=@0p*0U10Leo @@b [W>@W42Lyn @@b䎊q@D}Vl @@b9K$ @ffffff@b RT`e@]cf @ffffff@bn.@@ @@b 8YB C,zx @333333@bIQHzxl"h @ffffff@b1rGE9@QO3333327UMa @ffffff@b7'RTa@R(\ @@b ?JՔO @@b2WEu!\u03b9 Hya @333333@bڹYH\u03ba Hya @@b"tSM,Ov` @333333@b,2X@?G143Lyn @ffffff@b0 ԕ+@C$tT\u03bf Leo @ @b)33333@#p: @@bN.H @@b*C\7y \u03b6 Cha @ffffff@a*0TBZc @@bouFcA 22Leo @333333@b)^@8e2a|\u03bd Cha @@bRߤ?S1U=\u03c5 1Hya @ffffff@b{a@- @@buGwkP\u03bc Leo @ffffff@bu@:2W\u03b3 Sex @@b ( 5\( @ffffff@bz =qGѷX @@b}p =GFOv_ @@byuMIQ @@bwm\O_eں @@br@L_31UMa @@bn/@H\) @333333@b =p@R8H @333333@b?9Q @@b|@LڹZ @@b\)3h ԕ @@b2XI͞& @@bXy=FVϪ @333333@bw1@!ݿH˒ @@bsPI8}H19LMi @ffffff@bzxl"h@D, @333333@b@O \u03bd Leo @@b@(㯷 @@b䎊q@LgVϫ\u03c6 Vel @ @bfBKHU @@bZ@=2a|\u03b7 Ant @@b kA\u03c0 Leo @@b3@ af20LMi @333333@b@?q @ffffff@bք?@5m\ @@bsP@J#9 @@bN5? @333333@bc 2  @@b8I\u03c5 2Hya @ffffff@b$tT*! [721LMi @@bp =@ART`e\u03b7 Leo @ @bd8@0F]c @@bG\( @ffffff@bDg8~1$Fs31Leo @333333@b=K^@#Q\u03b1 Sex @@b\u03b1 Leo Regulus ?@c k@'4֡a\u03bc 1Cha @@ba@T17Sex @@c$tT @333333@cI @333333@cɅoi) @333333@c3@Bqu!\u03bb Hya @ @c '(Y| @@czHPt- q18Sex @ffffff@cp = +jg @ffffff@c CNL/{J @@c M;DۅQ @333333@c 4KQ+/V19Sex @@c&p:~@usg @@c3M @@c.Ov_D,C,zx @@c+ =pI? @@c+n/I@ @ffffff@c5eEkP23LMi @333333@cAR@=O{J#: @ffffff@c,zGP҈32UMa @333333@cPC\@PFc 35Leo @@cDNU@7)^\u03b6 Leo Adhafera @ 333333@cEQ@7j͞& @333333@cER<6@9_\u03bb UMa Tania Borealis @ 333333@cH?@Eu '037Leo @@cEm\@+tZ @ffffff@c<2WEfffff\u03c9 Car @ ffffff@c-eQp:~39Leo @333333@cIs@7)^ \u03b5 Sex @@cM =p #F]c @@chtSM@Q/ =p @333333@cQ<( @ 333333@cHd8Nݘ40Leo @@c]ᰉ'@3xYJ @@cS\(DՊڹZ\u03b3 1LeoAlgieba @@c_8Y@3y \u03b3 2Leo @ffffff@c_|@31 @333333@cULzG @@ceO@U$ xG @@c\fBKa@O @ffffff@cX =qP+J#9 @ffffff@cb:)yGb} @@cqeں@D\\u03bc UMa Tania Australis / Alula Borealis@@cr- @DVϫ @@c M;@Pd? @@cgN;5LM:27LMi @@cx֡a@@<쿱 @333333@crIQD3333328LMi @@c%F L@@s25Sex @@c{eOKs @@cIQ@T6 @333333@c{>BZCGz44Leo @ffffff@c@!2W @@cwH˒Psh30LMi @@cQ @@,= @@c>BZ=!.H\u03bc Hya @ffffff@cQ0Ov_ @@cRMIy \u03b2 LMi @@c)^@BZݘ @@c(R_o \u03b1 Ant @@c6z?[W>6 @@cp:KpQ @ffffff@cA [Ly 36UMa @333333@c@KM:32LMi @@cڹY@Cvp:~ @ffffff@cFtM^T\u03b4 Sex @@ca@ᰉ' @@cݗ+k=ᰉ'\u03b4 Ant @@cQ>qu!\u03b2 Sex @@cU2a|a|Q @@cP S& @@crGE9+-5Xy>33LMi @@cڹY@@0-  @333333@cػ@Rn.46Leo @@c @,F? @@cQ@D6z\u03c1 Leo @ffffff@c~($ x@"K] @333333@cfBJۘA @@c͞F'RT34LMi @@c!-w2@A~qi @@c}VlQMj @@czGFO8}H @ ffffff@c/{J#N׷r37UMa @ffffff@cJE@L0 @@cC\RN0U2a| @@cǖR<6Gl"h 44Hya @@cOv_7t48Leo @@cfffff@|49Leo @ffffff@cK]c@!L!-w @333333@cٸC ԕ+ @@cQ(uᰉ @@cܵ 'Leں @333333@ca@;i @333333@cl!-**0 @@c 'MH @@c7@JՊڹZ37LMi @@c\(@?ᰉ' @ffffff@ciBH38LMi @333333@c@BzG @@c M]?\u03c6 3Hya @@cd80oiDg8 @@cU2a|LѷX\u03b3 Cha @ffffff@cۿH˒S1 @@dp:~@Q_F @ffffff@cF]dMo38UMa @ffffff@dq @Pmb @@cRMh-  @@ctSMK84֡ @@dL_@QD҈p @@dPFp:~39UMa @333333@d8Y@Lb}40LMi @@d=p @:SZ @ffffff@dc @Ge+41LMi @@dU=@704m935Sex @@dɅoi@H˒ @ffffff@d\(@[U= @333333@dݗ+kPb @333333@djOvMU=\u03b8 Car @@d&P=b @@dGE85NH'RT42LMi @@d.C@>T @@dZPC] @333333@d C,OS& @@dsPS!R<51Leo @@d3Dg8~@22W52Leo @@d3_o@,c @@d64֡b1K$\u03bc Vel @@d6(\H\( @333333@d22WP \) @@d3+jP>B[ @@d7͞L`C @333333@d6ZP# @@dEjOvW& @333333@dAe?4m953Leo @333333@dJ (@%1\u03b4 1Cha @@d*T\u03bd Hya @@dL$tT01o @333333@dMcA #3\u03b4 2Cha @@d.=p T"Fs43UMa @ffffff@dYzxl"h@LJݘ42UMa @@d[(@M\)41Sex @@dRiB!ˬq @ffffff@dOAo @@dK6zMk~( @@dXQp = @@dl@QvL/{44UMa @ffffff@dl0 @KJG{46LMi @ffffff@dj~($ x@AQ\u03c9 UMa @@doa@@EQ @@dd!-w2Lt @@dk4#Mj @@dma@u%F @ffffff@dr_ح+%1 @@dw\(@Aq @ @dksMm84֡46UMa @@d}R@@e+54Leo @@d|fB@8Vϫ @@dmQe+55Leo @@d}&?甯O M @@dssNN;656Leo @333333@d2W@H˒ @@dzK]cNB)y\u03b9 Ant @ffffff@dH˒Bn. @@d M;IaR47UMa @@dn/@D7 @@d+j@FW>6z @@dQ@\N< @333333@dOv_0Z0 \u03b1 Crt Alkes @@d2W2L?49UMa @@dQ@C)^ @333333@dq ,*L/{58Leo @333333@dzG@ =q @333333@dRERT`e @333333@d=K^E59Leo @@drGE9@gfA\u03b2 UMa Merak @ffffff@d@L0\)61Leo @@d- d860Leo @@d =q@4.ѷY\u03b1 UMa Dubhe ?333333@da@@N6 @@d#&qu!62Leo @@dG{J6C-\u03c7 Leo @ffffff@d"h ԕ@X*0 @ffffff@d(\G @@d9Ahۋ\u03c7 1Hya @@dʧ;K)^ \u03c7 2Hya @@dϮzH;IB65Leo @@d9?J#9 @ffffff@dQO6L/{J @ffffff@d6CEQ @@d֧Q2W67Leo @ffffff@dL_@8YJ @@dL_@B'kP @@dQ<3\u03c8 UMa @@dN;5@F? @333333@d!.H@E\( @333333@dQM| @ffffff@dp:N=b @333333@dQ@/ =p\u03b2 Crt @@dDg8~6g l @333333@eiBHD @ffffff@eN( =q @333333@e +jF/? @@eP ]cf69Leo @@ezG\u03b4 Leo Zosma @@eѷ@4 L/ @@e=p @ Ft\u03b8 Leo Chertan / Chort @ ffffff@eR@.Q @@e =K^JXy= @@e uMH˒:72Leo @ffffff@e'RTa@7y=c73Leo @333333@eC@*p = @333333@e%R<6@H>\u03c6 Leo @@e%JE 6}Vl75Leo @ffffff@e*Q@sh\u03be UMa Alula Australis @333333@e1sg@?y \u03be UMa Alula Australis @@e1w1@?y \u03bd UMa @ 333333@e3a@@@ߤ@55UMa @@e9 M;@C76Leo @@e7U=?hۋq \u03b4 Crt @ @e:-T @@e:2WP%Gz\u03c3 Leo @@eI*0@u\u03c0 Cen @ffffff@eH (K>]cf56UMa @@eVIQ@EcA \u03bb Crt @@eZC,2ǮzH @@eY[W>B[ @@eYLca@O\u03b9 Leo @333333@e_eں@%Mj79Leo @333333@e`NU?YJ @ffffff@eZfBP=Q\u03b5 Crt @333333@edG{%F]d @333333@egQ@&PH\u03b3 Crt @@eg M;1 @@eazxl"hRm8 @@eou@Ku"81Leo @@elڹY@0t֡a @@ekRB*0U @333333@eliBB߷r @ffffff@em\(O? @333333@et 'N&I\u03ba Crt @@eyDg8~(af @333333@evNUJzG\u03c4 Leo @@e~$@JE @333333@eIQ@NU=57UMa @333333@e\(@C  @@e}VlEVL/{J85Leo @@eR<6@.Ӝߤ @@e%F L8v,<58UMa @@e%1@E.287Leo @@eݘ_o86Leo @@eݗ+k@2he+\u03bb Dra Giausar @ffffff@e9@QU0 ) @@e?@N\(\u03bf 1Cen @ffffff@e%1Mu%F\u03bf 2Cen @ffffff@eohMn @333333@e%1=Cg l @ffffff@e,<=BsP @@eU2a|O\( @ffffff@eiBD7 @@ePO @@e6z?R<6\u03be Hya @ @eF]d?ۘA @333333@e kDK 89Leo @@e4֡b@zG{90Leo @@e͞@0n. @ffffff@e@Kd? @@e@jkP| @ffffff@eK!N;62Dra @@e_ح@QTTɆ @@e Hb} @@e\(GzH @333333@ec @;+j @@ejOvG#9\u03bb Cen @@e=p Oݘ\u03b8 Crt @@esg#Y @@eĪd8@\)\u03c5 Leo @333333@eǖR<6]ce @333333@e kN}Vl @ffffff@ezGNC,zx @@e̅ݘGߤ?59UMa @@eҾߤ?@E*0U\u03c0 Cha @ffffff@ezGRce\u03c9 Vir @333333@eӮzH@ D? @@etSMPm] @ffffff@e kNy \u03b9 Crt @@eXe,*g_o @ffffff@eRPYu!S\u03bf Hya @@eᴢ3A_RT`e92Leo @@eGE85@5ZQ_61UMa @333333@efffff@AN;6 @@ezHJs @@e%F LO Q62UMa @@e쒣S&@?hۋ @@e =qEC,zx @@eݗ+k@?+j3Dra @333333@e@PzH @@e'RTaB[6 @@e(\O>T\u03b6 Crt @@fu2Y_o\u03be Vir @333333@f GE85@ ?\u03bd Vir @@fG{@u\u03c7 UMa @ @ffffff@Ga@O @@f QFQ\u03bb Mus @ @f ڹYPaf @@fjOv@Kl"h @ffffff@fuN҈p; @@f%1D@*0U @@fL_L#w93Leo @@fᰉ'@48 ԕ+4Vir @333333@fQ @ }b\u03bc Mus @@f!>BZP$ xG @333333@f%(@, @ffffff@f&F]d:Vϫ\u03b2 Leo Denebola @@f(zG@-$*0 @@f-o@AwAs @333333@f-{J#9O @@f/q Qs\u03b2 Vir Zavijava @ @f5o?<64 @@f3'RTaOS  @ffffff@f8K]cUL_ @@f9(F8YJ @333333@f=q >\( @@f>ZPM0 ) @@fAXe,L~p:~\u03b2 Hya @@fGGz@<쿱\u03b3 UMa Phad / Phecda @333333@fN =q@JC @333333@fU͞9&I6Vir @@fXiB@ F]c @@fWrGE9Om]95Leo @@f]eں@/KC,z @@f]Xe, ( @@f$g8}\u03c0 Vir @ffffff@fPH@tD @@fZ3U @@fDg8~@B\67UMa @@ffB@E8YK @333333@fFtQLM:\u03b8 1Cru @333333@f2WO ԕ+ @ffffff@fGzE7ݗ+2Com @333333@f6C@5u!R\u03b8 2Cru @@f\(O2a| @333333@f(Qu\u03ba Cha @@f2WS!:S @@fuN|ߤ@\u03bf Vir @ffffff@f͞@!wXe, @333333@fF]d@S9-\u03b7 Cru @ffffff@f M;P'E84 @ffffff@f =qR{J#9 @@f2XITTɆ @333333@f+jHXU\u03b4 Cen @@fѷI\zG\u03b1 Crv Alchiba @@fN;580 @@f,zxlF) @@fDg8~D%10Vir @@f́?]ce11Vir @@ftSM@:C\\u03b5 Crv @@f$tT6T3Crv @@f؅ݘ7=p \u03c1 Cen @333333@f6zJ/.H4Com @ffffff@fZ@9t5Com @@f=K^@4Y @@f4֡bOy| @ffffff@fR<6@SgsPH @@f_oCv12Vir @333333@fsg@$? @333333@fXy=FܨTɆ @333333@fs4}H\u03b4 Cru @ffffff@f(M_ @@f!.H@Q\u03b4 UMa Megrez @ ffffff@fjOv@L(\\u03b3 Crv Gienah @@ftSM1Y6Com @ffffff@g@-<쿱2CVn @ffffff@g@DT?7Com @@g@7.H @@gF]d@@\u03b5 Mus @ffffff@g L_P}H @333333@g @Ju! @@g 4K@6z3CVn @@g~($ x@H}C\ @@g!m\6,!-w @@g"- @:$t16Vir @@g"@ \u03b6 Crv @@g$~($ x67>6z11Com @@g%n/@1D @ffffff@g'm\+!R<6\u03b5 Cru @ @g*G{N3W>6z70UMa @@g&?@LFs @@g/͞L/+j\u03b6 2Mus @ffffff@g0 kPfA\u03b6 1Mus @@g1R<6QzH @333333@g6S&L֊qi12Com @333333@g4 L/@9ؚu%F6Crv @ffffff@g:G{81 @333333@gBZ@:Z @@g[a@M~Fs\u03c3 Cen @333333@g`QIM:73UMa @@g\}Vl@K=K^ @@gchۋCL_17Com @@ggJE@9B18Com @@gkR<6@8҈ @333333@go/VLC)^ 20Com @ffffff@gm\(@4fA\u03b4 Crv Algorab @333333@gnC0\N @ffffff@grU2a|7Zc74UMa @333333@go?@M3A [\u03b3 Cru Gacrux ?@gyRT`eLIQ4Dra @@gp䎊q@QL҈p21Com @@gxzG@84J @@g}_oMBZc @333333@gU=R@Q @@gp =O@\u03b3 Mus @ffffff@gn/R?\u03b7 Crv @333333@g\(023 @@g+rG @@gS&)21Vir @@g=p "_o @@g/V@@zH\u03b2 CVn Chara @@g@D\(\u03b2 Crv @@g*07e!R\u03ba Dra @ffffff@gݗ+k@Qrs @@gn.FV.223Com @333333@g*0@6@N24Com @@g =p@2`| @333333@g@5n. @ffffff@g4KD͞&6Dra @@gݗ+k@QfA @333333@g(\C\(\u03b1 Mus @@gw1QHU25Vir @333333@gQSݗ+k @@gqu"@MR<625Com @ffffff@g8Y@1C-\u03c4 Cen @ffffff@g'RTaHEB @@g'RTa;#Mj @@gPH?>B[ @333333@gwkP>lL_\u03c7 Vir @ffffff@grGE9~$26Com @@g k@5 @ffffff@ghۋCfffff @333333@g)^GS&\u03b3 Cen Muhlifain @@g"h ԕHzsP @@g(\*zH @@gϋq MK]d\u03b3 Vir Porrima @ @gGz0 (\u03b3 Vir Porrima @ @gGz0 (\u03c1 Vir @333333@g@$x- 31Vir @@gϜu@: @333333@gֵ 'O4m @ffffff@gԸQHh*0U @@g:~ @@g4KFs33Vir @ffffff@ghۋ@#zG @333333@g"h ԕ@eO27Com @ffffff@g(@0 =p\u03b2 Cru Becrux / Mimosa ?333333@g\(M$ xG @333333@gݘ@OcA [ @ffffff@hQ;\) @@h #Q!-w17Dra @@gᰊ@PFs29Com @@h9@,>Q @333333@hA [@N(\)30Com @@h Q@;\\u03b9 Oct @@h7|UG%2 @@hJd @@h~$@Vϫ @333333@hm\@B)y @@h_حN*3 @@h C$tS31Com @@hR<6@;d7 @@h(ݘKyR @@h*fBN* @333333@h(CHx ( @@h+~$D1\u03ba Cru @@h.L_N0>BZc @333333@hG{@T&I @@h |@TkP|35Com @@h*_ح@5>Q\u03bb Cru @ffffff@h59M)_\u03bc 1Cru @@h4ߤ?L&I\u03bc 2Cru @ffffff@h4fBLڹZ\u03c8 Vir @@h2Z#g @333333@h75XyFqu!\u03b5 UMa Alioth ?333333@h0:)y@KsP @@h:ᰊEu84֡ @@hD2WR @333333@h?LkS& @333333@h7eO@G-w1\u03b4 Vir @ ffffff@h\)46Vir @@hdɅoi 䎊q9Dra @333333@h_Xe,@P8YJ38Com @@hiGz@1{J#:78UMa @@he =p@L.1\u03b5 Vir Vindemiatrix @ffffff@hqjOv@%C,z\u03be 1Cen @333333@h|l!-H{J#9 @@h~%14F L0 @@h:)yH;W>6z @@h}VlDW>6z\u03be 2Cen @@hGzHs14CVn @@h@ABZc @@h9M($ x @ffffff@h k@Fa|Q39Com @@hZ@5'>6z40Com @ffffff@h@6 @@hqu"JsP\u03b8 Mus @@h4֡bPSߤ41Com @333333@hm\@;Vϫ49Vir @ffffff@h,zxl%{u% @@hU2a|!F]d\u03c8 Hya @@hq 7;5X @@h&@$ ]cA50Vir @@h ԕ+$ @@h_ح@0=b\u03b8 Vir @333333@h'fA @@hG{Q|H\u03b1 Com @@h>BZ@1&\u03b1 Com @@h>BZ@1& @@h,zxlE8YK17CVn @@hl!-@C? @@h*0E8}H @ffffff@hQM? @333333@hK]cS쿱[ @@hƄ?Pݘ @333333@hl!-Bt53Vir @@hwkP02sP\u03b2 Com @@hPH@;)^ @333333@h!.HIY @@hc @'#x @333333@hќuMW  @@hrGE9M84֡\u03b7 Mus @333333@h#P=b55Vir @333333@hsg3H @333333@hտH˒Hzu%F @@hͼn/@DMj @ffffff@h,<@&ԕ*57Vir @@h =p3ohی @333333@hn/P&IR19CVn @@hC\@Dmzxl"h @ffffff@h?o @333333@hQE\59Vir @@h3@"0 ) @333333@hzG@+Y>BZ\u03c3 Vir @333333@hsP@ k20CVn @@hU2a|@DIGz61Vir @@h=b2Or\u03b3 Hya @@h_o7+$ @333333@h3@A qj21CVn @ffffff@h@HH˒: @@i =pJ_\u03b9 Cen @@i?B[)^ @@i[W>Gp4m23CVn @ffffff@ip:@DF]c @@i M;N~IQ @333333@i(\Jo @ffffff@i q @ᰊ64Vir @333333@iJE@iB @@i 4KP"JL\u03b9 1Mus @@i({RѷX63Vir @333333@i%11<쿱65Vir @333333@i?ᰊ @333333@i)QP'/ @ffffff@i.UQ(\66Vir @@i$l!-fA\u03b6 UMa Mizar @@ieں@Kvp:~\u03b6 UMa Mizar @333333@iQ@KuC\\u03b1 Vir Spica ?@i)q &RS& @@i(䎊q@7ڹY @@i1 =pC୫U @@i1QzG @ffffff@i7{J#9D80UMa Alcor @@i)5Xy@K~z68Vir @@i5\()jd7 @333333@i26C@GA69Vir @@i;'RTa/{m @@iK\(I(70Vir @@iCp =@+t @@i1@R @@iM37H ԕ+71Vir @ffffff@iIn/@%74\u03ba Oct @@ieںUrOv_خ @@iCu@MrGE @ffffff@iX\N74Vir @ffffff@i_oiDg @ffffff@idɅoi<[W>675Vir @@if䎊q.>BZ76Vir @@igH˒$TzG78Vir @@iq M;@ Em\ @@iueں*m8Y\u03b6 Vir @ ffffff@iuq )^81UMa @ffffff@ip k@K쿱[ @@iv_ح@B\(80Vir @@i|,<=K24CVn @@isn.@H @ffffff@i'RTaNؐ-  @@iFW' @@itSM:~Q @@i(G6҈p; @@i҈@8:25CVn @333333@izH@B%\( @333333@i= @@isgP$C\u03b5 Cen @ffffff@i*0Jm] @ffffff@izGDT @@iIQ@%~ѷY @@iw1@Qπ4m @333333@i%1Md7 @@i+jKGzH82UMa @@i (@JuoiDg1Boo @@ieں@332Boo @ffffff@iNU@6~쿱[W82Vir @@ifB!g#83UMa @ffffff@i>BZ@KWAs @@iU=DW>6z @@iU=E =q84Vir @333333@i~($ x@ N_o @@i@A~Fs @333333@i#@P4 =q83Vir @ffffff@irGE90- qv @333333@iC:1Cen @@i~$@% @ffffff@i=bIeں86Vir @@iρ(xl"h @ffffff@iׅQB >BZc @@iۮzHIVϫ @@iQI)_p @333333@i5Xy@DW>6z @@i҈p:@C@˒:*87Vir @@ib}V1(\3Boo @@i8Y@9a@O @@i=K^@S!-w2\u03c4 Boo @@i@1tJM @@irGE9@CEzxl"h84UMa @@i7@K7eں @@j(Taf\u03bd Cen @ 333333@i ԕ+D ԕ+\u03b7 UMa Alkaid / Benetnasch ?@iQ@H62Cen @ffffff@iMjA9|\u03bc Cen @@i4֡bE6z\u03b2 Cen Agena / Hadar ?333333@j^ᰊN/\u03c7 Cen @333333@jp_حDhۋ\u03c0 Hya @ @jr k:Q\u03b8 Cen Menkent @@juw1B/\(95Vir @@ju3"hۋq\u03b1 Dra Thuban @ @jcqu"@P qu @@jN;5J73 @@jp =@E\13Boo @@jNU@HS& @@j0MIQ\u03b7 Aps @@j =pT@˒:*12Boo @333333@j/V@9y  @@j/{J#J84֡50Hya @@j"h ԕ;BsP @@ju@Fs\u03ba Vir @ffffff@j,zxl$L_ @@jL~ @@jp ='/W @ffffff@jzHD33333 @@j%F LP%4UMi @333333@jɅoi@Sc =p14Boo @@j2X@)6z\u03ba 2Boo @@jݗ+k@I(15Boo @@j?@$3 @@j6z23g l @@jp:@Q[zH\u03b5 Aps @@jFtT74\u03b9 Vir Syrma @@jOv_IQ\u03b4 Oct @333333@kQ T<64\u03b1 Boo Arcturus @jJE@3.Q @@j\(@2rGE8 @@jѷND\u03b9 Boo @@jRT`e@Ihۋ\u03bb Boo @ffffff@j)^@G MjO @333333@j@.A\u03b9 Lup @ @j9Geں @@jqu"2RT`e @333333@ju9)^ @@j/VBu! @333333@ju%FL1b}\u03bb Vir @@jG{*ѷY @333333@jrGE9@A4J @@jJEE  @@j͞F+j18Boo @@j,<@*&IR\u03c5 Vir @ffffff@jU2a|䎊r\u03c8 Cen @@jtSMBQ 20Boo @333333@j@0N$t @@j4֡bM:͞& @@j- Ad#x @@jK]cCo @ffffff@k֡aQ ˒:*51Hya @@j?;$tT @ffffff@jFt@ ? @@kOv_@ |#x @333333@kzG8p:~ @333333@k{Pt @ffffff@k@GzH\u03c4 1Lup @@k*0FVϪ\u03c4 2Lup @333333@kp =F-  @333333@k'RTaG4J\u03b8 Boo @@k @I22Boo @333333@k&@3:Ov`52Hya @@k!b}V=} qv @333333@k:2WP,=\u03c6 Vir @333333@k!u&106Vir @@k%o6C @@k1%F LF-w1 @333333@k2ɅoiHu%F @@k.?YJ @@k9p =CoRT`e24Boo @@k% =p@H!-w2\u03c3 Lup @@kDC,I:{m @333333@kLQKK]d @333333@kK#JW =p\u03c1 Boo @ @k> =q@>_5UMi @@k2W@R26Boo @@kDU2a|@6B\(\u03b3 Boo Seginus @@k@- @C'v_ح @333333@k\2WD3\u03b7 Cen @ffffff@k\ (E2W @@kDOv_@KC, @@kbp:Geں\u03c3 Boo @@kUp =@=Q @@keeDPH @@kj}VlG#w @@kUGz@H$tS\u03c1 Lup @@ko*0HIQ\u03b1 1Cen @k|ɅoiNjC,\u03b1 2Cen ?@k|*0NjD @@kqݗ+k@2L]ce\u03b1 Cir @@k (P>kP| @@kq͞@E)y @ffffff@k/{J#BGz @333333@kr@K~33Boo @333333@kv2X@F3a@O\u03b1 Lup @ffffff@kp =G|\u03b1 Aps @ffffff@kG{S]cf @@kzHB唯O @@k&@+ \u03c0 1Boo @@k|@0ks\u03c0 2Boo @333333@kQ@0jD\u03b6 Boo @333333@k/V@+tZ\u03b6 Boo @@k/V@+tZ31Boo @333333@k,zxl@ RW32Boo @@k5Xy@'R:)y @333333@kNUOp64Lib @@k|8\( @@kA [A8YJ\u03bc Vir @ffffff@kzGe+ @@keA- 34Boo @333333@kb}V@:, @@kR@D:)_ @@kᰉ'Gu! @@k,B @333333@k@<v38Boo @@k~($ x@G]cf @333333@ku@7rGE811Lib @@k"h ԕd739Boo @ffffff@ḱ@H\<쿱 @333333@l M;S*kP| @@ks@B͞& @@k*0B҈p;\u03be Boo @@kqu"@3ᰉ'\u03c0 2Oct @ffffff@lF:)yTs @@kIQN @@l! SJBZc 12Lib @333333@k}Vl8g8} @333333@k)^@z\u03b8 Cir @ffffff@lݗ+kOcA [ @@kۅQ@M%\u03be 1Lib @333333@k M;'C] @333333@lNUJg?\u03c9 Oct @@lyqu"U2fffff @333333@k+j@ڹZ @ffffff@lC\G'RT\u03b2 UMi Kochab @@kդ?@RY}\u03be 2Lib @@l%1&2W @@l\(@,䎊qj @@l n/5jd716Lib @@l w1b}Vm\u03b2 Lup @@l@4nE#w @@l p:~p =q @@l Mj@0cg l\u03ba Cen @@lJEE Vl!59Hya @ffffff@l9;>BZc @ffffff@l)^@Hu!18Lib @333333@l%F L&Iԕ* @@l@Em\ @333333@l)n/Cv_ح\u03b4 Lib @@l'! B40Boo @ffffff@lC,@CY} @ffffff@l d8@P{zH @@l* =q =p 60Hya @333333@l0ڹY<{J#:\u03b7 Cir @ffffff@lFl!-P_o @@l.ݘ.H @@l7>BZ@RW' @ffffff@kҸQ@T7\u03c9 Boo @333333@l0ѷ@9s110Vir @@l733333@/V\u03b2 Boo Nekkar @ @l/ @D1.H\u03c3 Lib @ @l@\(9H*0\u03c0 Lup @@lH\)Gqi\u03c0 Lup @333333@lH\)Gqi @ffffff@lJL_Du%F @@l+u@N)y @@l8*0@AW'\u03c8 Boo @@lCMj@:\( @@l[sgHMjO44Boo @@l>Q@Ga@O @@lTp:~>=K^ @@lk#Pce\u03bd Lib @@lU0A2W @@lauDJ<64 @333333@le6zEo\u03bb Lup @@lfߤ?F5Xy47Boo @@lKp =@HW>6z45Boo @@lZiB@8ރ% @@lR:)y@KG8}H @@lp$tTCep = @@lz"h ԕKM:46Boo @ffffff@lc,zxl@:M[ @333333@ld@95Xy @@lrzG:U2a| @333333@lL_Q[\u03ba 1Lup @ffffff@l{J#9H^p:~\u03ba 2Lup @ffffff@lzHH_.H\u03b6 Lup @ 333333@lGE85J @333333@l0 F@*0U\u03b9 1Lib @@l8Y3ʬ>B @333333@lS&@2_o @333333@lqu":1o1Lup @@l k?JM @@lڹYNsm] @@l,zxlH b}\u03b4 Cir @@loNz\(\u03b5 Cir @333333@l/VO($ x @ffffff@lp:D]cf\u03b2 Cir @@luMfqi\u03b3 TrA @ffffff@lGzQ+{J#9 @@l*0@?D3Ser @333333@lQ@s\u03c7 Boo @@le@=*  @@l)^6f?4Ser @ffffff@lL_?䎊 @@lݘN? \u03b4 Boo @ 333333@l@@H\u03bc Lup @@lC\G\u03b2 Lib Zubeneschamali @@l ("%12Lup @333333@l>&Ov_ @@lQDd @333333@l~$݇ݗ+ @ffffff@lqu"@P0U2a| @@lDg8~@4S&5Ser @@loh?>6z\u03b4 Lup @ @l kDRG{\u03bd 1Lup @@lqu"G&I\u03bd 2Lup @ffffff@ll!-H(U @ffffff@lb}VNTL_\u03b3 Cir @@lFtMrGE\u03c6 1Lup @ @ltSMB!u!S @@lL~($ x\u03b5 Lup @ ffffff@lsgFX>BZc\u03bf CrB @@l!.H@=6Ser @333333@lC\?Z\u03c6 2Lup @@lA [Bm,= @333333@l+jQ11UMi @@lɅoi@Q) @ffffff@l2X@Ig 50Boo @333333@lzG@@w \u03c5 Lup @333333@l#CC, @@l\)(!.H\u03b5 Lib @@lR<6$e @ffffff@l2XC],= @@liBP"u%F @@lPH@CkP|\u03b7 CrB @@l٣n.@>IB\u03c1 Oct @@mz=p Uy \u03ba 1Aps @@muRXC @@l k@O L/\u03bc 1BooAlkalurops @333333@lR@BH\u03b3 UMi Pherkad @@la@@Q^ @@ll!-BbGE85 @@lQ@Om]\u03c4 1Ser @ffffff@lQ@./V @@lQ@A*~ @@m =K^G]cA \u03b6 1Lib @ffffff@m (0eں\u03b9 Dra Edasich @ @lp =@M{*0U210Ser @ffffff@m*0?y (\u03b2 CrB Nusakan @ @l- @=s\u03b6 3Lib @333333@mb}V0n. @@lڹY@NUcA @@m$䎊q3q \u03bd 1Boo @@mp =@DjS&\u03b6 4Lib @@m'\(0Q_ @333333@m06CDu!\u03b5 TrA @ffffff@mE\(PH11Ser @@m'r~$\u03bd 2Boo @@mC\@Ds 36Lib @ffffff@m4 k< n.\u03b3 Lup @@m9!.HD\37Lib @ffffff@m1m\$ k\u03b8 CrB @ffffff@m'p =@?[$ @ffffff@m3q "]b @@m?*0Fzg \u03ba 2Aps @ffffff@mbZR\ @@mAuF2͞& @@mm\@P Y| @@moGzS=b\u03b3 Lib @333333@m<6C-,<\u03b4 Ser @ffffff@m6iB@%33333\u03b4 Ser @ffffff@m6iB@%\u03b1 CrB Alphecca / Gemma @@m5@:Fs\u03c5 Lib @ @mH2W<"\(\u03c9 Lup @333333@mPl!-EH =q @@mV0 J/r\u03bc CrB @ffffff@m:@CGz16Ser @@mCs@$Q @@m_eOMC,zx\u03c4 5Ser @@mC>BZ@0p:~ @@mNiB7$Fs @333333@mR,<5!-w2 @@m:,<@JѷY\u03c4 Lib @ @mUA [=,41Lib @333333@mWDg8~3MIQ @@m?u@KP4m\u03c8 1Lup @ffffff@m^"h ԕA4#x\u03c6 Boo @@mNIQ@D-84֡42Lib @@mb@4n7ohی @ffffff@miFT쿱[\u03b8 UMi @@mRT`e@SV\N< @333333@mLC\@KA#w @@mR(\@GfOv_\u03b6 2CrB @@m[Ft@BQae @333333@mTS&@I6.2 @@muqu"Bfffff\u03ba Lib @@mo 3cA \u03c8 2Lup @@muw1AZD\u03b9 Ser @@mliB@3A\u03c7 Ser @333333@mnQ@)R @ffffff@mM6z@QR!R<\u03c4 7Ser @333333@moJE@2v&I @@mDe+\u03b7 Lib @@mᰊ/Xy=c\u03b3 CrB @ffffff@mus@:Kq \u03c8 Ser @333333@m=p @Q\u03b1 Ser Unukalhai @@m%1@|\u03c0 CrB @@m>BZ@@Bn @@mv7@J..2 @@m!.H@ɠ'RTa @ffffff@meAW\(25Ser @@mߤ?҈p;\u03b2 Ser @ @m@.F]d\u03bb Ser @@mq @i @@mCJ͞&\u03c5 Ser @@mNU@,;u% @333333@m͞Ht#x @@mfBK$tS @@m ~($ x @@m =q@K7\u03ba Ser @@mR@2$Fs @333333@mᰊ@<(}H\u03bc Ser @ @m\) qA [\u03c7 Lup @333333@m͞@H1Sco @ffffff@ma@9[6 @ffffff@mU=@OL#x @333333@m)^@K73\u03c9 Ser @@mU2a|@:)y\u03b4 CrB @ffffff@m7@:|Q\u03ba TrA @@msQ&0 \u03b5 Ser @ @mp:@Dg8~ @@mo@.Dg8}36Ser @ffffff@mzG~($ \u03b2 TrA @ffffff@m!.HO,\u03c1 Ser @@mOv_@4Q_ @@mNUN&I\u03ba CrB @333333@mQ@A(\\u03bb Lib @@mʮ}Vl4*͞&\u03b6 UMi @333333@mwkP@SrsP2Sco @@m䎊q9Sa@O @@mN=cA @333333@m,zxl8y=c @@mp =7d7\u03b8 Lib @ffffff@mΙ0 0Y3Sco @333333@mDg8~9>\N<\u03c7 Her @ffffff@mfA@E9N;647Lib @@m ԕ+3bs4Sco @ffffff@mF]d:D xF @@mH˒PBkP| @333333@m6C@KN;6 @@mԝIQ@4O\u03be 1Lup @ffffff@m!.H@m]\u03be 2Lup @ffffff@m9@jf\u03c1 Sco @ffffff@m=6Ϫ͟ @333333@m֡aBzH2Her @333333@m M;@E\u03b3 Ser @ffffff@m'RTa@/RW @333333@mb}V4q \u03bb CrB @@mXy=@B4J4Her @@mzG@EHu!\u03c6 Ser @@ms@,,<48Lib @333333@mQ, M; @@m =q8֡a @@m ԕ+DH˒:\u03c0 Sco @ffffff@m*0:<64\u03b5 CrB @ffffff@m '@:ව4m\u03b7 Lup @ 333333@n kC2͞&\u03b4 Sco Dschubba @ffffff@nd86'/W49Lib @@nIQ0YJ @@n/p =R ( @ffffff@m[W>@BRkP| @@m@9A50Lib @@nXy= ңS& @@mQ@K_+j\u03b9 1Nor @ffffff@n@4nL=K^\u03b7 Nor @ffffff@nHfA @333333@n*0@\(5Her @ffffff@n >BZ@1|Q @333333@n9CMQ\u03c1 CrB @@n[6@@]cf @@nߤ?9݄M:\u03b9 CrB @@n q @=ᰉ'\u03c0 Ser @333333@n\N<@6( @@n$䎊qBz\u03be Sco @@n"{&Ft\u03be Sco @@n"{&Ft\u03b4 Nor @@n3RF.2 @@n@Ju84֡\u03c5 Her @@nc @G @333333@nᰊ@BPۋq \u03b2 1ScoGraffias @@n+~$3;5X\u03b2 2Sco @@n+eO3IQ\u03b8 Dra @@nqu"@MH[6\u03b8 Lup @@n4Bf}Vl @@n0sP7=K^ @@n:/{J#B`4m\u03c9 1Sco @333333@n6tSM4P{\u03b9 2Nor @@nJzGLkP\u03c9 2Sco @333333@n;=b4\N< @333333@nA:Swk11Sco @@n<ڹY)}H˒ @333333@nEa@7{J#:45Ser @ffffff@n=hۋ@#Ȍ @@nO@?\u03ba Her @@n@0 @1 n.47Ser @@nCn/@! @@nGQ@ wkQ @@nI~$@\N @333333@nZ[6DRT`e @333333@nN 64 @ffffff@nXC\=j0 \u03c4 CrB @@nG8Y@B>҈p;\u03b6 Nor @333333@nkK84֡\u03b4 1Aps @ffffff@n?S#\u03b4 2Aps @@n Sg @333333@nj=p JC\\u03c6 Her @@nF(\@FwzH\u03ba Nor @@nka@KP4m @@n2- @P\u03bd Sco @@n_+j3uᰉ13Sco @@nbl!-;(12Sco @ffffff@nbOv_}H @@n (-Q19UMi @@nVu%F@R(\\u03bf Sco @@n*08+]cA @333333@nn/H=b\u03c3 Sco Al Niyat @ffffff@n9 @333333@nQE7 @@n ԕ+@M =q @@ntwkP@RYGz @@n~$@Hu" @@nXe,@Cڳg \u03c4 Her @ffffff@nR@G(6\u03c3 Ser @333333@nᰊ?wkP @@n,SMj\u03c8 Oph @@nZ4 @333333@nJE=g8}\u03bd 1CrB @@nڹY@@L/{J\u03bd 2CrB @333333@ne@@\u03b9 TrA @@nߣn.Pr21Her @333333@np =@ڹY\u03c1 Oph @@ṉ2X7r{m\u03c1 Oph @@n̮}Vl7r3 @ffffff@nML7\u03b5 Nor @@nzxl"hG =p\u03b7 UMi @@n ԕ+@RVϪ\u03c9 Her @@nU=@, \u03c7 Oph @@n/{J#2t֡a @@nY}BFs25Her @@n9@BkP| @@nᰊN_p @@n~($ x@QGhۋ @@n_o@K=p @@ncA dtSM\u03c5 Oph @ffffff@niB Ov_خ @ffffff@nC\@N-w1 @333333@n?G$tS\u03b7 Dra @@n@NN;6\u03b1 Sco Antares ?@nA [:n$t @@oS&Q=K^ @333333@np:?GzH @ffffff@n@4n-u%F 22Sco @@n&9p = @333333@nMjD-  @@n M;AZ)y30Her @@n!.H@Dۋq \u03c6 Oph @@nqu"0u"\u03b2 Her Kornephoros @@n\(@5}\\u03bb Oph Marfik @ffffff@nN;5? (\u03b8 TrA @@orGE9P_m] @@nzG@4z>B\u03c9 Oph @@o*05weں @@n@61.H\u03bc Nor @@od8FcA 28Her @ffffff@o7@=K29Her @333333@osP@&>BZ15Dra @@nݗ+k@Q1( @ffffff@nNU@F̕*1\u03b2 Aps @@oXIQSaQ @@o#hۋEmoiDg\u03c4 Sco @ffffff@o)^<7RT`e @ffffff@o#hۋA4m\u03c3 Her @@oZ@E7Vϫ @@om\@Niae12Oph @@o"ѷPH\u03b7 1TrA @@oKqu"QMj @@nͿH˒@S'R @333333@o3~$ES&\u03b6 Oph @@o)Dg8~%"h ԕ @@o82XB =p @@o!~$@GNIQ16Dra @@o!eO@Js=K^17Dra @@o!a@@JvR<6 @ffffff@oJ 'HaB @ffffff@oM\(Hjf @333333@oN4K@<6437Her @@oE)^ @ k @@oLᰊ1ѷY @@o0 (@L.H42Her @@o5#@Hv҈p; @@oO)^ 3zxl" @ffffff@ouU=PS&14Oph @@oM͞? @@oeN;5JQ\u03b6 Her @ffffff@oJK]c@?d739Her @@oL䎊q@:Y @@oezHDk{J#9 @@orZM@u!\u03b1 TrA Atria ?ffffff@oQ QAy @@ozu%FM+m]\u03b7 Her @ @oW,zxl@Cv L/ @@ov_حCH @@o^䎊q@A>18Dra @333333@oGXe,@P%sh @@okhۋ@/}+j43Her @ffffff@on@!*=p \u03b7 Ara @ @oHML_45Her @@o~/{J#@쿱[ @333333@oj_ح@LdL_\u03b5 Sco @@oN;5A%ڹZ @333333@oz =q@EFs20Oph @ffffff@od8%{ @@o~($ xDM: @@oIQ@*8YK\u03bc 1Sco @@o\)CzG47Her @@oᰊ@H˒ @@o4KLg8}\u03bc 2Sco @ @o}VlC=p 52Her @333333@oe@F?21Oph @@oQ ?u%F L @@o͞EIQ50Her @@o33333@=΃% @@o=p D8}H\u03b6 1Sco @@o+jE.\N< @333333@oR<6E=L_ @@oX@S` @333333@o\(4jd751Her @@o ԕ+@8 ԕ+\u03b6 2Sco @ @od8E.BZc @@oDW>6z @@oa@J$VϪ @@o܁ohQQ+a53Her @333333@oH˒@?wk23Oph @@o&I+j\u03b9 Oph @333333@o4K@$T3\u03b6 Ara @@o\)K&I @@o\(@4fA27Sco @@ozxl"h@4J @@offfffIR24Oph @@offfff7&fffff54Her @333333@o\)@2n쿱[W\u03b5 1Ara @@oܮ}VlJqj @ffffff@oZKLg8}\u03ba Oph @ @oXe,@" @333333@o߮zH9&26Oph @@oDg8~8<64 @@oCAݗ+\u03b5 2Ara @@o,zxlJR<619Dra @333333@o:)y@PH쿱[ @@oFt@a|Q30Oph @333333@ozG =p @@pzxl"L)^ \u03b5 UMi @@ooH˒@Ta|Q\u03b5 Her @333333@oQ@>( @ffffff@oH˒@6 @@o?C{J#959Her @@oڹY@@Ⱦ ( @@o~($ x@9ohی @333333@pJEAr @@o =p@,/ M; @@o=b@+5ᰉ @@p ZBQ @ffffff@p'RT`qiC60Her @@p{J#:@){J#9 @@p 4֡a@6!R @@p\N1$ @@p*0>gRT`e @333333@p%*0P̖\u03bc Dra @333333@pQ@K<2W\u03bc Dra @333333@pPH@K<2W @@pѷXFG\( @333333@p+jHo @@p33333% C] @333333@p!.H@Ar\u03b7 Oph Sabik @333333@p{J#:/s ҉\u03b7 Sco @ ffffff@p uE @ffffff@p!zGCe+ @@p8YJ@Dc{J#937Oph @333333@p!Q@%+q \u03b6 Dra @@p%1@Pm @@p-IQ@.2 @@p.d7CLJ36Oph @ffffff@p-fffff:Q_36Oph @@p-c :Y} @@p-Z-*D\u03b1 1HerRasalgethi @ 333333@p*+j@,fA\u03b1 2Her @333333@p*u@,ǮzH @@pBZ@C#x @333333@pR5q@N @@pO =p@!3 @@p[ohیFs @@p\a@IPU @ffffff@pGFt@J8YK73Her @@pPp =@68YK @@pRe+@0M[ @@p_ =pJ& L/\u03c1 Her @@pN}Vm@B)_\u03c1 Her @@pN@B 44Oph @ffffff@pYzG8,u" @@pbFsK45Oph @@p]k~(=( @@pZ&X@ @@pW- @0G{\u03c3 Oph @333333@pZ@͞\u03b4 Ara @ @pld7NW  @@p[F L0@4O M @@pmeOLu8YK @@p[zG@AYrGE @@pcPH?(\u03c5 Sco Lesath @@pk M;B?77Her @333333@pZ{@H!Gz\u03b1 Ara @333333@po]cAH$ xG @ffffff@pVD@N.2 @333333@piR<651Oph @333333@pm͞7z @333333@pt~($ xD8YJ @@pmk~(@˒:)z\u03bb Her @@pj!-w@:PH\u03bb Sco Shaula ?@pvohیBL_ @ffffff@pk[W>@?(YJ @@p>wkP@T)78Her @ffffff@poNU@6zD>BZc3Sgr @@p=p ;ԯO M @@p!-w@J @@psg-sߤ @@pG{J\N<\u03bc Her @ 333333@pfA@;y=c @@p]cAN '0 @@peO@1{m @333333@pm]? xF\u03b3 Oph @ @pS&@Xy= @ @pohیBڹZ\u03b9 2Sco @333333@pH˒D A\u03c8 1Dra @@pD@R ݗ\u03c8 1Dra @@pѷ@R L/ @ffffff@p@4)^ @@p/VDbG{87Her @ffffff@pGz@9o @@p>BZAfL/{J @333333@pPHA5Vl! @@p&@=R{m @@p:)y@6P$tT30Dra @@pIQ@Ics @ffffff@pōAr0 @@pǨTɆA`Q @@p\(?Gz @@p*0A;m] @@p{@gfA @333333@p(\F+5Xy90Her @ffffff@p4֡a@D k~ @333333@p)^<4m @333333@pDg8~/ @333333@p- qD۩*0U2 @333333@p:)y?sPH89Her @@pͮzH@: @@p.HSݗ+k @@pc @6vϪ͟\u03be Dra Grumium @ @p@Lor @@pIQ?$tS @@p۵ 'Bm? @ffffff@pXe,>@)^\u03b8 Her @ffffff@pF]d@B*0U\u03bd Oph @ ffffff@pqu"#L_4Sgr @@p,<7C35Dra @@p@S=%\u03be Her @ @p'/@=?o\u03b3 Dra Eltanin @@pm\@IFs @333333@prGE8I\u03bd Her @@pF]d@>0|\u03b6 Ser @ffffff@p n/66Oph @ffffff@p M;@yrGE893Her @ffffff@p:)y@04m967Oph @333333@pFs@t!-w2 @@p砐- 6fA\u03c7 Oct @@q [7Um\68Oph @@pF]d?@47Sgr @333333@ph ԕ8H>BZc\u03c8 2Dra @@p̿H˒@RQ @@pm\@@a@N @ffffff@p߿H˒@F- q95Her @ffffff@p\N@5eO95Her @@pFt@5y=c @333333@q ҉R \u03c4 Oph @@pU2a| \PH\u03c4 Oph @@pSMj \wkP9Sgr @@p~($ x8\PH96Her @@p @4fA\u03b3 1Sgr @ffffff@pOv`=zG\u03b8 Ara @ @p&I Z\u03c0 Pav @333333@qQOՊڹZ\u03b3 2SgrAlnasl @333333@p;5X>l_ @@pFsBݘ @@pQE\N< @@pQE\N< @333333@qL_Rj!.I70Oph @@pѷX@m\ @333333@p~($ x 8YK @@pF]dohی\u03b9 Pav @@q <64OH98Her @@p [7@68 ԕ+ @@qU2a|حV\u03bf Her @ffffff@p,<@<33333 @@qa|Q>ݘ100Her @333333@pM:@:Y}100Her @@pM:@:\)\u03b5 Tel @@q RF)y @333333@q _oDC\102Her @333333@qu%@4|\u03b4 UMi Yildun @333333@pp]cf@Uݗ @@pR@EPH @@q%1@B3a@N101Her @ffffff@q&@4 A73Oph @@q@4n@GE85 @ffffff@q@%F L @@q @ +j11Sgr @@q䎊q7{J#9 @@q =pDS& @ffffff@qYO, @@q@B;m]41Dra @ffffff@pu@TD*24UMi @@pk33333@UY}\u03bc Sgr @ffffff@q M;5 @333333@qn.@@4J104Her @@qu@?g14Sgr @@q5 @@q qu"@K$ @@q{J#:Fu%F @333333@q$4mL~15Sgr @333333@q]cf4qiC16Sgr @@q]cf4cZ\u03c6 Oct @@q>h ԕR,<\u03b7 Sgr @@q&Bab} @@qUM:T1 @@q$8Y1_r @ffffff@q(6z; G{ @@qR<6@Eg8}36Dra @@qR<6@Pk~( @@q({J#:@2!n.\u03be Pav @333333@q<>BZN8}H @333333@q,3@  @333333@q0R<6/ԕ*\u03b4 Sgr Media @@q3>=\N105Her @@q,}Vm@8r3 @ffffff@q9=p CTL_ @@q5 2(\37Dra @@q!.H@Q0_F74Oph @333333@q3y=c@ oh @@q/y=c@=ݘ106Her @@q11@5Ov_\u03b7 Ser @ @q5=p 0{ @333333@q; BU1\u03ba Lyr @333333@q/rGE8@B>BZc @@q=(BIQ @@qA6zFOv_108Her @ffffff@q3p:@=҈107Her @ffffff@q44K@<޸Q\u03b5 Sgr Kaus Australis ?@q@A1=b @@q<*0(& @@q8Fs@7I k~ @333333@q:Z@(t\u03b6 Sct @ffffff@q>3!Ov_خ @@q;Dg8~@1Ӣwk18Sgr @ffffff@qD_p>X @@q6.H@Hݗ+ @@qK+jHFs109Her @ffffff@q>)^@5 '021Sgr @333333@qEfffff4>B\u03b1 Tel @ @qK䎊qFA [ @333333@qcR}cA @ffffff@qFR<6@ U2a|\u03bc Lyr @ffffff@q@R@CC\u03b6 Tel @ffffff@qSSMjHrGE @@qOM:=$tT @@qW@LD @ffffff@qQp:Co\u03bb Sgr Kaus Borealis @ffffff@qOG{9k$\u03bd Pav @ffffff@q]~($ xO#U= @333333@qGR@=2W59Ser @@qLfA?_o\u03c6 Dra @@q3u%@Q՞% @@qWQG2W39Dra @@q?3@Mfz\u03c7 Dra @ @q4:)y@R.1 @@qOR@]cf\u03b3 Sct @@qT)^-!'R @@qWQ-)ԕ* @ffffff@qX)^20 \u03b4 1Tel @@q_FtFQ60Ser @333333@qV₿ @333333@q\Q@~ @@q_H˒E$tT\u03b4 2Tel @@q`!.HFC @ffffff@qam\Ce+ @@qVa|Q@7ݸ @ffffff@q]D2g,42Dra @333333@qGD@Pd @@q]}Vm%sPH\u03b8 CrA @ffffff@qfF]dE(\u03ba 2CrA @ffffff@qe C\D @@q\JE@061Ser @@q_Ϳ @@qbC--/V @@qgQ@#924Sgr @@qg$t8Q @@qf- '0 @333333@qczG@7( @@qcSMj@> qv @ffffff@ql(\%SMj\u03b1 Sct @ffffff@qla@ }K] @@ql =p@24 xF45Dra @@qbM:@L8YK @ffffff@qnFt@7u%\u03b6 Pav @@q$ xGQeں @333333@qg@@J-B @333333@qqQ@">Q @333333@q|!-wGq @@qr=K@ @@qw- 5e8YK @333333@qz ҉7Gz @333333@q~U2a|E @@qvfffff5Xy> @@qrzG@@J @333333@q{\(5 IQ\u03b1 Lyr Vega @qsD@CdM: @@qzGP#E84 @ffffff@qV\N@Schۋ @333333@qu%) @@q)^P7o @@qv;5X@OCjf\u03b4 Sct @@q"G{\u03bb CrA @ffffff@q [7C)k~( @333333@qJEA)y @@q*0C\u03b5 Sct @@qOv` !-w @333333@qNU9sP\u03b8 Pav @@qQPD>\u03c6 Sgr @@q- :v4Aql @@qSMj@zG{ @@qp =@?<6428Sgr @333333@q_o6dg8} @333333@q䎊q@[W>46Dra @@q&@K '0\u03bc CrA @@q kD3s\u03b5 1Lyr @@q\(@C\(\u03b5 2Lyr @ffffff@q&@Cz\u03b5 2Lyr @333333@q&@Cp:~ @@qC-$@\u03b6 1Lyr @333333@q@Bp =\u03b6 2Lyr @@q6z@BL_5Aql @@q1?110Her @ffffff@qzxl"@4҈\u03b7 1CrA @@q]cAE =p\u03b2 Sct @@qg H˒ @333333@qL_@:oiD @333333@qa@Fr @@qR\u03b7 2CrA @ffffff@qU2a|E 111Her @333333@qOv`@2.p:~\u03bb Pav @@qѷO @@q6z@N($ x29Sgr @@qq 4S  @@q ' @333333@qߤ?@J~z @333333@q\(@3T!-w2\u03ba Tel @ffffff@q =qJ \( @@qp:GL2W @333333@q1#cA \\u03bd 1Lyr @@q@@h ԕ+\u03bd 2Lyr @@q&@@FIQ\u03b2 Lyr Sheliak @ 333333@qQ@@p:~\u03ba Pav @@qPMj112Her @@q@5lu"33Sgr @ffffff@qn.5\L_\u03bd 1Sgr @333333@qzH6Q @@q@Rzxl"h @ffffff@qߤ?/4Ʌoi\u03bd 2Sgr @@qy=c6҈\u03c3 Sgr Nunki @@q:K$ @333333@q [7EZD @@qU2a|@J|50Dra @333333@qzG@Ro\u03bf Dra @ffffff@qp:@M| @@q4K0`oiDg8\u03c9 Pav @ffffff@qm\NB @@q =p7,q @333333@q²m]BA [\u03b4 1Lyr @@q>BZ@B|`d @ffffff@qG{@;p:113Her @@q\N@6Q\u03bb Tel @333333@qحVJx$ xG @@qfA@v4K @@q>BZ@IZ \u03b4 2Lyr @333333@qF]d@Bs'/\u03b8 1SerAlya @ffffff@qG{@|\u03b8 2Ser @@q k@ξߤ?\u03be 1Sgr @@q]cA4 ԕ+ @@qzG@D( @ffffff@qiB@2D\u03b7 Sct @333333@q?bh ԕ\u03be 2Sgr @ @qR5P{\u03b5 CrA @333333@q䎊qB\( @@q#w@Hn L/13Lyr @@qW>6z@E_p64Ser @@qqu"@HK]c @333333@qsQ0VϪ @@qqu"@@sa@N @333333@q>@1\]ce @@q͖R<6)c 10Aql @333333@q [7@+:~11Aql @@qa|Q@+>Q @333333@q [7@C"48Dra @ffffff@q@LQ\u03b5 Aql @@q~($ x@."74\u03b3 Lyr Sulafat @ @q8Y@@X>BZc\u03c5 Dra @333333@q+j@QS& @@qu%@:;u% @ffffff@q '@PP?\u03b6 CrA @@qu!E 2W @@qa@Ia|Q\u03bb Lyr @@q@@S&12Aql @@qָQ3\u03b6 Sgr Ascella @@qrGE8=[W>6 @ffffff@qحV8p: @@q.HC l"h @ffffff@q(\@:J0 14Aql @@qۢ3 Xe, @333333@qᰉ@IDM: @@qq ? n.\u03c1 Tel @ffffff@qSMjJ+U= @333333@q%1?6C16Lyr @@q\(@Gw?\u03bf Sgr @ @q⻘5 qv49Dra @@q䎊q@KC,zx @333333@q{J#:Q.H @@q 'H&L/{J15Aql @@q =p 'RT`\u03b3 CrA @@qq B6\u03b3 CrA @@qq B6\u03c3 Oct @@szGV=5Xy> @@qH˒/Rs\u03c4 Sgr @ ffffff@q\(;q \u03b6 Aql @333333@q =q@+u%F \u03bb Aql @ 333333@q\NzH @@q]cf@?$t\u03b4 CrA @@qd7D?ݗ+18Aql @@q>BZ@&$qj @@q3J=p @@q\(@8@4m951Dra @333333@qzH@J)_ @@q{J#:@6z@.*͞&1Sge @ffffff@r (\@5;qu! @333333@r @>&I22Aql @@r4K@V43Sgr @@r 2\N1Vul @@rѷ@5cg @ffffff@rɅoi@-C-54Dra @@rzH@L=p \u03b4 Dra Altais @@r8YJ@PYJ59Dra @ffffff@q@S#҈\u03b8 Lyr @333333@ry=c@C_p\u03c9 1Aql @@rDg8~@'0)^ @@r͞AoiDg2Vul @@r>BZ@723Aql @ffffff@r*0?]ce @@r" 6g =p\u03ba Cyg @ @riB@J.H\u03b7 Tel @@r+h ԕK68YJ28Aql @@r%@(حV26Aql @@r"1y 27Aql @@r"a@N\u03b2 1Sgr @@r*F:<64\u03c1 1Sgr @333333@r&[W>1e+\u03c5 Sgr @ffffff@r&>BZ/\)\u03b2 2Sgr @@r,G{Ff\N<\u03c1 2Sgr @333333@r'd72N쿱[W\u03b1 Sgr Rukbat @333333@r/L_DN]cf @333333@r)ohی(\)\u03c4 Dra @@r33333@RV&I @@r!s@Lҙ0 3Vul @ffffff@r+d7@:C33333 @@r4F L0=O'/W\u03c7 1Sgr @@r5_p83\u03c7 3Sgr @@r5s7R<6 @ffffff@r5p =+6z @ffffff@r?4֡aK)n.\u03c0 Dra @@r"q @Pm2Cyg @@r0@=31Aql @ffffff@r3G{@'eO50Sgr @@r9Gz5Ϫ͟\u03b4 Aql @ ffffff@r5\N@fB @@r8<64./V @ffffff@r;2W=H @333333@r/2W@EB @@rLYQo4Vul @ffffff@r5>BZ@3q \u03bd Aql @ffffff@r:s?իU= @@r9=K@* <쿱5Vul @ffffff@r8G{@4 k~ @333333@r9ᰉ@32W @@rE+jErGE4Cyg @ffffff@r8=K@B(U @333333@rAc @qA [ @@rGzG:PH35Aql @333333@rD4K?4m8\u03b1 Vul @@rBѷX@8=p 8Vul @333333@rC@87 @@rEy=c@-1 \u03b9 1Cyg @@r=Y@J) k~ @@rSR<6JK]d36Aql @@rJO͞ @ffffff@rUp =F͞&\u03b2 1CygAlbireo @@rJC-@;1\u03b2 2Cyg @ffffff@rKJ@;,\u03b9 2Cyg @ @rFѷX@IfA @333333@rMsg@:ѷY @333333@rX$tDq \u03b9 Tel @@r\ѷH 8Cyg @@rOOv`@A9.H @@rMIQ@I'As\u03bc Aql @@rX\(@\N37Aql @ffffff@r\|%ߤ?51Sgr @ffffff@r`8}H9Vul @@rZSMj@3!.52Sgr @ffffff@rba@839Cyg @333333@r[d7@=v @@rV8Y@H @ffffff@rd8}H2;)^ @333333@rZH˒@E4֡a\u03ba Aql @@rc$t(\\u03b9 Aql @333333@rbC-*0 @@rYQ@IL/{J @@rfJE,xl"h @@rc4m@&C]42Aql @@rg'RT` =p\u03c3 Dra @ffffff@rQp =@QjOv_خ\u03b5 Sge @ffffff@re(\@0vz @ffffff@rb&@FX\)\u03b8 Cyg @@ra2W@IM: @@rpy=c7m\u03c3 Aql @ffffff@rl8Y@Xe,\u03c6 Cyg @ffffff@rm@>'>6z\u03b1 Sge @333333@rpc @2Mj45Aql @ffffff@rrC- qu14Cyg @@rm2W@Eh ( @333333@rjH˒@K|TɆ\u03b2 Sge @333333@rt1@1yᰉ'55Sgr @@rzs0r @@rsXe,@F33333 @@r~;5X. =q\u03c7 Aql @@rzDg8~@'E84 @@rR 64 @@rz k@@616Cyg @@rwB@IC=K^10Vul @@r~@9ś=K @@rzG?u%F\u03bd Tel @333333@rzGL.fffff @333333@r@DD56Sgr @333333@rrGE83sP15Cyg @333333@rqu"@B\\u03c5 Aql @@rTɆ@tJ\u03b3 Aql Tarazed @@r =p@%:u%F \u03b4 Cyg @ffffff@r1@F ( @@r#M4m17Cyg @@r '@@(\u03b4 Sge @ffffff@r@2TɅ @@rRGRT`e @@r=p @9bGE85 @@rQ@C4(\\u03c0 Aql @@rp:@''R @@r;5X@QUo\u03b6 Sge @@rᰉ@3$g8} @@rK|M: @333333@r_oCVϫ51Aql @333333@rQ%Fs\u03b1 Aql Altair ?ffffff@r!.H@!N;\u03bf Aql @ffffff@rqu"@$Ʌoi57Sgr @@r3 Q\u03c7 Cyg @@rBZc @@uoi12Vul @@rF L0@6(\19Cyg @ffffff@rDg8~@C\zG @ffffff@r|@DL7\u03b7 Aql @333333@r䎊q? @@rqu"@8ѷY @ffffff@r?JL20Cyg @@r{J#:@J~z @@rDQJ}Vl\u03b9 Sgr @ffffff@r ҉D$tS\u03b5 Dra @ffffff@r[W>@Q#w56Aql @@rL_!%ڹ @@riBMsa@N @ffffff@rD@GQ\u03b5 Pav @333333@r]cAR:GE85 @@rzG@GH˒:13Vul @@rحV@8g8}57Aql @@r tSMj\u03be Aql @@r\N@ <쿱58Aql @ffffff@r#?т \u03c9 Sgr @@r\(:Lzxl" @@rs@8Q2W\u03b2 Aql Alshain @ @r@4n@u!\u03bc 1Pav @@reOP759Sgr @@rɅoi;+Q @@r8YJ@B4m23Cyg @ffffff@r(\@LS&10Sge @333333@rOv`@0{m\u03c6 Aql @@r!-w@& k~\u03bc 2Pav @333333@r~($ xPm822Cyg @@rrGE8@C>L/{J61Sgr @@r.A\u03b7 Cyg @ffffff@r:)y@A 60Sgr @333333@r*0:2s\u03c8 Cyg @@rQ@J8- q11Sge @@rFt@0 \u03b8 1Sgr @333333@r{Aa@N\u03b8 2Sgr @333333@rk~(AYQ @ffffff@r>M$ xG @@r(@D/, @@rBᰉ' @333333@r8YJFz @ffffff@rZ@e+ @@r[W>@MlM:\u03b3 Sge @ 333333@rFt@3~ѷY @333333@r(\#L/{ @@reO@>5Xy14Vul @ffffff@rg @7Y}13Sge @333333@r8}H@1Fs @@r]cA@FsP25Cyg @ffffff@rzH@Bzxl"h @@r(@!H˒63Sgr @@r>BZ+F62Sgr @@rʢ3;1 @@r;5XBl"h 15Vul @ffffff@rh ԕ@;C @@rᰉ@O`d @333333@r>@8u"16Vul @@r@8'RT` @@rNU@8}H26Cyg @@rp =@I fA @@r@2'RT` @ffffff@r@0 ԕ+\u03b4 Pav @ @r>BZP?62Aql @ffffff@rьL_g l\u03c4 Aql @@rЍ@? @@r~($ x@=!R15Sge @333333@riB@1R\u03be Tel @@r݌L_Jp (64Dra @@r1@P4 @ffffff@rh ԕ@@s\u03b7 Sge @ffffff@rԢ3@3\u03c1 Dra @@rF L0@PrG17Vul @@rۏ\(@7IQ27Cyg @333333@rsg@AzG64Aql @@rQ녿崢3 @333333@rR@J84֡66Dra @333333@r/V@No @333333@r)^B D28Cyg @@r '@Bk{J#9\u03b8 Aql @ @r8YJH18Vul @@r;5X@:y  @ffffff@rDg8~J9 k~\u03be 2Cap @333333@rY)<(\19Vul @@r33333@:20Vul @@r ҉@:z0 66Aql @@r(&IQ @@r(\;eO\u03c1 Aql @@rqu"@.eQ68Dra @@rSMj@O 30Cyg @333333@r33333@Ghl"h 21Vul @ffffff@re@<31Cyg @ @r&@G^129Cyg @@r!.H@Bg8}H @@r@9&33Cyg @333333@r+j@LHU22Vul @ffffff@rF]d@73 @@rحV@NQ.H @ffffff@rFs@@\23Vul @@rs@;oiDg8\u03b1 1Cap @@s+j)?4Cap @333333@s5\(\u03ba Cep @333333@r㍸@Smݗ32Cyg @333333@rC-@Gqu!24Vul @333333@s$ xG@85Xy\u03b1 2Cap @ @s8}H)C- @@s =p@F)y @@s@D.Q\u03c3 Cap @@s S&3\N<34Cyg @333333@s%1@C<쿱 @333333@swkP@D]36Cyg @@s >BZ@B35Cyg @ffffff@s =K@A}cA \u03bd Cap @@s)? @@sF]d@+- \u03b2 Cap Dabih @@s ҉-*0U\u03ba 1Sgr @@sfAE\N< @333333@sm\@1u% @@s @KsP @@sOv`@PL/{ @@sE*0T=\(\u03ba 2Sgr @ffffff@sL_E6Ov_25Vul @@s:)y@8r3\u03b1 Pav Peacock ?ffffff@s&+jL^zG71Dra @@srGE8@O \) @333333@s}Vm@_U=\u03b3 Cyg Sadr @@sᰉ@D ۋq @@s\(@F\( @@sJ@DW>6z @333333@s%Ʌoi<_o @@sfffff@Q8VϪ @ffffff@s\(@Ozxl"h39Cyg @@srGE8@@Q @@s\)@B> @ffffff@s&g @5he+ @@sY=p TR}Vl\u03c0 Cap @@s-Gz261.\u03c1 Cap @@s3p =1H40Cyg @ffffff@s.IQ@C8[643Cyg @ffffff@s,'RT`@HrGE\u03bf Cap @@s7+j2S&69Aql @@s6sh41Cyg @@s5Fs@>^\N<42Cyg @333333@s5\(@B:3 @@s5p:@L4m\u03c9 1Cyg @@s8;5X@HyN;6 @ffffff@sAFs#Z\u03bd Mic @ffffff@sGq FB\u03c6 1Pav @@sNQNJu%F \u03b8 Cep @@s6SMj@OAs\u03c9 2Cyg @@s=@4n@H2W\u03b5 Del @@sDQ@&J#9\u03b7 Del @333333@sG@* (\u03c1 Pav @333333@sVZN =p47Cyg @ffffff@sGu@A6\u03b1 Ind @@sVDg8~GL_ @@sG*0U2@GXѷX\u03b6 Del @ffffff@sM;5X@-Y0 )70Aql @333333@sR>BZffffff\u03c6 2Pav @ffffff@s`,Ft@R_p27Vul @@sTPH@:v?\u03c5 Pav @ffffff@sgp:P{\u03b2 Del Rotanev @ @sV33333@-0)^\u03b9 Del @@sWF L0@&ohی71Aql @333333@sYZ޿O M\u03c4 Cap @@s]-p:29Vul @333333@sZOv`@53{J#9\u03b8 Del @@sZ(@*Gz @@saQ@H˒:28Vul @@sZ [7@8 @@sZW>6z@7;5X\u03ba Del @@s\Q@$,L_1Aqr @ffffff@s]TɆ?!-w1 @@s\U2a|@/qu"\u03c5 Cap @ffffff@s`333332#{J#975Dra @@s0 k@T['/ @ffffff@s[e@>U=K @333333@sb*00˒:)\u03b1 Del Sualocin @ @s^@/䎊q74Dra @@s5fA@TEb @@seFs?*0U2a\u03b2 Pav @ 333333@ssfAP$tT10Del @@sezG@-*L_ @@s`4֡a@Eg \u03b7 Ind @@sp'RT`I,=49Cyg @@sd,<@@'RT`e\u03b1 Cyg Deneb ?333333@seY@F҈ @ffffff@sg2W@Da@O\u03b4 Del @@smfA@.&51Cyg @333333@sh =p@I+Q @@syW>6zCb}\u03c3 Pav @@s4֡aQ1'R\u03c8 Cap @ffffff@sxa@N9ES&17Cap @@sx͞5wk30Vul @@ss4m@9EF L052Cyg @@svzxl"@>>BZc\u03b9 Mic @ffffff@s{Eqi @@sqwkP@L>z4Cep @@sl@PzG\u03b3 1Del @ffffff@szFs@0حV\u03b3 2Del @@sz3@0˒:)\u03b5 Cyg Gienah @333333@sxحV@@2W\u03b5 Aqr Albali @ @s~ '"b3Aqr @@s~{wkP\u03b6 Ind @333333@sG '013Del @@s8YJ@˒:* @@suh ԕ@L3 @@s|Q@A/\u03b7 Cep @ 333333@su(\@Na@N @333333@s,<9 ԕ+\u03bb Cyg @@s}3@B>҈p;\u03b1 Mic @@sߤ?@5Xy\u03b9 Ind @@sn.I? @@sIQ@G{m @@s ҉B15Del @@sQ@)1 @333333@sɅoi) =p55Cyg @333333@sD@G\u03c9 Cap @ffffff@sIQ:P{4Aqr @@s}Vmohی56Cyg @@sSMj@FkP5Aqr @@sFs)^\u03b2 Ind @ @s=p M:#9 @333333@szHCzH @@sG{@<@'RT`\u03bc Aqr @@su!sPH31Vul @@s{J#:@;p:19Cap @@s11PH57Cyg @@s#@F1o76Dra @@sjXe,@Tڹ @@s=p @FH˒: @@s+j@@ ԕ+32Vul @@s=p @<Q17Del @ffffff@srGE8@+q[W>616Del @@sS&@)#  @@s'RT`:K҈7Aqr @@s#eQ @333333@s~:)y@T#W>6z @333333@s '0}H @ffffff@sQ@Gzxl"h\u03b1 Oct @ffffff@sѷSAݗ @@sPH@Fvfffff @333333@sm]@I]B @@sY@HrGE @@sohیIY}\u03bd Cyg @333333@s[W>@DfA18Del @@sY@%U=33Vul @333333@s@6Sg l\u03b5 Equ @@sJE@,zxl" @@sL_@F<`d @@sB@)^\u03b3 Mic @ffffff@s*0@ $tT @ffffff@sn.@I;)^ @ffffff@sحV@3TSMj @@s*0CCg59Cyg @@sNU@G³g \u03b6 Mic @333333@sѷCPۋq @@s[W>@M$ xG @@s]cf@BW>6z60Cyg @333333@sY@GA [\u03bc Ind @ffffff@s{K][12Aqr @333333@sPHJڹY\u03b7 Cap @333333@s%3G{ @ffffff@s|RK @333333@s=K@LU3Equ @ffffff@sPH@ѷ\u03b7 Mic @@sɳg Dk~(\u03b4 Mic @ffffff@szG> @@s1O1\u03b8 Cap @@sɅoi1;A @ffffff@sɥzxl"@+Z4Equ @@sy @L_ @@s,<@J쿱[\u03be Cyg @ @sùY@E&I24Cap @@s̃{J#:9|Q @333333@sS&@?/H˒:61Cyg @@sˣ =q@C_v_ح\u03c7 Cap @333333@s=p 51o63Cyg @@sh ԕ@G~\u03bf Pav @@s]cAQ\u03bd Aqr @@sa@N&Ov_خ @@sҗ+j@>4O M\u03b3 Equ @ffffff@s]cA@$Cn.3 @333333@sɍ@Qۤ? @333333@s>BZD"{m @@s4֡aCp:~ @@s =p@J6 @@sBZc B6BZc @@s'RT`;$t @@s!-w@S @@sJB\u03b6 Cyg @ @sH˒@>:Ov` @ffffff@s6z@MBZc \u03b4 Equ @@s(@$eO\u03c6 Cap @@s&4Ϫ͟29Cap @@s\N.W\u03c4 Cyg @ @s*0@C8YK\u03b1 Equ Kitalpha @333333@sJE@H˒\u03b5 Mic @@sD@zG30Cap @@sѷX1<쿱\u03b8 Ind @333333@swkPJo15Aqr @333333@s<64ݗ+k\u03c3 Cyg @@s͞@Cݘ\u03c5 Cyg @@sq @Ar͞& @@swkP@&h @@s!-w@K($ x\u03b8 1Mic @333333@t =pDg?68Cyg @@s*0@ErGE @333333@szG@Cfffff16Aqr @333333@tIQ=p = @@sR@HQ \u03b1 Cep Alderamin @333333@sQ@OJD9Equ @333333@tQ@jfB @ffffff@s M;@MO @@tJE@7s @ffffff@tW>6z@@9Y}\u03b9 Cap @@t#0՛=K @@s*0@S@@6Cep @ffffff@szG@P75Xy @ffffff@t u%6=K^1Peg @@tXe,@3(17Aqr @@t D"eO\u03b2 Equ @ffffff@t S&@>$t\u03b8 2Mic @@tDۋq \u03b3 Pav @@t8YPWn.333Cap @@t =q4Ov` @ffffff@tFt@Hy 18Aqr @@t2W)R<6 @@tR@8F1.19Aqr @@tߤ?#H˒: @333333@t"\NQ`VϪ @ffffff@tDg8~@:,zxl"21Aqr @@t!.H t!-w2 @ffffff@t&B)y @@tqu"EFOv_\u03b6 Cap @ @t͞6iQ 35Cap @@t#523 @ffffff@tNU@G[qu!69Cyg @@t!.H@BUp =36Cap @@t"䎊q5ΤT70Cyg @333333@tm\@B @333333@tp =@HjG{35Vul @@tq @;5Xy @333333@t @@֡a @@t#\N@6-(2Peg @@t')^@7Mj7Cep @@ts@P71Cyg @@t%@GE2a|\u03be Gru @@t0d7D6PsA @@t0 k@C\u03b2 Aqr Sadalsuud @333333@t.;5XHp: @@t5$tFl쿱[\u03b2 Cep Alfirk @ @t" =q@Q%2 @@tPH@T!O @@t+!-w@N:͞&37Cap @ffffff@t;fffff4=K @@t38Y@H( @@t=,<ce\u03c1 Cyg @@t7(@Fa@O8PsA @@t@:+҈\u03bd Oct @ @tU1SX\)72Cyg @@t;qu"@CD`d\u03b5 Cap @ffffff@tDQ3wRT`e @@t@(\@F+j\u03be Aqr @ffffff@tGn.jg 74Cyg @@tC@D4D5Peg @@tGFt@3Qo4Peg @ffffff@tJ [7@8YJ @333333@tLs@4Cg25Aqr @ffffff@tN8YJ@䎊q\u03b3 Cap Nashira @ @tP]cA0oiD9Cep @@tGzH@O {m\u03bb Oct @@t{%T_o @ffffff@tK =p@L42Cap @ffffff@tV1,Q75Cyg @ffffff@tP<64@E'/41Cap @@tX M;7CF]c26Aqr @ffffff@tXq ?\u03ba Cap @@tZ32cA 7Peg @333333@tYu%@Q44Cap @333333@t\JE,̥zxl"77Cyg @ffffff@tY&@Dᰉ'\u03c0 1Cyg @ffffff@tXa@N@IH45Cap @@t`4K-[W>\u03b9 PsA @333333@tcɅoi@MjO @@t\m\@D =p79Cyg @ffffff@t]}Vm@C$VϪ\u03b5 Peg Enif @ffffff@t`H˒@#\u03bc 1Cyg @@t`S&@<($ x46Cap @@tdJ"*=p 9Peg @333333@tb ҉@1Y @@tbOv`@-6z\u03ba Peg @ffffff@tbO @9Q\u03bc Cep Garnet Star @@t^Ft@Mc =p11Cep @@tW@QC]\u03bb Cap @@tj$ xG&J#912Peg @@thJE@6C,\u03b4 Cap Deneb Algedi @ffffff@tl(\0 -  @@tq M;G]cf @ffffff@t\Dg8~@R˒:*\u03b8 PsA @@tn{>!. @@tc@O:D11Peg @ffffff@tl@}!.H @ffffff@txn.P-\u03bf Ind @@t{$ xGQhH\u03bd Cep @@te)^@Nv_ح\u03c0 2Cyg @@tk,<@HkP12Cep @@tm@NXU14Peg @@twa@N@>,_13Peg @@txFs@1I @@t~Gz@3Ӣwk\u03bc Cap @@t/V+xl"h @@t2WNu!S\u03b3 Gru @@t}VmBQ15Peg @@t\N@<s16Peg @@t@4n@9 @@t4K@KѷY @ffffff@t~($ x@3s @@t[W>Y @@tQBu!\u03b4 Ind @@tq K =p13Cep @333333@tL_@LNBZc 17Peg @@t\(@(', @333333@ts@PT# @@t1C20 @@t@4nS$tS @@t=K@O*0U\u03b7 PsA @@tXe, ( @@t_o@JpC21Peg @333333@tDg8~@&8YK14Cep @@tNU@M*0U @ffffff@t@@FS33333 @@tsg:ҏ\(\u03ba 2Ind @ffffff@td7Mk~(32Aqr @333333@t(\\u03bb Gru @@tu!CŊڹZ\u03bd Peg @333333@tQ@<n.\u03b1 Aqr Sadalmelik @333333@t!.Hu!. @@t\(@:?18Cep @@t&@ORT`e\u03be Cep @@t(\@P(- q\u03b9 Aqr @@tH˒+IQ23Peg @@tPH@<&I @ffffff@t!.H@F\u03b1 Gru Al Na'ir ?333333@tG{S&20Cep @@tu%@Odqj19Cep @ffffff@t+j@O# =p\u03b9 Peg @ @t ҉@9XQ\u03bc PsA @@teO@~qi\u03c5 PsA @@tA% @@t>BZ@3yD25Peg @@tZ@5g35Aqr @333333@t2 '0 @333333@tǶ}VmAᰉ'\u03c4 PsA @@tȖR<6@F.2\u03c0 1Peg @@t>BZ@@ L/\u03b8 Peg Biham @ @t@ʌL_38Aqr @@tʀ4m'!Gz\u03c0 2Peg @@t{@@҈p; @@t~($ x@'?[W> @@tk~(@0 d7 @@t̨TɆ@Iiae\u03b6 Cep @ ffffff@tk~(@M @@tЈeO@83333324Cep @@t:)y@Rԕ*\u03bb Cep @@t ҉@M '0 @@t\)9.H\u03c8 Oct @@t]cAS`[W? @@t@4n@Lkqu! @@tʗ+j@Q˒:* @333333@t/V@AMfA\u03bb PsA @@t@4n;SMj @333333@t [7@Na4J41Aqr @333333@t333335m\\u03b5 Oct @ffffff@te+T$ xG @333333@t֒S&@<~($ @@t|@OL_ @@t׃{J#:@CۅQ\u03bc 1Gru @@tu!D`d @@tIQ@Fl"h \u03bc 2Gru @ffffff@t8YDQ @@t\)@Eze+\u03b5 Cep @ffffff@t!.H@LO 42Aqr @333333@t4֡a)B1Lac @ffffff@tG{@B\u03b8 Aqr Ancha @ffffff@tU2a|"e+ @@t"zG @333333@t =pJ[6\u03b1 Tuc @ffffff@tn.N!=b44Aqr @@tohی~($ x\u03c5 Oct @@u~($ xU},= @333333@t2W@L2W45Aqr @@t M;*(\25Cep @@tحV@OfFs\u03c1 Aqr @333333@t)^Hp:30Peg @333333@t =p@(Xy=\u03bd Ind @@usgR[647Aqr @ffffff@t_o5*0U2a\u03b3 Aqr Sadalachbia @ffffff@t- 1-31Peg @@ts@(i32Peg @333333@tIQ@ @@tԵ '@UC, @@u{J#:PO M34Peg @@u ~($ x@ ҉35Peg @@uohی@K]c\u03bd Gru @@uuCe+ @@uzG@?,\u03b4 1Gru @333333@uzGEo @@u M;@QTɅo\u03b6 1Aqr @@uPHɅoiD\u03b6 2Aqr @@uVϪοzG{\u03b4 2Gru @ffffff@uu%EVϫ26Cep @@u Z@PHu!36Peg @@ueO@"A.H @@u4K;qu! @@uzH@:Z37Peg @@uѷ@\u03b4 Cep @ @u@M5(5Lac @333333@uQ@G{m\u03c3 Aqr @333333@uR<6%[/V38Peg @ffffff@uQ@@IGz\u03b2 PsA @@uJ@,M:\u03c1 1Cep @333333@u fA@SJL6Lac @@u!-w@EK]d\u03bd Tuc @333333@u$n.N\u03b1 Lac @ @u*0@I$(\ @333333@u!\(@C5Xy60Aqr @333333@u(1/Vϫ\u03c1 2Cep @@u&@S[W?\u03c5 Aqr @@u*8Y4S& @@u& '@LP @@u.ohی7\u03b7 Aqr @@u-m\ڿzG @ffffff@u!zG@S}Vl @333333@u2\(?Y}\u03c3 2Gru @333333@u3RDK*0U28Lac @@u/|@C-w1\u03ba Aqr Situla @@u7Ft 9Lac @ffffff@u5~($ x@IcA 31Cep @@u/s@Ri( @ffffff@u;ohی@kP|40Peg @333333@u;@31 @@uCBL L/ @@u:&@Le?10Lac @333333@u= ҉@Cp:~ @333333@uA|>U @@u4ѷ@R30Cep @ffffff@u:@O͞&\u03b5 PsA @ffffff@uB- ; )^ \u03b2 Oct @ffffff@uX8}HTXm8 @@uC{J#:@-JE11Lac @@uB@F#a@N @@uA:)y@JM:\u03b6 Peg Homam @ 333333@uEحV@%B @@uJu!GD\u03b2 Gru @@uJq Gq=b12Lac @@uE>BZ@Du"\u03bf Peg @@uGFt@=NQ @@uGa@@-eO @@uFh ԕ@DR<6\u03c1 Gru @333333@uND '066Aqr @ffffff@uNZ2Ԏqj\u03b7 Peg Matar @333333@uLn.@>8U @@uPXe,@CA\u03b7 Gru @333333@uV&J ԕ+13Lac @@uP]cA@Dۋq @@uV}VmGFzG\u03be Oct @333333@ui&T䎊r\u03be Peg @ffffff@uZ8Y@(Xy=c @@uXzH@FE,=\u03bb Peg @333333@uZ [7@7)^68Aqr @@u^4֡a3:\u03c4 1Aqr @ffffff@u^Q,u"\u03b5 Gru @ 333333@ub8YJI-  @@u`Y@BVl!\u03c4 2Aqr @@uf]cA+/\(\u03bc Peg Sadalbari @ 333333@uhF]d@8  @@ul%1CL_ @@ugzG@KMj14Lac @@uisg@D21PsA @@umd7==b\u03b9 Cep @ @ufQ@P֡a\u03b3 PsA @@urqu"@p*0U @ffffff@umQ@N4J\u03c3 Peg @ffffff@uq=K@#a@\u03bb Aqr @ @uru!Qu15Lac @@up!.H@E @@u]@Tb @ffffff@ut'RT`@0RT`e74Aqr @333333@uuᰉ';6 @333333@uvq @F_\u03b4 Aqr Skat @ @uz/?77Aqr @@u{u%0E=K @333333@uxwkP@D0>BZc @@u|\u03c1 Peg @@u|ᰉ@!'R @@u|,<@B\u03b4 PsA @@u)^@E[\u03c4 3Gru @@u/VGߤ@ @@u~e@B-oi16Lac @@uS&@DL_ @@u@H,=\u03b1 PsA Fomalhaut ?񙙙@u=K=H˒:51Peg @@u]cf@4֡a @@uL_@HWݗ+ @@ul%1@UWrG52Peg @@uɅoi@'u2a| @@uc =vR<62Psc @@ua@?As @ffffff@uc 9* \u03b6 Gru @ffffff@uQJ`'RT @@uy@U&IR @ffffff@u˒:*Iy @333333@u]cf@+j @@uW>6z@Lx$tT @@uJE<څݘ @@uy=c\u03bf And @ @u@E) @@u!-w4ߤ?2And @ffffff@uk~(@E`$tT\u03c0 PsA @ffffff@u#A_Vϫ @@uzGQ4˒:* @@ueD84֡\u03b2 Psc @@u@\(\u03ba Gru @333333@u =qJQ\u03b2 Peg Scheat @333333@u_p@<2a| @@u1@Pce3And @ffffff@u@I}Vl\u03b1 Peg Markab @333333@u ҉@.i83Aqr @@u?\u03b8 Gru @@uQE£S&86Aqr @@uY7;5X\u03c5 Gru @ffffff@uS&Cr3 @333333@usIW55Peg @@uJ@"ќu56Peg @@usg@9w@1Cas @333333@uu!@M @@uᰉ@5"Zc @ffffff@ufffff<4And @333333@u%@G1o5And @@uFt@H?5Psc @@uY@n/88Aqr @ @uɅoi5,(\ @333333@u k<}Vl @333333@uѷXEn($ x57Peg @ffffff@ue+@!ZY89Aqr @ffffff@u6uQ @333333@uDKZ\u03c0 Cep @@u+j@R\u03b9 Gru @333333@up =Fݗ+58Peg @333333@u_p@#*02Cas @@uD@MS& @@u =p@1*06And @@u*0@EŨXy=59Peg @ffffff@u{@!p =q7And @@u33333@HJ @@u!.H@LڹZ @333333@u2W@&!Gz\u03c6 Aqr @@uJE2s @@u>BZDM: @@uIQ - \u03c8 1Aqr @@uϐ$t",!-w @ffffff@uحVO$ xG @333333@u|@RW @@uҥzxl"F>\u03b3 Tuc @333333@uոQM.2\u03c7 Aqr @@ud7$ xG @@u΅Q@Q֡a\u03b3 Psc @ @uԨTɆ@ As @@uѷX@JW>6z\u03c8 2Aqr @333333@uלu"]p =\u03c6 Gru @@uبTɆDioiD8And @333333@us@HY}\u03c4 Oct @@v?U]cf\u03b3 Scl @@uJE@DL_\u03c8 3Aqr @@uحV#8)94Aqr @@urGE8*D96Aqr @@uݙb}V @@uݛ=K2F]c\u03bf Cep @@u˒:*@Q&11And @@u#@HP ԕ+10And @@u~($ x@E .H7Psc @@u_o@\u03c4 Peg @ffffff@uL_@7M:63Peg @@uNU@>j=p @ffffff@uu%:_12And @@u㍸@CRT`e64Peg @333333@u*0U2@?97Aqr @@uu.98Aqr @333333@uG{4D66Peg @@uNU@(4m @@u*0@N_p @@uߤ?Ie+ @@uJELl67Peg @@uc @@1Gz4Cas @@uZ@O$2W\u03c5 Peg @@uQ@7gy 99Aqr @333333@u/V4SMj\u03bf Gru @@up =J\`d @ffffff@uM@9*͞&\u03b8 Psc @@uߤ?@\N @ffffff@uqu"@QS& @ffffff@v4KO.270Peg @@v쿱[@)m\ @@v!.H@MFBZc 14And @@v (\@CBZc @333333@vM:SXTɆ\u03b2 Scl @333333@vC-B ( @@u M;@UӮzH101Aqr @@vqu"4Ov`71Peg @333333@vߤ?@6r72Peg @@v*0@?SF]c14Psc @333333@v\( @@vJE.}b15And @@v˒:*@DBZc 73Peg @ffffff@vL_@@?\u03b9 Phe @@vNUENQ @333333@v@Q_p16Psc @ffffff@v!@N;5 @ffffff@v& =q*ߤ? @@v'fffffF =p\u03bb And @ffffff@v&B@G:S& @333333@v&!.H@F675Peg @@v'Ʌoi@2f\u03b9 And @@v(L_@EQ_18And @333333@v,@I<`d\u03c9 1Aqr @@v/#w,q \u03b9 Psc @ffffff@v/@ohی @@v/q @#ZY @@v,[W>@Rҽ<64 @@v-h ԕ@R- q\u03b3 Cep Errai @ @v-c @ShzG\u03bc Scl @333333@v2L_@ [W>6\u03ba And @ffffff@v13@F*<64 @333333@v4+j'\wkP103Aqr @333333@v6L_2Fs104Aqr @333333@v7 M;1$tT @333333@v7@@IQ\u03bb Psc @@v8/V?zG{ @@v9]cf.F L0\u03c9 2Aqr @@v:C-- =p77Peg @@v=~($ x@$B @@vB}VmSL/{ @@v@Pᰉ'78Peg @@v?e@=\_106Aqr @@v@p:2FC-107Aqr @@vH2+j\u03c8 And @@vH$ xG@G5cA 19Psc @@vI$t@ 7 @@vJrGE8@P\u03c3 Phe @ffffff@vM4KIoi\u03c4 Cas @333333@vL;5X@MSqu! @@vM'T`d @@vL [7@Ly 20Psc @@vO2W+j @@vO@P?\u03b4 Scl @@vS '66Cas @@vSXe,@Oqu!21Psc @@vUfA?73 @@vV@B6p:~79Peg @@vV- @<׮zH @@vX>#W @@vZ8YJ,8Y80Peg @@v]iB@"hۋq108Aqr @ffffff@v]k~(2譫U\u03b3 1Oct @ffffff@v`m\T5Xy>22Psc @@v_]cf@qA [\u03c6 Peg @@va!-w@3t @333333@vb,- 82Peg @333333@vby=c@%Q @@vc]cA!Ov_خ24Psc @@vc ' >6z\u03c1 Cas @@vieO@LVϫ @ffffff@vkqu"?# @@vt=p @ETC,zx @@vt$t@KW' @@vuSMjOzkP|\u03b3 2Oct @@vv- qTG{\u03b7 Tuc @@vvXe,PXe\u03c8 Peg @ffffff@vwu%@9$2W @333333@vy@I27Psc @333333@vz[W> r䎊q\u03c0 Phe @ffffff@v{QJ_v_ح\u03c3 Cas @333333@v|u%@K =q\u03c9 Psc @@v}?@tJ @ffffff@v}]cf=|(\\u03b5 Tuc @@v͞PdD\u03c4 Phe @?2a|QHgzH @?TɅoiI+)^ \u03b8 Oct @?لM:SD64 @?8YJ@Nqj29Psc @ffffff?+a@8Q85Peg @?\(\@;e30Psc @?\(\qi\u03b6 Scl @?,=eO32Psc @ffffff?+jg@ - @333333?*0U@PT`d2Cet @?Q1V L/9Cas @333333?>BZc@O$֡a @?PH0eں3Cet @?n.%*0 @ffffff?@Pʫ6z @?CQ+jastrometry.net-0.67/catalogs/build-hd-tree.c000644 000765 000024 00000031437 12651445460 021164 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Builds a kdtree from the Henry Draper catalog. I downloaded the text file from: http://cdsarc.u-strasbg.fr/viz-bin/VizieR?-meta.foot&-source=III/135A with the options: - "|-separated values", - only the "HD" column selected The result is a header including this: #Column _RAJ2000 (F6.2) Right ascension (FK5) Equinox=J2000.0 Epoch=J1900. (computed by VizieR, not part of the original data) [ucd=pos.eq.ra;meta.main] #Column _DEJ2000 (F6.2) Declination (FK5) Equinox=J2000.0 Epoch=J1900. (computed by VizieR, not part of the original data) [ucd=pos.eq.dec;meta.main] #Column HD (I6) [1/272150]+ Henry Draper Catalog (HD) number [ucd=meta.id;meta.main] _RAJ2000|_DEJ2000|HD deg|deg| ------|------|------ And then data like this: 001.30|+67.84| 1 001.29|+57.77| 2 001.29|+45.22| 3 001.28|+30.32| 4 001.28| +2.37| 5 It turns out that the HD numbers are all in sequence and contiguous, so there's no point storing them. A copy of this input file is available at http://trac.astrometry.net/browser/binary/henry-draper/henry-draper.tsv (note, the Tycho-2 cross-ref file is also there, as are hd.fits and hd2.fits (with bounding-boxes)) HOWEVER, the positions aren't very accurate, so this program has the capability of reading a Tycho2-to-HD cross-reference catalog: http://cdsarc.u-strasbg.fr/viz-bin/Cat?IV/25 */ #include #include #include #include #include #include "kdtree.h" #include "kdtree_fits_io.h" #include "starutil.h" #include "fitsioutils.h" #include "starkd.h" #include "boilerplate.h" #include "errors.h" #include "bl.h" #include "tycho2.h" #include "tycho2-fits.h" static const char* OPTIONS = "hR:d:t:bsST:X:"; #define HD_NENTRIES 272150 void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " ( [-b]: build bounding boxes\n" " OR [-s]: build splitting planes )\n" " [-R Nleaf]: number of points in a kdtree leaf node (default 25)\n" " [-t ]: {double,float,u32,u16}, default u32.\n" " [-d ]: {double,float,u32,u16}, default u32.\n" " [-S]: include separate splitdim array\n" " [-T ]: path to Tycho-2 catalog.\n" " [-X ]: path to Tycho-2 - to - HD cross-ref file.\n" "\n" " \n" "\n", progname); } // the Tycho-2 and cross-ref fields we care about... struct tyc { // from Tycho-2 int16_t tyc1; int16_t tyc2; int8_t tyc3; double ra; double dec; float mag_BT; float mag_VT; float mag_HP; // From X-ref int hd; // number of Tycho-2 cross-refs for this star. uint8_t ntyc; }; typedef struct tyc tycstar_t; static int compare_tycs(const void* v1, const void* v2) { const tycstar_t* s1 = v1; const tycstar_t* s2 = v2; int d; d = s1->tyc1 - s2->tyc1; if (d > 0) return 1; if (d < 0) return -1; d = s1->tyc2 - s2->tyc2; if (d > 0) return 1; if (d < 0) return -1; d = s1->tyc3 - s2->tyc3; if (d > 0) return 1; if (d < 0) return -1; return 0; } static tycstar_t* find_tycho(tycstar_t* stars, int N, int tyc1, int tyc2, int tyc3) { tycstar_t key; key.tyc1 = tyc1; key.tyc2 = tyc2; key.tyc3 = tyc3; return bsearch(&key, stars, N, sizeof(tycstar_t), compare_tycs); } static int compare_hds(const void* v1, const void* v2) { const tycstar_t* s1 = v1; const tycstar_t* s2 = v2; int d; d = s1->hd - s2->hd; if (d > 0) return 1; if (d < 0) return -1; return 0; } static tycstar_t* find_hd(tycstar_t* stars, int N, int hd) { tycstar_t key; key.hd = hd; return bsearch(&key, stars, N, sizeof(tycstar_t), compare_hds); } int main(int argc, char** args) { int argchar; kdtree_t* kd; int Nleaf = 25; char* infn = NULL; char* outfn = NULL; char* tychofn = NULL; char* crossfn = NULL; char* progname = args[0]; FILE* f; tycstar_t* tycstars = NULL; int Ntyc = 0; int exttype = KDT_EXT_DOUBLE; int datatype = KDT_DATA_U32; int treetype = KDT_TREE_U32; int tt; int buildopts = 0; int i, N, D; dl* ras; dl* decs; dl* hds; fl* mag1s; fl* mag2s; fl* mag3s; int nbad = 0; int nox = 0; int* hd; double* xyz; qfits_header* hdr; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'T': tychofn = optarg; break; case 'X': crossfn = optarg; break; case 'R': Nleaf = (int)strtoul(optarg, NULL, 0); break; case 't': treetype = kdtree_kdtype_parse_tree_string(optarg); break; case 'd': datatype = kdtree_kdtype_parse_data_string(optarg); break; case 'b': buildopts |= KD_BUILD_BBOX; break; case 's': buildopts |= KD_BUILD_SPLIT; break; case 'S': buildopts |= KD_BUILD_SPLITDIM; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (optind != argc - 2) { printHelp(progname); exit(-1); } infn = args[optind]; outfn = args[optind+1]; if (!(buildopts & (KD_BUILD_BBOX | KD_BUILD_SPLIT))) { printf("You need bounding-boxes or splitting planes!\n"); printHelp(progname); exit(-1); } if (tychofn || crossfn) { if (!(tychofn && crossfn)) { printf("You need both -T and -X to do cross-referencing.\n"); exit(-1); } } if (tychofn) { int i, N; tycho2_fits* tyc; FILE* f; int nx, nox; int lastgrass = 0; tyc = tycho2_fits_open(tychofn); if (!tyc) { ERROR("Failed to open Tycho-2 catalog."); exit(-1); } printf("Reading Tycho-2 catalog...\n"); N = tycho2_fits_count_entries(tyc); tycstars = calloc(N, sizeof(tycstar_t)); for (i=0; ityc1; tycstars[i].tyc2 = te->tyc2; tycstars[i].tyc3 = te->tyc3; tycstars[i].ra = te->ra; tycstars[i].dec = te->dec; tycstars[i].mag_BT = te->mag_BT; tycstars[i].mag_VT = te->mag_VT; tycstars[i].mag_HP = te->mag_HP; } tycho2_fits_close(tyc); printf("Sorting...\n"); qsort(tycstars, N, sizeof(tycstar_t), compare_tycs); Ntyc = N; f = fopen(crossfn, "rb"); if (!f) { SYSERROR("Failed to open cross-reference file %s", crossfn); exit(-1); } nx = 0; nox = 0; while (TRUE) { char buf[1024]; int tyc1, tyc2, tyc3, hd, nhd, ntyc; char ftyc, sptype0, sptype1, sptype2; tycstar_t* s; if (!fgets(buf, sizeof(buf), f)) { if (ferror(f)) { SYSERROR("Failed to read a line of text from the cross-reference file"); exit(-1); } break; } if (sscanf(buf, " %d %d %d%c %d %c%c%c %d %d", &tyc1, &tyc2, &tyc3, &ftyc, &hd, &sptype0, &sptype1, &sptype2, &nhd, &ntyc) != 10) { ERROR("Failed to parse line: \"%s\"", buf); } //printf("%i %i %i %i %i %i\n", tyc1, tyc2, tyc3, hd, nhd, ntyc); s = find_tycho(tycstars, Ntyc, tyc1, tyc2, tyc3); if (!s) { ERROR("Failed to find Tycho-2 star %i-%i-%i", tyc1, tyc2, tyc3); nox++; } else { s->hd = hd; s->ntyc = ntyc; } nx++; } fclose(f); printf("Read %i cross-references.\n", nx); printf("Failed to find %i cross-referenced Tycho-2 stars.\n", nox); printf("Sorting...\n"); qsort(tycstars, N, sizeof(tycstar_t), compare_hds); } f = fopen(infn, "rb"); if (!f) { SYSERROR("Failed to open input file %s", infn); exit(-1); } ras = dl_new(1024); decs = dl_new(1024); hds = il_new(1024); mag1s = fl_new(1024); mag2s = fl_new(1024); mag3s = fl_new(1024); printf("Reading HD catalog...\n"); for (;;) { char buf[1024]; double ra, dec; int hd; float mag1, mag2, mag3; mag1 = mag2 = mag3 = 0.0; if (!fgets(buf, sizeof(buf), f)) { if (ferror(f)) { SYSERROR("Failed to read a line of text from the input file"); exit(-1); } break; } if (buf[0] == '#') continue; if (buf[0] == '\n') continue; if (sscanf(buf, " %lf| %lf| %d", &ra, &dec, &hd) < 3) { // ignore three invalid lines if (nbad > 3) { ERROR("Failed to parse line: \"%s\"", buf); } nbad++; } else { if (tycstars) { tycstar_t* s = find_hd(tycstars, Ntyc, hd); if (!s) { //printf("Failed to find cross-ref for HD %i\n", hd); nox++; } else { ra = s->ra; dec = s->dec; mag1 = s->mag_VT; mag2 = s->mag_BT; mag3 = s->mag_HP; } } dl_append(ras, ra); dl_append(decs, dec); il_append(hds, hd); fl_append(mag1s, mag1); fl_append(mag2s, mag2); fl_append(mag3s, mag3); } } fclose(f); N = dl_size(ras); printf("Read %i entries and %i bad lines.\n", N, nbad); if (dl_size(ras) != HD_NENTRIES) { printf("WARNING: expected %i Henry Draper catalog entries.\n", HD_NENTRIES); } if (nox) { printf("Found %i HD entries with no cross-reference (expect this to be about 1%%)\n", nox); } hd = malloc(sizeof(int) * N); il_copy(hds, 0, N, hd); il_free(hds); for (i=0; i #include #include "constellations.h" #include "stellarium-constellations.c" struct shortlong { char* shortname; char* longname; }; typedef struct shortlong shortlong_t; /* lynx -dump -nolist \ http://www.astro.wisc.edu/~dolan/constellations/abbrevs.html \ | awk '{L=""; for (i=3;i<=NF;i++) L=L (i>3?" ":"") $i; print "{ \"" $2 "\", \"" L "\"},"}' */ /* Note, these are in alphabetical order, while the Stellarium constellations are listed in some other order. */ shortlong_t shortlongmap[] = { { "And", "Andromeda"}, { "Ant", "Antlia"}, { "Aps", "Apus"}, { "Aqr", "Aquarius"}, { "Aql", "Aquila"}, { "Ara", "Ara"}, { "Ari", "Aries"}, { "Aur", "Auriga"}, { "Boo", "Bootes"}, { "Cae", "Caelum"}, { "Cam", "Camelopardalis"}, { "Cnc", "Cancer"}, { "CVn", "Canes Venatici"}, { "CMa", "Canis Major"}, { "CMi", "Canis Minor"}, { "Cap", "Capricornus"}, { "Car", "Carina"}, { "Cas", "Cassiopeia"}, { "Cen", "Centaurus"}, { "Cep", "Cepheus"}, { "Cet", "Cetus"}, { "Cha", "Chamaeleon"}, { "Cir", "Circinus"}, { "Col", "Columba"}, { "Com", "Coma Berenices"}, { "CrA", "Corona Austrina"}, { "CrB", "Corona Borealis"}, { "Crv", "Corvus"}, { "Crt", "Crater"}, { "Cru", "Crux"}, { "Cyg", "Cygnus"}, { "Del", "Delphinus"}, { "Dor", "Dorado"}, { "Dra", "Draco"}, { "Equ", "Equuleus"}, { "Eri", "Eridanus"}, { "For", "Fornax"}, { "Gem", "Gemini"}, { "Gru", "Grus"}, { "Her", "Hercules"}, { "Hor", "Horologium"}, { "Hya", "Hydra"}, { "Hyi", "Hydrus"}, { "Ind", "Indus"}, { "Lac", "Lacerta"}, { "Leo", "Leo"}, { "LMi", "Leo Minor"}, { "Lep", "Lepus"}, { "Lib", "Libra"}, { "Lup", "Lupus"}, { "Lyn", "Lynx"}, { "Lyr", "Lyra"}, { "Men", "Mensa"}, { "Mic", "Microscopium"}, { "Mon", "Monoceros"}, { "Mus", "Musca"}, { "Nor", "Norma"}, { "Oct", "Octans"}, { "Oph", "Ophiuchus"}, { "Ori", "Orion"}, { "Pav", "Pavo"}, { "Peg", "Pegasus"}, { "Per", "Perseus"}, { "Phe", "Phoenix"}, { "Pic", "Pictor"}, { "Psc", "Pisces"}, { "PsA", "Piscis Austrinus"}, { "Pup", "Puppis"}, { "Pyx", "Pyxis"}, { "Ret", "Reticulum"}, { "Sge", "Sagitta"}, { "Sgr", "Sagittarius"}, { "Sco", "Scorpius"}, { "Scl", "Sculptor"}, { "Sct", "Scutum"}, { "Ser", "Serpens"}, { "Sex", "Sextans"}, { "Tau", "Taurus"}, { "Tel", "Telescopium"}, { "Tri", "Triangulum"}, { "TrA", "Triangulum Australe"}, { "Tuc", "Tucana"}, { "UMa", "Ursa Major"}, { "UMi", "Ursa Minor"}, { "Vel", "Vela"}, { "Vir", "Virgo"}, { "Vol", "Volans"}, { "Vul", "Vulpecula"}, }; int constellations_n() { return constellations_N; } static void check_const_num(int i) { assert(i >= 0); assert(i < constellations_N); } static void check_star_num(int i) { assert(i >= 0); assert(i < stars_N); } const char* constellations_short_to_longname(const char* shortname) { int i; int NL = sizeof(shortlongmap) / sizeof(shortlong_t); for (i=0; i= 0); assert(i < constellation_nlines[c]); lines = constellation_lines[c]; *ep1 = lines[2*i]; *ep2 = lines[2*i+1]; } dl* constellations_get_lines_radec(int c) { dl* list; const int* lines; int i; check_const_num(c); list = dl_new(16); lines = constellation_lines[c]; for (i=0; i #include #include #include #include #include #include #include #include "starutil.h" #include "bl.h" #include "mathutil.h" #include "an-endian.h" const char* OPTIONS = "h"; // size of entries in Stellarium's hipparcos.fab file. static int HIP_SIZE = 15; // byte offset to the first element in Stellarium's hipparcos.fab file. static int HIP_OFFSET = 4; void print_help(char* progname) { //BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" "\n", progname); } static char* const_dirs[] = { ".", "/usr/share/stellarium/data/sky_cultures/western", // Debian "/home/gmaps/usnob-map/execs" // FIXME }; static char* hipparcos_fn = "hipparcos.fab"; static char* constfn = "constellationship.fab"; static char* hip_dirs[] = { ".", "/usr/share/stellarium/data", // Debian "/home/gmaps/usnob-map/execs" }; typedef union { uint32_t i; float f; } intfloat; static void hip_get_radec(unsigned char* hip, int star1, double* ra, double* dec) { intfloat ifval; ifval.i = *((uint32_t*)(hip + HIP_SIZE * star1)); v32_letoh(&ifval.i); *ra = ifval.f; // Stellarium stores RA in hours... *ra *= (360.0 / 24.0); ifval.i = *((uint32_t*)(hip + HIP_SIZE * star1 + 4)); v32_letoh(&ifval.i); *dec = ifval.f; } int main(int argc, char** args) { int c; FILE* fconst = NULL; uint32_t nstars; size_t mapsize; void* map; unsigned char* hip; FILE* fhip = NULL; int i; pl* cstars; il* alluniqstars; sl* shortnames; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); } } if (optind != argc) { print_help(args[0]); exit(-1); } for (i=0; i #include "kdtree_fits_io.h" #include "kdtree.h" #include "errors.h" #include "starutil.h" #include "hd.h" hd_catalog_t* henry_draper_open(const char* fn) { hd_catalog_t* hd = calloc(1, sizeof(hd_catalog_t)); hd->fn = strdup(fn); hd->kd = kdtree_fits_read(hd->fn, NULL, NULL); if (!hd->kd) { ERROR("Failed to read a kdtree from file %s", hd->fn); return NULL; } return hd; } int henry_draper_n(const hd_catalog_t* hd) { assert(hd); assert(hd->kd); return kdtree_n(hd->kd); } void henry_draper_close(hd_catalog_t* hd) { if (!hd) return; free(hd->fn); kdtree_fits_close(hd->kd); free(hd); } bl* henry_draper_get(hd_catalog_t* hdcat, double racenter, double deccenter, double r_arcsec) { double r2; double xyz[3]; kdtree_qres_t* q; bl* res; int i; hd_entry_t hd; radecdeg2xyzarr(racenter, deccenter, xyz); r2 = arcsec2distsq(r_arcsec); q = kdtree_rangesearch(hdcat->kd, xyz, r2); if (!q) { return NULL; } res = bl_new(256, sizeof(hd_entry_t)); for (i=0; inres; i++) { double* pt = q->results.d + i*3; xyzarr2radecdeg(pt, &(hd.ra), &(hd.dec)); hd.hd = q->inds[i] + 1; bl_append(res, &hd); } kdtree_free_query(q); return res; } astrometry.net-0.67/catalogs/ic2000.fits000644 000765 000024 00000243100 12651445460 020147 0ustar00dstnstaff000000 000000 SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T END XTENSION= 'BINTABLE' / binary table extension BITPIX = 8 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 14 / length of dimension 1 NAXIS2 = 5386 / length of dimension 2 PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups TFIELDS = 4 / number of table fields TTYPE1 = 'ICNUM ' TFORM1 = 'I ' TTYPE2 = 'RA ' TFORM2 = 'E ' TUNIT2 = 'deg ' TTYPE3 = 'DEC ' TFORM3 = 'E ' TUNIT3 = 'deg ' TTYPE4 = 'RADIUS ' TFORM4 = 'E ' TUNIT4 = 'deg ' END A?:t CBuC=C@ݩ^CG!A`B;# bB•oC?ACSwpB_<# C}Pi|C v@</BÖB-;ZtC=AC3E ?C,oA6C%OA'O C5)7A0˒;  CHB# ]C(XA(ĜAArA CB;C@[dA:C@?Ayr; NB3‡fC?G+A[#;ZtqCA</CNB^BAxChsXCK_7<j lC-7A_CHŠklJAAfAS5 CB )</C?BYC8؇*B]]C"qXCPA+6<# BA~C 7‡t<1~K$CA! HC,`ApC/qQ C7OAOBC_^ C1<uC[VA"&fA sCH%BUM=qmA6AS8;t C < C=A'=<_CGM =< cB`C?#A"CSBZ5CS A0HAAg CYff<ӠmC@yXM;t;C@AB<OB3‡C?EAG!-rCƒCN!HB^oB$AںCqHO;YCb@:; mC-NB vC7gC C0DA<1~KjC[%?C\JB#< :C%~APCV>—K<~KC5F> C*+AV~C\A4C_}AL<# XC;e`A,:Zt'CCB <CoB;# C="A[CL<jRB:]B; fC9}A#WECo}[6<B`B C8-Adq Cd‘R:qA7<hCG@ʺ COw2C?AC8ANB)XAo BC8AF!COyr</BU-b6<1~K C:gA}OvC‘B(D\A䨍'AS;%tCHyK C YB C?A>4;# CV!HBg=<v`pCEhsBCX1=rX C:}A Q; COp!BAkB@7p C{A%<1~KAv`A( \ CBC=Ae@PCDA ;tdB— 4C?2AA<%CSyAuMBlB C; ~C 3A~PBbB C}‹ 'C3B*< 1C,?A^C&=ApL; C2- C;BEI< _C(`AB>CW3A√;C1 C*ANsCa^A)C^VB}<1~K }C;1Am3<# \CDNBOC=Bt33 C=sAlWCL2CwBHB I C5A-DAm =< C<C@\xCBS C0RA"<1~KkCZNAʌ;Cp!Bx@iCGh@ڐ CBt;C?#ANC:7A=C>)7A5?<1~KuCHA_;t C DZA<# C?BCVWBfB3p[<;C3UM<jCM/_BƨAncC{A,AKA(X< CAߥ</C=hAQCDyqV;<# eB2B8kQ:ZtC?33AhC7D׍BAWA P C<C@bNAd=CA/xK;ZtAB}U2<jC?Q@ޞtC0!…<CNq@\4BA;# CAS[Cڠ&;Zt oC-EAQ\CK‚B'Cw B!:oTa;Zt BƨASC>`B$jCGY<# CfFC? B"bC;A-B-`PCƒ>CL? +9</BVA]CIYU2'C@@; KC,3AJC/bBh C7hAW<ECT? iC(A;FHCX@");tC< Cw 8A'xvCHq C ffBws;ZtC?B#eCV}w< B@BPZ?;t C:49A婓CŽ ~ <# NCB9AV-CsA<AځoA@C3B*GNAUA_A7 CB</C@hA0>C@BV;tBBLŠffC?IAOBuCIff=CO&%ABbA"C +<\C3Bd" `C-mA;[C'+-=*C.:^  C,A^zCBUA C0mB;mCZ AZC/A5< =C%?‚}:ZtCTNB3;CB-@l C* PAFu%C] [7C`&An [C;oApc :CD5A_CqwAa CcTB$.kCGHsBf( < CAu%;%C?ABLC; 7AA|;%A Am A*AGy CŠ*C=fAkwSCE$Ae`<gBNMj<\)C? B";ZtjCKCQNA@VBKgWT9AgA˒I;t CBcC@9B<?CA.AaCB„C?UA[;ZtvC/sKCNBb|;# BACL); ]C?v;% aC,G;ZtC BfC.ÖS$C%CTACfLDg;Zt C*oA]\)C\BBCZB?ߊ \C;mAW#:;CD yB bCqA"4; CffB$lCG@P; C A:tC?ȴB C;!HAp/Ba<1~KRC/ƒ; C7A8+kGCS: kC(AA/JCX-A;Zt>33A5 C徫*eCiFfUUAAKw<\)CA?C ;*A$cv; ~CRAߟ!</CBB!B33> Cs3zD<# 1C> AUHCBA)Q< C 3BffC?lJACVA;t B70C‚CM1B^BB CWACh )C,!AC+yA;t C6Adc #C+A; wC)A@=VCY$A=;ZtC!D= C*ZA;ChOBM;ACb@㺲 C)AItCFCB.ǮA3b;%AffA CGmA%C=A\"TCD+Bp</xBB2.C?9A$kCAem> C*AbL0;C_'-C^BY qC;ĜA҉;ZtPCD38C B6z<# CB;A4<\)CCPbA-wC%x\@䪤9a; &BĜA4JC>VAk4nA Jy>< C6C@U4UUUBc7Aª C:MPA7Cxs<# !B>R:BuD; uA33B</ C9@ըxCVzj<B׊=BH; AAĤzA(iCDBV;ZtC\,B+ 9C;!ArCCBTCp'A CA!<\) C%Ai; CBAB ?!;% CB Bu2C> AICBoA C Ba+AABwg=* CMAMC=AgUCE&fBS<1~KyBÙAff>UUUC?9AlC b!<CQlA;# BRoA=C‚f]qApAyv CwB;C@c ;%1C?A;# EBˆHCB:tCM3B^Em:ZtBAACjw_C yAvA;nCG@û C ;A<C?ФB!yXC;AqP<# !BVtT*gCiA C)xA>jCE!AŚBSid C:vFA&@C==B/PcS<# RA5BL<# fCBBp;ECRBDt<BƭCB<# A"4<CAvFBjCͲqXyVAM"<# JCC*=A& C )A{C?b BKCYA|</ BA0CR<1~KhC2A}</BbAaCo}AC$@'L +C,,A,C,/BjPb<# C63Ac33%CR?*; IC(JA9I(CUPNCS3B;t C+\AsCiy@CCc2C-AZ@<1~KBCAB! !C K^BkkAHKAMj< C$ZR.I4CTvBAoCK C*AZ\C^+B/C_P@H<# sC;ФAEO:tRCDlJB <# CFA Cg+ABA|A CB$C@B 2C?\A|<1~KFBs3?ICLBCM!B^BĜA&;tC@ۻPCX< dC-'A:C@C/A'|CD^BkCsBBz%`=A8B<CC5AsC{B$B&' B`A`;# (C=A?oCGwf<1~K C[dAC?ݲB"D; C<#AvX"B;WOUCٚo%CM6AȀB A2CbA_KCCcA  C BA|C?dB߾CY AΣ:<jBB$=/1CE?[ AAwfCCiB\)CF`BUAﴢ< CǮBfC=kA; WCE+{B33wfwBnCBY8<%@`';Zt 9B޸A]eAA+A C A@C@B P3C?AGBlJgJC$Z!-:tCMB^MBLACBQCu!F;t eC-A/C,8 C+A[C @[M C.aA&; bCZ PAtT<# CTAGp 2C#BUCSfBGC@4D</ C)AD8C[Ai; C[RA PC;PA> ?CD0A)Ct7BT <# C<˅A#CJ9ʫ;t*B"6@EY` ~C9aHA]C2^9<BigC%< C:UA LB#<# HAm QyClBܟ C)|A1HlCE B׍Akp;LCCu*0<1~K Cf‹h:ZtC?vFApCYVAϓ@;ZtBUz2C<:Bg:tC"BAD$;t C7!AGpHCDKB 2CA C:A CO/</cB>3AQ C<=AȀCIBlBra,MAA3Ý; C@|C=yXAs(C>zAt|Bs3?C?A%oC@bA;ZtCQAgPH;%B`AKCfvCwpB9‡&<\)Cq fAe; AA C AfB$w:tIAo \!U*B72BK!;>Cނ; BC,A?C*+A C71\C Y `C(ŢAFOCXfA<1~KCLA4; C)yB 5A(J; MCD=/AAB[ C AC?vAICY4AA<# B~Lw3C^8S<%kCu?AN(BVA)<CٺAAAҽƌ CYsA<</}BdB{C?TB$; `CmqCT1A <B}qAEC)@pwC.BH1B6<# CC1Ae,<1~K C+fASC$?7 C5B;%C4W = (C!7B;Zt7CWmm3C&f C*A‰C`l,iACAA2 C JAECAgw5C?AL RC;FA l1CC?B$tCu"> C<=@CITA,B#c@F5 pC91AR_C^wTVmBhtneߊ C:cTAD(<\)C`B1?*&B>fB"JAvخy<# C9=A>}CTZBBwBQ[<jBYKBK CAKDBP}Ch`C;AvCC`Am)CqTA C8FtA C< A@DhCڠB+>B<\) 8C8A;CffkCChBϑC}xjA;AAӻ CYff<ӠmC='Ay*C>yAI7AOAA% C AU;C@'A_6C?A;ZtZB&fff<MCzp<1~KCNQ'A<1~KBIA=B+;%TCHA ;t xC-AP!-C-oA =; C+bA-rCAj \;t C/hsBeCZ%z<Cd* 5C#3BCSq'.ffCdA3'< C)A+vC\Az<1~KC@lqAچ C<A=iCW<BThN@;AxA^ C\B C=A;+C?33#33BTB 'RC?A1bCTq,UU CSL; CRNAr C*DA@ffCdRo<~K$C^ot< HC;CAWCDJA C}B|v C=A&CL!HABB)#QN4A,A AQ. C RAfA) JC݆Y;ZtB R Cu_<0C5yXJm; C+A%'hCJ.; C5AS;C,> +C"BW CSW'FAӮ(CDC~AS&<# C=(1@߹<CL$CB)b<# C<+A>vCdŽBvg<# C8AJCؓ>]BbUAaAخ7r< C9! |B&fAު3AK;tA33AI C A홚C@mg$C8TA <\)\B–OCq"h}@VC3B, zC-AZvC-\BD, C7b Ag</tC^Be?UU C2 A;ZtgCZj!C1?)9BHB' COBYH<# C:A_Ci0B)gw)A2ff"}CBRA\C#3BٚBAꙚACCsAC7†D#AA%<1~K wC-A</CBB)*BxH C`r<% C=<)AWACB(w C AmC?3B!bCX@A⪙B~YX7CAoCև@cx</B\B5CˆACƨR>< "C, AC#+#<j C6RA#u;ZtUUU @C&3</CVA<# C%;Zt C+ALQCk;AZCcdBx nC;AURMCD94Cy8BB !B<A>BAe;# CWLAC=AI?-C?LAI</qB–GzC?B; dCHn&CUN@L,B\ACͲ%YCM!LI8RA<1~KAҋDA*b<1~K CAK:ZtC@;  C8XAy<1~K]B/L!@C3ff<~KCPl@X-M@W*;WCM&< {C-sA+%FC-/A C7lAV<uCHPr C2!Hw޾xC\ 1Cawl:BFͿ<\)NA$AOlw HB7AB'CBB!OB"@v< C" B ;% C=FAIBCBA C A4<# C?ФA2MCXAELBEoC%`CD;%BJAg;ZtC?A</CylH<# #C,A6LC#u;I C6ZW=C_; AC&3ffB*=!6zA}Ay>A,PH<1~KAA CZA(C=NA&S.C?dZxrB A >C?0bAE<eCƒ\CU@H\h<1~KBA5tCHs†_<LCm@C</BACA2YC6bA}V;t C+RAJjC4<\) C5ٚAOCiA -C"rBt CS ; C^?& C*uA"cCeB;Zt'C_ @ KC;AA"*CD APC BA C=*=A1<CLAFEB-A iC9$ZAaHCu>wA2<ABrh$ CZA);# C@3g;t C8ٚB`^Bhœ AC7Lƒ2CPD3BH1AGzC|J4(CQA*W?</ |C. A~C-BC C7yARvC;A;t C2@yC[yA}Ɇ;Cht<1~K CAٴCp „Cg BC'DA;0!CU)K^CW1'; C+A"CiBA\CfzAA<# `C;oABOCDrACzfBjw C:ACQN<zBGjFf= C<A44nmC-i|PBpcTB</ =C8^@vKCŒt,JAA:i< CBeC@^wBk;/C?A>;ZtsB; C?2ARfCƒRPA61A>A(scB <\)xCIs3A\ C 6FA;C@A1J#C:}A<# ;B&fA.CöA؋DCLBGC8AcCщ‘uB[J;<BQF%R[ C9-AC,BAR@XdA\CBA=;CJB_BBnAͿ<jCC%BI<C@Bvv3AA- C-p]~;ZtC@nVA C<|jAuCA 6H8CB.VIbMPAAffAM C AÑCA^<j C8wA+k<1~KPB^Oˆ!CCInn/CPB\)A$C3=BFKs;tAA^PH;0 C9ABtCբŒ@B33hA;@[<jCA+BECnha[AP@#t oC A6CCACBw% C MPAv+<C@ A4CVA;t+k<\) &C,?A~C!B C6AUKw;t DC'sAA|#CU/<1~KC?}< C+%ACiB-$wBM;0< C:ACOBӏUU{C>wBAaB C+B=C@qAA!CACD33OCqADcO\AT,AK C A#C@Aa C9TAo_p<QBfDCMnBHi+;tBA_u;% C9A楯</uCN>B)RAK)AsZCA 7ByCp</\AB;% `CBF; CCBoC~APA! BAG#C=A#:?&ffAzCJd< C `AAb; CHAiD C*JA6vCt) XsCh[B* C)sA[fCDAƈ</CO}Be 6C;AY \<CCB"CqVA[&< CAбAg<# CC3AR;%C>5m@W5TA (B?AD|C>AR33Ac BM C=BnC@hfY"CC`< !CK=CQ <CS3A7A<A՛ 1'; C 8RBh$C@Ӷi-A BDA]d$C=3AD?+iA0{CJ>)Z;# C aA)C@`B";CW,@>B׾!C ACMsB^BBC4<ClBJ<j \C,AOiC)&_P C6WA_ߤVCD9?Ks zC)&AYCYٚ.Cf; C*oA2Cj@atCmZA C)AKgCDBq CBCc=*BBDA{X%;tBIACo\;BoBA=A]/U; C AB`C?AoC9iyA{ABRH? C9AIC!H<BW@dZ</ @ZA PCB5Bյ?Cc$Bx`AxA9<CC=qA~C\]Q'KHBB";tC?`A{C-A;%CTbAmNBKACpBC'A'<1~KBACn<,C3͑3j; C+A_e,`C C5sK;tCYyB$? #CcT1CQIOC`@&T C*^ACbd,; =CaVA<# AC;,ANAAJ#?=˫; C H=.{C?A1C6ABIzCM\B^hBNBxC8^ CBd< ^C,^H;# C,$ݿР< C6zAP6* WC8A:6C QnBؓ@BX/,<!A!@:tuCBA#:TCڠjBt = OBACBڠBAG C\ Z7;Ca<RCd{@Q fC;-AZ\<# ECD] 3C8qACj\ɠ<# JBT!><BSIJ<1~K C9A,C…B@S3A[IBߤȄ<\)C?cTA-|C+€CaA BC;,Ac;Zt!CC\ACro@;d<% C=fA<1~KCKB8<1~K\B=3B# `C9A[OCAOzAA C9AmC)7gyB%"<Aff+v` C0A[pC[t9-'C=qAѷ?\ ‚d~CKAc< C'B)<C@-ACV3B331B2$CgYCNh1GIRBAC/A </ CLA]<6; dC,“m<1~KBqA 4C8/Aj@CB^-<1~KKBTQ>BRT C9AXCwU<B@d;Zt@ò-B; RCB=qB1Cf%iA@6Ae`A5CCwAtC8@:A ,B+AC; pC>ɺAl"A!z< C=; JBZ<C?b AUO<}C‚LCT~; B A Cl~;# DCA'33; hC-49AHCTA,C4LAaCA7BC%#;# uAͿ AB8;%CBBCX€%B3hDg;t Br-A\C>AXMAm;t C Mڏ\;%C?PB"~]C7BVB<–YCDCNB$ ;BjAIC ‡ CA%;% tC-yA(C1 ASV C72oA (NCO4 C1E`DԕqCZAy*@)H C7B </CkA\)lCk+AqA</ C*:^AF C_`!C] A)_ /C:A"CC5AjCpQhAk CA1?t ACK-B C?A3<C@?}fc <CWAZ<2B^e<%CnV <\)CM'B^uBBq7f</CΘg=aG C= PC,VAE1C,FAБ<1~K C6 Ae*C{sz ~C)CTAO*]CY8#CA?X C+A;JCiA` ;ZtHCc A</ C)hA;+{CG} ~<CbAK </ C:A CNRBa;%A+A~ CcBz^;%C@>B"bN; 'C>P:;# KB3@`C?lA1~C^CT~A4A{A8A_ C cv>C@A;C7ARWB<ZCФ%A+pCGf@û CXT,C?ZACX&@"3Bn; &CP‡ </CMB^BxRBbC‚;tCuB0 b;$A$AߤHCBBWC,kB>A0UB}Il:tCCL;CBf <\)>AjA<< BB0AqCBA)<1~KA?q<# C`nC=AH@j\CFA;`BAC?ACRR"A BA|V<1~KCxs@OzC :@<1~KB9BpCA4C2> ;% =C,h1AMC%0bA(E< C4@[}k7C3 [C(AC,:CWA,q; C C*3AKC`/A̪0;UCeD@28 yC;ؓAOvXCDwLBYCwhA6e C=ZA؟VCPdAx;%sBGfB&33 C<AEqfCVzBmRS<# 6C8A]SCr<MBV BNlB C9AC3B33=LB/A.@eB@;%TCBZA?3CfYKkAffAn!<# AAAڧ=SmCCoB!4C}l@ffUU2 .BAPHrC>oA3a;AMjA- CBh$C@DB8C@l");LB3@`C?CTAC‚dCTA=;BACx!-<~KFCBA</ jC-6ANUC‚eFC4ٚBR C+AILdC@- C0oBgCVfAK 'C\jCR"l<# C'9 C*AH:Cb AW<1C_\@g EC;1A$CCBCqmAO:Zt C=A9CL&A;;_B>33B# cC9A{;# BCMY4Bg?M C8!AC"&<)BANB(+}AffBUM C9kA`C}/8PA rAچg< CD=C@mAC7A(B'A[C =CP&%?Qu)AچqCG)A}CNwGmBB;d;tCuC,hAyC% ]j C5,?D(</CBQ<1~K \C(AG+;CXA C C*uAQ lCc;—<,VCd`B<1~K zC;ڠA]dYCDA.CxJB9h<1~K C=A1CL)ydtBCM[DM-AA0AA@c5< CCAl;# C@A1C8s@{'C]@Aff;ZtC]H?#%<# "C:AՅCCBkCpfA{33 C<@CJh炙+AFrCHmA~\) C BԢC?A,; CfAeastrometry.net-0.67/catalogs/ic2000_pos.txt000644 000765 000024 00001764310 12651445460 020716 0ustar00dstnstaff000000 000000 I0001 00 08 27.2 +27 43 05 3 1.54 2.08 HC WS GSCm I0001 ne * 00 08 27.66 +27 43 09.7 1 GSC I0001 sw * 00 08 26.83 +27 43 03.7 1 GSC I0002 00 11 00.8 -12 49 19 2 1.03 2.83 HC WS I0003 00 12 06.072 -00 24 53.55 4 1.42 1.43 HC KHJ Pds UZC I0004 00 13 27.03 +17 29 09.9 5 2.18 3.06 UZC WS HC CCA DC I0005 00 17 34.901 -09 32 35.46 3 0.70 1.10 HC GSC KHJ I0006 00 18 54.87 -03 16 32.3 4 3.40 3.50 HC WS GSC Pds I0007 00 18 53.1 +10 35 40 4 2.83 4.27 HC WS Pds2 UZC I0008 00 19 02.44 -03 13 17.9 3 4.98 4.48 HC WS GSC I0009 00 19 44.2 -14 07 18 2 0.00 0.00 HC WS I0010 00 20 24.13 +59 17 33.8 4 5.02 4.30 CCA HCo WS GHD1 I0011=N0281 00 52 59.3 +56 37 18 1 HC I0012 00 20 15.0 -02 39 09 2 3.18 4.95 HC WS I0013 00 20 20.18 +07 42 01.4 5 1.24 1.49 WS UZC CCA Pds HC I0014 00 22 31.3 +10 29 25 2 0.00 0.71 WS HC I0015 00 27 57.6 -00 03 42 2 1.06 0.71 WS HC I0016 00 28 07.9 -13 05 37 2 3.10 4.24 WS HC I0017 00 28 29.7 +02 38 55 3 0.87 3.61 WS HC UZC I0018 00 28 35.0 -11 35 11 3 0.85 1.73 HC SPC WS I0019 00 28 39.398 -11 38 26.14 3 1.32 1.16 HC KET2 KHJ I0020 00 28 39.696 -13 00 36.55 3 0.21 4.52 KHJ HC Pds2 I0021 00 29 10.34 -00 09 49.8 3 2.84 0.64 HC WS GSC I0022 00 29 33.1 -09 04 48 2 0.00 2.83 HC WS I0023 00 30 50.852 -12 43 09.95 2 1.05 4.21 KHJ HC I0024 00 31 16.7 +30 50 22 2 0.91 1.41 HC WS I0025 00 31 12.1 -00 24 27 4 1.22 2.00 HC KET2 K04 WS I0026=N0135 00 31 45.96 -13 20 16.6 3 0.99 3.52 HCds SPC HC I0027 00 33 06.193 -13 22 18.84 2 1.04 2.06 HC KHJ I0028 00 33 08.474 -13 27 24.45 2 5.12 2.63 HC KHJ I0029 00 34 10.782 -02 10 39.00 3 1.51 3.00 Pds KHJ HC I0030 00 34 14.7 -02 05 07 2 1.06 1.41 WS HC I0031 00 34 24.622 +12 16 05.44 5 1.72 1.51 HC UZC KHJ CCA Pds I0032 00 35 01.545 -02 08 30.09 3 1.88 2.50 Pds2 HC KHJ I0033 00 35 05.0 -02 08 16 3 0.87 2.65 WS Pds2 HC I0034 00 35 36.29 +09 07 26.0 5 3.65 2.35 HC DC UZC WS CCA I0035 00 37 39.94 +10 21 28.4 4 1.41 3.29 WS UZC CCA HC I0036 00 37 49.653 -15 26 27.11 3 0.72 2.38 WS KHJ HC I0037 00 38 34.19 -15 21 29.9 4 0.76 1.54 HCds Pds2 GSC HC I0038 00 38 38.89 -15 25 09.4 3 0.74 1.50 WS HCds HC I0039=N0178 00 39 08.42 -14 10 21.4 5 2.40 1.24 HC WS SPC HCds GHD2 I0040 00 39 21.46 +02 27 21.3 5 2.25 1.46 WS Pds UZC CCA HC I0041 00 39 40.2 -14 10 29 2 3.08 2.12 HC WS I0042 00 41 05.82 -15 25 39.9 3 0.55 1.39 GSC HCds HC I0043 00 42 22.11 +29 38 29.5 7 1.95 1.91 WS DC BPP GSC UZC CCA HC I0044=N0223 00 42 15.92 +00 50 43.4 8 1.90 1.04 SPC HCds GSC DC UZC WS CCA HC I0045 00 42 36.3 +29 39 18 1 GSCm I0046 00 42 57.851 +27 15 11.58 3 2.45 0.98 HC UZC KHJ I0047 00 42 54.995 -13 44 24.36 2 0.30 3.13 HC KHJ I0048=I1577 00 43 34.5 -08 11 11 3 4.28 2.31 WS SPC HC I0049 00 43 56.18 +01 50 59.6 7 1.47 3.01 DC SPC UZC McN WS CCA HC I0050 00 46 05.6 -09 30 11 2 2.09 3.54 HC WS I0051 00 46 24.3 -13 26 31 3 0.84 2.31 WS HC SPC I0052 00 48 23.90 +04 05 29.3 4 2.08 0.91 WS UZC CCA HC I0053 00 50 40.814 +10 36 00.66 4 0.84 0.48 KHJ UZC HC CCA I0054 00 50 46.8 -02 17 18 2 1.06 2.83 WS HC I0055 00 51 42.371 +07 43 06.22 4 0.72 2.19 HC KHJ Pds UZC I0056 00 51 30.0 -12 50 41 3 0.84 0.00 HC SPC WS I0056 comp 00 51 51.232 -12 46 03.11 2 0.42 1.21 SPC KHJ I0057 00 54 48.538 +11 50 27.39 4 1.09 0.61 HC KHJ Pds CCA I0058 00 55 02.441 -13 40 41.12 2 0.03 0.01 KHJ HC I0059 00 57 28.6 +61 08 37 1 HC I0060 00 56 04.249 -13 21 29.83 2 0.32 1.90 KHJ HC I0061 00 57 07.22 +07 30 24.5 5 0.67 0.55 Pds WS HC UZC CCA I0062 00 58 43.87 +11 48 28.0 5 1.51 0.73 UZC Pds HC WS CCA I0063 00 59 28.8 +60 54 42 1 HC I0063 comp 01 00 00.7 +61 05 51 1 HC I0064 00 59 24.408 +27 03 31.84 3 1.72 0.39 HC KHJ CCA I0064 comp 00 59 03.5 +27 02 31 1 HC I0065 01 00 55.60 +47 40 53.3 5 1.78 1.99 WS UZC CCA DC SBG1 I0066 01 00 32.49 +30 47 48.8 5 1.02 1.88 WS UZC BPP CCA HC I0067 01 00 17 -06 54.6 1o Bige I0068 01 00 21 -06 56.6 1o Bige I0069 01 01 23.7 +31 02 26 4 1.05 1.15 WS UZC BPP HC I0070 01 01 03.893 +00 03 03.04 2 1.26 0.42 HC KHJ I0070 comp 01 01 08.7 +00 02 21 1 HC I0071 01 01 17 -06 46.7 1o Big I0071: 01 01 19.26 -06 46 01.8 1 GSC I0072 01 01 31 -06 45.7 1o Big I0072: 01 01 34.71 -06 46 40.6 1 GSC I0073 01 04 53.1 +04 46 01 3 0.86 1.15 HC WS UZC I0074 01 05 55.922 +04 05 28.93 4 1.89 7.81 HC Pds KHJ UZC I0075 01 07 11.67 +10 50 11.9 5 1.23 1.94 WS Pds CCA UZC HC I0076 01 08 11.7 -04 33 15 2 2.11 2.12 WS HC I0076 comp 01 08 16.9 -04 34 21 1 HC I0077 01 08 43.747 -15 25 15.56 4 0.25 0.82 GSC KHJ HC2m WS I0078 01 08 47.744 -15 50 41.35 5 1.64 1.41 WS KHJ Pds SPC HC I0079 01 08 49.6 -15 56 56 4 1.81 1.41 HC WS GHD2 SPC I0079 nearby * 01 08 50.8 -15 56 30 1 SPC I0080=I0080ne 01 08 51.11 -15 24 26.0 5 1.13 4.60 GSC HC2m HCo WS SPC I0080sw 01 08 50.67 -15 24 32.1 2 0.31 0.21 HCo HC2m I0081 01 09 22.4 -01 41 44 4 0.75 1.50 UZC HC WS Pds2 I0082 01 09 05.6 -15 59 59 2 4.07 3.53 HC WS I0083 01 10 29.7 +01 41 20 4 1.94 1.41 HC WS UZC Pds I0084 01 11 25.567 +01 38 24.19 4 1.91 0.60 HC UZC KHJ Pds I0085 01 11 49.6 -00 27 08 1 HC I0086 01 13 28.51 -16 14 25.4 3 2.21 6.44 WS GSC HC I0087 01 14 15.77 +00 45 54.6 5 1.29 1.57 HCds HC WS Pds UZC I0088 01 14 31.23 +00 47 30.2 3 0.87 2.34 HC HCds WS I0089=N0446 01 16 03.63 +04 17 39.0 6 1.71 1.99 DC UZC GSC CCA WS KET1 I0090 01 16 30.412 -07 58 38.38 3 1.05 0.77 KHJ HC SPC I0091 01 18 39.461 +02 33 14.43 2 0.69 1.74 KHJ HC I0092=N0468 01 19 48.43 +32 46 02.3 5 0.26 2.03 WS UZC GSC VPS1 SPF I0093=I1671 01 19 02.25 -17 03 37.9 3 0.92 3.38 WS SPC HCds I0094 01 20 05.49 +32 43 02.4 1 GSC I0095 01 19 17.878 -12 34 26.38 2 0.01 0.67 KHJ GSC I0096 01 20 33.28 +29 36 59.5 2 1.20 3.68 GSC WS I0097=N0475 01 20 02.048 +14 51 40.01 3 0.43 0.58 KHJ GSC Pds I0098 01 20 54.885 -12 36 16.54 3 0.39 0.51 GSC KHJ Pds2 I0099 01 22 27.30 -12 57 09.9 2 0.62 1.41 WS GSC I0100 01 22 54.018 -04 38 34.55 4 1.99 1.33 SPC KHJ GSC HC I0101 01 24 08.60 +09 55 48.9 4 1.23 1.29 WS HCo UZC CCA I0102 01 24 26.38 +09 53 11.6 4 0.81 0.56 WS GSC Pds CCA I0103 01 24 36.543 +02 02 38.98 5 1.13 1.13 KHJ CCA Pds UZC HC I0104 01 24 33.5 -01 27 23 2 2.12 1.41 WS HC I0105 01 24 46.3 +02 04 29 3 2.29 2.52 WS Pds HC I0105 comp 01 24 54.2 +02 03 26 1 HC I0106=N0530 01 24 41.72 -01 35 14.8 8 2.21 1.99 DC HCds UZC WS SPC HC CCA KEB1 I0107=I1700 01 25 24.71 +14 51 50.9 4 1.02 1.65 SPF UZC DC CCA I0108 01 24 38.99 -12 38 08.5 2 0.41 1.13 WS GSC I0109 01 25 13.04 +02 04 00.3 5 3.16 1.12 Pds WS UZC CCA HC I0110 01 25 46 +33 30.9 1o Big I0110? 01 25 49 +33 31.3 1 HCo I0111.1 01 25 49.3 +33 30 16 1o Big I0111.2 01 26 00.1 +33 29 49 1o Big I0111? 01 25 59 +33 30.2 1 HCo I0112 01 26 02.94 +11 26 36.3 6 1.56 2.65 KEBA WS STMW UZC CCA DC I0113 01 26 25.53 +19 11 30.1 2 0.00 1.77 WS GSC I0114 01 26 22.63 +09 54 35.0 4 1.09 0.05 WS HCo Pds CCA I0115 01 26 54.44 +19 12 51.0 5 0.65 1.34 UZC SPF GSC WS Pds I0116 01 26 51.0 -04 58 55 2 10.56 2.83 WS HC I0117=N0560 01 27 25.38 -01 54 48.3 8 1.72 4.07 HC WS GHD2 UZC BCG SPC CCA DC I0118 01 27 36.022 -04 59 50.79 2 0.42 0.15 GSC KHJ I0119 01 27 55.057 -02 02 26.70 6 0.82 1.58 KHJ BCG UZC SPC HC CCA I0120 01 28 12.9 -01 54 57 5 1.50 2.49 WS HC UZC BCG SPC I0121 01 28 21.81 +02 30 45.9 5 1.24 1.52 WS UZC CCA HC DC I0122 01 28 13.218 -14 50 20.49 2 0.46 0.66 KHJ HC I0123 01 28 51.515 +02 26 47.51 4 1.51 0.97 KHJ UZC KEBA HC I0124 01 29 09.00 -01 56 13.1 3 1.04 0.53 HC WS HCds I0125 01 29 18.318 -13 16 48.42 3 0.42 2.01 Pds2 GSC KHJ I0126 01 29 47.77 -01 59 01.7 4 1.71 0.30 HC WS Pds CCA I0127 01 29 47.47 -06 58 47.8 6 4.23 1.48 HC WS SPF Pds GHD2 GSC I0128 01 31 23.86 -12 37 28.1 2 0.00 1.56 WS GSC I0129 01 31 31.302 -12 39 16.62 2 0.82 1.12 KHJ SPC I0130 01 31 28.668 -15 35 29.57 3 1.55 0.24 WS GSC KHJ I0131 01 33 14.62 +30 44 55.7 1 HCds I0131 ne 01 33 14.97 +30 45 08.2 3 0.30 3.01 HCds WS HC I0131 nearby "*" 01 33 11.26 +30 45 12.9 1 HCds I0131 sw 01 33 14.00 +30 44 40.0 1 HCds I0132 01 33 15.85 +30 56 42.4 3 1.94 2.53 HC HCds WS I0132 nearby ** 01 33 14.7 +30 56 03 1 HCds I0132 nearby nw* 01 33 14.46 +30 56 08.1 1 HCds I0132 nearby se* 01 33 15.02 +30 56 00.3 1 HCds I0133 01 33 15.54 +30 53 09.0 3 4.55 6.51 WS HCds HC I0133 knot or * 01 33 16.36 +30 52 46.6 1 HCds I0134 01 33 25.09 +30 53 59.3 3 1.32 3.58 HC HCds WS I0135 01 34 15.89 +30 37 11.0 1 HCds I0135 e 01 34 16.37 +30 37 13.1 1 HCds I0135 w 01 34 15.53 +30 37 10.0 2 0.55 0.00 HCds HC I0136 01 34 15.85 +30 33 42.7 3 3.11 2.52 HCds HC GSC I0136 e 01 34 17.28 +30 33 38.7 1 HCds I0136 m 01 34 15.90 +30 33 40.8 1 HCds I0136 w 01 34 13.86 +30 33 42.7 1 HCds I0137 01 33 39.06 +30 31 20.4 2 2.75 0.85 HC HCds I0138 01 33 02.06 -00 41 24.7 4 1.47 2.24 UZC WS CCA HC I0139 01 33 59.24 +30 34 02.8 1 HCds I0139 * 01 33 59.22 +30 34 02.5 1 HCds I0139 n neighbor 01 33 59.4 +30 34 31 1 HC I0139 nw 01 33 58.51 +30 34 12.1 1 HCds I0139 se 01 33 59.91 +30 33 52.0 1 HCds I0140 01 33 58.12 +30 33 02.2 2 1.01 2.55 HCds HC I0140 w neighbor 01 33 54.34 +30 33 05.7 1 HCds I0141 01 32 51.5 -14 48 54 2 0.00 0.00 SPC WS I0142 01 33 55.70 +30 45 23.3 3 1.30 3.30 HC HCds WS I0142 ne 01 33 55.98 +30 45 28.8 1 HCds I0142 sw 01 33 55.27 +30 45 21.9 1 HCds I0143 01 34 11.20 +30 46 37.7 2 1.01 1.98 HC HCds I0143 nearby * 01 34 13.27 +30 46 27.6 1 HCds I0144 01 37 40.918 -13 18 52.62 3 1.49 0.47 KHJ GSC Pds2 I0145 01 38 38.7 +00 44 29 2 4.24 4.24 WS HC I0146=N0648 01 38 39.80 -17 49 54.0 5 0.46 2.80 HCds HC2m ESOB SPC WS I0146=N0648 comp 01 38 38.56 -17 49 40.7 2 0.20 0.42 HC2m HCds I0147 01 39 59.73 -14 51 45.9 1 GSC I0148 01 42 27.10 +13 58 36.0 3 1.25 0.40 SPF CCA DC I0149 01 42 25.62 -16 18 01.1 2 0.41 0.92 GSC WS I0150 01 42 57.55 +04 11 58.6 4 0.78 2.90 UZC SPF CCA WS I0151 01 43 57 +13 12.2 1o Sw10 I0152 01 44 07 +13 02.2 1o Sw10 I0152? 01 44 01.3 +13 04 26 2 1.03 1.41 WS Pds I0153 01 44 36 +12 37.7 1o Sw10 I0154 01 45 16.328 +10 38 56.92 5 0.73 0.14 KHJ UZC SPF CCA Pds I0155 01 47 32 +60 36.6 1o MW I0156 01 45 29.214 +10 33 09.43 5 0.99 0.27 Pds UZC KHJ SPF CCA I0157 01 45 42 +12 52.4 1o Sw10 I0158 01 45 53.478 -06 56 08.36 2 0.83 0.16 GSC KHJ I0159 01 46 25.04 -08 38 13.2 3 1.54 0.23 GSC SPC WS I0160 01 46 29.388 -13 14 53.14 2 3.55 1.94 SPC KHJ I0161 01 48 43.87 +10 30 28.5 4 2.28 1.10 GSC KET2 CCA DC I0162 01 48 53.471 +10 31 17.42 4 0.73 0.56 GSC KHJ KET2 CCA I0163 01 49 15.16 +20 42 39.2 5 2.19 2.36 WS GSC CCA UZC DC I0164 01 49 08.4 -03 54 17 2 0.00 0.00 SPC WS I0165=N0684 01 50 14.03 +27 38 46.4 5 2.10 3.53 GHD1 HCds CCA WS DC I0166 01 52 22 +61 51.2 2 10.09 4.24 BSV HCe I0167 01 51 08.48 +21 54 46.1 5 1.99 3.22 DC WS GH UZC CCA I0168 01 50 27.50 -08 31 24.3 2 0.10 2.90 WS GSC I0169 01 50 39.363 -12 40 46.54 2 0.14 0.14 KHJ GSC I0170 01 51 57.386 -08 31 03.10 3 2.05 0.65 Pds2 GSC KHJ I0171 01 55 10.34 +35 16 51.9 5 2.31 1.17 UZC WS CCA VPS DC I0172 01 54 54.2 +00 48 40 4 0.75 0.82 KEBA WS K15 UZC I0173 01 55 57.15 +01 17 05.0 4 0.76 1.77 WS SPC CCA UZC I0174 01 56 16.10 +03 45 41.9 4 0.55 0.54 SPF UZC WS CCA I0175 01 56 18.83 +01 19 55.3 3 0.17 1.21 GSC Pds WS I0176 01 56 53.43 -02 01 09.1 5 1.56 0.95 UZC SPF CCA WS SPC I0177 01 57 00.56 -00 05 22.8 3 0.96 0.00 GSC UZC WS I0178 01 58 54.88 +36 40 29.6 5 1.07 2.07 DC UZC CCA WS VPS I0179 02 00 11.61 +38 01 15.0 5 1.57 1.19 WS UZC VPS CCA DC I0180 02 00 00.441 +23 36 14.94 4 0.67 0.77 UZC KHJ GSC Pds I0181 02 00 02.269 +23 39 31.69 3 1.37 0.96 Pds2 GSC KHJ I0182 01 59 51.77 +07 24 41.5 4 0.89 0.48 WS UZC K06 CCA I0183 01 59 33.96 -05 20 48.7 3 0.82 3.09 WS GSC Pds I0184 01 59 51.16 -06 50 26.9 3 0.95 1.73 SPC WS GSC I0185 02 00 06.06 -01 31 41.7 2 0.85 0.35 GSC WS I0186 02 00 24.69 -01 33 04.2 2 4.13 2.90 GSC HCm I0186ne 02 00 25.3 -01 32 54 1 HCo I0186se 02 00 25.3 -01 33 01 2 1.06 2.83 WS HCo I0186w 02 00 23.9 -01 33 11 3 1.73 1.73 UZC HCo WS I0186 comp s 02 00 24.5 -01 33 45 1 HCo I0187=I0187w 02 01 30.67 +26 28 52.3 4 1.96 2.55 HCds WS DC CCA I0187e 02 01 33.64 +26 29 03.6 2 1.62 1.56 HCds WS I0188 02 01 46.34 +26 32 45.3 4 1.31 2.22 KEBA CCA DC LEDA I0189 02 01 52.94 +23 33 04.1 3 0.71 2.00 WS GSC UZC I0190 02 02 07.293 +23 32 59.04 3 0.18 0.67 KHJ GSC UZC I0191=N0794 02 02 29.37 +18 22 22.5 5 1.17 2.13 UZC GSC WS CCA DC I0192 02 02 32.39 +16 00 50.3 4 1.02 1.36 SPF UZC WS CCA I0193 02 02 31.06 +11 05 33.6 5 1.23 0.96 WS UZC GSC CCA Pds I0194 02 03 05.23 +02 36 49.0 4 1.23 1.75 WS UZC CCA SPC I0195 02 03 44.62 +14 42 31.3 4 1.50 0.87 UZC DC WS CCA I0196 02 03 49.83 +14 44 20.4 4 2.06 1.76 WS UZC CCA DC I0197 02 04 04.98 +02 47 11.5 6 1.53 0.99 DC WS UZC CCA K15 K06 I0198 02 06 03.14 +09 17 43.8 4 0.24 0.93 SPF WS UZC CCA I0199=I1778 02 06 19.45 +09 13 37.8 5 0.85 1.28 WS UZC SPF Pds CCA I0200 02 05 26.71 +31 10 34.0 3 0.71 4.40 DC VPS1 CCA I0201 02 07 15.287 +09 06 54.41 2 0.03 0.23 GSC KHJ I0202 02 07 28.64 +09 10 05.2 6 0.61 0.91 GSC WS UZC SPF CCA Pds I0203 02 07 29.567 +09 07 21.32 2 1.62 0.28 HCo KHJ I0204 02 07 27.067 -01 25 48.61 2 0.18 0.11 GSC KHJ I0205 02 07 27.46 -02 05 29.0 4 0.89 1.02 UZC GSC HCds CCA I0206 02 09 30.8 -06 58 11 2 1.05 2.12 SPC WS I0207 02 09 39.4 -06 55 23 2 1.05 0.71 WS SPC I0208 02 08 27.80 +06 23 40.5 5 0.76 0.95 Pds SPF WS UZC CCA I0209 02 08 58.6 -07 03 32 3 0.86 2.89 SPC WS Pds I0210 02 09 28.3 -09 40 48 3 0.00 0.00 HCo SPC WS I0211 02 11 08.09 +03 51 07.8 5 2.61 1.86 WS SPC UZC CCA DC I0212 02 13 38.251 +16 35 38.40 2 0.14 0.24 GSC KHJ I0213 02 14 04.26 +16 27 20.7 6 1.09 0.52 WS SPF Pds UZC GSC CCA I0214=I0214sw 02 14 05.68 +05 10 23.5 6 2.58 2.19 HCds WS K06 UZC CCA DC I0214ne 02 14 06.16 +05 10 35.0 1 HCds I0215 02 14 09.41 -06 48 23.8 2 2.11 1.06 WS GSC I0216 02 15 55.40 -02 00 54.7 2 2.54 0.07 WS GSC I0217=I1787 02 16 10.63 -11 55 33.2 3 0.17 0.46 HCds SPC WS I0218 02 17 07.25 +01 16 56.2 4 0.65 1.38 WS HCds GSC Pds I0218 comp 02 17 10.01 +01 16 60.0 1 HCds I0219=I0219s 02 18 38.85 -06 54 13.8 3 2.25 2.31 WS GSC SPC I0219n 02 18 37.86 -06 53 44.7 1 GSC I0220 02 19 11.87 -12 46 53.9 2 0.52 1.34 GSC WS I0221 02 22 40.97 +28 15 24.2 5 2.84 2.02 VPS1 WS UZC CCA DC I0222 02 22 47.99 +11 38 16.2 4 2.46 2.04 GSC WS UZC Pds I0223 02 22 01.00 -20 44 45.1 3 1.19 1.12 HCds WS HC2m I0223 nw knot 02 22 01.17 -20 44 42.9 1 HC2m I0223 se knot 02 22 01.26 -20 44 48.5 2 0.40 1.13 HCds HC2m I0224 02 24 45.27 -12 33 51.4 3 0.94 1.32 GSC WS Pds I0225=??N0867 02 26 28.288 +01 09 37.37 7 0.81 0.69 HCds K04 UZC KHJ GSC CCA KET2 I0226 02 27 45.81 +28 12 32.4 4 2.74 1.83 WS GSC KLS1 CCA I0227 02 28 03.58 +28 10 30.1 5 1.27 1.23 WS VPS1 GSC UZC CCA I0228=N0944 02 26 41.60 -14 30 57.3 4 1.22 1.15 HCds HC2m WS SPC I0228=N0944 comp 02 26 39.24 -14 30 44.3 1 HCds I0229 02 27 22 -23 48.8 1o JT I0230 02 28 47.25 -10 49 53.0 3 0.70 2.06 WS GSC IPds I0231 02 29 56.372 +01 10 44.00 5 0.89 0.50 UZC GSC KHJ Pds CCA I0232 02 31 11.558 +01 15 55.78 5 1.67 1.10 DC Pds UZC KHJ CCA I0233 02 31 40.68 +02 48 35.8 4 0.21 0.99 UZC WS HCds GSC I0233 comp 02 31 41.55 +02 47 56.0 1 HCds I0234 02 31 37.7 -00 08 22 4 1.50 1.50 K04 UZC WS KET2 I0235 02 32 50.69 +20 38 31.2 5 3.09 6.04 DC SDP WS UZC CCA I0236 02 32 55.826 -00 07 52.75 2 0.06 0.46 KHJ GSC I0237 02 33 31.56 +01 08 22.0 4 0.71 1.44 UZC GSC WS Pds I0238 02 35 22.76 +12 50 15.6 5 0.46 2.50 Pds UZC WS DC CCA I0239 02 36 27.88 +38 58 08.2 6 2.62 2.37 GHD1 UZC VPS CCA WS DC I0240 02 38 58.4 +41 43 08 2 2.38 1.41 WS HCo I0241 02 37 54.41 +02 19 38.4 4 2.61 0.96 DC WS UZC CCA I0242 02 38 24.0 -06 56 02 2 1.05 0.00 HCo WS I0243 02 38 32.178 -06 54 08.70 3 0.92 1.66 GSC KHJ SPC I0244 02 39 24.71 +02 43 39.9 3 0.35 3.44 WS UZC GSC I0245 02 38 54.52 -14 18 22.7 2 1.44 1.48 WS GSC I0246 02 40 28.607 +02 28 42.59 4 0.30 0.62 GSC KHJ Pds UZC I0247 02 40 08.788 -11 44 02.86 2 0.25 1.83 KHJ SPC I0248 02 41 25.71 +17 48 42.8 5 1.98 2.01 DC WS UZC GSC CCA I0249=N1051=N0961 02 41 02.50 -06 56 11.0 4 1.90 1.25 WS GSC HCo SPC I0250 02 40 54.23 -13 18 50.2 2 0.31 0.14 WS GSC I0251 02 41 13.776 -14 57 29.17 3 1.16 1.00 Pds2 GSC KHJ I0252 02 41 45.02 -14 50 56.6 2 1.43 4.45 WS GSC I0253 02 42 05.675 -15 02 49.64 4 1.14 1.42 Pds WS GSC KHJ I0254 02 42 04.85 -15 06 26.0 2 0.72 2.33 WS GSC I0255 02 47 03.3 +16 17 17 2 0.00 0.71 HCo WS I0256:=I0256:n+s 02 49 40.23 +46 57 17.0 2 1.09 0.28 HCds GSC I0256:n 02 49 40.3 +46 57 19 1 HCo I0256:s 02 49 40.1 +46 57 16 1 HCo I0256: comp 02 49 34.63 +46 57 06.7 1 HCds I0257 02 49 45.49 +46 58 34.1 7 2.23 2.43 WS HCds SBG1 GSC UZC CCA DC I0257 comp 02 49 46.72 +46 57 51.0 1 HCds I0258 02 49 45.98 +41 03 06.1 3 1.44 1.85 WS VPS CCA I0259 02 49 40.871 +41 03 18.23 3 0.13 0.76 UZC VPS KHJ I0260 02 51 00.93 +46 57 16.9 6 0.76 1.19 HCds GSC WS UZC SBG1 CCA I0260 comp 02 50 50.80 +46 57 47.7 1 HCds I0261=N1120 02 49 04.096 -14 28 14.71 2 0.21 0.31 KHJ GSC I0262 02 51 43.26 +42 49 41.4 4 1.33 1.43 WS VPS UZC CCA I0263 02 49 39.95 -00 04 11.2 2 0.21 0.35 HCds GSC I0264 02 48 47.65 -00 06 31.9 1 HCds I0265 02 54 44.010 +41 39 19.40 3 0.46 0.54 KHJ GSC VPS I0266 02 55 04.71 +42 15 46.9 2 0.39 0.78 WS SBG1 I0267 02 53 50.20 +12 50 56.3 5 1.15 1.62 WS DC CCA GSC UZC I0268 02 55 26.87 -14 06 11.8 3 0.55 1.71 IPds GSC WS I0269 02 55 26.445 -14 04 00.88 3 0.59 0.67 GSC Pds2 KHJ I0270 02 55 44.141 -14 12 28.97 3 0.81 0.55 SPC GSC KHJ I0271 02 55 59.43 -12 00 30.1 2 0.41 1.63 GSC WS I0272 02 56 06.33 -14 11 13.9 2 0.92 1.13 WS GSC I0273 02 57 10.74 +02 46 30.9 5 0.74 0.91 SPC UZC WS DC CCA I0274? 03 00 17.7 +44 13 36 1 HCo I0274?? 03 00 42.03 +44 15 48.0 1 GSC I0274??? 03 00 20.3 +44 13 44 1 HCo I0274???? 03 00 20.5 +44 12 59 1 HCo I0275e 03 00 58.689 +44 21 00.05 2 0.33 0.29 KHJ GSC I0275nw 03 00 55.82 +44 20 59.8 2 1.52 1.41 WS GSC I0275s 03 00 55.90 +44 20 45.2 2 0.30 2.05 GSC WS I0276 02 58 41.3 -15 42 12 2 5.10 1.41 SPC WS I0277 02 59 50.50 +02 46 16.2 7 3.22 1.52 KET1 DC WS K08 SPC UZC CCA I0278 03 01 30.48 +37 45 56.5 4 0.85 0.30 WS SBG1 UZC CCA I0279 03 01 12.19 +16 12 32.4 3 0.17 1.89 WS UZC GSC I0280 03 03 03.32 +42 21 31.3 2 4.48 3.11 WS GSC I0281=N1177 03 04 37.21 +42 21 44.6 2 0.39 1.84 SBG1 WS I0282=N1198 03 06 13.19 +41 50 56.5 5 2.86 3.39 DC WS UZC SBG1 CCA I0283 03 03 50.4 -00 12 16 3 2.29 1.53 K08 UZC WS I0284 03 06 09.97 +42 22 18.0 5 1.75 1.54 DC WS SBG1 UZC CCA I0285 03 04 06.21 -12 00 55.1 2 0.62 0.21 WS GSC I0286 03 04 47 -06 29.1 1o Big I0287 03 04 57.816 -12 04 13.05 2 0.13 0.72 GSC KHJ I0288 03 07 32.89 +42 23 13.8 4 0.84 0.49 WS SBG1 UZC CCA I0289 03 10 19.27 +61 19 01.5 4 0.97 1.46 PK67 CK UB10 HCo I0290=I1884 03 09 42.78 +40 58 27.3 4 0.61 0.95 UZC WS SBG1 CCA I0291 03 07 26.6 -12 35 14 2 0.00 0.00 SPC WS I0292=I1887 03 10 13.16 +40 45 57.5 6 2.13 2.22 WS UZC SBG1 CCA DC STMM I0293=I1888 03 10 56.172 +41 08 13.90 2 0.27 0.45 KHJ SBG1 I0294=I1889 03 11 03.14 +40 37 18.2 3 1.32 2.10 WS SBG1 CCA I0295 03 11 00 +40 36.9 1o Sw8 I0296 03 11 04 +40 37.6 1o Sw8 I0297? 03 13 18.4 +42 08 55 1 HCds I0297? e * 03 13 18.85 +42 08 57.9 1 HCds I0297? w * 03 13 17.87 +42 08 54.2 1 HCds I0297?? 03 13 01.4 +42 09 18 1 HCds I0297?? e * 03 13 01.86 +42 09 20.1 1 HCds I0297?? w * 03 13 01.08 +42 09 17.4 1 HCds I0298nw 03 11 18.5 +01 18 54 3 3.00 0.58 WS Pds SPC I0298se 03 11 19.5 +01 18 46 4 0.00 1.71 WS SPC UZC Pds I0299 03 11 02.573 -13 06 34.18 2 0.39 0.50 KHJ GSC I0300 03 14 15.9 +42 24 55 2 1.57 4.95 WS HC I0301 03 14 47.73 +42 13 20.4 6 0.70 1.05 WS UZC SBG1 HC Pds CCA I0302 03 12 51.43 +04 42 21.7 4 2.22 3.15 WS UZC CCA DC I0303 03 12 40.691 -11 41 23.41 2 3.65 0.47 GSC KHJ I0304 03 15 01.33 +37 52 53.3 4 0.76 1.28 UZC SBG1 WS CCA I0305 03 15 03.835 +37 51 35.34 3 0.36 0.66 KHJ UZC SBG1 I0306 03 12 59.90 -11 42 57.3 2 6.75 1.91 WS GSC I0307 03 13 45.19 -00 14 29.6 6 1.35 0.86 Pds UZC WS GSC SPC CCA I0308 03 16 15.9 +41 10 49 2 0.80 2.12 WS HC I0308 comp1 03 15 57.0 +41 12 52 1 HC I0309 03 16 06.19 +40 48 15.1 4 0.96 1.58 HC WS SBG1 UZC I0310 03 16 42.93 +41 19 29.3 6 2.00 2.47 HC WS DC UZC SBG1 CCA I0311 03 16 46.75 +40 00 13.1 3 0.53 0.86 CCA SBG1 WS I0312 03 18 08.49 +41 45 14.9 5 1.40 1.01 SBG1 WS UZC CCA HC I0313 03 20 58.08 +41 53 36.8 5 3.29 1.13 SBG1 WS UZC CCA HC I0314=N1289 03 18 49.82 -01 58 23.7 5 1.17 1.25 SPC DC UZC WS CCA I0315 03 19 09.346 +04 02 18.09 4 0.13 1.13 KHJ GSC Pds UZC I0316n 03 21 20.0 +41 55 54 3 2.33 3.06 UZC WS HC I0316s 03 21 20.06 +41 55 41.7 3 3.40 1.86 SBG1 WS HC I0317 03 18 55.47 -12 44 24.3 2 1.65 0.28 WS GSC I0318 03 20 43.82 -14 34 06.2 2 0.72 0.07 WS GSC I0319 03 23 29.1 +41 24 58 1 HCo I0320 03 25 59.15 +40 47 19.7 4 1.54 2.11 HC WS CCA SBG1 I0321 03 24 29.589 -14 59 09.25 3 0.15 2.28 GSC KHJ Pds2 I0322 03 26 00.5 +03 40 49 3 0.86 3.79 WS HCo UZC I0322+* 03 26 00.60 +03 40 48.1 1 GSC I0323 03 29 33.5 +41 51 19 2 0.00 1.41 WS GSCm I0324=N1331 03 26 28.2 -21 21 18 4 0.70 6.24 WS ESOB HC GHD2 I0325 03 30 48.852 -07 02 48.47 2 0.13 0.00 GSC KHJ I0326 03 30 36.633 -14 25 33.90 2 0.48 2.72 KHJ SPC I0327 03 31 10.05 -14 41 32.5 3 1.53 1.10 Pds2 GSC WS I0328 03 31 10.99 -14 38 17.7 2 0.62 0.21 GSC WS I0329 03 32 01.309 +00 16 45.66 4 0.82 0.80 Pds2 UZC GSC KHJ I0330 03 32 07.98 +00 21 10.6 4 0.91 1.10 WS UZC GSC CCA I0331 03 32 19.01 +00 16 56.4 4 0.78 0.63 Pds2 WS UZC GSC I0332 03 32 37.408 +01 22 56.41 3 0.76 0.86 UZC KHJ SPC I0333 03 34 03 -04 35.1 1o Big I0334 03 45 17.03 +76 38 14.8 5 1.89 2.01 HCrs UZC WS DC CCA I0335=I1963 03 35 30.9 -34 26 47 4 2.55 2.08 ESOB FSn Pds WS I0336 03 37 +23.4 1 HCe I0337 03 37 04 -06 43.3 1o Sw11 I0337? 03 37 33.37 -06 31 13.4 1 GSC I0337?? 03 36 21.3 -06 42 55 1 WS I0338 03 37 38.08 +03 07 05.4 2 0.85 2.05 GSC WS I0339 03 38 01.9 -18 23 53 2 6.03 2.83 ESOB HC I0340 03 39 29.0 -13 06 55 2 2.06 0.00 WS SPC I0340 nearby * 03 39 30.2 -13 06 55 1 SPC I0341 03 40 +22.0 1 HCe I0342 03 46 48.60 +68 05 46.2 14 2.27 1.56 CCR AAS UJ10 WS TH1 HC2m vdK3 GHD1 JGr GSCA GSC UZC CCA DC I0343 03 40 07.1 -18 26 36 5 2.73 2.61 GHD2 SPC WS HC ESOB I0344 03 41 29.48 -04 39 57.0 3 1.02 1.00 SPC WS CP I0344 comp 03 41 27.8 -04 39 47 1 SPC I0345 03 41 08.965 -18 18 51.06 4 4.04 1.63 ESOB HC KHJ WS I0346 03 41 44.679 -18 16 01.53 6 2.10 1.04 ESOB WS KHJ GHD2 SPC HC I0347 03 42 32.5 -04 17 56 2 0.00 0.00 SPC WS I0348=I1985 03 44 34.2 +32 09 46 1 SAO I0349 03 46 20.1 +23 56 23 1o EEB I0350 03 44 36.62 -11 48 03.7 2 0.10 0.99 WS GSC I0351 03 47 32.945 +35 02 48.45 4 0.76 0.19 GSC UJ10 GSCA CK I0352 03 47 37.38 -08 43 54.6 2 0.42 0.85 GSC WS I0353 03 53 +25.8 1 HCe I0354 03 53 +23.1 1 HCe I0355 03 53 46.23 +19 58 25.7 4 0.69 0.54 UZC GSC WS Pds I0356 04 07 46.66 +69 48 44.1 8 1.78 2.07 HCrs WS CCA GSC HC2m UZC GHD1 DC I0357 04 03 44.116 +22 09 33.49 5 2.90 3.40 UZC KHJ GSC CCA DC I0358 04 03 42.937 +19 53 41.38 4 1.01 0.60 KHJ GSC UZC CCA I0359 04 12 28.35 +27 42 08.2 4 0.23 0.89 GSC UZC BPP CCA I0360 04 09 +26.1 1 HCe I0361 04 18 50 +58 15.0 1 BSV I0362 04 16 42.513 -12 12 00.27 3 1.33 1.50 KHJ Pds SPC I0363 04 18 55.32 +03 01 56.9 3 1.93 3.41 WS UZC GSC I0364 04 19 06.698 +03 11 18.65 4 0.63 3.00 Pds KHJ GSC UZC I0365 04 19 14.14 +03 20 52.7 4 1.41 2.07 WS GSC SPC UZC I0366 04 19 41.513 +02 21 34.77 3 0.58 0.73 Pds GSC KHJ I0367 04 20 41.0 -14 46 54 2 1.02 4.95 SPC WS I0368 04 22 42.670 -12 36 53.79 3 1.05 1.16 Pds GSC KHJ I0369 04 23 28.207 -11 47 24.40 3 1.70 0.09 Pds2 KHJ HCds I0370 04 24 01.8 -09 23 44 2 0.00 0.00 SPC WS I0371 04 30 12.59 -00 33 39.6 1 HCds I0372 04 30 04.22 -05 00 36.8 2 0.74 1.27 WS HCds I0373 04 30 42.793 -04 52 15.60 2 0.79 3.80 KHJ SPC I0374 04 32 32.8 +16 38 03 2 0.00 0.71 WS KEBA I0375 04 31 03.12 -12 58 27.3 2 1.03 0.57 HCds WS I0376 04 31 13.54 -12 26 01.5 1 HCds I0377 04 31 16.40 -12 27 19.2 3 1.61 0.67 HCds WS IPds I0378 04 31 27.999 -12 17 58.65 2 1.67 0.69 KHJ HCds I0379 04 31 50.898 -07 14 18.24 2 0.65 0.15 HCds KHJ I0380 04 31 41.28 -12 55 38.8 2 0.41 0.99 HCds WS I0381=N1530A 04 44 28.95 +75 38 22.3 6 3.37 2.36 HCrs WS UZC CCA DC GHD1 I0382 04 37 55.5 -09 31 10 2 2.09 2.83 WS SPC I0383 04 38 58.04 +09 53 32.1 2 1.05 2.05 WS HCds I0384 04 39 18.24 -07 50 21.2 2 1.47 0.21 WS HCds I0385 04 39 31.428 -07 05 51.53 2 0.69 0.95 SPC KHJ I0386=N1632 04 39 58.619 -09 27 22.28 2 0.76 0.21 KHJ SPC I0387 04 41 44.2 -07 05 12 2 0.00 0.71 WS SPC I0388e 04 41 54.305 -07 18 24.13 2 0.23 1.22 HCds KHJ I0388w 04 41 52.434 -07 18 16.91 2 0.27 0.35 KHJ HCds I0389 04 41 59.629 -07 18 41.99 3 0.12 0.63 KHJ SPC HCds I0390 04 42 03.857 -07 12 23.93 2 0.28 1.00 SPC KHJ I0391 04 57 21.99 +78 11 22.8 6 2.32 3.01 HCrs UZC GHD1 WS CCA DC I0392 04 46 25.83 +03 30 19.9 4 0.65 1.78 WS HCds CCA Pds I0393 04 47 51.761 -15 31 31.78 3 1.12 1.09 WS KHJ HCds I0394 04 48.8 -06 16 1o Big I0395=?N1671 04 49 33.93 +00 15 11.1 5 2.19 2.00 WS DC UZC GSC CCA I0396 04 57 58.91 +68 19 21.5 5 0.86 2.88 DC WS UZC CCA GSC I0397 05 01 06.56 +40 25 28.8 2 1.05 1.13 WS HCds I0398 04 58 12.6 -07 46 50 3 0.86 3.79 WS GHD2 SPC I0399 05 01 44.0 -04 17 20 4 1.22 1.50 HC KET2 WS SPC I0400: 05 03 45.62 -15 49 10.5 2 1.22 0.21 HCo GSC I0400? 05 03 44.6 -15 45 57 1 WS I0401 05 04 19.8 -10 04 33 4 0.74 1.73 SPC Pds KET2 WS I0402 05 06 14.76 -09 06 27.3 3 1.45 1.10 SPC WS GSC I0403 05 15 15.77 +39 58 19.7 2 1.22 0.14 HCds WS I0404 05 13 19.68 +09 45 16.9 3 0.78 2.08 WS HCds Pds I0405 05 16 29 +34 21.4 1 HCos I0406 05 17 49.00 +39 53 09.7 1 HCds I0407 05 17 42.6 -15 31 25 3 0.83 1.53 Pds WS SPC I0408 05 18 04.19 -25 10 17.8 2 1.06 1.91 HCds HCds I0409 05 19 33.6 +03 19 02 2 0.00 1.41 UZC Pds I0409s 05 19 33.5 +03 18 59 1 WS I0410 05 22 44 +33 24.7 1 HCos I0411 05 20 18.0 -25 19 28 2 8.63 2.12 ESOB WS I0412=I2123 05 21 56.66 +03 29 10.3 7 2.34 1.34 DC HCds GSC HC2m WS UZC CCA I0413=I2124 05 21 58.79 +03 28 55.8 7 1.21 1.43 DC GSC HC2m HCds WS UZC CCA I0414 05 21 54.95 +03 20 31.5 4 1.10 0.82 UZC Pds WS HCds I0415 05 21 21.55 -15 32 33.8 2 0.92 0.07 WS HCds I0416 05 23 56.4 -17 15 38 2 0.00 0.71 WS SPC I0417 05 28 06 +34 25.4 2 8.75 0.00 BSV SAO I0418 05 27 28.212 -12 41 49.87 5 1.07 0.97 GSC PPM Ty2 CK DKM1 I0419 05 30 52.02 +30 07 04.5 1 HCds I0420 05 32 09 -04 30.3 1 HCos I0421 05 32 08.562 -07 55 04.97 2 0.41 1.39 GSC KHJ I0422=I2131 05 32 18.46 -17 13 27.1 3 1.22 0.29 Pds2 WS HCds I0422=I2131 comp 05 32 20.90 -17 16 44.6 1 HCds I0423 05 33 22 -00 36.9 1 HCos I0424 05 33 37 -00 24.8 1 HCos I0425 05 37.2 +32 25 1o MW I0426 05 36 31 -00 17.9 1 HCos I0427 05 36 18 -06 37.0 1 HCos I0428 05 36 24 -06 27.1 1 HCos I0429 05 38 19.69 -07 02 28.9 2 17.47 4.38 HCds HCos I0430 05 38 33.2 -07 05 07 2 57.89 11.31 HCos WS I0431 * 05 40 13.53 -01 27 45.5 1 SAO I0432 * 05 40 56.31 -01 30 26.1 1 SAO I0433 05 40 31.22 -11 39 56.8 2 2.70 0.07 WS HCds I0435 05 43 00.54 -02 18 45.4 1 SAO I0437 05 51 37.396 -12 33 54.30 2 0.01 0.63 KHJ HCds I0438 05 53 00.2 -17 52 34 3 2.18 1.53 WS ESOB SPC I0439 05 56.7 +32 01 1o MW I0440 06 19 12.94 +80 04 06.6 6 1.39 2.30 DC WS HCrs GSC UZC CCA I0441 06 02 42.68 -12 29 58.5 3 1.27 2.00 GSC SPC WS I0442 06 36 12.104 +82 58 04.73 6 1.63 1.61 HCrs UZC GSC KHJ CCA DC I0443 06 16.6 +22 31 1 HCe I0443 ne 06 17 48 +22 49.0 1 HCos I0444 06 21.1 +23 06 1 HCe I0444 w 06 19 22 +23 16.5 1 SAO I0445 06 37 21.22 +67 51 34.5 6 1.64 0.75 DC WS Pds HCds UZC CCA I0446=I2167 06 31 06.1 +10 27 35 1 HCds I0447=I2169 06 31 07 +09 52.0 1 HCe I0448 06 32 45 +07 23.3 1 HCos I0449 06 45 41.42 +71 20 37.1 6 2.90 1.17 WS GHD1 Pds UZC CCA DC I0450 06 52 12.376 +74 25 37.18 10 0.33 0.29 UZC KHJ WW VVAG CCA EDC vdH+ UWS K01 SDP I0451 06 52 51.99 +74 28 49.9 4 0.83 2.98 WS UZC GHD1 CCA I0452=N2296 06 48 39.05 -16 54 06.4 3 2.43 1.70 SGC WS HCds I0453 06 49 11.45 -16 54 24.4 1 HCds I0454 06 51 06.40 +12 55 18.1 4 1.83 2.57 WS CCA Pds DC I0455 07 34 58.147 +85 32 12.63 5 1.25 2.04 UZC KHJ HCrs CCA DC I0456 07 00 17.8 -30 09 47 2 7.34 1.41 WS ESOB I0457=N2330? 07 09 28.379 +50 09 08.42 3 0.19 0.70 GSC SBG1 KHJ I0458 07 10 33.99 +50 07 07.4 6 2.37 1.22 DC WS SBG1 GSC UZC CCA I0459 07 10 38.658 +50 10 37.81 3 0.32 0.55 GSC SBG1 KHJ I0460 07 10 44.19 +50 12 07.0 4 1.10 0.99 WS UZC GSC SBG1 I0461 07 10 45.02 +50 04 51.6 3 0.15 0.96 GSC WS SBG1 I0462 07 10 55.81 +50 10 51.0 1 HCds I0462 nearby gal 07 10 54.61 +50 10 56.7 1 HCds I0463 07 11 00.91 +50 07 02.6 2 1.22 0.21 GSC HCds I0464 07 11 04.71 +50 08 11.0 6 0.96 2.20 WS GSC SPP UZC SBG1 HCds I0465=N2334? 07 11 33.600 +50 14 52.86 4 0.35 0.64 SBG1 UZC GSC KHJ I0466 07 08 39.16 -04 19 02.8 1 HCds I0467 07 30 18.26 +79 52 20.7 6 2.25 1.86 CCA WS HCrs UZC GHD1 DC I0468 07 17 19.03 -13 13 07.6 2 0.62 0.42 HCds HCm I0469 07 55 59.30 +85 09 32.1 6 2.20 3.31 DC UZC HCrs WS CCA GHD1 I0470 07 23 31.43 +46 04 42.7 2 1.03 0.64 WS GSC I0471 07 43 36.488 +49 40 01.91 4 0.46 1.61 CCA KHJ SBG1 DC I0472 07 43 50.25 +49 36 49.3 6 1.50 2.01 DC WS Pds UZC CCA SBG1 I0473 07 42 24.62 +09 15 19.0 1 HCds I0474 07 46 07.3 +26 30 16 3 0.00 2.31 WS BPP UZC I0475 07 47 09.2 +30 29 19 4 0.65 1.29 WS UZC KEBA BPP I0476 07 47 16.4 +26 57 02 3 0.00 1.73 WS BPP UZC I0477 07 52 06.994 +23 28 57.87 3 0.81 0.61 KHJ UZC HCds I0478 07 53 41.61 +26 29 32.0 4 0.20 1.65 GSC WS UZC BPP I0479 07 54 22.2 +27 00 27 3 1.33 3.46 WS BPP UZC I0480 07 55 23.21 +26 44 31.7 5 1.35 2.63 WS BPP CCA Pds UZC I0481 07 59 02.81 +24 09 35.6 5 1.46 1.47 MB Pds WS UZC CCA I0482 07 59 47.30 +25 21 22.8 3 0.78 2.86 WS UZC HCds I0483 07 59 52.37 +25 55 29.2 2 0.10 2.83 WS HCds I0484 08 00 01.09 +26 39 55.5 3 0.00 0.81 BPP UZC GSC I0485 08 00 19.83 +26 42 05.5 5 0.29 2.49 BPP WS MB GSC CCA I0486 08 00 20.96 +26 36 48.9 6 3.70 3.83 MB BPP GSC CCA WS UZC I0487=N2494 07 59 07.08 -00 38 17.0 4 1.55 0.25 UZC CCA DC WS I0488 08 00 48.8 +25 54 26 1o Spt I0488: 08 00 49.63 +25 54 08.6 2 0.67 1.48 HCds WS I0488: ne gal 08 00 49.81 +25 54 11.2 2 1.33 0.57 HCds SDSS I0488: sw * 08 00 49.45 +25 54 08.5 1 HCds I0488? 08 00 52.2 +25 53 58 1 HCds I0488? e * 08 00 52.60 +25 53 58.0 1 HCds I0488? n * 08 00 52.06 +25 53 58.7 1 HCds I0488? sw * 08 00 51.28 +25 53 49.7 1 HCds I0489 08 01 37.74 +25 59 47.0 1 HCds I0490 08 03 20.10 +25 48 38.4 3 0.55 1.47 WS Pds HCds I0491 08 03 55.07 +26 31 11.3 4 0.74 2.58 WS UZC GSC BPP I0492 08 05 38.65 +26 10 01.0 5 2.65 4.51 WS UZC MB CCA GHD1 I0493 08 07 27.49 +25 07 59.6 4 1.29 2.45 Pds2 HCds WS UZC I0494 08 06 24.21 +01 02 08.9 5 2.01 0.83 UZC SPC CCA DC WS I0495 08 08 19.226 +09 00 49.45 4 1.92 0.46 UZC HCds Pds KHJ I0496=I2229 08 09 44.12 +25 52 51.1 3 2.72 1.95 WS GSC UZC I0497 08 10 06.08 +24 55 18.6 4 0.64 0.84 UZC HCds WS Pds I0498 08 09 30.34 +05 16 47.5 5 1.15 3.78 UZC CCA WS Pds MB I0499 08 45 17.794 +85 44 23.88 5 2.61 2.17 HCrs UZC KHJ CCA DC I0500 08 12 39.55 -16 03 04.5 2 1.33 0.85 WS HCds I0501 08 18 47.613 +24 32 14.14 4 0.16 0.28 KHJ Pds UZC GSC I0502 08 22 03.677 +08 45 09.20 4 1.10 0.43 KHJ UZC Pds HCds I0503 08 22 10.64 +03 16 05.0 5 2.73 0.64 DC WS CCA UZC HCds I0504 08 22 41.12 +04 15 44.1 5 2.96 2.94 DC WS UZC CCA HCds I0505 08 23 21.72 +04 22 20.6 6 2.01 0.44 WS Pds UZC CCA HCds MB I0506 08 23 30.785 +04 17 56.82 4 1.42 1.34 UZC KHJ HCds Pds I0507=N2590 08 25 01.84 -00 35 30.4 5 1.22 1.14 DC CCA SPC UZC WS I0508 08 28 22.42 +25 07 28.5 4 0.65 1.83 WS GSC K04 UZC I0509 08 32 03.52 +24 00 37.5 4 0.88 1.82 HCds WS UZC CCA I0510e 08 32 10.88 -02 09 44.9 5 0.86 1.12 GSC UZC HCo WS SPC I0510w 08 32 10.2 -02 09 43 1 HCo I0511 08 40 49.97 +73 29 11.2 6 2.98 1.19 DC WS UZC GHD1 HCds CCA I0512 09 03 49.92 +85 30 05.1 5 1.64 1.17 WS UZC CCA HCrs DC I0513 08 33 05.099 -12 21 19.96 3 1.13 0.26 GSC KHJ SPC I0514 08 35 22.20 -02 02 49.0 5 2.09 1.26 HCo Pds UZC WS HCds I0515 08 35 31.265 -01 54 03.56 4 1.76 1.92 HCo KHJ HCds CCA I0516 08 35 50.57 -01 52 14.7 3 5.93 5.92 HCo HCds WS I0517 08 36 22.02 -02 03 20.7 5 0.96 0.93 HCo WS Pds UZC HCds I0518 08 36 07.0 +00 41 33 1o Big I0519 08 40 34.409 +02 36 39.53 4 0.92 1.10 Pds UZC KHJ HCds I0520 08 53 41.90 +73 29 26.9 6 2.07 1.72 DC GHD1 WS UZC KEBA CCA I0521 08 46 44.05 +02 32 13.7 4 2.13 1.52 Pds UZC HCds WS I0522 08 54 35.19 +57 10 00.4 5 2.70 3.48 WS UZC CCA HCds DC I0523 08 53 11.32 +09 08 52.4 4 1.38 1.25 WS UZC CCA HCds I0524 08 58 12.890 -19 11 32.96 4 2.77 4.44 GSC WS KHJ ESOB I0525 09 01 22.44 -01 51 12.7 5 1.40 0.61 ZGT UZC WS HCds CCA I0526 09 02 40.823 +10 50 29.40 3 0.61 0.42 KHJ UZC HCds I0527 09 09 41.850 +37 36 04.61 6 0.32 0.62 GSC KHJ Pds UZC SBG1 CCA I0528 09 09 22.61 +15 47 45.3 6 1.65 1.94 WS KEB1 HKA UZC CCA MB I0529 09 18 32.54 +73 45 33.5 5 1.66 2.06 GHD1 DC CCA UZC WS I0530 09 15 17.09 +11 53 08.2 5 0.73 0.56 UZC HCds CCA DC WS I0531 09 17 50.80 -00 16 43.3 8 2.16 1.56 ZGT APMn CCA GSC UZC Pds WS SPC I0532 09 19 03 -16 45.3 1o Big I0533 09 20 23.37 -03 59 31.2 1 HCds I0533? 09 20 21.9 -07 52 53 1 WS I0534 09 21 15.42 +03 09 00.8 5 1.48 1.59 HCds CCA Pds UZC WS I0535 09 22 16.250 -01 02 25.79 3 0.53 1.25 KHJ Pds HCds I0536 09 24 40.07 +25 06 38.1 5 0.92 5.24 HCds WS MB UZC CCA I0537 09 25 22.602 -12 23 31.38 2 0.06 1.41 SPC KHJ I0538=N2885 09 27 18.36 +23 01 11.2 3 2.00 1.82 Pds CCA GSC I0539 09 29 08.23 -02 32 56.7 5 2.70 1.38 ZGT UZC WS CCA DC I0540 09 30 10.20 +07 54 06.6 5 1.39 2.20 WS Pds HCds CCA UZC I0541 09 30.5 -04 15 1o Sw9 I0542 09 31 06.3 -13 10 54 3 1.69 0.58 WS SPC APMn I0543 09 31 09 -14 46.4 1o Big I0544 09 35 53.23 +24 53 35.1 4 1.11 3.06 WS Pds HCds UZC I0545 09 36 05.4 +24 56 53 3 2.07 3.79 WS UZC KEBA I0546 09 34 50.2 -16 23 06 2 0.00 0.71 WS SPC I0547=N2947=I2494 09 36 05.82 -12 26 14.4 4 0.22 2.65 SPC WS APMn HC2m I0548 09 38 19.34 +09 26 44.0 4 0.74 0.87 WS UZC HCds Pds I0549 09 40 43.22 +03 57 33.1 4 2.66 2.75 WS HCds UZC ZGT I0550 09 40 28.67 -06 56 46.3 2 0.74 0.28 WS HCds I0551 09 41 00.07 +06 56 09.6 4 1.42 0.55 DC WS UZC CCA I0552 09 41 16.61 +10 38 46.8 5 1.11 2.63 WS GSC CCA UZC DC I0553 09 40 45.0 -05 26 09 3 4.48 0.58 HC WS SPC I0554=I0555 09 41 57.00 +12 17 44.5 4 0.77 1.35 UZC CCA DC WS I0555=I0554 09 41 57.00 +12 17 44.5 4 0.77 1.35 UZC CCA DC WS I0556=N2984 09 43 40.38 +11 03 39.2 5 1.11 2.29 WS DC GSC UZC CCA I0557 09 44 02.5 +10 59 15 3 0.85 1.73 UZC KEBA WS I0558 09 45 00.312 +29 27 07.20 3 0.29 0.79 BPP UZC KHJ I0559 09 44 43.91 +09 36 54.4 4 2.21 0.40 WS Pds UZC HCds I0560 09 45 53.48 -00 16 07.8 6 1.44 1.43 GSC UZC WS SPC CCA ZGT I0561 09 45 58.82 +03 08 40.2 5 0.88 3.53 HCo UZC ZGT WS HCds I0562 09 46 03.9 -03 58 19 5 5.33 4.04 GHD2 APMn WS SPC ZGT I0563 09 46 20.19 +03 02 42.5 5 3.51 1.15 ZGT WS UZC GSC GH I0564 09 46 21.09 +03 04 15.3 9 2.18 1.81 ZGT WS CCA GSC GH UZC Pds STMW DC I0565 09 47 50.40 +15 51 04.8 5 2.08 2.09 WS UZC Pds CCA HCds I0565 comp 09 47 49.68 +15 51 06.9 1 2MSX I0566 09 49 56.456 -00 13 54.27 4 2.54 1.42 UZC KHJ HCds ZGT I0567 09 50 33.91 +12 47 02.2 1 HCds I0568 09 51 08.34 +15 43 48.2 4 1.06 0.75 UZC HCds WS CCA I0569 09 51 28.154 +10 55 10.75 4 0.48 1.14 KHJ Pds UZC HCds I0570 09 51 51.005 +15 45 20.06 2 0.85 0.40 KHJ HCds I0571 09 52 31.59 +15 46 30.2 3 0.08 1.03 Pds UZC HCds I0571? 09 52 31.5 +15 26 28 1 WS I0572 09 52 32.83 +15 49 36.6 4 0.43 0.64 UZC WS KEBA HCds I0573=N3058s 09 53 36.1 -12 28 58 3 0.85 1.15 HCo SPC WS I0574 09 54 26.987 -06 57 12.46 2 0.94 0.40 SPC KHJ I0575 09 54 33.0 -06 51 28 4 1.22 2.71 WS SPC APMn Pds I0576 09 55 07.108 +11 02 22.28 3 1.70 1.55 KHJ UZC KEB1 I0577 09 56 03.97 +10 29 51.9 6 2.06 4.04 DC UZC WS MB HCds CCA I0578 09 56 16.08 +10 29 07.0 6 2.87 5.35 MB HCo WS HCds UZC CCA I0579? 09 56 39.39 -13 46 29.5 4 0.76 1.29 HCds WS GSC SPC I0579? comp 09 56 42.37 -13 44 57.0 1 HCds I0580=N3069 09 57 56.71 +10 25 56.1 5 0.45 1.62 HCds GSC Pds WS UZC I0581 09 58 11.613 +15 56 48.27 4 0.62 0.35 KHJ Pds UZC CCA I0582 09 59 00.20 +17 49 00.0 5 0.89 1.66 WS UZC HCds Pds CCA I0583 09 59 05.04 +17 49 15.5 5 1.13 1.44 WS HCds Pds UZC CCA I0584 09 59 05.1 +10 21 38 3 0.00 1.53 WS KEBA UZC I0585 09 59 44.207 +12 59 18.06 4 1.20 0.61 KHJ CCA UZC Pds I0586 09 59 50.208 -06 55 21.53 2 1.91 0.93 Pds2 KHJ I0587 10 03 04.97 -02 24 00.1 7 4.89 5.74 ZGT APMn DC GSC WS SPC CCA I0588 10 02 06.906 +03 03 27.20 5 3.69 2.13 ZGT MB KHJ UZC CCA I0589 10 04 24.149 -05 40 43.99 2 5.36 0.16 KHJ GSC I0590 10 05 50.2 +00 37 57 2 0.00 0.71 ZGT UZC I0590e 10 05 50.563 +00 37 55.33 2 1.10 0.85 HCds KHJ I0590w 10 05 49.777 +00 37 59.70 2 1.37 0.19 HCds KHJ I0591 10 07 27.60 +12 16 27.7 5 1.31 3.96 WS UZC DC KEBA CCA I0592 10 07 58.71 -02 29 53.5 5 2.69 2.39 ZGT UZC WS CCA DC I0593 10 08 18.17 -02 31 36.3 5 3.40 1.94 CCA UZC WS ZGT DC I0594 10 08 31.99 -00 40 01.2 5 5.09 1.19 GSC WS UZC CCA ZGT I0595 10 09 38.107 +11 00 00.59 2 0.18 0.11 UZC KHJ I0596 10 10 31.3 +10 02 30 3 0.00 2.08 WS Pds UZC I0597 10 10 11.969 -06 53 57.41 2 0.24 0.11 KHJ GSC I0598 10 12 48.57 +43 08 43.6 5 1.13 1.86 WS DC UZC SBG1 CCA I0599 10 13 12.34 -05 37 46.7 2 0.42 3.11 WS HCds I0600 10 17 10.90 -03 29 53.0 6 1.49 2.68 WS GSC APMn UZC SPC ZGT I0601 10 18 15.303 +07 02 18.30 3 0.12 1.64 Pds UZC KHJ I0602 10 18 19.72 +07 02 56.0 5 1.32 1.59 WS UZC DC KEBA CCA I0603 10 19 25.0 -05 39 23 3 0.00 0.58 APMn SPC WS I0604=N3220 10 23 44.86 +57 01 35.1 5 2.60 2.97 GHD1 WS CCA HCo DC I0605 10 22 24.16 +01 11 56.2 5 2.22 3.63 UZC WS CCA DC ZGT I0606=N3217 10 23 32.63 +10 57 34.2 4 0.70 1.04 WS GSC FPB UZC I0607 10 24 08.76 +16 44 29.5 4 6.04 1.65 WS CCA UZC Pds I0608 10 24 21.05 -06 02 22.4 2 0.84 2.26 WS HCds I0609 10 25 35.45 -02 12 55.1 7 2.39 2.52 UZC WS SPC HCds DC CCA ZGT I0609 comp 10 25 36.46 -02 14 13.7 1 HCds I0610=I0611 10 26 28.48 +20 13 37.7 6 2.22 3.74 UZC CCA MB WS GH HC I0611=I0610 10 26 28.48 +20 13 37.7 6 2.22 3.74 UZC CCA MB WS GH HC I0612 10 27 05.85 +11 03 16.5 3 0.59 1.86 WS UZC HCds I0613 10 27 07.813 +11 00 38.58 3 0.48 0.36 KHJ UZC HCds I0614 10 26 52.0 -03 27 55 3 3.12 4.58 WS UZC ZGT I0615 10 27 22.034 +11 04 47.97 4 0.51 1.19 KHJ UZC HCds CCA I0616 10 32 47.50 +15 51 38.3 4 1.65 1.94 WS HCds UZC CCA I0616 comp 10 32 47.243 +15 50 41.77 2 0.35 0.81 HCds KHJ I0617=N3280w=N3295w 10 32 43.892 -12 38 14.91 2 1.61 0.79 KHJ SPC I0618=N3296 10 32 45.468 -12 43 03.09 2 1.36 0.59 KHJ SPC I0619 10 33 49.99 +12 52 43.4 1 HCds I0620 10 33 33.36 +11 52 15.4 3 0.17 2.57 WS UZC HCds I0620 comp 10 33 32.57 +11 52 33.3 1 HCds I0621 10 33 20.991 +02 36 56.48 3 0.58 1.61 ZGT GSC KHJ I0622=N3279 10 34 42.76 +11 11 48.1 3 2.31 1.50 WS UZC CCA I0623 10 35 21.13 +03 33 28.4 4 2.12 1.10 WS UZC CCA ZGT I0624 10 36 15.3 -08 20 04 3 0.86 0.58 WS SPC APMn I0625 10 42 37.78 -23 56 07.4 5 2.21 0.94 GSCA GSC2 ESOB HCds 2MSX I0626 10 36 57.14 -07 01 26.8 3 1.56 1.58 HCds SPC WS I0626 comp 10 36 53.41 -07 01 43.8 1 HCds I0627 10 37 20.026 -03 21 26.51 3 4.89 2.36 UZC KHJ ZGT I0628 10 37 36.21 +05 36 11.2 4 0.72 0.94 UZC CCA WS Pds I0629=N3312 10 37 02.4 -27 33 55 3 1.54 2.08 ESOB WS GHD2 I0630 10 38 33.9 -07 10 15 3 0.86 0.58 HCo KEB1 WS I0631 10 38 58.903 -07 03 08.59 2 0.02 0.04 KHJ GSC I0632 10 39 11.78 -00 24 36.9 3 1.82 1.62 ZGT WS CCA I0633 10 39 24.10 -00 23 21.2 5 4.05 3.99 ZGT CCA WS KEBA DC I0634 10 40 54.99 +05 59 29.1 5 1.63 0.46 WS CCA Pds UZC MB I0635 10 41 45.28 +15 38 34.4 3 0.33 1.08 WS UZC CCA I0636 10 41 50.63 +04 19 49.5 4 0.37 0.84 WS Pds UZC CCA I0637 10 42 22.010 +15 21 35.36 3 1.25 0.70 KHJ Pds UZC I0638 10 43 48.0 +15 53 41 2 0.00 0.00 UZC WS I0639 10 45 52.0 +16 55 46 3 0.83 2.08 WS UZC Pds I0640 10 46 50.5 +34 46 03 1o Big I0641 10 47 49.4 +34 40 22 1o Big I0642 10 48 08.15 +18 11 19.6 4 3.56 2.94 WS UZC CCA DC I0643 10 49 27.2 +12 12 02 4 1.20 1.15 WS Pds UZC HCo I0644=N3398 10 51 31.59 +55 23 26.2 6 2.34 1.91 WS UZC HCds CCA DC HC I0645 10 50 09.25 -06 02 36.0 2 0.11 0.64 WS GSC I0646 10 51 35.168 +55 27 56.35 4 1.92 0.77 HC KHJ GSC HCds I0647 10 50 34.441 -12 51 16.08 2 0.29 0.04 KHJ GSC I0648 10 51 00.2 +12 17 13 2 1.04 0.00 WS UZC I0649 10 50 52 +01 09.8 1 ZGT I0649n 10 50 52.1 +01 09 54 2 1.06 2.83 WS UZC I0649s 10 50 52.2 +01 09 41 2 1.06 0.71 WS UZC I0650 10 50 40.53 -13 26 30.9 3 0.84 0.83 WS GSC HCds I0651 10 50 58.36 -02 09 02.0 7 2.79 3.10 ZGT WS UZC CCA KEBA SPC DC I0652=N3421 10 50 57.711 -12 26 55.90 3 1.03 2.27 KHJ SPC APMn I0653 10 52 06.73 -00 33 39.9 7 1.96 1.53 ZGT DC APMn WS UZC CCA SPC I0654 10 53 50.41 -11 43 33.3 3 0.89 0.90 GSC WS SPC I0655 10 54 22.3 -00 21 57 3 4.58 3.06 WS UZC ZGT I0656=?N3457 10 55 08.1 +17 36 48 2 0.00 2.83 HCds WS I0657 10 57 53.537 -04 54 17.76 3 0.69 0.37 GSC SPC KHJ I0658 10 58 16.289 +08 14 29.53 2 0.70 0.10 KHJ UZC I0659 10 58 03.857 -06 15 37.38 3 0.67 0.85 GSC KHJ SPC I0660 10 58 26.627 +01 22 58.20 2 0.95 0.42 HCds KHJ I0661 10 58 51.30 +01 39 00.5 2 4.03 2.47 WS GSC I0662 10 59 20.504 +01 35 56.17 2 1.09 1.24 HCds KHJ I0663 11 00 37.3 +10 26 11 1 WS I0664 11 00 45.4 +10 33 10 2 1.04 2.12 UZC WS I0665 11 00 29.927 -13 52 00.52 1 KHJ I0666 11 01 14.8 +10 28 49 2 0.00 2.12 WS UZC I0667 11 06 36.483 +15 05 19.25 3 1.64 0.06 Pds KHJ UZC I0668 11 06 39.5 +15 02 26 3 1.67 1.00 WS Pds UZC I0669 11 07 16.507 +06 18 07.60 4 2.17 1.43 DC UZC KHJ CCA I0670 11 07 28.78 +06 42 50.2 6 0.90 0.77 WS GD HCds Pds UZC CCA I0671 11 07 31.62 +00 46 56.7 7 2.67 2.53 GSC MB UZC WS SPC CCA ZGT I0672 11 08 03.20 -12 29 03.8 2 0.31 0.78 WS GSC I0673 11 09 25.29 -00 05 54.6 7 3.64 1.87 DC WS Pds SPC UZC CCA ZGT I0674 11 11 06.38 +43 37 58.9 6 0.58 2.11 CCA SBG1 WS UZC DC Pds I0675? 11 10 57.4 +03 35 39 2 0.00 0.71 WS GSCm I0676 11 12 39.82 +09 03 21.4 5 1.30 1.82 WS FPB UZC CCA DC I0677 11 13 56.63 +12 18 03.5 4 1.95 0.47 UZC WS DC CCA I0678 11 14 06.229 +06 34 37.77 3 3.48 0.33 GD UZC KHJ I0679 11 16 36.594 -13 58 19.17 2 0.45 0.48 GSC KHJ I0680 11 17 54.6 -01 56 50 3 2.60 3.21 ZGT UZC WS I0681 11 18 31.91 -12 08 25.9 2 0.21 1.48 HCds WS I0682=N3649 11 22 14.78 +20 12 30.3 4 0.70 2.17 WS UZC GH CCA I0683 11 21 31.779 +02 45 05.89 4 0.63 1.65 HC GSC KHJ Pds I0684=N3644 11 21 32.84 +02 48 37.1 6 3.59 1.34 ZGT GSC CCA WS HC UZC I0685 11 22 06.6 +17 45 08 2 2.02 11.31 WS HC I0686 11 23 05.1 +05 38 38 3 0.86 1.53 WS GD UZC I0687 11 24 17.261 +47 50 50.15 3 0.97 0.90 SBG1 UZC KHJ I0688 11 23 40.13 -09 47 43.6 2 2.30 0.57 HCds 2MSX I0689=N3661 11 23 38.4 -13 49 51 4 1.40 1.41 APMn WS SPC Pds I0690 11 24 20.595 -08 20 31.01 2 0.28 0.17 GSC KHJ I0691 11 26 44.44 +59 09 20.1 5 2.94 2.61 SDP WS CCA UZC DC I0692 11 25 53.57 +09 59 13.2 5 1.25 0.50 WS UZC DC CCA KEBA I0693 11 26 48.6 -05 00 17 1 WS I0694 11 28 27.31 +58 34 42.6 3 0.20 0.75 HCds HCo HC2m I0695 11 27 58.31 -11 42 55.8 2 0.73 1.34 WS GSC I0696 11 28 39.93 +09 05 54.9 4 1.11 0.15 DC UZC WS CCA I0697 11 28 34.458 -01 37 47.61 3 0.75 2.16 UZC KHJ ZGT I0698 11 29 03.79 +09 06 44.0 5 2.29 2.29 WS HCds UZC CCA DC I0699 11 29 06.46 +08 59 18.3 4 1.40 1.04 Pds WS UZC CCA I0700 11 29 15.5 +20 35 05 1 HCm I0700 me 11 29 16.30 +20 35 09.8 3 1.83 2.20 HCds HKA CCA I0700 mw 11 29 15.22 +20 34 58.8 5 1.05 2.20 HCds WS HKA UZC CCA I0700 ne 11 29 16.54 +20 35 18.1 3 2.11 1.77 HCds HKA CCA I0700 sw 11 29 14.16 +20 34 52.6 3 1.71 1.53 HKA HCds CCA I0701 11 31 00.61 +20 28 09.6 4 1.81 2.76 MB WS UZC CCA I0702 11 30 54.63 -04 55 20.6 2 0.42 1.27 WS GSC I0703?=N3704 11 30 04.714 -11 32 47.63 5 1.11 1.95 GSC KHJ SPC APMn Pds I0704?=N3707 11 30 11.580 -11 32 36.51 3 0.70 0.40 GSC KHJ SPC I0705 11 32 56.372 +50 14 30.27 3 0.50 0.51 UZC KHJ Pds I0706 11 33 12.6 -13 20 18 1 WS I0707 11 33 44.65 +21 22 47.9 5 0.73 1.92 WS KEBA DC CCA UZC I0708 11 33 59.29 +49 03 42.1 5 2.93 1.66 WS UZC SBG1 CCA DC I0709 11 34 14.505 +49 02 34.85 3 0.34 0.58 UZC SBG1 KHJ I0710 11 34 27.24 +25 52 33.5 2 1.52 0.99 Pds HCds I0711 11 34 46.53 +48 57 21.4 3 0.50 1.48 WS SBG1 UZC I0712 11 34 49.22 +49 04 39.1 3 1.03 1.22 WS SBG1 UZC I0713? 11 34 44.14 +16 50 46.0 2 0.51 3.32 WS HCds I0714=N3763 11 36 30.2 -09 50 49 2 0.00 2.83 SPC WS I0715 11 36 54.6 -08 22 38 1 HCm I0715nw 11 36 54.32 -08 22 33.5 2 0.32 0.21 HCds WS I0715se 11 36 54.88 -08 22 44.5 2 1.16 1.56 WS HCds I0716 11 39 03.38 -00 12 22.3 8 2.54 2.12 SPC CCA Pds WS GGH GSC UZC ZGT I0717=N3779 11 38 51.0 -10 35 01 4 2.95 2.99 APMn SPC WS Pds I0718 11 39 52.87 +08 52 27.5 5 2.01 4.80 WS Pds UZC CCA STMW I0719 11 40 18.57 +09 00 34.7 5 0.66 1.79 DC WS KEBA CCA UZC I0720n 11 42 22.27 +08 46 11.6 1 HCds I0720s 11 42 22.31 +08 45 56.5 3 1.63 2.53 HCds WS Pds I0720 plume 11 42 21.91 +08 45 45.7 1 HCds I0721 11 42 28.9 -08 20 27 3 0.00 0.58 SPC WS APMn I0722 11 42 43.76 +08 58 26.4 2 0.84 1.91 WS HCds I0723 11 42 57.595 -08 19 57.02 2 0.06 0.08 KEB2 KHJ I0724 11 43 34.68 +08 56 31.0 4 1.27 0.50 WS DC UZC CCA I0725 11 43 29.43 -01 40 05.4 4 2.02 1.68 UZC GGH WS ZGT I0726 11 43 45.34 +33 23 31.2 1 GSC I0727 11 44 28.70 +10 46 59.8 3 0.08 2.07 WS UZC CCA I0728 11 44 50.50 -01 36 04.9 6 1.24 1.18 GGH UZC CCA SPC WS ZGT I0729 11 45 18.38 +33 20 08.5 4 0.53 1.59 WS GSC SBG1 UZC I0730=N3849 11 45 35.187 +03 13 53.42 5 1.45 2.04 ZGT GGH UZC KHJ HCds I0731 11 45 17.99 +49 34 12.6 2 0.82 2.97 SBG1 WS I0732n 11 45 59.41 +20 26 49.5 2 0.40 0.57 HCds WS I0732s 11 45 59.80 +20 26 19.3 3 1.51 1.86 WS HCds UZC I0733 11 45 58.66 -08 09 21.2 2 1.37 1.13 GSC WS I0734=I0734s 11 46 03.79 -08 16 15.3 2 0.74 1.06 GSC WS I0734n 11 46 03.95 -08 15 55.0 2 1.47 1.56 GSC WS I0735 11 48 12.72 +13 12 30.7 1 HCds I0736 11 48 20.106 +12 42 58.95 4 0.85 0.77 HCds LEDA KHJ HKA I0736 comp 11 48 17.69 +12 43 34.5 1 HCds I0737 11 48 27.48 +12 43 37.7 3 0.89 2.00 HCds WS HKA I0738 11 48 54.76 -04 40 55.5 3 1.28 1.13 WS SPC GSC I0739 11 51 31.28 +23 51 45.2 4 0.67 1.60 Pds CCA WS UZC I0740=N3913 11 50 38.80 +55 21 13.1 6 1.77 1.79 WS DC UZC WR HC GSC I0741 11 50 31.8 -04 50 12 1 WS I0742 11 51 02.28 +20 47 58.0 4 1.27 0.97 WS JGV UZC CCA I0743 11 53 22.12 -13 15 50.7 4 3.18 6.15 SPC APMn GSC WS I0744 11 54 04.757 +23 11 31.81 1 KHJ I0745 11 54 12.31 +00 08 12.4 8 2.87 1.76 WS DC KEB2 KEBA UZC GGH CCA ZGT I0746 11 55 35.06 +25 53 19.9 6 3.38 1.97 DC WS K10 UZC CCA JGV I0747 11 57 04.895 -08 17 31.68 2 0.08 0.95 KHJ GSC I0748 11 57 26.751 +07 27 38.71 4 0.80 0.97 KEBA KHJ GGH UZC I0749 11 58 33.93 +42 44 02.9 6 2.35 4.62 DC WS UZC GHD1 SBG1 CCA I0750 11 58 51.99 +42 43 20.3 7 1.99 2.30 DC GHD1 WS CCA SBG1 UZC HHKK I0751 11 58 52.54 +42 34 12.7 6 1.46 2.23 WS GHD1 K06 SBG1 UZC CCA I0752 11 59 15.05 +42 34 00.2 4 0.99 1.93 WS K06 UZC SBG1 I0753 11 59 12.80 -00 31 27.2 7 2.17 2.45 DC ZGT UZC WS GGH KEBA CCA I0754 11 59 23.55 -01 39 15.6 8 1.28 2.77 SPC GSC GGH DC UZC WS CCA ZGT I0755=N4019 12 01 10.41 +14 06 16.4 7 1.74 3.18 DC UZC HCds YOF WS CCA CCA I0756 12 02 57.78 +04 50 43.5 6 2.14 2.04 GD CCA WS Pds GGH UZC I0757=N4068 12 04 02.33 +52 35 24.4 5 3.80 6.20 WS CCA DC HCds HCds I0757=N4068 * 12 04 00.73 +52 35 18.4 3 0.55 2.19 HCds GHD1 UZC I0758 12 04 12.22 +62 30 18.9 5 3.80 1.26 WS CCA UZC GHD1 DC I0759 12 05 09 +20 15.6 1o Big I0759?? 12 05 15.25 +20 18 38.7 1 GSC I0760 12 05 53.5 -29 17 33 3 0.76 3.21 Pds ESOB WS I0761 12 05 53.695 -12 40 23.46 2 0.07 0.80 HCds KHJ I0761 comp 12 05 57.18 -12 39 49.0 1 HCds I0762 12 08 11.94 +25 45 22.9 4 1.28 1.94 WS K10 JG UZC I0763 12 08 15.253 +25 48 40.45 5 0.73 1.58 KOS UZC Pds JG KHJ I0764 12 10 13.9 -29 44 12 4 5.79 1.73 MJC GHD2 WS ESOB I0765 12 10 30 +16 08.1 1o Big I0765? 12 10 32.70 +16 07 55.9 2 1.32 4.53 HCds WS I0766 12 10 53.5 -12 39 17 3 0.85 2.31 APMn SPC WS I0767 12 11 02.9 +12 06 12 4 2.77 4.03 UZC FPB WS VCC I0768 12 11 47.42 +12 08 34.8 6 2.86 5.59 VCC K09 WS YOF CCA UZC I0769 12 12 32.13 +12 07 23.1 6 4.58 2.63 DC VCC WS YOF UZC CCA I0770 12 13 02.330 -04 33 11.94 2 0.10 0.26 GSC KHJ I0771 12 15 13.08 +13 11 06.0 5 2.55 4.57 VCC WS K09 UZC YOF I0772=I3067 12 15 15.910 +23 57 29.30 4 0.92 1.01 HCds KHJ UZC JG I0773 12 18 07.89 +06 08 24.3 5 5.67 4.94 VCC WS GH GGH UZC I0774 12 18 51.276 -06 45 59.35 2 0.36 0.32 KHJ GSC I0775 12 18 53.59 +12 54 46.2 5 1.38 3.25 WS VPC GH UZC CCA I0776 12 19 03.10 +08 51 22.8 5 3.59 2.58 VCC UZC WS CCA YOF I0777 12 19 23.76 +28 18 34.3 7 1.12 1.92 WS DC K03 UZC BPP GSC CCA I0778=N4198 12 14 22.08 +56 00 40.6 4 1.45 1.04 WS HCds UZC CCA I0779 12 19 38.75 +29 52 57.6 3 1.05 2.50 WS BPP CCA I0780 12 19 58.48 +25 46 16.5 5 1.12 1.51 WS UZC JG CCA DC I0781 12 20 03.1 +14 57 39 4 7.75 1.50 VCC VPC WS UZC I0782 12 21 37.032 +05 45 56.84 4 1.25 0.61 GGH KHJ UZC VCC I0783 12 21 38.82 +15 44 42.2 4 0.92 2.92 WS UZC GH CCA I0783A 12 22 19.8 +15 43 59 3 3.00 3.79 WS GH VCC I0784 12 22 30.1 -04 39 12 3 0.86 2.08 WS APMn SPC I0785 12 23 02.087 -13 13 24.69 2 0.28 0.56 KHJ GSC I0786 12 23 10.941 -13 12 15.89 2 0.06 1.35 GSC KHJ I0787 12 25 25.0 +16 07 24 3 4.15 2.08 VCC WS UZC I0788=N4405 12 26 07.19 +16 10 50.4 7 1.81 1.23 GH Pds WS YOF CCA UZC DC I0789 12 26 20.42 +07 27 36.3 6 4.67 2.73 VCC I1 WS GGH UZC CCA I0790 12 26 35.520 +09 02 07.36 3 0.50 0.10 KHJ GSC HCds I0791 12 26 59.532 +22 38 22.87 5 1.47 2.46 JG KHJ UZC CCA DC I0792 12 27 08.74 +16 19 32.9 5 1.84 5.65 VCC YOF CCA WS UZC I0793=N4445 12 28 15.97 +09 26 10.5 7 3.81 1.29 DC CCA YOF GH UZC WS YZYH I0794 12 28 08.688 +12 05 34.76 7 2.55 1.89 I1 UZC KHJ GH VPC CCA VCC I0795 12 28 31.3 +23 18 17 2 0.00 0.71 WS UZC I0796 12 29 26.29 +16 24 15.6 5 1.30 1.69 DC VCC WS UZC CCA I0797 12 31 54.49 +15 07 26.6 8 7.65 2.89 VCC DC VPC YOF K09 WS UZC CCA I0798 12 32 33.349 +15 24 57.88 3 1.55 4.60 VCC KHJ UZC I0799=N4520 12 33 49.906 -07 22 32.56 5 0.54 2.14 SPC KHJ HCds GSC GHD2 I0799=N4520 comp 12 33 50.73 -07 23 00.3 1 HCds I0800 12 33 56.70 +15 21 17.2 7 3.80 2.82 VCC WS UZC CCA YOF GH DC I0801 12 33 44.87 +52 15 15.7 4 1.89 1.02 Pds WS UZC CCA I0802 12 35 57.63 +74 18 04.8 1 HCds I0803 12 39 37.1 +16 35 18 3 5.18 0.58 WS HCm UZC I0803e 12 39 37.54 +16 35 19.3 1 HCds I0803n 12 39 37.00 +16 35 25.6 1 HCds I0803se 12 39 38.33 +16 35 09.6 1 HCds I0803w 12 39 35.90 +16 35 16.9 1 HCds I0804 12 41 16.0 -05 00 33 2 3.17 0.71 WS HC I0805=N4611 12 41 25.32 +13 43 45.6 8 2.99 1.33 VCC GD HCds UZC WS YZYH YOF CCA I0806 12 42 08.428 -17 20 58.51 4 0.08 1.36 GSC SPC WS KHJ I0807 12 42 12.465 -17 24 13.63 3 0.29 0.79 WS GSC KHJ I0808 12 41 54.5 +19 55 55 1 GSC I0808e 12 41 55.20 +19 55 57.9 1 GSC I0808w 12 41 53.93 +19 55 53.5 1 GSC I0809 12 42 08.0 +11 45 14 2 14.52 2.12 VCC WS I0810 12 42 08.83 +12 35 48.0 5 6.47 2.28 VCC WS GSC UZC CCA I0811=N4663 12 44 47.13 -10 11 53.0 4 1.85 1.01 WS SPC GSC GHD2 I0812 12 44 50.8 -04 26 05 2 2.12 0.71 ZGT WS I0813 12 45 11.81 +23 02 09.2 6 1.15 2.03 DC HCds WS UZC JG CCA I0814 12 45 34.126 -08 05 31.15 2 0.23 1.01 GSC KHJ I0815 12 46 22.545 +11 52 35.91 6 4.23 3.77 VCC Pds2 UZC KHJ GSC GD I0816 12 46 46.330 +09 51 04.79 6 1.71 7.26 GD HCds KHJ UZC VCC CCA I0817=I3764 12 46 56.699 +09 51 27.19 4 2.69 2.99 VCC HCds KHJ UZC I0817=I3764 comp 12 46 57.47 +09 51 17.7 1 HCds I0818 12 46 44.51 +29 44 06.3 5 1.02 0.95 WS UZC DFOT GSC BPP I0819=N4676A 12 46 10.18 +30 43 56.1 10 1.89 2.95 HHKK BPP Pds UZC WS CCA DC JG GHD1 DFOT I0820=N4676B 12 46 11.31 +30 43 23.1 10 1.87 3.52 WS BPP HHKK UZC Pds DC DFOT CCA JG GHD1 I0821 12 47 26.28 +29 47 14.8 8 3.03 0.93 WS DFOT K02 UZC BPP CCA JG DC I0822 12 47 45.561 +30 04 37.74 1 KHJ I0823 12 47 50.9 +27 12 12 1o Big I0823: 12 47 50.86 +27 12 33.0 1 HCds I0823?? 12 47 55.00 +27 11 32.8 2 1.41 1.63 WS WS I0824=N4678 12 49 42.18 -04 34 47.7 3 3.05 1.13 SPC HCds WS I0824=N4678 comp 12 49 41.06 -04 34 49.4 2 0.21 0.85 WS HCds I0825:ne 12 50 19.15 -05 21 46.7 2 1.80 2.40 WS HCds I0825:sw 12 50 18.62 -05 21 48.8 1 HCds I0825??=N4718 12 50 32.55 -05 16 55.8 5 1.07 1.19 WS HCds APMn GHD2 SPC I0826 12 51 19.94 +31 03 33.3 5 0.72 1.79 WS UZC JG BPP DFOT I0827 12 51 55.10 +16 16 56.9 3 0.74 0.53 WS CCA UZC I0828 12 52 15.62 -08 07 58.9 2 0.32 1.06 GSC WS I0829 12 52 27.449 -15 31 06.64 3 1.32 0.47 GSC KHJ HCds I0830 12 51 16.70 +53 41 45.9 4 3.15 2.17 WS UZC CCA DC I0831 12 52 43.96 +26 28 13.5 4 0.90 1.14 WS BPP UZC DFOT I0832 12 53 59.133 +26 26 38.40 5 0.84 1.61 DFOT KHJ GSC JG UZC I0833: 12 56 38.16 -06 44 00.2 2 0.95 1.34 HCds WS I0833??=N4813 12 56 36.19 -06 49 05.2 4 2.54 3.93 WS HCds SPC APMn I0834 12 56 18.595 +26 21 31.66 1 KHJ I0835 12 56 52.31 +26 29 13.6 7 1.21 1.80 K02 BPP K06 UZC DFOT WS JG I0836 12 55 54.13 +63 36 41.7 2 0.05 2.97 WS HCds I0837 12 57 31.24 +26 30 42.5 5 2.37 2.87 BPP DFOT UZC WS JG I0838=N4849A 12 58 13.61 +26 25 34.4 3 3.79 2.31 Pds2 DFOT WS I0839 12 58 15.06 +28 07 32.5 2 0.37 0.35 DFOT GSC I0840 12 58 42.09 +10 36 56.9 4 1.39 2.66 WS UZC CCA JA I0841 12 59 47.2 +21 48 45 1 WS I0842 13 00 39.59 +29 01 08.5 6 0.32 2.01 DFOT WS BPP UZC UZC CCA I0843 13 01 33.60 +29 07 49.4 5 0.62 1.14 BPP DFOT WS UZC CCA I0844 13 03 18.2 -30 31 14 3 0.00 2.31 ESOB GHD2 WS I0845 13 04 57.45 +12 04 43.4 2 0.93 1.56 HCds Pds I0846 13 05 21.1 +23 05 42 2 0.00 1.41 WS UZC I0847=N4973 13 05 32.189 +53 41 06.62 4 0.32 0.29 KHJ Pds UZC GSC I0848 13 07 01.5 +16 00 24 3 0.83 2.52 WS Pds UZC I0849 13 07 38.82 -00 56 33.8 8 2.06 1.75 SPC CCA WS GGH UZC APMn DC ZGT I0850 13 07 50.12 -00 52 07.0 6 1.80 1.06 ZGT UZC GGH SPC WS HC2m I0851 13 08 34.31 +21 02 58.3 4 2.06 1.02 WS UZC CCA JG I0852 13 07 36.818 +60 09 25.32 3 0.46 0.38 KHJ UZC CCA I0853=I4205 13 08 41.68 +52 46 25.8 4 1.53 0.53 Pds WS UZC CCA I0854 13 09 50.01 +24 34 38.8 5 1.49 1.33 WS K06 UZC DFOT JG I0855 13 10 36.6 -04 29 08 2 6.35 0.00 ZGT WS I0856 13 10 41.63 +20 32 11.6 3 0.24 1.00 JG WS UZC I0857 13 13 50.18 +17 04 32.9 3 0.76 2.01 WS CCA UZC I0858 13 14 51.970 +17 13 35.14 4 0.50 1.49 KHJ Pds UZC CCA I0859 13 14 57.315 +17 13 29.97 2 0.86 0.93 KHJ KEBA I0860 13 15 03.52 +24 37 06.7 4 0.26 2.14 WS UZC DFOT GSC I0861 13 15 07.42 +34 19 42.3 3 1.38 3.02 VPS CCA WS I0862 13 16 15.11 +20 02 49.3 4 7.24 1.03 JG WS Pds UZC I0863 13 17 12.2 -17 15 18 3 1.43 3.06 SHM WS Pds I0864 13 17 08.41 +20 41 31.8 2 0.30 1.98 WS HCds I0865 13 17 35.498 -05 50 01.74 2 0.02 0.41 KHJ GSC I0866 13 17 16.66 +20 41 27.8 4 0.74 1.45 Pds CCA WS HCds I0867 13 17 19.71 +20 38 16.7 4 0.24 2.74 CCA WS UZC HCds I0868 13 17 28.49 +20 36 44.5 4 0.21 1.81 HCds WS Pds2 UZC I0868 comp 13 17 30.142 +20 37 13.68 2 0.61 1.03 HCds KHJ I0869 13 17 30.8 +20 40 51 1 HCds I0869nw 13 17 29.912 +20 41 03.31 2 0.58 0.97 HCds KHJ I0869se 13 17 31.54 +20 40 40.4 1 HCds I0870 13 17 30.83 +20 36 00.0 4 1.75 2.08 WS Pds2 HCds UZC I0871 13 17 58.621 +04 24 11.57 7 1.39 1.60 GD UZC KHJ GSC GGH CCA Pds I0872 "corrected" 13 17 12 +06 21.4 1o Sw10 I0872 as printed 13 18 12 +06 21.4 1o Sw10 I0872: 13 17 01.61 +06 21 25.4 1 GGH I0872? 13 18 18.5 +06 20 07 2 1.05 0.71 GD WS I0873 13 18 16.247 +04 27 51.04 5 1.29 0.77 GD GGH KHJ Pds UZC I0874 13 19 00.4 -27 37 41 2 1.88 2.83 ESOB WS I0875 13 17 07.802 +57 32 20.71 5 2.70 2.80 UZC KHJ CCA DC SDP I0876 13 18 34.50 +04 29 09.6 5 1.92 1.39 GD GGH GSC WS UZC I0877 "corrected" 13 17 57 +06 04.9 1o Sw10 I0877 as printed 13 18 57 +06 04.9 1o Sw10 I0878 "corrected" 13 18 00 +06 07.2 1o Sw10 I0878 as printed 13 19 00 +06 07.2 1o Sw10 I0879=I4222 13 19 40.38 -27 25 45.3 3 1.54 1.06 ESOB WS HCds I0880 "corrected" 13 18 07 +06 06.7 1o Sw10 I0880 as printed 13 19 07 +06 06.8 1o Sw10 I0881 13 19 56.37 +15 51 00.1 4 0.79 1.40 WS Pds CCA UZC I0882 13 20 06.9 +15 53 51 3 0.83 1.15 Pds UZC WS I0883 13 20 35.42 +34 08 19.2 6 1.66 4.38 VPS RC2 HCds UZC CCA WS I0884 13 21 54 -12 43.8 1o Sw6 I0885 13 22 30.98 +21 18 57.9 4 0.99 1.11 JG Pds WS UZC I0886 13 23 57.486 -04 23 43.41 2 0.14 0.31 GSC KHJ I0887 13 24 11 -12 27.6 1o Sw6 I0888=N5136 13 24 51.41 +13 44 16.1 4 0.71 1.25 WS UZC GSC KEBA I0889 13 26 37.6 +11 52 09 3 1.47 0.00 WS UZC GD I0890 13 28 25.57 -16 05 32.5 2 2.14 0.42 WS GSC I0891 13 30 00.058 +00 18 18.01 4 5.16 1.43 UZC GGH KHJ ZGT I0892 13 31 45.891 -02 42 47.18 8 0.93 2.22 APMn DC KHJ GGH ZGT UZC SPC CCA I0893 13 31 47.23 -02 36 42.1 6 2.70 1.14 ZGT CCA UZC APMn GGH WS I0894 13 32 04.801 +17 02 55.35 3 1.46 0.63 Pds KHJ UZC I0895 13 32 17 +35 39.5 1o Sw8 I0896 13 34 10.227 +04 52 06.11 5 2.40 1.84 GD KHJ UZC CCA Pds I0897 13 34 19.442 +17 50 52.64 6 0.51 1.26 APMN HCds GSC2 GSCA UA20 Pds I0898 13 34 09.43 +13 16 51.1 1 HCds I0899 13 34 59.460 -08 05 29.91 1 KHJ I0900 13 34 43.04 +09 20 12.2 5 1.32 1.79 WS DC UZC CCA Pds I0901 13 35 42.5 +13 19 47 4 1.19 3.10 UZC JA WS Pds I0902 13 36 01.48 +49 57 35.2 5 6.00 4.89 CCA WS UZC VPS RGMH I0903 13 38 26.05 -00 13 42.5 6 1.80 2.93 ZGT CCA APMn SPC WS UZC I0904 13 38 32.30 +00 32 23.0 5 1.37 1.49 CCA UZC WS SPC ZGT I0905 13 40 02.906 +23 08 34.26 3 0.69 0.51 UZC KHJ Pds I0906 13 40 10.1 +23 20 25 2 0.97 1.41 WS Pds I0907: 13 39 22.89 +51 03 04.0 4 1.35 1.83 WS UZC Pds CCA I0908 13 41 19.0 -04 20 39 2 2.12 2.12 ZGT WS I0909 13 40 51.20 +24 28 22.5 4 0.74 1.54 GSC WS UZC K08 I0910 13 41 07.90 +23 16 53.8 4 0.76 2.07 WS GSC Pds UZC I0911 13 41 25.403 +23 14 50.14 4 0.56 0.78 KHJ GSC Pds CCA I0912 13 41 28.94 +23 14 41.9 3 1.18 1.55 GSC CCA WS I0913 13 41 29.67 +23 09 59.7 3 0.21 1.30 GSC WS CCA I0914 13 41 40.67 +23 11 21.7 3 0.76 0.06 WS GSC UZC I0915 13 43 27.317 -17 19 57.83 3 0.45 0.28 WS GSC KHJ I0916 13 42 38.129 +24 27 53.31 3 0.71 0.72 UZC KHJ Pds I0917? 13 42 31.3 +55 38 11 2 1.78 2.12 HCo WS I0918: 13 42 37.8 +55 31 45 1 HCo I0919: 13 42 47.44 +55 31 16.3 1 GSC I0920 13 45 24.7 -12 34 28 1 WS I0921: 13 43 08.0 +55 38 57 2 1.19 2.12 HCo WS I0922: 13 42 56.40 +55 36 11.6 2 0.60 2.76 GSC WS I0923: 13 43 14.3 +55 36 09 2 1.79 2.83 HCo WS I0924 13 45 37.65 -12 27 19.6 2 0.73 0.99 HCds WS I0925: 13 43 16.2 +55 36 54 2 1.19 2.83 HCo WS I0926: 13 43 39.3 +55 37 51 2 1.78 2.83 HCo WS I0927 13 45 52.367 -12 27 51.52 2 0.43 0.99 HCds KHJ I0928: 13 43 47.9 +55 34 04 1 HCo I0929: 13 43 45.10 +55 37 59.8 2 1.01 2.19 GSC WS I0930: 13 43 45.7 +55 38 45 2 1.19 3.54 HCo WS I0931: 13 43 49.2 +55 37 20 2 1.79 1.41 HCo WS I0932: 13 43 51.4 +55 38 46 2 1.19 2.83 HCo WS I0933 13 45 16.13 +23 13 07.5 3 0.60 0.80 HCds UZC CCA I0934: 13 43 52.5 +55 39 21 2 0.59 3.54 HCo WS I0935: 13 44 02.9 +55 38 58 1 HCo I0935? 13 44 05.5 +55 36 49 1 WS I0936: 13 44 09.1 +55 42 24 1 HCo I0937: 13 44 28.9 +55 37 44 2 2.38 0.71 HCo WS I0938: 13 44 31.3 +55 37 35 2 1.19 0.71 HCo WS I0939 13 47 43.116 +03 24 41.57 2 0.05 0.54 KHJ UZC I0940 13 47 57.7 +03 26 57 4 3.23 0.96 GD UZC Pds WS I0941 13 48 35.641 +24 00 54.35 3 0.06 0.55 UZC Pds2 KHJ I0942 13 47 41.111 +56 37 17.71 2 0.22 0.22 Pds KHJ I0943 13 50 32.1 +03 11 37 3 0.86 1.00 WS Pds UZC I0944 13 51 30.93 +14 05 30.1 3 1.53 2.10 WS UZC CCA I0945 13 47 07.55 +72 04 13.3 1 GSC I0946 13 52 08.20 +14 06 58.0 4 3.69 1.96 DC WS UZC CCA I0947 13 52 35.73 +00 49 05.5 7 3.26 1.53 ZGT WS Pds UZC DC SPC CCA I0948 13 52 26.48 +14 05 28.2 4 5.01 2.14 DC WS UZC CCA I0949 13 52 16.76 +22 31 16.1 4 0.83 0.96 WS STMW UZC CCA I0950ne 13 52 26.72 +14 29 27.8 4 1.38 1.80 WS HCds UZC CCA I0950sw 13 52 25.63 +14 29 20.8 2 0.20 1.70 HCds WS I0951 13 51 47.20 +50 58 41.4 4 1.27 2.89 DC WS UZC CCA I0952 13 53 41.83 +03 22 40.0 4 4.86 4.04 GD WS CCA UZC I0953 13 54 57 -30 17.0 1o OSt I0953?? 13 54 56.5 -30 21 22 1 WS I0954 13 49 56.60 +71 09 52.6 6 2.32 1.41 WS UZC Pds GSC CCA DC I0955 13 55 43 -30 15.7 1o OSt I0956n 13 54 40.2 +20 43 09 2 0.99 2.12 WS HCo I0956s 13 54 40.55 +20 42 58.7 3 0.77 2.12 WS GSC HCo I0957 13 56 08 -30 14.3 1o OSt I0958:=N5360 13 55 38.55 +04 59 02.4 6 4.92 2.26 Pds UZC WS HC2m CCA GH I0959 13 56 03.461 +13 30 19.22 5 1.15 2.13 UZC KHJ CCA Pds DC I0960n 13 56 00.16 +17 30 40.7 3 1.29 1.54 WS UZC HCds I0960s 13 55 59.08 +17 29 56.8 4 1.08 0.85 WS UZC CCA HCds I0961 13 55 46.7 +25 50 23 2 1.91 2.12 WS UZC I0962 13 57 13.25 +12 01 16.3 4 0.94 2.32 WS UZC DC CCA I0963 13 57 25.0 +17 24 27 3 0.00 0.58 UZC WS K06 I0964 13 57 41.284 +17 30 31.48 3 0.71 0.21 KEBA KHJ UZC I0965 13 57 47.501 +17 30 37.77 2 0.48 0.08 KHJ UZC I0966 13 58 14.00 +05 24 29.6 4 0.99 4.52 GD WS UZC CCA I0967 13 58 22.94 +14 27 25.5 4 0.70 1.30 WS GSC UZC K06 I0968ne 14 00 37.954 -02 54 23.12 1 KHJ I0968sw 14 00 36.619 -02 54 33.03 1 KHJ I0969 14 01 46.190 -04 10 49.38 2 0.21 0.01 GSC KHJ I0970 14 02 34.19 +14 33 08.7 3 0.72 1.13 UZC HCds CCA I0971 14 03 52.78 -10 08 27.2 3 1.48 1.89 WS GSC SPC I0972 14 04 25.93 -17 13 39.1 4 1.77 3.28 CK GSC 2MSP DKM2 I0973=N5467 14 06 29.37 -05 28 54.4 2 2.85 1.48 WS HCds I0974 14 06 34 -05 30.0 1o Bige I0974: 14 06 34.36 -05 29 32.7 1 HCds I0975 14 07 08.889 +15 19 03.71 2 0.87 1.81 KHJ Pds I0976 14 08 43.20 -01 09 42.4 6 2.40 2.33 DC SPC UZC APMn WS CCA I0977 14 08 42.1 -03 00 09 2 1.06 1.41 UZC WS I0978 14 08 58.121 -02 58 26.88 2 0.32 0.21 KHJ UZC I0979 14 09 32.32 +14 49 54.1 4 2.47 1.65 DC WS UZC CCA I0980 14 10 22.396 -07 20 33.48 2 0.26 0.21 GSC KHJ I0981 14 10 28.05 -04 10 17.9 2 1.06 3.32 WS HCds I0982 14 09 59.095 +17 41 45.21 3 1.00 0.41 GH KHJ CCA I0983 14 10 04.399 +17 44 01.63 5 3.07 1.54 GH KHJ UZC CCA DC I0984 14 10 07.7 +18 21 48 3 1.42 4.51 WS DC UZC I0985 14 11 33.0 -03 13 12 2 1.06 0.71 UZC WS I0986 14 11 26.261 +01 17 10.58 2 0.55 0.69 KHJ UZC I0987 14 11 31.9 +19 10 18 2 0.00 2.12 WS K15 I0988 14 14 32.088 +03 11 24.79 4 0.65 0.95 UZC KHJ GSC Pds I0989 14 14 51.24 +03 07 50.3 4 3.24 0.82 DC WS UZC CCA I0990 14 15 49.154 +39 47 52.44 4 0.22 0.10 VPS GSC UZC KHJ I0991 14 17 48.5 -13 52 23 3 1.46 2.89 WS APMn SPC I0992 14 18 14.89 +00 53 26.1 5 1.85 1.61 HCds WS UZC SPC CCA I0993 14 18 18.62 +11 12 59.0 3 0.34 1.89 HCds WS KEBA I0994 14 18 22.65 +11 11 41.6 6 1.23 1.61 WS HCds Pds UZC GD CCA I0994 comp 14 18 22.80 +11 11 27.3 1 HCds I0995 14 16 31.30 +57 48 35.2 4 2.70 1.68 UZC WS CCA DC I0996 14 17 22.09 +57 37 47.0 3 2.58 1.08 WS UZC CCA I0997: 14 19 59.46 -04 27 07.3 3 1.51 2.05 WS HCds SPC I0997n: 14 19 59.35 -04 27 02.1 3 1.57 2.78 HCds HCds HCo I0997s: 14 19 59.60 -04 27 08.3 3 3.33 1.00 HCds HCds HCo I0998? 14 20 19.36 -04 24 59.4 2 1.80 0.07 HCds WS I0999 14 19 32.677 +17 52 31.68 5 1.61 1.14 HCds KHJ UZC CCA DC I1000 14 19 40.179 +17 51 17.70 5 2.58 1.68 DC HCds UZC CCA KHJ I1001 14 20 39.65 +05 25 38.5 1 2MSX I1002 14 20 42.06 +05 29 08.2 2 4.85 0.78 GD GSCA I1003 14 21 29.778 +05 04 23.12 1 KHJ I1004ne 14 20 50.27 +17 39 55.9 1 HCds I1004nw 14 20 49.39 +17 39 58.6 1 HCds I1004sw 14 20 49.71 +17 39 47.6 1 HCds I1005=N5607 14 19 26.85 +71 35 14.9 5 4.16 5.36 SDP WS UZC CCA DC I1006 14 22 59.083 +23 47 39.97 3 0.02 0.73 KHJ UZC K02 I1007 14 24 36.4 +04 33 31 4 2.83 0.50 GD Pds WS UZC I1008=I4414 14 23 42.8 +28 20 48 1 HCds I1008ne=I4414ne 14 23 42.88 +28 20 50.8 4 2.43 1.25 WS UZC BPP HCds I1008sw=I4414sw 14 23 42.27 +28 20 45.3 1 HCds I1009 14 26 17.5 +12 21 11 2 3.11 1.41 GD UZC I1010 14 27 20.38 +01 01 32.7 5 1.59 1.67 SPC UZC WS CCA HCds I1011 14 28 04.530 +01 00 22.52 3 0.83 1.01 UZC KHJ KEBA I1012=I4431 14 27 09.48 +30 56 52.7 4 1.39 1.41 BPP WS UZC CCA I1013 14 27 58.8 +25 51 56 1 WS I1014 14 28 18.48 +13 46 48.0 5 2.89 0.64 K15 UZC CCA WS DC I1015 14 28 19.2 +15 25 10 1 WS I1015m 14 28 19.26 +15 25 16.2 1 HCds I1015ne 14 28 19.77 +15 25 19.4 2 1.63 1.34 HCds UZC I1015sw 14 28 18.85 +15 24 59.4 2 0.20 1.41 HCds UZC I1015w 14 28 18.75 +15 25 14.1 1 HCds I1016=I4424=N5619B 14 27 32.4 +04 49 15 3 0.86 1.00 WS Pds UZC I1017 14 28 07.22 +25 52 06.3 4 1.26 2.19 Pds WS CCA UZC I1018 14 28 12.8 +25 49 47 2 0.95 2.83 WS Pds I1019 14 28 13.4 +25 56 49 3 1.35 1.53 WS Pds UZC I1020 14 28 49.45 +26 01 55.9 4 0.85 0.78 WS Pds UZC CCA I1021 14 29 17.153 +20 39 15.94 3 0.73 0.79 KHJ CCA UZC I1022 14 30 01.87 +03 46 21.4 4 1.44 1.27 GD CCA WS UZC I1023 14 32 25 -35 48.2 1 ESOB I1024 14 31 27.02 +03 00 29.2 4 1.37 3.31 WS UZC DC CCA I1025 14 31 28.4 +07 03 48 4 0.74 2.99 Pds UZC GD WS I1026=N5653 14 30 10.39 +31 12 54.0 7 1.71 1.80 BPP WS DC Pds UZC GHD1 CCA I1027 14 29 48.423 +53 57 54.04 5 0.63 0.84 HCds Pds KHJ UZC CCA I1027 comp 14 29 48.92 +53 59 35.8 1 HCds I1028: 14 33 16.48 +41 39 01.2 4 0.82 0.83 WS UZC SBG2 CCA I1029 14 32 27.35 +49 54 15.4 6 2.50 3.45 CCA SBG2 WS UZC DC GHD1 I1030=N5672 14 32 38.44 +31 40 12.3 7 1.50 1.49 GHD1 BPP GSC UZC WS DC CCA I1031 14 34 23.974 +48 02 14.93 3 0.05 0.52 UZC SBG2 KHJ I1032 14 34 39.180 +47 58 05.77 2 0.30 0.77 KHJ SBG2 I1033 14 34 41.73 +47 56 14.7 3 0.58 1.64 UZC WS SBG2 I1034 14 37 13.692 +14 39 54.80 1 KHJ I1035 14 38 10.23 +09 20 10.4 4 0.07 0.47 GSC WS Pds UZC I1035 sup * 14 38 10.74 +09 20 20.2 1 GSC I1036 14 38 22.7 +18 06 38 1 WS I1037 14 38 25.378 +18 11 02.17 3 0.10 0.50 KHJ UZC Pds I1038 14 39 27.4 +11 55 41 2 1.04 1.41 GD UZC I1039 14 40 29.348 +03 25 56.96 3 0.56 0.82 Pds SPC KHJ I1040 14 40 22.67 +09 28 34.8 4 1.55 2.21 HCds GD K14 UZC I1041 14 40 37.8 +03 22 35 4 0.75 1.26 UZC Pds SPC WS I1042 14 40 38.92 +03 28 09.4 4 2.56 1.03 WS SPC UZC CCA I1043 14 40 43.291 +03 22 26.94 3 0.61 0.70 UZC GD KHJ I1044 14 41 28.9 +09 25 52 4 1.48 2.22 GD WS Pds UZC I1045?=N5731 14 40 09.21 +42 46 45.5 6 1.08 1.99 DC CCA WS UZC SBG2 GSC I1046 14 37 53.37 +69 00 51.3 4 0.98 1.16 WS GSC UZC Pds I1047 14 42 19.8 +19 11 29 2 1.00 0.71 Pds WS I1048 14 42 57.82 +04 53 23.4 5 3.70 1.94 DC SPC WS CCA UZC I1049 14 39 33.13 +62 00 09.7 3 1.22 1.04 WS UZC CCA I1050 14 44 07.139 +18 00 45.00 3 0.80 1.10 UZC KHJ Pds I1051 14 44 11.667 +19 01 12.69 2 1.53 0.40 KHJ UZC I1052 14 44 14.14 +20 36 49.8 3 0.81 0.58 UZC WS CCA I1053 14 45 43.2 +16 56 46 3 0.83 1.15 Pds WS UZC I1054 14 46 31.276 +01 16 28.25 4 0.59 0.78 KHJ CCA Pds UZC I1055=I4491 14 47 25.65 -13 42 59.5 5 0.73 1.61 WS APMn HCds MFSK SPC I1056=I1057 14 45 49.06 +50 23 38.3 6 0.76 1.40 WS K11 UZC DC Pds CCA I1057=I1056 14 45 49.06 +50 23 38.3 6 0.76 1.40 WS K11 UZC DC Pds CCA I1058 14 49 12.370 +17 01 14.08 4 0.80 0.55 Pds KHJ UZC CCA I1059 14 50 42.564 -00 52 32.89 2 0.41 0.34 KHJ Pds I1060 14 51 47.373 -07 13 58.89 3 0.81 1.21 APMn KHJ SPC I1061 14 51 14.2 +18 45 26 2 1.00 2.83 WS HCo I1062 14 51 17.665 +18 41 13.32 2 0.19 0.25 KHJ GSC I1063=I1064 14 52 11.09 +04 40 52.8 5 2.74 1.38 WS HCds UZC CCA SPC I1063=I1064 sup * 14 52 11.78 +04 40 56.0 1 HCds I1064=I1063 14 52 11.09 +04 40 52.8 5 2.74 1.38 WS HCds UZC CCA SPC I1065 14 49 21.24 +63 16 12.4 5 3.77 2.58 RC2 CCA WS GSC UZC I1066 14 53 02.80 +03 17 44.5 5 1.46 1.12 DC WS SPC UZC CCA I1067 14 53 05.35 +03 19 52.7 5 2.37 1.64 SPC WS CCA GH DC I1068 14 53 32.959 +03 04 37.72 4 1.51 1.01 SPC KHJ Pds UZC I1069 14 50 46.509 +54 24 39.21 4 1.12 0.80 Pds KHJ UZC CCA I1070 14 53 51.302 +03 29 03.77 4 1.25 1.39 SPC KHJ UZC Pds I1071 14 54 12.458 +04 44 59.25 5 1.86 1.48 DC SPC UZC KHJ CCA I1072 14 54 13.172 +04 50 28.81 4 0.76 1.04 SPC KHJ Pds UZC I1073 14 54 14.4 +04 47 38 4 0.00 0.82 WS Pds SPC UZC I1074 14 51 57.32 +51 15 52.9 3 1.38 1.57 WS UZC CCA I1075 14 54 49.26 +18 06 19.9 3 1.28 1.61 WS UZC CCA I1076 14 54 59.56 +18 02 14.7 5 1.95 2.13 WS DC UZC SDP CCA I1077 14 57 21.7 -19 12 52 3 2.17 3.21 WS SPC ESOB I1078 14 56 29.02 +09 21 15.3 4 0.95 1.68 WS UZC GSC CCA I1079 14 56 36.180 +09 22 10.18 4 0.70 1.37 UZC KHJ GSC CCA I1080 14 57 59.851 -06 43 24.91 2 0.67 1.45 KHJ SPC I1081 14 58 55.0 -19 14 23 3 0.00 2.65 ESOB SPC WS I1082 14 58 52.503 +07 00 25.61 3 0.77 0.50 SPC KHJ UZC I1083 14 55 33.3 +68 24 30 4 2.07 2.94 GD Pds WS UZC I1084 15 01 14.82 -07 28 30.9 3 0.77 2.71 Pds WS HC2m I1085 15 02 43.418 +17 15 08.47 4 0.88 0.94 KHJ Pds UZC HCds I1086 15 03 29.111 +17 06 52.03 3 1.54 0.54 Pds2 KHJ UZC I1087 15 06 43.854 +03 46 37.25 5 2.25 2.39 GD KHJ UZC GSC Pds I1087 comp 15 06 45.84 +03 46 20.4 2 0.85 0.28 UZC CCA I1088 15 06 47.47 +03 47 30.6 1 GSC I1089 15 07 26.076 +07 06 59.55 4 1.61 1.27 KHJ Pds UZC JA I1090 15 05 42.9 +42 40 59 1o Big I1091 15 08 13.7 -11 08 29 3 6.42 3.79 WS SPC GHD2 I1092 15 07 36.159 +09 21 31.05 3 0.67 2.87 KHJ UZC GD I1093 15 07 35.67 +14 32 53.0 4 1.22 1.64 UZC HCds CCA WS I1094ne 15 07 42.75 +14 37 38.9 2 1.23 1.41 HCds WS I1094nw 15 07 42.32 +14 37 42.0 3 1.49 2.25 WS HCds UZC I1094s 15 07 41.97 +14 37 20.8 3 1.00 1.85 HCds WS UZC I1095 15 08 35.07 +13 40 14.4 2 0.62 0.07 2MSX HCds I1095 comp 15 08 33.65 +13 40 32.2 1 HCds I1096 15 08 21.68 +19 11 31.0 1 HCds I1097 15 08 31.36 +19 11 02.6 4 0.53 0.74 WS UZC CCA HCds I1098 15 06 25.38 +55 36 04.2 2 1.67 2.47 HCds WS I1099 15 06 54.80 +56 30 31.2 4 2.22 2.16 UZC WS CCA GHD1 I1100=N5881 15 06 20.79 +62 58 50.5 5 0.82 1.95 WS GSC UZC CCA DC I1101 15 10 56.06 +05 44 41.5 4 3.20 0.48 JA UZC WS CCA I1102 15 11 04.91 +04 17 36.7 4 1.54 1.04 KEB2 WS UZC CCA I1103 15 11 35.877 +19 12 27.72 2 0.42 0.03 KHJ GSC I1104 15 12 49.88 -05 03 20.2 1 HCds I1105 15 13 13.896 +04 17 15.52 4 0.38 0.54 UZC Pds KHJ GSC I1106 15 13 56.23 +04 42 38.2 5 1.29 2.09 JA WS GSC Pds UZC I1107 15 14 08.886 +04 42 51.77 4 2.05 0.42 JA KHJ GSC UZC I1107w 15 14 08.16 +04 43 03.3 2 0.42 1.34 GSC HCo I1108=N5882 15 16 49.98 -45 38 56.2 5 0.95 2.09 GSC DKM2 Ty2 ESOB WS I1109 15 17 03.943 +05 15 22.06 4 0.88 1.29 JA Pds UZC KHJ I1110 15 12 05.04 +67 21 44.9 4 1.39 1.99 UZC GSC WS CCA I1111=N5876 15 09 31.54 +54 30 22.1 5 4.43 3.69 GHD1 WS UZC CCA DC I1112 15 17 47.4 +07 13 08 3 0.86 5.51 WS UZC JA I1113 15 18 15.2 +12 29 17 4 1.40 1.71 WS UZC Pds GD I1114 15 11 19 +75 26.5 1o Big I1114: 15 11 25.67 +75 25 36.1 1 HCds I1115 15 22 19.0 -04 28 27 2 0.00 2.83 HCm WS I1115 nw* 15 22 18.76 -04 28 23.1 1 HCds I1115 se* 15 22 19.19 -04 28 29.8 1 HCds I1116 15 21 55.2 +08 25 26 4 1.42 3.11 GD WS UZC JA I1117 15 24 22.895 +15 29 18.91 2 0.12 0.28 GSC KHJ I1118=I4543 15 24 59.452 +13 26 42.74 5 1.37 2.22 GD Pds UZC GSC KHJ I1119 15 25 44.4 -03 39 22 2 1.06 2.12 Pds2 HCm I1119nw 15 25 44.132 -03 39 13.82 2 0.30 0.46 HCds KHJ I1119se 15 25 44.71 -03 39 30.6 2 0.21 2.40 HCds WS I1120 * 15 26 11.55 +18 52 30.8 1 HCds I1120n 15 26 11.20 +18 52 24.9 2 3.41 4.31 HCds WS I1120s 15 26 10.84 +18 52 15.9 2 0.70 1.48 HCds WS I1121 15 27 44.085 +06 48 13.76 3 0.79 2.01 JA KHJ Pds I1122 15 29 23.01 +07 37 01.9 1 GSC I1123 15 28 54.10 +42 53 54.4 1 GSC I1124 15 30 00.97 +23 38 17.7 4 1.95 1.71 WS UZC CCA DC I1125=:I1128 15 33 05.63 -01 37 43.7 9 1.68 0.66 STMM HCo GSC UZC SPC Pds DC WS CCA I1126 15 35 00.69 +04 59 26.3 1 HCds I1127=I4553 15 34 57.36 +23 30 10.4 7 2.12 1.89 CCA JCR CCBD GSC Pds UZC DC I1127n=I4553n 15 34 57.1 +23 30 16 1 HCo I1127s=I4553s 15 34 57.3 +23 30 05 2 0.97 0.71 WS HCo I1128:=I1125 15 33 05.63 -01 37 43.7 9 1.68 0.66 STMM HCo GSC UZC SPC Pds DC WS CCA I1128?? 15 37 52.961 -01 44 06.77 3 0.90 1.70 KHJ Pds CCA I1129 15 32 00.28 +68 14 47.5 4 5.20 3.37 DC UZC WS CCA I1130 15 37 43.99 +17 14 39.1 4 0.36 1.55 WS Pds UZC HCds I1131 15 38 51.683 +12 04 49.99 3 0.39 0.14 GH UZC KHJ I1132 15 40 06.75 +20 40 49.2 4 1.05 2.51 WS UZC DC CCA I1133 15 41 12.12 +15 34 21.9 3 1.04 0.50 WS UZC CCA I1134nw 15 44 58.534 +16 57 42.91 3 0.89 1.62 KHJ UZC Pds I1134se 15 44 59.9 +16 57 30 1 WS I1135 15 45 34.7 +17 41 58 3 0.82 1.15 WS UZC Pds I1136 15 47 34.396 -01 32 43.14 2 0.30 0.04 KHJ UZC I1137 15 48 32.50 +08 35 18.5 1 HCds I1138 15 48 15.83 +26 12 21.5 4 1.06 1.61 WS Pds UZC CCA I1139 15 29 25.857 +82 35 00.06 3 0.46 2.19 Pds HCrs KHJ I1140 15 49 25.3 +19 06 48 1 HCds I1140 e * 15 49 26.54 +19 06 40.5 1 HCds I1140 nw * 15 49 24.74 +19 07 01.5 1 HCds I1140 sw * 15 49 23.95 +19 06 47.0 1 HCds I1141 15 49 46.98 +12 23 56.8 5 1.93 1.82 UZC KET2 WS CCA DC I1142 15 50 25.92 +18 08 22.2 4 0.88 0.98 WS UZC HCds CCA I1143 15 30 55.673 +82 27 20.40 5 1.26 1.70 Pds2 HCrs KHJ Pds CCA I1144 15 51 21.830 +43 25 03.99 7 1.79 1.23 KHJ SBG2 UZC CCA KOS SDP DC I1145 15 44 08.32 +72 25 51.4 4 2.57 1.73 GD WS UZC CCA I1146 15 48 22.042 +69 23 07.52 4 0.49 0.69 Pds KHJ GSC UZC I1147 15 50 11.5 +69 33 34 3 0.79 1.00 Pds WS UZC I1148=N6020 15 57 08.208 +22 24 15.97 5 1.33 0.54 KHJ GSC UZC CCA DC I1149 15 58 08.03 +12 04 11.5 4 1.20 2.21 WS UZC CCA DC I1150 15 58 18.6 +15 52 28 1o J I1150?=N6018 15 57 29.81 +15 52 20.6 5 1.19 2.09 HC CCA WS GSC UZC I1151 15 58 32.28 +17 26 30.6 7 2.56 3.56 K02 DC HC WS GSC UZC CCA I1152 15 56 43.36 +48 05 41.7 5 1.29 2.17 WS SBG2 UZC CCA DC I1153 15 57 03.14 +48 10 05.1 5 2.10 0.75 SBG2 UZC WS CCA DC I1154 15 52 28.555 +70 22 29.92 5 1.55 0.84 GD Pds KHJ UZC CCA I1155 16 00 35.74 +15 41 06.6 6 0.82 2.35 RGMH WS HC K02 UZC GSC I1156 16 00 37.429 +19 43 23.27 5 2.78 0.73 HCo KHJ UZC GSC HC I1157 16 00 56.21 +15 31 33.2 3 1.04 2.00 HC WS GSC I1158 16 01 34.03 +01 42 26.7 5 2.33 2.44 DC SPC UZC CCA WS I1159 16 01 01.52 +15 25 08.8 4 1.28 2.20 HC GSC WS HCo I1160 16 01 02.53 +15 29 39.4 5 0.63 2.63 K02 GSC HC Pds WS I1161 16 01 16.856 +15 38 41.32 4 0.56 3.24 KHJ GSC HC UZC I1162 16 01 16.23 +17 40 39.9 6 2.44 1.97 RGMH K02 WS UZC GSC HC I1163 16 01 30.62 +15 30 12.3 4 0.58 2.66 GSC HC UZC WS I1164 15 55 02.71 +70 35 11.4 2 0.07 2.40 GSC WS I1165=I1165A=I1165n 16 02 07.98 +15 41 45.5 7 2.39 2.89 RGMH HCds WS IPds GSC UZC HC I1165s=I1165B 16 02 08.61 +15 41 33.4 5 1.48 2.73 HCds HC WS HCo IPds I1166 16 02 08.8 +26 19 38 3 1.55 3.06 HCm J WS I1166n 16 02 08.92 +26 19 44.7 3 1.16 2.23 HCds WS K03 I1166s 16 02 08.85 +26 19 29.1 3 0.78 2.53 HCds WS UZC I1167 16 03 52.92 +14 56 44.4 3 0.67 1.85 GSC HC WS I1167 comp 16 03 55.9 +14 57 19 1 HC I1168=I1168A 16 03 55.719 +14 54 07.28 4 0.77 1.91 GSC KHJ Pds HC I1168B 16 03 56.2 +14 53 34 1 HC I1169 16 04 13.43 +13 44 35.7 4 0.97 2.76 DC WS UZC CCA I1170 16 04 31.75 +17 43 16.3 3 3.73 1.22 WS GSC BC I1171 16 04 51.85 +17 58 43.6 2 0.10 3.32 WS HCds I1172=N6044 16 04 59.67 +17 52 11.3 4 1.17 1.20 WS GH GSC BC I1173 16 05 12.76 +17 25 20.5 6 2.94 3.53 GSC CCA WS BC GH RGMH I1174 16 05 26.86 +15 01 30.1 6 1.48 3.00 DC UZC GSC CCA WS HC I1175 16 05 22.61 +18 09 47.2 1 HCds I1176=N6056 16 05 31.30 +17 57 48.8 5 1.56 3.24 WS GSC UZC BC GH I1177 16 05 19.5 +18 18 52 2 1.01 0.00 WS BC I1178=I1181A 16 05 33.009 +17 36 01.55 6 3.15 4.84 GH BC KHJ GSC UZC CCA I1179A=N6050A 16 05 23.39 +17 45 26.0 7 3.64 3.03 BC HCo UZC CCA WS RGMH Pds I1179B=N6050B 16 05 22.28 +17 45 13.8 6 2.02 4.45 HCo WS BC CCA RGMH Pds I1180 16 05 30.1 +18 08 54 1 HC I1181=I1181B 16 05 33.76 +17 35 33.5 6 2.61 4.58 GH BC WS UZC GSC CCA I1182 16 05 36.779 +17 48 06.20 10 1.48 2.33 GH K02 KHJ HC2m EDC SDP BC UZC GSC CCA I1183=N6054 16 05 38.04 +17 46 02.0 6 1.73 2.42 GH BC WS UZC GSC HC2m I1184 16 05 42.8 +17 47 20 2 2.02 3.54 HC2m WS I1184 ** 16 05 42.2 +17 47 16 1 HC I1184 n * 16 05 42.92 +17 47 29.4 1 HC2m I1184 se * 16 05 42.82 +17 47 21.4 1 HC2m I1184 sw * 16 05 42.51 +17 47 20.9 1 HC2m I1185 16 05 44.634 +17 42 58.56 6 3.31 2.66 GH BC KHJ GSC UZC HC I1186 16 05 44.19 +17 21 41.9 6 1.42 4.23 RGMH WS UZC GH GSC BC I1187 15 59 10.101 +70 33 23.88 3 1.04 1.48 Pds KHJ GD I1188e 16 06 08.2 +17 27 37 2 2.02 5.66 HC HCo I1188w 16 06 07.31 +17 27 35.3 3 0.73 3.04 WS GSC BC I1189 16 06 14.76 +18 10 56.8 5 1.67 1.72 WS BC UZC GSC SDP I1190 16 05 52.41 +18 13 13.3 3 0.25 0.15 CCA LEDA GSC I1191e 16 06 29.5 +18 16 02 2 3.02 1.41 HC HCo I1191w 16 06 28.8 +18 16 04 3 2.17 1.53 WS BC HCo I1192 16 06 33.12 +17 46 32.3 4 1.18 0.68 WS BC GSC UZC I1193 16 06 32.12 +17 42 48.1 3 1.74 1.75 BC WS GSC I1194 16 06 39.305 +17 45 39.25 5 0.65 0.81 GH KHJ BC UZC GSC I1194A 16 06 38.6 +17 46 59 2 0.00 1.41 BC HCo I1195 16 06 40.8 +17 11 28 3 0.83 0.58 WS BC UZC I1196 16 07 58.41 +10 46 45.8 3 0.00 0.12 UZC WS CCA I1197 16 08 17.25 +07 32 18.6 3 1.80 1.47 CCA WS UZC I1198 16 08 36.378 +12 19 49.95 5 0.73 2.08 WS K02 EDC KET2 UZC I1199 16 10 34.34 +10 02 23.6 4 1.39 1.28 UZC WS Pds CCA I1200=N6079 16 04 29.06 +69 39 56.4 6 1.92 1.10 GD WS GSC UZC CCA DC I1201 16 05 41.67 +69 35 37.5 4 0.76 1.29 WS GSC CCA Pds I1202=N6081 16 12 56.850 +09 52 01.67 5 0.86 1.48 UZC Pds DC KHJ CCA I1203 16 15 16 -22 20.5 1o JT I1203: 16 15 16.0 -22 22 14 1 HCds I1204 16 07 15.50 +69 55 52.3 4 1.39 0.96 WS GSC UZC GD I1205 16 14 15.890 +09 32 13.17 2 0.23 0.01 UZC KHJ I1206 16 15 13.07 +11 17 50.0 5 1.03 1.29 WS Pds UZC GSC CCA I1207 16 19 26.7 -29 39 01 2 0.92 3.54 WS HCds I1208 16 15 47.89 +36 31 37.7 3 0.82 1.37 WS UZC SBG2 I1209 16 18 39.624 +15 33 29.49 6 2.98 0.93 HC GSC KHJ CCA UZC Pds I1210 16 14 30.31 +62 32 11.4 4 2.86 3.05 WS GSC CCA DC I1211 16 16 52.10 +53 00 21.2 4 2.37 0.95 WS UZC CCA DC I1212 16 15 30.769 +64 13 29.66 2 0.21 0.43 KHJ UZC I1213=N6172 16 22 10.307 -01 30 54.04 5 0.65 0.78 DC KHJ UZC SPC CCA I1214 16 16 11.59 +65 58 06.8 4 1.17 1.30 WS Pds UZC CCA I1215 16 15 34.96 +68 23 50.9 4 0.61 4.35 DC WS UZC CCA I1216 16 15 54.95 +68 21 00.9 4 3.01 6.56 GD WS Pds CCA I1217 16 16 04 +69 40.6 1o Sw7 I1218 16 16 36.9 +68 12 08 3 0.64 1.00 WS UZC Pds I1219 16 24 27.50 +19 28 58.6 5 0.75 1.40 UZC WS GSC Pds CCA I1220 16 29 38.28 +08 27 02.8 1 GSC I1221 16 34 41.62 +46 23 31.1 5 1.10 2.11 SBG2 WS CCA UZC RGMH I1222 16 35 09.10 +46 12 49.0 5 0.99 1.96 WS SBG2 Pds UZC CCA I1223 16 35 42.444 +49 13 13.95 3 0.33 0.95 SBG2 KHJ UZC I1224 16 42 56.383 +19 15 13.53 3 1.72 4.02 KHJ UZC JA I1225 16 36 52.48 +67 37 44.4 4 0.91 1.44 WS UZC Pds CCA I1226=:I1232 16 41 06.59 +46 00 13.7 3 0.48 1.61 SBG2 WS UZC I1227=N6206 16 40 08.02 +58 37 02.0 5 2.24 1.93 UZC CCA WS HCds DC I1228 16 42 06.63 +65 35 06.2 4 1.91 0.95 WS UZC CCA DC I1229 16 44 58.63 +51 18 28.2 2 1.52 2.69 HCds WS I1230 ne comp 16 45 01.69 +51 16 08.8 1 HCds I1230 nw comp 16 44 59.59 +51 16 16.0 1 HCds I1230 w comp 16 44 55.71 +51 15 32.4 1 HCds I1230=I1230n 16 45 01.44 +51 15 35.6 4 0.97 1.72 WS Pds HCds CCA I1230s 16 45 01.49 +51 15 31.2 1 HCds I1231 16 46 59.03 +58 25 21.7 4 1.52 1.48 DC UZC WS CCA I1232:=I1226 16 41 06.59 +46 00 13.7 3 0.48 1.61 SBG2 WS UZC I1233ne=N6247ne 16 48 21.48 +62 58 44.0 1 HCds I1233sw=N6247sw 16 48 19.76 +62 58 35.1 4 2.72 1.09 WS DC CCA HCds I1234 16 52 50.92 +56 52 40.0 1 HCds I1235 16 52 02.7 +63 06 58 3 6.39 3.61 KEB1 WS UZC I1236 16 58 29.71 +20 02 26.2 4 2.44 2.31 UZC WS CCA JA I1237 16 56 15.84 +55 01 34.2 4 2.82 1.71 GHD1 WS CCA UZC I1238 17 00 30.2 +23 04 34 2 0.98 2.12 HCo WS I1239=N6276 17 00 45.085 +23 02 38.70 4 0.15 0.49 KHJ GSC UZC KEBA I1240 17 00 58 +61 03.0 1o Bige I1241 17 01 28.53 +63 41 26.7 4 3.49 1.32 WS CCA UZC DC I1242 17 08 42.94 +04 02 58.2 3 0.09 1.65 WS UZC CCA I1243 17 10 24.5 +10 46 03 2 0.00 4.95 WS HCds I1244 17 10 33.746 +36 18 11.68 4 0.80 0.48 KHJ SBG2 UZC CCA I1245 17 12 36.73 +38 01 12.5 4 1.16 1.43 SBG2 CCA UZC WS I1246 17 14 12.28 +20 14 14.3 1 HCds I1247 17 16 22.13 -12 46 52.4 2 0.21 1.77 WS HCds I1248 17 11 40.32 +59 59 43.6 4 3.07 2.87 WS UZC CCA GHD1 I1249 17 14 55.00 +35 31 13.6 3 1.22 2.25 WS SBG2 UZC I1250 17 14 28.950 +57 25 01.61 2 1.84 1.59 HCds KHJ I1251 17 10 12.87 +72 24 35.4 4 2.54 1.68 DC WS UZC CCA I1252=I4649 17 15 50.25 +57 21 59.4 3 1.69 1.38 WS HCds CCA I1252=I4649 comp 17 15 47.45 +57 22 12.0 1 HCds I1253=N6347 17 19 54.73 +16 39 37.6 4 2.46 1.30 WS UZC CCA HCds I1254 17 11 33.58 +72 24 06.5 4 0.97 1.92 WS Pds CCA UZC I1255 17 23 05.44 +12 41 43.9 4 0.73 0.55 WS DC UZC CCA I1256 17 23 47.28 +26 29 11.3 5 0.98 2.34 Pds DC WS UZC CCA I1257 17 27 08.47 -07 05 35.6 2 0.21 0.64 GSC HCrs I1258 17 27 17.34 +58 29 06.6 5 1.22 1.19 WS DC CCA GSC UZC I1259e 17 27 26.69 +58 30 58.5 5 1.98 1.37 GSC DC WS UZC CCA I1259w 17 27 24.74 +58 30 59.7 4 1.29 1.56 WS GSC CCA DC I1260 17 27 31.664 +58 28 33.04 3 0.55 0.16 Pds KHJ GSC I1261e 17 23 26.126 +71 15 45.95 3 0.55 0.54 Pds KHJ UZC I1261w 17 23 20.8 +71 15 49 2 0.68 2.12 WS UZC I1262 17 33 02.10 +43 45 33.8 4 0.65 1.14 WS SBG2 UZC CCA I1263 17 33 07.16 +43 49 17.7 5 1.44 1.61 WS Pds SBG2 UZC CCA I1264 17 33 16.87 +43 37 43.4 3 1.00 1.91 WS SBG2 CCA I1265 17 36 39.477 +42 05 17.16 5 1.37 1.03 SBG2 KHJ UZC CCA DC I1266 17 45 35.27 -46 05 22.4 4 2.15 1.58 ESOB UCA1 HCds WS I1267 17 38 45.86 +59 22 22.1 4 0.70 2.20 UZC DC WS CCA I1268 17 50 39.292 +17 12 33.59 3 0.06 1.07 KHJ Pds UZC I1269 17 52 05.99 +21 34 08.4 5 1.71 2.24 WS UZC CCA Pds DC I1270 17 47 57.0 +62 13 24 1 HC I1271 18 05 13 -24 24.6 1 HCe I1271* 18 05 10 -24 23.9 1 ESOB I1272 18 04 55.7 +25 07 45 1 HCds I1273 18 05 02.9 +25 07 57 2 2.88 2.83 HCds WS I1273 ne * 18 05 03.1 +25 08 01 1 HCds I1273 sw * 18 05 02.3 +25 07 49 1 HCds I1274 18 09 51 -23 38.9 1 HCe I1274+I1275 18 10 04 -23 42.4 1 ESOB I1275 18 10 07 -23 45.7 1 HCe I1276 18 10 45.4 -07 12 46 2 0.00 3.54 HCrs HCsv I1277 18 10 27.28 +31 00 11.5 5 0.41 1.15 HCds WS BPP UZC CCA I1278 18 10 41.7 +31 08 58 2 1.82 2.12 HCds WS I1279 18 11 15.31 +36 00 26.4 5 2.90 2.43 DC SBG2 WS CCA UZC I1280=N6581 18 12 18.432 +25 39 43.99 6 0.65 1.46 HCds GSC KHJ UZC HCo Pds I1281n 18 11 38.167 +35 59 49.74 3 0.51 0.57 SBG2 KHJ UZC I1281s 18 11 38.01 +35 59 14.5 1 SBG2 I1282 18 14 05.2 +21 06 07 1 HCds I1283 18 17 16.8 -19 45 43 1 HCds I1284 18 17 39 -19 40.3 1 HCe I1285 18 16 10.0 +25 06 03 2 3.84 2.83 WS HCds I1286 18 16 14.30 +55 35 25.3 3 0.91 2.92 UZC CCA WS I1287 18 31 25.67 -10 47 44.2 1 SAO I1288 18 29 22.51 +39 42 47.5 5 0.55 0.30 UZC WS SBG2 CCA DC I1289 18 30 02.28 +39 57 50.4 3 1.18 0.95 WS SBG2 UZC I1290 18 38 35 -24 05.8 2 0.00 0.00 ESOB HCe I1291 18 33 52.20 +49 16 43.0 6 5.80 1.73 DC STMM WS SBG2 CCA UZC I1292 18 44 40 -27 49.0 1o WF I1293 18 41 37.3 +56 19 01 2 7.66 3.54 HCds WS I1294: 18 49 50.5 +40 12 33 1 HCds I1294? 18 49 22.9 +40 06 18 1 WS I1295 18 54 37.20 -08 49 36.2 4 2.51 2.02 BSV GSC2 CK DKM1 I1296 18 53 18.82 +33 03 59.0 4 0.83 2.10 WS UZC SBG2 CCA I1297 19 17 23.37 -39 36 46.7 4 1.48 0.38 ESOB GSC GSCA CK I1298 19 18 35.7 -01 35 46 1 HCds I1299 19 22 42.0 +20 44 22 1 HCds I1300=N6798 19 24 03.29 +53 37 29.3 5 2.11 2.59 WS GSC UZC CCA DC I1301:=I4867 19 26 31.967 +50 07 31.14 6 1.03 1.07 DC HCds KHJ UZC CCA SBG2 I1301? 19 26 37.34 +49 45 29.5 4 0.58 1.16 WS UZC SBG2 CCA I1302 19 30 53.0 +35 47 03 1 WS I1303 19 31 30.23 +35 52 32.8 2 0.69 2.69 WS CCA I1304 19 35.6 +41 06 1 HCe I1305 19 39 17.1 +20 11 39 1 HCds I1306 19 41 41 +37 41.1 1 HCe I1306? 19 41 42.0 +37 38 59 1 WS I1307 19 42.5 +27 45 1 HCe I1308 19 45 05.4 -14 43 17 3 4.19 2.89 GHD2 WS HC I1309 20 03 01.4 -17 13 55 2 0.00 4.24 SHM WS I1310 20 10 01.0 +34 58 07 1 HCds I1311 20 10 47.8 +41 10 26 1 HCds I1312 20 16 51.5 +18 02 45 1 HCds I1313 20 18 43.579 -16 56 47.95 4 1.05 2.72 SHM SPC WS KHJ I1314 20 17.8 +25 05 1 HCe I1315 20 17 21.8 +30 41 17 2 1.83 4.24 WS HCds I1316.1 20 22 25.9 +06 30 06 1o Bign I1316.2 20 22 28.2 +06 30 00 1o Bign I1317 20 23 15.54 +00 39 51.7 6 0.98 2.08 DC WS SPC GH CCA UZC I1318 20 22 13.699 +40 15 24.07 1 Ty2 I1318? 20 27 54.0 +39 59 59 1 WS I1319 20 26 01.6 -18 30 15 2 7.03 1.41 WS ESOB I1320 20 26 25.59 +02 54 34.5 5 4.25 2.95 DC SPC WS UZC CCA I1321 20 28 11.2 -18 17 31 3 4.93 0.58 SPC WS ESOB I1322 20 30 08.459 -15 13 40.49 3 1.21 0.60 WS KHJ GSC I1323 20 30 29.4 -15 10 56 2 7.16 2.83 HCds WS I1323 e* 20 30 29.60 -15 10 55.9 1 HCds I1323 w* 20 30 28.48 -15 10 55.0 1 HCds I1324 20 32 12.303 -09 03 22.44 2 0.24 0.58 SPC KHJ I1325=N6928 20 32 50.09 +09 55 39.0 6 3.96 3.35 DC GH WS HCds UZC CCA I1326=N6930 20 32 58.76 +09 52 26.9 5 2.64 3.09 GH HCds WS UZC DC I1326=N6930 comp 20 32 59.10 +09 52 54.8 2 1.78 2.19 HCds DC I1327 20 35 41.28 -00 00 21.3 4 1.93 2.34 UZC GSC WS Pds2 I1328 20 41 57.0 -19 37 58 2 1.00 3.54 WS ESOB I1329 20 43 42.1 +15 35 50 1 HCds I1330 20 46 14.8 -14 01 24 2 0.00 0.71 WS SPC I1331 20 47 48.8 -09 59 44 3 0.00 1.15 Pds SPC WS I1332 20 51 51.362 -13 42 41.69 2 0.77 0.28 HCds KHJ I1332 comp 20 51 52.34 -13 42 32.7 1 HCds I1333 20 52 17.4 -16 14 35 1o J I1333=I1334 20 52 17.187 -16 17 09.28 4 0.66 1.15 WS KHJ GSC SPC I1334=I1333 20 52 17.187 -16 17 09.28 4 0.66 1.15 WS KHJ GSC SPC I1335 20 53 06.104 -16 20 07.51 3 1.09 0.36 WS GSC KHJ I1336 20 55 04.8 -18 02 19 2 3.02 0.71 ESOB WS I1337 20 56 52.64 -16 35 08.9 3 0.50 2.16 WS SPC GSC I1338 20 56 57.737 -16 29 33.03 3 2.61 0.42 WS KHJ GSC I1339 20 57 55.5 -17 56 33 3 0.82 0.58 ESOB WS SPC I1340 20 56 08.3 +31 02 52 1 HCds I1341 21 00 16.685 -13 58 34.22 2 0.06 0.81 KHJ Pds2 I1342 21 00 25.5 -14 29 43 1 WS I1343 21 01 00.686 -15 24 13.54 3 0.39 0.78 KHJ GSC WS I1344 21 01 16.6 -13 22 50 2 2.06 0.71 WS Pds2 I1345 21 01 22.205 -13 23 51.19 2 0.19 0.34 KHJ GSC I1346 21 01 37.07 -13 57 38.0 2 0.72 0.71 GSC WS I1347 21 01 44.439 -13 18 47.59 5 1.13 0.41 SPF DWFr KHJ DWFo SPC I1348 21 01 44.041 -13 21 26.88 2 0.22 0.22 KHJ GSC I1349 21 01 50.468 -13 15 55.52 2 0.36 0.33 KHJ GSC I1350=I1354 21 01 52.273 -13 51 09.20 3 0.97 0.44 Pds2 KHJ GSC I1351 21 01 52.452 -13 12 06.41 2 0.21 0.46 KHJ GSC I1352 21 01 54.84 -13 23 05.0 2 1.13 0.78 WS GSC I1353 21 01 56.32 -13 16 22.0 2 0.62 0.64 WS GSC I1354=I1350 21 01 52.273 -13 51 09.20 3 0.97 0.44 Pds2 KHJ GSC I1355 21 01 58.398 -13 10 22.60 2 0.24 0.30 KHJ GSC I1356 21 02 53.11 -15 48 42.9 3 1.96 2.14 HCds WS Pds2 I1356 comp 21 02 51.74 -15 49 26.2 1 HCds I1357 21 05 57.310 -10 42 59.10 3 0.15 0.92 KHJ SPF SPC I1358 21 06 29.57 -16 12 15.2 2 2.44 0.85 GSC WS I1359 21 08 42.95 +12 29 02.1 4 1.03 1.79 Pds WS UZC CCA I1360 21 10 50.3 +05 04 16 3 2.28 0.58 HC WS Pds I1361 21 11 29.200 +05 03 15.40 4 0.87 0.91 KHJ UZC CCA HC I1362 21 11 52.683 +02 19 44.02 2 0.89 0.42 KHJ Pds I1363 21 10 40.4 +46 52 12 1 HCds I1364 21 13 24.687 +02 46 10.14 3 0.14 0.87 KHJ Pds UZC I1365 21 13 55.8 +02 33 52 4 1.89 0.58 SPC Pds UZC WS I1366 21 14 07.993 +01 46 32.66 2 0.39 1.90 Pds KHJ I1367 21 14 09.751 +02 59 36.53 3 1.03 1.16 KHJ UZC Pds I1368 21 14 12.50 +02 10 39.4 5 3.76 0.81 DC WS UZC SPC CCA I1369 21 12 09.0 +47 46 06 1 HCds I1370 21 15 14.18 +02 11 31.1 4 2.14 1.45 UZC HCds WS Pds I1370 comp1 21 15 13.41 +02 11 32.4 1 HCds I1370 comp2 21 15 12.38 +02 11 34.9 1 HCds I1370 comp3 21 15 14.10 +02 11 46.0 1 HCds I1370 comp4 21 15 14.12 +02 11 21.4 1 HCds I1370 comp5 21 15 15.24 +02 11 26.9 1 HCds I1370 comp6 21 15 12.67 +02 11 36.8 1 HCds I1370 comp7 21 15 14.85 +02 11 33.2 1 HCds I1371 21 20 15.596 -04 52 36.36 2 1.12 1.15 SPC KHJ I1372 21 20 17.11 -05 36 16.9 2 0.42 1.70 WS GSC I1373 21 20 37.287 +01 05 32.03 4 0.78 0.82 KHJ GSC Pds UZC I1374 21 21 02.659 +01 42 45.40 2 0.24 1.82 KHJ Pds I1375 21 20 59.768 +03 59 06.49 3 0.26 1.30 Pds UZC KHJ I1376 21 24 41 -05 44.5 1o THS I1377 21 25 26.7 +04 18 49 2 2.12 1.41 UZC WS I1378 21 22 51.7 +55 27 51 1 HCds I1379 21 26 01.1 +03 05 47 1 WS I1380 21 27 10.989 +02 43 02.86 2 0.28 1.04 UZC KHJ I1381 21 27 33.745 -01 11 17.88 2 1.57 1.41 KHJ Pds I1382=N7056 21 22 07.56 +18 39 55.7 4 0.64 1.50 WS DC UZC CCA I1383 21 27 39.6 -01 06 08 2 2.12 1.41 WS Pds I1384 21 27 53.1 -01 22 07 2 1.06 1.41 WS UZC I1385 21 28 51.2 -01 04 11 3 1.50 0.58 WS UZC Pds I1386 21 29 37.6 -21 11 44 2 3.95 1.41 WS ESOB I1387 21 29 34.471 -01 21 03.08 3 0.75 0.55 KEBA KHJ UZC I1388 21 29 52.200 -00 37 52.27 3 0.37 0.54 KHJ KEBA UZC I1389 21 32 08.0 -18 01 08 2 0.00 2.83 ESOB WS I1390 21 32 24.8 -01 51 44 3 1.50 0.00 UZC Pds2 WS I1391 21 35 00.36 -00 30 42.0 2 0.95 1.48 HCds Pds2 I1392 21 35 32.63 +35 23 53.3 6 3.13 0.93 DC WS SBG2 UZC CCA Pds I1393 21 40 14.033 -22 24 43.05 3 3.12 2.47 ESOB WS KHJ I1394 21 40 13.071 +14 37 58.28 3 0.47 0.72 KHJ Pds UZC I1395 21 41 41.443 +04 06 15.46 3 0.89 1.23 KHJ UZC Pds I1396 21 38 57.64 +57 29 20.8 1 SAO I1397 21 44 02.294 -04 53 05.35 2 0.17 0.05 GSC KHJ I1398 21 45 51.5 +09 28 30 3 0.85 0.58 WS Pds UZC I1399 21 46 08.905 +04 24 07.51 2 0.21 0.65 Pds KHJ I1400 21 44 16 +52 58.0 1 HCe I1401 21 46 59.57 +01 42 44.3 6 0.93 3.24 SPF WS UZC CCA GSC SPC I1402 21 44 58 +53 15.8 1 HCe I1403 21 50 29.068 -02 42 57.36 2 0.67 0.77 KHJ GSC I1404 21 50 56.48 -09 15 59.5 2 1.26 0.07 WS GSC I1405 21 50 49.805 +02 01 13.85 4 0.58 0.79 Pds UZC KHJ CCA I1406 21 51 04.918 +01 59 12.68 3 1.06 0.79 KHJ UZC Pds I1407 21 52 23.46 +03 25 35.8 2 0.85 2.69 WS GSC I1407 comp 21 52 22.6 +03 25 40 1 WS I1408 21 53 09.008 -13 20 48.04 2 0.33 0.45 HCds KHJ I1409 21 53 19.56 -07 30 00.5 2 0.84 0.64 WS GSC I1410 21 56 02.180 -02 54 00.47 2 0.79 0.74 KHJ GSC I1411 21 56 00.711 -01 31 00.21 4 1.75 2.96 KHJ UZC CCA DC I1412 21 58 18.5 -17 10 34 2 0.00 4.24 SHM WS I1413 21 58 26.71 -03 06 10.5 2 1.69 2.62 GSC WS I1413 comp 21 58 25.3 -03 07 30 1 WS I1414 21 58 18.067 +08 25 25.68 7 0.25 0.67 GSC2 KHJ GSCA UA20 GSC UZC HCds I1415 21 58 42.6 +01 21 01 1o Big I1416 21 58 49.5 +01 27 05 1o Big I1417 22 00 21.6 -13 08 49 3 1.46 0.58 GHD2 SPC WS I1418 22 01 59.9 +04 23 02 2 0.00 0.00 UZC WS I1419 22 02 58.844 -09 55 15.24 2 0.04 0.39 GSC KHJ I1420e 22 02 32.11 +19 45 00.6 4 1.88 0.23 UA20 UZC GSC HCds I1420w 22 02 31.39 +19 45 01.0 5 3.76 1.88 DC HCds WS GSC CCA I1421 22 03 04.042 -09 58 40.81 2 0.20 0.89 KHJ Pds2 I1422 22 03 00.059 +02 35 55.96 1 KHJ I1423 22 03 12.75 +04 17 50.0 3 1.02 0.23 UZC WS CCA I1424 22 03 09.391 +11 11 49.75 4 0.32 0.08 HCds GSC2 UA20 APMN I1425 22 03 24.476 +02 35 41.61 3 0.48 0.04 Pds UZC KHJ I1426 22 03 52.9 -09 54 46 1o J I1426? 22 03 51.3 -09 55 09 1 HCm I1426?ne* 22 03 51.78 -09 55 07.5 2 0.21 1.41 WS HCds I1426?sw* 22 03 50.82 -09 55 12.7 1 HCds I1427 22 03 35.195 +15 06 24.34 3 0.87 0.29 KHJ UZC CCA I1428 22 04 27.7 +02 37 50 2 2.12 0.71 WS Pds I1429 22 07 02.46 +10 06 33.2 1 HCds I1430 22 07 29.79 -13 34 52.1 1 GSC I1431 22 07 39.56 -13 30 48.7 3 0.75 0.64 WS GSC SPC I1432 22 10 03.987 +03 41 22.15 2 0.32 0.43 KHJ GSC I1433m 22 12 09.64 -12 45 55.8 1 HCds I1433nw 22 12 08.98 -12 45 48.6 1 HCds I1433se 22 12 10.543 -12 45 56.70 2 1.97 0.88 HCds KHJ I1434 22 10 42 +52 51.0 1 HCe I1435 22 13 26.1 -22 05 48 2 0.98 0.00 WS ESOB I1436 22 13 51.452 -10 11 31.12 2 0.35 1.05 KHJ Pds2 I1437 22 15 45.00 +02 03 56.5 5 1.36 0.93 WS UZC GSC SPC CCA I1438 22 16 29.2 -21 25 53 2 3.94 1.41 WS ESOB I1439 22 16 40.3 -21 29 10 2 2.96 2.12 WS ESOB I1440 22 16 33.21 -16 00 59.0 2 0.10 2.33 HCds WS I1441 22 15 19.25 +37 18 04.3 5 1.84 2.30 WS GSC UZC SBG2 HC I1442 22 16 01 +53 59.5 1 HCe I1443 22 19 03.7 -20 56 25 2 2.97 0.00 WS ESOB I1444 22 22 23.964 +05 08 19.92 3 0.86 0.90 UZC KHJ Pds I1445 22 25 30.27 -17 14 35.8 4 1.23 2.61 WS ESOB SPC SPF I1446 22 29 04.684 -01 11 05.31 2 0.12 0.09 GSC KHJ I1447 22 29 59.83 -05 07 11.1 3 0.91 0.12 WS SPC SPF I1448=N7308 22 34 32.076 -12 56 01.95 3 1.07 0.70 HCds SPC KHJ I1449 22 35 06.96 -08 45 56.6 2 0.94 1.63 GSC WS I1450 22 37 58.0 +34 32 07 2 0.88 0.71 HCds WS I1450 ne * 22 37 58.30 +34 32 11.9 1 HCds I1450 ne * F comp 22 37 58.89 +34 32 14.4 1 HCds I1450 sw * 22 37 57.60 +34 32 04.5 1 HCds I1451 22 46 07.41 -10 22 12.0 2 0.94 2.97 WS HCds I1452=N7374B 22 45 59.15 +10 52 04.8 1 HCds I1453 22 46 54.32 -13 26 58.3 2 2.16 1.06 HCds WS I1454 22 42 24.58 +80 26 32.3 4 0.89 0.53 CK HCo BSV GSC2 I1455 22 53 46.053 +01 22 18.40 5 1.09 0.57 UZC SPF CCA KHJ Pds I1456 22 55 18.17 -12 43 56.3 2 0.83 0.92 GSC WS I1457 22 55 23.8 -05 33 45 1o Big I1457? 22 55 22.44 -05 34 16.6 1 HCds I1457?? 22 55 30.4 -05 33 03 1 WS I1458=:N7441 22 56 41.43 -07 22 47.0 3 0.17 1.42 SPC WS SPF I1459=I5265 22 57 10.55 -36 27 44.8 8 1.01 1.04 WS ESOB RC2 HCds DWFo EWSr DWFr HC2m I1460 22 57 04.095 +04 40 37.34 6 1.64 1.72 GH KHJ UZC K14 KET2 KEBA I1461 22 58 34.3 +15 10 19 3 1.45 4.04 WS UZC SDP I1462 22 58 37.15 +08 26 28.7 1 HCds I1463 22 59 21.0 -10 31 51 2 2.08 0.71 HCds WS I1463 ne * 22 59 21.49 -10 31 44.3 1 HCds I1463 sw * 22 59 20.44 -10 31 58.2 1 HCds I1464 23 03 11.6 -08 59 27 1 HCm I1464 nw 23 03 11.093 -08 59 20.75 1 KHJ I1464 se 23 03 12.041 -08 59 34.02 1 KHJ I1465 23 02 53.2 +16 34 56 1 HCds I1465 ne ** 23 02 53.54 +16 35 01.3 1 HCds I1465 sw * 23 02 52.82 +16 34 52.1 1 HCds I1466 23 03 39.06 -02 46 32.5 2 0.95 1.06 WS GSC I1467 23 04 49.64 -03 13 50.6 2 0.32 4.74 WS HCds I1468 23 05 07.5 -03 12 18 2 3.18 2.83 WS SPC I1469 23 06 28.60 -13 32 12.1 2 1.65 0.14 WS GSC I1470 23 05 10.45 +60 14 36.4 2 0.42 5.23 Bar HCds I1471 23 08 44.91 -12 38 21.9 2 2.17 1.41 HCds WS I1472 23 09 06.707 +17 15 32.65 2 0.45 0.39 KHJ UZC I1473 23 11 05.29 +29 38 35.8 7 3.33 2.20 DC WS UZC HCds HC2m BPP CCA I1473 comp 23 11 04.86 +29 38 17.7 2 0.00 0.64 HC2m HCds I1474 23 12 51.30 +05 48 21.2 4 1.43 1.74 UZC WS K14 CCA I1475 23 14 02 -28 25.3 1o EEB I1476 23 14 16.329 +30 33 05.20 3 0.48 1.00 BPP KHJ HCds I1477=N7596 23 17 11.93 -06 54 42.9 3 0.52 1.47 HCds WS SPC I1478=N7594 23 18 13.98 +10 17 52.1 5 0.71 1.64 WS GSC CCA Pds UZC I1479 23 18 46.408 -10 23 57.63 4 0.46 0.97 SPC KHJ GSC SPF I1480=N7607 23 18 59.3 +11 20 29 2 1.04 1.41 HCds WS I1480=N7607 e * 23 18 59.60 +11 20 30.3 1 HCds I1480=N7607 w * 23 18 58.77 +11 20 30.4 1 HCds I1481 23 19 25.03 +05 54 21.0 4 3.13 2.06 DC WS UZC CCA I1482 23 20 49.564 +01 44 20.62 4 0.81 0.08 KHJ UZC GSC Pds I1483=N7638 23 22 33.08 +11 19 47.3 5 2.12 3.22 WS Pds UZC HCds K10 I1484 23 22 39.936 +11 23 04.21 4 0.94 0.98 UZC KHJ HCds GSC I1485=N7639 23 22 48.230 +11 22 22.76 4 0.82 1.63 Pds KHJ HCds GSC I1486=N7648 23 23 54.13 +09 40 04.0 6 1.21 1.65 HCds CCA UZC WS DC KET1 I1487=N7649 23 24 20.12 +14 38 47.9 3 0.59 1.55 WS GSC CCA I1488 23 25 38.54 +15 21 14.8 1 GSC I1489 23 26 32.11 -12 30 59.8 2 0.52 0.57 HCds WS I1490 23 29 02 -04 08.0 1o Sw10 I1490=I1524 23 59 10.71 -04 07 37.9 5 0.52 1.07 HCds SPC Pds WS GSC I1491 23 29 24.49 -16 18 59.0 2 0.10 0.49 HCds WS I1492 23 30 36.090 -03 02 24.71 2 0.43 1.40 SPC KHJ I1493 23 30 27.40 +14 27 30.6 2 0.31 3.46 WS HCds I1493 note 23 30 21.29 +14 28 46.5 1 HCds I1494 23 30 46.156 -12 43 28.06 2 0.31 0.33 KHJ GSC I1495=I5327 23 30 47.6 -13 29 08 2 2.06 0.00 WS SPC I1496 23 30 53.538 -02 56 03.85 3 0.25 0.60 KHJ Pds SPC I1497 23 28 50.1 +11 59 13 1o Big I1498 23 31 53.5 -05 00 24 2 0.00 0.00 SPC WS I1499: 23 31 57.0 -13 26 23 2 0.00 0.71 HCds WS I1499: ne * 23 31 57.14 -13 26 17.3 1 HCds I1499: sw * 23 31 56.88 -13 26 28.3 1 HCds I1500 23 33 09.5 +04 33 08 3 0.86 1.53 Pds UZC WS I1501 23 34 40.06 -03 09 10.6 3 0.77 3.55 SPC GSC WS I1502 23 36 20.16 +75 38 49.9 4 0.68 2.14 HCrs WS Pds CCA I1503 23 38 27.23 +04 48 02.4 5 1.86 3.09 CCA UZC WS DC STMW I1504 23 41 19.44 +04 01 03.0 5 2.38 0.51 DC Pds UZC CCA WS I1505 23 41 37.089 -03 33 54.41 2 0.46 0.16 GSC KHJ I1506 23 44 48.396 +04 44 07.90 3 0.28 0.47 Pds UZC KHJ I1507 23 45 33.14 +01 41 19.6 5 1.37 0.69 WS SPC SPF CCA UZC I1508 23 45 55.10 +12 03 40.4 4 1.75 1.92 STMW WS UZC CCA I1509 23 47 16.57 -15 18 24.9 2 0.61 3.75 HCds WS I1510 23 50 33.0 +02 04 23 1 Pds2 I1510 nw 23 50 32.5 +02 04 27 2 0.00 1.41 WS UZC I1510 se 23 50 33.0 +02 04 18 2 0.00 1.41 WS UZC I1511 23 51 00.4 +27 03 39 1 HCo I1512 23 51 01.42 +27 01 37.7 1 GSC I1513 23 53 29.42 +11 19 02.7 4 2.05 0.84 WS UZC CCA K14 I1514=N7776 23 54 16.5 -13 35 12 2 1.03 0.00 WS SPC I1515 23 56 03.92 -00 59 19.6 5 1.63 1.28 UZC SPC SPF CCA WS I1516 23 56 07.12 -00 55 00.8 6 0.84 1.64 SPF CCA UZC WS SPC DC I1517 23 56 18.8 -00 18 21 3 1.50 0.00 Pds2 UZC WS I1518 23 57 06.128 +12 27 54.08 2 0.16 0.20 KHJ GSC I1519 23 57 08.414 +12 27 26.65 3 1.10 1.44 GSC KHJ Pds I1520 23 57 54.43 -14 02 21.2 2 1.64 0.78 HCds WS I1520 comp 23 57 54.97 -14 02 30.7 1 HCds I1521 23 58 59.64 -07 08 48.0 2 0.11 0.35 GSC WS I1522 23 59 03.5 +01 43 09 3 0.87 1.73 UZC WS Pds2 I1523=I5368 23 59 06.593 +06 52 25.13 2 0.01 3.01 KHJ HCds I1524=I1490 23 59 10.71 -04 07 37.9 5 0.52 1.07 HCds SPC Pds WS GSC I1525 23 59 15.79 +46 53 22.5 5 0.87 3.10 WS DC SBG1 UZC CCA I1526 00 01 31.5 +11 20 46 3 0.00 1.53 WS UZC K14 I1527 00 02 21.628 +04 05 26.16 3 0.80 2.72 Pds2 KHJ UZC I1528 00 05 05.34 -07 05 35.8 1 HCds I1529 00 05 13.245 -11 30 10.25 3 1.17 1.50 KHJ SPC Pds I1530=N7831 00 07 19.49 +32 36 34.1 9 1.82 2.75 WS Pds DC GHD1 UZC GSC CCA KEBA BPP I1531 00 09 35.76 -32 16 37.0 3 5.00 0.72 WS EWSr ESOB I1532 00 09 52.4 -64 22 17 2 8.63 0.72 ESOB WS I1533 00 10 36 -07 24.9 1o Sw12 I1534 00 13 45.449 +48 09 04.51 4 0.57 0.30 SBG1 KHJ UZC CCA I1535 00 13 57.28 +48 09 27.8 4 1.12 2.26 WS UZC SBG1 CCA I1536 00 14 19.085 +48 08 35.42 3 1.64 0.92 SBG1 KHJ KET2 I1537 00 15 49.5 -39 15 39 3 23.60 12.49 ESOB WS HCo I1538 00 18 01 +30 01.8 1o Bige I1539=N0070 00 18 22.57 +30 04 46.0 8 1.67 2.44 WS BPP DC CCA GSC UZC GHD1 Pds I1540 00 19 48.79 +23 46 21.4 4 0.65 2.51 Pds CCA WS UZC I1541 00 20 01.986 +21 59 59.90 3 0.78 1.64 Pds KHJ UZC I1542 00 20 41.30 +22 35 33.1 4 3.26 2.37 UZC GSC WS Pds I1543 00 20 55.63 +21 51 55.9 4 2.16 1.70 CCA UZC WS DC I1544 00 21 17.59 +23 05 26.1 4 0.65 1.53 UZC CCA WS Pds I1545 00 21 20.909 +21 59 00.43 1 KHJ I1546=N0085B 00 21 29.09 +22 30 25.2 3 0.24 5.23 UZC WS GSC I1547 00 21 35.7 +22 30 23 1o Bign I1548 00 21 55.165 +22 00 22.75 1 KHJ I1549 00 22 49.876 +06 57 50.89 4 0.93 0.90 UZC KHJ Pds CCA I1550 00 24 27.72 +38 11 06.6 3 1.36 1.53 VPS UZC WS I1551 00 27 35.46 +08 52 37.6 3 1.01 1.05 CCA UZC WS I1552 00 29 43.98 +21 28 32.7 3 2.10 0.68 WS UZC CCA I1553 00 32 40.2 -25 36 36 2 3.82 3.54 WS ESOB I1554 00 33 07.5 -32 15 32 3 4.56 1.00 WS GHD2 ESOB I1555 00 34 32.80 -30 01 04.1 2 0.64 0.07 HC2m WS I1556 00 35 03.2 -09 22 03 1 HC I1556 comp 00 34 57.8 -09 20 30 1 HC I1557 00 35 34.497 -02 52 34.97 2 0.39 0.21 GSC KHJ I1558 00 35 47.3 -25 22 29 3 7.45 6.03 FT WS ESOB I1559 00 36 52.2 +23 59 04 4 2.24 2.16 SDP WS GH HC I1560 00 37 39 +02 40.3 1o Big I1561 00 38 32.6 -24 20 25 2 3.86 1.41 WS ESOB I1562 00 38 34.3 -24 16 29 2 9.65 2.12 WS ESOB I1563=N0191A 00 39 00.27 -09 00 53.2 5 2.64 1.23 GHD2 WS SPF SPC HC I1564 00 39 05.18 +06 01 14.5 3 0.34 0.85 CCA WS UZC I1565=:I1567 00 39 26.31 +06 44 02.2 5 0.66 1.63 WS HCds CCA Pds UZC I1566 00 39 33.308 +06 48 53.89 2 1.01 0.88 UZC KHJ I1567:=I1565 00 39 26.31 +06 44 02.2 5 0.66 1.63 WS HCds CCA Pds UZC I1567?? 00 39 36.09 +06 39 50.7 2 0.84 2.12 HCds WS I1568 00 39 55.951 +06 50 54.93 2 0.24 0.08 HCds KHJ I1569 00 40 28.01 +06 43 10.1 2 0.74 2.12 WS HCds I1569 comp 00 40 26.27 +06 42 56.0 1 HCds I1570 00 40 34.22 +06 45 09.1 3 4.65 2.23 GSC HCds WS I1571 00 40 37.94 -00 19 51.0 4 2.56 1.05 WS UZC CCA HC I1572 00 41 12 +16 14.3 1o Bige I1573 00 42 10.4 -23 35 30 2 2.91 4.24 WS ESOB I1574 00 43 03.8 -22 14 49 3 1.60 4.93 ESOB HC WS I1575 00 43 33.4 -04 07 05 3 0.86 1.15 HC SPC WS I1576 00 44 13.8 -25 06 34 2 0.96 0.71 WS ESOB I1577=I0048 00 43 34.5 -08 11 11 3 4.28 2.31 WS SPC HC I1578 00 44 25.8 -25 04 32 2 0.96 4.95 WS ESOB I1579 00 45 32.7 -26 33 53 2 11.36 0.71 WS ESOB I1580 00 46 21.4 +29 56 42 2 0.92 43.84 WS HCds I1580 nw * 00 46 21.00 +29 57 16.1 1 HCds I1580 se * 00 46 21.69 +29 57 11.5 1 HCds I1581 00 45 46.4 -25 55 08 2 0.95 3.54 WS ESOB I1582 00 46 16.8 -24 16 45 2 0.00 4.24 ESOB WS I1583 00 47 10.258 +23 04 25.29 4 0.76 0.88 HC UZC KEBA KHJ I1584 00 47 18.588 +27 49 42.49 6 1.83 4.37 HC BPP KHJ UZC CCA Pds I1585 00 47 14.284 +23 03 11.75 4 1.14 1.42 HC Pds KHJ UZC I1585 comp 00 47 19.3 +23 02 54 1 HC I1586 00 47 56.4 +22 22 24 3 0.80 5.77 UZC WS SDP I1587 00 48 43.0 -23 33 41 2 4.85 2.83 ESOB WS I1588 00 50 57.66 -23 33 30.1 2 1.55 2.90 HCds WS I1589: 00 51 59.36 -34 25 20.2 3 0.25 0.86 WS HCds GSC I1589: n * 00 51 59.35 -34 25 15.5 1 HCds I1589: s * 00 51 59.39 -34 25 22.8 1 HCds I1590 00 52 49 +56 37.9 3 4.80 33.04 BSV AH HCds I1591=N0276 00 52 06.52 -22 40 48.4 3 0.70 1.66 WS HCds ESOB I1592 00 53 27.05 +05 46 11.2 5 1.07 1.70 HC Pds UZC CCA WS I1592 comp 00 53 21.0 +05 46 02 1 HC I1593 00 54 39.6 +32 31 10 1 HC I1594 00 53 45.1 -47 38 51 2 1.42 2.83 ESOB WS I1595 00 53 46.77 -45 11 10.7 3 3.56 2.63 ESOB HCds WS I1596 00 54 42.78 +21 31 20.8 3 1.07 0.61 WS UZC CCA I1597 00 53 31.69 -58 06 28.8 2 4.78 3.96 ESOB HCds I1598 00 54 41.790 +05 46 25.17 5 0.35 1.45 KHJ HC UZC KET2 CCA I1599 00 54 32.9 -23 29 43 2 2.91 1.41 WS ESOB I1600 00 55 04.1 -23 31 31 2 2.91 2.83 ESOB WS I1601 00 55 34.7 -24 09 14 2 0.00 1.41 ESOB WS I1602 00 55 51.921 -09 59 07.09 2 0.57 1.58 KHJ HC I1603 00 56 59.5 -45 24 44 2 2.96 4.24 ESOB WS I1604 00 58.0 -16 13 1o Sw7 I1605 00 57 37.2 -48 54 08 2 2.77 4.24 ESOB WS I1606 00 58 22 -12 10.7 1o Sw11 I1607 00 58 48.84 +00 35 14.3 5 1.11 1.81 HC UZC DC WS CCA I1608 00 59 24.2 -34 19 45 3 0.00 2.89 ESOB Pds WS I1609 00 59 46.9 -40 19 59 2 6.44 4.24 WS ESOB I1610 01 01 42.7 -15 34 12 2 1.02 9.90 WS SPC I1611 00 59 48.4 -72 19 58 4 2.14 2.36 ESOB OGLE DLW BSc I1612 00 59 59.8 -72 22 12 4 5.22 3.37 ESOB BSc DLW OGLE I1613 01 04 47.45 +02 07 07.1 3 17.30 5.14 CCA HC GH I1613 knot 01 04 59.1 +02 09 11 1 SPC I1614 01 05 07.080 +33 11 23.46 2 2.07 0.17 KHJ HC I1615 01 04 07.0 -51 07 57 2 1.99 2.83 WS ESOB I1616 01 04 56.2 -27 25 44 2 0.00 0.71 ESOB WS I1617 01 04 16.9 -51 01 56 2 3.32 2.12 WS ESOB I1618 01 05 56.050 +32 24 44.82 5 1.95 1.64 Hu KHJ BPP CCA HC I1618 comp 01 05 50.9 +32 23 20 1 HC I1619 01 07 22.50 +33 04 02.3 4 1.28 2.89 GSC WS Hu HC I1620 01 07 14.19 +13 57 16.5 6 1.99 1.63 WS HC DC Pds UZC CCA I1620 comp 01 07 09.6 +13 57 13 1 HC I1621 01 06 22.2 -46 43 30 2 6.51 3.54 ESOB WS I1622 01 07 36.64 -17 32 18.8 4 0.72 1.30 WS GSC ESOB SPC I1623 01 07 47 -17 30.4 1 ESOB I1623a 01 07 46.82 -17 30 25.5 3 2.34 0.06 SPC WS GSC I1623ae 01 07 47.57 -17 30 24.5 1 KSG I1623aw 01 07 46.51 -17 30 22.6 1 KSG I1623b 01 07 48.11 -17 30 22.5 4 0.97 2.06 KSG WS GSC SPC I1623c 01 07 51.6 -17 29 54 1 SPC I1624 01 05 21.7 -72 02 35 4 1.20 2.94 OGLE DLW ESOB BSc I1625 01 07 42.4 -46 54 27 2 2.88 5.66 ESOB WS I1626 01 06 13.6 -73 17 50 3 0.74 3.46 ESOB BSc DLW I1627 01 08 10.7 -46 05 37 2 1.46 2.12 ESOB WS I1628 01 08 47.47 -28 34 56.3 3 4.43 1.50 ESOB WS HCds I1628 comp 01 08 50.72 -28 35 55.7 1 HCds I1629 01 09 18.293 +02 34 02.14 2 2.05 1.02 KHJ HC I1630 01 08 17.0 -46 45 14 2 2.17 2.83 WS ESOB I1631 01 08 44.9 -46 28 31 2 3.63 1.41 WS ESOB I1632 01 10 43.38 +17 40 58.3 3 0.66 1.15 WS HCo HCds I1632 comp 01 10 42.48 +17 40 50.6 2 0.51 1.48 HCo HCds I1633 01 09 55.4 -45 55 52 2 2.20 2.83 ESOB WS I1634 01 11 02.91 +17 39 44.5 4 0.63 1.65 SPF CCA GSC WS I1635 01 11 03.48 +17 39 06.0 5 1.02 1.66 Pds CCA GSC SPF WS I1636nw 01 11 37.454 +33 21 15.50 6 0.88 0.96 HC KHJ BPP UZC GSC HCo I1636se 01 11 37.8 +33 21 13 1 HCo I1637 01 11 01.1 -30 26 18 3 2.68 2.52 ESOB WS Pds I1638 01 12 21.790 +33 21 50.75 7 1.24 1.11 HC UZC KEBA BPP KHJ GSC VPS1 I1639 01 11 46.559 -00 39 52.03 7 1.43 1.98 HC KHJ KET1 SPC UZC DC CCA I1640 01 11 51.3 -00 37 50 3 1.73 1.53 HC WS UZC I1641 01 09 39.2 -71 46 07 3 0.27 0.58 DLW BSc ESOB I1642=I1645 01 12 27.354 +15 44 59.79 3 0.18 0.43 GSC UZC KHJ I1643 01 12 08.497 -00 24 37.89 4 2.33 1.61 HC Pds2 KHJ UZC I1644 01 09 12 -73 11.6 2 0.00 8.49 ESOB BSc I1645=I1642 01 12 27.354 +15 44 59.79 3 0.18 0.43 GSC UZC KHJ I1646 01 12 43.77 +15 42 25.6 5 0.19 1.92 WS Pds HCo UZC SPF I1647 01 13 14.51 +38 53 05.6 3 0.47 1.15 WS UZC VPS I1648 01 13 42.083 +33 13 04.44 5 2.27 0.82 HC KHJ BPP UZC VPS1 I1649 01 11 50.83 -55 51 24.8 2 2.25 2.62 ESOB HCds I1650 01 12 19.4 -50 24 07 2 6.72 2.12 WS ESOB I1651 01 13 27.6 +02 04 08 1 HC I1652 01 14 56.42 +31 56 53.6 5 1.49 2.21 VPS1 UZC CCA WS DC I1653=N0443 01 15 07.520 +33 22 37.76 6 4.47 2.10 DC KHJ UZC VPS1 CCA HCds I1654 01 15 11.962 +30 11 41.72 5 1.86 0.63 VPS1 KHJ UZC CCA DC I1655 01 11 54.07 -71 19 52.5 4 1.13 5.14 BSc ESOB HCds DLW I1656=N0447 01 15 37.69 +33 04 02.9 7 2.72 5.54 DC RC2 VPS1 HCo CCA WS UZC I1657=I1663 01 14 06.96 -32 39 03.1 3 3.60 1.06 WS HCds ESOB I1658=N0444 01 15 49.63 +31 04 48.8 7 0.87 1.44 VPS1 GSC K06 Pds WS UZC CCA I1659 01 16 06.11 +30 20 55.5 4 1.31 2.96 UZC VPS1 CCA WS I1660 01 12 38.3 -71 45 41 4 1.96 1.15 ESOB AH DLW BSc I1661=N0451 01 16 12.44 +33 03 50.6 7 0.11 2.23 VPS1 WS K06 KET2 K14 K03 GSC I1662 01 12 33.3 -73 27 24 3 2.12 0.00 ESOB DLW BSc I1663=I1657 01 14 06.96 -32 39 03.1 3 3.60 1.06 WS HCds ESOB I1664 01 14 18.5 -69 48 41 1 HCds I1664 ne * 01 14 20.63 -69 48 31.2 1 HCds I1664 sw * 01 14 16.34 -69 48 52.2 2 1.34 1.70 WS HCds I1664 sw *, comp * 01 14 14.83 -69 48 50.9 1 HCds I1665 01 17 45.0 +34 42 04 2 0.87 1.41 HCds WS I1666 01 19 53.51 +32 28 02.3 7 1.62 4.08 WS VPS1 BCG K06 CCA UZC DC I1667 01 18 42.26 -17 03 01.4 2 1.01 1.27 WS HCds I1668 01 18 53.09 +33 10 21.9 3 1.02 4.05 VPS1 K03 WS I1669 01 20 06.87 +33 11 03.7 3 0.51 3.82 VPS1 WS BCG I1670e 01 18 52.8 -16 48 08 4 0.83 4.83 SPC WS SHM Pds I1670w 01 18 48.8 -16 48 09 3 1.66 5.00 SPC WS SHM I1671=I0093 01 19 02.25 -17 03 37.9 3 0.92 3.38 WS SPC HCds I1672 01 20 38.29 +29 41 55.4 5 0.71 1.52 UZC VPS1 DC WS CCA I1673 01 20 46.385 +33 02 40.68 4 0.62 2.05 VPS1 KHJ SPF UZC I1674 01 19.0 -50 38 1o DS I1674?? 01 19 18.7 -50 57 51 2 3.99 0.00 WS ESOB I1675 01 20 59.99 +34 14 56.9 5 1.46 3.84 UZC CCA DC WS VPS I1676 01 20 58.591 +30 15 34.16 3 0.13 1.20 SPF KHJ VPS1 I1677 01 21 07.12 +33 12 57.0 4 0.61 2.84 WS K03 VPS1 UZC I1678 01 21 02.6 +05 33 35 3 0.00 1.53 WS Pds UZC I1679 01 21 44.43 +33 29 35.8 5 0.84 2.76 Pds2 Pds WS UZC GSC I1680 01 21 51.26 +33 16 55.9 6 0.81 1.88 BCG GSC VPS1 UZC SPF WS I1681 01 21 21.19 +00 05 25.4 4 2.00 0.96 HC UZC WS CCA I1682 01 22 13.29 +33 15 36.6 8 1.18 2.00 VPS1 UZC DC SPF CCA BCG WS KEBA I1683 01 22 38.96 +34 26 14.3 7 1.42 1.82 DC KET2 VPS K03 UZC WS CCA I1684 01 22 53.18 +33 24 46.7 2 0.80 3.18 GSC WS I1685 01 23 06.68 +33 11 25.0 1 GSC I1686=N0499 01 23 11.58 +33 27 36.4 10 1.88 2.08 GHD1 SPF WS BCG GSC CCA VPS1 Pds UZC DC I1687 01 23 19.21 +33 16 37.2 6 0.86 3.68 BCG GSC VPS1 UZC WGT WS I1688 01 23 28.19 +33 04 57.8 2 0.89 3.18 GSC WS I1689 01 23 47.90 +33 03 16.9 5 0.58 4.46 VPS1 BCG UZC GSC WS I1690 01 23 49.578 +33 09 22.86 6 0.64 0.53 VPS1 WGT KHJ GSC BCG UZC I1691 01 24 25.85 +33 24 23.7 2 0.80 3.82 GSC WS I1692 01 24 39.60 +33 14 07.7 5 1.18 1.99 VPS1 Pds SPF BCG WS I1693 01 24 02.21 -01 39 26.8 2 1.91 5.02 HC HCds I1694 01 24 47.8 +01 36 26 4 2.12 1.26 WS Pds UZC HC I1695 01 25 07.72 +08 41 58.8 4 2.52 4.27 WS UZC CCA Pds I1696 01 24 52.41 -01 37 02.8 7 1.26 1.73 HCds UZC BCG SPC WS CCA HC I1697 01 25 03.007 +00 26 39.06 5 1.74 1.22 UZC KHJ Pds CCA HC I1698=?I1699 01 25 22.14 +14 50 17.2 7 1.48 2.81 HCo SPF HCds WS UZC Pds CCA I1699?=I1698 01 25 22.14 +14 50 17.2 7 1.48 2.81 HCo SPF HCds WS UZC Pds CCA I1699?? 01 25 13.34 +14 52 18.1 2 0.10 3.32 CCA HCo I1700=I0107 01 25 24.69 +14 51 51.2 6 0.94 1.56 HCds SPF WS UZC DC CCA I1701 01 25 50.452 +18 11 03.28 5 0.97 0.80 KHJ Pds UZC CCA HCds I1702 01 25 56.29 +16 36 05.5 4 1.70 2.65 WS UZC DC CCA I1703=N0557 01 26 25.08 -01 38 19.6 8 2.02 1.22 HC HCds Pds BCG UZC WS SPC CCA I1704 01 27 09.55 +14 46 33.3 6 1.95 1.46 DC GSC WS UZC CCA BCG I1705 01 26 44.9 -03 30 06 2 1.06 1.41 WS HC I1706 01 27 31.05 +14 49 08.8 5 1.24 1.97 WS HCds GSC BCG HCo I1707 01 28 00 +37 07.0 1o Big I1708 01 24 56.7 -71 11 00 3 0.55 0.58 DLW BSc ESOB I1709=N0568 01 27 56.9 -35 43 03 3 0.70 1.73 ESOB WS Pds I1710=N0575 01 30 46.53 +21 26 23.6 6 1.92 1.31 WS UZC DC Pds CCA GSC I1711 01 30 55.24 +17 11 17.9 4 0.89 0.48 WS SPF UZC CCA I1712=N0584 01 31 20.8 -06 52 05 4 0.86 1.71 HC GHD2 WS SPC I1713 01 32 43.80 +35 19 28.1 1 HCds I1714 01 32 53.24 -13 01 30.5 1 HCds I1715 01 33 34.32 +12 35 07.1 4 2.15 2.13 UZC CCA WS DC I1716 01 33 26.82 -12 18 29.1 2 0.62 0.78 WS GSC I1717 01 32 30 -67 32.2 1o DS I1718 01 38 26.74 +33 21 57.3 5 1.74 2.74 SPF UZC K05 VPS1 WS I1719 01 37 36.1 -33 55 28 2 4.39 1.41 WS ESOB I1720 01 40 21.3 -28 54 50 2 1.85 1.41 ESOB WS I1721 01 41 24.468 +08 31 31.14 4 0.65 1.01 UZC KHJ CCA DC I1722 01 43 02.4 -34 11 18 2 5.25 0.71 ESOB WS I1723 01 43 14.16 +08 53 20.7 6 1.31 1.94 WS DC HCds UZC GSC CCA I1724 01 43 09.3 -34 14 32 2 3.50 1.41 ESOB WS I1725 01 45 11.87 +21 46 34.5 4 0.14 1.18 WS UZC Pds GSC I1725ne 01 45 11.92 +21 46 37.8 1 HCds I1725sw 01 45 11.63 +21 46 33.2 1 HCds I1726 01 45 19.715 +04 37 06.45 3 1.33 0.45 UZC KHJ HCds I1727 01 47 30.26 +27 19 54.9 9 6.25 7.57 HCds HC2m CCA WS GHD1 HCo SPF DC UZC I1727 e knot 01 47 31.79 +27 19 33.0 1 SPF I1727 knot 01 47 31.28 +27 19 39.0 1 GSC I1727 w knot 01 47 28.69 +27 20 14.1 1 SPF I1728 01 47 44.6 -33 36 08 2 2.64 2.12 WS ESOB I1729 01 47 55.3 -26 53 30 3 2.04 2.08 WS Pds ESOB I1730 01 49 57.984 +22 00 41.20 4 1.22 4.98 UZC KHJ HCo Pds2 I1731 01 50 12.51 +27 11 46.1 6 3.24 2.24 GHD1 UZC WS CCA DC SPC I1732 01 50 47.96 +35 55 57.0 4 0.79 1.00 UZC CCA WS VPS I1733 01 50 42.99 +33 04 55.8 6 1.54 2.43 GSC WS UZC CCA VPS1 Hu I1734 01 49 17.0 -32 44 37 2 2.67 0.00 WS ESOB I1735 01 50 51.81 +33 05 33.1 4 1.34 3.88 GSC WS Pds2 Hu I1736 01 50 53.23 +18 18 08.5 4 0.41 1.24 SPF CCA WS UZC I1737 01 51 42.4 +36 15 01 2 6.01 3.54 WS HCm I1737 e * 01 51 43.82 +36 15 01.3 1 HCds I1737 w * 01 51 41.53 +36 15 08.2 1 HCds I1738 01 51 07.8 -09 47 34 3 3.07 4.04 WS GHD2 SPC I1739 01 50 29.6 -34 03 24 2 5.26 4.24 WS ESOB I1740: 01 48 51.59 -30 05 10.9 2 0.64 1.91 HCds GSC I1740: nw * 01 48 51.35 -30 05 04.0 2 0.18 1.27 HCds GSC I1740: se * 01 48 51.80 -30 05 18.8 2 0.00 1.20 HCds GSC I1740? 01 51 36.82 -29 55 20.1 2 0.18 2.33 HCds HCo I1740? n * 01 51 36.63 -29 55 15.0 2 0.37 0.78 GSC HCds I1740? s * 01 51 37.11 -29 55 28.6 1 HCds I1740?? 01 51 16.6 -29 56 37 1 WS I1741 01 51 56.721 -16 47 16.83 3 0.09 0.41 WS HCds KHJ I1742 01 53 14.27 +22 43 14.7 3 1.06 1.40 UZC WS HCds I1743=N0716 01 52 59.64 +12 42 28.8 5 1.46 0.98 WS DC CCA GSC UZC I1744=N0719 01 53 38.857 +19 50 24.99 4 0.88 0.64 UZC SPF KHJ CCA I1745 01 52 59.065 -16 40 09.34 3 0.72 1.05 WS KHJ HCds I1746 01 54 24.29 +04 48 12.2 5 0.63 1.00 WS Pds CCA GSC UZC I1747 01 57 35.675 +63 19 18.19 4 1.01 1.29 CK GSCA UJ10 GSC I1748 01 56 08.89 +17 38 26.9 4 1.29 1.22 WS UZC SPF CCA I1749 01 56 11.123 +06 44 41.24 4 1.08 0.75 UZC K06 KHJ CCA I1750 01 56 18.55 +04 04 33.3 5 1.36 0.61 Pds UZC SPF CCA WS I1751=N0741 01 56 21.05 +05 37 43.5 7 1.52 0.83 DC SPF GSC KEBA CCA GH UZC I1752 gal 01 57 15.327 +28 36 49.70 2 1.80 1.54 HCds KHJ I1752 nw * 01 57 14.63 +28 36 59.2 1 HCds I1752 se * 01 57 15.76 +28 36 37.7 1 HCds I1753 01 57 19.30 +28 35 22.2 5 0.89 1.67 KEBA WS UZC K13 VPS1 I1754 01 56 49.945 +04 01 31.60 3 0.88 0.75 KHJ CCA HCds I1755 01 57 09.77 +14 32 59.1 5 0.98 1.24 Pds WS UZC SPF CCA I1756 01 57 05.31 -00 28 07.2 4 0.99 0.89 WS UZC HCds CCA I1757 01 57 11.47 -00 28 26.6 2 0.95 0.57 HCds WS I1757 comp 01 57 12.28 -00 28 22.4 1 HCds I1758 * 01 56 52.20 -16 32 24.8 1 HCds I1758 gal 01 56 52.37 -16 32 31.1 2 0.30 0.64 HCds WS I1759=I1760 01 57 55.36 -32 59 14.9 3 2.75 1.73 HCds ESOB WS I1760=I1759 01 57 55.36 -32 59 14.9 3 2.75 1.73 HCds ESOB WS I1761 01 58 52.289 +00 34 05.29 4 0.95 0.34 UZC KHJ Pds HCds I1762 01 57 48.5 -33 14 24 2 2.65 0.00 ESOB WS I1763 01 59 11.4 -27 48 38 2 1.87 6.36 ESOB WS I1764 02 00 23.43 +24 34 49.6 4 1.12 4.51 WS CCA UZC DC I1765=N0783 02 01 06.58 +31 52 56.0 7 1.23 1.79 UZC WS KEB1 K13 VPS1 CCA DC I1766=N0785 02 01 40.14 +31 49 34.4 5 2.85 1.18 VPS1 WS UZC CCA DC I1767 01 59 59.4 -11 04 43 3 0.85 2.08 Pds WS SPC I1768 02 00 49.91 -25 01 36.3 3 2.24 0.76 WS GSC ESOB I1769 02 00 54.8 -31 55 14 2 0.90 1.41 WS ESOB I1770 02 02 14.40 +09 58 49.4 5 0.56 2.14 GSC SPF UZC WS CCA I1771 02 02 15.82 +09 58 06.1 4 0.47 0.96 WS Pds2 SPF GSC I1772 02 02 42.85 +07 44 42.9 2 1.68 1.41 WS HCds I1773=N0804 02 04 02.16 +30 49 57.2 5 0.73 1.84 UZC GSC WS VPS1 CCA I1774 02 03 59.04 +15 19 03.4 5 1.70 1.45 SPF WS UZC CCA Pds I1775 02 05 17.60 +13 30 18.1 2 1.24 1.34 WS HCds I1776 02 05 15.15 +06 06 17.5 4 0.99 1.81 WS DC UZC CCA I1777 02 06 08.804 +15 12 34.81 3 1.33 1.26 KHJ HCds Pds2 I1778=I0199 02 06 19.45 +09 13 37.8 5 0.85 1.28 WS UZC SPF Pds CCA I1779 02 06 25.993 +03 42 21.00 4 0.68 0.56 KHJ SPF Pds UZC I1780 02 06 51.20 +14 43 18.1 4 0.96 0.58 WS Pds UZC HCds I1781 02 06 52.8 -00 31 04 3 0.87 1.53 UZC WS K15 I1782=N0823 02 07 19.98 -25 26 31.6 3 1.01 2.15 HCds ESOB WS I1782=N0823 * 02 07 20.93 -25 26 33.0 1 HCds I1783 02 10 06.2 -32 56 26 2 6.21 2.83 WS ESOB I1784 02 16 12.93 +32 38 58.8 8 3.03 3.84 WS Pds UZC GSC VPS1 CCA DC GHD1 I1785 02 16 20.922 +32 39 58.78 4 3.36 1.52 HCo GSC KHJ VPS1 I1786 02 16 05.61 +05 08 43.6 4 1.10 0.40 WS Pds UZC HCds I1787=I0217 02 16 10.6 -11 55 33 2 0.00 0.00 SPC WS I1788 02 15 49.7 -31 12 04 3 8.96 2.31 WS GHD2 ESOB I1789 02 17 51.28 +32 23 44.9 4 0.58 2.16 UZC CCA VPS1 WS I1790 02 17 38.02 +12 30 32.0 4 1.42 1.30 WS CCA Pds HCds I1791 02 17 41.38 +12 28 12.4 5 1.31 1.39 WS Pds UZC CCA HCds I1792 02 19 01.13 +34 27 43.0 4 0.37 2.73 VPS WS UZC CCA I1793 02 21 32.37 +32 32 40.2 4 1.41 2.58 WS VPS1 UZC CCA I1794 02 21 30.240 +15 45 40.84 3 1.43 0.97 KHJ UZC HCds I1795 02 26 32.0 +62 02 29 1 HCds I1796 02 22 47.4 -41 22 16 2 1.59 0.71 WS ESOB I1797 02 25 27.93 +20 23 42.7 4 0.90 0.84 WS UZC KEBA CCA I1798 02 26 15.55 +13 25 49.0 2 1.14 0.71 WS HCds I1799 02 28 45.965 +45 58 13.83 4 0.86 0.36 UZC KHJ SBG1 CCA I1800 02 28 31.1 +31 24 37 2 0.91 4.24 HCo HCm I1800 ne* 02 28 31.45 +31 24 45.7 1 HCds I1800 sw* 02 28 30.83 +31 24 24.2 1 HCds I1801 02 28 12.78 +19 34 57.6 6 1.86 1.66 HCo UZC CCA WS Pds HCds I1802 02 29 14.027 +23 04 58.41 3 1.82 1.13 HCds KHJ Pds I1802 comp 02 29 16.93 +23 05 11.7 2 0.98 2.90 HCds WS I1803: 02 29 49.83 +23 06 30.9 3 0.94 1.56 Pds HCds IPds I1803: sup * 02 29 50.64 +23 06 31.8 1 HCds I1804: 02 29 54.33 +23 05 50.1 2 0.49 0.14 HCds Pds I1805 02 32 47 +61 27.7 2 61.24 25.46 BSV HCe I1806 02 29 34.928 +22 56 35.76 2 0.46 0.21 GSC KHJ I1807 02 30 30.995 +22 56 57.72 2 0.07 1.82 Pds2 KHJ I1808=N0963 02 30 31.1 -04 12 59 3 0.00 1.53 WS K08 SPC I1809 02 31 40.48 +22 55 00.8 3 0.00 0.50 WS UZC CCA I1810 02 29 26.8 -43 04 33 2 2.32 6.36 WS ESOB I1811 02 30 38.0 -34 15 52 2 0.00 3.54 ESOB WS I1812 02 29 31.9 -42 48 39 3 2.90 4.36 Pds WS ESOB I1813 02 30 49.3 -34 13 16 2 5.25 3.54 ESOB WS I1814=N0964 02 31 05.84 -36 02 05.2 3 1.97 2.10 WS HCds ESOB I1815 02 34 20.093 +32 25 45.82 7 1.87 1.22 VPS1 UZC KHJ GSC Pds CCA DC I1816 02 31 51.1 -36 40 19 2 1.70 3.54 WS ESOB I1817e 02 33 50.86 +11 12 10.2 3 0.60 2.40 WS UZC HCds I1817w 02 33 49.57 +11 12 10.9 3 0.85 1.29 WS Pds2 HCds I1818 02 34 07.156 -11 02 26.77 2 0.41 0.13 KHJ HCds I1819 02 35 41.861 +04 03 05.69 3 0.82 0.70 UZC KHJ Pds I1820 02 35 52.7 +06 02 25 3 1.49 0.58 UZC WS Pds I1821e 02 36 26.66 +13 46 13.2 2 0.82 43.63 WS HCds I1821w 02 36 25.497 +13 46 48.34 4 0.82 0.28 KHJ Pds UZC HCds I1822 02 35 42.28 -08 33 46.5 3 1.71 3.01 HCds WS HC I1823 02 38 37.039 +32 04 10.14 4 0.70 0.51 KHJ VPS1 UZC CCA I1824:=N1027 02 42 38 +61 35.7 3 39.57 3.47 BSV HCe TDM I1825 02 38 55.51 +09 05 48.6 3 1.28 2.20 WS UZC CCA I1826=I1830 02 39 03.7 -27 26 38 4 1.88 2.87 ESOB Pds WS GHD2 I1827 02 39 46.54 +01 33 28.5 5 1.11 1.99 WS UZC CCA HCds DC I1828=N1036 02 40 29.05 +19 17 49.9 6 1.67 2.34 DC WS HCds UZC SDP CCA I1829 02 40 32.87 +14 17 53.3 1 HCds I1830=I1826 02 39 03.7 -27 26 38 4 1.88 2.87 ESOB Pds WS GHD2 I1831 02 44 +63.6 1o Wolf I1831? 02 43 +62.4 1 HCe I1832 02 41 57.737 +19 01 47.41 4 1.19 0.61 KHJ Pds UZC HCds I1833 02 41 38.6 -28 10 19 2 0.00 0.00 ESOB WS I1834 02 42 48.10 +03 05 00.9 5 1.50 1.36 Pds WS UZC CCA HCds I1835 02 43 49.4 +14 53 13 1 HCds I1835mw 02 43 48.87 +14 53 14.1 1 HCds I1835n 02 43 49.12 +14 53 20.4 3 1.24 1.10 WS Pds HCds I1835se 02 43 50.70 +14 53 08.5 1 HCds I1835w 02 43 48.68 +14 53 10.4 2 1.13 0.57 WS HCds I1836 02 43 23.43 +03 06 17.3 3 1.65 1.29 WS Pds HCds I1836 comp 02 43 21.09 +03 06 55.0 1 HCds I1837=N1072 02 43 31.22 +00 18 24.6 7 2.88 2.34 DC HC GHD2 WS UZC SPC CCA I1838 02 44 43.02 +19 27 16.8 4 0.92 0.98 WS Pds UZC HCds I1838 comp 02 44 43.07 +19 27 31.1 2 1.50 2.47 WS HCds I1839 02 44 43.03 +15 14 22.1 5 0.89 1.94 Pds UZC CCA WS HCds I1840=N1105 02 43 41.970 -15 42 21.81 3 0.46 1.49 WS KHJ HCds I1841 02 45 36.34 +18 55 43.1 3 0.74 0.58 WS UZC HCds I1842 02 45 23.37 +11 27 28.7 3 0.51 1.29 Pds WS HCds I1843 02 45 24.75 +02 52 46.6 5 1.95 2.58 UZC SPC CCA DC WS I1844 02 45 49.3 +03 13 48 3 0.00 1.73 SBIB WS UZC I1845 02 43 56.7 -27 58 05 2 3.74 4.24 ESOB HCds I1845 n * 02 43 56.87 -27 58 04.2 1 HCds I1845 s * 02 43 57.01 -27 58 12.8 1 HCds I1846=?N1109 02 47 43.59 +13 15 18.8 5 0.71 0.83 WS GSC UZC Pds CCA I1847 02 47 53.750 +14 30 17.43 3 1.22 0.87 KHJ Pds HCds I1848 02 51 18 +60 24.5 2 84.33 33.94 BSV HCos I1849 02 47 44.7 +09 21 22 3 2.26 1.15 UZC WS Pds2 I1850=?N1111 02 48 39.2 +13 15 32 2 1.03 2.12 HCo WS I1851 02 51 45.92 +58 18 52.3 1 SAO I1852=?N1112 02 49 00.36 +13 13 24.4 5 0.39 1.07 WS Pds UZC GSC CCA I1853 02 48 04.2 -13 59 37 2 1.03 0.00 SPC WS I1854 02 49 20.639 +19 18 16.18 4 2.16 3.85 SDP KHJ UZC EDC I1855 02 49 04.36 +13 26 33.6 1 HCds I1856 02 48 50.68 -00 46 02.9 6 6.05 1.25 DC UZC SPC WS CCA GH I1857 02 49 38.98 +14 37 10.4 4 1.71 0.71 WS UZC CCA HCds I1858 02 49 08.4 -31 17 23 2 0.00 0.00 ESOB WS I1859 02 49 04.2 -31 10 23 2 7.24 0.00 WS ESOB I1860 02 49 34.1 -31 11 24 2 7.24 0.00 WS ESOB I1861 02 53 07.06 +25 29 24.5 3 0.55 1.52 WS UZC CCA I1862 02 51 58.8 -33 20 22 2 0.00 4.24 ESOB WS I1863 02 54 50.901 +08 47 02.61 2 3.29 1.64 KHJ Pds2 I1864 02 53 39.5 -34 11 51 2 1.75 4.24 WS ESOB I1865 02 55 20.17 +08 49 40.8 4 1.64 1.30 WS Pds UZC CCA I1866 02 54 52.942 -15 39 10.58 2 0.95 2.00 WS KHJ I1867 02 55 52.263 +09 18 42.24 5 0.65 0.58 UZC KHJ HCds CCA Pds I1868 02 56 05.843 +09 22 43.68 2 0.13 0.12 HCds KHJ I1869 * 02 58 12.02 +05 50 20.4 1 HCds I1869 e 02 58 11.66 +05 50 10.8 2 1.48 2.19 HCds WS I1869 w 02 58 10.19 +05 50 21.3 1 HCds I1870 02 57 53.5 -02 20 49 4 0.75 0.50 SPC K02 K08 WS I1871 02 57 21 +60 40.3 1 HCos I1871 comp 02 55 10 +60 38.6 1 HCos I1872 03 04 34.8 +42 48 34 2 2.34 4.95 GSCm WS I1873 03 03 52.869 +09 36 47.74 2 0.30 0.06 UZC KHJ I1874 03 06 21.968 +36 00 51.94 3 0.22 0.36 SBG1 UZC KHJ I1875 03 03 56.52 -39 26 27.0 3 2.81 1.18 ESOB WS HCds I1875 comp 03 03 59.32 -39 25 31.9 1 HCds I1876 03 04 32.12 -27 27 36.4 3 4.64 2.20 ESOB WS GSC I1877 03 03 09.61 -50 30 41.9 3 0.00 0.92 ESOB WS HCds I1878 03 03 40.13 -52 06 29.5 2 0.19 0.57 GSC WS I1878 comp 03 03 43.3 -52 06 07 1 WS I1879 03 03 52.60 -52 07 04.5 3 2.95 1.59 GSC WS ESOB I1880 03 06 28.529 -09 43 53.69 5 1.28 3.95 Pds SPC KHJ GSC KOS I1881=N1213 03 09 17.32 +38 38 57.2 4 1.25 2.06 HCds WS SBG1 CCA I1882 03 07 49.40 +03 08 49.9 3 1.77 2.28 CCA UZC WS I1883=N1212 03 09 42.35 +40 53 32.9 2 0.32 1.06 WS HCds I1884=I0290 03 09 42.78 +40 58 27.3 4 0.61 0.95 UZC WS SBG1 CCA I1885 03 06 40.3 -32 51 52 2 0.89 0.00 WS ESOB I1886 03 08 03.2 -04 24 01 1 WS I1887=I0292 03 10 13.16 +40 45 57.5 6 2.13 2.22 WS UZC SBG1 CCA DC STMM I1888=I0293 03 10 56.172 +41 08 13.90 2 0.27 0.45 KHJ SBG1 I1889=I0294 03 11 03.14 +40 37 18.2 3 1.32 2.10 WS SBG1 CCA I1890 03 09 58.466 +19 12 28.57 3 0.64 0.75 KHJ GSC Pds I1891 03 10 11.98 +19 36 23.6 3 0.78 1.52 HCds GSC WS I1892 03 08 27.19 -23 03 19.0 5 2.44 4.21 ESOB HCds WS Pds GSC I1892 comp 03 08 25.70 -23 02 11.8 1 HCds I1893 03 10 16.52 +19 37 00.1 2 0.20 1.91 HCds WS I1894 03 10 25.428 +19 36 24.21 2 0.74 0.51 HCds KHJ I1895 03 09 36.4 -25 15 13 2 2.87 0.00 WS ESOB I1896 03 07 52.9 -54 12 51 2 0.00 0.00 ESOB WS I1897 03 10 45.910 -10 47 44.08 2 0.37 2.40 Pds KHJ I1898 03 10 20.0 -22 24 18 2 7.83 2.83 WS ESOB I1899 03 12 13.1 -25 18 17 2 2.87 2.12 WS ESOB I1900 03 15 55.162 +37 09 14.59 3 0.88 0.59 UZC SBG1 KHJ I1901 03 16 02.643 +37 06 44.65 3 0.32 0.17 KHJ UZC SBG1 I1902 03 16 12.445 +37 10 38.83 2 0.42 0.07 KHJ SBG1 I1903 both 03 13 10.7 -50 34 12 2 4.70 2.12 HCds ESOB I1903nw 03 13 08.44 -50 33 44.6 2 0.47 0.99 HCds WS I1903se 03 13 12.48 -50 34 41.0 2 1.95 2.12 HCds WS I1904 03 15 00.9 -30 42 31 2 0.00 0.00 ESOB WS I1905 03 18 48.0 +41 21 56 3 0.00 1.00 HC WS HCds I1905? 03 18 48.6 +41 21 42 1 HCds I1906 03 16 05.5 -34 21 36 2 3.49 1.41 ESOB WS I1907=N1278 03 19 54.25 +41 33 48.4 7 1.50 1.17 WS GSC SBG1 CCA DC HC GHD1 I1908 03 15 05 -54 49.0 1 ESOB I1908nw 03 15 05.1 -54 49 10 1 WS I1908se 03 15 05.7 -54 49 20 1 WS I1909 03 17 20.0 -33 41 26 2 0.00 0.71 ESOB WS I1910 03 17 57 -21 26.1 1o DS I1911 03 20 46 +35 19.4 1o Bige I1911? 03 20 49.18 +35 19 18.5 1 HCds I1912 03 16 43.19 -50 39 18.4 3 1.42 2.03 ESOB HCds WS I1913 03 19 34.3 -32 27 56 4 1.79 3.16 ESOB FC GHD2 WS I1914 03 19 24.96 -49 35 58.8 3 2.18 0.35 ESOB HCds WS I1915 03 19 51.96 -50 41 27.8 3 2.19 4.20 WS HCds ESOB I1916 03 20 16.4 -49 02 31 2 3.46 0.00 WS ESOB I1917 03 22 12.6 -53 11 09 1 WS I1917m 03 22 12.31 -53 11 05.8 1 HCds I1917n 03 22 13.11 -53 10 41.5 1 HCds I1917ne 03 22 13.68 -53 10 53.2 1 HCds I1917s 03 22 12.65 -53 11 18.7 1 HCds I1917se 03 22 14.27 -53 11 11.3 1 HCds I1918 03 26 17.901 +04 32 27.16 3 0.10 0.70 KHJ Pds UZC I1919 03 26 02.1 -32 53 41 3 2.51 4.16 ESOB WS FSn I1920 03 24 24.27 -52 42 46.8 1 HCds I1920?? 03 23 60.0 -52 43 26 1 WS I1921 03 24 42 -50 41.9 1o DS I1921? 03 24 43.97 -50 41 23.7 1 HCds I1922 03 24 42.97 -50 44 24.8 3 0.55 2.01 HCds ESOB WS I1923 03 24 52.4 -50 33 20 1 HCds I1923e 03 24 52.91 -50 33 20.0 1 HCds I1923w 03 24 51.77 -50 33 20.5 1 HCds I1924 03 25 07.55 -51 42 10.3 3 1.04 3.58 WS HCds ESOB I1925 03 25 15 -51 15.9 1o DS I1925??=I1929 03 25 25.67 -51 16 01.4 3 0.65 0.12 ESOB WS HCds I1926 03 25 18.82 -51 42 03.3 3 1.63 2.07 ESOB WS HCds I1927 03 25 12 -51 43.9 1o DS I1927: 03 25 19.8 -51 43 10 2 1.96 0.71 HCds WS I1927: e* 03 25 20.23 -51 43 10.3 1 HCds I1927: w* 03 25 19.16 -51 43 10.7 1 HCds I1928 03 27 29.0 -21 33 34 4 0.80 3.20 ESOB HC Pds WS I1929=??I1925 03 25 25.67 -51 16 01.4 3 0.65 0.12 ESOB WS HCds I1930 03 28 46.1 +04 22 59 1 WS I1931 03 28 57.5 +01 44 59 3 4.82 1.53 Pds UZC WS I1932 03 25 54.09 -51 20 34.6 3 2.26 1.53 HCds WS ESOB I1933 03 25 39.95 -52 47 05.4 3 0.57 2.76 ESOB WS HCds I1934 03 31 13.9 +42 47 31 1 WS I1935 03 26 13.39 -50 00 36.4 3 1.22 3.19 ESOB WS HCds I1936 03 26 28.00 -51 19 23.7 3 2.18 1.08 HCds WS ESOB I1937 03 26 47.2 -48 42 11 2 2.79 0.00 ESOB WS I1938 03 27 10.58 -53 00 36.6 3 3.11 1.56 WS HCds ESOB I1939 03 27 44 -51 04.3 1o DS I1939? 03 27 18.0 -51 02 59 1 HCds I1939? ne * 03 27 18.33 -51 02 58.5 1 HCds I1939? sw * 03 27 17.73 -51 03 01.2 1 HCds I1940 03 27 42.07 -52 08 22.2 3 0.74 1.00 ESOB WS HCds I1941 03 32 14.9 +24 23 01 1 HCds I1941 m* 03 32 14.66 +24 23 03.8 1 HCds I1941 n* 03 32 15.44 +24 23 24.3 1 HCds I1941 s* 03 32 14.60 +24 22 35.7 1 HCds I1942 03 27 53.9 -52 40 33 2 2.56 0.00 ESOB WS I1942n 03 27 53.78 -52 40 32.0 1 HCds I1942s 03 27 53.62 -52 40 38.9 1 HCds I1943 03 29 44 -44 06.5 1o Sw11 I1943:=N1411 03 38 44.9 -44 06 01 2 0.00 2.83 ESOB WS I1944 03 29 39.9 -47 59 47 2 0.00 2.12 ESOB WS I1945 03 29 16.43 -52 37 38.2 3 0.26 0.81 HCds ESOB WS I1946 03 29 22.18 -52 37 09.9 3 2.09 1.79 WS HCds ESOB I1946 comp 03 29 23.33 -52 37 26.9 1 HCds I1947 03 30 32.68 -50 20 18.0 3 0.61 4.59 ESOB WS HCds I1948 03 30 49.9 -47 57 51 2 1.42 2.83 ESOB WS I1949 03 30 52.8 -47 58 46 2 1.42 3.54 ESOB WS I1950 03 31 04.37 -50 25 58.3 4 0.92 1.29 ESOB WS HCds Pds I1951 03 30 56.44 -53 07 35.8 3 2.86 2.56 HCds WS ESOB I1952 03 33 26.4 -23 42 46 2 3.88 1.41 ESOB WS I1953 03 33 41.8 -21 28 42 3 2.13 1.53 ESOB WS GHD2 I1954 03 31 31.39 -51 54 16.4 3 2.83 0.12 WS HCds ESOB I1955 03 31 24.8 -57 14 30 2 0.57 2.83 WS ESOB I1956 03 35 33.22 +05 04 00.2 2 0.21 1.27 CCA WS I1957 03 32 13.30 -52 27 25.0 3 0.91 1.90 ESOB HCds WS I1958 03 32 46.45 -51 26 28.5 3 1.99 1.55 HCds ESOB WS I1959 03 33 12.15 -50 24 46.5 3 2.55 1.47 ESOB WS HCds I1960 03 32 33.2 -57 12 26 2 4.57 0.00 WS ESOB I1961 03 33 32.7 -48 57 04 2 8.33 0.71 ESOB WS I1962 03 35 37.5 -21 17 31 2 3.95 2.12 WS ESOB I1963=I0335 03 35 30.97 -34 26 47.7 6 2.07 1.89 ESOB FSn Pds HCds HC2m WS I1964 03 33 29.33 -53 10 23.4 3 4.08 1.95 ESOB WS HCds I1965 03 33 10.7 -56 33 13 2 2.33 3.54 ESOB WS I1966 03 34 03.37 -51 19 20.3 3 1.70 1.00 HCds WS ESOB I1967 03 37 47.68 +03 16 13.0 4 0.94 2.03 GSC Pds UZC WS I1968 03 34 37.85 -50 39 04.3 3 1.85 1.65 HCds WS ESOB I1969 03 36 14.1 -45 10 45 2 2.98 1.41 WS ESOB I1970 03 36 31.4 -43 57 26 2 2.28 1.41 WS ESOB I1971 03 35 57.55 -52 39 02.2 3 2.43 1.21 HCds WS ESOB I1972 03 36 21.31 -51 58 04.1 3 1.48 1.13 WS HCds ESOB I1973 03 36 21.07 -51 59 39.2 3 2.89 0.29 HCds WS ESOB I1974 03 36 42.15 -49 33 02.1 3 0.00 2.57 ESOB WS HCds I1975 03 39 03.518 -15 30 00.53 2 0.67 0.00 WS KHJ I1976 03 37 08.8 -47 26 17 2 2.15 0.00 ESOB WS I1977 03 40 45.11 +17 44 26.3 4 0.85 1.51 WS SPF UZC CCA I1978 03 37 05.58 -50 09 04.6 3 1.06 2.31 WS HCds ESOB I1979 03 36 46.3 -57 56 40 1 HCds I1979 n* 03 36 46.47 -57 56 32.4 1 HCds I1979 s* 03 36 45.92 -57 56 47.7 1 HCds I1980 03 36 58.94 -57 58 25.3 3 0.41 1.03 ESOB WS HCds I1981=N1412 03 40 29.1 -26 51 42 2 2.83 2.83 ESOB WS I1982 03 37 42.4 -57 46 34 2 0.00 2.83 ESOB WS I1983=N1415 03 40 56.9 -22 33 50 3 0.00 2.08 ESOB GHD2 WS I1984 03 39 50.0 -47 04 31 2 2.16 6.36 ESOB WS I1985=I0348 03 44 34.2 +32 09 46 1 SAO I1986 03 40 35.2 -45 21 20 2 0.00 2.83 ESOB WS I1987 03 40 11.51 -55 03 28.1 3 2.38 9.34 ESOB WS HCds I1987e 03 40 12.19 -55 03 23.0 2 0.30 0.57 WS HCds I1987ne 03 40 12.01 -55 03 12.9 2 0.42 0.71 WS HCds I1987w 03 40 09.63 -55 03 17.9 2 0.67 0.42 WS HCds I1988 03 42 45 -39 53.2 1o Sw11 I1988?=N1425 03 42 11.41 -29 53 37.7 6 2.61 2.12 ESOB GSCM GHD2 WS HC2m HCds I1989 03 41 54.58 -50 57 28.6 3 1.93 0.98 WS HCds ESOB I1990 03 47 13 +24 20.0 1 HCos I1991 03 44 46.66 -51 31 26.0 3 1.99 2.71 WS HCds ESOB I1992 03 45 08 -51 00.3 1o DS I1992? 03 45 09.47 -50 59 55.9 1 HCds I1993 03 47 04.90 -33 42 35.5 4 4.82 5.51 FSn HCds WS ESOB I1994 03 45 55.09 -51 38 37.3 3 1.81 0.87 HCds WS ESOB I1995 03 50 18 +25 34.8 1 SAO I1996 03 45 07.84 -57 19 29.4 2 1.31 0.00 HCds ESOB I1996 comp 03 45 05.44 -57 19 11.6 1 HCds I1997 03 44 51.7 -59 08 16 2 1.08 0.00 ESOB WS I1998 03 51 31.301 +01 11 23.53 1 KHJ I1999 03 47 42.7 -56 57 08 2 2.30 0.00 ESOB WS I2000 03 49 07.63 -48 51 30.2 4 2.00 1.33 ESOB WS HC2m HCds I2001 03 50 51.7 -48 35 59 2 0.00 1.41 HCds WS I2001 e* 03 50 52.25 -48 35 57.9 1 HCds I2001 w* 03 50 51.27 -48 35 58.7 1 HCds I2002=N1474 03 54 30.34 +10 42 23.8 3 0.77 0.45 UZC GSC CCA I2003 03 56 21.951 +33 52 30.32 4 0.60 0.45 GSC CK UJ10 GSCA I2004 03 51 45.5 -49 25 10 2 0.69 0.71 WS ESOB I2005 03 57 39.50 +36 47 13.1 2 0.77 1.56 WS SBG1 I2006 03 54 28.3 -35 58 02 3 0.00 1.53 ESOB Pds WS I2007=I2008 03 55 22.58 -28 09 31.8 4 4.29 3.26 ESOB WS MFSK HCds I2008=I2007 03 55 22.58 -28 09 31.8 4 4.29 3.26 ESOB WS MFSK HCds I2009 03 53 35.01 -48 59 21.8 3 2.45 4.00 WS HCds ESOB I2010 03 51 58.17 -59 55 47.3 3 4.04 1.29 HCds WS ESOB I2011 03 52 27.3 -57 28 06 2 1.14 0.00 HCds WS I2011 e* 03 52 27.75 -57 28 05.5 1 HCds I2011 w* 03 52 26.57 -57 28 06.7 1 HCds I2012 03 52 55.28 -58 39 00.4 3 0.67 3.33 HCds ESOB WS I2012 comp 03 52 55.11 -58 39 14.1 1 HCds I2013 03 56 44 -17 06.6 1o DS I2014 03 55 21.59 -56 44 45.8 3 1.26 3.04 ESOB HCds WS I2015 03 58 11.50 -40 23 22.8 3 2.20 0.40 HCds WS ESOB I2016 04 01 59.9 +20 14 23 2 1.00 0.00 Pds WS I2017 03 56 39.21 -59 23 41.6 3 3.59 0.55 WS HCds ESOB I2018 03 57 54.21 -52 46 51.8 3 2.54 0.50 ESOB HCds WS I2019 04 01 53.7 +05 38 20 3 0.00 1.53 WS UZC Pds I2019 comp 04 01 52.7 +05 38 07 1 WS I2020 03 58 53.06 -54 03 30.4 3 0.92 2.08 WS ESOB HCds I2021 03 59 23.86 -52 39 23.7 3 1.20 2.02 HCds ESOB WS I2022 03 58 40.22 -59 02 40.7 3 1.54 3.15 HCds WS ESOB I2023 03 59 40.66 -52 40 51.7 5 1.41 0.86 HCds HCsc HC2m ESOB WS I2024 04 00 03.9 -53 22 22 2 1.26 2.83 ESOB WS I2025 04 00 23.2 -53 03 55 2 5.08 0.00 WS ESOB I2026=N1509 04 03 55.243 -11 10 43.79 4 1.22 0.67 HCds KHJ GSC KET2 I2026=N1509 comp 04 03 50.50 -11 10 50.6 1 HCds I2027 04 06 39.61 +37 06 56.2 4 0.91 1.26 WS Pds HCds CCA I2028 04 01 18.3 -52 42 28 2 1.92 0.71 WS ESOB I2029 04 01 18.0 -52 48 04 2 2.56 0.71 WS ESOB I2030 04 04 56 -19 13.9 1o DS I2031 04 06 14.61 -05 39 06.7 1 HCds I2032 04 07 03.3 -55 19 28 2 2.41 6.36 WS ESOB I2033 04 07 14.5 -53 40 55 2 0.00 2.83 ESOB WS I2034 04 06 36.7 -57 57 43 2 1.12 0.00 ESOB WS I2035 04 09 01.6 -45 31 03 2 2.22 0.71 ESOB WS I2036 04 09 55.3 -39 41 19 2 4.07 0.71 WS ESOB I2037 04 08 19.3 -58 45 04 3 0.45 1.53 ESOB WS Pds I2038 04 08 54.1 -55 59 38 3 0.97 3.46 ESOB RC2 WS I2039 04 09 02.3 -56 00 44 2 4.14 4.24 ESOB WS I2040 04 12 59.5 -32 33 11 3 2.19 4.58 Pds2 ESOB WS I2041=I2048 04 12 34.66 -32 49 02.3 3 4.16 2.63 ESOB HCds WS I2042 04 11 43.209 -47 16 16.29 3 1.12 4.28 WS Ty2 ESOB I2043 04 11 09.8 -53 41 12 2 0.00 0.71 ESOB WS I2044 04 11 14.1 -54 31 59 2 1.23 2.83 WS ESOB I2045=??N1538 04 14 36.058 -13 10 30.67 3 0.71 0.89 KHJ HCds SPC I2046 04 11 24.6 -54 40 25 2 1.83 1.41 WS ESOB I2047=?N1538 04 14 56.136 -13 11 30.22 2 1.09 0.03 KHJ HCds I2048=I2041 04 12 34.66 -32 49 02.3 3 4.16 2.63 ESOB HCds WS I2049 04 12 03.7 -58 33 25 2 6.06 3.54 ESOB WS I2050 04 13 56.1 -53 28 32 2 1.89 3.54 ESOB WS I2051 03 52 01.3 -83 49 56 2 2.34 0.00 WS ESOB I2052 04 14 58.33 -54 20 12.8 3 1.70 2.97 ESOB WS HC2m I2053 04 15 55.48 -49 21 30.6 2 0.76 1.13 WS HCds I2054 04 07 26.30 -78 15 12.7 3 1.24 1.53 ESOB HCds WS I2055 04 17 48 -48 55.4 1o DS I2055? 04 17 47.0 -48 54 28 1 WS I2056 04 16 24.2 -60 12 23 2 6.30 1.41 ESOB WS I2057 04 21 56.1 +04 02 50 2 1.06 0.00 WS UZC I2058 04 17 54.5 -55 56 00 3 0.00 6.35 ESOB RC2 WS I2059 04 20 26.2 -31 43 29 2 0.90 0.71 WS ESOB I2060 04 17 53.7 -56 37 00 3 3.11 3.51 Pds WS ESOB I2061 04 24 00 +21 05.0 1o DS I2062 04 32 02.29 +71 55 12.6 2 2.81 1.48 HCds HCo I2063 04 22 40.26 -15 39 40.1 2 0.20 1.84 WS GSC I2064 04 23 26.727 -15 41 07.39 3 0.39 0.98 WS KHJ GSC I2065 04 21 28.0 -55 55 59 2 1.78 0.00 ESOB WS I2066 04 23 32.3 -54 44 01 2 1.22 0.71 WS ESOB I2067 04 30 51.03 +35 26 46.2 1 HCds I2068 04 26 37.0 -42 05 34 2 3.93 4.95 WS ESOB I2069 04 25 56 -48 12.5 1o DS I2069: 04 25 55.43 -48 12 21.4 1 HCds I2070 04 24 35.2 -57 58 51 2 3.92 3.54 ESOB WS I2071 04 26 12.3 -53 09 03 1 HCds I2071sw 04 26 10.27 -53 09 13.2 1 HCds I2071mw 04 26 11.31 -53 09 05.2 1 HCds I2071nw 04 26 11.59 -53 08 56.9 1 HCds I2071me 04 26 12.64 -53 09 04.8 1 HCds I2071ne 04 26 13.13 -53 09 00.8 1 HCds I2071e 04 26 14.19 -53 09 02.8 3 2.59 3.35 ESOB WS HCds I2072 04 26 54 -48 22.6 1o DS I2072?? 04 27 09.63 -48 24 23.2 1 HCds I2073 04 26 33.5 -53 11 16 2 1.90 4.24 WS ESOB I2074 04 31 23.0 +07 42 09 2 1.05 0.00 HCm WS I2074 sw * 04 31 22.75 +07 42 02.7 1 HCds I2074 n * 04 31 22.86 +07 42 19.9 1 HCds I2074 se * 04 31 23.29 +07 42 05.6 1 HCds I2075=N1594 04 30 51.646 -05 47 53.89 3 1.02 1.00 KHJ Pds SPC I2076 04 28 07 -48 13.7 1o DS I2077=N1593=N1608 04 32 06.126 +00 34 01.93 6 0.85 1.36 CCA HCds UZC KHJ Pds SPC I2078 04 31 52.22 -04 41 55.3 1 GSC I2079 04 28 30.7 -53 44 14 2 0.00 6.36 ESOB WS I2080 04 31 52.14 -05 45 24.1 1 HCds I2081 04 29 00.9 -53 36 49 2 1.88 2.12 WS ESOB I2082 04 29 07.6 -53 49 38 4 2.55 2.89 ESOB RC2 HCds WS I2082 sup * 04 29 07.84 -53 49 47.2 2 0.50 0.14 HC2m HCds I2082e 04 29 08.32 -53 49 40.6 2 1.50 0.14 HC2m HCds I2082w 04 29 07.07 -53 49 35.8 2 0.62 0.35 HC2m HCds I2083 04 30 43.9 -53 58 50 2 3.11 2.83 ESOB WS I2084 04 32 06 -48 17.3 1o DS I2085 04 31 24.2 -54 25 03 3 1.51 0.00 ESOB RC2 WS I2086 04 31 31.8 -53 38 49 2 3.76 4.24 ESOB WS I2087 04 39 60.0 +25 44 32 1 HCo I2088 04 43.7 +27 16 1o MW I2088: 04 31.1 +26 36 1 LBN I2089 04 32 50.2 -75 32 26 2 1.84 0.00 ESOB WS I2090 04 44 44 -33 59.6 1o Sw11 I2091 04 46 40.1 -04 40 21 2 3.17 0.71 HCds WS I2092 04 46 47.6 -04 56 36 1 HCds I2092 ** 04 46 46.2 -04 56 41 1 WS I2093 04 47 32.28 -02 42 32.5 1 HCds I2094 04 48 24.80 -05 21 09.9 2 1.06 1.27 HCds WS I2094 comp 04 48 23.84 -05 21 21.0 1 HCds I2095 04 48 45.75 -05 07 30.8 4 1.79 1.30 HCds GSC SPC WS I2096 04 49 41.4 -04 58 43 2 10.57 0.71 HCds WS I2097 04 50 23.80 -05 04 50.5 4 3.82 1.25 SPC HCds GSC WS I2098 04 50 44.31 -05 25 07.2 3 3.29 0.52 HCds WS SPC I2099 04 50 51.87 -04 53 31.8 3 1.08 0.46 HCds WS SPC I2100 04 51 14.98 -04 49 50.0 2 0.74 1.91 HCds WS I2100 nw* 04 51 14.75 -04 49 47.4 1 HCds I2100 se* 04 51 15.13 -04 49 55.2 1 HCds I2101 04 51 42.01 -06 13 50.0 4 0.82 1.45 HCds SPC Pds WS I2102 04 51 55.16 -04 57 08.3 3 1.28 1.96 SPC WS HCds I2103 04 39 47.8 -76 50 13 2 0.48 0.71 WS ESOB I2104 04 56 19.2 -15 47 57 2 2.04 0.71 WS SPC I2105 04 49 26.46 -69 12 02.4 2 1.46 0.21 HCds ESOB I2106 04 56 33.9 -28 30 12 3 0.76 3.00 ESOB WS Pds I2107=N1707 04 58 20.7 +08 14 18 2 0.00 0.71 HCds WS I2108=N1710 04 57 16.97 -15 17 22.9 3 1.71 3.79 WS SPC GSC I2109 04 58 59.18 -00 18 19.1 1 GSC I2110 04 59 01.80 -00 18 09.5 1 GSC I2111 04 51 52.4 -69 23 33 3 4.47 2.89 ESOB HCds AH I2111 ne 04 51 53.76 -69 23 27.5 1 HCds I2111 s 04 51 52.31 -69 23 38.0 1 HCds I2111 w 04 51 52.04 -69 23 31.0 1 HCds I2112 05 00 30.1 +04 23 10 3 0.86 1.53 WS Pds UZC I2113=N1730 04 59 31.73 -15 49 24.9 3 1.30 1.06 SPC WS GSC I2114=N1748 04 54 24.6 -69 11 03 4 3.71 2.83 ESOB HChw AH HCds I2115: 04 57 08.74 -66 23 24.7 1 HCds I2116: 04 57 16.02 -66 23 20.6 1 HCds I2117 04 57 14.36 -68 26 29.0 2 1.44 0.08 HCds AH I2118=N1909? 05 04.9 -07 15 1 HCe I2119 05 06 50.77 -20 20 45.3 3 2.11 2.89 ESOB HCds WS I2119 comp 05 06 50.27 -20 20 03.9 1 HCds I2120 05 19 10.3 +38 11 05 1o Big I2121 05 19 44.82 -25 03 53.1 3 2.05 1.47 WS HCds ESOB I2122 05 19 01.2 -37 05 19 2 3.38 4.95 ESOB WS I2123=I0412 05 21 56.66 +03 29 10.3 7 2.34 1.34 DC HCds GSC HC2m WS UZC CCA I2124=I0413 05 21 58.79 +03 28 55.8 7 1.21 1.43 DC GSC HC2m HCds WS UZC CCA I2125 05 24 28.1 -27 00 57 2 0.00 1.41 ESOB WS I2126=N1935 05 21 58.52 -67 57 31.5 3 4.03 6.30 HChw ESOB HCds I2127=N1936 05 22 13.71 -67 58 38.0 3 5.83 6.68 HChw HCds ESOB I2128 05 22 44.2 -68 03 39 1 HCds I2128 sw 05 22 47 -68 04.2 1 ESOB I2129=I2130 05 31 50.38 -23 08 42.8 3 1.31 2.55 WS ESOB HCds I2130=I2129 05 31 50.38 -23 08 42.8 3 1.31 2.55 WS ESOB HCds I2131=I0422 05 32 18.46 -17 13 27.1 3 1.22 0.29 Pds2 WS HCds I2131=I0422 comp 05 32 20.90 -17 16 44.6 1 HCds I2132 05 32 28.7 -13 55 39 2 0.00 2.12 WS SPC I2133=N1961 05 42 04.60 +69 22 43.4 9 2.39 1.85 WS GHD1 DC UZC HCds HC2m HCds Pds CCA I2134 05 23 06.66 -75 26 48.2 3 1.39 1.18 HCds KMHA ESOB I2135=I2136 05 33 13.07 -36 23 58.5 3 2.82 1.27 ESOB WS HCds I2136=I2135 05 33 13.07 -36 23 58.5 3 2.82 1.27 ESOB WS HCds I2137=I2138 05 34 21.63 -23 31 59.7 3 2.16 2.02 WS HCds ESOB I2138=I2137 05 34 21.63 -23 31 59.7 3 2.16 2.02 WS HCds ESOB I2139 05 35 15.7 -17 56 02 2 10.09 1.41 WS ESO I2140 05 33 22.32 -75 22 34.3 3 1.75 2.90 ESOB KMHA HCds I2141 05 42 22.3 -51 01 58 2 0.00 0.00 HCds WS I2141 nw* 05 42 21.97 -51 01 53.2 1 HCds I2141 se* 05 42 22.99 -51 02 01.5 1 HCds I2141 sw* 05 42 21.98 -51 01 59.5 1 HCds I2142 05 33 09.1 -78 01 10 2 0.88 2.12 WS ESOB I2143 05 46 52.8 -18 43 36 3 4.99 2.65 WS SPC ESOB I2144 05 50 13.89 +23 52 20.7 1 HCds I2145 05 40 23 -69 40.3 3 0.00 3.46 SIMA ESOB HChw I2146 05 37 46.76 -74 46 55.6 3 3.04 4.84 ESOB HCds KMHA I2147 05 43 28.43 -30 29 42.9 2 0.91 0.92 GSC ESOB I2148 05 39 12.16 -75 33 46.6 3 1.26 1.57 ESOB KMHA HCds I2149 05 56 23.823 +46 06 17.38 4 0.74 0.35 GSC UJ10 CK Ty2 I2150 05 51 18.7 -38 19 14 2 4.16 3.54 WS ESOB I2151 05 52 36.6 -17 47 16 3 4.12 0.58 ESOB SPC WS I2152 05 57 53.2 -23 10 51 2 1.95 0.71 ESOB WS I2153 06 00 04.8 -33 55 08 4 0.72 2.06 Pds HCds ESOB WS I2153sw 06 00 04.22 -33 55 11.9 1 HCds I2153ne 06 00 05.25 -33 55 05.2 1 HCds I2154=N2139 06 01 08.06 -23 40 22.2 4 3.71 1.93 GHD2 HCds WS ESOB I2155 06 00 49 -34 00.9 1o DS I2155: 06 00 38.36 -33 59 50.2 2 0.18 0.78 HCds WS I2155? 06 00 44.12 -33 58 24.8 1 HCds I2155?? 06 00 52.29 -34 03 33.9 1 HCds I2156 06 04 53.2 +24 09 14 2 15.48 21.92 HCds WS I2157 06 04 48 +24 03.9 2 19.37 29.70 BSV HCds I2158 06 05 17.84 -27 51 24.8 4 3.69 1.37 ESOB WS HCds Pds I2159 06 09 57 +20 25.9 1 HCe I2160 05 55 29.4 -76 55 14 2 3.12 0.71 WS ESOB I2161 05 57 25.75 -75 08 22.5 3 3.82 0.61 HCds KMHA ESOB I2162 06 13 04.7 +17 58 48 1 HCds I2162 * 06 13 04.18 +17 58 43.1 1 HCds I2163 06 16 27.97 -21 22 33.7 4 3.14 2.12 ESOB WS HCds GHD2 I2164 06 06 51.7 -75 21 56 2 3.75 1.41 ESOB WS I2165 06 21 42.68 -12 59 12.9 4 1.14 2.12 DKM1 GSC CK GSCA I2166 06 26 55.62 +59 04 44.8 4 2.28 2.91 DC UZC WS CCA I2167=I0446 06 31 06.1 +10 27 35 1 HCds I2168 06 33 48.6 +44 41 12 3 7.71 6.11 HCo HCds WS I2168 ne * 06 33 48.47 +44 41 16.3 1 HCds I2168 sw * 06 33 47.44 +44 41 06.8 1 HCds I2169=I0447 06 31 07 +09 52.0 1 HCe I2170 06 34 06.7 +44 41 14 2 1.51 2.12 HCds HCo I2171?=N2283 06 45 52.83 -18 12 38.2 4 3.80 0.65 WS GSC HCo ESOB I2171?? 06 44 27.14 -17 55 57.6 5 5.70 1.91 ESOB Pds SPC WS GSC I2172=N2282 06 46 51.42 +01 18 55.8 2 3.08 2.47 BSV HCds I2173 06 50 47.19 +33 27 26.9 2 0.62 2.97 HCds WS I2174 07 09 05.53 +75 21 10.6 5 1.54 0.44 WS HCrs UZC GHD1 CCA I2175 07 08 39.78 +35 17 18.4 2 1.90 1.06 HCds HCo I2176 07 07 31.787 +32 28 11.54 3 0.42 1.08 UZC BPP KHJ I2177 07 04 25.34 -10 27 12.9 1 HCds I2177 neb 07 04 36 -10 28.3 1 HCe I2177se 07 05 43 -11 11.0 1 HCe I2178 07 07 37.644 +32 30 45.00 2 0.26 0.51 BPP KHJ I2179 07 15 32.40 +64 55 33.7 7 1.32 2.54 UZC GSC Pds WS CCA DC GHD1 I2180 07 11 19.63 +26 22 15.3 4 1.49 1.89 WS UZC Pds CCA I2181 07 13 10.525 +18 59 45.04 5 3.02 2.04 KHJ UZC CCA Pds MB I2182 07 14 10.96 +18 56 40.5 2 0.40 1.63 HCds WS I2183 07 16 56 -20 24.6 1o DS I2184 07 29 26.1 +72 07 46 5 3.64 5.12 WS UZC SDP K15 K01 I2184a 07 29 23.7 +72 07 48 1 DC I2184b 07 29 26.3 +72 07 48 1 DC I2184e 07 29 26.49 +72 07 41.8 1 HCds I2184ne 07 29 27.02 +72 07 49.9 1 HCds I2184nw 07 29 24.62 +72 07 46.2 1 HCds I2184se 07 29 26.02 +72 07 36.5 1 HCds I2184sw 07 29 24.11 +72 07 38.4 1 HCds I2185 07 23 16.1 +32 29 41 5 0.69 2.19 K08 BPP WS UZC KEBA I2186:=I2188 07 22 43.228 +21 30 46.44 3 0.84 1.09 KHJ GSC Pds I2186? 07 22 47.81 +21 31 45.7 1 GSC I2186?? 07 22 43.4 +21 32 36 1 WS I2187 07 22 43.33 +21 28 58.2 4 0.66 2.13 WS GSC UZC Pds I2188=:I2186 07 22 43.228 +21 30 46.44 3 0.84 1.09 KHJ GSC Pds I2189 07 24 57 +08 55.2 1o WF I2189? 07 24 57.8 +08 54 27 1 WS I2190 07 29 54.43 +37 27 05.8 4 0.72 1.76 WS CCA UZC SBG1 I2191 07 30 17.437 +24 19 39.45 4 0.62 0.74 Pds GSC KHJ UZC I2192 07 33 20.22 +31 21 42.2 1 HCds I2193 07 33 23.73 +31 28 59.4 5 1.58 1.80 WS HCds UZC CCA BPP I2194 07 33 40.20 +31 20 03.6 4 1.33 1.91 HCds WS UZC BPP I2195 07 28 27 -51 15.4 1o DS I2196 07 34 09.886 +31 24 21.01 6 2.81 1.67 KHJ HCds CCA BPP UZC DC I2197 07 34 25.32 +31 25 19.9 1 HCds I2197 * 07 34 24.94 +31 25 26.8 1 HCds I2197?? 07 34 18.9 +31 20 11 1 WS I2197?? * 07 34 19.5 +31 20 15 1 WS I2198 07 34 11.1 +23 57 57 3 0.79 1.00 WS UZC Pds I2199 07 34 55.69 +31 16 34.0 6 1.66 2.44 WS DC HCds UZC CCA BPP I2200 07 28 17.5 -62 21 07 2 1.98 5.66 WS ESOB I2200A 07 28 06.6 -62 21 46 2 0.49 2.83 WS ESOB I2201 07 36 16.903 +33 07 20.85 4 1.51 0.67 SBG1 KHJ UZC CCA I2202 07 27 54.4 -67 34 28 2 4.06 2.12 ESOB WS I2203 07 40 33.73 +34 13 46.8 6 1.42 1.39 WS SBG1 K12 UZC CCA DC I2204 07 41 18.26 +34 13 54.3 5 4.21 2.00 WS UZC SBG1 CCA MB I2205 07 46 54.687 +26 52 23.02 4 4.25 4.29 BPP UZC KHJ HCo I2206 07 45 50.393 -34 19 48.64 1 Ty2 I2207 07 49 50.83 +33 57 43.0 4 0.73 1.05 SBG1 WS CCA UZC I2208 07 52 07.88 +27 29 02.2 1 GSC I2209 07 56 14.38 +60 18 14.9 7 2.04 3.25 UZC SDP WS K04 CCA GHD1 DC I2210 07 56 56.5 +56 40 56 1 HCds I2210 n* 07 56 56.71 +56 41 02.8 1 HCds I2210 s* 07 56 56.34 +56 40 49.8 1 HCds I2211 07 57 45.783 +32 33 28.80 5 3.26 1.60 SBG1 KHJ CCA UZC DC I2212 07 58 57.193 +32 36 43.83 3 0.13 0.16 SBG1 KHJ UZC I2213 07 59 06.541 +27 27 49.61 4 0.56 0.54 BPP KHJ GSC UZC I2214 07 59 53.85 +33 17 24.4 5 0.93 1.54 WS DC UZC SBG1 CCA I2215 07 59 33.1 +24 55 44 1o Big I2216 07 59 27.63 +05 36 51.1 2 1.90 1.56 HCds WS I2216 e* 07 59 27.79 +05 36 51.3 1 HCds I2216 w* 07 59 27.31 +05 36 53.0 1 HCds I2217 08 00 49.83 +27 30 00.5 6 0.65 1.38 WS DC UZC KEBA CCA BPP I2218 08 01 38.45 +24 25 54.7 3 0.69 2.08 WS GSC Pds I2219 08 02 36.45 +27 26 13.9 5 2.00 1.45 DC CCA WS UZC BPP I2220 07 56 51.03 -59 07 33.1 3 1.93 1.53 SAO HCds ESOB I2221 08 05 07.96 +37 27 01.0 2 0.17 1.63 GSC WS I2222 08 05 14.78 +37 28 20.8 4 0.40 1.64 SBG1 GSC WS UZC I2223 08 05 46.0 +37 27 55 1o J I2223?=I2224 08 05 50.32 +37 27 36.0 1 GSC I2224=?I2223 08 05 50.32 +37 27 36.0 1 GSC I2225 08 05 28.10 +35 56 47.2 3 0.07 0.64 WS UZC GSC I2226 08 06 11.221 +12 32 37.62 4 0.19 2.18 KHJ CCA UZC MB I2227 08 07 07.17 +36 14 00.8 2 1.11 1.84 SBG1 HCds I2228 08 07 05.7 +08 01 31 1 HCrs I2229=I0496 08 09 44.12 +25 52 51.1 3 2.72 1.95 WS GSC UZC I2230 08 10 56.550 +25 41 04.67 1 KHJ I2231 08 11 01.57 +05 05 14.0 5 1.22 1.34 WS HCds CCA Pds UZC I2231 * or comp 08 11 00.40 +05 05 18.5 1 HCds I2232=N2543 08 12 57.94 +36 15 15.5 9 2.07 2.85 GHD1 WS K16 GSC UZC HCo SBG1 CCA DC I2233 08 13 58.93 +45 44 32.6 7 0.74 7.86 SBG1 UZC HCds WS GHD1 DC CCA I2234 08 13 51.627 +35 29 33.98 2 0.06 0.02 GSC KHJ I2235 08 13 34.0 +24 04 40 2 0.97 2.12 HCm WS I2235 w * 08 13 33.71 +24 04 43.4 1 HCds I2235 e * 08 13 34.23 +24 04 41.0 1 HCds I2236 08 13 37.6 +24 02 52 2 0.97 0.00 HCm WS I2236 n * 08 13 37.37 +24 03 00.9 1 HCds I2236 s * 08 13 37.58 +24 02 49.4 1 HCds I2236 F gal? 08 13 37.70 +24 02 54.8 1 HCds I2237 08 14 08.09 +24 40 44.7 2 0.77 1.20 HCds WS I2238 08 14 08.59 +24 39 41.6 2 0.29 2.47 HCds WS I2239 08 14 06.7 +23 51 57 3 0.79 1.00 WS Pds UZC I2240 08 14 47.48 +24 28 04.1 1 HCds I2241 08 15 08.55 +24 07 47.0 1 HCds I2242 08 15 11.39 +24 08 00.5 1 HCds I2243 08 15 18.43 +23 57 44.2 1 HCds I2244 08 15 22.24 +24 32 44.1 2 0.77 2.55 HCds WS I2245 08 15 28.38 +24 32 08.4 2 0.29 3.39 WS HCds I2246 08 16 00.79 +23 50 59.1 1 HCds I2247 08 15 59.09 +23 11 58.5 2 0.29 0.85 HCds CCA I2248 08 16 04.771 +23 08 02.60 4 0.50 0.79 HCds UZC KEBA KHJ I2249 08 16 34.5 +24 29 32 1 WS I2250 08 16 32.3 +23 37 54 1 WS I2251 08 16 38.8 +23 56 57 2 0.97 2.12 HCds WS I2251 ne * 08 16 39.06 +23 57 00.8 1 HCds I2251 sw * 08 16 38.48 +23 56 56.4 1 HCds I2252 08 16 41.85 +24 41 40.2 1 HCds I2253 08 16 33.90 +21 24 35.7 3 0.00 0.81 WS UZC HCds I2254 08 16 45.46 +24 46 47.7 4 0.14 1.22 WS Pds UZC HCds I2255 08 16 43.17 +23 27 25.6 1 HCds I2255 ne* 08 16 43.54 +23 27 28.9 1 HCds I2255 sw* 08 16 42.81 +23 27 21.5 1 HCds I2256 08 16 54.4 +24 10 35 3 0.00 2.00 WS UZC K04 I2257 08 17 10.8 +23 38 59 1 HCds I2257 e* 08 17 11.31 +23 39 01.8 1 HCds I2257 w* 08 17 10.36 +23 38 58.0 1 HCds I2258 08 17 16.36 +23 34 41.2 1 HCds I2258? 08 17 13.9 +23 34 56 1 WS I2258? ne * 08 17 14.05 +23 35 00.0 1 HCds I2258? sw * 08 17 13.35 +23 34 54.1 1 HCds I2259 08 17 18.1 +23 33 46 1o MW1 I2259: 08 17 18.13 +23 33 58.1 1 HCds I2260 08 17 27.59 +24 40 24.3 1 HCds I2261 08 17 32.8 +23 30 44 1 HCds I2261 ne * 08 17 33.18 +23 30 54.6 1 HCds I2261 sw * 08 17 32.59 +23 30 33.2 2 2.62 2.55 HCds WS I2262 08 17 22.54 +18 27 14.0 2 0.50 3.04 WS GSC I2263 08 17 40.82 +23 34 50.1 1 HCds I2264 08 17 44.93 +23 42 52.1 2 0.29 3.46 HCds WS I2265 08 17 50.16 +24 11 37.1 2 0.58 0.99 HCds HCo I2266 08 17 38.47 +18 24 37.3 1 GSC I2267 08 18 01.51 +24 44 11.2 4 0.07 3.32 WS UZC K04 CCA I2268 08 18 06.6 +24 47 45 3 1.36 2.08 WS UZC K04 I2269 08 18 08.69 +23 02 49.8 2 0.78 3.61 WS HCds I2270 08 18 00.4 +19 05 50 2 0.00 1.41 WS HCds I2270 n* 08 18 00.26 +19 05 56.6 1 HCds I2270 s* 08 18 00.51 +19 05 47.2 1 HCds I2271 08 18 19.766 +24 31 36.55 3 0.93 0.05 KHJ UZC K04 I2272 08 18 07.2 +18 44 09 1 HCds I2272 e* 08 18 07.91 +18 44 12.7 1 HCds I2272 w* 08 18 06.50 +18 44 03.5 3 1.08 2.13 GSC HCds WS I2273 08 18 12.86 +18 24 03.9 2 0.90 2.97 HCds WS I2274 08 18 14.09 +18 39 55.5 3 1.29 1.63 HCds GSC WS I2275 08 18 13.70 +18 24 40.6 2 0.30 2.62 HCds WS I2276 08 18 29.4 +18 28 39 1o MW1 I2277 08 18 32.44 +18 39 00.2 1 GSC I2278 08 18 34.5 +18 27 41 1o MW1 I2279 08 18 35.48 +18 34 05.4 2 0.30 1.34 WS HCds I2280 08 18 38.7 +18 27 03 1o MW1 I2280 * 08 18 38.50 +18 27 00.7 1 HCds I2281 08 18 54.08 +18 54 34.0 1 HCds I2282 08 19 15.54 +24 47 32.8 5 0.71 1.08 K04 HCds Pds WS UZC I2283 08 19 17.43 +24 47 13.2 1 HCds I2284 08 18 58.7 +18 36 20 1 WS I2285 08 19 02.9 +18 54 52 2 1.00 0.00 HCds WS I2285 e * 08 19 03.61 +18 54 51.8 1 HCds I2285 me * 08 19 03.10 +18 54 53.6 1 HCds I2285 mw * 08 19 02.51 +18 54 51.7 1 HCds I2285 n * 08 19 02.50 +18 55 10.3 1 HCds I2285 s * 08 19 02.63 +18 54 42.4 1 HCds I2286 08 19 04.00 +18 57 22.1 1 HCds I2287 08 19 07.63 +19 24 01.7 1 HCds I2288 08 19 22.37 +23 44 49.3 5 0.99 0.87 WS KEBA UZC HCds K04 I2289 08 19 07.56 +18 29 55.1 1 HCds I2290 08 19 15.8 +19 18 46 4 0.71 1.73 Pds WS HCo UZC I2291 08 19 18.04 +18 30 30.6 1 HCds I2292 08 19 21.98 +19 33 48.9 1 HCds I2293 08 19 32.10 +21 23 38.1 3 0.32 1.00 WS UZC GSC I2294 08 19 25.93 +18 59 06.6 1 HCds I2295 08 19 26.98 +18 24 52.5 1 HCds I2295? 08 19 26.5 +18 24 47 1 HCds I2295? ne * 08 19 26.98 +18 24 52.5 1 HCds I2295? sw * 08 19 25.88 +18 24 40.8 2 0.50 3.39 WS HCds I2296 08 19 28.5 +18 53 52 1 WS I2297 08 20 04.65 +18 22 52.6 2 0.70 3.54 HCds WS I2298 08 20 07.09 +18 24 09.6 2 0.30 2.33 HCds WS I2299 08 20 09.4 +19 20 14 1 HCds I2299 ne * 08 20 09.70 +19 20 17.2 2 0.10 3.32 HCds WS I2299 sw * 08 20 09.02 +19 20 09.9 1 HCds I2300 08 20 12.7 +18 25 09 1 WS I2301 08 20 13.9 +18 26 01 1 WS I2302 08 20 17.33 +19 21 24.3 2 0.20 4.17 WS HCds I2303 08 20 19.35 +19 25 07.6 2 0.80 1.98 HCds WS I2304 08 20 35.7 +19 26 20 2 1.00 2.12 HCds WS I2304 e * 08 20 36.19 +19 26 20.3 1 HCds I2304 w * 08 20 35.13 +19 26 24.4 2 1.40 0.92 GSC HCds I2305 08 20 40.2 +19 27 07 1 WS I2306 08 20 39.43 +19 06 37.5 1 HCds I2307 08 20 42.86 +19 26 25.3 5 0.66 0.92 Pds GSC WS UZC HCds I2308 08 20 45.25 +19 21 43.2 3 0.71 3.14 KEBA GSC WS I2308n 08 20 45.25 +19 21 45.1 2 1.00 0.57 HCo HCds I2308se 08 20 45.81 +19 21 40.8 2 0.20 1.56 HCo HCds I2308sw 08 20 44.84 +19 21 43.1 2 0.80 1.91 HCo HCds I2309 08 20 43.7 +18 23 49 2 2.01 2.83 WS Pds I2310 08 20 46.31 +18 27 47.6 2 0.60 2.90 HCds WS I2311 08 18 45.8 -25 22 13 3 1.36 1.53 ESOB Pds WS I2312 08 20 53.4 +18 30 30 1o MW1 I2312 * 08 20 53.33 +18 30 22.5 1 HCds I2312ne 08 20 53.44 +18 30 43.5 2 1.31 3.25 WS HCds I2312sw 08 20 53.19 +18 30 29.6 2 0.20 3.39 WS HCds I2313 08 20 54.58 +18 30 52.7 2 0.10 2.26 HCds WS I2314 08 21 03.6 +18 45 45 1 HCds I2314 nw * 08 21 03.35 +18 45 51.0 1 HCds I2314 se * 08 21 03.87 +18 45 50.3 1 HCds I2315 08 21 10.74 +18 54 54.9 1 HCds I2316 08 21 15.2 +19 45 33 2 1.00 0.00 HCds WS I2316 nw * 08 21 14.74 +19 45 39.2 1 HCds I2316 se * 08 21 15.75 +19 45 28.8 1 HCds I2317 08 21 21.52 +18 50 39.1 1 GSC I2318 08 21 33.2 +18 37 19 1o MW1 I2318: 08 21 32.73 +18 37 23.8 1 HCds I2318? 08 21 34.33 +18 37 20.6 1 HCds I2319 08 21 33.08 +18 28 34.0 2 0.40 3.11 HCds WS I2320 08 21 35.40 +18 40 14.3 1 HCds I2321 08 21 39.13 +18 28 06.7 2 0.80 3.18 HCds WS I2322 08 21 38.96 +18 29 01.6 2 0.90 3.04 HCds WS I2323 08 21 41.24 +18 36 48.3 1 HCds I2324 08 21 58.81 +19 11 38.3 1 HCds I2324 nearby *nw 08 21 57.72 +19 12 02.1 1 HCds I2325 08 22 08.7 +18 54 43 1o MW1 I2325 nearby *e 08 22 12.87 +18 54 45.1 1 HCds I2325 nearby *ne 08 22 11.68 +18 55 04.1 1 HCds I2326 08 22 12.1 +19 00 43 1o MW1 I2326 nearby **w 08 22 09.93 +19 00 46.3 1 HCds I2326 nearby *ne 08 22 13.93 +19 01 12.8 1 HCds I2327 08 21 28.03 +03 10 08.7 4 0.52 2.05 CCA WS DC UZC I2328 08 22 17.4 +19 36 59 1o MW1 I2328 nearby *n 08 22 17.86 +19 37 50.5 1 HCds I2329 08 22 19.53 +19 24 53.8 5 2.20 3.55 WS MB UZC HCo CCA I2329 * 08 22 20.9 +19 24 55 1o MW1 I2330 08 22 23.2 +18 51 09 1 WS I2330 * 08 22 23.19 +18 51 12.5 1 GSC I2331 08 22 35.23 +19 40 46.2 1 HCds I2332 08 22 39.7 +19 55 18 1 WS I2333 08 23 00.87 +19 04 53.4 2 1.80 2.55 HCds WS I2334 08 22 60.0 +18 36 49 1 WS I2335 08 23 07.4 +19 24 36 1o MW1 I2335 * 08 23 07.46 +19 24 41.4 1 HCds I2335 galaxy 08 23 07.08 +19 24 26.4 2 0.60 3.04 HCds WS I2336 08 23 19.02 +18 32 16.2 1 HCds I2337 08 23 20.29 +18 32 05.9 3 0.86 1.75 HCds WS Pds I2338 08 23 32.64 +21 20 15.6 5 1.01 1.04 Pds UZC GSC WS CCA I2339 08 23 34.22 +21 20 50.5 4 0.63 1.35 WS CCA GSC UZC I2340 08 23 30.2 +18 44 56 2 0.00 1.41 WS Pds I2341 08 23 41.42 +21 26 03.8 5 0.91 1.09 WS UZC GSC Pds CCA I2342 08 23 32.15 +18 34 45.2 2 1.00 2.05 HCds WS I2343 08 23 54.02 +19 01 31.5 2 0.80 2.90 HCds WS I2343 nearby * 08 23 54.42 +19 01 26.0 1 HCds I2344 08 23 54.9 +18 39 31 1 WS I2345 08 24 08.46 +19 57 08.8 1 HCds I2346 08 24 10.92 +19 42 22.9 1 HCds I2346 nearby * sw 08 24 09.75 +19 42 13.4 1 HCds I2347 08 24 14.06 +18 46 25.9 1 HCds I2348 08 24 20.251 +20 31 59.28 2 0.08 0.51 Pds KHJ I2349 08 24 16.75 +19 00 29.5 1 HCds I2350 08 24 28.4 +19 33 07 1o MW1 I2350? 08 24 01.3 +19 39 51 1 HCo I2351 08 24 30.16 +18 35 20.2 1 HCds I2352 08 24 40.00 +19 36 08.1 2 0.50 3.39 HCds WS I2353 08 24 37.69 +18 39 22.0 2 1.20 1.63 WS GSC I2354 08 24 40.76 +18 39 59.2 1 HCds I2355 08 24 51.82 +20 27 48.5 1 HCds I2355 n * 08 24 51.90 +20 27 53.5 1 HCds I2355 s * 08 24 51.73 +20 27 43.5 1 HCds I2356 08 25 00.83 +19 29 49.5 2 0.80 2.90 WS HCds I2357 08 25 04.58 +19 30 30.1 2 0.40 2.55 HCds WS I2358 08 25 05.09 +19 29 42.8 1 HCds I2359=N2582 08 25 12.09 +20 20 04.3 5 0.73 2.22 GSC WS UZC DC CCA I2360 08 25 15.17 +19 30 58.6 2 0.60 0.00 HCds HCo I2361 08 25 44.48 +27 52 27.3 6 1.26 0.80 WS BPP MB K15 UZC CCA I2362 08 25 41.47 +19 56 28.6 2 1.00 4.88 HCds WS I2362 n * 08 25 41.46 +19 56 35.7 1 HCds I2362 s * 08 25 41.37 +19 56 28.3 1 HCds I2363 08 25 45.49 +19 26 56.3 4 0.21 2.50 GSC WS UZC GH I2364 08 25 51.50 +19 45 32.8 2 0.30 3.18 HCds WS I2364 ne * 08 25 51.61 +19 45 37.0 1 HCds I2364 sw * 08 25 51.36 +19 45 32.9 1 HCds I2365 08 26 18.0 +27 52 54 1o J I2365:=I2366 08 26 18.045 +27 50 23.05 4 0.70 0.74 BPP UZC KHJ CCA I2366=:I2365 08 26 18.045 +27 50 23.05 4 0.70 0.74 BPP UZC KHJ CCA I2367 08 24 10.1 -18 46 36 2 2.01 2.83 WS SPC I2368 08 26 01.29 +19 52 58.8 1 HCds I2369 08 26 16.06 +20 13 56.1 1 HCds I2370 08 26 22.80 +19 38 18.1 1 HCds I2371 08 26 37.04 +19 47 53.3 2 1.30 2.05 HCds WS I2372 08 26 40.60 +19 52 57.9 2 0.10 3.18 WS HCds I2373 08 26 49.02 +20 21 51.9 5 0.82 1.38 GDC WS Pds UZC CCA I2374 08 28 22.1 +30 26 36 2 0.91 0.71 BPP HCo I2375 08 26 19.62 -13 18 11.5 3 0.94 0.61 GSC WS SPC I2376 08 28 26.06 +30 24 26.3 3 1.04 1.25 WS UZC GSC I2377 08 26 26.02 -13 18 23.4 3 0.76 1.26 WS SPC GSC I2378 08 28 31.66 +30 25 51.7 7 0.65 1.57 WS UZC GSC Pds Pds BPP IPds I2379 08 26 27.81 -13 17 36.4 3 0.25 1.93 SPC WS GSC I2380 08 28 43.875 +30 24 16.30 3 0.39 0.42 BPP KHJ GSC I2381 08 28 21.77 +19 47 27.8 2 0.60 2.97 HCds WS I2381 nw * 08 28 21.63 +19 47 33.3 1 HCds I2381 se * 08 28 21.84 +19 47 26.4 1 HCds I2382 08 28 46.1 +22 03 12 3 0.00 3.00 WS UZC KEBA I2383 08 29 41.3 +30 41 16 2 0.91 2.83 BPP WS I2384 08 34 23.493 +32 26 04.38 4 1.04 1.00 HCds KHJ UZC SBG1 I2384 comp 08 34 22.52 +32 25 50.3 2 1.79 1.70 HCds SBG1 I2385 08 35 10.46 +37 15 57.4 6 1.52 1.63 K07 K01 K16 UZC WS SBG1 I2386 08 34 43.99 +25 48 23.9 1 GSC I2387 08 38 34.00 +30 47 54.7 4 1.27 2.20 WS UZC BPP CCA I2388 08 39 56.50 +19 38 40.7 3 0.08 1.76 WS Pds GSC I2389 08 47 57.68 +73 32 18.0 5 3.55 1.66 DC GHD1 UZC CCA WS I2390=N2643 08 41 51.725 +19 42 07.47 3 0.10 1.77 GSC Pds KHJ I2391 08 40.3 -52 55 3 0.00 34.64 AH BSV HCe I2391 all 08 40 40 -53 03.4 2 115.22110.32 ESOB HCe I2392 08 44 30.90 +18 17 09.1 5 0.96 1.25 GSC HC WS Pds UZC I2393 08 46 49.18 +28 10 15.2 4 0.66 2.07 BPP WS UZC CCA I2394 08 47 06.86 +28 14 10.7 4 1.87 1.70 WS UZC BPP CCA I2395 08 42 29 -48 07.9 4 5.02 67.70 AH BSV ESOB HCe I2396 08 46 40.57 +17 38 57.1 2 0.40 0.99 HCds HCo I2397 08 46 41.76 +17 39 33.3 4 1.13 1.37 HC WS HCo HCds I2397 e * 08 46 42.07 +17 39 35.1 1 HCds I2397 w * 08 46 41.65 +17 39 35.4 1 HCds I2398 08 46 44.497 +17 45 17.30 5 1.75 0.72 HC KEBA GSC KHJ UZC I2399 08 46 50.1 +18 54 54 1o MW1 I2399: 08 47 49.7 +18 54 40 3 2.17 2.08 HC WS Pds I2400 08 47 59.15 +38 04 09.0 4 1.22 2.22 SBG1 WS UZC K01 I2401 08 48 10.318 +37 45 18.54 4 0.73 0.81 SBG1 KHJ UZC CCA I2402 08 47 59.074 +31 47 08.33 4 0.61 0.87 BPP KHJ UZC GPB I2403 08 46 09.31 -15 21 25.8 2 0.51 0.07 GSC WS I2404 08 48 10.4 +29 29 27 3 1.99 1.00 WS UZC BPP I2405 08 48 42.69 +37 13 06.1 5 1.24 1.55 K01 WS UZC KEBA SBG1 I2406 08 48 04.59 +17 42 08.6 5 4.48 1.93 HC WS UZC CCA DC I2407 08 48 09.12 +17 36 40.3 3 1.15 1.08 WS UZC CCA I2408 08 48 20.2 +19 02 13 2 2.00 4.24 HC WS I2409 08 48 24.75 +18 19 49.9 5 2.41 2.39 UZC HC CCA WS DC I2410=N2667=N2667A 08 48 27.3 +19 01 08 4 1.16 1.26 WS Pds UZC HC I2411=N2667B 08 48 30.2 +19 02 34 4 2.45 1.26 HC WS UZC Pds I2412 08 49 23.79 +18 32 32.5 2 1.81 4.17 GSC WS I2413 08 49 31.5 +18 44 39 4 0.82 1.29 WS HC HCo HCds I2413 nw * 08 49 31.34 +18 44 45.9 1 HCds I2413 se * 08 49 31.82 +18 44 36.8 1 HCds I2414 08 49 50.145 +18 47 32.97 4 0.81 2.96 GSC KHJ Pds HC I2415 08 50 02.0 +18 39 05 1 HCo I2416 08 50 32.14 +18 33 34.0 1 GSC I2417 08 51 08.15 +18 37 30.6 1 HCds I2418 08 51 25.0 +17 56 41 2 1.01 4.24 WS HC I2419 08 52 09.44 +18 06 03.8 2 0.81 1.63 HCds WS I2419 n * 08 52 09.31 +18 06 09.4 1 HCds I2419 s * 08 52 09.49 +18 06 00.3 1 HCds I2420 08 51 33.8 +03 06 00 3 0.86 0.58 WS Pds UZC I2421 08 54 21.55 +32 40 50.6 8 1.61 3.20 MB WS K16 SBG1 GHD1 UZC CCA K01 I2422 08 54 24.292 +20 13 27.68 2 0.53 1.73 Pds KHJ I2423 08 54 47.05 +20 13 12.1 4 2.95 2.80 MB WS UZC CCA I2424=N2704 08 56 47.78 +39 22 56.2 6 2.24 2.31 WS UZC SBG1 GSC CCA DC I2425 08 55 50.13 -03 25 23.3 1 HCds I2426 08 58 30.403 +02 55 31.13 3 1.73 1.02 ZGT UZC KHJ I2427 09 01 01.664 +37 52 31.25 2 0.50 0.38 SBG1 KHJ I2428 09 03 14.76 +30 35 27.8 4 1.70 2.63 WS UZC BPP CCA I2429 09 03 42.583 +29 17 45.71 3 1.35 0.16 UZC KHJ BPP I2430 09 04 22.86 +27 57 09.9 5 0.85 2.16 WS DC BPP UZC CCA I2431 09 04 34.8 +14 35 41 2 1.03 0.71 WS KEB1 I2431e 09 04 35.52 +14 35 44.3 2 1.33 0.35 DC HCds I2431m 09 04 34.60 +14 35 45.9 2 0.82 0.92 DC HCds I2431n 09 04 34.51 +14 35 54.6 2 1.13 0.07 DC HCds I2431s 09 04 34.78 +14 35 38.9 3 1.60 1.54 UZC HCds DC I2432 09 04 39.571 +05 30 42.69 2 1.02 0.87 KHJ UZC I2433 09 05 28.6 +22 36 05 3 0.80 1.53 WS Pds UZC I2434 09 07 16.11 +37 12 54.0 5 1.11 0.58 WS SBG1 DC UZC CCA I2435 09 06 49.869 +26 16 30.73 4 1.37 0.55 KHJ UZC CCA KEBA I2436 09 05 23.3 -19 09 58 4 4.07 2.16 HCds WS GSC ESOB I2436 nw * 09 05 22.95 -19 09 56.0 1 HCds I2436 se * 09 05 23.27 -19 10 02.3 1 HCds I2437 09 05 33.013 -19 12 25.22 6 2.28 2.58 ESOB HCds GSC SPC WS KHJ I2438 09 14 09.4 +73 24 55 2 3.59 9.19 HCds WS I2438 (7 sts) 09 14 08.0 +73 24 33 1 HCds I2439 09 08 38.455 +32 35 34.81 3 0.58 0.46 KHJ SBG1 UZC I2440 09 15 50.16 +73 27 32.5 1 HCds I2441nw 09 10 01.8 +22 51 16 3 0.80 1.15 WS UZC BCG I2441se 09 10 02.9 +22 51 04 3 0.80 1.00 WS BCG UZC I2442 09 10 05.172 +22 50 17.11 3 0.03 0.90 BCG UZC KHJ I2443 09 11 30.889 +28 49 35.52 3 0.06 0.52 UZC BPP KHJ I2444 09 12 50.859 +30 12 44.06 3 0.04 1.03 KHJ UZC BPP I2445 09 13 12.53 +31 48 27.7 4 0.19 2.89 WS UZC BPP CCA I2446=?I2447 09 13 31.41 +28 57 04.4 4 1.33 1.47 WS UZC BPP CCA I2447 09 13 30.9 +28 44 27 1o J I2447?=I2446 09 13 31.41 +28 57 04.4 4 1.33 1.47 WS UZC BPP CCA I2448 09 07 05.89 -69 56 31.8 3 4.46 1.65 ESOB UCA1 GSC I2449=N2783B 09 13 32.83 +29 59 58.8 4 1.86 0.54 HKA UZC GSC CCA I2450 09 17 05.18 +25 25 45.6 2 0.76 0.21 HCds KEB1 I2451 09 15 47.753 +23 29 46.23 2 0.09 1.13 Pds KHJ I2452 09 15 57.589 +23 28 19.51 2 0.35 0.80 KHJ Pds I2453 09 15 54.489 +20 55 43.23 3 0.83 0.31 KEB1 UZC KHJ I2454 09 16 01.781 +17 49 15.10 4 0.84 2.53 DC KHJ UZC CCA I2455=N2804 09 16 49.96 +20 11 53.6 4 0.61 1.54 WS CCA GSC UZC I2455? 09 16 51.1 +20 06 33 1 HCo I2456 09 17 23.8 +34 40 33 1o J I2456: 09 17 24.19 +34 40 29.0 1 HCds I2457 09 17 04.15 +20 05 35.4 3 0.71 0.64 HCo HCds WS I2458=N2820A 09 21 30.08 +64 14 16.8 5 1.39 2.55 HCds SDP WS UZC GHD1 I2459 09 18 59.454 +34 51 43.84 2 0.17 0.33 HCds KHJ I2460=N2827 09 19 18.94 +33 52 50.2 3 0.25 1.66 WS SBG1 HCds I2461 09 19 58.07 +37 11 26.9 4 0.96 1.44 SBG1 WS UZC CCA I2462 09 22 56.3 +22 41 07 1 WS I2463 09 23 00.260 +22 37 06.21 2 0.37 0.40 KHJ Pds I2464 09 23 22.2 +22 37 46 3 0.80 2.00 WS Pds2 UZC I2465 09 23 31.47 +24 26 46.2 1 HCds I2465 e comp 09 23 35.07 +24 26 47.8 1 HCds I2465 w comp 09 23 28.53 +24 27 06.0 1 HCds I2466 09 23 44.8 +24 31 03 3 1.57 1.73 WS HCds Pds I2466n 09 23 45.02 +24 31 06.6 2 0.10 0.42 HC2m HCdm I2466 sup * 09 23 44.77 +24 30 57.2 2 0.10 0.57 HC2m HCds I2467 09 24 52.716 +38 21 05.97 4 0.65 1.63 UZC KHJ SBG1 HCds I2468 09 25 01.61 +38 20 40.1 2 1.91 1.98 HCds Pds I2469 09 23 01.13 -32 27 00.1 3 3.82 0.72 ESOB HCds WS I2470 09 25 41.22 +23 21 43.4 1 HCds I2471 09 25 12.2 -06 49 48 3 0.00 1.73 APMn SPC WS I2472 09 26 33.6 +21 23 04 2 1.97 1.41 WS UZC I2473 09 27 23.534 +30 26 26.49 5 0.79 1.11 KHJ CCA UZC Pds BPP I2474 09 27 11.44 +23 02 02.3 2 0.10 1.27 GSC Pds I2475 09 27 54.313 +29 47 30.96 2 0.23 0.92 BPP KHJ I2476 09 27 52.90 +29 59 10.7 5 1.60 3.54 RC2 WS BPP CCA DC I2477:=I2480 09 28 17.831 +29 42 21.85 4 0.68 0.73 HCds KHJ BPP UZC I2478 09 28 00.929 +30 02 13.56 2 0.03 1.07 KHJ BPP I2479 09 28 04.1 +29 59 27 3 0.75 2.52 UZC BPP WS I2480=:I2477 09 28 17.831 +29 42 21.85 4 0.68 0.73 HCds KHJ BPP UZC I2481 09 27 28.7 +03 55 45 3 2.59 3.06 DC WS UZC I2482 09 26 59.247 -12 06 32.90 4 0.81 2.05 GSC KHJ SPC APMn I2483 09 29 25.7 +30 59 40 2 0.91 3.54 WS BPP I2484 09 26 50 -42 50.6 1o Sw11 I2485 09 27 11 -39 17.1 1o DS I2486 09 30 17.37 +26 38 30.3 5 1.67 3.70 MB WS UZC BPP CCA I2487 09 30 09.06 +20 05 23.8 6 0.83 2.13 CCA WS DC Pds UZC GH I2488 09 27 31 -56 58.9 3 50.23 90.07 BSV HCe ESOB I2489 09 31 11 -05 53.0 1o EEB I2490 09 33 03.62 +29 55 41.2 5 1.61 0.55 BPP MB UZC CCA WS I2491 09 35 14.226 +34 43 53.82 4 0.88 0.75 UZC SBG1 KHJ CCA I2492? 09 33 14.7 -37 51 59 2 1.68 2.83 ESOB WS I2493 09 36 17.514 +37 21 50.77 3 0.40 0.58 UZC KHJ SBG1 I2494=I0547=N2947 09 36 05.82 -12 26 14.4 4 0.22 2.65 SPC WS APMn HC2m I2495 09 38 07.4 +28 03 26 3 0.76 0.58 BPP UZC WS I2496 09 38 44.47 +34 43 34.9 4 0.00 1.16 WS K12 UZC SBG1 I2497 09 41 04.124 +34 43 58.38 2 0.58 0.15 KHJ GSC I2498 09 41 21.89 +28 06 51.5 3 0.70 0.29 BPP GSC UZC I2499 09 41 24.5 +27 53 42 1 WS I2500 09 42 23.30 +36 20 57.4 3 0.14 2.10 SBG1 WS UZC I2501 09 38 47.13 -60 05 28.6 4 2.84 3.14 ESOB UCA1 GSC DKM1 I2502 09 43 06.7 +33 03 37 1o J I2502?? 09 43 19.3 +33 08 29 1 WS I2503 09 43 09.6 +33 06 27 1o J I2503?? 09 43 10.2 +33 11 23 1 WS I2504 09 38 33 -69 05.1 1o DS I2505 09 45 06.939 +27 16 06.16 3 0.08 1.03 Pds BPP KHJ I2506 09 45 12.730 +27 15 07.47 3 0.48 1.14 BPP Pds KHJ I2507 09 44 34.0 -31 47 25 3 6.56 2.52 WS Pds ESOB I2508 09 47 07.091 +33 30 29.51 3 0.64 1.47 HCds KHJ SBG1 I2508 comp 09 47 00.85 +33 30 40.6 2 0.62 2.26 HCds SBG1 I2509 09 46 55.90 +05 42 09.8 1 HCds I2510 09 47 43.3 -32 50 16 2 3.57 1.41 ESOB WS I2511=I2512 09 49 24.28 -32 50 21.1 2 1.25 1.77 WS HCds I2512=I2511 09 49 24.28 -32 50 21.1 2 1.25 1.77 WS HCds I2513=I2514 09 50 00.62 -32 53 02.2 2 0.89 2.26 WS HCds I2514=I2513 09 50 00.62 -32 53 02.2 2 0.89 2.26 WS HCds I2515 09 54 39.47 +37 24 29.8 4 0.54 1.61 WS SBG1 CCA UZC I2516 09 54 48.373 +37 41 12.83 3 0.36 0.52 KHJ UZC SBG1 I2517 09 52 51.0 -33 44 35 2 3.54 4.95 WS ESOB I2518 09 55 58.531 +37 09 19.74 2 0.09 0.02 SBG1 KHJ I2519 09 55 58.84 +34 02 10.1 2 0.09 2.26 SBG1 WS I2520 09 56 20.27 +27 13 40.0 5 1.66 2.50 UZC WS BPP DC CCA I2521 09 57 15.816 +33 58 35.53 4 0.96 0.94 UZC K01 KHJ SBG1 I2522 09 55 09.0 -33 08 14 3 1.45 0.00 WS ESOB GHD2 I2523 09 55 09.7 -33 12 39 3 3.78 1.73 WS GHD2 ESOB I2524 09 57 32.921 +33 37 10.16 5 0.91 1.91 SDP K01 KHJ SBG1 UZC I2525 09 58 24.968 +37 06 06.20 2 0.08 0.96 KHJ SBG1 I2526 09 57 03.0 -32 15 22 2 1.80 4.95 WS ESOB I2527 10 00 06.568 +38 10 19.44 3 1.13 0.34 UZC KHJ SBG1 I2528=N3084 09 59 06.30 -27 07 42.8 4 2.35 0.96 WS Pds HCds ESOB I2529:=N3081 09 59 29.544 -22 49 33.92 6 0.52 1.85 WS HCds KHJ UW ESOB GHD2 I2530 10 01 31.084 +37 12 13.74 3 1.35 0.49 SBG1 KHJ UZC I2531 09 59 55.7 -29 37 00 2 0.00 7.07 ESOB WS I2532 10 00 05.2 -34 13 43 2 4.40 0.00 ESOB WS I2533 10 00 31.5 -31 14 41 2 0.00 3.54 ESOB WS I2534 10 01 30.0 -34 06 43 2 4.40 4.24 WS ESOB I2535 10 04 31.809 +38 00 21.38 4 0.49 0.49 UZC KHJ SBG1 K07 I2536 10 03 29.9 -33 57 02 2 1.76 0.71 ESOB WS I2537 10 03 52.12 -27 34 13.3 4 6.31 5.61 WS HCds GHD2 ESOB I2538 10 03 56.4 -34 48 27 2 4.37 0.71 ESOB WS I2539 10 04 16.5 -31 21 43 2 9.08 4.24 WS ESOB I2540 10 06 46.721 +31 28 32.29 4 0.55 0.41 UZC KHJ GSC BPP I2541 10 05 48.0 -17 26 05 3 0.83 2.52 APMn WS SPC I2542 10 07 50.58 +34 18 53.7 4 0.93 0.85 SBG1 WS K01 UZC I2543n 10 08 23.88 +37 50 37.6 3 0.72 1.44 WS HCds SBG1 I2543s 10 08 23.54 +37 50 27.5 3 0.20 2.79 WS HCds SBG1 I2544 10 08 29.59 +33 20 46.0 4 2.14 1.94 K01 SBG1 WS UZC I2545 10 06 36 -33 51.3 1o DS I2545? 10 06 35.06 -33 51 29.8 1 HCds I2545?? 10 06 04.82 -33 53 06.8 3 4.73 1.90 HCds WS ESOB I2546 10 07 05.5 -33 15 42 2 8.00 2.83 WS ESOB I2547 10 10 04.55 +36 30 08.7 2 0.00 0.92 WS SBG1 I2548 10 07 55.2 -35 13 48 2 5.21 0.00 WS ESOB I2549 10 10 10.139 +36 27 53.57 3 0.45 0.44 K01 KHJ SBG1 I2550 10 10 27.98 +27 57 21.5 5 1.53 2.88 BPP WS UZC CCA MB I2551 10 10 40.362 +24 24 51.17 5 0.79 1.39 UZC FPB KHJ MB CCA I2552 10 10 46.2 -34 50 41 3 1.23 1.00 WS Pds ESOB I2553 10 09 21.04 -62 36 46.2 4 2.94 3.37 ESOB UCA1 GSC DKM2 I2554 10 08 51 -67 01.7 1 ESOB I2554n=I2554B 10 08 51.54 -67 01 17.6 1 HCds I2554s=I2554A 10 08 50.53 -67 01 55.1 2 0.75 0.57 WS HCds I2555=N3157 10 11 42.53 -31 38 33.9 3 4.36 1.51 HCds WS ESOB I2556 10 12 37.6 -34 43 44 2 1.75 2.12 WS ESOB I2557 10 16 05.82 +38 06 31.5 3 0.85 3.91 SBG1 WS KEBA I2558 10 14 44.4 -34 20 17 2 0.00 4.24 ESOB WS I2559 10 14 45.4 -34 03 34 3 1.90 3.46 WS Pds ESOB I2560 10 16 18.9 -33 33 51 2 6.20 2.83 WS ESOB I2561 10 19 08.60 +34 40 28.0 4 1.05 1.96 WS UZC SBG1 CCA I2562 10 18 54.35 +16 09 18.0 3 0.83 2.56 WS UZC HCds I2562 comp 10 18 58.09 +16 09 30.1 1 HCds I2563 10 18 51.6 -32 35 50 2 4.48 2.12 ESOB WS I2564 10 21 27.708 +36 27 07.05 2 0.11 0.13 GSC KHJ I2565 10 21 17.89 +27 55 46.8 6 0.53 0.92 BPP GSC HCo Pds WS UZC I2566 10 22 19.422 +36 34 58.86 4 0.71 0.64 HCds UZC KHJ SBG1 I2567 10 21 57.76 +24 39 18.5 2 0.96 2.47 HCds WS I2568 10 22 30.05 +36 35 57.9 3 0.97 1.31 HCds SBG1 CCA I2569 10 22 53.569 +24 36 22.72 2 0.44 0.16 GSC KHJ I2570 10 21 34.2 -33 37 20 2 1.77 7.07 ESOB WS I2571=N3223 10 21 34.83 -34 15 59.9 3 2.38 2.51 RC2 WS HCds I2572 10 25 07.27 +28 05 39.5 4 0.88 2.40 WS BPP GSC CCA I2573 10 23 30.2 -35 27 21 2 0.00 4.24 ESOB WS I2574 10 28 21.99 +68 24 48.7 8 4.75 8.00 HCds GHD1 HCo HCrs WS DC CCA HC2m I2574 bar 10 28 23.16 +68 24 57.7 1 HCds I2575 10 25 24.2 -32 38 10 2 4.48 0.71 WS ESOB I2576 10 25 59.1 -32 54 09 2 4.47 6.36 WS ESOB I2577 10 28 01.46 +32 45 48.2 3 1.02 2.93 WS UZC SBG1 I2578 10 27 22.8 -33 52 40 2 2.65 4.24 WS ESOB I2579=N3251 10 29 16.75 +26 05 56.4 5 1.89 2.14 WS HCds DC UZC CCA I2580 10 28 18.2 -31 31 07 2 9.07 2.83 WS ESOB I2581 10 27 27 -57 37.3 2 17.16 21.21 BSV ESOB I2582 10 29 10.7 -30 20 38 2 3.67 3.54 ESOB WS I2583 10 31 10.5 +26 03 16 3 0.00 2.08 WS UZC KEBA I2584 10 29 51.6 -34 54 42 2 2.62 1.41 WS ESOB I2585=N3271 10 30 26.48 -35 21 34.4 3 0.71 3.50 WS HCds ESOB I2586 10 31 02.5 -28 43 05 2 4.66 3.54 WS ESOB I2587 10 30 59.8 -34 33 48 2 6.13 1.41 WS ESOB I2588 10 31 50.0 -30 23 06 2 1.83 4.24 ESOB WS I2589 10 32 20.6 -24 02 15 2 1.94 0.00 ESOB WS I2590 10 36 16.546 +26 57 44.32 4 0.42 1.35 CCA UZC BPP KHJ I2591 10 36 38.780 +35 03 09.42 6 2.64 0.60 K09 KHJ UZC SBG1 CCA DC I2592=N3366 10 35 08.26 -43 41 34.9 3 2.18 3.38 WS HCds ESOB I2593 10 36 15.897 -12 43 31.61 2 1.12 1.75 HCds KHJ I2593 comp 10 36 06.80 -12 43 10.1 1 HCds I2594 10 36 03.9 -24 19 21 3 0.79 1.53 ESOB Pds WS I2595 10 37 33 -11 07.0 1o Sw11 I2596 10 34 12.9 -73 14 25 2 4.65 0.71 WS ESOB I2597 10 37 47.32 -27 04 52.0 4 3.00 2.18 Pds HKA WS ESOB I2598 10 39 42.3 +26 43 38 3 1.34 1.53 WS UZC BPP I2599 10 37 27.099 -58 44 00.25 1 Ty2 I2600 10 46 38.68 +72 19 12.7 4 0.50 1.35 Pds2 Pds WS GSC I2601 10 47 13.261 +72 19 22.96 3 0.23 0.30 Pds2 GSC KHJ I2602 10 42 56 -64 23.7 2 4.63 0.00 BSV ESOB I2603 10 48 25 +32 55.6 1o Big I2604 10 49 25.12 +32 46 21.9 8 4.15 3.67 STMW HC WS CCA UZC SBG1 K09 GHD1 I2605 10 49 47.5 +32 58 23 1 HC I2606 10 50 17.61 +37 57 21.8 4 0.65 0.68 WS SBG1 UZC GSC I2607 10 50 18.87 +37 59 37.3 4 0.78 0.55 SBG1 WS UZC GSC I2608 10 50 15.42 +32 46 05.5 4 0.94 0.47 HC WS K09 SBG1 I2609=N3404 10 50 17.9 -12 06 31 4 3.06 1.41 WS GHD2 APMn SPC I2610 10 52 08.1 +33 04 59 1o Big I2611 10 52 38.93 +10 08 11.1 1 HCds I2612 10 53 37.037 +32 46 05.08 2 1.65 1.91 HC KHJ I2613=N3395 10 49 49.93 +32 58 52.4 10 3.64 4.01 DC HC SBG1 KEBA WS HCds Pds CCA UZC GHD1 I2614 11 01 33.84 +38 48 13.3 2 0.58 1.98 HCds WS I2614 comp or ** 11 01 33.21 +38 48 25.0 1 HCds I2615 11 02 02.278 +37 56 42.14 3 0.31 1.62 UZC KHJ SBG1 I2616 11 02 05.71 +38 47 12.9 2 0.91 2.26 WS SBG1 I2617 11 02 07.59 +38 39 50.8 2 0.00 2.19 WS SBG1 I2618 11 01 58.9 +27 47 22 2 1.87 2.12 HCds WS I2618 n* 11 01 58.84 +27 47 30.9 1 HCds I2618 s* 11 01 58.83 +27 47 11.6 1 HCds I2619 11 02 15.21 +37 57 56.8 2 0.17 0.99 SBG1 WS I2620 11 02 23.917 +38 30 18.72 5 1.02 0.91 SBG1 Pds CCA KHJ UZC I2621 11 00 19.95 -65 14 56.4 4 1.70 1.56 DKM2 UCA1 ESOB GSC I2622=N3508=:N3505 11 02 59.7 -16 17 19 3 0.00 2.65 APMn WS SPC I2623 11 03 50.874 -20 05 35.39 3 1.71 0.61 ESOB WS KHJ I2624=N3528=N3497 11 07 18.21 -19 28 19.3 4 2.05 1.83 WS HCds ESOB SPC I2625=N3529 11 07 19.27 -19 33 21.5 4 1.23 1.71 WS ESOB HCds SPC I2626 11 09 03.8 +26 54 14 2 0.00 0.71 WS BPP I2627 11 09 53.4 -23 43 36 3 1.59 1.15 ESOB GHD2 WS I2628 11 11 37.869 +12 07 18.07 4 0.01 1.23 Pds UZC UA10 KHJ I2629 11 12 36.92 +12 06 15.5 2 0.31 2.97 WS UA10 I2630 11 12 43.22 +12 19 09.2 1 UA10 I2631 11 09 51.65 -76 36 46.8 2 5.76 6.72 ESOB HCds I2632 11 13 05.931 +11 40 23.49 2 0.24 0.11 UA10 KHJ I2633 11 13 10.10 +11 36 03.2 2 1.04 0.49 UA10 WS I2634 11 13 28.22 +10 29 07.5 4 0.74 1.13 Pds WS UZC UA10 I2635 11 13 29.80 +11 27 48.8 2 0.21 1.77 WS UA10 I2636 11 13 34.039 +11 27 21.91 2 0.44 0.18 UA10 KHJ I2637 11 13 49.73 +09 35 10.6 7 1.33 1.12 WS FPB UA10 CCA GSC DC UZC I2638 11 13 51.92 +10 33 46.3 5 0.89 1.15 WS UA10 Pds UZC CCA I2639 11 13 55.531 +09 38 33.84 3 0.20 0.26 HCo UA10 KHJ I2640 11 14 05.51 +10 59 49.1 2 0.62 2.90 UA10 WS I2641 11 14 10.61 +09 23 56.3 2 0.63 1.91 UA10 WS I2642 11 14 15.92 +12 15 58.7 2 0.41 0.21 UA10 WS I2643 11 14 26.77 +10 07 34.3 2 0.83 0.85 UA10 WS I2644 11 14 29.77 +10 46 04.2 2 0.10 2.19 WS UA10 I2645 11 14 30.82 +11 53 10.7 2 0.41 1.56 UA10 WS I2646 11 14 37.57 +12 31 41.9 3 0.55 1.22 HCds WS UA10 I2647 11 14 38.60 +12 08 30.0 2 0.31 0.64 WS UA10 I2648 11 14 45.618 +10 13 29.00 2 0.15 0.28 UA10 KHJ I2649 11 14 46.439 +11 07 38.24 4 0.09 1.28 Pds UZC UA10 KHJ I2650 11 14 52.52 +13 51 07.5 2 2.47 0.28 WS UA10 I2651 11 14 52.24 +12 14 21.6 2 0.83 1.84 WS 2MSX I2652 11 14 52.292 +12 26 52.90 3 0.66 0.83 HCds KHJ UA10 I2652 comp 11 14 52.07 +12 26 42.9 1 HCds I2653 11 14 53.66 +10 32 52.7 2 3.54 1.98 WS UA10 I2654 11 15 02.79 +12 29 58.8 2 1.24 1.56 HCds UA10 I2654 comp 11 15 02.25 +12 30 10.1 1 HCds I2655 11 15 05.13 +12 09 51.0 3 0.61 1.65 HCds UA10 WS I2656 11 15 05.36 +12 22 43.9 3 1.23 2.62 HCds WS UA10 I2657 11 15 08.72 +13 41 39.4 2 0.41 1.77 UA10 WS I2658 11 15 08.83 +12 59 46.2 2 0.83 1.56 UA10 WS I2659 11 15 27.95 +12 53 13.5 2 1.45 2.40 UA10 WS I2660 11 15 28.40 +12 26 12.9 3 0.75 2.85 HCds WS UA10 I2661 11 15 29.35 +13 36 29.8 4 2.56 0.78 WS Pds UZC UA10 I2662 11 15 30.8 +12 46 15 1o MW7 I2663 11 15 32.49 +12 36 14.5 3 2.09 1.75 HCds UA10 WS I2664 11 15 38.9 +12 33 44 1 HCds I2664 e * 11 15 39.32 +12 33 42.3 3 2.50 0.47 WS HCds UA10 I2664 w * 11 15 38.43 +12 33 46.3 1 HCds I2665 11 15 40.80 +11 43 25.4 3 0.42 1.71 HCds WS SGsv I2666 11 15 43.80 +13 46 54.7 3 0.50 1.01 UA10 WS UZC I2667 11 15 44.01 +12 06 59.4 2 0.00 1.20 WS UA10 I2668 11 15 32.15 -14 10 17.7 4 0.15 1.62 APMn WS SPC GSC I2669 11 15 53.17 +13 25 45.4 2 1.03 1.34 WS UA10 I2670 11 15 59.53 +11 46 57.7 2 0.21 1.98 WS UA10 I2671 11 16 03.47 +13 07 26.2 2 1.44 1.20 UA10 WS I2672 11 16 03.80 +10 09 24.5 4 0.78 1.67 HCo HCds WS UA10 I2673 11 16 04.08 +10 09 43.8 6 1.69 1.66 SGsv HCds HCo WS UZC CCA I2673 se knot 11 16 03.39 +10 09 21.4 1 HCds I2673 sw knot 11 16 03.05 +10 09 25.7 1 HCds I2674 11 16 08.24 +11 02 53.3 5 1.83 1.26 HCo UA10 WS UZC CCA I2675 11 16 10.87 +12 14 56.1 2 1.04 1.34 UA10 WS I2676 11 16 18.51 +09 49 16.3 2 0.52 1.77 UA10 WS I2677 11 16 20.5 +12 12 53 1o MW7 I2677 nw gal 11 16 19.24 +12 12 57.0 2 0.72 2.69 WS HCds I2677 se * 11 16 20.08 +12 12 52.2 2 0.31 1.48 HCds UA10 I2678 11 16 21.62 +11 56 54.1 2 0.21 2.97 UA10 WS I2679 11 16 23.16 +12 00 53.6 2 0.31 2.19 WS UA10 I2680 11 16 25.56 +09 48 23.9 3 0.85 1.68 WS UA10 Pds I2681 11 16 33.2 +11 12 25 1o MW7 I2681?? 11 16 36.120 +11 12 02.34 7 1.17 2.52 GD KHJ GSC Pds UZC UA10 HCds I2682 11 16 36.2 +09 24 37 2 1.05 0.00 WS GSCm I2683 11 16 54.31 +12 05 55.9 2 0.73 1.84 UA10 WS I2684 11 17 01.06 +13 05 55.5 4 1.02 2.13 WS SGsv Pds HCds I2685 11 17 00.07 +10 05 38.5 1 UA10 I2686 11 17 02.55 +12 57 06.3 1 HCds I2686? 11 17 03.17 +12 56 52.6 2 1.24 3.04 HCds WS I2687 11 17 12.06 +10 09 27.6 2 0.31 1.77 UA10 WS I2688 11 17 18.0 +13 29 22 1 WS I2688 ne* 11 17 19.08 +13 29 27.0 1 UA10 I2689 11 17 19.62 +12 57 38.4 3 1.46 1.89 HCds SGsv WS I2690 11 17 21.59 +12 58 30.7 3 0.34 1.27 UA10 2MSX WS I2691 11 17 24.57 +12 01 51.5 1 UA10 I2692 11 17 33.204 +10 46 04.16 2 0.21 0.33 UA10 KHJ I2693 11 17 36.49 +13 32 56.0 2 0.93 1.41 UA10 WS I2694 11 17 38.62 +13 22 33.8 3 0.94 0.29 UA10 UZC Pds I2694e 11 17 39.4 +13 22 30 1 WS I2694w 11 17 38.5 +13 22 31 1 WS I2695 11 17 48.58 +13 43 38.2 2 0.41 1.98 WS UA10 I2696 11 17 49.28 +12 45 19.7 2 1.14 1.27 UA10 WS I2697 11 17 51.09 +13 24 00.1 2 0.21 0.42 WS UA10 I2698 11 17 51.18 +11 53 06.1 3 1.89 1.18 UA10 WS Pds I2699 11 17 52.64 +11 54 32.8 1 UA10 I2700 11 17 54.11 +12 03 12.6 2 0.83 2.69 WS UA10 I2701 11 17 56.91 +11 07 02.9 2 1.25 1.70 WS UA10 I2702 11 17 57.137 +09 24 44.70 3 0.93 0.35 HCo KHJ UA10 I2703 11 18 05.126 +17 38 58.72 3 0.74 1.68 Pds KHJ HC I2704 11 18 03.98 +12 27 13.0 4 1.38 1.60 WS UA10 Pds UZC I2705 11 18 03.66 +11 54 14.2 1 UA10 I2706 11 18 29.17 +12 32 54.0 1 UA10 I2707 11 18 30.83 +09 28 27.4 3 0.43 2.73 UA10 WS HCo I2708 11 18 34.594 +12 42 39.41 3 0.30 0.17 UZC KHJ UA10 I2709 11 18 40.8 +12 33 51 1o MW7 I2709 * 11 18 43.27 +12 33 57.4 1 HCds I2709 gal 11 18 41.95 +12 33 45.7 2 2.38 6.29 SGsv HCds I2710 11 18 44.20 +13 34 01.5 2 4.94 0.57 WS UA10 I2711 11 18 46.48 +13 44 18.4 1 UA10 I2712 11 18 52.0 +09 37 32 1 HCo I2712ne 11 18 52.615 +09 37 36.72 3 3.19 1.06 HCo UA10 KHJ I2712sw 11 18 51.6 +09 37 27 1 HCo I2713 11 19 10.214 +12 09 52.47 2 0.01 0.07 UA10 KHJ I2714 11 17 22 -62 43.3 2 49.06 21.21 BSV ESOB I2715 11 19 14.13 +11 57 07.3 2 0.62 2.33 HCds SGsv I2716 11 19 16.33 +11 41 53.4 2 0.52 1.13 WS UA10 I2717 11 19 18.71 +12 02 53.2 2 0.62 2.26 WS UA10 I2718 11 19 20.88 +12 01 19.0 3 0.34 0.75 Pds WS UA10 I2719 11 19 32.18 +12 03 33.7 3 0.15 2.04 WS UA10 2MSX I2720 11 19 35.609 +12 04 34.53 3 0.55 0.99 Pds UA10 KHJ I2721 11 19 42.8 +12 18 38 1 MW7 I2722 11 19 44.04 +13 57 49.2 2 0.93 0.14 HCm UA10 I2722w 11 19 43.86 +13 57 48.7 2 0.41 3.46 HCds WS I2722e 11 19 44.33 +13 57 48.1 1 HCds I2723 11 19 47.91 +12 01 57.9 2 0.73 2.40 UA10 WS I2724 11 19 48.419 +10 42 59.37 2 0.40 0.37 UA10 KHJ I2725 11 19 57.434 +13 25 44.91 2 0.06 0.14 KHJ UA10 I2726 11 19 58.4 +13 24 56 1o MW7 I2726: 11 19 58.47 +13 25 05.2 1 HCds I2727 11 20 00.04 +12 01 57.7 2 0.10 2.26 WS UA10 I2728 11 20 05.6 +13 25 28 1o MW7 I2728: 11 20 05.07 +13 25 36.3 2 0.72 1.84 WS UA10 I2729 11 20 07.3 +13 24 29 1o MW7 I2729: 11 20 06.75 +13 24 33.5 3 0.34 2.29 WS UA10 UA10 I2730 11 20 07.39 +12 21 58.5 2 0.31 0.78 UA10 WS I2731 11 20 10.27 +13 33 28.0 2 0.31 1.56 WS UA10 I2732 11 20 12.39 +12 24 12.8 2 0.41 1.27 UA10 WS I2733 11 20 24.5 +13 52 10 1o MW7 I2733: 11 20 17.3 +13 50 06 1 HCds I2733: n * 11 20 17.20 +13 50 14.6 1 HCds I2733: s * 11 20 17.32 +13 50 01.0 1 HCds I2733?? 11 20 29.0 +13 52 01 1 WS I2734 11 20 23.72 +12 26 34.5 3 1.52 2.14 SGsv HCds WS I2735 11 21 03.98 +34 20 38.6 6 2.64 2.40 WS SBG1 UZC KLS2 CCA MB I2736 11 20 54.74 +12 24 31.2 1 UA10 I2737 11 21 08.25 +14 17 35.5 1 UA10 I2738ne 11 21 23.77 +34 21 33.7 1 SBG1 I2738sw 11 21 23.045 +34 21 23.59 4 0.69 1.24 SBG1 Pds KHJ UZC I2739 11 21 12.42 +11 54 50.8 2 0.31 2.33 UA10 WS I2740 11 21 16.98 +08 45 06.1 3 0.34 2.69 WS UA10 HCds I2741 11 21 17.3 +09 09 18 1 HCm I2741 gal 11 21 17.48 +09 09 08.1 3 0.45 1.05 WS UA10 HCds I2741 * 11 21 17.20 +09 09 27.3 1 HCds I2742 11 21 18.66 +10 26 45.7 2 0.83 2.40 WS UA10 I2743 11 21 25.00 +08 41 35.9 2 0.21 1.70 UA10 HCds I2744 11 21 42.47 +34 21 45.6 4 0.88 1.12 HCds UZC SBG1 WS I2745 11 21 31.77 +13 25 35.6 3 0.76 0.64 WS UZC UA10 I2746 11 21 36.41 +11 44 12.9 1 UA10 I2747 11 21 40.2 +08 48 11 1 HCds I2747 nw * 11 21 39.87 +08 48 15.0 3 0.23 1.25 WS UA10 HCds I2747 se * 11 21 40.52 +08 48 07.1 2 0.31 0.71 HCds UA10 I2748 11 21 44.008 +08 48 17.47 3 0.30 0.45 HCds UA10 KHJ I2749 11 21 45.22 +08 34 26.3 3 1.13 2.31 UA10 WS Pds I2750 11 21 50.75 +09 39 28.6 2 0.42 1.41 WS UA10 I2751 11 22 07.30 +34 21 59.1 2 0.17 1.06 HCds SBG1 I2752 11 22 02.01 +14 07 26.6 2 0.82 1.56 UA10 WS I2753 11 21 59.67 +09 52 39.9 4 0.64 1.65 HCds WS UA10 SDSS I2754 11 22 02.40 +14 08 36.9 2 0.92 1.98 UA10 WS I2755 11 22 02.39 +13 47 33.7 2 0.21 1.63 WS UA10 I2756 11 22 00.95 +09 57 34.4 2 0.63 1.34 UA10 WS I2757 11 22 02.06 +08 23 36.3 4 0.00 1.03 Pds WS UZC UA10 I2758 11 22 03.314 +07 48 48.24 4 0.51 0.59 UA10 KHJ Pds UZC I2759 11 22 13.27 +24 19 01.8 5 1.70 1.13 HCds KEBA LEDA GSC HKA I2759 * 11 22 06.05 +24 20 10.3 1 HCds I2760 11 22 12.74 +12 39 55.2 1 UA10 I2761 11 22 17.10 +14 10 37.2 2 1.23 2.69 WS UA10 I2762 11 22 17.91 +12 43 20.5 3 0.59 2.02 UA10 WS UZC I2763 11 22 18.25 +13 03 53.2 6 2.01 1.03 MB MB CCA UZC GSC WS I2764 11 27 05.1 -28 58 47 2 3.72 5.66 WS ESOB I2765 11 22 23.1 +14 11 54 2 0.00 2.12 WS SGsv I2766 11 22 22.97 +12 54 11.8 2 0.00 0.71 WS UA10 I2767 11 22 23.46 +13 04 39.3 3 1.10 3.00 UA10 WS MB I2768 11 22 23.50 +12 31 42.4 2 0.31 1.63 WS UA10 I2769 11 22 25.667 +14 11 44.05 3 0.82 1.57 UA10 KHJ Pds I2770 11 22 24.737 +09 13 13.51 2 0.15 0.59 UA10 KHJ I2771 11 22 28.02 +12 31 07.9 2 0.72 1.06 WS UA10 I2772 11 22 30.38 +13 35 55.3 2 0.41 1.63 UA10 WS I2772 nearby gal 11 22 29.47 +13 35 57.8 1 UA10 I2773 11 22 36.4 +13 34 12 1o MW7 I2773? 11 22 35.36 +13 34 27.3 2 0.72 1.63 UA10 WS I2773?? 11 22 35.63 +13 34 12.3 1 UA10 I2774 11 22 37.16 +12 30 52.0 2 0.21 1.27 UA10 WS I2775 11 22 39.49 +12 30 41.7 2 0.52 0.85 WS UA10 I2776 11 22 39.99 +13 19 49.6 5 0.81 0.99 HCds UA10 WS UZC Pds I2777 11 22 40.55 +12 01 30.1 3 0.42 1.15 UA10 WS UZC I2778 11 22 41.88 +12 31 34.1 2 0.21 1.48 WS UA10 I2779 11 22 44.461 +13 20 43.67 3 0.80 0.66 HCds UA10 KHJ I2780 11 22 48.12 +10 08 57.4 3 0.60 1.31 WS UA10 HC2m I2780 nearby * 11 22 48.19 +10 09 07.0 3 0.23 0.97 WS HC2m UA10 I2781 11 22 50.709 +12 20 40.53 2 0.39 0.18 KHJ UA10 I2782 11 22 55.40 +13 26 28.6 6 0.97 1.83 Pds SGsv STMW WS UZC CCA I2783 11 22 53.593 +08 53 01.94 2 0.29 0.30 UA10 KHJ I2784 11 23 11.597 +13 07 03.07 2 0.26 0.43 UA10 KHJ I2785 11 23 15.377 +13 23 28.75 4 0.50 1.92 UA10 KHJ UZC Pds2 I2786 11 23 17.44 +13 23 30.7 1 UA10 I2787 11 23 19.07 +13 37 45.6 5 0.40 1.24 Pds WS UZC CCA UA10 I2788 11 23 26.95 +12 41 51.5 2 0.00 1.41 WS UA10 I2788 comp 11 23 26.7 +12 41 59 1 WS I2789 11 23 32.8 +14 11 11 2 4.11 3.54 HCm WS I2789 gal 11 23 32.60 +14 11 16.6 1 HC2m I2789 * 11 23 32.80 +14 11 11.7 2 0.51 0.35 HC2m UA10 I2790 11 23 34.01 +09 33 16.2 2 0.21 2.55 UA10 WS I2791 11 23 37.52 +12 53 44.4 2 0.83 0.07 WS UA10 I2792 11 23 41.49 +11 24 14.3 2 0.21 2.83 WS UA10 I2793 11 23 47.4 +09 26 59 1 HCm I2793s 11 23 47.54 +09 26 53.1 3 0.74 1.69 UA10 HCds WS I2793n 11 23 47.28 +09 27 03.5 3 0.23 1.97 HCds SDSS WS I2794 11 24 03.62 +12 47 26.7 2 0.31 0.99 UA10 WS I2795 11 24 04.057 +12 08 05.57 2 0.03 0.21 UA10 KHJ I2796 11 24 08.4 +09 20 38 1 HCm I2796n 11 24 08.32 +09 20 43.5 3 0.92 0.79 WS UA10 2MSX I2796s 11 24 08.39 +09 20 34.2 2 0.73 0.42 WS SDSS I2797 11 24 21.041 +11 42 20.68 2 0.39 0.06 UA10 KHJ I2798 11 24 23.9 +12 24 56 2 3.10 2.12 KKP WS I2799 11 24 26.630 +13 50 55.99 2 0.67 0.45 UA10 KHJ I2800 11 24 27.06 +12 12 30.5 2 1.35 1.06 WS UA10 I2801 11 24 29.01 +10 10 59.9 2 0.21 1.70 WS UA10 I2802 11 24 30.33 +12 12 30.2 2 0.83 0.71 WS UA10 I2803 11 24 35.33 +09 50 58.5 2 0.00 1.27 WS UA10 I2804 11 24 55.66 +13 13 19.2 4 0.07 0.50 UZC Pds WS UA10 I2805 11 24 59.89 +14 00 52.1 1 UA10 I2806 11 25 15.22 +09 39 08.4 2 1.25 0.35 WS UA10 I2807 11 25 17.04 +11 31 45.9 2 0.52 2.47 WS UA10 I2808 11 25 26.88 +09 07 55.9 2 0.21 0.99 HCds UA10 I2809 11 25 37.74 +08 31 34.1 1 UA10 I2810 11 25 44.96 +14 40 36.2 5 3.40 2.24 MB WS UZC UA10 CCA I2810 comp 11 25 49.5 +14 40 05 2 0.00 1.41 WS Pds2 I2811 11 25 44.64 +09 10 13.1 3 1.32 2.47 HCds UA10 WS I2812 11 25 55.84 +11 31 47.7 2 0.62 1.34 UA10 WS I2813 11 26 06.506 +11 15 20.17 2 0.06 0.08 KHJ UA10 I2814 11 26 08.54 +09 39 40.7 2 1.57 1.63 UA10 WS I2815 11 26 16.49 +12 48 11.8 2 0.10 1.84 WS UA10 I2816 11 26 18.26 +10 38 09.7 2 0.42 1.70 UA10 WS I2817 11 26 18.81 +09 08 55.9 2 0.00 0.64 WS UA10 I2818 11 26 26.869 +12 55 15.33 2 0.04 0.17 UA10 KHJ I2819 11 26 27.47 +13 50 38.6 3 1.38 1.31 UA10 Pds WS I2820 11 26 26.824 +10 14 17.99 2 0.02 0.16 UA10 KHJ I2821 11 26 34.86 +13 57 44.1 2 0.41 2.47 UA10 WS I2822 11 26 34.12 +11 26 22.5 5 2.50 1.45 UA10 WS CCA UZC MB I2823 11 26 44.59 +12 50 51.9 3 0.76 2.37 WS UZC UA10 I2824 11 27 04.81 +14 05 04.8 2 0.82 2.55 WS UA10 I2825 11 27 03.61 +08 26 39.1 2 0.10 1.41 HCds UA10 I2826 11 27 06.08 +13 14 18.0 3 0.67 1.00 UA10 WS UZC I2827 11 27 09.64 +11 30 51.1 1 UA10 I2828 11 27 11.12 +08 43 51.4 4 0.59 3.71 Pds2 UZC WS UA10 I2829 11 27 14.944 +10 19 19.89 4 0.69 0.15 Pds KHJ UA10 UZC I2830 11 27 21.64 +07 48 50.0 3 1.13 1.06 UA10 UZC WS I2831 11 27 22.71 +08 58 43.8 2 0.31 1.48 UA10 WS I2832 11 27 25.12 +13 59 20.4 2 0.10 2.26 UA10 WS I2833 11 27 26.07 +13 36 08.4 1 UA10 I2834 11 27 31.79 +13 34 09.4 2 1.03 3.82 UA10 WS I2835 11 27 31.575 +12 08 33.78 2 0.02 0.12 UA10 KHJ I2836 11 27 37.28 +09 05 05.6 2 1.26 0.00 UA10 WS I2837 11 27 41.90 +10 18 45.6 2 0.94 1.41 WS UA10 I2838 11 27 45.194 +14 00 39.56 2 0.51 0.69 UA10 KHJ I2839 11 27 45.48 +10 49 09.4 2 1.35 1.20 UA10 WS I2840 11 27 47.49 +13 25 31.6 1 UA10 I2841 11 27 48.84 +12 36 11.0 1 UA10 I2842 11 27 47.70 +09 39 05.5 2 0.63 1.48 UA10 WS I2843 11 27 58.09 +13 10 59.9 4 0.93 1.29 UA10 UZC Pds WS I2844 11 27 58.13 +11 27 10.1 2 0.10 1.06 UA10 WS I2845 11 28 00.452 +12 31 46.49 2 0.30 0.13 UA10 KHJ I2846 11 28 00.496 +11 09 28.82 3 0.24 0.41 UZC KHJ UA10 I2847 11 28 03.36 +13 55 45.7 2 0.31 3.32 UA10 WS I2848 11 28 13.64 +13 01 49.1 1 UA10 I2849 11 28 11.71 +09 05 37.1 2 0.21 1.20 UA10 WS I2850 11 28 12.97 +09 03 43.8 3 0.76 0.51 UZC UA10 WS I2851 11 28 14.55 +11 23 37.4 2 0.73 1.70 WS UA10 I2852 11 28 14.020 +09 48 01.37 2 0.07 0.08 UA10 KHJ I2853 11 28 14.85 +09 08 49.2 5 0.74 0.91 UA10 UZC WS CCA Pds I2854 11 28 19.83 +08 58 06.4 2 0.73 1.84 WS UA10 I2855 11 28 24.92 +09 41 14.2 2 0.21 1.63 WS UA10 I2856 11 28 16.22 -12 53 26.7 2 1.45 1.77 HCds WS I2856 comp 11 28 21.39 -12 54 53.5 1 HCds I2857 11 28 31.05 +09 06 14.3 5 0.87 1.97 WS UZC UA10 STMW CCA I2858 11 28 35.93 +13 39 39.6 3 0.69 1.46 UA10 2MSX WS I2859 11 28 41.76 +09 06 30.4 2 0.63 0.64 UA10 WS I2860 11 28 44.61 +14 02 28.3 2 0.72 1.98 UA10 WS I2861 11 28 58.968 +38 51 04.83 3 0.06 0.18 UZC KHJ SBG1 I2862 11 28 43.298 +10 07 37.65 2 0.48 0.33 UA10 KHJ I2863 11 28 53.92 +09 05 42.5 2 0.84 0.99 WS UA10 I2864 11 28 59.664 +12 22 02.76 2 0.19 0.13 UA10 KHJ I2865 11 28 59.72 +09 06 54.3 2 0.73 2.19 WS UA10 I2866 11 28 59.98 +09 02 30.6 2 0.21 1.27 WS UA10 I2867 11 29 00.47 +09 05 22.5 2 0.10 1.13 HCds Pds I2868 11 29 05.70 +09 05 39.8 1 UA10 I2869 11 29 08.67 +09 01 02.5 2 0.21 1.20 WS UA10 I2870 11 29 12.35 +11 51 51.9 2 0.31 0.35 WS UA10 I2871 11 29 20.65 +08 36 07.9 4 0.70 1.18 WS UA10 Pds UZC I2872 11 28 16 -62 59.0 1 HCe I2872 three lobes 11 28 22 -62 58.8 1 HCe I2873 11 29 27.6 +13 13 05 2 4.13 0.71 HCm Pds I2873n 11 29 27.57 +13 13 11.3 4 0.61 1.33 HCds WS UZC UA10 I2873s 11 29 27.44 +13 12 57.8 1 HCds I2874 11 29 27.44 +10 37 40.1 2 2.60 3.68 WS UA10 I2875 11 29 34.94 +12 59 23.6 2 0.41 0.99 HCds UA10 I2876 11 29 33.54 +09 00 56.9 2 0.00 2.19 WS UA10 I2877 11 29 37.69 +12 51 10.9 3 0.39 1.67 Pds HCds UA10 I2878 11 29 38.19 +09 58 01.4 2 0.00 1.41 WS UA10 I2879 11 29 44.23 +09 00 47.9 2 0.10 2.33 WS UA10 I2880 11 29 53.01 +13 11 55.8 1 HCds I2880? 11 29 52.5 +13 12 05 1 WS I2881 11 29 54.46 +12 30 39.0 2 0.83 1.13 UA10 WS I2882 11 30 09.47 +11 59 20.4 2 0.62 0.42 UA10 WS I2883 11 30 15.776 +10 54 38.60 2 0.06 0.01 UA10 KHJ I2884 11 27 41.63 -79 44 07.4 3 2.19 3.27 HCds ESOB WS I2885 11 30 22.57 +09 46 18.2 2 1.04 0.42 WS UA10 I2886 11 30 24.41 +11 33 44.8 2 0.10 0.14 WS UA10 I2887=N3705A 11 30 29.59 +09 23 17.2 5 1.30 2.71 WS GD UA10 HCo UZC I2888 11 30 35.08 +09 54 29.9 2 0.94 0.21 WS UA10 I2889 11 30 29.0 -13 05 30 3 1.69 1.00 APMn WS SPC I2890 11 30 46.06 +13 10 55.3 2 0.31 0.78 WS UA10 I2891 11 30 48.08 +12 40 37.8 2 0.31 1.63 WS UA10 I2892 11 30 48.99 +10 35 16.3 2 0.83 2.26 UA10 WS I2893 11 30 53.31 +13 23 26.2 3 0.93 1.32 WS HCm UA10 I2893n 11 30 53.15 +13 23 29.7 2 0.62 1.41 HCds WS I2893s 11 30 53.36 +13 23 22.7 2 0.41 1.48 HCds WS I2894 11 30 57.47 +13 14 05.2 3 0.51 1.48 WS Pds UA10 I2895 11 30 57.31 +09 58 36.5 2 0.31 0.07 UA10 WS I2896 11 31 13.402 +12 20 59.60 2 0.39 0.35 UA10 KHJ I2897 11 31 19.43 +11 32 55.6 2 0.42 1.77 UA10 WS I2898 11 31 20.42 +13 20 07.5 2 0.31 2.97 UA10 WS I2899 11 31 20.39 +10 38 04.4 2 0.42 1.48 UA10 WS I2900 11 31 29.666 +13 10 02.00 2 0.60 0.01 UA10 KHJ I2901 11 31 32.127 +12 41 58.90 2 0.53 0.11 UA10 KHJ I2902 11 31 33.22 +14 13 21.1 2 0.92 0.28 UA10 WS I2903 11 31 40.75 +12 38 30.8 2 1.24 2.33 UA10 WS I2904 11 31 42.43 +13 11 02.3 2 1.34 0.21 UA10 WS I2905 11 31 47.12 +09 06 23.3 1 HCds I2906 11 31 49.70 +13 07 56.3 2 1.65 3.04 UA10 WS I2907 11 31 48.86 +09 53 56.0 2 2.30 2.76 UA10 WS I2908 11 31 50.55 +12 56 15.2 2 1.96 1.56 UA10 WS I2909 11 31 50.90 +11 28 11.2 2 0.31 1.56 UA10 WS I2910 11 31 54.714 -09 43 31.47 3 1.48 0.52 SPC KHJ Pds I2911 11 32 05.3 +12 58 38 1 WS I2911 w * 11 32 04.63 +12 58 38.5 1 UA10 I2912 11 32 07.01 +11 42 35.8 2 1.97 1.56 UA10 HCds I2913 11 31 51.0 -30 24 36 2 4.59 3.54 ESOB WS I2914 11 32 12.48 +13 29 30.6 3 1.54 1.57 WS UA10 UZC I2915 11 32 15.60 +14 29 01.2 2 3.18 0.92 UA10 WS I2916 11 32 16.14 +11 41 00.6 2 0.42 1.06 WS UA10 I2917 11 32 19.37 +10 56 43.0 2 0.73 0.28 UA10 WS I2918 11 32 26.19 +13 14 54.9 1 UA10 I2919 11 32 34.98 +14 11 23.6 3 0.08 1.03 UA10 WS K05 I2919 comp 11 32 35.4 +14 11 29 1 WS I2920 11 32 48.93 +12 33 25.5 2 1.76 1.34 UA10 WS I2921 11 32 49.272 +10 17 46.70 2 0.14 0.05 KHJ UA10 I2922 11 32 51.29 +12 55 19.8 2 0.41 1.84 WS UA10 I2923 11 32 53.62 +13 09 48.8 2 1.75 1.77 UA10 WS I2924 11 32 52.25 +09 01 24.0 3 0.85 0.92 HCo WS UA10 I2925 11 33 13.263 +34 15 54.48 2 0.48 0.29 KHJ SBG1 I2926 11 33 04.38 +12 26 10.5 2 6.31 0.14 UA10 WS I2927 11 33 04.84 +13 05 06.8 2 0.83 3.32 UA10 WS I2928 11 33 29.93 +34 18 57.8 4 0.65 1.17 SBG1 WS CCA UZC I2929 11 33 31.43 +12 08 11.5 2 0.31 3.25 WS UA10 I2930 11 33 44.12 +10 05 17.4 2 0.42 1.98 WS UA10 I2931 11 33 50.61 +12 27 58.9 2 0.52 2.69 UA10 WS I2932 11 33 53.58 +10 32 36.1 2 2.60 0.14 WS HCds I2933 11 34 12.76 +34 18 45.4 3 0.07 0.45 SBG1 UZC CCA I2934 11 34 19.66 +13 19 15.9 4 1.21 1.98 UA10 WS Pds UZC I2935 11 34 48.34 +10 14 58.7 1 HCds I2936 11 34 56.91 +13 00 29.3 2 0.83 1.20 UA10 WS I2937 11 35 03.43 +10 06 11.9 2 0.21 0.78 UA10 WS I2938 11 35 36.35 +13 40 47.3 4 1.41 2.01 WS UZC UA10 Pds I2938 comp s 11 35 36.8 +13 40 26 1 WS I2938 comp w 11 35 35.4 +13 40 48 1 WS I2939 11 35 37.93 +10 41 47.9 2 0.94 2.62 WS UA10 I2940 11 36 02 +21 57.7 1o Big I2941 11 36 09.97 +10 03 19.8 3 0.00 1.01 WS UZC UA10 I2942 11 36 12.08 +11 48 54.9 2 1.66 2.97 WS UA10 I2943 11 36 42.4 +54 50 46 4 3.05 3.16 K01 WS GHD1 SDP I2944 11 35 47.29 -63 01 10.9 1 AC22 I2945 11 37 04.319 +12 55 34.68 4 0.45 0.35 UZC KHJ UA10 CCA I2946 11 37 29.615 +32 15 08.38 3 1.15 0.44 SBG1 UZC KHJ I2947 11 37 31.0 +31 21 41 4 1.28 2.22 K15 WS UZC BPP I2948 11 39 05 -63 26.6 1 HCe I2949: 11 40 54.4 -46 27 16 1 HCds I2949: e * 11 40 54.77 -46 27 18.3 1 HCds I2949: w * 11 40 53.95 -46 27 15.4 1 HCds I2950 11 41 37.876 +37 59 31.61 4 0.62 0.11 SBG1 UZC KHJ K07 I2951 11 43 24.55 +19 44 58.0 3 1.55 1.01 WS UZC CCA I2952 11 44 17.24 +33 21 04.8 6 3.12 2.02 K03 WS KEBA GSC SBG1 MW8 I2953=:N3855 11 44 25.90 +33 21 19.1 6 1.96 1.81 UZC WS GSC SBG1 CCA MW8 I2954 11 45 03.3 +26 47 11 1 HCo I2955 11 45 03.86 +19 37 13.3 5 1.03 1.33 UZC KEBA PCR GSC SPC I2956 11 45 17.60 +26 46 00.7 3 0.28 2.96 CCA GSC WS I2957 11 45 36.98 +31 17 58.3 1 GSC I2958 11 45 42.35 +33 09 14.1 2 0.18 2.62 WS GSC I2959=N3871 11 46 10.17 +33 06 31.6 4 0.75 0.57 SBG1 WS GSC UZC I2960 11 46 19.69 +35 00 12.5 2 0.61 0.57 SBG1 WS I2961 11 47 49.567 +31 20 41.81 5 0.93 0.50 K15 FPB UZC KHJ BPP I2962 11 49 05 -12 18.7 1o Sw11 I2963=N3915?? 11 49 24.6 -05 07 07 3 1.49 1.53 APMn WS SPC I2964 11 49 52 +12 03.0 1o Bige I2965=N3957 11 54 01.5 -19 34 09 4 4.40 3.30 ESOB WS SPC GHD2 I2966 11 50 13.1 -64 52 16 2 1.82 1.41 ESOB HCds I2967 11 50 55.09 +30 51 02.8 5 0.86 0.73 JG UZC BPP GSC WS I2968 11 52 30.570 +20 37 31.06 3 0.65 0.39 GSC KHJ UZC I2969 11 52 31.21 -03 52 22.7 4 1.40 2.13 APMn WS GSC SPC I2970 11 53 09 -23 07.4 1o Sw11 I2970? 11 53 00.8 -23 07 44 1 HCds I2971 11 53 27.582 +30 41 47.99 2 0.62 0.66 KHJ BPP I2972=N3952 11 53 40.5 -03 59 47 5 4.04 2.51 WS SPC Pds GHD2 APMn I2973 11 53 50.76 +33 21 55.2 7 1.24 0.96 DC WS K03 UZC SBG1 K13 CCA I2974=:I2975 11 53 48.67 -05 10 05.4 3 1.49 2.46 HCds WS SPC I2975:=I2974 11 53 48.67 -05 10 05.4 3 1.49 2.46 HCds WS SPC I2976=N3979 11 56 01.09 -02 43 14.5 7 3.14 2.82 ZGT GSC UZC WS GGH SPC DC I2977 11 55 14.5 -37 41 44 2 0.84 3.54 ESOB WS I2978 11 56 23.14 +32 02 19.3 5 0.94 1.96 WS CCA K06 BPP K15 I2979 11 56 54.26 +32 09 31.5 6 1.43 2.28 WS BPP HCds GSC CCA DC I2980 11 57 30.1 -73 41 05 3 0.90 2.08 WS ESOB Pds I2981 11 55 42.54 +32 11 21.6 7 1.00 1.50 K15 K06 VPS HCds K13 GSC BPP I2982=N4004B 11 57 51.35 +27 52 06.9 5 0.96 1.69 HCds WS BPP UZC JG I2983 11 58 16 -02 06.6 1o Big I2984 11 59 07.3 +30 41 49 3 2.23 1.73 K06 WS BPP I2985 11 59 12.67 +30 43 52.3 5 1.45 1.79 WS K06 CCA UZC BPP I2986 11 59 49.597 +30 50 40.03 5 1.10 0.56 JG GSC KHJ UZC BPP I2987 12 03 24.60 +38 48 47.0 5 2.34 1.20 UZC SBG1 WS K06 SDP I2988 12 03 42.19 +03 25 46.3 1 HCds I2989=N4139 12 04 33.96 +01 48 04.3 6 1.82 1.14 ZGT GGH WS SPC UZC GSC I2990 12 04 38.57 +11 02 59.1 5 1.05 1.05 WS Pds UZC YOF GSC I2991 12 05 12.62 +10 38 24.2 4 1.37 2.23 WS HCds Pds HCo I2992 12 05 15.91 +30 51 19.8 1 GSC I2993 12 05 38.38 +32 49 20.2 1 GSC I2994 12 05 27.8 +12 42 10 3 0.84 4.04 Pds WS GD I2995 12 05 46.8 -27 56 26 3 4.27 4.04 ESOB GHD2 WS I2996 12 05 48.5 -29 58 22 2 0.00 2.83 ESOB WS I2997 12 05 44.5 +20 16 51 1o Big I2997? 12 05 43.59 +20 17 03.5 1 HCds I2998.1 12 05 55 +20 45.2 1o Bige I2998.2 12 06 05 +20 37.6 1o Bige I2999 12 05 57.6 +31 20 53 3 1.47 2.08 WS BPP K06 I3000 12 06 08 -29 40.4 1o DS I3001 12 06 16.73 +33 31 31.5 2 0.79 0.42 WS SBG2 I3002 12 07 04.19 +33 22 56.7 2 0.88 3.39 HCds WS I3003 12 07 32.589 +32 48 46.08 4 0.36 0.71 SBG2 UZC KHJ GSC I3004 12 07 10.27 +13 14 51.7 4 0.71 3.42 WS Pds HCds GD I3004 comp 12 07 07.62 +13 15 31.3 1 HCds I3005 12 07 14.0 -30 01 29 2 5.53 7.78 ESOB WS I3006?? 12 07 22.87 +13 00 14.1 2 1.45 2.76 HCds WS I3007 12 07 30.821 +31 20 52.82 3 0.49 0.50 KHJ UZC BPP I3008 12 07 51.8 +13 34 38 4 2.52 0.82 UZC Pds WS GD I3009 12 08 00.1 +12 38 47 1o Sn I3010 12 07 57.1 -30 20 23 2 3.67 0.00 ESOB WS I3011=N4124=:N4119 12 08 09.56 +10 22 43.3 5 3.73 1.87 DC WS GH UZC CCA I3012 12 08 23.915 +11 10 34.54 4 0.75 0.94 GD Pds UZC KHJ I3013 12 08 25.5 +10 00 59 4 1.48 2.36 GD Pds WS UZC I3014 12 08 36.98 +38 49 53.7 6 0.62 1.01 WS DC SBG1 K06 UZC CCA I3015 12 09 00.6 -31 31 11 2 9.07 0.00 ESOB WS I3016 12 09 18.4 +11 25 46 2 2.08 2.83 VCC WS I3017 12 09 22.74 +13 37 06.5 1 HCds I3018 12 09 24.74 +13 34 28.4 5 4.56 2.30 VCC K09 UZC WS HCds I3019 12 09 22.25 +13 59 31.6 4 0.91 1.89 VCC WS UZC CCA I3020 12 09 27.331 +14 13 27.74 2 2.44 0.34 KHJ GD I3021 12 09 54.47 +13 03 00.2 6 2.46 3.00 VCC WS UZC YOF CCA STMW I3022 12 10 02.31 +38 44 23.8 3 0.27 0.17 UZC WS SBG1 I3023 12 10 01.90 +14 21 55.9 3 0.00 4.59 STMW WS CCA I3024 12 10 11.78 +12 19 30.4 5 4.98 3.54 VCC UZC YOF WS CCA I3025 12 10 22.8 +10 11 17 3 6.43 1.15 VCC WS UZC I3026 12 10 34 -29 55.4 1o DS I3027 12 10 30 +14 11.6 1o Fr I3028 12 10 35.724 +11 45 41.11 2 1.22 3.61 KHJ GD I3029 12 10 41.89 +13 19 51.7 7 1.52 1.70 WS UZC YOF YZYH CCA HCds VCC I3030 12 11 06 +14 08.6 1o Fr I3031 12 11 04.3 +13 18 30 2 3.09 4.95 WS GD I3032 12 11 07.5 +14 16 27 3 6.71 2.31 VCC UZC WS I3033 12 11 09.95 +13 35 14.7 6 1.29 1.65 STMW UZC WS CCA YOF VCC I3034 12 11 47.9 +14 12 00 2 5.13 2.83 WS GD I3035=N4165 12 12 11.80 +13 14 47.2 7 1.37 1.65 K09 WS UZC GSC CCA YOF GH I3036 12 12 15.09 +12 29 16.3 7 0.72 1.83 VCC STMW CCA YOF Pds WS UZC I3037 12 12 20.4 +09 59 08 3 1.70 2.65 HCo WS UZC I3038 12 12 32.3 +11 21 08 2 5.19 1.41 VCC WS I3039 12 12 32.43 +12 18 34.3 5 3.40 2.47 VCC K09 YOF UZC WS I3040 12 12 34.39 +11 04 28.8 3 3.58 4.13 VCC WS YOF I3041 12 12 42.65 +12 45 46.0 2 0.83 2.69 HCds WS I3042=N4178 12 12 46.40 +10 51 56.8 6 2.62 7.39 WS DC YOF UZC CCA GH I3043 12 12 47.4 +10 00 36 2 2.09 2.83 HCo GD I3044 12 12 48.44 +13 58 33.3 6 1.16 1.75 K09 WS GH YOF UZC CCA I3045 12 12 59.7 +12 46 46 1o Sn I3046 12 13 08.06 +12 55 05.5 5 7.43 1.20 WS UZC YOF CCA VCC I3047 12 13 14.8 +12 59 50 2 3.10 4.24 WS GD I3048 12 13 21.44 +13 04 08.5 1 HCds I3048 nearby * 12 13 23.08 +13 04 13.8 1 HCds I3049 12 13 32 +14 28.8 1 VCC I3049m 12 13 33.24 +14 28 55.1 2 0.41 0.35 WS HCds I3049 knot 12 13 33.03 +14 28 59.9 1 HCds I3049se 12 13 34.12 +14 28 42.5 2 0.00 0.28 WS HCds I3050=N4189 12 13 47.25 +13 25 30.6 7 3.65 3.61 DC WS K09 GH CCA YOF UZC I3051=N4193 12 13 53.59 +13 10 21.9 6 2.07 2.95 WS DC UZC CCA YOF GH I3052 12 13 48.5 +12 41 23 2 3.10 2.12 WS GD I3053 12 13 51.9 +14 13 18 2 2.05 0.71 VCC WS I3054 12 14 14.46 +13 32 31.7 2 1.65 3.18 HCds WS I3055 12 14 22.36 +12 05 29.2 1 HCds I3055e 12 14 22.71 +12 05 29.1 3 2.96 1.53 WS HCds GD I3055nw 12 14 22.15 +12 05 30.6 1 HCds I3055sw 12 14 21.91 +12 05 26.8 1 HCds I3056 12 14 37.59 +12 48 47.1 5 4.26 1.74 HCds YOF CCA LEDA FT I3057 12 15 02 -44 28.4 1o DS I3057? 12 15 36.58 -44 27 14.2 2 3.73 5.23 HCds ESOL I3058 12 14 47.7 +14 05 39 2 7.19 2.12 WS GD I3059 12 14 55.31 +13 27 35.7 6 5.50 2.83 UZC YOF WS CCA FT STMW I3060 12 15 02.063 +12 32 49.04 2 0.21 0.56 UZC KHJ I3061 12 15 04.38 +14 01 43.8 9 4.25 2.49 VCC GH WS YOF GSC CCA UZC YZYH K09 I3062 12 15 05.21 +13 35 39.9 3 1.77 2.00 WS UZC YOF I3063 12 15 06.78 +12 00 58.7 4 1.14 2.37 YOF WS UZC CCA I3064=N4206 12 15 16.75 +13 01 26.3 7 2.41 3.36 DC HCds WS UZC YOF CCA GH I3065 12 15 12.56 +14 25 58.8 3 0.77 0.23 WS GSC UZC I3066 12 15 16.25 +13 28 26.0 5 1.19 2.00 WS UZC K09 YOF CCA I3067=I0772 12 15 15.910 +23 57 29.30 4 0.92 1.01 HCds KHJ UZC JG I3068 12 15 23.4 +11 30 38 2 4.15 0.71 WS GD I3069 12 15 19.78 +10 09 38.2 2 0.73 2.12 HCds WS I3070 12 15 24.63 +13 02 21.3 2 0.83 2.26 WS HCds I3071 12 15 31.71 +09 32 45.3 1 HCds I3072 12 15 38.10 +09 33 23.5 1 HCds I3073 12 15 35.76 +13 37 09.3 2 0.62 0.64 WS CCA I3074 12 15 46.17 +10 41 53.8 4 1.64 3.78 WS UZC YOF CCA I3075 12 15 55.048 +23 35 43.87 3 0.72 0.05 JG UZC KHJ I3076 12 16 03.95 +09 04 47.5 1 HCds I3077 12 15 56.33 +14 25 58.2 5 3.49 2.62 WS UZC CCA HCo VCC I3078 12 16 00.003 +12 41 14.02 7 1.57 0.26 VCC UZC HCds KHJ FPB K09 YZYH I3079 12 16 04.0 +11 32 03 3 2.24 2.00 VCC UZC WS I3080 12 16 02.656 +14 11 21.19 3 0.04 1.09 VCC UZC KHJ I3081 12 16 08.91 +12 41 26.8 3 1.83 1.50 VCC WS HCds I3082 12 16 12.11 +23 50 29.7 2 0.19 2.40 GSC WS I3083: 12 16 21.19 +12 31 38.1 2 0.52 4.31 WS HCds I3084 12 16 23.489 +23 55 03.51 3 0.51 0.77 KHJ Pds2 JG I3085 12 16 25.98 +09 28 09.5 2 0.52 0.71 HCds WS I3086 12 16 27.8 +09 00 31 2 1.05 2.12 HCds WS I3086 sw * 12 16 27.57 +09 00 31.4 1 HCds I3086 ne * 12 16 27.87 +09 00 35.2 1 HCds I3087 12 16 26.5 +13 17 16 1 HCds I3087 sw * 12 16 26.12 +13 17 01.6 1 HCds I3087 ne * 12 16 26.85 +13 17 30.8 1 HCds I3088 12 16 28.39 +09 27 35.1 1 HCds I3089 12 16 29.738 +23 49 39.21 3 1.34 0.97 Pds2 KHJ JG I3090 12 16 31.6 +09 26 22 1 HCds I3090 nw * 12 16 30.93 +09 26 30.7 1 HCds I3090 se * 12 16 32.21 +09 26 11.5 1 HCds I3091 12 16 29.2 +14 00 43 2 0.00 1.41 WS UZC I3092 12 16 32.4 +10 02 46 2 4.17 3.54 WS JA I3093 12 16 42.30 +14 16 39.3 5 1.38 0.35 K09 WS YOF GSC UZC I3094 12 16 56.02 +13 37 31.0 5 0.62 1.48 WS CCA YOF UZC YZYH I3095 12 16 55.36 +23 57 30.6 2 0.77 6.15 WS JG I3096 12 16 52.4 +14 30 54 3 2.22 2.00 WS UZC VCC I3097 12 17 01.0 +09 24 27 3 0.85 4.04 VCC WS UZC I3098=N4235 12 17 09.838 +07 11 27.66 8 1.23 1.71 WS GH GGH UZC YOF UW EDC CCA I3099 12 17 09.37 +12 27 12.4 6 2.59 1.68 YOF GSC WS UZC CCA VCC I3100 12 17 05.41 +12 17 20.6 4 0.69 1.18 WS GSC UZC CCA I3101 12 17 19.51 +11 56 35.3 2 1.04 2.90 WS HCds I3102=N4223 12 17 25.85 +06 41 23.5 6 1.37 2.14 GGH YOF WS CCA HCds GH I3103 12 17 28.28 +09 21 37.3 2 0.31 2.76 WS HCds I3104 12 18 45.68 -79 43 35.5 5 1.24 4.69 HCe GSC HCds HCds ESOB I3105 12 17 33.59 +12 23 13.7 6 1.01 5.43 WS YOF CCA HCo STMW VCC I3105 knot 12 17 34.7 +12 23 43 2 2.07 0.71 K09 HCo I3106 12 17 45.81 +09 36 48.9 1 HCds I3106?? 12 17 49.14 +09 37 19.8 4 0.69 1.66 HCds WS 2MSX SDSS I3107 12 17 46.96 +10 50 40.2 7 1.06 1.73 VCC UZC YZYH YOF CCA WS DC I3108 12 17 42.69 +13 22 46.4 3 1.52 2.65 WS HCds JA I3109 12 17 44.04 +13 10 14.3 2 0.41 1.20 WS GSC I3110 12 17 44.798 +37 23 59.46 2 0.91 1.02 HCds KHJ I3111 12 17 50.875 +08 25 49.51 4 1.51 0.67 KHJ UZC YZYH VCC I3112 12 17 48.42 +26 01 48.8 4 1.88 0.48 WS Pds UZC JG I3113=N4246 12 17 58.16 +07 11 08.2 7 1.89 2.19 GGH YOF WS DC UZC CCA GH I3114 12 17 56.68 +09 08 08.2 1 HCds I3115=N4241 12 17 59.74 +06 39 13.3 9 3.53 2.15 VCC DC HCds CCA GGH WS UZC GH YOF I3116 12 17 57.2 +25 04 31 1 WS I3117 12 18 04.7 +09 04 35 1 HCds I3117 s * 12 18 04.31 +09 04 23.8 1 HCds I3117 n * 12 18 05.13 +09 04 45.3 2 0.63 2.55 HCds WS I3118 12 18 11.11 +09 29 59.8 6 1.99 2.04 VCC UZC WS Pds CCA STMW I3119 12 18 08.467 +24 41 17.57 2 0.28 0.05 KHJ UZC I3120 12 18 15.5 +13 44 49 2 4.12 3.54 WS GD I3121 12 18 17.4 +13 15 27 1 HCds I3121 nw 12 18 17.24 +13 15 29.9 1 HCds I3121 se 12 18 17.55 +13 15 24.8 1 HCds I3122 12 18 21.46 +25 13 00.5 4 1.28 0.75 WS UZC CCA JG I3123 12 18 27.67 +08 03 50.2 2 1.47 2.19 HCds WS I3124 12 18 27.40 +09 35 18.4 2 0.10 2.47 WS HCds I3125 12 18 25.46 +24 21 56.1 1 HCds I3126 12 18 37.18 +13 48 49.7 3 2.81 3.61 HCds WS JA I3127 12 18 34.9 +11 52 12 2 5.18 3.54 VCC WS I3128 12 18 41.9 +11 43 50 2 5.19 0.00 VCC HCds I3128m 12 18 41.8 +11 43 52 2 1.04 2.83 UZC WS I3128nw 12 18 41.63 +11 44 01.3 1 HCds I3128m 12 18 41.88 +11 43 56.3 1 HCds I3128se 12 18 43.18 +11 43 34.5 1 HCds I3128 comp 12 18 38.52 +11 44 08.0 1 HCds I3129 12 18 44.74 +09 35 30.1 2 0.94 1.98 HCds WS I3130 12 18 49.6 +08 13 59 2 1.05 0.71 WS HCds I3130 n * 12 18 49.19 +08 14 17.0 1 HCds I3130 s * 12 18 50.07 +08 13 43.4 1 HCds I3130 nearby n * 12 18 49.80 +08 14 32.7 1 HCds I3130 nearby s * 12 18 50.19 +08 13 21.1 1 HCds I3131 12 18 50.7 +07 51 43 1o Sn I3131=I3132 12 18 50.92 +07 51 40.5 5 1.90 1.67 HCds WS GGH VCC UZC I3132 12 18 51.3 +07 51 43 1o Sn I3132=I3131 12 18 50.92 +07 51 40.5 5 1.90 1.67 HCds WS GGH VCC UZC I3133 12 18 54.6 +07 38 22 1 HCds I3133 w * 12 18 53.94 +07 38 27.8 1 HCds I3133 s * 12 18 54.61 +07 38 05.1 1 HCds I3133 e * 12 18 55.01 +07 38 34.2 1 HCds I3134 12 18 56.076 +08 57 42.76 4 1.44 1.49 VCC KHJ UZC YOF I3135 12 18 52.4 +27 29 37 1o MW4 I3135nw 12 18 52.93 +27 29 30.8 2 0.75 2.69 WS HCds I3135se 12 18 53.05 +27 29 29.8 1 HCds I3136 12 18 57.28 +06 11 02.9 5 0.81 2.39 WS UZC YOF CCA GGH I3137 12 18 54.62 +12 28 10.3 3 0.25 2.34 WS JA HCds I3138n 12 18 56.20 +12 26 44.1 3 1.48 3.51 WS HCds JA I3138s 12 18 56.22 +12 26 31.2 2 0.31 1.98 WS HCds I3139 12 19 00.68 +09 07 37.2 2 0.73 1.91 HCds WS I3140 12 18 57.81 +27 07 47.3 1 HCds I3141 12 18 58.5 +24 11 08 1 WS I3142 12 19 05.05 +13 58 50.2 5 1.49 1.47 HCds UZC WS VPC K09 I3142 comp 12 19 01.84 +13 58 56.0 1 HCds I3143 12 19 05.3 +27 17 52 3 0.77 1.15 K03 WS BPP I3144 12 19 09.757 +25 17 49.09 1 KHJ I3145 12 19 10.58 +24 17 36.8 2 0.00 3.96 WS HCds I3146 12 19 12.4 +25 42 50 1 WS I3147 12 19 17.9 +12 01 01 1o Sn I3147: 12 19 17.152 +12 00 58.32 4 0.73 1.24 VPC KHJ HCds IPds I3147 comp 12 19 18.66 +12 01 05.6 3 0.96 1.56 IPds HCds WS I3148 12 19 21.76 +07 52 12.9 5 2.25 2.52 WS GGH UZC YOF VCC I3149 12 19 24.0 +12 18 02 3 4.71 0.00 VCC VPC WS I3150 12 19 28.715 +07 47 52.49 4 3.30 1.13 KHJ GGH UZC VCC I3151 12 19 32.904 +09 24 53.38 3 0.79 3.15 VCC KHJ UZC I3152 12 19 36.1 -26 08 43 2 4.80 2.12 WS ESOB I3153 12 19 36.969 +05 23 51.99 4 2.82 0.82 GGH KHJ UZC VCC I3154 12 19 33.982 +25 35 09.06 1 KHJ I3155 12 19 45.336 +06 00 23.13 5 1.63 5.64 VCC KHJ GGH UZC GH I3156 12 19 44.1 +09 08 54 3 2.56 2.52 VCC WS UZC I3157 12 19 47.8 +12 25 16 3 2.53 1.53 VCC WS UZC I3158 12 19 48.7 +09 17 30 1o Sn I3158: 12 19 49.91 +09 17 22.5 1 HCds I3158? 12 19 49.6 +09 18 07 1 WS I3159 12 19 53.13 +11 40 27.5 3 1.47 2.12 JA HCds WS I3160 12 20 00.03 +09 06 05.2 2 0.94 2.97 HCds WS I3161 12 20 01.27 +08 59 56.3 2 0.21 2.97 HCds WS I3162 12 20 03.17 +08 59 49.5 2 0.21 1.91 HCds WS I3163 12 20 03.6 +09 15 24 1o Sn I3163? 12 20 05.8 +09 15 20 1 HCds I3163? sw * 12 20 05.26 +09 15 11.1 2 0.00 2.76 WS HCds I3163? ne * 12 20 06.30 +09 15 25.8 1 HCds I3164 12 20 04.9 +24 57 21 1 HCds I3164 n * 12 20 04.72 +24 57 29.3 1 HCds I3164 s * 12 20 05.02 +24 57 13.5 1 HCds I3165 12 20 04.79 +27 58 29.6 5 0.77 1.64 WS BPP JG UZC CCA I3166 12 19 54 +60 41.7 1o Sw12 I3167 12 20 18.8 +09 32 42 3 0.00 2.52 VCC WS UZC I3168 12 20 18.54 +27 55 11.4 4 2.38 2.16 K03 WS JG BPP I3169 12 20 21.34 +25 35 58.7 1 HCds I3170 12 20 26.6 +09 25 26 3 0.00 1.53 WS UZC YZYH I3171 12 20 24.080 +25 33 37.21 5 1.27 1.17 HCds KHJ Pds UZC JG I3172 12 20 24.5 +27 49 06 1 WS I3173 12 20 30.146 +11 20 26.61 2 0.49 0.36 VPC KHJ I3174 12 20 29.538 +10 14 42.83 2 0.09 0.71 YZYH KHJ I3175 12 20 33.35 +09 51 12.6 4 0.74 0.98 WS UZC YZYH YOF I3176 12 20 30.0 +25 30 52 1 WS I3177 12 20 34 +14 07.7 1o Fr I3178 12 20 35.08 +26 10 10.4 1 HCds I3179 12 20 37.67 +26 09 54.5 2 0.00 2.83 WS HCds I3179 comp 12 20 39.58 +26 09 35.2 2 1.61 2.47 HCds WS I3180 12 20 23 +60 41.7 1o Sw12 I3181=N4286 12 20 42.07 +29 20 43.9 7 2.44 3.59 GHD1 K03 WS BPP UZC CCA JG I3182 12 20 47.9 +12 43 43 2 2.07 6.36 HCds WS I3182 sw * 12 20 47.25 +12 43 41.6 1 HCds I3182 ne * 12 20 48.18 +12 43 54.3 1 HCds I3182 nearby * 12 20 48.71 +12 43 20.8 1 HCds I3183 12 20 48.90 +06 41 10.7 2 0.42 3.25 WS HCds I3183 near * 12 20 48.39 +06 41 49.5 1 HCds I3184 12 20 46.73 +24 54 55.4 3 1.26 1.81 JG WS JG I3184 comp or knot 12 20 47.44 +24 55 02.9 2 1.25 3.39 HCds WS I3185 12 20 52.6 +25 25 43 1 WS I3186 12 20 55.9 +24 40 06 2 0.96 0.00 UZC WS I3187 12 20 54.7 +11 09 40 3 1.47 2.08 VCC VPC WS I3188 12 20 55.0 +11 00 31 4 3.48 2.16 VCC VPC WS UZC I3189 12 20 56.2 +25 25 32 1 WS I3190 12 21 02.39 +09 34 11.1 2 0.42 2.19 WS HCds I3191 12 21 05.16 +07 42 16.6 1 HCds I3192 12 21 04.7 +11 45 14 2 1.04 4.24 JA WS I3193 12 21 01.28 +27 53 53.7 3 0.95 1.10 WS BPP JG I3194 12 21 09.1 +25 07 58 1 WS I3195 12 21 17.5 +25 48 26 1 WS I3196 12 21 26.66 +11 45 27.0 2 1.35 1.84 HCds WS I3197 12 21 25.84 +25 26 39.6 1 HCds I3198 12 21 31.18 +26 21 57.9 2 0.76 1.48 UA20 WS I3199 12 21 45.615 +10 35 43.86 4 0.97 0.78 VPC KHJ UZC CCA I3200 12 21 37.2 +26 45 36 1 WS I3201 12 21 40.325 +25 43 32.11 1 KHJ I3202 12 21 44.317 +27 03 25.38 1 KHJ I3203 12 21 45.73 +25 53 02.6 2 1.62 2.33 WS CCA I3204 12 21 50.5 +24 14 53 1 WS I3205 12 21 50.933 +26 20 27.83 5 0.35 0.96 HCds KHJ UA20 GSC BPP I3206 12 21 51.25 +26 21 50.0 4 0.56 1.07 HCds WS BPP UA20 I3207 12 21 52.5 +24 21 13 1 WS I3208 12 21 55.7 +11 58 01 2 5.18 3.54 WS JA I3209 12 22 06.16 +11 45 17.7 5 2.83 2.61 VPC WS UZC YOF VCC I3210 12 22 00.9 +28 25 50 3 2.01 1.15 WS UZC BPP I3211=N4307A 12 22 07.35 +08 59 25.4 3 0.95 1.50 WS UZC CCA I3212 12 22 03.4 +28 11 08 2 0.00 2.83 WS BPP I3213 12 22 07.68 +23 52 08.0 2 0.68 4.24 WS HCds I3214 12 22 09.08 +27 14 08.6 1 HCds I3215 12 22 10.22 +26 03 01.4 3 0.74 5.73 WS CCA STMW I3216 12 22 11.8 +25 17 09 1 WS I3217 12 22 13.3 +26 23 12 2 0.00 3.54 HCds WS I3217 gal 12 22 13.08 +26 23 16.7 2 0.57 3.75 HCds WS I3217 * 12 22 13.50 +26 23 08.1 2 0.09 2.90 HCds WS I3218 12 22 19.7 +06 55 52 1 HCm I3218 gal 12 22 19.44 +06 55 38.8 5 3.76 2.17 VCC HCo I1 WS GGH I3218 * 12 22 19.91 +06 56 05.2 1 GSC I3219 12 22 15.0 +25 57 01 1 WS I3220 12 22 21.5 +10 36 02 2 4.17 2.12 JA WS I3221 12 22 20.1 +25 16 57 1 WS I3222 12 22 19.46 +28 49 51.1 3 1.25 0.95 Pds WS CCA I3223 12 22 30.6 +09 29 14 1o Sn I3223? 12 22 29.19 +09 29 27.2 1 HCds I3223?? 12 22 29.84 +09 28 53.4 2 1.46 3.18 HCds WS I3224 12 22 35.6 +12 09 29 2 9.32 3.54 JA WS I3225 12 22 39.09 +06 40 36.6 9 2.58 2.11 YOF VCC WS UZC GGH GSC CCA Pds STMW I3226 12 22 34.94 +26 04 02.2 1 HCds I3226? sw * 12 22 34.03 +26 03 46.1 1 HCds I3227 12 22 35.658 +24 05 06.50 1 KHJ I3228 12 22 39.4 +24 19 45 1 WS I3229 12 22 52.84 +06 40 46.1 6 0.91 0.60 YOF WS GGH CCA GSC UZC I3230 12 22 39.5 +27 44 48 1 K03 I3231 12 22 43.6 +24 49 11 1 WS I3232 12 22 47.82 +24 25 31.5 2 0.58 4.45 WS HCds I3233 12 22 54.9 +12 33 59 2 2.07 1.41 JA K09 I3234 12 22 52.1 +28 06 43 1 WS I3235 12 22 57.75 +13 32 45.1 4 2.53 4.27 K09 JA HCds WS I3236nw 12 23 00.08 +10 06 05.2 3 3.41 2.00 JA WS HCds I3236se 12 23 00.73 +10 06 00.3 1 HCds I3237 12 22 58.0 +28 29 35 1 WS I3238 12 23 06.3 +14 27 29 4 2.05 0.96 VCC VPC WS UZC I3239 12 23 09.52 +11 43 34.2 4 1.32 4.34 VCC WS VPC YOF I3240 12 23 07.23 +10 21 44.6 3 2.21 3.72 JA HCds WS I3241 12 23 08.449 +26 54 18.67 1 KHJ I3242 12 23 10.4 +26 14 55 1 WS I3243 12 23 11.2 +27 45 54 2 0.94 1.41 BPP WS I3244 12 23 12.3 +14 23 17 4 2.05 1.91 VCC VPC WS UZC I3245 12 23 17 +09 07.8 1o Fr I3246 12 23 17.14 +13 03 07.3 1 HCds I3247 12 23 14.03 +28 53 34.4 3 0.60 1.65 WS BPP CCA I3248 12 23 16.83 +25 33 06.0 2 1.15 3.46 WS HCds I3249 12 23 17.84 +25 26 38.5 2 0.76 1.41 HCds WS I3249 sw comp 12 23 16.92 +25 26 06.6 1 HCds I3249 w * 12 23 16.94 +25 26 21.1 1 HCds I3249 n comp 12 23 17.87 +25 27 00.5 1 HCds I3249 ne comp 12 23 18.88 +25 26 40.8 1 HCds I3249 e comp 12 23 19.49 +25 26 15.7 1 HCds I3250 12 23 17.78 +25 37 42.1 2 0.38 2.19 WS HCds I3251 12 23 18.87 +25 39 10.6 2 1.62 2.90 WS HCds I3252 12 23 24.9 +28 37 05 1 HCds I3252 nw * 12 23 24.46 +28 37 08.4 1 HCds I3252 se * 12 23 25.35 +28 37 03.0 1 HCds I3253 12 23 45.1 -34 37 19 2 1.75 0.71 WS ESOB I3254=N4336 12 23 29.76 +19 25 36.5 6 1.85 1.27 DC WS UZC CCA HCds YOF I3254?? 12 23 32.31 +19 27 09.8 1 HCds I3255 12 23 34.79 +09 38 55.0 3 0.74 1.22 UZC HCds WS I3256=N4342 12 23 39.10 +07 03 13.8 6 0.66 0.95 KEBA GGH GSC CCA UZC WS I3257 12 23 44.7 +07 15 13 1o Big I3258 12 23 44.39 +12 28 41.6 9 1.68 2.78 DC VCC VPC Pds K09 YOF WS GH CCA I3259 12 23 48.70 +07 11 11.9 8 3.20 3.76 GGH YOF GSC WS UZC CCA Pds GH I3260=N4341 12 23 53.56 +07 06 24.4 5 0.78 0.50 GGH UZC GSC CCA Pds I3261: 12 23 52.49 +11 28 51.1 2 0.42 3.46 HCds WS I3261? 12 23 54.56 +11 29 27.1 3 2.12 2.51 JA VPC HCds I3262 12 23 48.19 +27 23 38.2 5 0.90 1.40 BPP WS GSC UZC JG I3263 12 23 50.61 +28 11 56.6 4 1.02 2.57 WS BPP UZC JG I3264 12 23 51.9 +25 33 22 1 WS I3265 12 23 58.89 +07 48 13.2 1 HCds I3266=N4353 12 24 00.16 +07 47 04.8 8 1.99 1.79 VCC YOF HCds HCds GGH WS UZC GH I3267 12 24 05.61 +07 02 28.0 7 0.90 2.69 WS GGH CCA GSC YOF UZC GH I3268 12 24 07.50 +06 36 25.8 7 3.58 2.23 VCC YOF WS UZC GGH CCA DC I3269 12 24 04.2 +27 26 01 2 0.00 1.41 HCo WS I3270 12 24 05.8 +27 34 36 1 WS I3271 12 24 13.92 +07 57 10.4 6 0.95 3.38 VCC WS UZC GGH YOF CCA I3272 12 24 09.27 +23 17 04.8 2 0.00 1.34 WS HCds I3272 * 12 24 09.20 +23 17 29.8 1 HCds I3273=N4356 12 24 14.77 +08 32 11.8 4 1.40 1.42 WS CCA DC UZC I3274=N4360B 12 24 14.679 +09 15 59.56 2 0.55 1.02 VCC KHJ I3275 12 24 19.50 +10 26 46.6 2 0.21 2.40 HCds WS I3276 12 24 14.0 +25 49 03 1 WS I3277 12 24 15.6 +25 33 46 1 WS I3278 12 24 15.0 +27 25 17 1 WS I3278ne 12 24 15.1 +27 25 20 1 HCo I3278se 12 24 15.3 +27 25 03 2 0.94 0.00 K03 HCo I3278w 12 24 14.4 +27 25 20 1 HCo I3279 12 24 23.5 +12 51 08 2 2.07 0.71 HCds WS I3279 w * 12 24 22.67 +12 51 10.1 1 HCds I3279 e * 12 24 24.14 +12 51 08.3 1 HCds I3280 12 24 26.53 +13 13 59.5 3 6.12 1.32 JA HCds WS I3281 12 24 27.9 +07 49 08 1o Sn I3281? 12 24 24.2 +07 50 41 1 WS I3282 12 24 27.95 +25 40 12.1 2 0.76 1.56 WS HCds I3283 12 24 28.1 +27 12 39 1 WS I3284 12 24 37.5 +10 50 17 3 0.85 1.53 VCC VPC WS I3285 12 24 33.38 +24 51 36.0 1 HCds I3286 12 24 34.5 +23 44 49 1 WS I3287 12 24 37.0 +24 35 37 1 WS I3288 12 24 39.3 +24 56 54 1 WS I3289 12 24 57.2 -26 01 49 2 2.87 0.71 ESOB WS I3290 12 25 09.2 -39 46 32 2 5.73 2.12 WS ESOB I3291 12 24 48.417 +12 01 06.53 1 KHJ I3292 12 24 48.363 +18 11 42.11 2 0.49 0.09 KHJ UZC I3293 12 24 53.44 +17 25 55.9 2 0.81 2.40 HCds WS I3294 12 24 49.6 +25 35 44 1 WS I3295 12 24 49.0 +28 42 28 1 MW4 I3296 12 24 57.859 +24 22 56.09 2 0.98 2.61 KHJ Pds I3297 12 24 58.01 +26 46 17.2 1 HCds I3297? 12 25 03.0 +26 45 51 1 WS I3298 12 25 03.77 +17 00 54.1 4 1.85 2.27 VCC YOF WS UZC I3299 12 25 03.163 +27 22 27.74 1 KHJ I3300 12 25 04.83 +25 57 25.7 4 2.08 3.20 JG WS UZC CCA I3301=I3307 12 25 17.51 +14 10 18.9 3 0.77 2.78 JA HCds WS I3302 12 25 10.3 +25 52 40 1 WS I3303 12 25 15.15 +12 42 51.8 6 1.65 0.57 GH VPC WS UZC CCA I1 I3304 12 25 11.7 +25 25 22 1 WS I3305 12 25 14.48 +11 50 57.3 4 1.20 0.82 UZC WS VPC CCA I3306 12 25 12.4 +27 24 07 1 WS I3307=I3301 12 25 17.51 +14 10 18.9 3 0.77 2.78 JA HCds WS I3308 12 25 18.06 +26 42 53.9 5 1.62 1.84 STMM HCds CCA WS BPP I3309 12 25 20.17 +28 22 50.9 4 0.75 0.68 CCA WS BPP K03 I3310 12 25 55.30 +15 40 49.9 1 HCds I3311 12 25 33.09 +12 15 35.9 9 1.85 1.69 STMW UZC VPC HCds WS CCA YOF Pds K09 I3312 12 25 29.8 +23 34 50 1 WS I3313 12 25 37.1 +15 49 55 2 12.23 14.85 WS VCC I3314 12 25 31.467 +23 35 27.54 1 KHJ I3315 12 25 38.84 +12 18 50.1 3 2.20 4.13 JA HCds WS I3316 12 25 36.1 +26 09 43 2 1.90 2.83 WS HCo I3317 12 25 38.8 +25 20 33 1 WS I3318 12 25 49.80 +09 45 46.8 2 0.10 3.11 HCds WS I3319 12 25 50.9 +10 23 27 1o Sn I3320=N4390 12 25 50.60 +10 27 32.7 8 3.68 2.02 DC WS YOF HCds GSC CCA UZC GH I3321 12 25 46.0 +26 04 52 2 0.95 0.00 WS HCo I3322 12 25 54.16 +07 33 15.6 6 0.97 1.72 WS GH GGH UZC CCA YOF I3322A 12 25 42.77 +07 12 57.9 7 1.74 2.09 GH WS YOF GSC UZC GGH CCA I3323 12 25 47.92 +27 32 34.7 1 HCds I3324 12 25 49.08 +26 44 22.3 2 1.04 0.92 HCds WS I3324ne 12 25 49.14 +26 44 24.9 1 HCds I3324sw 12 25 48.90 +26 44 21.1 1 HCds I3325 12 25 51.4 +23 53 42 1 WS I3326 12 25 52.7 +23 46 03 1 WS I3327 12 26 02.77 +14 52 48.9 5 0.73 1.29 YZYH VPC GSC WS UZC I3328 12 25 57.9 +10 03 12 2 1.04 1.41 UZC WS I3329 12 25 55.86 +27 33 52.1 2 0.56 3.32 HCds WS I3330 12 25 56.35 +30 50 35.5 5 0.90 1.59 BPP WS UZC JG CCA I3331 12 26 05.33 +11 48 43.2 5 1.40 1.03 K09 VPC WS GSC UZC I3332 12 26 05.1 +25 16 43 1 WS I3333 12 26 08.86 +13 07 57.0 2 0.21 1.77 WS HCds I3334 12 26 09.5 +28 27 54 1 WS I3335 12 26 19.1 +26 07 43 1 HCo I3336 12 26 19.9 +26 50 17 3 1.54 1.73 WS BPP UZC I3337 12 26 21.3 +25 18 36 1 WS I3338 12 26 22.1 +25 53 06 1 WS I3339=N4411=N4411A 12 26 29.78 +08 52 18.1 8 5.59 1.88 GH YOF HCo HCds WS WR UZC CCA I3340 12 26 32.62 +16 50 39.5 2 0.20 3.54 WS HCds I3341 12 26 23.2 +27 44 43 2 0.00 0.00 K03 WS I3342 12 26 27.23 +27 08 20.9 2 1.04 1.34 WS HCds I3343 12 26 35.10 +08 52 27.4 1 HCds I3343 nearby * n 12 26 35.19 +08 53 03.8 1 HCds I3343 nearby * sw 12 26 34.10 +08 52 20.7 1 HCds I3344 12 26 32.396 +13 34 43.45 3 0.79 0.50 UZC KHJ I1 I3345 12 26 33.3 +24 22 05 1 WS I3346 12 26 44.28 +11 22 47.3 3 4.47 3.06 JA HCds WS I3347 12 26 44.36 +10 55 07.5 3 3.21 2.50 JA HCds HCo I3348 12 26 38.0 +25 37 24 1 WS I3349 12 26 47.1 +12 27 11 5 0.65 3.36 I1 VCC WS UZC VPC I3350 12 26 46.47 +09 26 32.5 2 0.73 3.54 HCds WS I3351 12 26 40.93 +27 36 21.9 1 HCds I3352 12 26 47.8 +08 45 27 1o Sn I3352? 12 26 41.7 +08 44 30 1 WS I3352??=N4411B 12 26 47.1 +08 53 07 1 GD I3353 12 26 44.97 +27 54 42.7 2 0.65 3.75 HCds WS I3354 12 26 51.48 +12 05 48.0 2 1.24 2.69 HCds WS I3355 12 26 51.02 +13 10 34.2 6 2.86 3.21 WS UZC HCo KK YOF CCA I3355 knot 12 26 51.3 +13 10 22 2 2.06 0.71 VPC K09 I3356 12 26 50.82 +11 33 29.3 6 4.80 2.55 CCA HCds UZC WS STMW GD I3356* 12 26 51.33 +11 33 16.9 2 1.45 0.07 HCds YOF I3357 12 26 51.4 +09 46 37 2 0.00 2.12 WS UZC I3358 12 26 54.35 +11 39 52.3 4 1.49 9.39 VCC WS UZC CCA I3359 12 26 51.385 +23 29 53.31 1 KHJ I3360 12 26 50.82 +26 02 47.3 1 GSC I3361 12 26 58 +10 38.8 1o Fr I3361? 12 26 54.48 +10 39 55.8 3 0.76 3.51 HCds WS VPC I3361?? 12 27 04.35 +10 38 47.9 2 2.50 1.77 GD HCds I3362 12 26 54.396 +26 41 23.89 1 KHJ I3363 12 27 03.0 +12 33 36 5 0.80 3.71 VPC WS VCC I1 UZC I3364 12 27 04.65 +25 33 47.6 1 HCds I3365 12 27 11.44 +15 53 49.8 7 3.87 2.58 K09 YOF UZC HCds WS VCC CCA I3366 12 27 12.12 +09 24 36.7 1 HCds I3367 12 27 10.107 +26 57 27.13 3 1.06 0.78 KHJ JG BPP I3368 12 27 20.47 +16 25 39.5 2 0.61 5.80 HCds WS I3369 12 27 16.8 +16 01 28 3 2.49 2.00 VCC WS UZC I3370 12 27 37.17 -39 20 17.2 3 1.94 1.04 ESOB WS HC2m I3371 12 27 22.26 +10 51 58.7 4 0.80 0.95 WS UZC VPC CCA I3372 12 27 24.33 +25 17 13.9 1 HCds I3373 12 27 27.7 +25 27 08 1 WS I3374 12 27 32.9 +10 00 08 2 10.44 3.54 VCC WS I3375 12 27 40.31 +27 21 55.0 1 HCds I3376 12 27 50.31 +26 59 36.7 7 1.79 1.96 DC WS Pds UZC BPP JG CCA I3377 12 27 51.927 +24 56 31.49 1 KHJ I3378 12 28 01.50 +17 17 45.8 2 0.30 2.97 HCds WS I3379 12 28 04.24 +17 18 21.6 4 0.67 2.51 WS UZC HCds VCC I3380 12 28 05.546 +26 40 21.69 1 KHJ I3381 12 28 14.94 +11 47 21.6 6 2.00 1.94 WS I1 UZC CCA VCC GH I3382 12 28 13.60 +13 34 13.4 5 0.62 2.10 HC CCA HC2m WS HCo I3383 12 28 12.37 +10 17 50.9 4 0.85 1.55 UZC HCds WS Pds I3384 12 28 12.5 +25 05 20 1 WS I3385 12 28 15.1 +25 25 52 1 WS I3386 12 28 23.81 +13 11 43.5 2 3.61 3.68 HCds WS I3387 12 28 18.8 +27 59 44 2 0.93 2.12 K03 WS I3388 12 28 28.04 +12 49 24.6 4 2.03 1.67 I1 VPC HCds WS I3389 12 28 23.6 +27 50 39 1 WS I3390 12 28 28.7 +24 48 29 1 WS I3391 12 28 27.37 +18 24 54.7 4 1.60 1.23 YOF CCA WS UZC I3392 12 28 43.23 +14 59 56.4 5 1.21 2.07 GH WS CCA YOF UZC I3393 12 28 41.71 +12 54 57.0 5 1.73 0.95 I1 WS GH HCds UZC I3394 12 28 41.355 +26 47 55.18 2 2.79 1.27 KHJ Pds I3395 12 28 44.6 +25 02 03 1 WS I3396 12 28 45.1 +25 02 56 1 WS I3397 12 28 46.66 +25 43 52.5 2 0.29 1.91 HCds WS I3398 12 28 58.14 +13 33 53.7 2 1.13 3.54 HCds WS I3399 12 28 56.11 +25 41 43.2 2 0.95 2.83 HCds WS I3400 12 29 02.87 +09 24 23.4 1 HCds I3401 12 28 58.823 +26 27 35.89 1 KHJ I3402 12 28 59.28 +28 51 42.4 4 0.91 0.72 HCds BPP WS CCA I3403 12 29 01.6 +24 37 55 1 WS I3404 12 29 10.7 +07 09 14 1o Sn I3405 12 28 59.513 +37 43 47.94 2 0.35 0.45 GSC KHJ I3406 12 29 02.73 +27 38 25.2 3 0.77 1.65 BPP JG WS I3407 12 29 03.88 +27 46 43.1 6 0.89 2.50 K03 JG WS UZC CCA BPP I3408 12 29 15.86 +11 52 31.7 2 1.45 2.05 HCds WS I3409 12 29 21.15 +14 47 19.0 2 1.33 5.09 WS HCds I3410 12 29 06.15 +19 00 16.4 2 0.10 1.63 HCds WS I3411 12 29 12.4 +24 34 59 1 WS I3412 12 29 22.6 +09 59 14 2 1.04 1.41 WS UZC I3413 12 29 22.74 +11 25 58.5 6 3.99 2.63 UZC WS GH CCA VCC VPC I3414 12 29 28.95 +06 46 12.5 6 1.06 1.92 WS YOF GGH UZC DC CCA I3415 12 29 21.83 +26 46 00.4 2 1.42 1.41 HCds WS I3416 12 29 35.1 +10 47 35 2 1.04 0.00 HCds VPC I3416ne 12 29 35.41 +10 47 36.6 2 1.15 1.56 HCds WS I3416sw 12 29 34.75 +10 47 30.8 2 0.31 3.32 HCds WS I3417 12 29 39.16 +07 51 42.9 1 HCds I3418 12 29 43.89 +11 24 12.7 2 1.45 4.81 HCds CCA I3418* 12 29 42.53 +11 24 02.6 2 1.35 2.97 WS YOF I3419 12 29 44.54 +15 01 27.1 2 1.53 3.61 HCds WS I3420 12 29 42.61 +13 26 46.0 2 0.93 3.39 HCds WS I3421 12 29 38.7 +26 13 51 2 0.95 2.83 Pds WS I3422 12 29 54.57 +14 41 17.0 2 0.41 1.91 WS HCds I3423 12 29 46.46 +13 39 33.9 1 HCds I3424 12 29 45.0 +24 24 27 1 WS I3425 12 29 56.42 +10 36 54.4 4 0.81 0.93 UZC VPC CCA WS I3426 12 30 01.54 +13 35 52.7 2 1.54 2.83 HCds WS I3427=N4482 12 30 10.41 +10 46 45.4 7 0.97 1.65 WS HCds GSC CCA Pds UZC DC I3428 12 30 07.55 +23 40 30.6 1 HCds I3428 nearby ** 12 30 07.59 +23 40 49.5 1 HCds I3429 12 30 07.9 +23 32 41 1 WS I3430 12 30 17.00 +09 05 04.4 3 1.13 2.23 CCA UZC WS I3431 12 30 24.09 +11 36 52.6 3 1.47 3.51 GD HCds WS I3432 12 30 27.69 +14 09 35.5 5 2.52 2.06 VPC YZYH WS UZC YOF I3433 12 30 28.21 +17 18 33.2 2 1.62 3.04 HCds WS I3433 comp 12 30 43.37 +17 14 09.2 1 HCds I3434 12 30 27.2 +18 48 32 2 0.00 2.12 WS UZC I3435 12 30 40.03 +15 07 44.0 4 3.83 4.13 VPC WS CCA VCC I3436 12 30 29.941 +19 40 21.89 3 0.71 0.79 UZC KHJ Pds I3437 12 30 45.9 +11 20 31 4 0.73 4.04 WS VPC UZC VCC I3438=N4492 12 30 59.72 +08 04 39.7 8 1.39 1.92 GH YOF Pds WS UZC GGH DC CCA I3439 12 30 59.6 +25 33 38 1 WS I3440 12 31 05.10 +12 01 47.7 1 HCds I3441 12 31 04.4 +28 51 10 2 0.00 0.71 WS Pds I3442 12 31 20.2 +14 06 52 4 0.73 2.22 VPC WS UZC GH I3443 12 31 15.699 +12 19 54.56 4 1.39 1.74 VPC I1 KHJ VCC I3444 12 31 13.95 +27 32 59.2 1 HCds I3445 12 31 19.30 +12 44 18.4 3 1.78 5.00 JA WS HCds I3446 12 31 22.96 +11 29 31.4 5 0.26 3.05 VCC WS VPC UZC YOF I3447 12 31 17.78 +10 40 48.3 3 1.48 2.58 JA HCds WS I3448 12 31 23.1 +17 12 21 2 0.00 2.83 WS HCo I3449 12 31 22.940 +25 54 49.55 1 KHJ I3450 12 31 25.0 +26 47 44 3 2.31 0.58 HCo WS HC I3451 12 31 24.059 +28 51 18.42 1 KHJ I3452=N4497 12 31 32.60 +11 37 29.7 5 2.17 3.85 GH UZC CCA WS DC I3453 12 31 37.75 +14 51 37.5 6 3.44 4.47 HCo K09 WS UZC CCA STMW I3453 knot 12 31 38.0 +14 51 22 2 0.00 0.00 KEB2 VPC I3454 12 31 38.78 +27 29 45.8 5 2.86 2.14 HCds GSC BPP CCA WS I3455 12 31 44.6 +25 47 04 1 WS I3456 12 31 43.7 +28 21 25 1o MW4 I3457 12 31 51.38 +12 39 25.2 7 1.66 1.25 VPC GH I1 WS UZC STMW CCA I3458 12 31 44.0 +28 08 47 1 WS I3459 12 31 55.93 +12 10 26.8 6 1.02 1.41 I1 WS VPC HCo CCA UZC I3460 12 31 50.5 +27 23 11 4 2.66 1.00 K03 K15 WS K11 I3461 12 32 02.7 +11 53 23 4 0.73 2.00 I1 WS UZC VPC I3462 12 32 09.55 +15 18 02.8 2 0.72 1.20 HCds WS I3463 12 32 04.8 +12 19 09 2 4.14 0.00 HCo WS I3463 ne * 12 32 05.5 +12 19 21 1 HCo I3463 sw * 12 32 03.5 +12 18 56 1 HCo I3464 12 32 00.6 +26 00 18 1o MW4 I3464 * 12 32 00.20 +26 00 17.4 1 HCds I3465 12 32 12.3 +12 03 40 3 0.00 2.65 WS HCo GD I3466 12 32 05.6 +11 49 01 3 0.85 1.00 WS VPC UZC I3467 12 32 24.6 +11 47 13 3 0.85 1.53 WS VPC UZC I3468 12 32 14.229 +10 15 04.67 3 0.51 0.53 UZC KHJ CCA I3469 12 32 10.92 +25 48 10.6 1 HCds I3470 12 32 23.399 +11 15 46.20 3 0.47 0.15 KHJ GSC UZC I3471 12 32 22.4 +16 01 09 2 6.11 8.49 VCC WS I3472 12 32 18.8 +24 43 38 2 0.00 1.41 K15 WS I3473 12 32 19.09 +18 14 40.3 5 1.25 2.08 WS UZC CCA STMW JG I3474 12 32 36.74 +02 39 42.1 5 1.25 2.99 CCA UZC GGH WS GH I3475 12 32 40.88 +12 46 14.7 4 1.80 1.98 VPC CCA HCo HCds I3476 12 32 42.00 +14 02 59.8 7 2.06 2.31 WS YOF GSC UZC CCA GH DC I3477 12 32 38.22 +26 02 16.2 2 1.05 2.76 HCds WS I3478 12 32 44.24 +14 11 45.2 4 0.49 1.40 WS UZC GSC CCA I3479 12 32 41.0 +25 24 19 1 WS I3480 12 32 41.4 +26 49 44 4 3.99 2.75 WS HCds HCo HC I3480 w * 12 32 41.04 +26 49 45.5 1 HCds I3480 e * 12 32 41.61 +26 49 44.6 1 HCds I3481 12 32 52.269 +11 24 15.44 3 0.23 0.18 KHJ GSC UZC I3481A 12 32 56.743 +11 23 24.12 4 0.64 0.30 VPC KHJ GSC YZYH I3482 12 33 01.0 +27 49 47 1 WS I3483 12 33 09.99 +11 20 49.6 5 0.42 1.78 WS UZC VPC YOF GSC I3484 12 33 05.2 +17 24 11 4 3.57 2.94 VCC WS YZYH UZC I3485 12 33 11.18 +09 13 04.7 2 1.15 3.11 HCds WS I3486 12 33 14.02 +12 51 25.8 2 0.00 3.11 WS GSC I3487 12 33 13.34 +09 23 51.2 4 1.41 4.64 VCC HCds WS UZC I3488 12 33 08.573 +26 20 57.83 3 3.07 1.57 BPP KHJ HC I3489 12 33 13.73 +12 14 48.1 3 0.17 1.40 WS UZC YOF I3490 12 33 13.9 +10 55 41 2 1.04 2.83 VPC WS I3491 12 33 09.0 +27 05 38 4 2.52 3.56 K15 HCo WS HC I3492 12 33 19.773 +12 51 12.16 4 0.66 0.41 HC KHJ GSC UZC I3493 12 33 18.81 +09 23 36.4 1 HCds I3493 * east 12 33 21.54 +09 23 36.6 1 HCds I3494 12 33 13.926 +27 35 02.30 2 4.64 0.91 KHJ HC I3495 12 33 16.26 +26 48 34.4 2 1.32 2.40 HCds HCo I3496 12 33 18.99 +26 45 20.8 2 4.91 1.63 HCo HCds I3497 12 33 28.53 +25 29 19.4 1 HCds I3498 12 33 28.91 +26 44 17.3 4 1.88 1.29 HCo K15 HCds HC I3499 12 33 45.17 +10 59 43.6 3 3.02 1.10 UZC CCA DC I3500 12 33 49.5 +13 57 45 3 0.84 1.73 WS VPC UZC I3501 12 33 51.57 +13 19 19.9 4 0.87 1.08 WS VPC UZC GSC I3502 12 33 42.6 +26 36 45 1o MW4 I3502 galaxy 12 33 42.46 +26 37 01.0 4 1.63 3.05 HCds HCo WS HC I3502 * 12 33 42.98 +26 36 54.1 1 HCds I3503 12 33 48.31 +37 47 19.4 2 1.25 4.67 HCds WS I3504 12 34 07.95 +06 53 10.6 2 0.53 2.19 HCds WS I3505 12 34 10.3 +15 58 04 2 0.00 0.71 WS UZC I3506 12 34 06.8 +12 44 31 2 2.07 5.66 WS GD I3507 12 34 04.429 +25 21 46.21 1 KHJ I3508 12 34 07.034 +26 40 14.93 6 2.64 0.91 BPP HCds KHJ GSC UZC HC I3509 12 34 11.577 +12 02 57.33 4 1.26 4.60 VPC KHJ UZC VCC I3510 12 34 14.89 +11 04 16.6 5 1.63 1.15 VPC VCC UZC CCA WS I3511 12 34 09.49 +27 20 52.5 3 0.08 2.46 WS HCo HCds I3512 12 34 09.68 +27 21 41.1 3 1.20 1.44 HCds WS HCo I3513 12 34 11.65 +27 19 49.1 3 1.46 2.71 WS HCds HCo I3514 12 34 15.9 +26 42 03 4 1.34 2.38 WS HCds HCo HC I3514 n* 12 34 15.69 +26 42 08.4 1 HCds I3514 s* 12 34 15.83 +26 42 00.8 1 HCds I3515 12 34 16.0 +27 51 40 1 WS I3516 12 34 17.20 +27 27 06.3 6 2.46 0.87 K15 CCA HCo Pds HC WS I3517 12 34 30.78 +09 09 18.6 6 4.91 3.34 VCC YOF UZC WS CCA STMW I3518 12 34 31.29 +09 37 22.6 3 0.00 1.27 UZC WS CCA I3519 12 34 38.8 +15 36 13 3 5.00 5.77 WS UGCo VCC I3520 12 34 31.72 +13 30 12.2 4 0.15 1.99 WS UZC VPC YOF I3521 12 34 39.49 +07 09 36.1 6 1.18 3.74 YOF GGH WS UZC DC CCA I3522 12 34 45.90 +15 13 14.5 5 1.83 1.34 WS GH VPC CCA FT I3523 12 34 39.4 +14 00 58 2 1.03 4.24 WS GD I3524 12 34 43.07 +14 14 39.6 2 2.05 2.90 HCds WS I3524 nearby * 12 34 41.54 +14 14 29.1 1 HCds I3525 12 34 46.6 +10 10 33 2 4.17 4.95 WS GD I3526 12 34 40.6 +25 41 02 2 0.95 1.41 HCds WS I3526 s * 12 34 40.46 +25 40 59.6 1 HCds I3526 n * 12 34 40.60 +25 41 07.1 1 HCds I3527 12 34 42.2 +26 09 14 3 0.00 2.52 WS HCds HC I3527 s * 12 34 42.07 +26 09 14.3 1 HCds I3527 n * 12 34 42.32 +26 09 21.4 1 HCds I3528 12 34 55.937 +15 33 58.31 4 0.70 4.26 GH UZC KHJ VCC I3529 12 34 49.75 +25 41 54.0 2 0.29 3.39 WS HCds I3530 12 34 49.36 +17 48 49.9 2 0.91 4.60 HCds WS I3531 12 34 56.6 +26 37 34 3 1.34 1.15 HCo WS HC I3532 12 34 57.55 +25 52 48.5 2 0.57 2.55 HCds WS I3533 12 35 01.279 +25 46 46.84 4 0.26 0.14 HCds KHJ FPB K15 I3534 12 34 52.12 +14 58 40.5 2 0.10 1.27 HCds WS I3535 12 35 10.90 +25 43 55.1 1 HCds I3536 12 35 12.5 +26 31 59 4 2.01 0.96 WS HCo K15 HC I3537 12 35 22.39 +07 39 11.9 1 HCds I3537 two stars 12 35 22.6 +07 38 59 1 WS I3537 companion * 12 35 22.72 +07 38 50.1 1 HCds I3537 2nd comp * 12 35 21.11 +07 39 53.0 1 HCds I3538 12 35 15.6 +26 14 06 3 0.00 2.31 HC HCo WS I3539 12 35 20.08 +23 58 58.6 2 0.87 2.33 HCds WS I3540 12 35 27.252 +12 45 00.45 4 0.71 0.54 UZC KHJ KEBA VPC I3541 12 35 21.70 +23 58 31.4 1 HCds I3542 12 35 41.4 +11 40 00 2 4.15 4.95 WS GD I3543=N4565C 12 35 41.31 +26 17 09.3 5 1.20 2.54 HC WS K15 GSC CCA I3544 12 35 47.5 +14 18 02 2 1.03 0.71 HCds WS I3544 sw * 12 35 47.21 +14 18 01.2 1 HCds I3544 ne * 12 35 47.68 +14 18 05.7 1 HCds I3545=N4555 12 35 41.24 +26 31 21.6 7 1.82 2.77 WS BPP JG UZC CCA GHD1 HC I3546=N4565B 12 35 41.79 +26 13 19.9 8 3.72 1.89 WS K15 JG GSC BPP UZC HC GHD1 I3547 12 35 48.91 +26 19 45.6 3 2.02 2.52 WS HCds HCo I3548 12 35 56.6 +10 56 07 2 3.12 1.41 WS GD I3549 12 35 50.81 +26 23 42.6 4 1.27 2.04 HCo HC HCds WS I3550=N4559C 12 35 51.89 +27 55 56.7 3 1.36 2.12 WS HCds HCo I3551 12 35 53.80 +27 57 49.7 2 1.59 1.91 HCds HCo I3552 12 35 53.95 +27 59 36.6 3 0.61 1.97 HCds WS HCo I3553 12 35 55.90 +26 11 34.5 3 0.47 1.15 WS HCo HCds I3554 12 35 55.23 +27 55 38.3 3 0.70 1.85 WS HCds HCo I3555 12 35 56.06 +27 59 22.7 2 2.06 3.82 HCds HCo I3556 12 35 58.58 +26 57 55.7 5 2.58 2.55 K15 GSC WS BPP HC I3557 12 36 08.01 +16 38 30.5 1 HCds I3557nw 12 36 08.162 +16 38 28.75 2 0.06 0.74 KHJ HCds I3557se 12 36 08.45 +16 38 26.1 1 HCds I3557 w comp 12 36 05.73 +16 38 29.4 1 HCds I3557 nw comp 12 36 07.89 +16 38 51.9 1 HCds I3557 ne comp 12 36 08.47 +16 38 50.5 1 HCds I3557 e comp 12 36 10.66 +16 38 29.5 1 HCds I3558 12 36 02.92 +11 51 03.1 3 2.54 9.25 WS HCds GD I3558 * 12 36 02.89 +11 51 07.5 2 0.62 3.04 HCds WS I3559 12 36 03.4 +26 59 11 3 0.77 4.58 WS HCo HC I3560 12 36 04.008 +27 04 40.11 3 1.15 1.51 KHJ HC HCo I3561 12 36 04.901 +26 53 57.71 5 1.81 1.33 KHJ BPP GSC JG HC I3562 12 36 10.64 +09 55 21.3 2 0.52 2.69 HCds WS I3563 12 36 07.25 +27 55 35.5 3 2.66 2.65 WS HCds HCo I3564 12 36 08.02 +27 55 40.4 2 1.22 2.62 WS HCds I3564 * 12 36 08.0 +27 55 25 1 HCo I3565 12 36 12.5 +26 45 20 2 3.78 0.71 WS HC I3566 12 36 21 +11 09.9 1o Fr I3567 12 36 22.575 +13 36 11.77 4 3.01 3.92 VCC UZC VPC KHJ I3568 12 33 06.967 +82 33 49.04 7 0.73 1.71 CK Ty2 PPM HCrs CCA GSC DC I3569=N4561 12 36 08.26 +19 19 23.3 7 2.27 7.34 WS CCA YOF UZC GH GSC DC I3569se=N4561se 12 36 09.3 +19 19 11 1 HCo I3570 12 36 18.19 +24 04 41.4 2 0.19 2.62 WS HCds I3571 12 36 20.1 +26 04 59 2 3.80 1.41 WS HC I3572 12 36 28.0 +11 37 06 2 2.08 0.71 HCds WS I3572 n * 12 36 27.88 +11 37 15.3 1 HCds I3572 s * 12 36 27.92 +11 36 57.4 1 HCds I3573 12 36 27.285 +11 45 34.23 3 1.57 1.44 KHJ HCds GD I3574 12 36 27.817 +12 24 18.17 1 KHJ I3575 12 36 32.38 +13 44 56.5 2 0.93 1.63 HCds GD I3576 12 36 37.72 +06 37 15.8 6 1.75 1.43 FT YOF CCA GGH WS UZC I3577 12 36 36.3 +11 53 49 1o Sn I3577 nearby stars 12 36 38.5 +11 54 05 1 WS I3577 * 12 36 37.69 +11 54 00.9 1 HCds I3577 * companion 12 36 38.74 +11 54 10.5 1 HCds I3578 12 36 39.48 +11 06 04.8 3 0.78 2.00 UZC CCA WS I3579 12 36 32.77 +26 06 13.9 2 0.57 1.56 HCds WS I3580 12 36 29.19 +18 17 59.6 2 1.11 4.03 HCds WS I3581 12 36 38.03 +24 25 42.1 5 0.61 0.64 KEBA JG WS K15 UZC I3582 12 36 36.83 +26 14 06.8 1 HCds I3583 12 36 43.73 +13 15 29.2 5 1.21 3.23 YOF UZC CCA GH WS I3584 12 36 45.05 +12 13 57.4 2 1.04 2.26 WS HCds I3585 12 36 40.002 +26 49 46.55 7 1.08 2.15 KHJ BPP GSC UZC CCA JG HC I3586 12 36 54.9 +12 31 11 3 0.00 1.00 WS VPC UZC I3587 12 36 48.35 +27 32 55.2 4 1.25 1.56 K15 Pds WS CCA I3588=N4571 12 36 56.44 +14 13 02.3 7 1.81 1.02 GH WS YOF GSC UZC CCA DC I3589 12 37 01.22 +06 56 13.0 2 1.16 2.90 HCds WS I3590 12 36 50.67 +27 16 40.2 2 0.47 1.70 HCds WS I3591 12 37 02.95 +06 55 37.2 7 2.29 3.11 WS STMW YOF HCds GGH UZC CCA I3591 knot 12 37 02.30 +06 55 30.5 3 1.14 1.60 HCds GSC KEB2 I3592=N4559A 12 36 53.39 +27 51 42.3 6 1.68 0.61 WS UZC JG BPP FPB CCA I3593=N4559B 12 36 53.89 +27 44 55.1 5 1.23 1.75 WS JG FPB BPP UZC I3594 12 36 56.51 +26 06 55.3 2 0.76 1.77 HCds WS I3595 12 37 06.3 +23 47 10 1 WS I3595 comp 12 37 06.1 +23 46 46 1 WS I3596 12 37 18.9 +26 31 15 1 MW4 I3597 12 37 24.6 +23 51 46 2 0.00 0.71 WS K15 I3598 12 37 21.156 +28 12 28.48 6 1.68 2.15 JG KHJ UZC BPP CCA GHD1 I3599 12 37 41.282 +26 42 26.27 5 1.74 1.00 BCG K15 KHJ BPP HC I3600 12 37 41.124 +27 07 43.70 5 0.58 1.45 BPP UZC K15 KHJ K11 I3601 12 37 53.67 +15 13 28.5 2 1.33 2.69 HCds WS I3601 sw comp 12 37 51.19 +15 12 56.0 1 HCds I3601 nw comp 12 37 51.66 +15 13 46.6 1 HCds I3601 se comp 12 37 54.37 +15 13 00.9 1 HCds I3601 ne comp 12 37 54.41 +15 13 39.9 1 HCds I3602: 12 38 18.25 +10 04 23.5 1 HCds I3602: w comp 12 38 15.46 +10 04 24.7 1 HCds I3602: s comp 12 38 15.85 +10 04 13.9 1 HCds I3602: e comp 12 38 16.58 +10 04 17.5 1 HCds I3602? 12 38 06.79 +10 04 55.1 3 0.85 2.16 HCds WS UZC I3603 12 38 16.136 +15 34 11.96 2 0.40 1.34 HCds KHJ I3604 12 38 20.72 +11 43 49.3 2 0.52 1.91 WS HCds I3605 12 38 20.88 +19 32 27.9 2 0.60 2.76 HCds WS I3606 12 38 25.13 +12 36 39.1 3 1.18 4.56 HCds WS GD I3607 12 38 32.19 +10 22 34.6 3 3.32 3.11 WS HCds GD I3608 12 38 37.37 +10 28 31.5 4 0.82 1.28 YOF UZC CCA WS I3609 12 38 34.65 +14 21 09.3 3 0.25 1.31 HCds WS YZYH I3610 12 38 46.4 +26 52 22 1 HCds I3610 * 12 38 45.01 +26 52 16.8 1 HCds I3610 sw 12 38 46.36 +26 52 18.1 1 HCds I3610 n 12 38 47.00 +26 52 31.0 1 HCds I3610 e 12 38 47.11 +26 52 21.2 2 0.09 2.62 WS HCds I3611 12 39 04.143 +13 21 48.30 3 0.22 0.48 UZC KHJ CCA I3612=I3616 12 39 04.761 +14 43 52.41 5 1.13 1.73 KHJ GSC UZC CCA VCC I3613 12 39 04.79 +13 45 30.5 2 1.23 2.90 HCds WS I3613 nearby 12 38 59.68 +13 44 35.0 2 1.54 0.85 HCds GD I3614 12 39 01.4 +26 18 01 1 HCds I3614 gal 12 39 01.13 +26 18 11.9 2 0.38 2.05 WS HCds I3614 * 12 39 01.69 +26 17 50.4 1 HCds I3614 nearby 12 39 02.67 +26 18 20.1 1 HCds I3615 12 39 01.63 +18 12 01.6 3 0.08 1.15 WS UZC CCA I3616=I3612 12 39 04.761 +14 43 52.41 5 1.13 1.73 KHJ GSC UZC CCA VCC I3617 12 39 24.85 +07 57 54.7 6 2.52 2.15 YOF CCA YZYH GGH UZC WS I3618 12 39 17.168 +26 40 39.64 5 0.31 0.64 KHJ DFOT BCG BPP UZC I3619 12 39 18.7 +24 08 32 2 0.97 0.00 WS HCds I3619 nw * 12 39 18.43 +24 08 39.5 1 HCds I3619 se * 12 39 19.17 +24 08 25.0 1 HCds I3620 12 39 17.98 +27 54 30.9 4 0.92 2.49 WS BPP DFOT JG I3621 12 39 33.555 +15 30 09.82 3 0.44 1.15 HCds GSC KHJ I3622 12 39 32.36 +15 25 54.8 3 0.00 1.73 HCo WS HCds I3623 12 39 27.715 +27 06 08.71 6 1.16 1.24 KHJ UZC BPP DFOT BCG JG I3624 12 39 34.5 +11 58 55 2 1.04 3.54 WS GD I3625 12 39 33.304 +10 58 03.45 4 2.78 1.25 UZC KHJ KEBA VCC I3625 comp 12 39 27.7 +10 58 27 1 WS I3626 12 39 31.6 +25 40 35 2 0.95 2.83 WS K15 I3627 12 39 31.938 +27 29 50.59 2 1.23 0.52 HCds KHJ I3628 12 39 38.79 +26 14 20.4 2 0.28 0.92 HCds MAPS I3629 12 39 46.8 +13 31 57 2 1.03 1.41 UZC WS I3629 comp 12 39 49.3 +13 32 54 1 Pds I3630 12 39 46.64 +25 25 57.7 2 1.43 2.33 HCds WS I3631 12 39 48.023 +12 58 25.57 3 1.02 0.85 UZC KHJ CCA I3632 12 39 59.83 +26 40 55.5 2 0.76 3.18 HCds WS I3633 12 40 11.111 +09 53 45.46 4 3.46 0.95 VCC HCds KHJ UZC I3634 12 40 11.33 +09 50 49.6 3 0.76 2.16 GD HCds WS I3635 12 40 13.360 +12 52 27.63 4 2.11 1.21 VCC KHJ UZC CCA I3636 12 40 15.4 +22 04 28 1 WS I3636 s * 12 40 15.44 +22 04 23.2 1 HCds I3636 n * 12 40 15.56 +22 04 33.2 1 HCds I3637 12 40 19.40 +14 42 53.6 2 0.92 3.11 WS HCds I3638 12 40 16.6 +10 31 06 4 0.00 1.71 VCC WS UZC YZYH I3639 12 40 53.007 -36 45 23.74 3 2.90 3.38 UW WS ESOB I3640 12 40 25.20 +26 31 27.9 5 0.92 1.85 WS HCds GSC BPP UZC I3641 12 40 26.79 +26 31 17.2 2 1.04 2.40 HCds WS I3642 12 40 25.85 +26 43 54.3 2 0.85 3.89 HCds WS I3643 12 40 40.87 +12 24 23.3 2 0.83 2.40 HCds WS I3644 12 40 36.09 +26 30 17.1 5 1.51 2.00 HCo HCds WS K15 UZC I3645 12 40 37.46 +26 32 27.6 3 2.86 2.53 HCo HCds WS I3646 12 40 38.59 +26 31 33.5 6 0.74 1.97 HCds GSC DFOT WS UZC K15 I3647 12 40 53.02 +10 28 32.7 5 3.59 0.74 VCC WS UZC CCA STMW I3648 12 40 52.19 +12 59 06.0 1 HCds I3649 12 40 49.7 +21 06 13 1 WS I3650 12 40 48.6 +26 28 22 2 1.89 0.71 HCds WS I3650 nw * 12 40 48.18 +26 28 30.3 1 HCds I3650 se * 12 40 48.88 +26 28 14.0 1 HCds I3651 12 40 52.876 +26 43 40.66 7 1.02 0.70 DC HCds DFOT KHJ BPP UZC CCA I3652 12 40 58.64 +11 11 02.6 4 1.26 1.28 I1 CCA UZC WS I3653 12 41 15.649 +11 23 13.92 4 2.60 0.86 VCC UZC KHJ I1 I3654 12 41 12.590 +22 35 20.97 2 2.22 1.24 KHJ K15 I3655 12 41 14.440 +20 39 58.03 1 KHJ I3656 12 41 14.0 +22 35 40 2 3.91 2.83 WS K15 I3657 12 41 18.9 +21 40 31 1o MW6 I3657 * 12 41 18.98 +21 40 19.4 2 0.59 4.60 HCds WS I3658 12 41 20.6 +14 42 01 2 0.00 0.71 WS UZC I3659 12 41 27.6 +22 55 48 2 0.97 0.71 WS K15 I3660 12 41 36.80 +21 05 34.6 2 0.20 3.18 HCds WS I3661 12 41 35.6 +22 29 39 1 WS I3662 12 41 36.30 +23 25 28.9 4 1.83 1.22 WS UZC K15 JG I3663 12 41 39.36 +12 14 50.2 3 1.58 1.80 WS HCds GD I3663 companion 12 41 24.52 +12 10 33.4 2 0.10 0.28 UZC HCds I3664 12 41 41.43 +19 56 39.4 1 HCds I3665 12 41 46.55 +11 29 16.9 6 3.88 2.08 STMW VCC WS UZC I1 CCA I3666 12 41 53.34 +07 50 41.4 1 HCds I3667=N4618 12 41 32.67 +41 09 01.9 7 2.56 0.96 UZC SBG2 CCA GSC HCds WS DC I3668 12 41 33.2 +41 07 27 1 HCds I3669 12 41 35.9 +41 08 11 1 HCds I3670 12 41 55.00 +11 46 26.0 3 0.94 4.08 HCds WS GD I3671 12 41 51.38 +23 30 36.4 4 1.31 1.69 WS K15 UZC JG I3672 12 42 08.67 +11 45 14.7 5 0.64 1.59 HCds WS I1 UZC CCA I3673 12 42 04.33 +21 08 17.9 2 0.30 3.11 HCds WS I3674 12 42 05.3 +22 30 37 2 2.93 1.41 HCds WS I3674 w * 12 42 04.84 +22 30 39.6 1 HCds I3674 e * 12 42 05.48 +22 30 37.7 1 HCds I3675=N4625 12 41 52.57 +41 16 24.9 6 3.74 1.83 GHD1 SBG2 WS UZC CCA DC I3676 12 42 12.19 +13 33 33.7 2 0.62 1.27 WS HCds I3677 12 42 11.868 +20 53 05.99 2 0.09 0.37 HCds KHJ I3678 12 42 12.59 +20 52 48.4 2 0.00 2.12 WS HCds I3679 12 42 11.3 +22 49 04 2 1.95 1.41 HCds WS I3679 w * 12 42 10.79 +22 49 06.9 1 HCds I3679 e * 12 42 11.69 +22 49 03.8 1 HCds I3680 12 42 00.75 +39 06 17.6 1 HCds I3681 12 42 01.71 +39 05 01.8 2 0.25 2.83 WS HCds I3681 nearby * 12 41 59.76 +39 04 49.6 1 HCds I3682 12 42 19.52 +20 51 52.7 2 1.29 1.13 HCds WS I3683 12 42 20.592 +20 52 17.11 2 0.66 0.77 HCds KHJ I3684 12 42 26.6 +11 44 23 3 1.47 4.04 WS JA GD I3685 12 42 32.06 +06 52 15.6 1 HCds I3685 nearby * 12 42 31.39 +06 51 55.5 1 HCds I3686 12 42 35.97 +10 33 53.5 2 0.63 3.46 HCds WS I3687 12 42 15.15 +38 30 09.8 4 0.20 2.23 SBG2 WS UZC CCA I3688=N4633 12 42 37.11 +14 21 23.4 5 1.65 4.46 STMW WS CCA YOF GH I3689 12 42 36.93 +20 51 00.6 2 0.59 3.39 HCds WS I3690 12 42 49.30 +10 21 27.4 5 1.88 3.93 UZC WS YOF CCA VCC I3691 12 42 49.3 +22 46 19 1 WS I3692 12 42 54.07 +20 59 21.6 4 2.71 2.08 WS UZC CCA JG I3693 12 42 58.03 +10 40 52.1 4 2.46 2.17 GD HCds WS JA I3694 12 43 07.29 +11 12 41.7 4 0.83 2.17 YOF GSC WS UZC I3695 12 43 06.77 +22 44 31.7 1 HCds I3696 12 43 09.20 +19 55 40.2 2 3.58 0.78 WS HCds I3697 12 42 58.876 +39 50 43.47 2 0.44 1.25 KHJ Pds I3698 12 43 17.29 +11 12 40.3 4 0.70 1.89 YOF GSC WS UZC I3699 12 43 17.1 +19 00 00 1 HCds I3699 sw * 12 43 16.99 +18 59 55.6 1 HCds I3699 ne * 12 43 17.26 +19 00 05.8 1 HCds I3700 12 43 20.5 +19 15 54 1 HCds I3700 nw 12 43 19.91 +19 15 57.6 1 HCds I3700 se 12 43 20.96 +19 15 51.4 1 HCds I3701 12 43 30.87 +11 02 48.0 4 1.28 1.42 HCds JA GD WS I3701 knot or * 12 43 31.34 +11 02 56.7 2 2.07 1.27 HCds WS I3702 12 43 28.39 +10 52 25.0 5 0.90 1.45 YOF WS UZC GSC YZYH I3703 12 43 21.98 +37 58 28.6 2 1.50 2.47 HCds WS I3704 12 43 45.62 +10 46 10.6 5 1.21 1.86 WS YOF GSC UZC CCA I3705 12 43 41.6 +19 19 29 2 1.00 2.83 HCds WS I3705n 12 43 41.55 +19 19 35.7 2 1.20 3.82 HCds WS I3705s 12 43 41.56 +19 19 22.2 2 1.00 3.04 HCds WS I3706 12 43 48.0 +09 13 44 2 1.05 0.71 HCds WS I3706 n * 12 43 48.08 +09 13 54.1 1 HCds I3706 s * 12 43 47.80 +09 13 36.2 1 HCds I3707 12 43 28.49 +37 58 56.8 2 1.00 2.62 HCds WS I3708 12 43 52.5 +13 08 15 1 HCds I3709 12 44 04.0 +09 03 46 4 2.22 0.50 VCC WS UZC YZYH I3710 12 44 09.57 +12 06 54.6 3 1.84 5.11 HCds WS CCA I3711 12 44 09.6 +11 10 35 2 7.28 2.83 WS JA I3712 12 44 16.6 +10 22 28 1o Sn I3713 12 44 03.194 +41 10 07.74 3 0.49 0.87 SBG2 KHJ UZC I3714 12 44 22.8 +10 11 17 2 6.26 0.00 VCC WS I3715 12 44 21.37 +20 01 27.3 2 0.00 0.35 HCo HCds I3716 12 44 45.1 +08 06 07 1o Sn I3716 * 12 44 45.05 +08 06 28.1 2 1.26 1.06 GGH HCds I3717 12 44 23.0 +39 31 17 1 WS I3718 12 44 45.40 +12 21 02.2 3 1.73 1.51 WS UZC CCA I3719 12 44 47.69 +08 06 27.0 5 1.71 5.79 HCo HCds WS UZC GD I3720 12 44 47.48 +12 03 51.0 4 0.89 1.58 CCA I1 GH WS I3721=I3725 12 44 53.10 +18 45 17.6 6 1.92 1.93 DC WS UZC GSC CCA JG I3722 12 44 50.8 +11 46 42 2 2.07 0.71 HCds WS I3722 n ** 12 44 50.65 +11 46 49.8 1 HCds I3722 s ** 12 44 50.71 +11 46 35.8 1 HCds I3723 12 44 30.52 +40 44 11.1 3 2.32 2.00 WS SBG2 SDP I3724 12 44 53.6 +10 16 56 2 4.17 4.95 VCC WS I3725=I3721 12 44 53.10 +18 45 17.6 6 1.92 1.93 DC WS UZC GSC CCA JG I3726 12 44 42.65 +40 40 42.2 3 0.86 1.16 WS CCA SBG2 I3727 12 45 05.57 +10 54 01.7 5 2.65 1.96 VCC HCds I1 WS CCA I3727 sup * 12 45 04.85 +10 53 59.5 2 0.73 3.39 HCds WS I3728 12 45 03.2 +20 58 23 1 WS I3729 12 44 53.116 +39 21 02.19 2 0.18 2.91 KHJ Pds2 I3730 12 45 06.623 +21 10 10.37 4 0.72 0.57 GSC UZC KHJ KEBA I3731 12 45 05.342 +12 26 44.29 2 1.68 3.08 KHJ GD I3732 12 45 11.85 +10 19 26.9 3 0.76 2.61 GD HCds WS I3733 12 45 16.73 +06 57 24.8 1 HCds I3733 nearby * ne 12 45 17.23 +06 57 48.7 2 0.84 3.46 HCds WS I3733 nearby * nw 12 45 16.36 +06 58 10.1 1 HCds I3734 12 45 09.24 +23 02 19.4 2 0.58 3.04 WS HCds I3735 12 45 20.469 +13 41 32.68 2 0.95 0.49 KHJ UZC I3736 12 45 18.8 +21 32 06 1 WS I3737 12 45 19.9 +21 57 29 1 HCds I3737 sw * 12 45 19.32 +21 57 21.2 1 HCds I3737 ne * 12 45 20.35 +21 57 36.9 1 HCds I3738 12 45 25.5 +19 13 42 1o MW6 I3738 sw * 12 45 25.30 +19 13 44.1 2 0.70 3.68 WS HCds I3738 gal 12 45 25.74 +19 13 51.1 1 HCds I3738 ne * 12 45 26.93 +19 13 57.7 1 HCds I3739 12 45 32.3 +12 59 50 1o Sn I3740 12 45 30.583 +20 48 56.59 1 KHJ I3741 12 45 33.20 +19 12 13.2 2 1.00 5.16 WS HCds I3742 12 45 31.81 +13 19 54.5 7 2.10 3.70 YOF VCC CCA YZYH WS Pds UZC I3743 12 45 41.2 +11 06 03 2 3.12 5.66 WS HCds I3743 nw * 12 45 40.63 +11 06 15.3 1 HCds I3743 se * 12 45 41.87 +11 05 59.2 1 HCds I3743 nearby * w 12 45 39.69 +11 05 53.7 1 HCds I3743 nearby * sw 12 45 40.00 +11 05 40.8 1 HCds I3744 12 45 41.480 +19 30 01.16 1 KHJ I3745 12 45 44.896 +19 10 37.50 4 1.70 1.26 HCds KHJ UZC Pds I3746 12 45 31.850 +37 49 24.00 2 0.40 0.47 SBG2 KHJ I3747 12 45 34.49 +37 58 06.5 2 0.25 2.47 WS HCds I3748 12 45 50.96 +19 25 46.9 2 0.00 4.31 WS HCds I3749 12 45 51.39 +19 32 09.2 1 HCds I3750 12 45 57.07 +19 06 15.6 1 HCds I3750 nearby * s 12 45 57.21 +19 05 57.5 2 0.50 3.68 HCds WS I3751 12 45 45.150 +37 49 23.44 1 KHJ I3752 12 46 04.11 +19 00 42.0 1 HCds I3753 12 46 04.37 +19 07 15.4 2 1.00 2.05 WS HCds I3754 12 46 15.57 +08 20 53.8 4 1.00 0.87 UZC YOF WS CCA I3755 12 46 09.4 +19 09 25 2 0.00 1.41 WS HCds I3755 sw * 12 46 09.18 +19 09 23.1 1 HCds I3755 ne * 12 46 09.54 +19 09 29.5 1 HCds I3756 12 46 10.00 +11 54 52.4 3 1.58 2.12 HCo GD HCds I3757 12 45 59.8 +38 30 51 2 0.00 5.66 WS HCds I3757 w * 12 45 58.73 +38 30 57.1 1 HCds I3757 s * 12 45 59.71 +38 30 51.1 1 HCds I3757 e * 12 46 00.91 +38 30 56.4 1 HCds I3758 12 45 59.673 +40 46 29.18 3 0.40 0.26 SBG2 KHJ UZC I3759 12 46 17.7 +20 46 57 1 WS I3760 12 46 18.271 +11 52 24.53 2 0.20 0.28 KHJ GSC I3761 12 46 27.304 +20 17 20.54 1 KHJ I3762 12 46 37.7 +22 14 42 1 WS I3763 12 46 46.0 +21 59 05 2 0.98 2.12 WS K15 I3764=I0817 12 46 56.699 +09 51 27.19 4 2.69 2.99 VCC HCds KHJ UZC I3764=I0817 comp 12 46 57.47 +09 51 17.7 1 HCds I3765 12 46 35.01 +38 34 26.7 2 0.33 2.97 HCds WS I3766 12 46 53.520 +19 06 38.10 1 KHJ I3767 12 46 55.5 +10 10 53 2 0.00 1.41 WS HCo I3768 12 46 40.72 +40 35 50.1 2 0.00 2.05 WS HCds I3769 12 46 48.01 +40 28 12.3 2 0.40 2.19 HCds WS I3770 12 47 15.61 +09 11 59.2 1 HCds I3771 12 46 52.679 +39 10 22.72 1 KHJ I3772 12 46 56.05 +36 31 51.6 2 0.93 2.40 SBG2 WS I3773 12 47 15.32 +10 12 12.6 7 0.60 1.66 WS GSC VCC UZC DC JA CCA I3773 * 12 47 16.5 +10 13 05 1o Sn I3774 12 47 01.09 +36 17 16.7 4 1.10 1.87 WS Pds HCds CCA I3775 12 47 16.2 +11 45 36 2 2.07 2.12 WS JA I3776 12 47 12.1 +22 29 00 1 WS I3777 12 47 25.39 +09 08 39.2 1 HCds I3778 12 47 01.983 +40 35 47.29 3 0.18 0.52 HCds KHJ SBG2 I3779 12 47 20.7 +12 09 56 2 1.04 2.12 WS UZC I3780 12 47 08.17 +40 14 09.1 2 1.21 1.41 HCds WS I3781 12 47 24.6 +22 34 09 2 0.00 2.83 WS HCds I3781 nw * 12 47 24.33 +22 34 13.5 1 HCds I3781 se * 12 47 24.86 +22 34 08.2 1 HCds I3781 * near n 12 47 24.89 +22 34 36.4 1 HCds I3781 * near nw 12 47 22.49 +22 34 28.2 1 HCds I3782 12 47 15.60 +40 22 06.7 1 HCds I3782 * near nw 12 47 14.48 +40 22 17.2 1 HCds I3782 * near w 12 47 12.57 +40 22 10.4 1 HCds I3783 12 47 27.81 +40 33 59.3 3 0.35 2.57 HCds SBG2 WS I3784 12 47 50.697 +19 23 02.56 1 KHJ I3785 12 47 52.2 +19 16 27 1 WS I3786 12 47 36.895 +39 02 45.21 1 KHJ I3787 12 47 42.52 +40 37 24.1 2 2.08 2.19 HCds WS I3787 comp * 12 47 41.23 +40 37 25.4 1 HCds I3788 12 48 07.3 +18 52 02 1 WS I3789 12 48 07.00 +20 11 37.7 2 0.70 1.34 HCds WS I3790 12 48 14.71 +11 06 29.2 1 HCds I3791=N4695 12 47 32.2 +54 22 30 3 1.81 5.69 WS UZC DC I3792 12 48 14.7 +11 04 50 1o Sn I3792: ** 12 48 14.3 +11 05 11 2 2.08 0.71 HCds WS I3792: n * 12 48 14.17 +11 05 14.9 1 HCds I3792: s * 12 48 14.07 +11 05 06.8 1 HCds I3793 12 48 11.8 +19 09 03 1 WS I3794 12 48 21.43 +19 10 11.3 2 0.90 4.67 WS HCds I3795 12 48 05.05 +40 43 07.4 2 0.48 2.05 WS SBG2 I3796 12 48 27.12 +20 02 13.0 2 2.39 4.17 HCds WS I3797 12 48 34.9 +11 35 52 1o Sn I3798 12 48 43.05 +09 14 27.5 2 0.73 1.77 HCds WS I3799 12 48 59.5 -14 23 57 3 1.68 1.00 WS SPC APMn I3800 12 48 26.8 +36 34 33 1 HCds I3800 w 12 48 26.36 +36 34 34.3 1 HCds I3800 e 12 48 27.21 +36 34 30.6 2 0.76 2.05 HCds WS I3800 comp? 12 48 36.4 +36 34 30 1 WS I3801 12 49 00.6 +10 57 21 1o Sn I3802 12 48 42.51 +38 14 48.4 1 HCds I3803 12 49 04.42 +10 37 54.7 1 HCds I3804=N4711 12 48 45.88 +35 19 58.1 6 0.93 2.42 WS GHD1 SBG2 CCA UZC DC I3805 12 48 42.4 +38 15 12 1 HCds I3805 w * 12 48 42.00 +38 15 11.9 1 HCds I3805 e * 12 48 42.66 +38 15 10.4 2 1.58 2.69 WS HCds I3806 12 48 55.36 +14 54 26.8 4 1.56 2.24 GH WS UZC CCA I3807 12 49 29 -04 24.1 1o Sw11 I3808 12 48 58.73 +40 35 45.6 4 1.03 3.09 SDP HCds SBG2 WS I3808 nearby * 12 49 00.97 +40 35 39.2 1 HCds I3809 12 49 04.501 +36 29 20.23 1 KHJ I3810 12 49 03.14 +40 38 46.8 2 1.12 2.90 HCds WS I3811 12 49 25.58 +21 27 43.8 2 1.08 2.55 HCds WS I3812 12 49 53.75 -06 43 04.1 2 0.74 2.47 HCds Pds2 I3812 e comp 12 49 59.54 -06 42 59.0 1 HCds I3812 se comp 12 50 04.97 -06 43 22.4 1 HCds I3813 12 50 02.4 -25 55 13 2 2.87 0.00 WS ESOB I3814 12 49 32.2 +20 02 57 1 WS I3815 12 49 38.5 +19 16 26 1 WS I3816 12 49 28.458 +37 13 47.81 3 0.56 2.35 HCds KHJ Pds I3816 n comp 12 49 28.54 +37 14 05.7 1 HCds I3816 e comp 12 49 30.39 +37 13 50.9 1 HCds I3817 12 49 43.46 +22 49 52.8 2 0.88 2.19 WS HCds I3818 12 49 46.8 +21 45 04 1 WS I3819 12 50 16.365 -14 22 50.45 2 0.23 0.32 HCds KHJ I3820 12 49 38.95 +37 07 01.2 2 0.84 2.62 HCds WS I3821 12 49 57.59 +20 58 07.5 2 0.69 1.41 HCds WS I3822 12 50 22.62 -14 19 21.0 2 1.23 2.05 WS HCds I3823 12 49 43.95 +40 53 01.2 1 HCds I3824 12 50 30.517 -14 25 32.93 2 0.86 0.47 HCds KHJ I3825 12 50 36.97 -14 28 57.9 1 HCds I3826 12 50 39.8 -09 01 54 2 0.00 3.54 WS APMn I3827=I3838 12 50 52.06 -14 29 32.2 2 1.65 2.55 HCds WS I3827=I3838 s comp 12 50 50.57 -14 29 37.2 1 HCds I3827=I3838 nw comp 12 50 46.95 -14 29 00.0 1 HCds I3828 12 50 20.705 +37 56 55.61 1 KHJ I3829 AN 12 51 22 -27 50.3 1o Sw11 I3829 PA 12 51 23 -29 50.2 1o Sw11 I3829 MN 12 51 23 -30 00.2 1o Sw11 I3829: 12 52 13.22 -29 50 27.5 3 0.84 2.04 ESOB WS HCds I3829?? 12 51 32.35 -27 46 59.8 2 0.19 0.92 HCds ESOB I3830 12 50 51.34 +19 50 13.6 1 HCds I3831 12 51 18.53 -14 34 25.2 3 1.09 1.22 APMn SPC HCds I3832 12 50 49.0 +39 48 33 1 WS I3833=?N4722 12 51 32.31 -13 19 49.3 4 1.15 1.63 HCds WS SPC APMn I3834 12 51 32.31 -14 13 16.5 3 1.38 0.29 HCds WS SPC I3835 12 50 55.85 +40 11 10.8 2 0.00 1.84 WS GSC I3836 12 51 03.8 +40 11 02 2 2.42 3.54 WS HCo I3837 12 51 33.0 +19 43 20 1 WS I3838=I3827 12 50 52.06 -14 29 32.2 2 1.65 2.55 HCds WS I3838=I3827 s comp 12 50 50.57 -14 29 37.2 1 HCds I3838=I3827 nw comp 12 50 46.95 -14 29 00.0 1 HCds I3839 12 51 46.11 +20 25 18.3 1 HCds I3840 12 51 46.03 +21 44 06.1 1 HCds I3841 12 51 50.6 +22 20 38 2 0.98 2.83 HCds WS I3841 s * 12 51 50.47 +22 20 36.2 1 HCds I3841 n * 12 51 50.60 +22 20 43.4 1 HCds I3842 12 51 35.885 +40 22 16.95 1 KHJ I3843 12 51 39.0 +39 00 00 1 WS I3844 12 52 06.616 +39 49 04.45 2 1.73 1.15 KHJ Pds2 I3845 12 52 08.66 +38 37 08.4 1 HCds I3845 comp gal 12 52 09.09 +38 37 02.3 1 HCds I3846 12 52 39.2 +13 38 49 1o Sn I3847 12 52 33.722 +22 03 51.69 2 0.35 1.08 K15 KHJ I3848 12 52 40.4 +21 24 50 1o MW6 I3848nw 12 52 39.98 +21 24 59.4 2 0.10 3.39 HCds WS I3848se 12 52 40.46 +21 24 52.4 2 0.39 3.39 HCds WS I3849 12 52 36.86 +40 46 19.1 2 1.84 2.76 HCds WS I3849 * 14 ne 12 52 37.65 +40 46 36.2 1 HCds I3850 12 52 39.6 +40 06 08 1 WS I3851 12 53 04.65 +21 54 33.2 2 0.69 2.55 HCds WS I3852 12 53 03.20 +35 46 20.9 3 0.14 0.55 CCA WS K04 I3853 12 53 10.5 +38 49 43 1 WS I3854 12 53 14.543 +40 50 53.38 1 KHJ I3854 comp 12 53 12.689 +40 50 54.17 1 KHJ I3855 12 53 22.703 +36 47 09.34 2 0.08 0.30 KHJ GSC I3856 12 53 45.2 +20 05 33 1 WS I3857 12 53 56.1 +19 36 22 1 WS I3858 12 53 55.59 +20 47 18.9 2 0.99 2.26 HCds WS I3858 * 13 sp 12 53 54.34 +20 47 06.6 1 HCds I3859 12 54 19.85 -09 07 03.5 2 0.73 0.07 HCds WS I3860 12 54 06.59 +19 18 02.6 1 HCds I3861 12 53 50.8 +38 16 47 1 WS I3862 12 53 53.2 +36 05 09 2 0.00 0.71 WS K04 I3863 12 53 53.9 +38 28 50 2 0.00 3.54 HCds WS I3863 gal 12 53 53.83 +38 28 50.0 1 HCds I3863 * 12 53 54.05 +38 28 56.6 1 HCds I3864 12 54 12.3 +18 57 04 2 0.00 2.83 WS HCds I3864 gal 12 54 12.21 +18 57 07.4 1 HCds I3864 * 12 54 12.39 +18 57 05.9 1 HCds I3864 * 14 s 12 54 12.47 +18 56 33.1 1 HCds I3865 12 54 14.2 +18 52 04 1 WS I3866 12 54 15.9 +22 21 34 1o MW6 I3866n 12 54 15.49 +22 21 50.0 2 0.59 1.98 HCds WS I3866s 12 54 14.98 +22 21 33.6 2 0.78 1.48 HCds WS I3866 lsb comp 12 54 13.82 +22 21 41.9 1 HCds I3867 12 54 19.589 +18 56 29.93 1 KHJ I3868 12 54 20.9 +18 59 23 1 WS I3869 12 54 21.2 +18 58 15 1 WS I3870 12 54 21.6 +22 22 49 1 WS I3871 12 54 25.8 +18 55 41 1 WS I3872 12 54 30.5 +18 57 43 1 WS I3873 12 54 31.6 +18 52 54 1 WS I3874 12 54 34.424 +18 57 24.80 1 KHJ I3875 12 54 37.2 +22 02 06 1 WS I3876 12 54 48.29 +19 00 57.7 1 HCds I3876 comp 12 54 50.08 +19 01 14.7 1 HCds I3877 12 54 48.60 +19 10 35.7 2 0.80 0.78 GSC UZC I3878 12 54 29.52 +40 04 11.2 2 0.40 1.70 HCds WS I3879 12 54 31.9 +38 37 42 2 0.83 2.83 HCo WS I3880 12 54 47.985 +22 30 07.79 1 KHJ I3881 12 54 53.9 +19 07 03 1 HCo I3882 12 54 53.7 +22 34 27 1 WS I3883 12 55 13.48 -08 07 12.1 3 0.45 2.29 WS GSC HCds I3884 12 54 57.739 +19 40 52.20 1 KHJ I3885 12 54 42.7 +37 09 13 1 WS I3886 12 55 00.19 +19 00 44.7 1 HCds I3886 **n, ne* 12 55 00.78 +19 02 03.3 2 0.40 2.83 WS HCds I3886 **n, sw* 12 55 00.05 +19 01 48.5 1 HCds I3887 12 54 43.6 +40 18 18 1 HCds I3887 nw * 12 54 43.42 +40 18 20.3 1 HCds I3887 se * 12 54 43.72 +40 18 15.8 2 0.81 0.85 HCds WS I3888 12 54 46.481 +39 34 16.06 2 2.01 1.13 KHJ Pds I3889 12 54 50.85 +36 01 01.3 1 HCds I3889 nearby w * 12 54 51.28 +36 01 44.9 1 HCds I3889 nearby e * 12 54 53.09 +36 01 51.2 1 HCds I3889 nearby gal 12 54 50.96 +36 02 10.5 2 1.11 3.11 HCds WS I3890 12 54 50.1 +37 11 04 1 WS I3891 12 54 58.25 +36 03 08.6 2 0.77 3.11 HCds WS I3892 12 55 06.05 +39 13 19.7 3 0.75 1.21 WS SBG2 CCA I3893 12 55 07.4 +38 37 24 1 HCo I3894 12 55 27.4 +19 04 06 2 4.00 3.54 WS HCds I3894 w * 12 55 27.25 +19 04 09.8 1 HCds I3894 e * 12 55 27.96 +19 04 07.7 1 HCds I3894 * 15 ne 12 55 29.71 +19 04 06.6 1 HCds I3895 12 55 09.33 +39 12 11.6 2 0.74 1.27 WS SBG2 I3896 12 56 43.4 -50 20 47 2 7.49 5.66 WS ESOB I3896A 12 55 30.6 -50 04 16 2 3.42 2.12 ESOB WS I3897 12 55 19.104 +39 40 21.36 1 KHJ I3898 12 55 23.848 +37 34 57.74 1 KHJ I3899 12 55 40.664 +20 38 10.75 1 KHJ I3900 12 55 41.49 +27 15 01.4 5 4.64 0.45 DFOT BPP GSC UZC GHD1 I3901 12 55 50.49 +21 56 20.8 1 HCds I3902 12 55 38.58 +35 59 45.0 1 HCds I3903 12 55 38.65 +40 23 58.8 2 0.72 2.33 WS HCds I3904 12 55 45.56 +36 17 35.3 2 0.60 2.90 WS SBG2 I3905 12 56 08.7 +19 51 07 1 HCds I3905nw 12 56 07.99 +19 51 21.2 1 HCds I3905m 12 56 08.64 +19 51 09.6 2 1.10 2.90 HCds WS I3905se 12 56 09.26 +19 50 48.6 1 HCds I3905 comp 12 56 10.72 +19 50 33.8 1 HCds I3906 12 55 51.06 +40 27 49.9 1 HCds I3907 12 56 18.3 +18 47 00 1 WS I3908 12 56 40.35 -07 33 37.1 4 1.47 6.76 APMn WS SPC HCds I3909 12 56 02.7 +40 23 04 1 WS I3910 12 56 04.7 +39 43 11 2 2.44 0.71 HCds WS I3910 s * 12 56 04.39 +39 43 07.2 1 HCds I3910 n * 12 56 04.67 +39 43 16.1 1 HCds I3911 12 56 09.6 +35 38 09 1o MW5 I3911ne 12 56 09.62 +35 38 20.3 2 0.17 3.75 HCds WS I3911sw 12 56 09.21 +35 38 11.9 2 0.26 1.77 HCds WS I3912 12 56 07.52 +39 54 39.5 1 HCds I3913 12 56 28.51 +27 17 27.8 6 2.00 2.45 K15 UZC BPP DFOT K02 WS I3914 12 56 22.7 +36 21 35 1 WS I3914 se G 12 56 22.73 +36 21 40.0 1 HCds I3914 nw * 12 56 21.43 +36 21 51.4 1 HCds I3915 12 56 38.94 +20 17 30.8 2 0.70 2.47 HCo HCds I3915 nearby * 12 56 39.14 +20 17 21.5 1 HCds I3916 12 56 31.22 +38 36 49.0 5 0.81 1.39 HCds SBG2 GSC WS CCA I3917 12 56 51.9 +22 00 17 1o MW6 I3917 * 12 56 51.62 +22 00 23.3 2 0.10 0.07 HCds HCo I3918 12 56 53.46 +22 22 25.3 4 0.66 2.94 GH HCds WS K06 I3919 12 56 48.72 +38 35 21.1 2 0.00 1.27 GSC HCds I3920 12 56 50.043 +39 57 31.19 1 KHJ I3921 12 56 56.67 +38 38 22.1 3 1.28 1.91 HCds HCo WS I3922 12 56 57.50 +38 28 41.6 2 0.00 1.48 WS GSC I3923 12 57 01.0 +37 57 20 2 1.67 0.00 WS HCds I3923 w * 12 57 00.84 +37 57 20.7 1 HCds I3923 e * 12 57 01.27 +37 57 21.1 1 HCds I3924 12 57 24.9 +18 46 51 1 WS I3925 12 57 15.2 +36 25 19 2 2.55 2.12 HCds WS I3925 s * 12 57 15.00 +36 25 18.2 1 HCds I3925 n * 12 57 15.17 +36 25 22.5 1 HCds I3926 12 57 30.38 +22 48 43.9 1 HCds I3927 12 58 10.5 -22 52 35 2 1.96 0.00 WS ESOB I3928 12 57 18.26 +40 26 29.2 2 0.40 1.84 HCds WS I3928 nearby * 12 57 17.06 +40 26 23.1 1 HCds I3929 12 57 41.088 +20 23 48.76 1 KHJ I3930 12 57 22.4 +38 45 50 1 WS I3931 12 57 57.16 +19 37 02.1 2 0.50 3.82 HCds WS I3932 12 58 05.29 +19 35 02.7 1 HCds I3933 12 57 57.07 +36 38 43.4 1 HCds I3934 12 58 17.49 +18 49 30.0 2 0.40 3.18 HCds WS I3935=N4849 12 58 12.74 +26 23 47.9 8 2.22 1.70 BPP DFOT UZC WS JG CCA GHD1 DC I3936 12 58 20.1 +19 03 27 2 3.00 2.83 HCds WS I3936 s * 12 58 19.04 +19 03 00.8 2 0.10 1.41 HCo HCds I3936 nw * 12 58 19.04 +19 03 34.3 1 HCds I3936 nm * 12 58 20.15 +19 03 31.2 1 HCds I3936 ne * 12 58 20.59 +19 03 25.1 1 HCds I3936 nearby * 12 58 24.32 +19 03 38.6 1 HCds I3937 12 58 24.66 +18 49 06.2 2 0.70 3.25 HCds WS I3938 12 58 25.19 +18 45 10.2 1 HCds I3938 nearby * 12 58 23.65 +18 44 38.1 1 HCds I3939 12 58 27.91 +18 45 07.4 1 HCds I3940 12 58 16.399 +35 50 20.24 2 1.56 0.93 K05 KHJ I3941 12 58 13.961 +39 46 22.58 2 0.84 0.88 KHJ HCds I3942 12 58 19.74 +36 06 34.7 1 HCds I3943 12 58 36.38 +28 06 47.0 5 0.63 2.71 DFOT HC BPP GSC WS I3944 12 58 44.75 +23 46 51.2 2 1.07 2.69 GSC WS I3945 12 58 29.7 +39 56 05 1 WS I3946 12 58 48.92 +27 48 35.4 4 2.81 2.14 DFOT GSC UZC WS I3947 12 58 52.135 +27 47 04.37 4 0.40 2.08 KHJ DFOT HC GSC I3948 12 58 58.14 +24 03 40.0 2 0.77 2.05 HCds WS I3949 12 58 55.98 +27 49 58.8 6 1.64 2.36 K02 UZC HC DFOT GSC CCA I3950 12 59 06.105 +18 44 07.70 1 KHJ I3951 12 59 10.174 +18 45 51.12 1 KHJ I3952 12 58 52.1 +38 52 08 1 WS I3953 12 59 09.0 +23 04 59 1 WS I3954 12 59 12.7 +19 16 18 1 WS I3955 12 59 06.04 +27 59 46.7 5 1.62 2.43 ZH GSC DFOT WS HC I3956 12 58 56.386 +37 23 52.96 1 KHJ I3957 12 59 07.54 +27 46 01.8 4 0.66 2.74 DFOT WS GSC HC I3958 12 59 11.37 +24 01 19.5 2 0.10 2.47 WS HCds I3959 12 59 08.21 +27 47 01.8 4 1.10 2.15 UZC DFOT GSC WS I3960 12 59 07.82 +27 51 16.4 6 2.62 2.32 WS HC UZC DFOT GSC GHD1 I3960A 12 59 09.6 +27 52 00 2 2.81 2.83 HC WS I3961=N4861 12 59 01.95 +34 51 41.0 5 3.28 5.36 GHD1 SBG2 HCds K05 DC I3962 12 59 15.0 +23 40 03 2 0.97 2.12 HCo WS I3963 12 59 13.54 +27 46 26.5 3 0.63 2.34 DFOT GSC WS I3964 12 59 13.65 +27 51 02.9 2 2.15 4.31 HCds HC I3965 12 59 22.8 +18 50 32 1 WS I3966 12 59 13.1 +35 51 16 2 0.00 4.95 WS K05 I3967 12 59 12.913 +36 07 45.16 2 0.02 0.69 KHJ SBG2 I3968 12 59 25.60 +27 58 20.8 3 1.26 2.61 GSC WS HC I3969 12 59 33.0 +19 39 12 1o MW6 I3969 * 12 59 31.73 +19 39 00.4 2 1.60 1.84 HCds HCo I3969 ne 12 59 33.73 +19 39 16.2 2 1.50 1.48 HCds HCo I3969 nw 12 59 32.68 +19 39 08.7 3 1.59 3.28 WS HCds HCo I3969 s 12 59 32.62 +19 38 51.0 2 1.79 1.13 HCds HCo I3970 12 59 11.45 +40 24 08.2 1 HCds I3970 * se 12 59 12.56 +40 24 01.8 1 HCds I3970? 12 59 12.1 +40 24 04 1 WS I3971 12 59 31.772 +22 50 40.97 1 KHJ I3972 12 59 16.98 +37 16 48.0 1 HCds I3973 12 59 30.82 +27 53 01.8 4 0.20 1.83 HC UZC GSC DFOT I3974=N4947 13 05 20.5 -35 20 15 2 4.34 0.71 WS ESOB I3975 12 59 15.62 +38 52 57.0 2 0.49 1.41 WS GSC I3976 12 59 29.36 +27 50 58.7 5 1.71 3.09 HC UZC DFOT GSC WS I3977 12 59 19.7 +36 47 53 1 HCo I3978 12 59 37.37 +19 37 20.8 3 0.72 4.12 HCo HCds WS I3979 12 59 21.2 +36 19 34 1o MW5 I3979 * 12 59 20.75 +36 19 27.6 1 HCds I3979 * near n 12 59 20.59 +36 20 07.3 2 2.98 1.77 HCds HCo I3980 12 59 18.6 +39 09 01 1 WS I3981 12 59 21.4 +37 13 40 1 HCo I3982 12 59 18.56 +40 04 50.3 1 HCds I3982 * near sw 12 59 17.79 +40 04 31.6 1 HCds I3982 * near ne 12 59 19.79 +40 04 58.0 1 HCds I3983 12 59 20.7 +39 14 50 1 HCds I3983 sw * 12 59 20.39 +39 14 48.0 1 HCds I3983 ne * 12 59 21.03 +39 14 52.4 1 HCds I3984 12 59 42.2 +19 37 34 1o MW6 I3984 e * 12 59 42.22 +19 37 31.1 1 HCds I3984 nw gal 12 59 40.39 +19 37 32.6 1 HCds I3984 sw gal 12 59 40.20 +19 37 21.3 2 0.10 4.31 HCds WS I3985 12 59 43.030 +19 35 26.94 3 2.82 2.24 HCo HCds KHJ I3986 13 01 32.2 -32 17 28 2 0.00 2.83 Pds WS I3987 12 59 25.039 +38 44 00.19 2 0.13 0.27 GSC KHJ I3988 12 59 26.92 +37 14 41.0 2 1.68 1.20 HCds HCo I3989 12 59 28.66 +36 45 24.8 2 1.27 0.78 HCds HCo I3990 12 59 39.13 +28 53 43.5 4 1.64 2.84 UZC BPP DFOT WS I3991 12 59 39.73 +28 55 34.3 4 0.63 2.70 BPP UZC DFOT WS I3992 12 59 33.37 +36 46 18.9 2 2.46 2.26 HCds HCo I3992 * near w 12 59 30.64 +36 46 24.3 1 HCds I3993 12 59 30.478 +40 36 06.22 1 KHJ I3994 12 59 50.7 +22 42 55 1 WS I3995 12 59 33.93 +39 02 24.6 2 0.16 0.35 HCo HCo I3996 12 59 31.51 +40 28 01.7 2 0.32 3.39 HCds WS I3997 12 59 36.9 +36 41 40 2 1.69 2.12 HCo WS I3998 12 59 46.78 +27 58 24.0 5 1.43 2.77 HC ZH GSC DFOT WS I3999:=N4862 12 59 30.91 -14 07 55.4 5 2.62 0.83 WS HCds GSC SPC HC I4000 12 59 36.6 +39 35 13 1 WS I4001 12 59 37.86 +38 52 10.7 2 0.82 3.25 WS GSC I4002 12 59 40.891 +36 45 49.69 2 1.78 0.33 KHJ HCo I4003 12 59 39.311 +38 48 55.79 4 0.66 0.26 Pds KHJ GSC SBG2 I4004 12 59 42.79 +38 48 39.8 5 0.37 1.35 GSC SBG2 UZC WS Pds I4005 13 00 02.6 +22 38 22 2 0.98 1.41 HCds WS I4005 nw * 13 00 02.35 +22 38 29.1 1 HCds I4005 se * 13 00 02.69 +22 38 19.1 1 HCds I4006 12 59 49.4 +37 00 32 1o MW5 I4006 * 12 59 48.77 +37 00 38.5 2 3.04 4.17 HCds WS I4007 13 00 06.9 +19 57 48 2 1.00 2.83 HCds WS I4007ne 13 00 07.01 +19 57 52.2 2 0.70 2.05 HCds WS I4007sw 13 00 06.69 +19 57 45.6 2 1.19 2.62 HCds WS I4008 13 00 05.9 +22 21 00 2 2.94 1.41 HCds WS I4008 sw * 13 00 05.48 +22 21 00.9 1 HCds I4008 ne * 13 00 06.00 +22 21 03.5 1 HCds I4009 12 59 52.8 +36 39 38 1 HCo I4010 12 59 53.978 +37 51 31.51 2 0.72 1.16 HCo KHJ I4011 13 00 06.52 +28 00 11.4 3 1.37 2.84 GSC WS HC I4012 13 00 07.88 +28 04 40.5 6 3.58 1.43 GHD1 ZH DFOT GSC HC WS I4013 12 59 57.9 +37 11 54 2 0.84 4.24 HCo WS I4014 13 00 13.9 +22 29 54 1 WS I4015=N4893 12 59 59.640 +37 11 36.23 4 0.10 0.34 CCA SBG2 KHJ GSC I4016=N4893A 12 59 59.86 +37 11 15.3 4 0.74 2.34 SBG2 HCo CCA WS I4017 13 00 15.8 +22 33 17 1 WS I4018 12 59 57.6 +40 29 09 1 HCds I4018 gal 12 59 57.36 +40 29 19.0 2 0.96 1.63 HCds WS I4018 * 12 59 57.93 +40 28 59.3 1 HCds I4019 13 00 17.4 +23 43 14 1 HCds I4019 se * 13 00 17.20 +23 43 10.4 2 0.58 3.39 WS HCds I4019 nw * 13 00 17.76 +23 43 17.6 1 HCds I4020 13 00 03.4 +38 36 32 1 WS I4021 13 00 14.65 +28 02 24.3 6 3.03 3.75 GHD1 ZH HC DFOT GSC WS I4022 13 00 04.91 +38 28 46.1 1 HCds I4023 13 00 26.49 +19 05 47.9 2 0.30 3.82 HCds WS I4024 13 00 03.9 +40 30 29 1 WS I4025 13 00 28.25 +19 06 18.8 1 HCds I4026 13 00 22.06 +28 02 47.1 7 3.08 2.24 ZH HC UZC DFOT GSC KEBA WS I4027 13 00 13.8 +37 08 25 2 0.84 2.12 HCo WS I4028 13 00 16.20 +36 15 12.8 4 2.76 3.24 SBG2 UZC CCA WS I4029 13 00 14.2 +38 45 32 1 WS I4030 13 00 27.95 +27 57 17.6 3 1.34 3.21 HC GSC WS I4031 13 00 15.5 +39 08 39 1 WS I4032 13 00 25.64 +28 52 03.3 4 1.31 1.65 BPP UZC DFOT WS I4033 13 00 28.52 +27 58 18.8 2 2.15 2.26 GSC WS I4034 13 00 19.62 +37 02 46.2 3 2.39 3.61 HCds HCo WS I4035 13 00 17.3 +40 18 05 1 HCds I4035 sw 13 00 16.71 +40 17 57.6 2 0.40 3.46 WS HCds I4035 ne 13 00 17.85 +40 18 10.6 1 HCds I4036 13 00 20.52 +36 54 34.6 1 HCds I4037 13 00 19.5 +39 00 05 1 WS I4038 13 00 21.688 +37 02 22.15 3 1.75 1.71 HCds KHJ GSC I4039 13 00 39.376 +21 41 29.72 1 KHJ I4040 13 00 37.88 +28 03 25.7 5 1.88 2.63 UZC K02 DFOT GSC WS I4041 13 00 40.81 +27 59 45.6 5 1.91 3.46 ZH WS DFOT GSC HC I4042 13 00 42.68 +27 58 15.6 5 0.98 2.55 HC UZC WS DFOT GSC I4042A 13 00 43.0 +27 57 42 1 HC I4043 13 00 34.75 +37 04 16.9 3 2.13 3.93 HCds WS HCo I4044 13 00 47.47 +27 55 17.2 3 0.69 1.97 GSC WS HC I4045 13 00 48.55 +28 05 23.9 7 3.85 2.61 GHD1 ZH UZC DFOT GSC HC WS I4046 13 00 39.50 +36 41 08.1 2 3.73 5.02 HCds WS I4047 13 00 57.620 +19 41 13.19 2 1.33 0.79 Pds2 KHJ I4048 13 00 38.1 +39 49 48 2 1.62 1.41 HCo WS I4049 13 00 42.685 +36 20 43.20 4 0.32 0.34 KHJ UZC SBG2 CCA I4050 13 00 43.8 +36 44 19 2 5.08 0.71 HCds WS I4050 s * 13 00 43.21 +36 44 10.3 1 HCds I4050 n * 13 00 43.71 +36 44 26.5 1 HCds I4051 13 00 51.516 +28 02 33.86 7 0.98 1.46 UZC UA20 DFOT WS GSCA APMN GSC2 I4052 13 00 41.82 +39 40 05.3 1 HCds I4053 13 01 01.29 +22 55 27.5 2 0.68 3.75 HCds WS I4054 13 01 01.30 +22 54 16.5 2 0.59 3.75 HCds WS I4055 13 01 02.6 +22 54 30 1o MW6 I4056 13 00 44.2 +39 45 14 1 HCds I4056 galaxy 13 00 44.30 +39 45 14.7 5 1.42 1.16 HCds Pds WS HCo CCA I4056 * 13 00 44.32 +39 45 07.3 1 HCds I4057 13 01 05.25 +23 09 35.6 3 2.35 8.08 HCds WS HCds I4057 s gal 13 01 05.11 +23 09 39.0 1 HCds I4057 w gal 13 01 04.73 +23 09 46.8 1 HCds I4057 e gal 13 01 05.98 +23 09 55.7 1 HCds I4057 m gal 13 01 05.37 +23 09 50.9 1 HCds I4058 13 01 09.3 +19 29 35 1 WS I4059 13 01 15.4 +19 16 20 1 WS I4060 13 00 52.4 +40 35 01 1 WS I4061 13 00 57.7 +39 34 58 2 2.44 0.71 HCo WS I4061e 13 00 58.0 +39 34 58 2 1.63 0.00 HCo WS I4061w 13 00 57.3 +39 34 57 2 1.63 0.71 HCo WS I4062 13 00 58.6 +39 51 29 2 0.81 1.41 HCo WS I4063 13 01 06.58 +39 14 41.1 2 0.00 2.83 WS HCds I4064 13 01 06.71 +39 50 28.1 6 0.98 1.06 SBG2 Pds WS UZC GSC CCA I4065 13 01 10.96 +39 44 38.7 2 0.81 2.12 WS GSC I4065 comp 13 01 12.1 +39 45 20 1 HCo I4066 13 01 40.1 +19 16 18 1 WS I4067 13 01 20.05 +39 56 25.3 1 HCds I4068 13 01 20.16 +39 53 55.2 4 0.56 2.57 WS HCds Pds2 GSC I4069 13 01 24.8 +36 06 43 2 2.56 2.12 HCo WS I4070 13 01 43.2 +19 18 03 1 WS I4071 13 02 03.94 -07 36 10.9 2 0.53 1.98 HCds WS I4072 13 01 25.8 +37 21 13 1 WS I4073 13 01 25.669 +39 54 50.71 4 0.54 1.61 HCds Pds GSC KHJ I4074 13 01 48.8 +19 00 28 1 WS I4075 13 01 48.6 +19 57 50 1 WS I4076 13 01 48.583 +23 23 20.48 1 KHJ I4077 13 01 34.040 +37 23 10.36 2 0.69 0.33 K05 KHJ I4078 13 01 35.5 +36 35 38 1 HCds I4078 sw * 13 01 35.20 +36 35 36.6 1 HCds I4078 ne * 13 01 35.72 +36 35 38.7 2 0.93 2.97 HCds HCo I4079 13 01 56.2 +19 15 02 1 HCds I4079 galaxy 13 01 56.73 +19 14 54.1 2 1.50 3.18 HCds WS I4079 * 13 01 55.85 +19 15 07.5 1 HCds I4080 13 01 57.9 +19 15 15 2 1.00 2.12 HCds WS I4080ne 13 01 58.14 +19 15 20.4 2 1.20 2.12 HCds WS I4080sw 13 01 57.58 +19 15 10.6 2 0.50 2.47 HCds WS I4081 13 01 55.305 +22 46 15.68 1 KHJ I4082 13 01 39.3 +37 20 24 1 WS I4083 13 01 38.70 +38 08 31.7 2 0.25 2.83 WS HCds I4084 13 01 41.1 +36 57 57 2 1.69 3.54 HCds WS I4084 w * 13 01 40.58 +36 57 57.6 1 HCds I4084 e * 13 01 41.29 +36 58 01.3 1 HCds I4085 13 01 38.197 +39 42 09.56 1 KHJ I4086 13 01 42.72 +36 38 53.3 5 3.64 2.37 HCo HCds SBG2 CCA WS I4087 13 02 00.4 +19 59 36 1 WS I4088 13 01 43.42 +29 02 39.7 5 1.26 1.94 UZC DFOT CCA WS BPP I4089 13 02 01.7 +19 30 07 1 WS I4090 13 01 46.4 +36 50 13 1o MW5 I4090 * 13 01 46.03 +36 50 19.5 1 HCds I4091 13 02 12.8 +19 53 31 1 WS I4092 13 02 13.72 +19 11 00.6 2 1.70 3.39 HCds WS I4093 13 02 03 +28 59.7 1o Bige I4094 13 01 58.573 +37 47 41.22 1 KHJ I4094 comp 13 01 59.0 +37 47 17 1 WS I4095 13 02 20.374 +19 05 58.74 1 KHJ I4096 13 02 16.958 +24 00 38.91 1 KHJ I4097 13 02 04.92 +36 36 18.8 2 2.46 5.09 HCds WS I4098 13 02 04.1 +37 58 45 1 WS I4099 13 02 23.224 +24 01 44.92 2 0.10 0.21 GSC KHJ I4100 13 02 04.92 +40 24 28.8 4 0.73 0.41 WS SBG2 UZC CCA I4101 13 02 13.78 +39 56 25.1 2 0.32 0.99 WS HCds I4102 13 02 18.0 +36 09 06 2 0.00 3.54 WS HCds I4102 galaxy 13 02 17.69 +36 09 11.4 1 HCds I4102 * 13 02 18.39 +36 09 07.1 1 HCds I4103 13 02 19.0 +38 00 58 2 1.67 2.83 Pds WS I4104 13 02 18.2 +38 35 29 1 WS I4105 13 02 18.9 +38 16 13 1 WS I4106 13 02 38.33 +28 06 50.3 6 1.48 1.65 HC BPP UZC GSC DFOT WS I4107 13 02 41.62 +21 59 51.4 2 0.88 2.33 HCds WS I4108 13 02 31.598 +38 28 42.48 2 0.82 0.31 KHJ Pds I4109 13 02 57.89 +19 00 13.3 1 HCds I4109 nearby gal 13 02 57.31 +18 59 46.8 2 1.70 2.47 HCds WS I4110 13 02 58.3 +19 13 31 1 WS I4111 13 02 56.56 +28 04 12.3 4 1.60 2.45 DFOT BPP GSC HC I4112 13 02 45.28 +37 12 42.8 2 4.21 4.10 HCds WS I4113 13 03 03.4 +20 28 20 1 HCds I4113n 13 03 03.19 +20 28 25.2 1 HCds I4113s 13 03 03.53 +20 28 15.5 1 HCds I4114 13 02 42.0 +40 06 14 1 WS I4115 13 02 48.73 +37 13 21.5 3 2.86 4.27 HCds K05 WS I4116 13 03 10.13 +19 05 00.1 1 HCds I4117 13 02 48.44 +40 31 30.6 2 0.56 2.26 WS HCds I4118 13 02 51.679 +38 17 34.50 3 0.38 1.35 Pds HCds KHJ I4119 13 03 15.1 +19 14 07 1 HCds I4119 gal 13 03 15.07 +19 13 56.4 2 0.30 2.83 HCds WS I4119 * 13 03 15.11 +19 14 15.6 1 HCds I4120 13 03 01.41 +37 04 57.7 1 HCds I4121 13 03 21.48 +19 16 54.5 2 0.40 4.31 WS HCds I4121 nearby gal 13 03 19.66 +19 17 32.4 1 HCds I4121 nearby * 13 03 18.96 +19 17 46.7 1 HCds I4122 13 03 24.44 +20 11 46.7 4 0.88 1.12 HCds WS UZC Pds I4122 *w1 13 03 22.88 +20 11 53.4 1 HCds I4122 *w2 13 03 21.26 +20 11 54.2 1 HCds I4123 13 03 05.75 +38 18 52.2 2 0.83 1.20 HCds WS I4124 13 03 31.1 +22 50 50 2 0.00 1.41 WS HCds I4124 gal 13 03 31.48 +22 50 49.9 1 HCds I4124 * 13 03 30.63 +22 50 53.4 1 HCds I4124 nearby gal 13 03 39.18 +22 51 21.8 1 HCds I4125 13 03 34.958 +18 48 12.03 1 KHJ I4126 13 03 36.5 +19 19 21 2 1.00 0.71 WS HCo I4127 13 03 17.5 +38 02 43 1 WS I4128 13 03 41.206 +20 13 00.34 2 0.37 0.91 HCds KHJ I4128 comp 13 03 40.79 +20 13 14.5 1 HCds I4129 13 03 44.5 +18 52 39 1 HCds I4129 gal 13 03 43.88 +18 52 36.3 2 0.50 3.39 WS HCds I4129 * 13 03 45.12 +18 52 41.4 1 HCds I4130 13 03 46.59 +19 16 15.2 2 0.60 1.70 GSC WS I4131 13 03 25.45 +38 57 04.9 1 HCds I4132 13 03 33.81 +38 22 40.6 2 0.75 2.33 WS HCds I4133 13 03 50.83 +27 59 15.9 5 1.21 2.28 BPP DFOT UZC WS HC I4134=N4920 13 02 04.24 -11 22 42.3 4 0.29 1.42 GSC APMn SPC WS I4135 13 03 37.28 +40 14 55.0 2 0.24 2.83 WS HCds I4135 comp 13 03 35.11 +40 14 44.2 1 HCds I4136:=N4942 13 04 19.04 -07 38 57.5 7 1.49 3.35 GHD2 APMn Pds WS HCds SPF SPC I4137 13 03 59.289 +22 44 23.99 1 KHJ I4138 13 04 02.0 +20 39 52 1 WS I4139 13 04 04.140 +19 17 41.72 1 KHJ I4140 13 04 05.96 +20 05 46.2 1 HCds I4141 13 04 07.8 +19 12 35 2 1.00 0.00 WS HCo I4142 13 03 47.19 +38 11 42.3 1 HCds I4143 13 03 45.9 +40 12 26 1o MW5 I4143 * 13 03 45.50 +40 12 25.5 1 HCds I4144 13 03 50.25 +36 56 32.9 2 0.42 3.82 WS CCA I4145 13 03 49.9 +38 17 08 1 WS I4146 13 04 10.3 +19 16 38 1 WS I4147 13 04 09.5 +20 14 58 1 WS I4148 13 04 10.6 +19 15 30 1 WS I4149 13 04 10.8 +22 17 22 3 0.80 0.58 WS UZC K06 I4150 13 04 13.04 +21 59 13.1 2 0.98 2.26 HCds WS I4151 13 03 59.1 +36 51 25 2 2.54 3.54 HCds WS I4151sw 13 03 58.82 +36 51 25.4 1 HCds I4151ne 13 03 59.04 +36 51 32.3 1 HCds I4152 13 03 58.26 +38 11 55.7 1 HCds I4153 13 04 26.51 +19 02 40.3 2 0.40 3.54 HCds WS I4154 13 04 28.3 +23 34 28 2 0.00 1.41 WS HCo I4155 13 04 08.80 +40 00 57.6 1 HCds I4156:=N4948 13 04 55.67 -07 56 48.0 6 3.50 3.88 GHD2 WS SPC APMn SPF HCds I4157 13 04 18.4 +38 39 53 1o MW5 I4157 * 13 04 18.48 +38 39 50.8 1 HCds I4158 13 04 24.647 +36 28 47.64 1 KHJ I4159 13 04 45.9 +22 14 27 1 WS I4160 13 04 48.065 +22 53 32.74 1 KHJ I4161 13 04 35.26 +39 58 37.3 2 1.13 1.70 WS GSC I4162 13 05 03.0 +20 33 13 1 WS I4163 13 05 07.971 +20 46 13.51 1 KHJ I4164 13 05 14.5 +20 32 46 1 WS I4165 13 04 57.04 +39 55 28.1 2 1.38 2.12 GSC WS I4166 13 05 18.59 +31 26 32.2 6 1.03 2.32 CCA BPP JG DFOT UZC WS I4167 13 05 30.757 +21 54 35.93 1 KHJ I4168 13 05 10.72 +40 02 58.6 1 GSC I4169 13 05 12.2 +38 46 19 1 HCds I4169sw 13 05 11.88 +38 46 15.6 1 HCds I4169ne 13 05 12.44 +38 46 24.3 2 0.82 1.98 HCds WS I4170 13 05 34.9 +21 08 05 2 0.99 1.41 HCds WS I4170n 13 05 34.84 +21 08 07.5 2 0.40 1.91 HCds WS I4170s 13 05 34.94 +21 08 02.8 2 0.30 0.92 HCds WS I4170 comp 13 05 35.21 +21 07 48.0 1 HCds I4171 13 05 18.74 +36 06 08.2 3 2.13 1.06 K05 WS CCA I4172 13 06 33.28 +22 51 02.0 2 0.29 0.92 HCds HCo I4173=N4933B 13 03 54.58 -11 30 20.6 5 2.93 1.64 GHD2 WS HCo SPF SPC I4174 13 05 28.7 +36 23 56 1o MW5 I4174 * 13 05 28.39 +36 23 50.0 1 HCds I4175 13 05 47.4 +20 22 24 1 WS I4176=N4933=N4933A 13 03 56.95 -11 29 50.7 5 3.72 1.99 GHD2 GSC WS SPF SPC I4177 13 06 29.01 -13 34 16.7 2 0.83 0.49 HCds WS I4178 13 05 41.41 +36 01 03.8 3 1.93 1.83 Pds HCds CCA I4179 13 05 45.75 +37 11 55.3 1 HCds I4179 comp 13 05 46.34 +37 11 52.9 1 HCds I4180 13 06 56.37 -23 55 02.1 3 3.64 1.32 ESOB WS HCds I4181 13 06 06.36 +21 29 36.7 2 0.00 1.27 WS HCds I4181 comp 13 06 06.25 +21 29 46.0 1 HCds I4182 13 05 49.37 +37 36 20.9 9 2.15 3.55 GSCM HCo UZC WS DC HCds CCA SBG2 GHD1 I4183 13 06 11.530 +21 30 15.70 2 0.82 0.54 HCds KHJ I4184 13 05 51.744 +38 50 14.90 2 0.27 0.79 HCds KHJ I4185 13 06 12.6 +21 46 21 2 0.00 0.71 HCds HCo I4185n 13 06 12.71 +21 46 33.4 2 0.69 2.05 HCds HCo I4185s 13 06 12.553 +21 46 09.28 3 0.42 0.80 HCds HCo KHJ I4186 13 05 57.6 +36 59 07 2 3.38 3.54 WS HCds I4186 s* 13 05 57.14 +36 59 03.2 1 HCds I4186 n* 13 05 57.51 +36 59 15.8 1 HCds I4187 13 05 59.6 +36 17 53 2 2.56 2.83 Pds2 WS I4188 13 06 02.2 +36 19 40 3 3.19 4.16 K05 Pds2 WS I4189 13 06 03.66 +35 58 48.4 6 2.37 1.66 K05 SBG2 UZC CCA WS DC I4190 13 06 06.15 +37 36 39.0 2 0.92 1.48 HCds HCo I4191 13 08 47.88 -67 38 35.8 4 3.13 2.10 UCA1 GSC ESOB DKM2 I4192 13 06 08.6 +37 36 19 1o MW5 I4193 13 06 06.29 +39 25 23.7 2 0.98 2.40 WS SBG2 I4194 13 06 07.79 +38 52 23.6 2 0.66 3.68 HCds WS I4195 13 06 15.21 +37 02 25.5 1 HCds I4195 nearby * 13 06 16.07 +37 03 01.7 1 HCds I4196=N4970 13 07 33.47 -24 00 31.7 3 3.48 1.93 ESOB WS HCds I4196=N4970 comp 13 07 36.71 -24 01 26.3 1 HCds I4197 13 08 04.23 -23 47 49.1 3 0.84 1.01 ESOB WS HCds I4198=N4979 13 07 42.82 +24 48 38.1 6 0.99 0.69 HCds WS DFOT UZC JG CCA I4199 13 07 32.63 +35 51 37.4 1 HCds I4200 13 09 34.7 -51 58 06 2 0.66 2.83 ESOB WS I4201 13 07 51.21 +35 50 04.3 3 2.12 4.80 HCds Pds WS I4202 13 08 31.63 +24 42 01.9 6 0.61 1.28 DFOT WS UZC JG CCA Pds I4203 13 08 18.93 +40 25 39.9 2 0.16 3.11 HCds WS I4204 13 08 21.61 +39 27 37.7 2 0.33 1.34 WS CCA I4205=I0853 13 08 41.68 +52 46 25.8 4 1.53 0.53 Pds WS UZC CCA I4206 13 09 21.80 +39 01 20.2 2 1.48 3.04 WS HCds I4207 13 09 27.0 +37 49 19 1 WS I4208 13 09 37.82 +37 15 23.5 1 HCds I4209 13 10 22.44 -07 10 16.0 5 2.20 1.99 GHD2 WS HCds SPC APMn I4210=N5004B 13 10 47.72 +29 42 34.1 6 1.34 2.70 BPP DFOT WS UZC JG HCo I4211 13 10 56.56 +37 10 34.4 2 3.96 6.08 HCds WS I4211 comp * 13 10 55.45 +37 10 55.2 1 HCds I4212: 13 12 02.90 -06 59 34.9 2 1.90 5.66 WS HCds I4212: knot 13 12 09.50 -06 58 31.4 3 1.42 0.69 SPC HCds GSC I4213 13 12 11.23 +35 40 17.0 5 1.01 2.79 UZC SBG2 CCA WS DC I4214 13 17 43.0 -32 06 05 2 6.31 0.71 WS ESOB I4215 13 16 16.76 +25 24 18.1 6 1.50 2.00 WS JG DFOT UZC GSC CCA I4216 13 17 01.94 -10 46 13.4 4 2.95 0.95 WS SPC SPF APMn I4217 13 17 13.11 -13 09 20.1 2 1.65 2.47 HCds WS I4218 13 17 03.483 -02 15 41.98 8 2.33 1.95 GSC UZC WS AE CCA ZGT HCds DC I4219 13 18 29.5 -31 37 52 2 4.53 0.71 ESOB WS I4220 13 17 54.33 -13 36 20.7 2 1.75 1.70 HCds WS I4221 13 18 30.5 -14 36 32 3 1.45 3.06 WS SPC APMn I4222=I0879 13 19 40.38 -27 25 45.3 3 1.54 1.06 ESOB WS HCds I4223 13 18 55.15 +07 47 43.1 5 0.71 1.58 GD WS Pds UZC GGH I4224 13 19 04.80 -02 30 56.5 5 2.02 1.31 ZGT WS UZC GGH HCds I4225 13 20 00.98 +31 58 51.5 5 0.66 0.77 BPP WS DFOT UZC CCA I4226 13 20 30.452 +32 00 12.77 4 0.63 1.07 KHJ BPP DFOT UZC I4227 13 20 53.48 +32 11 25.6 4 1.28 1.07 WS BPP GSC DFOT I4228 13 21 34.2 +25 30 56 3 0.78 2.52 Pds2 WS UZC I4229 13 22 26.11 -02 25 07.2 6 0.57 0.98 UZC SPC GSC GGH CCA WS I4230 13 21 59.23 +26 44 01.4 5 1.55 1.69 BPP UZC CCA WS JG I4231 13 23 13.3 -26 18 02 3 1.56 1.00 ESOB WS Pds I4232 13 23 22.23 -26 06 36.7 2 1.34 3.11 ESOB HCds I4232 comp 13 23 22.43 -26 07 13.6 1 HCds I4233=N5124 13 24 50.31 -30 18 27.8 3 3.34 3.01 HCds WS ESOB I4234 13 22 60.0 +27 06 58 2 0.94 1.41 UZC WS I4235 13 23 52.961 -12 44 34.58 2 0.18 2.15 HCds KHJ I4236=N5118 13 23 27.48 +06 23 32.3 6 1.00 1.52 WS CCA UZC GGH GSC DC I4237 13 24 32.8 -21 08 14 4 1.76 0.96 WS GHD2 SPC ESOB I4238 13 23 59.92 +30 55 55.3 2 0.27 0.85 GSC WS I4239 13 24 25.44 +30 57 33.0 6 1.43 2.14 BPP HCds JG WS UZC SMB I4240 13 24 27.54 +30 58 39.6 3 0.52 2.07 HCds WS GSC I4241 13 24 46.5 +26 44 17 3 0.77 1.15 BPP WS UZC I4242 13 24 40.98 +31 01 33.7 2 1.63 2.69 HCds WS I4243 13 25 51.2 -27 37 36 2 0.94 1.41 WS ESOB I4244 13 24 56.242 +26 27 48.74 2 0.55 0.49 BPP KHJ I4245 13 25 59.03 -26 40 40.3 2 0.38 0.78 WS HCds I4245+I4246 13 25 59 -26 40.6 1 ESOB I4246 13 26 00.23 -26 40 41.4 2 0.38 0.57 WS HCds I4247 13 26 44.7 -30 21 45 2 4.59 0.71 WS ESOB I4248 13 26 47.4 -29 52 55 2 5.52 3.54 WS ESOB I4249 13 27 06.4 -27 57 23 3 2.66 2.00 WS Pds2 ESOB I4250 13 26 09.07 +26 28 37.6 5 0.60 1.11 K06 BPP UZC HCds WS I4250 comp 13 26 08.21 +26 28 21.3 2 0.57 1.91 HCds WS I4251 13 27 24.3 -29 26 40 2 3.70 2.12 WS ESOB I4252 13 27 28.2 -27 19 28 2 3.78 2.12 WS ESOB I4253 13 27 32.4 -27 52 18 2 4.70 6.36 WS ESOB I4254 13 27 45.3 -27 13 17 2 0.00 4.24 ESOB WS I4255 13 28 00.2 -27 21 14 2 3.78 1.41 WS ESOB I4256 13 27 03.1 +30 58 34 3 0.74 1.53 WS BPP UZC I4257 13 27 20.3 +46 52 01 1o JK I4257? 13 27 20.81 +46 55 52.1 2 0.79 1.27 HCds HCrs I4257?? 13 27 14.6 +46 52 04 1 WS I4258 13 27 53.259 +28 30 29.26 2 0.01 0.06 KHJ GSC I4259 13 29 28.2 -30 08 04 2 0.00 0.71 ESOB WS I4260 13 29 40.3 -28 15 56 2 1.87 4.95 ESOB WS I4261 13 29 47.8 -28 00 23 2 4.69 1.41 WS ESOB I4262 13 30 23.2 -28 16 15 2 1.87 0.00 WS ESOB I4263 13 28 33.29 +46 55 36.0 6 2.00 1.41 HCrs UZC CCA SBG2 WS GHD1 I4264 13 30 17.8 -27 55 42 3 4.06 2.52 WS Pds ESOB I4265 13 30 22.9 -25 45 57 2 0.00 0.00 ESOB WS I4266 13 29 05.67 +37 36 40.8 2 0.50 1.27 GSC WS I4267 13 30 36.1 -26 15 22 2 1.91 1.41 WS ESOB I4268 13 29 12.319 +37 39 37.47 2 0.22 0.23 KHJ GSC I4269 13 29 20.988 +37 37 22.43 2 0.07 0.30 GSC KHJ I4270 13 30 48.9 -25 20 02 2 3.84 0.71 ESOB WS I4271n 13 29 21.40 +37 24 48.2 3 0.48 1.71 WS HCo GSC I4271n+s 13 29 21.39 +37 24 43.2 1 SBG2 I4271s 13 29 21.2 +37 24 32 2 0.84 0.00 HCo WS I4272 13 31 16.4 -29 57 25 2 0.00 0.71 ESOB WS I4273 13 31 29.8 -28 53 38 2 0.00 1.41 ESOB WS I4274=N5189 13 33 32.86 -65 58 26.8 4 0.31 2.05 GSCA BSV HCo GSC I4275 13 31 51.3 -29 43 59 2 1.85 2.83 WS ESOB I4276 13 32 06.3 -28 09 24 2 3.75 0.00 WS ESOB I4277 13 30 16.56 +47 18 50.6 4 1.20 1.11 WS HCds HCrs HC2m I4278 13 30 27.40 +47 14 48.0 2 0.72 2.40 WS HCds I4278n 13 30 27.40 +47 14 50.6 2 0.64 1.84 HCrs HCds I4278s 13 30 27.57 +47 14 45.9 2 0.29 0.85 HCrs HCds I4279 13 32 30.88 -27 07 37.9 3 0.74 2.05 WS HCds ESOB I4279 comp 13 32 33.12 -27 08 22.8 1 HCds I4280 13 32 53.9 -24 12 28 2 9.69 2.12 WS ESOB I4281 13 32 38.36 -27 10 10.9 2 2.46 0.14 HCds WS I4282 13 31 19.70 +47 11 01.4 2 0.50 0.85 HCrs HCds I4283 13 32 10.7 +28 23 21 4 0.66 3.86 KOS WS UZC BPP I4284 13 31 31.9 +46 47 39 2 0.00 1.41 WS HCrs I4285 13 31 45.5 +46 49 15 2 0.00 2.12 WS HCrs I4286 13 33 36.0 -27 37 51 2 6.59 7.07 WS ESOB I4287w 13 32 38.91 +25 26 27.3 5 2.30 1.20 KOS HCds WS UZC Pds I4287e 13 32 39.57 +25 26 24.1 2 1.34 2.05 HCds WS I4287 comp or * 13 32 40.34 +25 26 47.8 1 HCds I4288 13 34 30.3 -27 18 16 2 0.00 2.12 ESOB WS I4289 13 34 48.0 -27 07 37 2 4.73 0.71 WS ESOB I4290 13 35 19.7 -28 01 19 2 2.82 0.71 WS ESOB I4291 13 36 56.1 -62 05 34 2 3.00 0.71 HCds ESOB I4292 13 35 46.7 -27 40 28 2 0.00 4.95 ESOB WS I4293 13 36 02.0 -25 52 55 2 4.78 2.12 ESOB WS I4294 13 36 31.3 -28 46 56 2 3.73 3.54 WS ESOB I4295 13 36 34.5 -29 05 25 2 2.79 5.66 WS ESOB I4296 13 36 38.89 -33 57 58.2 4 1.12 1.23 ESOB RC2 WS EWSr I4297 13 35 19.215 +26 25 28.50 5 2.23 0.58 KOS KHJ BPP UZC CCA I4298 13 36 34.9 -26 33 13 2 4.75 3.54 WS ESOB I4299 13 36 47.6 -34 03 58 2 0.88 0.71 WS Pds I4300 13 35 25.15 +33 25 09.9 3 1.25 1.47 WS HCds Pds I4301 13 35 35.83 +33 22 27.3 3 1.45 1.27 HCds WS CCA I4302 13 35 35.92 +33 28 44.9 2 0.79 1.34 WS CCA I4303 13 37 18.4 -28 39 31 2 2.80 2.83 WS ESOB I4304 13 35 57.93 +33 25 47.6 5 0.61 2.09 HCds WS UZC CCA SBG2 I4305 13 35 58.36 +33 28 26.0 3 0.64 0.81 WS SBG2 UZC I4306 13 36 19.64 +33 25 24.8 2 0.88 0.85 WS SBG2 I4307 13 36 36.150 +27 14 32.11 4 0.66 0.52 KOS KHJ UZC BPP I4308 13 36 52.4 +32 44 00 1o J I4309 13 38 50.2 -29 39 48 2 3.70 0.71 WS ESOB I4310 13 38 57.0 -25 50 44 2 0.96 2.12 WS ESOB I4311 13 40 08.0 -51 02 11 2 0.66 0.71 WS ESOB I4312 13 40 31.0 -51 04 17 2 2.68 1.41 WS ESOB I4313 13 38 20.657 +26 45 35.77 3 1.49 0.84 KOS KHJ BPP I4314 13 38 25.017 +26 44 33.26 4 1.37 1.02 KOS BPP KHJ UZC I4315 13 40 03.0 -25 28 30 2 0.96 2.12 ESOB WS I4316 13 40 18.3 -28 53 36 2 3.72 5.66 ESOB WS I4317 13 41 45.799 +27 06 23.05 3 0.59 0.24 Pds GSC KHJ I4318 13 43 22.7 -28 58 06 2 0.93 2.83 ESOB WS I4319 13 43 26.3 -29 48 15 2 1.85 2.12 ESOB WS I4320 13 44 03.6 -27 13 53 2 0.95 2.83 ESOB WS I4321 13 44 31.3 -30 08 25 2 4.60 1.41 WS ESOB I4322 13 43 44.030 +25 23 29.88 3 2.01 2.03 KOS UZC KHJ I4323 13 45 06.6 -28 39 07 2 0.00 0.00 ESOB WS I4324 13 45 26.9 -30 13 41 2 3.68 2.12 ESOB WS I4325 13 47 39.5 -29 26 04 2 0.00 2.12 ESOB WS I4326 13 48 21.6 -29 37 36 2 2.77 0.71 WS ESOB I4327 13 48 44.1 -30 13 05 3 3.44 4.58 WS ESOB GHD2 I4328 13 49 02.9 -29 56 16 2 2.76 1.41 WS ESOB I4329 13 49 05.38 -30 17 48.1 5 2.75 2.82 Pds WS GSC ESOB GHD2 I4329A 13 49 19.34 -30 18 35.5 4 0.88 1.40 WM WS RC2 ESOB I4330 13 47 14.84 -28 19 54.0 3 1.33 2.50 ESOB HCds WS I4331 13 49 24.67 +25 09 14.3 2 0.77 2.40 GSC WS I4332 13 49 52.49 +25 11 23.9 2 1.15 3.39 WS GSC I4333 14 05 19.6 -84 16 23 3 0.74 2.64 ESOB WS Pds I4334 13 49 48.2 +29 41 37 3 0.00 2.08 WS UZC BPP I4335 13 49 45.07 +33 40 23.3 2 0.18 2.55 HCds WS I4336 13 50 43.27 +39 42 23.8 4 1.45 0.97 WS CCA SBG2 UZC I4337 13 52 19.271 +14 16 18.46 2 0.06 0.16 KHJ UZC I4338=N5334 13 52 54.41 -01 06 50.5 10 1.61 1.96 SPC MJC ZGT UZC HCds CCA GH APMn DC WS I4339 13 53 28.95 +37 32 18.8 2 2.26 2.40 GSC WS I4340 13 53 33.57 +37 23 11.7 2 0.50 3.46 HCds WS I4341 13 53 34.27 +37 31 18.4 5 1.12 1.72 UZC K06 WS K13 SBG2 I4342 13 54 22.1 +25 09 09 3 1.36 2.08 WS UZC Pds I4343 13 54 55.72 +25 07 20.1 2 1.05 1.70 WS GSC I4344 13 55 12.62 +25 01 16.0 3 0.98 1.40 GSC UZC WS I4345 13 55 13.38 +25 03 05.1 3 1.36 1.48 UZC GSC WS I4346 13 55 40.49 +25 09 09.5 3 1.61 1.79 WS UZC GSC I4347=N5367 13 57 43.91 -39 58 44.0 2 0.73 2.47 ESOB HCds I4347=N5367 sw * 13 57 44.04 -39 58 45.8 2 1.39 2.05 2MSX 2MSX I4347=N5367 nw comp 13 57 25.91 -39 56 08.0 2 2.53 1.56 ESOB HCds I4347=N5367 se comp 13 57 55.85 -40 04 19.3 1 HCds I4347=N5367 n comp 13 57 44.36 -39 56 47.5 1 HCds I4348 13 55 45.049 +25 12 11.20 3 0.49 0.35 Pds GSC KHJ I4349 13 55 46.29 +25 09 06.3 4 1.79 1.25 Pds2 WS GSC UZC I4350 13 57 13.9 -25 14 44 3 0.00 1.73 ESOB Pds WS I4351 13 57 53.92 -29 18 55.0 4 2.03 1.89 GSC WS ESOB GHD2 I4352 13 58 25.1 -34 31 03 3 0.00 2.31 ESOB Pds WS I4353 13 57 03.7 +37 43 44 1o Bige I4353? 13 56 56.9 +37 44 22 1 WS I4354 13 58 30.80 -12 36 19.1 2 0.31 0.07 HCds WS I4355 13 58 06.1 +28 25 19 3 0.76 2.08 WS BPP UZC I4356 13 58 45.121 +37 29 25.45 3 0.67 1.06 KHJ GSC Pds I4357 14 00 43.78 +31 53 37.5 4 1.45 1.33 WS UZC BPP CCA I4358 14 03 34.25 -10 09 05.4 3 1.79 0.55 SPC WS GSC I4359 14 05 23.3 -45 16 10 2 0.00 4.24 ESOB WS I4360 14 04 21.32 -11 25 29.8 2 0.31 2.19 HCds WS I4361 14 04 07.49 -09 46 07.6 2 1.57 3.18 HCds WS I4362 14 05 22.31 -41 49 09.1 4 1.23 1.34 WS HC2m ESOB Pds I4363 14 04 12.27 -09 38 29.3 2 0.52 1.91 HCds WS I4363 comp 14 04 13.55 -09 40 25.2 1 HCds I4364 14 04 19.76 -09 59 36.3 2 1.15 1.48 GSC WS I4365=N5437 14 03 47.29 +09 31 24.0 5 1.85 1.70 GD WS GSC BCG Pds I4366 14 05 11.5 -33 45 39 2 2.65 2.12 WS ESOB I4367 14 05 36.5 -39 12 10 2 1.65 2.12 WS Pds I4368 14 04 46.414 -09 57 43.64 2 0.49 0.66 HCds KHJ I4369 14 04 05.94 +33 19 13.2 2 2.39 0.92 HCo HKA I4370 14 04 09.96 +33 20 44.7 4 1.78 1.22 UZC GSC SBG2 HKA I4371 14 04 10.93 +33 18 27.0 5 1.27 1.46 WS UZC GSC SBG2 HKA I4372 14 05 46.10 -10 53 59.9 2 3.02 0.28 HCds WS I4373 14 05 43.130 +25 13 52.53 2 0.62 0.28 UZC KHJ I4374 14 07 29.75 -27 01 05.1 4 0.97 1.32 WS EWSr DWFr DWFo I4375=N5488 14 08 03.00 -33 18 52.7 3 1.05 1.76 WS HCds GSC I4376 14 10 50.5 -30 47 35 2 0.00 2.12 HCds WS I4376 m * 14 10 50.47 -30 47 32.4 1 HCds I4376 ne * 14 10 51.22 -30 47 28.7 1 HCds I4376 sw * 14 10 49.57 -30 47 39.4 1 HCds I4377 14 16 58.9 -75 38 48 2 1.60 0.00 WS ESOB I4378 14 12 09.9 -34 15 56 2 6.15 1.41 WS ESOB I4379 14 12 10.2 -34 16 19 2 0.88 2.83 WS ESOB I4380 14 10 02.05 +37 33 01.7 5 1.13 2.44 UZC K01 WS SBG2 K06 I4381=N5008 14 10 57.15 +25 29 47.8 5 1.87 2.19 WS HKA CCA UZC HCds I4382 14 11 02.47 +25 31 09.2 4 1.96 1.77 WS HKA HCds UZC I4383=N5504B 14 12 12.72 +15 52 08.4 1 GSC I4384 14 11 56.058 +27 06 49.99 4 1.20 0.53 UZC KHJ CCA BPP I4385 14 14 31.72 -42 19 25.0 1 HCds I4386 14 15 02.57 -43 57 42.8 3 4.72 2.25 WS HCds ESOB I4387 14 15 01.79 -43 59 28.0 3 3.27 4.69 WS HCds ESOB I4388 14 16 03.5 -31 45 09 2 0.90 4.95 WS ESOB I4389 14 16 46.3 -40 33 11 2 2.43 1.41 WS ESOB I4390 14 16 59.5 -44 58 43 3 3.08 2.52 Pds WS ESOB I4391 14 16 27.3 -31 41 03 2 5.43 5.66 WS ESOB I4392 14 15 53.2 -13 03 04 1 HCds I4393 14 17 49.3 -31 20 55 2 2.72 0.71 WS ESOB I4394 14 16 22.4 +39 41 51 1o Big I4394?? 14 16 25.88 +39 39 06.1 1 HCds I4395 14 17 20.98 +26 51 27.1 5 1.87 1.54 WS BPP K02 UZC CCA I4396 14 17 30.2 +28 47 58 2 0.93 2.12 BPP WS I4397 14 17 58.70 +26 24 48.0 6 0.54 4.50 BPP CCA WS K02 UZC DC I4398 14 18 03.5 +28 51 57 3 1.51 1.53 WS BPP UZC I4399 14 18 23.94 +26 23 08.2 4 0.77 0.99 UZC BPP WS CCA I4400 14 22 13.7 -60 34 10 3 1.96 0.58 HCds ESOB WS I4401: 14 19 25.09 -04 29 22.9 4 0.78 2.59 HCds APMn WS SPC I4402 14 21 13.3 -46 17 54 2 5.14 0.71 WS ESOB I4403 14 18 16.88 +31 39 13.0 4 1.19 1.68 BPP WS CCA UZC I4404 14 09 51.0 +78 37 40 1 HCo I4405 14 19 16.53 +26 17 53.5 5 1.46 1.60 WS GSC UZC BPP Pds I4406 14 22 26.17 -44 09 03.8 5 3.05 1.40 BSV UB10 ESOB WS DKM1 I4407 14 23 36.91 -05 58 55.5 4 1.57 1.25 GSC WS SPC APMn I4408 14 21 13.16 +29 59 36.1 4 0.63 0.51 WS UZC CCA BPP I4409 14 21 33.4 +31 35 08 3 0.74 3.00 BPP WS UZC I4410 14 22 14.0 +17 23 48 2 1.01 2.12 WS Pds I4411 14 25 01 -35 01.2 1o DS I4412=N5594 14 23 10.282 +26 15 56.33 4 1.08 0.75 Pds UZC KHJ HCds I4413 14 22 57.287 +37 31 38.73 2 0.43 0.20 HCds KHJ I4414=I1008 14 23 42.8 +28 20 48 1 HCds I4414ne=I1008ne 14 23 42.88 +28 20 50.8 4 2.43 1.25 WS UZC BPP HCds I4414sw=I1008sw 14 23 42.27 +28 20 45.3 1 HCds I4415 14 24 26.73 +16 38 20.6 2 0.61 3.11 HCds WS I4416 14 24 17.419 +29 38 08.71 2 0.23 0.93 HCds KHJ I4417 14 24 53.674 +17 02 16.44 2 0.06 0.16 UZC KHJ I4418 14 25 27.261 +25 31 34.53 3 0.37 0.40 KHJ GSC UZC I4419 14 25 54.61 +16 37 54.7 2 0.20 3.61 HCds WS I4419 n comp 14 25 53.57 +16 39 02.9 1 HCds I4419 ne comp 14 25 58.06 +16 39 12.7 1 HCds I4420 14 25 39.4 +25 22 41 3 0.78 0.58 WS UZC K02 I4421 14 28 31.3 -37 35 00 2 1.69 2.12 WS ESOB I4422 14 25 59.11 +30 28 25.4 4 0.67 1.27 BPP WS UZC GSC I4423 14 26 17.68 +26 14 44.2 3 1.38 2.50 WS CCA UZC I4424=I1016=N5619B 14 27 32.4 +04 49 15 3 0.86 1.00 WS Pds UZC I4425 14 26 44.2 +27 11 21 4 1.27 0.82 K02 BPP UZC WS I4426 14 27 17.076 +16 49 52.60 2 0.11 1.60 HCds KHJ I4426 comp 14 27 15.94 +16 49 30.3 1 HCds I4427 14 26 59.6 +26 51 49 3 0.00 2.00 WS UZC BPP I4428 14 27 25.59 +16 11 26.1 2 0.92 2.83 HCds WS I4428 comp 14 27 31.67 +16 11 34.5 1 HCds I4429 14 27 37.312 +16 53 59.68 3 0.55 0.30 UZC HCds KHJ I4430 14 29 19.28 -33 27 17.9 2 0.44 1.56 HCds WS I4431=I1012 14 27 09.48 +30 56 52.7 4 1.39 1.41 BPP WS UZC CCA I4432 14 28 49.7 -39 33 06 2 0.00 2.83 ESOB WS I4433 14 27 53.3 +16 11 43 3 2.20 3.00 K15 WS UZC I4434 14 27 54.763 +16 12 25.07 2 0.47 1.01 KHJ UZC I4435 14 27 24.231 +37 28 17.03 3 0.96 0.50 SBG2 KHJ UZC I4436 14 27 58.2 +26 30 15 3 0.77 3.00 WS UZC BPP I4437 14 27 25 +41 29.2 1o EEB I4437: 14 27 31.83 +41 30 08.3 2 0.55 1.91 HCds WS I4438 14 28 34.45 +17 20 02.6 2 0.51 3.54 HCds WS I4438 comp 14 28 34.84 +17 20 22.4 1 HCds I4439 14 28 39.97 +17 01 28.3 2 0.71 2.76 HCds WS I4440 14 28 59.16 +17 19 13.9 2 0.10 2.47 WS HCds I4440 comp 14 28 59.66 +17 19 25.6 1 HCds I4441=I4444 14 31 38.92 -43 25 07.9 3 1.96 1.10 HCds Pds ESOB I4442 14 28 45.286 +28 57 51.69 5 1.15 0.64 BPP KHJ UZC HCds CCA I4443 14 29 17.41 +16 10 52.4 2 0.10 2.05 WS HCds I4443 comp 14 29 13.87 +16 10 21.0 1 HCds I4444=I4441 14 31 38.92 -43 25 07.9 3 1.96 1.10 HCds Pds ESOB I4445 14 31 54.5 -46 02 05 2 4.44 4.24 WS ESOB I4446 14 29 01.36 +37 27 47.4 2 1.26 0.92 HCds WS I4447 14 29 18.01 +30 49 55.2 4 1.17 0.87 WS BPP UZC CCA I4448 14 40 27.88 -78 48 35.6 3 1.13 1.59 WS ESOB HCds I4449 14 31 21.59 +15 14 25.6 2 0.00 3.04 WS HCds I4450 14 32 12.38 +28 33 24.5 4 0.79 1.29 UZC WS BPP CCA I4451 14 34 37.1 -36 17 09 3 0.70 2.08 ESOB WS Pds I4452 14 32 27.5 +27 25 37 3 0.77 1.53 WS UZC BPP I4453 14 34 28.9 -27 31 06 2 5.66 0.71 WS ESOB I4454 14 33 16.631 +17 42 43.15 2 0.89 1.24 HCds KHJ I4455=N5664 14 33 43.61 -14 37 10.5 3 0.92 1.52 HCds SPC WS I4455=N5664 comp 14 33 43.63 -14 36 47.1 1 HCds I4456 14 34 09.08 +16 11 01.8 2 0.00 1.13 HCds WS I4457 14 34 28.86 +18 13 28.2 2 1.71 3.32 HCds WS I4457 comp 14 34 27.88 +18 13 15.5 1 HCds I4458 14 38 05.7 -39 30 22 2 4.10 1.41 ESOB WS I4459 14 34 32.2 +30 58 26 3 0.00 2.65 WS UZC BPP I4460 14 34 36.6 +30 16 45 3 0.75 2.52 WS UZC BPP I4461 14 35 01.91 +26 32 38.4 6 0.98 2.21 WS UZC K02 BPP GSC CCA I4462 14 35 04.235 +26 32 26.61 3 0.94 0.82 KHJ GSC CCA I4463 14 35 49.0 +16 01 08 3 0.83 1.00 WS UZC Pds I4464 14 37 49.0 -36 52 41 3 2.08 2.31 Pds WS ESOB I4465 14 35 51.05 +15 34 22.3 2 0.00 2.47 WS HCds I4465 comp 14 35 49.15 +15 34 24.1 1 HCds I4466 14 36 47.87 +18 20 34.2 4 1.28 1.39 Pds WS UZC GSC I4467 14 36 53.687 +18 22 14.21 2 0.45 0.40 KHJ GSC I4468 14 38 26.9 -22 22 02 2 2.95 0.71 WS ESOB I4469 14 37 20.61 +18 14 55.0 2 0.20 1.77 WS CCA I4470 14 28 22.702 +78 53 06.67 5 1.34 1.71 Pds HCrs KHJ UZC GD I4471=N5697 14 36 31.954 +41 41 06.66 8 0.82 1.53 Ty2 HCds UA20 CCA WS UZC HC2m SBG2 I4472 14 40 10.9 -44 18 57 2 5.33 0.71 WS ESOB I4473 14 37 54.0 +15 51 42 2 1.02 4.24 Pds2 HCds I4473w 14 37 53.96 +15 51 48.4 2 0.51 3.11 HCds WS I4473e 14 37 54.36 +15 51 38.1 2 0.61 2.69 HCds WS I4473s 14 37 53.54 +15 51 30.6 1 HCds I4473n 14 37 54.22 +15 52 12.6 1 HCds I4474 14 38 22.36 +23 25 42.8 2 1.55 1.63 GSC WS I4475 14 38 23.287 +23 19 59.64 4 0.55 2.07 GSC KHJ Pds2 UZC I4476 14 39 51.827 -16 14 41.60 2 0.47 0.68 WS KHJ I4477 14 38 35.3 +28 27 31 3 0.00 1.73 WS BPP UZC I4478 14 39 12.695 +15 52 39.07 3 0.10 0.69 KHJ UZC Pds I4479 14 38 45.95 +28 30 19.0 4 0.39 0.63 BPP WS UZC CCA I4480 14 39 45.7 +18 29 31 3 0.82 1.53 WS Pds UZC I4481 14 40 10.05 +16 08 29.1 2 1.42 2.26 HCds WS I4482 14 40 12.5 +18 56 35 3 0.82 0.58 WS Pds UZC I4483 14 40 19.47 +16 41 05.6 3 1.51 1.53 WS UZC CCA I4484 14 47 43.9 -73 18 23 2 6.17 4.95 WS ESOB I4485 14 40 31.501 +28 40 07.17 2 0.98 0.51 KHJ BPP I4486 14 41 40.8 +18 33 25 3 0.82 0.58 WS UZC Pds I4487 14 41 52.1 +18 34 35 2 1.00 1.41 Pds WS I4488 14 42 52.60 +18 37 12.5 2 0.20 1.77 WS HCds I4489 14 43 16.00 +18 31 41.8 2 0.70 2.05 HCds WS I4490 14 45 21.5 -36 10 24 3 2.43 0.58 HCds WS ESOB I4490 ne * 14 45 21.72 -36 10 19.4 1 HCds I4490 sw * 14 45 20.85 -36 10 29.8 1 HCds I4491=I1055 14 47 25.65 -13 42 59.5 5 0.73 1.61 WS APMn HCds MFSK SPC I4492 14 42 33.882 +37 27 08.53 3 1.09 0.49 SBG2 KHJ KEBA I4493n=N5747n 14 44 20.88 +12 07 54.8 6 2.62 2.48 WS GSC UZC HCo CCA DC I4493s=N5747s 14 44 20.8 +12 07 42 2 1.04 0.00 UZC HCo I4494: 14 44 25.60 +15 33 05.1 4 0.70 2.12 HCo HCds WS UZC I4494:: 14 44 27.10 +15 28 51.1 5 1.92 1.65 HCo HCds GSC LEDA Pds I4495 14 44 14.53 +23 33 29.8 2 0.39 2.33 HCds WS I4496 14 43 54.521 +33 24 23.35 3 0.52 0.28 SBG2 UZC KHJ I4497 14 44 20.844 +28 33 01.41 3 0.70 0.69 UZC KHJ BPP I4498 14 45 00.8 +26 18 00 3 0.00 2.89 WS BPP UZC I4499 15 00 18.93 -82 12 49.1 2 1.06 0.71 SW ESOB I4500 14 44 35.676 +37 28 56.81 3 1.29 0.76 SBG2 KHJ KEBA I4501 14 47 25.2 -22 24 23 2 4.91 1.41 ESOB WS I4502 14 45 15.71 +37 17 58.4 2 0.08 2.62 WS GSC I4503 14 46 39.5 +16 08 46 3 0.83 1.53 Pds UZC WS I4504 14 46 36.978 +31 41 56.73 3 1.28 0.51 UZC KHJ BPP I4505 14 46 33.370 +33 24 30.05 4 0.83 0.54 UZC SBG2 KHJ CCA I4506 14 46 39.903 +33 24 03.21 2 0.36 1.34 SBG2 KHJ I4507 14 47 42.2 +18 27 18 2 2.01 0.71 WS Pds I4508 14 47 50.810 +31 45 53.15 3 1.48 0.62 KHJ UZC BPP I4509 14 48 27.14 +31 47 28.8 4 1.14 2.09 WS UZC BPP CCA I4510 14 50 40 -20 43.9 1o DS I4511 14 52 05 -40 29.7 1o DS I4512 14 49 54.28 +27 42 01.6 2 0.47 4.03 HCds WS I4513 14 52 16 -20 43.7 1o DS I4514 14 50 55.54 +27 34 41.9 3 0.54 0.76 BPP UZC CCA I4515 14 51 06.672 +37 29 40.91 3 0.49 0.18 KHJ HCds SBG2 I4516 14 54 23.506 +16 21 18.33 3 0.60 0.83 KHJ CCA UZC I4517 14 54 35.1 +23 38 34 2 0.00 2.12 WS UZC I4518 plume 14 57 41.2 -43 07 26 1 WS I4518=I4518w 14 57 41.10 -43 07 55.0 2 1.32 0.00 WS HCds I4518e 14 57 44.64 -43 07 53.8 1 HCds I4518e+w 14 57 43 -43 07.8 1 ESOB I4519 14 54 44.572 +37 24 45.21 3 0.60 0.68 KHJ SBG2 UZC I4520 14 55 07.04 +33 43 27.2 3 0.14 1.62 SBG2 WS UZC I4521 14 59 27.3 +25 34 59 3 1.35 2.08 Pds2 WS UZC I4522 15 11 29.3 -75 51 33 2 2.10 0.00 ESOB WS I4523 15 05 10.3 -43 30 34 2 2.32 3.54 ESOB WS I4524 15 02 06.17 +25 36 02.2 2 1.24 3.75 HCds WS I4525 15 02 24.66 +25 38 15.7 2 0.19 3.11 HCds WS I4526 15 02 38.41 +23 20 57.6 4 2.83 2.71 HCo HKA WS Hu I4527 15 05 40.8 -42 26 55 2 3.14 2.12 ESOB WS I4528 15 01 33.29 +49 06 44.0 3 0.50 0.68 HCds SBG2 LEDA I4529 15 06 25.8 -43 14 02 2 2.33 1.41 WS ESOB I4530 15 03 45.38 +26 06 00.7 3 0.47 2.65 WS UZC CCA I4531 15 04 26.635 +23 24 53.17 2 3.73 0.50 KHJ Hu I4532 15 04 53.93 +23 15 25.7 2 4.09 2.19 HCds Hu I4533 15 04 30.367 +27 47 33.93 6 0.84 0.36 BPP UZC KHJ GSC HCrs CCA I4534 15 06 41.81 +23 38 30.4 3 0.78 1.04 2MSX LEDA CCA I4535 15 08 41.58 +37 34 13.4 1 HCds I4536 15 13 17.38 -18 08 15.2 3 0.82 2.48 WS GSC SPC I4537 15 17 32.411 +02 02 48.75 2 0.47 1.94 Pds KHJ I4538 15 21 11.3 -23 39 29 2 4.86 2.83 ESOB WS I4539 15 18 31.02 +32 23 32.9 2 0.54 1.77 WS HCds I4540 15 20 03 +01 47.2 1o Sw11 I4540? 15 19 19.56 +01 50 18.0 2 0.11 0.99 HCds WS I4540? nw * 15 19 19.09 +01 50 21.0 1 HCds I4540? se * 15 19 20.01 +01 50 16.4 1 HCds I4541 15 29 55.9 -70 35 02 2 1.78 1.41 WS ESOB I4542=I4542nw 15 22 05.47 +33 08 54.4 5 0.63 1.01 HCds SBG2 IPds WS UZC I4542se 15 22 06.05 +33 08 47.9 3 1.35 1.97 HCds WS IPds I4543=I1118 15 24 59.49 +13 26 41.7 3 0.08 0.00 Pds UZC GSC I4544 15 29 25 -50 34.8 1o WF I4545 15 41 28.2 -81 37 34 2 1.10 2.12 ESOB WS I4546 15 26 58.4 +28 51 07 3 0.76 2.52 WS UZC BPP I4547 15 27 15.106 +28 47 19.33 3 0.37 1.20 KHJ BPP UZC I4548 15 27 24.046 +28 50 59.45 2 0.34 0.14 KHJ GSC I4549 15 29 14.60 +32 49 30.9 3 0.86 0.17 SBG2 UZC WS I4550=N5946 15 35 28.32 -50 39 32.9 3 2.54 2.52 ESOB HCds SW I4551=N5964 15 37 36.26 +05 58 26.1 6 1.27 2.58 GH WS WR DC UZC CCA I4552: 15 38 54.97 +04 34 58.1 2 0.53 0.35 LEDA CCA I4552 nom 15 34 58 +04 41.9 1o Sw11 I4553=I1127 15 34 57.36 +23 30 10.4 7 2.12 1.89 CCA JCR CCBD GSC Pds UZC DC I4553n=I1127n 15 34 57.1 +23 30 16 1 HCo I4553s=I1127s 15 34 57.3 +23 30 05 2 0.97 0.71 WS HCo I4554 15 35 04.829 +23 28 45.30 2 0.05 0.11 GSC KHJ I4555 15 48 15.1 -78 10 48 2 1.32 0.00 WS ESOB I4556 15 35 22.473 +25 17 48.75 4 0.32 0.84 KHJ Pds UZC GSC I4557 15 34 36.91 +39 43 43.3 2 0.81 0.42 WS SBG2 I4558 15 35 46.20 +25 20 42.6 3 0.47 2.25 WS Pds GSC I4559 15 35 53.540 +25 20 27.87 4 0.62 0.11 KEBA KHJ GSC UZC I4560 15 35 54.069 +39 48 51.41 3 0.07 0.57 HCds HCds KHJ I4561 15 36 47.08 +25 24 58.9 4 0.65 1.65 WS GSC Pds UZC I4562 15 35 57.18 +43 29 35.8 5 2.61 2.57 UZC CCA WS SBG2 DC I4563 15 36 03.61 +39 49 52.7 5 0.92 1.35 WS SBG2 HCds GSC UZC I4564 15 36 26.96 +43 31 07.0 5 0.86 1.32 WS CCA DC SBG2 UZC I4565 15 36 35.17 +43 25 28.8 4 0.57 0.99 UZC CCA SBG2 WS I4566 15 36 42.26 +43 32 21.5 5 2.10 1.21 UZC SBG2 WS CCA DC I4567 15 37 13.35 +43 17 51.9 5 0.31 1.51 CCA WS UZC DC SBG2 I4568 15 40 07.6 +28 09 06 3 1.52 2.00 WS BPP UZC I4569 15 40 48.392 +28 17 31.39 4 0.56 0.06 BPP KHJ GSC UZC I4570 15 41 22.53 +28 13 46.7 5 0.86 2.61 WS BPP GSC UZC CCA I4571 15 48 51.7 -67 19 25 3 0.89 1.73 WS Pds ESOB I4572 15 41 54.21 +28 08 01.3 4 0.64 2.12 BPP GSC WS UZC I4573 15 42 12.31 +23 47 58.9 4 1.35 0.71 WS GSC Pds UZC I4574 15 41 59.2 +28 14 24 3 0.76 2.65 BPP WS HCo I4575 15 42 19.685 +23 48 27.24 3 0.75 0.47 KHJ GSC UZC I4576 15 42 35.540 +23 40 12.09 3 0.57 0.40 KHJ GSC UZC I4577 15 42 45.586 +23 47 33.40 3 0.57 0.11 KHJ GSC UZC I4578 15 53 11.6 -74 49 33 2 0.28 0.71 WS ESOB I4579 15 42 51.491 +23 46 22.84 3 0.52 1.09 UZC KHJ GSC I4580 15 43 14.30 +28 21 23.7 4 0.69 2.53 BPP GSC WS UZC I4581 15 44 01.53 +28 16 36.1 4 1.26 2.21 WS BPP GSC UZC I4582 15 45 39.41 +28 05 18.6 4 1.61 1.70 BPP WS UZC CCA I4583 15 46 21.9 +23 48 30 2 0.97 2.12 WS UZC I4584 16 00 12.3 -66 22 58 2 2.56 0.71 ESOB WS I4585 16 00 16.9 -66 19 22 2 2.14 0.71 ESOB WS I4586=N6014 15 55 57.40 +05 55 55.5 5 1.92 2.93 DC HCds CCA WS UZC I4587 15 59 51.688 +25 56 26.71 3 0.89 2.55 KHJ Pds GD I4588 16 05 04.18 +23 54 59.6 2 0.00 3.32 WS HCds I4589 16 07 24.60 -06 23 07.1 1 HCds I4589 comp * 16 07 22.05 -06 23 13.7 2 0.95 2.05 HCds WS I4590 16 08 21.14 +28 28 42.3 4 0.07 1.72 WS HCo BPP GSC I4591 16 12 18 -27 55.6 2 0.00 4.24 ESOB HCe I4591 * 16 12 18.24 -27 55 33.7 1 Ty2 I4592 16 11 59 -19 27.4 2 10.01 12.73 HCm ESOB I4592 se* 16 11 59.74 -19 27 37.7 1 Ty2 I4592 nw* 16 11 58.60 -19 26 59.0 1 Ty2 I4593 16 11 44.478 +12 04 18.83 6 1.26 4.23 DKM1 GSC PPM CK Bord Ty2 I4594=N6075 16 11 22.62 +23 57 53.1 4 0.34 1.04 HCds WS GD UZC I4595 16 20 44.11 -70 08 33.2 4 1.37 1.96 WS HCds ESOB HCds I4596 16 16 03.60 -22 37 30.3 3 0.71 0.68 WS HCds ESOB I4597=?N6082 16 17 39.72 -34 21 57.5 3 0.66 2.04 WS HCds ESOB I4598 16 18 13.3 -31 26 32 2 2.72 2.83 WS ESOB I4599 16 19 23.19 -42 15 36.5 4 1.85 0.44 GSC BSV GSCA ESOB I4600 16 18 15 -22 46.8 1o DS I4600: 16 18 08.7 -22 47 07 1 HCds I4600: nw * 16 18 08.33 -22 47 05.0 1 HCds I4600: se *s 16 18 08.92 -22 47 11.6 1 HCds I4600? 16 16 05.29 -22 46 59.6 2 0.69 1.84 HCds WS I4600?? 16 18 13.6 -22 44 49 1 HCds I4600?? w * 16 18 13.18 -22 44 51.8 1 HCds I4600?? m * 16 18 13.59 -22 44 50.8 1 HCds I4600?? e * 16 18 13.89 -22 44 44.8 1 HCds I4601 16 20 18 -20 04.9 2 9.97 25.46 HCe ESOB I4601 nw *n 16 20 04.03 -20 02 40.3 1 Ty2 I4601 nw *s 16 20 05.53 -20 03 21.8 1 Ty2 I4601 se *s 16 20 30.30 -20 07 02.4 1 Ty2 I4601 se *n 16 20 30.60 -20 06 50.5 1 Ty2 I4602=N6132 16 23 38.81 +11 47 09.9 4 1.03 0.69 WS CCA UZC HCds I4603 16 25 24 -24 28.0 2 0.00 8.49 ESOB HCe I4603 nw * 16 25 19.31 -24 26 51.4 1 Ty2 I4603 se * 16 25 24.33 -24 27 55.4 1 Ty2 I4604 16 25 33 -23 26.6 2 38.96 33.94 HCm ESOB I4604 sw * 16 25 24.30 -23 27 35.6 1 Ty2 I4604 n * 16 25 35.13 -23 24 17.5 1 Ty2 I4604 se * 16 25 35.02 -23 26 48.3 1 Ty2 I4605 16 30 12 -25 06.9 2 0.00 0.00 ESOB HCe I4605 sw * 16 29 59.29 -25 08 50.5 1 Ty2 I4605 ne * 16 30 12.49 -25 06 53.5 1 Ty2 I4605 n * 16 29 54.64 -24 58 44.8 1 Ty2 I4606 16 31 33 -26 03.4 1o Fin I4606?=N6144 16 27 13.89 -26 01 26.1 3 3.62 4.88 ESOB HCds SW I4607 16 30 15.820 +24 34 28.21 3 1.21 3.01 GD WS HCds I4607 comp 16 30 16.11 +24 34 15.2 2 0.39 2.62 HCds WS I4608 16 46 54.1 -77 29 23 2 0.23 0.71 WS ESOB I4609 16 33 01.666 +22 47 50.54 4 1.19 0.83 Pds KHJ UZC GD I4610 16 33 39.24 +39 15 26.1 2 0.74 1.70 WS GSC I4611 16 33 42.30 +39 11 05.9 1 GSC I4612 16 33 49.65 +39 15 46.8 4 0.77 0.23 UZC GSC K01 SBG2 I4613 16 37 10 +36 07.8 1o Big I4614 16 37 47.23 +36 06 53.4 4 0.12 1.93 GSC WS UZC SBG2 I4615=N6196 16 37 53.92 +36 04 21.8 8 0.83 1.92 WS HC UZC DC GSC SBG2 GHD1 CCA I4616=N6197 16 37 59.91 +35 59 44.6 5 0.89 2.77 WS GSC UZC SBG2 HC I4617 16 42 08.09 +36 41 01.4 2 0.76 1.27 GSC WS I4618 16 57 50.7 -76 59 32 3 2.38 2.08 WS Pds ESOB I4619 16 44 11.1 +17 45 31 3 0.82 1.73 WS UZC Pds I4620 16 48 30.09 +19 18 18.5 3 1.28 1.40 HCds LEDA Pds I4621 16 50 51.192 +08 47 01.75 3 0.35 0.91 KHJ UZC CCA I4622 16 52 08 -16 14.2 1o DS I4623 16 51 05.4 +22 31 38 4 1.13 1.71 GD WS UZC Pds I4624 16 51 33.4 +17 26 55 2 1.01 2.12 JA WS I4625=N6240 16 52 58.88 +02 24 04.7 9 1.75 2.89 CCO WS GH CCR GSC HCds SPC UZC CCA I4626 16 53 21.4 +02 20 19 1 HCds I4626 w* 16 53 20.70 +02 20 16.3 2 0.53 0.57 HCds GSC I4626 e* 16 53 22.18 +02 20 23.6 1 HCds I4627 16 54 08.55 -07 38 08.8 2 1.37 2.69 HCds WS I4628 16 56 58 -40 27.4 2 8.08 25.46 ESOB HCe I4629 16 56 09 -16 42.6 1o DS I4629 alt 16 56 46 -16 42.6 1o DS I4630 16 55 09.638 +26 39 45.23 4 1.14 0.70 UZC KHJ CCA KEB1 I4631 17 11 00 -77 36.2 1o DS I4632 16 58 32.1 +22 54 56 1o Bige I4632? 16 58 35.58 +22 54 43.7 2 2.73 3.46 HCds WS I4633 17 13 47.2 -77 32 08 2 0.46 2.83 WS ESOB I4634 17 01 33.57 -21 49 33.3 3 0.40 0.26 GSC CK UCA1 I4635 17 15 40.0 -77 29 22 2 1.62 0.00 ESOB WS I4636 16 59 06.79 +47 11 44.8 1 HCds I4637 17 05 10.43 -40 53 07.6 4 0.47 0.69 BASm BSV GSC UCA1 I4638 17 01 13.677 +33 30 47.93 2 0.68 0.49 SBG2 KHJ I4639 17 02 54.868 +22 55 48.28 2 2.07 0.36 KHJ GD I4640 17 23 57.2 -80 03 49 2 2.94 0.71 ESOB WS I4641 17 24 10.2 -80 08 50 2 1.64 1.41 ESOB WS I4642 17 11 45.27 -55 23 59.9 4 0.90 2.52 GSCA ESOB GSC DKM2 I4643=N6301 17 08 32.78 +42 20 19.3 5 1.03 0.49 HCds WS UZC SBG2 CCA I4644 17 24 36.1 -73 56 19 3 1.34 1.15 WS ESOB Pds I4645 17 14 43.00 +43 06 12.6 2 0.62 0.78 WS SBG2 I4646 17 23 53.48 -59 59 59.9 3 2.33 2.76 HCds WS ESOB I4647 17 26 03.2 -80 11 42 2 3.63 1.41 ESOB WS I4648 17 16 10.0 +43 51 45 1 HCds I4648 w* 17 16 09.45 +43 51 45.0 1 HCds I4648 e* 17 16 10.64 +43 51 45.3 1 HCds I4649=I1252 17 15 50.25 +57 21 59.4 3 1.69 1.38 WS HCds CCA I4649=I1252 comp 17 15 47.45 +57 22 12.0 1 HCds I4650 17 15 47.337 +57 18 07.74 2 0.13 1.38 HCds KHJ I4651 17 24 52 -49 56.6 2 40.99 29.70 ESOB HCe I4652 17 26 26.58 -59 43 42.3 3 1.31 1.53 WS HCds ESOB I4653 17 27 07.1 -60 52 48 2 1.03 3.54 WS ESOB I4654 17 37 07.9 -74 22 52 3 0.40 1.52 WS Pds ESOB I4655 17 34 35.7 -60 43 17 2 1.04 1.41 HCds WS I4656 17 37 43.7 -63 43 45 2 3.76 4.95 ESOB WS I4657 17 32 42 -17 31.5 1o EEB I4658 17 36 10 -59 35.1 1o Fr I4658: 17 37 39.28 -59 56 26.5 3 1.60 2.54 HCds Pds ESOB I4658?? 17 36 15.63 -59 32 42.8 3 0.09 1.50 HCds ESOB WS I4659 17 34 12 -17 55.7 1o EEB I4660 17 21 45.09 +75 50 51.9 5 0.66 2.46 HCrs WS DC CCA UZC I4661 17 51 02.7 -74 01 56 2 1.46 4.24 WS ESOB I4662 17 47 08.75 -64 38 31.2 4 2.22 1.21 GC WS HCds HC2m I4662A 17 51 36.5 -64 57 35 3 1.47 0.00 WS ESOB RC2 I4663 17 45 28.50 -44 54 16.1 4 2.18 3.03 ESOB DKM2 GSCA GSC I4664 17 48 58.9 -63 15 16 2 1.91 0.71 WS ESOB I4665 17 46.5 +05 39 1 HCe I4666 17 46 02.12 +55 46 33.6 1 HCds I4667 17 46 19.0 +55 52 32 1o Bige I4667? s* 17 46 20.01 +55 51 42.0 1 HCds I4667? n* 17 46 21.88 +55 53 00.9 1 HCds I4668 17 46 59.39 +57 23 60.0 2 0.23 3.61 WS HCds I4669 17 47 12.80 +61 26 01.3 4 2.31 1.48 HC WS UZC CCA I4670 17 55 07.06 -21 44 39.7 4 1.54 1.20 GSC CK UCA1 DKM1 I4671 17 55 07 -10 17.2 1o DS I4672 18 02 14.4 -62 49 56 2 3.87 2.12 ESOB WS I4673 18 03 18.23 -27 06 21.5 5 2.95 2.90 ESOB DKM1 GSC CK GSCA I4674 18 08 13.4 -62 23 41 2 1.47 2.12 WS ESOB I4675 18 03 10 -09 15.6 1o Bige I4676 18 02 53.0 +11 49 21 2 0.00 0.71 WS Pds I4677 17 58 15.64 +66 38 01.2 2 1.05 2.47 HCds HCo I4678 18 06 33.5 -23 57 16 1 HCo I4678 * 18 06 32 -23 57.5 1 ESOB I4679 18 11 24.0 -56 15 13 2 2.95 0.71 ESOB WS I4680 18 13 29.7 -64 28 35 3 1.34 0.58 WS ESOB Pds I4681: 18 08 19.87 -23 25 54.8 2 2.53 0.78 ESOB HCds I4681? 18 08 15.9 -23 24 04 1 WS I4682 18 16 25.6 -71 34 52 2 2.34 4.95 ESOB WS I4683 18 09 -26.4 1o MW I4684 18 09 08.4 -23 26 09 2 5.84 0.71 HCds ESOB I4684 e * 18 09 08.43 -23 26 08.2 1 HCds I4684 w * 18 09 07.85 -23 26 11.3 1 HCds I4685 18 09 17.60 -23 59 16.1 2 1.84 2.90 ESOB Ty2 I4686 18 13 38.6 -57 43 57 2 1.13 0.00 ESOB WS I4687 18 13 39.4 -57 43 33 2 0.57 0.00 WS ESOB I4688 18 08 11.94 +11 42 42.7 4 1.55 1.45 HCds WS CCA Pds I4689 18 13 40.4 -57 44 56 2 1.70 1.41 WS ESOB I4690:=N6589 18 16 55.4 -19 46 37 1 HCds I4691 18 08 45.7 +11 49 44 3 1.70 3.61 WS Pds UZC I4692 18 14 49.8 -58 41 40 2 2.75 0.00 ESOB WS I4693 18 09 10.8 +17 20 50 2 0.00 2.12 WS HCds I4693 s * 18 09 10.64 +17 20 45.9 1 HCds I4693 m * 18 09 10.74 +17 20 53.8 1 HCds I4693 n * 18 09 11.11 +17 20 56.9 1 HCds I4694 18 15 26.8 -58 12 31 2 4.47 0.71 ESOB WS I4695 18 17 23.6 -58 55 28 2 1.64 7.07 HCds WS I4695 nw * 18 17 23.07 -58 55 29.6 1 HCds I4695 se * 18 17 23.87 -58 55 33.3 1 HCds I4696 18 20 18.0 -64 43 59 2 0.45 0.71 WS ESOB I4697 18 12 26.96 +25 25 37.5 4 0.14 1.02 GSC WS Pds UZC I4698 18 21 00.3 -63 20 49 3 2.16 4.04 WS Pds ESOB I4699 18 18 31.99 -45 59 01.7 2 0.81 0.00 GSC UCA1 I4700=N6590=N6595 18 17 04.9 -19 51 57 2 1.00 0.00 ESOB HCds I4701 18 16.6 -16 38 1 HCe I4702 18 23 03.8 -59 14 19 3 0.89 2.52 ESOB Pds WS I4703 18 18.9 -13 50 1 HCe I4704 18 27 54.8 -71 36 34 2 7.02 0.00 ESOB WS I4705 18 28 10.5 -71 41 38 2 1.33 2.12 WS ESOB I4706 18 19 36 -16 01.9 1 HCe I4707 18 19 53 -16 00.6 1 HCe I4708 18 13 46.3 +61 09 24 4 0.69 2.06 WS Pds UZC GD I4709 18 24 19.1 -56 22 09 2 3.52 2.12 ESOB WS I4710 18 28 38.5 -66 58 57 2 2.49 4.24 ESOB WS I4711 18 28 06.7 -64 56 39 2 0.90 0.71 WS HCds I4711 m * 18 28 06.63 -64 56 39.1 1 HCds I4711 nw * 18 28 04.18 -64 56 31.0 1 HCds I4711 se * 18 28 09.08 -64 56 48.2 1 HCds I4712 18 31 07.1 -71 41 36 2 2.66 4.24 WS ESOB I4713 18 29 58.9 -67 13 27 2 0.41 3.54 WS ESOB I4714 18 30 55.6 -66 39 09 2 0.42 2.12 ESOB WS I4715 18 16.8 -18 33 1 HCe I4716 18 32 44.9 -56 57 45 2 1.73 1.41 ESOB WS I4717 18 33 17.4 -57 58 28 2 3.37 3.54 WS ESOB I4718 18 33 50.2 -60 07 43 3 1.55 1.00 WS ESOB Pds I4719 18 33 11.7 -56 43 58 2 0.58 2.12 WS ESOB I4720 18 33 32.6 -58 24 18 2 1.11 0.71 ESOB WS I4721 18 34 24.78 -58 29 48.5 5 0.56 3.00 HC2m WS GSC ESOB HCds I4721A 18 34 26.87 -58 32 01.8 2 0.17 0.78 HCds WS I4721 comp 18 34 19.57 -58 29 22.9 2 0.06 0.21 HC2m HCds I4722 18 34 31.6 -57 47 35 2 3.39 3.54 WS ESOB I4723 18 35 56.0 -63 22 35 2 1.90 2.83 ESOB WS I4724 18 38 40.5 -70 07 34 2 1.08 1.41 WS ESOB I4725 18 31 48 -19 06.8 2 40.08 4.24 ESOB HCe I4725 core 18 31 45.3 -19 06 44 1 HCds I4726 18 36 59.1 -62 51 16 2 6.28 0.71 WS ESOB I4727 18 37 56.3 -62 42 01 2 4.86 0.71 WS ESOB I4728 18 37 56.9 -62 31 47 2 0.49 7.07 ESOB WS I4729 18 39 56.8 -67 25 33 3 4.02 2.89 WS Pds ESOB I4730 18 38 50.4 -63 21 02 2 0.48 0.71 WS ESOB I4731 18 38 42.9 -62 56 35 2 1.96 2.83 WS ESOB I4732 18 33 54.57 -22 38 40.8 3 1.31 0.25 GSC CK UCA1 I4733 18 26 38.24 +64 58 00.8 2 0.58 2.76 HCds WS I4734 18 38 25.4 -57 29 27 2 0.00 0.71 ESOB WS I4735 18 39 50.0 -62 57 22 2 0.48 0.00 WS ESOB I4736 18 38 39.5 -57 53 36 3 3.47 2.52 ESOB WS Pds I4737 18 39 58.7 -62 35 51 2 3.41 0.71 WS ESOB I4738 18 40 27.3 -61 54 07 2 0.50 0.00 WS ESOB I4739 18 40 51.5 -61 54 05 2 1.50 0.71 ESOB WS I4740 18 43 00.6 -68 21 35 2 1.56 2.12 WS ESOB I4741 18 41 43.6 -63 56 54 2 0.47 2.83 WS ESOB I4742 18 41 52.6 -63 51 42 3 3.32 2.08 WS Pds ESOB I4743 18 41 29.3 -61 46 20 2 2.50 0.71 WS ESOB I4744 18 41 54.7 -63 13 25 2 2.86 0.00 ESOB WS I4745 18 42 35.6 -64 56 35 2 0.45 0.71 WS ESOB I4746 18 45 54.8 -72 40 11 2 1.26 8.49 ESOB WS I4747 18 45 57.3 -72 37 41 2 1.89 9.19 ESOB WS I4748 18 42 46.0 -64 04 24 2 2.31 4.95 WS ESOB I4749 18 42 49.72 -63 12 31.7 2 4.73 3.18 HCds ESOB I4750 18 43 02.7 -62 58 15 2 1.44 1.41 WS ESOB I4751 18 43 19.9 -62 06 43 2 2.97 0.00 WS ESOB I4752 18 43 47.7 -64 04 57 2 4.16 2.82 ESOB WS I4753 18 43 33.1 -62 06 27 2 0.50 3.54 WS ESOB I4754 18 44 00.4 -61 59 22 2 0.50 0.00 WS ESOB I4755 18 45 01.22 -63 41 32.9 3 3.17 3.29 HCds WS ESOB I4756 18 38.9 +05 27 1 HCe I4757 18 43 55.9 -57 10 01 2 1.72 4.24 ESOB WS I4758 18 46 17.9 -65 45 25 2 1.74 0.00 ESOB WS I4759 18 45 41.1 -63 05 10 3 1.57 2.08 HCds ESOB WS I4759nw 18 45 40.52 -63 05 04.8 1 HCds I4759se 18 45 41.08 -63 05 12.8 1 HCds I4760 18 45 46.2 -62 57 28 2 2.89 2.12 WS ESOB I4761 18 43 55.5 -52 51 09 3 0.52 5.13 Pds WS ESOB I4762 18 32 28.5 +67 51 28 1 HCds I4762 w * 18 32 27.42 +67 51 31.6 1 HCds I4762 e * 18 32 29.53 +67 51 26.1 1 HCds I4763=N6679: 18 33 30.57 +67 08 13.0 4 1.38 2.46 WS GSC CCA DC I4764 18 47 07.50 -63 29 04.2 3 1.01 1.18 ESOB HCds WS I4765 18 47 18.3 -63 19 55 2 1.43 2.12 WS ESOB I4766 18 47 35.9 -63 17 35 2 2.85 2.83 WS ESOB I4767 18 47 41.8 -63 24 19 2 0.00 0.71 ESOB WS I4768 18 41 45 -05 31.4 1o Bige I4768 "I" 18 41 06 -05 40.3 1 HCds I4768 "II" 18 41 48 -05 24.1 1 HCds I4769 18 47 43.7 -63 09 29 2 2.87 2.12 ESOB WS I4770 18 48 10.5 -63 23 03 2 1.42 2.12 WS ESOB I4771 18 48 23.9 -63 14 55 2 0.00 3.54 ESOB WS I4772 18 39 56.503 +40 01 34.72 2 0.04 0.47 KHJ SBG2 I4773 18 51 21.3 -69 55 32 2 3.27 4.24 ESOB WS I4774 18 48 10.4 -57 56 09 2 0.00 0.71 ESOB WS I4775 18 48 26.4 -57 11 02 2 0.57 0.00 WS ESOB I4776 18 45 50.83 -33 20 35.8 5 2.36 2.35 CK GSC UCA1 ESOB DKM1 I4777 18 48 11.2 -53 08 50 2 0.64 0.71 WS ESOB I4778 18 50 00.4 -61 43 09 2 0.50 1.41 WS ESOB I4779 18 50 30.3 -63 00 48 2 0.48 0.00 ESOB WS I4780 18 49 56.7 -59 15 14 2 1.62 0.00 WS ESOB I4781 18 51 37.8 -62 47 33 2 0.97 2.12 WS ESOB I4782 18 50 54.1 -55 29 28 2 3.00 0.71 ESOB WS I4783 18 51 33.22 -58 48 48.8 3 3.09 1.56 ESOB GSC WS I4784 18 52 48.17 -63 15 35.8 3 1.37 3.06 WS HCds ESOB I4784 comp 18 53 03.37 -63 16 57.7 1 HCds I4785 18 52 55.4 -59 15 19 2 1.62 0.00 WS ESOB I4786 18 52 44.5 -56 41 40 2 4.07 3.54 ESOB WS I4787 18 56 04.3 -68 40 57 2 3.08 1.41 WS ESOB I4788 18 54 41.1 -63 27 11 2 1.89 2.12 WS ESOB I4789 18 56 18.5 -68 34 05 2 1.16 2.82 WS ESOB I4790 18 56 32.0 -64 55 42 2 1.35 1.41 ESOB WS I4791 18 49 01.18 +19 19 51.5 2 0.10 0.57 HCds WS I4792 18 55 41.9 -56 24 14 2 1.17 1.41 ESOB WS I4793 18 56 55.9 -61 24 01 2 1.52 2.12 WS ESOB I4794 18 57 09.6 -62 05 26 2 0.99 0.00 ESOB WS I4795 18 57 16.4 -61 36 35 2 3.02 2.83 ESOB WS I4796 18 56 28.4 -54 12 50 4 9.06 1.73 Pds WS ESOB RC2 I4797 18 56 30.5 -54 18 20 3 14.04 2.31 ESOB WS RC2 I4798 18 58 20.8 -62 07 07 2 2.47 2.83 ESOB WS I4799 18 58 56.7 -63 55 53 2 2.32 2.83 ESOB WS I4800 18 58 43.2 -63 08 21 2 2.87 2.12 ESOB WS I4801 18 59 38.6 -64 40 29 2 2.26 1.41 WS ESOB I4802 18 55 07.15 -22 41 53.3 2 1.17 0.85 GSC WS I4802 * 18 55 06 -22 40.3 1 ESOB I4803 19 00 39.43 -62 03 54.3 2 0.94 1.77 HCds WS I4804 19 01 07.1 -61 49 59 2 4.00 2.12 ESOB WS I4805 19 02 01.2 -63 02 50 2 1.92 3.54 ESOB WS I4806 19 01 30.6 -57 31 56 2 1.70 2.12 ESOB WS I4807 19 02 17.4 -56 55 50 2 4.62 1.41 ESOB WS I4808 19 01 07.4 -45 18 51 2 2.98 2.12 ESOB WS I4809 19 04 05.7 -62 11 39 2 3.95 0.71 WS ESOB I4810 19 02 59.6 -56 09 34 2 5.90 5.66 ESOB WS I4811 19 05 44.6 -67 08 03 2 0.00 0.71 ESOB WS I4812 19 01 03.6 -37 03 38 2 0.00 1.41 ESOB HCds I4812 w* 19 01 03.23 -37 03 37.9 1 Ty2 I4812 e* 19 01 04.33 -37 03 40.5 1 Ty2 I4813 19 05 42.0 -66 31 22 2 1.26 1.41 WS ESOB I4814 19 04 59.3 -58 34 47 2 0.55 1.41 ESOB WS I4815 19 06 51.2 -61 42 04 2 0.50 1.41 ESOB WS I4816 19 01 50.53 -13 09 42.5 2 0.21 0.14 HCds HWD I4816 neb: 19 01 50.43 -13 09 43.4 1 HCds I4816 * 19 01 50.58 -13 09 42.4 1 HCds I4817 19 06 12.3 -56 09 33 3 3.94 2.08 ESOB Pds WS I4818 19 06 03.0 -55 08 11 2 1.21 0.00 WS ESOB I4819 19 07 06.6 -59 27 59 2 9.14 5.66 ESOB WS I4820 19 09 13.0 -63 27 55 2 1.89 2.83 WS ESOB I4821 19 09 32.2 -55 00 58 3 0.86 1.53 Pds WS ESOB I4822 19 14 44.9 -72 26 25 2 4.46 5.66 ESOB WS I4823 19 12 14 -63 58.8 1 ESOB I4823=I4823n 19 12 15.87 -63 58 34.1 2 1.02 1.34 HCds WS I4823s 19 12 13.93 -63 59 01.1 2 0.05 1.41 WS HCds I4824 19 13 14.10 -62 05 19.0 3 0.37 1.44 WS HCds ESOB I4824 arm? 19 13 19.30 -62 05 20.8 1 HCds I4825 19 17 15.5 -72 44 55 2 0.94 3.54 ESOB WS I4826 19 12 21.1 -57 12 07 2 2.87 4.95 ESOB WS I4827 19 13 21.13 -60 51 36.0 3 0.00 0.23 ESOB WS GSC I4828 19 13 40.75 -62 04 55.5 3 1.84 2.54 WS HCds ESOB I4829 19 12 33.5 -56 32 23 2 2.33 3.54 ESOB WS I4830 19 13 48.7 -59 17 40 3 2.75 1.15 WS Pds ESOB I4831 19 14 43.97 -62 16 19.4 3 0.75 1.00 ESOB GSC WS I4832 19 14 03.6 -56 36 34 2 2.91 2.83 ESOB WS I4833 19 15 41.56 -62 19 45.4 3 2.45 1.00 GSC WS ESOB I4834 19 16 31.0 -64 00 23 2 0.46 0.71 ESOB WS I4835 19 15 27.4 -58 14 12 2 0.00 5.66 ESOB WS I4836 19 16 17.9 -60 12 00 2 2.63 1.41 ESOB WS I4837 19 15 14.67 -54 39 45.4 4 4.55 4.23 WS ESOB HCds RC2 I4837 comp 19 15 16.36 -54 38 22.3 1 HCds I4837A 19 15 15.8 -54 07 58 2 1.24 2.12 ESOB WS I4838 19 16 46.3 -61 36 51 2 0.50 0.00 ESOB WS I4839 19 15 33.99 -54 37 34.7 3 1.93 2.57 WS HCds ESOB I4840 19 15 51.7 -56 12 31 2 0.59 1.41 ESOB WS I4841 19 20 42.9 -72 13 34 2 0.32 2.83 WS ESOB I4842 19 19 24.43 -60 38 40.1 3 1.91 1.15 ESOB WS GSC I4843 19 19 21.4 -59 18 33 3 1.32 2.31 ESOB Pds WS I4844 19 19 02.6 -56 01 37 2 0.59 2.12 ESOB WS I4845 19 20 22.5 -60 23 23 2 3.66 2.12 WS ESOB I4846 19 16 28.40 -09 02 38.3 4 4.11 3.39 GSC GSCA CK DKM1 I4847 19 23 32.2 -65 30 24 2 4.38 0.00 WS ESOB I4848 19 22 54.1 -56 46 50 2 4.64 1.41 ESOB WS I4849 19 25 36.0 -62 55 58 2 2.40 1.41 WS ESOB I4850 19 20 24.07 -00 08 01.2 2 0.42 0.49 HWD HCds I4851 19 25 29.2 -57 40 16 3 3.78 4.04 ESOB WS Pds I4852 19 26 25.6 -60 20 11 2 1.05 0.00 ESOB WS I4853 19 30 47.6 -71 04 11 2 2.74 4.24 WS ESOB I4854=I4855 19 27 21.14 -59 18 55.1 3 1.47 1.44 ESOB WS HCds I4855=I4854 19 27 21.14 -59 18 55.1 3 1.47 1.44 ESOB WS HCds I4856 19 27 30.5 -54 54 31 2 0.00 1.41 ESOB WS I4857=I4858 19 28 38.86 -58 46 06.1 3 2.83 2.62 ESOB WS HCds I4857=I4858 comp 19 28 31.09 -58 47 14.2 1 HCds I4858=I4857 19 28 38.86 -58 46 06.1 3 2.83 2.62 ESOB WS HCds I4858=I4857 comp 19 28 31.09 -58 47 14.2 1 HCds I4859 19 30 47.0 -66 18 55 2 2.55 7.78 WS ESOB I4860 19 31 27.8 -67 22 08 2 5.69 2.83 WS ESOB I4861 19 29 16.6 -57 34 35 2 0.57 0.00 WS ESOB I4862 19 31 40.1 -67 19 25 2 0.41 2.83 WS ESOB I4863 19 27 51.5 -36 13 00 3 1.85 3.00 ESOB WS HCds I4863 (Howe) 19 28 22.0 -36 12 08 1 HCds I4863 (Howe) e * 19 28 22.51 -36 12 09.3 1 HCds I4863 (Howe) w * 19 28 21.52 -36 12 07.9 1 HCds I4863 ne * 19 27 52.06 -36 12 57.7 1 HCds I4863 sw * 19 27 51.26 -36 13 03.4 1 HCds I4864 19 40 06.2 -77 33 25 3 1.03 2.65 WS Pds ESOB I4865 19 30 50.3 -46 41 54 1 HCds I4865 ne * 19 30 50.59 -46 41 50.3 1 HCds I4865 sw * 19 30 49.99 -46 41 57.8 1 HCds I4866 19 34 34.7 -61 08 45 2 1.02 1.41 ESOB WS I4867=:I1301 19 26 31.967 +50 07 31.14 6 1.03 1.07 DC HCds KHJ UZC CCA SBG2 I4868 19 33 33.396 -45 53 31.95 4 0.05 2.02 HCds ESOB WS Ty2 I4869 19 36 02.6 -61 01 40 2 2.05 2.83 WS ESOB I4870 19 37 38.0 -65 48 42 3 1.84 2.65 WS Pds ESOB I4871=I4872 19 35 42.29 -57 31 08.6 3 0.41 2.08 WS HCds ESOB I4872=I4871 19 35 42.29 -57 31 08.6 3 0.41 2.08 WS HCds ESOB I4873 19 34 54.65 -46 08 08.8 3 1.17 3.00 HCds WS ESOB I4874 19 36 21.3 -47 15 56 2 1.44 2.83 ESOB WS I4875 19 37 39.0 -52 04 28 2 3.90 4.95 WS ESOB I4876 19 37 43.0 -52 50 33 2 6.39 3.54 WS ESOB I4877 19 37 55.9 -51 59 27 2 1.95 4.24 WS ESOB I4878 19 38 49.6 -58 13 39 2 2.23 0.00 ESOB WS I4879 19 39 36.8 -52 22 07 2 0.65 2.83 WS ESOB I4880 19 40 30.6 -56 24 34 2 1.76 2.83 ESOB WS I4881 19 40 25.8 -55 51 27 2 2.97 1.41 ESOB WS I4882 19 40 23.3 -55 11 49 2 0.60 1.41 WS ESOB I4883 19 42 00.4 -55 32 41 2 1.79 4.24 ESOB WS I4884 19 42 41.3 -58 07 43 2 0.56 2.12 WS ESOB I4885 19 43 51.6 -60 39 04 2 2.07 3.54 ESOB WS I4886 19 43 14.59 -51 48 27.2 3 1.13 0.12 GSC WS ESOB I4887 19 48 21.0 -69 35 12 2 0.74 3.54 WS ESOB I4888 19 44 52.2 -54 27 22 2 0.00 2.83 ESOB WS I4889=I4891 19 45 15.27 -54 20 38.7 4 3.21 1.05 WS HCds HC2m ESOB I4890 19 45 35.2 -56 32 42 2 2.33 0.00 ESOB WS I4891=I4889 19 45 15.27 -54 20 38.7 4 3.21 1.05 WS HCds HC2m ESOB I4892 19 49 31.5 -70 13 37 3 0.29 3.46 ESOB Pds WS I4893 19 50 32.8 -72 30 34 2 0.95 3.54 ESOB WS I4894 19 46 59.06 -51 50 48.4 3 1.90 0.95 WS HCds ESOB I4894 comp 19 46 56.04 -51 50 36.7 1 HCds I4895=N6822 19 44 56.90 -14 48 23.9 6 7.35 8.12 HCds WS HCds HC HC2m SPC I4896 19 49 05.1 -58 58 53 2 1.63 1.41 WS ESOB I4897 19 49 19.8 -51 52 07 2 1.96 2.83 WS ESOB I4898 19 47 46 -33 19.2 1o Sw12 I4898?? 19 44 45.96 -33 32 03.4 2 3.88 2.12 ESOB HCds I4899 19 54 26.81 -70 35 21.5 2 0.98 0.92 HCds ESOB I4899 sup * 19 54 23.8 -70 35 25 1 WS I4900 19 50 22.2 -51 20 46 2 1.98 0.71 WS ESOB I4900 comp 19 50 23.4 -51 20 28 1 WS I4901 19 54 23.3 -58 42 49 2 2.74 0.71 ESOB WS I4902 19 54 23.9 -56 22 42 2 2.34 7.07 ESOB WS I4903 19 58 13.4 -70 27 13 2 1.06 0.00 ESOB WS I4904 19 58 38.8 -70 11 02 2 1.43 4.24 ESOB WS I4905 19 56 06.1 -61 13 15 2 1.02 2.12 ESOB WS I4906 19 56 47.7 -60 28 06 2 1.04 2.12 ESOB WS I4907 19 56 12.7 -52 27 10 2 5.16 5.66 ESOB WS I4908 19 56 56.4 -55 47 28 2 2.38 0.71 ESOB WS I4909 19 56 45.2 -50 03 18 2 3.40 2.83 ESOB WS I4910 19 57 46.9 -56 51 46 2 3.47 4.95 ESOB WS I4911 19 57 41.7 -51 59 09 2 0.65 4.24 WS ESOB I4912 20 06 49.9 -77 21 24 2 0.92 6.37 WS ESOB I4913 19 56 47.3 -37 19 44 2 4.21 0.71 WS ESOB I4914 19 57 56.2 -50 07 53 2 4.07 0.00 ESOB WS I4915 19 58 32.2 -52 38 31 2 3.21 4.95 WS ESOB I4916 19 58 19.2 -50 16 18 2 0.00 2.83 ESOB WS I4917 19 58 55.1 -52 16 22 2 3.24 2.83 WS ESOB I4917 comp 19 58 48.3 -52 16 36 1 WS I4918 19 59 13.2 -52 16 28 2 0.65 4.95 WS ESOB I4919 20 00 09.08 -55 22 27.0 3 1.07 1.21 McN WS ESOB I4920 20 00 09.0 -53 23 01 2 3.15 4.95 WS ESOB I4921 20 03 19.1 -67 49 31 2 1.19 3.54 ESOB WS I4922 19 59 29 -40 21.8 1o DS I4923 20 00 57.6 -52 37 55 2 4.49 1.41 WS ESOB I4924 19 59 51 -41 32.8 1o DS I4924?? 20 00 00.3 -41 30 36 2 0.00 4.24 ESOB WS I4925 20 01 09.74 -52 51 57.5 3 1.47 4.01 ESOB HCds WS I4926 20 00 12.2 -38 34 40 2 0.00 2.83 ESOB WS I4927 20 01 49.4 -53 55 05 2 0.00 2.83 ESOB WS I4928 20 10 11.9 -77 18 32 2 0.23 2.12 ESOB WS I4929 20 06 41.7 -71 40 58 2 0.99 7.07 ESOB WS I4930 20 02 26 -54 18.5 1o DS I4931 20 00 50.2 -38 34 30 2 0.00 1.41 ESOB WS I4932 20 02 15.4 -52 50 46 2 1.28 4.24 ESOB WS I4933 20 03 29.0 -54 58 47 2 3.03 2.83 WS ESOB I4934 20 07 14.8 -69 28 47 2 2.22 3.54 WS ESOB I4935 20 04 34.0 -57 35 53 3 2.45 2.52 ESOB WS Pds I4936 20 05 52.3 -61 25 40 2 0.50 4.95 WS ESOB I4937 20 05 17.7 -56 15 21 2 2.93 2.12 WS ESOB I4938 20 06 11.4 -60 12 39 2 2.62 6.36 ESOB WS I4939 20 07 11.0 -60 44 19 2 0.00 0.00 ESOB WS I4940 20 05 43 -44 42.0 1o DS I4941 20 06 58.6 -53 39 09 2 0.63 2.83 WS ESOB I4942 20 06 49.5 -52 36 35 2 3.21 4.24 WS ESOB I4943 20 06 28.25 -48 22 30.9 3 0.51 3.51 WS HCds ESOB I4944 20 07 09.0 -54 26 49 2 1.23 0.00 ESOB WS I4945=N6876A 20 11 17.5 -71 00 44 2 2.74 3.54 WS ESOB I4946: 20 23 57.7 -43 59 45 2 4.57 1.41 ESOB WS I4947 20 07 31.9 -53 08 32 2 1.90 4.24 WS ESOB I4948?=N6902 20 24 27.86 -43 39 11.0 3 1.39 1.63 ESOB WS GSC I4949=N6861 20 07 19.31 -48 22 11.9 3 1.54 0.76 ESOB HCds WS I4950 20 08 27.1 -56 09 41 2 2.35 4.24 ESOB WS I4951 20 09 31.5 -61 50 54 2 2.49 10.61 ESOB WS I4952 20 08 37.6 -55 27 13 2 0.00 0.00 ESOB WS I4953 20 09 59.7 -62 47 30 2 2.41 3.54 ESOB WS I4954 20 04 45.01 +29 15 10.1 1 HCds I4954 comp 20 04 46.56 +29 13 45.9 1 HCds I4955 20 04 52.55 +29 11 33.4 1 HCds I4956 20 11 31.01 -45 35 33.8 4 3.45 1.95 ESOB WS GSC Pds I4957 20 09 35.5 -55 42 33 2 2.98 0.71 ESOB WS I4958 20 15 35.2 -72 42 40 2 0.31 2.12 WS ESOB I4959 20 10 57 -53 05.4 1o DS I4959?=I4961 20 11 28.86 -53 07 32.7 3 2.79 1.37 HCds WS ESOB I4960 20 15 23.9 -70 32 15 2 1.05 0.00 ESOB WS I4961=?I4959 20 11 28.86 -53 07 32.7 3 2.79 1.37 HCds WS ESOB I4962 20 16 42.3 -71 07 47 2 1.36 2.12 WS ESOB I4963 20 12 05.4 -55 14 44 2 1.81 2.12 ESOB WS I4964 20 17 24.2 -73 53 08 2 1.17 0.00 WS ESOB I4965 20 12 27.2 -56 49 35 2 1.16 0.00 ESOB WS I4966 20 12 16.4 -53 37 09 1 HCds I4966 sw * 20 12 15.64 -53 37 15.6 1 HCds I4966 m * 20 12 16.39 -53 37 09.0 1 HCds I4966 ne * 20 12 17.18 -53 37 02.1 1 HCds I4967 20 16 23.2 -70 33 52 2 1.75 0.71 WS ESOB I4968 20 14 50.0 -64 47 53 2 0.45 2.83 WS ESOB I4969 20 12 55.6 -53 55 15 2 6.22 0.00 ESOB WS I4970 20 16 57.24 -70 44 58.9 2 1.08 0.71 HCds WS I4971 20 17 03.3 -70 37 14 2 2.44 0.00 WS ESOB I4972 20 17 43.1 -70 54 52 2 0.00 2.83 ESOB WS I4973 20 14 34.0 -58 22 17 2 1.11 2.12 ESOB WS I4974n 20 15 26.17 -61 51 26.2 3 0.41 2.01 HCds Pds WS I4974n+s 20 15 26 -61 51.5 1 ESOB I4974s 20 15 27.04 -61 51 46.2 2 0.90 1.41 HCds WS I4974 comp 20 15 17.15 -61 51 46.9 1 HCds I4975 20 14 02.7 -52 43 19 2 1.92 2.83 ESOB WS I4976 20 15 41.01 -61 52 28.4 3 3.05 3.61 ESOB HCds WS I4977 20 11 53 -21 38.2 1o Big I4978 20 14 37.5 -54 25 20 2 3.69 1.41 ESOB WS I4979 20 14 41.7 -53 27 32 2 2.52 0.71 ESOB WS I4980 20 15 28.5 -57 54 44 2 4.49 2.83 ESOB WS I4981 20 19 39.3 -70 50 54 2 1.38 1.41 WS ESOB I4982 20 20 21.3 -71 00 26 2 2.40 0.71 WS ESOB I4983 20 16 06.0 -52 05 15 2 6.49 0.00 WS ESOB I4984 20 16 17.3 -52 42 11 2 2.56 2.83 ESOB WS I4985 20 20 44.7 -70 59 13 2 4.11 0.00 WS ESOB I4986 20 17 11.4 -55 02 08 2 0.00 2.83 ESOB WS I4987 20 17 19.5 -52 16 47 2 2.59 0.00 WS ESOB I4988 20 21 46 -69 23.3 1o DS I4988? 20 21 45.75 -69 23 14.7 1 HCds I4989 20 19 23.5 -58 33 05 2 2.20 2.12 ESOB WS I4990 20 21 25.6 -66 53 27 2 2.48 0.72 WS ESOB I4991 20 18 23.2 -41 03 00 2 2.39 0.00 ESOB WS I4992 20 23 27.7 -71 33 54 2 4.66 2.83 WS ESOB I4993 20 21 56.3 -66 59 08 2 0.41 0.00 WS ESOB I4994 20 19 44.3 -53 26 50 2 0.00 0.00 ESOB WS I4995 20 19 59.0 -52 37 19 2 0.64 0.00 WS ESOB I4996 20 16.6 +37 33 1 HCe I4996 core 20 16 33 +37 38.5 1 HCe I4997 20 20 08.67 +16 43 54.6 5 2.54 2.08 DKM1 Ty2 CK Bord GSC I4998:=I5018: 20 22 10.39 -38 18 30.1 3 3.21 1.76 ESOB HCds WS I4999 20 23 56.3 -26 00 53 2 0.95 1.41 WS ESOB I5000=N6901 20 22 21.61 +06 25 47.5 5 0.26 1.53 CCA GSC WS UZC GH I5001 20 26 19.8 -54 46 31 2 4.27 2.83 ESOB WS I5002 20 26 39.7 -54 48 00 2 3.04 2.83 ESOB WS I5003=I5029=I5039 20 43 14.15 -29 51 10.3 4 2.21 1.80 WS ESOB HCds GHD2 I5004=N6923 20 31 39.1 -30 49 55 2 1.82 1.41 WS GHD2 I5005 20 25 20.0 -25 49 43 2 0.95 2.83 WS ESOB I5006 20 23 46.9 +06 26 56 1 HCds I5006 n * 20 23 47.03 +06 26 58.4 1 HCds I5006 s * 20 23 46.82 +06 26 54.6 1 HCds I5007=I5030=I5041 20 43 34.39 -29 42 12.5 2 2.39 0.35 WS HCds I5008 20 32 44.8 -72 41 42 2 0.31 1.41 WS ESOB I5009 20 32 34.4 -72 10 00 2 0.32 6.36 WS ESOB I5010 20 30 26.6 -66 05 51 2 0.43 1.41 WS ESOB I5011=I5013 20 28 33.72 -36 01 36.8 4 1.51 2.63 Pds HCds WS ESOB I5011=I5013 se comp 20 28 34.89 -36 02 36.0 2 1.28 1.77 HCds WS I5011=I5013 nw comp 20 28 32.46 -36 01 15.6 1 HCds I5011=I5013 sw comp 20 28 31.37 -36 02 38.7 1 HCds I5012 20 29 32.3 -56 44 35 2 2.90 2.12 WS ESOB I5013=I5011 20 28 33.72 -36 01 36.8 4 1.51 2.63 Pds HCds WS ESOB I5013=I5011 se comp 20 28 34.89 -36 02 36.0 2 1.28 1.77 HCds WS I5013=I5011 nw comp 20 28 32.46 -36 01 15.6 1 HCds I5013=I5011 sw comp 20 28 31.37 -36 02 38.7 1 HCds I5014 20 35 15.7 -73 27 10 2 0.30 0.71 WS ESOB I5015:=N6925 20 34 20.7 -31 58 50 3 2.54 1.53 WS ESOB GHD2 I5016 20 35 36.9 -72 54 41 2 2.47 2.12 ESOB WS I5017 20 32 03.7 -57 35 17 2 2.26 2.83 ESOB WS I5018:=I4998: 20 22 10.39 -38 18 30.1 3 3.21 1.76 ESOB HCds WS I5019 20 30 47.0 -36 04 36 3 3.49 2.52 ESOB Pds WS I5020 20 30 38.2 -33 29 07 2 2.65 3.54 ESOB WS I5021 20 33 34.6 -54 31 16 2 4.29 3.54 WS ESOB I5022 20 41 06.3 -76 26 59 2 0.25 1.41 ESOB WS I5023 20 38 10.9 -67 11 05 2 7.76 0.00 WS ESOB I5024 20 40 09.5 -71 06 30 2 0.00 1.41 ESOB WS I5025 20 44 59.9 -76 59 04 2 2.12 1.41 WS ESOB I5026 20 48 27.9 -78 04 09 2 1.73 0.71 WS ESOB I5027 20 41 08.8 -55 28 20 2 1.20 2.83 ESOB WS I5028 20 43 21.9 -65 38 49 2 0.43 2.12 ESOB WS I5029=I5039=I5046 20 43 14.15 -29 51 10.3 4 2.21 1.80 WS ESOB HCds GHD2 I5030=I5041=I5047 20 43 34.39 -29 42 12.5 2 2.39 0.35 WS HCds I5031 20 45 20.19 -67 32 20.6 3 0.46 2.03 HCds WS Pds I5031+I5032 20 45 20 -67 32.7 1 ESOB I5032 20 45 21.87 -67 33 05.8 2 1.37 0.77 HCds WS I5033 20 43 55.2 -57 20 07 2 1.14 2.12 WS ESOB I5034 20 43 41.6 -57 01 50 2 1.15 1.41 ESOB WS I5035 20 44 14.5 -57 07 39 2 0.57 2.12 WS ESOB I5036 20 44 37.2 -57 37 36 2 2.26 0.00 ESOB WS I5037 20 45 39.3 -58 26 58 2 0.00 2.12 ESOB WS I5038 20 46 51.3 -65 01 00 2 0.44 0.71 ESOB WS I5039=I5029=I5046 20 43 14.15 -29 51 10.3 4 2.21 1.80 WS ESOB HCds GHD2 I5040 20 52 19.8 -76 41 10 2 1.45 2.12 WS ESOB I5041=I5030=I5047 20 43 34.39 -29 42 12.5 2 2.39 0.35 WS HCds I5042 20 47 46.2 -65 05 05 2 0.00 4.95 ESOB WS I5043 20 46 38.4 -56 59 04 2 0.58 2.12 WS ESOB I5044 20 50 41.4 -71 53 53 2 0.33 6.36 WS ESOB I5045 20 50 50.8 -71 54 33 2 4.24 4.24 WS ESOB I5046=I5029=I5039 20 43 14.15 -29 51 10.3 4 2.21 1.80 WS ESOB HCds GHD2 I5047=I5030=I5041 20 43 34.39 -29 42 12.5 2 2.39 0.35 WS HCds I5048 20 51 40.8 -71 48 03 2 1.31 0.00 WS ESOB I5049 20 47 23 -38 24.9 1 ESOB I5049n 20 47 23.33 -38 24 47.9 2 1.82 0.78 HCds WS I5049s 20 47 23.79 -38 25 05.7 2 0.91 1.06 HCds WS I5050 20 45 14.96 -05 37 22.6 3 2.88 2.01 SPC WS GSC I5051 20 52 23.2 -71 47 20 2 1.97 1.41 WS ESOB I5052 20 52 06.6 -69 12 15 3 2.44 4.04 ESOB RC2 WS I5053 20 53 36.1 -71 08 26 3 0.73 5.00 WS ESOB Pds I5054 20 53 45.2 -71 01 28 2 0.34 2.83 ESOB WS I5055 20 52 57.2 -68 26 41 2 3.09 1.41 ESOB WS I5056 20 48 59 -39 10.9 1o DS I5057 20 47 13.47 +00 19 19.3 3 1.19 2.22 WS GSC HCm I5058=N6965 20 47 20.38 +00 28 59.9 6 2.71 2.24 GH GSC SPC UZC HCm WS I5059 20 51 13.3 -57 41 20 2 1.69 0.00 ESOB WS I5060 20 54 46.5 -71 38 13 2 1.65 2.83 WS ESOB I5061 20 47 37.10 +00 20 08.9 3 1.65 0.46 GSCm HCm WS I5061 s * 20 47 36.73 +00 19 56.9 1 GSC I5061 n * 20 47 36.97 +00 20 18.4 1 GSC I5061 e * 20 47 37.17 +00 20 10.7 1 GSC I5062 20 48 10.2 -08 21 35 1 HCds I5062 sw * 20 48 09.86 -08 21 38.6 1 HCds I5062 ne * 20 48 10.50 -08 21 31.1 1 HCds I5063 20 52 02.0 -57 04 11 2 0.57 0.71 WS ESOB I5064 20 52 38.2 -57 13 55 2 1.71 4.24 WS ESOB I5065 20 51 45.92 -29 50 51.6 3 2.25 2.62 WS HCds ESOB I5066 20 57 02.8 -73 08 52 2 1.52 0.00 ESOB WS I5067 20 47 50 +44 22.0 1o TE I5067? 20 47 36 +42 54.2 1 HCe I5068 20 50 29 +42 28.7 1 HCe I5069 21 00 10.24 -71 48 37.8 2 0.29 2.05 HCds WS I5070 20 51 00 +44 24.1 1 HCe I5071 21 01 19.8 -72 38 34 2 0.63 2.83 ESOB WS I5072 21 01 56.5 -72 59 18 2 0.61 0.71 WS ESOB I5073 21 03 19.8 -72 41 16 2 0.31 2.12 WS ESOB I5074 21 01 01.3 -63 09 13 2 6.66 0.71 WS ESOB I5075 21 04 37.80 -71 52 05.3 2 2.16 1.47 WS HCds I5076 20 55 33 +47 23.7 1 HCe I5077 21 08 53.7 -73 38 27 2 2.07 0.00 ESOB WS I5078 21 02 31.41 -16 49 02.9 4 4.56 4.09 WS HCo SPF SHM I5079 21 05 30 -56 14.9 1o Inn I5079? 21 05 43.95 -56 13 48.9 2 0.70 0.00 AC22 HCds I5080 21 02 33.081 +19 12 48.93 3 0.29 0.12 KHJ GSC Pds I5081 21 03 01.14 +19 11 20.4 2 0.30 2.76 GSC WS I5082=N7010 21 04 39.499 -12 20 18.20 1 KHJ I5083 21 03 51.5 +11 45 48 3 1.70 1.00 WS Pds UZC I5084 21 09 14.3 -63 17 24 3 1.77 0.58 ESOB WS Pds I5085 21 13 27.7 -74 06 10 2 0.57 2.83 WS ESOB I5086: 21 08 32.01 -29 46 08.3 3 0.69 1.25 WS HCds ESOB I5087 21 14 21.66 -73 46 25.5 3 0.66 1.01 HCds WS GSC I5088 21 09 26.730 -22 52 42.89 2 0.52 0.04 WS KHJ I5089 21 10 54.504 -03 51 46.04 2 0.44 0.01 HCds KHJ I5090 21 11 30.49 -02 01 55.0 5 0.72 1.66 DC UZC SPC CCA WS I5091 21 17 37.1 -70 39 09 2 1.74 2.83 ESOB WS I5092 21 16 14.0 -64 27 54 2 1.36 2.12 ESOB WS I5093 21 18 46.2 -70 37 22 2 2.09 0.00 ESOB WS I5094 21 17 49.2 -66 25 41 2 2.10 0.71 ESOB WS I5095 21 17 22.0 -59 56 50 2 0.53 2.83 WS ESOB I5096 21 18 21.7 -63 45 40 2 2.33 0.00 WS ESOB I5097 21 14 58 +04 28.2 1o Bige I5097: 21 14 57.9 +04 29 02 3 2.28 3.00 WS HC HCds I5097: ne * 21 14 58.47 +04 28 59.5 1 HCds I5097: nw * 21 14 57.78 +04 29 12.3 1 HCds I5097: se * 21 14 58.40 +04 28 54.3 1 HCds I5097: sw * 21 14 57.59 +04 29 04.4 1 HCds I5097? 21 14 58.56 +04 28 12.5 1 HCds I5098 21 15 00 +04 30.1 1o Bige I5098: 21 15 01.5 +04 29 40 2 2.12 5.66 HC HCds I5098: nw * 21 15 01.10 +04 29 48.6 1 HCds I5098: se * 21 15 02.05 +04 29 40.4 1 HCds I5099 21 21 49.3 -70 58 57 2 1.03 2.83 WS ESOB I5100 21 21 43.6 -65 56 00 2 0.43 0.00 WS ESOB I5101 21 21 55.76 -65 50 11.8 3 3.65 1.22 ESOB HCds WS I5102 21 26 13.8 -73 18 37 2 2.41 0.00 WS ESOB I5103 21 29 13.2 -74 04 11 2 1.15 0.00 ESOB WS I5104 21 21 29.32 +21 14 28.4 5 1.02 1.79 UZC WS Pds CCA DC I5105 21 24 22.0 -40 32 14 2 1.61 6.36 WS ESOB I5105A 21 25 30.7 -40 16 27 2 1.61 2.83 ESOB WS I5105B 21 26 00.7 -40 50 06 2 8.00 1.41 WS ESOB I5106 21 28 37.9 -70 50 06 2 0.34 0.00 WS ESOB I5107 21 28 15.1 -65 44 07 2 3.03 1.41 WS ESOB I5108 21 32 51.3 -72 39 38 2 1.87 6.35 WS ESOB I5109 21 33 42.7 -74 06 45 2 0.29 2.83 WS ESOB I5110 21 30 43.2 -60 00 07 2 2.11 2.12 ESOB WS I5111 21 28 10.8 +02 28 25 3 1.50 0.58 Pds UZC WS I5112 21 29 29.5 +06 46 55 1o Big I5112: 21 29 29.39 +06 47 07.1 2 1.79 0.92 HCds HCo I5112? 21 29 28.13 +06 47 56.5 2 0.11 0.99 2MSX HCds I5113 21 29 40.5 +06 49 09 1o Big I5113: 21 29 39.57 +06 49 04.3 2 1.69 0.64 HCds HCo I5113? 21 29 40.35 +06 48 45.3 1 HCds I5113?? 21 29 42.65 +06 48 18.1 1 HCds I5114=N7091 21 34 07.80 -36 39 12.8 4 1.15 3.56 ESOB WS Pds HCds I5115 21 30 57.2 +11 45 46 2 3.12 0.71 WS Pds I5116 21 37 05.2 -70 58 58 2 0.34 3.54 WS ESOB I5117 21 32 30.938 +44 35 47.99 4 0.48 0.24 SIMB UJ10 2MSP CK I5118 21 42 13.6 -71 22 59 2 2.01 2.12 ESOB WS I5119 21 33 55.95 +21 50 14.5 4 0.72 1.89 CCA WS UZC Pds I5120=N7096A 21 38 48.35 -64 21 02.4 2 1.55 0.49 WS HCds I5121=N7096 21 41 19.3 -63 54 32 3 2.48 5.57 WS Pds ESOB I5122 21 39 45.846 -22 24 23.21 3 0.33 0.24 ESOB WS KHJ I5123 21 44 49.5 -72 25 16 2 1.27 2.12 WS ESOB I5124 21 39 55.0 -22 25 36 2 3.92 2.12 ESOB WS I5125 21 41 50.3 -52 46 21 2 0.64 4.95 WS ESOB I5126 21 40 28.58 -06 20 42.8 3 1.07 0.93 HCds GSC HCo I5127 21 39 48.9 +06 17 08 1o Big I5127:=N7102 21 39 44.51 +06 17 09.8 7 1.86 1.92 DC HCds WS GH Pds UZC CCA I5128 21 43 11.6 -38 58 04 2 0.82 2.83 ESOB WS I5129 21 47 46.7 -65 23 16 2 1.31 0.00 WS ESOB I5130 21 50 24.1 -73 59 52 2 2.88 0.71 ESOB WS I5131 21 47 25.5 -34 53 04 2 2.60 0.71 WS ESOB I5132 21 42 40.20 +66 10 06.4 1 HCds I5133 21 42 47.13 +66 10 52.0 1 HCds I5134 21 42 58.66 +66 06 08.2 1 HCds I5135=N7130 21 48 19.44 -34 57 09.6 3 1.26 1.50 WS HCds ESOB I5136?=N7135 21 49 45.95 -34 52 35.5 2 0.95 0.21 HCds WS I5137 21 51 37 -65 35.0 1o DS I5138 21 53 21.6 -68 57 13 2 1.51 2.83 WS ESOB I5139 21 50 25.6 -30 59 41 2 0.00 3.54 ESOB WS I5140 21 54 15.8 -67 19 51 2 0.40 2.83 WS ESOB I5141 21 53 17.2 -59 29 37 2 1.60 1.41 WS ESOB I5142 21 55 20.1 -65 30 36 2 0.44 2.83 WS ESOB I5143=N7155 21 56 09.8 -49 31 17 2 0.69 4.95 ESOB WS I5144 21 54 09.467 +15 02 11.53 3 1.36 1.27 HCds UZC KHJ I5144 comp 21 54 07.83 +15 02 02.8 1 HCds I5145 21 54 23.04 +15 09 22.9 5 1.52 1.45 HCds WS Pds UZC CCA I5146 21 53 28.76 +47 16 00.9 1 HCds I5147 21 59 25.9 -65 27 00 2 2.18 0.71 ESOB WS I5148=I5150 21 59 35.07 -39 23 09.0 6 2.14 1.59 ESOB BSV UB10 HCo CK GSC I5149 21 58 58.83 -27 24 51.0 3 3.83 2.05 ESOB WS GSC I5150=I5148 21 59 35.07 -39 23 09.0 6 2.14 1.59 ESOB BSV UB10 HCo CK GSC I5151 21 58 52.70 +03 45 42.5 3 1.50 0.76 HCds UZC Pds I5152 22 02 41.61 -51 17 46.4 6 4.32 1.29 HC2m ESOB HC2m GSCM WS HCht I5153 22 00 23.6 +17 51 46 2 1.01 0.71 HCds WS I5153 * 22 00 23.46 +17 51 42.2 1 HCds I5153 gal 22 00 23.52 +17 51 50.7 1 HCds I5154 22 04 29.9 -66 06 54 2 2.55 2.83 WS ESOB I5155 22 02 06.3 +00 29 17 1 HCds I5155 w* 22 02 05.84 +00 29 15.4 1 HCds I5155 e* 22 02 06.64 +00 29 18.9 1 HCds I5156 22 03 14.7 -33 50 15 2 4.39 0.71 WS ESOB I5157 22 03 26.9 -34 56 29 2 0.87 2.12 ESOB WS I5158 22 06 25.0 -67 31 04 2 1.61 0.00 WS ESOB I5159 22 02 39.86 +00 19 10.2 1 HCds I5160 22 03 04.845 +10 55 29.39 3 0.97 0.60 Pds KHJ CCA I5161 22 05 38.976 +09 38 23.65 4 0.41 0.97 Pds UZC GSC KHJ I5162 22 08 03.3 -52 42 49 2 5.11 1.41 WS ESOB I5163 22 05 47 +27 05.1 1 HCds I5163 sw * 22 05 45.88 +27 04 49.3 1 HCds I5163 m * 22 05 46.76 +27 05 03.9 1 HCds I5163 ne * 22 05 49.67 +27 05 29.3 1 HCds I5163 sw + m * 22 05 46.4 +27 04 57 1 WS I5163 m + ne *s 22 05 47.8 +27 05 25 1o Big I5164 22 05 58.26 +27 02 49.5 2 1.23 1.91 HCds WS I5165 22 10 06.9 -64 34 40 2 0.45 3.54 WS ESOB I5166 22 06 06.84 +27 04 04.8 1 HCds I5167 22 07 31.72 -08 07 20.5 1 HCds I5168 22 08 45.5 -27 51 23 3 0.00 1.53 ESOB GHD2 WS I5169 22 10 09.8 -36 05 20 3 2.79 1.15 ESOB Pds2 WS I5170 22 12 29.8 -47 13 19 2 2.87 1.41 WS ESOB I5171 22 10 56.4 -46 04 55 2 3.66 2.12 ESOB WS I5172 22 09 55.5 +12 49 02 2 2.07 2.12 WS Pds I5173 22 14 45 -69 21.9 1 ESOB I5173e=I5173A 22 14 44.50 -69 21 56.9 2 0.59 1.56 WS HCds I5173w=I5173B 22 14 38.32 -69 22 03.4 2 0.07 1.20 WS HCds I5174 22 12 44.6 -38 10 19 3 2.96 1.00 WS Pds ESOB I5175 22 12 48.0 -38 07 38 2 2.49 0.71 ESOB WS I5176 22 14 54.7 -66 50 57 2 1.65 6.36 ESOB WS I5177 22 11 34.35 +11 47 43.6 4 0.70 2.16 WS UZC CCA Pds I5178 22 12 33.0 -22 57 19 2 3.90 2.12 ESOB WS I5179=I5184=I5183 22 16 09.21 -36 50 39.1 2 3.81 4.81 WS HCds I5180 22 11 12.07 +38 55 37.7 5 1.48 3.65 WS UZC CCA SBG2 HC I5181 22 13 21.4 -46 01 06 3 1.58 0.58 Pds2 ESOB WS I5182 22 16 05.1 -65 27 19 2 1.31 1.41 WS ESOB I5183=I5179=I5184 22 16 09.21 -36 50 39.1 2 3.81 4.81 WS HCds I5184=I5183=I5179 22 16 09.21 -36 50 39.1 2 3.81 4.81 WS HCds I5185 22 17 43.7 -65 51 28 2 0.86 0.71 ESOB WS I5186 22 18 46.51 -36 48 04.5 3 0.41 2.63 ESOB HCds WS I5187 22 18 17.93 -59 36 27.4 3 1.51 0.52 ESOB WS GSC I5188 22 18 26.02 -59 38 26.7 3 2.05 1.33 ESOB GSC WS I5189 22 16 14.19 -05 00 16.9 2 0.84 1.91 HCds WS I5190 22 19 00.9 -59 52 57 2 0.53 2.12 WS ESOB I5191 22 15 02.53 +37 18 00.6 5 1.22 1.20 WS GSC HC SBG2 CCA I5192 22 15 14.4 +37 16 20 2 2.54 3.54 HC GSC I5192 gal 22 15 14.1 +37 16 12 1 WS I5193 22 15 43.650 +37 14 35.28 3 2.01 1.54 KHJ GSC HC I5194 22 17 08.1 -15 56 44 1o Bige I5195 22 15 41.65 +37 18 11.3 3 1.46 1.45 GSC SBG2 HC I5196 22 20 11.48 -65 24 17.3 3 1.60 1.85 WS HCds ESOB I5197 22 19 49.7 -60 08 12 2 3.67 0.00 WS ESOB I5198=N7246 22 17 42.71 -15 34 15.6 5 1.27 1.79 WS Pds GSC SPC HCds I5199 22 19 33.0 -37 32 01 3 1.19 2.08 WS ESOB Pds I5200 22 22 15.1 -65 45 58 2 4.31 2.83 ESOB WS I5201 22 20 57.44 -46 02 07.1 4 0.97 2.19 ESOB HC2m HCds WS I5202 22 22 54.8 -65 48 08 2 4.30 2.12 ESOB WS I5203 22 22 34.7 -59 46 25 2 4.24 0.00 WS ESOB I5204:=N7300 22 30 59.97 -14 00 12.0 4 0.69 1.74 WS GHD2 SPF SPC I5205 22 22 47.9 -59 47 13 3 1.30 0.00 WS ESOB Pds2 I5206 22 24 04.3 -66 51 29 2 3.30 0.00 ESOB WS I5207 22 23 29.2 -60 33 55 2 0.52 2.12 WS ESOB I5208 22 24 33.9 -65 13 40 2 1.76 0.00 ESOB WS I5209 22 23 08.8 -37 59 40 2 4.16 2.83 ESOB WS I5210 22 22 31.2 -18 52 11 2 3.01 2.12 WS ESOB I5211 22 22 43.1 -18 52 48 2 5.00 0.71 WS ESOB I5212 22 23 30.4 -38 02 17 2 2.50 0.00 WS ESOB I5213 22 25 05.1 -60 28 37 2 2.07 2.83 WS ESOB I5214 22 23 42 -27 28.2 1o Sw12 I5215 22 26 58.2 -65 58 59 2 1.71 0.00 WS ESOB I5216 22 24 44 -18 05.3 1o J I5217 22 23 55.680 +50 58 00.47 4 0.40 0.45 GSC CK UJ10 2MSP I5218 22 28 06.3 -60 23 41 2 4.68 2.12 WS ESOB I5219 22 28 43.6 -65 53 38 2 4.29 0.00 ESOB WS I5220 22 28 02.4 -59 43 22 2 0.53 1.41 WS ESOB I5221 22 28 57.9 -65 54 18 2 0.43 2.83 WS ESOB I5222 22 29 54.2 -65 39 42 2 3.90 0.00 ESOB WS I5223 22 29 44.811 +07 59 19.45 3 0.55 0.45 KHJ GSC CCA I5224 22 30 29.8 -45 59 40 2 2.20 7.78 ESOB WS I5225=N7294 22 32 07.96 -25 23 52.9 4 2.19 3.86 WS ESOB Pds GSC I5226 22 32 30.09 -25 39 43.7 2 2.10 0.42 ESOB HCds I5227 22 34 03.7 -64 41 53 2 0.90 0.00 WS ESOB I5228=N7302 22 32 23.8 -14 07 15 3 0.84 0.58 SPC GHD2 WS I5229 22 34 50.3 -61 22 56 2 0.00 3.54 ESOB WS I5230 22 35 40.2 -61 32 51 2 0.00 0.00 ESOB WS I5231 22 34 00.779 +23 20 17.92 4 2.89 1.18 KET2 KHJ UZC KEBA I5232 22 37 38.3 -68 52 18 2 0.00 0.00 ESOB WS I5233 22 36 32.96 +25 45 46.9 3 0.68 0.58 UZC CCA WS I5234 22 40 11.2 -65 49 28 2 2.15 2.83 ESOB WS I5235 22 41 25.3 -66 34 49 2 2.09 1.41 ESOB WS I5236 22 41 30.3 -66 37 02 2 1.25 3.54 ESOB WS I5237=N7361 22 42 17.92 -30 03 28.9 4 0.06 1.29 HCds ESOB WS GHD2 I5238 22 41 29.4 -60 45 29 2 5.14 0.71 ESOB WS I5239 22 31 07.07 -38 01 35.7 4 1.19 1.89 ESOB MFSK WS HCds I5240 22 41 52.3 -44 46 03 2 2.25 2.12 WS ESOB I5241 22 41 38.68 +02 38 21.1 6 2.24 1.23 WS SPC UZC SPF CCA K11 I5242 22 41 15.23 +23 24 24.3 4 1.32 1.11 WS HCds CCA UZC I5243 22 41 24.52 +23 22 31.8 7 1.29 2.77 K10 WS DC CCA HCds UZC KEBA I5244 22 44 13.5 -64 02 34 2 0.00 2.83 ESOB WS I5245 22 44 56.26 -65 21 28.9 3 2.17 1.97 ESOB HCds WS I5246 22 46 39.2 -64 53 50 2 2.67 4.95 ESOB WS I5247 22 46 49.8 -65 16 27 2 1.32 1.41 ESOB WS I5248 22 44 42.8 -00 20 22 1o Big I5249 22 47 06.4 -64 49 51 2 0.45 0.00 WS ESOB I5250 22 47 19 -65 03.5 1 ESOB I5250 comp 22 47 24 -65 03.4 1 ESOL I5250e=I5250B 22 47 21.98 -65 03 31.5 2 0.49 1.56 WS HCds I5250w=I5250A 22 47 17.32 -65 03 37.9 2 1.33 2.62 WS HCds I5251 22 45 10.7 +11 09 28 2 1.04 2.12 HCds WS I5251 sw * 22 45 10.29 +11 09 29.2 1 HCds I5251 n * 22 45 10.54 +11 09 34.1 1 HCds I5251 se * 22 45 10.89 +11 09 27.2 1 HCds I5252 22 48 08.8 -68 54 10 2 0.38 2.12 WS ESOB I5253 22 45 29.02 +21 48 28.1 4 1.10 1.27 WS Pds UZC CCA I5254 22 46 00.3 +21 07 30 2 5.95 1.41 WS K11 I5255 22 45 46 +36 13.6 1o EEB I5256 22 49 45.7 -68 41 28 2 2.67 2.83 WS ESOB I5257 22 52 16.2 -67 25 09 2 1.61 1.41 ESOB WS I5258 22 51 31.587 +23 04 50.05 4 0.92 0.84 DC KHJ UZC CCA I5259 22 55 14.62 +36 40 18.2 3 1.17 1.57 SBG2 HCds LEDA I5260=N7404 22 54 18.59 -39 18 54.4 3 1.20 0.40 HCds ESOB WS I5261 22 54 25.2 -20 21 48 3 2.81 0.58 ESOB WS SPC I5262 22 55 20 -33 53.5 1 ESOB I5262=I5262nw 22 55 20.41 -33 53 16.4 2 1.40 3.54 HCds WS I5262se 22 55 22.26 -33 53 41.8 2 0.53 1.48 HCds WS I5263 22 58 13.65 -69 03 09.2 3 1.51 3.72 WS HCds ESOB I5264 22 56 52.64 -36 33 16.2 3 0.73 1.59 HCds ESOB WS I5265=I1459 22 57 10.55 -36 27 44.8 8 1.01 1.04 WS ESOB RC2 HCds DWFo EWSr DWFr HC2m I5266 22 58 20.66 -65 07 45.3 4 1.91 1.39 ESOB HCds Pds WS I5267 22 57 13.49 -43 23 47.0 7 1.83 2.55 ESOB GC Pds2 HC HC2m HCds WS I5267A 22 55 56.2 -43 26 08 2 0.77 6.36 HC WS I5267B 22 56 57.1 -43 45 37 3 1.65 1.53 HC WS Pds I5268 22 56 12 +36 35.8 1o EEB I5268? 22 56 18.0 +36 35 59 1 WS I5269 22 57 43.4 -36 01 35 2 0.85 3.54 WS Pds I5269A 22 55 55.68 -36 20 54.1 3 0.87 2.59 WS ESOB HCds I5269B 22 56 36.5 -36 14 59 2 0.00 2.83 ESOB WS I5269C 23 00 48.2 -35 22 14 2 0.00 2.83 ESOB WS I5270 22 57 54.93 -35 51 28.4 3 2.31 2.28 HCds ESOB WS I5271 22 58 01.8 -33 44 32 2 3.52 1.41 WS ESOB I5272 22 59 31.28 -65 11 35.6 3 2.33 0.64 HCds WS ESOB I5273 22 59 26.5 -37 42 18 2 4.18 3.54 HCds WS I5274 22 58 27.681 +18 55 07.05 6 0.85 0.69 HCds KHJ GSC Pds UZC CCA I5275 22 58 39.3 +18 51 43 2 3.02 2.12 WS HCds I5275 w * 22 58 38.76 +18 51 43.8 1 HCds I5275 m * 22 58 39.37 +18 51 46.1 1 HCds I5275 e * 22 58 40.16 +18 51 44.9 1 HCds I5276 22 58 39.78 +18 49 11.0 4 0.28 1.94 WS UZC GSC HCds I5277 23 01 59.3 -65 11 52 2 0.88 2.12 ESOB WS I5278 23 00 15.92 -08 10 44.5 3 0.77 0.87 GSC WS SPF I5279 23 03 02.4 -69 12 37 2 1.49 0.00 WS ESOB I5280 23 03 50.1 -65 12 29 2 0.00 2.12 ESOB WS I5281 23 02 23.49 +27 00 23.0 1 HCds I5282 23 02 48.24 +21 52 25.8 4 1.47 0.82 WS UZC CCA Pds I5283 23 03 17.9 +08 53 35 3 4.28 0.58 WS UZC GH I5284 23 06 46.32 +19 07 18.0 5 1.26 2.35 K16 CCA WS UZC GH I5285 23 06 58.895 +22 56 11.02 5 1.86 1.92 DC Pds UZC KHJ CCA I5286 23 09 56.2 -68 15 16 2 1.94 3.54 WS ESOB I5287 23 09 20.31 +00 45 22.5 5 0.32 0.69 GSC SPC UZC WS CCA I5288 23 11 44.1 -68 05 40 2 1.56 0.00 ESOB WS I5289 23 11 17.16 -32 27 07.9 3 1.54 3.04 ESOB WS HCds I5289 se knot 23 11 16.96 -32 27 20.8 1 HCds I5290=?N7520 23 12 53.0 -23 28 12 2 1.94 4.24 ESOB WS I5291 23 13 39.59 +09 14 28.7 3 0.94 1.00 WS K10 GSC I5292 23 13 47.1 +13 41 12 3 0.84 1.73 WS K15 UZC I5293 23 14 44.674 +25 08 25.89 2 0.46 0.47 KHJ Pds I5294=N7552 23 16 10.77 -42 35 05.0 4 1.56 2.84 WS HC2m ESOB RC2 I5295 23 15 29.073 +25 07 13.97 2 1.41 0.34 Pds2 KHJ I5296 23 15 43.80 +25 05 39.4 5 1.25 1.95 WS Pds HCds UZC CCA I5296 comp 23 15 43.91 +25 04 52.8 1 HCds I5297 23 15 58.427 +25 01 31.33 2 0.32 0.85 HCds KHJ I5298 23 16 00.64 +25 33 24.2 3 1.36 0.87 HCds WS UZC I5299 23 16 19.14 +20 51 21.2 2 0.20 3.18 HCds WS I5299 sup * 23 16 19.37 +20 51 14.7 1 HCds I5300 23 16 34.09 +20 49 42.3 4 0.45 1.65 HCds WS Pds GSC I5300 comp 23 16 35.35 +20 50 00.5 1 HCds I5301 23 18 59.1 -69 33 46 2 0.37 0.00 WS ESOB I5302 23 19 36.5 -64 34 09 2 0.45 0.71 ESOB WS I5303 23 17 54.8 +00 15 51 2 1.06 0.71 HCds WS I5303 sw * 23 17 54.40 +00 15 47.7 1 HCds I5303 ne * 23 17 54.98 +00 15 56.4 1 HCds I5304 23 18 52.539 -10 15 34.61 2 0.30 1.66 SPC KHJ I5305 23 18 06.253 +10 17 58.93 4 0.73 0.54 KHJ UZC GSC Pds I5306 23 18 11.33 +10 14 44.2 2 0.10 2.33 GSC WS I5307 23 18 22.032 +10 14 08.49 2 0.04 0.30 KHJ GSC I5308=N7599 23 19 20.92 -42 15 25.0 4 1.39 3.77 WS ESOB RC2 HC2m I5309 23 19 11.76 +08 06 33.2 4 0.07 0.54 Hu UZC WS CCA I5310 23 20 47.704 -22 08 57.46 2 1.51 0.28 KHJ WS I5311 23 20 33.7 +17 15 56 1o Bige I5311: 23 20 37.84 +17 16 25.7 2 1.83 1.70 HCds WS I5311: sw * 23 20 37.55 +17 16 25.2 1 HCds I5311: ne * 23 20 37.95 +17 16 28.5 1 HCds I5311? 23 20 33.61 +17 15 28.4 1 HCds I5312 23 20 58.333 +19 19 04.47 3 0.77 0.65 UZC KHJ Pds I5313=N7632 23 22 01.01 -42 28 48.0 3 2.61 3.30 HCds WS ESOB I5314 23 21 08.6 +19 18 40 2 1.00 0.00 WS Pds I5315 23 21 18.266 +25 23 07.15 3 0.43 0.61 KHJ CCA UZC I5316 23 21 54.116 +21 12 09.14 2 0.02 0.04 KHJ GSC I5317 23 23 28.7 +21 09 47 3 0.00 1.53 WS UZC Pds I5318=:N7646 23 24 06.90 -11 51 38.2 7 0.78 1.30 GSC Pds2 WS SPF HCds SPC HCo I5319 23 24 48.950 +13 59 47.33 1 KHJ I5320 23 28 21.69 -67 45 35.5 3 1.19 2.07 ESOB WS HCds I5321 23 26 20.1 -17 57 22 3 0.82 4.36 WS ESOB SPC I5322 23 28 30.65 -67 45 39.3 3 1.48 0.69 ESOB HCds WS I5323 23 27 36.61 -67 48 54.1 3 2.85 2.03 ESOB HCds WS I5324 23 28 17.20 -67 49 16.4 3 3.04 1.32 ESOB HCds WS I5325 23 28 43.21 -41 20 00.1 3 2.27 2.50 WS ESOB HC2m I5326 23 29 35.0 -28 49 52 2 2.78 2.12 ESOB WS I5327=I1495 23 30 47.6 -13 29 08 2 2.06 0.00 WS SPC I5328 23 33 16.64 -45 00 58.7 3 3.70 2.04 WS HCds ESOB I5328A 23 33 13.71 -45 01 28.1 2 1.72 2.76 WS HCds I5328B 23 33 58.8 -45 12 34 2 0.00 1.41 WS Pds I5329 23 33 09.70 +21 14 12.7 5 0.38 1.56 GSC WS Pds K14 CCA I5330 23 33 26.32 -02 52 59.3 1 HCds I5331 23 33 24.83 +21 07 47.1 4 1.20 1.08 Pds UZC GSC CCA I5332 23 34 27.44 -36 06 04.3 5 0.75 2.53 GSCM WS HC2m GC ESOB I5333=N7697 23 34 52.63 -65 23 45.7 4 1.68 2.30 WS ESOB HCds Pds I5334 23 34 36.4 -04 32 02 3 0.86 2.08 WS SPC Pds I5335 23 35 47.0 -67 23 45 2 1.61 4.95 ESOB WS I5336ne 23 36 20.6 +21 05 45 2 3.97 0.71 WS HCo I5336nw 23 36 18.6 +21 05 56 2 1.98 1.41 HCo WS I5337 23 36 25.08 +21 09 01.9 4 0.07 3.46 WS K14 UZC GSC I5338 23 36 30.49 +21 08 43.8 4 0.99 3.62 WS UZC CCA GSC I5339 23 38 05.2 -68 26 33 2 0.77 2.12 ESOB WS I5340 23 38 32 -04 51.3 1o Big I5340?? 23 38 36.7 -04 52 34 1 WS I5341 23 38 26.786 +26 59 06.62 5 1.31 2.87 HC Pds KHJ RG GSC I5342 23 38 38.768 +27 00 40.50 5 1.73 1.45 HC KHJ RG GSC Pds I5343 23 39 22.4 -22 29 51 2 0.00 0.71 ESOB WS I5344 23 39 15.8 -04 58 00 1o Big I5345 23 39 32.3 -22 24 50 2 0.98 2.12 WS ESOB I5346 23 41 06.328 +24 57 00.16 3 0.34 0.80 HCds KHJ Pds I5347 23 41 36.712 +24 53 09.10 2 0.21 0.45 KHJ Pds I5348=N7744 23 44 59.20 -42 54 38.3 3 0.32 1.42 HCds ESOB WS I5349 23 46 22.9 -28 00 47 2 2.80 39.60 HCds ESOB I5349sw 23 46 22.70 -28 00 20.3 2 1.68 0.92 WS HCds I5349ne 23 46 23.03 -28 00 09.2 1 HCds I5350 23 47 14.8 -27 57 27 2 2.80 3.54 WS ESOB I5351 23 47 18.92 -02 18 49.7 2 0.64 2.62 HKA WS I5352 23 47 19.83 -02 16 52.6 2 0.32 1.34 HKA WS I5353 23 47 28.75 -28 06 32.4 3 2.09 1.00 WS HCds ESOB I5354=I5354sw 23 47 28.23 -28 08 09.0 3 3.47 1.51 ESOB HCds WS I5354ne 23 47 29.66 -28 08 01.7 2 1.31 0.92 HCds WS I5355 23 47 15.28 +32 46 57.7 6 1.59 2.35 WS BPP UZC DC CCA K04 I5356 23 47 23.83 -02 21 05.4 2 2.33 0.28 HKA WS I5357 23 47 22.97 -02 18 03.2 3 1.65 0.55 SPC HKA WS I5358 23 47 45.10 -28 08 28.2 2 0.28 3.04 WS HCds I5358 comp 23 47 43.27 -28 08 37.3 2 0.37 1.48 HCds WS I5359 23 47 37.83 -02 19 02.7 2 0.32 1.20 HKA WS I5360 23 47 53 -37 03.5 1o Sw11 I5361=N7761 23 51 28.868 -13 22 54.14 2 0.38 0.59 SPC KHJ I5362=:I5363 23 51 36.81 -28 21 53.1 3 1.19 3.08 HCds WS Pds I5363:=I5362 23 51 36.81 -28 21 53.1 3 1.19 3.08 HCds WS Pds I5364 23 56 24.6 -29 01 23 2 0.00 0.71 ESOB HCds I5364e 23 56 25.18 -29 01 24.6 2 0.46 3.11 WS HCds I5364w 23 56 23.89 -29 01 24.3 3 0.80 2.50 HCds Pds WS I5365 23 57 34 -37 01.5 1o Sw11 I5366 23 57 40 +52 47.5 1o EEB I5366? 23 57.7 +50 47 1 HCe I5367 23 58 38.914 +22 26 56.59 2 0.14 0.20 KHJ GSC I5368=I1523 23 59 06.593 +06 52 25.13 2 0.01 3.01 KHJ HCds I5369 23 59 50.55 +32 42 07.7 4 1.25 1.34 BPP GSC WS UZC I5370 00 00 09.150 +32 44 18.51 4 0.77 1.24 BPP UZC KHJ GSC I5371 00 00 14.7 +32 49 54 3 0.73 1.53 BPP HCo UZC I5372 00 00 16.239 +32 47 33.03 3 0.62 0.83 UZC KHJ GSC I5373 00 00 29.00 +32 46 55.6 5 3.94 2.24 WS HCo GSC WS BPP I5374 00 01 04.54 +04 30 01.1 3 0.60 4.01 GSC WS Pds2 I5375 00 01 04.83 +04 32 30.8 4 0.72 7.29 UZC GSC Pds WS I5376 00 01 19.87 +34 31 31.7 4 0.82 1.66 UZC WS CCA SBG1 I5377 00 02 05.44 +16 35 24.2 4 1.18 0.86 HCo Pds CCA WS I5378n 00 02 37.73 +16 39 06.4 3 1.96 2.05 WS HCo CCA I5378s 00 02 37.899 +16 38 37.26 5 0.35 0.66 HCo UZC KHJ GSC CCA I5379 00 02 40.7 +16 35 59 4 1.81 1.91 HCo Pds Pds2 WS I5380 00 02 49.1 -66 11 12 2 3.39 1.41 ESOB WS I5381 00 03 11.27 +15 57 54.8 5 2.17 1.69 WS UZC GSC CCA GH I5382 00 03 26.3 -65 11 48 2 0.44 1.41 WS ESOB I5383 00 03 48.8 +16 00 51 1o J I5384=N7813 00 04 09.23 -11 59 03.4 4 1.10 0.70 HCds WS KET2 SPC I5385 00 06 23 -00 04.6 1o HH I5386=N7832 00 06 28.42 -03 42 59.1 4 0.73 2.17 WS HCds SPC Pds astrometry.net-0.67/catalogs/Makefile000644 000765 000024 00000012156 12651445460 020030 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE BASEDIR := .. COMMON := $(BASEDIR)/util DATA := . all: .PHONY: all include $(COMMON)/makefile.common # required for build-hd-tree include $(COMMON)/makefile.anfiles # 2masstofits include $(COMMON)/makefile.zlib #include $(COMMON)/makefile.libkd #include $(COMMON)/makefile.anutils $(DATA)/%.txt: ; $(DATA)/%.dat: ; ngc2000.o: ngc2000.c ngc2000names.c ngc2000entries.c ngc2000names.c: parse-ngc2000names.awk $(DATA)/ngc2000names.dat $(AWK) -f parse-ngc2000names.awk < $(DATA)/ngc2000names.dat > $@ ngc2000entries.py: parse-ngc2000-py.awk $(DATA)/ngc2000.dat $(AWK) -f parse-ngc2000-py.awk < $(DATA)/ngc2000.dat > $@ ngc2000accurate.py: parse-ngcic-accurate-py.awk $(DATA)/ngc2000_pos.txt $(DATA)/ic2000_pos.txt cat $(DATA)/ngc2000_pos.txt $(DATA)/ic2000_pos.txt | $(AWK) -f parse-ngcic-accurate-py.awk > $@ ngc2000.py: ngc2000-pre.py ngc2000entries.py ngc2000-mid.py ngc2000accurate.py ngc2000-post.py cat $^ > $@ ngc2000entries.c: parse-ngc2000.awk $(DATA)/ngc2000.dat $(AWK) -f parse-ngc2000.awk < $(DATA)/ngc2000.dat > $@ ngcic-accurate-entries.c: parse-ngcic-accurate.awk $(DATA)/ngc2000_pos.txt $(DATA)/ic2000_pos.txt cat $(DATA)/ngc2000_pos.txt $(DATA)/ic2000_pos.txt | $(AWK) -f parse-ngcic-accurate.awk > $@ stellarium-constellations.c: -$(MAKE) grab-stellarium-constellations -(./grab-stellarium-constellations > $@.tmp && mv $@.tmp $@) || touch $@ grab-stellarium-constellations: grab-stellarium-constellations.o \ starutil.o mathutil.o bl.o an-endian.o errors.o log.o ioutils.o qsort_reentrant.o tic.o $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) OBJS := ngc2000.o ngcic-accurate.o brightstars.o constellations.o \ tycho2-fits.o tycho2.o usnob-fits.o usnob.o nomad.o nomad-fits.o \ ucac3-fits.o ucac3.o ucac4-fits.o ucac4.o 2mass-fits.o 2mass.o hd.o \ constellation-boundaries.o HEADERS := brightstars.h constellations.h ngc2000.h ngcic-accurate.h \ tycho2.h tycho2-fits.h usnob-fits.h usnob.h nomad-fits.h nomad.h \ 2mass-fits.h 2mass.h hd.h ucac3.h ucac4.h constellation-boundaries.h HEADERS_PATH := $(addprefix $(INCLUDE_DIR)/,$(HEADERS)) PYTHON_INSTALL := __init__.py ngc2000.py PY_INSTALL_DIR := $(PY_BASE_INSTALL_DIR)/catalogs LINK_DIR := $(PY_BASE_LINK_DIR)/catalogs # MISC_OBJ := grab-stellarium-constellations.o DEP_OBJ := $(OBJS) DEP_PREREQS := DEP_PREREQS += ngc2000names.c ngc2000entries.c ngcic-accurate-entries.c CFLAGS += $(CFLAGS_DEF) CFLAGS += $(LIBKD_INC) CFLAGS += $(ANUTILS_INC) LDFLAGS += $(LDFLAGS_DEF) LDLIBS := $(LDLIBS_DEF) LDLIBS += $(ANFILES_LIB) LDLIBS += -lm CFLAGS += -I. CFLAGS += -I$(COMMON) CFLAGS += $(ZLIB_INC) LIBCAT := libcatalogs.a SLIB := $(LIBCAT) SLIB += $(ANFILES_SLIB) $(LIBCAT): $(OBJS) -rm -f $@ $(AR) rc $@ $(OBJS) $(RANLIB) $@ PROGS := build-hd-tree tycho2tofits usnobtofits nomadtofits \ 2masstofits #ucac3tofits ucac4tofits # not built by default MISC_PROGS := usnob-scamp-catalog read_nomad ucac3tofits: ucac3tofits.o $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lbz2 ALL_OBJ += ucac3tofits.o ucac4tofits: ucac4tofits.o $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) -lbz2 ALL_OBJ += ucac4tofits.o 2masstofits: 2masstofits.o $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) $(ZLIB_LIB) ALL_OBJ += 2masstofits.o $(PROGS): %: %.o $(SLIB) ALL_OBJ += $(addsuffix .o,$(PROGS)) all: ngc2000.py $(LIBCAT) $(PROGS) hd1.fits: henry-draper.tsv build-hd-tree build-hd-tree -s -R 16 henry-draper.tsv $@ hd.fits: henry-draper.tsv build-hd-tree tycho2.fits tyc2_hd.dat build-hd-tree -s -R 16 -T tycho2.fits -X tyc2_hd.dat henry-draper.tsv $@ tyc2_hd.dat: wget "ftp://cdsarc.u-strasbg.fr/pub/cats/IV/25/tyc2_hd.dat.gz" -O $@.gz gunzip $@.gz henry-draper.tsv: wget "http://trac.astrometry.net/browser/binary/henry-draper/henry-draper.tsv?format=txt" -O $@ tycho2.fits: catalog.dat suppl_1.dat tycho2tofits -o $@ $^ catalog.dat: wget -c http://www.astro.ku.dk/~cf/CD/data/catalog.dat suppl_1.dat: wget -c http://www.astro.ku.dk/~cf/CD/data/suppl_1.dat install: $(PYTHON_INSTALL) $(LIBCAT) $(HEADERS_PATH) @echo Installing in base directory '$(INSTALL_DIR)' mkdir -p '$(PY_INSTALL_DIR)' mkdir -p '$(INCLUDE_INSTALL_DIR)' mkdir -p '$(LIB_INSTALL_DIR)' @for x in $(PYTHON_INSTALL); do \ echo cp $$x '$(PY_INSTALL_DIR)/'$$x; \ cp $$x '$(PY_INSTALL_DIR)/'$$x; \ done @for x in $(HEADERS); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)/'$$x; \ done @for x in $(LIBCAT); do \ echo cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ cp $$x '$(LIB_INSTALL_DIR)/'$$x; \ done @echo ok .PHONY: install ALL_TEST_FILES = test_tycho2 test_usnob test_nomad test_2mass test_hd \ test_boundaries ALL_TEST_EXTRA_OBJS = ALL_TEST_LIBS = $(SLIB) ALL_TEST_EXTRA_LDFLAGS = include $(COMMON)/makefile.tests $(ALL_TEST_FILES): $(SLIB) tests: $(ALL_TEST_FILES) .PHONY: tests clean: rm -f $(LIBCAT) $(OBJS) $(ALL_OBJ) $(DEPS) *.dep deps \ grab-stellarium-constellations \ ngc2000names.c ngc2000entries.py ngc2000.py ngc2000entries.c \ ngcic-accurate-entries.c ifneq ($(MAKECMDGOALS),clean) include $(COMMON)/makefile.deps endif astrometry.net-0.67/catalogs/ngc2000-mid.py000644 000765 000024 00000000026 12651445460 020553 0ustar00dstnstaff000000 000000 ] ngc2000accurate = [ astrometry.net-0.67/catalogs/ngc2000-post.py000644 000765 000024 00000000003 12651445460 020762 0ustar00dstnstaff000000 000000 ] astrometry.net-0.67/catalogs/ngc2000-pre.py000644 000765 000024 00000001370 12651445460 020573 0ustar00dstnstaff000000 000000 ## FIXME -- use ngcic_accurate... class NgcObject(object): pass def get_ngc(ngcnum): for n in ngc2000: if n['id'] == ngcnum and n['is_ngc']: obj = NgcObject() obj.isngc = True obj.ngcnum = ngcnum obj.ra = n['ra'] obj.dec = n['dec'] obj.size = n['size'] obj.constellation = n['constellation'] obj.classification = n['classification'] return obj class IcObject(object): pass def get_ic(icnum): for n in ngc2000: if n['id'] == icnum and not n['is_ngc']: obj = IcObject() obj.isngc = False obj.ngcnum = ngcnum obj.ra = n['ra'] obj.dec = n['dec'] obj.size = n['size'] obj.constellation = n['constellation'] obj.classification = n['classification'] return obj # This format is crazy... ngc2000 = [ astrometry.net-0.67/catalogs/ngc2000.c000644 000765 000024 00000006036 12651445460 017605 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "ngc2000.h" #include "ngcic-accurate.h" #include "bl.h" #include "ioutils.h" struct ngc_name { anbool is_ngc; int id; char* name; }; typedef struct ngc_name ngc_name; ngc_name ngc_names[] = { #include "ngc2000names.c" }; ngc_entry ngc_entries[] = { #include "ngc2000entries.c" }; static int n_names() { return sizeof(ngc_names) / sizeof(ngc_name); } ngc_entry* ngc_get_entry_accurate(int i) { float ra, dec; ngc_entry* ngc = ngc_get_entry(i); if (ngcic_accurate_get_radec(ngc->is_ngc, ngc->id, &ra, &dec) == 0) { ngc->ra = ra; ngc->dec = dec; } return ngc; } int ngc_num_entries() { return sizeof(ngc_entries) / sizeof(ngc_entry); } ngc_entry* ngc_get_entry(int i) { if (i < 0) return NULL; if (i >= ngc_num_entries()) return NULL; return ngc_entries + i; } ngc_entry* ngc_get_ngcic_num(int is_ngc, int num) { int i, N; N = ngc_num_entries(); for (i=0; iis_ngc == is_ngc && e->id == num) return e; } return NULL; } ngc_entry* ngc_get_entry_named(const char* name) { if (starts_with(name, "NGC") || starts_with(name, "IC")) { int num; const char* cptr; anbool isngc; isngc = starts_with(name, "NGC"); cptr = name + (isngc ? 3 : 2); if (*cptr == ' ') cptr++; num = atoi(cptr); if (!num) return NULL; return ngc_get_ngcic_num(isngc, num); } else { int i, N; N = n_names(); for (i=0; iis_ngc == ngc_names[i].is_ngc) && (entry->id == ngc_names[i].id)) { if (num == 0) return ngc_names[i].name; else num--; } } return NULL; } sl* ngc_get_names(ngc_entry* entry, sl* lst) { int i; if (!lst) lst = sl_new(4); sl_appendf(lst, "%s %i", (entry->is_ngc ? "NGC" : "IC"), entry->id); for (i=0; iis_ngc == ngc_names[i].is_ngc) && (entry->id == ngc_names[i].id)) { sl_append(lst, ngc_names[i].name); } } return lst; } char* ngc_get_name_list(ngc_entry* entry, const char* separator) { char* str; sl* lst = ngc_get_names(entry, NULL); str = sl_implode(lst, separator); sl_free2(lst); return str; } astrometry.net-0.67/catalogs/ngc2000_pos.txt000644 000765 000024 00002733666 12651445460 021105 0ustar00dstnstaff000000 000000 N0001 00 07 15.83 +27 42 30.1 7 3.33 2.41 HC Pds UZC WS CCA DC GHD1 N0002 00 07 17.05 +27 40 40.6 5 2.14 3.91 HC UZC WS CCA GHD1 N0003 00 07 16.78 +08 18 05.1 7 0.79 1.92 HC KEBA HCds HC2m WS UZC CCA N0004 00 07 24.41 +08 22 24.3 4 0.33 2.32 HCds HC HCm HC2m N0005 00 07 48.927 +35 21 44.04 4 0.71 0.59 KHJ UZC SBG2 CCA N0006=N0020 00 09 32.71 +33 18 31.4 8 0.96 2.01 WS BPP GHD1 GSC Pds UZC CCA DC N0007 00 08 20.78 -29 54 56.5 3 1.43 3.06 WS HCds HCrs N0008 00 08 45.33 +23 50 18.8 5 0.43 1.70 WS HCo GH Pds2 HCds N0008 e * 00 08 45.63 +23 50 20.9 1 HCds N0008 w * 00 08 45.15 +23 50 20.6 1 HCds N0009 00 08 54.65 +23 49 03.9 9 1.97 2.52 GH WS HC GSC HCds CCA K14 UZC DC N0010 00 08 34.3 -33 51 29 2 0.00 0.71 ESOB WS N0011 00 08 42.43 +37 26 53.8 5 1.25 4.94 WS DC SBG2 UZC CCA N0012 00 08 44.81 +04 36 44.3 6 0.60 1.71 GH CCA WS Pds UZC DC N0013 00 08 47.84 +33 25 59.3 6 1.29 2.61 WS BPP UZC CCA GHD1 DC N0014 00 08 46.27 +15 48 56.0 6 1.55 1.74 HCds UZC WS K13 DC CCA N0014ne 00 08 46.41 +15 49 06.9 1 HCds N0014sw 00 08 45.80 +15 48 39.7 1 HCds N0015 00 09 02.492 +21 37 27.73 4 0.55 0.66 UZC KHJ CCA GSC N0016 00 09 04.23 +27 43 46.7 7 3.68 3.53 GHD1 HC WS GSC CCA UZC DC N0017=N0034 00 11 06.5 -12 06 26 3 4.23 2.31 HC SPC WS N0018 00 09 23.04 +27 43 53.9 4 0.70 2.55 HC WS HCds GSC N0018 ne * 00 09 23.22 +27 43 57.1 1 HCds N0018 sw * 00 09 22.95 +27 43 54.2 1 HCds N0019 00 10 40.94 +32 58 58.5 6 3.14 2.04 BPP WS GHD1 GSC UZC DC N0020=N0006 00 09 32.71 +33 18 31.4 8 0.96 2.01 WS BPP GHD1 GSC Pds UZC CCA DC N0021=N0029 00 10 46.85 +33 21 08.9 6 2.64 3.69 GHD1 BPP UZC GSC WS DC N0022 00 09 48.23 +27 49 54.7 7 1.06 2.00 BPP UZC WS GSC Pds CCA HC N0023 00 09 53.39 +25 55 26.0 6 1.33 2.97 WS K14 UZC GH CCA KET1 N0024 00 09 56.29 -24 57 51.9 3 2.57 2.48 WS GHD2 GSCM N0025 00 09 59.6 -57 01 13 2 2.87 1.41 WS ESOB N0026 00 10 25.96 +25 49 55.5 6 2.90 3.49 UZC WS GH K14 CCA DC N0027 00 10 32.84 +28 59 47.6 6 2.65 1.86 BPP WS CCA UZC DC HC N0028 00 10 25.28 -56 59 20.6 2 0.63 0.92 WS GSC N0029=N0021 00 10 46.88 +33 21 09.0 7 2.60 3.37 GHD1 BPP UZC GSC WS CCA DC N0030 00 10 50.74 +21 58 37.9 3 1.01 2.23 HCds WS GSC N0030 e * 00 10 50.86 +21 58 40.5 1 HCds N0030 w * 00 10 50.46 +21 58 40.5 1 HCds N0031 00 10 38.54 -56 59 09.3 3 0.14 2.67 ESOB WS GSC N0032 00 10 53.60 +18 47 44.4 2 0.20 1.63 GSC WS N0033 00 10 56.64 +03 40 33.0 3 0.00 0.61 WS HCo HCds N0033 e * 00 10 56.92 +03 40 34.7 1 HCds N0033 w * 00 10 56.35 +03 40 32.1 1 HCds N0034=N0017 00 11 06.5 -12 06 26 3 4.23 2.31 HC SPC WS N0035 00 11 10.458 -12 01 14.50 3 2.95 0.88 HC KHJ SPC N0036 00 11 22.37 +06 23 20.7 6 1.29 2.00 UZC GSC HC2m WS CCA DC N0037 00 11 23.02 -56 57 26.0 2 0.23 0.57 WS GSC N0038 00 11 47.0 -05 35 12 2 1.06 0.00 WS SPC N0039 00 12 18.97 +31 03 40.0 5 2.49 2.55 WS UZC BPP CCA DC N0040 00 13 00.93 +72 31 19.2 4 0.31 0.58 CK GSC UJ10 Ty2 N0041 00 12 48.04 +22 01 24.8 4 0.66 0.82 WS K05 GSC UZC N0042 00 12 56.370 +22 06 01.00 5 0.54 0.85 Pds KHJ GSC CCA UZC N0043 00 13 00.87 +30 54 54.6 6 0.76 1.18 UZC BPP Pds WS DC CCA N0044 00 13 13.38 +31 17 10.5 3 0.30 0.75 WS HCds GSC N0044 e * 00 13 13.47 +31 17 11.6 1 HCds N0044 w * 00 13 13.24 +31 17 10.5 1 HCds N0045 00 14 03.87 -23 10 52.8 5 2.43 1.24 HC2m GSCM WR GHD2 WS N0046 00 14 09.95 +05 59 13.7 2 2.01 2.90 GSC WS N0047=N0058 00 14 30.68 -07 10 04.5 3 3.84 1.56 WS HCds SPC N0048 00 14 02.14 +48 14 04.5 6 0.83 1.16 SBG1 WS GHD1 Pds UZC CCA N0049 00 14 22.456 +48 14 47.41 4 0.67 0.29 SBG1 KHJ UZC CCA N0050 00 14 44.6 -07 20 43 2 1.05 0.71 WS SPC N0051 00 14 34.880 +48 15 20.27 5 1.23 1.23 SBG1 GHD1 KHJ CCA UZC N0052 00 14 40.21 +18 34 51.9 4 1.40 3.31 WS CCA HC UZC N0053 00 14 43.0 -60 19 42 2 0.52 2.83 WS Pds N0054 00 15 07.6 -07 06 26 2 1.05 0.71 WS SPC N0055 00 15 08 -39 13.2 1 ESOB N0055 bar 00 14 53.85 -39 11 56.9 4 3.68 6.79 HCds HC2m HDW WS N0056 00 15 20 +12 26.7 1o JH N0057 00 15 30.92 +17 19 40.5 6 1.22 2.59 HC DC Pds UZC WS CCA N0058=N0047 00 14 30.68 -07 10 04.5 3 3.84 1.56 WS HCds SPC N0059 00 15 25.4 -21 26 38 3 3.51 3.21 ESO WS KK N0060 00 15 58.30 -00 18 14.0 6 1.22 1.86 UZC WS HC CCA SPF SPC N0061=N0061s 00 16 24.4 -06 19 20 3 1.72 1.53 HCo WS SPC N0061a=N0061n 00 16 24.1 -06 19 04 3 2.28 1.53 WS HCo SPC N0061n+s 00 16 24.38 -06 19 12.6 1 GSC N0062 00 17 05.4 -13 29 11 3 2.52 1.15 WS HC SPC N0063 00 17 45.48 +11 26 59.0 5 1.55 1.88 UZC WS DC Pds CCA N0064 00 17 30.3 -06 49 31 2 1.05 0.71 WS SPC N0065 00 18 59.24 -22 52 49.7 3 7.96 0.90 HCds ESOB WS N0066 00 19 04.74 -22 56 13.0 3 2.25 1.44 ESOB HCds WS N0067 comp 00 18 14.9 +30 03 46 4 0.65 1.89 HCo GHD1 WS KEBA N0067=N0067A 00 18 12.2 +30 03 18 4 2.26 1.71 WS HCo BPP HCo N0068 00 18 18.41 +30 04 17.9 7 1.77 0.84 WS DC UZC CCA GSC GHD1 BPP N0069 00 18 20.497 +30 02 23.93 5 0.59 1.08 BPP KHJ GHD1 KEBA GSC N0070=I1539 00 18 22.57 +30 04 46.0 8 1.67 2.44 WS BPP DC CCA GSC UZC GHD1 Pds N0071 00 18 23.58 +30 03 46.8 6 0.58 1.31 WS BPP CCA GSC GHD1 UZC N0072 00 18 28.39 +30 02 25.2 6 1.01 1.21 BPP CCA GSC WS GHD1 UZC N0072A 00 18 34.31 +30 02 09.4 6 0.74 1.48 WS UZC KEBA GHD1 BPP GSC N0073 00 18 39.076 -15 19 19.23 5 3.33 1.23 WS Pds KHJ SPC HC N0074 00 18 49.41 +30 03 39.8 2 1.56 2.33 GSC WS N0075 00 19 26.357 +06 26 57.43 4 0.52 0.52 KHJ UZC Pds CCA N0076 00 19 37.75 +29 56 02.3 5 0.60 2.61 BPP WS DC CCA UZC N0077 00 20 01.569 -22 31 56.84 3 1.17 1.20 ESOB WS KHJ N0078=N0078B 00 20 27.48 +00 50 00.5 8 1.81 2.30 DC K04 SPC SPF WS CCA GSC UZC N0078a=N0078A 00 20 25.74 +00 49 34.2 6 2.35 1.39 DC SPC SPF GSC WS CCA N0079 00 21 02.921 +22 34 00.55 4 0.70 1.91 KHJ UZC Pds GSC N0080 00 21 11.02 +22 21 26.3 6 1.57 1.65 GSC WS CCA GH UZC DC N0081 00 21 13.458 +22 22 58.13 3 3.40 0.70 KHJ GSC Pds N0082 00 21 17.6 +22 27 37 1 WS N0083 00 21 22.56 +22 26 02.4 6 1.46 3.00 UZC CCA GSC WS GH DC N0084 00 21 21.25 +22 37 10.9 1 HCds N0085=N0085A 00 21 25.552 +22 30 42.42 4 1.86 0.85 Pds KHJ GSC UZC N0085B=I1546 00 21 29.09 +22 30 21.9 3 0.24 0.55 WS UZC GSC N0086 00 21 28.63 +22 33 22.1 4 0.70 1.59 WS Pds GSC UZC N0087 00 21 14.7 -48 37 45 2 6.27 0.00 WS ESOB N0088 00 21 22.0 -48 38 25 2 0.70 2.12 WS ESOB N0089 00 21 24.2 -48 39 56 2 2.09 0.71 ESOB WS N0090 00 21 51.58 +22 24 00.1 4 2.18 0.78 CCA GSC WS DC N0091 00 21 51.76 +22 22 05.6 2 0.88 0.71 GSC WS N0092 00 21 31.8 -48 37 30 3 3.01 2.52 WS Pds ESOB N0093 00 22 03.20 +22 24 29.2 6 2.23 1.42 HCds UZC WS Pds GSC CCA N0094 00 22 13.59 +22 28 58.6 2 0.39 0.85 WS GSC N0095 00 22 13.76 +10 29 30.2 7 3.77 3.52 WS SPC UZC CCA GH HC DC N0096 00 22 17.79 +22 32 46.5 2 0.20 0.85 WS GSC N0097 00 22 30.00 +29 44 42.6 5 0.65 0.83 UZC WS DC CCA BPP N0098 00 22 49.3 -45 16 08 2 0.74 1.41 WS ESOB N0099 00 23 59.53 +15 46 11.7 4 1.42 2.24 UZC CCA WS DC N0100 00 24 02.66 +16 29 09.5 5 0.89 0.86 WS GH GSC UZC CCA N0101 00 23 54.5 -32 32 11 2 0.00 1.41 ESOB WS N0102 00 24 36.5 -13 57 24 3 1.45 1.53 HC WS SPC N0103 00 25 16 +61 19.4 2 5.13 4.24 TDM BSV N0104 00 24 05.45 -72 04 51.9 3 3.32 1.84 ESOB SW HC2m N0105 00 25 16.87 +12 53 02.1 5 1.24 2.88 GH UZC CCA WS DC N0106 00 24 43.7 -05 08 57 2 0.00 0.71 SPC WS N0107 00 25 42.1 -08 17 02 3 0.00 1.15 SPC WS HC N0108 00 25 59.59 +29 12 41.9 5 4.74 1.17 DC WS UZC BPP CCA N0109 00 26 14.649 +21 48 25.85 4 0.76 0.70 GSC KHJ UZC CCA N0110 00 27 25 +71 23.0 2 3.43 38.18 GSC TDM N0111 00 26 38 -02 37.5 1o Le2 N0112 00 26 48.75 +31 42 11.6 6 1.54 2.25 HC BPP CCA WS DC UZC N0113 00 26 54.71 -02 30 03.0 3 1.73 1.00 GSC WS SPC N0114 00 26 58.327 -01 47 09.53 7 2.76 2.26 KET2 UZC K04 KHJ SPC CCA HC N0115 00 26 46.4 -33 40 35 2 7.04 0.00 WS ESOB N0116 00 27 09 -07 56.3 1o ASec N0116? 00 27 05.2 -07 40 08 2 1.05 0.71 WS SPC N0117 00 27 11.0 +01 20 01 4 1.94 0.50 HC WS SPC UZC N0118 00 27 16.253 -01 46 47.92 7 1.11 1.80 HC UZC KET2 SPC KHJ K04 CCA N0119 00 26 57.4 -56 58 41 2 2.29 0.00 ESOB WS N0120 00 27 30.13 -01 30 48.6 7 1.00 1.59 HC GSC UZC GH SPC WS CCA N0121 00 26 47.83 -71 32 09.6 4 3.61 2.49 BSc ESOB HCds AH N0122?? 00 27 38.33 -01 38 25.7 1 GSC N0123? 00 27 36.2 -01 35 58 1 WS N0123?? 00 27 40.01 -01 37 39.9 2 0.42 0.64 GSC WS N0124 00 27 52.34 -01 48 38.2 7 2.19 1.61 HC GHD2 UZC SPC WS CCA DC N0125 00 28 50.26 +02 50 19.8 10 2.04 2.32 GH SPC SPF UZC Pds CCA GSC WS DC HC N0126 00 29 08.13 +02 48 38.8 7 0.91 1.99 Pds2 SPF GSC WS SPC UZC HC N0127 00 29 12.324 +02 52 20.94 6 1.56 0.57 GH HC SPC KHJ SPF GSC N0128 00 29 15.06 +02 51 50.9 9 2.15 1.64 GH WS DC SPF SPC GSC CCA UZC HC N0129 00 30 00 +60 13.1 3 62.56 53.78 BSV TDM BSV N0130 00 29 18.56 +02 52 13.3 5 0.23 1.05 SPF SPC WS HC GSC N0131 00 29 38.2 -33 15 33 3 1.44 3.79 WS ESOB Pds N0132 00 30 10.55 +02 05 34.4 7 3.07 2.17 HC GH WS UZC SPC DC CCA N0133 00 31 19 +63 21.0 2 28.82 12.73 BSV TDM N0134 00 30 21.91 -33 14 44.5 5 3.53 4.23 GSCM WS HC2m HCds ESOB N0135=I0026 00 31 46.00 -13 20 16.9 3 1.82 4.08 HCds SPC HC N0136 00 31 31 +61 30.6 2 5.10 0.00 BSV TDM N0137 00 30 58.11 +10 12 29.9 4 0.66 1.33 WS UZC DC CCA N0138 00 30 59.30 +05 09 34.3 5 0.83 1.03 WS GSC Pds UZC CCA N0139 00 31 06.44 +05 04 42.0 3 0.86 1.97 UZC GSC WS N0140 00 31 20.51 +30 47 30.2 6 1.19 3.17 DC WS BPP UZC CCA HC N0141 00 31 17.6 +05 10 44 2 1.06 1.41 UZC WS N0141nw 00 31 17.4 +05 10 47 1 HCo N0141nw+se 00 31 17.54 +05 10 46.6 1 GSC N0141se 00 31 17.7 +05 10 45 2 1.06 0.00 HCo Pds N0142 00 31 08.5 -22 37 09 2 11.73 2.12 WS ESOB N0143 00 31 15.9 -22 33 37 3 4.79 1.00 WS ESOB Pds N0144 00 31 20.9 -22 38 45 2 3.91 2.12 WS ESOB N0145 00 31 45.7 -05 09 12 3 0.86 3.51 SPC WS Pds N0146 00 33 03 +63 18.1 2 4.81 33.94 TDM BSV N0147 00 33 11.93 +48 30 27.1 8 2.75 4.21 DC WS GHD1 CCA SBG1 HC2m HCds HCds N0148 00 34 15.5 -31 47 09 3 2.94 2.00 GHD2 WS ESOB N0149 00 33 50.26 +30 43 22.5 5 2.46 2.22 HC WS UZC BPP CCA N0150 00 34 15.70 -27 48 16.3 6 2.67 2.66 SVD HCo ESOB WS GHD2 GSC N0151=N0153 00 34 02.6 -09 42 20 4 4.24 2.52 GHD2 HC SPC WS N0152 00 32 56.8 -73 06 57 3 5.17 1.15 DLW BSc ESOB N0153=N0151 00 34 02.6 -09 42 20 4 4.24 2.52 GHD2 HC SPC WS N0154 00 34 19.414 -12 39 22.28 3 1.65 2.04 HC KHJ SPC N0155 00 34 40.154 -10 45 58.97 5 1.34 1.19 KHJ SPC GSC Pds HC N0156 00 34 35.54 -08 20 14.7 1 HCds N0156 comp * s 00 34 36.03 -08 20 33.9 1 HCds N0156? 00 34 35.8 -08 20 23 2 0.00 0.71 WS HC N0157 00 34 46.62 -08 23 46.5 9 2.89 1.81 GC WS SPC HCds GSC GHD2 HCds HC2m HC N0158 00 35 05.45 -08 20 42.1 2 3.04 3.46 HCds HC N0158 nw * 00 35 05.29 -08 20 39.0 1 HCds N0158 se * 00 35 05.32 -08 20 40.3 1 HCds N0159 00 34 35.9 -55 47 23 2 5.92 1.41 WS ESOB N0160 00 36 04.17 +23 57 28.3 7 1.19 1.93 CCA WS UZC GSC HC DC GH N0161 00 35 33.952 -02 50 55.45 3 1.28 0.42 GSC KHJ SPC N0162 00 36 09.24 +23 57 43.1 2 0.29 2.26 WS GSC N0163 00 35 59.768 -10 07 17.83 3 1.64 1.53 GHD2 KHJ SPC N0164 00 36 33.0 +02 45 00 2 1.06 4.24 WS HC N0165 00 36 28.9 -10 06 22 3 1.70 3.21 GHD2 SPC WS N0166 00 35 48.7 -13 36 38 3 3.03 2.08 HC WS SPC N0167 00 35 23.1 -23 22 32 2 5.83 2.83 WS ESOB N0168 00 36 39.0 -22 35 37 2 8.80 2.12 WS ESOB N0169 00 36 51.80 +23 59 26.1 7 2.13 2.46 Pds CCA WS UZC HC GH DC N0170 00 36 45.87 +01 53 10.8 5 1.84 1.82 UZC SPC GSC WS HC N0171=N0175 00 37 21.6 -19 56 04 5 3.64 4.71 HC WS SPC GHD2 ESOB N0172 00 37 14.0 -22 35 09 2 7.82 5.66 WS ESOB N0173 00 37 12.47 +01 56 31.3 5 1.25 1.15 WS DC UZC SPC CCA N0174 00 36 58.9 -29 28 40 3 2.71 2.31 WS ESOB KOS N0175=N0171 00 37 21.6 -19 56 04 5 3.64 4.71 HC WS SPC GHD2 ESOB N0176 00 35 58.5 -73 09 58 3 2.19 1.15 ESOB DLW BSc N0177 00 37 34.95 -22 32 56.7 3 8.41 2.20 HCds WS ESOB N0178=I0039 00 39 08.42 -14 10 21.4 5 2.40 1.24 HC WS SPC HCds GHD2 N0179 00 37 46.3 -17 50 58 4 0.71 2.38 ESOB SPC WS HC N0180 00 37 57.62 +08 38 04.1 6 1.70 1.37 DC SPC WS HC UZC CCA N0181 00 38 23.3 +29 28 19 4 2.48 3.11 UZC BPP WS HC N0182 00 38 12.44 +02 43 42.3 5 0.86 1.15 GH UZC SPC DC CCA N0183 00 38 29.41 +29 30 39.3 6 3.00 2.34 DC WS BPP UZC CCA HC N0184 00 38 35.9 +29 26 49 4 2.62 2.22 WS UZC BPP HC N0185 00 38 57.62 +48 20 13.7 11 2.33 2.17 GSCM GHD1 CCA WS UZC GSC HC2m SBG1 HCds HC2m DC N0186 00 38 25.29 +03 09 57.7 5 0.82 1.67 WS SPC UZC HC CCA N0187 00 39 30.3 -14 39 22 3 0.84 0.00 SPC WS HC N0188 00 47 28 +85 15.3 2 2.78 72.11 TDM BSV N0189 00 39 35 +61 05.1 2 0.00 50.91 TDM BSV N0190 00 38 54.71 +07 03 45.2 6 1.16 1.95 DC HC2m WS HKA UZC CCA N0190 comp 00 38 54.68 +07 03 23.3 5 1.42 2.31 WS DC HKA HC2m CCA N0191 00 38 59.33 -09 00 09.1 5 2.73 1.84 GHD2 HC WS SPF SPC N0191A=I1563 00 39 00.27 -09 00 53.2 5 2.64 1.23 GHD2 WS SPF SPC HC N0192 00 39 13.49 +00 51 48.0 7 0.73 2.32 SPC CCA DC Pds UZC WS HKA N0193 00 39 18.512 +03 19 51.87 9 1.72 1.76 DC Pds WS UZC SPC JSMr GSC JSMo CCA N0194 00 39 18.37 +03 02 13.7 7 0.86 1.88 DC WS SPC GH Pds UZC CCA N0195 00 39 35.733 -09 11 40.38 4 1.66 1.26 GHD2 HC KHJ SPC N0196 00 39 17.81 +00 54 45.1 6 2.61 0.86 DC SPC UZC WS CCA HKA N0197 00 39 18.787 +00 53 29.89 5 2.64 1.60 DC KHJ SPC CCA HKA N0198 00 39 22.95 +02 47 51.7 6 1.63 0.55 GH WS DC UZC SPC CCA N0199 00 39 33.18 +03 08 18.2 5 0.82 2.33 WS SPC HC UZC CCA N0200 00 39 34.79 +02 53 14.9 8 1.78 2.83 GH WS DC Pds UZC HC SPC CCA N0201 00 39 35.00 +00 51 34.8 6 2.41 0.48 UZC WS SPC CCA HKA HC N0202 00 39 39.83 +03 32 09.4 5 1.62 2.94 WS SPC HC UZC CCA N0203=N0211 00 39 39.51 +03 26 32.8 5 1.08 1.63 HC WS UZC GSC SPC N0204 00 39 44.24 +03 17 57.7 6 0.86 0.57 HC WS GSC UZC SPC CCA N0205 00 40 22.159 +41 41 07.32 8 2.00 2.11 UZC UJ10 HC2m WS HCds HCrs CCA DC N0206 00 40 31.9 +40 44 19 2 8.88 2.12 HCo HCds N0207 00 39 40.6 -14 14 14 3 1.68 1.73 HC WS SPC N0208 00 40 17.6 +02 45 21 4 2.56 2.00 WS SPC UZC HC N0209 00 39 03.712 -18 36 31.15 5 2.79 3.57 WS KHJ SPC HC ESOB N0210 00 40 34.84 -13 52 23.7 5 0.63 3.44 GHD2 HC WS GSC SPC N0211=N0203 00 39 39.51 +03 26 32.8 5 1.08 1.63 HC WS UZC GSC SPC N0212 00 40 13.1 -56 09 09 2 3.52 2.12 ESOB WS N0213 00 41 09.96 +16 28 08.3 5 1.21 0.48 WS UZC Pds SPF CCA N0214 00 41 28.00 +25 29 58.2 5 1.38 2.17 CCA WS UZC GH DC N0215 00 40 48.7 -56 12 51 2 2.34 1.41 ESOB WS N0216 00 41 26.8 -21 02 43 3 4.19 0.58 KOS HC WS N0217 00 41 33.9 -10 01 19 2 0.00 0.71 WS SPC N0218 00 41 44.73 +36 21 33.3 3 0.21 2.55 CCA WS UZC N0219 00 42 11.31 +00 54 15.3 4 0.21 1.83 HCds GSC WS SPC N0220 00 40 30.5 -73 24 12 4 1.79 2.63 ESOB OGLE DLW BSc N0221 00 42 41.89 +40 51 54.2 10 1.72 2.74 KEBA UZC WS HC2m SBG1 CCA HCds HCrs DC GHD1 N0222 00 40 44.3 -73 23 04 4 1.93 4.50 ESOB OGLE DLW BSc N0223=I0044 00 42 15.92 +00 50 43.4 8 1.90 1.04 SPC HCds GSC DC UZC WS CCA HC N0224 00 42 44.299 +41 16 08.05 11 0.71 1.06 GSCM GHD1 UJ10 VL CCA CDC HC2m WS UZC PPM VC N0225 00 43 39 +61 46.5 3 59.59 45.43 BSV TDM BSV N0226 00 42 54.09 +32 34 48.6 5 1.70 1.86 WS UZC DC BPP CCA N0227 00 42 36.85 -01 31 45.2 7 2.43 2.99 WS SPC UZC SPF Pds CCA GH N0228 00 42 54.49 +23 30 11.4 4 0.36 1.70 WS UZC GSC CCA N0229 00 43 04.68 +23 30 32.7 4 0.21 0.89 GSC WS UZC Pds N0230 00 42 27.2 -23 37 45 2 4.85 0.00 WS ESOB N0231 00 41 06.4 -73 21 08 4 0.63 0.96 OGLE BSc ESOB DLW N0232 00 42 45.61 -23 33 41.5 3 1.63 1.50 ESOB WS HCds N0233 00 43 36.58 +30 35 12.5 5 1.31 1.81 WS UZC BPP DC CCA N0234 00 43 32.37 +14 20 32.8 5 1.13 1.81 WS UZC Pds CCA DC N0235=N0235A 00 42 52.61 -23 32 28.3 3 1.82 0.72 ESOB WS HCds N0235a=N0235B 00 42 53.60 -23 32 43.6 4 2.17 2.52 ESOB HCo HCds WS N0236 00 43 27.47 +02 57 27.9 5 2.21 2.31 DC WS UZC SPC CCA N0237 00 43 27.91 -00 07 29.3 6 1.64 3.65 GH SPC UZC WS CCA DC N0238 00 43 25.80 -50 11 00.5 3 1.92 3.56 WS HCds ESOB N0239 00 44 37.5 -03 45 36 2 0.00 2.12 SPC WS N0240 00 45 01.91 +06 06 45.9 5 0.78 1.88 WS Pds UZC GSC CCA N0241:=N0242 00 43 33.2 -73 26 33 4 4.61 5.48 BSc ESOB AH HCm N0241:=N0242 nw 00 43 31.2 -73 26 25 3 4.85 2.52 BSc DLW HCds N0241?? 00 43 28.5 -73 35 35 1 AH N0242=:N0241 00 43 33.2 -73 26 33 4 4.61 5.48 BSc ESOB AH HCm N0242=:N0241 se 00 43 35.1 -73 26 42 2 7.73 5.66 BSc HCds N0243 00 46 00.86 +29 57 33.1 5 3.26 1.65 WS BPP HCds UZC HC N0244 00 45 46.53 -15 35 50.7 4 3.53 0.91 SPC WS HCds GHD2 N0245 00 46 05.50 -01 43 23.8 6 0.90 2.83 SPF SPC KET1 UZC WS CCA N0246 00 47 03.42 -11 52 19.3 3 2.83 0.35 GSC UCA1 CK N0247 00 47 08.38 -20 45 35.1 8 2.03 3.46 GSCM KOS WS HC2m SPC HC2m GHD2 ESOB N0247 * 00 47 08.51 -20 45 36.6 1 HC2m N0248 00 45 24.2 -73 22 46 3 0.64 2.65 AH ESOB HCds N0248n 00 45 23.7 -73 22 35 2 2.99 0.72 HCds BSc N0248s 00 45 26.04 -73 23 02.6 2 0.69 5.16 HCds BSc N0249 00 45 32 -73 04.8 2 3.04 0.00 BSc ESOB N0250 00 47 16.02 +07 54 35.0 4 0.79 1.28 WS UZC GSC CCA N0251 00 47 54.03 +19 35 47.6 5 1.26 0.75 WS SPF UZC CCA Pds N0252 00 48 01.60 +27 37 24.6 6 1.30 3.02 UZC GSC CCA Pds WS DC N0253 00 47 33.04 -25 17 17.8 8 3.19 1.04 WDP RL HC2m vdH+ HC2m EWSr CCR TH1 N0254 00 47 27.6 -31 25 16 3 1.47 3.61 ESOB WS GHD2 N0255 00 47 47.3 -11 28 06 3 1.47 1.15 GHD2 WS SPC N0256 00 45 53.6 -73 30 25 4 2.03 1.73 BSc ESOB DLW OGLE N0257 00 48 01.60 +08 17 47.6 5 0.13 1.26 WS UZC DC HC CCA N0258 00 48 12.920 +27 39 23.65 4 1.70 2.44 KHJ GSC Pds Pds2 N0259 00 48 03.3 -02 46 34 3 2.29 0.58 WS SPC GHD2 N0260 00 48 34.78 +27 41 31.3 5 1.45 3.71 GSC UZC CCA DC WS N0261 00 46 28 -73 06.1 2 6.07 12.73 ESOB BSc N0262 00 48 47.146 +31 57 24.65 8 1.54 0.76 SDP KHJ vdH+ EDC BPP UZC Pds CCA N0263 00 48 48.4 -13 06 27 2 0.00 0.71 WS SPC N0264 00 48 21.0 -38 14 04 2 0.00 2.12 ESOB WS N0265 00 47 11.1 -73 28 39 4 2.61 2.50 ESOB BSc DLW OGLE N0266 00 49 47.97 +32 16 39.1 5 2.01 2.29 WS UZC CCA BPP DC N0267 00 48 02 -73 16.4 2 0.00 0.00 BSc ESOB N0268 00 50 09.4 -05 11 38 3 0.86 1.00 GHD2 SPC WS N0269 00 48 21.0 -73 31 51 4 0.80 2.06 BSc ESOB DLW OGLE N0270 00 50 32.4 -08 39 07 3 0.86 0.58 WS Pds SPC N0271 00 50 41.90 -01 54 36.2 7 0.76 3.45 SPC SPF SPC CCA DC UZC WS N0272 00 51 24 +35 49.9 2 17.26 46.67 TDM BSV N0273 00 50 48.4 -06 53 08 3 0.86 2.08 GHD2 WS SPC N0274 00 51 01.82 -07 03 25.7 4 0.77 1.28 GHD2 WS SPC SPF N0275 00 51 04.42 -07 03 56.3 3 1.64 0.12 SPC SPF WS N0276=I1591 00 52 06.52 -22 40 48.4 3 0.70 1.66 WS HCds ESOB N0277 00 51 17.198 -08 35 48.88 4 0.64 0.62 SPC GSC SPF KHJ N0278 00 52 04.45 +47 33 01.7 6 1.00 1.11 UZC GHD1 CCA DC WS SBG1 N0279 00 52 08.95 -02 13 05.7 7 1.75 1.65 Pds UZC WS CCA SPC DC KET1 N0280 00 52 30.12 +24 21 01.4 6 2.37 1.61 UZC GSC HCds Pds WS CCA N0281=I0011 00 52 53.8 +56 37 29 2 65.23 15.56 BSV HC N0282 00 52 42.1 +30 38 19 3 1.49 2.00 WS UZC BPP N0283 00 53 13.247 -13 09 50.53 3 0.84 1.57 SPC KHJ Pds N0284 00 53 24.248 -13 09 32.75 3 0.58 0.79 SPC KHJ GSC N0285 00 53 29.890 -13 09 40.08 2 0.09 2.11 KHJ SPC N0286 00 53 30.396 -13 06 45.78 2 0.26 0.29 KHJ SPC N0287 00 53 28.3 +32 28 55 3 0.00 1.00 WS UZC BPP N0288 00 52 45.40 -26 35 00.7 3 4.16 0.26 HCds ESOB HC2m N0288 core 00 52 45.10 -26 35 06.1 1 HCds N0289 00 52 41.95 -31 12 22.3 5 3.13 3.49 GSCM ESOB WS GSC GHD2 N0290 00 51 14.6 -73 09 42 4 2.10 1.74 ESOB OGLE DLW BSc N0291 00 53 29.8 -08 46 06 2 0.00 2.83 WS SPC N0292 00 52 38 -72 48.0 2 0.00 0.00 ESOB WS N0293 00 54 15.99 -07 14 09.1 3 0.17 0.46 SPC WS SPF N0294 00 53 05.5 -73 22 49 4 2.14 1.26 ESOB OGLE BSc DLW N0295 00 55 05 +31 31.8 1o RC N0296 00 55 07.59 +31 32 32.2 6 2.09 2.68 WS BPP HCds UZC CCA DC N0297 00 54 58.87 -07 21 00.1 4 1.52 1.37 HCo GSC WS SPF N0298 00 55 02.33 -07 20 00.6 4 1.33 1.00 WS GSC SPF SPC N0299 00 53 24.7 -72 11 48 3 2.32 1.73 ESOB DLW BSc N0300 00 54 53.43 -37 41 03.2 4 1.03 2.32 WS GSCM HC2m HCds N0301: 00 56 18.4 -10 40 25 2 1.04 0.71 WS SPC N0302: 00 56 25.29 -10 39 45.9 1 HCds N0303n=N0303A 00 54 54.60 -16 39 11.6 2 2.23 5.09 SHM HCds N0303s=N0303B 00 54 54.72 -16 39 21.9 4 2.93 3.17 SPC WS SHM HCds N0304 00 56 06.13 +24 07 35.2 4 3.33 3.97 WS UZC CCA DC N0305 00 56 20.5 +12 03 56 4 8.16 24.27 TDM BSV HC HCe N0306 00 54 14.7 -72 14 30 3 2.27 2.89 ESOB DLW BSc N0307 00 56 32.61 -01 46 18.8 8 2.64 1.95 HCds SPC UZC WS GSC CCA Pds DC N0308 00 56 34.22 -01 47 02.1 1 HCds N0309 00 56 42.7 -09 54 50 4 1.86 2.65 GHD2 SPC WS HC N0309A 00 56 27.47 -09 55 54.7 1 HCds N0310 00 56 47.98 -01 45 56.8 1 HCds N0311 00 57 32.75 +30 16 48.8 6 1.41 1.78 HC UZC WS DC CCA BPP N0312 00 56 16.2 -52 46 59 2 6.38 1.41 WS ESOB N0313 00 57 45.7 +30 21 59 3 0.75 2.31 HC WS HCds N0313 m * 00 57 45.68 +30 22 03.8 1 HCds N0313 n * 00 57 45.81 +30 22 05.5 1 HCds N0313 n+m *s 00 57 45.75 +30 22 04.9 1 HCds N0313 s * 00 57 45.68 +30 21 56.1 2 0.64 0.57 HCds GSC N0314 00 56 52.5 -31 57 47 2 2.69 1.41 WS ESOB N0315 00 57 49.00 +30 21 08.4 10 2.53 1.70 HC CCBD GSC HCds UZC WS BPP DC CCA GHD1 N0316 00 57 52.40 +30 21 14.6 2 0.83 1.20 WS GSC N0317=N0317B 00 57 40.43 +43 47 31.6 6 0.75 1.99 UZC DC VPS WS HC2m CCA N0317a=N0317A 00 57 39.109 +43 48 02.85 4 0.67 0.90 KHJ HC2m DC CCA N0318 00 58 05.268 +30 25 31.29 5 0.64 0.99 UZC KHJ GSC HC BPP N0319 00 56 57.42 -43 50 18.3 3 2.15 1.54 ESOB HCds WS N0320 00 58 46.4 -20 50 25 2 0.00 0.71 ESOB WS N0321 00 57 39.229 -05 05 10.71 3 0.67 0.38 GSC KHJ SPC N0322 00 57 10.1 -43 43 36 2 2.29 2.12 WS ESOB N0323 00 56 41.5 -52 58 34 2 1.90 0.00 ESOB WS N0324 00 57 14.6 -40 57 32 2 0.80 4.24 WS ESOB N0325 00 57 47.88 -05 06 44.8 2 0.84 0.07 GSC SPF N0326 00 58 22.68 +26 51 55.2 3 1.59 1.00 WS UZC GSC N0326n 00 58 22.59 +26 51 58.6 3 2.02 1.22 HC PCR HCo N0326s 00 58 22.79 +26 51 51.7 3 0.67 0.50 HC PCR HCo N0327 00 57 55.29 -05 07 50.5 6 1.18 2.33 WS Pds GSC SPF GHD2 SPC N0328 00 56 57.3 -52 55 24 2 0.00 2.12 ESOB WS N0329 00 58 01.44 -05 04 17.8 4 0.75 3.11 WS GHD2 SPC GSC N0330 00 56 18.7 -72 27 46 4 4.01 2.44 ESOB BSc OGLE DLW N0331? 00 47 06.85 -02 43 51.5 1 GSC N0331?? 00 57 04.9 -02 46 15 1 WS N0332 00 58 49.12 +07 06 40.1 5 1.21 1.29 WS UZC GSC CCA Pds N0333=N0333A 00 58 51.28 -16 28 09.1 3 0.66 2.05 HCds WS SPC N0333a=N0333B 00 58 50.86 -16 28 19.8 3 2.16 3.06 LEDA HCds HCo N0334 00 58 49.9 -35 06 56 2 1.73 1.41 WS ESOB N0335 00 59 19.5 -18 14 02 2 1.01 2.83 SPC WS N0336 00 58 02.54 -18 23 08.7 1 HCds N0337 00 59 50.01 -07 34 39.2 4 1.85 4.06 WS SPC SPF GHD2 N0337A 01 01 33.78 -07 35 18.9 5 2.08 2.86 SPF GHD2 WS GSC SPC N0338 01 00 36.45 +30 40 07.9 6 2.12 0.98 DC UZC WS BPP HC CCA N0339 00 57 44.58 -74 28 20.4 5 9.36 4.01 BSc ESOB DLW HCds HC2m N0339 core 00 57 45.41 -74 28 10.8 1 HCds N0340 01 00 34.86 -06 51 59.6 3 1.49 0.51 WS GSC SPC N0341=N0341A 01 00 45.8 -09 11 09 3 0.85 1.53 KET2 SPC WS N0341a=N0341B 01 00 47.667 -09 11 14.99 2 0.47 1.00 HCo KHJ N0342 01 00 49.911 -06 46 22.39 4 1.74 1.11 GSC KHJ SPC HC N0343: 00 58 23.97 -23 13 29.0 2 0.88 0.99 GSC HCds N0343: comp 00 58 24.06 -23 13 44.3 1 HCds N0344: 00 58 25.38 -23 13 45.1 2 0.88 0.78 HCds HCo N0345 01 01 22.13 -06 53 04.9 4 2.04 0.94 WS GSC SPC HC N0346 00 59 05 -72 10.7 3 0.00 6.92 BSc ESOB AH N0347 01 01 35.22 -06 44 02.3 3 3.24 0.85 SPC GSC HC N0348 01 00 51.7 -53 14 41 2 1.26 2.83 ESOB WS N0349 01 01 50.73 -06 48 00.3 5 2.11 0.89 HCo GSC SPC WS HC N0350 01 01 56.714 -06 47 45.67 4 1.29 1.09 SPC GSC KHJ HC N0351 01 01 57.87 -01 56 10.8 6 0.78 3.60 DC UZC WS GSC SPC CCA N0352 01 02 09.1 -04 14 44 3 1.50 0.00 GHD2 WS SPC N0353 01 02 24.64 -01 57 27.4 5 0.71 1.29 GSC WS UZC CCA SPC N0354 01 03 16.47 +22 20 32.8 5 3.36 1.22 SDP WS UZC CCA DC N0355 01 03 06.961 -06 19 27.17 2 0.34 1.12 SPC KHJ N0356 01 03 07.04 -06 59 18.4 3 0.00 0.92 SPC WS GSC N0357 01 03 21.9 -06 20 19 3 1.72 5.20 SPC WS GHD2 N0358 01 05 11.0 +62 01 14 4 5.81 0.96 BSV HC TDM WS N0359 01 04 16.98 -00 45 53.4 6 1.01 1.68 WS GSC Pds UZC CCA SPC N0360 01 02 51.31 -65 36 33.7 4 1.32 1.51 HCds ESOB WS HCds N0361 01 02 11.2 -71 36 24 2 0.33 1.41 BSc DLW N0362 01 03 13.94 -70 50 53.9 2 2.20 0.50 ESOB SW N0363 01 06 15.769 -16 32 34.10 3 1.46 0.53 WS KHJ SPC N0364 01 04 40.83 -00 48 10.5 4 1.34 0.97 UZC WS GSC CCA N0365 01 04 18.7 -35 07 17 3 2.55 4.04 MFSK WS ESOB N0366 01 06 26 +62 13.8 2 9.97 8.49 BSV TDM N0367 01 05 48.9 -12 07 43 2 0.00 0.71 WS SPC N0368 01 04 21.7 -43 16 33 2 3.08 2.83 ESOB WS N0369 01 05 08.8 -17 45 31 3 0.00 4.62 ESOB SPC WS N0370? 01 06 44.36 +32 25 40.1 1 HCds N0370?=N0372 01 06 44.6 +32 25 42 1 WS N0370?=N0372 e * 01 06 44.99 +32 25 37.5 1 HCds N0370?=N0372 e*comp 01 06 44.85 +32 25 38.7 1 HCds N0370?=N0372 n * 01 06 44.54 +32 25 49.9 1 HCds N0370?=N0372 w * 01 06 43.72 +32 25 42.6 1 HCds N0371 01 03 26 -72 03.9 3 26.28 51.96 BSc ESOB AH N0372 01 06 44.42 +32 25 43.3 1 HCds N0372=?N0370 01 06 44.6 +32 25 42 1 WS N0372=?N0370 e * 01 06 44.99 +32 25 37.5 1 HCds N0372=?N0370 e*comp 01 06 44.85 +32 25 38.7 1 HCds N0372=?N0370 n * 01 06 44.54 +32 25 49.9 1 HCds N0372=?N0370 w * 01 06 43.72 +32 25 42.6 1 HCds N0373 01 06 58.6 +32 18 30 2 4.50 2.12 WS HCo N0374 01 07 05.77 +32 47 42.7 6 2.03 3.14 DC WS UZC BPP Hu CCA N0375 01 07 06.270 +32 20 52.40 4 7.65 1.52 KHJ GSC GHD1 Hu N0376 01 03 53.6 -72 49 28 4 0.62 4.12 BSc ESOB DLW OGLE N0377 01 06 35.02 -20 19 55.1 2 0.30 1.20 GSC HCds N0378 01 06 11.9 -30 10 41 2 1.83 2.12 ESOB WS N0379 01 07 15.65 +32 31 14.1 8 2.56 2.02 GHD1 WS UZC BPP Hu GSC DC CCA N0380 01 07 17.61 +32 28 59.2 7 3.74 2.12 GHD1 WS BPP GSC Hu CCA DC N0381 01 08 19 +61 35.0 3 32.99 3.46 BSV TDM BSV N0382 01 07 23.96 +32 24 13.9 9 3.62 1.89 GHD1 PCR WS BPP GSC UZC Hu CCA DC N0383 01 07 24.92 +32 24 44.9 10 2.90 1.40 GHD1 WS BPP GPB UZC PCR GSC CCA DC Hu N0384 01 07 25.04 +32 17 33.8 9 3.07 0.87 GHD1 WS KEBA UZC GSC BPP CCA Hu DC N0385 01 07 27.24 +32 19 12.0 7 3.86 2.36 GHD1 WS GSC BPP Hu CCA DC N0386 01 07 31.262 +32 21 43.32 7 2.95 0.71 GHD1 KHJ GSC KEBA UZC BPP Hu N0387 01 07 33.10 +32 23 27.9 3 1.96 3.52 WS GSC Hu N0388 01 07 47.215 +32 18 35.59 6 1.10 0.98 KHJ UZC BPP GSC KEBA Hu N0389 01 08 29.92 +39 41 41.1 4 1.72 1.90 WS VPS UZC CCA N0390 01 07 53.7 +32 25 59 1 HCo N0391 01 07 22.67 +00 55 31.8 5 3.09 1.46 WS SPC UZC CCA HC N0392 01 08 23.42 +33 08 00.2 6 1.55 2.47 WS UZC DC BPP Hu CCA N0393 01 08 37.04 +39 38 37.3 6 2.21 1.69 VPS WS Pds UZC CCA DC N0394 01 08 26.0 +33 08 51 5 0.69 2.30 UZC Hu WS BPP KEBA N0395 01 05 08.8 -71 59 32 4 8.08 14.73 BSc DLW ESOB AH N0396 01 08 08.46 +04 31 51.0 1 GSC N0397 01 08 31.019 +33 06 34.29 3 2.68 2.71 Hu KHJ BPP N0398 01 08 53.722 +32 30 52.38 5 1.12 0.87 BPP UZC KHJ KEBA Hu N0399 01 08 59.21 +32 38 02.8 7 0.88 2.01 WS DC GSC BPP UZC Hu CCA N0400 01 09 02.6 +32 43 57 2 1.79 0.71 WS HCo N0401 01 09 07.7 +32 45 35 2 0.00 2.12 WS HCo N0402 01 09 13.4 +32 48 20 2 0.00 2.83 WS HCo N0403 01 09 14.29 +32 45 07.6 9 2.10 3.45 Pds UZC GSC WS BPP Hu CCA DC GHD1 N0404 01 09 26.96 +35 43 05.2 6 0.85 1.82 GHD1 VPS WS GSCM CCA DC N0405 01 08 33.78 -46 40 05.9 3 2.93 2.03 WS HCds ESOB N0405 comp * "C" 01 08 37.92 -46 40 00.6 1 HCds N0406 01 07 24.2 -69 52 35 3 0.59 0.00 ESOB RC2 WS N0407 01 10 36.53 +33 07 32.9 7 0.90 3.03 WS Pds UZC GSC DC BPP CCA N0408 01 10 51.09 +33 09 04.6 1 GSC N0409 01 09 32.9 -35 48 20 3 4.26 1.53 ESOB MFSK WS N0410 01 10 58.76 +33 09 04.6 7 3.85 4.20 WS DC GHD1 GSC UZC BPP CCA N0411 01 07 55.7 -71 46 07 3 0.00 1.73 BSc ESOB DLW N0412 01 10 20 -20 00.9 1o Le1 N0412?? 01 06 34 -20 20.0 1 ESOB N0413 01 12 31.43 -02 47 38.1 5 0.69 2.22 SPF Pds SPC WS GSC N0414nw 01 11 17.6 +33 06 48 4 0.63 1.73 WS BPP HCo UZC N0414nw+se 01 11 17.68 +33 06 47.9 1 GSC N0414se 01 11 18.0 +33 06 43 1 HCo N0415 01 10 05.5 -35 29 27 3 1.22 1.15 MFSK WS ESOB N0416 01 07 58.6 -72 21 21 4 1.21 3.46 DLW ESOB BSc OGLE N0417 01 11 05.690 -18 08 55.63 4 4.22 2.01 SPC WS KHJ ESOB N0418 01 10 35.74 -30 13 15.9 3 3.89 1.13 HCds WS ESOB N0419 01 08 17.54 -72 53 02.1 6 1.61 2.36 BSc ESOB DLW OGLE HCds BSV N0420 01 12 09.74 +32 07 22.8 6 2.02 1.47 WS UZC BPP GSC CCA DC N0421 01 12 14 +32 07.4 1o WH N0422 01 09 25.4 -71 46 00 4 0.46 1.89 DLW BSc ESOB AH N0423 01 11 22.3 -29 14 04 2 2.77 0.71 WS ESOB N0424 01 11 27.7 -38 04 58 3 1.80 3.06 WS Pds ESOB N0425 01 13 02.65 +38 46 06.2 5 1.93 0.99 VPS UZC DC WS CCA N0426 01 12 48.678 -00 17 25.75 6 1.83 1.30 KHJ SPC SPF CCA UZC DC N0427 01 12 19.6 -32 03 41 2 6.27 0.00 WS ESOB N0428 01 12 55.64 +00 58 54.5 7 4.03 3.42 DC WS GSC UZC SPC CCA MJC N0429 01 12 57.36 -00 20 44.1 5 2.43 1.95 DC WS SPC SPF CCA N0430 01 12 59.86 -00 15 09.6 5 3.81 0.85 DC SPC WS UZC CCA N0431 01 14 04.51 +33 42 14.9 6 3.27 1.75 DC BPP UZC WS CCA VPS1 N0432 01 11 46.2 -61 31 37 2 1.00 4.24 ESOB WS N0433 01 15 11 +60 07.6 2 26.63 4.24 BSV TDM N0434 01 12 13.9 -58 14 49 2 3.88 2.83 ESOB WS N0434A 01 12 29.8 -58 12 29 2 3.88 0.00 ESO WS N0435 01 13 59.87 +02 04 14.7 4 1.48 1.25 WS SPC UZC CCA N0436 01 15 58 +58 48.7 2 5.53 29.70 BSV TDM N0437 01 14 22.22 +05 55 35.1 5 2.85 2.33 DC WS Pds UZC CCA N0438 01 13 33.9 -37 54 06 2 6.67 0.71 ESOB WS N0439 01 13 47.324 -31 44 50.22 6 3.03 0.69 GHD2 WS GSCA UA20 2MSP ESOB N0440 01 12 48.3 -58 16 56 2 0.55 3.54 ESOB WS N0441 01 13 51.4 -31 47 17 2 6.29 5.66 WS ESOB N0442 01 14 38.68 -01 01 15.6 6 2.25 2.14 DC SPC WS UZC CCA GH N0443=I1653 01 15 07.520 +33 22 37.76 6 4.47 2.10 DC KHJ UZC VPS1 CCA HCds N0444=I1658 01 15 49.63 +31 04 48.8 7 0.87 1.44 VPS1 GSC K06 Pds WS UZC CCA N0445 01 14 52.9 +01 55 03 2 6.36 1.41 SPC UZC N0446=I0089 01 16 03.63 +04 17 39.0 6 1.71 1.99 DC UZC GSC CCA WS KET1 N0447=I1656 01 15 37.71 +33 04 01.1 6 2.83 2.92 DC VPS1 HCo CCA WS UZC N0448 01 15 16.46 -01 37 33.5 7 4.40 2.15 DC SPF WS SPC Pds UZC CCA N0449 01 16 07.282 +33 05 21.21 10 1.26 2.43 vdH+ UWS K06 K03 K14 EDC GSC UZC SDP WS N0450 01 15 30.51 -00 51 40.0 8 2.10 2.18 GH WS SPF SPC UZC CCA DC Pds N0451=I1661 01 16 12.44 +33 03 50.6 7 0.11 2.23 VPS1 WS K06 KET2 K14 K03 GSC N0452 01 16 15.03 +31 02 01.0 6 3.00 2.34 GSC UZC CCA WS VPS1 DC N0453 01 16 17.4 +33 00 51 1 GSC N0454 01 14 23.2 -55 23 56 2 0.60 9.19 ESOB WS N0454n 01 14 25.23 -55 23 47.3 1 HCds N0454s 01 14 22.95 -55 24 44.7 1 HCds N0454w 01 14 21.94 -55 24 00.6 1 HCds N0455 01 15 57.54 +05 10 41.0 4 3.18 1.73 DC WS UZC CCA N0456 01 13 45.1 -73 17 31 4 9.25 4.24 AH DLW ESOB BSc N0457 01 19 35 +58 17.2 2 28.08 16.97 BSV TDM N0458 01 14 52.8 -71 33 01 4 4.39 2.83 ESOB BSc AH DLW N0459 01 18 08.18 +17 33 43.5 3 1.00 0.97 SPF WS CCA N0460 01 14 38.3 -73 17 27 2 1.80 84.85 AH ESOB N0460nw 01 14 37 -73 18.0 1 BSc N0460se 01 14 54 -73 19.8 1 BSc N0461 01 17 20.2 -33 50 27 3 1.90 2.89 ESOB WS MFSK N0462 01 18 11.001 +04 13 33.55 3 0.41 0.17 GSC KHJ Pds2 N0463 01 18 58.20 +16 19 31.6 3 0.00 3.14 WS UZC SPF N0464 01 19 26.70 +34 57 20.4 2 0.44 1.27 GSCm HCds N0464 nw * 01 19 26.58 +34 57 25.4 1 HCds N0464 se * 01 19 26.88 +34 57 17.2 1 HCds N0465 01 15 42.3 -73 19 41 4 2.61 18.28 ESOB BSc AH DLW N0466 01 17 13.4 -58 54 36 2 0.54 0.00 ESOB WS N0467 01 19 10.19 +03 18 02.0 6 1.64 1.11 UZC WS GH SPC CCA DC N0468=I0092 01 19 48.43 +32 46 02.3 5 0.26 2.03 WS UZC GSC VPS1 SPF N0469 01 19 32.99 +14 52 17.2 4 0.76 1.59 UZC GSC Pds WS N0470 01 19 44.84 +03 24 35.0 5 1.83 3.20 GH WS UZC SPC CCA N0471 01 19 59.64 +14 47 08.6 6 0.54 3.03 HCds DC WS UZC GSC CCA N0471 comp 01 20 00.05 +14 47 01.4 2 0.21 2.33 Pds2 HCds N0472 01 20 28.75 +32 42 32.2 8 1.09 3.06 DC UZC GSC VPS1 SPF CCA BCG WS N0473 01 19 55.07 +16 32 41.5 6 3.11 1.61 DC WS UZC CCA Pds GH N0474 01 20 06.64 +03 24 54.9 8 3.81 3.67 MJC GH SPC UZC WS DC CCA HC N0475=I0097 01 20 02.029 +14 51 40.44 4 0.67 1.00 HCds KHJ GSC Pds N0476 01 20 19.900 +16 01 11.63 4 0.41 1.12 Pds UZC KHJ GSC N0477 01 21 20.35 +40 29 18.9 6 1.77 2.67 WS UZC HCds CCA VPS DC N0478 01 20 09.2 -22 22 41 2 4.89 1.41 WS ESOB N0479 01 21 15.80 +03 51 43.8 4 0.96 0.05 SPC WS UZC CCA N0480: 01 20 34.33 -09 52 49.2 4 0.70 1.74 WS GSC Pds2 SPC N0481 01 21 12.56 -09 12 41.0 3 1.20 1.00 GSC WS SPC N0482 01 20 20.2 -40 57 56 2 3.19 4.95 ESOB WS N0483 01 21 56.22 +33 31 17.7 4 2.68 2.80 DC VPS1 GSC CCA N0484 01 19 34.8 -58 31 27 3 0.45 2.00 Pds WS ESOB N0485 01 21 27.64 +07 01 05.1 5 1.15 1.68 WS Pds UZC CCA DC N0486 01 21 43.47 +05 20 49.6 3 1.14 1.75 HCds HCo WS N0486 * 01 21 43.82 +05 20 53.9 2 0.63 1.13 HCds HCo N0486 gal 01 21 43.03 +05 20 46.7 2 0.53 2.26 HCds HCo N0487 01 21 55.1 -16 22 15 2 2.03 2.83 WS SPC N0488 01 21 46.82 +05 15 22.7 8 1.78 3.47 WS GH GSC HC2m UZC CCA HCds DC N0489 01 21 53.92 +09 12 22.2 5 1.26 1.82 DC WS UZC CCA Pds N0490 01 22 02.890 +05 22 01.77 2 0.40 0.17 KHJ GSC N0491 01 21 20.2 -34 03 48 3 0.00 1.15 ESOB MFSK WS N0491A 01 20 04.7 -33 54 02 3 3.28 2.65 ESOB MFSK WS N0492 01 22 13.65 +05 25 00.3 4 2.57 1.35 WS UZC GSC HCo N0493 01 22 09.20 +00 56 46.0 7 3.34 2.44 DC SPF SPC WS HC UZC CCA N0494 01 22 55.30 +33 10 24.8 8 3.10 2.52 DC CCA GSC WS BCG UZC SPF VPS1 N0495 01 22 56.01 +33 28 17.3 8 0.90 2.57 WS UZC BCG GHD1 GSC VPS1 CCA DC N0496 01 23 11.60 +33 31 44.6 8 1.36 2.92 DC K03 GSC WS Pds UZC CCA VPS1 N0497 01 22 23.82 -00 52 31.6 5 1.05 0.84 UZC BCG WS SPC CCA N0498 01 23 11.260 +33 29 20.56 3 0.41 2.27 Pds KHJ GSC N0499=I1686 01 23 11.58 +33 27 36.4 10 1.88 2.08 GHD1 SPF WS BCG GSC CCA VPS1 Pds UZC DC N0500 01 22 39.387 +05 23 14.05 4 0.19 0.39 KHJ Pds UZC GSC N0501 01 23 22.450 +33 25 57.93 7 0.68 1.29 VPS1 KHJ UZC GSC SPF Pds BCG N0502 01 22 55.56 +09 02 55.8 5 2.10 0.95 DC WS KEBA UZC CCA N0503 01 23 28.470 +33 19 54.80 5 0.30 0.60 KHJ GSC BCG UZC VPS1 N0504 01 23 28.00 +33 12 14.8 7 1.00 2.27 UZC GSC CCA VPS1 Pds WS DC N0505 01 22 57.11 +09 28 07.1 4 0.56 1.31 WS UZC GSC CCA N0506 01 23 35.40 +33 14 38.1 2 0.89 3.89 GSC WS N0507 01 23 39.95 +33 15 21.1 7 2.42 1.75 GHD1 HCo WS CCA VPS1 UZC DC N0508 01 23 40.66 +33 16 49.1 7 1.38 2.02 VPS1 BCG GSC CCA WS DC HCo N0509 01 23 24.11 +09 26 00.4 5 0.52 1.63 WS UZC GH GSC CCA N0510 01 23 55.58 +33 29 47.9 2 0.35 1.27 GSCm HCds N0510 e * 01 23 55.91 +33 29 46.2 1 HCds N0510 w * 01 23 55.29 +33 29 47.8 1 HCds N0511 01 23 30.73 +11 17 26.3 4 0.86 1.30 WS UZC GSC CCA N0512 01 23 59.80 +33 54 27.7 6 1.20 2.01 DC WS BCG Pds VPS CCA N0513 01 24 26.869 +33 47 57.33 7 0.55 2.22 UZC KEBA DC AE CCA VPS WS N0514 01 24 03.89 +12 55 02.3 6 2.97 3.31 GH DC WS UZC CCA MJC N0515 01 24 38.45 +33 28 22.4 8 3.53 3.37 UZC DC Pds VPS1 BCG CCA WS HCo N0516 01 24 08.10 +09 33 05.5 5 1.62 0.71 WS UZC GH CCA DC N0517 01 24 43.80 +33 25 45.7 9 1.40 1.76 DC WS BCG UZC VPS1 HCds GSC CCA KEBA N0518 01 24 17.73 +09 19 51.4 6 0.94 2.56 WS Pds UZC DC GH CCA N0519 01 24 28.7 -01 38 29 6 2.21 2.23 UZC HC BCG SPC WS RC2 N0520 01 24 34.87 +03 47 30.6 7 0.35 2.26 SPF HC2m HC2m JCR HHKK HC2m CCR N0520e 01 24 37.61 +03 47 17.9 1 HCds N0520s 01 24 34.75 +03 47 22.5 1 HCds N0520w 01 24 34.33 +03 47 41.7 4 0.90 2.13 SPC UZC HCds GSC N0521 01 24 33.81 +01 43 52.5 6 2.77 1.18 WS GH SPC UZC CCA DC N0522 01 24 45.83 +09 59 40.1 9 1.23 0.99 GH DC UA20 GSC GSCA APMN UZC WS CCA N0523e=N0537e 01 25 22.41 +34 01 32.9 2 0.53 0.42 GSC BCG N0523m=N0537m 01 25 20.82 +34 01 29.5 5 0.63 0.93 WS BCG DC GSC CCA N0523w=N0537w 01 25 19.55 +34 01 27.7 4 0.69 4.79 BCG UZC GSC VPS N0524 01 24 47.75 +09 32 20.9 6 1.24 4.97 GH MJC WS UZC DC CCA N0525 01 24 52.840 +09 42 10.81 4 3.66 1.70 DC KHJ UZC CCA N0526=N0526A 01 23 54.25 -35 03 55.4 3 0.62 2.04 Pds GSC WS N0526B 01 23 56.94 -35 04 08.7 3 0.61 2.16 WS GSC Pds N0527 01 23 58.00 -35 06 55.6 5 0.61 1.69 Pds Pds2 WS GSC ESOB N0528 01 25 33.69 +33 40 16.3 7 3.18 2.81 WS BCG UZC CCA VPS1 Pds DC N0529 01 25 40.32 +34 42 46.6 8 0.96 1.41 WS VPS UZC DC GSC HKA BCG CCA N0530=I0106 01 24 41.72 -01 35 14.8 8 2.21 1.99 DC HCds UZC WS SPC HC CCA KEB1 N0531 01 26 18.87 +34 45 14.1 7 1.12 1.33 WS HKA BCG UZC GSC VPS CCA N0532 01 25 17.19 +09 15 50.4 5 1.66 1.93 WS GH DC UZC CCA N0533 01 25 31.49 +01 45 32.7 6 1.22 1.63 WS SPC UZC DC CCA GH N0534 01 24 44.68 -38 07 43.9 3 3.00 2.14 WS GSC ESOB N0535 01 25 31.16 -01 24 32.3 6 3.11 2.68 WS UZC BCG SPC CCA HC N0536 01 26 21.77 +34 42 10.4 8 2.42 2.24 HKA VPS WS GSC DC CCA UZC BCG N0537e=N0523e 01 25 22.41 +34 01 32.9 2 0.53 0.42 GSC BCG N0537m=N0523m 01 25 20.82 +34 01 29.5 5 0.63 0.93 WS BCG DC GSC CCA N0537w=N0523w 01 25 19.55 +34 01 27.7 4 0.69 4.79 BCG UZC GSC VPS N0538 01 25 26.13 -01 33 03.9 6 1.35 1.21 HC BCG UZC SPC WS CCA N0539=N0563 01 25 21.749 -18 09 50.33 5 0.64 1.89 SPC WS GSC KHJ ESOB N0540 01 27 08.833 -20 02 11.14 5 0.84 1.53 ESOB WS HCds SPC KHJ N0541 01 25 44.370 -01 22 46.32 8 1.18 2.05 RG DC UZC WS CCA BCG SPC HC N0542 01 26 30.91 +34 40 31.2 6 0.53 0.69 GSC HKA VPS BCG UZC WS N0543 01 25 50.0 -01 17 35 5 1.34 1.87 UZC BCG WS SPC HC N0544 01 25 11.91 -38 05 39.5 3 1.61 2.86 WS ESOB GSC N0545 01 25 59.151 -01 20 25.64 10 2.04 2.56 HC WS RG UZC BCG CCA PCR GH SPC DC N0546 01 25 12.73 -38 04 08.5 3 1.79 2.07 WS GSC ESOB N0547 01 26 00.710 -01 20 42.87 9 1.08 2.28 RG BCG UZC DC DC WS SPC CCA GH N0548 01 26 02.53 -01 13 33.5 6 1.67 1.27 HC BCG UZC WS CCA SPC N0549 01 25 07.02 -38 00 26.2 2 1.08 2.97 ESOB GSC N0550 01 26 42.44 +02 01 19.5 6 2.72 1.44 DC WS GH CCA UZC SPC N0551 01 27 40.66 +37 10 57.9 6 1.09 0.59 WS UZC VPS GSC CCA DC N0552: 01 26 10.15 +33 24 21.1 1 GSC N0553: 01 26 12.53 +33 24 18.5 3 0.26 0.38 KEB1 VPS1 GSC N0554n 01 27 09.60 -22 43 25.8 2 1.17 0.78 WS HCds N0554n+s 01 27 09 -22 43.5 1 ESOB N0554s 01 27 09.63 -22 43 32.8 2 0.10 0.71 HCds WS N0555 01 27 11.702 -22 45 44.06 4 2.78 0.88 ESOB WS KHJ HCds N0556 01 27 12.569 -22 41 51.54 3 0.45 0.36 WS HCds KHJ N0557=I1703 01 26 25.08 -01 38 19.6 8 2.02 1.22 HC HCds Pds BCG UZC WS SPC CCA N0558 01 27 16.077 -01 58 16.77 6 2.41 2.18 HC BCG GHD2 UZC SPC KHJ N0559 01 29 31 +63 18.4 3 13.60 18.33 TDM BSV BSV N0560=I0117 01 27 25.38 -01 54 48.3 8 1.72 4.07 HC WS GHD2 UZC BCG SPC CCA DC N0561 01 28 18.77 +34 18 30.3 7 1.86 1.81 DC WS VPS BCG Pds UZC CCA N0562 01 28 29.35 +48 23 13.5 5 1.59 1.82 SBG1 WS UZC CCA DC N0563=N0539 01 25 21.749 -18 09 50.33 5 0.64 1.89 SPC WS GSC KHJ ESOB N0564 01 27 48.14 -01 52 46.0 8 2.29 2.51 HC HC WS DC UZC BCG SPC CCA N0565 01 28 10.12 -01 18 22.7 7 1.35 1.59 DC WS SPC HC UZC BCG CCA N0566 01 29 02.97 +32 19 55.3 4 1.33 1.12 WS VPS1 UZC CCA N0567 01 27 02.436 -10 15 55.52 2 0.89 0.76 KHJ SPC N0568=I1709 01 27 56.9 -35 43 03 3 0.70 1.73 ESOB WS Pds N0569 01 29 07.25 +11 07 51.7 5 1.34 1.12 WS UZC Pds2 KET2 CCA N0570 01 28 58.65 -00 56 58.0 7 2.28 2.74 WS SPC BCG UZC CCA HC DC N0571 01 29 56.09 +32 30 03.1 4 1.30 2.14 VPS1 WS UZC CCA N0572 01 28 36.3 -39 18 25 2 0.82 2.83 ESOB WS N0573 01 30 49.29 +41 15 25.5 5 1.68 1.10 DC VPS WS UZC CCA N0574 01 29 02.9 -35 35 55 2 2.58 1.41 ESOB WS N0575=I1710 01 30 46.53 +21 26 23.6 6 1.92 1.31 WS UZC DC Pds CCA GSC N0576 01 28 57.2 -51 35 54 2 1.97 0.00 ESOB WS N0577=N0580 01 30 40.68 -01 59 40.4 6 1.16 1.92 HCds WS UZC HC SPC CCA N0578 01 30 28.6 -22 39 59 3 5.75 2.52 ESOB GHD2 WS N0579 01 31 46.52 +33 36 55.6 7 3.52 4.13 DC K03 K05 UZC CCA VPS1 WS N0580=N0577 01 30 40.68 -01 59 40.4 6 1.16 1.92 HCds WS UZC HC SPC CCA N0581 01 33 23 +60 39.0 2 15.72 42.43 BSV TDM N0582 01 31 58.05 +33 28 33.6 5 2.65 2.41 DC UZC CCA WS VPS1 N0583 01 29 44.201 -18 20 23.07 4 1.43 1.82 KHJ SPC WS ESOB N0584=I1712 01 31 20.74 -06 52 05.1 5 1.30 1.58 HCds HC GHD2 WS SPC N0585 01 31 42.19 -00 55 58.5 6 2.27 2.71 UZC SPC CCA HC WS DC N0586 01 31 36.87 -06 53 37.5 6 1.17 2.20 WS GHD2 HCds Pds SPC HC N0587 01 32 33.43 +35 21 30.2 6 1.38 1.49 WS VPS HCds UZC CCA DC N0588 01 32 45.6 +30 38 56 2 2.74 4.24 HC WS N0589 01 32 39.930 -12 02 34.31 4 0.69 0.75 KET2 KHJ SPC GSC N0590 01 33 40.96 +44 55 43.3 5 2.10 1.46 WS UZC VPS CCA DC N0591 01 33 31.32 +35 40 05.2 7 2.34 1.26 WS UZC UW CCA VPS KEB1 DC N0592 01 33 12.0 +30 38 45 3 3.26 1.00 HC WS GSC N0593 01 32 20.7 -12 21 21 2 1.04 5.66 WS SPC N0594 01 32 56.9 -16 32 09 2 1.02 1.41 SPC WS N0595 01 33 33.8 +30 41 31 2 2.74 2.83 HC WS N0596 01 32 52.0 -07 01 56 3 0.86 0.00 SPC WS GHD2 N0597 01 32 14.8 -33 29 52 2 3.53 2.12 ESOB WS N0598 01 33 50.90 +30 39 36.6 6 0.78 0.41 CBF SPF HC2m VL HCds CCA N0599 01 32 53.81 -12 11 27.7 3 0.85 1.00 WS GSC SPC N0600 01 33 05.4 -07 18 44 3 0.00 2.65 GHD2 WS SPC N0601 01 33 06.600 -12 12 32.02 3 0.73 0.94 GSC KHJ SPC N0602 01 29 26 -73 33.5 2 0.00 8.47 BSc ESOB N0603 01 34 44.0 +30 13 56 4 1.63 2.06 HC GSCm HCds WS N0603 n * 01 34 43.89 +30 14 06.0 1 HCds N0603 se * 01 34 44.44 +30 13 52.2 1 HCds N0603 sw * 01 34 43.59 +30 13 58.0 1 HCds N0604 01 34 32.83 +30 47 02.0 3 2.03 2.50 HC GSC WS N0605 01 35 02.36 +41 14 52.3 5 1.20 1.48 DC WS VPS UZC CCA N0606 01 34 50.26 +21 25 03.3 4 1.24 2.50 UZC CCA WS DC N0607 01 34 16.367 -07 24 44.79 5 0.53 1.78 HCds WS GSCm UCA2 HC2m N0607 n * 01 34 16.318 -07 24 37.99 3 0.68 0.73 HCds UCA2 HC2m N0607 s * 01 34 16.417 -07 24 51.82 3 0.98 0.73 HCds UCA2 HC2m N0608=N0618?? 01 35 28.26 +33 39 24.0 6 1.43 1.63 WS VPS1 GSC CCA UZC DC N0609 01 36 23 +64 32.3 2 0.00 8.47 BSV TDM N0610 01 34.3 -20 08 1o Mu2 N0611 01 34.3 -20 07 1o Mu2 N0612 01 33 57.89 -36 29 34.4 5 3.25 1.74 WS vdH+ EWSr ESOB RC2 N0613 01 34 18.25 -29 25 07.5 5 1.30 0.97 HC2m HHD vdH+ HCds WS N0614=N0627=N0618? 01 35 52.25 +33 40 53.1 7 1.01 1.89 DC WS VPS1 GSC Pds UZC CCA N0615 01 35 05.6 -07 20 26 3 3.10 1.00 GHD2 WS SPC N0616 01 36 04.2 +33 46 13 3 1.25 1.53 HCds WS GSCm N0616 ne * 01 36 04.43 +33 46 18.1 1 HCds N0616 sw * 01 36 03.76 +33 46 11.2 1 HCds N0617 01 34 02.552 -09 46 26.74 2 0.26 0.06 KHJ SPC N0618?=N0614=N0627 01 35 52.25 +33 40 53.1 7 1.01 1.89 DC WS VPS1 GSC Pds UZC CCA N0618??=N0608 01 35 28.26 +33 39 24.0 6 1.43 1.63 WS VPS1 GSC CCA UZC DC N0619 01 34 51.9 -36 29 19 2 2.55 4.95 WS ESOB N0620 01 36 59.78 +42 19 19.7 5 2.04 1.79 WS VPS DC UZC CCA N0621 01 36 49.07 +35 30 43.1 5 1.35 1.00 WS VPS DC UZC CCA N0622 01 36 00.05 +00 39 49.4 8 3.35 2.64 DC KET1 HC WS SPC Pds UZC CCA N0623 01 35 06.2 -36 29 24 2 4.25 2.12 ESOB WS N0624 01 35 51.1 -10 00 11 2 1.04 2.12 SPC WS N0625 01 35 04.8 -41 26 13 2 5.54 4.24 WS ESOB N0626 01 35 11.9 -39 08 50 2 0.00 3.54 ESO WS N0627=N0614=N0618? 01 35 52.25 +33 40 53.1 7 1.01 1.89 DC WS VPS1 GSC Pds UZC CCA N0628 01 36 41.82 +15 47 00.6 12 2.72 4.12 GSCM GSC WS UZC SPC SPF HC2m GH CCA AAS DC GC N0629 01 38 58.5 +72 52 01 1 GSCm N0630 01 35 36.6 -39 21 32 2 0.82 4.24 WS ESO N0631 01 36 47.078 +05 50 06.76 5 0.45 0.36 Pds UZC KHJ SPF CCA N0632 01 37 17.52 +05 52 38.4 6 1.97 1.60 DC WS UZC KET2 HCds CCA N0633 01 36 23.7 -37 19 20 2 6.72 5.66 WS ESOB N0634 01 38 18.48 +35 21 53.6 5 2.68 1.60 DC VPS UZC WS CCA N0635 01 38 17.84 -22 55 44.0 2 0.88 0.00 GSC HCds N0636 01 39 06.46 -07 30 45.1 4 2.17 1.72 GHD2 GSC WS SPC N0637 01 43 04 +64 02.4 2 9.37 21.21 BSV TDM N0638 01 39 37.88 +07 14 13.4 5 0.79 2.12 WS KET2 CCA DC UZC N0639 01 38 58.95 -29 55 30.6 3 2.60 1.01 ESOB HCds WS N0640 01 39 25.0 -09 24 05 2 1.05 0.71 WS SPC N0641 01 38 39.2 -42 31 37 2 2.34 4.24 WS ESOB N0642 01 39 06.43 -29 54 54.7 3 3.43 1.76 WS HCds ESOB N0643 01 35 01.01 -75 33 24.2 4 1.68 1.00 BSc DLW HCds ESOB N0643A 01 30 37.64 -76 03 15.6 2 4.47 0.85 HCds BSc N0643B 01 39 12.3 -75 00 42 2 4.05 0.71 ESOB WS N0643C 01 41 48.9 -75 16 09 3 0.22 4.62 WS ESOB RC2 N0644 01 38 53.0 -42 35 07 2 3.11 2.83 WS ESOB N0645 01 40 08.79 +05 43 35.7 4 0.07 3.69 CCA WS UZC DC N0646 01 37 21.49 -64 53 43.9 3 3.26 1.32 WS HCds ESOB N0646 comp 01 37 30.0 -64 53 46 1 WS N0647 01 39 56.220 -09 14 32.85 2 0.77 0.45 KHJ SPC N0648=I0146 01 38 39.81 -17 49 54.5 4 0.50 2.98 HCds ESOB SPC WS N0648=I0146 comp 01 38 38.55 -17 49 41.0 1 HCds N0649 01 40 07.5 -09 16 20 2 0.00 0.71 WS SPC N0650 01 42 18.1 +51 34 15 1 HCo N0650/51 01 42 19.640 +51 34 32.94 4 2.76 2.36 BSV KP HCo CK N0651 01 42 22.0 +51 34 48 1 HCo N0652 01 40 43.269 +07 58 57.18 4 0.68 1.36 SPF CCA KHJ UZC N0653 01 42 25.71 +35 38 17.9 5 1.55 1.18 WS DC UZC VPS CCA N0654 01 44 00 +61 53.1 2 10.08 8.49 BSV TDM N0655 01 41 55.1 -13 04 56 2 1.03 2.83 WS SPC N0656 01 42 27.37 +26 08 34.5 4 1.91 1.26 WS UZC CCA DC N0657 01 43 20 +55 50.2 1 HCe N0657? 01 43 47 +55 52.7 1 TDM N0658 01 42 09.76 +12 36 06.0 4 1.25 2.49 UZC WS CCA DC N0659 01 44 24 +60 40.4 2 10.47 16.97 BSV TDM N0660 01 43 02.08 +13 38 39.5 10 4.22 5.11 CCA UZC GSC WS HCds JCR CCR HC2m SPF vdH+ N0661 01 44 14.56 +28 42 21.7 6 1.49 2.74 GHD1 DC VPS1 CCA UZC WS N0662 01 44 35.47 +37 41 46.3 7 1.30 1.66 KEBA VPS WS DC UZC K05 CCA N0663 01 46 09 +61 14.1 2 72.02 84.85 TDM BSV N0664 01 43 45.89 +04 13 20.1 4 0.72 2.84 UZC CCA DC WS N0665 01 44 56.06 +10 25 21.6 4 1.39 0.90 WS DC UZC CCA N0666 01 46 06.21 +34 22 27.7 6 2.27 1.49 WS VPS UZC KEBA CCA DC N0667 01 44 57.0 -22 55 13 2 6.83 4.24 WS ESOB N0668 01 46 22.69 +36 27 36.7 5 2.03 1.92 WS UZC VPS CCA DC N0669 01 47 16.14 +35 33 46.1 5 2.33 1.55 DC WS VPS UZC CCA N0670 01 47 24.95 +27 53 09.5 8 1.86 1.66 SPF K14 GHD1 VPS1 WS UZC CCA DC N0671 01 46 59.21 +13 07 30.8 4 2.08 2.63 WS UZC CCA DC N0672 01 47 54.05 +27 25 58.6 11 3.88 2.36 DC HHKK GSCM WS CCA HCds HC2m SPF GSC UZC GHD1 N0672 k1 01 47 54.47 +27 25 58.6 1 HC2m N0672 k2 01 47 53.98 +27 25 56.6 1 HC2m N0673 01 48 22.53 +11 31 17.4 5 1.79 3.15 WS SNp UZC CCA DC N0674=N0697 01 51 17.45 +22 21 28.1 8 1.54 2.35 DC UZC GSC WS GH HC2m 2MSP CCA N0675 01 49 08.58 +13 03 33.6 4 1.40 1.01 WS UZC CCA KEB1 N0676 01 48 57.34 +05 54 25.8 8 0.99 2.88 WS 2MSP UZC GH HC2m CCA KEBA DC N0676 sup * 01 48 57.27 +05 54 21.9 1 HC2m N0677 01 49 14.161 +13 03 18.16 4 3.45 1.43 KEB1 KHJ CCA DC N0678 01 49 24.94 +21 59 49.7 5 2.38 2.09 WS UZC CCA GH DC N0679 01 49 43.76 +35 47 06.8 5 1.16 1.19 UZC WS VPS CCA DC N0680 01 49 47.29 +21 58 14.4 5 0.73 0.83 WS GH UZC CCA DC N0681 01 49 10.8 -10 25 37 3 0.85 3.46 GHD2 SPC WS N0682 01 49 04.4 -14 58 29 2 1.02 0.00 WS SPC N0683 01 49 46.704 +11 42 04.26 5 0.39 0.66 KHJ UZC Pds SPF CCA N0684=I0165 01 50 14.03 +27 38 46.4 5 2.10 3.53 GHD1 HCds CCA WS DC N0685 01 47 42.88 -52 45 42.6 3 1.59 2.08 HCds WS ESOB N0686 01 48 56.2 -23 47 54 2 2.91 0.00 WS ESOB N0687 01 50 33.37 +36 22 14.3 5 3.65 1.20 WS UZC VPS CCA DC N0688 01 50 44.23 +35 17 03.7 6 1.71 1.04 WS KET2 UZC VPS CCA DC N0689 01 49 51.7 -27 27 58 2 2.82 2.83 WS ESOB N0690 01 47 48.22 -16 43 17.8 4 4.50 1.76 WS SPC GSC SGC N0691 01 50 41.76 +21 45 35.1 5 1.25 1.28 UZC WS DC CCA GH N0692 01 48 42.2 -48 38 53 3 1.14 1.15 Pds ESOB WS N0693 01 50 30.89 +06 08 41.8 5 0.20 2.49 WS DC UZC GH CCA N0694 01 50 58.49 +21 59 50.8 6 1.69 3.09 SDP WS UZC CCA GH DC N0695 01 51 14.212 +22 34 56.88 5 2.74 1.30 DC UZC KHJ CCA GH N0696 01 49 31.16 -34 54 19.3 2 0.87 0.35 GSC WS N0697=N0674 01 51 17.45 +22 21 28.1 8 1.54 2.35 DC UZC GSC WS GH HC2m 2MSP CCA N0698 01 49 43.53 -34 49 52.6 3 1.23 2.52 ESOB GSC WS N0699 01 50 43.8 -12 02 09 2 4.15 0.00 WS SPC N0700 01 52 16.84 +36 02 11.8 2 0.69 0.28 VPS GSC N0701 01 51 03.8 -09 42 11 3 0.85 2.89 GHD2 SPC WS N0702=N0702e 01 51 19.2 -04 03 21 3 1.50 1.00 HCo WS SPC N0702e+w 01 51 19.04 -04 03 17.0 1 GSC N0702nw 01 51 18.27 -04 02 55.9 2 1.37 1.27 HCo GSC N0702w 01 51 18.6 -04 03 14 1 HCo N0703 01 52 39.64 +36 10 16.6 5 0.60 1.53 GSC VPS DC WS CCA N0704 01 52 37.84 +36 07 32.2 1 GSCm N0704nw 01 52 37.67 +36 07 36.0 5 0.57 1.06 DC WS Pds GSC VPS N0704se 01 52 37.88 +36 07 28.0 4 2.39 2.50 DC GSC WS UZC N0705 01 52 41.64 +36 08 37.8 6 1.13 0.51 GSC UZC WS VPS CCA DC N0706 01 51 50.54 +06 17 45.8 5 2.24 1.91 DC UZC CCA GH WS N0707 01 51 27.18 -08 30 22.2 3 3.80 1.96 WS GSC SPC N0707 se 01 51 27.6 -08 30 26 1 WS N0708 01 52 46.43 +36 09 06.3 5 1.00 1.27 UZC VPS GSC WS CCA N0709 01 52 50.65 +36 13 22.2 4 0.51 1.94 WS VPS GSC UZC N0710 01 52 53.96 +36 03 11.3 8 1.03 2.13 VPS UZC GSC DC WS K13 K05 CCA N0711 01 52 27.795 +17 30 45.55 5 0.29 0.97 KHJ Pds UZC DC CCA N0712 01 53 08.55 +36 49 11.3 6 2.62 3.29 WS VPS UZC GSC CCA DC N0713 01 55 21.57 -09 05 01.2 3 0.26 0.23 GSC SPC WS N0714 01 53 29.68 +36 13 15.6 7 1.08 1.21 DC WS GSC VPS Pds UZC CCA N0715 01 53 12.4 -12 52 25 2 0.00 0.00 SPC WS N0716=I1743 01 52 59.64 +12 42 28.8 5 1.46 0.98 WS DC CCA GSC UZC N0717 01 53 55.10 +36 13 45.2 4 1.00 0.47 WS VPS UZC CCA N0718 01 53 13.25 +04 11 43.0 4 2.71 1.39 WS UZC CCA GH N0719=I1744 01 53 38.857 +19 50 24.99 4 0.88 0.64 UZC SPF KHJ CCA N0720 01 53 00.4 -13 44 19 3 0.00 1.73 GHD2 SPC WS N0721 01 54 45.52 +39 22 58.8 7 1.48 2.89 WS Pds UZC VPS DC CCA GHD1 N0722 01 54 46.95 +20 41 52.7 5 1.29 0.82 Pds WS SPF CCA UZC N0723=N0724 01 53 45.67 -23 45 27.7 4 1.40 0.43 HCds WS HC2m ESOB N0724=N0723 01 53 45.67 -23 45 27.7 4 1.40 0.43 HCds WS HC2m ESOB N0725 01 52 35.5 -16 31 04 2 3.05 0.00 WS SPC N0726 01 55 31.9 -10 48 01 3 0.85 2.31 WS K02 SPC N0727=N0729 01 53 49.17 -35 51 22.4 3 3.43 0.06 ESOB GSC WS N0728 01 55 01.4 +04 13 20 3 1.50 1.15 HCds GSCm WS N0728 ne * 01 55 01.71 +04 13 30.3 1 HCds N0728 se * 01 55 01.67 +04 13 17.3 1 HCds N0728 sw * 01 55 00.60 +04 13 16.1 1 HCds N0729=N0727 01 53 49.17 -35 51 22.4 3 3.43 0.06 ESOB GSC WS N0730 01 55 18.02 +05 38 08.9 2 0.32 2.97 GSC WS N0731=N0757 01 54 56.14 -09 00 39.7 4 2.10 1.94 WS GSC Pds SPC N0732 01 56 27.71 +36 48 07.5 7 0.88 2.17 KEBA WS UZC VPS HC2m KET2 CCA N0733 01 56 33.73 +33 03 22.2 2 2.85 4.38 HCds GSC N0733? 01 56 24.67 +33 03 53.0 4 0.88 4.03 HCds WS Pds2 GSC N0734 01 54 57.20 -17 04 48.2 4 3.05 1.82 SHM WS GSC SPC N0735 01 56 38.00 +34 10 35.8 5 1.77 2.21 DC VPS UZC CCA WS N0736 01 56 40.98 +33 02 38.3 8 2.96 2.26 HCds UZC DC GSC WS CCA VPS1 GHD1 N0737 01 56 40.8 +33 03 00 3 0.00 4.51 WS GSCm HCds N0737 m * 01 56 40.80 +33 03 04.6 1 HCds N0737 ne * 01 56 41.25 +33 03 12.8 1 HCds N0737 sw * 01 56 40.25 +33 02 58.4 1 HCds N0738 01 56 45.674 +33 03 31.43 6 0.84 1.83 HCds Pds2 KHJ GSC UZC VPS1 N0739 01 56 54.705 +33 16 00.01 4 0.15 0.44 KHJ GSC UZC KEBA N0740 01 56 54.94 +33 00 55.6 8 1.31 2.12 HCds K13 UZC GSC WS GHD1 VPS1 CCA N0741=I1751 01 56 21.03 +05 37 43.1 8 1.51 1.28 DC WS GSC SPF KEBA CCA GH UZC N0742 01 56 24.05 +05 37 34.4 5 1.38 2.60 UZC HC WS GSC SPF N0743 01 58 37 +60 09.3 2 63.81 55.15 BSV TDM N0744 01 58 33 +55 28.4 2 42.34 4.24 BSV TDM N0745 01 54 07.74 -56 41 37.5 2 0.52 1.20 HCds WS N0745 all 01 54 09 -56 41.4 1 ESOB N0745 e comp 01 54 11.27 -56 41 07.5 2 1.27 1.34 HCds WS N0745 w comp 01 54 07.65 -56 41 15.5 2 0.52 1.27 HCds WS N0746 01 57 51.12 +44 55 04.3 5 1.79 1.44 WS VPS CCA UZC DC N0747 01 57 30.43 -09 27 45.8 3 0.74 1.86 WS GSC SPC N0748 01 56 21.8 -04 28 03 2 0.00 0.00 SPC WS N0749 01 55 41.08 -29 55 20.7 3 1.95 0.51 WS GSC ESOB N0750 01 57 32.58 +33 12 35.4 5 1.59 2.23 DC GHD1 WS UZC CCA N0750+N0751 01 57 32.71 +33 12 23.9 3 0.45 1.56 K13 VPS1 GSC N0751 01 57 32.98 +33 12 11.7 4 1.04 4.20 DC GHD1 CCA WS N0752 01 57 41 +37 47.1 3 77.38354.60 BSV TDM BSV N0753 01 57 42.43 +35 54 56.3 6 1.87 1.42 UZC WS VPS CCA GHD1 DC N0754 01 54 20.9 -56 45 41 2 1.73 0.00 WS ESOB N0755=N0763 01 56 22.59 -09 03 43.6 8 2.84 3.04 K02 HCds GSC SPC WS HC2m HC2m GHD2 N0756 01 54 29.17 -16 42 28.9 4 2.85 3.37 SPC WS HCds SHM N0756 comp 01 54 29.76 -16 42 32.2 1 HCds N0756 knot or * 01 54 29.73 -16 42 23.8 1 HCds N0757=N0731 01 54 56.14 -09 00 39.7 4 2.10 1.94 WS GSC Pds SPC N0758 01 55 42.142 -03 03 59.78 3 0.45 0.38 GSC KHJ SPC N0759 01 57 50.38 +36 20 33.6 6 2.42 1.59 GHD1 VPS WS UZC CCA DC N0760 01 57 47.33 +33 21 20.0 3 0.88 3.64 HCds WS GSC N0760 e * 01 57 47.44 +33 21 23.7 1 HCds N0760 w * 01 57 47.08 +33 21 24.1 1 HCds N0761 01 57 49.68 +33 22 37.6 8 2.03 2.90 HCds WS UZC GSC VPS1 CCA DC GHD1 N0762 01 56 57.8 -05 24 10 3 2.28 0.58 KET2 SPC WS N0763=N0755 01 56 22.59 -09 03 43.6 8 2.84 3.04 K02 HCds GSC SPC WS HC2m HC2m GHD2 N0764? 01 57 03.2 -16 03 43 3 0.83 1.15 HCds WS HCo N0764? nw * 01 57 02.87 -16 03 37.0 1 HCds N0764? se * 01 57 03.51 -16 03 50.0 1 HCds N0765 01 58 47.93 +24 53 30.8 4 3.47 1.54 DC UZC WS CCA N0766 01 58 42.01 +08 20 49.2 4 0.74 2.95 UZC WS DC CCA N0767 01 58 50.8 -09 35 14 3 1.71 1.53 K02 SPC WS N0768 01 58 40.81 +00 31 44.6 6 2.69 1.68 DC WS UZC K15 CCA SPC N0769 01 59 35.92 +30 54 34.1 7 2.38 1.63 DC WS K13 KEBA UZC CCA VPS1 N0770 01 59 13.55 +18 57 17.1 6 3.17 1.34 DC WS UZC HC2m CCA GH N0771 02 03 26.350 +72 25 16.00 4 1.30 0.72 WS Ty2 SAO FK5 N0772 01 59 19.85 +19 00 28.7 9 3.93 4.43 WS HC2m CCA HCds UZC GSC GC GH DC N0773 01 58 52.1 -11 30 55 2 3.12 2.12 WS SPC N0774 01 59 34.78 +14 00 29.0 4 1.41 0.93 WS UZC CCA DC N0775 01 58 32.6 -26 17 35 3 2.32 3.61 ESOB WS Pds N0776 01 59 54.55 +23 38 38.3 6 0.92 1.77 CCA GSC Pds UZC WS DC N0777 02 00 14.96 +31 25 46.3 6 1.34 3.18 WS UZC VPS1 GHD1 CCA DC N0778 02 00 19.43 +31 18 46.7 5 0.52 1.82 WS UZC DC VPS1 CCA N0779 01 59 42.4 -05 57 51 3 3.95 3.21 GHD2 SPC WS N0780 02 00 35.227 +28 13 30.65 4 0.83 0.62 KHJ UZC VPS1 CCA N0781 02 00 09.02 +12 39 19.8 4 2.40 2.09 WS UZC CCA DC N0782 01 57 40.25 -57 47 26.3 2 2.25 3.61 WS HCds N0783=I1765 02 01 06.58 +31 52 56.0 7 1.23 1.79 UZC WS KEB1 K13 VPS1 CCA DC N0784 02 01 17.08 +28 50 14.3 5 1.27 0.89 GSC UZC DC CCA GHD1 N0785=I1766 02 01 40.14 +31 49 34.4 5 2.85 1.18 VPS1 WS UZC CCA DC N0786 02 01 24.68 +15 38 47.4 5 0.70 2.58 WS DC GSC CCA UZC N0787 02 00 48.61 -09 00 09.4 3 0.09 0.53 SPC WS HCds N0788 02 01 06.360 -06 48 56.57 5 2.23 3.27 GHD2 WS SPC AE UW N0789 02 02 26.04 +32 04 19.6 8 0.95 1.41 DC KEBA VPS1 WS K13 GSC CCA UZC N0790 02 01 21.6 -05 22 14 3 0.86 2.65 Pds WS SPC N0791 02 01 44.26 +08 29 58.0 4 1.04 1.44 WS SPF UZC CCA N0792 02 02 15.35 +15 42 43.4 6 0.91 0.78 SPF 2MSP WS UZC CCA Pds N0793? 02 02 54.5 +31 58 52 3 0.74 4.04 HCds HCo WS N0793? ne * 02 02 54.55 +31 59 02.4 1 HCds N0793? sw * 02 02 54.27 +31 58 52.3 1 HCds N0794=I0191 02 02 29.37 +18 22 22.5 5 1.17 2.13 UZC GSC WS CCA DC N0795 01 59 49.5 -55 49 29 2 2.37 0.00 WS ESOB N0796 01 56 44.3 -74 13 10 3 2.06 1.73 ESOB DLW BSc N0797 02 03 27.995 +38 07 01.66 7 1.01 1.54 Pds UZC VPS KHJ GSC CCA DC N0798 02 03 19.63 +32 04 38.8 5 0.77 1.49 WS UZC VPS1 GSC CCA N0799 02 02 12.34 -00 06 04.1 6 1.67 2.54 WS DC UZC CCA SPF SPC N0800 02 02 11.84 -00 07 50.4 6 0.60 1.91 UZC WS SPC SPF CCA K15 N0801 02 03 45.02 +38 15 33.2 6 2.01 1.83 GSC UZC WS VPS CCA DC N0802 01 59 06.6 -67 52 12 2 3.56 2.83 WS ESOB N0803 02 03 44.93 +16 01 52.0 5 1.81 1.70 WS UZC CCA GH DC N0804=I1773 02 04 02.16 +30 49 57.2 5 0.73 1.84 UZC GSC WS VPS1 CCA N0805 02 04 29.598 +28 48 44.07 4 0.71 0.85 UZC KHJ VPS1 CCA N0806 02 03 31.3 -09 55 58 3 2.26 2.31 K02 WS SPC N0806 comp 02 03 32.4 -09 55 47 1 WS N0807 02 04 55.67 +28 59 16.1 5 1.84 2.84 WS UZC DC VPS1 CCA N0808 02 03 56.8 -23 18 47 2 6.81 3.54 WS GHD2 N0809 02 04 18.94 -08 44 07.4 3 0.34 0.58 SPC WS GSC N0810=N0810n+s 02 05 28.55 +13 15 05.4 2 0.21 0.35 HCds GSC N0810n 02 05 28.8 +13 15 09 1 HCo N0810s 02 05 28.61 +13 15 03.6 5 0.64 1.30 WS HCo UZC CCA Pds N0810se 02 05 29.34 +13 15 03.1 3 1.10 1.15 HCds WS HCo N0811 02 03 59.987 -09 06 20.90 3 0.65 0.91 HCds KHJ SDSS N0812 02 06 51.91 +44 34 15.7 2 4.78 5.30 CCA DC N0812nw 02 06 51.17 +44 34 28.6 3 0.83 0.49 VPS GSC UZC N0812se 02 06 53.0 +44 34 02 1 HCo N0813 02 01 36.5 -68 26 25 2 3.47 3.54 WS ESOB N0814 02 10 37.67 -15 46 25.0 2 0.20 0.07 HC2m GSC N0815 02 10 39.37 -15 48 46.7 2 0.41 0.49 HC2m GSC N0815nw 02 10 39.13 -15 48 45.1 2 1.73 0.35 HCo HC2m N0815se 02 10 39.54 -15 48 48.8 2 0.20 0.78 HC2m HCo N0816 02 08 08.873 +29 15 21.75 4 0.68 1.17 K13 KHJ UZC VPS1 N0817 02 07 33.73 +17 12 06.3 4 1.79 2.09 WS UZC CCA DC N0818 02 08 44.52 +38 46 36.0 6 1.31 1.59 VPS WS GHD1 UZC DC CCA N0819 02 08 34.46 +29 14 01.8 6 1.90 1.32 K13 UZC WS VPS1 CCA DC N0820 02 08 25.01 +14 20 57.1 4 1.82 0.86 WS UZC CCA DC N0821 02 08 21.13 +10 59 40.9 6 2.98 2.66 WS GH DC CCA UZC MJC N0822 02 06 39.2 -41 09 26 2 0.00 0.00 ESOB WS N0823=I1782 02 07 19.98 -25 26 31.6 3 1.01 2.15 HCds ESOB WS N0823=I1782 * 02 07 20.93 -25 26 33.0 1 HCds N0824 02 06 53.0 -36 27 11 2 2.55 3.54 ESOB WS N0825 02 08 32.35 +06 19 24.8 4 0.70 2.17 UZC CCA WS DC N0826 02 09 25.14 +30 44 21.3 3 0.82 1.29 WS UZC VPS1 N0826 comp 02 09 24.8 +30 44 34 1 WS N0827 02 08 56.33 +07 58 16.8 4 0.15 1.39 WS UZC DC CCA N0828 02 10 09.55 +39 11 28.5 6 2.27 2.97 VPS WS RC2 UZC DC CCA N0829 02 08 42.1 -07 47 26 4 1.87 1.26 GHD2 K02 WS SPC N0830 02 08 58.7 -07 46 03 3 0.86 1.73 SPC WS KET2 N0831 02 09 34.55 +06 05 45.9 4 0.81 0.64 WS UZC K06 GSC N0832: 02 11 00.82 +35 32 29.0 2 0.26 0.71 HCds GSCm N0832: n * 02 11 00.88 +35 32 33.5 1 HCds N0832: s * 02 11 00.73 +35 32 25.5 1 HCds N0833 02 09 20.80 -10 07 59.7 4 2.75 0.61 GHD2 HKA WS SPC N0834 02 11 01.37 +37 40 00.1 9 2.40 2.33 WS K13 VPS HCds HCds KEBA UZC CCA DC N0835 02 09 24.69 -10 08 09.7 6 1.56 1.03 GHD2 K02 WS SPC HKA KET2 N0836 02 10 24.956 -22 03 18.04 3 2.93 1.58 WS KHJ ESOB N0837 02 10 16.0 -22 25 50 2 1.96 5.66 ESOB WS N0838 02 09 38.42 -10 08 47.4 6 2.31 0.55 GHD2 KET2 WS K02 SPC HKA N0839 02 09 42.87 -10 11 01.9 4 1.86 0.52 GHD2 WS HKA SPC N0840 02 10 16.257 +07 50 42.45 5 1.19 0.62 UZC KHJ SPF CCA Pds N0841 02 11 17.46 +37 29 50.0 7 3.27 1.72 VPS HCds K13 WS UZC CCA DC N0842 02 09 50.75 -07 45 45.5 4 0.59 1.05 GHD2 SPC WS GSC N0843 02 11 08.16 +32 05 51.3 2 0.99 0.85 GSCm WS N0843 n * 02 11 08.30 +32 05 57.5 1 HCds N0843 s * 02 11 08.31 +32 05 48.1 1 HCds N0843 w * 02 11 07.63 +32 05 50.0 1 HCds N0844 02 10 14.27 +06 02 59.2 4 0.60 0.98 WS Pds UZC GSC N0845 02 12 19.76 +37 28 36.8 7 1.81 1.93 VPS WS HCds CCA Pds DC UZC N0846=N0847 02 12 12.33 +44 34 05.0 6 2.59 1.36 WS HCds VPS UZC DC CCA N0847=N0846 02 12 12.33 +44 34 05.0 6 2.59 1.36 WS HCds VPS UZC DC CCA N0848 02 10 17.5 -10 19 15 5 2.42 2.55 GHD2 KET2 WS K02 SPC N0849 02 10 11.144 -22 19 23.12 3 1.48 1.05 ESOB KHJ WS N0850 02 11 13.550 -01 29 08.70 5 1.77 1.32 DC UZC CCA KHJ SPC N0851 02 11 12.17 +03 46 45.7 5 0.65 0.79 SPC UZC K06 CCA WS N0852 02 08 55.3 -56 44 13 2 1.73 0.00 WS ESOB N0853 02 11 41.27 -09 18 19.3 4 3.36 1.77 WS HCds GSC K02 N0854 02 11 30.6 -35 50 11 2 0.00 2.83 ESOB WS N0855 02 14 03.63 +27 52 37.5 7 1.57 1.30 DC UZC K01 WS K13 CCA VPS1 N0856=N0859 02 13 38.42 -00 43 03.0 6 0.63 1.72 SPF GSC WS UZC SPC CCA N0857 02 12 37.0 -31 56 40 2 0.00 0.71 ESOB WS N0858 02 12 29.9 -22 28 17 2 4.89 2.12 ESOB WS N0859=N0856 02 13 38.42 -00 43 03.0 6 0.63 1.72 SPF GSC WS UZC SPC CCA N0860 02 15 00.221 +30 46 42.96 3 0.74 0.61 KHJ UZC VPS1 N0861 02 15 51.18 +35 54 47.7 4 0.68 0.67 WS VPS UZC CCA N0862 02 13 02.8 -42 02 00 2 0.00 2.12 ESOB WS N0863=N0866=N0885 02 14 33.530 -00 46 00.98 9 2.61 2.62 DC K04 KHJ EDC UZC SPC CCA GSC KET1 N0864 02 15 27.59 +06 00 07.2 6 2.65 1.99 DC WS UZC HHKK CCA GH N0865 02 16 15.21 +28 36 00.3 6 2.45 1.34 WS Pds UZC VPS1 CCA DC N0866=N0863=N0885 02 14 33.530 -00 46 00.98 9 2.61 2.62 DC K04 KHJ EDC UZC SPC CCA GSC KET1 N0867?=N0875 02 17 04.82 +01 14 38.8 7 1.13 0.75 HCds SPC UZC WS GSC CCA DC N0867??=I0225 02 26 28.288 +01 09 37.37 7 0.81 0.69 HCds K04 UZC KHJ GSC CCA KET2 N0868nw 02 15 58.49 -00 42 48.5 4 1.11 0.74 HCo CCA WS GSC N0868se 02 15 58.8 -00 42 52 2 3.18 0.71 SPC HCo N0869 02 19 00 +57 07.7 2 34.76 33.94 TDM BSV N0870 02 17 09.2 +14 31 21 3 1.68 1.53 WS Pds2 HCo N0871 02 17 10.64 +14 32 52.1 6 1.73 2.63 DC WS UZC GSC GH CCA N0872 02 15 25.26 -17 46 54.1 3 0.87 2.47 HCds WS SPC N0873 02 16 32.3 -11 20 56 2 0.00 0.00 SPC WS N0874 02 16 01.9 -23 18 20 2 3.89 2.83 ESOB WS N0875 comp 02 17 02.72 +01 14 24.3 1 HCds N0875=?N0867 02 17 04.82 +01 14 38.8 7 1.13 0.75 HCds SPC UZC WS GSC CCA DC N0876 02 17 53.28 +14 31 15.4 3 1.45 1.71 WS CCA GH N0877 02 17 59.62 +14 32 38.9 5 1.87 2.88 UZC GH HC2m WS CCA N0878 02 17 54.3 -23 23 02 2 1.94 4.95 WS ESOB N0879 02 16 51.3 -08 57 49 3 0.00 1.53 K08 WS SPC N0880 02 18 27.2 -04 12 20 2 0.00 0.00 SPC WS N0881 02 18 45.3 -06 38 23 2 0.00 0.00 SPC WS N0882 02 19 39.920 +15 48 50.83 4 0.80 0.53 GSC KHJ UZC CCA N0883 02 19 05.21 -06 47 28.6 4 0.70 2.16 Pds WS GSC SPC N0884 02 22 18 +57 08.2 2 156.35 38.18 TDM HCe N0885=N0863=N0866 02 14 33.521 -00 46 01.07 8 2.76 2.78 DC K04 KHJ EDC UZC SPC GSC KET1 N0885=N0866=N0863 02 14 33.60 -00 46 00.2 1 CCA N0886 02 23 10.5 +63 46 28 3 26.70 25.40 WS HCe TDM N0887 02 19 32.6 -16 04 11 2 0.00 1.41 WS SPC N0888 02 17 27.4 -59 51 43 2 3.70 4.95 WS ESOB N0889 02 19 06.8 -41 44 57 2 0.00 1.41 ESOB WS N0890 02 22 00.97 +33 15 55.4 6 1.25 4.26 DC GHD1 WS UZC VPS1 CCA N0891 02 22 33.22 +42 20 53.9 12 3.36 5.35 HC2m CCA VPS WS AO Rup HC vdH+ GHD1 UZC GSC DC N0892 02 20 52.2 -23 06 49 2 2.92 1.41 WS ESOB N0893 02 19 58.81 -41 24 15.2 3 2.85 1.01 WS HCds ESOB N0893 comp 02 19 53.32 -41 23 45.1 1 HCds N0894 02 21 34.6 -05 30 36 2 1.06 0.71 SPC HCds N0894 knot 02 21 33.71 -05 30 46.1 1 HCds N0895 02 21 36.28 -05 31 17.0 5 5.31 2.34 GHD2 MJC HCds SPC WS N0896 02 25 27.8 +62 01 09 1 HCo N0897 02 21 06.2 -33 43 17 2 2.64 1.41 ESOB WS N0898 02 23 20.30 +41 57 05.2 6 2.20 2.52 HC WS VPS UZC CCA DC N0899 02 21 53.11 -20 49 24.0 4 1.46 1.89 HCds WS HC2m Pds N0900 02 23 32.197 +26 30 40.79 5 0.74 0.77 Pds KHJ GSC UZC CCA N0901 02 23 34.05 +26 33 23.2 2 1.62 2.40 WS GSC N0902 02 22 21.87 -16 40 45.0 3 0.87 1.03 WS SPC HCds N0903 02 24 00.865 +27 21 22.15 3 0.83 0.69 UZC KHJ GSC N0904 02 24 05.614 +27 20 31.83 5 0.63 0.69 KHJ Pds UZC GSC CCA N0905 02 22 43.503 -08 43 09.59 2 1.26 1.54 SPC KHJ N0906 02 25 16.30 +42 05 23.5 8 2.01 1.79 HC UZC WS GSC VPS CCA Pds DC N0907 02 23 02.1 -20 42 46 2 0.99 1.41 WS GHD2 N0908 02 23 04.67 -21 14 02.4 6 1.96 2.03 HC2m ESOB WS HCds GSCM GHD2 N0909 02 25 22.763 +42 02 06.95 6 0.52 1.57 DC CCA UZC GSC KHJ VPS N0910 02 25 26.78 +41 49 26.9 6 1.53 4.23 HC CCA WS UZC VPS DC N0911 02 25 42.42 +41 57 22.2 8 1.26 3.13 DC GSC CCA VPS Pds UZC WS HC N0912 02 25 42.639 +41 46 40.58 4 2.36 4.53 HC UZC KHJ VPS N0913 02 25 44.6 +41 47 56 4 1.45 2.99 HC UZC Pds WS N0914 02 26 05.15 +42 08 38.3 7 1.28 2.66 UZC WS CCA VPS GSC DC HC N0915 02 25 45.596 +27 13 15.31 2 0.30 0.45 KHJ GSC N0916 02 25 47.659 +27 14 32.36 4 0.57 0.66 Pds KHJ GSC UZC N0917 02 26 07.70 +31 54 43.2 3 0.52 2.38 VPS1 DC GSC N0918 02 25 50.82 +18 29 45.0 3 1.15 2.16 UZC WS CCA N0919 02 26 16.72 +27 12 41.7 6 1.51 1.75 HCo WS GSC UZC CCA Pds N0920 02 27 51.92 +45 56 48.2 3 0.32 1.25 SBG1 WS CCA N0921 02 26 33.5 -15 50 51 2 0.00 1.41 SPC WS N0922 02 25 04.6 -24 47 26 2 1.92 2.83 WS GHD2 N0923 02 27 34.75 +41 58 40.2 6 2.08 3.30 WS VPS UZC CCA HC DC N0924 02 26 46.72 +20 29 50.6 4 1.93 3.40 DC WS UZC CCA N0925 02 27 16.87 +33 34 43.7 11 2.12 2.34 DC GHD1 WS CCA VPS1 HC2m JGr K13 UZC GSC HCds N0926 02 26 06.78 -00 19 55.2 6 2.25 3.66 UZC WS SPC CCA GH DC N0927 02 26 37.27 +12 09 17.1 5 1.50 3.41 KET1 WS UZC DC CCA N0928 02 27 40.95 +27 13 14.2 3 1.51 1.13 WS GSC UZC N0929 02 27 18.2 -12 05 13 2 0.00 2.12 SPC WS N0930 02 27 51 +20 20.5 1o Cope N0931 02 28 14.65 +31 18 40.3 7 3.89 2.91 K01 WS VPS1 GSC CCA UZC DC N0932 02 27 54.688 +20 19 56.35 5 1.32 0.65 DC KHJ GSC UZC CCA N0933 02 29 17.569 +45 54 39.56 5 0.79 1.01 KHJ UZC SBG1 Pds CCA N0934 02 27 32.858 -00 14 41.68 5 3.01 2.15 DC UZC KHJ CCA SPC N0935 02 28 11.16 +19 35 57.5 6 2.27 1.72 DC CCA WS UZC HCds Pds N0936 02 27 37.37 -01 09 20.4 7 3.47 3.06 GC CCA GH UZC SPC WS DC N0937 02 29 28.12 +42 14 59.7 8 1.17 3.15 UZC HCds WS HCds HC2m VPS CCA HC N0937 knot 02 29 28.60 +42 14 59.0 3 0.61 1.06 HCds HC2m HCds N0937 sup *? 02 29 27.98 +42 14 55.7 3 0.23 0.65 HCds HC2m HCds N0938 02 28 33.46 +20 17 00.6 6 1.69 0.90 DC WS Pds UZC GSC CCA N0939 02 26 21.1 -44 26 46 2 5.28 2.83 ESOB WS N0940 02 29 27.54 +31 38 27.0 5 1.40 0.59 WS KEBA UZC CCA DC N0941 02 28 27.85 -01 09 04.7 7 1.74 1.28 DC UZC WS GH CCA K04 SPC N0942 02 29 10.214 -10 50 10.15 4 1.34 0.85 GHD2 KHJ GSC SPC N0943 02 29 09.52 -10 49 40.8 4 1.63 2.66 GHD2 WS SPC GSC N0944=I0228 02 26 41.60 -14 30 57.3 4 1.22 1.15 HCds HC2m WS SPC N0944=I0228 comp 02 26 39.24 -14 30 44.3 1 HCds N0945 02 28 37.2 -10 32 19 3 1.70 4.04 GHD2 SPC WS N0946 02 30 38.489 +42 13 56.29 5 0.72 1.86 DC KHJ VPS UZC CCA N0947 02 28 33.20 -19 02 29.7 4 3.72 3.92 ESOB GSC WS SPC N0948 02 28 45.3 -10 30 48 3 2.55 4.04 GHD2 SPC WS N0949 02 30 48.95 +37 08 10.9 7 2.72 2.79 WS UZC K01 VPS CCA K13 DC N0950 02 29 11.6 -11 01 31 2 0.00 0.71 WS SPC N0951 02 28 57.0 -22 21 00 2 1.96 2.83 WS ESOB N0952 02 31 18 +34 44.9 1o St3 N0953 02 31 09.81 +29 35 19.1 5 2.47 1.68 WS UZC VPS1 CCA DC N0954 02 28 51.7 -41 24 10 3 4.25 1.15 Pds WS ESOB N0955 02 30 33.30 -01 06 30.4 6 2.71 2.25 WS GH UZC CCA SPC DC N0956 02 32 30.4 +44 35 37 2 6.82 1.41 TDM HCo N0957 02 33 21 +57 33.6 2 28.62 46.67 BSV TDM N0958 02 30 42.77 -02 56 20.4 6 0.52 1.15 HCds GSCA CMT HCds SPC HC2m N0959 02 32 23.97 +35 29 39.7 6 1.36 1.53 DC VPS K13 UZC WS CCA N0960 02 31 41.3 -09 18 01 2 0.00 0.71 SPC WS N0961=N1051=I0249 02 41 02.50 -06 56 11.0 4 1.90 1.25 WS GSC HCo SPC N0962 02 32 39.94 +28 04 13.8 6 2.13 3.95 VPS1 UZC WS Pds CCA DC N0963=I1808 02 30 31.1 -04 12 59 3 0.00 1.53 WS K08 SPC N0964=I1814 02 31 05.86 -36 02 04.8 3 1.88 2.00 WS HCds ESOB N0965 02 32 25.1 -18 38 24 3 2.95 1.15 ESOB SPC WS N0966 02 31 47.00 -19 52 54.6 4 1.15 2.28 ESOB HCds SPC WS N0967 02 32 12.820 -17 13 00.55 4 1.69 0.82 KHJ WS SPC ESOB N0968 02 34 06.206 +34 28 47.38 5 1.13 0.45 DC UZC KHJ VPS CCA N0969 02 34 07.96 +32 56 48.0 6 1.04 4.22 DC VPS1 WS UZC CCA HCds N0970 02 34 11.79 +32 58 36.8 5 0.52 2.43 WS HCds VPS1 Pds2 HCo N0970 comp 02 34 10.81 +32 58 30.5 1 HCds N0971 02 34 15.87 +32 58 45.2 3 2.57 1.44 HCo HCds REds N0972 02 34 13.34 +29 18 41.5 8 2.81 3.99 K01 VPS1 WS CCA GHD1 DC K16 UZC N0973 02 34 20.09 +32 30 17.1 8 3.79 4.40 K16 K13 WS UZC VPS1 GSC CCA DC N0974 02 34 25.949 +32 57 15.29 6 2.53 1.35 KHJ HCds CCA VPS1 UZC DC N0975 02 33 22.82 +09 36 06.0 4 1.26 1.25 WS CCA UZC DC N0976 02 33 59.87 +20 58 36.5 5 2.48 1.68 DC WS GH UZC CCA N0977 02 33 03.4 -10 45 35 2 1.04 0.00 WS SPC N0978=N0978A 02 34 47.09 +32 50 43.9 5 2.16 2.77 WS UZC VPS1 CCA DC N0978a=N0978B 02 34 48.0 +32 50 29 3 1.46 1.53 HCo Pds2 WS N0979 02 31 38.6 -44 31 28 2 2.26 0.00 ESOB WS N0980 02 35 18.63 +40 55 34.9 8 1.03 0.67 HCds WS Pds UZC GSC CCA DC VPS N0981 02 32 59.9 -10 58 26 3 0.85 4.00 WS SPC K08 N0982 02 35 24.83 +40 52 09.6 7 1.09 1.04 DC WS VPS UZC GSC CCA HCds N0983=N1002 02 38 55.66 +34 37 20.9 7 2.81 3.36 DC WS HCo UZC GSC CCA VPS N0984 02 34 43.063 +23 24 46.33 4 2.66 0.38 DC UZC KHJ CCA N0985 02 34 37.754 -08 47 16.08 5 1.13 1.62 HCds WM WS EDC K08 N0986 02 33 34.12 -39 02 44.4 3 0.71 2.87 WS ESOB HCds N0986A 02 32 41.8 -39 17 44 3 4.01 1.00 Pds ESOB WS N0987 02 36 49.63 +33 19 36.9 6 1.38 2.41 WS UZC KEB1 CCA VPS1 DC N0988 02 35 27.76 -09 21 24.2 3 5.18 5.29 HCo HC2m WS N0989 02 33 46.039 -16 30 41.52 3 0.13 1.26 SPC WS KHJ N0990 02 36 18.24 +11 38 30.6 4 1.94 1.01 WS UZC CCA DC N0991 02 35 32.7 -07 09 16 4 2.23 4.51 GHD2 WS SPC K08 N0992 02 37 25.48 +21 06 01.3 9 0.90 2.94 JCR WK JCO CCR WS UZC KEBA CCA DC N0993=N0994 02 36 46.02 +02 02 59.7 4 1.35 2.03 SPC WS HCds CCA N0993=N0994 sup * 02 36 45.4 +02 02 58 1 UZC N0994=N0993 02 36 46.02 +02 02 59.7 4 1.35 2.03 SPC WS HCds CCA N0994=N0993 sup * 02 36 45.4 +02 02 58 1 UZC N0995 02 38 32.03 +41 31 44.1 5 1.31 1.95 VPS WS Pds UZC CCA N0996 02 38 39.80 +41 38 50.2 5 2.10 1.68 WS DC VPS GSC CCA N0997=N0997se 02 37 14.418 +07 18 20.77 4 1.06 1.22 Pds UZC GSC KHJ N0997nw 02 37 14.3 +07 18 37 1 HCo N0998 02 37 16.50 +07 20 07.7 5 0.65 1.22 WS Pds UZC GSC Pds2 N0999 02 38 47.511 +41 40 13.98 6 0.80 0.35 KHJ DC UZC GSC VPS CCA N1000 02 38 49.762 +41 27 35.13 2 0.30 0.38 KHJ VPS N1001 02 39 12.64 +41 40 17.2 4 0.68 1.70 WS UZC VPS GSC N1002=N0983 02 38 55.66 +34 37 20.9 7 2.81 3.36 DC WS HCo UZC GSC CCA VPS N1003 02 39 16.61 +40 52 20.0 6 3.01 1.48 GHD1 CCA VPS WS UZC DC N1004 02 37 41.81 +01 58 29.0 5 1.36 0.83 DC WS SPC UZC CCA N1005 02 39 27.61 +41 29 34.8 3 0.58 1.10 WS VPS UZC N1006=N1010 02 37 34.8 -11 01 33 3 0.85 1.00 WS K08 SPC N1007 02 37 52.22 +02 09 18.9 3 0.83 2.03 WS GSC SPC N1008 02 37 55.307 +02 04 45.65 5 0.49 1.10 GSC KHJ SPC UZC CCA N1009 02 38 19.05 +02 18 34.1 5 0.86 0.79 WS GSC SPC UZC CCA N1010=N1006 02 37 34.8 -11 01 33 3 0.85 1.00 WS K08 SPC N1011 02 37 38.884 -11 00 21.10 2 0.21 1.56 SPC KHJ N1012 02 39 14.88 +30 09 05.2 7 1.48 2.68 WS DC GSC UZC HCo CCA VPS1 N1013 02 37 50.474 -11 30 26.58 3 0.08 1.01 GSC KHJ SPC N1014 02 38 00.8 -09 34 22 2 1.05 2.83 WS HC N1015 02 38 11.59 -01 19 07.3 5 0.78 2.22 UZC DC WS SPC CCA N1016 02 38 19.57 +02 07 07.1 6 0.78 1.41 WS SPC UZC GSC DC CCA N1017 02 37 49.9 -11 00 39 3 0.85 0.58 K08 WS SPC N1018 02 38 10.35 -09 32 41.2 4 1.29 2.60 WS GSC SPC HC N1019 02 38 27.44 +01 54 26.1 4 1.12 0.96 UZC WS SPC CCA N1020 02 38 44.1 +02 13 50 3 2.60 1.15 WS UZC SPC N1021 02 38 47.9 +02 13 00 3 1.50 1.00 WS UZC SPC N1022 02 38 32.676 -06 40 39.38 5 1.65 1.16 WS GSCA 2MSP UA20 SPC N1023 02 40 23.98 +39 03 46.5 10 1.96 1.04 DC UZC GSCM CCA HCds HC2m WS VPS GHD1 HCo N1023A 02 40 37.2 +39 03 28 2 5.78 7.78 WS HCo N1024 02 39 11.93 +10 50 49.4 5 2.39 0.42 WS CCA UZC GSC DC N1025 02 36 19.9 -54 51 52 2 0.00 2.12 ESOB WS N1026 02 39 19.223 +06 32 37.88 4 0.88 0.57 DC KHJ UZC CCA N1027=:I1824 02 42 40 +61 35.7 2 50.80 0.00 BSV TDM N1028 02 39 37.1 +10 50 36 4 0.74 1.73 WS Pds UZC HCo N1029 02 39 36.49 +10 47 34.8 5 1.16 1.19 WS Pds UZC GSC CCA N1030 02 39 50.63 +18 01 26.8 5 1.92 2.70 WS DC CCA Pds UZC N1031 02 36 38.7 -54 51 34 2 1.21 2.12 WS ESOB N1032 02 39 23.66 +01 05 35.9 6 1.32 1.05 WS DC UZC SPC CCA HCds N1033 02 40 16.126 -08 46 37.36 3 0.74 1.01 SPC KHJ HC N1034 02 38 13.9 -15 48 34 2 2.04 1.41 WS SPC N1035 02 39 29.04 -08 07 58.1 5 2.32 3.52 GHD2 HCds WS HC2m SPC N1036=I1828 02 40 29.05 +19 17 49.9 6 1.67 2.34 DC WS HCds UZC SDP CCA N1037 02 39 58 -01 44.0 1o Sw5 N1037? 02 37 58.704 -01 50 38.22 3 0.23 0.31 KHJ Pds UZC N1038 02 40 06.32 +01 30 30.6 4 0.60 1.02 SPC UZC WS CCA N1039 02 42 05 +42 45.7 2 23.44 76.37 TDM BSV N1040=N1053 02 43 12.57 +41 30 00.8 7 0.99 1.89 GSC WS Pds VPS UZC CCA DC N1041 02 40 25.241 -05 26 25.45 3 0.78 0.52 Pds KHJ SPC N1042 02 40 23.83 -08 26 01.2 6 2.01 2.18 GHD2 GSC HCds SPC WS HC2m N1043 02 40 46.50 +01 20 33.1 3 0.78 1.56 SPC WS GSC N1044nw 02 41 06.031 +08 44 16.95 5 1.87 1.69 PCR Pds UZC GSC KHJ N1044se 02 41 07.23 +08 44 08.5 2 0.31 2.47 GSC PCR N1045 02 40 29.1 -11 16 41 2 0.00 0.71 WS SPC N1046 02 41 12.771 +08 43 09.54 4 1.37 1.26 Pds UZC GSC KHJ N1047 02 40 32.7 -08 08 49 3 2.57 3.21 GHD2 WS SPC N1048=N1048B 02 40 37.91 -08 32 01.1 6 2.23 1.08 GHD2 Pds SPC WS GSC HC N1048Aa 02 40 35.51 -08 32 50.6 5 2.63 1.74 Pds GHD2 WS GSC SPC N1048Ab 02 40 35.2 -08 33 18 1 HCo N1049 02 39 48.35 -34 15 28.2 2 3.76 2.26 GSC ESOB N1050 02 42 35.58 +34 45 47.3 6 1.36 1.31 DC K01 UZC WS VPS CCA N1051=N0961=I0249 02 41 02.50 -06 56 11.0 4 1.90 1.25 WS GSC HCo SPC N1052 02 41 04.7646 -08 15 20.321 7 0.99 0.93 WS Hee AE DWFo USNO DWFr SPC N1053=N1040 02 43 12.57 +41 30 00.8 7 0.99 1.89 GSC WS Pds VPS UZC CCA DC N1054 02 42 15.77 +18 13 02.5 2 0.30 0.35 UZC GSC N1055 02 41 45.25 +00 26 32.6 9 1.56 3.37 SPC GSC HHKK GH HC2m CCA WS UZC HCds N1056 02 42 48.52 +28 34 26.4 6 1.60 1.36 UZC WS CCA VPS1 KEB1 DC N1057 02 43 02.948 +32 29 28.25 5 0.64 0.61 KHJ HCo GSC VPS1 CCA N1058 02 43 29.92 +37 20 27.9 7 2.25 1.56 GHD1 UZC VPS WS DC K01 CCA N1059: 02 42 35.5 +17 59 45 2 1.01 3.53 WS GSCm N1060 02 43 15.12 +32 25 29.2 7 1.29 1.39 WS VPS1 UZC GSC CCA HCds DC N1061 02 43 15.85 +32 28 00.1 6 0.57 0.77 UZC WS HCds GSC VPS1 K01 N1062 02 43 24.03 +32 27 43.7 1 HCds N1063 02 42 09.8 -05 34 07 3 2.28 0.58 GHD2 WS SPC N1064 02 42 23.39 -09 21 46.6 4 2.72 1.60 HC WS GSC SPC N1065 02 42 06.244 -15 05 30.57 4 0.29 0.90 SPC WS GSC KHJ N1066 02 43 49.961 +32 28 28.88 6 0.51 1.43 UZC KHJ GSC VPS1 Pds CCA N1067 02 43 50.57 +32 30 41.9 5 1.10 2.10 UZC CCA GSC WS VPS1 N1068 02 42 40.689 -00 00 48.14 17 2.24 1.30 DC HC GC SPC JB HHD WU2 CCR vdH+ HC2m EDC RG GH WS WW HCds CCA N1069 02 42 60.0 -08 17 21 3 2.57 1.00 WS SPC HC N1070 02 43 22.26 +04 58 04.7 4 2.16 1.26 WS CCA DC UZC N1071 02 43 08.0 -08 46 28 2 4.19 0.00 WS HC N1072=I1837 02 43 31.22 +00 18 24.6 7 2.88 2.34 DC HC GHD2 WS UZC SPC CCA N1073 02 43 40.48 +01 22 33.1 7 2.96 1.94 GH WS DC SPC UZC CCA GC N1074 02 43 36.0 -16 17 49 2 1.02 1.41 WS SPC N1075 02 43 33.538 -16 12 05.21 3 0.10 1.09 SPC WS KHJ N1076 02 43 29.0 -14 45 17 2 2.05 0.71 WS SPC N1077=N1077A 02 46 00.60 +40 05 23.5 4 0.97 2.14 VPS WS CCA UZC N1077B 02 46 02.9 +40 05 33 2 0.00 0.00 UGCo WS N1078 02 44 08.025 -09 27 09.98 2 0.25 1.99 SPC KHJ N1079 02 43 44.52 -29 00 12.3 4 0.74 1.58 GSCM ESOB WS GHD2 N1080 02 45 09.97 -04 42 39.2 4 1.23 1.45 K08 Pds GSC WS N1081 02 45 05.4 -15 35 16 2 0.00 0.00 SPC WS N1082 02 45 41.243 -08 10 50.53 2 0.23 0.42 KHJ SPC N1082 comp 02 45 42.5 -08 11 00 1 WS N1083 02 45 40.7 -15 21 27 3 0.00 0.00 Pds SPC WS N1084 02 45 59.8 -07 34 38 5 2.25 4.00 GHD2 WS SPC MJC K08 N1085 02 46 25.402 +03 36 24.88 5 2.98 1.66 SPC KHJ UZC CCA DC N1086 02 47 56.29 +41 14 45.5 5 1.44 1.73 DC WS VPS UZC CCA N1087 02 46 25.21 -00 29 55.8 5 1.37 1.88 GH UZC WS SPC CCA N1088 02 47 04.03 +16 11 59.7 5 1.14 1.39 WS HCds GSC CCA UZC N1088 comp 02 47 04.85 +16 12 07.6 2 0.82 1.56 HCo HCds N1089 02 46 10.103 -15 04 25.02 3 1.45 1.45 WS KHJ SPC N1090 02 46 33.96 -00 14 50.4 5 1.25 1.94 GH UZC CCA WS SPC N1091 02 45 22.49 -17 32 01.1 3 2.58 0.00 WS SPC HKA N1092 02 45 29.624 -17 32 32.66 5 1.70 1.58 WS KHJ SPC HKA ESOB N1093 02 48 16.19 +34 25 10.4 5 1.42 1.12 WS SBG1 UZC CCA DC N1094 02 47 27.75 -00 17 06.3 6 3.00 1.96 DC UZC GH SPC WS CCA N1095 02 47 37.79 +04 38 14.6 4 1.47 0.20 WS DC UZC CCA N1096 02 43 49.2 -59 54 48 3 1.14 3.51 ESOB WS Pds N1097 02 46 19.02 -30 16 28.9 5 1.25 0.86 EWSo HHD HC2m vdH+ HCo N1097A 02 46 09.93 -30 13 43.2 5 1.00 1.39 WS GSC HC2m ESOB GHD2 N1098 02 44 53.703 -17 39 34.50 5 0.79 1.18 WS KHJ ESOB SPC HKA N1099 02 45 17.86 -17 42 31.0 4 2.71 1.44 ESOB WS SPC HKA N1100 02 45 35.95 -17 41 18.6 4 3.63 3.97 ESOB WS SPC HKA N1101 02 48 14.835 +04 34 40.37 5 1.11 0.74 Pds KHJ CCA GSC UZC N1102 02 47 12.7 -22 12 31 2 1.96 2.83 SGC WS N1103 02 48 06.0 -13 57 35 2 0.00 0.00 SPC WS N1104 02 48 38.66 -00 16 17.6 5 1.08 0.84 GH UZC WS CCA SPC N1105=I1840 02 43 41.970 -15 42 21.81 3 0.46 1.49 WS KHJ HCds N1106 02 50 40.52 +41 40 18.0 5 0.59 0.89 UZC WS DC VPS CCA N1107 02 49 19.67 +08 05 33.5 4 1.89 0.60 WS UZC CCA DC N1108 02 48 38.5 -07 57 03 2 0.00 0.00 SPC WS N1109?=I1846 02 47 43.59 +13 15 18.8 5 0.71 0.83 WS GSC UZC Pds CCA N1110 02 49 09.5 -07 50 18 2 1.05 0.00 WS SPC N1111?=I1850 02 48 39.2 +13 15 32 2 1.03 2.12 HCo WS N1112?=I1852 02 49 00.36 +13 13 24.4 5 0.39 1.07 WS Pds UZC GSC CCA N1113? 02 50 05.05 +13 19 38.7 1 GSC N1114 02 49 07.1 -16 59 36 3 0.83 4.04 WS SHM SPC N1115 02 50 25.36 +13 15 58.4 2 0.10 0.35 WS GSC N1116 02 50 35.77 +13 20 04.4 5 0.73 1.23 UZC GSC CCA Pds WS N1117: 02 51 13.14 +13 11 07.2 4 0.99 0.98 IPds GSC CCA WS N1118 02 49 58.7 -12 09 51 2 0.00 0.71 WS SPC N1119 02 48 17.08 -17 59 15.8 4 1.35 1.83 SPC WS GSC ESOB N1120=I0261 02 49 04.075 -14 28 15.71 3 0.52 1.76 SPC KHJ GSC N1121 02 50 39.13 -01 44 01.9 6 0.60 2.07 DC UZC SPC WS CCA KEBA N1122=N1123 02 52 51.09 +42 12 17.7 6 2.18 1.51 DC Pds UZC WS VPS CCA N1123=N1122 02 52 51.09 +42 12 17.7 6 2.18 1.51 DC Pds UZC WS VPS CCA N1124 02 51 35.9 -25 42 03 2 0.95 4.24 ESOB WS N1125ne 02 51 40.29 -16 39 03.6 4 2.35 2.78 GSC SPC WS Pds N1125sw 02 51 37.54 -16 39 33.9 2 0.20 0.78 SPC GSC N1126 02 52 18.7 -01 17 46 3 0.87 2.00 UZC SPC WS N1127 02 52 51.895 +13 15 23.37 3 0.99 0.98 KHJ HCo CCA N1128n 02 57 41.56 +06 01 36.7 1 GSC N1128n+s 02 57 41.60 +06 01 28.5 1 GSCm N1128s 02 57 41.63 +06 01 20.8 1 GSC N1129 02 54 27.39 +41 34 45.8 8 0.93 1.03 WS HCds GSC HC2m HCo UZC CCA SBG1 N1130: 02 54 24.44 +41 36 19.9 3 0.80 0.40 GSC SBG1 WS N1130? 02 54 30.42 +41 36 37.8 1 GSC N1131 02 54 33.98 +41 33 31.7 3 0.07 0.64 WS Pds GSC N1132 02 52 51.78 -01 16 29.9 5 2.27 1.80 DC UZC WS SPC CCA N1133 02 52 42.2 -08 48 16 2 0.00 0.71 SPC WS N1134 02 53 41.19 +13 00 52.1 5 1.15 2.05 WS DC UZC GSC CCA N1135 02 50 47.2 -54 55 44 2 0.00 4.95 ESOB WS N1136 02 50 53.8 -54 58 32 2 2.42 4.24 WS ESOB N1137 02 54 02.68 +02 57 42.2 5 3.05 0.93 DC WS SPC UZC CCA N1138 02 56 36.35 +43 02 50.0 5 3.88 1.47 DC WS SBG1 UZC CCA N1139 02 52 46.794 -14 31 46.12 2 0.33 0.79 SPC KHJ N1140 02 54 33.5 -10 01 41 5 1.68 2.95 Pds WS KET2 SPC GHD2 N1141=N1143 02 55 09.72 -00 10 41.4 5 0.86 1.66 GH DC WS SPC CCA N1142=N1144 02 55 12.118 -00 11 01.45 7 1.85 1.79 UZC DC GH SPC AE WS CCA N1143=N1141 02 55 09.72 -00 10 41.4 5 0.86 1.66 GH DC WS SPC CCA N1144=N1142 02 55 12.118 -00 11 01.45 7 1.85 1.79 UZC DC GH SPC AE WS CCA N1145 02 54 33.4 -18 38 09 3 2.84 1.00 ESOB WS SPC N1146 02 57 37 +46 25.6 2 7.34 0.00 BSV TDM N1146? 02 57 36.9 +46 26 15 1 WS N1147 02 55 09 -09 07.2 1o Mu2 N1148 02 57 04.39 -07 41 09.6 3 1.01 0.81 WS HCo GSC N1149 02 57 23.859 -00 18 34.29 3 0.79 1.01 SPC KHJ UZC N1150 02 57 01.327 -15 02 55.05 3 0.78 1.22 SPC WS KHJ N1151 02 57 04.591 -15 00 48.05 3 0.85 1.39 SPC WS KHJ N1152 02 57 33.6 -07 45 33 2 0.00 4.24 SPC WS N1153 02 58 10.41 +03 21 41.8 5 3.46 1.05 WS SPC CCA UZC DC N1154 02 58 07.6 -10 21 49 2 1.04 1.41 WS SPC N1155 02 58 13.0 -10 21 01 3 0.85 2.65 WS KET2 SPC N1156 02 59 42.40 +25 14 16.6 5 3.28 6.06 WS GH CCA DC UZC N1157 02 58 06.60 -15 07 07.9 4 0.70 1.30 SPC WS GSC HCo N1158 02 57 11.454 -14 23 44.41 2 0.03 0.76 SPC KHJ N1159 03 00 46.47 +43 09 44.9 5 2.28 1.22 DC WS UZC SBG1 CCA N1160 03 01 13.37 +44 57 17.4 5 2.73 1.22 UZC WS SBG1 CCA DC N1161 03 01 14.18 +44 53 49.6 5 1.76 0.79 WS UZC SBG1 CCA DC N1162 02 58 55.9 -12 23 55 2 0.00 0.71 WS SPC N1163 03 00 21.9 -17 09 10 3 1.43 2.08 SHM SPC WS N1164 03 01 59.805 +42 35 06.38 5 2.71 2.35 DC KHJ UZC SBG1 CCA N1165 02 58 47.5 -32 05 55 2 3.59 4.95 ESOB WS N1166 03 00 34.99 +11 50 32.7 5 0.78 1.26 WS Pds GSC UZC CCA N1167 03 01 42.333 +35 12 19.43 6 0.94 0.88 SBG1 WS DC AE UZC CCA N1168 03 00 47.03 +11 46 19.7 5 1.27 1.50 WS Pds UZC CCA HCo N1169 03 03 34.78 +46 23 08.2 6 1.56 2.68 SBG1 CCA GHD1 WS UZC DC N1170 03 02 26 +27 04.4 1o CSP N1171 03 03 58.93 +43 23 53.5 5 1.57 2.84 DC SBG1 WS UZC CCA N1172 03 01 36.0 -14 50 11 2 1.02 0.71 GHD2 SPC N1173 03 03 57.7 +42 23 01 1o Big N1174=N1186 03 05 30.86 +42 50 06.1 8 2.29 1.89 GHD1 UZC GSC HCo SBG1 WS CCA DC N1175 03 04 32.48 +42 20 22.4 7 1.74 1.93 WS GSC UZC SBG1 CCA DC GHD1 N1176 03 04 34.9 +42 23 36 1 HCo N1177=I0281 03 04 37.19 +42 21 45.1 3 0.56 1.56 GSC SBG1 WS N1178 03 04 38.82 +42 18 48.5 1 GSC N1179 03 02 38.4 -18 53 54 4 1.83 2.50 GHD2 ESOB WS SPC N1180 03 01 51.040 -15 01 48.98 3 0.04 1.45 KHJ SPC WS N1181 03 01 42.8 -15 03 10 2 0.00 1.41 SPC WS N1182=N1205 03 03 28.5 -09 40 15 3 0.85 3.00 SPC WS KOS N1183 03 04 46.16 +42 22 08.2 1 GSC N1184 03 16 45.14 +80 47 34.5 5 1.12 2.56 DC HCrs WS UZC CCA N1185 03 02 59.4 -09 07 58 3 2.56 2.00 WS SPC KOS N1186=N1174 03 05 30.86 +42 50 06.1 8 2.29 1.89 GHD1 UZC GSC HCo SBG1 WS CCA DC N1187 03 02 37.57 -22 52 03.0 5 1.59 0.98 GHD2 HC2m ESOB WS HCds N1188 03 03 43.42 -15 29 05.5 3 0.25 0.58 GSC SPC WS N1189 03 03 24.30 -15 37 24.1 3 0.93 0.12 WS SPC HKA N1190 03 03 26.10 -15 39 44.1 3 1.82 1.26 WS SPC HKA N1191 03 03 30.893 -15 41 08.33 4 0.95 0.97 KHJ SPC WS HKA N1192 03 03 34.683 -15 40 44.53 4 1.01 0.84 KHJ SPC WS HKA N1193 03 05 55 +44 23.0 1 BSV N1194 03 03 49.20 -01 06 13.6 4 0.91 1.11 CCA WS UZC SPC N1195 03 03 32.829 -12 02 23.04 3 0.77 0.57 GSC KHJ SPC N1196 03 03 35.23 -12 04 34.3 3 0.51 0.58 GSC SPC WS N1197 03 06 14 +44 03.7 1o Sw2 N1198=I0282 03 06 13.19 +41 50 56.5 5 2.86 3.39 DC WS UZC SBG1 CCA N1199 03 03 38.50 -15 36 50.3 5 1.23 2.56 SPC WS Pds HKA GHD2 N1200 03 03 54.53 -11 59 30.8 3 0.51 0.81 WS SPC GSC N1201 03 04 07.9 -26 04 10 2 0.95 1.41 GHD2 WS N1202 03 05 02.47 -06 29 31.7 3 0.82 0.69 SPC HCds WS N1203 03 05 14.15 -14 22 51.2 4 1.21 1.99 WS SPC GSC HCo N1203ne 03 05 14.3 -14 22 36 4 2.37 4.99 WS HCo SPC HCo N1204 03 04 40.02 -12 20 30.2 4 2.77 1.00 SPC WS GSC HCo N1205=N1182 03 03 28.5 -09 40 15 3 0.85 3.00 SPC WS KOS N1206 03 06 09.754 -08 49 59.54 2 0.31 0.17 KHJ SPC N1207 03 08 15.36 +38 22 55.6 7 1.72 1.68 DC UZC HCds SBG1 WS Pds CCA N1208 03 06 11.8 -09 32 28 2 3.14 0.71 WS SPC N1209 03 06 03.0 -15 36 41 2 2.04 0.00 WS SPC N1210 03 06 45.3 -25 43 05 2 0.00 7.07 ESOB WS N1211 03 06 52.44 -00 47 42.3 5 0.91 3.16 UZC WS DC SPC CCA N1212=I1883 03 09 42.35 +40 53 32.9 2 0.32 1.06 WS HCds N1213=I1881 03 09 17.32 +38 38 57.2 4 1.25 2.06 HCds WS SBG1 CCA N1214 03 06 56.02 -09 32 40.7 4 1.46 4.42 HKA SPC WS KOS N1215 03 07 09.60 -09 35 36.4 4 0.84 4.12 HKA SPC WS KOS N1216 03 07 18.53 -09 36 45.8 3 1.67 2.29 WS HKA SPC N1217 03 06 06.3 -39 02 09 2 3.29 0.71 WS ESOB N1217 comp 03 06 05.8 -39 01 15 1 WS N1218 03 08 26.263 +04 06 39.66 5 1.91 2.64 RC2 UZC KHJ CCA DC N1219 03 08 28.04 +02 06 29.2 6 1.12 1.55 K08 UZC CCA WS SPC DC N1220 03 11 40 +53 20.7 2 6.36 16.97 TDM BSV N1221 03 08 15.6 -04 15 35 2 1.06 0.71 SPC WS N1222 03 08 56.8 -02 57 18 3 1.50 2.31 K02 SPC WS N1223 03 08 19.9 -04 08 19 2 0.00 1.41 SPC WS N1224 03 11 13.58 +41 21 47.8 4 0.63 1.75 WS CCA UZC SBG1 N1225 03 08 47.3 -04 06 06 2 0.00 1.41 SPC WS N1226 03 11 05.41 +35 23 11.4 5 1.11 2.13 SBG1 WS UZC DC CCA N1227 03 11 07.74 +35 19 27.8 3 0.86 0.71 SBG1 WS CCA N1228 03 08 11.69 -22 55 22.5 2 0.49 0.07 WS GSC N1229 03 08 10.97 -22 57 38.5 3 1.72 1.50 WS ESOB GSC N1230 03 08 16.24 -22 59 03.3 3 3.04 0.64 ESOB WS GSC N1231 03 06 29.3 -15 34 10 2 0.00 0.00 SPC WS N1232 03 09 45.29 -20 34 46.4 6 1.32 2.58 GSCM ESOB WS GHD2 SPC HC2m N1232A 03 10 01.8 -20 36 01 3 4.21 2.52 GHD2 WS SPC N1233=?N1235 03 12 33.17 +39 19 06.7 5 1.04 1.71 UZC WS SBG1 CCA DC N1234 03 09 39.08 -07 50 47.4 3 1.54 1.22 WS SPC GSC N1235?=N1233 03 12 33.17 +39 19 06.7 5 1.04 1.71 UZC WS SBG1 CCA DC N1236 03 11 28.008 +10 48 29.98 2 0.29 0.21 KHJ GSC N1237 03 10 09.0 -08 41 32 1 GSCm N1238 03 10 52.668 -10 44 52.37 2 0.79 0.88 SPC KHJ N1239 03 10 53.747 -02 33 11.97 2 0.63 1.00 KHJ SPC N1240 03 13 26.7 +30 30 25 1 GSCm N1241 03 11 14.75 -08 55 20.7 4 2.83 1.48 SPC WS GSC GHD2 N1242 03 11 19.34 -08 54 09.6 4 1.33 2.45 GSC SPC WS GHD2 N1243 03 11 25.49 -08 56 44.0 3 1.54 0.87 WS GSCm HCo N1244 03 06 30.6 -66 46 32 2 3.73 2.83 ESOB WS N1245 03 14 42 +47 14.2 2 21.68 12.73 BSV TDM N1246 03 07 01.7 -66 56 16 2 5.36 3.54 ESOB WS N1247 03 12 14.2 -10 28 51 2 2.08 2.12 SPC WS N1248 03 12 48.5 -05 13 29 2 1.06 1.41 WS SPC N1249 03 10 01.18 -53 20 09.9 2 0.82 1.98 WS GSCM N1250 03 15 21.15 +41 21 18.3 6 1.16 0.93 WS UZC SBG1 CCA DC HC N1251 03 14 09.12 +01 27 23.2 2 0.32 0.49 GSC WS N1252: 03 10 44 -57 45.5 1 HCo N1252? 03 10 37.0 -58 10 51 2 11.68 12.02 WS TDM N1253 03 14 09.2 -02 49 22 3 0.86 1.53 K04 SPC WS N1253A 03 14 23.75 -02 48 01.3 4 2.33 2.63 GSC WS Pds SPC N1254 03 14 23.8 +02 40 39 3 0.87 2.08 WS UZC SPC N1255 03 13 31.9 -25 43 29 3 3.40 2.08 ESOB WS GHD2 N1256 03 13 58.3 -21 59 11 2 3.93 1.41 WS ESOB N1257 03 16 59.5 +41 31 44 1 GSCm N1258 03 14 05.1 -21 46 28 2 6.89 0.71 ESOB WS N1259 03 17 17.2 +41 23 09 2 0.80 4.95 HC WS N1260 03 17 27.32 +41 24 18.0 7 1.10 0.96 GSC WS UZC SBG1 CCA DC HC N1261 03 12 15.73 -55 12 57.1 2 4.64 4.81 SW ESOB N1262 03 15 33.6 -15 52 48 2 0.00 1.41 SPC WS N1263 03 15 39.5 -15 05 55 2 0.00 0.00 SPC WS N1264 03 17 59.56 +41 31 12.2 4 1.10 1.67 CCA WS GSC HC N1264 comp 03 18 01.4 +41 32 27 1 HC N1265 03 18 15.76 +41 51 27.6 5 0.59 1.90 HC SBG1 WS UZC CCA N1266 03 16 00.7 -02 25 37 2 0.00 0.71 WS SPC N1267 03 18 44.89 +41 28 03.5 5 0.84 2.18 SBG1 CCA WS UZC HC N1268 03 18 45.24 +41 29 19.2 6 2.24 0.69 DC SBG1 CCA UZC WS HC N1269=N1291 03 17 18.33 -41 06 28.5 5 2.28 2.01 WS HCds GSCM HCo HC2m N1270 03 18 58.20 +41 28 12.4 7 2.87 2.63 HC SBG1 WS UZC CCA DC GHD1 N1271 03 19 11.30 +41 21 10.5 4 0.54 0.93 WS SBG1 HC UZC N1272 03 19 21.30 +41 29 26.1 7 2.63 2.78 HC WS UZC DC SBG1 CCA GHD1 N1273 03 19 26.81 +41 32 24.5 4 3.23 2.05 HC WS SBG1 GHD1 N1274 03 19 40.64 +41 32 56.3 5 1.91 0.83 HC SBG1 HCds WS GHD1 N1275 03 19 48.2341 +41 30 42.078 11 1.75 1.95 WS SBG1 HCds AE AK EDC USNO HC CCA GHD1 DC N1276 03 19 51.2 +41 38 31 1 HC N1277 03 19 51.57 +41 34 24.1 4 1.96 1.44 WS GSC HC GHD1 N1278=I1907 03 19 54.24 +41 33 48.4 8 1.42 1.08 WS GSC SBG1 HCds CCA DC HC GHD1 N1279 03 19 58.93 +41 28 46.6 2 0.96 0.07 HC HCds N1280 03 17 57.09 -00 10 11.2 5 1.05 3.14 WS DC UZC SPC CCA N1281 03 20 06.12 +41 37 46.6 5 2.39 1.63 HC UZC SBG1 WS GHD1 N1282 03 20 12.13 +41 22 01.0 7 1.30 2.05 WS HC DC UZC SBG1 CCA GHD1 N1283 03 20 15.48 +41 23 53.9 4 0.70 1.40 HC WS SBG1 CCA N1284 03 17 45.500 -10 17 20.38 3 0.13 0.25 SPC GSC KHJ N1285 03 17 53.4 -07 17 53 2 0.00 1.41 WS SPC N1286 03 17 48.567 -07 37 01.66 2 0.89 0.94 KHJ SPC N1287 03 18 33.4 -02 43 51 3 1.73 0.00 SPC WS K04 N1288 03 17 13.4 -32 34 36 3 2.52 4.00 WS ESOB GHD2 N1289=I0314 03 18 49.82 -01 58 23.7 5 1.17 1.25 SPC DC UZC WS CCA N1290 03 19 25.186 -13 59 23.07 3 0.26 0.63 KHJ Pds2 SPC N1291=N1269 03 17 18.33 -41 06 28.5 5 2.28 2.01 WS HCds GSCM HCo HC2m N1292 03 18 14.9 -27 36 38 3 3.06 2.08 WS GHD2 ESOB N1293 03 21 36.522 +41 23 33.35 5 1.45 2.31 UZC SBG1 KHJ GHD1 HC N1294 03 21 40.00 +41 21 36.6 6 1.55 1.36 UZC SBG1 WS GHD1 CCA HC N1295 03 20 03.277 -13 59 53.82 2 0.38 0.12 SPC KHJ N1296 03 18 49.7 -13 03 45 2 0.00 0.00 SPC WS N1297 03 19 14.2 -19 06 00 5 3.80 2.19 WS ESOB Pds SPC GHD2 N1298 03 20 13.031 -02 06 49.62 4 1.86 3.64 DC SPC KHJ CCA N1299 03 20 09.7 -06 15 42 3 1.49 2.89 WS SPC K04 N1300 03 19 40.89 -19 24 41.3 8 2.20 2.47 ESOB GC WS GHD2 VPD SPC AAS HC2m N1301 03 20 35.3 -18 42 57 3 0.82 2.89 WS ESOB SPC N1302 03 19 50.9 -26 03 38 4 2.77 2.75 ESOB MJC GHD2 WS N1303 03 20 40.822 -07 23 41.08 2 0.36 1.12 KHJ SPC N1304=N1307 03 21 12.774 -04 35 02.65 2 0.19 0.06 SPC KHJ N1305 03 21 23.08 -02 19 01.5 6 1.13 2.87 WS SPC UZC GHD2 CCA Pds N1306 03 21 03.01 -25 30 45.0 3 0.28 0.50 HCds WS GSC N1307=N1304 03 21 12.774 -04 35 02.65 2 0.19 0.06 SPC KHJ N1308 03 22 28.5 -02 45 26 2 1.06 1.41 WS SPC N1309 03 22 06.40 -15 24 00.7 4 1.26 1.44 WS HCds GHD2 SPC N1310 03 21 03.63 -37 06 07.0 3 2.72 3.00 WS GSC ESOB N1311 03 20 06.7 -52 11 14 2 0.00 1.41 ESOB WS N1312 03 23 41.73 +01 11 04.8 1 GSC N1313 03 18 15.72 -66 29 51.8 5 1.85 4.60 ESOB GC WS HCds HC2m N1313A 03 20 05.4 -66 42 08 3 0.34 0.00 WS ESOB RC2 N1314 03 22 41.14 -04 11 13.2 3 0.95 2.04 WS SPC GSC N1315 03 23 06.577 -21 22 31.20 5 1.71 2.76 ESOB WS GHD2 KHJ HC N1316 03 22 41.676 -37 12 29.76 8 2.56 1.86 WS GC ESOB GMKM EJS EWSo HC2m JJ N1316A 03 23 37.91 -36 54 10.3 2 1.69 5.23 FC GSC N1316B 03 23 39.70 -36 54 28.0 2 1.61 4.81 GSC FC N1316C 03 24 58.4 -37 00 32 3 0.69 3.21 FSs WS ESOB N1317=N1318 03 22 44.39 -37 06 12.0 4 2.57 1.84 WS HC2m FSs ESOB N1318=N1317 03 22 44.39 -37 06 12.0 4 2.57 1.84 WS HC2m FSs ESOB N1319 03 23 56.2 -21 31 39 4 3.48 4.32 HC GHD2 ESOB WS N1320 03 24 48.6 -03 02 32 3 0.86 1.73 SPC WS K04 N1321 03 24 48.7 -03 00 56 3 1.73 0.58 SPC WS K04 N1322 03 24 54.668 -02 55 09.11 2 0.90 0.09 SPC KHJ N1323 03 24 56.047 -02 49 19.33 2 0.70 0.29 SPC KHJ N1324 03 25 01.8 -05 44 44 2 1.06 0.00 WS SPC N1325 03 24 25.2 -21 32 40 3 3.51 3.06 GHD2 HC WS N1325A 03 24 48.3 -21 20 14 3 2.42 2.31 GHD2 ESOB WS N1326 03 23 56.3 -36 27 51 4 1.20 1.73 JJ ESOB RC2 WS N1326A 03 25 08.6 -36 21 51 4 3.26 3.00 ESOB Pds WS FSn N1326B 03 25 19.5 -36 23 01 3 2.51 2.89 ESOB WS FSn N1327: 03 25 23.35 -25 40 47.1 3 3.57 1.10 WS GSC ESOB N1327? 03 24 47.8 -25 38 24 2 1.91 3.54 ESOB GSCm N1328 03 25 39.058 -04 07 29.69 2 0.86 0.14 SPC KHJ N1329 03 26 02.4 -17 35 29 3 3.78 2.65 ESOB WS SPC N1330 03 29 04.2 +41 40 31 1 HCds N1331=I0324 03 26 28.2 -21 21 18 4 0.70 6.24 WS ESOB HC GHD2 N1332 03 26 17.02 -21 20 03.4 4 1.41 1.69 GHD2 WS HC GSCM N1333ne 03 29 19.75 +31 24 56.4 1 GSC N1333sw 03 29 10.44 +31 21 59.7 1 GSC N1334 03 30 01.74 +41 49 56.4 6 1.75 0.92 SBG1 WS UZC GSC CCA HCo N1335 03 30 19.50 +41 34 22.0 3 1.45 1.10 WS SBG1 CCA N1336 03 26 32.0 -35 42 46 2 0.00 3.54 FSn WS N1337 03 28 05.75 -08 23 21.7 4 1.29 2.55 WS GHD2 GSC SPC N1338 03 28 54.4 -12 09 12 2 0.00 0.00 SPC WS N1339 03 28 06.5 -32 17 08 4 0.73 2.22 ESOB WS FSn GHD2 N1340=N1344 03 28 19.49 -31 04 05.4 6 3.89 1.44 ESOB Pds WS HC2m HCds GHD2 N1341 03 27 58.2 -37 08 55 2 0.84 4.95 FSn WS N1342 03 31 38 +37 22.6 3 13.79 30.79 TDM BSV BSV N1343 03 37 49.83 +72 34 16.4 5 0.86 2.06 CCA WS UZC DC HCrs N1344=N1340 03 28 19.49 -31 04 05.4 6 3.89 1.44 ESOB Pds WS HC2m HCds GHD2 N1345 03 29 31.7 -17 46 44 3 1.43 1.15 WS SPC ESOB N1346 03 30 13.22 -05 32 35.5 4 0.52 0.98 GSC SPC K04 WS N1347 03 29 41.78 -22 16 44.7 4 2.93 1.93 HC HCds WS ESOB N1347 comp 03 29 41.18 -22 17 26.9 2 0.88 2.76 HCds WS N1348 03 34 06 +51 24.5 2 19.92 59.40 TDM BSV N1349 03 31 27.516 +04 22 50.73 4 0.70 0.19 GSC KHJ UZC CCA N1350 03 31 08.13 -33 37 42.7 6 2.56 2.01 WS JJ HC2m HCds ESOB GC N1351 03 30 34.9 -34 51 13 3 1.88 1.00 ESOB WS JJ N1351A 03 28 48.5 -35 10 41 3 0.00 0.58 ESOB FC WS N1352 03 31 32.951 -19 16 41.86 3 0.75 0.56 WS KHJ SPC N1353 03 32 03.1 -20 49 06 2 0.00 3.54 GHD2 WS N1354 03 32 29.2 -15 13 18 2 1.02 2.83 WS SPC N1355 03 33 23.5 -04 59 56 3 2.28 3.21 GHD2 WS SPC N1356 03 30 40.72 -50 18 33.5 3 0.66 1.86 ESOB WS HCds N1356 comp 03 30 39.67 -50 19 11.3 1 HCds N1357 03 33 17.2 -13 39 51 3 0.84 2.89 WS GHD2 SPC N1358 03 33 39.657 -05 05 22.75 5 2.22 3.16 GHD2 AE UW WS SPC N1359 03 33 47.8 -19 29 30 3 0.00 2.65 WS GHD2 SPC N1360 03 33 14.66 -25 52 19.3 3 1.09 1.76 GSC UCA1 ESOB N1361 03 34 17.720 -06 15 53.83 2 0.61 0.49 SPC KHJ N1362 03 33 53.010 -20 16 56.41 4 1.32 2.01 ESOB WS KHJ SPC N1363 03 34 49.5 -09 50 33 2 1.04 0.00 WS SPC N1364 03 34 59.0 -09 50 20 2 0.00 1.41 SPC WS N1365 03 33 36.248 -36 08 24.70 5 2.64 1.22 EWSo JJ SJL LHH HC2m N1366 03 33 53.5 -31 11 36 3 2.96 1.00 ESOB GHD2 WS N1367=N1371 03 35 01.30 -24 55 59.3 3 1.44 2.03 WS HC2m GHD2 N1368 03 34 58.878 -15 39 21.44 3 0.71 0.42 WS KHJ GSC N1369 03 36 45.1 -36 15 21 3 1.39 0.00 ESOB Pds WS N1370 03 35 14.5 -20 22 24 3 2.15 2.08 WS SPC ESOB N1371=N1367 03 35 01.30 -24 55 59.3 3 1.44 2.03 WS HC2m GHD2 N1372 03 36 59.740 -15 52 54.91 3 0.72 1.48 WS KHJ SPC N1373 03 34 59.0 -35 10 14 3 2.12 4.16 ESOB FSn WS N1374 03 35 16.7 -35 13 34 3 1.22 0.58 WS ESOB JJ N1375 03 35 16.7 -35 15 57 3 1.41 1.73 ESOB JJ WS N1376 03 37 06.0 -05 02 36 3 1.49 2.31 SPC WS GHD2 N1377 03 36 39.0 -20 54 04 3 0.00 1.73 ESOB Pds WS N1378 03 35 58.2 -35 12 40 1 HCds N1378n 03 35 58.19 -35 12 31.9 1 HCds N1378s 03 35 58.14 -35 12 48.5 1 HCds N1379 03 36 03.9 -35 26 29 2 1.72 0.71 WS JJ N1380 03 36 27.60 -34 58 32.6 4 2.32 1.19 JJ WS HC2m ESOB N1380A 03 36 47.3 -34 44 21 3 1.42 3.61 ESOB FSs WS N1380B=N1382 03 37 08.8 -35 11 41 3 3.24 4.00 ESOB FSn WS N1381 03 36 31.6 -35 17 42 3 2.44 2.65 ESOB JJ WS N1382=N1380B 03 37 08.8 -35 11 41 3 3.24 4.00 ESOB FSn WS N1383 03 37 39.2 -18 20 22 3 0.82 1.00 SPC WS Pds N1384 03 39 13.53 +15 49 09.0 4 0.98 1.60 WS GSC HCo HCds N1385 03 37 28.77 -24 30 07.2 3 2.25 4.00 WS GSCM GHD2 N1386 03 36 46.6 -35 59 57 3 5.28 0.58 JJ ESOB WS N1387 03 36 57.0 -35 30 23 3 1.86 0.58 JJ ESOB WS N1388 03 38 12.047 -15 53 59.27 3 0.87 1.33 KHJ WS SPC N1389 03 37 11.7 -35 44 42 3 0.00 3.06 ESOB FSn WS N1390 03 37 52.1 -19 00 29 4 1.36 1.73 ESOB SPC HC WS N1391 03 38 53.036 -18 21 14.71 4 2.78 3.40 SPC WS KHJ HC N1392 03 37 30.3 -37 08 05 1o Sw6 N1392?? 03 37 47 -36 08.8 2 0.00 4.24 FC ESOB N1393 03 38 38.6 -18 25 40 6 2.94 2.61 WS Pds ESOB SPC GHD2 HC N1394 03 39 06.8 -18 17 33 4 2.13 2.50 ESOB WS SPC GHD2 N1395 03 38 29.66 -23 01 38.8 6 1.38 2.57 MJC ESOB WS HC2m HCds GHD2 N1396 03 38 06.4 -35 26 22 3 1.86 4.04 SHM FSn WS N1397 03 39 47.14 -04 40 13.7 4 2.16 2.14 SPC GSC Pds WS N1398 03 38 52.00 -26 20 14.7 5 2.17 2.23 GHD2 GSCM WS HC2m HCds N1399 03 38 29.07 -35 27 01.2 6 1.98 2.05 WS ESOB HC2m EWSr JJ JMcA N1400 03 39 30.8 -18 41 17 4 2.42 1.50 GHD2 WS SPC HC N1401 03 39 21.8 -22 43 28 3 0.80 2.89 WS ESOB GHD2 N1402 03 39 30.5 -18 31 36 4 1.64 1.73 ESOB WS HC SPC N1403 03 39 10.970 -22 23 19.62 3 3.22 1.50 KHJ WS ESOB N1404 03 38 51.89 -35 35 36.4 5 2.20 1.82 ESOB WS HC2m SP JJ N1405 03 40 18.95 -15 31 51.4 3 1.08 2.03 GSC WS SPC N1406 03 39 23.0 -31 19 19 2 0.90 2.12 WS GHD2 N1407 03 40 11.83 -18 34 48.1 6 2.76 2.34 GHD2 SPC WS GSC QFW HC N1408 03 39 20 -35 31.5 1o JFJS N1408? 03 39 17.3 -35 30 02 1 HCds N1408?? 03 39 39.8 -35 33 11 1 HCds N1409 03 41 10.459 -01 18 08.25 4 0.68 1.75 UZC WM KHJ SPC N1410 03 41 10.74 -01 17 55.9 2 0.32 1.27 SPC WM N1411=:I1943 03 38 44.9 -44 06 01 2 0.00 2.83 ESOB WS N1412=I1981 03 40 29.1 -26 51 42 2 2.83 2.83 ESOB WS N1413 03 40 11.538 -15 36 39.65 4 0.30 1.37 WS SPC KHJ GSC N1414 03 40 56.9 -21 42 48 3 0.80 1.00 ESOB Pds WS N1415=I1983 03 40 56.9 -22 33 50 3 0.00 2.08 ESOB GHD2 WS N1416 03 41 02.852 -22 43 08.84 4 1.19 1.63 ESOB WS KHJ GHD2 N1417 03 41 57.4 -04 42 21 3 2.59 1.73 SPC WS GHD2 N1418 03 42 16.2 -04 43 54 3 2.28 2.31 SPC WS GHD2 N1419 03 40 42.0 -37 30 37 2 0.84 5.66 FSn WS N1420 03 42 39.9 -05 51 09 2 2.11 0.00 HCm WS N1421 03 42 29.4 -13 29 19 3 0.84 2.89 SPC WS GHD2 N1422 03 41 31.4 -21 40 51 2 1.97 1.41 WS GHD2 N1423 03 42 40.1 -06 22 55 2 0.00 0.71 WS SPC N1424 03 43 13.99 -04 43 50.2 6 1.51 2.36 SPC GSC Pds WS HCrs GHD2 N1425=?I1988 03 42 11.41 -29 53 37.7 6 2.61 2.12 ESOB GSCM GHD2 WS HC2m HCds N1426 03 42 49.1 -22 06 33 3 4.01 4.00 GHD2 ESOB WS N1427 03 42 19.3 -35 23 35 3 2.82 0.00 JJ WS ESOB N1427A 03 40 09.2 -35 37 26 3 4.27 12.90 WS FSn ESOB N1428 03 42 22.8 -35 09 12 3 2.12 2.52 FSs ESOB WS N1429 03 44 04 -04 43.1 1o Le2 N1429? 03 44 00.3 -04 42 53 1 WS N1430 03 43 25.2 -18 13 30 1 HC N1431 03 44 40.831 +02 50 05.02 4 0.79 0.99 KHJ SPC UZC CCA N1432 03 45 49.53 +24 22 06.1 1 SAO N1433 03 42 01.36 -47 13 19.0 6 1.98 1.56 ESOB GC WS GSCM HC2m HCds N1434? 03 46 12.8 -09 40 58 2 0.00 2.83 SPC WS N1435 03 46 10 +23 45.9 1 HCos N1436=N1437 03 43 36.9 -35 51 15 3 1.85 2.31 AM JJ WS N1437=N1436 03 43 36.9 -35 51 15 3 1.85 2.31 AM JJ WS N1437A 03 43 02.0 -36 16 15 2 3.41 6.36 FSn ESOB N1437B 03 45 54.7 -36 21 27 2 0.00 4.24 ESO FSn N1438 03 45 17.1 -23 00 09 2 0.00 0.71 ESOB WS N1439 03 44 49.9 -21 55 13 3 2.41 2.31 GHD2 WS Pds N1440=N1442 03 45 02.8 -18 15 58 4 2.46 2.65 GHD2 HC WS SPC N1441 03 45 43.07 -04 05 31.4 5 0.74 1.48 WS GSC Pds SPC GHD2 N1442=N1440 03 45 02.8 -18 15 58 4 2.46 2.65 GHD2 HC WS SPC N1443 03 45 53.1 -04 03 09 2 1.06 0.00 HCo WS N1444 03 49 25 +52 39.5 2 38.74 16.97 TDM BSV N1445 03 44 56.15 -09 51 20.9 3 0.09 1.44 GSC SPC WS N1446? 03 45 57.46 -04 06 43.8 1 GSC N1447 03 45 47.155 -09 01 07.94 2 0.19 0.88 KHJ SPC N1448=N1457 03 44 31.82 -44 38 41.3 7 2.78 2.86 WS PEES HCds HC2m ESOB GC HCds N1449 03 46 02.95 -04 08 20.2 4 2.95 3.59 GHD2 GSC WS SPC N1450 03 45 36.5 -09 14 05 2 1.05 2.12 WS SPC N1450 comp 03 45 36.2 -09 13 59 1 WS N1451 03 46 07.05 -04 04 12.1 4 2.27 3.72 GHD2 SPC WS GSC N1452=N1455 03 45 22.13 -18 38 01.7 6 3.34 2.63 GHD2 ESOB HC WS GSC SPC N1453 03 46 27.11 -03 58 11.4 4 2.97 3.67 GHD2 GSC SPC WS N1454 03 45 59.38 -20 39 07.8 2 0.89 0.78 GSC HCds N1455=N1452 03 45 22.13 -18 38 01.7 6 3.34 2.63 GHD2 ESO HC WS GSC SPC N1456 03 48 08.30 +22 33 29.3 2 0.88 2.33 GSC WS N1457=N1448 03 44 31.82 -44 38 41.3 7 2.78 2.86 WS PEES HCds HC2m ESOB RC2 HCds N1458 03 46 58 -18 14.5 1o Le2 N1458? 03 46 60.0 -18 14 59 1 WS N1459 03 46 58.0 -25 31 20 2 1.91 2.83 WS ESOB N1460 03 46 13.8 -36 41 45 3 3.86 3.21 WS FSn ESOB N1461 03 48 27.1 -16 23 34 3 0.83 1.00 SPC WS GHD2 N1462n 03 50 24.4 +06 58 36 1 HCo N1462s 03 50 23.5 +06 58 21 3 0.86 0.58 WS HCo UZC N1463 03 46 15.6 -59 48 36 2 1.06 3.54 WS ESOB N1464=N1471 03 51 24.5 -15 24 09 2 0.00 0.00 SPC WS N1465 03 53 31.99 +32 29 32.3 4 1.16 1.30 WS BPP UZC CCA N1466 03 44 32.9 -71 40 16 2 3.31 1.41 AH ESOB N1467 03 51 52.748 -08 50 17.43 3 0.77 0.51 SPC GSC KHJ N1468 03 52 12.575 -06 20 57.22 2 0.20 1.17 KHJ SPC N1469 04 00 27.80 +68 34 39.0 5 0.99 1.51 GHD1 WS DC UZC CCA N1470 03 52 09.80 -08 59 58.8 3 0.51 2.76 GSC SPC WS N1471=N1464 03 51 24.5 -15 24 09 2 0.00 0.00 SPC WS N1472 03 53 47.334 -08 34 07.22 2 0.28 1.03 SPC KHJ N1473 03 47 26.2 -68 13 15 2 0.39 0.00 ESOB WS N1474=I2002 03 54 30.34 +10 42 23.8 3 0.77 0.45 UZC GSC CCA N1475 03 53 49.75 -08 08 15.3 1 GSC N1476 03 52 08.7 -44 31 55 2 3.02 2.12 WS ESOB N1477 03 54 02.846 -08 34 30.36 2 0.77 0.78 SPC KHJ N1478 03 54 07.334 -08 33 20.35 2 0.14 1.20 SPC KHJ N1479 03 54 20 -10 12.5 1o Mu2 N1480 03 54 32 -10 15.5 1o Mu2 N1481 03 54 29.076 -20 25 38.37 4 3.83 1.02 WS KHJ SPC ESOB N1482 03 54 39.1 -20 30 10 4 3.11 2.38 WS SPC GHD2 ESOB N1483 03 52 47.7 -47 28 41 2 0.71 3.54 WS ESOB N1484 03 54 17.6 -36 58 15 2 3.38 2.12 WS ESOB N1485 04 05 03.85 +70 59 47.6 6 2.04 3.38 WS UZC HCrs GHD1 CCA DC N1486 03 56 18.8 -21 49 15 2 0.00 1.41 ESOB WS N1487 03 55 45.19 -42 22 05.1 2 2.66 0.49 WS GSC N1487m 03 55 45.1 -42 22 14 1 HCo N1487ne 03 55 47.09 -42 22 06.2 2 1.25 0.92 HCo HCds N1487nw 03 55 44.83 -42 22 02.9 2 1.80 0.64 HCo HCds N1487s 03 55 45.0 -42 22 30 1 HCo N1488 04 00 04.3 +18 34 02 1 GSCm N1489 03 57 38.1 -19 13 02 2 0.00 1.41 SPC WS N1490 03 53 34.3 -66 01 04 2 0.86 3.54 WS ESOB N1491 04 03 13.6 +51 18 57 1 HCo N1492 03 58 13.4 -35 26 46 2 5.18 0.00 WS ESOB N1493 03 57 27.6 -46 12 40 2 1.46 3.54 WS ESOB N1494 03 57 42.6 -48 54 31 2 1.39 5.66 WS ESOB N1495 03 58 21.20 -44 27 57.9 3 1.45 1.69 HCds ESOB WS N1496 04 04 32 +52 39.7 2 6.45 4.24 BSV TDM N1497 04 02 06.908 +23 07 58.21 4 1.40 1.16 UZC KHJ CCA DC N1498 04 00 19.4 -12 01 11 2 0.00 0.71 GSCm WS N1499 04 03 14 +36 22.0 1 HCo N1500 03 58 14.0 -52 19 42 2 0.65 1.41 WS ESOB N1501 04 06 59.345 +60 55 14.48 4 0.73 1.01 BASm UJ10 UB10 CK N1502 04 07 50 +62 19.9 2 14.84 0.00 BSV TDM N1503 03 56 33.3 -66 02 26 2 0.43 2.12 ESOB WS N1504 04 02 29.665 -09 20 08.54 2 0.69 1.63 SPC KHJ N1505 04 02 36.371 -09 19 21.93 2 0.59 1.68 SPC KHJ N1506 04 00 21.8 -52 34 25 2 2.57 0.00 WS ESOB N1507 04 04 27.2 -02 11 19 6 1.13 2.59 UZC SPC WS GHD2 DC KET2 N1508 04 05 47.692 +25 24 30.07 4 0.67 0.41 KHJ GSC Pds UZC N1509=I2026 04 03 55.243 -11 10 43.79 4 1.22 0.67 HCds KHJ GSC KET2 N1509=I2026 comp 04 03 50.50 -11 10 50.6 1 HCds N1510 04 03 32.56 -43 24 00.6 3 0.82 0.75 ESOB WS HC2m N1511 03 59 36.3 -67 38 06 2 4.41 0.00 ESOB WS N1511A 04 00 19.4 -67 48 27 2 0.80 0.00 ESOB WS N1511B 04 00 54.5 -67 36 42 3 0.66 1.53 ESOB WS Pds N1512 04 03 54.25 -43 20 58.0 5 2.32 2.58 WS HC2m GSCM HCds ESOB N1513 04 09 57 +49 30.9 2 34.52 8.49 BSV TDM N1514 04 09 16.945 +30 46 33.30 5 0.65 0.18 CK PPM UJ10 GSC Ty2 N1515 04 04 03.0 -54 06 01 3 7.91 9.02 WS ESOB RC2 N1515A 04 03 50.5 -54 06 52 2 5.58 5.66 WS ESOB N1516n=N1524 04 08 07.5 -08 49 47 3 1.71 0.00 HCo SPC WS N1516s=N1525 04 08 08.2 -08 50 07 3 0.86 1.53 HCo WS SPC N1517 04 09 11.86 +08 38 53.9 4 2.18 1.53 DC CCA WS UZC N1518 04 06 49.0 -21 10 44 3 0.81 2.52 MJC GHD2 WS N1519 04 08 07.6 -17 11 34 3 5.16 1.15 WS ESOB SPC N1520 03 57 31.4 -76 50 00 4 1.71 3.00 BSV HCe SAO TDM N1521 04 08 18.9 -21 03 07 3 2.42 1.53 WS ESOB GHD2 N1522 04 06 07.6 -52 40 11 2 0.00 0.00 ESOB WS N1523 04 06 10.7 -54 05 19 3 2.53 3.79 ESOB HCds WS N1524=N1516n 04 08 07.4 -08 49 47 2 2.10 0.00 HCo SPC N1525=N1516s 04 08 08.2 -08 50 08 2 1.05 1.41 HCo SPC N1526 04 05 12.0 -65 50 26 2 2.59 1.41 ESOB WS N1527 04 08 24.2 -47 53 49 2 2.13 0.00 WS ESOB N1528 04 15 23 +51 12.9 2 66.62 16.97 BSV TDM N1529 04 07 19.6 -62 53 59 2 2.41 0.00 ESOB WS N1530 04 23 26.95 +75 17 42.5 7 0.82 3.24 GHD1 UZC RD WS K14 CCA HCrs N1530A=I0381 04 44 28.95 +75 38 22.3 6 3.37 2.36 HCrs WS UZC CCA DC GHD1 N1531 04 11 59.23 -32 51 01.5 4 1.24 3.40 WS HC2m ESOB GHD2 N1532 04 12 04.27 -32 52 25.8 3 0.38 4.01 ESOB HCds HC2m N1533 04 09 51.6 -56 07 09 4 2.41 5.20 ESOB RC2 Pds WS N1534 04 08 45.9 -62 47 48 3 2.46 2.89 ESOB Pds WS N1535 04 14 15.76 -12 44 21.7 5 0.91 0.52 GSC SL Ty2 CK BASm N1536 04 11 00.7 -56 29 08 3 3.34 8.08 WS ESOB RC2 N1537 04 13 40.8 -31 38 44 3 1.28 2.31 WS GHD2 ESOB N1538?=I2047 04 14 56.136 -13 11 30.22 2 1.09 0.03 KHJ HCds N1538?? 04 15 05.14 -13 13 55.3 1 HCds N1538??=I2045 04 14 36.058 -13 10 30.67 3 0.71 0.89 KHJ HCds SPC N1539? 04 19 01.98 +26 49 36.8 4 0.77 1.18 Pds WS HCo GSC N1539? comp 04 19 02.7 +26 49 43 1 WS N1540n 04 15 10.28 -28 28 46.2 3 2.02 1.59 GSC WS HCds N1540n+s 04 15 10 -28 29.0 1 ESOB N1540s 04 15 10.55 -28 29 19.9 2 1.30 1.06 HCds GSC N1540w 04 15 09.70 -28 28 56.8 2 0.09 2.40 GSC HCds N1541 04 17 00.21 +00 50 05.2 4 1.01 0.83 WS UZC SPC CCA N1542 04 17 14.19 +04 46 54.0 4 1.04 0.92 WS GSC UZC CCA N1543 04 12 43.08 -57 44 15.2 3 0.78 1.40 GSCM ESOB WS N1544 05 02 34.430 +86 13 18.27 6 3.11 3.45 DC HCrs UZC GSC KHJ CCA N1545 04 20 57 +50 15.2 2 13.60 8.49 BSV TDM N1546 04 14 36.71 -56 03 38.6 4 0.63 0.60 ESOB RC2 WS HCds N1547 04 17 12.4 -17 51 26 3 1.65 3.06 ESOB WS SPC N1548 04 21 13.4 +36 55 01 3 128.06 3.21 TDM BSV WS N1549 04 15 45.04 -55 35 31.2 3 0.68 0.90 ESOB WS HC2m N1550=N1551 04 19 38.05 +02 24 34.4 5 1.92 1.83 SPC GSC CCA WS DC N1551=N1550 04 19 38.05 +02 24 34.4 5 1.92 1.83 SPC GSC CCA WS DC N1552 04 20 17.60 -00 41 35.1 5 1.11 0.53 DC WS SPC UZC CCA N1553 04 16 10.45 -55 46 48.9 3 1.27 1.76 ESOB HC2m WS N1554 04 21 43.55 +19 31 14.1 1 GSC N1555 04 21 56.8 +19 32 03 1 HCo N1556 04 17 45.0 -50 09 50 3 3.87 1.53 Pds WS ESOB N1557 04 13 14 -70 30.5 1 HChw N1557 * 04 13 14.70 -70 25 16.5 1 SAO N1558 04 20 15.9 -45 01 53 2 2.24 0.71 WS ESOB N1559 04 17 36.8 -62 47 03 3 3.44 0.00 GC WS ESOB N1560 04 32 48.07 +71 52 47.0 5 2.10 6.81 CCA HCds HCo WS GSCM N1561 04 23 01.060 -15 50 46.15 4 0.58 3.10 WS SPC KHJ GSC N1562 04 21 47.639 -15 45 19.83 2 0.46 0.28 KHJ GSC N1563 04 22 53.906 -15 43 59.45 4 0.73 2.70 WS SPC KHJ GSC N1564 04 23 00.902 -15 44 22.19 4 1.47 3.16 SPC WS KHJ GSC N1565 04 23 23.57 -15 44 40.2 3 1.50 2.01 GSC SPC WS N1566 04 20 00.51 -54 56 16.8 6 1.50 1.21 ESOB GC HC2m WS WMe HCds N1567 04 21 08.7 -48 15 17 2 0.00 2.12 ESOB WS N1568nw 04 24 20.64 -00 44 19.0 3 1.04 0.58 SPC WS CCA N1568se 04 24 25.34 -00 44 47.4 4 0.96 0.51 UZC WS SPC CCA N1569 04 30 49.04 +64 50 53.0 3 2.49 2.51 UZC WS CCA N1570=N1571 04 22 08.9 -43 37 46 3 1.25 3.06 ESOB Pds WS N1571=N1570 04 22 08.9 -43 37 46 3 1.25 3.06 ESOB Pds WS N1572 04 22 42.6 -40 36 01 2 1.61 5.66 ESOB WS N1573 04 35 03.52 +73 15 46.0 5 3.80 1.23 DC HC UZC WS CCA N1573A 04 48 26.93 +73 28 09.3 3 1.25 1.00 HCo UZC CCA N1574 04 21 58.9 -56 58 27 3 2.35 1.73 WS ESOB RC2 N1575=N1577 04 26 20.5 -10 05 55 3 2.26 2.00 Pds2 WS SPC N1576 04 26 18.7 -03 37 17 2 2.12 1.41 WS SPC N1577=N1575 04 26 20.5 -10 05 55 3 2.26 2.00 Pds2 WS SPC N1578 04 23 46.7 -51 35 58 2 0.00 2.12 ESOB WS N1579 04 30 14.21 +35 16 46.8 1 GSC N1580 04 28 18.5 -05 10 46 2 1.06 0.71 WS SPC N1581 04 24 45.2 -54 56 30 3 2.76 3.00 WS Pds ESOB N1582 04 31 53 +43 49.0 2 99.67161.22 HCe TDM N1583 04 28 20.608 -17 35 45.03 4 3.92 1.95 ESOB WS KHJ SPC N1584 04 28 10.259 -17 31 25.62 4 0.67 1.61 WS KHJ ESOB SPC N1585 04 27 33.0 -42 09 54 2 0.78 1.41 WS ESOB N1586 04 30 38.18 -00 18 16.6 6 1.20 2.35 DC Pds UZC WS SPC CCA N1587 04 30 39.93 +00 39 42.2 6 2.59 1.33 DC UZC CCA WS GH SPC N1588 04 30 43.839 +00 39 53.34 6 1.58 1.75 UZC KHJ KET1 CCA DC SPC N1589 04 30 45.53 +00 51 48.8 5 3.73 2.13 CCA WS UZC SPC DC N1590 04 31 10.31 +07 37 51.3 6 1.79 2.09 WS UZC K02 K10 CCA MB N1591 04 29 30.7 -26 42 47 2 0.00 0.71 ESOB WS N1592 04 29 40.53 -27 24 30.8 3 4.61 0.11 HCds ESOB WS N1592 e knot 04 29 41.30 -27 24 32.0 1 HCds N1592 m knot 04 29 40.29 -27 24 27.4 1 HCds N1592 w knot 04 29 38.36 -27 24 25.4 1 HCds N1593=N1608=I2077 04 32 06.126 +00 34 01.93 6 0.85 1.36 CCA HCds UZC KHJ Pds SPC N1594=I2075 04 30 51.646 -05 47 53.89 3 1.02 1.00 KHJ Pds SPC N1595 04 28 21.7 -47 48 56 3 1.16 1.15 WS ESOB Pds N1596 04 27 37.8 -55 01 36 4 0.86 0.00 ESOB RC2 Pds2 WS N1597 04 31 13.461 -11 17 26.00 2 0.01 0.78 KHJ SPC N1598 04 28 33.6 -47 46 55 2 2.84 4.95 WS ESOB N1599=?N1610 04 31 38.87 -04 35 19.9 4 2.77 1.12 GSC WS SPC GHD2 N1600 04 31 39.9 -05 05 15 2 0.00 0.71 WS SPC N1601 04 31 41.819 -05 03 37.96 3 1.41 5.03 KHJ Pds SPC N1602 04 27 53.9 -55 03 25 3 3.96 0.00 ESOB RC2 WS N1603 04 31 50.044 -05 05 39.84 4 2.63 3.56 Pds KHJ SPC GHD2 N1604 04 31 58.573 -05 22 13.12 2 0.03 1.82 KHJ SPC N1605 04 34 53 +45 16.2 2 14.96 4.24 BSV TDM N1606 04 32 03.440 -05 01 55.76 3 2.61 2.66 KHJ SPC GHD2 N1607 04 32 03.09 -04 27 38.0 3 1.02 1.62 GSC SPC WS N1608=N1593=I2077 04 32 06.126 +00 34 01.93 6 0.85 1.36 CCA HCds UZC KHJ Pds SPC N1609 04 32 45.119 -04 22 23.12 2 0.75 3.39 KHJ SPC N1610 04 32 44 -04 34.9 1o Le2 N1610?=N1599 04 31 38.87 -04 35 19.9 4 2.77 1.12 GSC WS SPC GHD2 N1610?=N1619? 04 34 13.843 -04 41 59.03 2 0.59 0.14 GSC KHJ N1611 04 33 05.93 -04 17 51.0 3 1.50 1.90 WS GSC SPC N1612 04 33 13.129 -04 10 21.50 3 0.60 1.66 GSC KHJ SPC N1613 04 33 25.338 -04 15 56.26 3 0.38 1.73 GSC KHJ SPC N1614 04 33 59.99 -08 34 45.5 7 1.20 1.33 WS SPC CCR HHKK GHD2 vdH+ CCO N1615 04 36 01.87 +19 57 02.2 4 1.33 1.67 GH WS UZC CCA N1616 04 32 41.7 -43 42 55 3 2.86 0.00 ESOB Pds WS N1617 04 31 39.48 -54 36 06.1 4 0.61 1.89 GSCM ESOB RC2 WS N1618 04 36 06.6 -03 08 57 3 1.50 1.53 GHD2 WS SPC N1619 04 36 11 -04 49.9 1o Sw6 N1619?=N1610? 04 34 13.843 -04 41 59.03 2 0.59 0.14 GSC KHJ N1619?? 04 35 51.79 -04 21 58.7 1 GSC N1620 04 36 37.30 -00 08 38.1 6 1.27 1.91 GH SPC WS UZC CCA DC N1621=N1626 04 36 25.028 -04 59 15.32 3 0.70 1.84 GSC SPC KHJ N1622 04 36 36.524 -03 11 20.69 3 2.69 0.82 GHD2 SPC KHJ N1623 04 35 32.29 -13 33 23.3 2 2.16 1.13 WS GSC N1624 04 40 36 +50 27.7 1 BSV N1625 04 37 06.3 -03 18 15 2 0.00 0.71 WS SPC N1626=N1621 04 36 25.028 -04 59 15.32 3 0.70 1.84 GSC SPC KHJ N1627 04 37 38.0 -04 53 19 2 0.00 1.41 WS SPC N1628 04 37 36.2 -04 42 59 2 2.11 2.12 WS SPC N1629 04 29 36.1 -71 50 17 3 4.77 0.58 HChw KMHA ESOB N1630 04 37 15.434 -18 54 07.15 4 1.24 1.18 ESOB WS KHJ SPC N1631 04 38 24.2 -20 38 59 3 0.81 4.36 ESOB WS SPC N1632=I0386 04 39 58.619 -09 27 22.28 2 0.76 0.21 KHJ SPC N1633 04 40 09.10 +07 20 56.4 2 0.53 0.42 WS CCA N1634 04 40 09.8 +07 20 18 2 1.05 0.71 WS KEBA N1635 04 40 07.94 -00 32 51.6 6 2.46 0.93 UZC SPC WS CCA GH DC N1636 04 40 40.2 -08 36 28 2 0.00 1.41 SPC WS N1637 04 41 28.14 -02 51 28.3 7 3.57 1.95 HC GHD2 UZC WS SPC HHKK GC N1638 04 41 36.36 -01 48 32.6 7 2.07 0.98 DC GHD2 HC WS UZC CCA SPC N1639 04 40 52.3 -16 59 28 2 1.01 2.12 HCds WS N1640 04 42 14.4 -20 26 06 4 2.11 1.50 ESOB GHD2 SPC WS N1641: 04 35 38 -65 46.1 2 34.69 25.46 HChw ESOB N1641? 04 36 05 -65 46.9 1 AH N1642 04 42 54.85 +00 37 06.3 7 3.14 2.41 DC GH Pds WS SPC CCA UZC N1643 04 43 44.0 -05 19 09 2 1.06 0.71 WS SPC N1644 04 37 39.2 -66 11 53 3 3.19 4.58 HChw KMHA ESOB N1645 04 44 06.423 -05 27 56.59 2 0.78 0.59 KHJ SPC N1646n 04 44 23.52 -08 31 54.5 4 0.30 0.57 GSC HCo WS SPC N1646s 04 44 23.8 -08 32 06 1 HCo N1647 04 45 55 +19 06.9 3 0.00 81.90 TDM BSV BSV N1648 04 44 34.778 -08 28 44.53 3 0.33 1.32 GSC SPC KHJ N1649:=N1652 04 38 22.47 -68 40 21.3 4 2.29 1.39 HChw HCds AH ESOB N1649? 04 38 06.94 -68 46 40.4 3 0.60 0.85 AH HCds ESOB N1650 04 45 11.46 -15 52 12.9 2 0.61 1.27 WS GSC N1651 04 37 32.13 -70 35 06.2 4 2.31 3.26 HChw KMHA HCds ESOB N1652=:N1649 04 38 22.47 -68 40 21.3 4 2.29 1.39 HChw HCds AH ESOB N1653 04 45 47.39 -02 23 33.9 5 1.71 2.95 UZC SPC CCA WS DC N1654 04 45 48.53 -02 05 01.6 6 3.50 1.83 UZC WS GSC SPC CCA DC N1655 04 47 11 +20 55.4 1o JGL N1656 04 45 53.3 -05 08 12 3 0.86 1.53 Pds WS SPC N1657 04 46 07.24 -02 04 37.8 5 0.81 0.56 GSC UZC CCA SPC WS N1658 04 44 01.0 -41 27 49 2 1.59 1.41 ESOB WS N1659=N1677 04 46 30.02 -04 47 20.9 4 3.21 2.49 HCds GHD2 SPC WS N1660 04 44 11.0 -41 29 51 2 2.38 3.54 ESOB WS N1661 04 47 07.70 -02 03 16.6 5 2.22 2.39 UZC CCA SPC WS DC N1662 04 48 27 +10 56.2 2 20.83 33.94 TDM BSV N1663 04 49 21 +13 09.0 2 41.33 8.49 TDM HCe N1663 core 04 49 20 +13 09.9 1 HCe N1664 04 51 06 +43 40.5 2 23.05 4.24 BSV TDM N1665 04 48 17.120 -05 25 39.85 2 0.97 0.65 KHJ SPC N1666 04 48 32.833 -06 34 12.58 3 0.75 0.79 GHD2 KHJ SPC N1667=N1689 04 48 37.080 -06 19 12.78 5 1.23 1.36 GHD2 SPC WS AE UW N1668 04 46 05.9 -44 43 58 2 0.00 1.41 ESOB WS N1669 04 43 00.6 -65 48 50 3 3.54 3.46 WS HChw ESOB N1670 04 49 42.61 -02 45 38.2 4 1.43 1.35 UZC GSC WS SPC N1671?=I0395 04 49 33.93 +00 15 11.1 5 2.19 2.00 WS DC UZC GSC CCA N1672 04 45 42.48 -59 14 52.7 5 2.68 2.76 GC ESOB HC2m WS HCds N1673 04 42 39.2 -69 49 09 3 2.58 6.11 HChw KMHA ESOB N1674 04 52 24 +23 54.5 1o JGL N1674/75?? 04 52 24.6 +23 51 13 1 HCo N1675 04 52 24 +23 54.5 1o JGL N1676 04 43 53.3 -68 49 37 3 4.36 3.46 AH HChw ESOB N1677=N1659 04 46 30.02 -04 47 20.9 4 3.21 2.49 HCds GHD2 SPC WS N1678 04 51 35.4 -02 37 24 3 1.73 0.58 UZC WS SPC N1679 04 49 55.02 -31 57 58.7 3 5.25 5.30 HCds ESOB WS N1680 04 48 33.6 -47 49 01 2 1.42 0.00 ESOB WS N1681 04 51 50.1 -05 48 12 2 0.00 0.71 WS SPC N1682 04 52 19.814 -03 06 20.61 2 0.47 0.74 KHJ SPC N1683 04 52 17.613 -03 01 27.82 2 0.29 1.27 KHJ SPC N1684 04 52 31.1 -03 06 21 2 0.00 0.71 SPC WS N1685 04 52 34.264 -02 56 58.06 4 0.74 1.37 WS AE UW SPC N1686 04 52 54.7 -15 20 48 3 1.67 4.00 SPC Pds WS N1687 04 51 21.4 -33 56 20 2 6.15 2.83 WS ESOB N1688 04 48 23.4 -59 48 01 2 1.06 0.71 ESOB WS N1689=N1667 04 48 37.080 -06 19 12.78 5 1.23 1.36 GHD2 SPC WS AE UW N1690 04 54 19.37 +01 38 25.0 6 2.67 1.92 GSC CCA SPC WS UZC MB N1691 04 54 38.33 +03 16 04.7 7 0.85 2.99 WS Pds SPC UZC KET2 DC CCA N1692 04 55 23.687 -20 34 16.69 5 0.68 0.88 ESOB SPC EWSr KHJ WS N1693 04 47 39.3 -69 20 35 2 4.10 2.12 ESOB KMHA N1694 04 55 16.802 -04 39 11.55 2 0.35 2.73 SPC KHJ N1695 04 47 44.7 -69 22 26 2 1.12 1.41 ESOB KMHA N1696 04 48 30.3 -68 14 33 3 3.56 1.15 KMHA ESOB HChw N1697 04 48 36.6 -68 33 33 3 1.89 4.58 ESOB HChw KMHA N1698 04 49 04.0 -69 06 52 3 2.66 3.21 HChw KMHA ESOB N1699 04 56 59.5 -04 45 24 3 2.99 4.36 GHD2 WS SPC N1700 04 56 56.3 -04 51 54 4 1.88 3.00 WS GHD2 SPC HC N1701 04 55 51.0 -29 53 01 2 2.76 1.41 ESOB WS N1702 04 49 27.1 -69 51 05 3 5.35 4.62 KMHA ESOB HChw N1703 04 52 51.9 -59 44 34 2 0.00 2.12 ESOB WS N1704 04 49 55.5 -69 45 18 3 0.00 3.79 HChw ESOB KMHA N1705 04 54 14.0 -53 21 42 3 4.50 2.31 ESOB WS RC2 N1706 04 52 31.1 -62 59 09 2 0.00 2.83 ESOB WS N1707=I2107 04 58 20.7 +08 14 18 2 0.00 0.71 HCds WS N1708 05 03 27 +52 50.0 2 70.60 8.49 HCo TDM N1709=?N1717 04 58 44.045 -00 28 42.26 2 0.41 0.85 KHJ SPC N1710=I2108 04 57 16.97 -15 17 22.9 3 1.71 3.79 WS SPC GSC N1711 04 50 36.9 -69 59 04 3 3.29 3.06 ESOB HChw KMHA N1712 04 50 57.6 -69 24 25 4 5.73 10.25 HCds KMHA ESOB HChw N1713 04 58 54.55 -00 29 21.4 6 1.62 3.21 Pds UZC DC CCA WS SPC N1714 04 52 07.3 -66 55 27 4 5.73 3.30 HChw KMHA HCds ESOB N1715 04 52 12.2 -66 54 31 2 14.51 0.71 ESOB HCds N1716 04 58 13.1 -20 21 50 3 3.72 1.53 ESOB WS SPC N1717? 04 59 19.35 -00 13 43.5 1 GSC N1717?=N1709 04 58 44.045 -00 28 42.26 2 0.41 0.85 KHJ SPC N1717?? 04 59 30.06 -00 14 17.0 2 1.59 1.48 GSC WS N1718 04 52 25.1 -67 03 04 3 3.75 3.46 HChw ESOB KMHA N1719 04 59 34.45 -00 15 38.6 6 2.92 1.28 UZC DC WS CCA SPC GSC N1720 04 59 20.6 -07 51 32 4 1.92 2.06 GHD2 WS Pds SPC N1721 04 59 17.46 -11 07 08.2 3 1.26 1.15 GSC WS SPC N1722 04 51 50.7 -69 23 56 3 11.13 3.46 HChw AH HCds N1723 04 59 25.9 -10 58 51 2 0.00 0.00 SPC WS N1724 05 03 32 +49 29.5 2 6.90 0.00 BSV TDM N1725 04 59 22.89 -11 07 56.3 4 0.72 0.95 Pds GSC SPC WS N1726 04 59 41.9 -07 45 18 3 0.86 2.08 GHD2 WS SPC N1727 04 52 19.1 -69 20 42 1 HCds N1727nw 04 52 12.3 -69 20 22 3 2.64 8.74 HChw AH ESOB N1728 04 59 27.78 -11 07 23.1 3 0.78 1.93 SPC GSC WS N1729 05 00 15.6 -03 21 09 4 2.56 3.10 HC Pds WS SPC N1730=I2113 04 59 31.73 -15 49 24.9 3 1.30 1.06 SPC WS GSC N1731 04 53 30.9 -66 55 29 3 6.32 1.73 HChw AH ESOB N1732 04 53 10.9 -68 39 00 3 2.83 1.15 ESOB HChw KMHA N1733 04 54 04.8 -66 40 56 3 0.34 1.15 ESOB HChw KMHA N1734 04 53 33.0 -68 46 03 3 6.96 3.21 HChw ESOB KMHA N1735 04 54 20.2 -67 06 00 3 2.91 2.89 ESOB KMHA HChw N1736 04 53 02.1 -68 03 10 4 3.99 3.74 HChw ESOB KMHA HCds N1737 04 53 58.2 -69 10 21 5 2.36 4.60 HCo ESOB HChw HCds AH N1738 05 01 46.6 -18 09 29 3 1.65 1.73 ESOB WS SPC N1739 05 01 47.4 -18 10 02 3 1.42 1.00 WS SPC ESOB N1740 05 01 54.716 -03 17 45.98 4 2.30 1.37 HC Pds SPC KHJ N1741A 05 01 38.0 -04 15 31 4 5.09 4.32 HC SPC KET2 WS N1741A+B 05 01 38.76 -04 15 34.1 1 HKA N1741B 05 01 35.5 -04 15 49 3 0.86 1.00 HC KET2 SPC N1742 05 02 00.4 -03 17 15 2 1.06 0.71 HC WS N1743 04 54 03.19 -69 12 03.5 6 2.66 6.02 ESOB HChw GSC AH HCds HCo N1743 knot 04 54 03.2 -69 11 57 1 HCds N1744 04 59 57.63 -26 01 21.6 5 3.39 3.14 GC WS GSC GHD2 GSCM N1745 04 54 20.7 -69 09 34 3 1.34 3.06 HCds HCo AH N1746 05 03 50 +23 46.2 2 9.71 8.49 HCe TDM N1747 04 55 11.7 -67 10 21 3 6.54 19.74 ESOB HCds HChw N1748=I2114 04 54 24.86 -69 11 02.9 6 4.14 2.33 ESOB HCo HChw AH HCds GSC N1749 04 54 55.9 -68 11 20 3 4.01 3.79 HChw ESOB AH N1750 05 03 55.0 +23 39 31 3 62.99 69.06 TDM WS HCe N1751 04 54 12.3 -69 48 26 3 3.14 3.79 KMHA ESOB HChw N1752 05 02 09.40 -08 14 28.1 4 4.63 0.85 GHD2 GSC SPC WS N1753 05 02 32.3 -03 20 39 3 0.86 2.52 WS HC SPC N1754 04 54 18.1 -70 26 29 2 2.12 0.71 ESOB AH N1755 04 55 14.8 -68 12 18 3 0.64 3.21 KMHA ESOB HChw N1756 04 54 49.64 -69 14 16.6 5 2.49 2.55 ESOB HChw GSC KMHA HCo N1757 05 02 39 -04 43.4 1o JH N1758 05 04 35 +23 47.9 2 126.23 80.61 TDM HCe N1759 05 00 49.0 -38 40 27 2 0.00 1.41 ESOB WS N1760 04 56 36.1 -66 31 24 2 10.95 2.11 HCds HChw N1761 04 56 41.2 -66 28 45 2 29.12 2.12 ESOB HCds N1761 ** 04 56 34.4 -66 28 23 1 AH N1762 05 03 36.97 +01 34 23.1 6 3.37 1.23 DC WS Pds UZC CCA SPC N1763 04 56 45 -66 25.1 1 HChw N1763 all 04 56 50.8 -66 24 26 2 13.54 9.18 ESOB HCe N1763 e 04 56 59.5 -66 24 20 1 HCe N1763 w 04 56 40.2 -66 24 44 1 HCe N1764 04 56 28.0 -67 41 44 3 3.86 6.11 KMHA ESOB HChw N1765 04 58 24.4 -62 01 40 2 0.99 2.12 ESOB WS N1766 04 55 58.0 -70 13 33 3 2.78 3.06 ESOB KMHA HChw N1767 04 56 27.3 -69 24 08 3 0.30 6.11 ESOB HChw KMHA N1768 04 57 01.4 -68 14 55 2 9.79 3.54 ESOB KMHA N1769 04 57 44.6 -66 27 45 2 0.84 4.95 HCds ESOB N1770 04 57 18.2 -68 24 55 5 16.97 14.91 HChw ESOB AH HCds HCds N1771 04 58 55.4 -63 17 53 3 0.78 1.73 ESOB RC2 WS N1772 04 56 53.5 -69 33 24 3 3.18 3.21 ESOB HChw KMHA N1773 04 58 12.4 -66 21 57 3 7.23 24.06 ESOB HChw HCds N1774 04 58 06.6 -67 14 31 2 2.86 0.70 KMHA ESOB N1775 04 56 53.5 -70 25 46 2 0.71 0.71 ESOB KMHA N1776 04 58 39.4 -66 25 46 3 1.92 1.00 HCds KMHA ESOB N1777 04 55 48.34 -74 17 01.5 3 2.27 5.18 ESOB KMHA HCds N1778 05 08 04 +37 01.4 2 16.95 4.24 TDM BSV N1779 05 05 17.9 -09 08 48 3 3.92 6.81 GHD2 WS SPC N1780 05 06 20.8 -19 28 02 3 0.00 0.00 ESOB SPC WS N1781=N1794 05 07 55.2 -18 11 26 3 2.18 1.15 SPC WS ESOB N1782 04 57 51.2 -69 23 35 3 1.21 3.21 ESOB HChw AH N1783 04 59 08.76 -65 59 12.1 3 0.28 4.89 ESOB AH HCds N1784 05 05 26.9 -11 52 18 3 3.39 2.31 GHD2 SPC WS N1785ne 04 58 45.5 -68 49 22 4 3.12 5.29 AH ESOB TDM WS N1785sw 04 58 35.3 -68 50 39 1 GSCm N1786 04 59 07.8 -67 44 43 3 0.00 4.58 ESOB HChw AH N1787 05 00 02 -65 47.7 2 39.03165.46 HChw AH N1788 05 06 53.2 -03 20 27 1 HC N1789 04 57 51.3 -71 54 05 2 0.98 3.54 ESOB KMHA N1790 05 11 07.2 +52 03 28 3 90.69 16.44 HCe WS TDM N1791 04 59 06.4 -70 10 03 3 1.46 3.21 KMHA HChw ESOB N1792 05 05 14.13 -37 58 49.2 3 3.37 1.11 WS HCds HC2m N1793 04 59 38.3 -69 33 27 3 0.52 0.58 ESOB KMHA HCds N1794=N1781 05 07 55.2 -18 11 26 3 2.18 1.15 SPC WS ESOB N1795 04 59 47.0 -69 48 03 3 1.37 1.15 KMHA ESOB HCds N1796 05 02 43.0 -61 08 22 2 1.53 2.83 WS ESOB N1796A 05 05 03.2 -61 29 02 4 0.68 1.73 ESOB RC2 Pds WS N1796Bnw 05 07 54.09 -61 11 23.6 4 1.77 4.38 WS GSC ESOB RC2 N1796Bse 05 07 55.79 -61 11 37.3 2 0.15 2.12 GSC WS N1797 05 07 44.9 -08 01 09 2 2.10 0.71 SPC WS N1798 05 11 39 +47 41.5 2 7.15 16.98 BSV TDM N1799 05 07 44.6 -07 58 09 2 2.10 0.00 WS SPC N1800 05 06 25.4 -31 57 14 2 0.90 4.95 WS GHD2 N1801 05 00 35.1 -69 36 46 3 2.62 3.06 ESOB AH HChw N1802 05 10 14 +24 06.5 2 38.74 84.85 BSV TDM N1803 05 05 26.5 -49 34 02 2 0.69 2.83 ESOB WS N1804 05 01 04.2 -69 05 01 3 4.81 3.21 ESOB HChw AH N1805 05 02 21.2 -66 06 42 2 0.86 2.83 KMHA ESOB N1806 05 02 11.60 -67 59 07.3 4 2.91 3.85 KMHA ESOB HChw HCds N1807 05 10 43 +16 31.3 2 40.69 46.67 TDM BSV N1808 05 07 42.52 -37 30 47.6 8 3.14 2.44 DJSo DJSr HC2m EWSr WS ESOB GC HCds N1809 05 02 05.5 -69 34 07 2 1.48 0.00 WS ESOB N1810 05 03 23.0 -66 22 57 3 2.27 3.06 KMHA HCds ESOB N1811 05 08 42.8 -29 16 35 3 4.59 1.53 WS Pds ESOB N1812 05 08 53.0 -29 15 07 2 3.70 0.00 WS ESOB N1813 05 02 40.5 -70 19 04 3 1.45 0.58 ESOB HChw KMHA N1814 05 03 46.4 -67 18 10 3 1.00 6.93 HCds ESOB HChw N1814 n 05 03 45.4 -67 18 07 1 KMHA N1815 05 02 27.1 -70 37 12 3 1.15 3.00 KMHA HChw ESOB N1816 05 03 51.2 -67 15 39 3 2.61 2.08 ESOB KMHA HCds N1817 05 12 15 +16 41.4 2 213.42 25.46 TDM BSV N1818 05 04 14.1 -66 26 06 3 6.56 3.21 KMHA ESOB HChw N1819 05 11 46.16 +05 12 01.0 6 1.01 1.36 WS Pds UZC DC CCA KEB1 N1820 05 04 04 -67 16.3 4 14.45 24.74 ESOB HCds HChw AH N1821 05 11 46.1 -15 08 06 2 0.00 0.71 WS SPC N1822 05 05 08.5 -66 12 43 3 3.67 6.03 KMHA HChw ESOB N1823 05 03 24.3 -70 20 09 3 3.23 2.31 KMHA HChw ESOB N1824 05 06 56.1 -59 43 29 2 1.07 4.24 WS ESOB N1825 05 04 19.0 -68 55 35 3 0.93 0.58 HCds ESOB HChw N1826 05 05 33.76 -66 13 50.3 4 2.11 2.18 HCds KMHA ESOB HChw N1827 05 10 04.0 -36 57 34 2 6.77 4.95 ESOB WS N1828 05 04 20.79 -69 23 17.9 4 3.26 0.55 HChw ESOB AH HCds N1829 05 04 58.0 -68 03 30 3 3.59 9.61 ESOB HChw KMHA N1830 05 04 38.97 -69 20 27.3 3 3.24 2.51 ESOB HCds AH N1831 05 06 16.70 -64 55 06.7 3 5.24 1.66 KMHA HCds HChw N1832 05 12 03.2 -15 41 18 3 3.01 3.21 WS SPC GHD2 N1833 05 04 22.2 -70 43 55 3 2.47 4.17 ESOB AH HChw N1834 05 05 11.8 -69 12 27 3 3.37 1.15 ESOB HChw HCds N1835 05 05 06.12 -69 24 14.2 4 2.96 0.53 ESOB HChw HCds AH N1836 05 05 35.5 -68 37 42 3 5.49 3.21 ESOB AH HChw N1837 05 04 55 -70 43.0 4 2.47 12.95 HChw ESOB HCe AH N1838 05 06 47 -68 25.4 2 66.12 12.73 HCe AH N1838 part? 05 06 07 -68 26.8 2 0.00 4.24 ESOB HChw N1839 05 06 02 -68 37.7 2 0.00 4.24 ESOB HChw N1840 05 05 19.5 -71 45 47 2 2.32 2.12 ESOB AH N1841 04 45 23.79 -83 59 54.0 4 1.42 4.16 ESOB HCds AH HCds N1842 05 07 18.6 -67 16 23 3 2.97 0.58 ESOB KMHA HChw N1843 05 14 06.1 -10 37 37 2 0.00 0.00 SPC WS N1844 05 07 30.6 -67 19 26 3 1.00 3.46 KMHA ESOB HChw N1845 05 05 46 -70 35.1 2 14.06 16.98 HCe HCe N1846 05 07 34.30 -67 27 38.3 4 2.27 5.38 KMHA HCds ESOB HChw N1847 05 07 08.1 -68 58 18 3 0.31 3.79 AH ESOB HChw N1848 05 07 28 -71 11.7 2 10.22 4.24 ESOB HChw N1849 05 09 34.7 -66 18 59 3 1.04 3.00 KMHA ESOB HChw N1850 05 08 45.31 -68 45 41.6 5 4.25 0.52 ESOB HChw HCds HCds AH N1851 05 14 06.63 -40 02 46.5 4 2.48 3.03 SW ESOB HCds HC2m N1851 core 05 14 06.62 -40 02 48.1 1 HC2m N1851 inner core 05 14 06.73 -40 02 47.8 1 HC2m N1852 05 09 24.0 -67 46 43 3 0.98 4.16 ESOB HChw KMHA N1853 05 12 16.2 -57 23 57 2 2.28 3.54 WS ESOB N1854 05 09 20.4 -68 50 53 4 2.31 3.20 ESOB HCds AH HChw N1855 05 09 16 -68 50.7 1 HCe N1856 05 09 30.1 -69 07 41 3 3.43 3.06 ESOB HChw AH N1857 05 20 05 +39 19.5 2 8.21 93.34 TDM BSV N1858 05 09 55 -68 53.9 2 7.62 8.49 HChw ESOB N1859 05 11 32.4 -65 14 57 3 3.32 2.89 ESOB AH HChw N1860 05 10 39.5 -68 45 11 3 0.00 3.00 ESOB HChw AH N1861 05 10 21.5 -70 46 40 3 2.99 3.06 KMHA HChw ESOB N1862 05 12 34.1 -66 09 17 2 4.28 2.12 KMHA ESOB N1863 05 11 40.0 -68 43 38 3 2.87 3.21 ESOB AH HChw N1864 05 12 40.8 -67 37 21 3 1.64 4.16 ESOB HChw KMHA N1865 05 12 25.2 -68 46 17 2 1.15 2.12 ESOB AH N1866 05 13 39.0 -65 27 52 3 1.79 3.46 KMHA HChw ESOB N1867 05 13 42.2 -66 17 39 3 2.78 4.58 AH ESOB HChw N1868 05 14 36.3 -63 57 17 2 1.86 0.71 KMHA ESOB N1869 05 13 51.4 -67 22 39 3 10.64 3.01 HChw HCds AH N1869? 05 13 27 -67 22.3 1 HCds N1870 05 13 10.9 -69 07 03 3 5.34 3.46 ESOB AH HChw N1871 05 13 52.0 -67 27 09 4 1.65 0.50 ESOB HChw HCds AH N1872 05 13 11.47 -69 18 50.3 5 2.85 7.96 GSC ESOB AH HCds HChw N1873 05 13 55.8 -67 20 01 4 5.71 2.83 HChw HCds ESOB HCds N1873? 05 14 01.7 -67 19 53 1 AH N1874 05 13 12.01 -69 22 35.0 4 6.13 2.86 AH GSC HChw HCo N1874,N1876,N1877 05 13 18 -69 21.7 1 ESOB N1875 05 21 45.86 +06 41 18.4 4 1.47 1.55 WS UZC Pds HKA N1876 05 13 18.6 -69 21 47 2 0.75 5.66 HCo HChw N1877 05 13 38.87 -69 23 01.6 1 GSC N1877? 05 13 19 -69 22.5 1 HChw N1878 05 12 50.5 -70 28 18 3 3.46 0.00 AH ESOB HChw N1879 05 19 48.2 -32 08 32 2 2.69 2.83 WS ESOB N1880 05 13 39.2 -69 22 52 2 0.37 8.49 HChw AH N1880? 05 13 09 -69 22.5 1 ESOB N1881 05 13 36 -69 17.9 3 11.01 15.10 ESOB HChw DSFA N1882 05 15 33.1 -66 07 49 3 2.10 7.94 KMHA ESOB HChw N1883 05 25 54 +46 29.4 2 7.31 0.00 BSV TDM N1884 05 15 58 -66 09.8 1o JH N1884??=N1882 05 15 33 -66 07.8 1 ESOB N1885 05 15 06.9 -68 58 42 3 5.37 2.99 ESOB AH HChw N1886 05 21 48.4 -23 48 41 2 4.85 5.66 WS ESOB N1887 05 16 05.6 -66 19 09 2 2.55 3.54 KMHA ESOB N1888 05 22 34.5 -11 30 00 3 2.24 2.52 WS GHD2 SPC N1889 05 22 35.3 -11 29 49 3 0.00 1.15 GHD2 SPC WS N1890 05 13 46.9 -72 04 43 3 4.67 3.21 ESOB KMHA HChw N1891 05 21 44 -35 47.4 1 HCe N1891? 05 21 24.0 -35 42 59 1 WS N1892 05 17 08.8 -64 57 38 3 4.84 3.00 ESOB HChw WS N1893 05 22 45 +33 24.7 2 0.00 42.43 TDM BSV N1894 05 15 51.3 -69 28 09 2 0.37 4.24 ESOB AH N1895 05 16 51 -67 19.8 2 4.08 4.23 HChw ESOB N1896 05 25 34 +29 15.6 1 HCo N1896? 05 25 24 +29 09.5 1 TDM N1897 05 17 31.8 -67 26 57 3 2.95 3.06 HChw KMHA ESOB N1898 05 16 42 -69 39.5 3 3.00 10.39 AH ESOB HChw N1899 05 17 47 -67 54.1 2 7.96 4.24 HChw ESOB N1900 05 19 09.1 -63 01 24 2 2.88 0.71 AH ESOB N1901 05 18 16 -68 26.6 3 8.40 27.06 HCe ESOB HChw N1902 05 18 18.84 -66 37 35.5 4 3.38 5.35 KMHK HChw GSC ESOB N1903 05 17 22.6 -69 20 09 2 1.87 3.54 ESOB AH N1904 05 24 10.60 -24 31 29.3 2 0.19 2.97 SW ESOB N1905 05 18 23.0 -67 16 41 3 2.91 0.58 HChw KMHA ESOB N1906 05 24 47.11 -15 56 34.5 3 0.74 1.04 WS HCds SPC N1907 05 28 05 +35 19.5 2 8.66 4.24 BSV TDM N1908 05 25 53 -02 31.7 1o WH N1909?=I2118 05 04.9 -07 15 1 HCe N1910 05 18 33.4 -69 13 49 2 72.80 6.36 AH ESOB N1910? 05 18 11.7 -69 13 18 1 ESOB N1911:=N1920 05 20 32.66 -66 46 43.8 3 2.97 1.10 KMHK HCds GSC N1911? 05 19 25.2 -66 40 54 1 KMHA N1912 05 28 40 +35 50.9 2 34.41 29.70 TDM BSV N1913 05 18 19.3 -69 32 12 2 0.37 2.12 AH ESOB N1914 05 17 39.3 -71 15 22 3 2.42 4.58 HChw AH ESOB N1915? 05 19 42.3 -66 49 17 1 HCds N1915?? 05 19 28.3 -66 44 20 1 KMHA N1915??=N1919 cl 05 20 14.3 -66 52 48 3 14.55 15.53 ESOB HChw KMHK N1915??=N1919 neb 05 20 19.1 -66 53 28 1 HCds N1916 05 18 37 -69 24.5 2 7.44 4.24 ESOB HChw N1916? 05 17 26.7 -69 22 33 1 AH N1917 05 19 01 -68 59.9 2 3.79 0.00 ESOB HChw N1918 05 19 07 -69 39.7 1 ESOB N1918? 05 19 16 -69 39.2 1 HChw N1919=??N1915 cl 05 20 14.3 -66 52 48 3 14.55 15.53 ESOB HChw KMHK N1919=??N1915 neb 05 20 19.1 -66 53 28 1 HCds N1920=:N1911 05 20 32.66 -66 46 43.8 3 2.97 1.10 KMHK HCds GSC N1920? 05 20 36.6 -66 46 44 1 KMHA N1921 05 19 21 -69 47.3 2 7.31 4.24 HChw ESOB N1922 05 19 50.2 -69 30 06 2 1.85 7.79 AH HChw N1922? 05 19 48 -69 26.9 1 ESOB N1923 05 21 33.5 -65 29 14 3 7.99 3.46 HChw ESOB AH N1924 05 28 02.002 -05 18 38.51 2 1.50 0.31 KHJ SPC N1925 05 21 29 -65 48.8 2 13.01 4.24 HChw AH N1925? 05 21 43 -65 47.6 1 ESOB N1926 05 20 34.8 -69 31 32 3 3.18 6.03 ESOB HChw AH N1927 05 28 42 -08 22.6 1o JH N1928 05 20 57.4 -69 28 42 3 5.32 3.79 ESOB AH HChw N1929 05 21 37 -67 54.8 2 3.98 8.49 HChw ESOB N1930 05 25 56.5 -46 43 43 3 0.59 2.52 ESOB Pds WS N1931 05 31 25 +34 14.7 1 BSV N1932 05 22 17.26 -66 09 15.6 1 GSC N1932? 05 22 27.4 -66 09 05 1 AH N1933 05 22 27.37 -66 09 09.0 2 0.30 1.70 GSC ESOB N1933? 05 22 17.2 -66 09 14 1 AH N1934 05 21 53 -67 54.9 1 HChw N1934? 05 21 47 -67 56.2 1 ESOB N1935=I2126 05 21 58.92 -67 57 27.9 2 1.55 1.91 ESOB HCds N1935=I2126? 05 21 49.7 -67 57 06 1 AH N1936=I2127 05 22 14.29 -67 58 34.2 2 2.02 0.64 HCds ESOB N1937 05 22 23.1 -67 53 59 2 0.80 6.36 AH HChw N1937? 05 22 29 -67 53.7 1 ESOB N1938 05 21 23.9 -69 56 26 2 6.17 6.36 HChw HCo N1938+N1939 05 21 25 -69 56.9 1 ESOB N1938? 05 21 27.1 -69 56 59 1 AH N1939 05 21 26.28 -69 56 60.0 2 2.58 1.27 HChw GSC N1939? 05 21 24.3 -69 56 19 1 AH N1940 05 22 44.2 -67 11 10 3 2.92 1.15 ESOB KMHA HChw N1941 05 23 06.9 -66 22 44 3 6.16 4.58 HChw KMHA ESOB N1942 05 24 43.6 -63 56 24 2 8.84 9.19 KMHA ESOB N1943 05 22 28 -70 09.2 2 3.59 4.23 HChw ESOB N1944 05 21 57.3 -72 29 39 3 3.85 1.15 HChw ESOB KMHA N1945 05 24 54 -66 27.2 2 4.23 16.98 HChw ESOB N1946 05 25 15.9 -66 23 38 3 3.02 4.04 HChw AH ESOB N1947 05 26 47.36 -63 45 39.4 5 0.96 1.31 Pds WS ESOB RC2 GSC N1948 05 25 45 -66 16.0 2 4.26 4.24 HChw ESOB N1949 05 25 05.8 -68 28 19 3 6.05 3.00 ESOB KMHA HChw N1950 05 24 32.6 -69 54 07 2 3.27 1.41 AH ESOB N1951 05 26 06.7 -66 35 47 3 1.37 3.21 KMHA HChw ESOB N1952 05 34 31.970 +22 00 52.08 3 0.02 0.03 BJM FGLM TML N1953 05 25 27 -68 50.2 2 0.00 8.49 HChw ESOB N1954 05 32 48.273 -14 03 46.22 4 1.00 1.42 GHD2 SPC KHJ GSC N1955 05 26 08.7 -67 29 52 3 23.22 3.21 AH ESOB HChw N1956 05 19 34.9 -77 43 49 2 2.92 2.12 ESOB WS N1957 05 32 55.079 -14 07 59.06 4 1.83 1.32 Pds2 SPC GSC KHJ N1958 05 25 30.1 -69 50 09 3 2.65 3.00 HChw AH ESOB N1959 05 25 36.4 -69 55 33 2 2.18 4.24 AH ESOB N1960 05 36 18 +34 08.4 2 8.79 4.24 BSV TDM N1961=I2133 05 42 04.60 +69 22 43.4 9 2.39 1.85 WS GHD1 DC UZC HCds HC2m HCds Pds CCA N1962 05 26 18.6 -68 50 15 2 6.12 0.71 ESOB AH N1963 05 32 16 -36 23.9 1 ESOB N1964 05 33 21.74 -21 56 46.4 5 3.72 3.86 GHD2 GSC WS ESOB GC N1965 05 26 29.2 -68 48 26 3 1.88 7.50 ESOB HChw AH N1966 05 26 45 -68 48.9 2 3.83 21.21 HChw ESOB N1967 05 26 43.8 -69 06 03 3 4.01 3.21 HChw ESOB AH N1968 05 27 24 -67 27.8 2 16.23 0.00 ESOB HChw N1968? 05 27 39.7 -67 27 18 1 KMHA N1969 05 26 32.2 -69 50 29 2 1.09 1.41 AH ESOB N1970 05 26 53 -68 50.1 2 3.82 8.49 ESOB HChw N1970? 05 26 45.3 -68 49 49 1 AH N1971 05 26 45.1 -69 51 05 2 1.09 0.00 AH ESOB N1972 05 26 47.6 -69 50 15 3 2.09 3.06 HChw ESOB AH N1973 05 35 04.81 -04 43 54.7 3 0.54 0.21 SAO GSC R28 N1974=N1991 05 28 00.5 -67 25 21 2 0.81 0.71 ESOB AH N1975 05 35 18.1 -04 41 05 2 4.23 2.12 HCo HCrs N1975 ne* 05 35 18.45 -04 40 56.7 1 R28 N1975 sw* 05 35 17.82 -04 41 07.4 1 R28 N1976 05 35 16.36 -05 23 24.8 3 12.76 1.90 BSV SAO GSCm N1977 05 35 16.0 -04 49 15 3 2.59 79.88 HCrs TDM BSV N1978 05 28 45.07 -66 14 11.7 5 1.55 4.85 KMHA HC2m HCds ESOB HChw N1979 05 34 01.08 -23 18 35.5 3 1.03 3.09 HCds ESOB WS N1980 05 35 24.725 -05 54 54.24 5 40.71 40.86 TDM BSV GSC SAO FK5 N1981 05 35 09 -04 25.9 3 8.63 19.29 HCo TDM BSV N1982 05 35 31.34 -05 16 03.0 2 0.32 0.92 GSC SAO N1983 05 27 44 -68 59.0 2 0.00 12.73 HChw ESOB N1984 05 27 40 -69 08.0 2 3.77 4.24 HChw ESOB N1985 05 37 47.81 +31 59 19.8 1 GSC N1986 05 27 38.4 -69 58 20 2 3.99 2.12 AH ESOB N1987 05 27 16.6 -70 44 14 3 2.61 0.58 HChw KMHA ESOB N1988 05 37 26.48 +21 13 05.7 1 GSC N1989 05 34 23.3 -30 48 03 2 2.73 0.00 ESOB WS N1990 05 36 12.790 -01 12 06.95 3 0.75 0.07 GSC SAO FK5 N1991=N1974 05 28 00.5 -67 25 21 2 0.81 0.71 ESOB AH N1992 05 34 31.9 -30 53 48 2 1.82 2.83 WS ESOB N1993 05 35 25.5 -17 48 55 3 1.65 0.00 ESOB WS SPC N1994 05 28 22.6 -69 08 27 3 4.07 3.06 ESOB HChw AH N1995 05 33 03.3 -48 40 30 1 HCm N1996 05 38 10.2 +25 49 02 3 129.91 21.07 TDM WS HCe N1997 05 30 34.7 -63 12 12 2 2.39 3.54 ESOB KMHA N1998 05 33 15.50 -48 41 44.3 3 2.75 1.85 ESOB GSC WS N1999 05 36 25.36 -06 42 57.1 1 GSC N2000 05 27 29.9 -71 52 47 2 4.28 2.83 ESOB KMHA N2001 05 29 02 -68 46.3 2 0.00 8.49 ESOB HChw N2001? 05 29 08.2 -68 45 16 1 KMHA N2002 05 30 21.0 -66 53 02 3 3.58 0.58 ESOB HChw KMHA N2003 05 30 54 -66 28.0 2 0.00 0.00 ESOB HChw N2003? 05 30 40.9 -67 17 16 1 KMHA N2004 05 30 40 -67 17.3 2 4.09 8.49 ESOB HChw N2005 05 30 10.6 -69 45 08 2 2.20 0.00 AH ESOB N2006 05 31 19.7 -66 58 21 3 1.01 3.00 ESOB HChw KMHA N2007 05 34 59.0 -50 55 18 3 1.64 2.08 ESOB WS Pds N2008 05 35 03.8 -50 58 00 2 0.00 2.12 ESOB WS N2009 05 30 59.7 -69 10 50 3 2.68 7.24 ESOB AH HChw N2010 05 30 34.8 -70 49 10 2 1.39 0.71 KMHA ESOB N2011 05 32 19.8 -67 31 22 3 2.88 7.02 HChw KMHA ESOB N2012 05 22 35.0 -79 51 06 3 2.39 3.06 ESOB WS Pds N2013 05 44 01 +55 47.6 1 BSV N2014 05 32 19 -67 41.3 2 0.00 4.24 HChw ESOB N2014? 05 32 21.7 -67 41 57 1 KMHA N2015 05 32 06 -69 14.6 1 ESOB N2015? 05 31 58 -69 14.6 1 HChw N2015?? 05 31 47 -69 14.9 1 AH N2016 05 31 36 -69 56.5 3 19.45 27.71 HChw ESOB AH N2017 05 39 15.9 -17 50 58 3 7.86 3.46 BSV WS ESOB N2018 05 31 21.1 -71 04 11 2 6.53 4.95 HChw HCds N2018? 05 31 11.6 -71 04 10 1 KMHA N2019 05 31 56 -70 09.6 3 2.93 0.00 HChw AH ESOB N2020 05 33 11 -67 42.9 2 8.03 8.49 HChw ESOB N2021 05 33 30.2 -67 27 10 3 2.89 0.58 HChw AH ESOB N2022 05 42 06.17 +09 05 11.2 3 0.44 1.68 GSC CK GSCA N2023 05 41 38.36 -02 15 32.8 2 0.32 0.28 GSC SAO N2024 05 41 42 -01 51.4 1 HCo N2025 05 32 33.6 -71 43 02 3 0.00 6.25 ESOB HChw KMHA N2026 05 43.2 +20 08 1 BSV N2027 05 35 00.8 -66 54 58 3 5.91 0.00 ESOB KMHA HChw N2028 05 33 49.0 -69 57 05 3 2.83 2.30 ESOB AH HChw N2029 05 35 38 -66 02.0 2 12.91 8.49 HChw ESOB N2030 05 35 00.5 -67 33 18 3 3.48 3.46 ESOB HChw HCds N2030? 05 35 41.1 -66 02 03 1 KMHA N2031 05 33 41.3 -70 59 11 3 2.46 1.15 HChw AH ESOB N2032 05 35 19.9 -67 34 37 2 2.83 1.41 HChw HCds N2032? 05 35 20 -67 34.1 1 ESOB N2033 05 34 30.3 -69 46 48 2 3.29 0.00 AH HCds N2034 05 35 32 -66 54.2 1 ESOB N2034? 05 35 43 -66 53.8 1 HChw N2035 05 35 31.4 -67 35 03 3 5.80 3.06 HChw HCds ESOB N2036 05 34 32.0 -70 03 57 3 2.62 6.11 ESOB AH HChw N2037 05 34 53.5 -69 44 13 3 59.66 30.18 AH HChw ESOB N2038 05 34 41.7 -70 33 42 3 5.90 3.79 HChw ESOB AH N2039 05 44 00 +08 41.5 1 HCe N2040 05 36 06.1 -67 34 00 4 6.00 3.46 HCds HChw AH ESOB N2041 05 36 28.4 -66 59 24 3 3.56 2.89 KMHA ESOB HChw N2042 05 36 09.6 -68 55 31 2 0.00 10.61 HCds AH N2042A? 05 36 16 -68 55.6 1 HChw N2042B? 05 35 36 -68 58.4 1 HChw N2042C? 05 35 36 -68 51.4 1 HChw N2043 05 35 59 -70 04.5 2 14.44 4.24 ESOB HChw N2043? 05 35 24 -70 07.3 1 HChw N2044 05 36 06.3 -69 11 50 2 0.75 6.36 HCds AH N2045 05 45 01.33 +12 53 16.8 2 0.83 1.63 GSC WS N2046 05 35 37.8 -70 14 29 3 3.08 3.00 KMHA ESOB HChw N2047 05 35 53.6 -70 11 31 2 4.31 2.83 ESOB AH N2048 05 35 55 -69 39.0 2 0.00 0.00 ESOB HChw N2049 05 43 15.1 -30 04 42 2 0.00 0.00 ESOB WS N2050 05 36 40 -69 23.1 2 11.19 4.24 ESOB HChw N2050? 05 36 53 -69 22.4 1 AH N2051 05 36 07.7 -71 00 43 3 2.68 3.06 ESOB KMHA HChw N2052 05 37 12 -69 46.4 2 10.99 8.49 ESOB HChw N2053 05 37 40.3 -67 24 49 3 3.05 3.00 ESOB KMHA HChw N2054 05 45 15.5 -10 04 59 2 2.09 0.00 HCo WS N2055 05 37 03 -69 25.9 2 26.05 33.95 HChw AH N2056 05 36 34.2 -70 40 17 3 1.72 2.30 ESOB HChw AH N2057 05 36 55.5 -70 16 13 3 3.08 6.03 AH ESOB HChw N2058 05 36 54.4 -70 09 48 3 1.47 6.43 ESOB HChw AH N2059 05 37 00.6 -70 07 45 3 0.59 4.16 ESOB HChw AH N2060 05 37 47 -69 10.3 3 8.14 5.99 HChw AH ESOB N2061 05 42 41.9 -34 00 16 2 1.76 24.75 ESOB WS N2062 05 40 03.3 -66 52 33 3 2.96 1.73 ESOB AH HChw N2063 05 46 43 +08 46.9 1 HCo N2064 05 46 18.39 +00 00 21.4 1 GSC N2065 05 37 36.9 -70 14 11 3 6.90 5.51 AH HChw ESOB N2066 05 37 42.1 -70 10 00 3 5.08 4.16 AH HChw ESOB N2067: 05 46 31 +00 07.9 1 HCo N2067? 05 46 26.3 +00 05 42 1 GSC N2068 05 46 45 +00 04.8 1 HCo N2069 05 38 40 -69 00.3 1 HChw N2069? 05 38 46 -68 58.5 1 ESOB N2070 05 38 42.446 -69 06 03.15 5 1.17 0.58 HCds Ty2 PPM AH SAO N2071 05 47 07.27 +00 17 39.3 1 GSC N2072 05 38 24.1 -70 14 02 3 2.34 6.51 AH ESOB HChw N2073 05 45 53.8 -21 59 59 2 0.00 0.71 ESOB WS N2074 05 39 03 -69 29.9 3 3.03 9.17 SIMA ESOB HChw N2075 05 38 20.7 -70 41 08 3 0.57 0.00 KMHA ESOB HChw N2076 05 46 47.43 -16 46 56.1 4 2.36 3.43 SPC WS HCds SGC N2077 05 39 35.3 -69 39 21 3 3.35 3.79 AH HChw ESOB N2078 05 39 39 -69 44.6 2 3.67 0.00 ESOB HChw N2079 05 39 39 -69 46.4 2 0.00 0.00 ESOB HChw N2080 05 39 44.6 -69 38 45 3 2.62 4.58 ESOB AH HChw N2081 05 40 01 -69 24.2 2 14.91 12.73 ESOB HChw N2082 05 41 51.08 -64 18 05.2 3 1.45 1.59 WS HCds ESOB N2083 05 39 58 -69 44.2 2 3.67 8.49 HChw ESOB N2084 05 40 07 -69 45.6 2 0.00 4.24 ESOB HChw N2085 05 40 09.3 -69 40 23 3 2.67 4.16 HChw AH ESOB N2086 05 40 12 -69 40.1 2 3.68 4.24 HChw ESOB N2087 05 44 15.8 -55 32 00 2 3.00 0.71 ESOB WS N2088 05 40 59.8 -68 27 52 2 0.39 3.54 AH ESOB N2089 05 47 51.4 -17 36 09 3 2.18 1.53 WS SPC ESOB N2090 05 47 02.0 -34 15 04 2 6.14 0.71 WS ESOB N2091 05 40 58.0 -69 26 10 3 0.30 3.00 KMHA HChw ESOB N2092 05 41 21.4 -69 13 24 3 6.47 3.00 HChw ESOB KMHA N2093 05 41 49.2 -68 55 11 3 2.77 6.11 HChw KMHA ESOB N2094 05 42 07.4 -68 21 47 2 1.95 1.41 AH HChw N2094? 05 42 12 -68 55.1 1 ESOB N2095 05 42 49.9 -67 19 11 2 14.30 4.24 HChw KMHA N2095? 05 42 36 -67 19.1 1 ESOB N2096 05 42 17.2 -68 27 29 2 5.06 1.41 KMHA ESOB N2097 05 44 15.8 -62 47 06 2 2.42 2.83 KMHA ESOB N2098 05 42 30.2 -68 16 27 3 1.92 3.46 KMHA HChw ESOB N2099 05 52 18 +32 33.2 1 BSV N2100 05 42 08.5 -69 12 42 3 2.81 0.58 HChw AH ESOB N2101 05 46 22.7 -52 05 23 2 4.56 2.83 WS ESOB N2102 05 42 19.9 -69 29 13 3 2.78 0.00 HChw KMHA ESOB N2103 05 41 40 -71 19.9 2 0.00 4.24 HChw ESOB N2104 05 47 04.4 -51 33 09 2 3.30 4.24 WS ESOB N2105 05 44 19.7 -66 55 02 3 2.96 1.15 ESOB AH HChw N2106 05 50 46.3 -21 34 02 2 0.00 0.00 ESOB WS N2107 05 43 12.6 -70 38 28 3 2.87 6.24 KMHA ESOB HChw N2108 05 43 55.8 -69 10 50 3 4.92 0.57 ESOB HChw KMHA N2109 05 44 22.9 -68 32 52 3 0.63 0.58 KMHA ESOB HChw N2110 05 52 11.3 -07 27 24 2 2.10 0.71 WS SPC N2111 05 44 33.2 -70 59 40 3 3.73 6.66 KMHA ESOB HChw N2112 05 53 45 +00 24.6 1 BSV N2113 05 45 23.9 -69 46 28 3 5.84 3.79 HChw KMHA ESOB N2114 05 46 12.5 -68 02 52 3 2.97 4.16 ESOB KMHA HChw N2115nw=N2115A 05 51 19.74 -50 34 59.8 4 1.70 1.74 ESOB WS GSC HCds N2115se=N2115B 05 51 21.07 -50 35 33.6 4 3.98 2.64 ESOL HCds GSC WS N2116 05 47 15.0 -68 30 26 3 2.22 2.89 KMHA ESOB HChw N2117 05 47 46.3 -67 27 02 3 3.98 3.47 ESOB HChw KMHA N2118 05 47 38.9 -69 07 54 3 6.17 0.58 HChw ESOB KMHA N2119 05 57 26.91 +11 56 55.2 5 0.55 1.75 Pds WS HCds GSC CCA N2120 05 50 34.8 -63 40 31 2 0.47 2.12 ESOB KMHA N2121 05 48 12.34 -71 28 51.0 4 3.21 5.15 HChw ESOB KMHA HCds N2122 05 48 53 -70 04.1 3 5.90 6.94 HChw ESOB AH N2123 05 51 43.4 -65 19 19 3 0.72 3.79 ESOB HChw KMHA N2124 05 57 52.3 -20 05 05 3 0.81 2.00 SPC ESOB WS N2125 05 50 53.5 -69 28 43 3 3.58 1.73 KMHA HChw ESOB N2126 06 02 32 +49 52.0 1 BSV N2127 05 51 21.5 -69 21 39 3 5.36 1.73 HChw KMHA ESOB N2128 06 04 34.27 +57 37 39.1 4 2.03 1.83 WS CCA UZC DC N2129 06 01 06 +23 19.3 1 HCe N2130 05 52 23.1 -67 20 02 3 6.67 0.00 HChw ESOB KMHA N2131 05 58 47.2 -26 39 10 2 0.00 2.83 ESOB WS N2132 05 55.7 -59 55 1 HCe N2133 05 51 28.9 -71 10 27 3 1.40 4.05 ESOB HChw AH N2134 05 51 56.6 -71 05 52 3 0.28 3.21 KMHA ESOB HChw N2135 05 53 34.7 -67 25 41 3 3.50 3.06 HChw ESOB KMHA N2136 05 52 58.45 -69 29 33.4 5 2.63 2.88 HC2m HChw HCds AH ESOB N2137 05 53 12.25 -69 28 58.0 5 2.81 2.12 KMHA HCds HC2m HChw ESOB N2138 05 54 49.6 -65 50 13 4 3.26 5.12 ESOB KMHA HChw HCds N2139=I2154 06 01 08.06 -23 40 22.2 4 3.71 1.93 GHD2 HCds WS ESOB N2140 05 54 16.1 -68 35 58 2 0.77 1.41 KMHA ESOB N2141 06 02 55 +10 26.8 1 BSV N2142 06 01 50.38 -10 35 52.8 2 0.73 0.00 WS GSC N2143 06 02 53 +05 42.9 1 HCe N2144 05 40 56.9 -82 07 11 2 1.60 2.12 WS ESOB N2145 05 54 22.78 -70 54 04.9 4 0.92 2.06 KMHA ESOB HChw HCds N2146 06 18 38.19 +78 21 22.4 7 1.56 3.39 CCA DC HC2m WS HCrs CCR GSC N2146A 06 23 54.91 +78 31 47.4 6 1.11 2.15 CCA WS UZC HCrs GHD1 HCds N2147 05 55 46.2 -68 12 12 3 2.95 6.11 ESOB KMHA HChw N2148 05 58 45.8 -59 07 35 2 1.63 1.41 WS ESOB N2149 06 03 30.8 -09 43 50 1 HCo N2150 05 55 46.4 -69 33 39 3 0.00 3.05 ESOB HChw WS N2151 05 56 20.2 -69 01 05 3 3.66 3.06 HChw ESOB KMHA N2152 06 00 55.0 -50 44 23 2 0.00 6.36 ESOB WS N2153 05 57 51.9 -66 24 00 3 2.08 3.79 HChw ESOB KMHA N2154 05 57 38.4 -67 15 43 2 1.23 0.00 ESOB KMHA N2155 05 58 32.8 -65 28 37 2 3.96 2.83 KMHA ESOB N2156 05 57 49.9 -68 27 41 3 2.77 3.21 HChw KMHA ESOB N2157 05 57 34.5 -69 11 50 3 3.08 5.03 HChw ESOB KMHA N2158 06 07 25 +24 05.8 1 BSV N2159 05 58 02.5 -68 37 27 3 2.81 1.15 HChw KMHA ESOB N2160 05 58 13.2 -68 17 21 3 3.06 5.03 ESOB KMHA HChw N2161 05 55 42.7 -74 21 13 2 2.29 0.71 AH ESOB N2162 06 00 30.9 -63 43 18 2 4.70 1.41 ESOB KMHA N2163 06 07 49.54 +18 39 26.8 1 GSC N2164 05 58 55.2 -68 30 57 3 2.22 2.89 ESOB HChw KMHA N2165 06 11 04 +51 40.6 1 BSV N2166 05 59 33.2 -67 56 29 3 2.98 2.31 HChw KMHA ESOB N2167 06 06 58.54 -06 12 08.9 3 0.65 1.50 WS GSC SAO N2168 06 09.0 +24 21 1 BSV N2169 06 08 24 +13 57.9 1 BSV N2170 06 07 31.82 -06 23 57.5 1 SAO N2171 05 58 59 -70 43.1 1o JH N2171: 05 44 13.8 -70 40 09 2 0.35 0.00 KMHK HCds N2171?? 05 58 26.3 -70 39 15 1 KMHK N2172 06 00 05.4 -68 38 15 3 2.80 3.21 HChw KMHA ESOB N2173 05 57 58.3 -72 58 45 3 1.01 6.42 KMHA ESOB HChw N2174 06 09 23.6 +20 39 34 1 HCo N2175 06 09 39.55 +20 29 15.3 1 GSC N2176 06 01 19.1 -66 51 11 3 3.40 6.51 HChw ESOB KMHA N2177 06 01 15.9 -67 44 03 3 3.01 3.46 HChw KMHA ESOB N2178 06 02 47.6 -63 45 50 3 3.34 3.06 HChw WS ESOB N2179 06 08 02.1 -21 44 48 3 0.00 1.00 ESOB WS GHD2 N2180 06 09 36 +04 42.7 1 BSV N2181 06 02 43.5 -65 15 53 3 2.17 0.00 KMHA ESOB HChw N2182 06 09 30.9 -06 19 35 1 HCo N2183 06 10 46.93 -06 12 42.6 1 GSC N2184 06 11.0 -03 29 1 BSV N2185 06 11 00 -06 13.6 1 HCo N2185ne 06 11 06.09 -06 12 38.4 1 GSC N2185sw 06 10 58 -06 14.3 1 HCo N2186 06 12 07 +05 27.5 1 BSV N2187ne 06 03 52.62 -69 34 41.1 2 1.81 0.78 WS HCds N2187sw 06 03 44.20 -69 35 18.4 2 0.22 0.42 WS HCds N2187sw+ne 06 03 48 -69 35.0 1 ESOB N2188 06 10 09.6 -34 06 20 2 1.76 2.12 ESOB WS N2189e? 06 12 17 +01 03.7 1 HCo N2189w? 06 12 01 +01 04.2 1 HCo N2190 06 01 02.70 -74 43 32.4 3 4.60 1.22 HCds KMHA ESOB N2191 06 08 23.7 -52 30 42 2 0.00 3.54 ESOB WS N2192 06 15 17 +39 51.3 1 BSV N2193 06 06 17.7 -65 05 57 3 1.46 5.51 KMHA ESOB HChw N2194 06 13 45 +12 48.4 1 BSV N2195 06 14 33.83 +17 38 22.2 2 0.51 0.71 GSCm WS N2196 06 12 09.7 -21 48 23 3 3.68 0.58 GHD2 WS ESOB N2197 06 06 07.9 -67 05 51 3 3.75 1.73 KMHA HChw ESOB N2198 06 13 54 +00 59.7 1o JHS N2199 06 04 44.7 -73 24 03 3 0.74 2.31 ESOB HChw WS N2200 06 13 17.2 -43 39 48 2 2.30 0.00 ESOB WS N2201 06 13 31.7 -43 42 19 2 4.60 0.00 WS ESOB N2202 06 16 50 +05 59.8 1 BSV N2203 06 04 42.1 -75 26 15 2 2.67 4.24 KMHA ESOB N2204 06 15 33 -18 39.9 2 30.15 8.49 BSV ESOB N2205 06 10 33.0 -62 32 20 2 2.45 0.71 WS ESOB N2206 06 15 59.4 -26 45 54 2 5.68 2.12 ESOB WS N2207 06 16 21.95 -21 22 22.3 3 2.31 1.50 WS HCds GHD2 N2208 06 22 34.717 +51 54 33.46 5 1.25 0.57 UZC DC KHJ Pds CCA N2209 06 08 34.1 -73 50 18 2 4.14 3.54 ESOB KMHA N2210 06 11 32.0 -69 07 19 3 4.09 3.79 AH ESOB HChw N2211 06 18 30.31 -18 32 15.8 4 1.16 1.64 WS SPC GSC ESOB N2212 06 18 35.65 -18 31 11.4 4 2.04 1.41 ESOB GSC SPC WS N2213 06 10 42.1 -71 31 43 3 0.82 1.73 ESOB HChw KMHA N2214 06 12 57.17 -68 15 36.9 3 1.47 3.44 HCds HC2m ESOB N2215 06 20 49 -07 17.0 1 BSV N2216 06 21 30.7 -22 05 13 2 0.00 2.83 ESOB WS N2217 06 21 39.8 -27 14 02 2 0.00 2.12 GHD2 WS N2218 06 24 41.5 +19 20 28 1 HCo N2218? 06 24 42.0 +19 20 39 1 WS N2219 06 23 44 -04 40.6 1 BSV N2220 06 21 11.4 -44 45 32 2 9.04 4.24 ESOB WS N2221 06 20 15.4 -57 34 41 2 4.55 4.24 ESOB WS N2222 06 20 16.5 -57 31 56 2 3.99 7.78 ESOB WS N2223 06 24 35.7 -22 50 18 4 0.69 1.26 GHD2 ESOB GC WS N2224 06 27 28 +12 35.6 1 HCo N2225 06 26 34 -09 37.8 1 HCo N2225/6 06 26 36 -09 38.5 1 BSV N2226 06 26 37.6 -09 38 33 1 HCo N2227 06 25 57.9 -22 00 18 2 0.00 0.00 ESOB WS N2228 06 21 15.7 -64 27 33 2 1.37 1.41 ESOB WS N2229 06 21 23.6 -64 57 23 2 1.80 3.54 ESOB WS N2230 06 21 27.5 -64 59 34 2 3.14 1.41 ESOB WS N2231 06 20 43.6 -67 31 03 3 2.95 3.00 ESOB KMHA HChw N2232 06 28 01 -04 50.8 1 BSV N2233 06 21 39.5 -65 01 59 2 5.38 2.12 ESOB WS N2234 06 29 21 +16 43.4 1 HCo N2235 06 22 21.9 -64 56 03 2 2.70 3.54 ESOB WS N2236 06 29 39 +06 49.8 1 BSV N2237 06 30 54 +05 03.0 1 HCe N2238 06 30 40.4 +05 00 47 1 HCo N2239=N2244 06 31 55.56 +04 56 34.6 1 SAO N2240 06 33 10 +35 15.0 1 BSV N2241 06 22 52.9 -68 55 29 3 4.05 1.15 KMHA ESOB HChw N2242 06 34 07.35 +44 46 37.9 4 0.86 0.43 SBG1 UB10 SIMB CK N2243 06 29 34 -31 17.0 2 9.07 12.73 BSV ESOB N2244=N2239 06 31 55.56 +04 56 34.6 1 SAO N2245 06 32 41.25 +10 09 23.9 1 GSC N2246 06 32 33.8 +05 07 41 1 HCo N2247 06 33 05.11 +10 19 17.5 1 GSC N2248 06 34 35.5 +26 18 17 2 4.75 1.41 WS HCo N2249 06 25 49.9 -68 55 13 3 3.29 3.21 AH ESOB HChw N2250 06 33 49 -05 05.1 1 HCo N2251 06 34 38 +08 22.0 1 BSV N2252 06 34 42 +05 22.0 1 HCo N2253? 06 43 41.95 +65 12 22.4 2 0.31 0.28 GSC DC N2254 06 35 49 +07 40.4 1 HCo N2255 06 33 58.7 -34 48 45 2 1.74 3.54 WS ESOB N2256 06 47 13.75 +74 14 10.7 5 3.31 0.71 GHD1 UZC DC WS CCA N2257 06 30 12.7 -64 19 31 2 2.76 2.83 AH ESOB N2258 06 47 46.33 +74 28 54.0 5 1.37 2.92 GHD1 UZC DC WS CCA N2259 06 38 21 +10 53.0 1 BSV N2260 06 38 03 -01 28.4 1 BSV N2261 06 39 09.51 +08 44 39.6 1 GSC N2261s 06 39 09.9 +08 44 13 1 HC N2262 06 39 38 +01 08.6 1 HCo N2263 06 38 28.5 -24 50 52 2 5.78 4.95 ESOB WS N2264 06 40 58 +09 53.7 1 BSV N2265 06 41 41 +11 54.3 1 HCo N2266 06 43 19 +26 58.2 1 BSV N2267 06 40 51.7 -32 28 55 3 1.94 2.08 Pds WS ESOB N2268 07 14 17.80 +84 22 55.2 7 2.49 2.95 DC HCds GHD1 WS UZC CCA HCrs N2269 06 43 17 +04 37.5 1 BSV N2270 06 43 57 +03 28.7 1 HCo N2271 06 42 52.6 -23 28 33 2 6.81 2.12 ESOB WS N2272 06 42 41.4 -27 27 33 2 3.77 3.54 WS ESOB N2273 06 50 08.750 +60 50 44.75 6 2.57 1.97 WS KET1 CCA AE UZC DC N2273A 06 40 07.03 +60 04 54.4 2 1.85 5.16 DC CCA N2273B 06 46 31.56 +60 20 26.9 5 0.71 3.79 WS UZC DC CCA GHD1 N2274 06 47 17.41 +33 34 01.2 6 1.30 0.99 DC GSC SBG1 WS CCA UZC N2275 06 47 17.92 +33 35 56.5 5 0.50 1.67 GSC DC WS SBG1 CCA N2276 07 27 16.09 +85 45 16.5 5 3.63 3.07 DC HHKK HCrs CCA WS N2277 06 47 47.0 +33 27 04 1 HCo N2278 06 48 16.4 +33 23 40 2 0.88 0.71 WS HCo N2279 06 48 24.8 +33 24 54 1 HCo N2280 06 44 49.10 -27 38 20.8 5 2.72 1.37 GHD2 WS HC2m HCds ESOB N2281 06 48 17 +41 04.7 1 BSV N2282=I2172 06 46 51.42 +01 18 55.8 2 3.08 2.47 BSV HCds N2283=?I2171 06 45 52.83 -18 12 38.2 4 3.80 0.65 WS GSC HCo ESOB N2284: 06 49 09.6 +33 11 37 1 HCo N2284? 05 49 17.0 +33 14 20 1 GSCm N2285 06 49 36.0 +33 21 52 1 HCo N2286 06 47 40 -03 08.9 1 BSV N2287 06 46 01 -20 45.4 2 39.69 8.49 BSV ESOB N2288 06 50 51.97 +33 27 44.4 3 0.99 2.67 HCds SBG1 WS N2289 06 50 53.538 +33 28 44.22 6 2.00 1.87 MB HCds SBG1 UZC KHJ CCA N2290 06 50 56.89 +33 26 15.4 6 0.77 0.83 HCds SBG1 WS GHD1 MB CCA N2291 06 50 58.558 +33 31 31.09 4 0.69 0.76 HCds GHD1 SBG1 KHJ N2292 06 47 39.71 -26 44 47.2 3 1.93 1.15 HCds ESOB WS N2293 06 47 42.86 -26 45 15.5 3 1.48 4.20 ESOB HCds WS N2294 06 51 11.25 +33 31 36.5 3 0.58 2.16 WS GHD1 SBG1 N2295 06 47 23.40 -26 44 10.5 3 4.85 1.03 WS HCds ESOB N2296=I0452 06 48 39.05 -16 54 06.4 3 2.43 1.70 SGC WS HCds N2297 06 44 24.8 -63 43 02 2 2.82 2.83 WS ESOB N2298 06 48 59.25 -36 00 15.0 2 0.77 5.94 SW ESOB N2299=N2302 06 51 55 -07 05.0 2 31.58 4.24 BSV HCo N2300 07 32 20.73 +85 42 31.3 6 1.29 2.11 UZC DC WS GHD1 CCA HCrs N2301 06 51 45 +00 27.6 1 BSV N2302=N2299 06 51 55 -07 05.0 2 31.58 4.24 BSV HCo N2303 06 56 17.637 +45 29 34.65 5 2.11 1.54 UZC KHJ SBG1 CCA DC N2304 06 55 11 +17 59.3 1 BSV N2305 06 48 37.3 -64 16 23 2 0.00 0.71 ESOB WS N2306 06 54 29 -07 12.2 1 HCe N2307 06 48 51.0 -64 20 04 3 0.65 3.06 Pds ESOB WS N2308 06 58 37.661 +45 12 38.15 5 1.25 1.25 UZC KHJ SBG1 CCA DC N2309 06 56 03 -07 10.5 1 BSV N2310 06 53 53.7 -40 51 46 2 2.41 4.24 ESOB WS N2311 06 57 47 -04 36.7 1 BSV N2312 06 58 47 +10 17.7 1 BSV N2313 06 58 02.80 -07 56 42.1 1 GSC N2314 07 10 32.17 +75 19 36.8 7 1.05 1.06 WS HCrs Pds CCA GHD1 DC UZC N2315 07 02 33.04 +50 35 26.1 6 2.21 1.63 DC WS UZC HCds SBG1 CCA N2316 06 59 40.9 -07 46 39 1 HCo N2316+N2317 06 59 41.16 -07 46 34.2 1 GSC N2317 06 59 41.6 -07 46 28 1 HCo N2318 06 59 27 -13 41.9 1 BSV N2319 07 00 32 +03 02.5 1 HCe N2320 07 05 41.89 +50 34 50.1 5 2.18 1.27 DC WS UZC SBG1 CCA N2321 07 05 59.030 +50 45 21.26 4 0.82 0.46 UZC KHJ SBG1 CCA N2322 07 06 00.31 +50 30 36.2 4 0.59 0.48 WS UZC SBG1 CCA N2323 07 02.7 -08 23 1 BSV N2324 07 04 07 +01 02.7 1 BSV N2325 07 02 40.4 -28 41 53 3 2.01 3.00 WS GHD2 ESOB N2326 07 08 10.97 +50 40 54.0 6 1.25 0.53 DC WS GSC UZC SBG1 CCA N2326A 07 08 34.30 +50 37 52.5 6 0.48 1.12 WS UZC GSC SBG1 GHD1 CCA N2327 07 04 07.2 -11 18 50 1 HCo N2328 07 02 36.4 -42 04 07 2 4.73 1.41 WS ESOB N2329 07 09 08.03 +48 36 55.5 5 0.79 1.90 WS SBG1 GSC CCA DC N2330? 07 09 35.01 +50 14 06.9 1 HCds N2330?=I0457 07 09 28.379 +50 09 08.42 3 0.19 0.70 GSC SBG1 KHJ N2331 07 06 59 +27 15.7 1 HCe N2332 07 09 34.07 +50 10 54.9 6 1.99 1.37 WS DC UZC GSC SBG1 CCA N2333 07 08 21.32 +35 10 10.5 5 1.08 1.99 WS SBG1 UZC DC CCA N2334? 07 09 52.09 +50 11 33.0 1 HCds N2334?=I0465 07 11 33.58 +50 14 52.6 3 0.17 0.40 SBG1 UZC GSC N2335 07 06 49 -10 01.7 1 BSV N2336 07 27 03.78 +80 10 41.1 9 0.96 1.69 HCrs HCds UZC WS GSC HC2m CCA GHD1 DC N2336A 07 56 16.43 +78 00 48.0 3 5.19 3.38 UZC CCA DC N2337 07 10 13.61 +44 27 24.5 6 1.25 1.20 SBG1 WS K15 DC UZC CCA N2338 07 07 43 -05 43.0 2 84.44 16.97 BSV HCe N2339 07 08 20.61 +18 46 48.9 5 2.59 3.70 WS UZC DC CCA GH N2340 07 11 10.82 +50 10 27.4 6 1.02 0.57 DC WS GSC UZC SBG1 CCA N2341 07 09 12.05 +20 36 08.1 4 0.98 1.42 DC UZC WS CCA N2342 07 09 18.34 +20 38 10.3 4 3.08 1.73 WS CCA UZC DC N2343 07 08 06 -10 37.0 1 BSV N2344 07 12 28.480 +47 09 59.65 6 3.31 2.06 GHD1 DC UZC SBG1 KHJ CCA N2345 07 08 18 -13 11.6 1 BSV N2346 07 09 22.371 -00 48 21.75 3 3.71 3.75 DKM1 PPM FAST N2347 07 16 04.11 +64 42 40.0 6 1.07 2.67 WS UZC GSC CCA GHD1 DC N2348 07 03 02 -67 24.2 2 4.09 46.68 BSV ESOB N2349 07 10 48 -08 35.6 1 HCo N2350 07 13 12.19 +12 15 57.6 3 1.06 1.69 WS UZC CCA N2351? 07 13 31 -10 29.2 2 20.86 21.21 WS HCo N2352 07 13 05.7 -24 02 22 2 4.85 32.53 ESOB WS N2353 07 14 30 -10 16.0 1 BSV N2354 07 14 10 -25 41.4 2 95.65 8.49 ESOB BSV N2355=N2356 07 16 59 +13 45.0 1 BSV N2356=N2355 07 16 59 +13 45.0 1 BSV N2357 07 17 40.97 +23 21 20.9 3 1.38 1.01 WS UZC CCA N2358 07 16 56 -17 07.0 1 HCo N2358? 07 16 42.0 -17 01 59 1 WS N2359 07 18 30 -13 13.6 1 HCo N2360 07 17 43 -15 38.5 1 BSV N2361 07 18 23.8 -13 12 34 1 HCo N2362 07 18 41 -24 57.3 2 9.62 0.00 BSV ESOB N2363 07 28 29.78 +69 11 35.3 1 HCds N2364 07 20 46 -07 33.0 1 BSV N2365 07 22 22.48 +22 04 59.2 4 2.37 1.27 WS DC CCA UZC N2366 07 28 55.04 +69 12 57.9 6 2.58 3.66 SCO HCds GHD1 WS HC2m HCds N2366 knot 07 28 43.27 +69 11 22.4 3 4.30 0.55 HCds GSC HCo N2366 knot ne 07 28 46.03 +69 11 28.5 1 HCds N2367 07 20 06 -21 52.9 2 39.40 8.49 BSV ESOB N2368 07 21 06 -10 22.3 1 HCo N2369 07 16 38.0 -62 20 39 2 3.95 0.00 WS ESOB N2369A 07 18 43.6 -62 56 09 2 1.45 4.95 WS ESOB N2369B 07 20 29.7 -62 03 14 2 0.50 1.41 ESOB WS N2370 07 25 01.64 +23 46 59.6 3 1.51 1.10 WS CCA UZC N2371 07 25 33.82 +29 29 17.5 2 1.11 0.85 GSC HCo N2371/72 07 25 34.69 +29 29 26.6 4 0.32 0.82 UJ10 CK 2MSP GSC N2372 07 25 35.8 +29 29 29 1 HCo N2373 07 26 36.983 +33 49 26.25 8 1.58 1.00 HC SBG1 K08 CCA KHJ UZC KEBA DC N2374 07 23 56 -13 15.8 1 BSV N2375 07 27 09.489 +33 49 54.67 8 1.14 1.50 HC SBG1 KHJ GHD1 Pds UZC CCA HCds N2376 07 26 35.93 +23 04 22.4 3 0.08 0.95 WS UZC GSC N2377 07 24 56.78 -09 39 36.1 4 1.21 2.92 WS Pds GSC SPC N2378 07 27 24.10 +33 49 53.2 2 1.76 0.71 HC HCds N2378 nw* 07 27 24.00 +33 49 56.2 1 HCds N2378 se* 07 27 24.41 +33 49 50.5 1 HCds N2379 07 27 26.284 +33 48 41.76 6 1.48 0.97 HC KHJ SBG1 HCds KEBA CCA N2380=N2382 07 23 54.9 -27 31 43 2 6.59 1.41 WS ESOB N2381 07 19 57.4 -63 04 01 2 0.48 2.12 ESOB WS N2382=N2380 07 23 54.9 -27 31 43 2 6.59 1.41 WS ESOB N2383 07 24 40 -20 56.9 2 9.91 0.00 BSV ESOB N2384 07 25 10 -21 01.3 2 19.81 8.49 ESOB BSV N2385 07 28 28.25 +33 50 16.1 5 1.27 1.48 SBG1 GSC WS UZC HC N2386 07 28 38.1 +33 46 28 3 1.44 3.51 GSCm HC WS N2387 n knot 07 28 57.4 +36 52 53 1 HCo N2387 sw knot 07 28 57.23 +36 52 36.6 2 0.42 0.14 SBG1 HCo N2387nw 07 28 57.93 +36 52 46.3 4 1.03 1.22 WS UZC GSC SBG1 N2387se 07 28 59.3 +36 52 27 1 HCo N2388 07 28 53.42 +33 49 07.2 7 2.45 1.02 MB WS HC UZC CCA SBG1 GSC N2389 07 29 04.83 +33 51 37.8 8 1.24 1.98 GSC UZC K08 DC WS SBG1 CCA HC N2390 07 29 04.21 +33 50 11.1 3 0.57 1.31 HC WS GSC N2391 07 29 07.52 +33 49 32.0 2 0.70 1.91 GSC WS N2392 07 29 10.762 +20 54 41.60 5 1.06 2.76 DKM1 PPM GSC Ty2 CK N2393 07 30 04.91 +34 01 38.3 6 2.15 1.80 UZC HC CCA WS SBG1 K08 N2394 07 28 36 +07 05.2 1 BSV N2395 07 27 12 +13 36.5 1 BSV N2396 07 28.0 -11 43 1 BSV N2397 07 21 20.2 -69 00 06 2 5.34 0.00 WS ESOB N2397A 07 21 07.9 -69 06 58 2 0.00 2.12 ESOB WS N2397B 07 21 55.86 -68 50 45.4 3 2.30 1.32 HCds WS ESOB N2398 07 30 16.24 +24 29 15.8 5 1.35 1.52 HCds WS GSC Pds HCo N2398 comp1 07 30 16.45 +24 29 13.6 1 HCds N2398 comp2 07 30 13.60 +24 29 29.5 4 0.20 1.89 WS HCo IPds HCds N2399 07 29 50.0 -00 12 51 2 3.18 0.71 WS HCm N2400 07 29 55.0 -00 12 52 2 2.12 0.71 HCm WS N2401 07 29 24 -13 58.0 1 BSV N2402ne 07 30 47.85 +09 39 11.9 5 1.23 0.89 HCo WS UZC HCds CCA N2402sw 07 30 46.51 +09 38 48.8 7 0.98 1.09 HCo Pds WS UZC GSC HCds CCA N2403 07 36 51.05 +65 36 06.9 8 4.44 3.94 HC2m CCA WS HCds HCrs UZC GHD1 HC N2404 07 37 06.88 +65 36 38.4 3 0.85 0.71 GSC HC2m HCds N2405 07 32 13.9 +25 54 21 4 1.91 1.83 WS UZC Pds HCo N2405 comp 07 32 15.0 +25 54 18 1 WS N2406 07 31 47.718 +18 17 15.65 4 1.27 1.25 Pds2 KHJ GSC UZC N2407 07 31 56.678 +18 19 58.54 6 0.71 0.65 Pds Pds2 KHJ GSC UZC CCA N2408 07 40.5 +71 40 1o JH N2409 07 31 37.4 -17 11 39 2 13.18 19.80 BSV WS N2410 07 35 02.30 +32 49 21.0 6 1.37 2.80 WS DC UZC BPP SBG1 CCA N2411 07 34 36.30 +18 16 52.9 5 0.60 0.09 Pds UZC CCA GSC WS N2412 07 34 21.50 +08 32 50.2 2 0.52 2.55 GSC WS N2413 07 33 16 -13 05.7 1 HCo N2414 07 33 12 -15 27.2 1 BSV N2415 07 36 56.56 +35 14 31.5 7 2.13 1.93 GHD1 WS SBG1 KEBA CCA UZC DC N2416 07 35 41.59 +11 36 43.9 4 3.92 3.50 WS UZC CCA DC N2417 07 30 11.9 -62 15 07 2 2.97 3.54 ESOB WS N2418 07 36 37.58 +17 53 02.3 4 2.50 2.50 WS CCA UZC DC N2419 07 38 08.46 +38 52 53.8 2 0.82 1.63 HCrs SW N2420 07 38 23 +21 34.4 1 BSV N2421 07 36 13 -20 36.7 2 29.80 0.00 BSV ESOB N2422=N2478 07 36 35 -14 29.0 1 BSV N2423 07 37 06 -13 52.3 1 BSV N2424 07 40 39.43 +39 13 58.0 6 2.23 0.60 UZC WS CCA SBG1 GHD1 DC N2425 07 38 17 -14 52.7 1 BSV N2426 07 43 18.52 +52 19 05.1 5 1.09 1.79 WS UZC GSC CCA DC N2427 07 36 27.9 -47 38 08 3 0.00 3.46 ESOB GC WS N2428 07 39 21 -16 31.7 1 HCo N2428? 07 39 12.0 -16 29 59 1 WS N2429=N2429A 07 43 47.60 +52 21 25.5 6 0.75 1.13 WS HCo Pds UZC GSC CCA N2429B 07 43 51.8 +52 20 52 3 0.00 2.08 WS HCo Pds2 N2430: 07 39 41 -16 17.8 1 HCo N2430? 07 39 30.0 -16 20 44 1 WS N2431=N2436 07 45 13.568 +53 04 29.54 4 1.81 1.10 KHJ UZC CCA DC N2432 07 40 53 -19 04.6 2 0.00 42.43 ESOB BSV N2433 07 42 43.55 +09 15 34.0 1 HCds N2433 e * 07 42 43.69 +09 16 08.5 1 HCds N2433 n * 07 42 43.35 +09 15 38.6 1 HCds N2433 s * 07 42 43.36 +09 15 32.5 1 HCds N2434 07 34 51.5 -69 17 03 2 0.38 2.83 ESOB WS N2435 07 44 13.56 +31 39 02.7 5 2.13 2.60 WS DC UZC CCA BPP N2436=N2431 07 45 13.568 +53 04 29.54 4 1.81 1.10 KHJ UZC CCA DC N2437 07 41 46 -14 48.6 1 BSV N2438 07 41 50.45 -14 44 06.6 5 1.02 2.59 GSC DKM1 CK UB10 SL N2439 07 40 45 -31 41.6 2 9.04 4.24 BSV ESOB N2440 07 41 55.32 -18 12 31.2 7 2.56 0.75 ESOB BASm GSC GSCA CK WS DKM1 N2441 07 51 54.71 +73 00 55.3 5 0.51 2.33 WS DC CCA GSC UZC N2442 07 36 19 -69 32.5 1 HCds N2442/3 07 36 23.75 -69 31 49.8 6 0.96 1.26 WS HC2m ESOB GC GSCM HCds N2443 07 36 30 -69 31.1 1 HCds N2444 07 46 53.025 +39 01 55.78 6 1.10 2.98 HCds CCA DC SBG1 KHJ GHD1 N2445 07 46 55.02 +39 00 55.4 7 2.12 3.29 DC WS HCds SBG1 CCA HHKK GHD1 N2446 07 48 39.35 +54 36 40.0 4 3.10 1.53 UZC WS CCA DC N2447 07 44 30 -23 51.4 2 19.42 21.21 BSV ESOB N2448 07 44 34.5 -24 40 51 3 19.36 24.98 BSV ESOB WS N2449 07 47 20.31 +26 55 49.6 5 1.91 2.53 BPP DC WS UZC CCA N2450 07 47 32.25 +27 01 09.3 4 1.44 0.97 BPP WS UZC GSC N2451 07 45 15 -37 58.0 1 ESOB N2452 07 47 26.20 -27 20 07.4 3 0.40 0.52 GSC GSCA CK N2453 07 47 35 -27 11.7 2 28.33 4.24 BSV ESOB N2454 07 50 35.07 +16 22 08.7 6 2.30 3.07 WS UZC KEBA CCA MB MB N2455 07 49 01 -21 18.1 2 49.45 16.97 BSV ESOB N2456 07 54 10.72 +55 29 41.3 5 0.87 1.64 UZC GSC DC WS CCA N2457 07 54 45.695 +55 32 47.75 2 0.39 0.13 GSC KHJ N2458 07 55 51.38 +56 42 36.0 2 0.81 3.54 WS GSC N2459 07 52 02.6 +09 33 26 2 16.73 0.00 BSV WS N2460 07 56 52.59 +60 20 57.8 5 1.53 2.19 CCA UZC GHD1 WS DC N2461 07 56 26.26 +56 40 23.9 1 HCds N2462 07 56 32.05 +56 41 13.4 4 0.85 2.39 WS UZC HCds GSC N2463 07 57 12.39 +56 40 35.8 5 1.37 1.46 WS KEBA GSC UZC HCds N2464 07 57 32.7 +56 41 26 1 HCds N2464 e* 07 57 35.25 +56 41 37.7 1 HCds N2464 m* 07 57 32.84 +56 41 21.2 1 HCds N2464 w* 07 57 29.68 +56 41 16.3 1 HCds N2465 07 57 26.10 +56 49 20.9 1 HCds N2466 07 45 15.5 -71 24 35 2 1.02 6.36 ESOB WS N2467 07 52 26 -26 26.2 2 57.05 33.94 ESOB BSV N2468 07 58 02.35 +56 21 32.7 4 1.08 1.75 WS UZC CCA GHD1 N2468 comp 07 58 01.18 +56 21 05.7 1 CCA N2469 07 58 03.45 +56 40 49.0 7 3.40 2.15 KEBA WS GHD1 CCA GSC UZC DC N2470 07 54 20.52 +04 27 34.3 4 2.24 1.00 DC WS CCA UZC N2471 07 58 33.0 +56 46 34 1 HCds N2471 nw* 07 58 32.46 +56 46 40.6 1 HCds N2471 se* 07 58 33.36 +56 46 29.2 1 HCds N2472 07 58 41.75 +56 42 03.8 4 0.78 1.68 WS UZC GSC Pds N2473 07 55 34.88 +56 44 09.1 1 GSC N2474 07 57 59.04 +52 51 24.9 4 2.53 1.64 WS GHD1 CCA DC N2475 07 58 00.549 +52 51 42.03 5 1.89 1.28 UZC KHJ GHD1 CCA DC N2476 07 56 45.25 +39 55 40.8 5 2.08 2.17 SBG1 WS UZC CCA DC N2477 07 52 10 -38 31.8 2 8.31 12.73 BSV ESOB N2478=N2422 07 36 35 -14 29.0 1 BSV N2479 07 55 06 -17 42.6 2 10.11 12.73 BSV ESOB N2480 07 57 10.52 +23 46 45.5 4 0.65 0.80 UZC GSC CCA WS N2481 07 57 13.67 +23 46 01.8 5 3.25 1.42 DC WS GSC Pds CCA N2482 07 55 12 -24 15.5 2 48.40 16.97 BSV ESOB N2483 07 55 39 -27 53.7 2 18.77 38.18 BSV ESOB N2484 07 58 28.11 +37 47 11.8 7 0.73 1.92 RC2 WS UZC KEBA GPB SBG1 CCA N2485 07 56 48.70 +07 28 38.4 4 0.15 1.50 WS DC UZC CCA N2486 07 57 56.17 +25 09 38.3 5 3.40 1.29 UZC Pds WS DC CCA N2487 07 58 20.37 +25 08 56.9 4 2.87 1.65 DC WS UZC CCA N2488 08 01 46.02 +56 33 11.8 4 3.46 3.40 WS UZC CCA DC N2489 07 56 15 -30 03.8 2 9.19 8.49 ESOB BSV N2490 07 59 17.9 +27 04 38 3 0.00 1.00 WS BPP UZC N2491: 07 58 27.33 +07 58 59.1 3 1.96 1.57 HCo Pds HCrs N2491? 07 58 13.82 +08 08 59.0 2 1.36 1.06 HCo HCrs N2491?? 07 58 25.55 +08 08 38.6 2 0.10 0.57 HCo HCrs N2492 07 59 29.73 +27 01 33.6 4 1.07 0.83 WS BPP UZC CCA N2493 08 00 23.75 +39 49 49.8 5 0.85 1.37 UZC SBG1 DC WS CCA N2494=I0487 07 59 07.07 -00 38 17.4 5 1.34 0.87 UZC CCA SPC DC WS N2495 08 00 33.21 +39 50 22.5 4 0.48 2.22 WS GSC SBG1 SDP N2496 07 58 37.40 +08 01 42.9 5 0.41 2.67 GSC HCrs CCA WS UZC N2497 08 02 11.21 +56 56 31.4 4 2.31 1.79 UZC CCA WS DC N2498 07 59 38.79 +24 58 57.3 4 1.48 0.83 DC WS UZC CCA N2499 07 58 51.7 +07 29 33 3 0.00 2.52 WS UZC HCo N2500 08 01 53.22 +50 44 14.8 6 2.01 2.88 WS UZC HCds CCA GHD1 DC N2501 07 58 30.1 -14 21 17 2 1.03 2.12 WS SPC N2502 07 55 51.8 -52 18 26 2 3.90 0.00 WS ESOB N2503 08 00 36.75 +22 23 58.9 4 0.84 1.23 GSC UZC CCA WS N2504 07 59 52.31 +05 36 28.2 4 2.15 2.20 CCA WS UZC DC N2505 08 04 06.962 +53 32 56.67 4 1.77 0.38 KHJ UZC CCA DC N2506 08 00 01 -10 46.2 1 BSV N2507 08 01 37.24 +15 42 35.3 5 1.62 1.32 WS UZC CCA GH DC N2508 08 01 57.26 +08 33 06.7 4 2.53 2.17 WS UZC CCA DC N2509 08 00 48 -19 03.1 2 10.03 8.49 BSV ESOB N2510 08 02 10.60 +09 29 09.1 5 1.74 0.93 WS Pds UZC GSC CCA N2511 08 02 15.05 +09 23 40.4 4 2.14 0.85 UZC WS GSC KEB1 N2512 08 03 07.63 +23 23 28.9 4 4.21 1.42 DC WS UZC CCA N2513 08 02 24.79 +09 24 47.6 7 2.19 1.22 GSC WS UZC CCA Pds DC KEB1 N2514 08 02 49.73 +15 48 28.4 4 0.29 1.89 CCA WS DC UZC N2515 08 03 21.3 +20 11 15 2 0.00 1.41 WS GSCm N2516 07 58 04 -60 45.2 2 26.02 0.00 ESOB BSV N2517 08 02 47.198 -12 19 05.72 2 2.78 2.07 KHJ SPC N2518 08 07 20.298 +51 07 53.33 5 1.19 0.78 UZC GSC KHJ CCA DC N2519 08 07 58.84 +51 07 41.9 1 GSC N2520=N2527 08 04 58 -28 08.8 1 ESOB N2520? 08 02 36.0 -28 10 59 1 WS N2521 08 08 49.48 +57 46 10.1 6 1.91 1.16 GSC GHD1 UZC WS CCA DC N2522 08 06 13.46 +17 42 23.7 4 1.20 1.68 UZC CCA WS DC N2523 08 14 59.98 +73 34 44.2 5 1.98 2.70 DC WS UZC GHD1 CCA N2523A 08 04 08.49 +74 02 52.1 4 0.77 1.25 WS GHD1 CCA UZC N2523B 08 12 56.59 +73 33 47.4 3 1.76 1.03 UZC GHD1 CCA N2523C 08 17 44.524 +73 19 03.98 4 1.79 1.84 UZC KHJ CCA GHD1 N2524 08 08 09.63 +39 09 26.6 6 0.98 1.55 SBG1 UZC WS GSC CCA DC N2525 08 05 37.9 -11 25 41 3 3.89 0.58 GHD2 WS SPC N2526 08 06 58.57 +08 00 14.0 4 1.43 0.88 WS CCA UZC GSC N2527=N2520 08 04 58 -28 08.8 1 ESOB N2528 08 07 25.09 +39 11 39.7 5 2.44 1.67 GSC UZC WS CCA DC N2529 08 06 57.3 +17 49 43 1o Big N2530 08 07 55.63 +17 49 05.4 4 0.68 1.47 UZC CCA GSC WS N2531 08 07 55.7 +17 50 03 1o Big N2532 08 10 15.15 +33 57 25.1 6 2.59 3.08 GHD1 DC SBG1 WS CCA UZC N2533 08 07 04 -29 53.0 1 ESOB N2534 08 12 54.07 +55 40 18.4 4 0.83 1.69 GHD1 WS UZC CCA N2535 08 11 13.49 +25 12 24.3 7 2.16 2.28 DC UZC K04 HHKK WS CCA GH N2536 08 11 16.1 +25 10 45 5 0.61 1.64 UZC WS K04 Pds2 GH N2537 08 13 14.67 +45 59 30.2 8 3.16 2.68 WS UZC HCds SBG1 CCA DC GHD1 SDP N2537A 08 13 40.98 +45 59 36.9 4 0.98 3.90 Pds2 GHD1 HCds WS N2538 08 11 22.94 +03 37 59.4 4 1.50 2.95 DC WS UZC CCA N2539 08 10 37 -12 49.1 1 BSV N2540 08 12 46.32 +26 21 41.2 6 4.43 1.40 DC BPP WS UZC K04 CCA N2541 08 14 40.21 +49 03 43.4 6 1.40 3.58 WS UZC SBG1 DC GHD1 CCA N2542 08 11 16.29 -12 55 37.2 2 2.07 0.49 WS SAO N2543=I2232 08 12 57.94 +36 15 15.5 9 2.07 2.85 GHD1 WS K16 GSC UZC HCo SBG1 CCA DC N2544 08 21 40.25 +73 59 17.5 4 0.40 1.42 K03 CCA WS UZC N2545 08 14 14.24 +21 21 21.5 5 1.56 2.29 WS UZC CCA GH DC N2546 08 12 15 -37 35.7 1 ESOB N2547 08 10 09 -49 12.9 2 6.95 50.91 ESOB BSV N2548 08 13 43 -05 45.0 1 BSV N2549 08 18 58.36 +57 48 09.9 5 0.94 1.09 UZC WS DC CCA GHD1 N2550 08 24 34.16 +74 00 41.3 5 1.22 3.27 WS CCA GHD1 DC UZC N2550A 08 28 39.65 +73 44 53.1 5 1.37 2.29 WS UZC Pds GHD1 CCA N2551 08 24 50.02 +73 24 45.0 6 2.02 3.12 DC GHD1 KEBA WS UZC CCA N2552 08 19 20.24 +50 00 30.5 5 1.47 3.87 SBG1 GHD1 HCds DC CCA N2553 08 17 34.99 +20 54 10.6 2 0.30 0.57 UZC GSC N2554 08 17 53.56 +23 28 17.8 4 1.36 1.45 WS DC UZC CCA N2555 08 17 56.34 +00 44 42.0 5 2.01 2.23 DC WS UZC SPC CCA N2556 08 19 00.889 +20 56 12.43 4 0.47 0.96 KHJ GSC Pds UZC N2557 08 19 10.80 +21 26 07.9 5 0.70 0.59 Pds UZC GSC CCA WS N2558 08 19 12.864 +20 30 38.47 6 2.63 2.41 Pds KHJ GSC UZC CCA MB N2559 08 17 06.1 -27 27 26 2 0.94 0.00 ESOB WS N2560 08 19 51.91 +20 59 05.8 4 0.20 0.21 CCA GSC Pds UZC N2561 08 19 36.90 +04 39 24.1 4 2.11 1.92 WS UZC DC CCA N2562 08 20 23.67 +21 07 53.4 7 1.50 1.72 WS KEBA DC GSC CCA UZC GH N2563 08 20 35.71 +21 04 04.2 5 0.81 2.37 WS UZC DC GH CCA N2564 08 18 29.932 -21 48 59.71 3 2.31 1.76 ESOB KHJ WS N2565 08 19 48.30 +22 01 50.1 7 2.37 4.43 DC WS K04 SDP UZC CCA GH N2566 08 18 45.5 -25 29 57 2 0.00 9.19 ESOB WS N2567 08 18 32 -30 38.4 2 54.84 25.46 BSV ESOB N2568 08 18 18 -37 06.3 2 0.00 0.00 BSV ESOB N2569 08 21 21.147 +20 52 02.32 4 0.57 0.52 UZC KHJ GSC Pds N2570 08 21 22.52 +20 54 38.0 5 2.99 2.64 MB GSC CCA WS UZC N2571 08 18 56 -29 45.0 2 9.22 4.24 BSV ESOB N2572 08 21 24.66 +19 08 50.3 5 1.70 1.58 MB KEBA WS UZC CCA N2573 01 41 48.3 -89 20 05 2 1.93 1.41 ESOB WS N2573A 23 12 14.4 -89 07 35 2 0.40 4.24 WS ESOB N2573B 23 07 23.6 -89 06 58 2 4.02 1.41 WS ESOB N2574 08 20 48.2 -08 55 07 2 1.05 0.00 WS SPC N2575 08 22 44.94 +24 17 48.9 5 2.33 2.29 DC K04 CCA WS UZC N2576 08 22 57.74 +25 44 19.2 5 0.82 0.99 Pds UZC GSC WS CCA N2577 08 22 43.35 +22 33 10.7 4 3.01 0.15 DC UZC WS CCA N2578 08 21 24.2 -13 19 04 3 2.23 3.79 GHD2 WS SPC N2579 08 20 52.9 -36 13 00 2 2.57 2.12 ESOB HCds N2579 se 08 20 56.8 -36 13 45 1 HCds N2580 08 21 28 -30 18.0 3 7.49 35.16 BSV ESOB HCo N2581 08 24 30.95 +18 35 48.3 5 1.10 1.33 WS HCds GSC UZC CCA N2582=I2359 08 25 12.09 +20 20 04.3 5 0.73 2.22 GSC WS UZC DC CCA N2583 08 23 07.87 -05 00 09.1 3 0.26 1.50 SPC WS GSC N2584 08 23 15.38 -04 58 13.3 3 1.50 2.53 SPC GSC WS N2585 08 23 26.21 -04 54 54.4 4 0.71 2.02 SPC GSC Pds WS N2586 08 23 31.4 -04 57 06 1 HCo N2587 08 23 25 -29 30.5 2 27.74 4.24 BSV ESOB N2588 08 23 10 -32 58.5 2 17.83 4.24 BSV ESOB N2589 08 24 29 -08 46.1 1o Sw6 N2590=I0507 08 25 01.84 -00 35 30.4 5 1.22 1.14 DC CCA SPC UZC WS N2591 08 37 25.69 +78 01 31.4 6 2.31 2.16 GHD1 HCrs WS UZC CCA DC N2592 08 27 08.09 +25 58 12.4 5 1.24 1.79 DC Pds UZC WS CCA N2593 08 26 47.84 +17 22 27.5 5 1.04 1.37 WS Pds HCds UZC CCA N2594 08 27 17.22 +25 52 42.3 4 1.15 1.25 WS UZC HCds Pds N2595 08 27 42.025 +21 28 44.45 6 3.08 1.85 DC CCA KHJ UZC MB GH N2596 08 27 26.61 +17 17 02.0 4 0.64 0.35 CCA DC UZC WS N2597 08 29 57.40 +21 30 06.8 1 GSC N2598 08 30 02.55 +21 29 19.3 6 1.12 2.07 WS MB CCA GSC UZC GH N2599 08 32 11.25 +22 33 37.2 5 0.84 0.43 WS DC K04 UZC CCA N2600 08 34 44.98 +52 42 55.1 5 1.33 1.88 WS Pds HCds UZC CCA N2601 08 25 30.3 -68 07 05 2 0.40 0.00 ESOB WS N2602 08 35 04.27 +52 49 53.0 4 0.45 1.42 UZC WS KEBA HCds N2603 08 34 31.21 +52 50 24.5 1 HCds N2604=N2604A 08 33 22.99 +29 32 17.5 7 2.15 1.29 BPP DC UZC WS HCds K15 CCA N2604B 08 33 35.67 +29 29 58.9 1 HCds N2605 08 34 53.36 +52 48 15.3 1 HCds N2606 08 35 34.38 +52 47 19.0 4 1.36 1.96 Pds UZC WS HCds N2606 comp e 08 35 37.59 +52 47 08.9 1 HCds N2606 comp w 08 35 21.41 +52 47 34.7 1 HCds N2607 08 33 56.649 +26 58 21.61 6 1.02 1.50 K04 UZC BPP KHJ K15 CCA N2608 08 35 17.27 +28 28 24.2 8 2.29 1.65 DC WS UZC BPP K15 HC2m CCA GHD1 N2609 08 29 32 -61 06.6 2 25.76 0.00 BSV ESOB N2610 08 33 23.42 -16 08 57.2 5 1.41 0.44 GSC WS CK 2MSP DKM1 N2611 08 35 29.17 +25 01 38.0 3 0.92 0.76 HCds WS UZC N2612 08 33 50.1 -13 10 30 3 1.46 3.79 WS SPC APMn N2613 08 33 22.73 -22 58 23.1 7 2.60 1.92 ESOB GC GHD2 SPC HC2m WS HCds N2614 08 42 47.86 +72 58 36.7 5 2.08 3.43 GHD1 WS UZC CCA DC N2615 08 34 33.30 -02 32 50.2 6 2.52 2.55 WS DC CCA UZC SPC APMn N2616 08 35 34.06 -01 51 02.2 5 0.66 3.96 SPC UZC WS CCA RC2 N2617 08 35 38.82 -04 05 18.8 5 1.51 2.39 IPds HCds WS APMn SPC N2618 08 35 53.509 +00 42 24.70 6 2.07 0.97 DC UZC GSC KHJ CCA SPC N2619 08 37 32.72 +28 42 19.3 5 2.24 3.81 WS DC UZC CCA BPP N2620 08 37 28.287 +24 56 47.75 4 0.52 1.16 AC WS UZC CCA N2621 08 37 36.990 +24 59 59.16 3 0.58 0.24 KHJ AC UZC N2622 08 38 10.9 +24 53 42 3 0.78 1.53 WS UZC KEB1 N2623 08 38 24.08 +25 45 15.3 6 3.00 1.33 DC HHKK JCR WS UZC GH N2623A 08 38 24.1 +25 45 01 1 DC N2623B 08 38 24.3 +25 45 17 1 DC N2624 08 38 09.613 +19 43 31.75 6 1.05 0.71 UZC KEBA DC KHJ GSC CCA N2625 08 38 23.10 +19 42 57.3 4 0.68 1.96 WS KET1 GSC UZC N2626 08 35 31 -40 40.3 1 ESOB N2627 08 37 15 -29 57.3 2 9.21 21.21 BSV ESOB N2628 08 40 22.67 +23 32 22.5 4 0.76 2.16 WS DC CCA UZC N2629 08 47 15.26 +72 59 06.7 6 2.55 1.41 GHD1 DC WS GSC UZC CCA N2630 08 47.1 +73 00 1o T9 N2631 08 47.1 +73 00 1o T9 N2632 08 40.4 +19 40 1 BSV N2633 08 48 04.76 +74 05 55.8 8 3.26 1.93 HCds CCA UZC WS HHD HCrs GHD1 DC N2634 08 48 25.42 +73 58 00.7 5 1.03 1.55 DC UZC WS CCA GHD1 N2634A 08 48 37.71 +73 56 18.5 5 1.24 1.68 Pds GHD1 CCA UZC WS N2635 08 38 26 -34 46.2 2 8.73 4.24 BSV ESOB N2636 08 48 24.435 +73 40 15.65 5 1.05 2.52 GHD1 KHJ UZC DC CCA N2637 08 41 13.42 +19 41 25.4 3 1.38 3.36 WS UZC HCds N2638 08 42 25.82 +37 13 13.6 6 0.85 1.43 Pds SBG1 WS DC UZC CCA N2639 08 43 38.039 +50 12 20.14 10 1.26 1.54 WS UZC DC AE CCR SBG1 UW CCO CCA GHD1 N2640 08 37 24.7 -55 07 26 2 0.00 0.71 ESOB WS N2641 08 47 57.477 +72 53 44.38 5 1.03 1.26 Pds UZC GSC KHJ CCA N2642 08 40 44.4 -04 07 19 4 0.75 2.45 GHD2 SPC APMn WS N2643=I2390 08 41 51.729 +19 42 07.47 3 0.02 1.77 Pds GSC KHJ N2644 08 41 31.91 +04 58 49.9 3 0.86 2.31 UZC CCA WS N2645 08 39 03 -46 13.9 2 0.00 21.21 BSV ESOB N2646 08 50 22.07 +73 27 44.7 6 0.69 1.85 WS CCA UZC GHD1 DC KEBA N2647 08 42 43.100 +19 39 01.58 3 0.21 0.11 GSC KHJ UZC N2648 08 42 39.88 +14 17 07.3 4 2.21 2.63 CCA WS UZC DC N2649 08 44 08.25 +34 43 01.6 6 1.89 1.11 WS DC K01 UZC SBG1 CCA N2650 08 49 58.34 +70 17 56.0 5 2.61 2.01 DC WS Pds CCA GHD1 N2651 08 43 55.15 +11 46 14.7 3 0.75 1.18 WS HCds UZC N2652 08 43 13 -03 36.7 1o OSt2 N2653 08 54 55.6 +78 23 36 1 GSCm N2654 08 49 12.08 +60 13 14.1 5 1.81 1.59 UZC CCA WS GHD1 DC N2655 08 55 38.21 +78 13 24.1 10 1.38 1.75 WS GHD1 KHo vdH+ HHD KHr UZC DC HCrs CCA N2656 08 47 53.05 +53 52 33.8 5 0.42 1.34 GPB Pds UZC HCds WS N2657 08 45 15.95 +09 38 44.5 4 3.40 1.50 WS CCA UZC DC N2658 08 43 27 -32 39.5 2 0.00 8.49 BSV ESOB N2659 08 42 37 -44 59.0 2 67.73 84.85 BSV ESOB N2660 08 42 38 -47 12.0 2 14.46 0.00 BSV ESOB N2661 08 45 59.51 +12 37 11.6 3 0.59 3.00 WS UZC CCA N2662 08 45 32.022 -15 07 17.33 3 0.04 0.69 SPC WS KHJ N2663 08 45 08.2 -33 47 41 2 1.77 2.12 ESOB WS N2664 08 47 09.5 +12 36 10 2 51.72 14.85 BSV WS N2665 08 46 01.0 -19 18 11 3 2.83 2.08 WS SPC ESOB N2666? 08 49 47.34 +44 42 16.3 1 SAO N2667=I2410=N2667A 08 48 27.3 +19 01 08 4 1.16 1.26 WS Pds UZC HC N2667B=I2411 08 48 30.1 +19 02 34 3 2.45 1.53 HC WS UZC N2668 08 49 22.597 +36 42 36.49 4 1.04 0.85 KHJ SBG1 UZC CCA N2669 08 46 22 -52 56.9 1 ESOB N2670 08 45 30 -48 48.0 2 21.04 42.43 BSV ESOB N2671 08 46 12.9 -41 52 46 3 10.65 7.23 BSV ESOB HCds N2672 08 49 21.98 +19 04 27.8 6 2.66 1.82 WS CCA HC UZC GH DC N2673 08 49 24.348 +19 04 26.45 4 3.44 1.03 KHJ CCA HC DC N2674 08 49 13.221 -14 17 39.72 3 0.81 0.92 GSC KHJ SPC N2675 08 52 04.98 +53 37 01.1 4 0.87 1.44 UZC WS DC CCA N2676 08 51 35.631 +47 33 27.37 6 0.56 0.72 SBG1 Pds UZC KHJ CCA DC N2677 08 50 01.207 +19 00 34.92 3 2.55 0.53 HC UZC KHJ N2678 08 50 02 +11 20.3 1 BSV N2679 08 51 32.94 +30 51 53.9 6 1.58 1.65 BPP HCds WS CCA UZC DC N2680 08 51 33.5 +30 51 55 2 0.91 1.41 BPP WS N2680n 08 51 33.61 +30 51 58.7 1 HCds N2680s 08 51 33.58 +30 51 54.4 1 HCds N2681 08 53 32.81 +51 18 48.7 6 1.86 3.33 WS CCA GHD1 UZC KEBA DC N2682 08 51.3 +11 48 1 BSV N2683 08 52 41.54 +33 25 14.2 7 2.90 4.16 HC2m WS K16 HCds CCA UZC SBG1 N2684 08 54 53.95 +49 09 37.0 7 2.75 1.04 DC WS SBG1 GSC UZC HCds CCA N2685 08 55 34.76 +58 44 01.9 5 2.35 0.55 GHD1 UZC CCA WS DC N2686e=N2686B 08 55 00.53 +49 08 33.0 4 2.09 2.50 HCo WS GSC HCds N2686w=N2686A 08 54 58.83 +49 08 32.8 4 2.02 2.10 HCo WS GSC HCds N2687=N2687A 08 55 05.91 +49 09 21.8 4 1.54 2.07 HCo WS GSC HCds N2687B 08 55 04.96 +49 09 23.3 4 2.82 2.90 HCo HCds WS GSC N2688 08 55 11.629 +49 07 20.48 4 0.85 1.04 Pds KHJ GSC HCds N2689 08 55 25.36 +49 06 53.9 2 1.11 2.33 WS HCds N2690 08 52 38.12 -02 36 12.3 7 3.65 2.41 SPC APMn UZC WS CCA DC ZGT N2691 08 54 46.50 +39 32 19.2 7 2.39 1.68 WS SBG1 CCA K01 UZC SDP DC N2692 08 56 58.04 +52 03 56.7 5 1.28 1.97 WS UZC DC GHD1 CCA N2693 08 56 59.22 +51 20 47.9 4 3.10 3.68 GHD1 CCA WS DC N2694 08 56 58.938 +51 19 51.81 2 4.48 4.73 GHD1 KHJ N2695 08 54 27.1 -03 04 02 4 1.43 1.41 WS SPC UZC ZGT N2696? 08 50 42.076 -05 00 34.86 2 0.49 0.45 KHJ GSC N2697 08 54 59.3 -02 59 15 6 0.77 2.32 ZGT APMn WS SPC Pds UZC N2698 08 55 36.4 -03 11 03 6 2.05 3.56 ZGT GHD2 UZC WS SPC APMn N2699 08 55 48.83 -03 07 40.7 7 2.42 1.92 SPC UZC KEBA WS APMn HCds ZGT N2700 08 55 50.59 -03 06 59.4 2 0.11 0.49 HCds WS N2701 08 59 05.77 +53 46 13.2 5 2.81 2.28 UZC WS GHD1 CCA DC N2702 08 55 54.63 -03 03 55.2 1 HCds N2703 08 55 47.13 -03 18 24.9 1 HCds N2704=I2424 08 56 47.78 +39 22 56.3 6 2.24 2.01 WS UZC SBG1 GSC CCA DC N2705: 08 56 00.05 -03 00 53.6 1 HCds N2706 08 56 12.49 -02 33 50.4 7 2.40 2.61 WS APMn CCA UZC SPC ZGT DC N2707: 08 56 05.68 -03 03 59.1 1 HCds N2708=N2727 08 56 07.92 -03 21 37.4 7 0.70 1.91 APMn GHD2 UZC SPC WS HCds ZGT N2709 08 56 12.906 -03 14 37.08 4 1.92 2.14 UZC KHJ SPC ZGT N2710 08 59 48.50 +55 42 21.8 4 1.24 1.93 WS UZC CCA DC N2711 08 57 23.50 +17 17 15.5 4 2.30 1.34 MB WS UZC CCA N2712 08 59 30.53 +44 54 50.6 7 3.88 3.43 SBG1 GHD1 K12 UZC WS CCA DC N2713 08 57 20.55 +02 55 14.9 6 2.50 3.16 ZGT UZC WS DC CCA GH N2714 08 53 29.5 -59 13 03 2 2.73 1.41 ESOB WS N2715 09 08 06.21 +78 05 07.6 6 1.94 2.66 GHD1 WS CCA UZC HCrs DC N2716 08 57 35.87 +03 05 23.8 7 3.34 1.42 ZGT WS Pds UZC CCA GH DC N2717 08 57 01.4 -24 40 25 2 6.76 2.12 WS ESOB N2718 08 58 50.49 +06 17 34.1 5 2.08 1.54 WS UZC CCA DC FPB N2719 09 00 15.65 +35 43 39.6 9 1.80 2.42 DC SBG1 WS UZC GSC K16 GHD1 CCA HCds N2719A 09 00 16.1 +35 43 13 4 1.16 2.63 WS Pds2 GHD1 K16 N2719Am 09 00 16.02 +35 43 12.8 3 1.68 0.21 SBG1 GSC HCds N2719Anw 09 00 15.30 +35 43 17.7 1 HCds N2719As 09 00 16.25 +35 43 06.7 1 HCds N2720 08 59 08.220 +11 08 57.44 4 3.06 1.27 KHJ UZC CCA DC N2721 08 58 56.57 -04 54 08.1 5 1.34 2.10 SPC WS APMn GSC ZGT N2722=N2733 08 58 46.25 -03 42 37.6 6 3.55 2.36 APMn SPC WS GSC GHD2 ZGT N2723 09 00 14.402 +03 10 39.23 6 0.74 1.64 GH UZC KHJ CCA ZGT DC N2724 09 01 01.78 +35 45 43.9 4 0.18 1.26 WS UZC GSC CCA N2725 09 01 03.21 +11 05 49.4 4 0.98 0.85 CCA WS UZC DC N2726 09 04 56.95 +59 55 57.7 6 1.82 1.02 CCA UZC WS Pds GHD1 DC N2727=N2708 08 56 07.92 -03 21 37.4 7 0.70 1.91 APMn GHD2 UZC SPC WS HCds ZGT N2728 09 01 40.937 +11 04 58.17 3 1.10 0.36 UZC KHJ CCA N2729 09 01 28.725 +03 43 13.00 6 1.99 1.47 UZC KHJ CCA KEBA ZGT DC N2730 09 02 15.86 +16 50 17.9 5 1.88 1.64 WS Pds UZC CCA DC N2731 09 02 08.29 +08 18 02.3 4 1.71 2.78 DC WS UZC CCA N2732 09 13 25.03 +79 11 14.4 7 1.13 0.73 UZC CCA GSC DC WS GHD1 HCrs N2733=N2722 08 58 46.25 -03 42 37.6 6 3.55 2.36 APMn SPC WS GSC GHD2 ZGT N2734 09 03 01.686 +16 51 49.28 3 2.02 0.97 KHJ GSC Pds2 N2735 09 02 38.63 +25 56 04.2 5 1.07 1.28 WS DC CCA GSC UZC N2735A 09 02 41.949 +25 56 16.83 5 0.93 1.66 KHJ GSC Pds Pds2 UGCo N2736 09 00 16 -45 56.9 1 ESOB N2737 09 03 59.78 +21 54 21.7 5 2.10 1.79 WS Pds UZC CCA MB N2738 09 04 00.47 +21 58 04.5 4 3.29 1.37 DC UZC WS CCA N2739 09 06 02.76 +51 44 40.0 4 1.77 1.92 HCds Pds WS UZC N2740 09 06 04.92 +51 44 06.4 4 0.94 1.35 Pds HCds WS UZC N2741 09 03 16.61 +18 15 40.9 1 HCds N2742=N2816 09 07 33.60 +60 28 45.9 5 2.77 1.57 WS UZC CCA GHD1 DC N2742A 09 09 57.82 +62 14 49.0 4 2.16 2.52 GHD1 WS UZC CCA N2743 09 04 54.34 +25 00 14.4 5 3.46 1.91 WS CCA UZC DC STMW N2744=N2744A 09 04 39.2 +18 27 50 4 1.36 2.22 WS UZC GH DC N2744B 09 04 38.8 +18 27 26 1 DC N2745 09 04 39.334 +18 15 25.81 4 0.60 0.43 UZC KHJ GSC Pds N2746 09 05 59.56 +35 22 38.1 6 1.31 1.38 SBG1 CCA WS UZC Pds DC N2747 09 05 18.322 +18 26 30.68 4 0.21 1.63 HCds Pds UZC KHJ N2748 09 13 43.20 +76 28 31.6 7 2.37 1.13 GHD1 UZC GSC WS HCrs CCA DC N2749 09 05 21.38 +18 18 47.8 7 1.82 2.02 HCds WS GH GSC UZC CCA DC N2750 09 05 47.97 +25 26 12.0 5 0.36 1.74 CCA DC UZC WS GSC N2751 09 05 32.40 +18 15 42.8 4 0.70 1.49 Pds HCds WS UZC N2752 09 05 42.92 +18 20 22.3 5 2.76 2.03 GH WS HCds CCA UZC N2753n 09 07 08.5 +25 20 37 2 0.96 1.41 WS HCo N2753s 09 07 08.21 +25 20 28.6 5 0.74 2.23 WS HCo Pds UZC GSC N2754 09 05 11.109 -19 05 06.25 5 2.62 0.82 ESOB WS SPC GSC KHJ N2755 09 07 58.32 +41 42 31.9 5 0.60 3.26 SBG1 WS UZC DC CCA N2756 09 09 01.08 +53 50 55.7 5 2.46 1.99 WS CCA UZC Pds DC N2757? 09 05 25.80 -19 02 54.0 2 0.70 2.62 GSC ESOB N2757?? 09 05 23.1 -19 02 04 2 6.02 3.54 HC WS N2758 09 05 31.11 -19 02 35.1 4 2.60 2.22 ESOB WS GSC SPC N2759 09 08 37.36 +37 37 16.2 5 0.99 1.35 WS UZC SBG1 DC CCA N2760 09 15 41 +76 22.9 1o Sw6 N2760?? 09 24 13.6 +76 31 52 1 HCrs N2761 09 07 30.73 +18 26 04.8 3 0.97 1.67 WS UZC HCds N2762 09 09 54.48 +50 25 06.0 3 0.58 2.10 WS Pds VPS N2763 09 06 49.1 -15 30 00 4 1.45 2.22 WS SPC APMn GHD2 N2764 09 08 17.48 +21 26 36.9 5 0.79 2.86 WS DC UZC GH CCA N2765 09 07 36.61 +03 23 33.2 6 1.70 3.63 DC WS ZGT GSC CCA UZC N2766 09 08 47.55 +29 51 53.2 4 1.32 1.10 WS UZC BPP CCA N2767 09 10 11.901 +50 24 04.83 6 0.71 0.86 DC KHJ VPS Pds UZC CCA N2768 09 11 37.44 +60 02 13.3 7 0.57 2.46 WS GHD1 HCo CCA HC2m UZC HCds N2769 09 10 32.22 +50 25 59.7 5 0.53 1.33 VPS UZC CCA DC WS N2770 09 09 33.57 +33 07 24.9 7 2.09 1.11 DC WS GHD1 K11 GSC UZC CCA N2770 knot 09 09 33.41 +33 07 40.4 1 SBG1 N2770B 09 09 19.7 +33 07 21 1 HCm N2770Bnw 09 09 19.4 +33 07 24 1 HCo N2770Bse 09 09 20.0 +33 07 18 1 HCo N2771 09 10 39.74 +50 22 45.7 5 0.25 2.90 VPS WS DC UZC CCA N2772 09 07 41.8 -23 37 16 2 0.00 2.12 ESOB WS N2773 09 09 44.260 +07 10 24.83 4 1.00 1.03 KHJ UZC CCA DC N2774 09 10 39.93 +18 41 46.7 3 0.86 1.18 WS UZC GSC N2775 09 10 20.23 +07 02 15.6 5 2.08 3.23 WS GH CCA UZC DC N2776 09 12 14.53 +44 57 16.9 8 2.62 2.15 SBG1 GHD1 WS K12 UZC HCds CCA DC N2777 09 10 41.890 +07 12 23.25 5 1.72 0.47 GH KHJ CCA UZC DC N2778 09 12 24.43 +35 01 38.6 5 1.08 0.57 CCA UZC SBG1 WS DC N2779 09 12 28.28 +35 03 11.9 2 0.26 0.57 SBG1 WS N2780 09 12 44.32 +34 55 31.6 6 2.38 2.18 K11 WS UZC SBG1 CCA DC N2781 09 11 27.6 -14 49 00 4 2.18 2.87 APMn SPC WS GHD2 N2782 09 14 05.189 +40 06 49.52 13 1.91 1.92 WS dBW vdK1 vdH+ CCR WW UZC GHD1 K07 CCA SBG1 DC CCO N2783=N2783A 09 13 39.54 +29 59 34.6 7 1.79 1.55 WS CCA HKA UZC BPP Pds DC N2783B=I2449 09 13 32.83 +29 59 58.8 4 1.86 0.54 HKA UZC GSC CCA N2784 09 12 19.41 -24 10 20.5 5 1.59 1.95 GSCM GHD2 WS HC2m HCds N2785 09 15 15.42 +40 55 03.1 5 2.20 1.43 WS UZC CCA SBG1 STMM N2786 09 13 35.9 +12 26 25 1 DC N2787 09 19 18.75 +69 12 11.1 5 1.51 0.55 WS UZC DC CCA GHD1 N2788 09 09 03.4 -67 55 57 3 0.87 0.58 ESOB WS Pds N2788A 09 02 40 -68 13.6 1 ESOB N2788B 09 03 36.1 -67 57 59 2 8.83 1.41 WS ESOB N2789 09 14 59.73 +29 43 48.1 5 1.44 1.06 BPP WS UZC CCA DC N2790 09 15 02.826 +19 41 49.96 4 0.79 1.05 KHJ KEB1 UZC KEBA N2791 09 15 02.005 +17 35 33.14 2 0.33 1.68 KHJ HCds N2792 09 12 26.68 -42 25 41.1 3 2.50 0.40 GSC GSCA ESOB N2793 09 16 46.78 +34 25 51.0 7 5.29 2.86 CCA GHD1 DC WS UZC K11 SBG1 N2794 09 16 01.77 +17 35 22.7 4 0.82 3.52 WS DC UZC CCA N2795 09 16 03.91 +17 37 41.6 4 3.05 2.81 WS UZC CCA DC N2796 09 16 41.819 +30 54 56.59 4 0.23 1.36 UZC BPP CCA KHJ N2797 09 16 21.73 +17 43 37.7 4 0.50 2.78 WS UZC DC CCA N2798 09 17 22.89 +41 59 59.8 10 1.05 1.96 K07 UZC SBG1 vdH+ HHKK WS K12 DC CCA GHD1 N2799 09 17 31.18 +41 59 38.1 7 1.79 2.96 WS SBG1 K07 GHD1 CCA K12 DC N2800 09 18 35.35 +52 30 49.9 4 3.24 2.51 WS UZC CCA DC N2801 09 16 44.18 +19 56 04.5 4 1.15 3.57 HCo WS CCA MB N2802 09 16 41.339 +18 57 47.75 4 2.79 1.38 DC KHJ UZC CCA N2803 09 16 43.71 +18 57 15.0 3 3.45 1.22 DC WS CCA N2804=I2455 09 16 49.91 +20 11 54.0 5 1.72 1.54 DC WS CCA GSC UZC N2805 09 20 20.52 +64 06 11.3 6 1.58 3.76 WS UZC DC GSC CCA GHD1 N2806 09 16 56.77 +20 04 14.2 2 0.30 0.28 GSC HCds N2807 09 17 00.67 +20 02 09.5 3 0.74 1.76 GSC WS HCds N2808 09 12 02.61 -64 51 49.9 2 0.45 5.30 SW ESOB N2809 09 17 06.84 +20 04 10.5 6 2.64 2.57 DC WS UZC CCA GSC HCds N2810=N2810A 09 22 04.49 +71 50 37.9 5 0.32 2.17 Pds UZC WS DC CCA N2810B 09 21 58.1 +71 52 05 1 HCo N2811 09 16 11.2 -16 18 47 4 2.16 1.26 GHD2 WS SPC APMn N2812 09 17 40.80 +19 55 07.5 4 0.00 0.64 Pds WS UZC GSC N2813 09 17 45.434 +19 54 23.54 5 0.52 0.53 UZC CCA GSC KHJ Pds N2814 09 21 11.82 +64 15 05.4 5 3.60 1.49 WS UZC CCA GHD1 DC N2815 09 16 19.5 -23 38 02 3 0.79 2.08 WS ESOB GHD2 N2816=N2742 09 07 33.60 +60 28 45.9 5 2.77 1.57 WS UZC CCA GHD1 DC N2817 09 17 10.6 -04 45 12 3 0.00 1.53 WS SPC APMn N2818 09 16 01.50 -36 37 36.9 3 0.64 0.64 GSC CK KRL N2818 OC 09 16 09 -36 37.1 1 BSV N2819 09 18 09.38 +16 11 52.7 4 0.69 2.63 UZC CCA WS DC N2820 09 21 46.10 +64 15 29.7 5 3.49 1.88 GHD1 CCA HCds WS DC N2820A=I2458 09 21 30.08 +64 14 16.8 5 1.39 2.55 HCds SDP WS UZC GHD1 N2821 09 16 47.7 -26 49 00 2 1.90 1.41 ESOB WS N2822 09 13 50.04 -69 38 42.2 4 1.70 1.80 ESOB WS HCds HC2m N2823 09 19 17.39 +34 00 28.0 7 1.73 2.15 RC2 GrV WS SBG1 HCds CCA MB N2824 09 19 02.32 +26 16 10.3 6 1.33 1.70 DC CCA RC2 WS UZC SDP N2825 09 19 22.55 +33 44 32.5 6 3.20 3.14 WS GSC HCds UZC SBG1 GHD1 N2826 09 19 24.19 +33 37 25.7 6 0.69 1.87 WS GSC HCds SBG1 UZC CCA N2827=I2460 09 19 18.94 +33 52 50.2 3 0.25 1.66 WS SBG1 HCds N2828 09 19 34.823 +33 53 17.32 3 0.12 0.99 SBG1 KHJ HCds N2829: 09 19 52.32 +33 38 59.9 1 HCds N2829? 09 19 38.45 +33 39 12.9 2 0.18 1.13 HCds GSC N2829?? e 09 19 30.95 +33 38 51.0 3 2.36 1.62 WS HCo HCds N2829?? w 09 19 30.26 +33 38 54.0 3 1.30 1.67 HCo HCds Pds2 N2830 09 19 41.42 +33 44 16.3 7 2.88 2.46 WS SBG1 GSC CCA HCds UZC GHD1 N2831 09 19 45.63 +33 44 40.2 5 3.36 2.34 SBG1 GSC HCds WS GHD1 N2832 09 19 46.84 +33 44 59.0 6 0.40 1.52 WS UZC HCds GSC SBG1 CCA N2833 09 19 57.79 +33 55 38.2 3 0.57 2.03 SBG1 WS HCds N2834 09 20 02.51 +33 42 37.0 4 0.26 1.24 SBG1 GSC HCds WS N2835 09 17 52.76 -22 21 17.9 6 2.60 5.20 GHD2 WS HCds GC ESOB HC2m N2836 09 13 45.0 -69 20 02 2 2.65 3.54 ESOB WS N2837 09 18 23.40 -16 28 54.5 2 0.71 0.49 HCds WS N2838 09 20 43.052 +39 18 57.19 3 0.59 0.80 UZC KHJ SBG1 N2839 09 20 36.29 +33 39 02.7 4 0.16 0.87 HCds WS UZC SBG1 N2840 09 20 52.72 +35 22 04.9 4 1.54 1.29 SBG1 WS UZC CCA N2841 09 22 02.510 +50 58 35.46 6 2.54 2.48 CCA WS UJ10 HCds HC2m NH N2842 09 15 36.5 -63 04 12 3 0.79 2.65 ESOB WS Pds N2843 09 20 28.76 +18 55 33.6 4 0.45 1.39 WS Pds2 GSC HCds N2844 09 21 47.94 +40 09 04.4 7 1.67 1.49 GHD1 Pds UZC DC WS SBG1 CCA N2845 09 18 36.9 -38 00 38 2 0.00 3.53 ESOB WS N2846 09 19 40.47 -14 40 34.6 1 GSC N2847 09 20 08.6 -16 31 04 2 1.02 1.41 HCo WS N2848 09 20 09.7 -16 31 32 4 1.38 1.41 APMn SPC GHD2 WS N2849 09 19 23 -40 31.4 2 8.09 12.73 BSV ESOB N2850 09 20 57.008 -04 56 25.13 2 0.01 1.11 KHJ SPC N2851 09 20 30.3 -16 29 44 4 4.48 2.52 HCo APMn WS SPC N2852 09 23 14.467 +40 09 49.53 6 2.14 1.77 DC GHD1 Pds KHJ SBG1 CCA N2853 09 23 17.33 +40 11 59.3 5 1.98 0.67 GHD1 WS UZC CCA SBG1 N2854 09 24 03.00 +49 12 13.9 7 1.04 1.22 WS DC SBG1 CCA Pds UZC HC2m N2855 09 21 27.4 -11 54 36 4 1.47 1.83 GHD2 SPC APMn WS N2856 09 24 16.22 +49 14 55.1 6 2.74 1.50 K03 UZC WS SBG1 CCA DC N2857 09 24 37.77 +49 21 23.6 5 1.44 2.06 SBG1 WS CCA UZC DC N2858 09 22 54.936 +03 09 24.49 4 0.90 0.51 DC CCA UZC KHJ N2859 09 24 18.65 +34 30 47.4 6 1.67 1.53 SBG1 WS UZC CCA GHD1 DC N2860 09 24 53.28 +41 03 35.3 4 0.53 1.46 WS UZC SBG1 CCA N2861 09 23 36.44 +02 08 11.6 6 2.74 3.00 DC APMn WS SPC CCA UZC N2862 09 24 55.17 +26 46 31.3 4 1.67 4.27 WS UZC DC CCA N2863=N2869 09 23 36.5 -10 26 00 2 1.04 0.71 WS SPC N2864 09 24 15.37 +05 56 25.6 3 1.38 4.01 HCds WS UZC N2865 09 23 30.3 -23 09 39 2 1.95 3.54 WS Pds N2866 09 22 06 -51 06.2 2 13.38 0.00 BSV ESOB N2867 09 21 25.23 -58 18 41.8 5 2.47 3.29 ESOB WS GSC GSCA DKM2 N2868 09 23 27.222 -10 25 46.60 2 0.04 0.58 SPC KHJ N2869=N2863 09 23 36.5 -10 26 00 2 1.04 0.71 WS SPC N2870 09 27 53.84 +57 22 33.5 4 3.11 3.68 UZC WS CCA DC N2871 09 25 39.4 +11 26 36 1 HCo N2872 09 25 42.68 +11 25 55.6 7 2.43 1.21 GH GSC Pds UZC CCA WS DC N2873 09 25 48.495 +11 27 14.63 4 0.71 0.48 HCo KHJ Pds Pds2 N2874 09 25 47.54 +11 25 29.6 6 3.01 1.53 GSC UZC CCA GH DC WS N2875 09 25 48.8 +11 25 53 1 HCo N2876 09 25 13.9 -06 43 01 3 3.44 0.58 SPC WS Pds2 N2877 09 25 47.02 +02 13 43.3 5 1.26 1.47 SPC UZC GSC WS KEBA N2878 09 25 47.459 +02 05 22.08 5 0.40 0.55 GSC KHJ SPC UZC CCA N2879 09 25 22.54 -11 39 07.4 2 0.52 2.76 HCds WS N2880 09 29 34.82 +62 29 26.7 5 1.79 3.24 UZC WS CCA DC GHD1 N2881nw 09 25 53.8 -11 59 32 3 1.70 2.00 HCo WS SPC N2881se 09 25 54.7 -11 59 46 3 1.70 0.58 SPC WS HCo N2882 09 26 36.02 +07 57 13.5 3 2.27 1.04 WS CCA UZC N2883 09 25 18.4 -34 06 10 2 0.00 1.41 ESOB WS N2884 09 26 24.4 -11 33 19 4 1.47 3.70 RC2 SPC WS APMn N2885=I0538 09 27 18.36 +23 01 11.2 3 2.00 1.82 Pds CCA GSC N2886 09 26 38.7 -21 44 17 2 0.00 2.12 HCds WS N2887 09 23 24.2 -63 48 44 2 0.94 1.41 ESOB WS N2888 09 26 19.6 -28 02 09 3 0.00 1.73 ESOB RC2 WS N2889 09 27 12.5 -11 38 34 4 2.94 3.32 GHD2 APMn SPC WS N2890 09 26 29.8 -14 31 45 2 0.00 0.71 WS SPC N2891 09 26 56.6 -24 46 58 2 0.00 1.41 ESOB WS N2892 09 32 53.10 +67 37 01.4 5 1.36 1.94 WS UZC CCA GHD1 DC N2893 09 30 16.93 +29 32 23.7 7 1.33 0.85 SDP BPP WS UZC K04 CCA DC N2894 09 29 30.21 +07 43 04.9 4 2.48 1.43 DC WS CCA UZC N2895 09 32 24.90 +57 28 57.4 4 1.18 0.70 WS Pds HCds UZC N2896 09 30 16.905 +23 39 46.07 4 0.80 1.23 HCds UZC KHJ Pds N2897 09 29 45.745 +02 12 24.13 3 0.74 1.02 GSC KHJ SPC N2898 09 29 46.308 +02 03 50.27 5 0.22 1.22 ZGT SPC UZC GSC KHJ N2899 09 27 03.11 -56 06 21.3 5 1.81 1.82 WS GSC GSCA ESOB DKM2 N2900 09 30 15.11 +04 08 37.1 5 1.39 1.86 WS CCA GSC Pds UZC N2901 09 32.6 +31 06 1o OSt1 N2901? 09 32 19.2 +31 07 09 1 WS N2902 09 30 52.9 -14 44 08 5 0.65 1.58 Pds GHD2 APMn SPC WS N2903 09 32 09.99 +21 30 03.8 12 2.12 2.35 DC CCA UZC GSCM WWB GSC vdK2 VPD SPC HHKK HC2m vdH+ N2904 09 30 16.9 -30 23 03 3 0.00 3.21 ESOB Pds WS N2905 09 32 11.9 +21 31 04 1 HCds N2906 09 32 06.31 +08 26 30.7 4 1.40 2.14 UZC WS CCA DC N2907 09 31 36.62 -16 44 09.2 3 0.33 2.10 GSC SPC APMn N2908 09 43 31.91 +79 42 03.1 5 2.75 1.71 WS UZC CCA HCrs DC N2909 09 36 59.9 +65 56 26 1 HCds N2909ne 09 37 00.56 +65 56 31.0 1 HCds N2909sw 09 36 59.26 +65 56 20.9 1 HCds N2910 09 30 30 -52 55.1 2 19.28 21.21 BSV ESOB N2911 09 33 46.25 +10 09 09.3 7 2.61 1.32 UZC CCA GSC HCds GH WS DC N2911 comp 09 33 51.30 +10 09 31.9 4 1.62 3.22 WS HCo HCds Pds2 N2912 09 33 56.92 +10 11 33.0 1 HCds N2913 09 34 02.76 +09 28 42.9 3 0.74 2.73 WS CCA UZC N2914 09 34 02.867 +10 06 31.49 6 2.88 2.26 GH UZC KHJ HCds CCA DC N2915 09 26 11.3 -76 37 36 3 2.27 1.15 SBC ESOB WS N2916 09 34 57.53 +21 42 19.8 3 2.90 2.31 DC CCA GH N2917 09 34 26.98 -02 30 15.3 6 1.18 1.72 SPC CCA UZC WS ZGT DC N2918 09 35 44.12 +31 42 19.3 5 2.63 2.87 WS BPP UZC CCA DC N2919 09 34 47.57 +10 17 01.5 6 2.18 1.93 Pds UZC CCA WS GH DC N2920 09 34 12.1 -20 51 34 2 0.99 0.00 WS SPC N2921 09 34 31.4 -20 55 14 3 4.05 3.06 WS ESOB SPC N2922 09 36 52.57 +37 41 38.6 7 3.46 3.46 K07 K12 UZC SBG1 CCA WS STMW N2923 09 36 03.843 +16 45 37.27 3 0.07 0.60 HCds KHJ UZC N2924 09 35 10.855 -16 23 54.31 4 0.81 1.25 KHJ GHD2 SPC WS N2925 09 33 11 -53 23.9 2 12.71 8.49 BSV ESOB N2926 09 37 31.11 +32 50 28.5 6 2.10 1.18 CCA WS UZC SBG1 DC K12 N2927 09 37 15.15 +23 35 24.6 3 0.69 1.68 WS CCA UZC N2928 09 37 10.18 +16 58 37.9 2 1.01 1.48 WS HCds N2929 09 37 29.79 +23 09 39.0 5 3.03 1.38 DC WS HCds CCA UZC N2930 09 37 32.62 +23 12 10.5 3 0.87 0.53 HCds Pds WS N2931 09 37 37.62 +23 14 25.7 3 0.71 1.68 WS HCds UZC N2932 09 35.9 -46 55 1 HCds N2933 09 37 55.04 +17 00 52.5 5 0.60 1.14 WS UZC CCA HCds Pds N2933 comp 09 37 55.89 +17 01 27.5 1 HCds N2934 09 37 55.214 +17 03 15.28 2 1.03 0.83 KHJ HCds N2935 09 36 44.8 -21 07 42 4 2.43 2.00 ESOB WS GHD2 SPC N2936 09 37 44.35 +02 45 36.6 6 3.92 2.69 WS GSC CCA UZC DC ZGT N2936n knot 09 37 44.0 +02 45 45 1 DC N2936sw knot 09 37 43.1 +02 45 11 2 2.12 4.24 UZC DC N2937 09 37 44.945 +02 44 50.81 6 1.96 0.71 ZGT DC UZC GSC KHJ CCA N2938 09 38 24.76 +76 19 08.6 4 2.12 1.25 DC WS UZC CCA N2939 09 38 07.97 +09 31 22.6 5 1.56 1.57 HCds WS CCA DC UZC N2940 09 38 05.177 +09 36 59.92 3 1.12 0.71 HCds KHJ UZC N2941 09 38 24.32 +17 02 38.7 3 0.83 1.79 Pds WS HCds N2942 09 39 07.94 +34 00 21.2 7 1.40 2.75 DC GHD1 SBG1 WS UZC CCA K12 N2943 09 38 32.95 +17 01 53.0 5 1.26 3.77 WS UZC CCA HCds DC N2944m 09 39 17.98 +32 18 37.8 4 2.11 1.56 SBG1 WS GSC UZC N2944se 09 39 19.74 +32 18 20.2 2 1.34 0.64 SBG1 HCo N2944w 09 39 16.79 +32 18 37.7 5 0.75 1.25 K04 UZC WS K12 GSC N2945 09 37 41.0 -22 02 04 2 0.98 1.41 WS Pds N2946 09 39 01.62 +17 01 29.9 3 0.50 0.76 CCA WS UZC N2947=I0547=I2494 09 36 05.82 -12 26 14.4 4 0.22 2.65 SPC WS APMn HC2m N2948 09 38 59.19 +06 57 20.4 4 0.74 3.05 UZC WS DC CCA N2949e 09 39 57.430 +16 47 13.46 2 1.43 0.89 KHJ HCds N2949w 09 39 55.236 +16 47 05.94 3 1.08 0.59 UZC KHJ HCds N2950 09 42 35.05 +58 51 03.9 4 1.45 1.25 WS GHD1 UZC CCA N2951e 09 39 40.785 -00 14 07.50 3 0.58 0.79 SPC UZC KHJ N2951e+w 09 39 40.5 -00 14 06 2 3.18 0.00 Pds ZGT N2951w 09 39 39.9 -00 14 08 2 3.18 1.41 WS SPC N2952 09 37 36.9 -10 11 01 2 5.22 5.66 HCo WS N2953 09 40 19 +14 50.0 1o JH N2954 09 40 24.21 +14 55 20.2 5 3.37 1.76 WS UZC CCA Pds DC N2955 09 41 16.59 +35 52 58.6 6 3.63 3.80 GHD1 WS UZC CCA SBG1 DC N2956 09 39 17.1 -19 06 05 3 3.76 1.00 WS SPC ESOB N2957A 09 47 15.91 +72 59 10.0 2 0.70 0.00 GSC HCo N2957B 09 47 18.088 +72 59 02.35 2 0.59 0.45 KHJ GSC N2958 09 40 41.71 +11 53 17.1 4 0.83 0.48 WS DC UZC CCA N2959 09 45 09.15 +68 35 42.2 5 2.85 3.63 GHD1 CCA WS UZC DC N2959A=N2961 09 45 22.5 +68 36 32 4 3.11 3.86 GHD1 Pds WS HCo N2960 09 40 36.48 +03 34 35.9 6 2.44 1.69 ZGT UZC CCA WS KCA DC N2961=N2959A 09 45 22.5 +68 36 32 4 3.11 3.86 GHD1 Pds WS HCo N2962 09 40 53.99 +05 09 57.5 5 1.06 2.44 UZC WS DC CCA GH N2963 09 47 50.15 +72 57 52.9 5 2.55 3.44 DC WS GSC SDP CCA N2964 09 42 54.13 +31 50 49.8 9 2.66 2.01 DC GHD1 SDP WS HHKK CCA BPP K04 UZC N2965 09 43 19.13 +36 14 52.5 5 0.65 0.71 HCds WS UZC SBG1 CCA N2965 comp 09 43 19.31 +36 14 13.4 2 0.77 1.41 HCds SBG1 N2966 09 42 11.549 +04 40 24.07 5 2.13 0.63 FPB KHJ UZC DC CCA N2967 09 42 03.49 +00 20 08.7 6 2.83 1.15 SPC WS GH UZC CCA DC N2968 09 43 11.97 +31 55 42.1 5 0.85 1.31 WS DC BPP UZC CCA N2969 09 41 54.5 -08 36 12 4 0.74 2.22 WS KEB1 SPC APMn N2970 09 43 30.887 +31 58 36.88 6 3.26 0.53 SDP HHKK BPP KHJ K04 UZC N2971 09 43 46.10 +36 10 45.3 4 0.17 0.48 WS UZC CCA SBG1 N2972=N2999 09 40 12.7 -50 19 24 3 10.02 7.57 BSV WS ESOB N2973: 09 41 34.74 -30 02 54.2 1 HCds N2973? 09 41 32.48 -30 05 25.4 1 HCds N2974 09 42 33.2 -03 41 56 6 1.99 2.50 UZC GHD2 Pds WS SPC ZGT N2975 09 41 16.044 -16 40 27.54 4 0.85 0.58 WS SPC KHJ GSC N2976 09 47 15.51 +67 54 58.8 7 1.28 2.40 GSC HC2m UZC CCA HCrs HCds GHD1 N2977 09 43 46.63 +74 51 36.9 6 0.88 3.07 GHD1 HCrs WS UZC CCA DC N2978 09 43 16.7 -09 44 45 3 2.26 1.53 GHD2 WS SPC N2979=N3050 09 43 08.6 -10 23 02 3 0.85 3.46 WS APMn SPC N2980 09 43 12.0 -09 36 46 4 0.85 1.50 SPC WS GHD2 APMn N2981 09 44 56.50 +31 05 53.3 5 2.52 3.06 MB WS UZC BPP CCA N2982 09 42 01 -44 01.2 2 22.97 33.94 BSV ESOB N2983 09 43 41.0 -20 28 39 4 2.66 1.73 ESOB GHD2 SPC WS N2984=I0556 09 43 40.38 +11 03 39.2 5 1.11 2.29 WS DC GSC UZC CCA N2985 09 50 21.55 +72 16 43.7 5 2.23 2.60 DC WS GHD1 UZC CCA N2986 09 44 16.1 -21 16 43 4 2.10 1.26 WS GHD2 ESOB SPC N2987 09 45 41.49 +04 56 30.1 4 2.63 3.12 CCA WS UZC DC N2988 09 46 47.82 +22 00 42.4 3 0.56 1.86 Pds WS HCds N2989 09 45 25.3 -18 22 26 3 0.82 2.65 SPC WS Pds N2990 09 46 17.40 +05 42 32.4 7 3.19 3.50 UZC CCA WS GH KEBA DC MB N2991 09 46 49.99 +22 00 49.8 5 2.38 3.66 DC WS HCds UZC CCA N2992 09 45 41.982 -14 19 36.50 6 1.00 1.90 GHD2 WS CCR SPC AE CCO N2993 09 45 48.4 -14 22 07 4 1.39 1.73 SPC WS APMn GHD2 N2994 09 47 16.21 +22 05 21.3 4 1.60 1.89 WS UZC DC CCA N2995 09 44.0 -54 35 1 HCe N2996 09 46 30.3 -21 34 19 3 2.42 2.65 ESOB WS SPC N2997 09 45 38.69 -31 11 26.5 5 1.25 1.00 WS GSCM GHD2 HC2m HCds N2998 09 48 43.72 +44 04 52.4 9 2.70 3.23 K12 GSC HCds CCA DC UZC WS SBG1 GHD1 N2999=N2972 09 40 12.7 -50 19 24 3 10.02 7.57 BSV WS ESOB N3000 09 48 51.27 +44 07 49.7 2 0.15 0.99 HCo HCds N3001 09 46 18.8 -30 26 16 3 3.89 1.73 WS GHD2 ESOB N3002 09 48 57.17 +44 03 24.0 2 1.90 2.62 HCo HCds N3003 09 48 35.82 +33 25 17.0 7 2.62 0.84 GHD1 UZC HCds WS DC CCA HCds N3004 09 49 02.14 +44 06 40.1 2 0.68 0.28 HCo HCds N3005 09 49 14.91 +44 07 47.2 3 0.87 2.66 Pds WS GSC N3006 09 49 17.33 +44 01 32.4 4 1.02 1.33 K12 GSC SBG1 HCds N3007 09 47 45.5 -06 26 19 3 0.00 2.31 SPC WS APMn N3008 09 49 34.16 +44 06 06.5 4 0.48 2.64 SBG1 WS UZC GSC N3009 09 50 11.07 +44 17 41.2 8 2.41 1.30 DC K12 SBG1 GSC UZC K12 WS CCA N3010A 09 50 34.592 +44 19 24.08 6 0.79 0.90 DC KHJ GSC UZC CCA KEB1 N3010B 09 50 33.18 +44 18 51.4 4 0.06 0.88 GSC CCA DC KEB1 N3010C 09 50 39.46 +44 19 50.9 4 0.72 1.96 DC GSC KEB1 CCA N3011 09 49 41.284 +32 13 14.83 10 2.66 1.25 K01 K04 KHJ VPS GSC BPP UZC K12 CCA DC N3012 09 49 52.126 +34 42 50.39 4 0.44 0.47 UZC KHJ SBG1 CCA N3013 09 50 09.392 +33 34 09.17 3 0.46 0.42 KHJ SBG1 GSC N3014 09 49 07.8 -04 44 35 2 1.06 0.71 WS SPC N3015 09 49 22.81 +01 08 41.5 7 3.28 0.95 DC ZGT SPC WS UZC KEBA CCA N3016 09 49 50.75 +12 41 41.7 5 3.01 1.28 WS UZC HCds CCA DC N3017 09 49 02.997 -02 49 20.25 4 0.76 2.66 UZC ZGT SPC KHJ N3018 09 49 41.49 +00 37 19.6 7 2.42 1.82 ZGT DC SPC GSC CCA UZC WS N3019 09 50 07.2 +12 44 43 4 0.00 1.63 SPC Pds WS UZC N3020 09 50 06.65 +12 48 48.5 7 2.18 2.69 WS UZC DC HCds GH CCA SPC N3021 09 50 57.33 +33 33 13.7 6 1.17 1.80 WS UZC DC SBG1 CCA GHD1 N3022 09 49 39.2 -05 10 00 4 0.75 0.82 APMn Pds SPC WS N3023 09 49 52.48 +00 37 08.4 9 1.85 2.73 ZGT SPC KEB1 GSC UZC GH CCA WS DC N3024 09 50 27.39 +12 45 55.7 6 1.39 2.46 WS UZC CCA SPC GH HCds N3025 09 49 28.9 -21 44 33 3 7.16 3.79 ESOB WS SPC N3026 09 50 55.18 +28 33 02.8 5 3.50 0.83 WS BPP CCA K04 UZC N3027 09 55 40.47 +72 12 12.4 6 2.67 1.69 DC WS UZC CCA GHD1 K05 N3028 09 49 54.2 -19 11 06 3 0.00 2.08 ESOB SPC WS N3029 09 48 53.83 -08 03 04.6 4 2.96 2.18 APMn SPC WS GSC N3030 09 50 10.508 -12 13 36.49 2 0.29 1.92 SPC KHJ N3031 09 55 33.2485 +69 03 56.069 9 0.73 2.12 AAS AE USNO CCR TH HC2m vdK2 DC WS N3032 09 52 08.158 +29 14 10.27 6 1.49 1.79 DC BPP KHJ CCA UZC GHD1 N3033 09 48 37 -56 25.3 2 23.62 46.67 ESOB BSV N3034 09 55 52.73 +69 40 50.3 8 5.76 4.84 CCR CCA HC2m HC2m RLT HCrs WS DC N3035 09 51 54.9 -06 49 24 3 0.00 1.73 SPC WS APMn N3036 09 49 16 -62 40.3 2 4.91 21.21 BSV ESOB N3037 09 51 23.9 -27 00 37 2 5.68 2.83 ESOB WS N3038 09 51 15.5 -32 45 14 3 3.18 3.51 WS GHD2 ESOB N3039 09 52 29.56 +02 09 14.2 7 3.19 2.81 DC WS APMn UZC CCA SPC GH N3040A 09 53 05.125 +19 25 55.41 3 0.34 0.58 KHJ UZC CCA N3040B 09 53 03.27 +19 26 30.3 3 2.78 2.57 DC WS CCA N3041 09 53 07.17 +16 40 40.0 6 1.72 3.06 DC WS SPC UZC GH CCA N3042 09 53 20.13 +00 41 51.7 6 1.76 3.17 DC UZC WS CCA ZGT SPC N3043 09 56 14.38 +59 18 24.3 6 1.84 1.64 DC GHD1 CCA WS Pds UZC N3044 09 53 40.88 +01 34 44.7 6 2.28 2.82 SPC ZGT WS GH CCA UZC N3045 09 53 17.8 -18 38 44 3 0.82 1.53 WS SPC ESOB N3046 09 53 20 -27 19.9 1o JH N3046?=N3051 09 53 58.8 -27 17 09 2 2.83 4.24 ESOB WS N3047 09 54 31.96 -01 17 29.9 4 3.36 1.37 DC ZGT CCA SPC N3047A 09 54 29.25 -01 17 20.3 2 4.67 3.46 DC CCA N3048ne 09 54 58.00 +16 27 32.4 3 0.91 1.95 WS UZC HCds N3048se 09 54 57.85 +16 27 26.1 1 HCds N3048sw 09 54 56.39 +16 27 21.2 3 1.55 1.57 Pds2 HCds WS N3049 09 54 49.68 +09 16 18.0 5 2.24 2.19 WS UZC FPB CCA DC N3050=N2979 09 43 08.6 -10 23 02 3 0.85 3.46 WS APMn SPC N3051=?N3046 09 53 58.8 -27 17 09 2 2.83 4.24 ESOB WS N3052 09 54 28.0 -18 38 21 4 0.00 2.06 ESOB GHD2 WS SPC N3053 09 55 33.68 +16 25 57.5 4 1.39 0.48 UZC WS CCA DC N3054 09 54 28.9 -25 42 10 3 1.56 3.51 WS ESOB GHD2 N3055 09 55 17.99 +04 16 10.3 3 2.30 2.50 WS CCA UZC N3056 09 54 32.8 -28 17 53 3 2.29 3.46 GHD2 WS ESOB N3057 10 05 39.26 +80 17 07.0 4 0.55 2.05 CCA UZC HCrs WS N3058n 09 53 35.2 -12 28 44 3 3.39 2.89 HCo WS SPC N3058s=I0573 09 53 36.1 -12 28 58 3 0.00 1.15 SPC WS HCo N3059 09 50 08.4 -73 55 17 3 2.32 0.58 ESOB WS GC N3060 09 56 19.32 +16 49 52.2 4 2.79 1.67 WS UZC CCA DC N3061 09 56 11.96 +75 51 56.9 6 1.23 1.51 Pds DC WS UZC CCA GHD1 N3062 09 56 35.750 +01 25 42.27 4 0.72 0.54 ZGT KHJ SPC UZC N3063 10 01 41.7 +72 07 02 2 0.64 2.12 WS GSCm N3063 n* 10 01 42.09 +72 07 09.5 1 GSC N3063 s* 10 01 41.41 +72 06 58.7 1 GSC N3064 09 55 41.5 -06 21 51 2 1.05 2.12 WS SPC N3065 10 01 54.45 +72 10 11.6 4 4.69 2.57 DC GHD1 CCA GSC N3066 10 02 10.41 +72 07 29.9 7 2.94 2.14 GHD1 DC WS SDP CCA K05 GSC N3067 09 58 21.47 +32 22 10.2 7 3.09 1.62 CCA K01 UZC GHD1 WS SBG1 DC N3068=N3068A 09 58 40.133 +28 52 38.45 6 0.68 0.39 GHD1 KHJ GSC BPP UZC CCA N3068B 09 58 38.028 +28 52 15.59 3 0.89 0.20 GHD1 KHJ GSC N3069=I0580 09 57 56.71 +10 25 56.1 5 0.45 1.62 HCds GSC Pds WS UZC N3070 09 58 06.96 +10 21 35.9 5 1.24 2.53 WS UZC HCds CCA DC N3071 09 58 53.045 +31 37 12.86 3 0.75 0.03 KHJ BPP UZC N3072 09 57 23.9 -19 21 18 3 1.42 1.53 ESOB WS SPC N3073 10 00 52.24 +55 37 05.7 5 0.96 2.07 UZC WS DC CCA GHD1 N3074 09 59 41.268 +35 23 33.49 5 0.46 1.31 KHJ CCA SBG1 MB UZC N3075 09 58 56.29 +14 25 07.2 3 0.59 0.40 UZC WS CCA N3076 09 57 37.7 -18 10 43 3 1.43 0.58 ESOB WS SPC N3077 10 03 20.46 +68 44 01.6 7 1.89 1.08 CCA HCrs UZC WS HCds GHD1 DC N3077N 10 03 19.00 +68 44 00.5 5 1.13 2.59 vdK1 HHKK HC2m GSCM HCds N3078 09 58 24.5 -26 55 34 3 2.05 0.58 WS ESOB GHD2 N3079 10 01 57.787 +55 40 50.68 10 3.38 3.38 UZC GSC GHD1 WS CCO BI CCR HHD GSCM CCA N3079se 10 01 58.29 +55 40 44.1 2 1.25 1.98 DC GSC N3080 09 59 56.00 +13 02 36.4 5 1.31 0.46 UZC WS CCA KEB1 DC N3081=I2529: 09 59 29.544 -22 49 33.92 6 0.52 1.85 WS HCds KHJ UW ESOB GHD2 N3082 09 58 52.9 -30 21 25 2 0.00 3.54 ESOB WS N3083 09 59 49.8 -02 52 41 5 3.11 2.28 WS SPC APMn UZC ZGT N3084=I2528 09 59 06.30 -27 07 42.8 4 2.35 0.96 WS Pds HCds ESOB N3085 09 59 29.1 -19 29 34 3 2.95 2.08 ESOB WS SPC N3086 10 00 10.97 -02 58 35.6 5 1.06 1.90 WS UZC SPC GSC ZGT N3087 09 59 08.7 -34 13 31 2 1.76 2.83 WS ESOB N3088=N3088A 10 01 08.390 +22 24 20.19 4 0.54 0.74 KHJ GSC UZC CCA N3088B 10 01 10.0 +22 24 03 2 0.98 0.00 WS HCo N3089 09 59 36.7 -28 19 51 4 0.76 2.22 ESOB WS GHD2 Pds N3090 10 00 30.16 -02 58 09.3 4 0.99 3.46 ZGT UZC WS GSC N3091 10 00 14.16 -19 38 11.5 6 3.18 2.93 ESOB HKA WS GSC SPC GHD2 N3092 10 00 47.37 -03 00 46.8 5 2.66 2.33 ZGT GSC APMn SPC WS N3093 10 00 53.448 -02 58 19.92 5 3.20 1.27 ZGT UZC GSC SPC KHJ N3094 10 01 25.99 +15 46 12.7 4 0.69 3.10 WS DC CCA UZC N3095 10 00 05.9 -31 33 10 3 3.39 3.00 WS GHD2 ESOB N3096 10 00 33.072 -19 39 44.09 5 2.04 1.04 ESOB GSC KHJ WS HKA N3097 10 04 16 +60 07.5 1o Harv N3098 10 02 16.83 +24 42 39.1 7 3.19 1.59 UA20 WS UZC GSCA CCA GH DC N3099=N3099A 10 02 36.545 +32 42 24.46 3 0.39 0.27 UZC KHJ SBG1 N3099B 10 02 31 +32 42.6 1 HCo N3100=N3103 10 00 40.88 -31 39 50.4 4 2.43 3.65 GHD2 WS EWSr ESOB N3101 10 01 35.36 -02 59 43.1 4 2.86 2.65 ZGT GSC SPC WS N3102 10 04 31.53 +60 06 27.3 5 3.44 1.48 DC WS UZC GSC CCA N3103=N3100 10 00 40.88 -31 39 50.4 4 2.43 3.65 GHD2 WS EWSr ESOB N3104 10 03 57.38 +40 45 24.9 5 3.45 2.45 CCA WS SBG1 UZC DC N3105 10 00 39 -54 47.3 2 0.00 0.00 BSV ESOB N3106 10 04 05.290 +31 11 07.84 6 1.74 1.42 Pds KHJ UZC BPP CCA DC N3107 10 04 22.47 +13 37 16.7 3 0.77 0.29 WS GSC UZC N3108 10 02 29.2 -31 40 35 2 3.62 2.12 WS ESOB N3109 10 03 05.6 -26 09 27 4 15.98 5.94 GHD2 GC ESOB WS N3109 bar 10 03 12.03 -26 09 28.8 4 3.78 3.25 HCds HC2m HC2m HC2m N3110=N3122=N3518 10 04 01.96 -06 28 29.9 4 2.57 2.02 APMn WS HCds SPC N3111 10 06 07.654 +47 15 45.21 5 3.20 1.59 KHJ SBG1 UZC CCA DC N3112 10 03 59.16 -20 46 55.1 3 3.17 2.65 WS GSC ESOB N3113 10 04 26.11 -28 26 38.0 4 1.31 3.11 WS HC2m ESOB GHD2 N3114 10 02 36 -60 07.2 2 69.19 55.16 ESOB BSV N3115 10 05 14.03 -07 43 07.6 5 1.99 0.98 GHD2 HC2m HCds WS SPC N3116 10 06 45.073 +31 05 52.26 4 0.13 0.65 KHJ UZC BPP KEBA N3117 10 06 10.514 +02 54 44.00 4 0.80 2.99 ZGT KHJ UZC CCA N3118 10 07 11.63 +33 01 39.9 4 0.56 0.46 K01 UZC CCA SBG1 N3119:=N3121 10 06 51.93 +14 22 24.3 8 1.25 1.61 WS GSC HC2m HCo UZC Pds CCA DC N3119? 10 06 47.864 +14 18 50.26 4 0.38 1.25 KHJ GSC Pds UZC N3120 10 05 22.8 -34 13 14 2 0.88 2.12 WS ESOB N3121=:N3119 10 06 51.94 +14 22 24.3 7 1.32 1.73 WS GSC HCo UZC Pds CCA DC N3121n=:N3119n 10 06 52.13 +14 22 32.9 3 0.25 0.55 Pds HCo HC2m N3122=N3110=N3518 10 04 01.96 -06 28 29.9 4 2.57 2.02 APMn WS HCds SPC N3123 10 07 01 +00 04.0 1o SC N3124 10 06 39.9 -19 13 19 4 2.01 1.63 ESOB SPC GHD2 WS N3125 10 06 33.3 -29 56 09 2 1.84 0.00 WS GHD2 N3126 10 08 20.77 +31 51 46.2 5 1.45 2.14 WS CCA UZC DC BPP N3127 10 06 24.8 -16 07 35 3 0.83 1.00 WS SPC APMn N3128 10 06 01.4 -16 07 22 4 0.72 0.96 APMn Pds SPC WS N3129 10 08 19.2 +18 25 50 2 1.00 0.71 WS GSCm N3130 10 08 12.36 +09 58 35.3 4 1.45 1.62 WS UZC CCA DC N3131 10 08 36.34 +18 13 50.8 4 2.13 1.15 DC WS CCA UZC N3132 10 07 01.679 -40 26 10.92 5 1.68 0.66 GSC ESOB PPM UCA1 DKM1 N3133 10 07 12.70 -11 57 55.2 3 0.93 1.36 Pds2 WS GSC N3134 10 12 29.26 +12 22 37.6 1 GSC N3135 10 10 54.43 +45 57 00.0 6 3.03 1.51 K12 SBG1 CCA WS UZC DC N3136 10 05 48.1 -67 22 39 3 0.00 0.58 ESOB GC WS N3136A 10 03 33.3 -67 26 54 2 2.05 3.54 WS ESOB N3136B 10 10 13.2 -67 00 18 2 0.00 0.71 ESOB WS N3137 10 09 07.35 -29 03 51.2 3 1.06 0.29 GSC ESOB WS N3138 10 09 16.63 -11 57 25.0 3 0.73 1.82 WS GSC Pds N3139 10 10 05.178 -11 46 43.38 3 0.74 2.88 APMn KHJ SPC N3140 10 09 27.8 -16 37 42 2 0.00 0.71 WS SPC N3141 10 09 19.863 -16 39 12.91 3 1.48 0.55 WS KHJ SPC N3142 10 10 06.4 -08 28 48 2 0.00 0.71 WS SPC N3143 10 10 03.9 -12 34 54 3 0.85 1.73 WS GHD2 SPC N3144=N3174 10 15 32.33 +74 13 13.4 6 1.74 2.23 HCrs WS UZC GHD1 CCA DC N3145 10 10 10.0 -12 26 04 5 0.00 1.87 MJC SPC GHD2 WS APMn N3146 10 11 09.8 -20 52 15 2 0.99 0.71 WS SPC N3147 10 16 53.34 +73 24 02.1 6 0.93 1.84 DC GHD1 WS CCA UZC vdH+ N3148 10 13 43.81 +50 29 46.8 2 0.13 0.49 SAO GSC N3149 10 03 44.3 -80 25 20 2 3.26 1.41 WS ESOB N3150 10 13 26.27 +38 39 26.7 3 0.60 0.75 WS SBG1 UZC N3151 10 13 29.04 +38 37 10.7 3 0.58 0.87 WS SBG1 UZC N3152 10 13 34.08 +38 50 34.6 3 0.27 1.04 UZC WS SBG1 N3153 10 12 50.47 +12 39 58.3 3 0.17 1.31 WS UZC CCA N3154 10 13 01.23 +17 02 03.3 4 1.58 1.73 WS DC CCA UZC N3155=N3194 10 17 40.23 +74 20 51.1 5 3.57 2.53 HCrs WS UZC CCA DC N3156 10 12 41.28 +03 07 46.2 6 2.47 2.48 WS DC UZC CCA GH ZGT N3157=I2555 10 11 42.34 -31 38 34.7 2 1.36 0.85 HCds WS N3158 10 13 50.63 +38 45 52.7 6 2.01 1.86 SBG1 UZC WS CCA DC GHD1 N3159 10 13 52.898 +38 39 14.80 4 1.86 2.30 SBG1 UZC KHJ GHD1 N3160 10 13 55.16 +38 50 32.7 4 0.71 1.14 UZC SBG1 WS CCA N3161 10 13 59.283 +38 39 24.82 5 1.60 2.06 SBG1 KHJ UZC KEBA GHD1 N3162=N3575 10 13 31.61 +22 44 14.5 5 1.13 2.00 WS HCds UZC GH CCA N3163 10 14 07.15 +38 39 08.2 6 1.41 1.75 WS UZC DC SBG1 CCA GHD1 N3164 10 15 11.56 +56 40 20.0 5 2.39 2.57 UZC GSC CCA WS DC N3165 10 13 31.37 +03 22 30.8 4 0.73 2.22 UZC CCA WS DC N3166 10 13 45.49 +03 25 30.0 6 4.24 1.08 DC WS ZGT UZC HHKK CCA N3167 10 14 35 +29 35.8 1o d'A N3168 10 16 23.02 +60 14 05.3 4 0.04 1.07 WS UZC CCA HCds N3169 10 14 14.61 +03 28 02.1 9 6.18 6.79 GH DC MJC ZGT WS GSC CCA UZC HHKK N3170 10 16 14.48 +46 36 43.7 2 0.80 1.13 WS GSC N3171 10 15 36.763 -20 38 50.21 5 1.23 2.69 ESOB Pds KHJ SPC WS N3172 11 47 15.269 +89 05 34.67 5 0.46 1.79 Pds KHJ UZC GSC HCrs N3173 10 14 35.0 -27 41 34 2 0.94 4.24 WS ESOB N3174=N3144 10 15 32.33 +74 13 13.4 6 1.74 2.23 HCrs WS UZC GHD1 CCA DC N3175 10 14 42.29 -28 52 18.0 4 0.92 1.73 GSC ESOB GHD2 WS N3176 10 15.3 -19 01 1o OSt1 N3177 10 16 34.18 +21 07 24.2 5 1.95 2.97 CCA WS UZC GH DC N3178 10 16 09.3 -15 47 29 2 2.04 0.00 SPC WS N3179 10 17 57.185 +41 06 51.07 5 1.12 0.41 DC SBG1 UZC KHJ CCA N3180ne 10 18 10.78 +41 26 54.9 1 HCds N3180sw 10 18 08.51 +41 26 29.5 1 HCds N3181 10 18 11.52 +41 24 44.9 2 0.16 1.13 HCds WS N3182 10 19 33.12 +58 12 20.4 5 1.19 0.93 WS UZC GHD1 CCA DC N3183=N3218 10 21 48.83 +74 10 35.8 6 3.75 3.88 GHD1 WS UZC CCA HCrs DC N3184 10 18 16.91 +41 25 27.0 10 2.74 2.45 GHD1 SBG1 HC2m K07 GSC CCA WS UZC HCds DC N3185 10 17 38.66 +21 41 17.3 7 2.94 0.82 WS GH UZC DC CCA HKA HHKK N3186: 10 15 53.35 +06 57 48.9 1 GSC N3186? 10 17 37.891 +06 58 15.91 5 0.45 0.42 HCds UZC FPB GSC KHJ N3187 10 17 47.83 +21 52 24.1 7 2.17 0.80 DC WS UZC HCds CCA GH HKA N3188 10 19 42.94 +57 25 22.4 5 1.90 2.73 K05 CCA UZC WS SDP N3188A 10 19 38.4 +57 25 08 2 2.27 4.95 WS SDP N3189 10 18 04.32 +21 49 53.7 1 HCds N3190 10 18 05.82 +21 49 56.7 7 3.39 3.31 WS CCA UZC DC HCds HKA GH N3191=N3192 10 19 05.05 +46 27 15.6 8 1.79 1.54 K12 SBG1 DC UZC WS CCA GSC K05 N3192=N3191 10 19 05.05 +46 27 15.6 8 1.79 1.54 K12 SBG1 DC UZC WS CCA GSC K05 N3193 10 18 24.94 +21 53 38.0 6 1.26 3.53 WS UZC CCA DC GH HKA N3194=N3155 10 17 40.23 +74 20 51.1 5 3.57 2.53 HCrs WS UZC CCA DC N3195 10 09 21.29 -80 51 30.8 3 1.46 0.12 GSCA GSC ESOB N3196 10 18 49.055 +27 40 06.21 2 0.65 2.25 KHJ BPP N3197 10 14 27.82 +77 49 12.4 4 1.20 2.08 WS UZC DC CCA N3198 10 19 54.93 +45 33 00.2 9 1.17 3.73 CCA GSCM WS UZC DC GSC HC2m SBG1 GHD1 N3199 10 17 24 -57 55.3 1 ESOB N3200 10 18 36.4 -17 58 57 3 0.00 0.00 ESOB SPC WS N3201 10 17 37.02 -46 24 45.3 2 3.67 6.86 SW ESOB N3202 10 20 31.77 +43 01 15.8 5 2.23 1.62 WS UZC SBG1 CCA DC N3203 10 19 33.7 -26 41 55 2 1.90 2.12 WS GHD2 N3204 10 20 11.20 +27 49 00.6 4 1.09 1.26 UZC WS CCA BPP N3205 10 20 49.98 +42 58 16.9 5 1.99 1.23 DC SBG1 WS UZC CCA N3206 10 21 47.71 +56 55 48.2 5 3.12 2.06 GHD1 WS CCA UZC DC N3207 10 21 00.571 +42 59 06.80 5 1.10 0.71 SBG1 UZC KHJ DC CCA N3208 10 19 41.2 -25 48 50 2 3.83 4.24 ESOB WS N3209 10 20 38.49 +25 30 15.9 4 0.00 1.50 WS DC UZC CCA N3210 10 27 59.20 +79 49 57.2 1 HCds N3211 10 17 50.47 -62 40 13.0 4 1.83 2.71 GSCA DKM2 GSC ESOB N3212 10 28 16.735 +79 49 23.70 6 1.32 2.77 Pds HCds KHJ HCrs CCA DC N3213 10 21 17.52 +19 39 05.8 5 2.55 1.47 UZC WS CCA DC GH N3214 10 23 08.72 +57 02 18.5 4 1.53 2.18 GHD1 WS GSC UZC N3215 10 28 40.83 +79 48 46.0 7 1.12 1.66 Pds UZC HCds HCrs WS CCA DC N3216 10 21 41.26 +23 55 22.0 5 0.97 1.03 Pds WS UZC CCA HCds N3217=I0606 10 23 32.63 +10 57 34.2 4 0.70 1.04 WS GSC FPB UZC N3218=N3183 10 21 48.83 +74 10 35.8 6 3.75 3.88 GHD1 WS UZC CCA HCrs DC N3219e 10 22 41.30 +38 34 42.3 1 SBG1 N3219w 10 22 37.423 +38 34 45.04 3 0.07 0.59 SBG1 UZC KHJ N3220=I0604 10 23 44.86 +57 01 35.1 5 2.60 2.97 GHD1 WS CCA HCo DC N3221 10 22 20.24 +21 34 06.2 6 1.44 4.54 STMW WS UZC CCA GH DC N3222 10 22 34.50 +19 53 12.8 6 1.09 1.96 WS GH GSC UZC CCA DC N3223=I2571 10 21 34.83 -34 15 59.9 3 2.38 2.51 GC WS HCds N3224 10 21 41.2 -34 41 46 2 2.62 1.41 WS ESOB N3225 10 25 10.14 +58 08 59.4 4 1.77 2.09 WS UZC CCA DC N3226 10 23 27.026 +19 53 54.35 7 2.59 2.91 GH WS HC2m AC CCA vdH+ DC N3227 10 23 30.620 +19 51 53.93 16 3.10 1.75 WS GH CCR JCR HHKK vdH+ UWS EDC HC2m GSC AAS CB2 UZC vdK1 CCA DC N3228 10 21 22 -51 43.7 2 0.00 25.46 BSV ESOB N3229 10 23 24.45 +00 03 54.6 1 HCds N3230 10 23 43.96 +12 34 02.5 5 0.29 1.26 HCds WS Pds UZC CCA N3231 10 26 58.9 +66 48 42 2 9.09 17.67 BSV WS N3232 10 24 24.33 +28 01 39.2 3 1.33 0.90 BPP GSC WS N3232n 10 24 24.33 +28 01 43.9 3 1.54 0.60 HCds IPds UZC N3232s 10 24 24.23 +28 01 34.0 3 1.72 0.96 HCds UZC IPds N3233 10 21 57.4 -22 16 04 2 1.97 1.41 ESOB WS N3234=N3235 10 24 59.37 +28 01 25.2 4 0.81 0.57 GSC BPP UZC CCA N3235=N3234 10 24 59.37 +28 01 25.2 4 0.81 0.57 GSC BPP UZC CCA N3236 10 26 48.460 +61 16 22.58 4 0.63 0.25 Pds KHJ HCds UZC N3237 10 25 43.48 +39 38 47.1 5 2.15 0.79 CCA UZC WS SBG1 DC N3238 10 26 43.07 +57 13 34.4 5 1.94 2.68 GHD1 WS UZC DC CCA N3239 10 25 05.87 +17 09 36.1 7 4.34 3.82 DC WS GH UZC HCds MJC CCA N3239 knot 10 25 07.949 +17 09 14.10 1 HCds N3240 10 24 30.8 -21 47 29 3 1.61 2.65 SPC ESOB WS N3241 10 24 17.1 -32 28 58 3 2.93 2.52 GHD2 WS ESOB N3242 10 24 46.172 -18 38 33.76 7 3.06 1.92 DKM1 PPM WS UCA1 GSC CK ESOB N3243 10 26 21.49 -02 37 21.4 8 1.71 1.82 WS GSC UZC SPC APMn CCA ZGT DC N3244 10 25 29.0 -39 49 41 2 4.09 2.12 WS ESOB N3245 10 27 18.32 +28 30 27.4 6 1.58 2.55 WS DC BPP GHD1 UZC CCA N3245A 10 27 01.16 +28 38 22.9 4 0.85 4.19 WS UZC GHD1 CCA N3246 10 26 41.76 +03 51 41.5 5 2.72 2.07 DC ZGT UZC WS CCA N3247 10 24 13 -57 45.8 1 HCds N3247 cl 10 24 01.0 -57 45 34 2 5.70 5.66 BSV HCds N3247 neb 10 24 18 -57 45.4 1 HCds N3248 10 27 45.45 +22 50 50.2 4 1.78 3.42 WS UZC CCA DC N3249 10 26 22.0 -34 57 49 2 0.87 2.83 WS ESOB N3250 10 26 32.3 -39 56 38 3 2.00 3.06 WS ESOB RC2 N3250A 10 27 53.6 -40 04 52 2 0.00 2.12 ESOB WS N3250B 10 27 44.4 -40 26 08 2 1.62 0.71 ESOB WS N3250C 10 27 42.4 -40 00 09 3 2.00 1.15 Pds WS ESOB N3250D 10 27 57.9 -39 48 55 3 0.67 1.73 ESOB WS Pds N3250E 10 29 00.8 -40 04 58 2 0.81 0.00 WS ESOB N3251=I2579 10 29 16.75 +26 05 56.4 5 1.89 2.14 WS HCds DC UZC CCA N3252 10 34 22.59 +73 45 48.9 5 0.95 1.22 WS GHD1 CCA UZC DC N3253 10 28 27.38 +12 42 13.3 3 0.84 2.04 WS CCA UZC N3254 10 29 19.96 +29 29 29.8 6 1.56 1.34 DC WS UZC BPP CCA GHD1 N3255 10 26 31 -60 40.6 2 0.00 8.49 ESOB BSV N3256 10 27 51.4 -43 54 20 2 0.00 0.00 ESOB WS N3256A 10 25 51.5 -43 44 54 2 6.93 1.41 ESOB WS N3256B 10 29 01.2 -44 24 12 2 1.52 2.12 WS ESOB N3256C 10 29 05.7 -43 51 05 3 0.63 4.93 Pds ESOB WS N3257 10 28 47.0 -35 39 29 2 0.00 1.41 ESOB WS N3258 10 28 53.5 -35 36 21 3 6.28 1.73 RC2 WS ESOB N3258A 10 28 19.1 -35 27 16 2 0.00 2.12 ESOB WS N3258B 10 30 25.20 -35 33 49.2 2 0.17 0.49 GSC SHM N3258C 10 31 24.5 -35 13 14 2 6.08 0.71 WS ESOB N3258D 10 31 55.7 -35 24 35 2 1.73 3.54 WS ESOB N3258E 10 32 25.0 -34 59 56 2 3.49 2.83 WS ESOB N3259 10 32 34.82 +65 02 27.3 4 2.15 1.34 WS CCA UZC DC N3260 10 29 06.1 -35 35 44 3 0.00 3.46 ESOB RC2 WS N3261 10 29 01.5 -44 39 26 3 5.39 3.46 GC WS ESOB N3262 10 29 06.19 -44 09 37.6 4 2.40 2.33 HCds WS GSC ESOB N3263 10 29 13.41 -44 07 22.4 2 0.92 0.57 HCds HCo N3264 10 32 19.89 +56 05 01.4 4 2.16 3.18 UZC CCA WS DC N3265 10 31 06.81 +28 47 47.9 6 1.44 1.42 BPP GHD1 CCA WS UZC DC N3266 10 33 17.38 +64 44 58.0 5 3.25 1.54 GHD1 WS UZC CCA DC N3267 10 29 48.42 -35 19 21.0 4 0.59 3.53 Pds HCds ESOB WS N3268 10 30 00.46 -35 19 31.9 3 1.82 1.54 WS ESOB HCds N3269 10 29 57.26 -35 13 27.4 4 4.19 2.50 WS HCds ESOB RC2 N3270 10 31 30.03 +24 52 08.7 4 1.37 0.93 WS UZC CCA DC N3271=I2585 10 30 26.48 -35 21 34.4 3 0.71 3.50 WS HCds ESOB N3272 10 31 48.15 +28 28 07.6 1 HCds N3273 10 30 29.2 -35 36 38 3 2.55 2.08 WS Pds ESOB N3274 10 32 17.02 +27 40 07.8 6 3.21 2.64 DC GHD1 BPP WS UZC CCA N3275 10 30 51.7 -36 44 14 2 0.00 0.71 ESOB WS N3275A 10 30 04.31 -36 41 38.3 2 4.35 2.76 GSC ESO N3276 10 31 09.3 -39 56 43 2 2.45 0.71 WS ESOB N3277 10 32 55.37 +28 30 41.4 6 2.00 0.80 GHD1 BPP WS DC UZC CCA N3278 10 31 35.5 -39 57 21 2 0.00 1.41 ESOB WS N3279=I0622 10 34 42.76 +11 11 48.1 3 2.31 1.50 WS UZC CCA N3280ne=N3295ne 10 32 46.474 -12 38 05.04 2 2.02 0.71 KHJ SPC N3280s=N3295s 10 32 45.609 -12 38 14.74 2 1.29 1.10 KHJ SPC N3280w=N3295w=I0617 10 32 43.892 -12 38 14.91 2 1.61 0.79 KHJ SPC N3281 10 31 52.136 -34 51 15.42 3 0.55 1.83 UW ESOB WS N3281A 10 31 58.31 -35 11 54.7 2 0.52 0.14 HCds GSC N3281B 10 31 52.06 -35 12 19.0 3 0.80 2.04 HCds GSC SHM N3281B comp 10 31 49.32 -35 12 20.9 1 HCds N3281C 10 32 59.3 -34 53 11 2 0.00 0.71 ESOB WS N3281D 10 34 18.9 -34 24 12 2 0.00 0.71 ESOB WS N3282 10 32 22.1 -22 18 06 2 6.88 2.83 WS ESOB N3283 10 31 11.34 -46 15 03.5 2 2.28 1.56 ESOB HCds N3284=N3286 10 36 21.21 +58 37 11.7 4 0.47 1.98 HCds Pds WS UZC N3285 10 33 35.8 -27 27 16 3 0.77 1.53 WS ESOB GHD2 N3285A 10 32 48.8 -27 31 21 3 0.77 1.15 ESOB WS GHD2 N3285B 10 34 36.8 -27 39 12 3 1.54 1.73 WS ESOB GHD2 N3286=N3284 10 36 21.21 +58 37 11.7 4 0.47 1.98 HCds Pds WS UZC N3287 10 34 47.33 +21 38 55.5 4 1.10 3.44 HCds UZC GH CCA N3288 10 36 25.89 +58 33 22.9 5 3.12 2.93 WS HCds UZC CCA GHD1 N3289 10 34 07.3 -35 19 24 2 0.00 0.71 ESOB WS N3290 10 35 17.4 -17 16 35 3 3.31 2.65 SHM SPC WS N3291 10 36 06.30 +37 16 28.5 1 HCds N3292 10 35 34.44 -06 10 44.9 1 HCds N3293 10 35 51.4 -58 13 47 3 19.94 21.20 BSV HCds ESOB N3294 10 36 16.24 +37 19 28.4 7 2.25 1.84 WS DC HCds K07 CCA UZC GHD1 N3295ne=N3280ne 10 32 46.474 -12 38 05.04 2 2.02 0.71 KHJ SPC N3295s=N3280s 10 32 45.609 -12 38 14.74 2 1.29 1.10 KHJ SPC N3295w=N3280w=I0617 10 32 43.892 -12 38 14.91 2 1.61 0.79 KHJ SPC N3296=I0618 10 32 45.468 -12 43 03.09 2 1.36 0.59 KHJ SPC N3297 10 33 11.938 -12 40 19.39 2 2.95 1.19 KHJ SPC N3298 10 37 12.30 +50 07 12.1 3 0.55 1.79 WS UZC SBG1 N3299 10 36 23.88 +12 42 24.7 5 1.54 0.84 DC WS GH UZC CCA N3300 10 36 38.45 +14 10 15.2 6 1.19 2.17 GH Pds CCA WS UZC DC N3301=N3760 10 36 55.90 +21 52 54.7 6 2.60 3.36 DC WS UZC HCds CCA GH N3302 10 35 47.4 -32 21 31 3 0.73 1.53 Pds ESOB WS N3303 10 36 59.6 +18 08 12 1 DC N3303nw 10 36 59.34 +18 08 16.4 1 HCds N3303se 10 36 60.00 +18 08 09.4 4 1.42 1.06 WS HCds Pds UZC N3304 10 37 37.938 +37 27 21.00 6 2.47 1.52 DC KHJ SBG1 CCA UZC GHD1 N3305 10 36 11.8 -27 09 43 2 2.84 2.83 WS Pds N3306 10 37 10.28 +12 39 08.6 5 2.02 2.45 WS UZC CCA GH DC N3307 10 36 17.2 -27 31 46 3 0.00 1.53 ESOB WS GHD2 N3308 10 36 22.3 -27 26 16 4 1.28 1.29 ESOB WS Pds GHD2 N3309 10 36 35.7 -27 31 05 3 0.77 2.52 Pds WS GHD2 N3310 10 38 45.86 +53 30 10.1 6 1.44 1.70 WS vdK1 CCA HC2m UZC DC N3311 10 36 42.9 -27 31 41 4 3.36 3.10 WS Pds GHD2 ESOB N3312=I0629 10 37 02.4 -27 33 55 3 1.54 2.08 ESOB WS GHD2 N3313 10 37 25.5 -25 19 07 2 0.00 2.12 ESOB WS N3314 10 37 12.9 -27 41 03 6 4.04 2.88 Pds2 WS Pds GHD2 RH ESOB N3314nw=N3314A 10 37 12.89 -27 41 03.0 1 HCds N3314se=N3314B 10 37 12.97 -27 41 05.4 1 HCds N3315 10 37 19.3 -27 11 30 4 1.89 0.50 RH WS Pds ESOB N3316 10 37 37.2 -27 35 38 4 1.28 2.94 WS GHD2 Pds ESOB N3316 comp 10 37 38.0 -27 36 00 1 WS N3317 10 37 43.3 -27 31 11 2 2.83 1.41 WS ESOB N3318 10 37 15.3 -41 37 40 2 4.78 2.12 WS ESOB N3318A 10 35 31.6 -41 44 26 2 7.15 0.71 WS ESOB N3318B 10 37 33.48 -41 27 57.6 2 3.11 2.76 WS HCds N3319 10 39 09.59 +41 41 14.0 11 2.45 2.37 GSCM GHD1 UZC HC2m CCA GSC K07 WS SBG1 DC K05 N3320 10 39 36.55 +47 23 49.5 6 1.18 4.24 GHD1 WS SBG1 UZC DC CCA N3321=N3322 10 38 50.6 -11 38 56 3 0.85 2.08 WS SPC APMn N3322=N3321 10 38 50.6 -11 38 56 3 0.85 2.08 WS SPC APMn N3323 10 39 39.08 +25 19 20.0 4 0.66 1.31 WS UZC CCA DC N3324 10 37 19.3 -58 38 03 3 26.15 80.56 HCds BSV ESOB N3325 10 39 20.457 -00 12 01.88 4 0.71 0.80 UZC SPC KHJ CCA N3326 10 39 31.80 +05 06 27.9 6 3.28 2.91 DC WS KEB1 UZC CCA KEBA N3327 10 39 57.86 +24 05 28.8 4 1.02 1.25 WS DC UZC CCA N3328: 10 39 54.22 +09 18 00.7 1 GSC N3328? 10 39 40.1 +09 12 53 2 0.00 0.71 WS GSCm N3329=N3397 10 44 39.70 +76 48 33.9 6 1.65 2.14 WS UZC CCA HCrs GHD1 DC N3330 10 38 46 -54 07.4 2 12.51 38.18 ESOB BSV N3331 10 40 08.8 -23 49 15 2 3.89 0.71 ESOB WS N3332=N3342 10 40 28.42 +09 10 57.0 5 2.16 1.83 WS GSC UZC CCA DC N3333 10 39 49.8 -36 02 10 2 1.72 1.41 WS ESOB N3334 10 41 31.21 +37 18 44.6 5 0.88 1.79 WS CCA SBG1 UZC DC N3335 10 39 34.17 -23 55 21.4 4 2.82 0.64 UA20 GSCA WS ESOB N3336 10 40 16.7 -27 46 37 2 0.94 3.54 ESOB WS N3337 10 41 47.592 +04 59 18.39 3 0.15 1.30 UZC KHJ HCds N3338 10 42 07.68 +13 44 49.1 6 2.89 2.61 DC UZC CCA WS GH HHKK N3339 10 42 10.06 -00 22 08.4 1 HCds N3340 10 42 17.97 -00 22 37.1 6 1.19 1.15 WS APMn UZC SPC HCds CCA N3341 10 42 31.53 +05 02 36.9 5 0.68 1.06 Pds WS HCds CCA UZC N3342=N3332 10 40 28.42 +09 10 57.0 5 2.16 1.83 WS GSC UZC CCA DC N3343 10 46 10.28 +73 21 10.3 4 0.60 0.95 HCds CCA WS UZC N3344 10 43 31.01 +24 55 20.2 9 2.42 2.06 UZC DC WS GSCM CCA GH HC2m SPC CB2 N3345 10 43 32.0 +11 59 06 2 1.04 0.71 WS GSCm N3346 10 43 38.83 +14 52 18.7 5 2.04 2.37 DC WS GH UZC CCA N3347 10 42 46.52 -36 21 13.2 3 1.95 1.31 ESOB GSC WS N3347A 10 40 20.7 -36 24 46 2 2.57 0.00 WS ESOB N3347B 10 42 00.0 -36 56 09 2 3.40 3.54 ESOB WS N3347C 10 40 53.9 -36 17 19 2 1.72 2.12 WS ESOB N3348 10 47 10.17 +72 50 22.8 6 1.97 3.07 CCA WS DC UZC GSC GHD1 N3349 10 43 50.62 +06 45 46.4 4 1.47 1.47 HCds WS Pds UZC N3349 comp 10 43 52.66 +06 45 25.6 2 1.26 3.04 HCds WS N3350 10 44 22.990 +30 43 29.63 3 0.26 0.42 KHJ GSC UZC N3351 10 43 57.74 +11 42 12.8 8 2.58 2.84 GC GH CCA HC2m UZC GSC WS DC N3352 10 44 14.86 +22 22 15.0 3 0.94 0.95 WS UZC CCA N3353 10 45 22.37 +55 57 36.0 7 3.13 1.54 vdH+ WS GHD1 UZC CCA DC SDP N3354 10 43 02.67 -36 21 48.2 3 3.03 2.34 ESOB WS GSC N3355 10 43 33 -23 12.0 1o SPL N3355? 10 42 37.91 -23 56 08.1 3 1.67 0.12 ESOB LEDA HC2m N3355?? 10 41 25 -23 23.0 1 ESOB N3356 10 44 12.35 +06 45 31.2 5 1.33 1.22 UZC CCA WS Pds DC N3357 10 44 20.91 +14 05 02.9 5 3.13 1.34 DC CCA UZC WS GH N3358 10 43 33.12 -36 24 39.2 3 3.57 1.47 GSC WS ESOB N3359 10 46 36.83 +63 13 24.9 8 2.91 2.53 WS CCA UZC GSCM GSC HC2m GHD1 DC N3360 10 44 16.19 -11 14 34.1 3 0.94 1.31 HCds WS SPC N3361 10 44 29.12 -11 12 28.5 5 0.96 1.65 SPC APMn HCds WS HCds N3362 10 44 51.722 +06 35 46.24 5 1.80 2.98 DC AE WS CCA UZC N3363 10 45 09.57 +22 04 42.1 4 0.68 1.13 CCA WS UZC HCds N3364 10 48 30.05 +72 25 28.6 7 2.89 0.96 WS Pds GSC UZC CCA GHD1 DC N3365 10 46 12.60 +01 48 46.5 5 1.22 2.19 ZGT UZC SPC CCA WS N3366=I2592 10 35 08.3 -43 41 35 2 3.08 4.24 WS ESOB N3367 10 46 34.90 +13 45 00.5 4 1.15 1.29 GH UZC WS CCA N3368 10 46 45.70 +11 49 12.1 6 1.31 2.95 GSCM HHKK HC2m WS HCo CCA N3369 10 46 44.7 -25 14 39 2 0.96 2.12 WS ESOB N3370 10 47 04.06 +17 16 24.4 4 1.14 2.47 WS UZC GH CCA N3371:=N3384 10 48 16.97 +12 37 46.2 6 1.71 2.67 UZC CCA HC2m HCds GH DC N3372 10 45 08 -59 52.0 1 ESOB N3373:=N3389 10 48 28.12 +12 31 58.6 7 4.29 1.80 DC HC2m GSC WS UZC GH CCA N3374 10 48 01.13 +43 11 09.8 4 1.09 1.38 WS CCA UZC SBG1 N3375 10 47 00.76 -09 56 31.0 5 0.68 3.88 WS Pds SPC APMn GSC N3376 10 47 26.626 +06 02 51.25 4 0.60 2.60 KHJ DC UZC CCA N3377 10 47 42.21 +13 59 07.1 9 3.33 2.89 DC MJC WS UZC GH GSC HC2m CCA HCds N3377A 10 47 22.37 +14 04 13.2 5 1.88 3.40 WS UZC STMW CCA GH N3378 10 46 43.1 -40 00 56 2 3.26 0.71 ESOB WS N3379 10 47 49.63 +12 34 54.8 7 1.75 2.75 GC WS HC2m GH HCds CCA DC N3380 10 48 12.27 +28 36 06.6 7 1.77 1.73 Pds WS BPP UZC CCA DC GHD1 N3381 10 48 24.79 +34 42 41.3 6 2.39 1.95 UZC WS K09 CCA DC SBG1 N3382? 10 48 25.6 +36 43 28 2 0.85 0.71 WS GSCm N3383 10 47 19.2 -24 26 19 2 0.00 2.12 ESOB WS N3384=:N3371 10 48 16.97 +12 37 46.2 6 1.71 2.67 UZC CCA HC2m HCds GH DC N3385 10 48 11.708 +04 55 40.53 5 1.84 2.72 UZC KHJ GSC CCA DC N3386 10 48 11.924 +04 59 53.99 4 0.25 1.13 KHJ Pds UZC GSC N3387 10 48 16.74 +04 57 59.8 1 GSC N3388=N3425 10 51 25.47 +08 34 01.0 5 3.95 1.89 WS GSC UZC CCA DC N3389=:N3373 10 48 28.12 +12 31 58.6 7 4.29 1.80 DC HC2m GSC WS UZC GH CCA N3390 10 48 04.2 -31 32 00 3 3.23 2.31 ESOB WS GHD2 N3391 10 48 56.39 +14 13 09.3 3 1.01 2.01 WS UZC CCA N3392 10 51 02.95 +65 46 52.5 5 0.51 1.72 WS Pds UZC HCds GSC N3393 10 48 23.44 -25 09 43.4 2 0.77 0.21 WS GSC N3394 10 50 39.70 +65 43 38.0 6 2.16 0.48 DC WS HCds CCA UZC GSC N3395=I2613 10 49 49.94 +32 58 53.0 11 3.50 4.25 DC HC SBG1 KEBA WS HCds Pds CCA HC2m UZC GHD1 N3396 10 49 55.59 +32 59 24.9 11 5.13 1.44 HC2m UZC CCA HHKK HCds HC WS KEBA SBG1 DC GHD1 N3397=N3329 10 44 39.70 +76 48 33.9 6 1.65 2.14 WS UZC CCA HCrs GHD1 DC N3398=I0644 10 51 31.59 +55 23 26.2 6 2.34 1.91 WS UZC HCds CCA DC HC N3399 10 49 27.60 +16 13 05.9 4 0.14 0.20 Pds UZC WS GSC N3400 10 50 45.53 +28 28 07.3 6 0.68 1.50 WS BPP UZC CCA DC GHD1 N3401 10 50 19 +05 48.7 1o WH N3402=N3411 10 50 26.09 -12 50 43.4 3 1.12 0.81 HCds WS SPC N3403 10 53 54.80 +73 41 22.6 5 1.64 1.95 WS CCA GHD1 UZC DC N3404=I2609 10 50 17.9 -12 06 31 4 3.06 1.41 WS GHD2 APMn SPC N3405ne 10 49 44.477 +16 14 30.60 3 2.58 1.08 KHJ GSC DC N3405sw 10 49 43.365 +16 14 18.41 5 1.12 0.84 UZC KHJ GSC CCA DC N3406ne 10 51 44.8 +51 01 31 3 1.88 2.89 WS HCo DC N3406sw 10 51 43.93 +51 01 20.5 5 1.95 1.88 CCA WS UZC HCo DC N3406sw+partofne 10 51 44.04 +51 01 23.6 1 GSC N3407 10 52 17.86 +61 22 45.0 5 0.49 1.03 WS Pds HCds UZC CCA N3408 10 52 11.83 +58 26 17.1 5 1.75 0.61 WS UZC CCA GHD1 DC N3409 10 50 20.3 -17 02 39 3 1.44 2.89 WS SPC APMn N3410 10 51 53.64 +51 00 23.1 4 1.31 1.48 UZC GSC WS KEBA N3410se 10 51 56.4 +50 59 49 1 HCo N3411=N3402 10 50 26.09 -12 50 43.4 3 1.12 0.81 HCds WS SPC N3412 10 50 53.27 +13 24 43.9 4 1.43 1.37 DC CCA UZC WS N3413 10 51 20.80 +32 45 59.3 9 1.66 2.91 WS K09 CCA HC UZC GSC SBG1 GHD1 DC N3414 10 51 16.25 +27 58 30.3 6 2.00 1.69 WS BPP CCA UZC DC GHD1 N3415 10 51 42.71 +43 42 44.6 6 2.79 1.47 WS SBG1 DC UZC CCA GHD1 N3416 10 51 48.324 +43 45 50.37 6 1.24 0.82 UZC HCds KHJ SBG1 K05 KEBA N3417 10 51 01.7 +08 28 22 4 0.74 1.26 Pds WS UZC HCds N3418 10 51 24.05 +28 06 43.0 6 1.55 1.48 WS BPP CCA UZC DC GHD1 N3419 10 51 17.77 +13 56 44.7 6 2.08 2.75 DC WS UZC GH CCA KEBA N3419A 10 51 19.91 +14 01 22.9 5 1.39 2.69 WS GH UZC CCA Pds N3420 10 50 09.650 -17 14 33.65 4 0.69 2.09 WS KHJ SHM SPC N3421=I0652 10 50 57.711 -12 26 55.90 3 1.03 2.27 KHJ SPC APMn N3422 10 51 17.4 -12 24 09 2 0.00 0.71 WS SPC N3423 10 51 14.31 +05 50 23.6 5 1.51 2.22 GH UZC WS HCds CCA N3424 10 51 46.57 +32 53 59.6 7 3.59 1.58 WS HHKK CCA UZC GHD1 SBG1 HC N3424w 10 51 46.48 +32 54 01.1 2 1.15 1.06 GSC DC N3425=N3388 10 51 25.47 +08 34 01.0 5 3.95 1.89 WS GSC UZC CCA DC N3426 10 51 41.75 +18 28 51.1 5 1.19 0.94 WS KEBA CCA UZC DC N3427 10 51 26.38 +08 17 52.9 4 2.54 1.65 WS UZC CCA DC N3428=N3429 10 51 29.48 +09 16 44.5 6 1.14 1.57 Pds WS DC UZC HCds CCA N3429=N3428 10 51 29.48 +09 16 44.5 6 1.14 1.57 Pds WS DC UZC HCds CCA N3430 10 52 11.52 +32 57 02.5 9 3.55 4.24 DC K09 HC WS CCA GHD1 UZC GSC SBG1 N3431 10 51 15.02 -17 00 30.6 4 0.69 1.60 WS GSC SPC APMn N3432 10 52 31.22 +36 37 09.9 8 3.07 3.10 WS K09 GHD1 GSCM DC UZC SBG1 CCA N3433 10 52 03.84 +10 08 53.0 5 3.29 3.76 DC UZC WS GH CCA N3434 10 51 57.99 +03 47 29.8 4 2.87 1.29 DC WS UZC CCA N3435 10 54 48.40 +61 17 21.6 4 1.23 3.30 WS UZC CCA DC N3436 10 52 27.48 +08 05 38.4 1 GSC N3437 10 52 35.56 +22 56 04.5 4 2.49 1.14 WS CCA GH UZC N3438 10 52 25.99 +10 32 49.0 4 1.28 0.52 WS UZC CCA DC N3439 10 52 25.73 +08 33 26.2 4 1.06 1.22 WS UZC Pds HCds N3440 10 53 49.59 +57 07 06.1 3 0.89 1.13 WS UZC CCA N3441 10 52 31.05 +07 13 28.8 5 1.05 1.77 DC WS KEBA UZC CCA N3442 10 53 08.12 +33 54 36.2 9 1.73 1.92 WS HC K09 UZC CCA GSC SBG1 DC SDP N3443 10 53 00.23 +17 34 25.3 4 1.86 3.35 WS CCA UZC DC N3444 10 52 59.43 +10 12 37.1 4 0.07 2.12 CCA WS UZC GH N3445 10 54 35.98 +56 59 24.0 4 2.51 2.89 UZC WS CCA DC N3446 10 52 12 -45 08.9 2 82.66 42.44 BSV ESOB N3447 10 53 23.88 +16 46 20.2 6 3.68 2.43 DC GH WS UZC HCds CCA N3447A 10 53 29.96 +16 47 03.6 3 4.04 2.23 CCA HCds WS N3448 10 54 38.95 +54 18 19.2 5 0.85 2.56 WS CCA UZC DC GSC N3449 10 52 53.5 -32 55 37 3 4.78 3.51 ESOB GHD2 WS N3450 10 48 03.6 -20 50 57 4 2.11 0.50 WS GHD2 SPC ESOB N3451 10 54 20.96 +27 14 21.5 6 3.01 2.94 BPP DC UZC Pds WS CCA N3452 10 54 14.1 -11 24 19 2 0.00 0.00 SPC WS N3453 10 53 40.4 -21 47 36 2 0.00 1.41 SPC WS N3454 10 54 29.34 +17 20 38.3 5 2.76 3.73 DC WS UZC GH CCA N3455 10 54 31.12 +17 17 04.2 5 2.62 2.85 WS UZC GH CCA DC N3456 10 54 03.5 -16 01 42 5 3.23 3.90 Pds SPC WS GHD2 APMn N3457:=N3460 10 54 48.70 +17 37 15.7 6 1.45 1.34 WS GSC UZC DC CCA HCds N3457?=I0656 10 55 08.1 +17 36 48 2 0.00 2.83 HCds WS N3458 10 56 01.67 +57 07 00.9 5 2.00 3.97 WS UZC CCA DC GHD1 N3459 10 54 44.4 -17 02 31 3 1.66 1.53 APMn WS SPC N3460=:N3457 10 54 48.70 +17 37 15.7 6 1.45 1.34 WS GSC UZC DC CCA HCds N3461 10 54 55.24 +17 42 28.1 2 1.01 0.64 WS GSC N3462 10 55 21.04 +07 41 46.3 5 1.19 1.61 DC WS Pds UZC CCA N3463 10 55 13.43 -26 08 25.3 2 1.24 0.28 HCds ESOL N3464 10 54 40.09 -21 03 57.9 5 3.08 3.04 WS HCds GHD2 SPC ESOB N3465 10 59 31.34 +75 11 27.3 5 0.61 1.55 UZC HCrs WS Pds CCA N3466 10 56 15.52 +09 45 15.3 4 1.23 2.12 WS UZC CCA GH N3467 10 56 44.15 +09 45 30.4 4 1.40 0.83 WS UZC CCA DC N3468 10 57 31.23 +40 56 46.3 5 1.55 1.36 CCA WS UZC SBG1 DC N3469 10 56 57.630 -14 18 02.81 4 0.85 0.48 APMn SPC Pds KHJ N3470 10 58 45.05 +59 30 38.1 5 2.10 2.69 WS UZC GHD1 CCA DC N3471 10 59 09.03 +61 31 48.3 6 1.16 2.66 WS Pds SDP UZC CCA DC N3472 10 57 22 -19 38.3 1o OSt1 N3473 10 58 05.28 +17 07 25.2 5 1.87 3.67 Pds UZC WS CCA MB N3474 10 58 08.781 +17 05 44.19 3 0.30 0.50 KHJ UZC Pds N3475 10 58 25.26 +24 13 35.4 5 1.68 2.35 Pds WS UZC CCA MB N3476=:N3480 10 58 07.59 +09 16 33.1 4 0.49 0.98 WS UZC GSC HCds N3477 10 58 12.57 +09 13 03.0 3 0.31 1.25 WS GSC HCds N3478 10 59 27.56 +46 07 20.4 6 2.13 1.74 UZC WS CCA SBG1 GHD1 DC N3479=N3502 10 58 55.46 -14 57 41.8 5 0.73 1.20 Pds WS GSC SPC APMn N3480:=N3476 10 58 07.60 +09 16 32.9 3 0.52 1.13 WS GSC HCds N3481 10 59 26.49 -07 32 39.9 3 1.29 0.23 SPC WS GSC N3482 10 58 34.0 -46 35 04 2 2.93 0.71 ESOB WS N3483 10 59 00.1 -28 28 38 2 0.00 4.24 ESOB WS N3484 11 03 05 +75 49.1 1o JH N3485 11 00 02.44 +14 50 28.3 4 1.37 2.07 WS UZC CCA GH N3486 11 00 23.89 +28 58 30.0 8 2.20 1.75 DC GSCM GSC HC2m BPP UZC WS CCA N3487 11 00 46.63 +17 35 12.8 5 0.77 1.37 GSC CCA WS UZC Pds N3488 11 01 23.79 +57 40 37.7 7 2.34 1.19 WS UZC GSC Pds CCA GHD1 DC N3489 11 00 18.66 +13 54 04.3 4 2.50 3.11 WS CCA GH UZC N3490 10 59 54.404 +09 21 42.49 3 0.10 0.20 GSC UZC KHJ N3491 11 00 35.47 +12 09 42.0 4 2.07 2.70 WS UZC CCA DC N3492ne 11 00 57.34 +10 30 21.6 4 0.74 1.50 UZC WS DC HCds N3492sw 11 00 56.76 +10 30 14.8 3 0.76 1.22 DC HCds WS N3493 11 01 27.83 +27 43 10.0 4 0.94 0.84 WS UZC BPP CCA N3494 11 01 10.90 +03 46 27.5 1 GSC N3495 11 01 16.03 +03 37 37.3 7 4.19 2.84 DC WS GH ZGT UZC GSC CCA N3496 10 59 36 -60 20.2 2 26.46 0.00 BSV ESOB N3497=N3528=N3525 11 07 18.21 -19 28 19.3 4 2.05 1.83 WS HCds ESOB SPC N3498 11 01 42.0 +14 21 00 2 4.11 3.54 WS HCm N3499 11 03 11.22 +56 13 18.1 5 3.01 0.85 WS CCA UZC DC GHD1 N3500 11 01 51.32 +75 12 03.1 3 0.62 0.85 Pds HCrs CCA N3501 11 02 47.33 +17 59 20.9 3 1.40 0.87 UZC WS CCA N3502=N3479 10 58 55.46 -14 57 41.8 5 0.73 1.20 Pds WS GSC SPC APMn N3503 11 01 17 -59 50.8 2 0.00 4.24 ESOB BSV N3504 11 03 11.172 +27 58 21.00 11 1.76 1.70 DC BPP WS CCA UZC K09 UWS CCR vdH+ CCO GHD1 N3505:=N3508=I2622 11 02 59.7 -16 17 19 3 0.00 2.65 APMn WS SPC N3506 11 03 12.95 +11 04 36.5 5 1.85 2.00 WS UZC KEBA CCA GH N3507 11 03 25.49 +18 08 06.3 3 0.87 3.17 CCA WS UZC N3508=I2622=:N3505 11 02 59.7 -16 17 19 3 0.00 2.65 APMn WS SPC N3509 11 04 23.61 +04 49 43.9 6 1.60 3.55 WS HCds UZC CCA DC GH N3509 knot 11 04 23.64 +04 49 29.8 1 HCds N3510 11 03 43.65 +28 53 05.8 7 2.33 3.48 K09 BPP UZC CCA WS GHD1 DC N3511 11 03 23.7 -23 05 11 3 0.00 1.15 ESOB GHD2 WS N3512 11 04 02.77 +28 02 12.2 7 3.28 3.72 DC WS BPP Pds CCA UZC GHD1 N3513 11 03 45.8 -23 14 40 3 1.38 1.00 ESOB WS GHD2 N3514 11 03 59.98 -18 46 52.6 4 1.95 2.03 WS GSC SPC ESOB N3515 11 04 37.28 +28 13 38.4 6 0.83 2.23 BPP GHD1 WS UZC CCA MB N3516 11 06 47.579 +72 34 07.93 8 1.45 1.67 DC UZC WS UW EDC GHD1 CCA vdK1 N3517 11 05 36.95 +56 31 30.0 6 2.54 1.97 GHD1 UZC WS GSC CCA DC N3518=N3122=N3110 10 04 01.96 -06 28 29.9 4 2.57 2.02 APMn WS HCds SPC N3519 11 04 04 -61 22.1 2 20.52 0.00 BSV ESOB N3520: 11 07 08.8 -18 01 27 2 1.01 1.41 ESOB HCds N3520:m 11 07 08.70 -18 01 30.9 1 HCds N3520:ne 11 07 09.30 -18 01 26.1 1 HCds N3520:s 11 07 08.81 -18 01 35.6 1 HCds N3520:sw 11 07 08.01 -18 01 32.2 1 HCds N3520? 11 04 24.10 -17 56 35.1 1 HCds N3520?? 11 05 29.9 -17 55 08 3 3.30 1.53 BSV HCds WS N3521 11 05 48.730 -00 02 10.50 9 1.99 3.45 HC2m SPC ACR SPF ZGT WS CCA DC UZC N3522 11 06 40.44 +20 05 07.4 4 0.73 0.63 WS UZC DC CCA N3523 11 03 06.76 +75 06 57.4 4 1.78 4.24 UZC CCA WS DC N3524 11 06 32.14 +11 23 06.1 5 0.80 2.39 WS UZC DC Pds CCA N3525=N3497=N3528 11 07 18.21 -19 28 19.3 4 2.05 1.83 WS HCds ESOB SPC N3526=N3531 11 06 56.58 +07 10 25.7 5 3.76 2.30 DC WS HCds UZC CCA N3527 11 07 18.21 +28 31 37.3 6 1.75 2.07 Hu BPP UZC CCA WS MB N3528=N3497=N3525 11 07 18.21 -19 28 19.3 4 2.05 1.83 WS HCds ESOB SPC N3529=I2625 11 07 19.27 -19 33 21.5 4 1.23 1.71 WS ESOB HCds SPC N3530 11 08 40.37 +57 13 47.3 5 0.99 1.79 DC WS UZC CCA KEBA N3531=N3526 11 06 56.58 +07 10 25.7 5 3.76 2.30 DC WS HCds UZC CCA N3532 11 05 39 -58 45.2 2 88.71 84.85 ESOB BSV N3533=N3557A 11 07 07.2 -37 10 22 2 4.24 2.83 ESOB WS N3534=N3534A 11 08 55.63 +26 36 37.8 6 2.01 2.29 WS BPP CCA GSC UZC MB N3534B 11 08 57.23 +26 35 46.4 4 2.79 1.45 WS BPP CCA HCo N3535 11 08 34.033 +04 49 54.48 4 1.03 0.68 UZC KHJ DC CCA N3536 11 08 51.313 +28 28 31.38 6 2.11 0.97 Hu BPP CCA KHJ UZC MB N3537nw 11 08 26.51 -10 15 24.8 3 1.13 1.01 HCo WS GSC N3537nw+se 11 08 26.8 -10 15 24 1 SPC N3537se 11 08 27.0 -10 15 32 2 1.04 1.41 HCo WS N3538 11 11 32.9 +75 34 14 1 WS N3539 11 09 08.9 +28 40 19 4 0.66 0.50 WS BPP Hu UZC N3540=N3548 11 09 16.087 +36 01 15.48 6 1.00 0.63 HCds UZC SBG1 GSC KHJ CCA N3541 11 08 32.165 -10 29 30.31 2 1.05 0.35 GSC KHJ N3542 11 09 55.57 +36 56 46.4 3 0.77 2.46 UZC WS SBG1 N3543 11 10 56.53 +61 20 49.8 5 1.18 3.45 WS UZC Pds HCds CCA N3544=N3571 11 11 30.3 -18 17 23 4 3.08 3.32 ESOB GHD2 WS SPC N3545=N3545A 11 10 13.315 +36 57 58.88 4 1.16 0.10 KHJ SBG1 UZC Pds N3545B 11 10 12.30 +36 57 52.3 3 0.76 1.32 SBG1 Pds UZC N3546 11 09 46.646 -13 22 52.95 5 2.59 3.38 APMn Pds SPC GSC KHJ N3547 11 09 55.84 +10 43 15.7 5 3.70 4.37 DC WS UZC GH CCA N3548=N3540 11 09 16.087 +36 01 15.48 6 1.00 0.63 HCds UZC SBG1 GSC KHJ CCA N3549 11 10 56.76 +53 23 16.1 5 1.04 1.90 DC GHD1 WS UZC CCA N3550 11 10 38.52 +28 46 03.7 8 2.93 2.59 CCA WS DC BPP GSC UZC Pds Hu N3550ne 11 10 38.8 +28 46 06 1 HCo N3550sw 11 10 38.5 +28 46 00 1 HCo N3551 11 09 44.428 +21 45 31.71 2 0.29 0.07 GSC KHJ N3552 11 10 42.93 +28 41 34.1 4 1.65 1.30 WS BPP GSC Hu N3553 11 10 40.48 +28 41 08.3 2 0.65 2.83 GSC Hu N3554 11 10 47.898 +28 39 36.27 5 0.69 0.72 KHJ UZC BPP GSC Hu N3555 11 09 50.30 +21 48 36.5 1 GSC N3556 11 11 30.99 +55 40 26.4 8 3.70 3.19 vdK3 CB2 HC2m HCds UZC CCA GHD1 vdH+ N3557 11 09 57.51 -37 32 21.0 4 1.25 2.58 ESOB WS GSC EWSr N3557A=N3533 11 07 07.2 -37 10 22 2 4.24 2.83 ESOB WS N3557B 11 09 32.2 -37 20 59 3 3.45 6.03 WS ESOB RC2 N3558 11 10 55.94 +28 32 36.6 6 0.53 1.39 WS BPP UZC SDP GSC Hu N3559=N3560 11 10 45.22 +12 00 57.2 5 1.11 1.01 WS UZC GSC CCA DC N3560=N3559 11 10 45.24 +12 00 57.5 4 0.63 0.92 UZC GSC CCA DC N3561=N3561s 11 11 13.19 +28 41 47.1 8 2.94 1.35 GHD1 HCds CCA BPP UZC WS GSC Hu N3561C 11 11 13.16 +28 41 17.9 2 2.41 1.63 GHD1 HCds N3561n 11 11 12.99 +28 42 42.3 8 2.00 1.10 GHD1 HCds HHKK WS UZC CCA GSC Hu N3562 11 12 58.75 +72 52 44.0 5 1.41 1.14 WS Pds CCA UZC DC N3563=N3563A 11 11 25.327 +26 57 47.83 6 1.22 1.00 UZC GSC KHJ CCA BPP PCR N3563B 11 11 23.775 +26 57 42.37 3 0.34 0.37 GSC KHJ PCR N3564 11 10 36.22 -37 32 53.4 3 0.66 1.53 WS GSC Pds N3565? 11 07 47.64 -20 01 17.6 1 HCds N3565?+N3566? 11 07 47.894 -20 01 20.73 6 2.07 0.85 WS GSC KHJ HCds SPC ESOB N3566? 11 07 47.94 -20 01 20.5 1 HCds N3567 11 11 18.71 +05 50 11.0 5 0.95 2.04 WS UZC Pds DC CCA N3568 11 10 48.3 -37 26 56 2 2.54 0.71 HCo WS N3569 11 12 08.16 +35 27 07.3 5 1.36 1.66 WS SBG1 UZC CCA DC N3570 11 12 03.378 +27 35 22.19 4 0.59 1.48 BPP KHJ CCA UZC N3571=N3544 11 11 30.3 -18 17 23 4 3.08 3.32 ESOB GHD2 WS SPC N3572 11 10 23 -60 14.9 2 42.46 0.00 BSV ESOB N3573 11 11 18.5 -36 52 29 2 7.66 6.36 WS ESOB N3574 11 12 12.084 +27 37 28.89 2 0.99 0.07 BPP KHJ N3575=N3162 10 13 31.61 +22 44 14.5 5 1.13 2.00 WS HCds UZC GH CCA N3576 11 11 32.7 -61 21 46 2 0.51 3.54 ESOB HCds N3577 11 13 44.967 +48 16 21.29 5 2.67 1.03 SBG1 KHJ UZC CCA GHD1 N3578 11 12 52 -15 57.4 1o JH N3579 11 11 58.8 -61 14 39 2 8.23 5.66 ESOB HCds N3580 11 13 15.85 +03 39 25.5 5 2.34 0.46 GD Pds UZC GSC WS N3581 11 12 01.0 -61 18 13 2 10.27 9.19 ESOB HCds N3582 11 12 10.0 -61 16 28 2 20.05 4.95 ESOB HCds N3583 11 14 11.09 +48 19 06.3 7 3.53 3.18 UZC SBG1 GSC WS CCA DC GHD1 N3584 11 12 19.5 -61 13 28 2 3.09 20.51 ESOB HCds N3585 11 13 17.07 -26 45 19.4 3 3.40 1.15 ESOB GSC WS N3586 11 12 29.6 -61 21 02 2 4.10 8.49 ESOB HCds N3587 11 14 47.78 +55 01 08.2 2 0.79 0.71 SL CK N3588ne 11 14 02.80 +20 23 20.2 2 2.38 4.38 WS HCds N3588sw 11 14 02.52 +20 23 13.7 4 1.76 3.71 WS UZC Pds HCds N3589 11 15 13.69 +60 42 02.0 4 2.07 1.80 WS UZC DC CCA N3590 11 12 59 -60 47.3 2 10.44 0.00 BSV ESOB N3591 11 14 03.077 -14 05 16.88 3 2.95 2.13 APMn SPC KHJ N3592 11 14 27.43 +17 15 33.6 4 1.20 1.43 CCA HCds WS UZC N3593 11 14 36.88 +12 49 02.6 4 3.16 1.42 GH UZC WS CCA N3594: 11 16 14.079 +55 42 14.60 6 1.03 1.16 KHJ GSC UZC CCA HCds Pds N3594? 11 14 06.41 +55 42 38.6 2 1.25 0.00 GSC HCds N3595 11 15 25.55 +47 26 48.5 6 2.55 1.52 SBG1 WS Pds UZC CCA DC N3596 11 15 06.25 +14 47 12.1 5 1.61 2.45 WS GH UZC CCA HC N3597 11 14 41.9 -23 43 42 2 0.97 4.24 ESOB WS N3598 11 15 11.64 +17 15 44.2 5 1.51 2.87 WS DC Pds UZC CCA N3599 11 15 26.95 +18 06 35.9 3 1.57 1.00 WS CCA UZC N3600 11 15 52.05 +41 35 28.9 7 0.53 3.35 WS K07 UZC CCA SBG1 KCA DC N3601 11 15 33.22 +05 06 56.5 5 1.53 2.27 DC WS UZC KEBA CCA N3602 11 15 48.33 +17 24 55.9 3 0.33 1.58 Pds WS HCds N3603 11 15 07 -61 15.6 2 5.14 4.24 BSV ESOB N3604=N3611 11 17 30.07 +04 33 17.2 4 0.75 1.96 GH WS UZC CCA N3605 11 16 46.63 +18 01 01.5 4 0.82 1.48 UZC WS DC CCA N3606 11 16 15.7 -33 49 37 3 3.61 2.52 Pds WS ESOB N3607 11 16 54.63 +18 03 05.7 3 1.94 0.17 WS UZC CCA N3608 11 16 58.94 +18 08 54.2 5 2.04 2.20 DC GSC WS UZC CCA N3609 11 17 50.49 +26 37 30.2 5 3.74 1.31 DC UZC WS BPP CCA N3610 11 18 25.33 +58 47 11.1 4 3.19 1.75 WS GHD1 CCA DC N3611=N3604 11 17 30.07 +04 33 17.2 4 0.75 1.96 GH WS UZC CCA N3612 11 18 14.69 +26 37 13.1 5 1.62 1.17 STMW WS UZC BPP CCA N3613 11 18 36.13 +58 00 00.8 4 1.39 2.45 WS UZC DC CCA N3614 11 18 21.32 +45 44 51.4 7 3.41 2.73 GHD1 SBG1 UZC CCA GSC WS DC N3614A 11 18 11.8 +45 42 58 3 1.59 1.00 Pds2 WS Pds N3615 11 18 06.70 +23 23 49.1 4 1.85 0.58 WS UZC CCA DC N3616 11 18 08.7 +14 45 55 1 HC N3617 11 17 50.8 -26 08 04 3 2.06 2.08 ESOB WS Pds N3618 11 18 32.57 +23 28 06.8 5 1.71 1.41 WS DC UZC KEB1 CCA N3619 11 19 21.53 +57 45 31.0 5 1.75 3.54 GHD1 WS UZC CCA DC N3620 11 16 05.025 -76 12 59.43 5 2.34 3.84 ESOB GSCA WS HCds GSC2 N3621 11 18 16.49 -32 48 49.8 5 2.73 0.71 GHD2 HCds HC2m HCds ESOB N3622 11 20 12.49 +67 14 28.4 4 1.41 0.84 WS CCA UZC DC N3623 11 18 55.82 +13 05 31.4 5 1.77 4.30 WS CCA HCds HC2m UZC N3624 11 18 50.97 +07 31 15.1 4 0.70 1.93 WS GSC Pds UZC N3625 11 20 31.30 +57 46 53.2 6 1.96 2.22 GHD1 WS HCds UZC CCA DC N3626=N3632 11 20 03.90 +18 21 24.9 6 2.93 3.06 WS DC CCA UZC HC GH N3627 11 20 15.00 +12 59 26.5 10 1.67 4.38 WS GH McN HC2m HHKK GSCM HCds CCA CB2 UZC N3628 11 20 16.95 +13 35 19.4 7 2.05 2.98 WS CCA CB2 vdH+ HC2m CCR CCO N3629 11 20 31.74 +26 57 45.7 6 1.86 1.64 BPP WS DC GHD1 UZC CCA N3630=N3645 11 20 16.97 +02 57 51.2 4 0.73 0.97 WS CCA UZC GSC N3631 11 21 02.755 +53 10 11.03 9 1.55 2.41 GHD1 WS DC CCA UZC CB2 HC2m UJ10 GSC N3632=N3626 11 20 03.90 +18 21 24.9 6 2.93 3.06 WS DC CCA UZC HC GH N3633 11 20 26.32 +03 35 09.3 7 3.77 2.33 DC WS UZC CCA GH ZGT HC N3634 11 20 30.3 -09 00 50 2 0.00 0.00 SPC WS N3635 11 20 31.403 -09 00 49.23 2 0.24 0.35 KHJ SPC N3636 11 20 25.0 -10 16 55 4 3.05 2.08 GHD2 Pds WS SPC N3637 11 20 39.5 -10 15 27 4 3.52 1.41 GHD2 APMn SPC WS N3638 11 20 10.01 -08 06 21.8 4 1.32 1.14 WS SPC HCds APMn N3639 11 21 35.69 +18 27 30.2 4 1.61 3.31 WS UZC HC CCA N3640 11 21 06.86 +03 14 05.6 6 1.47 2.34 WS DC CCA SPC UZC GH N3641 11 21 08.81 +03 11 40.6 4 1.90 2.09 DC WS CCA GH N3642 11 22 17.915 +59 04 29.08 7 2.04 2.53 WS CCA UJ10 GHD1 GSC UZC DC N3643 11 21 25.01 +03 00 49.1 5 3.41 1.93 HC WS UZC GSC ZGT N3644=I0684 11 21 32.84 +02 48 37.1 6 3.59 1.34 ZGT GSC CCA WS HC UZC N3645=N3630 11 20 16.97 +02 57 51.2 4 0.73 0.97 WS CCA UZC GSC N3646 11 21 43.23 +20 10 11.5 5 1.53 3.77 UZC WS DC CCA GH N3647 11 21 38.57 +02 53 29.4 2 0.21 0.92 HC GSC N3648 11 22 31.55 +39 52 35.9 5 2.05 1.26 WS UZC CCA SBG1 DC N3649=I0682 11 22 14.78 +20 12 30.3 4 0.70 2.17 WS UZC GH CCA N3650 11 22 35.36 +20 42 13.8 6 1.67 1.50 MB Pds CCA GH UZC WS N3651 11 22 26.34 +24 17 55.5 5 0.94 1.50 WS GSC HCds UZC HKA N3652 11 22 39.09 +37 45 53.3 4 1.37 1.90 WS UZC SBG1 CCA N3653 11 22 30.089 +24 16 45.21 5 1.50 0.57 HCds GSC KHJ UZC HKA N3654 11 24 11.30 +69 24 46.0 5 2.65 2.39 WS UZC CCA DC HC N3655 11 22 54.69 +16 35 22.2 3 0.25 1.54 CCA WS UZC N3656 11 23 38.53 +53 50 30.8 3 0.67 1.04 CCA UZC WS N3657 11 23 55.54 +52 55 14.8 3 0.99 1.25 WS CCA UZC N3658 11 23 58.35 +38 33 45.6 6 1.69 1.65 DC UZC GHD1 CCA SBG1 WS N3659 11 23 45.16 +17 49 01.6 5 1.39 2.61 WS DC GH CCA UZC N3660 11 23 32.2 -08 39 30 4 0.00 1.26 KEB1 APMn SPC WS N3661=I0689 11 23 38.4 -13 49 51 4 1.40 1.41 APMn WS SPC Pds N3662 11 23 46.64 -01 06 16.7 7 3.22 2.54 WS UZC GSC ZGT GH DC SPC N3662A 11 23 45.7 -01 05 58 1 DC N3662B 11 23 46.0 -01 06 22 1 DC N3663 11 23 59.9 -12 17 46 3 0.00 2.08 SPC APMn WS N3664 11 24 24.8 +03 19 37 6 4.42 4.86 FT WS DC HC HCds UZC N3664A 11 24 25.26 +03 13 18.7 7 3.85 1.53 WS GH UZC CCA HC ZGT STMW N3665 11 24 43.58 +38 45 45.5 7 2.62 1.92 DC GHD1 vdH+ WS CCA UZC SBG1 N3666 11 24 26.21 +11 20 32.3 4 0.80 3.68 GH WS UZC CCA N3667=N3667A 11 24 16.966 -13 51 26.62 3 0.68 1.53 HCo SPC KHJ N3667B 11 24 21.3 -13 51 22 3 0.00 0.58 WS HCo SPC N3668 11 25 30.69 +63 26 44.3 4 3.34 2.16 WS UZC CCA DC N3669 11 25 26.84 +57 43 15.8 5 2.71 3.97 WS GHD1 UZC CCA DC N3670 11 24 49.70 +23 56 42.1 5 1.22 0.60 WS HCds UZC Pds CCA N3671 11 25 52.475 +60 28 46.17 3 0.53 1.15 HCds Pds KHJ N3672 11 25 02.3 -09 47 42 3 0.85 0.58 WS GHD2 SPC N3673 11 25 12.7 -26 44 12 3 2.05 0.58 ESOB WS GHD2 N3674 11 26 26.58 +57 02 54.9 6 1.65 2.23 WS Pds UZC GHD1 DC CCA N3675 11 26 08.36 +43 35 08.6 5 2.86 1.21 WS HCds GHD1 HC2m CB2 N3676 11 25 37.509 -11 08 23.08 3 0.45 0.26 GSC KHJ SPC N3677 11 26 17.709 +46 58 25.65 7 1.60 1.19 SBG1 DC KHJ UZC Pds GHD1 CCA N3678 11 26 15.66 +27 51 59.7 6 1.89 0.91 DC BPP WS K09 UZC CCA N3679: 11 21 48.00 -05 45 28.7 2 0.53 0.99 GSC HCo N3680 11 25 38 -43 14.6 2 15.52 38.18 BSV ESOB N3681 11 26 29.76 +16 51 48.0 5 2.77 1.97 DC WS UZC CCA GH N3682 11 27 41.69 +66 35 24.2 5 3.40 0.73 UZC WS CCA GHD1 DC N3683 11 27 31.89 +56 52 39.6 5 1.29 2.30 WS CCA UZC GHD1 DC N3683A 11 29 12.02 +57 07 56.1 4 3.87 0.99 WS UZC CCA GHD1 N3684 11 27 11.24 +17 01 47.9 5 1.94 1.14 DC WS UZC CCA GH N3685 11 28 16.24 +04 19 40.2 1 HCds N3686 11 27 44.09 +17 13 24.5 5 0.32 1.65 CCA WS DC GH UZC N3687 11 28 00.61 +29 30 39.3 7 1.35 1.10 WS K09 UZC FPB HC2m CCA BPP N3688 11 27 44.432 -09 09 56.37 2 0.46 0.27 SPC KHJ N3689 11 28 11.09 +25 39 39.1 5 2.41 0.83 WS UZC Pds GH CCA N3690e 11 28 33.380 +58 33 49.00 12 2.79 2.88 SDP GHD1 CCA HCds IPds GSC HCo HC2m CCR DC GSWr vdH+ N3690nw 11 28 30.64 +58 33 48.1 2 0.22 1.41 GSWo GSWr N3690sw 11 28 30.89 +58 33 40.5 2 1.21 0.07 GSWo GSWr N3690w 11 28 30.80 +58 33 42.8 5 1.01 0.66 IPds HC2m HCo GSC HCds N3690w+e 11 28 32.12 +58 33 48.3 2 2.63 4.31 GSC WS N3690wl 11 28 30.65 +58 33 30.7 5 2.93 2.01 UZC WS GHD1 CCA DC N3691 11 28 09.44 +16 55 12.8 5 0.63 2.59 WS GH UZC CCA KEBA N3692 11 28 24.02 +09 24 25.0 4 3.14 1.35 WS UZC CCA DC N3693 11 28 11.610 -13 11 42.74 3 0.53 1.21 KHJ SPC APMn N3694 11 28 54.19 +35 24 49.6 8 2.60 1.28 WS UZC KEBA GSC HCds SBG1 CCA DC N3695=N3698 11 29 17.32 +35 34 31.0 6 0.38 0.89 GSC CCA HCds SBG1 WS UZC N3696?? 11 28 44.02 -11 16 58.6 3 2.31 1.51 WS GSC SPC N3697=N3697A 11 28 50.46 +20 47 42.2 5 1.89 1.65 WS UZC HKA CCA DC N3697B 11 28 58.55 +20 45 00.1 1 HKA N3697C 11 29 00.00 +20 44 22.0 1 HKA N3698=N3695 11 29 17.32 +35 34 31.2 5 0.42 0.87 GSC HCds SBG1 WS UZC N3699 11 27 57.0 -59 57 27 3 2.62 1.73 SIMB ESOB BSV N3699nw 11 27 56.5 -59 57 12 1 HCo N3699se 11 27 58.21 -59 57 37.1 2 2.57 0.07 HCo GSC N3700 11 29 38.59 +35 30 52.3 6 0.94 0.50 WS UZC SBG1 HCds GSC CCA N3701 11 29 28.97 +24 05 35.5 4 1.48 1.41 WS UZC DC CCA N3702 11 30 13.407 -08 51 48.22 3 0.95 1.80 SPC APMn KHJ N3703? 11 29 09.27 -08 26 46.7 1 HCds N3704=?I0703 11 30 04.714 -11 32 47.63 5 1.11 1.95 GSC KHJ SPC APMn Pds N3705 11 30 07.45 +09 16 35.5 5 1.73 2.67 UZC GH GSC WS CCA N3705A=I2887 11 30 29.59 +09 23 17.2 5 1.30 2.71 WS GD UA10 HCo UZC N3705B 11 29 43.8 +09 12 18 1 HCo N3706 11 29 44.1 -36 23 31 2 1.71 1.41 ESOB WS N3707=?I0704 11 30 11.580 -11 32 36.51 3 0.70 0.40 GSC KHJ SPC N3708 11 30 39 -03 13.4 1o OSt1 N3709 11 30 39 -03 15.4 1o OSt1 N3710 11 31 06.958 +22 46 04.26 4 1.19 0.67 DC KHJ UZC CCA N3711n 11 29 26.04 -11 04 27.1 2 1.35 0.71 WS GSC N3711s 11 29 25.56 -11 04 48.8 3 1.50 0.76 WS GSC SPC N3712:=N3714 11 31 53.60 +28 21 29.3 10 1.17 1.42 DC HCds HC2m WS BPP KEBA UZC K09 K15 CCA N3713 11 31 41.99 +28 09 12.3 6 1.24 1.16 WS HCds BPP UZC DC CCA N3714=:N3712 11 31 53.60 +28 21 29.3 10 1.17 1.42 DC HCds HC2m WS BPP KEBA UZC K09 K15 CCA N3715 11 31 32.3 -14 13 55 3 1.46 1.53 WS SPC APMn N3716 11 31 41.21 +03 29 15.3 4 0.89 1.42 CCA WS UZC ZGT N3717 11 31 31.98 -30 18 29.8 5 3.34 3.09 ESOB GSCM WS GSC GHD2 N3718 11 32 34.95 +53 04 03.6 7 3.04 2.91 CCA WS GHD1 TVP GSCM UZC DC N3719 11 32 13.49 +00 49 10.3 6 0.74 2.42 UZC WS SPC APMn DC CCA N3720 11 32 21.72 +00 48 14.1 11 2.90 1.66 SPC WS GSCA UB10 HC2m GSC2 APMN CCA ZGT GH DC N3721? 11 34 07.841 -09 28 01.50 2 0.38 0.35 KHJ SPC N3722? 11 34 23.280 -09 40 48.18 3 0.53 0.20 SPC GSC KHJ N3723 11 32 30.478 -09 58 10.86 2 1.47 0.74 SPC KHJ N3724? 11 34 28.73 -09 39 35.7 3 0.60 0.52 GSC SPC WS N3725 11 33 41.00 +61 53 17.3 4 1.94 2.90 WS CCA SDP DC N3726 11 33 21.057 +47 01 42.97 9 2.03 3.25 SBG1 WS DC UJ10 HC2m GSC CCA UZC TVP N3727 11 33 40.901 -13 52 43.60 2 0.57 0.64 GSC KHJ N3728 11 33 15.835 +24 26 48.37 5 0.81 0.66 UZC KHJ HCds Pds CCA N3729 11 33 49.34 +53 07 32.3 6 0.94 1.59 WS UZC GSC K01 TVP CCA N3730? 11 34 16.864 -09 34 34.20 3 0.20 0.15 SPC GSC KHJ N3731 11 34 11.704 +12 30 43.33 4 1.04 1.13 DC KHJ UZC CCA N3732 11 34 13.88 -09 50 45.8 4 0.74 2.38 GHD2 WS SPC GSC N3733 11 35 01.78 +54 51 02.2 4 0.57 3.96 WS UZC DC CCA N3734 11 34 40.649 -14 04 54.73 3 0.39 0.76 GSC SPC KHJ N3735 11 35 57.29 +70 32 07.0 3 0.96 1.55 WS UZC CCA N3736 11 35 41.589 +73 27 06.44 4 0.54 0.97 Pds HCds CCA KHJ N3737 11 35 36.33 +54 56 56.4 5 2.32 3.66 GHD1 WS UZC CCA DC N3737A 11 35 32.1 +54 55 55 1 HCm N3738 11 35 48.54 +54 31 25.1 6 1.61 2.83 WS GSC UZC CCA DC GHD1 N3739 11 35 37.57 +25 05 18.0 5 1.57 1.50 HCds WS UZC Pds CCA N3740 11 36 12.33 +59 58 33.8 4 1.45 0.64 WS UZC HCds CCA N3741 11 36 06.15 +45 17 04.2 5 1.62 3.24 WS CCA UZC SBG1 DC N3742 11 35 32.6 -37 57 26 2 6.72 4.95 WS ESOB N3743 11 35 57.248 +21 43 23.66 2 2.66 3.32 HC KHJ N3744 11 35 57.924 +23 00 41.49 4 0.77 2.08 KHJ UZC HC Pds N3745 11 37 44.46 +22 01 16.1 4 1.49 3.48 HC WS BCG HKA N3746 11 37 43.63 +22 00 33.6 7 1.21 0.92 WS BCG UZC JG HKA CCA HC N3747 11 32 30.95 +74 22 43.0 1 GSC N3748 11 37 49.12 +22 01 32.6 6 0.64 0.50 HC JG BCG WS UZC HKA N3749 11 35 53.0 -37 59 50 2 0.00 2.83 ESOB WS N3750 11 37 51.681 +21 58 26.24 7 1.11 1.90 HC KHJ JG BCG Pds UZC HKA N3751 11 37 53.91 +21 56 10.9 5 1.54 2.41 BCG WS HC CCA HKA N3752 11 32 32.10 +74 37 39.2 4 0.93 1.31 CCA Pds UZC WS N3753 11 37 53.90 +21 58 52.0 6 1.72 2.11 HKA WS UZC BCG CCA HC N3754 11 37 54.98 +21 59 06.5 5 2.11 1.40 HC WS BCG UZC HKA N3755 11 36 33.31 +36 24 37.9 6 1.63 2.38 GHD1 WS CCA UZC DC SBG1 N3756 11 36 48.4 +54 17 44 4 1.93 3.46 UZC DC GHD1 K01 N3757 11 37 03.08 +58 24 54.0 4 1.84 2.90 UZC WS CCA DC N3758 11 36 29.0 +21 35 48 4 2.64 4.08 HC BCG WS FPB N3758e 11 36 29.259 +21 35 45.74 2 2.52 0.01 UZC EDC N3758w 11 36 28.961 +21 35 46.37 1 EDC N3759 11 36 54.15 +54 49 24.1 5 2.19 2.33 WS CCA UZC GHD1 DC N3759A 11 36 58.24 +55 09 44.2 4 3.43 3.14 UZC WS CCA GHD1 N3760=N3301 10 36 55.90 +21 52 54.7 6 2.60 3.36 DC WS UZC HCds CCA GH N3761 11 36 44.283 +22 59 29.92 5 3.27 3.40 KHJ JG Pds UZC HC N3762 11 37 24.09 +61 45 33.6 4 2.54 3.43 WS UZC CCA DC N3763=I0714 11 36 30.2 -09 50 49 2 0.00 2.83 SPC WS N3764 11 36 54.538 +17 53 18.52 4 1.75 1.55 Pds UZC KHJ HCds N3765 11 37 04.28 +24 05 45.5 3 0.70 1.01 UZC JG WS N3766 11 36 14 -61 36.5 2 0.00 12.73 ESOB BSV N3767 11 37 15.567 +16 52 36.01 4 0.95 1.86 UZC KHJ DC CCA N3768 11 37 14.39 +17 50 22.2 6 3.33 1.96 DC WS UZC Pds CCA HCds N3769 11 37 44.15 +47 53 33.9 8 1.70 2.79 DC WS HCo TVP UZC CCA GSC SBG1 N3769A 11 37 50.35 +47 52 54.7 3 1.00 4.11 HCo SBG1 WS N3770 11 37 58.93 +59 36 59.7 4 1.63 0.71 WS UZC CCA DC N3771: 11 39 05.94 -09 20 53.9 5 1.06 0.95 Pds2 SPC WS APMn GSC N3772 11 37 48.51 +22 41 28.4 5 1.04 3.56 WS GSC CCA UZC DC N3773 11 38 12.95 +12 06 43.8 7 2.33 0.92 DC GH FPB WS UZC K05 CCA N3774: 11 38 30.25 -08 58 35.1 3 1.60 1.08 SPC GSC WS N3775 11 38 26.7 -10 38 18 2 0.00 0.71 WS SPC N3776 11 38 18.048 -03 21 16.71 5 2.78 1.56 GSC SPC GGH KHJ ZGT N3777 11 36 06.8 -12 34 09 2 0.00 0.71 SPC WS N3778 11 38 21.5 -50 42 59 2 2.03 2.83 WS ESOB N3779=I0717 11 38 51.0 -10 35 01 4 2.95 2.99 APMn SPC WS Pds N3780 11 39 22.62 +56 16 12.0 3 2.64 3.79 UZC CCA GHD1 N3781 11 39 03.84 +26 21 42.2 5 0.98 1.72 UZC BPP GSC WS JG N3782 11 39 20.70 +46 30 47.9 8 1.13 2.73 WS CCA GHD1 TVP DC SBG1 Pds UZC N3783 11 39 01.71 -37 44 19.4 3 1.37 0.64 WS ESOB WMe N3784 11 39 29.81 +26 18 33.1 6 1.15 1.68 WS UZC Pds BPP GSC JG N3785 11 39 32.92 +26 18 07.9 6 1.35 1.53 UZC CCA WS BPP GSC JG N3786 11 39 42.42 +31 54 32.3 9 1.79 2.00 DC UZC GHD1 FPB GSC WS BPP HHKK CCA N3787 11 39 38.02 +20 27 16.0 5 1.70 1.01 KEBA UZC GSC WS JG N3788 11 39 44.627 +31 55 51.24 9 3.10 3.22 DC AC CCA WS UZC GHD1 GSC Pds BPP N3789 11 38 09.1 -09 36 26 3 0.85 1.53 WS SPC APMn N3790 11 39 47.32 +17 42 44.1 5 2.25 2.72 WS HCds UZC CCA DC N3791 11 39 41.668 -09 22 01.98 2 0.67 0.22 SPC KHJ N3792 11 39 38.5 +05 05 58 1 HCds N3792 nw * 11 39 38.13 +05 06 00.1 1 GSC N3792 se * 11 39 38.91 +05 05 51.5 1 HCds N3793 11 40 02.03 +31 52 38.8 1 GSC N3794=N3804 11 40 54.33 +56 12 06.5 5 2.46 2.78 WS UZC CCA GHD1 DC N3795 11 40 06.86 +58 36 44.2 4 2.58 1.74 CCA WS UZC DC N3795A 11 39 21.33 +58 16 06.2 3 1.90 0.50 DC UZC CCA N3795B 11 38 08.84 +58 45 29.6 3 2.83 1.44 UZC CCA DC N3796 11 40 30.89 +60 17 55.5 4 3.34 2.60 DC WS UZC CCA N3797 11 40 13.35 +31 54 21.9 2 0.81 2.40 GSC WS N3798 11 40 13.94 +24 41 48.7 4 0.72 2.14 WS DC CCA UZC N3799 11 40 09.28 +15 19 37.5 6 3.19 1.53 DC WS GH UZC CCA K05 N3800 11 40 13.28 +15 20 31.4 8 2.12 1.75 DC WS K05 CCA Pds GH UZC HHKK N3801 11 40 16.83 +17 43 39.6 4 1.34 2.57 UZC WS HCds CCA N3802 11 40 18.81 +17 45 55.4 5 1.20 2.33 WS CCA UZC HCds Pds N3803 11 40 17.30 +17 48 04.1 3 0.91 1.67 HCds Pds2 WS N3804=N3794 11 40 54.33 +56 12 06.5 5 2.46 2.78 WS UZC CCA GHD1 DC N3805 11 40 41.72 +20 20 34.8 4 1.77 1.08 WS UZC CCA DC N3806 11 40 46.67 +17 47 44.1 4 0.67 1.64 HCds WS UZC CCA N3807 11 41 52.49 +17 49 13.3 2 0.10 1.13 REds HCds N3808 11 40 44.12 +22 25 44.6 8 3.14 3.06 HC JG WS DC HHKK Pds UZC CCA N3808A 11 40 44.64 +22 26 47.1 6 2.40 2.34 JG HHKK CCA DC WS HC N3809 11 41 15.84 +59 53 09.3 5 2.40 1.65 DC WS KEBA CCA UZC N3810 11 40 58.85 +11 28 17.5 6 2.54 3.86 WS UZC CCA HHKK MJC GH N3811 11 41 16.73 +47 41 27.7 5 1.59 1.59 WS DC SBG1 UZC CCA N3812 11 41 07.76 +24 49 17.7 7 0.60 1.06 JG CCA DC Pds UZC WS GSC N3813 11 41 18.46 +36 32 48.0 6 2.23 1.85 DC GHD1 WS CCA SBG1 UZC N3814 11 41 27.71 +24 48 18.8 4 0.64 0.85 Pds2 JG WS GSC N3815 11 41 39.30 +24 47 60.0 7 1.01 1.08 DC CCA JG Pds WS GSC UZC N3816 11 41 47.95 +20 06 13.1 4 1.75 2.59 WS DC UZC CCA N3817 11 41 53.02 +10 18 13.7 6 1.92 3.18 WS GSC UZC CCA DC HKA N3818 11 41 57.4 -06 09 21 4 1.22 0.50 WS APMn SPC GHD2 N3819 11 42 05.891 +10 21 03.51 4 0.31 0.39 KHJ UZC GSC HKA N3820 11 42 04.87 +10 23 02.2 3 1.51 1.03 WS HKA HCo N3821 11 42 09.05 +20 18 55.7 4 2.22 2.94 DC WS UZC CCA N3822=N3848 11 42 11.17 +10 16 39.3 6 1.20 0.67 WS HKA GSC UZC CCA DC N3823 11 42 15.2 -13 52 00 2 1.03 1.41 WS SPC N3824 11 42 44.93 +52 46 45.7 3 1.18 0.53 WS UZC CCA N3825=N3852 11 42 23.72 +10 15 50.6 6 1.24 0.58 HKA DC GSC UZC WS CCA N3826=N3830 11 42 32.90 +26 29 20.5 7 0.37 1.50 GSC WS UZC BPP DC JG CCA N3827 11 42 36.23 +18 50 41.6 4 2.07 1.26 DC WS UZC CCA N3828 11 42 58.41 +16 29 13.8 3 0.76 1.27 WS GSC Pds N3829 11 43 27.34 +52 42 40.1 5 0.68 3.36 K01 WS UZC CCA GHD1 N3830=N3826 11 42 32.90 +26 29 20.5 7 0.37 1.50 GSC WS UZC BPP DC JG CCA N3831 11 43 18.59 -12 52 40.8 4 0.29 1.25 APMn SPC WS GSC N3832 11 43 31.42 +22 43 30.7 7 1.62 1.07 JG DC HC WS Pds UZC CCA N3833 11 43 28.95 +10 09 41.3 5 1.78 1.50 HCo WS UZC CCA Pds N3834 11 43 37.7 +19 05 24 4 0.00 1.29 SPC WS Pds UZC N3835 11 44 05.08 +60 07 12.3 5 2.41 2.22 CCA UZC WS GHD1 DC N3835A 11 47 22.81 +60 18 00.0 3 1.22 2.73 DC CCA UZC N3836n 11 43 29.8 -16 47 40 2 1.02 0.71 HCo APMn N3836n+s 11 43 29.9 -16 47 46 1 SPC N3836s 11 43 30.0 -16 47 53 2 3.05 1.41 WS HCo N3837 11 43 56.48 +19 53 40.4 6 1.36 1.34 UZC KEBA GSC CCA WS DC N3838 11 44 13.86 +57 56 52.7 3 0.80 1.65 UZC CCA GHD1 N3839 11 43 54.45 +10 47 02.9 5 2.45 2.77 CCA UZC DC WS STMW N3840 11 43 58.97 +20 04 36.8 4 0.71 1.92 UZC HCds WS CCA N3841 11 44 02.15 +19 58 17.8 4 0.74 0.90 WS GSC SPC UZC N3842 11 44 02.17 +19 56 58.3 7 2.89 1.51 WS DC UZC GSC SPC CCA RC2 N3843 11 43 54.66 +07 55 32.2 4 1.04 0.70 WS UZC GGH CCA N3844 11 44 00.86 +20 01 45.2 5 0.71 1.37 UZC HCds CCA WS Pds N3845 11 44 05.49 +19 59 44.3 4 0.00 1.38 SPC WS UZC GSC N3846 11 44 29.16 +55 39 05.8 3 2.53 2.00 WS CCA GHD1 N3846A 11 44 14.95 +55 02 06.0 6 1.77 1.34 WS HCo CCA UZC DC GHD1 N3847=:N3856 11 44 14.02 +33 30 51.8 5 0.72 1.32 WS UZC CCA GSC SBG1 N3848=N3822 11 42 11.17 +10 16 39.2 6 1.20 0.64 WS HKA GSC UZC CCA DC N3849=I0730 11 45 35.187 +03 13 53.42 5 1.45 2.04 ZGT GGH UZC KHJ HCds N3850 11 45 35.72 +55 53 10.7 5 3.60 1.96 CCA WS UZC GHD1 DC N3851 11 44 20.39 +19 58 50.3 5 0.61 0.64 Pds WS UZC GSC KEBA N3852=N3825 11 42 23.72 +10 15 50.6 6 1.24 0.58 HKA DC GSC UZC WS CCA N3853 11 44 28.40 +16 33 28.3 5 1.27 1.59 CCA WS Pds UZC DC N3854=N3865 11 44 51.9 -09 13 59 3 2.96 1.53 GHD2 SPC HCo N3855:=I2953 11 44 25.90 +33 21 19.1 6 1.96 1.81 UZC WS GSC SBG1 CCA MW8 N3856:=N3847 11 44 14.02 +33 30 51.8 5 0.72 1.32 WS UZC CCA GSC SBG1 N3857 11 44 50.10 +19 31 57.4 3 0.73 0.95 WS UZC GSC N3858=N3866 11 45 11.68 -09 18 51.8 3 1.01 1.70 WS SPC GSC N3859 11 44 52.33 +19 27 15.0 4 0.70 1.18 UZC CCA WS HCds N3860=N3860A 11 44 49.09 +19 47 40.8 5 3.16 1.86 DC GSC WS UZC CCA N3860B 11 44 47.73 +19 46 24.0 1 GSC N3861=N3861A 11 45 03.96 +19 58 26.4 5 2.08 5.24 WS UZC CCA DC Pds N3861B 11 45 07.0 +19 57 59 2 0.00 1.41 WS UZC N3862 11 45 05.0091 +19 36 21.672 7 0.66 1.05 UZC PCR GSC USNO SPC WS CCA N3863 11 45 05.50 +08 28 07.6 4 1.59 4.21 DC WS UZC CCA N3864 11 45 15.70 +19 23 30.9 3 1.27 1.44 WS UZC HCds N3865=N3854 11 44 51.9 -09 13 59 5 2.10 2.00 GHD2 APMn SPC WS HCo N3866=N3858 11 45 11.68 -09 18 51.8 3 1.01 1.70 WS SPC GSC N3867 11 45 29.65 +19 23 59.9 4 0.98 1.75 WS UZC CCA HCds N3868 11 45 29.95 +19 26 40.1 3 0.78 1.80 UZC HCds WS N3869 11 45 45.59 +10 49 27.1 4 1.22 1.79 DC WS UZC CCA N3870 11 45 56.55 +50 12 00.1 7 1.39 2.82 DC SDP UZC WS TVP CCA VPS N3871=I2959 11 46 10.18 +33 06 31.5 5 0.74 0.49 SBG1 WS GSC CCA UZC N3872 11 45 49.02 +13 45 59.8 5 1.46 2.19 WS DC UZC GH CCA N3873 11 45 46.01 +19 46 24.6 5 3.53 2.07 DC WS SPC UZC CCA N3874 11 45 37.8 +08 34 25 2 1.05 1.41 HCds WS N3874 e* 11 45 38.22 +08 34 25.9 1 HCds N3874 w* 11 45 37.21 +08 34 25.9 1 HCds N3875 11 45 49.47 +19 46 00.9 5 0.81 0.83 WS SPC Pds UZC CCA N3876 11 45 26.71 +09 09 39.1 4 2.09 2.97 WS UZC DC CCA N3877 11 46 07.768 +47 29 40.75 7 1.51 1.16 SBG1 GSC UZC UJ10 CCA TVP DC N3878 11 46 17.814 +33 12 15.82 4 0.26 0.51 SBG1 KHJ UZC GSC N3879 11 46 49.45 +69 22 58.4 4 0.90 2.80 UZC CCA DC WS N3880 11 46 22.264 +33 09 42.33 4 0.45 1.06 SBG1 KHJ GSC UZC N3881 11 46 34.438 +33 06 22.87 4 0.26 0.62 KHJ SBG1 GSC UZC N3882 11 46 06.1 -56 23 24 2 0.59 4.95 WS ESOB N3883 11 46 47.120 +20 40 32.05 4 2.52 2.61 DC UZC KHJ CCA N3884 11 46 12.21 +20 23 29.1 5 1.11 2.20 WS HCds UZC CCA DC N3885 11 46 46.5 -27 55 20 3 0.77 2.65 GHD2 ESOB WS N3886 11 47 05.47 +19 50 13.5 4 3.18 1.74 DC WS UZC CCA N3887 11 47 04.7 -16 51 16 5 2.18 0.84 MJC APMn WS SPC GHD2 N3888 11 47 34.39 +55 58 01.5 7 1.77 1.81 K01 vdK1 HCds HC UZC DC CCA N3889 11 47 47.98 +56 01 05.0 2 1.77 0.28 HCds WS N3890=N3939 11 49 19.93 +74 18 07.9 4 2.26 2.45 WS UZC CCA DC N3891 11 48 03.30 +30 21 33.8 6 1.97 0.69 DC WS JG CCA UZC BPP N3892 11 48 01.1 -10 57 46 4 2.79 4.27 APMn WS SPC GHD2 N3893 11 48 38.33 +48 42 39.0 8 3.20 2.25 SBG1 UZC WS TVP GSC GHD1 CCA DC N3894 11 48 50.49 +59 24 57.6 5 3.76 1.97 CCA WS UZC GHD1 DC N3895 11 49 04.12 +59 25 57.7 5 2.16 1.79 WS GHD1 UZC CCA DC N3896 11 48 56.48 +48 40 28.4 8 2.24 1.38 SBG1 WS UZC GSC TVP GHD1 CCA DC N3897 11 48 59.44 +35 00 56.9 5 1.04 1.38 SBG1 WS DC UZC CCA N3898 11 49 15.25 +56 05 03.3 6 1.42 1.82 GHD1 UZC DC HC WS CCA N3899=N3912 11 50 04.61 +26 28 47.1 5 1.03 2.67 WS UZC CCA JG BPP N3900 11 49 09.41 +27 01 19.2 5 1.27 3.28 WS UZC BPP GHD1 CCA N3901 11 42 49.06 +77 22 21.0 3 0.52 1.49 Pds CCA WS N3902 11 49 18.83 +26 07 18.3 5 1.51 2.55 WS UZC CCA DC GHD1 N3903 11 49 03.7 -37 31 01 2 5.91 3.54 WS ESOB N3904 11 49 13.1 -29 16 36 3 3.03 2.31 ESOB GHD2 WS N3905 11 49 05.0 -09 43 46 4 1.21 1.15 WS SPC APMn GHD2 N3906 11 49 40.26 +48 25 32.4 7 1.03 2.21 WS DC TVP UZC CCA GHD1 SBG1 N3907=N3907A 11 49 30.161 -01 05 11.52 6 1.21 0.54 UZC GGH GSC KHJ CCA SPC N3907B 11 49 23.52 -01 05 02.4 6 1.41 1.59 CCA UZC SPC GGH GSC ZGT N3908: 11 49 52.607 +12 11 08.05 3 1.57 1.72 Pds2 KHJ GSC N3909 11 50 06 -48 14.8 2 28.41 46.67 HCe ESOB N3910 11 49 59.37 +21 19 59.7 6 1.51 0.89 JGV Pds WS UZC CCA DC N3911 11 50 06.01 +24 55 12.7 7 1.93 1.25 WS KEBA CCA GSC UZC HCds DC N3912=N3899 11 50 04.61 +26 28 47.1 5 1.03 2.67 WS UZC CCA JG BPP N3913=I0740 11 50 38.85 +55 21 12.9 9 1.74 1.46 WS K01 DC UZC TVP WR HC GSC CCA N3914 11 50 32.76 +06 34 03.7 5 1.71 2.14 WS GGH UZC CCA DC N3915? 11 46 55.59 -05 11 17.5 2 0.00 2.55 HCo GSC N3915??=I2963 11 49 24.6 -05 07 06 1 WS N3916 11 50 51.00 +55 08 36.5 6 2.41 3.82 GHD1 GSC HC UZC CCA WS N3917 11 50 45.46 +51 49 29.3 7 0.86 2.72 TVP UZC DC GSC HC WS CCA N3917A=N3931 11 51 13.511 +52 00 01.96 8 1.11 1.38 GSC HCo UZC TVP KHJ CCA HC GHD1 N3918 11 50 17.79 -57 10 56.4 2 0.17 0.07 UCA1 GSC N3919 11 50 41.61 +20 00 53.8 4 1.28 0.25 WS UZC CCA DC N3920 11 49 22.14 +24 56 18.6 5 0.75 1.41 WS CCA HCds UZC GSC N3921 11 51 06.73 +55 04 43.5 8 2.43 1.85 HC SDP K01 GSC UZC WS DC CCA N3922=N3924 11 51 13.47 +50 09 23.2 6 0.60 2.84 WS UZC VPS DC Pds CCA N3923 11 51 01.86 -28 48 22.9 8 2.35 2.74 WS HC2m HCds GSC GHD2 GSCA ESOB GC N3924=N3922 11 51 13.47 +50 09 23.2 6 0.60 2.84 WS UZC VPS DC Pds CCA N3925 11 51 20.97 +21 53 20.2 4 0.73 2.27 WS Pds2 JG UZC N3926=N3926A 11 51 26.619 +22 01 39.48 4 0.96 1.28 JG KHJ Pds CCA N3926B 11 51 28.288 +22 01 33.12 4 1.02 1.17 UZC KHJ CCA JG N3927 11 51 32 +28 08.4 1o d'A N3928 11 51 47.61 +48 40 58.2 9 1.25 1.40 SDP DC SBG1 WS UZC HCds GHD1 TVP CCA N3929 11 51 42.625 +21 00 09.27 5 2.55 0.61 JGV UZC KHJ CCA DC N3930 11 51 45.91 +38 00 52.7 8 1.56 1.69 WS HCds CCA K06 GHD1 UZC SBG1 DC N3930A 11 52 02.21 +38 01 12.8 1 HCds N3931=N3917A 11 51 13.515 +52 00 01.96 8 1.10 1.38 GSC HCo UZC TVP KHJ CCA HC GHD1 N3932 11 52 10.77 +48 37 13.2 1 HCds N3933 11 52 02.05 +16 48 34.5 4 2.12 1.45 WS UZC CCA HCds N3934 11 52 12.61 +16 51 05.6 4 1.73 1.42 WS UZC HCds CCA N3935 11 52 24.07 +32 24 14.5 7 2.03 0.80 WS K06 K13 CCA SBG1 UZC DC N3936 11 52 20.4 -26 54 23 2 0.00 0.71 ESOB WS N3937 11 52 42.62 +20 37 52.9 6 1.17 1.87 JGV WS UZC DC GSC CCA N3938 11 52 49.38 +44 07 14.5 8 1.19 1.16 WS UZC TVP GHD1 GSC HC2m CCA SBG1 N3939=N3890 11 49 19.93 +74 18 07.9 4 2.26 2.45 WS UZC CCA DC N3940 11 52 46.49 +20 59 21.2 5 1.49 1.97 JGV UZC WS DC CCA N3941 11 52 55.23 +36 59 11.2 6 1.80 1.24 DC GHD1 SBG1 UZC WS CCA N3942 11 51 30.0 -11 25 28 3 0.85 1.53 SPC APMn WS N3943 11 52 56.59 +20 28 43.8 4 0.53 0.97 WS UZC GSC JGV N3944 11 53 05.17 +26 12 25.3 6 2.04 1.46 WS BPP UZC CCA JG DC N3945 11 53 13.91 +60 40 32.8 5 3.77 3.30 WS UZC CCA GHD1 DC N3946 11 53 20.54 +21 01 15.7 3 0.24 1.06 JGV WS UZC N3947 11 53 20.28 +20 45 06.2 6 2.12 2.73 DC JGV WS UZC GSC CCA N3948 11 53 36.65 +20 57 02.6 2 0.59 1.70 WS HCds N3949 11 53 41.51 +47 51 32.4 8 2.41 1.95 GHD1 HCds SBG1 WS DC UZC TVP CCA N3950: 11 53 41.21 +47 53 04.6 2 1.20 1.48 WS HCds N3951 11 53 41.28 +23 22 55.2 5 0.56 1.47 UZC JG CCA WS DC N3952=I2972 11 53 40.7 -03 59 46 4 1.93 0.58 SPC Pds GHD2 APMn N3953 11 53 49.016 +52 19 36.39 8 1.85 0.97 GSCM UZC UJ10 GSC HC2m TVP CCA DC N3954 11 53 41.68 +20 52 56.9 7 0.90 2.52 JGV KEBA WS UZC DC HCds CCA N3955 11 53 57.16 -23 09 52.6 3 0.32 1.13 GHD2 WS HCds N3956 11 54 00.8 -20 34 00 4 1.82 1.83 GHD2 SPC WS ESOB N3957=I2965 11 54 01.6 -19 34 10 3 1.42 2.65 WS SPC GHD2 N3958 11 54 33.93 +58 21 59.8 5 3.09 1.49 WS UZC CCA GHD1 DC N3959 11 54 37.7 -07 45 24 3 2.58 0.00 APMn WS SPC N3960 11 50 33 -55 40.4 2 0.00 16.97 ESOB BSV N3961 11 54 57.54 +69 19 47.7 5 0.34 2.27 CCA WS HCds Pds UZC N3962 11 54 39.9 -13 58 29 3 1.68 1.00 WS SPC GHD2 N3963 11 54 59.00 +58 29 35.5 5 2.16 1.24 UZC WS CCA GHD1 DC N3964 11 54 53.51 +28 15 43.9 4 1.67 0.49 WS UZC JG BPP N3965 11 55 07 -10 52.7 1o Le2 N3966=N3986 11 56 44.07 +32 01 16.8 7 3.50 1.98 DC GHD1 CCA WS BPP UZC HCds N3967 11 55 10.445 -07 50 39.23 4 0.77 3.28 KHJ APMn GSC SPC N3968 11 55 28.75 +11 58 04.7 3 0.93 0.51 WS UZC CCA N3969 11 55 09.2 -18 55 38 3 1.42 2.31 WS ESOB SPC N3970 11 55 28.01 -12 03 40.7 4 2.19 2.88 SPC APMn WS GSC N3971=N3984 11 55 36.46 +29 59 45.2 7 0.66 1.37 WS UZC DC GSC CCA BPP JG N3972 11 55 45.22 +55 19 12.5 4 0.75 2.27 TVP UZC CCA WS N3973 11 55 37.0 +11 59 48 3 0.00 1.53 WS Pds UZC N3974 11 55 40.1 -12 01 38 3 0.00 1.53 APMn SPC WS N3975 11 55 53.6 +60 31 43 3 1.12 1.53 Pds2 WS GHD1 N3976 11 55 57.31 +06 44 55.8 7 0.68 2.45 WS SPC HCds GGH UZC GH CCA N3976A 11 56 02.59 +06 40 40.5 2 1.05 0.71 HCds UZC N3976A * 11 56 01.87 +06 41 17.8 2 0.21 0.64 GGH HCds N3976A comp 11 56 02.14 +06 40 33.9 1 HCds N3977=N3980 11 56 07.53 +55 23 26.3 5 3.45 2.83 UZC WS CCA HCds GHD1 N3978 11 56 10.40 +60 31 19.9 6 1.34 0.49 Pds GHD1 UZC CCA WS DC N3979=I2976 11 56 01.10 -02 43 14.9 9 2.77 2.89 ZGT GSC UZC WS GGH CCA SPC APMn DC N3980=N3977 11 56 07.53 +55 23 26.3 5 3.45 2.83 UZC WS CCA HCds GHD1 N3981 11 56 07.18 -19 53 47.3 6 1.89 3.27 WS GSCM HCds GSC ESOB SPC N3982 11 56 28.249 +55 07 30.58 9 2.27 2.73 WS DC UZC AE UW TVP CCA K01 GHD1 N3983 11 56 23.67 +23 52 02.7 5 1.76 1.20 Pds WS UZC JG CCA N3984=N3971 11 55 36.46 +29 59 45.2 7 0.66 1.37 WS UZC DC GSC CCA BPP JG N3985 11 56 41.91 +48 20 04.4 10 2.40 1.72 WS TVP SBG1 KEBA DC UZC HCo CCA GSC GHD1 N3985w 11 56 39.9 +48 20 02 1 HCo N3986=N3966 11 56 44.07 +32 01 16.8 7 3.50 1.98 DC GHD1 CCA WS BPP UZC HCds N3987 11 57 20.97 +25 11 42.1 7 1.44 1.17 WS UZC HCds GSC CCA JGV DC N3988 11 57 24.214 +27 52 38.70 4 0.56 0.86 UZC KHJ JG BPP N3989 11 57 26.67 +25 13 57.8 5 1.16 1.62 WS K10 GSC HCds JGV N3990 11 57 35.794 +55 27 31.40 7 2.81 2.61 WS AC UZC TVP CCA GHD1 DC N3991 11 57 30.73 +32 20 14.3 2 1.34 2.47 DC SBG1 N3991ne 11 57 31.62 +32 20 26.8 3 1.93 0.61 Pds GSC K13 N3991sw 11 57 30.43 +32 20 05.4 4 2.61 1.81 GHD1 K06 GSC WS N3992 11 57 35.93 +53 22 28.7 8 2.14 3.41 WS GHD1 HC2m CCA GSC UZC TVP DC N3993 11 57 37.75 +25 14 26.1 9 1.23 2.73 WS GH HCds Pds UZC K10 GSC CCA JGV N3994 11 57 36.82 +32 16 38.8 9 0.94 1.69 CCA K06 KEBA SBG1 WS K13 HHKK GSC UZC N3995 11 57 44.24 +32 17 38.5 10 3.23 3.56 WS GHD1 K06 UZC CCA Pds GSC DC K13 SBG1 N3996 11 57 46.18 +14 17 49.9 4 1.38 1.43 WS UZC CCA DC N3997 11 57 48.35 +25 16 14.2 7 1.81 1.06 CCA K10 GSC UZC JGV HCds WS N3998 11 57 56.22 +55 27 12.6 6 1.97 1.52 WS HHD UZC TVP CCA DC N3999 11 57 56.46 +25 04 05.0 5 0.99 1.09 HCds WS GSC JGV Pds N4000 11 57 57.01 +25 08 39.0 6 0.56 1.99 HCds CCA WS UZC GSC JGV N4001 11 58 06.800 +47 20 05.64 2 0.21 0.37 KHJ SBG1 N4002 11 57 59.35 +23 12 06.3 5 3.36 0.64 WS UZC GSC Pds JG N4003 11 57 59.04 +23 07 28.5 5 1.53 0.93 WS CCA GSC UZC JG N4004=N4004A 11 58 05.18 +27 52 43.5 8 2.91 2.28 DC K06 WS HCds CCA JG BPP SDP N4004B=I2982 11 57 51.35 +27 52 06.9 5 0.96 1.69 HCds WS BPP UZC JG N4005=N4007 11 58 10.15 +25 07 19.4 7 1.47 1.01 WS HCds GSC JGV UZC CCA DC N4006 11 58 05.82 -02 07 13.4 10 1.23 2.77 ZGT HCo GSC GGH UZC SPC CCA WS DC APMn N4007=N4005 11 58 10.13 +25 07 19.2 6 1.46 1.01 WS HCds GSC JGV UZC DC N4008 11 58 17.07 +28 11 31.9 7 1.06 2.14 GHD1 BPP UZC JG WS DC CCA N4009 11 58 15.07 +25 11 24.5 2 0.67 1.34 HCds GSC N4010 11 58 37.26 +47 15 37.6 5 2.53 3.60 UZC WS CCA GHD1 SBG1 N4011 11 58 25.36 +25 05 50.9 5 0.44 0.99 HCds Pds WS GSC JGV N4012 11 58 27.54 +10 01 16.8 6 1.89 1.65 GD WS GSC Pds UZC CCA N4013 11 58 31.36 +43 56 49.2 6 2.08 1.36 SBG1 HCds WS TVP UZC DC N4013 sup * 11 58 32.127 +43 56 54.14 3 0.05 0.95 CCA UJ10 HCds N4014=N4028 11 58 35.77 +16 10 37.5 5 2.47 1.62 DC WS UZC HCds CCA N4015n 11 58 43.06 +25 02 32.8 2 1.05 2.62 WS HCds N4015s 11 58 42.59 +25 02 11.4 7 0.85 1.05 WS HCds JGV CCA UZC GSC DC N4016 11 58 29.08 +27 31 43.1 4 1.46 1.01 WS UZC CCA K06 N4017 11 58 45.65 +27 27 09.3 7 2.72 2.69 DC K10 K06 BPP WS CCA UZC N4018 11 58 40.63 +25 19 00.9 8 1.46 2.89 K10 HCds WS JGV GSC Pds UZC CCA N4019=I0755 12 01 10.39 +14 06 16.6 6 1.79 3.44 DC UZC HCds YOF WS CCA N4020 11 58 56.50 +30 24 40.8 5 2.26 6.29 GHD1 WS BPP UZC CCA N4021 11 59 02.583 +25 04 59.67 6 0.25 0.55 KEBA UZC JGV GSC HCds KHJ N4022 11 59 00.98 +25 13 21.1 7 0.78 1.49 JGV HCds WS UZC GSC CCA DC N4023 11 59 05.43 +24 59 20.2 6 1.14 1.06 WS UZC HCds CCA GSC JGV N4024 11 58 31.4 -18 20 48 4 1.37 3.95 SPC GHD2 ESOB WS N4025 11 59 10.07 +37 47 32.2 6 1.63 2.56 GHD1 WS UZC SBG1 CCA K06 N4026 11 59 25.15 +50 57 41.8 6 1.92 1.22 GHD1 WS TVP UZC CCA DC N4027 11 59 30.31 -19 15 59.1 5 2.96 4.00 GHD2 SPC HCds WS MJC N4027A 11 59 29.29 -19 19 54.2 3 0.25 1.79 SPC WS GSC N4028=N4014 11 58 35.77 +16 10 37.5 5 2.47 1.62 DC WS UZC HCds CCA N4029 12 00 03.27 +08 10 53.9 5 2.06 1.24 GGH UZC WS CCA DC N4030 12 00 23.51 -01 06 01.2 6 1.52 1.76 WS UZC GGH CCA SPC GH N4031 12 00 31.32 +31 56 49.8 5 0.57 2.17 WS UZC KEBA GSC BPP N4032 12 00 32.94 +20 04 27.9 7 0.24 3.99 GH K09 WS UZC DC JGV CCA N4033 12 00 34.7 -17 50 33 4 1.17 2.89 GHD2 ESOB WS SPC N4034 12 01 29.70 +69 19 24.6 5 1.71 1.48 UZC WS Pds CCA DC N4035 12 00 29.3 -15 56 54 3 1.44 2.89 WS GHD2 SPC N4036 12 01 26.84 +61 53 43.7 6 1.73 1.46 vdH+ UZC CCA GHD1 WS DC N4037 12 01 23.74 +13 24 03.3 7 1.09 1.94 DC YOF UZC GH HCds CCA WS N4038 12 01 52.95 -18 52 07.1 5 1.17 2.36 GC HCo HCds HC2m SPC N4038+N4039 12 01 53.89 -18 52 27.8 1 EWSo N4039 12 01 53.67 -18 53 09.4 6 1.69 1.61 HC2m HCo SPC HCds ESOB WS N4040 12 02 05.502 +17 49 22.53 5 0.70 0.96 KHJ UZC CCA JG Pds N4041 12 02 12.07 +62 08 15.0 6 0.99 3.75 WS GHD1 DC CCA GSC UZC N4042: 12 02 46.80 +20 09 48.5 1 GSC N4043 12 02 22.96 +04 19 46.9 6 1.71 0.86 DC GGH GSC CCA WS UZC N4044 12 02 29.52 -00 12 45.5 6 2.11 1.91 WS SPC UZC GGH CCA ZGT N4045=N4046 12 02 42.25 +01 58 36.3 5 0.82 1.92 CCA SPC WS GGH UZC N4045A 12 02 42.70 +01 57 06.4 4 0.76 0.71 SPC GGH WS UZC N4046=N4045 12 02 42.25 +01 58 36.3 5 0.82 1.92 CCA SPC WS GGH UZC N4047 12 02 50.85 +48 38 10.1 6 2.59 1.68 UZC WS SBG1 CCA DC GHD1 N4048e 12 02 50.88 +18 00 59.3 1 HCds N4048w 12 02 50.17 +18 00 55.1 7 1.98 1.63 DC HCds WS K09 UZC CCA JG N4049 12 02 54.48 +18 45 08.5 5 3.63 1.67 DC K09 WS UZC CCA N4050 12 02 53.9 -16 22 27 3 0.83 0.58 APMn WS SPC N4051 12 03 09.579 +44 31 52.94 16 0.60 2.41 vdH+ SBG1 CB2 UZC GHD1 UJ10 vdK1 WS TVP GSC EDC VPD CCR CCA UCA2 HC2m N4052 12 02 01 -63 13.3 2 33.77 8.49 HCe ESOB N4052? 12 00 00 -63 13.6 1 BSV N4053 12 03 11.52 +19 43 43.2 5 1.73 0.51 Pds WS JGV UZC CCA N4054n 12 03 13.20 +57 53 53.8 1 HCds N4054s 12 03 13.77 +57 53 26.8 3 0.44 1.27 WS HCds UZC N4054w 12 03 12.41 +57 53 34.8 4 0.90 2.06 HCds WS UZC Pds N4055=N4061 12 04 01.48 +20 13 56.1 6 1.02 0.57 JGV WS UZC GSC CCA DC N4056: 12 03 57.7 +20 18 44 3 2.92 2.89 HCo WS Pds N4057=N4065 12 04 06.27 +20 14 05.7 6 0.90 0.87 GSC JGV UZC CCA DC WS N4058 12 03 48.96 +03 32 51.7 6 2.26 2.37 ZGT DC WS GGH CCA UZC N4059=N4070 12 04 11.42 +20 24 35.4 6 3.06 2.07 JGV GSC WS UZC CCA DC N4060: 12 04 00.98 +20 20 13.5 3 0.35 2.17 WS JGV GSC N4061=N4055 12 04 01.48 +20 13 56.1 6 1.02 0.57 JGV WS UZC GSC CCA DC N4062 12 04 03.86 +31 53 43.0 4 2.04 2.00 K06 UZC WS CCA N4063 12 04 05.92 +01 50 47.9 6 1.50 0.90 ZGT SPC WS GSC GGH UZC N4064 12 04 11.13 +18 26 35.0 6 3.16 1.95 DC WS UZC YOF CCA GH N4065=N4057 12 04 06.27 +20 14 05.7 6 0.90 0.87 GSC JGV UZC CCA DC WS N4066 12 04 09.41 +20 20 52.3 6 0.87 1.45 JGV DC WS UZC GSC CCA N4067 12 04 11.42 +10 51 16.1 6 3.96 1.94 DC WS UZC GH YOF CCA N4068=I0757 12 04 02.49 +52 35 26.0 4 2.31 5.88 CCA DC HCds HCds N4068=I0757 * 12 04 00.73 +52 35 18.4 3 0.55 2.19 HCds GHD1 UZC N4069: 12 04 06.15 +20 19 25.9 3 2.43 2.00 WS GSC Pds2 N4070=N4059 12 04 11.42 +20 24 35.4 6 3.06 2.07 JGV GSC WS UZC CCA DC N4071 12 04 15.25 -67 18 35.6 4 2.63 0.85 HCds SESO DKM2 ESOB N4072 12 04 13.85 +20 12 34.6 4 1.85 2.55 WS JGV GSC Pds N4073 12 04 27.11 +01 53 44.9 7 1.63 2.35 HCds SPC GGH GSC WS GH CCA N4074 12 04 29.683 +20 18 58.20 6 0.39 1.61 JGV GSC EDC WS KEBA UZC N4075 12 04 37.81 +02 04 20.2 5 0.69 1.61 ZGT SPC WS UZC GGH N4076 12 04 32.59 +20 12 16.9 6 1.25 1.52 DC UZC GSC WS CCA JGV N4077=N4140 12 04 38.03 +01 47 14.2 8 1.99 2.62 ZGT DC SPC WS GGH GSC UZC CCA N4078=N4107 12 04 47.70 +10 35 44.0 6 0.72 0.99 GSC WS UZC HCds CCA DC N4079 12 04 49.97 -02 22 59.2 9 3.04 3.33 GGH ZGT UZC GHD2 SPC WS CCA DC APMn N4080 12 04 51.75 +26 59 33.8 9 2.47 2.59 DC KOS STMW BPP K06 CCA WS K10 UZC N4081 12 04 33.68 +64 26 13.3 5 1.75 2.87 WS GHD1 CCA UZC DC N4082 12 05 11.49 +10 40 13.7 6 0.59 0.58 WS HCds GSC YOF Pds UZC N4083 12 05 14.058 +10 36 47.25 6 1.00 0.74 GD Pds KHJ GSC HCds UZC N4084 12 05 15.25 +21 12 51.5 4 2.55 2.47 JG UZC WS Pds N4085 12 05 22.65 +50 21 11.9 6 1.32 1.73 WS GHD1 UZC TVP CCA DC N4086 12 05 29.401 +20 14 48.62 7 0.53 1.31 JGV KHJ GSC HCds Pds UZC CCA N4087 12 05 35.3 -26 31 19 2 1.90 2.12 WS ESOB N4088 12 05 34.15 +50 32 22.4 7 2.53 0.81 CCA GSC UZC HC2m HCds TVP WS N4089 12 05 37.51 +20 33 20.4 5 0.59 0.52 UZC WS GSC JGV Pds N4090 12 05 27.91 +20 18 30.9 7 0.77 1.82 JGV GSC WS Pds UZC HCds CCA N4091 12 05 40.17 +20 33 20.3 6 0.96 0.60 UZC GSC WS Pds CCA JGV N4092 12 05 50.25 +20 28 37.1 6 2.16 1.28 WS UZC GSC CCA JGV DC N4093 12 05 51.504 +20 31 18.15 5 0.76 0.78 KHJ UZC GSC Pds JGV N4094 12 05 53.9 -14 31 34 3 1.45 1.15 GHD2 WS SPC N4095 12 05 54.27 +20 34 21.7 6 0.55 0.68 Pds2 WS JGV HCds GSC UZC N4096 12 06 01.13 +47 28 40.8 5 1.24 0.83 UZC GSC HC2m CCA HCds N4097 12 06 02.51 +36 51 48.0 4 0.87 0.59 WS UZC CCA SBG2 N4098=N4099 12 06 03.70 +20 36 27.0 7 1.08 1.80 WS HCds GSC CCA UZC JGV DC N4098nw=N4099nw 12 06 03.52 +20 36 31.7 1 HCds N4098se=N4099se 12 06 03.78 +20 36 24.1 1 HCds N4099=N4098 12 06 03.70 +20 36 27.0 7 1.08 1.80 WS HCds GSC CCA UZC JGV DC N4099nw=N4098nw 12 06 03.52 +20 36 31.7 1 HCds N4099se=N4098se 12 06 03.78 +20 36 24.1 1 HCds N4100 12 06 08.47 +49 34 56.9 7 2.70 2.20 SBG1 WS UZC DC TVP CCA GHD1 N4101 12 06 10.54 +25 33 24.4 6 2.00 1.33 KOS JG UZC CCA WS Pds N4102 12 06 23.17 +52 42 39.5 8 1.59 1.56 UZC CCR CCA TVP GHD1 WS DC CCO N4103 12 06 40 -61 15.0 2 5.15 0.00 BSV ESOB N4104 12 06 38.79 +28 10 27.1 8 3.36 2.78 DC WS KOS JG UZC Pds BPP CCA N4105 12 06 40.7 -29 45 39 3 0.75 2.65 ESOB WS GHD2 N4106 12 06 45.4 -29 46 06 2 0.92 0.71 GHD2 WS N4107=N4078 12 04 47.70 +10 35 44.0 6 0.72 0.99 GSC WS UZC HCds CCA DC N4108 12 06 44.61 +67 09 45.6 4 1.34 0.91 WS Pds UZC CCA N4108A 12 05 49.76 +67 15 07.2 3 0.07 0.85 WS UZC CCA N4108B 12 07 11.70 +67 14 05.6 3 1.06 0.68 WS UZC CCA N4109 12 06 51.180 +42 59 44.08 4 1.07 0.59 KHJ UZC SBG1 GHD1 N4110 12 07 03.45 +18 31 52.9 4 0.76 0.46 WS JG UZC CCA N4111 12 07 03.07 +43 03 56.9 4 1.54 1.17 WS CCA TVP SBG1 N4112 12 07 09.3 -40 12 27 3 1.33 3.21 ESOB WS Pds N4113=N4122 12 07 08.49 +32 59 44.5 4 0.66 0.97 K13 SBG2 WS UZC N4114 12 07 12.240 -14 11 06.39 4 1.44 1.65 GHD2 KHJ APMn SPC N4115: 12 07 09.56 +14 24 24.1 2 0.10 0.78 GSC HCds N4116 12 07 37.01 +02 41 27.5 6 2.78 2.30 MJC WS CCA GH UZC GGH N4117 12 07 46.150 +43 07 34.72 9 1.02 1.64 WS UZC UW AE CCA DC TVP SBG1 GHD1 N4118 12 07 52.88 +43 06 41.9 4 0.82 2.91 SBG1 TVP WS GHD1 N4119:=N4124=I3011 12 08 09.56 +10 22 43.3 5 3.73 1.87 DC WS GH UZC CCA N4120 12 08 31.49 +69 32 40.3 6 1.41 4.15 Pds CCA UZC WS GHD1 DC N4121 12 07 56.597 +65 06 49.82 3 0.17 0.29 GSC KHJ UZC N4122=N4113 12 07 08.49 +32 59 44.5 4 0.66 0.97 K13 SBG2 WS UZC N4123 12 08 11.16 +02 52 40.6 7 1.70 1.04 KCA GGH HHKK GH UZC WS CCA N4124=I3011=:N4119 12 08 09.56 +10 22 43.3 5 3.73 1.87 DC WS GH UZC CCA N4125 12 08 05.85 +65 10 26.4 6 1.88 1.42 WS UZC HCo HC2m HCds CCA N4126 12 08 37.46 +16 08 33.5 4 0.84 0.71 GSC HCds UZC CCA N4127 12 08 26.29 +76 48 13.5 3 0.19 1.70 HCrs UZC CCA N4128 12 08 32.54 +68 46 04.5 6 2.97 1.49 CCA WS HCds UZC GHD1 DC N4128A 12 08 14.31 +68 47 09.4 1 HCds N4129=N4130 12 08 53.3 -09 02 12 4 1.48 1.91 APMn SPC WS GHD2 N4130=N4129 12 08 53.3 -09 02 12 4 1.48 1.91 APMn SPC WS GHD2 N4131 12 08 47.46 +29 18 16.6 5 3.85 1.52 WS UZC BPP CCA DC N4132 12 09 01.4 +29 15 02 5 0.71 2.70 UZC BPP WS K06 K03 N4133 12 08 50.04 +74 54 14.0 5 2.69 2.50 WS CCA UZC HCrs DC N4134 12 09 10.05 +29 10 36.5 6 1.74 1.69 WS UZC K06 BPP CCA DC N4135 12 09 09.06 +44 00 11.5 4 3.39 1.55 WS UZC SBG1 GHD1 N4136 12 09 17.82 +29 55 37.7 6 1.53 0.99 BPP UZC CCA WS GHD1 DC N4137 12 09 17.62 +44 05 24.1 4 3.35 2.52 WS UZC SBG1 GHD1 N4138 12 09 29.93 +43 41 06.7 7 2.19 1.27 WS HC2m UZC CCA TVP SBG1 GHD1 N4139=I2989 12 04 33.96 +01 48 04.3 6 1.78 1.14 ZGT GGH GSC WS SPC UZC N4140=N4077 12 04 38.03 +01 47 14.2 8 1.99 2.62 ZGT DC SPC WS GSC GGH UZC CCA N4141 12 09 47.46 +58 50 55.7 4 1.63 0.86 DC WS UZC CCA N4142 12 09 30.61 +53 06 13.3 5 3.57 2.74 WS CCA UZC GHD1 DC N4143 12 09 36.22 +42 32 03.8 7 1.85 3.18 GHD1 TVP UZC CCA WS SBG1 DC N4144 12 09 59.3 +46 27 25 4 0.84 1.71 GHD1 WS UZC DC N4145 12 10 01.67 +39 52 57.1 8 2.60 2.93 GHD1 GSCM K06 UZC SBG1 WS CCA DC N4145A 12 10 54.47 +39 45 26.7 2 0.65 1.13 HCds UZC N4145A comp 12 10 53.25 +39 44 55.9 1 HCds N4146 12 10 18.32 +26 25 50.9 8 2.09 1.85 BPP JG WS DC CCA UZC KOS GHD1 N4147=N4153 12 10 06.28 +18 32 30.5 4 1.14 1.52 SW GSC GSCT HCrs N4148 12 10 07.95 +35 52 39.6 4 0.57 0.70 WS CCA UZC SBG2 N4149=N4154 12 10 32.93 +58 18 13.3 5 0.86 1.41 DC WS UZC CCA HCds N4150 12 10 33.58 +30 24 06.3 6 2.07 2.81 GHD1 DC WS BPP UZC CCA N4151 12 10 32.562 +39 24 20.82 13 1.21 0.60 WS GSC K06 UZC vdK1 SBG1 CCR dBW UWS EDC HC2m CCA CCO N4152 12 10 37.54 +16 01 58.9 6 1.87 1.44 YOF WS UZC FPB CCA GH N4153=N4147 12 10 06.28 +18 32 30.5 4 1.14 1.52 SW GSC GSCT HCrs N4154=N4149 12 10 32.93 +58 18 13.3 5 0.86 1.41 DC WS UZC CCA HCds N4155 12 10 45.66 +19 02 26.2 5 0.92 0.98 Pds WS UZC CCA JG N4156 12 10 49.52 +39 28 22.2 6 1.49 1.07 WS SBG1 UZC HC2m CCA DC N4157 12 11 04.43 +50 29 04.1 6 4.22 4.55 GHD1 CCA WS TVP DC GSCM N4158 12 11 10.11 +20 10 32.0 6 1.68 2.72 DC GH CCA WS UZC JG N4159 12 10 53.48 +76 07 31.9 5 1.27 2.07 CCA HCrs WS UZC DC N4160 12 12 11.7 +43 44 18 1o Big N4160 nom 12 11 36.6 +43 43 39 1o Big N4160? 12 12 01.7 +43 44 08 1 HCds N4160? nw* 12 12 01.47 +43 44 11.9 1 HCds N4160? se* 12 12 02.12 +43 44 03.4 1 HCds N4161 12 11 33.37 +57 44 15.1 4 2.80 4.66 WS UZC DC CCA N4162 12 11 52.54 +24 07 24.4 5 1.14 2.36 K10 WS UZC CCA GH N4163=N4167 12 12 09.16 +36 10 07.2 10 1.80 2.87 WS DC CCA K15 UZC HCds SBG2 Pds K13 GHD1 N4164 12 12 05.42 +13 12 19.5 2 0.31 0.78 WS GSC N4165=I3035 12 12 11.80 +13 14 47.2 7 1.37 1.65 K09 WS UZC GSC CCA YOF GH N4166 12 12 09.67 +17 45 24.2 6 0.70 1.75 UZC YZYH CCA JG WS DC N4167=N4163 12 12 09.16 +36 10 07.2 10 1.80 2.87 WS DC CCA K15 UZC HCds SBG2 Pds K13 GHD1 N4168 12 12 17.26 +13 12 16.8 5 0.67 2.21 WS GSC UZC GH CCA N4169 12 12 18.79 +29 10 45.6 8 1.68 1.90 HKA JG WS GSC BPP UZC CCA DC N4170? 12 12 13.0 +29 10 01 1 HCo N4170?? 12 12 21.5 +29 07 56 1 HCo N4171? 12 12 38.4 +29 13 28 1 HCo N4171?? 12 12 35.5 +29 12 48 1 HCo N4172 12 12 14.93 +56 10 37.1 4 1.14 3.75 WS DC CCA UZC N4173 12 12 21.36 +29 12 27.2 5 2.67 3.78 BPP HCo CCA WS DC N4174 12 12 26.90 +29 08 56.7 12 0.95 1.71 HKA K06 K03 DC GSC WS UZC BPP FPB KEBA JG CCA N4175 12 12 31.02 +29 10 06.1 8 2.43 1.71 DC HKA WS JG GSC BPP UZC CCA N4176 12 12 36.8 -09 09 38 2 1.05 0.71 WS SPC N4177 12 12 41.1 -14 00 49 4 1.88 3.59 APMn Pds WS SPC N4178=I3042 12 12 46.32 +10 51 52.7 4 2.36 4.78 WS DC YOF CCA N4179 12 12 52.22 +01 17 58.3 7 2.38 1.78 SPC CCA DC GH GGH WS UZC N4180=:N4182 12 13 03.05 +07 02 19.3 7 0.78 1.11 CCA UZC WS YOF GGH HCds GH N4181 12 12 48.899 +52 54 12.26 4 0.86 1.00 Pds HCds UZC KHJ N4182:=N4180 12 13 03.05 +07 02 19.3 7 0.78 1.11 CCA UZC WS YOF GGH HCds GH N4182? 12 13 20.03 +04 02 11.9 1 HCds N4183 12 13 17.02 +43 41 53.5 7 2.84 2.24 WS TVP CCA SBG1 UZC GHD1 DC N4184 12 13 33.7 -62 42 51 4 13.48 26.10 ESOB HCm WS BSV N4184e 12 13 39.6 -62 43 08 1 HCo N4184w 12 13 25.9 -62 43 21 1 HCo N4185=?N4209 12 13 22.14 +28 30 37.9 5 1.96 2.51 DC BPP WS UZC CCA N4186=N4192B 12 14 06.53 +14 43 33.9 6 1.95 2.71 WS UZC YOF CCA GH VCC N4187=N4187A 12 13 29.31 +50 44 28.7 5 0.75 0.88 WS DC UZC GSC CCA N4187B 12 13 28.9 +50 45 24 1 HCo N4187C 12 13 26.9 +50 42 38 1 HCo N4188 12 14 07.4 -12 35 11 2 1.04 0.00 WS SPC N4189=I3050 12 13 47.33 +13 25 29.6 6 2.22 2.80 WS K09 GH CCA YOF UZC N4190n 12 13 44.9 +36 38 38 1 HCo N4190s 12 13 44.35 +36 37 58.9 9 2.52 4.34 K15 Pds SBG2 CCA GHD1 WS GSC UZC DC N4191 12 13 50.35 +07 12 02.1 4 0.67 1.26 WS CCA GGH UZC N4192 12 13 48.270 +14 54 00.74 11 3.35 2.82 WS UZC GSCM GSC HC2m vdH+ YOF AE CCA GH GC N4192A 12 13 26.15 +14 46 20.2 3 4.43 2.05 STMW YOF CCA N4192B=N4186 12 14 06.53 +14 43 33.9 6 1.95 2.71 WS UZC YOF CCA GH VCC N4193=I3051 12 13 53.59 +13 10 21.9 6 2.07 2.95 WS DC UZC CCA YOF GH N4194 12 14 09.59 +54 31 36.4 9 3.45 3.13 SDP GHD1 UZC CCA WW UWS HHD WS DC N4195 12 14 18.13 +59 36 54.4 5 0.78 2.09 UZC HCds WS Pds CCA N4196 12 14 29.65 +28 25 25.0 5 3.27 2.68 DC WS BPP UZC CCA N4197 12 14 38.50 +05 48 20.1 6 2.05 1.78 DC YOF WS UZC GGH CCA N4198=I0778 12 14 22.08 +56 00 40.6 4 1.45 1.04 WS HCds UZC CCA N4199ne 12 14 51.72 +59 54 29.6 2 0.42 2.55 HCds WS N4199sw 12 14 48.64 +59 54 21.7 3 0.69 1.44 Pds WS HCds N4200 12 14 44.26 +12 10 49.1 3 0.78 1.32 UZC CCA WS N4201 12 14 41.9 -11 35 00 2 0.00 1.41 SPC WS N4202 12 18 08.64 -01 03 54.2 4 2.13 2.53 WS SPC CCA ZGT N4203 12 15 05.04 +33 11 50.5 6 1.11 1.50 CCA SBG2 WS UZC GSC DC N4204 12 15 14.29 +20 39 32.6 6 2.09 3.04 DC WS KEB2 UZC CCA K09 N4205 12 14 55.39 +63 46 54.2 5 1.15 1.27 CCA WS UZC Pds DC N4206=I3064 12 15 16.75 +13 01 26.3 7 2.41 3.36 DC HCds WS UZC YOF CCA GH N4207 12 15 30.32 +09 35 06.9 8 2.23 1.68 DC WS HCds HCds YOF Pds UZC CCA N4208=N4212 12 15 39.30 +13 54 05.3 6 2.04 0.65 DC WS YOF UZC CCA GH N4209? 12 15 25.81 +28 28 05.7 2 0.19 1.20 WS GSC N4209?=N4185 12 13 22.14 +28 30 37.9 5 1.96 2.51 DC BPP WS UZC CCA N4210 12 15 16.07 +65 59 07.7 5 2.33 0.89 CCA WS UZC GHD1 DC N4211=N4211A 12 15 35.85 +28 10 38.1 9 1.37 1.29 GHD1 WS BPP GSC JG KOS UZC Pds CCA N4211B 12 15 37.27 +28 10 09.1 5 2.13 1.30 GHD1 WS Pds HCo CCA N4212=N4208 12 15 39.30 +13 54 05.3 6 2.04 0.65 DC WS YOF UZC CCA GH N4213 12 15 37.63 +23 58 55.0 7 2.82 1.76 WS Pds UZC CCA HCds JG DC N4214=N4228 12 15 39.362 +36 19 37.51 9 2.12 2.96 HCds HCds CCA HC2m UJ10 K15 DC UZC GSC N4215 12 15 54.56 +06 24 04.1 7 1.69 1.80 UZC KEBA CCA GGH WS DC GH N4215? 12 15 54.8 +06 18 02 1o Sn N4216 12 15 54.25 +13 08 59.1 6 1.49 0.66 UZC GSC GSCM YOF CCA HC2m N4217 12 15 50.72 +47 05 29.0 8 1.27 3.99 GSCA WS HCds TVP HCds CCA DC HCds N4218 12 15 46.27 +48 07 53.2 8 1.63 1.83 WS SBG1 KEBA CCA UZC GHD1 TVP DC N4219 12 16 27.6 -43 19 25 2 3.88 4.24 WS ESOB N4219A 12 17 60.0 -43 32 24 2 6.18 4.24 WS ESOB N4220 12 16 11.76 +47 52 59.6 6 0.63 3.18 CCA UZC TVP WS DC SBG1 N4221 12 16 00.19 +66 13 51.6 5 3.14 1.93 GHD1 UZC WS CCA DC N4222 12 16 22.63 +13 18 26.4 7 2.20 2.77 HCds HCds WS GH UZC YOF CCA N4223=I3102 12 17 25.77 +06 41 23.7 7 3.35 2.07 DC GGH YOF WS CCA HCds GH N4224 12 16 33.80 +07 27 42.2 8 1.71 1.30 DC YOF UZC GSC GGH CCA WS GH N4225 12 16 38.352 -12 19 39.83 2 0.49 0.31 SPC KHJ N4226 12 16 26.31 +47 01 33.0 6 2.27 3.41 GHD1 WS UZC SBG1 CCA DC N4227 12 16 33.74 +33 31 18.0 6 0.73 1.65 DC WS UZC Pds CCA SBG2 N4228=N4214 12 15 39.362 +36 19 37.51 9 2.12 2.96 HCds HCds CCA HC2m UJ10 K15 DC UZC GSC N4229 12 16 38.78 +33 33 38.5 4 1.12 1.12 WS UZC SBG2 CCA N4230 12 17 09 -55 17.2 1 HCe N4231 12 16 48.936 +47 27 26.04 6 1.44 1.49 UZC SBG1 KHJ CCA GHD1 DC N4232 12 16 48.97 +47 26 18.6 5 1.12 1.12 UZC WS GHD1 SBG1 CCA N4233 12 17 07.66 +07 37 26.3 6 0.64 1.28 WS UZC GSC GGH CCA GH N4234 12 17 09.10 +03 40 58.9 8 2.92 1.94 DC CCA GGH HCds WS UZC GH ZGT N4235=I3098 12 17 09.838 +07 11 27.66 8 1.23 1.71 WS GH GGH UZC YOF UW CCA EDC N4236 12 16 42.81 +69 27 50.4 5 4.37 13.21 CCA UZC WS DC HCo N4236 bar 12 16 44.92 +69 27 30.6 1 HC2m N4237 12 17 11.42 +15 19 24.8 5 0.77 2.22 WS UZC YOF GH CCA N4238 12 16 56.12 +63 24 36.2 4 2.40 1.71 UZC CCA WS DC N4239 12 17 14.88 +16 31 52.3 5 1.96 1.73 DC Pds WS UZC CCA N4240=N4243 12 17 24.3 -09 57 08 3 0.00 1.15 SPC WS APMn N4241=I3115 12 17 59.74 +06 39 13.3 9 3.53 2.15 VCC DC HCds CCA GGH WS UZC GH YOF N4242 12 17 30.10 +45 37 08.5 6 0.76 1.16 WS UZC SBG1 HC2m CCA HCds N4243=N4240 12 17 24.3 -09 57 08 3 0.00 1.15 SPC WS APMn N4244 12 17 29.737 +37 48 27.28 17 3.68 2.66 GHD1 GSCM 2MSP CCA UJ10 HC2m HCds HC2m HC2m HCds HC2m HC2m HC2m WS DC SBG2 HHKK N4244 * 12 17 29.60 +37 48 25.3 1 HCds N4245 12 17 36.861 +29 36 28.14 6 0.84 1.83 AC GSC UZC CCA WS BPP N4246=I3113 12 17 58.16 +07 11 08.2 7 1.89 2.19 GGH YOF WS DC UZC CCA GH N4247 12 17 58.033 +07 16 26.38 4 0.92 1.40 KHJ GGH UZC GH N4248 12 17 50.34 +47 24 32.5 6 2.02 2.16 GHD1 DC UZC SBG2 WS CCA N4249 12 17 59.383 +05 35 54.61 3 0.20 0.15 UZC GGH KHJ N4250=N4250A 12 17 26.13 +70 48 08.4 5 1.04 1.50 WS GHD1 CCA UZC DC N4251 12 18 08.45 +28 10 29.5 4 0.63 1.03 WS UZC CCA BPP N4252 12 18 30.89 +05 33 34.2 6 0.72 0.83 YOF UZC WS GGH CCA GH N4253 12 18 26.406 +29 48 45.82 10 2.33 2.72 DC GHD1 WS FPB BPP K03 UZC EDC UW CCA N4254 12 18 49.53 +14 25 01.1 9 2.72 2.95 WS DC GC YOF CCA HC2m GSC UZC GH N4255 12 18 56.08 +04 47 09.5 8 2.26 1.92 HC DC WS UZC KEBA GGH CCA VCC N4256 12 18 42.93 +65 53 53.1 4 0.85 1.00 WS UZC CCA HC2m N4257 12 19 06.60 +05 43 32.1 5 3.56 1.39 GGH YOF WS UZC GH N4258 12 18 57.610 +47 18 15.98 12 1.78 3.20 GHD1 TH GJM VPD WYC CCA UJ10 HC2m UZC DC WS SBG2 N4259 12 19 22.261 +05 22 34.95 7 1.95 0.73 DC KHJ GGH CCA UZC KEBA GH N4260 12 19 22.23 +06 05 55.6 7 2.20 2.68 DC YOF WS GGH UZC GH CCA N4261 12 19 23.177 +05 49 30.36 8 3.32 3.26 DC WS MJC UZC GGH RG CCA GH N4262 12 19 30.62 +14 52 39.4 5 0.76 2.72 UZC WS GH DC CCA N4263=N4265 12 19 42.2 -12 13 30 3 0.00 2.08 SPC APMn WS N4264 12 19 35.747 +05 50 48.52 9 1.83 1.65 WS DC YOF KEBA GGH RG UZC CCA GH N4265=N4263 12 19 42.2 -12 13 30 3 0.00 2.08 SPC APMn WS N4266 12 19 42.31 +05 32 17.5 7 2.00 2.43 WS CCA YOF GGH UZC Pds GH N4267 12 19 45.34 +12 47 54.6 5 3.13 3.33 GH WS UZC CCA DC N4268 12 19 47.238 +05 17 01.09 6 1.65 0.64 DC CCA KHJ GGH UZC GH N4269 12 19 49.21 +06 00 54.7 6 1.79 3.72 DC WS GGH UZC GH CCA N4270 12 19 49.54 +05 27 47.9 5 1.70 2.19 WS GGH CCA UZC GH N4271 12 19 32.90 +56 44 11.7 4 3.15 1.82 UZC WS CCA DC N4272 12 19 47.73 +30 20 18.5 6 2.88 1.52 BPP WS UZC CCA JG DC N4273 12 19 56.08 +05 20 35.7 7 1.15 1.40 YOF WS GSC HC2m GGH UZC CCA N4274 12 19 50.678 +29 36 50.54 8 1.77 2.96 CCA UZC AC GSC HC2m WS BPP DC N4275 12 19 52.58 +27 37 15.1 6 1.46 1.63 DC BPP WS UZC CCA KEBA N4276 12 20 07.49 +07 41 28.0 7 3.36 3.36 VCC GGH UZC YOF CCA WS DC N4277 12 20 03.731 +05 20 28.78 6 0.82 0.70 YOF HC2m KHJ GGH UZC GH N4278 12 20 06.8619 +29 16 50.069 11 2.93 2.08 GHD1 WS UZC UWS AE USNO CCBD CCA BPP JG DC N4279 12 20 25.010 -11 40 00.33 4 0.21 2.48 SPC APMn KHJ HCds N4280 12 20 25 -11 41.8 1o Sw3 N4280? 12 20 31 -11 39.1 1 HCm N4281 12 20 21.52 +05 23 11.7 7 2.11 2.25 MJC GGH CCA UZC WS DC GH N4282 12 20 24.279 +05 34 23.14 4 0.75 2.78 VCC GGH UZC KHJ N4283 12 20 20.77 +29 18 37.0 7 2.52 3.14 GHD1 WS BPP UZC CCA DC JG N4284 12 20 12.57 +58 05 34.0 5 3.08 1.35 HCds UZC CCA Pds WS N4285 12 20 39.87 -11 38 31.9 3 0.75 1.61 WS HCds SPC N4286=I3181 12 20 42.07 +29 20 43.9 7 2.44 3.59 GHD1 K03 WS BPP UZC CCA JG N4287 12 20 48.411 +05 38 24.46 4 2.27 1.97 VCC UZC KHJ GGH N4288 12 20 38.27 +46 17 32.8 8 3.31 2.79 GHD1 WS HCds HC2m SBG2 CCA DC FT N4288A 12 20 40.55 +46 15 19.6 2 0.88 0.07 HCds HC2m N4289 12 21 02.32 +03 43 20.0 5 0.81 0.87 GGH UZC CCA ZGT WS N4290 12 20 47.65 +58 05 33.2 5 3.11 2.29 GHD1 CCA WS UZC DC N4291 12 20 18.04 +75 22 14.5 6 2.26 3.33 WS UZC HCrs DC CCA GHD1 N4292 12 21 16.491 +04 35 44.31 9 0.91 1.57 DC KHJ GGH Pds UZC HCds CCA HC GH N4292A 12 21 16.77 +04 37 59.8 1 HCds N4293 12 21 12.81 +18 22 57.9 10 2.93 2.67 CCA UZC YOF vdH+ GC HHKK HC2m WS DC GH N4294 12 21 17.83 +11 30 34.4 4 1.47 2.72 WS UZC YOF CCA N4295 12 21 09.79 +28 09 53.9 4 0.80 0.93 BPP WS UZC JG N4296 12 21 28.31 +06 39 12.9 7 2.14 1.89 VCC DC WS UZC HCds GGH CCA N4297 12 21 27.306 +06 40 15.76 4 2.47 0.94 VCC WS HCds KHJ N4298 12 21 32.74 +14 36 23.5 6 1.72 2.11 DC GH YOF CCA UZC WS N4299 12 21 40.73 +11 30 04.4 5 2.09 2.58 WS CCA Pds GH UZC N4300 12 21 41.44 +05 23 05.4 8 2.64 2.54 VCC WS CCA GGH HC UZC YOF DC N4301=N4303A 12 22 27.18 +04 33 57.5 6 1.48 1.98 GH WS UZC CCA GGH HC N4302 12 21 42.28 +14 35 54.9 6 0.76 3.30 WS YOF GH UZC GSC CCA N4303 12 21 54.916 +04 28 22.82 11 2.79 3.88 DC GH WS UZC SPC AE HC2m GGH CCA HC GC N4303A=N4301 12 22 27.18 +04 33 57.5 6 1.48 1.98 GH WS UZC CCA GGH HC N4304 12 22 12.7 -33 29 04 3 0.72 2.08 WS ESOB GHD2 N4305 12 22 03.66 +12 44 26.5 7 1.25 1.35 WS UZC GSC YOF CCA DC GH N4306 12 22 04.18 +12 47 13.9 6 1.15 1.05 UZC GSC WS CCA DC GH N4307 12 22 05.56 +09 02 37.7 4 3.92 1.73 DC CCA UZC YOF N4307A=I3211 12 22 07.35 +08 59 25.4 3 0.95 1.50 WS UZC CCA N4308 12 21 56.85 +30 04 27.1 5 1.83 3.10 WS UZC BPP CCA DC N4309 12 22 12.394 +07 08 39.17 9 3.20 1.73 DC Pds CCA YOF KHJ GGH UZC GSC GH N4309A 12 22 14.84 +07 10 00.8 1 GSC N4310=N4338 12 22 26.37 +29 12 29.3 8 1.54 2.97 HCds WS UZC BPP DC CCA JG GHD1 N4311 12 22 26 +29 12.3 1o JH N4311?? 12 22 26.85 +29 08 45.4 1 HCds N4311?? nw* 12 22 26.30 +29 08 57.6 1 HCds N4311?? se* 12 22 27.27 +29 08 36.6 1 HCds N4312 12 22 31.34 +15 32 16.8 6 2.30 2.84 GH YOF CCA WS UZC DC N4313 12 22 38.52 +11 48 03.5 5 1.63 1.63 WS GH YOF CCA UZC N4314 12 22 32.02 +29 53 43.6 7 1.85 1.85 WS K03 UZC BPP GSC DC CCA N4315: 12 22 45.25 +09 18 19.8 1 HCds N4315? 12 22 39.49 +09 17 10.3 1 HCds N4316 12 22 42.41 +09 19 56.4 7 3.36 1.50 WS YOF UZC CCA HCds VCC DC N4317 12 22 41 +31 02.3 1o WH N4318 12 22 43.27 +08 11 53.7 7 2.93 1.26 VCC WS GGH UZC KEBA CCA DC N4319=N4345 12 21 43.99 +75 19 18.6 4 0.55 2.04 WS UZC CCA HCrs N4320 12 22 57.792 +10 32 53.45 6 2.11 3.55 VCC VPC KHJ UZC CCA HCds N4321 12 22 54.96 +15 49 21.3 15 2.17 2.40 YOF K09 WS CB2 GH vdH+ HC2m HCds CCA GC HHKK UZC vdK3 DC VPD N4322 12 22 42.03 +15 54 12.7 1 HCds N4323 12 23 01.74 +15 54 19.0 3 1.66 2.28 GH WS HCds N4324 12 23 06.00 +05 14 59.3 6 3.15 1.34 DC CCA WS UZC YOF GGH N4325=:N4368 12 23 06.667 +10 37 14.11 5 1.14 3.44 VCC UZC KHJ HCds VPC N4326 12 23 11.648 +06 04 20.21 6 0.97 1.53 DC KHJ CCA GGH UZC GH N4327? 12 23 07.53 +15 44 11.4 1 HCds N4327?? 12 23 11.91 +15 45 05.4 1 HCds N4328 12 23 20.01 +15 49 12.2 4 1.19 1.99 VCC HCds WS UZC N4329 12 23 20.8 -12 33 33 4 3.25 2.65 WS SPC APMn GHD2 N4330 12 23 16.78 +11 22 04.3 5 4.22 3.41 DC CCA WS UZC YOF N4331 12 22 36.03 +76 10 20.5 5 2.74 3.13 UZC HCrs WS CCA STMM N4332 12 22 46.86 +65 50 37.1 4 1.59 0.51 WS UZC CCA DC N4333 12 23 22.288 +06 02 26.29 4 0.72 0.83 UZC KHJ GGH GH N4334 12 23 24.00 +07 28 23.2 6 1.20 1.87 YOF GGH CCA UZC WS GH N4335 12 23 01.84 +58 26 39.4 5 1.31 1.30 DC CCA GSC WS UZC N4336=I3254 12 23 29.76 +19 25 36.5 6 1.85 1.27 DC WS UZC CCA HCds YOF N4337 12 24 04 -58 07.4 2 16.93 0.00 BSV ESOB N4338=N4310 12 22 26.37 +29 12 29.3 8 1.54 2.97 HCds WS UZC BPP DC CCA JG GHD1 N4339 12 23 34.84 +06 04 54.1 6 3.64 1.01 DC WS UZC GH GGH CCA N4340 12 23 35.31 +16 43 22.4 6 1.44 3.89 WS GSC UZC GH CCA DC N4341=I3260 12 23 53.49 +07 06 24.1 6 2.73 0.85 WS GGH UZC GSC CCA Pds N4342=I3256 12 23 39.10 +07 03 13.8 6 0.66 0.95 KEBA GGH GSC CCA UZC WS N4343 12 23 38.77 +06 57 16.3 8 6.02 2.99 DC WS CCA GGH YOF GSC UZC GH N4344 12 23 37.60 +17 32 27.6 6 1.70 1.07 WS YOF CCA UZC GH DC N4345=N4319 12 21 44.14 +75 19 19.9 6 1.60 4.34 WS UZC DC CCA HCrs GHD1 N4346 12 23 28.06 +46 59 36.8 7 1.99 1.33 WS TVP UZC DC CCA SBG2 GHD1 N4347? 12 23 52.46 -03 14 24.6 1 HCds N4347??=N4348 12 23 54.01 -03 26 37.3 7 1.54 3.42 GGH UZC WS APMn SPC ZGT GHD2 N4348=??N4347 12 23 54.01 -03 26 37.3 7 1.54 3.42 GGH UZC WS APMn SPC ZGT GHD2 N4349 12 24 08 -61 52.3 2 20.18 8.49 BSV ESOB N4350 12 23 57.87 +16 41 35.9 7 1.92 2.38 WS CCA GSC UZC GH YZYH DC N4351=N4354 12 24 01.60 +12 12 17.5 8 1.81 2.80 YOF CCA WS HCds UZC GH K09 DC N4352 12 24 04.98 +11 13 04.9 5 3.32 2.17 DC WS UZC CCA GH N4353=I3266 12 24 00.16 +07 47 04.8 8 1.99 1.79 VCC HCds YOF HCds GGH WS UZC GH N4354=N4351 12 24 01.60 +12 12 17.5 8 1.81 2.80 YOF CCA WS HCds UZC GH K09 DC N4355=N4418 12 26 54.57 -00 52 42.1 10 3.54 2.53 DC APMn WS MFSK UZC GSC GGH CCA SPC ZGT N4356=I3273 12 24 14.77 +08 32 11.8 4 1.40 1.42 WS CCA DC UZC N4357=N4381 12 23 58.77 +48 46 46.4 5 2.99 0.68 DC SBG2 UZC CCA WS N4358 12 24 02.08 +58 23 05.9 5 0.78 0.62 WS DC GSC UZC CCA N4359 12 24 11.65 +31 31 17.4 7 2.47 1.97 WS UZC K03 BPP CCA GHD1 DC N4360=N4360A 12 24 21.75 +09 17 35.3 5 1.53 3.18 VCC DC CCA WS UZC N4360B=I3274 12 24 14.679 +09 15 59.56 2 0.55 1.02 VCC KHJ N4361 12 24 30.85 -18 47 05.9 6 2.17 2.33 CK GHD2 SL UCA1 ESOB DKM1 N4362=N4364 12 24 11.29 +58 21 36.2 5 0.39 2.16 WS WS GSC Pds UZC N4363 12 23 28.8 +74 57 06 4 2.45 1.50 UZC WS HCrs GHD1 N4364=N4362 12 24 11.27 +58 21 36.3 4 0.37 2.49 WS WS GSC UZC N4365 12 24 28.23 +07 19 03.2 9 2.45 1.37 DC GGH WS UZC HC2m UA20 CCA GH HCds N4366 12 24 46.99 +07 21 09.6 6 1.20 1.39 VCC WS UZC GGH I1 GSC N4367 12 24 35.21 +12 10 56.7 2 1.45 0.49 HCds JA N4367 nw * 12 24 34.73 +12 10 59.3 1 HCds N4367 se * 12 24 35.52 +12 10 52.7 1 HCds N4368:=N4325 12 23 06.667 +10 37 14.11 5 1.14 3.44 VCC UZC KHJ HCds VPC N4369 12 24 36.25 +39 22 58.7 7 2.60 2.87 GHD1 SDP SBG2 UZC CCA WS DC N4370 12 24 54.97 +07 26 39.0 7 1.59 1.32 DC GGH GSC CCA WS UZC GH N4371 12 24 55.38 +11 42 13.7 5 2.49 1.66 DC GH WS UZC CCA N4372 12 25 45.65 -72 39 28.3 2 1.51 6.22 SW HCo N4373 12 25 18.1 -39 45 38 2 6.55 2.12 WS ESOB N4373A 12 25 37.5 -39 19 12 2 0.00 0.00 ESOB WS N4373B 12 26 43.8 -39 08 05 2 0.83 0.71 ESOB WS N4374 12 25 03.66 +12 53 12.4 9 3.40 1.28 GC WS GH UZC DC HC2m CB2 HCds CCA N4375 12 25 00.48 +28 33 29.7 6 0.87 1.02 WS DC UZC BPP CCA GHD1 N4376 12 25 18.19 +05 44 28.0 7 1.18 1.49 CCA WS DC YOF GGH UZC STMW N4377 12 25 12.43 +14 45 45.2 7 0.77 3.87 CCA WS UZC GH YZYH Pds DC N4378 12 25 18.08 +04 55 30.0 6 1.08 1.19 YOF WS GGH CCA UZC GH N4379 12 25 14.78 +15 36 25.9 6 0.95 0.97 WS GSC DC UZC CCA GH N4380 12 25 22.14 +10 00 58.7 6 0.69 1.62 DC WS UZC YOF CCA GH N4381=N4357 12 23 58.77 +48 46 46.4 5 2.99 0.68 DC SBG2 UZC CCA WS N4382 12 25 24.147 +18 11 26.91 11 3.10 1.83 WS HCns UA20 UJ10 GH HC2m HCds CCA UZC GC DC N4383 12 25 25.47 +16 28 11.5 8 0.85 1.11 GH YOF WS K09 DC UZC CCA FPB N4384 12 25 12.02 +54 30 20.6 6 1.11 2.19 RC2 WS UZC CCA DC SDP N4385 12 25 42.72 +00 34 21.1 11 1.43 3.20 WS APMn ZGT MFSK GH GGH SPC UZC SDP CCA DC N4386 12 24 28.38 +75 31 44.5 6 1.95 2.71 WS HCrs UZC CCA GHD1 DC N4387 12 25 41.72 +12 48 37.0 6 1.55 2.74 GH WS UZC DC CCA Pds N4388 12 25 46.848 +12 39 42.24 9 1.70 1.13 AE HHKK vdH+ EHDS UZC CCA WS DC YOF N4389 12 25 35.15 +45 41 05.1 7 1.66 2.30 WS GHD1 DC SBG2 TVP CCA UZC N4390=I3320 12 25 50.60 +10 27 32.7 8 3.68 2.02 DC WS YOF HCds GSC CCA UZC GH N4391 12 25 18.97 +64 56 01.0 5 0.95 2.82 UZC WS DC CCA GHD1 N4392 12 25 18.72 +45 50 49.6 3 0.79 1.00 SBG2 WS UZC N4393 12 25 51.37 +27 33 40.5 7 3.20 2.37 DC WS HCds CCA UZC BPP JG N4394 12 25 55.73 +18 12 50.2 8 2.35 1.53 WS HCds HC2m UZC YOF CCA GH DC N4395 12 25 48.90 +33 32 49.4 6 0.90 2.51 WS HC2m GHD1 CCA GSC UZC N4396 12 25 59.21 +15 40 14.9 8 2.80 2.39 K09 HCds CCA YOF GH WS DC UZC N4397 12 25 58.2 +18 18 03 2 0.00 0.00 HCds WS N4397 e* 12 25 58.59 +18 18 05.9 1 HCds N4397 n* 12 25 58.72 +18 18 08.1 1 HCds N4397 s* 12 25 57.66 +18 17 58.0 1 HCds N4397 w* 12 25 57.38 +18 18 01.6 1 HCds N4398 12 26 07.47 +10 41 09.1 2 1.98 1.98 WS HCds N4399 12 25 42.91 +33 30 57.8 2 1.67 0.14 HCo HCds N4400 12 25 55.98 +33 30 53.4 3 0.22 1.48 WS HCo HCds N4401 12 25 57.83 +33 31 39.2 3 2.81 3.20 GSC HCds WS N4402 12 26 07.66 +13 06 45.2 7 2.80 1.80 YOF HCds UZC CCA WS DC GH N4403 12 26 12.82 -07 41 05.0 3 0.09 1.18 HCds SPC WS N4404 12 26 16.270 -07 40 49.93 3 0.88 0.96 KHJ HCds SPC N4405=I0788 12 26 07.19 +16 10 50.4 7 1.81 1.23 GH Pds WS YOF CCA UZC DC N4406 12 26 11.872 +12 56 46.17 6 2.40 1.60 AC DC HC2m GH UZC CCA N4406A 12 26 15.21 +12 57 48.7 1 HC2m N4407=N4413 12 26 32.122 +12 36 38.21 6 2.47 2.63 DC WS UZC GH YOF AC N4408 12 26 17.22 +27 52 15.9 5 1.74 1.58 WS HCds UZC BPP JG N4409=N4420 12 26 58.37 +02 29 38.1 6 2.70 1.58 DC ZGT WS GH GGH UZC N4410e=N4410B 12 26 29.68 +09 01 08.6 7 2.21 1.61 WS HCo GSC HCds UZC GH KEB2 N4410w=N4410A 12 26 28.17 +09 01 12.6 7 3.62 3.45 DC KEB2 UZC WS HCds HCo GH N4411=N4411A=I3339 12 26 29.98 +08 52 18.6 6 1.96 1.88 HCo HCds WS WR UZC CCA N4411B 12 26 47.23 +08 53 04.1 11 1.25 1.66 WR GD WS HCo DC GH UZC HCo GSC CCA YOF N4412 12 26 36.03 +03 57 53.0 6 1.73 2.60 DC CCA WS GGH GH UZC N4413=N4407 12 26 32.163 +12 36 37.99 8 2.39 2.26 DC WS UZC GH YOF AC CCA CCA N4414 12 26 27.12 +31 13 22.1 6 1.34 2.11 JG CCA BPP UZC K03 WS N4415 12 26 40.64 +08 26 08.0 5 2.55 1.84 UZC WS CCA VCC DC N4416 12 26 46.82 +07 55 08.0 9 2.57 2.79 VCC WS KEB2 YOF GGH CCA UZC Pds DC N4417 12 26 50.54 +09 35 02.1 5 1.67 1.46 WS DC CCA UZC GH N4418=N4355 12 26 54.57 -00 52 42.1 10 3.54 2.53 DC APMn WS MFSK UZC GSC GGH CCA SPC ZGT N4419 12 26 56.54 +15 02 49.4 7 2.74 1.89 UZC YOF WS HHKK CCA GH DC N4420=N4409 12 26 58.38 +02 29 37.6 7 2.51 1.86 DC ZGT WS GH CCA GGH UZC N4421 12 27 02.57 +15 27 40.6 5 1.83 2.71 WS DC UZC CCA GH N4422 12 27 12.156 -05 49 51.76 2 1.10 0.16 KHJ SPC N4423 12 27 09.01 +05 52 47.3 7 1.16 1.03 GGH VCC UZC CCA YOF WS DC N4424 12 27 11.75 +09 25 13.1 7 3.92 1.49 WS YOF DC UZC HCds CCA GH N4425 12 27 13.337 +12 44 05.36 7 1.68 2.26 GH YOF WS DC AC UZC CCA N4426=N4427 12 27 10.49 +27 50 18.4 2 0.75 1.27 WS HCds N4427=N4426 12 27 10.49 +27 50 18.4 2 0.75 1.27 WS HCds N4427n=N4426n 12 27 10.28 +27 50 24.1 1 HCds N4427s=N4426s 12 27 10.66 +27 50 11.5 2 1.22 0.92 GSC HCds N4428 12 27 28.25 -08 10 04.9 6 3.18 1.13 WS APMn SPC Pds GSC GHD2 N4429 12 27 26.53 +11 06 27.0 7 2.60 1.99 WS DC GH HC2m CCA UZC HCds N4430 12 27 26.28 +06 15 44.9 8 3.06 1.68 VCC GGH WS UZC CCA YOF HCrs DC N4431 12 27 27.39 +12 17 24.9 4 0.29 2.34 WS UZC GH CCA N4432 12 27 32.99 +06 13 58.3 6 0.58 2.16 VCC GGH CCA WS UZC HCrs N4433 12 27 38.62 -08 16 46.1 7 1.77 2.11 SPC APMn HC2m KEB2 WS GSC GHD2 N4434 12 27 36.71 +08 09 15.6 6 1.22 1.96 VCC WS GGH UZC CCA DC N4435 12 27 40.501 +13 04 45.00 8 0.75 1.27 UZC WS GH HC2m AC GSC DC CCA N4436 12 27 41.37 +12 18 56.8 4 2.84 2.06 WS UZC CCA GH N4437=N4517 12 32 45.65 +00 06 49.2 8 1.86 4.03 GH HC2m HCds SPC UZC WS ZGT CCA N4438 12 27 45.65 +13 00 32.1 15 2.05 1.63 DC EHDS HHKK WS CB2 vdH+ GSCM HC2m YOF UZC GSC HCds GH CCA GC N4439 12 28 27 -60 06.3 2 15.99 12.73 BSV ESOB N4440 12 27 53.53 +12 17 35.3 6 2.50 1.05 DC WS YOF UZC CCA GH N4441 12 27 20.53 +64 48 05.4 5 2.23 3.20 WS CCA UZC GHD1 DC N4442 12 28 03.84 +09 48 14.0 5 1.31 2.32 DC CCA WS UZC GH N4443:=N4461 12 29 03.022 +13 11 02.45 7 0.81 2.84 WS DC AC UZC GH YOF CCA N4444 12 28 36.1 -43 15 43 2 0.78 2.83 WS ESOB N4445=I0793 12 28 15.97 +09 26 10.5 7 3.81 1.29 DC CCA YOF GH UZC WS YZYH N4446 12 28 06.87 +13 54 42.3 7 2.18 0.53 YOF VCC WS YZYH UZC CCA VPC N4447 12 28 12.513 +13 53 56.93 2 0.21 0.22 UZC KHJ N4448 12 28 15.42 +28 37 13.9 6 3.12 1.10 GHD1 BPP UZC DC WS CCA N4449 12 28 11.33 +44 05 37.4 10 3.15 2.65 CCA HC2m UZC GSC DC STMM WS HCds HCds SBG2 N4450 12 28 29.48 +17 05 05.5 10 2.06 1.78 GC WS DC YOF GH GSC HHKK UZC HC2m CCA N4451 12 28 40.57 +09 15 31.6 7 0.63 1.46 DC WS KEBA UZC YOF CCA GH N4452 12 28 43.33 +11 45 17.5 5 0.75 2.40 WS UZC CCA GH DC N4453 12 28 46.889 +06 30 42.28 4 0.77 0.58 KHJ GGH UZC HCrs N4454 12 28 50.78 -01 56 23.8 9 3.80 4.03 GH WS GGH CCA UZC SPC ZGT DC APMn N4455 12 28 44.15 +22 49 19.0 6 3.67 4.71 YOF WS UZC CCA GH DC N4456 12 27 52.2 -30 05 53 3 0.00 0.00 ESOB Pds2 WS N4457 12 28 59.06 +03 34 14.1 9 1.73 1.21 WS GH CCA vdH+ HHKK GGH UZC ZGT DC N4458 12 28 57.653 +13 14 30.75 7 0.99 2.32 AC CCA Pds UZC GH WS DC N4459 12 29 00.11 +13 58 42.6 5 1.21 2.07 WS DC CCA UZC GH N4460 12 28 45.75 +44 51 48.6 6 2.13 3.43 WS CCA UZC SBG2 DC GHD1 N4461=:N4443 12 29 03.022 +13 11 02.45 7 0.81 2.84 WS DC AC UZC GH YOF CCA N4462 12 29 21.1 -23 09 59 3 1.38 1.00 WS GHD2 ESOB N4463 12 29 56 -64 47.4 2 13.69 4.24 BSV ESOB N4464 12 29 21.31 +08 09 24.0 5 1.68 2.99 WS UZC GGH CCA GH N4465 12 29 23.52 +08 01 34.0 4 0.70 2.49 WS UZC GGH VCC N4466 12 29 30.64 +07 41 47.0 6 0.29 0.67 UZC WS GH GGH YOF CCA N4467 12 29 30.26 +07 59 34.4 5 1.24 2.64 UZC GGH WS KEBA GH N4468 12 29 30.97 +14 02 56.3 5 2.54 1.46 WS GH UZC CCA DC N4469 12 29 28.11 +08 45 00.5 6 1.07 2.64 YOF WS UZC CCA GH DC N4470=N4610 12 29 37.90 +07 49 24.3 8 0.84 1.59 CCA HCds GGH DC UZC WS YOF GH N4471: 12 29 41.97 +07 53 46.2 1 HCds N4471? 12 29 40.64 +07 54 41.6 1 HCds N4471?? 12 29 36.98 +07 55 57.4 2 0.10 2.83 HCds WS N4472 12 29 46.78 +08 00 01.0 7 1.04 2.14 WS vdH+ CCA CB2 HC2m HCds GH N4473 12 29 48.845 +13 25 46.64 6 1.73 1.64 WS DC AC HCds CCA UZC N4474 12 29 53.50 +14 04 06.3 5 2.85 1.14 WS DC GH UZC CCA N4475 12 29 47.61 +27 14 35.7 6 0.99 1.69 JG UZC CCA WS Pds BPP N4476 12 29 59.05 +12 20 54.1 6 2.62 1.28 DC WS Pds UZC CCA GH N4477 12 30 02.25 +13 38 11.1 7 2.22 1.81 WS GH HCds CCA UZC DC HCds N4478 12 30 17.45 +12 19 42.1 9 1.28 1.17 WS UZC DC HC2m GSC GSCT Pds CCA GH N4479 12 30 18.36 +13 34 39.3 6 1.24 1.59 HCds GH WS UZC CCA DC N4480 12 30 26.71 +04 14 47.2 6 2.02 3.30 DC GH WS GGH UZC CCA N4481 12 29 48.73 +64 01 58.6 4 0.53 0.49 WS Pds UZC HCds N4482=I3427 12 30 10.41 +10 46 45.4 7 0.97 1.65 WS HCds GSC CCA Pds UZC DC N4483 12 30 40.62 +09 00 55.1 5 1.32 1.23 GH WS UZC DC CCA N4484 12 28 52.8 -11 39 07 3 0.85 0.58 WS APMn SPC N4485 12 30 31.34 +41 41 59.1 6 3.17 1.86 GHD1 SBG2 WS UZC CCA DC N4486 12 30 49.4453 +12 23 26.803 8 1.27 2.25 UZC HC2m RG USNO WS CB2 GH DC N4486A 12 30 57.77 +12 16 14.3 7 1.37 1.98 WS VPC DC UZC VCC I1 CCA N4486B 12 30 31.99 +12 29 24.7 4 0.74 1.70 WS UZC GSC GH N4487 12 31 04.3 -08 03 14 3 1.49 0.00 GHD2 WS SPC N4488 12 30 51.38 +08 21 36.2 5 1.33 4.14 WS UZC GH DC CCA N4489 12 30 52.30 +16 45 30.4 5 0.76 0.84 WS DC CCA Pds UZC N4490 12 30 36.47 +41 38 31.7 6 3.83 5.76 WS UZC HC2m CCA HCds SBG2 N4491 12 30 57.01 +11 28 58.5 7 4.16 1.63 DC GH Pds WS UZC CCA YOF N4492=I3438 12 30 59.72 +08 04 39.7 8 1.39 1.92 GH YOF Pds WS UZC GGH CCA DC N4493 12 31 08.441 +00 36 48.53 5 1.86 0.41 GGH KHJ SPC UZC MFSK N4494 12 31 24.16 +25 46 28.8 5 1.69 2.68 CCA WS GHD1 DC UZC N4494? 12 31 22.885 +25 46 38.85 1 UJ10 N4495 12 31 22.93 +29 08 10.7 5 1.49 1.35 WS UZC BPP CCA DC N4496=N4496A=N4505 12 31 39.31 +03 56 22.7 7 3.26 2.86 DC GSC WS GH CCA GGH MJC N4496B 12 31 40.90 +03 55 34.3 7 1.38 0.87 GSC WS UZC GGH DC CCA GH N4497=I3452 12 31 32.60 +11 37 29.7 5 2.17 3.85 GH UZC CCA WS DC N4498 12 31 39.59 +16 51 10.0 7 2.76 2.20 K09 WS CCA UZC GH YOF DC N4499 12 32 05.1 -39 58 57 2 2.45 0.71 WS ESOB N4500 12 31 21.98 +57 57 51.5 7 3.73 1.12 SDP WS CCA Pds UZC DC GHD1 N4501 12 31 59.17 +14 25 12.3 10 3.13 3.01 CB2 YOF WS GH UZC HHKK HC2m CCA GC DC N4502 12 32 03.22 +16 41 14.9 7 1.59 1.08 VCC K09 WS CCA YOF UZC YZYH N4503 12 32 06.16 +11 10 35.4 6 3.33 3.83 GH WS YOF UZC CCA DC N4504 12 32 17.31 -07 33 51.3 4 1.86 2.08 GHD2 GSC SPC WS N4505=N4496=N4496A 12 31 39.38 +03 56 22.7 7 3.47 2.86 DC GSC WS GH CCA GGH MJC N4506 12 32 10.55 +13 25 11.1 7 2.33 3.08 GH Pds UZC WS YOF CCA DC N4507 12 35 36.68 -39 54 33.0 4 2.85 1.26 Pds WS WMe ESOB N4508 12 32 17.6 +05 49 10 3 3.44 2.08 WS HCds GD N4508 ne* 12 32 17.51 +05 49 14.9 1 HCds N4508 sw* 12 32 17.32 +05 49 07.7 1 HCds N4509 12 33 06.79 +32 05 30.6 11 2.63 2.53 K03 K15 VPS WS K04 K11 UZC FPB GHD1 CCA DC N4510 12 31 47.40 +64 14 00.9 5 2.54 1.47 HCds WS UZC CCA DC N4511 12 32 08.07 +56 28 15.3 4 1.03 1.55 WS HCds UZC Pds2 N4512=N4521 12 32 47.90 +63 56 19.8 4 2.03 0.93 WS UZC CCA DC N4513 12 32 01.56 +66 19 56.5 6 0.77 0.99 HCds Pds UZC WS DC CCA N4514 12 32 43.07 +29 42 44.0 7 1.66 1.44 WS BPP UZC GSC CCA JG DC N4515 12 33 04.91 +16 15 55.3 5 3.91 1.48 DC WS VCC UZC CCA N4516 12 33 07.65 +14 34 29.2 6 1.11 1.96 WS Pds UZC CCA GH DC N4517=N4437 12 32 45.65 +00 06 49.2 8 1.86 4.03 GH HC2m HCds SPC UZC WS ZGT CCA N4517A 12 32 28.14 +00 23 22.5 7 0.66 0.46 WS GH CCA GGH GSC SPC UZC N4518=N4518A 12 33 11.708 +07 51 06.43 5 2.09 1.73 VCC UZC KHJ GGH GSC N4518B 12 33 10.47 +07 50 02.9 2 0.10 0.57 UZC GSC N4519 12 33 30.28 +08 39 15.9 6 1.65 0.85 GH WS YOF UZC CCA DC N4519A 12 33 24.5 +08 41 25 2 4.19 2.83 VCC WS N4520=I0799 12 33 49.906 -07 22 32.56 5 0.54 2.14 SPC KHJ HCds GSC GHD2 N4520=I0799 comp 12 33 50.73 -07 23 00.3 1 HCds N4521=N4512 12 32 47.90 +63 56 19.8 4 2.03 0.93 WS UZC CCA DC N4522 12 33 39.72 +09 10 27.2 6 2.75 2.91 UZC CCA WS GH YOF DC N4523 12 33 47.97 +15 10 04.6 4 1.71 2.25 YOF WS UZC CCA N4524 12 33 54.4 -12 01 39 2 0.00 0.00 SPC WS N4525 12 33 51.25 +30 16 40.0 7 3.05 3.62 K11 WS UZC CCA K03 BPP DC N4526=:N4560 12 34 03.07 +07 41 57.6 11 2.52 1.95 WS DC KGo HC2m AMo GH HCo UZC CCA GGH GC N4527 12 34 08.49 +02 39 11.3 8 0.89 2.81 GSCM VPD HC2m HHKK UZC GGH GSC GH N4528 12 34 06.17 +11 19 16.1 6 1.51 2.84 WS Pds UZC CCA GH DC N4529? 12 32 51.65 +20 10 59.8 2 0.30 0.14 CCA HCds N4529?? 12 31 42.47 +20 28 54.1 3 0.74 2.62 WS HCds Pds N4530 12 33 47.688 +41 21 12.35 2 0.25 0.23 SAO FK5 N4531 12 34 15.92 +13 04 31.5 6 1.59 2.53 WS YOF UZC GH CCA DC N4532 12 34 19.38 +06 28 08.6 8 1.98 6.95 GH GGH YOF WS UZC DC CCA MJC N4533 12 34 22.00 +02 19 32.1 9 3.88 3.08 ZGT APMn GGH UZC STMW WS GH SPC CCA N4534 12 34 05.53 +35 31 06.2 8 1.24 1.89 WS GHD1 K04 UZC K15 CCA SBG2 DC N4535 12 34 20.25 +08 11 52.1 10 1.38 1.57 CB2 WS UZC DC HC2m HHKK GSC GGH YOF CCA N4535A 12 34 13.96 +08 16 24.6 1 GSC N4536 12 34 27.09 +02 11 15.4 14 1.83 2.45 WS DC CCO SPC CCR HC2m GSC GGH HCds UZC VPD CCA HCds GH N4537=N4542 12 34 49.03 +50 48 18.1 5 0.89 0.65 UZC GSC CCA Pds WS N4538 12 34 40.83 +03 19 24.3 4 0.86 1.35 WS KEBA UZC GGH N4539 12 34 34.73 +18 12 08.9 6 2.15 0.80 GH YOF WS CCA UZC DC N4540 12 34 50.78 +15 33 03.5 5 2.58 1.75 YOF GH UZC WS CCA N4541 12 35 10.67 -00 13 17.4 11 1.06 2.55 GH DC APMn GGH SPC WS Pds UZC CCA ZGT MFSK N4542=N4537 12 34 49.03 +50 48 18.1 5 0.89 0.65 UZC GSC CCA Pds WS N4543 12 35 20.269 +06 06 53.93 3 0.18 0.10 KHJ GGH UZC N4544 12 35 36.62 +03 02 04.6 4 1.55 0.93 WS GGH UZC CCA N4545 12 34 34.17 +63 31 29.4 4 0.33 1.83 WS GHD1 CCA UZC N4546 12 35 29.4 -03 47 35 6 1.22 2.50 GHD2 ZGT MJC WS SPC APMn N4547 12 34 51.763 +58 54 59.48 3 0.92 1.38 Pds2 GSC KHJ N4548 12 35 26.52 +14 29 47.0 7 3.30 2.29 DC YOF GH HC2m CCA WS HCds N4549 12 35 21.18 +58 56 58.6 1 GSC N4550 12 35 30.67 +12 13 14.2 5 1.94 1.91 WS UZC GH CCA DC N4551 12 35 38.03 +12 15 50.3 6 1.48 3.12 WS Pds UZC GH CCA DC N4552 12 35 39.91 +12 33 22.6 9 0.84 2.18 CFB HC2m WS GSCT UZC DC GH HCds CCA N4553 12 36 07.8 -39 26 20 2 4.11 2.83 WS ESOB N4554?? 12 35 59.5 +11 15 55 1 HCds N4555=I3545 12 35 41.27 +26 31 22.2 9 2.07 2.67 WS BPP JG UZC HCds CCA GHD1 HC DC N4556 12 35 45.89 +26 54 31.0 8 2.55 2.54 WS DC JG GSC UZC BPP CCA HC N4557 12 35 50.05 +27 03 12.5 2 4.81 1.70 GSC HC N4558 12 35 52.71 +26 59 30.5 6 1.38 1.63 WS BPP GSC UZC HC JG N4559 12 35 57.78 +27 57 34.9 7 0.75 1.40 HC2m GSC WS UZC GHD1 CCA HCds N4559A=I3592 12 36 53.39 +27 51 42.4 5 1.88 0.53 WS UZC BPP FPB CCA N4559B=I3593 12 36 53.9 +27 44 55 4 1.27 2.00 WS FPB BPP UZC N4559C=I3550 12 35 51.9 +27 55 55 2 1.87 2.12 WS HCo N4560:=N4526 12 34 03.07 +07 41 57.6 11 2.52 1.95 WS DC KGo HC2m AMo GH HCo UZC CCA GGH GC N4561=I3569 12 36 08.22 +19 19 21.0 4 0.98 1.36 CCA YOF UZC GSC N4561se=I3569se 12 36 09.3 +19 19 11 1 HCo N4562=N4565A 12 35 34.74 +25 50 59.7 5 3.04 3.46 WS CCA K15 UZC GHD1 N4563 12 36 12.66 +26 56 27.7 3 1.35 0.29 WS GSC Pds N4563ne 12 36 13.0 +26 56 31 1 HCo N4563sw 12 36 12.3 +26 56 27 1 HCo N4564 12 36 26.96 +11 26 21.2 5 0.77 2.61 WS DC UZC GH CCA N4565 12 36 20.73 +25 59 15.6 13 2.02 2.42 WS K15 DC GSCM CFB Rup UZC JG vdH+ HC2m HHKK HCds CCA N4565A=N4562 12 35 34.74 +25 50 59.7 5 3.04 3.46 WS CCA K15 UZC GHD1 N4565B=I3546 12 35 41.81 +26 13 20.2 7 3.99 1.90 WS K15 JG GSC UZC HC GHD1 N4565C=I3543 12 35 41.31 +26 17 09.3 5 1.20 2.54 HC WS K15 GSC CCA N4566 12 36 00.34 +54 13 13.3 4 2.41 1.42 UZC CCA WS DC N4567 12 36 32.75 +11 15 28.4 6 0.76 1.99 WS GH YOF UZC DC CCA N4568 12 36 34.33 +11 14 17.7 6 2.90 2.21 YOF WS GH UZC CCA DC N4569 12 36 49.95 +13 09 47.7 11 2.57 2.75 CFB HC2m HHKK NH GSCM DC WS GH CCA YOF GC N4570 12 36 53.36 +07 14 48.2 7 1.85 2.27 WS DC GH GGH MJC UZC CCA N4571 * 12 36 51.57 +14 13 02.4 1 GSC N4571=I3588 12 36 56.48 +14 13 02.0 6 1.11 0.75 WS YOF GSC UZC CCA DC N4572 12 35 45.79 +74 14 44.5 6 0.82 1.61 WS HCds Pds UZC CCA HCrs N4573 12 37 43.7 -43 37 15 2 0.76 4.95 WS ESOB N4574 12 37 43.4 -35 31 02 4 1.84 3.56 ESOB RC2 WS Pds N4575 12 37 51.5 -40 32 14 3 4.33 2.52 WS HC ESOB N4576 12 37 33.57 +04 22 03.1 5 0.64 1.67 WS GH CCA GGH UZC N4577?=N4591 12 39 12.44 +06 00 42.8 6 1.22 0.81 WS UZC YOF GGH DC CCA N4578 12 37 30.61 +09 33 17.7 5 0.74 1.11 UZC WS CCA DC GH N4579 12 37 43.64 +11 49 06.0 11 2.74 2.08 GSCM vdH+ GC HHKK HC2m CCA YOF GH WS CB2 DC N4580 12 37 48.44 +05 22 06.0 7 1.47 1.92 WS DC UZC GH GGH CCA YOF N4581 12 38 05.17 +01 28 39.8 9 2.42 2.42 DC APMn WS UZC GGH CCA MFSK SPC ZGT N4582 12 38 10.10 +00 10 57.6 2 0.00 0.14 WS GSC N4583 12 38 04.47 +33 27 30.5 3 1.28 1.51 WS SBG2 UZC N4584 12 38 17.866 +13 06 35.32 6 1.86 1.00 DC GH KHJ UZC YOF CCA N4585 12 38 13.25 +28 56 13.0 5 1.08 1.11 WS UZC BPP JG DFOT N4586 12 38 28.31 +04 19 07.2 6 2.21 1.16 DC WS GH GGH CCA UZC N4587 12 38 35.40 +02 39 26.2 7 1.98 2.47 ZGT VCC WS GGH CCA DC UZC N4588 12 38 45.45 +06 46 03.7 4 0.37 2.42 GGH WS UZC CCA N4589 12 37 24.71 +74 11 30.6 5 1.79 1.52 GHD1 WS HCrs UZC CCA N4590 12 39 28.16 -26 44 31.7 2 2.75 4.53 SW ESOB N4591=?N4577 12 39 12.44 +06 00 42.8 6 1.22 0.81 WS UZC YOF GGH DC CCA N4592 12 39 18.70 -00 31 53.9 7 3.53 1.53 APMn GH WS CCA ZGT GGH UZC N4593 12 39 39.416 -05 20 40.10 7 2.23 2.12 APMn WS KEB2 UW SPC GHD2 HC N4594 12 39 59.4690 -11 37 22.873 9 1.37 0.39 AAS JSMo JSMr HHD SPC CCR HC2m WS USNO N4595 12 39 51.76 +15 17 52.3 7 2.33 3.12 DC YOF WS GH Pds UZC CCA N4596 12 39 56.05 +10 10 33.5 7 1.47 1.28 YOF GSC WS DC UZC CCA GH N4596 ne bar 12 39 58.6 +10 10 47 1 YZYH N4597 12 40 12.9 -05 47 58 6 2.57 4.26 WS APMn SPC HCo GHD2 HC N4598 12 40 11.96 +08 23 00.6 5 1.33 2.09 WS UZC DC CCA VCC N4599 12 40 27.13 +01 11 46.9 7 1.66 0.90 WS UZC GGH Pds MFSK SPC CCA N4600 12 40 23.01 +03 07 02.6 5 1.20 0.97 WS GGH UZC CCA ZGT N4601 12 40 46.7 -40 53 35 4 1.31 2.38 ESOB WS Pds HC N4602 12 40 36.8 -05 07 56 4 3.08 2.06 GHD2 HC WS SPC N4603 12 40 55.30 -40 58 33.6 5 2.95 1.87 WS HC Pds GSC ESOB N4603A 12 39 37.0 -40 44 23 4 2.35 2.22 WS Pds HC ESOB N4603B 12 40 29.6 -41 04 11 3 0.66 2.31 ESOB WS Pds N4603C 12 40 43.1 -40 45 48 4 3.27 3.20 HC WS Pds ESOB N4603D 12 42 08.1 -40 49 15 4 3.00 3.37 ESOB WS Pds HC N4604 12 40 45.1 -05 18 11 3 2.99 1.53 WS HC SPC N4605 12 39 59.94 +61 36 30.5 11 3.76 3.21 WS HC2m HCds GHD1 UZC GSC GSCM DC CCA HCds HCds N4606 12 40 57.54 +11 54 41.7 6 1.68 1.65 GH YOF WS UZC CCA DC N4607 12 41 12.30 +11 53 07.8 5 1.72 1.74 WS GH YOF UZC CCA N4608 12 41 13.36 +10 09 19.4 5 2.36 2.21 WS UZC CCA GH DC N4609 12 42 18 -62 59.7 2 14.58 4.24 ESOB BSV N4610=N4470 12 29 37.90 +07 49 24.3 8 0.84 1.59 CCA HCds GGH DC WS UZC YOF GH N4611=I0805 12 41 25.32 +13 43 45.6 8 2.99 1.33 VCC GD HCds UZC WS YZYH YOF CCA N4612 12 41 32.78 +07 18 52.4 6 1.01 1.88 GGH UZC GH WS DC CCA N4613 12 41 28.98 +26 05 17.7 6 0.60 1.28 K15 DFOT WS BCG FPB UZC N4614 12 41 31.56 +26 02 33.1 6 0.98 0.91 DFOT UZC BCG WS DC CCA N4615 12 41 37.47 +26 04 21.7 6 1.09 3.38 K15 UZC CCA WS DC DFOT N4616 12 42 16.6 -40 38 31 3 2.64 1.00 HC WS ESOB N4617 12 41 05.96 +50 23 34.8 4 3.42 3.16 WS UZC CCA DC N4618 se arm 12 41 34.1 +41 07 55 1 HCds N4618=I3667 12 41 32.61 +41 09 02.7 9 4.14 2.80 GHD1 UZC SBG2 GSC CCA HCds WS DC HCo N4619 12 41 44.46 +35 03 45.4 6 2.42 2.18 GHD1 WS UZC DC SBG2 CCA N4620 12 41 59.347 +12 56 34.36 6 2.94 2.79 VCC Pds UZC KHJ CCA DC N4621 12 42 02.32 +11 38 47.9 7 1.62 1.56 GH WS HC2m HCds CCA UZC DC N4622 12 42 37.7 -40 44 39 4 2.85 3.11 HC WS Pds ESOB N4622A 12 43 49.05 -40 42 53.9 4 2.27 1.08 HCo WS HCds GSC N4622B 12 43 50.58 -40 43 04.1 3 0.66 1.21 HCo WS HCds N4623 12 42 10.67 +07 40 36.3 6 0.97 3.12 WS GH DC GGH UZC CCA N4624=N4664=N4665 12 45 06.14 +03 03 22.3 7 1.17 4.68 ZGT WS CCA GH DC GGH UZC N4625=I3675 12 41 52.60 +41 16 25.1 7 3.49 1.76 GHD1 SBG2 WS GSC UZC CCA DC N4626 12 42 25.40 -07 02 40.4 4 1.23 1.29 APMn GSC WS SPC N4627 12 41 59.77 +32 34 25.4 10 2.00 1.55 WS HC2m UZC DC SBG2 CCA HCds K04 GHD1 DFOT N4628 12 42 25.3 -06 58 16 6 0.77 0.52 WS APMn HCo SPC Pds KEB2 N4629 12 42 32.77 -01 21 03.3 3 1.93 1.06 CCA WS SPC N4630 12 42 31.19 +03 57 31.2 8 2.22 3.15 ZGT WS GGH UZC GH CCA Pds DC N4631 12 42 07.91 +32 32 29.2 8 2.59 3.13 DC WS CCA HC2m UZC CB2 HCds vdH+ N4632 12 42 32.26 -00 04 54.1 10 5.13 6.21 DC APMn HCds GH CCA SPC WS HCds GGH UZC N4633=I3688 12 42 37.09 +14 21 22.0 5 2.17 1.56 UZC WS CCA YOF GH N4634 12 42 40.80 +14 17 45.9 6 3.27 2.08 DC WS CCA YOF GH UZC N4635 12 42 38.98 +19 56 43.6 5 3.40 2.70 WS DC UZC GH CCA N4636 12 42 49.96 +02 41 15.8 12 3.50 1.86 GSCM WS DC vdH+ HC2m UZC HCds CCA GGH GC ZGT GH N4637: 12 42 54.15 +11 26 15.3 5 0.80 2.53 HCo I1 GH WS CCA N4637??=N4647 12 43 32.43 +11 34 55.7 10 2.51 3.22 UZC CFB DC YOF GH WS GSC HC2m HHKK CCA N4638=:N4667 12 42 47.43 +11 26 31.1 7 2.40 2.86 HCo WS UZC GSC GH CCA DC N4639 12 42 52.42 +13 15 26.3 6 1.53 2.68 WS UZC GH YOF CCA DC N4640=N4640A 12 42 57.82 +12 17 11.0 3 0.51 1.52 WS UZC CCA N4640B 12 43 01.540 +12 17 06.12 1 KHJ N4641 12 43 07.593 +12 03 02.12 6 3.32 1.86 VCC I1 YOF KHJ UZC CCA N4642 12 43 17.74 -00 38 41.3 9 2.69 3.98 DC WS UZC SPC CCA GGH ZGT APMn GH N4643 12 43 20.19 +01 58 39.8 7 0.99 1.88 WS UZC GGH APMn DC SPC CCA N4644=N4644A 12 42 42.65 +55 08 42.6 4 0.53 1.49 Pds WS GSC CCA N4644B 12 42 52.6 +55 08 45 1 HCo N4645 12 44 09.8 -41 45 00 2 0.79 0.71 ESOB WS N4645A 12 43 05.4 -41 21 32 3 1.31 3.06 ESOB HC WS N4645B 12 43 31.3 -41 21 42 4 2.14 2.99 WS Pds ESOB HC N4646 12 42 52.18 +54 51 22.0 4 0.63 1.85 WS UZC DC CCA N4647=N4637?? 12 43 32.43 +11 34 55.7 10 2.51 3.22 UZC CFB DC YOF GH WS GSC HC2m HHKK CCA N4648 12 41 44.31 +74 25 16.0 5 0.82 1.25 HCrs Pds UZC WS CCA N4649 12 43 39.97 +11 33 08.0 10 3.11 3.81 CFBo UZC GSCM WS HC2m CFB GH CCA GC DC N4650 12 44 19.53 -40 43 56.2 3 1.14 1.27 WS GSC HC N4650A 12 44 49.19 -40 42 52.9 4 2.91 1.36 WS McN Pds ESOB N4650B=N4661 12 45 14.8 -40 49 26 2 1.61 3.54 ESOB WS N4651 12 43 42.60 +16 23 36.3 6 1.26 2.25 YOF WS GH DC CCA UZC N4652 12 43 19.65 +58 57 52.7 4 0.52 1.58 HCds Pds WS UZC N4653 12 43 50.95 -00 33 41.2 6 1.30 1.71 UZC CCA GGH WS GH SPC N4654 12 43 56.71 +13 07 33.8 7 3.66 1.43 UZC WS DC CCA HCds YOF GH N4655 12 43 36.514 +41 01 06.06 3 0.03 0.61 UZC SBG2 KHJ N4656 12 43 58.43 +32 10 17.0 9 3.79 6.20 WS CCA CB2 GSC UZC GSCM HC2m VPS DFOT N4657 12 44 06.37 +32 12 30.2 2 9.39 0.35 HC2m WS N4658 12 44 37.7 -10 05 04 3 0.85 2.08 WS SPC APMn N4659 12 44 29.52 +13 29 53.8 5 1.74 0.47 YOF CCA UZC WS DC N4660 12 44 32.07 +11 11 25.1 4 3.03 1.29 WS UZC CCA DC N4661=N4650B 12 45 14.8 -40 49 26 2 1.61 3.54 ESOB WS N4662 12 44 26.30 +37 07 14.6 5 0.78 1.44 SBG2 CCA DC WS UZC N4663=I0811 12 44 47.13 -10 11 53.0 4 1.85 1.01 WS SPC GSC GHD2 N4664=N4624=N4665 12 45 06.14 +03 03 22.3 7 1.17 4.68 ZGT WS CCA GH DC GGH UZC N4665=N4624=N4664 12 45 06.14 +03 03 22.3 7 1.17 4.68 ZGT WS CCA GH DC GGH UZC N4666 12 45 08.26 -00 27 44.8 8 4.12 2.61 ZGT UZC GGH WS CCA SPC GSC HHKK N4667:=N4638 12 42 47.43 +11 26 31.1 7 2.40 2.86 HCo WS UZC GSC GH CCA DC N4668 12 45 31.89 -00 32 09.0 11 1.22 2.81 WS ZGT APMn DC GH UZC GGH GSC SPC HC2m CCA N4669 12 44 46.82 +54 52 32.7 5 0.84 1.60 WS UZC Pds CCA HCds N4670 12 45 17.06 +27 07 31.4 12 2.25 2.30 WS DFOT JG UZC BPP DC K11 K02 K15 CCA vdK1 GHD1 N4671 12 45 47.6 -07 04 10 3 0.86 1.53 KEB2 WS SPC N4672 12 46 15.4 -41 42 22 2 2.39 0.71 ESOB WS N4673 12 45 34.69 +27 03 38.3 9 2.37 1.59 DC UZC DFOT WS BPP KET1 CCA JG GHD1 N4674 12 46 03.4 -08 39 21 4 0.74 1.71 WS SPC GHD2 APMn N4675 12 45 31.83 +54 44 14.2 4 1.19 1.59 WS CCA UZC HCds N4676A=I0819 12 46 10.18 +30 43 56.1 10 1.89 2.95 HHKK BPP Pds UZC WS CCA DC JG GHD1 DFOT N4676B=I0820 12 46 11.31 +30 43 23.1 10 1.87 3.52 WS BPP HHKK UZC Pds DC DFOT CCA JG GHD1 N4677 12 46 57.2 -41 34 58 3 2.60 1.15 Pds WS ESOB N4678=I0824 12 49 42.18 -04 34 47.7 3 3.05 1.13 SPC HCds WS N4678=I0824 comp 12 49 41.06 -04 34 49.4 2 0.21 0.85 WS HCds N4679 12 47 30.5 -39 34 16 3 2.68 1.00 Pds WS ESOB N4680 12 46 54.68 -11 38 11.0 5 2.67 1.20 HCo APMn SPC WS GSC N4681 12 47 29.0 -43 20 05 2 4.65 1.41 WS ESOB N4682 12 47 15.62 -10 03 48.5 5 2.33 1.58 WS GSC APMn SPC GHD2 N4683 12 47 42.4 -41 31 42 2 3.19 3.54 WS ESOB N4684 12 47 17.53 -02 43 38.7 6 1.17 1.07 UZC SPC GGH CCA WS DC N4685 12 47 11.50 +19 27 50.6 5 1.13 0.99 WS CCA JG UZC DC N4686 12 46 39.75 +54 32 01.7 3 0.82 1.05 WS UZC CCA N4687 12 47 23.88 +35 21 07.4 7 1.85 2.24 SBG2 WS UZC SDP GHD1 CCA DC N4688 12 47 46.51 +04 20 08.8 6 2.53 3.51 GH WS UZC GGH CCA DC N4689 12 47 45.66 +13 45 45.4 6 1.50 3.89 YOF GH CCA WS UZC DC N4690 12 47 55.52 -01 39 22.4 5 0.54 0.77 GGH UZC SPC WS CCA N4691 12 48 13.59 -03 19 58.6 9 3.12 1.46 HCds APMn WS SPC ZGT HC2m GGH vdH+ HHKK N4692=N4702 12 47 55.26 +27 13 21.0 8 3.07 2.54 JG WS UZC DFOT BPP DC CCA GHD1 N4693 12 47 09.16 +71 10 35.2 5 1.92 2.75 HC WS UZC CCA DC N4694 12 48 15.05 +10 59 02.0 5 1.38 2.79 WS UZC GH DC CCA N4695=I3791 12 47 32.12 +54 22 27.5 3 1.00 1.68 WS UZC CCA N4696 12 48 49.12 -41 18 41.6 3 0.57 1.31 WS RWH GSC N4696A 12 46 55.4 -41 29 49 2 0.80 4.24 ESOB WS N4696B 12 47 21.5 -41 14 15 3 1.73 1.00 ESOB Pds WS N4696C 12 48 02.7 -40 49 10 2 1.61 2.12 WS Pds N4696D 12 48 21.6 -41 42 51 3 2.60 2.00 Pds WS ESOB N4696E 12 48 26.3 -40 56 08 2 3.22 0.71 WS ESOB N4697 12 48 35.82 -05 48 01.9 5 0.07 1.15 GHD2 APMn WS SPC HC2m N4698 12 48 23.12 +08 29 15.4 6 3.28 0.75 YOF CCA UZC WS GH DC N4699 12 49 02.18 -08 39 53.0 6 2.59 2.13 GC HHKK APMn SPC WS GHD2 N4700 12 49 07.7 -11 24 43 4 3.68 3.30 GHD2 SPC WS APMn N4701 12 49 11.66 +03 23 20.2 8 2.54 2.42 WS GGH HC2m UZC GH CCA ZGT DC N4702=N4692 12 47 55.26 +27 13 21.0 8 3.07 2.54 JG WS UZC DFOT BPP DC CCA GHD1 N4703 12 49 19.0 -09 06 31 4 2.57 2.08 WS SPC APMn GHD2 N4704 12 48 46.44 +41 55 15.9 5 0.92 1.82 SBG2 WS GHD1 CCA UZC N4705 12 49 25.02 -05 11 45.0 5 1.63 1.37 WS SPC APMn HCds GHD2 N4706 12 49 54.0 -41 16 48 2 0.00 2.12 ESOB WS N4707 12 48 23.08 +51 09 52.7 3 1.03 6.58 CCA UZC WS N4708 12 49 41.5 -11 05 36 4 1.85 1.41 GHD2 APMn SPC WS N4709 12 50 03.95 -41 22 57.0 3 1.73 1.65 GSC WS ESOB N4710 12 49 38.78 +15 09 53.3 5 1.72 2.17 vdH+ WS GH CCA DC N4711=I3804 12 48 45.88 +35 19 58.1 6 0.93 2.42 WS GHD1 SBG2 CCA UZC DC N4712 12 49 34.22 +25 28 11.8 9 3.57 1.96 K02 K15 WS UZC HC DFOT CCA DC GH N4713 12 49 57.92 +05 18 39.2 8 3.52 1.26 WS UZC GH GGH YOF CCA DC MJC N4714 12 50 19.22 -13 19 29.2 5 0.90 2.74 HCds Pds WS SPC APMn N4715 12 49 57.870 +27 49 20.28 7 0.65 1.02 Pds KHJ UZC BPP DFOT JG CCA N4716 12 50 33.11 -09 27 04.4 3 0.17 0.72 WS SPC GSC N4717 12 50 34.49 -09 27 47.1 3 0.60 0.12 GSC SPC WS N4718=??I0825 12 50 32.55 -05 16 55.8 5 1.07 1.19 WS HCds APMn GHD2 SPC N4719 12 50 08.72 +33 09 32.7 8 2.08 1.71 SDP WS K04 K05 UZC SBG2 CCA DC N4720 12 50 42.7 -04 09 22 2 2.12 0.00 WS SPC N4721 12 50 19.78 +27 19 27.2 5 3.13 1.80 JG WS UZC DFOT BPP N4722?=I3833 12 51 32.31 -13 19 49.3 4 1.15 1.63 HCds WS SPC APMn N4723? 12 51 02.94 -13 14 13.6 4 1.34 1.89 HCds APMn SPC WS N4724 12 50 53.71 -14 19 55.1 4 3.74 2.96 HCds SPC WS GHD2 N4725 12 50 26.62 +25 30 02.6 10 2.18 2.76 GSCM WS UZC HC HC2m DFOT K15 CCA DC HCm N4726 12 50 45.89 -14 16 06.6 3 1.60 2.18 SP HCds HCo N4727=:N4740 12 50 57.37 -14 19 56.5 5 3.35 3.83 HCds WS SPC Pds GHD2 N4728=N4728A 12 50 27.997 +27 26 05.85 7 1.70 1.49 JG HCds GHD1 BPP KHJ GSC DFOT N4728B 12 50 37.33 +27 25 28.6 4 1.76 3.29 JG K15 HCds DFOT N4728C 12 50 36.88 +27 29 00.6 1 HCds N4729 12 51 46.3 -41 07 55 2 1.60 2.12 WS ESOB N4730 12 52 00.5 -41 08 49 2 0.00 1.41 ESOB WS N4731 12 51 01.10 -06 23 32.8 6 2.71 2.61 GHD2 SPC APMn WS HCds GC N4731A 12 51 13.3 -06 33 32 1 SPC N4732 12 50 07.26 +52 50 59.5 5 3.17 1.09 WS UZC CCA HCds Pds N4733 12 51 06.91 +10 54 42.5 5 2.85 1.59 WS UZC DC CCA GH N4734 12 51 12.97 +04 51 31.6 6 1.86 1.98 WS GGH UZC CCA GH DC N4735 12 51 01.76 +28 55 40.4 6 1.12 1.19 K02 JG UZC DFOT WS BPP N4736 12 50 53.066 +41 07 11.98 14 2.83 2.47 CCA GHD1 UJ10 vdK1 GSCM UJ10 UJ10 TH HC2m vdH+ WS SBG2 CB2 DC N4737 12 50 52.898 +34 09 24.74 3 0.47 0.61 UZC SBG2 KHJ N4738 12 51 08.89 +28 47 17.1 6 0.62 1.60 JG WS BPP UZC CCA DFOT N4739 12 51 37.1 -08 24 36 4 1.87 1.29 GHD2 SPC APMn WS N4740:=N4727 12 50 57.37 -14 19 56.5 5 3.35 3.83 HCds WS SPC Pds GHD2 N4741 12 50 59.56 +47 40 17.3 5 2.02 1.15 WS UZC SBG2 CCA DC N4742 12 51 48.1 -10 27 18 5 2.56 0.55 SPC WS APMn GHD2 MJC N4743 12 52 15.6 -41 23 24 2 0.80 1.41 WS ESOB N4744 12 52 19.5 -41 03 37 2 0.00 2.83 ESOB WS N4745=N4745A 12 51 26.03 +27 25 16.7 4 1.93 1.14 JG WS BPP DFOT N4745B 12 51 21.84 +27 26 38.9 2 2.82 1.48 JG UZC N4746 12 51 55.29 +12 04 59.4 6 3.69 2.35 GH YOF WS CCA UZC DC N4747 12 51 45.46 +25 46 28.5 9 1.89 2.28 DC WS K02 GHD1 HC GSC K06 K15 CCA N4748 12 52 12.6 -13 24 50 1 WS N4748ne 12 52 12.82 -13 24 40.1 1 HCds N4748sw 12 52 12.39 -13 24 54.4 2 0.93 0.42 HCds SPC N4748w 12 52 09.9 -13 24 46 1 SPC N4749 12 51 12.64 +71 38 06.0 7 3.70 2.84 HC WS UZC Pds CCA DC GHD1 N4750 12 50 06.89 +72 52 28.6 5 1.59 2.69 WS DC UZC GHD1 CCA N4751 12 52 51.0 -42 39 36 2 6.27 1.41 WS ESOB N4752? 12 51 29.07 +13 46 55.1 1 HCds N4753 12 52 22.11 -01 12 00.3 9 1.18 2.20 ZGT GC SPC CCA HC2m WS HCds GGH GH N4754 12 52 17.55 +11 18 48.5 5 1.23 1.43 GH UZC WS CCA DC N4755 12 53 39 -60 21.7 2 26.44 25.46 BSV ESOB N4756 12 52 52.57 -15 24 48.0 6 2.54 2.28 WS GHD2 Pds SPC GSC APMn N4757 12 52 50.04 -10 18 37.8 5 1.06 1.40 WS GHD2 SPC GSC HCo N4758 12 52 44.16 +15 50 53.2 6 2.17 1.71 WS UZC CCA YOF DC GH N4759nw=N4776 12 53 04.47 -09 11 58.5 5 1.23 2.46 HCo Pds HKA SPC WS N4759se=N4778 12 53 05.77 -09 12 15.3 5 0.66 2.67 Pds SPC WS HCo HKA N4760 12 53 07.3 -10 29 41 3 2.25 1.00 WS SPC GHD2 N4761 12 53 09.81 -09 11 52.7 4 1.41 0.41 SPC WS GSC HKA N4762 12 52 55.98 +11 13 49.2 8 2.53 1.82 GH GSCM WS CCA HC2m UZC HCds DC N4763 12 53 27.2 -17 00 21 4 0.83 2.22 GHD2 WS SPC APMn N4764? 12 53 06.59 -09 15 28.1 3 3.14 0.91 SPC GSC HKA N4765 12 53 14.64 +04 27 48.4 7 2.34 2.81 GH KEBA GGH WS UZC CCA DC N4766 12 53 08.14 -10 22 42.3 5 1.22 1.40 APMn GHD2 GSC WS SPC N4767 12 53 53.1 -39 42 52 2 3.28 0.71 WS ESOB N4767A 12 53 01.3 -39 50 10 2 1.64 0.71 ESOB WS N4767B 12 54 44.8 -39 51 10 2 3.27 2.12 ESOB WS N4768 12 53 17.25 -09 31 54.4 2 0.00 1.70 WS HCds N4769 12 53 18.32 -09 32 07.6 2 4.92 2.83 HCds WS N4770 12 53 32.17 -09 32 30.0 4 0.22 0.47 WS APMn SPC HCds N4771 12 53 21.17 +01 16 08.3 6 2.08 1.68 WS GH UZC CCA GGH SPC N4772 12 53 29.10 +02 10 06.1 7 1.64 2.13 WS UZC GH DC GGH SPC CCA N4773n 12 53 35.94 -08 38 20.2 5 1.16 2.60 GHD2 SPC WS GSC APMn N4773s 12 53 35.86 -08 38 43.9 2 0.84 0.49 WS GSC N4774n 12 53 05.94 +36 49 33.9 1 SBG2 N4774s 12 53 06.61 +36 49 06.9 7 0.90 1.31 K05 WS K04 GSC SBG2 KEBA UZC N4775 12 53 45.9 -06 37 19 3 0.86 4.16 WS SPC APMn N4776=N4759nw 12 53 04.47 -09 11 58.5 5 1.23 2.46 HCo Pds HKA SPC WS N4777 12 53 58.47 -08 46 33.2 5 2.50 1.59 GHD2 WS GSC SPC APMn N4778=N4759se 12 53 05.77 -09 12 15.3 5 0.66 2.67 Pds SPC WS HCo HKA N4779 12 53 50.84 +09 42 33.1 5 1.57 2.12 WS FPB CCA DC UZC N4780 12 54 05.24 -08 37 17.6 4 1.21 1.21 GSC APMn WS SPC N4780A 12 54 03.03 -08 39 13.6 1 GSC N4781 12 54 23.6 -10 32 10 3 2.95 1.15 GHD2 WS SPC N4782 12 54 35.804 -12 34 08.11 4 1.04 1.76 RG WS SPC PCR N4783 12 54 36.418 -12 33 29.51 4 1.74 0.99 SPC WS PCR RG N4784 12 54 37.0 -10 36 47 4 0.00 0.82 APMn SPC WS GHD2 N4785 12 53 27.0 -48 44 59 2 2.11 1.41 ESOB WS N4786 12 54 32.5 -06 51 33 5 1.94 3.36 WS Pds APMn GHD2 SPC N4787 12 54 05.57 +27 04 05.4 6 1.69 1.10 DFOT GSC BPP UZC CCA WS N4788 12 54 16.04 +27 18 11.6 5 1.27 1.70 DFOT BPP UZC GSC WS N4789 12 54 18.94 +27 04 04.0 8 3.28 2.52 GHD1 DFOT GSC BPP UZC DC CCA WS N4789A 12 54 05.38 +27 08 53.1 5 3.27 3.39 BPP UZC CCA WS DFOT N4789A bar 12 54 06.1 +27 08 53 1 HCo N4790 12 54 51.96 -10 14 53.0 5 0.95 1.03 GSC WS SPC GHD2 APMn N4791 12 54 43.913 +08 03 10.83 4 2.73 1.37 JA KHJ GGH UZC N4792 12 55 03.675 -12 29 49.33 2 0.09 0.67 SPC KHJ N4793 12 54 40.71 +28 56 16.5 9 2.54 1.94 BPP K02 GSC WS UZC DFOT K11 CCA DC N4794 12 55 10.4 -12 36 32 4 0.73 2.38 SPC APMn WS Pds N4795 12 55 02.947 +08 03 56.78 7 1.28 1.75 KHJ GGH UZC GH HCds CCA DC N4796 12 55 04.712 +08 04 00.12 3 0.35 2.76 KHJ JA HCds N4797=N4798 12 54 55.22 +27 24 44.4 6 0.87 0.74 DFOT BPP UZC GSC WS CCA N4798=N4797 12 54 55.22 +27 24 44.4 6 0.87 0.74 DFOT BPP UZC GSC WS CCA N4799 12 55 15.51 +02 53 46.6 5 1.10 1.25 WS DC UZC GGH CCA N4800 12 54 37.78 +46 31 51.3 8 2.63 2.54 GHD1 CCA WS UZC Pds KEBA DC SBG2 N4801 12 54 37.716 +53 05 23.81 3 1.30 0.49 Pds KHJ HCds N4802=N4804 12 55 49.8 -12 03 20 3 3.88 3.21 WS SPC GHD2 N4803 12 55 33.66 +08 14 24.1 5 0.20 1.70 WS Pds UZC JA GGH N4804=N4802 12 55 49.8 -12 03 20 3 3.88 3.21 WS SPC GHD2 N4805 12 55 24.26 +27 58 49.7 2 0.65 4.17 HCds WS N4806 12 56 12.5 -29 30 12 2 2.78 1.41 WS ESOB N4807 12 55 29.21 +27 31 15.0 6 1.43 1.09 DFOT BPP UZC CCA DC WS N4807A 12 55 30.8 +27 32 35 1 WS N4808 12 55 49.06 +04 18 13.6 6 4.03 2.52 CCA WS GGH UZC GH DC N4809 12 54 50.93 +02 39 09.7 6 3.20 2.44 CCA WS GH ZGT UZC GGH N4810 12 54 51.19 +02 38 25.0 6 1.40 1.11 ZGT GSC UZC WS GH GGH N4811 12 56 52.2 -41 47 50 2 2.38 2.12 ESOB WS N4812 12 56 52.8 -41 48 46 2 3.18 4.95 WS ESOB N4813=??I0833 12 56 36.19 -06 49 05.2 4 2.54 3.93 WS HCds SPC APMn N4814 12 55 22.02 +58 20 37.8 4 1.61 0.91 WS UZC CCA GHD1 N4815 12 57 59 -64 57.6 2 13.60 8.49 BSV ESOB N4816 12 56 12.18 +27 44 42.1 5 1.14 0.84 BPP UZC DFOT WS CCA N4817 12 56 29.783 +27 56 24.30 3 0.69 1.43 HCds KHJ GSC N4818 12 56 48.9 -08 31 30 4 0.74 3.11 GHD2 WS SPC APMn N4819 12 56 28.09 +26 59 13.5 7 3.93 2.16 BPP DFOT CCA UZC WS DC GHD1 N4820 12 57 00.5 -13 43 09 3 0.00 1.15 APMn SPC WS N4821 12 56 29.14 +26 57 23.9 4 1.74 0.82 BPP DFOT UZC WS N4822 12 57 03.6 -10 45 44 3 0.85 1.15 WS APMn SPC N4823 12 57 25.62 -13 41 56.0 2 0.93 0.57 GSC SPC N4824 12 56 36.36 +27 25 58.2 2 1.03 1.20 HCo GSC N4825 12 57 12.2 -13 39 54 2 0.00 0.71 WS SPC N4826 12 56 43.661 +21 40 57.68 11 2.22 3.35 HHKK TH UJ10 HC2m HCSb CB2 vdK2 HCds GH WS CCA N4827 12 56 43.65 +27 10 42.7 7 3.29 2.19 BPP DC DFOT UZC CCA WS GHD1 N4828 12 56 42.854 +28 01 12.32 4 0.66 0.90 BPP KHJ UZC DFOT N4829 12 57 24.458 -13 44 15.53 3 0.48 0.78 GSC KHJ SPC N4830 12 57 27.8 -19 41 29 3 3.27 0.58 ESOB SPC WS N4831 12 57 36.8 -27 17 31 3 3.54 1.15 WS Pds ESOB N4832 12 57 47.3 -39 45 40 2 1.64 5.66 ESOB WS N4833 12 59 35.27 -70 52 31.5 2 2.04 4.38 SW ESOB N4834 12 56 25.17 +52 17 44.7 5 1.15 1.49 WS Pds UZC GSC HCds N4835 12 58 07.7 -46 15 51 2 0.74 5.66 WS ESOB N4835A 12 57 13.3 -46 22 41 2 4.41 2.12 WS ESOB N4836 12 57 34.294 -12 44 38.10 3 0.05 0.79 KHJ APMn SPC N4837e 12 56 49.88 +48 17 59.0 3 0.51 1.40 WS GSC UZC N4837w 12 56 48.01 +48 17 46.7 4 2.44 2.52 SBG2 WS DC GSC N4838 12 57 56.19 -13 03 36.3 5 1.07 1.93 APMn WS Pds SPC HCds N4839 12 57 24.34 +27 29 51.2 8 1.52 1.87 UZC BPP DC DFOT WS GHD1 HC CCA N4840 12 57 32.88 +27 36 35.7 5 1.13 0.57 BPP WS DFOT UZC HC N4841=N4841A 12 57 32.04 +28 28 35.9 9 1.59 1.76 BPP Pds WS UZC CCA DFOT HC GHD1 DC N4841B 12 57 34.02 +28 28 55.6 7 2.73 1.84 Pds DFOT WS GHD1 CCA HC DC N4842A 12 57 35.95 +27 29 34.3 6 2.89 1.48 BPP DFOT UZC GSC WS HC N4842B 12 57 36.26 +27 29 03.5 5 3.20 2.05 Pds GHD1 GSC WS HC N4843 12 58 00.85 -03 37 18.1 6 1.68 0.49 ZGT UZC GGH APMn WS SPC N4844: 12 58 08.35 -13 04 47.7 2 1.76 0.07 HCds WS N4844? 12 57 58.13 -13 03 48.7 1 HCds N4845=?N4910 12 58 01.21 +01 34 33.2 8 2.40 2.73 WS SPC CCA ZGT UZC GH GGH DC N4846 12 57 47.70 +36 22 13.5 5 1.04 2.57 K05 WS UZC CCA SBG2 N4847 12 58 29.06 -13 08 26.6 3 2.94 2.52 WS GSC SPC N4848 12 58 05.60 +28 14 33.5 10 1.51 3.44 HC CCA BPP K02 DFOT GSC GHD1 WS UZC DC N4849=I3935 12 58 12.74 +26 23 47.9 8 2.22 1.70 BPP DFOT WS UZC JG CCA GHD1 DC N4849A=I0838 12 58 13.61 +26 25 34.4 3 3.79 2.31 Pds2 DFOT WS N4850 12 58 21.793 +27 58 02.91 6 1.00 1.77 UZC GHD1 DFOT KHJ HC BPP N4851ne 12 58 22.12 +28 09 07.0 3 1.45 3.00 UZC GSC HC N4851sw 12 58 21.67 +28 08 54.2 6 2.49 2.50 HC UZC GSC DFOT WS BPP N4852 13 00 09 -59 36.8 2 54.08 16.97 BSV ESOB N4853 12 58 35.24 +27 35 45.7 9 1.96 2.91 GHD1 UZC K02 DFOT HC BPP WS CCA DC N4854 12 58 47.40 +27 40 26.8 5 1.87 1.86 HC DFOT BPP UZC WS N4855 12 59 18.4 -13 13 51 4 0.84 0.58 Pds WS APMn SPC N4856 12 59 21.2 -15 02 32 4 1.39 2.08 WS HCo SPC APMn N4857 12 57 18.20 +70 12 11.8 5 0.73 2.50 HC WS Pds UZC CCA N4858 12 59 02.23 +28 06 55.9 7 3.73 3.64 UZC GSC DFOT HC GHD1 WS ZH N4859 12 59 01.89 +26 48 55.0 6 1.24 1.39 BPP DFOT WS UZC CCA JG N4860 12 59 04.01 +28 07 22.3 5 1.09 2.54 DFOT GSC WS HC GHD1 N4861 knot 12 59 00.44 +34 50 44.1 4 2.24 2.96 HCds WS SDP DC N4861=I3961 12 59 02.05 +34 51 44.4 5 4.40 3.98 GHD1 SBG2 HCds DC UZC N4862=:I3999 12 59 30.91 -14 07 55.4 5 2.62 0.83 WS HCds GSC SPC HC N4863 12 59 42.51 -14 01 46.7 6 1.24 1.17 GSC HCds SPC APMn WS HC N4864 12 59 13.15 +27 58 36.2 8 2.07 3.97 ZH UZC DFOT GSC GHD1 WS KEBA HC N4865 12 59 19.86 +28 05 02.5 8 1.11 1.60 ZH HC UZC GHD1 DFOT GSC WS CCA N4866 12 59 27.12 +14 10 15.5 6 2.24 1.34 WS GH CCA GSCM UZC DC N4867 12 59 15.32 +27 58 14.3 5 2.05 1.70 UZC GSC DFOT HC WS N4868 12 59 08.99 +37 18 35.9 8 1.74 1.79 K05 HCds SBG2 WS UZC GHD1 CCA DC N4869 12 59 23.38 +27 54 40.0 6 1.32 1.56 UZC GHD1 DFOT GSC HC WS N4870 12 59 17.80 +37 02 52.5 2 0.76 2.05 GSC WS N4871 12 59 30.02 +27 57 22.0 5 2.01 1.55 UZC GSC DFOT WS HC N4872 12 59 34.07 +27 56 47.5 7 2.04 1.69 ZH GHD1 UZC HC GSC DFOT WS N4873 12 59 32.80 +27 58 58.6 6 0.98 2.80 UZC ZH DFOT GSC HC WS N4874 12 59 35.65 +27 57 33.3 10 2.46 2.69 DC HC GHD1 UZC GSC GPB ZH WS DFOT CCA N4875 12 59 37.89 +27 54 24.8 5 2.05 2.14 HC ZH GSC DFOT WS N4876 12 59 44.31 +27 54 44.8 7 3.46 2.88 ZH HC UZC GSC DFOT KEBA WS N4877 13 00 26.36 -15 17 00.9 4 0.58 2.20 GSC WS SPC APMn N4878: 13 00 20.24 -06 06 15.9 4 1.81 3.61 GSC WS SPC APMn N4878? 12 55 14.3 -06 07 13 1 HCo N4879: 13 00 25.61 -06 06 40.4 1 GSC N4880 13 00 10.56 +12 28 59.3 5 3.01 1.17 GH WS UZC CCA DC N4881 12 59 57.738 +28 14 47.26 12 1.26 2.11 ZH GHD1 HC UZC DFOT GSC GSCA GSC2 UA20 APMN CCA WS N4882=N4886 13 00 04.57 +27 59 13.2 5 1.59 2.48 DFOT GSC WS HC UZC N4883 12 59 55.96 +28 02 02.4 6 2.24 3.35 ZH HC UZC DFOT GSC WS N4884=N4889 13 00 08.07 +27 58 35.4 7 2.86 2.57 HC UZC DFOT GSC CCA WS DC N4885 13 00 33.8 -06 51 12 2 1.05 0.71 WS SPC N4886=N4882 13 00 04.51 +27 59 12.1 6 2.51 3.42 GHD1 DFOT GSC WS HC UZC N4887 13 00 39.16 -14 39 59.6 4 2.74 1.78 HC GSC SPC WS N4888 13 00 36.3 -06 04 31 3 2.58 2.08 HCo WS SPC N4889=N4884 13 00 08.07 +27 58 35.4 7 2.86 2.57 HC UZC DFOT GSC CCA WS DC N4890 13 00 39.0 -04 36 15 3 1.50 0.58 WS SPC ZGT N4891 13 00 46.98 -13 25 33.4 1 HCds N4892 13 00 03.56 +26 53 51.9 6 1.74 0.85 BPP DFOT UZC WS CCA JG N4893=I4015 12 59 59.640 +37 11 36.23 4 0.10 0.34 CCA SBG2 KHJ GSC N4893A=I4016 12 59 59.86 +37 11 15.3 4 0.74 2.34 SBG2 HCo CCA WS N4894 13 00 16.51 +27 58 00.7 4 3.12 2.57 HC GSC ZH WS N4895 13 00 17.94 +28 12 07.0 6 1.37 2.23 UZC DFOT GSC WS CCA DC N4895A 13 00 09.14 +28 10 12.9 4 1.65 2.16 HC Pds GSC WS N4896 13 00 30.727 +28 20 44.13 8 2.48 3.51 GHD1 HC DFOT AC UZC BPP CCA WS N4897 13 00 52.99 -13 27 01.2 4 1.17 3.63 HCds SPC WS APMn N4898 13 00 17.68 +27 57 18.2 5 2.55 2.75 GHD1 ZH HC GSC DFOT N4898ne 13 00 18.2 +27 57 17 1 WS N4898sw 13 00 17.6 +27 57 17 2 1.87 2.83 UZC WS N4899 13 00 56.6 -13 56 41 4 0.73 2.38 WS GHD2 SPC APMn N4900 13 00 39.09 +02 30 00.5 9 1.92 4.37 MJC ZGT WS CCA UZC HC2m GGH GH DC N4901 12 59 56.409 +47 12 19.96 4 0.73 1.05 UZC KHJ SBG2 CCA N4902 13 00 59.7 -14 30 50 7 3.33 3.35 GHD2 HC WS HCo APMn SPC GC N4903 13 01 22.9 -30 56 04 2 3.65 3.54 WS ESOB N4904 13 00 58.71 -00 01 40.2 10 2.86 3.41 SPC GH WS CCA ZGT APMn KEB2 DC GGH UZC N4905 13 01 30.6 -30 52 04 2 0.91 0.00 WS Pds N4906 13 00 39.69 +27 55 25.3 6 1.39 2.39 HC ZH DFOT UZC GSC WS N4907 13 00 48.63 +28 09 26.7 7 3.87 3.69 GHD1 ZH HC UZC WS GSC DFOT N4908 13 00 54.478 +28 00 26.04 9 0.88 1.51 WS UA20 GSC2 APMN GSCA DFOT CCA HC UZC N4909 13 02 01.7 -42 46 19 2 1.56 0.00 WS ESOB N4910?=N4845 12 58 01.21 +01 34 33.2 8 2.40 2.73 WS SPC CCA ZGT UZC GH GGH DC N4911 13 00 56.11 +27 47 25.5 6 2.22 2.85 HCds UZC DFOT CCA HC WS N4911A 13 00 53.92 +27 47 03.6 1 HCds N4912 13 00 46 +37 22.7 1o LdR N4913 13 00 46 +37 20.7 1o LdR N4914 13 00 42.92 +37 18 54.4 7 1.38 2.11 DC WS UZC GHD1 SBG2 GSC CCA N4915 13 01 27.91 -04 32 45.3 4 3.73 3.32 Pds GHD2 WS SPF N4916 13 00 54 +37 21.7 1o LdR N4917 13 00 55.59 +47 13 19.0 4 0.68 0.78 SBG2 WS UZC CCA N4918 13 01 50.7 -04 30 04 2 0.00 1.41 WS SPC N4919 13 01 17.60 +27 48 30.6 7 1.04 2.92 UZC DFOT WS BPP GSC HC CCA N4920=I4134 13 02 04.24 -11 22 42.3 4 0.29 1.42 GSC APMn SPC WS N4921 13 01 26.19 +27 53 07.9 7 1.32 2.90 DFOT HC BPP UZC CCA WS DC N4922 13 01 24.9 +29 18 39 1 BPP N4922ne 13 01 25.24 +29 18 47.1 4 0.63 1.91 DC DFOT WS GSC N4922sw 13 01 24.416 +29 18 29.34 7 2.35 2.11 DC Pds UZC GSC AE DFOT WS N4923 13 01 31.72 +27 50 49.1 5 1.53 2.11 HC BPP UZC DFOT WS N4924 13 02 12.8 -14 58 10 5 3.15 1.30 HC GHD2 WS SPC APMn N4925 13 02 07.4 -07 42 38 2 3.16 0.71 WS SPC N4926 13 01 53.84 +27 37 27.3 8 2.69 0.93 BPP UZC DFOT HC CCA WS GHD1 DC N4926A 13 02 07.96 +27 38 53.2 8 1.98 1.44 BPP K02 UZC DFOT K06 WS GHD1 HC N4926B 13 02 01.0 +27 39 09 2 0.94 3.54 UZC HC N4927 13 01 57.50 +28 00 19.9 6 2.02 2.00 HC BPP DFOT GSC WS UZC N4928 13 03 00.5 -08 05 05 4 1.87 2.38 SPC WS APMn GHD2 N4929 13 02 44.35 +28 02 41.7 6 1.04 2.17 HC UZC DFOT BPP GSC WS N4930 13 04 04.8 -41 24 41 2 3.19 0.71 ESOB WS N4931 13 03 00.94 +28 01 56.1 10 2.03 2.64 BPP CCA Pds DFOT GSC UZC GHD1 WS HC DC N4932 13 02 37.67 +50 26 19.1 5 1.13 1.49 WS UZC HCds Pds CCA N4932 comp 13 02 40.61 +50 26 28.0 1 HCds N4933=N4933A=I4176 13 03 56.96 -11 29 50.2 6 3.32 2.06 GHD2 GSC WS HHKK SPF SPC N4933B=I4173 13 03 54.58 -11 30 20.6 5 2.93 1.64 GHD2 WS HCo SPF SPC N4933C 13 04 01.21 -11 29 26.8 3 1.35 1.25 GSC WS SPF N4934 13 03 16.32 +28 01 47.1 7 0.92 2.07 DFOT GSC WS UZC HC BPP CCA N4935 13 03 21.26 +14 22 38.8 4 0.65 0.79 WS DC UZC CCA N4936 13 04 16.98 -30 31 35.0 4 0.00 3.53 Pds GHD2 WS HCds N4937 13 04 51.74 -47 13 09.5 2 2.32 0.28 HCds WS N4938 13 02 57.50 +51 19 06.3 4 1.05 0.78 Pds WS GSC UZC N4939 13 04 14.48 -10 20 24.7 6 2.87 2.08 WS GSC VPD SPC APMn GHD2 N4940 13 05 00.27 -47 14 11.9 3 1.67 2.05 WS HCds ESOB N4941 13 04 13.104 -05 33 06.55 7 2.78 1.20 GHD2 WS SPC APMn UW HHKK MJC N4942=:I4136 13 04 19.04 -07 38 57.5 7 1.49 3.35 GHD2 APMn Pds WS HCds SPF SPC N4943 13 03 44.90 +28 05 00.5 4 1.87 2.08 HC DFOT WS BPP N4944 13 03 49.93 +28 11 07.5 8 2.31 1.64 HC BPP DFOT CCA WS GHD1 DC UZC N4945 13 05 27.03 -49 28 02.3 4 5.53 4.29 HCds GC HC2m GMH N4945A 13 06 33.7 -49 41 28 2 0.00 3.54 ESOB WS N4946 13 05 29.3 -43 35 29 3 0.63 2.08 ESOB WS Pds N4947=I3974 13 05 20.5 -35 20 15 2 4.34 0.71 WS ESOB N4947A 13 04 20.7 -35 13 41 3 1.88 1.73 ESOB WS Pds N4948=:I4156 13 04 55.67 -07 56 48.0 6 3.50 3.88 GHD2 WS SPC APMn SPF HCds N4948A 13 05 05.5 -08 09 38 3 3.43 1.73 FT GHD2 WS N4949 13 04 18.02 +29 01 44.4 2 1.85 2.40 GSC WS N4950 13 05 36.3 -43 30 02 2 1.55 0.71 ESOB WS N4951 13 05 07.6 -06 29 41 4 2.86 1.15 GHD2 WS SPC APMn N4952=N4962 13 04 58.46 +29 07 20.1 7 2.58 2.18 BPP DFOT GSC UZC CCA WS DC N4953 13 06 10.21 -37 35 09.5 3 1.84 1.86 ESOB HCds WS N4953 comp 13 06 08.1 -37 35 50 1 WS N4954=N4972 13 02 19.59 +75 24 14.6 5 1.22 1.08 HCrs WS CCA DC UZC N4955 13 06 05.1 -29 45 16 2 4.62 2.12 WS ESOB N4956 13 05 01.12 +35 10 40.0 5 3.72 1.53 SBG2 UZC CCA WS DC N4957 13 05 12.45 +27 34 09.7 7 1.71 1.85 BPP DFOT UZC CCA WS DC GHD1 N4958 13 05 48.9 -08 01 15 3 0.00 1.53 WS SPC APMn N4959 13 05 40.971 +33 10 44.16 4 1.63 1.74 HCds UZC KHJ SBG2 N4960:=N4961 13 05 47.64 +27 44 02.7 9 2.34 2.49 K02 HCds UZC BPP CCA DFOT WS GHD1 DC N4961=:N4960 13 05 47.66 +27 44 02.3 8 2.39 2.33 K02 UZC BPP CCA DFOT WS GHD1 DC N4962=N4952 13 04 58.46 +29 07 20.1 7 2.58 2.18 BPP DFOT GSC UZC CCA WS DC N4963 13 05 52.01 +41 43 16.9 6 1.19 1.49 WS DC UZC SBG2 HC CCA N4964 13 05 24.89 +56 19 20.8 3 0.91 0.50 WS UZC CCA N4965 13 07 09.4 -28 13 43 2 1.87 0.00 WS GHD2 N4966 13 06 17.27 +29 03 46.3 7 1.16 1.59 BPP DFOT WS DC UZC GSC CCA N4967 13 05 36.42 +53 33 50.7 5 0.97 1.32 Pds WS UZC GSC Pds2 N4968 13 07 06.0 -23 40 40 2 0.00 3.54 ESOB WS N4969 13 07 03.2 +13 38 10 3 5.11 4.73 UZC GD Pds N4969e 13 07 03.3 +13 38 09 1 WS N4969w 13 07 02.4 +13 38 09 1 WS N4970=I4196 13 07 33.47 -24 00 31.7 3 3.48 1.93 ESOB WS HCds N4970=I4196 comp 13 07 36.71 -24 01 26.3 1 HCds N4971 13 06 54.985 +28 32 52.71 5 0.97 0.26 BPP DFOT KHJ UZC JG N4972=N4954 13 02 19.59 +75 24 14.6 5 1.22 1.08 HCrs WS CCA DC UZC N4973=I0847 13 05 32.189 +53 41 06.62 4 0.32 0.29 KHJ Pds UZC GSC N4974 13 05 55.87 +53 39 34.4 2 1.12 0.78 UZC GSC N4975 13 07 50.28 -05 01 05.0 4 1.74 1.04 SPF WS SPC ZGT N4976 13 08 37.43 -49 30 21.5 4 0.79 1.17 WS GSCM GSC HC2m N4977 13 06 04.585 +55 39 21.29 4 0.98 0.32 KHJ UZC CCA DC N4978 13 07 50.555 +18 24 55.02 6 1.05 1.31 JG KHJ UZC CCA DC Pds N4979=I4198 13 07 42.82 +24 48 38.1 6 0.99 0.69 HCds WS DFOT UZC JG CCA N4980 13 09 10.2 -28 38 30 3 0.76 1.00 Pds WS GHD2 N4981 13 08 48.8 -06 46 43 4 2.24 3.16 WS SPC APMn GHD2 N4982 13 08 46.1 -10 35 19 1 HCds N4983 13 08 27.29 +28 19 13.6 5 0.83 0.91 JG DFOT BPP UZC WS N4984 13 08 57.22 -15 30 59.6 5 1.80 0.89 WS APMn SPC GHD2 vdH+ N4985 13 08 12.133 +41 40 33.73 5 1.03 1.32 SBG2 KHJ UZC HC CCA N4986 13 08 24.55 +35 12 21.5 6 3.79 2.59 Pds UZC SBG2 WS CCA DC N4987 13 07 59.10 +51 55 44.9 4 0.73 1.22 WS UZC HCds CCA N4988 13 09 54.2 -43 06 21 3 1.10 0.58 ESOB WS Pds N4989 13 09 16.0 -05 23 48 4 0.75 0.50 Pds SPC WS APMn N4990 13 09 17.3 -05 16 22 3 0.86 0.58 WS KEB2 SPC N4991 13 09 15.10 +02 20 50.2 5 1.64 1.20 ZGT GGH SPC UZC WS N4992 13 09 05.59 +11 38 01.5 4 1.91 0.82 GD UZC CCA WS N4993=N4994 13 09 47.51 -23 23 03.1 3 3.65 0.90 ESOB WS HCds N4994=N4993 13 09 47.51 -23 23 03.1 3 3.65 0.90 ESOB WS HCds N4995 13 09 40.60 -07 49 59.8 7 1.93 1.16 MJC HHKK SPF APMn WS SPC GHD2 N4996 13 09 31.972 +00 51 25.32 8 2.77 1.18 GGH CCA KHJ APMn SPC UZC DC ZGT N4997 13 09 51.7 -16 30 58 2 0.00 2.12 WS SPC N4998 13 08 10.30 +50 39 50.0 4 0.61 1.01 HCds Pds WS UZC N4999 13 09 33.20 +01 40 21.7 10 0.78 2.42 CCA ZGT GH GGH GSC APMn WS SPC DC UZC N5000 13 09 47.49 +28 54 24.6 8 1.14 2.80 BPP Pds JG WS UZC DC CCA DFOT N5001 13 09 33.19 +53 29 38.1 4 1.76 1.29 WS UZC HCds CCA N5002 13 10 38.20 +36 38 03.0 8 1.21 2.52 STMW Pds WS K05 UZC MW5 SBG2 CCA N5003 13 08 37.93 +43 44 15.1 4 0.33 0.99 CCA HCds GSC SBG2 N5003 comp 13 08 33.78 +43 45 48.7 1 HCds N5004=N5004A 13 11 01.55 +29 38 11.5 7 0.86 1.27 DFOT WS BPP JG UZC DC CCA N5004B=I4210 13 10 47.74 +29 42 33.5 5 1.22 2.62 DFOT WS UZC JG HCo N5004C 13 11 01.73 +29 34 40.3 6 0.72 1.67 DFOT WS BPP UZC JG CCA N5005 13 10 56.371 +37 03 30.35 15 3.79 3.15 UJ10 WS DC CB2 vdH+ HHKK VPD HC2m CCA MW5 UZC GSC GSCM UJ10 SBG2 N5006 13 11 45.72 -19 15 42.5 3 0.73 0.85 WS GSC SPC N5007 13 09 14.21 +62 10 28.8 3 0.66 0.51 CCA WS UZC N5008=I4381 14 10 57.15 +25 29 47.9 4 2.15 2.52 WS HKA UZC HCds N5009 13 10 47.17 +50 05 32.7 3 0.64 0.70 CCA SBG2 WS N5010 13 12 26.3 -15 47 51 3 2.21 1.00 SPC WS APMn N5011 13 12 51.74 -43 05 48.0 3 1.87 1.26 WS GSC ESOB N5011A 13 12 09.7 -43 18 28 3 1.10 2.65 Pds WS ESOB N5011B 13 13 12.06 -43 14 47.7 2 0.31 0.00 ESOB GSC N5011C 13 13 11.94 -43 15 54.8 3 1.05 1.03 GSC HCds ESOB N5012 13 11 36.95 +22 54 57.3 4 1.53 3.04 GSC UZC CCA GH N5012A 13 12 41.8 +22 49 46 1 UZC N5013 13 12 07.37 +03 11 55.4 4 2.15 1.58 WS UZC GGH ZGT N5014 13 11 31.35 +36 16 55.7 10 2.65 3.40 SDP GHD1 CCA K05 UZC Pds WS SBG2 K05 DC N5015 13 12 22.8 -04 20 14 4 4.65 2.06 APMn SPC WS ZGT N5016 13 12 06.70 +24 05 42.4 9 2.34 2.50 WS UZC K06 GH DFOT Pds K06 CCA DC N5017 13 12 54.5 -16 45 58 4 1.44 2.22 WS APMn SPC Pds N5018 13 13 01.0 -19 31 08 4 0.82 3.46 GHD2 WS ESOB SPC N5019 13 12 42.46 +04 43 45.7 5 1.72 2.09 CCA GGH UZC WS DC N5020 13 12 39.96 +12 35 58.0 4 1.84 1.30 WS UZC CCA DC N5021 13 12 06.25 +46 11 45.3 5 2.02 1.05 SBG2 WS UZC DC CCA N5022 13 13 30.7 -19 32 50 4 3.54 2.75 GHD2 WS SPC ESOB N5023 13 12 11.86 +44 02 17.4 8 1.67 3.45 WS CCA UZC GSC GSCM DC GHD1 SBG2 N5024 13 12 55.25 +18 10 07.2 2 0.30 2.33 SW HCrs N5025 13 12 44.73 +31 48 31.6 6 0.87 2.13 BPP UZC GSC DFOT WS CCA N5026 13 14 13.7 -42 57 41 2 6.24 1.41 WS ESOB N5027 13 13 20.927 +06 03 40.73 5 2.54 0.26 GD GGH KHJ CCA UZC N5028 13 13 45.859 -13 02 33.82 6 1.43 2.96 GHD2 SPC APMn KHJ SPF Pds N5029 13 12 37.68 +47 03 47.1 6 2.42 1.52 WS SBG2 UZC CCA Pds DC N5030 13 13 54.2 -16 29 28 5 2.37 3.74 Pds WS APMn SPC GHD2 N5031 13 14 03.4 -16 07 26 3 3.82 3.79 WS SPC APMn N5032=N5032A 13 13 26.94 +27 48 07.6 8 1.30 2.66 HCds BPP DC UZC DFOT WS CCA JG N5032B 13 13 25.67 +27 45 48.5 4 1.94 1.94 HCds DFOT UZC JG N5033 13 13 27.681 +36 35 37.57 12 3.00 2.08 HHKK CB2 UW vdH+ HC2m CCA UJ10 UZC GSC WS DC SBG2 N5034 13 12 19.06 +70 38 58.1 5 1.55 1.18 DC GSC UZC WS CCA N5035 13 14 49.244 -16 29 36.33 5 1.03 2.62 WS KHJ SPC APMn GHD2 N5036 13 14 42.896 -04 10 45.27 5 3.02 3.93 SPC GSC KHJ HCds ZGT N5037 13 14 59.5 -16 35 26 3 1.66 1.53 WS SPC GHD2 N5038 13 15 02.1 -15 57 06 3 2.21 3.06 APMn WS SPC N5039 13 14 52.03 -04 09 30.4 5 1.93 2.18 SPC GSC HCds WS ZGT N5039 comp 13 14 51.85 -04 09 52.8 1 HCds N5040 13 13 32.69 +51 15 29.8 4 0.49 1.25 Pds WS HCds UZC N5040 comp 13 13 30.822 +51 16 23.14 2 0.49 1.07 KHJ HCds N5041 13 14 32.52 +30 42 19.7 9 3.00 1.37 BPP K06 UZC Pds DFOT JG WS CCA DC N5042 13 15 30.79 -23 59 01.7 4 2.50 1.33 GHD2 WS HCds HC2m N5043 13 16 12 -60 03.6 2 26.68 72.12 ESOB HCds N5043? 13 16 39 -60 02.5 1 BSV N5044 13 15 24.0 -16 23 07 5 0.64 1.82 MJC WS APMn SPC GHD2 N5045 13 17 03 -63 24.9 1o JH N5045?=N5155 13 28.3 -63 28 1 HCe N5046 13 15 45.095 -16 19 36.36 4 0.72 2.36 SPC WS KHJ GHD2 N5047 13 15 48.5 -16 31 08 4 0.72 1.50 APMn SPC WS GHD2 N5048 13 16 07.6 -28 24 39 2 0.94 2.83 WS Pds N5049 13 15 59.3 -16 23 50 3 0.00 2.65 GHD2 WS SPC N5050 13 15 41.69 +02 52 43.0 5 0.75 1.94 ZGT WS CCA GGH UZC N5051 13 16 20.1 -28 17 09 2 2.81 2.83 WS ESOB N5052 13 15 34.91 +29 40 32.7 6 1.11 1.42 DFOT UZC BPP CCA WS JG N5053 13 16 26.91 +17 41 52.2 2 1.51 0.35 HCrs SW N5054 13 16 58.3 -16 38 05 5 1.20 2.92 GC GHD2 WS APMn SPC N5055 13 15 49.22 +42 01 46.0 7 1.26 1.53 HCo CB2 GSCM CCA HC2m HC AAS N5056 13 16 12.31 +30 56 58.9 9 1.55 1.94 K06 DC Pds DFOT UZC BPP JGV WS CCA N5057 13 16 27.788 +31 01 52.99 6 0.80 0.33 UZC BPP JGV DFOT KHJ CCA N5058 13 16 52.27 +12 32 54.1 5 0.84 1.07 WS CCA UZC FPB HCds N5058 comp 13 16 52.26 +12 32 49.0 1 HCds N5059 13 16 58.49 +07 50 39.9 4 0.68 0.62 WS CCA GGH UZC N5060 13 17 16.29 +06 02 13.9 5 0.67 1.85 CCA GGH WS DC UZC N5061 13 18 05.0 -26 50 12 3 2.79 3.21 ESOB GHD2 WS N5062 13 18 23.5 -35 27 30 2 1.73 3.54 ESOB WS N5062 comp 13 18 19.2 -35 26 44 1 WS N5063 13 18 26.0 -35 21 11 2 5.21 1.41 WS ESOB N5064 13 19 00.1 -47 54 38 2 1.43 2.12 WS ESOB N5065 13 17 30.60 +31 05 33.7 7 3.51 2.90 BPP UZC JGV DFOT WS CCA DC N5066=N5069 13 18 28.44 -10 14 01.8 4 0.62 1.79 WS SPF HCds SPC N5067 13 18 27.8 -10 08 43 1 HCds N5067 ne * 13 18 28.06 -10 08 37.6 1 HCds N5067 sw * 13 18 27.50 -10 08 46.7 1 HCds N5068 13 18 54.74 -21 02 20.2 6 3.61 1.00 WS HCds GHD2 SPC HC2m ESOB N5069=N5066 13 18 28.44 -10 14 01.8 4 0.62 1.79 WS SPF HCds SPC N5070=N5072 13 19 12.51 -12 32 24.0 4 0.99 1.81 SPF HCo WS SPC N5071 13 18 37.186 +07 56 07.81 4 0.63 0.41 GD GGH KHJ UZC N5072=N5070 13 19 12.51 -12 32 24.0 4 0.99 1.81 SPF HCo WS SPC N5073 13 19 20.9 -14 50 49 2 1.03 0.71 WS APMn N5074 13 18 25.79 +31 28 07.0 5 0.55 2.20 WS UZC K06 GSC BPP N5075 13 19 06.276 +07 49 52.05 4 0.71 1.36 UZC KHJ GGH GD N5076 13 19 30.4 -12 44 28 2 1.04 0.71 WS SPC N5077 13 19 31.63 -12 39 25.4 5 1.09 1.62 SPF WS SPC GSC GHD2 N5078 13 19 50.00 -27 24 34.3 3 3.85 2.01 WS HCds ESOB N5079 13 19 38.00 -12 41 57.8 4 1.93 2.49 WS SPF SPC GHD2 N5080 13 19 19.246 +08 25 44.54 3 0.75 0.27 UZC KHJ GD N5081 13 19 08.25 +28 30 22.0 7 1.73 2.36 DC JG UZC DFOT WS CCA BPP N5082 13 20 39.8 -43 42 00 2 0.00 2.83 Pds WS N5083 13 19 03.12 +39 35 20.4 4 0.62 0.78 CCA SBG2 WS UZC N5084 13 20 16.78 -21 49 40.1 6 1.28 2.97 GSCM ESOB MJC WS SPC GHD2 N5085 13 20 17.8 -24 26 23 4 3.26 3.59 WS GHD2 ESOB HC N5086 13 20 59 -43 44.0 1 HCo N5087 13 20 25.0 -20 36 39 5 2.98 2.51 GHD2 WS SPC ESOB MJC N5088 13 20 20.21 -12 34 18.8 5 0.80 2.91 WS GSC GHD2 SPC APMn N5089 13 19 39.37 +30 15 22.4 9 1.88 2.35 K06 JGV DFOT Pds UZC CCA WS BPP DC N5090 13 21 13.01 -43 42 18.2 3 4.15 1.26 WS HC2m ESOB N5090A 13 19 20.9 -43 38 58 4 0.89 2.38 WS ESOB Pds2 Pds N5090B 13 20 17.4 -43 51 55 2 1.54 0.00 ESOB WS N5091 13 21 18.03 -43 43 12.4 3 4.36 1.71 HC2m WS ESOB N5092 13 19 51.64 +22 59 58.4 5 1.26 0.71 WS UZC CCA JG Pds N5093 13 19 37.77 +40 23 10.6 3 1.66 1.58 CCA UZC SBG2 N5094 13 20 46.85 -14 04 51.3 3 0.80 1.53 WS GSC SPC N5095 13 20 36.82 -02 17 24.0 7 1.57 3.16 ZGT GSC GGH UZC WS SPC CCA N5096n 13 20 09.1 +33 05 26 1 HCo N5096s 13 20 08.53 +33 05 17.5 4 1.22 2.06 UZC SBG2 WS HCo N5096w 13 20 08.0 +33 05 21 1 HCo N5097 13 20 59.61 -12 28 17.9 4 1.10 2.31 WS SPF SPC HCds N5098A 13 20 14.66 +33 08 35.9 5 1.06 1.65 UZC SBG2 GSC WS PCR N5098B 13 20 17.72 +33 08 41.1 5 1.56 1.19 UZC SBG2 GSC PCR WS N5099 13 21 19.540 -13 02 32.68 2 0.66 0.24 SPC KHJ N5100=:N5106 13 20 59.548 +08 58 41.21 5 1.96 0.80 GD KHJ GSC UZC CCA N5101 13 21 46.26 -27 25 50.0 4 3.58 3.32 WS GSCM GHD2 ESOB N5102 13 21 57.57 -36 37 50.5 6 3.62 3.10 WS GSC HC2m HCds GC ESOB N5103 13 20 30.07 +43 05 01.8 5 0.59 0.50 CCA WS DC SBG2 UZC N5103 comp 13 20 30.89 +43 05 19.4 1 SBG2 N5104 13 21 23.13 +00 20 30.5 8 3.09 3.27 WS DC UZC GGH CCA APMn SPC ZGT N5105 13 21 49.12 -13 12 25.0 4 1.51 1.55 WS GSC APMn SPC N5106:=N5100 13 20 59.548 +08 58 41.21 5 1.96 0.80 GD KHJ GSC UZC CCA N5107 13 21 24.73 +38 32 16.8 9 3.40 1.73 WS KEB2 HCds K09 GHD1 SBG2 CCA Pds DC N5107 knot 13 21 23.5 +38 32 24 1 UZC N5108 13 23 18.6 -32 20 29 2 1.80 3.54 ESOB WS N5109=N5113 13 20 52.65 +57 38 30.6 11 1.12 1.64 HCds Pds WS HCds HCds HC2m HC2m HC2m GSC CCA DC N5110=N5111 13 22 56.505 -12 57 52.15 4 0.78 1.45 HCds Pds KHJ SPC N5111=N5110 13 22 56.505 -12 57 52.15 4 0.78 1.45 HCds Pds KHJ SPC N5112 13 21 56.61 +38 44 04.7 5 1.27 1.49 UZC WS SBG2 CCA K09 N5113=N5109 13 20 52.68 +57 38 31.4 5 1.36 2.00 Pds WS GSC CCA DC N5114 13 24 01.7 -32 20 39 3 0.73 1.53 ESOB WS Pds N5115 13 23 00.38 +13 57 02.8 4 0.69 0.89 HCds CCA WS UZC N5116 13 22 55.71 +26 58 51.3 8 1.98 0.79 BPP UZC GHD1 K06 DC WS CCA JG N5117 13 22 56.63 +28 18 59.4 5 4.62 4.17 BPP DC CCA WS UZC N5118=I4236 13 23 27.48 +06 23 32.3 6 1.00 1.52 WS CCA UZC GGH GSC DC N5119 13 24 00.2 -12 16 36 2 2.07 1.41 WS SPC N5120 13 25 39 -63 27.5 2 4.78 0.00 ESOB BSV N5121 13 24 45.7 -37 40 59 2 5.05 1.41 WS ESOB N5121A 13 25 32.8 -37 22 48 2 3.38 7.78 WS ESOB N5122 13 24 14.91 -10 39 16.7 3 0.78 1.10 WS SPF SPC N5123 13 23 10.55 +43 05 09.1 5 2.06 1.05 WS UZC SBG2 CCA DC N5124=I4233 13 24 50.31 -30 18 27.8 3 3.34 3.01 HCds WS ESOB N5125 13 24 00.72 +09 42 34.4 5 1.28 2.41 Pds WS UZC CCA DC N5126 13 24 53.54 -30 20 01.2 3 1.37 1.25 WS HCds ESOB N5127 13 23 45.22 +31 33 54.9 6 2.69 1.66 BPP CCA UZC WS DC GHD1 N5128 13 25 27.6867 -43 01 08.198 2 0.98 0.87 USNO HC2m N5129 13 24 09.98 +13 58 34.3 5 2.18 0.71 DC CCA WS UZC Pds N5130 13 24 27.17 -10 12 38.1 3 0.34 0.12 SPF SPC WS N5131 13 23 56.98 +30 59 15.3 6 1.32 1.73 BPP JG WS DC UZC CCA N5132 13 24 28.83 +14 05 31.7 4 3.68 1.14 DC WS UZC CCA N5133 13 24 52.9 -04 04 57 2 0.00 1.41 WS SPC N5134 13 25 18.7 -21 08 03 5 3.96 3.51 GHD2 WS SPC ESO ESOB N5135 13 25 44.142 -29 50 01.41 4 3.22 1.55 UW WS GHD2 ESOB N5136=I0888 13 24 51.41 +13 44 16.1 4 0.71 1.25 WS UZC GSC KEBA N5137 13 24 52.6 +14 04 33 2 1.03 1.41 WS GD N5138 13 27 16 -59 02.0 2 11.00 42.43 BSV ESOB N5139 13 26 47.02 -47 28 53.3 2 16.14 23.48 SW ESOB N5140 13 26 21.3 -33 52 06 2 7.07 2.83 ESOB WS N5141 13 24 51.46 +36 22 41.6 9 1.99 1.18 RC2 WS UZC GPB SBG2 Pds DC BCG CCA N5142 13 25 01.32 +36 23 57.8 9 3.74 2.49 K05 SBG2 BCG UZC WS CCA SDP DC RC2 N5143 13 25 01.33 +36 26 14.1 3 1.14 1.66 SBG2 UZC WS N5144A 13 22 54.0 +70 30 50 5 1.28 1.87 K09 DC WS UZC SDP N5144B 13 22 53.7 +70 30 34 2 1.05 1.41 WS DC N5145 13 25 13.97 +43 16 00.8 5 0.81 1.12 WS CCA SBG2 UZC DC N5146 13 26 37.498 -12 19 26.52 3 0.30 1.07 GSC KHJ SPC N5147 13 26 19.66 +02 06 00.2 11 2.94 3.62 SPC APMn DC WS GSC CCA GH GGH ZGT HCo UZC N5148 13 26 38.75 +02 18 48.1 6 2.00 1.92 SPC ZGT UZC GSC WS GH N5149 13 26 09.22 +35 56 02.7 7 2.61 1.17 K05 SBG2 WS BCG UZC CCA DC N5150 13 27 36.48 -29 33 44.3 4 1.24 1.37 GHD2 WS HCds ESOB N5151 13 26 40.87 +16 52 25.3 4 0.79 1.37 WS HCds Pds UZC N5152 13 27 51.31 -29 37 09.0 2 3.33 2.76 HCds WS N5153 13 27 54.43 -29 37 06.3 3 2.98 1.36 WS HCds ESOB N5154 13 26 28.59 +36 00 35.7 5 0.55 0.33 BCG SBG2 UZC WS CCA N5155=?N5045 13 28.3 -63 28 1 HCe N5156 13 28 44.2 -48 55 01 2 0.70 0.71 ESOB WS N5157 13 27 16.97 +32 01 47.4 5 2.89 3.69 BPP WS UZC CCA DC N5158 13 27 47.00 +17 46 44.3 5 0.96 3.68 WS CCA UZC DC JG N5159 13 28 16.18 +02 58 58.7 5 2.03 0.62 GGH WS UZC CCA ZGT N5160 13 28 21.7 +05 59 43 3 2.58 1.15 WS HCo GD N5160n 13 28 21.69 +05 59 49.3 2 0.32 0.00 GSC HCo N5160s 13 28 21.6 +05 59 38 1 HCo N5161 13 29 13.97 -33 10 27.4 5 1.85 2.64 WS GC ESOB GHD2 GSC N5162=N5174 13 29 25.91 +11 00 26.9 6 0.30 1.87 CCA HCds DC WS UZC GSC N5163 13 26 54.393 +52 45 12.43 5 2.79 1.10 KHJ UZC CCA HCds Pds N5164 13 27 11.94 +55 29 12.6 5 0.78 1.98 WS SDP UZC GSC CCA N5165 13 28 39.323 +11 23 12.40 5 2.49 2.64 KHJ UZC Pds HCds GD N5166=N5166A 13 28 15.28 +32 01 55.0 5 3.48 1.12 WS UZC CCA BPP DC N5166B 13 28 32.99 +32 04 10.4 1 HCds N5167 13 28 40.2 +12 42 39 3 0.84 1.00 GD WS UZC N5168 13 31 06 -60 56.4 2 10.39 0.00 ESOB BSV N5169 13 28 10.06 +46 40 18.5 4 0.71 0.95 WS UZC CCA SBG2 N5170 13 29 48.90 -17 57 56.3 4 2.81 2.60 GSCM WS SPC GHD2 N5171 13 29 21.62 +11 44 05.4 6 0.62 1.07 GSC WS UZC CCA HCds Pds N5172 13 29 19.17 +17 03 06.0 5 1.61 1.69 WS UZC CCA GH DC N5173 13 28 25.428 +46 35 30.43 6 2.50 2.09 UZC SBG2 KHJ CCA DC GHD1 N5174=N5162 13 29 25.91 +11 00 26.9 6 0.30 1.87 CCA HCds DC WS UZC GSC N5175 13 29 26.27 +10 59 42.7 2 0.21 0.21 HCds GSC N5175?? 13 29 24.82 +11 01 00.1 1 HCds N5176 13 29 25.012 +11 46 52.90 4 0.85 1.36 KHJ GSC HCds Pds N5177 13 29 24.29 +11 47 48.8 5 1.16 2.39 WS Pds GSC HCds GD N5178 13 29 29.30 +11 37 28.6 7 2.48 1.48 GD HCds WS UZC GSC CCA Pds N5179 13 29 30.914 +11 44 45.13 5 0.87 0.77 KHJ UZC GSC HCds KEB2 N5180 13 29 26.92 +16 49 31.4 4 2.18 2.09 DC WS UZC CCA N5181 13 29 41.962 +13 18 13.26 4 2.39 2.45 GD UZC KHJ HCds N5182 13 30 41.08 -28 09 01.6 3 2.22 2.03 WS HCds ESOB N5183 13 30 06.18 -01 43 15.1 8 2.20 2.10 DC Pds SPC WS GGH APMn CCA ZGT N5184 13 30 11.43 -01 39 47.5 8 1.85 1.95 APMn DC ZGT WS GGH CCA UZC SPC N5185 13 30 02.29 +13 24 57.2 4 1.37 1.52 WS UZC HCds CCA N5186 13 30 04.0 +12 10 27 3 3.05 1.00 WS GD JA N5187 13 29 48.22 +31 07 48.3 5 1.12 1.49 WS UZC K06 JG BPP N5188 13 31 28.3 -34 47 43 3 4.28 0.58 WS ESOB RC2 N5189=I4274 13 33 32.86 -65 58 26.8 4 0.31 2.05 GSCA BSV HCo GSC N5190 13 30 38.49 +18 08 02.8 4 1.97 1.34 WS DC UZC CCA N5191 13 30 47.416 +11 12 01.39 6 1.28 2.55 KHJ Pds UZC HCds GD JA N5192 13 30 51.65 -01 46 44.4 5 1.30 1.34 ZGT GGH UZC SPC WS N5193 13 31 53.5 -33 14 04 4 1.58 2.94 GHD2 ESOB WS Pds N5193A 13 31 48.8 -33 14 24 2 5.34 0.71 ESOB WS N5194 13 29 52.450 +47 11 44.51 11 2.54 3.79 UZC GHD1 SBG2 CCA Vig HCds WS CB2 FCJL TH HC2m N5195 13 29 59.303 +47 16 00.34 6 1.62 2.47 WS GSCM CCA HCds UJ10 HC2m N5196 13 31 19.599 -01 36 55.52 5 1.45 1.47 ZGT UZC SPC KHJ GGH N5197 13 31 25.168 -01 41 36.41 6 2.21 1.52 UZC GGH KHJ GSC SPC ZGT N5198 13 30 11.31 +46 40 14.5 6 2.21 1.49 GHD1 SBG2 WS UZC CCA DC N5199 13 30 42.781 +34 49 49.37 4 0.65 0.61 KHJ SBG2 UZC CCA N5200 13 31 42.4 -00 01 48 2 1.06 0.71 HCds WS N5200 e* 13 31 42.62 -00 01 47.9 1 HCds N5200 w* 13 31 42.05 -00 01 48.9 1 HCds N5201 13 29 16.43 +53 04 53.6 5 1.65 1.25 WS CCA Pds UZC DC N5202 13 32 00.50 -01 41 57.2 5 0.63 2.19 ZGT WS GGH GSC SPC N5203 13 32 13.4 -08 47 10 4 1.42 2.45 APMn WS SPC Pds N5204 13 29 36.48 +58 25 08.7 4 0.68 3.68 DC GSC CCA UZC N5205 13 30 03.62 +62 30 42.1 4 3.00 1.14 WS UZC DC CCA N5206 13 33 43.8 -48 09 06 2 0.71 2.83 WS ESOB N5207 13 32 14.05 +13 53 29.5 4 1.82 2.57 WS UZC CCA Pds N5208 13 32 27.969 +07 18 58.81 8 0.60 1.74 DC CCA KHJ Pds UZC HCds GGH GSC N5208 comp 13 32 25.54 +07 19 55.3 1 HCds N5209 13 32 42.605 +07 19 36.54 6 1.21 2.96 KHJ HCds UZC GSC CCA GD N5210 13 32 49.38 +07 10 11.5 5 1.04 1.50 GSC UZC CCA WS DC N5211 13 33 05.29 -01 02 08.7 7 1.04 3.44 ZGT UZC WS SPC CCA APMn DC N5212: 13 33 21.1 +07 18 43 2 1.05 0.71 HCm WS N5212: s* 13 33 20.95 +07 18 33.4 1 HCds N5212: n* 13 33 21.19 +07 18 52.4 1 HCds N5212? 13 32 56.05 +07 17 17.2 2 0.63 1.77 HCds HCo N5212?? 13 32 32.29 +07 17 39.4 1 HCds N5213 13 34 39.22 +04 07 49.0 4 2.55 2.72 GD WS UZC CCA N5214 13 32 48.57 +41 52 19.5 6 1.27 1.42 DC K09 SBG2 CCA GSC UZC N5214A 13 32 47.24 +41 51 54.5 2 0.24 1.56 SBG2 GSC N5215e 13 35 09.5 -33 29 02 3 2.61 1.15 ESOB Pds2 WS N5215w 13 35 06.4 -33 28 55 3 2.90 1.15 ESOB Pds2 WS N5216 13 32 07.24 +62 42 01.6 5 2.63 1.26 UZC CCA WS GHD1 DC N5216A 13 34 41.72 +61 59 34.7 2 0.30 0.28 UZC CCA N5217 13 34 05.922 +17 51 25.05 9 0.80 2.81 UZC WS DC HCds APMN GSCA GSC2 UA20 CCA N5218 13 32 10.45 +62 46 03.3 5 1.89 0.73 WS GHD1 UZC CCA DC N5219=N5244 13 38 41.8 -45 51 18 4 1.57 1.41 WS Pds2 ESOB Pds N5220 13 35 56.5 -33 27 14 2 2.66 3.54 ESOB WS N5221 13 34 56.02 +13 49 56.0 5 2.03 1.00 UZC GSC CCA WS DC N5222 13 34 55.85 +13 44 29.0 5 2.88 2.44 DC WS UZC GSC Pds N5222ne 13 34 57.5 +13 44 37 3 3.03 3.05 DC HCo WS N5223 13 34 25.21 +34 41 25.5 5 1.34 2.50 WS UZC CCA SBG2 DC N5224 13 35 08.805 +06 28 51.40 4 2.19 1.25 GD KHJ Pds UZC N5225 13 33 20.08 +51 29 25.4 4 1.05 1.31 WS DC UZC CCA N5226 13 35 03.6 +13 55 17 3 0.84 3.06 Pds2 WS HCo N5227 13 35 24.45 +01 24 37.3 7 2.89 1.71 ZGT UZC APMn SPC GSC CCA WS N5228 13 34 35.16 +34 46 38.5 5 1.58 0.90 WS UZC SBG2 CCA DC N5229 13 34 02.88 +47 54 53.0 6 1.47 3.87 HCds SBG2 WS GHD1 CCA UZC N5230 13 35 31.95 +13 40 31.6 6 2.22 2.18 GH GSC UZC CCA WS DC N5231 13 35 48.32 +02 59 57.1 6 0.61 2.71 WS Pds UZC GD HCds CCA N5232 13 36 08.16 -08 29 52.1 5 2.08 1.69 APMn SPC WS DWFo DWFr N5233 13 35 13.42 +34 40 36.3 4 0.49 0.90 CCA WS UZC SBG2 N5234 13 37 29.8 -49 50 15 2 0.00 0.00 ESOB WS N5235 13 36 01.47 +06 35 05.3 5 1.40 2.47 WS UZC GD CCA Pds N5236 13 37 00.34 -29 51 51.3 3 0.13 0.40 CCR TH vdH+ N5237 13 37 38.95 -42 50 51.7 3 0.96 1.76 ESOB WS HCds N5237 comp 13 37 38.05 -42 50 39.8 2 2.34 0.42 ESOL HCds N5238 13 34 42.61 +51 36 49.7 4 1.16 2.12 UZC WS CCA KCA N5238 comp 13 34 43.7 +51 36 32 2 1.96 1.41 WS KCA N5239 13 36 26.28 +07 22 08.7 5 0.78 2.13 UZC CCA GD Pds WS N5240 13 35 55.25 +35 35 16.0 5 2.34 1.01 WS UZC SBG2 CCA DC N5241 13 36 39.9 -08 24 07 2 1.05 0.00 WS SPC N5242 13 37 07 +02 46.2 1o JH N5243 13 36 15.07 +38 20 36.3 5 2.10 3.24 CCA WS UZC DC SBG2 N5244=N5219 13 38 41.8 -45 51 18 4 1.57 1.41 WS Pds2 ESOB Pds N5245 13 37 23.226 +03 53 50.60 4 2.83 1.63 GD KHJ Pds UZC N5246 13 37 29.36 +04 06 15.7 4 2.32 1.93 GD WS UZC CCA N5247 13 38 03.15 -17 53 03.8 7 2.68 1.47 WS HC2m GSC SPP HCds SPC GHD2 N5248 13 37 32.09 +08 53 08.0 11 2.26 3.12 DC GSCM GSC UZC WS HHKK HC2m CB2 CCA GH GC N5249 13 37 37.53 +15 58 18.6 4 1.08 1.01 WS DC UZC CCA N5250 13 36 07.31 +51 14 08.8 4 1.74 0.47 WS UZC CCA DC N5251 13 37 24.8 +27 25 09 5 0.73 1.82 WS UZC KOS K06 BPP N5252 13 38 15.864 +04 32 31.45 5 2.89 1.68 DC WS UZC AE CCA N5253 13 39 55.981 -31 38 25.73 5 0.45 2.96 GSC Beck THB HC2m Beck N5254 13 39 37.88 -11 29 38.6 4 2.49 2.84 SPC GHD2 SPF WS N5255 13 37 17.93 +57 06 32.3 4 0.88 1.41 HCds Pds WS UZC N5256sw 13 38 17.52 +48 16 36.1 3 1.63 1.39 WS UZC SBG2 N5256ne 13 38 17.849 +48 16 41.36 3 1.07 1.51 SDP AE DC N5257 13 39 52.97 +00 50 24.0 7 2.37 2.67 WS SPC UZC CCA GH DC ZGT N5258 13 39 57.95 +00 49 55.2 7 2.68 3.81 CCA WS SPC UZC GH DC ZGT N5259 13 39 24.653 +30 59 26.38 4 0.91 0.50 HCds KHJ BPP UZC N5259 comp 13 39 23.09 +30 59 31.7 2 0.18 1.48 HCds WS N5260 13 40 19.9 -23 51 29 3 2.10 1.53 WS Pds ESOB N5261 13 40 16.113 +05 04 34.74 4 0.17 0.85 KHJ Pds UZC GD N5262 13 35 38.321 +75 02 20.71 5 2.26 1.81 GD HCrs Pds KHJ CCA N5263 13 39 55.64 +28 23 59.3 8 0.96 2.17 WS DC BPP KOS UZC CCA Pds K06 N5264 13 41 36.80 -29 54 47.4 4 2.52 3.20 WS HC2m ESOB FT N5265 13 40 09.01 +36 51 39.4 4 0.62 1.40 SBG2 WS K09 UZC N5266 13 43 01.7 -48 10 11 2 1.42 0.71 ESOB WS N5266A 13 40 37.0 -48 20 33 2 0.71 0.71 WS ESOB N5267 13 40 40.07 +38 47 38.0 5 1.55 0.52 WS UZC SBG2 CCA DC N5268 13 42 12.59 -13 51 34.4 1 HCds N5269 13 44 44 -62 54.9 2 0.00 8.49 ESOB BSV N5270 13 42 10.88 +04 15 43.9 4 1.28 1.00 Pds WS UZC CCA N5271 13 41 42.4 +30 07 29 2 0.00 1.41 WS UZC N5272 13 42 11.29 +28 22 35.0 3 2.14 3.11 HCrs SW GSCT N5273 13 42 08.35 +35 39 13.7 5 0.85 1.80 SBG2 DC WS UZC CCA N5274 13 42 23.31 +29 50 50.9 4 0.70 1.53 HCds WS UZC BPP N5275e 13 42 23.54 +29 49 29.2 4 0.61 0.82 WS UZC HCds BPP N5275w 13 42 22.12 +29 49 32.6 2 0.18 0.64 UZC HCds N5276 13 42 22.048 +35 37 26.22 7 1.53 3.11 WS AC K09 UZC SBG2 CCA GHD1 N5277 13 42 38.4 +29 57 14 4 1.30 1.50 WS K06 UZC BPP N5278 13 41 39.73 +55 40 13.0 9 0.99 1.87 SDP HHKK GSC CCA GHD1 UZC Hu DC WS N5279 13 41 43.74 +55 40 23.2 7 0.87 1.87 GHD1 WS DC HHKK GSC CCA Hu N5280 13 42 55.580 +29 52 06.73 3 1.37 0.51 UZC KHJ BPP N5281 13 46 35 -62 55.0 1 ESOB N5282 13 43 24.900 +30 04 09.97 4 0.80 0.66 CCA KHJ UZC BPP N5283 13 41 05.696 +67 40 22.35 6 0.47 3.58 SDP CCA UZC DC EDC KHJ N5284 13 47.4 -59 08 1 HCe N5285 13 44 25.771 +02 06 36.30 4 1.42 2.23 ZGT KHJ SPC UZC N5286 13 46 26.56 -51 22 29.9 2 0.27 7.71 ESOB SW N5287 13 44 52.55 +29 46 14.4 3 0.99 1.91 WS Pds2 HCds N5288 13 48 44 -64 41.1 1 ESOB N5289 13 45 08.81 +41 30 11.9 7 2.71 2.29 GHD1 WS UZC SBG2 CCA Pds DC N5290 13 45 19.06 +41 42 47.6 6 1.47 3.87 UZC SBG2 WS GHD1 DC CCA N5291 13 47 24.31 -30 24 25.8 4 1.44 3.84 ESOB WS Pds GSC N5291 comp 13 47 23.1 -30 25 03 1 WS N5292 13 47 39.8 -30 56 25 2 3.65 2.12 ESOB WS N5293 13 46 52.73 +16 16 21.5 5 1.04 1.24 WS GH UZC CCA DC N5294 13 45 18.1 +55 17 24 4 1.07 1.83 Hu Pds UZC WS N5295 13 38 39.210 +79 27 31.08 4 1.06 1.13 Pds KHJ HCrs UZC N5296n 13 46 18.703 +43 51 04.94 4 1.39 1.97 UZC KHJ SBG2 GHD1 N5296s 13 46 18.19 +43 50 37.8 1 SBG2 N5297 13 46 23.76 +43 52 20.7 6 2.97 3.10 WS SBG2 UZC CCA GHD1 DC N5298: 13 48 36.38 -30 25 43.8 4 1.22 2.00 WS ESOB RC2 GSC N5298? 13 48 11.23 -30 27 07.7 2 1.74 0.14 GSC ESOB N5299 13 50.8 -60 24 1 HCe N5300 13 48 15.91 +03 57 02.3 6 2.44 2.36 MJC WS GH UZC DC CCA N5301 13 46 24.37 +46 06 26.0 6 1.82 2.34 SBG2 WS DC GHD1 UZC CCA N5302 13 48 49.65 -30 30 42.3 3 2.14 2.10 ESOB GSC WS N5303=N5303A 13 47 45.08 +38 18 16.9 8 2.15 1.50 DC UZC K09 CCA SBG2 WS K06 KEBA N5303B 13 47 45.5 +38 15 32 1 UZC N5304 13 50 01.6 -30 34 42 4 1.63 2.94 WS Pds GHD2 ESOB N5305 13 47 55.76 +37 49 33.3 4 0.59 0.97 SBG2 WS UZC CCA N5306 13 49 11.25 -07 13 26.5 5 0.78 1.23 IPds SPC WS GSC HKA N5307 13 51 03.18 -51 12 19.6 4 2.44 2.20 ESOB GSC UCA1 DKM2 N5308 13 47 00.37 +60 58 22.8 5 1.57 3.68 WS CCA GHD1 UZC DC N5309 13 49 55 -15 46.3 1o Sw6 N5309? 13 50 10.90 -15 37 05.4 1 HCds N5309?? 13 49 52.9 -15 41 35 1 WS N5310 13 49 47.83 +00 04 07.7 2 1.38 0.99 WS HCds N5311 13 48 55.96 +39 59 08.0 5 1.46 0.73 DC WS CCA SBG2 UZC N5312 13 49 50.530 +33 37 19.22 5 0.99 0.90 HCds UZC GSC KHJ SBG2 N5313 13 49 44.47 +39 59 05.9 7 2.72 2.40 Pds UZC WS CCA DC SBG2 GHD1 N5314 13 46 11.28 +70 20 21.5 4 0.80 1.23 Pds WS HCds UZC N5315 13 53 57.00 -66 30 50.5 2 0.26 0.35 UCA1 GSC N5316 13 53 57 -61 52.1 1 ESOB N5317=N5364 13 56 11.98 +05 00 54.7 9 1.00 3.64 GC WS GSCM UZC DC HC2m GSC CCA GH N5318m 13 50 34.66 +33 43 06.8 2 0.35 0.49 SBG2 HCo N5318n 13 50 33.93 +33 44 07.8 3 0.69 0.64 Pds2 GSC HCo N5318s 13 50 36.02 +33 42 16.3 5 1.37 2.46 WS GSC UZC SBG2 CCA N5319 13 50 40.6 +33 45 43 1 HCo N5320 13 50 20.39 +41 21 58.6 5 1.18 1.74 WS UZC CCA SBG2 HCds N5321 13 50 43.731 +33 37 57.82 5 2.04 0.51 UZC GSC KHJ SBG2 HCo N5322 13 49 15.32 +60 11 26.3 10 1.77 1.99 WS GSCM HC2m CCA HHD CFB HCds UZC DC GHD1 N5323 13 45 36.56 +76 49 39.4 5 1.74 1.36 WS CCA HCrs UZC DC N5324 13 52 05.94 -06 03 29.6 5 1.68 1.29 WS APMn SPC GSC GHD2 N5325=N5325A 13 50 54.15 +38 16 27.6 4 1.11 2.66 HCds UZC SBG2 WS N5325B 13 50 52.73 +38 14 27.0 2 0.00 0.00 HCds IPds N5326 13 50 50.73 +39 34 27.5 6 1.69 1.94 WS SBG2 DC UZC CCA GHD1 N5327 13 52 04.21 -02 12 22.9 7 3.26 2.44 ZGT WS CCA UZC SPC DC APMn N5328 13 52 53.2 -28 29 22 2 3.74 0.71 GHD2 WS N5329 13 52 10.091 +02 19 29.56 4 0.64 0.58 UZC KHJ CCA SPC N5330 13 52 59.4 -28 28 12 2 3.74 4.24 WS ESOB N5331n 13 52 16.32 +02 06 27.8 6 2.60 2.38 DC WS UZC SPC CCA ZGT N5331s 13 52 15.95 +02 06 02.0 5 3.61 1.43 ZGT DC WS CCA SPC N5332 13 52 07.80 +16 58 10.1 4 2.82 2.12 DC CCA WS UZC N5333 13 54 24.2 -48 30 45 2 1.41 2.83 WS ESOB N5334=I4338 13 52 54.41 -01 06 50.5 10 1.61 1.96 SPC MJC ZGT UZC HCds CCA GH APMn DC WS N5335 13 52 56.583 +02 48 51.16 4 1.44 0.88 UZC KHJ DC CCA N5336 13 52 09.77 +43 14 33.8 4 0.42 1.12 WS UZC SBG2 CCA N5337 13 52 23.03 +39 41 14.4 6 0.62 0.90 UZC WS SBG2 Pds DC CCA N5338 13 53 26.52 +05 12 27.0 4 2.02 1.29 DC WS CCA UZC N5339 13 54 00.26 -07 55 51.2 5 1.39 1.31 APMn KEB2 SPC WS SPF N5340 13 49 00.010 +72 39 13.30 5 0.77 0.46 IPds KHJ UZC HCds HCrs N5341 13 52 31.95 +37 48 59.4 6 3.13 1.80 DC SBG2 K06 UZC WS CCA N5342 13 51 25.85 +59 51 50.6 4 0.38 3.43 UZC CCA WS DC N5343 13 54 11.7 -07 35 18 4 0.74 2.63 WS SPC APMn Pds N5344 13 50 12.001 +73 57 10.67 4 0.55 0.63 Pds HCds KHJ UZC N5345 13 54 14.288 -01 26 12.27 8 3.12 2.59 SPC Pds UZC KHJ CCA ZGT DC APMn N5346 13 53 01.92 +39 34 50.4 5 0.93 1.37 K06 SBG2 UZC CCA WS N5347 13 53 17.962 +33 29 26.04 9 2.93 3.69 K13 UZC UW AE CCA SBG2 WS GHD1 DC N5348 13 54 11.31 +05 13 36.7 5 2.11 1.72 WS CCA UZC GH DC N5349 13 53 13.20 +37 52 57.7 5 1.02 1.45 WS UZC SBG2 CCA Pds N5350 13 53 21.73 +40 21 48.8 9 3.53 1.97 KCA WS UZC CCA SBG2 HHKK HKA DC GHD1 N5351 13 53 27.85 +37 54 51.5 7 1.63 0.63 UZC K06 GHD1 CCA SBG2 WS DC N5352 13 53 38.43 +36 08 02.3 5 1.61 1.66 WS UZC SBG2 DC CCA N5353 13 53 26.68 +40 16 58.9 7 0.74 2.09 HKA CCA WS UZC HHD SBG2 DC N5354 13 53 26.67 +40 18 08.9 5 0.72 0.45 Pds WS HKA CCA SBG2 N5355 13 53 45.63 +40 20 18.0 6 1.58 0.94 WS UZC SBG2 HKA CCA DC N5356 13 54 58.59 +05 20 00.0 5 2.91 2.50 WS UZC CCA DC GH N5357 13 55 59.49 -30 20 29.5 5 0.80 1.48 ESOB WS Pds GHD2 GSC N5358 13 54 00.42 +40 16 37.9 4 0.81 0.55 WS UZC SBG2 CCA N5359 14 00 09 -70 23.5 1 ESOB N5360=:I0958 13 55 38.55 +04 59 02.4 6 4.92 2.26 Pds UZC WS HC2m CCA GH N5361 13 54 35.23 +38 26 57.6 4 1.28 2.10 K06 UZC WS SBG2 N5362 13 54 53.45 +41 18 49.2 7 3.17 3.54 WS CCA UZC K06 SBG2 DC GHD1 N5363 13 56 07.28 +05 15 16.1 8 3.26 3.87 DC WS UZC HHKK HHD GH CCA GC N5364=N5317 13 56 11.98 +05 00 54.7 9 1.00 3.64 GC WS GSCM UZC DC HC2m GSC CCA GH N5365 13 57 50.7 -43 55 52 2 3.07 5.66 WS ESOB N5365A 13 56 39.6 -44 00 31 2 2.30 6.36 WS ESOB N5365B 13 58 39.5 -43 57 51 2 0.00 1.41 Pds WS N5366 13 56 24.9 -00 14 52 4 0.75 2.89 ZGT UZC WS SPC N5367=I4347 13 57 43.91 -39 58 44.0 2 0.73 2.47 ESOB HCds N5367=I4347 sw * 13 57 44.04 -39 58 45.8 2 1.39 2.05 2MSX 2MSX N5367=I4347 nw comp 13 57 25.91 -39 56 08.0 2 2.53 1.56 ESOB HCds N5367=I4347 se comp 13 57 55.85 -40 04 19.3 1 HCds N5367=I4347 n comp 13 57 44.36 -39 56 47.5 1 HCds N5368 13 54 29.30 +54 19 50.5 5 1.63 2.11 WS UZC CCA GHD1 DC N5369 13 56 37.6 -05 28 13 2 1.06 1.41 SPC WS N5370 13 54 09.24 +60 40 40.8 4 1.04 0.79 WS DC CCA UZC N5371=:N5390 13 55 40.09 +40 27 41.6 5 1.94 0.66 UZC CCA WS HCds SBG2 N5372 13 54 46.08 +58 39 59.2 4 1.89 0.89 WS UZC CCA DC N5373 13 57 07.456 +05 15 06.02 4 1.41 0.61 GD KHJ Pds UZC N5374 13 57 29.63 +06 05 49.5 6 3.00 2.07 GH WS Pds UZC CCA DC N5375=N5396 13 56 56.05 +29 09 50.0 5 1.75 1.31 WS BPP UZC CCA DC N5376 13 55 15.93 +59 30 24.7 4 0.95 2.63 WS CCA UZC GHD1 N5377 13 56 16.72 +47 14 06.8 4 0.58 1.37 WS UZC SBG2 CCA N5378 13 56 50.99 +37 47 48.9 5 1.05 1.18 WS HCds UZC SBG2 CCA N5379 13 55 34.49 +59 44 34.7 5 1.46 1.51 CCA WS UZC GHD1 DC N5380 13 56 56.75 +37 36 35.6 5 0.62 1.71 DC WS UZC SBG2 CCA N5381 14 00 41 -59 35.2 1 ESOB N5382 13 58 14.99 +06 15 28.6 4 2.53 2.37 WS UZC CCA DC N5383 13 57 04.91 +41 50 45.6 9 1.67 2.09 SBG2 vdK3 CCA WS K06 UZC GSC vdH+ DC N5384 13 58 12.91 +06 31 04.8 5 1.68 1.49 WS UZC KEBA CCA DC N5385 13 52 31 +76 09.8 1 HCe N5385? 13 52 36.0 +76 09 29 1 WS N5386 13 58 22.27 +06 20 18.7 4 1.34 2.13 WS DC UZC CCA N5387 13 58 24.79 +06 04 14.1 3 0.82 2.58 WS CCA UZC N5388 13 58 57 -14 09.1 1o Mu1 N5389 13 56 06.57 +59 44 29.3 4 1.63 1.46 WS UZC CCA GHD1 N5390:=N5371 13 55 40.09 +40 27 41.6 5 1.94 0.66 UZC CCA WS HCds SBG2 N5391 13 57 37 +46 19.5 1o Sw1 N5392 13 59 24.9 -03 12 32 2 0.00 1.41 SPC WS N5393 14 00 31.96 -28 52 29.7 2 0.28 1.91 HCds WS N5394 13 58 33.73 +37 27 13.0 9 1.31 2.09 HHKK Pds WS UZC GSC CCA DC GHD1 SBG2 N5395 13 58 38.12 +37 25 29.5 6 2.47 2.07 WS K13 CCA GHD1 DC SBG2 N5396=N5375 13 56 56.05 +29 09 50.0 5 1.75 1.31 WS BPP UZC CCA DC N5397 14 01 10.4 -33 56 43 3 3.30 2.65 ESOB WS Pds N5398 14 01 21.7 -33 03 46 3 3.17 1.53 ESOB WS GHD2 N5399 13 59 31.45 +34 46 23.5 4 1.83 1.41 WS UZC CCA SBG2 N5400 14 00 37.2 -02 51 28 4 0.00 1.26 UZC SPC WS APMn N5401 13 59 43.47 +36 14 15.9 4 1.15 1.09 UZC CCA SBG2 WS N5402 13 58 16.59 +59 48 51.4 5 1.02 2.69 WS UZC Pds CCA HCds N5403 13 59 50.95 +38 10 56.4 9 1.12 1.70 UZC HC2m HC2m HC2m HCds WS CCA SBG2 GHD1 N5403 comp 13 59 57.08 +38 12 03.5 5 0.18 0.48 HCds HC2m HC2m HC2m UZC N5404 14 01 07.56 +00 05 08.4 2 1.80 1.06 HCds WS N5404 n* 14 01 07.55 +00 05 19.0 1 HCds N5404 s* 14 01 07.40 +00 04 56.5 1 HCds N5405 14 01 09.44 +07 42 05.2 4 1.17 2.39 DC UZC WS CCA N5406 14 00 20.26 +38 54 54.0 6 2.26 1.43 WS UZC SBG2 CCA GHD1 DC N5407 14 00 50.156 +39 09 21.74 5 1.76 0.50 SBG2 KHJ UZC CCA DC N5408 14 03 21.04 -41 22 43.9 2 0.80 0.35 GSC WS N5408A 14 03 18.21 -41 23 11.9 1 GSC N5409 14 01 46.08 +09 29 24.2 6 0.80 1.10 WS Pds BCG UZC DC CCA N5410 14 00 54.56 +40 59 16.4 5 0.68 2.93 SBG2 DC WS CCA UZC N5411 14 01 59.07 +08 56 14.7 4 3.03 0.82 BCG UZC GD CCA N5412 13 57 13.447 +73 36 59.21 5 1.11 1.54 Pds HCds UZC KHJ CCA N5413 13 57 53.771 +64 54 39.34 4 2.91 0.83 UZC KHJ CCA DC N5414 14 02 03.52 +09 55 44.7 6 1.05 1.59 KET2 DC WS UZC CCA BCG N5415 13 56 56.906 +70 45 15.60 4 0.23 0.16 Pds KHJ UZC HCds N5416 14 02 11.42 +09 26 22.2 5 0.65 2.01 DC WS UZC CCA BCG N5417 14 02 13.08 +08 02 12.3 4 0.71 2.46 WS UZC CCA DC N5418 14 02 17.55 +07 41 00.7 4 1.15 1.25 WS DC UZC CCA N5419 14 03 38.62 -33 58 42.4 4 1.14 1.22 ESOB RC2 WS EWSr N5420 14 04 00.04 -14 37 03.0 4 3.79 2.39 WS SPF SPC APMn N5421 14 01 41.40 +33 49 35.9 6 0.80 2.11 HCds WS KET1 UZC CCA DC N5421 comp 14 01 42.08 +33 49 17.5 3 1.24 1.00 HCds WS DC N5422 14 00 42.01 +55 09 51.8 5 1.20 3.26 WS GHD1 UZC DC CCA N5423 14 02 48.808 +09 20 29.36 5 3.09 1.14 KHJ GSC CCA DC GD N5424 14 02 55.81 +09 25 14.0 6 3.50 0.50 BCG WS UZC GSC CCA DC N5425 14 00 48.03 +48 26 35.2 5 3.45 2.22 UZC WS CCA SBG2 DC N5426 14 03 25.00 -06 04 09.7 4 1.10 0.83 WS GHD2 SPC HCds N5427 14 03 26.02 -06 01 51.6 5 1.30 1.22 GHD2 WS HHKK SPC HCds N5428 14 03 28.03 -05 59 04.1 1 HCds N5429 14 03 33.36 -06 02 17.8 1 HCds N5430 14 00 45.66 +59 19 43.4 9 2.23 2.60 vdH+ DC WS GHD1 KET2 UZC CCR CCA CCO N5431 14 03 07.11 +09 21 45.7 5 1.05 1.03 GD BCG UZC GSC WS N5432 14 03 40.55 -05 58 30.7 2 2.01 1.27 WS HCds N5433 14 02 36.11 +32 30 35.3 8 0.75 1.41 K13 STMW SBG2 DC WS Pds UZC CCA N5434=N5434A 14 03 23.14 +09 26 52.1 7 1.46 2.37 DC GSC WS Pds UZC CCA BCG N5434B 14 03 27.12 +09 28 01.7 4 0.55 0.50 GSC BCG UZC CCA N5435 14 04 00.14 -05 55 52.5 2 2.01 2.05 HCds WS N5436 14 03 41.08 +09 34 23.8 6 1.72 0.85 GD UZC WS GSC BCG CCA N5437=I4365 14 03 47.31 +09 31 24.3 6 1.74 1.68 GD WS GSC BCG Pds UZC N5438=N5446 14 03 47.977 +09 36 37.61 5 0.70 0.49 GD UZC KHJ GSC BCG N5439 14 01 57.66 +46 18 41.5 5 1.19 2.12 WS UZC CCA SBG2 HCds N5440 14 03 00.92 +34 45 26.0 6 2.62 3.40 WS DC CCA UZC HCds SBG2 N5441 14 03 11.94 +34 41 03.5 2 1.04 2.33 WS HCds N5442 14 04 43.3 -09 42 47 2 0.00 0.00 SPC WS N5443 14 02 11.68 +55 48 51.6 4 1.20 3.48 WS UZC CCA DC N5444 14 03 24.16 +35 07 54.7 5 0.32 1.10 WWD UZC WS SBG2 CCA N5445 14 03 31.47 +35 01 29.8 5 1.70 2.08 WS DC UZC SBG2 CCA N5446=N5438 14 03 47.977 +09 36 37.61 5 0.70 0.49 GD UZC KHJ GSC BCG N5447 14 02 28.10 +54 16 33.4 2 1.66 1.91 HCo HCds N5448 14 02 50.16 +49 10 21.3 6 2.69 1.96 SBG2 UZC GHD1 CCA WS DC N5449 14 02 27.7 +54 19 49 2 5.53 1.41 HCo WS N5450 14 02 29.39 +54 16 17.0 4 2.91 2.75 WS HCo GSC HCds N5450? 14 02 31.1 +54 14 01 1 WS N5451 14 02 36.8 +54 21 45 2 3.69 0.71 WS HCo N5452 13 54 24.83 +78 13 13.5 5 1.43 2.22 WS CCA HCrs UZC DC N5453 14 02 56.61 +54 18 27.3 2 2.77 2.05 GSC HCo N5454 14 04 45.64 +14 22 55.5 5 3.62 2.87 DC WS UZC CCA Pds N5455 14 03 00.90 +54 14 29.5 2 3.39 3.61 HCo GSC N5456 14 04 58.88 +11 52 15.1 4 1.32 2.60 WS DC UZC CCA N5457 14 03 12.50 +54 20 56.1 7 1.09 2.98 WS TH UZC GSC CCA HC2m DC N5458 14 03 12.24 +54 17 54.7 2 2.28 0.42 HCo GSC N5459 14 05 00.222 +13 07 56.05 4 0.66 2.99 UZC KHJ CCA DC N5460 14 07 27 -48 20.6 1 ESOB N5461 14 03 40.99 +54 19 00.8 3 3.92 2.86 HCo GSC WS N5462 14 03 53.07 +54 21 55.5 3 1.06 3.86 GSC WS HCo N5463=N5463A 14 06 10.56 +09 21 11.5 7 1.10 1.88 HCds UZC GSC CCA WS BCG DC N5463B 14 06 12.49 +09 21 41.0 3 0.53 0.74 HCds BCG GSC N5464 14 07 04.2 -30 01 03 2 1.84 0.00 WS GHD2 N5465 14 06 27.31 -05 30 24.1 2 0.63 2.05 HCds WS N5466 14 05 27.64 +28 31 56.5 2 5.21 10.89 SW HCrs N5467=I0973 14 06 29.37 -05 28 54.4 2 2.85 1.48 WS HCds N5468 14 06 34.87 -05 27 10.0 7 3.25 2.81 GHD2 SPC GSC APMn WS HCds MJC N5469? 14 12 29.89 +08 38 54.6 1 HCds N5469?? 14 06 24.19 +09 26 11.0 2 0.84 1.98 HCds WS N5470 14 06 31.89 +06 01 44.7 4 1.62 1.32 DC WS UZC CCA N5471 14 04 29.00 +54 23 48.5 2 0.74 0.21 WS GSC N5472 14 06 55.00 -05 27 39.5 5 0.86 0.95 WS GSC APMn SPC HCds N5473 14 04 43.34 +54 53 32.7 5 1.39 0.85 GHD1 UZC CCA WS DC N5474 14 05 01.60 +53 39 44.8 7 2.72 1.04 GSCM WS HCds CCA UZC GHD1 DC N5475 14 05 12.41 +55 44 31.7 5 1.24 2.21 WS UZC CCA GHD1 DC N5476 14 08 08.4 -06 05 32 3 1.49 2.89 WS APMn SPC N5477 14 05 33.0 +54 27 38 6 1.19 2.73 Pds UZC WS DC FT K03 N5478 14 08 08.51 -01 42 09.1 4 0.73 0.58 SPC CCA UZC WS N5479 14 05 57.344 +65 41 26.07 4 0.50 0.63 Pds KHJ GSC UZC N5480 14 06 21.53 +50 43 29.8 7 1.51 4.36 DC GHD1 WS UZC HHKK Pds CCA N5481 14 06 41.21 +50 43 21.2 4 1.53 2.75 GHD1 WS UZC CCA N5482 14 08 30.76 +08 55 53.7 6 1.15 2.27 UZC GSC HCds WS CCA DC N5483 14 10 25.2 -43 19 31 2 0.77 0.71 WS ESOB N5484 14 06 48.159 +55 01 47.49 1 KHJ N5485 14 07 11.38 +55 00 05.5 4 0.71 2.19 UZC WS CCA DC N5486 14 07 24.94 +55 06 10.0 3 0.49 1.00 WS UZC CCA N5487 14 09 44.0 +08 04 09 3 2.57 2.65 WS UZC GD N5488=I4375 14 08 03.00 -33 18 52.7 3 1.05 1.76 WS HCds GSC N5489 14 12 00.9 -46 05 21 2 2.22 0.71 WS ESOB N5490=N5490A 14 09 57.30 +17 32 43.4 6 1.91 1.28 GH WS UZC DC HCds CCA N5490B 14 10 03.79 +17 33 07.5 1 HCds N5490C 14 10 06.80 +17 36 54.9 4 3.18 2.45 GH WS HCds UZC N5491=N5491A 14 10 57.40 +06 21 52.9 4 0.15 1.68 WS UZC DC CCA N5491B 14 10 57.741 +06 22 18.06 1 KHJ N5492 14 10 35.30 +19 36 41.8 4 1.37 2.15 WS UZC CCA DC N5493 14 11 29.4 -05 02 39 4 0.86 2.89 SPC WS GHD2 APMn N5494 14 12 24.13 -30 38 38.7 2 1.10 0.64 ESOB HC2m N5495 14 12 23.3 -27 06 28 2 2.84 1.41 ESOB WS N5496 14 11 37.84 -01 09 29.2 8 1.30 1.92 DC APMn GH WS CCA SPC UZC GSC N5497 14 10 31.57 +38 53 36.1 6 0.81 0.77 K06 WS SBG2 UZC GSC CCA N5497 comp 14 10 31.4 +38 53 52 1 HCo N5498 14 11 04.47 +25 41 51.5 4 1.28 1.43 WS HCds CCA UZC N5499 14 10 47.65 +35 54 48.1 5 1.64 1.93 DC CCA WS UZC SBG2 N5500 14 10 15.355 +48 32 46.51 5 1.73 1.77 KHJ UZC CCA SBG2 DC N5501 14 12 20.2 +01 16 19 3 0.87 0.58 WS UZC SPC N5502=N5503 14 09 33.878 +60 24 33.58 3 0.68 1.19 Pds2 GSC KHJ N5503=N5502 14 09 33.878 +60 24 33.58 3 0.68 1.19 Pds2 GSC KHJ N5504=N5504A 14 12 15.79 +15 50 30.8 7 0.93 2.36 WS K06 DC UZC K15 GSC CCA N5504B=I4383 14 12 12.72 +15 52 08.4 1 GSC N5504C 14 12 15.70 +15 52 46.3 3 3.79 2.05 K15 CCA WS N5505 14 12 31.75 +13 18 16.6 6 1.55 1.02 WS K15 K06 UZC DC CCA N5506 14 13 14.840 -03 12 27.21 14 1.79 0.91 GHD2 APMn KEB2 UZC WS UWS EDC HHD UWS HHKK CCR CCO vdH+ SPC N5507 14 13 19.733 -03 08 56.28 5 2.61 0.83 APMn GHD2 UZC KHJ SPC N5508 14 12 29.10 +24 38 06.8 5 1.69 1.31 WS CCA UZC Pds HCds N5509 14 12 39.71 +20 23 13.8 2 1.99 2.26 GSC HCrs N5510 14 13 37.283 -17 59 02.79 5 2.16 2.32 WS APMn KHJ SPC ESOB N5511:=N5511B 14 13 05.41 +08 37 56.1 2 0.73 1.34 UZC HCds N5511A 14 13 08.29 +08 37 07.7 4 0.30 2.04 WS Pds UZC HCds N5512 14 12 41.143 +30 51 18.75 3 0.64 0.84 BPP KHJ UZC N5513 14 13 08.80 +20 24 57.3 4 0.74 2.50 UZC CCA WS DC N5514 14 13 38.8 +07 39 33 3 0.86 2.52 WS DC UZC N5514A 14 13 39.4 +07 39 24 2 0.00 1.41 DC WS N5515 14 12 38.09 +39 18 34.5 6 1.45 1.72 DC K06 WS UZC CCA SBG2 N5516 14 15 54.7 -48 06 55 3 1.16 1.53 WS ESOB Pds N5517 14 12 51.34 +35 42 38.2 4 0.07 1.16 WS UZC CCA SBG2 N5518 14 13 47.737 +20 50 54.14 4 1.02 1.78 UZC KHJ Pds HCds N5519=?N5570 14 14 20.91 +07 30 55.6 5 1.08 2.30 Pds WS UZC CCA HCds N5520 14 12 22.76 +50 20 54.1 5 2.55 2.12 DC WS CCA UZC VPS N5521 14 15 23.76 +04 24 30.1 5 2.14 1.61 DC WS UZC CCA KEBA N5522 14 14 50.23 +15 08 47.5 4 2.05 1.42 DC WS UZC CCA N5523 14 14 51.5 +25 19 02 3 2.07 1.00 WS UZC DC N5524: 14 13 48.8 +36 22 51 1 HCds N5524: ne * 14 13 48.97 +36 22 53.6 1 HCds N5524: sw * 14 13 48.25 +36 22 45.8 1 HCds N5524? 14 13 25.94 +36 27 51.7 1 HCds N5525 14 15 39.20 +14 16 57.2 4 2.58 3.29 DC WS UZC CCA N5526 14 13 53.41 +57 46 18.6 6 1.23 1.06 WS Pds UZC GSC CCA DC N5527 14 14 27.25 +36 24 15.6 5 0.86 1.65 WS K13 UZC SBG2 HCds N5528 14 16 19.7 +08 17 34 4 3.53 1.83 GD WS UZC Pds N5529 14 15 34.19 +36 13 34.1 8 3.60 3.43 K13 WS DC UZC CCA HCds SBG2 GHD1 N5530 14 18 27.1 -43 23 16 2 0.77 2.83 WS ESOB N5531 14 16 43.4 +10 53 05 3 2.25 0.58 WS UZC GD N5532=N5532A 14 16 52.88 +10 48 25.7 8 2.26 1.38 RC2 DC WS Pds PCR UZC UZC CCA N5532B 14 16 53.45 +10 47 54.2 1 PCR N5533 14 16 07.54 +35 20 37.6 6 2.86 2.49 GHD1 WS DC SBG2 UZC CCA N5534 14 17 40.26 -07 25 01.8 5 3.41 2.95 GHD2 WS HCds KEB2 SPC N5535 14 17 31.13 +08 12 26.9 2 0.73 2.97 WS HCds N5536 14 16 23.84 +39 30 07.6 7 1.40 1.40 WS UZC GSC CCA SBG2 KEBA DC N5537 14 17 36.9 +07 03 14 3 2.27 1.15 GD WS UZC N5538 14 17 42.4 +07 28 33 3 0.86 2.00 WS Pds UZC N5539 14 17 37.74 +08 10 43.9 3 0.90 3.30 HCds WS UZC N5539 nw comp 14 17 35.38 +08 10 50.5 1 HCds N5539 sw comp 14 17 36.08 +08 10 11.7 1 HCds N5539 w comp 14 17 36.04 +08 10 44.5 1 HCds N5540 14 14 54.33 +60 00 39.1 4 0.69 1.47 WS Pds GSC UZC N5541 14 16 31.81 +39 35 20.4 5 0.98 1.57 CCA GSC SBG2 UZC DC N5541ne 14 16 32.1 +39 35 28 1 WS N5541sw 14 16 31.8 +39 35 15 1 WS N5542 14 17 53.2 +07 33 30 3 0.00 2.00 WS UZC KEBA N5543 14 18 04.0 +07 39 14 4 3.29 1.71 GD WS Pds UZC N5544 14 17 02.58 +36 34 17.4 5 1.99 3.34 WS DC UZC CCA GHD1 N5544+N5545 14 17 04.81 +36 34 28.3 1 SBG2 N5545 14 17 05.20 +36 34 30.8 6 3.10 3.20 WS K13 CCA UZC DC GHD1 N5546 14 18 09.18 +07 33 49.0 4 1.42 2.50 DC WS UZC CCA N5547 14 09 44.888 +78 36 03.40 7 1.84 1.92 DC CCA HCrs GSC UZC KHJ GD N5548 14 17 59.585 +25 08 11.96 11 2.26 1.60 GH WS vdH+ WU1 EDC vdK1 K02 WW CCA UZC DC N5549 14 18 38.77 +07 22 35.9 5 1.45 1.48 DC WS UZC Pds CCA N5550 14 18 28.00 +12 52 58.4 4 1.44 1.30 UZC WS DC CCA N5551 14 18 54.8 +05 27 03 4 0.86 2.65 WS GD Pds UZC N5552=N5558 14 19 03.90 +07 01 53.0 5 1.64 1.47 GD GSC Pds WS UZC N5553 14 18 29.70 +26 17 14.4 4 1.73 2.09 WS UZC BPP CCA N5554=N5564 14 19 15.00 +07 01 14.4 4 1.86 1.40 GD GSC WS UZC N5555 14 18 48.07 -19 08 21.7 4 3.07 1.62 ESOB WS GSC SPC N5556 14 20 34.09 -29 14 31.2 3 1.89 0.81 ESOB WS GSC N5557 14 18 25.78 +36 29 36.6 6 2.65 1.43 WS GHD1 UZC CCA SBG2 DC N5558=N5552 14 19 03.90 +07 01 53.0 5 1.64 1.47 GD GSC Pds WS UZC N5559 14 19 12.67 +24 47 54.9 4 2.04 1.10 WS CCA UZC HCds N5560 14 20 04.58 +03 59 32.3 6 2.25 1.32 WS UZC HC2m CCA GH DC N5561 14 17 22.80 +58 45 01.8 2 0.22 0.14 UZC HCds N5562 14 20 11.095 +10 15 46.32 4 0.38 0.87 KHJ UZC HCds CCA N5563 14 20 13.07 +07 03 18.8 4 1.98 1.08 GD UZC GSC WS N5564=N5554 14 19 15.00 +07 01 14.4 4 1.86 1.40 GD GSC WS UZC N5565? 14 19 18.56 +06 59 42.3 1 GSC N5566 14 20 19.99 +03 56 00.0 7 0.95 2.05 GSCM HC2m WS UZC CCA GSC GH N5567 14 19 17.619 +35 08 16.73 5 0.73 0.32 HCds UZC GSC KHJ SBG2 N5568 14 19 21.30 +35 05 31.5 4 1.42 1.07 HCds GSC SBG2 WS N5569 14 20 32.22 +03 58 57.8 5 1.63 1.14 GH CCA WS UZC Pds N5570?=N5519 14 14 20.91 +07 30 55.6 5 1.08 2.30 Pds WS UZC CCA HCds N5571 14 19 32.5 +35 09 01 2 8.65 2.83 HCds WS N5572 14 19 35.37 +36 08 25.5 5 0.60 0.60 WS UZC GSC CCA SBG2 N5573 14 20 41.555 +06 54 25.60 5 1.10 1.38 GD KHJ GSC UZC Pds N5574 14 20 56.12 +03 14 16.7 5 2.17 2.78 WS CCA GH UZC DC N5575=N5578 14 20 59.50 +06 12 09.2 5 0.89 1.50 GSC UZC WS DC CCA N5576 14 21 03.81 +03 16 14.5 5 2.84 0.72 CCA WS GH UZC DC N5577 14 21 13.23 +03 26 09.6 5 0.67 1.47 WS UZC GH CCA DC N5578=N5575 14 20 59.50 +06 12 09.2 5 0.89 1.50 GSC UZC WS DC CCA N5579 14 20 26.50 +35 11 18.5 5 1.19 0.79 WS SBG2 UZC GSC CCA N5580:=N5590 14 21 38.34 +35 12 17.3 6 2.69 1.16 DC WS GSC UZC CCA SBG2 N5581 14 21 16.31 +23 28 46.7 4 0.86 1.54 WS Pds UZC HCds N5582 14 20 43.25 +39 41 36.3 5 1.55 1.30 SBG2 WS UZC CCA DC N5583 14 21 40.56 +13 13 55.1 4 1.22 1.31 WS UZC CCA HCds N5584 14 22 23.71 -00 23 15.1 6 2.16 3.73 GH UZC SPC WS CCA DC N5585 14 19 48.01 +56 43 45.4 9 2.07 2.07 WS GHD1 UZC GSC HCds K03 HC2m CCA DC N5586 14 22 07 +13 11.1 1o Sw3 N5587 14 22 10.91 +13 55 03.5 5 1.61 2.59 CCA WS UZC HCds DC N5588:=N5589 14 21 25.04 +35 16 13.8 6 2.51 1.76 DC WS GSC CCA SBG2 UZC N5589=:N5588 14 21 25.04 +35 16 13.8 6 2.51 1.76 DC WS GSC CCA SBG2 UZC N5590=:N5580 14 21 38.34 +35 12 17.3 6 2.69 1.16 DC WS GSC UZC CCA SBG2 N5591 14 22 34.2 +13 43 02 2 3.09 0.00 K15 KET2 N5591e 14 22 34.90 +13 43 00.9 2 1.03 1.91 HCds WS N5591w 14 22 33.39 +13 43 00.2 4 0.80 1.20 CCA WS HCds UZC N5592 14 23 54.9 -28 41 17 3 3.34 2.08 WS ESOB GHD2 N5593 14 25 39 -54 47.9 1 ESOB N5594=I4412 14 23 10.282 +26 15 56.33 4 1.08 0.75 Pds UZC KHJ HCds N5595 14 24 13.3 -16 43 22 3 0.00 1.15 APMn SPC WS N5596 14 22 28.740 +37 07 19.55 6 1.04 0.77 DC KHJ SBG2 UZC K01 CCA N5597 14 24 27.5 -16 45 47 4 1.81 4.27 WS APMn SPC GHD2 N5598 14 22 28.33 +40 19 11.7 5 1.00 2.36 DC SBG2 UZC WS CCA N5599 14 23 50.68 +06 34 32.6 4 1.25 2.11 WS UZC HCds CCA N5600 14 23 49.44 +14 38 19.1 7 1.79 2.65 GH WS KEBA CCA K15 UZC DC N5601 14 22 53.294 +40 18 34.81 3 0.54 1.02 SBG2 KHJ Pds N5602 14 22 18.70 +50 30 06.6 4 3.01 2.58 WS DC CCA UZC N5603=N5603A 14 23 01.63 +40 22 38.8 6 1.31 1.16 SBG2 CCA HCds WS UZC DC N5603B 14 22 56.59 +40 25 01.5 2 0.40 0.85 HCds CCA N5604 14 24 42.8 -03 12 45 4 0.75 2.63 UZC WS SPC APMn N5605 14 25 07.54 -13 09 49.6 5 0.63 2.44 WS SPF GHD2 SPC APMn N5606 14 27 47 -59 37.9 1 ESOB N5607=I1005 14 19 26.83 +71 35 16.1 3 0.52 1.75 WS UZC CCA N5608 14 23 17.73 +41 46 31.9 5 1.05 2.38 WS UZC DC CCA SBG2 N5609 14 23 48.22 +34 50 34.8 1 HCds N5610 14 24 22.97 +24 36 50.4 4 0.95 0.82 CCA WS UZC DC N5611 14 24 04.89 +33 02 51.2 5 2.68 2.66 WS UZC SBG2 CCA DC N5612 14 34 01.8 -78 23 18 2 1.30 0.71 WS ESOB N5613 14 24 05.979 +34 53 32.03 4 0.81 2.07 HCds KHJ GHD1 CCA N5614 14 24 07.57 +34 51 32.6 6 1.66 1.34 WS HCds SBG2 GHD1 UZC CCA N5615 14 24 06.41 +34 51 53.8 2 0.86 1.20 HCds WS N5616 14 24 20.66 +36 27 39.7 4 1.10 2.04 WS SBG2 UZC CCA N5617 14 29 44 -60 42.7 1 ESOB N5618 14 27 11.83 -02 15 47.1 4 0.71 1.01 WS CCA UZC SPC N5619=N5619A 14 27 18.16 +04 48 08.9 4 2.69 0.48 DC UZC WS CCA N5619B=I1016=I4424 14 27 32.4 +04 49 15 3 0.86 1.00 WS Pds UZC N5619C 14 27 29.6 +04 46 46 1 UZC N5620 14 22 40.2 +69 35 40 4 1.34 0.82 GD Pds UZC WS N5621 14 27 49.8 +08 14 29 3 4.53 4.04 GD HCo WS N5622 14 26 12.19 +48 33 49.4 6 1.76 1.66 WS SBG2 Pds UZC CCA DC N5623 14 27 08.71 +33 15 09.2 6 0.92 1.65 DC Pds UZC WS SBG2 CCA N5624 14 26 35.41 +51 35 06.2 4 0.27 3.29 CCA GSC WS UZC N5625 14 27 01.96 +39 57 25.9 2 6.16 1.06 SBG2 UZC N5625e 14 27 02.4 +39 57 24 1 WS N5625w 14 27 00.5 +39 57 20 1 WS N5626 14 29 48.8 -29 44 57 2 2.77 2.83 ESOB WS N5627 14 28 34.25 +11 22 41.2 5 1.99 0.83 GD WS Pds UZC CCA N5628 14 28 25.823 +17 55 28.30 4 1.17 1.66 CCA KHJ UZC DC N5629 14 28 16.31 +25 50 55.0 5 2.25 0.52 WS Pds UZC CCA DC N5630 14 27 36.63 +41 15 26.8 4 0.98 1.00 WS CCA UZC SBG2 N5631 14 26 33.26 +56 34 57.2 5 0.59 1.93 UZC CCA GHD1 WS DC N5632 14 29 19.63 -00 26 51.4 1 HCds N5633 14 27 28.68 +46 08 48.0 6 2.96 3.09 CCA UZC WS SBG2 DC GHD1 N5634 14 29 37.30 -05 58 37.4 2 0.32 3.18 SW HCrs N5635 14 28 31.67 +27 24 31.8 6 2.49 1.05 BPP WS UZC JCR DC CCA N5636 14 29 39.06 +03 15 57.9 4 0.71 0.48 UZC CCA GH WS N5637 14 28 59.59 +23 11 27.8 4 1.61 2.39 WS K02 UZC CCA N5638 14 29 40.43 +03 13 59.8 5 0.60 2.30 WS GH UZC DC CCA N5639=N5639A 14 28 46.49 +30 24 44.9 5 2.13 1.19 BPP WS GSC CCA UZC N5639B 14 28 57.2 +30 24 23 1 HCo N5640 14 20 40.906 +80 07 20.52 8 1.60 2.76 HCrs KHJ Pds GVW GSC DDB UZC GD N5641 14 29 16.69 +28 49 17.7 6 1.54 1.63 WS BPP GHD1 CCA UZC DC N5642 14 29 13.54 +30 01 34.8 5 2.13 1.04 UZC WS BPP CCA DC N5643 14 32 41.2 -44 10 26 3 4.36 2.89 WS ESOB GC N5644 14 30 25.67 +11 55 39.8 5 2.24 0.93 WS GSC UZC CCA DC N5645 14 30 39.36 +07 16 30.3 6 3.69 3.37 GH WS DC UZC K14 CCA N5646 14 29 34.05 +35 27 41.6 4 2.21 1.17 WS UZC CCA SBG2 N5647 14 30 36.114 +11 52 36.00 6 0.73 2.23 Pds UZC KHJ GSC GD CCA N5648=N5649 14 30 32.53 +14 01 23.5 5 2.39 3.73 DC GSC WS UZC CCA N5649=N5648 14 30 32.53 +14 01 23.5 5 2.39 3.73 DC GSC WS CCA UZC N5650=N5652 14 31 01.05 +05 58 41.3 5 1.67 1.19 WS DC GSC UZC CCA N5651 14 31 12.86 -00 19 20.4 1 HCds N5652=N5650 14 31 01.05 +05 58 41.3 5 1.67 1.19 WS DC GSC UZC CCA N5653=I1026 14 30 10.39 +31 12 54.0 7 1.71 1.80 BPP WS DC Pds UZC GHD1 CCA N5654 14 30 01.41 +36 21 34.5 6 3.62 0.75 DC Pds WS UZC CCA SBG2 N5655 14 30 50.81 +13 58 07.8 6 3.18 2.23 GD DC K15 GSC WS UZC N5656 14 30 25.37 +35 19 14.7 5 2.35 2.27 DC CCA WS UZC SBG2 N5657 14 30 43.62 +29 10 48.9 7 0.93 2.24 BPP WS UZC KET2 GSC DC CCA N5658 14 31 55.27 -00 22 01.1 1 HCds N5659 14 31 06.16 +25 21 17.9 5 1.44 1.55 WS Pds UZC HCds CCA N5660 14 29 49.82 +49 37 22.1 4 1.48 2.81 CCA GHD1 UZC SBG2 N5661 14 31 57.47 +06 15 01.6 4 1.92 2.20 WS UZC CCA DC N5662 14 35 37 -56 37.1 1 ESOB N5663 14 33 56.282 -16 34 51.82 3 1.46 0.50 WS KHJ SPC N5664=I4455 14 33 43.61 -14 37 10.5 3 0.92 1.52 HCds SPC WS N5664=I4455 comp 14 33 43.63 -14 36 47.1 1 HCds N5665 14 32 25.69 +08 04 46.0 6 2.32 2.21 WS K14 GH UZC HCds CCA N5665A 14 32 27.27 +08 04 43.2 1 HCds N5666 14 33 09.26 +10 30 37.4 4 1.21 1.01 UZC WS CCA DC N5667 14 30 22.95 +59 28 12.2 5 2.53 1.88 WS CCA Pds UZC DC N5668 14 33 24.28 +04 27 01.1 4 0.99 1.30 WS UZC GH CCA N5669 14 32 43.84 +09 53 28.8 9 2.75 3.04 GH DC WS UZC HC2m CCA GSC K14 MJC N5670 14 35 36.4 -45 57 58 3 2.63 3.00 WS Pds ESOB N5671 14 27 42.13 +69 41 37.8 5 0.69 1.01 Pds UZC CCA DC WS N5672=I1030 14 32 38.44 +31 40 12.3 7 1.50 1.49 GHD1 BPP GSC UZC WS DC CCA N5673 14 31 30.88 +49 57 30.5 5 1.72 2.46 WS CCA UZC DC SBG2 N5674 14 33 52.22 +05 27 30.9 4 1.88 2.83 DC WS UZC CCA N5675 14 32 39.82 +36 18 08.2 7 1.35 1.74 WS DC SBG2 JCR UZC GSC CCA N5676 14 32 46.93 +49 27 27.9 5 1.51 1.50 UZC DC K11 SBG2 CCA N5677 14 34 12.79 +25 28 04.1 5 3.27 0.87 WS HCds UZC CCA K02 N5678 14 32 05.73 +57 55 18.0 3 1.62 2.47 WS UZC CCA N5679 nw* 14 35 06.07 +05 21 41.2 3 2.32 0.90 HCo HCds SPC N5679 se* 14 35 06.43 +05 21 37.5 1 HCds N5679e 14 35 10.96 +05 21 15.0 2 1.27 0.78 SPC HCds N5679m 14 35 08.70 +05 21 32.1 5 1.90 2.05 DC WS SPC HCds CCA N5679w 14 35 06.38 +05 21 23.4 4 0.94 2.12 HCo WS UZC HCds N5680 14 35 44.55 -00 00 48.9 5 0.88 1.24 GSC UZC HCds SPC WS N5681 14 35 42.97 +08 18 01.3 5 2.33 2.00 HCds UZC CCA WS DC N5681 comp 14 35 40.14 +08 17 54.8 1 HCds N5682 14 34 45.07 +48 40 13.5 6 0.62 2.64 SBG2 K11 UZC CCA WS GHD1 N5683 14 34 52.538 +48 39 44.12 7 0.98 2.37 KHJ EDC UZC K11 SBG2 SDP GHD1 N5684 14 35 50.06 +36 32 34.4 6 1.79 0.85 DC WS GSC UZC SBG2 CCA N5685 14 36 15.36 +29 54 29.4 4 1.24 1.71 WS BPP UZC CCA N5686 14 36 02.597 +36 30 10.85 4 0.55 0.52 GSC KHJ UZC SBG2 N5687 14 34 52.55 +54 28 32.2 6 3.46 1.71 WS UZC CCA GSC GHD1 DC N5688 14 39 35.1 -45 01 10 2 0.00 2.12 ESOB WS N5689 14 35 29.700 +48 44 30.87 7 0.68 2.67 WS DC SBG2 AC UZC CCA GHD1 N5690 14 37 41.09 +02 17 27.6 6 1.89 3.25 SPC UZC WS GH SPF CCA N5691 14 37 53.49 -00 23 53.8 6 2.50 2.48 CCA UZC WS SPC DC GH N5692 14 38 18.09 +03 24 35.1 6 1.24 1.20 WS SPC DC UZC KEBA CCA N5693 14 36 11.33 +48 35 07.2 7 2.28 2.25 K11 SBG2 GHD1 WS CCA UZC DC N5694 14 39 36.51 -26 32 17.5 2 0.00 0.64 WS SW N5695 14 37 22.086 +36 34 03.15 7 0.72 1.14 WS DC UZC SBG2 CCA GSC UW N5696 14 36 57.02 +41 49 41.9 9 1.05 1.94 DC WS UA20 SBG2 GSCA CCA APMN UZC HCds N5697=I4471 14 36 31.954 +41 41 06.66 8 0.82 1.53 Ty2 HCds UA20 CCA WS UZC HC2m SBG2 N5698 14 37 14.79 +38 27 16.4 5 1.87 3.41 SBG2 WS CCA UZC DC N5699=N5706 14 38 42.4 +30 27 56 2 0.00 2.83 WS BPP N5700 14 37 01.63 +48 32 42.1 5 0.83 1.46 WS K11 UZC SBG2 CCA N5701 14 39 11.19 +05 21 50.6 7 3.46 4.09 SPC WS UZC GH CCA DC MJC N5702 14 38 55.09 +20 30 23.5 4 1.59 3.14 WS DC UZC CCA N5703=N5709 14 38 50.22 +30 26 33.4 7 2.25 2.22 UZC UZC CCA BPP WS DC DC N5704:=N5708 14 38 16.29 +40 27 26.6 8 1.23 2.26 CCA SBG2 WS HCds UZC Pds DC STMM N5704? 14 37 55.42 +40 30 57.4 1 HCds N5704?? 14 37 56.7 +40 30 50 1 WS N5705 14 39 49.73 -00 43 07.3 7 1.77 1.73 CCA GH UZC SPF DC WS SPC N5706=N5699 14 38 42.4 +30 27 56 2 0.00 2.83 WS BPP N5707 14 37 30.77 +51 33 43.1 6 1.14 2.17 DC UZC HC2m WS GHD1 CCA N5708=:N5704 14 38 16.29 +40 27 26.6 8 1.23 2.26 CCA SBG2 WS HCds UZC Pds DC STMM N5709=N5703 14 38 50.22 +30 26 33.4 7 2.25 2.22 UZC UZC CCA BPP WS DC DC N5710 14 39 16.29 +20 02 35.3 5 2.66 0.86 UZC WS HCds CCA DC N5711 14 39 22.60 +19 59 25.1 4 0.91 1.18 WS UZC HCds CCA N5712 14 29 41.643 +78 51 51.69 5 1.43 1.12 Pds KHJ UZC GD HCds N5713 14 40 11.47 -00 17 24.5 7 1.86 1.91 WS SPC UZC CCA SPF DC GH N5714 14 38 11.76 +46 38 16.3 5 3.61 1.25 SBG2 CCA UZC WS DC N5715 14 43 29 -57 34.6 1 ESOB N5716 14 41 05.68 -17 28 35.9 6 3.66 2.11 WS GSC APMn SPC GHD2 SGC N5717 14 38 37.693 +46 39 46.78 6 0.61 1.01 SBG2 KHJ GSC Pds2 UZC HCds N5718 14 40 42.84 +03 27 54.8 5 0.86 1.23 SPC WS Pds UZC CCA N5719 14 40 56.45 -00 19 04.6 6 2.91 1.19 CCA GH UZC SPC WS DC N5720 14 38 33.36 +50 48 53.1 5 0.82 1.69 WS UZC HCds Pds CCA N5721 14 38 52.93 +46 40 27.8 5 1.03 1.17 Pds2 GSC WS SBG2 HCds N5722 14 38 54.368 +46 39 56.24 7 1.14 0.56 Pds2 Pds UZC GSC KHJ SBG2 HCds N5723 14 38 57.901 +46 41 21.99 4 0.10 1.31 GSC KHJ Pds2 HCds N5724 14 39 02.07 +46 41 31.8 3 0.78 1.36 Pds2 HCo HCds N5725 14 40 58.26 +02 11 09.4 6 1.92 2.32 DC WS UZC SPC CCA SPF N5726 14 42 56.02 -18 26 40.3 4 2.02 1.92 WS GSC ESOB SPC N5727 14 40 26.15 +33 59 18.7 4 1.45 1.37 SBG2 WS UZC CCA N5728 14 42 23.991 -17 15 11.72 7 1.24 3.73 UW GHD2 WS SPC APMn SGC MJC N5729 14 42 06.89 -09 00 34.1 4 0.96 2.73 GSC SPC APMn WS N5730 14 39 52.08 +42 44 31.4 6 1.08 1.40 SBG2 GSC WS Pds UZC CCA N5731=?I1045 14 40 09.21 +42 46 45.5 6 1.08 1.99 DC CCA WS UZC SBG2 GSC N5732 14 40 38.99 +38 38 16.9 5 1.32 2.72 WS SBG2 UZC CCA DC N5733 14 42 45.8 -00 21 05 3 0.87 1.15 UZC WS SPC N5734 14 45 09.16 -20 52 14.5 4 2.03 0.91 WS SPC GSC ESOB N5735 14 42 33.44 +28 43 33.5 5 0.99 1.15 UZC CCA DC WS BPP N5736 14 43 30.84 +11 12 09.6 4 1.56 0.62 WS UZC GSC HCds N5737 14 43 11.95 +18 52 47.1 4 0.96 0.46 HCds CCA UZC WS N5738 14 43 56.5 +01 36 13 3 1.50 2.31 UZC WS SPC N5739 14 42 29.00 +41 50 31.7 6 2.16 1.11 GHD1 UZC WS CCA SBG2 DC N5740 14 44 24.53 +01 40 46.6 6 1.47 0.80 UZC WS DC GH CCA SPC N5741 14 45 51.790 -11 54 51.71 2 1.45 0.39 KHJ SPC N5742 14 45 36.8 -11 48 36 3 0.85 0.58 WS SPC APMn N5743 14 45 10.73 -20 54 48.5 4 3.25 0.47 ESOB SPC GSC WS N5744: 14 46 38.4 -18 30 47 3 0.82 2.52 WS ESOB SPC N5745=N5745b 14 45 01.905 -13 56 49.13 8 1.60 1.63 GSC HCds APMn HCo SPC KHJ Pds MFSK N5745a 14 45 01.82 -13 56 40.7 2 1.24 0.99 HCo HCds N5745c 14 45 01.01 -13 56 56.5 2 1.03 1.41 HCds HCo N5745d 14 44 57.21 -13 57 54.0 3 2.08 0.83 HCds GSC HCo N5746 14 44 55.75 +01 57 17.6 9 2.31 1.82 GH HCds SPC WS SPF CCA HCds UZC HC2m N5747n=I4493n 14 44 20.88 +12 07 54.8 6 2.62 2.48 WS GSC UZC HCo CCA DC N5747s=I4493s 14 44 20.8 +12 07 42 2 1.04 0.00 HCo UZC N5748 14 45 05.164 +21 54 58.37 3 0.90 0.36 KHJ UZC HCds N5749 14 48 53 -54 29.9 1 ESOB N5750 14 46 11.10 -00 13 23.2 6 2.51 2.58 WS GH UZC SPC DC CCA N5751 14 43 49.20 +53 24 01.0 4 0.79 1.42 WS CCA UZC DC N5752 14 45 14.21 +38 43 43.1 4 0.45 0.75 GSC SBG2 Pds WS N5753 14 45 18.921 +38 48 20.36 3 1.11 1.40 KHJ SBG2 HCo N5754 14 45 19.62 +38 43 54.2 6 1.07 1.72 GSC UZC WS DC CCA SBG2 N5755 14 45 24.46 +38 46 47.8 6 2.27 1.42 SBG2 CCA GSC WS UZC Pds N5756 14 47 33.7 -14 51 12 5 2.20 1.64 GHD2 WS APMn SPC MFSK N5757 14 47 46.3 -19 04 42 4 2.42 3.77 ESOB GHD2 WS SPC N5758 14 47 02.04 +13 40 03.0 2 2.27 2.83 GD CCA N5759 14 47 14.83 +13 27 22.5 4 1.67 2.61 UZC KEBA WS CCA N5760 14 47 42.37 +18 30 04.9 4 2.53 1.53 WS CCA UZC DC N5761: 14 49 08.4 -20 22 35 3 2.44 2.31 ESOB WS Pds N5761? 14 49 50.07 -20 16 41.9 3 2.05 0.76 GSC SPC ESOB N5762 14 48 42.64 +12 27 24.5 5 0.20 0.95 DC Pds WS UZC CCA N5763 14 48 58.630 +12 29 24.97 4 2.33 2.57 GD Pds UZC KHJ N5764 14 53 32 -52 40.2 1 ESOB N5765=N5765A 14 50 51.47 +05 06 51.5 5 1.70 0.91 SPC Pds UZC WS CCA N5765B 14 50 50.64 +05 07 09.7 4 1.90 1.14 WS Pds CCA SPC N5766 14 53 09.5 -21 23 38 3 0.00 1.15 ESOB WS SPC N5767 14 49 34.40 +47 22 32.8 4 1.31 0.97 WS UZC SBG2 CCA N5768 14 52 08.03 -02 31 47.4 6 1.20 2.33 WS DC Pds CCA UZC SPC N5769 14 52 41.522 +07 55 54.70 4 0.71 0.49 SPC KHJ UZC KEBA N5770 14 53 14.99 +03 57 35.2 5 1.67 1.85 SPC WS CCA UZC DC N5771 14 52 14.355 +29 50 42.87 3 0.76 0.28 KHJ UZC BPP N5772 14 51 39.00 +40 35 55.9 6 1.83 1.20 SBG2 WS UZC GHD1 CCA DC N5773 14 52 30.498 +29 48 26.28 5 2.57 1.01 BPP KHJ UZC CCA DC N5774 14 53 42.63 +03 34 56.2 7 2.59 1.58 WS SPC CCA WR UZC GH DC N5775 14 53 57.49 +03 32 39.3 7 1.75 3.02 HHKK WS UZC CCA SPC GH DC N5776 14 54 32.772 +02 57 58.68 4 0.78 1.29 SPC KHJ Pds UZC N5777 14 51 18.04 +58 58 38.0 5 2.22 1.87 CCA WS UZC DC STMM N5778=?N5825 14 54 31.571 +18 38 31.85 4 0.97 0.62 KHJ CCA Pds HCds N5779 14 52 09.510 +55 53 57.23 2 0.19 0.93 KHJ HCds N5780 14 54 22.7 +28 56 22 3 0.76 1.00 WS UZC BPP N5781 14 56 41.2 -17 14 33 3 0.83 3.06 APMn SHM SPC N5782 14 55 55.30 +11 51 40.9 2 0.21 1.06 GSC CCA N5783=N5785 14 53 28.33 +52 04 34.1 6 0.73 1.59 UZC WS HC2m HCds CCA DC N5784 14 54 16.28 +42 33 28.8 5 2.89 0.71 DC SBG2 UZC WS CCA N5785=N5783 14 53 28.33 +52 04 34.1 6 0.73 1.59 UZC WS HC2m HCds CCA DC N5786 14 58 56.5 -42 00 49 2 2.37 5.66 WS ESOB N5787 14 55 15.47 +42 30 24.4 5 0.65 0.93 WS DC SBG2 UZC CCA N5788 14 53 16.891 +52 02 38.83 4 0.64 0.76 Pds HCds KHJ HC2m N5789 14 56 35.66 +30 14 01.6 5 1.49 2.96 BPP WS UZC CCA DC N5790 14 57 35.90 +08 17 06.1 5 0.66 1.32 GD WS Pds UZC CCA N5791 14 58 46.1 -19 16 02 4 1.42 0.96 ESOB GHD2 WS SPC N5792 14 58 22.65 -01 05 26.2 7 1.86 2.20 GH SPF WS SPC CCA DC UZC N5793 14 59 24.8 -16 41 35 5 1.29 2.39 APMn SPC WS GHD2 Pds N5794 14 55 53.61 +49 43 32.8 5 1.22 1.54 DC SBG2 WS CCA UZC N5795 14 56 19.31 +49 23 55.3 5 2.43 1.61 WS K11 UZC CCA Pds N5796 14 59 24.0 -16 37 25 4 1.38 1.50 APMn WS SPC GHD2 N5797 14 56 23.98 +49 41 45.0 6 1.45 1.74 DC WS SBG2 UZC GSC CCA N5798 14 57 38.01 +29 58 05.7 5 2.81 1.79 UZC WS CCA BPP DC N5799 15 05 35.8 -72 25 58 2 2.26 1.41 WS ESOB N5800 15 01 47 -51 55.1 1 ESOB N5801 15 00 25.890 -13 54 15.59 2 1.08 0.08 SPC KHJ N5802 15 00 30.075 -13 55 08.94 2 1.59 0.70 KHJ SPC N5803 15 00 34.535 -13 53 41.23 2 0.01 1.39 KHJ SPC N5804 14 57 06.66 +49 40 07.4 7 3.61 1.51 DC WS SBG2 CCA K11 GSC UZC N5804e 14 57 08.02 +49 40 08.7 1 GSC N5805 14 57 12.0 +49 37 40 1 HCm N5805nw 14 57 11.66 +49 37 42.6 3 0.48 1.93 HCo GSC WS N5805se 14 57 12.3 +49 37 36 1 HCo N5806 15 00 00.336 +01 53 28.03 11 1.75 1.45 WS SPC UZC GH GSCA HCds UCA2 CMT HC2m CCA DC N5807 14 55 48.60 +63 54 12.5 4 0.88 1.20 WS GSC HCds UZC N5808=N5819 14 54 02.82 +73 07 52.8 5 0.50 1.74 HCds WS DC UZC CCA N5809 15 00 52.2 -14 09 55 3 0.84 2.65 APMn WS SPC N5810 15 02 42.7 -17 52 05 3 3.78 2.52 WS SPC ESOB N5811 15 00 27.28 +01 37 23.1 5 1.95 1.31 WS UZC SPF SPC GH N5812 15 00 55.7 -07 27 28 3 0.86 0.00 WS APMn SPC N5813 15 01 11.20 +01 42 06.9 7 1.10 2.18 WS SPC UZC GH DC MJC CCA N5814 15 01 21.1 +01 38 11 3 0.00 0.58 SPC WS UZC N5815 15 00 29.2 -16 50 03 2 1.02 0.71 WS SPC N5816: 15 00 04.879 -16 05 36.85 2 0.44 0.37 KHJ HCds N5817: 14 59 40.788 -16 10 49.44 4 1.95 1.52 WS SPC KHJ HCds N5818 14 58 58.404 +49 49 16.23 4 0.89 0.39 SBG2 UZC KHJ CCA N5819=N5808 14 54 02.82 +73 07 52.8 5 0.50 1.74 HCds WS DC UZC CCA N5820 14 58 39.99 +53 53 08.7 5 1.66 1.50 UZC WS DC CCA GHD1 N5821 14 58 59.77 +53 55 22.6 4 0.52 1.02 UZC CCA WS GSC N5822 15 04 21 -54 23.8 1 ESOB N5823 15 05 30 -55 36.2 1 ESOB N5824=N5834 15 03 58.62 -33 04 07.5 2 2.23 5.23 SW ESOB N5825?=N5778 14 54 31.571 +18 38 31.85 4 0.97 0.62 KHJ CCA Pds HCds N5826=N5870 15 06 33.83 +55 28 44.0 5 1.29 1.05 Pds WS HCds UZC CCA N5827 15 01 53.69 +25 57 49.5 4 2.20 2.14 WS UZC CCA DC N5828=N5828B 15 00 46.09 +49 59 35.3 5 1.02 1.71 WS CCA DC UZC SBG2 N5828A 15 00 45.32 +49 58 55.4 2 1.29 2.83 WS SBG2 N5829 15 02 42.14 +23 19 58.2 7 1.89 2.24 WS UZC GSC CCA HKA GH Hu N5830 15 01 51.00 +47 52 30.8 4 0.38 0.60 CCA SBG2 UZC WS N5831 15 04 06.99 +01 13 11.5 6 2.03 2.24 WS SPC UZC GH CCA DC N5832 14 57 45.62 +71 40 51.5 5 1.24 2.77 GHD1 DC WS UZC CCA N5833 15 11 54.1 -72 51 32 2 0.32 1.41 WS ESOB N5834=N5824 15 03 58.62 -33 04 07.5 2 2.23 5.23 SW ESOB N5835 15 02 25.36 +48 52 38.9 3 1.32 0.57 SBG2 WS CCA N5836 14 59 31.16 +73 53 35.5 5 1.22 3.42 Pds WS CCA GD UZC N5837 15 04 40.70 +12 37 58.3 5 1.96 2.95 BCG WS UZC CCA DC N5838 15 05 26.25 +02 05 57.3 6 2.56 2.75 WS GH SPC UZC CCA DC N5839 15 05 27.56 +01 38 04.0 6 2.79 1.63 WS GH SPC UZC CCA DC N5840 15 04 20 +29 30.4 1o Sw4 N5841=N5848 15 06 35.0 +02 00 16 3 2.29 1.15 WS UZC SPC N5842 15 04 52.09 +21 04 10.5 4 0.00 1.59 Pds2 UZC WS HCds N5843 15 07 28.0 -36 19 42 2 4.28 0.71 WS ESOB N5844 15 10 40.88 -64 40 24.8 5 1.04 1.92 BSV ESOB HCds GSCA GSC N5845 15 06 00.79 +01 38 00.9 7 3.28 2.22 GH WS SPC KEBA UZC CCA DC N5846 15 06 29.266 +01 36 19.88 11 2.62 2.11 GH WS HC2m UCA2 CMT UB10 SPC DC CCA HCds UZC N5846A 15 06 29.149 +01 35 41.15 8 1.51 1.53 GH WS HCds HC2m APMN UCA2 CMT SPC N5847 15 06 22.27 +06 22 47.0 5 1.25 2.31 WS Pds UZC HCds GD N5848=N5841 15 06 35.0 +02 00 16 3 2.29 1.15 WS UZC SPC N5849 15 06 50.683 -14 34 19.66 3 0.25 1.04 SPC KHJ SPF N5850 15 07 07.71 +01 32 38.7 6 2.42 1.71 WS HHKK SPC UZC CCA GH N5851 15 06 53.43 +12 51 29.7 5 0.84 2.09 WS BCG GD UZC CCA N5852 15 06 56.426 +12 50 48.47 4 0.35 0.10 AC KHJ BCG UZC N5853 15 05 53.30 +39 31 19.6 4 0.75 0.57 WS SBG2 UZC CCA N5854 15 07 47.77 +02 34 06.1 6 3.33 1.52 WS CCA GH SPC UZC DC N5855 15 07 49.061 +03 59 02.86 4 1.90 0.82 JA KHJ UZC Pds N5856 15 07 20.27 +18 26 31.3 2 0.80 2.12 SAO WS N5857 15 07 27.42 +19 35 52.8 5 1.85 3.07 UZC WS CCA DC GH N5858 15 08 49.14 -11 12 28.8 5 1.86 1.37 SPC WS HCds APMn GHD2 N5859 15 07 35.01 +19 34 55.6 5 3.33 1.73 UZC CCA WS GH DC N5860 15 06 33.70 +42 38 30.6 4 0.56 1.96 WS DC SBG2 SDP N5860A 15 06 33.5 +42 38 25 2 1.56 4.24 DC UZC N5861 15 09 16.05 -11 19 19.7 5 2.63 2.65 HCds SPC APMn WS GHD2 N5862 15 06 03.229 +55 34 25.32 3 0.22 0.91 Pds KHJ HCds N5863 15 10 48.286 -18 25 52.04 4 2.42 2.17 ESOB WS KHJ SPC N5864 15 09 33.60 +03 03 09.8 5 1.99 1.05 CCA WS UZC GH DC N5865=N5868 15 09 49.207 +00 31 46.66 6 0.68 0.61 WS KHJ HCds UZC SPC CCA N5866 15 06 29.561 +55 45 47.08 10 2.91 1.45 UJ10 vdK3 WS UZC UA20 CCA GSCA GHD1 HCds DC N5866A 15 05 16.4 +55 49 37 1o JK N5866B 15 12 07.16 +55 47 06.4 3 0.76 2.98 GHD1 WS CCA N5867 15 06 24.32 +55 43 53.1 1 HCds N5868=N5865 15 09 49.207 +00 31 46.66 6 0.68 0.61 WS KHJ HCds UZC SPC CCA N5869 15 09 49.40 +00 28 11.4 6 0.94 1.02 DC WS SPC UZC HCds CCA N5870=N5826 15 06 33.83 +55 28 44.0 5 1.29 1.05 Pds WS HCds UZC CCA N5871: 15 10 04.75 +00 29 52.7 1 HCds N5871? 15 09 56.1 +00 30 49 1 HCo N5872 15 10 55.671 -11 28 48.87 3 0.19 0.58 KHJ APMn SPC N5873 15 12 50.67 -38 07 30.2 5 2.01 3.09 ESOB DKM1 GSC CK UCA1 N5874 15 07 51.98 +54 45 09.3 5 1.78 1.79 GHD1 UZC WS CCA DC N5875 15 09 13.05 +52 31 41.9 5 2.37 2.87 DC GHD1 WS UZC CCA N5875A 15 08 33.59 +52 17 45.0 5 1.31 0.74 K05 CCA DC UZC K11 N5876=I1111 15 09 31.57 +54 30 22.0 3 1.48 1.48 WS UZC CCA N5877 15 12 53.07 -04 55 38.0 1 HCm N5877 3sts 15 12 53.1 -04 55 28 1 WS N5877 nw * 15 12 52.51 -04 55 33.8 1 HCds N5877 se * 15 12 53.64 -04 55 43.8 1 HCds N5878 15 13 45.7 -14 16 14 3 0.84 0.58 GHD2 SPC WS N5879 15 09 46.99 +57 00 02.7 6 1.10 2.73 WS GSC UZC GHD1 DC CCA N5880 15 15 01.109 -14 34 45.06 3 0.34 1.14 SPC GSC KHJ N5881=I1100 15 06 20.79 +62 58 50.5 5 0.82 1.95 WS GSC UZC CCA DC N5882=I1108 15 16 49.98 -45 38 56.2 5 0.95 2.09 GSC DKM2 Ty2 ESOB WS N5883 15 15 10.152 -14 37 01.80 3 0.35 0.95 SPC GSC KHJ N5884 15 13 09.2 +31 51 41 3 0.73 1.15 HCds HCrs WS N5884 n * 15 13 08.97 +31 51 47.1 2 0.81 0.49 HCds HCrs N5884 s * 15 13 09.31 +31 51 35.2 2 0.81 0.64 HCds HCrs N5885 15 15 04.2 -10 05 08 4 3.52 2.65 GHD2 SPC WS MJC N5886 15 12 45.49 +41 14 00.9 4 0.68 2.20 SBG2 WS UZC HC N5887 15 14 43.957 +01 09 14.24 5 0.66 0.81 UZC KHJ SPC MFSK CCA N5888 15 13 07.38 +41 15 52.3 7 1.86 1.61 DC UZC SBG2 WS GHD1 CCA HC N5889 15 13 15.71 +41 19 39.6 4 1.52 2.17 Pds2 WS GSC HC N5890 15 17 51.057 -17 35 22.13 5 2.08 2.56 APMn SHM WS KHJ SPC N5891 15 16 13.3 -11 29 38 2 1.04 0.71 WS SPC N5892 15 13 48.215 -15 27 51.02 4 2.46 1.05 GHD2 WS KHJ SPC N5893 15 13 34.18 +41 57 31.1 7 1.79 0.80 HC GHD1 UZC SBG2 CCA WS DC N5894 15 11 41.01 +59 48 28.6 4 1.07 3.28 CCA WS DC UZC N5895 15 13 49.91 +42 00 27.8 5 3.58 2.50 HC SBG2 Pds UZC WS N5896 15 13 50.652 +42 01 28.07 4 1.00 2.54 HC KHJ SBG2 Pds N5897 15 17 24.47 -21 00 36.6 2 1.49 0.21 SW WS N5898 15 18 13.6 -24 05 51 4 2.83 2.65 ESOB Pds WS GHD2 N5899 15 15 03.23 +42 02 57.3 7 1.73 3.09 SBG2 GHD1 UZC WS CCA DC HC N5900 15 15 05.08 +42 12 33.5 5 1.24 1.93 HC SBG2 UZC CCA WS N5901 15 15 02.5 +42 13 46 2 3.92 6.36 WS HC N5902 15 14 22.31 +50 19 47.6 4 0.45 1.84 Pds VPS WS UZC N5903 15 18 36.5 -24 04 06 3 2.10 1.00 ESOB WS GHD2 N5904 15 18 33.50 +02 04 56.7 2 5.30 1.34 HCrs SW N5905 15 15 23.30 +55 31 02.1 6 1.57 1.22 DC GHD1 WS HHKK UZC CCA N5906 15 15 53.0 +56 19 47 2 9.95 1.41 HCo WS N5907 15 15 53.73 +56 19 44.5 8 2.05 1.15 GSCM GGN CCA HC2m WS HCo GSC UZC N5908 15 16 43.28 +55 24 34.5 5 1.11 3.29 WS CCA GHD1 UZC DC N5909 15 11 27.878 +75 23 01.06 6 1.76 1.25 UZC HCrs HCds KHJ GSC CCA N5910 15 19 24.78 +20 53 45.3 5 1.83 1.45 WS UZC GSC HCo HKA N5911 15 20 18.154 +03 31 05.22 5 0.83 0.58 MFSK JA Pds UZC KHJ N5912 15 11 40.88 +75 23 04.2 4 1.45 1.97 WS HCds HCrs GSC N5913 15 20 55.40 -02 34 40.1 6 2.55 2.00 APMn Pds UZC WS CCA SPC N5914=N5914A 15 18 43.76 +41 51 55.2 6 1.09 1.62 WS Pds2 UZC SBG2 GSC HC N5914Bnw 15 18 45.2 +41 53 25 2 0.00 2.83 WS HCo N5914Bse 15 18 46.1 +41 53 09 2 0.79 0.71 HCo WS N5915 15 21 33.1 -13 05 30 3 0.84 2.31 WS APMn SPC N5916 15 21 37.8 -13 10 11 3 0.00 0.58 WS APMn SPC N5916A 15 21 13.67 -13 06 02.8 4 0.70 1.64 APMn SPF SPC WS N5917 15 21 32.53 -07 22 40.9 4 0.07 2.41 WS SPC APMn PA N5918 15 19 25.22 +45 52 48.3 5 1.13 1.80 WS DC CCA UZC SBG2 N5919 15 21 36.909 +07 43 08.95 3 0.47 0.77 KHJ GSC UZC N5920 15 21 51.91 +07 42 31.7 5 0.66 1.46 WS GSC CCA UZC JA N5921 15 21 56.50 +05 04 12.1 6 2.16 1.51 WS DC GH UZC HCds CCA N5922 15 21 09.0 +41 40 20 2 1.58 0.00 HC WS N5923 15 21 14.290 +41 43 33.00 5 1.55 0.41 KHJ SBG2 UZC CCA HC N5924 15 22 02.0 +31 13 56 3 0.74 2.31 BPP WS UZC N5925 15 27 26 -54 31.7 1 ESOB N5926 15 23 24.9 +12 42 54 2 1.03 0.00 UZC WS N5927 15 28 00.44 -50 40 22.7 2 0.13 0.99 SW ESOB N5928 15 26 02.80 +18 04 24.6 4 2.25 2.11 DC WS UZC CCA N5929 15 26 06.026 +41 40 13.96 6 2.82 1.51 DC GHD1 UZC KHJ HHKK CCA N5929+N5930 15 26 07.04 +41 40 22.0 1 SBG2 N5930 15 26 07.938 +41 40 33.68 7 1.16 2.60 GHD1 DC AC HHKK WS UZC CCA N5931 15 29 29.54 +07 34 21.8 5 1.31 0.91 JA GSC WS Pds UZC N5932 15 26 48.14 +48 36 52.4 3 0.34 1.01 SBG2 WS UZC N5933 15 27 01.551 +48 36 47.63 2 0.09 0.18 SBG2 KHJ N5934 15 28 12.68 +42 55 46.8 6 1.92 1.64 DC WS UZC GSC SBG2 CCA N5935 15 28 16.698 +42 56 38.52 3 0.37 0.29 KHJ GSC SBG2 N5936 15 30 00.91 +12 59 21.3 5 2.49 2.88 WS UZC CCA GH DC N5937 15 30 46.17 -02 49 47.0 5 1.34 2.89 WS UZC SPC APMn HCds N5937 comp 15 30 42.60 -02 48 55.7 1 HCds N5938 15 36 26.1 -66 51 33 2 0.42 2.12 ESOB WS N5939 15 24 45.70 +68 43 47.6 4 3.22 2.99 DC WS CCA UZC N5940 15 31 18.11 +07 27 27.2 5 1.36 1.83 CCA UZC GSC WS DC N5941: 15 31 40.31 +07 20 19.3 2 1.37 1.13 GSC HKA N5941sw 15 31 39.48 +07 20 07.9 2 1.79 2.12 HKA HCo N5942: 15 31 36.810 +07 18 43.77 3 0.37 1.32 UZC KHJ GSC N5943 15 29 44.108 +42 46 40.70 5 0.51 1.16 UZC KHJ GSC SBG2 CCA N5944 15 31 47.62 +07 18 28.0 4 0.70 1.20 WS UZC GSC HKA N5944ne 15 31 50.25 +07 18 40.0 2 1.37 1.48 HCo HKA N5945 15 29 45.086 +42 55 07.61 6 0.98 3.29 KHJ SBG2 CCA GSC UZC DC N5946=I4550 15 35 28.32 -50 39 32.9 3 2.54 2.52 ESOB HCds SW N5947 15 30 36.65 +42 43 00.4 4 0.36 0.49 UZC WS SBG2 CCA N5948 15 32 58.63 +03 58 58.2 1 HCds N5949 15 28 00.774 +64 45 46.77 8 0.91 3.28 DC WS UZC GSCA UA20 CCA GHD1 APM N5950 15 31 30.76 +40 25 47.4 4 1.58 0.54 WS SBG2 UZC CCA N5951 15 33 43.07 +15 00 26.1 5 0.45 0.84 WS GH DC UZC CCA N5952 15 34 56.442 +04 57 31.68 4 1.22 0.70 HCds KHJ UZC Pds N5953 15 34 32.39 +15 11 38.2 6 0.83 1.93 WS GH DC HHKK UZC CCA N5954 15 34 34.94 +15 12 02.0 3 1.59 1.90 GH WS CCA N5955 15 35 12.496 +05 03 47.17 3 0.62 1.12 KHJ HCds UZC N5956 15 34 58.56 +11 44 59.9 5 1.43 2.05 DC WS UZC Pds CCA N5957 15 35 23.221 +12 02 51.20 5 0.94 2.56 DC GH UZC KHJ CCA N5958 15 34 49.14 +28 39 18.0 5 2.38 1.30 BPP WS UZC CCA DC N5959 15 37 22.378 -16 35 46.14 3 0.95 1.25 WS SPC KHJ N5960 15 36 18.479 +05 39 55.58 4 0.74 0.34 Pds UZC KHJ HCds N5961 15 35 16.30 +30 51 51.2 7 1.21 1.25 UZC WS BPP CCA HC2m KEBA DC N5962 15 36 31.70 +16 36 28.4 6 1.35 2.17 MJC WS UZC DC GH CCA N5963 15 33 28.02 +56 33 32.5 4 2.67 0.97 WS CCA UZC DC N5964=I4551 15 37 36.26 +05 58 26.1 6 1.27 2.58 GH WS WR DC UZC CCA N5965 15 34 02.09 +56 41 08.6 5 0.84 2.08 WS UZC DC GSC CCA N5966 15 35 52.17 +39 46 07.4 4 0.79 0.78 UZC CCA WS SBG2 N5967 15 48 16.1 -75 40 23 2 0.80 1.41 WS ESOB N5967A 15 46 59.0 -75 47 14 2 1.32 0.71 WS ESOB N5968 15 39 57.0 -30 33 10 3 1.49 2.52 ESOB GHD2 WS N5969 15 34 51.155 +56 27 01.88 4 1.78 1.66 KHJ Pds UZC HCds N5970 15 38 30.04 +12 11 10.6 5 0.94 2.12 WS UZC DC GH CCA N5971 15 35 37.05 +56 27 39.6 5 1.27 1.42 CCA UZC WS Pds HCds N5972 15 38 54.21 +17 01 32.8 4 0.67 1.12 WS CCA HCds UZC N5973 15 40 15.6 -08 36 06 2 1.05 2.12 WS SPC N5974 15 39 02.37 +31 45 34.3 6 0.81 1.25 WS BPP DC KEBA UZC CCA N5975 15 39 58.01 +21 28 13.0 4 0.53 1.53 HCds CCA WS UZC N5976 15 36 47.98 +59 23 51.6 3 1.57 0.50 WS GSC GHD1 N5976A 15 36 07.39 +59 33 59.6 3 0.27 0.67 GSC UZC CCA N5977 15 40 33.496 +17 07 40.12 5 2.04 1.21 UZC KHJ Pds CCA HCds N5978 15 42 27.215 -13 14 04.04 2 0.04 0.04 SPC KHJ N5979 15 47 40.89 -61 13 03.7 4 1.16 0.85 ESOB DKM2 GSCA GSC N5980 15 41 30.49 +15 47 15.6 4 0.14 2.86 HCds WS UZC CCA N5981 15 37 53.43 +59 23 29.3 6 0.70 2.44 DC GSC WS UZC GHD1 CCA N5982 15 38 40.00 +59 21 21.0 6 0.94 0.76 GSC UZC CCA WS DC GHD1 N5983 15 42 45.709 +08 14 27.55 5 1.13 0.68 KHJ UZC CCA Pds HCds N5984 15 42 53.17 +14 13 53.6 5 1.58 1.91 GH WS DC CCA UZC N5985 15 39 37.132 +59 19 54.39 6 2.54 2.18 CCA UJ10 WS UZC GHD1 DC N5986 15 46 03.55 -37 47 08.5 2 1.85 2.12 SW ESOB N5987 15 39 57.29 +58 04 47.2 3 1.26 0.50 GSC UZC CCA N5988 15 44 33.90 +10 17 34.4 4 1.77 1.39 WS UZC CCA HCds N5989 15 41 32.59 +59 45 16.8 4 1.05 1.74 WS DC CCA UZC N5990 15 46 16.31 +02 24 54.4 6 2.50 1.05 SPC DC WS CCA GSC UZC N5991 15 45 16.806 +24 37 49.63 3 0.89 0.19 KHJ UZC HCds N5992 15 44 21.60 +41 05 08.8 5 1.22 2.10 SBG2 WS UZC CCA SDP N5993 15 44 27.72 +41 07 13.8 5 2.81 2.02 WS UZC CCA SBG2 DC N5994 15 46 53.379 +17 52 22.17 3 2.08 1.64 KHJ CCA DC N5995 15 48 24.919 -13 45 28.22 2 0.73 0.37 SPC KHJ N5996 15 46 58.92 +17 53 02.1 4 1.16 2.49 UZC WS CCA Pds N5997 15 47 27.670 +08 19 15.90 4 0.44 0.89 Pds UZC KHJ HCds N5998 15 49 38 -28 34.7 1 HCe N5998? 15 49 30.0 -28 35 59 1 WS N5999 15 52 08 -56 28.4 1 ESOB N6000 15 49 49.9 -29 23 12 2 7.40 2.83 WS ESOB N6001 15 47 45.95 +28 38 29.1 6 0.66 2.64 WS BPP GSC DC UZC CCA N6002: 15 47 44.4 +28 36 35 1 HCo N6003 15 49 25.629 +19 01 55.80 6 1.51 1.43 DC HCds KHJ UZC KEBA CCA N6004 15 50 22.73 +18 56 19.2 4 1.44 2.94 DC UZC WS CCA N6005 15 55 48 -57 26.2 1 ESOB N6006 15 53 02.585 +12 00 18.95 3 0.84 0.50 UZC KHJ KET2 N6007 15 53 23.24 +11 57 32.8 5 0.89 2.27 Pds UZC WS DC CCA N6008=N6008A 15 52 56.08 +21 06 01.5 4 1.76 0.66 WS UZC CCA DC N6008B 15 53 08.3 +21 04 28 1 UZC N6009 15 53 24.22 +12 03 28.7 4 1.40 1.13 WS Pds UZC HCds N6010 15 54 19.06 +00 32 35.4 5 2.00 3.64 WS DC CCA SPC UZC N6011 15 46 32.98 +72 10 10.3 4 2.42 4.99 WS UZC CCA DC N6012 15 54 13.70 +14 36 05.5 4 3.55 1.86 DC WS UZC CCA N6013 15 52 52.89 +40 38 46.7 6 0.79 1.16 KOS SBG2 WS Pds UZC CCA N6014=I4586 15 55 57.40 +05 55 55.5 5 1.92 2.93 DC HCds CCA WS UZC N6015 15 51 25.31 +62 18 35.0 6 1.59 3.57 GHD1 GSCM WS UZC DC CCA N6016 15 55 54.92 +26 57 59.6 5 1.08 0.90 BPP GSC WS CCA UZC N6017 15 57 15.39 +05 59 54.1 4 1.34 0.52 DC WS UZC CCA N6018=?I1150 15 57 29.81 +15 52 20.6 5 1.19 2.09 HC CCA WS GSC UZC N6019 15 52 09.13 +64 50 25.5 3 0.90 0.85 Pds WS HCds N6020=I1148 15 57 08.208 +22 24 15.97 5 1.33 0.54 KHJ GSC UZC CCA DC N6021 15 57 30.67 +15 57 21.0 6 1.35 2.06 DC HC WS UZC GSC CCA N6022 15 57 47.81 +16 16 55.4 5 1.88 1.87 RGMH HC GSC UZC WS N6023 15 57 49.613 +16 18 35.02 5 0.88 2.61 HC UZC GSC KHJ CCA N6024 15 53 07.75 +64 55 04.0 4 1.26 0.91 Pds2 WS UZC HCds N6025 16 03 17 -60 25.9 1 ESOB N6026 16 01 21.07 -34 32 36.7 5 3.05 1.99 DKM2 GSC CK UCA1 ESOB N6027 15 59 12.57 +20 45 47.9 9 2.76 2.33 GH UZC HCds WS CCA GSC HKA HCo DC N6027 all 15 59 11.7 +20 45 28 1 K02 N6027A 15 59 11.25 +20 45 17.2 7 2.66 1.53 UZC HCds CCA WS GSC HKA DC N6027B 15 59 10.92 +20 45 43.3 9 3.17 2.45 GH CCA WS UZC HCds GSC HKA DC HCo N6027C 15 59 11.99 +20 44 49.9 6 2.49 3.12 WS HCds CCA HKA HCo DC N6027D 15 59 13.11 +20 45 35.9 6 2.60 2.71 HCds WS CCA HKA HCo DC N6027E 15 59 14.81 +20 45 58.2 3 3.15 2.83 HCds DC HCo N6028=N6046 16 01 29.09 +19 21 33.0 6 2.05 2.23 UZC GSC CCA WS RGMH HC N6029 16 01 58.89 +12 34 27.6 2 2.48 0.85 WS HCds N6029 comp 16 01 59.35 +12 33 44.2 1 HCds N6029n 16 01 59.01 +12 34 32.6 1 HCds N6029s 16 01 58.95 +12 34 25.8 1 HCds N6030 16 01 51.48 +17 57 27.1 4 1.96 2.06 WS UZC CCA DC N6031 16 07 35 -54 00.9 1 ESOB N6032 16 03 01.18 +20 57 20.5 5 0.71 1.70 WS UZC CCA Pds HCds N6032 comp 16 03 00.81 +20 59 05.6 1 HCds N6033 16 04 27.991 -02 07 15.98 4 0.40 0.60 UZC GSC KHJ CCA N6034 16 03 32.1 +17 11 53 3 2.98 1.00 WS UZC BC N6035 16 03 24.08 +20 53 27.4 5 2.47 1.54 GD WS UZC CCA HCds N6036 16 04 30.76 +03 52 04.9 4 1.23 1.92 WS UZC CCA HCds N6037 16 04 29.927 +03 48 53.43 4 1.69 1.62 Pds KHJ UZC HCds N6038 16 02 40.54 +37 21 32.6 5 1.10 1.28 WS DC CCA UZC SBG2 N6039=N6042 16 04 39.60 +17 42 01.6 4 0.69 2.27 WS UZC GSC BC N6040A 16 04 26.75 +17 45 00.2 6 1.16 1.97 WS GSC CCA Pds UZC BC N6040B 16 04 26.50 +17 44 31.4 6 1.52 3.33 BC Pds GSC WS CCA UZC N6041A 16 04 35.81 +17 43 16.5 4 1.35 1.52 WS UZC GSC BC N6041B 16 04 34.95 +17 43 00.9 3 0.00 1.71 WS UZC GSC N6042=N6039 16 04 39.60 +17 42 01.6 4 0.69 2.27 WS UZC GSC BC N6043A 16 05 01.43 +17 46 31.9 5 1.63 1.24 UZC GSC BC WS RGMH N6043B 16 05 01.0 +17 46 22 1 BC N6044=I1172 16 04 59.67 +17 52 11.8 5 1.02 1.49 WS GH UZC GSC BC N6045=N6045A 16 05 07.84 +17 45 26.0 6 1.94 1.94 GH CCA BC UZC GSC WS N6045B 16 05 10.3 +17 45 28 1 HCo N6046=N6028 16 01 29.09 +19 21 33.0 6 2.05 2.23 UZC GSC CCA WS RGMH HC N6047 16 05 08.94 +17 43 45.4 6 1.65 2.37 GH UZC GPB GSC WS BC N6048 15 57 30.41 +70 41 20.9 5 1.72 2.57 WS UZC CCA GPB DC N6049 16 05 37.87 +08 05 46.0 1 SAO N6050A=I1179A 16 05 23.36 +17 45 24.5 4 1.47 1.04 HCo UZC CCA WS N6050B=I1179B 16 05 22.2 +17 45 10 2 2.02 0.71 HCo BC N6051 16 04 56.65 +23 55 57.0 5 0.72 1.84 WS HCds UZC GPB CCA N6052=N6064 16 05 12.97 +20 32 34.5 5 2.77 4.60 HHKK HCds UZC K02 SDP N6052e=N6064e 16 05 13.3 +20 32 32 2 4.96 3.54 WS DC N6052w=N6064w 16 05 12.6 +20 32 30 3 2.14 2.08 Pds WS DC N6053=N6057 16 05 39.642 +18 09 50.90 4 0.60 0.73 BC KHJ GSC UZC N6054=I1183 16 05 38.01 +17 46 01.5 5 1.63 2.38 GH BC WS UZC GSC N6055 16 05 32.65 +18 09 33.8 6 0.83 1.15 GSC BC UZC CCA WS GH N6056=I1176 16 05 31.30 +17 57 48.8 5 1.56 3.24 WS GSC UZC BC GH N6057=N6053 16 05 39.642 +18 09 50.90 4 0.60 0.73 BC KHJ GSC UZC N6058 16 04 26.54 +40 40 58.9 4 0.39 0.35 UJ10 GSC 2MSP CK N6059 16 07 13 -06 24.8 1o Sw3 N6060 16 05 52.11 +21 29 03.8 4 1.74 1.78 UZC CCA WS DC N6061 16 06 16.06 +18 14 59.2 6 1.02 0.91 UZC CCA GSC WS BC GH N6062 16 06 22.88 +19 46 39.4 5 0.81 3.57 GSC UZC CCA WS DC N6062B 16 06 19.0 +19 45 45 2 1.00 2.83 Pds2 WS N6063 16 07 13.14 +07 58 43.4 5 3.74 1.13 Pds UZC CCA WS DC N6064=N6052 16 05 12.97 +20 32 34.5 5 2.77 4.60 HHKK HCds UZC K02 SDP N6064e=N6052e 16 05 13.3 +20 32 32 2 4.96 3.54 WS DC N6064w=N6052w 16 05 12.6 +20 32 30 3 2.14 2.08 WS Pds DC N6065 16 07 22.982 +13 53 16.46 4 0.39 0.64 KHJ Pds UZC HCds N6066 16 07 35.390 +13 56 36.70 4 0.53 1.48 KHJ HCds Pds UZC N6067 16 13 11 -54 13.1 1 ESOB N6068 15 55 26.40 +78 59 48.7 7 1.84 3.64 WS HCrs UZC GHD1 CCA DC KEBA N6068A 15 54 47.391 +78 59 05.54 4 0.64 1.80 HCrs GHD1 KHJ UZC N6069 16 07 41.68 +38 55 50.4 3 0.79 0.64 SBG2 WS UZC N6070=N6070A 16 09 58.69 +00 42 32.8 7 1.61 1.29 UZC WS HCds DC CCA SPC GH N6070Bn 16 10 08.74 +00 46 12.5 1 HCds N6070Bn+s 16 10 08 +00 45.9 1o EHo N6070Bs 16 10 09.01 +00 45 54.7 1 HCds N6070C 16 10 11.97 +00 47 01.3 1 HCds N6071 16 02 07.002 +70 25 01.36 2 0.09 0.11 GSC KHJ N6072 16 12 58.26 -36 13 47.2 3 1.30 0.78 GSC CK GSCA N6073 16 10 10.88 +16 41 56.3 5 0.72 1.97 CCA RGMH UZC WS DC N6074 16 11 17.26 +14 15 31.2 4 0.81 1.68 HCds UZC IPds WS N6074s 16 11 16.80 +14 15 17.1 3 0.60 1.27 HCds IPds WS N6075=I4594 16 11 22.62 +23 57 53.1 4 0.34 1.04 HCds WS GD UZC N6076ne 16 11 13.7 +26 52 22 4 2.96 0.58 BPP WS HCo UZC N6076sw 16 11 13.0 +26 52 17 3 1.54 1.53 WS UZC HCo N6076sw+ne 16 11 13.31 +26 52 20.8 1 GSC N6077 16 11 14.100 +26 55 24.23 5 1.01 0.80 BPP UZC KHJ GSC CCA N6078 16 12 05.517 +14 12 31.44 4 1.69 0.43 KHJ Pds UZC HCds N6078s 16 12 06.16 +14 12 07.7 1 HCds N6078se 16 12 06.88 +14 12 09.6 1 HCds N6079=I1200 16 04 29.06 +69 39 56.4 6 1.92 1.10 GD WS GSC UZC CCA DC N6080 16 12 58.690 +02 10 38.21 4 1.96 0.94 UZC KHJ CCA SPC N6081=I1202 16 12 56.850 +09 52 01.67 5 0.86 1.48 UZC Pds DC KHJ CCA N6082 16 15 36 -34 14.6 1o JH N6082? 16 15 27.6 -34 13 57 1 HCds N6082?=I4597 16 17 39.72 -34 21 57.5 3 0.66 2.04 WS HCds ESOB N6082?? 16 15 31.9 -34 14 01 1 WS N6083 16 13 12.712 +14 11 06.96 4 1.66 1.14 Pds UZC KHJ HCds N6084 16 14 16.831 +17 45 25.67 5 3.77 2.27 KHJ UZC GSC CCA HC N6085 16 12 35.283 +29 21 53.35 5 0.70 1.17 KHJ BPP CCA DC UZC N6086 16 12 35.54 +29 29 05.3 5 0.56 1.09 BPP CCA GSC WS UZC N6087 16 18 50 -57 56.1 1 ESOB N6088=N6088A 16 10 42.5 +57 27 57 2 1.14 2.83 WS UZC N6088B 16 10 44.2 +57 27 41 2 1.14 1.41 WS UZC N6089ne 16 12 41.6 +33 02 15 1 WS N6089sw 16 12 40.30 +33 02 06.5 4 2.21 2.96 K10 WS UZC SBG2 N6090 16 11 40.69 +52 27 25.2 4 0.47 1.05 SDP UZC WS vdH+ N6090n 16 11 40.82 +52 27 28.1 2 0.26 1.91 DC HHKK N6090s 16 11 40.48 +52 27 23.2 2 1.68 1.06 HHKK DC N6091 16 07 52.906 +69 54 16.79 5 0.61 1.32 GD Pds GSC KHJ UZC N6092 16 14 04.6 +28 07 32 1 HCds N6092 ne * 16 14 04.73 +28 07 36.4 1 HCds N6092 sw * 16 14 04.41 +28 07 28.0 1 HCds N6093 16 17 02.83 -22 58 31.8 2 6.16 1.98 SW ESOB N6094 16 06 33.915 +72 29 39.21 5 0.79 1.91 GD Pds KHJ UZC CCA N6095 16 11 11.24 +61 16 04.1 4 2.73 1.29 WS UZC CCA DC N6096 16 14 46.748 +26 33 31.58 4 0.73 0.47 KHJ GD BPP UZC N6097 16 14 26.23 +35 06 31.6 3 0.71 1.44 WS UZC SBG2 N6098 16 15 34.10 +19 27 39.8 6 2.90 3.08 Pds WS UZC CCA GSC HC N6099 16 15 35.548 +19 27 10.78 6 1.63 3.69 UZC Pds CCA GSC KHJ HC N6100 16 16 52.42 +00 50 26.4 4 0.85 1.04 WS SPC UZC CCA N6101 16 25 47.75 -72 12 04.9 2 5.51 1.13 ESOB SW N6102 16 15 36.93 +28 09 30.7 4 1.26 1.78 WS UZC CCA BPP N6103 16 15 44.61 +31 57 50.0 5 0.93 1.41 WS CCA BPP UZC DC N6104 16 16 30.69 +35 42 26.7 5 1.95 1.87 DC WS UZC CCA SBG2 N6105 16 17 09.282 +34 52 43.88 4 0.62 0.25 K10 UZC SBG2 KHJ N6106 16 18 47.22 +07 24 40.7 5 2.35 2.57 WS UZC DC CCA GH N6107 16 17 20.13 +34 54 05.3 5 1.26 0.61 UZC K10 WS SBG2 CCA N6108 16 17 25.56 +35 08 08.0 4 0.61 0.96 WS K10 UZC SBG2 N6109 16 17 40.52 +35 00 14.3 6 0.60 1.04 WS K10 SBG2 RC2 UZC CCA N6110 16 17 43.85 +35 05 14.4 4 1.77 3.05 K10a SBG2 K10 WS N6111nw 16 14 22.43 +63 15 39.4 3 1.68 1.01 HCo GSC WS N6111se 16 14 23.3 +63 15 38 1 HCo N6112 16 18 00.526 +35 06 36.54 4 0.54 0.51 K10 SBG2 KHJ UZC N6113 16 19 10.71 +14 07 59.5 3 1.49 1.33 WS HCds Pds N6113 comp 16 19 12.40 +14 09 05.0 1 HCds N6114 16 18 23.56 +35 10 26.6 4 0.58 0.82 WS K10 SBG2 UZC N6115 16 24 26 -51 56.9 1 ESOB N6116 16 18 54.57 +35 09 13.5 5 0.68 1.22 WS K10 SBG2 UZC CCA N6117=N6117A 16 19 18.30 +37 05 42.1 4 1.60 1.81 CCA WS UZC SBG2 N6117B 16 19 21.5 +37 04 10 1 K10a N6118 16 21 48.67 -02 17 02.3 6 1.30 2.67 UZC CCA GHD2 DC SPC WS N6119 16 19 41.97 +37 48 22.9 7 1.13 0.58 K01 K10 GSC WS K10a UZC SBG2 N6120 16 19 48.02 +37 46 26.8 9 2.37 1.38 DC K10a K01 WS K10 UZC GSC SBG2 CCA N6121 16 23 35.23 -26 31 34.7 2 3.32 3.96 ESOB SW N6122 16 20 09.533 +37 47 52.87 4 0.51 0.88 Pds KHJ GSC Pds2 N6123 16 17 19.81 +61 56 20.2 4 1.92 1.00 WS CCA UZC DC N6124 16 25 20 -40 39.2 1 ESOB N6125=N6127=N6128 16 19 11.55 +57 59 02.4 6 1.88 0.49 WS Pds UZC GSC CCA DC N6126 16 21 27.907 +36 22 34.83 6 1.63 1.54 DC KHJ K10 UZC CCA SBG2 N6127=N6125=N6128 16 19 11.55 +57 59 02.4 6 1.88 0.49 WS Pds UZC GSC CCA DC N6128=N6125=N6127 16 19 11.55 +57 59 02.4 6 1.88 0.49 WS Pds UZC GSC CCA DC N6129 16 21 43.356 +37 59 45.90 3 1.11 0.58 KHJ UZC SBG2 N6130 16 19 33.35 +57 36 52.8 5 2.21 2.47 DC UZC WS GSC CCA N6131=N6131A 16 21 52.27 +38 55 56.7 4 1.86 1.76 K01 UZC SBG2 CCA N6131B 16 22 00.3 +38 54 56 1 K01 N6132=I4602 16 23 38.81 +11 47 09.9 4 1.03 0.69 WS CCA UZC HCds N6133? 16 20 17.1 +56 39 09 2 1.16 0.71 WS HCds N6133?? 16 22 37.20 +56 35 16.7 1 HCds N6134 16 27 46 -49 09.1 1 ESOB N6135? 16 14 25.08 +64 58 59.0 1 HCds N6135?? 16 18 49.4 +64 53 58 1 WS N6136 16 20 59.48 +55 58 11.4 4 0.67 1.83 Pds WS UZC HCds N6137=N6137A 16 23 03.08 +37 55 20.7 8 2.91 1.65 DC WS Pds UZC HCds SBG2 CCA RC2 N6137B 16 22 59.73 +37 56 58.0 1 HCds N6138=N6363 17 22 40.066 +41 06 06.19 5 0.43 1.19 KHJ UZC DC SBG2 CCA N6139 16 27 40.23 -38 50 56.7 2 3.23 1.56 ESOB SW N6140 16 20 57.14 +65 23 24.1 5 1.71 3.29 GHD1 WS DC GSC CCA N6141 16 23 06.32 +40 51 30.7 1 HCds N6142 16 23 21.08 +37 15 29.3 5 0.54 1.19 WS SBG2 UZC K10 CCA N6143 16 21 42.27 +55 05 09.9 5 1.54 2.07 GHD1 UZC WS DC CCA N6144=?I4606 16 27 13.89 -26 01 26.1 3 3.62 4.88 ESOB HCds SW N6145 16 25 02.36 +40 56 47.1 4 0.49 1.95 SBG2 HCds WS UZC N6146 16 25 10.28 +40 53 34.4 6 0.80 2.29 WS HCds UZC DC SBG2 CCA N6147 16 25 05.83 +40 55 43.7 2 0.16 0.35 HCds IPds N6148 16 27 04.0 +24 05 34 3 0.79 3.00 GD WS Pds N6149 16 27 24.30 +19 35 48.8 4 0.71 1.58 WS UZC CCA GD N6150=N6150A 16 25 49.96 +40 29 18.6 3 1.14 1.04 WS SBG2 UZC N6150B 16 25 44.4 +40 28 32 1 UZC N6151 16 38 25.2 -73 15 09 2 5.53 1.41 HCds WS N6152 16 32 45 -52 38.6 1 ESOB N6153 16 31 30.58 -40 15 13.1 2 0.24 0.14 GSC GSCA N6154 16 25 30.57 +49 50 23.4 5 0.80 1.60 UZC SBG2 CCA WS DC N6155 16 26 08.39 +48 21 59.8 5 0.76 1.10 WS SBG2 DC UZC CCA N6156 16 34 52.7 -60 37 05 2 0.52 7.07 WS ESOB N6157 16 25 48.441 +55 21 37.88 4 0.62 1.09 KHJ UZC HCds Pds N6158 16 27 40.89 +39 22 59.5 5 0.96 1.48 Pds HCds WS UZC SBG2 N6158 n comp 16 27 40.68 +39 23 46.4 1 HCds N6158 se comp 16 27 42.55 +39 22 39.7 2 0.25 0.78 HCds SBG2 N6159 16 27 25.251 +42 40 46.45 4 0.74 0.79 KHJ UZC SBG2 CCA N6160 16 27 41.10 +40 55 36.5 5 0.58 0.44 Pds UZC WS SBG2 CCA N6161 16 28 20.62 +32 48 37.9 4 0.94 2.65 VPS BPP WS HKA N6162 16 28 22.421 +32 50 57.29 7 1.05 0.47 K10 VPS KHJ BPP CCA UZC HKA N6163 16 28 27.928 +32 50 46.32 6 1.27 0.89 K10 KHJ VPS UZC BPP HKA N6164 16 33 41.7 -48 04 47 2 1.42 1.41 ESOB HCds N6164+N6165 16 33 52.5 -48 06 33 2 3.55 8.49 DKM2 ESOB N6165 16 34 03.2 -48 09 05 2 4.25 4.95 ESOB HCds N6166 16 28 38.44 +39 33 04.6 8 1.07 1.62 DC Pds GHD1 CCA GSC WS UZC SBG2 N6166A 16 28 31.03 +39 31 17.4 1 GSC N6166B 16 28 53.19 +39 33 37.4 1 GSC N6166C 16 28 23.31 +39 34 13.2 1 GSC N6166D 16 28 39.25 +39 31 06.8 1 GSC N6166condA 16 28 38.275 +39 33 04.30 3 0.65 0.35 HCo RG PCR N6166condB 16 28 39.175 +39 33 10.09 3 0.76 0.60 HCo RG PCR N6166condC 16 28 39.003 +39 33 02.15 3 0.95 0.74 HCo RG PCR N6166condD 16 28 39.360 +39 33 07.33 2 0.85 0.84 HCo RG N6167 16 34 34 -49 46.3 1 ESOB N6168: 16 31 21.48 +20 11 04.9 4 2.11 0.98 WS UZC CCA HCds N6169 16 34 04 -44 02.7 1 ESOB N6170=N6176 16 27 36.457 +59 33 44.66 4 0.65 1.09 Pds HCds KHJ UZC N6171 16 32 31.94 -13 03 11.5 2 0.52 2.19 SW HCrs N6172=I1213 16 22 10.307 -01 30 54.04 5 0.65 0.78 DC KHJ UZC SPC CCA N6173 16 29 44.95 +40 48 40.1 4 0.64 1.91 UZC SBG2 WS CCA N6174 16 29 59 +40 48.7 1o LdR N6174?nw 16 29 46.45 +40 52 28.5 2 0.24 1.70 HCds WS N6174?se 16 29 47.59 +40 52 17.8 3 1.20 2.14 Pds2 HCds WS N6175 16 29 57.64 +40 37 47.8 4 2.15 1.48 WS CCA UZC SBG2 N6175 comp 16 29 58.1 +40 37 39 2 0.80 1.41 WS UZC N6176=N6170 16 27 36.457 +59 33 44.66 4 0.65 1.09 Pds HCds KHJ UZC N6177 16 30 38.93 +35 03 21.2 7 1.72 1.90 SBG2 WS Pds K10 UZC CCA HC N6178 16 35 47 -45 38.6 1 ESOB N6179 16 30 47.193 +35 06 07.27 3 3.55 1.06 SBG2 KHJ HC N6180 16 30 33.95 +40 32 21.2 3 0.59 0.58 WS UZC SBG2 N6181 16 32 20.95 +19 49 32.0 5 2.75 2.60 WS DC UZC GH CCA N6182 16 29 34.07 +55 31 03.1 5 1.05 1.10 WS UZC Pds HCds CCA N6182 comp1 16 29 32.66 +55 30 23.5 1 HCds N6182 comp2 16 29 25.95 +55 29 18.2 1 HCds N6183 16 41 41.8 -69 22 22 2 0.75 0.00 WS ESOB N6184 16 31 34.49 +40 33 55.4 4 0.97 1.23 WS UZC GSC SBG2 N6185 16 33 17.90 +35 20 30.1 6 0.66 3.09 CCA WS SBG2 HC UZC K10a N6186 16 34 25.48 +21 32 26.1 3 0.95 0.06 WS UZC CCA N6187 16 31 36.700 +57 42 23.98 4 1.02 1.04 Pds KHJ HCds UZC N6188 16 40 05 -48 39.7 1 ESOB N6189=?N6191 16 31 40.75 +59 37 35.8 5 1.59 2.91 DC WS HCds UZC CCA N6190 16 32 06.66 +58 26 20.5 4 1.98 2.66 WS CCA UZC DC N6191? 16 11 30.41 +58 47 09.4 1 HCds N6191?=N6189 16 31 40.75 +59 37 35.8 5 1.59 2.91 DC WS HCds UZC CCA N6192 16 40 23 -43 22.0 1 ESOB N6193 16 41 20 -48 45.8 1 ESOB N6194 16 36 37.10 +36 12 00.9 5 0.97 0.68 WS K10 SBG2 GSC UZC N6195 16 36 32.55 +39 01 39.5 4 1.08 1.11 UZC WS SBG2 CCA N6196=I4615 16 37 53.92 +36 04 21.8 8 0.83 1.92 WS HC UZC DC GSC SBG2 GHD1 CCA N6197=I4616 16 37 59.91 +35 59 44.6 5 0.89 2.77 WS GSC UZC SBG2 HC N6198 16 35 30.791 +57 29 12.36 5 0.77 0.89 KHJ CCA UZC Pds HCds N6199 16 39 28.96 +36 03 32.0 1 GSC N6200 16 44 07 -47 27.8 1 ESOB N6201 16 40 14.5 +23 45 53 4 1.31 1.50 WS Pds UZC GD N6202?=N6226 16 43 23.33 +61 59 01.6 5 1.06 2.54 WS UZC HCds CCA DC N6203 16 40 27.464 +23 46 28.98 4 3.01 1.44 Pds2 UZC KHJ GD N6204 16 46 09 -47 01.0 1 ESOB N6205 16 41 41.22 +36 27 35.3 3 2.44 2.52 HCrs HC2m SW N6206=I1227 16 40 08.02 +58 37 02.0 5 2.24 1.93 UZC CCA WS HCds DC N6207 16 43 03.83 +36 49 56.0 6 2.17 2.02 HC WS CCA SBG2 GSC UZC N6208 16 49 28 -53 43.7 1 ESOB N6209 16 54 58.4 -72 35 12 2 4.15 1.41 WS ESOB N6210 16 44 29.506 +23 47 59.16 6 0.92 1.34 UJ10 PPM GSC Ty2 GD CK N6211 16 41 27.87 +57 47 01.3 7 1.51 1.71 WS UZC CCA HCds GHD1 Pds DC N6212 16 43 23.10 +39 48 23.9 4 0.54 0.82 UZC Pds2 SBG2 WS N6213 16 41 37.22 +57 48 52.8 3 1.05 1.48 Pds WS HCds N6214 16 39 32.09 +66 02 22.7 4 1.88 2.91 WS UZC CCA DC N6215 16 51 06.9 -58 59 34 2 0.55 2.83 Pds WS N6215A 16 52 49.1 -58 56 51 2 4.94 1.41 WS ESOB N6216=N6222 16 49 24 -44 43.7 2 7.55 12.73 HCe ESOB N6217 16 32 39.01 +78 11 53.1 8 2.19 2.40 GHD1 CCA WS HCrs vdH+ HHD UZC DC N6218 16 47 14.36 -01 56 51.7 2 3.50 0.64 HCrs SW N6219 16 46 22.58 +09 02 16.7 4 1.46 0.94 Pds WS UZC HCds N6220 16 47 13.319 -00 16 31.62 6 0.43 0.79 GSC KHJ CCA Pds UZC SPC N6221 16 52 46.22 -59 13 01.5 5 2.87 3.37 GC WS GSC HCds ESOB N6222=N6216 16 49 24 -44 43.7 2 7.55 12.73 HCe ESOB N6223 16 43 04.44 +61 34 41.0 4 1.35 3.11 WS UZC DC CCA N6224 16 48 18.58 +06 18 42.9 5 1.02 0.99 WS UZC CCA Pds HCds N6225 16 48 21.64 +06 13 21.4 5 0.64 0.84 WS UZC CCA HCds Pds N6226=?N6202 16 43 23.33 +61 59 01.6 5 1.06 2.54 WS UZC HCds CCA DC N6227 16 51 33 -41 13.0 1 ESOB N6227 * 16 51 33.72 -41 13 50.0 1 SAO N6228 16 48 02.83 +26 12 44.9 5 1.34 3.43 CCA WS UZC Pds GD N6229 16 46 58.70 +47 31 38.6 2 2.29 1.98 HCrs SW N6230 16 50 46.76 +04 36 15.6 4 0.78 1.35 UZC HCds WS CCA N6231 16 54 10 -41 49.5 1 ESOB N6232 16 43 20.18 +70 37 56.0 6 0.95 1.72 WS Pds UZC GSC CCA DC N6233 16 50 15.678 +23 34 46.48 5 1.32 0.32 GD Pds KHJ UZC CCA N6234 16 51 57.384 +04 23 00.65 3 0.90 0.06 KHJ KEBA UZC N6235 16 53 25.07 -22 10 34.1 2 5.80 6.65 ESOB SW N6236 16 44 34.67 +70 46 48.5 5 2.94 2.39 WS CCA UZC HCo DC N6237 16 44 07 +70 38.1 1o Sw1 N6238 16 47 16.36 +62 08 48.9 4 3.37 0.47 WS DC UZC CCA N6239 16 50 05.34 +42 44 21.8 7 2.37 1.68 HCds WS GHD1 UZC DC CCA SBG2 N6240=I4625 16 52 58.88 +02 24 04.7 9 1.75 2.89 CCO WS GH CCR GSC HCds SPC UZC CCA N6241 16 50 10.96 +45 25 14.2 4 0.50 0.71 SBG2 WS UZC GSC N6242 16 55 33 -39 27.7 1 ESOB N6243 16 52 26.37 +23 19 57.0 4 0.71 1.28 WS UZC GD CCA N6244 16 48 03.87 +62 12 00.8 4 0.76 2.60 UZC DC WS CCA N6245 16 45 22 +70 48.3 1o Sw1 N6246 16 49 53.14 +55 32 35.5 5 2.48 3.54 GHD1 WS UZC CCA DC N6246A 16 50 13.90 +55 23 04.0 5 2.08 1.52 GHD1 WS Pds UZC CCA N6247sw=I1233ne 16 48 21.48 +62 58 44.0 1 HCds N6247sw=I1233sw 16 48 19.76 +62 58 35.1 4 2.72 1.09 WS DC CCA HCds N6248 16 46 22.47 +70 21 19.9 4 1.10 1.45 WS HCo DC CCA N6249 16 57 41 -44 48.7 1 ESOB N6250 16 57 56 -45 56.2 1 ESOB N6251 16 32 32.284 +82 32 15.93 5 1.37 1.79 UZC CCA KHJ HCrs DC N6252 16 32 40.497 +82 34 34.88 4 1.34 1.07 Pds KHJ HCrs UZC N6253 16 59 05 -52 42.5 1 ESOB N6254 16 57 09.16 -04 05 55.8 2 3.70 2.55 SW HCrs N6255 16 54 47.22 +36 30 06.3 7 2.86 2.07 DC UZC GSC SBG2 CCA WS K10 N6256 16 59 32.56 -37 07 16.8 2 2.03 0.42 ESOB SW N6257 16 56 03.50 +39 38 43.3 2 0.90 0.42 WS SBG2 N6258 16 52 29.89 +60 30 51.0 4 1.20 0.95 WS CCA UZC DC N6259 17 00 45 -44 39.3 1 ESOB N6260 16 51 50.19 +63 42 52.7 3 0.69 1.86 Pds HCds WS N6261 16 56 30.546 +27 58 38.85 4 1.19 0.84 BPP KHJ CCA UZC N6262? 16 58 42.93 +57 05 54.7 1 HCds N6262?? 16 52 18.95 +55 54 20.1 1 HCds N6263 16 56 43.249 +27 49 19.30 4 0.57 0.92 KHJ UZC BPP CCA N6264 16 57 16.2 +27 50 57 3 1.33 2.00 WS UZC BPP N6265 16 57 29.151 +27 50 39.42 4 1.20 0.98 UZC KHJ CCA BPP N6266 17 01 12.87 -30 06 44.7 2 4.96 0.42 SW ESOB N6267 16 58 08.61 +22 59 05.3 5 1.57 0.57 DC HCds WS UZC CCA N6268 17 02 10 -39 43.7 1 ESOB N6269 16 57 58.196 +27 51 16.60 5 1.87 1.52 KHJ UZC BPP CCA DC N6270 16 58 44.09 +27 51 33.5 1 HCds N6271 16 58 50.71 +27 57 54.3 3 0.76 1.13 UZC BPP HCds N6272 16 58 58.30 +27 55 50.6 5 1.02 1.60 WS UZC K12 HCds BPP N6273 17 02 37.65 -26 16 03.7 2 0.57 1.20 ESOB SW N6274 16 59 20.48 +29 56 46.5 5 0.71 1.10 WS K12 UZC Pds CCA N6274 comp 16 59 21.42 +29 56 25.1 2 0.28 1.77 CCA WS N6275 16 55 33.7 +63 14 33 4 2.52 2.71 UZC WS KET2 SDP N6276=I1239 17 00 45.085 +23 02 38.70 4 0.15 0.49 KHJ GSC UZC KEBA N6277 17 00 48.9 +23 02 21 1 HCo N6278 17 00 50.28 +23 00 39.6 5 1.36 1.11 DC WS GSC UZC CCA N6279 16 59 01.367 +47 14 13.65 5 0.90 0.49 HCds SBG2 UZC KHJ CCA N6280 17 01 57.5 +06 39 57 3 0.00 0.58 KEBA WS UZC N6280 comp 17 01 58.1 +06 40 00 1 WS N6281 17 04 41 -37 59.1 1 ESOB N6282 17 00 47.1 +29 49 13 3 1.50 2.31 WS BPP UZC N6283 16 59 26.37 +49 55 17.4 5 3.15 1.22 DC CCA WS SBG2 UZC N6284 17 04 28.71 -24 45 51.1 2 2.12 3.04 ESOB SW N6285 16 58 24.03 +58 57 20.5 4 0.97 1.55 Pds WS UZC HCds N6286 16 58 31.81 +58 56 14.5 5 0.49 0.96 UZC CCA WS DC HCds N6287 17 05 09.09 -22 42 25.4 2 4.70 4.81 ESOB SW N6288 16 57 24.619 +68 27 23.64 4 1.21 1.34 Pds KHJ UZC HCds N6288 comp 16 57 25.17 +68 27 44.1 1 HCds N6289 16 57 44.96 +68 30 50.5 3 1.01 0.90 Pds UZC HCds N6289 comp 16 57 44.77 +68 30 58.5 1 HCds N6290 17 00 56.37 +58 58 12.6 7 2.23 1.38 Pds UZC WS KEBA HCds CCA DC N6291 17 00 55.78 +58 56 14.4 2 0.49 1.91 WS HCds N6292 17 03 03.73 +61 02 38.8 4 2.96 4.46 UZC WS CCA DC N6293 17 10 10.44 -26 34 55.6 2 0.57 1.84 SW HCds N6294 17 10 16.2 -26 34 27 2 0.95 1.41 WS HCds N6294 nw* 17 10 15.89 -26 34 24.8 1 HCds N6294 se* 17 10 16.60 -26 34 32.0 1 HCds N6295 17 03 15.34 +60 20 15.1 4 0.57 1.88 Pds WS HCds CCA N6296 17 08 44.61 +03 53 38.4 5 1.86 1.22 GH UZC CCA WS DC N6297=N6298 17 03 36.527 +62 01 32.15 5 0.86 0.96 HCds KHJ UZC CCA DC N6298=N6297 17 03 36.527 +62 01 32.15 5 0.86 0.96 HCds KHJ UZC CCA DC N6299 17 05 04.335 +62 27 27.92 3 1.46 0.69 Pds KHJ HCds N6300 17 17 00.01 -62 49 14.4 2 2.62 0.35 WS HCds N6301=I4643 17 08 32.78 +42 20 19.3 5 1.03 0.49 HCds WS UZC SBG2 CCA N6302 17 13 44.25 -37 06 11.5 6 2.49 2.93 BSV BSV ESOB DKM1 CK GSC N6303 17 05 02.77 +68 49 39.3 4 0.46 1.47 HCds UZC CCA WS N6304 17 14 32.09 -29 27 43.3 2 7.58 1.34 ESOB SW N6305 17 18 00.8 -59 10 17 3 1.33 0.58 ESOB Pds WS N6306 17 07 37.01 +60 43 43.6 5 2.72 2.88 GHD1 UZC WS CCA DC N6307 17 07 40.50 +60 45 02.5 5 0.97 2.64 WS GHD1 UZC CCA DC N6308 17 11 59.73 +23 22 48.0 5 1.82 3.11 DC WS UZC GH CCA N6309 17 14 04.32 -12 54 37.9 3 0.42 0.53 GSC CK GSCA N6310 17 07 57.48 +60 59 23.5 5 2.27 1.93 GHD1 WS UZC CCA DC N6311 17 10 43.56 +41 39 03.4 4 1.02 1.05 SBG2 WS UZC CCA N6312 17 10 48.118 +42 17 15.01 3 1.03 0.59 SBG2 KHJ UZC N6313 17 10 20.83 +48 19 53.6 4 1.16 1.59 SBG2 WS CCA UZC N6314 17 12 38.798 +23 16 13.50 5 0.81 1.38 UZC DC KHJ GH CCA N6315 17 12 46.1 +23 13 24 3 0.80 2.00 WS UZC GH N6316 17 16 37.11 -28 08 22.7 2 5.80 1.91 ESOB SW N6317 17 08 59.45 +62 53 52.3 3 0.93 1.47 WS Pds HCds N6318 17 16 11 -39 25.5 1 ESOB N6319 17 09 44.24 +62 58 23.1 5 1.91 2.61 UZC CCA WS HCds DC N6320 17 12 55.68 +40 15 59.1 4 1.04 0.82 WS UZC SBG2 CCA N6321 17 14 24.29 +20 18 49.0 5 2.14 2.22 WS HCds CCA UZC DC N6322 17 18 25 -42 56.0 1 ESOB N6323 17 13 17.96 +43 46 55.0 5 0.81 1.68 WS SBG2 Hu CCA UZC N6324 17 05 25.22 +75 24 25.0 6 0.84 0.82 KEBA CCA HCrs UZC WS DC N6325 17 17 58.95 -23 45 57.5 2 6.12 0.28 ESOB SW N6326 17 20 46.28 -51 45 17.1 4 1.17 1.63 ESOB DKM2 GSC GSCA N6327 17 14 02.18 +43 38 55.0 2 0.46 2.47 SBG2 WS N6328 17 23 40.9923 -65 00 36.749 3 0.41 0.13 ESOB WS USNO N6329 17 14 15.11 +43 41 03.7 6 0.95 0.54 SBG2 CCA Hu WS UZC DC N6330 17 15 44.45 +29 24 14.3 4 0.85 1.72 WS UZC BPP CCA N6331 17 03 34.0 +78 37 43 1o Big N6331m 17 03 34.1 +78 37 46 3 0.61 1.15 HCrs HCo WS N6331m+se 17 03 35.03 +78 37 47.1 2 0.08 2.62 GSC GD N6331nw 17 03 29.21 +78 37 54.4 2 0.35 0.07 HCrs GSC N6331se 17 03 35.8 +78 37 42 2 1.46 0.00 HCrs HCo N6332 17 15 02.88 +43 39 35.7 5 1.36 0.88 WS SBG2 UZC CCA Hu N6333 17 19 11.77 -18 30 58.2 2 0.30 0.49 ESOB SW N6334 17 20 49 -36 06.2 1 ESOB N6335 17 19 31 -30 09.8 1 HCo N6335: 17 19 38 -30 10.8 1 ESOB N6335? 17 20 30.0 -30 08 59 1 WS N6336 17 16 16.66 +43 49 13.3 6 2.11 0.77 WS HCds SBG2 UZC CCA DC N6337 17 22 15.77 -38 29 00.5 6 2.82 2.16 CK LK SL UB10 ESOB DKM1 N6338 17 15 22.76 +57 24 40.8 5 1.81 2.73 WS DC UZC HCds CCA N6339 17 17 06.62 +40 50 41.6 5 1.23 2.27 UZC CCA WS DC SBG2 N6340 17 10 24.90 +72 18 17.4 5 2.92 2.69 WS GHD1 UZC CCA DC N6341 17 17 07.41 +43 08 11.4 2 2.24 0.07 SW HCrs N6342 17 21 10.14 -19 35 14.0 2 0.20 0.92 SW ESOB N6343 17 17 16.24 +41 03 09.3 3 0.57 1.29 WS SBG2 UZC N6344 17 17 18.1 +42 26 03 1 HCds N6344 ne* 17 17 18.91 +42 26 10.7 1 HCds N6344 sw* 17 17 17.42 +42 25 56.3 1 HCds N6345 17 15 24.12 +57 21 01.0 4 1.32 1.37 WS Pds HCds UZC N6346 17 15 24.39 +57 19 21.4 3 1.01 1.67 HCds WS UZC N6347=I1253 17 19 54.73 +16 39 37.6 4 2.46 1.30 WS UZC CCA HCds N6348nw 17 18 21.208 +41 38 51.19 2 0.48 0.17 KHJ SBG2 N6348se 17 18 23.78 +41 38 31.5 1 SBG2 N6349 17 19 06.595 +36 03 39.11 4 0.90 0.50 KHJ HCds UZC SBG2 N6350 17 18 42.25 +41 41 39.4 5 1.08 2.29 DC WS UZC CCA SBG2 N6351 17 19 11.13 +36 03 35.6 2 4.03 2.62 WS IPds N6351ne 17 19 11.63 +36 03 39.7 2 0.17 0.71 HCds IPds N6351nw 17 19 10.88 +36 03 39.0 1 HCds N6351nw+se 17 19 11.09 +36 03 37.3 2 0.09 0.21 IPds HCds N6351se 17 19 11.12 +36 03 36.7 1 HCds N6351sw 17 19 10.23 +36 03 32.2 1 HCds N6352 17 25 29.14 -48 25 21.2 2 0.42 0.78 ESOB SW N6353 17 21 12.42 +15 41 17.1 2 1.02 2.40 WS HCds N6354 17 24 34.0 -38 32 31 3 2.95 1.15 HCds WS ESOB N6355 17 23 58.53 -26 21 10.0 2 2.28 3.32 ESOB SW N6356 17 23 34.97 -17 48 51.9 2 0.61 7.07 ESOB SW N6357 17 24 43 -34 12.1 1 ESOB N6358 17 18 53.03 +52 36 55.1 4 1.36 0.39 WS CCA UZC HCds N6359 17 17 53.17 +61 46 49.5 5 2.14 0.61 UZC WS CCA GHD1 DC N6360 17 24 27 -29 52.3 1 HCo N6360? 17 24 36 -29 53.0 1 ESOB N6361 17 18 40.91 +60 36 29.1 4 2.78 2.45 DC WS UZC CCA N6362 17 31 54.94 -67 02 54.0 2 0.70 2.47 SW ESOB N6363=N6138 17 22 40.066 +41 06 06.19 5 0.43 1.19 KHJ UZC DC SBG2 CCA N6364 17 24 27.38 +29 23 24.5 5 1.71 1.25 UZC BPP WS CCA DC N6365n 17 22 43.31 +62 10 23.8 3 1.93 2.65 STMM WS CCA N6365s 17 22 43.74 +62 09 55.8 3 1.86 1.00 STMM CCA WS N6366 17 27 44.38 -05 04 35.6 2 1.06 0.35 SW HCrs N6367 17 25 08.965 +37 45 35.49 3 0.48 0.10 UZC SBG2 KHJ N6368 17 27 11.49 +11 32 33.7 4 1.58 1.50 WS DC UZC CCA N6369 17 29 20.52 -23 45 34.2 8 2.64 1.22 LK BASm SL HCds UCA1 CK DKM1 ESOB N6370 17 23 25.22 +56 58 29.3 4 1.15 2.81 WS DC UZC CCA N6371 17 27 20.52 +26 30 17.6 5 0.90 1.36 HCds Pds JA WS UZC N6372 17 27 31.90 +26 28 28.4 6 0.83 1.52 HCds WS DC Pds UZC CCA N6373 17 24 08.16 +58 59 42.6 4 1.00 3.83 WS UZC CCA DC N6374=N6383 17 34 42.47 -32 34 54.0 2 0.45 0.14 HCds SAO N6375 17 29 21.884 +16 12 23.87 5 1.27 0.48 DC KHJ Pds UZC CCA N6376 17 25 19.18 +58 49 00.9 4 1.11 1.28 K12 CCA WS DC N6377 17 25 23.08 +58 49 20.8 4 1.16 0.83 Pds WS DC CCA N6378 17 30 41.96 +06 16 54.3 4 2.41 2.26 WS UZC CCA HCds N6379 17 30 35.00 +16 17 18.4 4 2.18 1.24 UZC CCA WS HCds N6380 17 34 28.22 -39 04 09.9 2 3.30 1.27 DM SPP N6381 17 27 17.00 +60 00 50.5 6 1.78 2.65 GSC UZC WS CCA GHD1 DC N6382 17 27 55.18 +56 52 06.4 4 1.30 0.82 Pds WS UZC HCds N6383=N6374 17 34 42.47 -32 34 54.0 2 0.45 0.14 HCds SAO N6384 17 32 24.33 +07 03 37.3 8 2.08 1.47 WS GH HC2m GSC UZC CCA HCds DC N6385 17 28 01.57 +57 31 18.1 5 1.13 1.05 CCA WS UZC HCds DC N6386 17 28 51.816 +52 43 23.75 4 1.06 0.54 Pds KHJ UZC HCds N6387 17 28 24.5 +57 32 38 1 Pds N6387e 17 28 25.57 +57 32 40.7 1 HCds N6387w 17 28 23.88 +57 32 42.9 2 0.17 0.57 HCds WS N6388 17 36 17.30 -44 44 07.7 2 3.77 2.62 SW ESOB N6389 17 32 39.87 +16 24 07.4 4 1.80 3.13 WS UZC CCA DC N6390 17 28 28.15 +60 05 39.3 6 1.22 1.97 GSC WS UZC Pds CCA DC N6391 17 28 49.01 +58 51 02.4 4 0.12 1.30 HCds WS UZC Pds N6392 17 43 30.6 -69 47 05 2 0.37 0.71 ESOB WS N6393? 17 30 08.33 +59 31 54.5 3 1.52 2.00 K12 HCds WS N6394 17 30 21.42 +59 38 23.5 4 0.50 2.33 WS HCds UZC CCA N6395 17 26 31.34 +71 05 46.8 3 1.48 1.08 WS UZC CCA N6396 17 37 36 -35 01.6 1 ESOB N6397 17 40 41.80 -53 40 26.3 2 5.47 1.41 SW ESOB N6398 17 42 43.6 -61 41 35 2 2.52 5.66 ESOB WS N6399 17 31 50.38 +59 36 54.7 5 0.38 0.88 CCA Pds UZC HCds WS N6400 17 40 12 -36 56.9 1 ESOB N6401 17 38 36.58 -23 54 32.8 2 6.69 1.77 ESOB SW N6402 17 37 36.10 -03 14 42.9 2 1.27 3.39 HCrs SW N6403 17 43 23.5 -61 40 54 2 1.51 2.83 ESOB WS N6404 17 39 37 -33 14.8 1 ESOB N6405 17 40 20 -32 15.2 1 ESOB N6406 17 38 19.12 +18 49 57.3 2 1.41 2.40 HCds WS N6407 17 44 57.7 -60 44 23 2 0.52 2.12 ESOB WS N6408 17 38 47.351 +18 52 40.84 4 1.23 1.29 DC KHJ CCA UZC N6409 17 36 35.38 +50 45 56.8 3 0.95 0.50 WS SBG2 UZC N6410 17 35 20.51 +60 47 32.1 2 0.21 4.10 HCds WS N6411 17 35 32.78 +60 48 47.9 5 0.92 2.95 WS DC CCA UZC HCds N6412 17 29 36.76 +75 42 14.0 6 2.23 3.05 GHD1 DC HCrs WS CCA UZC N6413 17 40 40.69 +12 37 24.9 2 0.62 1.84 WS HCds N6414 17 30 36.990 +74 22 33.13 3 0.54 0.88 KHJ Pds CCA N6415 17 44.3 -35 04 1 HCe N6416 17 44 19 -32 21.7 1 ESOB N6417 17 41 47.86 +23 40 18.1 3 0.93 1.79 WS UZC CCA N6418 17 38 09.32 +58 42 53.0 4 0.73 1.14 Pds UZC HCds WS N6419 17 36 05.80 +68 09 19.7 5 1.29 1.12 WS Pds HCds UZC CCA N6420 17 36 16.20 +68 03 07.8 5 0.64 2.63 Pds2 HCds WS GSC Pds N6421 17 45 44 -33 41.6 1o JH N6422 17 36 29.90 +68 03 30.1 3 0.47 1.97 WS HCds GSC N6423 17 36 53.22 +68 10 16.6 3 0.67 2.67 HCds WS KEBA N6424 17 36 12.128 +69 59 21.25 4 0.58 2.71 KHJ UZC DC CCA N6425 17 47 01 -31 31.8 1 ESOB N6426 17 44 54.70 +03 10 11.1 2 0.32 2.05 HCrs SW N6427=N6431 17 43 38.64 +25 29 37.4 5 1.29 1.64 WS UZC Pds CCA HCds N6428 17 43 52.85 +25 33 23.4 1 HCds N6428 comp * s 17 43 52.80 +25 33 10.6 1 HCds N6429 17 44 05.38 +25 21 00.7 3 0.87 0.55 WS UZC CCA N6430 17 45 14.30 +18 08 19.3 2 1.31 2.19 WS HCds N6431=N6427 17 43 38.64 +25 29 37.4 5 1.29 1.64 WS UZC Pds CCA HCds N6432 17 47 22.5 -24 53 15 3 2.08 2.08 HCm WS ESOB N6433 17 43 56.20 +36 47 58.8 5 2.58 2.76 DC WS SBG2 UZC CCA N6434 17 36 48.72 +72 05 19.7 4 1.17 3.27 DC WS UZC CCA N6435 17 40 11.00 +62 38 30.0 5 1.00 0.92 Pds HCds WS UZC CCA N6436 17 41 13.26 +60 26 58.5 5 0.48 1.28 WS UZC HCds Pds CCA N6437 17 48.4 -35 21 1 HCe N6438 18 22 16.51 -85 24 06.3 3 1.30 1.57 WS ESOB HCds N6438A 18 22 34.26 -85 24 23.1 2 2.22 0.28 WS HCds N6439 17 48 19.828 -16 28 44.25 7 0.66 0.36 GSC2 GSCA UB10 CK HCds HC2m UCA2 N6440 17 48 52.60 -20 21 38.9 2 1.39 6.08 ESOB SW N6441 17 50 12.99 -37 03 03.1 2 2.71 1.20 SW ESOB N6442 17 46 51.312 +20 45 38.03 5 1.83 2.36 DC Pds KHJ UZC CCA N6443 17 44 33.72 +48 06 51.0 4 1.91 1.23 SBG2 WS UZC CCA N6444 17 49 35 -34 49.2 1 ESOB N6445 17 49 15.01 -20 00 36.2 5 2.74 2.55 GSCm CK SL ESOB DKM1 N6446 17 46 07.55 +35 34 09.0 4 0.60 0.96 WS SBG2 KEBA UZC N6447 17 46 17.23 +35 34 18.5 4 1.18 1.07 WS CCA UZC SBG2 N6448 17 44 20 +53 32.4 1o Sw2 N6449 17 43 46.38 +56 48 13.8 4 1.28 1.48 HCds UZC CCA WS N6450 17 47 32 +18 34.5 1o Sw2 N6451 17 50 41 -30 12.6 2 9.17 8.49 BSV ESOB N6452 17 47 58.50 +20 50 13.8 4 0.42 0.82 WS Pds UZC HCds N6453 17 50 51.79 -34 35 54.2 2 0.44 1.34 SW ESOB N6454 17 44 56.58 +55 42 16.0 3 0.43 2.61 WS HCds UZC N6455: 17 51 08 -35 20.3 1 HCe N6456 17 42 31.71 +67 35 31.8 2 0.40 1.13 Pds GSC N6457 17 42 52.74 +66 28 33.1 5 0.78 1.19 Pds WS HCds UZC CCA N6458 17 49 11.010 +20 48 14.14 4 0.92 0.95 HCds KHJ UZC CCA N6459 17 45 47.10 +55 46 36.1 3 0.49 1.21 HCds WS Pds N6460 17 49 30.387 +20 45 48.15 3 0.54 0.96 KHJ DC CCA N6461 17 39 56.61 +74 02 04.0 1 HCds N6462 17 44 48.6 +61 54 37 4 1.91 2.06 HC WS KEBA UZC N6463 17 43 34.314 +67 36 11.75 5 1.05 0.93 UZC Pds GSC KHJ HCds N6464 17 45 47.6 +60 53 47 3 2.95 1.00 K12 WS HC N6465 17 52 55.5 -25 23 53 3 1.36 2.31 WS ESOB HCds N6466 17 48 08.09 +51 23 56.4 4 0.62 0.96 WS Pds UZC HCds N6467 17 50 38 +17 32.4 1o Mar N6467=?N6468 17 50 40.157 +17 32 16.88 5 1.05 1.45 DC HCds KHJ UZC CCA N6467?? 17 50 34.66 +17 33 15.5 1 HCds N6468 17 50 39 +17 32.4 1o Mar N6468?=N6467 17 50 40.157 +17 32 16.88 5 1.05 1.45 DC HCds KHJ UZC CCA N6468?? 17 50 51.67 +17 32 25.1 1 HCds N6469 17 53 12 -22 16.5 1 ESOB N6470 17 44 14.84 +67 37 08.7 6 1.39 1.42 WS Pds GSC CCA UZC HCds N6471e 17 44 18.10 +67 35 26.7 3 1.67 1.82 WS GSC HCds N6471w 17 44 12.93 +67 35 33.5 5 1.47 1.61 WS Pds GSC UZC HCds N6472 17 44 03.194 +67 37 48.73 3 1.27 0.92 GSC KHJ HCds N6473 17 46 54 +57 18.5 1o Sw4 N6473? 17 46 58.24 +57 14 23.5 1 HCds N6473?? 17 47 05.90 +57 18 35.7 1 HCds N6474 17 47 05.44 +57 18 04.9 5 0.40 1.33 UZC CCA HCds WS Pds N6475 17 53 51 -34 47.6 1 ESOB N6476 17 54 02 -29 08.7 1 HCe N6477 17 44 30.30 +67 36 37.0 1 HCds N6478 17 48 38.24 +51 09 24.2 5 2.28 3.50 DC WS UZC CCA GHD1 N6479 17 48 21.67 +54 08 56.8 4 0.85 0.40 DC CCA UZC WS N6480 17 54 26 -30 27.1 1 HCe N6481 17 52 49.0 +04 10 01 2 1.06 3.54 HCds WS N6482 17 51 48.92 +23 04 19.0 5 1.51 0.83 WS CCA UZC DC GH N6483 17 59 30.78 -63 40 08.5 2 2.78 0.35 WS HCds N6484 17 51 46.84 +24 28 59.4 5 3.14 2.14 DC WS KEB1 CCA UZC N6485 17 51 52.84 +31 27 43.3 5 0.91 3.03 UZC WS BPP CCA DC N6486 17 52 35.342 +29 49 04.58 3 0.81 0.23 KHJ UZC BPP N6487 17 52 41.93 +29 50 18.1 5 2.35 1.24 WS UZC CCA BPP DC N6488 17 49 20.843 +62 13 22.51 3 1.12 0.00 HC KHJ KEBA N6489 17 50 01.35 +60 05 32.0 2 0.16 1.27 UZC HCds N6490 17 54 30.486 +18 22 32.20 5 0.53 1.29 HCds KHJ Pds UZC CCA N6491 17 50 00.70 +61 31 54.0 7 1.79 1.98 HC WS GHD1 GSC UZC CCA DC N6492 18 02 48.1 -66 25 49 2 1.27 3.54 ESOB WS N6493 17 50 22.54 +61 33 32.4 6 0.84 0.84 Pds HC WS HCo UZC CCA N6494 17 57 04 -18 59.1 1 ESOB N6495 17 54 50.755 +18 19 36.75 4 1.16 0.86 DC UZC KHJ CCA N6496 17 59 03.64 -44 16 00.3 3 3.27 1.71 HCo HCds ESOB N6497=N6498 17 51 17.92 +59 28 15.3 5 1.47 1.93 DC WS UZC HCds CCA N6498=N6497 17 51 17.92 +59 28 15.3 5 1.47 1.93 DC WS UZC HCds CCA N6499 17 55 20.01 +18 21 33.5 2 0.00 2.26 WS HCds N6500 17 55 59.777 +18 20 18.12 6 1.16 0.44 GH KHJ JCR HHD UZC CCA N6501 17 56 03.746 +18 22 23.95 4 0.62 1.51 GH KHJ CCA DC N6502 18 04 13.4 -65 24 35 2 5.30 1.41 ESOB WS N6503 17 49 26.84 +70 08 40.2 10 2.54 2.59 GHD1 UZC GSC HC2m CCA HCds HCds GSCM WS DC N6504 17 56 05.79 +33 12 31.6 5 2.91 2.61 WS UZC CCA SBG2 DC N6505 17 51 07.472 +65 31 50.33 5 0.77 0.56 Pds KHJ HCds CCA UZC N6506 17 59 53 -24 41.0 2 9.64 12.73 HCe ESOB N6507 17 59 50 -17 27.0 1 HCe N6508 17 49 46.784 +72 01 17.18 4 2.43 3.40 KHJ UZC CCA DC N6509 17 59 25.24 +06 17 11.8 4 3.78 0.48 DC UZC WS CCA N6510=N6511 17 54 39.53 +60 49 04.0 6 2.30 2.62 WS UZC CCA K12 DC HC N6511=N6510 17 54 39.53 +60 49 04.0 6 2.30 2.62 WS UZC CCA K12 DC HC N6512 17 54 50.343 +62 38 40.45 2 0.35 2.61 KHJ HC N6513 17 59 34.26 +24 53 13.1 5 1.33 1.28 Pds UZC WS HCds CCA N6514 18 02 42 -22 58.3 1 ESOB N6515 17 57 25.16 +50 43 39.3 6 1.48 2.24 DC SBG2 UZC CCA WS Pds N6516 17 55 16.5 +62 40 07 3 0.69 1.53 HC Pds WS N6517 18 01 50.65 -08 57 31.7 2 1.47 0.21 SW HCrs N6518 17 59 43.754 +28 51 59.79 2 0.12 0.28 KHJ BPP N6519 18 03 20.13 -29 48 15.3 1 HCm N6519 ne * 18 03 20.56 -29 48 10.1 1 HCds N6519 sw * 18 03 19.69 -29 48 20.4 1 HCds N6520 18 03 24 -27 53.3 2 9.37 12.73 ESOB BSV N6521 17 55 48.25 +62 36 42.2 5 2.12 1.86 HC WS UZC CCA DC N6521A 17 56 35.0 +62 36 58 1 UZC N6522=??N6551 18 03 35.3 -30 02 06 3 2.25 3.00 HCo ESOB BSV N6523 18 03 41.3 -24 22 48 1 HCo N6524 17 59 14.80 +45 53 14.7 5 1.03 0.96 SBG2 UZC WS DC CCA N6525 18 02 06.0 +11 01 29 1 WS N6525 core 18 02 04.7 +11 02 17 1 HCds N6526 18 04 06 -24 26.5 1 HCe N6527 18 01 46.375 +19 43 43.12 4 0.83 0.71 CCA KHJ UZC HCds N6528 18 04 49.52 -30 03 21.4 2 1.47 0.78 ESOB SW N6529 18 05 29 -36 17.8 2 8.55 8.49 ESOB WS N6530 18 04 31 -24 21.5 2 0.00 4.24 HCe ESOB N6531 18 04 13 -22 29.4 1 ESOB N6532 17 59 13.96 +56 13 53.2 5 1.41 1.03 WS Pds UZC CCA HCds N6533 18 04.1 -24 23 1 HCe N6534 17 57 18 +64 18.2 1o Sw4 N6534? 17 56 08.8 +64 16 53 1 Pds2 N6535 18 03 50.66 -00 17 51.4 2 0.64 3.46 HCrs SW N6536 17 57 16.47 +64 56 15.7 5 1.05 1.83 WS K10 UZC CCA DC N6537 18 05 13.06 -19 50 34.6 3 0.81 0.36 GSC CK UCA1 N6538 17 54 16.73 +73 25 25.8 4 3.04 0.96 DC CCA WS UZC N6539 18 04 49.66 -07 35 11.4 2 1.68 3.32 HCrs SW N6540 18 06 08.3 -27 45 50 2 5.63 6.36 ESOB DM N6541 18 08 02.00 -43 42 57.0 2 5.06 0.28 HCo HCds N6542 17 59 38.84 +61 21 32.9 7 1.23 1.85 UZC K12 HC2m CCA WS HC DC N6543 17 58 33.366 +66 37 59.00 11 0.41 0.47 HCds UJ10 GSC 2MSP AGK3 GSC2 PPM Ty2 UB10 HC2m CK N6544 18 07 20.02 -24 59 53.5 2 1.44 1.13 ESOB HCds N6545 18 12 15.1 -63 46 34 2 2.34 0.71 WS ESOB N6546 18 07 22 -23 17.8 1 ESOB N6547 18 05 10.00 +25 13 56.9 3 0.00 1.57 WS UZC CCA N6548 18 05 59.23 +18 35 13.3 6 1.57 1.52 DC WS GSCA HCds UZC CCA N6549=N6550 18 05 49.448 +18 32 16.23 7 1.07 1.51 CCA WS Pds GSCA UZC HCds UA20 N6550=N6549 18 05 49.448 +18 32 16.23 7 1.07 1.51 CCA WS Pds GSCA UZC HCds UA20 N6551 18 09.0 -29 33 1o Le1 N6551?? 18 08 46.3 -29 34 17 2 30.44 17.68 ESOB WS N6551??=N6522 18 03 35.3 -30 02 06 3 2.25 3.00 HCo ESOB BSV N6552 18 00 07.28 +66 36 53.7 5 1.08 0.92 WS GSC K10 UZC CCA N6553 18 09 17.36 -25 54 30.2 2 2.38 2.76 HCds ESOB N6554 18 09 23 -18 22.7 1 HCds N6554? 18 08 59 -18 26.1 2 20.12 12.73 ESOB WS N6555 18 07 49.10 +17 36 17.0 5 2.17 2.08 GH WS DC UZC CCA N6556 18 09 57 -27 31.5 1 HCe N6557 18 21 25.1 -76 34 59 2 1.47 0.71 WS ESOB N6558 18 10 18.26 -31 45 47.3 2 2.25 1.77 ESOB SW N6559ne 18 09 56.85 -24 06 23.0 1 HCds N6559sw 18 09 57 -24 06.6 1 ESOB N6560 18 05 13.86 +46 52 52.6 5 1.93 1.70 DC WS SBG2 UZC CCA N6561 18 10 30 -16 43.5 1 HCe N6561? 18 10 29.9 -16 47 59 1 WS N6562 18 05 00.799 +56 15 46.16 4 1.24 0.90 Pds HCds UZC KHJ N6563 18 12 02.57 -33 52 07.4 5 0.91 4.09 LK CK ESOB BSV UB10 N6564 18 09 02.4 +17 23 40 1 HCds N6564 ne * 18 09 02.67 +17 23 42.8 1 HCds N6564 nw * 18 09 02.02 +17 23 47.5 1 HCds N6564 sw * 18 09 02.41 +17 23 30.5 1 HCds N6565 18 11 52.58 -28 10 40.8 5 2.04 2.21 GSC GSCA ESOB CK DKM1 N6566 18 07 00.82 +52 15 36.4 4 1.99 1.39 UZC WS HCds Pds2 N6567 18 13 45.12 -19 04 34.3 5 2.33 1.27 ESOB BSV UCA1 GSC CK N6568 18 12 44 -21 36.3 2 9.86114.55 ESOB BSV N6569 18 13 38.79 -31 49 35.4 2 1.62 0.42 HCds SW N6570 18 11 07.41 +14 05 33.5 5 1.57 1.31 WS UZC CCA GH DC N6571 18 10 49.36 +21 14 19.3 4 1.19 0.75 Pds WS HCds UZC N6572 18 12 06.327 +06 51 12.93 4 0.43 0.36 Ty2 PPM GSC CK N6573? 18 13 49 -22 08.9 1o JH N6573?? 18 14 22 -22 10.5 1 HCe N6573??? 18 13 41.7 -22 07 11 2 3.93 2.12 WS ESOB N6574=N6610 18 11 51.25 +14 58 52.6 3 0.67 1.10 WS UZC CCA N6575 18 10 57.47 +31 06 58.5 5 0.82 2.67 BPP DC WS UZC CCA N6576 18 11 48.035 +21 25 42.10 4 0.87 1.66 Pds UZC KHJ HCds N6577 18 12 01.239 +21 27 49.22 5 0.79 0.96 UZC KHJ GSC CCA HCds N6578 18 16 16.51 -20 27 02.5 3 0.92 0.17 GSC UCA1 CK N6579 18 12 31.84 +21 25 14.4 6 1.92 2.33 HCo CCA WS UZC GSC DC N6580 18 12 33.70 +21 25 33.5 4 0.91 2.17 Pds WS GSC CCA N6581=I1280 18 12 18.432 +25 39 43.99 6 0.65 1.46 HCds GSC KHJ UZC HCo Pds N6582e 18 11 05.16 +49 54 33.6 3 0.80 0.76 SBG2 GSC CCA N6582w 18 11 01.84 +49 54 42.7 3 1.02 0.47 SBG2 GSC CCA N6583 18 15 49 -22 08.2 2 9.82 4.24 ESOB BSV N6584 18 18 37.72 -52 12 57.0 2 0.91 3.39 SW ESOB N6585 18 12 21.82 +39 37 58.0 5 1.47 0.47 CCA WS UZC SBG2 DC N6586 18 13 38.45 +21 05 25.4 5 1.44 1.04 WS Pds UZC HCds CCA N6587 18 13 50.917 +18 49 32.10 5 2.79 2.58 DC UZC KHJ CCA GH N6588 18 21 27 -63 48.4 1o JH N6588: 18 20 58.8 -63 48 35 1 HCds N6588? 18 21 15.4 -63 48 17 1 HCds N6588?? 18 21 35.4 -63 47 31 1 HCds N6589=:I4690 18 16 53.6 -19 46 39 2 35.93 2.12 ESOB HCds N6590=N6595=I4700 18 17 04.9 -19 51 57 2 1.00 0.00 ESOB HCds N6591: 18 14 03.6 +21 03 47 2 1.98 0.71 HCm WS N6591? 18 14 12.37 +21 04 07.7 1 HCds N6591?? 18 13 55.4 +21 05 22 1 HCds N6592 18 09 50.845 +61 25 19.02 3 1.52 0.11 KHJ UZC GD N6593 18 14 03.55 +22 17 01.7 4 1.08 1.33 WS Pds UZC HCds N6594 18 10 05.5 +61 08 01 4 0.00 3.86 Pds WS UZC GD N6595=N6590=I4700 18 17 04.9 -19 51 57 2 1.00 0.00 ESOB HCds N6596 18 17 33 -16 39.0 1 HCe N6597 18 11 13.400 +61 10 50.64 4 0.83 0.89 GD Pds KHJ GSC N6598 18 08 55.78 +69 04 05.5 4 0.90 1.60 CCA UZC WS DC N6599=:N6600 18 15 42.943 +24 54 44.40 5 1.65 0.62 DC HCds KHJ CCA UZC N6600:=N6599 18 15 42.943 +24 54 44.40 5 1.65 0.62 DC HCds KHJ CCA UZC N6601 18 11 44.18 +61 27 09.9 3 0.86 1.53 Pds WS GSC N6602 18 16 34.35 +25 02 37.6 6 0.99 1.70 WS GSC CCA UZC HCds Pds N6603 18 18 26 -18 24.4 1 ESOB N6604 18 18 03.0 -12 14 35 1 HCds N6605 18 16.4 -15 00 1 HCe N6606 18 14 41.53 +43 16 06.8 5 1.92 1.49 WS DC UZC SBG2 CCA N6607 18 12 15.05 +61 19 58.3 3 2.17 0.76 GSC WS GD N6608 18 12 29.2 +61 17 53 3 2.73 1.00 HCo WS GD N6609 18 12 33.57 +61 19 54.6 4 0.40 1.44 UZC WS GSC GD N6610=N6574 18 11 51.25 +14 58 52.6 3 0.67 1.10 WS UZC CCA N6610?? 18 18 59.33 +16 14 59.5 1 HCds N6611 18 18 48 -13 48.4 1 HCe N6612 18 16 10.94 +36 04 42.9 2 0.17 0.00 WS SBG2 N6613 18 19 58.5 -17 06 07 1 HCds N6614 18 25 07.5 -63 14 53 2 2.38 3.54 WS ESOB N6615 18 18 33.45 +13 15 53.4 4 1.15 1.25 WS UZC GH CCA N6616 18 17 41.12 +22 14 16.5 5 1.37 1.87 WS HCds Pds UZC CCA N6617 18 14 02.70 +61 19 09.7 4 1.26 1.77 Pds HCds CCA WS N6618 18 20 47 -16 10.3 1 HCe N6619 18 18 55.40 +23 39 20.0 3 3.78 3.55 DC WS CCA N6620 18 22 54.28 -26 49 16.9 5 1.58 1.29 GSC 2MSP DKM1 CK ESOB N6621 18 12 59.69 +68 21 11.9 3 2.77 3.42 WS GSC DC N6622 18 12 55.50 +68 21 47.9 5 1.51 2.61 GSC UZC GHD1 WS DC N6623 18 19 42.89 +23 42 33.4 4 0.67 1.27 WS UZC CCA DC N6623 comp 18 19 42.7 +23 42 04 1 WS N6624 18 23 40.64 -30 21 40.0 3 2.01 1.44 KD SW ESOB N6625: 18 23 01 -12 01.4 1 HCe N6625? 18 22 49 -11 57.7 1 HCe N6626 18 24 32.76 -24 52 06.5 2 2.60 7.00 ESOB SW N6627 18 22 38.86 +15 41 53.4 5 2.02 2.55 DC WS UZC GH CCA N6628 18 22 21.89 +23 28 39.3 5 1.47 2.15 WS Pds UZC GSC CCA N6629 18 25 42.38 -23 12 09.6 4 0.91 0.94 ESOB GSC CK UCA1 N6630 18 32 34.5 -63 17 31 2 0.48 1.41 WS ESOB N6631 18 27 11.4 -12 01 52 1 HCds N6632 18 25 03.09 +27 32 06.0 4 0.80 0.74 DC UZC WS CCA N6633 18 27 15 +06 30.5 1 BSV N6634: 18 29 57 -33 30.8 2 70.72 0.00 HCe HCe N6634??=N6637 18 31 23.06 -32 20 53.0 3 3.04 2.91 ESOB HC2m SW N6635 18 27 37.00 +14 49 06.7 4 2.17 1.58 WS GH DC CCA N6636ne 18 22 05.14 +66 37 19.8 4 2.13 1.62 WS HCds CCA DC N6636sw 18 22 02.86 +66 36 57.9 6 1.94 2.35 HCds WS Pds UZC CCA DC N6637=??N6634 18 31 23.06 -32 20 53.0 3 3.04 2.91 ESOB HC2m SW N6638 18 30 56.34 -25 29 55.5 2 1.53 11.81 SW ESOB N6639 18 30 59 -13 09.3 1 HCe N6640 18 28 08.28 +34 18 09.5 5 1.71 1.57 WS GSC CCA UZC SBG2 N6641 18 28 57.29 +22 54 09.4 4 2.10 1.83 DC WS UZC CCA N6642 18 31 53.90 -23 28 34.8 2 6.32 0.99 ESOB SW N6643 18 19 46.45 +74 34 08.4 5 2.39 3.41 WS DC CCA UZC GHD1 N6644 18 32 34.72 -25 07 44.0 4 1.29 0.47 CK GSC UCA1 ESOB N6645 18 32 37 -16 53.0 1 BSV N6646 18 29 38.78 +39 51 53.4 5 0.76 1.60 WS DC UZC CCA SBG2 N6647 18 32 49 -17 13.7 1 HCe N6648 18 25 37.58 +64 58 32.3 2 1.93 2.69 WS HCds N6649 18 33 27 -10 24.2 1 HCe N6650 18 25 27.985 +68 00 21.31 4 0.69 0.73 Pds HCds KHJ UZC N6651 18 24 19.71 +71 36 06.7 6 0.68 2.38 Pds CCA GHD1 WS UZC DC N6652 18 35 45.73 -32 59 28.2 2 0.27 4.38 ESOB SW N6653 18 44 38.6 -73 15 47 2 0.61 0.71 WS ESOB N6654 18 24 07.90 +73 10 58.1 5 1.91 1.44 WS UZC GHD1 CCA DC N6654A 18 39 25.24 +73 34 48.9 7 1.56 1.85 UZC DC WS CCA GHD1 STMM HCds N6655: 18 34 30.90 -05 55 15.1 1 HCds N6656 18 36 24.14 -23 54 17.2 2 1.16 6.93 ESOB SW N6657 18 33 01.63 +34 03 38.8 5 2.72 2.19 CCA WS UZC SBG2 DC N6658 18 33 55.62 +22 53 16.5 4 3.03 2.06 GH WS UZC CCA N6659 18 33 59 +23 35.7 1 HCe N6660=N6661 18 34 36.63 +22 54 34.0 6 1.81 1.93 GH HCds GSCA WS UZC CCA N6661=N6660 18 34 36.70 +22 54 36.0 8 2.45 3.94 GH HCds GSCA WS UZC CCA WS DC N6662 18 34 11.23 +32 03 51.1 3 0.59 0.29 Pds WS CCA N6663 18 33 33.71 +40 02 55.7 4 0.58 0.65 UZC SBG2 WS CCA N6664 18 36 33 -08 13.2 1 HCds N6665 18 34 30.0 +30 43 12 2 0.00 0.71 WS UZC N6666 18 34 44 +33 35.3 1o Sw6 N6667=N6668=N6678 18 30 40.04 +67 59 13.9 6 2.03 3.26 WS CCA DC GSC UZC GHD1 N6668=N6667=N6678 18 30 40.04 +67 59 13.9 6 2.03 3.26 WS CCA DC GSC UZC GHD1 N6669 18 37 15.1 +22 11 44 1 HCds N6670e 18 33 39.05 +59 53 16.8 2 0.53 0.78 CCA HCo N6670m 18 33 33.72 +59 53 16.2 4 1.68 1.74 WS GSC HCo CCA N6670n 18 33 37.46 +59 53 22.3 5 0.78 1.45 GSC HCo WS UZC CCA N6670w 18 33 32.3 +59 53 12 1 HCo N6671 18 37 26.17 +26 25 02.5 4 1.98 2.81 DC CCA WS UZC N6672 18 36 14.4 +42 56 47 1 HCds N6672 ne* 18 36 14.57 +42 56 51.3 1 HCds N6672 nw* 18 36 14.24 +42 56 52.6 1 HCds N6672 s* 18 36 14.33 +42 56 40.1 1 HCds N6673 18 45 06.6 -62 17 49 2 3.45 2.12 WS ESOB N6674 18 38 33.85 +25 22 29.8 4 1.11 3.30 GH WS UZC CCA N6675 18 37 26.38 +40 03 26.9 6 1.94 1.60 WS SBG2 DC Pds UZC CCA N6676 18 33 09.86 +66 57 32.2 4 1.01 1.25 WS CCA Pds UZC N6677: 18 33 36.25 +67 06 36.9 6 2.40 2.31 WS UZC CCA KEBA GSC DC N6678=N6667=N6668 18 30 40.04 +67 59 13.9 6 2.03 3.26 WS CCA DC GSC UZC GHD1 N6679:=I4763 18 33 30.57 +67 08 13.0 4 1.38 2.46 WS GSC CCA DC N6679ne 18 33 29.5 +67 08 11 1 HCo N6679sw 18 33 29.9 +67 08 07 1 HCo N6680ne 18 39 45.10 +22 19 11.2 1 HCds N6680nw 18 39 44.19 +22 19 15.5 1 HCds N6680se 18 39 44.60 +22 18 59.3 1 HCds N6680sw 18 39 43.98 +22 18 58.0 4 1.08 1.62 UZC WS Pds HCds N6681 18 43 12.50 -32 17 27.0 2 2.51 5.44 ESOB SW N6682 18 39 37 -04 48.8 1 HCe N6683 18 42 13 -06 12.7 1 HCe N6684 18 48 57.79 -65 10 25.7 5 2.59 3.70 ESOB WS HCds GSCA GC N6684A 18 52 23.2 -64 49 53 2 3.60 0.71 ESOB WS N6685 18 39 58.679 +39 58 54.51 3 0.62 0.80 KHJ SBG2 CCA N6686 18 40 07.001 +40 08 15.11 3 0.39 0.95 SBG2 KHJ UZC N6687 18 37 22.12 +59 38 33.2 4 1.11 0.82 WS Pds UZC CCA N6688 18 40 40.11 +36 17 22.4 6 2.00 3.14 WS DC SBG2 Pds UZC CCA N6689=N6690 18 34 50.08 +70 31 25.7 6 0.76 2.56 WS Pds UZC GSC CCA DC N6690=N6689 18 34 50.08 +70 31 25.7 6 0.76 2.56 WS Pds UZC GSC CCA DC N6691 18 39 12.36 +55 38 28.9 4 2.45 1.08 WS CCA UZC DC N6692 18 41 41.42 +34 50 36.0 5 2.64 0.94 DC SBG2 WS UZC CCA N6693 18 41 32 +36 54.9 1o Mar N6694 18 45 18 -09 23.0 1 HCe N6695 18 42 42.81 +40 22 00.2 5 0.60 1.10 SBG2 WS UZC CCA DC N6696 18 40 05.0 +59 19 59 2 0.54 2.83 Pds WS N6697 18 45 15.07 +25 30 45.0 4 1.32 1.71 WS CCA UZC DC N6698 18 48 17 -25 54.8 1o WH N6698? 18 48.1 -25 28 1 HCe N6699 18 52 02.3 -57 19 13 2 4.00 2.83 WS ESOB N6700 18 46 04.45 +32 16 47.1 5 2.02 3.41 BPP WS CCA UZC DC N6701 18 43 12.57 +60 39 11.7 4 0.60 2.50 UZC WS CCA DC N6702 18 46 57.59 +45 42 21.0 6 0.42 1.47 WS GHD1 UZC SBG2 CCA DC N6703 18 47 18.92 +45 33 02.2 6 0.51 1.23 CCA SBG2 WS UZC DC GHD1 N6704 18 50 45 -05 12.3 1 HCe N6705 18 51 05 -06 16.2 1 HCe N6706 18 56 51.2 -63 09 59 2 1.91 2.12 WS ESOB N6707 18 55 21.9 -53 49 09 2 0.63 1.41 ESOB WS N6708 18 55 35.5 -53 43 25 2 0.63 0.00 ESOB WS N6709 18 51 18 +10 19.1 1 HCe N6710 18 50 34.18 +26 50 16.9 6 1.56 2.14 WS GH CCA GHD1 Pds UZC N6711 18 49 00.96 +47 39 27.0 5 0.96 1.45 WS UZC DC SBG2 CCA N6712 18 53 04.46 -08 42 19.1 2 2.83 3.32 SW HCrs N6713 18 50 44.36 +33 57 35.5 5 2.42 2.36 WS UZC DC SBG2 CCA N6714 18 45 49 +66 43.5 1o Sw4 N6715 18 55 03.19 -30 28 46.5 2 1.64 5.44 ESOB SW N6716 18 54 34 -19 54.1 1 ESOB N6717 18 55 06.09 -22 42 05.5 3 1.36 2.46 ESOB GSC SW N6718 19 01 28.4 -66 06 38 2 4.28 0.00 ESOB WS N6719 19 03 07.5 -68 35 16 3 0.83 1.53 WS Pds ESOB N6720 18 53 35.11 +33 01 44.1 4 1.28 0.82 GSC SL UB10 CK N6721 19 00 50.7 -57 45 31 2 2.82 4.95 ESOB WS N6722 19 03 39.8 -64 53 42 2 2.24 1.41 ESOB WS N6723 18 59 33.05 -36 37 54.4 2 1.62 1.63 ESOB SW N6724: 18 56 46 +10 25.7 1 HCe N6725 19 01 56.4 -53 51 52 2 0.62 0.00 ESOB WS N6726 19 01 39 -36 53.5 1 ESOB N6726 * 19 01 38.79 -36 53 26.6 1 HCds N6727 * 19 01 40.71 -36 52 35.2 1 HCds N6728: 18 58 45 -08 58.0 1 HCe N6729 19 01 55 -36 57.5 1 ESOB N6729 * 19 01 54.08 -36 57 11.1 1 HCds N6730 19 07 33.6 -68 54 43 3 0.54 4.62 ESOB WS Pds N6731 18 57 13.5 +43 04 36 1 HCds N6732 18 56 24.10 +52 22 38.3 5 1.25 1.70 HCds WS UZC CCA DC N6732 comp 18 56 26.14 +52 22 37.1 2 0.26 1.84 HCds WS N6733 19 06 10.8 -62 11 48 2 0.49 0.71 WS ESOB N6734 19 07 14.0 -65 27 42 2 3.51 2.83 ESOB WS N6735 19 00 37 -00 28.5 1 HCe N6736 19 07 29.3 -65 25 42 3 0.36 2.65 Pds ESOB WS N6737 19 02 17 -18 32.8 1 HCe N6737? 19 03 00.0 -18 30 59 1 WS N6737?? 19 03 03 -18 32.2 1 ESOB N6738 19 01 21 +11 36.9 1 HCe N6739 19 07 48.5 -61 22 04 2 1.01 0.71 ESOB WS N6739? 19 08 03 -61 23.7 1 RC2 N6740 19 00 50.52 +28 46 15.1 2 0.47 1.84 WS GSC N6741 19 02 37.04 -00 26 57.4 2 0.95 0.49 GSC FAST N6742 18 59 19.88 +48 27 55.8 3 0.55 1.00 BSV UB10 CK N6743 19 01 20 +29 16.6 1 HCe N6744 19 09 45.84 -63 51 25.2 5 3.43 2.32 WS ESOB HC2m HCds GC N6744A 19 08 43.8 -63 43 49 2 0.00 0.00 ESOB WS N6745n 19 01 42.08 +40 45 30.5 3 3.03 1.25 SBG2 CCA DC N6745nw: 19 01 41.45 +40 44 58.8 1 HCds N6745nw? 19 01 42.06 +40 45 08.5 1 CCA N6745s 19 01 41.66 +40 44 42.8 6 0.68 1.25 HCds WS UZC CCA DC SBG2 N6746 19 10 22.2 -61 58 10 2 1.49 3.54 ESOB WS N6747 18 55 21.579 +72 46 17.23 3 0.92 0.54 Pds KHJ UZC N6748 19 03 50.1 +21 36 32 1o St2 N6749 19 05 15.4 +01 54 02 2 3.18 0.71 DM HCds N6750 19 00 35.93 +59 09 59.8 4 1.40 0.55 DC WS CCA UZC N6751 19 05 55.51 -05 59 31.2 4 0.68 1.97 CK GSC 2MSP DKM1 N6752=?N6777 19 10 51.64 -59 58 56.4 2 1.59 2.47 ESOB SW N6753 19 11 23.5 -57 02 56 2 1.73 1.41 ESOB WS N6754 19 11 25.3 -50 38 31 2 4.70 1.41 WS ESOB N6754A 19 08 44 -51 02.8 1 ESOB N6755 19 07 49 +04 16.0 1 BSV N6756 19 08 42 +04 42.3 1 BSV N6757 19 05 06.29 +55 43 03.1 5 2.47 2.73 WS Pds UZC CCA DC N6758 19 13 52.4 -56 18 34 2 1.17 1.41 ESOB WS N6759 19 06 57.10 +50 20 51.6 3 1.20 0.61 SBG2 WS UZC N6760 19 11 11.92 +01 01 49.9 2 2.97 0.28 HCrs SW N6761 19 15 05.0 -50 39 26 2 4.03 0.71 WS ESOB N6762=N6763 19 05 37.27 +63 56 01.1 6 1.67 1.22 WS Pds UZC GSC CCA DC N6763=N6762 19 05 37.27 +63 56 01.1 6 1.67 1.22 WS Pds UZC GSC CCA DC N6764 19 08 16.472 +50 55 58.73 12 0.87 1.65 WW EDC CCR UWS CCO SBG2 UZC vdH+ CCA WS GHD1 DC N6765 19 11 06.51 +30 32 44.8 4 1.26 2.32 CK BSV GSC2 HCo N6766=N6884 20 10 23.63 +46 27 39.9 5 0.37 1.01 GSC UJ10 HCds 2MSP CK N6767 19 11 33.96 +37 43 31.4 2 0.92 0.21 HCds WS N6768 19 16 32.6 -40 12 32 3 1.75 0.58 ESOB Pds WS N6768 comp 19 16 29.7 -40 13 23 1 WS N6769 19 18 22.94 -60 30 04.3 4 1.98 0.94 ESOB WS GSC HCds N6770 19 18 37.27 -60 29 48.5 4 2.03 1.76 WS HCds GSC ESOB N6771 19 18 39.59 -60 32 46.0 4 1.28 2.11 WS HCds GSC ESOB N6772 19 14 36.35 -02 42 24.5 4 0.84 1.67 GSC UB10 SPP CK N6773 19 15 08 +04 51.4 1 HCe N6773nw 19 15 03 +04 53.0 1 WS N6774 19 16.3 -16 15 1 HCe N6775 19 16 42 -00 56.0 1 HCe N6775w 19 16 53 -00 54.8 1 WS N6776 19 25 19.25 -63 51 37.3 4 0.89 2.77 WS GSC Pds ESOB N6776A 19 25 06.1 -63 40 59 2 3.28 0.00 WS ESOB N6777?=N6752 19 10 51.64 -59 58 56.4 2 1.59 2.47 ESOB SW N6777?? 19 26 32.4 -71 27 54 2 0.67 1.41 WS ESOB N6777?? w * 19 26 19.81 -71 27 56.8 1 SAO N6777?? e * 19 26 44.69 -71 27 57.8 1 SAO N6778=N6785 19 18 24.90 -01 35 47.7 6 0.75 2.63 GSC HCds CK GSCA SPP DKM1 N6779 19 16 35.70 +30 11 01.5 2 3.49 3.89 SW HCrs N6780 19 22 50.9 -55 46 30 2 2.38 6.36 WS ESOB N6781 19 18 28.09 +06 32 19.6 4 0.19 0.61 HCds GSC2 2MSP UB10 N6782 19 23 57.5 -59 55 21 2 4.24 0.00 ESOB WS N6783 19 16 47.59 +46 01 02.2 3 0.53 0.55 WS SBG2 UZC N6784ne 19 26 35.81 -65 37 03.9 2 0.92 0.14 HCds WS N6784sw 19 26 31.20 -65 37 35.2 2 0.04 1.70 WS HCds N6784sw+ne 19 26 33 -65 37.4 1 ESOB N6785=N6778 19 18 24.90 -01 35 47.7 6 0.75 2.63 GSC HCds CK GSCA SPP DKM1 N6786 19 10 53.85 +73 24 36.2 5 0.88 0.73 HCds UZC WS CCA DC N6787 19 16 10.48 +60 25 02.2 4 0.97 1.23 Pds WS CCA UZC N6788 19 26 49.7 -54 57 03 2 0.61 0.00 WS ESOB N6789 19 16 41.86 +63 58 18.9 6 0.83 2.65 WS DC KK UZC STMM CCA N6790 19 22 56.88 +01 30 48.2 4 1.95 2.37 DKM1 CK GSC Ty2 N6791 19 20 53 +37 46.3 1 HCe N6792 19 20 57.39 +43 07 57.5 5 1.86 3.47 DC WS UZC CCA SBG2 N6793 19 23 14 +22 08.5 1 HCe N6794 19 28 03.4 -38 55 08 2 6.59 0.71 ESOB WS N6795 19 26 18 +03 30.9 2 74.11 4.24 WS HCe N6796 19 21 30.99 +61 08 42.3 5 1.09 1.64 DC UZC WS CCA GHD1 N6797 19 29 00.6 -25 39 59 3 1.35 1.00 WS ESOB HCds N6798=I1300 19 24 03.29 +53 37 29.3 5 2.11 2.59 WS GSC UZC CCA DC N6799 19 32 16.6 -55 54 28 3 2.90 1.73 ESOB Pds WS N6800 19 27 07 +25 08.4 1 HCe N6801 19 27 35.89 +54 22 20.4 4 0.53 1.65 WS Pds UZC CCA N6802 19 30 35 +20 15.7 1 HCe N6803 19 31 16.49 +10 03 22.9 4 1.26 1.12 DKM1 GSC GSCA CK N6804 19 31 35.27 +09 13 31.1 3 1.55 0.50 UB10 CK BASm N6805 19 36 45.8 -37 33 15 2 0.84 0.00 WS ESOB N6806 19 37 05.2 -42 17 45 2 5.48 1.41 WS ESOB N6807 19 34 33.55 +05 41 03.0 5 1.58 1.16 AK90 UB10 UCA2 CK DKM1 N6808 19 43 54.3 -70 37 57 2 0.35 0.00 ESOB WS N6809 19 39 59.86 -30 57 44.1 2 8.36 0.85 SW ESOB N6810 19 43 34.2 -58 39 22 2 0.55 2.12 ESOB WS N6811 19 37 17 +46 23.3 1 HCe N6812 19 45 24.122 -55 20 49.13 5 1.76 1.07 WS ESOB JSMo JSMr Pds N6813 19 40 22.40 +27 18 33.8 2 0.94 0.71 HCds CCBD N6814 19 42 40.542 -10 19 26.54 5 2.45 2.05 GHD2 WS SPF EDC SPC N6815 19 40 44 +26 45.5 1 HCe N6815n 19 40 42 +26 47.9 1 WS N6816 19 44 02.4 -28 24 04 2 0.93 0.00 WS ESOB N6817e 19 37 23.40 +62 23 00.5 3 0.85 0.55 Pds2 WS GSC N6817w 19 37 21.273 +62 22 57.58 2 0.25 0.21 KHJ GSC N6818 19 43 57.77 -14 09 10.1 5 2.68 1.70 HC GSC 2MSP CK DKM1 N6819 19 41 18.1 +40 11 12 1 HCds N6820 19 42 28.0 +23 05 17 1 HCds N6821 19 44 24.1 -06 50 03 3 1.72 1.73 SPC GHD2 WS N6822=I4895 19 44 57.0 -14 48 10 3 10.68 27.02 HCds FT SPC N6822=I4895 bar 19 44 56.79 -14 48 23.9 4 2.70 1.52 WS HCds HC HC2m N6823 19 43 09 +23 18.0 1 BSV N6824 19 43 40.91 +56 06 33.9 5 1.92 3.32 WS CCA UZC DC GHD1 N6825 19 41 54.6 +64 04 21 3 1.01 0.58 WS Pds UZC N6826 19 44 48.135 +50 31 30.49 5 0.25 0.20 GSC PPM UJ10 CK Ty2 N6827 19 48 53.4 +21 12 54 1 HCds N6828 19 50 17 +07 54.2 1 HCe N6829 19 47 07.59 +59 54 24.5 4 0.86 0.95 CCA WS UZC Pds N6830 19 50 59 +23 06.0 1 BSV N6831 19 47 57.354 +59 53 32.48 3 0.79 0.51 UZC KHJ CCA N6832 19 48 15 +59 25.3 1 HCe N6833 19 49 46.53 +48 57 39.6 4 0.85 1.02 HCo UJ10 2MSP CK N6834 19 52 12 +29 24.5 1 BSV N6835 19 54 32.9 -12 34 03 2 3.10 2.12 WS SPC N6836 19 54 40.4 -12 41 16 3 0.84 2.52 WS Pds SPC N6837 19 53 08 +11 41.9 1 HCe N6838=??N6839 19 53 46.17 +18 46 41.7 2 1.21 0.85 SW HCrs N6839 19 54 33 +17 56.3 1o WH N6839??=N6838 19 53 46.17 +18 46 41.7 2 1.21 0.85 SW HCrs N6840 19 55 17 +12 07.3 2 20.75 33.94 HCe WS N6841 19 57 49.1 -31 48 37 2 0.00 3.54 ESOB WS N6842 19 55 02.33 +29 17 20.2 5 0.75 2.06 Ka83 2MSP HCo CK UB10 N6843 19 56 06.1 +12 09 49 2 2.07 0.00 WS HCe N6844 20 02 50.3 -65 13 47 2 1.77 2.12 WS ESOB N6845mn=N6845A 20 00 58.28 -47 04 11.6 4 2.33 1.78 WS ESOB Pds HCds N6845ms=N6845C 20 00 56.83 -47 05 02.2 4 1.79 2.29 SHM Pds WS HCds N6845nw=N6845B 20 01 05.50 -47 03 33.5 4 2.93 1.81 WS HCds Pds SHM N6845se=N6845D 20 00 53.62 -47 05 41.3 4 2.19 3.21 SHM WS Pds HCds N6846 19 56 28.1 +32 20 58 1 HCds N6847 19 57 09 +29 21.2 1o WH N6847? 19 56 37 +30 12.8 1 HCe N6848 20 02 46.9 -56 05 22 2 0.00 6.36 ESOB WS N6849 20 06 15.9 -40 11 53 2 4.85 2.83 WS ESOB N6850 20 03 29.8 -54 50 44 2 0.61 0.00 WS ESOB N6851 20 03 34.32 -48 17 05.0 2 0.56 0.28 WS GSC N6851A=N6861A 20 05 48.6 -47 58 41 2 1.42 0.71 ESOB WS N6851B 20 05 39.7 -47 58 44 2 2.83 2.83 ESOB WS N6852 20 00 39.20 +01 43 41.2 3 0.40 0.35 GSC CK GSCA N6853 19 59 36.28 +22 43 15.3 5 1.10 1.58 CK SL UJ10 GSC GSCA N6854 20 05 38.77 -54 22 33.4 3 1.80 2.98 WS HCds ESOB N6854se 20 05 38.85 -54 22 32.4 1 HC2m N6854nw 20 05 38.37 -54 22 24.5 1 HC2m N6855 20 06 49.9 -56 23 24 3 1.43 2.52 WS ESOB Pds N6856 19 59 17.1 +56 07 51 1 HCds N6856? 19 59 18.0 +56 07 29 1 WS N6857 20 01 48.1 +33 31 33 1 HCds N6858 20 02 59 +11 15.6 1 HCe N6858? 20 02 54.0 +11 15 29 1 WS N6859 20 03 49.3 +00 26 38 2 4.24 3.54 WS HCds N6860 20 08 46.6 -61 05 58 2 4.59 3.54 ESOB WS N6861=I4949 20 07 19.31 -48 22 11.9 3 1.54 0.76 ESOB HCds WS N6861A=N6851A 20 05 48.6 -47 58 41 2 1.42 0.71 ESOB WS N6861B 20 06 05.40 -48 28 28.5 3 1.62 0.35 WS HCds ESOB N6861C 20 06 41.1 -48 38 57 2 2.79 1.41 ESOB WS N6861D 20 08 19.5 -48 12 41 2 2.11 4.24 WS ESOB N6861E 20 11 01.3 -48 41 27 2 1.40 0.71 ESOB WS N6861F 20 11 12.0 -48 16 33 2 4.22 0.00 WS ESOB N6862 20 08 54.5 -56 23 34 2 0.58 3.54 WS ESOB N6863 20 05 07.3 -03 33 18 1 HCds N6864 20 06 04.81 -21 55 18.8 2 1.28 3.75 SW ESOB N6865 20 05 56.5 -09 02 28 2 1.05 0.71 WS SPC N6866 20 03 55 +44 09.5 1 BSV N6867 20 10 29.6 -54 47 02 2 4.88 2.83 ESOB WS N6868 20 09 53.983 -48 22 46.67 5 1.48 1.79 ESOB WS HCds UCA1 UA20 N6868 comp 20 09 58.74 -48 21 26.6 1 HCds N6869 20 00 42.38 +66 13 39.7 4 1.07 2.24 DC WS CCA UZC N6870 20 10 10.59 -48 17 12.8 4 1.97 1.00 WS ESOB GSCA HCds N6870 comp 20 10 02.80 -48 16 40.5 1 HCds N6871 20 05 59.4 +35 46 38 1 HCds N6872 20 16 56.85 -70 46 04.2 3 0.81 1.37 HCds GSC WS N6873 20 07 13 +21 06.1 1 HCe N6874 20 07 33 +38 14.8 1 HCe N6874? 20 07 48.0 +38 13 59 1 WS N6875 20 13 12.3 -46 09 40 2 0.73 2.83 WS ESOB N6875A 20 11 55.7 -46 08 36 2 2.20 0.00 ESOB WS N6876 20 18 19.66 -70 51 29.3 2 4.07 1.34 HCds ESOB N6876A=I4945 20 11 17.5 -71 00 44 2 2.74 3.54 WS ESOB N6877 20 18 36.0 -70 51 10 2 1.04 1.41 WS Pds N6878 20 13 53.2 -44 31 34 2 0.00 3.54 Pds WS N6878A 20 13 35.93 -44 48 59.8 3 2.75 1.27 ESOB HC2m WS N6879 20 10 26.67 +16 55 22.4 6 1.65 2.43 DKM1 HCo HCds Bord 2MSP CK N6880 20 19 30.0 -70 51 35 3 2.97 0.58 WS ESOB RC2 N6881 20 10 52.48 +37 24 41.7 4 1.02 0.99 UJ10 2MSP HCo CK N6882:=N6885 20 11 58 +26 29.0 2 47.53 25.46 HCe BSV N6882? 20 11 48 +26 48.5 1 HCe N6882?? 20 11 54.0 +26 40 19 1 WS N6882??? 20 11 56.9 +26 44 07 1 BAA N6883 20 11 19.8 +35 49 55 1 HCds N6884=N6766 20 10 23.63 +46 27 39.9 5 0.37 1.01 GSC UJ10 HCds 2MSP CK N6885=:N6882 20 11 58 +26 29.0 2 47.53 25.46 HCe BSV N6886 20 12 42.86 +19 59 22.2 5 1.66 1.12 GSC UJ10 GSCA CK DKM1 N6887 20 17 17.1 -52 47 49 2 0.64 2.83 WS ESOB N6888 20 12 06.5 +38 21 17 1 HCds N6888 knot 20 12 34 +38 26.9 1 HCe N6889 20 18 53.1 -53 57 24 2 2.49 1.41 ESOB WS N6890 20 18 18.207 -44 48 18.59 4 4.83 11.51 ESOB WS UW RC2 N6891 20 15 08.83 +12 42 15.8 4 0.39 0.87 CK GSC Bord Ty2 N6892 20 16 57.2 +18 01 10 2 1.01 0.71 WS HCds N6893 20 20 49.5 -48 14 22 2 1.41 0.71 ESOB WS N6894 20 16 23.85 +30 33 54.7 3 1.57 0.51 SIMB CK SL N6895 20 16 32 +50 14.4 1 HCe N6896: 20 18 03.6 +30 38 23 2 0.00 0.71 WS HCds N6896: nw * 20 18 03.05 +30 38 28.9 1 HCds N6896: se * 20 18 04.14 +30 38 20.1 1 HCds N6897 20 21 01.31 -12 15 17.1 3 0.74 2.53 WS SPF SPC N6898 20 21 08.0 -12 21 32 2 1.04 1.41 WS SPC N6899 20 24 22.1 -50 26 00 3 3.60 2.52 ESOB WS Pds N6900 20 21 35.1 -02 34 12 2 1.06 0.71 WS SPC N6901=I5000 20 22 21.61 +06 25 47.5 5 0.26 1.53 CCA GSC WS UZC GH N6902=?I4948 20 24 27.86 -43 39 11.0 3 1.39 1.63 ESOB WS GSC N6902Ane 20 23 00.53 -44 16 13.8 2 1.97 2.33 WS HCds N6902Asw 20 22 58.96 -44 16 22.8 2 2.42 0.99 WS HCds N6902B 20 23 07.1 -43 52 08 2 3.81 1.41 WS ESOB N6903 20 23 44.9 -19 19 31 3 0.00 3.00 ESOB SPC WS N6904 20 21 48.1 +25 44 29 2 0.96 0.00 WS HCds N6905 20 22 23.00 +20 06 16.0 4 0.77 0.72 GSC SL CK BASm N6906 20 23 33.97 +06 26 37.2 6 1.14 0.89 HCds GH UZC WS DC CCA N6907 20 25 06.69 -24 48 31.8 5 1.67 1.84 GHD2 WS HCds HC2m ESOB N6908 20 25 08.92 -24 48 03.0 2 1.54 0.92 HCds HC2m N6909 20 27 38.7 -47 01 36 2 1.44 3.54 ESOB WS N6910 20 23 12 +40 46.7 1 BSV N6911 20 19 38.52 +66 43 41.2 4 1.41 0.85 Pds WS CCA HCds N6912 20 26 52.1 -18 37 03 3 0.82 2.89 ESOB SPC WS N6913 20 23 57 +38 30.5 1 HCe N6914 20 24 43.3 +42 28 57 1 HCds N6915 20 27 46.1 -03 04 37 3 0.86 2.00 WS SPC GHD2 N6916 20 23 33.12 +58 20 38.1 5 1.02 1.12 Pds WS UZC HCds CCA N6917 20 27 28.37 +08 05 51.8 4 1.54 3.42 DC WS UZC CCA N6918 20 30 47.0 -47 28 22 2 0.00 7.78 ESOB WS N6919 20 31 38.1 -44 12 59 2 1.52 2.83 WS Pds N6920 20 43 57.0 -80 00 02 3 0.74 0.58 ESOB Pds WS N6921 20 28 28.89 +25 43 24.2 4 0.51 1.18 CCA GSC WS GH N6922e 20 29 52.92 -02 11 28.8 5 1.16 3.08 WS DC UZC CCA HCo N6922w 20 29 52.1 -02 11 29 1 HCo N6923=I5004 20 31 39.1 -30 49 55 2 1.82 1.41 WS GHD2 N6924 20 33 19.1 -25 28 27 3 2.07 2.00 ESOB WS Pds N6925=:I5015 20 34 20.7 -31 58 50 3 2.54 1.53 WS ESOB GHD2 N6926 20 33 06.03 -02 01 41.4 6 2.00 2.45 SPC WS UZC STMM DC CCA N6926A 20 33 06.2 -02 01 21 1 SPC N6927 20 32 38.141 +09 54 58.73 3 1.34 1.57 GH HCds KHJ N6927A 20 32 36.6 +09 52 58 2 2.09 1.41 GH WS N6928=I1325 20 32 50.19 +09 55 37.6 5 2.44 0.58 GH WS HCds UZC CCA N6929 20 33 21.716 -02 02 15.11 3 0.48 1.46 KHJ UZC SPC N6930=I1326 20 32 58.82 +09 52 27.5 4 1.64 3.13 HCds WS UZC DC N6930=I1326 comp 20 32 59.10 +09 52 54.8 2 1.78 2.19 HCds DC N6931 20 33 41.34 -11 22 08.0 3 1.47 1.71 SPC GSC WS N6932 20 42 08.5 -73 37 10 2 0.89 1.41 ESOB WS N6933 20 33 38.18 +07 23 14.4 1 HCds N6934 20 34 11.48 +07 24 16.6 3 0.60 1.75 HCrs SW HCds N6935 20 38 19.8 -52 06 35 2 2.60 3.54 ESOB WS N6936 20 35 56.4 -25 16 47 2 2.87 2.12 WS ESOB N6937 20 38 45.7 -52 08 38 2 1.30 1.41 ESOB WS N6938 20 34 42.2 +22 12 55 2 4.92 4.95 WS HCe N6939 20 31 30 +60 39.7 1 BSV N6940 20 34 26 +28 17.0 1 BSV N6941 20 36 23.4 -04 37 07 2 1.06 2.12 SPC WS N6942 20 40 37.7 -54 18 11 2 1.85 2.83 ESOB WS N6943 20 44 33.2 -68 44 51 3 2.18 2.31 ESOB RC2 WS N6944 20 38 23.806 +06 59 47.84 3 2.39 1.61 GH KHJ UZC N6944A 20 38 11.2 +06 54 07 3 0.86 1.00 WS GH UZC N6945 20 39 00.64 -04 58 21.2 4 1.33 0.47 WS GSC SPC Pds N6946 20 34 52.161 +60 09 14.41 13 3.73 3.24 GHD1 DC MW17 WS KAR CCR vdH+ TH1 VHSW HC2m GSCM UZC CCA N6947 20 41 15.3 -32 29 14 2 4.46 2.83 WS ESOB N6948 20 43 29.1 -53 21 27 2 4.41 0.71 WS ESOB N6949 20 35 07.23 +64 48 09.3 3 0.82 0.17 CCA UZC WS N6950 20 41 05 +16 37.3 1 HCe N6950 * 20 41 03.0 +16 36 59 1 WS N6951=N6952 20 37 14.34 +66 06 20.9 6 2.73 2.13 WS GHD1 UZC HCds CCA DC N6952=N6951 20 37 14.34 +66 06 20.9 6 2.73 2.13 WS GHD1 UZC HCds CCA DC N6953: 20 37 46.1 +65 45 53 2 0.88 0.00 WS HCds N6953? 20 41 12.9 +65 45 48 1 HCds N6954 20 44 03.26 +03 12 33.4 5 0.82 1.44 GH UZC CCA WS SPC N6955 20 44 18.032 +02 35 40.93 4 1.39 0.52 UZC KHJ CCA SPC N6956 20 43 53.70 +12 30 41.4 4 0.97 1.55 DC WS UZC CCA N6957 20 44 47.7 +02 34 50 3 0.87 2.08 UZC WS SPC N6958 20 48 42.64 -37 59 49.7 3 2.42 3.50 HCds WS ESOB N6959 20 47 07.31 +00 25 48.0 5 3.12 1.84 WS UZC GSC HCm SPC N6960 20 45 58 +30 35.7 1 HCe N6961 20 47 10.559 +00 21 47.15 5 1.43 1.34 GSC KHJ SPC UZC HCm N6962 20 47 19.08 +00 19 14.8 7 1.73 1.73 WS DC UZC GSC CCA SPC HCm N6963 20 47 19.39 +00 30 32.5 1 HCm N6963 e* 20 47 19.29 +00 30 33.7 1 GSC N6964 20 47 24.25 +00 18 02.5 8 2.45 1.17 DC Pds WS GSC UZC CCA SPC HCm N6965=I5058 20 47 20.38 +00 28 59.9 6 2.71 2.24 GH GSC SPC UZC HCm WS N6966 20 47 26.81 +00 22 03.0 2 1.06 0.99 GSC HCm N6967 20 47 34.10 +00 24 41.7 6 1.01 1.36 WS GSC UZC CCA HCm Pds N6968 20 48 32.441 -08 21 36.48 4 0.74 1.32 Pds HCds KHJ SPC N6969 20 48 27.62 +07 44 23.0 3 0.86 1.50 UZC WS CCA N6970 20 52 09.3 -48 46 38 2 2.09 4.95 ESOB WS N6971 20 49 23.80 +05 59 42.3 4 1.45 1.64 WS CCA Pds UZC N6972 20 49 58.959 +09 53 56.97 4 1.61 0.83 DC KHJ UZC CCA N6973 20 52 06.01 -05 53 40.8 2 0.63 0.64 HCds WS N6974: 20 51 04 +31 49.7 1 HCe N6975=N6976 20 52 26.011 -05 46 19.50 3 0.17 0.51 HKA KHJ SPC N6976=N6975 20 52 26.011 -05 46 19.50 3 0.17 0.51 HKA KHJ SPC N6977 20 52 29.691 -05 44 47.34 3 1.15 0.91 SPC KHJ HKA N6978 20 52 35.36 -05 42 40.0 3 0.43 1.66 HKA SPC WS N6979 20 50 28 +32 01.6 1 HCe N6980 20 52 48.94 -05 50 16.4 1 HCds N6981 20 53 27.83 -12 32 14.3 2 1.86 1.20 HCrs SW N6982 20 57 18.3 -51 51 45 2 0.65 2.83 WS ESOB N6983 20 56 43.5 -43 59 10 2 0.00 2.12 ESOB WS N6984 20 57 54.1 -51 52 14 3 1.60 2.65 Pds ESOB WS N6985 20 45 02.95 -11 06 16.0 4 0.73 1.34 SPC HCds WS SPF N6985 comp 20 45 01.36 -11 06 28.8 3 0.34 1.59 HCds SPF WS N6986 20 56 30.738 -18 34 00.28 5 2.77 1.38 WS KHJ SPC GSC ESOB N6987 20 58 10.4 -48 37 47 2 0.70 2.12 WS ESOB N6988 20 55 48.949 +10 30 27.30 3 0.75 0.87 UZC KHJ Pds N6989 20 54 06 +45 14.4 1 HCe N6990 20 59 56.8 -55 33 42 2 2.98 2.12 ESOB WS N6991 JH 20 54 56 +47 19.3 1 HCe N6991 WH 20 55 39 +47 26.9 1 HCe N6992 20 56 19 +31 44.6 1 HCe N6993: 20 53 54.1 -25 28 19 2 0.96 3.54 MFSK ESOB N6994 20 58 56.0 -12 38 07 1 HCds N6995 20 57 10 +31 14.1 1 HCe N6996 20 56 30 +45 28.4 1 HCe N6997 20 56 39 +44 37.9 1 HCe N6998 21 01 37.71 -28 01 54.8 2 0.28 1.41 EWSr WS N6999 21 01 59.3 -28 03 33 2 5.61 0.00 ESOB WS N7000 20 59.3 +44 31 1 HCe N7001 21 01 07.731 -00 11 43.06 5 2.57 1.47 DC KHJ CCA UZC SPC N7002 21 03 45.0 -49 01 46 2 0.69 0.00 ESOB WS N7003 21 00 42.35 +17 48 17.4 4 2.19 2.45 DC WS UZC CCA N7004 21 04 02.0 -49 06 49 2 0.00 4.24 ESOB WS N7005 21 01 57.3 -12 52 53 2 6.20 5.66 WS NGC N7006 21 01 29.28 +16 11 14.9 4 1.57 3.69 HC HCds HCrs SW N7007 21 05 27.7 -52 33 07 2 0.64 2.12 ESOB WS N7008 21 00 32.90 +54 32 34.7 4 1.42 1.85 GSCA GSC HCo CK N7009 21 04 10.80 -11 21 49.9 5 0.49 3.77 SL BASm 2MSP CK DKM1 N7010=I5082 21 04 39.554 -12 20 18.12 3 1.25 0.09 KHJ GSC SPC N7011 21 01 49.7 +47 21 15 2 4.33 0.71 HCds WS N7012 21 06 45.7 -44 48 51 2 2.25 2.83 WS ESOB N7013 21 03 33.48 +29 53 49.0 6 2.56 1.78 DC GHD1 UZC WS BPP CCA N7014 21 07 52.4 -47 10 41 3 3.52 2.31 WS ESOB RC2 N7015 21 05 37.31 +11 24 49.0 3 1.70 2.43 WS UZC CCA N7016 21 07 16.40 -25 28 08.6 3 2.27 0.29 WS HCds MFSK N7017 21 07 20.71 -25 29 15.7 4 1.93 1.29 WS HCds ESOB MFSK N7018 21 07 25.58 -25 25 44.6 5 2.10 1.79 WS HCds EWSr MFSK ESOB N7018 e knot 21 07 25.63 -25 25 42.4 1 PCR N7018 w knot 21 07 24.82 -25 25 43.0 1 PCR N7018 comp 21 07 36.91 -25 25 04.8 1 HCds N7019 21 06 25.9 -24 24 47 3 2.08 2.52 WS ESOB MFSK N7020=N7021 21 11 20.1 -64 01 31 2 0.46 1.41 WS ESOB N7021=N7020 21 11 20.1 -64 01 31 2 0.46 1.41 WS ESOB N7022 21 09 35.1 -49 18 12 2 0.69 2.12 ESOB WS N7023 21 01 35.6 +68 10 10 1 HCds N7024 21 06 09.1 +41 29 22 2 15.14 24.75 HCe WS N7025 21 07 47.40 +16 20 08.2 4 0.82 1.21 UZC HCds WS CCA N7026 21 06 18.53 +47 51 07.9 4 0.52 0.25 GSC UJ10 CK GSCA N7027 21 07 01.61 +42 14 10.4 5 0.99 0.51 Ty2 AGK2 GSC UJ10 CK N7028 21 08 15 +18 28.8 1 Mar N7028? 21 05 50.12 +18 28 06.4 1 HCds N7029 21 11 51.9 -49 17 00 2 6.20 2.83 WS ESOB N7030 21 11 13.5 -20 29 11 3 3.71 1.53 WS SPC ESOB N7031 21 07 12 +50 52.5 1 HCe N7032 21 15 23.0 -68 17 17 2 0.39 2.12 WS ESOB N7033 21 09 36.267 +15 07 27.42 2 0.10 3.09 KHJ UZC N7034 21 09 38.217 +15 09 00.63 4 0.94 1.54 UZC KHJ Pds CCA N7035 21 10 45.9 -23 08 10 2 6.82 3.54 WS ESOB N7035A 21 10 47.3 -23 08 15 1 WS N7036 21 10 12 +15 22.6 1 HCe N7037 21 10 49 +33 44.8 2 70.72 89.09 HCe WS N7038 21 15 07.71 -47 13 13.8 3 2.07 1.01 WS HCds ESOB N7038A 21 15 15 -47 36.7 1 ESOB N7039 21 10.8 +45 37 1 HCe N7040 21 13 16.56 +08 51 53.2 4 0.88 1.07 WS HCds UZC CCA N7041 21 16 32.3 -48 21 49 2 3.51 1.41 WS ESOB N7041A 21 17 56.76 -48 24 08.8 2 6.66 2.69 ESOB HCds N7041B 21 17 49.50 -48 23 26.9 2 2.88 2.97 HCo HCds N7042 21 13 45.84 +13 34 29.2 4 1.84 1.70 WS DC CCA UZC N7043 21 14 04.15 +13 37 32.8 4 0.83 0.58 Pds WS UZC CCA N7044 21 13 09.4 +42 29 46 1 HCds N7045 21 14 50.222 +04 30 26.70 5 1.33 2.35 HC HCds APMN WS UA20 N7045 nw * 21 14 50.112 +04 30 33.08 3 0.17 1.06 GSC2 GSCA HCds N7045 se * 21 14 50.305 +04 30 24.95 3 0.28 0.84 GSC2 GSCA HCds N7046 21 14 55.97 +02 50 04.8 6 2.58 2.04 DC WS SPC GH UZC CCA N7047 21 16 27.58 -00 49 35.9 4 2.43 1.44 WS UZC SPF CCA N7048 21 14 15.22 +46 17 17.9 7 0.64 0.95 SIMB CK PK67 HCds GSC2 UB10 SCOS N7049 21 19 00.3 -48 33 46 2 0.70 4.95 WS ESOB N7050 21 15 08 +36 10.5 1 HCe N7050e 21 15 15 +36 10.5 1 WS N7051 21 19 51.3 -08 46 58 2 0.00 0.71 WS SPC N7052 21 18 33.11 +26 26 49.3 5 1.12 3.55 WS DC CCA UZC RC2 N7053 21 21 07.678 +23 05 05.45 4 1.82 0.27 UZC KHJ CCA DC N7054 21 20 43.5 +39 10 19 1o St4 N7055 21 19 30 +57 34.2 2 0.00127.29 HCe WS N7055 core 21 19 25 +57 35.4 1 HCe N7056=I1382 21 22 07.56 +18 39 55.7 4 0.64 1.50 WS DC UZC CCA N7057 21 24 58.5 -42 27 38 2 0.00 0.00 ESOB WS N7058 21 21 00 +50 48.5 1o JH N7058: 21 21 53 +50 49.1 1 HCe N7058? 21 21 02 +50 50.0 1 WS N7059 21 27 21.5 -60 00 52 3 1.29 2.31 ESOB RC2 WS N7060 21 25 53.4 -42 24 38 2 1.56 2.83 ESOB WS N7061 21 27 26.8 -49 03 49 2 2.08 0.71 WS ESOB N7062 21 23 27 +46 22.7 1 BSV N7063 21 24 21 +36 29.2 1 HCe N7064 21 29 02.6 -52 45 59 3 4.69 3.46 ESOB RC2 WS N7065 21 26 42.431 -06 59 43.48 5 2.04 1.85 SPF KHJ GSC HC2m GHD2 N7065 sup * 21 26 42.22 -06 59 43.4 1 HC2m N7065A 21 26 57.977 -07 01 19.52 3 2.80 3.50 KHJ GSC GHD2 N7066 21 26 13.79 +14 10 57.0 4 1.19 0.47 WS UZC CCA Pds N7066nw 21 26 13.77 +14 10 58.2 1 HCds N7066se 21 26 14.20 +14 10 51.6 1 HCds N7067 21 24 23 +48 00.6 1 HCe N7068 21 26 32.3 +12 11 02 2 2.08 1.41 WS UZC N7069 21 28 05.92 -01 38 48.9 4 0.50 1.07 GSC CCA UZC SPC N7070 21 30 25.2 -43 05 12 2 0.00 1.41 ESOB WS N7070A 21 31 47.4 -42 50 45 3 3.80 4.16 WS ESOB Pds N7071 21 26 39.7 +47 55 15 2 5.00 6.36 HCds WS N7072 21 30 37.1 -43 09 10 2 2.31 0.71 WS ESOB N7072A 21 30 25.5 -43 12 07 2 1.54 2.83 ESOB WS N7073 21 29 26.0 -11 29 19 4 1.20 2.06 SPC SPF WS KET2 N7074 21 29 38.9 +06 40 55 3 1.72 2.00 WS Pds UZC N7074e 21 29 40.1 +06 40 43 1 HCo N7074w 21 29 39.11 +06 40 52.5 2 3.06 5.16 GSC HCo N7075 21 31 32.75 -38 37 04.0 3 3.41 2.31 ESOB WS EWSr N7076 21 26 23.53 +62 53 33.0 3 0.79 1.36 BSV CK UB10 N7077 21 29 59.670 +02 24 50.96 7 1.14 1.73 KHJ UZC KEBA KET2 DC CCA SPC N7078 21 29 58.39 +12 10 01.8 4 1.52 2.00 GYSB MGGP SW HCrs N7079 21 32 35.0 -44 04 02 2 0.76 2.83 WS ESOB N7080 21 30 01.923 +26 43 03.94 4 2.26 0.91 DC KHJ UZC CCA N7081 21 31 24.25 +02 29 26.6 5 1.37 0.82 GSC UZC CCA WS SPC N7082 21 29 17 +47 07.6 1 HCe N7083 21 35 45.0 -63 54 15 2 4.17 2.12 WS ESOB N7084 21 32 33 +17 30.5 1 HCe N7085 21 32 25.239 +06 34 51.67 3 0.76 0.76 Pds KHJ UZC N7086 21 30 27 +51 36.0 1 BSV N7087 21 34 33.4 -40 49 04 2 0.80 4.95 WS ESOB N7088 21 33 22 -00 23.0 1o Bax N7089 21 33 27.16 -00 49 23.5 3 2.42 0.40 HCds HCrs HCds N7090 21 36 28.44 -54 33 24.1 5 3.54 2.87 WS ESOB RC2 HC2m HCds N7091=I5114 21 34 07.80 -36 39 12.8 4 1.15 3.56 ESOB WS Pds HCds N7092 21 31.7 +48 25 1 HCe N7093 21 34 21 +45 57.9 1 HCe N7093ne 21 34 39 +46 00.9 1 WS N7094 21 36 52.92 +12 47 19.0 7 1.20 0.19 DKM1 DKM2 GSC LGDC BTC UCA2 CK N7095 21 52 26.3 -81 31 52 2 4.86 2.83 WS ESOB N7096=I5121 21 41 19.07 -63 54 29.3 3 0.45 2.00 HCds WS Pds N7096A=I5120 21 38 48.35 -64 21 02.4 2 1.55 0.49 WS HCds N7097 21 40 13.0 -42 32 21 3 3.54 1.73 WS Pds ESOB N7097A 21 40 38.1 -42 28 47 2 2.34 3.54 WS ESOB N7098 21 44 16.29 -75 06 41.8 3 0.97 2.16 WS HCds ESOB N7099 21 40 22.20 -23 10 45.1 2 3.50 0.64 SW ESOB N7100 21 39 07.04 +08 57 05.5 1 HCds N7101 21 39 34.654 +08 52 37.31 4 0.89 0.92 HCds KHJ Pds UZC N7102=:I5127 21 39 44.51 +06 17 09.8 7 1.86 1.92 DC HCds WS GH Pds UZC CCA N7102 comp 21 39 42.89 +06 16 06.1 1 HCds N7103 21 39 51.188 -22 28 24.76 3 3.89 1.65 ESOB WS KHJ N7104 21 40 03.074 -22 25 28.99 3 3.07 0.56 ESOB KHJ WS N7105 21 41 41.347 -10 38 07.84 1 KHJ N7106 21 42 36.7 -52 41 57 3 2.28 1.15 WS Pds ESOB N7107 21 42 26.7 -44 47 33 3 1.84 1.15 WS ESOB Pds N7108=N7111 21 41 53.7 -06 42 32 2 0.00 0.00 SPC WS N7109 21 41 58.3 -34 26 44 2 3.49 4.24 ESOB WS N7110 21 42 11.9 -34 09 44 2 1.75 4.24 ESOB WS N7111=N7108 21 41 53.7 -06 42 32 2 0.00 0.00 SPC WS N7112=N7113 21 42 26.62 +12 34 08.5 4 1.78 1.89 WS Pds2 UZC HCds N7113=N7112 21 42 26.62 +12 34 08.5 4 1.78 1.89 WS Pds2 UZC HCds N7114 21 41 43.98 +42 50 29.4 2 0.78 1.56 HWD HCds N7115 21 43 38.91 -25 21 04.8 4 4.11 2.51 HC2m ESOB Pds WS N7116 21 42 40.49 +28 56 47.2 5 2.39 1.94 UZC WS CCA BPP DC N7117 21 45 47.0 -48 25 16 2 0.00 2.12 ESOB WS N7118 21 46 09.8 -48 21 13 2 0.00 0.00 ESOB WS N7119=N7119A 21 46 15.97 -46 30 56.9 3 2.68 1.44 WS HCds ESOB N7119B 21 46 15.02 -46 31 12.3 3 1.58 1.05 WS HCds ESOB N7120 21 44 33.2 -06 31 26 2 0.00 1.41 SPC WS N7121 21 44 52.6 -03 37 12 2 0.00 0.71 WS SPC N7122 21 45 47.84 -08 49 48.7 2 0.21 3.04 HCds WS N7123 21 50 46.6 -70 20 03 2 1.41 0.00 WS ESOB N7124 21 48 05.5 -50 33 54 2 2.01 4.95 WS ESOB N7125 21 49 16.2 -60 42 43 3 0.00 2.31 ESOB RC2 WS N7126 21 49 18.1 -60 36 32 3 1.69 2.89 ESOB RC2 WS N7127 21 43 41 +54 37.8 1 HCe N7128 21 43 57 +53 42.9 1 BSV N7129 21 42 59 +66 06.8 1 HCe N7130=I5135 21 48 19.44 -34 57 09.6 3 1.26 1.50 WS HCds ESOB N7131 21 47 36.102 -13 10 57.48 2 0.33 0.10 SPC KHJ N7132 21 47 16.51 +10 14 28.4 4 2.05 1.37 WS Pds UZC HCds N7133 21 44 26.7 +66 10 06 1o Big N7134 21 48 56.1 -12 58 18 2 3.10 6.36 WS HCds N7135=?I5136 21 49 45.95 -34 52 35.5 2 0.95 0.21 HCds WS N7136 21 49 43.23 -11 47 35.7 2 2.18 0.28 HCds WS N7137 21 48 13.02 +22 09 34.8 6 0.92 3.21 WS GH Pds UZC DC CCA N7138 21 49 01.05 +12 30 49.0 3 1.12 1.70 WS UZC CCA N7139 21 46 08.59 +63 47 30.1 4 0.85 0.89 BSV CK UB10 HCo N7140=N7141 21 52 15.1 -55 34 11 2 0.60 0.71 WS ESOB N7141=N7140 21 52 15.1 -55 34 11 2 0.60 0.71 WS ESOB N7142 21 45 09 +65 46.5 1 BSV N7143 21 48 53.8 +29 57 20 2 1.84 4.24 HCds WS N7144 21 52 42.483 -48 15 14.93 5 1.13 2.28 UCA1 UA20 GSCA WS HCds N7145 21 53 20.4 -47 52 56 3 1.53 2.52 ESOB Pds WS N7146 21 51 47.4 +03 00 59 3 0.87 0.58 WS UZC SPC N7147 21 51 58.407 +03 04 17.32 3 0.85 1.22 SPC KHJ UZC N7148 21 52 08.46 +03 20 30.1 2 0.32 1.13 HCds HCo N7148 sw * 21 52 08.17 +03 20 27.3 1 HCds N7148 ne * 21 52 08.71 +03 20 34.4 1 HCds N7149 21 52 11.660 +03 18 03.55 5 1.02 0.68 HCds SPC KHJ UZC CCA N7150 21 50 23.5 +49 45 20 2 6.89 1.41 WS HCds N7151 21 55 03.9 -50 39 26 2 2.01 5.66 ESOB WS N7152 21 53 58.8 -29 17 23 2 2.77 1.41 ESOB WS N7153 21 54 35.3 -29 03 49 2 0.92 2.83 WS ESOB N7154 21 55 21.1 -34 48 51 2 0.87 0.00 WS ESOB N7155=I5143 21 56 09.8 -49 31 17 2 0.69 4.95 ESOB WS N7156 21 54 33.60 +02 56 34.2 7 3.30 2.47 DC WS GH SPC Pds UZC CCA N7157 21 56 56.5 -25 21 02 2 4.78 3.54 ESOB WS N7158 21 57 28.11 -11 35 33.1 1 GSC N7159 21 56 25.6 +13 33 44 3 0.84 0.58 Pds WS UZC N7160 21 53 40 +62 36.2 1 BSV N7161: 21 56 57.9 +02 54 58 1 HCm N7161: m pair 21 56 58.2 +02 54 50 1 HCds N7161: n pair 21 56 57.2 +02 55 39 2 0.00 0.71 HCds WS N7161: s pair 21 56 58.4 +02 54 26 1 HCds N7162 21 59 38.8 -43 18 22 2 0.77 7.07 WS ESOB N7162A 22 00 35.66 -43 08 30.0 3 1.89 2.01 ESOB WS HCds N7162A all 22 00 35.88 -43 08 21.1 2 1.23 1.91 HCds GSC N7163 21 59 20.1 -31 53 01 2 2.69 1.41 ESOB WS N7164 21 56 23.659 +01 21 48.46 3 0.81 1.58 Pds2 KHJ SPC N7165 21 59 26.1 -16 30 45 2 1.02 2.12 WS SPC N7166 22 00 32.7 -43 23 23 2 0.00 2.83 ESOB WS N7167 22 00 30.5 -24 37 59 2 4.81 2.12 ESOB WS N7168 22 02 07.2 -51 44 34 2 0.65 4.95 ESOB WS N7169 22 02 48.5 -47 41 49 2 2.84 3.54 ESOB WS N7170 22 01 26.3 -05 25 57 2 0.00 0.00 SPC WS N7171 22 01 02.0 -13 16 10 3 1.46 1.53 WS GHD2 SPC N7172 22 02 01.90 -31 52 12.4 7 1.80 1.60 WS HCds HC2m HC2m HC2m HCds HKA N7173 22 02 03.13 -31 58 25.8 3 3.68 2.14 WS Pds HKA N7174 22 02 06.49 -31 59 33.9 4 3.02 3.95 HKA HC ESOB WS N7174+N7176 22 02 07.8 -31 59 29 1 Pds N7175 21 58 46.9 +54 49 11 2 86.71 67.88 HCe WS N7176 22 02 08.73 -31 59 24.6 5 2.38 2.70 HC ESOB HKA WS Pds N7177 22 00 41.29 +17 44 15.8 5 2.77 2.33 GH WS UZC CCA DC N7178 22 02 25.0 -35 47 26 2 2.57 3.54 ESOB WS N7179 22 04 49.2 -64 02 45 3 0.75 4.04 WS ESOB RC2 N7180 22 02 18.5 -20 32 51 4 2.39 2.65 ESOB MFSK WS GHD2 N7181 22 01 43.526 -01 57 38.04 3 0.84 1.00 UZC KHJ SPC N7182 22 01 51.690 -02 11 47.74 2 0.65 0.05 KHJ SPC N7183 22 02 21.57 -18 55 00.5 4 3.37 2.60 WS SPC MFSK SPF N7184 22 02 39.80 -20 48 46.4 4 1.32 0.49 MFSK GHD2 SPF WS N7185 22 02 56.72 -20 28 18.3 5 2.30 0.93 MFSK WS GSC SPF SPC N7186 22 01 05.1 +35 04 41 2 1.74 2.83 WS HCds N7187 22 02 43.8 -32 48 12 2 10.67 1.41 ESOB WS N7188 22 03 29.01 -20 19 03.3 6 0.56 1.17 MFSK GSC ESOB Pds WS SPF N7189 22 03 15.94 +00 34 16.3 5 2.06 2.45 DC WS SPC UZC CCA N7190 22 03 06.692 +11 11 57.18 9 0.44 0.69 HCds APMN GSC2 KHJ GSCA UA20 Pds UZC CCA N7191 22 06 51.7 -64 38 02 4 2.10 0.50 WS Pds ESOB RC2 N7192 22 06 50.04 -64 18 57.4 4 1.27 1.11 WS ESOB RC2 HCds N7193 22 03 03.8 +10 48 06 2 45.88 9.90 HCe WS N7194 22 03 30.90 +12 38 12.2 4 1.51 1.08 DC WS UZC CCA N7195 22 03 30.278 +12 39 38.60 2 0.12 1.03 Pds KHJ N7196 22 05 54.79 -50 07 10.4 3 1.46 0.17 ESOB WS GSC N7197 22 02 58.10 +41 03 33.4 6 1.54 1.85 WS SBG2 UZC Pds CCA DC N7198 22 05 14.243 -00 38 53.63 3 0.83 1.02 UZC KHJ SPC N7199 22 08 29.5 -64 42 23 3 2.93 0.00 ESOB RC2 WS N7200 22 07 09.3 -49 59 44 2 3.39 1.41 ESOB WS N7201 22 06 32.14 -31 15 47.5 5 2.15 2.71 WS HCds Pds HC ESOB N7202 22 06 43.25 -31 13 06.5 3 0.64 2.05 WS HCds ESOB N7203 22 06 44.02 -31 09 46.9 4 2.95 2.47 WS HCds HC ESOB N7204 22 06 54 -31 03.0 1 ESOB N7204nw 22 06 53.07 -31 02 57.9 2 0.36 4.60 WS HCds N7204se 22 06 54.96 -31 03 12.2 2 0.09 2.69 WS HCds N7205 22 08 33.4 -57 26 34 2 2.27 0.71 WS ESOB N7205A 22 07 32.0 -57 27 50 3 0.46 1.73 WS ESOB RC2 N7206 22 05 40.93 +16 47 05.9 3 0.50 1.13 WS UZC CCA N7207 22 05 45.7 +16 46 03 2 1.02 2.12 WS Pds2 N7208 22 08 24.6 -29 03 05 2 2.77 0.71 ESOB WS N7209 22 05 07 +46 29.0 1 BSV N7210 22 06 22 +27 06.6 1o NGC N7210 JH 22 06 19 +28 06.4 1o JH N7211 22 06 21.940 -08 05 24.62 2 1.40 0.74 KHJ SPC N7212m 22 07 02.04 +10 14 00.9 4 1.98 1.25 UZC HCds CCA WS N7212ne 22 07 02.42 +10 14 14.1 2 0.73 1.13 UZC HCds N7212sw 22 07 00.14 +10 13 29.3 1 HCds N7213 22 09 16.44 -47 09 59.8 3 3.55 2.51 GSC WS ESOB N7214 22 09 07.54 -27 48 35.0 4 0.93 1.28 ESOB GHD2 WS HKA N7215 22 08 34.5 +00 30 41 3 0.00 0.00 SPC UZC WS N7216 22 12 36.4 -68 39 41 2 3.44 3.54 WS ESOB N7217 22 07 52.36 +31 21 32.9 7 2.38 1.27 WS DC BPP HHKK GSC UZC CCA N7218 22 10 11.71 -16 39 38.6 4 2.23 2.33 WS Pds SPC SPF N7219 22 13 08.6 -64 50 53 4 3.32 3.56 ESOB RC2 WS Pds N7220 22 11 30.9 -22 57 11 2 0.00 1.41 ESOB WS N7221 22 11 15.12 -30 33 48.2 3 0.37 1.00 ESOB WS HCds N7222 22 10 51.757 +02 06 20.06 6 0.64 0.79 UZC SPF CCA KHJ Pds SPC N7223 22 10 09.14 +41 00 59.8 6 1.55 1.85 SBG2 UZC Pds WS DC CCA N7224 22 11 35.393 +25 51 51.73 4 0.96 0.45 Pds UZC KHJ CCA N7225 22 13 07.8 -26 08 52 2 0.00 4.24 ESOB WS N7226 22 10 26.9 +55 23 54 1 HCds N7227 22 11 31.49 +38 43 16.1 5 2.51 2.19 WS UZC SBG2 CCA HC N7228 22 11 48.63 +38 41 54.7 6 1.44 2.49 RGMH SBG2 WS UZC HC CCA N7229 22 14 03.0 -29 23 00 2 3.69 1.41 ESOB WS N7230 22 14 13.1 -17 04 29 2 0.00 0.00 SPC WS N7231 22 12 30.47 +45 19 42.9 5 2.12 2.30 WS SBG2 CCA UZC DC N7232 22 15 37.6 -45 51 02 2 0.00 0.00 ESOB WS N7232A 22 13 41.1 -45 53 37 2 0.73 1.41 WS ESOB N7232B 22 15 52.4 -45 46 50 2 0.74 0.71 WS ESOB N7233 22 15 48.8 -45 50 49 2 2.94 1.41 ESOB WS N7234=N7235 22 12 25.0 +57 16 16 1 HCds N7235=N7234 22 12 25.0 +57 16 16 1 HCds N7236 22 14 44.949 +13 50 47.20 7 1.44 1.47 Pds DC WS UZC RG CCA PCR N7237 22 14 46.878 +13 50 26.51 7 1.91 1.32 Pds DC RG WS CCA PCR GH N7238 22 15 20 +22 31.2 1o Sw4 N7239 22 15 01.394 -05 03 11.04 3 0.12 1.30 Pds2 SPC KHJ N7240 22 15 22.68 +37 16 51.9 5 0.76 3.73 GSC HC SBG2 WS GHD1 N7241 22 15 49.60 +19 13 51.8 4 3.79 1.70 DC CCA WS UZC N7242 22 15 39.51 +37 17 55.8 8 1.21 3.43 WS UZC Pds GSC SBG2 HC GHD1 CCA N7243 22 15 08 +49 53.9 1 BSV N7244 22 16 26.8 +16 28 15 3 0.83 0.58 SDP WS UZC N7245 22 15 11 +54 20.6 1 HCe N7246=I5198 22 17 42.71 -15 34 15.6 5 1.27 1.79 WS Pds GSC SPC HCds N7247 22 17 40.8 -23 43 56 3 3.63 4.04 Pds2 ESOB WS N7248 22 16 52.66 +40 30 16.2 6 1.58 2.87 WS DC SBG2 UZC CCA GHD1 N7248 comp 22 16 51.02 +40 30 56.0 1 SBG2 N7249 22 20 30.9 -55 07 31 3 0.49 3.21 HC ESOB WS N7250 22 18 17.71 +40 33 46.6 8 1.63 2.74 KET2 Pds DC STMM WS UZC SBG2 CCA N7251 22 20 27.2 -15 46 25 2 0.00 2.12 WS SPC N7252 22 20 44.85 -24 40 42.4 6 2.10 1.18 GHD2 HC2m HCds ESOB Pds WS N7253=N7253A 22 19 27.72 +29 23 44.9 2 0.56 0.07 CCA HC2m N7253B 22 19 30.20 +29 23 15.5 4 2.35 1.78 WS UZC HC2m CCA N7253 e knot 22 19 31.2 +29 23 24 2 1.85 1.41 HCo BPP N7254=N7256 22 22 36.0 -21 44 14 2 0.98 1.41 Pds2 WS N7255 22 23 08.07 -15 32 29.9 3 1.44 1.22 WS GSC SPC N7256=N7254 22 22 36.0 -21 44 14 2 0.98 1.41 Pds2 WS N7257=N7260 22 22 36.4 -04 07 13 3 1.50 3.21 SPC Pds WS N7258 22 22 58.0 -28 20 43 2 1.86 1.41 ESOB WS N7259 22 23 05.51 -28 57 17.0 3 3.10 1.69 ESOB WS HCds N7260=N7257 22 22 36.4 -04 07 13 3 1.50 3.21 SPC Pds WS N7261 22 20.1 +58 03 1 HCe N7261 core 22 20 11 +58 07.3 1 HCe N7262 22 23 28.4 -32 21 51 2 0.00 4.95 ESOB WS N7263 22 21 45.20 +36 20 58.2 2 0.43 2.55 SBG2 WS N7263 comp 22 21 46.0 +36 21 06 1 WS N7264 22 22 13.71 +36 23 12.6 4 2.27 1.71 WS SBG2 CCA UZC N7265 22 22 27.47 +36 12 35.3 5 0.90 1.18 DC UZC WS SBG2 CCA N7266 22 23 59.0 -04 04 24 2 0.00 0.00 SPC WS N7267 22 24 21.72 -33 41 36.9 4 3.89 1.96 WS Pds HCds ESOB N7268 22 25 40.61 -31 12 04.6 2 0.54 1.70 WS HCds N7268A 22 25 42.16 -31 12 01.4 2 0.09 1.91 HCds WS N7269 22 25 46.7 -13 10 01 2 2.06 1.41 SPC WS N7270 22 23 47.68 +32 24 10.9 5 1.72 2.59 WS BPP CCA UZC GSC N7271 22 23 57.589 +32 22 02.00 3 0.52 2.04 BPP KHJ GSC N7272 22 24 31.729 +16 35 17.11 3 0.68 0.69 UZC KHJ CCA N7273 22 24 09.234 +36 11 59.10 3 0.73 0.34 SBG2 KHJ UZC N7274 22 24 11.115 +36 07 32.97 5 0.50 0.77 DC SBG2 KHJ UZC CCA N7275 22 24 17.26 +32 26 47.4 5 1.40 2.04 UZC BPP GSC WS CCA N7276 22 24 14.391 +36 05 15.42 3 0.27 0.40 KHJ UZC SBG2 N7277 22 26 11.0 -31 08 47 2 2.72 1.41 WS ESOB N7278 22 28 22.8 -60 10 10 2 3.14 1.41 WS ESOB N7279 22 27 12.6 -35 08 24 2 0.86 1.41 WS ESOB N7280 22 26 27.63 +16 08 53.6 5 0.69 2.46 GH CCA WS UZC DC N7281 22 25.3 +57 49 1 HCe N7282 22 25 53.88 +40 18 54.5 4 0.30 0.57 SBG2 CCA WS UZC N7283? 22 28 32.707 +17 28 12.98 3 0.60 0.53 UZC GSC KHJ N7283?? 22 27 29.1 +17 26 18 1 HCo N7284 22 28 35.9 -24 50 40 2 1.92 2.12 WS ESOB N7285 22 28 37.9 -24 50 27 2 1.92 0.71 WS ESOB N7286 22 27 50.58 +29 05 44.2 6 0.91 1.42 BPP WS DC Pds UZC CCA N7287 22 28 32 -22 08.3 1o Mu2 N7287? 22 27 17.00 -22 07 00.0 1 HCds N7287? m 22 27 17.16 -22 07 02.6 1 HCds N7287? nw 22 27 16.83 -22 06 56.6 1 HCds N7287? se 22 27 17.43 -22 07 06.7 1 HCds N7287?? 22 28 48.4 -22 12 04 2 2.94 4.95 KOS ESOB N7287?? * 22 28 49.62 -22 12 03.2 1 HCds N7287?? ne 22 28 48.77 -22 12 07.8 2 1.57 2.05 HCds WS N7287?? sw 22 28 48.37 -22 12 12.6 2 0.29 0.99 WS HCds N7288 22 28 14.9 -02 53 03 3 0.86 2.52 WS KET2 SPC N7289 22 29 20.3 -35 28 19 2 3.44 0.71 WS ESOB N7290 22 28 26.51 +17 08 51.2 6 0.06 2.52 WS Pds UZC GH DC CCA N7291 22 28 29.500 +16 46 58.75 3 0.19 0.51 KHJ UZC CCA N7292 22 28 25.95 +30 17 31.1 5 3.69 2.13 WS UZC GSC BPP CCA N7293 22 29 38.44 -20 50 13.2 5 1.44 0.79 AC22 SL CK HCo 2MSP N7294=I5225 22 32 07.95 -25 23 54.7 3 2.66 1.95 WS ESOB GSC N7295=N7296 22 28 02 +52 17.3 1 HCe N7295=N7296 core 22 28 02 +52 18.4 1 HCe N7296=N7295 22 28 02 +52 17.3 1 HCe N7296=N7295 core 22 28 02 +52 18.4 1 HCe N7297 22 31 10.0 -37 49 36 2 3.34 2.83 ESOB WS N7298 22 30 50.68 -14 11 18.8 5 0.75 2.48 KEB1 WS SPF SPC GHD2 N7299 22 31 32.8 -37 48 35 2 2.51 2.12 ESOB WS N7300=:I5204 22 30 59.97 -14 00 12.0 4 0.69 1.74 WS GHD2 SPF SPC N7301 22 30 34.81 -17 34 25.9 4 2.02 1.85 SPC SPF WS ESOB N7302=I5228 22 32 23.8 -14 07 15 3 0.84 0.58 SPC GHD2 WS N7303 22 31 32.88 +30 57 21.8 6 1.24 0.89 UZC BPP GSC CCA DC WS N7304?? 22 31 44.5 +30 58 46 1 HCo N7305 22 32 13.937 +11 42 43.29 3 0.74 0.64 Pds KHJ UZC N7306 22 33 16.5 -27 14 47 2 3.76 1.41 WS ESOB N7307 22 33 52.5 -40 56 02 3 1.13 3.79 WS ESOB MFSK N7308=I1448 22 34 32.076 -12 56 01.95 3 1.07 0.70 HCds SPC KHJ N7309 22 34 20.5 -10 21 25 3 3.90 3.00 GHD2 Pds SPC N7310 22 34 36.9 -22 29 06 2 2.93 2.12 WS ESOB N7311 22 34 06.83 +05 34 11.4 4 1.36 1.56 WS UZC CCA Pds N7312 22 34 34.88 +05 49 01.2 4 0.70 0.60 UZC CCA WS DC N7313 22 35 32.4 -26 06 07 2 0.95 1.41 GHD2 WS N7314 22 35 45.8 -26 03 01 3 1.34 2.31 ESOB WS GHD2 N7315 22 35 31.725 +34 48 11.86 6 1.11 0.69 DC SBG2 KHJ UZC Pds CCA N7316 22 35 56.37 +20 19 19.8 4 1.61 1.48 WS UZC K11 CCA N7317 22 35 51.94 +33 56 41.4 8 1.38 0.88 HC2m GSC UZC WS GHD1 KEBA SBG2 HKA N7318=N7318B 22 35 58.429 +33 57 57.72 11 1.00 1.08 KEBA KHJ GSC AC UZC GHD1 DC HC2m CCA HKA SBG2 N7318A 22 35 56.774 +33 57 56.43 11 0.77 1.33 GHD1 DC KHJ AC HC2m GSC KEBA UZC CCA SBG2 HKA N7319 22 36 03.641 +33 58 32.67 9 1.50 1.12 GHD1 KHJ HC2m GSC SBG2 HCht CCA KEBA HKA N7320 22 36 03.49 +33 56 54.0 10 3.41 1.97 KEBA GHD1 HC2m UZC SBG2 HKA GSC WS CCA DC N7320A 22 36 32.23 +33 47 44.8 1 GSC N7320B 22 37 28.146 +33 55 22.49 1 AC N7320C 22 36 20.374 +33 59 06.58 2 0.08 0.98 GHD1 KHJ N7321 22 36 28.00 +21 37 16.3 4 1.38 0.85 WS Pds UZC CCA N7322=N7334 22 37 51.2 -37 13 50 2 3.37 4.95 ESOB WS N7323 22 36 53.59 +19 08 37.3 3 1.35 0.40 WS UZC CCA N7324 22 37 01.0 +19 08 45 2 1.00 0.00 UZC WS N7325 22 36 48.52 +34 22 04.9 1 HCds N7326 22 36 52.05 +34 25 22.2 2 0.88 1.48 WS HCds N7327? 22 36 33.63 +34 30 06.7 1 HCds N7327? * ene 22 36 57.88 +34 28 37.1 1 HCds N7327? * nne 22 36 54.95 +34 29 30.2 1 HCds N7327? * se 22 36 57.27 +34 28 02.5 1 HCds N7327? * sw 22 36 46.82 +34 27 49.1 1 HCds N7328 22 37 29.25 +10 31 54.0 5 1.21 2.92 WS K11 DC UZC CCA N7329 22 40 24.12 -66 28 44.5 3 3.62 2.04 ESOB WS HCds N7330 22 36 56.30 +38 32 51.6 4 1.46 1.16 WS CCA SBG2 DC N7331 22 37 04.127 +34 24 57.38 7 1.26 0.89 GSCM AAS HC2m HCSb AC UJ10 CCA N7332 22 37 24.59 +23 47 53.7 6 1.00 1.85 DC GH WS UZC CCA HCds N7333 22 37 11.69 +34 26 14.4 2 0.97 2.55 HCds WS N7334=N7322 22 37 51.2 -37 13 50 2 3.37 4.95 ESOB WS N7335 22 37 19.405 +34 26 51.80 8 0.97 0.73 GHD1 UZC Pds KHJ HCSb SBG2 HCds CCA N7336 22 37 21.898 +34 28 54.19 5 1.04 1.41 Pds2 HCSb HCds KHJ Pds N7337 22 37 26.66 +34 22 26.5 6 0.83 2.15 HCds HCSb GHD1 WS SBG2 CCA N7338: 22 37 31.3 +34 24 52 1 HCm N7338: ne* 22 37 31.76 +34 24 54.3 1 HCds N7338: sw* 22 37 30.94 +34 24 50.7 1 HCds N7339 22 37 47.08 +23 47 11.1 6 2.82 2.58 DC GH WS CCA HCds UZC N7340 22 37 44.234 +34 24 36.16 4 0.64 1.43 UZC KHJ SBG2 HCds N7341 22 39 05.6 -22 39 59 2 0.00 2.12 ESOB WS N7342 22 38 13.22 +35 29 54.5 4 0.46 1.57 WS UZC SBG2 CCA N7343 22 38 37.97 +34 04 16.7 4 1.14 0.60 WS SBG2 CCA UZC N7344 22 39 36.2 -04 09 33 2 1.06 0.71 WS SPC N7345 22 38 44.90 +35 32 25.3 4 0.53 1.84 WS UZC SBG2 CCA N7346 22 39 35.402 +11 04 59.61 2 0.93 0.51 Pds KHJ N7347 22 39 56.18 +11 01 38.9 6 1.44 0.97 WS CCA Pds UZC GSC K11 N7348 22 40 36.19 +11 54 21.6 6 2.26 1.43 K11 GH WS UZC GSC CCA N7349 22 41 14.4 -21 47 49 2 5.90 0.00 KOS WS N7350 22 40 48.56 +12 00 23.5 1 GSC N7351 22 41 26.9 -04 26 41 2 0.00 0.71 WS SPC N7352 22 39 43 +57 23.7 1o JH N7353 22 42 12.58 +11 52 38.8 2 0.31 0.49 K11 GSC N7354 22 40 19.835 +61 17 07.48 4 1.11 1.45 UJ10 CK GSC GSCA N7355 22 43 30.46 -36 51 54.7 2 1.69 3.04 WS HCds N7356 22 42 02.385 +30 42 31.08 4 0.95 0.39 UZC KHJ BPP CCA N7357 22 42 23.960 +30 10 17.00 4 0.41 0.41 KHJ UZC BPP CCA N7358 22 45 36.2 -65 07 15 2 1.33 4.95 ESOB WS N7359 22 44 47.6 -23 41 15 2 3.88 3.54 ESOB WS N7360 22 43 34.01 +04 09 05.5 4 1.24 3.13 DC UZC CCA WS N7361=I5237 22 42 17.92 -30 03 28.9 4 0.06 1.29 HCds ESOB WS GHD2 N7362 22 43 49.241 +08 42 18.89 5 1.99 0.87 UZC Pds KHJ SPF CCA N7363 22 43 18.40 +33 59 55.9 4 1.56 2.17 GHD1 SBG2 UZC WS N7364 22 44 24.29 -00 09 43.7 5 2.48 3.01 DC WS UZC CCA SPC N7365 22 45 10.004 -19 57 07.00 5 2.04 0.60 ESOB KHJ SPC WS HCds N7366 22 44 26.780 +10 46 53.18 2 3.17 0.36 KHJ Pds N7367 22 44 34.49 +03 38 45.1 6 2.58 1.14 WS SPF GSC CCA UZC SPC N7368 22 45 31.6 -39 20 32 3 2.91 3.51 WS ESOB MFSK N7369 22 44 12.23 +34 21 03.9 3 0.72 0.72 WS UZC SBG2 N7370 22 45 37.264 +11 03 26.60 2 0.68 2.09 KHJ Pds2 N7371 22 46 03.783 -11 00 04.65 2 0.80 0.80 KHJ SPC N7372 22 45 45.9 +11 07 50 3 0.85 0.58 K11 UZC WS N7373 22 46 19.4 +03 12 33 3 0.00 1.53 WS SPC UZC N7374=N7374A 22 46 00.97 +10 51 13.4 3 0.51 1.21 HCds K11 UZC N7374B=I1452 22 45 59.15 +10 52 04.8 1 HCds N7375 22 46 32.065 +21 05 00.29 2 0.39 1.22 KHJ UZC N7376 22 47 17.47 +03 38 42.9 4 0.14 1.65 SPF GSC WS K11 N7377 22 47 47.4 -22 18 43 3 0.80 1.15 WS ESOB GHD2 N7378 22 47 47.62 -11 49 01.6 3 1.19 0.35 WS SPC SPF N7379 22 47 33.01 +40 14 19.0 5 1.48 0.52 WS UZC SBG2 CCA DC N7380 22 47 21 +58 07.9 1 BSV N7381 22 50 08.10 -19 43 27.4 4 0.71 2.99 WS HCds ESOB SPC N7382 22 50 23.5 -36 51 21 2 5.92 6.36 ESOB WS N7383 22 49 35.661 +11 33 22.90 3 0.73 0.26 KHJ GSC UZC N7384 22 49 42.5 +11 29 14 1 HCo N7385 22 49 54.61 +11 36 30.1 6 0.29 2.11 GSC WS UZC GH DC CCA N7386 22 50 02.10 +11 41 54.0 5 1.23 2.26 WS UZC GH GSC CCA N7387 22 50 17.670 +11 38 12.38 4 0.54 0.74 KHJ HCds GSC UZC N7388 22 50 21.02 +11 42 39.4 1 HCds N7389 22 50 16.029 +11 33 57.72 4 0.83 0.93 UZC KHJ Pds GSC N7390 22 50 19.51 +11 31 50.8 4 0.77 1.21 WS Pds GSC UZC N7391 22 50 36.11 -01 32 40.2 7 2.23 3.11 Pds WS SPF UZC SPC CCA DC N7392 22 51 48.8 -20 36 26 3 6.11 6.03 GHD2 WS ESOB N7393 22 51 38.21 -05 33 26.5 4 1.60 2.18 SPC WS Pds GSC N7394 22 50 11.8 +52 10 04 2 53.66 62.93 HCe WS N7394 core 22 50 23 +52 08.1 1 HCe N7395 22 51 02.947 +37 05 15.97 4 0.98 0.46 SBG2 KHJ CCA UZC N7396 22 52 22.67 +01 05 32.5 5 0.67 2.28 WS SPC DC CCA UZC N7397 22 52 46.66 +01 07 56.8 4 0.71 1.46 WS SPC SPF UZC N7398 22 52 49.233 +01 12 03.77 4 0.48 0.28 SPC UZC CCA KHJ N7399 22 52 39.3 -09 16 04 2 1.05 0.71 SPC WS N7400 22 54 20.6 -45 20 49 2 2.97 2.12 ESOB WS N7401 22 52 58.50 +01 08 32.0 3 0.69 1.68 SPF WS SPC N7402 22 53 04.476 +01 08 39.42 3 0.91 0.60 SPF KHJ SPC N7403 22 53 06.36 +01 28 55.5 2 0.95 3.25 WS HCds N7404=I5260 22 54 18.59 -39 18 54.4 3 1.20 0.40 HCds ESOB WS N7405 22 53 36 +12 28.6 1o Mar N7405? 22 52 57.171 +12 35 37.00 1 KHJ N7405?? 22 50 51.727 +12 33 33.85 1 KHJ N7406 22 53 56.4 -06 34 46 2 0.00 1.41 WS SPC N7407 22 53 21.16 +32 07 44.3 5 1.34 0.43 WS UZC BPP DC CCA N7408 22 55 56.54 -63 41 40.8 3 2.10 3.19 ESOB WS HCds N7409 22 53 48.127 +20 12 37.36 1 KHJ N7410 22 55 00.76 -39 39 42.4 5 1.91 1.95 WS ESOB RC2 HC2m HCds N7411 22 54 34.935 +20 14 10.17 5 0.73 0.66 UZC KHJ HCds Pds CCA N7412 22 55 45.5 -42 38 30 3 6.05 1.53 WS ESOB HC N7412A 22 57 08.89 -42 48 17.9 2 1.70 2.47 WS HCds N7412A all 22 57 07.19 -42 48 16.0 4 4.31 2.44 Pds2 ESOB HC HCds N7412A east 22 57 09.41 -42 48 15.7 1 HCds N7413 22 55 03.143 +13 13 13.83 4 0.43 0.13 KHJ HCds UZC GSC N7414 22 55 24.387 +13 14 54.03 3 1.72 0.08 Pds2 KHJ HCds N7415e 22 54 53.64 +20 15 42.1 3 0.85 1.96 WS HCds CCA N7415w 22 54 51.72 +20 15 43.0 3 0.78 1.44 WS HCds UZC N7416 22 55 41.64 -05 29 42.8 5 0.86 0.73 HCds Pds GHD2 WS SPC N7417 22 57 49.26 -65 02 17.5 3 1.04 3.14 WS HCds ESOB N7418 22 56 36.1 -37 01 49 2 3.38 5.66 ESOB WS N7418A 22 56 41.5 -36 46 22 2 5.08 1.41 WS ESOB N7419 22 54 20.1 +60 48 55 1 HCds N7420 22 55 32.023 +29 48 17.83 3 0.24 0.52 UZC BPP KHJ N7421 22 56 54.1 -37 20 53 3 1.37 3.00 ESOB RC2 WS N7422 22 56 12.41 +03 55 35.2 5 1.16 1.05 WS SPF UZC K14 CCA N7423 22 55 08.5 +57 05 48 1 HCds N7424 22 57 18.39 -41 04 15.6 5 2.02 2.11 GSC WS HC2m GSCM HCds N7425 22 57 15.60 -10 57 00.8 2 0.52 0.85 GSC SPF N7426 22 56 03.00 +36 21 40.5 6 1.53 1.09 SBG2 CCA Pds UZC WS DC N7427 22 57 09.952 +08 30 20.30 3 1.27 0.24 SPF KHJ UZC N7428 22 57 19.55 -01 02 56.9 5 0.07 2.69 DC UZC WS SPC CCA N7429 22 56 00 +59 58.4 1 HCe N7430 22 57 29.67 +08 47 37.7 4 0.07 0.15 KEBA UZC WS SPF N7431e 22 57 39.0 +26 09 50 1 HCo N7431w 22 57 38.633 +26 09 51.49 3 1.18 0.30 HCo GSC KHJ N7432 22 58 02.03 +13 08 03.1 3 1.69 1.66 UZC CCA WS N7433 22 57 51.69 +26 09 42.5 3 0.55 1.25 WS Pds GSC N7434 22 58 21.480 -01 11 03.21 2 0.08 1.53 KHJ SPC N7435 22 57 54.47 +26 08 18.5 3 1.10 1.23 WS GSC CCA N7436=N7436A 22 57 57.537 +26 08 59.35 5 1.31 0.76 DC KHJ GSC UZC CCA N7436B 22 57 56.20 +26 08 58.0 4 0.66 1.33 Pds UZC GSC WS N7437 22 58 10.05 +14 18 30.9 4 1.78 2.53 DC WS UZC CCA N7438 22 57 20 +54 18.6 1 HCe N7438 ne 22 57 24 +54 20.1 1 HCe N7438 ne? 22 57 24.0 +54 21 59 1 WS N7438 sw 22 56 33 +54 12.9 1 HCe N7439? 22 58 09.972 +29 13 41.99 4 0.26 1.17 KHJ UZC BPP CCA N7440 22 58 32.590 +35 48 08.57 6 1.09 0.71 SBG2 KHJ HCds UZC CCA KET2 N7441:=I1458 22 56 41.43 -07 22 47.0 3 0.17 1.42 SPC WS SPF N7441? 22 59 29.156 -07 03 17.54 2 0.87 0.55 SPC KHJ N7442 22 59 26.62 +15 32 54.8 5 0.82 2.16 WS UZC DC GH CCA N7443 23 00 08.8 -12 48 27 3 2.23 2.31 GHD2 WS SPC N7444 23 00 08.9 -12 50 02 4 2.19 1.91 GHD2 WS Pds SPC N7445 22 59 22.406 +39 06 26.94 2 0.59 0.25 SBG2 KHJ N7446 22 59 28.998 +39 04 58.22 2 0.16 0.19 SBG2 KHJ N7447 23 00 26 -10 31.7 1o Mark N7448 23 00 03.63 +15 58 48.8 6 1.40 1.69 HCo WS GSC K02 UZC CCA N7449 22 59 37.66 +39 08 43.9 4 0.98 1.23 SBG2 WS UZC CCA N7450 23 00 47.797 -12 55 06.47 4 0.75 0.83 WS KEB1 SPC EDC N7451 23 00 40.86 +08 28 02.0 3 1.91 1.40 WS UZC CCA N7452: 23 00 47.488 +06 44 44.11 2 0.34 0.29 GSC KHJ N7453 23 01 25.53 -06 21 19.6 2 2.32 5.44 HCds WS N7454 23 01 06.55 +16 23 20.3 5 2.04 2.51 GH UZC WS DC CCA N7455: 23 00 40.92 +07 18 11.2 5 1.36 1.30 KET1 WS UZC K14 GSC N7456 23 02 10.11 -39 34 10.2 4 1.56 0.94 ESOB GSCM WS GSC N7457 23 00 59.93 +30 08 40.7 5 1.04 2.09 DC WS UZC BPP CCA N7458 23 01 28.53 +01 45 11.7 5 2.31 1.52 DC WS SPC UZC CCA N7459: 23 00 59.9 +06 44 56 1 Pds N7459:ne 23 01 00.25 +06 45 02.8 4 1.08 1.86 SPF GSC WS HCds N7459:sw 23 00 59.61 +06 44 57.6 4 0.58 1.47 WS GSC HCds SPF N7460 23 01 42.87 +02 15 48.4 6 1.83 1.05 WS DC SPF SPC CCA UZC N7461 23 01 48.24 +15 34 57.6 4 2.80 2.95 WS DC UZC CCA N7462 23 02 46.48 -40 50 05.7 4 2.83 2.92 WS ESOB GSCM HCds N7463 23 01 51.82 +15 58 55.0 8 3.16 1.38 KEBA DC WS GH K02 UZC GSC CCA N7464 23 01 53.74 +15 58 25.4 8 1.25 0.62 DC UZC GH K02 GSC KEBA WS CCA N7465 23 02 00.93 +15 57 54.5 8 1.48 2.71 DC GH K02 UZC WS SDP GSC CCA N7466 23 02 03.459 +27 03 08.96 5 0.78 0.78 KEB1 DC KHJ UZC CCA N7467 23 02 27.540 +15 33 14.04 2 1.14 0.91 KHJ Pds N7468 23 02 59.146 +16 36 15.29 13 1.87 1.69 DC HCds HC2m UA20 UZC 2MSX GSCA APMN GSC2 WS K02 CCA SDP N7469 23 03 15.625 +08 52 26.04 11 1.19 1.47 WS CCO UZC DC UWS CCR JCR EDC vdH+ CCA GH N7470 23 05 13.6 -50 06 42 2 4.06 1.41 ESOB WS N7471 23 03 53 -22 54.4 1o Mu2 N7472=N7482 23 05 38.6 +03 03 32 4 0.75 2.08 WS SPC UZC KEBA N7473 23 03 57.14 +30 09 35.8 4 0.74 1.29 CCA WS UZC BPP N7474 23 04 04.432 +20 04 00.72 3 0.71 0.99 UZC KHJ Pds N7475ne 23 04 11.6 +20 05 02 2 0.00 1.41 WS UZC N7475sw 23 04 10.2 +20 04 43 2 2.00 2.12 WS UZC N7476 23 05 11.99 -43 05 53.6 4 0.46 1.62 GSC HCds ESOL WS N7477 23 04 40.9 +03 07 12 1 HCm N7477 F gal 23 04 40.60 +03 07 04.4 1 HCds N7477 ne * 23 04 41.46 +03 07 21.4 1 HCds N7477 sw * 23 04 40.63 +03 07 12.7 1 HCds N7478 23 04 56.49 +02 34 38.4 4 0.52 1.74 WS Pds2 SPC SPF N7479 23 04 56.75 +12 19 20.3 6 2.33 3.13 HHKK WS CCA GH K13 DC N7480=N7480A 23 05 13.58 +02 32 57.1 5 1.08 1.80 WS HCds SPC UZC CCA N7480B 23 05 01.64 +02 32 27.8 1 HCds N7481 23 05 51 -19 56.4 1o OSt1 N7482=N7472 23 05 38.6 +03 03 32 4 0.75 2.08 WS SPC UZC KEBA N7483 23 05 48.17 +03 32 40.8 6 2.24 1.43 DC SPC Pds UZC WS CCA N7484 23 07 04.6 -36 16 25 2 5.11 2.83 ESOB WS N7485 23 06 04.90 +34 06 28.6 6 0.97 2.60 WS UZC DC HCds SBG2 CCA N7486 23 06 13.0 +34 06 05 1 HCds N7487 23 06 50.573 +28 10 44.04 4 0.75 0.73 BPP KHJ UZC CCA N7488 23 07 48.951 +00 56 25.52 4 1.23 1.26 UZC KHJ SPC KEBA N7489 23 07 32.62 +22 59 51.3 4 1.63 1.92 DC WS UZC CCA N7490 23 07 25.125 +32 22 30.85 5 1.26 1.65 DC BPP KHJ UZC CCA N7491 23 08 06.0 -05 58 01 2 0.00 0.71 WS SPC N7492 23 08 26.68 -15 36 41.3 1 SW N7493 23 08 31.62 +00 54 35.9 3 0.71 1.89 WS GSC HCds N7494 23 08 58.5 -24 22 09 2 2.89 2.12 WS ESOB N7495 23 08 57.27 +12 02 51.4 3 1.51 1.08 UZC CCA WS N7496 23 09 46.9 -43 25 40 3 0.63 3.46 WS ESOB RC2 N7496A 23 12 23.4 -43 46 45 2 0.00 1.41 ESOB WS N7496A knot 23 12 21.0 -43 46 40 1 WS N7497 23 09 03.53 +18 10 36.4 5 2.11 0.73 UZC WS CCA GH DC N7498 23 09 55.7 -24 25 30 3 3.61 0.58 Pds2 ESOB WS N7499 23 10 22.410 +07 34 51.12 5 0.81 1.45 GH KHJ GSC UZC CCA N7500 23 10 29.867 +11 00 43.96 5 0.64 0.46 KHJ Pds UZC CCA GSC N7501 23 10 30.464 +07 35 20.47 4 0.84 0.53 KHJ GSC GH UZC N7502 23 10 19.7 -21 44 13 2 0.98 2.12 ESOB HCm N7502 nw * 23 10 19.20 -21 44 11.3 1 HCds N7502 se ** 23 10 20.42 -21 44 19.7 1 HCds N7503 23 10 42.274 +07 34 03.70 4 0.28 0.59 GH UZC KHJ GSC N7504: 23 10 41.09 +14 23 08.9 2 0.72 1.41 WS HCds N7505 23 11 00.7 +13 37 51 2 0.00 2.12 WS Pds N7506 23 11 41.00 -02 09 35.7 6 0.74 2.01 Pds SPC CCA DC UZC WS N7507 23 12 07.6 -28 32 24 3 2.01 4.04 WS ESOB GHD2 N7508 23 11 49.22 +12 56 24.9 3 0.00 1.00 Pds WS CCA N7509 23 12 21.481 +14 36 32.86 3 0.86 0.69 KHJ Pds UZC N7510 23 11 03.8 +60 34 15 1 HCds N7511 23 12 26.34 +13 43 34.7 3 2.11 0.23 UZC WS CCA N7512 23 12 20.86 +31 07 32.6 5 2.14 3.43 DC WS BPP UZC CCA N7513 23 13 13.8 -28 21 30 2 1.86 0.00 WS GHD2 N7514 23 12 25.75 +34 52 52.3 5 2.58 1.82 WS DC UZC SBG2 CCA N7515 23 12 48.679 +12 40 46.11 5 2.31 2.17 DC UZC KHJ CCA Pds N7516 23 12 51.92 +20 14 53.7 4 0.83 0.40 WS HCds UZC CCA N7517 23 13 13.817 -02 06 02.30 3 0.18 1.20 UZC SPC KHJ N7518 23 13 12.74 +06 19 17.4 7 1.93 1.19 DC WS UZC K14 K16 CCA KET1 N7519 23 13 11.26 +10 46 18.7 5 1.01 2.00 WS UZC RH GSC CCA N7520?=I5290 23 12 53.0 -23 28 12 2 1.94 4.24 ESOB WS N7521 23 13 35.3 -01 43 52 4 0.00 1.73 WS KEBA UZC SPC N7522? 23 15 36.4 -22 53 41 1 HCo N7523 23 13 34.66 +13 59 10.7 3 0.17 1.15 WS UZC HCds N7524 23 13 46.54 -01 43 50.8 3 0.87 1.64 WS SPF SPC N7525 23 13 40.493 +14 01 16.76 5 0.62 2.37 Pds SDP KHJ HCds K15 N7525 comp 23 13 40.25 +14 01 29.3 1 HCds N7526 23 14 02.3 -09 13 17 2 1.05 0.00 WS HCds N7527 23 13 41.819 +24 54 07.96 3 0.75 0.31 KHJ UZC CCA N7528 23 14 20.13 +10 13 52.7 3 2.41 3.01 WS HCds Pds2 N7529 23 14 03.21 +08 59 31.5 5 1.29 1.59 WS K10 UZC GSC CCA N7530 23 14 11.839 -02 46 46.23 2 0.34 0.83 KHJ SPC N7531 23 14 48.45 -43 35 58.5 6 1.47 1.54 HCds GSCM WS HC2m 2MXS ESOB N7532 23 14 22.23 -02 43 40.7 4 0.22 1.78 SPF KET1 WS SPC N7533 23 14 22.077 -02 02 02.55 2 0.00 1.58 SPC KHJ N7534 23 14 26.59 -02 41 57.1 4 0.65 1.69 WS SPF GSC SPC N7535 23 14 12.74 +13 34 54.6 2 0.52 0.42 CCA HCds N7536 23 14 13.19 +13 25 33.3 3 1.88 0.23 WS UZC CCA N7537 23 14 34.59 +04 29 53.8 6 1.91 0.80 GH K16 UZC WS DC CCA N7538 23 13 38 +61 30.7 1 HCe N7538ne 23 13 40.71 +61 30 53.7 1 HCds N7538sw 23 13 28.62 +61 30 09.3 1 HCds N7539 23 14 29.39 +23 41 05.4 4 2.13 2.45 DC WS UZC CCA N7540 23 14 36.08 +15 57 01.3 4 1.08 1.99 WS Pds Pds2 HCds N7540 ne comp 23 14 37.53 +15 57 09.9 2 1.53 1.98 WS HCds N7540 sw comp 23 14 33.23 +15 56 54.5 1 HCds N7541=?N7581 23 14 43.66 +04 32 01.8 5 4.18 1.32 WS GH UZC vdH+ CCA N7542 23 14 41.7 +10 38 35 2 0.00 2.12 WS Pds N7543 23 14 34.622 +28 19 37.82 5 0.89 1.09 BPP KHJ UZC DC CCA N7544 23 14 56.999 -02 11 58.19 3 0.32 0.85 GSC KHJ SPC N7545 23 15 32.4 -38 32 07 2 0.83 0.00 WS ESOB N7546 23 15 05.58 -02 19 30.5 3 0.87 2.20 SPC WS GSC N7547 23 15 03.52 +18 58 24.3 5 1.17 2.59 WS CCA UZC HCo HKA N7548 23 15 11.20 +25 16 56.1 4 0.86 4.01 WS UZC DC CCA N7549 23 15 17.27 +19 02 27.3 5 1.77 3.24 WS UZC HKA CCA K11 N7550 23 15 16.08 +18 57 39.5 4 0.78 2.32 WS HKA CCA UZC N7551 23 15 21.9 +15 56 25 1 HCm N7551 * 23 15 21.77 +15 56 23.1 1 HCds N7551 gal 23 15 22.03 +15 56 27.6 1 HCds N7552=I5294 23 16 10.77 -42 35 05.0 4 1.56 2.84 WS HC2m ESOB GC N7553: 23 15 33.096 +19 02 53.38 1 KHJ N7553? 23 15 36.3 +19 01 54 1 HCo N7553?? 23 15 38.8 +18 58 25 1 HCo N7554 23 15 41.357 -02 22 43.76 4 0.28 1.17 SPF KHJ SPC GSC N7555 23 15.5 +12 34 1o JH N7556 23 15 44.40 -02 22 53.8 4 0.78 0.48 SPC WS SPF GSC N7556A 23 15 43.73 -02 23 08.0 1 SPF N7557 23 15 39.825 +06 42 28.94 3 0.65 1.34 KHJ Pds UZC N7558 23 15 38.287 +18 55 11.54 3 0.82 1.63 KHJ HCo HKA N7559=N7559A 23 15 46.58 +13 17 25.4 4 0.97 2.96 WS UZC Pds CCA N7559B 23 15 46.0 +13 17 48 2 0.00 2.12 WS Pds2 N7560 23 15 53.76 +04 29 43.9 2 0.11 1.77 HCds WS N7561 23 15 57.44 +04 31 20.2 2 0.42 2.19 HCds WS N7562 23 15 57.54 +06 41 14.6 5 2.16 1.69 DC UZC WS GH CCA N7562A 23 16 01.42 +06 39 08.6 4 1.89 0.20 WS GH CCA STMW N7563 23 15 55.95 +13 11 45.8 4 0.66 0.35 DC UZC WS CCA N7564 23 16 01.19 +07 20 53.0 1 HCds N7565 23 16 19 -00 03.5 1o ASec N7566 23 16 37.4 -02 19 52 2 0.00 0.00 SPC WS N7567 23 16 10.84 +15 51 01.6 3 1.08 1.57 WS UZC CCA N7568=?N7574 23 16 24.91 +24 29 48.5 4 2.16 1.28 DC WS UZC CCA N7569 23 16 44.54 +08 54 21.7 1 HCds N7570 23 16 44.74 +13 28 58.7 6 0.68 1.50 Pds WS UZC K15 CCA DC N7571? 23 17 10.5 +18 58 01 1 WS N7571?=N7597 23 18 30.2 +18 41 16 2 2.01 1.41 UZC WS N7571??=N7578 23 17 12.7 +18 42 15 1 HCm N7572 23 16 50.4 +18 28 57 3 0.82 0.00 WS Pds UZC N7573 23 16 26.325 -22 09 15.81 2 0.48 0.04 WS KHJ N7574?=N7568 23 16 24.91 +24 29 48.5 4 2.16 1.28 DC WS UZC CCA N7575: 23 17 20.91 +05 39 39.2 3 0.60 0.58 GSC K16 Pds N7576 23 17 22.6 -04 43 43 3 1.73 3.21 GHD2 WS SPC N7577 23 17 17.9 +07 22 02 1 HCm N7577 * 23 17 18.50 +07 22 08.4 1 HCds N7577 gal 23 17 17.09 +07 21 55.1 3 0.86 3.01 WS Pds2 HCds N7578=??N7571 23 17 12.7 +18 42 15 1 HCm N7578=N7578B 23 17 13.49 +18 42 28.1 4 1.34 0.43 Pds WS HKA CCA N7578A 23 17 11.95 +18 42 02.9 5 0.95 0.80 Pds WS UZC HKA CCA N7579 23 17 38.917 +09 25 59.03 3 1.11 0.91 KHJ UZC Pds N7580 23 17 36.58 +14 00 02.8 4 0.70 0.97 UZC K15 CCA WS N7581?=N7541 23 14 43.66 +04 32 01.8 5 4.18 1.32 WS GH UZC vdH+ CCA N7582 23 18 23.49 -42 22 14.2 6 2.77 2.42 ESOB RC2 WS HC2m HCds GSC N7583=N7605 23 17 52.76 +07 22 44.4 4 1.25 1.65 Pds HCds WS Hu N7584 23 17 53.1 +09 25 58 3 0.85 0.58 UZC WS KEBA N7585 23 18 01.3 -04 39 03 2 0.00 0.71 WS SPC N7586 23 17 55.57 +08 35 03.8 3 0.99 0.95 HCds Hu GSC N7587 23 17 59.25 +09 40 49.2 5 3.48 3.55 WS UZC GSC CCA GH N7588 23 17 57.827 +18 45 08.05 2 0.35 0.42 KHJ KEBA N7589 23 18 15.646 +00 15 40.48 4 1.23 0.87 SPC SBIB KHJ UZC N7590 23 18 54.71 -42 14 21.6 2 1.64 1.48 WS HC2m N7591 23 18 16.21 +06 35 08.6 3 2.77 1.00 DC WS CCA N7592 23 18 22.1 -04 24 59 3 1.49 2.08 WS KET2 SPC N7593 23 17 57.00 +11 20 55.9 4 1.34 1.75 WS K10 CCA UZC N7594=I1478 23 18 13.98 +10 17 52.1 5 0.71 1.64 WS GSC CCA Pds UZC N7595 23 18 30.20 +09 55 55.8 3 0.77 1.73 HCds WS Pds2 N7596=I1477 23 17 11.93 -06 54 42.9 3 0.52 1.47 HCds WS SPC N7597=?N7571 23 18 30.2 +18 41 16 2 2.01 1.41 UZC WS N7598 23 18 33.3 +18 44 58 2 0.00 2.12 WS KEBA N7599=I5308 23 19 20.92 -42 15 25.0 4 1.39 3.77 WS ESOB RC2 HC2m N7600 23 18 53.8 -07 34 48 3 1.72 2.31 GHD2 SPC WS N7601 23 18 47.13 +09 14 00.8 5 1.26 1.79 K10 WS CCA UZC GH N7602 23 18 43.428 +18 41 53.04 2 2.02 1.51 UZC KHJ N7603 23 18 56.536 +00 14 38.15 10 1.62 2.99 DC Pds KET1 WS SPF CCA vdH+ EDC UZC SPC N7604 23 17 51.88 +07 25 46.2 4 0.77 1.90 HCds Hu WS Pds N7605=N7583 23 17 52.76 +07 22 44.4 4 1.25 1.65 Pds HCds WS Hu N7606 23 19 04.80 -08 29 08.9 4 0.71 2.50 GHD2 SPF SPC WS N7607=I1480 23 18 59.3 +11 20 29 2 1.04 1.41 HCds WS N7607=I1480 e * 23 18 59.60 +11 20 30.3 1 HCds N7607=I1480 w * 23 18 58.77 +11 20 30.4 1 HCds N7608 23 19 15.32 +08 21 01.7 5 0.39 2.84 HCds WS UZC Hu CCA N7609 23 19 29.95 +09 30 28.6 3 0.26 0.06 HKA UZC WS N7610=N7616? 23 19 41.46 +10 11 05.0 4 1.85 2.21 K10 UZC CCA WS N7611 23 19 36.70 +08 03 47.6 6 2.88 1.37 WS Hu UZC CCA GH DC N7612 23 19 44.23 +08 34 35.3 7 1.47 1.55 WS DC UZC GSC Pds CCA Hu N7613 23 19 51 +00 11.9 1o ASec N7613?? 23 19 51.6 +00 25 21 2 1.06 1.41 WS Pds2 N7614 23 19 51 +00 11.9 1o ASec N7615 23 19 54.52 +08 23 58.4 5 3.54 2.45 WS UZC GSC GH Hu N7616?=N7610 23 19 41.46 +10 11 05.0 4 1.85 2.21 K10 UZC CCA WS N7617 23 20 09.087 +08 09 56.21 4 1.61 0.84 UZC KHJ Hu GH N7618 23 19 47.33 +42 51 09.3 5 0.59 1.53 WS UZC SBG2 DC CCA N7619 23 20 14.60 +08 12 22.5 7 2.04 1.52 Pds UZC WS CCA DC GH Hu N7620 23 20 05.71 +24 13 14.2 6 1.26 3.06 SDP WS K02 UZC CCA DC N7621 23 20 24.7 +08 21 57 3 3.43 0.58 WS Pds Hu N7622 23 21 38.6 -62 07 03 2 1.47 1.41 WS ESOB N7623 23 20 30.070 +08 23 45.54 8 1.38 2.07 Pds KHJ GSC UZC DC CCA GH Hu N7624 23 20 22.76 +27 18 54.4 6 1.57 2.32 WS BCG CCA UZC SDP DC N7625 23 20 30.10 +17 13 33.3 5 1.27 1.03 HCds K15 UZC CCA WS N7626 23 20 42.58 +08 13 00.6 7 1.87 1.61 DC GH HCds WS UZC CCA Hu N7627:=N7641 23 22 30.97 +11 53 32.1 4 1.83 0.91 WS UZC CCA Pds N7628 23 20 54.96 +25 53 54.9 4 1.31 2.61 DC CCA WS UZC N7629 23 21 19.358 +01 24 11.11 3 0.75 1.01 SPC KHJ UZC N7630 23 21 16.35 +11 23 50.2 5 1.39 1.18 WS UZC CCA HCds Pds N7631 23 21 26.79 +08 13 02.9 6 3.21 1.72 GH WS UZC DC CCA Hu N7632=I5313 23 22 01.01 -42 28 48.0 3 2.61 3.30 HCds WS ESOB N7633 23 23 03.1 -67 39 10 2 0.00 4.95 ESOB WS N7634 23 21 41.90 +08 53 14.2 5 2.35 2.99 WS UZC CCA DC Hu N7635 23 20 45 +61 12.7 1 HCe N7636 23 22 33.1 -29 16 51 2 0.00 2.12 ESOB WS N7637 23 26 29.0 -81 54 41 2 1.30 0.00 WS ESOB N7638=I1483 23 22 33.08 +11 19 47.3 5 2.12 3.22 WS Pds UZC HCds K10 N7639=I1485 23 22 48.230 +11 22 22.76 4 0.82 1.63 Pds KHJ HCds GSC N7640 23 22 06.67 +40 50 42.7 6 2.58 1.99 UZC CCA SBG2 WS DC GHD1 N7641=:N7627 23 22 30.97 +11 53 32.1 4 1.83 0.91 WS UZC CCA Pds N7642 23 22 53.31 +01 26 33.8 5 3.40 1.81 DC SPC WS UZC CCA N7643=?N7644 23 22 50.45 +11 59 18.4 3 0.42 2.00 WS UZC CCA N7644?=N7643 23 22 50.45 +11 59 18.4 3 0.42 2.00 WS UZC CCA N7644?=N7651 23 24 26.0 +13 58 18 2 1.03 1.41 WS UZC N7645 23 23 47.2 -29 23 15 2 4.61 4.24 ESOB WS N7646:=I5318 23 24 06.90 -11 51 38.2 7 0.78 1.30 GSC Pds2 WS SPF HCds SPC HCo N7647 23 23 57.43 +16 46 38.4 4 0.93 0.96 HCds GSC UZC CCA N7648=I1486 23 23 54.13 +09 40 04.0 6 1.21 1.65 HCds CCA UZC WS DC KET1 N7649=I1487 23 24 20.12 +14 38 47.9 3 0.59 1.55 WS GSC CCA N7650 23 25 21.32 -57 47 27.1 3 3.00 3.03 WS ESOB HCds N7650 knot/comp 23 25 21.65 -57 47 00.6 1 HCds N7651 comp 23 24 25.67 +13 58 01.2 2 0.62 2.76 WS HCds N7651=?N7644 23 24 25.99 +13 58 19.2 3 0.73 1.85 WS HCds UZC N7652 23 25 37.5 -57 53 14 2 1.12 3.54 ESOB WS N7653 23 24 49.36 +15 16 30.3 6 1.98 1.55 WS GSC UZC Pds CCA DC N7654 23 24 48 +61 35.6 1 HCe N7654 core 23 24 50.5 +61 36 23 1 HCds N7655 23 26 45.9 -68 01 40 2 0.00 0.00 ESOB WS N7656 23 24 31.481 -19 03 34.62 5 1.21 1.89 SPC KHJ ESOB WS HCds N7656 comp 23 24 30.43 -19 03 02.3 1 HCds N7656 loop 23 24 33.47 -19 03 13.5 1 HCds N7656 plume+comp 23 24 30.23 -19 02 53.1 1 HCds N7657 23 26 47.0 -57 48 18 2 1.68 2.83 ESOB WS N7658A 23 26 24.8 -39 12 58 2 4.09 0.71 WS ESOB N7658B 23 26 25.0 -39 13 36 2 1.64 2.12 WS ESOB N7659 23 25 55.65 +14 12 33.9 4 1.54 1.08 WS Pds UZC CCA N7660 23 25 48.77 +27 01 45.5 5 0.59 1.82 WS BCG UZC CCA DC N7661 23 27 14.4 -65 16 17 3 0.95 1.53 Pds WS ESOB N7662 23 25 53.893 +42 32 05.93 4 0.68 0.51 UJ10 2MSP CK PPM N7663 23 26 40 -04 45.2 1o ASec N7663? 23 26 45.06 -04 57 57.2 3 1.49 1.86 Pds2 WS GSC N7663?? 23 26 27.24 -04 57 56.0 2 0.63 0.42 GSC SPC N7664 23 26 39.77 +25 04 48.4 4 1.30 1.14 WS DC UZC CCA N7665 23 27 14.8 -09 23 13 2 0.00 1.41 WS SPC N7666 23 27 24 -04 11.2 1o ASec N7667 23 27 22 -00 11.2 1o ASec N7667? 23 24 23.1 -00 06 30 2 0.00 2.83 UZC WS N7668 23 27.4 -00 11 1o ASec N7669 23 27.4 -00 11 1o ASec N7670 23 27.4 -00 11 1o ASec N7671 23 27 19.39 +12 28 02.9 5 1.17 1.72 WS DC UZC GH CCA N7672 23 27 31.465 +12 23 06.44 4 0.69 2.46 WS GH UW UZC N7673 23 27 41.31 +23 35 21.8 6 3.59 3.03 K02 WS UZC DC CCA SDP N7674 23 27 56.76 +08 46 43.3 10 2.01 2.98 DC WS UZC K10 Pds GSC JCR CCA HKA KET1 N7674A 23 27 58.77 +08 46 57.7 2 0.73 0.49 GSC HKA N7675 23 28 05.941 +08 46 06.20 4 1.05 0.54 UZC GSC KHJ HKA N7676 23 29 01.8 -59 43 02 2 1.59 1.41 WS ESOB N7677 23 28 06.10 +23 31 51.7 7 3.15 1.30 DC SDP WS K02 Pds UZC CCA N7678 23 28 27.93 +22 25 15.9 6 1.05 3.35 GH WS GSC UZC CCA DC N7679 23 28 46.69 +03 30 41.2 6 1.76 2.90 WS SPC UZC CCA KET1 GH N7680 23 28 35.11 +32 24 56.1 6 1.63 1.72 DC BPP WS Pds UZC CCA N7680 comp 23 28 31.574 +32 25 19.77 1 KHJ N7681 23 28 54.83 +17 18 32.6 5 1.11 1.65 WS Pds DC GSC CCA N7682 23 29 03.819 +03 32 00.06 7 2.93 2.61 DC UZC SPC GH JCR KHJ CCA N7683 23 29 03.83 +11 26 41.3 3 1.02 1.00 WS UZC CCA N7684 23 30 32.05 +00 04 50.8 5 1.28 0.59 WS UZC SPC SPC CCA N7685 23 30 33.43 +03 54 04.6 4 1.93 1.08 WS GH UZC CCA N7686 23 30 07 +49 08.0 1 BSV N7687 23 30 54.451 +03 32 48.88 3 1.50 2.22 SPC KHJ UZC N7688 23 31 05.561 +21 24 40.62 4 1.97 0.87 HCds KHJ UZC Pds N7688 comp 23 31 04.17 +21 24 24.3 1 HCds N7689 23 33 16.2 -54 05 38 3 1.51 3.46 ESOB RC2 WS N7690 23 33 02.3 -51 41 52 2 0.65 4.24 ESOB WS N7691 23 32 24.47 +15 50 51.3 3 2.18 2.00 UZC CCA WS N7692 23 32 46.7 -05 35 47 2 0.00 0.71 WS SPC N7693 23 33 10.517 -01 17 31.07 3 0.76 1.06 SPC KHJ UZC N7694 23 33 15.98 -02 42 11.9 3 2.59 2.46 SPC WS GSC N7695 23 33 14.939 -02 43 12.67 3 0.92 0.55 SPC GSC KHJ N7696 23 33 50.2 +04 52 14 3 2.28 0.00 UZC WS Pds2 N7697=I5333 23 34 52.63 -65 23 45.7 4 1.68 2.30 WS ESOB HCds Pds N7698 23 34 01.651 +24 56 40.26 4 0.99 0.29 KHJ UZC DC CCA N7699 23 34 26.99 -02 53 59.6 3 0.17 2.70 SPC WS GSC N7700 23 34 30.18 -02 57 13.8 3 0.09 0.72 GSC WS SPC N7701 23 34 31.47 -02 51 16.9 3 0.00 2.52 SPC WS GSC N7702 23 35 28.9 -56 00 40 2 1.18 6.36 WS ESOB N7703 23 34 46.85 +16 04 31.7 3 1.30 1.08 WS UZC CCA N7704 23 35 01.115 +04 53 50.92 6 1.05 0.60 KHJ GSC CCA UZC SPF Pds N7705 23 35 02.529 +04 48 13.72 4 0.15 0.09 KHJ GSC Pds2 UZC N7706 23 35 10.49 +04 57 50.6 6 0.76 0.49 WS GSC SPF Pds UZC CCA N7707 23 34 51.447 +44 18 13.99 4 0.57 0.58 KHJ UZC SBG2 CCA N7708 23 35 01 +72 50.0 1 HCe N7709 23 35 27.3 -16 42 20 2 2.03 1.41 WS SPC N7710 23 35 46.1 -02 52 52 2 0.00 0.71 SPC WS N7711 23 35 39.39 +15 18 04.8 4 0.76 2.28 WS UZC CCA DC N7712 23 35 51.53 +23 37 07.1 5 1.74 1.80 DC WS UZC CCA K11 N7713 23 36 15.08 -37 56 19.4 3 3.12 2.20 HCds HC2m WS N7713A 23 37 08.2 -37 42 52 3 0.00 0.58 ESOB Pds2 WS N7714 23 36 14.19 +02 09 17.9 11 3.03 2.15 DC JCO CCR JCR WS SPC vdH+ UZC CCA GH KET1 N7715 23 36 21.87 +02 09 23.4 5 2.05 2.25 WS UZC SPC GH CCA N7716 23 36 31.37 +00 17 49.8 6 3.38 1.24 DC WS UZC SPC GH CCA N7717 23 37 43.5 -15 07 08 2 2.05 0.00 SPC WS N7718 23 38 05.04 +25 43 10.6 5 1.26 1.69 WS HC UZC CCA Pds N7719 23 38 02.6 -22 58 29 2 0.97 1.41 WS ESOB N7719 comp 23 38 02.5 -22 58 41 1 WS N7720n 23 38 29.539 +27 02 04.58 4 0.28 2.09 WS PCR RG GPB N7720n+s 23 38 29.2 +27 01 57 1 HC N7720s 23 38 29.319 +27 01 51.47 8 2.28 2.24 DC WS GPB VV1 RG Pds PCR GSC N7721 23 38 48.6 -06 31 05 3 3.10 0.00 GHD2 WS SPC N7722 23 38 41.14 +15 57 14.8 4 3.06 1.29 WS UZC DC CCA N7723 23 38 56.89 -12 57 39.9 4 3.03 3.11 GHD2 WS SPC HHKK N7724 23 39 07.0 -12 13 28 2 1.04 0.71 WS SPC N7725 23 39 14.7 -04 32 21 2 0.00 0.71 WS SPC N7726: 23 39 11.95 +27 06 55.4 2 1.14 0.35 GSC CCA N7727 23 39 53.7 -12 17 35 2 0.00 0.71 WS SPC N7728 23 40 00.78 +27 08 00.9 5 2.14 2.97 HC WS DC UZC CCA N7729 23 40 33.71 +29 11 16.7 4 0.83 1.81 WS UZC BPP CCA N7730 23 40 45.9 -20 30 33 2 1.98 0.00 WS ESOB N7731 23 41 29.090 +03 44 23.50 5 0.88 1.47 SPC KHJ DC UZC CCA N7732 23 41 34.03 +03 43 28.0 4 1.74 1.25 CCA WS UZC STMM N7733 23 42 33.1 -65 57 25 2 0.43 2.12 WS ESOB N7734 23 42 43.1 -65 56 39 2 0.43 1.41 ESOB WS N7735 23 42 17.28 +26 13 55.0 5 1.13 1.72 Pds WS UZC HC CCA N7736 23 42 25.752 -19 27 09.08 5 0.65 1.55 ESOB WS SPC KHJ Pds N7737 23 42 46.39 +27 03 09.9 4 1.11 2.45 WS UZC HC CCA N7738 23 43 31 +00 29.3 1o ASec N7738? 23 44 02.07 +00 30 59.6 5 1.43 1.50 DC WS SPC UZC CCA N7739 23 43 31 +00 29.3 1o ASec N7739? 23 44 30.083 +00 19 12.14 3 0.84 1.69 SPF KHJ SPC N7740 23 43 32.25 +27 18 46.3 2 0.66 5.30 HC GSC N7741 23 43 54.26 +26 04 32.3 7 2.75 2.39 DC HCds GH WS UZC HC CCA N7742 23 44 15.81 +10 46 00.5 7 1.02 2.09 GH WS Pds UZC SPC CCA DC N7743 23 44 21.33 +09 56 01.3 6 2.58 3.35 WS SPC UZC CCA GH DC N7744=I5348 23 44 59.20 -42 54 38.3 3 0.32 1.42 HCds ESOB WS N7745 23 44 45.773 +25 54 30.39 2 0.44 2.67 Pds2 KHJ N7746 23 45 19.93 -01 41 05.7 5 1.28 0.50 SPC UZC WS DC CCA N7747 23 45 32.32 +27 21 36.3 4 2.20 2.00 DC UZC CCA WS N7748 23 44 56.58 +69 45 16.9 2 0.89 0.78 WS SAO N7749 23 45 47.4 -29 31 03 2 1.84 2.83 ESOB WS N7750 23 46 37.87 +03 47 58.0 7 0.85 1.03 WS DC Pds UZC SPC CCA SPF N7751 23 46 58.40 +06 51 43.0 4 0.60 3.59 WS UZC DC CCA N7752 23 46 58.51 +29 27 31.6 5 0.59 0.91 BPP WS KEB1 UZC CCA N7753 23 47 04.82 +29 28 59.6 7 1.51 1.99 DC BPP KEB1 KEBA WS UZC CCA N7754 23 49 11.1 -16 36 01 3 3.31 3.21 SHM WS SPC N7754A 23 49 06.2 -16 34 45 1 SPC N7755 23 47 51.41 -30 31 19.1 2 6.01 0.28 ESOB HC2m N7756: 23 48 28.60 +04 07 30.6 1 HCds N7756? 23 48 30.57 +04 08 21.6 1 HCds N7756?? 23 48 28.7 +04 02 57 1 HCo N7756??? 23 48 34.1 +04 05 37 1 HCds N7757 23 48 45.53 +04 10 16.2 4 0.67 1.98 WS UZC HCds CCA N7758 23 48 55.183 -22 01 26.76 3 0.69 1.53 WS KHJ ESOB N7759 23 48 54.72 -16 32 27.6 4 1.37 1.75 WS SPC HCds SGC N7759 comp 23 48 56.65 -16 32 26.8 2 4.16 0.42 SPC HCds N7760 23 49 11.92 +30 58 58.4 4 1.55 1.54 WS UZC BPP CCA N7761=I5361 23 51 28.868 -13 22 54.14 2 0.38 0.59 SPC KHJ N7762 23 50 01 +68 02.3 1 HCe N7763 23 50 15.685 -16 35 25.20 3 0.73 1.44 WS KHJ SPC N7764 23 50 53.6 -40 43 47 2 0.00 2.83 HC WS N7764A 23 53 22 -40 48.6 1 ESOB N7764Am 23 53 23.68 -40 48 25.3 2 0.08 1.13 WS HCds N7764Anw 23 53 20.23 -40 48 13.9 1 HCds N7764Ase 23 53 26.25 -40 48 56.7 1 HCds N7765 23 50 52.4 +27 09 55 2 0.95 1.41 HCo WS N7766 23 50 55.909 +27 07 34.76 3 0.15 0.30 GSC KHJ Pds2 N7767 23 50 56.52 +27 05 12.5 5 1.83 2.50 GSC UZC WS CCA DC N7768 23 50 58.54 +27 08 49.0 6 1.27 1.17 WS DC GSC CCA Pds UZC N7769 23 51 04.01 +20 09 01.4 8 1.46 2.26 UZC GSC K05 K14 CCA WS GH DC N7770 23 51 22.551 +20 05 48.14 8 1.07 2.52 GH K05 K14 KHJ GSC UZC DC CCA N7771 23 51 24.86 +20 06 43.0 8 2.83 2.60 UZC WS GH GSC CCA K05 K14 DC N7772 23 51 45 +16 14.9 1 HCe N7773 23 52 09.91 +31 16 37.0 5 1.88 3.17 DC UZC WS BPP CCA N7774e 23 52 11.62 +11 28 11.2 2 1.66 0.28 UZC GSC N7774w 23 52 10.57 +11 28 12.4 4 0.96 1.39 WS Pds UZC GSC N7775 23 52 24.29 +28 46 20.5 6 3.51 1.13 DC WS BPP UZC GSC CCA N7776=I1514 23 54 16.5 -13 35 12 2 1.03 0.00 WS SPC N7777 23 53 12.63 +28 17 01.0 5 2.87 2.62 UZC WS BPP CCA DC N7778 23 53 19.74 +07 52 14.7 5 2.89 2.14 WS UZC KEBA CCA DC N7779 23 53 26.83 +07 52 32.0 5 3.11 1.12 WS UZC KEBA CCA GH N7780 23 53 32.22 +08 07 04.3 3 0.86 0.61 WS UZC CCA N7781 23 53 45.9 +07 51 37 3 0.86 0.58 WS Pds UZC N7782 23 53 53.98 +07 58 14.1 5 1.15 1.81 WS UZC DC CCA GH N7783=N7783A 23 54 10.06 +00 22 58.3 7 1.48 1.63 DC CCA UZC WS GSC HKA SPC N7783B 23 54 12.036 +00 22 37.41 6 3.04 1.31 DC CCA GSC KHJ SPC HKA N7783C 23 54 13.821 +00 21 24.92 3 1.04 0.57 GSC KHJ HKA N7783D 23 54 10.68 +00 23 38.6 2 1.38 0.07 GSC HKA N7784 23 55 13.669 +21 45 44.12 3 0.06 1.53 UZC Pds2 KHJ N7785 23 55 19.00 +05 54 55.9 5 1.11 1.88 WS UZC GH CCA DC N7786 23 55 21.47 +21 35 17.3 6 3.71 1.51 WS DC K05 KEBA UZC CCA N7787 23 56 07.76 +00 32 58.4 4 0.22 1.25 WS Pds SPC CCA N7788 23 56 45.6 +61 23 59 1 HCe N7789 23 57 24 +56 42.5 1 BSV N7790 23 58 24 +61 12.5 1 BSV N7791 23 57 57.23 +10 45 55.8 2 1.25 1.06 WS HCds N7792 23 58 03.60 +16 30 05.2 3 0.42 1.96 Pds WS HCds N7792 comp 23 58 03.72 +16 29 46.5 1 HCds N7793 23 57 49.70 -32 35 27.9 6 3.11 3.86 WS HCds HCds HC2m HCds GHD2 N7794 23 58 34.17 +10 43 41.3 6 1.81 1.44 HCds WS UZC K14 CCA DC N7795 23 58 37 +60 02.1 1 HCe N7796 23 58 59.7 -55 27 25 3 0.00 4.04 ESOB RC2 WS N7797 23 58 58.83 +03 38 04.2 4 0.45 2.97 WS UZC SPC CCA N7798 23 59 25.52 +20 44 58.4 4 2.65 1.52 DC UZC WS CCA N7799 23 59 31.54 +31 17 44.2 1 GSC N7800 23 59 36.94 +14 48 25.1 5 2.08 1.74 K13 UZC WS DC CCA N7801 00 00 21 +50 44.5 3 9.55 12.49 WS HCe BSV N7802 00 01 00.44 +06 14 31.1 5 0.75 2.51 Pds CCA WS UZC GSC N7803 00 01 19.98 +13 06 39.8 5 1.89 1.49 DC WS UZC CCA HKA N7804 00 01 18.79 +07 44 55.5 2 0.42 4.74 WS HCds N7805 00 01 26.71 +31 26 01.6 7 1.85 2.75 DC BPP WS UZC SDP CCA K03 N7806 00 01 30.05 +31 26 30.2 6 1.67 1.91 BPP HCo UZC WS CCA DC N7807 00 00 26.69 -18 50 31.5 3 0.86 1.04 GSC WS SPC N7808 00 03 32.192 -10 44 40.11 2 1.04 0.57 KHJ SPC N7809 00 02 09.4 +02 56 25 3 0.87 1.73 WS UZC SPC N7810 00 02 19.25 +12 58 17.1 4 1.30 1.64 WS UZC CCA DC N7811 00 02 26.482 +03 21 06.42 5 1.84 1.49 WS UZC EDC SPC KET1 N7811nw 00 02 26.250 +03 21 12.81 1 EDC N7812 00 02 54.3 -34 14 08 2 1.75 3.54 WS ESOB N7813=I5384 00 04 09.23 -11 59 03.4 4 1.10 0.70 HCds WS KET2 SPC N7814 00 03 14.95 +16 08 43.4 9 1.61 1.97 WS GSC GSCM JGr CCA UZC DC GH K13 N7815 00 03 24.86 +20 42 14.3 1 HCds N7816 00 03 48.95 +07 28 43.3 6 1.14 2.31 UZC Pds WS HC CCA DC N7817 00 03 58.80 +20 45 02.7 4 3.55 3.94 WS UZC DC CCA N7818 00 04 08.89 +07 22 43.9 5 1.21 2.18 Pds HC UZC CCA WS N7819 00 04 24.584 +31 28 20.42 7 1.00 2.05 UZC BPP Pds KHJ K03 CCA DC N7820 00 04 30.78 +05 11 58.1 4 2.54 2.98 DC CCA UZC WS N7821 00 05 16.6 -16 28 37 2 1.02 1.41 WS SPC N7822: 00 03.6 +67 09 1 HCe N7822? 00 03.3 +68 28 1 HCe N7823 00 04 46.3 -62 03 41 2 4.92 0.00 WS ESOB N7824 00 05 06.237 +06 55 11.95 5 1.24 2.61 DC KHJ CCA HC UZC N7825 00 05 06.7 +05 12 10 2 0.00 2.83 WS UZC N7826 00 05 17 -20 41.5 4 31.06 57.34 BSV HCds WS ESOB N7827 00 05 27.70 +05 13 19.1 4 0.57 2.15 WS UZC GSC CCA N7828 00 06 27.06 -13 24 57.0 3 0.75 2.71 SPC GSC WS N7829 00 06 29.08 -13 25 15.4 3 0.50 2.16 GSC SPC WS N7830 00 06 01.9 +08 20 33 1 HC N7831=I1530 00 07 19.49 +32 36 34.1 9 1.82 2.75 WS Pds DC GHD1 UZC GSC CCA KEBA BPP N7832=I5386 00 06 28.42 -03 42 59.1 4 0.73 2.17 WS HCds SPC Pds N7833 00 06 31.9 +27 38 26 3 8.10 3.51 HC BSV WS N7834 00 06 37.88 +08 22 04.3 5 0.77 2.21 UZC WS HC K14 CCA N7835 00 06 46.6 +08 25 33 3 3.74 3.61 HC Pds2 WS N7836 00 08 01.696 +33 04 14.15 7 0.98 0.56 K04 SDP KHJ GSC UZC CCA DC N7837 00 06 51.430 +08 21 05.51 5 1.28 2.19 Pds2 KHJ GSC HC Pds N7838 00 06 53.92 +08 21 03.9 6 1.74 3.29 HC Pds2 Pds WS UZC GSC N7839 00 07 00.6 +27 38 07 2 0.00 0.71 HCds HC N7839 ne * 00 07 00.90 +27 38 15.0 2 0.66 1.70 HCds WS N7839 sw * 00 07 00.28 +27 37 58.1 1 HCds N7840 00 07 08.9 +08 22 57 2 0.00 3.54 WS HC astrometry.net-0.67/catalogs/ngc2000tofits.py000644 000765 000024 00000004411 12651445460 021237 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from ngc2000 import ngc2000, ngc2000accurate from astrometry.util.fits import * if __name__ == '__main__': # convert to a form that leads to simple updating with the "accurate" versions. nummap = dict([[(x['is_ngc'], x['id']), (x['ra'],x['dec'],x['size'])] for x in ngc2000]) print 'got %i' % len(nummap) # update with "accurate" values. nup = 0 for x in ngc2000accurate: key = (x['is_ngc'], x['id']) if key in nummap: (oldra, olddec, size) = nummap[key] nummap[key] = (x['ra'], x['dec'], size) nup +=1 print 'updated %i' % nup isngc = array([i for (i,n) in nummap.iterkeys()]) ngcnum = array([n for (i,n) in nummap.iterkeys()]) ra = array([r for (r,d,s) in nummap.itervalues()]) dec = array([d for (r,d,s) in nummap.itervalues()]) radius = array([s for (r,d,s) in nummap.itervalues()]) # turn from diameter in arcmin to radius in deg. radius /= (2. * 60.) print 'got %i RA (%i ngc)' % (len(ra), sum(isngc)) prim = pyfits.PrimaryHDU() #phdr = prim.header #phdr.update('AN_FILE', 'RDLS', 'Astrometry.net RA,Dec list') table = pyfits.new_table( [pyfits.Column(name='NGCNUM', format='1I', array=ngcnum[isngc], unit=''), pyfits.Column(name='RA', format='1E', array=ra[isngc], unit='deg'), pyfits.Column(name='DEC', format='1E', array=dec[isngc], unit='deg'), pyfits.Column(name='RADIUS', format='1E', array=radius[isngc], unit='deg'), ]) pyfits_writeto(pyfits.HDUList([prim, table]), 'ngc.fits') isic = logical_not(isngc) prim = pyfits.PrimaryHDU() #phdr = prim.header #phdr.update('AN_FILE', 'RDLS', 'Astrometry.net RA,Dec list') table = pyfits.new_table( [pyfits.Column(name='ICNUM', format='1I', array=ngcnum[isic], unit=''), pyfits.Column(name='RA', format='1E', array=ra[isic], unit='deg'), pyfits.Column(name='DEC', format='1E', array=dec[isic], unit='deg'), pyfits.Column(name='RADIUS', format='1E', array=radius[isic], unit='deg'), ]) pyfits_writeto(pyfits.HDUList([prim, table]), 'ic.fits') astrometry.net-0.67/catalogs/ngcic-accurate.c000644 000765 000024 00000001537 12651445460 021405 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "ngcic-accurate.h" #include "an-bool.h" static ngcic_accurate ngcic_acc[] = { #include "ngcic-accurate-entries.c" }; int ngcic_accurate_get_radec(int is_ngc, int id, float* ra, float* dec) { int i, N; N = sizeof(ngcic_acc) / sizeof(ngcic_accurate); for (i=0; i= N) return NULL; return ngcic_acc + i; } astrometry.net-0.67/catalogs/nomad-fits.c000644 000765 000024 00000021005 12651445460 020566 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "nomad-fits.h" #include "fitsioutils.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(nomad_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(nomad_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type J = TFITS_BIN_TYPE_J; tfits_type bitfield = fitscolumn_bitfield_type(); char* nil = " "; ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(f, f, "SIGMA_RACOSDEC", "deg", sigma_racosdec); ADDCOL(f, f, "SIGMA_DEC", "deg", sigma_dec); ADDCOL(f, f, "PM_RACOSDEC", "arcsec/yr", pm_racosdec); ADDCOL(f, f, "PM_DEC", "arcsyc/yr", pm_dec); ADDCOL(f, f, "SIGMA_PM_RACOSDEC", "arcsec/yr", sigma_pm_racosdec); ADDCOL(f, f, "SIGMA_PM_DEC", "arcsyc/yr", sigma_pm_dec); ADDCOL(f, f, "EPOCH_RA", "yr", epoch_ra); ADDCOL(f, f, "EPOCH_DEC", "yr", epoch_dec); ADDCOL(f, f, "MAG_B", "mag", mag_B); ADDCOL(f, f, "MAG_V", "mag", mag_V); ADDCOL(f, f, "MAG_R", "mag", mag_R); ADDCOL(f, f, "MAG_J", "mag", mag_J); ADDCOL(f, f, "MAG_H", "mag", mag_H); ADDCOL(f, f, "MAG_K", "mag", mag_K); ADDCOL(i32,J, "USNOB_ID", nil, usnob_id); ADDCOL(i32,J, "TWOMASS_ID", nil, twomass_id); ADDCOL(i32,J, "YB6_ID", nil, yb6_id); ADDCOL(i32,J, "UCAC2_ID", nil, ucac2_id); ADDCOL(i32,J, "TYCHO2_ID", nil, tycho2_id); ADDCOL(u8, u8, "ASTROMETRY_SRC", nil, astrometry_src); ADDCOL(u8, u8, "BLUE_SRC", nil, blue_src); ADDCOL(u8, u8, "VISUAL_SRC", nil, visual_src); ADDCOL(u8, u8, "RED_SRC", nil, red_src); ADDCOL(i32, J, "NOMAD_ID", nil, nomad_id); ADDARR(bitfield, bitfield, "FLAGS", nil, flags, 2); } #undef ADDCOL #undef ADDARR static int postprocess_read_structs(fitstable_t* table, void* struc, int stride, int offset, int N) { int i; nomad_entry* entries = struc; for (i=0; i> 7) & 0x1; entries[i].twomass_fail = (flag >> 6) & 0x1; entries[i].tycho_astrometry = (flag >> 5) & 0x1; entries[i].alt_radec = (flag >> 4) & 0x1; entries[i].alt_ucac = (flag >> 3) & 0x1; entries[i].alt_tycho = (flag >> 2) & 0x1; entries[i].blue_o = (flag >> 1) & 0x1; entries[i].red_e = (flag >> 0) & 0x1; flag = entries[i].flags[1]; entries[i].twomass_only = (flag >> 7) & 0x1; entries[i].hipp_astrometry = (flag >> 6) & 0x1; entries[i].diffraction = (flag >> 5) & 0x1; entries[i].confusion = (flag >> 4) & 0x1; entries[i].bright_confusion = (flag >> 3) & 0x1; entries[i].bright_artifact = (flag >> 2) & 0x1; entries[i].standard = (flag >> 1) & 0x1; } return 0; } nomad_entry* nomad_fits_read_entry(nomad_fits* cat) { return (nomad_entry*)fitstable_next_struct(cat); } int nomad_fits_read_entries(nomad_fits* cat, int offset, int count, nomad_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(nomad_entry), offset, count); } int nomad_fits_write_entry(nomad_fits* cat, nomad_entry* entry) { entry->flags[0] = (entry->usnob_fail ? (1 << 7) : 0) | (entry->twomass_fail ? (1 << 6) : 0) | (entry->tycho_astrometry ? (1 << 5) : 0) | (entry->alt_radec ? (1 << 4) : 0) | (entry->alt_ucac ? (1 << 3) : 0) | (entry->alt_tycho ? (1 << 2) : 0) | (entry->blue_o ? (1 << 1) : 0) | (entry->red_e ? (1 << 0) : 0); entry->flags[1] = (entry->twomass_only ? (1 << 7) : 0) | (entry->hipp_astrometry ? (1 << 6) : 0) | (entry->diffraction ? (1 << 5) : 0) | (entry->confusion ? (1 << 4) : 0) | (entry->bright_confusion ? (1 << 3) : 0) | (entry->bright_artifact ? (1 << 2) : 0) | (entry->standard ? (1 << 1) : 0); return fitstable_write_struct(cat, entry); } int nomad_fits_count_entries(nomad_fits* cat) { return fitstable_nrows(cat); } int nomad_fits_close(nomad_fits* nomad) { return fitstable_close(nomad); } nomad_fits* nomad_fits_open(char* fn) { nomad_fits* cat = NULL; cat = fitstable_open(fn); if (!cat) return NULL; add_columns(cat, FALSE); fitstable_use_buffered_reading(cat, sizeof(nomad_entry), 1000); cat->postprocess_read_structs = postprocess_read_structs; if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "nomad-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); nomad_fits_close(cat); return NULL; } return cat; } nomad_fits* nomad_fits_open_for_writing(char* fn) { nomad_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "NOMAD", "T", "This is a NOMAD 1.0 catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_NOMAD, "Astrometry.net file type", NULL); qfits_header_add(hdr, "COMMENT", "The FLAGS variable is composed of 15 boolean values packed into 2 bytes.", NULL, NULL); qfits_header_add(hdr, "COMMENT", " Byte 0:", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x80: UBBIT / usnob_fail", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x40: TMBIT / twomass_fail", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x20: TYBIT / tycho_astrometry", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x10: XRBIT / alt_radec", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x08: IUCBIT / alt_ucac", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x04: ITYBIT / alt_tycho", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x02: OMAGBIT / blue_o", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x01: EMAGBIT / red_e", NULL, NULL); qfits_header_add(hdr, "COMMENT", " Byte 1:", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x80: TMONLY / twomass_only", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x40: HIPAST / hipp_astrometry", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x20: SPIKE / diffraction", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x10: TYCONF / confusion", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x08: BSCONF / bright_confusion", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x04: BSART / bright_artifact", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x02: USEME / standard", NULL, NULL); qfits_header_add(hdr, "COMMENT", " 0x01: unused", NULL, NULL); qfits_header_add(hdr, "COMMENT", " Note that the ITMBIT and EXCAT bits were not set for any entry in the ", NULL, NULL); qfits_header_add(hdr, "COMMENT", " released NOMAD catalog, so were not included here.", NULL, NULL); return cat; } int nomad_fits_write_headers(nomad_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int nomad_fits_fix_headers(nomad_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } astrometry.net-0.67/catalogs/nomad.c000644 000765 000024 00000005457 12651445460 017640 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include "nomad.h" #include "an-endian.h" #include "starutil.h" int nomad_parse_entry(nomad_entry* entry, const void* encoded) { const uint32_t* udata = encoded; uint32_t uval; int32_t ival; ival = uval = u32_letoh(udata[0]); entry->ra = arcsec2deg(uval * 0.001); ival = uval = u32_letoh(udata[1]); entry->dec = arcsec2deg(uval * 0.001) - 90.0; ival = uval = u32_letoh(udata[2]); entry->sigma_racosdec = arcsec2deg(uval * 0.001); ival = uval = u32_letoh(udata[3]); entry->sigma_dec = arcsec2deg(uval * 0.001); ival = uval = u32_letoh(udata[4]); entry->pm_racosdec = ival * 0.0001; ival = uval = u32_letoh(udata[5]); entry->pm_dec = ival * 0.0001; ival = uval = u32_letoh(udata[6]); entry->sigma_pm_racosdec = uval * 0.0001; ival = uval = u32_letoh(udata[7]); entry->sigma_pm_dec = uval * 0.0001; ival = uval = u32_letoh(udata[8]); entry->epoch_ra = uval * 0.001; ival = uval = u32_letoh(udata[9]); entry->epoch_dec = uval * 0.001; ival = uval = u32_letoh(udata[10]); entry->mag_B = ival * 0.001; ival = uval = u32_letoh(udata[11]); entry->mag_V = ival * 0.001; ival = uval = u32_letoh(udata[12]); entry->mag_R = ival * 0.001; ival = uval = u32_letoh(udata[13]); entry->mag_J = ival * 0.001; ival = uval = u32_letoh(udata[14]); entry->mag_H = ival * 0.001; ival = uval = u32_letoh(udata[15]); entry->mag_K = ival * 0.001; ival = uval = u32_letoh(udata[16]); entry->usnob_id = uval; ival = uval = u32_letoh(udata[17]); entry->twomass_id = uval; ival = uval = u32_letoh(udata[18]); entry->yb6_id = uval; ival = uval = u32_letoh(udata[19]); entry->ucac2_id = uval; ival = uval = u32_letoh(udata[20]); entry->tycho2_id = uval; ival = uval = u32_letoh(udata[21]); entry->astrometry_src = (uval >> 0) & 0x7; entry->blue_src = (uval >> 3) & 0x7; entry->visual_src = (uval >> 6) & 0x7; entry->red_src = (uval >> 9) & 0x7; entry->usnob_fail = (uval >> 12) & 0x1; entry->twomass_fail = (uval >> 13) & 0x1; entry->tycho_astrometry = (uval >> 16) & 0x1; entry->alt_radec = (uval >> 17) & 0x1; //entry->alt_2mass = (uval >> 18) & 0x1; entry->alt_ucac = (uval >> 19) & 0x1; entry->alt_tycho = (uval >> 20) & 0x1; entry->blue_o = (uval >> 21) & 0x1; entry->red_e = (uval >> 22) & 0x1; entry->twomass_only = (uval >> 23) & 0x1; entry->hipp_astrometry = (uval >> 24) & 0x1; entry->diffraction = (uval >> 25) & 0x1; entry->confusion = (uval >> 26) & 0x1; entry->bright_confusion = (uval >> 27) & 0x1; entry->bright_artifact = (uval >> 28) & 0x1; entry->standard = (uval >> 29) & 0x1; //entry->external = (uval >> 30) & 0x1; return 0; } astrometry.net-0.67/catalogs/nomadtofits.c000644 000765 000024 00000012563 12651445460 021065 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include "nomad.h" #include "nomad-fits.h" #include "qfits_header.h" #include "healpix.h" #include "starutil.h" #include "fitsioutils.h" #include "boilerplate.h" #define OPTIONS "ho:N:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s -o [eg, nomad_%%03i.fits]\n" " [-N ] (default = 9)\n" " [ ...]\n" "\n" "The output-filename-template should contain a \"printf\" sequence like \"%%03i\";\n" "we use \"sprintf(filename, output-filename-template, healpix)\" to determine the filename\n" "to be used for each healpix.\n\n" "\nNOTE: WE ASSUME THE NOMAD FILES ARE GIVEN ON THE COMMAND LINE IN ORDER: 000/b0000.cat, 000/b0001.cat, etc.\n\n\n", progname); } int main(int argc, char** args) { char* outfn = NULL; int c; int startoptind; int nrecords, nfiles; int Nside = 9; nomad_fits** nomads; int i, HP; int slicecounts[1800]; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } HP = 12 * Nside * Nside; printf("Nside = %i, using %i healpixes.\n", Nside, HP); nomads = calloc(HP, sizeof(nomad_fits*)); memset(slicecounts, 0, 1800 * sizeof(uint)); nrecords = 0; nfiles = 0; printf("Reading NOMAD files... "); fflush(stdout); startoptind = optind; for (; optind startoptind) && ((optind - startoptind) % 100 == 0)) { printf("\nReading file %i of %i: %s\n", optind - startoptind, argc - startoptind, infn); } if (fseeko(fid, 0, SEEK_END)) { fprintf(stderr, "Couldn't seek to end of input file %s: %s\n", infn, strerror(errno)); exit(-1); } map_size = ftello(fid); fseeko(fid, 0, SEEK_SET); map = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fileno(fid), 0); if (map == MAP_FAILED) { fprintf(stderr, "Couldn't mmap input file %s: %s\n", infn, strerror(errno)); exit(-1); } fclose(fid); if (map_size % NOMAD_RECORD_SIZE) { fprintf(stderr, "Warning, input file %s has size %u which is not divisible into %i-byte records.\n", infn, (unsigned int)map_size, NOMAD_RECORD_SIZE); } printf("File %i of %i: %s: %i records.\n", optind - startoptind, argc - startoptind, infn, (int)(map_size / NOMAD_RECORD_SIZE)); lastgrass = 0; for (i=0; iheader, "HEALPIX", hp, "The healpix number of this catalog."); fits_header_add_int(nomads[hp]->header, "NSIDE", Nside, "The healpix resolution."); BOILERPLATE_ADD_FITS_HEADERS(nomads[hp]->header); qfits_header_add(nomads[hp]->header, "HISTORY", "Created by the program \"nomadtofits\"", NULL, NULL); qfits_header_add(nomads[hp]->header, "HISTORY", "nomadtofits command line:", NULL, NULL); fits_add_args(nomads[hp]->header, args, argc); qfits_header_add(nomads[hp]->header, "HISTORY", "(end of command line)", NULL, NULL); if (nomad_fits_write_headers(nomads[hp])) { fprintf(stderr, "Failed to write header for FITS file %s.\n", fn); exit(-1); } } if (nomad_fits_write_entry(nomads[hp], &entry)) { fprintf(stderr, "Failed to write FITS entry.\n"); exit(-1); } nrecords++; } munmap(map, map_size); nfiles++; printf("\n"); } printf("\n"); // close all the files... for (i=0; i 1) { name = name " "; } name = name parts[i]; } # NGC or IC? ic = substr($0, 37, 1); isic = (ic == "I"); isngc = !isic; # ID number idpad = substr($0, 38, 4); split(idpad, parts, " "); id = parts[1]; #print "** " name " **" (isic ? "IC" : "NGC") " " id; if (id > 0) { print "{" " .is_ngc = " (isngc ? "TRUE" : "FALSE") ","; print " .id = " id ","; print " .name = \"" name "\""; print "},"; } } astrometry.net-0.67/catalogs/parse-ngcic-accurate-py.awk000644 000765 000024 00000002576 12651445460 023507 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # Parse NGC/IC accurate positions from http://www.ngcic.org/corwin/default.htm { # NGC or IC? ic = substr($0, 1, 1); isic = (ic == "I"); isngc = !isic; # ID num id = substr($0, 2, 4); while (substr(id, 1, 1) == "0") { id = substr(id, 2); } # extra stuff extra = substr($0, 6, 15); # if (extra == " ") { match(extra, "^=[?]?[NI][0-9]{4} *$"); l1 = RLENGTH; match(extra, "^[:?]? *$"); l2 = RLENGTH; #print "\"",extra,"\"", l1, l2; if ((l1>0) || (l2>0)) { # RA hr 21:2, min 24:2, sec 27:<=6 rahrs = substr($0, 21, 2); ramins = substr($0, 24, 2); i = match(substr($0, 27), "[0-9.]*"); rasecs = substr($0, 27, RLENGTH); #print rahrs, ramins, rasecs; ra = 15.0 * (rahrs + ramins/60.0 + rasecs/3600.0); # Dec +- 35:1, deg 36:2, min 39:2, sec 42:? decsign = substr($0, 35, 1); decdeg = substr($0, 36, 2); decmin = substr($0, 39, 2); i = match(substr($0, 42), "[0-9.]*"); decsec = substr($0, 42, RLENGTH); #print decsign, decdeg, decmin, decsec; dec = (decsign == "-" ? -1.0 : 1.0) * (decdeg + decmin/60.0 + decsec/3600.0); #print ra, dec; print "{ 'is_ngc': " (isngc ? "True" : "False") ","; print " 'id': " id ","; print " 'ra': " ra ","; print " 'dec': " dec ","; print "},"; } } astrometry.net-0.67/catalogs/parse-ngcic-accurate.awk000644 000765 000024 00000002576 12651445460 023061 0ustar00dstnstaff000000 000000 # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE # Parse NGC/IC accurate positions from http://www.ngcic.org/corwin/default.htm { # NGC or IC? ic = substr($0, 1, 1); isic = (ic == "I"); isngc = !isic; # ID num id = substr($0, 2, 4); while (substr(id, 1, 1) == "0") { id = substr(id, 2); } # extra stuff extra = substr($0, 6, 15); # if (extra == " ") { match(extra, "^=[?]?[NI][0-9]{4} *$"); l1 = RLENGTH; match(extra, "^[:?]? *$"); l2 = RLENGTH; #print "\"",extra,"\"", l1, l2; if ((l1>0) || (l2>0)) { # RA hr 21:2, min 24:2, sec 27:<=6 rahrs = substr($0, 21, 2); ramins = substr($0, 24, 2); i = match(substr($0, 27), "[0-9.]*"); rasecs = substr($0, 27, RLENGTH); #print rahrs, ramins, rasecs; ra = 15.0 * (rahrs + ramins/60.0 + rasecs/3600.0); # Dec +- 35:1, deg 36:2, min 39:2, sec 42:? decsign = substr($0, 35, 1); decdeg = substr($0, 36, 2); decmin = substr($0, 39, 2); i = match(substr($0, 42), "[0-9.]*"); decsec = substr($0, 42, RLENGTH); #print decsign, decdeg, decmin, decsec; dec = (decsign == "-" ? -1.0 : 1.0) * (decdeg + decmin/60.0 + decsec/3600.0); #print ra, dec; print "{ .is_ngc = " (isngc ? "TRUE" : "FALSE") ","; print " .id = " id ","; print " .ra = " ra ","; print " .dec = " dec ","; print "},"; } } astrometry.net-0.67/catalogs/read_nomad.c000644 000765 000024 00000006020 12651445460 020616 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Reads raw NOMAD data files and prints them out in text format to allow verification of our FITS versions. */ #include #include #include #include #include #include #include #include #include #include "nomad.h" int main(int argc, char** args) { int j; printf("ra dec sigma_racosdec sigma_dec mu_racosdec mu_dec " "sigma_mu_racosdec sigma_mu_dec epoch_ra epoch_dec " "mag_B mag_V mag_R mag_J mag_H mag_K usnob_id twomass_id " "yb6_id ucac2_id tycho2_id astrometry_src blue_src visual_src " "red_src usnob_fail twomass_fail tycho_astrometry " "alt_radec alt_2mass alt_ucac alt_tycho blue_o red_e " "twomass_only hipp_astrometry diffraction confusion " "bright_confusion bright_artifact standard external\n"); for (j=1; j #include #include #include "os-features.h" #include "cutest.h" #include "2mass.h" #include "2mass-fits.h" #include "an-bool.h" #include "starutil.h" void check_entry1(CuTest* tc, twomass_entry* entry) { CuAssertDblEquals(tc, 1.119851, entry->ra, 1e-6); CuAssertDblEquals(tc, -89.91861, entry->dec, 1e-6); CuAssertDblEquals(tc, 0.11, deg2arcsec(entry->err_major), 1e-2); CuAssertDblEquals(tc, 0.06, deg2arcsec(entry->err_minor), 1e-2); CuAssertDblEquals(tc, 90.0, entry->err_angle, 1e-1); CuAssertIntEquals(tc, 0, strcmp("00042876-8955069 ", entry->designation)); CuAssertDblEquals(tc, 12.467, entry->j_m, 1e-3); CuAssertDblEquals(tc, 0.018, entry->j_cmsig, 1e-3); CuAssertDblEquals(tc, 0.021, entry->j_msigcom, 1e-3); CuAssertDblEquals(tc, 359.4, entry->j_snr, 1e-1); CuAssertDblEquals(tc, 12.131, entry->h_m, 1e-3); CuAssertDblEquals(tc, 0.025, entry->h_cmsig, 1e-3); CuAssertDblEquals(tc, 0.026, entry->h_msigcom, 1e-3); CuAssertDblEquals(tc, 224.7, entry->h_snr, 1e-1); CuAssertDblEquals(tc, 11.963, entry->k_m, 1e-3); CuAssertDblEquals(tc, 0.023, entry->k_cmsig, 1e-3); CuAssertDblEquals(tc, 0.025, entry->k_msigcom, 1e-3); CuAssertDblEquals(tc, 133.7, entry->k_snr, 1e-1); CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->j_quality); CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->h_quality); CuAssertIntEquals(tc, TWOMASS_QUALITY_A, entry->k_quality); CuAssert(tc, "jqual", twomass_quality_flag(entry->j_quality, TWOMASS_QUALITY_A)); CuAssert(tc, "hqual", twomass_quality_flag(entry->h_quality, TWOMASS_QUALITY_A)); CuAssert(tc, "kqual", twomass_quality_flag(entry->k_quality, TWOMASS_QUALITY_A)); CuAssertIntEquals(tc, 2, entry->j_read_flag); CuAssertIntEquals(tc, 2, entry->h_read_flag); CuAssertIntEquals(tc, 2, entry->k_read_flag); CuAssertIntEquals(tc, 1, entry->j_blend_flag); CuAssertIntEquals(tc, 1, entry->h_blend_flag); CuAssertIntEquals(tc, 1, entry->k_blend_flag); CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->j_cc); CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->h_cc); CuAssertIntEquals(tc, TWOMASS_CC_NONE, entry->k_cc); CuAssertIntEquals(tc, 6, entry->j_ndet_M); CuAssertIntEquals(tc, 6, entry->j_ndet_N); CuAssertIntEquals(tc, 6, entry->h_ndet_M); CuAssertIntEquals(tc, 6, entry->h_ndet_N); CuAssertIntEquals(tc, 6, entry->k_ndet_M); CuAssertIntEquals(tc, 6, entry->k_ndet_N); CuAssertDblEquals(tc, 37.2, deg2arcsec(entry->proximity), 1e-1); CuAssertDblEquals(tc, 245, entry->prox_angle, 1e-1); CuAssertIntEquals(tc, 1329023254, entry->prox_key); CuAssertIntEquals(tc, 0, entry->galaxy_contam); CuAssertIntEquals(tc, FALSE, entry->minor_planet); CuAssertIntEquals(tc, 1101364107, entry->key); CuAssertIntEquals(tc, FALSE, entry->northern_hemisphere); CuAssertIntEquals(tc, 2000, entry->date_year); CuAssertIntEquals(tc, 9, entry->date_month); CuAssertIntEquals(tc, 22, entry->date_day); CuAssertIntEquals(tc, 64, entry->scan); CuAssertDblEquals(tc, 302.951, entry->glon, 1e-3); CuAssertDblEquals(tc, -27.208, entry->glat, 1e-3); CuAssertDblEquals(tc, 1.6, deg2arcsec(entry->x_scan), 1e-1); CuAssertDblEquals(tc, 2451809.7124, entry->jdate, 1e-4); CuAssertDblEquals(tc, 1.07, entry->j_psfchi, 1e-2); CuAssertDblEquals(tc, 1.18, entry->h_psfchi, 1e-2); CuAssertDblEquals(tc, 0.81, entry->k_psfchi, 1e-2); CuAssertDblEquals(tc, 12.481, entry->j_m_stdap, 1e-3); CuAssertDblEquals(tc, 0.014, entry->j_msig_stdap, 1e-3); CuAssertDblEquals(tc, 12.112, entry->h_m_stdap, 1e-3); CuAssertDblEquals(tc, 0.028, entry->h_msig_stdap, 1e-3); CuAssertDblEquals(tc, 11.980, entry->k_m_stdap, 1e-3); CuAssertDblEquals(tc, 0.012, entry->k_msig_stdap, 1e-3); CuAssertDblEquals(tc, 332, deg2arcsec(entry->dist_edge_ns), 1e-1); CuAssertDblEquals(tc, 251, deg2arcsec(entry->dist_edge_ew), 1e-1); CuAssertIntEquals(tc, FALSE, entry->dist_flag_ns); CuAssertIntEquals(tc, FALSE, entry->dist_flag_ew); CuAssertIntEquals(tc, 1, entry->dup_src); CuAssertIntEquals(tc, TRUE, entry->use_src); CuAssertIntEquals(tc, TWOMASS_ASSOCIATION_NONE, entry->association); CuAssert(tc, "dist null", !isfinite(entry->dist_opt)); CuAssert(tc, "dist null2", twomass_is_null_float(entry->dist_opt)); CuAssert(tc, "phiopt null", twomass_is_null_float(entry->phi_opt)); CuAssert(tc, "bmopt null", twomass_is_null_float(entry->b_m_opt)); CuAssert(tc, "vrmopt null", twomass_is_null_float(entry->vr_m_opt)); CuAssertIntEquals(tc, 0, entry->nopt_mchs); CuAssertIntEquals(tc, TWOMASS_KEY_NULL, entry->xsc_key); CuAssertIntEquals(tc, 59038, entry->scan_key); CuAssertIntEquals(tc, 1357874, entry->coadd_key); CuAssertIntEquals(tc, 267, entry->coadd); } void test_read_2mass(CuTest* tc) { // Read some sample lines from the raw 2MASS catalog. // psc_aaa.gz line 1. char* line1 = "1.119851|-89.91861|0.11|0.06|90|00042876-8955069 |" "12.467|0.018|0.021|359.4|" // jmag "12.131|0.025|0.026|224.7|" // hmag "11.963|0.023|0.025|133.7|" // kmag "AAA|222|111|000|" // quality through cc "666666|" // ndet "37.2|245|1329023254|" // prox "0|0|1101364107|s|2000-09-22|64|" // galaxy_contam through scan "302.951|-27.208|1.6|2451809.7124|" // glat through jdate "1.07|1.18|0.81|" // psfchi "12.481|0.014|12.112|0.028|11.98|0.012|" // stdap "332|251|sw|1|1|0|" // dist through association "\\N|\\N|\\N|\\N|0|\\N|" // match "59038|1357874|267"; twomass_entry entry; twomass_fits* out; twomass_fits* in; twomass_entry* ein; char* fn = "/tmp/test-2mass-0"; memset(&entry, 0, sizeof(twomass_entry)); CuAssertIntEquals(tc, 0, twomass_parse_entry(&entry, line1)); check_entry1(tc, &entry); out = twomass_fits_open_for_writing(fn); CuAssertPtrNotNull(tc, out); CuAssertIntEquals(tc, 0, twomass_fits_count_entries(out)); CuAssertIntEquals(tc, 0, twomass_fits_write_headers(out)); CuAssertIntEquals(tc, 0, twomass_fits_write_entry(out, &entry)); CuAssertIntEquals(tc, 1, twomass_fits_count_entries(out)); CuAssertIntEquals(tc, 0, twomass_fits_fix_headers(out)); CuAssertIntEquals(tc, 0, twomass_fits_close(out)); out = NULL; memset(&entry, 0, sizeof(twomass_entry)); in = twomass_fits_open(fn); CuAssertPtrNotNull(tc, in); CuAssertIntEquals(tc, 1, twomass_fits_count_entries(in)); ein = twomass_fits_read_entry(in); CuAssertPtrNotNull(tc, ein); check_entry1(tc, ein); CuAssertIntEquals(tc, 0, twomass_fits_close(in)); in = NULL; } void test_fits_empty(CuTest* tc) { char* fn = "/tmp/test-2mass-1"; twomass_fits* out; out = twomass_fits_open_for_writing(fn); CuAssertPtrNotNull(tc, out); CuAssertIntEquals(tc, 0, twomass_fits_write_headers(out)); CuAssertIntEquals(tc, 0, twomass_fits_fix_headers(out)); CuAssertIntEquals(tc, 0, twomass_fits_close(out)); } astrometry.net-0.67/catalogs/test_boundaries.c000644 000765 000024 00000001243 12651445460 021721 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "cutest.h" #include "hd.h" #include "starutil.h" #include "ioutils.h" #include "constellation-boundaries.h" void test_bdy_1(CuTest* tc) { // "Suhail" (Lambda Vela) int con = constellation_containing(136.9992, -43.4325); printf("Got: %i\n", con); CuAssertIntEquals(tc, CON_VEL, con); // Naos (xi Pup?) con = constellation_containing(120.8963, -40.0033); printf("Got: %i\n", con); CuAssertIntEquals(tc, CON_PUP, con); } astrometry.net-0.67/catalogs/test_hd.c000644 000765 000024 00000004173 12651445460 020166 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "cutest.h" #include "hd.h" #include "starutil.h" #include "ioutils.h" void test_hd_1(CuTest* tc) { hd_catalog_t* hdcat; int* invperm; int* present; int ind, i, N; double xyz[3]; double ra, dec; int strangehds[] = { 40142, 40441, 40672, 40746, 40763, 40764, 104176, 104193, 163635, 224698, 224699, 129371 }; if (!file_readable("hd.fits")) { printf("File \"hd.fits\" does not exist; test skipped.\n"); return; } hdcat = henry_draper_open("hd.fits"); CuAssertPtrNotNull(tc, hdcat); N = hdcat->kd->ndata; invperm = calloc(N, sizeof(int)); CuAssertPtrNotNull(tc, invperm); CuAssertIntEquals(tc, 0, kdtree_check(hdcat->kd)); kdtree_inverse_permutation(hdcat->kd, invperm); present = calloc(N, sizeof(int)); for (i=0; ikd, ind, 1, xyz); xyzarr2radecdeg(xyz, &ra, &dec); printf("HD %i: RA,Dec %g, %g\n", i+1, ra, dec); res = henry_draper_get(hdcat, ra, dec, 10.0); CuAssertPtrNotNull(tc, res); for (j=0; jhd, hd->ra, hd->dec); } bl_free(res); } for (i=0; ikd, ind, 1, xyz); xyzarr2radecdeg(xyz, &ra, &dec); printf("HD %i: RA,Dec %g, %g\n", strangehds[i], ra, dec); } free(invperm); henry_draper_close(hdcat); } astrometry.net-0.67/catalogs/test_nomad.c000644 000765 000024 00000011607 12651445460 020671 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "cutest.h" #include "nomad.h" #include "nomad-fits.h" #include "an-bool.h" #include "an-endian.h" #include "starutil.h" static void check_line1(CuTest* tc, const nomad_entry* e) { CuAssertIntEquals(tc, 4125041, rint(deg2arcsec(e->ra) / 0.001)); CuAssertIntEquals(tc, 292987, rint((deg2arcsec(e->dec + 90.0)) / 0.001)); CuAssertIntEquals(tc, 15, rint((deg2arcsec(e->sigma_racosdec)) / 0.001)); CuAssertIntEquals(tc, 28, rint((deg2arcsec(e->sigma_dec)) / 0.001)); CuAssertIntEquals(tc, 190, rint(e->pm_racosdec / 0.0001)); CuAssertIntEquals(tc, -187, (int32_t)rint(e->pm_dec / 0.0001)); CuAssertIntEquals(tc, 4294967109U, (uint32_t)((int32_t)rint(e->pm_dec / 0.0001))); CuAssertIntEquals(tc, 61, rint(e->sigma_pm_racosdec / 0.0001)); CuAssertIntEquals(tc, 62, rint(e->sigma_pm_dec / 0.0001)); CuAssertIntEquals(tc, 1998246, rint(e->epoch_ra / 0.001)); CuAssertIntEquals(tc, 1997659, rint(e->epoch_dec / 0.001)); CuAssertIntEquals(tc, 14710, rint(e->mag_B / 0.001)); CuAssertIntEquals(tc, 13690, rint(e->mag_V / 0.001)); CuAssertIntEquals(tc, 13680, rint(e->mag_R / 0.001)); CuAssertIntEquals(tc, 12467, rint(e->mag_J / 0.001)); CuAssertIntEquals(tc, 12131, rint(e->mag_H / 0.001)); CuAssertIntEquals(tc, 11963, rint(e->mag_K / 0.001)); CuAssertIntEquals(tc, 1, e->usnob_id); CuAssertIntEquals(tc, 1101364107, e->twomass_id); CuAssertIntEquals(tc, 1, e->yb6_id); CuAssertIntEquals(tc, 2, e->ucac2_id); CuAssertIntEquals(tc, 0, e->tycho2_id); CuAssertIntEquals(tc, 536875740, ((e->astrometry_src << 0) | (e->blue_src << 3) | (e->visual_src << 6) | (e->red_src << 9) | (e->usnob_fail ? 0x1000 : 0) | (e->twomass_fail ? 0x2000 : 0) | (e->tycho_astrometry ? 0x10000 : 0) | (e->alt_radec ? 0x20000 : 0) | (e->alt_ucac ? 0x80000 : 0) | (e->alt_tycho ? 0x100000 : 0) | (e->blue_o ? 0x200000 : 0) | (e->red_e ? 0x400000 : 0) | (e->twomass_only ? 0x800000 : 0) | (e->hipp_astrometry ? 0x1000000 : 0) | (e->diffraction ? 0x2000000 : 0) | (e->confusion ? 0x4000000 : 0) | (e->bright_confusion ? 0x8000000 : 0) | (e->bright_artifact ? 0x10000000 : 0) | (e->standard ? 0x20000000 : 0))); } void test_read_nomad(CuTest* tc) { // od -N 88 --width=10 -t x1 ~/raid1/NOMAD/000/m0000.cat | gawk '{for(i=2;i<=NF;i++){printf("0x%s, ",$i);}printf("\n");}' uint8_t line1[] = { 0x71, 0xf1, 0x3e, 0x00, 0x7b, 0x78, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x45, 0xff, 0xff, 0xff, 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0xa6, 0x7d, 0x1e, 0x00, 0x5b, 0x7b, 0x1e, 0x00, 0x76, 0x39, 0x00, 0x00, 0x7a, 0x35, 0x00, 0x00, 0x70, 0x35, 0x00, 0x00, 0xb3, 0x30, 0x00, 0x00, 0x63, 0x2f, 0x00, 0x00, 0xbb, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x8b, 0x7b, 0xa5, 0x41, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x12, 0x00, 0x20, }; char* fn = "/tmp/test-nomad-0"; int i; for (i=0; i #include #include #include "cutest.h" #include "tycho2.h" #include "tycho2-fits.h" #include "starutil.h" static double deg2mas(double x) { return 1000.0 * deg2arcsec(x); } static void check_line1(CuTest* tc, const tycho2_entry* e) { CuAssertIntEquals(tc, 1, e->tyc1); CuAssertIntEquals(tc, 8, e->tyc2); CuAssertIntEquals(tc, 1, e->tyc3); CuAssertIntEquals(tc, 0, e->photo_center); CuAssertIntEquals(tc, 0, e->no_motion); CuAssertDblEquals(tc, 2.31750494, e->mean_ra, 1e-8); CuAssertDblEquals(tc, 2.23184345, e->mean_dec, 1e-8); CuAssertDblEquals(tc, -16.3, e->pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, -9.0, e->pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 68.0, deg2mas(e->sigma_mean_ra), 1e-1); CuAssertDblEquals(tc, 73.0, deg2mas(e->sigma_mean_dec), 1e-1); CuAssertDblEquals(tc, 1.7, e->sigma_pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, 1.8, e->sigma_pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 1958.89, e->epoch_mean_ra, 1e-2); CuAssertDblEquals(tc, 1951.94, e->epoch_mean_dec, 1e-2); CuAssertIntEquals(tc, 4, e->nobs); CuAssertDblEquals(tc, 1.0, e->goodness_mean_ra, 1e-1); CuAssertDblEquals(tc, 1.0, e->goodness_mean_dec, 1e-1); CuAssertDblEquals(tc, 0.9, e->goodness_pm_ra, 1e-1); CuAssertDblEquals(tc, 1.0, e->goodness_pm_dec, 1e-1); CuAssertDblEquals(tc, 12.146, e->mag_BT, 1e-3); CuAssertDblEquals(tc, 0.158, e->sigma_BT, 1e-3); CuAssertDblEquals(tc, 12.146, e->mag_VT, 1e-3); CuAssertDblEquals(tc, 0.223, e->sigma_VT, 1e-3); CuAssertDblEquals(tc, 0.0, e->mag_HP, 1e-3); CuAssertDblEquals(tc, 0.0, e->sigma_HP, 1e-3); CuAssertDblEquals(tc, -1.0, e->prox, 1e-1); CuAssertIntEquals(tc, FALSE, e->tycho1_star); CuAssertIntEquals(tc, 0, e->hipparcos_id); CuAssertIntEquals(tc, 0, strlen(e->hip_ccdm)); CuAssertDblEquals(tc, 2.31754222, e->ra, 1e-8); CuAssertDblEquals(tc, 2.23186444, e->dec, 1e-8); CuAssertDblEquals(tc, 1.67, e->epoch_ra - 1990.0, 1e-2); CuAssertDblEquals(tc, 1.54, e->epoch_dec- 1990.0, 1e-2); CuAssertDblEquals(tc, 88.0, deg2mas(e->sigma_ra), 1e-1); CuAssertDblEquals(tc, 100.8, deg2mas(e->sigma_dec), 1e-1); CuAssertIntEquals(tc, FALSE, e->double_star); CuAssertIntEquals(tc, FALSE, e->photo_center_treatment); CuAssertDblEquals(tc, -0.2, e->correlation, 1e-1); } static void check_line2(CuTest* tc, const tycho2_entry* e) { CuAssertIntEquals(tc, 1, e->tyc1); CuAssertIntEquals(tc, 13, e->tyc2); CuAssertIntEquals(tc, 1, e->tyc3); CuAssertIntEquals(tc, 0, e->photo_center); CuAssertIntEquals(tc, 0, e->no_motion); CuAssertDblEquals(tc, 1.12558209, e->mean_ra, 1e-8); CuAssertDblEquals(tc, 2.26739400, e->mean_dec, 1e-8); CuAssertDblEquals(tc, 27.7, e->pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, -0.5, e->pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 9.0, deg2mas(e->sigma_mean_ra), 1e-1); CuAssertDblEquals(tc, 12.0, deg2mas(e->sigma_mean_dec), 1e-1); CuAssertDblEquals(tc, 1.2, e->sigma_pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, 1.2, e->sigma_pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 1990.76, e->epoch_mean_ra, 1e-2); CuAssertDblEquals(tc, 1989.25, e->epoch_mean_dec, 1e-2); CuAssertIntEquals(tc, 8, e->nobs); CuAssertDblEquals(tc, 1.0, e->goodness_mean_ra, 1e-1); CuAssertDblEquals(tc, 0.8, e->goodness_mean_dec, 1e-1); CuAssertDblEquals(tc, 1.0, e->goodness_pm_ra, 1e-1); CuAssertDblEquals(tc, 0.7, e->goodness_pm_dec, 1e-1); CuAssertDblEquals(tc, 10.488, e->mag_BT, 1e-3); CuAssertDblEquals(tc, 0.038, e->sigma_BT, 1e-3); CuAssertDblEquals(tc, 8.670, e->mag_VT, 1e-3); CuAssertDblEquals(tc, 0.015, e->sigma_VT, 1e-3); CuAssertDblEquals(tc, 0.0, e->mag_HP, 1e-3); CuAssertDblEquals(tc, 0.0, e->sigma_HP, 1e-3); CuAssertDblEquals(tc, -1.0, e->prox, 1e-1); CuAssertIntEquals(tc, TRUE, e->tycho1_star); CuAssertIntEquals(tc, 0, e->hipparcos_id); CuAssertIntEquals(tc, 0, strlen(e->hip_ccdm)); CuAssertDblEquals(tc, 1.12551889, e->ra, 1e-8); CuAssertDblEquals(tc, 2.26739556, e->dec, 1e-8); CuAssertDblEquals(tc, 1.81, e->epoch_ra - 1990.0, 1e-2); CuAssertDblEquals(tc, 1.52, e->epoch_dec- 1990.0, 1e-2); CuAssertDblEquals(tc, 9.3, deg2mas(e->sigma_ra), 1e-1); CuAssertDblEquals(tc, 12.7, deg2mas(e->sigma_dec), 1e-1); CuAssertIntEquals(tc, FALSE, e->double_star); CuAssertIntEquals(tc, FALSE, e->photo_center_treatment); CuAssertDblEquals(tc, -0.2, e->correlation, 1e-1); } static void check_line3(CuTest* tc, const tycho2_entry* e) { CuAssertIntEquals(tc, 5, e->tyc1); CuAssertIntEquals(tc, 1505, e->tyc2); CuAssertIntEquals(tc, 1, e->tyc3); CuAssertIntEquals(tc, 0, e->photo_center); CuAssertIntEquals(tc, 0, e->no_motion); CuAssertDblEquals(tc, 3.25200241, e->mean_ra, 1e-8); CuAssertDblEquals(tc, 2.94960582, e->mean_dec, 1e-8); CuAssertDblEquals(tc, 47.8, e->pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, -13.6, e->pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 8.0, deg2mas(e->sigma_mean_ra), 1e-1); CuAssertDblEquals(tc, 11.0, deg2mas(e->sigma_mean_dec), 1e-1); CuAssertDblEquals(tc, 1.0, e->sigma_pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, 1.0, e->sigma_pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 1990.57, e->epoch_mean_ra, 1e-2); CuAssertDblEquals(tc, 1989.33, e->epoch_mean_dec, 1e-2); CuAssertIntEquals(tc, 11, e->nobs); CuAssertDblEquals(tc, 0.6, e->goodness_mean_ra, 1e-1); CuAssertDblEquals(tc, 1.2, e->goodness_mean_dec, 1e-1); CuAssertDblEquals(tc, 0.7, e->goodness_pm_ra, 1e-1); CuAssertDblEquals(tc, 1.2, e->goodness_pm_dec, 1e-1); CuAssertDblEquals(tc, 9.275, e->mag_BT, 1e-3); CuAssertDblEquals(tc, 0.020, e->sigma_BT, 1e-3); CuAssertDblEquals(tc, 8.738, e->mag_VT, 1e-3); CuAssertDblEquals(tc, 0.015, e->sigma_VT, 1e-3); CuAssertDblEquals(tc, 0.0, e->mag_HP, 1e-3); CuAssertDblEquals(tc, 0.0, e->sigma_HP, 1e-3); CuAssertDblEquals(tc, -1.0, e->prox, 1e-1); CuAssertIntEquals(tc, TRUE, e->tycho1_star); CuAssertIntEquals(tc, 1040, e->hipparcos_id); CuAssertIntEquals(tc, 2, strlen(e->hip_ccdm)); CuAssertIntEquals(tc, 0, strcmp(e->hip_ccdm, "AB")); CuAssertDblEquals(tc, 3.25189250, e->ra, 1e-8); CuAssertDblEquals(tc, 2.94963750, e->dec, 1e-8); CuAssertDblEquals(tc, 1.76, e->epoch_ra - 1990.0, 1e-2); CuAssertDblEquals(tc, 1.45, e->epoch_dec- 1990.0, 1e-2); CuAssertDblEquals(tc, 8.2, deg2mas(e->sigma_ra), 1e-1); CuAssertDblEquals(tc, 10.5, deg2mas(e->sigma_dec), 1e-1); CuAssertIntEquals(tc, FALSE, e->double_star); CuAssertIntEquals(tc, TRUE, e->photo_center_treatment); CuAssertDblEquals(tc, -0.2, e->correlation, 1e-1); } static void check_supp1(CuTest* tc, const tycho2_entry* e) { CuAssertIntEquals(tc, 2, e->tyc1); CuAssertIntEquals(tc, 1127, e->tyc2); CuAssertIntEquals(tc, 2, e->tyc3); CuAssertIntEquals(tc, 0, e->photo_center); CuAssertIntEquals(tc, 0, e->no_motion); CuAssertIntEquals(tc, FALSE, e->tycho1_star); CuAssertDblEquals(tc, 0.0, e->mean_ra, 1e-8); CuAssertDblEquals(tc, 0.0, e->mean_dec, 1e-8); CuAssertDblEquals(tc, 4.36837051, e->ra, 1e-8); CuAssertDblEquals(tc, 0.31948829, e->dec, 1e-8); CuAssertDblEquals(tc, -32.1, e->pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, -9.1, e->pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 13.6, deg2mas(e->sigma_ra), 1e-1); CuAssertDblEquals(tc, 8.3, deg2mas(e->sigma_dec), 1e-1); CuAssertDblEquals(tc, 8.2, e->sigma_pm_ra * 1000.0, 1e-1); CuAssertDblEquals(tc, 5.0, e->sigma_pm_dec * 1000.0, 1e-1); CuAssertDblEquals(tc, 10.279, e->mag_HP, 1e-3); CuAssertDblEquals(tc, 0.041, e->sigma_HP, 1e-3); CuAssertDblEquals(tc, 75.0, deg2arcsec(e->prox) * 10.0, 1e-1); CuAssertIntEquals(tc, 1397, e->hipparcos_id); CuAssertIntEquals(tc, 1, strlen(e->hip_ccdm)); CuAssertIntEquals(tc, 0, strcmp(e->hip_ccdm, "B")); CuAssertDblEquals(tc, 0.0, deg2mas(e->sigma_mean_ra), 1e-1); CuAssertDblEquals(tc, 0.0, deg2mas(e->sigma_mean_dec), 1e-1); CuAssertDblEquals(tc, 0.0, e->epoch_mean_ra, 1e-2); CuAssertDblEquals(tc, 0.0, e->epoch_mean_dec, 1e-2); CuAssertIntEquals(tc, 0, e->nobs); CuAssertDblEquals(tc, 0.0, e->goodness_mean_ra, 1e-1); CuAssertDblEquals(tc, 0.0, e->goodness_mean_dec, 1e-1); CuAssertDblEquals(tc, 0.0, e->goodness_pm_ra, 1e-1); CuAssertDblEquals(tc, 0.0, e->goodness_pm_dec, 1e-1); CuAssertDblEquals(tc, 0.0, e->mag_BT, 1e-3); CuAssertDblEquals(tc, 0.0, e->sigma_BT, 1e-3); CuAssertDblEquals(tc, 0.0, e->mag_VT, 1e-3); CuAssertDblEquals(tc, 0.0, e->sigma_VT, 1e-3); CuAssertDblEquals(tc, 0.0, e->epoch_ra, 1e-2); CuAssertDblEquals(tc, 0.0, e->epoch_dec, 1e-2); CuAssertIntEquals(tc, FALSE, e->double_star); CuAssertIntEquals(tc, FALSE, e->photo_center_treatment); CuAssertDblEquals(tc, 0.0, e->correlation, 1e-1); } void test_read_raw(CuTest* tc) { char* line1 = "0001 00008 1| |" " 2.31750494| 2.23184345| -16.3| -9.0|" " 68| 73| 1.7| 1.8|" "1958.89|1951.94| 4|" "1.0|1.0|0.9|1.0|" "12.146|0.158|12.146|0.223|" "999| | |" " 2.31754222| 2.23186444|1.67|1.54|" " 88.0|100.8|" " |-0.2\r\n"; char* line2 = "0001 00013 1| |" " 1.12558209| 2.26739400| 27.7| -0.5|" " 9| 12| 1.2| 1.2|" "1990.76|1989.25| 8|" "1.0|0.8|1.0|0.7|" "10.488|0.038| 8.670|0.015|" "999|T| |" " 1.12551889| 2.26739556|1.81|1.52|" " 9.3| 12.7|" " |-0.2\r\n"; // not the third line in the file... char* line3 = "0005 01505 1| |" " 3.25200241| 2.94960582| 47.8| -13.6|" " 8| 11| 1.0| 1.0|" "1990.57|1989.33|11|" "0.6|1.2|0.7|1.2|" " 9.275|0.020| 8.738|0.015|" "999|T| 1040AB |" " 3.25189250| 2.94963750|1.76|1.45|" " 8.2| 10.5|" "P|-0.2\r\n"; // line 3 from suppl_1.dat char* supp1 = "0002 01127 2|H|" "004.36837051|+00.31948829| -32.1| -9.1|" " 13.6| 8.3| 8.2| 5.0|" "H| | |" "10.279|0.041|" " 75| | 1397B\r\n"; char* fn = "/tmp/test-tycho2-0"; tycho2_entry entry1; tycho2_entry entry2; tycho2_entry entry3; tycho2_entry entry4; tycho2_fits* out; tycho2_fits* in; tycho2_entry* ein1; tycho2_entry* ein2; tycho2_entry* ein3; tycho2_entry* ein4; memset(&entry1, 0, sizeof(tycho2_entry)); memset(&entry2, 0, sizeof(tycho2_entry)); memset(&entry3, 0, sizeof(tycho2_entry)); memset(&entry4, 0, sizeof(tycho2_entry)); CuAssertIntEquals(tc, 0, tycho2_guess_is_supplement(line1)); CuAssertIntEquals(tc, 0, tycho2_parse_entry(line1, &entry1)); check_line1(tc, &entry1); CuAssertIntEquals(tc, 0, tycho2_guess_is_supplement(line2)); CuAssertIntEquals(tc, 0, tycho2_parse_entry(line2, &entry2)); check_line2(tc, &entry2); CuAssertIntEquals(tc, 0, tycho2_guess_is_supplement(line3)); CuAssertIntEquals(tc, 0, tycho2_parse_entry(line3, &entry3)); check_line3(tc, &entry3); CuAssertIntEquals(tc, 1, tycho2_guess_is_supplement(supp1)); CuAssertIntEquals(tc, 0, tycho2_supplement_parse_entry(supp1, &entry4)); check_supp1(tc, &entry4); out = tycho2_fits_open_for_writing(fn); CuAssertPtrNotNull(tc, out); CuAssertIntEquals(tc, 0, tycho2_fits_count_entries(out)); CuAssertIntEquals(tc, 0, tycho2_fits_write_headers(out)); CuAssertIntEquals(tc, 0, tycho2_fits_write_entry(out, &entry1)); CuAssertIntEquals(tc, 0, tycho2_fits_write_entry(out, &entry2)); CuAssertIntEquals(tc, 0, tycho2_fits_write_entry(out, &entry3)); CuAssertIntEquals(tc, 0, tycho2_fits_write_entry(out, &entry4)); CuAssertIntEquals(tc, 4, tycho2_fits_count_entries(out)); CuAssertIntEquals(tc, 0, tycho2_fits_fix_headers(out)); CuAssertIntEquals(tc, 0, tycho2_fits_close(out)); out = NULL; memset(&entry1, 0, sizeof(tycho2_entry)); memset(&entry2, 0, sizeof(tycho2_entry)); memset(&entry3, 0, sizeof(tycho2_entry)); memset(&entry4, 0, sizeof(tycho2_entry)); in = tycho2_fits_open(fn); CuAssertPtrNotNull(tc, in); CuAssertIntEquals(tc, 4, tycho2_fits_count_entries(in)); ein1 = tycho2_fits_read_entry(in); CuAssertPtrNotNull(tc, ein1); check_line1(tc, ein1); ein2 = tycho2_fits_read_entry(in); CuAssertPtrNotNull(tc, ein2); check_line2(tc, ein2); ein3 = tycho2_fits_read_entry(in); CuAssertPtrNotNull(tc, ein3); check_line3(tc, ein3); ein4 = tycho2_fits_read_entry(in); CuAssertPtrNotNull(tc, ein4); check_supp1(tc, ein4); CuAssertIntEquals(tc, 0, tycho2_fits_close(in)); in = NULL; } astrometry.net-0.67/catalogs/test_usnob.c000644 000765 000024 00000012574 12651445460 020725 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "cutest.h" #include "usnob.h" #include "usnob-fits.h" #include "an-bool.h" #include "an-endian.h" #include "starutil.h" static void assertZeroObs(CuTest* tc, const struct observation* o) { CuAssertIntEquals(tc, 0, o->mag); CuAssertIntEquals(tc, 0, o->field); CuAssertIntEquals(tc, 0, o->survey); CuAssertIntEquals(tc, 0, o->star_galaxy); CuAssertIntEquals(tc, 0, o->xi_resid); CuAssertIntEquals(tc, 0, o->eta_resid); CuAssertIntEquals(tc, 0, o->calibration); CuAssertIntEquals(tc, 0, o->pmmscan); } static void check_line1(CuTest* tc, const usnob_entry* e) { const struct observation* o; CuAssertIntEquals(tc, 391376, rint(deg2arcsec(e->ra) / 0.01)); CuAssertIntEquals(tc, 29304, rint(deg2arcsec(e->dec + 90) / 0.01)); CuAssertIntEquals(tc, 0, e->motion_catalog); CuAssertIntEquals(tc, 8, rint(e->pm_prob / 0.1)); CuAssertIntEquals(tc, 4997, rint((e->pm_dec + 10.0) / 0.002)); CuAssertIntEquals(tc, 4999, rint((e->pm_ra + 10.0) / 0.002)); CuAssertIntEquals(tc, 0, e->diffraction_spike); CuAssertIntEquals(tc, 3, e->ndetections); CuAssertIntEquals(tc, 0, rint(deg2arcsec(e->sigma_dec_fit) / 0.1)); CuAssertIntEquals(tc, 0, rint(deg2arcsec(e->sigma_ra_fit) / 0.1)); CuAssertIntEquals(tc, 0, rint(e->sigma_pm_dec / 0.001)); CuAssertIntEquals(tc, 4, rint(e->sigma_pm_ra / 0.001)); CuAssertIntEquals(tc, 1, e->ys4); CuAssertIntEquals(tc, 369, rint((e->epoch - 1950) / 0.1)); CuAssertIntEquals(tc, 0, rint(deg2arcsec(e->sigma_dec) / 0.001)); CuAssertIntEquals(tc, 65, rint(deg2arcsec(e->sigma_ra) / 0.001)); o = e->obs + 0; assertZeroObs(tc, o); o = e->obs + 1; CuAssertIntEquals(tc, 9, o->star_galaxy); CuAssertIntEquals(tc, 5, o->survey); CuAssertIntEquals(tc, 1, o->field); CuAssertIntEquals(tc, 1400, rint(o->mag / 0.01)); o = e->obs + 2; CuAssertIntEquals(tc, 3, o->star_galaxy); CuAssertIntEquals(tc, 4, o->survey); CuAssertIntEquals(tc, 1, o->field); CuAssertIntEquals(tc, 1443, rint(o->mag / 0.01)); o = e->obs + 3; CuAssertIntEquals(tc, 0, o->star_galaxy); CuAssertIntEquals(tc, 6, o->survey); CuAssertIntEquals(tc, 1, o->field); CuAssertIntEquals(tc, 1368, rint(o->mag / 0.01)); o = e->obs + 4; assertZeroObs(tc, o); o = e->obs + 1; CuAssertIntEquals(tc, 1, o->calibration); CuAssertIntEquals(tc, 4999, rint((deg2arcsec(o->eta_resid) + 50.0) / 0.01)); CuAssertIntEquals(tc, 5004, rint((deg2arcsec(o->xi_resid ) + 50.0) / 0.01)); o = e->obs + 2; CuAssertIntEquals(tc, 1, o->calibration); CuAssertIntEquals(tc, 5000, rint((deg2arcsec(o->eta_resid) + 50.0) / 0.01)); CuAssertIntEquals(tc, 4996, rint((deg2arcsec(o->xi_resid ) + 50.0) / 0.01)); o = e->obs + 3; CuAssertIntEquals(tc, 1, o->calibration); CuAssertIntEquals(tc, 5000, rint((deg2arcsec(o->eta_resid) + 50.0) / 0.01)); CuAssertIntEquals(tc, 4998, rint((deg2arcsec(o->xi_resid ) + 50.0) / 0.01)); o = e->obs + 1; CuAssertIntEquals(tc, 228789, o->pmmscan); o = e->obs + 2; CuAssertIntEquals(tc, 368267, o->pmmscan); o = e->obs + 3; CuAssertIntEquals(tc, 298646, o->pmmscan); } void test_read_usnob(CuTest* tc) { // od -N 80 --width=10 -t x1 ~/raid1/USNOB10/000/b0000.cat | gawk '{for(i=2;i<=NF;i++){printf("0x%s, ",$i);}printf("\n");}' uint8_t line1[] = { 0xd0, 0xf8, 0x05, 0x00, 0x78, 0x72, 0x00, 0x00, 0xd7, 0x96, 0xa9, 0x32, 0x04, 0xa3, 0xe1, 0x11, 0x81, 0x48, 0x99, 0x51, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0xa0, 0x38, 0xb3, 0x29, 0x44, 0x14, 0x68, 0xb3, 0x93, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xbd, 0xf0, 0x08, 0x04, 0xe5, 0xf0, 0x08, 0x06, 0xe5, 0xf0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x7d, 0x03, 0x00, 0x8b, 0x9e, 0x05, 0x00, 0x96, 0x8e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }; char* fn = "/tmp/test-usnob-0"; int i; for (i=0; i #include #include #include "qfits_header.h" #include "tycho2-fits.h" #include "fitsioutils.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(tycho2_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(tycho2_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i16 = fitscolumn_i16_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type J = TFITS_BIN_TYPE_J; tfits_type I = TFITS_BIN_TYPE_I; tfits_type c = fitscolumn_char_type(); tfits_type bitfield = fitscolumn_bitfield_type(); char* nil = " "; ADDCOL(i16, I, "TYC1", nil, tyc1); ADDCOL(i16, I, "TYC2", nil, tyc2); ADDCOL(u8, u8, "TYC3", nil, tyc3); ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(d, d, "MEAN_RA", "deg", mean_ra); ADDCOL(d, d, "MEAN_DEC", "deg", mean_dec); ADDCOL(f, f, "SIGMA_RA", "deg", sigma_ra); ADDCOL(f, f, "SIGMA_DEC", "deg", sigma_dec); ADDCOL(f, f, "SIGMA_MEAN_RA", "deg", sigma_mean_ra); ADDCOL(f, f, "SIGMA_MEAN_DEC", "deg", sigma_mean_dec); ADDCOL(f, f, "PM_RA", "arcsec/yr", pm_ra); ADDCOL(f, f, "PM_DEC", "arcsyc/yr", pm_dec); ADDCOL(f, f, "SIGMA_PM_RA", "arcsec/yr", sigma_pm_ra); ADDCOL(f, f, "SIGMA_PM_DEC", "arcsyc/yr", sigma_pm_dec); ADDCOL(f, f, "EPOCH_RA", "yr", epoch_ra); ADDCOL(f, f, "EPOCH_DEC", "yr", epoch_dec); ADDCOL(f, f, "EPOCH_MEAN_RA", "yr", epoch_mean_ra); ADDCOL(f, f, "EPOCH_MEAN_DEC", "yr", epoch_mean_dec); ADDCOL(u8, u8, "NOBSERVATIONS", nil, nobs); ADDCOL(f, f, "GOODNESS_MEAN_RA", nil, goodness_mean_ra); ADDCOL(f, f, "GOODNESS_MEAN_DEC", nil, goodness_mean_dec); ADDCOL(f, f, "GOODNESS_PM_RA", nil, goodness_pm_ra); ADDCOL(f, f, "GOODNESS_PM_DEC", nil, goodness_pm_dec); ADDCOL(f, f, "MAG_BT", "mag", mag_BT); ADDCOL(f, f, "SIGMA_MAG_BT", "mag", sigma_BT); ADDCOL(f, f, "MAG_VT", "mag", mag_VT); ADDCOL(f, f, "SIGMA_MAG_VT", "mag", sigma_VT); ADDCOL(f, f, "MAG_HP", "mag", mag_HP); ADDCOL(f, f, "SIGMA_MAG_HP", "mag", sigma_HP); ADDCOL(f, f, "PROX", "deg", prox); ADDCOL(f, f, "CORRELATION", nil, correlation); ADDCOL(i32,J, "HIPPARCOS_ID", nil, hipparcos_id); ADDARR(c, c, "CCDM", nil, hip_ccdm, 3); if (write) fitstable_add_write_column(tab, bitfield, "FLAGS", nil); } #undef ADDCOL #undef ADDARR static int postprocess_read_structs(fitstable_t* table, void* struc, int stride, int offset, int N) { uint8_t* flags; int i; tycho2_fits* cat = table; tycho2_entry* entries = struc; // HACK? Use staging area instead? flags = fitstable_read_column_offset(cat, "FLAGS", fitscolumn_u8_type(), offset, N); if (!flags) return -1; for (i=0; i> 7) & 0x1; entries[i].no_motion = (flag >> 6) & 0x1; entries[i].tycho1_star = (flag >> 5) & 0x1; entries[i].double_star = (flag >> 4) & 0x1; entries[i].photo_center_treatment = (flag >> 3) & 0x1; entries[i].hipparcos_star = (flag >> 2) & 0x1; } free(flags); // Replace trailing spaces by \0. for (i=0; ipostprocess_read_structs = postprocess_read_structs; if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "tycho2-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); tycho2_fits_close(cat); return NULL; } return cat; } tycho2_fits* tycho2_fits_open_for_writing(char* fn) { tycho2_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "TYCHO_2", "T", "This is a Tycho-2 catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_TYCHO2, "Astrometry.net file type", NULL); return cat; } tycho2_entry* tycho2_fits_read_entry(tycho2_fits* cat) { return (tycho2_entry*)fitstable_next_struct(cat); } int tycho2_fits_read_entries(tycho2_fits* cat, int offset, int count, tycho2_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(tycho2_entry), offset, count); } int tycho2_fits_write_entry(tycho2_fits* cat, tycho2_entry* entry) { uint8_t flags; int rtn = fitstable_write_struct(cat, entry); if (rtn) return rtn; flags = (entry->photo_center ? (1 << 7) : 0) | (entry->no_motion ? (1 << 6) : 0) | (entry->tycho1_star ? (1 << 5) : 0) | (entry->double_star ? (1 << 4) : 0) | (entry->photo_center_treatment ? (1 << 3) : 0) | (entry->hipparcos_star ? (1 << 2) : 0); // Can't just write_data() because write_struct() skips over //return fits_write_data_X(cat->fid, flags); return fitstable_write_one_column(cat, bl_size(cat->cols)-1, fitstable_nrows(cat)-1, 1, &flags, 0); } int tycho2_fits_count_entries(tycho2_fits* cat) { return fitstable_nrows(cat); } int tycho2_fits_close(tycho2_fits* cat) { return fitstable_close(cat); } int tycho2_fits_write_headers(tycho2_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int tycho2_fits_fix_headers(tycho2_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } astrometry.net-0.67/catalogs/tycho2.c000644 000765 000024 00000023767 12651445460 017756 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "tycho2.h" static void grab_substring(char* dst, const char* src, int n) { memset(dst, 0, n+1); strncpy(dst, src, n); } static int parse_uint(const char* src, int n, unsigned int* data) { char buf[256]; grab_substring(buf, src, n); if (sscanf(buf, " %u", data) != 1) { fprintf(stderr, "Tycho2: couldn't parse uint record: '%.*s'\n", n, buf); return -1; } return 0; } static int parse_double(const char* src, int n, double* data) { char buf[256]; grab_substring(buf, src, n); if (sscanf(buf, " %lf", data) != 1) { fprintf(stderr, "Tycho2: couldn't parse double record: '%.*s'\n", n, buf); return -1; } return 0; } static int parse_optional_double(const char* src, int n, double* data, double defaultval) { char buf[256]; int i; grab_substring(buf, src, n); for (i=0; i= 1); assert(t1 <= 9537); assert(t2 >= 1); assert(t2 <= 12121); assert(t3 >= 1); assert(t3 <= 3); entry->tyc1 = t1; entry->tyc2 = t2; entry->tyc3 = t3; pxflag = line[13]; switch (pxflag) { case ' ': break; case 'P': entry->photo_center = TRUE; break; case 'X': entry->no_motion = TRUE; break; default: assert(0); } if (parse_optional_double(line + 15, 12, &d1, 0.0) || parse_optional_double(line + 28, 12, &d2, 0.0) || parse_optional_double(line + 41, 7, &d3, 0.0) || parse_optional_double(line + 49, 7, &d4, 0.0) || parse_optional_uint (line + 57, 3, &u1, 0) || parse_optional_uint (line + 61, 3, &u2, 0) || parse_optional_double(line + 65, 4, &d5, 0.0) || parse_optional_double(line + 70, 4, &d6, 0.0) || parse_optional_double(line + 75, 7, &d7, 0.0) || parse_optional_double(line + 83, 7, &d8, 0.0) || parse_optional_uint (line + 91, 2, &u3, 0) || parse_optional_double(line + 94, 3, &d9, 0.0) || parse_optional_double(line + 98, 3, &d10, 0.0) || parse_optional_double(line + 102, 3, &d11, 0.0) || parse_optional_double(line + 106, 3, &d12, 0.0) || parse_optional_double(line + 110, 6, &d13, 0.0) || parse_optional_double(line + 117, 5, &d14, 0.0) || parse_optional_double(line + 123, 6, &d15, 0.0) || parse_optional_double(line + 130, 5, &d16, 0.0)) { return -1; } assert(d3 == 0.0 || (d3 >= -4418.0 && d3 <= 6544.2)); assert(d4 == 0.0 || (d4 >= -5774.3 && d4 <= 10277.3)); assert(u1 == 0 || (u1 >= 3 && u1 <= 183)); assert(u2 == 0 || (u2 >= 1 && u2 <= 184)); assert(d5 == 0.0 || (d5 >= 0.2 && d5 <= 11.5)); assert(d6 == 0.0 || (d6 >= 0.2 && d6 <= 10.3)); assert(d7 == 0.0 || (d7 >= 1915.95 && d7 <= 1992.53)); assert(d8 == 0.0 || (d8 >= 1911.94 && d8 <= 1992.01)); assert(u3 == 0 || (u3 >= 2 && u3 <= 36)); assert(d9 == 0.0 || (d9 >= 0.0 && d9 <= 9.9)); assert(d10 == 0.0 || (d10 >= 0.0 && d10 <= 9.9)); assert(d11 == 0.0 || (d11 >= 0.0 && d11 <= 9.9)); assert(d12 == 0.0 || (d12 >= 0.0 && d12 <= 9.9)); assert(d13 == 0.0 || (d13 >= 2.183 && d13 <= 16.581)); assert(d14 == 0.0 || (d14 >= 0.014 && d14 <= 1.977)); assert(d15 == 0.0 || (d15 >= 1.905 && d15 <= 15.193)); assert(d16 == 0.0 || (d16 >= 0.009 && d16 <= 1.468)); // note: [units in Tycho-2 data file : units in struct] // if only one unit is given, it's the same in both. entry->mean_ra = d1; // [deg] entry->mean_dec = d2; // [deg] entry->pm_ra = d3 / 1000.0; // [mas/yr : arcsec/yr] entry->pm_dec = d4 / 1000.0; // [mas/yr : arcsec/yr] entry->sigma_mean_ra = arcsec2deg((float)u1 / 1000.0); // [mas : deg] entry->sigma_mean_dec = arcsec2deg((float)u2 / 1000.0); // [mas : deg] entry->sigma_pm_ra = d5 / 1000.0; // [mas/yr : arcsec/yr] entry->sigma_pm_dec = d6 / 1000.0; // [mas/yr : arcsec/yr] entry->epoch_mean_ra = d7; // [yr] entry->epoch_mean_dec = d8; // [yr] entry->nobs = u3; entry->goodness_mean_ra = d9; entry->goodness_mean_dec = d10; entry->goodness_pm_ra = d11; entry->goodness_pm_dec = d12; entry->mag_BT = d13; // [mag] entry->sigma_BT = d14; // [mag] entry->mag_VT = d15; // [mag] entry->sigma_VT = d16; // [mag] if (parse_uint(line + 136, 3, &u1) || parse_optional_uint(line + 142, 6, &u2, 0) || parse_double(line + 152, 12, &d1) || parse_double(line + 165, 12, &d2) || parse_double(line + 178, 4, &d3) || parse_double(line + 183, 4, &d4) || parse_double(line + 188, 5, &d5) || parse_double(line + 194, 5, &d6) || parse_double(line + 202, 4, &d7)) { return -1; } memset(entry->hip_ccdm, 0, sizeof(entry->hip_ccdm)); for (i=0; i<3; i++) { char c = line[148 + i]; if (c == ' ') break; entry->hip_ccdm[i] = c; } tycho1 = line[140]; posflag = line[200]; assert(u1 >= 3 && u1 <= 999); assert(u2 == 0 || (u2 >= 1 && u2 <= 120404)); assert(tycho1 == ' ' || tycho1 == 'T'); assert(posflag == ' ' || posflag == 'D' || posflag == 'P'); assert(d3 >= 0.81 && d3 <= 2.13); assert(d4 >= 0.72 && d4 <= 2.36); if (u1 == 999) entry->prox = -1.0; else entry->prox = arcsec2deg(u1 * 0.1); // [arcsec : deg] entry->tycho1_star = (tycho1 == 'T') ? TRUE : FALSE; entry->double_star = (posflag == 'D') ? TRUE : FALSE; entry->photo_center_treatment = (posflag == 'P') ? TRUE : FALSE; entry->hipparcos_id = u2; entry->ra = d1; // [deg] entry->dec = d2; // [deg] entry->epoch_ra = 1990.0 + d3; // [yr] entry->epoch_dec = 1990.0 + d4; // [yr] entry->sigma_ra = arcsec2deg(d5 / 1000.0); // [mas : deg] entry->sigma_dec = arcsec2deg(d6 / 1000.0); // [mas : deg] entry->correlation = d7; return 0; } int tycho2_supplement_parse_entry(const char* line, tycho2_entry* entry) { int len; unsigned int t1, t2, t3; char htflag, tycho1, bvhflag; double d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12; unsigned int u1, u2; memset(entry, 0, sizeof(tycho2_entry)); for (len=0; len= 2); assert(t1 <= 9529); assert(t2 >= 1); assert(t2 <= 12112); assert(t3 >= 1); assert(t3 <= 4); entry->tyc1 = t1; entry->tyc2 = t2; entry->tyc3 = t3; htflag = line[13]; switch (htflag) { case 'H': entry->hipparcos_star = TRUE; break; case 'T': entry->tycho1_star = TRUE; break; default: assert(0); } bvhflag = line[81]; switch (bvhflag) { case 'B': case 'V': case 'H': case ' ': break; default: assert(0); } tycho1 = line[113]; switch (tycho1) { case ' ': case 'T': break; default: assert(0); } if (parse_double(line + 15, 12, &d1) || // RAdeg parse_double(line + 28, 12, &d2) || // DEdeg parse_optional_double(line + 41, 7, &d3, 0.0) || // pmRA parse_optional_double(line + 49, 7, &d4, 0.0) || // pmDE parse_double(line + 57, 5, &d5) || // e_RA* parse_double(line + 63, 5, &d6) || // e_DE parse_optional_double(line + 69, 5, &d7, 0.0) || // e_pmRA parse_optional_double(line + 75, 5, &d8, 0.0) || // e_pmDE parse_optional_double(line + 83, 6, &d9, 0.0) || // BT parse_optional_double(line + 90, 5, &d10, 0.0) || // e_BT parse_optional_double(line + 96, 6, &d11, 0.0) || // VT parse_optional_double(line + 103, 5, &d12, 0.0) || // e_VT parse_optional_uint (line + 109, 3, &u1, 0) || // prox parse_optional_uint (line + 115, 6, &u2, 0)) { return -1; } grab_substring(entry->hip_ccdm, line + 121, 1); assert(u2 == 0 || (u2 >= 1 && u2 <= 120404)); entry->ra = d1; // [deg] entry->dec = d2; // [deg] entry->pm_ra = d3 / 1000.0; // [mas/yr : arcsec/yr] entry->pm_dec = d4 / 1000.0; // [mas/yr : arcsec/yr] entry->sigma_ra = arcsec2deg(d5 / 1000.0); // [arcsec : deg] entry->sigma_dec = arcsec2deg(d6 / 1000.0); // [arcsec : deg] entry->sigma_pm_ra = d7 / 1000.0; // [mas/yr : arcsec/yr] entry->sigma_pm_dec = d8 / 1000.0; // [mas/yr : arcsec/yr] if (bvhflag == 'H') { entry->mag_HP = d11; // [mag] entry->sigma_HP = d12; // [mag] } else { entry->mag_BT = d9; // [mag] entry->sigma_BT = d10; // [mag] entry->mag_VT = d11; // [mag] entry->sigma_VT = d12; // [mag] } entry->prox = arcsec2deg(u1 * 0.1); // [0.1 arcsec : deg] entry->hipparcos_id = u2; return 0; } astrometry.net-0.67/catalogs/tycho2tofits.c000644 000765 000024 00000012524 12651445460 021174 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include "tycho2.h" #include "tycho2-fits.h" #include "starutil.h" #include "healpix.h" #include "boilerplate.h" #include "fitsioutils.h" #define OPTIONS "ho:HN:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s -o (eg, tycho2_hp%%02i.fits if you use the -H option)\n" " [-H]: do healpixification\n" " [-N ]\n" " [ ...]\n\n" "(Healpixification isn't usually necessary because the Tycho-2 catalog is small.)\n\n", progname); } int main(int argc, char** args) { char* outfn = NULL; int c; int nrecords, nobs; int Nside = 8; tycho2_fits** tycs; int i, HP; int do_hp = 0; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'H': do_hp = 1; break; case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } if (do_hp) { HP = 12 * Nside * Nside; } else { HP = 1; } tycs = malloc(HP * sizeof(tycho2_fits*)); memset(tycs, 0, HP * sizeof(tycho2_fits*)); nrecords = 0; nobs = 0; printf("Reading Tycho-2 files... \n"); fflush(stdout); for (; optind #include #include #include #include #include #include #include "tycho2-fits.h" #include "starutil.h" #include "mathutil.h" #include "an-endian.h" #define OPTIONS "ho:" static void print_help(char* progname) { printf("usage:\n" " %s -o \n" " [ ...]\n\n" "Input files must be Tycho-2 FITS files.\n" "Output file will be in Stellarium format.\n\n", progname); } static int write_32(FILE* fout, void* p) { if (fwrite(p, 1, 4, fout) != 4) { fprintf(stderr, "Failed to write 32-bit quantity: %s\n", strerror(errno)); return -1; } return 0; } static int write_16(FILE* fout, void* p) { if (fwrite(p, 1, 2, fout) != 2) { fprintf(stderr, "Failed to write 16-bit quantity: %s\n", strerror(errno)); return -1; } return 0; } static int write_8(FILE* fout, void* p) { if (fwrite(p, 1, 1, fout) != 1) { fprintf(stderr, "Failed to write 8-bit quantity: %s\n", strerror(errno)); return -1; } return 0; } int main(int argc, char** args) { char* outfn = NULL; int c; int startoptind; FILE* fout; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'o': outfn = optarg; break; } } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } fout = fopen(outfn, "wb"); if (!fout) { fprintf(stderr, "Failed to open output file: %s\n", strerror(errno)); exit(-1); } //qfits_err_register(qfits_dispfn); //qfits_err_statset(1); startoptind = optind; for (; optindRA; dec = e->DEC; // just avg the available magnitudes. nmag = 0; mag = 0.0; // in Tycho-2, mag 0.0 means it's unavailable. if (e->mag_BT != 0.0) { mag += e->mag_BT; nmag++; } if (e->mag_VT != 0.0) { mag += e->mag_VT; nmag++; } if (e->mag_HP != 0.0) { mag += e->mag_HP; nmag++; } if (nmag) mag /= (float)nmag; // ra: degrees -> hours ra *= 24.0 / 360.0; // dec: degrees -> degrees // imag: 256 * mag - 5 // distance info isn't in Tycho-2. distance = 1.0; tmpmag = (int)rint(256.0 * mag); if (tmpmag < 0) tmpmag += 0x10000; imag = tmpmag; //type = 12; // "other" type = 0; // "other" v32_htole(&ra); v32_htole(&dec); v16_htole(&imag); v32_htole(&distance); write_32(fout, &ra); write_32(fout, &dec); write_16(fout, &imag); write_8 (fout, &type); write_32(fout, &distance); } tycho2_fits_close(tycho); } if (fclose(fout)) { fprintf(stderr, "Failed to close output file: %s\n", strerror(errno)); exit(-1); } return 0; } astrometry.net-0.67/catalogs/ucac3-fits.c000644 000765 000024 00000014573 12651445460 020502 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "ucac3-fits.h" #include "fitsioutils.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(ucac3_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(ucac3_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type J = TFITS_BIN_TYPE_J; char* nil = " "; ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(f, f, "SIGMA_RA", "deg", sigma_ra); ADDCOL(f, f, "SIGMA_DEC", "deg", sigma_dec); ADDCOL(f, f, "PM_RA", "arcsec/yr", pm_ra); ADDCOL(f, f, "PM_DEC", "arcsyc/yr", pm_dec); ADDCOL(f, f, "SIGMA_PM_RA", "arcsec/yr", sigma_pm_ra); ADDCOL(f, f, "SIGMA_PM_DEC", "arcsyc/yr", sigma_pm_dec); ADDCOL(f, f, "EPOCH_RA", "yr", epoch_ra); ADDCOL(f, f, "EPOCH_DEC", "yr", epoch_dec); ADDCOL(f, f, "MAG", "mag", mag); ADDCOL(f, f, "MAG_ERR", "mag", mag_err); ADDCOL(f, f, "APMAG", "mag", apmag); ADDCOL(f, f, "JMAG", "mag", jmag); ADDCOL(f, f, "HMAG", "mag", hmag); ADDCOL(f, f, "KMAG", "mag", kmag); ADDCOL(f, f, "JMAG_ERR", "mag", jmag_err); ADDCOL(f, f, "HMAG_ERR", "mag", hmag_err); ADDCOL(f, f, "KMAG_ERR", "mag", kmag_err); ADDCOL(f, f, "BMAG", "mag", bmag); ADDCOL(f, f, "R2MAG", "mag", r2mag); ADDCOL(f, f, "IMAG", "mag", imag); ADDCOL(u8, u8, "JFLAGS", nil, twomass_jflags); ADDCOL(u8, u8, "HFLAGS", nil, twomass_hflags); ADDCOL(u8, u8, "KFLAGS", nil, twomass_kflags); ADDCOL(u8, u8, "CLBL", nil, clbl); ADDCOL(u8, u8, "BQUALITY", nil, bquality); ADDCOL(u8, u8, "R2QUALITY", nil, r2quality); ADDCOL(u8, u8, "IQUALITY", nil, iquality); ADDCOL(u8, u8, "OBJTYPE", nil, objtype); ADDCOL(u8, u8, "DOUBLESTAR", nil, doublestar); ADDCOL(u8, u8, "NAVAIL", nil, navail); ADDCOL(u8, u8, "NUSED", nil, nused); ADDCOL(u8, u8, "NPM", nil, npm); ADDCOL(u8, u8, "NMATCH", nil, nmatch); ADDARR(u8, u8, "MATCHFLAGS", nil, matchflags, 10); ADDCOL(u8, u8, "YALE_CFLAG", nil, yale_cflag); ADDCOL(u8, u8, "YALE_GFLAG", nil, yale_gflag); ADDCOL(u8, u8, "LEDA_GFLAG", nil, leda_flag); ADDCOL(u8, u8, "TMXS_GFLAG", nil, twomass_extsource_flag); ADDCOL(i32,J, "TWOMASS_ID", nil, twomass_id); ADDCOL(i32,J, "MPOS", nil, mpos); } #undef ADDCOL #undef ADDARR ucac3_entry* ucac3_fits_read_entry(ucac3_fits* cat) { return (ucac3_entry*)fitstable_next_struct(cat); } int ucac3_fits_read_entries(ucac3_fits* cat, int offset, int count, ucac3_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(ucac3_entry), offset, count); } int ucac3_fits_write_entry(ucac3_fits* cat, ucac3_entry* entry) { /* entry->flags[0] = (entry->usnob_fail ? (1 << 7) : 0) | (entry->twomass_fail ? (1 << 6) : 0) | (entry->tycho_astrometry ? (1 << 5) : 0) | (entry->alt_radec ? (1 << 4) : 0) | (entry->alt_ucac ? (1 << 3) : 0) | (entry->alt_tycho ? (1 << 2) : 0) | (entry->blue_o ? (1 << 1) : 0) | (entry->red_e ? (1 << 0) : 0); entry->flags[1] = (entry->twomass_only ? (1 << 7) : 0) | (entry->hipp_astrometry ? (1 << 6) : 0) | (entry->diffraction ? (1 << 5) : 0) | (entry->confusion ? (1 << 4) : 0) | (entry->bright_confusion ? (1 << 3) : 0) | (entry->bright_artifact ? (1 << 2) : 0) | (entry->standard ? (1 << 1) : 0); */ return fitstable_write_struct(cat, entry); } int ucac3_fits_count_entries(ucac3_fits* cat) { return fitstable_nrows(cat); } int ucac3_fits_close(ucac3_fits* ucac3) { return fitstable_close(ucac3); } ucac3_fits* ucac3_fits_open(char* fn) { ucac3_fits* cat = NULL; cat = fitstable_open(fn); if (!cat) return NULL; add_columns(cat, FALSE); fitstable_use_buffered_reading(cat, sizeof(ucac3_entry), 1000); if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "ucac3-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); ucac3_fits_close(cat); return NULL; } return cat; } ucac3_fits* ucac3_fits_open_for_writing(char* fn) { ucac3_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "UCAC3", "T", "This is a UCAC3 catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_UCAC3, "Astrometry.net file type", NULL); return cat; } int ucac3_fits_write_headers(ucac3_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int ucac3_fits_fix_headers(ucac3_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } astrometry.net-0.67/catalogs/ucac3-fits.h000644 000765 000024 00000001514 12651445460 020476 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef UCAC3_FITS_H #define UCAC3_FITS_H #include #include "astrometry/ucac3.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_UCAC3 "UCAC3" typedef fitstable_t ucac3_fits; ucac3_fits* ucac3_fits_open(char* fn); ucac3_fits* ucac3_fits_open_for_writing(char* fn); int ucac3_fits_write_headers(ucac3_fits* ucac3); int ucac3_fits_fix_headers(ucac3_fits* ucac3); int ucac3_fits_count_entries(ucac3_fits* ucac3); ucac3_entry* ucac3_fits_read_entry(ucac3_fits* t); int ucac3_fits_read_entries(ucac3_fits* ucac3, int offset, int count, ucac3_entry* entries); int ucac3_fits_close(ucac3_fits* ucac3); int ucac3_fits_write_entry(ucac3_fits* ucac3, ucac3_entry* entry); #endif astrometry.net-0.67/catalogs/ucac3.c000644 000765 000024 00000006141 12651445460 017527 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "ucac3.h" #include "an-endian.h" #include "starutil.h" static uint32_t grab_u32(void** v) { uint32_t uval = u32_letoh(*((uint32_t*)(*v))); *v = (((uint32_t*)(*v)) + 1); //((uint32_t*)(*v)) += 1; return uval; } static int32_t grab_i32(void** v) { int32_t val = (int32_t)u32_letoh(*((uint32_t*)(*v))); *v = (((int32_t*)(*v)) + 1); return val; } static uint16_t grab_u16(void** v) { uint16_t uval = u16_letoh(*((uint16_t*)(*v))); *v = (((uint16_t*)(*v)) + 1); //((uint16_t*)(*v)) += 1; return uval; } static int16_t grab_i16(void** v) { int16_t val = (int16_t)u16_letoh(*((uint16_t*)(*v))); *v = (((int16_t*)(*v)) + 1); return val; } static int8_t grab_i8(void** v) { int8_t val = *((int8_t*)(*v)); *v = (((int8_t*)(*v)) + 1); return val; } static uint8_t grab_u8(void** v) { uint8_t val = *((uint8_t*)(*v)); *v = (((uint8_t*)(*v)) + 1); return val; } int ucac3_parse_entry(ucac3_entry* entry, const void* encoded) { //const uint32_t* udata = encoded; uint32_t uval; void* buf = (void*)encoded; int i; // RESIST THE URGE TO RE-ORDER THESE, bonehead! uval = grab_u32(&buf); entry->ra = arcsec2deg(uval * 0.001); uval = grab_u32(&buf); entry->dec = arcsec2deg(uval * 0.001) - 90.0; entry->mag = 0.001 * grab_i16(&buf); entry->apmag = 0.001 * grab_i16(&buf); entry->mag_err = 0.001 * grab_i16(&buf); entry->objtype = grab_i8(&buf); entry->doublestar = grab_i8(&buf); entry->sigma_ra = arcsec2deg(0.001 * grab_u16(&buf)); entry->sigma_dec = arcsec2deg(0.001 * grab_u16(&buf)); entry->navail = grab_i8(&buf); entry->nused = grab_i8(&buf); entry->npm = grab_i8(&buf); entry->nmatch = grab_i8(&buf); entry->epoch_ra = 1900. + 0.01 * grab_u16(&buf); entry->epoch_dec = 1900. + 0.01 * grab_u16(&buf); entry->pm_ra = 1e-4 * grab_i32(&buf); entry->pm_dec = 1e-4 * grab_i32(&buf); entry->sigma_pm_ra = 1e-4 * grab_u16(&buf); entry->sigma_pm_dec = 1e-4 * grab_u16(&buf); entry->twomass_id = grab_u32(&buf); entry->jmag = 0.001 * grab_i16(&buf); entry->hmag = 0.001 * grab_i16(&buf); entry->kmag = 0.001 * grab_i16(&buf); entry->twomass_jflags = grab_u8(&buf); entry->twomass_hflags = grab_u8(&buf); entry->twomass_kflags = grab_u8(&buf); entry->jmag_err = 0.01 * grab_u8(&buf); entry->hmag_err = 0.01 * grab_u8(&buf); entry->kmag_err = 0.01 * grab_u8(&buf); entry->bmag = 0.001 * grab_i16(&buf); entry->r2mag = 0.001 * grab_i16(&buf); entry->imag = 0.001 * grab_i16(&buf); entry->clbl = grab_u8(&buf); entry->bquality = grab_u8(&buf); entry->r2quality = grab_u8(&buf); entry->iquality = grab_u8(&buf); for (i=0; i<10; i++) entry->matchflags[i] = grab_u8(&buf); entry->yale_gflag = grab_u8(&buf); entry->yale_cflag = grab_u8(&buf); entry->leda_flag = grab_u8(&buf); entry->twomass_extsource_flag = grab_u8(&buf); entry->mpos = grab_u32(&buf); /* printf("ra=%g, dec=%g\n", entry->ra, entry->dec); printf("mag=%g, apmag=%g\n", entry->mag, entry->apmag); printf("objt=%i\n", entry->objtype); */ return 0; } astrometry.net-0.67/catalogs/ucac3tofits.c000644 000765 000024 00000011172 12651445460 020760 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include "ucac3-fits.h" #include "ucac3.h" #include "anqfits.h" #include "healpix.h" #include "starutil.h" #include "fitsioutils.h" #include "log.h" #include "errors.h" #include "boilerplate.h" #define OPTIONS "ho:N:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s -o [default: ucac3_%%03i.fits]\n" " [-N ] (default = 9)\n" " [ ...]\n" "\n" "The output-filename-template should contain a \"printf\" sequence like \"%%03i\";\n" "we use \"sprintf(filename, output-filename-template, healpix)\" to determine the filename\n" "to be used for each healpix.\n\n" "\nNOTE: WE ASSUME THE UCAC3 FILES ARE GIVEN ON THE COMMAND LINE IN ORDER: z001.bz2, z002.bz2, ..., z360.bz2.\n\n", progname); } #define CHECK_BZERR() \ do { if (bzerr != BZ_OK) { ERROR("bzip2 error: code %i", bzerr); \ BZ2_bzReadClose(&bzerr, bzfid); exit(-1); }} while (0); int main(int argc, char** args) { char* outfn = "ucac3_%03i.fits"; int c; int startoptind; int nrecords, nfiles; int Nside = 9; ucac3_fits** ucacs; int i, HP; int slicecounts[1800]; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } log_init(LOG_MSG); if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } HP = 12 * Nside * Nside; printf("Nside = %i, using %i healpixes.\n", Nside, HP); ucacs = calloc(HP, sizeof(ucac3_fits*)); memset(slicecounts, 0, 1800 * sizeof(uint)); nrecords = 0; nfiles = 0; startoptind = optind; for (; optind startoptind) && ((optind - startoptind) % 100 == 0)) { printf("\nReading file %i of %i: %s\n", optind - startoptind, argc - startoptind, infn); } fflush(stdout); fid = fopen(infn, "rb"); if (!fid) { SYSERROR("Couldn't open input file \"%s\"", infn); exit(-1); } // MAGIC 1: bzip verbosity: [0=silent, 4=debug] // 0: small -- don't use less memory bzfid = BZ2_bzReadOpen(&bzerr, fid, 1, 0, NULL, 0); CHECK_BZERR(); for (i=0;; i++) { ucac3_entry entry; int hp; char buf[UCAC3_RECORD_SIZE]; int nr; anbool eof = 0; nr = BZ2_bzRead(&bzerr, bzfid, buf, UCAC3_RECORD_SIZE); if ((bzerr == BZ_STREAM_END) && (nr == UCAC3_RECORD_SIZE)) eof = TRUE; else CHECK_BZERR(); if (ucac3_parse_entry(&entry, buf)) { ERROR("Failed to parse UCAC3 entry %i in file \"%s\".", i, infn); exit(-1); } hp = radecdegtohealpix(entry.ra, entry.dec, Nside); if (!ucacs[hp]) { char fn[256]; sprintf(fn, outfn, hp); ucacs[hp] = ucac3_fits_open_for_writing(fn); if (!ucacs[hp]) { ERROR("Failed to initialize FITS file %i (filename %s)", hp, fn); exit(-1); } fits_header_add_int(ucacs[hp]->header, "HEALPIX", hp, "The healpix number of this catalog."); fits_header_add_int(ucacs[hp]->header, "NSIDE", Nside, "The healpix resolution."); BOILERPLATE_ADD_FITS_HEADERS(ucacs[hp]->header); qfits_header_add(ucacs[hp]->header, "HISTORY", "Created by the program \"ucac3tofits\"", NULL, NULL); qfits_header_add(ucacs[hp]->header, "HISTORY", "ucac3tofits command line:", NULL, NULL); fits_add_args(ucacs[hp]->header, args, argc); qfits_header_add(ucacs[hp]->header, "HISTORY", "(end of command line)", NULL, NULL); if (ucac3_fits_write_headers(ucacs[hp])) { ERROR("Failed to write header for FITS file %s", fn); exit(-1); } } if (ucac3_fits_write_entry(ucacs[hp], &entry)) { ERROR("Failed to write FITS entry"); exit(-1); } nrecords++; if (eof) break; } BZ2_bzReadClose(&bzerr, bzfid); fclose(fid); nfiles++; printf("\n"); } printf("\n"); // close all the files... for (i=0; i #include #include #include "ucac4-fits.h" #include "fitsioutils.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(ucac4_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(ucac4_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type J = TFITS_BIN_TYPE_J; char* nil = " "; ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(f, f, "SIG_RA", "deg", sigma_ra); ADDCOL(f, f, "SIG_DEC", "deg", sigma_dec); ADDCOL(f, f, "PM_RA", "arcsec/yr", pm_rac); ADDCOL(f, f, "PM_DEC", "arcsyc/yr", pm_dec); ADDCOL(f, f, "SIG_PM_R", "arcsec/yr", sigma_pm_ra); ADDCOL(f, f, "SIG_PM_D", "arcsyc/yr", sigma_pm_dec); ADDCOL(f, f, "EPOCH_RA", "yr", epoch_ra); ADDCOL(f, f, "EPOCH_DE", "yr", epoch_dec); ADDCOL(f, f, "MAG", "mag", mag); ADDCOL(f, f, "SIGMAG", "mag", mag_err); ADDCOL(f, f, "APMAG", "mag", apmag); ADDCOL(f, f, "JMAG", "mag", jmag); ADDCOL(f, f, "HMAG", "mag", hmag); ADDCOL(f, f, "KMAG", "mag", kmag); ADDCOL(f, f, "JMAG_ERR", "mag", jmag_err); ADDCOL(f, f, "HMAG_ERR", "mag", hmag_err); ADDCOL(f, f, "KMAG_ERR", "mag", kmag_err); ADDCOL(f, f, "BMAG", "mag", Bmag); ADDCOL(f, f, "VMAG", "mag", Vmag); ADDCOL(f, f, "GMAG", "mag", gmag); ADDCOL(f, f, "RMAG", "mag", rmag); ADDCOL(f, f, "IMAG", "mag", imag); ADDCOL(f, f, "BMAG_ERR", "mag", Bmag_err); ADDCOL(f, f, "VMAG_ERR", "mag", Vmag_err); ADDCOL(f, f, "GMAG_ERR", "mag", gmag_err); ADDCOL(f, f, "RMAG_ERR", "mag", rmag_err); ADDCOL(f, f, "IMAG_ERR", "mag", imag_err); ADDCOL(u8, u8, "ICQ_FL_J", nil, twomass_jflags); ADDCOL(u8, u8, "ICQ_FL_H", nil, twomass_hflags); ADDCOL(u8, u8, "ICQ_FL_K", nil, twomass_kflags); ADDCOL(u8, u8, "OBJTYPE", nil, objtype); ADDCOL(u8, u8, "CDF", nil, doublestar); ADDCOL(u8, u8, "NA_ONE", nil, navail); ADDCOL(u8, u8, "NU_ONE", nil, nused); ADDCOL(u8, u8, "CU_ONE", nil, nmatch); ADDCOL(u8, u8, "GC_FLG", nil, yale_gc_flag); ADDCOL(u8, u8, "LEDA_FLG", nil, leda_flag); ADDCOL(u8, u8, "TMXS_FLG", nil, twomass_extsource_flag); ADDCOL(i32,J, "ICF", nil, catalog_flags); ADDCOL(i32,J, "X_TWO_M", nil, twomass_id); ADDCOL(i32,J, "RNM", nil, mpos); ADDCOL(i32,J, "ZN_TWO", nil, ucac2_zone); ADDCOL(i32,J, "RN_TWO", nil, ucac2_number); } #undef ADDCOL #undef ADDARR ucac4_entry* ucac4_fits_read_entry(ucac4_fits* cat) { return (ucac4_entry*)fitstable_next_struct(cat); } int ucac4_fits_read_entries(ucac4_fits* cat, int offset, int count, ucac4_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(ucac4_entry), offset, count); } int ucac4_fits_write_entry(ucac4_fits* cat, ucac4_entry* entry) { /* entry->flags[0] = (entry->usnob_fail ? (1 << 7) : 0) | (entry->twomass_fail ? (1 << 6) : 0) | (entry->tycho_astrometry ? (1 << 5) : 0) | (entry->alt_radec ? (1 << 4) : 0) | (entry->alt_ucac ? (1 << 3) : 0) | (entry->alt_tycho ? (1 << 2) : 0) | (entry->blue_o ? (1 << 1) : 0) | (entry->red_e ? (1 << 0) : 0); entry->flags[1] = (entry->twomass_only ? (1 << 7) : 0) | (entry->hipp_astrometry ? (1 << 6) : 0) | (entry->diffraction ? (1 << 5) : 0) | (entry->confusion ? (1 << 4) : 0) | (entry->bright_confusion ? (1 << 3) : 0) | (entry->bright_artifact ? (1 << 2) : 0) | (entry->standard ? (1 << 1) : 0); */ return fitstable_write_struct(cat, entry); } int ucac4_fits_count_entries(ucac4_fits* cat) { return fitstable_nrows(cat); } int ucac4_fits_close(ucac4_fits* ucac4) { return fitstable_close(ucac4); } ucac4_fits* ucac4_fits_open(char* fn) { ucac4_fits* cat = NULL; cat = fitstable_open(fn); if (!cat) return NULL; add_columns(cat, FALSE); fitstable_use_buffered_reading(cat, sizeof(ucac4_entry), 1000); if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "ucac4-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); ucac4_fits_close(cat); return NULL; } return cat; } ucac4_fits* ucac4_fits_open_for_writing(char* fn) { ucac4_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "UCAC4", "T", "This is a UCAC4 catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_UCAC4, "Astrometry.net file type", NULL); return cat; } int ucac4_fits_write_headers(ucac4_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int ucac4_fits_fix_headers(ucac4_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } astrometry.net-0.67/catalogs/ucac4-fits.h000644 000765 000024 00000003000 12651445460 020467 0ustar00dstnstaff000000 000000 /* This file is part of the Astrometry.net suite. Copyright 2011 Dustin Lang. Copyright 2013 Michal Kočer, Klet Observatory. The Astrometry.net suite 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, version 2. The Astrometry.net suite 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 the Astrometry.net suite ; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef UCAC4_FITS_H #define UCAC4_FITS_H #include #include "astrometry/ucac4.h" #include "astrometry/fitstable.h" #define AN_FILETYPE_UCAC4 "UCAC4" typedef fitstable_t ucac4_fits; ucac4_fits* ucac4_fits_open(char* fn); ucac4_fits* ucac4_fits_open_for_writing(char* fn); int ucac4_fits_write_headers(ucac4_fits* ucac4); int ucac4_fits_fix_headers(ucac4_fits* ucac4); int ucac4_fits_count_entries(ucac4_fits* ucac4); ucac4_entry* ucac4_fits_read_entry(ucac4_fits* t); int ucac4_fits_read_entries(ucac4_fits* ucac4, int offset, int count, ucac4_entry* entries); int ucac4_fits_close(ucac4_fits* ucac4); int ucac4_fits_write_entry(ucac4_fits* ucac4, ucac4_entry* entry); #endif astrometry.net-0.67/catalogs/ucac4.c000644 000765 000024 00000006422 12651445460 017532 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include "ucac4.h" #include "an-endian.h" #include "starutil.h" static uint32_t grab_u32(void** v) { uint32_t uval = u32_letoh(*((uint32_t*)(*v))); *v = (((uint32_t*)(*v)) + 1); //((uint32_t*)(*v)) += 1; return uval; } static int32_t grab_i32(void** v) { int32_t val = (int32_t)u32_letoh(*((uint32_t*)(*v))); *v = (((int32_t*)(*v)) + 1); return val; } static uint16_t grab_u16(void** v) { uint16_t uval = u16_letoh(*((uint16_t*)(*v))); *v = (((uint16_t*)(*v)) + 1); //((uint16_t*)(*v)) += 1; return uval; } static int16_t grab_i16(void** v) { int16_t val = (int16_t)u16_letoh(*((uint16_t*)(*v))); *v = (((int16_t*)(*v)) + 1); return val; } static int8_t grab_i8(void** v) { int8_t val = *((int8_t*)(*v)); *v = (((int8_t*)(*v)) + 1); return val; } static uint8_t grab_u8(void** v) { uint8_t val = *((uint8_t*)(*v)); *v = (((uint8_t*)(*v)) + 1); return val; } int ucac4_parse_entry(ucac4_entry* entry, const void* encoded) { //const uint32_t* udata = encoded; uint32_t uval; void* buf = (void*)encoded; // RESIST THE URGE TO RE-ORDER THESE, bonehead! uval = grab_u32(&buf); entry->ra = arcsec2deg(uval * 0.001); uval = grab_u32(&buf); entry->dec = arcsec2deg(uval * 0.001) - 90.0; entry->mag = 0.001 * grab_i16(&buf); entry->apmag = 0.001 * grab_i16(&buf); entry->mag_err = 0.01 * grab_u8(&buf); entry->objtype = grab_u8(&buf); entry->doublestar = grab_u8(&buf); entry->sigma_ra = arcsec2deg(0.001 * (grab_i8(&buf) + 128)); entry->sigma_dec = arcsec2deg(0.001 * (grab_i8(&buf) + 128)); entry->navail = grab_u8(&buf); entry->nused = grab_u8(&buf); entry->nmatch = grab_u8(&buf); entry->epoch_ra = 1900. + 0.01 * grab_u16(&buf); entry->epoch_dec = 1900. + 0.01 * grab_u16(&buf); entry->pm_rac = 1e-4 * grab_i16(&buf); entry->pm_dec = 1e-4 * grab_i16(&buf); entry->sigma_pm_ra = 1e-4 * (grab_u8(&buf) + 128); entry->sigma_pm_dec = 1e-4 * (grab_u8(&buf) + 128); entry->twomass_id = grab_u32(&buf); entry->jmag = 0.001 * grab_i16(&buf); entry->hmag = 0.001 * grab_i16(&buf); entry->kmag = 0.001 * grab_i16(&buf); entry->twomass_jflags = grab_u8(&buf); entry->twomass_hflags = grab_u8(&buf); entry->twomass_kflags = grab_u8(&buf); entry->jmag_err = 0.01 * grab_u8(&buf); entry->hmag_err = 0.01 * grab_u8(&buf); entry->kmag_err = 0.01 * grab_u8(&buf); entry->Bmag = 0.001 * grab_i16(&buf); entry->Vmag = 0.001 * grab_i16(&buf); entry->gmag = 0.001 * grab_i16(&buf); entry->rmag = 0.001 * grab_i16(&buf); entry->imag = 0.001 * grab_i16(&buf); entry->Bmag_err = 0.01 * grab_u8(&buf); entry->Vmag_err = 0.01 * grab_u8(&buf); entry->gmag_err = 0.01 * grab_u8(&buf); entry->rmag_err = 0.01 * grab_u8(&buf); entry->imag_err = 0.01 * grab_u8(&buf); entry->yale_gc_flag = grab_u8(&buf); entry->catalog_flags = grab_i32(&buf); entry->leda_flag = grab_u8(&buf); entry->twomass_extsource_flag = grab_u8(&buf); entry->mpos = grab_u32(&buf); entry->ucac2_zone = grab_u16(&buf); entry->ucac2_number= grab_u32(&buf); /* printf("ra=%g, dec=%g\n", entry->ra, entry->dec); printf("mag=%g, apmag=%g\n", entry->mag, entry->apmag); printf("objt=%i\n", entry->objtype); */ return 0; } astrometry.net-0.67/catalogs/ucac4tofits.c000644 000765 000024 00000011171 12651445460 020760 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include "ucac4-fits.h" #include "ucac4.h" #include "anqfits.h" #include "healpix.h" #include "starutil.h" #include "fitsioutils.h" #include "log.h" #include "errors.h" #include "boilerplate.h" #define OPTIONS "ho:N:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s -o [default: ucac4_%%03i.fits]\n" " [-N ] (default = 9)\n" " [ ...]\n" "\n" "The output-filename-template should contain a \"printf\" sequence like \"%%03i\";\n" "we use \"sprintf(filename, output-filename-template, healpix)\" to determine the filename\n" "to be used for each healpix.\n\n" "\nNOTE: WE ASSUME THE UCAC4 FILES ARE GIVEN ON THE COMMAND LINE IN ORDER: z001.bz2, z002.bz2, ..., z360.bz2.\n\n", progname); } #define CHECK_BZERR() \ do { if (bzerr != BZ_OK) { ERROR("bzip2 error: code %i", bzerr); \ BZ2_bzReadClose(&bzerr, bzfid); exit(-1); }} while (0); int main(int argc, char** args) { char* outfn = "ucac4_%03i.fits"; int c; int startoptind; int nrecords, nfiles; int Nside = 9; ucac4_fits** ucacs; int i, HP; int slicecounts[1800]; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } log_init(LOG_MSG); if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } HP = 12 * Nside * Nside; printf("Nside = %i, using %i healpixes.\n", Nside, HP); ucacs = calloc(HP, sizeof(ucac4_fits*)); memset(slicecounts, 0, 1800 * sizeof(uint)); nrecords = 0; nfiles = 0; startoptind = optind; for (; optind startoptind) && ((optind - startoptind) % 100 == 0)) { printf("\nReading file %i of %i: %s\n", optind - startoptind, argc - startoptind, infn); } fflush(stdout); fid = fopen(infn, "rb"); if (!fid) { SYSERROR("Couldn't open input file \"%s\"", infn); exit(-1); } // MAGIC 1: bzip verbosity: [0=silent, 4=debug] // 0: small -- don't use less memory bzfid = BZ2_bzReadOpen(&bzerr, fid, 1, 0, NULL, 0); CHECK_BZERR(); for (i=0;; i++) { ucac4_entry entry; int hp; char buf[UCAC4_RECORD_SIZE]; int nr; anbool eof = 0; nr = BZ2_bzRead(&bzerr, bzfid, buf, UCAC4_RECORD_SIZE); if ((bzerr == BZ_STREAM_END) && (nr == UCAC4_RECORD_SIZE)) eof = TRUE; else CHECK_BZERR(); if (ucac4_parse_entry(&entry, buf)) { ERROR("Failed to parse UCAC4 entry %i in file \"%s\".", i, infn); exit(-1); } hp = radecdegtohealpix(entry.ra, entry.dec, Nside); if (!ucacs[hp]) { char fn[256]; sprintf(fn, outfn, hp); ucacs[hp] = ucac4_fits_open_for_writing(fn); if (!ucacs[hp]) { ERROR("Failed to initialize FITS file %i (filename %s)", hp, fn); exit(-1); } fits_header_add_int(ucacs[hp]->header, "HEALPIX", hp, "The healpix number of this catalog."); fits_header_add_int(ucacs[hp]->header, "NSIDE", Nside, "The healpix resolution."); BOILERPLATE_ADD_FITS_HEADERS(ucacs[hp]->header); qfits_header_add(ucacs[hp]->header, "HISTORY", "Created by the program \"ucac4tofits\"", NULL, NULL); qfits_header_add(ucacs[hp]->header, "HISTORY", "ucac4tofits command line:", NULL, NULL); fits_add_args(ucacs[hp]->header, args, argc); qfits_header_add(ucacs[hp]->header, "HISTORY", "(end of command line)", NULL, NULL); if (ucac4_fits_write_headers(ucacs[hp])) { ERROR("Failed to write header for FITS file %s", fn); exit(-1); } } if (ucac4_fits_write_entry(ucacs[hp], &entry)) { ERROR("Failed to write FITS entry"); exit(-1); } nrecords++; if (eof) break; } BZ2_bzReadClose(&bzerr, bzfid); fclose(fid); nfiles++; printf("\n"); } printf("\n"); // close all the files... for (i=0; i #include #include #include "usnob-fits.h" #include "fitsioutils.h" // This is a naughty preprocessor function because it uses variables // declared in the scope from which it is called. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(usnob_entry, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(usnob_entry, member), \ any, col, units, TRUE); \ } #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i16 = fitscolumn_i16_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type J = TFITS_BIN_TYPE_J; tfits_type u = fitscolumn_int_type(); //tfits_type anbool = fitscolumn_bool_type(); //tfits_type logical = fitscolumn_boolean_type(); tfits_type bitfield = fitscolumn_bitfield_type(); char* nil = " "; int ob; ADDCOL(d, d, "RA", "deg", ra); ADDCOL(d, d, "DEC", "deg", dec); ADDCOL(f, f, "SIGMA_RA", "deg", sigma_ra); ADDCOL(f, f, "SIGMA_DEC", "deg", sigma_dec); ADDCOL(f, f, "SIGMA_RA_FIT", "deg", sigma_ra_fit); ADDCOL(f, f, "SIGMA_DEC_FIT", "deg", sigma_dec_fit); ADDCOL(f, f, "PM_RA", "arcsec/yr", pm_ra); ADDCOL(f, f, "PM_DEC", "arcsec/yr", pm_dec); ADDCOL(f, f, "SIGMA_PM_RA", "arcsec/yr", sigma_pm_ra); ADDCOL(f, f, "SIGMA_PM_DEC", "arcsec/yr", sigma_pm_dec); ADDCOL(f, f, "PM_PROBABILITY", nil, pm_prob); ADDCOL(f, f, "EPOCH", "yr", epoch); ADDCOL(u8, u8, "NUM_DETECTIONS", nil, ndetections); ADDCOL(u, J, "USNOB_ID", nil, usnob_id); for (ob=0; ob<5; ob++) { char field[256]; sprintf(field, "MAGNITUDE_%i", ob); ADDCOL(f, f, field, "mag", obs[ob].mag); sprintf(field, "FIELD_%i", ob); ADDCOL(i16, i16, field, nil, obs[ob].field); sprintf(field, "SURVEY_%i", ob); ADDCOL(u8, u8, field, nil, obs[ob].survey); sprintf(field, "STAR_GALAXY_%i", ob); ADDCOL(u8, u8, field, nil, obs[ob].star_galaxy); sprintf(field, "XI_RESIDUAL_%i", ob); ADDCOL(f, f, field, "deg", obs[ob].xi_resid); sprintf(field, "ETA_RESIDUAL_%i", ob); ADDCOL(f, f, field, "deg", obs[ob].eta_resid); sprintf(field, "CALIBRATION_%i", ob); ADDCOL(u8, u8, field, nil, obs[ob].calibration); sprintf(field, "PMM_%i", ob); ADDCOL(i32, i32, field, nil, obs[ob].pmmscan); } ADDCOL(bitfield, bitfield, "FLAGS", nil, flags); // AN_DIFFRACTION_SPIKE is optional. fitstable_add_column_struct(tab, bitfield, 1, offsetof(usnob_entry, an_diffraction_spike), (write? bitfield : any), "AN_DIFFRACTION_SPIKE", nil, FALSE); } #undef ADDCOL #undef ADDARR static int postprocess_read_structs(fitstable_t* table, void* struc, int stride, int offset, int N) { int i; usnob_entry* entries = struc; for (i=0; i> 7) & 0x1; entries[i].motion_catalog = (flag >> 6) & 0x1; entries[i].ys4 = (flag >> 5) & 0x1; } return 0; } int usnob_fits_remove_an_diffraction_spike_column(usnob_fits* usnob) { return fitstable_remove_column(usnob, "AN_DIFFRACTION_SPIKE"); } usnob_entry* usnob_fits_read_entry(usnob_fits* cat) { return (usnob_entry*)fitstable_next_struct(cat); } int usnob_fits_read_entries(usnob_fits* cat, int offset, int count, usnob_entry* entries) { return fitstable_read_structs(cat, entries, sizeof(usnob_entry), offset, count); } int usnob_fits_write_entry(usnob_fits* cat, usnob_entry* entry) { entry->flags = (entry->diffraction_spike ? (1 << 7) : 0) | (entry->motion_catalog ? (1 << 6) : 0) | (entry->ys4 ? (1 << 5) : 0); return fitstable_write_struct(cat, entry); } int usnob_fits_count_entries(usnob_fits* cat) { return fitstable_nrows(cat); } int usnob_fits_close(usnob_fits* usnob) { return fitstable_close(usnob); } usnob_fits* usnob_fits_open(char* fn) { usnob_fits* cat = NULL; cat = fitstable_open(fn); if (!cat) return NULL; add_columns(cat, FALSE); fitstable_use_buffered_reading(cat, sizeof(usnob_entry), 1000); cat->postprocess_read_structs = postprocess_read_structs; if (fitstable_read_extension(cat, 1)) { fprintf(stderr, "usnob-fits: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(cat, stderr); fprintf(stderr, "\n"); usnob_fits_close(cat); return NULL; } return cat; } usnob_fits* usnob_fits_open_for_writing(char* fn) { usnob_fits* cat; qfits_header* hdr; cat = fitstable_open_for_writing(fn); if (!cat) return NULL; add_columns(cat, TRUE); hdr = fitstable_get_primary_header(cat); qfits_header_add(hdr, "USNOB", "T", "This is a USNO-B 1.0 catalog.", NULL); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_USNOB, "Astrometry.net file type", NULL); return cat; } int usnob_fits_write_headers(usnob_fits* cat) { if (fitstable_write_primary_header(cat)) return -1; return fitstable_write_header(cat); } int usnob_fits_fix_headers(usnob_fits* cat) { if (fitstable_fix_primary_header(cat)) return -1; return fitstable_fix_header(cat); } qfits_header* usnob_fits_get_header(usnob_fits* usnob) { return fitstable_get_primary_header(usnob); } astrometry.net-0.67/catalogs/usnob-scamp-catalog.c000644 000765 000024 00000013250 12651445460 022367 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include "os-features.h" #include "scamp-catalog.h" #include "usnob-fits.h" //#include "healpix-utils.h" #include "healpix.h" #include "starutil.h" #include "errors.h" #include "log.h" const char* OPTIONS = "hu:o:A:D:r:n:RBNv"; void print_help(char* progname) { printf("Usage: %s\n" " -u : eg /path/to/usnob/usnob_hp%%03i.fits\n" " -n : Nside of USNOB healpixelization.\n" " -o : output filename\n" " -A \n" " -D \n" " -r \n" " [-R] : use Red mags\n" " [-B] : use Blue mags\n" " [-N] : use Infrared mags\n" " [-v]: verbose\n" "\n", progname); } int main(int argc, char** args) { int c; char* usnobpath = NULL; char* scampref = NULL; double ra = 0.0; double dec = 0.0; double radius = 0.0; double xyz[3]; double range; int healpixes[9]; int nhp; int nside; int i; scamp_cat_t* scamp; anbool red, blue, infrared; int loglvl = LOG_MSG; red = blue = infrared = FALSE; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'u': usnobpath = optarg; break; case 'n': nside = atoi(optarg); break; case 'o': scampref = optarg; break; case 'A': ra = atora(optarg); break; case 'D': dec = atodec(optarg); break; case 'r': radius = atof(optarg); break; case 'R': red = TRUE; break; case 'B': blue = TRUE; break; case 'N': infrared = TRUE; break; case 'v': loglvl++; break; } } log_init(loglvl); if (ra == HUGE_VAL || dec == HUGE_VAL || !usnobpath || !scampref || radius == 0.0 || !nside) { print_help(args[0]); printf("\n\nNeed RA, Dec, USNOB path, Nside, Scamp output file, and radius.\n"); exit(-1); } if ((red ? 1:0) + (blue ? 1:0) + (infrared ? 1:0) != 1) { print_help(args[0]); printf("Must select exactly one of Red, Blue and Infrared (-R, -B, -N)\n"); exit(-1); } logverb("(RA,Dec) center (%g, %g) degrees\n", ra, dec); logverb("Search radius %g arcmin\n", radius); scamp = scamp_catalog_open_for_writing(scampref, TRUE); if (!scamp || scamp_catalog_write_field_header(scamp, NULL)) { ERROR("Failed to open SCAMP reference catalog for writing: \"%s\"", scampref); exit(-1); } radecdeg2xyzarr(ra, dec, xyz); range = arcmin2dist(radius); nhp = healpix_get_neighbours_within_range(xyz, range, healpixes, nside); logverb("Found %i healpixes within range.\n", nhp); for (i=0; ira, entry->dec) > range*range) { noutofrange++; continue; } if (entry->diffraction_spike) { nspikes++; continue; } if (entry->an_diffraction_spike) { nanspikes++; continue; } if ((red && usnob_get_red_mag (entry, &mag)) || (blue && usnob_get_blue_mag (entry, &mag)) || (infrared && usnob_get_infrared_mag(entry, &mag))) { nnomag++; continue; } ref.ra = entry->ra; ref.dec = entry->dec; ref.err_a = entry->sigma_ra; ref.err_b = entry->sigma_dec; ref.mag = mag; // from USNOB docs. ref.err_mag = 0.25; scamp_catalog_write_reference(scamp, &ref); nwritten++; } usnob_fits_close(usnob); logmsg("Read a total of %i USNOB entries.\n", N); logmsg("Rejected %i Tycho-2 stars.\n", ntycho); logmsg("Rejected %i stars that were out of range.\n", noutofrange); logmsg("Rejected %i diffraction spikes (marked by USNOB).\n", nspikes); logmsg("Rejected %i diffraction spikes (marked by Astrometry.net).\n", nanspikes); logmsg("Rejected %i stars that were missing magnitude measurements.\n", nnomag); logmsg("Wrote %i stars.\n", nwritten); } if (scamp_catalog_close(scamp)) { ERROR("Failed to close SCAMP reference catalog \"%s\"", scampref); exit(-1); } return 0; } astrometry.net-0.67/catalogs/usnob.c000644 000765 000024 00000021234 12651445460 017657 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include "usnob.h" #include "an-endian.h" int unsob_get_survey_epoch(int survey, int obsnum) { switch (survey) { case USNOB_SURVEY_POSS_I_O: case USNOB_SURVEY_POSS_I_E: return 1; case USNOB_SURVEY_POSS_II_J: case USNOB_SURVEY_POSS_II_F: case USNOB_SURVEY_POSS_II_N: case USNOB_SURVEY_SERC_J: //case USNOB_SURVEY_SERC_EJ: case USNOB_SURVEY_AAO_R: case USNOB_SURVEY_SERC_I: case USNOB_SURVEY_SERC_I_OR_POSS_II_N: return 2; case USNOB_SURVEY_ESO_R: //case USNOB_SURVEY_SERC_ER: { if (obsnum == 1) return 1; if (obsnum == 3) return 2; return -1; } default: return -1; } } unsigned char usnob_get_survey_band(int survey) { // from Tables 1 and 3 (esp footnote h) of the USNO-B paper. switch (survey) { case USNOB_SURVEY_POSS_I_O: return 'O'; // blue (350-500 mm) case USNOB_SURVEY_POSS_I_E: return 'E'; // red (620-670 mm) case USNOB_SURVEY_POSS_II_J: case USNOB_SURVEY_SERC_J: //case USNOB_SURVEY_SERC_EJ: return 'J'; // blue (385-540 mm) case USNOB_SURVEY_POSS_II_F: case USNOB_SURVEY_ESO_R: //case USNOB_SURVEY_SERC_ER: case USNOB_SURVEY_AAO_R: return 'F'; // red (590, 610 or 630-690 mm) case USNOB_SURVEY_POSS_II_N: case USNOB_SURVEY_SERC_I: case USNOB_SURVEY_SERC_I_OR_POSS_II_N: return 'N'; // infrared (715 or 730-900 mm) default: return '\0'; } } int usnob_get_blue_mag(usnob_entry* entry, float* mag) { float sum = 0.0; int n = 0; // Dumbass mag averaging. if (usnob_is_observation_valid(entry->obs + OBS_BLUE1)) { sum += entry->obs[OBS_BLUE1].mag; n++; } if (usnob_is_observation_valid(entry->obs + OBS_BLUE2)) { sum += entry->obs[OBS_BLUE2].mag; n++; } if (n == 0) return -1; *mag = sum / (double)n; return 0; } int usnob_get_red_mag(usnob_entry* entry, float* mag) { float sum = 0.0; int n = 0; // Dumbass mag averaging. if (usnob_is_observation_valid(entry->obs + OBS_RED1)) { sum += entry->obs[OBS_RED1].mag; n++; } if (usnob_is_observation_valid(entry->obs + OBS_RED2)) { sum += entry->obs[OBS_RED2].mag; n++; } if (n == 0) return -1; *mag = sum / (double)n; return 0; } int usnob_get_infrared_mag(usnob_entry* entry, float* mag) { if (usnob_is_observation_valid(entry->obs + OBS_N)) { *mag = entry->obs[OBS_N].mag; return 0; } return -1; } anbool usnob_is_usnob_star(usnob_entry* entry) { return (entry->ndetections >= 2); } anbool usnob_is_observation_valid(struct observation* obs) { return (obs->field > 0); } anbool usnob_is_band_blue(unsigned char band) { return (band == 'O' || band == 'J'); } anbool usnob_is_band_red(unsigned char band) { return (band == 'E' || band == 'F'); } anbool usnob_is_band_ir(unsigned char band) { return (band == 'N'); } anbool usnob_is_observation_blue(struct observation* obs) { return usnob_is_band_blue(usnob_get_survey_band(obs->survey)); } anbool usnob_is_observation_red(struct observation* obs) { return usnob_is_band_red(usnob_get_survey_band(obs->survey)); } anbool usnob_is_observation_ir(struct observation* obs) { return usnob_is_band_ir(usnob_get_survey_band(obs->survey)); } int usnob_get_slice(usnob_entry* entry) { return (entry->usnob_id >> 24) & 0xFF; } int usnob_get_index(usnob_entry* entry) { return (entry->usnob_id & 0x00ffffff); } int usnob_parse_entry(unsigned char* line, usnob_entry* usnob) { int obs; int A, S, P, i, j, M, R, Q, y, x, k, e, v, u; uint32_t ival; uint32_t* uline; uline = (uint32_t*)line; // bytes 0-3: uint, RA in units of 0.01 arcsec. ival = u32_letoh(uline[0]); if (ival > (100*60*60*360)) { fprintf(stderr, "USNOB: RA should be in [0, %u), but got %u.\n", 100*60*60*360, ival); assert(ival <= (100*60*60*360)); return -1; } usnob->ra = arcsec2deg(ival * 0.01); // bytes 4-7: uint, SPD (south polar distance) in units of 0.01 arcsec. ival = u32_letoh(uline[1]); assert(ival <= (100*60*60*180)); // DEC = south polar distance - 90 degrees usnob->dec = arcsec2deg(ival * 0.01) - 90.0; // bytes 8-11: uint, packed in base-10: // iPSSSSAAAA ival = u32_letoh(uline[2]); A = (ival % 10000); ival /= 10000; S = (ival % 10000); ival /= 10000; P = (ival % 10); ival /= 10; i = (ival % 10); // A: mu_RA, in units of 0.002 arcsec per year, offset by // -10 arcsec per year. // (rewrite in this form to avoid cancellation error for zero) usnob->pm_ra = 0.002 * (A - 5000); // -10.0 + (0.002 * A); // S: mu_SPD, in units of 0.002 arcsec per year, offset by // -10 arcsec per year. // This is a derivative of SPD which is equal to a derivative of DEC. usnob->pm_dec = 0.002 * (S - 5000); //-10.0 + (0.002 * S); // P: total mu probability, in units of 0.1. usnob->pm_prob = 0.1 * P; // i: motion catalog flag: 0=no, 1=yes. assert((i == 0) || (i == 1)); usnob->motion_catalog = i; // bytes 12-15: uint, packed in base-10: // jMRQyyyxxx ival = u32_letoh(uline[3]); x = (ival % 1000); ival /= 1000; y = (ival % 1000); ival /= 1000; Q = (ival % 10); ival /= 10; R = (ival % 10); ival /= 10; M = (ival % 10); ival /= 10; j = (ival % 10); // x: sigma_mu_RA, in units of 0.001 arcsec per year. usnob->sigma_pm_ra = 0.001 * x; // y: sigma_mu_SPD, in units of 0.001 arcsec per year. // Again, a derivative of SPD = derivate of DEC. usnob->sigma_pm_dec = 0.001 * y; // Q: sigma_RA_fit, in units of 0.1 arcsec. usnob->sigma_ra_fit = arcsec2deg(0.1 * Q); // R: sigma_SPD_fit, in units of 0.1 arcsec. usnob->sigma_dec_fit = arcsec2deg(0.1 * R); // M: number of detections; in [2, 5] for USNOB stars, // 1 for rejected USNOB stars, // 0 for Tycho-2 stars. usnob->ndetections = M; // j: diffraction spike flag: 0=no, 1=yes. assert((j == 0) || (j == 1)); usnob->diffraction_spike = j; // bytes 16-19: uint, packed in base-10: // keeevvvuuu ival = u32_letoh(uline[4]); u = (ival % 1000); ival /= 1000; v = (ival % 1000); ival /= 1000; e = (ival % 1000); ival /= 1000; k = (ival % 10); // u: sigma_RA, in units of 0.001 arcsec. usnob->sigma_ra = arcsec2deg(0.001 * u); // v: sigma_SPD, in units of 0.001 arcsec. // Again, equal to sigma_DEC. usnob->sigma_dec = arcsec2deg(0.001 * v); // e: mean epoch, in 0.1 yr, offset by -1950. usnob->epoch = 1950.0 + 0.1 * e; // k: YS4.0 correlation flag: 0=no, 1=yes. // (if M==0, it's a Tycho star and this has a different meaning) assert((M == 0) || (k == 0) || (k == 1)); usnob->ys4 = (k == 1) ? 1 : 0; for (obs=0; obs<5; obs++) { int G, S, F, m, C, r, R; // bytes 20-23, 24-27, ...: uint, packed in base-10: // GGSFFFmmmm ival = u32_letoh(uline[5 + obs]); m = (ival % 10000); ival /= 10000; F = (ival % 1000); ival /= 1000; S = (ival % 10); ival /= 10; G = (ival % 100); // m: magnitude, in units of 0.01 mag. usnob->obs[obs].mag = 0.01 * m; // F: field number in the original survey; 1-937. if (M >= 2) assert(F <= 937); usnob->obs[obs].field = F; // S: survey number of original survey. usnob->obs[obs].survey = S; // G: star-galaxy estimate. 0=galaxy, 11=star. if (M >= 2) { // Hmm, this is triggered by USNOB10/033/b0337.cat // byte offset 10282000, observation 2, and MANY others. /* assert(G <= 11 || G == 19); if ((G > 11) && (G != 19)) { fprintf(stderr, "USNOB: star/galaxy estimate should be in {[0, 11], 19}, but found %u.\n", G); } */ } usnob->obs[obs].star_galaxy = G; // bytes 40-43, 44-47, ...: uint, packed in base-10: // CrrrrRRRR ival = u32_letoh(uline[10 + obs]); R = (ival % 10000); ival /= 10000; r = (ival % 10000); ival /= 10000; C = (ival % 10); if (M >= 2 && F == 0) { // empty observation. usnob->obs[obs].xi_resid = 0.0; usnob->obs[obs].eta_resid = 0.0; } else { // R: xi residual, in units of 0.01 arcsec, offset by -50 arcsec. usnob->obs[obs].xi_resid = arcsec2deg(0.01 * (R - 5000)); // (-50.0 + 0.01 * R); // r: eta residual, in units of 0.01 arcesc, offset by -50. usnob->obs[obs].eta_resid = arcsec2deg(0.01 * (r - 5000)); // (-50.0 + 0.01 * r); } // C: source of photometric calibration. usnob->obs[obs].calibration = C; // bytes 60-63, 64-67, ...: uint // index into PMM scan file. ival = u32_letoh(uline[15 + obs]); assert(ival <= 9999999); usnob->obs[obs].pmmscan = ival; } return 0; } astrometry.net-0.67/catalogs/usnobtofits.c000644 000765 000024 00000013564 12651445460 021117 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include #include #include "usnob.h" #include "anqfits.h" #include "healpix.h" #include "starutil.h" #include "usnob-fits.h" #include "fitsioutils.h" #include "boilerplate.h" #define OPTIONS "ho:N:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s -o [eg, usnob10_%%03i.fits]\n" " [-N ] (default = 8)\n" " [ ...]\n" "\n" "The output-filename-template should contain a \"printf\" sequence like \"%%03i\";\n" "we use \"sprintf(filename, output-filename-template, healpix)\" to determine the filename\n" "to be used for each healpix.\n\n" "\nNOTE: WE ASSUME THE USNO-B1.0 FILES ARE GIVEN ON THE COMMAND LINE IN ORDER: 000/b0000.cat, 000/b0001.cat, etc.\n\n\n", progname); } int main(int argc, char** args) { char* outfn = NULL; int c; int startoptind; int nrecords, nobs, nfiles; int Nside = 8; usnob_fits** usnobs; int i, HP; int slicecounts[180]; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'o': outfn = optarg; break; } } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } if (Nside < 1) { fprintf(stderr, "Nside must be >= 1.\n"); print_help(args[0]); exit(-1); } HP = 12 * Nside * Nside; printf("Nside = %i, using %i healpixes.\n", Nside, HP); { struct rlimit lim; getrlimit(RLIMIT_NOFILE, &lim); printf("Maximum number of files that can be opened: %li soft, %li hard\n", (long int)lim.rlim_cur, (long int)lim.rlim_max); if (lim.rlim_cur < HP) { printf("\n\nWARNING: This process is likely to fail - probably after working for many hours!\n\n\n"); sleep(5); } } usnobs = calloc(HP, sizeof(usnob_fits*)); memset(slicecounts, 0, 180 * sizeof(uint)); nrecords = 0; nobs = 0; nfiles = 0; printf("Reading USNO files... "); fflush(stdout); startoptind = optind; for (; optind000454+46430?X&@9 000506+25180?@DpN000512+40360?B\(@A]L;*000512+35050?i6@C>?000518+39270?Q@4ieC 000518+20080@O@@000524+32480@:G{@#o000530+09260@W =p@;ܺv000536+26440@]@;. 000536+27150@}p =@#Eg000536+07300@ =q@$i>>000554+09560@@2)4000554+17520@E,_ƿeC 000606-01000@j@BP?/000606+37100@~K~@s33333000612+04200@=p @/N000612+15320@~K@@n]L;*000612+33100@,_@7Gz000618+23330@UUUUU@5ۗS000630+21210@$~K@;000624+27270@ @t@G s000654+47050@%Y@HP?/000700+47510@ =p@@000654+33030@g@t @H 000706+49340@@ L;*000824+29470@y,_@< +?000936-00400@P6i@;\)000936+27380@L@(wwwww000936+11460@,_@6Rj|000942+22030@Gz@?,`000942+30470@ E,_@g001006+05140@ t @@6 ` a001012+21460@ 6i@@/b001012+33060@ Gz@64001018+21500@ Ӡm:@Cn]L;*001024+38580@ Ӡm:@>=p 001024+30390@ @,q001024+14080@ 5\(@2N001030+18140@ m:@1zH001042+16450@ =p @<^o001048+28060@ X&@1|rb001048+17130@ i6j@HY001100+48250@ DDDDD@H` `001106+47530@ %X@>1u0001106+29550@ \)@HDDDDD001118+47530@ X&@>u0001118+30370@ i6@ ` a001118+03260@ ,_@H ` a001124+47580@ zH@)5y001124+12420@ l_,@<Q001136+28160@ @H,`001142+47580@ fffff@_,`001348+30060@@BYj|001400+35550@b/?,_001400+01200@/b@M4Vy001412+06470@@=>001412+29200@Ȉ?戈001412+00260@:Ӡm@(4Vx001412+12040@X&@;+5X&001442+29560@R,_@h5z001442+06270@eQ@2X&001448+17470@nNNO001454-01140@Gz@:BX%001454+25590@,_@>4h5z001500+29560@X%@8#E001500+24230@N@&W001506+11100@_,?ll001518+00030@@=x?.001524+29110@%X@8001518+24170@NN@>X%001542+29480@O\(@3dIJ001542+19060@fӠm:@H][[001542+48270@`m:Ӡ@>Vx001548+29490@d~K@>6i001548+29470@r,_@H}'}001548+49430@kQ@2m:001548+18140@y,_@> aP@001554+29460@X%@> ,_001600+29450@%X@S숈001600+79260@/c@H+>001812+21150@@5ݧ@t001818+21360@ @6001824+22180@N@:W$i001830+26140@#i6@;6W001830+26570@.@6[Q001836+22050@4 @t@=UUUUU001836+29220@8%Y@>yb/001836+30110@DDDDDD@>~K001842+30140@J@7SʆB001842+22500@`@6o%X001848+22090@o\(@=5yG001848+29210@m@t@6 ܺ001848+22140@zt @@6]L;*001854+22180@|(\@6001854+22180@R@C $h001854+37490@\(@6HY001854+22180@ۻ@6ffffff001912+22080@Q@H001918+48510@O@6hvT2001924+22080@\(@7dۗ001924+23280@DDDDDD@>?II001942+29580@:Ӡm:@$$h001948+10130@q@=001948+29130@b\(ÿۗSʆ001948-01340@@=Q001954+29280@/c@=𑢳002012+29400@UUUUU@8& +<002012+23530@zG@ۗSʆ002018+06420@N@EQ002018+06330@.O@;n 002036+27100@6i7@= 002036+29330@J=p @8DDDDD002042+24400@:Ӡm@>%X002106+30170@t AOO002100-00470@Ӡm:@:l002112+26400@ͧ@t@-^&7I002112+14240@DDDDD@ u0d002236+29460@GzH@)č&002248+12370@@m:Ӡb/002236-01230@qR@H>ܺvT002242+48130@%X@FF002248+45390@zG{@4<002248+19560@@8ϤO002254+24330@%X@=6Au1002318+28560@K~@9002324+25270@*@)#Eh002336+12310@+X%@+NʆA002336+13220@>K~@5Φ 002336+21320@p =q@ ܺv002354+06010@N@H#Eg002412+48500@6i@?ra002412+31250@Q>>002430-02030@ _,@'+~K002430+11180@D~K@Cp =002436+39310@/\(?Vx002436+01030@=i6@4j|002442+19470@I6j@8+` `002436+23540@^Q@CEg002436+39310@EQ녿zGz002442-02030@m:Ӡ7HY002454-01470@ =p@!#Eg002500+08360@zG2˩002518-01280@(\@ aP@002518+03120@%X +p =002542+30320@H\)@?2-.002542+30550@Zt @@;^N002542+27070@]i6@ i6002548+03070@q~K@&002554+04440@,_@@-.002554+33000@%X@0[[002554+02220@zG@?'HY002554+30530@b0@FW002600+43460@ @t@> 002606+30250@zG@'HYj002612+11220@t @@<n]L;002612+28400@ͧ@t@ p =q002612+03090@/b@yF002618+02330@K~@? ` 002630+30430@"\(@}'}'002636+02320@@m:Ӡ@>>002642+02350@kX%@>#Eg002648+30170@N@'3 002706+11200@~K@> dۗ002706+29470@N@5yj|002700+21120@ =p@?d~K002712+31070@,_@C)u0002724+38030@-:Ӡm@F002736+01490@N@SʆB002748+06410@zt @@qq002754+05360@Q@*raQ002800+13050@~K@$j002830+09550@i6@89002824+04540@N@Pn]L;002824+04490@KQ@<]L;*002836+28430@Wwwwwv@>G{002842+30310@J@HY002848+04550@P =q@ ʆA002842+08120@e,_@ W$002848+08110@o\(@Ӡm:002854+05560@}p <@ &8002854+08070@ Ӡm:@?o002930+31240@ EUUUUU@7e0d 002954+23080@ ^Q@>6i003000+30280@ q@>i7003012+30220@ kQ@'y,_003018+11270@ ~K@HAGz003024+48140@ ,_@3yF003054+19400@ ̖/b@7eò003100+23080@ N@>,_003112+30270@ Q@>003112+06580@ =p @,_003124+06590@!#m:@15yF003142+05160@!4zG@(>>003148+12000@!wwwwww@?,_003218+31400@!@7QGz003230+23030@!@,yF003230+14050@!~K@=̨dۗ003236+29320@!ͧ@t@"?,`003300+08510@! =p@?ʆA003318+31360@!@t @!o003324+08270@"%Y@70d 003324+23410@"zG@)H5y003336+12220@"i7@Au003336+04220@",@F r003342+45240@"'@t @@sSʆ003342+32380@"?eC ܺ003336+01260@"`m:Ӡ@5?.003406+21170@"aN?. 003406+01350@"nK~@7 s003412+23430@"Q@9aP003424+25250@"@<Q003424+28340@"Gz@9~K003424+25250@"Ӡm:@A89003430+35380@"\)@9ò003430+25340@"%X@9?.003424+25250@"?4Vx003436+01400@"p =@=&Au1003442+28530@"_,?IJ003506+00000@"Q@$SʆB003506+10050@"ݧ@t@9 =p003506+25220@"/c@\)003512+05560@"Ӡm:@OP003518+04370@"~K@!EQ003524+08220@#=p @> @t003530+30370@#t @@Ӡm:003542+02270@#/%X@@Q4003542+32220@#1~K@=x\)003542+29120@#2\(@. @t003548+14460@#<(\@=˩e003548+29210@#>Q@=-.003548+29150@#5,_@ T2˪003554+02530@#9b/?m:Ӡ003554+01420@#DzG@7i6003554+23200@#;X%?II003600-00080@#?%X?]L;*003600+01250@#L_,@=r\(003554+29100@#eX&@@5C ܻ003606+32080@#l_,@?)u0d003800+29530@$K?ll003800+01250@$Pt A,_-003806-00350@$~K@?Sʆ003818+31270@$UUUUU@0xN003836+16120@$޿t @t003854-01590@$@9b0003848+25130@$ǮzH@=ۗS003854+29150@$6i@=3>?003900+28550@$\(@B.zG003900+36050@$K~@@~ܺvT003912+32430@$@t Yj|003918-02000@%N@9?.003918+25180@% Ӡm:@Bg#Eg003924+36320@$Ӡm:eC 003918-02110@%m:Ӡ@@'003924+33080@%/%X@=DDDDD003942+29220@%/b0@=-.003942+29250@%!R?ʆA003948+00340@%Y,_@DnQ003954+40360@%^N@Dj|004000+41000@%M:Ӡmdۘ004006-02160@%NNvT2004006-01480@%f/b@=(\004006+29390@%r"""""@@G{004006+33150@%s33333@@JOO004012+32180@%tDDDDD@7?.004012+23140@%{Q@;@t A004018+26590@%Ӡm:@7X%004024+23140@%\(@IV 004036+50240@%G{@004054+02400@%Q +Au1004100+30190@%ٙ@7yI004100+23120@%_,@@m:Ӡm004106+32350@%Q?驇eC 004118+00330@%zH?#F004124+01350@&N@:4N004124+25550@&t A@>Y6j004124+30050@&G{@:?.004130+26350@&7@t @0HYk004154+16320@&F/b@!4zG004200+08220@&jG{@44V004218+19490@&k@4/b004218+19490@&g@t @~K004212+04530@& @t@t @t004230+05520@&뻻@H˩eC004300+49240@&m:@9C 004312+24590@&t @@98N004318+24560@'R@=&7004318+29410@' =q@H\(004324+49130@'),_@I =p004324+50570@' n]L;004330-01590@'X%@3}L;*004336+19130@'7 =p@>=i6004342+29580@'<(\@?W$004348+31320@'DDDDDD@B)4004348+36030@'I,_@=4004348+29270@'S =p@?SʆB004354+31270@'dDDDDD@;#Eg004406+27400@'wzH@@Vo004412+32240@'xN@8P?004418+24290@'@<Gz004424+27480@'~K@>Wwwwww004424+30040@'fffff@@X?.004424+32250@',_@7-.004430+22480@'Q@7 @t004436+22470@'zH@;>?004442+27330@'X%@Iq+004524+00570@(i6@ ~K004530+08030@(\(@<'}'004530+28200@( G{ @t004530-01490@(2/c@]004548+03500@(JӠm:@;5yG004554+27250@(?b0?@t 004554+01050@(B,_?5y004554+01050@(d~K@?OP004606+31420@(r,_@#oW$004618+09270@(N@<7~K004618+27570@(@t UUUUUV004654-02010@(ȿ%Y@7ra004654+23180@(~K@7wwwww004654+23180@((\@7X&004654+23180@(zG@7,_004654+23180@(/c@6 004700+22400@(X%?t @004706+00510@(/b@@#Q004706+32000@(@5?.004718+21260@),_@dۗ004730+07390@) (\@Ű[[004730+06550@) N:Ӡm:004736-02120@)Q@8\(004742+24150@)6Ӡm:@80d 004742+24150@)W =p@%3W$i004806+10200@)i@>*Ӡm:004806+29530@)Yb/ɿ004812-02090@):Ӡm@=004824+29150@),_@%}L;*004824+10280@)=p @( 5y004836+11450@)ə@=wwwww004854+29270@)ʪ@=f7H004854+29080@)6iп rb004900-01300@)t @@ߒ,`004906+07280@* ,_@Gx004912+47170@*p =@F*aP@004924+44040@)%X*004930-00440@*Ӡm:@=L;*004924+29240@*/c.004942-02280@*?b0@8Y4004948+24050@*;@- >>004948+14150@*C33333@:!q004948+25520@*TzG@Cb/004954+39370@*ZӠm:@>89005000+30220@*|/b@=Q005012+28450@*\)@=E0d 005042+29000@*_,@@=u0005048+32130@*@ò005054+05300@*G{@?kraQ005054+31090@*i6@0d005054+02300@*t @@)b/c005100+12250@*,_@8Ş&7005112+24300@*m:Ӡ?W$h005124+00430@+ @>XdۗS005124+30050@+0t A@?=p 005142+31240@+X@<¡n]005200+28300@+X%Y@8ަ 005200+24360@+[N@5ò005200+21150@+dDDDDD@?]@t005206+31050@+c =p@G~K005448+30000@,/b@Eg005448+43310@,=p @Ej|005454+43250@,,_@@i6005500+33050@,t @ڿAu0005506-01380@,b/@."/c005500+14480@,Q@>Z+&005518+30260@- ~K@>l5y005518+30090@-3i6@HT~K005530+48230@-1N@B]-005542+36280@-0 =q@:ݕ s005542+26360@-TzG@I\(005542+49460@-:=p @7t @005548+23160@-6/b@'F005548+11180@->Q@',rb005554+11200@-]@t@' s005606+11330@-`@)%X005606+12290@-h%Y@r˩005612+06500@-mi6@)˩005612+12430@-hN?005618+00200@-R@7OO005618+23350@-N@?M^o005648+31310@-:Ӡm@AǮzH005648+35180@-Ա~K@=Vfffff005654+29040@-33333@2~K005700+18350@-ՋX&@.b/005700+15040@-Ӡm:?SʆA005712+00400@-N@?Ӳn005706+31330@-b/@2˩005706+17450@.,_@A r005724+35010@.N@2HvT2005730+18010@.;X%@G\(005736+47430@..N@3 ` a005742+19340@.EUUUUV@>l005748+30320@.M@t@>N005754+30240@.T~K@>˩e005754+29510@.vi6@GII005800+47250@.P =p--005806-01580@.m:@=I005818+29200@.Gz@*O005818+13120@. @u@0_,005824+16250@.Q@>!ll005824+29520@.@>'@t 005830+29530@. =p?raP005842+00350@.:Ӡn@?R005836+31150@.\(@? aP@005842+30470@.Ӡm9@8ܺvT005900+23470@.m:Ӡ@>%UUUUU005906+29530@.Nu0005930-02110@/\(@@9P?005924+32110@/ =p@@4OP005924+32090@/AQ@A#N005948+34000@/4zGSʆA010000-02120@/fӠm: r010024-01430@/Ӡm:@1$h5010024+17290@/ =q@SʆA010030+06340@/,_@6WzH010036+22050@/Ӡm:@,W$i010036+13470@/Q@@]L;*010042+31580@0~K@D뻻010112+41350@/Q@59010112+20580@0 @t@2FX010136+18260@0R333333010148-01190@0"""""x#010148-01010@07 =p@E ܺ010200+41570@0+Q[[010212-01030@08 =q@010218+04300@0B"""""@,_010224+01530@0dN@?#010248+31420@0rt @@A~ 010300+34440@0lN@-w~K010300+14290@0@t @Rj|010300+75200@0{@\qq010318+03490@0=p @?gó010324+31080@0@9:Ӡm010324+25170@0=p @@⡐n]010336+33300@0@ vT2010348+03190@0,_@!Gz010348+06010@0i6@-$h5z010342+14190@0,_010406-02270@0,_@% |010400+10160@0@t @"bj|010400+08550@0~K@F$qq010400+44010@0N? ܺv010424+01410@0/b@@e\(010418+32320@0п%Y@@BvT2010430+32150@0Ҫ@@=u0010430+32130@0zG@%;*010436+10350@06i~K010442-00530@0@t @+\)010430+13420@0~K@@#010436+32480@0ٙ@@3n010442+32080@0ڪ@@4010442+32090@0ڪ@@%yF010442+32010@0Q@@(8010442+32030@0~K@0W$010442+16250@0/c@C33333010442+39080@0b/@@.T2010448+32050@0N?m:Ӡ010454+00400@0wwwwx@@x6i010448+32400@0=p @vò010500+01550@0X%@@'O010500+32020@0X%@0w}'}010512+16110@0Q@@Q010512+33020@0񙙙?[[010518+00480@1i6@@I010518+33110@0@]010524+02170@1_,@5ܺvT010518+20500@1\)@@010536+32520@1 @&8010542+01560@1@@aP010542+32530@1 @Cܺv010542+39260@1'wwwwx@Ct @010548+39230@1"""""@ }'}(010548+08040@1$N@0fffff010554+16370@1'\(?DDDDDD010606+01230@1(@&7H010606+02000@17b0@@ ò010606+31500@19Gz@@AP?010606+32150@1?%X@@Q,_010612+32220@1AN? rb010630+01070@1Nffffg@?010630+31420@1O =p@@`?.010630+32290@1N@@` `010630+31530@1Ui6@@OP010636+33130@1]i6@A$h010642+35270@1Wwwwww@,7HZ010642+14050@1SN@010648+01570@1[@0 +010648+16410@1_b0@3^o010648+19350@1Wb0#Eg010654-01570@1^Q@,j|010648+14060@1mUUUUU@@9q010700+32100@1p6i@?#W$i010700+30510@1\(@@/qr010712+32050@1@@tN010712+32380@133334@E4Vy010718+42500@1}p =/b010724-02010@1Gz?T2˪010730+00090@1@@1010736+32070@1Ӡm:@>/%X010736+29550@1 =p@E 010736+43010@1b0@ '}'}010748+03150@1@@--010748+32510@1b/?Ӡm:010800+01250@1\(@@n]L;*010754+33180@1zH@@KX%010806+32190@1\)@8ug010806+24110@1Ӡm:@@i6010812+32530@1_,qq010818-02010@1UUUUU@@[010818+33350@1 @t@@Y6j010824+32260@1G{@@O010830+32500@1t @@?p =010830+31280@1,_@!5y010830+08300@1ӻ@?|010830+31370@1֝i6@;010836+27390@1K@H010842+48510@1Gz@77@t 010848+22570@1@@^o010848+33060@1N?=p >010854+01230@1fffff@A` `010854+35000@1\)?$h5z010900+01040@1NEg010912-00550@1Ӡm:--010918-00530@2 =p @@.010918+31520@2 N@@vT2010924+31450@2 Ӡm:@(|#Eh010930+12000@2%X@@>010936+33070@2 GzFW010936-00400@2 =q@0HY010942+16150@2:Ӡn@/010948+15290@2)@C@ ` 010948+38140@2"G{@0?011054+32580@2l~K忺aP?011106-00210@2vffffg@*~K011112+13000@2N@@+?ے,_011224+00100@26i?W$h011224+01250@2̱~K@>1R011224+29560@2 @t@#Eg011230+05060@2ӻ@<@t 011236+28130@2Ԗ/b@<}^o011236+28130@2ѴN[[011248-01530@2߮zG@4 +Yb/011318+30050@3~K@G^ll011324+46290@2X%@ò011324+04550@3,_@G_.011318+46290@3 p =@@N011324+32480@3 @4SʆB011324+19450@3~K@?#011330+30460@3 =p@,5y011330+04020@3 p =@91011324+24550@3?&7011330+01180@3(\@Cll011336+38470@3#i6@<011348+28430@3.i6@0fT2011406+16080@3?%X@* dۗ011418+12450@3jX%@E[011442+43220@3_@t @-gzH011448+14260@3,_@C8 ` 011518+38110@3~K@&i6011530+11070@3/b@? 011554+30470@3zG011606-00300@3\)@-qq011606+14450@3~K#Eg011612-01100@3zG@0Si6011618+16030@3R@[$h011630+04040@3,_ +?011618+32470@3=p @5Eg011630+21290@3,_@ g011636+03020@3N@OO011642+04190@36j@(OP011642+12110@3=p @(rb011642+12120@3~K@-o011648+14360@3Q@ Yj011654+02580@3\(@2qN011654+18100@3zH@ XQ011700+07550@3m:@@bFX011700+32310@3,_@@;011706+32120@3%X@$UyF011706+09540@3b0@ GzH011712+03080@3,_@0raQ011712+16170@3Q@5a~K011712+21060@3,_@-}'}(011718+14310@4G{@,,_011724+14060@4 ,_@@Yj011724+33150@4 \)@I}'}(011724+49530@4%X@ R}'}(011730+03090@4Q?m:Ӡ011736-00110@433333@5|011736+21130@4zG@C>?011742+37540@4:Ӡm@0Q011736+15450@4i6@@Z,_011742+32270@4m:ӠՂ-.011742-00360@4#i6@=F011748+29220@4(%X@=aP011754+29260@4*@>d~K011754+30080@4"=p @^o011754+07050@41~K@@@t011800+32480@48 =p@@o011800+33100@4<~K@A~Au1011806+34440@4Ab/@D9,_011812+40120@4?~K@AۗS011812+34000@44@'I011812+11380@40\)?Q011812+01100@41Gz?011812+01020@4H%X@ElOP011812+42350@4C33333@@aP011812+33380@4I6j@D<2˪011812+40120@4E,_@@n]L;011818+33080@49@4IJ011818+04320@4GzH@@eC!011818+32580@4Rt @@BW~K011824+36250@4B,_@>F011824+05180@4U@t @D>>011824+40130@4R@@89011824+32500@4H? +@ʆA011848+06450@4\ @t@ #Eg011854+03220@4f/b@2e r011854+18070@4gwwwww@4raQ011848+20390@4{Q@IzG011854+49470@4owwwwx@@. 011854+33150@4lN@2Yj|011900+18180@4vQ@@l011900+33020@4r/c@1zH011906+17200@4|DDDDD@@\(011906+33160@4u:Ӡn@2DzG011906+18000@4r\(@'q5yG011906+11280@4N@B` `011912+37090@4qR@qr011912+05000@4y~K@"i6j011912+08560@4~/b@/ =p011918+15310@4@@m:011918+31580@4zG@@P?/011924+33000@4@AU@t011924+34250@4b0OP011924-01180@4Ӡm:?HYj011936+00410@4N@|011936+05090@4%X@C~K011942+38570@4_,@"Sʆ011948+08470@4@A7ó011948+34110@4b/ʿFW011948-01080@4,_@:011954+26360@4 =p@@ra012000+33420@4/b?@t A012000+01370@4R@Cd012000+39000@4Ӡm:@rb012006+05080@4@ ϤO012006+03200@4~K@@Au1012006+32550@4@@Vx012006+33130@4=p @<,_012006+28350@4"""""FW012012-01390@4i6@C4012018+38490@4N@",_012012+08470@4N@"4Vx012018+09120@4_,@@ 012024+33170@4zG@@-.012024+33130@4zG@@Q012030+33020@4~K@@eC 012036+33110@4:ӠmAu1012036-00540@4\(@@+Yj012042+30320@4zG@/012042+07320@4,_@.m˩eC012042+14570@4"""""ܺvT012042-01100@4ٴN@"F012042+09100@4m:ӡ@AH8012048+34190@4֝i6n]L012048-02140@4@@P =q012048+32230@4,_@@ ` 012048+33000@4N@@$h012048+33020@4DDDDD?K~K012054+01260@4%X@&N012048+11020@4~L@@qr012100+32480@4N@@'012100+32540@4i6HYj012106-02050@4O@@N012112+33040@4zH@@M^o012112+33390@5~K@@ܺvT012112+33360@5 ~K@<*012118+28210@5(\@)\(012124+12390@5 =q@#t @012124+09180@5 ,_@#qq012130+09400@5@t @@dۗ012130+31580@5Nòn012136-02070@5/b@@T2012142+33330@5G|@"eC 012136+09040@5̿5yF012148-02000@5(m:ӡ@@ 012148+33130@5)@@qq012148+33130@5%i6@5;*012148+20500@5$zG@0eC 012154+16170@5.Q@@#Eg012154+33110@5i6?88012154+00520@5NC ܺ012154-01540@50@@:Ӡm012154+31550@5%p >@j|012200+07280@5$/b@]L;*012206+03330@5$ @t? 012200+01280@55i6@@ ` a012200+31590@5&@Zt @012200+01460@50\)@#'}'012206+09440@5,zGffffff012206-01500@52/c@# 012206+09170@52/c?Q012212+01200@54DDDDD?Q012212+00390@58@#hN012212+09260@57b0#Eg012218-01520@59Gzi6012218-01450@5B,_@/,_012218+15350@5P =q@A-,_012224+34060@5C~K?qq012230+00100@5T@A@@$h012324+33090@533333@&-.012324+11110@5 =p׿p =p012324-01350@5 =q4012330-01360@5(\@A`012330+34300@5i6012330-01290@5\(@AZӠm:012336+34270@56i@H2X%012336+48080@5\)@AVo012342+34250@5 =p@?˩eC012342+31220@5,_@vT2012342+06010@5,_88012348-01540@5@1Cn012400+17000@5p >@COO012406+38450@5p >@--012406+01450@5fffff>>012406-01340@5Ӡm:@36 +<012412+18570@5i65yF012412-01140@5 =p@/T2012418+15430@5Q쿏II012418-00160@5@2>>012424+18200@5""""#@-:Ӡm012430+14310@5N@"012436+02000@5zG@%<#Eh012430+10220@5Gz[[012442-01310@5Gz4012442-02140@5p >@?F012448+31180@5 @t@Hh8012448+48330@5N@BeC 012448+36550@56i@E 012454+42540@5,_@3-˩eC012448+18550@5@-89012448+14350@5~K$h012454-02100@5K~zG012500-01210@6fffff@Hò012500+48590@5޿K~@3 =q012618+19180@66@4Vx012612+02100@6L~K@C%X012618+39180@6M:Ӡm@Ci7012618+39100@6NzG@@yF012618+33250@6>N_,`012624-01120@6?,`raQ012624-00490@6KQ@3fffff012624+19260@6GzH@&Ci6012630+10530@6r""""#@F̱~K012648+45210@6p =q@0'}'012706+16400@6@D|~K012706+40430@6{ =p@@@$h5012706+32150@6nܺvT2012712-01300@6N@F#Eg012712+45220@6@9'}'012718+25360@6@3+4V012724+18550@6Gz@4eC 012730+20200@6:Ӡm@1yF012736+16460@6%Y@3HvT2012736+19020@6zG@P?.012742+02090@6Gz@DVF012754+40250@6@34V012748+19210@6/b@Dd012754+41000@6@5pn]L;012806+21110@6@4l012800+19510@6i6>>012806-02150@6/c@106i012812+16560@6@|012812+02200@6zG@,7$h012818+13500@633333@#Ӡm:012836+09410@6i6Yj|012836-01450@6Q@Ad2˪012842+34320@6_,@,zG012848+14010@6%X@H012848+48520@6Ӡm:@C[4V012854+38270@6N@@ll012854+33220@6(]@28012906+18200@6,_@@OP012906+33140@6NۗSʆ012906-01110@6Ӡm:@1 ` 012906+17190@7@@$h5012912+32550@7t @@@}'}(012906+32580@7/b@@ò012912+32550@6O>012924-02280@7 ,_@@ '}'012918+31510@7K@@ r012918+31510@7%X&@H =p012930+49090@7Gz@5i+ó013100+30240@7l~K@ U +013112+03180@7@@p =013124+31480@7t @@Kp =013130+55100@7\(ÿ6i7013130-01200@7Ӡm:@@Qu0013130+32240@7m:Ӡra013136-01170@7Q@KraQ013130+55100@7\(@3u0013142+19340@7(\@AzG013200+33470@7\(@DHY013206+41000@7X&@5k[013206+21100@7,_@@/b013206+33400@7\(@A r013206+34480@7N@('zH013212+11500@7b/@? 6j013218+30470@7i6@@Zn]013218+32270@7љ@AI014042+30210@9ցN@'88014042+11390@9/b@<ò014048+28420@9Gz@,014624+12480@;Z=p @A|IJ014630+34440@;PN@4 ` a014630+20270@;[Q@AR014630+35120@;L_,@)ò014630+12360@;N@*(\014630+12480@;JG{@W$014630+05230@;Zt @@5\(014642+21450@;b""""!@@K|014642+32200@;Zt @@*#Eh014642+13070@;ni7@A&014648+35320@;_~K@)&014648+12150@;rt @@5#014700+21430@;q6j@'gqr014706+11270@;}\(@6 ܺ014712+21460@;xt A@ tIJ014718+03250@;N@'014718+11340@;:Ӡn@;2"""""014718+26570@;zG@;UUUUU014718+27240@;\(@*014724+01500@;@t [[014730-00590@;i6@{raQ014736+02030@;i6@B/wwwww014736+36070@;"""""@@ ` a014742+32480@;N@@6i014742+33230@=@U ܺ014700+86270@; =p@@Ӡm:014748+33300@;%X@Ah5z014748+35020@;\(@@}'}(014748+32500@;~J@A\(014754+35400@;R@@E,_014754+32180@;\)@zG014754+05540@;i7@B#N014754+36010@;zG@5}'}(014754+21300@;%Y@2M-014812+18030@;fffff@5II014812+21450@;,_@)j|014812+12180@;K~@@Oó014818+32230@;"""""@*HY014818+13030@;,_@5陙014818+21400@;(\@Ao.014824+34370@;%X@6Q014824+22200@;,_@@X%014830+32470@;ҏ\(@6[Sʆ014830+22060@;%X@Bm:Ӡ014830+35490@;㻻@@Yj014842+33150@;X%@@n014842+32580@;/b,_014842-01190@;K~X%014836-01400@;ޝi6@*Cra014842+12530@;zG@>b}'}(014854+30080@;i7@3t @014848+18510@;i6@>~K014900+30180@;wwwww@ Eg014854+08000@;G{@ F014900+08030@< m:@EuX&014906+42400@;\(@1 s014906+16480@< @Cd014912+39080@<@t @A&8014912+35100@;@/b0014912+06030@<Ӡm;@B~K014918+35470@<@t @A +014924+35330@</b@?014924+31170@<t @@A&7014930+35360@<%i6@B@N014942+36150@<(6i@B?.014942+35520@<*=p @B4Vy014948+35560@<@t@1Eg014942+17160@<,DDDDD@Bj|014948+35540@<0@BN +<014948+36220@<1b/@Bi6014954+35550@<6zG@B/b014954+35590@<9~K@BʆA015000+35480@<$_,?&8015000+01050@<=UUUUV@BA015000+36150@@Bdò015054+36320@i7@%X&015424+05480@=I@1Q015424+17320@=@ +?015454+36050@=tN@@?.015454+33080@=t~K@;ݧ@t015454+27370@=,_@BI015506+37200@=N@5Y4015524+21060@=~K@ 0d 015530+03080@=@FI4015530+44200@=@3eC 015524+18520@=\(@eC 015536+02500@=%X@~K015536+02500@=_,@4T2015536+20440@=@i6015536+01500@=X&@C[X%015536+38290@=N@9\(\015536+25070@=t @@BV]L;*015600+36260@=33333@8zG015600+24390@=KP?.015606-01420@=@ ~K015606+08060@=Q?5yF015606+00170@=UUUUV@B!+8015642+30400@=%Y@;oW$015648+27120@=i6@,ۗS015654+13460@=Q@BK015700+36210@="""""@7OP015706+23240@> DDDDD@C015712+37470@> @u@B:Ӡm015712+37210@>m:Ӡ@7015712+23220@=@t @X&015712+07100@>~K@?m4Vy015718+31100@>,_@@zH015718+31480@>~K@?P$h5015724+31030@>~K@8@ ` 015724+24000@> @)O˩e015730+12240@>_-@8y>>015724+24140@>\)@8IJ015736+24200@>,`@= 015736+29390@>Gz@5eC!015736+20520@>%X&@<94015742+27590@>K@0\(015748+16190@>"X%@5IeC 015748+21030@>=@G+ @t@[[015754+02250@>~K䱿P?.015754-01470@>:\(@C|015754+37580@>JӠm;@I@t A015754+50160@>?zG@Cdh5z015800+38330@>VO@K?.015800+55000@>FӠm:@?R015812+31380@>Ci6@7j|015812+23110@>?b0@.`t A015812+14560@>HQ@: +>@ II015818+08040@>UQ@@+R""""!@c~J@FvT2015824+44460@>E,_@SʆB015830+06170@>l_-@G34V015830+46100@>`%X@:{ZX%@/K~K015836+15240@>cX%@:{$h015842+26150@>j@?ӎ89015848+31350@>z=p @G*X%015842+46050@>VK}P?/015848-01330@>q~K@:X%015854+26180@>t_,@7n]L;015900+23270@>x@7'}'015906+23190@>o@t @ ۗS015906+08150@>vO@0Au0015906+16010@>~K@55y015912+20520@>b/@7vT2015918+23190@>,_@ =p015930+08120@> =p@@ 5yG015930+31500@>Q@/ldۗ015930+15280@>\(@#/b015936+09440@>\)@#˩e015936+09430@>/b5y015942-00220@>Q녿IJ015942-00200@>@t @2_015942+18080@>""""!@;33333015948+27200@>t @@0n015948+15470@>~K@1*G{015948+16550@>@&/015948+10510@>Ӡm:@FʆA015948+44470@>33334@;zG015954+27260@>33334@: 015954+26200@>@vT2020018+07170@>N@@ R020024+31500@>\(@C +<020024+37530@>ŋX%@6j020030+02220@>ՋX&@6 020036+21480@>/c@ ` 020036+05250@>ՋX&@2#Eg020036+18240@>/c@:N 020042+26040@>zG@EHYk020042+42460@>~K@C!#Eg020042+38010@>N@8W$i020048+23500@>뻻@:F +<020048+26020@>,_@$~K020100+04330@? N@G#Eh020054+47440@>%X@2KQ020100+18040@>Ӡm:@9#Eh020100+25410@>b0@0ó020100+15480@>wwwww@-j|020100+14280@>\(@3ó020106+19250@>i6@-zOO020106+14300@?=p @>0d 020106+30350@>X%@3*020112+19250@?b0@FW$i020112+45320@>@.-.020112+15040@?p >@85UUUUU020112+23580@?!R@FaP020124+45320@?&Ӡm:@GN020124+47420@?@<}'}020124+28250@?:Ӡl@K~K020130+02330@?,_@<˩e020136+28340@?"""""!@;:Ӡm020136+27410@?8%Z@@#$h020154+32020@?0@5o7HZ020200+21120@?;i6@<020200+28450@?.Q@!/b020206+08180@?6/b@&--020212+11110@?RX%@AdN020218+34340@?U@t @9[020230+24520@?\zG@?,#Eh020230+30560@?a~K@Au@t020230+34420@?N@#پF020236+09410@?c =p@Ap%Y020236+34400@?jX%@Ci6020236+39360@?q@F#Eg020254+44580@?P6i@k4V020236+05520@?^N@* ` 020242+13000@?""""#@F%Y020254+44580@?ni7@8;X%020254+24000@?gb0@x020300+06320@?_,@=|020312+29330@?UUUUV@=eC 020318+29440@?N@"wwwww020324+09030@?Q@#KeC!020336+09240@?:Ӡn@;Q020336+26480@?m:Ӡ@=88020336+29450@?~K@"tzG020336+08590@?Ҧ 020342-00320@?i7@FIn]L020342+44200@?6j@1020348+16460@?@ X&020354+03270@?@?(vT2020354+30550@?N@.rn]020354+14590@?t A@E{Sʆ020400+42440@?%Y@Aq#Eg020400+34400@?i7@-q020406+14290@?~L@BzG020418+36520@?Q@@yR020412+32440@?Q>>020418-00450@?b/@ B020424+07540@?33332@@yI020424+32440@?X&@FHY020430+45230@? =p@Fl'020442+44370@?m:@E` `020448+43210@?X%@13 =p020448+16580@?ށO@"V/b020448+08560@?/b@:Ӡm020454+01520@?:Ӡn020454-02200@?_,@Q020500+01520@?@qq020500+01560@?X%@2n]020506+01540@?i6@08?.020512+15590@@%Y@=A~K020512+29010@@ N@Dg020518+41150@? =p@W =p020518+01550@@?NN020530+01390@@t A@E\)020530+42460@@ N@%L;*020542+10450@@X%@=;$h020542+29000@@ ,_@-q020536+14440@@ UUUUV@,aP020536+14060@@@Cc|020542+38320@@\(@GۗS020542+46590@@ Ӡm:?|020548+00560@@Ӡm:@2˪020548+06100@@:Ӡn@KeC!020554+06050@@X%@: ,_020606+25480@@!UUUUU@;P?/020606+27180@@%~K@?]L;*020612+31460@@,DDDDD@FL;*020624+30300@@4/b@A ` a020642+35340@@1b/@5?II020648+21000@@2t @@bj|020654+05520@@=,_@Axm:Ӡ020700+34430@@?@t @A;*020700+35290@@=,_@=/c020700+29170@@EQ@CdۗS020706+38570@@Dt A@BZ4Vx020706+36280@@G~K@D¼#E020712+41170@@P =p@J%020712+52050@@>X%@0Q020712+15480@@<@%l020712+10440@@=@t @% 020718+10320@@I6j@CKX%020712+38210@@Gb0@9N020724+25260@@D~K@ r020724+07250@@KN@5b,_020736+21090@@T@DX%020736+41170@@Gm:@333333020736+05490@@E:Ӡmi6j020736-01380@@H =q@an]L020736+07360@@T/b@?VAu1020742+31060@@`@Bu0d020800+37350@@`%Y@B^o020800+37260@@T(\@zG{020800+05380@@^@@YeC 020800+32280@@_33334@?KraQ020800+31030@@e6j@C`\)020806+38310@@iGz@BO020818+37160@@g\(@9π020818+25350@@bfffff@020824+07260@@g@,=u0020830+13530@@dDDDDE@R020830+03380@@ci6 +021048+04310@@b0@1,_021054+16510@@~K@D?.021054+41390@@G{@1b/021054+16510@@\)@?ܨdۗ021100+31380@@zG\(021100-00580@@Ė/b@A @t021106+35300@@ @t@h\)021106+03530@@R@;021112+27390@@K~@0t~K021118+16140@@/c@~K021124+04570@@/b@B2˪021130+37100@@ =p@?x021154+31150@@R@BJ021154+36200@@R興021200-01000@@N@>SʆB021206+30330@@i6@@/c021218+33320@@i6@2Qll021230+18050@@陙@2021230+17460@@zG@A[021236+35170@@Q@\(021248+05460@@N@A#Eh021248+35410@@,`@94 021254+24590@@UUUUV@@.021254+33350@@DDDDD?SʆB021300+01250@AӠm:@@S ܺ021312+32250@@%Y?N021318+01320@AN@>021700+28490@AuR_,_021712-00290@A6i@Deg021718+40340@A%X@ByF021718+37380@AN?Gz021724+01430@A@D~K021724+41200@A%X@?#Eg021730+31270@Am:@>K~021754+06350@A/c@CTۗS021754+38260@AQ@@kQ021800+32370@AzG@Ep$h5021812+42390@A\(@74021812+23220@AzG?6i021818+00200@A@t @C +@C@t021830+39080@A~K@9l_,021830+25110@AGz@@Eu0021836+32200@A~K@0ܺv021836+16200@AN@/ò021842+15310@A@,eò021848+13590@A%Y@@021848+32480@A@@˩021900+33030@A¸Q@@ܺv021906+33430@AӠm:@@zG021906+32000@Aп%X@G021918+47370@AˮzH@Cqr021918+38540@AƸQ@<l021918+28310@AЖ/b@E[[021924+42500@A6j@E,#Eh021924+42070@A~L@(\(021936+11490@Ap >@1@7022230+23360@B.i7@BT2022224+36570@B(%Y@8C 022224+24020@B6i7@DaP@022236+41450@B6,_@D|022236+41330@B4_-@B{raQ022236+36450@B7 =p@DK~022236+41330@B8t @@DdۗS022236+40550@B.G{@4e0d 022242+20100@B)Gz@Au1022248+04130@B8N@B[[022242+37000@B2Ӡm:@:K~022242+26310@B56j@8 =p022248+24450@B8DDDDD@;8022248+27000@B9p >@;>F022254+27010@B@DDDDD@CM^o022254+39150@BBQ@Ej|022254+41550@B; =p@2#Eg022306+18160@BA~K@>,_,022306+29570@BDN@?eC 022312+31410@BT@I\(022318+49500@BER@:88022318+25500@BF@;aP@022318+27230@BHN@:r˩022324+30130@BM@;022330+27260@BCQGzG022336-00330@BH@$ԟIJ022336+10110@BX~K@DW022336+41370@B\Q@D[[022342+41280@BO~K?n]L;022354+00560@BS~K@(O022354+11560@B^t @@A@t 022354+34580@B\\)@@ DDDDD022354+31520@BX\)@4II022400+20160@B\N@9dۗS022400+24480@Bi@@˩022418+33210@Bm@t@DzH022412+40500@Bp =q@Dqr022424+41470@BrN@D0d 022424+41450@BsQ@E\)022424+41470@Btm:ӡ@Bi6022436+35560@Bni6@8BFX022436+24020@BqUUUUV@9*022436+25260@Bu@;8022448+27000@Bvi7@:9j|022448+26000@BzO@?+>022524+19210@Bb/@:P022524+26050@B,_@3Q022524+19210@BzG@F;*022530+45450@Bb0@76 +<022524+23000@B,_?n]L;022536+00350@B\(022542-01340@B,`@$i6022542+10100@B/b@C^o022542+37570@B@4H#022542+20030@B~K?022548+00280@Bp =@H7@t 022548+48130@BӠm:ll022600-01220@B/b@C /b022554+37530@BN@9XN022600+25070@BUUUUU@FIJ022600+45420@B=p @C2Au022606+38100@B@E~K022618+42020@B,_?׻022624+00090@Bwwwww@70d 022618+22510@BzG@?x%Y022624+31150@B@?ۗS022624+31250@B =q@$ZvT2022642+09570@BzG@< 022648+28210@BӠm:@?tVx022648+31130@Bt A@9An]L022700+25020@BX%@<4Vx022700+28250@B~K@$e,_022706+09590@B =p@@d022712+32550@Bwwwwx@AF022718+35070@BӠm:?ܺvT2022724+00570@B,_@C.O022718+38090@B@7'@t 022724+22550@BԈ@E\(022730+42010@B,_@@W022736+31570@BѴN@>߷.022736+30400@Bp =@<4V022736+28310@BӠm:@B~K022748+36550@BDDDDD@9hQ022800+25110@BѴN#Eh022800-01200@Bm:@D1I022806+40100@Bm:@ESʆ022806+43150@BGz@=7H022812+29220@Bb/@Cn]L;022830+39100@B/b??.022836+01020@B@6W022848+22420@B?4022848+01070@CDDDDD@E=p 022900+43140@BNQ022906-00210@B @t@3'. 022906+18550@BN@zG{022900+02360@BX%@#x8022912+09310@C(\@7~K022912+23320@C N@Ell022912+41590@BK~?--022912+01020@C ,_@C2˪022918+39120@C @AII022918+35170@B,_?5yF022912+01020@Bb0?~K022924+00420@C,`@#p?.022930+09300@Cb0˩eC!022936-01350@C:Ӡm@<R022948+27510@C/b@5Q022948+20480@C\)@9~K023000+24530@C~K@4ۗS023000+20250@C\)? 023006+00240@C =p@3B˩023006+19020@CzG@5ò023012+21400@Cp >?Ь5y023006+00030@C+m:@C֦ 023012+39280@Cb0@4Vy023012+05290@C)Q@@_,`023018+32320@C)N@@ܺvT023018+33170@C ~K?aP@023024+00120@C)\(@6dN023030+22100@C5p >@DVx023030+41080@C&,_@#cn023030+09280@C6G{@DCeC!023036+40190@C733333@D Vx023036+39530@C-@4Eò023036+20030@C6Ӡm:@BUUUUU023036+37270@C4@@u0023036+32480@C,(\@#4 @t023036+09230@C)6j?Q023042+01060@C?33334@F,l023042+44080@C0/b@qq023054+06190@C2N@&8023054+05550@C0?023212+40430@Cl6i@D$'023218+40050@CmGz@DoII023218+40400@Cl @t@B88023218+37160@Ceb/@4I023218+20380@Co@Bt @023224+37180@CsX%@BѾF023230+37250@CnX%@3Q023236+19260@ClN@)5y023236+12360@CUUUUV@ENi7023254+42240@CX%@E5023254+42120@CzN@8uQ023300+24150@Cui6@ =p023300+06030@CvK~@4N023306+03500@CzG@ALۗS023306+34230@C| @t@)eC 023312+05500@C,_@7/b023318+23410@CӠm:@C{X%023318+38450@C/b@9l_,023324+25120@C~K@? 023324+31300@CzG?Gz023324+00120@C(\@@[89023324+32300@C,_@?Yj023330+31230@C6i@AM\(023336+34240@CN@'HYj023336+11260@C@+023342+13330@C@"j|023342+07190@CQ@Bo023348+35540@C\)@Bb0023348+37400@Ct @@@j|023348+33060@C/b?檪023348+00300@C(\? 023400+00540@Ci6@9qYj|023406+25140@C6i@eò023406+01500@C@5Gz023424+21210@CX%@EQb/023424+42250@C/b@4j=p 023430+20120@CzH@9u0d023436+07050@C@5F023436+20530@C@7L#Eh023436+23050@CGz@A7@t 023436+34140@Ct A@W$h023436+07130@C =p@5$Vx023442+20560@CN%X&023448-02020@C@D r023454+41350@C~K@AӠm:023454+34020@C?m:Ӡn023454+01250@CK?023500+01450@C@II023518+02070@C~K@023518+01520@C@D 023518+41200@CNN023524-02040@C:Ӡm@DG{023530+41270@C,_?raP023524+01280@CΝi7@=X%023530+29320@C?6i7023530+01100@CUUUUU@D023536+41280@Cӻ@@8023536+31510@C,_@DYll023536+40300@C"""""+&ll023618+29560@C33334@2b}'}(023618+18100@Cwwwwx@ER023624+41480@CX%@%023630+10380@CQ@B j|023630+35520@C=p @,5y023642+06200@CN@15yG023642+17250@C,_@Ӡm:023648+02310@CN?eC ܺ023648+01450@C/b?n]L;*023648+00530@Cwwwwx@%/b023654+10350@Cb0@%˩e023654+10380@C@,_@3zH023906+18490@D86i?[[023906+00130@D<N@ʆAu023912+05450@D>t @? 023918+01010@DHm:ӡ@27zH023924+18000@DQ@AR023930+35000@DUUUUUV@Cqq023930+39200@DR/c@AaN023930+34340@DG33333@d~K023936+02130@DOwwwwx@2*+024142+41470@D@3tzG024154+19150@DӠm:@@Zj|024154+32300@D@.zG{024200+15020@D=p +~K024354-00420@D$h6024354-01570@DzGϤOP024400-00270@D/c?&7024400+01140@DX%@G 024406+47350@DUUUUU@.HY024412+15130@D/b@0333333024412+15590@D,_@!M4Vy024424+08260@D@D?II024430+40180@DӠm:@D024442+41030@DQ@0rb024442+15540@D@BN024448+37200@DӠm:=p >024454-00300@D33333'}'}024454-00280@D@t @*024500+13030@D6i@024500+04260@E@I`n]L;024500+50330@Db0@"i7024506+09090@EX%@;OO024506+26540@E @D΁N024506+41250@DGz@ QR024506+02570@E =q@A5\(024512+34130@EX%@O˩e024542+04220@EO@DV +<024536+40290@E~K@DSʆ024542+41350@E~K@,zH024548+14030@E/b@(h5z024548+11480@E@19>>024554+17000@Et @@ =p024600+06190@EK~@,m:Ӡ024554+14060@Em:@4024600+20390@E$%Y@B;i6024600+36150@E =q^o024606-00280@E&/c@A-.024606+35080@E /b@/wwwwww024612+15310@E 6i@*r}'}(024618+13010@EzH?4V024618+00470@E~KW024618-00580@E%,_@2U&7024624+18070@Ei6@ Yj|024624+02580@E8DDDDD@G|5y024624+46470@E56j@D =p024630+40510@E+ =p@3M˩eC024630+19050@E$/b@&024636+01560@E9@t @D?025112+14460@EN@ 025118+05470@E@zH025124+06030@Ep =@˩025124+02450@E =p@Dàm:025130+41200@E~K@D?.025136+41070@E@t @,O025142+13570@EzG@,O025142+13570@EUUUUU@" +<025148+09150@EQ@033333025212+15490@EGz@0)eC 025230+15580@ENӠm:025230-01230@Efffffn]L;*025236-00230@E,_@!N025242+08370@E%Y@@"""""025242+33350@E@@*-.025248+32080@F =p@D?.025254+41260@E@o025312+06000@EӠm:@/˩025306+15460@E =p@".025312+09060@Ft A@GEg025312+47200@EQ@OO025318+06170@Fwwwwx@E ` a025318+42510@EO?(\)025318+00290@F b/@&7I025342+04200@F\(@/ r025336+15430@F N@i6025342+05570@F %X?5y025348+01470@F%X@q5yF025348+04250@FN?Ӡm:025354+00400@FGz@"Q025400+09130@F/c@U&7025400+07080@F/b@}'}(025418+06000@F16j@D025418+41200@F$@1n025418+17190@F$N@H025430+05070@F%N@3 025430+02350@FBG{@G?b0025442+46180@F-@$0d 025442+10170@F,%Y4Vy025448-00300@F1,_@N025454+05460@FA6j@Aܺv025454+35040@F6/b@ =p025500+05500@F6/b@Sʆ025500+05500@F<~K@&]u0025512+10590@FEGz@8#025512+23500@FJӠm:@@*|025518+32080@F>@& 025518+05350@FGi6@&DDDDDD025530+10550@FEX%@ C ܺ025530+03100@FK33334@aGz025542+05540@F_N@D5y025548+41050@F` =q@E,DDDDD025548+42090@FKb0@牫025542+03400@FMQ@^&7I025542+06230@FKi6UUUUUU025548-02140@FO =p@9F025548+06060@FRffffg@`$h5025548+06060@Fl6i@Gu0025600+46530@FVzG@ zOO025600+03140@F]6j@%C ܻ025618+06040@Fq,_@D$h5025618+41110@F`zG@,_025618+06040@Fh/b@Yj025636+05560@FvӠm:@9=@t025648+25030@F@t @Bi025648+36370@F~K@C}'}025648+39180@F}Gz@894025700+24020@F{~K@!n]L025712+06200@Fz/b@,_,025712+02340@F@2qr025718+18420@F@D --025724+40030@F@E025730+42580@F/b@7HY025730+05360@F@24Vy025730+18330@FX%@A@t025730+34590@F@E=p 025742+42500@F/c@P?/025742+05310@F@'025748+11390@F =p@Fz=p 025754+44460@FQ@Fr-.025754+44430@Fb/@D#E025754+41120@F@'` `025800+11350@FDDDDD@BӠm:025818+37350@FN@05&7025824+16010@Fi6@AOO025836+35010@FX%@1OO025836+17390@FX%@EJ-.025842+42240@F,_@0 025842+16290@FÒ,`@Dra025854+41250@FQ@AP?/025854+35350@F@AGz025854+35350@FzG@B /b025854+35550@F_-@=@1 030142+17290@G OrX%030142-02300@Gi7@TdۗS030200+79570@G0_,@Ej-.030212+42390@G,DDDDD@3_ۗS030230+19100@G733333@Bddۗ030236+36350@G$?~K~030230+00540@G$/b?,_030230+00090@G'33333@j030230+05400@G=b/@D4V030242+41250@G*i6@ W030242+02110@G)Nqq030242-00210@GEUUUUV@E/$h030254+42110@G2i7@?.030254+05560@GG~K@Ddۗ030300+41400@G0m:ӠQ030254-00360@GK@BP?030312+35500@G9NƦ 030312-00220@G=p =@n 030312+04400@Gb\(@GO$h030336+46260@GlzG@B/c030412+37390@GqX%@E1030412+42120@G[X%ll030418-00590@G_ =p@ '}'}030418+03050@Gx~K@C/,`030430+38100@Gn@>>030448+02200@Gq:Ӡn#Eg030500-01090@G(\@C0ܺv030500+38110@G_-@B9n]L030506+36150@Gw~KӠm:030518-00580@GzK~@ . 030512+02580@GzK~W$i030518-00580@G@ݕ s030524+05460@GQ@'[[030536+11430@Gm:ӡ@4Ű[[030536+20350@G,_@q~K030548+03550@G@o030554+01570@G6j@E|h5z030600+42470@Gt Awwwwww030618-00550@GӠm:@D|~K030624+40480@GzH@24Vx030648+18190@GN030706-02120@Gǻ@EVx030700+42020@G@DbӠm:030700+40350@G_-@A#E030724+34550@G\)@dۗS030730+04400@G@t @DW030800+41110@GG{@A~K030754+35120@Gffffg?i6030842+01080@H(]@T2,_030900+80370@GUUUUV6i030912-00350@H@t@C?.030918+39080@HGz⿴ۗS030930-00150@HӠm:@3>030936+19030@HӠm:u0030942-01140@H Qll030948-00210@H/zG@FYj031012+43570@H/N@D031012+40540@H_,UUUUUU031012-00300@H\(@>>031012+04310@H,_@i6031018+02350@HD@E_~K031048+42340@HDzG@D^o031048+41060@H8N031112-00240@H9~K?88031118+00310@HEb/@0|M^o031124+16180@HU@CW$031130+39270@HYp =@Erb031130+42020@HD%X. 031136-01490@H`%X@E/b031142+41510@HJfffffó031148-01290@HL~K@ldۗ031148+02300@H`~K@BYj031148+37430@HTDDDDD@0EQ031148+16050@HbӠm:@B ` a031148+37430@HM:Ӡm =p031154-02050@HgzH@DyF031154+41480@HiX&@EY+031524+43030@H~K@D =p031530+41170@HN@DW031530+41180@Hm:Ӡ@DLDDDDD031536+40250@H/c@D(\031542+41170@HӠm:@D:Ӡm031554+41100@HK~@C%Y031600+39170@H~K@Dt @031612+41270@H\(@Dll031606+41180@H/b@D0d 031612+41210@HN@DGz031612+41270@HN@D=UUUUU031606+40190@HK~@DX%031618+41240@Hڏ\(¿,_031618-02090@H@DAu1031624+41220@Hp =@DVx031624+41220@HN@Du0d031630+41200@H\*@'031630+03510@HQ@Dll031636+41230@HN@DN031642+41220@I33333@DК#031648+41270@It @@D +<031700+41110@H/c@##Eg031700+09340@I :Ӡm@CۗS031700+39230@I @Du0031648+41270@H/c?zG031712+00240@HQ? 031712+00240@Ht @@ Q031718+03240@IzG?b/031730+01110@IzGqq031736-02030@Im:@C n]L;031742+38050@I@Dj|031736+41420@I~K@B#Eg031742+37410@I/c>>031742-02170@I /c 031748-02150@INqr031800-00310@I*\(@DII031800+41450@I:Ӡm ` `031800-02100@I+%X@D-.031806+41170@I~K@/031800+15460@IG{񻻻031812-01170@I/c +031848+40420@I,DDDDD+>034518-02180@L@*G@t 034600+12580@L?#F034630+01000@L_,UUUUUV034712-01550@L̈@ۗS034742+06490@Lb/@\(\034830+03390@L""""#IJ034900-00370@M i6@B]L;*034900+36050@LOO034906-00400@MQ#Eg034942-01400@M Q'}'}034948-01070@M!Gz@AraQ034948+35270@M(/b@@&/b035012+32100@M*=p @@*=p 035012+32100@M1@@? =p035024+32200@Mfffff@R:/c035018+72460@M8 =q@3P?/035048+19490@M@SSʆ035124+79250@MH@/ۗSʆ035124+15470@MP(\@%i6j035142+10340@Mbi6@;$h035206+27270@MYX&@ ^o035206+06070@M6i@ ,;*035406+07570@M =p@!Ӡm:035418+08220@N @RYj|035506+73560@MƁO@2\(035518+18260@NGz@Q$OP035530+68260@NUQ@SP?035524+78080@M@5'035636+21400@MQ@.035642+06330@M%Y@. 035648+06320@Mb/@ʆAu035648+06320@NR""""!@Q,_035706+71340@N\(@A4035730+34530@N@t @5 u0035748+20550@N-@7@t A035824+23070@N%R@4IJ035836+05250@N5\(@74ò035842+23040@N5\(@7#Eh035842+22580@NCm:@7!u0035906+23000@N< =r@N035918+05300@NI@9#Eg035918+25400@NPQ@5ra035936+21450@NR@QHY035942+70520@N]@5{4V040000+21200@NoX%@:\#Eh040030+26130@Nwwwwww@6(5y040048+22010@N}@>qr040048+30420@NvG{@3Q040048+19450@NQ@@牫040124+33400@Nt @-.040154-02190@N:Ӡm@9C>?040200+25070@N\*@Qt040236+69410@Nfffff@9\(040242+25210@Np =@9h040248+25160@N6i@ǮzH040254+04190@N6i@X&040254+04170@NQ@6i6040354+22440@N"""""@òn040412+06490@N =q@>040506+03510@Op <@7J|040500+23100@O@;2\(040554+27040@O t @\(040630-01170@O&X%@!L;*040630+08310@O~K@RdۗS040654+74530@O=b/ɿu0040724-01300@Ol =q@:?.040818+26450@P@Un]L;040900+86050@O~J@; 040924+27350@O @u@0 =q040942+05260@O@0d 041012+02140@O@;041030+27250@O%Y@9{eC!041036+25210@O\(?x#041106+01380@Ob0@8,_041112+24320@O =q\(041248-01060@O?~K041300+01020@PGz@ [$h041318+08040@PX%@ s041330+01570@P %X@,_041354+02370@P @t?Q041424+00420@Pb0@ ` 041436+04400@P~L@vò041442+02170@P%Y@ +DDDDD@ ܺ041718+01590@PDQ/b0041742-00480@PH,_?%X041800-02090@PK,_@N041806+02120@PNG{@041818+02310@PP @tŋX%041824-00170@P^\)@0 =q041918+03560@P_b/?ll041924+01430@P`/c?%X041930-02470@Pe,_@P?041942+07060@PhG{@ Q042000+03060@PzHx#042124-00570@P%Xj|042148-00510@P~K@$h5042200+07060@PX%@042224+07040@PzG@BFX042300+07120@Pʪ@Q88042312+70150@PzG@Q*042400+70200@P\(@Qau0042354+69260@P\(?Eg042418+01350@P–/b@5}'}042512+21330@P\)@P6T2042606+64450@PʹN@DDDDD042612+07380@QQ@S$HYk042618+76280@Pؖ/b?ʆA042700+00050@PUUUUU@ tIJ042706+03350@Q 33333@QvT2042706+71470@PzG&042724-00520@PN@ƊW042730+06500@P/bwwwwww042806-00250@P =q?. 042806+00330@Q!zH@RS%X042812+73110@P@t?Eg042812+00330@P"""""?@t 042812+00450@P~K@*|042818+05260@PX%@ ,l042818+07590@P~KӠm:042830-02070@P%Y@,_042830+07310@Q'N@RMQ042824+73050@PzH@![[042830+08240@Q1~L@RP042900+73090@P,_@qq042918+06400@P%X?/b0042918+01050@Qm:?(\)042930+00270@Q5\(@Qx042954+70010@Q@j043030+05150@Q\)?}'}(043118+01000@Q,t @@ U +043200+08040@Qcb/@RS˩e043212+73120@Q:/c@ Gz043300+08090@Q@N@3i6043300+19500@Q?p =[Sʆ043324-02090@Q?wwwww]043324-02170@Qw@RR 043330+73110@QD7H043342-02570@Q@t @R$h043354+74050@QH @t]L;*043354-02590@QIX%X%Y043400-00150@QJ%XR}'}(043406-02240@QRp4Vx043430-02250@QXm:ӡg043454-00230@QK~@Rj +<043500+73340@QӠm:@P =q043530+66320@Qa~Kd~K043530-02100@Qk6j?[[043606+00050@Qm\(@u0043612+02440@Q}@8#043712+06570@Q@t@QMP?043718+69090@Qm:ӡ@eX&043724+07150@Qi7@[[043724+07140@QzGQ043730-00400@Qǒ,`@R5y043748+75340@Q%X0d043748-02080@QG{@Ȉ043748+04060@QR?+/b044906-02430@R9zH{raQ044906-02390@R=%X@!˩e044906+08450@Rj/b@Qm\(044912+69390@REQ@044942+05040@RzH@S2˪044930+78070@RLQ@045006+04190@RMQ?%X&045012+01100@RNӠm:@tIJ045018+02580@RON?M^o045024+01150@RR@Ӡm:045036+02150@RW%X@045042+07030@RVG{@>ܺvT045048+03590@R\(@T raQ045100+80050@R]6i@ 045112+03400@R_,_@ %X045118+03300@R @t@Rò045118+72200@Rdt @?5y045142+01350@Re@>045142+01330@ReN@4Vx045142+02030@Rj=p @ $OP045200+03110@Rim:Կ˩eC045206-01270@Rs =p׿Ӡm:045242-01160@RzG@Q5y045248+68140@R@QGwwwww045318+69030@RX&@}'}'045318+02510@R@$h5045318+02090@Ri7@@HYk045330+02050@R/c@@t A045348+02570@RGz?òn045354+00380@RzG@R;*045412+72150@RR@aP?045412+02430@R=p W$045418-00400@RzGvT2045436-00550@RӠm:?M^o045442+01490@R޿뙙045454-00560@R~K\(045500-01120@R\(?Q045524+00430@RQ녿N045524-00120@RN@j|045530+03550@R޿zG045542-00150@R,_?HYk045542+00400@RӠm:@ II045554+03130@Rffffgffffff045600-00380@R˧@t@O@t 045606+62100@RzGHYj045612-00580@RII045618-00340@RzG89045630-01340@RO@fffff045630+04540@Rm:@x8045636+05330@RQ녿Ь5y045700-00200@RK~(\)045712-00140@R @t@eC!045754+04190@RӠm:@II045830+07300@R@4N045848+03420@R~K䱿2˩045906-00350@S)wwwww@R 045948+75320@R:Ӡm?π050000+00100@R~K?Vx050030+00110@RUUUUU? ܺv050054+00350@RQ@#050054+04360@R?--050100+01300@S%X}'}'050136-01130@SN\(@ReC 050206+75220@S zH?L;*050212+01450@SJ@QQ050306+70260@S @t@Q050318+02250@S Q?P?/050324+00290@S*""""#@!Y,_050354+08350@SL=p @O8 ` 050406+62220@S1@2˪050430+03550@SE@t @1]i6050524+17180@Shm:Ӡ@O0d 050548+63070@SMb/ʿ?.050618-00380@SR@qq050630+07180@S|zG@P@t 050636+67250@S@Q&/c050648+68310@S%X@U` `050700+84000@SuN@I_,050724+51290@Sa@t?,_-050730+00520@SbͿi6050736-00460@Sc~K?/b050736+00500@Sj,_@2n]L;050748+17580@SkR@2Q050748+17580@T@UG{050800+84260@Sk~K?&7H050806+00210@Sffffg@P[[050812+66250@SlӠm:s|050818-02450@S~K@Iò050830+51150@Sx@1]L;*050836+16590@SxQòn050900-00380@S\(@Jg050900+52110@S|K~@^o050906+05080@St @@It @050918+51180@SQ@050930+05240@S6j@OIq050936+62310@S/b@Q^o051000+71250@S@ll051012+02400@SN@I>>051012+49570@S =p@UUUUU051130+06270@S?W$h051136+01500@S(\@t A051212+06110@S=p @7H051212+05210@S"""""@\(051236+06120@SGz@C ܻ051242+06250@Sb0@˩eC!051254+07080@S@PW051312+67400@SK~@-051312+07060@Sç@t @=p 051336+06230@S =p׿333333051336-00120@S@JK~051342+53300@S,_@-.051400+06230@SQ@P^zG051412+65250@Sң =p@yF051430+06520@T 33333@R"K~051436+72290@T =p@R5yG051542+72170@T i6@P 051548+66110@St A@1UUUUU051630+17390@SzG?4Vx051642+01160@T.DDDDD@R=051642+72550@S\)@ 4051700+03160@T@ +?052400+67190@TX%@Hܺv052448+49500@TG{@Pll052606+67410@T@P33333052630+67340@TQ@PyF052724+67400@U&Q@Sn]L053000+79330@Tm:Ӡ@053142+02460@Ul"""""@TyF053100+82260@U N@?ڼ#E053330+31540@Ua33333@QX?.053636+69210@U\(@S%X053642+79130@Un @t@Qy#Eg053712+69520@U6j@R绻053724+75360@Uv(\@Q[Sʆ053748+69250@Uz/b@Q<n]L;053806+68550@U%X@S~K053842+79370@U^@2}053900+18290@U~K@QS%X053900+69170@UN@Rf +<053912+73350@U =q@RW053912+72190@U,_@QJ88053930+69090@UK~@QC$h054012+69020@U@I4054006+51110@U @t@P4Vy054042+64000@Um:Ӡ@QC@t 054106+69020@U~K@S&054242+79410@UN@L]L;*054300+56050@U%X@P054342+66510@U@R"""""054454+74150@Ufffff@1b0054636+17410@V @t @P6i054724+66470@V0/c@RF054824+74410@VGz@Gk` `054830+46490@Vr @t@S/b055100+78300@V.K~@G8?.055106+46260@VLK~@Q/89055118+68430@V6%X@I/b055124+51550@V*t A@.WSʆB055148+15100@VQ@UʆA055200+84250@Vf%X@Q~K055300+68260@Vwwwwx@T[[055300+83500@VU@t @Efffff055342+43140@VW33333@'ò055436+11580@V@TӠm:055500+82430@V|Q@O;*055506+62080@Vv\(@K5@t055518+54250@V6i@T :Ӡm055600+80080@V =q@NkW$i055624+60500@VN@PW 055730+65230@V@H6i055912+49550@V @t@IX%060000+51060@VQ@L[[060018+57390@V =p@NʆA060024+07500@V:Ӡn@L0d 060036+56090@WUUUUU@SEg060118+79560@V_-@P+~K060212+64410@WN@P.T2060336+64440@W)zH@Qر~K060442+71230@W_,_@Tj|060500+80290@W`@T?.060500+80010@Whfffff@T%Y060600+80280@W(]@E aP060530+42050@W0N@LcN060648+56460@W6i@THYj060700+81100@WDm:ӡ@P5yG060724+64180@W-@t @A҆Au060730+35400@WAi6@Ii7060800+51530@WZ =q@Qn060800+69450@WQb/@P#˩e060812+64350@WF\)@F8--060848+44270@WX%@R˩e060900+75580@W`@P-b/060906+64430@Wr"""""@Qò060918+71090@WSzH@G=[[060930+46310@Wl@P[[060948+66350@WSwwwww@C/b060942+39040@Wy@t@Qfffff060948+71030@WQ@TdۗS061000+80050@Wb0@S061030+78220@W}%X@P[[061036+66510@WO@QK%X061048+69120@W}33333@P,`061054+64270@W:Ӡm@Pm:Ӡ061142+66310@W{UUUUU@H㻻061154+49470@W@t @L>061200+57040@Wm:Ӡ@KDrb061200+54330@W6j@S3X%061154+76500@WDDDDD@G/b061218+47070@WK~@P 061218+66330@W@G;*061224+47110@W@Px061236+66370@XQ@TdۗS061400+82210@WN@IoۗS061424+50540@W:Ӡm@IqN061436+50550@WzG@I&7I061454+51570@WQ@Pp =061506+66360@X=:Ӡm@T$h061600+83200@W@SR061536+78330@Xqm:@U; +062642+51550@Xi@G6i062654+46020@XgzH@Cn]L;062700+39310@X}@KC ܻ062736+55390@X@O/b062800+63430@X/c@ISʆB062818+52030@X~,_@AƸQ062836+35350@X\(@@Au1062842+33090@XDDDDE@AHYk062900+35140@X,_@Jt @062900+53350@X~K@GN062906+47330@XĸQ@RF062948+74210@Xi7@DX4Vx063006+40430@X =q@J[[063012+52110@Xϻ@RzG063024+74180@X:Ӡm@(F063036+12050@X\(@Co063042+38160@X33333@Hl'063136+48530@Xt A@:vò063206+26300@XծzG@P[063200+67540@X/b@C r063236+39270@Xp >@L0063306+56250@X,_@RUUUUU063312+74210@Xb0@B063324+37370@X =p@L$h063418+56050@Y~@U fffff063400+84130@X@J-063442+53240@XӠm:@P]i6063448+65300@XN@:n]L063536+26320@YR@N OO063536+60070@Xp >@@Ȉ063606+33370@X~K@>N063618+30210@Yi6@J\(063624+53160@Y~K@I yF063642+50090@Ywwwwx@I =p063712+50120@Y @t@J߀063718+53470@YGz@I!5yG063742+50180@YEUUUUU@R_,063748+74280@YQ@Uh 063800+85420@Yi7@Du0063800+40130@Y"""""@@jAu063806+32520@Y3R@Pk` `063812+65430@Y+N@Jdۗ063842+53130@Y;%X@PM0d 063842+65150@Y,fffff@Jl~K063848+52540@Y$Ӡm:@A7063854+34300@Y# =p@: 5y063912+26050@YCGz@Pt @063912+66080@Y9,`@L\(063924+57410@Y3@t @C,_063942+39300@Y[i6@QF063948+71240@Y4%X@5~K064018+21030@Yo,_@R6j064018+74340@Y;UUUUU@Au1064200+34320@Y]b/@Ft @064212+45310@YYb/@=9064218+29160@YXzG@9Ա~K064230+25520@Yg~L@J4064230+53080@YcUUUUU@E^o064230+43500@Zum:@UzH064300+86380@Yfm:Ӡ@E~K064242+43520@Y`\)@=Y064248+29240@ZUUUUV@U r064200+84080@Ynfffff@G4'064312+46290@YlN@@@t 064324+33410@Yp%X@D-.064330+40050@Ys,`@E+ra064336+42230@Yx,_@G4V064348+47430@Yt @@PvT2064354+66180@Yt@@ȑ064400+33380@Yt,_@@̨dۗ064400+33400@YӠm:@IEg064400+51130@Yxm:Ӡ@@*064406+32230@Yx =q@=^ʆA064418+29250@YyUUUUV@:'}'064430+26470@Y,_@I멇eC!064436+51540@YxN@eC 064448+05460@Y@E>>064500+43330@Y@9Ӡm:064512+25340@Y\(@T=j|064600+81020@YQ@NlDDDDD064536+60540@Y@t @RW$i064536+74280@Y@0` `064554+17020@Y6j@2 +<064554+18500@Yi6@F7. 064554+44290@Y~K@H@6i064600+48340@Y@t @SZ88064554+77280@YN@JӠm:064624+53310@Y =p@R,_064618+74310@YzH@<_#Eg064636+28260@Yt @@9$h5064642+25440@YQ@=yF064642+29350@Y@9zG064648+25450@YG{@EʆA064648+43060@YR@9}'}(064654+25410@Y=p @F =p064700+46020@Y\)@:aN064700+26260@Y/c@9l064700+25430@Z,_@U 064800+86450@Y@H\ò064712+48470@Y,_@4$ @t064718+20120@Y\(@Hb/064730+49560@Y =p@@>064848+56180@Y@;u,_064854+27320@YӠm:@LQ064854+57150@Y@F>?064900+45510@Ywwwwx@0KraQ064906+16210@Y =p@I_,064918+50050@Yp >@PLOP064918+65160@Y\(@.y064924+15180@Ywwwwx@.II064930+15190@Yb0@K/#Eg064930+54250@YڸQ@K|IJ064930+55020@Ÿ@?JӠm:064930+31200@Y/c@F 5yG064930+44070@YX%@Av/b064936+34590@Y33334@;4Vx064954+27420@YG{@7"065000+23120@Y6i@Qd @t065000+69390@Y,_@;&065012+27090@Y/d@0˩eC065012+16590@Y~K@6Ob0065012+22220@Z0Q@T6i065000+80040@Y =p@;O%X065030+27230@Y\(@I-&8065042+50250@Y%X@F+4Vx065124+30080@Z\(@P?065212+33200@Y =p@8C|065212+24190@YX%@DXYj065218+40450@Y33333@D +Au1065948+56330@Z~ =p@Jg065954+53450@Z/b@Qn]L;065954+71080@Zo@2F070000+18360@Zy\(@D(5y070000+40230@Zp/c@2|vT2070006+18330@ZX%@IW%X070006+50450@Zv/c@@㩇eC!070012+33510@ZX%@JzG070012+54030@ZX%@KzG070012+54180@Zt"""""@1:Ӡm070018+17570@Z:Ӡm@Pi7070036+64080@Z6i@P4Vy070042+64110@Zy:Ӡm@2 070036+19010@Z@BvT2070042+37590@Z%Y@BdۗS070048+37460@[$Q@UzG070100+84280@Z"""""@KHYk070048+54040@Z}zH@6^N070054+22270@Zffffg@=>]L;*070048+29200@[\i7@Um070100+85480@Z,_@== s070054+29200@ZN@7Ӡm:070118+23590@Zi6@Gu0070112+46130@Z@B5yG070124+37080@ZK@T>+ʆA070248+48340@[]zH@U@Q070300+85060@Zt @@@dۗS070306+33420@Z6j@7\(070312+23400@Z(\@I2FX070312+50280@Z\(@4;*070324+20520@Zm:@7-.070336+23500@Zwwwwx@Fh070330+44530@Z~K@7~K070342+23580@[Gz@Ue070300+85410@Z(\@9sm:070336+25320@Z =q@Hs33333070348+48580@ZQ@Fe'}'070348+44520@ZG{@3b˩070348+19270@Zt @@R070336+74590@Z~K@Rd070342+75250@ZzG@NW$070406+61230@Z~K@L6i070412+56160@Z~K@HUC ܻ070412+48440@ZzG@@<ۗS070418+32330@Z@IWII070418+50450@Z–/b@Hv +<070424+49000@Z@t @H4070424+49130@Z%X@7;*070424+23120@ZK~@I ` a070430+51200@Z@2FX070430+18350@Zp >@N(\070430+61410@ZôN@GܺvT070430+46120@Zm:ӡ@Iu0d070430+50120@Z%X@IPYj070442+50420@ZDDDDE@?6j070448+31450@Zt @@2Î89070448+18500@Z̝i6@HSʆB070500+49040@ZŮzG@A\(070500+35150@Z @t@H9n]L070506+48310@Zfffff@.\M^o070506+15150@Z@*TVx070512+13140@Z\)@*M:Ӡm070512+13140@Zi6@*Vi7070512+13140@ZzG@HNQ070524+48420@Zb0@@W. 070524+32470@Zwwwww@2HY070524+18510@Z/b@H\)070524+49540@Z33333@QyF070536+71550@ZӒ,_@G /b070530+46110@Z\)@EGz070530+43460@Z"""""@HQYj|070536+48430@Z~K@D)070536+40250@Z~K@ISʆB070542+50150@ZN@K{ra070548+55030@ZGz@R G{070548+72150@Z,`@REi6070554+73090@ZځO@GQ070554+48000@ZN@G aP@070554+46100@Z/b@NIJ070600+61520@Z,_@HX[[070554+48460@Z֣ =q@C:Ӡm070554+39100@ZմN@B$h5z070600+36220@[i6@R^ 070600+73320@ZҁN@:5y070600+26100@Zޣ =q@GۗS070606+47590@Z33333@4OO070618+20400@Z@4/c070624+20430@Z%X@B/@t 070618+36270@ZG{@@070624+33270@Zm:@F:Au070636+44320@[N@U070700+86190@Z~K@I. 070642+50110@ZGz@H.070642+49560@[Q@Q +*|070812+30150@[%@R^j|070812+73330@[33333@IK4V070812+50400@Z:Ӡn@:_W$070812+26280@Zi6@?0n]L;070812+31170@ZzH@C8070812+39390@Zp >@E|070824+43440@[ =q@FROO070824+44430@Z6i@=+[070830+29160@[fffff@DۗS070836+41510@[ @K#Eg070848+56020@[m:@GUUUUU070842+47150@Z@b"""""070900+07260@[ @H%Y070906+49050@[Gz@HP?070906+49510@[@t @:4Vx070918+26100@[%X@071030+55010@[Q@vT2071042+06420@[8/b@P;II071042+65020@[>X%@P +<071036+68040@[!i6@A071048+35220@[%R@E?ۗS071048+42350@[_,@7&071048+23100@[\)@7=L;*071054+23200@[26i@K[[071100+55300@[%6j@AʆA071106+35290@[\(@% @0` `071200+17030@[+N@071200+07580@[5,_@B#Eh071206+36070@[8i6@D>ܺvT071200+40350@[.t @@aP?071212+06400@[5UUUUU@:7H071212+26100@[^DDDDD@Q:Ӡm071224+70370@[7\(@7m s071224+23310@[6N@0Qq071230+16240@[9zH@:)b/071230+26150@[9wwwwx@.IeC 071242+15130@[a,_@Q4Vy071248+68260@[CN@@wó071300+33010@[@=G{071330+29570@[J~K@8#Eg071336+24350@[kQ@O}'}071400+63180@[M =p@vT2071412+07510@[W@A Ӡm:071412+34100@[XN@@ 071412+34040@[j@M ` a071424+59470@[j/c@M 071424+59470@[f=p @J. 071424+52270@[m@t @M =p071436+59100@[_ =p@D~T2071430+41050@[Z@7[M^o071548+30380@[i6@K\(071600+56010@[~m:Ӡ@Ja071600+52510@[}%X@HT2071600+49570@[@JGz071606+53060@[/c@M\(071630+58190@[@IVò071624+50460@[|zG@>aP@071636+31010@[@HEg071648+49110@[@t @QOO071700+71420@[,`@6$h071700+22110@[6i@1˩071706+18020@[%X@KL;*071706+55080@[}%X@OW$071706+06400@[@6N071724+23000@[Q@Kt A071724+55500@[X%@8IJ071736+25030@[6j@Kò071736+55460@[_,@:071742+26370@[_,@7Q5yG071754+23240@[p =@=V7H071754+29270@[@9-u0071800+25160@[ =p@K071800+55580@[@t@L?n]L;*071800+56350@[N4Vx071806-01280@[6j@Gl'071806+46560@[p =@Afffff071824+35500@[fffff@6--071824+22380@[~K@704Vx071830+23160@[ =p@@"aP071824+32220@[\)@T i6071800+80160@[\)@Hg071830+49230@[Q@7rb071836+23380@[m:ӡ@4EQ071848+20200@[@D;X%071836+40340@[m:@=\(071848+29360@[Q@M h5z071848+58130@[(]@C,DDDDD071854+38260@[N@MHYk071900+58110@\o@t @UbaP@071900+85390@[~K@1k071912+17300@[t @@D;*071912+41450@[Q@6 Sʆ071924+22080@[Ӡm:@6UUUUU071930+22100@[b/@1Ib/071930+17220@[G{@:oII071936+26320@[/c@: +<071942+26370@[~K@Lra071942+57250@[X%@5Eg071948+21350@[,`@5{eC!071948+21370@[wwwwx@B,_071948+37330@[@t@6Ӡm:071954+22400@[~K@2p =071954+19000@[,_@B,_071948+37260@[@4vfffff072000+20320@[b/@NYj072000+61470@[K~@@?eC 072000+32360@[t A@DO072000+41310@[,_@65UUUUU072012+22180@[@7>>072012+23450@[ɅQ@L$h072024+58050@[~K@KH\)072030+54400@[,`@@072030+33310@[ @t@ m:Ӡ072036+02520@[p =@5N072042+21570@[(\@HW072036+49230@[@Ib/072048+03000@[6i@l072054+02430@[@M2˪072054+59310@[6j@Dd'072100+40520@[:Ӡm@@KeC!072100+32420@[@H#Eg072112+49350@[33333@K072118+55360@[6j@J072118+53320@[̝i6@@f072130+32550@\$@S =p072142+79580@[fffff@;SʆA072154+27260@[Ӡm:@P3 072200+64550@[t @@7Ț#072200+23530@[̝i6@072206+07180@[UUUUU@FiP?/072206+44550@[/c@BW}'}072212+36460@\:Ӡn@R$ò072218+72400@[Ւ,_@3-^o072224+19160@[~K@HzOO072230+49030@[Ӡm:@#072224+09360@[i6@"hYj072224+09180@[,_@?}:Ӡm072230+31350@[6i@=ra072236+30040@[6i@B072236+37270@[,_@3 ` 072242+19130@[zG@9Au1072242+25490@[ۮzH@4+%X&072342+30150@[򈈈@@}'}(072354+33550@\m:@M@Yj072400+58380@[UUUUV@8 eC!072406+24080@[i6@@}'}072412+33540@\"""""@J<_,072412+52340@\ X%@O6j072418+63300@\@L߀072424+57520@[@3>?072424+19440@[=p @4i6072430+20120@[X%@3˩e072430+19430@\,_,@RhVx072442+73440@\,\)@Rm5yG072442+73490@\ =p@DbAu072448+40510@\wwwwx@O ` 072454+63070@\ =p@@}'}072500+34050@\"""""@<&7I072500+29020@\~K@8dN072500+24290@[X%@ۗSʆ072506+06340@\/%X@R!Q072506+72370@\t @@H~K072506+49140@\Q@@F072524+31020@\i7@2g$h072530+18290@\ @t @A88072530+35390@\ X%@8{~K072536+24350@\p >@Bp#072536+36580@\DDDDD@@Yj072536+33550@\ ~K@1& ` a072542+17140@\m:Ӡ@E# 072542+42220@\@t @@/b072548+33570@\N@Jg072554+52540@\m:ӡ@4072554+20400@\p >@:#E072554+27010@\!Q@K7$h072600+54320@\m:ӡ@:fll072606+26300@\@;x072606+28010@\,N@O\2˪072618+62500@\,_@ b/072630+06060@\@,ll072624+14310@\@@Q072630+33470@\p =@4zG072636+20080@\N@B6j072630+37330@\16j@M@t072648+59360@\!@t @AQ072648+34070@\$ =p@C072654+40020@\&i6@Bx072706+36120@\;\(@O%X072712+63220@\$X%@8|vT2072718+24350@\$@8S>?072718+24250@\ Ӡm:@7HY072724+05550@\./b@C}'}(072736+39070@\^@Ri5yG072748+73450@\,%Y@2U +072754+18250@\,fffff@#KQ072800+09450@\,%Y@#N 072800+09450@\-,_@*/b072800+13100@\5Q@?eC!072806+31500@\N@P?Q072818+65070@\0(\@*0n]L;072806+13120@\133333@-5y072812+15020@\Q@t @PE r072824+65120@\3Gz@2>O072818+18200@\2i7@*Q072818+13100@\ǻ@Tn]072800+83540@\=~K@9u0072842+25430@\9~K@*HN072842+13160@\<%Y@2I4072854+18240@\\@P\&072900+65340@\UN@M4Vx072900+59450@\?Q@2UC ܻ072900+18270@\CN@9 +4Vx073018+30400@\rӠm:@P@073018+65080@\~K@R#Eh073024+74340@\ZQ@?U&7073030+31270@\X%@R073030+74060@\kwwwww@KiN073042+54550@\m,_@K~K073042+56030@\Q@Rm4073048+73490@\bi6@?g~K073054+31310@\_:Ӡn@-#073106+15050@\aR@7--073106+23130@\b\)@7eC 073106+24050@\a~K@2}'}(073112+18480@\ywwwww@LF073130+56080@\c\(@/b0073136+04390@\izG@2H +?073218+59250@]@m:Ӡ@UcW$i073200+85410@\ui6@3 073224+19100@\33334@MbvT2073242+58540@\Ӡm:@K,_073242+55250@\x/c@(Sʆ073242+12250@\}b0@8z#E073248+24350@\X%@O+raQ073254+62270@\{@'9P?/073254+11430@\{,`@'k` `073254+11490@\Q@2 /b073300+18100@\N@@zH073300+33140@\X%@O$OP073254+62260@\Ӡm:@Mג,`073306+59490@\N@M6i073324+59270@\%Y@R33333073324+75330@\/b@@zH073330+33140@\b/@1GeC 073336+17230@\Q@A#Eg073336+35210@\@1FX073342+18000@\~K@MM^o073342+59400@\,`@AՂ-073354+35460@\,_@ 073400+04160@\\)@#ò073400+10010@\G{@6Z073400+22280@\~K@D5yG073400+42030@\,_@+3m:073418+13430@\b/@AyF073418+35430@\:Ӡm@3j|073424+20050@\Q@#ҡn]073424+10010@\,_@3ʆA073424+19450@\"""""@,'zH073430+14120@\i7@< 073436+28460@\\(@; b/073436+27090@\wwwww@5}'}(073442+21450@\~K@" ^o073442+09080@\(\@5m:073448+21460@\G{@MIJ073454+59170@\ =p@M+@Um074100+85510@]$"""""@J+}&8074400+30370@];6j@Hrb074400+48200@]Ht A@O}'}(074406+62190@]0zG@0Yj|074406+16380@]4_,@:|074412+27040@]5~K@=i4074412+29320@].N@/074412+07250@]5p =@:&7I074418+27030@]8i7@;OP074430+27080@]PG{@O%Y074436+63110@]I6j@Kn]L;074436+55560@]Jm:Ӡ@KNK~074442+54440@]:/c@6N074442+22540@]mGz@Rò074448+74280@]8Q@$[[074448+10220@]9@$ =p074448+10220@]?i6@<+` `074448+28170@]I:Ӡm@FXN074500+44480@]E@A*\(074500+34280@]<(\@2n]074506+06550@]B\)@<:G{074506+28200@]Ri6@K^o074506+55430@]DG{@< P?/074512+28090@]Z=p @Nb/074518+61340@]E,_@7=i6074524+23210@]\@Ng074524+61280@]UzH@JUL;*074530+52480@]N6i@<Ӡm:074542+29010@]NzG@;FX074548+27410@]U =p@E4Vx074548+43540@]N6i@5\(074600+21520@]_@t@KAu1074554+56020@]Q,`@<N074600+28450@]M~K@1[>074618-01360@]e@K*074618+56010@]U:Ӡm@5UUUUU074624+21580@]bK@I˩eC074624+50100@]YX%@@^W074624+32510@]Y@:}'}074630+27020@]ZN@=N074630+30040@]],_@@ ܺ074636+34050@][ =p@;چAu074636+27580@]6i@R`--074642+73380@]s,_@O aP@074648+62120@]lQ@K.]L;*074648+54290@]`@>%X074648+30520@]`@>T2074648+30090@]c@A5 r074654+34330@]]@t @2DDDDD074654+18570@]bt @@>raQ074700+30510@]wQ@N𑢳074706+62000@]t@Ltrb074718+57030@]f\(@>9074712+30210@],_@R 074718+72100@]s,`@I5y074730+50180@]t%Y@Ill074736+50170@]u =p@IzG074736+50210@]zi7@LOP074736+57150@]j\(@;88074736+27560@]u@t@I&7I074736+50210@]jN@6u0074736+23070@]jG{@7~N074742+23370@]iUUUUV@0^o074742+16300@]hi7@$074748+10270@]}Q@K33333074748+55130@]n\)@7UUUUU074754+24010@]@t @RvT2074800+74320@]X%@N_eC 074806+60520@]y~K@Ep5y074800+43000@]} =p@H6i074812+49570@]zG@OE +074812+62400@]nffffg@#.zG074812+09430@]N@Q88074818+68130@]y@;a5yG074830+27300@]t%Y@%Au074830+10580@]{~K@>r-.074830+30340@]u~K@$Rn]074830+10160@]{@t @;Q074836+27440@]v/c@, aP@074842+14090@]v=p @%6i074836+11060@]v=p @%X&074842+10390@]wi6@%l074842+10540@]zӠm:@#n]L;074854+09550@]{i6@&V ` a074854+11180@]m:ӡ@OW074900+64010@]{UUUUV@# 074854+09550@]@S 074900+78080@]N@;{$h074900+27370@]N@KӠm:074900+55210@]|Ӡm:@Ӡm:074906+04380@]@7{Sʆ074906+23360@]i6@J/c074912+53100@]}@ʆAu074912+04340@]t @@R' ܺ074912+72450@]}~K@eC 074912+02570@]@@@t074918+33360@]X%@&GeC 074918+11150@]fffff@I ` 074924+50150@]i6@I:Ӡm074942+50210@]@I$h074948+51560@]Q@Om˩eC074954+62590@]@Jp?.074948+53010@]b/@- 074954+14580@]K~@Co074954+39110@]DDDDD@/b075006+06370@]zG@B#~K075006+36240@]O@C]ò075006+38520@]Ӡm:@KeC 075006+55370@]%Y@;u +075012+27350@]N@M"n]075018+58250@]zH@'}'075018+05370@]G{@K ` 075018+54230@]Q@)X%075024+13020@]Q@!Yj075030+09050@]@"̃rb075030+09320@],_@! +>075406+07370@]"""""@JnK~075406+53000@]G{@A[[075412+36040@],_@@075406+33120@]@7lj075412+23550@]"""""@;~075406+27370@]zG@,N075412+14310@]ӴN@7zG075418+23540@](\@%1Yj|075424+10440@^t A@RD_,075424+73120@]X%@BӠm:075424+38080@]%X@G#Eg075430+47270@]=p @&HY075430+11110@]@t @&ieC 075436+11210@]/b@@Gn]L;*075430+32420@]Q@LYF075436+56500@]X%@M075448+59150@]~K@GӗSʆ075454+47470@]~K@M~K075454+59170@]@9),_075454+25170@]ܪ@0HY075500+16100@]K~@I:-.075500+50370@]UUUUV@:˩075500+26420@]مQӠm:075500-01250@]~K@B~K075506+37550@]fffff@-hN075512+14490@]wwwww@9&/b075518+25160@],_@$HYk075518+10270@]R@? #E075518+31100@],_@K075524+55250@^33334@R2˪075536+76050@]zG@ Ldۗ075530+08170@]@ I6j075548+08170@]@t @@N]L;*075542+32450@]绻@w. 075548+08000@]zG@Lu'}'075548+57030@]\(@(S 075548+12180@]\(@ n]L;*075554+08230@],_@ 075554+08100@]K~@Kó075600+55300@^p =@N$N075554+60250@]wwwww@@u r075600+33030@]\(@;vll075600+27360@]%Y@8)+?075612+27130@]/b@8s 075618+24350@]@GN075618+47330@]fffff@E \)075618+42230@],_@ .075624+03200@]@: 075624+27010@]Q@;ll075624+27100@]~K@2;*075630+18150@]K~@0k$h075630+16340@]޿j|075636-00300@]X%@8Q075636+25060@]=p @1}˩eC075636+17370@]@t @A6i075636+35570@]X%@@'}'075642+33260@^(\@F˩eC075648+45220@]i6@9[` `075648+25290@]Q@.ò075648+15310@]m:Ӡ@2fӠm:075654+18330@]DDDDD@7c =p075654+23310@^/b@K4Vx075654+55410@]@8aP075654+24080@^_,@E075654+42190@^K@:aP@075654+26480@^Q@COO075700+39580@^p =@Dԍ&075700+41480@^~K@7p075700+23340@^N@K\)075712+55530@^ %Z@GXm:Ӡ075712+46500@]X%@n075712+05450@^D@StDDDDD075700+77580@^ @t@K +<075718+55520@^UUUUV@:i6075718+26500@^m:@:i6075718+26450@^zG@*M4Vy075718+13170@^_,@ /c075718+08090@^b/@\(075724+06500@^ b/@BaP@075724+37200@^@t@Ḵ~K075730+55430@^\(@N#Eh075736+61320@^ b0@6ffffff075736+22320@^ \(@=075736+29530@^=p @LFܺvT075748+56420@^ Gz@;4Vx075742+27380@^p =@C ܺ075742+07570@^ b0@/^o075748+15490@^ @+dOP075748+13500@^ @0W =p075748+16290@^ DDDDD@0l075754+16400@^@F?.075754+44190@^ zG@LuyF075800+57040@^ i6@LRt @075800+56470@^!UUUUT@Lu^o075800+57040@^ ,_@#P[[075800+09480@^i6@EHYk075806+42080@^"@Lx =q075818+57050@^(\@I^fffff075812+50540@^!wwwww@KFX075806+55090@^BX%@RW$075812+74110@^(,_@NN075818+61310@^33333@=-4Vy075812+29190@^@9M075818+25250@^,_@X--075812+02260@^@;F +<075824+27250@^m:Ӡ@"zH075830+09240@^(]@.'}'075836+15300@^6i6@P ` a075836+67170@^i6@2aP075836+04250@^N@9=-075842+25220@^zG@}'}(075842+06160@^Q@/k` `075848+15510@^6i@#j075848+09510@^@%wSʆB075854+10520@^6i@~>075900+06460@^!Q@;9eC 075900+27220@^#:Ӡm@@(Q075900+32270@^0/b@L &7075900+56130@^_,@%X&075912+04250@^@'p?.075912+11520@^t @@#@m:Ӡ075912+09460@^X&@#ZG{075918+09490@^@t @!t @075912+08420@^&K~@?0075912+31190@^+i6@DVܺvT075918+40490@^*ffffg@Ac` `075924+34550@^-Q@D:\(075924+40360@^"(\@ =q075924+07490@^"Ӡm:@"8075924+09370@^=Q@Nò075936+61250@^=@t @Nh5z075936+61290@^!?$h5075930+00570@^$@"I075930+09320@^*t @@>AGz075930+30230@^)@;p075930+27350@^#UUUUV@W =p075936+04280@^B @s@O},_075942+63070@^%\(@i6075942+07010@^&/b@#1q075942+09440@^&/b@" 075942+09330@^2Ӡm:@Cra075948+40030@^*N@#$h5075954+09390@^6m:Ӡ@D&8075954+42030@^-@t @/080000+15570@^/UUUUV@0Ldۗ080006+16270@^4""""!@>X%080000+30550@^2X%@8 +@: r080048+26400@^jQ @RUu0080100+73290@^DG{@D080054+40200@^.Q080100+30190@^HQ@DX%080106+40210@^?,_@.FX080106+15240@^?i6@!fAu1080112+08500@^@@$OP080118+10090@^?N@!R080118+08400@^F@=N080112+29380@^A@t @#ܺv080124+09570@^AX&@tIJ080130+05150@^Cwwwww@#Eg080130+07310@^D@!w =p080130+08520@^DDDDDE@!JAu080130+08470@^R%Y@G>080136+47120@^Qp >@DT2080142+40190@^R_-@DK080148+40440@^W@GZvT2080154+46510@^Lt @@4~K080148+20500@^SX%@Brb080154+37360@^QQ@=080154+29510@^LX%@%˩eC080206+10550@^Qp >@9˩e080200+25120@^WzG@Bn]L;*080206+37420@^NGz@%~K080212+10590@^WX%@BğIJ080206+37420@^W~K@A,_080212+36050@^hGz@NYj|080218+61130@^Oi6@A#Eg080218+05120@^c =p@JG{080218+53180@^ZK@:*|080236+26180@^xDDDDC@P(\080242+67420@^\%X@>;*080236+30220@^gN@Iz4Vx080236+51070@^j@K-.080242+55170@^Y~K@$ɇeC 080248+10320@^ZG{@%j080254+10510@^\/b@]i6080300+07440@^],`@(\(080306+12370@^[ ffffff080312-03250@^cQ@4II080312+21080@^c,`@1N080318+17510@^ki6@CQ080318+39140@^b/d@)T2080324+12410@^h @t@:/b080324+27020@^c@t @'/b080330+11560@^ub/@It A080330+51170@^e@}u0080342+05460@^b B\(080342-03080@^wwwwx@Ph5z080348+64320@^fffffg?,_080348+01110@^}p =@LX?.080354+56500@^qQ@B080348+36230@^hӠm:@O˩e080354+04420@^n_-@6׉080354+22590@^nzG@3N080400+19590@^m~K@2#Eh080400+18530@^uN@D2/c080354+40330@^qp >@; [[080400+27160@^v =p@Ct A080400+39200@^l@<#Eh080406+05270@^N@KӠm:080412+55390@^r%Y@8cm:080406+24310@^qb0@2|080412+18540@^om:@ """""080418+08090@^z@C080412+39090@^q,_@ #080424+08110@^w\(Ž@9"FX080424+25160@^tm:Ӡ@-Ӡm:080424+15050@^u6j@1n]L;080430+17540@^ti6@!#Eh080436+09000@^sQ@ܺv080442+04360@^vi6@t @t080448+07000@^%X@LAu080442+57550@^\(@CۗS080442+39180@^z@--.080454+15050@^""""!@S(\080442+79310@^xQ@080454+04390@^~(\@2u0d080500+19030@^~Ӡm:@1ѐn]L080500+17580@^,_@CraQ080500+40070@^,_@S/c080500+76350@^i6@L,_080512+57590@^@t @-5y080518+14590@^~K@Ӡm:080518+05210@^Q@L4080518+57540@^6j@R2-.080524+72570@^zH@yu0d080530+04300@^%Y@Pώ89080536+67230@^,_@"qr080536+09090@^t @@<DDDDD080536+28130@^ =p@BX080542+36500@^N@&[raQ080542+11190@^@L 080542+58040@^N@2 080548+18140@^6i@21N080554+18200@^%Y@4Vx080554+02450@^@t @EzH080554+44050@^wwwww@Gn080600+47300@^@L ܺ080600+57590@^m:@Dl080606+41450@^\)@0p =080612+16490@^\(Ž@<33333080606+28090@^?080612+01460@^@&0d 080618+11300@^?NO080618+00270@^@0#Eh080624+17080@^,_@Yj|080630+05100@^wwwww@G ` 080630+46200@^@D 0d 080636+40150@^,_?080636+00250@^6iпwwwwww080642-00130@^6j@9n]L080642+26010@^/b@9Yj|080642+26010@^\(@C4Vx080648+38100@^fffff?】080648+00450@^ @s@,`080648+05250@^Ӡm:@L080706+57110@^N@@Au080700+34060@^@6܃rb080706+23000@^@8l080700+25030@^@Cq080706+39170@^i6@Rd +@B n]L;080942+36240@^fffff@:\rb080948+26310@^@0i6080954+17020@^@t P?/080954-01170@^̪@",_081006+09320@^G{@Aw\(081000+35050@^:Ӡm@JR/c081006+52480@^Ԉ@6,_081024+22470@^i6@D ܺ081024+41480@^G{@9 n]L;081024+25160@^ߴN@FW$081024+45540@^ܱ~K@Bo081030+37120@^X%@M/c081030+58110@^@M 081036+58230@^X%@L\(081036+58070@^N@KfT2081036+54560@^wwwwx@Kt @081042+55170@^(]@L-.081036+58070@_zG@S`l081048+77400@^~K@15y081054+17110@^ꪪ@H~K081100+49130@^@C--081100+39250@^@EaP@081100+43170@^6k@7˩eC081106+24000@^݋X&?*081112+00480@^b/@5[[081124+21300@^@Mò081124+58200@^ffffg@2pt A081124+18360@^\)@ \(081124+03320@^K~@M&F081136+58270@^Q׻081130-00080@^Q@NP081136+60470@^R@M)+ܺvT081648+56390@_<N@6~K081654+22110@_KGz@K--081654+54160@_= =p@4(\081700+21080@_9 =p@ܺv081700+04490@_A,_@;~K081700+27450@_UX%@OSQ081700+62480@_P/b@K081706+55200@_B =p@;~K081706+27150@_Cb/@: +081706+26100@_BG|@5081718+21140@__33333@PF081712+66410@_J@D#eC!081712+40270@_Dm:Ӡ@4081724+21020@_FQ@5!081730+21170@_D@6i081736+04520@_JG{@9HY081736+26040@_IQ@5Yj|081742+21140@_Kp >@3p?.081754+19350@_R%X@C4081748+39260@_M%X@6dۗS081754+22490@_HN@Ib/081748+04440@_LK@0UUUUU081800+16480@_I\(ŽӠm:081800-01130@` :Ӡm@U~ò081700+86090@_mi6@P"""""081812+67060@_K~K䱿vT2081812-01150@_Um:@4zG081830+21020@_VӠm;@4+?082000+21150@_j/d@ rb082000+04250@_kQ@O˩e082000+04290@_nӠm:@+>ܺvT082006+13470@_DDDDE@Pm:082012+67000@_K~@J082012+53300@_s =p@6Ӡm:082012+22490@_n6i@ 4Vx082012+03440@_nG{@|#Eh082018+04170@_o\(@~K082018+04330@_o =p@[082018+04260@_n׮zG082024-00120@_wX%@;"/c082030+27180@_X%@NŋX&082030+61420@_xQ @5Vx082042+21300@_xӠm;@2ۗS082036+18550@_y%X@5Y082042+21300@_sQOP082042-00420@_zG@KmL;*082036+55000@_ub/@}p =082042+04320@_wm:@"͂-082042+09340@_{ =p@5oII082048+21360@_z/b@2L082048+18280@_x/b@2X%082048+04280@_~K@BC ܻ082054+38010@__-@TC|082100+81140@_yUUUUV@ g082054+03220@_}@-ll082106+14550@_}\(@'F082100+11430@_zt @ڿƊW082100+00000@_zt @ڿł-.082100+00000@_m:Ӡ@5 +<082106+21120@_}\(@#~K082106+10000@_i6@&>082118+11400@_Q@N082118+04190@_i6@#eQ082118+09520@_6j@1TOP082124+17290@_\(ӅQ082124-00080@_~K@(;*082124+12170@_%X@:+082124+26190@_Q}'}'082130-00130@_i6vT2082136-00090@_DDDDE@2Yj082142+18460@_N@u0082142+04250@_%Z@B>082154+38090@_b0@RGz082200+75340@_@Ri[[082206+73490@_K~@P?/082212+07110@__,@+aP082212+13410@_~K΁N082218-02420@_ =q@Mn]082218+60040@_:Ӡm@4U[[082224+20300@_N5yF082230-00260@_@t wwwwwx082230-01030@_~K@ Ӡm:082230+03320@_:Ӡn@Fra082236+46080@__-@Cb0082236+39210@_X%@}'}(082236+06560@_\(@t082236-02250@_(]@D} s082242+41090@_@x +082306+64230@_,_@5tN082312+21370@_\(@ zOO082312+03200@_@; =p082318+28000@_m:Ӡ@1\#Eh082330+17310@_b0@4E0d 082330+20260@_@16T2082330+17220@_zH@O89082330+63260@_~K@,xvT2082330+14230@_@'n]L082330+11400@_b0@6B,_082336+22260@_@ǮzH082336+02450@_Q@an]L082330+04450@_Q@ǮzH082336+02450@_,_@71Yj|082336+23210@_@6i6082342+23070@_=p @Ks4V082342+55040@_/b@ 8082342+08350@_@g082342+03050@_@4]p =082400+20320@_,_@1_˩e082400+17320@_Q@KM^o082400+55180@_Gz@Bra082406+37560@_%X@DSʆB082406+41400@__,@5N082406+21530@_(\@9dۗS082406+26080@_@50d 082412+21490@_N@6כ$h082412+23000@_O@K95yG082412+54360@_m:@KIJ082412+55150@_/b@9ܺv082418+26020@_Ӡm:@K33333082418+55520@_Q?NO082418+00120@_zG@6 =q082418+23020@_~L@1H5y082436+17270@_i6W$i082436-00550@_33332@5z082448+21390@_t @?,_082448+02010@_N@Oq~K082512+30370@_N@6j082512+05080@_\(@>hQ082518+30350@_Ӡm:@KaP082518+55400@_,_@9 082524+25170@_m:ӡ@>no082524+30360@_zG@DU:Ӡm082530+40500@_@%N082524+10420@_Ւ,_@KX%082524+55400@_i6@PI082524+67110@_N&7I082536-01220@_b0@QAò082536+69130@_\(@KI082536+55100@_ˮzH@>g082536+30350@_i6?--082536+00110@_?082536+01100@_K@1w$h082542+17380@_΁N@AS` `082542+34500@_,_?}'}'082542+00270@_p =@n]L;082542+02360@_K~@6 u0082548+22140@_,_@!wHY082548+08540@_%X@>sʆA082548+30370@_ @t@CO082548+38240@_"""""@1'}'082606+17430@_ޖ/b@Kض ` 082600+55500@_b/@HcX%082612+48560@_,_@JY>>082612+52520@_Σ =q? +=082624+00470@_@?#Eh082618+31500@_UUUUU@FxdۗS082630+45060@_UUUUU@. s082648+15140@_/c@J&O082700+52280@_~K@5}&8082706+21400@_\(\082706-00590@_Q@E~ܺvT082712+43090@_t @@1Bn]082712+17260@_:Ӡn@N\(082718+61100@__,@23 082742+18220@_ =p ` `082742-02440@_33333@CϷ.082742+39470@` O@R082800+74350@`t A@Kll082818+56010@_/b@;&082824+27450@_~K@"u0082824+09380@_Q쿷}'}'082824+00040@_Q @#5 +082830+09470@_Q@6#082836+22120@`m:Ӡ@Rò082824+75200@`%Y@JM s082842+52460@`,_@N082842+61580@_,_@,_082912+30420@`O@6082912+22440@`R@3II082924+19470@`\)@ 082930+03480@`* =p@T#~K082900+80440@`\)@Pm:082930+66200@`Q@>ZG{082930+30320@` i6@KG$h082936+54430@`p =L;*082936-02000@` i6@JD(\082936+52420@` @t@Lh8082954+56590@` zH@D(\082948+41160@` @KFAu1082954+54420@`Q 5y082954-03020@`X%ò082954-00440@`""""#@Li6082954+57430@` _,@D5yG083000+41260@`N@9-083000+26110@`Ӡm:@:i6083000+26110@`wwwww@K r083006+55420@`X%@L6i083006+57450@` N@DEg083012+41420@`=p ?'}'}083012+00240@`zH@0^o083012+17090@` @t@=F083018+29430@`@JHYk083024+52110@` X%@3X%Y083024+19310@`6jb/c083024-00520@`N@IP?/083030+52000@`NAll083030-02220@`Ӡm:@Qqr083036+70470@`UUUUV@C/b083036+39590@` @;T2083036+27540@`+p >@S4083036+78120@` wwwwx&7I083048-02210@` @t083048-03200@` \(@*/b083048+13130@`X%@:083054+27090@`jDDDDD@Uo\(083000+85550@` X%@#-083054+10070@`i6@J[m:083100+52540@`"""""@@7$h083118+32370@`\(@Jjt @083124+53000@`Q@C.o083124+38320@`Q@K083124+55590@`33333@DEg083130+41230@`m:Ӡ@=vT2083124+30060@`/b@.zG083130+15270@`,_@Jei6083154+52580@`:Ӡm?@t 083154+01500@`b/@B˩083154+37260@`=p ?ȑ083200+00220@`=p @eC 083200+05560@`t @_,`083200-02220@`(]@=&7083200+29530@`(fffff@Qq&7083206+69580@`G{@. 083212+07550@`K~@Yj083224+30430@`~K@9 =p083230+25120@`@CE[[083230+38440@`!\(@I5@t083230+50360@`g083236-02560@`b/@D2˪083254+30260@`083300-01400@` \(@9M^o083306+25470@`!@9#Eh083312+25170@`\(¿qq083306-01350@`wwwww?X%083312+01540@`" @t@<\(083312+28140@`$@CX%083312+38180@`"""""?II083318+00520@` p =?Eg083330+01300@` N?NN083330+02040@`2i6@QAL;*083330+69130@`)"""""@FQ083342+45200@`#Q@%J=p 083342+10490@`(@Dj|083342+41380@`"X%rX%083348-01540@`*@DAu1083400+41440@`-Q@I|083400+51500@`$/bi6j083400-01290@`+N@DHYk083406+41300@`:m:@Qi6083406+71530@`+X&@D&083400+40130@`.X%@GN083418+47310@`'N?4V083424+01580@`4\)@N?.083424+61360@`+,_@8j|083430+25070@`,\(@>083518+25160@`1wwwww@80d 083518+25050@`1DDDDD@34083518+19540@`1i6@2083518+18520@`0@t @4Vx083524+08040@`5@EzG083518+43430@`FN@R_%X083524+73400@`3t A@?zG083524+32000@`/t @ 083524-02170@`3m:@̃rb083530+30580@`3~K@3@t 083530+19530@`3/b@3dۗS083530+19460@`=Q@N|'083530+61080@`3i6@3ò083530+19460@`3/b@1083536+17480@`8~K@D,M^o083536+40320@`9=p @F =q083542+45180@`3i6@g083548+04110@`4~K@ r083554+07230@`= =p@Jt @083554+53380@`5@:Ӡm:083600+07590@`6DDDDE@_,083606+07400@`9wwwww@:8dۗS083612+26240@`6%Y?yF083618+01340@`6,_?b/c083618+01340@`7N@ & 083618+03340@`BzG@L88083624+56120@`ADDDDD@J:aP@083624+52380@`9K~@j|083630+07350@`9Ӡm:@D 083630+04440@`8m:=p >083636-02070@`8b0 =q083636-02120@`Jp >@PʆA083636+67020@`D~K@JOP083648+53540@`R@RlHYk083654+73520@`H\(@M~K083700+60070@`HQ@M,_083700+60070@`LQ@P =q083700+66370@`@~K@&g083718+11110@`S\(@QI083730+71090@`Vfffff@R>O083730+73090@`CӠm:@7083730+23430@`Gi6@Ek*083730+43010@`A\)@W083736+05490@`J@J--083730+54060@`L@t @I,`083754+51260@`D33333@083800+02210@`D/b@ۗS083800+02470@`i@t @S绻083754+79470@`G,_@3ZG{083800+19320@`IQ@4yF083818+21050@`Ib0@3t A083818+19520@`M~K@DT(\083818+40500@`K,_@9<'083830+25250@`Q\(@Jb|083830+52560@`OzG@@oqr083842+33030@`[@PP?/083842+68090@`M~K@2l083848+19020@`L@t @l083854+05090@`P =p@>R083900+31000@`S%X@DVx083900+42050@`Sp =@BDDDDD083912+37230@`]t @@PK4V083918+65220@`UX&@Eh4Vx083918+43000@`UN@DhYj083918+41000@`Vt @@FӠm:083924+45500@`OX%?[[083930+01050@`_ =p@P> 083936+65100@`b~K@Q5[[083930+69010@`ai6@P s083930+67080@`Tt A@;EQ083942+27280@``b/@P>fffff083942+65100@`W@t@B ` a083942+37430@`U%Y@3W083948+19500@`T@%+eC!083954+10460@`UQ@,X%083954+14280@`W =p@9u0083954+25150@`Zt A@FAu1083954+45550@`e,_@QEò083954+69160@`Vp >@,}'}084000+14270@`]@IOO084000+50220@`UUUUUUӠm:084006-00230@`XG{@:K~084012+27000@`WQ@+H084012+13500@`^ =p@IܺvT084012+52110@`[_,@B$h5084012+36220@`l@R?X%084012+73110@`Y@28\)084018+18240@`bt A@Mk 084024+59000@`Z""""#@*,l084030+13160@``b0@H&7084030+49580@`Zt A@%s 084036+10550@`cfffff@K ܺ084036+55110@`[K~@ (Yj084042+08160@`]p =@6N084048+22170@`[zG@ aP@084048+03480@`e@Kt @084048+55110@`b@Dۻ084054+41550@`eX%@JF084054+54070@`aN@A[4V084054+34540@`a/b@@Ӡm:084100+33420@`ai6@>o084106+30180@`c\(@Dج5y084124+41550@`_\(@'W084112+11570@`^\(?Yj|084118+01010@`^6j@yF084112+02540@`i33333@K}:Ӡm084118+55090@`g\(@Gn]L;*084124+47550@`gX&@E}i6084130+43100@`kzG@K7HZ084136+55170@`dQ@2IP?/084142+18280@`d@&] s084142+11220@`h\(@DG$h084142+40450@`zN@R?W$084200+73100@`e~K@#+@H7 =p084300+48370@`r_-@B,_084300+37520@` =p@R|l084318+74070@`ob/@)˩e084306+12580@`o@)=084312+12490@`rӠm:@;X?.084318+27330@`p(\@)n]084318+12590@`qX%@3ZvT2084318+19320@`t=p @4Yj084336+21020@`t%Y@3~K084348+19120@`v\(@<+$h084348+28220@`{Ӡm:@Hlj084342+49440@`uUUUUV@*m^o084354+13240@`uX%@1Gz084354+17560@`vQ@+i6j084400+13540@`wQ@5Ӡm:084400+21550@`ufffff@Cn084400+02350@`v =p@ =p084406+07090@`xR@<݂-084830+31040@`O@I4084830+05150@`~K@JqR084830+53040@`N?;*084836+00260@`Q@Dj/c084836+41020@`N@Q4Vx084842+68400@`N@4Vy084854+03160@`N084906-02100@`X&@0R084906+17080@`N@SOO084900+78250@`t A>?084912-01580@`R@3&7I084924+19150@`X%@DW$h084924+40530@`6i@PX&084930+68060@`N@P084930+68060@`,_@@zG084936+33360@`X%@E5'}'084936+42360@`b0@ܺvT084942+06070@`b/@5ll084948+21370@`_-@I--084954+51310@`/b@S r084948+79530@`Ӡm:085006-02250@`~K ` `085012-01380@`i7@"FX085018+09300@`X%@J3Eg085012+52350@`@D]p =085018+40550@`i6@CYj|085024+39200@`@R-P?085018+72540@`O@"K4V085030+09200@`33334_,`085036-01280@`@LUUUUU085042+57210@`Gz@An]085042+35200@`t A@=|085048+30090@`@U`N085000+85420@`~K@4M^o085048+20480@`Q@2.&7I085100+18220@`m:Ӡ?i6085106+01440@`%X@JdۗS085106+53530@`\)@K~085112+05260@`b/@G-085112+47170@`G{@@W%X085112+32520@`(\@1nzG085118+17370@`X%@B96j085118+36380@`m:ӡ@EC` `085118+42430@`6i@H&085118+49200@`@@Qb/085118+32490@` =p@7(085124+23210@`,_@Qm:Ӡ085136+68280@`/b@COP085130+39440@`b0@~K085130+07100@`"""""?>>085136+00410@`i6@M],_085142+58550@`p =@4g085142+20470@`Gz@48Q085154+20250@`i7+@JeC 085430+52230@`ʻ@^o085442+03060@`b/@u0d085454+03160@`Ӡm:@4\(085500+20190@`,_@IvT2085500+52050@`,_@1SʆB085506+17170@`i6@( s085506+12410@`@085512+07560@`Nə085512-00010@`,_@)'085518+13110@`ظQ@J⡐n]085518+53570@` @t@C>>085536+39420@`Q@K~085706+05150@`m:ӡ@AUò085712+34510@`@GW~K085718+46530@`@0/b085718+17070@`t @@=4V085718+30000@`Ӡm:@1h%Y085724+17360@`Q@9rb085730+25470@`說@JraQ085724+53250@`zG@}'}085730+07550@`fffff@J2˪085730+53250@`i6@RS$h085730+73300@`R@ ll085736+03220@`DDDDD@1`ܺv085742+17340@`\(@Ku0085748+55140@`m:ӡ@KUUUUU085748+55140@`/b@17HZ085754+17490@`=p @Aᙙ085748+35570@`,_@Ni6085800+60210@`O@Oqr085800+64000@`i6@%<'085818+10490@`~K@4qq085812+20490@`m:Ӡ@&1R085818+11170@`33333@n085830+06180@`zG@2+@#Eg085848+07130@`/ceC 085848-01400@`6j@ DDDDD085854+03550@`t @@&*Au085900+11160@` @t@)raQ085900+13110@`t @@Q_. 085906+69420@`Ӡm:@7cʆA085912+23350@`/b@'DDDDDD085918+11500@`N@0֯7H085930+17020@`Q@ OO085930+08300@`G{@ '085930+03400@` =p@6SʆB085936+22510@`O@ ò085930+03400@` @t@- &8085930+14440@`~K@ \vT2085936+03210@`(\@9II085942+26080@`\)@?F 085936+31280@`\(¿@t A085948-00540@`t A@9k4V085948+25360@`K~@D7,`085948+40380@`R@ zG085948+03340@`\(@I +085954+52110@`6i@1 085954+17550@`R@1\(085954+17550@`Q@*7SʆB085954+13180@`p =@%085954+11020@`~K@K_,090000+55470@`6i@A 2˪090000+34170@`\)@>eC 090012+30470@`Q@+Cn090024+13500@`~K@$M4Vy090030+10210@`Q@#=i6090030+09490@`\(@9ra090030+25500@`X%@4G{090036+20510@`Gz@$ 090036+10130@`Q@+c =p090030+13540@`N@+g090036+13430@`@=K4V090042+29290@`/bqq090054-02230@`Q@+X +@ N090048+03340@a@I\)090100+52090@`zG&7090100-01110@awwwwx@Iί7H090100+51500@a,`@MeC 090100+60080@`Q@ 0d 090100+03340@`\)@5N090106+22060@a@5HY090106+22100@aDDDDD@=88090106+30000@a =p@6.090112+22150@a @t@;ra090130+28090@a@1ldۗ090124+17370@a~K@ -090124+03470@ab0@E(ܺv090130+42310@a=p @*R}'}(090148+13220@am:@-0n]L;090142+14480@a6i@2vll090148+18390@a=p @2AP?090148+18270@a t A@Su0d090154+78170@aX%@+090148+13450@aK~@6SʆB090154+22130@aX%@2ϤO090154+19000@aN@@2q#Eg090230+18380@a N@95y090230+25450@affffg@ISʆB090224+51570@a@t @G +<090230+47230@a t A@2P6i090230+18300@a@I&7I090230+51560@a Ӡm:@6+@H/c090330+49580@a_-@AO\(090336+34490@am:ӡ@N=^o090336+60400@a =p@DDDDDD090336+41370@azG@I[?090530+32470@a&X%@B--090536+37420@a*/b@KtvT2090542+55060@a&X%@=^o090548+30040@a# @t?.090554-01250@a'%X@@ Q090600+32290@a/@OO090600+62270@a("""""@@$2˪090600+32290@a%,_@*w$h090600+13270@a%˩f090606-01330@a%,`?#Eg090612+00420@a,zG@FR090612+46100@a&6j@ /b090612+03390@a)~K@3hQ090624+19370@a,6j@CN090624+38140@a0Q@KJOO090624+54460@a*,_@8>ʆA090624+24270@a*~K@4\(090630+20550@a,~K@@ۗS090624+33190@a,t @@@@?.090624+32430@a-,_@BOP090630+37470@a*N@//b090636+16000@a0t A@IvT2090630+52070@a+@/$h090636+16000@a._,@BژvT2090636+37540@a,/b@99+?090818+13380@a=K~@GQj|090824+46510@aV,_@S̑090830+79250@a9\(@3ffffff090824+19360@a:_,@3L_,090830+19300@a<Q@<Ӡm:090830+29010@a<N@@lvT2090830+33020@a<\(@> =p090836+30160@aBQ@Kج5y090830+55530@aAX%@Hu0d090848+49580@aLDDDDD@QC ܻ090854+70480@a;_,\(090854-02410@a=zH@1ʆA090854+17580@aA@FzFX090900+45100@a>/b@1%Q090900+17210@a6T2090948+30250@aKt @@J}&7090954+53110@aH,_@4] s091012+20350@aI@?ܺvT091012+32000@aJ/b@?[4V091012+31330@aJ%X@7 +<091024+23180@aOb/@J%C ܻ091018+52300@ajӠm:@TOO091000+80150@aPӠm:@JQ6j091024+52500@aO@Jò091024+52260@aJ~K@7n]L091030+23170@aH\(@OW$091030+02150@aJ@7 @t091030+23170@aJ\(@1ۗS091030+17510@aJ,_@3^N091036+19350@aL/b@#ra091136+30200@aQX&b0091142-02150@aX~K@E ܺ091142+42140@aS\(@p >091148+07540@aUzG@.rb091154+15400@aVzG@2qq091154+19070@aT,_@ <'091154+08190@aW\)@=|091200+29560@aZӠm:@DuyF091200+41070@aX_,@3}'}(091212+19550@a[%X@?Γ>091224+32000@aZi6@1 091230+17590@a]@F/b091224+44260@a]X%@E"˩091230+42280@a`_-@Jk091230+53030@aZDDDDD@'ŋX&091236+12060@a_i6@F*vT2091242+44330@a],_@.pn]L;091254+15260@a_DDDDD@4˩eC091300+21090@aeb0@J091306+53430@ac\(@E~ +<091306+43120@afzG@J5y091312+53390@a_UUUUU@$Cra091312+10200@a`=p @1"""""091312+18020@a`=p @1 +<091312+17480@ac@EF091312+42200@a`Q@1t A091318+17500@atDDDDD@Rm:Ӡ091306+74330@af_,@H>?091324+49590@aa_-@18091324+17520@adt @@C.091324+40050@ad@D۠m:091324+41550@af%X@F4Vx091330+46020@at_,@Rp#091318+73570@af=p @E33333091330+43550@af6j@F٫4091336+45550@aawwwwx@P?.091330+06330@ab~K@1+aP@091342+31070@afK~@A7 =p091342+34390@ac_,@an]L091342+07180@ad,_@1i7091400+44420@af@42-.091400+20240@aeN@6i091400+07290@av\(@QʆA091400+71560@affffff@&ó091406+11400@ag"""""@1uQ091406+17410@afX%@#dۗS091406+10060@agDDDDD@1 =p091406+17170@amQ@Jqr091406+53120@ag~K@4eC 091412+20140@ahQ@:òn091406+26590@aei7?OO091406+00250@ajN@D&091406+42070@ak =p@E091406+42120@ahN@9m˩eC091406+25380@agN@0M4Vy091412+16310@af@t?T2˪091418+00470@ahR@4P?091418+20160@al"""""@D. 091412+42120@ak@C7H091418+40080@ai @t@1h\)091418+17380@ai =p@4'eC 091424+20210@am\(@F091424+44140@aoN@J_ =p091424+52560@ak @t@833333091424+25050@ak\)@9eC 091430+26100@al_,@3 ^o091442+19160@alX%@2 091442+19100@azwwwww@QLܺv091448+69250@amp =@3091618+64190@aG{@RX%091618+75210@a{@@qr091618+33570@aw@&8091618+06060@aym:Ӡ@4>88091624+20270@a{6i@@~K091624+33500@a{ =p@@:Ӡm091618+33570@ax,_@~K091630+06060@a{UUUUU@:5y091630+27080@a}Q@@ށN091642+33570@a} @t@;u0d 091636+27400@a|@t @3rb091642+19500@a~=p @@ó091648+33580@a{=p @ W091642+08140@a%Y@BvT2091648+37230@a=p @@w091654+33080@ap =@QSʆ091700+71540@a,_@C#Eh091700+39220@a6j@Q-.091700+71450@a@:O091700+26580@a@PN091706+64280@a =p@1EyF091712+17290@a/b@QӠm:091718+72030@a\(??.091718+01090@ab/@5yF091724+05560@a\)?˩eC!091724+01080@aӠm:@PK~091942+04160@ai6@FG#Eg091948+44460@a@t@Kj+@6TzG092248+22330@a33333@ASm:092300+34520@azH@&'}'092300+11390@aQ@&P?/092306+11390@aDDDDE@ò092312+02260@aQ@HY092312+02180@a(\@3b˩092312+19360@ap >@)x +?092336+03200@a~K@Shqq092348+77520@aX%@Q|092348+68400@a~K@5b\(092342+21360@aR@6W092348+22180@a,_@EI,_092354+42470@a@K˩eC092400+55340@aӠm:@092354+08100@aN@SLN092400+77250@azH@J|092400+52260@a"""""@L$h5092412+57360@ai6@6/b092412+23120@a"""""@>pt A092424+30390@awwwwx@7Q092424+23140@aӠm:@HB/c092430+48440@aN@F@?.092442+44440@aX%@@Sm:092448+32520@a =p@p4Vx092448+04090@a"""""@7092454+24090@a =p@=l092454+30130@aUUUUV@FUQ092500+44530@aK~@HBӠm:092454+48430@a6j@(33333092500+12300@aX&@=˩eC092506+30140@aX%@Ie s092500+51020@at @@:bFX092524+26380@aG{@12FX092518+17250@ab/@=ò092524+29560@a@t@OP092524+02470@a/c@CEi6092530+38450@am:@ D 092536+03380@a̙@O>Ӡm:092542+62430@a@t @SN092536+76410@a@OE[[092542+62460@ap =@)<'092600+12500@a,_@>$DDDDD092612+30220@a~K@)P?092618+12430@aDDDDE@F6T2092618+44390@aɮzH@:r˩092618+26400@aG{@Rs$h092612+74010@afffff@Bqr092624+36250@a~Ld~K092636-02200@azG@9zG092636+25460@aя\(@KQ092636+56040@a~K@'JaP@092648+11520@a_,@6 ` a092654+23100@a @t@ۗS092648+07570@ab0@HO092648+49420@at A@5oW$092654+21390@aN@5qGz092700+21400@a\(@Qo>?092706+69590@a\(@Qp092706+69590@a\)@PӠm:092706+68000@azG@AUi6092706+34530@a,_@i6092712+02170@azG@BX =q092706+36540@aDDDDD@==p 092718+29460@a6i@4 =p092718+20170@a܋X&@Pra092718+67500@aQ@:DDDDD092724+26520@aЏ\(@!d092724+09000@a@t @74092730+23530@aDDDDD@H5yG092724+49280@a_,@(\092730+08070@aӏ\(@;Ɲi7092736+28000@a @t@3x +\(092818+30150@aQ@@HYk092824+06470@a@9@?.092824+25280@a@P瀑092836+67500@aX%@L˩eC092848+57430@aX%@A092848+35460@a@=˅Q092854+30010@a໻@AN092900+35450@a݋X&@092900+04430@a%Y@MSʆB092906+59580@at A@I$h092906+52060@aQ@5n]L;092924+21440@aӠm:@ """""092930+08400@a/b@(04Vx092936+12190@a6j@%K~092942+11020@a_,@%Ӡm:092942+10590@a/b?6i6092948+00330@aӠm:@;093000+27440@ab/@G89093006+46230@azG@=@t093006+30100@aN@(ʆA093012+12310@a:Ӡm@@>?093012+34080@a클O@IՂ-093012+51540@a骪@;Yj093018+27500@am:ӡ@A&7I093024+34160@a/b@7"\(093024+23210@a/b@Iòn093030+51460@a,_@@[093030+33530@a/b@C,_093036+40130@a@.P?/093036+15390@a =p@;093036+05460@a =p@F d093042+44290@aUUUUV@I|093042+50140@aDDDDD@-+` `093048+14480@azG@>gwwwww093054+30380@a񪪪@GZn]093100+46560@a"""""@@ʆA093100+34130@a%X@$N88093106+10220@aӠm:@$W$093118+10150@ai6@&/c093124+11140@a_,@$7$h093124+10200@a_,@"UUUUU093124+09420@aN@89I093118+24260@a @t@?.093124+02410@am:@894093136+24260@ai6?ò093136+00290@aN@@%Y093142+32170@ap =@3093154+19460@a󙙙093154-02160@a\(? +>093342+11330@bzG@?W$i093348+31180@b/c@Bd093348+37550@b%Y@?T 093400+31340@bQ?ܺvT2093400+01210@b:Ӡm?093406+01290@b@5wqr093406+21420@b zG@C 4V093400+38180@b@'093406+11580@b @t=p 093418-02200@b =p @3,_093424+20030@b Ӡm:@7. 093424+23490@b X%@0+@HIP?/093530+48470@b@Q@TO093500+84020@b:Ӡm@1 093818+07100@b*R@<L;*093824+28200@b.,_@G|dۗ093830+47120@b*@5HQ093836+21310@b*6i@%K:Ӡm@R[093848+75050@b,\(@&n]L;093854+11410@b.Ӡm:@;X&093854+27530@b4zH@MlOP093900+59050@b.@t @&ll093906+11420@b.zH@-093906+15120@bBt @@S\(093900+76350@b/Ӡm:@*[093906+13430@b//b@'C =p093912+11520@b0 =p@7n]L;*093912+23550@b//b@($h093912+12310@b3N@B,ò093918+36350@b/N@ \(093918+03210@b86i@M|IJ093924+59120@b0wwwwx?Ղ-.093930+00340@b1X&@~K093936+04540@b2~K@j|093948+04350@b3UUUUU@!P?093948+04300@b3 =q@ qr093948+03350@b4/b@eX&093948+07200@b7=p @?8093954+32050@b8Gz@BYj|093954+38030@b86j@D$h094000+41200@b7\(@<~K094000+29130@b4fffff 094000-03280@b6@-R}'}(094000+14540@b6,_@+4V094006+04310@bAN@P~\(094000+66130@b::Ӡn@CpvT2094012+39070@b7DDDDD@(ò094012+12360@b7~K@"'094012+09430@b9@?˩eC094012+32100@b8@6Ư7H094012+23000@b:X%@BHY094012+36280@b8K~@,Ldۗ094018+14220@b9%X@5.Q094018+21250@bZ =p@Tui6094000+82040@bUUUUU@E%X@B +<094042+36240@b?/b@EV 094048+42540@b;,_@"SʆB094048+09390@b?@t@Dó094048+41550@bWK~@S~K094100+80020@b?~K@E7n]L;*094048+42400@bӠm:@#O094112+09530@b@~K@2#Eg094118+18210@b@Q@%j|094124+11130@b?~K@Yj|094124+03050@bFGz@I$h5094118+51550@b@GzII094130-00250@bD(]@@h +|094242+73130@bN @t@@n]L;*094248+34050@bKR@#4IJ094248+09500@bMO@7dۗ094248+23550@bL =p@u0094254+06370@bN\)@AWHY094248+34550@bMGz@0,5y094254+16250@bLi6B\(094254-02480@bQX%@G,_094300+47220@bMQ@DDDDD094300+05100@bZ =p@P094306+68090@b^%Y@R=[[094312+73120@bS6j@FQ094318+46000@bN/c@ʆA094318+03120@bPi6@3q094318+19400@bPzG@0|(\094318+16430@bOQ녿0d094318-00020@bVzG@K6i7094318+54400@bO =p@ (\)094324+03220@bPwwwwx@i6094324+04380@bW~K@K9094324+54410@bP~K?[[094330+01540@bTDDDDD@AOO094330+35330@bT =q@>. 094336+30530@bRK~@ +094336+05560@bX~K@K'˩e094336+54320@bYp =@L \(094342+56200@bSӠm:@3eUUUUU094336+19380@bSi6@"TIJ094342+09230@bR@č&094342+05550@bR@094342+05550@bRN@\vT2094348+03160@bR6j@4Vx094348+03180@bT%X@/ò094348+16080@bT,_@5˩e094348+22000@bUQ@+QYj|094354+13540@bZN@K>094500-01480@b^ =p@"G094506+09220@beX&@Mll094500+59300@b^N@/ @t094506+16050@b` =q@@pܺv094506+33060@b^ @t@Q094512+02510@b^~K@!>>094512+09030@b`@4M-094512+20330@be6j@F aP@094530+44180@bd\(@@4Vy094536+33390@bb(]@?%X094536+04080@bbN ߒ,`094548-03300@brN@RR094548+72310@bf,_@9~K~094554+25430@bet @@"h5z094600+09140@biR@Fi6094606+45510@bgDDDDD@8ۗS094600+25060@bezG@ n]L;*094600+03360@bqN@PʆA094600+67250@bjӠm:@Ep =094612+44080@bh~K@6T2094624+04320@bg\)@n]094624+02420@blX%@F &8094624+44190@bs =q@Pqr094624+66590@bhb/W$i094630-02360@bi,_@ؿ%Y094636+02430@bkm:Ӡ@5u0094636+21550@bkt @@-P =q094642+14540@bm~K@@M^o094642+32270@bo%Y@G+Eg094648+46350@bn@t@CkN094642+39050@bk @t?QR094648+01220@bozG@Ctl094648+39090@bkX%@i6094648+04140@bnX%@A[i6094648+34560@blR@"094700+09140@bqzG@F%u0094700+44320@bmX&?>>094706+00510@bp@?094706+31580@bn%Y@)cra094706+12560@bnG{@$'}'094712+10400@btp >@J%L;*094712+52310@bo =p@"1094712+09190@bwO@OHY094712+62250@boK~@"Sm:094718+09230@bqwwwwx@<W$i094712+28150@bo?˩eC!094718+00510@btX&@H> 094718+48430@boN͞&7I094724+00000@bpGz@)094724+13030@bp\)@)~F094724+12580@bti7@F)ll094724+44340@br/c@?|#Eh094724+31430@bqN@0Ib/094730+16320@bt\)@E,_094724+44000@br_,@*L;*094736+13360@bs =q@)N094748+13000@b}UUUUU@P_n]L;*094748+65440@bu@>~&7I094748+30440@bxQ@GyF094748+47250@bswwwww?QR094748+01480@bv~K@6#Eg094754+22590@btzG@$h094800+05010@bwm:@@094800+33470@bwb/@<'}'094800+28470@bxK~@>&7094806+30490@b{\(@FvAu1094812+45100@by~K@:Ib/094812+26320@byN@/u +094824+15580@bx@"&094830+09140@b{%Y@@x ` 094830+33100@by33333@II094836+05240@by,`@c =p094836+04200@bzDDDDD@O\(094842+08040@b|b/@7n]L;*094842+24020@b{%Y@% =p094848+11090@b{~K@ 4Vy094848+07300@b}fffff@,W$i094854+14160@b@Dm094900+41060@b}\(@( =p094900+12400@b~i6@ --094906+03300@b,_@-p =094906+15100@bQ@)89094912+13110@b~K@=>095000-02130@b\(@7II095006+23170@b =pFW095012+00100@b@3q095006+19510@bN@J5 r095012+52390@b~K@QGz095018+68340@bp =@B [095018+36180@bzH@3n 095012+19400@b@3\M^o095012+19360@b\)@0-095024+16550@bUUUUU@]L;*095024+08050@b(\@vi7095030+08070@bӠm:@&~ܺvT095036+11290@b@t @M+eC!095036+58350@b/b@8= s095042+24280@bDDDDD@S>>095048+08070@bzH?T2˪095048+00560@bwwwwx@uyF095048+08070@b,_@7. 095048+07180@bX%@(BFX095054+12210@b~K@#--095100+09470@bwwwwx@&ib/095100+11260@bzG?@t A095106+01480@bN@7b"""""095106+23370@bӠm:@u0095106+02370@bt A@+:#E095112+13520@b~K@A095112+34220@bb/@R 095112+72270@b/b@RraQ095124+76060@bX%@?7HZ095112+31510@b =q@R r095118+75150@bK~@%7wwwww095124+10510@b_,@7I095130+23310@b@QDۗS095124+69180@b@FX095136+07230@bm:ӡ@KeC!095142+02310@bDDDDD@BM^o095136+37380@bR?h5y095142+00520@bt @@B˩e095148+37550@b@Qk>?095142+69550@bDDDDD@t 095200-01040@b%X@*095206+13370@bi7@"|095212+09300@bQ@0tN095212+16420@b@0uX&095212+16420@b@?}095212+31440@b"""""@,UUUUU095224+14320@b@&2˪095224+11160@bDDDDD@@4095224+33300@b@,,_095230+14330@bQ@2X%095230+06470@bzG@J?.095230+53550@bi6@zG095242+04310@bX%@MII095236+59320@b%Y@B5yG095242+37150@b,`@3K$h095248+19330@bzG@0nʆA095248+16400@bX%@ ?.095248+08370@bfffff@,dۗ095300+05160@bi7@+095318+13470@bQ@Bˎ89095312+37490@b@Cra095312+06480@b/c@B095324+37150@bm:@*4Vx095324+13390@bQ@$ܺvT095324+10440@bN@J|095324+53230@b/c@4#Eg095330+20440@bm:Ӡ@J/c095324+53230@bzH@;:OO095330+27280@bQ@G;ʆA095336+46420@b\(@0 095336+17050@b\)@4{Q095342+20430@b(\@$8095336+10430@b%Y@GzG095342+47390@bb0@4UUUUU095354+20530@b@t @# 095342+10040@b~K@<ӎ89095348+29040@b =p@&S|095354+11240@b~K@H|vT2095354+49130@b~K@$0n]L;095354+10200@bzH@/Ffffff095400+15530@b,_?ۗSʆ095400+01400@bzG@07HZ095400+17030@bN@@OP095412+34130@bp =@/(?.095424+15480@bӠm:@9u0d095424+04000@bG{@N095424+04030@b%Y@Fp =095424+45290@b=p @FraP095430+45080@b@I+@F#Eg095430+45300@b/b@B n095430+36190@b@88095430+05250@bfffff@@SʆB095430+33510@b6i@vT2095442+04460@b@#Eg095442+07260@bi6@9wwwww095442+25450@b/c@ ?.095448+08210@b =p@B,~K095454+36350@b~K@B,Vx095454+36350@b_,@.@HYk095506+15220@bt @@Bp =095506+37310@bQ@$ 4Vy095506+10160@b"""""@-j|095512+15100@b@.7HZ095518+15420@b\(@$p =095518+10410@b =p@@/SʆB095524+32370@bR@$Q095524+10360@bX&@/ 095530+16100@bQ@GK~095542+47580@bN@LR095542+58120@bR@L"""""095542+58120@bX%@< =q095542+29070@b33333@I~N095554+51150@b =p@*\(095554+13290@b =p@@ P?/095548+32180@bzG@?ʆA095554+31510@b%XzG095600-02350@bN@J 8095600+52300@bN?dۗ095606+01180@b~K@37 =p095606+19270@bK@& +<095606+11380@bQ@.³095612+15370@bN@,x095612+14390@bӠm:@15yG095618+18030@b_-@?G{095618+31570@bzH@1FX095624+18040@bQ@/TVx095618+15550@bzH@$095624+10360@b33333@* ܺv095630+13180@b(\@>b0095624+30590@bi6@/zG095636+16090@bN@AFX095642+35380@bN@&fӠm:095648+11260@b~K䱿DDDDDD095654+00000@b@t @Gfffff095648+46290@b…Q@KD5y095654+54470@bi6@$=p 095700+10340@b~K@)+@R G{095736+72250@bwwwwwW$095736-02440@bb0@&X%095742+11350@bwwwww@)095748+13070@b@t ?&7095748+00570@bN@KX%095748+55570@bÝi7@ ܺvT095748+03370@bш@R'095754+72220@bDDDDD@ܺv095754+04390@b:Ӡm@ h5z095754+03270@b~KJAu095800-01550@bӠm:t A095800-02430@b\(@.095800+15310@b~K@6PHYk095800+22330@bm:Ӡ@BO. 095800+36510@bӠm:@4Vx095806+04580@bŋX%dۗS095812-02420@bɧ@t@BlOP095812+37050@bffffg?4Vy095818+01300@bUUUUU+100024+02350@bخzH333333100036-02080@bR@%vi7100024+10590@bܪ@B,_100036+37410@b@t @@?.100036+34000@b =p@M~K100036+58300@bUUUUU@(2X%100048+12200@b޸Q@@` `100054+33390@bߪ@D`d100054+41000@b =p@FzG100100+45170@b@R t A100054+72260@b:Ӡm@N ò100100+60210@bGz@QeC!100100+70480@b6i@0p4Vx100100+16410@b~K@ i>>100106+03550@b =p@J}'}100112+53410@bN@?/100106+31250@bt A@6F7H100112+22310@b߱~K@,q~K100118+14270@b,_@,,_100112+14400@bߠm:@X--100124+02390@bߖ/b?2˩100124+01450@bzG@QSʆB100124+70370@b(\@ W100130+06450@bR@KH5y100130+54480@b=p @C%Y100130+38140@b\(@G\ @t100136+46580@b@+>&7I100142+13520@b~K@ 100142+03550@b@-6j100142+15000@bt @@=]^o100142+29370@b=p ffffff100154-02100@b@t @B +100154+37350@b/c@J~K100200+53240@bwwwwx@E,_100200+05030@bR@GSN100200+46540@b =q@'|100212+12090@b/b@@HYk100218+05180@bi6@LX%100218+57380@bb/@5t~K100230+21420@bt @@M9~K100224+58410@b/c@Mgó100230+59030@bN@3I>>100236+19310@b@3E&7100236+19300@bwwwwx@GeC 100236+05490@b@'u0d 100248+11580@b~K@wwwwx100242+02440@b33333?g100248+00470@b숈@.Yj|100248+15310@b(\@J +100248+52250@b33333? 100300+00190@b@G100300+47300@b쪪@m:Ӡm100300+03170@bm:@S@DDDDD100300+77150@b@$˩eC100306+10310@bN@,@t100300+14350@bӠm:@);*100312+13120@bDDDDD@ò100312+02290@b~K??.100318+00530@bi6@100412+35140@bX&@@89100418+33160@bGzvT2100424-01000@b @t@C| @t100418+39130@b,_@/ +4100500+30470@cX%@E5 s100506+42400@b:Ӡn@*N100512+13380@b\)?@t A100518+00330@bb0 6j100518-03140@c,`@-100524+15030@bQ?p =q100524+00310@bӠm:'100524-02150@czG@I s100530+50210@c,_@?5y100524+32060@c@2OP100530+18570@c =q@SS100530+77320@c =p@#2˪100536+10130@c\)@@Vx100530+33360@c_,@N100536+02420@cm:@0 +100536+17090@c =q@-t @100542+14480@cffffg7. 100548-02170@c,`@(-.100548+12330@c@2;*100554+18290@cm:@)qq100554+12470@c6i?׉4100554+00370@cX%@0P?/100554+17020@cDDDDDUUUUUU100600-00250@c """"#@M94100606+58420@c@"4V100606+09420@c6i@@?#Eg100606+32450@cN@RDDDDD100612+76000@c R@D-&8100612+40370@c_-C ܺ100618-00020@c @.\(100630+15150@c 33333@>&x100636+30240@c zG@%˩eC100642+11010@c6i@OvT2100642+63100@cGz@K@?.100648+54440@c_-@K'100648+54330@c 6i@,q100700+14280@c zG@&$h5100700+11150@c@>R4Vx100654+30340@ct @@Gyj|100706+47130@c,_@d100712+05250@ct @@@ܺv100706+32190@c?SʆB100718+01280@c =p@'UUUUU100718+12100@czGzG100724-02350@cQ@1ܺv100724+17560@cDDDDD@C88100724+40110@c/b@0]'}'100724+16370@c/cVx100730-02130@c,`@1@t 100724+17560@c =q@K|100730+54280@cb0@PQF100742+65310@c%X@28100748+19090@cm:Ӡ@@'.100748+32330@c@t @F100748+46120@c,_@$&7100754+10170@c_-@8jӠm:100754+24400@cQ@2˪100754+02290@cQ@4R100800+20180@c"""""@0n]L;*100754+16560@czG6i100800-01330@c@ʪ100836+31020@ci7@ +100842+06080@cb/?QR100848+00410@c@t SʆA100848+00130@cN@!9,_100900+08510@c!N@G% s100906+46330@cQ@0p =q100906+16410@c\)t @100912-02300@c ~K@7 +100918+23200@c"""""#Eg100918+00100@c Q@ ò100924+03350@c"\(@;ܺvT2100924+28070@c Gz+UUUUU100954+30500@c%Q@I4101006+05040@c%N@ +?101036+39060@c*GzAll101048-02170@c,6i@6vT2101048+22590@c,Q@4,#Eh101048+20250@c.@Caj|101048+39010@c0/b@IN101100+50230@c/ =p@CS 101054+38550@c,,_@ N101054+03380@c/X%@Ck$h101054+39060@c-N@2 4Vx101100+18220@c/6i@CW101100+40040@c/~K@CTۗS101100+38550@c.m:Ӡ@2 HYk101106+18220@c-N$h101106-00410@c0X%@CSQ101106+38550@c.zG@ g101106+03400@cX%@E 101248+44020@cA\(@M67H101248+58400@c?wwwwx@HzaP101254+49130@c<@,N101248+14170@cC@NzG101300+60290@c> =p@2"""""101300+19110@c=i6@O\(101306+07340@cBQ@K=g101306+54440@cADDDDE@Cł-101312+39480@c?@ +101312+07120@cB~K@DL;*101318+41250@c?Q@t @101312+07120@c?\(@101318+02560@cMN@RAu1101312+74360@c@Ӡm:@ll101318+06300@c@@Ѣ101324+05120@cC\(@F,_101324+45350@cBN@B =p101324+38010@cG@N$zG101330+60320@cB@2 =p101330+18500@cA/b@ 4Vx101336+03540@cB@I4101342+05040@cDp >@6SʆB101348+22200@cDX&@5101348+21220@cH~K@Ki101348+55040@cGӠm:@HHYk101348+49530@cD@t@)M@t101354+12540@cEb/@05y101354+17130@cEQ@)'101400+12500@cJ"""""@J ܺ101400+53430@cGDDDDD@""""""101418+04000@cG@!O7HZ101424+08550@cIO@/P =q101424+15550@cIzH@*bj|101436+13260@cIt @ /b101442-03150@cKwwwww@1%Y101442+17200@cM"""""@56i101454+21560@cMK@6II101454+23030@cOm:@Di7101500+41220@cLN@W$i101500+06380@cM @t@j|101500+07130@cO\(@B7HZ101500+37250@cN_-@5ߤO101506+22070@cNNraQ101512-02080@cRDDDDE@DK~101518+41400@cSӠm:@F4Vx101518+46130@cP\(@5Q101524+22050@cbGz@S101524+78420@cQ%X@u0d101536+06410@cR =p@'}'}101536+07170@cYzH@O =p101524+64140@cSQ@5 101542+22090@cRm:@2X%101542+07180@cR_,@ ʆAu101542+03360@cSQ@*]L;*101542+13320@cSG{@6 =q101542+23080@cVzG@C<(\101554+38440@cV%X@Aj#E101554+35050@cWm:ӡ@DNx101600+40520@cU@*s>?101600+13290@cZQ@M@vT2101600+58450@cXzH@G:"""""101600+46430@cWDDDDD@0'HY101606+16240@c\ffffg@MX%101612+58280@cZ@H#Eg101618+49220@cZi6@F$h5101612+46050@cY%X@AVfffff101612+34550@cWwwwww@*P =q101618+13240@cX33333@5H#101618+21320@c_ =p@O6j101612+64130@cW?88101624+01540@c]Q@L/b101624+57400@c[wwwww@F34V101624+44400@c_ @t@K}'}101636+55400@cs =q@Ti r101700+81550@cZX%@ &8101642+05010@c_@JW101648+54130@c\/b@3g$h101648+19380@c_Q@Ffffff101654+45490@c\@N88101700+06350@c\ @t eC 101654-03050@c`~K@CNӠm:101706+38530@ce,_@PK[101700+65260@cp"""""@Su101712+78040@cc,_@J&7101712+54070@ceӠm:@LvT2101718+57280@cazG@;5yG101724+28050@c`\(@ =p101730+08010@cd:Ӡm@E,_101730+43160@caX%@\(101730+07130@cn~K@RSʆB101730+74260@cc\(@0d 101748+07570@cf@E|Vx101748+43130@ccN@ . 101754+08170@ce"""""@9Gz101748+25450@ch@E~ 101800+43140@ceK~@ob0101800+08070@cgm:@9]p =101806+25370@cgӠm:@9N101812+25460@cgQ@$h5101812+06250@ci/b@0LvT2101830+16330@cjb/@;zG101830+28110@cn_-@LwW$101830+57120@cjN@3ò101836+19530@cj6j@8WeC 101836+24360@cl@Bt A101830+38000@ci~K@ :+101918+00400@cozG?ò101918+00330@cr@BJn]101924+36500@cqG{@4 +<101930+20510@cqzG@1l101930+18060@c@S|101948+78510@cqQ@0:Ӡm101930+17030@cr~K@5n]L101936+21500@cr:Ӡm@-d101936+15090@ct@BLvT2101936+36510@cum:ӡ@GW101942+46300@cr@,5y101948+14420@cv33333@HQn]L101942+48530@ct/c@CJ+?102230+13520@c@1All102236+17300@cN@SQ102242+79330@c\(@:u[[102236+26430@cm:Ӡ@433333102236+20150@c_-@1#m:102236+17240@c@+ ` `102242+13470@cX%@/b102242+05120@cwwwwx@1BaP102248+17300@cm:?]L;*102248+00540@cb/@CҼ#E102248+39550@c(\@j|102254+07430@cN@1~K102254+17200@cm:Ӡ@.`t A102300+15270@c\(@:˩102300+26500@c33333@L&7102300+57330@c,`@'zt @102300+11590@cN8102300-01580@c,_@+n102306+13580@ci6?j|102306+01000@ci6?u0102306+01410@c33333@S~K102300+80030@czG@,Ӡm:102312+14370@czG@)kX%102312+12580@cQ ʆA102312-03220@c @t@3S =p102318+19350@c@Fu0102318+45500@c@BW102318+37430@czG@@ dۗ102324+32220@c@4Vx102324+05440@cwwwww@N|102324+61320@c@LOP102330+57290@c,_@}u0102330+04370@c M4Vy102336-03090@ci6@S +>102348+00560@cOO102348-02220@c:Ӡn@.88102354+15360@c@88102354+04310@cN@DF102354+42090@c6i@Ft A102354+44150@c~K@0#Eg102354+16240@c6j@(zG102354+12180@ci7@Au˩eC102354+35110@cQ@5P?/102400+21590@c~K@IzG102400+52140@ci7 =p102400-02350@c@Gn]L;*102400+46190@c,`@C ܻ102406+04070@cwwwww@0j|102406+17060@c@ ]L;*102406+08260@c?~K102406+01150@c@2fffff102412+19050@c%X@< 102412+28540@cN@0,`102412+16230@c~K@ M˩eC102418+08240@cR . 102424-03120@cGzSʆA102424-00170@c@0IJ102424+16160@c@0X%102424+16200@c/c@2n]L102424+18570@c,_@&(\102430+11180@c =p@&g102430+11160@ct @@<R102430+28460@c~K@20d 102436+18200@c?j|102436+01440@c,_@0 /b102436+16180@c%X@2 =q102436+18200@czG?ò102436+01130@c\( &8102436-03040@cX%@Q102448+68400@cN@033333102448+17120@c@&(\)102442+11200@c zOO102448-02560@c@GYj102448+46160@c\(@0>?102448+17120@c\(@M^o102454+03090@ct @@#ʆA102454+10090@c?5yF102454+01310@cX%?4Vx102454+01310@czG@102500+04430@c"""""333333102500-01040@c @t@6Yj102500+23060@c:Ӡn@M6j102500+60010@czG@1F102506+17480@cN@0&Ӡm:102512+16250@c33333@@aq102506+33010@cb/@3} s102512+19450@cR@Jò102518+54070@cb0@1w102524+17430@c@2102842+25070@c,_@(u0102854+12450@c/b@9$h102848+26140@c/b@3s89102900+19420@czG?j|102900+00430@c/c@ʆA102900+04160@cģ =p@PBn]102900+65190@c m:@L aP102912+56190@c~K@ܺv102912+08140@cӠm:@-)I102918+14500@c=p @L[` `102918+56580@c@@t 102924+03190@c=p @K3W$i102924+54380@cGz@;*102930+27560@cN@Mn&7I102930+59070@czHӠm:102930-02110@c@t @(#Eh102936+12190@cN~K102936-01150@c"""""@Eò102942+44140@c\(@;+eC!102942+27260@c=p ܺvT2102942-01180@ct A@L_b0102942+57000@cX%@P/ó102942+65010@cĈ@3 r102954+20010@c =p@P N102948+64460@c33334@([*103000+12260@cb0@3N103000+20110@cX%@/8103006+16070@cfffff@@R+i6103136+72550@czG@FP4Vx103142+44530@c6i@P 103136+64430@cN@F}'}(103154+45320@c@]L;*103200+06550@c@t @103200+06530@cN@5ò103200+21550@c߅Q@R'raQ103200+72510@cմN@&dOP103200+11270@cأ =q@GG~K103206+46490@cؠm:@F_103206+45000@c%X@FaP103212+45210@c,_ƿN103212-01430@czG@Ebn]103212+43010@cٿ%Y@FL @t103212+44520@cג,`@.2˪103218+15440@cٿ%Y@CC33333103218+38460@cםi6@Sm:103218+05040@c @t@O =p103218+63480@cb0@SʆA103218+05040@cӠm:@B,_103230+37550@cX%@',_103236+12110@cܣ =q@F(vT2103242+44350@c@ wwwwwx103248+03490@c=p @>103530+05090@c%Y@LF103530+56490@cN@I103536+06120@c"""""ۗS103536-02240@cQ@JdۗS103542+53450@c/c@FB/c103542+44470@ci6@#Eg103542+04110@cN88103554-02190@c @t@&o103600+11280@cQ@(I4103612+12230@c=p @b/103612+05570@cDDDDD@Dó103612+41570@cGz@zG103618+05550@c@G>>103630+48120@cG{@G|103636+47390@c/bAu0103636-00090@cwwwww@-4Vx103636+15060@c =p@)%X103648+13150@czG@1Ա~K103648+18050@cQɫ4V103642+00030@cDDDDD@GSʆB103648+48110@c:ӠnN103648-00080@c\(?~K~103648+01580@c\)@. 103654+06030@c33333@9R\(103654+25350@c@t @nzG103654+05220@c =p@:=p 103654+27000@di6@Q{ó103700+70120@c @t@'K` `103706+11550@dzG@CO103700+39230@cQ@8eC 103712+24210@d\(@C>]L;*103724+38450@d%X@36i7103730+19280@d,_@D 103730+07500@d/b@$n]L;103736+10350@dK~@5>103736+21530@d_-@ob0103736+05370@dK~@CdۗS103748+39200@d@+>Q103748+13530@db0@"] s103748+09270@dN@CeC 103748+39200@d(\@(ll103748+12330@d /b@B/.103818+36380@d6jdۗS103818-02030@dUUUUU@wwwwx103818+06150@d@S_eC!103818+77460@d @E04Vx103824+42380@dt A@T9 r103900+81100@d @zG{103836+06380@d b/@+0d 103836+14100@d ~K@r˩103842+06370@d (\@B +qq103924+31030@d%Y@2?ۗS103924+18300@dzG@7%X103924+24000@d@+~o103930+14000@d@N*"""""103936+60350@d%X@<Au1103936+28170@dӠm:@0I103942+16330@dR@.Q103942+15360@d@88103942+06280@dfffffۗS103942-00070@d@t@SʆB103954+03010@d@t@A9>>103948+34430@dzG@7󲡐n103954+24130@d6i@,5y104000+05180@dt A@/,`103954+16000@d#R@S;*103942+79230@dX%@:ó104000+27060@d(\@Dq104000+40240@dwwwwx@*Q104012+13430@dt A@p =q104018+06070@d%Y@Qo =p104018+70010@dK@Q$h104018+70380@dX%@C5y104012+39180@db0@4l(\104018+20410@d@K 104024+56020@d%@t @S3}'}104024+77050@d~K@?ò104030+31470@dffffg@Dc ܺ104030+41030@d!6i@Q +104030+70400@d@C104036+39570@dffffg@3104048+19190@dG{@K~K104042+56000@dN@8l104042+25100@d't @@S, +104136+30590@d"b0@,*|104142+14210@d#zG@2|#Eh104142+18450@d"=p @M4Vx104142+03030@d/t @@SFW104136+77220@d"@Yj|104136+03030@d#/c@5qr104148+21590@d%6i@Ca>>104142+39010@d#N@2X8104148+18360@d%%Y@C'zH104148+38340@d$@:.o104154+26270@d&@C. 104200+38260@d0"""""@ReC 104200+75000@d(_,@E4Vx104212+43580@d'6i@;x +?104218+58500@d1b/@RVvT2104218+73370@d(X&@$_#Eg104224+10270@d)DDDDD@6 @t104230+22200@d)=p @2104230+19140@d(~K?4Vy104230+00430@d(/b?W$104236+00230@d+N@Co104230+39260@d+UUUUU@COP104230+39260@d+=p @=8 + s104418+30190@d:\(@GzG104424+47410@d8@1F ` a104424+17320@d9~K@A[104424+35360@d8,_@ 104430+07300@d9~K@ ` `104430+07320@d<O@I/b104430+52080@d=b0@Mdۗ104436+59400@dE/b@S3raQ104424+77050@d;X%@CwۗS104430+39120@d:@1/b104442+17520@d9~L@L m:104436+56200@d:,_@,#89104442+14200@d=N@CvT2104448+39120@dC,_@R33333104442+72400@d=b/@CwII104448+39120@d;X%@15yG104448+06190@d;X%@#Eg104448+07310@d=@t @:KraQ104454+26330@d<Gz104500-01130@d= =p@+%Y104506+14150@d=X%@&'104500+11220@d@(\@EۗS104506+43260@d?Ӡm:@:@6i104506+26310@d>i6@))4104512+12510@d?,_@%˅Q104512+11110@d@%X@104536+05160@dCQ@C2-.104536+38400@dB@t @)Bj|104542+12540@dB@2t @104542+18550@dC@t@:yF104542+26510@dB?ò104548+01070@dC@)d104548+12480@dC@&7I104548+07140@dC =q@M^o104548+05050@dF/c@I~K104554+50180@dDX&@). 104554+13150@dG@H104600+48180@dDN@>F104554+05040@dG(\@G\DDDDD104600+46590@dF@t @:Q104600+27020@dHzH@J*G{104606+52360@dJzG@M,(\104612+58370@dEt @ Yj104618-03190@dG(\@,?,`104618+14240@dGQ@,p =q104618+14290@dG/b@(c =p104618+12280@dG =p@*dۗS104624+13170@dH_,@3104624+19450@dI@;i6104624+28110@dH6iп}'}'104630-00220@dIm:@6 @t104630+22170@dIi6@104748+09010@dSi6@1104742+17500@dT =p@3Q104748+19550@dVӠm:@Gk =p104748+47070@dT33333@4Ug104748+20370@dTzG@)#Eg104754+12460@dT\(@/aP104754+16100@dTzG@!OP104754+09020@dV@ʆA104930+30200@d`Ӡm:@ OO104930+03380@daN@)SʆB104930+13040@d`N4Vx104936-00170@dcӠm:@F6j104936+46100@dab/Gqr104942-02070@dbt A@1\(104942+18120@dd(\@BOII104942+36530@dcwwwww@%--104948+10500@dcm:ӡ@!p =104948+08500@df\(@Hfffff104948+49520@dc@ 06i104948+08210@dd=p @3W104948+20030@deQ@A=104948+34450@dct @@$+@H 105636+50150@d\)@*|105636+05330@d_-?t @t105648+01270@dDDDDE@105648+07150@dzG@IR105654+50170@d@!t @105654+09120@d,_@@4Vx105654+33390@d\(@Is89105706+51120@dX%@I7HZ105700+50190@dN@G Gz105706+46200@d =p@1W105706+17550@d@LܺvT105706+57430@d@$$DDDDD105706+10200@d@P?105712+04150@dK~@F^o105718+46110@d@t @"P?/105718+09380@dGz@$.105706+10200@dQ@Fo105718+46000@dUUUUV@AGz105718+35350@dQ@-ʆA105724+15060@dQ@1l/b105724+17420@d@(x--105730+12300@dQ@$105730+10390@d/b@<105736+29150@dO@+4Vy105742+14100@dX%@$Q105742+10190@dX%@ݕ s105742+06290@d,_@0#Eg105742+16570@db0@bj|105742+03110@dDDDDD@="""""105742+29580@d%X@b/105748+04270@d@-$h105748+15070@d=p @HY105748+04270@d~K@(\105748+06400@d/b@#105754+10130@dQ@(R,_105800+12260@dUUUUU@˩eC105800+02240@dzG@L_,105800+58040@d\)@&ò105800+11410@dK@#t A105806+10090@d/c@C UUUUU105800+38210@d =pqq105806-02370@d6i@1T2105806+17510@d =p@%N105806+10490@d~K@/4IJ105812+15520@dffffg@%tN105812+11000@d\(@FqN105806+45100@dt @@R8105800+75290@d@P1L;*105806+65020@dN@&W105818+11170@dm:@%/c105818+10460@d%X@LָQ105824+57570@dG{@ó105830+04540@d~K@0u0d105836+16590@dN@(ʆA105836+12450@d =q@ m˩eC105842+03490@d,_@$T2105842+10450@d,_@ Au1105842+03540@d6i@ 105842+03490@d@FӲn105842+45550@dN@;?.105842+28000@dӠm:@Sm:105848+03180@dwwwwxHY105854-01560@d@F9b/105900+44430@d@25y105900+18590@d@F:Ӡm105906+45300@d6j@6XN105912+22370@d@0` `105912+16520@dN@Bd105912+38120@dfffff@'X%105924+12070@d@$N105918+10340@d~K@F6j105918+46090@di6@CU r105918+38560@d33333@F",_105924+44330@dUUUUV@ h5z105924+03510@d =p@ReC 105912+75240@d(\@I @t105924+50210@dӠm:@M4Vx105936+59240@d33333@C@ =q105930+38460@d@t@IJ\(105936+50520@d,_@$|/b105942+10300@d =p@ F105948+08450@d@OW$105948+06200@d33334@2HY105948+19020@d\(@P1X&105954+65030@d~K@aP105954+02540@dN@0l105954+17000@dN >F110000-03220@d=p @牫105954+03220@dUUUUU@?%X105954+04190@dQ@t @110000+02530@d~K@IT_,110000+50570@dG{@BdDDDDD110000+37020@dN@1:Ӡm110012+18150@d =p@Au1110006+05390@dUUUUU@@p--110006+33080@dwwwwx@L_,110012+56290@dN@IaP@110012+50290@d@?#110018+32140@dR@1T&110018+17360@dwwwwx@DFX110018+41580@d~K@;8110024+28150@d/b@c =p110030+05220@dG{@ ^o110030+03440@d~K@-89110030+15010@dQ@&'eC 110036+11210@d_,@C =q110036+39310@dX%@ ;*110042+04000@d@ p >110036+03360@dӠm:@4Vx110048+07110@dӠm:@]L;*110048+07060@d~K@)ۗS110048+13050@di6@2",_110048+18240@dQ@F =p110048+45270@d,_@}'}'110054+07080@dN@1Pt A110100+17350@d(\@3TۗS110100+19350@d_,*110100-01140@d6j@<\(110054+29100@dQ@ 110106+03360@dEg110106-01060@dX%@E4Vy110106+43450@dt @@H,_110106+50050@d@F110112+45320@d@L89110118+57410@db/@< b/110118+28180@dffffg@IVx110118+50170@d,_@+8110124+14080@d’,`@G#Eg110130+46230@d/b@ i6110130+08380@d~K@FW110136+07200@dç@t@Fn]L;110136+45240@dp =@Dkn110136+41070@dû@Fra110136+44180@dã =p@C#E110142+38280@dN@F&7I110148+46150@dR@F + +<110212+30180@d~K@F_O110212+45000@dȝi6@All110212+35380@d33333@C 110218+38200@dzG@-aP@110224+15090@d~K@*110224+04330@dȮzH@ƊW110230+08130@dρO@R!110230+72460@d,_@X--110230+04510@dR@C +110230+38300@d:Ӡm-.110242-00310@d/b@CvT2110236+38170@dR@LC*110236+56480@dGz@:]p =110242+26390@dܒ,_@T 110300+83080@d/b@2՞&7110248+19060@dX%@1 110248+17550@d͠m:@AW$110254+35230@dN@3π110300+20040@d(\@4Vy110312+06580@d=p @yF110312+06580@dϿ%X@B4l110306+36400@d΅Q쿡Q110318+00150@dЙ@EaP@110312+43360@db0@ SʆB110324+08380@dϖ/b@t @t110318+02560@d\(@4SʆB110324+21000@dUUUUU@R$dۗS110318+72490@d@=ʆA110318+30120@dQ@wwwww110330+04420@dРm:@ ʆA110330+03350@dN@PW110342+67080@d\(@ 110336+03350@dwwwww@X--110336+04360@dzG@S,n]L;110324+76580@d(\@HS` `110336+48550@d"""""@J +<110342+53390@d\(@1˩110342+17460@d֝i6@LHY110348+57580@dGz@&g110354+11400@dԴN@*.110400+13400@dG{@.--110354+15210@d֏\(@F|110354+46140@d֋X&@E܃rb110400+44000@dfffff@4 +110400+20200@dK~@Iu0110400+51300@dGz@. r110400+15190@d33333@<--110400+28590@dٸQ@PFAu110406+65220@d@PFFX110406+65220@dӠm:@72˪110406+23180@dӠm:@,h?.110418+14280@d؏\(@F>>110412+46060@d@7110436+23130@dג,`@n]110424+07260@di6@2]u0110418+18380@dt @@(ܺvT110430+12200@d,_@<$h110418+28520@dؒ,`@7. 110430+08040@dڠm:@G1110424+46390@d\(@KCʆA110430+54470@dUUUUU@2q110436+18500@dm:ӡ@<qr110430+28480@dӠm:@ò110436+06400@dږ/b@7{4V110436+23450@dڙ@2nF110442+18420@d33333@5\(110442+06340@db0@2nܺvT110442+18420@d(\@P110442+66530@dK~@5?.110442+21560@dڧ@t@#E110448+03100@d =p@ۗSʆ110448+06590@dӠm:@kQ110454+04040@d\(@6+>110554+05060@d?&110606+02090@dO@S--110554+79160@dK~?+@=N110636+29500@d =p@IvQ110648+51130@dzGP?.110648-00350@dN@%~K110648+11070@dN@O%g110642+62340@d_,+o110900+12240@d/b@B_\(110900+37000@dX%@FL;*110900+45500@dm:Ӡ@5y110900+04560@d%XN110912-02100@e\(@R>?110906+72450@d/c@AdۗS110918+35430@e@t @L110918+57210@et @@; +<110924+27510@e@<|_,110924+28450@e@Aj|110918+35430@d~K@ /b110924+03250@e@t @[[110924+03190@eR@KQ110924+54180@eb0@*i6110930+13350@eN@ & 110930+03260@e6i 110936-02040@e@FӠm:110936+45330@e =p@R8DDDDD110930+73090@e @t @S;110930+77120@eN@ll110948+04020@e%X@7Fò110948+23330@eUUUUU?4Vx111000+01430@ep >@9n]L;*111000+25460@eN@"vT2111006+09200@e=p @*111006+13420@e =p@;q111012+27430@e@t @<6i111012+28160@e \(@M_,111018+60110@eӠm:@rn]111024+08080@e i7@L=C ܻ111024+56450@e fffff@;ll111030+28050@eN@&8111030+06550@et @@b0111030+05300@e~K?fll111030+00160@e/c@111030+07580@e @t@JAu111030+05200@e zH@Ȉ111036+05280@e \(@9ܺvT2111036+26080@e Q@ Au0111042+03560@e /b@>Q111042+30520@e zH@`$h6111048+02490@e Ӡm:@^Q111042+05220@e ,_@ll111048+02490@e t A@[[111048+02490@e =p@6(Yj111048+22260@e ,_@$%Y111054+10460@e t @@G˩111048+47510@e /c@H"aP111054+48330@eN@OO111106+64130@e p =ߒ,`111106-02200@e b0@.111106+06580@e =p@K/c111112+55590@e =p@#,_,111112+09520@eR@% m:Ӡ111118+10500@ezG@LdzG111112+57040@ei6@)6j111118+04330@e@(+Pm:Ӡ111154+30350@e@)111200+13050@ep >@ ` `111206+04170@eӠm:@AHYk111206+35460@eb0@P?/111206+04170@e33333@&AGz111212+11240@em:@QT4Vx111206+69350@e,_'}'111212-01510@e@@4111212+34060@e@?"""""111212+31470@e6j@NYN111212+60580@e~Kll111218-02340@e@ME'}'111218+58490@e\)@ Yj|111224+03530@eb0@9UUUUU111230+26100@eK~@W$h111230+04210@eX%@?#111224+31180@eR@KvT2111224+56140@e\(@=zH111224+29480@eӠm:@-aP111230+15030@e\(@1C33333111236+17320@e~K@KaP@111236+55440@effffg@G>>111236+47430@ep =@;fӠm:111236+27400@eR@A?.111236+35460@eQ/7HZ111248-03290@eX%? r111248+00230@e@2;*111248+18230@e @t?@t @111400+08140@e&6i@2Vx111406+18170@e&m:@:l111406+26490@e( @t@IJG{111412+50530@e'/b@@H?.111412+32520@e'N@@KQ111412+32520@e'p >@A,_111412+35310@e&@1˗Sʆ111412+18040@e'K~@2 :Ӡm111418+18190@e(t @@B˩111418+36250@e)"""""@Gy+h--111524+30410@e1X&@>eQ111530+30400@e3_,@Mddۗ111530+59050@e1Q@u\(111530+04530@e1\)@:ܺvT111536+26540@e2 =p@FHY111530+46020@e2:Ӡm@?111536+63330@e2UUUUU@2ؿ%Y111536+19070@e2zG@111536+04050@e2,_@6oO111542+22430@e46j@M111536+58170@e2X%@2i6111542+19000@e2@~K111542+04080@e3,_@9R-.111548+25350@e3wwwwx?ܬ5y111600+00420@e4X%@7x +@MNF111548+58540@e4i7@)ll111600+12590@e5_,@Q@M$h111648+59340@e;~K@ i6111648+03280@e?i6@K;4Vx111724+30460@e@33333ò111730-01250@eCX&@M'}'111730+60080@eA=p u\(111736-02460@eD,_@L @t111736+58040@eBi6@)raQ111736+13160@eB,_@A M^o111736+34220@eBUUUUU@+,rb111742+13520@eBzG@3 111736+02480@eBDDDDD@. 111742+03140@eB_,@H?.111742+04360@eB%YUUUUUU111748-02380@eEUUUUV@Iij|111748+51070@eC~K@ b0111754+03510@eD=p @:i7111754+27150@eF%X@LYn]L111754+56590@eCN@i6111754+04240@eF_,@LYeC 111754+56590@eGb/@O 111754+63410@eEUUUUV@?88111800+31300@eHG{@Q\6i111800+69440@eG6i@Lx%Y111800+57140@eD\(Gz111806-01130@eE""""" _#Eg111806-03160@eFwwwww@@%'}'111800+32340@eE =p@,_111806+07540@eE 7. 111812-03000@eF@3_b0111812+19380@eF33333? s111818+00440@eHb/@J[[111812+53270@eFffffg?u0111818+00440@eFt @?>?111830+00480@eK@R4dۗS111800+73050@eF\( .zG111818-03220@eGwwwww@3P?111818+19540@eGK~?zG111824+00270@eH @t@8M@t111818+24350@eK~K@QR/b111824+69340@eHӠm:@5VAu1111818+21370@eHQ@A, @t111818+34370@eG[[111824+00110@eG =p\(111824+00110@eH =p@?@111824+31310@eGX%?~K111830+00480@eMp =@R5UUUUU111818+73060@eHO +@*!ll111942+13210@eTK~@IDDDDD111942+51490@eUX%@PHYk111948+64210@eSQ@8Lrb111948+24340@eT33333@C?.111948+40090@eTi6@8G111954+24320@eS@t@%X&111954+04330@eU33333@BR111954+38020@eTGz@ʆA111954+07470@eTQ@4DDDDD111954+20590@eUzG@@333333111954+32400@eV@t @I\(112000+51300@eUi6@IJ112000+03240@eUUUUUV@*>>112006+13360@eUi6@( 5y112006+12180@eWN@I>>112000+51300@eV @t@ r112006+07470@eW"""""@A+m:112006+34370@eW @t@;g112006+27520@eW@AAu1112012+34230@eWK~@0 =p112018+16520@eVNIb/112018-02380@eWb/@*P?112018+13430@eXDDDDD@A?zH112018+34470@eWb/ll112024-02400@eX,_@>zAu112024+30450@eYp =@A>Q112018+34470@eX~K@>>112030+05550@eX~K@&112030+03050@e[N@IrOO112036+51120@eYb/@ll112036+03040@eZ @t@*?.112042+13400@eZX%@+Bj|112042+13550@e[DDDDD@@"""""112036+34060@eZN@hdۗS112042+06080@eZeC 112048-00390@e]"""""@J4V112048+54070@e^"""""@L +<112100+58050@e\~K @t112100-01170@e_i6@Ju +112106+53120@e^ =p@1ll112106+18050@eat @@QZt @112106+69420@e]@ W112106+03170@e`(]@K33333112106+56140@e^33333zG112112-00500@e_\(@CH112118+38500@e^%Y?%X112118+02000@e_X%@I112118+03220@e`@F}'}112118+46060@e_X%@+?112354+59260@evQ@Pt A112354+64250@eu@A&7I112354+35420@etX%@&Gz112400+11430@ewX%@Oo112400+63420@ev%X@C112400+39320@eui6N112406-01250@evwwwww@AN112406+35310@euX%@)X%112406+13070@ewX%@2Q112418+19060@ew~K䲿&7H112424-01030@ez\(@M6i112430+59550@ex6i@*z+?112512+06250@eDDDDD@RF113100-02000@eQ?˩eC113100+00400@e@7i4113100+23410@e,_@JN113106+53250@eG{@@Q113100+32540@e =p@1eyF113106+17400@e\)@5aYj|113100+21390@e@Ió113118+51330@eG{@H113112+49200@ei6@7 113112+23550@ei6@6O113118+22350@e6j כ$h113130-03190@e =p R113130-03190@eR [113130-03190@e@H-113130+49190@eN@A(113130+34350@e=p Q113136-01180@e\(@)Au1113136+12480@e~K@QW113130+71490@em:@*&113142+13370@e =p@/R˩113148+15560@ezH@@113148+33270@e~K<#Eh113148-02150@eQ@ #Eg113148+03320@e@4^Q113148+20380@e\(@Hx8113200+49140@e6i@HzaP@113200+49140@ep =@G~Q113200+47160@e,`@HI113206+49210@e,_@_#Eg113212+03110@e@9HY113212+25470@eGz? s113212+00310@e@&113212+11320@e@I>?113218+51310@e=p @KlN113218+55080@eX&@KT_,113218+54560@e/c@/^ܺvT113224+15570@eK~@ ,_113224+08450@e6j@IvT2113230+51270@e@i>>113230+02490@eQ@OSʆB113236+63250@e\(@L*113236+57550@eQ?7HY113242+01550@e=p @Kw. 113242+55120@e =p@Kyu0d113248+55130@eN@K;*113248+55480@e@M)u0d113254+58360@eb/@O =p113300+63460@ei6@97H113300+25200@e%X@Ho113300+50010@e =p@+\qq113300+13580@e =p@QK~113300+70480@eR?[[113306+00250@ewwwww@KC ܺ113300+54470@e@t @AaP113312+35360@e~K@O˩e113318+62320@ewwwww@K113312+55210@eQ@7/c113312+23160@e6j@Fqq113324+45340@e/c@ (\113324+08350@e =p@MOP113324+60150@eUUUUU@On113330+63230@eYj|113336-02490@eÅQ@Q˩113330+70270@eUUUUU@$/b113336+10200@e @t@6nQ113336+22420@eT2113342-02350@eÈ@M113336+58290@e=p @.?.113342+15450@eª@4X&113336+20480@e™@.#Eg113348+15470@e’,`qr113348-02340@ezG@HYj113348+49240@e =p~K113354-02320@eb0@3Ϸ.113348+20050@eG{@5#113348+21520@ezG@:_,113348+27090@et @@B4&113354+36400@e~K@HN113354+49200@e%X@n]L;*113354+03010@eŧ@t@KlDDDDD113354+55080@e~K?$h5z113400+01060@eQ@1~K113406+17550@efffff@K%[[113400+54340@eGz@*|113406+06340@e~K@64Vy113412+23160@e6i@Kib/113406+55060@eǸQ@Kò113412+55260@e@4#Eg113412+20170@eƅQF113418-01580@ezG@5113424+21170@eb/@M50d 113418+58420@e:Ӡm@37HZ113418+20160@e=p @3#113418+20140@eGz@1|113418+18100@e:Ӡm@~>113418+04240@eǧ@t@yF113424+05460@e@t @/$DDDDD113430+15510@eȏ\(@85y113430+24230@eȒ,`@)OO113430+13120@e,_@ /W$113436+08220@eR@DDDDD113430+03070@e,_@F\)113436+46030@eDDDDD@. 113436+03060@e/b@N,_113442+62020@e @t@>)113436+30260@e@.p =113436+15420@eR@1 =p113436+18070@e@0113442+17090@e\(@9u0113448+26020@e33333@R05y113442+73020@e\)@@ Q113454+32310@e%X@?\dۗ113454+31380@e @t@6fT2113500+22410@eX%@0]L;*113500+16500@e~K@GOO113500+48100@eα~K@L}'}(113500+56250@e6j@6}'}(113506+22170@eλ@GYj113506+48090@ewwwww@6ܺv113512+22580@e΋X%@67H113512+22180@e =p@M +<113512+59530@eN@Gn113518+47450@e~K@5b/113518+22150@ei6@5̖/b113524+22050@et A@zH113518+05470@e\(@G(\113518+47450@e,_@5*113518+22150@eQ@5M^o113524+22160@eK@A˩113524+35280@e%X@Ma113524+59020@ezG@&d~K113536+11280@e/c@? =p113536+31560@eѻ@(9u0d113536+12240@eӠm:@Gó113542+47430@e@4x113548+20490@e\(@4@t113554+21010@e@4. 113600+20490@e =p@@qr113554+34080@ep =@W113600+07140@e֧@t@Q"aP113606+68500@em:ӠIJ113600-00550@e@1,_113600+18060@e~K@AEg113600+36020@e@t @U +113606+04040@e~K@@qr113606+34040@e\(@Q$n]L;113606+68500@et A@E'}'113612+43260@eUUUUU@ X&113618+03510@ezG@F͕ s113618+45540@e(\@K r113624+55560@eb0@EzH113624+43310@e؁N@:\dۗ113624+26380@et @ۿaP?113630+00040@ewwwww@C#E113630+39360@et A@@. 113636+34120@et @@M"aP@113636+58330@e/c@L"113636+56320@e,_@1$ò113636+17250@e,_@GAF113642+46470@e\(@#113642+10140@eG{@NE +113642+60490@e""""#@KVx113642+55260@eDDDDD@38113648+19480@eۖ/b@ 113654+03450@e\)@:O\(113648+26360@eUUUUV@OLOP113648+62530@eۿ%XʆA113654-02250@e_,@:Mp =113654+26350@e%X@ @t113654+08020@e @t@4th5z113706+20450@e"""""@ܺvT2113706+04450@eݧ@t @?%Y113700+32110@e\)@?K~113706+32130@e/c@6n]L;*113712+22580@eUUUUU@3#Eg113712+20120@eN@1T2113712+17590@eӠm:@!n]L;*113718+09090@eNX%113724-00360@e߁O@0zG113718+17140@e~K@MNx113724+58540@e,_@F =q113724+46130@e =pt @113736-00370@et AW$113736-00340@effffg@9O7HZ113736+25350@e@t @.113736+15360@e\(@1P113736+17350@e@8j|113736+24590@eb0@.7HZ113742+15370@e%X@1u r113742+17440@e:Ӡm@1t @113742+18000@e⁴N@1 @t113742+18030@ezG@"Q113742+09170@e/b@#Eg113742+03160@e%X@N&Au1113748+60340@eQ@<_b0113748+28400@eNn]L113748-02260@e@!--113748+09080@e䪪@Bm:Ӡ113754+36240@eQ@BXn]L;113754+36570@e:Ӡm@<'}'113800+29090@e\(@4W~K113812+20380@e側N@)(Yj113806+12520@eQ@GE0d 113806+46490@e~K@6nF113812+22430@e:Ӡm@1˻113812+18040@eX&@A˩113812+35280@ezG@\(113812+05250@e:Ӡm@L6j113806+56280@e6j@@HYk113812+33570@e =p@<#Eh113818+05050@eQ@9~K113818+26040@e =p@&Yj|113818+11450@e@Au0113824+05200@e%X@[[113830+05320@e/b@ Au113830+05320@e6i?~K113830+01460@e~K@$sW$i113830+10300@f@VEI113800+89220@ezG?#F113830+02000@e =p@8X%113830+25070@e~K@E ` 113830+43430@e%X@Mb/113830+60100@e\(113836-02320@e=p @GvT2113836+47580@e~K@BE4Vy113842+36490@e@G2OO113842+46400@e,_@3x113842+20140@e""""#@'b0113848+12070@et @@;'113848+28080@e툈@Q4Vx113848+71500@e @t@B#Eg113900+38150@e@t @8#Eh113906+25050@e%X@1>?113900+17210@eN@/O113900+16150@eX%,_113906-01580@e,_@1u0113906+17170@effffg@4vT2113912+20230@e%Y@/X%113912+16150@e(\@7 *113918+23200@eX%@7H113918+02510@e@$$h113918+10350@eQ@@N113924+32170@e =p@$ı~K113930+10400@eb0@$ 113930+10380@e~K@'W$i113930+11490@e@)FX113936+13130@e6i@4Pt A113936+20360@e~K@$88113936+10330@eQ@2geC 113936+18410@e =q?b/c113942+00370@eX%@4+:|113936+30310@e@t @,""""""113942+14210@e򻻻@0,_113942+16180@et @@I̍&113942+51530@em:@KhYj113942+55050@e/c@!113942+09030@eDDDDE@4>113948+20240@e,_@$@t 113948+10330@e@SW~K114000+77400@e@2UQ113948+18360@eb/@:}:Ӡm113948+26460@e =p@2vT2114000+19070@eDDDDE@8ҏ\(114000+25070@e/c@Jc4V114006+53040@ei7@.ò114006+15380@e@!%X114006+09090@e =p@!aP114006+09150@eӠm:@4?.114006+20180@ewwwww@7 ܺv114024+23250@e/b?ı~K114024+00260@e@4Au1114018+20210@e~K@;e&7114018+27410@ei7@H3~K114024+48400@e=p @:B4Vx114018+26330@eGz@7q114024+24130@eGz@3T2114024+19550@eb/@:Fò114018+26340@ep >@: ܺ114036+26510@e(\@3.114036+20010@eX%@3bX%114036+19390@e\(@?tò114042+31450@e =p@J[[114048+53000@e =p@0|;*114048+16460@eO@Bx114048+36230@eGz@5i7114048+21560@eDDDDD@3˩e114048+20010@eb/@9ll114048+25180@et A@$R,_114054+10260@eR@$?.114054+10370@e =p@ qq114054+03400@e%X@7/c114054+23180@e33333@6F114054+23000@e(\@3 ` 114054+19540@eN~K114054-01230@e\(@?u0d 114054+31450@em:@!j|114100+09130@eӠm:@3. 114100+19220@e/b@KzG114100+55190@e,`@$}u0114106+10320@e@4Eò114106+20340@e,_@9uQ114106+25440@e\(@3~K114112+20150@e=p @%R114118+11040@eK@ @t114118+08120@eQ@3 r114118+20100@fUUUUU@Qj|114112+71300@e@32˪114118+20130@f@t@NSʆB114118+60230@e\(@4/114118+20280@et A@4 114118+20210@e@3wwwww114118+20030@fN@> vT2114124+30200@fN@4114124+20180@fDDDDD@3Yj114124+20030@fGz@3 ܺ114124+20130@fK@3%Y114124+20150@f%Y@=߀114130+30100@f@3#Eg114130+20160@f =p@Lb/114130+58140@fwwwwx@B~K114130+37270@f/c@Krb114130+55180@f@t @0_#Eg114130+16390@f@@P?114136+33470@f33333@47114136+20300@fK~@49,_114136+20300@f\)@QnQ114142+70010@fQ@3?.114136+20070@fQ@3~K114142+20150@fN@.5&7114142+15230@f,_@3|114142+20060@fQ@Hj/c114148+49070@f\)@.F7H114142+15230@f,_@ Yj|114148+08270@f@K|114142+55550@fQ@1O.114148+17350@fp >@@p =114142+33370@fX%@4eC!114148+20220@fX%@3ra114148+20060@fm:@@V>114148+32560@fi6@NM^o114148+61490@fwwwwx@4OO114148+20220@fi6@'ۗS114154+11510@fb/@3;*114148+20000@fb/@0ʆA114148+16500@f6i@P'}'114148+68130@fӠm:@%Yj|114154+11030@fzG@4m:114154+20200@fi6@ M&8114148+08270@fGz@4N114148+20220@fi7@9kX%114200+25430@fX&@A>?114200+36140@fX%@L}'}114206+58100@fDDDDD@4 114212+20240@fQ@3[[114206+20090@fX%@1114212+18090@f_,@3 ` a114206+20030@f\(@3˗Sʆ114212+20050@f\(@Pm@t114212+66000@fzG@3dۗS114212+19490@f Q@S$h114230+79580@fQII114218-01190@f,_@3tVx114218+19440@fQ@3Ӡm:114218+20030@f@3` `114218+20000@f/b@>u0114224+31070@fO@:>?114224+27070@fQ@3P?/114230+20150@fQ@3ܺvT114230+19540@f ~K@Nڪ114230+61590@f@t @3*114230+19530@f =p @Hra114230+50000@fb0@4p4Vx114230+20440@f%X@ n]L;114230+08450@f@3114230+20150@ft @ ` `114230-01230@f Q4Vx114236-01290@f /c@3vT2114236+20070@f ~K@3dh5z114236+19400@f X%@:zG114236+27030@f i6Au0114242-01250@f t @@@/c114236+33360@f ,_@@\qq114242+32590@f /b@4SW$i114254+20370@f /cò114248-01360@f i6@M}0d 114248+59150@f ~K@4Φ 114254+21060@f \(@"R}'}(114248+09260@f O?oۗSʆ114254+00170@f ,_@P %Y114254+64470@f i6@P +\'114524+30390@f i6@Bt A114524+37430@f t @@4114524+20170@f!,_@)Vx114536+13120@f!N@*j114542+13290@f"zG@)n114542+12590@f#m:ӡ@9ı~K114548+26020@f#zG@)tIJ114548+13000@f$~K@)u\(114554+13000@f$N@)ib/114600+12580@f%~K@HZ/c114600+48590@f%~K@Mò114600+59200@f%zG@@RӠm:114600+32550@f%@,G{114612+14200@f&m:@N114606+60280@f&N@M0d 114606+59420@f&QB\(114618-01450@f'Q@HV]L;*114618+48560@f'?N114618+01200@f't @@/}'}114618+16100@f'@A˩114624+35180@f(@M\(114624+59430@f(@t OP114630-00500@f(/b@;UX&114624+27370@f* =p@R\(114636+74360@f)@t @;&7114630+27190@f*i6@L -.114630+56200@f*O@:%X114642+26240@f,UUUUU@RHY114636+76170@f*~K@.~K114648+15410@f+N@C,_114642+40030@f*\)@8[[114648+25130@f+(\@:˩eC114642+27010@f+33334@0h5z114648+16550@f+"""""Vx114648-00480@f+zG ~K114648-03140@f, =p@5 ~K114654+21200@f,i6b/c114654-00480@f,Q ?.114654-03110@f,Q N114700-03120@f-\(@H6i7114700+48420@f, =pII114700-01100@f-\(@N/114700+60380@f-~L 88114706-03170@f-Q 114706-03140@f-K <#Eh114706-03150@f-Q@*}i6114706+13310@f.~L@IC|114706+50490@f/=p @Q114712+71010@f. =q $h5z114718-03140@f.X%@4V114718+06570@f/_- M4Vx114724-03220@f/N@5Ug114724+21380@f0_-@. l114724+15180@f0i6@:zW114724+26450@f0@8Sʆ114730+25130@f1m:@E 114736+42200@f1 =q@ܺvT114736+07160@f2~K@E ` a114736+44000@f2~K@9Au1114742+26150@f4~K@SuL;*114700+78070@f2%Y}u0114748-02320@f4,_@IE-114800+50500@f3\(@ǮzH114754+04580@f4@ICn114800+50500@f4\(@E,_114800+06510@f4OE,_114800-02380@f5/b@KC ܻ114800+55370@f4Ӡm:/b0114800-00170@f4t @88114800-01080@f5DDDDD@4?.114800+21120@f5X&@4 =p114800+20170@f6 @t@In]L114806+52070@f5@t @% |114806+10480@f6Q@L:aP@114806+56440@f6Gz@FSʆB114812+46050@f66j@KX%114812+55250@f6@47HZ114818+20470@f7Q@Cp114812+39090@f7Ӡm:@5+N114812+21270@f7X%@>6j114818+31080@f7b/@5%0d 114818+21250@f7t @@-0 =q114818+14530@f8(\@4fAu1114824+20410@f8N@4̺vT2114824+21050@f8N@K˩114830+55210@f8,_@R114836+07020@f9b0@JN114836+52170@f9_,@%DOP114836+10550@f9b0@Il114836+50270@f9\)@5m:Ӡ114836+21170@f;Ӡm:@Jt A114848+53430@f:@5m:114842+22110@f;wwwwx@L4(\114848+56410@f;~K@:ȿ%Y114842+27040@f;_-@A114848+35290@f;%Y@A$h114848+35430@f;\(@6i7114854+22190@f;G{@/Au114854+16030@f<,_@75y114854+24090@fQ@CR114906+38160@f>X%@HWn]L;*114906+48570@f>@ 114912+03210@f>~K@N114912+61500@f?m:@Gh#114918+47050@f?~K$h5z114924-02220@f@i6@Gq,_114924+47090@f?,_@5$h114924+21240@f@UUUUU@I#n114924+50350@f@X%@>QR114924+30360@f@=p @+P?114930+14100@f@DDDDE@0\(114924+17050@f@:Ӡm@89114930+06410@fAzG@0114936+17080@fBGz@r˩114942+04230@fBi6@%2˩114942+10530@fB@t@5+dh5z115430+30400@fjQ@H(\115442+49330@fji6@B5:Ӡm115442+36410@fkQ@L =p115442+58130@fkX&@Q--115442+72060@fk"""""@,l115448+04490@fk:Ӡm@; =q115448+28090@fkfffff@Cq115448+40020@fk,`@כ$h115448+07450@fk@?yF115454+31210@fl%X@@+@9EUUUUU115512+25330@fn =p@6B˩115512+22330@fnt A@;]L;*115512+28080@fn~K@= 115512+29190@fo33333@B2}'}(115518+36400@foQ@B24Vx115518+36400@fo~K@K˩115518+55430@fo_,@x +W$h115548-01400@fs,_8Q115554-01590@fs\(?i6115554+01000@fsm:@L_,115548+57520@fszG?Yj|115554+01000@fszH@$ |115554+10180@fs~K? +?115606+27430@fv~KaP?115612-01100@fvX%@J]L;*115606+53420@fvGz@/nʆA115612+16000@fvX%@E\zG115618+42590@fwi6@EI115618+42500@fwffffg@ib/115618+30410@fwt A@K>115624+54300@fx"""""@99115624+25300@fxN@5115630+22060@fxX%@9UUUUU115624+25220@fx@8'}'115630+25160@fy=p @JZ\(115636+52590@fyUUUUU@B^o115636+38030@fy~K@>*115636+31000@fyNòn115636-00130@fz@EH115642+42500@fzi6@AJӠm:115636+34510@fz6i@t A115642+06280@f{"""""x#115648-01210@f{X%@I{ ܺ115648+51150@f{/b@1q115654+18020@f{Ӡm:@AraP@115654+35100@f{X%@9wó115654+25450@f|=p @>'}'}115700+30260@f|m:Ӡ@d~K115654+07070@f|N@+ 115700+14100@f|@t@ Vx115700+03360@f|Ӡm:@5?n]L;*115700+21320@f}6i tIJ115706-03230@f}Ӡm:@!Cn115712+08550@f~zG@= @t115712+29550@f~i7@>--115712+31060@f~,_@CQ115718+39520@f~\(N115718-01050@f~R@:Mi6115712+26350@f~K䱿ቫ4115724-00150@f,_@Swwwww115712+76320@fN@!}'}(115724+09050@fm:ӡ@ ]i6115730+08280@fzG@aGz115736+07220@f%X@?h5z115742+32050@f(\@?9u0d115742+31290@fb/?ܺvT2115748+00350@fQ@ISSʆ115742+50570@f"""""񙙙115748-00480@f/b?i6j115754+00470@f,_@''115754+12170@f,_@?}'}(115754+32130@fb/@4ʆA115800+20210@f~K@V?.115800+88240@fQ@%j=p 115806+10590@ft A@8*115806+25080@f/b@%%C ܻ115818+10510@f~K@(U +115818+12270@fQ@??.115812+32090@f =p@+#Eg115824+14010@f@9F115824+07050@f?'}'}115830+00240@fb/@,5yF115836+14230@ft @ۿF115836-01000@ft A@#tzG115842+10000@fR ldۗ115642-03230@fwwwwx@15y115848+17490@fQ@"TIJ115848+09270@f(]@*:Ӡm115848+13400@f\(@N򪪪115854+62100@f@,115854+14180@fQ/b115854-00250@fN@QTvT2115854+69370@fzG@zG115906+05020@f~K@̃rb115912+06430@ft A@O)I115912+62370@fN@1 115912+18100@fR@Ib/115912+06060@f/c@4T2˪115906+20370@f =q@0HY115918+16480@fӠm:@6 +?120018+18170@f,_-.120018-01300@f%Y@HQll120018+48550@fX%@:@ ` 120018+26310@fN@s33333120018+05530@fK~@2 =q120024+19020@fi6@b0120024+04310@fQ@b"""""120024+05070@fzH@aP120030+05270@fDDDDE@FDl120036+44480@fm:ӠN120036-02350@fX&@3vT2120036+20000@f\(?6i6120042+02140@f@t@LaP@120036+58100@f =p@LӠm:120036+58100@f@0\(120048+16470@f~K@=kSʆ120048+29420@f%X@4[[120048+20180@fDDDDD@ChN120048+39050@fm:@65\(120054+22300@f =q@0|qq120054+16460@f\(@ p =120054+08390@f(\@1&fffff120100+17250@f6j@ Ӡm:120100+08400@f@088120106+16200@fi6@`$h5120106+02200@f\(@""""""120106+02550@fX%?Q120112+01590@f~K@/c120118+04300@fX&@ b/c120112+03500@f,_@9o#Eg120118+25430@f:Ӡn?@t A120124+02110@fwwwww@/b0120124+07340@f?,_120130+01410@fX%@"nʆA120124+09290@f33333@4;Q120130+20300@fGz@JKm:120130+52520@f~K@?UUUUU120130+32100@f@t @<*120130+28260@f@,!N120136+14200@f?&8120130+02080@fӠm:@4<;*120136+20300@fK~?6i6120136+02070@f@t @4Y+>120206-03150@fb0@?-^o120206+31270@fӠm:@?(8120212+31260@fK~u0120212-02260@f(\@H~K120212+49280@f\(@%1120212+10520@fX&@,F120218+14460@f =q\(120218-02050@f,_#Eg120218-02090@f,_@3?n]L;*120218+19310@fR@:&7I120224+27160@fm:Ӡ@S89120224+76260@fӠm:@Ot A120224+63250@fi6 vT2120224-02550@fQ@5= s120224+21310@f =p@6T2120224+06350@ft A@M \(120224+58230@fDDDDE@6˩120236+22170@f@%WSʆB120242+10570@f =p@S120224+76260@f@%Gó120242+10550@fN@<N120242+29030@fGz@%:Ӡm:120242+10530@fX%@C&7I120236+38310@f =p@56ò120242+21300@fQ@>[120242+31080@f~K@E@t120242+43260@f,_@Ol120254+63260@f~K@1-.120248+18090@fQ@1Q120248+18120@f~K@<]-120254+28390@fӠm:@I-:Ӡm120248+50390@fQ@4OW$120254+20350@fR@4?7HZ120254+20310@f =p@Gc4V120254+47030@f\(@,G{120300+14460@fGz@I#120300+51480@fX&@IE&8120300+50500@f~K@98120300+25230@ft @@!120306+09160@f\(@NzG120300+62120@fӠm:??.120306+02060@f@4K~120300+20500@f~K@@&120306+33230@fX%@4K~120306+20500@fi6?~K~120312+01530@fm:ӡ?2˩120312+01520@f@t @!vT2120312+09160@f@$120336+25500@fzG@?HY120342+32150@f~K@LW$120342+58160@f@J[ʆA120348+53000@f\)@;33333120400+28130@f33334?ܺvT2120400+01540@fQ@<# ܺ120400+28250@fm:Ӡ@Cfffff120400+39300@f/b@<,rb120406+28270@f@1qr120412+17590@fX%@Po120412+67260@f6j@En]L;*120418+43160@f =q@$Yj|120424+10330@fwwwwx@2N120430+18480@fm:Ӡ@EdۗS120430+43200@fK~@Mj120430+59060@f_,@Mj120430+59060@f"""""@@120436+33160@fGz@0ʆA120436+17160@f@0 +>120706+42170@fGz@1>120748-00140@fp =@:nK~120748+26420@fzG@$`120748+10280@fX%?4V120800+00580@fUUUUU@CX%120800+39410@f~K@>fӠm:120800+30400@fԿ%YFW120800+00060@fԒ,`@9mp =120800+25430@fԠm:@9 s120800+26130@f\(@'X&120806+12040@fb/@M&ò120800+58350@f@2ۗS120806+19060@f@0vT2120806+16180@f~K@QO120800+70400@f @t@1޸Q120806+18090@fՒ,`@*eC 120812+13360@f՝i6@133333120812+18100@f~K@C+[120812+38370@f~K@3 t @120812+19190@f֙@C&120818+39450@f֒,`@FA120818+44470@fGz@BO˩e120818+36540@fDDDDD@Cd120824+40020@fםi7@"p[[120824+09290@fׁN@?Q120824+31560@f%X@P ܺ120830+67120@f\(@(5UUUUU120830+12220@f׸Q@OQ120830+64120@f؈?qq120830+01150@f%X@Sl120818+76250@fm:ӡ@I=ò120836+50470@f =p@,dۗ120836+14330@fQ@+,5y120836+13520@fp >@ ` `120836+02320@f\(@4,5y120836+20270@fi6@1W$i120842+18100@fڧ@t ?Gz120848+01460@f@3i7120848+19220@f@A;*120848+36070@f۪@hN120848+03120@fwwwww@R120848+75060@fUUUUV@Ma#Eg120900+59010@f@t @=ò120900+29220@fwwwww@L]L;*120900+58000@f~K@0zAu120906+16460@fX%@(IeC 120918+12250@fX%ʆAu120918-02110@fi6@8.120918+24240@f\(@0;N120924+16300@fX%@DS4V120924+40560@fߒ,`@;~K120924+27550@fߴN@4qr120924+20180@f =p@Pi6120924+68120@fߋX%@DS =p120924+40560@fR?vT2120924+01380@fR@.͂-120930+15410@fGz@1q120936+18020@f6i@B&7120936+36270@f\(@*~K~120942+13310@fi6@(Ӡm:120942+12450@fN@*h\)120948+13290@f@LQ120948+56270@f⁴N@=-4Vy120942+29270@f⻻@#,_120948+10160@f\(@=5\(120948+29290@f@t @121000+12350@f =p@FHY120954+45580@f6ig121000-02270@f=p @AYu0121006+34590@ffffff@DH--121006+40500@f33333@%/b121018+11080@fwwwwx@+>?121018+14150@fX%?ʆAu121018+01350@f戈@Jsm:121024+53110@f檪@Gb|121018+47020@fm:@Pt(\121024+66050@f/b@J!j|121024+52330@ffffff@(N121030+07190@f@1b/121030+17220@f@0,_121036+16220@f =p@)/b121036+13120@f33333@0L'121036+16340@ft @@< ` a121042+29070@fp >@5X%121048+21550@fDDDDD@EYj|121042+43580@f\)@<,_121048+28470@ft @@R4Vx121054+75200@fN@I^121100+51020@fi6@0 121106+16240@fGz@0 $h5121106+16240@fR@G?@t 121100+46450@ft @@.dۗS121106+15440@f@BQGz121112+36550@fX%@*Ӡm:121118+13420@fm:Ӡ@-121112+15100@fQ@ͧ@t121118+07280@f%X@*XvT2121118+13270@fG{@1rb121130+17490@fK@~K121130+07000@f𪪪@8Gz121130+24200@f@-s 121136+15000@f/c@,P[[121136+14260@f,_@#F121136+08030@fNII121142-00330@fGz@KCi6121136+54480@f@@5 +121136+32430@fQ@P˩121142+66220@f%X@AO\(121142+34540@f/b@Ill121148+51360@ffffff@MʆA121148+59530@fzG@@5&8121148+32420@fX%@Lu0d121154+56170@f~K?&7121200+01060@f,_@@Orb121430+63420@gQ@(2˪121436+12340@g i6@%X121436+07540@g 6i@ vò121436+03580@g~K@EyP?/121436+43130@g =p @(?.121436+12440@g Q@ra121436+07280@g Q@.,_121442+15360@g @!121442+09140@g @0 +Vll121718+30370@g@Q121712+07160@gzG?_,`121724+02040@g%Y@=:Ӡm121718+29540@gi6@;W$121724+27540@gzG@_ۗS121724+05370@gb0@9ŋX&121724+26030@g /b@!7SʆB121730+08530@g ~K@] s121730+05370@g t @@-_,121736+15140@g @t@B\(121730+08060@g =q@;4121730+28150@g!i6@DDDDD121736+07580@g N@=G~K121736+29330@g!UUUUU@!J=p 121736+08550@g!m:@~F121736+06550@g!R@1XYj121748+17380@g"UUUUU@ϤO121742+04290@g"N@#. 121742+09490@g"t A?ׅQ121748+00400@g!zG@M >?121748+58220@g"@eC!121748+05400@g",_@=O,`121748+29350@g#=p @JAu121748+05510@g ,`@R =p121748+75470@g#b/@j|121748+07110@g#6i@9121754+25510@g#X&@"P?/121754+09420@g#Q?}'}'121754+01460@g#zG@?,'121754+31270@g$X&?333333121800+01050@g$t @@# r121754+10070@g$6i@C121800+39550@g$%Y@>X%121806+31040@g"\(@R׻121800+75400@g%@G%UUUUU121812+46350@g%m:@=X121812+29380@g%fffff@G ` 121812+46350@g&K~@1ۗS121818+17180@g&wwwww@\(121812+05550@g&O@1|vT2121818+17460@g'X%@&&121824+11180@g&UUUUV@M $h121824+58220@g'p =@8*121824+24570@g'K~@C7%X121824+38420@g(N@ qr121830+04000@g(\(?zG121836+00510@g(Gz@C33333121830+40110@g(b/@C%X121830+40080@g)~K[Sʆ121836-02450@g(6j@COO121836+40100@g)N@<*OO121842+28260@g)O@1|121842+17550@g)zH@2aP?121842+18400@g(%X@N/c121924+30200@g0,_@ffffff121924+05230@g0wwwwx4Vx121930-02190@g0"""""@&7I122036+10540@g8t A@,W122036+14440@g8@t @M8d122036+58440@g9\(@I4122036+06210@g9 =p@,@t 122042+14400@g:i6?b/122048+01460@g:DDDDD@&/b122042+11390@g:zH@/ۗS122048+16050@g:,_@)eC 122048+06190@g;33334@h5z122048+07450@g;,_@3mL;*122100+19430@g;@G7HZ122100+47160@g<@Sm:122100+06210@gzG@%X122112+07280@g>\(@YP?/122118+04220@g>6i@B89122112+36250@g>m:Ӡ@;dOP122118+27400@g;b0@R5y122112+75140@g?/b ` `122118-03090@g>%Y@<3ʆA122118+28290@g?"""""@m-122124+07230@g?=p @ 122118+03210@g?Q@"n]L122124+09310@g?Q@0n]L122124+16580@g@Ӡm:@#89122124+08040@g@K~@@HYk122130+05350@g@6i@(h5y122130+12290@g@i6@,_122124+05270@g@ =q?[[122136+01290@g@@&ob0122130+11300@g@%Y@*122130+07190@g?t A@Hc4V122136+49030@gAi6@nzG122136+06530@gA =p@"č&122136+09390@gA\(?g122142+01300@g@Gz@M1P?/122136+58400@gAt A@ϤO122142+08140@gA@@t 122142+04300@gAQ@?X&122142+31470@gA\(@"122142+09330@gA,_@!ʆA122142+08490@gB\(@">122212+07380@gF@!F122218+09040@gFi7@ 4122218+07020@gFt @@21u0122218+18280@gC,_@RP?122206+75490@gGUUUUU@qr122224+07430@gGffffg@'h122224+11590@gH@<#Eg122230+28500@gH~K@)Au1122230+13100@gHQ@1 =p122236+17170@gH%Y@Q122230+05370@gH@t@9Q122230+26140@gI~K@OP122236+04450@gI@t@-Au1122242+15020@gIR@'ʆA122242+12070@gI,_@/7 =p122242+15540@gJӠm:@)m4Vy122242+13000@gJi6@33333122242+05120@gJm:Ӡ@. 122242+06010@gJi6@:qr122248+26590@gI/b@K@Yj122248+54470@gJX%@$122248+10170@gJN@FzG122248+46080@gK:Ӡm@20d122254+18280@gK\(@0b0122254+16240@gKfffff@0xQ122254+16450@gLDDDDE@ 122300+03430@gJN@P;122300+65130@gLfffff@(g122300+12320@gL~K4Vx122300-02370@gKN@G/c122300+47330@gMt @N122306-02400@gLQ@Fכ$h122306+45580@gMN?QR122312+00520@gM\(@)#Eg122312+13050@gMN@ݕ s122306+07300@gL =p@I+*122306+50370@gN:Ӡm@ 4122312+04470@gN=p @)SʆA122318+12560@gN\(@$~K122318+10440@gO@<#Eh122318+06050@gN,_@F'}'122318+45340@gN@@zG122324+33490@gN @t@IՋX&122318+51570@gO:Ӡm@7HY122318+07500@gNt A@;˩e122318+27500@gN,`@I DDDDD122324+50220@gOm:ӡ@26ll122324+18300@gO,_@ p4Vx122324+03420@gO6j@X&122330+04450@gOQ@$Sʆ122324+10200@gPӠm: 8122324-03110@gON@>ó122330+31060@gO,_@F'122324+45330@gOX%@/W =p122330+15570@gP_,@--.122330+15090@gPQ@'ۗS122330+12050@gON@O6122336+62430@gP\(@0.]L;*122336+16280@gQӠm:@*:Ӡm:122336+13230@gQ,_#Eg122342-01010@gQ/b@)&122342+13140@gQR?&7122342+00330@gR~K@}'}122342+05450@gQ@M)5yG122348+58350@gRK~@;W$122348+28090@gR%X@ =p122348+07440@gR@t @:֯7H122348+27060@gRGz@H?7HZ122354+48460@gS\(@" I122354+09170@gS\)@" 4122354+09170@gTi6@!>122400+09090@gTӠm:@ #Eg122354+08200@gS/b@?9,_122400+31300@gTK~@)8%Y122400+12530@gTQ@+(dۗS122400+13510@gT\(@0?.122400+17070@gT6j@HY122400+04140@gT@"4Vx122400+09180@gUffffg@ #Eg122406+08420@gUN@"8122412+09190@gV=p @5y122412+08120@gVN@! 122418+09090@gVGz@(dۗS122412+12440@gV%Y@#+?122424+11560@gWO@.Q122424+15190@gW@IJ122424+02460@gWi6@BVx122424+38100@gW@6 122430+22550@gXm:ӿ#Eg122430-00370@gXX%@._,122430+15450@gXi6@)II122430+12500@gW\(@J 4122430+52210@gW\(@H#raQ122436+48330@gYӠm:122436-01040@gY33334@ 122436+06090@gY,_@0SW$i122436+16370@gYN@ &8122436+07320@gY\(@". 122442+09420@gYQ@/o122506+31130@g^~K@*&122512+13170@g]t @@En]L;*122512+43460@g^N@:]L;*122518+27160@g_%X@(/b122524+12340@g_N@ .88122524+08220@g_b/@j|122524+06000@g`~K122530-01220@g`Q@#Sʆ122530+10050@g`\(@1NK~122530+17340@g`N@+aP122536+14110@ga%X@(/b0122536+12220@ga(\@4.zG122536+20270@ga =q@$Q122542+10340@ga@+_,122542+14100@g`zG@K+>122648+01200@gj =p@ P4Vx122648+08260@gkӠm:@#F122648+10160@gk@&&7I122648+11430@gk"""""@ ^o122648+08180@gkN@0gzH122654+16410@gk%Y@!HYk122654+09010@gk@ò122654+07030@glӠm:@#122654+08160@glzG@+88122718+27320@gn/b@6_II122718+22390@go%X@,# ܺ122724+14210@goQ@%;[122724+10530@gn @t@Liq122724+57060@goG{@(n]122730+12370@gp~K@. 122730+08120@goQ@Gra122730+47480@gpN@+E,_122730+13550@gn~K@P 122736+64190@gqb/@%W$122736+11030@gqm:@ Q122736+03510@gqӠm:@ܺvT122742+02540@grDDDDD@"+Q122742+09210@grQ@(?.122748+12360@grt @@+'}'}122748+13510@gr\(@ Q122748+04010@gs,`@/b122754+04310@gsN@,R˩122754+14270@gsm:@2II122800+19050@gs/c@3M^o122800+19560@gtDDDDD@([122800+12460@gt/b@D٢122800+41590@gum:Ӡ@"ó122806+09170@gt6j@DFX122806+41550@gvQ@&b0122818+11370@gtG{@Lm:Ӡ122818+57350@gv,`@(N122818+12400@gvt A@ Q122818+08380@gv,_@0FX122818+17020@gwX%@ 122824+03460@gvi6@LT2122824+57340@gwi6@&$h122824+11460@gwN@(122824+12330@gw\)@ '}'}122824+08210@gxi6.122830-02040@gx@Z+Gqr123118+30340@g/c@J #123124+52320@g\(@.&7123124+15380@gi6@̃rb123130+07580@gN?,_123136+00450@g~K?ʆAu123136+00450@g6j@&&123136+11360@g@CAu123130+39180@g/bll123136-00050@g"""""@88123136+02560@g@:123136+26570@gm:ӡ@EC ܻ123136+43420@g@AX%123136+35480@g_,@/b0123136+16140@gX%@(123148+12210@g,_@&$~K123148+11210@gQ@*&W123148+13210@g,`@$h5123148+06450@gN@ eg123148+08280@g@N123148+02360@gm:@#Eg123200+02280@gN@"O7HZ123200+09260@g,_@#?%X123200+09540@gQ@ 123200+06170@g:Ӡm@+P?123200+13470@g@SmX&123154+77590@g =p@23>?123200+18280@gDDDDD@ۗS123206+07260@gt @@ ll123206+03360@g6i@"j|123212+09170@g =p@3 123212+06340@gm:Ӡ@F2n]123218+44400@g,`@1n]L;123218+18050@g,_@/OO123218+15500@g\(@OhN123636+30410@g =q@;K~123642+28010@gQ[[123642-00150@gm:?>>123642+01420@gK~@:-123642+26570@gR@%X123648+05130@gQ@; ` a123648+28030@gUUUUV@i6123654+08140@gzH@;+%X123848+30240@gDDDDD@(Z+?eC 124006+01380@gi6@*dۗS124012+13320@g6i@3q124012+20120@gwwwwx@,$h124012+14340@gQ@&\(124018+11430@g֪@#Eg124018+02580@g֏\(@$ò124018+10380@gzG@: 124018+26550@g/c@*n124024+13320@gםi74V124024-00570@gׅQ@ i>>124024+03570@g33333@4p =124024+21160@gոQ@KAu124024+55250@g׿%Y@%]'}'124018+10570@g״N@(aP124030+12340@gԱ~K@P&=p 124030+64520@gfffffAu1124030-01000@g\)@Km s124036+55070@g,_@&lrb124036+11290@gӠm:@(Ӡm:124036+12190@gDDDDD@  124036+03510@gzG@>an]L124036+30400@g؋X&@>c ܺ124036+30400@gشN@;ll124036+28000@gb0@4Vy124036+07440@g\(䡐n]L124042-00220@g~K@ f +<124048+03490@gN@&l;*124048+11290@gڮzH?@t 124048+02160@gt @@?\(124048+31220@gb0@%II124100+11090@gDDDDD@')I124100+11520@gܿ%X@-.124100+07430@gڠm:@M{Q124106+59140@gK@'vT2124106+11500@gݱ~K@0d~K124118+16400@g@DaP@124112+41180@g~K@%124112+11030@gb0ò124118-00160@g߁N@ ]L;*124124+03530@g߈@*@m:Ӡ124124+13250@gb/@Kr124130+55100@gX&@" m:Ӡ124130+09200@g,_@@ò124136+32270@gm:Ӡ@D@t124136+41270@gX%@Ft A124148+45170@g @t@Rg@t 124142+73540@gG{@ ` a124148+04420@gi6@ 3 124154+03480@g%Y W124154-02440@g =q@ (dۗS124154+03480@g?Q124154+00450@g@*%X124200+13470@gDDDDE@&an]L124200+11280@gぴN@B124206+37230@g"""""@?124330+08450@g\)@Dc33333124330+41030@gb0@FeC 124336+45280@gt A@QdۗS124342+71360@g@ X%124342+08370@gX%@>` `124342+31000@gN@>124342+31000@g~K@G]Q124348+46590@gi6@' ` 124354+12090@gN@RW124354+74460@gN@P$m:Ӡ124400+64500@g/b@Ie^o124406+51050@g~K@R124412+06140@g,_@#|124412+10070@g@ rb124412+03160@g@=;*124412+30000@gN@KD_,124424+54490@g,_@#ò124424+10080@gb/@:n]L;124424+26500@g~K@Ix124436+51550@g@3vӠm:124442+19440@gUUUUUYj|124442-02270@g =p@$h?.124442+10290@g\(@(U0d 124448+12260@g =p@ M^o124454+03520@g%Y@OW$124454+03180@g,_@A r124500+35370@g~K@=ɫ4124500+30040@g,_@;u0d 124454+27440@gzH@/b124512+04090@g33334@W~K124512+04360@g6i@QII124512+71280@g/b@:N124506+27160@g~L@+fffff124518+14020@gGz@K/ó124518+54390@gfffffn]L;*124518-01220@g\)@M^o124524+04420@g_-@;8\)124524+27300@h 4V124536-03030@hi6@%$h124548+11150@gzH@T/b124500+83420@h@ F124554+08450@h=p @K[124600+54180@h33333@:۩eC!124554+27080@hzG@I0d 124606+51270@hwwwww? =p124606+01060@hQ@AvT2124624+35360@h33333@D +124618+42120@hb/@-d124630+15100@h6j@1i7124636+17170@hzG@>L;*124636+31110@h X%@ $h124642+03400@h ~K@m:Ӡ124642+04560@h @ +124700+03520@h \(@9xQ124706+25440@h DDDDD@)@$h5124712+12540@h 6i@.U\(124712+15260@h R@>vT2124706+31070@h ,_@D124706+41580@h =q@:Vx124712+27100@hN@W$124718+03080@hN@@ =p 124718+32200@h N@H5yG124724+49430@hN@>K~124724+05350@hQ@;ҏ\(124724+28050@h@9[[124736+25170@h(]@@h5z124742+33250@hX%@Jl 124754+53080@h@t@;RaP124748+27360@h@94Vx124800+25460@h/b?p =p124806+01440@h/b@>Yj124800+31070@h33333@JHY124812+52240@h@R7ó124812+73090@hp =@ >?124824+03280@h6i@;כ$h124818+28060@h @t@Al124830+34250@h@Dwwwww124830+41230@hN@%ʆA124836+11110@h=p @< s124836+29120@hzG@;^Q124830+27390@hQ@o124842+05080@h@G,_124842+47560@h/b@<ɾF124842+29040@hb/@;*124848+27230@h@t@?II124854+31190@h@;q124854+27420@hG{@+[[124900+14030@hzG@;k$h124854+27420@h@2 ` 124900+18200@hzG@ . 124900+08180@h33334@J#Eg124900+53580@h:Ӡm@Sc =p124900+77490@h @t@?ZOO124912+31370@h@9T2124918+26020@hwwwwxQ124918-01480@hm:@Q~K124918+71550@h_-@(*Au124924+12210@hX%@0HdۗS124930+16330@h @t @50d 124930+06490@h Q@;#124936+27510@h R@;7H124936+27180@h"UUUUV@& ` 124948+11350@h"2˩124948-00560@h wwwwx@I =p124954+51580@h%G{@/X%125012+16070@h%@:xvT2125012+26450@h'%X@#t @125024+10160@h&@;fll125018+27400@h'wwwww@&vx125024+11300@h'%X@<_#Eg125024+28390@h(O@125030+07570@h(ffffg@@ u0125036+32220@h)X%@t @125042+04440@h)UUUUU@9G@t 125042+25320@h(~K@Bh?.125048+37050@h*Ӡm:?OO125048+01320@h*%X@;N125042+27210@h+G{@X%Y125054+02260@h-m:Ӡ@*|125106+07040@h.b/@#kQ125118+10000@h.zG@=7H125124+29510@h.@?` `125124+31220@h0@t """"""125130-01140@h/~K@:q125124+26430@h16i@W125142+05370@h0UUUUU@=125136+29520@h0~K@;& ` a125136+27250@h0@;n]L125142+27200@h1t A@u\(125142+05370@h2\( HY125142-03270@h2"""""@;Mu0125148+27350@h2@;Yj|125154+27200@h4fffff@<`m:Ӡ125206+28390@h5X%@ò125206+02220@h5@ N125212+08190@h5~K@*yu0d125212+13300@h3@Mr\(125212+59100@h5m:ӡ@<6i125212+29120@h66j@;*125218+02560@h6Ӡm:@II125218+02550@h6R@zG125218+04080@h6wwwww@3-:Ӡm125224+19270@h5 =p@GD'125218+46480@h6/b@A4V125236+35390@h0%X@Rn]L125206+74550@h7\(@;i125230+27410@h6/c@A}'}(125236+35390@h8b/@ !N125230+08200@h4Ӡm:@OUUUUU125236+62300@h/i7@SZO125224+77410@h5@Mc` `125230+59020@h9_-@l125236+08110@h9zH?˩eC!125236+00230@h6 =p@Mpd125236+59090@h:@+4V125242+03100@h:Q2n]125248-02450@h;"""""@89125254+08110@h8t A@K33333125300+55250@h8\(@MeC ܻ125254+59030@h;X%@;;*125300+28050@h<~K@ {[125306+08300@h;N@;~K125306+27560@h;G{@;g125306+27470@h7zG@RKwwwww125312+73280@h;N@J"FX125312+52320@h>"""""4V125312-00430@h:@M, @t125312+58360@h=Q@;@$h5125318+27310@h>@7HY125318+04340@h>\(@O125318+04170@h?,_125324-01050@hA=p @(u0d125336+12460@h@b0@;u0125342+27570@h@t A@; ` a125342+27570@h;/c@Q+?.125418+30590@hGQ@ R}'}(125424+08250@hGi6@BFX125424+04200@hFӠm:@: 125430+27100@hF%Y@<F125430+29120@hF,_@:|#Eh125430+26450@hGm:Ӡ@@9P?/125436+32430@hG~K@>eC 125436+30590@hF@t @H&fffff125436+48340@hH33334@=4Vx125436+29190@hIi6OO125436-01260@hIDDDDD@;weC 125448+27440@hIN@= eC!125448+29180@hK :Ӡm125448-03130@hK:Ӡm@;,`125500+27460@hKm:Ӡ@;X%125500+27490@hK,_@<-:Ӡm125506+28280@hK/c@<06i125506+28280@hL(\@:33333125506+26460@hLDDDDE@@ST2125506+79180@hM%Y@:=p 125512+27070@hNb/@;4Vx125518+28090@hN~K@<.&7I125524+28270@hN@;Gz125518+28090@hN =q@=zH125524+29550@hN\(@B/wwwww125530+36380@hPN ,_125524-03210@hOQ@"{[125524+09310@hP,_?6i6125530+01500@hJp =@Q125524+70280@hPi6@?,/b125536+31260@hPQ@:'125536+27080@hPi6@:ꪪ125536+27110@hP\(@<>F125542+28310@hQ:Ӡn@@QG{125624+71420@hWp =@;yF125632+28064@hX@t @:t A125636+27050@hX:Ӡm@<96j125638+28298@hX@t @<@t125638+28232@hXN@<b0125640+28237@hXN@;N125642+27550@hXUUUUU@An>125642+35080@hY @t@;[125643+28076@hYzG@;Yj125643+28034@hY33333@B.125648+37340@hY@;=p 125648+28149@hYӠm:@;g =p125648+27400@hZi6@;#125650+28145@hY =q@Aqq125648+36110@hZ =q@<[[125654+28210@h[m:@,W~K125700+14270@h[~K@;u0d125658+28110@hGX%@U>125700+84230@h[~K@;6j125704+28073@h[,_@;ò125705+28137@h\N@;j|125706+28094@h\\(@;X%125708+28151@h\X&@;FX125709+28130@h\%Y@;&7125712+28140@h]33333@125718+01540@h]@t @ChdۗS125724+39050@h]N@;4125719+28110@h^N@56i125718+22050@h[zG@MaP@125718+59170@h^ =p@@˩eC125724+32180@h^K~@;ò125718+27580@h]N@CgۗS125724+39050@h_\(@eC ܻ125724+02180@h]N@Jm:125730+53370@h\~K@N> ` a125724+60450@h_t @@<\)125731+28182@h_~K@?125753+28281@hb%X@B 125754+36310@hcQ@+W. 125754+13570@hb@< l125757+28189@hci6@130554+41570@h\)@x#130554+04380@h_,@IUi6130600+50560@h =q@@$h130630+07140@hm:@J+?130724+24510@hm:ӡ@J@t 130724+53450@hӠm:@F 130730+46110@h\(@&eC 130730+11430@h =p@3~K130736+19590@hX%@> +ܺvT131048+06200@h@@F131048+34150@hX%@B =p131100+36280@hUUUUV@IIq131100+50520@hm:ӡ@;i6131100+28010@h˖/b@;p =131100+28040@h,_@Q;*131100+71280@h̙@/$h131106+16150@h˴N@BLl131112+36510@hͪ@c =p131112+07070@h@HY131112+07150@h@ldۗ131112+07070@h:Ӡm@QW33333131112+69380@hb0 P?/131112-03200@hΏ\(@ٙ131118+07130@hN@]L;*131118+02490@h/c@\(131118+02240@h =p@8Q131118+25150@hα~K@189131124+17200@h6i@כ$h131124+07130@h\(@I+|l131200+30450@hQ@>IJ131212+30580@h@A131206+35380@h/b@H131212+06350@hӠm:@F ` a131212+46110@h@1:131224+17290@hi6@Ap ` 131230+35080@hK~@"131230+03170@hף =q@19131230+17290@hӠm:@$ 131230+10170@h~K@$~K131230+10170@h"""""@)sW$i131230+12580@h6j@\vT2131236+03180@hQ@"n]131236+09370@hwwwww@8o131236+24530@h%X@Jܺv131236+54050@h~K@>geC 131248+30390@h~K?&131248+01350@h~K? =p131248+02120@hڻ@*. 131254+13210@h%X@)aP@131254+13100@h~K@88131254+02200@h_,@ N131300+03460@ht A@F4(\131300+44400@h\(?߀131300+00450@hݏ\(@ó131312+03080@hܧ@t@=&8131312+29550@hi6@OB,_131318+62480@h:Ӡm Q131318-03280@hK t @131318-03280@h@  @t131318+08180@hߪ ;*131324-03230@hGz@?ؚ#131324+32060@h߸Q@QR131324+07350@hb/@EM^o131330+42170@hܧ@t@O˩e131336+62230@hzG@AX&131348+35180@hDDDDE@/131348+07190@hޝi6@Lg131348+57050@h @t@4 l131348+20180@h =q@>33333131348+31120@hӠm:@D--131348+41450@ht A@+ܺv131354+13460@h=p @9gHY131348+25400@hQ@>Cn131354+30310@h⻻@>@t131400+30550@h\)@DSʆB131400+41450@hQ*131400-01500@hb0@ra131400+03200@h~K@? +|131454+30470@hm:@4i6131448+20550@hX% rX%131454-02550@h =p@?%X131500+31180@h@4131454+20530@hQ@44131454+20530@h@L r131506+57480@hzH&131506-00440@h @t@?}'}131512+31200@hӠm:@;P?131524+27490@hӠm:ò131524-00030@h@E.131524+44040@h6j@L;*131524+04400@hX% +<131536-00580@h,_@ۗSʆ131548+04440@hzG@WSʆB131548+06350@hi7@˩131600+04450@hp >@?x +݂-131618+31070@h\(@.131624+08030@h@Kn]L;131624+54200@h =p m:Ӡ131630-02150@hi6@Dn]L131630+42120@h@t @-N131636+15030@hӠm:@SʆA131636+08050@h\)@>ó131642+31020@h@u0d131642+07420@h~K@<q131648+28460@hi6@Ci6131648+39520@h\(@ ۻ131648+08410@hQ@!fffff131648+09010@hӠm:@l131700+07450@hG{KeC!131700-02390@hR@B\(131706+03170@ht @@0/b131706+17150@h=p @>AN131718+30310@h =p@D1u0d131724+40390@hN@;raQ131724+06040@hG{@7131730+23160@hQ@/|131730+16070@h@R0ܺv131724+73020@hN@>o131736+30230@ht A@=mp =131736+29410@iR@/4V131742+16100@i"""""@?*131742+32140@hUUUUU@J 131742+52200@i,_ D 131742-03230@h@JۗS131742+52200@iQ@X--131748+06360@iQ@@W$i131748+33210@i,_@>#Eh131754+31150@i@>T2131754+31100@i@@j|131800+33240@iQ@JW131742+52200@iX%@@vT2131800+33240@iQ@-Yj|131800+14480@iN@ܺv131800+05400@i~K@? 131800+31470@iNP?.131800-02010@ii6@>OO131806+30510@i~K@#33333131812+10030@i@@m:Ӡ131806+32150@i=p @@UUUUU131818+33330@iӠm:@n]L131812+05440@iQ@AP?131818+34250@ii6@E#E131818+43200@izG?ʆA131824+01450@i\(@,O˩e131830+14250@iX%@!N131830+09140@iX%@@raQ131842+33360@i,_@Qi7131848+71000@i zG? +=131848+00360@iN@E9u0d131848+42430@i \(@?8%Y131854+31290@i,_@L҆Au131854+57550@i p =@-u\(131900+15000@i O@?cEg131900+31390@i m:@?^o131900+31480@iffffg@MFAu1131906+58480@i @.~K131912+15350@i N@CD#Eh131906+38480@i \(@92˪131912+25470@i33333?˅Q131912+00280@iR?6i131918+00240@i i6@?Y6j131918+31370@i @E$2˪131924+42320@i@?5y132136+31150@i!Gz@ I132136+05310@i!DDDDD@P?132136+07100@i!UUUUV@#R,_132142+09550@i!UUUUV@+>?132142+14150@i#:Ӡm@+132154+14120@i"Q@?XdۗS132154+31360@i#t @@,/\(132200+14210@i$?6i6132200+01500@i"zG@BLM^o132206+36510@i$~K@132200+06470@i"Ӡm:@AOP132206+36100@i#b/@>yF132206+31130@i&t A@+yF132224+14000@i&6i@:&8132224+27000@i%Ӡm:@@E'}'132230+32480@i(NN132230-00390@i&t A@B0vT2132236+36380@i% =p@JzW132236+53140@i&\(@E֦ 132236+43560@i)b/@1 s132248+17190@i(%X@B3 ܺ132248+36400@i(,_@B8132248+36420@i$/b@O$h132248+63210@i*~K@2s>?132254+18430@i)@E4Vx132300+43310@i-(\@@W$132324+33560@i/m:@?88132336+31530@i2 =q@4Vy132348+02210@i133333@:z+Ӡm:132448+31140@i7:Ӡm@J`vT2132454+53010@i8m:@D\(132454+42130@i:@t @@>?132500+32170@i=zG?ܱ~K132506+00420@i<N@3W. 132506+19360@i9/b@Kfffff132512+55450@i>DDDDD@1eC 132518+18020@i?N@<"""""132536+28460@i?_,@>`6i132536+30380@iB%X@132542+03150@iCN@132554+07010@iBi6@@ۗS132554+32170@i=@Ob+?.132606+31050@i@N@L˩eC132606+56170@iE:Ӡm@&Au1132612+11390@iF6iP?.132606-01470@iE\(@)l;*132612+12580@iC_,@GK132618+46510@iDi6@GvQ132630+47120@iFX%@CII132636+38500@iF =p@G!n]L132642+46310@iI6j@&:Ӡm132642+11320@iJ@&gó132648+11280@iJX&@1 ^o132654+17190@iJG{@'xQ132654+12000@iKt A qq132648-03250@iK=p @'Q132654+12040@iKUUUUU@'4Vx132654+12030@iKt @@&ra132654+11160@iKN@'?ۗS132700+11530@iK@0i6132700+17050@iLQ@'}132700+12010@iG =p@Ni6132718+62100@iM@*132712+13340@iNN#Eg132718-01100@iJ33333@J}'}(132712+53200@iL@@3N132718+32400@iLӠm:@AM&8132724+34520@iM=p @=Q132718+30020@iO/c?Ӏ132730+00330@iM@@i6132730+33360@iNzG@@'}'132730+33360@iNm:ӡ@?!Gz132730+31230@iM/b@F4132736+45390@iPӠm:4132730-01280@iP?M^o132736+00460@iPN@*0d 132736+13410@iQi6132736-01250@iL@M5@t132742+58400@iRzG@~K132748+07450@iNX%@G132748+47270@iPG{@?cW$i132748+31390@iS,_;132748-02390@iNQ@KUUUUU132748+55520@iR\(@' 132748+11470@iO =p@G"""""132754+47310@iRN@?Uò132800+31350@iQQ@GU132806+46560@iSO@>eC 132806+30170@iSwwwww@?132806+31530@iU@Q132806+07480@iU%X@2"}'}(132812+18240@iV~Ku0d 132818-01310@iT@?IP?/132818+31320@iVQ@&fӠm:132818+11280@iPwwwww@OA~K132812+62460@iU@t @?HYj132818+31320@iUN@AjOO132824+35050@iWb0@3oۗS132836+19420@iXX%@&$h132830+11380@iYX%@&&7I132842+11420@iZi6--132848-01210@iU@KtIJ132848+55100@i[X%ll132854-01260@iZR@%s 132848+10590@i[%X@#,_132848+10050@i[K~@#ꪪ132848+10140@iZR@9N132900+25520@iP @t@Rm:Ӡ132900+75500@i^QVx132912-02280@i^NۗS132912-02210@i^wwwwwL;*132918-01380@iW,_@O*132918+62170@i_b/ɿ4Vx132924-01450@i^fffff@,B/c132924+14240@i^6j@&HYk132924+11320@i^@,E[[132924+14240@i_@44Vx132930+20150@i]Ӡm:@GN132930+46250@i`%X?88132936+01520@i`@t @*SW$i132936+13260@i`@t @1 rb132942+17180@ia~K@&7132942+06250@ia@$5yG132942+10400@ia@+Yj132948+14100@ibQ?132948+01500@iam:ӡ@?133036-00460@i^i6@R&,_133036+72510@ih@,h\)133036+14270@if~K@D$h133036+42080@ihQ@1Yj133036+17510@ig@@MyF133042+32520@iib/@Yj|133042+06010@ihG{@@W$i133054+33250@ij =p@FAu1133048+06350@i[@t @Sv 133048+78060@ik@l133054+05440@ilb/?N133100+01340@il\(@]L;*133100+05450@ik~K@1xvT2133100+17440@il~K@=p 133100+07240@imi64Vx133106-02290@imt @ڿaP?133106-01380@im~K@*x8133106+13300@ik@@g133112+33180@inDDDDD@\vT2133118+02180@im6j@&qr133112+11430@imQ@0g133118+17130@in@t @ Ӡm:133118+03340@ijzG@IʆA133118+51460@ik @t@H'}'133118+49210@ioGz@ Eg133124+03320@ik@Ky~K133124+55130@iob0@aP?133130+05210@ia(\@S5˩eC133118+77060@ioO@1x133130+17580@ip~K@n133130+05000@ip?4Vx133136+02010@ipR@h\)133130+05210@iq\(@yu0d133136+05070@ipb0@1N133142+18070@iq@t @*b0133142+13320@iq =p@#Eg133142+09540@iq/c@?l133200+31410@ipffffg@GQ133200+48100@it֓>?133200-00050@iu=p @Q133206+04230@iu@!ò133200+09040@is\(@AX[[133206+34570@iuX%?GzH133218+01580@iu@"rb133212+09360@ipX%@NQ133224+61590@itzH@Ac89133218+35020@iu_-@@yF133224+33130@iwt @@+{$h133230+14000@iwt @@+=p 133230+14050@iw:Ӡm@:4 133236+26280@iwb/@?d~K133236+31390@iy/b@dۗ133236+06440@iyzG@ :Ӡm:133236+03540@iwm:@A@t133236+34180@iu@Iί7H133242+51530@itt A@L;i6133236+56440@iw~K@C:\(133242+38430@iyR@%_n]L;*133242+10560@iy/c@%bj|133242+10570@i{DDDDD?133248+01400@iw,_@F =p133300+46020@iyb/@AV7H133254+34560@iu\(@Nqr133300+62150@iz,_@:lvT2133300+26410@i{6i@;u0d133306+28100@i}(\p =q133306-00400@i|@t @+Z+>133318+13350@i~@!4Vx133312+09140@i~p >@K~133312+03150@i|%Y@=7133318+29290@i~@*՞&7133324+13410@i6j?5y133330+01590@im:Կx#133330-01200@i/b@WSʆB133330+06500@i{_,@L3 =p133330+56400@i~@t @AۗS133330+35150@i @t@ W$i133336+03450@i}~K@F +<133342+46110@i~zH@D",_133342+40320@i,_ƿ 133342-00470@i\(@AEg133342+35500@im:@ ` a133342+05000@iQ@@ =p133342+33410@ib0@@dۗ133342+33440@ib0@$N133342+10440@i\)@"I133342+09310@iӠm:@ X&133348+03350@i~K@zOO133354+07380@i(\@H/c133400+50130@i@C,'133400+38360@i,_@I88133400+51300@i~K@G133412+46280@ix(\@RX%133324+76010@ib/?u0d 133418+01250@iӠm:@;>F133418+27300@iGz@/b133412+06450@ip =@43Eg133418+20270@izH@ 4Vx133418+03460@i?#Eg133424+01270@i6j?#Eg133430+00290@izG@FL~K133430+44510@i@A_133424+35000@iQ@/133430+16130@izG@1cʆA133424+17430@i,_@0T2133430+17130@i@t @1ffffff133424+17440@i@FLrb133430+44510@i=p >133454+07540@iR@k?133554+61170@i@t ?zG133548+01440@izG'}'}133554+00010@i"""""@133554+07080@i\(@@iP?/133554+33050@i=p @;ŋX&133600+28020@iK~?GzG133600+00470@izG@ j|133600+08420@iX%@:zG133606+27000@ifffff@@ =p133606+33230@iG{@/b133612+04420@iUUUUU@H#raQ133612+48320@ii6@2UUUUU133624+19130@iUUUUU@N"/c133630+60320@i%Y@?E0d 133624+31310@i"""""@-|vT2133624+15000@i@LA133630+56470@i,_133642-00520@i,_@~K~133642+04520@i@?]p =133636+31380@ii6@)rn]133648+12580@it @@@t133706+31150@iO@?50d 133706+31280@iN@?LvT2133712+31340@ii6@;4V133712+28110@i @t?#Eg133724+01050@i @t@I>133724+51190@iQ?i6133730+01050@i~K@;ll133724+28020@ib0@Ell133730+43180@iӠm:@\(133730+04560@iX&@N%Y133736+61450@i88133736-02380@ii6@Q133742+30220@ib/@7$IJ133742+23240@i6i@D^7H133748+41000@i%X@N88133742+05190@im:@vT2133754+05010@i6i@Bn88133754+37070@iӠm:@CoII133800+39070@i,_@EW$133824+43150@i =p@9vT2133830+26090@i=p @9&7133830+26090@iUUUUU@Ce@t133824+39020@iӠm:@8y,_133830+24440@i~K@l_,133830+05210@i@t @S^o133836+79430@i?yF133842+02020@i=p @)|133842+13010@iQ@K*133842+54350@i @t@7H--133848+23320@iDDDDD@+&8133848+14010@ii6@)>>133848+05170@i =p@E77HZ133848+42410@i~K@>`?.133854+30380@i=p @!n]L133906+05170@it @@1w$h133906+17430@iN@%Y133906+04300@i =p@$h133924+02190@im:Ӡ@70n]L;133918+23260@i33334@"""""133924+02190@ib/@h5z133924+02190@i@t @> 4Vx133924+30230@iӠm:@;Gz133930+27160@i\(@:_.133930+26380@i@2$IJ133930+18240@i=p @KFX133930+55540@im:@Do˩e133930+41080@it @@ 133942+04300@i\(@P =p133936+67550@i?Q133942+02060@iK~@K133948+55560@ib0@BL;*133948+37170@iQ@Aӻ133948+35540@i/b@-zOO134000+15000@iX%@=W$i134006+30050@iN@=\)134006+30050@i%X@= ܺ134006+30050@i@AۗS134006+35530@i@t @:|134012+26450@i%X@>@134018+30300@izG@8w =p134018+24430@i@?}'}134012+31470@i\(@AvT2134018+35160@iQ@=Vx134024+30130@iK~@6%0d 134030+22240@i%X@Nci6134036+61020@i6i@1/c134036+18080@ii6@=]L;*134036+30070@iQ@0&134036+16570@i/b@>Vx134054+30360@iQ@>q134106+30200@i\(@+4V134106+04080@izH@2O134106+18180@i@qq134112+04080@i=p @3Gz134112+19490@iv6j@Ud134100+87130@i33334@2 ` a134118+18160@i @t@EN134124+43430@iG{@9dVx134124+25380@iӠm:@ _,134130+08170@i =q@>>134136+04090@i/c@1eC 134136+18050@i@(All134142+12230@i@96j134148+25550@i\(@,--134148+14440@i~K@+Q134148+06020@ip >@Gz134154+02210@i@,}'}134154+14350@iӠm:@R0d 134200+72340@iDDDDE@4h8134200+20400@iUUUUU@4_,`134200+20380@iāN@t @134200+05020@i(]@45,_134206+20280@i/b@0#Eg134212+16530@ib/@A5y134212+35260@iƻ@vT2134218+04160@i33333@>Q134218+30350@i@B,_134236+37250@iӠm:@@CW$i134236+32470@iwwwww@B#Eh134236+37250@ip >?N134236+00220@i@ n]134236+08440@iɖ/b@7j|134248+23190@iř@K~K134248+56080@iӠm:@3ۗS134254+19500@i_,@t @t134248+04030@iӠm:@7Q134254+23340@i%X@78 +&7I134424+11530@i֖/b@,:Ӡm134424+14400@i@,ò134424+14400@i,_@'<(\134430+11520@iӠm:@0E +134424+16310@i,_@1-.134430+17570@iؖ/b@&6T2134436+11210@i:Ӡn@ &7H134436+03540@i؝i7@8W$134442+25140@iwwwww@#Eg134448+04010@i(\@@j|134448+34090@i6j@Vll134448+07500@iX%@@t A134454+34080@iхQ@Qu0134500+70350@i\(@AʆA134506+34240@i\)@>Ug134500+30350@iQ@ _,134506+03350@i/c@#+x134536+40440@izH@zG134542+07380@iQ@N134542+04120@im:Ӡ@BF134542+38040@iN@.ڼ#E134548+15400@i\)@.ܖ/b134548+15400@i~K@LO$h134554+56530@im:Ӡ@2[raQ134554+18360@i~K@9Q134554+25590@i(]@9eC!134554+25590@iN@9134600+25550@ii6@Rrb134606+72180@i%Y@8 =p134612+24150@i,_@Kf ` a134624+55030@izG@<=^o134618+28290@ii7@BO134624+37210@iQ@<=134618+28290@ifffff@?u,_134618+31430@i@Nq134630+62030@i,_@E134630+43390@i@:}'}134630+26500@i軻@1<5y134636+17290@izG@C&7I134648+40140@iN@Pb0134642+67330@i(\@!ۗS134654+08450@i虙@CzH134654+39450@i@t @Qu0d134654+68200@iG{@A8134700+35300@it A@+ܺv134700+14070@i,_@ @t134706+04290@i灴O@M/c134718+60050@i/b@Lvll134730+57110@im:Ӡ@=N134730+29560@ii6@90t A134730+25260@i@NvT2134736+60260@iN@C ` a134736+40140@i@@ϛ$h134736+33520@i軻@Q4'134748+69040@iR@2'134800+18240@iGz@ @t134800+03260@iQ@CۗS134800+38280@i@R)P?134806+72530@i@3L;*134806+19320@ip >@0134806+16200@i =p@E_134812+42590@i%Y@A5y134806+35430@iN@8x134812+25130@i"""""@8I134812+25130@i/b@R134800+74300@iN@Dò134812+41370@i:Ӡn@t @t134812+02330@ii7@=_,`134812+29370@ib0@ s134818+02340@i,_@<&T2134812+28240@iN@&7134818+02340@i@@=p 134818+33570@iӠm:@90m:Ӡ134824+25250@i6i@AN134824+35170@i =p@-$h134824+15140@iK~û134830+00050@i6j@@ܺv134830+33530@ib0@EEL;*134830+42470@i@D# 134836+40310@iQ@+eC!134836+14010@ib0@Ct @134836+39570@i,_@5t @134836+21470@ii6@rX%134836+04360@i"""""@5F134836+22140@i6i@ ll134842+08440@i%X@Ct @134836+38150@i\(@Cɐn]L134842+39490@i6i@C#ʆA134848+38310@iQ@9ó134842+25200@i/c@8~K134848+24150@iӠm:@Bz+134948+60070@jQ@2X%134954+08030@j@1K[134948+17320@iK~@I}:Ӡm134948+51150@ji7@+&7H134954+13490@j,_@,հ[[135148+31050@j,_@>,_135148+31080@jN@C 135200+40130@jX%@9'. 135200+25230@j/b@5zG135206+22050@j(\@.i7135206+15170@j@@wW$135206+33110@j\(@FW$i135206+44270@j@7q135206+24000@j@>陙135206+31100@j~K@&135230+11360@jzG@5zG135224+22050@j~K@C9n]L135230+38410@j@U&7135224+05350@j@t @NVʆA135230+60550@jzG@&--135230+11360@jt @@3ó135230+20000@j~K@K*OO135236+54350@jN@$ >135630-02090@j8b/@/!N135636+15480@j233333@MdۗS135636+60030@j;N 4V135648-02580@j;Ӡm:@'135654+05470@j:N@$G@t 135648+10230@j:~K@-b0135654+15120@j;Ӡm:@.] s135700+15250@j;zG@)m:135700+13020@j5 @t@NfF135700+61010@j>%X?5yF135712+01190@j=~K@)yP?/135718+12590@j<\(@>HY135712+30200@j_,@D0d135736+40370@j>\(@Cn]L;*135748+38250@jA@!7HZ135742+09130@jBӠm:135748-02050@jBt @@.zG135748+05170@j?i7@CF135754+38260@jB =p@)135748+13120@jDi6}u0135754-02350@jC_,@)=p 135754+13120@j8,_@QYg135800+69390@jDG{D 135800-02400@jD\)ܺvT2135800-02370@jA:Ӡn@CV&7I135800+38550@jD%X@!̨dۗ135800+09090@j?"""""@Kd5y135806+55010@jB~K@C@dۗS135806+38440@jEQ/b0135806-00160@jFN@,_,135812+02160@jBzH@Cu0d 135812+39090@jD/b@;ƊW135806+28010@jC_,@CB135818+38450@jEX%@4|135812+20560@jG@˩135818+06430@j@X%@MI135824+59300@jE =p@? 135830+32080@jFN@>i6135830+30190@jI/b@!*|135842+08510@jI@t @ʆA135842+07570@jIfffff@:Ӡm135842+07440@jFzH@Cra135842+39230@jG~K@=135842+29480@jI:Ӡm@5<#Eh135842+21280@jH@=W135848+29460@jGGz@D~N135842+41140@jJm:Ӡ@$<#Eh135848+10220@jK_,ò135848-00230@jF\(@H8Yj135848+48410@jG@D%Y135848+41150@jJ(\@/@t135848+16000@jJN@$T2135854+10430@jE@K r135854+55240@jI\)@Bܺv135906+38070@jFN@M135906+59330@jN6i +135912-03150@jK33333@Bffffff135912+37020@jL6i@@o140230+30590@jh=p @& 140236+11150@jiN \(140236-03080@jf~K@? =q140236+31180@jh\(@0 r140236+16490@jj33333@$ܺvT2140248+10390@jj\(@#FAu1140248+09520@jk\(ò140254-00350@je,_@Kr4Vx140300+55080@jl6j@!zG140306+09090@jh33333@J140312+53540@jkb0@>h5z140312+31000@jm%X@9;>140436+10530@jxzG@*"""""140436+13140@jo@t @Pl6i140442+65550@jy~K@)-:Ӡm140442+12500@juN@I\/b140454+50590@jz=p @.U0d 140454+15240@jzp >@)Au1140454+13070@jz/c@.'zH140454+15190@j|wwwww@ ` a140500+07250@j|@0ò140512+16150@j}@t @-vT2140512+15060@j}\)@L;*140512+07270@j{_,@C߮zH140518+39590@j_,@*aP@140524+07170@jyN@K6i140530+55150@jy"""""@LE'}'140524+56470@j"""""=p >140536-01280@jӠm:@7eC 140530+23200@jQ@?%X140542+06020@j{Q@K0d 140542+55200@jb/@=n]L;*140542+30070@jN@0+Sʆ140548+16250@j}:Ӡn@Ke[[140600+55020@jN@Gz140600+05540@j6iпHYj140554+00060@j~K@;*140600+07180@jv@t @Qd140600+72080@j_-@1~K140600+03150@j~L@!L;*140600+09100@jQ@+24Vx140600+13500@j@/wwwww140600+16100@j@ bj|140600+03390@jN@"|140606+09170@jQ140606-02460@jfffff@'u0140606+12030@jm:@"gqr140606+09270@jN@BqP?/140606+37070@j\(/b140606-00550@jt @@0Yj140618+16200@jx%Y@R Ӡm:140618+72250@j%Y~K140624-02440@j@0q5yG140630+16400@jR@-ۗS140636+15000@jN@,FX140636+14330@jG{@Ki7140636+55320@jm:Ӡ@Ao140636+35510@j@1ۗS140642+18000@jp >@CEQ140642+38460@jR@!6i140654+09080@j|@RBF140654+73160@jz:Ӡm@R|140700+76100@jQ@-6j140706+15040@j@Gddۗ140712+47000@jt A@ #i6140718+08190@j@t @'+Q140718+11490@jzG@#$h140718+10060@jQ--140724-01000@j,_@N88140724+04490@jN@%l140724+11120@jN@J#Eg140724+54040@j@-Q140730+15060@jt @@HOP140730+49160@jK@.Zt @140730+15250@j =p@1eC!140736+17470@jX%@$TIJ140736+10240@jG{@1"""""140736+17560@jNN140736-02200@j/b@1$h140742+17580@jUUUUU@'o140742+12100@j@1@t140748+17510@j =p@2]^o140742+18360@j,` =p140748-00360@jDDDDD@Bo140800+37470@j@t @0#Eh140800+16200@jG{@1O\(140812+17320@j~K@3vT2140812+19510@jӠm:@!K~140812+09140@jQ@LiP?/140812+57030@jQ@+u0140818+13470@j33334@Kpt A140818+55070@ji6@KX%140824+54270@j@.k140906+09030@j@t @3,l140906+19240@j"""""Ӡm:140918+00110@j/b~K~140918+00110@j\(@5`[[140930+21370@j(\@C+|141024+31050@j@FdۗS141036+45550@j6j@#כ$h141030+10090@j =p@I,/b141030+50360@jzG@CzH141030+39320@jN@ 141036+03560@jQ@!Cn141036+08520@j,_ \)141042-02590@jN@!<#Eh141042+08510@jb/@GOO141042+46270@j =p@A/c141048+35560@j =p 0d141048-02550@jX&@*u0141048+13140@j(\@4jvT2141048+20400@j\(@3ۗS141048+19170@j@t @!|141048+09050@j@t @!T2141100+09140@j(\@;"""""141100+27150@j\(@E5y141100+42140@j~K@8Q141106+24460@j,_@ۗS141112+07540@j/b@)"""""141112+12440@jN@ p6i141118+08270@j@R s141112+72310@jR?M^o141130+02040@j\(@4,_141130+21050@jN?\(141130+02040@j"""""@/Q141130+15440@jӠm:@=m˩eC141130+29400@j,_@4141130+21140@j,_@ ^o141136+03270@j\(졐n]L141142-00390@jX%@Eò141136+44060@j\(@Bt @141142+37290@j@t@? ` 141142+31480@j(\@%*aP@141148+10490@jb0@/>Q141148+15510@j=p vT2141148+00020@jt @@5yF141148+21160@jb0@6i141154+07450@j~K@Gqq141154+47530@jfffff@(-141148+12340@jܺvT141148+00020@j,_ N141154-03040@jX%?n^141200+01580@jDDDDE@ Au1141200+03250@j@t@/9P?/141200+15500@j6j˩e141206-00030@jQ@LW141218+58000@j =p@ rb141218+03210@j =q@B3 141218+36380@jzG-.141224-00340@jN@.KX%141248+30500@j,_@/|'141248+15580@j~K@&W$i141248+11310@jzG +<141248-02530@j =p@/ll141248+16060@j(\@"""""141254+04380@ji6@2 ` 141248+18210@j@0W$i141254+17070@jzG@F(\141312+45500@j=p @,?.141312+14310@j"""""@$ ` 141318+10400@jQ@03Eg141318+16260@j@t @Nll141324+60140@j@Bi6141324+36270@j~K+>141424+01520@j@%p =141424+11020@j=p @C` `141424+39490@jK~@7141424+23140@j\)@"6T2141430+09210@j""""#@ =p 141436+07300@jN@17H141436+17190@jȅQ@2,/b141442+18240@j\)?--141448+00150@j =p@!I141454+09080@jUUUUV@BI#Eg141500+36480@jUUUUU@ 141500+08170@j"""""@L.141500+58020@jȴN@BI4141500+36480@j̈?141500+02020@jK@?.141500+04470@j̴N@ll141506+02160@j@:۩eC!141500+27050@jӠm:@9 -141506+25170@jX%@8 +@B?. 141618+36430@jwwwww@%4Vx141624+11050@j֝i7@)q141612+13120@j,_@55yG141624+22030@jQ@88141624+05400@j\(@8𑢳141630+25100@j؈@ m:Ӡ141630+07160@j6i@:?.141636+26500@jQ@}'}141636+08090@j@UUUUU141648+07150@jٴN@8̃rb141654+25020@j =p@,_141700+07410@j6i@:L_,141654+26320@jR@:NF141654+26320@ji6@A` `141706+35330@jzG@=p 141706+06220@j6i@ r141706+06220@jX%@A4141706+35220@j\(@1$h5141712+18060@j~K@1OP141712+17520@jݧ@t@'?ۗS141718+11510@j,_@"Ӡm:141718+09360@j_-@1W141718+18050@jUUUUU@3q141718+20100@jܴN@Bu0141730+36220@jۋX%@F =p141730+46050@j܈@D+ʆA141730+40330@j/b@ =p141730+04130@j%Y@88141742+07170@jzG@$7H141742+10290@j⪪@x#141748+04090@j/b@!raQ141748+09090@j\(@HK~141754+49280@jK~@141800+04120@j6i@1\(141800+17590@j@$L;*141800+10400@jK~@\(141812+05390@jGz@I\(141806+52080@j =q@~K141812+05430@jb/@L]^o141812+56570@jX&@Gz141812+07080@j@t @# ` a141812+10050@j~K@!~K141818+09130@j@4qu0141818+20410@jX&@AN141818+35250@j@S>?141818+04330@jzG@ N141824+03280@j@t @:i6141818+27050@j%X@5141824+22100@jR@ϤO141830+06260@jQ@.m:Ӡ141830+15130@j聴O@ +@+ +141948+14090@j(\ض ` a141948-00090@j\)@I1I141948+50390@ji6@CL;*141954+40130@jzG?FW141954+00170@j@t@.,l142000+15180@jN@&(\142000+11320@jt @@+oW$142012+13570@j\(@|142006+06240@j =p@B$h142024+37200@j,_@D(d142030+40330@jUUUUV@CG{142036+39490@j򈈈@I@?.142030+50450@j/b?%X142036+01540@j\)?P?.142042+01120@jG{@7` `142036+24010@jQ@2Gwwwww142042+18300@j:Ӡn@B\(142042+38130@jffffg@@lN142048+33040@jzG@GFF142054+46460@jb/@- +142054+15000@ji6?vT2142054+01570@j\(@:D @t142054+26290@jX%@D5g142100+40390@j6i@D0Q142106+40360@j"""""@NGz142106+61550@j@,5yG142100+14280@jX%@M. 142112+60100@j%X@"y,_142118+09280@j\(@DEg142118+42000@j%Y@M4Vy142118+06480@j@-Gqr142130+14520@jN@yP?/142342+30420@k ,`@L(\)142348+56330@kX%@(ò142354+12340@kGz@i6142400+02580@k~K@}'}142400+06120@kp >@CcraQ142400+39000@k6j@&X%Y142400+11230@k_,@:?#Eg142406+26280@ki6 bj|142406-03120@kN@5,_142412+22030@k\)@&ʆA142412+11370@kG{@.˩eC142412+15370@k =q@HH--142424+48470@k~K@;0n]L;142430+27250@k/c@!^&7I142430+08540@k,_@)_,142436+13070@k,`+142454+31100@km:ӡ@LJvT2142500+56490@k(\@@Q142500+33280@kN@C\(142500+40110@kN@I+}'}(142624+30510@k'/b@&d 142630+11250@k(@ 0d142630+03220@k(i6@ò142630+04540@k& =p@<ò142630+29120@k',_@+P?/142636+14050@k&@:?.142636+26150@k$R@C˩e142636+39130@k&6i@>i4142636+30380@k(@bj|142636+08040@k)i6@KeC!142642+02300@k'@9u0142642+25460@k'X%@71142642+23250@k"ffffg@L ` a142642+57250@k:Ӡm@Q{˩e142642+70100@k*i6@'cn142648+11550@k!@N142654+61250@k( =p@AYj142654+36100@k@Qlm:Ӡ142654+69560@k*K~@4142654+20530@k,m:Կ,_142700+00110@k)\(@> =p142654+30180@k)b0@>ll142700+30150@k*:Ӡm@ r142706+31030@k-b/@ 142712+03270@k+i6@5֊W142706+22040@k)Q@DX%142706+42030@k-%X@%+~K142712+10480@k-%Y@n142712+07280@k)R@FY~K142724+44550@k.,_@'5y142718+11590@k,Ӡm:@:[[142724+26170@k.%Y@+u0d142724+14010@k/b/@n142730+07280@k,@A ܺ142730+35400@k0%X@ 142730+03260@k+~K@F5yG142730+45180@k0@t @. 142730+03590@k,X%@CUu0142730+38530@k*b/@JU:Ӡm142736+52530@k.\(@A~K142742+35470@k1 =p@-"""""142748+15060@k1wwwww@7ll142754+23150@k/,_@BoHY142754+37050@k033333@B.zG142754+36350@k1~K@;--142754+27450@k3i6@'*142800+12090@k4b/? =p142800+02030@k1b/@?7qr142754+31260@k2~K@7ۗS142800+23170@k. =q@HϮzH142800+49500@k4X%@, 4V142812+14150@k5?2˩142812+00280@k5@t?N142812+02050@k.wwwww@JQ142812+54120@k5DDDDD@P?/142812+07300@k46j@'t A142812+12060@k6"""""?Ϸ. 142812+00280@k4zG@989142818+25440@k1i7@Fp =142818+45460@k3b/@A+142900+83310@k=G{@"""""142912+06220@k;p >@>u0d142906+31000@k# @t@S~K142918+79060@k;_,@@-142918+33270@k?@!ݹu0142924+09090@k;N@C5yG142930+39290@k?@t @HYk142930+06280@k?t @@!FW142930+08520@k:fffff@G.142930+47430@k?X&@0g142936+16590@kA~K@\(142936+06240@k<Q@H142948+50100@k?O@@4Vx142948+33510@kB,_@#142954+10090@kC?Ӡm:142954+00300@k@""""#@B'W$142954+36310@kCm:Ӡ@ (5y143000+08180@kA33333@?&7142954+31480@kA =p@<>142954+28460@kF? +_,@KGz143012+56100@kC@;m^o143012+27390@kDӠm:@:/,`143012+26240@kE@#Ȭ5y143018+10060@kFN?zG143018+01440@kAzH@FUUUUU143024+46080@k*@t@Sn]L;*143024+79280@kF/b@--:Ӡm143024+14490@kG%X@'0 =q143030+11490@kEQ@?Q143024+31530@kEQ@B&7H143036+36310@k-/b@SSʆB143036+79050@k@,_@L4Vy143036+58090@kIK~@,_143036+04100@kCm:@H󻻻143042+50070@kIN@88143042+02520@kI:Ӡm@%X&143042+10430@kF/b@BZn]143042+36550@kJQ@9u0d143048+04070@kJwwwwx@ 4Vy143048+06590@kIX%@+\(143048+14020@kJm:@",l143048+09180@kJ@-.143054+07050@kK=p @^o143054+04400@kL~K@ |/b143100+03540@kKm:@"}u0143100+09280@kF:Ӡm@H\(143100+49400@kL%Y@$h143100+02510@kKN@4~K143106+20130@kJ,_@<n]L143106+28550@kNp >@}'}143118+04100@kJ33333@DN143118+41520@kNt @@ o143124+03540@kN\)@՞&7143124+05400@kO%X@ ,_143130+03580@kH6j@Ju0143130+53300@kO~K@9u0d143130+04000@kMO@< 4Vy143124+28160@kIN@Jò143136+53280@kP,_? =p143136+00490@kP@ G{143136+03580@kL\(@An143130+36100@kQt @@$ldۗ143142+10260@kQm:Ӡ@)bj|143142+12540@kQ\(@)m@t143142+12560@kR@ P?.143148+03530@kN@t @D j|143148+40170@kNt @@D l143148+40180@kR,`@!P?/143148+09120@kQN@;j|143154+28100@kQN@9wHY143200+25410@kTQ@#&8143206+10000@kU:Ӡm@88143206+04290@kV~L?o143212+01050@kV/b@ *143218+03330@kUm:@# 143218+10030@kS@?L;*143212+31460@kV%Y@ (\)143218+03520@kVQ@ TIJ143218+08230@kVi6@$ &8143218+10150@kTK@>u0d143218+31110@kTG{@>G143224+30300@kXQ@ i6j143236+03450@kS33334@H143236+48150@kXt A@m-143236+05340@kZ =q?x#143248+00400@kX@t @:@)143306+13070@k]ᅨNO143312+00110@kTR@MN143312+59340@k]Q@ F143318+08310@k]Q@*W =p143318+13230@kV/c@K<N143318+54420@k\@6Q143312+22570@k^@0OP143324+16150@k^N@86j143330+24560@k\Q@Bh?.143330+37010@k[\(@H^143342+48570@ka\(@"I>>143342+09210@k^zH@BE-143348+36450@kbQ@SʆA143348+05330@ka:Ӡm@5*143348+22010@k_i6@B\l143354+36560@ka(\@143518+06580@k](\@Ra,_143536+73450@ko6i@/j|143530+16050@kn\(@5Ӡm:143536+22110@kp"""""@$\#Eh143536+10230@kpGz@$S33333143536+10220@koX%@, +<143536+14400@kn =p@>z#E143536+30420@kr33334ffffff143542-00090@kq\(@";*143542+09330@kri6@ H?.143548+03370@kqX%@' $h5143548+11470@kl~K@I˩e143554+51480@ko/c@D &7143600+40190@ksb/@2/W$143606+18240@ksN@7UUUUUU143606+23330@ku~K@#&7143612+09450@kr,_@D:t @143618+40400@kvX%@$>K~143624+10200@kq\(@GQ4143624+46510@ktN@qGz143636+30390@kyzG@tVx143642+05350@kz@ʆA143642+02560@kzb/@ aP143648+03350@kuӠm:@GT#Eh143648+46530@ky~K@/Gz143648+16060@kx@>[[143648+31010@ktp =@IhQ143648+51040@kv\(@Dd143654+41140@kx%X@>N143648+31100@kz%X@4 ~K143654+20150@k{@1|143700+17140@k{@'raQ143700+12080@kuN@K#m:143700+54300@k{i6@3 s143700+20120@k|:Ӡn@"xvT2143700+09270@kv"""""@I#143700+51340@kw@t @GU0d 143706+46530@k} =p@ ,5y143706+03220@koN@Q@d143706+69150@kq@t @P&7143706+66330@k~i7#Eg143712-00320@kwGz@In]L;*143712+51220@k|,_@8j|143724+24450@k~~K@2~F143724+18430@kQҝi6143736-00050@k =p@*g143742+13350@kN@"vT2143754+09410@k@2~K143748+19100@k,_@:vT2143754+06310@kӠm:@">?143754+09410@kR?~K143800+00460@k~\)@E_#Eg143800+42580@k,_@?[[143754+31430@k@0n]L;*143800+16540@k@-zH143800+15030@k @t@ &143806+03350@k33333@ u0143806+03400@kӠm:@8#E143806+24560@kQ@ 8143812+03400@k,_@ K~143806+03350@k6i@"1Yj|143812+09190@k=p @Ec 143818+43000@kzG@ qr143818+08400@k|i6@OdۗS143818+62130@kN@5興143818+22070@kzG@@i7143824+34120@ki6@ YP?/143824+03370@kQ[[143824-00070@k@ 9u0d143824+03440@k,_@}'}'143830+02220@k~K@ 143824+03210@k/c@?_˩e143824+31350@kQ@54 @t143830+21250@kfffff@,143830+14330@k =p@,_,143836+06160@k33333@CQ143836+38510@kQ@%--143854+11010@kt A@"#Eh143906+09390@kzG@J143906+53440@k@ϤO143912+06100@k~K?u0143912+00520@k\(@6n]L;*143918+23090@km:Ӡ@2 143918+18460@k33333@?x143918+31510@kGz@F=L;*143924+44420@kӠm:@ II143930+03360@k=p @3@n]L;143924+19280@kQ@"ra143930+09360@k6j@ rb143936+08410@kb/@ClOP143930+39040@k =p@  143936+03320@kGz@FA143942+44440@kw =p@S#E143948+78230@k =p@!ZvT2143948+08530@k@t @!>143948+09130@k%X?ʆA143954+01050@kӠm:@!o143954+09130@ki6@ ۗSʆ143954+03260@kX%?#Eg144000+01420@k\(@8144000+04380@ki6@9X%144000+25430@k/c@6UC ܻ144006+22330@k@:='}'144000+26270@k~K@Ӡm:144006+04110@k=p @g@t 144006+05340@kN}'}'144012-00090@k@t ?,_-144018+00530@k @t@6ZaP@144012+22340@k%X@!t @t144018+08560@kp >@144100+10580@kN@&g}'}144106+11250@k~K@&pn]L;144118+11260@kQ?144124+01490@k~K@'8Q144124+11490@k\(@7 144124+23140@k@t @#W144130+09440@k/c@0yP?/144130+16410@k(\?ۗS144136+01250@kwwwwx?--144136+01250@kt A@"O144142+09300@k,_@ۗS144142+04260@kt @?i6144148+00150@k =q@X%144142+08100@kQ?yF144148+00150@kX%@2Eg144148+18140@k/b@HOO144148+49360@kDDDDD@@ @t144154+33370@k@t ?Gz144154+01540@k\(@30d 144154+19140@k,_@(C89144200+12210@k,_@(AN144200+12210@kG{@4:Ӡm144154+20500@kt @ 6i144200-03020@kGz@EOO144200+43470@ki6@/t @144200+15450@ki6@.T2144206+15420@k/b@!ۗS144206+09100@k,_@<5y144206+28450@k\(@JN144218+53370@kt @?K~K144230+02100@k~K@6p$h5144224+22390@kp >?ܺvT2144230+00440@kUUUUV@eC 144230+04430@kN@"dۗ144242+09290@kN@:Mi6144242+26300@kzH@5vT2144248+22070@k~K@3no144248+19390@kb0@1j|144248+17580@k=p @1e,_144254+17360@kQ@3w. 144306+19410@kt @@Hi6144312+49550@kN@>m˩eC144312+30380@ki7@C]@t144318+38560@k@?o7HZ144318+31390@k,_@0j|144318+17100@kR@;8144318+27150@kDDDDD@Cc =p144324+38590@k\(@%n144336+11010@k=p @ &7I144330+08430@kzG̟II144342-00010@k@t @*7HZ144342+13140@k,`@$6j144348+10370@kwwwwx@<W144336+28440@k@t @9#144348+25480@kӠm:@(N144354+06450@kzH@% eC!144348+10450@kt A@* 144400+13140@k,_?eC ܻ144400+01290@k~K@'n144400+11420@k@IX%144406+51480@k@I2t @144406+50380@k6j@%HYk144412+10570@k:Ӡm@+Z+?144418+32590@km:ӡ@)5 +144418+12490@k6j@A/n]L;*144418+34350@kDDDDD@0%X&144412+16210@k6i@3H5y144418+19300@k/b@'#ra144424+11470@k:Ӡm@5O144424+21160@k~K@+4Vx144430+14030@kp >@@M^o144430+33370@k"""""@'@144430+11500@k@?/c144424+31550@kN@@` `144436+33360@ki6@'/W$144436+11480@kGz@ aP144436+03490@kGz@+V ` a144442+13520@kt A@'/˩e144442+11480@kR@%ۗS144442+11120@k,_@+S 144448+13520@k/c@( 144448+12400@ki7 144442-00450@k"""""@+O7HZ144448+13520@k~K@'+4V144448+11480@k_,@0Ib/144448+16300@k6j@*̨dۗ144448+13370@k\)@*6j144454+13400@kG{@0HYj144448+16300@k?dۗS144454+02110@k@2ۻ144454+19040@kN@zG144454+07230@k@)zH144506+12590@k"""""@R4_,144500+73010@k@7Eg144506+24090@k @t@* :Ӡm144506+13140@ki6@"vx144506+09270@k,_@$˩eC144512+10370@k=p @Q;144512+69100@k@#Qq144518+09520@k@#m:144518+09440@k =p@2n]L;144518+18430@k@t @+R,_144536+13530@kR@"+144936-02200@k~K䱿h5y144936-00030@kzG@F144942+04530@k/b@DL~K144942+40490@k~K@S[[145000+79580@k33333@(,_144954+12300@k/b@E҆Au144954+43510@k =q }u0145000-03210@kffffg@M}0d 145000+59100@kQ@ (dۗS145000+03200@k @t@1%X145000+17200@kN@/7HZ145000+04450@kN@=dۗS145000+30030@k=p @4UX&145000+20330@k@ ~K145006+06280@k@EۗS145006+43560@k%X@ 145012+03250@kX%@OO145012+08080@kt A@(\145012+07070@k/c@7. 145012+08010@kߣ =q@II145024+51290@kwwwww@Ȉ145024+08090@k @t@=θQ145018+30000@k,_@0eC 145018+17060@kڝi6@P2˪145018+66130@ki6@#145030+10050@kb/@ _#Eg145030+03300@ki6@){raQ145036+12570@kN@ }'}145036+03320@k~K@0}'}(145036+16530@kX%@N_b0145036+60560@k/b@0m:145036+16530@k@zG145048+04090@kGz@Rt =q145048+74010@kQ@145048+03100@kꙙ@U&7145048+08020@k/c@ ib/145054+08250@kK@0$h5145048+16530@kzH? rb145100+00120@kfffff@Q145100+03160@kR?w~K145100+00120@kzH@ 145106+03470@k =p@ ` 145124+03410@kX%@JAu145124+03130@k着@ \(\145130+03450@k:Ӡm@4@t145124+20190@k"""""@$/W$145136+10180@k@t @$)b/145142+10170@k\(@(#Eh145142+12420@k񪪪@HYk145142+04570@k\(@]145142+05030@kX%@RYj145136+74440@kR@--145142+05000@k @t@N145148+04430@kb/@"145148+04290@k\(@J F145154+52170@k(\@ Au0145200+03290@k_,@145200+03100@k"""""@0Z|145200+16340@kQ@>5\(145200+30250@ki6@$i6145206+10310@k=p @CT;*145206+38510@k6i@$u0145212+10310@ki6@<𑢳145212+29090@k:Ӡn@8 +<145218+24130@kzG?䁴N145218+00500@kX%@OF145218+63530@kzH@7~K145218+23500@k:Ӡn@4 eC 145218+20140@k/b@EGn]L;*145224+42450@k,`@2*145230+18180@k\)@8#145230+24170@kp =@-145236+02550@kN@B4145230+37170@k@'e,_145236+11540@kwwwww@15y145236+17490@kzG@9G{145236+26000@kt @@#8vT2145242+09480@kwwwww@S +<145242+79490@kX%@2 u0d145236+18140@kX%@P%F145236+64480@kX%@B145248+37370@k=p @EʆA145248+42130@kӠm:@15yG145254+05300@kDDDDD@DdzG145254+40590@kX&@J =p145254+53250@kwwwwx@0;*145254+16450@k =q@0n]L145254+16430@kN@!u0145306+09010@k@@ܺvT2145300+33550@kb0@QP?145300+70400@k\(@#,rb145318+09470@k6i@E?.145318+44000@k@E@8145324+42420@l6iп6i7145330-01120@l(\@N145330+02390@k_,@',_145330+12040@k@',`145336+12040@k@t@D\)145336+41270@kQ@F:Ӡm145354+45450@li6[145400-01550@l(\@4\(145354+20440@kb/@RHm:Ӡ145400+73200@l@"yF145400+09330@lӠm:@"i6145412+09340@lN@~K145412+06400@lUUUUU@$h145412+06400@l,_@_II145418+05470@k(]@HN145406+49560@l"""""@U +145418+05470@l/b@F$h145412+45370@l|145424-01560@lzG@"~K145430+09280@l\(@>;X%145424+30250@l@,Yj145424+14360@l/c@#|M^o145430+09570@l/b@HʆA145436+49360@l6i@H+F145942+02130@l33333@Ry'}'145942+74050@l)Ӡm:@JLVx145936+52480@l/(\@9ò145936+26100@l0m:ӡ@5Sn145942+21320@l2=p @` ` 145948+06330@l2m:@x145954+05510@l,UUUUU@H(d145948+48310@l2/b@' +145954+12070@l,t @@Hfffff145948+49180@l3/b@&i4150000+11240@l3N@.zG150000+05450@l.@G + =p kQ150112-03060@l;~K@1L;*150106+17180@l6Q@J150112+53430@l@?ra150136+01240@l> @t@:6j150136+26170@l@(\@$$h5150136+10370@l1/c@Qò150136+68280@lD =p׿C ܺ150154-00400@l>N@EYn]L150154+42530@lC\)@150200+02320@l@,_@@Ell150200+42180@lAm:Ӡ@Q150524+14490@l] =p@-AN150524+14490@lR,_@O} s150518+63120@l_N?N150530+01250@l;m:ӡ@T 6j150600+80250@lWGz@LA,_150536+56440@l`R@s|150536+02370@l_b0@+150536+14040@laQ?raQ150542+01260@la%X@ OO150542+08150@la@$ʆA150548+10290@lb"""""@2n]150542+07010@l`,_@;\)150548+28100@laK@4.O150554+20220@ld~L@$d&150606+10230@ld6j@0d 150600+05520@lc33334@35C ܻ150606+19240@lW=p @P@t 150606+66210@ldzH@+W. 150612+13520@ld,_@3/%X150612+19220@lcG{@5n]150612+22080@lfi6?ll150618+00220@lY =p@P{ =p150618+66070@l^t @@Kb0150624+55220@l_X%@JBG{150624+52430@l^N@K`[[150624+54560@lh%XUUUUUU150630+00010@lgUUUUU@%N150630+11000@l`R@J)eC 150636+52310@lfi6@>+150642+30220@li/b@"2˪150642+09150@lcN@H:Ӡm150648+49520@llӠm:7HZ150700-00350@lhN@:}'}(150648+26430@llzG@ldۗ150700+03150@ldzG@J% +150700+52290@lli7@.150700+05040@lmb/?--150706+01340@leX%@J:"""""150706+52390@ln\(?|150718+00430@ln/b?zG150718+00390@ln =p?vT2150724+01580@loffffg?raP150724+01350@lo @t@*Eg150730+13270@lo\(@"ƊW150730+09350@lq/b'}'150736-02040@lpQ@#rX%150742+09560@li\(@JCeC!150742+52440@lqzG@n150742+07490@lr6i?X%150748+02070@ll @t@G?W$150754+46420@lm,_@E[W$i150754+42540@lrwwwwx@4Vx150748+07540@lsYj|150754-01590@ls @t@޸Q150748+07540@lr@3XYj150800+19320@lq/b@?Eg150806+32050@lZ\(@S%X150806+76150@ll6i@K@Yj150800+54410@lti6@!.ʆA150806+08480@ltN@*aP@150812+13390@l\Q@S g150818+76210@lwGz@n]L150824+05560@lwzG@vT2150824+05560@ln@t @LN150824+57120@li\(@P͹u0150812+67230@lx@t@,5y150836+04290@lxN@ 150836+06530@lt6j@D#Eg150842+41150@lyQ@$&8150848+10390@ly\(@$@t 150848+10380@lxQ@7X%150848+23480@l{:Ӡn@`m:Ӡ150854+06320@lzb0@&l150854+11360@l{X%?88150854+01460@l{@eX&150854+06320@l|:Ӡn?7HY150900+01570@l|_,?-.150900+01570@l|33333@R150900+04420@l|(\@raQ150900+05260@l|@t @}'}(150900+05240@l|yF150900-00050@l|/b@N150900+07260@l{%X@*$h150906+13400@l|b/@#9150906+09480@l|wwwww@"}'}(150906+09400@l|,_@ =p150906+05350@l~@t ?/b150912+00500@l}i7@l5y150912+07180@luwwwwx@Kò150918+55320@l|G{@1Ӡm:150918+18100@l%X ƊW150930-03030@l@@150930+05450@lwzG@J:150924+52390@lUUUUU?--150930+01520@ly@G` `150930+46200@lx\(@Jo150930+52150@l{ =p@DQ150930+41170@l~t A@7&7H150936+23200@lN@F150942+05260@lt A@%ؿ%Y150948+11070@l\(?ò150954+01400@l\(@"W$i150954+09320@li6?4Vx151000+01410@l~t @@G n]L;151006+46270@l,`@ X%151006+07570@lGz?>>151006+02070@lUUUUU@2X&151006+18500@lDDDDE@)W151006+13000@lӠm:?o151012+01380@l@4Ӡm:151012+20500@lzm:ӡ@N}'}151012+61190@l@N151024+04420@l,_@ >F151030+03200@l}zG@M,`151036+60000@lfffff@DFll151030+40450@luGz@Qò151036+71120@lQ@+4V151036+07290@lN@#Eh151036+04410@lb/@-151042+04400@l@""""""151042+04280@lK~@u0d 151042+08030@lt @@&7H151048+04280@l@g@t 151042+05320@l%X@7H151048+07250@l~K@ $h151048+08140@lzG@\)151048+04400@l,_@qq151048+02420@lN@x#151054+06480@l@D +151054+41250@lX%@=p 151106+05380@lӠm:@ +4V151112+08170@l,_@Dj|151112+41270@l/c@I[151118+51370@lQ@>g151118+31080@lӠm:@DD#Eh151118+40440@l@DBaP@151124+40430@lN@--151130+04540@l@P7HZ151130+67330@l33333@ۗSʆ151142+04540@lN@E*FX151136+42310@l\(@D#E151142+42090@l@3[151148+20100@li6@+I151148+14050@l/c@(,5y151148+12160@li6@4zt @151200+20400@l@E151200+42110@l{ =p@R؍&151206+75340@li6?P?.151206+01590@l,_@6K[151206+22290@lb/@ |151212+08320@lt A?wwwwwx151212+01200@l =q@4Ӡm:151212+20590@lQ@P.O151212+64540@l"""""@FKm:151212+44470@l~K@MA5yG151218+58420@l}p =@Rأ =q151218+75340@lN@:N151224+26470@lGz@( r151242+12130@lp >@O\(151248+05460@l~K@FX151248+05230@l,_@I*=p 151248+50330@lffffg@F151254+04520@lK?eC ܺ151300+01570@li7@'151300+02250@l6i@{*151300+06340@lQ?K~K151312+01370@l(\@ +?151318+59020@lN@9t~K151312+25380@lzG@(Qq151324+12200@l@(pn]L;151324+12240@lt @@% 151348+10420@l @t@/b0151348+06590@lzG@)z#E151348+12550@l/c@!c89151348+08520@l\(@ 151348+07200@lUUUUU? 151354+00530@l =q@1+[151348+17200@lzG@uyF151354+06030@lGz@ 3>?151354+08180@l/b@NӠm:151400+61230@lQ@K4Vx151400+55420@l:Ӡm@u0d151400+07560@l~K@8ށN151406+25020@l@t?0d151412+01260@lUUUUU@)"""""151412+12550@l,_@x151412+07350@lX%@/b151418+07120@lN@DDDDD151418+07110@lUUUUV@3 +F151542+05300@l6i@ ~Q151542+08260@l%X@+?.151548+14000@l\(@-2,_151548+14460@li6@(+ =q151554+30520@l6j@)151600+13090@l~K@(_%X151600+12220@lQ@)m:Ӡ151606+13070@l:Ӡm@C4V151612+38240@lX%@LTOP151606+56510@lt @@5;151606+21250@l@--151612+06050@l6j@E_wwwww151612+42550@l@vò151624+05030@l =p@K~151624+06370@l:Ӡn@p =q151624+04170@lX%@DDDDD151630+05230@l =p@ʆA151630+03100@l33333@UUUUU151630+04420@lt @@ Gqr151642+08190@l@ 151642+05410@lG{@#5y151642+09570@lG{@#8151642+09590@l =p@DʆA151654+42020@l@*@ ` 151654+13190@lӠm:@ eC!151700+05260@l_,@&$h151700+11140@l\(@#Q151706+10090@lK@4yF151706+21050@lb/@9ɇeC 151712+25580@l%X@ 2,_151724+08170@l(\@33333151730+05360@l_,@F5y151742+46040@l%X@',`151742+12030@lm:ӡ@ %X&151748+03420@lK~N151748-00040@lDDDDE@?a151748+31330@lQ@(+vT2151900+30500@lR@$h6151906+07540@li6@ %X151912+03540@lR@& =p151912+11260@lb/@ ò151918+08360@lNjX%@F$h151912+45550@lǏ\(@F_,151912+45550@l @t@50t A151912+21230@lʿ%Y@>151900+30500@l(\@<,`151912+28440@lθQ@~K151924+07530@lR@ +151924+07530@l~K@D5y151924+41540@lψ@H?.151930+05150@l_-@ 151930+08370@l@t @i6151936+03560@li6@9׮zH151924+26010@l/b@*II151930+13260@lϏ\(@%"\(151930+10450@l~K@7' =p151930+23250@l,_@IVzG151936+50520@lб~K@kQ151936+06020@li6@CF151942+39220@lш@cEg151942+06010@l =p@+N151948+14060@l~K@?.151954+05340@lDDDDE@?;eC!151954+31240@lл@@[152000+33200@lR@:bj|152000+26350@l@D4Vx152006+41180@lb/@!o˩e152018+08540@l֣ =p@ )6j152024+08160@l=p \(152030-01100@l =p@!}p =152036+08570@lQ@&7I152030+04420@lױ~K@ IJ152030+08140@lm:Ӡ K~152036-03200@l/c@!/c152024+08560@lp =@-,`152036+15110@l,_@RnvT2152036+73540@lظQ@!7~K152036+08470@l/c@=OP152042+29570@lخzH@&}p =152042+11250@lt @@!D 152048+08490@l٣ =p@!F152048+08440@l@!JAu152048+08500@li6@!%[[152048+08450@lڮzH@!F +<152218+30270@lӠm:@ پF152224+08370@lR@E2G{152230+42340@l@* =p152242+13370@l/b r152242-01390@lĪ@S߻152254+79410@l~K@Mll152236+58140@lzG@S߲n152254+79410@lm:@o152248+07200@l(\@) =p152248+13040@l~K@3հ[[152248+20000@l@#vll152254+09550@l~K@Vx152300+07160@lt A@+u +152300+13540@l"""""@9,_152300+04590@l~K ;152306-03290@l,_@BG{152318+38080@lX&@2Gqr152312+18270@lX%@Q(qq152324+68500@lb/@:M^o152324+26440@lGz@4I152324+20580@li6@Gqr152330+08000@lX%@H:Au152324+48380@l@t @=Au152336+29460@l𻻻@"h152342+09230@lzH _,`152348-03230@l\(@0R,_152342+16300@lzG@PɇeC 152342+67200@lb/@2-.152342+18150@lX%@Qp?.152348+69570@l@t @!(\)152354+08450@l~K@_,152354+04000@l\)@"|152400+09340@l@!.O152406+08460@l6j@D˩eC152418+41510@l @t@D֊W152418+41510@l:Ӡm@J8\)152424+52370@l%X@Q.,_152424+68550@lGz@0ʆA152430+16440@l@t@PVx152430+66250@l"""""@.%Y152430+15280@li6@E-L;*152442+42320@l @t@Di6152436+41280@l =p@*ZG{152442+13210@l/b@ @t152448+06400@li6ۗS152448-02440@l@DH?.152448+40440@lb0@@WSʆB152700+05160@m =p@ p >152700+03380@m X%@JAu152706+07450@m p =@4^o152706+20550@m X%ra152706-01450@m %Y@ ò152712+08130@m X%@@i152718+33000@mN@O152724+05110@m~K@P0 152724+64550@m =q@ /b152718+03410@m X%@:5yG152718+26100@m """""@C[[152724+39480@m i6@>|_,152742+30390@mN@)t @152742+13100@mt @@Zt @152742+06010@mQ@7|152754+23480@m*152754-02060@m b/@ES152754+42500@m G{@EcSʆ152800+42570@mi6@Eu s152800+43050@mGz33333152806-02020@m@t @;"j|152806+27180@m,_@;152812+27160@m(\"""""152812-02390@mX%@F5y152818+46050@m"""""?6i152824+01090@l/c@SJ ` a152830+77200@m~K@ieC 152830+04310@mi6@HYk152836+07100@m~K@ 152836+07100@m~K@N152842+06360@m =q@KX%152848+04300@mi6@ò152848+07380@mG{@E[ 152854+42530@mzG@l152900+06050@m K~@PQ152900+67480@mN@?n]L;*152906+07300@m\(@[[152912+07310@mm:@&fffff152912+07280@l_,@Td152900+83150@m6i@//7HZ152918+15450@mX%@;raQ152918+07290@m_,@"ʆA152924+09380@mR@9>zG152930+25240@m i6@^o152936+07380@m =q@KX152942+54510@m!%X@p >152936+04550@mN@D7 =p152942+40360@m"m:Ӡ@i7152948+05510@m"6j@ 333333152948+03400@m"N@"]L;*152954+09380@m"=p @2vT2153000+18500@m$DDDDD@u0d153000+04510@m$wwwww@f7H153000+05160@m$\(@%Y153000+04570@m$@$Eg153012+10300@m @t@Fqr153012+45360@m%~K@>153012+04550@m& @t@ j|153018+08260@m'?2˩153024+00360@m(%Y˩f153030-01280@m( =q?˩eC!153036+00440@m&=p @7/II153036+23200@m,/cvT2153100-02480@m&R@D153100+41220@m(Gz@B<~K153106+36380@m,N@ /b153112+08360@m'UUUUU@FD5y153112+44420@m'%Y@FE˩eC153112+44420@m.\(@*153118+05280@m' =q@G9R153118+46370@m =p@P$h153124+67440@m.@--153124+05270@m$:Ӡm@Lܺv153118+58030@m-%Y@. =p153124+15100@m.b/@%7HZ153124+10570@m)\(@D6j153124+41150@m)@FD/b153124+44420@m.~K@&g153130+11110@m-UUUUV@8g$h153130+24340@m.@5,_153136+21110@m-/b@:# 153136+26180@m.Q@5"aP153142+21190@m ~K@QHY153142+68250@m1i6@_ۗS153142+07160@m1 @t@,=p 153148+14340@m0X%@6%X153154+23050@m0N@;W@t 153154+27300@m0@@h8153200+32590@m3@(=p 153206+12260@m4Q@.ci6153212+15210@m+Q@LG$h153218+56450@m5@ W153206+08310@m6"""""@15yG153212+06280@m7Q@ +153224+05070@m7N@#*Au153230+09450@m7@'$h5153236+11550@m5/c@? @t153242+31140@m9@@153242+05140@m6X&@<zH153242+28500@m7@t@7?.153248+23400@m:DDDDD@ffffff153248+05160@m::Ӡm@W153248+07180@m0Gz@LW}'}153248+56520@m9b/@0vT2153248+16430@m;~K@(Q153300+12130@m;@)eC 153300+06280@m:X&@4HY153306+21000@m9,_@;S33333153306+27300@m;@9L'153312+25280@m:%X@>:Ӡm153312+31010@m:_,@>ͧ@t153318+30580@m=Gz@)6T2153318+12460@m>/b@DDDDD153318+08070@m>@!L;*153324+09020@m>R@;raQ153324+06140@m?p =@!yu0d153330+08540@m?@-\)153330+14410@m66j@L9N153342+56380@m@ =p@#x8153342+09540@m?%X@9WSʆB153342+25300@mB,_@4V153348+06050@mBt @@eC 153348+05500@m>X%@Cj|153400+39570@m?/b@CVfffff153400+38500@m>N@FjaP153400+45000@mE@t @ P?153406+03310@mBӠm:@;M4Vy153406+27290@m4K@Pn]L;153412+67590@mE6j@Au1153412+03580@mD:Ӡm@0eC!153412+16460@mD@t @0p ` 153412+16360@m?@E%X153418+43390@m@~K@Cj|153412+40000@mCN@6$h5153412+22400@mE =q@" &8153418+09110@mB/b@>o153418+30510@mDӠm:@1Vi7153418+17300@m@_,@Em:Ӡ153424+43400@mC@?153424+31170@mG~K@?.153424+04550@mDX%@9#Eg153424+25180@m<R@L;ʆA153424+56390@mFGz@9j#E153436+25350@mCi6@Ej|153448+43410@mDN@DT2153448+41580@mDzH@E]L;*153454+43350@mC,`@Gp =153448+48000@mHN@9 ` 153454+25430@mEi6@E r153500+43430@mHQ@=Vx153500+29300@mE/c@Ffffff153506+44240@m@/c@MȈ153500+59440@mK,_@*Vi7153506+13190@mM,_ rb153506-01360@mL =p@C ܺ153506+06090@mK @t@4vT2153512+20430@mp =@T,_153500+82380@mM @t@"Gz153512+09290@mKzG@5o153512+21550@mNb/@II153512+03110@mOqr153518-01350@mKK~@@zG153524+33500@mM@1>>153524+17250@mI,_@E&7I153530+43280@mNӠm:@6m&8153536+22350@mQm:Ӡ@#Eg153542+04570@mH,`@KN153548+55250@mP\(@:B-.153554+26250@mP@:H +b/@R\ 153618+73370@mVzG@o153618+07040@mRӠm:@@zH153618+33200@mWQ@TzG153624+04450@mV~K@()>>153630+12140@mX\(@]i6153636+06000@mX@t @l153636+07540@mXzG@Ib/153636+05440@mW:Ӡm@17H153636+17120@mU@=iI153642+29350@mW\(@0tzG153636+16370@mX/b@%P?/153642+10580@mY =p@OW$153648+05590@mU"""""@Bz153648+37070@mVN@=lrb153642+29350@mW,_@7~K153648+23570@mOQ@M153648+59330@mYb0@,ZvT2153654+14190@mXQ@?\(153700+31550@mZ:Ӡm@8tzG153706+24370@m]DDDDD@ SʆB153706+03220@m]33333@$p =q153718+10230@m\_,@1n 153712+17350@m[zH@8n]153718+25060@m*_,@T7H153700+82250@mYӠm:@Ell153730+44020@m]6i@5dۗS153730+21570@m^\(@,`153730+14200@m]b/@9p =153730+25540@m`\(?5yF153736+02050@mUQ@MX&153736+59310@m`t @@+zG153742+14070@m_wwwww@5153748+22020@m_,`@5aP153748+21590@m_@5xvT2153748+21380@m`~K@4&7I153754+20510@mb/c@!P?153754+07270@ma,_@5ra153800+21410@ma =p@<& +<153800+28190@mb,_@/4Vy153800+16080@mM@RPqq153806+73250@me/b@HYk153812+07360@mdt @@1 ?.153812+17170@mO@t @R#wwwww153824+72430@md,_@4153830+20440@mg:Ӡm@R153824+05180@mgQ@#153830+09550@mdN@<\M^o153824+28310@miQM^o153836-01330@m\X%@M}'}(153836+59300@mft @@153948+02370@mt,`@ s154000+02100@mq@t@7̺vT2154006+23590@mnQ@F. 154012+45430@mrm:@7θQ154006+23590@m`,_@Qi6154012+70550@mu =p@Cn154018+07580@mvzG@ {raQ154018+08240@mt%Y@7Q154024+23500@mr @t@C4Vy154030+40090@mu,`@6N154030+23020@ml\(@M =q154030+59550@mwN@,vT2154036+14230@mvzG@7|154036+23570@mvQ@8rb154036+25080@myӠm:@ʆA154036+06020@mvt A@7ò154042+23560@mx6j@/Au154048+15550@mz%X@#rn]154054+09530@m{,_@!SʆB154100+09090@m{/c@--154100+04570@m{i7@X&154100+08040@m{@t @' 154100+11400@m{33333@,%X154100+14360@m|@|#Eh154106+05010@myN@<[` `154106+28310@m|:Ӡn@1P$h5154112+17280@m|zH@64Vy154124+22550@m_-@ڼ#E154130+06370@mi6@k>154136+04560@myX&@Gn]L;154142+47540@m}@%\(154330+30180@m%Y@6ܺv154336+23020@m=p @rb154330+05180@mN@ R154336+03220@mDDDDD@<i7154336+28150@m,_@ 154342+04460@mDDDDE@~K154342+07030@m/b@! ` a154342+08570@m33333@SʆA154348+02340@m\(@%h5z154354+10550@mm:Ӡ@5ܺv154400+21140@m:Ӡm@(I+DVx154418+30250@m @teC 154430-00500@m@t @?.154424+06030@m"""""@RSʆ154436+72350@m@@ =p154430+32160@m%X@'154430+11560@m,_@@IJ154436+33220@m =p@1\(154442+18020@mӠm:@?aP154442+31100@mzG@154448+06040@mN@F}'}154454+46090@m@%q154454+10560@m/bvT2154500-01240@m~K@ h5z154500+08290@m~K@0 154500+16550@m@5ó154506+21420@mQ@5Q154518+21530@m =p@:[[154530+26130@mN@@I154530+32100@mӠm:,5y154530-02000@mwwwwx@ll154536+06050@m"""""@154900+30410@m,_@9n154906+25510@mX%@Q` `154918+71240@m@t@R&7154900+74410@m @t@QEg154918+71240@m6i@I:aP154918+50380@m\)@8o\(154918+24350@m,_@)|(\154924+12540@m@7OO154924+23570@mi7@K/b154930+55460@m,_@QʆA154942+71200@m@n]L;154936+04400@m%X@Iò154942+51570@mQ@G5y154942+47230@m~K@EyF154942+43330@m~K@)l154942+13030@mQ@Q 154948+71250@m@9aP@154942+26080@m/c@8W =p154948+24290@m%Y@4%Q154948+20170@mi6@$h154954+02360@mR@0u,_155000+16360@mzG@7W~K155006+23300@mX&@Qc =p155018+69430@m\(@8m:Ӡ155006+24460@mƅQW$155018-00230@m@Pʝi7155018+67200@m@t @5 r155030+21560@m,_@NOO155024+61130@mb/@O'zH155036+62270@m_,@8c =p155036+24320@mX%@(155036+12100@mwwwww@5F155042+21160@m6j@*xQ155048+13230@m@P&7I155048+67190@m,_@P4Vx155054+64170@mȧ@t @4,_155048+20480@mN@5 ܺ155054+21150@m~K@'|155100+12060@m=p @(155106+12130@m @t@DRW155106+40470@mt A@DOO155148+41430@mҏ\(?^o155148+00400@m@2ò155148+18470@mb/@7!155154+23170@mt A@-3 155154+14440@mQ@3'ó155206+30180@mӖ/b@2W155212+18400@m,_@DʆA155224+41450@m6j@H155218+50050@mНi7@Dqr155224+41450@m~K@0F155218+16450@m6j@Q'155236+70320@m֖/b@2W155236+19030@m =p@P:ll155236+65040@mR@5zG155242+21170@m؅Q@%5y155236+11060@mzG@;M^o155242+28000@m\)@% |155248+10400@mQ녿zG{155254-00400@m՝i7@F @t155306+45290@mDDDDD@DӠm:155318+41430@mDDDDD?5yF155324+00450@mi6@V/b155318+04590@mGz@'@HYk155324+11460@mݿ%Y@2HdۗS155324+18250@mؒ,`@F&7I155330+45380@mߪ@vT2155324+06050@m"""""@'0d 155330+12070@m@8~o155336+24380@m_,@1)I155336+17180@m"""""@D4155348+42050@mUUUUU@:wwwww155354+27070@mt @@JX&155354+52200@mQ@8r,_155400+24350@mwwwww@"qq155400+09130@m6i@>jG{155400+30330@m~K@C4Vx155406+39550@m%X@0,_155406+16400@m:Ӡn@vT2155406+02140@m,_@G#Eg155412+48000@mӠm:@HzG155418+49400@m~K@4 ^o155418+20110@m䁴O@5JӠm:155424+21270@m33334@,A#Eg155436+14160@m/b@t 155436-01240@mӠm:@H X%155436+48140@mt @@2Vx155442+18470@mDDDDD@E2n]155442+42320@mG{@2N155442+18470@m @t@>155448+06080@m虙@20$h5155448+18190@mi6@D|155448+42020@mt A@D%Y155454+42010@m =p??.155500+01160@m~K@6g$h155500+22330@m@TqN155500+81550@mR@9ѐn]L155506+25580@m~K@G,ۗS155512+46290@m/c@/#Eg155512+16000@m~K@/eC 155512+16050@mb0@H (\155518+48140@m~K@2@t 155518+18100@mQ@>\(155524+30120@mb/@0H?.155530+16250@mi7@0O155530+16270@mffffg@HX&155536+48180@m=p @H}'}155542+48190@m_,@0X\)155542+16290@m@(# =p155548+12130@m@GL;*155548+47180@mi7@΁O155548+04350@mR@ 155548+03050@mi7@3zH155600+20060@m@t @Dó155612+42040@m@DVx155612+40100@m%Y@Dp =155612+41550@mQ@1q#Eg155612+17350@mt @@Om:155624+63590@m%X@ TVx155624+08190@m\(@,h?.155624+14200@m@t @;K~155630+27450@m =p@Op =155630+64040@m:Ӡm@-i7155630+15050@mӠm:@:ѐn]L155636+26580@m@t@-*155648+15030@mX%@:"\(155648+26160@mm:ӡ@MIJ155654+58180@mN@.Zt @155700+15180@mt @@4Eg155700+20550@mzG@4Gz155700+20550@mzH@4Î89155700+20550@mQ@D4Vx155700+42040@mzG@Sqr155712+79180@m/c@#"""""155706+09580@mX%@SʆA155718+79070@m\(@HWSʆB155712+48490@m/b@5Au155712+21450@m%Y@PVx155712+64090@mDDDDD@ 155712+02510@mK~@A =p155718+35100@mm:@Vx155718+02480@m,`@FaP?155724+44540@m~K@HC4V155730+48400@mN@2&8155730+18560@mӠm:@QN155748+70500@mb/@I#Eg155742+51280@mt A@CI155742+39580@m~K@9?.155748+26050@m~K@Sb0155800+79080@m6i@BvT2155754+37100@m6j@Ts89155800+81580@n_,?~K155800+00390@n/b@4>>155812+21000@mi7@D'}'155812+41370@n,_@/_#Eg155818+15500@nzG@DUUUUU155818+41370@nӠm:@0eC!155824+16510@n/d@3+bn]155824+30310@nK@2 @t155830+18130@n@.M-155830+15170@n_-@)\M^o155836+12480@n,_@1155836+17410@n(]@0U +155836+16280@nwwwww@Gd_,155836+46550@m@M5y155848+59370@n~K@<N155842+28140@mp =@PNܺvT155848+65230@nX%@3r-.155848+19350@ni6@Ell155854+44040@n @!X%155854+08580@n R@/` ` 155900+15470@n @t @/JAu155900+15470@n ,_@1-155900+17490@n X%?QR155900+01510@n Ӡm:@0NN155900+16270@n Ӡm:@0:Ӡm155906+16490@n ~J@07}'}155906+16210@n %X@<@t 155900+28510@n6i@Js ܺ155906+53030@nwwwww@M1b/155912+58320@n %Y@1= s155912+17230@n zG@/u0155912+15380@n i6@0~K155912+16530@nwwwww +=155912-00400@nQ@HGn]L;*155912+48420@n Ӡm:@(Q155912+12300@n @3\'155912+19290@n Ӡm:@6mp =155918+22340@n,`@FyF155924+45330@n =q@ K4V155924+08170@n _,@5ZaP@155930+21300@n Ӡm:@4l;*155930+20340@n~K@*6i155936+13320@nt @@1Q155936+18060@n Ӡm:@?%Y155936+31520@m_,@QP?/155942+70290@nX%@X--155942+07140@nK~@2155948+18570@n,`@1i6155948+17130@nzG@/d~K155948+15500@n:Ӡm@/ƊW155954+16020@nN@/n]L;155954+16040@n\(@/ۗS155954+16040@n33333@?Vx155954+32010@n%X@0m&8155954+16340@nDDDDD@/aP160000+16060@ni6@0]u0160000+16300@n@t @0X#160000+16290@n/b@:S ܺ160000+26280@n,_@BYP?160006+36500@nN@+FX160018+14040@nzG@G4160018+47310@n@5160018+21160@n@Gh5z160030+47140@n~K@0>160024+16150@n%X@B ` a160030+36150@n33334@HT5y160036+48480@nQ@0R160036+16420@n:Ӡn@Eu^o160036+43020@ni6@9@160036+25230@n =p@/160042+15590@n,_@n]L;160048+05470@n%X@4 160048+21060@ni6@BF160048+37290@nb0@@\(160054+32170@n =p@;n]160054+27090@n\(@QN160106+68240@n,_@0gqr160100+16320@n@D5yG160054+41200@n@4 ܺ160106+20470@n@Qt @160118+70450@n:Ӡm@+i6160112+14030@n:Ӡn@42˪160112+21020@n,`@3)+@/c ܺ160406+15490@n5UUUUU@ 4N160406+03160@n3 =p@3qr160406+19550@n5wwwwx@SʆA160412+06430@n" @s@Q]'}'160424+69360@n4m:Ӡ@1Ɲi7160424+17540@n6i6@'Ư7H160424+12010@n7%X@YP?/160418+03550@n5=p @1-.160424+17540@n5t @@11160424+17190@n5i7@0Qq160424+16270@n6@-Q160430+14560@n#~K@Qji7160436+69500@n5@t @;ڼ#E160436+28000@n.zG@KQ160436+55300@n5\(@>u0d160436+30140@n5zH@?OP160442+32010@n8m:Ӡ@//O160442+15440@n9@ꪪ160448+08060@n9N@,dۗS160448+14240@n;N@  160454+03420@n0@Kx160500+55330@n8X%@6160454+22120@n;X%@$j|160500+10330@n;@+Ư7H160506+14010@n;N@+~K160512+13580@n9=p @>~K160506+30390@n\(@>>160512+03060@n>X%?u0d 160518+01320@n=UUUUU@+p[[160518+13510@n:X%@DeC!160530+41320@n?b0@%W$160536+10550@n Q@Tw\(160600+82010@nBN@'}'}160554+07400@n=\(@Cw%X160554+39030@n>b/@Cd160600+39190@nC,_@>?160600+07350@nD_,@#6i7160606+09440@nCӠm:@7z#E160612+23370@nDt A@(b/160618+12280@nEGz@(X&160618+12080@nDQ@5ò160624+21130@nGX%@Au160624+05450@nFp >@)@t 160624+13040@nF @u@0X%160630+16540@nHzG?aP@160630+01100@nF~K@6 G{160636+22110@nI""""#@(+Q160648+12130@nJ,_@!7H160654+08530@nH@8ܺvT160700+25000@n4Q@Rm:160712+72380@nH~K@A s160712+35550@nJ~K@9fffff160712+25500@nL\(@!6j160712+09050@nB@L =q160718+58050@n: @t@Q{$h160724+70040@nO6j?7HZ160724+00500@nN([@*[[160724+13340@n&~L@SDDDDD160800+79450@nM@< :Ӡm160736+28110@nJ33334@Dwwwww160730+41520@nQX%?~K160742+01100@nM%X@>s>?160742+30350@nQt @@0ʆA160754+16500@nR\(@/>F160800+15450@n?@QyR160800+70030@nTQ@W$i160800+04310@nSm:ӡ@) 160806+12570@nSX%@(qq160806+12260@nT@t @ 160806+04530@nNp =@E*,_160806+42270@nUi6@/c160812+02140@nT,`@$IJ160812+10100@nOb/@E160818+43150@nSX%@3Vx160812+20050@nWi6@'` `160836+12040@nVӠm:@1Q160836+17110@nV@1u0d160836+18060@nW~K@+ܺv160836+13530@nR@Dp =160836+41590@nUzG@?ʼ#E160836+31550@nXN@2ۗS160848+18380@nZGz@+Sʆ160854+13590@nZK@,&160900+14230@nU =p@D[160900+41160@nW@A/b160906+36070@nYS@89160900+24200@nY@:%X160906+27000@nY =p@:ߒ,`160906+27000@nYGz@:_,160906+27040@nV\)@Dll160906+42000@nZ@6`4Vx160912+22300@n[i6@7 =p160912+24050@nX@C $h5160918+38230@nY@A?.160924+36050@n\N@7b0160918+23560@nX,_@H\(160936+49550@nUzH@L160942+57360@nUN@L ܺ160942+57360@n`@,j|160942+14200@n_Q@4_,160948+21030@nb%X@g@t 160948+04440@nbӠm:@m:Ӡm160948+04440@n_\(@=֝i7160954+29580@n`Ӡm:@<.161006+28380@n[([@J:161006+52350@nR6i@P-161024+67580@n^X%@Eܱ~K161012+43500@nf33334@dh5z161018+04430@ng,_%X161018+00010@nf6j@@161024+06110@n]m:Ӡ@J:}'}(161024+52350@nYwwwww@NOO161018+61240@ng6i@kQ161030+02180@nf@t@&Qq161024+11170@ndX%@96i161024+25370@ng/b@aP?161030+04280@ng,_@#'161036+10000@n\@Md/b161030+58550@ndN@=]-161030+29300@nd%X@=|(\161030+29380@ne/b@=ò161036+29470@ne\)@ 161106+30570@nh6i@B161112+37250@n_@N 161106+61180@nnN?#Eg161112+00390@nki6@5Yj161112+22020@nhK~@C]L;*161118+39220@nm@*+4V161124+13120@n;@TSSʆB161100+81260@nn%X@6N161136+23030@nqX%@#E161142+06160@npp =@,n]L;161142+14240@npzG@,I+ò161400+65070@n =p@BzH161400+37070@n6i?ω4161412+00210@n/b@B s161412+38020@n/c?aP@161424+00560@nx_,@Nl161418+61540@nX%@;?W$161418+27230@nzG@E3*161430+42310@n@E3*161430+42310@nzG@3g161436+19390@n~N@KVzG161430+54470@nN@Aڡn]161442+35500@ni6@G4Vy161448+47100@n@t@AP?161500+35500@n|N@Pfffff161500+64210@n~K@*$h161518+13370@nZK@TS161500+81260@n@t @$F161518+10300@n=p @Apn]L;161512+35000@nzG@As` `161524+35010@nffffg@N6 +<161524+60330@n|zH@Qp =161536+68320@ni6@Ab/161530+35150@n=p @?1q161530+31190@n@J?.161536+53080@nQ@+>?161536+14050@n%Y@A#Eg161530+35150@nffffg@P\(161548+64130@n/b@6"""""161542+23040@ni6@A161542+35070@n\(@P}u0161554+66050@nb0@)n 161554+12500@nt @@Q]L;*161600+68290@n~K@5˩eC161554+21410@n/b@5161554+21120@n @u@696j161554+22200@n~K@G 161600+46130@n@PV 161600+65280@nzG@A 161606+35140@nyt @@RP?161612+74200@nzG@III161612+50210@nK@~K161624+07320@nK~@/161624+15400@n,_@M161624+59270@n,`@D l161624+40120@n%X@5,_161624+22050@n%X@AK~161630+35180@n\(@JR161630+52200@n,_@Q OP161636+68200@n_-@M+33333161630+58280@nQ@5Sʆ161636+21400@nm:@N6i161636+62040@n,_@9 +<161636+25460@n_,@A88161642+35370@nzG@OC ܻ161642+63580@ni6?@t A161648+01500@ni6@,%,_161648+14120@ni6@,Dh5z161648+14150@n@t @0{Q161654+16360@nX%@K4'161654+54310@n6j@ s161706+07240@nGz@A161700+35170@nQ?^o161718+02050@n,_@2{[161718+18360@nfffff@#161718+03140@nQ@. 161718+15230@ni6@ 161718+05170@n,_@AEC ܻ161724+34400@nm:Ӡ@B(\161730+37130@nt B@$vT2161736+10370@nN@n]L;161736+02080@n@A)P?/161748+34270@n =p@?H +@-6i161906+14380@n/b@D UUUUU161912+40140@nwwwwwD 161918-02100@nGz@Aa#Eg161918+34530@nwwwwx@B%Y161918+36100@nfffff@#OP161924+10030@n,_@<>?161924+28460@n~L@@,dۗ161918+32280@n_,=p >161936-01240@nQ@B06i161936+36300@nK}@#qr161942+10000@nR@K;*161948+56050@nb0@B162000+38060@n,_@Cwn]L;*162012+39030@n33332@Hu0d162012+49330@nӠm:@D9P?/162018+40340@n =q@K/c162030+55120@n@PXܺv162036+65300@n~J@Hª162036+49370@nS@AX%162036+35460@n\(?4Vx162042+01530@n%Y@-4zG162036+14420@n~K@MYll162036+58490@n@C/#Eg162054+38290@nzG@3~K162054+19060@nN@0ʆA162054+17030@nfffff@:4162100+26390@nK@B +<162100+37400@n/b@E|162100+43350@nK~@g162106+07580@nGz@L162106+57240@nffffg@CUUUUU162112+39550@n\)@B~K162112+38040@ni6@BzG162118+38020@n,_@'}'}(162118+11540@n @t@A@RweC 162136+73580@n6j@B162136+37220@n6i@C\(162136+40020@nX%@8yb/162136+24350@n,_@LK33333162130+56420@n @t@D` `162148+41460@nwwwwx@+u\(162142+13500@n%X@All162148+35070@nN@Dt @162154+41500@n_,@C162148+39150@nzH@"m˩eC162148+09190@n =p@6dò162148+22300@n\)@5˗Sʆ162148+21550@nӠm;@4.162200+20170@nzH@Fn]L;*162206+45510@nQ@DAu162206+41120@n33333@PG{162206+64350@n@B'}'162206+36200@nm:@>)eC 162212+30170@nê@3{Sʆ162212+19350@nţ =q@OO162218+07170@nQ@B&7162218+36200@n6i@I|ۗS162218+51060@n@3162224+19360@nƏ\(@#& +<162224+09410@n(\@QR162230+06110@nƮzG@#6ò162224+09430@n,_@+^>162230+13480@nN@2c ܺ162236+18300@n:Ӡn@M08162300+58300@n\(@TB/c162300+81100@n,_@>S ܺ162318+30270@nQ@Dy,_162324+41040@nzG@0tzG162324+16350@nʏ\(@@9j|162324+32350@n_,@DrOO162330+41010@nwwwww@K r162324+56010@nЏ\(@?.162336+03000@nΧ@t @0|162336+16410@nzG@Cwwwww162348+39590@nX%@*b"""""162354+13170@n͖/b@C162400+39430@nQ@D<N162412+40360@nΒ,`@D,(\162412+40280@nήzH@D>>162412+40360@n@H89162412+49570@n:Ӡn@@`Q162412+32520@nŴN@P ?.162418+64370@nΠm:@H 162424+48120@n\(@uyF162424+05580@n:Ӡl@')+?162448+03110@nڧ@t?#Eh162448+02010@n =p@)UUUUU162448+13050@nR@,˩eC162454+14260@nQ@D=L;*162500+40350@n@,0 =q162500+14120@nڧ@t@57H162506+21450@n=p @38162512+19420@n @t@Dn]L;162518+41220@n޴N:Ӡm:162518-01400@nUUUUV@5/b162512+21430@nzG@CÅQ162524+39380@nȱ~K@Q_,162518+70190@n/b@RUX&162524+73260@nݒ,`@*Q162524+13330@nۙ@=6j162530+29550@nN@IW$162536+51410@nX%@C ` a162536+39130@n=p @Hč&162536+49380@n6i@Co@t 162548+38580@n\(@EW#Eg162548+42470@nt @@C162600+39300@n/c@!O162600+08380@nӠm;@C4 @t162600+38310@nӠm:@EQN162600+42450@nzG@Dv 162600+41020@nt A@B>?162600+36150@n_,@C,_162612+39220@nwwwwx@C @t162612+39220@nߪ@C[[162612+39220@nt B@CʆA162612+39220@n~K@)W162618+12520@n6i@KX[[162618+54470@n~K@$ژvT2162624+10320@n/c@@lvT2162630+32580@nX&@C5yG162630+39560@n@D(--162630+40250@nQ@@lVx162636+32580@n⪪@Cg~K162636+38550@nK~@5~o162636+21360@n6i@1 @t162636+18000@n(]@9~>162642+25350@nQ@ .88162642+08120@n6i@ D 162642+08140@nQ@D-162642+41170@nڮzH@OTh5z162642+62460@n@M162642+59410@nzH@D/b162642+41170@n%X@D'162648+41200@n\)@J1+@COO162854+39570@nQ@DE r162854+40400@nG{@7C ܻ162900+23560@n,`@DC162854+40400@np >@Vx162906+05100@nt A@4/\(162912+20170@n33334@CzG162912+39580@nGz@6}'}(162912+22480@n\(@Cg162924+39540@nt @@CW$i162924+39570@nN@Dra162924+41160@n,_@6QN162930+22250@ni6@EIJ162936+43270@n\(@CN162936+39160@n_-@5N162936+21450@nӠm:@C-162936+39160@np =@P6i162942+67300@oN@+K` `162948+13440@o@ò162948+03570@nGz@I$h162948+50080@n@DHdۗS162954+40410@o_-@5_7HZ163006+21290@o@3|163006+19560@nm:@Ro163036+74080@o wwwwx` ` 163036-00070@o@'q163036+11500@nN@Lt @163036+57490@nt @@M$h5163048+59450@o:Ӡm@6l163054+22540@oQ@B\(163100+37270@o~K@M8--163112+58330@o Gz@Av>163118+35010@o@t@̃rb163124+07190@o b/@A4V163124+35260@om:@I3` `163136+50300@oX%@<(\163148+29060@n~K@T7H163200+80280@oDDDDD@J163148+53180@o t A@I2/c163154+50300@o/b@@u0163154+33250@ot @@4N163200+02060@o_-@3X%163200+19450@o @I3$h163200+50310@oi6@C4163206+39220@o =p@OWqr163212+62460@oX%@!TIJ163218+08460@offffg@5t @163212+21390@o%X@(\163218+07340@o(\@*9F163242+13130@o(]@76Au1163248+23190@oN@L163248+56130@owwwwx@ II163254+08280@o/c@JxvT2163300+53030@o,_@1>?163306+17520@op =?5yF163306+00250@o\(@G2+?163806+23510@o?N@B =p163806+37160@oN@T8163800+82420@o@@Bn]L;163818+37170@oC@t@7fffff163818+23520@o- =p@RX%163812+72280@oC =p@@#Eg163830+33460@oI @t@W$i163842+02430@oF@7Yj163848+23450@oC@Cܺv163848+39250@oJ,_@!Ѣ163900+09000@oHӠm:@@|163906+33520@oA =p@MO =p163918+58440@o<@t @PAu163918+66070@oO(]?5y163924+01480@oIN@C8163930+39520@oK_-@@#Eh163930+33270@oH@G163936+46060@oD%X@M eC!163936+58130@o*zG@S163924+78140@oG@IAP?/163936+50360@o+t @@SeC 163924+78140@oL,_@DN163954+40160@oJӠm:@I$h164000+51180@oNӠm:@CX%164000+39450@oNGz@CF164006+40050@oH@M~K164018+59260@oS(]@9 +164018+25100@oQzG@D#i6164024+40220@oI6i@Nq164036+61250@oX6j +@COP164230+39530@odGz@:ʆA164230+26450@odwwwww@@ =p164236+32180@of/b@6UUUUU164236+22370@o[~L@N4Vy164254+62040@okQ@25g164312+18180@oi~K@?Mu0164312+31230@on,_@cEg164324+05260@o`@O *164336+62100@op33332@ٙ164336+06340@oZ~K@QzG164342+70440@oh33333@IYj|164348+51220@oVi6@RjzG164348+73450@oop =@;ò164348+27370@oq(]@25g164354+18180@osi6@"|164354+09080@oY,_@R:Ӡm164430+74470@otb/@;Q~K164430+27250@oy,_Ѣ164436-00110@ou@:j|164442+27020@ouX&@B Sʆ164454+36100@ot =q@EaP@164500+43060@od/b@Qu0164500+70530@ow@A4zG164500+34300@ow,_@A>?164506+34150@ooi6@MϤO164506+59440@oj,_@P164518+68010@okGz@P164524+68020@oW\(@S^o164530+78290@oy,_@DSʆB164536+40200@oq@Og164536+62190@owwwww@?.164548+06240@oG{@ۗS164554+06190@o,_@+W$164554+13590@o_-@:67H164600+26180@ov~K@Ml164600+59120@ot6j@OiP?/164606+62540@ow@M6&7I164606+58320@od,_@R =p164606+75470@ot=p @PbaP164618+65380@oQ@A멇eC!164630+35550@oUUUUV@A ` a165030+30480@o@7. 165030+02290@oX%@>#165030+30480@ot A@1r\(165036+17310@oDDDDE@7>88165036+23200@o6i@˩165054+04190@o~K@> =q165100+30350@o6j@CeC 165100+39270@oO@K$h165118+55590@o =q@3dۗ165124+20000@o@O|165124+63470@o~K@I~K165130+51100@owwwww@OܺvT165136+63120@oGz@PM6j165136+65170@o/c@NAP?165142+60370@oN@Q;Eg165148+69010@oi6@KjAu165200+54550@o,_@CP?/165212+39500@o6j@8HYk165230+24080@offfff@R5y165248+74390@o,_@D|165242+41250@oi6@I@t 165254+51580@oGz@B@?.165300+36350@oGz@:4165306+26440@o =p@Eb0165324+43080@oi6@F)b/165348+44240@owwwww@165400+06010@ozG@;=p 165430+28040@o =q@PO165430+66340@oȈ@|#Eh165436+05270@oŒ,`@:֯7H165436+26550@o\(@;j|165442+27540@op =@O =p165500+63200@o%X@Ki6165512+55060@o(\@;u0d165518+27560@ot @@<04Vx165518+28160@o@Q165512+70310@o6i@6u0d165524+22400@oG|@;N165530+27550@oı~K@MeC!165542+58080@oˏ\(@D^ 165548+40490@o@TeGz165600+81400@owwwwx@DW$i165554+41400@oϿ%Y@;ڪ165600+27560@oQ@DZAu165600+40470@o(\@6(\165600+23030@om:Ӡ@D\h5z165600+40480@o @t@B4M^o165600+36300@oi6@=+>165712+02340@oڻ@=FX165724+30010@ob0@Kon]L;*165730+54560@oK~@Q:Ӡm165742+68310@o/b@G]L;*165736+47180@o6i@MzaP@165736+59030@oӧ@t@MSʆB165742+59120@o:Ӡn@Mx165748+59020@o =p@Dp =165742+41070@oմN@L/b165748+57120@offffg@M#165748+59500@o@Q N165800+68350@ob/@Till165800+81440@o\)@7raQ165806+23110@oۋX%@HF165812+50000@o@;UUUUU165818+27400@o:Ӡm@Chm:Ӡ165818+38530@o,_@6i165818+02090@ot @@$ 165818+10210@o~K@$@t165818+10210@ozH@=6j165836+29480@o6i@L8165836+56080@oi6@7 N165836+23070@oK@@U +165842+32450@o/b@nzG165842+06560@oN@7-.165842+23050@oK@="""""165848+29540@o@<[[165854+28050@oX%@""""""165854+05210@oQ@4qq165854+20450@o,`@IJ165900+07000@o@B165906+37100@oӠm:@Gj|165912+47200@o =p@CvT2165918+39390@o着@165930+06440@oG{@>SEg165936+30240@oӠm;@>*G{165936+30150@o =p@K165948+55100@oUUUUV@ۗS170024+30470@oQ@N --170030+60200@o~L@FlۗS170048+44550@o,_@(~K~170100+12180@o @s@E170100+43200@o@On]L;170100+63460@oN@"Q170118+09220@o,_@8,`170112+25000@o@DC*170118+40360@o~J@?uC ܻ170124+31310@oUUUUU@DQ170130+40430@o@?]L;*170142+31260@o(\@G/}'}170142+46270@ozG@B5&7170148+36290@o/c@NL;*170148+61140@o@8-p =170154+24150@p/b@9 170154+25070@op >@I#Eg170200+51280@ozG@?ۗS170200+31340@p# =q?Au1170200+01240@pp =@ò170224+04320@p,_@g@t 170312+30280@pzG@>eUUUUU170312+30280@p@Ct @170312+38050@p=p@DʆA170318+41560@oDDDDD@P#170312+64130@pߒ,@7'@t 170318+23140@pX%@';Sʆ170324+11410@pӠn@2t @170330+18100@p\(@2i170330+18290@p_,@E-170330+43060@pzH@#Eg170342+07510@p E,_@$$h5170354+10280@p Q@,G@t 170412+14130@p \(@170412+04570@pUUUV@Có170418+39570@p Sm:@ @t170418+02180@p n@8fffff170430+24500@p ,_@C2"""""170436+38270@pGz@O:\(170436+62310@p B\(@@ض ` 170442+33450@p fffg@C.O170448+38250@p Ǯz@&HY170448+11290@p Ǯz@AII170454+35560@p X@>EQ170500+30200@p @ADDDDD170500+35430@p X&@Gt @170506+48010@p i6@E~K170512+43040@p Q@E6/b170512+42300@pi6@&ܺv170512+11310@p.zG@Q4\)170518+68530@p m:ӡ@A ` a170518+34200@p i6@E,`170518+43110@p N@?p[[170524+31300@pE,_@R/b170524+72310@p b@>9170530+30170@p 3334@? [[170530+31110@p ΁@CeC 170530+39050@p Gz@J88170530+52120@p UUUU@??n]L;*170530+31180@p @C` `170548+39140@py,_?--170548+01010@p\(@'ʆA170554+11550@pW =p@:`t A170600+26260@p/@Ah?.170612+34530@p(@333333170612+04060@pwwwx@'@t 170618+03570@p~K@#-:Ӡm170618+09400@p3333@9h5z170618+25350@o@SM^o170618+78420@p\(@:7HZ170630+26410@p@& 170636+11320@p8Q@?&7I170636+31520@p@t@"̨dۗ170642+09290@pN@EzvT2170648+43010@pQ@Dei6170648+40520@p@"tò170648+09190@p.zG@E+` `170700+42240@pu\)@N]C ܻ170700+60470@pb@R˩170700+75290@p3333@N`4Vx170706+60480@pN@E$2˪170712+42210@p6j@SOP170712+78430@pӠm:@N~ll170724+61030@p"""""@?4Vy170724+31400@p΁@DvzG170736+41000@p%X@A67H170742+34290@p@t@DM&7170742+40410@pn@A88170748+34100@pi@OYj170742+63430@p =p@B5Q170800+36280@p@5T2170754+21430@p\(@@?˩e170812+32330@pQ@DLVx170812+40400@p@N170818+30220@pN@Q]u0170824+69330@pӠm:@4Cn170830+20190@pX%@E/,`170830+42260@pR@CP?170830+39050@pd~K@H$h170830+49220@pd~K@g}'}170836+05550@p?%Y@B&Ӡm:170848+36210@pӠm:@KUUUUU170854+55430@pSm:@C]L;*170854+40000@pN@E--170854+43260@pd~K@H*t @170900+48230@p X&@OO170906+08030@pN@DW$i170900+41430@oQ@UP?170900+86400@p6i@E$ 170912+42210@p@O|&170912+63030@pn@2eC 170942+18540@p/b@4Cn170948+20190@p/c@7aYj|170948+23260@p/b@Hfffff171000+50020@p =p@LwHY171006+57000@pkR@Bǀ171006+37370@p!X%@0N171006+16370@p =@EXܺv171006+42450@p 6@>+[171018+30140@p=p@H--171018+49370@p"/b@7E0d 171030+23200@p!]@A171036+35300@p#,_@79>>171036+23170@p!ffff@A,_171042+35570@p#i6@5M@t171048+21220@p"\(@AX =q171048+34450@p R@GQ171054+47500@p$b0@*u0171054+13060@p"rX%@CvT2171054+38050@p!zG@G~K171054+47500@pQ@LraQ171100+57400@pb@Mn]L;*171100+60030@p#@AX%171100+35090@p@R=p 171100+72280@p!Ӡm:@J\(171106+53110@p#;@EhHYk171112+42520@p\@R|171118+72210@p#i@D""""""171118+40200@p#=p @Fqq171112+44130@p&UUUUU@0 /b171118+16060@p6@Qfll171118+69410@p$@t @E1q171130+42270@p$]@EٴN171130+43450@p%DDDDD@Bd171136+37530@p%4N@E(\171142+43500@p%@t@Es[171148+42570@p&_@D{Eg171200+41010@p)Q@4P[[171218+20220@p)fffff@7j|171218+23070@p)N@7g171218+23070@p&N@H\)171218+49110@p$wwwwx@Mb/171230+59230@p*Ӡm:@7II171224+23060@p@t @RF171224+72270@p+~K@171230+06160@p(Q@C}'}171230+39340@p*hN@>4V171242+30470@p)O@EפO171242+43450@p,/b@ eC 171242+08300@p,@ OO171248+08280@p΁@R%>>171254+72390@p)Gz@F~K171254+45490@p*p >@Dqq171300+41280@p+ffff@=)171300+29130@p*@Emò171306+42550@p+_@A¡n]171306+35340@p*Ǯz@E>171306+43590@p*8Q@H3W$i171312+48270@p.K~@0S ܺ171318+16220@p(N@Mh%Y171324+58520@p,1~K@EzG171324+43430@p-N@>UUUUU171330+30570@p+,_@J14171336+52270@p0W =p@\qq171336+06540@p,?%Y@G֝i7171342+47440@p-Q@EQ171342+43200@p.\)@=gwwwww171348+29270@p-G{@EYj171348+42080@p1@='}'171354+06370@p.i6@EQ171354+43490@p2 =p@OO171400+06290@p0i@?W171418+31510@p2UUUV@ b\(171418+08150@p-i6@Ldۗ171430+57290@p-Q@L 171430+57250@p-""""@LGz171430+57230@p/Q@Jk$h171442+52540@p0Ǯz@FdۗS171436+44070@p1p @B(\171442+37230@p1N@E171442+43520@p4~K@. 171448+07480@p3@5:Ӡm171448+21400@p11~K@Gò171454+47210@p1Ӡm:@E$h171454+43240@p5zH@ó171500+07450@p6:Ӡm@ò171506+07430@p/~K@Nò171524+61250@p*@Qͫ4171518+71160@p4n@Dl2˪171530+40540@p*zG@ReC 171530+72270@p5/b@CrW171536+38570@p5@DJ+?171718+73290@p>8Q@&j=p 171718+11160@p

@Bb0171718+36060@p7Ӡm:@N>?171724+61500@p<~@A4171718+34150@p?d~K@,5y171736+14270@p;d~K@H+zG@GR171812+47450@pA X&@CYj|171842+39190@pCL@8-.171842+24560@pDQ@07HZ171854+16060@pG =p׿wwwwww171912-00450@pAwwww@I0?.171912+50250@p?Ӡm@N~K171918+60120@pBӠm:@JROO171924+52420@p@/@L&7171924+57580@pBp @I171930+51570@pIP6i@$OP171948+02030@pHi6@2}'}(171948+18370@pEhN@Eb0171954+43560@pI]@&8171954+06400@pAӠm@OM:Ӡm172000+62380@pE,_@H r172000+49170@pF X%@F;172006+44310@pJIb0? 172000+01000@pJ,_@ T2172012+08240@pHX&@>172006+30440@pIffff@2raQ172018+18500@pJ@t@>޸Q172042+30550@pJ@>ᢳ172042+30560@pL\(@)dDDDDD172048+12440@pJ%X@C?eC 172048+38320@pK,_@?W172100+31230@pJ_@Di6172106+41100@pL:Ӡ@7/b172106+23430@pHN@Mx172118+59100@pMp @7 172118+23410@pJ(@H%Y172124+48150@pN@7'}'172124+23430@pNwwwx@/?.172136+16010@pP33334?j|172130+01410@pM@@4Vx172130+32270@pOߒ,@).172142+12380@pO'@t@:|/b172148+26310@pKIb0@N8d172212+60300@pK@N#172212+60110@pJ@O'}'172218+62130@p@Ib0@SC\(172200+77060@pPӠm:@@뻻172218+33530@pR/b@4eò172224+20260@pQ~K@8%Y172218+25000@pQ@=c =p172230+29260@pN\(@Jll172236+52040@pMb@L|172230+57020@pOzG@H=UUUUU172236+48310@pPb@Eu0172242+43300@pSӠm:@85y172236+25000@pSd~K@7_,172242+23470@pO @@I172254+52000@pLX@O2˪172248+63580@pQN@Fx[[172300+45000@pU_@$ 172300+10200@pR"""#@F =p172312+45330@pU;@7Q172312+23210@pR~K@H,/b172318+48230@pS*@FL;*172324+45590@pSIb0@FaP@172324+45300@pP=p@MSʆB172330+59030@pV?%Y@4 172330+20490@pT@BGz172324+37480@pTi7@Dn]L;*172330+41590@pTd~K@E%Y172330+42030@pGQ@ROO172324+75540@pR\(@Ltqq172336+56560@pIi6@Rwwwww172354+74250@pJ:Ӡm@R89172354+74250@pMb/@QN172400+71180@pJ%X@RG{172354+74250@pM%X@QYj172400+71180@pXN@Cd172424+39220@pZ\(@+q172424+13570@pX\@Cqq172430+39580@pYu\)@A}'}(172436+35180@pU@MiGz172436+58520@pU_,@NvT2172442+60040@p\=p @0gqr172448+16270@p\,_@'/b172448+11350@p\y,_@=y>>172506+29310@pQ\(@R zG172512+72120@p]@5Q172512+21100@p]_,@:Yj|172512+26320@p\UUUUU@Bi6172518+37530@p_n@ 172530+06310@p^ m:@:y4172530+26300@p\]@F3` `172548+44270@pU~K@Q5F172542+68530@p^P6j@@%g172542+32200@p`~K@[[172548+07280@pXR@O ܺ172554+62110@p_%X@:*172542+26530@p_/b@:II172542+26550@p_=p @:q172542+26550@p]"""""@Fu[[172554+44580@paK~@,VT2172606+14130@paX&@&zG172600+11240@pTGz@R9-172606+72560@p]*@M> 172630+58330@pdQ@R4Vx172636+06220@pc1~K@1g172636+17440@pbzG@:O172630+26350@p]Q@Nq172642+60030@p]X@MB"""""172636+58350@p]u\)@Mj|172642+59420@p]b0@MB"""""172636+58350@p]O@M5yG172642+59420@pdN@, +@6~zG172700+22320@pe@0)eC 172700+16120@p_zH@Lo. 172700+56540@peu\)@04N172706+16140@pZ/b@Q&7I172706+71080@p`@LW172712+57350@p_@N qq172718+60090@pe_@8P?172712+24550@paN@L\(172736+57360@pa8Q@Nx =q172748+60590@pgIb0@7R\(172742+23220@pct @@J\/b172742+52460@pbN@L\(172748+57130@paߒ,@N @t172754+60080@pgp @8FX172748+24550@pf,`@E˩eC!172806+43380@pcDDDDE@MlN172806+58540@p_N@Q88172800+68260@pe@J172806+52150@pjN@R172812+06260@pj~@ ܺv172812+06190@pjQ@0I6j172824+16190@ph\(@A172818+35240@pjUUUUV@7ۗS172824+23400@pjӠm:@=QGz172836+29210@pXwwwww@Sm172824+77450@pk(\@3ra172836+19480@pmQ@7yF172906+23370@pg @@N, 172924+60240@poi6@FX172924+06320@po@7HZ172924+06310@po΁@Gz172930+06300@po6@!n]L172930+06340@pkQ@IoۗS172936+50550@pk@t @Ii7172936+51290@pim:ӡ@MR172942+59410@pk@I. 172936+51290@pjK@L- r172948+56230@poN@F173000+07060@pr@t@0fò173030+16260@piy,_@Pԣ =q173024+67220@ps =?m:Ӡn173030+01450@pm(@L^ 173030+56460@piQ@Q'}'173100+71220@poZt @@MʆA173112+59400@pfN@R&8173112+75450@pvd~K@4h5z173130+20480@pt# =p@E>>173130+43470@pp6j@Mn]L;173136+59590@pu@A˩eC173130+34120@puW =p@B]˩eC173136+36460@pu]@B^Q173136+36460@pub/@B_b0173136+36460@ptzG@E5yG173136+43510@puu\)@B_˩e173136+36460@pu =@B_7HZ173136+36460@pv,_@B^7H173136+36460@pu\(@E5y173154+43570@pxkR@7OP173200+23330@pxm:ӡ@9X +@8ɇeC 173336+24490@p{Q@I`?.173342+50470@pt @$ 173400+10030@pN@2>>173406+19000@p%X@6IJ173406+22560@p_@7˅Q173418+23500@p@12n]173430+17140@p/b@D173442+40100@pv@R>zG173436+73000@pb@5W173442+21090@p|K@Oll173448+63260@p~/b@NhN173500+60500@pm:@E N173506+42070@pzG@)vT2173506+13020@p:Ӡm@&>K~173512+11100@pDDDD@3II173518+19350@pW =p@:>Q173512+26160@p33333@1dۗS173518+17340@p]@Ib˩173524+50480@p\(@) ` 173530+12580@p}d~K@QOO173530+68070@p@t@+,_173548+13550@p1~K@+&7I173600+13500@pO@K8173600+55020@p@6 @t173600+22440@pDDDDD@K(\173600+54150@p=p@KX%173600+54150@p# =q@G&7H173606+46200@p @t@#a#Eg173606+09430@pQ@& s173612+11240@pӠm:@'_,173612+11480@p.zG@)|#Eh173618+12460@pi6@@2 173842+18510@p# =p@Aҳ173848+35400@pR@OʆA173854+63590@p=p@D>173900+41200@pi7@I7HZ173900+51060@p8Q@1^&7I173900+17230@p@7 173906+23040@p\@C][[173918+38440@pi@I7HZ173924+51140@p,`@4!N173936+20090@pn@2II173942+18190@p =p@ SʆB173942+03120@p1~K@7'173942+23420@pUUUU@FraQ173942+45100@pp @OR+zG174436+30430@pB\(@=@t 174436+29030@pm:Ӡ@4,_174442+20470@p%X@KraQ174454+55470@p=p@4(\174500+20530@pt A@Ld174506+57180@p,_@Nr-.174512+60550@pm:@# +>174548+58400@p@1174600+17380@pN@16j174600+17070@p(\@MeC 174606+59160@pW =p@Kp8174600+54540@pZt A@1174606+17580@pN@)88174612+12320@p\(@L>174612+57200@p1~K@A i6174624+34060@pQ@A 174636+34050@p=p@1ra174636+17590@p(@N,`174636+61270@pu\)@ 4zG174642+08070@pN@N174642+61190@pi6@*I174648+13200@pSm:@Jh5z174700+52150@p=p@I~K174700+51260@pX@CӲn174700+39400@p@4˩eC174700+20490@p @t@1~K174700+17590@p33333@P\(174706+64020@pQ@Q' =p174718+68380@pi6@2 ` 174712+18350@prX%@K~K174718+54100@p]@0 174718+16420@p@4W$i174724+20460@p6@*"""""174724+13230@p@t@IۗS174730+51120@pn@M?SʆB174736+58310@p,_@BvT2174742+36090@p4N@9N174742+25480@p@M34V174754+58260@pN@,aP174754+14180@p:ӡ@,6j174812+14240@pi6@689174812+22580@pQ@Tȃrb174800+83090@pQ@Al174824+35320@pb0@-~K174824+14500@pQ@15[[174824+17130@pzH@1F174830+17330@p,_@K174836+55310@pN@NAu1174836+61410@p @t@7#|174836+23090@pN@1$ۗS174842+17090@pd~K@Orb174854+62140@pK@/ =p174900+15500@pDDDDD@O#Eg174854+63460@p(@N/,`174906+60230@pN@2.174912+18460@pN@LV ` a174912+56410@p/b@N 4V174924+60060@p X&@N @t174930+61320@pQ@GGz174930+47120@p# =q@M˩e174936+59390@pB\(@7j|174942+23050@p# =p@8{$h174942+24300@pSm:@Li6174942+57190@p@Yj174948+05270@pN@Nǒ,`174948+61340@pB\(@IaP174948+51030@pp >@2_,174954+18410@pt @QGz174954+70100@pd~K@5N175000+21350@pi6@?vAu1175000+31280@pzG@8,_175006+24320@pX@QӠm:175006+68250@p/b@=ܖ/b175012+29520@p'@t @Op%Y175018+62530@pIb/@R 4Vy175024+72140@pQ@HŰ[[175036+49320@p33333@MDDDDD175036+59300@p@RYj|175042+72020@pZt A@=ll175036+29500@p~@=֯7H175042+29510@pâ""""@76/b175048+23140@pu\)@BHY175054+37450@pwwwww@Q r175054+71500@pӠm:@;;*175054+27410@phN@J9,_175100+52280@pÿ%X@=4Vx175100+29380@pN@Pa,_175106+65330@p,`@8\(175112+24350@p´N@F}\(175112+44590@pb/@,%Y175136+14030@p4N@-[175142+14520@pt @@8w175148+24280@p@2`6i175218+18230@p m:@= W175218+29040@pQ@RaP175218+74480@pG@@q~K175236+32530@pb/@2Sn175236+18200@pG{@R p =175248+72090@pt @@Ac` `175300+34470@p33333@< 175300+28310@p;@,_175306+06120@p.zH@:_#Eg175312+26220@p1~K@P ~K175312+64110@pͅQ@9nN175318+25260@pZt A@2175324+18560@pfffff@?8175324+31510@p~K@< =p175330+28500@p\(@:,`175342+26360@p/c@2Vi7175348+18210@p?%Y@2_,`175354+18230@pʠm:@Nh ` 175400+60500@p;@2175406+18490@paG{@@175412+33120@pZt A@:]175418+26220@p_-@OR}'}(175424+62390@pN@(zvT2175442+12150@p=p @Hm:175448+49020@pK@(\'175454+12110@prX%@Db0175500+40150@pӪ@@Qll175500+32380@p =p@?\(175500+31480@p =p@,fW175512+14120@pԶi@; 175512+27580@p(]@PvT2175524+66330@p8Q@ONT2175524+62370@p%X@R[%X175524+73250@p]@7ò175530+23020@pˁN@QvT2175542+71330@p؝i6@ ` 175542+03440@pֻ@;\(175542+27510@p,_@MVF175542+58420@pUUUUU@Gò175542+47450@pn@7ܺvT175542+23530@pi6@K2175554+54240@p1~K@KYj|175554+55490@pВ,_@P/b175548+64190@pu\)@5E[[175554+21170@pzG@#aGz175600+09420@pzG@.FX175600+15160@p"""""@- r175600+14580@pUUUUU@<>o175600+28150@pUUUUV@ONò175606+62370@pծzH@I]0d 175612+50440@pX%@;Ci6175606+27160@pt A@Ft A175618+45080@p\)@%>?175636+10330@pzG@Yj|175642+07090@p >@K9ll175642+54270@pת@K9P?/175642+54270@pݮzG@%ò175700+06170@pt @@A%Y175700+34000@p~K@P< +Sm:180712+30180@p_,@Qtò180712+69490@qzG@Gj180724+46490@qG@O =p180754+63410@q Gz@58--180824+21130@q @?t A180836+30590@q \(@9n]L;*180836+25060@q K~@5=&8180842+21140@q |/c@,/O180848+14050@q UUUU@?u0180900+31050@q X%@H,_180912+49540@qi@QD[[180912+69040@qb/@NF180918+61250@q @K 180924+54130@q=p @(-^o180930+12040@q m:@Cò180924+39100@q @Bܺv180930+35590@q fffg@FbOO180930+44450@q]@N180936+61070@qi6@-i7180936+14570@qzG@9dۗS180930+25380@q33333@5mu0180936+21250@q 6@Hòn180942+49300@q\)@.QR180942+15080@qzG@5?.180948+21330@q \(@HM^o180948+49530@pm:ӡ@U+@5\(181006+21530@q_,@='~K181012+29080@q i6@P}'}(181012+64020@q:Ӡm@9eC 181012+25390@q'@t@2P?/181018+18350@qQ@5k181024+21250@q@9m^o181024+25250@q\@ +181030+06420@q# =q@9o181030+25250@qG{@22˪181030+18380@qwwwww@9b/181030+25310@qu\)@C181042+39370@q,_@9ieC 181042+25240@qi6@4;*181042+20400@qi7@="""""181106+29410@qDDDDD@@=p 181124+33480@q@5qr181130+21050@qd~K@233333181136+18490@q,_@*:Ӡm181142+13150@q=p @6H5y181200+22160@qfffff@$7 =p181154+10050@qzG@Gb0181200+46070@q=p @Nt @181200+61190@q:Ӡm@/FX181200+15290@qDDDD@$-.181200+09590@q =p@Qz,_181212+69550@qX@>/b181212+30400@qN@O>>181224+63530@q1~K@H@t181248+49020@qrX%@R5y181300+74100@q =@MN181300+59490@q@t @= r181306+29450@q~K@QEg181312+68200@q,_@EaP@181306+43150@q/b@NۗS181312+61080@q/c@Q 181312+68200@q .zG@/b181336+06440@q@8陙181336+24540@q/@+R181336+13450@q %X@<Q181400+28420@q"Ib0@9 ll181600+30370@q'@?O181600+31580@q)Q@5K[181612+21160@q*:Ӡm@*zH181612+13150@q(b/@C4181624+39480@q(@C,_181630+39460@q) =@B(ܺv181642+36170@q+X%@0?ۗS181642+16140@q+""""@7~K181648+23380@q*i7@I#Sʆ181724+50150@q.(@7&7181730+23410@q,@Eg. 181742+42460@q-t @D|&181748+40570@q. >@HG}'}181818+48320@q2R@>+G{182100+30380@qAGz182118+30140@q: =@G@t 182124+47350@q;aG{@It A182136+51190@q?Q@5 L;*182142+21010@q8.zH@PraQ182200+66360@q7\(@Q;*182206+68050@qA,_@4 +<182218+20530@q?(@HJӠm:182236+48330@qC?%X@7#Eg182242+23020@q=\(@N`%Y182242+60430@q@t @@I6T2182254+50230@qD4N@;182300+27300@qE X%@44182306+20530@qD~K@?i4182300+31230@qC/b@DW$182312+41280@qF\(@6S =p182330+22180@qF@@182342+31580@qF @@@ܺvT182348+32080@qH\@7Pt A182400+23170@qJ1~K@6kSʆ182424+22230@qIGz@@KW$i182418+32330@qL/c@3[[182506+19550@qAP6j@QW182506+71350@qJ%X@EU182506+42390@q@N@RK.182512+73090@qM# =q@8\(182512+24500@qNy,_@-Eg182518+14440@qKSm:@Iq182536+51070@qEߒ,@QdۗS182536+67580@qL6@GvW182554+46530@qK@L @HAu1183218+48110@qiffff@2b/183218+18560@qht @@?.183218+32010@qhUUUUV@CL&183224+38330@qi# =q@@\)183224+32090@qjrX%@68183230+22520@qj@>vT2183236+30410@qgO@Hn183236+49140@qj@@DDDDDD183248+32290@qf@Mj|183254+59510@qln@;UUUUU183306+27440@ql @@6˩e183306+22280@qd_@P^o183312+66550@qlrX%@>6i183306+30350@ql:Ӡm@@Y183312+32390@qlE,_@@ۗS183312+32570@qkӠm:@Gqq183324+47000@qh@MzG183330+59490@qfQ@P?.183336+67060@qmi7@C:\(183336+38240@qfd~K@PʆA183342+67040@qo,_@6xvT2183342+22250@qlQ@Fa4183348+44440@qpL@> +<183406+30470@qmd~K@J]0d 183412+52410@qo@C>>183412+38050@qrb/@$t A183418+10230@qr|/c@34V183430+19530@qrX@3vT2183430+19410@qs/c@>u0183500+30340@qqaG{@In183512+51260@qu΁@2؈183512+18480@qkUUUUU@QX&183524+70290@qq,_@J 183518+53470@qv;@4 ` a183524+19580@qu%Y@:jW183524+26220@qtGz@E9j|183530+42250@qw""""@15y183542+17290@qv'@t@@X%183542+33140@quǮz@C&7I183548+39200@qv# =q@BmyF183548+36480@quDDDD@DeC 183548+40020@qwb@;~K183554+27450@qvp @BO183600+37180@qkGz@R˩e183606+74000@qw\(@B_,183606+37240@qyt @12j|183612+17090@qxL@B:Ӡm183624+37100@qzB\(@9`4Vx183630+25200@quy,_@MFX183636+59350@q{ffff@7KN183654+23150@qzp @BK>?183700+36320@qzӠm:@B 183700+37000@q{X%@B6j183706+37540@q~:ӡ@6Pd183736+22160@q}K@CxHYk183742+38520@qkR@@g7HZ183800+32450@q|@K"""""183818+55350@qQ@8333333183812+24090@qDDDD@D` `183812+40000@q6@C@t183818+39570@qwwwwx@D183830+40060@q"""""@<` `183830+28340@q1~K@7W$183842+23380@qO@B183848+36040@q =p@7ll183854+23020@qzG@B%&8183854+36140@q:Ӡ@BOP183900+36060@qZt A@ Gqr183912+08050@q X%@B1P?/183912+36190@qwwwww@F~K183930+45130@q@A/b183930+35000@qt @@@'}'183948+33440@q,_@Akra183954+34470@qX%@4$ۗS183954+20050@q|@Rg#Eg184000+73340@qi6@8\(184012+24500@q}""""@Re&8184024+73320@qt @@04Vx184030+32190@qu\)@A<2˪184048+34250@q<\)@Uܺv184100+86520@qb0@A$h5184054+35340@qDDDD@2=p 184054+18400@qt A@D. +<184106+40200@qb/@CAu1184112+39300@qd~K@E~K184136+43540@q6j@Q~K184136+70300@qUUUV@J4Vy184148+52590@qӠm:@8$h5z184206+24050@q\(@O=[[184224+62250@qt @@EO}'}184218+42350@qUUUV@NSm:184236+60370@qN@9Eg184312+25270@q/c@E\ۗS184324+42400@qN@DWII184354+40390@qL@@# 184412+32130@qy,_@DJAu184442+40320@q;@Hl @t184448+48470@q# =q@MX&184454+59560@qǮz@9͂-184506+25440@q =p@FX%184536+45400@qX%@7X8184536+23170@q@6Gz184548+22530@qB\(@FƁN184554+45300@q/c@I1F184612+50200@q""""#@A;ʆA184712+34240@qE,_@QW$i184706+70180@q\(@G(\184736+47360@qQ@Q|184800+70410@q,_@D֦ 184812+41370@qIb0@:֊W184836+26460@qX%@@[184854+33530@qK@:{4V184924+26250@qQ@7}'}(184930+23340@qL@RWN184948+73180@q@:|#Eh184954+26250@q@M vT2185042+58020@q8Q@@Ӡm:185042+33460@qQ@K185100+55400@q;@RV}'}(185124+73170@q@t @@#185124+33000@q@>5y185136+30360@qL@A$h185200+34560@q=p@Lfffff185218+57150@q,_@K[[185230+55180@q~K@B@t185236+37200@qQ@@n]L;185242+33450@q,_@HvӠm:185254+48510@q@Cn]L;*185300+39330@q@D ܺ185312+41540@q]@CéeC!185324+39280@qm:Ӡ@PܺvT185330+66100@q~K@Qo185342+68240@q@Cll185418+39530@qO@J8185430+52050@qR@9190042+27140@qGz@@ۗS190200+33450@q:Ӡ@FΓ>190200+45330@q @t@Ic89190212+50420@q;@Oꪪ190236+63460@q܈@O;*190242+63470@qӠm:@A;raQ190306+34220@qwwwww@H"""""190318+49340@q廻@E;[190354+42230@qi6@K =p190406+55390@q:Ӡm@RB,_190412+72580@qܿ%Y@RraP190418+73430@q?%Y@=190500+28560@qy,_@O190512+63520@q8Q@Gll190536+46060@q6j@I,zG190542+50150@q@t @D =p190542+40550@qi6@C%X190542+39510@q @t@D =p190624+41210@qDDDDD@E?.190648+43000@q\)@DGz190654+41340@q@Iwwwwww190700+50500@qN@EX%190712+43160@qd~K@JDdۗ190712+52280@q:Ӡ@J~K190718+52100@q=p @J&7190724+53170@qi6@E?.190748+42590@q?%X@DɾF190812+41300@q:ӡ@Jrt @190818+52500@qu\)@Dܺv190824+39560@qR@Q&7I190900+70120@qi6@J~K190936+52050@rB\(@G Q191048+46100@r/@F#Eg191142+45140@qzG@RZ88191200+73190@qL@R[N191154+73180@r~K@Ft A191212+45440@r'@t@Etqq191336+42490@r G@I¡n]191400+51270@r:Ӡn@F s191400+44010@r%X@S{191442+77500@rt A@Fd;*191512+44420@r,_@G4Vx191512+45550@rN@N5p =191530+60190@r~@O_,191618+63540@r.zH@Gi,_191618+46440@r~K@IT'191624+50340@r\)@B2\(191624+36180@rrX%@Ak*191630+34450@r@R1X&191648+72400@rQ@Q&191712+70260@r_@Frb191736+44040@r,_@J*}'}(191812+52150@rN@Fr|191824+44480@r!~K@>Eg191830+30440@qGz@T,_191900+83490@r#Ӡm:@E\)191924+43020@r"Ӡm:@KʆA191924+54070@r$\(@E4191936+43140@r$\@E191936+43520@r&"""""@EeC 192000+43550@r(t A@F n]L;192042+44100@r&\(@NvT2192048+61030@r)Ӡm:@M 192130+58100@r/\(@CȚ#192206+39280@r06i@E+` `192224+42140@r1.zG@EցN192242+43350@r/b/@KT2192248+55530@r06i@Jó192248+53320@r-UUUUU@QʆA192336+70160@r1 >@M٢192342+59360@r:""""#@I +d~K@K/.192630+54160@r< =p@PS` `192654+65120@r3zH@SQ6j192648+77100@r@@JrAu192654+52470@rF6i@D =p192754+41130@rJzG@Ei7192900+43190@rK,_@DܺvT192906+41130@rKG{@G[*192930+46360@rNi6@A6i192942+35460@rLX%@K &8192954+54000@rGUUUU@R. 193030+72000@rQ_@D 193048+41480@rRQ@B~K193100+37460@rX\(@HAu193242+49080@rXt @H/c193248+49500@rU6@O @HYk200112+06510@rSm:@Hd200124+49110@rL@)zvT2200212+12350@r/c@˩200318+06360@r =p׿200412-01520@rӿ%Y@Of&7I200412+62380@r4N@ 200448+02590@rn@?.200454+06190@rߋX%Б200518-00230@rb/@.W200606+14520@rN@!O200636+08310@r\(@IVӠm:200654+50320@r/b@~K200818+01590@rK~@ 4Vy200924+05370@r@4Vx200930+05220@rB\(@88200936+05370@r:Ӡm?SʆA200948+01480@rd~K@ m:Ӡ201106+07070@r""""Au1201118-01180@r@ 89201142+03040@r >@NهeC 201148+61320@s~K@x201412+07140@sm:Ӡ@yF201454+05050@s.zH?b4Vx201500-00080@rb/@SF201500+79150@s @tEg201606-00180@s ffff@1M^o201642+17420@s@.#Eg201742+15140@s @OXvT2201742+62310@s(Q201800-00530@swwwwX%201800-00500@sp >@Q201954+06160@s@$Ldۗ202012+09590@s@#+` `202012+09250@s =p?C ܺ202042+00300@sDDDDD@Au1202106+06170@s L@/i6202142+15350@s!t @@i7202154+07000@s"n@~K202212+06450@s"_-@(Eg202212+12170@s4N@M, @t202224+58120@s$@ ^o202248+05060@s X&@Nd202300+60020@s&i6@%%Q202306+10250@s( =q?|'202336+01000@s)i@Gqr202354+02450@s*@ m:Ӡ202406+02290@s*b0@88202412+02320@s*ؿ%@%c89202418+10320@s+Q88202424-02250@s-~K@ 24Vx202500+07560@s.""""@%n202512+10350@s/\(@+202530+13210@s01~K@202536+04480@s0@t?Au0202542+00180@s0?t @t202542+00070@s0 =p@,202548+14070@s1@t @%202554+10350@s2b@aGz202618+04120@s1R@9,_202624+25330@s4/b@%[*202642+10310@s4m:@%|#Eh202648+10350@s5 =qK~K202654-00200@s66j@ u0202712+03330@s7Ӡm:ó202718-02210@s8O@i>>202736+02540@s9n ܺv202748-01100@s::Ӡm:202800-01100@s: X&?ܺvT2202800+01420@s:\(?202806+01130@s: =p+Q@s|202900+06570@s>\(@X&202906+06590@sAܺvT202942-02240@sAGz@&(\202954+11120@sCX%@#ڼ#E203030+09450@sDfffff9u0d203030-02110@sCR@#.203036+09410@sErX%L203048-02120@sE=p ?,_,203042+01350@sEi@0i6203106+15530@sEǮz@3vT2203106+18550@sJ@"EQ203206+08580@sJG@5yF203212+07480@sN%Yvll203306-00090@sPi6?ll203336+01330@sKQ@NSʆ203348+59590@sQ m:@31Gz203400+19010@sQfffg@*ޓ>203406+13150@sRB\(@&L;*203412+11200@sLwwwww@P3` `203418+64380@sTfffff*203430-02070@sTIb0@)M˩eC203442+12280@sW\@%C89203530+10270@sXt @$h203542+06440@sXm:@%s33333203548+10330@sY~K@M^o203554+06500@sZX%?203606+01330@sZ=p@(Y203618+12000@sZK@#s33333203618+09330@sTX%@Pll203636+65550@s]y,_@b0203648+01550@s]\(@'@t 203654+01510@s]@!33333203654+08440@s]b/@%/b203654+10370@s_ =p?Q203712+00540@s^/c@@HYk203712+01520@s`>>203736-01470@s`\(@ ~K203736+07050@sbi7@,dۗ203806+14050@sb:Ӡ@%R203818+10370@sgW =p@`m:Ӡ203918+05250@shN@'!n]L203948+11230@sm@0#Eh204106+16480@soQ =p 204124-02040@sozG@) 204136+12200@sp6i@ 5y204136+03020@sq33333@\(204148+02250@spX@( ` a204148+12140@sr~K䱿Au1204206-01540@sq,_@(ܺvT204206+12190@ss,_@X&204218+02240@su@t @K~K204254+05530@swN?ll204318+00000@svQ@6K~204324+22330@sv~K@<-p =204336+28000@sy\(ÿqq204348-00240@sx~K@2204354+18450@sz,_ƿ +<204412-01320@s{ @t@&}'}(204424+11060@s|zG?ۅQ204430+00150@s|3333?@t A204436+00110@s}E,_?ԃra204448+00080@s}\(? +@#N204806+09380@s~K䲿Yj|204818-00320@sӠn@2HY204912+18460@sO@* s204936+13180@s~K?Eg204954-00060@s*@Eg205036+06570@sX?ܺvT2205054+00270@s:Ӡm@b205124+07380@sIb0?Gz205136+00350@s =p@%205148+10220@s(\?yF205200-00080@sOO205212-00140@sIb0?L;*205248+00210@s|/c@ +205254+02090@sؿ%#F205254-01250@sn_,`205306-00490@s4N@l205306+07170@s(@/-.205312+15190@s @@/7H205312+15190@sӠm:@/ 5y205312+15200@sB\(@% =p205324+10200@si6@PJ+@' +<210124+11340@s@4V210200+07460@sB\(@#R,_210206+09260@s >@0Q210206+15530@swwwww?ܬ5y210218+00150@sƛN@牫210312+07300@s~K@& @t210318+11130@sƯb@"wHY210312+09010@sDZ~K@yF210324+07270@sW =p@2w}'}210324+18160@s~K@Pu0d210424+66350@s,_@2 s210506+17510@sDDDD@G{210512+03400@skR@(}'}210512+12070@sP6i@.Vi7210518+14580@s'@t@0U +210530+16080@si6@23Eg210606+18000@sсO@1˩210606+17360@sǮz@20t A210612+17590@s@(~K210618+12160@s\(qr210642-02000@sԍ@t@0210654+15530@sՊ=p׿g210654-02030@skR@.?n]L;*210712+14550@s֋X&@.L210718+14570@sB\(@28210806+18350@s:Ӡm. 210818-02110@s܁OOO210836-02150@sN@ --210842+03180@su\)@PܺvT210848+65570@sAll210900-02140@sX%@7wwwww210900+04510@s@B5yG210912+37420@s~K@&˩eC210924+11030@sb210936-01400@s/b@&u0210936+11170@s1~KۗS210948-01320@st @@*HYk210942+12470@szH@'Q210942+11260@s@*5y210948+12480@s᥋X@&211000+11110@s΁@+T2211012+13460@s.zG@!n]L;211018+08340@s޿wwwwww211042-00340@st A@b0211048+06320@s@t 0d211048-00220@sN@!G{211048+08390@s奋X@(dۗS211054+02340@s,_zG211100-01350@s@+&Au1211124+13210@sӠn@&211124+02210@s?Q211130+00200@s襋X@aP211142+02470@s =p@ldۗ211142+01580@sGz@+@211142+13240@sUUUUU@5~K211206+21210@s @@%u0211224+10380@si6@3ll211218+18470@sp @-211224+02370@s@+~o212354+30160@t(\@(^o212412+11590@t@p =212436+02300@tm:@.Ӡm:212442+15030@t@S0d 212500+79410@tb@ \(212506+03020@t=p׿ò212518-01340@t d~KYj|212530-01520@t d~K@!@m:Ӡ212536+08230@t Q@ʆAu212536+02150@t#i6Q212618-01170@t#fffff?""""""212618+01020@t#8Q@4212624+20170@t#\)@&ra212636+11100@t$fffgܺvT2212636-00300@t&LͿ&7I212700-01340@t&@vT2212712+06270@t'zG4Vx212718-00500@t',_@OO212724+02120@t("""""@:HY212748+26300@t+K䱿B4Vx212824-00120@t+t A@+%Y212830+13460@t-i6@:Ӡm212848+02160@t.\@N212912+02150@t.?ò212912+00080@t.i6@'6j212912+11370@t/:Ӡm@ Vx212918+03220@t.@ACm:212936+34180@t0,_{raQ212942-02230@t1X212954-02050@t1b@SʆA212954+06220@t1(@$G@t 213000+09560@t2Sm:@˩e213006+02290@t2N@88213006+02190@t2b/dۗS213012-00200@t66i@!` `213106+08330@t7Ӡm@5T2213142+21360@t8Q@!O213142+08330@t9@:ZaP@213212+26080@t;΁@46j213242+20220@t>.zG@A|213330+35110@t@p =@N213336+07430@t@y,_@#R4Vx213342+09260@t?:Ӡm@A213348+35080@tDK~⪪213430-00480@tBm:@Ad213436+35280@tD\(?܍&7213436+00140@tEy,_?^o213448+00110@tF\(@-,l213506+14220@tHX@!rb213542+08450@tJ~@=Au1213630+29370@tLߒ,FW213642-00430@tMǮz@ s213654+02360@tNP6j@!ܺv213706+08390@tN,_@$OP213712+06040@tN~K@$dۗ213718+10060@tP%X?P?.213730+00590@tP1~K?wwwwwx213730+00590@tPߒ,@-DۗS213748+14240@tTN?\(\213830+01060@tU/c? =p213900+00400@tV\(@kX&215248+30210@taG{@pd215300+06220@tN@;*215318+05340@tb@8\(215318+24390@t X%FW215330-01450@tX%@(\215330+05400@t @t@/c215330+05400@tX?.215342-01530@t\(@-nʆA215342+14300@t@aGz215348+01560@t @@; ` a215342+27400@t:Ӡmqr215348-01250@t|/c@wwwwww215354+07070@ti@+ $h5215400+13200@t =p@n]215412+02220@ti6@R33333215424+74150@t~K@m:Ӡ215430+06250@t@>|215454+30300@tN@0ò215512+16240@tX%@D~K215524+41000@ti7@RP~K215542+73010@t4N@ 8215554+08110@twwwwx@ ܺ215612+07120@tfffff@(>?215612+11480@tm:@ ?.215612+08130@t~K +215618-02140@ti6@~K215624+03310@tL@2-u0215642+17560@t""""@$ +>220636+18440@t*@1֯7H220636+17350@tĶi@+ ܺ220648+13160@ti6@,8220648+14070@tt W$h220648-01530@ti6@5~K220654+21160@tƙ@1b/220712+17250@tӠm:@D~7H220718+40450@t'@t @2 =q220724+18150@tƀ@C(\220724+39020@tt A@C5yG220730+37570@tțN@D"""""220800+40460@t/c@BS$h220800+36240@trX%@--220824+01510@t/b@DrX%220824+40390@tʍ@t@E220830+41470@t? +o221612+29000@tkR@8+>222030+35570@t~K@>dۗ222048+30400@t,_@>rb222048+30400@t=p @"j|222048+05170@t*@A222048+35350@t6i@B +<222048+35480@t6j@D%X222106+39480@tǮz@2u0222100+18290@t]@'8222112+11360@t6j@D@t 222118+40550@ty,_@>raQ222118+30360@twwww@!88222130+08380@t/b@@3Sʆ222124+32080@u,_@DDDDD222142+05440@u.zG@@}'}222142+33110@u\(@1%X&222154+16540@uQ@Bn]L222154+35570@u%Y@BN222200+35530@u\(@2FX222200+17500@u\)@B JG{222606+30030@u@0W$222618+16400@uIb0@@~K222612+33450@up >?^o222618+01380@uwwww@CG{222636+38500@u8Q@34222636+18510@uR@CCSʆ222700+38160@u*@牫222706+07270@u m:@B?.222700+37300@u@B\ @t222742+36280@uffff@Ee0d 222806+42320@uB\(@@222818+33340@u8Q@BӠm:222818+37380@uX%@6G{222818+22170@uDDDDD@C. 222824+39220@ud~K@BH4Vx222836+36180@u_,@C222906+39060@u/b@>ò222912+30420@u~K@4ò222918+20270@u@t @A[*222918+34280@u@4vT2222924+20220@ukR@3222924+19250@u @'ldۗ222948+11270@u" @t@ j223000+07570@u!""""@> +223006+30350@u":Ӡm@C89223018+38580@u#@t @C/c223036+38580@u$kR@ 1R223036+07500@u$N@C>?223054+38540@u']@4&7I223124+20330@u(DDDDD@$XQ223136+09540@u(t @@Gó223136+05190@u(i6@4Fi7223136+20010@u( @t@7V7H223136+23050@u*Q@D 223206+05330@u),_@9HY223206+24460@u)@t @Dܺv223206+41030@u)/b@E牫223212+43320@u+K@2|223224+18230@u,b0@ ]i6223242+07550@u+/c@BeC 223248+36570@u-:ӡ@34Vy223300+19250@u.i7@AfӠm:223312+34340@u/t @4R\(223330+20040@u/u\)@@d223336+33410@u/b0@@m:223342+33430@u/~K@@m:223342+33430@u0:Ӡm@@b/223348+33410@u0?%X@@OP223348+33430@u1ߒ,@5%X223400+21220@u21~K@9W$i223412+25300@u2΁@3 ` a223412+19240@u3N@3aP?223418+19070@u3m:ӡ@3x5y223424+19120@u3_@,ʆA223430+14090@u3,_@3$ 223436+18530@u4\(@3%g223424+18530@u3p @CF/b223442+38170@u4L@A5^o223448+34100@u5 @@%4Vx223506+10160@u5 =q@7_,223500+23320@u5K~@A9P?/223500+34120@u5@AN223512+35170@u6i7@4 @t223512+19450@u6~K@AlVx223518+34360@u7(\@7P?/223524+23310@u6X%@A4qq223524+34100@u7\(@9V7H223530+25050@u9:Ӡn@2fffff223548+18200@u8G{@AۗS223554+35150@u9_@All223606+35070@u9t @AHY223606+35070@u9\)@A"""""223612+35050@u:@AʆA223612+33590@u:i6@AdۗS223612+35050@u:Sm:@An223612+35050@u:@A #Eg223618+33480@u:K@A0d 223624+35170@u:\)@Bh5z223624+37200@u;b/@A&ʆA223630+34030@u;6@A$h5223642+35110@u@2Q223642+18230@u=wwwwx@+òn223654+13360@u>@'=p 223706+11310@u?%Y@&88223730+10460@u? =p@A0 =q223724+34070@u?L@C89223736+37570@uA# =p@ raQ223742+07470@uA'@t @!!N223742+08180@uBi6@ o223754+03050@uAN@0-.223800+15450@uAN@?eC 223806+31350@uBkR@'4Vx223806+11390@uB?%Y@@n223812+33120@uD:Ӡ@2ʪ223842+18320@uDO@@u0223848+31550@uEQ@7h--223848+23080@uEt @@#|'223854+09290@uD6j@A˩e223854+34000@uE =p@@}'}223900+33220@uE =q@7`223900+23070@uEӠm:@AO223900+34220@uFzG@ s223900+02220@uEt @CL;*223912+39020@uEwwwx@A223912+35010@uGQ@B g223930+35510@uGӠm@4BaP223930+20000@uGffff@4E\(223930+20000@uG/b@Auu0223936+34400@uH@3W$i223936+19230@uH'@t@>g223942+30270@uH3333@37HZ223942+19440@uCm:@RʊW223942+74530@uH_@AQ223954+35400@uH6j@@R223954+32570@uI@>+$h224000+29550@uJm:@=224018+29280@uMt @!^Q224054+08250@uM:Ӡm@@~K224100+33450@uNDDDDE@[224100+03530@uOIb0@!i>>224118+08270@uO@˩e224130+07070@uOu\)@C06i224136+38060@uPQ@$#ra224142+09480@uP\@#vT2224142+09430@uP(@"UUUUU224142+09100@uQQ녿224154-00230@uQӠm:@h\)224148+04060@uQ%X@3캘vT2224154+19390@uP6j@A,OP224154+34050@uRN@ *224206+03250@uSQ@@|224224+33120@uTzG@F224236+06100@uTDDDDD@@eC 224248+33440@uU =@5ʆA224300+21330@uW@&B/c224318+10520@uX@% r224336+10350@uYK@ zG224354+02570@uXm:@Cll224354+37480@uZ# =q@5UUUUU224412+20490@uZ,`@&eC ܻ224412+10550@uVQ@RJfffff224400+72530@u\Ib0aP@224430-00180@u\@5yF224430+21380@u]_@?_O224500+31070@u]~K@Dnò224506+40360@u^1~K@D>224512+39580@u^@C𑢳224518+39370@uaL@8Gz224554+24330@uat A@/0d 224600+15390@ubi@;_,224618+27210@ub =@;UUUUU224624+27190@uc@t @2$h5224624+18180@ucߒ-@m:Ӡ224630+06570@ucN@?}'}224642+31200@udDDDDD@D$h5224648+39440@ud =p@A~ +<224654+34440@ueZt A@3II224654+19010@ue >@&*224700+11030@ufaGz@'#Eh224706+11170@uf8Q@@/#Eg224712+32060@uf1~K@@zG224712+33060@ufwwwx@..ʆA224712+14490@ug =p@'7$h224724+11200@ug/c@(u0224736+11470@uhkRʆAu224736-01170@uh# =q@'e[[224736+11250@ui,_@'!N224748+11190@ui.zG@'E,_224748+11220@uiN@'b0224754+11160@uh\(@?`d224748+31070@ujhNQ224806-01470@ukt @@)o224818+12170@uk@(vT2224830+11480@uk/c@&wwwwww224830+10580@uk%Y@Am@t224836+34350@ul@?`224836+31060@ul33333@B>225336+03400@ut @@+?225618+24220@uUUUUU@4L_,225618+20020@u@4dۗS225630+20070@uN@DwII225642+40400@ut A@+6i7225642+13190@u,_@/%Y225654+15170@ud~K@,-4Vy225706+13480@ub/@1#225706+17420@uQ@JʆA225706+53260@u@:4h5z225712+25560@uN@C225718+38520@un@:225724+25450@u,_@1IJ225730+17370@u?%Y@/ ` a225736+15420@um:@?h%Y225748+31080@u =q@?`225748+31060@u/b@3 HYk225748+18510@uzG?[[225748+01220@u @@C/b225754+38580@u'@t@*225800+12450@uzG@) =q225806+12310@u@6T2225806+07010@uQ@ \(225806+08120@u~K@>225818+30280@uzG@+<#Eh225818+13210@uE,_@: s225824+26280@u@>% r225836+29530@u\(@ s225836+05230@un@0c|225836+16070@uwwwww@3$h225836+19200@u/b@#2n]225842+09200@u?%Y@,4Vy225848+14040@uP6j@=:Ӡm225900+29580@u@$h225912+02000@u:Ӡm@/*=p 225918+15190@uu\)@/ll225918+15430@u,`@/n]225918+15420@u\(@/4Vy225930+15420@u;@; p =225936+26470@uaG{@9,_225936+25290@u6i@@L @t230012+32200@ub@*230012+13030@u~K@C[raQ230012+38260@u6i@5b0230018+21370@u@t@:հ[[230024+26340@u =@0230030+16200@u =@A]Q230036+34280@u =p@!II230042+08350@u.zH@!ɇeC 230048+08360@u:Ӡm@3~K230048+19420@u@t@Di6230106+41090@ui6@"N230100+09010@u\(?vT2230106+01350@ukR@$Au1230100+10070@u:Ӡ@A}˩eC230124+34430@ud~K?Q230136+01380@u@;M^o230130+27020@u΁@>(\)230130+29540@u33333@40n]L;230130+19550@uK~@4#Eg230136+19460@ub@4Vx230142+19470@u,_@4&7230142+19470@u%X@6t @230148+22160@u@t @1ra230148+17410@u@0@t230218+16240@ub0@(,_230224+12030@u,_@3L;*230224+19160@u@B230236+35450@uN@d~K230242+02160@u6j@288230236+18350@u@t ?6i6230242-00050@uO@DFX230248+41410@uN@,WSʆB230248+13530@uQ@04Vy230248+16350@u@5)P?/230254+20530@u,`@y,_230306+02470@uy,_@0uUUUUU230300+16120@u~K@;aP@230312+27230@u6i@ [Sʆ230318+03160@uN@6j230324+02420@u\(@0ò230318+16370@uDDDDD@?T2230324+30500@u\(@,. 230324+14050@uSm:@A ˩eC230342+33500@uӠm:@?X%230348+31370@up @ Φ 230354+08070@uQ? ` `230354-00070@u/b@37HZ230412+18500@u_,@<-˩eC230430+27550@u:Ӡ@6.230424+22400@um:ӡ@#4V230436+09400@u@AraQ230436+35300@u =p@!ܺv230436+08280@uX%@B.fffff230500+36050@uzG@@0230500+32060@uӠm:@EL;*230506+43200@u@;230506+27240@u,_@6,`230500+22440@uB\(?230518+00400@u?%Y@>Pܺv230524+30030@uӠm:@*5yG230548+12470@uUUUU@ 230554+04230@u/b@Gt;*230606+46380@u6j@(#230630+11480@u:Ӡm@2-:Ӡm230642+17540@urX%@1BX%230642+16580@uZt @?4Vx230648+00290@u\(@@V]L;*230706+32240@u@6i230724+07150@uK@(5y230724+06310@uP6j@>9b/230742+29580@u@EH230742+42180@uӠn@=aP@230748+29390@uN@:#Eg230748+26210@u~K@R,_230748+07180@u@[N230800+07180@uK@&Au1230800+10450@u;@ HN230800+07520@ud~K@5 230806+21260@u@Eg230812+07170@uZt A@"I6j230818+08520@uÅQ230836-00250@u\(@=IJ230842+29220@uL@4V230848+04420@uH?.230912-02260@un@#Eg230918+09140@uӠm@ 230936+03220@uZt AAu1230948-01480@un@-7~K230954+14210@uffffg@? $h5230954+30520@ut @+s>?230954+13270@uӠm@ApYj231000+34370@uG{@%u&7231012+10280@uffff@/ʆA231018+15380@u’,`@@ِn]L231012+33260@uGz@"Z#E231018+08530@u?%Y@)[$h231018+12250@ui6@9F231018+05310@uZt A@Se231024+77190@uu\(@4?,`231024+19580@uR4Vy231042-02230@ut @%` `231042+10310@ut A@Ib/231036+06030@uߒ,@Q231036+06080@uĨ\@8>O231042+23580@u @t@B;~K231054+36120@uŗ~K@<&231100+28410@uZt A 231106-02000@uP6j@+231112+13450@ub0@8 +<231112+24380@u%X@+_ۗS231118+13250@ufffg@=FX231118+28440@u~K@ HY231130+03260@uGz@9qll231124+25100@u6i@!'231130+08420@u\(@*[[231136+12540@uGz@*+Uò231436+30040@u@2i6231442+18250@ufffg@2C ܻ231448+18260@ud~K@~K231448+05240@ut @@2˪231448+05230@uնiпaP?231454-01520@un@,m:Ӡ231506+13440@u@t @=OP231506+28450@u֗~K@"231506+09090@u֝i6@ ll231506+07590@uu\)@ + =p 231754-01160@uQ@;P ` 231754+27030@uO@ ʆAu231754+08060@uO@196j231800+16570@u@=N 231806+29020@u|/c@05yF231806+15560@u =p@ oW$231812+07560@uL?Ӡm:231818+01270@u:Ӡm@2zH231818+18380@u㪪@9 ` a231824+25370@u/@3QYj|231830+19030@un@#m-231836+09250@uӠm:@=dۗ231842+29170@uߒ,@w. 231836+07050@u\@@~K231842+33080@u/b@&` `231848+11080@uK~?raP231848+01070@u8Q@9bn]231848+25060@uǮz@ o\(231848+07560@u=p @;88231906+26510@ui7?""""""231906+01100@up @!G{231906+08420@ub/@! 231906+08360@uzG@@F231912+33130@uO@"'}'}231912+08470@ut @;/b231912+26490@u@;R231912+26480@uIb0@n]L231912+03330@ut @ۿN231918-00570@up >@Au1231918+04430@u@$~K231924+04450@ui6?W$h231930+01250@ufffff@;X&231936+27150@un@Dl;*231942+40350@uK~@2#Eh231948+18270@uGz@I_,232000+49540@u\(@'\)232000+11370@u6@=.K~232000+28550@u4N@&5y232000+11040@uN@3th5z232006+19110@u X&@F4Vy232006+45200@uꪪ@& 232000+11040@uK@76 ` a232018+22560@u\(@=#Eg232018+28520@u,_@6ۗS232018+22390@u\(@'OO232018+11430@u\(?&7232018+01100@ui6?-.232024+01070@u@1u0232042+17150@ub@@CQ232042+32150@ub0@E#E232048+43410@uZt A@4 =p232048+20190@u클O@*i6232048+13030@un@4#Eg232048+20170@urX%@=nF232054+29090@u6@5)6j232054+20530@u,_@3u0d232100+19190@uK@=. 232106+28550@uzG@91n]L232106+24550@up @3P?232106+19170@uN@#U&7232118+09230@uӠm:@0 +<232130+16310@u=p׿eC 232148-00230@u񻻻@+q232154+13420@u񻻻@9bn]232154+25070@uK~@"Yj232200+08590@u"""#@ ٙ232206+08080@ud~K@F:Ӡm232212+43570@ut A@D&232218+41040@uK~@.5y232218+15000@u~@"33333232224+09120@ui7@ ó232230+07580@uzH@(/b232236+12020@u\(@.fAu1232242+14550@u =q@aGz232248+03310@ut @@<~ʆA232254+28130@uzG@ M^o232500+29470@u%Y@7Ӡm:232512+23190@u@2n]232512+18180@uǮz@! 232524+08300@v,_@@232530+31540@vd~K@!b/232530+08290@vSm:@2 +@3'}'232554+19350@vi6@1Gqr232600+17000@vX%@-|qq232600+14270@vX%@@50d 232606+32080@vi7@ ~K232612+03140@vO@6;X%232612+21570@vfffff@#` ` 232624+09240@vE,_@=(\232618+29270@v\@1O%X232624+17030@v@t @ Au0232630+03150@v@t @&ra232630+11100@vwwwwx@=fffff232636+29300@v@:ò232636+26180@vӠm:@#}232648+09290@v@,h232648+13550@v""""@!]L;*232724+08400@v,_@@ G{232724+31490@v@@S*232724+32230@vzG@;/b232730+26490@v;@:,_232730+25430@v\@9?.232736+25150@v6@/X&232742+15290@v,_@6"""""232742+22330@v i6@@q5yG232748+32370@v """""?II232754-00120@v ~@>8%Y232754+29570@v ;@6i7232754+03370@v ߒ-@p =232806+03410@v """"@ _,`232818+03160@v m:@4@HYk232824+19580@v :Ӡm--232830-02300@v ]@5iP?/232836+21080@v @@=@t232900+32120@vN@9u0232906+25400@v =p@;QN232912+27030@vL@34Vy232924+19240@v@HYk232924-02260@v'@t @7 232930+23170@v1~K@7F232930+23380@v,_@@6 ` a232930+32080@v\)@E,_232942+02080@v@F|ۗS232954+44420@vQ@/q233000+15340@v'@t t @233006-02010@v@-u0233000+14340@v =@7K~233000+23390@vN@f +<233006+06350@vfffg@=u +233012+29110@v?/b0233024+00560@vp >@##Eg233036+09290@vm:@6 ` a233042+04170@v33344V233042-01330@v\(@05Q233042+15550@v΁@9@t 233042+25220@vt A@:W$233042+26360@v@t@5!5yG233100+20510@vRu0d233100-02150@v@,Q233100+14050@vp @9x233054+25220@vP6i@L;*233106+04120@vzG@!t A233106+08330@vzG@> I233112+29460@v%Y@@1#Eg233112+32060@vQ@9P?/233112+25300@vW =p@{233118+04370@vT2˪233124-01360@vK~@>n]L;*233118+29480@vN@8P?233130+24400@vG{@FW =p233130+44250@vb@3Q233148+19430@vG@)t @233148+12170@vzG@\)233154+04430@vX%@AOó233154+34210@vzG@:,_233212+26260@v m:@0i6233218+15480@v4N@0OO233218+16350@v?%Y@:O,`233218+26020@v@2:+?233412+17150@v#~K@vT2233424+06350@v#~K@:\(233418+26130@v$/b@ܺvT233430+04400@v$:Ӡ233448-01570@v%8Q233448-01570@v$t A@F2˪233448+43530@v%d~K@o233448+04380@v$N@HII233448+49170@v%Ӡm@;X%233454+26480@v&4N@1233500+17440@v&@2i6233512+18370@v& =q@>!5yG233512+29520@v'@:5yG233518+26130@v(N@:u&7233530+26100@v' @@?Q233524+31430@v(t @@M^o233536+07430@v(UUUUV@9?.233530+25250@v( =p@(qYj|233542+11570@v(G@;233542+07320@v(\)@>UUUUU233542+30250@v)Q@;(vT2233548+26530@v)΁@4IJ233554+04320@v)b0@:l233554+26430@v)N@:~K233600+26330@v)X%@:t @233600+26420@v)\)@;~K233600+26450@v),_@;Yj233600+26450@v*t @@'233606+05100@v*i6@;wwwww233612+26440@v*/b@;-.233612+26440@v*@/dۗS233612+15410@v*΁@"L;*233612+08470@v*N@;7 =p233612+26560@v+P6j@ò233618+04100@v+t @?m:Ӡ233624+01310@v+UUUUU@;6 +<233612+26560@v+_,@;DzG233618+26590@v)@R33333223406+75230@v,.zG@;=p 233642+26500@v,zG?ݫ4V233636+00110@v,p @4Vx233642+05130@v,@@ |233636+31490@v,b0@;p =233642+26500@v,~@;(8233642+26500@v-/b@90d 233642+24440@v-@t. 233654-01430@v-@"j233648+08570@v.hN@5Au233706+21390@v/ =@5vT2233730+21260@v0 @t@;""""""233724+26520@v0b@Grb233742+47420@v1b/?˩eC233754+00580@v1DDDDE@;O233748+27170@v1~K@233748+03450@v1X&@n]L;*233748+05590@v1Ӡm:@Em:Ӡ233754+42590@v1G@1~K233800+02300@v2?%Y@=06i233800+28550@v2@t@:OP233924+30190@v9'@t@:;` `233942+25570@v9]@d233948+06390@v:@t@;wwwww234006+26490@v;/b@; -234012+26460@v;N@;Ll234018+27010@v;,_@;xvT2234024+27120@v<N@3l/b234030+19090@v'@t @;Ob0234100+27020@v?P6j@Sʆ234642+30420@vT3333@GFӠm:234642+46170@vUL@G s234648+47390@vV@= 234712+29400@vWzG@ jAu234712+07550@vW,_@> Ӡm:234718+29460@vX.zG@Bl#Eh234736+36350@vYE,_@% =p234748+10290@vY1~K@BU[[234748+36230@vZ*@234800+01470@vZ4N@>?234800+01470@vZDDDDD@<,`234800+28430@v["""""N234812-02280@v[*@;I4234812+27010@v[\(@;Au1234818+26490@v[ >@!\(\234824+08240@v[N@;%&7234824+26530@v\@;7ó234824+26570@v\B\(@4&fffff234830+19520@v\kR?N234836+00460@v\6i@G\IJ234830+46270@v\i6@!tN234836+08270@v];@4ra234842+20170@v]N@45y234848+19490@v] =q@4/b234854+19500@v]b/@4,_234854+20180@v^1~K@!yF234900+08270@v^""""@2ϤO234906+18320@v^Ӡm:@'@t 234912+05460@v_aG{@\)234918+02480@v_Q@0ʆA234924+16170@v`N@&d234936+11120@v`@ I234936+08070@v`\@?FӠm:234942+31000@v`DDDD@& =q234936+11120@vam:@<\(234954+28300@vaN@GGz235000+47070@vbm:ӡ@-OO235000+14170@vbX%@;!P?235012+26520@vc(\@Gf235018+46320@vdUUUU@L'235148+30010@vi,_235154-02130@vi/c@bn]235248+30070@vmrX%@5fffff235248+21190@vm%Y@G$h235254+47000@vnQ@1멇eC!235300+17380@vn@=?.235306+28590@vn""""@3ra235306+19150@vn@?fffff235312+31380@vn @@>6T2235312+29560@vo6i@9FX235318+25140@voW =p@9235318+25140@vou\)@9~&7I235318+25140@vp'@t@vT2235330+07150@vp@t OP235336-01160@vpi6@=` ` 235342+29090@vpy,_ƿUUUUUU235342-01120@vp~K@HۗS235336+49130@vpNNO235342-00480@vq@t ӗSʆB235348-00340@vr|/c@;W235406+26500@vr΁@+-235406+13300@vs@0HYk235412+16330@vs*?7HZ235418+01050@vst @@ I235424+05140@vs@%Au1235424+10330@vs,_4V235430-02220@vtm:Ӡ@=Ӡm:235430+29350@vu@>F235448+30430@vuؿ%@2O.235500+18020@vv@G?.235500+47100@vvi6@20t A235506+17550@vyN@=[raQ235542+29060@vy.zH@=qr235542+29190@vy =q@FH#235554+44170@vy~K@<%Y235554+27450@vy@@^o235554+31580@vz =p@#X%235600+09410@vzE,_@%u r235600+10260@v{R@ >?235624+03220@v|zG@2yF235630+18340@v|:Ӡm?ra235630+01260@v|6@9?.235642+25390@v} @t@Gq6j235648+46370@v}P6j@ ;*235648+04290@v}N@4ۗS235654+20290@v}6?UUUUUV235654+01180@v}6@5j235700+21080@v~@24 @t235700+17560@v~t @@-'}'235700+14320@v_,@@Yj|235718+32250@v@GqGz235718+46370?}i6@G*235730+47000?Q@/i6235730+15360? =pòo235736-00190?m:Ӡ@@^N235736+32280?NO?dۗ235742+00510?@G{89235742+46410?_,`@@,_235736+32520?,_@@j}'}(235754+32310?GzG@@ep =235754+32310?/b@6 s235748+22430?~K@ANӠm:235748+34200?,_@18N235754+16570?%X@:S33333235800+26030?N@:N&7I235800+26030?/b6i6235806-02030?6i6@ ') parser.add_option('-b', dest='band', help='Select the band on which to apply cuts: "J" (default), "H", or "K"') parser.set_defaults(band='J') opt,args = parser.parse_args() if len(args) != 2: parser.print_help() sys.exit(-1) lband = opt.band.lower() infn = args[0] outfn = args[1] print 'Reading %s, writing %s' % (infn, outfn) T = fits_table(infn) qual_col = '%s_quality' % lband cc_col = '%s_cc' % lband mag_col = '%s_mag' % lband qual = T.getcolumn(qual_col) cc = T.getcolumn(cc_col) # if ((entry->j_quality != TWOMASS_QUALITY_NO_BRIGHTNESS) && # (entry->j_cc == TWOMASS_CC_NONE)) { I = logical_and(qual != chr(0), cc == chr(0)) print 'Keeping %i of %i sources' % (sum(I), len(I)) T[I].write_to(outfn, columns=['ra','dec',mag_col]) astrometry.net-0.67/blind/__init__.py000644 000765 000024 00000000001 12651445460 017756 0ustar00dstnstaff000000 000000 astrometry.net-0.67/blind/add-text.c000644 000765 000024 00000013205 12651445460 017535 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include "an-bool.h" #include "os-features.h" #include #include "cairoutils.h" #include "bl.h" const char* OPTIONS = "hj:t:f:c:x:y:W:H:o:"; void print_help(char* progname) { int i; fprintf(stderr, "\nUsage: %s\n" " -j \n" " -o \n" " -t \n" " -f \n" " -c :\n" , progname); for (i=0;; i++) { const char* color = cairoutils_get_color_name(i); if (!color) break; fprintf(stderr, " %s\n", color); } fprintf(stderr, " -x \n" " -y \n" " -W \n" " -H \n"); } int main(int argc, char** args) { int c; char* jpegfn = NULL; char* outfn = NULL; cairo_t* cairo = NULL; cairo_surface_t* target = NULL; double fontsize = 50.0; int imW, imH; double xc=-1, yc=-1, W=0, H=0; unsigned char* img = NULL; char* text = NULL; char* font = "Purisa"; float r=1.0, g=1.0, b=1.0; sl* lines; char* cptr; int i; cairo_text_extents_t textents; double txtw, txth; double y; int res; double linespacing = 0.2; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'j': jpegfn = optarg; break; case 'o': outfn = optarg; break; case 't': text = optarg; break; case 'f': font = optarg; break; case 'c': if (cairoutils_parse_color(optarg, &r, &g, &b)) { fprintf(stderr, "I didn't understand color \"%s\".\n", optarg); exit(-1); } break; case 'x': xc = atof(optarg); break; case 'y': yc = atof(optarg); break; case 'W': W = atof(optarg); break; case 'H': H = atof(optarg); break; default: print_help(args[0]); exit(-1); } } if (!jpegfn || !outfn || !text) { fprintf(stderr, "No jpeg input or output filename or text.\n"); print_help(args[0]); exit(-1); } img = cairoutils_read_jpeg(jpegfn, &imW, &imH); if (!img) { fprintf(stderr, "Failed to read jpeg file %s.\n", jpegfn); exit(-1); } if (xc == -1) xc = imW/2; if (yc == -1) yc = imH/2; if (W == 0) W = imW; if (H == 0) H = imH; fprintf(stderr, "Image size %i x %i\n", imW, imH); fprintf(stderr, "Placing text at center (%g,%g), size (%g,%g)\n", xc, yc, W, H); target = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, imW, imH, imW*4); cairo = cairo_create(target); cairo_set_antialias(cairo, CAIRO_ANTIALIAS_GRAY); cairo_set_source_rgb(cairo, r, g, b); cairo_select_font_face(cairo, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cairo, fontsize); // break the text into lines... lines = sl_new(4); cptr = text; while (TRUE) { char* nl = strchr(cptr, '\n'); if (!nl) { sl_append(lines, cptr); break; } sl_appendf(lines, "%.*s", (int)((nl - cptr) - 1), cptr); cptr = nl + 1; } // Treat the string "\n" as a newline also. for (i=0; i>> %s <<<\n", line); } */ for (;;) { txtw = txth = 0.0; for (i=0; i W || txth > H) { double scale = MIN(W / txtw, H / txth); fprintf(stderr, "scaling by %g\n", scale); fontsize *= scale; cairo_set_font_size(cairo, fontsize); } else break; } y = yc - txth/2.0; for (i=0; i #include #include #include #include #include "os-features.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "matchobj.h" #include "matchfile.h" #include "solvedclient.h" #include "solvedfile.h" #include "boilerplate.h" char* OPTIONS = "hA:B:I:J:L:M:r:f:s:S:Fa"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s [options]\n" " [-A first-field]\n" " [-B last-field]\n" " [-I first-field-filenum]\n" " [-J last-field-filenum]\n" " [-L write-leftover-matches-file]\n" " [-M write-successful-matches-file]\n" " [-r ratio-needed-to-solve]\n" " [-f minimum-field-objects-needed-to-solve] (default: no minimum)\n" " ( [-F]: write out the first sufficient match to surpass the solve threshold.\n" " or [-a]: write out all matches passing the solve threshold.\n" " (default is to write out the single best match (largest ratio))\n" " )\n" " [-s ]\n" " [-S ]\n" " ...\n" "\n", progname); } static void write_field(pl* agreeing, pl* leftover, int fieldfile, int fieldnum); char* leftoverfname = NULL; matchfile* leftovermf = NULL; char* agreefname = NULL; matchfile* agreemf = NULL; il* solved; il* unsolved; char* solvedserver = NULL; char* solvedfile = NULL; double ratio_tosolve = 0.0; int ninfield_tosolve = 0; enum modes { MODE_BEST, MODE_FIRST, MODE_ALL }; int main(int argc, char *argv[]) { int argchar; char* progname = argv[0]; char** inputfiles = NULL; int ninputfiles = 0; int i; int firstfield=0, lastfield=INT_MAX-1; int firstfieldfile=1, lastfieldfile=INT_MAX-1; matchfile** mfs; MatchObj** mos; anbool* eofs; anbool* eofieldfile; int nread = 0; int f; int fieldfile; int totalsolved, totalunsolved; int mode = MODE_BEST; double logodds_tosolve = -HUGE_VAL; anbool agree = FALSE; MatchObj* bestmo; bl* keepers; bl* leftovers = NULL; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) { switch (argchar) { case 'S': solvedfile = optarg; break; case 's': solvedserver = optarg; break; case 'F': mode = MODE_FIRST; break; case 'a': mode = MODE_ALL; break; case 'r': ratio_tosolve = atof(optarg); logodds_tosolve = log(ratio_tosolve); break; case 'f': ninfield_tosolve = atoi(optarg); break; case 'M': agreefname = optarg; break; case 'L': leftoverfname = optarg; break; case 'I': firstfieldfile = atoi(optarg); break; case 'J': lastfieldfile = atoi(optarg); break; case 'A': firstfield = atoi(optarg); break; case 'B': lastfield = atoi(optarg); break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { ninputfiles = argc - optind; inputfiles = argv + optind; } else { printHelp(progname); exit(-1); } if (lastfield < firstfield) { fprintf(stderr, "Last field (-B) must be at least as big as first field (-A)\n"); exit(-1); } if (solvedserver) if (solvedclient_set_server(solvedserver)) { fprintf(stderr, "Failed to set solved server.\n"); exit(-1); } if (leftoverfname) { leftovermf = matchfile_open_for_writing(leftoverfname); if (!leftovermf) { fprintf(stderr, "Failed to open file %s to write leftover matches.\n", leftoverfname); exit(-1); } BOILERPLATE_ADD_FITS_HEADERS(leftovermf->header); qfits_header_add(leftovermf->header, "HISTORY", "This file was created by the program \"agreeable\".", NULL, NULL); if (matchfile_write_headers(leftovermf)) { fprintf(stderr, "Failed to write leftovers matchfile header.\n"); exit(-1); } leftovers = bl_new(256, sizeof(MatchObj)); } if (agreefname) { agreemf = matchfile_open_for_writing(agreefname); if (!agreemf) { fprintf(stderr, "Failed to open file %s to write agreeing matches.\n", agreefname); exit(-1); } BOILERPLATE_ADD_FITS_HEADERS(agreemf->header); qfits_header_add(agreemf->header, "HISTORY", "This file was created by the program \"agreeable\".", NULL, NULL); if (matchfile_write_headers(agreemf)) { fprintf(stderr, "Failed to write agreeing matchfile header.\n"); exit(-1); } agree = TRUE; } solved = il_new(256); unsolved = il_new(256); keepers = bl_new(256, sizeof(MatchObj)); totalsolved = totalunsolved = 0; mos = calloc(ninputfiles, sizeof(MatchObj*)); eofs = calloc(ninputfiles, sizeof(anbool)); eofieldfile = malloc(ninputfiles * sizeof(anbool)); mfs = malloc(ninputfiles * sizeof(matchfile*)); for (i=0; ifieldfile < firstfieldfile) || (mos[i]->fieldfile > lastfieldfile) || (mos[i]->fieldnum < firstfield) || (mos[i]->fieldnum > lastfield)) { mos[i] = NULL; ns++; continue; } if (mos[i]->fieldfile > fieldfile) eofieldfile[i] = TRUE; if (mos[i]->fieldfile != fieldfile) break; assert(mos[i]->fieldnum >= fieldnum); if (mos[i]->fieldnum != fieldnum) break; nread++; if (nread % 10000 == 9999) { fprintf(stderr, "."); fflush(stderr); } // if we've already found a solution, skip past the // remaining matches in this file... if (solved_it && (mode == MODE_FIRST)) { ns++; mos[i] = NULL; continue; } nr++; if ((mos[i]->logodds >= logodds_tosolve) && (mos[i]->nindex >= ninfield_tosolve)) { solved_it = TRUE; // (note, we get a pointer to its position in the list) mos[i] = bl_append(keepers, mos[i]); if (!bestmo || mos[i]->logodds > bestmo->logodds) bestmo = mos[i]; } else if (leftovers) { bl_append(leftovers, mos[i]); } mos[i] = NULL; } if (nr || ns) fprintf(stderr, "File %s: read %i matches, skipped %i matches.\n", inputfiles[i], nr, ns); } // which matches do we want to write out? if (agree) { writematches = bl_new(256, sizeof(MatchObj)); switch (mode) { case MODE_BEST: case MODE_FIRST: if (bestmo) bl_append(writematches, bestmo); break; case MODE_ALL: bl_append_list(writematches, keepers); break; } } write_field(writematches, leftovers, fieldfile, fieldnum); if (agree) bl_free(writematches); if (leftovers) bl_remove_all(leftovers); if (keepers) bl_remove_all(keepers); fprintf(stderr, "This file: %i fields solved, %i unsolved.\n", il_size(solved), il_size(unsolved)); fprintf(stderr, "Grand total: %i solved, %i unsolved.\n", totalsolved + il_size(solved), totalunsolved + il_size(unsolved)); } totalsolved += il_size(solved); totalunsolved += il_size(unsolved); il_remove_all(solved); il_remove_all(unsolved); if (alldone) break; } for (i=0; ilogodds, exp(mo->logodds)); } if (leftover && bl_size(leftover)) { fprintf(stderr, "Field %i: writing %i leftovers...\n", fieldnum, bl_size(leftover)); for (i=0; i #include #include #include #include #include #include #include #include #include #include "starutil.h" #include "codefile.h" #include "mathutil.h" #include "quadfile.h" #include "kdtree.h" #include "fitsioutils.h" #include "starkd.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "quad-utils.h" #include "quad-builder.h" const char* OPTIONS = "hi:c:q:u:l:d:I:v"; static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -i (star kdtree (skdt.fits) input file)\n" " -c (codes file (code.fits) output file)\n" " -q (quads file (quad.fits) output file)\n" " [-u ] upper bound of quad scale (arcmin)\n" " [-l ] lower bound of quad scale (arcmin)\n" " [-d ] number of stars in a \"quad\".\n" " [-I ] set the unique ID of this index\n\n" "\nReads skdt, writes {code, quad}.\n\n" , progname); } int main(int argc, char** argv) { int argchar; allquads_t* aq; int loglvl = LOG_MSG; int i; aq = allquads_init(); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'd': aq->dimquads = atoi(optarg); break; case 'I': aq->id = atoi(optarg); break; case 'h': print_help(argv[0]); exit(0); case 'i': aq->skdtfn = optarg; break; case 'c': aq->codefn = optarg; break; case 'q': aq->quadfn = optarg; break; case 'u': aq->quad_d2_upper = arcmin2distsq(atof(optarg)); aq->use_d2_upper = TRUE; break; case 'l': aq->quad_d2_lower = arcmin2distsq(atof(optarg)); aq->use_d2_lower = TRUE; break; default: return -1; } log_init(loglvl); if (!aq->skdtfn || !aq->codefn || !aq->quadfn) { printf("Specify in & out filenames, bonehead!\n"); print_help(argv[0]); exit( -1); } if (optind != argc) { print_help(argv[0]); printf("\nExtra command-line args were given: "); for (i=optind; iid) logmsg("Warning: you should set the unique-id for this index (-i).\n"); if (aq->dimquads > DQMAX) { ERROR("Quad dimension %i exceeds compiled-in max %i.\n", aq->dimquads, DQMAX); exit(-1); } aq->dimcodes = dimquad2dimcode(aq->dimquads); if (allquads_open_outputs(aq)) { exit(-1); } if (allquads_create_quads(aq)) { exit(-1); } if (allquads_close(aq)) { exit(-1); } allquads_free(aq); printf("Done.\n"); return 0; } astrometry.net-0.67/blind/allquads.c000644 000765 000024 00000015770 12651445460 017642 0ustar00dstnstaff000000 000000 /* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include #include #include #include #include #include #include #include #include #include #include "starutil.h" #include "codefile.h" #include "mathutil.h" #include "quadfile.h" #include "kdtree.h" #include "fitsioutils.h" #include "anqfits.h" #include "starkd.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "quad-utils.h" #include "quad-builder.h" #include "allquads.h" allquads_t* allquads_init() { allquads_t* aq = calloc(1, sizeof(allquads_t)); aq->dimquads = 4; return aq; } void allquads_free(allquads_t* aq) { free(aq); } static void add_quad(quadbuilder_t* qb, unsigned int* quad, void* token) { allquads_t* aq = token; if (log_get_level() > LOG_VERB) { int k; debug("quad: "); for (k=0; kdimquads; k++) debug("%-6i ", quad[k]); logverb("\n"); } quad_write_const(aq->codes, aq->quads, quad, aq->starkd, qb->dimquads, aq->dimcodes); } static anbool check_AB(quadbuilder_t* qb, pquad_t* pq, void* token) { allquads_t* aq = token; debug("check_AB: iA=%i, iB=%i, aq->starA=%i\n", pq->iA, pq->iB, aq->starA); return (pq->iA == aq->starA); } /* #include "codefile.h" static bool check_full_quad(quadbuilder_t* qb, unsigned int* quad, int nstars, void* token) { allquads_t* aq = token; double code[4]; double xyz[12]; double R1, R2; startree_get(aq->starkd, quad[0], xyz+0); startree_get(aq->starkd, quad[1], xyz+3); startree_get(aq->starkd, quad[2], xyz+6); startree_get(aq->starkd, quad[3], xyz+9); codefile_compute_star_code(xyz, code, 4); logmsg("Code: %g, %g, %g, %g\n", code[0], code[1], code[2], code[3]); R1 = hypot(code[0] - 0.5, code[1] - 0.5); R2 = hypot(code[2] - 0.5, code[3] - 0.5); logmsg("Radii %g, %g\n", R1, R2); return TRUE; } */ int allquads_create_quads(allquads_t* aq) { quadbuilder_t* qb; int i, N; double* xyz; qb = quadbuilder_init(); qb->quadd2_high = aq->quad_d2_upper; qb->quadd2_low = aq->quad_d2_lower; qb->check_scale_high = aq->use_d2_upper; qb->check_scale_low = aq->use_d2_lower; qb->dimquads = aq->dimquads; qb->add_quad = add_quad; qb->add_quad_token = aq; N = startree_N(aq->starkd); if (!qb->check_scale_high) { int* inds; inds = malloc(N * sizeof(int)); for (i=0; istarkd->tree, 0, N, xyz); qb->starxyz = xyz; qb->starinds = inds; qb->Nstars = N; quadbuilder_create(qb); free(xyz); free(inds); } else { int nq; int lastgrass = 0; /* xyz = malloc(3 * N * sizeof(double)); kdtree_copy_data_double(aq->starkd->tree, 0, N, xyz); */ // star A = i nq = aq->quads->numquads; for (i=0; istarkd, i, xyzA); startree_search_for(aq->starkd, xyzA, aq->quad_d2_upper, &xyz, NULL, &inds, &NR); /* startree_search_for(aq->starkd, xyzA, aq->quad_d2_upper, NULL, NULL, &inds, &NR); */ logverb("Star %i of %i: found %i stars in range\n", i+1, N, NR); aq->starA = i; qb->starxyz = xyz; qb->starinds = inds; qb->Nstars = NR; qb->check_AB_stars = check_AB; qb->check_AB_stars_token = aq; //qb->check_full_quad = check_full_quad; //qb->check_full_quad_token = aq; quadbuilder_create(qb); logverb("Star %i of %i: wrote %i quads for this star, total %i so far.\n", i+1, N, aq->quads->numquads - nq, aq->quads->numquads); free(inds); free(xyz); } // //free(xyz); printf("\n"); } quadbuilder_free(qb); return 0; } int allquads_close(allquads_t* aq) { startree_close(aq->starkd); // fix output file headers. if (quadfile_fix_header(aq->quads) || quadfile_close(aq->quads)) { ERROR("Couldn't write quad output file"); return -1; } if (codefile_fix_header(aq->codes) || codefile_close(aq->codes)) { ERROR("Couldn't write code output file"); return -1; } return 0; } int allquads_open_outputs(allquads_t* aq) { int hp, hpnside; qfits_header* hdr; printf("Reading star kdtree %s ...\n", aq->skdtfn); aq->starkd = startree_open(aq->skdtfn); if (!aq->starkd) { ERROR("Failed to open star kdtree %s\n", aq->skdtfn); return -1; } printf("Star tree contains %i objects.\n", startree_N(aq->starkd)); printf("Will write to quad file %s and code file %s\n", aq->quadfn, aq->codefn); aq->quads = quadfile_open_for_writing(aq->quadfn); if (!aq->quads) { ERROR("Couldn't open file %s to write quads.\n", aq->quadfn); return -1; } aq->codes = codefile_open_for_writing(aq->codefn); if (!aq->codes) { ERROR("Couldn't open file %s to write codes.\n", aq->quadfn); return -1; } aq->quads->dimquads = aq->dimquads; aq->codes->dimcodes = aq->dimcodes; if (aq->id) { aq->quads->indexid = aq->id; aq->codes->indexid = aq->id; } // get the "HEALPIX" header from the skdt and put it in the code and quad headers. hp = qfits_header_getint(startree_header(aq->starkd), "HEALPIX", -1); if (hp == -1) { logmsg("Warning: skdt does not contain \"HEALPIX\" header. Code and quad files will not contain this header either.\n"); } aq->quads->healpix = hp; aq->codes->healpix = hp; // likewise "HPNSIDE" hpnside = qfits_header_getint(startree_header(aq->starkd), "HPNSIDE", 1); aq->quads->hpnside = hpnside; aq->codes->hpnside = hpnside; hdr = quadfile_get_header(aq->quads); qfits_header_add(hdr, "CXDX", "T", "All codes have the property cx<=dx.", NULL); qfits_header_add(hdr, "CXDXLT1", "T", "All codes have the property cx+dx<=1.", NULL); qfits_header_add(hdr, "MIDHALF", "T", "All codes have the property cx+dx<=1.", NULL); qfits_header_add(hdr, "CIRCLE", "T", "Codes live in the circle, not the box.", NULL); hdr = codefile_get_header(aq->codes); qfits_header_add(hdr, "CXDX", "T", "All codes have the property cx<=dx.", NULL); qfits_header_add(hdr, "CXDXLT1", "T", "All codes have the property cx+dx<=1.", NULL); qfits_header_add(hdr, "MIDHALF", "T", "All codes have the property cx+dx<=1.", NULL); qfits_header_add(hdr, "CIRCLE", "T", "Codes live in the circle, not the box.", NULL); if (quadfile_write_header(aq->quads)) { ERROR("Couldn't write headers to quads file %s\n", aq->quadfn); return -1; } if (codefile_write_header(aq->codes)) { ERROR("Couldn't write headers to code file %s\n", aq->codefn); return -1; } if (!aq->use_d2_lower) aq->quad_d2_lower = 0.0; if (!aq->use_d2_upper) aq->quad_d2_upper = 10.0; aq->codes->numstars = startree_N(aq->starkd); aq->codes->index_scale_upper = distsq2rad(aq->quad_d2_upper); aq->codes->index_scale_lower = distsq2rad(aq->quad_d2_lower); aq->quads->numstars = aq->codes->numstars; aq->quads->index_scale_upper = aq->codes->index_scale_upper; aq->quads->index_scale_lower = aq->codes->index_scale_lower; return 0; } astrometry.net-0.67/blind/an_mm_malloc.h000644 000765 000024 00000004574 12651445460 020457 0ustar00dstnstaff000000 000000 /* Copyright (C) 2004 Free Software Foundation, Inc. This file is part of GCC. GCC 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 or later, or (at your option) any later version. GCC 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 GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, if you include this header file into source files compiled by GCC, this header file does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. */ // This has been imported into Astrometry.net for ctmf.c #ifndef _MM_MALLOC_H_INCLUDED #define _MM_MALLOC_H_INCLUDED #include #include __inline__ void* _mm_malloc (size_t size, size_t align) { void * malloc_ptr; void * aligned_ptr; /* Error if align is not a power of two. */ if (align & (align - 1)) { errno = EINVAL; return ((void*) 0); } if (size == 0) return ((void *) 0); /* Assume malloc'd pointer is aligned at least to sizeof (void*). If necessary, add another sizeof (void*) to store the value returned by malloc. Effectively this enforces a minimum alignment of sizeof double. */ if (align < 2 * sizeof (void *)) align = 2 * sizeof (void *); malloc_ptr = malloc (size + align); if (!malloc_ptr) return ((void *) 0); /* Align We have at least sizeof (void *) space below malloc'd ptr. */ aligned_ptr = (void *) (((size_t) malloc_ptr + align) & ~((size_t) (align) - 1)); /* Store the original pointer just before p. */ ((void **) aligned_ptr) [-1] = malloc_ptr; return aligned_ptr; } __inline__ void _mm_free (void * aligned_ptr) { if (aligned_ptr) free (((void **) aligned_ptr) [-1]); } #endif /* _MM_MALLOC_H_INCLUDED */ astrometry.net-0.67/blind/anet.py000644 000765 000024 00000024524 12651445460 017166 0ustar00dstnstaff000000 000000 #!/bin/env python """ anet -- command line interface to astrometry.net website. Finds WCS solutions to your FITS images. Written by J. Bloom (jbloom@astro.berkeley.edu) June 2008 Copyright (c) Josh Bloom This program is free software licensed with the GNU Public License Version 3. For a full copy of the license please go here http://www.gnu.org/licenses/licenses.html#GPL SETUP: * should work with python2.4 or higher (only tested on 2.5) * you need pyfits.py (> 1.3) in your PYTHONPATH (available from STSCI). This will in turn require you to have numpy (or numarray) installed. If you dont get any import errors when you #user> python >>> import pyfits then you are ok. * edit the variables astrometry_username and astrometry_email as appropriate * you might want to edit job_dict, since I assume a platescale around 0.1 - 2.5"/pix to help with speed up. you could also speed things along if you know the parity of your images USAGE: python anet.py {fitsfile.fits | *.fits} TODO: add an arg parser to allow user to tweak control over the URL calls """ import os, urllib, sys, datetime, copy import urllib2, cookielib import threading import mimetools, mimetypes import os, stat from cStringIO import StringIO try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import time __author__ = "J. S. Bloom" __version__ = "1.0" # Put your name and the email you registered with astrometry.net here. astrometry_username = "---Your Name Here---" astrometry_email = "---Your Email Here---" ## some helper classes first. class Callable: def __init__(self, anycallable): self.__call__ = anycallable class MultipartPostHandler(urllib2.BaseHandler): handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first # Controls how sequences are uncoded. If true, elements may be given multiple values by # assigning a sequence. doseq = 1 def http_request(self, request): data = request.get_data() if data is not None and type(data) != str: v_files = [] v_vars = [] try: for(key, value) in data.items(): if type(value) == file: v_files.append((key, value)) else: v_vars.append((key, value)) except TypeError: systype, value, traceback = sys.exc_info() raise TypeError, "not a valid non-string sequence or mapping object", traceback if len(v_files) == 0: data = urllib.urlencode(v_vars, self.doseq) else: boundary, data = self.multipart_encode(v_vars, v_files) contenttype = 'multipart/form-data; boundary=%s' % boundary if(request.has_header('Content-Type') and request.get_header('Content-Type').find('multipart/form-data') != 0): print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data') request.add_unredirected_header('Content-Type', contenttype) request.add_data(data) return request def multipart_encode(vars, files, boundary = None, buf = None): if boundary is None: boundary = mimetools.choose_boundary() if buf is None: buf = StringIO() for(key, value) in vars: buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"' % key) buf.write('\r\n\r\n' + str(value) + '\r\n') for(key, fd) in files: file_size = os.fstat(fd.fileno())[stat.ST_SIZE] filename = fd.name.split('/')[-1] contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' buf.write('--%s\r\n' % boundary) buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)) buf.write('Content-Type: %s\r\n' % contenttype) # buffer += 'Content-Length: %s\r\n' % file_size fd.seek(0) buf.write('\r\n' + fd.read() + '\r\n') buf.write('--' + boundary + '--\r\n\r\n') buf = buf.getvalue() return boundary, buf multipart_encode = Callable(multipart_encode) https_request = http_request opener = urllib2.build_opener(MultipartPostHandler) results = [] class ImageContainer: astrometry_dot_net_url = "http://live.astrometry.net/" def __init__(self,call_string,name,verbose=True): self.reqid = None self.name = name self.call_string = call_string self.status = "unknown" self.stat = "unknown" self.newhead = None self.verbose = verbose self._make_request() self._get_req_id() self._get_job_status() self._get_new_wcs() self._replace_new_wcs() results.append((self.name,self.status,self.stat,self.reqid)) def _make_request(self): self.time_started= datetime.datetime.now() self.status = "submitted" if self.verbose: print "** Submitting WCS request for image = %s" % self.name print datetime.datetime.now() self.req = opener.open(self.astrometry_dot_net_url + "index.php", self.call_string) if self.verbose: print " (Finished uploading image = %s)" % self.name print datetime.datetime.now() self.status = "returned" def _get_req_id(self): if self.status != "returned": self.status = "failed" tmp = self.req.read().splitlines() gotit = False for i in range(len(tmp)): if tmp[i].find("") != -1: gotit = True break if gotit: tmp = tmp[i+1].split("Job ") self.reqid = tmp[1].split()[0] self.status = "got req id" return def _get_job_status(self,timeout=200.0): if self.status != "got req id": print "bad job status" return got_status = False start = datetime.datetime.now() call = self.astrometry_dot_net_url + "status.php?" + urllib.urlencode({"job": self.reqid}) timeout = datetime.timedelta(seconds=timeout) if self.verbose: print " If you'd like to check the status of %s, go to: \n %s" % (self.name,call) while not got_status and datetime.datetime.now() - start < timeout: f = urllib.urlopen(call) tmp = f.readlines() for i in range(len(tmp)): if tmp[i].find("<tr><td>Status:</td><td>") != -1: self.stat = tmp[i+1].split("</td>")[0] if self.stat in ["Failed", "Solved"]: got_status = True break time.sleep(1) # print " Status of file %s (req id = %s).... %s" % (self.name,self.reqid,self.stat) def _get_new_wcs(self): #print "here1 (%s)" % self.stat if self.stat != "Solved": return call = self.astrometry_dot_net_url + "status.php?" + urllib.urlencode({"job": self.reqid, "get": "wcs.fits"}) self.newhead = "wcs-" + self.reqid + ".fits" urllib.urlretrieve(call,self.newhead) def _replace_new_wcs(self,delnew=True): if self.newhead is None or self.stat != "Solved": return if self.name.find(".fits") == -1: ## not a fits image self.status = "wcs=%s" % self.newhead return wascompressed = False if self.name.endswith(".gz"): os.system("gunzip " + self.name) wascompressed = True self.name = self.name.split(".gz")[0] tmp = pyfits.open(self.name,"update") tmp1 = pyfits.open(self.newhead,"readonly") tmp2 = tmp1[0].header del tmp2["SIMPLE"] del tmp2["BITPIX"] del tmp2["NAXIS"] ## copy the header over tmp1.close() for c in tmp2.ascardlist(): tmp[0].header.update(c.key,c.value,c.comment) tmp.verify("silentfix") tmp.close(output_verify='warn') if delnew: os.remove(self.newhead) if wascompressed: os.system("gzip " + self.name) self.name += ".gz" if self.verbose: print "Finished WCS request for image %s (%s)" % (self.name,self.stat) class AstrometrySolver: job_dict = {"uname": astrometry_username,"email": astrometry_email, "fsunit" :"arcsecperpix",\ "fstype-ul": 1, "fsu": 1.1, "fsl": 0.9, "xysrc": "img", "parity": 2, "index": "10arcmin", "tweak": 1,\ "tweak_order": 2, "imgfile": "","submit": "Submit"} def __init__(self,verbose=True): self.verbose= verbose self.threads = [] def _make_request(self,imgfile=None,pixel_size_range = [0.2,1.1], tweak_astrometry=True): if imgfile is None or not os.path.isfile(imgfile): if self.verbose: print "! imgfile is bad" return tmp =copy.copy(self.job_dict) tmp.update({"imgfile": open(imgfile,"rb"), "fsl": pixel_size_range[0], "fsu": pixel_size_range[1], "tweak": int(tweak_astrometry)}) if imgfile.find(".fits") == -1: tmp.update({"index": "auto"}) self.threads.append(threading.Timer(0.0,ImageContainer,args=[tmp,imgfile],kwargs={'verbose': self.verbose})) self.threads[-1].start() #print opener.open(self.astrometry_dot_net_url, tmp).read() #params = urllib.urlencode(tmp) #print self.astrometry_dot_net_url + "?" + params #f = url def get_wcs(self,imlist=None,howmany_at_a_time=5,pixel_size_range = [0.2,1.1]): print "Verbose is set to %s" % repr(self.verbose) if imlist is None: return if type(imlist) == type("a"): self._make_request(imlist,pixel_size_range = pixel_size_range) self.threads[-1].join() if type(imlist) == type([]): nsets = len(imlist)/howmany_at_a_time + 1 for i in range(nsets): # print (i, (i*howmany_at_a_time),((1 + i)*howmany_at_a_time)) for im in imlist[(i*howmany_at_a_time):((i+1)*howmany_at_a_time)]: if im.find(".fits") == -1: ## probably cannot trust the image scale to be small self._make_request(im,pixel_size_range=[0.1,500],tweak_astrometry=False) else: self._make_request(im) ## wait until the last guy finishes before firing off more self.threads[-1].join() self.threads[-1].join() def __str__(self): a = "RESULTS OF THE SUBMITTED JOBS\n" a += "%-45s\t%-10s\t%-10s\t%-15s\n" % ("name","status","stat","reqid") a += "*"*100 + "\n" for r in results: a += "%-45s\t'%-10s'\t%-10s\t%-15s\n" % (os.path.basename(r[0]),r[1],r[2],r[3]) return a #results.append((self.name,self.status,self.stat,self.reqid)) if __name__ == "__main__": if len(sys.argv) <= 1: print __doc__ else: a = AstrometrySolver() a.get_wcs(imlist=sys.argv[1:],pixel_size_range = [0.2,2]) print a ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/augment-xylist-main.c�����������������������������������������������������000644 �000765 �000024 �00000004527 12651445460 021746� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** * Accepts an xylist and command-line options, and produces an augmented * xylist. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <libgen.h> #include <getopt.h> #include "os-features.h" #include "ioutils.h" #include "fileutils.h" #include "bl.h" #include "an-bool.h" #include "solver.h" #include "math.h" #include "fitsioutils.h" #include "sip_qfits.h" #include "tabsort.h" #include "errors.h" #include "fits-guess-scale.h" #include "image2xy-files.h" #include "resort-xylist.h" #include "anqfits.h" #include "an-opts.h" #include "augment-xylist.h" static void print_help(const char* progname, bl* opts) { printf("\nUsage: %s [options]\n", progname); augment_xylist_print_help(stdout); printf("\n\n"); } int main(int argc, char** args) { int c; int rtn; int help_flag = 0; bl* opts; char* me; augment_xylist_t theargs; augment_xylist_t* axy = &theargs; me = find_executable(args[0], NULL); opts = bl_new(4, sizeof(an_option_t)); augment_xylist_add_options(opts); augment_xylist_init(axy); while (1) { c = opts_getopt(opts, argc, args); if (c == -1) break; switch (c) { case 0: fprintf(stderr, "Unknown option '-%c'\n", optopt); exit(-1); case '?': break; case 'h': help_flag = 1; break; default: if (augment_xylist_parse_option(c, optarg, axy)) { exit(-1); } break; } } rtn = 0; if (optind != argc) { int i; printf("Unknown arguments:\n "); for (i=optind; i<argc; i++) { printf("%s ", args[i]); } printf("\n"); help_flag = 1; rtn = -1; } if (!axy->axyfn) { printf("Output filename (-o / --out) is required.\n"); help_flag = 1; rtn = -1; } if (!(axy->imagefn || axy->xylsfn)) { printf("Require either an image (-i / --image) or an XYlist (-x / --xylist) input file.\n"); help_flag = 1; rtn = -1; } if (help_flag) { print_help(args[0], opts); exit(rtn); } bl_free(opts); rtn = augment_xylist(axy, me); augment_xylist_free_contents(axy); return rtn; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/augment-xylist.c����������������������������������������������������������000644 �000765 �000024 �00000153360 12651445460 021024� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** * Accepts an image or xylist, plus command-line options, and produces * an augmented xylist. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <libgen.h> #include <getopt.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "ioutils.h" #include "fileutils.h" #include "bl.h" #include "an-bool.h" #include "solver.h" #include "fitsioutils.h" #include "blindutils.h" #include "sip_qfits.h" #include "tabsort.h" #include "cut-table.h" #include "errors.h" #include "fits-guess-scale.h" #include "image2xy-files.h" #include "resort-xylist.h" #include "an-opts.h" #include "augment-xylist.h" #include "log.h" #include "anqfits.h" static void delete_existing_an_headers(qfits_header* hdr); void augment_xylist_init(augment_xylist_t* axy) { memset(axy, 0, sizeof(augment_xylist_t)); axy->tempdir = "/tmp"; axy->tweak = TRUE; axy->tweakorder = 2; axy->depths = il_new(4); axy->fields = il_new(16); axy->verifywcs = sl_new(4); axy->verifywcs_ext = il_new(4); axy->tagalong = sl_new(4); axy->try_verify = TRUE; axy->resort = TRUE; axy->ra_center = HUGE_VAL; axy->dec_center = HUGE_VAL; axy->parity = PARITY_BOTH; axy->uniformize = 10; axy->verify_uniformize = TRUE; } void augment_xylist_free_contents(augment_xylist_t* axy) { sl_free2(axy->verifywcs); il_free(axy->verifywcs_ext); sl_free2(axy->tagalong); il_free(axy->depths); il_free(axy->fields); if (axy->predistort) sip_free(axy->predistort); } void augment_xylist_print_special_opts(an_option_t* opt, bl* opts, int index, FILE* fid, void* extra) { if (!strcmp(opt->name, "image")) { fprintf(fid, "%s", " ( -i / --image <image-input-file>\n" " OR -x / --xylist <xylist-input-file> ): input file\n"); } else if (!strcmp(opt->name, "scale-units")) { fprintf(fid, "%s", " -u / --scale-units <units>: in what units are the lower and upper bounds?\n" " choices: \"degwidth\", \"degw\", \"dw\" : width of the image, in degrees (default)\n" " \"arcminwidth\", \"amw\", \"aw\" : width of the image, in arcminutes\n" " \"arcsecperpix\", \"app\": arcseconds per pixel\n" " \"focalmm\": 35-mm (width-based) equivalent focal length\n" ); } else if (!strcmp(opt->name, "depth")) { fprintf(fid, "%s", " -d / --depth <number or range>: number of field objects to look at, or range\n" " of numbers; 1 is the brightest star, so \"-d 10\" or \"-d 1-10\" mean look\n" " at the top ten brightest stars only.\n"); } else if (!strcmp(opt->name, "xylist-only")) { fprintf(fid, "%s", "The following options are valid for xylist inputs only:\n"); } else if (!strcmp(opt->name, "fields")) { fprintf(fid, "%s", " -F / --fields <number or range>: the FITS extension(s) to solve, inclusive\n"); } else if (!strcmp(opt->name, "options")) { fprintf(fid, "Options include:\n"); } } static an_option_t options[] = { {'i', "image", required_argument, NULL, NULL}, {'x', "xylist", required_argument, NULL, NULL}, {'o', "out", required_argument, "filename", "output augmented xylist filename"}, {'\x01', "options", no_argument, NULL, NULL}, {'h', "help", no_argument, NULL, "print this help message" }, {'v', "verbose", no_argument, NULL, "be more chatty" }, {'7', "no-delete-temp", no_argument, NULL, "don't delete temp files (for debugging)\n"}, {'L', "scale-low", required_argument, "scale", "lower bound of image scale estimate"}, {'H', "scale-high", required_argument, "scale", "upper bound of image scale estimate"}, {'u', "scale-units", required_argument, "units", NULL}, {'8', "parity", required_argument, "pos/neg", "only check for matches with positive/negative parity (default: try both)"}, {'c', "code-tolerance", required_argument, "distance", "matching distance for quads (default: 0.01)"}, {'E', "pixel-error", required_argument, "pixels", "for verification, size of pixel positional error (default: 1)"}, {'q', "quad-size-min", required_argument, "fraction", "minimum size of quads to try, as a fraction of the smaller image dimension, default: 0.1"}, {'Q', "quad-size-max", required_argument, "fraction", "maximum size of quads to try, as a fraction of the image hypotenuse, default 1.0"}, {'\x82', "odds-to-tune-up", required_argument, "odds", "odds ratio at which to try tuning up a match that isn't good enough to solve (default: 1e6)"}, {'[', "odds-to-solve", required_argument, "odds", "odds ratio at which to consider a field solved (default: 1e9)"}, {'#', "odds-to-reject", required_argument, "odds", "odds ratio at which to reject a hypothesis (default: 1e-100)"}, {'%', "odds-to-stop-looking", required_argument, "odds", "odds ratio at which to stop adding stars when evaluating a hypothesis (default: HUGE_VAL)"}, {'^', "use-sextractor", no_argument, NULL, "use SExtractor rather than built-in image2xy to find sources"}, {'&', "sextractor-config", required_argument, "filename", "use the given SExtractor config file. " "Note that CATALOG_NAME and CATALOG_TYPE values will be over-ridden by command-line values. " "This option implies --use-sextractor."}, {'*', "sextractor-path", required_argument, "filename", "use the given path to the SExtractor executable. Default: just 'sex', assumed to be in your PATH." " Note that you can give command-line args here too (but put them in quotes), eg: --sextractor-path 'sex -DETECT_TYPE CCD'. " "This option implies --use-sextractor."}, {'3', "ra", required_argument, "degrees or hh:mm:ss", "only search in indexes within 'radius' of the field center given by 'ra' and 'dec'"}, {'4', "dec", required_argument, "degrees or [+-]dd:mm:ss", "only search in indexes within 'radius' of the field center given by 'ra' and 'dec'"}, {'5', "radius", required_argument, "degrees", "only search in indexes within 'radius' of the field center given by ('ra', 'dec')"}, {'d', "depth", required_argument, NULL, NULL}, {'|', "objs", required_argument, "int", "cut the source list to have this many items (after sorting, if applicable)."}, {'l', "cpulimit", required_argument, "seconds", "give up solving after the specified number of seconds of CPU time"}, {'r', "resort", no_argument, NULL, "sort the star brightnesses by background-subtracted flux; the default is to sort using a" "compromise between background-subtracted and non-background-subtracted flux"}, {'6', "extension", required_argument, "int", "FITS extension to read image from."}, {'2', "no-fits2fits", no_argument, NULL, "don't sanitize FITS files; assume they're already valid"}, {';', "invert", no_argument, NULL, "invert the image (for black-on-white images)"}, {'z', "downsample", required_argument, "int", "downsample the image by factor <int> before running source extraction"}, {']', "no-background-subtraction", no_argument, NULL, "don't try to estimate a smoothly-varying sky background during source extraction."}, {'{', "sigma", required_argument, "float", "set the noise level in the image"}, {'9', "no-remove-lines", no_argument, NULL, "don't remove horizontal and vertical overdensities of sources."}, {':', "uniformize", required_argument, "int", "select sources uniformly using roughly this many boxes (0=disable; default 10)"}, {'\x81', "no-verify-uniformize", no_argument, NULL, "don't uniformize the field stars during verification"}, {'\x83', "no-verify-dedup", no_argument, NULL, "don't deduplicate the field stars during verification"}, {'0', "no-fix-sdss", no_argument, NULL, "don't try to fix SDSS idR files."}, {'C', "cancel", required_argument, "filename", "filename whose creation signals the process to stop"}, {'S', "solved", required_argument, "filename", "output file to mark that the solver succeeded"}, {'I', "solved-in", required_argument, "filename", "input filename for solved file"}, {'M', "match", required_argument, "filename", "output filename for match file"}, {'R', "rdls", required_argument, "filename", "output filename for RDLS file"}, {'\x80', "sort-rdls", required_argument, "column", "sort the RDLS file by this column; default is ascending; use " "\"-column\" to sort \"column\" in descending order instead."}, {'}',"tag", required_argument, "column", "grab tag-along column from index into RDLS file"}, {'<', "tag-all", no_argument, NULL, "grab all tag-along columns from index into RDLS file"}, {'j', "scamp-ref", required_argument, "filename", "output filename for SCAMP reference catalog"}, {'B', "corr", required_argument, "filename", "output filename for correspondences"}, {'W', "wcs", required_argument, "filename", "output filename for WCS file"}, {'P', "pnm", required_argument, "filename", "save the PNM file as <filename>"}, {'f', "force-ppm", no_argument, NULL, "force the PNM file to be a PPM"}, {'k', "keep-xylist", required_argument, "filename", "save the (unaugmented) xylist to <filename>"}, {'A', "dont-augment", no_argument, NULL, "quit after writing the unaugmented xylist"}, {'V', "verify", required_argument, "filename", "try to verify an existing WCS file"}, {'\x92', "verify-ext", required_argument, "extension", "HDU from which to read WCS to verify; set this BEFORE --verify"}, {'y', "no-verify", no_argument, NULL, "ignore existing WCS headers in FITS input images"}, {'g', "guess-scale", no_argument, NULL, "try to guess the image scale from the FITS headers"}, {'>', "crpix-center", no_argument, NULL, "set the WCS reference point to the image center"}, {'/', "crpix-x", required_argument, "pix", "set the WCS reference point to the given position"}, {'\\', "crpix-y", required_argument, "pix", "set the WCS reference point to the given position"}, {'T', "no-tweak", no_argument, NULL, "don't fine-tune WCS by computing a SIP polynomial"}, {'t', "tweak-order", required_argument, "int", "polynomial order of SIP WCS corrections"}, /* {'\x86', "predistort", required_argument, "filename", "apply the distortion in this SIP WCS header before and after solving"}, */ {'m', "temp-dir", required_argument, "dir", "where to put temp files, default /tmp"}, // placeholder for printing "The following are for xylist inputs only" {'\0', "xylist-only", no_argument, NULL, NULL}, {'F', "fields", required_argument, NULL, NULL}, {'w', "width", required_argument, "pixels", "specify the field width"}, {'e', "height", required_argument, "pixels", "specify the field height"}, {'X', "x-column", required_argument, "column-name", "the FITS column containing the X coordinate of the sources"}, {'Y', "y-column", required_argument, "column-name", "the FITS column containing the Y coordinate of the sources"}, {'s', "sort-column", required_argument, "column-name", "the FITS column that should be used to sort the sources"}, {'a', "sort-ascending", no_argument, NULL, "sort in ascending order (smallest first); default is descending order"}, }; void augment_xylist_print_help(FILE* fid) { bl* opts; opts = opts_from_array(options, sizeof(options)/sizeof(an_option_t), NULL); opts_print_help(opts, fid, augment_xylist_print_special_opts, NULL); bl_free(opts); } void augment_xylist_add_options(bl* opts) { bl* myopts = opts_from_array(options, sizeof(options)/sizeof(an_option_t), NULL); bl_append_list(opts, myopts); bl_free(myopts); } static int parse_fields_string(il* fields, const char* str); int augment_xylist_parse_option(char argchar, char* optarg, augment_xylist_t* axy) { double d; int verify_extension = -1; //printf("parsing option %c (%i)\n", argchar, (int)argchar); switch (argchar) { case '\x80': axy->sort_rdls = optarg; break; case '\x81': axy->verify_uniformize = FALSE; break; case '\x82': axy->odds_to_tune_up = atof(optarg); break; case '\x83': axy->verify_dedup = FALSE; break; /* case '\x86': axy->predistort = sip_read_header_file(optarg, NULL); if (!axy->predistort) { ERROR("Failed to read SIP header file \"%s\" for pre-distortion values", optarg); return -1; } break; */ case ';': axy->invert_image = TRUE; break; case '>': axy->set_crpix_center = TRUE; axy->set_crpix = TRUE; break; case '/': axy->crpix[0] = atof(optarg); axy->set_crpix = TRUE; break; case '\\': axy->crpix[1] = atof(optarg); axy->set_crpix = TRUE; break; case '}': sl_append(axy->tagalong, optarg); break; case '<': axy->tagalong_all = TRUE; break; case '{': axy->image_sigma = atof(optarg); break; case '^': axy->use_sextractor = TRUE; break; case '&': axy->sextractor_config = optarg; axy->use_sextractor = TRUE; break; case '*': axy->sextractor_path = optarg; axy->use_sextractor = TRUE; break; case '9': axy->no_removelines = TRUE; break; case ':': axy->uniformize = atoi(optarg); break; case '0': axy->no_fix_sdss = TRUE; break; case '3': axy->ra_center = atora(optarg); if (axy->ra_center == HUGE_VAL) { ERROR("Couldn't understand your RA center argument \"%s\"", optarg); return -1; } break; case '4': axy->dec_center = atodec(optarg); if (axy->dec_center == HUGE_VAL) { ERROR("Couldn't understand your Dec center argument \"%s\"", optarg); return -1; } break; case '5': axy->search_radius = atof(optarg); break; case '6': axy->extension = atoi(optarg); break; case '[': axy->odds_to_solve = atof(optarg); break; case '#': axy->odds_to_bail = atof(optarg); break; case '%': axy->odds_to_stoplooking = atof(optarg); break; case ']': axy->no_bg_subtraction = TRUE; break; case '8': if (streq(optarg, "pos")) { axy->parity = PARITY_NORMAL; } else if (streq(optarg, "neg")) { axy->parity = PARITY_FLIP; } else { ERROR("Couldn't understand your Parity argument \"%s\": must be \"pos\" or \"neg\"", optarg); return -1; } break; case 'B': axy->corrfn = optarg; break; case 'y': axy->try_verify = FALSE; break; case 'q': d = atof(optarg); if (d < 0.0 || d > 1.0) { ERROR("quad size fraction (-q / --quad-size-min) must be between 0.0 and 1.0"); return -1; } axy->quadsize_min = d; break; case 'Q': d = atof(optarg); if (d < 0.0 || d > 1.0) { ERROR("quad size fraction (-Q / --quad-size-max) must be between 0.0 and 1.0"); return -1; } axy->quadsize_max = d; break; case 'l': axy->cpulimit = atof(optarg); break; case 'A': axy->dont_augment = TRUE; break; case 'z': axy->downsample = atoi(optarg); break; case 'r': axy->resort = FALSE; break; case 'E': axy->pixelerr = atof(optarg); break; case 'c': axy->codetol = atof(optarg); break; case 'v': axy->verbosity++; break; case '7': axy->no_delete_temp = TRUE; break; case '\x92': verify_extension = atoi(optarg); break; case 'V': sl_append(axy->verifywcs, optarg); il_append(axy->verifywcs_ext, (verify_extension >= 0 ? verify_extension : axy->extension)); break; case 'I': axy->solvedinfn = optarg; break; case 'k': axy->keepxylsfn = optarg; break; case 's': axy->sortcol = optarg; axy->resort = FALSE; break; case 'a': axy->sort_ascending = TRUE; break; case 'X': axy->xcol = optarg; break; case 'Y': axy->ycol = optarg; break; case 'm': axy->tempdir = optarg; break; case '2': axy->no_fits2fits = TRUE; break; case 'F': if (parse_fields_string(axy->fields, optarg)) { ERROR("Failed to parse fields specification \"%s\"", optarg); return -1; } break; case 'd': if (parse_depth_string(axy->depths, optarg)) { ERROR("Failed to parse depth specification: \"%s\"", optarg); return -1; } break; case '|': axy->cutobjs = atoi(optarg); break; case 'o': axy->axyfn = optarg; break; case 'i': axy->imagefn = optarg; break; case 'x': axy->xylsfn = optarg; break; case 'L': axy->scalelo = atof(optarg); break; case 'H': axy->scalehi = atof(optarg); break; case 'u': axy->scaleunit = parse_scale_units(optarg); if (axy->scaleunit == -1) { ERROR("Unknown image scale units \"%s\". See \"solve-field -h\" for allowed values.\n", optarg); return -1; } break; case 'w': axy->W = atoi(optarg); break; case 'e': axy->H = atoi(optarg); break; case 'T': axy->tweak = FALSE; break; case 't': axy->tweakorder = atoi(optarg); break; case 'P': axy->pnmfn = optarg; break; case 'f': axy->force_ppm = TRUE; break; case 'g': axy->guess_scale = TRUE; break; case 'S': axy->solvedfn = optarg; break; case 'C': axy->cancelfn = optarg; break; case 'M': axy->matchfn = optarg; break; case 'R': axy->rdlsfn = optarg; break; case 'j': axy->scampfn = optarg; break; case 'W': axy->wcsfn = optarg; break; default: return 1; } return 0; } int parse_scale_units(const char* units) { if (strcaseeq(units, "degwidth") || strcaseeq(units, "degw") || strcaseeq(units, "dw")) { return SCALE_UNITS_DEG_WIDTH; } else if (strcaseeq(units, "arcminwidth") || strcaseeq(units, "amw") || strcaseeq(units, "aw")) { return SCALE_UNITS_ARCMIN_WIDTH; } else if (strcaseeq(units, "arcsecperpix") || strcaseeq(units, "app")) { return SCALE_UNITS_ARCSEC_PER_PIX; } else if (strcaseeq(units, "focalmm")) { return SCALE_UNITS_FOCAL_MM; } return -1; } // run(): ppmtopgm, pnmtofits, fits2fits.py, sextractor // backtick(): pnmfile, image2pnm.py static void append_escape(sl* list, const char* fn) { sl_append_nocopy(list, shell_escape(fn)); } static void append_executable(sl* list, const char* fn, const char* me) { char* exec = find_executable(fn, me); if (!exec) { ERROR("Couldn't find executable \"%s\"", fn); exit(-1); } sl_append_nocopy(list, shell_escape(exec)); free(exec); } static sl* backtick(sl* cmd, anbool verbose) { char* cmdstr = sl_implode(cmd, " "); sl* lines; logverb("Running: %s\n", cmdstr); if (run_command_get_outputs(cmdstr, &lines, NULL)) { ERROR("Failed to run command: %s", cmdstr); free(cmdstr); exit(-1); } free(cmdstr); sl_remove_all(cmd); return lines; } static void run(sl* cmd, anbool verbose) { if (verbose) { char* cmdstr = sl_implode(cmd, " "); logverb("Running: %s\n", cmdstr); if (run_command_get_outputs(cmdstr, NULL, NULL)) { ERROR("Failed to run command: %s", cmdstr); free(cmdstr); exit(-1); } free(cmdstr); sl_remove_all(cmd); } else { sl* lines = backtick(cmd, verbose); if (verbose) { int i; for (i=0; i<sl_size(lines); i++) logverb(" %s\n", sl_get(lines, i)); } sl_free2(lines); } } static void add_sip_coeffs(qfits_header* hdr, const char* prefix, const sip_t* sip) { char key[64]; int m, n, order; if (sip->a_order) { sprintf(key, "%sSAO", prefix); order = sip->a_order; fits_header_add_int(hdr, key, order, "SIP forward polynomial order"); for (m=0; m<=order; m++) { for (n=0; (m+n)<=order; n++) { if (m+n < 1) continue; sprintf(key, "%sA%i%i", prefix, m, n); fits_header_add_double(hdr, key, sip->a[m][n], ""); sprintf(key, "%sB%i%i", prefix, m, n); fits_header_add_double(hdr, key, sip->b[m][n], ""); } } } if (sip->ap_order) { order = sip->ap_order; sprintf(key, "%sSAPO", prefix); fits_header_add_int(hdr, key, order, "SIP reverse polynomial order"); for (m=0; m<=order; m++) { for (n=0; (m+n)<=order; n++) { if (m+n < 1) continue; sprintf(key, "%sAP%i%i", prefix, m, n); fits_header_add_double(hdr, key, sip->ap[m][n], ""); sprintf(key, "%sBP%i%i", prefix, m, n); fits_header_add_double(hdr, key, sip->bp[m][n], ""); } } } } int augment_xylist(augment_xylist_t* axy, const char* me) { // tempfiles to delete when we finish sl* tempfiles; sl* cmd; anbool verbose = axy->verbosity > 0; int i, I; //anbool guessed_scale = FALSE; anbool dosort = FALSE; char* xylsfn; qfits_header* hdr = NULL; anbool addwh = TRUE; FILE* fout = NULL; char *fitsimgfn = NULL; dl* scales; char* sanexylsfn = NULL; char* nolinesfn = NULL; char* sortedxylsfn = NULL; char* unixylsfn = NULL; char* cutxylsfn = NULL; cmd = sl_new(16); tempfiles = sl_new(4); scales = dl_new(4); if (axy->imagefn) { // if --image is given: // -run image2pnm.py // -if it's a FITS image, keep the original (well, sanitized version) // -otherwise, run ppmtopgm (if necessary) and pnmtofits. // -run image2xy to generate xylist char *uncompressedfn; char *sanitizedfn; char *pnmfn = NULL; sl* lines; anbool iscompressed = FALSE; char* line; char pnmtype; char typestr[256]; anbool want_pnm = TRUE; uncompressedfn = create_temp_file("uncompressed", axy->tempdir); sanitizedfn = create_temp_file("sanitized", axy->tempdir); sl_append_nocopy(tempfiles, uncompressedfn); sl_append_nocopy(tempfiles, sanitizedfn); if (axy->assume_fits_image) { axy->isfits = TRUE; if (!axy->pnmfn) { qfits_header* hdr; want_pnm = FALSE; // We need to get image W,H from the FITS header. logverb("Reading FITS image \"%s\" to find image size\n", axy->imagefn); hdr = anqfits_get_header2(axy->imagefn, axy->extension); axy->W = qfits_header_getint(hdr, "NAXIS1", -1); axy->H = qfits_header_getint(hdr, "NAXIS2", -1); qfits_header_destroy(hdr); if (axy->W == -1 || axy->H == -1) { ERROR("Failed to find size of FITS image \"%s\": got NAXIS1 = %i, NAXIS2 = %i\n", axy->imagefn, axy->W, axy->H); return -1; } logverb(" got FITS image size %i x %i\n", axy->W, axy->H); } } if (want_pnm) { if (axy->pnmfn) pnmfn = axy->pnmfn; else { pnmfn = create_temp_file("pnm", axy->tempdir); sl_append_nocopy(tempfiles, pnmfn); } append_executable(cmd, "image2pnm.py", me); //if (!verbose) //sl_append(cmd, "--quiet"); if (axy->no_fits2fits) sl_append(cmd, "--no-fits2fits"); else { sl_append(cmd, "--sanitized-fits-outfile"); append_escape(cmd, sanitizedfn); } if (!axy->no_fix_sdss) sl_append(cmd, "--fix-sdss"); if (axy->extension) { sl_append(cmd, "--extension"); sl_appendf(cmd, "%i", axy->extension); } sl_append(cmd, "--infile"); append_escape(cmd, axy->imagefn); sl_append(cmd, "--uncompressed-outfile"); append_escape(cmd, uncompressedfn); sl_append(cmd, "--outfile"); append_escape(cmd, pnmfn); if (axy->force_ppm) sl_append(cmd, "--ppm"); lines = backtick(cmd, verbose); axy->isfits = FALSE; for (i=0; i<sl_size(lines); i++) { logverb(" %s\n", sl_get(lines, i)); if (streq("fits", sl_get(lines, i))) axy->isfits = TRUE; if (streq("compressed", sl_get(lines, i))) iscompressed = TRUE; } sl_free2(lines); // Get image W, H, depth. sl_append(cmd, "pnmfile"); append_escape(cmd, pnmfn); lines = backtick(cmd, verbose); if (sl_size(lines) == 0) { ERROR("Got no output from the \"pnmfile\" program."); exit(-1); } line = sl_get(lines, 0); // eg "/tmp/pnm: PPM raw, 800 by 510 maxval 255" if (strlen(pnmfn) + 1 >= strlen(line)) { ERROR("Failed to parse output from pnmfile: \"%s\"", line); exit(-1); } line += strlen(pnmfn) + 1; // "PBM raw, 750 by 864" if (sscanf(line, " P%cM %255s %d by %d", &pnmtype, typestr, &axy->W, &axy->H) != 4) { ERROR("Failed to parse output from pnmfile: \"%s\"\n", line); exit(-1); } sl_free2(lines); } if (axy->isfits) { if (axy->no_fits2fits) { if (iscompressed) fitsimgfn = uncompressedfn; else fitsimgfn = axy->imagefn; } else fitsimgfn = sanitizedfn; if (axy->try_verify) { char* errstr; sip_t sip; anbool ok; // Try to read WCS header from FITS image; if successful, // add it to the list of WCS headers to verify. logverb("Looking for a WCS header in FITS input image %s ext %i\n", fitsimgfn, axy->extension); // FIXME - Right now we just try to read SIP/TAN - // obviously this should be more flexible and robust. errors_start_logging_to_string(); memset(&sip, 0, sizeof(sip_t)); ok = (sip_read_header_file_ext(fitsimgfn, axy->extension, &sip) != NULL); errstr = errors_stop_logging_to_string(": "); if (ok) { logmsg("Found an existing WCS header, will try to verify it.\n"); sl_append(axy->verifywcs, fitsimgfn); il_append(axy->verifywcs_ext, axy->extension); } else { logverb("Failed to read a SIP or TAN header from FITS image.\n"); logverb(" (reason: %s)\n", errstr); } free(errstr); } } else { fitsimgfn = create_temp_file("fits", axy->tempdir); sl_append_nocopy(tempfiles, fitsimgfn); if (pnmtype == 'P') { logverb("Converting PPM image to FITS...\n"); sl_append(cmd, "ppmtopgm"); append_escape(cmd, pnmfn); sl_append(cmd, "|"); append_executable(cmd, "an-pnmtofits", me); sl_append(cmd, ">"); append_escape(cmd, fitsimgfn); run(cmd, verbose); } else if (pnmtype == 'G') { logverb("Converting PGM image to FITS...\n"); append_executable(cmd, "an-pnmtofits", me); append_escape(cmd, pnmfn); sl_append(cmd, ">"); append_escape(cmd, fitsimgfn); run(cmd, verbose); } else if (pnmtype == 'B') { logverb("Converting PBM image to FITS...\n"); sl_append(cmd, "pbmtopgm 3 3"); append_escape(cmd, pnmfn); sl_append(cmd, "|"); append_executable(cmd, "an-pnmtofits", me); sl_append(cmd, ">"); append_escape(cmd, fitsimgfn); run(cmd, verbose); } else { assert(0); } } if (axy->keep_fitsimg) { axy->fitsimgfn = strdup(fitsimgfn); sl_remove_string(tempfiles, fitsimgfn); } logmsg("Extracting sources...\n"); xylsfn = create_temp_file("xyls", axy->tempdir); sl_append_nocopy(tempfiles, xylsfn); if (axy->use_sextractor) { if (axy->sextractor_path) sl_append(cmd, axy->sextractor_path); else sl_append(cmd, "sex"); if (axy->sextractor_config) sl_appendf(cmd, "-c %s", axy->sextractor_config); else { char* paramfn; char* paramstr; char* filterfn; char* filterstr; paramfn = create_temp_file("param", axy->tempdir); sl_append_nocopy(tempfiles, paramfn); paramstr = "X_IMAGE\nY_IMAGE\nMAG_AUTO\nFLUX_AUTO"; if (write_file(paramfn, paramstr, strlen(paramstr))) { ERROR("Failed to write SExtractor parameters to temp file \"%s\"", paramfn); exit(-1); } sl_appendf(cmd, "-PARAMETERS_NAME %s", paramfn); if (verbose) sl_append(cmd, "-VERBOSE_TYPE FULL"); axy->xcol = "X_IMAGE"; axy->ycol = "Y_IMAGE"; axy->sortcol = "MAG_AUTO"; axy->sort_ascending = TRUE; filterfn = create_temp_file("filter", axy->tempdir); sl_append_nocopy(tempfiles, filterfn); filterstr = "CONV NORM\n" "# 5x5 convolution mask of a gaussian PSF with FWHM = 2.0 pixels.\n" "0.006319 0.040599 0.075183 0.040599 0.006319\n" "0.040599 0.260856 0.483068 0.260856 0.040599\n" "0.075183 0.483068 0.894573 0.483068 0.075183\n" "0.040599 0.260856 0.483068 0.260856 0.040599\n" "0.006319 0.040599 0.075183 0.040599 0.006319\n"; if (write_file(filterfn, filterstr, strlen(filterstr))) { ERROR("Failed to write SExtractor convolution filter to temp file \"%s\"", filterfn); exit(-1); } sl_appendf(cmd, "-FILTER_NAME %s", filterfn); } sl_append(cmd, "-CATALOG_TYPE FITS_1.0"); sl_appendf(cmd, "-CATALOG_NAME %s", xylsfn); append_escape(cmd, fitsimgfn); logverb("Running SExtractor: output file is %s\n", xylsfn); run(cmd, verbose); } else { simplexy_t sxyparams; logverb("Running image2xy: input=%s, output=%s, ext=%i\n", fitsimgfn, xylsfn, axy->extension); // we have to delete the temp file because otherwise image2xy is too timid to overwrite it. if (unlink(xylsfn)) { SYSERROR("Failed to delete temp file %s", xylsfn); exit(-1); } memset(&sxyparams, 0, sizeof(simplexy_t)); // The other params get set to defaults for float or u8 images. sxyparams.nobgsub = axy->no_bg_subtraction; sxyparams.sigma = axy->image_sigma; sxyparams.invert = axy->invert_image; // MAGIC 3: downsample by a factor of 2, up to 3 times. if (image2xy_files(fitsimgfn, xylsfn, TRUE, axy->downsample, 3, axy->extension, 0, &sxyparams)) { ERROR("Source extraction failed"); exit(-1); } } dosort = TRUE; // now set the extension to 1, for the xylsfn. axy->extension = 1; } else { // xylist. // if --xylist is given: // -fits2fits.py sanitize xylsfn = axy->xylsfn; if (axy->sortcol) dosort = TRUE; if (axy->extension && (axy->extension != 1)) { // Copy just this extension to a temp file. FILE* fout; FILE* fin; off_t offset; off_t nbytes; off_t nprimary; anqfits_t* anq; char* extfn; anq = anqfits_open_hdu(xylsfn, axy->extension); if (!anq) { ERROR("Failed to open xyls file %s up to extension %i", xylsfn, axy->extension); exit(-1); } fin = fopen(xylsfn, "rb"); if (!fin) { SYSERROR("Failed to open xyls file \"%s\"", xylsfn); exit(-1); } nprimary = anqfits_header_size(anq, 0) + anqfits_data_size(anq, 0); offset = anqfits_header_start(anq, axy->extension); nbytes = anqfits_header_size(anq, axy->extension) + anqfits_data_size(anq, axy->extension); anqfits_close(anq); extfn = create_temp_file("ext", axy->tempdir); sl_append_nocopy(tempfiles, extfn); fout = fopen(extfn, "wb"); if (!fout) { SYSERROR("Failed to open temp file \"%s\" to write extension", extfn); exit(-1); } logverb("Copying ext %i of %s to temp %s\n", axy->extension, xylsfn, extfn); if (pipe_file_offset(fin, 0, nprimary, fout)) { ERROR("Failed to copy the primary HDU of xylist file %s to %s", xylsfn, extfn); exit(-1); } if (pipe_file_offset(fin, offset, nbytes, fout)) { ERROR("Failed to copy HDU %i of xylist file %s to %s", axy->extension, xylsfn, extfn); exit(-1); } fclose(fin); if (fclose(fout)) { SYSERROR("Failed to close %s", extfn); exit(-1); } xylsfn = extfn; axy->extension = 0; } } if (axy->guess_scale && (fitsimgfn || !axy->imagefn)) { dl* estscales = NULL; char* infn = (fitsimgfn ? fitsimgfn : xylsfn); fits_guess_scale(infn, NULL, &estscales); for (i=0; i<dl_size(estscales); i++) { double scale = dl_get(estscales, i); logverb("Scale estimate: %g\n", scale); dl_append(scales, scale * 0.99); dl_append(scales, scale * 1.01); //guessed_scale = TRUE; } dl_free(estscales); } // fits2fits // remove lines // sort // uniformize // cut if (axy->keepxylsfn) { // Figure out which is the last stage to run, and set its output // file to "keepxylsfn". if (axy->cutobjs) { cutxylsfn = axy->keepxylsfn; } else if (axy->uniformize) { unixylsfn = axy->keepxylsfn; } else if (dosort) { sortedxylsfn = axy->keepxylsfn; } else if (!axy->no_removelines) { nolinesfn = axy->keepxylsfn; } else if (!axy->imagefn && !axy->no_fits2fits) { sanexylsfn = axy->keepxylsfn; } else { // copy xylsfn to axy->keepxylsfn. if (copy_file(xylsfn, axy->keepxylsfn)) { ERROR("Failed to copy xyls file \"%s\" to \"%s\"", xylsfn, axy->keepxylsfn); return -1; } } } if (!axy->imagefn && !axy->no_fits2fits) { if (!sanexylsfn) { sanexylsfn = create_temp_file("sanexyls", axy->tempdir); sl_append_nocopy(tempfiles, sanexylsfn); } append_executable(cmd, "fits2fits.py", me); if (verbose) sl_append(cmd, "--verbose"); append_escape(cmd, xylsfn); append_escape(cmd, sanexylsfn); run(cmd, verbose); xylsfn = sanexylsfn; } if (!axy->no_removelines) { if (!nolinesfn) { nolinesfn = create_temp_file("removelines", axy->tempdir); sl_append_nocopy(tempfiles, nolinesfn); } logverb("Removing lines of (spurious) sources from xylist \"%s\", writing to \"%s\"\n", xylsfn, nolinesfn); append_executable(cmd, "removelines.py", me); if (axy->xcol) sl_appendf(cmd, "-X %s", axy->xcol); if (axy->ycol) sl_appendf(cmd, "-Y %s", axy->ycol); if (axy->extension) sl_appendf(cmd, "-e %i", axy->extension); append_escape(cmd, xylsfn); append_escape(cmd, nolinesfn); run(cmd, verbose); xylsfn = nolinesfn; } if (dosort) { anbool do_tabsort = FALSE; if (!axy->sortcol) axy->sortcol = "FLUX"; if (!axy->bgcol) axy->bgcol = "BACKGROUND"; if (!sortedxylsfn) { sortedxylsfn = create_temp_file("sorted", axy->tempdir); sl_append_nocopy(tempfiles, sortedxylsfn); } if (axy->resort) { char* err; int rtn; logverb("Sorting file \"%s\" to \"%s\" using columns flux (%s) and background (%s), %sscending\n", xylsfn, sortedxylsfn, axy->sortcol, axy->bgcol, axy->sort_ascending?"a":"de"); errors_start_logging_to_string(); rtn = resort_xylist(xylsfn, sortedxylsfn, axy->sortcol, axy->bgcol, axy->sort_ascending); err = errors_stop_logging_to_string(": "); if (rtn) { logmsg("Sorting brightness using %s and BACKGROUND columns failed; falling back to %s.\n", axy->sortcol, axy->sortcol); logverb("Reason: %s\n", err); do_tabsort = TRUE; } free(err); } else do_tabsort = TRUE; if (do_tabsort) { logverb("Sorting by brightness: input=%s, output=%s, column=%s.\n", xylsfn, sortedxylsfn, axy->sortcol); tabsort(xylsfn, sortedxylsfn, axy->sortcol, !axy->sort_ascending); } xylsfn = sortedxylsfn; } if (axy->uniformize) { if (!unixylsfn) { unixylsfn = create_temp_file("uniform", axy->tempdir); sl_append_nocopy(tempfiles, unixylsfn); } append_executable(cmd, "uniformize.py", me); sl_appendf(cmd, "-n %i", axy->uniformize); if (axy->xcol) sl_appendf(cmd, "-X %s", axy->xcol); if (axy->ycol) sl_appendf(cmd, "-Y %s", axy->ycol); if (axy->extension) sl_appendf(cmd, "-e %i", axy->extension); append_escape(cmd, xylsfn); append_escape(cmd, unixylsfn); run(cmd, verbose); xylsfn = unixylsfn; } if (axy->cutobjs) { // cut the source lists to at most "cutobjs" objects. if (!cutxylsfn) { cutxylsfn = create_temp_file("cut", axy->tempdir); sl_append_nocopy(tempfiles, cutxylsfn); } if (cut_table(xylsfn, cutxylsfn, axy->cutobjs)) { ERROR("Failed to cut table %s to %i entries; output file %s", xylsfn, axy->cutobjs, cutxylsfn); return -1; } xylsfn = cutxylsfn; } if (axy->dont_augment) // done! goto cleanup; // start piling FITS headers in there. hdr = anqfits_get_header2(xylsfn, 0); if (!hdr) { ERROR("Failed to read FITS header from file %s", xylsfn); exit(-1); } // delete any existing processing directives delete_existing_an_headers(hdr); if (!(axy->W && axy->H)) { // Look for existing IMAGEW and IMAGEH in primary header. axy->W = qfits_header_getint(hdr, "IMAGEW", 0); axy->H = qfits_header_getint(hdr, "IMAGEH", 0); if (axy->W && axy->H) { addwh = FALSE; } else { // Look for IMAGEW and IMAGEH headers in first extension, else bail. qfits_header* hdr2 = anqfits_get_header2(xylsfn, 1); axy->W = qfits_header_getint(hdr2, "IMAGEW", 0); axy->H = qfits_header_getint(hdr2, "IMAGEH", 0); qfits_header_destroy(hdr2); } if (!(axy->W && axy->H)) { ERROR("Error: image width and height must be specified for XYLS inputs"); exit(-1); } } // we may write long filenames. fits_header_add_longstring_boilerplate(hdr); if (addwh) { fits_header_add_int(hdr, "IMAGEW", axy->W, "image width"); fits_header_add_int(hdr, "IMAGEH", axy->H, "image height"); } qfits_header_add(hdr, "ANRUN", "T", "Solve this field!", NULL); if (axy->cpulimit > 0) fits_header_add_double(hdr, "ANCLIM", axy->cpulimit, "CPU time limit (seconds)"); if (axy->xcol) qfits_header_add(hdr, "ANXCOL", axy->xcol, "Name of column containing X coords", NULL); if (axy->ycol) qfits_header_add(hdr, "ANYCOL", axy->ycol, "Name of column containing Y coords", NULL); if (axy->tagalong_all) qfits_header_add(hdr, "ANTAGALL", "T", "Tag-along all columns from index to RDLS", NULL); else for (i=0; i<sl_size(axy->tagalong); i++) { char key[64]; sprintf(key, "ANTAG%i", i+1); qfits_header_add(hdr, key, sl_get(axy->tagalong, i), "Tag-along column from index to RDLS", NULL); } if (axy->sort_rdls) qfits_header_add(hdr, "ANRDSORT", axy->sort_rdls, "Sort RDLS file by this column", NULL); qfits_header_add(hdr, "ANVERUNI", axy->verify_uniformize ? "T":"F", "Uniformize field during verification", NULL); qfits_header_add(hdr, "ANVERDUP", axy->verify_dedup ? "T":"F", "Deduplicate field during verification", NULL); if (axy->odds_to_tune_up) fits_header_add_double(hdr, "ANODDSTU", axy->odds_to_tune_up, "Odds ratio to tune up a match"); if (axy->odds_to_solve) fits_header_add_double(hdr, "ANODDSSL", axy->odds_to_solve, "Odds ratio to consider a field solved"); if (axy->odds_to_bail) fits_header_add_double(hdr, "ANODDSBL", axy->odds_to_bail, "Odds ratio to consider a hypothesis rejected"); if (axy->odds_to_stoplooking) fits_header_add_double(hdr, "ANODDSST", axy->odds_to_stoplooking, "Odds ratio to stop trying to improve the odds ratio"); if ((axy->scalelo > 0.0) || (axy->scalehi > 0.0)) { double appu, appl; switch (axy->scaleunit) { case SCALE_UNITS_DEG_WIDTH: logverb("Scale range: %g to %g degrees wide\n", axy->scalelo, axy->scalehi); appl = deg2arcsec(axy->scalelo) / (double)axy->W; appu = deg2arcsec(axy->scalehi) / (double)axy->W; logverb("Image width %i pixels; arcsec per pixel range %g %g\n", axy->W, appl, appu); break; case SCALE_UNITS_ARCMIN_WIDTH: logverb("Scale range: %g to %g arcmin wide\n", axy->scalelo, axy->scalehi); appl = arcmin2arcsec(axy->scalelo) / (double)axy->W; appu = arcmin2arcsec(axy->scalehi) / (double)axy->W; logverb("Image width %i pixels; arcsec per pixel range %g %g\n", axy->W, appl, appu); break; case SCALE_UNITS_ARCSEC_PER_PIX: logverb("Scale range: %g to %g arcsec/pixel\n", axy->scalelo, axy->scalehi); appl = axy->scalelo; appu = axy->scalehi; break; case SCALE_UNITS_FOCAL_MM: logverb("Scale range: %g to %g mm focal length\n", axy->scalelo, axy->scalehi); // "35 mm" film is 36 mm wide. appu = rad2arcsec(atan(36. / (2. * axy->scalelo))) / (double)axy->W; appl = rad2arcsec(atan(36. / (2. * axy->scalehi))) / (double)axy->W; logverb("Image width %i pixels; arcsec per pixel range %g %g\n", axy->W, appl, appu); break; default: ERROR("Unknown scale unit code %i\n", axy->scaleunit); return -1; } dl_append(scales, appl); dl_append(scales, appu); } /* Hmm, do we want this?? if ((dl_size(axy->scales) > 0) && guessed_scale) qfits_header_add(hdr, "ANAPPDEF", "T", "try the default scale range too.", NULL); */ for (i=0; i<dl_size(scales)/2; i++) { char key[64]; double lo = dl_get(scales, 2*i); double hi = dl_get(scales, 2*i + 1); if (lo > 0.0) { sprintf(key, "ANAPPL%i", i+1); fits_header_add_double(hdr, key, lo, "scale: arcsec/pixel min"); } if (hi > 0.0) { sprintf(key, "ANAPPU%i", i+1); fits_header_add_double(hdr, key, hi, "scale: arcsec/pixel max"); } } if (axy->quadsize_min > 0.0) fits_header_add_double(hdr, "ANQSFMIN", axy->quadsize_min, "minimum quad size: fraction"); if (axy->quadsize_max > 0.0) fits_header_add_double(hdr, "ANQSFMAX", axy->quadsize_max, "maximum quad size: fraction"); if (axy->set_crpix) { if (axy->set_crpix_center) { qfits_header_add(hdr, "ANCRPIXC", "T", "Set CRPIX to the image center.", NULL); } else { fits_header_add_double(hdr, "ANCRPIX1", axy->crpix[0], "Set CRPIX1 to this val."); fits_header_add_double(hdr, "ANCRPIX2", axy->crpix[1], "Set CRPIX2 to this val."); } } qfits_header_add(hdr, "ANTWEAK", (axy->tweak ? "T" : "F"), (axy->tweak ? "Tweak: yes please!" : "Tweak: no, thanks."), NULL); if (axy->tweak && axy->tweakorder) fits_header_add_int(hdr, "ANTWEAKO", axy->tweakorder, "Tweak order"); if (axy->solvedfn) fits_header_addf_longstring(hdr, "ANSOLVED", "solved output file", "%s", axy->solvedfn); if (axy->solvedinfn) fits_header_addf_longstring(hdr, "ANSOLVIN", "solved input file", "%s", axy->solvedinfn); if (axy->cancelfn) fits_header_addf_longstring(hdr, "ANCANCEL", "cancel output file", "%s", axy->cancelfn); if (axy->matchfn) fits_header_addf_longstring(hdr, "ANMATCH", "match output file", "%s", axy->matchfn); if (axy->rdlsfn) fits_header_addf_longstring(hdr, "ANRDLS", "ra-dec output file", "%s", axy->rdlsfn); if (axy->scampfn) fits_header_addf_longstring(hdr, "ANSCAMP", "SCAMP reference catalog output file", "%s", axy->scampfn); if (axy->wcsfn) fits_header_addf_longstring(hdr, "ANWCS", "WCS header output filename", "%s", axy->wcsfn); if (axy->corrfn) fits_header_addf_longstring(hdr, "ANCORR", "Correspondences output filename", "%s", axy->corrfn); if (axy->codetol > 0.0) fits_header_add_double(hdr, "ANCTOL", axy->codetol, "code tolerance"); if (axy->pixelerr > 0.0) fits_header_add_double(hdr, "ANPOSERR", axy->pixelerr, "star pos'n error (pixels)"); if (axy->parity != PARITY_BOTH) { if (axy->parity == PARITY_NORMAL) qfits_header_add(hdr, "ANPARITY", "POS", "det(CD) > 0", NULL); else if (axy->parity == PARITY_FLIP) qfits_header_add(hdr, "ANPARITY", "NEG", "det(CD) < 0", NULL); } if ((axy->ra_center != HUGE_VAL) && (axy->dec_center != HUGE_VAL) && (axy->search_radius >= 0.0)) { fits_header_add_double(hdr, "ANERA", axy->ra_center, "RA center estimate (deg)"); fits_header_add_double(hdr, "ANEDEC", axy->dec_center, "Dec center estimate (deg)"); fits_header_add_double(hdr, "ANERAD", axy->search_radius, "Search radius from estimated posn (deg)"); } for (i=0; i<il_size(axy->depths)/2; i++) { int depthlo, depthhi; char key[64]; depthlo = il_get(axy->depths, 2*i); depthhi = il_get(axy->depths, 2*i + 1); sprintf(key, "ANDPL%i", (i+1)); fits_header_addf(hdr, key, "", "%i", depthlo); sprintf(key, "ANDPU%i", (i+1)); fits_header_addf(hdr, key, "", "%i", depthhi); } for (i=0; i<il_size(axy->fields)/2; i++) { int lo = il_get(axy->fields, 2*i); int hi = il_get(axy->fields, 2*i + 1); char key[64]; if (lo == hi) { sprintf(key, "ANFD%i", (i+1)); fits_header_add_int(hdr, key, lo, "field to solve"); } else { sprintf(key, "ANFDL%i", (i+1)); fits_header_add_int(hdr, key, lo, "field range: low"); sprintf(key, "ANFDU%i", (i+1)); fits_header_add_int(hdr, key, hi, "field range: high"); } } I = 0; for (i=0; i<sl_size(axy->verifywcs); i++) { sip_t sip; const char* fn; int ext; fn = sl_get(axy->verifywcs, i); ext = il_get(axy->verifywcs_ext, i); if (!sip_read_header_file_ext(fn, ext, &sip)) { ERROR("Failed to parse WCS header from file \"%s\" ext %i", fn, ext); continue; } I++; { tan_t* wcs = &(sip.wcstan); // note, this initialization has to happen *after* you read the WCS header :) double vals[] = { wcs->crval[0], wcs->crval[1], wcs->crpix[0], wcs->crpix[1], wcs->cd[0][0], wcs->cd[0][1], wcs->cd[1][0], wcs->cd[1][1] }; char key[64]; char* keys[] = { "ANW%iPIX1", "ANW%iPIX2", "ANW%iVAL1", "ANW%iVAL2", "ANW%iCD11", "ANW%iCD12", "ANW%iCD21", "ANW%iCD22" }; int j; for (j = 0; j < 8; j++) { sprintf(key, keys[j], I); fits_header_add_double(hdr, key, vals[j], ""); } sprintf(key, "ANW%i", I); add_sip_coeffs(hdr, key, &sip); } } if (axy->predistort) { fits_header_add_double(hdr, "ANDPIX0", axy->predistort->wcstan.crpix[0], "Pre-distortion ref pix x"); fits_header_add_double(hdr, "ANDPIX1", axy->predistort->wcstan.crpix[1], "Pre-distortion ref pix y"); add_sip_coeffs(hdr, "AND", axy->predistort); } fout = fopen(axy->axyfn, "wb"); if (!fout) { SYSERROR("Failed to open output file %s", axy->axyfn); exit(-1); } logverb("Writing headers to file %s\n", axy->axyfn); if (qfits_header_dump(hdr, fout)) { ERROR("Failed to write FITS header"); exit(-1); } qfits_header_destroy(hdr); // copy blocks from xyls to output. { FILE* fin; off_t offset; off_t nbytes; anqfits_t* anq; int ext; ext = axy->extension; if (!ext) ext = 1; anq = anqfits_open_hdu(xylsfn, ext); if (!anq) { ERROR("Failed to open xyls file %s up to extension %i", xylsfn, ext); exit(-1); } offset = anqfits_header_start(anq, ext); nbytes = anqfits_header_size(anq, ext) + anqfits_data_size(anq, ext); logverb("Copying data block of file %s to output %s.\n", xylsfn, axy->axyfn); anqfits_close(anq); fin = fopen(xylsfn, "rb"); if (!fin) { SYSERROR("Failed to open xyls file \"%s\"", xylsfn); exit(-1); } if (pipe_file_offset(fin, offset, nbytes, fout)) { ERROR("Failed to copy the data segment of xylist file %s to %s", xylsfn, axy->axyfn); exit(-1); } fclose(fin); } fclose(fout); cleanup: if (!axy->no_delete_temp) { for (i=0; i<sl_size(tempfiles); i++) { char* fn = sl_get(tempfiles, i); logverb("Deleting temp file %s\n", fn); if (unlink(fn)) { SYSERROR("Failed to delete temp file \"%s\"", fn); } } } dl_free(scales); sl_free2(cmd); sl_free2(tempfiles); return 0; } static void delete_existing_an_headers(qfits_header* hdr) { int i,j,k; char key[64]; qfits_header_del(hdr, "ANRUN"); qfits_header_del(hdr, "ANCLIM"); qfits_header_del(hdr, "ANXCOL"); qfits_header_del(hdr, "ANYCOL"); qfits_header_del(hdr, "ANTAGALL"); for (i=0; i<100; i++) { sprintf(key, "ANTAG%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANAPPL%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANAPPU%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANDPL%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANDPU%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANFD%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANFDL%i", i+1); qfits_header_del(hdr, key); sprintf(key, "ANFDU%i", i+1); qfits_header_del(hdr, key); } for (i=0; i<10; i++) { sprintf(key, "ANW%iPIX1", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iPIX2", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iVAL1", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iVAL2", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iCD11", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iCD12", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iCD21", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iCD22", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iSAO", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iSAPO", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iSBO", i+1); qfits_header_del(hdr, key); sprintf(key, "ANW%iSBPO", i+1); qfits_header_del(hdr, key); for (j=0; j<10; j++) { for (k=0; k<10; k++) { sprintf(key, "ANW%iA%i%i", i+1, j, k); qfits_header_del(hdr, key); sprintf(key, "ANW%iB%i%i", i+1, j, k); qfits_header_del(hdr, key); sprintf(key, "ANW%iAP%i%i", i+1, j, k); qfits_header_del(hdr, key); sprintf(key, "ANW%iBP%i%i", i+1, j, k); qfits_header_del(hdr, key); } } } qfits_header_del(hdr, "ANRDSORT"); qfits_header_del(hdr, "ANVERUNI"); qfits_header_del(hdr, "ANVERDUP"); qfits_header_del(hdr, "ANODDSTU"); qfits_header_del(hdr, "ANODDSSL"); qfits_header_del(hdr, "ANODDSBL"); qfits_header_del(hdr, "ANODDSST"); qfits_header_del(hdr, "ANQSFMIN"); qfits_header_del(hdr, "ANQSFMAX"); qfits_header_del(hdr, "ANCRPIXC"); qfits_header_del(hdr, "ANCRPIX1"); qfits_header_del(hdr, "ANCRPIX2"); qfits_header_del(hdr, "ANTWEAK"); qfits_header_del(hdr, "ANTWEAKO"); qfits_header_del(hdr, "ANSOLVED"); qfits_header_del(hdr, "ANSOLVIN"); qfits_header_del(hdr, "ANCANCEL"); qfits_header_del(hdr, "ANMATCH"); qfits_header_del(hdr, "ANRDLS"); qfits_header_del(hdr, "ANSCAMP"); qfits_header_del(hdr, "ANWCS"); qfits_header_del(hdr, "ANCORR"); qfits_header_del(hdr, "ANCTOL"); qfits_header_del(hdr, "ANPOSERR"); qfits_header_del(hdr, "ANPARITY"); qfits_header_del(hdr, "ANERA"); qfits_header_del(hdr, "ANEDEC"); qfits_header_del(hdr, "ANERAD"); qfits_header_del(hdr, "ANDPIX0"); qfits_header_del(hdr, "ANDPIX1"); qfits_header_del(hdr, "ANDSAO"); qfits_header_del(hdr, "ANDSBO"); qfits_header_del(hdr, "ANDSAPO"); qfits_header_del(hdr, "ANDSBPO"); for (j=0; j<10; j++) { for (k=0; k<10; k++) { sprintf(key, "ANDA%i%i", j, k); qfits_header_del(hdr, key); sprintf(key, "ANDB%i%i", j, k); qfits_header_del(hdr, key); sprintf(key, "ANDAP%i%i", j, k); qfits_header_del(hdr, key); sprintf(key, "ANDBP%i%i", j, k); qfits_header_del(hdr, key); } } } static int parse_fields_string(il* fields, const char* str) { // 10,11,20-25,30,40-50 while (str && *str) { unsigned int lo, hi; int nread; if (sscanf(str, "%u-%u", &lo, &hi) == 2) { sscanf(str, "%*u-%*u%n", &nread); } else if (sscanf(str, "%u", &lo) == 1) { sscanf(str, "%*u%n", &nread); hi = lo; } else { ERROR("Failed to parse fragment: \"%s\"", str); return -1; } if (lo <= 0) { ERROR("Field number %i is invalid: must be >= 1.", lo); return -1; } if (lo > hi) { ERROR("Field range %i to %i is invalid: max must be >= min!", lo, hi); return -1; } il_append(fields, lo); il_append(fields, hi); str += nread; while ((*str == ',') || isspace((unsigned)(*str))) str++; } return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/bands.py������������������������������������������������������������������000644 �000765 �000024 �00000011243 12651445460 017320� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from pylab import * from numpy import * from math import * # I can never remember where all the bands are... rawdata = [ # min max mid fwhm label-offset ('galex', 'fuv', 135, 175, 0, 0, 0), ('galex', 'nuv', 175, 280, 0, 0, 0), ('usnob', 'B [OJ]', 350, 540, 0, 0, 0), ('usnob', 'R [EF]', 590, 690, 0, 0, 1), ('usnob', 'N', 715, 900, 0, 0, 0), # Wikipedia:UBV... says: 364 nm for U, 442 nm for B, 540 nm for V. ('Johnson', 'U', 0,0, 364, 200, 0), ('Johnson', 'B', 375,500, 0,0,1), ('Johnson', 'V', 500,600, 0,0,0), ('Johnson', 'R', 550,725, 0,0,1), ('Johnson', 'I', 725,875, 0,0,0), ('sdss', 'u', 0, 0, 354, 57, 0), ('sdss', 'g', 0, 0, 477, 137, 1), ('sdss', 'r', 0, 0, 623, 137, 0), ('sdss', 'i', 0, 0, 763, 153, 1), ('sdss', 'z', 0, 0, 913, 95, 0), # I got these from eyeballing the synphot throughputs ('hst', '275', 250, 300, 0, 0, 0), ('hst', '336', 310, 370, 0, 0, 1), ('hst', '475', 400, 550, 0, 0, 0), ('hst', '814', 700, 950, 0, 0, 0), ('hst', '110', 900,1400, 0, 0, 1), ('hst', '160',1400,1700, 0, 0, 0), ('ukidss','Z', 830, 925, 0, 0, 0), ('ukidss','Y', 970, 1070, 0, 0, 1), ('ukidss','J',1170, 1330, 0, 0, 0), ('ukidss','H',1490, 1780, 0, 0, 1), ('ukidss','K',2030, 2370, 0, 0, 0), ('2mass', 'J', 0, 0, 1240, 0, 0), ('2mass', 'H', 0, 0, 1600, 0, 0), ('2mass', 'Ks', 0, 0, 2160, 0, 0), ('spitzer', '1', 0, 0, 3600, 0, 0), ('spitzer', '2', 0, 0, 4500, 0, 0), ('spitzer', '3', 0, 0, 5800, 0, 0), ('spitzer', '4', 0, 0, 8000, 0, 0), ] surveys = array([survey for (survey, band, a,b,c,d,e) in rawdata]) los = array([lo or mid - fwhm/2. for (survey, band, lo, hi, mid, fwhm, e) in rawdata]) his = array([hi or mid + fwhm/2. for (survey, band, lo, hi, mid, fwhm, e) in rawdata]) survs = set(surveys) surveymids = {} surveylos = {} for s in survs: surveymids[s] = sqrt(los[surveys == s].min() * his[surveys == s].max()) surveylos[s] = los[surveys == s].min() ymargin = 0.1 xmargin = 1.1 clf() lastsurvey = '' h = 0 for (survey, band, mn, mx, mid, fwhm, off) in rawdata: lo = mn or mid - fwhm/2. hi = mx or mid + fwhm/2. if survey != lastsurvey: h += 1 text(surveylos[survey] / xmargin, h, survey, horizontalalignment='right', verticalalignment='center') lastsurvey = survey semilogx([lo, hi], [h, h], 'ko-') text(sqrt(lo*hi), h+ymargin, band, horizontalalignment='center', verticalalignment='bottom', fontsize='10') if mn: txt = '%g-%g' % (mn, mx) else: if fwhm: txt = '%g(%g)' % (mid, fwhm) else: txt = '%g' % (mid) text(sqrt(lo*hi), h-1.5*(ymargin*(1+off)), txt, horizontalalignment='center', verticalalignment='top', fontsize='7') a=axis() axis([70, 1.1e4, 0, h+1]) y0 = 0.1 y1 = 0.25 mx = 1.0e4 mn = 75 for (x, y, txt) in [(1e-11, y0, 'Gamma'), (1e-9, y1, 'X-ray'), (400e-9, y0, 'purple'), (500e-9, y1, 'green'), (700e-9, y0, 'red'), (10e-6, y0, 'infrared'), ]: ha = 'left' x /= 1e-9 if x >= mx: x = mx ha = 'right' if x < mn: x = mn text(x, y, txt, verticalalignment='bottom', horizontalalignment=ha, fontsize='8') xticks([100, 1000, 10000], ['100 nm', '1 um', '10 um']) yticks([],[]) xlabel('Wavelength') title('Bands') savefig('bands.png') # USNOB # http://www.iop.org/EJ/article/1538-3881/125/2/984/202452.tb1.html # (B) # O: 350-500 nm # J: 385-540 nm # : 395-540 # (R) # E: 620-670 nm # F: 610-690 nm # : 630-690 # : 590-690 # (N) # N: 730-900 nm # : 715-900 # 2MASS # http://www.ipac.caltech.edu/2mass/releases/allsky/doc/sec1_1.new.html # J: 1.24 um # H: 1.66 um # Ks: 2.16 um # SDSS # http://www.astro.princeton.edu/PBOOK/camera/camera.htm # 5 channels # u: 354 +- 57/2 nm # g: blue-green 477 +- 137/2 nm # r: red 623 +- 137/2 nm # i: far-red 763 +- 153/2 nm # z: near-infrared 913 +- 95/2 nm # Spitzer - IRAC # http://www.spitzer.caltech.edu/technology/irac.shtml # 4 channels # 5.12 x 5.12 arcmin # 3.6, 4.5, 5.8, and 8 microns # 256 x 256 pixels # GALEX # http://www.galex.caltech.edu/QUICKFACTS/quickfacts.html # fuv: 135 to 175 nm # nuv: 175 to 280 nm # HST # many! # http://www.stsci.edu/hst/acs/documents/handbooks/cycle17/c05_imaging2.html#356971 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/bgsubtract.c��������������������������������������������������������������000644 �000765 �000024 �00000003270 12651445460 020164� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <stdint.h> #include "ctmf.h" #include "cairoutils.h" const char* OPTIONS = "h"; int main(int argc, char *args[]) { int argchar; //char* progname = args[0]; char *infn = NULL, *outfn = NULL; unsigned char* img; int W, H; unsigned char* bg; int i, j; int halfbox = 10; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { //case '?': //case 'h': //printHelp(progname); //return 0; default: return -1; } if (optind != argc-2) { //printHelp(progname); exit(-1); } infn = args[optind]; outfn = args[optind+1]; printf("Reading input %s...\n", infn); img = cairoutils_read_jpeg(infn, &W, &H); if (!img) { fprintf(stderr, "Failed to read input image %s.\n", infn); exit(-1); } printf("Image is %i x %i.\n", W, H); bg = malloc(W * H * 4); printf("Filtering..."); for (i=0; i<3; i++) { printf(" %c...", "RGB"[i]); fflush(stdout); ctmf(img + i, bg + i, W, H, 4*W, 4*W, halfbox, 4, 512*1024); } printf("\n"); for (i=0; i<(W*H); i++) for (j=0; j<3; j++) { int ind = i*4 + j; if (img[ind] <= bg[ind]) img[ind] = 0; else img[ind] -= bg[ind]; } printf("Writing output...\n"); cairoutils_write_jpeg(outfn, img, W, H); free(img); free(bg); printf("Done!\n"); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/blind-main.c��������������������������������������������������������������000644 �000765 �000024 �00000023331 12651445460 020036� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <ctype.h> #include <math.h> #include "fitsioutils.h" #include "boilerplate.h" #include "blind.h" #include "log.h" #include "tic.h" static int read_parameters(blind_t* bp); int main(int argc, char *argv[]) { blind_t my_bp; blind_t* bp = &my_bp; solver_t* sp = &(bp->solver); log_init(LOG_MSG); fits_use_error_system(); if (argc == 2 && strcmp(argv[1], "-s") == 0) { log_set_level(LOG_NONE); fprintf(stderr, "premptive silence\n"); } // Read input settings until "run" is encountered; repeat. for (;;) { tic(); blind_init(bp); // must be in this order because init_parameters handily zeros out sp solver_set_default_values(sp); if (read_parameters(bp)) { solver_cleanup(sp); blind_cleanup(bp); break; } if (!blind_parameters_are_sane(bp, sp)) { exit(-1); } if (blind_is_run_obsolete(bp, sp)) { goto clean; } blind_log_run_parameters(bp); blind_run(bp); toc(); if (bp->hit_total_timelimit) break; if (bp->hit_total_cpulimit) break; clean: solver_cleanup(sp); blind_cleanup(bp); } return 0; } static int read_parameters(blind_t* bp) { solver_t* sp = &(bp->solver); for (;;) { char buffer[10240]; char* nextword; char* line; if (!fgets(buffer, sizeof(buffer), stdin)) { return -1; } line = buffer; // strip off newline if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; // skip leading whitespace: while (*line && isspace(*line)) line++; logverb("Command: %s\n", line); if (line[0] == '#') { //logmsg("Skipping comment.\n"); continue; } // skip blank lines. if (line[0] == '\0') { continue; } if (is_word(line, "help", &nextword)) { logmsg("No help soup for you!\n (use the source, Luke)\n"); } else if (is_word(line, "logtostderr", &nextword)) { log_to(stderr); } else if (is_word(line, "verbose", &nextword)) { log_init(LOG_VERB); } else if (is_word(line, "verify ", &nextword)) { sl_append(bp->verify_wcsfiles, nextword); } else if (is_word(line, "verify_wcs ", &nextword)) { sip_t wcs; int nread; memset(&wcs, 0, sizeof(wcs)); if (sscanf(nextword, "%lg %lg %lg %lg %lg %lg %lg %lg%n", &(wcs.wcstan.crval[0]), &(wcs.wcstan.crval[1]), &(wcs.wcstan.crpix[0]), &(wcs.wcstan.crpix[1]), &(wcs.wcstan.cd[0][0]), &(wcs.wcstan.cd[0][1]), &(wcs.wcstan.cd[1][0]), &(wcs.wcstan.cd[1][1]), &nread) < 8) { logerr("Failed to parse verify_wcs entry.\n"); continue; } nextword += nread; if (sscanf(nextword, " %i %i%n", &(wcs.a_order), &(wcs.ap_order), &nread) >= 2) { int m, n; wcs.b_order = wcs.a_order; wcs.bp_order = wcs.ap_order; nextword += nread; for (m=0; m<=wcs.a_order; m++) { for (n=0; (m+n)<=wcs.a_order; n++) { if (sscanf(nextword, " %lg %lg%n", &(wcs.a[m][n]), &(wcs.b[m][n]), &nread) < 2) { logerr("Failed to parse SIP terms: \"%s\"\n", nextword); continue; } nextword += nread; } } for (m=0; m<=wcs.ap_order; m++) { for (n=0; (m+n)<=wcs.ap_order; n++) { if (sscanf(nextword, " %lg %lg%n", &(wcs.ap[m][n]), &(wcs.bp[m][n]), &nread) < 2) { logerr("Failed to parse SIP terms: \"%s\"\n", nextword); continue; } nextword += nread; } } } blind_add_verify_wcs(bp, &wcs); } else if (is_word(line, "cpulimit ", &nextword)) { bp->cpulimit = atof(nextword); } else if (is_word(line, "timelimit ", &nextword)) { bp->timelimit = atoi(nextword); } else if (is_word(line, "total_timelimit ", &nextword)) { bp->total_timelimit = atof(nextword); } else if (is_word(line, "total_cpulimit ", &nextword)) { bp->total_cpulimit = atof(nextword); } else if (is_word(line, "verify_pix ", &nextword)) { sp->verify_pix = atof(nextword); } else if (is_word(line, "nsolves ", &nextword)) { bp->nsolves = atoi(nextword); } else if (is_word(line, "ratio_tosolve ", &nextword)) { bp->logratio_tosolve = log(atof(nextword)); } else if (is_word(line, "ratio_tokeep ", &nextword)) { sp->logratio_tokeep = log(atof(nextword)); } else if (is_word(line, "ratio_toprint ", &nextword)) { sp->logratio_toprint = log(atof(nextword)); } else if (is_word(line, "ratio_tobail ", &nextword)) { sp->logratio_bail_threshold = log(atof(nextword)); } else if (is_word(line, "match ", &nextword)) { blind_set_match_file(bp, nextword); } else if (is_word(line, "indexrdls ", &nextword)) { blind_set_rdls_file(bp, nextword); } else if (is_word(line, "correspondences ", &nextword)) { free(bp->corr_fname); bp->corr_fname = strdup(nextword); } else if (is_word(line, "best_only", &nextword)) { bp->best_hit_only = TRUE; } else if (is_word(line, "solved ", &nextword)) { blind_set_solved_file(bp, nextword); } else if (is_word(line, "solved_in ", &nextword)) { blind_set_solvedin_file(bp, nextword); } else if (is_word(line, "solved_out ", &nextword)) { blind_set_solvedout_file(bp, nextword); } else if (is_word(line, "cancel ", &nextword)) { blind_set_cancel_file(bp, nextword); } else if (is_word(line, "solvedserver ", &nextword)) { free(bp->solvedserver); bp->solvedserver = strdup(nextword); } else if (is_word(line, "tweak_skipshift", &nextword)) { // deprecated } else if (is_word(line, "tweak_aborder ", &nextword)) { sp->tweak_aborder = atoi(nextword); } else if (is_word(line, "tweak_abporder ", &nextword)) { sp->tweak_abporder = atoi(nextword); } else if (is_word(line, "tweak", &nextword)) { sp->do_tweak = TRUE; } else if (is_word(line, "wcs ", &nextword)) { blind_set_wcs_file(bp, nextword); } else if (is_word(line, "fieldid_key ", &nextword)) { free(bp->fieldid_key); bp->fieldid_key = strdup(nextword); } else if (is_word(line, "maxquads ", &nextword)) { sp->maxquads = atoi(nextword); } else if (is_word(line, "maxmatches ", &nextword)) { sp->maxmatches = atoi(nextword); } else if (is_word(line, "xcol ", &nextword)) { blind_set_xcol(bp, nextword); } else if (is_word(line, "ycol ", &nextword)) { blind_set_ycol(bp, nextword); } else if (is_word(line, "index ", &nextword)) { blind_add_index(bp, nextword); } else if (is_word(line, "indexes_inparallel", &nextword)) { bp->indexes_inparallel = TRUE; } else if (is_word(line, "field ", &nextword)) { blind_set_field_file(bp, nextword); } else if (is_word(line, "fieldw ", &nextword)) { sp->field_maxx = atof(nextword); } else if (is_word(line, "fieldh ", &nextword)) { sp->field_maxy = atof(nextword); } else if (is_word(line, "distractors ", &nextword)) { sp->distractor_ratio = atof(nextword); } else if (is_word(line, "fieldid ", &nextword)) { bp->fieldid = atoi(nextword); } else if (is_word(line, "sdepth ", &nextword)) { sp->startobj = atoi(nextword); } else if (is_word(line, "depth ", &nextword)) { sp->endobj = atoi(nextword); } else if (is_word(line, "tol ", &nextword)) { sp->codetol = atof(nextword); } else if (is_word(line, "parity ", &nextword)) { sp->parity = atoi(nextword); } else if (is_word(line, "quadsize_min ", &nextword)) { sp->quadsize_min = atof(nextword); } else if (is_word(line, "fieldunits_lower ", &nextword)) { sp->funits_lower = atof(nextword); } else if (is_word(line, "fieldunits_upper ", &nextword)) { sp->funits_upper = atof(nextword); } else if (is_word(line, "firstfield ", &nextword)) { bp->firstfield = atoi(nextword); } else if (is_word(line, "lastfield ", &nextword)) { bp->lastfield = atoi(nextword); } else if (is_word(line, "fields ", &nextword)) { char* str = nextword; while (str && *str) { unsigned int lo, hi; int nread; if (sscanf(str, "%u%*1[-/]%u", &lo, &hi) == 2) { sscanf(str, "%*u%*1[-/]%*u%n", &nread); } else if (sscanf(str, "%u", &lo) == 1) { sscanf(str, "%*u%n", &nread); hi = lo; } else { fprintf(stderr, "Failed to parse fields fragment: \"%s\"\n", str); return -1; } if (lo < 1) { fprintf(stderr, "Field number %i is invalid: must be >= 1.\n", lo); return -1; } if (lo > hi) { fprintf(stderr, "Field range %i to %i is invalid: max must be >= min!\n", lo, hi); return -1; } blind_add_field_range(bp, lo, hi); str += nread; while ((*str == ',') || isspace(*str)) str++; } } else if (is_word(line, "run", &nextword)) { return 0; } else if (is_word(line, "quit", &nextword)) { return 1; } else if (is_word(line, "nverify ", &nextword)) { logmsg("DEPRECATED: \"nverify\" command.\n"); } else if (is_word(line, "nindex_tosolve ", &nextword)) { logmsg("DEPRECATED: \"nindex_tosolve\" command.\n"); } else if (is_word(line, "nindex_tokeep ", &nextword)) { logmsg("DEPRECATED: \"nindex_tokeep\" command.\n"); } else { logmsg("I didn't understand this command:\n \"%s\"\n", line); } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/blind.c�������������������������������������������������������������������000644 �000765 �000024 �00000140152 12651445460 017115� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** * Solve fields blindly * * Inputs: .ckdt .quad .skdt * Output: .match .rdls .wcs, ... */ #include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> #include <libgen.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "blind.h" #include "tweak.h" #include "tweak2.h" #include "sip_qfits.h" #include "starutil.h" #include "mathutil.h" #include "quadfile.h" #include "solvedclient.h" #include "solvedfile.h" #include "starkd.h" #include "codekd.h" #include "boilerplate.h" #include "fitsioutils.h" #include "verify.h" #include "index.h" #include "log.h" #include "tic.h" #include "anqfits.h" #include "errors.h" #include "scamp-catalog.h" #include "permutedsort.h" #include "bl-sort.h" static anbool record_match_callback(MatchObj* mo, void* userdata); static time_t timer_callback(void* user_data); static void add_blind_params(blind_t* bp, qfits_header* hdr); static void get_fields_from_solvedserver(blind_t* bp, solver_t* sp); static void load_and_parse_wcsfiles(blind_t* bp); static void solve_fields(blind_t* bp, sip_t* verify_wcs); static void remove_invalid_fields(il* fieldlist, int maxfield); static anbool is_field_solved(blind_t* bp, int fieldnum); static int write_solutions(blind_t* bp); static void solved_field(blind_t* bp, int fieldnum); static int compare_matchobjs(const void* v1, const void* v2); static void remove_duplicate_solutions(blind_t* bp); // A tag-along column for index rdls / correspondence file. struct tagalong { tfits_type type; int arraysize; char* name; char* units; void* data; // size in bytes of one item. int itemsize; int Ndata; // assigned by rdlist_add_tagalong_column int colnum; }; typedef struct tagalong tagalong_t; static anbool grab_tagalong_data(startree_t* starkd, MatchObj* mo, blind_t* bp, const int* starinds, int N) { fitstable_t* tagalong; int i; tagalong = startree_get_tagalong(starkd); if (!tagalong) { ERROR("Failed to find tag-along table in index"); return FALSE; } if (!mo->tagalong) mo->tagalong = bl_new(16, sizeof(tagalong_t)); if (bp->rdls_tagalong_all) { // && ! bp->done_rdls_tagalong_all char* cols; // retrieve all column names. bp->rdls_tagalong = fitstable_get_fits_column_names(tagalong, bp->rdls_tagalong); cols = sl_join(bp->rdls_tagalong, ", "); logverb("Found tag-along columns: %s\n", cols); free(cols); // sl_remove_duplicates(bp->rdls_tagalong); cols = sl_join(bp->rdls_tagalong, ", "); logverb("After removing duplicates: %s\n", cols); free(cols); } for (i=0; i<sl_size(bp->rdls_tagalong); i++) { const char* col = sl_get(bp->rdls_tagalong, i); tagalong_t tag; if (fitstable_find_fits_column(tagalong, col, &(tag.units), &(tag.type), &(tag.arraysize))) { ERROR("Failed to find column \"%s\" in index", col); continue; } tag.data = fitstable_read_column_array_inds(tagalong, col, tag.type, starinds, N, NULL); if (!tag.data) { ERROR("Failed to read data for column \"%s\" in index", col); continue; } tag.name = strdup(col); tag.units = strdup(tag.units); tag.itemsize = fits_get_atom_size(tag.type) * tag.arraysize; tag.Ndata = N; bl_append(mo->tagalong, &tag); } return TRUE; } static anbool grab_field_tagalong_data(MatchObj* mo, xylist_t* xy, int N) { fitstable_t* tagalong; int i; sl* lst; if (!mo->field_tagalong) mo->field_tagalong = bl_new(16, sizeof(tagalong_t)); tagalong = xy->table; lst = xylist_get_tagalong_column_names(xy, NULL); { char* txt = sl_join(lst, " "); logverb("Found tag-along columns from field: %s\n", txt); free(txt); } for (i=0; i<sl_size(lst); i++) { const char* col = sl_get(lst, i); tagalong_t tag; if (fitstable_find_fits_column(tagalong, col, &(tag.units), &(tag.type), &(tag.arraysize))) { ERROR("Failed to find column \"%s\" in index", col); continue; } tag.data = fitstable_read_column_array(tagalong, col, tag.type); if (!tag.data) { ERROR("Failed to read data for column \"%s\" in index", col); continue; } tag.name = strdup(col); tag.units = strdup(tag.units); tag.itemsize = fits_get_atom_size(tag.type) * tag.arraysize; tag.Ndata = N; bl_append(mo->field_tagalong, &tag); } sl_free2(lst); return TRUE; } /** Index handling for in_parallel and not. Currently it supposedly could handle both "indexnames" and "indexes", but we should probably just assert that only one of these can be used. **/ static index_t* get_index(blind_t* bp, size_t i) { if (i < sl_size(bp->indexnames)) { char* fn = sl_get(bp->indexnames, i); index_t* ind = index_load(fn, bp->index_options, NULL); if (!ind) { ERROR("Failed to load index %s", fn); exit( -1); } return ind; } i -= sl_size(bp->indexnames); return pl_get(bp->indexes, i); } static char* get_index_name(blind_t* bp, size_t i) { index_t* index; if (i < sl_size(bp->indexnames)) { char* fn = sl_get(bp->indexnames, i); return fn; } i -= sl_size(bp->indexnames); index = pl_get(bp->indexes, i); return index->indexname; } static void done_with_index(blind_t* bp, size_t i, index_t* ind) { if (i < sl_size(bp->indexnames)) { index_close(ind); } } static size_t n_indexes(blind_t* bp) { return sl_size(bp->indexnames) + pl_size(bp->indexes); } void blind_clear_verify_wcses(blind_t* bp) { bl_remove_all(bp->verify_wcs_list); } void blind_clear_solutions(blind_t* bp) { bl_remove_all(bp->solutions); } void blind_clear_indexes(blind_t* bp) { sl_remove_all(bp->indexnames); pl_remove_all(bp->indexes); } void blind_set_field_file(blind_t* bp, const char* fn) { free(bp->fieldfname); bp->fieldfname = strdup_safe(fn); } void blind_set_solved_file(blind_t* bp, const char* fn) { blind_set_solvedin_file (bp, fn); blind_set_solvedout_file(bp, fn); } void blind_set_solvedin_file(blind_t* bp, const char* fn) { free(bp->solved_in); bp->solved_in = strdup_safe(fn); } void blind_set_solvedout_file(blind_t* bp, const char* fn) { free(bp->solved_out); bp->solved_out = strdup_safe(fn); } void blind_set_cancel_file(blind_t* bp, const char* fn) { free(bp->cancelfname); bp->cancelfname = strdup_safe(fn); } void blind_set_match_file(blind_t* bp, const char* fn) { free(bp->matchfname); bp->matchfname = strdup_safe(fn); } void blind_set_rdls_file(blind_t* bp, const char* fn) { free(bp->indexrdlsfname); bp->indexrdlsfname = strdup_safe(fn); } void blind_set_scamp_file(blind_t* bp, const char* fn) { free(bp->scamp_fname); bp->scamp_fname = strdup_safe(fn); } void blind_set_corr_file(blind_t* bp, const char* fn) { free(bp->corr_fname); bp->corr_fname = strdup_safe(fn); } void blind_set_wcs_file(blind_t* bp, const char* fn) { free(bp->wcs_template); bp->wcs_template = strdup_safe(fn); } void blind_set_xcol(blind_t* bp, const char* x) { free(bp->xcolname); if (!x) x = "X"; bp->xcolname = strdup(x); } void blind_set_ycol(blind_t* bp, const char* y) { free(bp->ycolname); if (!y) y = "Y"; bp->ycolname = strdup_safe(y); } void blind_add_index(blind_t* bp, const char* index) { sl_append(bp->indexnames, index); } void blind_add_loaded_index(blind_t* bp, index_t* ind) { pl_append(bp->indexes, ind); } void blind_add_verify_wcs(blind_t* bp, sip_t* wcs) { bl_append(bp->verify_wcs_list, wcs); } void blind_add_field(blind_t* bp, int field) { il_insert_unique_ascending(bp->fieldlist, field); } void blind_add_field_range(blind_t* bp, int lo, int hi) { int i; for (i=lo; i<=hi; i++) { il_insert_unique_ascending(bp->fieldlist, i); } } static void check_time_limits(blind_t* bp) { if (bp->total_timelimit || bp->timelimit) { double now = timenow(); if (bp->total_timelimit && (now - bp->time_total_start > bp->total_timelimit)) { logmsg("Total wall-clock time limit reached!\n"); bp->hit_total_timelimit = TRUE; } if (bp->timelimit && (now - bp->time_start > bp->timelimit)) { logmsg("Wall-clock time limit reached!\n"); bp->hit_timelimit = TRUE; } } if (bp->total_cpulimit || bp->cpulimit) { float now = get_cpu_usage(); if ((bp->total_cpulimit > 0.0) && (now - bp->cpu_total_start > bp->total_cpulimit)) { logmsg("Total CPU time limit reached!\n"); bp->hit_total_cpulimit = TRUE; } if ((bp->cpulimit > 0.0) && (now - bp->cpu_start > bp->cpulimit)) { logmsg("CPU time limit reached!\n"); bp->hit_cpulimit = TRUE; } } if (bp->hit_total_timelimit || bp->hit_total_cpulimit || bp->hit_timelimit || bp->hit_cpulimit) bp->solver.quit_now = TRUE; } void blind_run(blind_t* bp) { solver_t* sp = &(bp->solver); size_t i, I; size_t Nindexes; // Record current time for total wall-clock time limit. bp->time_total_start = timenow(); // Record current CPU usage for total cpu-usage limit. bp->cpu_total_start = get_cpu_usage(); get_fields_from_solvedserver(bp, sp); // Parse WCS files submitted for verification. load_and_parse_wcsfiles(bp); // Read .xyls file... logverb("Reading fields file %s...", bp->fieldfname); bp->xyls = xylist_open(bp->fieldfname); if (!bp->xyls) { ERROR("Failed to read xylist.\n"); exit( -1); } xylist_set_xname(bp->xyls, bp->xcolname); xylist_set_yname(bp->xyls, bp->ycolname); xylist_set_include_flux(bp->xyls, FALSE); xylist_set_include_background(bp->xyls, FALSE); logverb("found %u fields.\n", xylist_n_fields(bp->xyls)); remove_invalid_fields(bp->fieldlist, xylist_n_fields(bp->xyls)); Nindexes = n_indexes(bp); // Verify any WCS estimates we have. if (bl_size(bp->verify_wcs_list)) { int i; int w; // We want to get the best logodds out of all the indices, so we set the // logodds-to-solve impossibly high so that a "good enough" solution doesn't // stop us from continuing to search... double oldodds = bp->logratio_tosolve; bp->logratio_tosolve = HUGE_VAL; for (w = 0; w < bl_size(bp->verify_wcs_list); w++) { double pixscale; double quadlo, quadhi; sip_t* wcs = bl_access(bp->verify_wcs_list, w); // We don't want to try to verify a wide-field image using a narrow- // field index, because it will contain a TON of index stars in the // field. We therefore only try to verify using indices that contain // quads that could have been found in the image. if (wcs->wcstan.imagew == 0.0 && sp->field_maxx > 0.0) wcs->wcstan.imagew = sp->field_maxx; if (wcs->wcstan.imageh == 0.0 && sp->field_maxy > 0.0) wcs->wcstan.imageh = sp->field_maxy; if ((wcs->wcstan.imagew == 0) || (wcs->wcstan.imageh == 0)) { logmsg("Verifying WCS: image width or height is zero / unknown.\n"); continue; } pixscale = sip_pixel_scale(wcs); quadlo = bp->quad_size_fraction_lo * MIN(wcs->wcstan.imagew, wcs->wcstan.imageh) * pixscale; quadhi = bp->quad_size_fraction_hi * MAX(wcs->wcstan.imagew, wcs->wcstan.imageh) * pixscale; logmsg("Verifying WCS using indices with quads of size [%g, %g] arcmin\n", arcsec2arcmin(quadlo), arcsec2arcmin(quadhi)); for (I=0; I<Nindexes; I++) { index_t* index = get_index(bp, I); if (!index_overlaps_scale_range(index, quadlo, quadhi)) { done_with_index(bp, I, index); continue; } solver_add_index(sp, index); sp->index = index; logmsg("Verifying WCS with index %zu of %zu (%s)\n", I + 1, Nindexes, index->indexname); // Do it! solve_fields(bp, wcs); // Clean up this index... done_with_index(bp, I, index); solver_clear_indexes(sp); } } bp->logratio_tosolve = oldodds; logmsg("Got %zu solutions.\n", bl_size(bp->solutions)); if (bp->best_hit_only) remove_duplicate_solutions(bp); for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo = bl_access(bp->solutions, i); if (mo->logodds >= bp->logratio_tosolve) solved_field(bp, mo->fieldnum); } } if (bp->single_field_solved) goto cleanup; // Start solving... if (bp->indexes_inparallel) { // Add all the indexes... for (I=0; I<Nindexes; I++) { index_t* index = get_index(bp, I); solver_add_index(sp, index); } // Record current CPU usage. bp->cpu_start = get_cpu_usage(); // Record current wall-clock time. bp->time_start = time(NULL); // Do it! solve_fields(bp, NULL); // Clean up the indices... for (I=0; I<Nindexes; I++) { index_t* index = get_index(bp, I); done_with_index(bp, I, index); } solver_clear_indexes(sp); } else { for (I=0; I<Nindexes; I++) { index_t* index; if (bp->hit_total_timelimit || bp->hit_total_cpulimit) break; if (bp->single_field_solved) break; if (bp->cancelled) break; // Load the index... index = get_index(bp, I); solver_add_index(sp, index); logverb("Trying index %s...\n", index->indexname); // Record current CPU usage. bp->cpu_start = get_cpu_usage(); // Record current wall-clock time. bp->time_start = time(NULL); // Do it! solve_fields(bp, NULL); // Clean up this index... done_with_index(bp, I, index); solver_clear_indexes(sp); } } cleanup: // Clean up. xylist_close(bp->xyls); if (bp->solvedserver) solvedclient_set_server(NULL); if (write_solutions(bp)) exit(-1); for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo = bl_access(bp->solutions, i); verify_free_matchobj(mo); blind_free_matchobj(mo); } bl_remove_all(bp->solutions); } void blind_init(blind_t* bp) { // Reset params. memset(bp, 0, sizeof(blind_t)); bp->fieldlist = il_new(256); bp->solutions = bl_new(16, sizeof(MatchObj)); bp->indexnames = sl_new(16); bp->indexes = pl_new(16); bp->verify_wcs_list = bl_new(1, sizeof(sip_t)); bp->verify_wcsfiles = sl_new(1); bp->fieldid_key = strdup("FIELDID"); blind_set_xcol(bp, NULL); blind_set_ycol(bp, NULL); bp->firstfield = -1; bp->lastfield = -1; bp->quad_size_fraction_lo = DEFAULT_QSF_LO; bp->quad_size_fraction_hi = DEFAULT_QSF_HI; bp->nsolves = 1; bp->xyls_tagalong_all = TRUE; // don't set sp-> here because solver_set_default_values() // will get called next and wipe it out... } int blind_parameters_are_sane(blind_t* bp, solver_t* sp) { if (sp->distractor_ratio == 0) { logerr("You must set a \"distractors\" proportion.\n"); return 0; } if (!(sl_size(bp->indexnames) || (bp->indexes_inparallel && pl_size(bp->indexes)))) { logerr("You must specify one or more indexes.\n"); return 0; } if (!bp->fieldfname) { logerr("You must specify a field filename (xylist).\n"); return 0; } if (sp->codetol < 0.0) { logerr("You must specify codetol > 0\n"); return 0; } if (sp->verify_pix <= 0.0) { logerr("You must specify a positive verify_pix.\n"); return 0; } if ((sp->funits_lower != 0.0) && (sp->funits_upper != 0.0) && (sp->funits_lower > sp->funits_upper)) { logerr("fieldunits_lower MUST be less than fieldunits_upper.\n"); logerr("\n(in other words, the lower-bound of scale estimate must " "be less than the upper-bound!)\n\n"); return 0; } return 1; } int blind_is_run_obsolete(blind_t* bp, solver_t* sp) { // If we're just solving one field, check to see if it's already // solved before doing a bunch of work and spewing tons of output. if ((il_size(bp->fieldlist) == 1) && bp->solved_in) { if (is_field_solved(bp, il_get(bp->fieldlist, 0))) return 1; } // Early check to see if this job was cancelled. if (bp->cancelfname) { if (file_exists(bp->cancelfname)) { logerr("Run cancelled.\n"); return 1; } } return 0; } static void get_fields_from_solvedserver(blind_t* bp, solver_t* sp) { if (!bp->solvedserver) return; if (solvedclient_set_server(bp->solvedserver)) { logerr("Error setting solvedserver.\n"); exit( -1); } if ((il_size(bp->fieldlist) == 0) && (bp->firstfield != -1) && (bp->lastfield != -1)) { int j; il_free(bp->fieldlist); logmsg("Contacting solvedserver to get field list...\n"); bp->fieldlist = solvedclient_get_fields(bp->fieldid, bp->firstfield, bp->lastfield, 0); if (!bp->fieldlist) { logerr("Failed to get field list from solvedserver.\n"); exit( -1); } logmsg("Got %zu fields from solvedserver: ", il_size(bp->fieldlist)); for (j = 0; j < il_size(bp->fieldlist); j++) { logmsg("%i ", il_get(bp->fieldlist, j)); } logmsg("\n"); } } static void load_and_parse_wcsfiles(blind_t* bp) { int i; for (i = 0; i < sl_size(bp->verify_wcsfiles); i++) { sip_t wcs; char* fn = sl_get(bp->verify_wcsfiles, i); logmsg("Reading WCS header to verify from file %s\n", fn); memset(&wcs, 0, sizeof(sip_t)); if (!sip_read_header_file(fn, &wcs)) { logerr("Failed to parse WCS header from file %s\n", fn); continue; } bl_append(bp->verify_wcs_list, &wcs); } } void blind_log_run_parameters(blind_t* bp) { solver_t* sp = &(bp->solver); int i, N; logverb("blind solver run parameters:\n"); logverb("indexes:\n"); N = n_indexes(bp); for (i=0; i<N; i++) logverb(" %s\n", get_index_name(bp, i)); if (bp->fieldfname) logverb("fieldfname %s\n", bp->fieldfname); logverb("fields "); for (i = 0; i < il_size(bp->fieldlist); i++) logverb("%i ", il_get(bp->fieldlist, i)); logverb("\n"); for (i = 0; i < sl_size(bp->verify_wcsfiles); i++) logverb("verify %s\n", sl_get(bp->verify_wcsfiles, i)); logverb("fieldid %i\n", bp->fieldid); if (bp->matchfname) logverb("matchfname %s\n", bp->matchfname); if (bp->solved_in) logverb("solved_in %s\n", bp->solved_in); if (bp->solved_out) logverb("solved_out %s\n", bp->solved_out); if (bp->solvedserver) logverb("solvedserver %s\n", bp->solvedserver); if (bp->cancelfname) logverb("cancel %s\n", bp->cancelfname); if (bp->wcs_template) logverb("wcs %s\n", bp->wcs_template); if (bp->fieldid_key) logverb("fieldid_key %s\n", bp->fieldid_key); if (bp->indexrdlsfname) logverb("indexrdlsfname %s\n", bp->indexrdlsfname); logverb("parity %i\n", sp->parity); logverb("codetol %g\n", sp->codetol); logverb("startdepth %i\n", sp->startobj); logverb("enddepth %i\n", sp->endobj); logverb("fieldunits_lower %g\n", sp->funits_lower); logverb("fieldunits_upper %g\n", sp->funits_upper); logverb("verify_pix %g\n", sp->verify_pix); if (bp->xcolname) logverb("xcolname %s\n", bp->xcolname); if (bp->ycolname) logverb("ycolname %s\n", bp->ycolname); logverb("maxquads %i\n", sp->maxquads); logverb("maxmatches %i\n", sp->maxmatches); logverb("cpulimit %f\n", bp->cpulimit); logverb("timelimit %i\n", bp->timelimit); logverb("total_timelimit %g\n", bp->total_timelimit); logverb("total_cpulimit %f\n", bp->total_cpulimit); } void blind_cleanup(blind_t* bp) { il_free(bp->fieldlist); bl_free(bp->solutions); sl_free2(bp->indexnames); pl_free(bp->indexes); sl_free2(bp->verify_wcsfiles); bl_free(bp->verify_wcs_list); sl_free2(bp->rdls_tagalong); free(bp->cancelfname); free(bp->fieldfname); free(bp->fieldid_key); free(bp->indexrdlsfname); free(bp->scamp_fname); free(bp->corr_fname); free(bp->matchfname); free(bp->solvedserver); free(bp->solved_in); free(bp->solved_out); free(bp->wcs_template); free(bp->xcolname); free(bp->ycolname); free(bp->sort_rdls); } static int sort_rdls(MatchObj* mymo, blind_t* bp) { const solver_t* sp = &(bp->solver); anbool asc = TRUE; char* colname = bp->sort_rdls; double* sortdata; fitstable_t* tagalong; int* perm; int i; logverb("Sorting RDLS by column \"%s\"\n", bp->sort_rdls); if (colname[0] == '-') { colname++; asc = FALSE; } tagalong = startree_get_tagalong(sp->index->starkd); if (!tagalong) { ERROR("Failed to find tag-along table in index"); return -1; } sortdata = fitstable_read_column_inds(tagalong, colname, fitscolumn_double_type(), mymo->refstarid, mymo->nindex); if (!sortdata) { ERROR("Failed to read data for column \"%s\" in index", colname); return -1; } perm = permutation_init(NULL, mymo->nindex); permuted_sort(sortdata, sizeof(double), asc ? compare_doubles_asc : compare_doubles_desc, perm, mymo->nindex); free(sortdata); if (mymo->refxyz) permutation_apply(perm, mymo->nindex, mymo->refxyz, mymo->refxyz, 3*sizeof(double)); // probably not set yet, but what the heck... if (mymo->refradec) permutation_apply(perm, mymo->nindex, mymo->refradec, mymo->refradec, 2*sizeof(double)); if (mymo->refxy) permutation_apply(perm, mymo->nindex, mymo->refxy, mymo->refxy, 2*sizeof(double)); if (mymo->refstarid) permutation_apply(perm, mymo->nindex, mymo->refstarid, mymo->refstarid, sizeof(int)); if (mymo->theta) for (i=0; i<mymo->nfield; i++) { if (mymo->theta[i] < 0) continue; mymo->theta[i] = perm[mymo->theta[i]]; } free(perm); return 0; } static anbool record_match_callback(MatchObj* mo, void* userdata) { blind_t* bp = userdata; solver_t* sp = &(bp->solver); MatchObj* mymo; int ind; check_time_limits(bp); // Copy "mo" to "mymo". ind = bl_insert_sorted(bp->solutions, mo, compare_matchobjs); mymo = bl_access(bp->solutions, ind); // steal these arrays from "mo" (prevent them from being free()'d // by the caller) mo->theta = NULL; mo->matchodds = NULL; mo->refxyz = NULL; mo->refxy = NULL; mo->refstarid = NULL; mo->testperm = NULL; // We have no guarantee that the index will still be open when it // comes time to write our output files, so we've got to grab everything // we need now while it's at hand. if (bp->indexrdlsfname || bp->scamp_fname || bp->corr_fname) { int i; // This must happen first, because it reorders the "ref" arrays, // and we want that to be done before more data are integrated. if (bp->sort_rdls) { if (sort_rdls(mymo, bp)) { ERROR("Failed to sort RDLS file by column \"%s\"", bp->sort_rdls); } } logdebug("Converting %i reference stars from xyz to radec\n", mymo->nindex); mymo->refradec = malloc(mymo->nindex * 2 * sizeof(double)); for (i=0; i<mymo->nindex; i++) { xyzarr2radecdegarr(mymo->refxyz+i*3, mymo->refradec+i*2); logdebug(" %i: radec %.2f,%.2f\n", i, mymo->refradec[i*2], mymo->refradec[i*2+1]); } mymo->fieldxy = malloc(mymo->nfield * 2 * sizeof(double)); // whew! memcpy(mymo->fieldxy, bp->solver.vf->xy, mymo->nfield * 2 * sizeof(double)); // Tweak was here... // FIXME -- add MAG, MAGERR, and positional errors for SCAMP catalog. if (bp->rdls_tagalong || bp->rdls_tagalong_all) grab_tagalong_data(sp->index->starkd, mymo, bp, mymo->refstarid, mymo->nindex); // FIXME -- we don't support specifying individual fields (yet) assert(bp->xyls_tagalong_all); assert(!bp->xyls_tagalong); if (bp->xyls_tagalong_all) grab_field_tagalong_data(mymo, bp->xyls, mymo->nfield); } if (mymo->logodds < bp->logratio_tosolve) return FALSE; // this match is considered a solution. bp->nsolves_sofar++; if (bp->nsolves_sofar < bp->nsolves) { logmsg("Found a quad that solves the image; that makes %i of %i required.\n", bp->nsolves_sofar, bp->nsolves); } else { if (bp->solver.index) { char* base = basename_safe(bp->solver.index->indexname); logmsg("Field %i: solved with index %s.\n", mymo->fieldnum, base); free(base); } else { logmsg("Field %i: solved with index %i", mymo->fieldnum, mymo->indexid); if (mymo->healpix >= 0) logmsg(", healpix %i\n", mymo->healpix); else logmsg("\n"); } return TRUE; } return FALSE; } static time_t timer_callback(void* user_data) { blind_t* bp = user_data; check_time_limits(bp); // check if the field has already been solved... if (is_field_solved(bp, bp->fieldnum)) return 0; if (bp->cancelfname && file_exists(bp->cancelfname)) { bp->cancelled = TRUE; logmsg("File \"%s\" exists: cancelling.\n", bp->cancelfname); return 0; } return 1; // wait 1 second... FIXME config? } static void add_blind_params(blind_t* bp, qfits_header* hdr) { solver_t* sp = &(bp->solver); int i; int Nindexes; fits_add_long_comment(hdr, "-- blind solver parameters: --"); if (sp->index) { fits_add_long_comment(hdr, "Index name: %s", sp->index->indexname?sp->index->indexname:"(null)"); fits_add_long_comment(hdr, "Index id: %i", sp->index->indexid); fits_add_long_comment(hdr, "Index healpix: %i", sp->index->healpix); fits_add_long_comment(hdr, "Index healpix nside: %i", sp->index->hpnside); fits_add_long_comment(hdr, "Index scale lower: %g arcsec", sp->index->index_scale_lower); fits_add_long_comment(hdr, "Index scale upper: %g arcsec", sp->index->index_scale_upper); fits_add_long_comment(hdr, "Index jitter: %g", sp->index->index_jitter); fits_add_long_comment(hdr, "Circle: %s", sp->index->circle ? "yes" : "no"); fits_add_long_comment(hdr, "Cxdx margin: %g", sp->cxdx_margin); } Nindexes = n_indexes(bp); for (i = 0; i < Nindexes; i++) fits_add_long_comment(hdr, "Index(%i): %s", i, get_index_name(bp, i)?get_index_name(bp, i):"(null)"); fits_add_long_comment(hdr, "Field name: %s", bp->fieldfname?bp->fieldfname:"(null)"); fits_add_long_comment(hdr, "Field scale lower: %g arcsec/pixel", sp->funits_lower); fits_add_long_comment(hdr, "Field scale upper: %g arcsec/pixel", sp->funits_upper); fits_add_long_comment(hdr, "X col name: %s", bp->xcolname?bp->xcolname:"(null)"); fits_add_long_comment(hdr, "Y col name: %s", bp->ycolname?bp->ycolname:"(null)"); fits_add_long_comment(hdr, "Start obj: %i", sp->startobj); fits_add_long_comment(hdr, "End obj: %i", sp->endobj); // 'Solved_in' and 'Solvedserver' are often NULL pointers. // If %s is a NULL pointer, vasprintf() causes a segmentation fault (due to strlen()) on Solaris -> added treatment of this case for portability. // GNU/Linux implementation of vasprintf() catches NULL pointer and prints "(null)" in header. Seems to be an issue on Solaris only. fits_add_long_comment(hdr, "Solved_in: %s", bp->solved_in?bp->solved_in:"(null)"); fits_add_long_comment(hdr, "Solved_out: %s", bp->solved_out?bp->solved_out:"(null)"); fits_add_long_comment(hdr, "Solvedserver: %s", bp->solvedserver?bp->solvedserver:"(null)"); fits_add_long_comment(hdr, "Parity: %i", sp->parity); fits_add_long_comment(hdr, "Codetol: %g", sp->codetol); fits_add_long_comment(hdr, "Verify pixels: %g pix", sp->verify_pix); fits_add_long_comment(hdr, "Maxquads: %i", sp->maxquads); fits_add_long_comment(hdr, "Maxmatches: %i", sp->maxmatches); fits_add_long_comment(hdr, "Cpu limit: %f s", bp->cpulimit); fits_add_long_comment(hdr, "Time limit: %i s", bp->timelimit); fits_add_long_comment(hdr, "Total time limit: %g s", bp->total_timelimit); fits_add_long_comment(hdr, "Total CPU limit: %f s", bp->total_cpulimit); fits_add_long_comment(hdr, "Tweak: %s", (sp->do_tweak ? "yes" : "no")); if (sp->do_tweak) { fits_add_long_comment(hdr, "Tweak AB order: %i", sp->tweak_aborder); fits_add_long_comment(hdr, "Tweak ABP order: %i", sp->tweak_abporder); } fits_add_long_comment(hdr, "--"); } static void remove_invalid_fields(il* fieldlist, int maxfield) { int i; for (i=0; i<il_size(fieldlist); i++) { int fieldnum = il_get(fieldlist, i); if (fieldnum >= 1 && fieldnum <= maxfield) continue; if (fieldnum > maxfield) { logerr("Field %i does not exist (max=%i).\n", fieldnum, maxfield); } if (fieldnum < 1) { logerr("Field %i is invalid (must be >= 1).\n", fieldnum); } il_remove(fieldlist, i); i--; } } static void solve_fields(blind_t* bp, sip_t* verify_wcs) { solver_t* sp = &(bp->solver); double last_utime, last_stime; double utime, stime; struct timeval wtime, last_wtime; int fi; get_resource_stats(&last_utime, &last_stime, NULL); gettimeofday(&last_wtime, NULL); for (fi = 0; fi < il_size(bp->fieldlist); fi++) { int fieldnum; MatchObj template ; qfits_header* fieldhdr = NULL; fieldnum = il_get(bp->fieldlist, fi); memset(&template, 0, sizeof(MatchObj)); template.fieldnum = fieldnum; template.fieldfile = bp->fieldid; // Get the FIELDID string from the xyls FITS header. if (xylist_open_field(bp->xyls, fieldnum)) { logerr("Failed to open extension %i in xylist.\n", fieldnum); goto cleanup; } fieldhdr = xylist_get_header(bp->xyls); if (fieldhdr) { char* idstr = fits_get_dupstring(fieldhdr, bp->fieldid_key); if (idstr) strncpy(template.fieldname, idstr, sizeof(template.fieldname) - 1); free(idstr); } // Has the field already been solved? if (is_field_solved(bp, fieldnum)) goto cleanup; // Get the field. solver_set_field(sp, xylist_read_field(bp->xyls, NULL)); if (!sp->fieldxy) { logerr("Failed to read xylist field.\n"); goto cleanup; } sp->numtries = 0; sp->nummatches = 0; sp->numscaleok = 0; sp->num_cxdx_skipped = 0; sp->num_verified = 0; sp->quit_now = FALSE; sp->mo_template = &template ; sp->record_match_callback = record_match_callback; sp->timer_callback = timer_callback; sp->userdata = bp; solver_reset_best_match(sp); bp->fieldnum = fieldnum; bp->nsolves_sofar = 0; solver_preprocess_field(sp); if (verify_wcs) { //MatchObj mo; logmsg("Verifying WCS of field %i.\n", fieldnum); solver_verify_sip_wcs(sp, verify_wcs); //, &mo); logmsg(" --> log-odds %g\n", sp->best_logodds); } else { logverb("Solving field %i.\n", fieldnum); sp->distance_from_quad_bonus = TRUE; solver_log_params(sp); // The real thing solver_run(sp); logverb("Field %i: tried %i quads, matched %i codes.\n", fieldnum, sp->numtries, sp->nummatches); if (sp->maxquads && sp->numtries >= sp->maxquads) logmsg(" exceeded the number of quads to try: %i >= %i.\n", sp->numtries, sp->maxquads); if (sp->maxmatches && sp->nummatches >= sp->maxmatches) logmsg(" exceeded the number of quads to match: %i >= %i.\n", sp->nummatches, sp->maxmatches); if (bp->cancelled) logmsg(" cancelled at user request.\n"); } if (sp->best_match_solves) { solved_field(bp, fieldnum); } else if (!verify_wcs) { // Field unsolved. logerr("Field %i did not solve", fieldnum); if (bp->solver.index && bp->solver.index->indexname) { char* copy; char* base; copy = strdup(bp->solver.index->indexname); base = strdup(basename(copy)); free(copy); logerr(" (index %s", base); free(base); if (bp->solver.endobj) logerr(", field objects %i-%i", bp->solver.startobj+1, bp->solver.endobj); logerr(")"); } logerr(".\n"); if (sp->have_best_match) { logverb("Best match encountered: "); matchobj_print(&(sp->best_match), log_get_level()); } else { logverb("Best odds encountered: %g\n", exp(sp->best_logodds)); } } solver_free_field(sp); get_resource_stats(&utime, &stime, NULL); gettimeofday(&wtime, NULL); logverb("Spent %g s user, %g s system, %g s total, %g s wall time.\n", (utime - last_utime), (stime - last_stime), (stime - last_stime + utime - last_utime), millis_between(&last_wtime, &wtime) * 0.001); last_utime = utime; last_stime = stime; last_wtime = wtime; cleanup: solver_cleanup_field(sp); } } static anbool is_field_solved(blind_t* bp, int fieldnum) { anbool solved = FALSE; if (bp->solved_in) { solved = solvedfile_get(bp->solved_in, fieldnum); logverb("Checking %s file %i to see if the field is solved: %s.\n", bp->solved_in, fieldnum, (solved ? "yes" : "no")); } if (solved) { // file exists; field has already been solved. logmsg("Field %i: solvedfile %s: field has been solved.\n", fieldnum, bp->solved_in); return TRUE; } if (bp->solvedserver && (solvedclient_get(bp->fieldid, fieldnum) == 1)) { // field has already been solved. logmsg("Field %i: field has already been solved.\n", fieldnum); return TRUE; } return FALSE; } static void solved_field(blind_t* bp, int fieldnum) { // Record in solved file, or send to solved server. if (bp->solved_out) { logmsg("Field %i solved: writing to file %s to indicate this.\n", fieldnum, bp->solved_out); if (solvedfile_set(bp->solved_out, fieldnum)) { logerr("Failed to write solvedfile %s.\n", bp->solved_out); } } if (bp->solvedserver) { solvedclient_set(bp->fieldid, fieldnum); } // If we're just solving a single field, and we solved it... if (il_size(bp->fieldlist) == 1) bp->single_field_solved = TRUE; } void blind_matchobj_deep_copy(const MatchObj* mo, MatchObj* dest) { if (!mo || !dest) return; if (mo->sip) { dest->sip = sip_create(); memcpy(dest->sip, mo->sip, sizeof(sip_t)); } if (mo->refradec) { dest->refradec = malloc(mo->nindex * 2 * sizeof(double)); memcpy(dest->refradec, mo->refradec, mo->nindex * 2 * sizeof(double)); } if (mo->fieldxy) { dest->fieldxy = malloc(mo->nfield * 2 * sizeof(double)); memcpy(dest->fieldxy, mo->fieldxy, mo->nfield * 2 * sizeof(double)); } if (mo->tagalong) { int i; dest->tagalong = bl_new(16, sizeof(tagalong_t)); for (i=0; i<bl_size(mo->tagalong); i++) { tagalong_t* tag = bl_access(mo->tagalong, i); tagalong_t tagcopy; memcpy(&tagcopy, tag, sizeof(tagalong_t)); tagcopy.name = strdup_safe(tag->name); tagcopy.units = strdup_safe(tag->units); if (tag->data) { tagcopy.data = malloc(tag->Ndata * tag->itemsize); memcpy(tagcopy.data, tag->data, tag->Ndata * tag->itemsize); } bl_append(dest->tagalong, &tagcopy); } } // NOT SUPPORTED (yet) assert(!mo->field_tagalong); } // Free the things I added to the mo. void blind_free_matchobj(MatchObj* mo) { if (!mo) return; if (mo->sip) { sip_free(mo->sip); mo->sip = NULL; } free(mo->refradec); free(mo->fieldxy); mo->refradec = NULL; mo->fieldxy = NULL; if (mo->tagalong) { int i; for (i=0; i<bl_size(mo->tagalong); i++) { tagalong_t* tag = bl_access(mo->tagalong, i); free(tag->name); free(tag->units); free(tag->data); } bl_free(mo->tagalong); mo->tagalong = NULL; } if (mo->field_tagalong) { int i; for (i=0; i<bl_size(mo->field_tagalong); i++) { tagalong_t* tag = bl_access(mo->field_tagalong, i); free(tag->name); free(tag->units); free(tag->data); } bl_free(mo->field_tagalong); mo->field_tagalong = NULL; } } static void remove_duplicate_solutions(blind_t* bp) { int i, j; // The solutions can fall out of order because tweak2() updates their logodds. bl_sort(bp->solutions, compare_matchobjs); for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo = bl_access(bp->solutions, i); j = i+1; while (j < bl_size(bp->solutions)) { MatchObj* mo2 = bl_access(bp->solutions, j); if (mo->fieldfile != mo2->fieldfile) break; if (mo->fieldnum != mo2->fieldnum) break; assert(mo2->logodds <= mo->logodds); blind_free_matchobj(mo2); verify_free_matchobj(mo2); bl_remove_index(bp->solutions, j); } } } static int write_match_file(blind_t* bp) { int i; bp->mf = matchfile_open_for_writing(bp->matchfname); if (!bp->mf) { logerr("Failed to open file %s to write match file.\n", bp->matchfname); return -1; } BOILERPLATE_ADD_FITS_HEADERS(bp->mf->header); qfits_header_add(bp->mf->header, "HISTORY", "This file was created by the program \"blind\".", NULL, NULL); qfits_header_add(bp->mf->header, "DATE", qfits_get_datetime_iso8601(), "Date this file was created.", NULL); add_blind_params(bp, bp->mf->header); if (matchfile_write_headers(bp->mf)) { logerr("Failed to write matchfile header.\n"); return -1; } for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo = bl_access(bp->solutions, i); if (matchfile_write_match(bp->mf, mo)) { logerr("Field %i: error writing a match.\n", mo->fieldnum); return -1; } } if (matchfile_fix_headers(bp->mf) || matchfile_close(bp->mf)) { logerr("Error closing matchfile.\n"); return -1; } bp->mf = NULL; return 0; } static int write_rdls_file(blind_t* bp) { int i; qfits_header* h; bp->indexrdls = rdlist_open_for_writing(bp->indexrdlsfname); if (!bp->indexrdls) { logerr("Failed to open index RDLS file %s for writing.\n", bp->indexrdlsfname); return -1; } h = rdlist_get_primary_header(bp->indexrdls); BOILERPLATE_ADD_FITS_HEADERS(h); fits_add_long_history(h, "This \"indexrdls\" file was created by the program \"blind\"." " It contains the RA/DEC of index objects that were found inside a solved field."); qfits_header_add(h, "DATE", qfits_get_datetime_iso8601(), "Date this file was created.", NULL); add_blind_params(bp, h); if (rdlist_write_primary_header(bp->indexrdls)) { logerr("Failed to write index RDLS header.\n"); return -1; } for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo = bl_access(bp->solutions, i); rd_t rd; if (strlen(mo->fieldname)) { qfits_header* hdr = rdlist_get_header(bp->indexrdls); qfits_header_add(hdr, "FIELDID", mo->fieldname, "Name of this field", NULL); } if (mo->tagalong) { int j; for (j=0; j<bl_size(mo->tagalong); j++) { tagalong_t* tag = bl_access(mo->tagalong, j); tag->colnum = rdlist_add_tagalong_column(bp->indexrdls, tag->type, tag->arraysize, tag->type, tag->name, tag->units); } } if (rdlist_write_header(bp->indexrdls)) { logerr("Failed to write index RDLS field header.\n"); return -1; } assert(mo->refradec); rd_from_array(&rd, mo->refradec, mo->nindex); if (rdlist_write_field(bp->indexrdls, &rd)) { logerr("Failed to write index RDLS entry.\n"); return -1; } rd_free_data(&rd); if (mo->tagalong) { int j; for (j=0; j<bl_size(mo->tagalong); j++) { tagalong_t* tag = bl_access(mo->tagalong, j); if (rdlist_write_tagalong_column(bp->indexrdls, tag->colnum, 0, mo->nindex, tag->data, tag->itemsize)) { ERROR("Failed to write tag-along data column %s", tag->name); return -1; } } } if (rdlist_fix_header(bp->indexrdls)) { logerr("Failed to fix index RDLS field header.\n"); return -1; } rdlist_next_field(bp->indexrdls); } if (rdlist_fix_primary_header(bp->indexrdls) || rdlist_close(bp->indexrdls)) { logerr("Failed to close index RDLS file.\n"); return -1; } bp->indexrdls = NULL; return 0; } static int write_wcs_file(blind_t* bp) { int i; for (i=0; i<bl_size(bp->solutions); i++) { char wcs_fn[1024]; FILE* fout; qfits_header* hdr; char* tm; MatchObj* mo = bl_access(bp->solutions, i); snprintf(wcs_fn, sizeof(wcs_fn), bp->wcs_template, mo->fieldnum); fout = fopen(wcs_fn, "wb"); if (!fout) { logerr("Failed to open WCS output file %s: %s\n", wcs_fn, strerror(errno)); return -1; } assert(mo->wcs_valid); if (mo->sip) hdr = sip_create_header(mo->sip); else hdr = tan_create_header(&(mo->wcstan)); BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This WCS header was created by the program \"blind\".", NULL, NULL); tm = qfits_get_datetime_iso8601(); qfits_header_add(hdr, "DATE", tm, "Date this file was created.", NULL); add_blind_params(bp, hdr); fits_add_long_comment(hdr, "-- properties of the matching quad: --"); fits_add_long_comment(hdr, "index id: %i", mo->indexid); fits_add_long_comment(hdr, "index healpix: %i", mo->healpix); fits_add_long_comment(hdr, "index hpnside: %i", mo->hpnside); fits_add_long_comment(hdr, "log odds: %g", mo->logodds); fits_add_long_comment(hdr, "odds: %g", exp(mo->logodds)); fits_add_long_comment(hdr, "quadno: %i", mo->quadno); fits_add_long_comment(hdr, "stars: %i,%i,%i,%i", mo->star[0], mo->star[1], mo->star[2], mo->star[3]); fits_add_long_comment(hdr, "field: %i,%i,%i,%i", mo->field[0], mo->field[1], mo->field[2], mo->field[3]); fits_add_long_comment(hdr, "code error: %g", sqrt(mo->code_err)); fits_add_long_comment(hdr, "nmatch: %i", mo->nmatch); fits_add_long_comment(hdr, "nconflict: %i", mo->nconflict); fits_add_long_comment(hdr, "nfield: %i", mo->nfield); fits_add_long_comment(hdr, "nindex: %i", mo->nindex); fits_add_long_comment(hdr, "scale: %g arcsec/pix", mo->scale); fits_add_long_comment(hdr, "parity: %i", (int)mo->parity); fits_add_long_comment(hdr, "quads tried: %i", mo->quads_tried); fits_add_long_comment(hdr, "quads matched: %i", mo->quads_matched); fits_add_long_comment(hdr, "quads verified: %i", mo->nverified); fits_add_long_comment(hdr, "objs tried: %i", mo->objs_tried); fits_add_long_comment(hdr, "cpu time: %g", mo->timeused); fits_add_long_comment(hdr, "--"); if (strlen(mo->fieldname)) qfits_header_add(hdr, bp->fieldid_key, mo->fieldname, "Field name (copied from input field)", NULL); if (qfits_header_dump(hdr, fout)) { logerr("Failed to write FITS WCS header.\n"); return -1; } fits_pad_file(fout); qfits_header_destroy(hdr); fclose(fout); } return 0; } static int write_scamp_file(blind_t* bp) { int i; scamp_cat_t* scamp; qfits_header* hdr = NULL; MatchObj* mo; tan_t fakewcs; // HACK -- just hdr = NULL? hdr = qfits_header_default(); fits_header_add_int(hdr, "BITPIX", 0, NULL); fits_header_add_int(hdr, "NAXIS", 2, NULL); fits_header_add_int(hdr, "NAXIS1", 0, NULL); fits_header_add_int(hdr, "NAXIS2", 0, NULL); qfits_header_add(hdr, "EXTEND", "T", "", NULL); memset(&fakewcs, 0, sizeof(tan_t)); tan_add_to_header(hdr, &fakewcs); scamp = scamp_catalog_open_for_writing(bp->scamp_fname, TRUE); if (!scamp) { logerr("Failed to open SCAMP reference catalog for writing.\n"); return -1; } if (scamp_catalog_write_field_header(scamp, hdr)) { logerr("Failed to write SCAMP headers.\n"); return -1; } mo = bl_access(bp->solutions, 0); for (i=0; i<mo->nindex; i++) { scamp_ref_t ref; ref.ra = mo->refradec[2*i + 0]; ref.dec = mo->refradec[2*i + 1]; ref.err_a = ref.err_b = arcsec2deg(mo->index_jitter); // HACK ref.mag = 10.0; ref.err_mag = 0.1; if (scamp_catalog_write_reference(scamp, &ref)) { logerr("Failed to write SCAMP object.\n"); return -1; } } if (scamp_catalog_close(scamp)) { logerr("Failed to close SCAMP reference catalog.\n"); return -1; } return 0; } static int write_corr_file(blind_t* bp) { int i; fitstable_t* tab; tab = fitstable_open_for_writing(bp->corr_fname); if (!tab) { ERROR("Failed to open correspondences file \"%s\" for writing", bp->corr_fname); return -1; } // FIXME -- add header boilerplate. if (fitstable_write_primary_header(tab)) { ERROR("Failed to write primary header for corr file \"%s\"", bp->corr_fname); return -1; } for (i=0; i<bl_size(bp->solutions); i++) { MatchObj* mo; sip_t thesip; sip_t* wcs; int j; tfits_type dubl = fitscolumn_double_type(); tfits_type itype = fitscolumn_int_type(); mo = bl_access(bp->solutions, i); if (mo->sip) wcs = mo->sip; else { sip_wrap_tan(&mo->wcstan, &thesip); wcs = &thesip; } fitstable_add_write_column(tab, dubl, "field_x", "pixels"); fitstable_add_write_column(tab, dubl, "field_y", "pixels"); fitstable_add_write_column(tab, dubl, "field_ra", "degrees"); fitstable_add_write_column(tab, dubl, "field_dec", "degrees"); fitstable_add_write_column(tab, dubl, "index_x", "pixels"); fitstable_add_write_column(tab, dubl, "index_y", "pixels"); fitstable_add_write_column(tab, dubl, "index_ra", "degrees"); fitstable_add_write_column(tab, dubl, "index_dec", "degrees"); fitstable_add_write_column(tab, itype, "index_id", "none"); fitstable_add_write_column(tab, itype, "field_id", "none"); fitstable_add_write_column(tab, dubl, "match_weight", "none"); if (mo->tagalong) { for (j=0; j<bl_size(mo->tagalong); j++) { tagalong_t* tag = bl_access(mo->tagalong, j); fitstable_add_write_column_struct(tab, tag->type, tag->arraysize, 0, tag->type, tag->name, tag->units); tag->colnum = fitstable_ncols(tab)-1; } } // FIXME -- check for duplicate column names if (mo->field_tagalong) { int j; for (j=0; j<bl_size(mo->field_tagalong); j++) { tagalong_t* tag = bl_access(mo->field_tagalong, j); fitstable_add_write_column_struct(tab, tag->type, tag->arraysize, 0, tag->type, tag->name, tag->units); tag->colnum = fitstable_ncols(tab)-1; } } if (fitstable_write_header(tab)) { ERROR("Failed to write correspondence file header."); return -1; } { int rows = 0; for (j=0; j<mo->nfield; j++) { if (mo->theta[j] < 0) continue; rows++; } logverb("Writing %i rows (of %i field and %i index objects) to correspondence file.\n", rows, mo->nfield, mo->nindex); } for (j=0; j<mo->nfield; j++) { double fx,fy,fra,fdec; double rx,ry,rra,rdec; double weight; int ti, ri; ri = mo->theta[j]; if (ri < 0) continue; ti = j; rra = mo->refradec[2*ri+0]; rdec = mo->refradec[2*ri+1]; if (!sip_radec2pixelxy(wcs, rra, rdec, &rx, &ry)) continue; fx = mo->fieldxy[2*ti+0]; fy = mo->fieldxy[2*ti+1]; sip_pixelxy2radec(wcs, fx, fy, &fra, &fdec); logdebug("Writing field xy %.1f,%.1f, radec %.2f,%.2f; index xy %.1f,%.1f, radec %.2f,%.2f\n", fx, fy, fra, fdec, rx, ry, rra, rdec); weight = verify_logodds_to_weight(mo->matchodds[j]); if (fitstable_write_row(tab, &fx, &fy, &fra, &fdec, &rx, &ry, &rra, &rdec, &ri, &ti, &weight)) { ERROR("Failed to write coordinates to correspondences file \"%s\"", bp->corr_fname); return -1; } } if (mo->tagalong) { for (j=0; j<bl_size(mo->tagalong); j++) { tagalong_t* tag = bl_access(mo->tagalong, j); int row = 0; int k; // Ugh, we write each datum individually... for (k=0; k<mo->nfield; k++) { int ri = mo->theta[k]; if (ri < 0) continue; fitstable_write_one_column(tab, tag->colnum, row, 1, (char*)tag->data + ri*tag->itemsize, 0); row++; } } } if (mo->field_tagalong) { for (j=0; j<bl_size(mo->field_tagalong); j++) { tagalong_t* tag = bl_access(mo->field_tagalong, j); int row = 0; int k; // Ugh, we write each datum individually... for (k=0; k<mo->nfield; k++) { if (mo->theta[k] < 0) continue; fitstable_write_one_column(tab, tag->colnum, row, 1, (char*)tag->data + k*tag->itemsize, 0); row++; } } } if (fitstable_fix_header(tab)) { ERROR("Failed to fix correspondence file header."); return -1; } fitstable_next_extension(tab); fitstable_clear_table(tab); } if (fitstable_close(tab)) { ERROR("Failed to close correspondence file"); return -1; } return 0; } static int write_solutions(blind_t* bp) { anbool got_solutions = (bl_size(bp->solutions) > 0); // If we found no solution, don't write empty output files! if (!got_solutions) return 0; // The solutions can fall out of order because tweak2() updates their logodds. bl_sort(bp->solutions, compare_matchobjs); if (bp->matchfname) { if (write_match_file(bp)) return -1; } if (bp->indexrdlsfname) { if (write_rdls_file(bp)) return -1; } // We only want the best solution for each field in the following outputs: remove_duplicate_solutions(bp); if (bp->wcs_template) { if (write_wcs_file(bp)) return -1; } if (bp->scamp_fname) { if (write_scamp_file(bp)) return -1; } if (bp->corr_fname) { if (write_corr_file(bp)) return -1; } return 0; } static int compare_matchobjs(const void* v1, const void* v2) { int diff; float fdiff; const MatchObj* mo1 = v1; const MatchObj* mo2 = v2; diff = mo1->fieldfile - mo2->fieldfile; if (diff) return diff; diff = mo1->fieldnum - mo2->fieldnum; if (diff) return diff; fdiff = mo1->logodds - mo2->logodds; if (fdiff == 0.0) return 0; if (fdiff > 0.0) return -1; return 1; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/blind.i�������������������������������������������������������������������000644 �000765 �000024 �00000006004 12651445460 017120� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ %module(package="astrometry.blind") blind %include <typemaps.i> %include <cstring.i> %include <exception.i> %{ // numpy. #include <numpy/arrayobject.h> #include <stdint.h> #include <stdlib.h> #include "os-features.h" #include "verify.h" %} %init %{ // numpy import_array(); %} %import "../util/util.i" %include "verify.h" %inline %{ static PyObject* verify_star_lists_np(PyObject* pyrefxy, PyObject* pytestxy, PyObject* pytestsig2, double effective_area, double distractors, double logodds_bail, double logodds_accept) { PyObject *np_refxy, *np_testxy, *np_testsig2; PyArray_Descr* dtype = NULL; int req = NPY_C_CONTIGUOUS | NPY_ALIGNED | NPY_NOTSWAPPED | NPY_ELEMENTSTRIDES; double* refxy, *testxy, *testsig2; int NT, NR; int two; int n; double logodds; dtype = PyArray_DescrFromType(NPY_DOUBLE); Py_INCREF(dtype); np_refxy = PyArray_FromAny(pyrefxy, dtype, 2, 2, req, NULL); if (!np_refxy) { PyErr_SetString(PyExc_ValueError,"Expected refxy array to be double"); Py_DECREF(dtype); return NULL; } NR = PyArray_DIM(np_refxy, 0); two = PyArray_DIM(np_refxy, 1); if (two != 2) { PyErr_SetString(PyExc_ValueError,"Expected refxy array to be size 2xNR"); Py_DECREF(np_refxy); return NULL; } Py_INCREF(dtype); np_testxy = PyArray_FromAny(pytestxy, dtype, 2, 2, req, NULL); if (!np_testxy) { PyErr_SetString(PyExc_ValueError,"Expected testxy array to be double"); Py_DECREF(dtype); return NULL; } NT = PyArray_DIM(np_testxy, 0); two = PyArray_DIM(np_testxy, 1); if (two != 2) { PyErr_SetString(PyExc_ValueError,"Expected testxy array to be size 2xNR"); Py_DECREF(np_testxy); return NULL; } Py_INCREF(dtype); np_testsig2 = PyArray_FromAny(pytestsig2, dtype, 1, 1, req, NULL); if (!np_testsig2) { PyErr_SetString(PyExc_ValueError,"Expected testsig2 array to be double"); Py_DECREF(dtype); return NULL; } n = PyArray_DIM(np_testsig2, 0); if (n != NT) { PyErr_SetString(PyExc_ValueError,"Expected testsig2 array to be size NT"); Py_DECREF(np_testsig2); return NULL; } Py_CLEAR(dtype); refxy = PyArray_DATA(np_refxy); testxy = PyArray_DATA(np_testxy); testsig2 = PyArray_DATA(np_testsig2); logodds = verify_star_lists(refxy, NR, testxy, testsig2, NT, effective_area, distractors, logodds_bail, logodds_accept, NULL, NULL, NULL, NULL, NULL); Py_DECREF(np_refxy); Py_DECREF(np_testxy); Py_DECREF(np_testsig2); return PyFloat_FromDouble(logodds); } %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/blindutils.c��������������������������������������������������������������000644 �000765 �000024 �00000004172 12651445460 020177� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <libgen.h> #include <ctype.h> #include <unistd.h> #include <assert.h> #include <sys/stat.h> #include <sys/types.h> #include "blindutils.h" #include "ioutils.h" #include "bl.h" #include "errors.h" #include "log.h" int parse_depth_string(il* depths, const char* str) { unsigned int lasthi = 0; unsigned int lo, hi; while (str && *str) { int nread; char div[2]; lo = 0; hi = 0; // 10-20 if (sscanf(str, "%u-%u", &lo, &hi) == 2) { sscanf(str, "%*u-%*u%n", &nread); if (lo > hi) { logerr("Depth range %i to %i is invalid: max must be >= min!\n", lo, hi); return -1; } if (lo == 0) { logerr("Depth lower limit %i is invalid: depths must be >= 1.\n", lo); return -1; } // 30- } else if (sscanf(str, "%u%1[-]", &lo, div) == 2) { sscanf(str, "%*u%*1[-]%n", &nread); if (lo == 0) { logerr("Depth lower limit %i is invalid: depths must be >= 1.\n", lo); return -1; } // -100 } else if (sscanf(str, "-%u", &hi) == 1) { sscanf(str, "-%*u%n", &nread); if (hi == 0) { logerr("Depth upper limit %i is invalid: depths must be >= 1.\n", hi); return -1; } lo = 1; // 7 } else if (sscanf(str, "%u", &hi) == 1) { sscanf(str, "%*u%n", &nread); if (hi == 0) { logerr("Depth %i is invalid: depths must be >= 1.\n", hi); return -1; } lo = lasthi + 1; } else { logerr("Failed to parse depth range: \"%s\"\n", str); return -1; } il_append(depths, lo); il_append(depths, hi); lasthi = hi; str += nread; while ((*str == ',') || isspace((unsigned)(*str))) str++; } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/build-index-main.c��������������������������������������������������������000644 �000765 �000024 �00000017510 12651445460 021154� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <limits.h> #include <sys/time.h> #include <sys/resource.h> #include <assert.h> #include "build-index.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "starutil.h" const char* OPTIONS = "hvi:o:N:l:u:S:fU:H:s:m:n:r:d:p:R:L:EI:MTj:1:P:B:A:D:t:e:"; static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " (\n" " -i <input-FITS-catalog> input: source RA,DEC, etc\n" " -e <input-FITS-extension> input: FITS extension to read\n" " OR,\n" " -1 <input-index> to share another index's stars\n" " )\n" " -o <output-index> output filename for index\n" " (\n" " -P <scale-number>: use 'preset' values for '-N', '-l', and '-u'\n" " (the scale-number is the last two digits of the pre-cooked\n" " index filename -- eg, index-205 is \"-P 5\".\n" " -P 0 should be good for images about 6 arcmin in size\n" " and it goes in steps of sqrt(2), so:\n" " -P 2 should work for images about 12 arcmin across\n" " -P 4 should work for images about 24 arcmin across\n" " -P 6 should work for images about 1 degree across\n" " -P 8 should work for images about 2 degree across\n" " -P 10 should work for images about 4 degree across\n" " etc... up to -P 19\n" " OR,\n" " -N <nside> healpix Nside for quad-building\n" " -l <min-quad-size> minimum quad size (arcminutes)\n" " -u <max-quad-size> maximum quad size (arcminutes)\n" " )\n" " [-S <column>]: sort column (default: assume the input file is already sorted)\n" " [-f]: sort in descending order (eg, for FLUX); default ascending (eg, for MAG)\n" " [-A <column>]: specify the RA column name in the input FITS table (default \"RA\")\n" " [-D <column>]: specify the Dec column name in the input FITS table (default \"Dec\")\n" " [-B <val>]: cut any object whose sort-column value is less than 'val'; for mags this is a bright limit\n" " [-U]: healpix Nside for uniformization (default: same as -n)\n" " [-H <big healpix>]; default is all-sky\n" " [-s <big healpix Nside>]; default is 1\n" " [-m <margin>]: add a margin of <margin> healpixels; default 0\n" " [-n <sweeps>] (ie, number of stars per fine healpix grid cell); default 10\n" " [-r <dedup-radius>]: deduplication radius in arcseconds; default no deduplication\n" " [-j <jitter-arcsec>]: positional error of stars in the reference catalog (in arcsec; default 1)\n" "\n" " [-d <dimquads>] number of stars in a \"quad\" (default 4).\n" " [-p <passes>] number of rounds of quad-building (ie, # quads per healpix cell, default 16)\n" " [-R <reuse-times>] number of times a star can be used (default: 8)\n" " [-L <max-reuses>] make extra passes through the healpixes, increasing the \"-r\" reuse\n" " limit each time, up to \"max-reuses\".\n" " [-E]: scan through the catalog, checking which healpixes are occupied.\n" "\n" " [-I <unique-id>] set the unique ID of this index\n" "\n" " [-M]: in-memory (don't use temp files)\n" " [-T]: don't delete temp files\n" " [-t <temp-dir>]: use this temp direcotry (default: /tmp)\n" " [-v]: add verbosity.\n" "\n", progname); } int main(int argc, char** argv) { int argchar; char* infn = NULL; char* indexfn = NULL; char* inindexfn = NULL; int inext = 0; index_params_t myp; index_params_t* p; int loglvl = LOG_MSG; int i; int preset = -100; p = &myp; build_index_defaults(p); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'A': p->racol = optarg; break; case 'D': p->deccol = optarg; break; case 'B': p->brightcut = atof(optarg); break; case 'P': preset = atoi(optarg); break; case '1': inindexfn = optarg; break; case 'j': p->jitter = atof(optarg); break; case 't': p->tempdir = optarg; break; case 'T': p->delete_tempfiles = FALSE; break; case 'E': p->scanoccupied = TRUE; break; case 'L': p->Nloosen = atoi(optarg); break; case 'R': p->Nreuse = atoi(optarg); break; case 'p': p->passes = atoi(optarg); break; case 'M': p->inmemory = TRUE; break; case 'U': p->UNside = atoi(optarg); break; case 'i': infn = optarg; break; case 'e': inext = atoi(optarg); break; case 'o': indexfn = optarg; break; case 'u': p->qhi = atof(optarg); break; case 'l': p->qlo = atof(optarg); break; case 'S': p->sortcol = optarg; break; case 'f': p->sortasc = FALSE; break; case 'H': p->bighp = atoi(optarg); break; case 's': p->bignside = atoi(optarg); break; case 'n': p->sweeps = atoi(optarg); break; case 'N': p->Nside = atoi(optarg); break; case 'r': p->dedup = atof(optarg); break; case 'm': p->margin = atoi(optarg); break; case 'd': p->dimquads = atoi(optarg); break; case 'I': p->indexid = atoi(optarg); break; case 'v': loglvl++; break; case 'h': print_help(argv[0]); exit(0); default: return -1; } log_init(loglvl); if (!(infn || inindexfn) || !indexfn) { printf("You must specify input & output filenames.\n"); print_help(argv[0]); exit( -1); } if (infn && inindexfn) { printf("Only specify one of -i <input catalog> and -1 <share star kdtree>!\n"); print_help(argv[0]); exit( -1); } if (optind != argc) { print_help(argv[0]); printf("\nExtra command-line args were given: "); for (i=optind; i<argc; i++) { printf("%s ", argv[i]); } printf("\n"); exit(-1); } if (!p->indexid) logmsg("Warning: you should set the unique-id for this index (with -I).\n"); if (p->dimquads > DQMAX) { ERROR("Quad dimension %i exceeds compiled-in max %i.\n", p->dimquads, DQMAX); exit(-1); } if (preset > -100) { // I don't think we can do -6 easily (due to healpix limitations) const int minpreset = -5; double scales[] = { 0.35, 0.5, 0.7, 1., 1.4, 2., 2.8, 4., 5.6, 8., 11., 16., 22., 30., 42., 60., 85., 120., 170., 240., 340., 480., 680., 1000., 1400., 2000. }; // don't need to change this when "minpreset" changes double hpbase = 1760; double nside; int P = sizeof(scales)/sizeof(double) - 1; int maxpreset = P + minpreset; int prei = preset - minpreset; if (preset >= maxpreset) { ERROR("Error: only presets %i through %i are defined.\n", minpreset, maxpreset-1); exit(-1); } if (preset < minpreset) { ERROR("Preset must be >= %i\n", minpreset); exit(-1); } p->qlo = scales[prei]; p->qhi = scales[prei+1]; nside = hpbase * pow((1./sqrt(2)), preset); logverb("nside: %g\n", nside); if (p->bignside) p->Nside = (int)(p->bignside * ceil(nside / (double)p->bignside)); else p->Nside = (int)ceil(nside); logverb("Preset %i: quad scales %g to %g, Nside %i\n", preset, p->qlo, p->qhi, p->Nside); } // For HISTORY cards in output... p->argc = argc; p->args = argv; if (infn) { if (build_index_files(infn, inext, indexfn, p)) { exit(-1); } } else { if (build_index_shared_skdt_files(inindexfn, indexfn, p)) { exit(-1); } } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/build-index.c�������������������������������������������������������������000644 �000765 �000024 �00000044520 12651445460 020233� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <limits.h> #include <sys/time.h> #include <sys/resource.h> #include <assert.h> #include "os-features.h" #include "build-index.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "quad-utils.h" #include "uniformize-catalog.h" #include "startree2.h" #include "codetree.h" #include "unpermute-quads.h" #include "unpermute-stars.h" #include "bl.h" #include "ioutils.h" #include "rdlist.h" #include "kdtree.h" #include "hpquads.h" #include "sip.h" #include "sip_qfits.h" #include "codefile.h" #include "codekd.h" #include "merge-index.h" #include "fitsioutils.h" #include "permutedsort.h" static void add_boilerplate(index_params_t* p, qfits_header* hdr) { } static int step_hpquads(index_params_t* p, codefile_t** p_codes, quadfile_t** p_quads, char** p_codefn, char** p_quadfn, startree_t* starkd, const char* skdtfn, sl* tempfiles) { codefile_t* codes = NULL; quadfile_t* quads = NULL; char* quadfn = NULL; char* codefn = NULL; if (p->inmemory) { codes = codefile_open_in_memory(); quads = quadfile_open_in_memory(); if (hpquads(starkd, codes, quads, p->Nside, p->qlo, p->qhi, p->dimquads, p->passes, p->Nreuse, p->Nloosen, p->indexid, p->scanoccupied, p->hpquads_sort_data, p->hpquads_sort_func, p->hpquads_sort_size, p->args, p->argc)) { ERROR("hpquads failed"); return -1; } if (!quadfile_nquads(quads)) { logmsg("Did not create any quads. Perhaps your catalog does not have enough stars?\n"); return -1; } if (quadfile_switch_to_reading(quads)) { ERROR("Failed to switch quadfile to read-mode"); return -1; } if (codefile_switch_to_reading(codes)) { ERROR("Failed to switch codefile to read-mode"); return -1; } } else { quadfn = create_temp_file("quad", p->tempdir); sl_append_nocopy(tempfiles, quadfn); codefn = create_temp_file("code", p->tempdir); sl_append_nocopy(tempfiles, codefn); if (hpquads_files(skdtfn, codefn, quadfn, p->Nside, p->qlo, p->qhi, p->dimquads, p->passes, p->Nreuse, p->Nloosen, p->indexid, p->scanoccupied, p->hpquads_sort_data, p->hpquads_sort_func, p->hpquads_sort_size, p->args, p->argc)) { ERROR("hpquads failed"); return -1; } } if (p_codes) *p_codes = codes; if (p_quads) *p_quads = quads; if (p_codefn) *p_codefn = codefn; if (p_quadfn) *p_quadfn = quadfn; return 0; } static int step_codetree(index_params_t* p, codefile_t* codes, codetree_t** p_codekd, const char* codefn, char** p_ckdtfn, sl* tempfiles) { codetree_t* codekd = NULL; char* ckdtfn=NULL; if (p->inmemory) { logmsg("Building code kdtree from %i codes\n", codes->numcodes); logmsg("dim: %i\n", codefile_dimcodes(codes)); codekd = codetree_build(codes, 0, 0, 0, 0, p->args, p->argc); if (!codekd) { ERROR("Failed to build code kdtree"); return -1; } if (codefile_close(codes)) { ERROR("Failed to close codefile"); return -1; } } else { ckdtfn = create_temp_file("ckdt", p->tempdir); sl_append_nocopy(tempfiles, ckdtfn); if (codetree_files(codefn, ckdtfn, 0, 0, 0, 0, p->args, p->argc)) { ERROR("codetree failed"); return -1; } } if (p_codekd) *p_codekd = codekd; if (p_ckdtfn) *p_ckdtfn = ckdtfn; return 0; } static int step_unpermute_quads(index_params_t* p, quadfile_t* quads2, codetree_t* codekd, quadfile_t** p_quads3, codetree_t** p_codekd2, const char* quad2fn, const char* ckdtfn, char** p_quad3fn, char** p_ckdt2fn, sl* tempfiles) { quadfile_t* quads3 = NULL; codetree_t* codekd2 = NULL; char* quad3fn=NULL; char* ckdt2fn=NULL; logmsg("Unpermute-quads...\n"); if (p->inmemory) { quads3 = quadfile_open_in_memory(); if (unpermute_quads(quads2, codekd, quads3, &codekd2, p->args, p->argc)) { ERROR("Failed to unpermute-quads"); return -1; } // unpermute-quads makes a shallow copy of the tree, so don't just codetree_close(codekd)... free(codekd->tree->perm); free(codekd->tree); codekd->tree = NULL; codetree_close(codekd); if (quadfile_switch_to_reading(quads3)) { ERROR("Failed to switch quads3 to read-mode"); return -1; } if (quadfile_close(quads2)) { ERROR("Failed to close quadfile quads2"); return -1; } } else { ckdt2fn = create_temp_file("ckdt2", p->tempdir); sl_append_nocopy(tempfiles, ckdt2fn); quad3fn = create_temp_file("quad3", p->tempdir); sl_append_nocopy(tempfiles, quad3fn); logmsg("Unpermuting quads from %s and %s to %s and %s\n", quad2fn, ckdtfn, quad3fn, ckdt2fn); if (unpermute_quads_files(quad2fn, ckdtfn, quad3fn, ckdt2fn, p->args, p->argc)) { ERROR("Failed to unpermute-quads"); return -1; } } if (p_quads3) *p_quads3 = quads3; if (p_codekd2) *p_codekd2 = codekd2; if (p_quad3fn) *p_quad3fn = quad3fn; if (p_ckdt2fn) *p_ckdt2fn = ckdt2fn; return 0; } static int step_merge_index(index_params_t* p, codetree_t* codekd2, quadfile_t* quads3, startree_t* starkd2, index_t** p_index, const char* ckdt2fn, const char* quad3fn, const char* skdt2fn, const char* indexfn) { index_t* index = NULL; if (p->inmemory) { qfits_header* hdr; index = index_build_from(codekd2, quads3, starkd2); if (!index) { ERROR("Failed to create index from constituent parts"); return -1; } hdr = quadfile_get_header(index->quads); if (hdr) add_boilerplate(p, hdr); /* When closing: kdtree_free(codekd2->tree); codekd2->tree = NULL; */ *p_index = index; } else { quadfile_t* quad; codetree_t* code; startree_t* star; qfits_header* hdr; logmsg("Merging %s and %s and %s to %s\n", quad3fn, ckdt2fn, skdt2fn, indexfn); /* if (merge_index_files(quad3fn, ckdt2fn, skdt2fn, indexfn)) { ERROR("Failed to merge-index"); return -1; } */ if (merge_index_open_files(quad3fn, ckdt2fn, skdt2fn, &quad, &code, &star)) { ERROR("Failed to open index files for merging"); return -1; } hdr = quadfile_get_header(quad); if (hdr) add_boilerplate(p, hdr); if (merge_index(quad, code, star, indexfn)) { ERROR("Failed to write merged index"); return -1; } codetree_close(code); startree_close(star); quadfile_close(quad); } return 0; } static void step_delete_tempfiles(index_params_t* p, sl* tempfiles) { if (p->delete_tempfiles) { int i; for (i=0; i<sl_size(tempfiles); i++) { char* fn = sl_get(tempfiles, i); logverb("Deleting temp file %s\n", fn); if (unlink(fn)) SYSERROR("Failed to delete temp file \"%s\"", fn); } } } int build_index_shared_skdt(const char* skdtfn, startree_t* starkd, index_params_t* p, index_t** p_index, const char* indexfn) { // assume we've got a final (ie, post-unpermute-stars) skdt // we use that skdt's stars to uniformize, along with a column pulled // from its tag-along data. This yields a permutation array, which // we feed to hpquads to alter its idea of how to sort stars that could // be used to build quads. // Then we do unpermute-quads, skip unpermute-stars, and feed // the original skdt in to merge-index. // TODO - tweak the index-reading code to allow multiple indices // sharing an skdt in one FITS file. // --quads_X table // --header card in the .quads HDU saying what the name of its skdt is. double* sortdata = NULL; //int* uniperm = NULL; int rtn = -1; codefile_t* codes = NULL; quadfile_t* quads = NULL; char* quadfn=NULL; char* codefn=NULL; codetree_t* codekd = NULL; char* ckdtfn=NULL; startree_t* starkd2 = NULL; quadfile_t* quads2 = NULL; char* quad2fn=NULL; quadfile_t* quads3 = NULL; codetree_t* codekd2 = NULL; char* quad3fn=NULL; char* ckdt2fn=NULL; sl* tempfiles; if (!p->UNside) p->UNside = p->Nside; assert(p->Nside); if (p->inmemory && !p_index) { ERROR("If you set inmemory, you must set p_index"); return -1; } if (!p->inmemory && !indexfn) { ERROR("If you set !inmemory, you must set indexfn"); return -1; } assert(starkd->tree); assert(starkd->tree->perm == NULL); assert(p->sortcol); if (!p->sortcol) { ERROR("You must set the sort column\n"); return -1; } tempfiles = sl_new(4); // OR, should we just strictly sort on the tag-along sortcol in hpquads? // Yes, probably. Uniformization isn't going to change the ordering much // in deciding which stars to use in a quad -- they're all nearby. logverb("Grabbing tag-along column \"%s\" for sorting...\n", p->sortcol); sortdata = startree_get_data_column(starkd, p->sortcol, NULL, startree_N(starkd)); if (!sortdata) { ERROR("Failed to find sort column data for sorting catalog"); goto cleanup; } /* logverb("Uniformizing...\n"); uniperm = uniformize_catalog_get_permutation(skdt, sortdata, p->bighp, p->bignside, p->margin, p->UNside, p->dedup, p->sweeps, p->args, p->argc); if (!uniperm) { ERROR("Failed to find uniformization permutation array"); goto cleanup; } p->hpquads_sort = uniperm; p->hpquads_sortfunc = compare_ints_asc; */ p->hpquads_sort_data = sortdata; p->hpquads_sort_func = (p->sortasc ? compare_doubles_asc : compare_doubles_desc); p->hpquads_sort_size = sizeof(double); // hpquads if (step_hpquads(p, &codes, &quads, &codefn, &quadfn, starkd, skdtfn, tempfiles)) return -1; // codetree if (step_codetree(p, codes, &codekd, codefn, &ckdtfn, tempfiles)) return -1; // no unpermute-stars... quads2 = quads; quad2fn = quadfn; starkd2 = starkd; // unpermute-quads... if (step_unpermute_quads(p, quads2, codekd, &quads3, &codekd2, quad2fn, ckdtfn, &quad3fn, &ckdt2fn, tempfiles)) return -1; // merge-index... if (step_merge_index(p, codekd2, quads3, starkd2, p_index, ckdt2fn, quad3fn, skdtfn, indexfn)) return -1; step_delete_tempfiles(p, tempfiles); sl_free2(tempfiles); rtn = 0; cleanup: //free(uniperm); free(sortdata); return rtn; } int build_index(fitstable_t* catalog, index_params_t* p, index_t** p_index, const char* indexfn) { fitstable_t* uniform; // star kdtree startree_t* starkd = NULL; fitstable_t* startag = NULL; // hpquads codefile_t* codes = NULL; quadfile_t* quads = NULL; // codetree codetree_t* codekd = NULL; // unpermute-stars startree_t* starkd2 = NULL; quadfile_t* quads2 = NULL; fitstable_t* startag2 = NULL; // unpermute-quads quadfile_t* quads3 = NULL; codetree_t* codekd2 = NULL; //index_t* index = NULL; sl* tempfiles; char* unifn=NULL; char* skdtfn=NULL; char* quadfn=NULL; char* codefn=NULL; char* ckdtfn=NULL; char* skdt2fn=NULL; char* quad2fn=NULL; char* quad3fn=NULL; char* ckdt2fn=NULL; if (!p->UNside) p->UNside = p->Nside; assert(p->Nside); if (p->inmemory && !p_index) { ERROR("If you set inmemory, you must set p_index"); return -1; } if (!p->inmemory && !indexfn) { ERROR("If you set !inmemory, you must set indexfn"); return -1; } tempfiles = sl_new(4); if (p->inmemory) uniform = fitstable_open_in_memory(); else { unifn = create_temp_file("uniform", p->tempdir); sl_append_nocopy(tempfiles, unifn); uniform = fitstable_open_for_writing(unifn); } if (!uniform) { ERROR("Failed to open output table %s", unifn); return -1; } if (uniformize_catalog(catalog, uniform, p->racol, p->deccol, p->sortcol, p->sortasc, p->brightcut, p->bighp, p->bignside, p->margin, p->UNside, p->dedup, p->sweeps, p->args, p->argc)) { return -1; } if (fitstable_fix_primary_header(uniform)) { ERROR("Failed to fix output table"); return -1; } if (p->inmemory) { if (fitstable_switch_to_reading(uniform)) { ERROR("Failed to switch uniformized table to read-mode"); return -1; } } else { if (fitstable_close(uniform)) { ERROR("Failed to close output table"); return -1; } } fitstable_close(catalog); // startree if (!p->inmemory) { skdtfn = create_temp_file("skdt", p->tempdir); sl_append_nocopy(tempfiles, skdtfn); logverb("Reading uniformized catalog %s...\n", unifn); uniform = fitstable_open(unifn); if (!uniform) { ERROR("Failed to open uniformized catalog"); return -1; } } // DEBUG -- print RA,Dec from uniform catalog. if (log_get_level() > LOG_VERB) { tfits_type dubl = fitscolumn_double_type(); double* ra; double* dec; int i,N; ra = fitstable_read_column(uniform, p->racol, dubl); dec = fitstable_read_column(uniform, p->deccol, dubl); N = fitstable_nrows(uniform); logdebug("Checking %i columns of 'uniform' catalog\n", N); logdebug(" RA column: \"%s\"; Dec column: \"%s\"\n", p->racol, p->deccol); assert(ra && dec); for (i=0; i<N; i++) logdebug(" %i RA,Dec %g,%g\n", i, ra[i], dec[i]); free(ra); free(dec); } { int Nleaf = 25; int datatype = KDT_DATA_U32; int treetype = KDT_TREE_U32; int buildopts = KD_BUILD_SPLIT; logverb("Building star kdtree from %i stars\n", fitstable_nrows(uniform)); starkd = startree_build(uniform, p->racol, p->deccol, datatype, treetype, buildopts, Nleaf, p->args, p->argc); if (!starkd) { ERROR("Failed to create star kdtree"); return -1; } if (p->jitter > 0.0) { startree_set_jitter(starkd, p->jitter); } if (!p->inmemory) { logverb("Writing star kdtree to %s\n", skdtfn); if (startree_write_to_file(starkd, skdtfn)) { ERROR("Failed to write star kdtree"); return -1; } startree_close(starkd); } if (startree_has_tagalong_data(uniform)) { logverb("Adding star kdtree tag-along data...\n"); if (p->inmemory) { startag = fitstable_open_in_memory(); } else { startag = fitstable_open_for_appending(skdtfn); if (!startag) { ERROR("Failed to re-open star kdtree file %s for appending", skdtfn); return -1; } } if (startree_write_tagalong_table(uniform, startag, p->racol, p->deccol)) { ERROR("Failed to write tag-along table"); return -1; } if (p->inmemory) { if (fitstable_switch_to_reading(startag)) { ERROR("Failed to switch star tag-along data to read-mode"); return -1; } starkd->tagalong = startag; } else { if (fitstable_close(startag)) { ERROR("Failed to close star kdtree tag-along data"); return -1; } } } } fitstable_close(uniform); // hpquads if (step_hpquads(p, &codes, &quads, &codefn, &quadfn, starkd, skdtfn, tempfiles)) return -1; // codetree if (step_codetree(p, codes, &codekd, codefn, &ckdtfn, tempfiles)) return -1; // unpermute-stars logmsg("Unpermute-stars...\n"); if (p->inmemory) { quads2 = quadfile_open_in_memory(); if (unpermute_stars(starkd, quads, &starkd2, quads2, TRUE, FALSE, p->args, p->argc)) { ERROR("Failed to unpermute-stars"); return -1; } if (quadfile_close(quads)) { ERROR("Failed to close in-memory quads"); return -1; } if (quadfile_switch_to_reading(quads2)) { ERROR("Failed to switch quads2 to read-mode"); return -1; } if (startag) { startag2 = fitstable_open_in_memory(); startag2->table = fits_copy_table(startag->table); startag2->table->nr = 0; startag2->header = qfits_header_copy(startag->header); if (unpermute_stars_tagalong(starkd, startag2)) { ERROR("Failed to unpermute-stars tag-along data"); return -1; } starkd2->tagalong = startag2; } // unpermute-stars makes a shallow copy of the tree, so don't just startree_close(starkd)... free(starkd->tree->perm); free(starkd->tree); starkd->tree = NULL; startree_close(starkd); } else { skdt2fn = create_temp_file("skdt2", p->tempdir); sl_append_nocopy(tempfiles, skdt2fn); quad2fn = create_temp_file("quad2", p->tempdir); sl_append_nocopy(tempfiles, quad2fn); logmsg("Unpermuting stars from %s and %s to %s and %s\n", skdtfn, quadfn, skdt2fn, quad2fn); if (unpermute_stars_files(skdtfn, quadfn, skdt2fn, quad2fn, TRUE, FALSE, p->args, p->argc)) { ERROR("Failed to unpermute-stars"); return -1; } } // unpermute-quads if (step_unpermute_quads(p, quads2, codekd, &quads3, &codekd2, quad2fn, ckdtfn, &quad3fn, &ckdt2fn, tempfiles)) return -1; // index if (step_merge_index(p, codekd2, quads3, starkd2, p_index, ckdt2fn, quad3fn, skdt2fn, indexfn)) return -1; // FIXME -- close codekd2, quads3, starkd2? step_delete_tempfiles(p, tempfiles); sl_free2(tempfiles); return 0; } int build_index_files(const char* infn, int ext, const char* indexfn, index_params_t* p) { fitstable_t* catalog; logmsg("Reading %s...\n", infn); if (ext) catalog = fitstable_open_extension_2(infn, ext); else catalog = fitstable_open(infn); if (!catalog) { ERROR("Couldn't read catalog %s", infn); return -1; } logmsg("Got %i stars\n", fitstable_nrows(catalog)); if (p->inmemory) { index_t* index; if (build_index(catalog, p, &index, NULL)) { return -1; } logmsg("Writing to file %s\n", indexfn); if (merge_index(index->quads, index->codekd, index->starkd, indexfn)) { ERROR("Failed to write index file"); return -1; } kdtree_free(index->codekd->tree); index->codekd->tree = NULL; index_close(index); } else { if (build_index(catalog, p, NULL, indexfn)) { return -1; } } return 0; } int build_index_shared_skdt_files(const char* starkdfn, const char* indexfn, index_params_t* p) { startree_t* skdt = NULL; logmsg("Reading %s...\n", starkdfn); skdt = startree_open(starkdfn); if (!skdt) { ERROR("Couldn't read star kdtree from \"%s\"", starkdfn); return -1; } logmsg("Got %i stars\n", startree_N(skdt)); if (p->inmemory) { index_t* index; if (build_index_shared_skdt(starkdfn, skdt, p, &index, NULL)) { return -1; } logmsg("Writing to file %s\n", indexfn); if (merge_index(index->quads, index->codekd, index->starkd, indexfn)) { ERROR("Failed to write index file \"%s\"", indexfn); return -1; } // FIXME? Why close codekd independently? kdtree_free(index->codekd->tree); index->codekd->tree = NULL; index_close(index); } else { if (build_index_shared_skdt(starkdfn, skdt, p, NULL, indexfn)) { return -1; } } return 0; } void build_index_defaults(index_params_t* p) { memset(p, 0, sizeof(index_params_t)); p->sweeps = 10; p->racol = "RA"; p->deccol = "DEC"; p->passes = 16; p->Nreuse = 8; p->Nloosen = 20; p->dimquads = 4; p->sortasc = TRUE; p->brightcut = -HUGE_VAL; // default to all-sky p->bighp = -1; //p->inmemory = TRUE; p->delete_tempfiles = TRUE; p->tempdir = "/tmp"; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/catalog.c�����������������������������������������������������������������000644 �000765 �000024 �00000026032 12651445460 017437� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "catalog.h" #include "fitsioutils.h" #include "ioutils.h" #include "starutil.h" #include "mathutil.h" #include "errors.h" #define CHUNK_XYZ 0 #define CHUNK_MAG 1 #define CHUNK_MAG_ERR 2 #define CHUNK_SIG 3 #define CHUNK_PM 4 #define CHUNK_SIGPM 5 #define CHUNK_STARID 6 static fitsbin_chunk_t* xyz_chunk(catalog* cat) { return fitsbin_get_chunk(cat->fb, CHUNK_XYZ); } static fitsbin_chunk_t* mag_chunk(catalog* cat) { return fitsbin_get_chunk(cat->fb, CHUNK_MAG); } static fitsbin_chunk_t* mag_err_chunk(catalog* cat) { return fitsbin_get_chunk(cat->fb, CHUNK_MAG_ERR); } static fitsbin_chunk_t* get_chunk(catalog* cat, int i) { return fitsbin_get_chunk(cat->fb, i); } static int callback_read_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_header* primheader = fitsbin_get_primary_header(fb); catalog* cat = chunk->userdata; cat->numstars = qfits_header_getint(primheader, "NSTARS", -1); cat->healpix = qfits_header_getint(primheader, "HEALPIX", -1); cat->hpnside = qfits_header_getint(primheader, "HPNSIDE", 1); if (fits_check_endian(primheader)) { ERROR("Catalog file was written with wrong endianness"); return -1; } if (cat->numstars == -1) { ERROR("Couldn't find NSTARS header in catalog file."); return -1; } chunk->nrows = cat->numstars; return 0; } static int callback_read_tagalong(fitsbin_t* fb, fitsbin_chunk_t* chunk) { catalog* cat = chunk->userdata; chunk->nrows = cat->numstars; return 0; } static catalog* new_catalog(const char* fn, anbool writing) { catalog* cat; fitsbin_chunk_t chunk; cat = calloc(1, sizeof(catalog)); if (!cat) { fprintf(stderr, "catalog_open: malloc failed.\n"); } if (writing) cat->fb = fitsbin_open_for_writing(fn); else cat->fb = fitsbin_open(fn); if (!cat->fb) { ERROR("Failed to create fitsbin"); return NULL; } memset(&chunk, 0, sizeof(fitsbin_chunk_t)); // NOTE -- the order these are added MUST match the CHUNK_XYZ, CHUNK_MAG, etc // ordering. // Star positions fitsbin_chunk_init(&chunk); chunk.tablename = "xyz"; chunk.required = 1; chunk.callback_read_header = callback_read_header; chunk.userdata = cat; chunk.itemsize = DIM_STARS * sizeof(double); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Star magnitudes chunk.tablename = "mag"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = sizeof(float); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Star magnitude errors chunk.tablename = "mag_err"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = sizeof(float); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Sigmas chunk.tablename = "sigma_radec"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = 2 * sizeof(float); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Motions chunk.tablename = "proper_motion"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = 2 * sizeof(float); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Sigma Motions chunk.tablename = "sigma_pm"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = 2 * sizeof(float); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_reset(&chunk); // Ids chunk.tablename = "starid"; chunk.required = 0; chunk.callback_read_header = callback_read_tagalong; chunk.userdata = cat; chunk.itemsize = sizeof(uint64_t); fitsbin_add_chunk(cat->fb, &chunk); fitsbin_chunk_clean(&chunk); return cat; } anbool catalog_has_mag(const catalog* cat) { return (cat->mag != NULL); } catalog* catalog_open(char* fn) { catalog* cat = NULL; cat = new_catalog(fn, FALSE); if (!cat) goto bailout; if (fitsbin_read(cat->fb)) { ERROR("catalog: fitsbin_read() failed"); goto bailout; } cat->stars = xyz_chunk(cat)->data; cat->mag = mag_chunk(cat)->data; cat->mag_err = mag_err_chunk(cat)->data; cat->sigma_radec = get_chunk(cat, CHUNK_SIG )->data; cat->proper_motion = get_chunk(cat, CHUNK_PM )->data; cat->sigma_pm = get_chunk(cat, CHUNK_SIGPM )->data; cat->starids = get_chunk(cat, CHUNK_STARID)->data; return cat; bailout: if (cat) catalog_close(cat); return NULL; } static void add_default_header_vals(catalog* cat) { qfits_header* hdr; hdr = catalog_get_header(cat); qfits_header_add(hdr, "AN_FILE", "OBJS", "This file has a list of object positions.", NULL); fits_add_endian(hdr); fits_add_double_size(hdr); qfits_header_add(hdr, "NSTARS", "0", "Number of stars in this file.", NULL); qfits_header_add(hdr, "HEALPIX", "-1", "Healpix covered by this catalog, with Nside=HPNSIDE", NULL); qfits_header_add(hdr, "HPNSIDE", "-1", "Nside of HEALPIX.", NULL); qfits_header_add(hdr, "COMMENT", "This is a flat array of XYZ for each catalog star.", NULL, NULL); qfits_header_add(hdr, "COMMENT", " (ie, star position on the unit sphere)", NULL, NULL); qfits_header_add(hdr, "COMMENT", " (stored as three native-{endian,size} doubles)", NULL, NULL); } catalog* catalog_open_for_writing(char* fn) { catalog* cat; cat = new_catalog(fn, TRUE); if (!cat) goto bailout; cat->hpnside = 1; add_default_header_vals(cat); return cat; bailout: if (cat) catalog_close(cat); return NULL; } qfits_header* catalog_get_header(catalog* cat) { return fitsbin_get_primary_header(cat->fb); } int catalog_write_header(catalog* cat) { fitsbin_t* fb = cat->fb; if (fitsbin_write_primary_header(fb) || fitsbin_write_chunk_header(fb, xyz_chunk(cat))) { ERROR("Failed to write catalog header"); return -1; } return 0; } int catalog_fix_header(catalog* cat) { qfits_header* hdr; fitsbin_t* fb = cat->fb; hdr = catalog_get_header(cat); // fill in the real values... fits_header_mod_int(hdr, "NSTARS", cat->numstars, "Number of stars."); fits_header_mod_int(hdr, "HEALPIX", cat->healpix, "Healpix covered by this catalog, with Nside=HPNSIDE"); fits_header_mod_int(hdr, "HPNSIDE", cat->hpnside, "Nside of HEALPIX."); if (fitsbin_fix_primary_header(fb) || fitsbin_fix_chunk_header(fb, xyz_chunk(cat))) { ERROR("Failed to fix catalog header"); return -1; } return 0; } double* catalog_get_base(catalog* cat) { return cat->stars; } double* catalog_get_star(catalog* cat, int sid) { if (sid >= cat->numstars) { fflush(stdout); fprintf(stderr, "catalog: asked for star %u, but catalog size is only %u.\n", sid, cat->numstars); return NULL; } return cat->stars + sid * 3; } int catalog_write_star(catalog* cat, double* star) { if (fitsbin_write_item(cat->fb, xyz_chunk(cat), star)) { fprintf(stderr, "Failed to write catalog data to file %s: %s\n", cat->fb->filename, strerror(errno)); return -1; } cat->numstars++; return 0; } int write_floats(catalog* cat, int chunknum, const char* name, fl* list, int nperstar) { int i; int B = 1000; fitsbin_chunk_t* chunk = get_chunk(cat, chunknum); if (!list || (fl_size(list) != cat->numstars * nperstar)) { ERROR("Number of %ss (%i) doesn't match number of stars (%i)", name, list ? fl_size(list) : 0, cat->numstars); return -1; } if (fitsbin_write_chunk_header(cat->fb, chunk)) { ERROR("Failed to write %ss header", name); return -1; } for (i=0; i<cat->numstars; i+=B) { float data[nperstar * B]; int n = MIN(i+B, cat->numstars) - i; fl_copy(list, i*nperstar, nperstar*n, data); if (fitsbin_write_items(cat->fb, chunk, data, n)) { ERROR("Failed to write %s for stars %i to %i", name, i, i+n-1); return -1; } } if (fitsbin_fix_chunk_header(cat->fb, chunk)) { ERROR("Failed to fix %ss header", name); return -1; } return 0; } int catalog_write_mags(catalog* cat) { return write_floats(cat, CHUNK_MAG, "magnitude", cat->maglist, 1); } int catalog_write_mag_errs(catalog* cat) { return write_floats(cat, CHUNK_MAG_ERR, "magnitude errors", cat->magerrlist, 1); } int catalog_write_sigmas(catalog* cat) { return write_floats(cat, CHUNK_SIG, "sigma", cat->siglist, 2); } int catalog_write_pms(catalog* cat) { return write_floats(cat, CHUNK_PM, "proper motion", cat->pmlist, 2); } int catalog_write_sigma_pms(catalog* cat) { return write_floats(cat, CHUNK_SIGPM, "sigma proper motion", cat->sigpmlist, 2); } int catalog_write_ids(catalog* cat) { int i; char* name = "id"; int chunknum = CHUNK_STARID; fitsbin_chunk_t* chunk = get_chunk(cat, chunknum); if (!cat->idlist || (bl_size(cat->idlist) != cat->numstars)) { ERROR("Number of %ss (%i) doesn't match number of stars (%i)", name, cat->idlist ? bl_size(cat->idlist) : 0, cat->numstars); return -1; } if (fitsbin_write_chunk_header(cat->fb, chunk)) { ERROR("Failed to write %ss header", name); return -1; } for (i=0; i<cat->numstars; i++) if (fitsbin_write_item(cat->fb, chunk, bl_access(cat->idlist, i))) { ERROR("Failed to write %s for star %i", name, i); return -1; } if (fitsbin_fix_chunk_header(cat->fb, chunk)) { ERROR("Failed to fix %ss header", name); return -1; } return 0; } void addfloat(fl** list, float val) { if (!(*list)) *list = fl_new(256); fl_append(*list, val); } void catalog_add_mag(catalog* cat, float mag) { addfloat(&(cat->maglist), mag); } void catalog_add_mag_err(catalog* cat, float magerr) { addfloat(&(cat->magerrlist), magerr); } void catalog_add_sigmas(catalog* cat, float sra, float sdec) { addfloat(&(cat->siglist), sra); addfloat(&(cat->siglist), sdec); } void catalog_add_pms(catalog* cat, float sra, float sdec) { addfloat(&(cat->pmlist), sra); addfloat(&(cat->pmlist), sdec); } void catalog_add_sigma_pms(catalog* cat, float sra, float sdec) { addfloat(&(cat->sigpmlist), sra); addfloat(&(cat->sigpmlist), sdec); } void catalog_add_id(catalog* cat, uint64_t id) { if (!cat->idlist) cat->idlist = bl_new(256, sizeof(uint64_t)); bl_append(cat->idlist, &id); } int catalog_close(catalog* cat) { int rtn; if (!cat) return 0; rtn = fitsbin_close(cat->fb); fl_free(cat->maglist); fl_free(cat->magerrlist); fl_free(cat->siglist); fl_free(cat->pmlist); fl_free(cat->sigpmlist); bl_free(cat->idlist); free(cat); return rtn; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/catalog_analysis.c��������������������������������������������������������000644 �000765 �000024 �00000026770 12651445460 021353� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <assert.h> #include <math.h> #include <string.h> #include "healpix.h" #include "mathutil.h" #include "pnpoly.h" /* Size of the line buffer */ #define BUFSIZE 1000 /* Need to extend this structure to handle more complicated polygons */ typedef struct { double *corners; } rect_field; /* Dead simple linked list */ struct ll_node { int data; struct ll_node *next; }; /* TODO: factor this out into mathutil or something similar. Eventually * this file won't need it anymore anyway if the healpix code is rewritten * to abandon the current behaviour of using hierarchical numbering for * powers of 4. */ static Inline anbool ispowerof4(unsigned int x) { if (x >= 0x40000) return ( x == 0x40000 || x == 0x100000 || x == 0x400000 || x == 0x1000000 || x == 0x4000000 || x == 0x10000000 || x == 0x40000000); else return (x == 0x1 || x == 0x4 || x == 0x10 || x == 0x40 || x == 0x100 || x == 0x400 || x == 0x1000 || x == 0x4000 || x == 0x10000); } /* Compute the min of n doubles */ static double nmin(double *p, int n) { int i; double cmin; assert (n > 0); cmin = p[0]; for (i = 1; i < n; i++) { if (p[i] < cmin) cmin = p[i]; } return cmin; } /* Compute the min of n doubles and return the index rather than value */ static int nminind(double *p, int n) { int i; int cminind; assert (n > 0); cminind = 0; for (i = 1; i < n; i++) { if (p[i] < p[cminind]) { cminind = i; } } return cminind; } /* Compute the max of n doubles */ static double nmax(double *p, int n) { int i; double cmax; assert (n > 0); cmax = p[0]; for (i = 1; i < n; i++) { if (p[i] > cmax) cmax = p[i]; } return cmax; } /* Compute the range from max to min of n points stored in a double vector. */ static double range(double *p, int n) { double max = nmax (p, n); double min = nmin (p, n); return fabs (max - min); } /* Wraps around point_in_poly to choose the axis along which the corners * have minimum variance in order to do the chop-off projection. * * TODO: generalize this to n-point convex polygons. Notes have been made * as to where changes need to occur and what. */ int is_inside_field(rect_field *f, double *p) { // DIMQUADS /* FIXME assumes 4 points, will need malloc'ing */ double coordtrans[12]; double *coord1; double *coord2; /* FIXME assumes 4 points */ double *x = coordtrans; double *y = coordtrans + 4; double *z = coordtrans + 8; double t_coord1, t_coord2; double ranges[3]; int i; int xgot = 0, ygot = 0, zgot = 0; /* FIXME Assumes 4 points */ for (i = 0; i < 12; i++) { int j = i % 3; switch (j) { case 0: coordtrans[xgot++] = f->corners[i]; break; case 1: /* FIXME 4+ should be n+ */ coordtrans[4 + ygot++] = f->corners[i]; break; case 2: /* FIXME 4+ should be n+ */ coordtrans[8 + zgot++] = f->corners[i]; break; } } /* FIXME all these calls should use n */ ranges[0] = range(x, 4); ranges[1] = range(y, 4); ranges[2] = range(z, 4); switch (nminind(ranges, 3)) { case 0: coord1 = y; coord2 = z; t_coord1 = p[1]; t_coord2 = p[2]; break; case 1: coord1 = x; coord2 = z; t_coord1 = p[0]; t_coord2 = p[2]; break; case 2: coord1 = x; coord2 = y; t_coord1 = p[0]; t_coord2 = p[1]; break; default: return -1; } /* FIXME should call with n rather than 4 */ return point_in_poly(coord1, coord2, 4, t_coord1, t_coord2); } /* An ugly recursive implementation written while still trying to get * the algorithm right, left here for... some reason */ #if 0 void fill_maps_recursive(char *minmap, char *maxmap, uint hpx, uint Nside, rect_field *curfield, char *visited) { double thishpx_coords[3]; uint neighbours[8]; uint nn; if (visited[hpx / 8] & (1 << (hpx % 8))) return; visited[hpx / 8] |= 1 << (hpx % 8); healpix_to_xyzarr_lex(0.5, 0.5, hpx, Nside, thishpx_coords); //printf("Examining healpix %d, centered at (%f, %f, %f)\n", hpx, // thishpx_coords[0], thishpx_coords[1], thishpx_coords[2]); if (is_inside_field(curfield, thishpx_coords)) { int j; maxmap[hpx / 8] |= (1 << (hpx % 8)); nn = healpix_get_neighbours_nside(hpx, neighbours, Nside); for (j = 0; j < nn; j++) { double ncoords[3]; healpix_to_xyzarr_lex(0.5, 0.5, neighbours[j], Nside, ncoords); //printf("- Examining neighbour healpix %d, centered at (%f, %f, %f)\n", neighbours[j], // ncoords[0], ncoords[1], ncoords[2]); if (!is_inside_field(curfield, ncoords)) { //printf("-- Not in field, breaking off neighbour search\n"); break; } } if (j == nn) minmap[(hpx / 8)] |= (1 << (hpx % 8)); for (j = 0; j < nn; j++) { //printf("Recursing on neighbour of %d, %d\n", hpx, neighbours[j]); fill_maps_recursive(minmap, maxmap, neighbours[j], Nside, curfield, visited); } } } void fill_maps(char *minmap, char *maxmap, uint hpx, uint Nside, rect_field *curfield) { char *visited = malloc(2 * Nside * Nside * sizeof(char)); uint i; uint visitedcnt = 0; for (i = 0; i < 2 * Nside * Nside; i++) visited[i] = 0; fill_maps_recursive(minmap, maxmap, hpx, Nside, curfield, visited); } #endif /* This basically takes two appropriately sized char[] arrays to be used * as bitmaps for the min/max healpix mapping of the sky, as well as a * field we'd like to process and add to the bitmaps, and a healpix number * to start adding from, and an Nside factor. * * This basically starts at the healpix closest to the center of a field * (actually it starts at hpx, see todo below) and percolates outward by * checking neighbouring healpixes. A healpix is included in the upper bound * map if it's center is inside the field boundaries, and included in the * lower bound map only if all of its neighbours' centers are inside the * field boundaries as well. * * TODO: bring the center-computing code from main() up here * TODO: factor that bitmap access ugliness out into some damned macros */ void fill_maps(char *minmap, char *maxmap, uint hpx, uint Nside, rect_field *curfield) { /* Gotta love "are we done" switch variables */ anbool done = FALSE; /* Bitmap we'll use to keep from revisiting the same healpixes */ char *visited = malloc(2 * Nside * Nside * sizeof(char)); /* Store the head of the queue (actually a LIFO) of healpixes to examine */ struct ll_node *queue = NULL; double thishpx_coords[3]; int i; /* Initialize the visited map */ for (i = 0; i < 2 * Nside * Nside; i++) visited[i] = 0; do { /* nn = "number of neighbours */ uint nn; anbool found_neighbour_outside = FALSE; /* always need room for at least 8 neighbours; actual number * gets stored in nn */ uint neighbours[8]; if (visited[hpx / 8] & (1 << (hpx % 8))) { /* should never happen */ assert(1 == 0); } /* set that we've visited hpx */ visited[hpx / 8] |= (1 << (hpx % 8)); /* compute the xyz location of the center of hpx */ healpix_to_xyzarr(hpx, Nside, 0.5, 0.5, thishpx_coords); /* skip the body of this loop if we can */ if (!is_inside_field(curfield, thishpx_coords)) goto getnext; /* always include in maxmap */ maxmap[hpx / 8] |= 1 << (hpx % 8); nn = healpix_get_neighbours(hpx, neighbours, Nside); /* check inclusion for each neighbour and enqueue it if unvisited */ for (i = 0; i < nn; i++) { double ncoords[3]; healpix_to_xyzarr(neighbours[i], Nside, 0.5, 0.5, ncoords); if (!is_inside_field(curfield, ncoords)) found_neighbour_outside = TRUE; if (!(visited[neighbours[i] / 8] & (1 << (neighbours[i] % 8)))) { struct ll_node *newnode = malloc(sizeof(struct ll_node)); newnode->next = queue; newnode->data = neighbours[i]; queue = newnode; } } /* If no neighbours lie outside then include in the minmap */ if (!found_neighbour_outside) minmap[hpx / 8] |= 1 << (hpx % 8); /* dequeue the next one to be checked and set hpx */ getnext: if (queue != NULL) { struct ll_node *newhead = queue->next; hpx = queue->data; free(queue); queue = newhead; } else { /* If the queue is empty and we've gone through the last iteration * then it's okay to terminate. note that right after dequeueing * you can have queue == NULL but still not be done, which is * why we can't just use "queue != NULL" as our loop condition */ done = TRUE; } } while (!done); free(visited); } static void print_help(FILE *f, char *name) { fprintf(f, "This program computes statistics about a set of (for the moment) rectangular\nfields on the sky.\n\n"); fprintf(f, "\tUsage: %s -N <Nside> [-I <inputfile>]\n\n", name); fprintf(f, "In the absence of a -I switch, reads coordinates from standard input.\n"); fprintf(f, "Input should be 4 XYZ coordinates per line, with components and coordinates\nseparated by tabs (i.e. 12 tab-delimited doubles)\n"); } int main(int argc, char **argv) { double max; rect_field curfield; int filled_min = 0, filled_max = 0; char *hpmap_min, *hpmap_max; char *buf = malloc(BUFSIZE * sizeof(char)); int ich, i; int Nside = -1; uint fields; char *infilename = NULL; FILE *input; if (argc == 0) { print_help(stderr, argv[0]); exit(1); } while ((ich = getopt(argc, argv, "N:I:")) != EOF) { switch (ich) { case 'N': Nside = atoi(optarg); break; case 'I': if (optarg == NULL) { print_help(stderr, argv[0]); fprintf(stderr, "Error: -I requires argument"); exit(1); } infilename = strdup(optarg); break; } } if (Nside < 1) { print_help(stderr, argv[0]); fprintf(stderr, "\nError: specify a positive Nside value with -N\n"); exit(1); } else if (ispowerof4(Nside)) { print_help(stderr, argv[0]); fprintf(stderr, "Error: Nside values that are powers of 4 \ are bad news at\n the moment, choose a different one\n"); exit(1); } if (infilename) { input = fopen(infilename, "r"); if (input == NULL) { perror(argv[0]); exit(1); } } else { input = stdin; } /* We could get away with allocating ceil(2/3 * Nside * Nside) */ hpmap_min = malloc(2 * Nside * Nside * sizeof(char)); hpmap_max = malloc(2 * Nside * Nside * sizeof(char)); if (hpmap_min == NULL || hpmap_max == NULL) { fprintf(stderr, "malloc failed!\n"); exit(1); } for (i = 0; i < 2 * Nside * Nside; i++) { hpmap_min[i] = 0; hpmap_max[i] = 0; } curfield.corners = malloc(3 * 4 * sizeof(double)); fields = 0; while (fgets(buf, BUFSIZE, input) != NULL) { uint centerhp; int i, j; double center[3]; center[0] = center[1] = center[2] = 0; fields++; //printf("Doing field %d\n",fields); curfield.corners[0] = atof(strtok(buf, "\t")); /* 12 = 3 coords x 4 pts, got 1 */ for (j = 1; j < 12; j++) { char *tok = strtok(NULL, "\t"); if (tok == NULL) { fprintf(stderr, "Premature end of line!\n"); exit(1); } curfield.corners[j] = atof(tok); } for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { center[j] += curfield.corners[3*i + j]; } } for (i = 0; i < 3; i++) center[i] /= 4; normalize_3(center); centerhp = xyzarrtohealpix(center, (uint)Nside); fill_maps(hpmap_min, hpmap_max, centerhp, (uint)Nside, &curfield); } for (i = 0; i < 12 * Nside * Nside; i++) { if (hpmap_min[i / 8] & (1 << (i % 8))) filled_min++; if (hpmap_max[i / 8] & (1 << (i % 8))) filled_max++; } max = 12 * Nside * Nside; printf("Min: %f, Max: %f\n", ((double)filled_min) / max, ((double)filled_max) / max); fclose(input); return 0; } ��������astrometry.net-0.67/blind/centroid-noise.py���������������������������������������������������������000644 �000765 �000024 �00000012703 12651445460 021155� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys import matplotlib matplotlib.use('Agg') from math import pi from pylab import * from numpy import * from numpy.random import * try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") # Given an image and an xylist (including estimated image sigma), # look at a cutout around each source position, add noise, and recompute # dcen3x3 to find the noisy peak. def dcen3a(f0, f1, f2): s = 0.5 * (f2 - f0) d = 2. * f1 - (f0 + f2) if (d <= 1.e-10*f0): return None aa = f1 + 0.5 * s * s / d sod = s / d return sod * (1. + (4./3.) * (0.25 * d / aa) * (1. - 4. * sod * sod)) + 1. def dcen3b(f0, f1, f2): a = 0.5 * (f2 - 2*f1 + f0) b = f1 - a - f0 xc = -0.5 * b / a if not (0.0 < xc < 2.0): return None return xc def dcen3(f0, f1, f2): return dcen3a(f0,f1,f2) def dcen3x3(image): my0 = dcen3(image[0,0], image[1,0], image[2,0]) my1 = dcen3(image[0,1], image[1,1], image[2,1]) my2 = dcen3(image[0,2], image[1,2], image[2,2]) mx0 = dcen3(image[0,0], image[0,1], image[0,2]) mx1 = dcen3(image[1,0], image[1,1], image[1,2]) mx2 = dcen3(image[2,0], image[2,1], image[2,2]) if None in [ mx0, mx1, mx2, my0, my1, my2 ]: return None # x = (y-1) mx + bx bx = (mx0 + mx1 + mx2) / 3. mx = (mx2 - mx0) / 2. # y = (x-1) my + by by = (my0 + my1 + my2) / 3. my = (my2 - my0) / 2.; # find intersection xc = (mx * (by - my - 1.) + bx) / (1. + mx * my) yc = (xc - 1.) * my + by # check that we are in the box if not ((0.0 < xc < 2.0) and (0.0 < yc < 2.0)): return None return (xc,yc) if __name__ == '__main__': imgfn = sys.argv[1] xyfn = sys.argv[2] print 'FITS Image', imgfn print 'xylist', xyfn p = pyfits.open(imgfn) I = p[0].data print 'Image is', I.shape p = pyfits.open(xyfn) xy = p[1].data x = xy.field('X') y = xy.field('Y') flux = xy.field('FLUX') print 'Sources:', len(x) hdr = p[1].header sigma = hdr['ESTSIGMA'] print 'Estimated sigma', sigma N = 100 dx = [] dy = [] dx2 = [] dy2 = [] fluxes = [] fluxes2 = [] Nout = 0 Nout2 = 0 for i in range(len(x)): #print 'peak',i ix = round(x[i]) - 1 iy = round(y[i]) - 1 cutout = I[iy-1:iy+2, ix-1:ix+2] if cutout.shape != (3,3): print 'cutout is', cutout.shape continue #cutout5 = I[range(iy-2, iy+3, 2), range(ix-2, ix+3, 2)] cutout5 = array([ I[range(iy-2, iy+3, 2), ix-2], I[range(iy-2, iy+3, 2), ix ], I[range(iy-2, iy+3, 2), ix+2], ]) if cutout5.shape != (3,3): print 'cutout5 has shape', cutout5.shape print 'yrange', range(iy-2, iy+3, 2) print 'xrange', range(ix-2, ix+3, 2) print 'cutout5', cutout5 continue for j in xrange(N): noise = normal(0, sigma, size=(3,3)) img = cutout + noise cen = dcen3x3(img) # original center: xx = x[i] - ix yy = y[i] - iy if cen is not None: (cx,cy) = cen dx.append(cx - xx) dy.append(cy - yy) fluxes.append(flux[i]) else: Nout += 1 noise5 = normal(0, sigma, size=(3,3)) cen2 = dcen3x3(cutout5 + noise5) if cen2 is None: Nout2 += 1 continue (cx2, cy2) = cen2 cx = 1. + (cx2-1.) * 2. cy = 1. + (cy2-1.) * 2. dx2.append(cx - xx) dy2.append(cy - yy) fluxes2.append(flux[i]) dx = array(dx) dy = array(dy) dx2 = array(dx2) dy2 = array(dy2) print 'A total of', Nout, 'of', (N*len(x)), '(%i %%)' % int(round(Nout*100./float(N*len(x)))), 'peaks moved outside the 3x3 box.' print 'A total of', Nout2, 'of', (N*len(x)), '(%i %%)' % int(round(Nout2*100./float(N*len(x)))), 'peaks moved outside the 5x5 box.' figure() clf() subplot(1,2,1) plot(dx, dy, 'r.') axis('equal') ylim(-3,3) a=axis() axhline(0) axvline(0) axis(a) title('3x3 centroid error') xlabel('distance (pixels)') subplot(1,2,2) plot(dx2, dy2, 'b.') axis('equal') ylim(-3,3) axhline(0) axvline(0) axis(a) title('5x5 centroid error') xlabel('distance (pixels)') savefig('dxdy.png', dpi=75) subplot(111) dist = sqrt(dx**2 + dy**2) dist2 = sqrt(dx2**2 + dy2**2) clf() subplot(2,1,1) (nb,bins,patches) = hist(dist, 40) xlim(0,bins[-1]) title('3x3 centroid error distance') #xlabel('pixels') subplot(2,1,2) hist(dist2, bins=bins) xlim(0,bins[-1]) title('5x5 centroid error distance') xlabel('pixels') savefig('dists.png', dpi=75) clf() dboth = hstack((dx,dy)) sigd = std(dboth) md = mean(dboth) xx = arange(dboth.min(), dboth.max(), 0.01) yy = (len(dboth)*(xx.max()-xx.min())/40) / (sigd * sqrt(2. * pi)) * exp(-((xx-md)**2)/(2*sigd**2)) subplot(2,1,1) (n,bins,patches) = hist(dboth, 40) plot(xx, yy, 'r-') title('3x3 centroid coordinate errors (std=%g)' % sigd) #xlabel('pixels') dboth2 = hstack((dx2,dy2)) sigd2 = std(dboth2) md2 = mean(dboth2) if len(dboth2): xx2 = arange(dboth2.min(), dboth2.max(), 0.01) yy2 = (len(dboth2)*(xx2.max()-xx2.min())/40) / (sigd2 * sqrt(2. * pi)) * exp(-((xx2-md2)**2)/(2*sigd2**2)) else: xx2 = [] yy2 = [] subplot(2,1,2) hist(dboth2, bins=bins) plot(xx2, yy2, 'r-') title('5x5 centroid coordinate errors (std=%g)' % sigd2) xlabel('pixels') savefig('dboth.png', dpi=75) clf() subplot(2,1,1) plot(fluxes, dist, 'r.') ylabel('pixel distance') #xlabel('flux') title('3x3 centroid') subplot(2,1,2) plot(fluxes2, dist2, 'b.') ylabel('pixel distance') xlabel('flux') title('5x5 centroid') savefig('fluxdist.png', dpi=75) �������������������������������������������������������������astrometry.net-0.67/blind/certifiable.c�������������������������������������������������������������000644 �000765 �000024 �00000022451 12651445460 020277� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <string.h> #include <math.h> #include "os-features.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "matchobj.h" #include "matchfile.h" #include "rdlist.h" #include "solvedfile.h" char* OPTIONS = "hR:A:B:n:t:f:C:T:F:i:I:m:M:"; void printHelp(char* progname) { fprintf(stderr, "Usage: %s\n" " -R rdls-file-template\n" " [-i <first-file>]\n" " [-I <last-file>]\n" " [-A <first-field>] (default 1)\n" " [-B <last-field>] (default the largest field encountered)\n" " [-n <negative-fields-rdls>]" " [-f <false-positive-fields-rdls>]\n" " [-t <true-positive-fields-rdls>]\n" " [-C <number-of-RDLS-stars-to-compute-center>]\n" " [-T <true-positive-solvedfile>]\n" " [-F <false-positive-solvedfile>] (note, both of these are per-MATCH, not per-FIELD)\n" " [-m <true matches output file>]\n" " [-M <false matches output file>]\n" "\n" " <input-match-file> ...\n" "\n", progname); } int main(int argc, char *argv[]) { int argchar; char* progname = argv[0]; char** inputfiles = NULL; int ninputfiles = 0; char* rdlsfname = NULL; rdlist_t* rdls = NULL; int i; int correct, incorrect; int firstfield = 1; int lastfield = -1; int nfields; int Ncenter = 0; char* fpsolved = NULL; char* tpsolved = NULL; int nfields_total; int firstfileid = 0; int lastfileid = 0; int fileid; matchfile** matchfiles; int* mfcursors; char* truematchfn = NULL; char* falsematchfn = NULL; matchfile* truematch = NULL; matchfile* falsematch = NULL; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) { switch (argchar) { case 'h': printHelp(progname); return (HELP_ERR); case 'm': truematchfn = optarg; break; case 'M': falsematchfn = optarg; break; case 'A': firstfield = atoi(optarg); break; case 'B': lastfield = atoi(optarg); break; case 'C': Ncenter = atoi(optarg); break; case 'R': rdlsfname = optarg; break; case 'T': tpsolved = optarg; break; case 'F': fpsolved = optarg; break; case 'i': firstfileid = atoi(optarg); break; case 'I': lastfileid = atoi(optarg); break; default: return (OPT_ERR); } } if (optind < argc) { ninputfiles = argc - optind; inputfiles = argv + optind; } else { printHelp(progname); exit(-1); } if (!rdlsfname) { fprintf(stderr, "You must specify an RDLS file!\n"); printHelp(progname); exit(-1); } if (truematchfn) { truematch = matchfile_open_for_writing(truematchfn); if (!truematch) { fprintf(stderr, "Failed to open file %s for writing matches.\n", truematchfn); exit(-1); } if (matchfile_write_headers(truematch)) { fprintf(stderr, "Failed to write header for %s\n", truematchfn); exit(-1); } } if (falsematchfn) { falsematch = matchfile_open_for_writing(falsematchfn); if (!falsematch) { fprintf(stderr, "Failed to open file %s for writing matches.\n", falsematchfn); exit(-1); } if (matchfile_write_headers(falsematch)) { fprintf(stderr, "Failed to write header for %s\n", falsematchfn); exit(-1); } } matchfiles = malloc(ninputfiles * sizeof(matchfile*)); mfcursors = calloc(ninputfiles, sizeof(int)); for (i=0; i<ninputfiles; i++) { char* fname = inputfiles[i]; printf("Opening matchfile %s...\n", fname); matchfiles[i] = matchfile_open(fname); if (!matchfiles[i]) { fprintf(stderr, "Failed to open matchfile %s.\n", fname); exit(-1); } } correct = incorrect = 0; nfields_total = 0; for (i=0; i<ninputfiles; i++) { matchfile* mf; MatchObj* mo; mf = matchfiles[i]; for (fileid=firstfileid; fileid<=lastfileid; fileid++) { char fn[1024]; int nread = 0; sprintf(fn, rdlsfname, fileid); //printf("Reading rdls file \"%s\"...\n", fn); fflush(stdout); rdls = rdlist_open(fn); if (!rdls) { fprintf(stderr, "Couldn't read rdls file.\n"); exit(-1); } nfields = rdlist_n_fields(rdls); //printf("Read %i fields from rdls file.\n", nfields); if ((lastfield != -1) && (nfields > lastfield)) { nfields = lastfield + 1; } else { lastfield = nfields; } for (; mfcursors[i]<matchfile_count(mf); mfcursors[i]++) { int filenum; int fieldnum; double rac, decc; double r2; double arc; int nrd; rd_t* rd; int k; anbool err = FALSE; mo = matchfile_read_match(mf); filenum = mo->fieldfile; if (filenum < fileid) continue; if (filenum > fileid) { matchfile_pushback_match(mf); break; } fieldnum = mo->fieldnum; if (fieldnum < firstfield) continue; if (fieldnum > lastfield) continue; nread++; rd = rdlist_read_field_num(rdls, fieldnum, NULL); if (!rd) { fprintf(stderr, "Failed to read RDLS entries for field %i.\n", fieldnum); exit(-1); } nrd = rd_n(rd); if (Ncenter) nrd = MIN(nrd, Ncenter); r2 = square(mo->radius); arc = deg2arcmin(mo->radius_deg); xyzarr2radec(mo->center, &rac, &decc); for (k=0; k<nrd; k++) { double xyz[3]; double ra, dec; ra = rd_getra (rd, k); dec = rd_getdec(rd, k); radecdeg2xyzarr(ra, dec, xyz); if (distsq_exceeds(xyz, mo->center, 3, r2 * 1.2)) { printf("\nError: Field %i: match says center (%g, %g), scale %g arcmin, but\n", fieldnum, rac, decc, arc); printf("rdls %i is (%g, %g).\n", k, ra, dec); printf("Logprob %g (%g).\n", mo->logodds, exp(mo->logodds)); err = TRUE; break; } } rd_free(rd); if (err) { incorrect++; if (falsematch) { if (matchfile_write_match(falsematch, mo)) { fprintf(stderr, "Failed to write match to %s\n", falsematchfn); exit(-1); } } } else { printf("Field %5i: correct hit: (%8.3f, %8.3f), scale %6.3f arcmin, logodds %g (%g)\n", fieldnum, rac, decc, arc, mo->logodds, exp(mo->logodds)); correct++; if (truematch) { if (matchfile_write_match(truematch, mo)) { fprintf(stderr, "Failed to write match to %s\n", truematchfn); exit(-1); } } } fflush(stdout); if (tpsolved && !err) solvedfile_set(tpsolved, nfields_total); if (fpsolved && err) solvedfile_set(fpsolved, nfields_total); nfields_total++; } rdlist_close(rdls); printf("Read %i from %s for fileid %i\n", nread, inputfiles[i], fileid); } } printf("\n"); printf("Read a total of %i correct and %i incorrect matches.\n", correct, incorrect); for (i=0; i<ninputfiles; i++) { matchfile_close(matchfiles[i]); } free(matchfiles); free(mfcursors); if (tpsolved) solvedfile_setsize(tpsolved, nfields_total); if (fpsolved) solvedfile_setsize(fpsolved, nfields_total); if (truematch) { if (matchfile_fix_headers(truematch) || matchfile_close(truematch)) { fprintf(stderr, "Failed to fix header for %s\n", truematchfn); exit(-1); } } if (falsematch) { if (matchfile_fix_headers(falsematch) || matchfile_close(falsematch)) { fprintf(stderr, "Failed to fix header for %s\n", falsematchfn); exit(-1); } } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/checkquads.c��������������������������������������������������������������000644 �000765 �000024 �00000005451 12651445460 020142� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Checks the consistency of "quad" and "qidx" files. */ #include <string.h> #include "starutil.h" #include "quadfile.h" #include "qidxfile.h" #include "bl.h" #include "fitsioutils.h" #define OPTIONS "hf:" const char HelpString[] = "quadidx -f fname\n"; int main(int argc, char *argv[]) { int argidx, argchar; char *qidxfname = NULL; char *quadfname = NULL; quadfile* quad; qidxfile* qidx; int q, s; int dimquads; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'f': qidxfname = mk_qidxfn(optarg); quadfname = mk_quadfn(optarg); break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': fprintf(stderr, HelpString); return (HELP_ERR); default: return (OPT_ERR); } if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); fprintf(stderr, HelpString); return (OPT_ERR); } quad = quadfile_open(quadfname, 0); if (!quad) { fprintf(stderr, "Couldn't open quads file %s.\n", quadfname); exit(-1); } qidx = qidxfile_open(qidxfname, 0); if (!qidx) { fprintf(stderr, "Couldn't open qidx file %s.\n", qidxfname); exit(-1); } if (quad->numquads != qidx->numquads) { fprintf(stderr, "Number of quads does not agree: %i vs %i\n", quad->numquads, qidx->numquads); exit(-1); } dimquads = quadfile_dimquads(quad); printf("Checking stars...\n"); for (s=0; s<qidx->numstars; s++) { uint32_t* quads; int nquads; int j; qidxfile_get_quads(qidx, s, &quads, &nquads); for (j=0; j<nquads; j++) { int star[dimquads]; int k, n; quadfile_get_stars(quad, quads[j], star); n = 0; for (k=0; k<dimquads; k++) { if (star[k] == s) n++; } if (n != 1) { fprintf(stderr, "Star %i, quad %i: found %i instances of the quad in the qidx (not 1)\n", s, quads[j], n); fprintf(stderr, " found: "); for (k=0; k<dimquads; k++) { fprintf(stderr, "%i ", star[k]); } fprintf(stderr, "\n"); } } } printf("Checking quads...\n"); for (q=0; q<quad->numquads; q++) { int star[dimquads]; uint32_t* quads; int nquads; int j; quadfile_get_stars(quad, q, star); for (j=0; j<dimquads; j++) { int k; int n; qidxfile_get_quads(qidx, star[j], &quads, &nquads); n = 0; for (k=0; k<nquads; k++) { if (quads[k] == q) n++; } if (n != 1) { fprintf(stderr, "Quad %i, star %i: found %i instances of the quad in the qidx (not 1)\n", q, star[j], n); fprintf(stderr, " found: "); for (k=0; k<nquads; k++) { fprintf(stderr, "%i ", quads[k]); } fprintf(stderr, "\n"); } } } quadfile_close(quad); qidxfile_close(qidx); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/codefile.c����������������������������������������������������������������000644 �000765 �000024 �00000020330 12651445460 017572� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <unistd.h> #include <assert.h> #include "codefile.h" #include "starutil.h" #include "ioutils.h" #include "fitsioutils.h" #include "errors.h" #include "quad-utils.h" void quad_write(codefile_t* codes, quadfile_t* quads, unsigned int* quad, startree_t* starkd, int dimquads, int dimcodes) { double code[DCMAX]; quad_compute_code(quad, dimquads, starkd, code); quad_enforce_invariants(quad, code, dimquads, dimcodes); codefile_write_code(codes, code); quadfile_write_quad(quads, quad); } void quad_write_const(codefile_t* codes, quadfile_t* quads, const unsigned int* quad, startree_t* starkd, int dimquads, int dimcodes) { int k; unsigned int quadcopy[DQMAX]; for (k=0; k<dimquads; k++) quadcopy[k] = quad[k]; quad_write(codes, quads, quadcopy, starkd, dimquads, dimcodes); } void codefile_compute_field_code(const double* xy, double* code, int dimquads) { double Ax, Ay; double Bx, By; double ABx, ABy; double scale, invscale; double costheta, sintheta; int i; Ax = xy[2*0 + 0]; Ay = xy[2*0 + 1]; Bx = xy[2*1 + 0]; By = xy[2*1 + 1]; ABx = Bx - Ax; ABy = By - Ay; scale = (ABx * ABx) + (ABy * ABy); invscale = 1.0 / scale; costheta = (ABy + ABx) * invscale; sintheta = (ABy - ABx) * invscale; // starting with star C... for (i=2; i<dimquads; i++) { double Cx, Cy; double x, y; Cx = xy[2*i + 0]; Cy = xy[2*i + 1]; Cx -= Ax; Cy -= Ay; x = Cx * costheta + Cy * sintheta; y = -Cx * sintheta + Cy * costheta; code[2*(i-2)+0] = x; code[2*(i-2)+1] = y; } } void codefile_compute_star_code(const double* starxyz, double* code, int dimquads) { quad_compute_star_code(starxyz, code, dimquads); } #define CHUNK_CODES 0 static fitsbin_chunk_t* codes_chunk(codefile_t* cf) { return fitsbin_get_chunk(cf->fb, CHUNK_CODES); } static int callback_read_header(fitsbin_t* fb, fitsbin_chunk_t* chunk) { qfits_header* primheader = fitsbin_get_primary_header(fb); codefile_t* cf = chunk->userdata; cf->dimcodes = qfits_header_getint(primheader, "DIMCODES", 4); cf->numcodes = qfits_header_getint(primheader, "NCODES", -1); cf->numstars = qfits_header_getint(primheader, "NSTARS", -1); cf->index_scale_upper = qfits_header_getdouble(primheader, "SCALE_U", -1.0); cf->index_scale_lower = qfits_header_getdouble(primheader, "SCALE_L", -1.0); cf->indexid = qfits_header_getint(primheader, "INDEXID", 0); cf->healpix = qfits_header_getint(primheader, "HEALPIX", -1); cf->hpnside = qfits_header_getint(primheader, "HPNSIDE", 1); if ((cf->numcodes == -1) || (cf->numstars == -1) || (cf->index_scale_upper == -1.0) || (cf->index_scale_lower == -1.0)) { ERROR("Couldn't find NCODES or NSTARS or SCALE_U or SCALE_L entries in FITS header"); return -1; } if (fits_check_endian(primheader)) { ERROR("File was written with the wrong endianness"); return -1; } chunk->itemsize = cf->dimcodes * sizeof(double); chunk->nrows = cf->numcodes; return 0; } static codefile_t* new_codefile(const char* fn, anbool writing, anbool inmem) { fitsbin_chunk_t chunk; codefile_t* cf = calloc(1, sizeof(codefile_t)); if (!cf) { SYSERROR("Couldn't calloc a codefile struct"); return NULL; } cf->healpix = -1; cf->hpnside = 1; if (inmem) { cf->fb = fitsbin_open_in_memory(); } else { if (writing) cf->fb = fitsbin_open_for_writing(fn); else cf->fb = fitsbin_open(fn); } if (!cf->fb) { ERROR("Failed to create fitsbin"); return NULL; } fitsbin_chunk_init(&chunk); chunk.tablename = "codes"; chunk.required = 1; chunk.callback_read_header = callback_read_header; chunk.userdata = cf; fitsbin_add_chunk(cf->fb, &chunk); fitsbin_chunk_clean(&chunk); return cf; } void codefile_get_code(const codefile_t* cf, int codeid, double* code) { int i; if (codeid >= cf->numcodes) { ERROR("Requested codeid %i, but number of codes is %i", codeid, cf->numcodes); assert(codeid < cf->numcodes); // just carry on - we'll probably segfault. } for (i=0; i<cf->dimcodes; i++) code[i] = cf->codearray[codeid * cf->dimcodes + i]; } int codefile_close(codefile_t* cf) { int rtn; if (!cf) return 0; rtn = fitsbin_close(cf->fb); free(cf); return rtn; } codefile_t* codefile_open(const char* fn) { codefile_t* cf = NULL; cf = new_codefile(fn, FALSE, FALSE); if (!cf) goto bailout; if (fitsbin_read(cf->fb)) { ERROR("Failed to open codes file"); goto bailout; } cf->codearray = codes_chunk(cf)->data; return cf; bailout: if (cf) codefile_close(cf); return NULL; } static codefile_t* open_for_writing(const char* fn) { codefile_t* cf; qfits_header* hdr; if (fn) cf = new_codefile(fn, TRUE, FALSE); else cf = new_codefile(fn, TRUE, TRUE); if (!cf) goto bailout; // default cf->dimcodes = 4; // add default values to header hdr = codefile_get_header(cf); fits_add_endian(hdr); qfits_header_add(hdr, "AN_FILE", "CODE", "This file lists the code for each quad.", NULL); qfits_header_add(hdr, "NCODES", "0", "", NULL); qfits_header_add(hdr, "NSTARS", "0", "", NULL); fits_header_add_int(hdr, "DIMCODES", cf->dimcodes, ""); qfits_header_add(hdr, "SCALE_U", "0.0", "", NULL); qfits_header_add(hdr, "SCALE_L", "0.0", "", NULL); qfits_header_add(hdr, "INDEXID", "0", "", NULL); qfits_header_add(hdr, "HEALPIX", "-1", "", NULL); qfits_header_add(hdr, "HPNSIDE", "1", "", NULL); fits_add_long_comment(hdr, "The first extension contains the codes " "stored as %i native-endian doubles. " "(the quad location in %i-D code space)", cf->dimcodes, cf->dimcodes); return cf; bailout: if (cf) codefile_close(cf); return NULL; } codefile_t* codefile_open_for_writing(const char* fn) { if (!fn) { ERROR("Non-NULL filename required"); return NULL; } return open_for_writing(fn); } codefile_t* codefile_open_in_memory() { return open_for_writing(NULL); } int codefile_switch_to_reading(codefile_t* cf) { if (codefile_fix_header(cf)) { ERROR("Failed to fix codes header"); return -1; } if (fitsbin_switch_to_reading(cf->fb)) { ERROR("Failed to switch to read mode"); return -1; } if (fitsbin_read(cf->fb)) { ERROR("Failed to open codes file"); return -1; } cf->codearray = codes_chunk(cf)->data; return 0; } int codefile_write_header(codefile_t* cf) { fitsbin_t* fb = cf->fb; fitsbin_chunk_t* chunk = codes_chunk(cf); chunk->itemsize = cf->dimcodes * sizeof(double); chunk->nrows = cf->numcodes; if (fitsbin_write_primary_header(fb) || fitsbin_write_chunk_header(fb, chunk)) { ERROR("Failed to write codefile header"); return -1; } return 0; } int codefile_fix_header(codefile_t* cf) { qfits_header* hdr; fitsbin_t* fb = cf->fb; fitsbin_chunk_t* chunk = codes_chunk(cf); chunk->itemsize = cf->dimcodes * sizeof(double); chunk->nrows = cf->numcodes; hdr = codefile_get_header(cf); // fill in the real values... fits_header_mod_int(hdr, "DIMCODES", cf->dimcodes, "Number of values in a code."); fits_header_mod_int(hdr, "NCODES", cf->numcodes, "Number of codes."); fits_header_mod_int(hdr, "NSTARS", cf->numstars, "Number of stars."); fits_header_mod_double(hdr, "SCALE_U", cf->index_scale_upper, "Upper-bound index scale (radians)."); fits_header_mod_double(hdr, "SCALE_L", cf->index_scale_lower, "Lower-bound index scale (radians)."); fits_header_mod_int(hdr, "INDEXID", cf->indexid, "Index unique ID."); fits_header_mod_int(hdr, "HEALPIX", cf->healpix, "Healpix of this index."); fits_header_mod_int(hdr, "HPNSIDE", cf->hpnside, "Nside of the healpixelization"); if (fitsbin_fix_primary_header(fb) || fitsbin_fix_chunk_header(fb, chunk)) { ERROR("Failed to fix code header"); return -1; } return 0; } int codefile_write_code(codefile_t* cf, double* code) { fitsbin_chunk_t* chunk = codes_chunk(cf); if (fitsbin_write_item(cf->fb, chunk, code)) { ERROR("Failed to write code"); return -1; } cf->numcodes++; return 0; } qfits_header* codefile_get_header(const codefile_t* cf) { return fitsbin_get_primary_header(cf->fb); } int codefile_dimcodes(const codefile_t* cf) { return cf->dimcodes; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/codeprojections.c���������������������������������������������������������000644 �000765 �000024 �00000016233 12651445460 021221� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Reads a .code or .ckdt file, projects each code onto each pair of axes, and histograms the results. Writes out the histograms as Matlab literals. Pipe the output to a file like "hists.m", then in Matlab run the "codeprojections.m" script. HACK - I haven't looked at how code dimensionality (dimcodes) influences the "volume_at_value()" function. The volume-corrected plots may therefore be wrong. */ #include <string.h> #include <limits.h> #include <math.h> #include "starutil.h" #include "codekd.h" #include "kdtree_fits_io.h" #include "keywords.h" #include "boilerplate.h" #define OPTIONS "hd" static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s <code kdtree>\n" " [-d]: normalize by volume (produce density plots)\n\n", progname); } // 2-D hists int** hists = NULL; double** dhists = NULL; int Nbins = 40; int Dims; // 2-D hist of {C,D}x,{C,D}y int* xyhist = NULL; double* dxyhist = NULL; // 1-D hists int* single = NULL; double* dsingle = NULL; int Nsingle = 100; anbool do_density = FALSE; double minvalue; double scale; static Const double volume_at_value(double x) { // codes in a circle live inside the circle // (x-1/2)^2 + (y-1/2)^2 = 1/2 // we are given "x" and want to find the distance // between the upper and lower arcs of the circle; // ie y(x)_upper - y(x)_lower. Hence we don't care // about the y offset of the center of the circle and // we want twice the value y(x)_upper. Ie, solve // (x-1/2)^2 + y^2 = 1/2 // for y, and return twice that. // y = sqrt(1/2 - (x - 1/2)^2). // = sqrt(1/2 - (x^2 - x + 1/4) // = sqrt(-x^2 + x + 1/4) return 2.0 * sqrt(-x*x + x + 0.25); } static int value_to_bin(double val, int Nbins) { int bin = (int)((val - minvalue) * scale * Nbins); if (bin >= Nbins) { bin = Nbins-1; printf("truncating value %g\n", val); } if (bin < 0) { bin = 0; printf("truncating (up) value %g\n", val); } return bin; } static void add_to_single_histogram(int dim, double val) { int* hist = single + Nsingle * dim; int bin = value_to_bin(val, Nsingle); hist[bin]++; if (do_density) { double* dhist = dsingle + Nsingle * dim; dhist[bin] += 1.0 / volume_at_value(val); } } static void add_to_histogram(int dim1, int dim2, double val1, double val2) { int xbin, ybin; int* hist = hists[dim1 * Dims + dim2]; xbin = value_to_bin(val1, Nbins); ybin = value_to_bin(val2, Nbins); hist[xbin * Nbins + ybin]++; if (do_density) { double* dhist = dhists[dim1 * Dims + dim2]; double inc; if (dim1/2 == dim2/2) // (cx vs cy) or (dx vs dy); the other two dimensions are independent. inc = 1.0; else inc = 1.0 / (volume_at_value(val1) * volume_at_value(val2)); dhist[xbin * Nbins + ybin] += inc; } } static void add_to_cd_histogram(double val1, double val2) { int xbin, ybin; xbin = value_to_bin(val1, Nbins); ybin = value_to_bin(val2, Nbins); xyhist[xbin * Nbins + ybin]++; if (do_density) dxyhist[xbin * Nbins + ybin] += 1.0 / (volume_at_value(val1) * volume_at_value(val2)); } int main(int argc, char *argv[]) { int argchar; char *ckdtfname = NULL; int i, j, d, e; anbool circle; codetree* ct = NULL; kdtree_t* ckdt = NULL; int Ncodes; int dimcodes; if (argc <= 2) { print_help(argv[0]); return (OPT_ERR); } while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'd': do_density = TRUE; break; case 'h': print_help(argv[0]); return (HELP_ERR); default: return (OPT_ERR); } if (optind != argc-1) { print_help(argv[0]); printf("You must give a code kdtree filename!\n"); exit(-1); } ckdtfname = argv[optind]; ct = codetree_open(ckdtfname); if (!ct) { fprintf(stderr, "Failed to read code kdtree file %s.\n", ckdtfname); exit(-1); } circle = qfits_header_getboolean(ct->header, "CIRCLE", 0); ckdt = ct->tree; Ncodes = ckdt->ndata; dimcodes = ckdt->ndim; fprintf(stderr, "Index %s the CIRCLE property.\n", (circle ? "has" : "does not have")); if (circle) { double margin = 0.1; minvalue = 0.5 - M_SQRT1_2 - (0.5 * margin); //scale = M_SQRT1_2 + margin; scale = 1.0 / (M_SQRT2 + margin); } else { double margin = 0.06; minvalue = 0.0 - (0.5 * margin); scale = 1.0 / (1.0 + margin); if (do_density) { fprintf(stderr, "Warning: this index does not have the CIRCLE property " "so the -d flag has no effect.\n"); do_density = FALSE; } } // Allocate memory for projection histograms hists = calloc(dimcodes * dimcodes, sizeof(int*)); dhists = calloc(dimcodes * dimcodes, sizeof(double*)); for (d = 0; d < dimcodes; d++) { for (e = 0; e < d; e++) { hists [d*dimcodes + e] = calloc(Nbins * Nbins, sizeof(int)); dhists[d*dimcodes + e] = calloc(Nbins * Nbins, sizeof(double)); } // Since the 4x4 matrix of histograms is actually symmetric, // only make half for (; e < dimcodes; e++) { hists [d*dimcodes + e] = NULL; dhists[d*dimcodes + e] = NULL; } } xyhist = calloc(Nbins * Nbins, sizeof(int)); dxyhist = calloc(Nbins * Nbins, sizeof(double)); single = calloc(dimcodes * Nsingle, sizeof(int)); dsingle = calloc(dimcodes * Nsingle, sizeof(double)); for (i=0; i<Ncodes; i++) { double code[dimcodes]; codetree_get(ct, i, code); for (d = 0; d < dimcodes; d++) { for (e = 0; e < d; e++) add_to_histogram(d, e, code[d], code[e]); add_to_single_histogram(d, code[d]); } for (d=0; d<dimcodes/2; d++) add_to_cd_histogram(code[2*d], code[2*d+1]); } codetree_close(ct); for (d = 0; d < dimcodes; d++) { for (e = 0; e < d; e++) { int* hist; printf("hist_%i_%i=zeros([%i,%i]);\n", d, e, Nbins, Nbins); hist = hists[d * dimcodes + e]; for (i = 0; i < Nbins; i++) { int j; printf("hist_%i_%i(%i,:)=[", d, e, i + 1); for (j = 0; j < Nbins; j++) { printf("%i,", hist[i*Nbins + j]); } printf("];\n"); } free(hist); if (do_density) { double* dhist; printf("dhist_%i_%i=zeros([%i,%i]);\n", d, e, Nbins, Nbins); dhist = dhists[d * dimcodes + e]; for (i = 0; i < Nbins; i++) { printf("dhist_%i_%i(%i,:)=[", d, e, i + 1); for (j = 0; j < Nbins; j++) printf("%g,", dhist[i*Nbins + j]); printf("];\n"); } free(dhist); } } printf("hist_%i=[", d); for (i = 0; i < Nsingle; i++) printf("%i,", single[d*Nsingle + i]); printf("];\n"); if (do_density) { printf("dhist_%i=[", d); for (i = 0; i < Nsingle; i++) printf("%g,", dsingle[d*Nsingle + i]); printf("];\n"); } } printf("hist_xy=["); for (i=0; i<Nbins; i++) { for (j=0; j<Nbins; j++) printf("%i,", xyhist[i*Nbins+j]); printf(";"); } printf("];\n"); if (do_density) { printf("dhist_xy=["); for (i=0; i<Nbins; i++) { for (j=0; j<Nbins; j++) printf("%g,", dxyhist[i*Nbins+j]); printf(";"); } printf("];\n"); } free(xyhist); free(hists); free(single); if (do_density) { free(dxyhist); free(dhists); free(dsingle); } fprintf(stderr, "Done!\n"); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/codetree-main.c�����������������������������������������������������������000644 �000765 �000024 �00000004536 12651445460 020546� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Reads a list of codes and writes a code kdtree. Input: .code Output: .ckdt */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "codetree.h" #include "boilerplate.h" static const char* OPTIONS = "hR:i:o:bsSt:d:"; static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -i <input-filename>\n" " -o <output-filename>\n" " ( [-b]: build bounding boxes\n" " OR [-s]: build splitting planes )\n" " [-t <tree type>]: {double,float,u32,u16}, default u16.\n" " [-d <data type>]: {double,float,u32,u16}, default u16.\n" " [-S]: include separate splitdim array\n" " [-R <target-leaf-node-size>] (default 25)\n" "\n", progname); } int main(int argc, char *argv[]) { int argidx, argchar; char* progname = argv[0]; int Nleaf = 0; char* treefname = NULL; char* codefname = NULL; int datatype = KDT_DATA_NULL; int treetype = KDT_TREE_NULL; int buildopts = 0; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'R': Nleaf = (int)strtoul(optarg, NULL, 0); break; case 'i': codefname = optarg; break; case 'o': treefname = optarg; break; case 't': treetype = kdtree_kdtype_parse_tree_string(optarg); break; case 'd': datatype = kdtree_kdtype_parse_data_string(optarg); break; case 'b': buildopts |= KD_BUILD_BBOX; break; case 's': buildopts |= KD_BUILD_SPLIT; break; case 'S': buildopts |= KD_BUILD_SPLITDIM; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); exit(-1); default: return (OPT_ERR); } if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); printHelp(progname); exit(-1); } if (!codefname || !treefname) { printHelp(progname); exit(-1); } if (codetree_files(codefname, treefname, Nleaf, datatype, treetype, buildopts, argv, argc)) exit(-1); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/codetree.c����������������������������������������������������������������000644 �000765 �000024 �00000007251 12651445460 017621� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Reads a list of codes and writes a code kdtree. Input: .code Output: .ckdt */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include <assert.h> #include "codetree.h" #include "codefile.h" #include "fitsioutils.h" #include "codekd.h" #include "boilerplate.h" #include "errors.h" #include "log.h" int codetree_files(const char* codefn, const char* ckdtfn, int Nleaf, int datatype, int treetype, int buildopts, char** args, int argc) { codefile_t* codes; codetree_t *codekd = NULL; assert(codefn); assert(ckdtfn); logmsg("codetree: building KD tree for %s\n", codefn); logmsg(" will write KD tree file %s\n", ckdtfn); logmsg("Reading codes...\n"); codes = codefile_open(codefn); if (!codes) { ERROR("Failed to read code file %s", codefn); return -1; } logmsg("Read %u codes.\n", codes->numcodes); codekd = codetree_build(codes, Nleaf, datatype, treetype, buildopts, args, argc); if (!codekd) { return -1; } logmsg("Writing code KD tree to %s...\n", ckdtfn); if (codetree_write_to_file(codekd, ckdtfn)) { ERROR("Failed to write code kdtree to %s", ckdtfn); return -1; } codefile_close(codes); kdtree_free(codekd->tree); codekd->tree = NULL; codetree_close(codekd); return 0; } codetree_t* codetree_build(codefile_t* codes, int Nleaf, int datatype, int treetype, int buildopts, char** args, int argc) { codetree_t* codekd; qfits_header* hdr; int exttype = KDT_EXT_DOUBLE; int tt; int N, D; qfits_header* chdr; codekd = codetree_new(); if (!codekd) { ERROR("Failed to allocate a codetree structure"); return NULL; } if (!Nleaf) Nleaf = 25; if (!datatype) datatype = KDT_DATA_U16; if (!treetype) treetype = KDT_TREE_U16; if (!buildopts) buildopts = KD_BUILD_SPLIT; tt = kdtree_kdtypes_to_treetype(exttype, treetype, datatype); N = codes->numcodes; D = codefile_dimcodes(codes); codekd->tree = kdtree_new(N, D, Nleaf); chdr = codefile_get_header(codes); { double low[D]; double high[D]; int d; anbool circ; circ = qfits_header_getboolean(chdr, "CIRCLE", 0); for (d=0; d<D; d++) { if (circ) { low [d] = 0.5 - M_SQRT1_2; high[d] = 0.5 + M_SQRT1_2; } else { low [d] = 0.0; high[d] = 1.0; } } kdtree_set_limits(codekd->tree, low, high); } logmsg("Building tree...\n"); codekd->tree = kdtree_build(codekd->tree, codes->codearray, N, D, Nleaf, tt, buildopts); if (!codekd->tree) { ERROR("Failed to build code kdtree"); return NULL; } logmsg("Done\n"); codekd->tree->name = strdup(CODETREE_NAME); hdr = codetree_header(codekd); fits_header_add_int(hdr, "NLEAF", Nleaf, "Target number of points in leaves."); an_fits_copy_header(chdr, hdr, "INDEXID"); an_fits_copy_header(chdr, hdr, "HEALPIX"); an_fits_copy_header(chdr, hdr, "ALLSKY"); an_fits_copy_header(chdr, hdr, "HPNSIDE"); an_fits_copy_header(chdr, hdr, "CXDX"); an_fits_copy_header(chdr, hdr, "CXDXLT1"); an_fits_copy_header(chdr, hdr, "CIRCLE"); BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This file was created by the command-line:", NULL, NULL); fits_add_args(hdr, args, argc); qfits_header_add(hdr, "HISTORY", "(end of command line)", NULL, NULL); qfits_header_add(hdr, "HISTORY", "** codetree: history from input file:", NULL, NULL); fits_copy_all_headers(chdr, hdr, "HISTORY"); qfits_header_add(hdr, "HISTORY", "** codetree: end of history from input file.", NULL, NULL); return codekd; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/control-program.c���������������������������������������������������������000644 �000765 �000024 �00000033105 12651445460 021151� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** This is a sample telescope-control program. */ #include <unistd.h> #include <stdio.h> #include <getopt.h> #include <libgen.h> #include <math.h> #include "os-features.h" #include "engine.h" #include "solver.h" #include "index.h" #include "starxy.h" #include "matchobj.h" #include "healpix.h" #include "bl.h" #include "log.h" #include "errors.h" #include "fileutils.h" // required for this sample program, maybe not for yours... #include "anqfits.h" #include "image2xy.h" #include "sip_qfits.h" #include "fitsioutils.h" #include "tic.h" static const char* OPTIONS = "hvc:a:A:W:H:"; #define DEFAULT_IMAGEW 1024 #define DEFAULT_IMAGEH 1024 #define DEFAULT_ARCMIN_MIN 15.0 #define DEFAULT_ARCMIN_MAX 25.0 static void print_help(const char* progname) { printf("Usage: %s\n" " [-c <astrometry config file>] (default: \"../etc/astrometry.cfg\" relative to this executable)\n" " [-a <minimum field width>] in arcminutes, default %g\n" " [-A <maximum field width>] in arcminutes, default %g\n" " [-W <image width> ] in pixels, default %i\n" " [-H <image height>] in pixels, default %i\n" " [-v]: verbose\n" "\n" " <FITS image filename> [<FITS image filename> ...]: the images to process.\n" "\n" "\n", progname, DEFAULT_ARCMIN_MIN, DEFAULT_ARCMIN_MAX, DEFAULT_IMAGEW, DEFAULT_IMAGEH); } // If you've got a TAN or SIP WCS, set "sip". Otherwise, be sure to set // (racenter, deccenter). static void get_next_field(char* fits_image_fn, int* nstars, double** starx, double** stary, double** starflux, sip_t** sip, double* ra, double* dec) { int i, N; simplexy_t simxy; // For this sample program I'm just going to read from a FITS image, // but you probably want to grab data fresh from the CCD... anqfits_t* anq; anq = anqfits_open(fits_image_fn); if (!anq) { ERROR("Failed to open FITS file \"%s\"\n", fits_image_fn); exit(-1); } simplexy_set_defaults(&simxy); simxy.image = anqfits_readpix(anq, 0, 0, 0, 0, 0, 0, PTYPE_FLOAT, NULL, &(simxy.nx), &(simxy.ny)); anqfits_close(anq); if (!simxy.image) { ERROR("Failed to read image pixel from FITS file \"%s\"\n", fits_image_fn); exit(-1); } image2xy_run(&simxy, 0, 0); N = simxy.npeaks; *nstars = N; *starx = malloc(N * sizeof(double)); *stary = malloc(N * sizeof(double)); *starflux = malloc(N * sizeof(double)); for (i=0; i<N; i++) { (*starx)[i] = simxy.x[i]; (*stary)[i] = simxy.y[i]; (*starflux)[i] = simxy.flux[i]; } simplexy_free_contents(&simxy); // simplexy_free_contents frees the image data // Try reading SIP header... logmsg("Trying to read WCS header from %s...\n", fits_image_fn); errors_start_logging_to_string(); *sip = sip_read_header_file(fits_image_fn, NULL); if (!*sip) { char* errmsg = errors_stop_logging_to_string("\n "); logmsg("Reading WCS header failed:\n %s\n", errmsg); free(errmsg); } // If that doesn't work, look for "RA" and "DEC" header cards. if (!*sip) { double infval = 1.0/0.0; qfits_header* hdr = anqfits_get_header2(fits_image_fn, 0); *ra = qfits_header_getdouble(hdr, "RA", infval); logverb("Looking for RA header (float): %g\n", *ra); if (isinf(*ra)) { char* rastr = qfits_header_getstr(hdr, "RA"); logverb("Looking for RA header (string): >>%s<<\n", rastr); *ra = atora(qfits_header_getstr(hdr, "RA")); logverb("Parsed to %g\n", *ra); } *dec = qfits_header_getdouble(hdr, "DEC", infval); logverb("Looking for Dec header (float): %g\n", *dec); if (isinf(*dec)) { char* decstr = qfits_header_getstr(hdr, "DEC"); logverb("Looking for Dec header (string): >>%s<<\n", decstr); *dec = atora(qfits_header_getstr(hdr, "DEC")); logverb("Parsed to %g\n", *dec); } qfits_header_destroy(hdr); logmsg("Using (RA,Dec) estimate (%g, %g)\n", *ra, *dec); } } int main(int argc, char** args) { char* configfn = NULL; int loglvl = LOG_MSG; // Image size in pixels. int imagew = DEFAULT_IMAGEW; int imageh = DEFAULT_IMAGEH; // Image angular width range, in arcminutes. double arcmin_width_min = DEFAULT_ARCMIN_MIN; double arcmin_width_max = DEFAULT_ARCMIN_MAX; int i, I, c; sl* imagefiles; engine_t* engine; solver_t* solver; double hprange; while ((c = getopt(argc, args, OPTIONS)) != -1) switch (c) { case 'h': print_help(args[0]); exit(0); case 'v': loglvl++; break; case 'c': configfn = strdup(optarg); break; case 'W': imagew = atoi(optarg); break; case 'H': imageh = atoi(optarg); break; case 'a': arcmin_width_min = atof(optarg); break; case 'A': arcmin_width_max = atof(optarg); break; case '?': default: printf("Unknown flag %c\n", c); exit( -1); } imagefiles = sl_new(4); for (i=optind; i<argc; i++) sl_append(imagefiles, args[i]); if (!sl_size(imagefiles)) { printf("You must specify at least one FITS image file to read.\n"); print_help(args[0]); exit(-1); } log_init(loglvl); // only required if you use qfits. fits_use_error_system(); if (!configfn) { char *me, *mydir; me = find_executable(args[0], NULL); if (!me) me = strdup(args[0]); mydir = strdup(dirname(me)); free(me); configfn = resolve_path("../etc/astrometry.cfg", mydir); free(mydir); } engine = engine_new(); logmsg("Reading config file %s and loading indexes...\n", configfn); if (engine_parse_config_file(engine, configfn)) { logerr("Failed to parse (or encountered an error while interpreting) config file \"%s\"\n", configfn); exit( -1); } if (!pl_size(engine->indexes)) { logerr("You must list at least one index in the config file (%s)\n", configfn); exit( -1); } free(configfn); logmsg("Loaded %zu indexes.\n", pl_size(engine->indexes)); // For a control program you almost certainly want to be using small enough // indexes that they fit in memory! // Maybe not -- maybe most of them won't be loaded because of // healpix constraints... if (!engine->inparallel) { size_t i; logerr("Forcing indexes_inparallel.\n"); engine->inparallel = TRUE; // We can't just set "inparallel" because the index files are // loaded during config file parsing... must reload now. for (i=0; i<pl_size(engine->indexes); i++) { index_t* index = pl_get(engine->indexes, i); logmsg("Reloading index \"%s\"...\n", index->indexname); index_reload(index); } } // I assume that the engine config file only contains indexes that cover // the range of scales you are interested in. // Furthermore, I assume the range of scales is small enough so that if we // try to verify an existing WCS that claims the field is huge, we won't // accidentally try to load millions of stars. solver = solver_new(); { double app_min, app_max; double qsf_min = 0.1; // compute scale range in arcseconds per pixel. app_min = arcmin2arcsec(arcmin_width_min / (double)imagew); app_max = arcmin2arcsec(arcmin_width_max / (double)imagew); solver->funits_lower = app_min; solver->funits_upper = app_max; // If you want to look at only a limited number of sources: // solver->endobj = 20; // Or you can limit the number of quads the solver tries: // solver->maxquads = 1000000; // solver->maxmatches = 1000000; // don't try teeny-tiny quads. solver->quadsize_min = qsf_min * MIN(imagew, imageh); // by determining whether your images have "positive" or // "negative" parity (sign of the determinant of WCS CD matrix), // you can set this and save half the compute time. // solver->parity = PARITY_NORMAL; // or // solver->parity = PARITY_FLIP; // This determines how good a match has to be. // (you can set it huge; most matches are overwhelmingly good) solver_set_keep_logodds(solver, log(1e12)); // What is the radius of the bounding circle of a field? // (in units of distance on the unit sphere) // This is used to decide which indexes to use. // You could expand this to take into account the error you expect in // the initial WCS estimate. However, currently the healpix code that // decides which healpixes are within range doesn't work if the range is // larger than the healpix side -- but that's probably 10s of degrees for // typical situations. hprange = arcsec2dist(app_max * hypot(imagew, imageh) / 2.0); } for (I=0;; I++) { size_t i, N; sip_t* sip; double racenter, deccenter; il* hplist = il_new(4); starxy_t* field; double *starx, *stary, *starflux; int nstars; double imagecx, imagecy; anbool solved = FALSE; char* img; double t0, t1; // Get the next image... racenter = 0.0; deccenter = 0.0; img = sl_get(imagefiles, I % sl_size(imagefiles)); logmsg("Reading image file %s\n", img); get_next_field(img, &nstars, &starx, &stary, &starflux, &sip, &racenter, &deccenter); t0 = timenow(); // Feed the image source coordinates to the solver... field = starxy_new(nstars, TRUE, FALSE); starxy_set_x_array(field, starx); starxy_set_y_array(field, stary); starxy_set_flux_array(field, starflux); starxy_sort_by_flux(field); solver_set_field(solver, field); free(starx); free(stary); free(starflux); // center of the image in pixels, according to FITS indexing. imagecx = (imagew - 1.0)/2.0; imagecy = (imageh - 1.0)/2.0; // Where is the center of the image according to the existing WCS? if (sip) sip_pixelxy2radec(sip, imagecx, imagecy, &racenter, &deccenter); // Which indexes should we use? Use the WCS or RA,Dec estimate to decide. N = pl_size(engine->indexes); for (i=0; i<N; i++) { index_t* index = pl_get(engine->indexes, i); if (!index_is_within_range(index, racenter, deccenter, dist2deg(hprange))) continue; logmsg("Adding index %s\n", index->indexname); solver_add_index(solver, index); } if (solver_n_indices(solver) == 0) { logmsg("No index files are within range of given RA,Dec center " "and radius: (%g,%g), %g\n", racenter, deccenter, dist2deg(hprange)); goto skip; } if (sip) { logmsg("Trying to verify existing WCS...\n"); solver_verify_sip_wcs(solver, sip); if (solver->best_match_solves) { // Existing WCS passed the test. logmsg("Existing WCS pass the verification test with odds ratio %g\n", exp(solver->best_match.logodds)); // the WCS is solver->best_match.wcstan solved = TRUE; } else { logmsg("Existing WCS failed the verification test...\n"); } } if (!solved) { /* // Now, if you wanted to ignore the WCS and check all indexes, you // could do this: solver_clear_indexes(solver); for (i=0; i<N; i++) { index_t* index = pl_get(engine->indexes); solver_add_index(solver, index); } */ // solver->distance_from_quad_bonus = TRUE; solver_run(solver); if (solver->best_match_solves) { double ra, dec; double pscale; tan_t* wcs; logmsg("Solved using index %s with odds ratio %g\n", solver->best_index->indexname, solver->best_match.logodds); // WCS is solver->best_match.wcstan wcs = &(solver->best_match.wcstan); // center tan_pixelxy2radec(wcs, imagecx, imagecy, &ra, &dec); pscale = tan_pixel_scale(wcs); logmsg("Image center is RA,Dec = (%g,%g) degrees, size is %.2g x %.2g arcmin.\n", ra, dec, arcsec2arcmin(pscale * imagew), arcsec2arcmin(pscale * imageh)); } else { logmsg("Failed to solve.\n"); } } skip: solver_cleanup_field(solver); solver_clear_indexes(solver); il_free(hplist); t1 = timenow(); logmsg("That took %g seconds\n", t1-t0); logmsg("Sleeping...\n"); sleep(1); logmsg("Starting!\n"); } sl_free2(imagefiles); engine_free(engine); solver_free(solver); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/crawl-ftp.py��������������������������������������������������������������000644 �000765 �000024 �00000006231 12651445460 020131� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import os.path import re import socket import sys from ftplib import FTP class crawler(object): dirstack = [ '' ] currentdir = None ffiles = None fdirs = None fnomatches = None def __init__(self): self.ffiles = open('files', 'ab') self.fdirs = open('dirs', 'ab') self.fnomatches = open('nomatch', 'ab') ire = re.compile(r'^(?P<dir>.)' + # 'd' or '-' r'.{9}' + # mode r'\s*\w*' + # space, link count r'\s*\w*' + # space, owner r'\s*\w*' + # space, group r'\s*(?P<size>\d*)' + # filesize r'\s*(?P<month>\w*)' + # space, month r'\s*(?P<day>\w*)' + # space, day r'\s*(?P<time>[\w:]*)' + # space, time r'\s*(?P<name>[\w.~_+-]*)' + # space, name r'$') def close(self): self.ffiles.close() self.fdirs.close() self.fnomatches.close() def set_dirstack(self, stack): self.dirstack = stack def write_stack(self): f = open('dirstack.tmp', 'wb') for d in self.dirstack: f.write(d + '\n') f.close() os.rename('dirstack.tmp', 'dirstack') def add_item(self, s): print 'item', s m = self.ire.match(s) if not m: print 'no match' self.fnomatches.write(self.currentdir + ' ' + s + '\n') self.fnomatches.flush() return d = m.group('dir') name = m.group('name') path = self.currentdir + '/' + name if d == 'd': self.dirstack.append(path) self.fdirs.write(path + '\n') self.fdirs.flush() else: self.ffiles.write(path + '\n') self.ffiles.flush() if __name__ == '__main__': ftp = None crawl = crawler() if os.path.exists('dirstack'): f = open('dirstack', 'rb') stack = f.read().strip().split('\n') #stack = [] #for ln in f: # stack.append(ln) print 'Dirstack:' for d in stack: print d print '(end dirstack)' crawl.set_dirstack(stack) nrequests = 0 socket.setdefaulttimeout(10) while len(crawl.dirstack): if not ftp: # or not (nrequests % 100): if ftp: print 'closing connection.' ftp.quit() print 'opening connection' sys.stdout.flush() ftp = FTP('galex.stsci.edu') ftp.login('anonymous', 'dstn@cs.toronto.edu') #ftp.set_debuglevel(2) d = crawl.dirstack.pop() crawl.currentdir = d print 'listing "%s"' % d sys.stdout.flush() try: ftp.dir(d, crawl.add_item) crawl.write_stack() nrequests += 1 except Exception, e: print 'caught exception:', e sys.stdout.flush() crawl.dirstack.append(d) ftp.close() ftp = None �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/create-scamp-catalog.c����������������������������������������������������000644 �000765 �000024 �00000006576 12651445460 022014� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <math.h> #include <stddef.h> #include "scamp-catalog.h" #include "usnob-fits.h" #include "healpix.h" #include "starutil.h" #include "errors.h" #include "log.h" const char* OPTIONS = "hv"; void print_help(char* progname) { printf("Usage: %s <input-FITS-table> <output-scamp-catalog>\n" " Input table must contain columns:\n" " RA\n" " RA_ERR\n" " DEC\n" " DEC_ERR\n" " MAG\n" " MAG_ERR\n" " [-v]: verbose\n" "\n", progname); } int main(int argc, char** args) { int c; char* infn = NULL; char* outfn = NULL; scamp_cat_t* scamp; int loglvl = LOG_MSG; fitstable_t* table; int i, N; tfits_type dubl = fitscolumn_double_type(); tfits_type any = fitscolumn_any_type(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'v': loglvl++; break; } } log_init(loglvl); if (optind != argc - 2) { print_help(args[0]); exit(-1); } infn = args[optind]; outfn = args[optind+1]; logverb("Reading input from \"%s\"\n", infn); logverb("Will write output to \"%s\"\n", outfn); table = fitstable_open(infn); if (!table) { ERROR("Failed to open input file \"%s\"", infn); exit(-1); } N = fitstable_nrows(table); logverb("Input table has %i rows\n", N); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, ra), any, "RA", TRUE); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, dec), any, "DEC", TRUE); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, err_a), any, "RA_ERR", TRUE); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, err_b), any, "DEC_ERR", TRUE); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, mag), any, "MAG", TRUE); fitstable_add_read_column_struct(table, dubl, 1, offsetof(scamp_ref_t, err_mag), any, "MAG_ERR", FALSE); fitstable_use_buffered_reading(table, sizeof(scamp_ref_t), 1000); if (fitstable_read_extension(table, 1)) { ERROR("Failed to open table from extension 1 of \"%s\"", infn); fitstable_error_report_missing(table); logmsg("Table has columns:\n"); fitstable_print_columns(table); exit(-1); } scamp = scamp_catalog_open_for_writing(outfn, TRUE); if (!scamp || scamp_catalog_write_field_header(scamp, NULL)) { ERROR("Failed to open SCAMP reference catalog for writing: \"%s\"", outfn); exit(-1); } for (i=0; i<N; i++) { /* scamp_ref_t ref; memset(&ref, 0, sizeof(scamp_ref_t)); if (fitstable_read_struct(table, i, &ref)) { ERROR("Failed to read entry %i from input table\n", i); exit(-1); } */ scamp_ref_t* ref; ref = fitstable_next_struct(table); if (!ref) { ERROR("Failed to read entry %i from input table\n", i); exit(-1); } if (scamp_catalog_write_reference(scamp, ref)) { ERROR("Failed to write entry %i to SCAMP catalog.\n", i); exit(-1); } } if (scamp_catalog_close(scamp)) { ERROR("Failed to close SCAMP reference catalog \"%s\"", outfn); exit(-1); } fitstable_close(table); return 0; } ����������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/cut-table.c���������������������������������������������������������������000644 �000765 �000024 �00000004307 12651445460 017706� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/mman.h> #include "fitstable.h" #include "anqfits.h" #include "ioutils.h" #include "fitsioutils.h" #include "errors.h" #include "log.h" int cut_table(const char* infn, const char* outfn, int N) { fitstable_t* in; //fitstable_t* out; FILE* fid; FILE* fin; int i, Next; in = fitstable_open(infn); if (!in) { ERROR("Failed to read input file %s", infn); return -1; } /* out = fitstable_open_for_writing(outfn); if (!out) { ERROR("Failed to out output file %s", outfn); return -1; } */ fid = fopen(outfn, "wb"); if (!fid) { ERROR("Failed to open output file %s", outfn); return -1; } fin = fopen(infn, "rb"); if (!fin) { ERROR("Failed to open input file %s", infn); return -1; } /* fitstable_set_primary_header(out, fitstable_get_primary_header(in)); if (fitstable_write_primary_header(out)) { ERROR("Failed to write primary header"); return -1; } */ if (qfits_header_dump(fitstable_get_primary_header(in), fid)) { ERROR("Failed to write primary header"); return -1; } Next = fitstable_n_extensions(in); logverb("N extensions: %i\n", Next); for (i=1; i<Next; i++) { qfits_header* hdr = fitstable_get_header(in); int width, rows; width = qfits_header_getint(hdr, "NAXIS1", 0); rows = qfits_header_getint(hdr, "NAXIS2", 0); if (N < rows) rows = N; fits_header_mod_int(hdr, "NAXIS2", rows, "number of rows in table"); if (qfits_header_dump(hdr, fid)) { ERROR("Failed to write HDU %i header", i); return -1; } if (rows * width) { int offset = in->table->col[0].off_beg; if (pipe_file_offset(fin, offset, rows * width, fid) || fits_pad_file(fid)) { ERROR("Failed to write HDU %i data", i); return -1; } } if (i < Next-1) if (fitstable_open_next_extension(in)) { ERROR("Failed to open extension %i", i+1); return -1; } } if (fclose(fid)) { ERROR("Failed to close output file %s", outfn); return -1; } fclose(fin); fitstable_close(in); //fitstable_close(out); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/cut-table.h���������������������������������������������������������������000644 �000765 �000024 �00000000341 12651445460 017705� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef CUT_TABLE_H #define CUT_TABLE_H int cut_table(const char* infn, const char* outfn, int N); #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/demo_dsmooth.c������������������������������������������������������������000644 �000765 �000024 �00000010734 12651445460 020510� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* A test suite for dsmooth, compares dsmooth with dsmooth2 Jon Barron, 2007 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <regex.h> #include <cairo.h> #include <math.h> #include "cairoutils.h" #include "dimage.h" #define PEAKDIST 4 int is_png(const struct dirent *de) { regex_t preq; regcomp(&preq, "[^ ]*[.](png|PNG)$", REG_EXTENDED); return !regexec(&preq, de->d_name, (size_t) 0, NULL, 0); } int is_jpeg(const struct dirent *de) { regex_t preq; regcomp(&preq, "[^ ]*[.](jpg|JPG|jpeg|JPEG)$", REG_EXTENDED); return !regexec(&preq, de->d_name, (size_t) 0, NULL, 0); } int is_image(const struct dirent *de) { return is_jpeg(de) || is_png(de); } int is_output(const struct dirent *de) { regex_t preq; regcomp(&preq, "out_[^ ]*", REG_EXTENDED); return !regexec(&preq, de->d_name, (size_t) 0, NULL, 0); } int is_input_image(const struct dirent *de) { return is_image(de) && !is_output(de); } float* to_bw_f(unsigned char *image, int imW, int imH) { int w, h, c; float *image_bw; float v; image_bw = malloc(sizeof(float) * imW * imH); for (w = 0; w < imW; w++) { for (h = 0; h < imH; h++) { v = 0.0; for (c = 0; c <= 2; c++) { v = v + ((float)(image[4*(w*imH+h) + c])) / 3.0; } image_bw[w*imH + h] = v; } } return image_bw; } unsigned char* to_bw_u8(unsigned char *image, int imW, int imH) { int i; unsigned char *image_bw, *p; image_bw = p = malloc(sizeof(unsigned char) * imW * imH); for (i = 0; i < imW*imH; i++, image += 4, p++) { int total = image[0] + image[1] + image[2]; *p = total / 3; } return image_bw; } unsigned char* to_cairo_bw(float *image_bw, int imW, int imH) { int w, h, c; unsigned char* image_cairo; image_cairo = malloc(sizeof(unsigned char) * imW * imH * 4); for (w = 0; w < imW; w++) { for (h = 0; h < imH; h++) { for (c = 0; c <= 2; c++) { image_cairo[4*(w*imH + h) + c] = (unsigned char)(image_bw[w*imH + h]); } image_cairo[4*(w*imH + h) + 3] = 255; } } return image_cairo; } int main(void) { struct dirent **namelist; int i, n, N; unsigned char *image = NULL; float *image_bw_f; unsigned char *image_bw_u8; float *image_out_old; float *image_out_new; char fullpath[255]; char outpath_old[255]; char outpath_new[255]; int imW, imH; float sigma; float err; sigma = 1.0; N = scandir("demo_simplexy_images", &namelist, is_input_image, alphasort); if (N < 0) { perror("scandir"); return 1; } for (n = 0; n < N; n++) { strcpy(fullpath, "demo_simplexy_images/"); strcat(fullpath, namelist[n]->d_name); strcpy(outpath_old, "demo_simplexy_images/out_"); strcat(outpath_old, namelist[n]->d_name); outpath_old[strlen(outpath_old)-4] = '\0'; strcat(outpath_old, "_old"); strcat(outpath_old, ".png"); strcpy(outpath_new, "demo_simplexy_images/out_"); strcat(outpath_new, namelist[n]->d_name); outpath_new[strlen(outpath_new)-4] = '\0'; strcat(outpath_new, "_new"); strcat(outpath_new, ".png"); fprintf(stderr,"demo_dsmooth: loading %s ", fullpath); if (is_png(namelist[n])) { fprintf(stderr, "as a PNG\n"); image = cairoutils_read_png(fullpath, &imW, &imH); } if (is_jpeg(namelist[n])) { fprintf(stderr, "as a JPEG\n"); image = cairoutils_read_jpeg(fullpath, &imW, &imH); } image_bw_u8 = to_bw_u8(image, imW, imH); image_bw_f = malloc(sizeof(float) * imW * imH); for (i = 0; i < imW*imH; i++) { image_bw_f[i] = (float)image_bw_u8[i]; } image_out_old = malloc(sizeof(float)*imW*imH); image_out_new = malloc(sizeof(float)*imW*imH); fprintf(stderr,"demo_dsmooth: running %s through dsmooth\n", fullpath); dsmooth(image_bw_f, imW, imH, sigma, image_out_old); fprintf(stderr,"demo_dsmooth: running %s through dsmooth2\n", fullpath); dsmooth2(image_bw_f, imW, imH, sigma, image_out_new); err = 0.0; for (i = 0; i < imW*imH; i++) { err += fabs(image_out_old[i]-image_out_new[i]); } err = err / (imW*imH); fprintf(stderr, "demo_dsmooth: error between smooths: %f per pixel\n", err); // fprintf(stderr, "demo_dsmooth: writing old dsmoothed image to %s\n", outpath_old); // cairoutils_write_png(outpath_old, to_cairo_bw(image_out_old, imW, imH), imW, imH); // fprintf(stderr, "demo_dsmooth: writing new dsmoothed image to %s\n", outpath_new); // cairoutils_write_png(outpath_new, to_cairo_bw(image_out_new, imW, imH), imW, imH); free(namelist[n]); free(image); free(image_bw_f); free(image_bw_u8); free(image_out_old); free(image_out_new); } free(namelist); return 0; } ������������������������������������astrometry.net-0.67/blind/diffractionFlag_check.c���������������������������������������������������000644 �000765 �000024 �00000005353 12651445460 022247� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <sys/types.h> #include <sys/mman.h> #include "usnob-fits.h" #include "usnob.h" #include "starutil.h" #include "healpix.h" #include "boilerplate.h" #include "assert.h" #include "an-endian.h" #define OPTIONS "h" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage:\n" " %s\n" , progname); //-H <healpix> -N <nside> } int main(int argc, char** args) { int c; int i; int fnum = 0, fnum1 = 0, d = 10; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); } } assert(d<180); // checks the first d degrees of the sky (must be less than 180) while (fnum1<d){ FILE *fid; unsigned char* map; size_t map_size; char fname[40]; char *fn = "/w/284/stars284/USNOB10/%03d/b%03d%d.cat"; sprintf(fname, fn, fnum1, fnum1,fnum); printf("%s\n", fname); // try to open the file. fid = fopen(fname, "r"); if (fid == NULL){ printf("crap\n"); return 1; } //move to end of file if (fseeko(fid, 0, SEEK_END)) { printf("Couldn't seek to end of input file: \n"); exit(-1); } //get file size map_size = ftello(fid); //move back to beginning of file fseeko(fid, 0, SEEK_SET); //read map into memory map = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fileno(fid), 0); printf("mapsize: %d", map_size/USNOB_RECORD_SIZE); //for each entry, prase entry, alert when diffraction_spike flag is set for (i=0; i<map_size; i+=USNOB_RECORD_SIZE) { usnob_entry entry; if (i && (i % 10000000 * USNOB_RECORD_SIZE == 0)) { printf("o"); fflush(stdout); } if (usnob_parse_entry(map + i, &entry)) { printf("Failed to parse USNOB entry: offset %i.\n", i); exit(-1); }else{ //printf("."); } if (entry.diffraction_spike){ uint ival; printf("\ndiffraction spike, entry %d\n", i/USNOB_RECORD_SIZE); // print bytes 12-15 in base 10 of USNOB entry prior to spike ival = u32_letoh(*((uint*)(map+i+ 12 - USNOB_RECORD_SIZE))); printf("entry prior spike: %010d\n", ival); // print bytes 12-15 in base 10 of USNOB entry with spike ival = u32_letoh(*((uint*)(map+i+ 12))); printf("diffraction spike: %010d\n", ival); // print bytes 12-15 in base 10 of USNOB entry after spike ival = u32_letoh(*((uint*)(map+i+ 12 + USNOB_RECORD_SIZE))); printf("entry after spike: %010d\n", ival); } } printf("\n"); fclose(fid); // increment filenumber (degree counter) if (fnum%10 == 9){ fnum1++; fnum = 0; } else { fnum++; } } return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/dstnthing.c���������������������������������������������������������������000644 �000765 �000024 �00000025327 12651445460 020035� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include "os-features.h" #include "bl.h" #include "fit-wcs.h" #include "sip.h" #include "sip_qfits.h" #include "sip-utils.h" #include "scamp.h" #include "log.h" #include "errors.h" #include "matchfile.h" #include "matchobj.h" #include "boilerplate.h" #include "xylist.h" #include "rdlist.h" #include "mathutil.h" #include "verify.h" #include "plotstuff.h" #include "plotimage.h" #include "cairoutils.h" #include "fitsioutils.h" #include "tweak2.h" static const char* OPTIONS = "hx:m:r:vj:p:i:J:o:W:w:s:X:Y:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -m <match input file>\n" " -x <xyls input file>\n" " -r <rdls input file>\n" " [-W <initial WCS>] (default is to get result from match file)\n" " [-w <wcs-output>]: write resulting SIP WCS to this file\n" " [-s <scamp-output>]: write resulting SIP WCS to this file\n" " [-o <order>]: SIP distortion order, default 2\n" " [-p <plot output base filename>]\n" " [-i <plot background image>]\n" " [-v]: verbose\n" " [-j <pixel-jitter>]: set image pixel jitter (default 1.0)\n" " [-J <index-jitter>]: set index jitter (in arcsec, default 1.0)\n" " [-X <CRPIX0>]: fix crpix\n" " [-Y <CRPIX1>]: fix crpix\n" "\n", progname); } /* wget "http://antwrp.gsfc.nasa.gov/apod/image/0403/cmsky_cortner_full.jpg" #solve-field --backend-config backend.cfg -v --keep-xylist %s.xy --continue --scale-low 10 --scale-units degwidth cmsky_cortner_full.xy --no-tweak cp cmsky_cortner_full.xy 1.xy cp cmsky_cortner_full.rdls 1.rd cp cmsky_cortner_full.wcs 1.wcs cp cmsky_cortner_full.jpg 1.jpg wget "http://live.astrometry.net/status.php?job=alpha-201003-01883980&get=match.fits" -O 1.match X=http://live.astrometry.net/status.php?job=alpha-201003-36217312 Y=2 wget "${X}&get=field.xy.fits" -O ${Y}.xy wget "${X}&get=index.rd.fits" -O ${Y}.rd wget "${X}&get=wcs.fits" -O ${Y}.wcs wget "${X}&get=match.fits" -O ${Y}.match wget "http://antwrp.gsfc.nasa.gov/apod/image/1003/mb_2010-03-10_SeaGullThor900.jpg" -O ${Y}.jpg dstnthing -m 2.match -x 2.xy -r 2.rd -p 2 -i 2.jpg X=http://live.astrometry.net/status.php?job=alpha-201002-83316463 Y=3 wget "${X}&get=fullsize.png" -O - | pngtopnm | pnmtojpeg > ${Y}.jpg dstnthing -m 3.match -x 3.xy -r 3.rd -p 3 -i 3.jpg X=http://oven.cosmo.fas.nyu.edu/test/status.php?job=test-201003-60743215 Y=4 X=http://live.astrometry.net/status.php?job=alpha-201003-74071720 Y=5 wget "${X}&get=field.xy.fits" -O ${Y}.xy wget "${X}&get=index.rd.fits" -O ${Y}.rd wget "${X}&get=wcs.fits" -O ${Y}.wcs wget "${X}&get=match.fits" -O ${Y}.match wget "${X}&get=fullsize.png" -O - | pngtopnm | pnmtojpeg > ${Y}.jpg echo dstnthing -m ${Y}.match -x ${Y}.xy -r ${Y}.rd -p ${Y} -i ${Y}.jpg echo mencoder -o fit${Y}.avi -ovc lavc -lavcopts vcodec=mpeg4:keyint=1:autoaspect mf://${Y}-*c.png -mf fps=4:type=png X=http://live.astrometry.net/status.php?job=alpha-201003-75248251 Y=6 mencoder mf://${Y}-*c.png -mf fps=4:type=png -o /dev/null -ovc x264 \ -x264encopts pass=1:turbo:bitrate=900:bframes=1:\ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 \ -vf harddup \ -oac faac -faacopts br=192:mpeg=4:object=2 -channels 2 -srate 48000 \ -ofps 4 mencoder mf://${Y}-*c.png -mf fps=4:type=png -o /dev/null -ovc x264 -x264encopts pass=1:turbo:bitrate=900:bframes=1:me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 -vf harddup -oac faac -faacopts br=192:mpeg=4:object=2 -channels 2 -srate 48000 -ofps 4 mencoder mf://${Y}-*c.png -mf fps=4:type=png -o v${Y}.avi -ovc x264 -x264encopts pass=2:turbo:bitrate=900:bframes=1:me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 -vf harddup -oac faac -faacopts br=192:mpeg=4:object=2 -channels 2 -srate 48000 -ofps 4 ffmpeg -f image2 -i ${Y}-%02dc.png -r 12 -s 800x712 fit${Y}.mp4 ### Works with quicktime and realplayer! mencoder "mf://${Y}-*c.png" -mf fps=10 -o fit${Y}.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=800 */ void makeplot(char* plotfn, char* bgimgfn, int W, int H, int Nfield, double* fieldpix, double* fieldsigma2s, int Nindex, double* indexpix, int besti, int* theta, double* crpix) { int i; plot_args_t pargs; plotimage_t* img; cairo_t* cairo; logmsg("Creating plot %s\n", plotfn); plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; pargs.outfn = plotfn; if (bgimgfn) { img = plotstuff_get_config(&pargs, "image"); img->format = PLOTSTUFF_FORMAT_JPG; plot_image_set_filename(img, bgimgfn); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); } else { float rgba[4] = {0, 0, 0.1, 1.0}; plotstuff_set_size(&pargs, W, H); //plotstuff_init2(&pargs); plotstuff_set_rgba(&pargs, rgba); plotstuff_run_command(&pargs, "fill"); } cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "red"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (i=0; i<=besti; i++) { //printf("field %i -> index %i\n", i, theta[i]); if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } cairo_set_color(cairo, "yellow"); cairo_set_line_width(cairo, 4); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, crpix[0], crpix[1], 10); cairo_stroke(cairo); plotstuff_output(&pargs); } int main(int argc, char** args) { int c; char* xylsfn = NULL; //char* wcsfn = NULL; char* matchfn = NULL; char* rdlsfn = NULL; char* plotfn = NULL; char* bgimgfn = NULL; char* wcsfn = NULL; double indexjitter = 1.0; // arcsec double pixeljitter = 1.0; int i; int W, H; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; matchfile* mf; MatchObj* mo; sip_t sip; sip_t* sipout; double* fieldpix; int Nfield; starxy_t* xy; rd_t* rd; int Nindex; double* indexrd; double Q2; double qc[2]; char* sipoutfn = NULL; char* scampout = NULL; int order = 2; int loglvl = LOG_MSG; double crpix[] = { HUGE_VAL, HUGE_VAL }; anbool do_crpix = FALSE; //FILE* logstream = stderr; //fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'o': order = atoi(optarg); break; case 'p': plotfn = optarg; break; case 'i': bgimgfn = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'J': indexjitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'r': rdlsfn = optarg; break; case 'x': xylsfn = optarg; break; case 'm': matchfn = optarg; break; case 'w': sipoutfn = optarg; break; case 's': scampout = optarg; break; case 'v': loglvl++; break; case 'W': wcsfn = optarg; break; case 'X': crpix[0] = atof(optarg); break; case 'Y': crpix[1] = atof(optarg); break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !matchfn || !rdlsfn) { print_help(args[0]); exit(-1); } do_crpix = (crpix[0] != HUGE_VAL) && (crpix[1] != HUGE_VAL); log_init(loglvl); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { logmsg("Failed to read an rdlist from file %s.\n", rdlsfn); exit(-1); } // image W, H W = xylist_get_imagew(xyls); H = xylist_get_imageh(xyls); if ((W == 0.0) || (H == 0.0)) { logmsg("XYLS file %s didn't contain IMAGEW and IMAGEH headers.\n", xylsfn); exit(-1); } logverb("Got image size %i x %i\n", W, H); // read match file. mf = matchfile_open(matchfn); if (!mf) { ERROR("Failed to read match file %s", matchfn); exit(-1); } mo = matchfile_read_match(mf); if (!mo) { ERROR("Failed to read match from file %s", matchfn); exit(-1); } // (x,y) positions of field stars. xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldpix = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // (ra,dec) of index stars. rd = rdlist_read_field(rdls, NULL); if (!rd) { logmsg("Failed to read rdls entries.\n"); exit(-1); } Nindex = rd_n(rd); logmsg("Found %i index objects\n", Nindex); if (wcsfn) { if (!sip_read_tan_or_sip_header_file_ext(wcsfn, 0, &sip, FALSE)) { ERROR("Failed to read initial SIP/TAN WCS from \"%s\"", wcsfn); return -1; } } else { sip_wrap_tan(&mo->wcstan, &sip); } // quad radius-squared = AB distance. (/4) Q2 = distsq(mo->quadpix, mo->quadpix + 2, 2); qc[0] = sip.wcstan.crpix[0]; qc[1] = sip.wcstan.crpix[1]; indexrd = malloc(2 * Nindex * sizeof(double)); for (i=0; i<Nindex; i++) rd_getradec(rd, i, indexrd+2*i, indexrd+2*i+1); sipout = tweak2(fieldpix, Nfield, pixeljitter, W, H, indexrd, Nindex, indexjitter, qc, Q2, 0.25, -100, order, &sip, NULL, NULL, NULL, do_crpix ? crpix : NULL); if (!sipout) { ERROR("tweak2() failed.\n"); return -1; } free(indexrd); if (sipoutfn) { if (sip_write_to_file(sipout, sipoutfn)) { ERROR("Failed to write SIP result to file \"%s\"", sipoutfn); return -1; } } if (scampout) { qfits_header* hdr = NULL; hdr = xylist_get_primary_header(xyls); //qfits_header_read(axy->xylsfn); // Set NAXIS=2, NAXIS1=IMAGEW, NAXIS2=IMAGEH fits_header_mod_int(hdr, "NAXIS", 2, NULL); fits_header_add_int(hdr, "NAXIS1", W, NULL); fits_header_add_int(hdr, "NAXIS2", H, NULL); if (scamp_write_field(hdr, sipout, xy, scampout)) { ERROR("Failed to write SIP result to Scamp file \"%s\"", scampout); return -1; } } sip_free(sipout); xylist_close(xyls); matchfile_close(mf); rdlist_close(rdls); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/engine-main.c�������������������������������������������������������������000644 �000765 �000024 �00000022046 12651445460 020215� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** * Accepts an augmented xylist that describes a field or set of fields to solve. * Reads a config file to find local indices, and merges information about the * indices with the job description to create an input file for 'blind'. Runs blind * and merges the results. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/time.h> #include <time.h> #include <libgen.h> #include <getopt.h> #include <dirent.h> #include <assert.h> #include <glob.h> // Some systems (Solaris) don't have these glob symbols. Don't really need. #ifndef GLOB_BRACE #define GLOB_BRACE 0 #endif #ifndef GLOB_TILDE #define GLOB_TILDE 0 #endif #include "os-features.h" #include "tic.h" #include "fileutils.h" #include "ioutils.h" #include "bl.h" #include "an-bool.h" #include "solver.h" #include "math.h" #include "fitsioutils.h" #include "blindutils.h" #include "blind.h" #include "log.h" #include "errors.h" #include "engine.h" #include "an-opts.h" #include "gslutils.h" #include "datalog.h" static an_option_t myopts[] = { {'h', "help", no_argument, NULL, "print this help"}, {'v', "verbose", no_argument, NULL, "+verbose"}, {'c', "config", required_argument, "file", "Use this config file (default: \"astrometry.cfg\" in the directory ../etc/ relative to the directory containing the \"astrometry-engine\" executable); 'none' for no config file"}, {'d', "base-dir", required_argument, "dir", "set base directory of all output filenames."}, {'C', "cancel", required_argument, "file", "quit solving if this file appears" }, {'s', "solved", required_argument, "file", "write to this file when a field is solved"}, {'E', "to-stderr", no_argument, NULL, "send log message to stderr"}, {'f', "inputs-from", required_argument, "file", "read input filenames from the given file, \"-\" for stdin"}, {'i', "index", required_argument, "file(s)", "use the given index files (in addition to any specified in the config file); put in quotes to use wildcards, eg: \" -i 'index-*.fits' \""}, {'p', "in-parallel", no_argument, NULL, "run the index files in parallel"}, {'D', "data-log file", required_argument, "file", "log data to the given filename"}, }; static void print_help(const char* progname, bl* opts) { printf("Usage: %s [options] <augmented xylist (axy) file(s)>\n", progname); opts_print_help(opts, stdout, NULL, NULL); } FILE* datalogfid = NULL; static void close_datalogfid() { if (datalogfid) { data_log_end(); if (fclose(datalogfid)) { SYSERROR("Failed to close data log file"); } } } int main(int argc, char** args) { char* default_configfn = "astrometry.cfg"; char* default_config_path = "../etc"; int c; char* configfn = NULL; int i; engine_t* engine; char* mydir = NULL; char* basedir = NULL; char* me; anbool help = FALSE; sl* strings = sl_new(4); char* cancelfn = NULL; char* solvedfn = NULL; int loglvl = LOG_MSG; anbool tostderr = FALSE; char* infn = NULL; FILE* fin = NULL; anbool fromstdin = FALSE; bl* opts = opts_from_array(myopts, sizeof(myopts)/sizeof(an_option_t), NULL); sl* inds = sl_new(4); char* datalog = NULL; engine = engine_new(); while (1) { c = opts_getopt(opts, argc, args); if (c == -1) break; switch (c) { case 'D': datalog = optarg; break; case 'p': engine->inparallel = TRUE; break; case 'i': sl_append(inds, optarg); break; case 'd': basedir = optarg; break; case 'f': infn = optarg; fromstdin = streq(infn, "-"); break; case 'E': tostderr = TRUE; break; case 'h': help = TRUE; break; case 'v': loglvl++; break; case 's': solvedfn = optarg; case 'C': cancelfn = optarg; break; case 'c': configfn = strdup(optarg); break; case '?': break; default: printf("Unknown flag %c\n", c); exit( -1); } } if (optind == argc && !infn) { // Need extra args: filename printf("You must specify at least one input file!\n\n"); help = TRUE; } if (help) { print_help(args[0], opts); exit(0); } bl_free(opts); gslutils_use_error_system(); log_init(loglvl); if (tostderr) log_to(stderr); if (datalog) { datalogfid = fopen(datalog, "wb"); if (!datalogfid) { SYSERROR("Failed to open data log file \"%s\" for writing", datalog); return -1; } atexit(close_datalogfid); data_log_init(100); data_log_enable_all(); data_log_to(datalogfid); data_log_start(); } if (infn) { logverb("Reading input filenames from %s\n", (fromstdin ? "stdin" : infn)); if (!fromstdin) { fin = fopen(infn, "rb"); if (!fin) { ERROR("Failed to open file %s for reading input filenames", infn); exit(-1); } } else fin = stdin; } // directory containing the 'engine' executable: me = find_executable(args[0], NULL); if (!me) me = strdup(args[0]); mydir = sl_append(strings, dirname(me)); free(me); // Read config file if (!configfn) { int i; sl* trycf = sl_new(4); sl_appendf(trycf, "%s/%s/%s", mydir, default_config_path, default_configfn); // if I'm in /usr/bin, look for config file in /etc if (streq(mydir, "/usr/bin")) { sl_appendf(trycf, "/etc/%s", default_configfn); } sl_appendf(trycf, "%s/%s", mydir, default_configfn); sl_appendf(trycf, "./%s", default_configfn); sl_appendf(trycf, "./%s/%s", default_config_path, default_configfn); for (i=0; i<sl_size(trycf); i++) { char* cf = sl_get(trycf, i); if (file_exists(cf)) { configfn = strdup(cf); logverb("Using config file \"%s\"\n", cf); break; } else { logverb("Config file \"%s\" doesn't exist.\n", cf); } } if (!configfn) { char* cflist = sl_join(trycf, "\n "); logerr("Couldn't find config file: tried:\n %s\n", cflist); free(cflist); } sl_free2(trycf); } if (!streq(configfn, "none")) { if (engine_parse_config_file(engine, configfn)) { logerr("Failed to parse (or encountered an error while interpreting) config file \"%s\"\n", configfn); exit( -1); } } if (sl_size(inds)) { // Expand globs. for (i=0; i<sl_size(inds); i++) { char* s = sl_get(inds, i); glob_t myglob; int flags = GLOB_TILDE | GLOB_BRACE; if (glob(s, flags, NULL, &myglob)) { SYSERROR("Failed to expand wildcards in index-file path \"%s\"", s); exit(-1); } for (c=0; c<myglob.gl_pathc; c++) { if (engine_add_index(engine, myglob.gl_pathv[c])) { ERROR("Failed to add index \"%s\"", myglob.gl_pathv[c]); exit(-1); } } globfree(&myglob); } } if (!pl_size(engine->indexes)) { logerr("\n\n" "---------------------------------------------------------------------\n" "You must list at least one index in the config file (%s)\n\n" "See http://astrometry.net/use.html about how to get some index files.\n" "---------------------------------------------------------------------\n" "\n", configfn); exit(-1); } if (engine->minwidth <= 0.0 || engine->maxwidth <= 0.0) { logerr("\"minwidth\" and \"maxwidth\" in the config file %s must be positive!\n", configfn); exit(-1); } free(configfn); if (!il_size(engine->default_depths)) { parse_depth_string(engine->default_depths, "10 20 30 40 50 60 70 80 90 100 " "110 120 130 140 150 160 170 180 190 200"); } engine->cancelfn = cancelfn; engine->solvedfn = solvedfn; i = optind; while (1) { char* jobfn; job_t* job; struct timeval tv1, tv2; if (infn) { // Read name of next input file to be read. logverb("\nWaiting for next input filename...\n"); jobfn = read_string_terminated(fin, "\n\r\0", 3, FALSE); if (strlen(jobfn) == 0) break; } else { if (i == argc) break; jobfn = args[i]; i++; } gettimeofday(&tv1, NULL); logmsg("Reading file \"%s\"...\n", jobfn); job = engine_read_job_file(engine, jobfn); if (!job) { ERROR("Failed to read job file \"%s\"", jobfn); exit(-1); } if (basedir) { logverb("Setting job's output base directory to %s\n", basedir); job_set_output_base_dir(job, basedir); } if (engine_run_job(engine, job)) logerr("Failed to run_job()\n"); job_free(job); gettimeofday(&tv2, NULL); logverb("Spent %g seconds on this field.\n", millis_between(&tv1, &tv2)/1000.0); } engine_free(engine); sl_free2(strings); sl_free2(inds); if (fin && !fromstdin) fclose(fin); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/engine.c������������������������������������������������������������������000644 �000765 �000024 �00000100472 12651445460 017273� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** * Accepts an augmented xylist that describes a field or set of fields to solve. * Reads a config file to find local indices, and merges information about the * indices with the job description to create an input file for 'blind'. Runs blind * and merges the results. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <libgen.h> #include <getopt.h> #include <dirent.h> #include <assert.h> #include "ioutils.h" #include "fileutils.h" #include "bl.h" #include "an-bool.h" #include "solver.h" #include "math.h" #include "fitsioutils.h" #include "blindutils.h" #include "os-features.h" #include "blind.h" #include "log.h" #include "anqfits.h" #include "errors.h" #include "engine.h" #include "tic.h" #include "healpix.h" #include "sip-utils.h" #include "multiindex.h" void engine_add_search_path(engine_t* engine, const char* path) { sl_append(engine->index_paths, path); } char* engine_find_index(engine_t* engine, const char* name) { int j; for (j=-1; j<(int)sl_size(engine->index_paths); j++) { char* path; if (j == -1) if (strlen(name) && name[0] == '/') { // try as an absolute filename. path = strdup(name); } else { continue; } else asprintf_safe(&path, "%s/%s", sl_get(engine->index_paths, j), name); logverb("Trying path %s...\n", path); if (index_is_file_index(path)) return path; free(path); } return NULL; } int engine_autoindex_search_paths(engine_t* engine) { int i; // Search the paths specified and add any indexes that are found. for (i=0; i<sl_size(engine->index_paths); i++) { char* path = sl_get(engine->index_paths, i); DIR* dir = opendir(path); sl* tryinds; int j; if (!dir) { logerr("Warning: failed to open index directory: \"%s\"\n", path); continue; } logverb("Auto-indexing directory \"%s\" ...\n", path); tryinds = sl_new(16); while (1) { struct dirent* de; char* name; char* fullpath; char* err; anbool ok; errno = 0; de = readdir(dir); if (!de) { if (errno) SYSERROR("Failed to read entry from directory \"%s\"", path); break; } name = de->d_name; asprintf_safe(&fullpath, "%s/%s", path, name); if (path_is_dir(fullpath)) { logverb("Skipping directory %s\n", fullpath); free(fullpath); continue; } logverb("Checking file \"%s\"\n", fullpath); errors_start_logging_to_string(); ok = index_is_file_index(fullpath); err = errors_stop_logging_to_string(": "); if (!ok) { logverb("File is not an index: %s\n", err); free(err); free(fullpath); continue; } free(err); sl_insert_sorted_nocopy(tryinds, fullpath); } closedir(dir); // add them in reverse order... (why?) for (j=sl_size(tryinds)-1; j>=0; j--) { char* path = sl_get(tryinds, j); logverb("Trying to add index \"%s\".\n", path); if (engine_add_index(engine, path)) logmsg("Failed to add index \"%s\".\n", path); } sl_free2(tryinds); } return 0; } static int add_index(engine_t* engine, index_t* ind) { int k; // check that an index with the same id and healpix isn't already listed. for (k=0; k<pl_size(engine->indexes); k++) { index_t* m = pl_get(engine->indexes, k); if (m->indexid == ind->indexid && m->healpix == ind->healpix) { logmsg("Warning: encountered two index files with the same INDEXID = %i and HEALPIX = %i: \"%s\" and \"%s\". Keeping both.\n", m->indexid, m->healpix, m->indexname, ind->indexname); //index_free(ind); //return 0; } } pl_append(engine->indexes, ind); // <= smallest we've seen? if (ind->index_scale_lower < engine->sizesmallest) { engine->sizesmallest = ind->index_scale_lower; bl_remove_all(engine->ismallest); il_append(engine->ismallest, pl_size(engine->indexes) - 1); } else if (ind->index_scale_lower == engine->sizesmallest) { il_append(engine->ismallest, pl_size(engine->indexes) - 1); } // >= largest we've seen? if (ind->index_scale_upper > engine->sizebiggest) { engine->sizebiggest = ind->index_scale_upper; bl_remove_all(engine->ibiggest); il_append(engine->ibiggest, pl_size(engine->indexes) - 1); } else if (ind->index_scale_upper == engine->sizebiggest) { il_append(engine->ibiggest, pl_size(engine->indexes) - 1); } return 0; } int engine_add_index(engine_t* engine, char* path) { int k; index_t* ind = NULL; char* quadpath = index_get_quad_filename(path); char* base = basename_safe(quadpath); double t0; free(quadpath); // check that an index with the same filename hasn't already been added. for (k=0; k<pl_size(engine->indexes); k++) { ind = pl_get(engine->indexes, k); // ind->indexname is a path to the quad filename; strip off directory component. char* mbase = basename_safe(ind->indexname); anbool eq = streq(base, mbase); free(mbase); if (eq) { logmsg("Warning: we've already seen an index with the same name: \"%s\". Adding it anyway...\n", ind->indexname); //free(base); //return 0; } } free(base); t0 = timenow(); ind = index_load(path, engine->inparallel ? 0 : INDEX_ONLY_LOAD_METADATA, NULL); debug("index_load(\"%s\") took %g ms\n", path, 1000 * (timenow() - t0)); if (!ind) { ERROR("Failed to load index from path %s", path); return -1; } if (add_index(engine, ind)) { ERROR("Failed to add index \"%s\"", path); return -1; } pl_append(engine->free_indexes, ind); return 0; } static void add_index_to_blind(engine_t* engine, blind_t* bp, int i) { index_t* index; index = pl_get(engine->indexes, i); if (engine->inparallel) { blind_add_loaded_index(bp, index); } else { blind_add_index(bp, index->indexname); } } int engine_parse_config_file(engine_t* engine, const char* fn) { FILE* fconf; int rtn; fconf = fopen(fn, "r"); if (!fconf) { SYSERROR("Failed to open config file \"%s\"", fn); return -1; } rtn = engine_parse_config_file_stream(engine, fconf); fclose(fconf); return rtn; } int engine_parse_config_file_stream(engine_t* engine, FILE* fconf) { sl* indices = sl_new(16); sl* mindices = sl_new(16); anbool auto_index = FALSE; int i; int rtn = 0; while (1) { char buffer[10240]; char* nextword; char* line; if (!fgets(buffer, sizeof(buffer), fconf)) { if (feof(fconf)) break; SYSERROR("Failed to read a line from the config file"); rtn = -1; goto done; } line = buffer; // strip off newline if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; // skip leading whitespace: while (*line && isspace((unsigned)(*line))) line++; // skip comments if (line[0] == '#') continue; // skip blank lines. if (line[0] == '\0') continue; if (is_word(line, "index ", &nextword)) { // don't try to find the index yet - because search paths may be // added later. sl_append(indices, nextword); } else if (is_word(line, "multiindex ", &nextword)) { // don't try to find the index yet - because search paths may be // added later. sl_append(mindices, nextword); } else if (is_word(line, "autoindex", &nextword)) { auto_index = TRUE; } else if (is_word(line, "inparallel", &nextword)) { engine->inparallel = TRUE; } else if (is_word(line, "minwidth ", &nextword)) { engine->minwidth = atof(nextword); } else if (is_word(line, "maxwidth ", &nextword)) { engine->maxwidth = atof(nextword); } else if (is_word(line, "cpulimit ", &nextword)) { engine->cpulimit = atof(nextword); } else if (is_word(line, "depths ", &nextword)) { if (parse_depth_string(engine->default_depths, nextword)) { rtn = -1; goto done; } } else if (is_word(line, "add_path ", &nextword)) { engine_add_search_path(engine, nextword); } else { ERROR("Didn't understand this config file line: \"%s\"", line); // unknown config line is a firing offense rtn = -1; goto done; } } for (i=0; i<sl_size(indices); i++) { char* ind = sl_get(indices, i); char* path; logverb("Trying index %s...\n", ind); path = engine_find_index(engine, ind); if (!path) { logmsg("Couldn't find index \"%s\".\n", ind); rtn = -1; goto done; } if (engine_add_index(engine, path)) logmsg("Failed to add index \"%s\".\n", path); free(path); } for (i=0; i<sl_size(mindices); i++) { char* ind = sl_get(mindices, i); char* path; char* skdt; char* skdtpath; int j; sl* words = sl_split(NULL, ind, " "); multiindex_t* mi; if (sl_size(words) < 2) { logmsg("Config line 'multiindex' must be followed by skdt and inds\n"); rtn = -1; goto done; } skdt = sl_get(words, 0); sl_remove(words, 0); { char* s = sl_join(words, " / "); logverb("Trying multi-index %s + %s...\n", skdt, s); free(s); } skdtpath = engine_find_index(engine, skdt); if (!skdtpath) { logmsg("Couldn't find skdt \"%s\".\n", skdt); rtn = -1; goto done; } for (j=0; j<sl_size(words); j++) { ind = sl_get(words, j); path = engine_find_index(engine, ind); if (!path) { logmsg("Couldn't find index \"%s\".\n", path); rtn = -1; goto done; } sl_set(words, j, path); // sl_set makes a copy. free(path); } mi = multiindex_open(skdtpath, words, 0); if (!mi) { char* s = sl_join(words, " / "); logerr("Failed to open multiindex: %s + %s\n", skdt, s); free(s); rtn = -1; goto done; } for (j=0; j<multiindex_n(mi); j++) { index_t* ind = multiindex_get(mi, j); if (add_index(engine, ind)) { ERROR("Failed to add index \"%s\"", sl_get(words, j)); return -1; } } pl_append(engine->free_mindexes, mi); sl_free2(words); free(skdt); free(skdtpath); } if (auto_index) { engine_autoindex_search_paths(engine); } done: sl_free2(indices); sl_free2(mindices); return rtn; } static job_t* job_new() { job_t* job = calloc(1, sizeof(job_t)); if (!job) { SYSERROR("Failed to allocate a new job_t."); return NULL; } job->scales = dl_new(8); job->depths = il_new(8); return job; } void job_free(job_t* job) { if (!job) return; dl_free(job->scales); il_free(job->depths); free(job); } static double job_imagew(job_t* job) { return job->bp.solver.field_maxx; } static double job_imageh(job_t* job) { return job->bp.solver.field_maxy; } int engine_run_job(engine_t* engine, job_t* job) { blind_t* bp = &(job->bp); solver_t* sp = &(bp->solver); int i; double app_min_default; double app_max_default; anbool solved = FALSE; if (blind_is_run_obsolete(bp, sp)) { goto finish; } app_min_default = deg2arcsec(engine->minwidth) / job_imagew(job); app_max_default = deg2arcsec(engine->maxwidth) / job_imagew(job); if (engine->inparallel) bp->indexes_inparallel = TRUE; if (job->use_radec_center) { logmsg("Only searching for solutions within %g degrees of RA,Dec (%g,%g)\n", job->search_radius, job->ra_center, job->dec_center); solver_set_radec(sp, job->ra_center, job->dec_center, job->search_radius); } for (i=0; i<il_size(job->depths)/2; i++) { int startobj = il_get(job->depths, i*2); int endobj = il_get(job->depths, i*2+1); int j; if (startobj || endobj) { // make depth ranges be inclusive. endobj++; // up to this point they are 1-indexed, but with default value // zero; blind uses 0-indexed. if (startobj) startobj--; if (endobj) endobj--; } for (j=0; j<dl_size(job->scales) / 2; j++) { double fmin, fmax; double app_max, app_min; int k; il* indexlist; // arcsec per pixel range app_min = dl_get(job->scales, j * 2); app_max = dl_get(job->scales, j * 2 + 1); if (app_min == 0.0) app_min = app_min_default; if (app_max == 0.0) app_max = app_max_default; sp->funits_lower = app_min; sp->funits_upper = app_max; sp->startobj = startobj; if (endobj) sp->endobj = endobj; // minimum quad size to try (in pixels) sp->quadsize_min = bp->quad_size_fraction_lo * MIN(job_imagew(job), job_imageh(job)); // range of quad sizes that could be found in the field, // in arcsec. // the hypotenuse... fmax = bp->quad_size_fraction_hi * hypot(job_imagew(job), job_imageh(job)) * app_max; fmin = sp->quadsize_min * app_min; // Select the indices that should be checked. indexlist = il_new(16); for (k = 0; k < pl_size(engine->indexes); k++) { index_t* index = pl_get(engine->indexes, k); if (!index_overlaps_scale_range(index, fmin, fmax)) continue; il_append(indexlist, k); } // Use the (list of) smallest or largest indices if no other one fits. if (!il_size(indexlist)) { il* list = NULL; if (fmin > engine->sizebiggest) { list = engine->ibiggest; } else if (fmax < engine->sizesmallest) { list = engine->ismallest; } else { assert(0); } il_append_list(indexlist, list); } for (k=0; k<il_size(indexlist); k++) { int ii = il_get(indexlist, k); index_t* index = pl_get(engine->indexes, ii); anbool inrange = TRUE; if (job->use_radec_center) inrange = index_is_within_range(index, job->ra_center, job->dec_center, job->search_radius); if (!inrange) { logverb("Not using index %s because it's not within %g degrees of (RA,Dec) = (%g,%g)\n", index->indexname, job->search_radius, job->ra_center, job->dec_center); continue; } add_index_to_blind(engine, bp, ii); } il_free(indexlist); logverb("Running blind solver:\n"); blind_log_run_parameters(bp); blind_run(bp); // we only want to try using the verify_wcses the first time. blind_clear_verify_wcses(bp); blind_clear_indexes(bp); blind_clear_solutions(bp); blind_clear_indexes(bp); solver_clear_indexes(sp); if (blind_is_run_obsolete(bp, sp)) { solved = TRUE; break; } } if (solved) break; } logverb("cx<=dx constraints: %i\n", sp->num_cxdx_skipped); logverb("meanx constraints: %i\n", sp->num_meanx_skipped); logverb("RA,Dec constraints: %i\n", sp->num_radec_skipped); logverb("AB scale constraints: %i\n", sp->num_abscale_skipped); finish: solver_cleanup(sp); blind_cleanup(bp); return 0; } static void parse_sip_coeffs(const qfits_header* hdr, const char* prefix, sip_t* wcs) { char key[64]; int order, i, j; sprintf(key, "%sSAO", prefix); order = qfits_header_getint(hdr, key, -1); if (order >= 2) { if (order > 9) order = 9; wcs->a_order = order; wcs->b_order = order; for (i=0; i<=order; i++) { for (j=0; (i+j)<=order; j++) { if (i+j < 1) continue; sprintf(key, "%sA%i%i", prefix, i, j); wcs->a[i][j] = qfits_header_getdouble(hdr, key, 0.0); sprintf(key, "%sB%i%i", prefix, i, j); wcs->b[i][j] = qfits_header_getdouble(hdr, key, 0.0); } } } sprintf(key, "%sSAPO", prefix); order = qfits_header_getint(hdr, key, -1); if (order >= 2) { if (order > 9) order = 9; wcs->ap_order = order; wcs->bp_order = order; for (i=0; i<=order; i++) { for (j=0; (i+j)<=order; j++) { if (i+j < 1) continue; sprintf(key, "%sAP%i%i", prefix, i, j); wcs->ap[i][j] = qfits_header_getdouble(hdr, key, 0.0); sprintf(key, "%sBP%i%i", prefix, i, j); wcs->bp[i][j] = qfits_header_getdouble(hdr, key, 0.0); } } } } static anbool parse_job_from_qfits_header(const qfits_header* hdr, job_t* job) { blind_t* bp = &(job->bp); solver_t* sp = &(bp->solver); double dnil = -HUGE_VAL; char *pstr; int n; anbool run; anbool default_tweak = TRUE; int default_tweakorder = 2; double default_odds_toprint = 1e6; double default_odds_tokeep = 1e9; double default_odds_tosolve = 1e9; double default_odds_totune = 1e6; //double default_image_fraction = 1.0; char* fn; double val; char pretty[FITS_LINESZ+1]; blind_init(bp); // must be in this order because init_parameters handily zeros out sp solver_set_default_values(sp); // Here we assume that the field's pixel coordinataes go from zero to IMAGEW,H. sp->field_maxx = qfits_header_getdouble(hdr, "IMAGEW", dnil); sp->field_maxy = qfits_header_getdouble(hdr, "IMAGEH", dnil); if ((sp->field_maxx == dnil) || (sp->field_maxy == dnil) || (sp->field_maxx <= 0.0) || (sp->field_maxy <= 0.0)) { logerr("Must specify positive \"IMAGEW\" and \"IMAGEH\".\n"); goto bailout; } sp->verify_uniformize = qfits_header_getboolean(hdr, "ANVERUNI", sp->verify_uniformize); sp->verify_dedup = qfits_header_getboolean(hdr, "ANVERDUP", sp->verify_dedup); val = qfits_header_getdouble(hdr, "ANPOSERR", 0.0); if (val > 0.0) sp->verify_pix = val; val = qfits_header_getdouble(hdr, "ANCTOL", 0.0); if (val > 0.0) sp->codetol = val; val = qfits_header_getdouble(hdr, "ANDISTR", 0.0); if (val > 0.0) sp->distractor_ratio = val; blind_set_solvedout_file (bp, fn=fits_get_long_string(hdr, "ANSOLVED")); free(fn); blind_set_solvedin_file (bp, fn=fits_get_long_string(hdr, "ANSOLVIN")); free(fn); blind_set_match_file (bp, fn=fits_get_long_string(hdr, "ANMATCH" )); free(fn); blind_set_rdls_file (bp, fn=fits_get_long_string(hdr, "ANRDLS" )); free(fn); blind_set_scamp_file (bp, fn=fits_get_long_string(hdr, "ANSCAMP" )); free(fn); blind_set_wcs_file (bp, fn=fits_get_long_string(hdr, "ANWCS" )); free(fn); blind_set_corr_file (bp, fn=fits_get_long_string(hdr, "ANCORR" )); free(fn); blind_set_cancel_file (bp, fn=fits_get_long_string(hdr, "ANCANCEL")); free(fn); blind_set_xcol(bp, fn=fits_get_dupstring(hdr, "ANXCOL")); free(fn); blind_set_ycol(bp, fn=fits_get_dupstring(hdr, "ANYCOL")); free(fn); bp->timelimit = qfits_header_getint(hdr, "ANTLIM", 0); bp->cpulimit = qfits_header_getdouble(hdr, "ANCLIM", 0.0); bp->logratio_tosolve = log(qfits_header_getdouble(hdr, "ANODDSSL", default_odds_tosolve)); logverb("Set odds ratio to solve to %g (log = %g)\n", exp(bp->logratio_tosolve), bp->logratio_tosolve); sp->logratio_toprint = log(qfits_header_getdouble(hdr, "ANODDSPR", default_odds_toprint)); sp->logratio_tokeep = log(qfits_header_getdouble(hdr, "ANODDSKP", default_odds_tokeep)); sp->logratio_totune = log(qfits_header_getdouble(hdr, "ANODDSTU", default_odds_totune)); sp->logratio_bail_threshold = log(qfits_header_getdouble(hdr, "ANODDSBL", DEFAULT_BAIL_THRESHOLD)); val = qfits_header_getdouble(hdr, "ANODDSST", 0.0); if (val > 0.0) sp->logratio_stoplooking = log(val); bp->best_hit_only = TRUE; // gotta keep it to solve it! sp->logratio_tokeep = MIN(sp->logratio_tokeep, bp->logratio_tosolve); // gotta print it to keep it (so what if that doesn't make sense)! sp->logratio_toprint = MIN(sp->logratio_toprint, sp->logratio_tokeep); // job->image_fraction = qfits_header_getdouble(hdr, "ANIMFRAC", job->image_fraction); job->include_default_scales = qfits_header_getboolean(hdr, "ANAPPDEF", 0); sp->parity = PARITY_BOTH; pstr = qfits_pretty_string_r(qfits_header_getstr(hdr, "ANPARITY"), pretty); if (pstr && streq(pstr, "NEG")) sp->parity = PARITY_FLIP; else if (pstr && streq(pstr, "POS")) sp->parity = PARITY_NORMAL; sp->set_crpix_center = qfits_header_getboolean(hdr, "ANCRPIXC", FALSE); sp->crpix[0] = qfits_header_getint(hdr, "ANCRPIX1", sp->crpix[0]); sp->crpix[1] = qfits_header_getint(hdr, "ANCRPIX2", sp->crpix[1]); sp->set_crpix = (sp->set_crpix_center || // were the values set? qfits_header_getstr(hdr, "ANCRPIX1") || qfits_header_getstr(hdr, "ANCRPIX2")); if (qfits_header_getboolean(hdr, "ANTWEAK", default_tweak)) { int order = qfits_header_getint(hdr, "ANTWEAKO", default_tweakorder); //bp->do_tweak = TRUE; sp->do_tweak = TRUE; sp->tweak_aborder = order; sp->tweak_abporder = order; } if (!sp->do_tweak) { // No tweak: set tweak order to linear, because the tweak alg // can still be invoked via tune-up. sp->tweak_aborder = sp->tweak_abporder = 1; } val = qfits_header_getdouble(hdr, "ANQSFMIN", 0.0); if (val > 0.0) bp->quad_size_fraction_lo = val; val = qfits_header_getdouble(hdr, "ANQSFMAX", 0.0); if (val > 0.0) bp->quad_size_fraction_hi = val; job->ra_center = qfits_header_getdouble(hdr, "ANERA", HUGE_VAL); job->dec_center = qfits_header_getdouble(hdr, "ANEDEC", HUGE_VAL); job->search_radius = qfits_header_getdouble(hdr, "ANERAD", HUGE_VAL); job->use_radec_center = ((job->ra_center != HUGE_VAL) && (job->dec_center != HUGE_VAL) && (job->search_radius != HUGE_VAL)); // tag-along columns bp->rdls_tagalong_all = qfits_header_getboolean(hdr, "ANTAGALL", FALSE); if (!bp->rdls_tagalong_all) { n = 1; while (1) { char key[64]; char* val; sprintf(key, "ANTAG%i", n); val = fits_get_dupstring(hdr, key); if (!val) break; if (!bp->rdls_tagalong) bp->rdls_tagalong = sl_new(16); sl_append_nocopy(bp->rdls_tagalong, val); n++; } } // sort RDLS column bp->sort_rdls = fits_get_dupstring(hdr, "ANRDSORT"); n = 1; while (1) { char key[64]; double lo, hi; sprintf(key, "ANAPPL%i", n); lo = qfits_header_getdouble(hdr, key, dnil); sprintf(key, "ANAPPU%i", n); hi = qfits_header_getdouble(hdr, key, dnil); if ((hi == dnil) && (lo == dnil)) break; if ((lo != dnil) && (hi != dnil)) { if ((lo < 0) || (lo > hi)) { logerr("Scale range %g to %g is invalid: min must be >= 0, max must be >= min.\n", lo, hi); goto bailout; } } if (hi == dnil) hi = 0.0; if (lo == dnil) lo = 0.0; dl_append(job->scales, lo); dl_append(job->scales, hi); n++; } n = 1; while (1) { char key[64]; int dlo, dhi; sprintf(key, "ANDPL%i", n); dlo = qfits_header_getint(hdr, key, 0); sprintf(key, "ANDPU%i", n); dhi = qfits_header_getint(hdr, key, 0); if (dlo == 0 && dhi == 0) break; if ((dlo < 1) || (dlo > dhi)) { logerr("Depth range %i to %i is invalid: min must be >= 1, max must be >= min.\n", dlo, dhi); goto bailout; } il_append(job->depths, dlo); il_append(job->depths, dhi); n++; } n = 1; while (1) { char lokey[64]; char hikey[64]; int lo, hi; sprintf(lokey, "ANFDL%i", n); lo = qfits_header_getint(hdr, lokey, -1); if (lo == -1) break; sprintf(hikey, "ANFDU%i", n); hi = qfits_header_getint(hdr, hikey, -1); if (hi == -1) break; if ((lo <= 0) || (lo > hi)) { char pretty1[FITS_LINESZ+1]; char pretty2[FITS_LINESZ+1]; logerr("Field range %i to %i is invalid: min must be >= 1, max must be >= min.\n", lo, hi); qfits_pretty_string_r(qfits_header_getstr(hdr, lokey), pretty1); qfits_pretty_string_r(qfits_header_getstr(hdr, hikey), pretty2); logmsg(" (FITS headers: \"%s = %s\", \"%s = %s\")\n", lokey, pretty1, hikey, pretty2); goto bailout; } blind_add_field_range(bp, lo, hi); n++; } n = 1; while (1) { char key[64]; int fld; sprintf(key, "ANFD%i", n); fld = qfits_header_getint(hdr, key, -1); if (fld == -1) break; if (fld <= 0) { qfits_pretty_string_r(qfits_header_getstr(hdr, key), pretty); logerr("Field %i is invalid: must be >= 1. (FITS header: \"%s = %s\")\n", fld, key, pretty); goto bailout; } blind_add_field(bp, fld); n++; } n = 1; while (1) { char key[64]; sip_t wcs; char* keys[] = { "ANW%iPIX1", "ANW%iPIX2", "ANW%iVAL1", "ANW%iVAL2", "ANW%iCD11", "ANW%iCD12", "ANW%iCD21", "ANW%iCD22" }; double* vals[] = { &(wcs.wcstan. crval[0]), &(wcs.wcstan.crval[1]), &(wcs.wcstan.crpix[0]), &(wcs.wcstan.crpix[1]), &(wcs.wcstan.cd[0][0]), &(wcs.wcstan.cd[0][1]), &(wcs.wcstan.cd[1][0]), &(wcs.wcstan.cd[1][1]) }; int j; int bail = 0; memset(&wcs, 0, sizeof(wcs)); for (j = 0; j < 8; j++) { sprintf(key, keys[j], n); *(vals[j]) = qfits_header_getdouble(hdr, key, dnil); if (*(vals[j]) == dnil) { bail = 1; break; } } if (bail) break; // SIP terms sprintf(key, "ANW%i", n); parse_sip_coeffs(hdr, key, &wcs); sip_ensure_inverse_polynomials(&wcs); blind_add_verify_wcs(bp, &wcs); n++; } // Distortion to apply before matching... do { sip_t dsip; double p0, p1; memset(&dsip, 0, sizeof(sip_t)); p0 = qfits_header_getdouble(hdr, "ANDPIX0", dnil); if (p0 == dnil) break; p1 = qfits_header_getdouble(hdr, "ANDPIX1", dnil); if (p1 == dnil) break; dsip.wcstan.crpix[0] = p0; dsip.wcstan.crpix[1] = p1; parse_sip_coeffs(hdr, "AND", &dsip); if ((dsip.a_order > 1 && dsip.b_order > 1) || (dsip.ap_order > 1 && dsip.bp_order > 1)) { sp->predistort = malloc(sizeof(sip_t)); memcpy(sp->predistort, &dsip, sizeof(sip_t)); } } while (0); run = qfits_header_getboolean(hdr, "ANRUN", FALSE); // Default: solve first field. if (run && !il_size(bp->fieldlist)) { blind_add_field(bp, 1); } return TRUE; bailout: return FALSE; } engine_t* engine_new() { engine_t* engine = calloc(1, sizeof(engine_t)); engine->index_paths = sl_new(10); engine->indexes = pl_new(16); engine->free_indexes = pl_new(16); engine->free_mindexes = pl_new(16); engine->ismallest = il_new(4); engine->ibiggest = il_new(4); engine->default_depths = il_new(4); engine->sizesmallest = HUGE_VAL; engine->sizebiggest = -HUGE_VAL; // Default scale estimate: field width, in degrees: engine->minwidth = 0.1; engine->maxwidth = 180.0; engine->cpulimit = 600.0; return engine; } void engine_free(engine_t* engine) { int i; if (!engine) return; if (engine->free_indexes) { for (i=0; i<pl_size(engine->free_indexes); i++) { index_t* ind = pl_get(engine->free_indexes, i); index_free(ind); } pl_free(engine->free_indexes); } if (engine->free_mindexes) { for (i=0; i<pl_size(engine->free_mindexes); i++) { multiindex_t* mi = pl_get(engine->free_mindexes, i); multiindex_free(mi); } pl_free(engine->free_mindexes); } pl_free(engine->indexes); if (engine->ismallest) il_free(engine->ismallest); if (engine->ibiggest) il_free(engine->ibiggest); if (engine->default_depths) il_free(engine->default_depths); if (engine->index_paths) sl_free2(engine->index_paths); free(engine); } job_t* engine_read_job_file(engine_t* engine, const char* jobfn) { qfits_header* hdr; job_t* job; blind_t* bp; // Read primary header. hdr = anqfits_get_header2(jobfn, 0); if (!hdr) { ERROR("Failed to parse FITS header from file \"%s\"", jobfn); return NULL; } job = job_new(); if (!parse_job_from_qfits_header(hdr, job)) { job_free(job); qfits_header_destroy(hdr); return NULL; } qfits_header_destroy(hdr); bp = &(job->bp); blind_set_field_file(bp, jobfn); // If the job has no scale estimate, search everything provided // by the engine if (!dl_size(job->scales) || job->include_default_scales) { double arcsecperpix; arcsecperpix = deg2arcsec(engine->minwidth) / job_imagew(job); dl_append(job->scales, arcsecperpix); arcsecperpix = deg2arcsec(engine->maxwidth) / job_imagew(job); dl_append(job->scales, arcsecperpix); } // The job can only decrease the CPU limit. if ((bp->cpulimit == 0.0) || bp->cpulimit > engine->cpulimit) { logverb("Decreasing CPU time limit to the engine's limit of %g seconds\n", engine->cpulimit); bp->cpulimit = engine->cpulimit; } // If not running inparallel, set total limits = limits. if (!engine->inparallel) { bp->total_timelimit = bp->timelimit; bp->total_cpulimit = bp->cpulimit ; } // If the job didn't specify depths, set defaults. if (il_size(job->depths) == 0) { if (engine->inparallel) { // no limit. il_append(job->depths, 0); il_append(job->depths, 0); } else il_append_list(job->depths, engine->default_depths); } if (engine->cancelfn) blind_set_cancel_file(bp, engine->cancelfn); if (engine->solvedfn) blind_set_solved_file(bp, engine->solvedfn); return job; } void job_set_cancel_file(job_t* job, const char* fn) { blind_set_cancel_file(&(job->bp), fn); } void job_set_solved_file(job_t* job, const char* fn) { blind_set_solved_file(&(job->bp), fn); } // Modify all filenames to be relative to "dir". int job_set_base_dir(job_t* job, const char* dir) { return job_set_output_base_dir(job, dir) || job_set_input_base_dir(job, dir); } int job_set_input_base_dir(job_t* job, const char* dir) { char* path; blind_t* bp = &(job->bp); logverb("Changing input file base dir to %s\n", dir); if (bp->fieldfname) { path = resolve_path(bp->fieldfname, dir); logverb("Changing %s to %s\n", bp->fieldfname, path); blind_set_field_file(bp, path); } return 0; } int job_set_output_base_dir(job_t* job, const char* dir) { char* path; blind_t* bp = &(job->bp); logverb("Changing output file base dir to %s\n", dir); if (bp->cancelfname) { path = resolve_path(bp->cancelfname, dir); logverb("Cancel file was %s, changing to %s.\n", bp->cancelfname, path); blind_set_cancel_file(bp, path); } if (bp->solved_in) { path = resolve_path(bp->solved_in, dir); logverb("Changing %s to %s\n", bp->solved_in, path); blind_set_solvedin_file(bp, path); } if (bp->solved_out) { path = resolve_path(bp->solved_out, dir); logverb("Changing %s to %s\n", bp->solved_out, path); blind_set_solvedout_file(bp, path); } if (bp->matchfname) { path = resolve_path(bp->matchfname, dir); logverb("Changing %s to %s\n", bp->matchfname, path); blind_set_match_file(bp, path); } if (bp->indexrdlsfname) { path = resolve_path(bp->indexrdlsfname, dir); logverb("Changing %s to %s\n", bp->indexrdlsfname, path); blind_set_rdls_file(bp, path); } if (bp->scamp_fname) { path = resolve_path(bp->scamp_fname, dir); logverb("Changing %s to %s\n", bp->scamp_fname, path); blind_set_scamp_file(bp, path); } if (bp->corr_fname) { path = resolve_path(bp->corr_fname, dir); logverb("Changing %s to %s\n", bp->corr_fname, path); blind_set_corr_file(bp, path); } if (bp->wcs_template) { path = resolve_path(bp->wcs_template, dir); logverb("Changing %s to %s\n", bp->wcs_template, path); blind_set_wcs_file(bp, path); } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fits-guess-scale-main.c���������������������������������������������������000644 �000765 �000024 �00000002346 12651445460 022127� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include "fits-guess-scale.h" #include "fitsioutils.h" #include "log.h" static char* OPTIONS = "hv"; static void printHelp(char* progname) { printf("%s <FITS-file>\n\n", progname); } int main(int argc, char *argv[]) { char* progname = argv[0]; int argchar; char* infn; sl* methods = NULL; dl* scales = NULL; int i; int loglvl = LOG_MSG; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case '?': case 'h': printHelp(progname); return 0; case 'v': loglvl++; break; default: return -1; } if (optind != (argc - 1)) { printHelp(progname); exit(-1); } infn = argv[optind]; log_init(loglvl); fits_use_error_system(); if (fits_guess_scale(infn, &methods, &scales)) exit(-1); for (i=0; i<sl_size(methods); i++) { printf("scale %s %g\n", sl_get(methods, i), dl_get(scales, i)); } sl_free2(methods); dl_free(scales); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fits-guess-scale.c��������������������������������������������������������000644 �000765 �000024 �00000006677 12651445460 021220� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include "os-features.h" #include "fits-guess-scale.h" #include "anqfits.h" #include "sip.h" #include "sip_qfits.h" #include "starutil.h" #include "errors.h" #include "log.h" int fits_guess_scale(const char* infn, sl** p_methods, dl** p_scales) { qfits_header* hdr; hdr = anqfits_get_header2(infn, 0); if (!hdr) { ERROR("Failed to read FITS header"); return -1; } fits_guess_scale_hdr(hdr, p_methods, p_scales); qfits_header_destroy(hdr); return 0; } static void addscale(sl* methods, dl* scales, const char* method, double scale) { if (methods) sl_append(methods, method); if (scales) dl_append(scales, scale); } void fits_guess_scale_hdr(const qfits_header* hdr, sl** p_methods, dl** p_scales) { sip_t sip; double val; anbool gotsip = FALSE; char* errstr; sl* methods = NULL; dl* scales = NULL; if (p_methods) { if (!*p_methods) *p_methods = sl_new(4); methods = *p_methods; } if (p_scales) { if (!*p_scales) *p_scales = dl_new(4); scales = *p_scales; } memset(&sip, 0, sizeof(sip_t)); errors_start_logging_to_string(); if (sip_read_header(hdr, &sip)) { val = sip_pixel_scale(&sip); if (val != 0.0) { addscale(methods, scales, "sip", val); gotsip = TRUE; } } errstr = errors_stop_logging_to_string("\n "); logverb("fits-guess-scale: failed to read SIP/TAN header:\n %s\n", errstr); free(errstr); if (!gotsip) { // it might have a correct CD matrix but be missing other parts (eg CRVAL) double cd11, cd12, cd21, cd22; double errval = -HUGE_VAL; cd11 = qfits_header_getdouble(hdr, "CD1_1", errval); cd12 = qfits_header_getdouble(hdr, "CD1_2", errval); cd21 = qfits_header_getdouble(hdr, "CD2_1", errval); cd22 = qfits_header_getdouble(hdr, "CD2_2", errval); if ((cd11 != errval) && (cd12 != errval) && (cd21 != errval) && (cd22 != errval)) { val = cd11 * cd22 - cd12 * cd21; if (val != 0.0) addscale(methods, scales, "cd", sqrt(fabs(val))); } } val = qfits_header_getdouble(hdr, "PIXSCALE", -1.0); if (val != -1.0) addscale(methods, scales, "pixscale", val); /* Why all this? val = qfits_header_getdouble(hdr, "PIXSCAL1", -1.0); if (val != -1.0) { if (val != 0.0) { printf("scale pixscal1 %g\n", val); } else { val = atof(qfits_pretty_string(qfits_header_getstr(hdr, "PIXSCAL1"))); if (val != 0.0) { printf("scale pixscal1 %g\n", val); } } } */ val = qfits_header_getdouble(hdr, "PIXSCAL1", 0.0); if (val != 0.0) addscale(methods, scales, "pixscal1", val); val = qfits_header_getdouble(hdr, "PIXSCAL2", 0.0); if (val != 0.0) addscale(methods, scales, "pixscal2", val); val = qfits_header_getdouble(hdr, "PLATESC", 0.0); if (val != 0.0) addscale(methods, scales, "platesc", val); val = qfits_header_getdouble(hdr, "CCDSCALE", 0.0); if (val != 0.0) addscale(methods, scales, "ccdscale", val); val = qfits_header_getdouble(hdr, "CDELT1", 0.0); if (val != 0.0) addscale(methods, scales, "cdelt1", 3600.0 * fabs(val)); } �����������������������������������������������������������������astrometry.net-0.67/blind/fitscopy.c����������������������������������������������������������������000644 �000765 �000024 �00000006275 12651445460 017674� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *infptr, *outfptr; /* FITS file pointers defined in fitsio.h */ int status = 0, ii = 1; /* status must always be initialized = 0 */ if (argc != 3) { printf("Usage: fitscopy inputfile outputfile\n"); printf("\n"); printf("Copy an input file to an output file, optionally filtering\n"); printf("the file in the process. This seemingly simple program can\n"); printf("apply powerful filters which transform the input file as\n"); printf("it is being copied. Filters may be used to extract a\n"); printf("subimage from a larger image, select rows from a table,\n"); printf("filter a table with a GTI time extension or a SAO region file,\n"); printf("create or delete columns in a table, create an image by\n"); printf("binning (histogramming) 2 table columns, and convert IRAF\n"); printf("format *.imh or raw binary data files into FITS images.\n"); printf("See the CFITSIO User's Guide for a complete description of\n"); printf("the Extended File Name filtering syntax.\n"); printf("\n"); printf("Examples:\n"); printf("\n"); printf("fitscopy in.fit out.fit (simple file copy)\n"); printf("fitscopy - - (stdin to stdout)\n"); printf("fitscopy in.fit[11:50,21:60] out.fit (copy a subimage)\n"); printf("fitscopy iniraf.imh out.fit (IRAF image to FITS)\n"); printf("fitscopy in.dat[i512,512] out.fit (raw array to FITS)\n"); printf("fitscopy in.fit[events][pi>35] out.fit (copy rows with pi>35)\n"); printf("fitscopy in.fit[events][bin X,Y] out.fit (bin an image) \n"); printf("fitscopy in.fit[events][col x=.9*y] out.fit (new x column)\n"); printf("fitscopy in.fit[events][gtifilter()] out.fit (time filter)\n"); printf("fitscopy in.fit[2][regfilter(\"pow.reg\")] out.fit (spatial filter)\n"); printf("\n"); printf("Note that it may be necessary to enclose the input file name\n"); printf("in single quote characters on the Unix command line.\n"); return(0); } /* Open the input file */ if ( !fits_open_file(&infptr, argv[1], READONLY, &status) ) { /* Create the output file */ if ( !fits_create_file(&outfptr, argv[2], &status) ) { /* Copy every HDU until we get an error */ while( !fits_movabs_hdu(infptr, ii++, NULL, &status) ) fits_copy_hdu(infptr, outfptr, 0, &status); /* Reset status after normal error */ if (status == END_OF_FILE) status = 0; fits_close_file(outfptr, &status); } fits_close_file(infptr, &status); } /* if error occured, print out error message */ if (status) fits_report_error(stderr, status); return(status); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fitsverify.c��������������������������������������������������������������000644 �000765 �000024 �00000025762 12651445460 020230� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include <stdio.h> #include <string.h> #include "fverify.h" /* prototypes for PIL interface routines, that are not actually needed for this standalone version of fverify */ #define PIL_LINESIZE 1024 int PILGetFname(char *parname, char *filename); int PILGetString(char *parname, char *stringname); int PILGetBool(char *parname, int *intvalue); int PILPutInt(char *parname, int intvalue); int ftverify_work (char *infile, char *outfile,int prehead, int prstat, char* errreport, int testdata, int testcsum, int testfill, int heasarc_conv); /* This file contains the main fverify routine, and dummy version of various other headas system routines. This is used for the stand alone version of fverify. */ int main(int argc, char *argv[]) { int status = 0, invalid = 0, ii, file1 = 0; char *filename, errormode[2] = {"w"}; if (argc == 2 && !strcmp(argv[1],"-h")) { printf("fitsverify -- Verify that the input files conform to the FITS Standard.\n"); printf("\n"); printf("USAGE: fitsverify filename ... - verify one or more FITS files\n"); printf(" (may use wildcard characters)\n"); printf(" or fitsverify @filelist.txt - verify a list of FITS files\n"); printf(" \n"); printf(" Optional flags:\n"); printf(" -l list all header keywords\n"); printf(" -q quiet; print one-line pass/fail summary per file\n"); printf(" -e only test for error conditions (ignore warnings)\n"); printf(" \n"); printf(" fitsverify exits with a status equal to the number of errors + warnings.\n"); printf(" \n"); printf("EXAMPLES:\n"); printf(" fitsverify -l m101.fits - produce a detailed verificaton report of\n"); printf(" a single file, including a keyword listing\n"); printf(" fitsverify -q *.fits *.fit - verify all files with .fits or .fit\n"); printf(" extensions, writing a 1-line pass/fail\n"); printf(" message for each file\n"); printf(" \n"); printf("DESCRIPTION:\n"); printf(" \n"); printf(" This task reads one or more input FITS files and verifies that the\n"); printf(" files conform to the specifications of the FITS Standard, Definition\n"); printf(" of the Flexible Image Transport System (FITS), Version 3.0, available"); printf(" online at http://fits.gsfc.nasa.gov/. The input filename template may\n"); printf(" contain wildcard characters, in which case all matching files will be \n"); printf(" tested. Alternatively, the name of an ASCII text file containing a list\n"); printf(" of file names, one per line, may be entered preceded by an '@' character.\n"); printf(" The following error or warning conditions will be reported:\n"); printf(" \n"); printf(" ERROR CONDITIONS\n"); printf(" \n"); printf(" - Mandatory keyword not present or out of order\n"); printf(" - Mandatory keyword has wrong datatype or illegal value\n"); printf(" - END header keyword is not present\n"); printf(" - Sum of table column widths is inconsistent with NAXIS1 value\n"); printf(" - BLANK keyword present in image with floating-point datatype\n"); printf(" - TNULLn keyword present for floating-point binary table column\n"); printf(" - Bit column has non-zero fill bits or is not left adjusted \n"); printf(" - ASCII TABLE column contains illegal value inconsistent with TFORMn\n"); printf(" - Address to a variable length array not within the data heap \n"); printf(" - Extraneous bytes in the FITS file following the last HDU \n"); printf(" - Mandatory keyword values not expressed in fixed format\n"); printf(" - Mandatory keyword duplicated elsewhere in the header\n"); printf(" - Header contains illegal ASCII character (not ASCII 32 - 126)\n"); printf(" - Keyword name contains illegal character\n"); printf(" - Keyword value field has illegal format\n"); printf(" - Value and comment fields not separated by a slash character\n"); printf(" - END keyword not filled with blanks in columns 9 - 80\n"); printf(" - Reserved keyword with wrong datatype or illegal value\n"); printf(" - XTENSION keyword in the primary array\n"); printf(" - Column related keyword (TFIELDS, TTYPEn,TFORMn, etc.) in an image\n"); printf(" - SIMPLE, EXTEND, or BLOCKED keyword in any extension\n"); printf(" - BSCALE, BZERO, BUNIT, BLANK, DATAMAX, DATAMIN keywords in a table\n"); printf(" - Table WCS keywords (TCTYPn, TCRPXn, TCRVLn, etc.) in an image\n"); printf(" - TDIMn or THEAP keyword in an ASCII table \n"); printf(" - TBCOLn keyword in a Binary table\n"); printf(" - THEAP keyword in a binary table that has PCOUNT = 0 \n"); printf(" - XTENSION, TFORMn, TDISPn or TDIMn value contains leading space(s)\n"); printf(" - WCSAXES keyword appears after other WCS keywords\n"); printf(" - Index of any WCS keyword (CRPIXn, CRVALn, etc.) greater than \n"); printf(" value of WCSAXES\n"); printf(" - Index of any table column descriptor keyword (TTYPEn, TFORMn,\n"); printf(" etc.) greater than value of TFIELDS\n"); printf(" - TSCALn or TZEROn present for an ASCII, logical, or Bit column\n"); printf(" - TDISPn value is inconsistent with the column datatype \n"); printf(" - Length of a variable length array greater than the maximum \n"); printf(" length as given by the TFORMn keyword\n"); printf(" - ASCII table floating-point column value does not have decimal point(*)\n"); printf(" - ASCII table numeric column value has embedded space character\n"); printf(" - Logical column contains illegal value not equal to 'T', 'F', or 0\n"); printf(" - Character string column contains non-ASCII text character\n"); printf(" - Header fill bytes not all blanks\n"); printf(" - Data fill bytes not all blanks in ASCII tables or all zeros \n"); printf(" in any other type of HDU \n"); printf(" - Gaps between defined ASCII table columns contain characters with\n"); printf(" ASCII value > 127\n"); printf(" \n"); printf(" WARNING CONDITIONS\n"); printf(" \n"); printf(" - SIMPLE = F\n"); printf(" - Presence of deprecated keywords BLOCKED or EPOCH\n"); printf(" - 2 HDUs have identical EXTNAME, EXTVER, and EXTLEVEL values\n"); printf(" - BSCALE or TSCALn value = 0.\n"); printf(" - BLANK OR TNULLn value exceeds the legal range\n"); printf(" - TFORMn has 'rAw' format and r is not a multiple of w\n"); printf(" - DATE = 'dd/mm/yy' and yy is less than 10 (Y2K problem?)\n"); printf(" - Index of any WCS keyword (CRPIXn, CRVALn, etc.) greater than\n"); printf(" value of NAXIS, if the WCSAXES keyword is not present\n"); printf(" - Duplicated keyword (except COMMENT, HISTORY, blank, etc.)\n"); printf(" - Column name (TTYPEn) does not exist or contains characters \n"); printf(" other than letter, digit and underscore\n"); printf(" - Calculated checksum inconsistent with CHECKSUM or DATASUM keyword\n"); printf(" \n"); printf(" This is the stand alone version of the FTOOLS 'fverify' program. It is\n"); printf(" maintained by the HEASARC at NASA/GSFC. Any comments about this program\n"); printf(" should be submitted to http://heasarc.gsfc.nasa.gov/cgi-bin/ftoolshelp\n"); return(0); } prhead = 0; /* don't print header by default */ prstat = 1; /* print HDU summary by default */ /* check for flags on the command line */ for (ii = 1; ii < argc; ii++) { if ((*argv[ii] != '-') || !strcmp(argv[ii],"-") ){ file1 = ii; break; } if (!strcmp(argv[ii],"-l")) { prhead = 1; } else if (!strcmp(argv[ii],"-e")) { strcpy(errormode,"e"); } else if (!strcmp(argv[ii],"-q")) { prstat = 0; } else { invalid = 1; } } if (invalid || argc == 1 || file1 == 0) { /* invalid input, so print brief help message */ printf("\n"); printf("fitsverify - test if the input file(s) conform to the FITS format.\n"); printf("\n"); printf("Usage: fitsverify filename ... or fitsverify @filelist.txt\n"); printf("\n"); printf(" where 'filename' is a filename template (with optional wildcards), and\n"); printf(" 'filelist.txt' is an ASCII text file with a list of\n"); printf(" FITS file names, one per line.\n"); printf("\n"); printf(" Optional flags:\n"); printf(" -l list all header keywords\n"); printf(" -q quiet; print one-line pass/fail summary per file\n"); printf(" -e only test for error conditions; don't issue warnings\n"); printf("\n"); printf("Help: fitsverify -h\n"); return(0); } /* call work function to verify that infile conforms to the FITS standard and write report to the output file. */ for (ii = file1; ii < argc; ii++) { status = ftverify_work( argv[ii], /* name of file to verify */ "STDOUT", /* write report to this stream */ prhead, /* print listing of header keywords? */ prstat, /* print detailed summary report */ errormode, /* report errors only, or errors and warnings */ 1, /* test the data */ 1, /* test checksum, if checksum keywords are present */ 1, /* test data fill areas (should contain all zeros */ 0); /* do not test for conformance with HEASARC convensions */ /* that are not required by the FITS Standard */ if (status) return(status); } if ( (totalerr + totalwrn) > 255) return(255); else return(totalerr + totalwrn); } /*------------------------------------------------------------------ The following are all dummy stub routines for functions that are only needed when ftverify is built in the HEADAS environment. --------------------------------------------------------------------*/ int PILGetFname(char *parname, char *filename) { return(0); } int PILGetString(char *parname, char *stringname) { return(0); } int PILGetBool(char *parname, int *intvalue) { return(0); } int PILPutInt(char *parname, int intvalue) { return(0); } void set_toolname(char *taskname); void set_toolname(char *taskname) { return; } void set_toolversion(char *taskname); void set_toolversion(char *taskname) { return; } void get_toolname(char *taskname); void get_toolname(char *taskname) { strcpy(taskname, "fitsverify"); return; } void get_toolversion(char *taskvers); void get_toolversion(char *taskvers) { strcpy(taskvers, "4.16"); return; } void headas_clobberfile(char *filename); void headas_clobberfile(char *filename) { return; } void HD_ERROR_THROW(char msg[256], int status); void HD_ERROR_THROW(char msg[256], int status) { return; } ��������������astrometry.net-0.67/blind/ftverify.c����������������������������������������������������������������000644 �000765 �000024 �00000032615 12651445460 017667� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include "fverify.h" #ifndef STANDALONE #include "pil.h" #include "headas.h" #include "headas_error.h" #endif #define MAXMSG 256 /* HISTORY ------- The original fverify.f Fortran program was written by William Pence in 1994. Ning Gan rewrote fverify in C in 1998, and continued to make enhancements throughout 1999 and 2000. Ziqin Pan adapted fverify to build in the new HEADAS environment in 2002, renaming it to ftverify. William Pence made additional enhancements, and rationalized the code so that fverify and ftverify share many of the same source files in January 2003 * Detailed modification History * * MODIFICATION HISTORY: * 1998-08-24 Ning Gan, v3.0.0 * Beta version: xverify v1.0 * 1998-12-18 Ning Gan, v3.0.1 * Beta version: xverify v1.1 * 1999-02-18 Ning Gan, v3.0.2 * Beta version: xverify v1.2 * Added more checks for keywords. * 1999-03-04 Ning Gan, v3.0.3 * Added a feature of multiple input files. * 1999-05-19 Ning Gan, v3.0.5 * Wrote numwrns and numerrs to the par file. * If the # of errors exceeds the MAXERRORS, * quit and wrote the summary. * Took out the limits on warnings. * 1999-06-03 Ning Gan, v3.0.6 * Wrote the version number of underlying * cfitsio. * 1999-06-07 Ning Gan, v3.0.7 * Improve the error handling. If there are * errors on opening fitsfile, the program set * numerr to 1 and quit. * 1999-06-30 Ning Gan, v3.0.8 * Improve the layout of the output. * 1999-08-25 Ning Gan, v3.0.9 * Always write errors to stderr. * Added ffnchk * Took out the checks of rejecting the * TDISP like I2.0 and the column name * startingnerror with a digit. * 1999-10-25 Ning Gan, v3.1.0 * The TDISP can take format I4. * Beutified the CFISIO error stack output * The numerrs and numwrns are the accumulated * number of errors and warnings if multiple * FITS file are tested in on fverify session. * Checked the X Column is left justified. * 1999-12-12 Ning Gan, v3.1.1 * Added the basiconly and heasarc parameters. * 1999-12-20 Ning Gan, v3.1.2 * Added the parameters of errreport and prstat, * removed the parameters of basiconly, erronly and * errpluswrn. * 1999-12-29 Ning Gan, v3.1.3 * fixed a bug on solaris * 2000-05-03 Ning Gan, v3.1.4 * Skip the blank column names in column name * tests. * 2000-06-09 Ning Gan, v3.1.5 * Fixed the memory problem(The bug will crash * 2000-09-26 Ning Gan, v3.1.6 * Fixed the TDISP format bug (not accept * format such as E15.5E3). * 2002-09-30 Ziqin Pan converted fverify to ftverify for HEADAS environ. * 2003-01-09 W Pence v4.0 * Added support for the new WCSAXES keyword * Added support for random groups * several small changes to the output report format * * 2004-06-21 W Pence fixed reporting error when prstat=no and when * opening a nonexistent or non-FITS file. * Also fixed elusive memory allocation error. * * 2009-06-08 W Pence updates to comply with V3.0 of the FITS Standard * 2010-07-26 W Pence Updates to WCS keyword checks, plux other V3.0 issues */ #define TOOLSUB ftverify /* headas_main() requires that TOOLSUB be defined first */ long totalerr, totalwrn; #ifdef STANDALONE #include "fitsverify.c" #else #include "headas_main.c" #endif /* Function Prototypes */ int ftverify (void); int ftverify_getpar (char *infile, char *outfile,int * prehead, int* prstat, char* errreport, int* testdata, int* testcsum, int* testfill, int* heasarc_conv); int ftverify_work (char *infile, char *outfile,int prehead, int prstat, char* errreport, int testdata, int testcsum, int testfill, int heasarc_conv); int err_report=0; int prhead=0; int prstat=1; int testdata=1; int testcsum=1; int testfill=1; int heasarc_conv=1; int totalhdu=0; /*---------------------------------------------------------------------------*/ int ftverify (void) { /* Read a FITS file and verify that it conforms to the FITS standard */ char infile[PIL_LINESIZE],outfile[PIL_LINESIZE]; int status; char errreport[PIL_LINESIZE]; static char taskname[80] = "ftverify"; static char version[8] = "4.16"; /* Register taskname and version. */ set_toolname(taskname); set_toolversion(version); /* get input parameters */ status = ftverify_getpar(infile, outfile,&prhead,&prstat, errreport,&testdata,&testcsum,&testfill,&heasarc_conv); /* call work function to verify that infile conforms to the FITS standard and write report to the output file */ if (!status) status = ftverify_work(infile, outfile,prhead,prstat, errreport,testdata,testcsum,testfill,heasarc_conv); return(status); } /*---------------------------------------------------------------------------*/ int ftverify_getpar( char *infile, /* O - Input file name (Fits) */ char *outfile, /* O - Output file name (ASCII) */ int * prhead, int * prstat, char * errreport, int * testdata, int * testcsum, int * testfill, int * heasarc_conv) /* read input parameters for the ftverify task from the .par file */ { int status; char msg[MAXMSG]; if ((status = PILGetString("infile", infile))) { sprintf(msg, "Error reading the 'infile' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetString("outfile", outfile))) { sprintf(msg, "Error reading the 'outfile' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("prhead", prhead))) { sprintf(msg, "Error reading the 'prhead' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("prstat", prstat))) { sprintf(msg, "Error reading the 'prstat' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetString("errreport", errreport))) { sprintf(msg, "Error reading the 'errreport' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("testdata", testdata))) { sprintf(msg, "Error reading the 'testdata' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("tchksum", testcsum))) { sprintf(msg, "Error reading the 'tchksum' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("testfill", testfill))) { sprintf(msg, "Error reading the 'testfill' parameter."); HD_ERROR_THROW(msg,status); } else if ((status = PILGetBool("heasarc", heasarc_conv))) { sprintf(msg, "Error reading the 'heasarc' parameter."); HD_ERROR_THROW(msg,status); } return(status); } /*---------------------------------------------------------------------------*/ int ftverify_work( char *infile, /* I - Input file name (Fits) */ char *outfile, /* I - Output file name (ASCII) */ int prehead, int prstat, char * errreport, int testdata, int testcsum, int testfill, int heasarc_conv) /* call work function to verify that infile conforms to the FITS standard and write report to the output file */ { FILE *runfile = 0; FILE *outfptr = 0; FILE *list=0; int status = 0, filestatus, runnum; char * p; char task[80],runchars[30]; char tversion[80]; float fversion; int i, nerrs, nwarns; char msg[MAXMSG]; /* determine 'Severe error", "Error", or "Warning" report level */ if( *errreport == 's' || *errreport == 'S') err_report = 2; if( *errreport == 'e' || *errreport == 'E') err_report = 1; p = infile; if (*p == '@') { p++; if( (list = fopen(p,"r")) == NULL ) { fprintf(stderr,"Cannot open the list file: %s.",p); leave_early(NULL); return (FILE_NOT_OPENED); } } headas_clobberfile(outfile); /* delete existing file if clobber=YES */ p = outfile; /* test if writing output log to a disk file */ if(prstat && strlen(p) && strcmp(p, "STDOUT") && strcmp(p, "STDERR") && (outfptr = fopen(p,"r") ) != NULL ) { sprintf(msg,"Clobber is not set. Cannot overwrite the file%s",p); status = FILE_NOT_CREATED; HD_ERROR_THROW(msg,status); leave_early(NULL); fclose(outfptr); return (status); } if(prstat && (!strlen(p) || !strcmp(p, "STDOUT"))) { outfptr = stdout; } else if(prstat && (!strlen(p) || !strcmp(p, "STDERR"))) { outfptr = stderr; } else if (!prstat) { outfptr=NULL; } else if( (outfptr = fopen(p,"w") ) == NULL) { fprintf(stderr,"Error open output file %s. Using stdout instead.", outfile); outfptr = stdout; } #ifdef WEBTOOL /* try opening and incrementing the file containing cumulative # of runs */ runfile=fopen("/tmp.shared/fits/tmpverify/counter.fitsverify","r+"); /* runfile=fopen("counter.fitsverify","r+"); */ if (runfile) { fgets(runchars,20,runfile); runnum=atoi(runchars); runnum++; sprintf(comm," Run Number %d",runnum); wrtout(outfptr,comm); sprintf(runchars, "%d", runnum); fflush(runfile); rewind(runfile); fputs(runchars, runfile); } #endif wrtout(outfptr," "); fits_get_version(&fversion); get_toolname(task); get_toolversion(tversion); sprintf(comm,"%s %s (CFITSIO V%.3f)",task,tversion,fversion); wrtsep(outfptr,' ',comm,60); for(i = 0; comm[i]!='\0'; i++) comm[i] = '-'; wrtsep(outfptr,' ',comm,60); wrtout(outfptr," "); switch (err_report) { case 2: sprintf(comm, "Caution: Only checking for the most severe FITS format errors."); wrtout(outfptr,comm); break; case 1: break; case 0: break; } if(heasarc_conv) { sprintf(comm, "HEASARC conventions are being checked."); wrtout(outfptr,comm); } /* process each file */ if (list == NULL) { verify_fits(infile,outfptr); if (outfptr == NULL) { /* print one-line file summary */ nerrs = get_total_err(); nwarns = get_total_warn(); filestatus = ((nerrs+nwarns)>0) ? 1 : 0; if (filestatus) { if (err_report) printf("verification FAILED: %-20s, %d errors\n", infile, nerrs); else printf("verification FAILED: %-20s, %d warnings and %d errors\n", infile, nwarns, nerrs); } else printf("verification OK: %-20s\n", infile); } } else { while((p = fgets(infile, FLEN_FILENAME, list))!= NULL) { verify_fits(infile,outfptr); if (outfptr == NULL) { /* print one-line file summary */ nerrs = get_total_err(); nwarns = get_total_warn(); filestatus = ((nerrs+nwarns) >0) ? 1 : 0; if (filestatus) { if (err_report) printf("verification FAILED: %-20s, %d errors\n", infile, nerrs); else printf("verification FAILED: %-20s, %d warnings and %d errors\n", infile, nwarns, nerrs); } else printf("verification OK: %-20s\n", infile); } for (i = 1; i < 3; i++) wrtout(outfptr," "); } fclose(list); } /* close the output file */ if (outfptr != stdout && outfptr != NULL) fclose(outfptr); return(status); } /****************************************************************************** * Function * update_parfile * * * DESCRIPTION: * Update the numerrs and numwrns parameters in the parfile. * *******************************************************************************/ void update_parfile(int nerr, int nwrn) { int status = 0; char parname[32]; totalerr += (long )nerr; totalwrn += (long )nwrn; /* write the total accumulated total warnings and errors to the parfile */ strcpy(parname, "numwrns"); status=PILPutInt(parname, totalwrn); if(status) { fprintf(stderr,"Error to update the numwrns keyword.\n"); status = 0; } strcpy(parname, "numerrs"); status=PILPutInt(parname, totalerr); if(status) { fprintf(stderr,"Error to update the numerrs keyword.\n"); status = 0; } } �������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fverify.h�����������������������������������������������������������������000644 �000765 �000024 �00000017040 12651445460 017503� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #ifndef _FVERIFY_H #define _FVERIFY_H #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <limits.h> #include "fitsio.h" #define MAXERRORS 200 #define MAXWRNS 200 static char errmes[256]; static char comm[256]; extern int prhead; extern int testdata; extern int testfill; extern int testcsum; extern int totalhdu; /* total number of hdu */ extern int err_report; extern int heasarc_conv; extern int prstat; /******************************** * * * Keywords * * * ********************************/ typedef enum { STR_KEY, /* string key */ LOG_KEY, /* Logical key */ INT_KEY, /* Integer key */ FLT_KEY, /* Float key */ CMI_KEY, /* Complex integer key */ CMF_KEY, /* Complex float key */ COM_KEY, /* history, comment, " ", and end */ UNKNOWN /* Unknown types */ } kwdtyp; /* error number masks of the keyword test */ #define BAD_STR 0X0001 #define NO_TRAIL_QUOTE 0X0002 #define BAD_NUM 0X0004 #define LOWCASE_EXPO 0X0008 #define NO_TRAIL_PAREN 0X0010 #define NO_COMMA 0X0020 #define TOO_MANY_COMMA 0X0040 #define BAD_REAL 0X0080 #define BAD_IMG 0X0100 #define BAD_LOGICAL 0x0200 #define NO_START_SLASH 0X0400 #define BAD_COMMENT 0x0800 #define UNKNOWN_TYPE 0x1000 /* keyword structure */ typedef struct { char kname[FLEN_KEYWORD]; /* fits keyword name */ kwdtyp ktype; /* fits keyword type */ char kvalue[FLEN_VALUE]; /* fits keyword name */ int kindex; /* position at the header */ int goodkey; /* good keyword flag (=1 good)*/ }FitsKey; int fits_parse_card(FILE *out, int pos, char *card, char *kname, kwdtyp *ktype, char *kvalue, char *kcomm); void get_str(char **p, char *kvalue, unsigned long *stat); void get_log(char **p, char *kvalue, unsigned long *stat); void get_num(char **p, char *kvalue, kwdtyp *ktype, unsigned long *stat); void get_cmp(char **p, char *kvalue, kwdtyp *ktype, unsigned long *stat); int check_str(FitsKey* pkey, FILE *out); int check_int(FitsKey* pkey, FILE *out); int check_flt(FitsKey* pkey, FILE *out); int check_cmi(FitsKey* pkey, FILE *out); int check_cmf(FitsKey* pkey, FILE *out); int check_log(FitsKey* pkey, FILE *out); int check_fixed_int(char *card, FILE *out); int check_fixed_log(char *card, FILE *out); int check_fixed_str(char *card, FILE *out); void get_unknown(char **p, char *kvalue, kwdtyp *ktype, unsigned long *stat); void get_comm(char **p, char *kcomm, unsigned long *stat); void pr_kval_err(FILE *out, int pos, char *keyname, char *keyval, unsigned long stat); /******************************** * * * Headers * * * ********************************/ typedef struct { int hdutype; /* hdutype */ int hdunum; /* hdunum */ int isgroup; /* random group flag */ int istilecompressed; /* tile compressed image */ int gcount; /* gcount */ int pcount; /* pcount */ int bitpix; /* pix number */ int naxis; /* number of the axis,used for image array*/ LONGLONG *naxes; /* dimension of each axis,used for image array*/ int ncols; /* number of the columns, used for image only*/ char extname[FLEN_VALUE]; /* EXTENSION NAME */ int extver; /* extension version */ char **datamax; /* strings for the maximum of the data in a column */ char **datamin; /* strings for the minimum of the data in a column */ char **tnull; /* number of NULL values */ int nkeys; /* number of keys */ int tkeys; /* total of the keys tested*/ int heap; /* heap */ FitsKey **kwds; /* keywords list starting from the last NAXISn keyword. The array is sorted in the ascending alphabetical order of keyword names. The last keyword END and commentary keywords are excluded. The total number of element, tkey, is nkeys - 4 - naxis - ncomm. */ int use_longstr; /* flag indicates that the long string convention is used */ }FitsHdu; typedef struct { char * name; int index; }ColName; void verify_fits(char *infile, FILE *out); void leave_early (FILE* out); void close_err(FILE* out); void init_hdu(fitsfile *infits, FILE *out, int hdunum, int hdutype, FitsHdu *hduptr); void test_hdu(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_ext(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_tbl(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_array(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_prm(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_img_ext(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_asc_ext(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_bin_ext(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_header(fitsfile *infits, FILE *out, FitsHdu *hduptr); void key_match(char **strs, int nstr, char **pattern, int exact, int *ikey, int *mkey); void test_colnam(FILE *out, FitsHdu *hduptr); void parse_vtform(fitsfile *infits, FILE *out, FitsHdu *hduptr, int colnum, int *datacode, long *maxlen); void print_title(FILE* out, int hdunum, int hdutype); void print_header(FILE* out); void print_summary(fitsfile *infits, FILE *out, FitsHdu *hduptr); void close_hdu(FitsHdu *hduptr); /******************************** * * * Data * * * ********************************/ void test_data(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_agap(fitsfile *infits, FILE *out, FitsHdu *hduptr); void test_checksum(fitsfile *infits, FILE *out); int iterdata(long totaln, long offset, long firstn, long nrows, int narrays, iteratorCol *iter_col, void *usrdata); /******************************** * * * Files * * * ********************************/ typedef struct { int hdutype; /* hdutype */ int hdunum; /* hdunum */ char extname[FLEN_VALUE]; /* extension name, used for extension*/ int extver; /* extension version, used for extension */ int errnum; /* number of errors in this hdu */ int wrnno; /* number of warnning in this hdu */ }HduName; int get_total_warn(); int get_total_err(); void init_hduname(); void set_hduname(int hdunum,int hdutype, char* extname,int extver); void set_hduerr(int hdunum); void set_hdubasic(int hdunum,int hdutype); int test_hduname(int hdunum1, int hdunum2); void total_errors (int *totalerr, int * totalwrn); void hdus_summary(FILE *out); void destroy_hduname(); void test_end(fitsfile *infits, FILE *out); void init_report(FILE *out, char *rootnam); void close_report(FILE *out); void update_parfile(int numerr, int numwrn); /******************************** * * * Miscellaneous * * * ********************************/ void print_fmt(FILE *out, char *temp, int nprompt); int wrtout (FILE *out,char *comm); int wrterr (FILE *out,char *comm, int severity); int wrtwrn (FILE *out,char *comm, int heasarc); int wrtferr(FILE *out, char* mess, int *status, int severity); int wrtserr(FILE *out, char* mess, int *status, int severity); void wrtsep (FILE *out,char fill, char *title, int nchar); void num_err_wrn(int *num_err, int *num_wrn); void reset_err_wrn(); int compkey (const void *key1, const void *key2); int compcol (const void *col1, const void *col2); int compcol (const void *col1, const void *col2); int compstrp (const void *str1, const void *str2); int compstre (const void *str1, const void *str2); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fvrf_data.c���������������������������������������������������������������000644 �000765 �000024 �00000065200 12651445460 017761� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include "fverify.h" typedef struct { int nnum; int ncmp; int nfloat; int *indatatyp; double *datamax; double *datamin; double *tnull; unsigned char *mask; /* for bit X column only */ int ntxt; FitsHdu *hduptr; FILE* out; }UserIter; /************************************************************* * * test_data * * Test the HDU data * * This routine reads every row and column of ASCII tables to * verify that the values have the correct format. * * This routine checks the following types of columns in binary tables: * * Logical L - value must be T, F or zero * Bit nX - if n != a multiple of 8, then check that fill bits = 0 * String A - must contain ascii text, or zero * * It is impossible to write an invalid value to the other types of * columns in binary tables (B, I, J, K, E, D, C and M) so these * columns are not read. * * Since it is impossible to write an invalid value in a FITS image, * this routine does not read the image pixels. * *************************************************************/ void test_data(fitsfile *infits, /* input fits file */ FILE *out, /* output ascii file */ FitsHdu *hduptr /* fits hdu pointer */ ) { iteratorCol *iter_col=0; int ncols; int nnum = 0; int *numlist; /* the list of the column whose data type is numerical(scalar and complex) */ int nfloat = 0; int *floatlist; /* the list of the floating point columns in ASCII table */ int ncmp = 0; int *cmplist; /* the list of the column whose data type is numerical(scalar and complex) */ int ntxt = 0; int *txtlist; /* the list of column whose data type is string, logical, bit or complex */ int niter = 0; /* total columns read into the literator function */ int ndesc = 0; int *desclist; /* the list of column which is the descriptor of the variable length array. */ long rows_per_loop = 0, offset; UserIter usrdata; int datatype; long repeat; long totalrows; long heap_offset; long length; long toffset; long *maxlen; int icol; char *cdata; double *ndata; int *idata; int *maxminflag; int *dflag; int nread; char lnull = 2; int anynul; long nelem; long rlength; long bytelength; long maxmax; int i = 0; int j = 0; long jl = 0; long k = 0; int status = 0; char errtmp[80]; int* perbyte; int find_badchar = 0; int find_badlog = 0; LONGLONG naxis2; if(testcsum) test_checksum(infits,out); if(testfill) { test_agap(infits,out,hduptr); /* test the bytes between the ascii table columns. */ if(ffcdfl(infits, &status)) { wrtferr(out,"checking data fill: ", &status, 1); status = 0; } } if(hduptr->hdutype != ASCII_TBL && hduptr->hdutype != BINARY_TBL ) return; ncols = hduptr->ncols; if(ncols <= 0) return; ffgkyjj(infits, "NAXIS2", &naxis2, NULL, &status); if (naxis2 > 2147483647) { wrtout(out, "Cannot test data in tables with more than 2**31 (2147483647) rows."); return; } /* separate the numerical, complex, text and the variable length vector columns */ numlist =(int*)malloc(ncols * sizeof(int)); floatlist =(int*)malloc(ncols * sizeof(int)); cmplist =(int*)malloc(ncols * sizeof(int)); txtlist =(int*)malloc(ncols * sizeof(int)); desclist =(int*)malloc(ncols * sizeof(int)); if(hduptr->hdutype == ASCII_TBL) { /*read every column of an ASCII table */ rows_per_loop = 0; for (i=0; i< ncols; i++){ if(fits_get_coltype(infits, i+1, &datatype, NULL, NULL, &status)){ sprintf(errmes,"Column #%d: ",i); wrtferr(out,errmes, &status,2); } if ( datatype != TSTRING ) { numlist[nnum] = i+1; nnum++; if (datatype > TLONG) { /* floating point number column */ floatlist[nfloat] = i + 1; nfloat++; } } else { txtlist[ntxt] = i+1; ntxt++; } } } else if (hduptr->hdutype == BINARY_TBL) { /* only check Bit, Logical and String columns in Binary tables */ rows_per_loop = 0; for (i=0; i< ncols; i++){ if(fits_get_coltype(infits, i+1, &datatype, &repeat, NULL, &status)){ sprintf(errmes,"Column #%d: ",i); wrtferr(out,errmes, &status,2); } if(datatype < 0) { /* variable length column */ desclist[ndesc] = i+1; ndesc++; } else if(datatype == TBIT && (repeat%8) ) { /* bit column that does not have a multiple of 8 bits */ numlist[nnum] = i+1; nnum++; } else if( (datatype == TLOGICAL) || (datatype == TSTRING ) ) { txtlist[ntxt] = i+1; ntxt++; } /* ignore all other types of columns (B I J K E D C and M ) */ } } /* Use Iterator to read the columns that are not variable length arrays */ /* columns from 1 to nnum are scalar numerical columns. columns from nnum+1 to nnum+ncmp are complex columns. columns from nnum+ncmp are text columns */ niter = nnum + ncmp + ntxt + nfloat; if(niter)iter_col = (iteratorCol *) malloc (sizeof(iteratorCol)*niter); for (i=0; i< nnum; i++){ fits_iter_set_by_num(&iter_col[i], infits, numlist[i], TDOUBLE, InputCol); } for (i=0; i< ncmp; i++){ j = nnum + i; fits_iter_set_by_num(&iter_col[j], infits, cmplist[i], TDBLCOMPLEX, InputCol); } for (i=0; i< ntxt; i++){ j = nnum + ncmp + i; fits_iter_set_by_num(&iter_col[j], infits, txtlist[i], 0, InputCol); } for (i=0; i< nfloat; i++){ j = nnum + ncmp + ntxt + i; fits_iter_set_by_num(&iter_col[j], infits, floatlist[i], TSTRING, InputCol); } offset = 0; usrdata.nnum = nnum; usrdata.ncmp = ncmp; if (nnum > 0 || ncmp > 0) { usrdata.datamax = (double *)calloc((nnum+ncmp), sizeof(double)); usrdata.datamin = (double *)calloc((nnum+ncmp), sizeof(double)); } usrdata.tnull = (double *)calloc(ncols, sizeof(double)); usrdata.ntxt = ntxt; usrdata.hduptr = hduptr; usrdata.out = out; usrdata.nfloat = nfloat; /* get the mask for the bit X column for column other than the X, it always 255 for Column nX, it will be 000...111, where # of 0 is n%8, # of 1 is 8 - n%8. */ if(nnum > 0) usrdata.mask = (unsigned char *)calloc(nnum,sizeof( unsigned char)); if(nnum > 0) usrdata.indatatyp = (int *)calloc(nnum,sizeof( int)); for (i=0; i< nnum; i++){ j = fits_iter_get_colnum(&(iter_col[i])); if(fits_get_coltype(infits, j, &datatype, &repeat, NULL, &status)){ sprintf(errmes,"Column #%d: ",i); wrtferr(out,errmes, &status,2); } usrdata.indatatyp[i] = datatype; usrdata.mask[i] = 255; if(datatype == TBIT) { repeat = repeat%8; usrdata.mask[i] = (usrdata.mask[i])>>repeat; if(!repeat) usrdata.mask[i] = 0; } } if(niter > 0) { if(fits_iterate_data(niter, iter_col, offset,rows_per_loop, iterdata, &usrdata,&status)){ wrtserr(out,"When Reading data, ",&status,2); } } if(niter>0) free(iter_col); free(numlist); free(cmplist); free(txtlist); if(nnum > 0) free(usrdata.mask); if(nnum > 0) free(usrdata.indatatyp); if(nnum > 0 || ncmp > 0) { free(usrdata.datamax); free(usrdata.datamin); } free(usrdata.tnull); if(!ndesc ) { goto data_end; } /* ------------read the variable length vectors -------------------*/ usrdata.datamax = (double *)calloc(ndesc, sizeof(double)); usrdata.datamin = (double *)calloc(ndesc, sizeof(double)); usrdata.tnull = (double *)calloc(ndesc, sizeof(double)); maxminflag = (int *) calloc(ndesc , sizeof(int)); maxlen = (long *) calloc(ndesc , sizeof(long)); dflag = (int *) calloc(ndesc , sizeof(int)); perbyte = (int *) calloc(ndesc , sizeof(int)); fits_get_num_rows(infits,&totalrows,&status); status = 0; heap_offset = hduptr->heap - hduptr->naxes[0] * hduptr->naxes[1]; /* this routine now only reads and test BIT, LOGICAL, and STRING columns */ /* There is no point in reading the other columns because the other datatypes */ /* have no possible invalid values. */ for (i = 0; i < ndesc; i++) { icol = desclist[i]; parse_vtform(infits,out,hduptr,icol,&datatype,&maxlen[i]); dflag[i] = 4; switch (datatype) { case -TBIT: dflag[i] = 1; perbyte[i] = -8; break; case -TBYTE: perbyte[i] = 1; break; case -TLOGICAL: dflag[i] = 3; perbyte[i] = 1; break; case -TSTRING: dflag[i] = 0; perbyte[i] = 1; break; case -TSHORT: perbyte[i] = 2; break; case -TLONG: perbyte[i] = 4; break; case -TFLOAT: perbyte[i] = 4; break; case -TDOUBLE: perbyte[i] = 8; break; case -TCOMPLEX: dflag[i] = 2; perbyte[i] = 8; break; case -TDBLCOMPLEX: dflag[i] = 2; perbyte[i] = 16; break; default: break; } } maxmax = maxlen[0]; for (i = 1; i < ndesc; i++) { if(maxmax < maxlen[i]) maxmax = maxlen[i]; } if(maxmax < 0) maxmax = 100; ndata = (double *)malloc(2*maxmax*sizeof(double)); cdata = (char *)malloc((maxmax+1) *sizeof(char)); idata = (int *)malloc(maxmax *sizeof(int)); for (jl = 1; jl <= totalrows; jl++) { for (i = 0; i < ndesc; i++) { icol = desclist[i]; /* read and check the descriptor length and offset values */ if(fits_read_descript(infits, icol ,jl,&length, &toffset, &status)){ sprintf(errtmp,"Row #%ld Col.#%d: ",jl,icol); wrtferr(out,errtmp,&status,2); } if(length > maxlen[i] && maxlen[i] > -1 ) { sprintf(errmes, "Descriptor of Column #%d at Row %ld: ", icol, jl); sprintf(errtmp,"nelem(%ld) > maxlen(%ld) given by TFORM%d.", length,maxlen[i],icol); strcat(errmes,errtmp); wrterr(out,errmes,1); } if( perbyte[i] < 0) bytelength = length/8; else bytelength = length*perbyte[i]; if(heap_offset + toffset + bytelength > hduptr->pcount ) { sprintf(errmes, "Descriptor of Column #%d at Row %ld: ", icol, jl); sprintf(errtmp, " offset of first element(%ld) + nelem(%ld)", toffset,length); strcat(errmes,errtmp); if(perbyte[i] < 0) sprintf(errtmp, "/8 > total heap area = %ld.", hduptr->pcount-heap_offset); else sprintf(errtmp, "*%d > total heap area = %ld.", perbyte[i],hduptr->pcount-heap_offset); strcat(errmes,errtmp); wrterr(out,errmes,2); } if(!length) continue; /* skip the 0 length array */ /* now check the values in BIT, LOGICAL, and String columns */ rlength = length; if(length > maxmax) rlength = maxmax; nread = 0; if(dflag[i] == 1) { /* read BIT column */ nelem = rlength*dflag[i]; anynul = 0; /* NOT YET IMPLEMENTED: This code should test that the fill bits that pad out the last byte are all zero. Currently this test is applied to fixed length logical arrays, but has not yet been done for the variable length logical array case. It is probably safe to assume that not many FITS files will contain variable length Logical columns, to adding this test is not a high priority. if(fits_read_col(infits, TDOUBLE, icol , jl, 1, nelem, &nullval, ndata, &anynul, &status)) { wrtferr(out,"",&status,2); } */ } else if(dflag[i] == 0) { /* read String column */ if(fits_read_col(infits, TSTRING, icol, jl, 1, rlength, NULL, &cdata, &anynul, &status)) { sprintf(errtmp,"Row #%ld Col.#%d: ",jl,icol); wrtferr(out,errtmp,&status,2); } else { j = 0; while (cdata[j] != 0) { if ((cdata[j] > 126) || (cdata[j] < 32) ) { sprintf(errmes, "String in row #%ld, and column #%d contains non-ASCII text.", jl,icol); wrterr(out,errmes,1); strcpy(errmes, " (This error is reported only once; other rows may have errors)."); print_fmt(out,errmes,13); find_badchar = 1; break; } j++; } } } else if(dflag[i] == 3) { /* read Logical column */ if(fits_read_col(infits, TLOGICAL, icol, jl, 1, rlength, &lnull, cdata, &anynul, &status)) { sprintf(errtmp,"Row #%ld Col.#%d: ",jl,icol); wrtferr(out,errtmp,&status,2); } else { for (k = 0; k < rlength; k++) { if (cdata[k] > 2) { sprintf(errmes, "Logical value in row #%ld, and column #%d has illegal value = %d", jl, icol, (int) cdata[k]); wrterr(out,errmes,1); strcpy(errmes, " (This error is reported only once; other rows may have errors)."); print_fmt(out,errmes,13); find_badlog = 1; break; } } } } } } free(ndata); free(cdata); free(idata); free(usrdata.datamax); free(usrdata.datamin); free(usrdata.tnull); free(maxminflag); free(maxlen); free(dflag); free(perbyte); data_end: free(desclist); for ( i = 0; i< ncols; i++) { (hduptr->datamax[i])[12] = '\0'; (hduptr->datamin[i])[12] = '\0'; (hduptr->tnull[i])[11] = '\0'; } return; } /***********************************************************************/ /* iterator work function */ int iterdata(long totaln, long offset, long firstn, long nrows, int narray, iteratorCol *iter_col, void *usrdata ) { static UserIter *usrpt; static FitsHdu *hdupt; static int nnum; static int ntxt; static int ncmp; static int nfloat; static int *flag_minmax = 0; /* define the initial min and max value */ static long *repeat; static int *datatype; static int find_badbit = 0; static int find_baddot = 0; static int find_badspace = 0; static int find_badchar = 0; static int find_badlog = 0; double *data; unsigned char *ldata; char **cdata; unsigned char *ucdata; char *floatvalue; /* bit column working space */ static unsigned char bdata; int i; long j,k,l; long nelem; int flag_cmpnull = 0; if(firstn == 1 ) { /* first time for this table, so initialize */ usrpt = (UserIter *)usrdata; hdupt= usrpt->hduptr; nnum = usrpt->nnum; ncmp = usrpt->ncmp; ntxt = usrpt->ntxt; nfloat = usrpt->nfloat; flag_minmax = (int *)calloc(nnum+ncmp, sizeof(int)); repeat = (long *)calloc(narray,sizeof(long)); datatype = (int *)calloc(narray,sizeof(int)); for (i=0; i < narray; i++) { repeat[i] = fits_iter_get_repeat(&(iter_col[i])); datatype[i] = fits_iter_get_datatype(&(iter_col[i])); } find_badbit = 0; find_baddot = 0; find_badspace = 0; find_badchar = 0; find_badlog = 0; } /* columns from 1 to nnum are scalar numerical columns. columns from nnum+1 to nnum+ncmp are complex columns. (not used any more) columns from nnum+ncmp are text columns */ /* deal with the numerical column */ for (i=0; i < nnum+ncmp; i++) { data = (double *) fits_iter_get_array(&(iter_col[i])); j = 1; flag_cmpnull = 0; nelem = nrows * repeat[i]; if(i >= nnum) nelem = 2 * nrows *repeat[i]; if(nelem == 0) continue; find_badbit = 0; /* check for the bit jurisfication */ if(!find_badbit && usrpt->indatatyp[i] == TBIT ) { for (k = 0; k < nrows; k++) { j = (k+1)*repeat[i]; bdata = (unsigned char)data[j]; if( bdata & usrpt->mask[i] ) { sprintf(errmes, "Row #%ld, and Column #%d: X vector ", firstn+k, fits_iter_get_colnum(&(iter_col[i]))); for (l = 1; l<= repeat[i]; l++) { sprintf(comm, "0x%02x ", (unsigned char) data[k*repeat[i]+l]); strcat(errmes,comm); } strcat(errmes,"is not left justified."); wrterr(usrpt->out,errmes,2); strcpy(errmes, " (Other rows may have errors)."); print_fmt(usrpt->out,errmes,13); find_badbit = 1; break; } } } } /* deal with character and logical columns */ for (i = nnum + ncmp; i < nnum + ncmp + ntxt; i++) { if(datatype[i] == TSTRING ) { /* character */ nelem = nrows; if(nelem == 0) continue; cdata = (char **) fits_iter_get_array(&(iter_col[i])); find_badchar = 0; /* test for illegal ASCII text characters > 126 or < 32 */ if (!find_badchar) { for (k = 0; k < nrows; k++) { ucdata = (unsigned char *)cdata[k+1]; j = 0; while (ucdata[j] != 0) { if ((ucdata[j] > 126) || (ucdata[j] < 32)) { sprintf(errmes, "String in row #%ld, column #%d contains non-ASCII text.", firstn+k, fits_iter_get_colnum(&(iter_col[i]))); wrterr(usrpt->out,errmes,1); strcpy(errmes, " (Other rows may have errors)."); print_fmt(usrpt->out,errmes,13); find_badchar = 1; break; } j++; } } } } else { /* logical value */ nelem = nrows * repeat[i]; if(nelem == 0) continue; ldata = (unsigned char *) fits_iter_get_array(&(iter_col[i])); /* test for illegal logical column values */ /* The first element in the array gives the value that is used to represent nulls */ if (!find_badlog) { for(j = 1; j <= nrows * repeat[i]; j++) { if (ldata[j] > 2) { sprintf(errmes, "Logical value in row #%ld, column #%d has illegal value = %d", (firstn+j - 2)/repeat[i] +1, fits_iter_get_colnum(&(iter_col[i])), (int) ldata[j]); wrterr(usrpt->out,errmes,1); strcpy(errmes, " (Other rows may have similar errors)."); print_fmt(usrpt->out,errmes,13); find_badlog = 1; break; } } } } } for (i = nnum + ncmp +ntxt; i < nnum + ncmp + ntxt + nfloat; i++) { nelem = nrows; if(nelem == 0) continue; cdata = (char **) fits_iter_get_array(&(iter_col[i])); find_baddot = 0; find_badspace = 0; /* test for missing (implicit) decimal point in floating point numbers */ if (!find_baddot) { for (k = 0; k < nrows; k++) { floatvalue = (char *)cdata[k+1]; if (strcmp(cdata[0], floatvalue) && !strchr(floatvalue, '.') ) { while (*floatvalue == ' ') /* skip leading spaces */ floatvalue++; if (strlen(floatvalue)) { /* ignore completely blank fields */ sprintf(errmes, "Number in row #%ld, column #%d has no decimal point:", firstn+k, fits_iter_get_colnum(&(iter_col[i]))); wrterr(usrpt->out,errmes,1); strcpy(errmes, floatvalue); strcat(errmes, " (Other rows may have similar errors)."); print_fmt(usrpt->out,errmes,13); find_baddot = 1; break; } } } } if (!find_badspace) { for (k = 0; k < nrows; k++) { floatvalue = (char *)cdata[k+1]; if (strcmp(cdata[0], floatvalue) ) { /* not a null value? */ while (*floatvalue == ' ') /* skip leading spaces */ floatvalue++; l = strlen(floatvalue) - 1; while (l > 0 && floatvalue[l] == ' ') { /* remove trailing spaces */ floatvalue[l] = '\0'; l--; } if (strchr(floatvalue, ' ') ) { sprintf(errmes, "Number in row #%ld, column #%d has embedded space:", firstn+k, fits_iter_get_colnum(&(iter_col[i]))); wrterr(usrpt->out,errmes,1); strcpy(errmes, floatvalue); strcat(errmes, " (Other rows may have similar errors)."); print_fmt(usrpt->out,errmes,13); find_badspace = 1; break; } } } } } if(firstn + nrows - 1 == totaln) { free(flag_minmax); free(datatype); free(repeat); } return 0; } /************************************************************* * * test_agap * * Test the bytes between the ASCII table column. * * *************************************************************/ void test_agap(fitsfile *infits, /* input fits file */ FILE *out, /* output ascii file */ FitsHdu *hduptr /* fits hdu pointer */ ) { int ncols; LONGLONG nrows; long irows; LONGLONG rowlen; unsigned char *data; int *temp; unsigned char *p; LONGLONG i, j; int k, m, t; long firstrow = 1; long ntodo; long nerr = 0; int status = 0; char keyname[9]; char tform[FLEN_VALUE], comment[256]; int typecode, decimals; long width, tbcol; nerr = 0; if(hduptr->hdutype != ASCII_TBL) return; ncols = hduptr->ncols; fits_get_num_rowsll(infits,&nrows,&status); status = 0; fits_get_rowsize(infits, &irows, &status); status = 0; rowlen = hduptr->naxes[0]; data = (unsigned char*)malloc(rowlen*sizeof(unsigned char)*irows); /* Create a template row with data fields filled with 1s. Used below - different ASCII rules apply within data columns vs. between data columns. */ temp = (int*)malloc(rowlen * sizeof(int)); for (m = 0; m<rowlen; m++ ) temp[m]=0; for (k = 1; k<=ncols; k++ ) { sprintf(keyname, "TFORM%d",k); fits_read_key_str(infits, keyname, tform, comment, &status); if (fits_ascii_tform(tform, &typecode, &width, &decimals, &status)) wrtferr(out,"",&status,1); sprintf(keyname, "TBCOL%d",k); fits_read_key_lng(infits, keyname, &tbcol, comment, &status); for (t = tbcol; t < tbcol+width; t++) temp[t-1]=1; } i = nrows; while( i > 0) { if( i > irows) ntodo = irows; else ntodo = i; p = data; if(fits_read_tblbytes(infits,firstrow,1, rowlen*ntodo, data, &status)){ wrtferr(out,"",&status,1); } for (j = 0; j<rowlen*ntodo; j++ ) { if(!isascii(*p)) { if(!nerr) { #if (USE_LL_SUFFIX == 1) sprintf(errmes, "row %lld contains non-ASCII characters.", j/rowlen+1); #else sprintf(errmes, "row %ld contains non-ASCII characters.", j/rowlen+1); #endif wrterr(out,errmes,1); } nerr++; } else if(isascii(*p) && !isprint(*p)) { if(temp[j%rowlen]) { if(!nerr) { #if (USE_LL_SUFFIX == 1) sprintf(errmes, "row %lld data contains non-ASCII-text characters.", j/rowlen+1); #else sprintf(errmes, "row %ld data contains non-ASCII-text characters.", j/rowlen+1); #endif wrterr(out,errmes,1); } nerr++; } } p++; } firstrow += ntodo; i -=ntodo; } if(nerr) { sprintf(errmes, "This ASCII table contains %ld non-ASCII-text characters",nerr); wrterr(out,errmes,1); } free(data); free(temp); return; } /************************************************************* * * test_checksum * * Test the checksum of the hdu * * *************************************************************/ void test_checksum(fitsfile *infits, /* input fits file */ FILE *out /* output ascii file */ ) { int status = 0; int dataok, hduok; if (fits_verify_chksum(infits, &dataok, &hduok, &status)) { wrtferr(out,"verifying checksums: ",&status,2); return; } if(dataok == -1) wrtwrn(out, "Data checksum is not consistent with the DATASUM keyword",0); if(hduok == -1 ) { if(dataok == 1) { wrtwrn(out, "Invalid CHECKSUM means header has been modified. (DATASUM is OK) ",0); } else { wrtwrn(out, "HDU checksum is not in agreement with CHECKSUM.",0); } } return; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fvrf_file.c���������������������������������������������������������������000644 �000765 �000024 �00000017127 12651445460 017774� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include "fverify.h" static HduName **hduname; static int total_err=1; /* initialzed to 1 in case fail to open file */ static int total_warn=0; int get_total_warn() { return (total_warn); } int get_total_err() { return (total_err); } /* Get the total hdu number and allocate the memory for hdu array */ void init_hduname() { int i; /* allocate memories for the hdu structure array */ hduname = (HduName **)malloc(totalhdu*sizeof(HduName *)); for (i=0; i < totalhdu; i++) { hduname[i] = (HduName *)calloc(1, sizeof(HduName)); hduname[i]->hdutype = -1; hduname[i]->errnum = 0; hduname[i]->wrnno = 0; strcpy(hduname[i]->extname,""); hduname[i]->extver = 0; } return; } /* set the hduname memeber hdutype, extname, extver */ void set_hduname( int hdunum, /* hdu number */ int hdutype, /* hdutype */ char* extname, /* extension name */ int extver /* extension version */ ) { int i; i = hdunum - 1; hduname[i]->hdutype = hdutype; if(extname!=NULL) strcpy (hduname[i]->extname,extname); else strcpy(hduname[i]->extname,""); hduname[i]->extver = extver; return; } /* get the total errors and total warnings in this hdu */ void set_hduerr(int hdunum /* hdu number */ ) { int i; i = hdunum - 1; num_err_wrn(&(hduname[i]->errnum), &(hduname[i]->wrnno)); reset_err_wrn(); /* reset the error and warning counter */ return; } /* set the basic information for hduname structure */ void set_hdubasic(int hdunum,int hdutype) { set_hduname(hdunum, hdutype, NULL, 0); set_hduerr(hdunum); return; } /* test to see whether the two extension having the same name */ /* return 1: identical 0: different */ int test_hduname (int hdunum1, /* index of first hdu */ int hdunum2 /* index of second hdu */ ) { HduName *p1; HduName *p2; p1 = hduname[hdunum1-1]; p2 = hduname[hdunum2-1]; if(!strlen(p1->extname) || !strlen(p2->extname)) return 0; if(!strcmp(p1->extname,p2->extname) && p1->hdutype == p2->hdutype && p2->extver == p1->extver && hdunum1 != hdunum2){ return 1; } return 0; } /* Added the error numbers */ void total_errors (int *toterr, int * totwrn) { int i = 0; int ierr, iwrn; *toterr = 0; *totwrn = 0; if (totalhdu == 0) { /* this means the file couldn't be opened */ *toterr = 1; return; } for (i = 0; i < totalhdu; i++) { *toterr += hduname[i]->errnum; *totwrn += hduname[i]->wrnno; } /*check the end of file errors */ num_err_wrn(&ierr, &iwrn); *toterr +=ierr; *totwrn +=iwrn; return; } /* print the extname, exttype, extver, errnum and wrnno in a table */ void hdus_summary(FILE *out) { HduName *p; int i; int ierr, iwrn; char temp[FLEN_VALUE]; char temp1[FLEN_VALUE]; wrtsep(out,'+'," Error Summary ",60); wrtout(out," "); sprintf(comm," HDU# Name (version) Type Warnings Errors"); wrtout(out,comm); sprintf(comm," 1 Primary Array %-4d %-4d ", hduname[0]->wrnno,hduname[0]->errnum); wrtout(out,comm); for (i=2; i <= totalhdu; i++) { p = hduname[i-1]; strcpy(temp,p->extname); if(p->extver && p->extver!= -999) { sprintf(temp1," (%-d)",p->extver); strcat(temp,temp1); } switch(hduname[i-1]->hdutype){ case IMAGE_HDU: sprintf(comm," %-5d %-20s Image Array %-4d %-4d ", i,temp, p->wrnno,p->errnum); wrtout(out,comm); break; case ASCII_TBL: sprintf(comm," %-5d %-20s ASCII Table %-4d %-4d ", i,temp, p->wrnno,p->errnum); wrtout(out,comm); break; case BINARY_TBL: sprintf(comm," %-5d %-20s Binary Table %-4d %-4d ", i,temp, p->wrnno,p->errnum); wrtout(out,comm); break; default: sprintf(comm," %-5d %-20s Unknown HDU %-4d %-4d ", i,temp, p->wrnno,p->errnum); wrtout(out,comm); break; } } /* check the end of file */ num_err_wrn(&ierr, &iwrn); if (iwrn || ierr) { sprintf(comm," End-of-file %-30s %-4d %-4d ", "", iwrn,ierr); wrtout(out,comm); } wrtout(out," "); return; } void destroy_hduname() { int i; for (i=0; i < totalhdu; i++) free(hduname[i]); free(hduname); return; } /* Routine to test the extra bytes at the end of file */ void test_end(fitsfile *infits, FILE *out) { int status = 0; LONGLONG headstart, datastart, dataend; int hdutype; /* check whether there are any HDU left */ fits_movrel_hdu(infits,1, &hdutype, &status); if (!status) { wrtout(out,"< End-of-File >"); sprintf(errmes, "There are extraneous HDU(s) beyond the end of last HDU."); wrterr(out,errmes,2); wrtout(out," "); return; } if (status != END_OF_FILE) { wrtserr(out,"Bad HDU? ",&status,2); return; } status = 0; fits_clear_errmsg(); if(ffghadll(infits, &headstart, &datastart, &dataend, &status)) wrtferr(out, "",&status,1); /* try to move to the last byte of this extension. */ if (ffmbyt(infits, dataend - 1,0,&status)) { sprintf(errmes, "Error trying to read last byte of the file at byte %ld.", (long) dataend); wrterr(out,errmes,2); wrtout(out,"< End-of-File >"); wrtout(out," "); return; } /* try to move to what would be the first byte of the next extension. If successfull, we have a problem... */ ffmbyt(infits, dataend,0,&status); if(status == 0) { wrtout(out,"< End-of-File >"); sprintf(errmes, "File has extra byte(s) after last HDU at byte %ld.", (long) dataend); wrterr(out,errmes,2); wrtout(out," "); } return; } /****************************************************************************** * Function * init_report * * * DESCRIPTION: * Initialize the fverify report * *******************************************************************************/ void init_report(FILE *out, /* output file */ char *rootnam /* input file name */ ) { sprintf(comm,"\n%d Header-Data Units in this file.",totalhdu); wrtout(out,comm); wrtout(out," "); reset_err_wrn(); init_hduname(); } /****************************************************************************** * Function * close_report * * * DESCRIPTION: * Close the fverify report * *******************************************************************************/ void close_report(FILE *out /* output file */ ) { int numerrs = 0; /* number of the errors */ int numwrns = 0; /* number of the warnings */ /* print out a summary of all the hdus */ if(prstat)hdus_summary(out); total_errors (&numerrs, &numwrns); total_warn = numwrns; total_err = numerrs; /* get the total number of errors and warnnings */ sprintf(comm,"**** Verification found %d warning(s) and %d error(s). ****", numwrns, numerrs); wrtout(out,comm); update_parfile(numerrs,numwrns); /* destroy the hdu name */ destroy_hduname(); return ; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fvrf_head.c���������������������������������������������������������������000644 �000765 �000024 �00000265171 12651445460 017762� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include "fverify.h" /* the following are only needed if one calls wcslib #include <wcslib/wcshdr.h> #include <wcslib/wcsfix.h> #include <wcslib/wcs.h> #include <wcslib/getwcstab.h> */ static char **cards; /* array to store the keywords */ static int ncards; /* total number of the keywords */ static char **tmpkwds; /* An string array holding the keyword name. It is sorted in alphabetical ascending order and not includes the keywords before the first non-reserved keyword and END keyword. */ static char **ttype; static char **tform; static char **tunit; static char temp[80]; static char *ptemp; /* it always pointed to the address of temp */ static char snull[] = ""; static int curhdu; /* current HDU index */ static int curtype; /* current HDU type */ /****************************************************************************** * Function * verify_fits * * DESCRIPTION: * Verify individual fits file. * *******************************************************************************/ /* routine to verify individual fitsfile */ void verify_fits(char *infile, FILE *out) { char rootnam[FLEN_FILENAME] = ""; /* Input Fits file root name */ fitsfile *infits; /* input fits file pointer */ FitsHdu fitshdu; /* hdu information */ int hdutype; int status = 0; int i; int len; char *p; char *pfile; char xtension[80]; /* take out the leading and trailing space and skip the empty line*/ p = infile; while(isspace((int)*p) )p++; len = strlen(p); pfile = p; p += (len -1); for (i = len - 1; i >= 0 && isspace((int)*p); i--) {*p = '\0'; p--;} if(!strlen(pfile)) return; #ifndef WEBTOOL wrtout(out," "); sprintf(comm,"File: %s",pfile); wrtout(out,comm); #endif totalhdu = 0; /* discard the extension, rowfilter... */ if(ffrtnm(pfile, rootnam, &status)) { wrtserr(out,"",&status,2); leave_early(out); return; } if(fits_open_file(&infits, rootnam, READONLY, &status)) { wrtserr(out,"",&status,2); leave_early(out); return; } /* get the total hdus */ if(fits_get_num_hdus(infits, &totalhdu, &status)) { wrtserr(out,"",&status,2); leave_early(out); return; } /* initialize the report */ init_report(out,rootnam); /*------------------ Hdu Loop --------------------------------*/ for (i = 1; i <= totalhdu; i++) { /* move to the right hdu and do the CFITSIO test */ hdutype = -1; if(fits_movabs_hdu(infits,i, &hdutype, &status) ) { print_title(out,i, hdutype); wrtferr(out,"",&status,2); set_hdubasic(i,hdutype); break; } if (i != 1 && hdutype == IMAGE_HDU) { /* test if this is a tile compressed image in a binary table */ fits_read_key(infits, TSTRING, "XTENSION", xtension, NULL, &status); if (!strcmp(xtension, "BINTABLE") ) print_title(out,i, BINARY_TBL); else print_title(out,i, hdutype); } else print_title(out,i, hdutype); init_hdu(infits,out,i,hdutype, &fitshdu); /* initialize fitshdu */ test_hdu(infits,out,&fitshdu); /* test hdu header */ if(testdata) test_data(infits,out,&fitshdu); close_err(out); /* end of error report */ if(prhead) print_header(out); if(prstat) print_summary(infits,out,&fitshdu); close_hdu(&fitshdu); /* clear the fitshdu */ } /* test the end of file */ test_end(infits,out); /*------------------ Closing --------------------------------*/ /* closing the report*/ close_report(out); /* close the input fitsfile */ fits_close_file(infits, &status); } void leave_early (FILE* out) { sprintf(comm,"**** Abort Verification: Fatal Error. ****"); wrtout(out,comm); /* write the total number of errors and warnings to parfile*/ update_parfile(1,0); } void close_err(FILE* out) { int merr, mwrn; num_err_wrn(&merr, &mwrn); if(merr || mwrn ) wrtout(out," "); return; } /************************************************************* * * init_hdu * * Initialize the FitsHdu, HduName and ttype, tform, tunit if * the hdu is a table. * * *************************************************************/ void init_hdu(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ int hdunum, /* hdu index */ int hdutype, /* hdutype */ FitsHdu *hduptr ) { int morekeys; int i,j,k,m,n; int status = 0; FitsKey ** kwds; char *p = 0; int numusrkey; LONGLONG lv,lu=0L; FitsKey tmpkey; hduptr->hdunum = hdunum; hduptr->hdutype = hdutype; /* curhdu and curtype are shared with print_title */ curhdu = hdunum; /* set the current hdu number */ curtype = hdutype; /* set the current hdu number */ /* check the null character in the header.(only the first one will be recorded */ lv = 0; lv = fits_null_check(infits, &status); if (lv > 0) { m = (lv - 1)/80 + 1; n = lv - (m - 1) * 80; sprintf(errmes, "Byte #%d in Card#%d is a null(\\0).",n,m); wrterr(out,errmes,1); status = 0; } else { if (status) { wrtserr(out,"",&status,1); status = 0; } } /* get the total number of keywords */ hduptr->nkeys = 0; morekeys = 0; if(fits_get_hdrspace(infits, &(hduptr->nkeys), &morekeys, &status)) wrtferr(out,"",&status,1); (hduptr->nkeys)++; /* include END keyword */ /* read all the keywords */ ncards = hduptr->nkeys; cards = (char **)malloc(sizeof(char *) * ncards ); for (i=0; i < ncards; i++) { cards[i] = (char *)malloc(sizeof(char )* FLEN_CARD ); } for (i=1; i <= ncards; i++) { if(fits_read_record(infits, i, cards[i-1], &status)) wrtferr(out,"",&status,1); } /* Parse the XTENSION/SIMPLEX keyword */ fits_parse_card(out, 1, cards[0], tmpkey.kname, &(tmpkey.ktype), tmpkey.kvalue,comm); if( *(tmpkey.kvalue) == ' ') { sprintf(errmes, "Keyword #1, %s \"%s\" should not have leading space.", tmpkey.kname,tmpkey.kvalue); wrterr(out,errmes,1); } if(hdunum == 1) { /* SIMPLE should be logical T */ if(strcmp(tmpkey.kname,"SIMPLE")) wrterr(out, "The 1st keyword of a primary array is not SIMPLE.",1); if( !check_log(&tmpkey,out)|| strcmp(tmpkey.kvalue,"T")) wrtwrn(out, "SIMPLE != T indicates file may not conform to the FITS Standard.",0); check_fixed_log(cards[0], out); } else { if(strcmp(tmpkey.kname,"XTENSION")) wrterr(out, "The 1st keyword of a extension is not XTENSION.",1); check_str(&tmpkey,out); check_fixed_str(cards[0], out); /* Get the original string */ p = cards[0]; p +=10; while (*p == ' ') p++; p++; /* skip the quote */ if( strncmp(p,"TABLE ",8) && strncmp(p,"BINTABLE",8) && strncmp(p,"A3DTABLE",8) && strncmp(p,"IUEIMAGE",8) && strncmp(p,"FOREIGN ",8) && strncmp(p,"DUMP ",8) && strncmp(p,"IMAGE ",8) ) { sprintf(errmes, "Unregistered XTENSION value \"%8.8s\".",p); wrterr(out,errmes,1); } else { if (p[8] != '\'') { sprintf(errmes, "Extra \'%c\' follows the XTENSION value \"%8.8s\".",p[8],p); wrterr(out,errmes,1); } } /* test if this is a tile compressed image, stored in a binary table */ /* If so then test the extension as binary table rather than an image */ if (!strncmp(p,"BINTABLE",8) && hduptr->hdutype == IMAGE_HDU) { hduptr->hdutype = BINARY_TBL; hduptr->istilecompressed = 1; } else { hduptr->istilecompressed = 0; } } /* read the BITPIX keywords */ if(fits_read_key(infits, TINT, "BITPIX", &(hduptr->bitpix), NULL, &status)) wrtferr(out,"",&status,2); check_fixed_int(cards[1], out); /* Read and Parse the NAXIS */ hduptr->naxis = 0; if(fits_read_key(infits, TINT, "NAXIS", &(hduptr->naxis), NULL, &status)) wrtferr(out,"",&status,2); check_fixed_int(cards[2], out); if(hduptr->naxis!=0) hduptr->naxes = (LONGLONG *)malloc(hduptr->naxis*sizeof(LONGLONG)); for (i = 0; i < hduptr->naxis; i++) hduptr->naxes[i] = -1; /* Parse the keywords NAXISn */ for (j = 3; j < 3 + hduptr->naxis; j++){ fits_parse_card(out, 1+j,cards[j], tmpkey.kname, &(tmpkey.ktype), tmpkey.kvalue,comm); p = tmpkey.kname+5; if(!isdigit((int) *p))continue; #if (USE_LL_SUFFIX == 1) if(check_int(&tmpkey,out)) lu = strtoll(tmpkey.kvalue,NULL,10); #else if(check_int(&tmpkey,out)) lu = strtol(tmpkey.kvalue,NULL,10); #endif lv = strtol(p,NULL,10); if(lv > hduptr->naxis && lv <= 0) { sprintf(errmes, "Keyword #%d, %s is not allowed (with n > NAXIS = %d).", tmpkey.kindex,tmpkey.kname,hduptr->naxis); wrterr(out,errmes,1); } else { if(hduptr->naxes[lv-1] == -1) { hduptr->naxes[lv-1] = lu; } else { sprintf(errmes, "Keyword #%d, %s is duplicated.", tmpkey.kindex,tmpkey.kname); wrterr(out,errmes,1); } } check_fixed_int(cards[j], out); } /* check all the NAXISn are there */ for (j = 0; j < hduptr->naxis; j++) { if(hduptr->naxes[j] == -1) { sprintf(errmes, "Keyword NAXIS%d is not present or is out of order.", j+1); wrterr(out,errmes,2); } } /* get the column number */ hduptr->ncols = 1; if(hduptr->hdutype == ASCII_TBL || hduptr->hdutype == BINARY_TBL) { /* get the total number of columns */ if(fits_get_num_cols(infits, &(hduptr->ncols),&status)) wrtferr(out,"",&status,2); } /* parse the keywords after NAXISn and prepare the array for sorting. We only check the keywords after the NAXISn */ n = hduptr->nkeys - 4 - hduptr->naxis ; /* excluding the SIMPLE/XTENSION, BITPIX, NAXIS, NAXISn and END */ hduptr->kwds = (FitsKey **)malloc(sizeof(FitsKey *)*n); for (i= 0; i < n; i++) hduptr->kwds[i] = (FitsKey *)malloc(sizeof(FitsKey)); kwds = hduptr->kwds; k = 3 + hduptr->naxis; /* index of first keyword following NAXISn. */ m = hduptr->nkeys - 1; /* last key */ i = 0; hduptr->use_longstr = 0; for (j = k ; j < m; j++) { kwds[i]->kindex = j+1; /* record number */ kwds[i]->goodkey=1; if(fits_parse_card(out,1+j,cards[j], kwds[i]->kname, &(kwds[i]->ktype), kwds[i]->kvalue,comm)) kwds[i]->goodkey=0; if (kwds[i]->ktype == UNKNOWN && *(kwds[i]->kvalue) == 0) { sprintf(errmes, "Keyword #%d, %s has a null value.", j+1,kwds[i]->kname); wrtwrn(out,errmes,0); } /* only count the non-commentary keywords */ if (!strcmp(kwds[i]->kname,"CONTINUE")) { hduptr->use_longstr = 1; } if( strcmp(kwds[i]->kname,"COMMENT") && strcmp(kwds[i]->kname,"HISTORY") && strcmp(kwds[i]->kname,"HIERARCH") && strcmp(kwds[i]->kname,"CONTINUE") && strcmp(kwds[i]->kname,"") ) i++; } numusrkey = i; hduptr->tkeys = i; /* parse the END key */ fits_parse_card(out,m+1,cards[hduptr->nkeys-1], tmpkey.kname,&(tmpkey.ktype),tmpkey.kvalue,comm) ; /* sort the keyword in the ascending order of kname field*/ qsort(kwds, numusrkey, sizeof(FitsKey *), compkey); /* store addresses of sorted keyword names in a working array */ tmpkwds = (char **)malloc(sizeof(char*) * numusrkey); for (i=0; i < numusrkey; i++) tmpkwds[i] = kwds[i]->kname; /* Initialize the PCOUNT, GCOUNT and heap values */ hduptr->pcount = -99; hduptr->gcount = -99; hduptr->heap = -99; /* set the random group flag (will be determined later) */ hduptr->isgroup = 0; /* allocate memory for datamax and datamin (will determined later)*/ if(hduptr->ncols > 0) { hduptr->datamax = (char **)calloc(hduptr->ncols, sizeof(char *)); hduptr->datamin = (char **)calloc(hduptr->ncols, sizeof(char *)); hduptr->tnull = (char **)calloc(hduptr->ncols, sizeof(char *)); for (i = 0; i < hduptr->ncols; i++) { hduptr->datamax[i] = (char *)calloc(13,sizeof(char)); hduptr->datamin[i] = (char *)calloc(13,sizeof(char)); hduptr->tnull[i] = (char *)calloc(12,sizeof(char)); } } /* initialize the extension name and version */ strcpy(hduptr->extname,""); hduptr->extver = -999; return; } /************************************************************* * * test_hdu * * Test the HDU header * This includes many tests of WCS keywords * *************************************************************/ void test_hdu(fitsfile *infits, /* input fits file */ FILE *out, /* output ascii file */ FitsHdu *hduptr ) { int status = 0; FitsKey **kwds; int numusrkey; int hdunum; char *p, *p2, *pname = 0; int i,j,k,m,n, wcsaxes = 0, taxes; int wcsaxesExists = 0, wcsaxesvalue = 0, wcsaxespos = 0, wcskeypos = 1000000000; FitsKey *pkey; int crota2_exists = 0, matrix_exists[2] = {0,0}; double dvalue; /* floating WCS keywords */ char *cfltkeys[] = {"CRPIX", "CRVAL","CDELT","CROTA", "CRDER","CSYER", "PV"}; int ncfltkeys = 7; int keynum[] = {0,0,0,0,0,0,0}, nmax = 0; /* floating non-indexed WCS keywords */ char *cfltnkeys[] = {"RESTFRQ", "RESTFREQ", "RESTWAV", "OBSGEO-X", "OBSGEO-Y", "OBSGEO-Z", "VELOSYS", "ZSOURCE", "VELANGL", "LONPOLE", "LATPOLE"}; int ncfltnkeys = 11; /* floating WCS keywords w/ underscore */ char *cflt_keys[] = {"PC","CD"}; int ncflt_keys = 2; /* string WCS keywords */ char *cstrkeys[] = {"CTYPE", "CUNIT", "PS", "CNAME" }; int ncstrkeys = 4; /* string RADESYS keywords with list of allowed values */ char *rastrkeys[] = {"RADESYS", "RADECSYS" }; int nrastrkeys = 2; /* string spectral ref frame keywords with list of allowed values */ char *specstrkeys[] = {"SPECSYS", "SSYSOBS", "SSYSSRC" }; int nspecstrkeys = 3; numusrkey = hduptr->tkeys; kwds = hduptr->kwds; /* find the extension name and version */ strcpy(temp,"EXTNAME"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k> -1 ) { if(kwds[k]->ktype == STR_KEY) strcpy(hduptr->extname,kwds[k]->kvalue); } strcpy(temp,"EXTVER"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k> -1 ) { if(kwds[k]->ktype == INT_KEY) hduptr->extver = (int) strtol(kwds[k]->kvalue,NULL,10); } /* set the HduName structure */ hdunum = hduptr->hdunum; set_hduname(hdunum,hduptr->hdutype,hduptr->extname, hduptr->extver); if(hduptr->hdunum == 1) { test_prm(infits,out,hduptr); } else { /* test the keywords specific to the hdutype*/ switch (hduptr->hdutype) { case IMAGE_HDU: test_img_ext(infits,out,hduptr); break; case ASCII_TBL: test_asc_ext(infits,out,hduptr); break; case BINARY_TBL: test_bin_ext(infits,out,hduptr); break; default: break; } } /* test the general keywords */ test_header(infits,out,hduptr); /* test if CROTA2 exists; if so, then PCi_j must not exist */ strcpy(temp,"CROTA2"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if (n == 1) { pkey = hduptr->kwds[k]; crota2_exists = pkey->kindex; } strcpy(temp,"WCSAXES"); ptemp = temp; /* first find the primary WCSAXES value, if it exists */ key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if (k >= 0) { j = k; if (check_int(kwds[j],out)) { pkey = hduptr->kwds[j]; wcsaxesvalue = (int) strtol(pkey->kvalue,NULL,10); nmax = wcsaxesvalue; } } /* Check and find max value of the WCSAXESa keywords */ /* Use the max value when checking the range of the indexed WCS keywords. */ /* This is a less rigorous test than if one were to test the range of the */ /* keywords for each of the alternate WCS systems (A - Z) against the */ /* corresponding WCSAXESa keyword. */ key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< n + k ; j++){ if (check_int(kwds[j],out)) { pkey = hduptr->kwds[j]; taxes = (int) strtol(pkey->kvalue,NULL,10); if (taxes > wcsaxes) wcsaxes = taxes; wcsaxesExists = 1; /* store highest index of any wcsaxes keyword */ /* (they must appear before other WCS keywords) */ if (pkey->kindex > wcsaxespos) wcsaxespos = pkey->kindex; } } /* test datatype of reserved indexed floating point WCS keywords */ for (i = 0; i < ncfltkeys; i++) { strcpy(temp,cfltkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; if (!check_flt(pkey,out) )continue; if (i == 2 ) { /* test that CDELTi != 0 */ dvalue = strtod(pkey->kvalue, NULL); if (dvalue == 0.) { sprintf( errmes, "Keyword #%d, %s: must have non-zero value.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } if (i == 4 || i == 5 ) { /* test that CRDERi and CSYSERi are non-negative */ dvalue = strtod(pkey->kvalue, NULL); if (dvalue < 0.) { sprintf( errmes, "Keyword #%d, %s: must have non-negative value: %s", pkey->kindex,pkey->kname,pkey->kvalue); wrterr(out,errmes,1); } } m = (int)strtol(p,&p2,10); if (wcsaxesExists) { /* WCSAXES keyword exists */ if (m < 1 || m > wcsaxes) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (WCSAXES).", pkey->kindex,pkey->kname,m,wcsaxes); wrterr(out,errmes,1); } } else { if (m < 1 || m > hduptr->naxis) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (NAXIS).", pkey->kindex,pkey->kname,m,hduptr->naxis); wrtwrn(out,errmes,0); } } /* count the number of each keyword */ if (*p2 == 0) { /* only test the primary set of WCS keywords */ keynum[i] = keynum[i] + 1; if (m > nmax) nmax = m; } /* store lowest index of any wcs keyword */ if (pkey->kindex < wcskeypos) { wcskeypos = pkey->kindex; pname = pkey->kname; } } } if (wcsaxesvalue == 0) { /* limit value of nmax to the legal maximum */ if (nmax > hduptr->naxis) nmax = hduptr->naxis; } else { if (nmax > wcsaxesvalue) nmax = wcsaxesvalue; } if (keynum[0] < nmax) { /* test number of CRPIXi keywords */ sprintf( errmes, "Some CRPIXi keywords appear to be missing; expected %d.",nmax); wrtwrn(out,errmes,0); } if (keynum[1] < nmax) { /* test number of CRVALi keywords */ sprintf( errmes, "Some CRVALi keywords appear to be missing; expected %d.",nmax); wrtwrn(out,errmes,0); } /* test datatype of reserved non-indexed floating point WCS keywords */ for (i = 0; i < ncfltnkeys; i++) { strcpy(temp,cfltnkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; if (!check_flt(pkey,out) )continue; } } /* test datatype of reserved indexed floating point WCS keywords with "_" */ for (i = 0; i < ncflt_keys; i++) { strcpy(temp,cflt_keys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; p2 = strchr(p, '_'); /* 2 digits must be separated by a '_' */ if (!p2) continue; if (!check_flt(pkey,out) )continue; *p2 = '\0'; /* terminate string at the '_' */ /* test the first digit */ m = (int)strtol(p,NULL,10); *p2 = '_'; /* replace the '_' */ if (wcsaxesExists) { /* WCSAXES keyword exists */ if (m < 1 || m > wcsaxes) { sprintf( errmes, "Keyword #%d, %s: 1st index %d is not in range 1-%d (WCSAXES).", pkey->kindex,pkey->kname,m,wcsaxes); wrterr(out,errmes,1); } } else { if (m < 1 || m > hduptr->naxis) { sprintf( errmes, "Keyword #%d, %s: 1st index %d is not in range 1-%d (NAXIS).", pkey->kindex,pkey->kname,m,hduptr->naxis); wrtwrn(out,errmes,0); } } /* test the second digit */ p = p2 + 1; m = (int)strtol(p,&p2,10); if (wcsaxesExists) { /* WCSAXES keyword exists */ if (m < 1 || m > wcsaxes) { sprintf( errmes, "Keyword #%d, %s: 2nd index %d is not in range 1-%d (WCSAXES).", pkey->kindex,pkey->kname,m,wcsaxes); wrterr(out,errmes,1); } } else { if (m < 1 || m > hduptr->naxis) { sprintf( errmes, "Keyword #%d, %s: 2nd index %d is not in range 1-%d (NAXIS).", pkey->kindex,pkey->kname,m,hduptr->naxis); wrtwrn(out,errmes,0); } } if (*p2 == 0) { /* no alternate suffix on the PC or CD name */ matrix_exists[i] = pkey->kindex; } /* store lowest index of any wcs keyword */ if (pkey->kindex < wcskeypos) { wcskeypos = pkey->kindex; pname = pkey->kname; } } } if (matrix_exists[0] > 0 && matrix_exists[1] > 0 ) { sprintf( errmes, "Keywords PCi_j (#%d) and CDi_j (#%d) are mutually exclusive.", matrix_exists[0],matrix_exists[1]); wrterr(out,errmes,1); } if (matrix_exists[0] > 0 && crota2_exists > 0 ) { sprintf( errmes, "Keywords PCi_j (#%d) and CROTA2 (#%d) are mutually exclusive.", matrix_exists[0],crota2_exists); wrterr(out,errmes,1); } /* test datatype of reserved indexed string WCS keywords */ for (i = 0; i < ncstrkeys; i++) { strcpy(temp,cstrkeys[i]); ptemp = temp; keynum[i] = 0; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; if (!check_str(pkey,out) )continue; m = (int)strtol(p,&p2,10); if (wcsaxesExists) { /* WCSAXES keyword exists */ if (m < 1 || m > wcsaxes) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (WCSAXES).", pkey->kindex,pkey->kname,m,wcsaxes); wrterr(out,errmes,1); } } else { if (m < 1 || m > hduptr->naxis) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (NAXIS).", pkey->kindex,pkey->kname,m,hduptr->naxis); wrtwrn(out,errmes,0); } } if (*p2 == 0) { /* only test the primary set of WCS keywords */ keynum[i] = keynum[i] + 1; } /* store lowest index of any wcs keyword */ if (pkey->kindex < wcskeypos) { wcskeypos = pkey->kindex; pname = pkey->kname; } } } if (keynum[0] < nmax) { sprintf( errmes, "Some CTYPEi keywords appear to be missing; expected %d.",nmax); wrtwrn(out,errmes,0); } if (wcskeypos < wcsaxespos) { sprintf( errmes, "WCSAXES keyword #%d appears after other WCS keyword %s #%d", wcsaxespos, pname, wcskeypos); wrterr(out,errmes,1); } /* test datatype and value of reserved RADECSYS WCS keywords */ for (i = 0; i < nrastrkeys; i++) { strcpy(temp,rastrkeys[i]); ptemp = temp; keynum[i] = 0; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if (!check_str(pkey,out) )continue; if (strcmp(pkey->kvalue, "ICRS") && strcmp(pkey->kvalue, "FK5") && strcmp(pkey->kvalue, "FK4") && strcmp(pkey->kvalue, "FK4-NO-E") && strcmp(pkey->kvalue, "GAPPT")) { sprintf( errmes, "Keyword #%d, %s has non-allowed value: %s", pkey->kindex,pkey->kname,pkey->kvalue); wrtwrn(out,errmes,0); } } } /* test datatype and value of reserved spectral ref frame WCS keywords */ for (i = 0; i < nspecstrkeys; i++) { strcpy(temp,specstrkeys[i]); ptemp = temp; keynum[i] = 0; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if (!check_str(pkey,out) )continue; if (strcmp(pkey->kvalue, "TOPOCENT") && strcmp(pkey->kvalue, "GEOCENTR") && strcmp(pkey->kvalue, "BARYCENT") && strcmp(pkey->kvalue, "HELIOCEN") && strcmp(pkey->kvalue, "LSRK") && strcmp(pkey->kvalue, "LSRD") && strcmp(pkey->kvalue, "GALACTOC") && strcmp(pkey->kvalue, "LOCALGRP") && strcmp(pkey->kvalue, "CMBDIPOL") && strcmp(pkey->kvalue, "SOURCE")) { sprintf( errmes, "Keyword #%d, %s has non-allowed value: %s", pkey->kindex,pkey->kname,pkey->kvalue); wrtwrn(out,errmes,0); } } } /* test the fill area */ if(testfill) { if(ffchfl(infits,&status)) { wrterr(out, "The header fill area is not totally filled with blanks.",1); } } return ; } /************************************************************* * * test_prm * * Test the primary array header * * *************************************************************/ void test_prm(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* hdu information structure */ ) { int i,j,k,n; FitsKey *pkey; FitsKey **kwds; int numusrkey; char *p; char *exlkey[] = {"XTENSION"}; int nexlkey = 1; kwds = hduptr->kwds; numusrkey = hduptr->tkeys; /* The SIMPLE, BITPIX, NAXIS, and NAXISn keywords have been checked in CFITSIO */ /* excluded keywords cannot be used. */ for (i = 0; i < nexlkey; i++) { strcpy(temp,exlkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( n > 0) { pkey = hduptr->kwds[k]; sprintf(errmes, "Keyword #%d, %s is not allowed in a primary array.", pkey->kindex,exlkey[i]); wrterr(out,errmes,1); } } /* Check if Random Groups file */ strcpy(temp,"GROUPS"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1){ pkey = hduptr->kwds[k]; if(*(pkey->kvalue) == 'T' && hduptr->naxis > 0 && hduptr->naxes[0]==0) { hduptr->isgroup = 1; check_fixed_log(cards[pkey->kindex - 1], out); } } /* check the position of the EXTEND */ /* the EXTEND keyword is no longer required if the file contains extensions */ if (hduptr->isgroup == 0) { strcpy(temp,"EXTEND"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k > 0) { pkey = hduptr->kwds[k]; if(check_log(pkey,out) && *(pkey->kvalue)!='T' && totalhdu > 1) { sprintf(errmes,"There are extensions but EXTEND = F."); wrterr(out,errmes,1); } } } /* Check PCOUNT and GCOUNT keyword */ strcpy(temp,"PCOUNT"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { pkey = hduptr->kwds[k]; /* Primary array cannot have PCOUNT */ if (!hduptr->isgroup ){ sprintf(errmes, " Keyword #%d, %s is not allowed in a primary array.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } else { if(check_int(pkey,out)) hduptr->pcount = (int) strtol(pkey->kvalue,NULL,10); check_fixed_int(cards[pkey->kindex - 1], out); } } strcpy(temp,"GCOUNT"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { pkey = hduptr->kwds[k]; /* Primary array cannot have GCOUNT */ if (!hduptr->isgroup ){ sprintf(errmes, " Keyword #%d, %s is not allowed in a primary array.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } else { if(check_int(pkey,out)) hduptr->gcount = (int) strtol(pkey->kvalue,NULL,10); check_fixed_int(cards[pkey->kindex - 1], out); } } strcpy(temp,"BLOCKED"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { pkey = hduptr->kwds[k]; sprintf(errmes, "Keyword #%d, %s is deprecated.", pkey->kindex, pkey->kname); wrtwrn(out,errmes,0); check_log(pkey,out); /* no longer required if(pkey->kindex > 36) { sprintf(errmes, "Keyword #%d, BLOCKED, appears beyond keyword 36.", pkey->kindex); wrterr(out,errmes,1); } */ } /* Check PSCALn keywords (only in Random Groups) */ strcpy(temp,"PSCAL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; if (!(hduptr->isgroup)) { sprintf(errmes,"Keyword #%d, %s ", kwds[j]->kindex,kwds[j]->kname); strcat(errmes, "is only allowed in Random Groups structures."); wrterr(out,errmes,1); continue; } if (check_flt(kwds[j],out) && strtod(kwds[j]->kvalue,NULL) == 0.0) { sprintf(errmes,"Keyword #%d, %s: ", kwds[j]->kindex,kwds[j]->kname); strcat(errmes, "The scaling factor is zero."); wrtwrn(out,errmes,0); } i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= hduptr->gcount) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> GCOUNT = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,hduptr->gcount); wrterr(out,errmes,1); continue; } } /* Check PZEROn keywords (only in Random Groups) */ strcpy(temp,"PZERO"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; if (!(hduptr->isgroup)) { sprintf(errmes,"Keyword #%d, %s ", kwds[j]->kindex,kwds[j]->kname); strcat(errmes, "is only allowed in Random Groups structures."); wrterr(out,errmes,1); continue; } check_flt(kwds[j],out); i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= hduptr->gcount) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> GCOUNT = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,hduptr->gcount); wrterr(out,errmes,1); continue; } } /* Check PTYPEn keywords (only in Random Groups) */ strcpy(temp,"PTYPE"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; if (!(hduptr->isgroup)) { sprintf(errmes,"Keyword #%d, %s ", kwds[j]->kindex,kwds[j]->kname); strcat(errmes, "is only allowed in Random Groups structures."); wrterr(out,errmes,1); continue; } check_str(kwds[j],out); i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= hduptr->gcount) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> GCOUNT = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,hduptr->gcount); wrterr(out,errmes,1); continue; } } test_array(infits, out, hduptr); return; } /************************************************************* * * test_ext * * Test the extension header * * *************************************************************/ void test_ext(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { FitsKey *pkey; FitsKey **kwds; int i,j,k,n; int numusrkey; char *exlkey[] = {"SIMPLE","EXTEND", "BLOCKED", }; int nexlkey = 3; char *exlnkey[] = {"PTYPE","PSCAL", "PZERO", "GROUPS", }; int nexlnkey = 4; int hdunum; char *p; numusrkey = hduptr->tkeys; kwds = hduptr->kwds; hdunum = hduptr->hdunum; /* check the duplicate extensions */ for (i = hdunum - 1; i > 0; i--) { if(test_hduname(hdunum,i)) { sprintf(comm, "The HDU %d and %d have identical type/name/version", hdunum,i); wrtwrn(out,comm,0); } } /* check the position of the PCOUNT */ strcpy(temp,"PCOUNT"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k < 0) { sprintf(errmes,"cannot find the PCOUNT keyword."); wrterr(out,errmes,1); } else { pkey = hduptr->kwds[k]; if(check_int(pkey,out)) hduptr->pcount = (int) strtol(pkey->kvalue,NULL,10); if( pkey->kindex != 4 + hduptr->naxis ) { sprintf(errmes,"PCOUNT is not in record %d of the header.", hduptr->naxis + 4); wrterr(out,errmes,1); } check_fixed_int(cards[pkey->kindex - 1], out); } /* check the position of the GCOUNT */ strcpy(temp,"GCOUNT"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k < 0) { sprintf(errmes,"cannot find the GCOUNT keyword."); wrterr(out,errmes,1); } else { pkey = hduptr->kwds[k]; if(check_int(pkey,out)) hduptr->gcount = (int) strtol(pkey->kvalue,NULL,10); if( pkey->kindex != 5 + hduptr->naxis ) { sprintf(errmes,"GCOUNT is not in record %d of the header.", hduptr->naxis + 5); wrterr(out,errmes,1); } check_fixed_int(cards[pkey->kindex - 1], out); } for (i = 0; i < nexlkey; i++) { strcpy(temp,exlkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { pkey = hduptr->kwds[k]; sprintf( errmes, "Keyword #%d, %s is not allowed in extensions.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } for (i = 0; i < nexlnkey; i++) { strcpy(temp,exlnkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k > -1) { for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; pkey = hduptr->kwds[j]; sprintf( errmes, "Keyword #%d, %s is only allowed in Random Groups structures.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } } return; } /************************************************************* * * test_img_ext * * Test the image extension header * * *************************************************************/ void test_img_ext(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { int numusrkey; numusrkey = hduptr->tkeys; test_ext(infits,out,hduptr); /* The XTENSION, BITPIX, NAXIS, and NAXISn keywords have been checked in CFITSIO */ if(hduptr->pcount != 0 && hduptr->pcount != -99){ sprintf(errmes, "Illegal pcount value %d for image ext.",hduptr->pcount); wrterr(out,errmes,1); } if(hduptr->gcount !=1 && hduptr->gcount != -99){ sprintf(errmes, "Illegal gcount value %d for image ext.",hduptr->gcount); wrterr(out,errmes,1); } test_array(infits, out, hduptr); return ; } /************************************************************* * * test_array * * Test the keywords which are used by both the primary array * and image Extension. * * *************************************************************/ void test_array(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { int numusrkey; FitsKey **kwds; char *p; int i,j,k,n; FitsKey *pkey; /* excluded non-indexed keywords */ char *exlkeys[] = {"TFIELDS","THEAP"}; int nexlkeys = 2; /* excluded indexed keywords */ char *exlnkeys[] = {"TBCOL", "TFORM", "TSCAL", "TZERO","TNULL", "TTYPE", "TUNIT","TDISP","TDIM", "TCTYP","TCUNI","TCRVL","TCDLT","TCRPX","TCROT"}; int nexlnkeys = 15; /* non-indexed floating keywords (excluding BSCALE) */ char *fltkeys[] = {"BZERO","DATAMAX","DATAMIN"}; int nfltkeys = 3; /* non-indexed string keywords */ char *strkeys[] = {"BUNIT"}; int nstrkeys = 1; numusrkey = hduptr->tkeys; kwds = hduptr->kwds; /* Check BLANK, BSCALE keywords */ strcpy(temp,"BLANK"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k >= 0) { check_int(kwds[k],out); if(hduptr->bitpix < 0) { sprintf(errmes, "Keyword #%d, %s must not be used with floating point data (BITPIX = %d).", kwds[k]->kindex,kwds[k]->kname, hduptr->bitpix); wrterr(out,errmes,2); } } strcpy(temp,"BSCALE"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k >= 0) { if(check_flt(kwds[k],out) && strtod(kwds[k]->kvalue,NULL) == 0.0) { sprintf(errmes,"Keyword #%d, %s: The scaling factor is 0.", kwds[k]->kindex,kwds[k]->kname); wrtwrn(out,errmes,0); } } /* search for excluded, non-indexed keywords */ for (i = 0; i < nexlkeys; i++) { strcpy(temp,exlkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; sprintf( errmes, "Keyword #%d, %s is not allowed in the array HDU.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } /* search for excluded, indexed keywords */ for (i = 0; i < nexlnkeys; i++) { strcpy(temp,exlnkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; sprintf( errmes, "Keyword #%d, %s is not allowed in the array HDU.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } /* test datatype of reserved non-indexed floating point keywords */ for (i = 0; i < nfltkeys; i++) { strcpy(temp,fltkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; if (!check_flt(pkey,out)) continue; } } /* test datatype of reserved non-indexed string keywords */ for (i = 0; i < nstrkeys; i++) { strcpy(temp,strkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; check_str(pkey,out); } } return; } /************************************************************* * * test_img_wcs * * Test the image WCS keywords * * *************************************************************/ /* void test_img_wcs(fitsfile *infits, FILE* out, FitsHdu *hduptr ) { int nkeyrec, nreject, nwcs, status = 0; int *stat = 0, ii; char *header; struct wcsprm *wcs; */ /* NOTE: WCSLIB currently doesn't provide very much diagnostic information about possible problems with the WCS keywords so for now, comment out this routine. */ /* use WCSLIB to look for inconsistencies in the WCS keywords */ /* Read in the FITS header, excluding COMMENT and HISTORY keyrecords. */ /* if (fits_hdr2str(infits, 1, NULL, 0, &header, &nkeyrec, &status)) { sprintf(errmes, "test_img_ext failed to read header keywords into array %d", status); wrterr(out,errmes,1); return; } */ /* Interpret the WCS keywords. */ /* if ((status = wcsbth(header, nkeyrec, WCSHDR_all, -2, 0, 0, &nreject, &nwcs, &wcs))) { sprintf(errmes, "test_img_ext: wcsbth ERROR %d: %s.", status, wcshdr_errmsg[status]); wrterr(out,errmes,1); free(header); return; } free(header); if (wcs) { if (nwcs == 1) { sprintf(errmes, " Found 1 World Coordinate System (WCS)."); } else { sprintf(errmes, " Found %d World Coordinate Systems (WCS).", nwcs); } wrtout(out,errmes); } */ /* Translate non-standard WCS keyvalues and look for inconsistencies */ /* this doesn't provide any useful checks stat = malloc(NWCSFIX * sizeof(int)); if ((status = wcsfix(7, 0, wcs, stat))) { for (ii = 0; ii < NWCSFIX; ii++) { if (stat[ii] > 0) { sprintf(errmes, "wcsfix ERROR %d: %s.", stat[ii], wcsfix_errmsg[stat[ii]]); wrtwrn(out,errmes,0); } } } if ((status = wcsset(wcs))) { sprintf(errmes, "wcsset ERROR %d %s.", status, wcs_errmsg[status]); wrtwrn(out,errmes,0); } */ /* status = wcsvfree(&nwcs, &wcs); return; } */ /************************************************************* * * test_tbl * * Test the table extension header and fill the tform, ttype, * tunit. * * *************************************************************/ void test_tbl(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { FitsKey *pkey; FitsKey **kwds; char *p; char *q; int m,n,i,j,k; long w,d,e; long lm; int mcol; /* excluded, non-index keywords (allowed in tile-compressed images) */ char* exlkey[] = {"BSCALE","BZERO", "BUNIT", "BLANK", "DATAMAX", "DATAMIN" }; int nexlkey = 6; /* floating WCS keywords */ char *cfltkeys[] = {"TCRVL","TCDLT","TCRPX","TCROT" }; int ncfltkeys = 4; /* string WCS keywords */ char *cstrkeys[] = {"TCTYP","TCUNI" }; int ncstrkeys = 2 ; int numusrkey; numusrkey = hduptr->tkeys; mcol = hduptr->ncols; kwds = hduptr->kwds; if(mcol <= 0) goto OTHERKEY; /* set the ttype, ttform, tunit for tables */ ttype = (char **)calloc(mcol, sizeof(char *)); tform = (char **)calloc(mcol, sizeof(char *)); tunit = (char **)calloc(mcol, sizeof(char *)); for (i=0; i< mcol; i++) { ttype[i] = snull; tform[i] = snull; tunit[i] = snull; } strcpy(temp,"TFIELDS"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if( k >= 0) { pkey = hduptr->kwds[k]; check_fixed_int(cards[pkey->kindex - 1], out); } strcpy(temp,"TTYPE"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k+n ; j++){ pkey = hduptr->kwds[j]; p = pkey->kname; p += 5; if(!isdigit((int)*p)) continue; check_str(pkey,out); i = (int) strtol(p,NULL,10) -1 ; if(i>= 0 && i < mcol) { ttype[i] = pkey->kvalue; } else { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", pkey->kindex,pkey->kname,i+1,mcol); wrterr(out,errmes,2); } } strcpy(temp,"TFORM"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ pkey = hduptr->kwds[j]; p = pkey->kname; p += 5; if(!isdigit((int)*p)) continue; check_str(pkey,out); /* TFORMn keyword no longer required to be padded to at least 8 characters check_fixed_str(cards[pkey->kindex - 1], out); */ if(*(pkey->kvalue) == ' ') { sprintf(errmes,"Keyword #%d, %s: TFORM=\"%s\" ", pkey->kindex,pkey->kname, pkey->kvalue); strcat(errmes, "should not have leading space."); wrterr(out,errmes,1); } i = (int) strtol(p,NULL,10) -1 ; if(i>= 0 && i < mcol) { tform[i] = pkey->kvalue; } else { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", pkey->kindex,pkey->kname,i+1,mcol); wrterr(out,errmes,2); } p = pkey->kvalue; while(*p != ' ' && *p != '\0') { if( !isdigit((int)*p) && !isupper((int)*p) && *p != '.' && *p != ')' && *p != '(' ) { sprintf(errmes, "Keyword #%d, %s: The value %s has character %c which is not uppercase letter.", pkey->kindex,pkey->kname,pkey->kvalue,*p); wrterr(out,errmes,1); } p++; } } strcpy(temp,"TUNIT"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ pkey = hduptr->kwds[j]; p = pkey->kname; p += 5; if(!isdigit((int)*p)) continue; check_str(pkey,out); i = (int) strtol(p,NULL,10) -1 ; if(i>= 0 && i < mcol) { tunit[i] = pkey->kvalue; } else { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", pkey->kindex,pkey->kname,i+1,mcol); wrterr(out,errmes,1); } } /* Check TDISPn keywords */ strcpy(temp,"TDISP"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; if (*(kwds[j]->kvalue) == '\0') continue; /* ignore blank string */ check_str(kwds[j],out); if(*(kwds[j]->kvalue) == ' ') { sprintf(errmes,"Keyword #%d, %s: TDISP=\"%s\" ", kwds[j]->kindex,kwds[j]->kname,kwds[j]->kvalue); strcat(errmes, "should not have leading space."); wrterr(out,errmes,1); } i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol ) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } p = kwds[j]->kvalue; switch (*p) { case 'A': p++; w = 0; w = strtol(p,NULL,10); if( !w || w == LONG_MAX || w == LONG_MIN) { sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } if(strchr(tform[i],'A') == NULL ){ sprintf(errmes, "Keyword #%d, %s: Format \"%s\" cannot be used for TFORM \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue, tform[i]); wrterr(out,errmes,1); } break; case 'L': p++; w = 0; w = strtol(p,NULL,10); if(!w || w == LONG_MAX || w == LONG_MIN) { sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } if(strchr(tform[i],'L') == NULL ){ sprintf(errmes, "Keyword #%d, %s: Format %s cannot be used for TFORM \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue, tform[i]); wrterr(out,errmes,1); } break; case 'I': case 'B': case 'O': case 'Z': p++; w = 0; w = strtol(p,NULL,10); if((q = strchr(p,'.')) != NULL) { p = q; p++; lm = strtol(p,NULL,10); } else { lm = -1; /* no minimum digit field */ } if(!w || w == LONG_MAX || w == LONG_MIN || lm == LONG_MAX || lm == LONG_MIN || w < lm ) { sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } if(strchr(tform[i],'I') == NULL && strchr(tform[i],'J') == NULL && strchr(tform[i],'K') == NULL && strchr(tform[i],'B') == NULL && strchr(tform[i],'X') == NULL ){ sprintf(errmes, "Keyword #%d, %s: Format \"%s\" cannot be used for TFORM \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue, tform[i]); wrterr(out,errmes,1); } break; case 'F': p++; d = -1; w = 0; w = strtol(p,NULL,10); if((q = strchr(p,'.')) != NULL) { p = q; p++; d = strtol(p,NULL,10); } if(!w || w == LONG_MAX || w == LONG_MIN || d == -1 || d == LONG_MAX || d == LONG_MIN || w < d+1 ) { sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } if(strchr(tform[i],'E') == NULL && strchr(tform[i],'F') == NULL && strchr(tform[i],'C') == NULL && strchr(tform[i],'D') == NULL && strchr(tform[i],'M') == NULL && strchr(tform[i],'I') == NULL && strchr(tform[i],'J') == NULL && strchr(tform[i],'B') == NULL && strchr(tform[i],'X') == NULL ){ sprintf(errmes, "Keyword #%d, %s: Format \"%s\" cannot be used for TFORM \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue, tform[i]); wrterr(out,errmes,1); } break; case 'E': case 'D': p++; w = 0; e = 0; d = 0; if(*p == 'N' || *p == 'S') { p++; e = 2;} w = strtol(p,NULL,10); if((q = strchr(p,'.')) != NULL) { p = q; p++; d = strtol(p,NULL,10); } if((q = strchr(p,'E')) != NULL) { p = q; p++; e = strtol(p,NULL,10); } else { e = 2; } if(!w || w == LONG_MAX || w == LONG_MIN || !d || d == LONG_MAX || d == LONG_MIN || !e || e == LONG_MAX || e == LONG_MIN || w < d+e+3) { sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } if(strchr(tform[i],'E') == NULL && strchr(tform[i],'F') == NULL && strchr(tform[i],'C') == NULL && strchr(tform[i],'D') == NULL && strchr(tform[i],'M') == NULL && strchr(tform[i],'I') == NULL && strchr(tform[i],'J') == NULL && strchr(tform[i],'B') == NULL && strchr(tform[i],'X') == NULL ){ sprintf(errmes, "Keyword #%d, %s: Format \"%s\" cannot be used for TFORM \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue, tform[i]); wrterr(out,errmes,1); } break; case 'G': p++; e = 0; d = 0; w = 0; w = strtol(p,NULL,10); if((q = strchr(p,'.')) != NULL) { p = q; p++; d = strtol(p,NULL,10); } if((q = strchr(p,'E')) != NULL) { p = q; p++; e = strtol(p,NULL,10); } else { e = 2; } if(!w || w == LONG_MAX || w == LONG_MIN || !d || d == LONG_MAX || d == LONG_MIN || !e || e == LONG_MAX || e == LONG_MIN ){ sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); } break; default: sprintf(errmes, "Keyword #%d, %s: invalid format \"%s\".", kwds[j]->kindex,kwds[j]->kname, kwds[j]->kvalue); wrterr(out,errmes,1); break; } } OTHERKEY: if (!(hduptr->istilecompressed) ) { /* tile compressed images can have these keywords */ for (i = 0; i < nexlkey; i++) { strcpy(temp,exlkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { pkey = hduptr->kwds[k]; sprintf( errmes, "Keyword #%d, %s is not allowed in the Bin/ASCII table.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } /* search for excluded indexed keywords */ /* these WCS keywords are all allowed (changed July 2010) for (i = 0; i < nexlkeys; i++) { strcpy(temp,exlkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; sprintf( errmes, "Keyword #%d, %s is not allowed in the Bin/ASCII table.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } */ } /* test datatype of reserved indexed floating point WCS keywords */ for (i = 0; i < ncfltkeys; i++) { strcpy(temp,cfltkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; if (!check_flt(pkey,out) )continue; m = (int)strtol(p,NULL,10); if (m < 1 || m > mcol) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (TFIELD).", pkey->kindex,pkey->kname,m,mcol); wrterr(out,errmes,1); } } } /* test datatype of reserved indexed string WCS keywords */ for (i = 0; i < ncstrkeys; i++) { strcpy(temp,cstrkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; if (!check_str(pkey,out) )continue; m = (int)strtol(p,NULL,10); if (m < 1 || m > mcol) { sprintf( errmes, "Keyword #%d, %s: index %d is not in range 1-%d (TFIELD).", pkey->kindex,pkey->kname,m,mcol); wrterr(out,errmes,1); } } } return; } /************************************************************* * * test_asc_ext * * Test the ascii table extension header * * *************************************************************/ void test_asc_ext(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { int numusrkey; FitsKey **kwds; FitsKey *pkey; char *p; int i,j,k; int n; int mcol; numusrkey = hduptr->tkeys; kwds = hduptr->kwds; mcol = hduptr->ncols; /* The XTENSION, BITPIX, NAXIS, NAXISn, TFIELDS, PCOUNT, GCOUNT, TFORMn, TBCOLn, TTYPEn keywords have been checked in CFITSIO */ /* General extension */ test_ext(infits,out,hduptr); /* general table */ test_tbl(infits,out,hduptr); /* Check TBCOLn */ strcpy(temp,"TBCOL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ pkey = hduptr->kwds[j]; p = pkey->kname; p += 5; if(!isdigit((int)*p)) continue; check_int(pkey,out); i = (int) strtol(p,NULL,10) ; if(i< 0 || i > mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", pkey->kindex,pkey->kname,i,mcol); wrterr(out,errmes,1); } else { check_fixed_int(cards[pkey->kindex - 1], out); } } /* Check TNULLn, TSCALn, and TZEORn keywords */ strcpy(temp,"TNULL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; i = (int) strtol(p,NULL,10) -1; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); } check_str(kwds[j],out); } strcpy(temp,"TSCAL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; i = (int) strtol(p,NULL,10) -1 ; if(check_flt(kwds[j],out)){ if(strtod(kwds[j]->kvalue,NULL) == 0.0) { sprintf(errmes,"Keyword #%d, %s: Scaling factor is zero.", kwds[j]->kindex,kwds[j]->kname); wrtwrn(out,errmes,0); } } if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(strchr(tform[i],'A') != NULL) { sprintf(errmes, "Keyword #%d, %s may not be used for the A-format fields.", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } } strcpy(temp,"TZERO"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; check_flt(kwds[j],out); i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(strchr(tform[i],'A') != NULL) { sprintf(errmes, "Keyword #%d, %s may not be used for the A-format fields.", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } } strcpy(temp,"TDIM"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 4; if(!isdigit((int)*p)) continue; pkey = hduptr->kwds[j]; sprintf( errmes, "Keyword #%d, %s is not allowed in the ASCII table.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } strcpy(temp,"THEAP"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if (k > -1) { pkey = hduptr->kwds[k]; sprintf( errmes, "Keyword #%d, %s is not allowed in the ASCII table.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } /* check whether the column name is unique */ test_colnam(out, hduptr); return ; } /************************************************************* * * test_bin_ext * * Test the binary table extension header * * *************************************************************/ void test_bin_ext(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { FitsKey *pkey; int i,j,k,n; long l; int status = 0; char *p; int ntdim; long tdim[10]; int repeat, width; FitsKey **kwds; int numusrkey; int mcol, vla, datatype; /* The indexed keywords excluded from ascii table */ char *exlkeys[] = { "TBCOL"}; int nexlkeys = 1; kwds = hduptr->kwds; numusrkey = hduptr->tkeys; mcol = hduptr->ncols; /* General extension */ test_ext(infits,out,hduptr); /* General table */ test_tbl(infits,out,hduptr); /* The XTENSION, BITPIX, NAXIS, NAXISn, TFIELDS, PCOUNT, GCOUNT, TFORMn, TTYPEn keywords have been checked in CFITSIO */ /* Check TNULLn keywords */ strcpy(temp,"TNULL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; check_int(kwds[j],out); i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(strchr(tform[i],'B') == NULL && strchr(tform[i],'I') == NULL && strchr(tform[i],'J') == NULL && strchr(tform[i],'K') == NULL ) { sprintf(errmes, "Keyword #%d, %s is used for the column with format \"%s \".", kwds[j]->kindex,kwds[j]->kname,tform[i]); wrterr(out,errmes,2); } l = strtol(kwds[j]->kvalue,NULL,10); if(strchr(tform[i],'B') != NULL && ( l < 0 || l > 255) ) { sprintf(errmes,"Keyword #%d, %s: The value %ld", kwds[j]->kindex,kwds[j]->kname, l); strcat(errmes, " is not in the range of datatype B."); wrtwrn(out,errmes,0); } l = strtol(kwds[j]->kvalue,NULL,10); if(strchr(tform[i],'I') != NULL && ( l < -32768 || l > 32767) ) { sprintf(errmes,"Keyword #%d, %s: The value %ld", kwds[j]->kindex,kwds[j]->kname, l); strcat(errmes, " is not in the range of datatype I "); wrtwrn(out,errmes,0); } } /* Check TSCALn keywords */ strcpy(temp,"TSCAL"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; if (check_flt(kwds[j],out) && strtod(kwds[j]->kvalue,NULL) == 0.0) { sprintf(errmes,"Keyword #%d, %s:", kwds[j]->kindex,kwds[j]->kname); strcat(errmes, "The scaling factor is zero."); wrtwrn(out,errmes,0); } i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(strchr(tform[i],'A') != NULL || strchr(tform[i],'L') != NULL || strchr(tform[i],'X') != NULL ) { sprintf(errmes, "Keyword #%d, %s is used in A, L, or X column. ", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } } /* Check TZEROn keywords */ strcpy(temp,"TZERO"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ p = kwds[j]->kname; p += 5; if(!isdigit((int)*p)) continue; check_flt(kwds[j],out); i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(strchr(tform[i],'A') != NULL && strchr(tform[i],'L') != NULL && strchr(tform[i],'X') != NULL ) { sprintf(errmes, "Keyword #%d, %s is used in A, L, or X column. ", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } } /* Check THEAP keyword */ hduptr->heap = (hduptr->naxes[0]) * (hduptr->naxes[1]); strcpy(temp,"THEAP"); key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { if(check_int(kwds[k],out)) hduptr->heap = (int) strtol(hduptr->kwds[k]->kvalue,NULL,10); if(!hduptr->pcount) { sprintf( errmes, "Pcount is zero, but keyword THEAP is present at record #%d). ", kwds[k]->kindex); wrterr(out,errmes,1); } } /* if PCOUNT != 0, test that there is at least 1 variable length array column */ vla = 0; if(hduptr->pcount) { for (i=0; i< mcol; i++){ if(fits_get_coltype(infits, i+1, &datatype, NULL, NULL, &status)){ sprintf(errmes,"Column #%d: ",i); wrtferr(out,errmes, &status,2); } if (datatype < 0) { vla = 1; break; } } if (vla == 0) { sprintf(errmes, "PCOUNT = %ld, but there are no variable-length array columns.", (long) hduptr->pcount); wrtwrn(out,errmes,0); } } /* Check TDIMn keywords */ strcpy(temp,"TDIM"); key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< k + n ; j++){ pkey = kwds[j]; p = pkey->kname; p += 4; if(!isdigit((int)*p)) continue; check_str(kwds[j],out); if(*(pkey->kvalue) == ' ') { sprintf(errmes,"Keyword #%d, %s: TDIM=\"%s\" ", pkey->kindex,pkey->kname,pkey->kvalue); strcat(errmes, "should not have leading space."); wrterr(out,errmes,1); continue; } i = (int) strtol(p,NULL,10) -1 ; if(i< 0 || i >= mcol) { sprintf(errmes, "Keyword #%d, %s: invalid index %d (> TFIELD = %d).", kwds[j]->kindex,kwds[j]->kname,i+1,mcol); wrterr(out,errmes,1); continue; } if(fits_decode_tdim(infits,pkey->kvalue,i+1,10,&ntdim,tdim, &status)){ sprintf(errmes,"Keyword #%d, %s: ", kwds[j]->kindex,kwds[j]->kname); wrtferr(out,errmes,&status,1); } } /* check the local convension "rAw"*/ for (i = 0; i < hduptr->ncols; i++) { if((p = strchr(tform[i],'A'))==NULL) continue; repeat = (int) strtol(tform[i],NULL,10); p++; if(!isdigit((int)*p))continue; width = (int)strtol(p,NULL,10); if(repeat%width != 0) { sprintf(errmes, "TFORM %s of column %d: repeat %d is not the multiple of the width %d", tform[i], i+1, repeat, width); wrtwrn(out,errmes,0); } } for (i = 0; i < nexlkeys; i++) { strcpy(temp,exlkeys[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); if(k < 0) continue; for (j = k; j < k+n; j++) { pkey = hduptr->kwds[j]; p = kwds[j]->kname; p += strlen(temp); if(!isdigit((int)*p)) continue; sprintf( errmes, "Keyword #%d, %s is not allowed in the Binary table.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); } } /* check whether the column name is unique */ test_colnam(out, hduptr); return ; } /************************************************************* * * test_header * * Test the general keywords that can be in any header * * *************************************************************/ void test_header( fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr /* information about header */ ) { /* common mandatory keywords */ char *mandkey[] = {"SIMPLE", "BITPIX", "NAXIS", "XTENSION", "END"}; /* not including NAXIS */ int nmandkey = 5; /* string keywords */ char *strkey[] = {"EXTNAME", "ORIGIN", "AUTHOR","CREATOR","REFERENC","TELESCOP", "INSTRUME", "OBSERVER", "OBJECT"}; int nstrkey = 9; /* int keywords */ char *intkey[] = {"EXTVER", "EXTLEVEL"}; int nintkey = 2; /* floating keywords */ char *fltkey[] = {"EQUINOX", "MJD-OBS", "MJD-AVG"}; int nfltkey = 3; FitsKey** kwds; /* FitsKey structure array */ int numusrkey; int i,j,k,n; long lv; char* pt; char **pp; int status = 0; int yr, mn, dy, hr, min; /* time */ double sec; int yy; kwds = hduptr->kwds; numusrkey = hduptr->tkeys; /* Check the mandatory keywords */ for (i = 0; i < nmandkey; i++) { pp = &(mandkey[i]); key_match(tmpkwds,numusrkey,pp,1,&k,&n); if(k > -1) { for ( j = k; j < k + n; j++) { sprintf(errmes, "Keyword #%d, %s is duplicated or out of order.", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } } } /* check the NAXIS index keyword */ strcpy(temp,"NAXIS"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for ( j = k; j < k + n; j++) { pt = kwds[j]->kname+5; lv = strtol(pt,NULL,10); if(lv > 0 ){ if(kwds[j]->kindex != 3 + lv) { sprintf(errmes, "Keyword #%d, %s is duplicated or out of order.", kwds[j]->kindex,kwds[j]->kname); wrterr(out,errmes,1); } if(lv > hduptr->naxis) { sprintf(errmes, "Keyword #%d, %s is not allowed (with n > NAXIS =%d).", kwds[j]->kindex,kwds[j]->kname,hduptr->naxis); wrterr(out,errmes,1); } } } /* Check the deprecated keywords */ strcpy(temp,"EPOCH"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) { sprintf(errmes, "Keyword #%d, %s is deprecated. Use EQUINOX instead.", kwds[k]->kindex, kwds[k]->kname); wrtwrn(out,errmes,0); check_flt(kwds[k],out); } /* Check the DATExxxx keyword */ strcpy(temp,"DATE"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,0,&k,&n); for (j = k; j< n + k ; j++){ check_str(kwds[j],out); if(fits_str2time(kwds[j]->kvalue, &yr, &mn, &dy, &hr, &min, &sec, &status)){ sprintf(errmes,"Keyword #%d, %s: ", kwds[j]->kindex,kwds[j]->kname); wrtserr(out,errmes,&status,1); } if( (pt = strchr(kwds[j]->kvalue,'/'))!=NULL) { pt +=4; yy = (int) strtol(pt,NULL,10); if(0 <= yy && yy <=10) { sprintf(errmes, "Keyword #%d, %s %s intends to mean year 20%-2.2d?", kwds[j]->kindex, kwds[j]->kname, kwds[j]->kvalue, yy); wrtwrn(out,errmes,0); } } } /* Check the reserved string keywords */ for (i = 0; i < nstrkey; i++) { strcpy(temp,strkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) check_str(kwds[k],out); } /* Check the reserved int keywords */ for (i = 0; i < nintkey; i++) { strcpy(temp,intkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) check_int(kwds[k],out); } /* Check reserved floating keywords */ for (i = 0; i < nfltkey; i++) { strcpy(temp,fltkey[i]); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k > -1) check_flt(kwds[k],out); } /* Check the duplication of the keywords */ for (i = 0; i < numusrkey-1; i++) { if(!strcmp(tmpkwds[i],tmpkwds[i+1])) { sprintf(errmes, "Keyword %s is duplicated in card #%d and card #%d.", kwds[i]->kname, kwds[i]->kindex, kwds[i+1]->kindex); wrtwrn(out,errmes,0); } } /* check the long string convention */ if (hduptr->use_longstr == 1) { strcpy(temp,"LONGSTRN"); ptemp = temp; key_match(tmpkwds,numusrkey,&ptemp,1,&k,&n); if(k <= -1) { sprintf(errmes, "The OGIP long string keyword convention is used without the recommended LONGSTRN keyword. "); wrtwrn(out,errmes,1); } } /* disabled this routine because it doesn't perform an useful tests test_img_wcs(infits, out, hduptr); */ return; } /************************************************************* * * key_match * * find the keywords whose name match the pattern. The keywords * name is stored in a sorted array. * * *************************************************************/ void key_match(char **strs, /* fits keyname array */ int nstr, /* total number of keys */ char **pattern, /* wanted pattern */ int exact, /* exact matching or pattern matching exact = 1: exact matching. exact = 0: pattern matching. Any keywords with "patten"* is included */ int *ikey, /* The element number of first key Return -99 if not found */ int *mkey /* total number of key matched return -999 if not found */ ) { char **p; char **pi; int i; int (*fnpt)(const void *, const void *); *mkey = -999; *ikey = -99; if(exact) fnpt = compstre; else fnpt = compstrp; p = (char **)bsearch(pattern, strs, nstr,sizeof(char *), fnpt); if(p) { *mkey = 1; *ikey = p - strs; pi = p; i = *ikey - 1; p--; while(i > 0 && !fnpt(pattern, p)) {*mkey += 1; *ikey =i; i--; p--;} p = pi; i = *ikey + *mkey; p++; while(i < nstr && !fnpt(pattern, p) ) {*mkey += 1; i++; p++;} } return; } /************************************************************* * * test_colnam * * Test the whether the column name is unique. * * *************************************************************/ void test_colnam(FILE *out, FitsHdu *hduptr) { int i,n; char *p, *q; ColName **cols; char **ttypecopy; n = hduptr->ncols; if(n <= 0) return; /* make a local working copy of ttype */ ttypecopy = (char **)malloc(n*sizeof(char *)); for (i = 0; i < n; i++) { ttypecopy[i] = (char *)malloc(FLEN_VALUE*sizeof(char)); strcpy(ttypecopy[i],ttype[i]); } /* check whether there are any other non ASCII-text characters (FITS standard R14). Also "uppercase" the working copies. */ for (i = 0; i < n; i++) { p = ttype[i]; q = ttypecopy[i]; if(!strlen(p)) { sprintf(errmes, "Column #%d has no name (No TTYPE%d keyword).",i+1, i+1); wrtwrn(out,errmes,0); continue; } /* disable this check (it was only a warning) if( (*p > 'z' || *p < 'a') && (*p > 'Z' || *p <'A') && (*p > '9' || *p < '0') ) { sprintf(errmes,"Column #%d: Name \"%s\" does not begin with a letter or a digit.",i+1,ttype[i]); wrtwrn(out,errmes,1); } */ while(*p != '\0') { if( (*p > 'z' || *p < 'a') && (*p > 'Z' || *p < 'A') && (*p > '9' || *p < '0') && (*p != '_')) { sprintf(errmes, "Column #%d: Name \"%s\" contains character \'%c\' other than letters, digits, and \"_\".", i+1,ttype[i],*p); wrtwrn(out,errmes,0); } if(*p <= 'z' || *p >= 'a') *q = toupper(*p); p++; q++; } } cols = (ColName **)calloc(n, sizeof(ColName *)); for (i=0; i < n; i++) { cols[i] = (ColName *)malloc(sizeof(ColName)); cols[i]->name = ttypecopy[i]; cols[i]->index = i+1; } /* sort the column name in the ascending order of name field*/ qsort(cols, n, sizeof(ColName *), compcol); /* Check the duplication of the column name */ for (i = 0; i < n-1; i++) { if(!strlen(cols[i]->name)) continue; /* disable this warning if(!strncmp(cols[i]->name,cols[i+1]->name,16)) { sprintf(errmes, "Columns #%d, %s and #%d, %s are not unique within first 16 characters(case insensitive).", cols[i]->index, ttype[(cols[i]->index-1)], cols[i+1]->index, ttype[(cols[i+1]->index-1)]); wrtwrn(out,errmes,1); } */ if(!strcmp(cols[i]->name,cols[i+1]->name)) { sprintf(errmes, "Columns #%d, %s and #%d, %s are not unique (case insensitive).", cols[i]->index, ttype[(cols[i]->index-1)], cols[i+1]->index, ttype[(cols[i+1]->index-1)]); wrtwrn(out,errmes,0); } } for (i = 0; i < n; i++) { free(cols[i]); free(ttypecopy[i]);} free(cols); free(ttypecopy); return; } /************************************************************* * * parse_vtform * * Parse the tform of the variable length vector. * * *************************************************************/ void parse_vtform(fitsfile *infits, FILE *out, FitsHdu *hduptr, int colnum, /* column number */ int* datacode, /* data code */ long* maxlen /* maximum length of the vector */ ) { int i = 0; int status = 0; char *p; *maxlen = -1; strcpy(temp,tform[colnum-1]); p = temp; if(isdigit((int)*p)) sscanf(ptemp,"%d",&i); if(i > 1) { sprintf(errmes,"Illegal repeat value for value %s of TFORM%d.", tform[colnum-1], colnum); wrterr(out,errmes,1); } while(isdigit((int)*p))p++; if( (*p != 'P') && (*p != 'Q') ) { sprintf(errmes, "TFORM%d is not for the variable length array: %s.", colnum, tform[colnum-1]); wrterr(out,errmes,1); } fits_get_coltype(infits,colnum, datacode, NULL, NULL, &status); status = 0; p += 2; if(*p != '(') return; p++; if(!isdigit((int)*p)) { sprintf(errmes, "Bad value of TFORM%d: %s.",colnum,tform[colnum-1]); wrterr(out,errmes,1); } sscanf(p,"%ld",maxlen); while(isdigit((int)*p))p++; if(*p != ')') { sprintf(errmes, "Bad value of TFORM%d: %s.",colnum,tform[colnum-1]); wrterr(out,errmes,1); } return; } /************************************************************* * * print_title * * Print the title of the HDU. * when verbose < 2, called by wrterr and wrtwrn. * *************************************************************/ void print_title(FILE* out, int hdunum, int hdutype) { static char hdutitle[64]; static int oldhdu = 0; /* print out the title */ curhdu = hdunum; curtype = hdutype; if(oldhdu == curhdu) return; /* Do not print it twice */ if(curhdu == 1){ sprintf(hdutitle," HDU %d: Primary Array ", curhdu); } else { switch (curtype) { case IMAGE_HDU: sprintf(hdutitle," HDU %d: Image Exten. ", curhdu); break; case ASCII_TBL: sprintf(hdutitle," HDU %d: ASCII Table ", curhdu); break; case BINARY_TBL: sprintf(hdutitle," HDU %d: BINARY Table ", curhdu); break; default: sprintf(hdutitle," HDU %d: Unknown Ext. ", curhdu); break; } } wrtsep(out,'=',hdutitle,60); wrtout(out," "); oldhdu = curhdu; if(curhdu == totalhdu) oldhdu = 0; /* reset the old hdu at the last hdu */ return; } /************************************************************* * * print_header * * Print the header of the HDU. * *************************************************************/ void print_header(FILE* out) { char htemp[100]; int i; for (i=1; i <= ncards; i++) { sprintf(htemp,"%4d | %s",i,cards[i-1]); wrtout(out, htemp); } wrtout(out," "); return; } /************************************************************* * * print_summary * * Print out the summary of this hdu. * **************************************************************/ void print_summary(fitsfile *infits, /* input fits file */ FILE* out, /* output ascii file */ FitsHdu *hduptr ) { int i = 0; char extver[10]; char extnv[FLEN_VALUE]; long npix; int hdutype; /* get the error number and wrn number */ set_hduerr(hduptr->hdunum); hdutype = hduptr->hdutype; sprintf(comm," %d header keywords", hduptr->nkeys); wrtout(out,comm); wrtout(out," "); if(hdutype == ASCII_TBL || hdutype== BINARY_TBL) { sprintf(extnv, "%s",hduptr->extname); if (hduptr->extver!=-999) { sprintf(extver,"(%d)",hduptr->extver); strcat(extnv,extver); } #if (USE_LL_SUFFIX == 1) sprintf(comm," %s (%d columns x %lld rows)", extnv, hduptr->ncols, hduptr->naxes[1]); #else sprintf(comm," %s (%d columns x %ld rows)", extnv, hduptr->ncols, hduptr->naxes[1]); #endif wrtout(out,comm); if(hduptr->ncols) { wrtout(out," "); sprintf(comm, " Col# Name (Units) Format"); wrtout(out,comm); } for ( i = 0; i < hduptr->ncols; i++) { if(strlen(tunit[i])) sprintf(extnv,"%s (%s)",ttype[i],tunit[i]); else sprintf(extnv,"%s",ttype[i]); sprintf(comm," %3d %-20.20s %-10.10s", i+1, extnv, tform[i]); wrtout(out,comm); } } else if(hdutype == IMAGE_HDU && hduptr->isgroup) { sprintf(comm, " %d Random Groups, ",hduptr->gcount); switch(hduptr->bitpix) { case BYTE_IMG: strcpy(temp," 8-bit integer pixels, "); break; case SHORT_IMG: strcpy(temp," 16-bit integer pixels, "); break; case USHORT_IMG: strcpy(temp," 16-bit unsigned integer pixels, "); break; case LONG_IMG: strcpy(temp," 32-bit integer pixels, "); break; case LONGLONG_IMG: strcpy(temp," 64-bit long integer pixels, "); break; case ULONG_IMG: strcpy(temp," 32-bit unsigned integer pixels, "); break; case FLOAT_IMG: strcpy(temp," 32-bit floating point pixels, "); break; case DOUBLE_IMG: strcpy(temp," 64-bit double precision pixels, "); break; default: strcpy(temp," unknown datatype, "); break; } strcat(comm,temp); sprintf(temp," %d axes ",hduptr->naxis); strcat(comm,temp); #if (USE_LL_SUFFIX == 1) sprintf(temp, "(%lld",hduptr->naxes[0]); #else sprintf(temp, "(%ld",hduptr->naxes[0]); #endif strcat(comm,temp); npix = hduptr->naxes[0]; for ( i = 1; i < hduptr->naxis; i++){ npix *= hduptr->naxes[i]; #if (USE_LL_SUFFIX == 1) sprintf(temp, " x %lld",hduptr->naxes[i]); #else sprintf(temp, " x %ld",hduptr->naxes[i]); #endif strcat(comm,temp); } strcat(comm,"), "); wrtout(out,comm); } else if(hdutype == IMAGE_HDU) { if(hduptr->naxis > 0) { if(hduptr->hdunum == 1) { strcpy(extnv,""); } else { sprintf(extnv, "%s",hduptr->extname); if (hduptr->extver!=-999) { sprintf(extver," (%d)",hduptr->extver); strcat(extnv,extver); } } strcpy(comm,extnv); switch(hduptr->bitpix) { case BYTE_IMG: strcpy(temp," 8-bit integer pixels, "); break; case SHORT_IMG: strcpy(temp," 16-bit integer pixels, "); break; case USHORT_IMG: strcpy(temp," 16-bit unsigned integer pixels, "); break; case LONG_IMG: strcpy(temp," 32-bit integer pixels, "); break; case LONGLONG_IMG: strcpy(temp," 64-bit long integer pixels, "); break; case ULONG_IMG: strcpy(temp," 32-bit unsigned integer pixels, "); break; case FLOAT_IMG: strcpy(temp," 32-bit floating point pixels, "); break; case DOUBLE_IMG: strcpy(temp," 64-bit double precision pixels, "); break; default: strcpy(temp," unknown datatype, "); break; } strcat(comm,temp); sprintf(temp," %d axes ",hduptr->naxis); strcat(comm,temp); #if (USE_LL_SUFFIX == 1) sprintf(temp, "(%lld",hduptr->naxes[0]); #else sprintf(temp, "(%ld",hduptr->naxes[0]); #endif strcat(comm,temp); npix = hduptr->naxes[0]; for ( i = 1; i < hduptr->naxis; i++){ npix *= hduptr->naxes[i]; #if (USE_LL_SUFFIX == 1) sprintf(temp, " x %lld",hduptr->naxes[i]); #else sprintf(temp, " x %ld",hduptr->naxes[i]); #endif strcat(comm,temp); } strcat(comm,"), "); wrtout(out,comm); } else{ sprintf(comm," Null data array; NAXIS = 0 "); wrtout(out,comm); } } wrtout(out," "); return; } /************************************************************* * * close_hdu * * Free the memory allocated to the FitsHdu structure and * other temporary spaces. * **************************************************************/ void close_hdu( FitsHdu *hduptr ) { int i; int n; /* free memories */ for (i=0; i < ncards; i++) free(cards[i]); n = hduptr->nkeys - 4 - hduptr->naxis ; /* excluding the SIMPLE, BITPIX, NAXIS, NAXISn and END */ for (i=0; i < n; i++) free(hduptr->kwds[i]); for (i=0; i < hduptr->ncols; i++) { free(hduptr->datamin[i]); free(hduptr->datamax[i]); free(hduptr->tnull[i]); } if(hduptr->hdutype == ASCII_TBL && hduptr->hdutype == BINARY_TBL){ if(hduptr->ncols > 0)free(ttype); if(hduptr->ncols > 0)free(tunit); if(hduptr->ncols > 0)free(tform); } if(hduptr->naxis) free(hduptr->naxes); if(hduptr->ncols > 0)free(hduptr->datamax); if(hduptr->ncols > 0)free(hduptr->datamin); if(hduptr->ncols > 0)free(hduptr->tnull); free(hduptr->kwds); free(cards); free(tmpkwds); return; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fvrf_key.c����������������������������������������������������������������000644 �000765 �000024 �00000045235 12651445460 017646� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ #include "fverify.h" int fits_parse_card(FILE *out, /* output file pointer */ int kpos, /* keyposition starting from 1 */ char *card, /* key card */ char *kname, /* key name */ kwdtyp *ktype, /* key type */ char *kvalue, /* key value */ char *kcomm /* comment */ ) /* Ref: Defininition of the Flexible Image Transport System(FITS), Sec. 5.1 and 5.2. */ { char vind[3]; char *p; char **pt; int i; char temp1[FLEN_CARD]; unsigned long stat = 0; *kname = '\0'; *kvalue = '\0'; *kcomm = '\0'; *ktype = UNKNOWN; if(strlen(card) > FLEN_CARD-1 ) { strncpy(temp1,card,20); temp1[21]='\0'; sprintf(errmes,"card %s is > 80.",card); wrterr(out,errmes,1); return 1; } card[FLEN_CARD-1] = '\0'; /* get the kname */ strncpy(kname, card, 8); kname[8] = '\0'; /* take out the trailing space */ i = 7; p = &kname[7]; while(isspace((int)*p) && i >= 0) {*p = '\0'; p--; i--;} /* Whether the keyword name is left justified */ i = 0; p = &kname[0]; while(isspace((int)*p) && *p != '\0' ) { p++; i++;} if( i < 8 && i > 0) { sprintf(errmes,"Keyword #%d: Name %s is not left justified.", kpos,kname); wrterr(out,errmes,1); } /* Whether the characters in keyword name are valid */ while(*p != '\0' ){ if((*p < 'A' || *p > 'Z')&& (*p < '0' || *p > '9')&& (*p != '-' && *p != '_') ) { sprintf(errmes, "Keyword #%d: Name \"%s\" contains char \"%c\" which is not letter, digit, \"-\", and \"_\".",kpos,kname,*p); wrterr(out,errmes,1); break; } p++; i++; } /* COMMENT, HISTORY, HIERARCH and "" keywords */ if( !strcmp(kname,"COMMENT") || !strcmp(kname,"HISTORY") || !strcmp(kname,"HIERARCH") || !strcmp(kname,"CONTINUE") || !strcmp(kname,"") ){ *ktype = COM_KEY; p = &card[8]; strcpy(kcomm, p); kcomm[FLEN_COMMENT-1] = '\0'; for( ; *p != '\0'; p++) { if(!isprint((int)*p)) { sprintf(errmes, "Keyword #%d, %s: String contains non-text characters.", kpos,kname); wrterr(out,errmes,1); return 1; } } p = kname; while(!isspace((int)*p)&& *p != '\0')p++; *p = '\0'; return 0; } /* End Keyword: 9-80 shall be filled with ASCII blanks \x20 */ if( !strcmp(kname,"END") ){ *ktype = COM_KEY; if(card[3] == '\0') return 0; for( p = &card[8]; *p != '\0'; p++) { if(*p != '\x20' ){ wrterr(out,"END keyword contains non-blank characters.",1); return 1; } } kname[3] = '\0'; return 0; } /* check for value indicator */ p = &card[8]; strncpy(vind,p,2); vind[2] = '\0'; if(strcmp(vind,"= ") && strcmp(vind,"=") ){ /* no value indicator, so this is a commentary keyword */ *ktype = COM_KEY; strcpy(kcomm, p); kcomm[FLEN_COMMENT-1] = '\0'; for( ; *p != '\0'; p++) { if(!isprint((int)*p)) { sprintf(errmes, "Keyword #%d, %s: String contains non-text characters.", kpos,kname); wrterr(out,errmes,1); return 1; } } p = kname; while(!isspace((int)*p)&& *p != '\0')p++; *p = '\0'; return 0; } p = &card[10]; while (isspace((int)*p) && *p != '\0') p++; pt = &p; switch (*p) { case '\'': /* string */ get_str(pt, kvalue,&stat); *ktype = STR_KEY; p = *pt; if(*p != '\0') get_comm(pt,kcomm,&stat); break; case 'T': case 'F': /*logical */ get_log(pt, kvalue, &stat); *ktype = LOG_KEY; p = *pt; if(*p != '\0') get_comm(pt,kcomm,&stat); break; case '+': case '-': case '.': /* number */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': get_num(pt, kvalue, ktype, &stat); p = *pt; if(*p != '\0') get_comm(pt,kcomm,&stat); break; case '(': /* complex number */ get_cmp(pt, kvalue, ktype, &stat); p = *pt; if(*p != '\0') get_comm(pt,kcomm,&stat); break; case '/': /* comment */ if(*p != '\0') get_comm(pt,kcomm,&stat); *ktype = UNKNOWN; break; default: get_unknown(pt,kvalue,ktype,&stat); p = *pt; if(*p != '\0') get_comm(pt,kcomm,&stat); } /* take out the trailing blanks for non-string keys */ if(*ktype != STR_KEY) { i = strlen(kvalue); p = &kvalue[i-1]; while(isspace((int)*p) && i >0) { *p = '\0'; p--; i--; } if(i == 0 && isspace((int)*p))*p = '\0'; } pr_kval_err(out,kpos,kname,kvalue,stat); if(stat != 0) return 1; return 0; } /* parse And test the string keys */ void get_str(char **pt, /* card string from character 11*/ char *kvalue, /* key value string */ unsigned long *stat /* error number */ ) { char *pi; char prev; /* previous char */ int nchar = 0; char *p; p = *pt; pi = p; p++; prev = 'a'; while(*p != '\0') { if( !isprint((int)*p) )*stat |= BAD_STR; if(prev == '\'' && *p != '\'') break; if(prev == '\'' && *p == '\'') { /* skip the '' */ p++; prev = 'a'; } else { prev = *p; p++; } } p--; if(*p != '\'') *stat |= NO_TRAIL_QUOTE; pi++; nchar = p - pi ; /* excluding the ' */ strncpy(kvalue,pi,nchar); *(kvalue+nchar) = '\0'; pi = kvalue + (nchar -1) ; while(isspace((int)*pi)){ *pi = '\0'; pi--;} /* delete the trailing space */ p++; /* skip the ' */ while(isspace((int)*p) && *p != '\0') p++; *pt = p; return; } /* parse and test the logical keys */ void get_log(char **pt, /* card string */ char *kvalue, /* key value string */ unsigned long *stat /* error number */ ) { char *p; p = *pt; *kvalue = *p; kvalue[1] = '\0'; p++; while(isspace((int)*p)) p++; if(*p != '/' && *p != '\0') *stat |= BAD_LOGICAL; *pt = p; return; } /* parse and test the numerical keys */ void get_num(char **pt, /* card string */ char *kvalue, /* comment string */ kwdtyp *ktype, unsigned long *stat /* error number */ ) { char *pi; int set_deci = 0; int set_expo = 0; int set_sign = 0; int nchar; char *p; p = *pt; pi = p; *ktype = INT_KEY; if( *p != '+' && *p != '-' && !isdigit((int)*p) &&*p != '.') { *stat |= BAD_NUM; return; } if(*p == '.') { *ktype = FLT_KEY; set_deci = 1; } if(*p == '+'|| *p == '-') { set_sign = 1; } p++; while(!isspace((int)*p) && *p != '\0' && *p != '/') { if( *p == '.' && !set_deci ){ set_deci = 1; *ktype = FLT_KEY; p++; continue; } if( (*p == 'd'|| *p == 'e') && !set_expo) { set_expo = 1; *ktype = FLT_KEY; p++; if(*p == '+' || *p == '-') p++; *stat |= LOWCASE_EXPO; continue; } if( (*p == 'D'|| *p == 'E') && !set_expo) { set_expo = 1; *ktype = FLT_KEY; p++; if(*p == '+' || *p == '-') p++; continue; } if(!isdigit((int)*p)) *stat |= BAD_NUM; p++; } nchar = p - pi; strncpy(kvalue,pi,nchar); *(kvalue+nchar) = '\0'; while(isspace((int)*p) && *p != '\0') p++; *pt = p; return; } /* parse and test the complex keys */ void get_cmp(char **pt, /* card string */ char *kvalue, /* comment string */ kwdtyp *ktype, unsigned long *stat /* error number */ ) { char *p; char **pp; char *pr_beg; /* end of real part */ char *pr_end=0; /* end of real part */ char *pi_beg; /* beginning of the imaginay part */ char *pi_end=0; /* end of real part */ int nchar; int set_comm = 0; int set_paren = 0; unsigned long tr = 0; unsigned long ti = 0; kwdtyp rtype, itype; char temp[FLEN_CARD]; char card[FLEN_CARD]; strcpy(card,*pt); /* save the original */ card[FLEN_CARD-1] = '\0'; *ktype = CMI_KEY; /* default: integer complex */ p = card + 1; pr_beg = p; temp[0] = '\0'; while(*p != '\0' && *p != '/') { if(*p == ')') { set_paren = 1; pi_end = p; p++; break; } if(!set_comm && *p == ',') { set_comm = 1; pr_end = p; pi_beg = p+1; } else if(*p == ',') { *stat |= TOO_MANY_COMMA; } p++; } if(!set_comm) *stat |= NO_COMMA; if(!set_paren) { *stat |= NO_TRAIL_PAREN; pi_end = p; pi_end--; while(isspace((int)*pi_end))pi_end--; pi_end++; } nchar = pi_end - card ; strncpy(kvalue,card,nchar); *(kvalue+nchar) = '\0'; while(isspace((int)*p)&& *p != '\0') p++; *pt = *pt + (p - card); /* analyse the real and imagine part */ *pr_end = '\0'; *pi_end = '\0'; while(isspace((int)*pr_beg) && *pr_beg != '\0') pr_beg++; while(isspace((int)*pi_beg) && *pi_beg != '\0') pi_beg++; temp[0] = '\0'; pp = &pr_beg; get_num(pp, temp, &rtype, &tr); if(tr)*stat |= BAD_REAL; temp[0] = '\0'; pp = &pi_beg; get_num(pp, temp, &itype, &ti); if(ti)*stat |= BAD_IMG; if(rtype == FLT_KEY || itype == FLT_KEY) *ktype = CMF_KEY; return; } /* parse and test the comment keys */ void get_comm(char **pt, /* card string */ char *kcomm, /* comment string */ unsigned long *stat /* error number */ ) { char *pi; int nchar = 0; char *p; p = *pt; pi = p; if(*p != '/') { *stat |= NO_START_SLASH; } p++; while(*p != '\0') { if(!isprint((int)*p) ) *stat |= BAD_COMMENT; p++; } nchar = p - pi; strncpy(kcomm,pi,nchar); *(kcomm+nchar) = '\0'; return; } /* parsing the unknown keyword */ void get_unknown(char **pt, /* card string */ char *kvalue, /* comment string */ kwdtyp *ktype, unsigned long *stat /* error number */ ) { char *p; char *p1; char temp[FLEN_CARD]; p = *pt; strcpy(temp,*pt); p1 = temp; while(*p != '\0' && *p != '/') { p++; p1++;} *p1 = '\0'; p1 = temp; *pt = p; strcpy(kvalue, p1); *ktype = UNKNOWN; *stat |= UNKNOWN_TYPE; return ; } /* routine to print out the error of keyword value/comment */ void pr_kval_err(FILE *out, /* output FILE */ int kpos, /* keyposition starting from 1 */ char *kname, /* keyword name */ char *kval, /* keyword value */ unsigned long errnum /* error number */ ) { if(errnum == 0) return; if(errnum & BAD_STR) { sprintf(errmes, "Keyword #%d, %s: String \"%s\" contains non-text characters.", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & NO_TRAIL_QUOTE) { sprintf(errmes, "Keyword #%d, %s: The closing \"\'\" is missing in the string." , kpos,kname); wrterr(out,errmes,1); } if(errnum & BAD_LOGICAL) { sprintf(errmes,"Keyword #%d, %s: Bad logical value \"%s\".", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & BAD_NUM) { sprintf(errmes,"Keyword #%d, %s: Bad numerical value \"%s\".", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & LOWCASE_EXPO) { sprintf(errmes, "Keyword #%d, %s: lower-case exponent d or e is illegal in value %s.", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & NO_TRAIL_PAREN) { sprintf(errmes, "Keyword #%d, %s: Complex value \"%s\" misses closing \")\".", kpos,kname, kval); wrterr(out,errmes,1); } if(errnum & NO_COMMA) { sprintf(errmes, "keyword #%d, %s : Complex value \"%s\" misses \",\".", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & TOO_MANY_COMMA) { sprintf(errmes, "Keyword #%d, %s: Too many \",\" are in the complex value \"%s\".", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & BAD_REAL) { sprintf(errmes, "Keyword #%d, %s: Real part of complex value \"%s\" is bad.", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & BAD_IMG) { sprintf(errmes, "Keyword #%d, %s: Imagine part of complex value \"%s\" is bad.", kpos,kname,kval); wrterr(out,errmes,1); } if(errnum & NO_START_SLASH) { sprintf(errmes, "Keyword #%d, %s: Value and Comment not separated by a \"/\".", kpos,kname); wrterr(out,errmes,1); } if(errnum & BAD_COMMENT) { sprintf(errmes, "Keyword #%d, %s: Comment contains non-text characters.", kpos,kname); wrterr(out,errmes,1); } if(errnum & UNKNOWN_TYPE) { if (*kval != 0) { /* don't report null keywords as an error */ sprintf(errmes, "Keyword #%d, %s: Type of value \"%s\" is unknown.", kpos,kname,kval); wrterr(out,errmes,1); } } return ; } int check_str(FitsKey* pkey, FILE *out) { if(pkey->ktype == UNKNOWN && *(pkey->kvalue) == 0) { sprintf(errmes,"Keyword #%d, %s has a null value; expected a string.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); return 0; } else if(pkey->ktype != STR_KEY) { sprintf(errmes,"Keyword #%d, %s: \"%s\" is not a string.", pkey->kindex,pkey->kname, pkey->kvalue); wrterr(out,errmes,1); return 0; } return 1; } int check_int(FitsKey* pkey, FILE *out) { if(pkey->ktype == UNKNOWN && *(pkey->kvalue) == 0) { sprintf(errmes,"Keyword #%d, %s has a null value; expected an integer.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); return 0; } else if(pkey->ktype != INT_KEY) { sprintf(errmes,"Keyword #%d, %s: value = %s is not an integer.", pkey->kindex,pkey->kname, pkey->kvalue); if(pkey->ktype == STR_KEY) strcat(errmes," The value is entered as a string. "); wrterr(out,errmes,1); return 0; } return 1; } int check_flt(FitsKey* pkey, FILE *out) { if(pkey->ktype == UNKNOWN && *(pkey->kvalue) == 0) { sprintf(errmes,"Keyword #%d, %s has a null value; expected a float.", pkey->kindex,pkey->kname); wrterr(out,errmes,1); return 0; } else if(pkey->ktype != INT_KEY && pkey->ktype != FLT_KEY) { sprintf(errmes, "Keyword #%d, %s: value = %s is not a floating point number.", pkey->kindex,pkey->kname, pkey->kvalue); if(pkey->ktype == STR_KEY) strcat(errmes," The value is entered as a string. "); wrterr(out,errmes,1); return 0; } return 1; } int check_cmi(FitsKey* pkey, FILE *out) { if(pkey->ktype != CMI_KEY ) { sprintf(errmes, "Keyword #%d, %s: value = %s is not a integer complex number.", pkey->kindex,pkey->kname, pkey->kvalue); if(pkey->ktype == STR_KEY) strcat(errmes," The value is entered as a string. "); wrterr(out,errmes,1); return 0; } return 1; } int check_cmf(FitsKey* pkey, FILE *out) { if(pkey->ktype != CMI_KEY && pkey->ktype != CMF_KEY) { sprintf(errmes, "Keyword #%d, %s: value = %s is not a floating point complex number.", pkey->kindex,pkey->kname, pkey->kvalue); if(pkey->ktype == STR_KEY) strcat(errmes," The value is entered as a string. "); wrterr(out,errmes,1); return 0; } return 1; } int check_log(FitsKey* pkey, FILE *out) { if(pkey->ktype != LOG_KEY ) { sprintf(errmes, "Keyword #%d, %s: value = %s is not a logical constant.", pkey->kindex,pkey->kname, pkey->kvalue); if(pkey->ktype == STR_KEY) strcat(errmes," The value is entered as a string. "); wrterr(out,errmes,1); return 0; } return 1; } int check_fixed_int(char* card, FILE *out) { char *cptr; /* fixed format integer must be right justified in columns 11-30 */ cptr = &card[10]; while (*cptr == ' ')cptr++; /* skip leading spaces */ if (*cptr == '-') cptr++; /* skip leading minus sign */ else if (*cptr == '+') cptr++; /* skip leading plus sign */ while (isdigit((int) *cptr))cptr++; /* skip digits */ /* should be pointing to column 31 of the card */ if ((cptr - card) != 30) { sprintf(errmes, "%.8s mandatory keyword is not in integer fixed format:", card); wrterr(out,errmes,1); print_fmt(out,card,13); print_fmt(out," -------------------^",13); return 0; } return 1; } int check_fixed_log(char* card, FILE *out) { char *cptr; /* fixed format logical must have T or F in column 30 */ cptr = &card[10]; while (*cptr == ' ')cptr++; /* skip leading spaces */ if (*cptr != 'T' && *cptr != 'F') { sprintf(errmes, "%.8s mandatory keyword does not have T or F logical value.", card); wrterr(out,errmes,1); return 0; } /* should be pointing to column 31 of the card */ if ((cptr - card) != 29) { sprintf(errmes, "%.8s mandatory keyword is not in logical fixed format:", card); wrterr(out,errmes,1); print_fmt(out,card,13); print_fmt(out," -------------------^",13); return 0; } return 1; } int check_fixed_str(char* card, FILE *out) { char *cptr; /* fixed format string must have quotes in columns 11 and >= 20 */ /* This only applys to the XTENSION and TFORMn keywords. */ cptr = &card[10]; if (*cptr != '\'' ) { sprintf(errmes, "%.8s mandatory string keyword does not start in col 11.", card); wrterr(out,errmes,1); print_fmt(out,card,13); print_fmt(out," ^--------^",13); return 0; } cptr++; while (*cptr != '\'') { if (*cptr == '\0') { sprintf(errmes, "%.8s mandatory string keyword missing closing quote character:", card); wrterr(out,errmes,1); print_fmt(out,card,13); return 0; } cptr++; } if ((cptr - card) < 19) { sprintf(errmes, "%.8s mandatory string keyword ends before column 20.", card); wrterr(out,errmes,1); print_fmt(out,card,13); print_fmt(out," ^--------^",13); return 0; } return 1; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/fvrf_misc.c���������������������������������������������������������������000644 �000765 �000024 �00000020700 12651445460 017777� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of "fitsverify" and was imported from: http://heasarc.gsfc.nasa.gov/docs/software/ftools/fitsverify/ */ /****************************************************************************** * Function * wrtout: print messages in the streams of stdout and out. * wrterr: print erro messages in the streams of stderr and out. * wrtferr: print cfitsio erro messages in the streams of stderr and out. * wrtwrn: print warning messages in the streams of stdout and out. * wrtsep: print seperators. * num_err_wrn: Return the number of errors and warnings. * *******************************************************************************/ #include "fverify.h" static int nwrns = 0; static int nerrs = 0; static char temp[512]; void num_err_wrn(int *num_err, int *num_wrn) { *num_wrn = nwrns; *num_err = nerrs; return; } void reset_err_wrn() { nwrns = 0; nerrs = 0; return; } int wrtout(FILE *out, char *mess) { if(out != NULL )fprintf(out,"%s\n",mess); if(out == stdout) fflush(stdout); return 0; } int wrtwrn(FILE *out, char *mess, int isheasarc) { if(err_report) return 0; /* Don't print the warnings */ if(!heasarc_conv && isheasarc) return 0; /* heasarc warnings but with heasarc convention turns off */ nwrns++; strcpy(temp,"*** Warning: "); strcat(temp,mess); if(isheasarc) strcat(temp," (HEASARC Convention)"); print_fmt(out,temp,13); /* if(nwrns > MAXWRNS ) { fprintf(stderr,"??? Too many Warnings! I give up...\n"); } */ return nwrns; } int wrterr(FILE *out, char *mess, int severity ) { if(severity < err_report) { fits_clear_errmsg(); return 0; } nerrs++; strcpy(temp,"*** Error: "); strcat(temp,mess); if(out != NULL) { if ((out!=stdout) && (out!=stderr)) print_fmt(out,temp,13); /* if ERR2OUT is defined, then error messages will be sent to the stdout stream rather than to stderr */ #ifdef ERR2OUT print_fmt(stdout,temp,13); #else print_fmt(stderr,temp,13); #endif } if(nerrs > MAXERRORS ) { #ifdef ERR2OUT fprintf(stdout,"??? Too many Errors! I give up...\n"); #else fprintf(stderr,"??? Too many Errors! I give up...\n"); #endif close_report(out); exit(1); } fits_clear_errmsg(); return nerrs; } int wrtferr(FILE *out, char* mess, int *status, int severity) /* construct an error message: mess + cfitsio error */ { char ttemp[255]; if(severity < err_report) { fits_clear_errmsg(); return 0; } nerrs++; strcpy(temp,"*** Error: "); strcat(temp,mess); fits_get_errstatus(*status, ttemp); strcat(temp,ttemp); if(out != NULL ) { if ((out!=stdout) && (out!=stderr)) print_fmt(out,temp,13); /* if ERR2OUT is defined, then error messages will be sent to the stdout stream rather than to stderr */ #ifdef ERR2OUT print_fmt(stdout,temp,13); #else print_fmt(stderr,temp,13); #endif } *status = 0; fits_clear_errmsg(); if(nerrs > MAXERRORS ) { #ifdef ERR2OUT fprintf(stdout,"??? Too many Errors! I give up...\n"); #else fprintf(stderr,"??? Too many Errors! I give up...\n"); #endif close_report(out); exit(1); } return nerrs; } int wrtserr(FILE *out, char* mess, int *status, int severity) /* dump the cfitsio stack */ { char* errfmt = " %.67s\n"; int i; char tmp[20][80]; int nstack = 0; if(severity < err_report) { fits_clear_errmsg(); return 0; } nerrs++; strcpy(temp,"*** Error: "); strcat(temp,mess); strcat(temp,"(from CFITSIO error stack:)"); while(nstack < 20) { tmp[nstack][0] = '\0'; i = fits_read_errmsg(tmp[nstack]); if(!i && tmp[nstack][0]=='\0') break; nstack++; } if(out !=NULL) { if ((out!=stdout) && (out!=stderr)) { print_fmt(out,temp,13); for(i=0; i<=nstack; i++) fprintf(out,errfmt,tmp[i]); } #ifdef ERR2OUT print_fmt(stdout,temp,13); for(i=0; i<=nstack; i++) fprintf(stdout,errfmt,tmp[i]); #else print_fmt(stderr,temp,13); for(i=0; i<=nstack; i++) fprintf(stderr,errfmt,tmp[i]); #endif } *status = 0; fits_clear_errmsg(); if(nerrs > MAXERRORS ) { #ifdef ERR2OUT fprintf(stdout,"??? Too many Errors! I give up...\n"); #else fprintf(stderr,"??? Too many Errors! I give up...\n"); #endif close_report(out); exit(1); } return nerrs; } void print_fmt(FILE *out, char *temp, int nprompt) /* Print output of messages in a 80 character record. Continue lines are aligned. */ { char *p; int i,j; int clen; char tmp[81]; static char cont_fmt[80]; static int save_nprompt = 0; if (out == NULL) return; if(nprompt != save_nprompt) { for (i = 0; i < nprompt; i++) cont_fmt[i] = ' '; strcat(cont_fmt,"%.67s\n"); save_nprompt = nprompt; } i = strlen(temp) - 80; if(i <= 0) { fprintf(out,"%.80s\n",temp); } else{ p = temp; clen = 80 -nprompt; strncpy(tmp,p,80); tmp[80] = '\0'; if(isprint((int)*(p+79)) && isprint((int)*(p+80)) && *(p+80) != '\0') { j = 79; while(*(p+j) != ' ' && j > 0) j--; p += j; while( *p == ' ')p++; tmp[j] = '\0'; } else if( *(p+80) == ' ') { j = 80; while( *(p+j) == ' ') j++; p += j; } else { p += 80; } fprintf(out,"%.80s\n",tmp); while(*p != '\0' && i > 0) { strncpy(tmp,p,clen); tmp[clen] = '\0'; i = strlen(p)- clen; if(i > 0 && isprint((int)*(p+clen-1)) && isprint((int)*(p+clen)) && *(p+clen) != '\0') { j = clen; while(*(p+j)!= ' ' && j > 0) j--; p += j; while( *p == ' ')p++; tmp[j] = '\0'; } else if(i> 0 && *(p+clen) == ' ') { j = clen; while( *(p+j) == ' ') j++; p += j; } else if(i> 0) { p+= clen; } fprintf(out,cont_fmt,tmp); } } if(out==stdout) fflush(stdout); return; } void wrtsep(FILE *out,char fill, char *title, int nchar) /* print a line of char fill with string title in the middle */ { int ntitle; char *line; char *p; int first_end; int i = 0; ntitle = strlen(title); if(ntitle > nchar) nchar = ntitle; if(nchar <= 0) return; line = (char *)malloc((nchar+1)*sizeof(char)); p = line; if(ntitle < 1) { for (i=0; i < nchar; i++) {*p = fill; p++;} *p = '\0'; } else { first_end = ( nchar - ntitle)/2; for (i = 0; i < first_end; i++) { *p = fill; p++;} *p = '\0'; strcat(line, title); p += ntitle; for( i = first_end + ntitle; i < nchar; i++) {*p = fill; p++;} *p = '\0'; } if(out != NULL )fprintf(out,"%s\n",line); if(out == stdout )fflush(out); free (line); return ; } /* comparison function for the FitsKey structure array */ int compkey (const void *key1, const void *key2) { char *name1; char *name2; name1 = (*(FitsKey **)key1)->kname; name2 = (*(FitsKey **)key2)->kname; return strncmp(name1,name2,FLEN_KEYWORD); } /* comparison function for the colname structure array */ int compcol (const void *col1, const void *col2) { char *name1; char *name2; name1 = (*(ColName **)col1)->name; name2 = (*(ColName **)col2)->name; return strcmp(name1,name2); } /* comparison function for the string pattern maching*/ int compstrp (const void *str1, const void *str2) { char *p; char *q; p = (char *)(*(char**) str1); q = (char *)(*(char**) str2); while( *q == *p && *q != '\0') { p++; q++; if(*p == '\0') return 0; /* str2 is longer than str1, but matched */ } return (*p - *q); } /* comparison function for the string exact maching*/ int compstre (const void *str1, const void *str2) { char *p; char *q; p = (char *)(*(char**) str1); q = (char *)(*(char**) str2); return strcmp( p, q); } ����������������������������������������������������������������astrometry.net-0.67/blind/get-wcs.c�����������������������������������������������������������������000644 �000765 �000024 �00000005631 12651445460 017400� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Reads a FITS file, tries to interpret a WCS header and writes out a TAN interpretation of it. */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <math.h> #include "sip.h" #include "sip_qfits.h" #include "fitsioutils.h" #include "starutil.h" #include "errors.h" #include "log.h" #include "ioutils.h" static char* OPTIONS = "ho:e:t"; static void printHelp(char* progname) { printf("%s <input-file>\n" " [-e <extension>]\n" " [-o <output-file>]\n" " [-t]: force TAN (not SIP)\n" "\n", progname); } int main(int argc, char *argv[]) { char* progname = argv[0]; int argchar; char* infn = NULL; char* outfn = NULL; sip_t* wcs; int ext = 0; anbool forcetan = FALSE; tan_t* tan; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case '?': case 'h': printHelp(progname); return 0; case 'e': ext = atoi(optarg); break; case 'o': outfn = optarg; break; case 't': forcetan = TRUE; break; default: return -1; } if (optind != (argc - 1)) { printHelp(progname); exit(-1); } infn = argv[optind]; log_init(LOG_MSG); fits_use_error_system(); errors_log_to(stderr); wcs = sip_read_tan_or_sip_header_file_ext(infn, ext, NULL, forcetan); if (!wcs) { ERROR("Failed to parse WCS header"); exit(-1); } tan = &(wcs->wcstan); printf("crval1 %.12g\n", tan->crval[0]); printf("crval2 %.12g\n", tan->crval[1]); printf("crpix1 %g\n", tan->crpix[0]); printf("crpix2 %g\n", tan->crpix[1]); printf("cd11 %.12g\n", tan->cd[0][0]); printf("cd12 %.12g\n", tan->cd[0][1]); printf("cd21 %.12g\n", tan->cd[1][0]); printf("cd22 %.12g\n", tan->cd[1][1]); if (wcs->a_order) { printf("a_order %i\n", wcs->a_order); printf("b_order %i\n", wcs->b_order); // FIXME -- print the coefficients! } if (outfn) { FILE* fout; anbool tostdout; tostdout = streq(outfn, "-"); if (tostdout) fout = stdout; else { fout = fopen(outfn, "wb"); if (!fout) { SYSERROR("Failed to open output file %s", outfn); exit(-1); } } if (wcs->a_order) { if (sip_write_to(wcs, fout)) { ERROR("Failed to write SIP header to file \"%s\"", outfn); exit(-1); } } else { if (tan_write_to(&(wcs->wcstan), fout)) { ERROR("Failed to write TAN header to file \"%s\"", outfn); exit(-1); } } if (!tostdout) { if (fclose(fout)) { SYSERROR("Failed to close output file \"%s\"", outfn); exit(-1); } } } return 0; } �������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/hpgrid.c������������������������������������������������������������������000644 �000765 �000024 �00000011633 12651445460 017303� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Write Matlab figures to demonstrate the correctness of the Healpix code. */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "healpix.h" #include "starutil.h" #include "mathutil.h" #define OPTIONS "hN:nM:F:rRe" void print_help(char* progname) { printf("usage:\n\n" "%s\n" " [-N <nside>] (default 1)\n" " [-n]: draw lines to show neighbours\n" " [-M <marker-size>]: change the size of the circles on the endpoints of the neighbour lines.\n" " [-F <font-size>]\n" " [-r]: show RING index\n" " [-R]: show decomposed RING index (ring number + longitude index)\n" " [-e]: show NESTED index\n" "\n", progname); } enum modes { MODE_XY, MODE_XY_D, MODE_RING, MODE_RING_D, MODE_NESTED }; int main(int argc, char** args) { int c; int Nside = 1; int HP, hp; int i; double* radecs; double markersize = 20.0; double fontsize = 10.0; anbool do_neighbours = FALSE; int mode = MODE_XY; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'N': Nside = atoi(optarg); break; case 'n': do_neighbours = TRUE; break; case 'M': markersize = atof(optarg); break; case 'F': fontsize = atof(optarg); break; case 'r': mode = MODE_RING; break; case 'R': mode = MODE_RING_D; break; case 'e': mode = MODE_NESTED; break; } } HP = 12 * Nside * Nside; printf("Nside=%i;\n", Nside); radecs = malloc(HP * 2 * sizeof(double)); for (hp=0; hp<HP; hp++) { double xyz[3]; double ra, dec; healpix_to_xyzarr(hp, Nside, 0.5, 0.5, xyz); xyzarr2radec(xyz, &ra, &dec); radecs[2*hp] = ra; radecs[2*hp+1] = dec; } printf("figure(1);\n"); printf("clf;\n"); printf("xmargin=0.5; ymargin=0.1;\n"); printf("axis([0-xmargin, 2*pi+xmargin, -pi/2-ymargin, pi/2+ymargin]);\n"); printf("texts=[];\n"); printf("lines=[];\n"); // draw the large-healpix boundaries. for (hp=0; hp<12; hp++) { double xyz[3]; double crd[6*2]; double xy[] = { 0.0,0.001, 0.0,1.0, 0.999,1.0, 1.0,0.999, 1.0,0.0, 0.001,0.0 }; for (i=0; i<6; i++) { healpix_to_xyzarr(hp, 1, xy[i*2], xy[i*2+1], xyz); xyzarr2radec(xyz, crd+i*2+0, crd+i*2+1); } printf("xy=["); for (i=0; i<7; i++) printf("%g,%g;", crd[(i%6)*2+0], crd[(i%6)*2+1]); printf("];\n"); printf("[la, lb] = wrapline(xy(:,1),xy(:,2));\n"); printf("set(la, 'Color', 'b');\n"); printf("set(lb, 'Color', 'b');\n"); } if (do_neighbours) { for (hp=0; hp<HP; hp++) { uint neigh[8]; uint nn; nn = healpix_get_neighbours(hp, neigh, Nside); for (i=0; i<nn; i++) { printf("[la,lb]=wrapline([%g,%g],[%g,%g]);\n", radecs[2*hp], radecs[2*neigh[i]], radecs[2*hp+1], radecs[2*neigh[i]+1]); printf("set([la,lb], " "'Color', [0.5,0.5,0.5], " "'Marker', 'o', " "'MarkerEdgeColor', 'k', " //"'MarkerFaceColor', 'none', " "'MarkerFaceColor', 'white', " "'MarkerSize', %g);\n", markersize); printf("set(lb, 'LineStyle', '--');\n"); } } } for (hp=0; hp<HP; hp++) { printf("texts(%i)=text(%g, %g, '", hp+1, radecs[2*hp], radecs[2*hp+1]); switch (mode) { case MODE_XY: printf("%i", hp); break; case MODE_XY_D: { uint bighp, x, y; healpix_decompose_xy(hp, &bighp, &x, &y, Nside); printf("%i,%i,%i", bighp, x, y); } break; case MODE_RING: printf("%i", healpix_xy_to_ring(hp, Nside)); break; case MODE_RING_D: { uint ring; uint ringnum, longind; ring = healpix_xy_to_ring(hp, Nside); healpix_decompose_ring(ring, Nside, &ringnum, &longind); printf("%i,%i", ringnum, longind); } break; case MODE_NESTED: printf("%i", healpix_xy_to_nested(hp, Nside)); break; } printf("', 'HorizontalAlignment', 'center', 'FontSize', %g);\n", fontsize); } // Verify decompose / compose RING. for (hp=0; hp<HP; hp++) { uint ring, longind; int hp2; healpix_decompose_ring(hp, Nside, &ring, &longind); hp2 = healpix_compose_ring(ring, longind, Nside); if (hp2 != hp) { fprintf(stderr, "Error: %i -> ring %i, longind %i -> %i.\n", hp, ring, longind, hp2); } } // Verify XY -> RING -> XY for (hp=0; hp<HP; hp++) { int ring, hp2; ring = healpix_xy_to_ring(hp, Nside); hp2 = healpix_ring_to_xy(ring, Nside); if (hp2 != hp) { uint bighp, x, y; uint bighp2, x2, y2; uint ringind, longind; healpix_decompose_xy(hp, &bighp, &x, &y, Nside); healpix_decompose_xy(hp2, &bighp2, &x2, &y2, Nside); healpix_decompose_ring(ring, Nside, &ringind, &longind); fprintf(stderr, "Error: hp %i (bighp %i, x %i, y %i) -> ring %i (ring %i, long %i) -> hp %i (bighp %i, x %i, y %i).\n", hp, bighp, x, y, ring, ringind, longind, hp2, bighp2, x2, y2); } } free(radecs); return 0; } �����������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/hpowned.c�����������������������������������������������������������������000644 �000765 �000024 �00000004425 12651445460 017473� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <assert.h> #include "healpix.h" #include "starutil.h" #include "mathutil.h" #include "boilerplate.h" #define OPTIONS "hN:mf:" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " [-N <nside>] (default 1)\n" " [-m (to include a margin of one small healpixel)]\n" " [-f <format>]: printf format for the output (default %%03i)\n" " <hp> [<hp> ...]\n", progname); } int main(int argc, char** args) { int c; int Nside = 1; int HP; int optstart; anbool margin = FALSE; int* owned; int i; double hparea; char* format = "%03i"; if (argc == 1) { print_help(args[0]); exit(0); } while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'f': format = optarg; break; case 'N': Nside = atoi(optarg); break; case 'm': margin = TRUE; break; } } optstart = optind; HP = 12 * Nside * Nside; fprintf(stderr, "Nside=%i, number of small healpixes=%i, margin=%c\n", Nside, HP, (margin?'Y':'N')); hparea = 4.0 * M_PI * square(rad2arcmin(1.0)) / (double)HP; fprintf(stderr, "Small healpix area = %g arcmin^2, length ~ %g arcmin.\n", hparea, sqrt(hparea)); owned = malloc(HP * sizeof(int)); for (optind=optstart; optind<argc; optind++) { int bighp = atoi(args[optind]); memset(owned, 0, HP * sizeof(int)); // for each big healpix, find the set of small healpixes it owns // (including a bit of overlap) for (i=0; i<HP; i++) { int big, x, y; int nn, neigh[8], k; healpix_decompose_xy(i, &big, &x, &y, Nside); if (big != bighp) continue; owned[i] = 1; if (margin) { if (x == 0 || y == 0 || (x == Nside-1) || (y == Nside-1)) { // add its neighbours. nn = healpix_get_neighbours(i, neigh, Nside); for (k=0; k<nn; k++) owned[neigh[k]] = 1; } } } //printf("HP %i owns:\n", bighp); for (i=0; i<HP; i++) { if (owned[i]) { printf(format, i); printf(" "); } } printf("\n"); } free(owned); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/hpquads-main.c������������������������������������������������������������000644 �000765 �000024 �00000007760 12651445460 020423� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <limits.h> #include <sys/time.h> #include <sys/resource.h> #include <assert.h> #include "hpquads.h" #include "healpix.h" #include "starutil.h" #include "codefile.h" #include "mathutil.h" #include "quadfile.h" #include "kdtree.h" #include "tic.h" #include "fitsioutils.h" #include "permutedsort.h" #include "bt.h" #include "rdlist.h" #include "starkd.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "quad-utils.h" #include "quad-builder.h" static const char* OPTIONS = "hi:c:q:bn:u:l:d:p:r:L:RI:F:HEv"; static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -i <input-filename> (star kdtree (skdt.fits) input file)\n" " -c <codes-output-filename> (codes file (code.fits) output file)\n" " -q <quads-output-filename> (quads file (quad.fits) output file)\n" " -n <nside> healpix nside\n" " -u <scale> upper bound of quad scale (arcmin)\n" " [-l <scale>] lower bound of quad scale (arcmin)\n" " [-d <dimquads>] number of stars in a \"quad\".\n" " [-p <passes>] number of rounds of quad-building (ie, # quads per healpix cell, default 1)\n" " [-r <reuse-times>] number of times a star can be used.\n" " [-L <max-reuses>] make extra passes through the healpixes, increasing the \"-r\" reuse\n" " limit each time, up to \"max-reuses\".\n" " [-I <unique-id>] set the unique ID of this index\n\n" " [-E]: scan through the catalog, checking which healpixes are occupied.\n" " [-v]: verbose\n" "\nReads skdt, writes {code, quad}.\n\n" , progname); } int main(int argc, char** argv) { int argchar; char *quadfn = NULL; char *codefn = NULL; char *skdtfn = NULL; int Nside = 0; int id = 0; int passes = 1; int Nreuse = 3; int Nloosen = 0; anbool scanoccupied = FALSE; int dimquads = 4; double scale_min_arcmin = 0.0; double scale_max_arcmin = 0.0; int loglvl = LOG_MSG; int i; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'E': scanoccupied = TRUE; break; case 'd': dimquads = atoi(optarg); break; case 'L': Nloosen = atoi(optarg); break; case 'r': Nreuse = atoi(optarg); break; case 'p': passes = atoi(optarg); break; case 'I': id = atoi(optarg); break; case 'n': Nside = atoi(optarg); break; case 'i': skdtfn = optarg; break; case 'c': codefn = optarg; break; case 'q': quadfn = optarg; break; case 'u': scale_max_arcmin = atof(optarg); break; case 'l': scale_min_arcmin = atof(optarg); break; case 'h': print_help(argv[0]); exit(0); default: return -1; } log_init(loglvl); if (optind != argc) { print_help(argv[0]); printf("\nExtra command-line args were given: "); for (i=optind; i<argc; i++) { printf("%s ", argv[i]); } printf("\n"); exit(-1); } if (!skdtfn || !codefn || !quadfn) { printf("Specify in & out filenames, bonehead!\n"); print_help(argv[0]); exit( -1); } if (dimquads > DQMAX) { ERROR("Quad dimension %i exceeds compiled-in max %i.\n", dimquads, DQMAX); exit(-1); } if (scale_max_arcmin == 0.0) { ERROR("Must specify maximum quad scale: -u <scale>"); exit(-1); } if (!id) logmsg("Warning: you should set the unique-id for this index (-i).\n"); if (hpquads_files(skdtfn, codefn, quadfn, Nside, scale_min_arcmin, scale_max_arcmin, dimquads, passes, Nreuse, Nloosen, id, scanoccupied, NULL, NULL, 0, argv, argc)) { ERROR("hpquads failed"); exit(-1); } return 0; } ����������������astrometry.net-0.67/blind/hpquads.c�����������������������������������������������������������������000644 �000765 �000024 �00000042005 12651445460 017470� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <limits.h> #include <sys/time.h> #include <sys/resource.h> #include <assert.h> #include "healpix.h" #include "starutil.h" #include "codefile.h" #include "mathutil.h" #include "quadfile.h" #include "kdtree.h" #include "tic.h" #include "fitsioutils.h" #include "anqfits.h" #include "permutedsort.h" #include "bt.h" #include "starkd.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "quad-utils.h" #include "quad-builder.h" struct hpquads { int dimquads; int Nside; startree_t* starkd; // bounds of quad scale, in distance between AB on the sphere. double quad_dist2_upper; double quad_dist2_lower; // for hp searching double radius2; bl* quadlist; bt* bigquadlist; unsigned char* nuses; // from find_stars(): kdtree_qres_t* res; int* inds; double* stars; int Nstars; void* sort_data; int (*sort_func)(const void*, const void*); int sort_size; // for create_quad(): anbool quad_created; anbool count_uses; int hp; // for build_quads(): il* retryhps; }; typedef struct hpquads hpquads_t; static int compare_quads(const void* v1, const void* v2, void* token) { const unsigned int* q1 = v1; const unsigned int* q2 = v2; int dimquads = *(int*)token; int i; for (i=0; i<dimquads; i++) { if (q1[i] > q2[i]) return 1; if (q1[i] < q2[i]) return -1; } return 0; } static anbool find_stars(hpquads_t* me, double radius2, int R) { int d, j, N; int destind; double centre[3]; int* perm; healpix_to_xyzarr(me->hp, me->Nside, 0.5, 0.5, centre); me->res = kdtree_rangesearch_options_reuse(me->starkd->tree, me->res, centre, radius2, KD_OPTIONS_RETURN_POINTS); // here we could check whether stars are in the box defined by the // healpix boundaries plus quad scale, rather than just the circle // containing that box. N = me->res->nres; me->Nstars = N; if (N < me->dimquads) return FALSE; // FIXME -- could merge this step with the sorting step... // remove stars that have been used up. if (R) { destind = 0; for (j=0; j<N; j++) { if (me->nuses[me->res->inds[j]] >= R) continue; me->res->inds[destind] = me->res->inds[j]; for (d=0; d<3; d++) me->res->results.d[destind*3+d] = me->res->results.d[j*3+d]; destind++; } N = destind; if (N < me->dimquads) return FALSE; } // sort the stars in increasing order of index - assume // that this corresponds to decreasing order of brightness. // UNLESS another sorting is provided! if (me->sort_data && me->sort_func && me->sort_size) { /* Two levels of indirection here! me->res->inds are indices into the "sort_data" array (since kdtree is assumed to be un-permuted) We want to produce "perm", which permutes me->res->inds to make sort_data sorted; need to do this because we also want to permute results.d. Alternatively, we could re-fetch the results.d ... */ int k; char* tempdata = malloc(me->sort_size * N); for (k=0; k<N; k++) memcpy(tempdata + k*me->sort_size, ((char*)me->sort_data) + me->sort_size * me->res->inds[k], me->sort_size); perm = permuted_sort(tempdata, me->sort_size, me->sort_func, NULL, N); free(tempdata); } else { // find permutation that sorts by index... perm = permuted_sort(me->res->inds, sizeof(int), compare_ints_asc, NULL, N); } // apply the permutation... permutation_apply(perm, N, me->res->inds, me->res->inds, sizeof(int)); permutation_apply(perm, N, me->res->results.d, me->res->results.d, 3 * sizeof(double)); free(perm); me->inds = (int*)me->res->inds; me->stars = me->res->results.d; me->Nstars = N; return TRUE; } static anbool check_midpoint(quadbuilder_t* qb, pquad_t* pq, void* vtoken) { hpquads_t* me = vtoken; return (xyzarrtohealpix(pq->midAB, me->Nside) == me->hp); } static anbool check_full_quad(quadbuilder_t* qb, unsigned int* quad, int nstars, void* vtoken) { hpquads_t* me = vtoken; anbool dup; if (!me->bigquadlist) return TRUE; dup = bt_contains2(me->bigquadlist, quad, compare_quads, &me->dimquads); return !dup; } static void add_quad(quadbuilder_t* qb, unsigned int* stars, void* vtoken) { int i; hpquads_t* me = vtoken; bl_append(me->quadlist, stars); if (me->count_uses) { for (i=0; i<me->dimquads; i++) me->nuses[stars[i]]++; } qb->stop_creating = TRUE; me->quad_created = TRUE; } static anbool create_quad(hpquads_t* me, anbool count_uses) { quadbuilder_t* qb; qb = quadbuilder_init(); qb->starxyz = me->stars; qb->starinds = me->inds; qb->Nstars = me->Nstars; qb->dimquads = me->dimquads; qb->quadd2_low = me->quad_dist2_lower; qb->quadd2_high = me->quad_dist2_upper; qb->check_scale_low = TRUE; qb->check_scale_high = TRUE; qb->check_AB_stars = check_midpoint; qb->check_AB_stars_token = me; qb->check_full_quad = check_full_quad; qb->check_full_quad_token = me; qb->add_quad = add_quad; qb->add_quad_token = me; me->quad_created = FALSE; me->count_uses = count_uses; quadbuilder_create(qb); quadbuilder_free(qb); return me->quad_created; } static void add_headers(qfits_header* hdr, char** argv, int argc, qfits_header* startreehdr, anbool circle, int npasses) { int i; BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This file was created by the program \"hpquads\".", NULL, NULL); qfits_header_add(hdr, "HISTORY", "hpquads command line:", NULL, NULL); fits_add_args(hdr, argv, argc); qfits_header_add(hdr, "HISTORY", "(end of hpquads command line)", NULL, NULL); qfits_header_add(startreehdr, "HISTORY", "** History entries copied from the input file:", NULL, NULL); fits_copy_all_headers(startreehdr, hdr, "HISTORY"); qfits_header_add(startreehdr, "HISTORY", "** End of history entries.", NULL, NULL); qfits_header_add(hdr, "CXDX", "T", "All codes have the property cx<=dx.", NULL); qfits_header_add(hdr, "CXDXLT1", "T", "All codes have the property cx+dx<=1.", NULL); qfits_header_add(hdr, "MIDHALF", "T", "All codes have the property cx+dx<=1.", NULL); an_fits_copy_header(startreehdr, hdr, "ALLSKY"); qfits_header_add(hdr, "CIRCLE", (circle ? "T" : "F"), (circle ? "Stars C,D live in the circle defined by AB." : "Stars C,D live in the box defined by AB."), NULL); // add placeholders... for (i=0; i<npasses; i++) { char key[64]; sprintf(key, "PASS%i", i+1); qfits_header_add(hdr, key, "-1", "placeholder", NULL); } } static int build_quads(hpquads_t* me, int Nhptotry, il* hptotry, int R) { int nthispass = 0; int lastgrass = 0; int i; for (i=0; i<Nhptotry; i++) { anbool ok; int hp; if ((i * 80 / Nhptotry) != lastgrass) { printf("."); fflush(stdout); lastgrass = i * 80 / Nhptotry; } if (hptotry) hp = il_get(hptotry, i); else hp = i; me->hp = hp; me->quad_created = FALSE; ok = find_stars(me, me->radius2, R); if (ok) create_quad(me, TRUE); if (me->quad_created) nthispass++; else { if (R && me->Nstars && me->retryhps) // there were some stars, and we're counting how many times stars are used. //il_insert_unique_ascending(me->retryhps, hp); // we don't mind hps showing up multiple times because we want to make up for the lost // passes during loosening... il_append(me->retryhps, hp); // FIXME -- could also track which hps are worth visiting in a future pass } } printf("\n"); return nthispass; } int hpquads(startree_t* starkd, codefile_t* codes, quadfile_t* quads, int Nside, double scale_min_arcmin, double scale_max_arcmin, int dimquads, int passes, int Nreuses, int Nloosen, int id, anbool scanoccupied, void* sort_data, int (*sort_func)(const void*, const void*), int sort_size, char** args, int argc) { hpquads_t myhpquads; hpquads_t* me = &myhpquads; int i; int pass; anbool circle = TRUE; double radius2; il* hptotry; int Nhptotry = 0; int nquads; double hprad; double quadscale; int skhp, sknside; qfits_header* qhdr; qfits_header* chdr; int N; int dimcodes; int quadsize; int NHP; memset(me, 0, sizeof(hpquads_t)); if (Nside > HP_MAX_INT_NSIDE) { ERROR("Error: maximum healpix Nside = %i", HP_MAX_INT_NSIDE); return -1; } if (Nreuses > 255) { ERROR("Error, reuse (-r) must be less than 256"); return -1; } me->Nside = Nside; me->dimquads = dimquads; NHP = 12 * Nside * Nside; dimcodes = dimquad2dimcode(dimquads); quadsize = sizeof(unsigned int) * dimquads; logmsg("Nside=%i. Nside^2=%i. Number of healpixes=%i. Healpix side length ~ %g arcmin.\n", me->Nside, me->Nside*me->Nside, NHP, healpix_side_length_arcmin(me->Nside)); me->sort_data = sort_data; me->sort_func = sort_func; me->sort_size = sort_size; tic(); me->starkd = starkd; N = startree_N(me->starkd); logmsg("Star tree contains %i objects.\n", N); // get the "HEALPIX" header from the skdt... skhp = qfits_header_getint(startree_header(me->starkd), "HEALPIX", -1); if (skhp == -1) { if (!qfits_header_getboolean(startree_header(me->starkd), "ALLSKY", FALSE)) { logmsg("Warning: skdt does not contain \"HEALPIX\" header. Code and quad files will not contain this header either.\n"); } } // likewise "HPNSIDE" sknside = qfits_header_getint(startree_header(me->starkd), "HPNSIDE", 1); if (sknside && Nside % sknside) { logerr("Error: Nside (-n) must be a multiple of the star kdtree healpixelisation: %i\n", sknside); return -1; } if (!scanoccupied && (N*(skhp == -1 ? 1 : sknside*sknside*12) < NHP)) { logmsg("\n\n"); logmsg("NOTE, your star kdtree is sparse (has only a fraction of the stars expected)\n"); logmsg(" so you probably will get much faster results by setting the \"-E\" command-line\n"); logmsg(" flag.\n"); logmsg("\n\n"); } quads->dimquads = me->dimquads; codes->dimcodes = dimcodes; quads->healpix = skhp; codes->healpix = skhp; quads->hpnside = sknside; codes->hpnside = sknside; if (id) { quads->indexid = id; codes->indexid = id; } qhdr = quadfile_get_header(quads); chdr = codefile_get_header(codes); add_headers(qhdr, args, argc, startree_header(me->starkd), circle, passes); add_headers(chdr, args, argc, startree_header(me->starkd), circle, passes); if (quadfile_write_header(quads)) { ERROR("Couldn't write headers to quad file"); return -1; } if (codefile_write_header(codes)) { ERROR("Couldn't write headers to code file"); return -1; } quads->numstars = codes->numstars = N; me->quad_dist2_upper = arcmin2distsq(scale_max_arcmin); me->quad_dist2_lower = arcmin2distsq(scale_min_arcmin); codes->index_scale_upper = quads->index_scale_upper = distsq2rad(me->quad_dist2_upper); codes->index_scale_lower = quads->index_scale_lower = distsq2rad(me->quad_dist2_lower); me->nuses = calloc(N, sizeof(unsigned char)); // hprad = sqrt(2) * (healpix side length / 2.) hprad = arcmin2dist(healpix_side_length_arcmin(Nside)) * M_SQRT1_2; quadscale = 0.5 * sqrt(me->quad_dist2_upper); // 1.01 for a bit of safety. we'll look at a few extra stars. radius2 = square(1.01 * (hprad + quadscale)); me->radius2 = radius2; logmsg("Healpix radius %g arcsec, quad scale %g arcsec, total %g arcsec\n", distsq2arcsec(hprad*hprad), distsq2arcsec(quadscale*quadscale), distsq2arcsec(radius2)); hptotry = il_new(1024); if (scanoccupied) { logmsg("Scanning %i input stars...\n", N); for (i=0; i<N; i++) { double xyz[3]; int j; if (startree_get(me->starkd, i, xyz)) { ERROR("Failed to get star %i", i); return -1; } j = xyzarrtohealpix(xyz, Nside); il_insert_unique_ascending(hptotry, j); if (log_get_level() > LOG_VERB) { double ra,dec; if (startree_get_radec(me->starkd, i, &ra, &dec)) { ERROR("Failed to get RA,Dec for star %i\n", i); return -1; } logdebug("star %i: RA,Dec %g,%g; xyz %g,%g,%g; hp %i\n", i, ra, dec, xyz[0], xyz[1], xyz[2], j); } } logmsg("Will check %zu healpixes.\n", il_size(hptotry)); if (log_get_level() > LOG_VERB) { logdebug("Checking healpixes: [ "); for (i=0; i<il_size(hptotry); i++) logdebug("%i ", il_get(hptotry, i)); logdebug("]\n"); } } else { if (skhp == -1) { // Try all healpixes. il_free(hptotry); hptotry = NULL; Nhptotry = NHP; } else { // The star kdtree may itself be healpixed int starhp, starx, stary; // In that case, the healpixes we are interested in form a rectangle // within a big healpix. These are the coords (in [0, Nside)) of // that rectangle. int x0, x1, y0, y1; int x, y; healpix_decompose_xy(skhp, &starhp, &starx, &stary, sknside); x0 = starx * (Nside / sknside); x1 = (starx+1) * (Nside / sknside); y0 = stary * (Nside / sknside); y1 = (stary+1) * (Nside / sknside); for (y=y0; y<y1; y++) { for (x=x0; x<x1; x++) { int j = healpix_compose_xy(starhp, x, y, Nside); il_append(hptotry, j); } } assert(il_size(hptotry) == (Nside/sknside) * (Nside/sknside)); } } if (hptotry) Nhptotry = il_size(hptotry); me->quadlist = bl_new(65536, quadsize); if (Nloosen) me->retryhps = il_new(1024); for (pass=0; pass<passes; pass++) { char key[64]; int nthispass; logmsg("Pass %i of %i.\n", pass+1, passes); logmsg("Trying %i healpixes.\n", Nhptotry); nthispass = build_quads(me, Nhptotry, hptotry, Nreuses); logmsg("Made %i quads (out of %i healpixes) this pass.\n", nthispass, Nhptotry); logmsg("Made %i quads so far.\n", (me->bigquadlist ? bt_size(me->bigquadlist) : 0) + (int)bl_size(me->quadlist)); sprintf(key, "PASS%i", pass+1); fits_header_mod_int(chdr, key, nthispass, "quads created in this pass"); fits_header_mod_int(qhdr, key, nthispass, "quads created in this pass"); logmsg("Merging quads...\n"); if (!me->bigquadlist) me->bigquadlist = bt_new(quadsize, 256); for (i=0; i<bl_size(me->quadlist); i++) { void* q = bl_access(me->quadlist, i); bt_insert2(me->bigquadlist, q, FALSE, compare_quads, &me->dimquads); } bl_remove_all(me->quadlist); } il_free(hptotry); hptotry = NULL; if (Nloosen) { int R; for (R=Nreuses+1; R<=Nloosen; R++) { il* trylist; int nthispass; logmsg("Loosening reuse maximum to %i...\n", R); logmsg("Trying %zu healpixes.\n", il_size(me->retryhps)); if (!il_size(me->retryhps)) break; trylist = me->retryhps; me->retryhps = il_new(1024); nthispass = build_quads(me, il_size(trylist), trylist, R); logmsg("Made %i quads (out of %zu healpixes) this pass.\n", nthispass, il_size(trylist)); il_free(trylist); for (i=0; i<bl_size(me->quadlist); i++) { void* q = bl_access(me->quadlist, i); bt_insert2(me->bigquadlist, q, FALSE, compare_quads, &me->dimquads); } bl_remove_all(me->quadlist); } } if (me->retryhps) il_free(me->retryhps); kdtree_free_query(me->res); me->res = NULL; me->inds = NULL; me->stars = NULL; free(me->nuses); me->nuses = NULL; logmsg("Writing quads...\n"); // add the quads from the big-quadlist nquads = bt_size(me->bigquadlist); for (i=0; i<nquads; i++) { unsigned int* q = bt_access(me->bigquadlist, i); quad_write(codes, quads, q, me->starkd, me->dimquads, dimcodes); } // add the quads that were made during the final round. for (i=0; i<bl_size(me->quadlist); i++) { unsigned int* q = bl_access(me->quadlist, i); quad_write(codes, quads, q, me->starkd, me->dimquads, dimcodes); } // fix output file headers. if (quadfile_fix_header(quads)) { ERROR("Failed to fix quadfile headers"); return -1; } if (codefile_fix_header(codes)) { ERROR("Failed to fix codefile headers"); return -1; } bl_free(me->quadlist); bt_free(me->bigquadlist); toc(); logmsg("Done.\n"); return 0; } int hpquads_files(const char* skdtfn, const char* codefn, const char* quadfn, int Nside, double scale_min_arcmin, double scale_max_arcmin, int dimquads, int passes, int Nreuses, int Nloosen, int id, anbool scanoccupied, void* sort_data, int (*sort_func)(const void*, const void*), int sort_size, char** args, int argc) { quadfile_t* quads; codefile_t* codes; startree_t* starkd; int rtn; logmsg("Reading star kdtree %s ...\n", skdtfn); starkd = startree_open(skdtfn); if (!starkd) { ERROR("Failed to open star kdtree %s\n", skdtfn); return -1; } logmsg("Will write to quad file %s and code file %s\n", quadfn, codefn); quads = quadfile_open_for_writing(quadfn); if (!quads) { ERROR("Couldn't open file %s to write quads.\n", quadfn); return -1; } codes = codefile_open_for_writing(codefn); if (!codes) { ERROR("Couldn't open file %s to write codes.\n", codefn); return -1; } rtn = hpquads(starkd, codes, quads, Nside, scale_min_arcmin, scale_max_arcmin, dimquads, passes, Nreuses, Nloosen, id, scanoccupied, sort_data, sort_func, sort_size, args, argc); if (rtn) return rtn; if (quadfile_close(quads)) { ERROR("Couldn't write quad output file"); return -1; } if (codefile_close(codes)) { ERROR("Couldn't write code output file"); return -1; } startree_close(starkd); return rtn; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/image2xy-files.c����������������������������������������������������������000644 �000765 �000024 �00000022621 12651445460 020652� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include <unistd.h> #include <assert.h> #include <sys/types.h> #include <unistd.h> #include <math.h> #include "os-features.h" #include "image2xy-files.h" #include "image2xy.h" #include "fitsio.h" #include "ioutils.h" #include "simplexy.h" #include "errors.h" #include "log.h" #include "cfitsutils.h" int image2xy_files(const char* infn, const char* outfn, anbool do_u8, int downsample, int downsample_as_required, int extension, int plane, simplexy_t* params) { fitsfile *fptr = NULL; fitsfile *ofptr = NULL; int status = 0; // FIXME should have ostatus too int naxis; long naxisn[3]; int kk; int nhdus, hdutype, nimgs; char* str; simplexy_t myparams; if (params == NULL) { memset(&myparams, 0, sizeof(simplexy_t)); params = &myparams; } // QFITS to CFITSIO extension convention switch extension++; fits_open_file(&fptr, infn, READONLY, &status); CFITS_CHECK("Failed to open FITS input file %s", infn); // Are there multiple HDU's? fits_get_num_hdus(fptr, &nhdus, &status); CFITS_CHECK("Failed to read number of HDUs for input file %s", infn); logverb("nhdus=%d\n", nhdus); if (extension > nhdus) { logerr("Requested extension %i is greater than number of extensions (%i) in file %s\n", extension, nhdus, infn); return -1; } // Create output file fits_create_file(&ofptr, outfn, &status); CFITS_CHECK("Failed to open FITS output file %s", outfn); fits_create_img(ofptr, 8, 0, NULL, &status); CFITS_CHECK("Failed to create output image"); fits_write_key(ofptr, TSTRING, "SRCFN", (char*)infn, "Source image", &status); if (extension) fits_write_key(ofptr, TINT, "SRCEXT", &extension, "Source image extension (1=primary)", &status); /* Parameters for simplexy; save for debugging */ fits_write_comment(ofptr, "Parameters used for source extraction", &status); fits_write_history(ofptr, "Created by Astrometry.net's image2xy program.", &status); CFITS_CHECK("Failed to write HISTORY headers"); asprintf_safe(&str, "GIT URL: %s", AN_GIT_URL); fits_write_history(ofptr, str, &status); CFITS_CHECK("Failed to write GIT HISTORY headers"); free(str); asprintf_safe(&str, "GIT Rev: %s", AN_GIT_REVISION); fits_write_history(ofptr, str, &status); CFITS_CHECK("Failed to write GIT HISTORY headers"); free(str); asprintf_safe(&str, "GIT Date: %s", AN_GIT_DATE); fits_write_history(ofptr, str, &status); CFITS_CHECK("Failed to write GIT HISTORY headers"); free(str); fits_write_history(ofptr, "Visit us on the web at http://astrometry.net/", &status); CFITS_CHECK("Failed to write GIT HISTORY headers"); nimgs = 0; // Run simplexy on each HDU for (kk=1; kk <= nhdus; kk++) { char* ttype[] = {"X","Y","FLUX","BACKGROUND", "LFLUX", "LBG"}; char* tform[] = {"E","E","E","E","E","E"}; char* tunit[] = {"pix","pix","unknown","unknown","unknown","unknown"}; long* fpixel; int a; int w, h; int bitpix; int ncols; if (extension && kk != extension) continue; fits_movabs_hdu(fptr, kk, &hdutype, &status); fits_get_hdu_type(fptr, &hdutype, &status); if (hdutype != IMAGE_HDU) { if (extension) logerr("Requested extension %i in file %s is not an image.\n", extension, infn); continue; } fits_get_img_dim(fptr, &naxis, &status); CFITS_CHECK("Failed to find image dimensions for HDU %i", kk); fits_get_img_size(fptr, 2, naxisn, &status); CFITS_CHECK("Failed to find image dimensions for HDU %i", kk); nimgs++; logverb("Got naxis=%d, na1=%lu, na2=%lu\n", naxis, naxisn[0], naxisn[1]); fits_get_img_type(fptr, &bitpix, &status); CFITS_CHECK("Failed to get FITS image type"); fpixel = malloc(naxis * sizeof(long)); for (a=0; a<naxis; a++) fpixel[a] = 1; if (plane && naxis == 3) { if (plane <= naxisn[2]) { logmsg("Grabbing image plane %i\n", plane); fpixel[2] = plane; } else logerr("Requested plane %i but only %i are available.\n", plane, (int)naxisn[2]); } else if (plane) logmsg("Plane %i requested but this image has NAXIS = %i (not 3).\n", plane, naxis); else if (naxis > 2) logmsg("This looks like a multi-color image: processing the first image plane only. (NAXIS=%i)\n", naxis); if (bitpix == 8 && do_u8 && !downsample) { simplexy_fill_in_defaults_u8(params); // u8 image. params->image_u8 = malloc(naxisn[0] * naxisn[1]); if (!params->image_u8) { SYSERROR("Failed to allocate u8 image array"); goto bailout; } fits_read_pix(fptr, TBYTE, fpixel, naxisn[0]*naxisn[1], NULL, params->image_u8, NULL, &status); } else { simplexy_fill_in_defaults(params); params->image = malloc(naxisn[0] * naxisn[1] * sizeof(float)); if (!params->image) { SYSERROR("Failed to allocate image array"); goto bailout; } fits_read_pix(fptr, TFLOAT, fpixel, naxisn[0]*naxisn[1], NULL, params->image, NULL, &status); } free(fpixel); CFITS_CHECK("Failed to read image pixels"); params->nx = naxisn[0]; params->ny = naxisn[1]; image2xy_run(params, downsample, downsample_as_required); if (params->Lorder) ncols = 6; else ncols = 4; fits_create_tbl(ofptr, BINARY_TBL, params->npeaks, ncols, ttype, tform, tunit, "SOURCES", &status); CFITS_CHECK("Failed to create output table"); fits_write_col(ofptr, TFLOAT, 1, 1, 1, params->npeaks, params->x, &status); CFITS_CHECK("Failed to write X column"); fits_write_col(ofptr, TFLOAT, 2, 1, 1, params->npeaks, params->y, &status); CFITS_CHECK("Failed to write Y column"); fits_write_col(ofptr, TFLOAT, 3, 1, 1, params->npeaks, params->flux, &status); CFITS_CHECK("Failed to write FLUX column"); fits_write_col(ofptr, TFLOAT, 4, 1, 1, params->npeaks, params->background, &status); CFITS_CHECK("Failed to write BACKGROUND column"); if (params->Lorder) { fits_write_col(ofptr, TFLOAT, 5, 1, 1, params->npeaks, params->fluxL, &status); CFITS_CHECK("Failed to write LFLUX column"); fits_write_col(ofptr, TFLOAT, 6, 1, 1, params->npeaks, params->backgroundL, &status); CFITS_CHECK("Failed to write LBG column"); } fits_modify_comment(ofptr, "TTYPE1", "X coordinate", &status); CFITS_CHECK("Failed to set X TTYPE"); fits_modify_comment(ofptr, "TTYPE2", "Y coordinate", &status); CFITS_CHECK("Failed to set Y TTYPE"); fits_modify_comment(ofptr, "TTYPE3", "Flux of source", &status); CFITS_CHECK("Failed to set FLUX TTYPE"); fits_modify_comment(ofptr, "TTYPE4", "Sky background of source", &status); CFITS_CHECK("Failed to set BACKGROUND TTYPE"); fits_write_key(ofptr, TINT, "SRCEXT", &kk, "Extension number in src image", &status); CFITS_CHECK("Failed to write SRCEXT"); w = naxisn[0]; h = naxisn[1]; fits_write_key(ofptr, TINT, "IMAGEW", &w, "Input image width", &status); CFITS_CHECK("Failed to write IMAGEW"); fits_write_key(ofptr, TINT, "IMAGEH", &h, "Input image height", &status); CFITS_CHECK("Failed to write IMAGEH"); fits_write_key(ofptr, TFLOAT, "ESTSIGMA", &(params->sigma), "Estimated source image variance", &status); CFITS_CHECK("Failed to write ESTSIGMA"); fits_write_key(ofptr, TFLOAT, "DPSF", &(params->dpsf), "image2xy Assumed gaussian psf width", &status); fits_write_key(ofptr, TFLOAT, "PLIM", &(params->plim), "image2xy Significance to keep", &status); fits_write_key(ofptr, TFLOAT, "DLIM", &(params->dlim), "image2xy Closest two peaks can be", &status); fits_write_key(ofptr, TFLOAT, "SADDLE", &(params->saddle), "image2xy Saddle difference (in sig)", &status); fits_write_key(ofptr, TINT, "MAXPER", &(params->maxper), "image2xy Max num of peaks per object", &status); fits_write_key(ofptr, TINT, "MAXPEAKS", &(params->maxnpeaks), "image2xy Max num of peaks total", &status); fits_write_key(ofptr, TINT, "MAXSIZE", &(params->maxsize), "image2xy Max size for extended objects", &status); fits_write_key(ofptr, TINT, "HALFBOX", &(params->halfbox), "image2xy Half-size for sliding sky window", &status); fits_write_comment(ofptr, "The X and Y points are specified assuming 1,1 is " "the center of the leftmost bottom pixel of the " "image in accordance with the FITS standard.", &status); CFITS_CHECK("Failed to write comments"); simplexy_free_contents(params); } // Put in the optional NEXTEND keywoard fits_movabs_hdu(ofptr, 1, &hdutype, &status); assert(hdutype == IMAGE_HDU); fits_write_key(ofptr, TINT, "NEXTEND", &nimgs, "Number of extensions", &status); if (status == END_OF_FILE) status = 0; /* Reset after normal error */ CFITS_CHECK("Failed to write NEXTEND"); fits_close_file(fptr, &status); CFITS_CHECK("Failed to close FITS input file"); fptr = NULL; fits_close_file(ofptr, &status); CFITS_CHECK("Failed to close FITS output file"); // for valgrind simplexy_clean_cache(); return 0; bailout: if (fptr) fits_close_file(fptr, &status); if (ofptr) fits_close_file(ofptr, &status); return -1; } ���������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/image2xy-main.c�����������������������������������������������������������000644 �000765 �000024 �00000012464 12651445460 020500� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include <unistd.h> #include <assert.h> #include <sys/types.h> #include <unistd.h> #include "os-features.h" #include "image2xy-files.h" #include "log.h" #include "errors.h" #include "ioutils.h" static const char* OPTIONS = "hi:Oo:8Hd:D:ve:B:S:M:s:p:P:bU:g:C:m:a:G:w:L:"; static void printHelp() { fprintf(stderr, "Usage: image2xy [options] fitsname.fits \n" "\n" "Read a FITS file, find objects, and write out \n" "X, Y, FLUX to fitsname.xy.fits .\n" "\n" " [-e <extension>]: read from a single FITS extension\n" " [-O] overwrite existing output file.\n" " [-o <output-filename>] write XYlist to given filename.\n" " [-L <Lanczos-order>]\n" " [-8] don't use optimization for byte (u8) images.\n" " [-H] downsample by a factor of 2 before running simplexy.\n" " [-d <downsample-factor>] downsample by an integer factor before running simplexy.\n" " [-D <downsample-factor>] downsample, if necessary, by this many factors of two.\n" " [-s <median-filtering scale>]: set median-filter box size (default %i pixels)\n" " [-w <PSF width>]: set Gaussian PSF sigma (default %g pixel)\n" " [-g <sigma>]: set image noise level\n" " [-p <sigmas>]: set significance level of peaks (default %g sigmas)\n" " [-a <saddle-sigmas>]: set \"saddle\" level joining peaks (default %g sigmas)\n" " [-P <image plane>]: pull out a single plane of a multi-color image (default: first plane)\n" " [-b]: don't do (median-based) background subtraction\n" " [-G <background>]: subtract this 'global' background value; implies -b\n" " [-m]: set maximum extended object size for deblending (default %i pixels)\n" "\n" " [-S <background-subtracted image>]: save background-subtracted image to this filename (FITS float image)\n" " [-B <background image>]: save background image to filename\n" " [-U <smoothed background-subtracted image>]: save smoothed background-subtracted image to filename\n" " [-M <mask image>]: save mask image to filename\n" " [-C <blob-image>]: save connected-components image to filename\n" "\n" " [-v] verbose - repeat for more and more verboseness\n" "\n" " image2xy 'file.fits[1]' - process first extension.\n" " image2xy 'file.fits[2]' - process second extension \n" " image2xy file.fits+2 - same as above \n" "\n", SIMPLEXY_DEFAULT_HALFBOX, SIMPLEXY_DEFAULT_DPSF, SIMPLEXY_DEFAULT_PLIM, SIMPLEXY_DEFAULT_SADDLE, SIMPLEXY_DEFAULT_MAXSIZE); } int main(int argc, char *argv[]) { int argchar; char* outfn = NULL; char* infn; int overwrite = 0; int loglvl = LOG_MSG; anbool do_u8 = TRUE; int downsample = 0; int downsample_as_reqd = 0; int extension = 0; int plane = 0; simplexy_t sparams; simplexy_t* params = &sparams; memset(params, 0, sizeof(simplexy_t)); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'L': params->Lorder = atoi(optarg); break; case 'w': params->dpsf = atof(optarg); break; case 'a': params->saddle = atof(optarg); break; case 'm': params->maxsize = atoi(optarg); break; case 'g': params->sigma = atof(optarg); break; case 'b': params->nobgsub = TRUE; break; case 'G': params->nobgsub = TRUE; params->globalbg = atof(optarg); break; case 'P': plane = atoi(optarg); break; case 's': params->halfbox = atoi(optarg); break; case 'p': params->plim = atof(optarg); break; case 'B': params->bgimgfn = optarg; break; case 'S': params->bgsubimgfn = optarg; break; case 'M': params->maskimgfn = optarg; break; case 'U': params->smoothimgfn = optarg; break; case 'C': params->blobimgfn = optarg; break; case 'e': extension = atoi(optarg); break; case 'D': downsample_as_reqd = atoi(optarg); break; case 'H': downsample = 2; break; case 'd': downsample = atoi(optarg); break; case '8': do_u8 = FALSE; break; case 'v': loglvl++; break; case 'O': overwrite = 1; break; case 'o': outfn = strdup(optarg); break; case '?': case 'h': printHelp(); exit(0); } if (optind != argc - 1) { printHelp(); exit(-1); } infn = argv[optind]; log_init(loglvl); logverb("infile=%s\n", infn); if (!outfn) { // Create xylist filename (by trimming '.fits') asprintf_safe(&outfn, "%.*s.xy.fits", (int)(strlen(infn)-5), infn); logverb("outfile=%s\n", outfn); } if (overwrite && file_exists(outfn)) { logverb("Deleting existing output file \"%s\"...\n", outfn); if (unlink(outfn)) { SYSERROR("Failed to delete existing output file \"%s\"", outfn); exit(-1); } } if (downsample) logverb("Downsampling by %i\n", downsample); if (image2xy_files(infn, outfn, do_u8, downsample, downsample_as_reqd, extension, plane, params)) { ERROR("image2xy failed."); exit(-1); } free(outfn); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/image2xy.py���������������������������������������������������������������000644 �000765 �000024 �00000007561 12651445460 017766� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE """ NAME: image2xy PURPOSE: Extract sources from a FITS file INPUTS: Takes a single FITS file as input OPTIONAL INPUTS: KEYWORD PARAMETERS: OUTPUTS: OPTIONAL OUTPUTS: COMMENTS: MODIFICATION HISTORY: K. Mierle, 2007-Jan - Initial version based on image2xy.c Hogg, 2007-May - simplexy options change """ # You need ctypes and a recent (1.0) numpy for this to work. I've included # pyfits so you don't have to. try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import sys import scipy import os import time from simplexy import simplexy # Default settings dpsf = 1.0 plim = 8.0 dlim = dpsf saddle = 5.0 maxper = 1000 maxnpeaks = 10000 maxsize = 1000 halfbox= 100 def source_extract(image_data, srcext=None): x,y,flux,sigma = simplexy(image_data, dpsf=dpsf, plim=plim, dlim=dlim, saddle=saddle, maxper=maxper, maxnpeaks=maxnpeaks, maxsize=maxsize, halfbox=halfbox) print 'simplexy: shapes',x.shape, y.shape cx = pyfits.Column(name='X', format='E', array=x, unit='pix') cy = pyfits.Column(name='Y', format='E', array=y, unit='pix') cflux = pyfits.Column(name='FLUX', format='E', array=flux) tbhdu = pyfits.new_table([cx, cy, cflux]) h = tbhdu.header h.add_comment('Parameters used in source extraction') h.update('dpsf', dpsf, 'Gaussian psf width') h.update('plim', plim, 'Significance to keep') h.update('dlim', dlim, 'Closest two peaks can be') h.update('saddle', saddle, 'Saddle in difference (in sig)') h.update('maxper', maxper, 'Max num of peaks per object') h.update('maxpeaks', maxnpeaks, 'Max num of peaks total') h.update('maxsize', maxsize, 'Max size of extended objects') h.update('halfbox', halfbox, 'Half-size of sliding sky window') if srcext != None: h.update('srcext', i, 'Extension number in src image') h.update('estsigma', sigma, 'Estimated source image variance') h.add_comment('The X and Y points are specified assuming 1,1 is ') h.add_comment('the center of the leftmost bottom pixel of the ') h.add_comment('image in accordance with the FITS standard.') h.add_comment('Extracted by image2xy.py') h.add_comment('on %s %s' % (time.ctime(), time.tzname[0])) cards = tbhdu.header.ascardlist() cards['TTYPE1'].comment = 'X coordinate' cards['TTYPE2'].comment = 'Y coordinate' cards['TTYPE3'].comment = 'Flux of source' return tbhdu def extract(fitsfile): outfile = pyfits.HDUList() # Make empty HDU; no image outfile.append(pyfits.PrimaryHDU()) for i, hdu in enumerate(fitsfile): if (i == 0 and hdu.data != None) or isinstance(hdu, pyfits.ImageHDU): print hdu.data.shape+(i,) if i == 0: print 'Image: Primary HDU (number 0) %sx%s' % hdu.data.shape else: print 'Image: Extension HDU (number %s) %sx%s' % tuple((i,)+hdu.data.shape) tbhdu = source_extract(image_data) outfile.append(tbhdu) return x,y,flux,sigma, outfile if __name__ == '__main__': if len(sys.argv) != 2: print "Usage: image2xy.py image.fits" else: infile = sys.argv[1] fitsfile = pyfits.open(infile) x,y,flux,sigma, outfile = extract(fitsfile) newfile = infile.replace('.fits','.xy.fits') try: outfile.writeto(newfile) except IOError: # File probably exists print 'File %s appears to already exist; deleting!' % newfile import os os.unlink(newfile) outfile.writeto(newfile) �����������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/imarith.c�����������������������������������������������������������������000644 �000765 �000024 �00000011601 12651445460 017456� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *afptr, *bfptr, *outfptr; /* FITS file pointers */ int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int anaxis, bnaxis, check = 1, ii, op; long npixels = 1, firstpix[3] = {1,1,1}; long anaxes[3] = {1,1,1}, bnaxes[3]={1,1,1}; double *apix, *bpix; if (argc != 5) { printf("Usage: imarith image1 image2 oper outimage \n"); printf("\n"); printf("Perform arithmetic operation on 2 input images\n"); printf("creating a new output image. Supported arithmetic\n"); printf("operators are add, sub, mul, div (first character required\n"); printf("\n"); printf("Example: \n"); printf(" imarith in1.fits in2.fits a out.fits - add the 2 files\n"); return(0); } fits_open_file(&afptr, argv[1], READONLY, &status); /* open input images */ fits_open_file(&bfptr, argv[2], READONLY, &status); fits_get_img_dim(afptr, &anaxis, &status); /* read dimensions */ fits_get_img_dim(bfptr, &bnaxis, &status); fits_get_img_size(afptr, 3, anaxes, &status); fits_get_img_size(bfptr, 3, bnaxes, &status); if (status) { fits_report_error(stderr, status); /* print error message */ return(status); } if (anaxis > 3) { printf("Error: images with > 3 dimensions are not supported\n"); check = 0; } /* check that the input 2 images have the same size */ else if ( anaxes[0] != bnaxes[0] || anaxes[1] != bnaxes[1] || anaxes[2] != bnaxes[2] ) { printf("Error: input images don't have same size\n"); check = 0; } if (*argv[3] == 'a' || *argv[3] == 'A') op = 1; else if (*argv[3] == 's' || *argv[3] == 'S') op = 2; else if (*argv[3] == 'm' || *argv[3] == 'M') op = 3; else if (*argv[3] == 'd' || *argv[3] == 'D') op = 4; else { printf("Error: unknown arithmetic operator\n"); check = 0; } /* create the new empty output file if the above checks are OK */ if (check && !fits_create_file(&outfptr, argv[4], &status) ) { /* copy all the header keywords from first image to new output file */ fits_copy_header(afptr, outfptr, &status); npixels = anaxes[0]; /* no. of pixels to read in each row */ apix = (double *) malloc(npixels * sizeof(double)); /* mem for 1 row */ bpix = (double *) malloc(npixels * sizeof(double)); if (apix == NULL || bpix == NULL) { printf("Memory allocation error\n"); return(1); } /* loop over all planes of the cube (2D images have 1 plane) */ for (firstpix[2] = 1; firstpix[2] <= anaxes[2]; firstpix[2]++) { /* loop over all rows of the plane */ for (firstpix[1] = 1; firstpix[1] <= anaxes[1]; firstpix[1]++) { /* Read both images as doubles, regardless of actual datatype. */ /* Give starting pixel coordinate and no. of pixels to read. */ /* This version does not support undefined pixels in the image. */ if (fits_read_pix(afptr, TDOUBLE, firstpix, npixels, NULL, apix, NULL, &status) || fits_read_pix(bfptr, TDOUBLE, firstpix, npixels, NULL, bpix, NULL, &status) ) break; /* jump out of loop on error */ switch (op) { case 1: for(ii=0; ii< npixels; ii++) apix[ii] += bpix[ii]; break; case 2: for(ii=0; ii< npixels; ii++) apix[ii] -= bpix[ii]; break; case 3: for(ii=0; ii< npixels; ii++) apix[ii] *= bpix[ii]; break; case 4: for(ii=0; ii< npixels; ii++) { if (bpix[ii] !=0.) apix[ii] /= bpix[ii]; else apix[ii] = 0.; } } fits_write_pix(outfptr, TDOUBLE, firstpix, npixels, apix, &status); /* write new values to output image */ } } /* end of loop over planes */ fits_close_file(outfptr, &status); free(apix); free(bpix); } fits_close_file(afptr, &status); fits_close_file(bfptr, &status); if (status) fits_report_error(stderr, status); /* print any error message */ return(status); } �������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/imcopy.c������������������������������������������������������������������000644 �000765 �000024 �00000016654 12651445460 017336� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). # Distributed with Astrometry.net, which is # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *infptr, *outfptr; /* FITS file pointers defined in fitsio.h */ int status = 0, ii = 1, iteration = 0, single = 0, hdupos; int hdutype, bitpix, bytepix, naxis = 0, nkeys, datatype = 0, anynul; long naxes[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1}; long first, totpix = 0, npix; double *array, bscale = 1.0, bzero = 0.0, nulval = 0.; char card[81]; if (argc != 3) { printf("\n"); printf("Usage: imcopy inputImage outputImage[compress]\n"); printf("\n"); printf("Copy an input image to an output image, optionally compressing\n"); printf("or uncompressing the image in the process. If the [compress]\n"); printf("qualifier is appended to the output file name then the input image\n"); printf("will be compressed using the tile-compressed format. In this format,\n"); printf("the image is divided into rectangular tiles and each tile of pixels\n"); printf("is compressed and stored in a variable-length row of a binary table.\n"); printf("If the [compress] qualifier is omitted, and the input image is\n"); printf("in tile-compressed format, then the output image will be uncompressed.\n"); printf("\n"); printf("If an extension name or number is appended to the input file name, \n"); printf("enclosed in square brackets, then only that single extension will be\n"); printf("copied to the output file. Otherwise, every extension in the input file\n"); printf("will be processed in turn and copied to the output file.\n"); printf("\n"); printf("Examples:\n"); printf("\n"); printf("1) imcopy image.fit 'cimage.fit[compress]'\n"); printf("\n"); printf(" This compresses the input image using the default parameters, i.e.,\n"); printf(" using the Rice compression algorithm and using row by row tiles.\n"); printf("\n"); printf("2) imcopy cimage.fit image2.fit\n"); printf("\n"); printf(" This uncompress the image created in the first example.\n"); printf(" image2.fit should be identical to image.fit if the image\n"); printf(" has an integer datatype. There will be small differences\n"); printf(" in the pixel values if it is a floating point image.\n"); printf("\n"); printf("3) imcopy image.fit 'cimage.fit[compress GZIP 100,100;4]'\n"); printf("\n"); printf(" This compresses the input image using the following parameters:\n"); printf(" GZIP compression algorithm;\n"); printf(" 100 X 100 pixel compression tiles;\n"); printf(" noise_bits = 4 (only used with floating point images)\n"); printf("\n"); printf("The full syntax of the compression qualifier is:\n"); printf(" [compress ALGORITHM TDIM1,TDIM2,...; NOISE_BITS]\n"); printf("where the allowed ALGORITHM values are Rice, GZIP, PLIO, \n"); printf("and TDIMn is the size of the compression tile in each dimension,\n"); printf("and NOISE_BITS = 1, 2, 3, or 4 and controls the amount of noise\n"); printf("suppression when compressing floating point images. \n"); printf("\n"); printf("Note that it may be necessary to enclose the file names\n"); printf("in single quote characters on the Unix command line.\n"); return(0); } /* Open the input file and create output file */ fits_open_file(&infptr, argv[1], READONLY, &status); fits_create_file(&outfptr, argv[2], &status); if (status != 0) { fits_report_error(stderr, status); return(status); } fits_get_hdu_num(infptr, &hdupos); /* Get the current HDU position */ /* Copy only a single HDU if a specific extension was given */ if (hdupos != 1 || strchr(argv[1], '[')) single = 1; for (; !status; hdupos++) /* Main loop through each extension */ { fits_get_hdu_type(infptr, &hdutype, &status); if (hdutype == IMAGE_HDU) { /* get image dimensions and total number of pixels in image */ for (ii = 0; ii < 9; ii++) naxes[ii] = 1; fits_get_img_param(infptr, 9, &bitpix, &naxis, naxes, &status); totpix = naxes[0] * naxes[1] * naxes[2] * naxes[3] * naxes[4] * naxes[5] * naxes[6] * naxes[7] * naxes[8]; } if (hdutype != IMAGE_HDU || naxis == 0 || totpix == 0) { /* just copy tables and null images */ fits_copy_hdu(infptr, outfptr, 0, &status); } else { /* Explicitly create new image, to support compression */ fits_create_img(outfptr, bitpix, naxis, naxes, &status); /* copy all the user keywords (not the structural keywords) */ fits_get_hdrspace(infptr, &nkeys, NULL, &status); for (ii = 1; ii <= nkeys; ii++) { fits_read_record(infptr, ii, card, &status); if (fits_get_keyclass(card) > TYP_CMPRS_KEY) fits_write_record(outfptr, card, &status); } switch(bitpix) { case BYTE_IMG: datatype = TBYTE; break; case SHORT_IMG: datatype = TSHORT; break; case LONG_IMG: datatype = TLONG; break; case FLOAT_IMG: datatype = TFLOAT; break; case DOUBLE_IMG: datatype = TDOUBLE; break; } bytepix = abs(bitpix) / 8; npix = totpix; iteration = 0; /* try to allocate memory for the entire image */ /* use double type to force memory alignment */ array = (double *) calloc(npix, bytepix); /* if allocation failed, divide size by 2 and try again */ while (!array && iteration < 10) { iteration++; npix = npix / 2; array = (double *) calloc(npix, bytepix); } if (!array) { printf("Memory allocation error\n"); return(0); } /* turn off any scaling so that we copy the raw pixel values */ fits_set_bscale(infptr, bscale, bzero, &status); fits_set_bscale(outfptr, bscale, bzero, &status); first = 1; while (totpix > 0 && !status) { /* read all or part of image then write it back to the output file */ fits_read_img(infptr, datatype, first, npix, &nulval, array, &anynul, &status); fits_write_img(outfptr, datatype, first, npix, array, &status); totpix = totpix - npix; first = first + npix; } free(array); } if (single) break; /* quit if only copying a single HDU */ fits_movrel_hdu(infptr, 1, NULL, &status); /* try to move to next HDU */ } if (status == END_OF_FILE) status = 0; /* Reset after normal error */ fits_close_file(outfptr, &status); fits_close_file(infptr, &status); /* if error occurred, print out error message */ if (status) fits_report_error(stderr, status); return(status); } ������������������������������������������������������������������������������������astrometry.net-0.67/blind/imstat.c������������������������������������������������������������������000644 �000765 �000024 �00000006354 12651445460 017333� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *fptr; /* FITS file pointer */ int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int hdutype, naxis, ii; long naxes[2], totpix=0, fpixel[2]; double *pix, sum = 0., meanval = 0., minval = 1.E33, maxval = -1.E33; if (argc != 2) { printf("Usage: imstat image \n"); printf("\n"); printf("Compute statistics of pixels in the input image\n"); printf("\n"); printf("Examples: \n"); printf(" imarith image.fits - the whole image\n"); printf(" imarith 'image.fits[200:210,300:310]' - image section\n"); printf(" imarith 'table.fits+1[bin (X,Y) = 4]' - image constructed\n"); printf(" from X and Y columns of a table, with 4-pixel bin size\n"); return(0); } if ( !fits_open_file(&fptr, argv[1], READONLY, &status) ) { if (fits_get_hdu_type(fptr, &hdutype, &status) || hdutype != IMAGE_HDU) { printf("Error: this program only works on images, not tables\n"); return(1); } fits_get_img_dim(fptr, &naxis, &status); fits_get_img_size(fptr, 2, naxes, &status); if (status || naxis != 2) { printf("Error: NAXIS = %d. Only 2-D images are supported.\n", naxis); return(1); } pix = (double *) malloc(naxes[0] * sizeof(double)); /* memory for 1 row */ if (pix == NULL) { printf("Memory allocation error\n"); return(1); } totpix = naxes[0] * naxes[1]; fpixel[0] = 1; /* read starting with first pixel in each row */ /* process image one row at a time; increment row # in each loop */ for (fpixel[1] = 1; fpixel[1] <= naxes[1]; fpixel[1]++) { /* give starting pixel coordinate and number of pixels to read */ if (fits_read_pix(fptr, TDOUBLE, fpixel, naxes[0],0, pix,0, &status)) break; /* jump out of loop on error */ for (ii = 0; ii < naxes[0]; ii++) { sum += pix[ii]; /* accumlate sum */ if (pix[ii] < minval) minval = pix[ii]; /* find min and */ if (pix[ii] > maxval) maxval = pix[ii]; /* max values */ } } free(pix); fits_close_file(fptr, &status); } if (status) { fits_report_error(stderr, status); /* print any error message */ } else { if (totpix > 0) meanval = sum / totpix; printf("Statistics of %ld x %ld image\n", naxes[0], naxes[1]); printf(" sum of pixels = %g\n", sum); printf(" mean value = %g\n", meanval); printf(" minimum value = %g\n", minval); printf(" maximum value = %g\n", maxval); } return(status); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/index-info.c��������������������������������������������������������������000644 �000765 �000024 �00000003700 12651445460 020062� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <math.h> #include "os-features.h" #include "index.h" #include "starutil.h" #include "log.h" #include "errors.h" #include "ioutils.h" #include "boilerplate.h" #include "tic.h" static const char* OPTIONS = "hvr:d:R:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] <index-files>\n" " [-r <ra>] (deg)\n" " [-d <dec>] (deg)\n" " [-R <radius>] (deg)\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char **argv) { int argchar; //double ra=HUGE_VAL, dec=HUGE_VAL, radius=HUGE_VAL; int loglvl = LOG_MSG; char** myargs; int nmyargs; int i; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { /* case 'r': ra = atof(optarg); break; case 'd': dec = atof(optarg); break; case 'R': radius = atof(optarg); break; */ case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(argv[0]); break; default: return -1; } log_init(loglvl); nmyargs = argc - optind; myargs = argv + optind; if (nmyargs < 1) { printHelp(argv[0]); exit(-1); } for (i=0; i<nmyargs; i++) { char* indexfn = myargs[i]; index_t index; tic(); logmsg("Reading meta-data for index %s\n", indexfn); if (index_get_meta(indexfn, &index)) { ERROR("Failed to read metadata for index %s", indexfn); continue; } toc(); logmsg("Index %s: id %i, healpix %i (nside %i), %i stars, %i quads, dimquads=%i, scales %g to %g arcmin.\n", index.indexname, index.indexid, index.healpix, index.hpnside, index.nstars, index.nquads, index.dimquads, arcsec2arcmin(index.index_scale_lower), arcsec2arcmin(index.index_scale_upper)); index_close(&index); } return 0; } ����������������������������������������������������������������astrometry.net-0.67/blind/index-stats.c�������������������������������������������������������������000644 �000765 �000024 �00000005372 12651445460 020274� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "index.h" #include "quadfile.h" #include "kdtree.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "starkd.h" #include "boilerplate.h" #include "log.h" static const char* OPTIONS = "hvmM:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s\n" " [-h]: help\n" " [-m]: measure range of mags of quad stars.\n" " [-M <column-name>]: set name of magnitude column.\n" " <index-base-name> [<index-base-name> ...]\n\n" "\n", progname); } int main(int argc, char** args) { int argchar; anbool measmags = FALSE; char* magcol = "mag"; int loglvl = LOG_MSG; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'm': measmags = TRUE; break; case 'M': magcol = optarg; break; case 'h': print_help(args[0]); exit(0); case 'v': loglvl++; break; } log_init(loglvl); log_to(stderr); if (optind == argc) { print_help(args[0]); exit(-1); } for (; optind<argc; optind++) { int lastgrass = 0; int dimquads; char* basename; index_t* index; int i, N, k; basename = args[optind]; logmsg("Reading index %s\n", basename); index = index_load(basename, 0, NULL); dimquads = index_get_quad_dim(index); N = index_nquads(index); logmsg("%i quads.\n", N); if (measmags) { printf("# mag_mean mag_var mag_min mag_max"); for (k=0; k<dimquads; k++) printf(" mag_%i", k); printf("\n"); for (i=0; i<N; i++) { int grass; unsigned int stars[DQMAX]; double* mags; double mean, var, mn, mx; grass = (i * 80 / N); if (grass != lastgrass) { fprintf(stderr, "."); fflush(stderr); lastgrass = grass; } quadfile_get_stars(index->quads, i, stars); mags = startree_get_data_column(index->starkd, magcol, stars, dimquads); mean = var = 0.0; for (k=0; k<dimquads; k++) mean += mags[k]; mean /= (double)dimquads; for (k=0; k<dimquads; k++) var += square(mags[k] - mean); var /= (double)dimquads; mn = HUGE_VAL; mx = -HUGE_VAL; for (k=0; k<dimquads; k++) { mn = MIN(mn, mags[k]); mx = MAX(mx, mags[k]); } printf("%g %g %g %g", mean, var, mn, mx); for (k=0; k<dimquads; k++) printf(" %g", mags[k]); printf("\n"); startree_free_data_column(index->starkd, mags); /* for (k=0; k<dimquads; k++) startree_get_radec(index->starkd, stars[k], &ra, &dec); */ } } fprintf(stderr, "\n"); index_close(index); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/index-to-table.c����������������������������������������������������������000644 �000765 �000024 �00000005642 12651445460 020645� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <string.h> #include <math.h> #include "index.h" #include "fitstable.h" #include "errors.h" #include "starutil.h" static const char* OPTIONS = "hi:o:"; void printHelp(char* progname) { fprintf(stderr, "Usage: %s\n" " -i <index-filename>\n" " -o <output-filename>\n" "\n" "Given an index, writes FITS tables of the star (RA,Dec)s\n" " and the sets of stars that compose the quads.\n" "\n", progname); } int main(int argc, char *argv[]) { int argchar; char* progname = argv[0]; index_t* index; fitstable_t* table; char* indexfn = NULL; char* outfn = NULL; int i, D, N; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) { switch (argchar) { case 'i': indexfn = optarg; break; case 'o': outfn = optarg; break; default: case 'h': printHelp(progname); exit(0); } } if (!(indexfn && outfn)) { printHelp(progname); exit(-1); } index = index_load(indexfn, 0, NULL); if (!index) { ERROR("Failed to open index"); exit(-1); } table = fitstable_open_for_writing(outfn); if (!table) { ERROR("Failed to open output file for writing"); exit(-1); } D = index_get_quad_dim(index); fitstable_add_write_column_array(table, fitscolumn_i32_type(), D, "quads", ""); if (fitstable_write_primary_header(table) || fitstable_write_header(table)) { ERROR("Failed to write headers"); exit(-1); } N = index_nquads(index); for (i=0; i<N; i++) { unsigned int quad[D]; quadfile_get_stars(index->quads, i, quad); if (fitstable_write_row(table, quad)) { ERROR("Failed to write quad %i", i); exit(-1); } } if (fitstable_fix_header(table)) { ERROR("Failed to fix quad header"); exit(-1); } fitstable_next_extension(table); fitstable_clear_table(table); // write star RA,Dec s. fitstable_add_write_column(table, fitscolumn_double_type(), "RA", "deg"); fitstable_add_write_column(table, fitscolumn_double_type(), "Dec", "deg"); if (fitstable_write_header(table)) { ERROR("Failed to write star header"); exit(-1); } N = index_nstars(index); for (i=0; i<N; i++) { double xyz[3]; double ra, dec; startree_get(index->starkd, i, xyz); xyzarr2radecdeg(xyz, &ra, &dec); if (fitstable_write_row(table, &ra, &dec)) { ERROR("Failed to write star %i", i); exit(-1); } } if (fitstable_fix_header(table) || fitstable_close(table)) { ERROR("Failed to fix star header and close"); exit(-1); } index_close(index); return 0; } ����������������������������������������������������������������������������������������������astrometry.net-0.67/blind/keirthing.c���������������������������������������������������������������000644 �000765 �000024 �00000007170 12651445460 020013� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include "os-features.h" #include "bl.h" #include "fit-wcs.h" #include "sip.h" #include "sip_qfits.h" #include "log.h" #include "errors.h" #include "tweak.h" static const char* OPTIONS = "hW:H:X:Y:vo:"; int main(int argc, char** args) { int c; dl* xys = dl_new(16); dl* radecs = dl_new(16); dl* otherradecs = dl_new(16); double* xy; double* xyz; int i, N; tan_t tan, tan2, tan3; int W=0, H=0; double crpix[] = { HUGE_VAL, HUGE_VAL }; int loglvl = LOG_MSG; FILE* logstream = stderr; int order = 1; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 'h': exit(0); case 'o': order = atoi(optarg); break; case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'X': crpix[0] = atof(optarg); break; case 'Y': crpix[1] = atof(optarg); break; } } if (optind != argc) { exit(-1); } log_init(loglvl); log_to(logstream); errors_log_to(logstream); if (W == 0 || H == 0) { logerr("Need -W, -H\n"); exit(-1); } if (crpix[0] == HUGE_VAL) crpix[0] = W/2.0; if (crpix[1] == HUGE_VAL) crpix[1] = H/2.0; while (1) { double x,y,ra,dec; if (fscanf(stdin, "%lf %lf %lf %lf\n", &x, &y, &ra, &dec) < 4) break; if (x == -1 && y == -1) { dl_append(otherradecs, ra); dl_append(otherradecs, dec); } else { dl_append(xys, x); dl_append(xys, y); dl_append(radecs, ra); dl_append(radecs, dec); } } logmsg("Read %i x,y,ra,dec tuples\n", dl_size(xys)/2); N = dl_size(xys)/2; xy = dl_to_array(xys); xyz = malloc(3 * N * sizeof(double)); for (i=0; i<N; i++) radecdeg2xyzarr(dl_get(radecs, 2*i), dl_get(radecs, 2*i+1), xyz + i*3); dl_free(xys); dl_free(radecs); fit_tan_wcs(xyz, xy, N, &tan, NULL); tan.imagew = W; tan.imageh = H; logmsg("Computed TAN WCS:\n"); tan_print_to(&tan, logstream); sip_t* sip; { tweak_t* t = tweak_new(); starxy_t* sxy = starxy_new(N, FALSE, FALSE); il* imginds = il_new(256); il* refinds = il_new(256); for (i=0; i<N; i++) { starxy_set_x(sxy, i, xy[2*i+0]); starxy_set_y(sxy, i, xy[2*i+1]); } tweak_init(t); tweak_push_ref_xyz(t, xyz, N); tweak_push_image_xy(t, sxy); for (i=0; i<N; i++) { il_append(imginds, i); il_append(refinds, i); } // unweighted; no dist2s tweak_push_correspondence_indices(t, imginds, refinds, NULL, NULL); tweak_push_wcs_tan(t, &tan); t->sip->a_order = t->sip->b_order = t->sip->ap_order = t->sip->bp_order = order; for (i=0; i<10; i++) { // go to TWEAK_HAS_LINEAR_CD -> do_sip_tweak // t->image has the indices of corresponding image stars // t->ref has the indices of corresponding catalog stars tweak_go_to(t, TWEAK_HAS_LINEAR_CD); logmsg("\n"); sip_print(t->sip); t->state &= ~TWEAK_HAS_LINEAR_CD; } tan_write_to_file(&t->sip->wcstan, "kt1.wcs"); sip = t->sip; } for (i=0; i<dl_size(otherradecs)/2; i++) { double ra, dec, x,y; ra = dl_get(otherradecs, 2*i); dec = dl_get(otherradecs, 2*i+1); if (!sip_radec2pixelxy(sip, ra, dec, &x, &y)) { logerr("Not in tangent plane: %g,%g\n", ra, dec); exit(-1); //continue; } printf("%g %g\n", x, y); } /* blind_wcs_move_tangent_point(xyz, xy, N, crpix, &tan, &tan2); blind_wcs_move_tangent_point(xyz, xy, N, crpix, &tan2, &tan3); logmsg("Moved tangent point to (%g,%g):\n", crpix[0], crpix[1]); tan_print_to(&tan3, logstream); tan_write_to_file(&tan, "kt1.wcs"); tan_write_to_file(&tan3, "kt2.wcs"); */ dl_free(otherradecs); free(xy); free(xyz); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/listhead.c����������������������������������������������������������������000644 �000765 �000024 �00000005414 12651445460 017623� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *fptr; /* FITS file pointer, defined in fitsio.h */ char card[FLEN_CARD]; /* Standard string lengths defined in fitsio.h */ int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int single = 0, hdupos, nkeys, ii; if (argc != 2) { printf("Usage: listhead filename[ext] \n"); printf("\n"); printf("List the FITS header keywords in a single extension, or, if \n"); printf("ext is not given, list the keywords in all the extensions. \n"); printf("\n"); printf("Examples: \n"); printf(" listhead file.fits - list every header in the file \n"); printf(" listhead file.fits[0] - list primary array header \n"); printf(" listhead file.fits[2] - list header of 2nd extension \n"); printf(" listhead file.fits+2 - same as above \n"); printf(" listhead file.fits[GTI] - list header of GTI extension\n"); printf("\n"); printf("Note that it may be necessary to enclose the input file\n"); printf("name in single quote characters on the Unix command line.\n"); return(0); } if (!fits_open_file(&fptr, argv[1], READONLY, &status)) { fits_get_hdu_num(fptr, &hdupos); /* Get the current HDU position */ /* List only a single header if a specific extension was given */ if (hdupos != 1 || strchr(argv[1], '[')) single = 1; for (; !status; hdupos++) /* Main loop through each extension */ { fits_get_hdrspace(fptr, &nkeys, NULL, &status); /* get # of keywords */ printf("Header listing for HDU #%d:\n", hdupos); for (ii = 1; ii <= nkeys; ii++) { /* Read and print each keywords */ if (fits_read_record(fptr, ii, card, &status))break; printf("%s\n", card); } printf("END\n\n"); /* terminate listing with END */ if (single) break; /* quit if only listing a single header */ fits_movrel_hdu(fptr, 1, NULL, &status); /* try to move to next HDU */ } if (status == END_OF_FILE) status = 0; /* Reset after normal error */ fits_close_file(fptr, &status); } if (status) fits_report_error(stderr, status); /* print any error message */ return(status); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/liststruc.c���������������������������������������������������������������000644 �000765 �000024 �00000006407 12651445460 020065� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *fptr; /* FITS file pointer, defined in fitsio.h */ char keyname[FLEN_KEYWORD], colname[FLEN_VALUE], coltype[FLEN_VALUE]; int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int single = 0, hdupos, hdutype, bitpix, naxis, ncols, ii; long naxes[10], nrows; if (argc != 2) { printf("Usage: liststruc filename[ext] \n"); printf("\n"); printf("List the structure of a single extension, or, if ext is \n"); printf("not given, list the structure of the entire FITS file. \n"); printf("\n"); printf("Note that it may be necessary to enclose the input file\n"); printf("name in single quote characters on the Unix command line.\n"); return(0); } if (!fits_open_file(&fptr, argv[1], READONLY, &status)) { fits_get_hdu_num(fptr, &hdupos); /* Get the current HDU position */ /* List only a single structure if a specific extension was given */ if (strchr(argv[1], '[') || strchr(argv[1], '+')) single++; for (; !status; hdupos++) /* Main loop for each HDU */ { fits_get_hdu_type(fptr, &hdutype, &status); /* Get the HDU type */ printf("\nHDU #%d ", hdupos); if (hdutype == IMAGE_HDU) /* primary array or image HDU */ { fits_get_img_param(fptr, 10, &bitpix, &naxis, naxes, &status); printf("Array: NAXIS = %d, BITPIX = %d\n", naxis, bitpix); for (ii = 0; ii < naxis; ii++) printf(" NAXIS%d = %ld\n",ii+1, naxes[ii]); } else /* a table HDU */ { fits_get_num_rows(fptr, &nrows, &status); fits_get_num_cols(fptr, &ncols, &status); if (hdutype == ASCII_TBL) printf("ASCII Table: "); else printf("Binary Table: "); printf("%d columns x %ld rows\n", ncols, nrows); printf(" COL NAME FORMAT\n"); for (ii = 1; ii <= ncols; ii++) { fits_make_keyn("TTYPE", ii, keyname, &status); /* make keyword */ fits_read_key(fptr, TSTRING, keyname, colname, NULL, &status); fits_make_keyn("TFORM", ii, keyname, &status); /* make keyword */ fits_read_key(fptr, TSTRING, keyname, coltype, NULL, &status); printf(" %3d %-16s %-16s\n", ii, colname, coltype); } } if (single)break; /* quit if only listing a single HDU */ fits_movrel_hdu(fptr, 1, NULL, &status); /* try move to next ext */ } if (status == END_OF_FILE) status = 0; /* Reset normal error */ fits_close_file(fptr, &status); } if (status) fits_report_error(stderr, status); /* print any error message */ return(status); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/local-index.c�������������������������������������������������������������000644 �000765 �000024 �00000016132 12651445460 020224� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <limits.h> #include <sys/time.h> #include <sys/resource.h> #include <assert.h> #include "boilerplate.h" #include "errors.h" #include "log.h" #include "build-index.h" #include "wcs-xy2rd.h" #include "rdlist.h" #include "sip.h" #include "sip_qfits.h" #include "healpix.h" const char* OPTIONS = "hvx:w:l:u:o:d:I:N:p:R:L:Mn:U:S:f:r:J:X:Y:"; static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -x <input-xylist> input: source positions; assumed sorted by brightness\n" " -w <input-wcs> input: WCS file for sources\n" " -o <output-index> output filename for index\n" " [-X <x-column-name>]\n" " [-Y <y-column-name>]\n" " [-l <min-quad-size>]: minimum fraction of the image size (diagonal) to make quads (default 0.05)\n" " [-u <max-quad-size>]: maximum fraction of the image size (diagonal) to make quads (default 1.0)\n" " [-d <dimquads>] number of stars in a \"quad\" (default 4).\n" " [-N <number of healpixels]: number of healpix grid cells to put in the image (default 10)\n" " [-I <unique-id>] set the unique ID of this index\n" " [-S]: sort column (default: assume already sorted)\n" " [-f]: sort in descending order (eg, for FLUX); default ascending (eg, for MAG)\n" " [-U]: healpix Nside for uniformization (default: same as -N)\n" " [-n <sweeps>] (ie, number of stars per fine healpix grid cell); default 10\n" " [-r <dedup-radius>]: deduplication radius in arcseconds; default no deduplication\n" " [-p <passes>] number of rounds of quad-building (ie, # quads per healpix cell, default 16)\n" " [-R <reuse-times>] number of times a star can be used (default 8).\n" " [-L <max-reuses>] make extra passes through the healpixes, increasing the \"-r\" reuse (default 20)\n" " limit each time, up to \"max-reuses\".\n" " [-M]: in-memory (don't use temp files)\n" " [-J <jitter-in-pixels>]: set positional error of index stars, in pixels (default 1)\n" "\n" " [-v]: add verbosity.\n" "\n", progname); } int main(int argc, char** argv) { int argchar; char* xylsfn = NULL; char* wcsfn = NULL; char* indexfn = NULL; double lowf = 0.1; double highf = 1.0; int loglvl = LOG_MSG; int i; int nhp = 10; int Nside; sl* tempfiles; char* tempdir = "/tmp"; int wcsext = 0; char* rdlsfn; sip_t sip; double diagpix, diag, pscale; index_params_t myip; index_params_t* ip = &myip; double jitterpix = 1.0; char* xcol = NULL; char* ycol = NULL; build_index_defaults(ip); while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; case 'J': jitterpix = atof(optarg); break; case 'L': ip->Nloosen = atoi(optarg); break; case 'R': ip->Nreuse = atoi(optarg); break; case 'p': ip->passes = atoi(optarg); break; case 'M': ip->inmemory = TRUE; break; case 'U': ip->UNside = atoi(optarg); break; case 'S': ip->sortcol = optarg; break; case 'f': ip->sortasc = FALSE; break; case 'n': ip->sweeps = atoi(optarg); break; case 'r': ip->dedup = atof(optarg); break; case 'N': nhp = atoi(optarg); break; case 'v': loglvl++; break; case 'd': ip->dimquads = atoi(optarg); break; case 'I': ip->indexid = atoi(optarg); break; case 'h': print_help(argv[0]); exit(0); case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'o': indexfn = optarg; break; case 'u': highf = atof(optarg); break; case 'l': lowf = atof(optarg); break; default: return -1; } log_init(loglvl); if (!xylsfn || !wcsfn || !indexfn) { printf("Specify in & out filenames, bonehead!\n"); print_help(argv[0]); exit( -1); } if (optind != argc) { print_help(argv[0]); printf("\nExtra command-line args were given: "); for (i=optind; i<argc; i++) { printf("%s ", argv[i]); } printf("\n"); exit(-1); } tempfiles = sl_new(4); // wcs-xy2rd rdlsfn = create_temp_file("rdls", tempdir); sl_append_nocopy(tempfiles, rdlsfn); logmsg("Writing RA,Decs to %s\n", rdlsfn); if (wcs_xy2rd(wcsfn, wcsext, xylsfn, rdlsfn, xcol, ycol, FALSE, FALSE, NULL)) { ERROR("Failed to convert xylist to rdlist"); exit(-1); } // compute quad size range. // read WCS. if (!sip_read_tan_or_sip_header_file_ext(wcsfn, wcsext, &sip, FALSE)) { ERROR("Failed to read WCS file %s", wcsfn); exit(-1); } // in pixels diagpix = hypot(sip.wcstan.imagew, sip.wcstan.imageh); // arcsec / pix pscale = sip_pixel_scale(&sip); // in arcsec diag = diagpix * pscale; // in arcmin ip->qlo = arcsec2arcmin(lowf * diag); ip->qhi = arcsec2arcmin(highf * diag); logmsg("Image is %i x %i pixels\n", (int)sip.wcstan.imagew, (int)sip.wcstan.imageh); logmsg("Setting quad scale range to [%g, %g] pixels, [%g, %g] arcsec ([%g, %g] arcmin)\n", diagpix * lowf, diagpix * highf, diag * lowf, diag * highf, ip->qlo, ip->qhi); ip->jitter = pscale * jitterpix; // number of healpixes: logmsg("Image area: %g arcsec^2\n", sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale); logmsg(" %g arcsec\n", sqrt(sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale)); logmsg(" %g arcmin\n", arcsec2arcmin(sqrt(sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale))); logmsg("Desired hp area: %g arcsec^2\n", sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale / (double)nhp); logmsg(" %g arcsec\n", sqrt(sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale / (double)nhp)); logmsg(" %g arcmin\n", arcsec2arcmin(sqrt(sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale / (double)nhp))); Nside = (int)ceil(healpix_nside_for_side_length_arcmin(arcsec2arcmin(sqrt(sip.wcstan.imagew * sip.wcstan.imageh * pscale*pscale / (double)nhp)))); logverb("Chose healpix Nside=%i, side length %g arcmin\n", Nside, healpix_side_length_arcmin(Nside)); ip->Nside = Nside; ip->scanoccupied = TRUE; if (build_index_files(rdlsfn, indexfn, ip)) { exit(-1); } // allquads /* { allquads_t* aq; qfits_header* hdr; aq = allquads_init(); aq->dimquads = dimquads; aq->dimcodes = dimquad2dimcode(aq->dimquads); aq->id = id; aq->quadfn = quadfn; aq->codefn = codefn; aq->skdtfn = skdtfn; aq->quad_d2_lower = arcsec2distsq(diag * lowf); aq->quad_d2_upper = arcsec2distsq(diag * highf); aq->use_d2_lower = TRUE; aq->use_d2_upper = TRUE; if (allquads_open_outputs(aq)) { exit(-1); } hdr = codefile_get_header(aq->codes); qfits_header_add(hdr, "CIRCLE", "T", "Codes live in the circle", NULL); if (allquads_create_quads(aq) || allquads_close(aq)) { exit(-1); } allquads_free(aq); } */ printf("Done.\n"); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/lsfile.c������������������������������������������������������������������000644 �000765 �000024 �00000003763 12651445460 017311� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "lsfile.h" #include "ioutils.h" char* get_next_line(FILE* fid) { char* line = read_string_terminated(fid, "\n", 1); if (!line) return line; // ignore comments... if (line[0] == '#') { free(line); return get_next_line(fid); } return line; } void free_all(pl* list) { int i,N; N = pl_size(list); for (i=0; i<N; i++) { dl* plist = (dl*)pl_get(list, i); if (plist) { dl_free(plist); } } pl_free(list); } void ls_file_free(pl* list) { free_all(list); } int read_ls_file_header(FILE* fid) { char* line; int numfields; line = get_next_line(fid); if (!line) return -1; // first line: numfields if (sscanf(line, "NumFields=%i\n", &numfields) != 1) { fprintf(stderr, "parse error: numfields\n"); free(line); return -1; } free(line); return numfields; } dl* read_ls_file_field(FILE* fid, int dimension) { dl* pointlist; int offset; int inc; char* line; int npoints; int i; // first element: number of entries line = get_next_line(fid); if (!line) { fprintf(stderr, "premature end of file.\n"); return NULL; } if (sscanf(line, "%i%n", &npoints, &offset) < 1) { fprintf(stderr, "parse error: npoints\n"); free(line); return NULL; } pointlist = dl_new(32); for (i=0; i<(npoints * dimension); i++) { double val; if (sscanf(line+offset, ",%lf%n", &val, &inc) < 1) { fprintf(stderr, "parse error: point %i\n", i); dl_free(pointlist); free(line); return NULL; } dl_append(pointlist, val); offset += inc; } free(line); return pointlist; } pl* read_ls_file(FILE* fid, int dimension) { int j; int numfields; pl* list; numfields = read_ls_file_header(fid); if (numfields == -1) return NULL; list = pl_new(256); for (j=0; j<numfields; j++) { dl* pointlist; pointlist = read_ls_file_field(fid, dimension); if (!pointlist) { free_all(list); return NULL; } pl_append(list, pointlist); } return list; } �������������astrometry.net-0.67/blind/lsfile.h������������������������������������������������������������������000644 �000765 �000024 �00000002035 12651445460 017305� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef LS_FILE_H #define LS_FILE_H #include <stdio.h> #include "astrometry/bl.h" /** __ls files look like this: NumFields=20 # comment 3,3.7,5.6,4.3,1,3,7 2,7,8,9,0 ie, for each field, the number of objects is given, followed by the positions of the objects. Returns a pl* containing a dl* for each field. Each dl is a list of doubles of the positions of the objects. The "dimension" argument says how many elements to read per field, ie, what the dimensionality of the position is. */ pl* read_ls_file(FILE* fid, int dimension); /** Frees the list returned by "read_ls_file". */ void ls_file_free(pl* l); /** Returns the number of fields in this file, or -1 if reading fails. */ int read_ls_file_header(FILE* fid); /** Reads one field from the file. The returned dl* contains (dimension * numpoints) doubles. */ dl* read_ls_file_field(FILE* fid, int dimension); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/Makefile������������������������������������������������������������������000644 �000765 �000024 �00000031112 12651445460 017314� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE BASEDIR := .. COMMON := $(BASEDIR)/util CATALOGS := $(BASEDIR)/catalogs CATS_INC := -I$(CATALOGS) CATS_SLIB := $(CATALOGS)/libcatalogs.a CATS_LIB := .PHONY: all all: include $(COMMON)/makefile.common include $(COMMON)/makefile.anfiles include $(COMMON)/makefile.cfitsio include $(COMMON)/makefile.png include $(COMMON)/makefile.cairo include $(COMMON)/makefile.jpeg include $(COMMON)/makefile.netpbm ifneq ($(MAKECMDGOALS),clean) include $(COMMON)/makefile.os-features endif $(COMMON)/makefile.os-features: $(MAKE) -C $(COMMON) makefile.os-features ifeq ($(HAVE_NETPBM),yes) else NETPBM_INC := NETPBM_LIB := endif SO=$(SHAREDLIB_SUFFIX) ENGINE_LIB := libastrometry.a ENGINE_SO := libastrometry.$(SO) LDFLAGS := $(LDFLAGS_DEF) LDLIBS := $(LDLIBS_DEF) LDLIBS += $(ANFILES_LIB) SLIB := $(ENGINE_LIB) SLIB += $(CATS_SLIB) SLIB += $(ANFILES_SLIB) CAIRO_SLIB := $(COMMON)/cairoutils.o CAIRO_SLIB += $(SLIB) CAIRO_LIBS := $(LDLIBS) CAIRO_LIBS += $(CAIRO_LIB) CAIRO_LIBS += $(PNG_LIB) CAIRO_LIBS += $(NETPBM_LIB) CAIRO_LIBS += $(JPEG_LIB) CFLAGS += $(CFLAGS_DEF) CFLAGS += $(CATS_INC) CFLAGS += $(ANFILES_CFLAGS) CFLAGS += $(ANFILES_INC) # boilerplate.h CFLAGS += -I$(ANUTILS_DIR) # wcs-resample.h CFLAGS += -I. CFLAGS += $(CFITS_INC) SHAREDLIBFLAGS := $(SHAREDLIBFLAGS_DEF) ALL_WCSLIB_TARGETS := # inc: # echo CFLAGS_DEF: $(CFLAGS_DEG) # echo CATS_INC: $(CATS_INC) # echo ANFILES_CFLAGS: $(ANFILES_CFLAGS) # echo ANFILES_INC: $(ANFILES_INC) # echo CFITS_INC: $(CFITS_INC) # echo ZLIB_INC: $(ZLIB_INC) CFITS_UTILS := tablist modhead fitscopy tabmerge liststruc \ listhead imcopy imarith imstat # fitstomatlab FITS_UTILS := $(CFITS_UTILS) MISC_EXECS := project-usnob diffractionFlag_check hpgrid resort-xylist resort-xylist: resort-xylist-main.o resort-xylist.o $(SLIB) UTIL_OBJS := OTHER_OBJS := catalog.o codefile.o verify.o \ solver.o matchfile.o matchobj.o solvedclient.o solvedfile.o pnpoly.o \ tweak.o blind-main.o \ plot-constellations.o quadcenters.o startree2rdls.o \ blindutils.o engine-main.o engine.o plotquad.o plotxy.o tweak2.o NOT_INSTALLED_PIPELINE := blind agreeable certifiable \ startree hpquads codetree unpermute-quads unpermute-stars \ solvedserver printsolved mergesolved subwcs \ augment-xylist merge-index index-to-table setsolved \ startree2 uniformize-catalog \ local-index index-info control-program PIPELINE := wcs-grab solve-field MAIN_PROGS := image2xy new-wcs fits-guess-scale # hpquads SIMPLE_PROGS := wcs-grab get-wcs # hpowned PROGS := astrometry-engine build-astrometry-index \ $(MAIN_PROGS) $(SIMPLE_PROGS) PROSPECTUS := quadidx codeprojections quadscales quadsperstar \ quadcenters startree2rdls ANLIBS := $(ANFILES_LIB) $(LIBKD_LIB) $(ANUTILS_LIB) $(GSL_LIB) $(QFITS_LIB) INSTALL_LIB := $(ENGINE_LIB) $(ENGINE_SO) ENGINE_OBJS := \ engine.o blindutils.o blind.o solver.o quad-utils.o \ matchfile.o matchobj.o solvedclient.o solvedfile.o tweak2.o \ verify.o tweak.o # These are required by solve-field and friends ENGINE_OBJS += new-wcs.o fits-guess-scale.o cut-table.o \ resort-xylist.o BUILD_INDEX_OBJS := build-index.o uniformize-catalog.o startree2.o hpquads.o \ quad-builder.o quad-utils.o codefile.o codetree.o unpermute-stars.o \ unpermute-quads.o merge-index.o ENGINE_OBJS += $(BUILD_INDEX_OBJS) #augment-xylist.o # see also setup.py dependency list... PLOTSTUFF := plotstuff.o plotfill.o plotxy.o plotimage.o \ plotannotations.o plotgrid.o plotoutline.o plotindex.o plotradec.o \ plothealpix.o plotmatch.o matchfile.o matchobj.o $(ENGINE_LIB): $(ENGINE_OBJS) -rm -f $@ $(AR) rc $@ $(ENGINE_OBJS) $(RANLIB) $@ $(ENGINE_SO): $(ENGINE_OBJS) $(SLIB) $(CC) $(LDFLAGS) $(SHAREDLIBFLAGS) -o $@ $^ $(LDLIBS) # old and miscellaneous executables that aren't part of the pipeline. OLDEXECS := plotquads rawstartree checkquads CAIROEXECS := plotquad plotxy plot-constellations OLDEXECS_OBJS := catalog.o verify.o matchfile.o \ $(UTIL_OBJS) PIPELINE_MAIN_OBJ := $(addsuffix .o,$(PIPELINE)) PROSPECTUS_MAIN_OBJ := $(addsuffix .o,$(PROSPECTUS)) FITS_UTILS_MAIN_OBJ := $(addsuffix .o,$(FITS_UTILS)) INSTALL_EXECS := $(FITS_UTILS) $(PIPELINE) $(PROGS) INSTALL_CAIRO_EXECS := $(CAIROEXECS) INSTALL_H := allquads.h augment-xylist.h axyfile.h \ engine.h blind.h blindutils.h build-index.h catalog.h \ codefile.h codetree.h fits-guess-scale.h hpquads.h \ image2xy-files.h matchfile.h matchobj.h merge-index.h \ new-wcs.h quad-builder.h quad-utils.h \ resort-xylist.h solvedclient.h \ solvedfile.h solver.h tweak.h uniformize-catalog.h \ unpermute-quads.h unpermute-stars.h verify.h \ tweak2.h PLOT_INSTALL_H := plotannotations.h plotfill.h plotgrid.h plotimage.h \ plotoutline.h plotstuff.h plotxy.h ALL_OBJ := $(UTIL_OBJS) $(KDTREE_OBJS) $(QFITS_OBJ) \ $(PIPELINE_MAIN_OBJ) $(PROSPECTUS_MAIN_OBJ) $(FITS_UTILS_MAIN_OBJ) \ $(OTHER_OBJS) ALL_EXECS := ALL_OBJ += $(PLOTSTUFF) all: $(QFITS_SLIB) $(LIBKD_LIB_FILE) \ $(ANUTILS_LIB_FILE) $(ANFILES_LIB_FILE) \ $(PROGS) $(PIPELINE) $(FITS_UTILS) fitsverify \ $(ENGINE_LIB) $(ENGINE_SO) augment-xylist $(MAIN_PROGS): %: %-main.o $(SLIB) ALL_OBJ += $(addsuffix -main.o,$(MAIN_PROGS)) $(SIMPLE_PROGS): %: %.o $(SLIB) ALL_OBJ += $(addsuffix .o,$(SIMPLE_PROGS)) cairo: $(CAIROEXECS) .PHONY: cairo .PHONY: pipeline pipeline: $(PIPELINE) .PHONY: prospectus_progs prospectus_progs: $(PROSPECTUS) .PHONY: fitsutils fitsutils: $(FITS_UTILS) simplexy: image2xy .PHONY: simplexy PY_INSTALL_DIR := $(PY_BASE_INSTALL_DIR)/blind LINK_DIR := $(PY_BASE_LINK_DIR)/blind PYTHON_EXECS := plotann.py PYTHON_INSTALL := $(PYTHON_EXECS) __init__.py install: $(INSTALL_EXECS) $(INSTALL_LIB) @echo Installing in directory '$(INSTALL_DIR)' mkdir -p '$(INSTALL_DIR)/bin' @for x in $(INSTALL_EXECS); do \ echo cp $$x '$(INSTALL_DIR)/bin'; \ cp $$x '$(INSTALL_DIR)/bin'; \ done mkdir -p '$(ETC_INSTALL_DIR)' python -c "import os; print open('../etc/astrometry.cfg-dist').read().replace('DATA_INSTALL_DIR', '$(DATA_FINAL_DIR)')" > '$(ETC_INSTALL_DIR)/astrometry.cfg' mkdir -p '$(INCLUDE_INSTALL_DIR)' @for x in $(INSTALL_H); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ done mkdir -p '$(LIB_INSTALL_DIR)' @for x in $(INSTALL_LIB); do \ echo cp $$x '$(LIB_INSTALL_DIR)'; \ cp $$x '$(LIB_INSTALL_DIR)'; \ done mkdir -p '$(PY_INSTALL_DIR)' @for x in $(PYTHON_INSTALL); do \ echo cp $$x '$(PY_INSTALL_DIR)/'$$x; \ cp $$x '$(PY_INSTALL_DIR)/'$$x; \ done @echo Making symlinks in directory '$(BIN_INSTALL_DIR)' mkdir -p '$(BIN_INSTALL_DIR)' @for x in $(PYTHON_EXECS); do \ echo ln -f -s '$(PY_INSTALL_DIR)/'$$x '$(BIN_INSTALL_DIR)/'$$x; \ ln -f -s '$(LINK_DIR)/'$$x '$(BIN_INSTALL_DIR)/'$$x; \ done PYTHON_EXTRA_INSTALL := plotstuff.py plotstuff_c.py _plotstuff_c$(PYTHON_SO_EXT) install-extra: $(INSTALL_CAIRO_EXECS) @echo Installing in directory '$(INSTALL_DIR)' mkdir -p '$(INSTALL_DIR)/bin' @for x in $(INSTALL_CAIRO_EXECS); do \ echo cp $$x '$(INSTALL_DIR)/bin'; \ cp $$x '$(INSTALL_DIR)/bin'; \ done mkdir -p '$(INCLUDE_INSTALL_DIR)' @for x in $(PLOT_INSTALL_H); do \ echo cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ cp '$(INCLUDE_DIR)/'$$x '$(INCLUDE_INSTALL_DIR)'; \ done $(MAKE) $(PYTHON_EXTRA_INSTALL) mkdir -p '$(PY_INSTALL_DIR)' @for x in $(PYTHON_EXTRA_INSTALL); do \ echo cp $$x '$(PY_INSTALL_DIR)/'$$x; \ cp $$x '$(PY_INSTALL_DIR)/'$$x; \ done test-solver: test-solver.o solver_test.o $(SLIB) test-solver-2: test-solver-2.o solver_test_2.o $(SLIB) NODEP_OBJS += solver_test.o solver_test_2.o ALL_OBJ += test-solver.o test-solver-2.o CFLAGS_DEBUG = $(subst -DNDEBUG,,$(CFLAGS)) test-solver.o: test-solver.c $(CC) $(CPPFLAGS) $(CFLAGS_DEBUG) -o $@ -c $< test-solver-2.o: test-solver-2.c $(CC) $(CPPFLAGS) $(CFLAGS_DEBUG) -o $@ -c $< solver_test.o: solver.c $(CC) $(CPPFLAGS) $(CFLAGS_DEBUG) -DTESTING=1 -DTESTING_TRYALLCODES=1 -o $@ -c $< solver_test_2.o: solver.c $(CC) $(CPPFLAGS) $(CFLAGS_DEBUG) -DTESTING=1 -DTESTING_TRYPERMUTATIONS=1 -o $@ -c $< ####################################### # Add the basename of your test sources here... ALL_TEST_FILES = test_matchfile test_blindutils \ test_resort-xylist test_tweak test_multiindex2 #test_codefile -- takes a long time $(ALL_TEST_FILES): $(SLIB) ALL_TEST_EXTRA_OBJS := ALL_TEST_EXTRA_LDFLAGS := -lm ALL_TEST_LIBS := $(SLIB) # Add the dependencies here... #test_multiindex2: test_multiindex2.o $(SLIB) tests: $(ALL_TEST_FILES) .PHONY: tests include $(COMMON)/makefile.tests ALL_OBJ += $(ALL_TEST_FILES_O) $(ALL_TEST_FILES_MAIN_O) ALL_OBJ += $(ALL_TEST_EXTRA_OBJS) test.o GENERATED_FILES += $(ALL_TEST_FILES_MAIN_C) ALL_EXECS += $(ALL_TEST_FILES) test # END OF KEIR'S SUPER SIMPLE TESTING FRAMEWORK ###################################################### demo_dsmooth: demo_dsmooth.o $(CAIRO_SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(CAIRO_LIBS) control-program: control-program.o $(SLIB) ALL_OBJ += control-program.o image2xy: image2xy-main.o image2xy-files.o $(CFITS_SLIB) $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(CFITS_LIB) $(LDLIBS) fit-wcs: fit-wcs-main.o $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) ALL_OBJ += image2xy-files.o hpgrid: hpgrid.o $(SLIB) $(CFITS_UTILS) :: %: %.o $(CFITS_SLIB) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(CFITS_LIB) $(LDLIBS) fitsverify: ftverify.c fvrf_data.c fvrf_file.c fvrf_head.c fvrf_key.c fvrf_misc.c $(CFITS_SLIB) $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -DSTANDALONE -trigraphs $(CFITS_INC) -o $@ $^ $(CFITS_LIB) -lm $(OLDEXECS) :: %: %.o $(OLDEXECS_OBJS) $(SLIB) build-astrometry-index: build-index-main.o $(SLIB) #$(BUILD_INDEX_OBJS) $(SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS) ALL_OBJ += build-index-main.o astrometry-engine: engine-main.o $(SLIB) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) solve-field: solve-field.o augment-xylist.o image2xy-files.o $(SLIB) $(CFITS_SLIB) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(CFITS_LIB) $(LDLIBS) ALL_OBJ += solve-field.o image2xy-files.o augment-xylist: augment-xylist-main.o augment-xylist.o image2xy-files.o \ $(SLIB) $(CFITS_SLIB) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(CFITS_LIB) $(LDLIBS) ALL_OBJ += augment-xylist-main.o augment-xylist.o $(COMMON)/cairoutils.o: $(MAKE) -C $(COMMON) cairoutils.o plotquad.o: plotquad.c $(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS) $(CAIRO_INC) $(NETPBM_INC) plotquad: plotquad.o $(CAIRO_SLIB) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^ $(CAIRO_LIBS) plot-constellations.o: plot-constellations.c $(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS) $(CAIRO_INC) $(NETPBM_INC) $(CATS_INC) plot-constellations: plot-constellations.o $(CAIRO_SLIB) $(CATS_SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(CATS_LIB) $(CAIRO_LIBS) plotstuff.o: plotstuff.c $(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS) $(CAIRO_INC) $(NETPBM_INC) plotstuff: plotstuff-main.o $(PLOTSTUFF) $(CAIRO_SLIB) $(CATS_SLIB) $(CC) -o $@ $(LDFLAGS) $^ $(CATS_LIB) $(CAIRO_LIBS) ALL_OBJ += plotstuff-main.o plotxy.o: plotxy.c $(CC) -o $@ -c $< $(CPPFLAGS) $(CFLAGS) $(CAIRO_INC) plotxy-main.o: plotxy-main.c $(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS) $(CAIRO_INC) $(NETPBM_INC) plotxy: plotxy-main.o $(PLOTSTUFF) $(CATS_SLIB) $(CAIRO_SLIB) $(CC) -o $@ $^ $(LDFLAGS) $(CAIRO_LIBS) ALL_OBJ += plotxy-main.o PLOTSTUFF_SRCS = $(subst .o,.c,$(PLOTSTUFF)) PLOTSTUFF_HDRS = $(addprefix $(INCLUDE_DIR)/,$(subst .o,.h,$(PLOTSTUFF))) py: pyplotstuff pyblind .PHONY: py pyplotstuff: _plotstuff_c$(PYTHON_SO_EXT) .PHONY: pyplotstuff pyblind: _blind$(PYTHON_SO_EXT) .PHONY: pyblind _plotstuff_c$(PYTHON_SO_EXT): plotstuff.i $(PLOTSTUFF) $(CATS_LIB) $(CAIRO_SLIB) LDFLAGS="$(LDFLAGS)" LDLIBS="$(LDLIBS) $(CAIRO_LIBS)" \ SLIB="$(CAIRO_SLIB)" \ INC="$(ANFILES_INC) $(CAIRO_INC) $(NETPBM_INC)" \ CFLAGS_SWIG="$(ANFILES_CFLAGS)" \ CFLAGS="$(CFLAGS)" \ python setup.py build_ext -v --inplace --build-temp . _blind$(PYTHON_SO_EXT): blind.i $(ENGINE_OBJS) LDFLAGS="$(LDFLAGS)" LDLIBS="$(LDLIBS)" \ SLIB="$(SLIB)" \ INC="$(ANFILES_INC)" \ CFLAGS="$(ANFILES_CFLAGS)" \ python setup-blind.py build_ext -v --inplace --build-temp . test_plotstuff-main.c: test_plotstuff.c $(AN_SHELL) $(MAKE_TESTS) $^ > $@ test_plotstuff: test_plotstuff-main.o test_plotstuff.o $(COMMON)/cutest.o $(PLOTSTUFF) $(CATS_SLIB) $(CAIRO_SLIB) $(CC) -o $@ $^ $(LDFLAGS) $(CAIRO_LIBS) DEP_OBJ := $(ALL_OBJ) DEP_PREREQS := $(QFITS_LIB) CFLAGS += $(CAIRO_INC) include $(COMMON)/makefile.deps .PHONY: clean clean: rm -f $(EXECS) $(EXTRA_EXECS) $(SOLVER_EXECS) $(MISC_EXECS) $(PROGS) \ $(PIPELINE) $(PROSPECTUS) $(DEPS) deps $(FITS_UTILS) $(ALL_OBJ) \ $(NODEP_OBJS) plot-constellations fitsverify plotquad plotxy \ $(ALL_EXECS) $(GENERATED_FILES) $(ALL_TESTS_CLEAN) \ $(ENGINE_LIB) $(ENGINE_SO) _plotstuff_c$(PYTHON_SO_EXT) *.o *~ *.dep deps \ plotstuff ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/matchfile.c���������������������������������������������������������������000644 �000765 �000024 �00000014404 12651445460 017761� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <assert.h> #include <stddef.h> #include <string.h> #include <math.h> #include "matchfile.h" #include "fitsioutils.h" #include "ioutils.h" #include "sip.h" #include "mathutil.h" // This is a naughty preprocessor function because it uses variables // declared in the calling scope. #define ADDARR(ctype, ftype, col, units, member, arraysize) \ if (write) { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(MatchObj, member), \ ftype, col, units, TRUE); \ } else { \ fitstable_add_column_struct \ (tab, ctype, arraysize, offsetof(MatchObj, member), \ any, col, units, FALSE); \ } //TRUE); #define ADDCOL(ctype, ftype, col, units, member) \ ADDARR(ctype, ftype, col, units, member, 1) static void add_columns(fitstable_t* tab, anbool write) { tfits_type any = fitscolumn_any_type(); tfits_type d = fitscolumn_double_type(); tfits_type f = fitscolumn_float_type(); tfits_type u8 = fitscolumn_u8_type(); tfits_type i16 = fitscolumn_i16_type(); tfits_type i32 = fitscolumn_i32_type(); tfits_type i64 = fitscolumn_i64_type(); tfits_type i = fitscolumn_int_type(); tfits_type logical = fitscolumn_boolean_type(); tfits_type b = fitscolumn_bool_type(); tfits_type c = fitscolumn_char_type(); char* nil = " "; MatchObj mo; ADDCOL(i, i32, "QUAD", nil, quadno); ADDCOL(u8, u8, "DIMQUADS", nil, dimquads); ADDARR(i, i32, "STARS", nil, star, DQMAX); ADDARR(i, i32, "FIELDOBJS", nil, field, DQMAX); ADDARR(i64,i64, "IDS", nil, ids, DQMAX); ADDCOL(f, f, "CODEERR", nil, code_err); ADDARR(d, d, "QUADPIX", nil, quadpix, 2*DQMAX); ADDARR(d, d, "QUADXYZ", nil, quadxyz, 3*DQMAX); ADDARR(d, d, "CENTERXYZ", nil, center, 3); ADDCOL(d, d, "RADIUS", "DEG", radius_deg); ADDCOL(i, i32, "NMATCH", nil, nmatch); ADDCOL(i ,i32, "NDISTRACT", nil, ndistractor); ADDCOL(i ,i32, "NCONFLICT", nil, nconflict); ADDCOL(i ,i32, "NFIELD", nil, nfield); ADDCOL(i ,i32, "NINDEX", nil, nindex); ADDCOL(i ,i32, "NAGREE", nil, nagree); //ADDCOL(i16,i16, "BESTI", nil, besti); ADDARR(d, d, "CRVAL", nil, wcstan.crval, 2); ADDARR(d, d, "CRPIX", nil, wcstan.crpix, 2); ADDARR(d, d, "CD", nil, wcstan.cd, 4); ADDCOL(b, logical, "WCS_VALID", nil, wcs_valid); ADDCOL(i,i32, "FIELDNUM", nil, fieldnum); ADDCOL(i,i32, "FIELDID", nil, fieldfile); ADDCOL(i16,i16, "INDEXID", nil, indexid); ADDCOL(i16,i16, "HEALPIX", nil, healpix); ADDCOL(i16,i16, "HPNSIDE", nil, hpnside); ADDARR(c, c, "FIELDNAME", nil, fieldname, sizeof(mo.fieldname)-1); ADDCOL(b, logical, "PARITY", nil, parity); ADDCOL(i,i32, "QTRIED", nil, quads_tried); ADDCOL(i,i32, "QMATCHED", nil, quads_matched); ADDCOL(i,i32, "QSCALEOK", nil, quads_scaleok); ADDCOL(i16,i16, "QPEERS", nil, quad_npeers); ADDCOL(i,i32, "NVERIFIED", nil, nverified); ADDCOL(f, f, "TIMEUSED", "s", timeused); ADDCOL(f, f, "LOGODDS", nil, logodds); ADDCOL(f, f, "WORSTLOGODDS", nil, worstlogodds); } #undef ADDCOL #undef ADDARR static int postprocess_read_structs(fitstable_t* table, void* struc, int stride, int offset, int N) { MatchObj* mo = struc; int i; for (i=0; i<N; i++) matchobj_compute_derived(mo + i); return 0; } MatchObj* matchfile_read_match(matchfile* mf) { return (MatchObj*)fitstable_next_struct(mf); } int matchfile_pushback_match(matchfile* m) { return fitstable_pushback(m); } int matchfile_read_matches(matchfile* mf, MatchObj* entries, int offset, int count) { return fitstable_read_structs(mf, entries, sizeof(MatchObj), offset, count); } int matchfile_write_match(matchfile* mf, MatchObj* entry) { return fitstable_write_struct(mf, entry); } int matchfile_count(matchfile* mf) { return fitstable_nrows(mf); } int matchfile_close(matchfile* nomad) { return fitstable_close(nomad); } matchfile* matchfile_open(const char* fn) { matchfile* mf = NULL; mf = fitstable_open(fn); if (!mf) return NULL; add_columns(mf, FALSE); fitstable_use_buffered_reading(mf, sizeof(MatchObj), 1000); mf->postprocess_read_structs = postprocess_read_structs; if (fitstable_read_extension(mf, 1)) { fprintf(stderr, "matchfile: table in extension 1 didn't contain the required columns.\n"); fprintf(stderr, " missing: "); fitstable_print_missing(mf, stderr); fprintf(stderr, "\n"); matchfile_close(mf); return NULL; } return mf; } matchfile* matchfile_open_for_writing(char* fn) { matchfile* mf; qfits_header* hdr; mf = fitstable_open_for_writing(fn); if (!mf) return NULL; add_columns(mf, TRUE); hdr = fitstable_get_primary_header(mf); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_MATCH, "Astrometry.net file type", NULL); return mf; } int matchfile_write_headers(matchfile* mf) { if (fitstable_write_primary_header(mf)) return -1; return fitstable_write_header(mf); } int matchfile_fix_headers(matchfile* mf) { if (fitstable_fix_primary_header(mf)) return -1; return fitstable_fix_header(mf); } pl* matchfile_get_matches_for_field(matchfile* mf, int field) { pl* list = pl_new(256); for (;;) { MatchObj* mo = matchfile_read_match(mf); MatchObj* copy; if (!mo) break; if (mo->fieldnum != field) { // push back the newly-read entry... matchfile_pushback_match(mf); break; } copy = malloc(sizeof(MatchObj)); memcpy(copy, mo, sizeof(MatchObj)); pl_append(list, copy); } return list; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/matchobj.c����������������������������������������������������������������000644 �000765 �000024 �00000005231 12651445460 017612� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "os-features.h" #include "sip.h" #include "matchobj.h" #include "starutil.h" #include "log.h" #include "verify.h" char* matchobj_hit_miss_string(int* theta, int* testperm, int nbest, int nfield, char* target) { int i; char* cur; if (!target) { target = malloc(256); } cur = target; for (i=0; i<MIN(nfield, 100); i++) { int ti = (testperm ? theta[testperm[i]] : theta[i]); if (ti == THETA_DISTRACTOR) { //loglevel(loglev, "-"); *cur = '-'; cur++; } else if (ti == THETA_CONFLICT) { //loglevel(loglev, "c"); *cur = 'c'; cur++; } else if (ti == THETA_FILTERED) { //loglevel(loglev, "f"); *cur = 'f'; cur++; } else if (ti == THETA_BAILEDOUT) { //loglevel(loglev, " bail"); strcpy(cur, " bail"); cur += 5; break; } else if (ti == THETA_STOPPEDLOOKING) { //loglevel(loglev, " stopped"); strcpy(cur, " stopped"); cur += 8; break; } else { //loglevel(loglev, "+"); *cur = '+'; cur++; } if (i+1 == nbest) { //loglevel(loglev, "(best)"); strcpy(cur, "(best)"); cur += 6; } } *cur = '\n'; cur++; *cur = '\0'; return target; } void matchobj_log_hit_miss(int* theta, int* testperm, int nbest, int nfield, int loglev, const char* prefix) { int n = strlen(prefix); char* buf = malloc(120 + n); strcpy(buf, prefix); matchobj_hit_miss_string(theta, testperm, nbest, nfield, buf + n); loglevel(loglev, "%s", buf); free(buf); } void matchobj_print(MatchObj* mo, int loglvl) { double ra,dec; loglevel(loglvl, " log-odds ratio %g (%g), %i match, %i conflict, %i distractors, %i index.\n", mo->logodds, exp(mo->logodds), mo->nmatch, mo->nconflict, mo->ndistractor, mo->nindex); xyzarr2radecdeg(mo->center, &ra, &dec); loglevel(loglvl, " RA,Dec = (%g,%g), pixel scale %g arcsec/pix.\n", ra, dec, mo->scale); if (mo->theta && mo->testperm) { loglevel(loglvl, " Hit/miss: "); matchobj_log_hit_miss(mo->theta, mo->testperm, mo->nbest, mo->nfield, loglvl, " Hit/miss: "); } } void matchobj_compute_derived(MatchObj* mo) { int mx; int i; mx = 0; for (i=0; i<mo->dimquads; i++) mx = MAX(mx, mo->field[i]); mo->objs_tried = mx+1; if (mo->wcs_valid) mo->scale = tan_pixel_scale(&(mo->wcstan)); mo->radius = deg2dist(mo->radius_deg); mo->nbest = mo->nmatch + mo->ndistractor + mo->nconflict; } /*void matchobj_log_verify_hit_miss(MatchObj* mo, int loglevel) { verify_log_hit_miss(mo->theta, mo->nbest, mo->nfield, loglevel); } */ const char* matchobj_get_index_name(MatchObj* mo) { if (!mo->index) return NULL; return mo->index->indexname; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/mctweak.py����������������������������������������������������������������000644 �000765 �000024 �00000015063 12651445460 017670� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import pylab as plt import numpy as np import emcee import triangle from astrometry.util.util import * from astrometry.util.plotutils import * from astrometry.util.fits import * from astrometry.blind.blind import * class McTweak(object): def __init__(self, wcs, xy, rd): self.refra = rd.ra self.refdec = rd.dec self.testxy = np.vstack((xy.x, xy.y)).T nt = len(xy) sig2 = 1. self.testsig2 = np.zeros(nt) + sig2 self.W = wcs.get_width() self.H = wcs.get_height() self.distractors = 0.25 ## Accept: set to ~inf? self.logodds_bail = -1e100 self.logodds_accept = 1e12 self.wcs = wcs def __call__(self, args): # plug args into wcs # make a local copy... wcs = Sip(self.wcs) set_sip_args(wcs, args) # sip.radec2pixelxy uses the *inverse* SIP polynomials... compute 'em sip_compute_inverse_polynomials(wcs, 20, 20, 1, self.W, 1, self.H) ok,x,y = wcs.radec2pixelxy(self.refra, self.refdec) refxy = np.vstack((x,y)).T logodds = verify_star_lists_np(refxy, self.testxy, self.testsig2, self.W * self.H, self.distractors, self.logodds_bail, self.logodds_accept) return logodds def set_sip_args(wcs, args): args = list(reversed(args)) r = args.pop() d = args.pop() wcs.set_crval((r,d)) CD = (args.pop(), args.pop(), args.pop(), args.pop()) wcs.set_cd(CD) order = wcs.a_order for p in range(0, order+1): for q in range(0, order+1-p): if p+q <= 1: continue assert(p + q <= order) wcs.set_a_term(p, q, args.pop()) order = wcs.b_order for p in range(0, order+1): for q in range(0, order+1-p): if p+q <= 1: continue assert(p + q <= order) wcs.set_b_term(p, q, args.pop()) assert(len(args) == 0) def get_sip_args(wcs): W,H = wcs.get_width(), wcs.get_height() S = max(W, H) args = [] sigs = [] r,d = wcs.get_crval() pixscale = wcs.pixel_scale() args.extend([r,d]) sigs.extend([pixscale/3600.]*2) cd1,cd2,cd3,cd4 = wcs.get_cd() args.extend([cd1,cd2,cd3,cd4]) sigs.extend([max(x/1000., pixscale/3600./S) for x in [cd1,cd2,cd3,cd4]]) order = wcs.a_order for p in range(0, order+1): for q in range(0, order+1-p): if p+q <= 1: continue assert(p + q <= order) args.append(wcs.get_a_term(p, q)) sigs.append(S**-(p+q)) order = wcs.b_order for p in range(0, order+1): for q in range(0, order+1-p): if p+q <= 1: continue assert(p + q <= order) args.append(wcs.get_b_term(p, q)) sigs.append(S**-(p+q)) return args, sigs def mctweak(wcs, xy, rd): obj = McTweak(wcs, xy, rd) # Initial args args,sigs = get_sip_args(wcs) print 'Args:', args print 'Sigs:', sigs print 'Number of arguments:', len(args) print 'Logodds:', obj(args) ndim, nwalkers = len(args), 100 p0 = emcee.utils.sample_ball(args, sigs, size=nwalkers) print 'p0', p0.shape ps = PlotSequence('mctweak') W,H = wcs.get_width(), wcs.get_height() mywcs = Sip(wcs) sampler = emcee.EnsembleSampler(nwalkers, ndim, obj) lnp0, rstate = None, None pp = [] for step in range(10000): print 'Step', step p0,lnp0,rstate = sampler.run_mcmc(p0, 1, lnprob0=lnp0, rstate0=rstate) print 'Best logprob:', np.max(lnp0) i = np.argmax(lnp0) print 'Best args:', p0[i,:] pp.extend(sampler.flatchain) sampler.reset() if step % 100 != 0: continue plt.clf() plt.plot(obj.testxy[:,0], obj.testxy[:,1], 'r.') for args in p0[np.random.permutation(nwalkers)[:10],:]: set_sip_args(mywcs, args) sip_compute_inverse_polynomials(mywcs, 20, 20, 1, W, 1, H) ok,x,y = mywcs.radec2pixelxy(obj.refra, obj.refdec) plt.plot(x, y, 'bo', mec='b', mfc='none', alpha=0.25) ex = 10. ngridx = ngridy = 10 stepx = stepy = 100 xgrid = np.linspace(0, W, ngridx) ygrid = np.linspace(0, H, ngridy) X = np.linspace(0, W, int(np.ceil(W/stepx))) Y = np.linspace(0, H, int(np.ceil(H/stepy))) for x in xgrid: DX,DY = [],[] xx,yy = [],[] for y in Y: dx,dy = mywcs.get_distortion(x, y) xx.append(x) yy.append(y) DX.append(dx) DY.append(dy) DX = np.array(DX) DY = np.array(DY) xx = np.array(xx) yy = np.array(yy) EX = DX + ex * (DX - xx) EY = DY + ex * (DY - yy) #plot(xx, yy, 'k-', alpha=0.5) plt.plot(EX, EY, 'b-', alpha=0.1) for y in ygrid: DX,DY = [],[] xx,yy = [],[] for x in X: dx,dy = mywcs.get_distortion(x, y) DX.append(dx) DY.append(dy) xx.append(x) yy.append(y) DX = np.array(DX) DY = np.array(DY) xx = np.array(xx) yy = np.array(yy) EX = DX + ex * (DX - xx) EY = DY + ex * (DY - yy) #plot(xx, yy, 'k-', alpha=0.5) plt.plot(EX, EY, 'b-', alpha=0.1) for x in xgrid: plt.plot(x+np.zeros_like(Y), Y, 'k-', alpha=0.5) for y in ygrid: plt.plot(X, y+np.zeros_like(X), 'k-', alpha=0.5) plt.axis([1, W, 1, H]) plt.axis('scaled') ps.savefig() pp = np.vstack(pp) print 'pp', pp.shape # plt.clf() # triangle.corner(pp, plot_contours=False) # ps.savefig() pp = [] wcs = Tan('bok-01.wcs', 0) sip = Sip(wcs) # sip.a_order = 3 # sip.b_order = 3 # sip.ap_order = 4 # sip.bp_order = 4 sip.a_order = 2 sip.b_order = 2 sip.ap_order = 3 sip.bp_order = 3 xy = fits_table('bok-01.axy') rd = fits_table('bok-01.rdls') mctweak(sip, xy, rd) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/merge-index-main.c��������������������������������������������������������000644 �000765 �000024 �00000003276 12651445460 021160� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "quadfile.h" #include "codekd.h" #include "starkd.h" #include "fitsioutils.h" #include "errors.h" #include "boilerplate.h" #include "ioutils.h" #include "merge-index.h" #define OPTIONS "hq:c:s:o:" static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -q <input-quad-filename>\n" " -c <input-code-kdtree-filename>\n" " -s <input-star-kdtree-filename>\n" " -o <output-index-filename>\n" "\n", progname); } int main(int argc, char **args) { int argchar; char* progname = args[0]; char* quadfn = NULL; char* codefn = NULL; char* starfn = NULL; char* outfn = NULL; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'q': quadfn = optarg; break; case 'c': codefn = optarg; break; case 's': starfn = optarg; break; case 'o': outfn = optarg; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (!(quadfn && starfn && codefn && outfn)) { printHelp(progname); fprintf(stderr, "\nYou must specify all filenames (-q, -c, -s, -o)\n"); exit(-1); } fits_use_error_system(); if (merge_index_files(quadfn, codefn, starfn, outfn)) { exit(-1); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/merge-index.c�������������������������������������������������������������000644 �000765 �000024 �00000006112 12651445460 020226� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "quadfile.h" #include "codekd.h" #include "starkd.h" #include "fitstable.h" #include "fitsioutils.h" #include "errors.h" #include "ioutils.h" #include "log.h" int merge_index(quadfile_t* quad, codetree_t* code, startree_t* star, const char* indexfn) { FILE* fout; fitstable_t* tag = NULL; fout = fopen(indexfn, "wb"); if (!fout) { SYSERROR("Failed to open output file"); return -1; } if (quadfile_write_header_to(quad, fout)) { ERROR("Failed to write quadfile header to index file %s", indexfn); return -1; } if (quadfile_write_all_quads_to(quad, fout)) { ERROR("Failed to write quads to index file %s", indexfn); return -1; } if (fits_pad_file(fout)) { ERROR("Failed to pad index file %s", indexfn); return -1; } if (codetree_append_to(code, fout)) { ERROR("Failed to write code kdtree to index file %s", indexfn); return -1; } if (fits_pad_file(fout)) { ERROR("Failed to pad index file %s", indexfn); return -1; } if (startree_append_to(star, fout)) { ERROR("Failed to write star kdtree to index file %s", indexfn); return -1; } if (fits_pad_file(fout)) { ERROR("Failed to pad index file %s", indexfn); return -1; } if (startree_has_tagalong(star)) tag = startree_get_tagalong(star); if (tag) { if (fitstable_append_to(tag, fout)) { ERROR("Failed to write star kdtree tag-along data to index file %s", indexfn); return -1; } if (fits_pad_file(fout)) { ERROR("Failed to pad index file %s", indexfn); return -1; } } if (fclose(fout)) { SYSERROR("Failed to close index file %s", indexfn); return -1; } return 0; } int merge_index_open_files(const char* quadfn, const char* ckdtfn, const char* skdtfn, quadfile_t** quad, codetree_t** code, startree_t** star) { logmsg("Reading code tree from %s ...\n", ckdtfn); *code = codetree_open(ckdtfn); if (!*code) { ERROR("Failed to read code kdtree from %s", ckdtfn); return -1; } logmsg("Ok.\n"); logmsg("Reading star tree from %s ...\n", skdtfn); *star = startree_open(skdtfn); if (!*star) { ERROR("Failed to read star kdtree from %s", skdtfn); return -1; } logmsg("Ok.\n"); logmsg("Reading quads from %s ...\n", quadfn); *quad = quadfile_open(quadfn); if (!*quad) { ERROR("Failed to read quads from %s", quadfn); return -1; } logmsg("Ok.\n"); return 0; } int merge_index_files(const char* quadfn, const char* ckdtfn, const char* skdtfn, const char* indexfn) { quadfile_t* quad = NULL; codetree_t* code = NULL; startree_t* star = NULL; int rtn; if (merge_index_open_files(quadfn, ckdtfn, skdtfn, &quad, &code, &star)) { rtn = -1; goto cleanup; } logmsg("Writing index to %s ...\n", indexfn); rtn = merge_index(quad, code, star, indexfn); cleanup: if (code) codetree_close(code); if (star) startree_close(star); if (quad) quadfile_close(quad); return rtn; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/mergesolved.c�������������������������������������������������������������000644 �000765 �000024 �00000003270 12651445460 020340� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include "boilerplate.h" #include "solvedfile.h" #include "an-bool.h" const char* OPTIONS = "ho:e"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "\nUsage: %s -o <output-file> <input-file> ...\n" " [-e]: no error if file no found (assume empty)\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* progname = args[0]; char** inputfiles = NULL; int ninputfiles = 0; int i; char* outfile = NULL; int N; anbool* solved; int noerr = 0; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 'o': outfile = optarg; break; case 'e': noerr = 1; break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { ninputfiles = argc - optind; inputfiles = args + optind; } else { printHelp(progname); exit(-1); } N = 0; for (i=0; i<ninputfiles; i++) { int n = solvedfile_getsize(inputfiles[i]); if (n == -1) { if (!noerr) { fprintf(stderr, "Failed to get size of input file %s.\n", inputfiles[i]); exit(-1); } } if (n > N) N = n; } solved = calloc(N, sizeof(anbool)); for (i=0; i<ninputfiles; i++) { il* slist; int j; slist = solvedfile_getall_solved(inputfiles[i], 1, N, 0); for (j=0; j<il_size(slist); j++) solved[il_get(slist, j) - 1] = TRUE; il_free(slist); } if (solvedfile_set_file(outfile, solved, N)) { fprintf(stderr, "Failed to set values in output file.\n"); exit(-1); } free(solved); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/modhead.c�����������������������������������������������������������������000644 �000765 �000024 �00000006561 12651445460 017433� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *fptr; /* FITS file pointer, defined in fitsio.h */ char card[FLEN_CARD], newcard[FLEN_CARD]; char oldvalue[FLEN_VALUE], comment[FLEN_COMMENT]; int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int iomode, keytype; if (argc == 3) iomode = READONLY; else if ((argc == 4) || (argc == 5)) iomode = READWRITE; else { printf("Usage: modhead filename[ext] keyword newvalue [newcomment]\n"); printf("\n"); printf("Write or modify the value of a header keyword.\n"); printf("If 'newvalue' is not specified then just print \n"); printf("the current value. \n"); printf("\n"); printf("Examples: \n"); printf(" modhead file.fits dec - list the DEC keyword \n"); printf(" modhead file.fits dec 30.0 - set DEC = 30.0 \n"); printf(" modhead file.fits dec 30.0 \"The decline of civilization\" - set DEC = 30.0 and add a comment \n"); return(0); } if (!fits_open_file(&fptr, argv[1], iomode, &status)) { if (fits_read_card(fptr,argv[2], card, &status)) { printf("Keyword does not exist\n"); card[0] = '\0'; comment[0] = '\0'; status = 0; /* reset status after error */ } else printf("%s\n",card); if ((argc == 4) || (argc == 5)) /* write or overwrite the keyword */ { /* check if this is a protected keyword that must not be changed */ /* if (*card && fits_get_keyclass(card) == TYP_STRUC_KEY) { printf("Protected keyword cannot be modified.\n"); } else */ { /* get the comment string */ if (*card) fits_parse_value(card, oldvalue, comment, &status); /* construct template for new keyword */ strcpy(newcard, argv[2]); /* copy keyword name */ strcat(newcard, " = "); /* '=' value delimiter */ strcat(newcard, argv[3]); /* new value */ if (argc == 5) { strcat(newcard, " / "); /* comment delimiter */ strcat(newcard, argv[4]); /* append the comment */ } else if (*comment) { /* old comment */ strcat(newcard, " / "); /* comment delimiter */ strcat(newcard, comment); /* append the comment */ } /* reformat the keyword string to conform to FITS rules */ fits_parse_template(newcard, card, &keytype, &status); /* overwrite the keyword with the new value */ fits_update_card(fptr, argv[2], card, &status); printf("Keyword has been changed to:\n"); printf("%s\n",card); } } fits_close_file(fptr, &status); } /* if error occured, print out error message */ if (status) fits_report_error(stderr, status); return(status); } �����������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/new-wcs-main.c������������������������������������������������������������000644 �000765 �000024 �00000002732 12651445460 020333� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include "new-wcs.h" #include "fitsioutils.h" #include "errors.h" #include "log.h" static const char* OPTIONS = "hi:w:o:dv"; static void printHelp(char* progname) { printf("%s -i <input-file>\n" " -w <WCS-file>\n" " -o <output-file>\n" " [-d]: also copy the data segment\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char *argv[]) { int argchar; char* infn = NULL; char* outfn = NULL; char* wcsfn = NULL; char* progname = argv[0]; anbool copydata = FALSE; int loglvl = LOG_MSG; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'i': infn = optarg; break; case 'o': outfn = optarg; break; case 'w': wcsfn = optarg; break; case 'd': copydata = TRUE; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } if (!infn || !outfn || !wcsfn) { printHelp(progname); exit(-1); } log_init(loglvl); fits_use_error_system(); if (new_wcs(infn, wcsfn, outfn, copydata)) { ERROR("new_wcs() failed"); exit(-1); } return 0; } ��������������������������������������astrometry.net-0.67/blind/new-wcs.c�����������������������������������������������������������������000644 �000765 �000024 �00000021135 12651445460 017407� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <regex.h> #include "anqfits.h" #include "an-bool.h" #include "fitsioutils.h" #include "ioutils.h" #include "new-wcs.h" #include "errors.h" #include "log.h" static char* exclude_input[] = { // TAN "^CTYPE[12]$", "^WCSAXES$", "^EQUINOX$", "^LONPOLE$", "^LATPOLE$", "^CRVAL[12]$", "^CRPIX[12]$", "^CUNIT[12]$", "^CD[12]_[12]$", "^CDELT[12]$", // SIP "^[AB]P?_ORDER$", "^[AB]P?_[[:digit:]]_[[:digit:]]$", // Other "^PV[[:digit:]]*_[[:digit:]]*.?$", "^CROTA[12]$", "^END$", // our TAN/SIP "^IMAGE[HW]$", }; static int NE1 = sizeof(exclude_input) / sizeof(char*); static char* exclude_wcs[] = { "^SIMPLE$", "^BITPIX$", "^EXTEND$", "^NAXIS$", "^END$", }; static int NE2 = sizeof(exclude_wcs) / sizeof(char*); static anbool key_matches(char* key, regex_t* res, char** re_strings, int NE, int* rematched) { int e; for (e=0; e<NE; e++) { regmatch_t match[1]; int errcode; errcode = regexec(res + e, key, sizeof(match)/sizeof(regmatch_t), match, 0); if (errcode == REG_NOMATCH) continue; if (errcode) { char err[256]; regerror(errcode, res + e, err, sizeof(err)); fprintf(stderr, "Failed to match regular expression \"%s\" with string \"%s\": %s\n", re_strings[e], key, err); exit(-1); } if (rematched) *rematched = e; return TRUE; } return FALSE; } int new_wcs(const char* infn, const char* wcsfn, const char* outfn, anbool copydata) { FILE* outfid = NULL; int i, N; int e; regex_t re1[NE1]; regex_t re2[NE2]; qfits_header *inhdr=NULL, *outhdr=NULL, *wcshdr=NULL; char key[FITS_LINESZ + 1]; char newkey[FITS_LINESZ + 1]; char val[FITS_LINESZ + 1]; char comment[FITS_LINESZ + 1]; int imatch = -1; // how many REs have successfully been compiled. int n1=0, n2=0; outfid = fopen(outfn, "wb"); if (!outfid) { SYSERROR("Failed to open output file \"%s\"", outfn); goto bailout; } inhdr = anqfits_get_header2(infn, 0); if (!inhdr) { ERROR("Failed to read FITS header from input file \"%s\"", infn); goto bailout; } wcshdr = anqfits_get_header2(wcsfn, 0); if (!wcshdr) { ERROR("Failed to read FITS header from WCS file \"%s\"", wcsfn); goto bailout; } outhdr = qfits_header_new(); if (!outhdr) { ERROR("Failed to allocate new output FITS header."); goto bailout; } // Compile regular expressions... for (e=0; e<NE1; e++) { int errcode; errcode = regcomp(re1 + e, exclude_input[e], REG_EXTENDED); if (errcode) { char err[256]; regerror(errcode, re1 + e, err, sizeof(err)); ERROR("Failed to compile regular expression \"%s\": %s", exclude_input[e], err); goto bailout; } n1++; } for (e=0; e<NE2; e++) { int errcode; errcode = regcomp(re2 + e, exclude_wcs[e], REG_EXTENDED); if (errcode) { char err[256]; regerror(errcode, re2 + e, err, sizeof(err)); ERROR("Failed to compile regular expression \"%s\": %s", exclude_wcs[e], err); goto bailout; } n2++; } logverb("Reading input file FITS headers...\n"); N = qfits_header_n(inhdr); for (i=0; i<N; i++) { anbool added_newkey = FALSE; char line[FITS_LINESZ + 1]; if (qfits_header_getitem(inhdr, i, key, val, comment, line)) { ERROR("Failed to read FITS header card %i from input file", i); goto bailout; } if (key_matches(key, re1, exclude_input, NE1, &imatch)) { logverb("Regular expression matched: \"%s\", key \"%s\".\n", exclude_input[imatch], key); snprintf(newkey, FITS_LINESZ+1, "Original key: \"%s\"", key); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); // Completely skip the END card, since _ND is not a valid line. if (streq(key, "END")) continue; snprintf(newkey, FITS_LINESZ+1, "_%.7s", key+1); logverb("New key: \"%s\"\n", newkey); strcpy(key, newkey); line[0] = '_'; added_newkey = TRUE; } // If the header already contains this new (starting-with-"_") // key, add three comment cards instead. if (starts_with(key, "_") && (qfits_header_getstr(inhdr, key) || qfits_header_getstr(outhdr, key))) { logverb("Key \"%s\" already exists; adding COMMENT cards for value and comment instead\n", key); if (!added_newkey) { snprintf(newkey, FITS_LINESZ+1, "Original key: \"%s\"", key); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); } snprintf(newkey, FITS_LINESZ+1, " = %s", val); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); snprintf(newkey, FITS_LINESZ+1, " / %s", comment); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); continue; } qfits_header_append(outhdr, key, val, comment, line); } qfits_header_destroy(inhdr); inhdr = NULL; logverb("Reading WCS file FITS headers...\n"); qfits_header_append(outhdr, "COMMENT", "", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "--Start of Astrometry.net WCS solution--", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "--Put in by the new-wcs program--", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "", NULL, NULL); N = qfits_header_n(wcshdr); for (i=0; i<N; i++) { char line[FITS_LINESZ + 1]; if (qfits_header_getitem(wcshdr, i, key, val, comment, line)) { ERROR("Failed to read FITS header card %i from WCS file.", i); goto bailout; } if (key_matches(key, re2, exclude_wcs, NE2, &imatch)) { logverb("Regular expression matched: \"%s\", key \"%s\".\n", exclude_wcs[imatch], key); // These don't really need to appear in the output file... /* snprintf(newkey, FITS_LINESZ+1, "Original WCS key: \"%s\"", key); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); snprintf(newkey, FITS_LINESZ+1, "_%.7s", key); strcpy(key, newkey); */ continue; } if (streq(key, "DATE") && qfits_header_getstr(outhdr, key)) { // If the input header already had a DATE card, snprintf(newkey, FITS_LINESZ+1, "Original WCS key: \"%s\"", key); qfits_header_append(outhdr, "COMMENT", newkey, NULL, NULL); snprintf(newkey, FITS_LINESZ+1, "_%.7s", key); strcpy(key, newkey); line[0] = '_'; } qfits_header_append(outhdr, key, val, comment, line); } qfits_header_destroy(wcshdr); wcshdr = NULL; qfits_header_append(outhdr, "COMMENT", "", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "--End of Astrometry.net WCS--", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "--(Put in by the new-wcs program)--", NULL, NULL); qfits_header_append(outhdr, "COMMENT", "", NULL, NULL); qfits_header_append(outhdr, "END", NULL, NULL, NULL); if (qfits_header_dump(outhdr, outfid) || fits_pad_file(outfid)) { SYSERROR("Failed to write output header to file %s", outfn); goto bailout; } qfits_header_destroy(outhdr); outhdr = NULL; if (copydata) { int datsize, datstart; FILE* infid = NULL; anqfits_t* anq = NULL; anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open file \"%s\"", infn); goto bailout; } datstart = anqfits_data_start(anq, 0); datsize = anqfits_data_size (anq, 0); infid = fopen(infn, "rb"); if (!infid) { SYSERROR("Failed to open input file \"%s\"", infn); anqfits_close(anq); goto bailout; } logverb("Copying from offset %i to offset %i (length %i) of the input file to the output.\n", datstart, datstart + datsize, datsize); if (pipe_file_offset(infid, datstart, datsize, outfid)) { ERROR("Failed to copy the data block"); fclose(infid); anqfits_close(anq); goto bailout; } fclose(infid); if (fits_pad_file(outfid)) { ERROR("Failed to pad FITS file \"%s\"", outfn); anqfits_close(anq); goto bailout; } anqfits_close(anq); anq = NULL; } if (fclose(outfid)) { SYSERROR("Failed to close output file \"%s\"", outfn); goto bailout; } // Free regular expressions... for (e=0; e<NE1; e++) regfree(re1 + e); for (e=0; e<NE2; e++) regfree(re2 + e); return 0; bailout: if (outfid) fclose(outfid); if (inhdr) qfits_header_destroy(inhdr); if (outhdr) qfits_header_destroy(outhdr); if (wcshdr) qfits_header_destroy(wcshdr); for (i=0; i<n1; i++) regfree(re1 + i); for (i=0; i<n2; i++) regfree(re2 + i); return -1; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/noise.h�������������������������������������������������������������������000644 �000765 �000024 �00000001603 12651445460 017144� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Utilities for noise simulations. */ #ifndef NOISE_H #define NOISE_H /** angleArcMin: radius in arcminutes. */ void sample_in_circle(const double* center, double angleArcMin, double* point); void sample_star_in_ring(double* center, double minAngleArcMin, double maxAngleArcMin, double* point); void sample_field_in_circle(const double* center, double radius, double* point); void add_star_noise(const double* real, double noisestddev, double* noisy); void add_field_noise(const double* real, double noisestddev, double* noisy); void compute_star_code(const double* xyz, int dimquads, double* code); void compute_field_code(const double* pix, int dimquads, double* code, double* scale); #endif �����������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/noisesim2.py��������������������������������������������������������������000644 �000765 �000024 �00000014317 12651445460 020146� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys #from numpy import array, matrix, linalg from numpy import * from numpy.random import * from numpy.linalg import * from matplotlib.pylab import figure, plot, xlabel, ylabel, loglog, clf from matplotlib.pylab import semilogy #from pylab import * class Transform(object): scale = None rotation = None incenter = None outcenter = None def apply(self, X): #print X dx = X - self.incenter #print dx dx = dx * self.scale #print dx dx = self.rotation * dx #print dx dx = dx + self.outcenter #print dx return dx def __str__(self): s = ('<Transform: tin (%f,%f) scale (%f) rot (%f, %f; %f, %f) tout (%f, %f)>' % (self.incenter[0], self.incenter[1], self.scale, self.rotation[0,0], self.rotation[0,1], self.rotation[1,0], self.rotation[1,1], self.outcenter[0], self.outcenter[1])) return s def procrustes(X, Y): T = Transform() sx = X.shape if sx[0] != 2: print 'X must be 2xN' sy = Y.shape if sy[0] != 2: print 'Y must be 2xN' N = sx[1] mx = X.mean(axis=1).reshape(2,1) my = Y.mean(axis=1).reshape(2,1) #print 'mean(X) is\n', mx #print 'mean(Y) is\n', my T.incenter = mx T.outcenter = my #print 'X-mx is\n', X-mx #print '(X-mx)^2 is\n', (X-mx)*(X-mx) varx = sum(sum((X - mx)*(X - mx)), axis=1) vary = sum(sum((Y - my)*(Y - my)), axis=1) #print 'var(X) is', varx #print 'var(Y) is', vary T.scale = sqrt(vary / varx) #print 'scale is', T.scale C = zeros((2,2)) for i in [0,1]: for j in [0,1]: C[i,j] = sum((X[i,:] - mx[i]) * (Y[j,:] - my[j])) #print 'cov is\n', C U,S,V = svd(C) U = matrix(U) V = matrix(V) #print 'U is\n', U #print 'U\' is\n', U.transpose() #print 'V is\n', V R = V * U.transpose() #print 'R is\n', R T.rotation = R return T def test_procrustes_1(): # Create a Transform, apply it to some points, then run procrustes to see if we # recover the Transform exactly. t1 = Transform() t1.scale = 3.0 A = 48.0 * pi/180.0 t1.rotation = matrix([[sin(A), cos(A)], [-cos(A), sin(A)]]) t1.incenter = array([42, 500]).reshape(2,1) t1.outcenter = array([600, -12]).reshape(2,1) N = 4 pts = zeros((2,N)) tpts = zeros((2,N)) for i in range(N): pts[0,i] = t1.incenter[0] + ((i % 2) - 0.5) * 200 pts[1,i] = t1.incenter[1] + (((i/2) % 2) - 0.5) * 200 for i in range(N): pt = pts[:,i].reshape(2,1) tpts[:,i] = t1.apply(pt).reshape(1,2) t2 = procrustes(pts, tpts) print 'pts:', pts print 'tpts:', tpts print 't1 is', t1 print 't2 is', t2 def draw_sample(inoise=1, fnoise=0, iqnoise=-1, dimquads=4, quadscale=100, imgsize=1000, Rsteps=10, Asteps=36): # Stars that compose the field quad. fquad = zeros((2,dimquads)) fquad[0,0] = imgsize/2 - quadscale/2 fquad[1,0] = imgsize/2 fquad[0,1] = imgsize/2 + quadscale/2 fquad[1,1] = imgsize/2 for i in range(2, dimquads): fquad[0,i] = imgsize/2 + randn(1) * quadscale fquad[1,i] = imgsize/2 + randn(1) * quadscale # Index quad is field quad plus jitter. iquad = fquad + randn(*fquad.shape) # Solve for transformation T = procrustes(iquad, fquad) # Put the index quad stars through the transformation itrans = zeros(fquad.shape) for i in range(dimquads): fq = fquad[:,i].reshape(2,1) itrans[:,i] = T.apply(fq).transpose() # Field quad center... qc = mean(fquad, axis=1) # Sample stars on a R^2, theta grid. #rads = sqrt((array(range(Rsteps))+1) / float(Rsteps)) * imgsize/2 N = Rsteps * Asteps rads = sqrt((array(range(Rsteps))+0.5) / float(Rsteps)) * imgsize/2 thetas = array(range(Asteps)) / float(Asteps) * 2.0 * pi fstars = zeros((2,N)) for r in range(Rsteps): for a in range(Asteps): fstars[0, r*Asteps + a] = sin(thetas[a]) * rads[r] + qc[0] fstars[1, r*Asteps + a] = cos(thetas[a]) * rads[r] + qc[1] # Put them through the transformation... istars = zeros((2,N)) for i in range(N): fs = fstars[:,i].reshape(2,1) istars[:,i] = T.apply(fs).transpose() R = sqrt((fstars[0,:] - qc[0])**2 + (fstars[1,:] - qc[1])**2) E = sqrt(sum((fstars - istars)**2, axis=0)) # Fit to a linear model... xfit = R**2 yfit = E**2 A = zeros((2,N)) A[0,:] = 1 A[1,:] = xfit.transpose() (C,resids,rank,s) = lstsq(A.transpose(), yfit) return (fquad, iquad, T, itrans, qc, fstars, istars, R, E, C) if __name__ == '__main__': test_procrustes_1() sys.exit(0) #N = 1000 N = 100 C = zeros((2,N)) QD = zeros((N)) for i in range(N): (fquad, iquad, T, itrans, qc, fstars, istars, R, E, c) = draw_sample() C[:,i] = c QD[i] = sqrt(sum((iquad - fquad)**2) / 4.0) C0 = C[0,:] C1 = C[1,:] figure(1) clf() loglog(C0, C1, 'b.') xlabel('E^2 vs R^2 - Fit coefficient 0') ylabel('E^2 vs R^2 - Fit coefficient 1') figure(2) clf() semilogy(QD, C1, 'b.') xlabel('Field-to-Index Quad Mean Distance') ylabel('E^2-vs-R^2 fit linear coefficient') #semilogy(QD, C1, 'bo') #xlabel('Quad Distance') #ylabel('C1') #figure(1) #I=[0,2,1,3,0]; #plot(fquad[0,I], fquad[1,I], 'bo-', itrans[0,I], itrans[1,I], 'ro-') #figure(2) #plot(fstars[0,:], fstars[1,:], 'b.', istars[0,:], istars[1,:], 'r.') #figure(1) #I=[0,2,1,3,0]; #plot(fquad[0,I], fquad[1,I], 'bo-', # itrans[0,I], itrans[1,I], 'ro-', # fstars[0,:], fstars[1,:], 'b.', # istars[0,:], istars[1,:], 'r.') #figure(2) #plot(R, E, 'r.') #xlabel('R') #ylabel('E') #figure(3) #plot(R**2, E**2, 'r.') #xlabel('R^2') #ylabel('E^2') #print 'Fit coefficients are', C #figure(2) #xplot = array(range(101)) / 100.0 * max(xfit) #plot(R**2, E**2, 'r.', # xplot, C[0] + C[1]*xplot, 'b-') #xlabel('R^2') #ylabel('E^2') #show() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/onepixel.c����������������������������������������������������������������000644 �000765 �000024 �00000000631 12651445460 017645� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include "cairoutils.h" int main() { unsigned char img[4]; int W=1; int H=1; float x=20; float mag=100; float back=0; img[0] = 0; img[1] = 0; img[2] = 0; img[3] = 128; cairoutils_stream_png(stdout, img, W, H); return 0; } �������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plot-constellations.c�����������������������������������������������������000644 �000765 �000024 �00000100453 12651445460 022042� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <math.h> #include <sys/types.h> #include <string.h> #include <ctype.h> #include <assert.h> #include <cairo.h> #include "an-bool.h" #include "sip_qfits.h" #include "starutil.h" #include "bl.h" #include "bl-sort.h" #include "xylist.h" #include "rdlist.h" #include "boilerplate.h" #include "mathutil.h" #include "cairoutils.h" #include "ngc2000.h" #include "ngcic-accurate.h" #include "constellations.h" #include "constellation-boundaries.h" #include "brightstars.h" #include "hd.h" #include "fitsioutils.h" #include "sip-utils.h" #include "errors.h" #include "log.h" const char* OPTIONS = "hi:o:w:W:H:s:NCBpb:cjvLn:f:MDd:G:g:JF:V:O:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w <WCS input file>\n" " ( -L: just list the items in the field\n" " OR -o <image output file; \"-\" for stdout> )\n" " [-p]: write PPM output - default is PNG\n" " ( [-i <PPM input file>]\n" " OR [-W <width> -H <height>] )\n" " [-s <scale>]: scale image coordinates by this value before plotting.\n" " [-N]: plot NGC objects\n" " [-F <fraction>]: minimum NGC size, relative to image size (default 0.02)\n" " [-C]: plot constellations\n" " [-B]: plot named bright stars\n" " [-D]: plot HD objects\n" " [-d]: path to HD catalog\n" " [-b <number-of-bright-stars>]: just plot the <N> brightest stars\n" " [-c]: only plot bright stars that have common names.\n" " [-j]: if a bright star has a common name, only print that\n" " [-v]: be verbose\n" " [-n <width>]: NGC circle width (default 2)\n" " [-f <size>]: font size.\n" " [-M]: show only NGC/IC and Messier numbers (no common names)\n" " [-G <grid spacing in arcmin>]: plot RA,Dec grid\n" " [-g <r:g:b>]: grid color (default 0.2:0.2:0.2)\n" " [-J]: print JSON output to stderr\n" " [-V]: vertical alignment of text labels, \"C\"enter/\"T\"op/\"B\"ottom: default C\n" " [-O]: horizontal alignment of text labels, \"L\"eft/\"C\"enter/\"R\"ight, default L\n" "\n", progname); } static int sort_by_mag(const void* v1, const void* v2) { const brightstar_t* s1 = v1; const brightstar_t* s2 = v2; if (s1->Vmag > s2->Vmag) return 1; if (s1->Vmag == s2->Vmag) return 0; return -1; } struct cairos_t { cairo_t* fg; cairo_t* bg; cairo_t* shapes; cairo_t* shapesmask; int imgW; int imgH; }; typedef struct cairos_t cairos_t; static void add_text(cairos_t* cairos, const char* txt, double px, double py, char halign, char valign) { cairo_text_extents_t textents; double l,r,t,b; double margin = 2.0; int dx, dy; float offset = 15.; cairo_text_extents(cairos->fg, txt, &textents); l = px + textents.x_bearing; r = l + textents.width + textents.x_bearing; t = py + textents.y_bearing; b = t + textents.height; l -= margin; t -= margin; r += margin + 1; b += margin + 1; switch (valign) { case 'T': py -= (0.5 * textents.y_bearing); break; case 'B': py += (0.5 * textents.y_bearing) - offset; break; case 'C': break; } //logverb("halign=%c, width=%f\n", halign, textents.width); switch (halign) { case 'L': break; case 'C': px -= (0.5 * textents.width); break; case 'R': px -= (1.0 * textents.width); break; } // move text away from the edges of the image. if (l < 0) { px += -l; l = 0; } if (t < 0) { py += -t; t = 0; } if (r > cairos->imgW) { px -= (r - cairos->imgW); r = cairos->imgW; } if (b > cairos->imgH) { py -= (b - cairos->imgH); b = cairos->imgH; } // draw black text behind the white text, on the foreground layer. cairo_save(cairos->fg); cairo_set_source_rgba(cairos->fg, 0, 0, 0, 1); for (dy=-1; dy<=1; dy++) { for (dx=-1; dx<=1; dx++) { cairo_move_to(cairos->fg, px+dx, py+dy); cairo_show_text(cairos->fg, txt); cairo_stroke(cairos->fg); } } cairo_restore(cairos->fg); // draw the white text. cairo_move_to(cairos->fg, px, py); cairo_show_text(cairos->fg, txt); cairo_stroke(cairos->fg); // blank out anything on the lower layers underneath the text. cairo_save(cairos->shapesmask); cairo_set_source_rgba(cairos->shapesmask, 0, 0, 0, 0); cairo_set_operator(cairos->shapesmask, CAIRO_OPERATOR_SOURCE); cairo_move_to(cairos->shapesmask, l, t); cairo_line_to(cairos->shapesmask, l, b); cairo_line_to(cairos->shapesmask, r, b); cairo_line_to(cairos->shapesmask, r, t); cairo_close_path(cairos->shapesmask); cairo_fill(cairos->shapesmask); cairo_stroke(cairos->shapesmask); cairo_restore(cairos->shapesmask); } static void color_for_radec(double ra, double dec, float* r, float* g, float* b) { int con = constellation_containing(ra, dec); srand(con); *r = ((rand() % 128) + 127) / 255.0; *g = ((rand() % 128) + 127) / 255.0; *b = ((rand() % 128) + 127) / 255.0; } int main(int argc, char** args) { int c; char* wcsfn = NULL; char* outfn = NULL; char* infn = NULL; sip_t sip; double scale = 1.0; anbool pngformat = TRUE; char* hdpath = NULL; anbool HD = FALSE; cairos_t thecairos; cairos_t* cairos = &thecairos; cairo_surface_t* target = NULL; cairo_t* cairot = NULL; cairo_surface_t* surfbg = NULL; cairo_t* cairobg = NULL; cairo_surface_t* surfshapes = NULL; cairo_t* cairoshapes = NULL; cairo_surface_t* surfshapesmask = NULL; cairo_t* cairoshapesmask = NULL; cairo_surface_t* surffg = NULL; cairo_t* cairo = NULL; double lw = 2.0; // circle linewidth. double cw = 2.0; double ngc_fraction = 0.02; // NGC linewidth double nw = 2.0; // leave a gap short of connecting the points. double endgap = 5.0; // circle radius. double crad = endgap; double fontsize = 14.0; double label_offset = 15.0; int W = 0, H = 0; unsigned char* img = NULL; anbool NGC = FALSE, constell = FALSE; anbool bright = FALSE; anbool common_only = FALSE; anbool print_common_only = FALSE; int Nbright = 0; double ra, dec, px, py; int i, N; anbool justlist = FALSE; anbool only_messier = FALSE; anbool grid = FALSE; double gridspacing = 0.0; double gridcolor[3] = { 0.2, 0.2, 0.2 }; int loglvl = LOG_MSG; char halign = 'L'; char valign = 'C'; sl* json = NULL; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'V': valign = optarg[0]; break; case 'O': halign = optarg[0]; break; case 'F': ngc_fraction = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'J': json = sl_new(4); break; case 'G': gridspacing = atof(optarg); break; case 'g': { char *tail = NULL; gridcolor[0] = strtod(optarg,&tail); if (*tail) { tail++; gridcolor[1] = strtod(tail,&tail); } if (*tail) { tail++; gridcolor[2] = strtod(tail,&tail); } } break; case 'D': HD = TRUE; break; case 'd': hdpath = optarg; break; case 'M': only_messier = TRUE; break; case 'n': nw = atof(optarg); break; case 'f': fontsize = atof(optarg); break; case 'L': justlist = TRUE; outfn = NULL; break; case 'v': loglvl++; break; break; case 'j': print_common_only = TRUE; break; case 'c': common_only = TRUE; break; case 'b': Nbright = atoi(optarg); break; case 'B': bright = TRUE; break; case 'N': NGC = TRUE; break; case 'C': constell = TRUE; break; case 'p': pngformat = FALSE; break; case 's': scale = atof(optarg); break; case 'o': outfn = optarg; break; case 'i': infn = optarg; break; case 'w': wcsfn = optarg; break; case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; } } log_init(loglvl); log_to(stderr); fits_use_error_system(); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(outfn || justlist) || !wcsfn) { logerr("Need (-o or -L) and -w args.\n"); print_help(args[0]); exit(-1); } // read WCS. logverb("Trying to parse SIP/TAN header from %s...\n", wcsfn); if (!file_exists(wcsfn)) { ERROR("No such file: \"%s\"", wcsfn); exit(-1); } if (sip_read_header_file(wcsfn, &sip)) { logverb("Got SIP header.\n"); } else { ERROR("Failed to parse SIP/TAN header from %s", wcsfn); exit(-1); } if (!(NGC || constell || bright || HD || grid)) { logerr("Neither constellations, bright stars, HD nor NGC/IC overlays selected!\n"); print_help(args[0]); exit(-1); } if (gridspacing > 0.0) grid = TRUE; // adjust for scaling... lw /= scale; cw /= scale; nw /= scale; crad /= scale; endgap /= scale; fontsize /= scale; label_offset /= scale; if (!W || !H) { W = sip.wcstan.imagew; H = sip.wcstan.imageh; } if (!(infn || (W && H))) { logerr("Image width/height unspecified, and no input image given.\n"); exit(-1); } if (infn) { cairoutils_fake_ppm_init(); img = cairoutils_read_ppm(infn, &W, &H); if (!img) { ERROR("Failed to read input image %s", infn); exit(-1); } cairoutils_rgba_to_argb32(img, W, H); } else if (!justlist) { // Allocate a black image. img = calloc(4 * W * H, 1); if (!img) { SYSERROR("Failed to allocate a blank image on which to plot!"); exit(-1); } } if (HD && !hdpath) { logerr("If you specify -D (plot Henry Draper objs), you also have to give -d (path to Henry Draper catalog)\n"); exit(-1); } if (!justlist) { /* Cairo layers: -background: surfbg / cairobg --> gets drawn first, in black, masked by surfshapesmask -shapes: surfshapes / cairoshapes --> gets drawn second, masked by surfshapesmask -foreground/text: surffg / cairo --> gets drawn last. */ surffg = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, W, H); cairo = cairo_create(surffg); cairo_set_line_join(cairo, CAIRO_LINE_JOIN_BEVEL); cairo_set_antialias(cairo, CAIRO_ANTIALIAS_GRAY); cairo_set_source_rgba(cairo, 1.0, 1.0, 1.0, 1.0); cairo_scale(cairo, scale, scale); //cairo_select_font_face(cairo, "helvetica", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_select_font_face(cairo, "DejaVu Sans Mono Book", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cairo, fontsize); surfshapes = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, W, H); cairoshapes = cairo_create(surfshapes); cairo_set_line_join(cairoshapes, CAIRO_LINE_JOIN_BEVEL); cairo_set_antialias(cairoshapes, CAIRO_ANTIALIAS_GRAY); cairo_set_source_rgba(cairoshapes, 1.0, 1.0, 1.0, 1.0); cairo_scale(cairoshapes, scale, scale); cairo_select_font_face(cairoshapes, "DejaVu Sans Mono Book", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cairoshapes, fontsize); surfshapesmask = cairo_image_surface_create(CAIRO_FORMAT_A8, W, H); cairoshapesmask = cairo_create(surfshapesmask); cairo_set_line_join(cairoshapesmask, CAIRO_LINE_JOIN_BEVEL); cairo_set_antialias(cairoshapesmask, CAIRO_ANTIALIAS_GRAY); cairo_set_source_rgba(cairoshapesmask, 1.0, 1.0, 1.0, 1.0); cairo_scale(cairoshapesmask, scale, scale); cairo_select_font_face(cairoshapesmask, "DejaVu Sans Mono Book", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cairoshapesmask, fontsize); cairo_paint(cairoshapesmask); cairo_stroke(cairoshapesmask); surfbg = cairo_image_surface_create(CAIRO_FORMAT_A8, W, H); cairobg = cairo_create(surfbg); cairo_set_line_join(cairobg, CAIRO_LINE_JOIN_BEVEL); cairo_set_antialias(cairobg, CAIRO_ANTIALIAS_GRAY); cairo_set_source_rgba(cairobg, 0, 0, 0, 1); cairo_scale(cairobg, scale, scale); cairo_select_font_face(cairobg, "DejaVu Sans Mono Book", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cairobg, fontsize); cairos->bg = cairobg; cairos->fg = cairo; cairos->shapes = cairoshapes; cairos->shapesmask = cairoshapesmask; cairos->imgW = (float)W/scale; cairos->imgH = (float)H/scale; // } if (grid) { double ramin, ramax, decmin, decmax; double ra, dec; double rastep = gridspacing / 60.0; double decstep = gridspacing / 60.0; // how many line segments int N = 10; double px, py; int i; cairo_set_source_rgba(cairo, gridcolor[0], gridcolor[1], gridcolor[2], 1.0); sip_get_radec_bounds(&sip, 100, &ramin, &ramax, &decmin, &decmax); logverb("Plotting grid lines from RA=%g to %g in steps of %g; Dec=%g to %g in steps of %g\n", ramin, ramax, rastep, decmin, decmax, decstep); for (dec = decstep * floor(decmin / decstep); dec<=decmax; dec+=decstep) { logverb(" dec=%g\n", dec); for (i=0; i<=N; i++) { ra = ramin + ((double)i / (double)N) * (ramax - ramin); if (!sip_radec2pixelxy(&sip, ra, dec, &px, &py)) continue; // first time, move_to; else line_to ((ra == ramin) ? cairo_move_to : cairo_line_to)(cairo, px, py); } cairo_stroke(cairo); } for (ra = rastep * floor(ramin / rastep); ra <= ramax; ra += rastep) { //for (dec=decmin; dec<=decmax; dec += (decmax - decmin)/(double)N) { logverb(" ra=%g\n", ra); for (i=0; i<=N; i++) { dec = decmin + ((double)i / (double)N) * (decmax - decmin); if (!sip_radec2pixelxy(&sip, ra, dec, &px, &py)) continue; // first time, move_to; else line_to ((dec == decmin) ? cairo_move_to : cairo_line_to)(cairo, px, py); } cairo_stroke(cairo); } cairo_set_source_rgba(cairo, 1.0, 1.0, 1.0, 1.0); } } if (constell) { N = constellations_n(); logverb("Checking %i constellations.\n", N); for (c=0; c<N; c++) { const char* shortname = NULL; const char* longname; il* lines; il* uniqstars; il* inboundstars; float r,g,b; int Ninbounds; int Nunique; cairo_text_extents_t textents; double cmass[3]; uniqstars = constellations_get_unique_stars(c); inboundstars = il_new(16); Nunique = il_size(uniqstars); debug("%s: %zu unique stars.\n", shortname, il_size(uniqstars)); // Count the number of unique stars belonging to this contellation // that are within the image bounds Ninbounds = 0; for (i=0; i<il_size(uniqstars); i++) { int star; star = il_get(uniqstars, i); constellations_get_star_radec(star, &ra, &dec); debug("star %i: ra,dec (%g,%g)\n", il_get(uniqstars, i), ra, dec); if (!sip_radec2pixelxy(&sip, ra, dec, &px, &py)) continue; if (px < 0 || py < 0 || px*scale > W || py*scale > H) continue; Ninbounds++; il_append(inboundstars, star); } il_free(uniqstars); debug("%i are in-bounds.\n", Ninbounds); // Only draw this constellation if at least 2 of its stars // are within the image bounds. if (Ninbounds < 2) { il_free(inboundstars); continue; } // Set the color based on the location of the first in-bounds star. // This is a hack -- we have two different constellation // definitions with different numbering schemes! if (!justlist && (il_size(inboundstars) > 0)) { // This is helpful for videos: ensuring that the same // color is chosen for a constellation in each frame. int star = il_get(inboundstars, 0); constellations_get_star_radec(star, &ra, &dec); color_for_radec(ra, dec, &r,&g,&b); cairo_set_source_rgba(cairoshapes, r,g,b,0.8); cairo_set_line_width(cairoshapes, cw); cairo_set_source_rgba(cairo, r,g,b,0.8); cairo_set_line_width(cairo, cw); } // Draw circles around each star. // Find center of mass (of the in-bounds stars) cmass[0] = cmass[1] = cmass[2] = 0.0; for (i=0; i<il_size(inboundstars); i++) { double xyz[3]; int star = il_get(inboundstars, i); constellations_get_star_radec(star, &ra, &dec); if (!sip_radec2pixelxy(&sip, ra, dec, &px, &py)) continue; if (px < 0 || py < 0 || px*scale > W || py*scale > H) continue; if (!justlist) { cairo_arc(cairobg, px, py, crad+1.0, 0.0, 2.0*M_PI); cairo_stroke(cairobg); cairo_arc(cairoshapes, px, py, crad, 0.0, 2.0*M_PI); cairo_stroke(cairoshapes); } radecdeg2xyzarr(ra, dec, xyz); cmass[0] += xyz[0]; cmass[1] += xyz[1]; cmass[2] += xyz[2]; } cmass[0] /= il_size(inboundstars); cmass[1] /= il_size(inboundstars); cmass[2] /= il_size(inboundstars); xyzarr2radecdeg(cmass, &ra, &dec); il_free(inboundstars); if (!sip_radec2pixelxy(&sip, ra, dec, &px, &py)) continue; shortname = constellations_get_shortname(c); longname = constellations_get_longname(c); assert(shortname && longname); logverb("%s at (%g, %g)\n", longname, px, py); if (Ninbounds == Nunique) { printf("The constellation %s (%s)\n", longname, shortname); } else { printf("Part of the constellation %s (%s)\n", longname, shortname); } if (justlist) continue; // If the label will be off-screen, move it back on. cairo_text_extents(cairo, shortname, &textents); if (px < 0) px = 0; if (py < textents.height) py = textents.height; if ((px + textents.width)*scale > W) px = W/scale - textents.width; if ((py+textents.height)*scale > H) py = H/scale - textents.height; logverb("%s at (%g, %g)\n", shortname, px, py); add_text(cairos, longname, px, py, halign, valign); // Draw the lines. cairo_set_line_width(cairo, lw); lines = constellations_get_lines(c); for (i=0; i<il_size(lines)/2; i++) { int star1, star2; double ra1, dec1, ra2, dec2; double px1, px2, py1, py2; double dx, dy; double dist; double gapfrac; star1 = il_get(lines, i*2+0); star2 = il_get(lines, i*2+1); constellations_get_star_radec(star1, &ra1, &dec1); constellations_get_star_radec(star2, &ra2, &dec2); if (!sip_radec2pixelxy(&sip, ra1, dec1, &px1, &py1) || !sip_radec2pixelxy(&sip, ra2, dec2, &px2, &py2)) continue; dx = px2 - px1; dy = py2 - py1; dist = hypot(dx, dy); gapfrac = endgap / dist; cairo_move_to(cairoshapes, px1 + dx*gapfrac, py1 + dy*gapfrac); cairo_line_to(cairoshapes, px1 + dx*(1.0-gapfrac), py1 + dy*(1.0-gapfrac)); cairo_stroke(cairoshapes); } il_free(lines); } logverb("done constellations.\n"); } if (bright) { double dy = 0; cairo_font_extents_t extents; pl* brightstars = pl_new(16); if (!justlist) { cairo_set_source_rgba(cairoshapes, 0.75, 0.75, 0.75, 0.8); cairo_font_extents(cairo, &extents); dy = extents.ascent * 0.5; cairo_set_line_width(cairoshapes, cw); } N = bright_stars_n(); logverb("Checking %i bright stars.\n", N); for (i=0; i<N; i++) { const brightstar_t* bs = bright_stars_get(i); if (!sip_radec2pixelxy(&sip, bs->ra, bs->dec, &px, &py)) continue; if (px < 0 || py < 0 || px*scale > W || py*scale > H) continue; if (!(bs->name && strlen(bs->name))) continue; if (common_only && !(bs->common_name && strlen(bs->common_name))) continue; if (strcmp(bs->common_name, "Maia") == 0) continue; pl_append(brightstars, bs); } // keep only the Nbright brightest? if (Nbright && (pl_size(brightstars) > Nbright)) { pl_sort(brightstars, sort_by_mag); pl_remove_index_range(brightstars, Nbright, pl_size(brightstars)-Nbright); } for (i=0; i<pl_size(brightstars); i++) { char* text; const brightstar_t* bs = pl_get(brightstars, i); if (!sip_radec2pixelxy(&sip, bs->ra, bs->dec, &px, &py)) continue; if (bs->common_name && strlen(bs->common_name)) if (print_common_only || common_only) text = strdup(bs->common_name); else asprintf_safe(&text, "%s (%s)", bs->common_name, bs->name); else text = strdup(bs->name); logverb("%s at (%g, %g)\n", text, px, py); if (json) { sl* names = sl_new(4); char* namearr; if (bs->common_name && strlen(bs->common_name)) sl_append(names, bs->common_name); if (bs->name) sl_append(names, bs->name); namearr = sl_join(names, "\", \""); sl_appendf(json, "{ \"type\" : \"star\", " " \"pixelx\": %g, " " \"pixely\": %g, " " \"name\" : \"%s\", " " \"names\" : [ \"%s\" ] } " , px, py, (bs->common_name && strlen(bs->common_name)) ? bs->common_name : bs->name, namearr); free(namearr); sl_free2(names); } if (bs->common_name && strlen(bs->common_name)) printf("The star %s (%s)\n", bs->common_name, bs->name); else printf("The star %s\n", bs->name); if (!justlist) { float r,g,b; // set color based on RA,Dec to match constellations above. color_for_radec(bs->ra, bs->dec, &r,&g,&b); cairo_set_source_rgba(cairoshapes, r,g,b,0.8); cairo_set_source_rgba(cairo, r,g,b, 0.8); } if (!justlist) add_text(cairos, text, px + label_offset, py + dy, halign, valign); free(text); if (!justlist) { // plot a black circle behind the light circle... cairo_arc(cairobg, px, py, crad+1.0, 0.0, 2.0*M_PI); cairo_stroke(cairobg); cairo_arc(cairoshapes, px, py, crad, 0.0, 2.0*M_PI); cairo_stroke(cairoshapes); } } pl_free(brightstars); } if (NGC) { double imscale; double imsize; double dy = 0; cairo_font_extents_t extents; if (!justlist) { cairo_set_source_rgb(cairoshapes, 1.0, 1.0, 1.0); cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0); cairo_set_line_width(cairo, nw); cairo_font_extents(cairo, &extents); dy = extents.ascent * 0.5; } // arcsec/pixel imscale = sip_pixel_scale(&sip); // arcmin imsize = imscale * (imin(W, H) / scale) / 60.0; N = ngc_num_entries(); logverb("Checking %i NGC/IC objects.\n", N); for (i=0; i<N; i++) { ngc_entry* ngc = ngc_get_entry(i); sl* str; sl* names; double pixsize; float ara, adec; char* text; if (!ngc) break; if (ngc->size < imsize * ngc_fraction) continue; if (ngcic_accurate_get_radec(ngc->is_ngc, ngc->id, &ara, &adec) == 0) { ngc->ra = ara; ngc->dec = adec; } if (!sip_radec2pixelxy(&sip, ngc->ra, ngc->dec, &px, &py)) continue; if (px < 0 || py < 0 || px*scale > W || py*scale > H) continue; str = sl_new(4); //sl_appendf(str, "%s %i", (ngc->is_ngc ? "NGC" : "IC"), ngc->id); names = ngc_get_names(ngc, NULL); if (names) { int n; for (n=0; n<sl_size(names); n++) { if (only_messier && strncmp(sl_get(names, n), "M ", 2)) continue; sl_append(str, sl_get(names, n)); } } sl_free2(names); text = sl_implode(str, " / "); printf("%s\n", text); pixsize = ngc->size * 60.0 / imscale; if (!justlist) { // black circle behind the white one... cairo_arc(cairobg, px, py, pixsize/2.0+1.0, 0.0, 2.0*M_PI); cairo_stroke(cairobg); cairo_move_to(cairoshapes, px + pixsize/2.0, py); cairo_arc(cairoshapes, px, py, pixsize/2.0, 0.0, 2.0*M_PI); debug("size: %f arcsec, pixsize: %f pixels\n", ngc->size, pixsize); cairo_stroke(cairoshapes); add_text(cairos, text, px + label_offset, py + dy, halign, valign); } if (json) { char* namelist = sl_implode(str, "\", \""); sl_appendf(json, "{ \"type\" : \"ngc\", " " \"names\" : [ \"%s\" ], " " \"pixelx\" : %g, " " \"pixely\" : %g, " " \"radius\" : %g }" , namelist, px, py, pixsize/2.0); free(namelist); } free(text); sl_free2(str); } } if (HD) { double rac, decc, ra2, dec2; double arcsec; hd_catalog_t* hdcat; bl* hdlist; int i; if (!justlist) cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0); logverb("Reading HD catalog: %s\n", hdpath); hdcat = henry_draper_open(hdpath); if (!hdcat) { ERROR("Failed to open HD catalog"); exit(-1); } logverb("Got %i HD stars\n", henry_draper_n(hdcat)); sip_pixelxy2radec(&sip, W/(2.0*scale), H/(2.0*scale), &rac, &decc); sip_pixelxy2radec(&sip, 0.0, 0.0, &ra2, &dec2); arcsec = arcsec_between_radecdeg(rac, decc, ra2, dec2); // Fudge arcsec *= 1.1; hdlist = henry_draper_get(hdcat, rac, decc, arcsec); logverb("Found %zu HD stars within range (%g arcsec of RA,Dec %g,%g)\n", bl_size(hdlist), arcsec, rac, decc); for (i=0; i<bl_size(hdlist); i++) { double px, py; char* txt; hd_entry_t* hd = bl_access(hdlist, i); if (!sip_radec2pixelxy(&sip, hd->ra, hd->dec, &px, &py)) { continue; } if (px < 0 || py < 0 || px*scale > W || py*scale > H) { logverb(" HD %i at RA,Dec (%g, %g) -> pixel (%.1f, %.1f) is out of bounds\n", hd->hd, hd->ra, hd->dec, px, py); continue; } asprintf_safe(&txt, "HD %i", hd->hd); if (!justlist) { cairo_text_extents_t textents; cairo_text_extents(cairo, txt, &textents); cairo_arc(cairobg, px, py, crad+1.0, 0.0, 2.0*M_PI); cairo_stroke(cairobg); cairo_arc(cairoshapes, px, py, crad, 0.0, 2.0*M_PI); cairo_stroke(cairoshapes); px -= (textents.width * 0.5); py -= (crad + 4.0); add_text(cairos, txt, px, py, halign, valign); } if (json) sl_appendf(json, "{ \"type\" : \"hd\"," " \"pixelx\": %g, " " \"pixely\": %g, " " \"name\" : \"HD %i\" }" , px, py, hd->hd); printf("%s\n", txt); free(txt); } bl_free(hdlist); henry_draper_close(hdcat); } if (json) { FILE* fout = stderr; char* annstr = sl_implode(json, ",\n"); fprintf(fout, "{ \n"); fprintf(fout, " \"status\": \"solved\",\n"); fprintf(fout, " \"git-revision\": %s,\n", AN_GIT_REVISION); fprintf(fout, " \"git-date\": \"%s\",\n", AN_GIT_DATE); fprintf(fout, " \"annotations\": [\n%s\n]\n", annstr); fprintf(fout, "}\n"); free(annstr); } sl_free2(json); json = NULL; if (justlist) return 0; target = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); cairot = cairo_create(target); cairo_set_source_rgba(cairot, 0, 0, 0, 1); // Here's where you set the background surface's properties... cairo_set_source_surface(cairot, surfbg, 0, 0); cairo_mask_surface(cairot, surfshapesmask, 0, 0); cairo_stroke(cairot); // Add on the shapes. cairo_set_source_surface(cairot, surfshapes, 0, 0); //cairo_mask_surface(cairot, surfshapes, 0, 0); cairo_mask_surface(cairot, surfshapesmask, 0, 0); cairo_stroke(cairot); // Add on the foreground. cairo_set_source_surface(cairot, surffg, 0, 0); cairo_mask_surface(cairot, surffg, 0, 0); cairo_stroke(cairot); // Convert image for output... cairoutils_argb32_to_rgba(img, W, H); if (pngformat) { if (cairoutils_write_png(outfn, img, W, H)) { ERROR("Failed to write PNG"); exit(-1); } } else { if (cairoutils_write_ppm(outfn, img, W, H)) { ERROR("Failed to write PPM"); exit(-1); } } cairo_surface_destroy(target); cairo_surface_destroy(surfshapesmask); cairo_surface_destroy(surffg); cairo_surface_destroy(surfbg); cairo_surface_destroy(surfshapes); cairo_destroy(cairo); cairo_destroy(cairot); cairo_destroy(cairobg); cairo_destroy(cairoshapes); cairo_destroy(cairoshapesmask); free(img); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plot-xy-and-quad.c��������������������������������������������������������000644 �000765 �000024 �00000016036 12651445460 021134� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /* Hackery for dstn's thesis - cairo pdf rendering of "plotxy" and "plotquad" over a background image. */ #include <math.h> #include <string.h> #include <stdint.h> #include <cairo.h> #include <cairo-pdf.h> #include <cairo-ps.h> #include "xylist.h" #include "matchfile.h" #include "permutedsort.h" #include "boilerplate.h" #include "cairoutils.h" #include "log.h" #include "errors.h" static const char* OPTIONS = "hvj:x:m:W:H:s:E"; static void printHelp(char* progname) { fprintf(stderr, "\nUsage: %s [options] > output.pdf\n" " -j <jpeg filename>\n" " -x <xylist filename>\n" " -m <match filename>\n" " [-W <output width (points)>]\n" " [-H <output height (points)>]\n" " [-s <xylist-sale-factor>]\n" " [-E]: EPS output\n" "\n", progname); } int main(int argc, char *args[]) { int argchar; char* progname = args[0]; int outW=0, outH=0; int W, H; unsigned char* img = NULL; cairo_t* cairo; cairo_surface_t* target; xylist_t* xyls; starxy_t* xy; int Nxy; int Nstars; int ext = 1; double xoff, yoff; double scalexy = 1.0; float br, bg, bb; float r, g, b; double rad; double lw; int marker; int i; int nquads; int dimquads = 4; dl* coords; int loglvl = LOG_MSG; double sx, sy; anbool eps = FALSE; /* # | plotxy -i m88.xy -I - -x 1 -y 1 -b white -C black -N 100 -r 10 -w 2 -P \ # | plotquad -I - -C black -m m88-${I2}.match -P \ */ char* bgimgfn = NULL; char* xylsfn = NULL; char* matchfn = NULL; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'E': eps = TRUE; break; case 'j': bgimgfn = optarg; break; case 'x': xylsfn = optarg; break; case 'm': matchfn = optarg; break; case 'W': outW = atoi(optarg); break; case 'H': outH = atoi(optarg); break; case 's': scalexy = atof(optarg); break; case 'h': printHelp(progname); exit(0); case 'v': loglvl++; break; } log_init(LOG_MSG); log_to(stderr); errors_log_to(stderr); if (!(bgimgfn && xylsfn && matchfn)) { ERROR("Must specify background jpeg, xyls, and match filenames.\n"); printHelp(progname); exit(-1); } Nstars = 100; xoff = yoff = 1.0; r = g = b = 0.0; br = bg = bb = 1.0; rad = 6; lw = 2; marker = CAIROUTIL_MARKER_CIRCLE; W = H = -1; coords = dl_new(16); // read bg image to get size. img = cairoutils_read_jpeg(bgimgfn, &W, &H); if (!img) { ERROR("Failed to read background image \"%s\"", bgimgfn); exit(-1); } logmsg("Read \"%s\": %ix%i pixels\n", bgimgfn, W, H); xyls = xylist_open(xylsfn); if (!xyls) { ERROR("Failed to read xylist \"%s\"", xylsfn); exit(-1); } if (!outW) outW = W; if (!outH) outH = H; logmsg("Background image aspect ratio %g; output file aspect ratio %g.\n", W/(float)H, outW/(float)outH); // create output buffer. if (eps) { target = cairo_ps_surface_create_for_stream(cairoutils_file_write_func, stdout, outW, outH); cairo_ps_surface_set_eps(target, TRUE); } else { target = cairo_pdf_surface_create_for_stream(cairoutils_file_write_func, stdout, outW, outH); } if (!target) { ERROR("Failed to create cairo surface"); exit(-1); } cairo = cairo_create(target); sx = outW/(float)W; sy = outH/(float)H; cairo_set_line_width(cairo, lw); cairo_set_antialias(cairo, CAIRO_ANTIALIAS_GRAY); cairoutils_surface_status_errors(target); cairoutils_cairo_status_errors(cairo); // render image. { cairo_surface_t* thissurf; cairo_pattern_t* pat; cairoutils_rgba_to_argb32(img, W, H); thissurf = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); pat = cairo_pattern_create_for_surface(thissurf); logmsg("Scaling image by factors %g, %g\n", sx, sy); cairo_save(cairo); cairo_scale(cairo, sx, sy); cairo_set_source(cairo, pat); cairo_paint(cairo); cairo_restore(cairo); cairo_pattern_destroy(pat); cairo_surface_destroy(thissurf); } free(img); // render xylist. // we don't care about FLUX and BACKGROUND columns. xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); // Find number of entries in xylist. xy = xylist_read_field_num(xyls, ext, NULL); if (!xy) { ERROR("Failed to read FITS extension %i from file %s", ext, xylsfn); exit(-1); } Nxy = starxy_n(xy); logmsg("Xylist contains %i stars\n", Nxy); // If N is specified, apply it as a max. if (Nstars) { if (Nstars < Nxy) logmsg("Keeping %i stars.\n", Nstars); Nxy = MIN(Nxy, Nstars); } cairo_set_source_rgb(cairo, r, g, b); // render background markers. cairo_save(cairo); cairo_set_line_width(cairo, lw+2.0); //cairo_set_source_rgba(cairo, br, bg, bb, 0.75); cairo_set_source_rgba(cairo, br, bg, bb, 1.0); for (i=0; i<Nxy; i++) { double x = (starxy_getx(xy, i) - xoff) * sx * scalexy + 0.5; double y = (starxy_gety(xy, i) - yoff) * sy * scalexy + 0.5; cairoutils_draw_marker(cairo, marker, x, y, rad); cairo_stroke(cairo); } cairo_restore(cairo); // Draw markers. for (i=0; i<Nxy; i++) { double x = (starxy_getx(xy, i) - xoff) * sx * scalexy + 0.5; double y = (starxy_gety(xy, i) - yoff) * sy * scalexy + 0.5; cairoutils_draw_marker(cairo, marker, x, y, rad); cairo_stroke(cairo); } starxy_free(xy); xylist_close(xyls); // Plot quad. { matchfile* mf = matchfile_open(matchfn); MatchObj* mo; if (!mf) { ERROR("Failed to open matchfile \"%s\"", matchfn); exit(-1); } while (1) { mo = matchfile_read_match(mf); if (!mo) break; for (i=0; i<2*dimquads; i++) { dl_append(coords, mo->quadpix[i]); } } } nquads = dl_size(coords) / (2*dimquads); lw = 4; cairo_set_line_width(cairo, lw); cairo_set_line_join(cairo, CAIRO_LINE_JOIN_BEVEL); for (i=0; i<nquads; i++) { int j; double theta[dimquads]; int perm[dimquads]; double cx, cy; // Make the quad convex so Sam's eyes don't bleed. cx = cy = 0.0; for (j=0; j<dimquads; j++) { cx += dl_get(coords, i*(2*dimquads) + j*2); cy += dl_get(coords, i*(2*dimquads) + j*2 + 1); } cx /= dimquads; cy /= dimquads; for (j=0; j<dimquads; j++) { theta[j] = atan2(dl_get(coords, i*(2*dimquads) + j*2 + 1)-cy, dl_get(coords, i*(2*dimquads) + j*2 + 0)-cx); } permutation_init(perm, dimquads); permuted_sort(theta, sizeof(double), compare_doubles_asc, perm, dimquads); for (j=0; j<dimquads; j++) { ((j==0) ? cairo_move_to : cairo_line_to) (cairo, (dl_get(coords, i*(2*dimquads) + perm[j]*2) - xoff) * sx * scalexy + 0.5, (dl_get(coords, i*(2*dimquads) + perm[j]*2 + 1) - yoff) * sy * scalexy + 0.5); } cairo_close_path(cairo); cairo_stroke(cairo); } // do output & clean up. cairo_surface_flush(target); cairo_surface_finish(target); cairoutils_surface_status_errors(target); cairoutils_cairo_status_errors(cairo); cairo_surface_destroy(target); cairo_destroy(cairo); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotann.py����������������������������������������������������������������000755 �000765 �000024 �00000033601 12651445460 017711� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import sys import os from optparse import OptionParser # from util/addpath.py if __name__ == '__main__': mydir = sys.path[0] andir = os.path.dirname(mydir) rootdir = os.path.dirname(andir) sys.path.insert(1, rootdir) from astrometry.blind.plotstuff import * from astrometry.util.fits import * def match_kdtree_catalog(wcs, catfn): from astrometry.libkd.spherematch import tree_open, tree_close, tree_build_radec, tree_free, trees_match, tree_permute from astrometry.libkd import spherematch_c from astrometry.util.starutil_numpy import deg2dist, xyztoradec import numpy as np import sys rc,dc = wcs.get_center() rr = wcs.get_radius() kd = tree_open(catfn) kd2 = tree_build_radec(np.array([rc]), np.array([dc])) r = deg2dist(rr) I,J,nil = trees_match(kd, kd2, r, permuted=False) # HACK #I2,J,d = trees_match(kd, kd2, r) xyz = spherematch_c.kdtree_get_positions(kd, I.astype(np.uint32)) #print 'I', I I2 = tree_permute(kd, I) #print 'I2', I2 tree_free(kd2) tree_close(kd) tra,tdec = xyztoradec(xyz) return tra, tdec, I2 def get_annotations(wcs, opt): # Objects to annotate: annobjs = [] if opt.uzccat: # FIXME -- is this fast enough, or do we need to cut these # targets first? T = fits_table(opt.uzccat) for i in range(len(T)): if not wcs.is_inside(T.ra[i], T.dec[i]): continue annobjs.append((T.ra[i], T.dec[i], 'uzc', ['UZC %s' % T.zname[i]])) if opt.hipcat: # FIXME -- is this fast enough, or do we need to cut these # targets first? T = fits_table(opt.hipcat) for i in range(len(T)): if not wcs.is_inside(T.ra[i], T.dec[i]): continue if opt.hiplabel: txt = ['HIP %i (%.1f)' % (T.hip[i], T.vmag[i])] else: txt = [''] annobjs.append((T.ra[i], T.dec[i], 'HIP', txt)) if opt.abellcat: T = fits_table(opt.abellcat) for i in range(len(T)): if not wcs.is_inside(T.ra[i], T.dec[i]): continue annobjs.append((T.ra[i], T.dec[i], 'abell', ['Abell %i' % T.aco[i]])) if opt.t2cat: #print 'Matching Tycho2...' tra,tdec,I2 = match_kdtree_catalog(wcs, opt.t2cat) T = fits_table(opt.t2cat, hdu=6) for r,d,t1,t2,t3 in zip(tra,tdec, T.tyc1[I2], T.tyc2[I2], T.tyc3[I2]): if not wcs.is_inside(r, d): continue annobjs.append((r, d, 'tycho2', ['Tycho-2 %i-%i-%i' % (t1,t2,t3)])) return annobjs def get_annotations_for_wcs(wcs, opt): anns = get_annotations(wcs, opt) # NGC/IC 2000 circs = [] if opt.ngcnames: T = fits_table(opt.ngcnames) T.cut(np.array([len(s) for s in T.name])) T.isngc = np.array([not s.startswith('I') for s in T.name]) T.num = np.array([int(s.replace('I','').strip()) for s in T.name]) namemap = {} for X,nm in zip(zip(T.isngc, T.num), T.object): if not X in namemap: namemap[X] = [] namemap[X].append(nm) else: namemap = None for nm,isngc,cat in [('NGC', True, opt.ngccat), ('IC', False, opt.iccat)]: if not cat: continue T = fits_table(cat) num = T.get(nm.lower() + 'num') for i in range(len(T)): # FIXME -- include NGC object radius...? if not wcs.is_inside(float(T.ra[i]), float(T.dec[i])): continue names = ['%s %i' % (nm, num[i])] if namemap: more = namemap.get((isngc, num[i]), None) if more: names += more #' / '.join(more) if T.radius[i]: circs.append((T.ra[i], T.dec[i], nm.lower(), names, T.radius[i])) else: anns.append((T.ra[i], T.dec[i], nm.lower(), names)) if opt.hdcat: #print 'Matching HD...' ra,dec,I = match_kdtree_catalog(wcs, opt.hdcat) for r,d,i in zip(ra,dec,I): if not wcs.is_inside(r, d): continue # good ol' HD catalog and its sensible numbering scheme anns.append((r, d, 'hd', ['HD %i' % (i+1)])) if opt.brightcat: T = fits_table(opt.brightcat) if opt.nbright: T.cut(np.argsort(T.vmag)) nb = 0 for r,d,n1,n2,vmag in zip(T.ra, T.dec, T.name1, T.name2, T.vmag): if not wcs.is_inside(r, d): continue print 'Bright-star catalog:', n1, n2 names = [] n1 = n1.strip() if len(n1): if '\\u' in n1: n1 = unicode(n1) import json x = json.dumps(n1) x = x.replace('\\\\','\\') n1 = json.loads(x) names.append(n1) n2 = n2.strip() if len(n2): names.append(n2) if len(names) == 0: # skip unnamed stars continue anns.append((r, d, 'bright', names, vmag)) nb += 1 if opt.nbright and nb >= opt.nbright: break jobjs = [] for ann in anns: r,d,typ,names = ann[:4] ok,x,y = wcs.radec2pixelxy(float(r),float(d)) dd = dict(type=typ, names=names, pixelx=x, pixely=y, radius=0.) if len(ann) == 5: mag = ann[4] dd.update(vmag=mag) jobjs.append(dd) for r,d,typ,names,rad in circs: ok,x,y = wcs.radec2pixelxy(float(r),float(d)) pixscale = wcs.pixel_scale() pixrad = (rad * 3600.) / pixscale jobjs.append(dict(type=typ, names=names, pixelx=x, pixely=y, radius=pixrad)) return jobjs class OptDuck(object): pass def get_empty_opts(): opt = OptDuck() opt.ngc = False opt.bright = False opt.brightcat = None opt.nbright = 0 opt.hdcat = None opt.uzccat = None opt.t2cat = None opt.abellcat = None opt.ngccat = None opt.ngcnames = None opt.iccat = None return opt if __name__ == '__main__': parser = OptionParser('usage: %prog <wcs.fits file> <image file> <output.{jpg,png,pdf} file>\n' + ' OR %prog <wcs.fits> for JSON output') parser.add_option('--scale', dest='scale', type=float, help='Scale plot by this factor') parser.add_option('--no-ngc', dest='ngc', action='store_false', default=True) parser.add_option('--no-bright', dest='bright', action='store_false', default=True) parser.add_option('--no-const', dest='const', action='store_false', default=True, help='Do not plot constellations') parser.add_option('--hdcat', dest='hdcat', help='Path to Henry Draper catalog hd.fits') parser.add_option('--uzccat', dest='uzccat', help='Path to Updated Zwicky Catalog uzc2000.fits') parser.add_option('--tycho2cat', dest='t2cat', help='Path to Tycho-2 KD-tree file') parser.add_option('--abellcat', dest='abellcat', help='Path to Abell catalog abell-all.fits') parser.add_option('--hipcat', dest='hipcat', help='Path to Hipparcos catalog hip.fits') parser.add_option('--hiplabel', action='store_true', help='Label Hipparcos stars') parser.add_option('--ngccat', dest='ngccat', help='Path to NGC2000 catalog ngc2000.fits -- ONLY USED FOR JSON OUTPUT!') parser.add_option('--ngcnames', dest='ngcnames', help='Path to ngc2000names.fits for aliases') parser.add_option('--iccat', dest='iccat', help='Path to IC2000 catalog ic2000.fits -- ONLY USED FOR JSON OUTPUT!') parser.add_option('--ngcfrac', dest='ngcfrac', type=float, default=0., help='Minimum fraction of image size to plot NGC/IC objs; default %default') parser.add_option('--brightcat', dest='brightcat', help='Path to bright-star catalog -- ONLY USED FOR JSON OUTPUT!') parser.add_option('--nbright', dest='nbright', type=int, default=0, help='Max number of bright stars') parser.add_option('--target', '-t', dest='target', action='append', default=[], help='Add named target (eg "M 31", "NGC 1499")') parser.add_option('--no-grid', dest='grid', action='store_false', default=True, help='Turn off grid lines') parser.add_option('--grid-size', dest='gridsize', type=float, default=0.1, help='Grid spacing (in degrees), default %default') parser.add_option('--grid-color', dest='gridcolr', default='0.2:0.2:0.2', help='Grid color, default %default') parser.add_option('--grid-label', dest='gridlab', type=float, default=0.2, help='Grid label spacing (in degrees), default %default') parser.add_option('--tcolor', dest='textcolor', default='green', help='Text color') parser.add_option('--tsize', dest='textsize', default=18, type=float, help='Text font size') parser.add_option('--halign', dest='halign', default='C', help='Text horizontal alignment') parser.add_option('--valign', dest='valign', default='B', help='Text vertical alignment') parser.add_option('--tox', dest='tox', default=0, type=float, help='Text offset x') parser.add_option('--toy', dest='toy', default=0, type=float, help='Text offset y') parser.add_option('--lw', dest='lw', default=2, type=float, help='Annotations line width') parser.add_option('--ms', dest='ms', default=0., type=float, help='Marker size') parser.add_option('--rd', dest='rd', action='append', default=[], help='Plot RA,Dec markers') parser.add_option('--xy', dest='xy', action='append', default=[], help='Plot x,y markers') parser.add_option('--quad', dest='quad', action='append', default=[], help='Plot quad from given match file') parser.add_option('--pastel', action='store_true', help='Pastel colors for constellations and bright stars?') parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='be chatty') opt,args = parser.parse_args() dojson = False if len(args) == 3: imgfn = args[1] outfn = args[2] else: if len(args) == 1: dojson = True else: parser.print_help() sys.exit(-1) import logging logformat = '%(message)s' from astrometry.util.util import log_init #, LOG_VERB, LOG_MSG loglvl = 2 if opt.verbose: logging.basicConfig(level=logging.DEBUG, format=logformat) loglvl += 1 else: logging.basicConfig(level=logging.INFO, format=logformat) log_init(loglvl) wcsfn = args[0] if dojson: from astrometry.util.util import anwcs wcs = anwcs(wcsfn,0) jobjs = get_annotations_for_wcs(wcs, opt) import json j = json.dumps(jobjs) print j sys.exit(0) fmt = PLOTSTUFF_FORMAT_JPG s = outfn.split('.') if len(s): s = s[-1].lower() if s in Plotstuff.format_map: fmt = s plot = Plotstuff(outformat=fmt, wcsfn=wcsfn) #plot.wcs_file = wcsfn #plot.outformat = fmt #plotstuff_set_size_wcs(plot.pargs) if opt.ms: plot.markersize = opt.ms plot.fontsize = opt.textsize plot.outfn = outfn img = plot.image img.set_file(imgfn) if opt.scale: plot.scale_wcs(opt.scale) plot.set_size_from_wcs() #W,H = img.get_size() plot.plot('image') if opt.grid: plot.color = opt.gridcolr plot.plot_grid(opt.gridsize, opt.gridsize, opt.gridlab, opt.gridlab) ann = plot.annotations ann.NGC = opt.ngc ann.constellations = opt.const ann.constellation_labels = opt.const ann.constellation_labels_long = opt.const ann.bright = opt.bright ann.ngc_fraction = opt.ngcfrac if opt.pastel: ann.constellation_pastel = True ann.bright_pastel = True print ann.constellation_pastel if opt.hdcat: ann.HD = True ann.HD_labels = True ann.hd_catalog = opt.hdcat anns = get_annotations(plot.wcs, opt) for r,d,typ,names in anns: name = ' / '.join(names) ann.add_target(r, d, name) plot.color = opt.textcolor plot.fontsize = opt.textsize plot.lw = opt.lw plot.valign = opt.valign plot.halign = opt.halign plot.label_offset_x = opt.tox; plot.label_offset_y = opt.toy; if len(opt.target): for t in opt.target: if plot_annotations_add_named_target(ann, t): raise RuntimeError('Unknown target', t) plot.plot('annotations') for rdfn in opt.rd: rd = plot.radec rd.fn = rdfn plot.plot('radec') for fn in opt.xy: xy = plot.xy xy.fn = fn plot.plot('xy') for mfn in opt.quad: match = fits_table(mfn) for m in match: qp = m.quadpix xy = [(qp[0], qp[1])] #plot.move_to_xy(qp[0], qp[1]) for d in range(1, m.dimquads): #plot.line_to_xy(qp[2 * d], qp[2 * d + 1]) xy.append((qp[2 * d], qp[2 * d + 1])) #plot.stroke() plot.polygon(xy) plot.close_path() plot.stroke() plot.write() �������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotannotations.c���������������������������������������������������������000644 �000765 �000024 �00000041432 12651445460 021262� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include <assert.h> #include <cairo.h> #include "os-features.h" #include "plotannotations.h" #include "hd.h" #include "ngc2000.h" #include "brightstars.h" #include "cairoutils.h" #include "sip-utils.h" #include "starutil.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "sip-utils.h" #include "mathutil.h" #include "constellations.h" #include "constellation-boundaries.h" DEFINE_PLOTTER(annotations); struct target { double ra; double dec; char* name; }; typedef struct target target_t; plotann_t* plot_annotations_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "annotations"); } static void plot_targets(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i; double cra, cdec; plotstuff_get_radec_center_and_radius(pargs, &cra, &cdec, NULL); for (i=0; i<bl_size(ann->targets); i++) { target_t* tar = bl_access(ann->targets, i); double px,py; double cx,cy; double dx,dy, r; double ex,ey; double ly, ry, tx, bx; double distdeg; anbool okquadrant; char* txt; logverb("Target: \"%s\" at (%g,%g)\n", tar->name, tar->ra, tar->dec); okquadrant = plotstuff_radec2xy(pargs, tar->ra, tar->dec, &px, &py); px -= 1; py -= 1; if (okquadrant && px >= 0 && px < pargs->W && py >= 0 && py < pargs->H) { // inside the image! logverb("Target \"%s\" is inside the image, at pixel (%g,%g)\n", tar->name, px, py); plotstuff_stack_marker(pargs, px, py); plotstuff_stack_text(pargs, cairo, tar->name, px, py); continue; } // outside the image: find intersection point. cx = pargs->W / 2.0; cy = pargs->H / 2.0; if (okquadrant) { logverb("Target \"%s\" is outside the image, at pixel (%g,%g)\n", tar->name, px, py); dx = px - cx; dy = py - cy; } else { double cxyz[3]; double txyz[3]; double vec[3]; int j; double ra,dec; logverb("Target \"%s\" is way outside the image.\n", tar->name); // fallback. radecdeg2xyzarr(cra, cdec, cxyz); radecdeg2xyzarr(tar->ra, tar->dec, txyz); for (j=0; j<3; j++) vec[j] = cxyz[j] + 0.1 * txyz[j]; normalize_3(vec); xyzarr2radecdeg(vec, &ra, &dec); okquadrant = plotstuff_radec2xy(pargs, ra, dec, &px, &py); assert(okquadrant); dx = px - cx; dy = py - cy; if ((dx*dx + dy*dy) < (cx*cx + cy*cy)) { double scale = 3.0 * sqrt(cx*cx + cy*cy) / sqrt(dx*dx + dy*dy); dx *= scale; dy *= scale; } } ly = (-(pargs->W/2.0) / dx) * dy + cy; ry = ( (pargs->W/2.0) / dx) * dy + cy; bx = (-(pargs->H/2.0) / dy) * dx + cx; tx = ( (pargs->H/2.0) / dy) * dx + cx; logverb("ly %g, ry %g, bx %g, tx %g\n", ly, ry, bx, tx); if (px < cx && ly >= 0 && ly < pargs->H) { ex = 0.0; ey = ly; } else if (px >= cx && ry >= 0 && ry < pargs->H) { ex = pargs->W - 1; ey = ry; } else if (py < cy && bx >= 0 && bx < pargs->W) { ex = bx; ey = 0; } else if (py >= cy && tx >= 0 && tx < pargs->W) { ex = tx; ey = pargs->H - 1; } else { logverb("None of the edges are in bounds: px,py=(%g,%g); ly=%g, ry=%g, bx=%g, tx=%g\n", px,py,ly,ry,bx,tx); continue; } dx = ex - cx; dy = ey - cy; r = sqrt(dx*dx + dy*dy); px = (r-100.0) / r * dx + cx; py = (r-100.0) / r * dy + cy; plotstuff_stack_arrow(pargs, px, py, ex, ey); logverb("Arrow from (%g,%g) to (%g,%g)\n", px, py, ex, ey); distdeg = deg_between_radecdeg(cra, cdec, tar->ra, tar->dec); asprintf_safe(&txt, "%s: %.1f deg", tar->name, distdeg); plotstuff_stack_text(pargs, cairo, txt, px, py); } } static void plot_offset_line_rd(cairo_t* cairo, plot_args_t* pargs, double r1, double d1, double r2, double d2, double offset1, double offset2) { double x1,x2,y1,y2; double dx, dy; double dist; double gapfrac; if (!cairo) cairo = pargs->cairo; if (!plotstuff_radec2xy(pargs, r1,d1, &x1,&y1) || !plotstuff_radec2xy(pargs, r2,d2, &x2,&y2)) { ERROR("failed to convert RA,Dec to x,y for plotting line seg"); return; } dx = x2 - x1; dy = y2 - y1; dist = hypot(dx, dy); gapfrac = offset1 / dist; //printf("(x1,y1)-(x2,y2) (%f, %f) -- (%f, %f)\n", x1,y1,x2,y2); //printf("Offset to:\n"); //printf(" (%f, %f) -- ", x1 + dx*gapfrac, y1 + dy*gapfrac); cairo_move_to(cairo, x1 + dx*gapfrac, y1 + dy*gapfrac); gapfrac = offset2 / dist; cairo_line_to(cairo, x1 + dx*(1.0-gapfrac), y1 + dy*(1.0-gapfrac)); //printf("(%f, %f)\n", x1 + dx*(1.0-gapfrac), y1 + dy*(1.0-gapfrac)); } static void color_for_radec(double ra, double dec, float* r, float* g, float* b) { int con = constellation_containing(ra, dec); srand(con); *r = ((rand() % 128) + 127) / 255.0; *g = ((rand() % 128) + 127) / 255.0; *b = ((rand() % 128) + 127) / 255.0; } static void plot_constellations(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i, N; double ra,dec,radius; double xyzf[3]; // Find the field center and radius anwcs_get_radec_center_and_radius(pargs->wcs, &ra, &dec, &radius); logverb("Plotting constellations: field center %g,%g, radius %g\n", ra, dec, radius); radecdeg2xyzarr(ra, dec, xyzf); radius = deg2dist(radius); N = constellations_n(); for (i=0; i<N; i++) { int j, k; // Find the approximate center and radius of this constellation // and see if it overlaps with the field. il* stars = constellations_get_unique_stars(i); double xyzj[3]; double xyzc[3]; double maxr2 = 0; dl* rds; xyzc[0] = xyzc[1] = xyzc[2] = 0.0; xyzj[0] = xyzj[1] = xyzj[2] = 0.0; for (j=0; j<il_size(stars); j++) { constellations_get_star_radec(il_get(stars, j), &ra, &dec); radecdeg2xyzarr(ra, dec, xyzj); for (k=0; k<3; k++) xyzc[k] += xyzj[k]; } normalize_3(xyzc); for (j=0; j<il_size(stars); j++) { constellations_get_star_radec(il_get(stars, j), &ra, &dec); maxr2 = MAX(maxr2, distsq(xyzc, xyzj, 3)); } il_free(stars); maxr2 = square(sqrt(maxr2) + radius); if (distsq(xyzf, xyzc, 3) > maxr2) { xyzarr2radecdeg(xyzc, &ra, &dec); logverb("Constellation %s (center %g,%g, radius %g) out of bounds\n", constellations_get_shortname(i), ra, dec, dist2deg(sqrt(maxr2) - radius)); logverb(" dist from field center to constellation center is %g deg\n", distsq2deg(distsq(xyzf, xyzc, 3))); logverb(" max radius: %g\n", distsq2deg(maxr2)); continue; } if (ann->constellation_pastel) { float r,g,b; xyzarr2radecdeg(xyzc, &ra, &dec); color_for_radec(ra, dec, &r,&g,&b); plotstuff_set_rgba2(pargs, r,g,b, 0.8); plotstuff_builtin_apply(cairo, pargs); } // Phew, plot it. if (ann->constellation_lines) { rds = constellations_get_lines_radec(i); logverb("Constellation %s: plotting %zu lines\n", constellations_get_shortname(i), dl_size(rds)/4); for (j=0; j<dl_size(rds)/4; j++) { double r1,d1,r2,d2; double r3,d3,r4,d4; double off = ann->constellation_lines_offset; r1 = dl_get(rds, j*4+0); d1 = dl_get(rds, j*4+1); r2 = dl_get(rds, j*4+2); d2 = dl_get(rds, j*4+3); if (anwcs_find_discontinuity(pargs->wcs, r1, d1, r2, d2, &r3, &d3, &r4, &d4)) { logverb("Discontinuous: %g,%g -- %g,%g\n", r1, d1, r2, d2); logverb(" %g,%g == %g,%g\n", r3,d3, r4,d4); plot_offset_line_rd(NULL, pargs, r1,d1,r3,d3, off, 0.); plot_offset_line_rd(NULL, pargs, r4,d4,r2,d2, 0., off); } else { plot_offset_line_rd(NULL, pargs, r1,d1,r2,d2, off, off); } plotstuff_stroke(pargs); } dl_free(rds); } if (ann->constellation_labels || ann->constellation_markers) { // Put the label at the center of mass of the stars that // are in-bounds int Nin = 0; stars = constellations_get_unique_stars(i); xyzc[0] = xyzc[1] = xyzc[2] = 0.0; logverb("Labeling %s: %zu stars\n", constellations_get_shortname(i), il_size(stars)); for (j=0; j<il_size(stars); j++) { constellations_get_star_radec(il_get(stars, j), &ra, &dec); if (!anwcs_radec_is_inside_image(pargs->wcs, ra, dec)) continue; if (ann->constellation_markers) plotstuff_marker_radec(pargs, ra, dec); radecdeg2xyzarr(ra, dec, xyzj); for (k=0; k<3; k++) xyzc[k] += xyzj[k]; Nin++; } logverb(" %i stars in-bounds\n", Nin); if (ann->constellation_labels && Nin) { const char* label; normalize_3(xyzc); xyzarr2radecdeg(xyzc, &ra, &dec); if (ann->constellation_labels_long) label = constellations_get_longname(i); else label = constellations_get_shortname(i); plotstuff_text_radec(pargs, ra, dec, label); } il_free(stars); } } } static void plot_brightstars(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i, N; // Get plot center, to use in trimming bright stars double rc,dc,radius; plotstuff_get_radec_center_and_radius(pargs, &rc, &dc, &radius); N = bright_stars_n(); for (i=0; i<N; i++) { double px, py; char* label; const brightstar_t* bs = bright_stars_get(i); // skip unnamed if (!strlen(bs->name) && !strlen(bs->common_name)) continue; // skip stars too far away if (deg_between_radecdeg(rc, dc, bs->ra, bs->dec) > radius * 1.2) continue; if (!plotstuff_radec2xy(pargs, bs->ra, bs->dec, &px, &py)) continue; logverb("Bright star %s/%s at RA,Dec (%g,%g) -> xy (%g, %g)\n", bs->name, bs->common_name, bs->ra, bs->dec, px, py); if (px < 1 || py < 1 || px > pargs->W || py > pargs->H) continue; px -= 1; py -= 1; if (ann->bright_pastel) { float r,g,b; color_for_radec(bs->ra, bs->dec, &r,&g,&b); plotstuff_set_rgba2(pargs, r,g,b, 0.8); plotstuff_builtin_apply(cairo, pargs); } plotstuff_stack_marker(pargs, px, py); if (ann->bright_labels) { label = (strlen(bs->common_name) ? bs->common_name : bs->name); plotstuff_stack_text(pargs, cairo, label, px, py); } } } int plot_annotations_set_hd_catalog(plotann_t* ann, const char* hdfn) { if (ann->hd_catalog) free(ann->hd_catalog); ann->hd_catalog = strdup(hdfn); return 0; } static void plot_hd(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i, N; hd_catalog_t* hdcat = NULL; double ra,dec,rad; bl* hdlist = NULL; if (!ann->hd_catalog) return; hdcat = henry_draper_open(ann->hd_catalog); if (!hdcat) { ERROR("Failed to open Henry Draper catalog file \"%s\"", ann->hd_catalog); return; } if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &rad)) { ERROR("Failed to get RA,Dec,radius from plotstuff"); return; } hdlist = henry_draper_get(hdcat, ra, dec, deg2arcsec(rad)); logverb("Got %zu Henry Draper stars\n", bl_size(hdlist)); N = bl_size(hdlist); for (i=0; i<N; i++) { hd_entry_t* entry = bl_access(hdlist, i); double px, py; char label[16]; if (!plotstuff_radec2xy(pargs, entry->ra, entry->dec, &px, &py)) continue; px -= 1; py -= 1; if (px < 1 || py < 1 || px > pargs->W || py > pargs->H) continue; logverb("HD %i at RA,Dec (%g,%g) -> xy (%g, %g)\n", entry->hd, entry->ra, entry->dec, px, py); plotstuff_stack_marker(pargs, px, py); if (ann->HD_labels) { sprintf(label, "HD %i", entry->hd); plotstuff_stack_text(pargs, cairo, label, px, py); } } bl_free(hdlist); henry_draper_close(hdcat); } static void plot_ngc(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { double imscale; double imsize; int i, N; // arcsec/pixel imscale = plotstuff_pixel_scale(pargs); // arcmin imsize = imscale * MIN(pargs->W, pargs->H) / 60.0; N = ngc_num_entries(); logverb("Checking %i NGC/IC objects.\n", N); for (i=0; i<N; i++) { ngc_entry* ngc; char* names; double pixrad; double px, py; double r; ngc = ngc_get_entry_accurate(i); if (!ngc) break; if (ngc->size < imsize * ann->ngc_fraction) { // FIXME -- just plot an X-mark with label. debug("%s %i: size %g arcmin < limit of %g\n", (ngc->is_ngc ? "NGC":"IC"), ngc->id, ngc->size, imsize*ann->ngc_fraction); continue; } if (!plotstuff_radec2xy(pargs, ngc->ra, ngc->dec, &px, &py)) { debug("%s %i: RA,Dec (%.1f,%.1f) is >90 deg away.\n", (ngc->is_ngc ? "NGC":"IC"), ngc->id, ngc->ra, ngc->dec); continue; } px -= 1; py -= 1; pixrad = 0.5 * ngc->size * 60.0 / imscale; if (px < -pixrad || py < -pixrad || px > pargs->W + pixrad || py > pargs->H + pixrad) { debug("%s %i: RA,Dec (%.1f,%.1f), pix (%.1f,%.1f) is out-of-bounds\n", (ngc->is_ngc ? "NGC":"IC"), ngc->id, ngc->ra, ngc->dec, px, py); continue; } names = ngc_get_name_list(ngc, " / "); printf("%s\n", names); logverb("%s %i: RA,Dec (%.1f,%.1f), size %g arcmin, pix (%.1f,%.1f), radius %g\n", (ngc->is_ngc ? "NGC":"IC"), ngc->id, ngc->ra, ngc->dec, ngc->size, px, py, pixrad); debug("size: %f arcsec, pix radius: %f pixels\n", ngc->size, pixrad); // save old marker size... r = pargs->markersize; pargs->markersize = pixrad; plotstuff_stack_marker(pargs, px, py); plotstuff_stack_text(pargs, cairo, names, px, py); free(names); // revert old marker size... pargs->markersize = r; /* if (json) { char* namelist = sl_implode(names, "\", \""); sl_appendf(json, "{ \"type\" : \"ngc\", " " \"names\" : [ \"%s\" ], " " \"pixelx\" : %g, " " \"pixely\" : %g, " " \"radius\" : %g }" , namelist, px, py, pixsize/2.0); free(namelist); } */ } } void* plot_annotations_init(plot_args_t* args) { plotann_t* ann = calloc(1, sizeof(plotann_t)); ann->ngc_fraction = 0.02; ann->targets = bl_new(4, sizeof(target_t)); ann->NGC = TRUE; ann->bright = TRUE; ann->bright_labels = TRUE; ann->constellation_lines = TRUE; ann->constellation_lines_offset = 5.0; return ann; } int plot_annotations_plot(const char* cmd, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotann_t* ann = (plotann_t*)baton; // Set fonts, etc, before calling plotting routines plotstuff_builtin_apply(cairo, pargs); if (ann->NGC) plot_ngc(cairo, pargs, ann); if (ann->bright) plot_brightstars(cairo, pargs, ann); if (ann->HD) plot_hd(cairo, pargs, ann); if (ann->constellations) plot_constellations(cairo, pargs, ann); if (bl_size(ann->targets)) plot_targets(cairo, pargs, ann); return plotstuff_plot_stack(pargs, cairo); } int plot_annotations_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotann_t* ann = (plotann_t*)baton; if (streq(cmd, "annotations_no_ngc")) { ann->NGC = FALSE; } else if (streq(cmd, "annotations_no_bright")) { ann->bright = FALSE; } else if (streq(cmd, "annotations_ngc_size")) { ann->ngc_fraction = atof(cmdargs); } else if (streq(cmd, "annotations_target")) { sl* args = sl_split(NULL, cmdargs, " "); double ra, dec; char* name; if (sl_size(args) != 3) { ERROR("Need RA,Dec,name"); return -1; } ra = atof(sl_get(args, 0)); dec = atof(sl_get(args, 1)); name = sl_get(args, 2); plot_annotations_add_target(ann, ra, dec, name); } else if (streq(cmd, "annotations_targetname")) { const char* name = cmdargs; return plot_annotations_add_named_target(ann, name); } else { ERROR("Unknown command \"%s\"", cmd); return -1; } return 0; } int plot_annotations_add_named_target(plotann_t* ann, const char* name) { target_t tar; int i, N; // Try bright stars N = bright_stars_n(); for (i=0; i<N; i++) { const brightstar_t* bs = bright_stars_get(i); if (!bs->name && !bs->common_name) continue; if (strcaseeq(name, bs->name) || strcaseeq(name, bs->common_name)) { tar.ra = bs->ra; tar.dec = bs->dec; if (strcaseeq(name, bs->name)) tar.name = bs->name; else tar.name = bs->common_name; logmsg("Found %s: RA,Dec (%g,%g)\n", name, bs->ra, bs->dec); bl_append(ann->targets, &tar); return 0; } } // Try NGC objects ngc_entry* e = ngc_get_entry_named(name); if (!e) { ERROR("Failed to find target named \"%s\"", name); return -1; } tar.name = ngc_get_name_list(e, " / "); tar.ra = e->ra; tar.dec = e->dec; logmsg("Found %s: RA,Dec (%g,%g)\n", tar.name, tar.ra, tar.dec); bl_append(ann->targets, &tar); return 0; } void plot_annotations_add_target(plotann_t* ann, double ra, double dec, const char* name) { target_t tar; memset(&tar, 0, sizeof(target_t)); tar.ra = ra; tar.dec = dec; tar.name = strdup(name); logmsg("Added target \"%s\" at (%g,%g)\n", tar.name, tar.ra, tar.dec); bl_append(ann->targets, &tar); } void plot_annotations_free(plot_args_t* args, void* baton) { plotann_t* ann = (plotann_t*)baton; free(ann->hd_catalog); free(ann); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotcoadd.c���������������������������������������������������������������000644 �000765 �000024 �00000002313 12651445460 017772� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include "plotcoadd.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" const plotter_t plotter_coadd = { .name = "coadd", .init = plot_coadd_init, .command = plot_coadd_command, .doplot = plot_coadd_plot, .free = plot_coadd_free }; plotcoadd_t* plot_coadd_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "coadd"); } void* plot_coadd_init(plot_args_t* plotargs) { plotcoadd_t* args = calloc(1, sizeof(plotcoadd_t)); return args; } int plot_coadd_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotcoadd_t* args = (plotcoadd_t*)baton; return 0; } int plot_coadd_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotcoadd_t* args = (plotcoadd_t*)baton; if (streq(cmd, "coadd_file")) { //plot_image_set_filename(args, cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_coadd_free(plot_args_t* plotargs, void* baton) { plotcoadd_t* args = (plotcoadd_t*)baton; free(args); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotcoadd.h���������������������������������������������������������������000644 �000765 �000024 �00000001146 12651445460 020002� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTCOADD_H #define PLOTCOADD_H #include "astrometry/plotstuff.h" struct plotcoadd_args { }; typedef struct plotcoadd_args plotcoadd_t; plotcoadd_t* plot_coadd_get(plot_args_t* pargs); void* plot_coadd_init(plot_args_t* args); int plot_coadd_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_coadd_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_coadd_free(plot_args_t* args, void* baton); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotfill.c����������������������������������������������������������������000644 �000765 �000024 �00000001521 12651445460 017646� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include "plotfill.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" DEFINE_PLOTTER(fill); void* plot_fill_init(plot_args_t* plotargs) { plotfill_t* args = calloc(1, sizeof(plotfill_t)); return args; } int plot_fill_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotstuff_builtin_apply(cairo, pargs); cairo_paint(cairo); return 0; } int plot_fill_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { ERROR("Did not understand command \"%s\"", cmd); return -1; } void plot_fill_free(plot_args_t* plotargs, void* baton) { plotfill_t* args = (plotfill_t*)baton; free(args); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotgrid.c����������������������������������������������������������������000644 �000765 �000024 �00000022252 12651445460 017651� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "plotgrid.h" #include "sip-utils.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" DEFINE_PLOTTER(grid); plotgrid_t* plot_grid_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "grid"); } void* plot_grid_init(plot_args_t* plotargs) { plotgrid_t* args = calloc(1, sizeof(plotgrid_t)); args->dolabel = TRUE; args->raformat = strdup("%.2f"); args->decformat = strdup("%.2f"); return args; } int plot_grid_set_formats(plotgrid_t* args, const char* raformat, const char* decformat) { free(args->raformat); free(args->decformat); args->raformat = strdup_safe(raformat); args->decformat = strdup_safe(decformat); return 0; } static void pretty_label(const char* fmt, double x, char* buf) { int i; sprintf(buf, fmt, x); logverb("label: \"%s\"\n", buf); // Look for decimal point. if (!strchr(buf, '.')) { logverb("no decimal point\n"); return; } // Trim trailing zeroes (after the decimal point) i = strlen(buf)-1; while (buf[i] == '0') { buf[i] = '\0'; logverb("trimming trailing zero at %i: \"%s\"\n", i, buf); i--; assert(i > 0); } // Trim trailing decimal point, if it exists. i = strlen(buf)-1; if (buf[i] == '.') { buf[i] = '\0'; logverb("trimming trailing decimal point at %i: \"%s\"\n", i, buf); } } static int setdir(int dir, int* dirs, int* ndir) { switch (dir) { case DIRECTION_DEFAULT: case DIRECTION_POSNEG: dirs[0] = 1; dirs[1] = -1; *ndir = 2; break; case DIRECTION_POS: dirs[0] = 1; *ndir = 1; break; case DIRECTION_NEG: dirs[0] = -1; *ndir = 1; break; case DIRECTION_NEGPOS: dirs[0] = -1; dirs[1] = 1; *ndir = 2; break; default: return -1; } return 0; } int plot_grid_find_dec_label_location(plot_args_t* pargs, double dec, double cra, double ramin, double ramax, int dirn, double* pra) { double out; double in = cra; int i, N; anbool gotit; int dirs[2]; int j, Ndir=0; logverb("Labelling Dec=%g\n", dec); gotit = FALSE; if (setdir(dirn, dirs, &Ndir)) return -1; // dir is first 1, then -1. for (j=0; j<Ndir; j++) { int dir = dirs[j]; for (i=1;; i++) { // take 10-deg steps out = cra + i*dir*10.0; if (out > 370.0 || out <= -10) break; out = MIN(360, MAX(0, out)); logverb("ra in=%g, out=%g\n", in, out); if (!plotstuff_radec_is_inside_image(pargs, out, dec)) { gotit = TRUE; break; } if (!isfinite(in) || !isfinite(out)) break; } if (gotit) break; } if (!gotit) { ERROR("Couldn't find an RA outside the image for Dec=%g\n", dec); return -1; } i=0; N = 10; while (!plotstuff_radec_is_inside_image(pargs, in, dec)) { if (i == N) break; in = ramin + (double)i/(double)(N-1) * (ramax-ramin); i++; } if (!plotstuff_radec_is_inside_image(pargs, in, dec)) return -1; while (fabs(out - in) > 1e-6) { // hahaha double half; anbool isin; half = (out + in) / 2.0; isin = plotstuff_radec_is_inside_image(pargs, half, dec); if (isin) in = half; else out = half; } *pra = in; return 0; } int plot_grid_find_ra_label_location(plot_args_t* pargs, double ra, double cdec, double decmin, double decmax, int dirn, double* pdec) { double out; double in = cdec; int i, N; anbool gotit; int dirs[2]; int j, Ndir=0; logverb("Labelling RA=%g\n", ra); // where does this line leave the image? // cdec is inside; take steps away until we go outside. gotit = FALSE; if (setdir(dirn, dirs, &Ndir)) return -1; for (j=0; j<Ndir; j++) { int dir = dirs[j]; logverb("direction: %i\n", dir); for (i=1;; i++) { // take 10-deg steps out = cdec + i*dir*10.0; logverb("trying Dec = %g\n", out); if (out >= 100.0 || out <= -100) break; out = MIN(90, MAX(-90, out)); logverb("dec in=%g, out=%g\n", in, out); if (!plotstuff_radec_is_inside_image(pargs, ra, out)) { logverb("-> good!\n"); gotit = TRUE; break; } } if (gotit) break; } if (!gotit) { ERROR("Couldn't find a Dec outside the image for RA=%g\n", ra); return -1; } // Now we've got a Dec inside the image (cdec) // and a Dec outside the image (out) // Now find the boundary. i=0; N = 10; while (!plotstuff_radec_is_inside_image(pargs, ra, in)) { if (i == N) break; in = decmin + (double)i/(double)(N-1) * (decmax-decmin); i++; } if (!plotstuff_radec_is_inside_image(pargs, ra, in)) return -1; while (fabs(out - in) > 1e-6) { // hahaha double half; anbool isin; half = (out + in) / 2.0; isin = plotstuff_radec_is_inside_image(pargs, ra, half); if (isin) in = half; else out = half; } *pdec = in; return 0; } static int do_radec_labels(plot_args_t* pargs, plotgrid_t* args, double ramin, double ramax, double decmin, double decmax) { double cra, cdec; double ra, dec; args->dolabel = (args->ralabelstep > 0) || (args->declabelstep > 0); if (!args->dolabel) return 0; /* if (args->ralabelstep == 0 || args->declabelstep == 0) { // FIXME -- choose defaults ERROR("Need grid_ralabelstep, grid_declabelstep"); return 0; } */ logmsg("Adding grid labels...\n"); plotstuff_get_radec_center_and_radius(pargs, &cra, &cdec, NULL); assert(cra >= ramin && cra <= ramax); assert(cdec >= decmin && cdec <= decmax); if (args->ralabelstep > 0) { double rlo, rhi; if (args->ralo != 0 || args->rahi != 0) { rlo = args->ralo; rhi = args->rahi; } else { rlo = args->ralabelstep * floor(ramin / args->ralabelstep); rhi = args->ralabelstep * ceil(ramax / args->ralabelstep); } for (ra = rlo; ra <= rhi; ra += args->ralabelstep) { double lra; if (plot_grid_find_ra_label_location(pargs, ra, cdec, decmin, decmax, args->ralabeldir, &dec)) continue; lra = ra; if (lra < 0) lra += 360; if (lra >= 360) lra -= 360; //logmsg("Label \"%s\" at (%g,%g)\n", label, ra, dec); plot_grid_add_label(pargs, ra, dec, lra, args->raformat); } } if (args->declabelstep > 0) { double dlo, dhi; if (args->declo != 0 || args->dechi != 0) { dlo = args->declo; dhi = args->dechi; } else { dlo = args->declabelstep * floor(decmin / args->declabelstep); dhi = args->declabelstep * ceil(decmax / args->declabelstep); } for (dec = dlo; dec <= dhi; dec += args->declabelstep) { if (plot_grid_find_dec_label_location(pargs, dec, cra, ramin, ramax, args->declabeldir, &ra)) continue; //logmsg("Label Dec=\"%s\" at (%g,%g)\n", label, ra, dec); plot_grid_add_label(pargs, ra, dec, dec, args->decformat); } } return 1; } void plot_grid_add_label(plot_args_t* pargs, double ra, double dec, double lval, const char* format) { char label[32]; double x,y; #if 0 anbool ok; #endif cairo_t* cairo = pargs->cairo; pretty_label(format, lval, label); #if 0 ok = plotstuff_radec2xy(pargs, ra, dec, &x, &y); #else (void)plotstuff_radec2xy(pargs, ra, dec, &x, &y); #endif plotstuff_stack_text(pargs, cairo, label, x, y); plotstuff_plot_stack(pargs, cairo); } int plot_grid_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotgrid_t* args = (plotgrid_t*)baton; double ramin,ramax,decmin,decmax; double ra,dec; if (!pargs->wcs) { ERROR("No WCS was set -- can't plot grid lines"); return -1; } // Find image bounds in RA,Dec... plotstuff_get_radec_bounds(pargs, 50, &ramin, &ramax, &decmin, &decmax); /* if (args->rastep == 0 || args->decstep == 0) { // FIXME -- choose defaults ERROR("Need grid_rastep, grid_decstep"); return -1; } */ plotstuff_builtin_apply(cairo, pargs); pargs->label_offset_x = 0; pargs->label_offset_y = 10; logverb("Image bounds: RA %g, %g, Dec %g, %g\n", ramin, ramax, decmin, decmax); if (args->rastep > 0) { for (ra = args->rastep * floor(ramin / args->rastep); ra <= args->rastep * ceil(ramax / args->rastep); ra += args->rastep) { plotstuff_line_constant_ra(pargs, ra, decmin, decmax, TRUE); cairo_stroke(pargs->cairo); } } if (args->decstep > 0) { for (dec = args->decstep * floor(decmin / args->decstep); dec <= args->decstep * ceil(decmax / args->decstep); dec += args->decstep) { plotstuff_line_constant_dec(pargs, dec, ramin, ramax); cairo_stroke(pargs->cairo); } } if (do_radec_labels(pargs, args, ramin, ramax, decmin, decmax)) { plotstuff_plot_stack(pargs, cairo); } return 0; } int plot_grid_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotgrid_t* args = (plotgrid_t*)baton; if (streq(cmd, "grid_rastep")) { args->rastep = atof(cmdargs); } else if (streq(cmd, "grid_decstep")) { args->decstep = atof(cmdargs); } else if (streq(cmd, "grid_ralabelstep")) { args->ralabelstep = atof(cmdargs); } else if (streq(cmd, "grid_declabelstep")) { args->declabelstep = atof(cmdargs); } else if (streq(cmd, "grid_step")) { args->declabelstep = args->ralabelstep = args->rastep = args->decstep = atof(cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_grid_free(plot_args_t* plotargs, void* baton) { plotgrid_t* args = (plotgrid_t*)baton; free(args->raformat); free(args->decformat); free(args); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plothealpix.c�������������������������������������������������������������000644 �000765 �000024 �00000007155 12651445460 020363� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include "os-features.h" #include "plothealpix.h" #include "sip-utils.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "healpix-utils.h" #include "healpix.h" DEFINE_PLOTTER(healpix); plothealpix_t* plot_healpix_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "healpix"); } void* plot_healpix_init(plot_args_t* plotargs) { plothealpix_t* args = calloc(1, sizeof(plothealpix_t)); args->nside = 1; args->stepsize = 50; return args; } int plot_healpix_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plothealpix_t* args = (plothealpix_t*)baton; double ra,dec,rad; il* hps; int i; double hpstep; int minx[12], maxx[12], miny[12], maxy[12]; plotstuff_builtin_apply(cairo, pargs); if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &rad)) { ERROR("Failed to get RA,Dec center and radius"); return -1; } hps = healpix_rangesearch_radec(ra, dec, rad, args->nside, NULL); logmsg("Found %zu healpixes in range.\n", il_size(hps)); hpstep = args->nside * args->stepsize * plotstuff_pixel_scale(pargs) / 60.0 / healpix_side_length_arcmin(args->nside); hpstep = MIN(1, hpstep); logmsg("Taking steps of %g in healpix space\n", hpstep); // For each of the 12 top-level healpixes, find the range of healpixes covered by this image. for (i=0; i<12; i++) { maxx[i] = maxy[i] = -1; minx[i] = miny[i] = args->nside+1; } for (i=0; i<il_size(hps); i++) { int hp = il_get(hps, i); int hpx, hpy; int bighp; healpix_decompose_xy(hp, &bighp, &hpx, &hpy, args->nside); logverb(" hp %i: bighp %i, x,y (%i,%i)\n", i, bighp, hpx, hpy); minx[bighp] = MIN(minx[bighp], hpx); maxx[bighp] = MAX(maxx[bighp], hpx); miny[bighp] = MIN(miny[bighp], hpy); maxy[bighp] = MAX(maxy[bighp], hpy); } il_free(hps); for (i=0; i<12; i++) { int hx,hy; int hp; double d, frac; double x,y; if (maxx[i] == -1) continue; logverb("Big healpix %i: x range [%i, %i], y range [%i, %i]\n", i, minx[i], maxx[i], miny[i], maxy[i]); for (hy = miny[i]; hy <= maxy[i]; hy++) { logverb(" y=%i\n", hy); for (d=minx[i]; d<=maxx[i]; d+=hpstep) { hx = floor(d); frac = d - hx; hp = healpix_compose_xy(i, hx, hy, args->nside); healpix_to_radecdeg(hp, args->nside, frac, 0.0, &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (d == minx[i]) cairo_move_to(pargs->cairo, x, y); else cairo_line_to(pargs->cairo, x, y); } cairo_stroke(pargs->cairo); } for (hx = minx[i]; hx <= maxx[i]; hx++) { for (d=miny[i]; d<=maxy[i]; d+=hpstep) { hy = floor(d); frac = d - hy; hp = healpix_compose_xy(i, hx, hy, args->nside); healpix_to_radecdeg(hp, args->nside, 0.0, frac, &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (d == miny[i]) cairo_move_to(pargs->cairo, x, y); else cairo_line_to(pargs->cairo, x, y); } cairo_stroke(pargs->cairo); } } return 0; } int plot_healpix_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plothealpix_t* args = (plothealpix_t*)baton; if (streq(cmd, "healpix_nside")) { args->nside = atoi(cmdargs); } else if (streq(cmd, "healpix_stepsize")) { args->stepsize = atoi(cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_healpix_free(plot_args_t* plotargs, void* baton) { plothealpix_t* args = (plothealpix_t*)baton; free(args); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotimage.c���������������������������������������������������������������000644 �000765 �000024 �00000044206 12651445460 020011� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "plotimage.h" #include "cairoutils.h" #include "ioutils.h" #include "sip_qfits.h" #include "log.h" #include "errors.h" #include "anwcs.h" #include "permutedsort.h" #include "wcs-resample.h" #include "mathutil.h" #include "anqfits.h" DEFINE_PLOTTER(image); static void set_format(plotimage_t* args) { if (args->format == 0) { assert(args->fn); args->format = guess_image_format_from_filename(args->fn); logverb("Guessing format of image from filename: \"%s\" -> %s\n", args->fn, image_format_name_from_code(args->format)); } } plotimage_t* plot_image_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "image"); } void* plot_image_init(plot_args_t* plotargs) { plotimage_t* args = calloc(1, sizeof(plotimage_t)); args->gridsize = 50; args->alpha = 1; args->image_null = 1.0 / 0.0; //args->scalex = args->scaley = 1.0; args->rgbscale[0] = 1.0; args->rgbscale[1] = 1.0; args->rgbscale[2] = 1.0; return args; } void plot_image_add_to_pixels(plotimage_t* args, int rgb[3]) { int i, j, N; assert(args->img); N = args->W * args->H; for (i=0; i<N; i++) for (j=0; j<3; j++) args->img[i*4+j] = (unsigned char)MIN(255, MAX(0, ((int)args->img[i*4+j]) + rgb[j])); } int plot_image_get_percentile(plot_args_t* pargs, plotimage_t* args, double percentile, unsigned char* rgb) { int j; int N; int I; if (percentile < 0.0 || percentile > 1.0) { ERROR("percentile must be between 0 and 1 (ok, so it's badly named, sue me)"); return -1; } if (!args->img) { if (plot_image_read(pargs, args)) { ERROR("Failed to read image file: can't get percentile!\n"); return -1; } } N = args->W * args->H; I = MAX(0, MIN(N-1, floor(N * percentile))); for (j=0; j<3; j++) { int* P; P = permuted_sort(args->img + j, 4, compare_uchars_asc, NULL, N); rgb[j] = args->img[4 * P[I] + j]; free(P); } return 0; } static void plot_rgba_data(cairo_t* cairo, unsigned char* img, int W, int H, double alpha) { cairo_surface_t* thissurf; cairo_pattern_t* pat; cairoutils_rgba_to_argb32(img, W, H); thissurf = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); pat = cairo_pattern_create_for_surface(thissurf); cairo_save(cairo); cairo_set_source(cairo, pat); //cairo_scale(cairo, scalex, scaley); if (alpha == 1.0) cairo_paint(cairo); else cairo_paint_with_alpha(cairo, alpha); cairo_pattern_destroy(pat); cairo_surface_destroy(thissurf); cairo_restore(cairo); } void plot_image_rgba_data(cairo_t* cairo, plotimage_t* args) { plot_rgba_data(cairo, args->img, args->W, args->H, args->alpha); } void plot_image_wcs(cairo_t* cairo, unsigned char* img, int W, int H, plot_args_t* pargs, plotimage_t* args) { cairo_surface_t* thissurf; cairo_pattern_t* pat; cairo_matrix_t mat; int i,j; double *xs, *ys; int NX, NY; double x,y; if (args->resample) { assert(args->img); // FITS images get resampled right after reading (in read_fits_image). // Others... if (args->format == PLOTSTUFF_FORMAT_FITS) { plot_image_rgba_data(cairo, args); } else { // resample onto the output grid... unsigned char* img2 = NULL; //int Nin = args->W * args->H; int Nout = pargs->W * pargs->H; img2 = calloc(Nout * 4, 1); if (resample_wcs_rgba(args->wcs, args->img, args->W, args->H, pargs->wcs, img2, pargs->W, pargs->H)) { ERROR("Failed to resample image"); return; } plot_rgba_data(cairo, img2, pargs->W, pargs->H, args->alpha); free(img2); } return; } cairoutils_rgba_to_argb32(img, W, H); thissurf = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); cairoutils_surface_status_errors(thissurf); cairoutils_cairo_status_errors(cairo); // Are we double-applying alpha? if (args->alpha != 1.0) { unsigned char a = MIN(255, MAX(0, args->alpha * 255)); for (i=0; i<(W*H); i++) img[i*4+3] = a; cairoutils_premultiply_alpha_rgba(img, W, H); } pat = cairo_pattern_create_for_surface(thissurf); cairoutils_cairo_status_errors(cairo); assert(args->gridsize >= 1); NX = 1 + ceil(W / args->gridsize); NY = 1 + ceil(H / args->gridsize); xs = malloc(NX*NY * sizeof(double)); ys = malloc(NX*NY * sizeof(double)); // FIXME -- NEAREST is good when we're zooming in on individual pixels; // some smoothing is necessary if we're zoomed out. Should probably // resample image in this case, since I doubt cairo is very smart in this case. cairo_pattern_set_filter(pat, CAIRO_FILTER_GOOD); //CAIRO_FILTER_NEAREST); for (j=0; j<NY; j++) { double ra,dec; y = MIN(j * args->gridsize, H-1); for (i=0; i<NX; i++) { double ox,oy; #if 0 anbool ok; #endif x = MIN(i * args->gridsize, W-1); anwcs_pixelxy2radec(args->wcs, x+1, y+1, &ra, &dec); #if 0 ok = plotstuff_radec2xy(pargs, ra, dec, &ox, &oy); #else (void)plotstuff_radec2xy(pargs, ra, dec, &ox, &oy); #endif xs[j*NX+i] = ox-1; ys[j*NX+i] = oy-1; debug("image (%.1f,%.1f) -> radec (%.4f,%.4f), plot (%.1f,%.1f)\n", x, y, ra, dec, xs[j*NX+i], ys[j*NX+i]); } } cairo_save(cairo); cairo_set_source(cairo, pat); //cairo_set_source_rgb(cairo, 1,0,0); for (j=0; j<(NY-1); j++) { for (i=0; i<(NX-1); i++) { int aa = j*NX + i; int ab = aa + 1; int ba = aa + NX; int bb = aa + NX + 1; double midx = (xs[aa] + xs[ab] + xs[bb] + xs[ba])*0.25; double midy = (ys[aa] + ys[ab] + ys[bb] + ys[ba])*0.25; cairo_status_t st; double xlo,xhi,ylo,yhi; ylo = MIN(j * args->gridsize, H-1); yhi = MIN((j+1) * args->gridsize, H-1); xlo = MIN(i * args->gridsize, W-1); xhi = MIN((i+1) * args->gridsize, W-1); if (xlo == xhi || ylo == yhi) continue; cairo_move_to(cairo, 0.5 + xs[aa]+0.5*(xs[aa] >= midx ? 1 : -1), 0.5 + ys[aa]+0.5*(ys[aa] >= midy ? 1 : -1)); cairo_line_to(cairo, 0.5 + xs[ab]+0.5*(xs[ab] >= midx ? 1 : -1), 0.5 + ys[ab]+0.5*(ys[ab] >= midy ? 1 : -1)); cairo_line_to(cairo, 0.5 + xs[bb]+0.5*(xs[bb] >= midx ? 1 : -1), 0.5 + ys[bb]+0.5*(ys[bb] >= midy ? 1 : -1)); cairo_line_to(cairo, 0.5 + xs[ba]+0.5*(xs[ba] >= midx ? 1 : -1), 0.5 + ys[ba]+0.5*(ys[ba] >= midy ? 1 : -1)); cairo_close_path(cairo); cairo_matrix_init(&mat, (xs[ab]-xs[aa])/(xhi-xlo), (ys[ab]-ys[aa])/(yhi-ylo), (xs[ba]-xs[aa])/(xhi-xlo), (ys[ba]-ys[aa])/(yhi-ylo), xs[0], ys[0]); st = cairo_matrix_invert(&mat); if (st != CAIRO_STATUS_SUCCESS) { ERROR("Cairo: %s", cairo_status_to_string(st)); ERROR("Matrix: AB %g, %g, BA %g, %g, AA %g, %g\n" " xlo,xhi %g, %g ylo,yhi %g, %g", xs[ab], ys[ab], xs[ba], ys[ba], xs[aa], ys[aa], xlo, xhi, ylo, yhi); // Matrix: AB 270.892, 121.737, BA 274.958, 129.407, AA 274.958, 129.407 // xlo,xhi 0, 50 ylo,yhi 2050, 2050 continue; } cairo_pattern_set_matrix(pat, &mat); cairo_fill(cairo); } } /* Grid: cairo_set_source_rgb(cairo, 1,0,0); for (j=0; j<(NY-1); j++) { for (i=0; i<(NX-1); i++) { int aa = j*NX + i; int ab = aa + 1; int ba = aa + NX; int bb = aa + NX + 1; cairo_move_to(cairo, xs[aa], ys[aa]); cairo_line_to(cairo, xs[ab], ys[ab]); cairo_line_to(cairo, xs[bb], ys[bb]); cairo_line_to(cairo, xs[ba], ys[ba]); cairo_close_path(cairo); cairo_stroke(cairo); } } { int aa = 0; int ab = 1; int ba = NX; int bb = NX + 1; cairo_set_source_rgb(cairo, 0,1,0); cairo_move_to(cairo, xs[aa], ys[aa]); cairo_line_to(cairo, xs[ab], ys[ab]); cairo_line_to(cairo, xs[bb], ys[bb]); cairo_line_to(cairo, xs[ba], ys[ba]); cairo_close_path(cairo); cairo_move_to(cairo, 0, 0); cairo_line_to(cairo, 0, args->gridsize); cairo_line_to(cairo, args->gridsize, args->gridsize); cairo_line_to(cairo, args->gridsize, 0); cairo_close_path(cairo); cairo_stroke(cairo); } */ free(xs); free(ys); cairo_pattern_destroy(pat); cairo_surface_destroy(thissurf); cairo_restore(cairo); } static unsigned char* read_fits_image(const plot_args_t* pargs, plotimage_t* args) { float* fimg; anqfits_t* anq; unsigned char* img; float* rimg = NULL; float* dimg = NULL; anq = anqfits_open(args->fn); if (!anq) { ERROR("Failed to read input file: \"%s\"", args->fn); return NULL; } fimg = anqfits_readpix(anq, args->fitsext, 0,0,0,0, args->fitsplane, PTYPE_FLOAT, NULL, &args->W, &args->H); anqfits_close(anq); if (!fimg) { ERROR("Failed to load pixels."); return NULL; } if (args->downsample) { int nw, nh; dimg = average_image_f(fimg, args->W, args->H, args->downsample, EDGE_AVERAGE, &nw, &nh, NULL); args->W = nw; args->H = nh; fimg = dimg; anwcs_scale_wcs(args->wcs, 1.0/(float)args->downsample); } if (args->resample) { // resample onto the output grid... //rimg = calloc(pargs->W * pargs->H, sizeof(float)); rimg = malloc(pargs->W * pargs->H * sizeof(float)); int i; for (i=0; i<(pargs->W * pargs->H); i++) { rimg[i] = args->image_null; } if (resample_wcs(args->wcs, fimg, args->W, args->H, pargs->wcs, rimg, pargs->W, pargs->H, 0, 0)) { ERROR("Failed to resample image"); return NULL; } { // DEBUG double plo = HUGE_VAL; double phi = -HUGE_VAL; int i; for (i=0; i<(pargs->W * pargs->H); i++) { plo = MIN(plo, rimg[i]); phi = MAX(phi, rimg[i]); } logverb("Resampled pixel value range: %g, %g\n", plo, phi); } // ? args->W = pargs->W; args->H = pargs->H; fimg = rimg; } img = plot_image_scale_float(args, fimg); free(fimg); free(rimg); free(dimg); return img; } unsigned char* plot_image_scale_float(plotimage_t* args, const float* fimg) { float offset, scale; int i,j; unsigned char* img = NULL; if (args->image_low == 0 && args->image_high == 0) { if (args->auto_scale) { // min/max, or percentiles? /* double mn = HUGE_VAL; double mx = -HUGE_VAL; for (i=0; i<(args->W*args->H); i++) { mn = MIN(mn, fimg[i]); mx = MAX(mx, fimg[i]); } */ int N = args->W * args->H; int* perm = permutation_init(NULL, N); int i; int Nreal = 0; for (i=0; i<N; i++) { if (isfinite(fimg[i])) { perm[Nreal] = perm[i]; Nreal++; } } permuted_sort(fimg, sizeof(float), compare_floats_asc, perm, Nreal); double mn = fimg[perm[(int)(Nreal * 0.1)]]; double mx = fimg[perm[(int)(Nreal * 0.98)]]; logmsg("Image auto-scaling: range %g, %g; percentiles %g, %g\n", fimg[perm[0]], fimg[perm[N-1]], mn, mx); free(perm); offset = mn; scale = (255.0 / (mx - mn)); logmsg("Image range %g, %g --> offset %g, scale %g\n", mn, mx, offset, scale); } else { offset = 0.0; scale = 1.0; } } else { offset = args->image_low; scale = 255.0 / (args->image_high - args->image_low); logmsg("Image range %g, %g --> offset %g, scale %g\n", args->image_low, args->image_high, offset, scale); } img = malloc(args->W * args->H * 4); for (j=0; j<args->H; j++) { for (i=0; i<args->W; i++) { int k; double v; double pval = fimg[j*args->W + i]; k = 4*(j*args->W + i); if ((args->image_null == pval) || (isnan(args->image_null) && isnan(pval)) || ((args->image_valid_low != 0.0) && (pval < args->image_valid_low)) || ((args->image_valid_high != 0.0) && (pval > args->image_valid_high))) { img[k+0] = 0; img[k+1] = 0; img[k+2] = 0; img[k+3] = 0; if ((pval == args->image_null) || (isnan(args->image_null) && isnan(pval))) { args->n_invalid_null++; } if (pval < args->image_valid_low) { args->n_invalid_low++; } if (pval > args->image_valid_high) { args->n_invalid_high++; } } else { v = (pval - offset) * scale; if (args->arcsinh != 0) { v = (255. / args->arcsinh) * asinh((v / 255.) * args->arcsinh); v /= (asinh(args->arcsinh) / args->arcsinh); } img[k+0] = MIN(255, MAX(0, v * args->rgbscale[0])); img[k+1] = MIN(255, MAX(0, v * args->rgbscale[1])); img[k+2] = MIN(255, MAX(0, v * args->rgbscale[2])); img[k+3] = 255; } } } return img; } void plot_image_make_color_transparent(plotimage_t* args, unsigned char r, unsigned char g, unsigned char b) { int i; assert(args->img); for (i=0; i<(args->W * args->H); i++) { if ((args->img[4*i + 0] == r) && (args->img[4*i + 1] == g) && (args->img[4*i + 2] == b)) { args->img[4*i + 3] = 0; } } } int plot_image_read(const plot_args_t* pargs, plotimage_t* args) { set_format(args); switch (args->format) { case PLOTSTUFF_FORMAT_JPG: args->img = cairoutils_read_jpeg(args->fn, &(args->W), &(args->H)); break; case PLOTSTUFF_FORMAT_PNG: args->img = cairoutils_read_png(args->fn, &(args->W), &(args->H)); break; case PLOTSTUFF_FORMAT_PPM: args->img = cairoutils_read_ppm(args->fn, &(args->W), &(args->H)); break; case PLOTSTUFF_FORMAT_FITS: assert(pargs); args->img = read_fits_image(pargs, args); break; case PLOTSTUFF_FORMAT_PDF: ERROR("PDF format not supported"); return -1; default: ERROR("You must set the image format with \"image_format <png|jpg|ppm>\""); return -1; } return 0; } int plot_image_set_filename(plotimage_t* args, const char* fn) { free(args->fn); args->fn = strdup_safe(fn); // ?? free(args->img); args->img = NULL; return 0; } int plot_image_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotimage_t* args = (plotimage_t*)baton; // Plot it! if (!args->img) { if (plot_image_read(pargs, args)) { return -1; } } plotstuff_builtin_apply(cairo, pargs); if (pargs->wcs && args->wcs) { double ralo1, declo1, rahi1, dechi1; double ralo2, declo2, rahi2, dechi2; anwcs_get_radec_bounds(pargs->wcs, args->gridsize, &ralo1, &rahi1, &declo1, &dechi1); anwcs_get_radec_bounds(args->wcs, args->gridsize, &ralo2, &rahi2, &declo2, &dechi2); logverb("Plot WCS range: RA [%g,%g], Dec [%g, %g]\n", ralo1, rahi1, declo1, dechi1); logverb("Image WCS range: RA [%g,%g], Dec [%g, %g]\n", ralo2, rahi2, declo2, dechi2); if (declo1 > dechi2 || declo2 > dechi1) { logverb("No overlap in Dec ranges\n"); return 0; } // FIXME -- this has not been tested for wrap-around // edge cases. if (ralo1 > fmod(rahi1, 360.) || ralo2 > fmod(rahi2, 360.)) { logverb("No overlap in RA ranges\n"); return 0; } plot_image_wcs(cairo, args->img, args->W, args->H, pargs, args); } else { plot_image_rgba_data(cairo, args); } // ? free(args->img); args->img = NULL; return 0; } static int read_fits_size(plotimage_t* args, int* W, int* H) { anqfits_t* anq; const anqfits_image_t* img; anq = anqfits_open(args->fn); if (!anq) { ERROR("Failed to read input file: \"%s\"", args->fn); return -1; } img = anqfits_get_image_const(anq, args->fitsext); if (!img) { ERROR("Failed to read image extension %i from file \"%s\"\n", args->fitsext, args->fn); anqfits_close(anq); return -1; } if (W) *W = img->width; if (H) *H = img->height; if (args->fitsplane >= img->planes) { ERROR("Requested FITS image plane %i, but only %i available\n", args->fitsplane, (int)img->planes); anqfits_close(anq); return -1; } anqfits_close(anq); return 0; } int plot_image_getsize(plotimage_t* args, int* W, int* H) { set_format(args); if (args->format == PLOTSTUFF_FORMAT_FITS) return read_fits_size(args, W, H); if (!args->img) { // HACK -- only FITS format needs pargs. if (plot_image_read(NULL, args)) { return -1; } } if (W) *W = args->W; if (H) *H = args->H; return 0; } int plot_image_setsize(plot_args_t* pargs, plotimage_t* args) { if (!args->img) { if (plot_image_read(pargs, args)) { return -1; } } plotstuff_set_size(pargs, args->W, args->H); //plotstuff_set_size(pargs, args->W * args->scalex, args->H * args->scaley); return 0; } int plot_image_set_wcs(plotimage_t* args, const char* filename, int ext) { if (args->wcs) anwcs_free(args->wcs); if (streq(filename, "none")) { args->wcs = NULL; } else { args->wcs = anwcs_open(filename, ext); if (!args->wcs) { ERROR("Failed to read WCS file \"%s\"", filename); return -1; } if (log_get_level() >= LOG_VERB) { logverb("Set image WCS to:"); anwcs_print(args->wcs, stdout); } } return 0; } int plot_image_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotimage_t* args = (plotimage_t*)baton; if (streq(cmd, "image_file")) { plot_image_set_filename(args, cmdargs); } else if (streq(cmd, "image_alpha")) { args->alpha = atof(cmdargs); } else if (streq(cmd, "image_format")) { args->format = parse_image_format(cmdargs); if (args->format == -1) return -1; } else if (streq(cmd, "image_setsize")) { if (plot_image_setsize(pargs, args)) return -1; } else if (streq(cmd, "image_wcslib")) { // force reading WCS using WCSLIB. if (args->wcs) anwcs_free(args->wcs); args->wcs = anwcs_open_wcslib(cmdargs, 0); if (!args->wcs) { ERROR("Failed to read WCS file \"%s\"", cmdargs); return -1; } if (log_get_level() >= LOG_VERB) { logverb("Set image WCS to:"); anwcs_print(args->wcs, stdout); } } else if (streq(cmd, "image_wcs")) { return plot_image_set_wcs(args, cmdargs, args->fitsext); } else if (streq(cmd, "image_ext")) { args->fitsext = atoi(cmdargs); } else if (streq(cmd, "image_grid")) { args->gridsize = atof(cmdargs); } else if (streq(cmd, "image_low")) { args->image_low = atof(cmdargs); logmsg("set image_low %g\n", args->image_low); } else if (streq(cmd, "image_null")) { args->image_null = atof(cmdargs); } else if (streq(cmd, "image_high")) { args->image_high = atof(cmdargs); logmsg("set image_high %g\n", args->image_high); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_image_free(plot_args_t* plotargs, void* baton) { plotimage_t* args = (plotimage_t*)baton; if (args->wcs) anwcs_free(args->wcs); free(args->fn); free(args); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotindex.c���������������������������������������������������������������000644 �000765 �000024 �00000014525 12651445460 020037� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include <assert.h> #include "plotindex.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "starutil.h" #include "index.h" #include "qidxfile.h" #include "permutedsort.h" DEFINE_PLOTTER(index); plotindex_t* plot_index_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "index"); } void* plot_index_init(plot_args_t* plotargs) { plotindex_t* args = calloc(1, sizeof(plotindex_t)); args->indexes = pl_new(16); args->qidxes = pl_new(16); args->stars = TRUE; args->quads = TRUE; args->fill = FALSE; return args; } static void pad_qidxes(plotindex_t* args) { while ((pl_size(args->qidxes)) < pl_size(args->indexes)) pl_append(args->qidxes, NULL); } void plot_quad_xy(cairo_t* cairo, double* quadxy, int dimquads) { int k; double cx, cy; double theta[DQMAX]; int* perm; cx = cy = 0.0; for (k=0; k<dimquads; k++) { cx += quadxy[2*k+0]; cy += quadxy[2*k+1]; } cx /= dimquads; cy /= dimquads; for (k=0; k<dimquads; k++) theta[k] = atan2(quadxy[2*k+1] - cy, quadxy[2*k+0] - cx); perm = permuted_sort(theta, sizeof(double), compare_doubles_asc, NULL, dimquads); for (k=0; k<dimquads; k++) { double px,py; px = quadxy[2 * perm[k] + 0]; py = quadxy[2 * perm[k] + 1]; if (k == 0) { cairo_move_to(cairo, px, py); } else { cairo_line_to(cairo, px, py); } } free(perm); cairo_close_path(cairo); } static void plotquad(cairo_t* cairo, plot_args_t* pargs, plotindex_t* args, index_t* index, int quadnum, int DQ) { int k; unsigned int stars[DQMAX]; double ra, dec; double px, py; double xy[DQMAX*2]; int N; quadfile_get_stars(index->quads, quadnum, stars); N = 0; for (k=0; k<DQ; k++) { if (startree_get_radec(index->starkd, stars[k], &ra, &dec)) { ERROR("Failed to get RA,Dec for star %i\n", stars[k]); continue; } if (!plotstuff_radec2xy(pargs, ra, dec, &px, &py)) { ERROR("Failed to convert RA,Dec %g,%g to pixels for quad %i\n", ra, dec, quadnum); continue; } xy[2*k + 0] = px; xy[2*k + 1] = py; N++; } if (N < 3) return; plot_quad_xy(cairo, xy, N); if (args->fill) cairo_fill(cairo); else cairo_stroke(cairo); } void plot_index_plotquad(cairo_t* cairo, plot_args_t* pargs, plotindex_t* args, index_t* index, int quadnum, int DQ) { plotquad(cairo, pargs, args, index, quadnum, DQ); } int plot_index_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotindex_t* args = (plotindex_t*)baton; int i; double ra, dec, radius; double xyz[3]; double r2; pad_qidxes(args); plotstuff_builtin_apply(cairo, pargs); if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &radius)) { ERROR("Failed to get RA,Dec center and radius"); return -1; } radecdeg2xyzarr(ra, dec, xyz); r2 = deg2distsq(radius); logmsg("Field RA,Dec,radius = (%g,%g), %g deg\n", ra, dec, radius); logmsg("distsq: %g\n", r2); for (i=0; i<pl_size(args->indexes); i++) { index_t* index = pl_get(args->indexes, i); int j, N; int DQ; double px,py; if (args->stars) { // plot stars double* radecs = NULL; startree_search_for(index->starkd, xyz, r2, NULL, &radecs, NULL, &N); if (N) { assert(radecs); } logmsg("Found %i stars in range in index %s\n", N, index->indexname); for (j=0; j<N; j++) { logverb(" RA,Dec (%g,%g) -> x,y (%g,%g)\n", radecs[2*j], radecs[2*j+1], px, py); if (!plotstuff_radec2xy(pargs, radecs[j*2], radecs[j*2+1], &px, &py)) { ERROR("Failed to convert RA,Dec %g,%g to pixels\n", radecs[j*2], radecs[j*2+1]); continue; } cairoutils_draw_marker(cairo, pargs->marker, px, py, pargs->markersize); cairo_stroke(cairo); } free(radecs); } if (args->quads) { DQ = index_get_quad_dim(index); qidxfile* qidx = pl_get(args->qidxes, i); if (qidx) { int* stars; int Nstars; il* quadlist = il_new(256); // find stars in range. startree_search_for(index->starkd, xyz, r2, NULL, NULL, &stars, &Nstars); logmsg("Found %i stars in range of index %s\n", N, index->indexname); logmsg("Using qidx file.\n"); // find quads that each star is a member of. for (j=0; j<Nstars; j++) { uint32_t* quads; int Nquads; int k; if (qidxfile_get_quads(qidx, stars[j], &quads, &Nquads)) { ERROR("Failed to get quads for star %i\n", stars[j]); return -1; } for (k=0; k<Nquads; k++) il_insert_unique_ascending(quadlist, quads[k]); } for (j=0; j<il_size(quadlist); j++) { plotquad(cairo, pargs, args, index, il_get(quadlist, j), DQ); } } else { // plot quads N = index_nquads(index); for (j=0; j<N; j++) { plotquad(cairo, pargs, args, index, j, DQ); } } } } return 0; } int plot_index_add_qidx_file(plotindex_t* args, const char* fn) { int i; qidxfile* qidx = qidxfile_open(fn); if (!qidx) { ERROR("Failed to open quad index file \"%s\"", fn); return -1; } pad_qidxes(args); i = pl_size(args->indexes) - 1; pl_set(args->qidxes, i, qidx); return 0; } int plot_index_add_file(plotindex_t* args, const char* fn) { index_t* index = index_load(fn, 0, NULL); if (!index) { ERROR("Failed to open index \"%s\"", fn); return -1; } pl_append(args->indexes, index); return 0; } int plot_index_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotindex_t* args = (plotindex_t*)baton; if (streq(cmd, "index_file")) { const char* fn = cmdargs; return plot_index_add_file(args, fn); } else if (streq(cmd, "index_qidxfile")) { const char* fn = cmdargs; return plot_index_add_qidx_file(args, fn); } else if (streq(cmd, "index_draw_stars")) { args->stars = atoi(cmdargs); } else if (streq(cmd, "index_draw_quads")) { args->quads = atoi(cmdargs); } else if (streq(cmd, "index_fill")) { args->fill = atoi(cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_index_free(plot_args_t* plotargs, void* baton) { plotindex_t* args = (plotindex_t*)baton; int i; for (i=0; i<pl_size(args->indexes); i++) { index_t* index = pl_get(args->indexes, i); index_free(index); } pl_free(args->indexes); for (i=0; i<pl_size(args->qidxes); i++) { qidxfile* qidx = pl_get(args->qidxes, i); qidxfile_close(qidx); } pl_free(args->qidxes); free(args); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotindex.py��������������������������������������������������������������000644 �000765 �000024 �00000003076 12651445460 020244� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import fnmatch from astrometry.blind.plotstuff_c import * from astrometry.util.sip import * from numpy import * from optparse import OptionParser if __name__ == '__main__': parser = OptionParser(usage='%prog [options] <ra> <dec> <width-in-deg> <index file> <output-filename>') (opt, args) = parser.parse_args() if len(args) != 5: parser.print_help() print print 'Got wrong number of arguments:', args sys.exit(-1) ra = float(args[0]) dec = float(args[1]) width = float(args[2]) indexfn = args[3] outfn = args[4] log_init(3); pargs = plotstuff_new() pargs.outformat = PLOTSTUFF_FORMAT_PNG pargs.outfn = outfn plotstuff_set_size(pargs, 800, 800) plotstuff_set_wcs_box(pargs, ra, dec, width) plotstuff_set_color(pargs, 'verydarkblue') plotstuff_run_command(pargs, 'fill') plotstuff_set_color(pargs, 'gray') plotstuff_set_alpha(pargs, 0.25) grid = plot_grid_get(pargs) grid.rastep = grid.decstep = 1 grid.ralabelstep = grid.declabelstep = 0 plotstuff_run_command(pargs, 'grid') plotstuff_set_color(pargs, 'gray') grid.rastep = grid.decstep = 0 grid.ralabelstep = grid.declabelstep = 1 plotstuff_set_bgrgba2(pargs, 0, 0, 0, 0.5) plotstuff_run_command(pargs, 'grid') plotstuff_set_color(pargs, 'green') pargs.markersize = 1 index = plot_index_get(pargs) plot_index_add_file(index, indexfn) index.stars = 1 index.quads = 0 plotstuff_run_command(pargs, 'index') plotstuff_output(pargs) plotstuff_free(pargs) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotmatch.c���������������������������������������������������������������000644 �000765 �000024 �00000005523 12651445460 020022� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include "plotmatch.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "permutedsort.h" #include "matchfile.h" DEFINE_PLOTTER(match); plotmatch_t* plot_match_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "match"); } void* plot_match_init(plot_args_t* plotargs) { plotmatch_t* args = calloc(1, sizeof(plotmatch_t)); args->matches = bl_new(16, sizeof(MatchObj)); return args; } int plot_match_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotmatch_t* args = (plotmatch_t*)baton; int i; anbool failed = FALSE; plotstuff_builtin_apply(cairo, pargs); for (i=0; i<bl_size(args->matches); i++) { MatchObj* mo = bl_access(args->matches, i); double xy[DQMAX*2]; double theta[DQMAX]; int perm[DQMAX]; double cx,cy; int j; double x,y; //int order[] = {0,2,1,3,4,5}; cx = cy = 0; for (j=0; j<mo->dimquads; j++) { double ra,dec; //xyzarr2radecdeg(mo->quadxyz + order[j]*3, &ra, &dec); xyzarr2radecdeg(mo->quadxyz + j*3, &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) { failed = TRUE; break; } xy[2*j + 0] = x; xy[2*j + 1] = y; cx += x; cy += y; } if (failed) continue; // (In the grand tradition of infinite copy-n-paste...) // Make the quad convex so Sam's eyes don't bleed. cx /= mo->dimquads; cy /= mo->dimquads; for (j=0; j<mo->dimquads; j++) theta[j] = atan2(xy[2*j + 1] - cy, xy[2*j + 0] - cx); permutation_init(perm, mo->dimquads); permuted_sort(theta, sizeof(double), compare_doubles_asc, perm, mo->dimquads); for (j=0; j<mo->dimquads; j++) { x = xy[2*perm[j]+0]; y = xy[2*perm[j]+1]; if (j == 0) cairo_move_to(cairo, x, y); else cairo_line_to(cairo, x, y); } cairo_close_path(cairo); cairo_stroke(cairo); } return 0; } int plot_match_add_match(plotmatch_t* args, const MatchObj* mo) { bl_append(args->matches, mo); return 0; } int plot_match_set_filename(plotmatch_t* args, const char* filename) { matchfile* mf = matchfile_open(filename); MatchObj* mo; if (!mf) { ERROR("Failed to open matchfile \"%s\"", filename); return -1; } while (1) { mo = matchfile_read_match(mf); if (!mo) break; plot_match_add_match(args, mo); } return 0; } int plot_match_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotmatch_t* args = (plotmatch_t*)baton; if (streq(cmd, "match_file")) { plot_match_set_filename(args, cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_match_free(plot_args_t* plotargs, void* baton) { plotmatch_t* args = (plotmatch_t*)baton; bl_free(args->matches); free(args); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotoutline.c�������������������������������������������������������������000644 �000765 �000024 �00000007350 12651445460 020405� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include <assert.h> #include "plotoutline.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "sip-utils.h" #include "sip_qfits.h" #include "starutil.h" DEFINE_PLOTTER(outline); plotoutline_t* plot_outline_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "outline"); } void* plot_outline_init(plot_args_t* plotargs) { plotoutline_t* args = calloc(1, sizeof(plotoutline_t)); args->stepsize = 10; return args; } static void walk_callback(const anwcs_t* wcs, double ix, double iy, double ra, double dec, void* token) { dl* radecs = (dl*)token; dl_append(radecs, ra); dl_append(radecs, dec); } int plot_outline_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotoutline_t* args = (plotoutline_t*)baton; dl* rd; int i; pl* lists; assert(args->stepsize > 0); assert(args->wcs); assert(pargs->wcs); plotstuff_builtin_apply(cairo, pargs); logverb("Plotting outline of WCS: image size is %g x %g\n", anwcs_imagew(args->wcs), anwcs_imageh(args->wcs)); rd = dl_new(256); anwcs_walk_image_boundary(args->wcs, args->stepsize, walk_callback, rd); logverb("Outline: walked in %zu steps\n", dl_size(rd)/2); if (dl_size(rd) == 0) { printf("plot_outline: empty WCS outline.\n"); anwcs_print(args->wcs, stdout); dl_free(rd); return 0; } // avoid special case when there is a break between // the beginning and end of the list. dl_append(rd, dl_get(rd, 0)); dl_append(rd, dl_get(rd, 1)); lists = anwcs_walk_outline(pargs->wcs, rd, args->fill); dl_free(rd); for (i=0; i<pl_size(lists); i++) { dl* xy = pl_get(lists, i); int j; for (j=0; j<dl_size(xy)/2; j++) { double x,y; x = dl_get(xy, j*2+0); y = dl_get(xy, j*2+1); if (j == 0) { cairo_move_to(cairo, x, y); } else { cairo_line_to(cairo, x, y); } } cairo_close_path(cairo); if (args->fill) cairo_fill(cairo); else cairo_stroke(cairo); dl_free(xy); } pl_free(lists); return 0; } int plot_outline_set_wcs_size(plotoutline_t* args, int W, int H) { if (!args->wcs) { ERROR("No WCS is currently set."); return -1; } anwcs_set_size(args->wcs, W, H); return 0; } int plot_outline_set_wcs_file(plotoutline_t* args, const char* filename, int ext) { anwcs_t* wcs = anwcs_open(filename, ext); if (!wcs) { ERROR("Failed to read WCS file \"%s\"", filename); return -1; } logverb("Read WCS file %s\n", filename); if (args->wcs) anwcs_free(args->wcs); args->wcs = wcs; //anwcs_print(args->wcs, stdout); return 0; } int plot_outline_set_wcs(plotoutline_t* args, sip_t* wcs) { if (args->wcs) anwcs_free(args->wcs); args->wcs = anwcs_new_sip(wcs); return 0; } int plot_outline_set_fill(plotoutline_t* args, anbool fill) { args->fill = fill; return 0; } int plot_outline_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotoutline_t* args = (plotoutline_t*)baton; if (streq(cmd, "outline_wcs")) { if (plot_outline_set_wcs_file(args, cmdargs, 0)) { return -1; } } else if (streq(cmd, "outline_fill")) { if (streq(cmdargs, "0")) args->fill = FALSE; else args->fill = TRUE; } else if (streq(cmd, "outline_step")) { args->stepsize = atof(cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_outline_free(plot_args_t* plotargs, void* baton) { plotoutline_t* args = (plotoutline_t*)baton; free(args); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotquad.c����������������������������������������������������������������000644 �000765 �000024 �00000020626 12651445460 017661� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <string.h> #include <stdint.h> #include <cairo.h> #include "an-bool.h" #include "cairoutils.h" #include "boilerplate.h" #include "bl.h" #include "permutedsort.h" #include "matchfile.h" #include "log.h" #include "os-features.h" // for HAVE_NETPBM. #define OPTIONS "hW:H:w:I:C:PRo:d:cm:s:b:v" static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] <quads> > output.png\n" " [-I <input-image>] Input image (PPM format) to plot over.\n" " [-p]: Input image is PNG format, not PPM.\n" " [-P] Write PPM output instead of PNG.\n" " [-C <color>] Color to plot in: (default: white)\n", progname); cairoutils_print_color_names("\n "); printf(" [-b <color>] Draw in <color> behind each line.\n" " [-c]: Also plot a circle at each vertex.\n" " [-W <width> ] Width of output image.\n" " [-H <height>] Height of output image.\n" " [-w <width>] Width of lines to draw (default: 5).\n" " [-R]: Read quads from stdin.\n" " [-o <opacity>]\n" " [-d <dimension of \"quad\">]\n" " [-s <scale>]: scale quad coordinates before plotting.\n" "\n" " ( [-m <match.fits>]: Get quad from match file.\n" " OR <x1> <y1> <x2> <y2> <x3> <y3> <x4> <y4> [...])\n" "\n"); } int main(int argc, char *args[]) { int argchar; char* progname = args[0]; int W = 0, H = 0; int lw = 5; int nquads; int i; dl* coords; char* infn = NULL; anbool pngoutput = TRUE; anbool pnginput = FALSE; anbool fromstdin = FALSE; anbool randomcolor = FALSE; float a = 1.0; anbool plotmarker = FALSE; unsigned char* img; cairo_t* cairo; cairo_surface_t* target; float r=1.0, g=1.0, b=1.0; int dimquads = 4; double scale = 1.0; char* matchfn = NULL; anbool background = FALSE; float br=0.0, bg=0.0, bb=0.0; int loglvl = LOG_MSG; coords = dl_new(16); while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 's': scale = atof(optarg); break; case 'm': matchfn = optarg; break; case 'c': plotmarker = TRUE; break; case 'd': dimquads = atoi(optarg); break; case 'C': if (!strcasecmp(optarg, "random")) randomcolor = TRUE; else if (cairoutils_parse_color(optarg, &r, &g, &b)) { fprintf(stderr, "I didn't understand color \"%s\".\n", optarg); exit(-1); } break; case 'b': background = TRUE; if (cairoutils_parse_color(optarg, &br, &bg, &bb)) { fprintf(stderr, "I didn't understand color \"%s\".\n", optarg); exit(-1); } break; case 'o': a = atof(optarg); break; case 'R': fromstdin = TRUE; break; case 'I': infn = optarg; break; case 'P': pngoutput = FALSE; break; case 'p': pnginput = TRUE; break; case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'w': lw = atoi(optarg); break; case 'h': case '?': default: printHelp(progname); exit(-1); } log_init(loglvl); log_to(stderr); if (dimquads == 0) { printf("Error: dimquads (-d) must be positive.\n"); printHelp(progname); exit(-1); } if (!fromstdin && ((argc - optind) % (2*dimquads))) { printHelp(progname); exit(-1); } if (!((W && H) || infn)) { printHelp(progname); exit(-1); } if (infn && (W || H)) { printf("Error: if you specify an input file, you can't give -W or -H (width or height) arguments.\n\n"); printHelp(progname); exit(-1); } if (matchfn) { matchfile* mf = matchfile_open(matchfn); MatchObj* mo; if (!mf) { fprintf(stderr, "Failed to open matchfile \"%s\".\n", matchfn); exit(-1); } while (1) { mo = matchfile_read_match(mf); if (!mo) break; for (i=0; i<2*dimquads; i++) { dl_append(coords, mo->quadpix[i]); } } } for (i=optind; i<argc; i++) { double pos = atof(args[i]); dl_append(coords, pos); } if (fromstdin) { for (;;) { int j; double p; if (feof(stdin)) break; for (j=0; j<(2*dimquads); j++) { if (fscanf(stdin, " %lg", &p) != 1) { fprintf(stderr, "Failed to read a quad from stdin.\n"); exit(-1); } dl_append(coords, p); } } } if (scale != 1.0) { for (i=0; i<dl_size(coords); i++) { dl_set(coords, i, scale * dl_get(coords, i)); } } nquads = dl_size(coords) / (2*dimquads); if (infn) { #if HAVE_NETPBM #else logverb("No netpbm available: forcing PNG input.\n"); pnginput = TRUE; #endif if (pnginput) { logverb("Reading PNG file %s\n", infn); img = cairoutils_read_png(infn, &W, &H); } #if HAVE_NETPBM else { logverb("Reading PPM from %s\n", infn); cairoutils_fake_ppm_init(); img = cairoutils_read_ppm(infn, &W, &H); } #else #endif if (!img) { fprintf(stderr, "Failed to read input image %s.\n", infn); exit(-1); } cairoutils_rgba_to_argb32(img, W, H); } else { // Allocate a black image. img = calloc(4 * W * H, 1); } target = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); cairo = cairo_create(target); cairo_set_line_width(cairo, lw); cairo_set_line_join(cairo, CAIRO_LINE_JOIN_BEVEL); //cairo_set_line_join(cairo, CAIRO_LINE_JOIN_ROUND); cairo_set_antialias(cairo, CAIRO_ANTIALIAS_GRAY); if (!randomcolor) cairo_set_source_rgba(cairo, r, g, b, a); for (i=0; i<nquads; i++) { int j; double theta[dimquads]; int perm[dimquads]; double cx, cy; // Make the quad convex so Sam's eyes don't bleed. cx = cy = 0.0; for (j=0; j<dimquads; j++) { cx += dl_get(coords, i*(2*dimquads) + j*2); cy += dl_get(coords, i*(2*dimquads) + j*2 + 1); } cx /= dimquads; cy /= dimquads; for (j=0; j<dimquads; j++) { theta[j] = atan2(dl_get(coords, i*(2*dimquads) + j*2 + 1)-cy, dl_get(coords, i*(2*dimquads) + j*2 + 0)-cx); } permutation_init(perm, dimquads); permuted_sort(theta, sizeof(double), compare_doubles_asc, perm, dimquads); // hack. if (background) { cairo_save(cairo); cairo_set_line_width(cairo, lw + 2.0); cairo_set_source_rgba(cairo, br, bg, bb, 0.75); for (j=0; j<dimquads; j++) { ((j==0) ? cairo_move_to : cairo_line_to) (cairo, dl_get(coords, i*(2*dimquads) + perm[j]*2), dl_get(coords, i*(2*dimquads) + perm[j]*2 + 1)); } cairo_close_path(cairo); cairo_stroke(cairo); cairo_restore(cairo); } if (randomcolor) { r = ((rand() % 128) + 127) / 255.0; g = ((rand() % 128) + 127) / 255.0; b = ((rand() % 128) + 127) / 255.0; cairo_set_source_rgba(cairo, r, g, b, a); } for (j=0; j<dimquads; j++) { ((j==0) ? cairo_move_to : cairo_line_to) (cairo, dl_get(coords, i*(2*dimquads) + perm[j]*2), dl_get(coords, i*(2*dimquads) + perm[j]*2 + 1)); } cairo_close_path(cairo); cairo_stroke(cairo); } if (plotmarker) { for (i=0; i<dl_size(coords)/2; i++) { double x = dl_get(coords, i*2 + 0); double y = dl_get(coords, i*2 + 1); double rad = 5; cairo_arc(cairo, x, y, rad, 0.0, 2.0*M_PI); cairo_stroke(cairo); } } // Convert image for output... cairoutils_argb32_to_rgba(img, W, H); if (pngoutput) { if (cairoutils_stream_png(stdout, img, W, H)) { fprintf(stderr, "Failed to write PNG.\n"); exit(-1); } } else { if (cairoutils_stream_ppm(stdout, img, W, H)) { fprintf(stderr, "Failed to write PPM.\n"); exit(-1); } } cairo_surface_destroy(target); cairo_destroy(cairo); free(img); return 0; } ����������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotradec.c���������������������������������������������������������������000644 �000765 �000024 �00000011342 12651445460 020000� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include "os-features.h" #include "plotradec.h" #include "rdlist.h" #include "cairoutils.h" #include "log.h" #include "errors.h" #include "sip_qfits.h" DEFINE_PLOTTER(radec); plotradec_t* plot_radec_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "radec"); } void plot_radec_reset(plotradec_t* args) { if (args->radecvals) dl_free(args->radecvals); if (args->racol) free(args->racol); if (args->deccol) free(args->deccol); if (args->fn) free(args->fn); memset(args, 0, sizeof(plotradec_t)); args->ext = 1; args->radecvals = dl_new(32); } void* plot_radec_init(plot_args_t* plotargs) { plotradec_t* args = calloc(1, sizeof(plotradec_t)); plot_radec_reset(args); return args; } static rd_t* get_rd(plotradec_t* args, rd_t* myrd) { rdlist_t* rdls = NULL; rd_t* rd = NULL; if (args->fn) { // Open rdlist. rdls = rdlist_open(args->fn); if (!rdls) { ERROR("Failed to open rdlist from file \"%s\"", args->fn); return NULL; } if (args->racol) rdlist_set_raname(rdls, args->racol); if (args->deccol) rdlist_set_decname(rdls, args->deccol); // Find number of entries in rdlist. rd = rdlist_read_field_num(rdls, args->ext, NULL); //freerd = rd; rdlist_close(rdls); if (!rd) { ERROR("Failed to read FITS extension %i from file %s.\n", args->ext, args->fn); return NULL; } } else { assert(dl_size(args->radecvals)); rd_from_dl(myrd, args->radecvals); rd = myrd; } return rd; } int plot_radec_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotradec_t* args = (plotradec_t*)baton; // Plot it! rd_t myrd; rd_t* rd = NULL; //rd_t* freerd = NULL; int Nrd; int i; if (!pargs->wcs) { ERROR("plotting radec but not plot_wcs has been set."); return -1; } if (args->fn && dl_size(args->radecvals)) { ERROR("Can only plot one of rdlist filename and radec_vals"); return -1; } if (!args->fn && !dl_size(args->radecvals)) { ERROR("Neither rdlist filename nor radec_vals given!"); return -1; } plotstuff_builtin_apply(cairo, pargs); rd = get_rd(args, &myrd); if (!rd) return -1; Nrd = rd_n(rd); // If N is specified, apply it as a max. if (args->nobjs) Nrd = MIN(Nrd, args->nobjs); // Plot markers. for (i=args->firstobj; i<Nrd; i++) { double x,y; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (!plotstuff_marker_in_bounds(pargs, x, y)) continue; plotstuff_stack_marker(pargs, x-1, y-1); } plotstuff_plot_stack(pargs, cairo); if (rd != &myrd) rd_free(rd); //rd_free(freerd); return 0; } int plot_radec_count_inbounds(plot_args_t* pargs, plotradec_t* args) { rd_t myrd; rd_t* rd = NULL; int i, Nrd, nib; rd = get_rd(args, &myrd); if (!rd) return -1; Nrd = rd_n(rd); // If N is specified, apply it as a max. if (args->nobjs) Nrd = MIN(Nrd, args->nobjs); nib = 0; for (i=args->firstobj; i<Nrd; i++) { double x,y; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (!plotstuff_marker_in_bounds(pargs, x, y)) continue; nib++; } if (rd != &myrd) rd_free(rd); return nib; } void plot_radec_set_racol(plotradec_t* args, const char* col) { free(args->racol); args->racol = strdup_safe(col); } void plot_radec_set_deccol(plotradec_t* args, const char* col) { free(args->deccol); args->deccol = strdup_safe(col); } void plot_radec_set_filename(plotradec_t* args, const char* fn) { free(args->fn); args->fn = strdup_safe(fn); } void plot_radec_vals(plotradec_t* args, double ra, double dec) { dl_append(args->radecvals, ra); dl_append(args->radecvals, dec); } int plot_radec_command(const char* cmd, const char* cmdargs, plot_args_t* plotargs, void* baton) { plotradec_t* args = (plotradec_t*)baton; if (streq(cmd, "radec_file")) { plot_radec_set_filename(args, cmdargs); } else if (streq(cmd, "radec_ext")) { args->ext = atoi(cmdargs); } else if (streq(cmd, "radec_racol")) { plot_radec_set_racol(args, cmdargs); } else if (streq(cmd, "radec_deccol")) { plot_radec_set_deccol(args, cmdargs); } else if (streq(cmd, "radec_firstobj")) { args->firstobj = atoi(cmdargs); } else if (streq(cmd, "radec_nobjs")) { args->nobjs = atoi(cmdargs); } else if (streq(cmd, "radec_vals")) { plotstuff_append_doubles(cmdargs, args->radecvals); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_radec_free(plot_args_t* plotargs, void* baton) { plotradec_t* args = (plotradec_t*)baton; free(args->radecvals); free(args->racol); free(args->deccol); free(args->fn); free(args); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotstuff-main.c����������������������������������������������������������000644 �000765 �000024 �00000010721 12651445460 020773� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Reads a plot control file that contains instructions on what to plot and how to plot it. There are a few plotting module that understand different commands and plot different kinds of things. Common plotting: plot_color (<r> <g> <b> <a> or color name) plot_lw <linewidth> plot_bgcolor (<r> <g> <b> <a> or color name) plot_bglw <linewidth> plot_marker <marker-shape> plot_markersize <radius> plot_wcs <filename> plot_wcs_setsize plot_wcs_box <ra> <dec> <width> -- center on RA,Dec with width in deg. Fill with a color: fill Image: image_file <fn> image_format <format> image_ext <extension> -- FITS extension image_wcs <fn> -- project the image through its WCS, then back through the plot_wcs. image_setsize -- set plot size to image size. image_low -- FITS pixel value that will be black. image_high -- FITS pixel value that will be black. image_null -- FITS pixel value that will be transparent. image Xy: Note, xylists are assumed to contain FITS-indexed pixels: the center of the "lower-left" pixel is at coordinate (1,1). xy_file <xylist> xy_wcs <wcs-file> xy_ext <fits-extension> xy_xcol <column-name> xy_ycol <column-name> xy_xoff <pixel-offset> -- default 1, for FITS pixels. xy_yoff <pixel-offset> xy_firstobj <obj-num> xy_nobjs <n> xy_scale <factor> xy_vals <x> <y> -- coordinates to plot xy RA,Dec lists: radec_file <filename (FITS binary table)> radec_ext <FITS extension, default 1> radec_racol <FITS column name, default "RA"> radec_deccol <FITS column name, default "DEC"> radec_firstobj <int, default 0> radec_nobjs <int, default no limit> radec_vals <ra> <dec> -- coordinates to plot Annotations: annotations_bgcolor annotations_fontsize annotations_font annotations_target <ra> <dec> <label> annotations_targetname <label> -- eg "M 8", "NGC 427" annotations_no_ngc -- don't plot NGC/IC galaxies annotations_no_bright -- don't plot named stars annotations_ngc_size <fraction> -- default 0.02, min size to annotate. annotations Image outlines: outline_wcs <fn> outline_step <pix> -- step size for walking the image boundary, default 10 outline RA,Dec grid: grid_rastep <deg> grid_decstep <deg> grid_ralabelstep <deg> grid_declabelstep <deg> grid_step <deg> -- sets all the above at once. grid Astrometry.net index files: index_file <filename> index_draw_stars <0/1> -- draw stars? index_draw_quads <0/1> -- draw quads? index Healpix boundaries: healpix_nside <int> healpix */ #include <stdio.h> #include "plotstuff.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "fitsioutils.h" static const char* OPTIONS = "hvW:H:o:JjP"; static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] > output.png\n" " [-o <output-file>] (default: stdout)\n" " [-P] Write PPM output instead of PNG.\n" " [-j] Write JPEG output.\n" " [-J] Write PDF output.\n" " [-W <width> ] Width of output image (default: data-dependent).\n" " [-H <height> ] Height of output image (default: data-dependent).\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char *args[]) { int loglvl = LOG_MSG; int argchar; char* progname = args[0]; plot_args_t pargs; plotstuff_init(&pargs); pargs.fout = stdout; pargs.outformat = PLOTSTUFF_FORMAT_PNG; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'o': pargs.outfn = optarg; break; case 'P': pargs.outformat = PLOTSTUFF_FORMAT_PPM; break; case 'j': pargs.outformat = PLOTSTUFF_FORMAT_JPG; break; case 'J': pargs.outformat = PLOTSTUFF_FORMAT_PDF; break; case 'W': pargs.W = atoi(optarg); break; case 'H': pargs.H = atoi(optarg); break; case 'h': printHelp(progname); exit(0); case '?': default: printHelp(progname); exit(-1); } if (optind != argc) { printHelp(progname); exit(-1); } log_init(loglvl); // log errors to stderr, not stdout. errors_log_to(stderr); fits_use_error_system(); for (;;) { if (plotstuff_read_and_run_command(&pargs, stdin)) break; } if (plotstuff_output(&pargs)) exit(-1); plotstuff_free(&pargs); return 0; } �����������������������������������������������astrometry.net-0.67/blind/plotstuff.c���������������������������������������������������������������000644 �000765 �000024 �00000100276 12651445460 020056� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ // Avoid *nasty* problem when 'bool' gets redefined (by ppm.h) to be 4 bytes! #include "an-bool.h" #include <math.h> #include <string.h> #include <stdint.h> #include <assert.h> #include <cairo.h> #include <cairo-pdf.h> #include "os-features.h" #include "plotstuff.h" #include "plotfill.h" #include "plotxy.h" #include "plotimage.h" #include "plotannotations.h" #include "plotgrid.h" #include "plotoutline.h" #include "plotindex.h" #include "plotradec.h" #include "plothealpix.h" #include "plotmatch.h" #include "sip_qfits.h" #include "sip-utils.h" #include "sip.h" #include "cairoutils.h" #include "starutil.h" #include "ioutils.h" #include "log.h" #include "errors.h" #include "anwcs.h" enum cmdtype { CIRCLE, TEXT, LINE, RECTANGLE, ARROW, MARKER, POLYGON, }; typedef enum cmdtype cmdtype; struct cairocmd { cmdtype type; int layer; double x, y; float rgba[4]; // CIRCLE double radius; // TEXT char* text; // LINE / RECTANGLE / ARROW double x2, y2; // MARKER int marker; double markersize; // POLYGON dl* xy; anbool fill; }; typedef struct cairocmd cairocmd_t; static void get_text_position(plot_args_t* pargs, cairo_t* cairo, const char* txt, double* px, double* py); plot_args_t* plotstuff_new() { plot_args_t* pargs = calloc(1, sizeof(plot_args_t)); plotstuff_init(pargs); return pargs; } void plotstuff_clear(plot_args_t* pargs) { cairo_operator_t op; assert(pargs->cairo); op = cairo_get_operator(pargs->cairo); cairo_set_operator(pargs->cairo, CAIRO_OPERATOR_CLEAR); cairo_paint(pargs->cairo); cairo_set_operator(pargs->cairo, op); } void plotstuff_move_to(plot_args_t* pargs, double x, double y) { if (pargs->move_to) pargs->move_to(pargs, x, y, pargs->move_to_baton); else { assert(pargs->cairo); cairo_move_to(pargs->cairo, x, y); } } void plotstuff_line_to(plot_args_t* pargs, double x, double y) { if (pargs->line_to) pargs->line_to(pargs, x, y, pargs->line_to_baton); else { assert(pargs->cairo); cairo_line_to(pargs->cairo, x, y); } } int plotstuff_rotate_wcs(plot_args_t* pargs, double angle) { if (!pargs->wcs) { ERROR("No WCS has been set"); return -1; } return anwcs_rotate_wcs(pargs->wcs, angle); } int plotstuff_get_radec_center_and_radius(plot_args_t* pargs, double* p_ra, double* p_dec, double* p_radius) { int rtn; if (!pargs->wcs) return -1; rtn = anwcs_get_radec_center_and_radius(pargs->wcs, p_ra, p_dec, p_radius); if (rtn) return rtn; if (p_radius && *p_radius == 0.0) { // HACK -- get approximate scale, using plot size. *p_radius = arcsec2deg(anwcs_pixel_scale(pargs->wcs) * hypot(pargs->W, pargs->H)/2.0); } return rtn; } int plotstuff_append_doubles(const char* str, dl* lst) { int i; sl* strs = sl_split(NULL, str, " "); for (i=0; i<sl_size(strs); i++) dl_append(lst, atof(sl_get(strs, i))); sl_free2(strs); return 0; } int plotstuff_line_constant_ra(plot_args_t* pargs, double ra, double dec1, double dec2, anbool startwithmove) { double decstep; double dec; double s; double pixscale; anbool lastok = FALSE; if (!startwithmove) lastok = TRUE; assert(pargs->wcs); pixscale = anwcs_pixel_scale(pargs->wcs); assert(pixscale > 0.0); decstep = arcsec2deg(pixscale * pargs->linestep); logverb("plotstuff_line_constant_ra: RA=%g, Dec=[%g,%g], pixscale %g, decstep %g\n", ra, dec1, dec2, anwcs_pixel_scale(pargs->wcs), decstep); //printf("plotstuff_line_constant_ra: RA=%g, Dec=[%g,%g], pixscale %g, decstep %g\n", //ra, dec1, dec2, anwcs_pixel_scale(pargs->wcs), decstep); s = 1.0; if (dec1 > dec2) s = -1; for (dec=dec1; (s*dec)<=(s*dec2); dec+=(decstep*s)) { double x, y; //logverb(" line_constant_ra: RA,Dec %g,%g\n", ra, dec); //printf(" line_constant_ra: RA,Dec %g,%g\n", ra, dec); if (anwcs_radec2pixelxy(pargs->wcs, ra, dec, &x, &y)) { printf(" bad xy\n"); lastok = FALSE; continue; } //printf(" x,y %.1f, %.1f\n", x, y); if (lastok) plotstuff_line_to(pargs, x, y); else plotstuff_move_to(pargs, x, y); lastok = TRUE; } return 0; } int plotstuff_line_constant_dec(plot_args_t* pargs, double dec, double ra1, double ra2) { double rastep; double ra; double f; double s; assert(pargs->wcs); rastep = arcsec2deg(anwcs_pixel_scale(pargs->wcs) * pargs->linestep); f = cos(deg2rad(dec)); rastep /= MAX(0.1, f); s = 1.0; if (ra1 > ra2) s = -1.0; for (ra=ra1; (s*ra)<=(s*ra2); ra+=(rastep*s)) { double x, y; if (anwcs_radec2pixelxy(pargs->wcs, ra, dec, &x, &y)) continue; if (ra == ra1) plotstuff_move_to(pargs, x, y); else plotstuff_line_to(pargs, x, y); } return 0; } static double normra(double ra) { while (ra < 0.) ra += 360.; while (ra > 360.) ra -= 360.; return ra; } int plotstuff_line_constant_dec2(plot_args_t* pargs, double dec, double ra1, double ra2, double rastep) { double ra; int n; int done = 0; ra1 = normra(ra1); ra2 = normra(ra2); assert(pargs->wcs); for (ra=ra1, n=0; n<1000000; n++) { double x, y; double ranext; ra = normra(ra); if (anwcs_radec2pixelxy(pargs->wcs, ra, dec, &x, &y)) continue; if (n == 0) plotstuff_move_to(pargs, x, y); else plotstuff_line_to(pargs, x, y); if (done) break; ranext = ra + rastep; // will the next step take us past ra2? if (MIN(ra, ranext) < ra2 && ra2 < MAX(ra, ranext)) { ra = ra2; done = 1; } else ra = ranext; } return 0; } int plotstuff_text_radec(plot_args_t* pargs, double ra, double dec, const char* label) { double x,y; if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) { ERROR("Failed to convert RA,Dec (%g,%g) to pixel position in plot_text_radec\n", ra, dec); return -1; } assert(pargs->cairo); //plotstuff_stack_text(pargs, pargs->cairo, label, x, y); get_text_position(pargs, pargs->cairo, label, &x, &y); plotstuff_move_to(pargs, x, y); cairo_show_text(pargs->cairo, label); return 0; } int plotstuff_text_xy(plot_args_t* pargs, double x, double y, const char* label) { assert(pargs->cairo); get_text_position(pargs, pargs->cairo, label, &x, &y); plotstuff_move_to(pargs, x, y); cairo_show_text(pargs->cairo, label); return 0; } static int moveto_lineto_radec(plot_args_t* pargs, double ra, double dec, anbool move) { double x,y; if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) { ERROR("Failed to convert RA,Dec (%g,%g) to pixel position in plot_text_radec\n", ra, dec); return -1; } assert(pargs->cairo); (move ? plotstuff_move_to : plotstuff_line_to)(pargs, x, y); return 0; } int plotstuff_move_to_radec(plot_args_t* pargs, double ra, double dec) { assert(pargs->cairo); plotstuff_builtin_apply(pargs->cairo, pargs); return moveto_lineto_radec(pargs, ra, dec, TRUE); } int plotstuff_line_to_radec(plot_args_t* pargs, double ra, double dec) { return moveto_lineto_radec(pargs, ra, dec, FALSE); } int plotstuff_close_path(plot_args_t* pargs) { assert(pargs->cairo); cairo_close_path(pargs->cairo); return 0; } int plotstuff_fill(plot_args_t* pargs) { assert(pargs->cairo); cairo_fill(pargs->cairo); return 0; } int plotstuff_stroke(plot_args_t* pargs) { assert(pargs->cairo); cairo_stroke(pargs->cairo); return 0; } int plotstuff_fill_preserve(plot_args_t* pargs) { assert(pargs->cairo); cairo_fill_preserve(pargs->cairo); return 0; } int plotstuff_stroke_preserve(plot_args_t* pargs) { assert(pargs->cairo); cairo_stroke_preserve(pargs->cairo); return 0; } void plotstuff_set_dashed(plot_args_t* pargs, double dashlen) { assert(pargs->cairo); cairo_set_dash(pargs->cairo, &dashlen, 1, 0); } void plotstuff_set_solid(plot_args_t* pargs) { assert(pargs->cairo); cairo_set_dash(pargs->cairo, NULL, 0, 0); } int parse_color(const char* color, float* r, float* g, float* b, float* a) { if (a) *a = 1.0; return (cairoutils_parse_rgba(color, r, g, b, a) && cairoutils_parse_color(color, r, g, b)); } int parse_color_rgba(const char* color, float* rgba) { return parse_color(color, rgba, rgba+1, rgba+2, rgba+3); } void cairo_set_rgba(cairo_t* cairo, const float* rgba) { cairo_set_source_rgba(cairo, rgba[0], rgba[1], rgba[2], rgba[3]); } int cairo_set_color(cairo_t* cairo, const char* color) { float rgba[4]; int res; res = parse_color_rgba(color, rgba); if (res) { ERROR("Failed to parse color \"%s\"", color); return res; } cairo_set_rgba(cairo, rgba); return res; } void plotstuff_builtin_apply(cairo_t* cairo, plot_args_t* args) { //printf("Set rgba %.2f, %.2f, %.2f, %.2f\n", args->rgba[0], args->rgba[1], //args->rgba[2], args->rgba[3]); cairo_set_rgba(cairo, args->rgba); cairo_set_line_width(cairo, args->lw); cairo_set_operator(cairo, args->op); cairo_set_font_size(cairo, args->fontsize); } void plotstuff_set_text_bg_alpha(plot_args_t* pargs, float alpha) { pargs->bg_rgba[3] = alpha; } static void* plot_builtin_init(plot_args_t* args) { parse_color_rgba("gray", args->rgba); parse_color_rgba("black", args->bg_rgba); args->text_bg_layer = 2; args->text_fg_layer = 3; args->marker_fg_layer = 3; args->bg_lw = 3.0; args->lw = 1.0; args->marker = CAIROUTIL_MARKER_CIRCLE; args->markersize = 5.0; args->linestep = 10; args->op = CAIRO_OPERATOR_OVER; args->fontsize = 20; args->halign = 'C'; args->valign = 'B'; args->cairocmds = bl_new(256, sizeof(cairocmd_t)); args->label_offset_x = 10.0; args->label_offset_y = 5.0; return NULL; } static int plot_builtin_init2(plot_args_t* pargs, void* baton) { plotstuff_builtin_apply(pargs->cairo, pargs); // Inits that aren't in "plot_builtin" cairo_set_antialias(pargs->cairo, CAIRO_ANTIALIAS_GRAY); return 0; } int plotstuff_set_markersize(plot_args_t* pargs, double ms) { pargs->markersize = ms; return 0; } int plotstuff_set_marker(plot_args_t* pargs, const char* name) { int m = cairoutils_parse_marker(name); if (m == -1) { ERROR("Failed to parse plot_marker \"%s\"", name); return -1; } pargs->marker = m; return 0; } int plotstuff_set_size(plot_args_t* pargs, int W, int H) { pargs->W = W; pargs->H = H; return 0; } int plotstuff_scale_wcs(plot_args_t* pargs, double scale) { if (!pargs->wcs) { ERROR("No WCS has been set"); return -1; } return anwcs_scale_wcs(pargs->wcs, scale); } int plotstuff_set_wcs_file(plot_args_t* pargs, const char* filename, int ext) { anwcs_t* wcs = anwcs_open(filename, ext); if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", filename, ext); return -1; } return plotstuff_set_wcs(pargs, wcs); } int plotstuff_set_wcs_sip(plot_args_t* pargs, sip_t* wcs) { anwcs_t* anwcs = anwcs_new_sip(wcs); return plotstuff_set_wcs(pargs, anwcs); } int plotstuff_set_wcs_tan(plot_args_t* pargs, tan_t* wcs) { anwcs_t* anwcs = anwcs_new_tan(wcs); return plotstuff_set_wcs(pargs, anwcs); } int plotstuff_set_wcs(plot_args_t* pargs, anwcs_t* wcs) { if (pargs->wcs) { anwcs_free(pargs->wcs); } pargs->wcs = wcs; return 0; } int plotstuff_set_wcs_box(plot_args_t* pargs, float ra, float dec, float width) { logverb("Setting WCS to a box centered at (%g,%g) with width %g deg.\n", ra, dec, width); anwcs_t* wcs = anwcs_create_box_upsidedown(ra, dec, width, pargs->W, pargs->H); return plotstuff_set_wcs(pargs, wcs); } static int plot_builtin_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { if (streq(cmd, "plot_color")) { if (parse_color_rgba(cmdargs, pargs->rgba)) { ERROR("Failed to parse plot_color: \"%s\"", cmdargs); return -1; } } else if (streq(cmd, "plot_bgcolor")) { if (parse_color_rgba(cmdargs, pargs->bg_rgba)) { ERROR("Failed to parse plot_bgcolor: \"%s\"", cmdargs); return -1; } } else if (streq(cmd, "plot_fontsize")) { pargs->fontsize = atof(cmdargs); } else if (streq(cmd, "plot_alpha")) { if (plotstuff_set_alpha(pargs, atof(cmdargs))) { ERROR("Failed to set alpha"); return -1; } } else if (streq(cmd, "plot_op")) { if (streq(cmdargs, "add")) { pargs->op = CAIRO_OPERATOR_ADD; } else if (streq(cmdargs, "reset")) { pargs->op = CAIRO_OPERATOR_OVER; } else { ERROR("Didn't understand op: %s", cmdargs); return -1; } } else if (streq(cmd, "plot_lw")) { pargs->lw = atof(cmdargs); } else if (streq(cmd, "plot_bglw")) { pargs->bg_lw = atof(cmdargs); } else if (streq(cmd, "plot_marker")) { if (plotstuff_set_marker(pargs, cmdargs)) { return -1; } } else if (streq(cmd, "plot_markersize")) { pargs->markersize = atof(cmdargs); } else if (streq(cmd, "plot_size")) { int W, H; if (sscanf(cmdargs, "%i %i", &W, &H) != 2) { ERROR("Failed to parse plot_size args \"%s\"", cmdargs); return -1; } plotstuff_set_size(pargs, W, H); } else if (streq(cmd, "plot_wcs")) { if (plotstuff_set_wcs_file(pargs, cmdargs, 0)) { return -1; } } else if (streq(cmd, "plot_wcs_box")) { float ra, dec, width; if (sscanf(cmdargs, "%f %f %f", &ra, &dec, &width) != 3) { ERROR("Failed to parse plot_wcs_box args \"%s\"", cmdargs); return -1; } if (plotstuff_set_wcs_box(pargs, ra, dec, width)) { return -1; } } else if (streq(cmd, "plot_wcs_setsize")) { assert(pargs->wcs); plotstuff_set_size_wcs(pargs); } else if (streq(cmd, "plot_label_radec")) { assert(pargs->wcs); double ra, dec; int nc; const char* label; if (sscanf(cmdargs, "%lf %lf %n", &ra, &dec, &nc) != 3) { ERROR("Failed to parse plot_label_radec args \"%s\"", cmdargs); return -1; } label = cmdargs + nc; return plotstuff_text_radec(pargs, ra, dec, label); } else { ERROR("Did not understand command: \"%s\"", cmd); return -1; } if (pargs->cairo) plotstuff_builtin_apply(pargs->cairo, pargs); return 0; } int plotstuff_set_size_wcs(plot_args_t* pargs) { assert(pargs->wcs); return plotstuff_set_size(pargs, (int)ceil(anwcs_imagew(pargs->wcs)), (int)ceil(anwcs_imageh(pargs->wcs))); } int plot_builtin_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { //plotstuff_plot_stack(pargs, cairo); return 0; } static void cairocmd_init(cairocmd_t* cmd) { if (!cmd) return; memset(cmd, 0, sizeof(cairocmd_t)); //cmd->xy = dl_new(32); } static void cairocmd_clear(cairocmd_t* cmd) { if (!cmd) return; free(cmd->text); cmd->text = NULL; if (cmd->xy) dl_free(cmd->xy); cmd->xy = NULL; } static void add_cmd(plot_args_t* pargs, cairocmd_t* cmd) { bl_append(pargs->cairocmds, cmd); } static void set_cmd_args(plot_args_t* pargs, cairocmd_t* cmd) { cmd->marker = pargs->marker; cmd->markersize = pargs->markersize; memcpy(cmd->rgba, pargs->rgba, sizeof(cmd->rgba)); } anbool plotstuff_marker_in_bounds(plot_args_t* pargs, double x, double y) { double margin = pargs->markersize; return (x >= -margin && x <= (pargs->W + margin) && y >= -margin && y <= (pargs->H + margin)); } void plotstuff_stack_marker(plot_args_t* pargs, double x, double y) { cairocmd_t cmd; cairocmd_init(&cmd); set_cmd_args(pargs, &cmd); // BG marker? cmd.layer = pargs->marker_fg_layer; cmd.type = MARKER; // FIXME -- handle cairo half-pixel issues here? cmd.x = x + 0.5; cmd.y = y + 0.5; add_cmd(pargs, &cmd); } void plotstuff_stack_arrow(plot_args_t* pargs, double x, double y, double x2, double y2) { cairocmd_t cmd; cairocmd_init(&cmd); // BG? set_cmd_args(pargs, &cmd); cmd.layer = pargs->marker_fg_layer; cmd.type = ARROW; cmd.x = x; cmd.y = y; cmd.x2 = x2; cmd.y2 = y2; add_cmd(pargs, &cmd); } static void get_text_position(plot_args_t* pargs, cairo_t* cairo, const char* txt, double* px, double* py) { cairo_text_extents_t textents; double l = 0.0,r,t = 0.0,b; double margin = 2.0; double x, y; x = *px; y = *py; x += pargs->label_offset_x; y += pargs->label_offset_y; cairo_text_extents(cairo, txt, &textents); switch (pargs->halign) { case 'L': l = x + textents.x_bearing; break; case 'C': l = x + textents.x_bearing - 0.5*textents.width; break; case 'R': l = x + textents.x_bearing - textents.width; break; } x = l; r = l + textents.width + textents.x_bearing; switch (pargs->valign) { case 'T': t = y + textents.y_bearing + textents.height; //y -= (0.5 * textents.y_bearing); break; case 'C': t = y + textents.y_bearing + 0.5*textents.height; break; case 'B': t = y + textents.y_bearing; break; } b = t + textents.height; y = b; l -= margin; t -= margin; r += margin + 1; b += margin + 1; // move text away from the edges of the image. if (l < 0) { x += -l; l = 0; } if (t < 0) { y += -t; t = 0; } if (r > pargs->W) { x -= (r - pargs->W); r = pargs->W; } if (b > pargs->H) { y -= (b - pargs->H); b = pargs->H; } *px = x; *py = y; } void plotstuff_stack_text(plot_args_t* pargs, cairo_t* cairo, const char* txt, double px, double py) { cairocmd_t cmd; cairocmd_init(&cmd); set_cmd_args(pargs, &cmd); get_text_position(pargs, cairo, txt, &px, &py); cmd.type = TEXT; if (pargs->bg_rgba[3] > 0) { int dx, dy; logverb("Background text RGB [%g, %g, %g] alpha %g\n", pargs->bg_rgba[0], pargs->bg_rgba[1], pargs->bg_rgba[2], pargs->bg_rgba[3]); cmd.layer = pargs->text_bg_layer; memcpy(cmd.rgba, pargs->bg_rgba, sizeof(cmd.rgba)); if (pargs->bg_box) { // Plot a rectangle behind the text cairo_text_extents_t textents; cairo_text_extents(cairo, txt, &textents); cmd.type = RECTANGLE; cmd.x = px + textents.x_bearing; cmd.y = py + textents.y_bearing; cmd.x2 = cmd.x + textents.width; cmd.y2 = py + textents.y_bearing + textents.height; cmd.fill = TRUE; add_cmd(pargs, &cmd); cmd.type = TEXT; } else { // Plot bg-color text behind for (dy=-1; dy<=1; dy++) { for (dx=-1; dx<=1; dx++) { cmd.text = strdup(txt); cmd.x = px + dx; cmd.y = py + dy; add_cmd(pargs, &cmd); } } } } else logverb("No background behind text\n"); cmd.layer = pargs->text_fg_layer; memcpy(cmd.rgba, pargs->rgba, sizeof(cmd.rgba)); cmd.text = strdup(txt); cmd.x = px; cmd.y = py; add_cmd(pargs, &cmd); } void plotstuff_marker(plot_args_t* pargs, double x, double y) { cairo_t* cairo = pargs->cairo; cairo_move_to(cairo, x, y); cairoutils_draw_marker(cairo, pargs->marker, x, y, pargs->markersize); } int plotstuff_marker_radec(plot_args_t* pargs, double ra, double dec) { double x,y; //printf("plotstuff_marker_radec(%.3f, %.3f)\n", ra, dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) { ERROR("Failed to convert RA,Dec (%g,%g) to pixel position in plot_marker_radec\n", ra, dec); return -1; } assert(pargs->cairo); //logverb("plotstuff_marker_radec (%.3f, %.3f) -> (%.1f, %.1f)\n", ra, dec, x, y); // MAGIC 0.5 -- cairo/FITS coord offset plotstuff_marker(pargs, x-0.5, y-0.5); return 0; } int plotstuff_plot_stack(plot_args_t* pargs, cairo_t* cairo) { int i, j; int layer; anbool morelayers; logverb("Plotting %zu stacked plot commands.\n", bl_size(pargs->cairocmds)); morelayers = TRUE; for (layer=0;; layer++) { if (!morelayers) break; morelayers = FALSE; for (i=0; i<bl_size(pargs->cairocmds); i++) { cairocmd_t* cmd = bl_access(pargs->cairocmds, i); if (cmd->layer > layer) morelayers = TRUE; if (cmd->layer != layer) continue; cairo_set_rgba(cairo, cmd->rgba); switch (cmd->type) { case CIRCLE: cairo_move_to(cairo, cmd->x + cmd->radius, cmd->y); cairo_arc(cairo, cmd->x, cmd->y, cmd->radius, 0, 2*M_PI); break; case MARKER: { double oldmarkersize = pargs->markersize; int oldmarker = pargs->marker; pargs->markersize = cmd->markersize; pargs->marker = cmd->marker; plotstuff_marker(pargs, cmd->x, cmd->y); pargs->markersize = oldmarkersize; pargs->marker = oldmarker; } break; case TEXT: cairo_move_to(cairo, cmd->x, cmd->y); cairo_show_text(cairo, cmd->text); break; case LINE: case ARROW: plotstuff_move_to(pargs, cmd->x, cmd->y); plotstuff_line_to(pargs, cmd->x2, cmd->y2); { double dx = cmd->x - cmd->x2; double dy = cmd->y - cmd->y2; double angle = atan2(dy, dx); double dang = 30. * M_PI/180.0; double arrowlen = 20; plotstuff_line_to(pargs, cmd->x2 + cos(angle+dang)*arrowlen, cmd->y2 + sin(angle+dang)*arrowlen); plotstuff_move_to(pargs, cmd->x2, cmd->y2); plotstuff_line_to(pargs, cmd->x2 + cos(angle-dang)*arrowlen, cmd->y2 + sin(angle-dang)*arrowlen); } break; case RECTANGLE: cairo_move_to(cairo, cmd->x, cmd->y); cairo_line_to(cairo, cmd->x, cmd->y2); cairo_line_to(cairo, cmd->x2, cmd->y2); cairo_line_to(cairo, cmd->x2, cmd->y); cairo_close_path(cairo); if (cmd->fill) cairo_fill(cairo); break; case POLYGON: if (!cmd->xy) break; for (j=0; j<dl_size(cmd->xy)/2; j++) (j == 0 ? cairo_move_to : cairo_line_to)(cairo, dl_get(cmd->xy, 2*j+0), dl_get(cmd->xy, 2*j+1)); if (cmd->fill) cairo_fill(cairo); break; } cairo_stroke(cairo); } } for (i=0; i<bl_size(pargs->cairocmds); i++) { cairocmd_t* cmd = bl_access(pargs->cairocmds, i); cairocmd_clear(cmd); } bl_remove_all(pargs->cairocmds); return 0; } static void plot_builtin_free(plot_args_t* pargs, void* baton) { anwcs_free(pargs->wcs); bl_free(pargs->cairocmds); } //static const plotter_t builtin = { "plot", plot_builtin_init, plot_builtin_init2, plot_builtin_command, plot_builtin_plot, plot_builtin_free, NULL }; DECLARE_PLOTTER(builtin) { DEFINE_PLOTTER_BODY(builtin) p->init2 = plot_builtin_init2; } int parse_image_format(const char* fmt) { if (strcaseeq(fmt, "png")) { return PLOTSTUFF_FORMAT_PNG; } else if (strcaseeq(fmt, "jpg") || strcaseeq(fmt, "jpeg")) { return PLOTSTUFF_FORMAT_JPG; } else if (strcaseeq(fmt, "ppm")) { return PLOTSTUFF_FORMAT_PPM; } else if (strcaseeq(fmt, "pdf")) { return PLOTSTUFF_FORMAT_PDF; } else if (strcaseeq(fmt, "fits") || strcaseeq(fmt, "fit")) { return PLOTSTUFF_FORMAT_FITS; } ERROR("Unknown image format \"%s\"", fmt); return -1; } int guess_image_format_from_filename(const char* fn) { // look for "." int len = strlen(fn); if (len >= 4 && fn[len-4] == '.') { return parse_image_format(fn + len - 3); } if (len >= 5 && fn[len - 5] == '.') { return parse_image_format(fn + len - 4); } return 0; } const char* image_format_name_from_code(int code) { if (code == PLOTSTUFF_FORMAT_JPG) return "jpeg"; if (code == PLOTSTUFF_FORMAT_PNG) return "png"; if (code == PLOTSTUFF_FORMAT_PPM) return "ppm"; if (code == PLOTSTUFF_FORMAT_PDF) return "pdf"; if (code == PLOTSTUFF_FORMAT_FITS) return "fits"; if (code == PLOTSTUFF_FORMAT_MEMIMG) return "memory"; return "unknown"; } int plotstuff_set_color(plot_args_t* pargs, const char* name) { logverb("setting color to \"%s\"\n", name); return parse_color_rgba(name, pargs->rgba); } float plotstuff_get_alpha(const plot_args_t* pargs) { return pargs->rgba[3]; } int plotstuff_set_alpha(plot_args_t* pargs, float alpha) { pargs->rgba[3] = alpha; return 0; } int plotstuff_set_bgcolor(plot_args_t* pargs, const char* name) { return parse_color_rgba(name, pargs->bg_rgba); } int plotstuff_set_bgrgba2(plot_args_t* pargs, float r, float g, float b, float a) { pargs->bg_rgba[0] = r; pargs->bg_rgba[1] = g; pargs->bg_rgba[2] = b; pargs->bg_rgba[3] = a; return 0; } int plotstuff_set_rgba(plot_args_t* pargs, const float* rgba) { pargs->rgba[0] = rgba[0]; pargs->rgba[1] = rgba[1]; pargs->rgba[2] = rgba[2]; pargs->rgba[3] = rgba[3]; return 0; } int plotstuff_set_rgba2(plot_args_t* pargs, float r, float g, float b, float a) { pargs->rgba[0] = r; pargs->rgba[1] = g; pargs->rgba[2] = b; pargs->rgba[3] = a; return 0; } int plotstuff_init(plot_args_t* pargs) { int i; memset(pargs, 0, sizeof(plot_args_t)); /* plotters[0] = builtin; plotters[1] = plotter_fill; plotters[2] = plotter_xy; plotters[3] = plotter_image; plotters[4] = plotter_annotations; plotters[5] = plotter_grid; plotters[6] = plotter_outline; plotters[7] = plotter_index; plotters[8] = plotter_radec; plotters[9] = plotter_healpix; plotters[10] = plotter_match; */ pargs->NP = 11; pargs->plotters = calloc(pargs->NP, sizeof(plotter_t)); /* pargs->plotters[0] = builtin_new(); pargs->plotters[1] = plot_fill_new(); pargs->plotters[2] = plot_xy_new(); pargs->plotters[3] = plot_image_new(); pargs->plotters[4] = plot_annotations_new(); pargs->plotters[5] = plot_grid_new(); pargs->plotters[6] = plot_outline_new(); pargs->plotters[7] = plot_index_new(); pargs->plotters[8] = plot_radec_new(); pargs->plotters[9] = plot_healpix_new(); pargs->plotters[10] = plot_match_new(); */ //builtin_describe(pargs->plotters + 0); plot_builtin_describe (pargs->plotters + 0); plot_fill_describe (pargs->plotters + 1); plot_xy_describe (pargs->plotters + 2); plot_image_describe (pargs->plotters + 3); plot_annotations_describe(pargs->plotters + 4); plot_grid_describe (pargs->plotters + 5); plot_outline_describe (pargs->plotters + 6); plot_index_describe (pargs->plotters + 7); plot_radec_describe (pargs->plotters + 8); plot_healpix_describe (pargs->plotters + 9); plot_match_describe (pargs->plotters + 10); // First init for (i=0; i<pargs->NP; i++) pargs->plotters[i].baton = pargs->plotters[i].init(pargs); return 0; } int plotstuff_init2(plot_args_t* pargs) { int i; logverb("Creating drawing surface (%ix%i)\n", pargs->W, pargs->H); // Allocate cairo surface switch (pargs->outformat) { case PLOTSTUFF_FORMAT_PDF: if (pargs->outfn) { pargs->fout = fopen(pargs->outfn, "wb"); if (!pargs->fout) { SYSERROR("Failed to open output file \"%s\"", pargs->outfn); return -1; } } pargs->target = cairo_pdf_surface_create_for_stream(cairoutils_file_write_func, pargs->fout, pargs->W, pargs->H); break; case PLOTSTUFF_FORMAT_JPG: case PLOTSTUFF_FORMAT_PPM: case PLOTSTUFF_FORMAT_PNG: case PLOTSTUFF_FORMAT_MEMIMG: pargs->target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, pargs->W, pargs->H); break; default: ERROR("Unknown output format %i", pargs->outformat); return -1; break; } pargs->cairo = cairo_create(pargs->target); /* D'oh, this flips the coord sys, but not text! // Flip the cairo reference frame (make 0,0 the bottom-left) cairo_scale(pargs->cairo, 1.0, -1.0); // FIXME -- could deal with 0.5 issues here! cairo_translate(pargs->cairo, 0.0, -pargs->H); */ for (i=0; i<pargs->NP; i++) { if (pargs->plotters[i].init2 && pargs->plotters[i].init2(pargs, pargs->plotters[i].baton)) { ERROR("Plot initializer failed"); exit(-1); } } return 0; } void* plotstuff_get_config(plot_args_t* pargs, const char* name) { int i; for (i=0; i<pargs->NP; i++) { if (streq(pargs->plotters[i].name, name)) return pargs->plotters[i].baton; } return NULL; } double plotstuff_pixel_scale(plot_args_t* pargs) { if (!pargs->wcs) { ERROR("plotstuff_pixel_scale: No WCS defined!"); return 0.0; } return anwcs_pixel_scale(pargs->wcs); } anbool plotstuff_radec2xy(plot_args_t* pargs, double ra, double dec, double* x, double* y) { if (!pargs->wcs) { ERROR("No WCS defined!"); return FALSE; } return (anwcs_radec2pixelxy(pargs->wcs, ra, dec, x, y) ? FALSE : TRUE); } anbool plotstuff_xy2radec(plot_args_t* pargs, double x, double y, double* pra, double* pdec) { if (!pargs->wcs) { ERROR("No WCS defined!"); return FALSE; } return (anwcs_pixelxy2radec(pargs->wcs, x, y, pra, pdec) ? FALSE : TRUE); } anbool plotstuff_radec_is_inside_image(plot_args_t* pargs, double ra, double dec) { if (!pargs->wcs) { ERROR("No WCS defined!"); return FALSE; } return anwcs_radec_is_inside_image(pargs->wcs, ra, dec); } void plotstuff_get_radec_bounds(const plot_args_t* pargs, int stepsize, double* pramin, double* pramax, double* pdecmin, double* pdecmax) { if (!pargs->wcs) { ERROR("No WCS defined!"); return; } return anwcs_get_radec_bounds(pargs->wcs, stepsize, pramin, pramax, pdecmin, pdecmax); } int ATTRIB_FORMAT(printf,2,3) plotstuff_run_commandf(plot_args_t* pargs, const char* format, ...) { char* str; va_list va; int rtn; va_start(va, format); if (vasprintf(&str, format, va) == -1) { ERROR("Failed to allocate temporary string to hold command"); return -1; } rtn = plotstuff_run_command(pargs, str); va_end(va); return rtn; } int plotstuff_plot_layer(plot_args_t* pargs, const char* layer) { int i; for (i=0; i<pargs->NP; i++) { if (streq(layer, pargs->plotters[i].name)) { if (!pargs->cairo) { if (plotstuff_init2(pargs)) { return -1; } } if (pargs->plotters[i].doplot) { if (pargs->plotters[i].doplot(layer, pargs->cairo, pargs, pargs->plotters[i].baton)) { ERROR("Plotter \"%s\" failed on command \"%s\"", pargs->plotters[i].name, layer); return -1; } else return 0; } } } return -1; } int plotstuff_run_command(plot_args_t* pargs, const char* cmd) { int i; anbool matched = FALSE; if (!cmd || (strlen(cmd) == 0) || (cmd[0] == '#')) { return 0; } if (!plotstuff_plot_layer(pargs, cmd)) { return 0; } for (i=0; i<pargs->NP; i++) { if (starts_with(cmd, pargs->plotters[i].name)) { char* cmdcmd; char* cmdargs; if (!split_string_once(cmd, " ", &cmdcmd, &cmdargs)) { //ERROR("Failed to split command \"%s\" into words\n", cmd); //return -1; cmdcmd = strdup(cmd); cmdargs = NULL; } logmsg("Command \"%s\", args \"%s\"\n", cmdcmd, cmdargs); if (pargs->plotters[i].command(cmdcmd, cmdargs, pargs, pargs->plotters[i].baton)) { ERROR("Plotter \"%s\" failed on command \"%s\"", pargs->plotters[i].name, cmd); return -1; } free(cmdcmd); free(cmdargs); } else continue; matched = TRUE; break; } if (!matched) { ERROR("Did not find a plotter for command \"%s\"", cmd); return -1; } return 0; } int plotstuff_read_and_run_command(plot_args_t* pargs, FILE* f) { char* cmd; int rtn; cmd = read_string_terminated(stdin, "\n\r\0", 3, FALSE); logverb("command: \"%s\"\n", cmd); if (!cmd || feof(f)) { free(cmd); return -1; } rtn = plotstuff_run_command(pargs, cmd); free(cmd); return rtn; } int plotstuff_output(plot_args_t* pargs) { switch (pargs->outformat) { case PLOTSTUFF_FORMAT_PDF: cairo_surface_flush(pargs->target); cairo_surface_finish(pargs->target); cairoutils_surface_status_errors(pargs->target); cairoutils_cairo_status_errors(pargs->cairo); if (pargs->outfn) { if (fclose(pargs->fout)) { SYSERROR("Failed to close output file \"%s\"", pargs->outfn); return -1; } } break; case PLOTSTUFF_FORMAT_JPG: case PLOTSTUFF_FORMAT_PPM: case PLOTSTUFF_FORMAT_PNG: case PLOTSTUFF_FORMAT_MEMIMG: { int res; unsigned char* img = cairo_image_surface_get_data(pargs->target); // Convert image for output... cairoutils_argb32_to_rgba(img, pargs->W, pargs->H); if (pargs->outformat == PLOTSTUFF_FORMAT_MEMIMG) { pargs->outimage = img; res = 0; img = NULL; } else if (pargs->outformat == PLOTSTUFF_FORMAT_JPG) { res = cairoutils_write_jpeg(pargs->outfn, img, pargs->W, pargs->H); } else if (pargs->outformat == PLOTSTUFF_FORMAT_PPM) { res = cairoutils_write_ppm(pargs->outfn, img, pargs->W, pargs->H); } else if (pargs->outformat == PLOTSTUFF_FORMAT_PNG) { res = cairoutils_write_png(pargs->outfn, img, pargs->W, pargs->H); } else { res=-1; // for gcc assert(0); } if (res) ERROR("Failed to write output image"); if (img) // Convert image back... cairoutils_rgba_to_argb32(img, pargs->W, pargs->H); return res; } break; default: ERROR("Unknown output format."); return -1; } return 0; } void plotstuff_get_maximum_rgba(plot_args_t* pargs, int* p_r, int* p_g, int* p_b, int* p_a) { int i, r, g, b, a; uint32_t* ipix = (uint32_t*)cairo_image_surface_get_data(pargs->target); r = g = b = a = 0; for (i=0; i<(pargs->W * pargs->H); i++) { a = MAX(a, (ipix[i] >> 24) & 0xff); r = MAX(r, (ipix[i] >> 16) & 0xff); g = MAX(g, (ipix[i] >> 8) & 0xff); b = MAX(b, (ipix[i] ) & 0xff); } if (p_r) *p_r = r; if (p_g) *p_g = g; if (p_b) *p_b = b; if (p_a) *p_a = a; } void plotstuff_free(plot_args_t* pargs) { int i; for (i=0; i<pargs->NP; i++) { pargs->plotters[i].free(pargs, pargs->plotters[i].baton); } cairo_destroy(pargs->cairo); cairo_surface_destroy(pargs->target); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotstuff.i���������������������������������������������������������������000644 �000765 �000024 �00000026126 12651445460 020065� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ %module(package="astrometry.blind") plotstuff_c %include <typemaps.i> %import "util.i" #undef ATTRIB_FORMAT #define ATTRIB_FORMAT(x,y,z) #undef WarnUnusedResult #define WarnUnusedResult %{ #include "numpy/arrayobject.h" #include <stdlib.h> #include <math.h> #include "os-features.h" #include "plotstuff.h" #include "plotimage.h" #include "plotoutline.h" #include "plotgrid.h" #include "plotindex.h" #include "plotxy.h" #include "plotradec.h" #include "plotmatch.h" #include "plotannotations.h" #include "plothealpix.h" #include "sip.h" #include "sip-utils.h" #include "sip_qfits.h" #include "log.h" #include "fitsioutils.h" #include "anwcs.h" #include "coadd.h" #include "anqfits.h" #include "mathutil.h" #include "convolve-image.h" #include "resample.h" #include "cairoutils.h" #include "an-bool.h" #define true 1 #define false 0 %} %apply double *OUTPUT { double *pramin, double *pramax, double *pdecmin, double *pdecmax }; %apply double *OUTPUT { double *pra, double *pdec }; %apply double *OUTPUT { double *pradius }; %apply double *OUTPUT { double *pra, double *pdec, double *pradius }; %apply double *OUTPUT { double *p_x, double *p_y }; %apply int *OUTPUT { int* p_r, int* p_g, int* p_b, int* p_a }; %include "plotstuff.h" %include "coadd.h" %include "qfits_image.h" %include "fitsioutils.h" %include "convolve-image.h" /* number* coadd_create_weight_image_from_range(const number* img, int W, int H, number lowval, number highval); */ %inline %{ PyObject* c_image_numpy_view(float* data, int nx, int ny) { npy_intp dims[2]; dims[0] = ny; dims[1] = nx; return PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, data); //PyArray_NewFromDescr(PyTypeObject* subtype, PyArray_Descr* descr, int nd, npy_intp* dims, npy_intp* strides, void* data, int flags, PyObject* obj) } %} %pythoncode %{ def qfits_load_image(fn, ext=1, plane=0, map=1, ptype=PTYPE_FLOAT): ld = qfitsloader() ld.filename = fn ld.xtnum = ext ld.pnum = plane ld.map = map ld.ptype = ptype if qfitsloader_init(ld): raise RuntimeError('qfitsloader_init(file "%s", ext %i) failed' % (fn, ext)) if qfits_loadpix(ld): raise RuntimeError('qfits_loadpix(file "%s", ext %i) failed' % (fn, ext)) class qfits_image(object): def __init__(self, pix, nx, ny, ld): self.pix = pix self.nx = nx self.ny = ny self.ld = ld def __del__(self): qfitsloader_free_buffer(self.ld) return qfits_image(ld.fbuf, ld.lx, ld.ly, ld) %} void free(void* ptr); %apply int* OUTPUT { int* newW, int* newH }; #define Const #define InlineDeclare %include "mathutil.h" #undef Const #undef InlineDeclare /* Set the input argument to point to a temporary variable */ %typemap(in, numinputs=0) unsigned char* rgbout (unsigned char temp[3]) { $1 = temp; } %typemap(argout) unsigned char* rgbout { // Append output value $1 to $result if (result) { Py_DECREF($result); $result = Py_None; } else { int i; Py_DECREF($result); $result = PyList_New(3); for (i=0; i<3; i++) { PyObject *o = PyInt_FromLong((long)$1[i]); PyList_SetItem($result,i,o); } } } %typemap(in) int rgb[3] (int temp[3]) { int i; // Convert sequence of ints to int[3] if (!PySequence_Check($input) || (PySequence_Length($input) != 3)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence of length 3"); return NULL; } for (i=0; i<3; i++) { PyObject *o = PySequence_GetItem($input, i); if (PyNumber_Check(o)) { temp[i] = (int)PyInt_AsLong(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } $1 = temp; } %include "plotimage.h" %include "plotoutline.h" %include "plotgrid.h" %include "plotindex.h" %include "plotxy.h" %include "plotradec.h" %include "plotmatch.h" %include "plotannotations.h" %include "plothealpix.h" %include "sip.h" %include "sip_qfits.h" %include "sip-utils.h" %include "anwcs.h" %init %{ import_array(); %} // HACK! enum cairo_op { CAIRO_OPERATOR_CLEAR, CAIRO_OPERATOR_SOURCE, CAIRO_OPERATOR_OVER, CAIRO_OPERATOR_IN, CAIRO_OPERATOR_OUT, CAIRO_OPERATOR_ATOP, CAIRO_OPERATOR_DEST, CAIRO_OPERATOR_DEST_OVER, CAIRO_OPERATOR_DEST_IN, CAIRO_OPERATOR_DEST_OUT, CAIRO_OPERATOR_DEST_ATOP, CAIRO_OPERATOR_XOR, CAIRO_OPERATOR_ADD, CAIRO_OPERATOR_SATURATE }; typedef enum cairo_op cairo_operator_t; %{ sip_t* new_sip_t(double crpix1, double crpix2, double crval1, double crval2, double cd11, double cd12, double cd21, double cd22) { sip_t* sip = sip_create(); tan_t* tan = &(sip->wcstan); tan->crpix[0] = crpix1; tan->crpix[1] = crpix2; tan->crval[0] = crval1; tan->crval[1] = crval2; tan->cd[0][0] = cd11; tan->cd[0][1] = cd12; tan->cd[1][0] = cd21; tan->cd[1][1] = cd22; return sip; } %} %extend sip_t { sip_t(double, double, double, double, double, double, double, double); double crval1() { return self->wcstan.crval[0]; } double crval2() { return self->wcstan.crval[1]; } double crpix1() { return self->wcstan.crpix[0]; } double crpix2() { return self->wcstan.crpix[1]; } double cd11() { return self->wcstan.cd[0][0]; } double cd12() { return self->wcstan.cd[0][1]; } double cd21() { return self->wcstan.cd[1][0]; } double cd22() { return self->wcstan.cd[1][1]; } } %inline %{ void image_debug(float* img, int W, int H) { int i; double mn,mx; mn = 1e300; mx = -1e300; for (i=0; i<(W*H); i++) { mn = MIN(mn, img[i]); mx = MAX(mx, img[i]); } logmsg("Image min,max %g,%g\n", mn,mx); } void image_add(float* img, int W, int H, float val) { int i; for (i=0; i<(W*H); i++) img[i] += val; } void image_weighted_smooth(float* img, int W, int H, const float* weight, float sigma) { int K0, NK; float* kernel = convolve_get_gaussian_kernel_f(sigma, 5., &K0, &NK); convolve_separable_weighted_f(img, W, H, weight, kernel, K0, NK, img, NULL); free(kernel); } %} %extend plot_args { PyObject* view_image_as_numpy() { npy_intp dim[3]; unsigned char* img; PyObject* npimg; dim[0] = self->H; dim[1] = self->W; dim[2] = 4; img = cairo_image_surface_get_data(self->target); npimg = PyArray_SimpleNewFromData(3, dim, NPY_UBYTE, img); return npimg; } PyObject* get_image_as_numpy(int flip, PyObject* out) { npy_intp dim[3]; unsigned char* img; PyObject* npimg; dim[0] = self->H; dim[1] = self->W; dim[2] = 4; img = cairo_image_surface_get_data(self->target); // Possible memory problems here... if (out == Py_None || out == NULL) { npimg = PyArray_EMPTY(3, dim, NPY_UBYTE, 0); assert(npimg); } else { npimg = out; } if (flip) { cairoutils_argb32_to_rgba_flip(img, PyArray_DATA(npimg), self->W, self->H); } else { cairoutils_argb32_to_rgba_2(img, PyArray_DATA(npimg), self->W, self->H); } return npimg; } int set_image_from_numpy(PyObject* npimg, int flip) { unsigned char* img; unsigned char* inimg; PyArray_Descr* dtype = PyArray_DescrFromType(PyArray_UBYTE); int req = NPY_C_CONTIGUOUS | NPY_ALIGNED; if ((PyArray_DIM(npimg, 0) != self->H) || (PyArray_DIM(npimg, 1) != self->W) || (PyArray_DIM(npimg, 2) != 4)) { PyErr_SetString(PyExc_ValueError, "Expected image with shape (H, W, 4)"); return -1; } Py_INCREF(dtype); npimg = PyArray_FromAny(npimg, dtype, 3, 3, req, NULL); if (!npimg) { PyErr_SetString(PyExc_ValueError, "img wasn't the type expected"); Py_DECREF(dtype); return -1; } inimg = PyArray_DATA(npimg); img = cairo_image_surface_get_data(self->target); if (flip) { cairoutils_rgba_to_argb32_flip(inimg, img, self->W, self->H); } else { cairoutils_rgba_to_argb32_2(inimg, img, self->W, self->H); } Py_DECREF(npimg); Py_DECREF(dtype); return 0; } int set_wcs_file(const char* fn, int ext) { return plotstuff_set_wcs_file(self, fn, ext); } int set_size_from_wcs() { return plotstuff_set_size_wcs(self); } void loginit(int level) { log_init(level); } } %extend annotation_args { void add_target(double ra, double dec, const char* name) { plot_annotations_add_target(self, ra, dec, name); } void add_named_target(const char* name) { plot_annotations_add_named_target(self, name); } } %extend plotgrid_args { int set_formats(const char* raformat, const char* decformat) { return plot_grid_set_formats(self, raformat, decformat); } } %extend plotoutline_args { int set_wcs_file(const char* fn, int ext) { return plot_outline_set_wcs_file(self, fn, ext); } int set_wcs_size(int W, int H) { return plot_outline_set_wcs_size(self, W, H); } } %pythoncode %{ def plotoutline_setattr(self, name, val): #print 'plotoutline_setattr', name, '=', val if name == 'wcs_file': if type(val) is tuple: (fn,ext) = val else: fn = val ext = 0 #print 'setting outline wcs file %s, ext %i' % (fn, ext) plot_outline_set_wcs_file(self, fn, ext) return self.__swig__setattr__(name, val) plotoutline_args.__swig__setattr__ = plotoutline_args.__setattr__ plotoutline_args.__setattr__ = plotoutline_setattr %} %extend plotimage_args { int _set_image_from_numpy(PyObject* arr) { // Pirate array PyObject* yarr; int hasalpha = 0; int i, N; unsigned char* src; // MAGIC 3: min_depth and max_depth (number of dims) yarr = PyArray_FROMANY(arr, NPY_UBYTE, 3, 3, NPY_C_CONTIGUOUS | NPY_ALIGNED); if (!yarr) { PyErr_SetString(PyExc_ValueError, "Array must be 3-dimensional ubyte"); return -1; } switch (PyArray_DIM(yarr, 2)) { // RGB case 3: hasalpha = 0; break; // RGBA case 4: hasalpha = 1; break; default: PyErr_SetString(PyExc_ValueError, "Array must be RGB or RGBA"); return -1; } src = PyArray_DATA(yarr); if (self->img) { free(self->img); } self->H = (int)PyArray_DIM(yarr, 0); self->W = (int)PyArray_DIM(yarr, 1); //printf("Allocating new %i x %i image\n", self->W, self->H); self->img = malloc(self->W * self->H * 4); N = self->W * self->H; for (i=0; i<N; i++) { if (hasalpha) memcpy(self->img + 4*i, src + 4*i, 4); else { memcpy(self->img + 4*i, src + 3*i, 3); self->img[4*i+3] = 255; } } Py_DECREF(yarr); return 0; } int set_wcs_file(const char* fn, int ext) { return plot_image_set_wcs(self, fn, ext); } int set_file(const char* fn) { return plot_image_set_filename(self, fn); } void set_rgbscale(double r, double g, double b) { self->rgbscale[0] = r; self->rgbscale[1] = g; self->rgbscale[2] = b; } int get_image_width() { int W; if (plot_image_getsize(self, &W, NULL)) { return -1; } return W; } int get_image_height() { int H; if (plot_image_getsize(self, NULL, &H)) { return -1; } return H; } } %pythoncode %{ def plotimage_set_image_from_numpy(self, img): rtn = self._set_image_from_numpy(img) if rtn: raise RuntimeError('set_image_from_numpy() failed') plotimage_args.set_image_from_numpy = plotimage_set_image_from_numpy %} %extend plotindex_args { int add_file(const char* fn) { return plot_index_add_file(self, fn); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotstuff.py��������������������������������������������������������������000644 �000765 �000024 �00000016610 12651445460 020262� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from plotstuff_c import * # Could consider using swig's "addmethods" mechanism to create this "class" rep. class Plotstuff(object): format_map = {'png': PLOTSTUFF_FORMAT_PNG, 'jpg': PLOTSTUFF_FORMAT_JPG, 'ppm': PLOTSTUFF_FORMAT_PPM, 'pdf': PLOTSTUFF_FORMAT_PDF, 'fits': PLOTSTUFF_FORMAT_FITS, } def __init__(self, outformat=None, size=None, ra=None, dec=None, width=None, rdw=None, wcsfn=None, wcsext=0, alpha=1.): p = plotstuff_new() self.pargs = p if outformat is not None: outformat = Plotstuff.format_map.get(outformat, outformat) self.outformat = outformat if size is not None: self.size = size self.color = 'black' self.alpha = alpha self.plot('fill') if ra is not None and dec is not None and width is not None: self.set_wcs_box(ra, dec, width) if rdw is not None: self.set_wcs_box(*rdw) if wcsfn is not None: self.wcs_file = (wcsfn, wcsext) if size is None: plotstuff_set_size_wcs(self.pargs) def __del__(self): #print 'plotstuff.__del__, pargs=', self.pargs plotstuff_free(self.pargs) def __getattr__(self, name): if name == 'xy': return plot_xy_get(self.pargs) elif name == 'index': return plot_index_get(self.pargs) elif name == 'radec': return plot_radec_get(self.pargs) elif name == 'match': return plot_match_get(self.pargs) elif name == 'image': return plot_image_get(self.pargs) elif name == 'outline': return plot_outline_get(self.pargs) elif name == 'grid': return plot_grid_get(self.pargs) elif name in ['ann', 'annotations']: return plot_annotations_get(self.pargs) elif name == 'healpix': return plot_healpix_get(self.pargs) return self.pargs.__getattr__(name) def __setattr__(self, name, val): if name == 'pargs': #print 'plotstuff.py: setting pargs to', val self.__dict__[name] = val elif name == 'size': #print 'plotstuff.py: setting plot size of', self.pargs, 'to %i,%i' % (val[0], val[1]) plotstuff_set_size(self.pargs, val[0], val[1]) elif name == 'color': #print 'plotstuff.py: setting color to "%s"' % val self.set_color(val) elif name == 'rgb': plotstuff_set_rgba2(self.pargs, val[0], val[1], val[2], plotstuff_get_alpha(self.pargs)) elif name == 'bg_rgba': plotstuff_set_bgrgba2(self.pargs, val[0], val[1], val[2], val[3]) elif name == 'bg_box': self.pargs.bg_box = val elif name == 'rgba': plotstuff_set_rgba2(self.pargs, val[0], val[1], val[2], val[3]) elif name == 'alpha': self.set_alpha(val) elif name == 'lw': self.pargs.lw = float(val) elif name == 'marker' and type(val) is str: plotstuff_set_marker(self.pargs, val) elif name == 'markersize': plotstuff_set_markersize(self.pargs, val) elif name == 'wcs_file': if type(val) is tuple: plotstuff_set_wcs_file(self.pargs, *val) else: plotstuff_set_wcs_file(self.pargs, val, 0) elif name == 'wcs': plotstuff_set_wcs(self.pargs, val) elif name == 'wcs_tan': plotstuff_set_wcs_tan(self.pargs, val) elif name == 'wcs_sip': plotstuff_set_wcs_sip(self.pargs, val) elif name == 'text_bg_alpha': plotstuff_set_text_bg_alpha(self.pargs, val) #elif name == 'operator': # print 'val:', val # self.pargs.op = val else: self.pargs.__setattr__(name, val) def line_constant_ra(self, ra, declo, dechi, startwithmove=True): return plotstuff_line_constant_ra(self.pargs, ra, declo, dechi, startwithmove) def line_constant_dec(self, dec, ralo, rahi): return plotstuff_line_constant_dec(self.pargs, dec, ralo, rahi) def line_constant_dec2(self, dec, ralo, rahi, rastep): return plotstuff_line_constant_dec2(self.pargs, dec, ralo, rahi, rastep) def fill(self): return plotstuff_fill(self.pargs) #return self.plot('fill') def stroke(self): return plotstuff_stroke(self.pargs) def fill_preserve(self): return plotstuff_fill_preserve(self.pargs) def stroke_preserve(self): return plotstuff_stroke_preserve(self.pargs) def move_to_radec(self, ra, dec): return plotstuff_move_to_radec(self.pargs, ra, dec) def line_to_radec(self, ra, dec): return plotstuff_line_to_radec(self.pargs, ra, dec) def move_to_xy(self, x, y): plotstuff_move_to(self.pargs, x, y) def line_to_xy(self, x, y): plotstuff_line_to(self.pargs, x, y) def close_path(self): return plotstuff_close_path(self.pargs) def dashed(self, dashlen): plotstuff_set_dashed(self.pargs, dashlen) def solid(self): plotstuff_set_solid(self.pargs) def set_size_from_wcs(self): self.pargs.set_size_from_wcs() def polygon(self, xy, makeConvex=True): import numpy as np if makeConvex: cx = sum(x for x,y in xy) / float(len(xy)) cy = sum(y for x,y in xy) / float(len(xy)) angles = np.array([np.arctan2(y - cy, x - cx) for x,y in xy]) I = np.argsort(angles) else: I = np.arange(len(xy)) for j,i in enumerate(I): x,y = xy[i] if j == 0: self.move_to_xy(x, y) else: self.line_to_xy(x, y) def get_image_as_numpy(self, flip=False, out=None): # Caution: possible memory-handling problem with using "out" return self.pargs.get_image_as_numpy(flip, out) def set_image_from_numpy(self, img, flip=False): self.pargs.set_image_from_numpy(img, flip) def view_image_as_numpy(self): return self.pargs.view_image_as_numpy() def apply_settings(self): plotstuff_builtin_apply(self.pargs.cairo, self.pargs) def plot(self, layer): return plotstuff_plot_layer(self.pargs, layer) def scale_wcs(self, scale): plotstuff_scale_wcs(self.pargs, scale) def rotate_wcs(self, angle): plotstuff_rotate_wcs(self.pargs, angle) def set_wcs_box(self, ra, dec, width): plotstuff_set_wcs_box(self.pargs, ra, dec, width) def set_color(self, color): #print 'calling plotstuff_set_color(., \"%s\")' % color x = plotstuff_set_color(self.pargs, color) return x def set_alpha(self, a): x = plotstuff_set_alpha(self.pargs, a) def plot_grid(self, rastep, decstep, ralabelstep=None, declabelstep=None): import numpy as np grid = plot_grid_get(self.pargs) grid.rastep = rastep grid.decstep = decstep rformat = None if ralabelstep is None: ralabelstep = 0 else: rdigits = max(0, np.ceil(-np.log10(ralabelstep))) rformat = '%.' + '%i'%rdigits + 'f' dformat = None if declabelstep is None: declabelstep = 0 else: ddigits = max(0, np.ceil(-np.log10(declabelstep))) dformat = '%.' + '%i'%ddigits + 'f' if rformat is not None or dformat is not None: rformat = rformat or '%.2f' dformat = dformat or '%.2f' grid.set_formats(rformat, dformat) grid.ralabelstep = ralabelstep grid.declabelstep = declabelstep self.plot('grid') def clear(self): plotstuff_clear(self.pargs) def write(self, filename=None): if filename is not None: self.outfn = filename plotstuff_output(self.pargs) def text_xy(self, x, y, text): plotstuff_text_xy(self.pargs, x, y, text) def text_radec(self, ra, dec, text): plotstuff_text_radec(self.pargs, ra, dec, text) def stack_marker(self, x, y): plotstuff_stack_marker(self.pargs, x, y) def marker_xy(self, x,y): rtn = plotstuff_marker(self.pargs, x,y) def marker_radec(self, ra, dec): #print 'marker_radec', ra, dec rtn = plotstuff_marker_radec(self.pargs, ra, dec) #print '-> ', rtn def set_markersize(self, size): plotstuff_set_markersize(self.pargs, size) def plot_stack(self): plotstuff_plot_stack(self.pargs, self.pargs.cairo) ������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotstuff_c.py������������������������������������������������������������000644 �000765 �000024 �00000245347 12651446355 020603� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file was automatically generated by SWIG (http://www.swig.org). # Version 3.0.7 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. from sys import version_info if version_info >= (2, 6, 0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_plotstuff_c', [dirname(__file__)]) except ImportError: import _plotstuff_c return _plotstuff_c if fp is not None: try: _mod = imp.load_module('_plotstuff_c', fp, pathname, description) finally: fp.close() return _mod _plotstuff_c = swig_import_helper() del swig_import_helper else: import _plotstuff_c del version_info try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self, class_type, name, value, static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'SwigPyObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name, None) if method: return method(self, value) if (not static): if _newclass: object.__setattr__(self, name, value) else: self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self, class_type, name, value): return _swig_setattr_nondynamic(self, class_type, name, value, 0) def _swig_getattr_nondynamic(self, class_type, name, static=1): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name, None) if method: return method(self) if (not static): return object.__getattr__(self, name) else: raise AttributeError(name) def _swig_getattr(self, class_type, name): return _swig_getattr_nondynamic(self, class_type, name, 0) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) try: _object = object _newclass = 1 except AttributeError: class _object: pass _newclass = 0 import astrometry.util.util _plotstuff_c.PLOTSTUFF_FORMAT_JPG_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_JPG = _plotstuff_c.PLOTSTUFF_FORMAT_JPG _plotstuff_c.PLOTSTUFF_FORMAT_PNG_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_PNG = _plotstuff_c.PLOTSTUFF_FORMAT_PNG _plotstuff_c.PLOTSTUFF_FORMAT_PPM_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_PPM = _plotstuff_c.PLOTSTUFF_FORMAT_PPM _plotstuff_c.PLOTSTUFF_FORMAT_PDF_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_PDF = _plotstuff_c.PLOTSTUFF_FORMAT_PDF _plotstuff_c.PLOTSTUFF_FORMAT_MEMIMG_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_MEMIMG = _plotstuff_c.PLOTSTUFF_FORMAT_MEMIMG _plotstuff_c.PLOTSTUFF_FORMAT_FITS_swigconstant(_plotstuff_c) PLOTSTUFF_FORMAT_FITS = _plotstuff_c.PLOTSTUFF_FORMAT_FITS class plot_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plot_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plot_args, name) __repr__ = _swig_repr __swig_setmethods__["plotters"] = _plotstuff_c.plot_args_plotters_set __swig_getmethods__["plotters"] = _plotstuff_c.plot_args_plotters_get if _newclass: plotters = _swig_property(_plotstuff_c.plot_args_plotters_get, _plotstuff_c.plot_args_plotters_set) __swig_setmethods__["NP"] = _plotstuff_c.plot_args_NP_set __swig_getmethods__["NP"] = _plotstuff_c.plot_args_NP_get if _newclass: NP = _swig_property(_plotstuff_c.plot_args_NP_get, _plotstuff_c.plot_args_NP_set) __swig_setmethods__["outfn"] = _plotstuff_c.plot_args_outfn_set __swig_getmethods__["outfn"] = _plotstuff_c.plot_args_outfn_get if _newclass: outfn = _swig_property(_plotstuff_c.plot_args_outfn_get, _plotstuff_c.plot_args_outfn_set) __swig_setmethods__["fout"] = _plotstuff_c.plot_args_fout_set __swig_getmethods__["fout"] = _plotstuff_c.plot_args_fout_get if _newclass: fout = _swig_property(_plotstuff_c.plot_args_fout_get, _plotstuff_c.plot_args_fout_set) __swig_setmethods__["outformat"] = _plotstuff_c.plot_args_outformat_set __swig_getmethods__["outformat"] = _plotstuff_c.plot_args_outformat_get if _newclass: outformat = _swig_property(_plotstuff_c.plot_args_outformat_get, _plotstuff_c.plot_args_outformat_set) __swig_setmethods__["outimage"] = _plotstuff_c.plot_args_outimage_set __swig_getmethods__["outimage"] = _plotstuff_c.plot_args_outimage_get if _newclass: outimage = _swig_property(_plotstuff_c.plot_args_outimage_get, _plotstuff_c.plot_args_outimage_set) __swig_setmethods__["cairo"] = _plotstuff_c.plot_args_cairo_set __swig_getmethods__["cairo"] = _plotstuff_c.plot_args_cairo_get if _newclass: cairo = _swig_property(_plotstuff_c.plot_args_cairo_get, _plotstuff_c.plot_args_cairo_set) __swig_setmethods__["target"] = _plotstuff_c.plot_args_target_set __swig_getmethods__["target"] = _plotstuff_c.plot_args_target_get if _newclass: target = _swig_property(_plotstuff_c.plot_args_target_get, _plotstuff_c.plot_args_target_set) __swig_setmethods__["op"] = _plotstuff_c.plot_args_op_set __swig_getmethods__["op"] = _plotstuff_c.plot_args_op_get if _newclass: op = _swig_property(_plotstuff_c.plot_args_op_get, _plotstuff_c.plot_args_op_set) __swig_setmethods__["move_to"] = _plotstuff_c.plot_args_move_to_set __swig_getmethods__["move_to"] = _plotstuff_c.plot_args_move_to_get if _newclass: move_to = _swig_property(_plotstuff_c.plot_args_move_to_get, _plotstuff_c.plot_args_move_to_set) __swig_setmethods__["move_to_baton"] = _plotstuff_c.plot_args_move_to_baton_set __swig_getmethods__["move_to_baton"] = _plotstuff_c.plot_args_move_to_baton_get if _newclass: move_to_baton = _swig_property(_plotstuff_c.plot_args_move_to_baton_get, _plotstuff_c.plot_args_move_to_baton_set) __swig_setmethods__["line_to"] = _plotstuff_c.plot_args_line_to_set __swig_getmethods__["line_to"] = _plotstuff_c.plot_args_line_to_get if _newclass: line_to = _swig_property(_plotstuff_c.plot_args_line_to_get, _plotstuff_c.plot_args_line_to_set) __swig_setmethods__["line_to_baton"] = _plotstuff_c.plot_args_line_to_baton_set __swig_getmethods__["line_to_baton"] = _plotstuff_c.plot_args_line_to_baton_get if _newclass: line_to_baton = _swig_property(_plotstuff_c.plot_args_line_to_baton_get, _plotstuff_c.plot_args_line_to_baton_set) __swig_setmethods__["wcs"] = _plotstuff_c.plot_args_wcs_set __swig_getmethods__["wcs"] = _plotstuff_c.plot_args_wcs_get if _newclass: wcs = _swig_property(_plotstuff_c.plot_args_wcs_get, _plotstuff_c.plot_args_wcs_set) __swig_setmethods__["W"] = _plotstuff_c.plot_args_W_set __swig_getmethods__["W"] = _plotstuff_c.plot_args_W_get if _newclass: W = _swig_property(_plotstuff_c.plot_args_W_get, _plotstuff_c.plot_args_W_set) __swig_setmethods__["H"] = _plotstuff_c.plot_args_H_set __swig_getmethods__["H"] = _plotstuff_c.plot_args_H_get if _newclass: H = _swig_property(_plotstuff_c.plot_args_H_get, _plotstuff_c.plot_args_H_set) __swig_setmethods__["rgba"] = _plotstuff_c.plot_args_rgba_set __swig_getmethods__["rgba"] = _plotstuff_c.plot_args_rgba_get if _newclass: rgba = _swig_property(_plotstuff_c.plot_args_rgba_get, _plotstuff_c.plot_args_rgba_set) __swig_setmethods__["lw"] = _plotstuff_c.plot_args_lw_set __swig_getmethods__["lw"] = _plotstuff_c.plot_args_lw_get if _newclass: lw = _swig_property(_plotstuff_c.plot_args_lw_get, _plotstuff_c.plot_args_lw_set) __swig_setmethods__["marker"] = _plotstuff_c.plot_args_marker_set __swig_getmethods__["marker"] = _plotstuff_c.plot_args_marker_get if _newclass: marker = _swig_property(_plotstuff_c.plot_args_marker_get, _plotstuff_c.plot_args_marker_set) __swig_setmethods__["markersize"] = _plotstuff_c.plot_args_markersize_set __swig_getmethods__["markersize"] = _plotstuff_c.plot_args_markersize_get if _newclass: markersize = _swig_property(_plotstuff_c.plot_args_markersize_get, _plotstuff_c.plot_args_markersize_set) __swig_setmethods__["bg_rgba"] = _plotstuff_c.plot_args_bg_rgba_set __swig_getmethods__["bg_rgba"] = _plotstuff_c.plot_args_bg_rgba_get if _newclass: bg_rgba = _swig_property(_plotstuff_c.plot_args_bg_rgba_get, _plotstuff_c.plot_args_bg_rgba_set) __swig_setmethods__["bg_lw"] = _plotstuff_c.plot_args_bg_lw_set __swig_getmethods__["bg_lw"] = _plotstuff_c.plot_args_bg_lw_get if _newclass: bg_lw = _swig_property(_plotstuff_c.plot_args_bg_lw_get, _plotstuff_c.plot_args_bg_lw_set) __swig_setmethods__["bg_box"] = _plotstuff_c.plot_args_bg_box_set __swig_getmethods__["bg_box"] = _plotstuff_c.plot_args_bg_box_get if _newclass: bg_box = _swig_property(_plotstuff_c.plot_args_bg_box_get, _plotstuff_c.plot_args_bg_box_set) __swig_setmethods__["fontsize"] = _plotstuff_c.plot_args_fontsize_set __swig_getmethods__["fontsize"] = _plotstuff_c.plot_args_fontsize_get if _newclass: fontsize = _swig_property(_plotstuff_c.plot_args_fontsize_get, _plotstuff_c.plot_args_fontsize_set) __swig_setmethods__["halign"] = _plotstuff_c.plot_args_halign_set __swig_getmethods__["halign"] = _plotstuff_c.plot_args_halign_get if _newclass: halign = _swig_property(_plotstuff_c.plot_args_halign_get, _plotstuff_c.plot_args_halign_set) __swig_setmethods__["valign"] = _plotstuff_c.plot_args_valign_set __swig_getmethods__["valign"] = _plotstuff_c.plot_args_valign_get if _newclass: valign = _swig_property(_plotstuff_c.plot_args_valign_get, _plotstuff_c.plot_args_valign_set) __swig_setmethods__["label_offset_x"] = _plotstuff_c.plot_args_label_offset_x_set __swig_getmethods__["label_offset_x"] = _plotstuff_c.plot_args_label_offset_x_get if _newclass: label_offset_x = _swig_property(_plotstuff_c.plot_args_label_offset_x_get, _plotstuff_c.plot_args_label_offset_x_set) __swig_setmethods__["label_offset_y"] = _plotstuff_c.plot_args_label_offset_y_set __swig_getmethods__["label_offset_y"] = _plotstuff_c.plot_args_label_offset_y_get if _newclass: label_offset_y = _swig_property(_plotstuff_c.plot_args_label_offset_y_get, _plotstuff_c.plot_args_label_offset_y_set) __swig_setmethods__["text_bg_layer"] = _plotstuff_c.plot_args_text_bg_layer_set __swig_getmethods__["text_bg_layer"] = _plotstuff_c.plot_args_text_bg_layer_get if _newclass: text_bg_layer = _swig_property(_plotstuff_c.plot_args_text_bg_layer_get, _plotstuff_c.plot_args_text_bg_layer_set) __swig_setmethods__["text_fg_layer"] = _plotstuff_c.plot_args_text_fg_layer_set __swig_getmethods__["text_fg_layer"] = _plotstuff_c.plot_args_text_fg_layer_get if _newclass: text_fg_layer = _swig_property(_plotstuff_c.plot_args_text_fg_layer_get, _plotstuff_c.plot_args_text_fg_layer_set) __swig_setmethods__["marker_fg_layer"] = _plotstuff_c.plot_args_marker_fg_layer_set __swig_getmethods__["marker_fg_layer"] = _plotstuff_c.plot_args_marker_fg_layer_get if _newclass: marker_fg_layer = _swig_property(_plotstuff_c.plot_args_marker_fg_layer_get, _plotstuff_c.plot_args_marker_fg_layer_set) __swig_setmethods__["cairocmds"] = _plotstuff_c.plot_args_cairocmds_set __swig_getmethods__["cairocmds"] = _plotstuff_c.plot_args_cairocmds_get if _newclass: cairocmds = _swig_property(_plotstuff_c.plot_args_cairocmds_get, _plotstuff_c.plot_args_cairocmds_set) __swig_setmethods__["linestep"] = _plotstuff_c.plot_args_linestep_set __swig_getmethods__["linestep"] = _plotstuff_c.plot_args_linestep_get if _newclass: linestep = _swig_property(_plotstuff_c.plot_args_linestep_get, _plotstuff_c.plot_args_linestep_set) def view_image_as_numpy(self): return _plotstuff_c.plot_args_view_image_as_numpy(self) def get_image_as_numpy(self, flip, out): return _plotstuff_c.plot_args_get_image_as_numpy(self, flip, out) def set_image_from_numpy(self, npimg, flip): return _plotstuff_c.plot_args_set_image_from_numpy(self, npimg, flip) def set_wcs_file(self, fn, ext): return _plotstuff_c.plot_args_set_wcs_file(self, fn, ext) def set_size_from_wcs(self): return _plotstuff_c.plot_args_set_size_from_wcs(self) def loginit(self, level): return _plotstuff_c.plot_args_loginit(self, level) def __init__(self): this = _plotstuff_c.new_plot_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plot_args __del__ = lambda self: None plot_args_swigregister = _plotstuff_c.plot_args_swigregister plot_args_swigregister(plot_args) class plotter(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotter, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotter, name) __repr__ = _swig_repr __swig_setmethods__["name"] = _plotstuff_c.plotter_name_set __swig_getmethods__["name"] = _plotstuff_c.plotter_name_get if _newclass: name = _swig_property(_plotstuff_c.plotter_name_get, _plotstuff_c.plotter_name_set) __swig_setmethods__["init"] = _plotstuff_c.plotter_init_set __swig_getmethods__["init"] = _plotstuff_c.plotter_init_get if _newclass: init = _swig_property(_plotstuff_c.plotter_init_get, _plotstuff_c.plotter_init_set) __swig_setmethods__["init2"] = _plotstuff_c.plotter_init2_set __swig_getmethods__["init2"] = _plotstuff_c.plotter_init2_get if _newclass: init2 = _swig_property(_plotstuff_c.plotter_init2_get, _plotstuff_c.plotter_init2_set) __swig_setmethods__["command"] = _plotstuff_c.plotter_command_set __swig_getmethods__["command"] = _plotstuff_c.plotter_command_get if _newclass: command = _swig_property(_plotstuff_c.plotter_command_get, _plotstuff_c.plotter_command_set) __swig_setmethods__["doplot"] = _plotstuff_c.plotter_doplot_set __swig_getmethods__["doplot"] = _plotstuff_c.plotter_doplot_get if _newclass: doplot = _swig_property(_plotstuff_c.plotter_doplot_get, _plotstuff_c.plotter_doplot_set) __swig_setmethods__["free"] = _plotstuff_c.plotter_free_set __swig_getmethods__["free"] = _plotstuff_c.plotter_free_get if _newclass: free = _swig_property(_plotstuff_c.plotter_free_get, _plotstuff_c.plotter_free_set) __swig_setmethods__["baton"] = _plotstuff_c.plotter_baton_set __swig_getmethods__["baton"] = _plotstuff_c.plotter_baton_get if _newclass: baton = _swig_property(_plotstuff_c.plotter_baton_get, _plotstuff_c.plotter_baton_set) def __init__(self): this = _plotstuff_c.new_plotter() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotter __del__ = lambda self: None plotter_swigregister = _plotstuff_c.plotter_swigregister plotter_swigregister(plotter) def parse_image_format(fmt): return _plotstuff_c.parse_image_format(fmt) parse_image_format = _plotstuff_c.parse_image_format def guess_image_format_from_filename(fn): return _plotstuff_c.guess_image_format_from_filename(fn) guess_image_format_from_filename = _plotstuff_c.guess_image_format_from_filename def image_format_name_from_code(code): return _plotstuff_c.image_format_name_from_code(code) image_format_name_from_code = _plotstuff_c.image_format_name_from_code def parse_color(color, r, g, b, a): return _plotstuff_c.parse_color(color, r, g, b, a) parse_color = _plotstuff_c.parse_color def parse_color_rgba(color, rgba): return _plotstuff_c.parse_color_rgba(color, rgba) parse_color_rgba = _plotstuff_c.parse_color_rgba def cairo_set_color(cairo, color): return _plotstuff_c.cairo_set_color(cairo, color) cairo_set_color = _plotstuff_c.cairo_set_color def cairo_set_rgba(cairo, rgba): return _plotstuff_c.cairo_set_rgba(cairo, rgba) cairo_set_rgba = _plotstuff_c.cairo_set_rgba def plotstuff_new(): return _plotstuff_c.plotstuff_new() plotstuff_new = _plotstuff_c.plotstuff_new def plotstuff_init(plotargs): return _plotstuff_c.plotstuff_init(plotargs) plotstuff_init = _plotstuff_c.plotstuff_init def plotstuff_read_and_run_command(pargs, f): return _plotstuff_c.plotstuff_read_and_run_command(pargs, f) plotstuff_read_and_run_command = _plotstuff_c.plotstuff_read_and_run_command def plotstuff_run_command(pargs, cmd): return _plotstuff_c.plotstuff_run_command(pargs, cmd) plotstuff_run_command = _plotstuff_c.plotstuff_run_command def plotstuff_set_text_bg_alpha(pargs, alpha): return _plotstuff_c.plotstuff_set_text_bg_alpha(pargs, alpha) plotstuff_set_text_bg_alpha = _plotstuff_c.plotstuff_set_text_bg_alpha def plotstuff_plot_layer(pargs, layer): return _plotstuff_c.plotstuff_plot_layer(pargs, layer) plotstuff_plot_layer = _plotstuff_c.plotstuff_plot_layer def plotstuff_get_config(pargs, name): return _plotstuff_c.plotstuff_get_config(pargs, name) plotstuff_get_config = _plotstuff_c.plotstuff_get_config def plotstuff_set_color(pargs, name): return _plotstuff_c.plotstuff_set_color(pargs, name) plotstuff_set_color = _plotstuff_c.plotstuff_set_color def plotstuff_set_bgcolor(pargs, name): return _plotstuff_c.plotstuff_set_bgcolor(pargs, name) plotstuff_set_bgcolor = _plotstuff_c.plotstuff_set_bgcolor def plotstuff_get_alpha(pargs): return _plotstuff_c.plotstuff_get_alpha(pargs) plotstuff_get_alpha = _plotstuff_c.plotstuff_get_alpha def plotstuff_set_alpha(pargs, alpha): return _plotstuff_c.plotstuff_set_alpha(pargs, alpha) plotstuff_set_alpha = _plotstuff_c.plotstuff_set_alpha def plotstuff_set_rgba(pargs, rgba): return _plotstuff_c.plotstuff_set_rgba(pargs, rgba) plotstuff_set_rgba = _plotstuff_c.plotstuff_set_rgba def plotstuff_set_rgba2(pargs, r, g, b, a): return _plotstuff_c.plotstuff_set_rgba2(pargs, r, g, b, a) plotstuff_set_rgba2 = _plotstuff_c.plotstuff_set_rgba2 def plotstuff_set_bgrgba2(pargs, r, g, b, a): return _plotstuff_c.plotstuff_set_bgrgba2(pargs, r, g, b, a) plotstuff_set_bgrgba2 = _plotstuff_c.plotstuff_set_bgrgba2 def plotstuff_set_marker(pargs, name): return _plotstuff_c.plotstuff_set_marker(pargs, name) plotstuff_set_marker = _plotstuff_c.plotstuff_set_marker def plotstuff_set_markersize(pargs, ms): return _plotstuff_c.plotstuff_set_markersize(pargs, ms) plotstuff_set_markersize = _plotstuff_c.plotstuff_set_markersize def plotstuff_set_size(pargs, W, H): return _plotstuff_c.plotstuff_set_size(pargs, W, H) plotstuff_set_size = _plotstuff_c.plotstuff_set_size def plotstuff_set_size_wcs(pargs): return _plotstuff_c.plotstuff_set_size_wcs(pargs) plotstuff_set_size_wcs = _plotstuff_c.plotstuff_set_size_wcs def plotstuff_scale_wcs(pargs, scale): return _plotstuff_c.plotstuff_scale_wcs(pargs, scale) plotstuff_scale_wcs = _plotstuff_c.plotstuff_scale_wcs def plotstuff_rotate_wcs(pargs, angle): return _plotstuff_c.plotstuff_rotate_wcs(pargs, angle) plotstuff_rotate_wcs = _plotstuff_c.plotstuff_rotate_wcs def plotstuff_set_wcs_box(pargs, ra, dec, width): return _plotstuff_c.plotstuff_set_wcs_box(pargs, ra, dec, width) plotstuff_set_wcs_box = _plotstuff_c.plotstuff_set_wcs_box def plotstuff_set_wcs_file(pargs, fn, ext): return _plotstuff_c.plotstuff_set_wcs_file(pargs, fn, ext) plotstuff_set_wcs_file = _plotstuff_c.plotstuff_set_wcs_file def plotstuff_set_wcs(pargs, wcs): return _plotstuff_c.plotstuff_set_wcs(pargs, wcs) plotstuff_set_wcs = _plotstuff_c.plotstuff_set_wcs def plotstuff_set_wcs_tan(pargs, wcs): return _plotstuff_c.plotstuff_set_wcs_tan(pargs, wcs) plotstuff_set_wcs_tan = _plotstuff_c.plotstuff_set_wcs_tan def plotstuff_set_wcs_sip(pargs, wcs): return _plotstuff_c.plotstuff_set_wcs_sip(pargs, wcs) plotstuff_set_wcs_sip = _plotstuff_c.plotstuff_set_wcs_sip def plotstuff_builtin_apply(cairo, args): return _plotstuff_c.plotstuff_builtin_apply(cairo, args) plotstuff_builtin_apply = _plotstuff_c.plotstuff_builtin_apply def plotstuff_marker_in_bounds(pargs, x, y): return _plotstuff_c.plotstuff_marker_in_bounds(pargs, x, y) plotstuff_marker_in_bounds = _plotstuff_c.plotstuff_marker_in_bounds def plotstuff_run_commandf(pargs, fmt): return _plotstuff_c.plotstuff_run_commandf(pargs, fmt) plotstuff_run_commandf = _plotstuff_c.plotstuff_run_commandf def plotstuff_output(pargs): return _plotstuff_c.plotstuff_output(pargs) plotstuff_output = _plotstuff_c.plotstuff_output def plotstuff_free(pargs): return _plotstuff_c.plotstuff_free(pargs) plotstuff_free = _plotstuff_c.plotstuff_free def plotstuff_clear(pargs): return _plotstuff_c.plotstuff_clear(pargs) plotstuff_clear = _plotstuff_c.plotstuff_clear def plotstuff_stack_marker(pargs, x, y): return _plotstuff_c.plotstuff_stack_marker(pargs, x, y) plotstuff_stack_marker = _plotstuff_c.plotstuff_stack_marker def plotstuff_stack_arrow(pargs, x, y, x2, y2): return _plotstuff_c.plotstuff_stack_arrow(pargs, x, y, x2, y2) plotstuff_stack_arrow = _plotstuff_c.plotstuff_stack_arrow def plotstuff_stack_text(pargs, cairo, txt, px, py): return _plotstuff_c.plotstuff_stack_text(pargs, cairo, txt, px, py) plotstuff_stack_text = _plotstuff_c.plotstuff_stack_text def plotstuff_plot_stack(pargs, cairo): return _plotstuff_c.plotstuff_plot_stack(pargs, cairo) plotstuff_plot_stack = _plotstuff_c.plotstuff_plot_stack def plotstuff_get_maximum_rgba(pargs): return _plotstuff_c.plotstuff_get_maximum_rgba(pargs) plotstuff_get_maximum_rgba = _plotstuff_c.plotstuff_get_maximum_rgba def plotstuff_pixel_scale(pargs): return _plotstuff_c.plotstuff_pixel_scale(pargs) plotstuff_pixel_scale = _plotstuff_c.plotstuff_pixel_scale def plotstuff_radec2xy(pargs, ra, dec): return _plotstuff_c.plotstuff_radec2xy(pargs, ra, dec) plotstuff_radec2xy = _plotstuff_c.plotstuff_radec2xy def plotstuff_xy2radec(pargs, x, y, pre): return _plotstuff_c.plotstuff_xy2radec(pargs, x, y, pre) plotstuff_xy2radec = _plotstuff_c.plotstuff_xy2radec def plotstuff_get_radec_center_and_radius(pargs): return _plotstuff_c.plotstuff_get_radec_center_and_radius(pargs) plotstuff_get_radec_center_and_radius = _plotstuff_c.plotstuff_get_radec_center_and_radius def plotstuff_get_radec_bounds(pargs, stepsize): return _plotstuff_c.plotstuff_get_radec_bounds(pargs, stepsize) plotstuff_get_radec_bounds = _plotstuff_c.plotstuff_get_radec_bounds def plotstuff_radec_is_inside_image(pargs, ra, dec): return _plotstuff_c.plotstuff_radec_is_inside_image(pargs, ra, dec) plotstuff_radec_is_inside_image = _plotstuff_c.plotstuff_radec_is_inside_image def plotstuff_line_constant_ra(pargs, ra, dec1, dec2, startwithmove): return _plotstuff_c.plotstuff_line_constant_ra(pargs, ra, dec1, dec2, startwithmove) plotstuff_line_constant_ra = _plotstuff_c.plotstuff_line_constant_ra def plotstuff_line_constant_dec(pargs, dec, ra1, ra2): return _plotstuff_c.plotstuff_line_constant_dec(pargs, dec, ra1, ra2) plotstuff_line_constant_dec = _plotstuff_c.plotstuff_line_constant_dec def plotstuff_line_constant_dec2(pargs, dec, ra1, ra2, stepra): return _plotstuff_c.plotstuff_line_constant_dec2(pargs, dec, ra1, ra2, stepra) plotstuff_line_constant_dec2 = _plotstuff_c.plotstuff_line_constant_dec2 def plotstuff_text_xy(pargs, ra, dec, label): return _plotstuff_c.plotstuff_text_xy(pargs, ra, dec, label) plotstuff_text_xy = _plotstuff_c.plotstuff_text_xy def plotstuff_text_radec(pargs, ra, dec, label): return _plotstuff_c.plotstuff_text_radec(pargs, ra, dec, label) plotstuff_text_radec = _plotstuff_c.plotstuff_text_radec def plotstuff_move_to_radec(pargs, ra, dec): return _plotstuff_c.plotstuff_move_to_radec(pargs, ra, dec) plotstuff_move_to_radec = _plotstuff_c.plotstuff_move_to_radec def plotstuff_line_to_radec(pargs, ra, dec): return _plotstuff_c.plotstuff_line_to_radec(pargs, ra, dec) plotstuff_line_to_radec = _plotstuff_c.plotstuff_line_to_radec def plotstuff_close_path(pargs): return _plotstuff_c.plotstuff_close_path(pargs) plotstuff_close_path = _plotstuff_c.plotstuff_close_path def plotstuff_stroke(pargs): return _plotstuff_c.plotstuff_stroke(pargs) plotstuff_stroke = _plotstuff_c.plotstuff_stroke def plotstuff_fill(pargs): return _plotstuff_c.plotstuff_fill(pargs) plotstuff_fill = _plotstuff_c.plotstuff_fill def plotstuff_stroke_preserve(pargs): return _plotstuff_c.plotstuff_stroke_preserve(pargs) plotstuff_stroke_preserve = _plotstuff_c.plotstuff_stroke_preserve def plotstuff_fill_preserve(pargs): return _plotstuff_c.plotstuff_fill_preserve(pargs) plotstuff_fill_preserve = _plotstuff_c.plotstuff_fill_preserve def plotstuff_move_to(pargs, x, y): return _plotstuff_c.plotstuff_move_to(pargs, x, y) plotstuff_move_to = _plotstuff_c.plotstuff_move_to def plotstuff_line_to(pargs, x, y): return _plotstuff_c.plotstuff_line_to(pargs, x, y) plotstuff_line_to = _plotstuff_c.plotstuff_line_to def plotstuff_marker(pargs, x, y): return _plotstuff_c.plotstuff_marker(pargs, x, y) plotstuff_marker = _plotstuff_c.plotstuff_marker def plotstuff_marker_radec(pargs, ra, dec): return _plotstuff_c.plotstuff_marker_radec(pargs, ra, dec) plotstuff_marker_radec = _plotstuff_c.plotstuff_marker_radec def plotstuff_append_doubles(str, lst): return _plotstuff_c.plotstuff_append_doubles(str, lst) plotstuff_append_doubles = _plotstuff_c.plotstuff_append_doubles def plotstuff_set_dashed(pargs, dashlen): return _plotstuff_c.plotstuff_set_dashed(pargs, dashlen) plotstuff_set_dashed = _plotstuff_c.plotstuff_set_dashed def plotstuff_set_solid(pargs): return _plotstuff_c.plotstuff_set_solid(pargs) plotstuff_set_solid = _plotstuff_c.plotstuff_set_solid _plotstuff_c.PTYPE_FLOAT_swigconstant(_plotstuff_c) PTYPE_FLOAT = _plotstuff_c.PTYPE_FLOAT _plotstuff_c.PTYPE_INT_swigconstant(_plotstuff_c) PTYPE_INT = _plotstuff_c.PTYPE_INT _plotstuff_c.PTYPE_DOUBLE_swigconstant(_plotstuff_c) PTYPE_DOUBLE = _plotstuff_c.PTYPE_DOUBLE _plotstuff_c.PTYPE_UINT8_swigconstant(_plotstuff_c) PTYPE_UINT8 = _plotstuff_c.PTYPE_UINT8 _plotstuff_c.PTYPE_INT16_swigconstant(_plotstuff_c) PTYPE_INT16 = _plotstuff_c.PTYPE_INT16 _plotstuff_c.BPP_8_UNSIGNED_swigconstant(_plotstuff_c) BPP_8_UNSIGNED = _plotstuff_c.BPP_8_UNSIGNED _plotstuff_c.BPP_16_SIGNED_swigconstant(_plotstuff_c) BPP_16_SIGNED = _plotstuff_c.BPP_16_SIGNED _plotstuff_c.BPP_32_SIGNED_swigconstant(_plotstuff_c) BPP_32_SIGNED = _plotstuff_c.BPP_32_SIGNED _plotstuff_c.BPP_IEEE_FLOAT_swigconstant(_plotstuff_c) BPP_IEEE_FLOAT = _plotstuff_c.BPP_IEEE_FLOAT _plotstuff_c.BPP_IEEE_DOUBLE_swigconstant(_plotstuff_c) BPP_IEEE_DOUBLE = _plotstuff_c.BPP_IEEE_DOUBLE _plotstuff_c.BPP_DEFAULT_swigconstant(_plotstuff_c) BPP_DEFAULT = _plotstuff_c.BPP_DEFAULT class qfitsdumper(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, qfitsdumper, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, qfitsdumper, name) __repr__ = _swig_repr __swig_setmethods__["filename"] = _plotstuff_c.qfitsdumper_filename_set __swig_getmethods__["filename"] = _plotstuff_c.qfitsdumper_filename_get if _newclass: filename = _swig_property(_plotstuff_c.qfitsdumper_filename_get, _plotstuff_c.qfitsdumper_filename_set) __swig_setmethods__["npix"] = _plotstuff_c.qfitsdumper_npix_set __swig_getmethods__["npix"] = _plotstuff_c.qfitsdumper_npix_get if _newclass: npix = _swig_property(_plotstuff_c.qfitsdumper_npix_get, _plotstuff_c.qfitsdumper_npix_set) __swig_setmethods__["ptype"] = _plotstuff_c.qfitsdumper_ptype_set __swig_getmethods__["ptype"] = _plotstuff_c.qfitsdumper_ptype_get if _newclass: ptype = _swig_property(_plotstuff_c.qfitsdumper_ptype_get, _plotstuff_c.qfitsdumper_ptype_set) __swig_setmethods__["ibuf"] = _plotstuff_c.qfitsdumper_ibuf_set __swig_getmethods__["ibuf"] = _plotstuff_c.qfitsdumper_ibuf_get if _newclass: ibuf = _swig_property(_plotstuff_c.qfitsdumper_ibuf_get, _plotstuff_c.qfitsdumper_ibuf_set) __swig_setmethods__["fbuf"] = _plotstuff_c.qfitsdumper_fbuf_set __swig_getmethods__["fbuf"] = _plotstuff_c.qfitsdumper_fbuf_get if _newclass: fbuf = _swig_property(_plotstuff_c.qfitsdumper_fbuf_get, _plotstuff_c.qfitsdumper_fbuf_set) __swig_setmethods__["dbuf"] = _plotstuff_c.qfitsdumper_dbuf_set __swig_getmethods__["dbuf"] = _plotstuff_c.qfitsdumper_dbuf_get if _newclass: dbuf = _swig_property(_plotstuff_c.qfitsdumper_dbuf_get, _plotstuff_c.qfitsdumper_dbuf_set) __swig_setmethods__["vbuf"] = _plotstuff_c.qfitsdumper_vbuf_set __swig_getmethods__["vbuf"] = _plotstuff_c.qfitsdumper_vbuf_get if _newclass: vbuf = _swig_property(_plotstuff_c.qfitsdumper_vbuf_get, _plotstuff_c.qfitsdumper_vbuf_set) __swig_setmethods__["out_ptype"] = _plotstuff_c.qfitsdumper_out_ptype_set __swig_getmethods__["out_ptype"] = _plotstuff_c.qfitsdumper_out_ptype_get if _newclass: out_ptype = _swig_property(_plotstuff_c.qfitsdumper_out_ptype_get, _plotstuff_c.qfitsdumper_out_ptype_set) def __init__(self): this = _plotstuff_c.new_qfitsdumper() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_qfitsdumper __del__ = lambda self: None qfitsdumper_swigregister = _plotstuff_c.qfitsdumper_swigregister qfitsdumper_swigregister(qfitsdumper) def qfits_pixdump(arg1): return _plotstuff_c.qfits_pixdump(arg1) qfits_pixdump = _plotstuff_c.qfits_pixdump def convolve_get_gaussian_kernel_f(sigma, nsigma, k0, NK): return _plotstuff_c.convolve_get_gaussian_kernel_f(sigma, nsigma, k0, NK) convolve_get_gaussian_kernel_f = _plotstuff_c.convolve_get_gaussian_kernel_f def convolve_separable_f(img, W, H, kernel, k0, NK, outimg, tempimg): return _plotstuff_c.convolve_separable_f(img, W, H, kernel, k0, NK, outimg, tempimg) convolve_separable_f = _plotstuff_c.convolve_separable_f def convolve_separable_weighted_f(img, W, H, weight, kernel, k0, NK, outimg, tempimg): return _plotstuff_c.convolve_separable_weighted_f(img, W, H, weight, kernel, k0, NK, outimg, tempimg) convolve_separable_weighted_f = _plotstuff_c.convolve_separable_weighted_f def c_image_numpy_view(data, nx, ny): return _plotstuff_c.c_image_numpy_view(data, nx, ny) c_image_numpy_view = _plotstuff_c.c_image_numpy_view def qfits_load_image(fn, ext=1, plane=0, map=1, ptype=PTYPE_FLOAT): ld = qfitsloader() ld.filename = fn ld.xtnum = ext ld.pnum = plane ld.map = map ld.ptype = ptype if qfitsloader_init(ld): raise RuntimeError('qfitsloader_init(file "%s", ext %i) failed' % (fn, ext)) if qfits_loadpix(ld): raise RuntimeError('qfits_loadpix(file "%s", ext %i) failed' % (fn, ext)) class qfits_image(object): def __init__(self, pix, nx, ny, ld): self.pix = pix self.nx = nx self.ny = ny self.ld = ld def __del__(self): qfitsloader_free_buffer(self.ld) return qfits_image(ld.fbuf, ld.lx, ld.ly, ld) def free(ptr): return _plotstuff_c.free(ptr) free = _plotstuff_c.free def point_in_polygon(x, y, polygon): return _plotstuff_c.point_in_polygon(x, y, polygon) point_in_polygon = _plotstuff_c.point_in_polygon def tan_vectors(pt, vec1, vec2): return _plotstuff_c.tan_vectors(pt, vec1, vec2) tan_vectors = _plotstuff_c.tan_vectors def invert_2by2(A, Ainv): return _plotstuff_c.invert_2by2(A, Ainv) invert_2by2 = _plotstuff_c.invert_2by2 def invert_2by2_arr(A, Ainv): return _plotstuff_c.invert_2by2_arr(A, Ainv) invert_2by2_arr = _plotstuff_c.invert_2by2_arr def is_power_of_two(x): return _plotstuff_c.is_power_of_two(x) is_power_of_two = _plotstuff_c.is_power_of_two def matrix_matrix_3(m1, m2, result): return _plotstuff_c.matrix_matrix_3(m1, m2, result) matrix_matrix_3 = _plotstuff_c.matrix_matrix_3 def matrix_vector_3(m, v, result): return _plotstuff_c.matrix_vector_3(m, v, result) matrix_vector_3 = _plotstuff_c.matrix_vector_3 def dot_product_3(v1, v2): return _plotstuff_c.dot_product_3(v1, v2) dot_product_3 = _plotstuff_c.dot_product_3 def vector_length_3(v): return _plotstuff_c.vector_length_3(v) vector_length_3 = _plotstuff_c.vector_length_3 def vector_length_squared_3(v): return _plotstuff_c.vector_length_squared_3(v) vector_length_squared_3 = _plotstuff_c.vector_length_squared_3 def inverse_3by3(matrix): return _plotstuff_c.inverse_3by3(matrix) inverse_3by3 = _plotstuff_c.inverse_3by3 def image_to_xyz(uu, vv, s, transform): return _plotstuff_c.image_to_xyz(uu, vv, s, transform) image_to_xyz = _plotstuff_c.image_to_xyz def fit_transform(star, field, N, trans): return _plotstuff_c.fit_transform(star, field, N, trans) fit_transform = _plotstuff_c.fit_transform def uniform_sample(low, high): return _plotstuff_c.uniform_sample(low, high) uniform_sample = _plotstuff_c.uniform_sample def gaussian_sample(mean, stddev): return _plotstuff_c.gaussian_sample(mean, stddev) gaussian_sample = _plotstuff_c.gaussian_sample _plotstuff_c.EDGE_TRUNCATE_swigconstant(_plotstuff_c) EDGE_TRUNCATE = _plotstuff_c.EDGE_TRUNCATE _plotstuff_c.EDGE_AVERAGE_swigconstant(_plotstuff_c) EDGE_AVERAGE = _plotstuff_c.EDGE_AVERAGE def get_output_image_size(W, H, blocksize, edgehandling, outw, outh): return _plotstuff_c.get_output_image_size(W, H, blocksize, edgehandling, outw, outh) get_output_image_size = _plotstuff_c.get_output_image_size def average_image_f(image, W, H, blocksize, edgehandling, output): return _plotstuff_c.average_image_f(image, W, H, blocksize, edgehandling, output) average_image_f = _plotstuff_c.average_image_f def average_weighted_image_f(image, weight, W, H, blocksize, edgehandling, output, nilval): return _plotstuff_c.average_weighted_image_f(image, weight, W, H, blocksize, edgehandling, output, nilval) average_weighted_image_f = _plotstuff_c.average_weighted_image_f def imax(a, b): return _plotstuff_c.imax(a, b) imax = _plotstuff_c.imax def imin(a, b): return _plotstuff_c.imin(a, b) imin = _plotstuff_c.imin def distsq_exceeds(d1, d2, D, limit): return _plotstuff_c.distsq_exceeds(d1, d2, D, limit) distsq_exceeds = _plotstuff_c.distsq_exceeds def square(d): return _plotstuff_c.square(d) square = _plotstuff_c.square def inrange(ra, ralow, rahigh): return _plotstuff_c.inrange(ra, ralow, rahigh) inrange = _plotstuff_c.inrange def distsq(d1, d2, D): return _plotstuff_c.distsq(d1, d2, D) distsq = _plotstuff_c.distsq def cross_product(v1, v2, cross): return _plotstuff_c.cross_product(v1, v2, cross) cross_product = _plotstuff_c.cross_product def normalize(x, y, z): return _plotstuff_c.normalize(x, y, z) normalize = _plotstuff_c.normalize def normalize_3(xyz): return _plotstuff_c.normalize_3(xyz) normalize_3 = _plotstuff_c.normalize_3 class plotimage_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotimage_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotimage_args, name) __repr__ = _swig_repr __swig_setmethods__["fn"] = _plotstuff_c.plotimage_args_fn_set __swig_getmethods__["fn"] = _plotstuff_c.plotimage_args_fn_get if _newclass: fn = _swig_property(_plotstuff_c.plotimage_args_fn_get, _plotstuff_c.plotimage_args_fn_set) __swig_setmethods__["format"] = _plotstuff_c.plotimage_args_format_set __swig_getmethods__["format"] = _plotstuff_c.plotimage_args_format_get if _newclass: format = _swig_property(_plotstuff_c.plotimage_args_format_get, _plotstuff_c.plotimage_args_format_set) __swig_setmethods__["resample"] = _plotstuff_c.plotimage_args_resample_set __swig_getmethods__["resample"] = _plotstuff_c.plotimage_args_resample_get if _newclass: resample = _swig_property(_plotstuff_c.plotimage_args_resample_get, _plotstuff_c.plotimage_args_resample_set) __swig_setmethods__["downsample"] = _plotstuff_c.plotimage_args_downsample_set __swig_getmethods__["downsample"] = _plotstuff_c.plotimage_args_downsample_get if _newclass: downsample = _swig_property(_plotstuff_c.plotimage_args_downsample_get, _plotstuff_c.plotimage_args_downsample_set) __swig_setmethods__["arcsinh"] = _plotstuff_c.plotimage_args_arcsinh_set __swig_getmethods__["arcsinh"] = _plotstuff_c.plotimage_args_arcsinh_get if _newclass: arcsinh = _swig_property(_plotstuff_c.plotimage_args_arcsinh_get, _plotstuff_c.plotimage_args_arcsinh_set) __swig_setmethods__["rgbscale"] = _plotstuff_c.plotimage_args_rgbscale_set __swig_getmethods__["rgbscale"] = _plotstuff_c.plotimage_args_rgbscale_get if _newclass: rgbscale = _swig_property(_plotstuff_c.plotimage_args_rgbscale_get, _plotstuff_c.plotimage_args_rgbscale_set) __swig_setmethods__["alpha"] = _plotstuff_c.plotimage_args_alpha_set __swig_getmethods__["alpha"] = _plotstuff_c.plotimage_args_alpha_get if _newclass: alpha = _swig_property(_plotstuff_c.plotimage_args_alpha_get, _plotstuff_c.plotimage_args_alpha_set) __swig_setmethods__["wcs"] = _plotstuff_c.plotimage_args_wcs_set __swig_getmethods__["wcs"] = _plotstuff_c.plotimage_args_wcs_get if _newclass: wcs = _swig_property(_plotstuff_c.plotimage_args_wcs_get, _plotstuff_c.plotimage_args_wcs_set) __swig_setmethods__["gridsize"] = _plotstuff_c.plotimage_args_gridsize_set __swig_getmethods__["gridsize"] = _plotstuff_c.plotimage_args_gridsize_get if _newclass: gridsize = _swig_property(_plotstuff_c.plotimage_args_gridsize_get, _plotstuff_c.plotimage_args_gridsize_set) __swig_setmethods__["image_low"] = _plotstuff_c.plotimage_args_image_low_set __swig_getmethods__["image_low"] = _plotstuff_c.plotimage_args_image_low_get if _newclass: image_low = _swig_property(_plotstuff_c.plotimage_args_image_low_get, _plotstuff_c.plotimage_args_image_low_set) __swig_setmethods__["image_high"] = _plotstuff_c.plotimage_args_image_high_set __swig_getmethods__["image_high"] = _plotstuff_c.plotimage_args_image_high_get if _newclass: image_high = _swig_property(_plotstuff_c.plotimage_args_image_high_get, _plotstuff_c.plotimage_args_image_high_set) __swig_setmethods__["image_null"] = _plotstuff_c.plotimage_args_image_null_set __swig_getmethods__["image_null"] = _plotstuff_c.plotimage_args_image_null_get if _newclass: image_null = _swig_property(_plotstuff_c.plotimage_args_image_null_get, _plotstuff_c.plotimage_args_image_null_set) __swig_setmethods__["image_valid_low"] = _plotstuff_c.plotimage_args_image_valid_low_set __swig_getmethods__["image_valid_low"] = _plotstuff_c.plotimage_args_image_valid_low_get if _newclass: image_valid_low = _swig_property(_plotstuff_c.plotimage_args_image_valid_low_get, _plotstuff_c.plotimage_args_image_valid_low_set) __swig_setmethods__["image_valid_high"] = _plotstuff_c.plotimage_args_image_valid_high_set __swig_getmethods__["image_valid_high"] = _plotstuff_c.plotimage_args_image_valid_high_get if _newclass: image_valid_high = _swig_property(_plotstuff_c.plotimage_args_image_valid_high_get, _plotstuff_c.plotimage_args_image_valid_high_set) __swig_setmethods__["n_invalid_low"] = _plotstuff_c.plotimage_args_n_invalid_low_set __swig_getmethods__["n_invalid_low"] = _plotstuff_c.plotimage_args_n_invalid_low_get if _newclass: n_invalid_low = _swig_property(_plotstuff_c.plotimage_args_n_invalid_low_get, _plotstuff_c.plotimage_args_n_invalid_low_set) __swig_setmethods__["n_invalid_high"] = _plotstuff_c.plotimage_args_n_invalid_high_set __swig_getmethods__["n_invalid_high"] = _plotstuff_c.plotimage_args_n_invalid_high_get if _newclass: n_invalid_high = _swig_property(_plotstuff_c.plotimage_args_n_invalid_high_get, _plotstuff_c.plotimage_args_n_invalid_high_set) __swig_setmethods__["n_invalid_null"] = _plotstuff_c.plotimage_args_n_invalid_null_set __swig_getmethods__["n_invalid_null"] = _plotstuff_c.plotimage_args_n_invalid_null_get if _newclass: n_invalid_null = _swig_property(_plotstuff_c.plotimage_args_n_invalid_null_get, _plotstuff_c.plotimage_args_n_invalid_null_set) __swig_setmethods__["fitsext"] = _plotstuff_c.plotimage_args_fitsext_set __swig_getmethods__["fitsext"] = _plotstuff_c.plotimage_args_fitsext_get if _newclass: fitsext = _swig_property(_plotstuff_c.plotimage_args_fitsext_get, _plotstuff_c.plotimage_args_fitsext_set) __swig_setmethods__["fitsplane"] = _plotstuff_c.plotimage_args_fitsplane_set __swig_getmethods__["fitsplane"] = _plotstuff_c.plotimage_args_fitsplane_get if _newclass: fitsplane = _swig_property(_plotstuff_c.plotimage_args_fitsplane_get, _plotstuff_c.plotimage_args_fitsplane_set) __swig_setmethods__["auto_scale"] = _plotstuff_c.plotimage_args_auto_scale_set __swig_getmethods__["auto_scale"] = _plotstuff_c.plotimage_args_auto_scale_get if _newclass: auto_scale = _swig_property(_plotstuff_c.plotimage_args_auto_scale_get, _plotstuff_c.plotimage_args_auto_scale_set) __swig_setmethods__["img"] = _plotstuff_c.plotimage_args_img_set __swig_getmethods__["img"] = _plotstuff_c.plotimage_args_img_get if _newclass: img = _swig_property(_plotstuff_c.plotimage_args_img_get, _plotstuff_c.plotimage_args_img_set) __swig_setmethods__["W"] = _plotstuff_c.plotimage_args_W_set __swig_getmethods__["W"] = _plotstuff_c.plotimage_args_W_get if _newclass: W = _swig_property(_plotstuff_c.plotimage_args_W_get, _plotstuff_c.plotimage_args_W_set) __swig_setmethods__["H"] = _plotstuff_c.plotimage_args_H_set __swig_getmethods__["H"] = _plotstuff_c.plotimage_args_H_get if _newclass: H = _swig_property(_plotstuff_c.plotimage_args_H_get, _plotstuff_c.plotimage_args_H_set) def _set_image_from_numpy(self, arr): return _plotstuff_c.plotimage_args__set_image_from_numpy(self, arr) def set_wcs_file(self, fn, ext): return _plotstuff_c.plotimage_args_set_wcs_file(self, fn, ext) def set_file(self, fn): return _plotstuff_c.plotimage_args_set_file(self, fn) def set_rgbscale(self, r, g, b): return _plotstuff_c.plotimage_args_set_rgbscale(self, r, g, b) def get_image_width(self): return _plotstuff_c.plotimage_args_get_image_width(self) def get_image_height(self): return _plotstuff_c.plotimage_args_get_image_height(self) def __init__(self): this = _plotstuff_c.new_plotimage_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotimage_args __del__ = lambda self: None plotimage_args_swigregister = _plotstuff_c.plotimage_args_swigregister plotimage_args_swigregister(plotimage_args) def plot_image_get(pargs): return _plotstuff_c.plot_image_get(pargs) plot_image_get = _plotstuff_c.plot_image_get def plot_image_set_wcs(args, filename, ext): return _plotstuff_c.plot_image_set_wcs(args, filename, ext) plot_image_set_wcs = _plotstuff_c.plot_image_set_wcs def plot_image_init(args): return _plotstuff_c.plot_image_init(args) plot_image_init = _plotstuff_c.plot_image_init def plot_image_command(command, cmdargs, args, baton): return _plotstuff_c.plot_image_command(command, cmdargs, args, baton) plot_image_command = _plotstuff_c.plot_image_command def plot_image_plot(command, cr, args, baton): return _plotstuff_c.plot_image_plot(command, cr, args, baton) plot_image_plot = _plotstuff_c.plot_image_plot def plot_image_free(args, baton): return _plotstuff_c.plot_image_free(args, baton) plot_image_free = _plotstuff_c.plot_image_free def plot_image_getsize(args, W, H): return _plotstuff_c.plot_image_getsize(args, W, H) plot_image_getsize = _plotstuff_c.plot_image_getsize def plot_image_set_filename(args, fn): return _plotstuff_c.plot_image_set_filename(args, fn) plot_image_set_filename = _plotstuff_c.plot_image_set_filename def plot_image_setsize(pargs, args): return _plotstuff_c.plot_image_setsize(pargs, args) plot_image_setsize = _plotstuff_c.plot_image_setsize def plot_image_get_percentile(pargs, args, percentile): return _plotstuff_c.plot_image_get_percentile(pargs, args, percentile) plot_image_get_percentile = _plotstuff_c.plot_image_get_percentile def plot_image_add_to_pixels(args, rgb): return _plotstuff_c.plot_image_add_to_pixels(args, rgb) plot_image_add_to_pixels = _plotstuff_c.plot_image_add_to_pixels def plot_image_scale_float(args, fimg): return _plotstuff_c.plot_image_scale_float(args, fimg) plot_image_scale_float = _plotstuff_c.plot_image_scale_float def plot_image_rgba_data(cairo, args): return _plotstuff_c.plot_image_rgba_data(cairo, args) plot_image_rgba_data = _plotstuff_c.plot_image_rgba_data def plot_image_read(pargs, args): return _plotstuff_c.plot_image_read(pargs, args) plot_image_read = _plotstuff_c.plot_image_read def plot_image_make_color_transparent(args, r, g, b): return _plotstuff_c.plot_image_make_color_transparent(args, r, g, b) plot_image_make_color_transparent = _plotstuff_c.plot_image_make_color_transparent def plot_image_describe(p): return _plotstuff_c.plot_image_describe(p) plot_image_describe = _plotstuff_c.plot_image_describe class plotoutline_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotoutline_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotoutline_args, name) __repr__ = _swig_repr __swig_setmethods__["wcs"] = _plotstuff_c.plotoutline_args_wcs_set __swig_getmethods__["wcs"] = _plotstuff_c.plotoutline_args_wcs_get if _newclass: wcs = _swig_property(_plotstuff_c.plotoutline_args_wcs_get, _plotstuff_c.plotoutline_args_wcs_set) __swig_setmethods__["stepsize"] = _plotstuff_c.plotoutline_args_stepsize_set __swig_getmethods__["stepsize"] = _plotstuff_c.plotoutline_args_stepsize_get if _newclass: stepsize = _swig_property(_plotstuff_c.plotoutline_args_stepsize_get, _plotstuff_c.plotoutline_args_stepsize_set) __swig_setmethods__["fill"] = _plotstuff_c.plotoutline_args_fill_set __swig_getmethods__["fill"] = _plotstuff_c.plotoutline_args_fill_get if _newclass: fill = _swig_property(_plotstuff_c.plotoutline_args_fill_get, _plotstuff_c.plotoutline_args_fill_set) def set_wcs_file(self, fn, ext): return _plotstuff_c.plotoutline_args_set_wcs_file(self, fn, ext) def set_wcs_size(self, W, H): return _plotstuff_c.plotoutline_args_set_wcs_size(self, W, H) def __init__(self): this = _plotstuff_c.new_plotoutline_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotoutline_args __del__ = lambda self: None plotoutline_args_swigregister = _plotstuff_c.plotoutline_args_swigregister plotoutline_args_swigregister(plotoutline_args) def plot_outline_get(pargs): return _plotstuff_c.plot_outline_get(pargs) plot_outline_get = _plotstuff_c.plot_outline_get def plot_outline_init(args): return _plotstuff_c.plot_outline_init(args) plot_outline_init = _plotstuff_c.plot_outline_init def plot_outline_command(command, cmdargs, args, baton): return _plotstuff_c.plot_outline_command(command, cmdargs, args, baton) plot_outline_command = _plotstuff_c.plot_outline_command def plot_outline_plot(command, cr, args, baton): return _plotstuff_c.plot_outline_plot(command, cr, args, baton) plot_outline_plot = _plotstuff_c.plot_outline_plot def plot_outline_free(args, baton): return _plotstuff_c.plot_outline_free(args, baton) plot_outline_free = _plotstuff_c.plot_outline_free def plot_outline_set_wcs_file(args, filename, ext): return _plotstuff_c.plot_outline_set_wcs_file(args, filename, ext) plot_outline_set_wcs_file = _plotstuff_c.plot_outline_set_wcs_file def plot_outline_set_wcs_size(args, W, H): return _plotstuff_c.plot_outline_set_wcs_size(args, W, H) plot_outline_set_wcs_size = _plotstuff_c.plot_outline_set_wcs_size def plot_outline_set_wcs(args, wcs): return _plotstuff_c.plot_outline_set_wcs(args, wcs) plot_outline_set_wcs = _plotstuff_c.plot_outline_set_wcs def plot_outline_set_fill(args, fill): return _plotstuff_c.plot_outline_set_fill(args, fill) plot_outline_set_fill = _plotstuff_c.plot_outline_set_fill def plot_outline_describe(p): return _plotstuff_c.plot_outline_describe(p) plot_outline_describe = _plotstuff_c.plot_outline_describe class plotgrid_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotgrid_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotgrid_args, name) __repr__ = _swig_repr __swig_setmethods__["dolabel"] = _plotstuff_c.plotgrid_args_dolabel_set __swig_getmethods__["dolabel"] = _plotstuff_c.plotgrid_args_dolabel_get if _newclass: dolabel = _swig_property(_plotstuff_c.plotgrid_args_dolabel_get, _plotstuff_c.plotgrid_args_dolabel_set) __swig_setmethods__["rastep"] = _plotstuff_c.plotgrid_args_rastep_set __swig_getmethods__["rastep"] = _plotstuff_c.plotgrid_args_rastep_get if _newclass: rastep = _swig_property(_plotstuff_c.plotgrid_args_rastep_get, _plotstuff_c.plotgrid_args_rastep_set) __swig_setmethods__["decstep"] = _plotstuff_c.plotgrid_args_decstep_set __swig_getmethods__["decstep"] = _plotstuff_c.plotgrid_args_decstep_get if _newclass: decstep = _swig_property(_plotstuff_c.plotgrid_args_decstep_get, _plotstuff_c.plotgrid_args_decstep_set) __swig_setmethods__["ralabelstep"] = _plotstuff_c.plotgrid_args_ralabelstep_set __swig_getmethods__["ralabelstep"] = _plotstuff_c.plotgrid_args_ralabelstep_get if _newclass: ralabelstep = _swig_property(_plotstuff_c.plotgrid_args_ralabelstep_get, _plotstuff_c.plotgrid_args_ralabelstep_set) __swig_setmethods__["declabelstep"] = _plotstuff_c.plotgrid_args_declabelstep_set __swig_getmethods__["declabelstep"] = _plotstuff_c.plotgrid_args_declabelstep_get if _newclass: declabelstep = _swig_property(_plotstuff_c.plotgrid_args_declabelstep_get, _plotstuff_c.plotgrid_args_declabelstep_set) __swig_setmethods__["ralabeldir"] = _plotstuff_c.plotgrid_args_ralabeldir_set __swig_getmethods__["ralabeldir"] = _plotstuff_c.plotgrid_args_ralabeldir_get if _newclass: ralabeldir = _swig_property(_plotstuff_c.plotgrid_args_ralabeldir_get, _plotstuff_c.plotgrid_args_ralabeldir_set) __swig_setmethods__["declabeldir"] = _plotstuff_c.plotgrid_args_declabeldir_set __swig_getmethods__["declabeldir"] = _plotstuff_c.plotgrid_args_declabeldir_get if _newclass: declabeldir = _swig_property(_plotstuff_c.plotgrid_args_declabeldir_get, _plotstuff_c.plotgrid_args_declabeldir_set) __swig_setmethods__["ralo"] = _plotstuff_c.plotgrid_args_ralo_set __swig_getmethods__["ralo"] = _plotstuff_c.plotgrid_args_ralo_get if _newclass: ralo = _swig_property(_plotstuff_c.plotgrid_args_ralo_get, _plotstuff_c.plotgrid_args_ralo_set) __swig_setmethods__["rahi"] = _plotstuff_c.plotgrid_args_rahi_set __swig_getmethods__["rahi"] = _plotstuff_c.plotgrid_args_rahi_get if _newclass: rahi = _swig_property(_plotstuff_c.plotgrid_args_rahi_get, _plotstuff_c.plotgrid_args_rahi_set) __swig_setmethods__["declo"] = _plotstuff_c.plotgrid_args_declo_set __swig_getmethods__["declo"] = _plotstuff_c.plotgrid_args_declo_get if _newclass: declo = _swig_property(_plotstuff_c.plotgrid_args_declo_get, _plotstuff_c.plotgrid_args_declo_set) __swig_setmethods__["dechi"] = _plotstuff_c.plotgrid_args_dechi_set __swig_getmethods__["dechi"] = _plotstuff_c.plotgrid_args_dechi_get if _newclass: dechi = _swig_property(_plotstuff_c.plotgrid_args_dechi_get, _plotstuff_c.plotgrid_args_dechi_set) __swig_setmethods__["raformat"] = _plotstuff_c.plotgrid_args_raformat_set __swig_getmethods__["raformat"] = _plotstuff_c.plotgrid_args_raformat_get if _newclass: raformat = _swig_property(_plotstuff_c.plotgrid_args_raformat_get, _plotstuff_c.plotgrid_args_raformat_set) __swig_setmethods__["decformat"] = _plotstuff_c.plotgrid_args_decformat_set __swig_getmethods__["decformat"] = _plotstuff_c.plotgrid_args_decformat_get if _newclass: decformat = _swig_property(_plotstuff_c.plotgrid_args_decformat_get, _plotstuff_c.plotgrid_args_decformat_set) def set_formats(self, raformat, decformat): return _plotstuff_c.plotgrid_args_set_formats(self, raformat, decformat) def __init__(self): this = _plotstuff_c.new_plotgrid_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotgrid_args __del__ = lambda self: None plotgrid_args_swigregister = _plotstuff_c.plotgrid_args_swigregister plotgrid_args_swigregister(plotgrid_args) def plot_grid_get(pargs): return _plotstuff_c.plot_grid_get(pargs) plot_grid_get = _plotstuff_c.plot_grid_get def plot_grid_init(args): return _plotstuff_c.plot_grid_init(args) plot_grid_init = _plotstuff_c.plot_grid_init def plot_grid_set_formats(grid, raformat, decformat): return _plotstuff_c.plot_grid_set_formats(grid, raformat, decformat) plot_grid_set_formats = _plotstuff_c.plot_grid_set_formats def plot_grid_command(command, cmdargs, args, baton): return _plotstuff_c.plot_grid_command(command, cmdargs, args, baton) plot_grid_command = _plotstuff_c.plot_grid_command def plot_grid_plot(command, cr, args, baton): return _plotstuff_c.plot_grid_plot(command, cr, args, baton) plot_grid_plot = _plotstuff_c.plot_grid_plot def plot_grid_free(args, baton): return _plotstuff_c.plot_grid_free(args, baton) plot_grid_free = _plotstuff_c.plot_grid_free _plotstuff_c.DIRECTION_DEFAULT_swigconstant(_plotstuff_c) DIRECTION_DEFAULT = _plotstuff_c.DIRECTION_DEFAULT _plotstuff_c.DIRECTION_POS_swigconstant(_plotstuff_c) DIRECTION_POS = _plotstuff_c.DIRECTION_POS _plotstuff_c.DIRECTION_NEG_swigconstant(_plotstuff_c) DIRECTION_NEG = _plotstuff_c.DIRECTION_NEG _plotstuff_c.DIRECTION_POSNEG_swigconstant(_plotstuff_c) DIRECTION_POSNEG = _plotstuff_c.DIRECTION_POSNEG _plotstuff_c.DIRECTION_NEGPOS_swigconstant(_plotstuff_c) DIRECTION_NEGPOS = _plotstuff_c.DIRECTION_NEGPOS def plot_grid_add_label(pargs, ra, dec, lval, format): return _plotstuff_c.plot_grid_add_label(pargs, ra, dec, lval, format) plot_grid_add_label = _plotstuff_c.plot_grid_add_label def plot_grid_find_ra_label_location(pargs, ra, cdec, decmin, decmax, dirn): return _plotstuff_c.plot_grid_find_ra_label_location(pargs, ra, cdec, decmin, decmax, dirn) plot_grid_find_ra_label_location = _plotstuff_c.plot_grid_find_ra_label_location def plot_grid_find_dec_label_location(pargs, dec, cra, ramin, ramax, dirn): return _plotstuff_c.plot_grid_find_dec_label_location(pargs, dec, cra, ramin, ramax, dirn) plot_grid_find_dec_label_location = _plotstuff_c.plot_grid_find_dec_label_location def plot_grid_describe(p): return _plotstuff_c.plot_grid_describe(p) plot_grid_describe = _plotstuff_c.plot_grid_describe class plotindex_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotindex_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotindex_args, name) __repr__ = _swig_repr __swig_setmethods__["indexes"] = _plotstuff_c.plotindex_args_indexes_set __swig_getmethods__["indexes"] = _plotstuff_c.plotindex_args_indexes_get if _newclass: indexes = _swig_property(_plotstuff_c.plotindex_args_indexes_get, _plotstuff_c.plotindex_args_indexes_set) __swig_setmethods__["qidxes"] = _plotstuff_c.plotindex_args_qidxes_set __swig_getmethods__["qidxes"] = _plotstuff_c.plotindex_args_qidxes_get if _newclass: qidxes = _swig_property(_plotstuff_c.plotindex_args_qidxes_get, _plotstuff_c.plotindex_args_qidxes_set) __swig_setmethods__["stars"] = _plotstuff_c.plotindex_args_stars_set __swig_getmethods__["stars"] = _plotstuff_c.plotindex_args_stars_get if _newclass: stars = _swig_property(_plotstuff_c.plotindex_args_stars_get, _plotstuff_c.plotindex_args_stars_set) __swig_setmethods__["quads"] = _plotstuff_c.plotindex_args_quads_set __swig_getmethods__["quads"] = _plotstuff_c.plotindex_args_quads_get if _newclass: quads = _swig_property(_plotstuff_c.plotindex_args_quads_get, _plotstuff_c.plotindex_args_quads_set) __swig_setmethods__["fill"] = _plotstuff_c.plotindex_args_fill_set __swig_getmethods__["fill"] = _plotstuff_c.plotindex_args_fill_get if _newclass: fill = _swig_property(_plotstuff_c.plotindex_args_fill_get, _plotstuff_c.plotindex_args_fill_set) def add_file(self, fn): return _plotstuff_c.plotindex_args_add_file(self, fn) def __init__(self): this = _plotstuff_c.new_plotindex_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotindex_args __del__ = lambda self: None plotindex_args_swigregister = _plotstuff_c.plotindex_args_swigregister plotindex_args_swigregister(plotindex_args) def plot_quad_xy(cairo, quadxy, dimquads): return _plotstuff_c.plot_quad_xy(cairo, quadxy, dimquads) plot_quad_xy = _plotstuff_c.plot_quad_xy def plot_index_plotquad(cairo, pargs, args, index, quadnum, DQ): return _plotstuff_c.plot_index_plotquad(cairo, pargs, args, index, quadnum, DQ) plot_index_plotquad = _plotstuff_c.plot_index_plotquad def plot_index_get(pargs): return _plotstuff_c.plot_index_get(pargs) plot_index_get = _plotstuff_c.plot_index_get def plot_index_add_file(args, fn): return _plotstuff_c.plot_index_add_file(args, fn) plot_index_add_file = _plotstuff_c.plot_index_add_file def plot_index_add_qidx_file(args, fn): return _plotstuff_c.plot_index_add_qidx_file(args, fn) plot_index_add_qidx_file = _plotstuff_c.plot_index_add_qidx_file def plot_index_init(args): return _plotstuff_c.plot_index_init(args) plot_index_init = _plotstuff_c.plot_index_init def plot_index_command(command, cmdargs, args, baton): return _plotstuff_c.plot_index_command(command, cmdargs, args, baton) plot_index_command = _plotstuff_c.plot_index_command def plot_index_plot(command, cr, args, baton): return _plotstuff_c.plot_index_plot(command, cr, args, baton) plot_index_plot = _plotstuff_c.plot_index_plot def plot_index_free(args, baton): return _plotstuff_c.plot_index_free(args, baton) plot_index_free = _plotstuff_c.plot_index_free def plot_index_describe(p): return _plotstuff_c.plot_index_describe(p) plot_index_describe = _plotstuff_c.plot_index_describe class plotxy_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotxy_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotxy_args, name) __repr__ = _swig_repr __swig_setmethods__["fn"] = _plotstuff_c.plotxy_args_fn_set __swig_getmethods__["fn"] = _plotstuff_c.plotxy_args_fn_get if _newclass: fn = _swig_property(_plotstuff_c.plotxy_args_fn_get, _plotstuff_c.plotxy_args_fn_set) __swig_setmethods__["ext"] = _plotstuff_c.plotxy_args_ext_set __swig_getmethods__["ext"] = _plotstuff_c.plotxy_args_ext_get if _newclass: ext = _swig_property(_plotstuff_c.plotxy_args_ext_get, _plotstuff_c.plotxy_args_ext_set) __swig_setmethods__["xcol"] = _plotstuff_c.plotxy_args_xcol_set __swig_getmethods__["xcol"] = _plotstuff_c.plotxy_args_xcol_get if _newclass: xcol = _swig_property(_plotstuff_c.plotxy_args_xcol_get, _plotstuff_c.plotxy_args_xcol_set) __swig_setmethods__["ycol"] = _plotstuff_c.plotxy_args_ycol_set __swig_getmethods__["ycol"] = _plotstuff_c.plotxy_args_ycol_get if _newclass: ycol = _swig_property(_plotstuff_c.plotxy_args_ycol_get, _plotstuff_c.plotxy_args_ycol_set) __swig_setmethods__["xoff"] = _plotstuff_c.plotxy_args_xoff_set __swig_getmethods__["xoff"] = _plotstuff_c.plotxy_args_xoff_get if _newclass: xoff = _swig_property(_plotstuff_c.plotxy_args_xoff_get, _plotstuff_c.plotxy_args_xoff_set) __swig_setmethods__["yoff"] = _plotstuff_c.plotxy_args_yoff_set __swig_getmethods__["yoff"] = _plotstuff_c.plotxy_args_yoff_get if _newclass: yoff = _swig_property(_plotstuff_c.plotxy_args_yoff_get, _plotstuff_c.plotxy_args_yoff_set) __swig_setmethods__["firstobj"] = _plotstuff_c.plotxy_args_firstobj_set __swig_getmethods__["firstobj"] = _plotstuff_c.plotxy_args_firstobj_get if _newclass: firstobj = _swig_property(_plotstuff_c.plotxy_args_firstobj_get, _plotstuff_c.plotxy_args_firstobj_set) __swig_setmethods__["nobjs"] = _plotstuff_c.plotxy_args_nobjs_set __swig_getmethods__["nobjs"] = _plotstuff_c.plotxy_args_nobjs_get if _newclass: nobjs = _swig_property(_plotstuff_c.plotxy_args_nobjs_get, _plotstuff_c.plotxy_args_nobjs_set) __swig_setmethods__["scale"] = _plotstuff_c.plotxy_args_scale_set __swig_getmethods__["scale"] = _plotstuff_c.plotxy_args_scale_get if _newclass: scale = _swig_property(_plotstuff_c.plotxy_args_scale_get, _plotstuff_c.plotxy_args_scale_set) __swig_setmethods__["xyvals"] = _plotstuff_c.plotxy_args_xyvals_set __swig_getmethods__["xyvals"] = _plotstuff_c.plotxy_args_xyvals_get if _newclass: xyvals = _swig_property(_plotstuff_c.plotxy_args_xyvals_get, _plotstuff_c.plotxy_args_xyvals_set) __swig_setmethods__["wcs"] = _plotstuff_c.plotxy_args_wcs_set __swig_getmethods__["wcs"] = _plotstuff_c.plotxy_args_wcs_get if _newclass: wcs = _swig_property(_plotstuff_c.plotxy_args_wcs_get, _plotstuff_c.plotxy_args_wcs_set) def __init__(self): this = _plotstuff_c.new_plotxy_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotxy_args __del__ = lambda self: None plotxy_args_swigregister = _plotstuff_c.plotxy_args_swigregister plotxy_args_swigregister(plotxy_args) def plot_xy_get(pargs): return _plotstuff_c.plot_xy_get(pargs) plot_xy_get = _plotstuff_c.plot_xy_get def plot_xy_init(args): return _plotstuff_c.plot_xy_init(args) plot_xy_init = _plotstuff_c.plot_xy_init def plot_xy_setsize(args, xyargs): return _plotstuff_c.plot_xy_setsize(args, xyargs) plot_xy_setsize = _plotstuff_c.plot_xy_setsize def plot_xy_clear_list(args): return _plotstuff_c.plot_xy_clear_list(args) plot_xy_clear_list = _plotstuff_c.plot_xy_clear_list def plot_xy_set_xcol(args, col): return _plotstuff_c.plot_xy_set_xcol(args, col) plot_xy_set_xcol = _plotstuff_c.plot_xy_set_xcol def plot_xy_set_ycol(args, col): return _plotstuff_c.plot_xy_set_ycol(args, col) plot_xy_set_ycol = _plotstuff_c.plot_xy_set_ycol def plot_xy_set_filename(args, fn): return _plotstuff_c.plot_xy_set_filename(args, fn) plot_xy_set_filename = _plotstuff_c.plot_xy_set_filename def plot_xy_set_wcs_filename(args, fn, ext): return _plotstuff_c.plot_xy_set_wcs_filename(args, fn, ext) plot_xy_set_wcs_filename = _plotstuff_c.plot_xy_set_wcs_filename def plot_xy_set_offsets(args, xo, yo): return _plotstuff_c.plot_xy_set_offsets(args, xo, yo) plot_xy_set_offsets = _plotstuff_c.plot_xy_set_offsets def plot_xy_command(command, cmdargs, args, baton): return _plotstuff_c.plot_xy_command(command, cmdargs, args, baton) plot_xy_command = _plotstuff_c.plot_xy_command def plot_xy_plot(command, cairo, plotargs, baton): return _plotstuff_c.plot_xy_plot(command, cairo, plotargs, baton) plot_xy_plot = _plotstuff_c.plot_xy_plot def plot_xy_free(args, baton): return _plotstuff_c.plot_xy_free(args, baton) plot_xy_free = _plotstuff_c.plot_xy_free def plot_xy_vals(args, x, y): return _plotstuff_c.plot_xy_vals(args, x, y) plot_xy_vals = _plotstuff_c.plot_xy_vals def plot_xy_describe(p): return _plotstuff_c.plot_xy_describe(p) plot_xy_describe = _plotstuff_c.plot_xy_describe class plotradec_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotradec_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotradec_args, name) __repr__ = _swig_repr __swig_setmethods__["fn"] = _plotstuff_c.plotradec_args_fn_set __swig_getmethods__["fn"] = _plotstuff_c.plotradec_args_fn_get if _newclass: fn = _swig_property(_plotstuff_c.plotradec_args_fn_get, _plotstuff_c.plotradec_args_fn_set) __swig_setmethods__["ext"] = _plotstuff_c.plotradec_args_ext_set __swig_getmethods__["ext"] = _plotstuff_c.plotradec_args_ext_get if _newclass: ext = _swig_property(_plotstuff_c.plotradec_args_ext_get, _plotstuff_c.plotradec_args_ext_set) __swig_setmethods__["racol"] = _plotstuff_c.plotradec_args_racol_set __swig_getmethods__["racol"] = _plotstuff_c.plotradec_args_racol_get if _newclass: racol = _swig_property(_plotstuff_c.plotradec_args_racol_get, _plotstuff_c.plotradec_args_racol_set) __swig_setmethods__["deccol"] = _plotstuff_c.plotradec_args_deccol_set __swig_getmethods__["deccol"] = _plotstuff_c.plotradec_args_deccol_get if _newclass: deccol = _swig_property(_plotstuff_c.plotradec_args_deccol_get, _plotstuff_c.plotradec_args_deccol_set) __swig_setmethods__["firstobj"] = _plotstuff_c.plotradec_args_firstobj_set __swig_getmethods__["firstobj"] = _plotstuff_c.plotradec_args_firstobj_get if _newclass: firstobj = _swig_property(_plotstuff_c.plotradec_args_firstobj_get, _plotstuff_c.plotradec_args_firstobj_set) __swig_setmethods__["nobjs"] = _plotstuff_c.plotradec_args_nobjs_set __swig_getmethods__["nobjs"] = _plotstuff_c.plotradec_args_nobjs_get if _newclass: nobjs = _swig_property(_plotstuff_c.plotradec_args_nobjs_get, _plotstuff_c.plotradec_args_nobjs_set) __swig_setmethods__["radecvals"] = _plotstuff_c.plotradec_args_radecvals_set __swig_getmethods__["radecvals"] = _plotstuff_c.plotradec_args_radecvals_get if _newclass: radecvals = _swig_property(_plotstuff_c.plotradec_args_radecvals_get, _plotstuff_c.plotradec_args_radecvals_set) def __init__(self): this = _plotstuff_c.new_plotradec_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotradec_args __del__ = lambda self: None plotradec_args_swigregister = _plotstuff_c.plotradec_args_swigregister plotradec_args_swigregister(plotradec_args) def plot_radec_get(pargs): return _plotstuff_c.plot_radec_get(pargs) plot_radec_get = _plotstuff_c.plot_radec_get def plot_radec_reset(args): return _plotstuff_c.plot_radec_reset(args) plot_radec_reset = _plotstuff_c.plot_radec_reset def plot_radec_init(args): return _plotstuff_c.plot_radec_init(args) plot_radec_init = _plotstuff_c.plot_radec_init def plot_radec_set_racol(args, col): return _plotstuff_c.plot_radec_set_racol(args, col) plot_radec_set_racol = _plotstuff_c.plot_radec_set_racol def plot_radec_set_deccol(args, col): return _plotstuff_c.plot_radec_set_deccol(args, col) plot_radec_set_deccol = _plotstuff_c.plot_radec_set_deccol def plot_radec_set_filename(args, fn): return _plotstuff_c.plot_radec_set_filename(args, fn) plot_radec_set_filename = _plotstuff_c.plot_radec_set_filename def plot_radec_command(command, cmdargs, args, baton): return _plotstuff_c.plot_radec_command(command, cmdargs, args, baton) plot_radec_command = _plotstuff_c.plot_radec_command def plot_radec_count_inbounds(pargs, args): return _plotstuff_c.plot_radec_count_inbounds(pargs, args) plot_radec_count_inbounds = _plotstuff_c.plot_radec_count_inbounds def plot_radec_plot(command, cairo, plotargs, baton): return _plotstuff_c.plot_radec_plot(command, cairo, plotargs, baton) plot_radec_plot = _plotstuff_c.plot_radec_plot def plot_radec_free(args, baton): return _plotstuff_c.plot_radec_free(args, baton) plot_radec_free = _plotstuff_c.plot_radec_free def plot_radec_vals(args, ra, dec): return _plotstuff_c.plot_radec_vals(args, ra, dec) plot_radec_vals = _plotstuff_c.plot_radec_vals def plot_radec_describe(p): return _plotstuff_c.plot_radec_describe(p) plot_radec_describe = _plotstuff_c.plot_radec_describe class plotmatch_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plotmatch_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plotmatch_args, name) __repr__ = _swig_repr __swig_setmethods__["matches"] = _plotstuff_c.plotmatch_args_matches_set __swig_getmethods__["matches"] = _plotstuff_c.plotmatch_args_matches_get if _newclass: matches = _swig_property(_plotstuff_c.plotmatch_args_matches_get, _plotstuff_c.plotmatch_args_matches_set) def __init__(self): this = _plotstuff_c.new_plotmatch_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plotmatch_args __del__ = lambda self: None plotmatch_args_swigregister = _plotstuff_c.plotmatch_args_swigregister plotmatch_args_swigregister(plotmatch_args) def plot_match_get(pargs): return _plotstuff_c.plot_match_get(pargs) plot_match_get = _plotstuff_c.plot_match_get def plot_match_add_match(args, mo): return _plotstuff_c.plot_match_add_match(args, mo) plot_match_add_match = _plotstuff_c.plot_match_add_match def plot_match_set_filename(args, filename): return _plotstuff_c.plot_match_set_filename(args, filename) plot_match_set_filename = _plotstuff_c.plot_match_set_filename def plot_match_init(args): return _plotstuff_c.plot_match_init(args) plot_match_init = _plotstuff_c.plot_match_init def plot_match_command(command, cmdargs, args, baton): return _plotstuff_c.plot_match_command(command, cmdargs, args, baton) plot_match_command = _plotstuff_c.plot_match_command def plot_match_plot(command, cr, args, baton): return _plotstuff_c.plot_match_plot(command, cr, args, baton) plot_match_plot = _plotstuff_c.plot_match_plot def plot_match_free(args, baton): return _plotstuff_c.plot_match_free(args, baton) plot_match_free = _plotstuff_c.plot_match_free def plot_match_describe(p): return _plotstuff_c.plot_match_describe(p) plot_match_describe = _plotstuff_c.plot_match_describe class annotation_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, annotation_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, annotation_args, name) __repr__ = _swig_repr __swig_setmethods__["NGC"] = _plotstuff_c.annotation_args_NGC_set __swig_getmethods__["NGC"] = _plotstuff_c.annotation_args_NGC_get if _newclass: NGC = _swig_property(_plotstuff_c.annotation_args_NGC_get, _plotstuff_c.annotation_args_NGC_set) __swig_setmethods__["constellations"] = _plotstuff_c.annotation_args_constellations_set __swig_getmethods__["constellations"] = _plotstuff_c.annotation_args_constellations_get if _newclass: constellations = _swig_property(_plotstuff_c.annotation_args_constellations_get, _plotstuff_c.annotation_args_constellations_set) __swig_setmethods__["constellation_lines"] = _plotstuff_c.annotation_args_constellation_lines_set __swig_getmethods__["constellation_lines"] = _plotstuff_c.annotation_args_constellation_lines_get if _newclass: constellation_lines = _swig_property(_plotstuff_c.annotation_args_constellation_lines_get, _plotstuff_c.annotation_args_constellation_lines_set) __swig_setmethods__["constellation_markers"] = _plotstuff_c.annotation_args_constellation_markers_set __swig_getmethods__["constellation_markers"] = _plotstuff_c.annotation_args_constellation_markers_get if _newclass: constellation_markers = _swig_property(_plotstuff_c.annotation_args_constellation_markers_get, _plotstuff_c.annotation_args_constellation_markers_set) __swig_setmethods__["constellation_labels"] = _plotstuff_c.annotation_args_constellation_labels_set __swig_getmethods__["constellation_labels"] = _plotstuff_c.annotation_args_constellation_labels_get if _newclass: constellation_labels = _swig_property(_plotstuff_c.annotation_args_constellation_labels_get, _plotstuff_c.annotation_args_constellation_labels_set) __swig_setmethods__["constellation_labels_long"] = _plotstuff_c.annotation_args_constellation_labels_long_set __swig_getmethods__["constellation_labels_long"] = _plotstuff_c.annotation_args_constellation_labels_long_get if _newclass: constellation_labels_long = _swig_property(_plotstuff_c.annotation_args_constellation_labels_long_get, _plotstuff_c.annotation_args_constellation_labels_long_set) __swig_setmethods__["constellation_lines_offset"] = _plotstuff_c.annotation_args_constellation_lines_offset_set __swig_getmethods__["constellation_lines_offset"] = _plotstuff_c.annotation_args_constellation_lines_offset_get if _newclass: constellation_lines_offset = _swig_property(_plotstuff_c.annotation_args_constellation_lines_offset_get, _plotstuff_c.annotation_args_constellation_lines_offset_set) __swig_setmethods__["constellation_pastel"] = _plotstuff_c.annotation_args_constellation_pastel_set __swig_getmethods__["constellation_pastel"] = _plotstuff_c.annotation_args_constellation_pastel_get if _newclass: constellation_pastel = _swig_property(_plotstuff_c.annotation_args_constellation_pastel_get, _plotstuff_c.annotation_args_constellation_pastel_set) __swig_setmethods__["bright"] = _plotstuff_c.annotation_args_bright_set __swig_getmethods__["bright"] = _plotstuff_c.annotation_args_bright_get if _newclass: bright = _swig_property(_plotstuff_c.annotation_args_bright_get, _plotstuff_c.annotation_args_bright_set) __swig_setmethods__["bright_labels"] = _plotstuff_c.annotation_args_bright_labels_set __swig_getmethods__["bright_labels"] = _plotstuff_c.annotation_args_bright_labels_get if _newclass: bright_labels = _swig_property(_plotstuff_c.annotation_args_bright_labels_get, _plotstuff_c.annotation_args_bright_labels_set) __swig_setmethods__["bright_pastel"] = _plotstuff_c.annotation_args_bright_pastel_set __swig_getmethods__["bright_pastel"] = _plotstuff_c.annotation_args_bright_pastel_get if _newclass: bright_pastel = _swig_property(_plotstuff_c.annotation_args_bright_pastel_get, _plotstuff_c.annotation_args_bright_pastel_set) __swig_setmethods__["HD"] = _plotstuff_c.annotation_args_HD_set __swig_getmethods__["HD"] = _plotstuff_c.annotation_args_HD_get if _newclass: HD = _swig_property(_plotstuff_c.annotation_args_HD_get, _plotstuff_c.annotation_args_HD_set) __swig_setmethods__["HD_labels"] = _plotstuff_c.annotation_args_HD_labels_set __swig_getmethods__["HD_labels"] = _plotstuff_c.annotation_args_HD_labels_get if _newclass: HD_labels = _swig_property(_plotstuff_c.annotation_args_HD_labels_get, _plotstuff_c.annotation_args_HD_labels_set) __swig_setmethods__["ngc_fraction"] = _plotstuff_c.annotation_args_ngc_fraction_set __swig_getmethods__["ngc_fraction"] = _plotstuff_c.annotation_args_ngc_fraction_get if _newclass: ngc_fraction = _swig_property(_plotstuff_c.annotation_args_ngc_fraction_get, _plotstuff_c.annotation_args_ngc_fraction_set) __swig_setmethods__["targets"] = _plotstuff_c.annotation_args_targets_set __swig_getmethods__["targets"] = _plotstuff_c.annotation_args_targets_get if _newclass: targets = _swig_property(_plotstuff_c.annotation_args_targets_get, _plotstuff_c.annotation_args_targets_set) __swig_setmethods__["hd_catalog"] = _plotstuff_c.annotation_args_hd_catalog_set __swig_getmethods__["hd_catalog"] = _plotstuff_c.annotation_args_hd_catalog_get if _newclass: hd_catalog = _swig_property(_plotstuff_c.annotation_args_hd_catalog_get, _plotstuff_c.annotation_args_hd_catalog_set) def add_target(self, ra, dec, name): return _plotstuff_c.annotation_args_add_target(self, ra, dec, name) def add_named_target(self, name): return _plotstuff_c.annotation_args_add_named_target(self, name) def __init__(self): this = _plotstuff_c.new_annotation_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_annotation_args __del__ = lambda self: None annotation_args_swigregister = _plotstuff_c.annotation_args_swigregister annotation_args_swigregister(annotation_args) def plot_annotations_init(args): return _plotstuff_c.plot_annotations_init(args) plot_annotations_init = _plotstuff_c.plot_annotations_init def plot_annotations_get(pargs): return _plotstuff_c.plot_annotations_get(pargs) plot_annotations_get = _plotstuff_c.plot_annotations_get def plot_annotations_command(command, cmdargs, args, baton): return _plotstuff_c.plot_annotations_command(command, cmdargs, args, baton) plot_annotations_command = _plotstuff_c.plot_annotations_command def plot_annotations_plot(command, cr, args, baton): return _plotstuff_c.plot_annotations_plot(command, cr, args, baton) plot_annotations_plot = _plotstuff_c.plot_annotations_plot def plot_annotations_free(args, baton): return _plotstuff_c.plot_annotations_free(args, baton) plot_annotations_free = _plotstuff_c.plot_annotations_free def plot_annotations_set_hd_catalog(ann, hdfn): return _plotstuff_c.plot_annotations_set_hd_catalog(ann, hdfn) plot_annotations_set_hd_catalog = _plotstuff_c.plot_annotations_set_hd_catalog def plot_annotations_add_named_target(ann, target): return _plotstuff_c.plot_annotations_add_named_target(ann, target) plot_annotations_add_named_target = _plotstuff_c.plot_annotations_add_named_target def plot_annotations_add_target(ann, ra, dec, name): return _plotstuff_c.plot_annotations_add_target(ann, ra, dec, name) plot_annotations_add_target = _plotstuff_c.plot_annotations_add_target def plot_annotations_describe(p): return _plotstuff_c.plot_annotations_describe(p) plot_annotations_describe = _plotstuff_c.plot_annotations_describe class plothealpix_args(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, plothealpix_args, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, plothealpix_args, name) __repr__ = _swig_repr __swig_setmethods__["nside"] = _plotstuff_c.plothealpix_args_nside_set __swig_getmethods__["nside"] = _plotstuff_c.plothealpix_args_nside_get if _newclass: nside = _swig_property(_plotstuff_c.plothealpix_args_nside_get, _plotstuff_c.plothealpix_args_nside_set) __swig_setmethods__["stepsize"] = _plotstuff_c.plothealpix_args_stepsize_set __swig_getmethods__["stepsize"] = _plotstuff_c.plothealpix_args_stepsize_get if _newclass: stepsize = _swig_property(_plotstuff_c.plothealpix_args_stepsize_get, _plotstuff_c.plothealpix_args_stepsize_set) def __init__(self): this = _plotstuff_c.new_plothealpix_args() try: self.this.append(this) except: self.this = this __swig_destroy__ = _plotstuff_c.delete_plothealpix_args __del__ = lambda self: None plothealpix_args_swigregister = _plotstuff_c.plothealpix_args_swigregister plothealpix_args_swigregister(plothealpix_args) def plot_healpix_get(pargs): return _plotstuff_c.plot_healpix_get(pargs) plot_healpix_get = _plotstuff_c.plot_healpix_get def plot_healpix_init(args): return _plotstuff_c.plot_healpix_init(args) plot_healpix_init = _plotstuff_c.plot_healpix_init def plot_healpix_command(command, cmdargs, args, baton): return _plotstuff_c.plot_healpix_command(command, cmdargs, args, baton) plot_healpix_command = _plotstuff_c.plot_healpix_command def plot_healpix_plot(command, cr, args, baton): return _plotstuff_c.plot_healpix_plot(command, cr, args, baton) plot_healpix_plot = _plotstuff_c.plot_healpix_plot def plot_healpix_free(args, baton): return _plotstuff_c.plot_healpix_free(args, baton) plot_healpix_free = _plotstuff_c.plot_healpix_free def plot_healpix_describe(p): return _plotstuff_c.plot_healpix_describe(p) plot_healpix_describe = _plotstuff_c.plot_healpix_describe _plotstuff_c.CAIRO_OPERATOR_CLEAR_swigconstant(_plotstuff_c) CAIRO_OPERATOR_CLEAR = _plotstuff_c.CAIRO_OPERATOR_CLEAR _plotstuff_c.CAIRO_OPERATOR_SOURCE_swigconstant(_plotstuff_c) CAIRO_OPERATOR_SOURCE = _plotstuff_c.CAIRO_OPERATOR_SOURCE _plotstuff_c.CAIRO_OPERATOR_OVER_swigconstant(_plotstuff_c) CAIRO_OPERATOR_OVER = _plotstuff_c.CAIRO_OPERATOR_OVER _plotstuff_c.CAIRO_OPERATOR_IN_swigconstant(_plotstuff_c) CAIRO_OPERATOR_IN = _plotstuff_c.CAIRO_OPERATOR_IN _plotstuff_c.CAIRO_OPERATOR_OUT_swigconstant(_plotstuff_c) CAIRO_OPERATOR_OUT = _plotstuff_c.CAIRO_OPERATOR_OUT _plotstuff_c.CAIRO_OPERATOR_ATOP_swigconstant(_plotstuff_c) CAIRO_OPERATOR_ATOP = _plotstuff_c.CAIRO_OPERATOR_ATOP _plotstuff_c.CAIRO_OPERATOR_DEST_swigconstant(_plotstuff_c) CAIRO_OPERATOR_DEST = _plotstuff_c.CAIRO_OPERATOR_DEST _plotstuff_c.CAIRO_OPERATOR_DEST_OVER_swigconstant(_plotstuff_c) CAIRO_OPERATOR_DEST_OVER = _plotstuff_c.CAIRO_OPERATOR_DEST_OVER _plotstuff_c.CAIRO_OPERATOR_DEST_IN_swigconstant(_plotstuff_c) CAIRO_OPERATOR_DEST_IN = _plotstuff_c.CAIRO_OPERATOR_DEST_IN _plotstuff_c.CAIRO_OPERATOR_DEST_OUT_swigconstant(_plotstuff_c) CAIRO_OPERATOR_DEST_OUT = _plotstuff_c.CAIRO_OPERATOR_DEST_OUT _plotstuff_c.CAIRO_OPERATOR_DEST_ATOP_swigconstant(_plotstuff_c) CAIRO_OPERATOR_DEST_ATOP = _plotstuff_c.CAIRO_OPERATOR_DEST_ATOP _plotstuff_c.CAIRO_OPERATOR_XOR_swigconstant(_plotstuff_c) CAIRO_OPERATOR_XOR = _plotstuff_c.CAIRO_OPERATOR_XOR _plotstuff_c.CAIRO_OPERATOR_ADD_swigconstant(_plotstuff_c) CAIRO_OPERATOR_ADD = _plotstuff_c.CAIRO_OPERATOR_ADD _plotstuff_c.CAIRO_OPERATOR_SATURATE_swigconstant(_plotstuff_c) CAIRO_OPERATOR_SATURATE = _plotstuff_c.CAIRO_OPERATOR_SATURATE def image_debug(img, W, H): return _plotstuff_c.image_debug(img, W, H) image_debug = _plotstuff_c.image_debug def image_add(img, W, H, val): return _plotstuff_c.image_add(img, W, H, val) image_add = _plotstuff_c.image_add def image_weighted_smooth(img, W, H, weight, sigma): return _plotstuff_c.image_weighted_smooth(img, W, H, weight, sigma) image_weighted_smooth = _plotstuff_c.image_weighted_smooth def plotoutline_setattr(self, name, val): #print 'plotoutline_setattr', name, '=', val if name == 'wcs_file': if type(val) is tuple: (fn,ext) = val else: fn = val ext = 0 #print 'setting outline wcs file %s, ext %i' % (fn, ext) plot_outline_set_wcs_file(self, fn, ext) return self.__swig__setattr__(name, val) plotoutline_args.__swig__setattr__ = plotoutline_args.__setattr__ plotoutline_args.__setattr__ = plotoutline_setattr def plotimage_set_image_from_numpy(self, img): rtn = self._set_image_from_numpy(img) if rtn: raise RuntimeError('set_image_from_numpy() failed') plotimage_args.set_image_from_numpy = plotimage_set_image_from_numpy # This file is compatible with both classic and new-style classes. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotstuff_wrap.c����������������������������������������������������������000644 �000765 �000024 �00002671601 12651446355 021122� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.7 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include <Python.h> # define _DEBUG #else # include <Python.h> #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if (<obj is ok>) { if (<need new object>) { *ptr = <ptr to new allocated object>; return SWIG_NEWOBJ; } else { *ptr = <ptr to old object>; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include <string.h> #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class<int>" == "Class<int >", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like <name1>|<name2>|... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like <name1>|<name2>|... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *cstr; char *newstr; Py_ssize_t len; str = PyUnicode_AsUTF8String(str); PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif /* Add PyObject_Del for old Pythons */ #if PY_VERSION_HEX < 0x01060000 # define PyObject_Del(op) PyMem_DEL((op)) #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intintargfunc ssizessizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) { long result = 0; PyObject *i = PyNumber_Int(x); if (i) { result = PyInt_AsLong(i); Py_DECREF(i); } return result; } #endif #if PY_VERSION_HEX < 0x02050000 #define PyInt_FromSize_t(x) PyInt_FromLong((long)x) #endif #if PY_VERSION_HEX < 0x02040000 #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif #if PY_VERSION_HEX < 0x02030000 typedef struct { PyTypeObject type; PyNumberMethods as_number; PyMappingMethods as_mapping; PySequenceMethods as_sequence; PyBufferProcs as_buffer; PyObject *name, *slots; } PyHeapTypeObject; #endif #if PY_VERSION_HEX < 0x02030000 typedef destructor freefunc; #endif #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ (PY_MAJOR_VERSION > 3)) # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #endif #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX >= 0x03000000 SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { return PyInstanceMethod_New(func); } #else SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) { return NULL; } #endif #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN int SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { int i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { int i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS SwigPyObject_repr(SwigPyObject *v) #else SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v); if (v->next) { # ifdef METH_NOARGS PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # else PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); # endif # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!SwigPyObject_Check(next)) { return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS SwigPyObject_next(PyObject* v) #else SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_disown(PyObject *v) #else SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_acquire(PyObject *v) #else SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #elif (PY_VERSION_HEX < 0x02050000) if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #else if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) #endif { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v); } else { SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * SwigPyObject_getattr(SwigPyObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpyobject_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobject_type) < 0) return NULL; #endif } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME int SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("<Swig Packed ", fp); if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ (printfunc)SwigPyPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpypacked_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpypacked_type) < 0) return NULL; #endif } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return SWIG_Python_str_FromChar("this"); } static PyObject *swig_this = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (swig_this == NULL) swig_this = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst = 0; PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else # ifdef SWIGPY_USE_CAPSULE type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); # else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); # endif if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void #ifdef SWIGPY_USE_CAPSULE SWIG_Python_DestroyModule(PyObject *obj) #else SWIG_Python_DestroyModule(void *vptr) #endif { #ifdef SWIGPY_USE_CAPSULE swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); #else swig_module_info *swig_module = (swig_module_info *) vptr; #endif swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); swig_this = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif #ifdef SWIGPY_USE_CAPSULE PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #else PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #endif } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { #ifdef SWIGPY_USE_CAPSULE descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); #else descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); #endif } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { #ifdef SWIGPY_USE_CAPSULE obj = PyCapsule_New((void*) descriptor, NULL, NULL); #else obj = PyCObject_FromVoidPtr(descriptor, NULL); #endif PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); } else { PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_FILE swig_types[0] #define SWIGTYPE_p_MatchObj swig_types[1] #define SWIGTYPE_p_a_2__double swig_types[2] #define SWIGTYPE_p_annotation_args swig_types[3] #define SWIGTYPE_p_anwcs_t swig_types[4] #define SWIGTYPE_p_bl swig_types[5] #define SWIGTYPE_p_cairo_op swig_types[6] #define SWIGTYPE_p_cairo_surface_t swig_types[7] #define SWIGTYPE_p_cairo_t swig_types[8] #define SWIGTYPE_p_char swig_types[9] #define SWIGTYPE_p_coadd_t swig_types[10] #define SWIGTYPE_p_codetree_t swig_types[11] #define SWIGTYPE_p_dl swig_types[12] #define SWIGTYPE_p_double swig_types[13] #define SWIGTYPE_p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int swig_types[14] #define SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int swig_types[15] #define SWIGTYPE_p_f_p_struct_plot_args__p_void swig_types[16] #define SWIGTYPE_p_f_p_struct_plot_args_double_double_p_void__void swig_types[17] #define SWIGTYPE_p_f_p_struct_plot_args_p_void__int swig_types[18] #define SWIGTYPE_p_f_p_struct_plot_args_p_void__void swig_types[19] #define SWIGTYPE_p_float swig_types[20] #define SWIGTYPE_p_index_t swig_types[21] #define SWIGTYPE_p_int swig_types[22] #define SWIGTYPE_p_lanczos_args_t swig_types[23] #define SWIGTYPE_p_pl swig_types[24] #define SWIGTYPE_p_plot_args swig_types[25] #define SWIGTYPE_p_plotgrid_args swig_types[26] #define SWIGTYPE_p_plothealpix_args swig_types[27] #define SWIGTYPE_p_plotimage_args swig_types[28] #define SWIGTYPE_p_plotindex_args swig_types[29] #define SWIGTYPE_p_plotmatch_args swig_types[30] #define SWIGTYPE_p_plotoutline_args swig_types[31] #define SWIGTYPE_p_plotradec_args swig_types[32] #define SWIGTYPE_p_plotter swig_types[33] #define SWIGTYPE_p_plotxy_args swig_types[34] #define SWIGTYPE_p_qfits_header swig_types[35] #define SWIGTYPE_p_qfitsdumper swig_types[36] #define SWIGTYPE_p_quadfile_t swig_types[37] #define SWIGTYPE_p_sip_t swig_types[38] #define SWIGTYPE_p_startree_t swig_types[39] #define SWIGTYPE_p_tan_t swig_types[40] #define SWIGTYPE_p_uint16_t swig_types[41] #define SWIGTYPE_p_unsigned_char swig_types[42] #define SWIGTYPE_p_void swig_types[43] static swig_type_info *swig_types[45]; static swig_module_info swig_module = {swig_types, 44, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #if (PY_VERSION_HEX <= 0x02000000) # if !defined(SWIG_PYTHON_CLASSIC) # error "This python version requires swig to be run with the '-classic' option" # endif #endif /*----------------------------------------------- @(target):= _plotstuff_c.so ------------------------------------------------*/ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_init PyInit__plotstuff_c #else # define SWIG_init init_plotstuff_c #endif #define SWIG_name "_plotstuff_c" #define SWIGVERSION 0x030007 #define SWIG_VERSION SWIGVERSION #define SWIG_as_voidptr(a) (void *)((const void *)(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) #include "numpy/arrayobject.h" #include <stdlib.h> #include <math.h> #include "os-features.h" #include "plotstuff.h" #include "plotimage.h" #include "plotoutline.h" #include "plotgrid.h" #include "plotindex.h" #include "plotxy.h" #include "plotradec.h" #include "plotmatch.h" #include "plotannotations.h" #include "plothealpix.h" #include "sip.h" #include "sip-utils.h" #include "sip_qfits.h" #include "log.h" #include "fitsioutils.h" #include "anwcs.h" #include "coadd.h" #include "anqfits.h" #include "mathutil.h" #include "convolve-image.h" #include "resample.h" #include "cairoutils.h" #include "an-bool.h" #define true 1 #define false 0 SWIGINTERNINLINE PyObject* SWIG_From_int (int value) { return PyInt_FromLong((long) value); } #include <limits.h> #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include <float.h> #include <math.h> SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (int)(v); } } return res; } SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { #if PY_VERSION_HEX>=0x03000000 if (PyUnicode_Check(obj)) #else if (PyString_Check(obj)) #endif { char *cstr; Py_ssize_t len; #if PY_VERSION_HEX>=0x03000000 if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); PyBytes_AsStringAndSize(obj, &cstr, &len); if(alloc) *alloc = SWIG_NEWOBJ; #else PyString_AsStringAndSize(obj, &cstr, &len); #endif if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ #if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) #else if (*alloc == SWIG_NEWOBJ) #endif { *cptr = (char *)memcpy((char *)malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1)); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { #if PY_VERSION_HEX>=0x03000000 assert(0); /* Should never reach here in Python 3 */ #endif *cptr = SWIG_Python_str_AsChar(obj); } } if (psize) *psize = len + 1; #if PY_VERSION_HEX>=0x03000000 Py_XDECREF(obj); #endif return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj((char *)(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { #if PY_VERSION_HEX >= 0x03000000 #if PY_VERSION_HEX >= 0x03010000 return PyUnicode_DecodeUTF8(carray, (int)(size), "surrogateescape"); #else return PyUnicode_FromStringAndSize(carray, (int)(size)); #endif #else return PyString_FromStringAndSize(carray, (int)(size)); #endif } } else { return SWIG_Py_Void(); } } SWIGINTERNINLINE PyObject * SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include <ieeefp.h> # define SWIG_isfinite(X) (finite(X)) # endif #endif /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif SWIGINTERN int SWIG_AsVal_float (PyObject * obj, float *val) { double v; int res = SWIG_AsVal_double (obj, &v); if (SWIG_IsOK(res)) { if (SWIG_Float_Overflow_Check(v)) { return SWIG_OverflowError; } else { if (val) *val = (float)(v); } } return res; } #define SWIG_From_double PyFloat_FromDouble SWIGINTERNINLINE PyObject * SWIG_From_float (float value) { return SWIG_From_double (value); } SWIGINTERN int SWIG_AsCharArray(PyObject * obj, char *val, size_t size) { char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); } if (alloc == SWIG_NEWOBJ) { free((char*)cptr); res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) free((char*)cptr); } return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_char (PyObject * obj, char *val) { int res = SWIG_AsCharArray(obj, val, 1); if (!SWIG_IsOK(res)) { long v; res = SWIG_AddCast(SWIG_AsVal_long (obj, &v)); if (SWIG_IsOK(res)) { if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { if (val) *val = (char)(v); } else { res = SWIG_OverflowError; } } } return res; } SWIGINTERNINLINE PyObject * SWIG_From_char (char c) { return SWIG_FromCharPtrAndSize(&c,1); } SWIGINTERN PyObject *plot_args_view_image_as_numpy(struct plot_args *self){ npy_intp dim[3]; unsigned char* img; PyObject* npimg; dim[0] = self->H; dim[1] = self->W; dim[2] = 4; img = cairo_image_surface_get_data(self->target); npimg = PyArray_SimpleNewFromData(3, dim, NPY_UBYTE, img); return npimg; } SWIGINTERN PyObject *plot_args_get_image_as_numpy(struct plot_args *self,int flip,PyObject *out){ npy_intp dim[3]; unsigned char* img; PyObject* npimg; dim[0] = self->H; dim[1] = self->W; dim[2] = 4; img = cairo_image_surface_get_data(self->target); // Possible memory problems here... if (out == Py_None || out == NULL) { npimg = PyArray_EMPTY(3, dim, NPY_UBYTE, 0); assert(npimg); } else { npimg = out; } if (flip) { cairoutils_argb32_to_rgba_flip(img, PyArray_DATA(npimg), self->W, self->H); } else { cairoutils_argb32_to_rgba_2(img, PyArray_DATA(npimg), self->W, self->H); } return npimg; } SWIGINTERN int plot_args_set_image_from_numpy(struct plot_args *self,PyObject *npimg,int flip){ unsigned char* img; unsigned char* inimg; PyArray_Descr* dtype = PyArray_DescrFromType(PyArray_UBYTE); int req = NPY_C_CONTIGUOUS | NPY_ALIGNED; if ((PyArray_DIM(npimg, 0) != self->H) || (PyArray_DIM(npimg, 1) != self->W) || (PyArray_DIM(npimg, 2) != 4)) { PyErr_SetString(PyExc_ValueError, "Expected image with shape (H, W, 4)"); return -1; } Py_INCREF(dtype); npimg = PyArray_FromAny(npimg, dtype, 3, 3, req, NULL); if (!npimg) { PyErr_SetString(PyExc_ValueError, "img wasn't the type expected"); Py_DECREF(dtype); return -1; } inimg = PyArray_DATA(npimg); img = cairo_image_surface_get_data(self->target); if (flip) { cairoutils_rgba_to_argb32_flip(inimg, img, self->W, self->H); } else { cairoutils_rgba_to_argb32_2(inimg, img, self->W, self->H); } Py_DECREF(npimg); Py_DECREF(dtype); return 0; } SWIGINTERN int plot_args_set_wcs_file(struct plot_args *self,char const *fn,int ext){ return plotstuff_set_wcs_file(self, fn, ext); } SWIGINTERN int plot_args_set_size_from_wcs(struct plot_args *self){ return plotstuff_set_size_wcs(self); } SWIGINTERN void plot_args_loginit(struct plot_args *self,int level){ log_init(level); } #define SWIG_From_long PyLong_FromLong SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long (unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyLong_FromLong((long)(value)); } SWIGINTERNINLINE PyObject * SWIG_From_unsigned_SS_char (unsigned char value) { return SWIG_From_unsigned_SS_long (value); } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else #endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); #if PY_VERSION_HEX >= 0x03000000 { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (v < 0) { return SWIG_OverflowError; } } else { PyErr_Clear(); } } #endif } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } SWIGINTERN int SWIG_AsVal_unsigned_SS_char (PyObject * obj, unsigned char *val) { unsigned long v; int res = SWIG_AsVal_unsigned_SS_long (obj, &v); if (SWIG_IsOK(res)) { if ((v > UCHAR_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (unsigned char)(v); } } return res; } PyObject* c_image_numpy_view(float* data, int nx, int ny) { npy_intp dims[2]; dims[0] = ny; dims[1] = nx; return PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, data); //PyArray_NewFromDescr(PyTypeObject* subtype, PyArray_Descr* descr, int nd, npy_intp* dims, npy_intp* strides, void* data, int flags, PyObject* obj) } SWIGINTERN int SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) { unsigned long v; int res = SWIG_AsVal_unsigned_SS_long (obj, &v); if (SWIG_IsOK(res)) { if ((v > UINT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = (unsigned int)(v); } } return res; } SWIGINTERN int plotimage_args__set_image_from_numpy(struct plotimage_args *self,PyObject *arr){ // Pirate array PyObject* yarr; int hasalpha = 0; int i, N; unsigned char* src; // MAGIC 3: min_depth and max_depth (number of dims) yarr = PyArray_FROMANY(arr, NPY_UBYTE, 3, 3, NPY_C_CONTIGUOUS | NPY_ALIGNED); if (!yarr) { PyErr_SetString(PyExc_ValueError, "Array must be 3-dimensional ubyte"); return -1; } switch (PyArray_DIM(yarr, 2)) { // RGB case 3: hasalpha = 0; break; // RGBA case 4: hasalpha = 1; break; default: PyErr_SetString(PyExc_ValueError, "Array must be RGB or RGBA"); return -1; } src = PyArray_DATA(yarr); if (self->img) { free(self->img); } self->H = (int)PyArray_DIM(yarr, 0); self->W = (int)PyArray_DIM(yarr, 1); //printf("Allocating new %i x %i image\n", self->W, self->H); self->img = malloc(self->W * self->H * 4); N = self->W * self->H; for (i=0; i<N; i++) { if (hasalpha) memcpy(self->img + 4*i, src + 4*i, 4); else { memcpy(self->img + 4*i, src + 3*i, 3); self->img[4*i+3] = 255; } } Py_DECREF(yarr); return 0; } SWIGINTERN int plotimage_args_set_wcs_file(struct plotimage_args *self,char const *fn,int ext){ return plot_image_set_wcs(self, fn, ext); } SWIGINTERN int plotimage_args_set_file(struct plotimage_args *self,char const *fn){ return plot_image_set_filename(self, fn); } SWIGINTERN void plotimage_args_set_rgbscale(struct plotimage_args *self,double r,double g,double b){ self->rgbscale[0] = r; self->rgbscale[1] = g; self->rgbscale[2] = b; } SWIGINTERN int plotimage_args_get_image_width(struct plotimage_args *self){ int W; if (plot_image_getsize(self, &W, NULL)) { return -1; } return W; } SWIGINTERN int plotimage_args_get_image_height(struct plotimage_args *self){ int H; if (plot_image_getsize(self, NULL, &H)) { return -1; } return H; } SWIGINTERN int plotoutline_args_set_wcs_file(struct plotoutline_args *self,char const *fn,int ext){ return plot_outline_set_wcs_file(self, fn, ext); } SWIGINTERN int plotoutline_args_set_wcs_size(struct plotoutline_args *self,int W,int H){ return plot_outline_set_wcs_size(self, W, H); } SWIGINTERN int plotgrid_args_set_formats(struct plotgrid_args *self,char const *raformat,char const *decformat){ return plot_grid_set_formats(self, raformat, decformat); } SWIGINTERN int plotindex_args_add_file(struct plotindex_args *self,char const *fn){ return plot_index_add_file(self, fn); } SWIGINTERN void annotation_args_add_target(struct annotation_args *self,double ra,double dec,char const *name){ plot_annotations_add_target(self, ra, dec, name); } SWIGINTERN void annotation_args_add_named_target(struct annotation_args *self,char const *name){ plot_annotations_add_named_target(self, name); } sip_t* new_sip_t(double crpix1, double crpix2, double crval1, double crval2, double cd11, double cd12, double cd21, double cd22) { sip_t* sip = sip_create(); tan_t* tan = &(sip->wcstan); tan->crpix[0] = crpix1; tan->crpix[1] = crpix2; tan->crval[0] = crval1; tan->crval[1] = crval2; tan->cd[0][0] = cd11; tan->cd[0][1] = cd12; tan->cd[1][0] = cd21; tan->cd[1][1] = cd22; return sip; } void image_debug(float* img, int W, int H) { int i; double mn,mx; mn = 1e300; mx = -1e300; for (i=0; i<(W*H); i++) { mn = MIN(mn, img[i]); mx = MAX(mx, img[i]); } logmsg("Image min,max %g,%g\n", mn,mx); } void image_add(float* img, int W, int H, float val) { int i; for (i=0; i<(W*H); i++) img[i] += val; } void image_weighted_smooth(float* img, int W, int H, const float* weight, float sigma) { int K0, NK; float* kernel = convolve_get_gaussian_kernel_f(sigma, 5., &K0, &NK); convolve_separable_weighted_f(img, W, H, weight, kernel, K0, NK, img, NULL); free(kernel); } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *PLOTSTUFF_FORMAT_JPG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_JPG",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PLOTSTUFF_FORMAT_PNG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_PNG",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PLOTSTUFF_FORMAT_PPM_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_PPM",SWIG_From_int((int)(3))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PLOTSTUFF_FORMAT_PDF_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_PDF",SWIG_From_int((int)(4))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PLOTSTUFF_FORMAT_MEMIMG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_MEMIMG",SWIG_From_int((int)(5))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PLOTSTUFF_FORMAT_FITS_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PLOTSTUFF_FORMAT_FITS",SWIG_From_int((int)(6))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_args_plotters_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; plotter_t *arg2 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_plotters_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_plotters_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotter, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_plotters_set" "', argument " "2"" of type '" "plotter_t *""'"); } arg2 = (plotter_t *)(argp2); if (arg1) (arg1)->plotters = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_plotters_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotter_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_plotters_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_plotters_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (plotter_t *) ((arg1)->plotters); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotter, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_NP_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_NP_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_NP_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_NP_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->NP = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_NP_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_NP_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_NP_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->NP); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outfn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_outfn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outfn_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_outfn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->outfn) free((char*)arg1->outfn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->outfn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->outfn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outfn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_outfn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outfn_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (char *) ((arg1)->outfn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_fout_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_fout_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_fout_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_fout_set" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); if (arg1) (arg1)->fout = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_fout_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; FILE *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_fout_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_fout_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (FILE *) ((arg1)->fout); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_FILE, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outformat_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_outformat_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outformat_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_outformat_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->outformat = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outformat_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_outformat_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outformat_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->outformat); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outimage_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; unsigned char *arg2 = (unsigned char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_outimage_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outimage_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_unsigned_char, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_outimage_set" "', argument " "2"" of type '" "unsigned char *""'"); } arg2 = (unsigned char *)(argp2); if (arg1) (arg1)->outimage = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_outimage_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; unsigned char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_outimage_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_outimage_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (unsigned char *) ((arg1)->outimage); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_unsigned_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_cairo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_cairo_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_cairo_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_cairo_set" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); if (arg1) (arg1)->cairo = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_cairo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; cairo_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_cairo_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_cairo_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (cairo_t *) ((arg1)->cairo); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_cairo_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_target_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; cairo_surface_t *arg2 = (cairo_surface_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_target_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_target_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_surface_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_target_set" "', argument " "2"" of type '" "cairo_surface_t *""'"); } arg2 = (cairo_surface_t *)(argp2); if (arg1) (arg1)->target = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_target_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; cairo_surface_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_target_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_target_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (cairo_surface_t *) ((arg1)->target); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_cairo_surface_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_op_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; cairo_operator_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_op_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_op_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_op_set" "', argument " "2"" of type '" "cairo_operator_t""'"); } arg2 = (cairo_operator_t)(val2); if (arg1) (arg1)->op = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_op_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; cairo_operator_t result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_op_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_op_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (cairo_operator_t) ((arg1)->op); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_move_to_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void (*arg2)(struct plot_args *,double,double,void *) = (void (*)(struct plot_args *,double,double,void *)) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_move_to_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_move_to_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_struct_plot_args_double_double_p_void__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plot_args_move_to_set" "', argument " "2"" of type '" "void (*)(struct plot_args *,double,double,void *)""'"); } } if (arg1) (arg1)->move_to = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_move_to_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void (*result)(struct plot_args *,double,double,void *) = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_move_to_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_move_to_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (void (*)(struct plot_args *,double,double,void *)) ((arg1)->move_to); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_struct_plot_args_double_double_p_void__void); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_move_to_baton_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_move_to_baton_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_move_to_baton_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_move_to_baton_set" "', argument " "2"" of type '" "void *""'"); } if (arg1) (arg1)->move_to_baton = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_move_to_baton_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_move_to_baton_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_move_to_baton_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (void *) ((arg1)->move_to_baton); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_line_to_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void (*arg2)(struct plot_args *,double,double,void *) = (void (*)(struct plot_args *,double,double,void *)) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_line_to_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_line_to_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_struct_plot_args_double_double_p_void__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plot_args_line_to_set" "', argument " "2"" of type '" "void (*)(struct plot_args *,double,double,void *)""'"); } } if (arg1) (arg1)->line_to = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_line_to_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void (*result)(struct plot_args *,double,double,void *) = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_line_to_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_line_to_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (void (*)(struct plot_args *,double,double,void *)) ((arg1)->line_to); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_struct_plot_args_double_double_p_void__void); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_line_to_baton_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_line_to_baton_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_line_to_baton_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_line_to_baton_set" "', argument " "2"" of type '" "void *""'"); } if (arg1) (arg1)->line_to_baton = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_line_to_baton_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_line_to_baton_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_line_to_baton_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (void *) ((arg1)->line_to_baton); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_wcs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_wcs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_wcs_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_wcs_set" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); if (arg1) (arg1)->wcs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_wcs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_wcs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_wcs_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (anwcs_t *) ((arg1)->wcs); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_W_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_W_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_W_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_W_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->W = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_W_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_W_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_W_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->W); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_H_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_H_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_H_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_H_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->H = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_H_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_H_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_H_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->H); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_rgba_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float *arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_rgba_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_rgba_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_rgba_set" "', argument " "2"" of type '" "float [4]""'"); } arg2 = (float *)(argp2); { if (arg2) { size_t ii = 0; for (; ii < (size_t)4; ++ii) *(float *)&arg1->rgba[ii] = *((float *)arg2 + ii); } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""rgba""' of type '""float [4]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_rgba_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_rgba_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_rgba_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float *)(float *) ((arg1)->rgba); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_lw_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_lw_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_lw_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_lw_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->lw = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_lw_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_lw_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_lw_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float) ((arg1)->lw); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_marker_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_marker_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_marker_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_marker_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->marker = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_marker_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_marker_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_marker_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->marker); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_markersize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_markersize_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_markersize_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_markersize_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->markersize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_markersize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_markersize_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_markersize_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float) ((arg1)->markersize); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_rgba_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float *arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_bg_rgba_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_rgba_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_bg_rgba_set" "', argument " "2"" of type '" "float [4]""'"); } arg2 = (float *)(argp2); { if (arg2) { size_t ii = 0; for (; ii < (size_t)4; ++ii) *(float *)&arg1->bg_rgba[ii] = *((float *)arg2 + ii); } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""bg_rgba""' of type '""float [4]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_rgba_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_bg_rgba_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_rgba_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float *)(float *) ((arg1)->bg_rgba); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_lw_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_bg_lw_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_lw_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_bg_lw_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->bg_lw = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_lw_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_bg_lw_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_lw_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float) ((arg1)->bg_lw); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_box_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_bg_box_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_box_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_bg_box_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->bg_box = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_bg_box_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_bg_box_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_bg_box_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->bg_box); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_fontsize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_fontsize_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_fontsize_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_fontsize_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->fontsize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_fontsize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_fontsize_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_fontsize_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float) ((arg1)->fontsize); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_halign_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; char arg2 ; void *argp1 = 0 ; int res1 = 0 ; char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_halign_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_halign_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_halign_set" "', argument " "2"" of type '" "char""'"); } arg2 = (char)(val2); if (arg1) (arg1)->halign = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_halign_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_halign_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_halign_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (char) ((arg1)->halign); resultobj = SWIG_From_char((char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_valign_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; char arg2 ; void *argp1 = 0 ; int res1 = 0 ; char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_valign_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_valign_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_valign_set" "', argument " "2"" of type '" "char""'"); } arg2 = (char)(val2); if (arg1) (arg1)->valign = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_valign_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_valign_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_valign_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (char) ((arg1)->valign); resultobj = SWIG_From_char((char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_label_offset_x_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_label_offset_x_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_label_offset_x_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_label_offset_x_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->label_offset_x = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_label_offset_x_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_label_offset_x_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_label_offset_x_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (double) ((arg1)->label_offset_x); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_label_offset_y_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_label_offset_y_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_label_offset_y_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_label_offset_y_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->label_offset_y = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_label_offset_y_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_label_offset_y_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_label_offset_y_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (double) ((arg1)->label_offset_y); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_text_bg_layer_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_text_bg_layer_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_text_bg_layer_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_text_bg_layer_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->text_bg_layer = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_text_bg_layer_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_text_bg_layer_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_text_bg_layer_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->text_bg_layer); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_text_fg_layer_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_text_fg_layer_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_text_fg_layer_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_text_fg_layer_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->text_fg_layer = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_text_fg_layer_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_text_fg_layer_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_text_fg_layer_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->text_fg_layer); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_marker_fg_layer_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_marker_fg_layer_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_marker_fg_layer_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_marker_fg_layer_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->marker_fg_layer = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_marker_fg_layer_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_marker_fg_layer_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_marker_fg_layer_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int) ((arg1)->marker_fg_layer); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_cairocmds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; bl *arg2 = (bl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_cairocmds_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_cairocmds_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_bl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_cairocmds_set" "', argument " "2"" of type '" "bl *""'"); } arg2 = (bl *)(argp2); if (arg1) (arg1)->cairocmds = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_cairocmds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; bl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_cairocmds_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_cairocmds_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (bl *) ((arg1)->cairocmds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_bl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_linestep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_linestep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_linestep_set" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_linestep_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->linestep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_linestep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_linestep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_linestep_get" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (float) ((arg1)->linestep); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_view_image_as_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_view_image_as_numpy",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_view_image_as_numpy" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (PyObject *)plot_args_view_image_as_numpy(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_get_image_as_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; PyObject *arg3 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_args_get_image_as_numpy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_get_image_as_numpy" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_get_image_as_numpy" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); arg3 = obj2; result = (PyObject *)plot_args_get_image_as_numpy(arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_set_image_from_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; PyObject *arg2 = (PyObject *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_args_set_image_from_numpy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_set_image_from_numpy" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); arg2 = obj1; ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_args_set_image_from_numpy" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_args_set_image_from_numpy(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_set_wcs_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_args_set_wcs_file",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_set_wcs_file" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_args_set_wcs_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_args_set_wcs_file" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_args_set_wcs_file(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_args_set_size_from_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plot_args_set_size_from_wcs",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_set_size_from_wcs" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); result = (int)plot_args_set_size_from_wcs(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_args_loginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_args_loginit",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_args_loginit" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_args_loginit" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); plot_args_loginit(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plot_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plot_args")) SWIG_fail; result = (struct plot_args *)calloc(1, sizeof(struct plot_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plot_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plot_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plot_args *arg1 = (struct plot_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plot_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plot_args" "', argument " "1"" of type '" "struct plot_args *""'"); } arg1 = (struct plot_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plot_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plot_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plotter_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_name_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_name_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotter_name_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->name) free((char*)arg1->name); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->name = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->name = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotter_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotter_name_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_name_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (char *) ((arg1)->name); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_init_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; plot_func_init_t arg2 = (plot_func_init_t) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_init_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_init_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_struct_plot_args__p_void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plotter_init_set" "', argument " "2"" of type '" "plot_func_init_t""'"); } } if (arg1) (arg1)->init = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_init_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plot_func_init_t result; if (!PyArg_ParseTuple(args,(char *)"O:plotter_init_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_init_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (plot_func_init_t) ((arg1)->init); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_struct_plot_args__p_void); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_init2_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; plot_func_init2_t arg2 = (plot_func_init2_t) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_init2_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_init2_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_struct_plot_args_p_void__int); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plotter_init2_set" "', argument " "2"" of type '" "plot_func_init2_t""'"); } } if (arg1) (arg1)->init2 = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_init2_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plot_func_init2_t result; if (!PyArg_ParseTuple(args,(char *)"O:plotter_init2_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_init2_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (plot_func_init2_t) ((arg1)->init2); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_struct_plot_args_p_void__int); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_command_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; plot_func_command_t arg2 = (plot_func_command_t) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_command_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_command_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plotter_command_set" "', argument " "2"" of type '" "plot_func_command_t""'"); } } if (arg1) (arg1)->command = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_command_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plot_func_command_t result; if (!PyArg_ParseTuple(args,(char *)"O:plotter_command_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_command_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (plot_func_command_t) ((arg1)->command); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_doplot_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; plot_func_plot_t arg2 = (plot_func_plot_t) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_doplot_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_doplot_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plotter_doplot_set" "', argument " "2"" of type '" "plot_func_plot_t""'"); } } if (arg1) (arg1)->doplot = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_doplot_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plot_func_plot_t result; if (!PyArg_ParseTuple(args,(char *)"O:plotter_doplot_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_doplot_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (plot_func_plot_t) ((arg1)->doplot); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_free_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; plot_func_free_t arg2 = (plot_func_free_t) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_free_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_free_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); { int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_struct_plot_args_p_void__void); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ArgError(res), "in method '" "plotter_free_set" "', argument " "2"" of type '" "plot_func_free_t""'"); } } if (arg1) (arg1)->free = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_free_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plot_func_free_t result; if (!PyArg_ParseTuple(args,(char *)"O:plotter_free_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_free_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (plot_func_free_t) ((arg1)->free); resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_struct_plot_args_p_void__void); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_baton_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotter_baton_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_baton_set" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotter_baton_set" "', argument " "2"" of type '" "void *""'"); } if (arg1) (arg1)->baton = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotter_baton_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotter_baton_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotter_baton_get" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); result = (void *) ((arg1)->baton); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotter")) SWIG_fail; result = (struct plotter *)calloc(1, sizeof(struct plotter)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotter, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotter *arg1 = (struct plotter *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotter",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotter" "', argument " "1"" of type '" "struct plotter *""'"); } arg1 = (struct plotter *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotter, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_parse_image_format(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:parse_image_format",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "parse_image_format" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)parse_image_format((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_guess_image_format_from_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:guess_image_format_from_filename",&obj0)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "guess_image_format_from_filename" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); result = (int)guess_image_format_from_filename((char const *)arg1); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_image_format_name_from_code(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:image_format_name_from_code",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "image_format_name_from_code" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); result = (char *)image_format_name_from_code(arg1); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_parse_color(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; float *arg4 = (float *) 0 ; float *arg5 = (float *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:parse_color",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "parse_color" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "parse_color" "', argument " "2"" of type '" "float *""'"); } arg2 = (float *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "parse_color" "', argument " "3"" of type '" "float *""'"); } arg3 = (float *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "parse_color" "', argument " "4"" of type '" "float *""'"); } arg4 = (float *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "parse_color" "', argument " "5"" of type '" "float *""'"); } arg5 = (float *)(argp5); result = (int)parse_color((char const *)arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_parse_color_rgba(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; float *arg2 = (float *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:parse_color_rgba",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "parse_color_rgba" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "parse_color_rgba" "', argument " "2"" of type '" "float *""'"); } arg2 = (float *)(argp2); result = (int)parse_color_rgba((char const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_cairo_set_color(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:cairo_set_color",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cairo_set_color" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cairo_set_color" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)cairo_set_color(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_cairo_set_rgba(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; float *arg2 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:cairo_set_rgba",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cairo_set_rgba" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cairo_set_rgba" "', argument " "2"" of type '" "float const *""'"); } arg2 = (float *)(argp2); cairo_set_rgba(arg1,(float const *)arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_new(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":plotstuff_new")) SWIG_fail; result = (plot_args_t *)plotstuff_new(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plot_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_init(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_read_and_run_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; FILE *arg2 = (FILE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_read_and_run_command",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_read_and_run_command" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_FILE, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_read_and_run_command" "', argument " "2"" of type '" "FILE *""'"); } arg2 = (FILE *)(argp2); result = (int)plotstuff_read_and_run_command(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_run_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_run_command",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_run_command" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_run_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_run_command(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_text_bg_alpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_text_bg_alpha",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_text_bg_alpha" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_text_bg_alpha" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); plotstuff_set_text_bg_alpha(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_plot_layer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_plot_layer",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_plot_layer" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_plot_layer" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_plot_layer(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_get_config(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_get_config",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_get_config" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_get_config" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (void *)plotstuff_get_config(arg1,(char const *)arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_color(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_color",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_color" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_color" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_set_color(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_bgcolor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_bgcolor",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_bgcolor" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_bgcolor" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_set_bgcolor(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_get_alpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_get_alpha",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_get_alpha" "', argument " "1"" of type '" "plot_args_t const *""'"); } arg1 = (plot_args_t *)(argp1); result = (float)plotstuff_get_alpha((struct plot_args const *)arg1); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_alpha(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_alpha",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_alpha" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_alpha" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); result = (int)plotstuff_set_alpha(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_rgba(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float *arg2 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_rgba",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_rgba" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_rgba" "', argument " "2"" of type '" "float const *""'"); } arg2 = (float *)(argp2); result = (int)plotstuff_set_rgba(arg1,(float const *)arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_rgba2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float arg2 ; float arg3 ; float arg4 ; float arg5 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; float val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_set_rgba2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_rgba2" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_rgba2" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); ecode3 = SWIG_AsVal_float(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_set_rgba2" "', argument " "3"" of type '" "float""'"); } arg3 = (float)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_set_rgba2" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_set_rgba2" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); result = (int)plotstuff_set_rgba2(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_bgrgba2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float arg2 ; float arg3 ; float arg4 ; float arg5 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; float val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; float val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_set_bgrgba2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_bgrgba2" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_bgrgba2" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); ecode3 = SWIG_AsVal_float(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_set_bgrgba2" "', argument " "3"" of type '" "float""'"); } arg3 = (float)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_set_bgrgba2" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_set_bgrgba2" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); result = (int)plotstuff_set_bgrgba2(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_marker(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_marker",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_marker" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_marker" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_set_marker(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_markersize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_markersize",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_markersize" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_markersize" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (int)plotstuff_set_markersize(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_set_size",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_size" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_set_size" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plotstuff_set_size(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_size_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_set_size_wcs",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_size_wcs" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_set_size_wcs(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_scale_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_scale_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_scale_wcs" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_scale_wcs" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (int)plotstuff_scale_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_rotate_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_rotate_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_rotate_wcs" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_rotate_wcs" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (int)plotstuff_rotate_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_wcs_box(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; float arg2 ; float arg3 ; float arg4 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; float val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotstuff_set_wcs_box",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_wcs_box" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_wcs_box" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); ecode3 = SWIG_AsVal_float(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_set_wcs_box" "', argument " "3"" of type '" "float""'"); } arg3 = (float)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_set_wcs_box" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); result = (int)plotstuff_set_wcs_box(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_wcs_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_set_wcs_file",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_wcs_file" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_wcs_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_set_wcs_file" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plotstuff_set_wcs_file(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_wcs" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_wcs" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); result = (int)plotstuff_set_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_wcs_tan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; tan_t *arg2 = (tan_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_wcs_tan",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_wcs_tan" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_tan_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_wcs_tan" "', argument " "2"" of type '" "tan_t *""'"); } arg2 = (tan_t *)(argp2); result = (int)plotstuff_set_wcs_tan(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_wcs_sip(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_wcs_sip",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_wcs_sip" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_set_wcs_sip" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); result = (int)plotstuff_set_wcs_sip(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_builtin_apply(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; plot_args_t *arg2 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_builtin_apply",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_builtin_apply" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_builtin_apply" "', argument " "2"" of type '" "plot_args_t *""'"); } arg2 = (plot_args_t *)(argp2); plotstuff_builtin_apply(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_marker_in_bounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_marker_in_bounds",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_marker_in_bounds" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_marker_in_bounds" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_marker_in_bounds" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)plotstuff_marker_in_bounds(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_run_commandf__varargs__(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *varargs) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; char *arg2 = (char *) 0 ; void *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_run_commandf",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_run_commandf" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_run_commandf" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotstuff_run_commandf(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_run_commandf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj; PyObject *varargs; PyObject *newargs; newargs = PyTuple_GetSlice(args,0,2); varargs = PyTuple_GetSlice(args,2,PyTuple_Size(args)); resultobj = _wrap_plotstuff_run_commandf__varargs__(NULL,newargs,varargs); Py_XDECREF(newargs); Py_XDECREF(varargs); return resultobj; } SWIGINTERN PyObject *_wrap_plotstuff_output(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_output",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_output" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_output(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); plotstuff_free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_clear",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_clear" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); plotstuff_clear(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_stack_marker(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_stack_marker",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_stack_marker" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_stack_marker" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_stack_marker" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plotstuff_stack_marker(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_stack_arrow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_stack_arrow",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_stack_arrow" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_stack_arrow" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_stack_arrow" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_stack_arrow" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_stack_arrow" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); plotstuff_stack_arrow(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_stack_text(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; char *arg3 = (char *) 0 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_stack_text",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_stack_text" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_stack_text" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plotstuff_stack_text" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_stack_text" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_stack_text" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); plotstuff_stack_text(arg1,arg2,(char const *)arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_plot_stack(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_plot_stack",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_plot_stack" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_plot_stack" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); result = (int)plotstuff_plot_stack(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_get_maximum_rgba(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; int *arg5 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int temp2 ; int res2 = SWIG_TMPOBJ ; int temp3 ; int res3 = SWIG_TMPOBJ ; int temp4 ; int res4 = SWIG_TMPOBJ ; int temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; arg2 = &temp2; arg3 = &temp3; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_get_maximum_rgba",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_get_maximum_rgba" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); plotstuff_get_maximum_rgba(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_int, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_pixel_scale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_pixel_scale",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_pixel_scale" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (double)plotstuff_pixel_scale(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_radec2xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; arg4 = &temp4; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_radec2xy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_radec2xy" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_radec2xy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_radec2xy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)plotstuff_radec2xy(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_xy2radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; double temp5 ; int res5 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; anbool result; arg5 = &temp5; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotstuff_xy2radec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_xy2radec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_xy2radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_xy2radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plotstuff_xy2radec" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); result = (anbool)plotstuff_xy2radec(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_get_radec_center_and_radius(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; int res2 = SWIG_TMPOBJ ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; int result; arg2 = &temp2; arg3 = &temp3; arg4 = &temp4; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_get_radec_center_and_radius",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_get_radec_center_and_radius" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_get_radec_center_and_radius(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res2)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg2))); } else { int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_get_radec_bounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; int arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double *arg5 = (double *) 0 ; double *arg6 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double temp3 ; int res3 = SWIG_TMPOBJ ; double temp4 ; int res4 = SWIG_TMPOBJ ; double temp5 ; int res5 = SWIG_TMPOBJ ; double temp6 ; int res6 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; arg3 = &temp3; arg4 = &temp4; arg5 = &temp5; arg6 = &temp6; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_get_radec_bounds",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_get_radec_bounds" "', argument " "1"" of type '" "plot_args_t const *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_get_radec_bounds" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); plotstuff_get_radec_bounds((struct plot_args const *)arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); if (SWIG_IsTmpObj(res3)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg3))); } else { int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res4)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg4))); } else { int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res5)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg5))); } else { int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_double, new_flags)); } if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_radec_is_inside_image(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_radec_is_inside_image",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_radec_is_inside_image" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_radec_is_inside_image" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_radec_is_inside_image" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (anbool)plotstuff_radec_is_inside_image(arg1,arg2,arg3); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_line_constant_ra(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; anbool arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; unsigned char val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_line_constant_ra",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_line_constant_ra" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_line_constant_ra" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_line_constant_ra" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_line_constant_ra" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_unsigned_SS_char(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_line_constant_ra" "', argument " "5"" of type '" "anbool""'"); } arg5 = (anbool)(val5); result = (int)plotstuff_line_constant_ra(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_line_constant_dec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotstuff_line_constant_dec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_line_constant_dec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_line_constant_dec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_line_constant_dec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_line_constant_dec" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (int)plotstuff_line_constant_dec(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_line_constant_dec2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plotstuff_line_constant_dec2",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_line_constant_dec2" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_line_constant_dec2" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_line_constant_dec2" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotstuff_line_constant_dec2" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plotstuff_line_constant_dec2" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); result = (int)plotstuff_line_constant_dec2(arg1,arg2,arg3,arg4,arg5); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_text_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotstuff_text_xy",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_text_xy" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_text_xy" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_text_xy" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plotstuff_text_xy" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)plotstuff_text_xy(arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_text_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotstuff_text_radec",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_text_radec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_text_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_text_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plotstuff_text_radec" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); result = (int)plotstuff_text_radec(arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_From_int((int)(result)); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_move_to_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_move_to_radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_move_to_radec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_move_to_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_move_to_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)plotstuff_move_to_radec(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_line_to_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_line_to_radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_line_to_radec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_line_to_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_line_to_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)plotstuff_line_to_radec(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_close_path(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_close_path",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_close_path" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_close_path(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_stroke(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_stroke",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_stroke" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_stroke(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_fill(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_fill",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_fill" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_fill(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_stroke_preserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_stroke_preserve",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_stroke_preserve" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_stroke_preserve(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_fill_preserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_fill_preserve",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_fill_preserve" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (int)plotstuff_fill_preserve(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_move_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_move_to",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_move_to" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_move_to" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_move_to" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plotstuff_move_to(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_line_to(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_line_to",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_line_to" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_line_to" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_line_to" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plotstuff_line_to(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_marker(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_marker",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_marker" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_marker" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_marker" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plotstuff_marker(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_marker_radec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotstuff_marker_radec",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_marker_radec" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_marker_radec" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotstuff_marker_radec" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)plotstuff_marker_radec(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_append_doubles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; dl *arg2 = (dl *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_append_doubles",&obj0,&obj1)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_append_doubles" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_dl, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotstuff_append_doubles" "', argument " "2"" of type '" "dl *""'"); } arg2 = (dl *)(argp2); result = (int)plotstuff_append_doubles((char const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_dashed(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotstuff_set_dashed",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_dashed" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotstuff_set_dashed" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); plotstuff_set_dashed(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotstuff_set_solid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotstuff_set_solid",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotstuff_set_solid" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); plotstuff_set_solid(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *PTYPE_FLOAT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PTYPE_FLOAT",SWIG_From_int((int)(0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PTYPE_INT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PTYPE_INT",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PTYPE_DOUBLE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PTYPE_DOUBLE",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PTYPE_UINT8_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PTYPE_UINT8",SWIG_From_int((int)(3))); return SWIG_Py_Void(); } SWIGINTERN PyObject *PTYPE_INT16_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "PTYPE_INT16",SWIG_From_int((int)(4))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_8_UNSIGNED_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_8_UNSIGNED",SWIG_From_int((int)((8)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_16_SIGNED_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_16_SIGNED",SWIG_From_int((int)((16)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_32_SIGNED_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_32_SIGNED",SWIG_From_int((int)((32)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_IEEE_FLOAT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_IEEE_FLOAT",SWIG_From_int((int)((-32)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_IEEE_DOUBLE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_IEEE_DOUBLE",SWIG_From_int((int)((-64)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *BPP_DEFAULT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "BPP_DEFAULT",SWIG_From_int((int)((-32)))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_qfitsdumper_filename_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_filename_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_filename_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfitsdumper_filename_set" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); if (arg2) { size_t size = strlen((const char *)((const char *)(arg2))) + 1; arg1->filename = (char const *)(char *)memcpy((char *)malloc((size)*sizeof(char)), arg2, sizeof(char)*(size)); } else { arg1->filename = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_filename_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_filename_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_filename_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (char *) ((arg1)->filename); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_npix_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_npix_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_npix_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfitsdumper_npix_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->npix = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_npix_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_npix_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_npix_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (int) ((arg1)->npix); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_ptype_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_ptype_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_ptype_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfitsdumper_ptype_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->ptype = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_ptype_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_ptype_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_ptype_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (int) ((arg1)->ptype); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_ibuf_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; int *arg2 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_ibuf_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_ibuf_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfitsdumper_ibuf_set" "', argument " "2"" of type '" "int const *""'"); } arg2 = (int *)(argp2); if (arg1) (arg1)->ibuf = (int const *)arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_ibuf_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_ibuf_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_ibuf_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (int *) ((arg1)->ibuf); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_int, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_fbuf_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; float *arg2 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_fbuf_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_fbuf_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfitsdumper_fbuf_set" "', argument " "2"" of type '" "float const *""'"); } arg2 = (float *)(argp2); if (arg1) (arg1)->fbuf = (float const *)arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_fbuf_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_fbuf_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_fbuf_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (float *) ((arg1)->fbuf); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_dbuf_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_dbuf_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_dbuf_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfitsdumper_dbuf_set" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); if (arg1) (arg1)->dbuf = (double const *)arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_dbuf_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_dbuf_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_dbuf_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (double *) ((arg1)->dbuf); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_vbuf_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_vbuf_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_vbuf_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "qfitsdumper_vbuf_set" "', argument " "2"" of type '" "void const *""'"); } if (arg1) (arg1)->vbuf = (void const *)arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_vbuf_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_vbuf_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_vbuf_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (void *) ((arg1)->vbuf); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_out_ptype_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:qfitsdumper_out_ptype_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_out_ptype_set" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "qfitsdumper_out_ptype_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->out_ptype = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_qfitsdumper_out_ptype_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfitsdumper_out_ptype_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfitsdumper_out_ptype_get" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); result = (int) ((arg1)->out_ptype); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_qfitsdumper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_qfitsdumper")) SWIG_fail; result = (struct qfitsdumper *)calloc(1, sizeof(struct qfitsdumper)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_qfitsdumper, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_qfitsdumper(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct qfitsdumper *arg1 = (struct qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_qfitsdumper",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_qfitsdumper" "', argument " "1"" of type '" "struct qfitsdumper *""'"); } arg1 = (struct qfitsdumper *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *qfitsdumper_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_qfitsdumper, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_qfits_pixdump(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; qfitsdumper *arg1 = (qfitsdumper *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:qfits_pixdump",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_qfitsdumper, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "qfits_pixdump" "', argument " "1"" of type '" "qfitsdumper const *""'"); } arg1 = (qfitsdumper *)(argp1); result = (int)qfits_pixdump((struct qfitsdumper const *)arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_convolve_get_gaussian_kernel_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; int *arg3 = (int *) 0 ; int *arg4 = (int *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:convolve_get_gaussian_kernel_f",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "convolve_get_gaussian_kernel_f" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "convolve_get_gaussian_kernel_f" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "convolve_get_gaussian_kernel_f" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "convolve_get_gaussian_kernel_f" "', argument " "4"" of type '" "int *""'"); } arg4 = (int *)(argp4); result = (float *)convolve_get_gaussian_kernel_f(arg1,arg2,arg3,arg4); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_convolve_separable_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float *arg4 = (float *) 0 ; int arg5 ; int arg6 ; float *arg7 = (float *) 0 ; float *arg8 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; void *argp7 = 0 ; int res7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:convolve_separable_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "convolve_separable_f" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "convolve_separable_f" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "convolve_separable_f" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "convolve_separable_f" "', argument " "4"" of type '" "float const *""'"); } arg4 = (float *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "convolve_separable_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "convolve_separable_f" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res7 = SWIG_ConvertPtr(obj6, &argp7,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res7)) { SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "convolve_separable_f" "', argument " "7"" of type '" "float *""'"); } arg7 = (float *)(argp7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "convolve_separable_f" "', argument " "8"" of type '" "float *""'"); } arg8 = (float *)(argp8); result = (float *)convolve_separable_f((float const *)arg1,arg2,arg3,(float const *)arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_convolve_separable_weighted_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float *arg4 = (float *) 0 ; float *arg5 = (float *) 0 ; int arg6 ; int arg7 ; float *arg8 = (float *) 0 ; float *arg9 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; int val6 ; int ecode6 = 0 ; int val7 ; int ecode7 = 0 ; void *argp8 = 0 ; int res8 = 0 ; void *argp9 = 0 ; int res9 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; PyObject * obj8 = 0 ; float *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:convolve_separable_weighted_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "convolve_separable_weighted_f" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "convolve_separable_weighted_f" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "convolve_separable_weighted_f" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "convolve_separable_weighted_f" "', argument " "4"" of type '" "float const *""'"); } arg4 = (float *)(argp4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "convolve_separable_weighted_f" "', argument " "5"" of type '" "float const *""'"); } arg5 = (float *)(argp5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "convolve_separable_weighted_f" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); ecode7 = SWIG_AsVal_int(obj6, &val7); if (!SWIG_IsOK(ecode7)) { SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "convolve_separable_weighted_f" "', argument " "7"" of type '" "int""'"); } arg7 = (int)(val7); res8 = SWIG_ConvertPtr(obj7, &argp8,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "convolve_separable_weighted_f" "', argument " "8"" of type '" "float *""'"); } arg8 = (float *)(argp8); res9 = SWIG_ConvertPtr(obj8, &argp9,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res9)) { SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "convolve_separable_weighted_f" "', argument " "9"" of type '" "float *""'"); } arg9 = (float *)(argp9); result = (float *)convolve_separable_weighted_f((float const *)arg1,arg2,arg3,(float const *)arg4,(float const *)arg5,arg6,arg7,arg8,arg9); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_c_image_numpy_view(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:c_image_numpy_view",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "c_image_numpy_view" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "c_image_numpy_view" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "c_image_numpy_view" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (PyObject *)c_image_numpy_view(arg1,arg2,arg3); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; void *arg1 = (void *) 0 ; int res1 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:free",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0,SWIG_as_voidptrptr(&arg1), 0, 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "free" "', argument " "1"" of type '" "void *""'"); } free(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_point_in_polygon(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; dl *arg3 = (dl *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:point_in_polygon",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "point_in_polygon" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "point_in_polygon" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_dl, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "point_in_polygon" "', argument " "3"" of type '" "dl const *""'"); } arg3 = (dl *)(argp3); result = (int)point_in_polygon(arg1,arg2,(dl const *)arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_tan_vectors(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:tan_vectors",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tan_vectors" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "tan_vectors" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "tan_vectors" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); tan_vectors((double const *)arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_invert_2by2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double (*arg1)[2] ; double (*arg2)[2] ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:invert_2by2",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_a_2__double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "invert_2by2" "', argument " "1"" of type '" "double const [2][2]""'"); } arg1 = (double (*)[2])(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_a_2__double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "invert_2by2" "', argument " "2"" of type '" "double [2][2]""'"); } arg2 = (double (*)[2])(argp2); result = (int)invert_2by2((double const (*)[2])arg1,(double (*)[2])arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_invert_2by2_arr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:invert_2by2_arr",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "invert_2by2_arr" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "invert_2by2_arr" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); result = (int)invert_2by2_arr((double const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_is_power_of_two(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; unsigned int arg1 ; unsigned int val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:is_power_of_two",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "is_power_of_two" "', argument " "1"" of type '" "unsigned int""'"); } arg1 = (unsigned int)(val1); result = (int)is_power_of_two(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_matrix_matrix_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:matrix_matrix_3",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "matrix_matrix_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "matrix_matrix_3" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "matrix_matrix_3" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); matrix_matrix_3(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_matrix_vector_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:matrix_vector_3",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "matrix_vector_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "matrix_vector_3" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "matrix_vector_3" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); matrix_vector_3(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_dot_product_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:dot_product_3",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "dot_product_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "dot_product_3" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); result = (double)dot_product_3(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_vector_length_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:vector_length_3",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_length_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); result = (double)vector_length_3(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_vector_length_squared_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:vector_length_squared_3",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "vector_length_squared_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); result = (double)vector_length_squared_3(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_inverse_3by3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:inverse_3by3",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "inverse_3by3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); result = (double)inverse_3by3(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_image_to_xyz(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double *arg3 = (double *) 0 ; double *arg4 = (double *) 0 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:image_to_xyz",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "image_to_xyz" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "image_to_xyz" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "image_to_xyz" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "image_to_xyz" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); image_to_xyz(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_fit_transform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; double *arg4 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:fit_transform",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "fit_transform" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "fit_transform" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "fit_transform" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "fit_transform" "', argument " "4"" of type '" "double *""'"); } arg4 = (double *)(argp4); fit_transform(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_uniform_sample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:uniform_sample",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "uniform_sample" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "uniform_sample" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (double)uniform_sample(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_gaussian_sample(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OO:gaussian_sample",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "gaussian_sample" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "gaussian_sample" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); result = (double)gaussian_sample(arg1,arg2); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *EDGE_TRUNCATE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "EDGE_TRUNCATE",SWIG_From_int((int)(0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *EDGE_AVERAGE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "EDGE_AVERAGE",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_get_output_image_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int arg4 ; int *arg5 = (int *) 0 ; int *arg6 = (int *) 0 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; void *argp5 = 0 ; int res5 = 0 ; void *argp6 = 0 ; int res6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:get_output_image_size",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "get_output_image_size" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "get_output_image_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "get_output_image_size" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "get_output_image_size" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); res5 = SWIG_ConvertPtr(obj4, &argp5,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "get_output_image_size" "', argument " "5"" of type '" "int *""'"); } arg5 = (int *)(argp5); res6 = SWIG_ConvertPtr(obj5, &argp6,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res6)) { SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "get_output_image_size" "', argument " "6"" of type '" "int *""'"); } arg6 = (int *)(argp6); result = (int)get_output_image_size(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_average_image_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; int arg4 ; int arg5 ; int *arg6 = (int *) 0 ; int *arg7 = (int *) 0 ; float *arg8 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; int temp6 ; int res6 = SWIG_TMPOBJ ; int temp7 ; int res7 = SWIG_TMPOBJ ; void *argp8 = 0 ; int res8 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; float *result = 0 ; arg6 = &temp6; arg7 = &temp7; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:average_image_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "average_image_f" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "average_image_f" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "average_image_f" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "average_image_f" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "average_image_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); res8 = SWIG_ConvertPtr(obj5, &argp8,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res8)) { SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "average_image_f" "', argument " "8"" of type '" "float *""'"); } arg8 = (float *)(argp8); result = (float *)average_image_f((float const *)arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); if (SWIG_IsTmpObj(res6)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg6))); } else { int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res7)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg7))); } else { int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_int, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_average_weighted_image_f(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; float *arg2 = (float *) 0 ; int arg3 ; int arg4 ; int arg5 ; int arg6 ; int *arg7 = (int *) 0 ; int *arg8 = (int *) 0 ; float *arg9 = (float *) 0 ; float arg10 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; int val4 ; int ecode4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; int temp7 ; int res7 = SWIG_TMPOBJ ; int temp8 ; int res8 = SWIG_TMPOBJ ; void *argp9 = 0 ; int res9 = 0 ; float val10 ; int ecode10 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; PyObject * obj6 = 0 ; PyObject * obj7 = 0 ; float *result = 0 ; arg7 = &temp7; arg8 = &temp8; if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:average_weighted_image_f",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "average_weighted_image_f" "', argument " "1"" of type '" "float const *""'"); } arg1 = (float *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "average_weighted_image_f" "', argument " "2"" of type '" "float const *""'"); } arg2 = (float *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "average_weighted_image_f" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_int(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "average_weighted_image_f" "', argument " "4"" of type '" "int""'"); } arg4 = (int)(val4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "average_weighted_image_f" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "average_weighted_image_f" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); res9 = SWIG_ConvertPtr(obj6, &argp9,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res9)) { SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "average_weighted_image_f" "', argument " "9"" of type '" "float *""'"); } arg9 = (float *)(argp9); ecode10 = SWIG_AsVal_float(obj7, &val10); if (!SWIG_IsOK(ecode10)) { SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "average_weighted_image_f" "', argument " "10"" of type '" "float""'"); } arg10 = (float)(val10); result = (float *)average_weighted_image_f((float const *)arg1,(float const *)arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_float, 0 | 0 ); if (SWIG_IsTmpObj(res7)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg7))); } else { int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_int, new_flags)); } if (SWIG_IsTmpObj(res8)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg8))); } else { int new_flags = SWIG_IsNewObj(res8) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg8), SWIGTYPE_p_int, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_imax(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:imax",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "imax" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "imax" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)imax(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_imin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:imin",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "imin" "', argument " "1"" of type '" "int""'"); } arg1 = (int)(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "imin" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); result = (int)imin(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq_exceeds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOOO:distsq_exceeds",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "distsq_exceeds" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "distsq_exceeds" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "distsq_exceeds" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "distsq_exceeds" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); result = (double)distsq_exceeds(arg1,arg2,arg3,arg4); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_square(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double val1 ; int ecode1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:square",&obj0)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "square" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); result = (double)square(arg1); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_inrange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double arg1 ; double arg2 ; double arg3 ; double val1 ; int ecode1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:inrange",&obj0,&obj1,&obj2)) SWIG_fail; ecode1 = SWIG_AsVal_double(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "inrange" "', argument " "1"" of type '" "double""'"); } arg1 = (double)(val1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "inrange" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "inrange" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)inrange(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_distsq(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"OOO:distsq",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "distsq" "', argument " "1"" of type '" "double const *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "distsq" "', argument " "2"" of type '" "double const *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "distsq" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (double)distsq((double const *)arg1,(double const *)arg2,arg3); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_cross_product(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:cross_product",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "cross_product" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "cross_product" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "cross_product" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); cross_product(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_normalize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:normalize",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "normalize" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "normalize" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "normalize" "', argument " "3"" of type '" "double *""'"); } arg3 = (double *)(argp3); normalize(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_normalize_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; double *arg1 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:normalize_3",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "normalize_3" "', argument " "1"" of type '" "double *""'"); } arg1 = (double *)(argp1); normalize_3(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_fn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fn_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotimage_args_fn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->fn) free((char*)arg1->fn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->fn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->fn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_fn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fn_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (char *) ((arg1)->fn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_format_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_format_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_format_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_format_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->format = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_format_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_format_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_format_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->format); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_resample_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_resample_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_resample_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_resample_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->resample = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_resample_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_resample_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_resample_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (anbool) ((arg1)->resample); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_downsample_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_downsample_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_downsample_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_downsample_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->downsample = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_downsample_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_downsample_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_downsample_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->downsample); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_arcsinh_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_arcsinh_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_arcsinh_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_arcsinh_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->arcsinh = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_arcsinh_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_arcsinh_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_arcsinh_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->arcsinh); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_rgbscale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double *arg2 ; void *argp1 = 0 ; int res1 = 0 ; double temp2[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_rgbscale_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_rgbscale_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); { int i; if (!PySequence_Check(obj1)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence"); return NULL; } if (PySequence_Length(obj1) != 3) { PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 3 elements"); return NULL; } for (i = 0; i < 3; i++) { PyObject *o = PySequence_GetItem(obj1,i); if (PyNumber_Check(o)) { temp2[i] = PyFloat_AsDouble(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } { if (arg2) { size_t ii = 0; for (; ii < (size_t)3; ++ii) *(double *)&arg1->rgbscale[ii] = *((double *)arg2 + ii); } else { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""rgbscale""' of type '""double [3]""'"); } } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_rgbscale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_rgbscale_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_rgbscale_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double *)(double *) ((arg1)->rgbscale); { int i; resultobj = PyList_New(3); for (i = 0; i < 3; i++) { PyObject *o = PyFloat_FromDouble(result[i]); PyList_SetItem(resultobj,i,o); } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_alpha_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_alpha_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_alpha_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_alpha_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->alpha = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_alpha_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_alpha_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_alpha_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->alpha); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_wcs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_wcs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_wcs_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotimage_args_wcs_set" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); if (arg1) (arg1)->wcs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_wcs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_wcs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_wcs_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (anwcs_t *) ((arg1)->wcs); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_gridsize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_gridsize_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_gridsize_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_gridsize_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->gridsize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_gridsize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_gridsize_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_gridsize_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->gridsize); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_low_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_image_low_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_low_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_image_low_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->image_low = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_low_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_image_low_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_low_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->image_low); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_high_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_image_high_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_high_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_image_high_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->image_high = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_high_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_image_high_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_high_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->image_high); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_null_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_image_null_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_null_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_image_null_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->image_null = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_null_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_image_null_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_null_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->image_null); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_valid_low_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_image_valid_low_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_valid_low_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_image_valid_low_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->image_valid_low = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_valid_low_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_image_valid_low_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_valid_low_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->image_valid_low); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_valid_high_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_image_valid_high_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_valid_high_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_image_valid_high_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->image_valid_high = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_image_valid_high_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_image_valid_high_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_image_valid_high_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (double) ((arg1)->image_valid_high); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_low_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_n_invalid_low_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_low_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_n_invalid_low_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->n_invalid_low = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_low_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_n_invalid_low_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_low_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->n_invalid_low); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_high_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_n_invalid_high_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_high_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_n_invalid_high_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->n_invalid_high = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_high_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_n_invalid_high_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_high_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->n_invalid_high); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_null_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_n_invalid_null_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_null_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_n_invalid_null_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->n_invalid_null = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_n_invalid_null_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_n_invalid_null_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_n_invalid_null_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->n_invalid_null); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fitsext_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_fitsext_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fitsext_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_fitsext_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->fitsext = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fitsext_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_fitsext_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fitsext_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->fitsext); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fitsplane_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_fitsplane_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fitsplane_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_fitsplane_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->fitsplane = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_fitsplane_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_fitsplane_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_fitsplane_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->fitsplane); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_auto_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_auto_scale_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_auto_scale_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_auto_scale_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->auto_scale = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_auto_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_auto_scale_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_auto_scale_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (anbool) ((arg1)->auto_scale); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_img_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; unsigned char *arg2 = (unsigned char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_img_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_img_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_unsigned_char, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotimage_args_img_set" "', argument " "2"" of type '" "unsigned char *""'"); } arg2 = (unsigned char *)(argp2); if (arg1) (arg1)->img = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_img_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; unsigned char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_img_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_img_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (unsigned char *) ((arg1)->img); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_unsigned_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_W_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_W_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_W_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_W_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->W = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_W_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_W_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_W_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->W); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_H_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_H_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_H_set" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_H_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->H = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_H_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_H_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_H_get" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int) ((arg1)->H); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args__set_image_from_numpy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; PyObject *arg2 = (PyObject *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args__set_image_from_numpy",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args__set_image_from_numpy" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); arg2 = obj1; result = (int)plotimage_args__set_image_from_numpy(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_set_wcs_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotimage_args_set_wcs_file",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_set_wcs_file" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotimage_args_set_wcs_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotimage_args_set_wcs_file" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plotimage_args_set_wcs_file(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_set_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotimage_args_set_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_set_file" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotimage_args_set_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotimage_args_set_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_set_rgbscale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; double arg2 ; double arg3 ; double arg4 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:plotimage_args_set_rgbscale",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_set_rgbscale" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotimage_args_set_rgbscale" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotimage_args_set_rgbscale" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plotimage_args_set_rgbscale" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); plotimage_args_set_rgbscale(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_get_image_width(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_get_image_width",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_get_image_width" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int)plotimage_args_get_image_width(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotimage_args_get_image_height(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotimage_args_get_image_height",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotimage_args_get_image_height" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); result = (int)plotimage_args_get_image_height(arg1); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotimage_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotimage_args")) SWIG_fail; result = (struct plotimage_args *)calloc(1, sizeof(struct plotimage_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotimage_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotimage_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotimage_args *arg1 = (struct plotimage_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotimage_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotimage_args" "', argument " "1"" of type '" "struct plotimage_args *""'"); } arg1 = (struct plotimage_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotimage_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotimage_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_image_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotimage_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_image_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotimage_t *)plot_image_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotimage_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_set_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_image_set_wcs",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_set_wcs" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_set_wcs" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_image_set_wcs" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_image_set_wcs(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_image_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_image_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_image_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_image_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_image_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_image_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_image_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_image_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_image_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_image_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_image_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_image_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_image_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_free" "', argument " "2"" of type '" "void *""'"); } plot_image_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_getsize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; int *arg2 = (int *) 0 ; int *arg3 = (int *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_image_getsize",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_getsize" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_getsize" "', argument " "2"" of type '" "int *""'"); } arg2 = (int *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_int, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_image_getsize" "', argument " "3"" of type '" "int *""'"); } arg3 = (int *)(argp3); result = (int)plot_image_getsize(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_set_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_set_filename",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_set_filename" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_set_filename" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_image_set_filename(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_image_setsize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; plotimage_t *arg2 = (plotimage_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_setsize",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_setsize" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_setsize" "', argument " "2"" of type '" "plotimage_t *""'"); } arg2 = (plotimage_t *)(argp2); result = (int)plot_image_setsize(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_get_percentile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; plotimage_t *arg2 = (plotimage_t *) 0 ; double arg3 ; unsigned char *arg4 = (unsigned char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; double val3 ; int ecode3 = 0 ; unsigned char temp4[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; { arg4 = temp4; } if (!PyArg_ParseTuple(args,(char *)"OOO:plot_image_get_percentile",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_get_percentile" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_get_percentile" "', argument " "2"" of type '" "plotimage_t *""'"); } arg2 = (plotimage_t *)(argp2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_image_get_percentile" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)plot_image_get_percentile(arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); { // Append output value arg4 to resultobj if (result) { Py_DECREF(resultobj); resultobj = Py_None; } else { int i; Py_DECREF(resultobj); resultobj = PyList_New(3); for (i=0; i<3; i++) { PyObject *o = PyInt_FromLong((long)arg4[i]); PyList_SetItem(resultobj,i,o); } } } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_add_to_pixels(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; int *arg2 ; void *argp1 = 0 ; int res1 = 0 ; int temp2[3] ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_add_to_pixels",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_add_to_pixels" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); { int i; // Convert sequence of ints to int[3] if (!PySequence_Check(obj1) || (PySequence_Length(obj1) != 3)) { PyErr_SetString(PyExc_ValueError,"Expected a sequence of length 3"); return NULL; } for (i=0; i<3; i++) { PyObject *o = PySequence_GetItem(obj1, i); if (PyNumber_Check(o)) { temp2[i] = (int)PyInt_AsLong(o); } else { PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers"); return NULL; } } arg2 = temp2; } plot_image_add_to_pixels(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_scale_float(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; float *arg2 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; unsigned char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_scale_float",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_scale_float" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_scale_float" "', argument " "2"" of type '" "float const *""'"); } arg2 = (float *)(argp2); result = (unsigned char *)plot_image_scale_float(arg1,(float const *)arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_unsigned_char, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_rgba_data(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; plotimage_t *arg2 = (plotimage_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_rgba_data",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_rgba_data" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_rgba_data" "', argument " "2"" of type '" "plotimage_t *""'"); } arg2 = (plotimage_t *)(argp2); plot_image_rgba_data(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; plotimage_t *arg2 = (plotimage_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_image_read",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_read" "', argument " "1"" of type '" "plot_args_t const *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_image_read" "', argument " "2"" of type '" "plotimage_t *""'"); } arg2 = (plotimage_t *)(argp2); result = (int)plot_image_read((struct plot_args const *)arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_make_color_transparent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotimage_t *arg1 = (plotimage_t *) 0 ; unsigned char arg2 ; unsigned char arg3 ; unsigned char arg4 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; unsigned char val3 ; int ecode3 = 0 ; unsigned char val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_image_make_color_transparent",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotimage_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_make_color_transparent" "', argument " "1"" of type '" "plotimage_t *""'"); } arg1 = (plotimage_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_image_make_color_transparent" "', argument " "2"" of type '" "unsigned char""'"); } arg2 = (unsigned char)(val2); ecode3 = SWIG_AsVal_unsigned_SS_char(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_image_make_color_transparent" "', argument " "3"" of type '" "unsigned char""'"); } arg3 = (unsigned char)(val3); ecode4 = SWIG_AsVal_unsigned_SS_char(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plot_image_make_color_transparent" "', argument " "4"" of type '" "unsigned char""'"); } arg4 = (unsigned char)(val4); plot_image_make_color_transparent(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_image_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_image_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_image_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_image_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_wcs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotoutline_args_wcs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_wcs_set" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotoutline_args_wcs_set" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); if (arg1) (arg1)->wcs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_wcs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotoutline_args_wcs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_wcs_get" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); result = (anwcs_t *) ((arg1)->wcs); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_stepsize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotoutline_args_stepsize_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_stepsize_set" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotoutline_args_stepsize_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->stepsize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_stepsize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotoutline_args_stepsize_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_stepsize_get" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); result = (double) ((arg1)->stepsize); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_fill_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotoutline_args_fill_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_fill_set" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotoutline_args_fill_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->fill = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_fill_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotoutline_args_fill_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_fill_get" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); result = (anbool) ((arg1)->fill); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_set_wcs_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotoutline_args_set_wcs_file",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_set_wcs_file" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotoutline_args_set_wcs_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotoutline_args_set_wcs_file" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plotoutline_args_set_wcs_file(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotoutline_args_set_wcs_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotoutline_args_set_wcs_size",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotoutline_args_set_wcs_size" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotoutline_args_set_wcs_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plotoutline_args_set_wcs_size" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plotoutline_args_set_wcs_size(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotoutline_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotoutline_args")) SWIG_fail; result = (struct plotoutline_args *)calloc(1, sizeof(struct plotoutline_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotoutline_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotoutline_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotoutline_args *arg1 = (struct plotoutline_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotoutline_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotoutline_args" "', argument " "1"" of type '" "struct plotoutline_args *""'"); } arg1 = (struct plotoutline_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotoutline_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotoutline_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_outline_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotoutline_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_outline_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotoutline_t *)plot_outline_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotoutline_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_outline_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_outline_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_outline_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_outline_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_outline_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_outline_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_outline_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_outline_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_outline_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_outline_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_outline_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_outline_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_outline_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_outline_free" "', argument " "2"" of type '" "void *""'"); } plot_outline_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_set_wcs_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotoutline_t *arg1 = (plotoutline_t *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_outline_set_wcs_file",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_set_wcs_file" "', argument " "1"" of type '" "plotoutline_t *""'"); } arg1 = (plotoutline_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_outline_set_wcs_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_outline_set_wcs_file" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_outline_set_wcs_file(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_set_wcs_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotoutline_t *arg1 = (plotoutline_t *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_outline_set_wcs_size",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_set_wcs_size" "', argument " "1"" of type '" "plotoutline_t *""'"); } arg1 = (plotoutline_t *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_outline_set_wcs_size" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_outline_set_wcs_size" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_outline_set_wcs_size(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_set_wcs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotoutline_t *arg1 = (plotoutline_t *) 0 ; sip_t *arg2 = (sip_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_outline_set_wcs",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_set_wcs" "', argument " "1"" of type '" "plotoutline_t *""'"); } arg1 = (plotoutline_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_sip_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_outline_set_wcs" "', argument " "2"" of type '" "sip_t *""'"); } arg2 = (sip_t *)(argp2); result = (int)plot_outline_set_wcs(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_set_fill(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotoutline_t *arg1 = (plotoutline_t *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_outline_set_fill",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotoutline_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_set_fill" "', argument " "1"" of type '" "plotoutline_t *""'"); } arg1 = (plotoutline_t *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_outline_set_fill" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); result = (int)plot_outline_set_fill(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_outline_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_outline_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_outline_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_outline_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_dolabel_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_dolabel_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_dolabel_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_dolabel_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->dolabel = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_dolabel_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_dolabel_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_dolabel_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (anbool) ((arg1)->dolabel); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_rastep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_rastep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_rastep_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_rastep_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->rastep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_rastep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_rastep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_rastep_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->rastep); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_decstep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_decstep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_decstep_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_decstep_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->decstep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_decstep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_decstep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_decstep_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->decstep); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralabelstep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_ralabelstep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralabelstep_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_ralabelstep_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->ralabelstep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralabelstep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_ralabelstep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralabelstep_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->ralabelstep); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declabelstep_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_declabelstep_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declabelstep_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_declabelstep_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->declabelstep = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declabelstep_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_declabelstep_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declabelstep_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->declabelstep); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralabeldir_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_ralabeldir_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralabeldir_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_ralabeldir_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->ralabeldir = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralabeldir_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_ralabeldir_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralabeldir_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (int) ((arg1)->ralabeldir); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declabeldir_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_declabeldir_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declabeldir_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_declabeldir_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->declabeldir = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declabeldir_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_declabeldir_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declabeldir_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (int) ((arg1)->declabeldir); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_ralo_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralo_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_ralo_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->ralo = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_ralo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_ralo_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_ralo_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->ralo); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_rahi_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_rahi_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_rahi_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_rahi_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->rahi = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_rahi_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_rahi_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_rahi_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->rahi); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_declo_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declo_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_declo_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->declo = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_declo_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_declo_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_declo_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->declo); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_dechi_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_dechi_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_dechi_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotgrid_args_dechi_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->dechi = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_dechi_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_dechi_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_dechi_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (double) ((arg1)->dechi); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_raformat_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_raformat_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_raformat_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotgrid_args_raformat_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->raformat) free((char*)arg1->raformat); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->raformat = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->raformat = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_raformat_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_raformat_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_raformat_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (char *) ((arg1)->raformat); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_decformat_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotgrid_args_decformat_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_decformat_set" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotgrid_args_decformat_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->decformat) free((char*)arg1->decformat); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->decformat = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->decformat = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_decformat_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotgrid_args_decformat_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_decformat_get" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); result = (char *) ((arg1)->decformat); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotgrid_args_set_formats(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plotgrid_args_set_formats",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotgrid_args_set_formats" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotgrid_args_set_formats" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plotgrid_args_set_formats" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); result = (int)plotgrid_args_set_formats(arg1,(char const *)arg2,(char const *)arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_new_plotgrid_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotgrid_args")) SWIG_fail; result = (struct plotgrid_args *)calloc(1, sizeof(struct plotgrid_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotgrid_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotgrid_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotgrid_args *arg1 = (struct plotgrid_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotgrid_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotgrid_args" "', argument " "1"" of type '" "struct plotgrid_args *""'"); } arg1 = (struct plotgrid_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotgrid_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotgrid_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_grid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotgrid_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_grid_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotgrid_t *)plot_grid_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotgrid_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_grid_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_grid_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_set_formats(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotgrid_t *arg1 = (plotgrid_t *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int res3 ; char *buf3 = 0 ; int alloc3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_grid_set_formats",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotgrid_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_set_formats" "', argument " "1"" of type '" "plotgrid_t *""'"); } arg1 = (plotgrid_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_grid_set_formats" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_grid_set_formats" "', argument " "3"" of type '" "char const *""'"); } arg3 = (char *)(buf3); result = (int)plot_grid_set_formats(arg1,(char const *)arg2,(char const *)arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); if (alloc3 == SWIG_NEWOBJ) free((char*)buf3); return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_grid_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_grid_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_grid_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_grid_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_grid_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_grid_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_grid_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_grid_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_grid_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_grid_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_grid_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_grid_free" "', argument " "2"" of type '" "void *""'"); } plot_grid_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *DIRECTION_DEFAULT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIRECTION_DEFAULT",SWIG_From_int((int)(0))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DIRECTION_POS_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIRECTION_POS",SWIG_From_int((int)(1))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DIRECTION_NEG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIRECTION_NEG",SWIG_From_int((int)(2))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DIRECTION_POSNEG_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIRECTION_POSNEG",SWIG_From_int((int)(3))); return SWIG_Py_Void(); } SWIGINTERN PyObject *DIRECTION_NEGPOS_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "DIRECTION_NEGPOS",SWIG_From_int((int)(4))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_grid_add_label(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; char *arg5 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; int res5 ; char *buf5 = 0 ; int alloc5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:plot_grid_add_label",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_add_label" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_grid_add_label" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_grid_add_label" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plot_grid_add_label" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5); if (!SWIG_IsOK(res5)) { SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "plot_grid_add_label" "', argument " "5"" of type '" "char const *""'"); } arg5 = (char *)(buf5); plot_grid_add_label(arg1,arg2,arg3,arg4,(char const *)arg5); resultobj = SWIG_Py_Void(); if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return resultobj; fail: if (alloc5 == SWIG_NEWOBJ) free((char*)buf5); return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_find_ra_label_location(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; double temp7 ; int res7 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; arg7 = &temp7; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:plot_grid_find_ra_label_location",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_find_ra_label_location" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_grid_find_ra_label_location" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_grid_find_ra_label_location" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plot_grid_find_ra_label_location" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plot_grid_find_ra_label_location" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "plot_grid_find_ra_label_location" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); result = (int)plot_grid_find_ra_label_location(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res7)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg7))); } else { int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_find_dec_label_location(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; double arg2 ; double arg3 ; double arg4 ; double arg5 ; int arg6 ; double *arg7 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; double val4 ; int ecode4 = 0 ; double val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; double temp7 ; int res7 = SWIG_TMPOBJ ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; int result; arg7 = &temp7; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:plot_grid_find_dec_label_location",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_find_dec_label_location" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_grid_find_dec_label_location" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_grid_find_dec_label_location" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); ecode4 = SWIG_AsVal_double(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "plot_grid_find_dec_label_location" "', argument " "4"" of type '" "double""'"); } arg4 = (double)(val4); ecode5 = SWIG_AsVal_double(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plot_grid_find_dec_label_location" "', argument " "5"" of type '" "double""'"); } arg5 = (double)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "plot_grid_find_dec_label_location" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); result = (int)plot_grid_find_dec_label_location(arg1,arg2,arg3,arg4,arg5,arg6,arg7); resultobj = SWIG_From_int((int)(result)); if (SWIG_IsTmpObj(res7)) { resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg7))); } else { int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_double, new_flags)); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_grid_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_grid_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_grid_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_grid_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_indexes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; pl *arg2 = (pl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_indexes_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_indexes_set" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_pl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotindex_args_indexes_set" "', argument " "2"" of type '" "pl *""'"); } arg2 = (pl *)(argp2); if (arg1) (arg1)->indexes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_indexes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; pl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotindex_args_indexes_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_indexes_get" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); result = (pl *) ((arg1)->indexes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_pl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_qidxes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; pl *arg2 = (pl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_qidxes_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_qidxes_set" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_pl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotindex_args_qidxes_set" "', argument " "2"" of type '" "pl *""'"); } arg2 = (pl *)(argp2); if (arg1) (arg1)->qidxes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_qidxes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; pl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotindex_args_qidxes_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_qidxes_get" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); result = (pl *) ((arg1)->qidxes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_pl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_stars_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_stars_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_stars_set" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotindex_args_stars_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->stars = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_stars_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotindex_args_stars_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_stars_get" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); result = (anbool) ((arg1)->stars); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_quads_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_quads_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_quads_set" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotindex_args_quads_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->quads = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_quads_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotindex_args_quads_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_quads_get" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); result = (anbool) ((arg1)->quads); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_fill_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_fill_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_fill_set" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotindex_args_fill_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->fill = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_fill_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:plotindex_args_fill_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_fill_get" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); result = (anbool) ((arg1)->fill); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotindex_args_add_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plotindex_args_add_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotindex_args_add_file" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotindex_args_add_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plotindex_args_add_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_new_plotindex_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotindex_args")) SWIG_fail; result = (struct plotindex_args *)calloc(1, sizeof(struct plotindex_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotindex_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotindex_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotindex_args *arg1 = (struct plotindex_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotindex_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotindex_args" "', argument " "1"" of type '" "struct plotindex_args *""'"); } arg1 = (struct plotindex_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotindex_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotindex_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_quad_xy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; double *arg2 = (double *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_quad_xy",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_quad_xy" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_quad_xy" "', argument " "2"" of type '" "double *""'"); } arg2 = (double *)(argp2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_quad_xy" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); plot_quad_xy(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_index_plotquad(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; cairo_t *arg1 = (cairo_t *) 0 ; plot_args_t *arg2 = (plot_args_t *) 0 ; plotindex_t *arg3 = (plotindex_t *) 0 ; index_t *arg4 = (index_t *) 0 ; int arg5 ; int arg6 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; int val5 ; int ecode5 = 0 ; int val6 ; int ecode6 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; PyObject * obj5 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOOO:plot_index_plotquad",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_plotquad" "', argument " "1"" of type '" "cairo_t *""'"); } arg1 = (cairo_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_plotquad" "', argument " "2"" of type '" "plot_args_t *""'"); } arg2 = (plot_args_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_index_plotquad" "', argument " "3"" of type '" "plotindex_t *""'"); } arg3 = (plotindex_t *)(argp3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_index_t, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_index_plotquad" "', argument " "4"" of type '" "index_t *""'"); } arg4 = (index_t *)(argp4); ecode5 = SWIG_AsVal_int(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "plot_index_plotquad" "', argument " "5"" of type '" "int""'"); } arg5 = (int)(val5); ecode6 = SWIG_AsVal_int(obj5, &val6); if (!SWIG_IsOK(ecode6)) { SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "plot_index_plotquad" "', argument " "6"" of type '" "int""'"); } arg6 = (int)(val6); plot_index_plotquad(arg1,arg2,arg3,arg4,arg5,arg6); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_index_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotindex_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_index_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotindex_t *)plot_index_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotindex_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_index_add_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotindex_t *arg1 = (plotindex_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_index_add_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_add_file" "', argument " "1"" of type '" "plotindex_t *""'"); } arg1 = (plotindex_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_add_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_index_add_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_index_add_qidx_file(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotindex_t *arg1 = (plotindex_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_index_add_qidx_file",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotindex_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_add_qidx_file" "', argument " "1"" of type '" "plotindex_t *""'"); } arg1 = (plotindex_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_add_qidx_file" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_index_add_qidx_file(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_index_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_index_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_index_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_index_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_index_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_index_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_index_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_index_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_index_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_index_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_index_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_index_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_index_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_index_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_index_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_index_free" "', argument " "2"" of type '" "void *""'"); } plot_index_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_index_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_index_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_index_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_index_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_fn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_fn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_fn_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotxy_args_fn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->fn) free((char*)arg1->fn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->fn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->fn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_fn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_fn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_fn_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (char *) ((arg1)->fn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_ext_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_ext_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_ext_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_ext_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->ext = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_ext_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_ext_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_ext_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (int) ((arg1)->ext); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xcol_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_xcol_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xcol_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotxy_args_xcol_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->xcol) free((char*)arg1->xcol); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->xcol = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->xcol = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xcol_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_xcol_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xcol_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (char *) ((arg1)->xcol); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_ycol_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_ycol_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_ycol_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotxy_args_ycol_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->ycol) free((char*)arg1->ycol); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->ycol = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->ycol = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_ycol_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_ycol_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_ycol_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (char *) ((arg1)->ycol); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xoff_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_xoff_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xoff_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_xoff_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->xoff = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xoff_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_xoff_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xoff_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (double) ((arg1)->xoff); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_yoff_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_yoff_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_yoff_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_yoff_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->yoff = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_yoff_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_yoff_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_yoff_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (double) ((arg1)->yoff); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_firstobj_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_firstobj_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_firstobj_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_firstobj_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->firstobj = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_firstobj_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_firstobj_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_firstobj_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (int) ((arg1)->firstobj); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_nobjs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_nobjs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_nobjs_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_nobjs_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->nobjs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_nobjs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_nobjs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_nobjs_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (int) ((arg1)->nobjs); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_scale_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_scale_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_scale_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotxy_args_scale_set" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); if (arg1) (arg1)->scale = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_scale_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; double result; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_scale_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_scale_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (double) ((arg1)->scale); resultobj = SWIG_From_double((double)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xyvals_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; dl *arg2 = (dl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_xyvals_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xyvals_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_dl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotxy_args_xyvals_set" "', argument " "2"" of type '" "dl *""'"); } arg2 = (dl *)(argp2); if (arg1) (arg1)->xyvals = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_xyvals_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; dl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_xyvals_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_xyvals_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (dl *) ((arg1)->xyvals); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_dl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_wcs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; anwcs_t *arg2 = (anwcs_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotxy_args_wcs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_wcs_set" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_anwcs_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotxy_args_wcs_set" "', argument " "2"" of type '" "anwcs_t *""'"); } arg2 = (anwcs_t *)(argp2); if (arg1) (arg1)->wcs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotxy_args_wcs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anwcs_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotxy_args_wcs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotxy_args_wcs_get" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); result = (anwcs_t *) ((arg1)->wcs); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_anwcs_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotxy_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotxy_args")) SWIG_fail; result = (struct plotxy_args *)calloc(1, sizeof(struct plotxy_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotxy_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotxy_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotxy_args *arg1 = (struct plotxy_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotxy_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotxy_args" "', argument " "1"" of type '" "struct plotxy_args *""'"); } arg1 = (struct plotxy_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotxy_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotxy_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_xy_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotxy_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_xy_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotxy_t *)plot_xy_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotxy_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_xy_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_xy_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_setsize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; plotxy_t *arg2 = (plotxy_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_xy_setsize",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_setsize" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_setsize" "', argument " "2"" of type '" "plotxy_t *""'"); } arg2 = (plotxy_t *)(argp2); result = (int)plot_xy_setsize(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_clear_list(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_xy_clear_list",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_clear_list" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); plot_xy_clear_list(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_set_xcol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_xy_set_xcol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_set_xcol" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_set_xcol" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_xy_set_xcol(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_set_ycol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_xy_set_ycol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_set_ycol" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_set_ycol" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_xy_set_ycol(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_set_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_xy_set_filename",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_set_filename" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_set_filename" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_xy_set_filename(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_set_wcs_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; char *arg2 = (char *) 0 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_xy_set_wcs_filename",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_set_wcs_filename" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_set_wcs_filename" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_xy_set_wcs_filename" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); result = (int)plot_xy_set_wcs_filename(arg1,(char const *)arg2,arg3); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_set_offsets(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_xy_set_offsets",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_set_offsets" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_xy_set_offsets" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_xy_set_offsets" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); result = (int)plot_xy_set_offsets(arg1,arg2,arg3); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_xy_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_xy_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_xy_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_xy_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_xy_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_xy_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_xy_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_xy_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_xy_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_xy_free" "', argument " "2"" of type '" "void *""'"); } plot_xy_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_vals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotxy_t *arg1 = (plotxy_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_xy_vals",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotxy_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_vals" "', argument " "1"" of type '" "plotxy_t *""'"); } arg1 = (plotxy_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_xy_vals" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_xy_vals" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plot_xy_vals(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_xy_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_xy_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_xy_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_xy_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_fn_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_fn_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_fn_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotradec_args_fn_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->fn) free((char*)arg1->fn); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->fn = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->fn = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_fn_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_fn_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_fn_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (char *) ((arg1)->fn); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_ext_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_ext_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_ext_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotradec_args_ext_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->ext = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_ext_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_ext_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_ext_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (int) ((arg1)->ext); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_racol_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_racol_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_racol_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotradec_args_racol_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->racol) free((char*)arg1->racol); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->racol = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->racol = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_racol_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_racol_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_racol_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (char *) ((arg1)->racol); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_deccol_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_deccol_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_deccol_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotradec_args_deccol_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->deccol) free((char*)arg1->deccol); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->deccol = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->deccol = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_deccol_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_deccol_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_deccol_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (char *) ((arg1)->deccol); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_firstobj_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_firstobj_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_firstobj_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotradec_args_firstobj_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->firstobj = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_firstobj_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_firstobj_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_firstobj_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (int) ((arg1)->firstobj); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_nobjs_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_nobjs_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_nobjs_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plotradec_args_nobjs_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->nobjs = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_nobjs_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_nobjs_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_nobjs_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (int) ((arg1)->nobjs); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_radecvals_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; dl *arg2 = (dl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotradec_args_radecvals_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_radecvals_set" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_dl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotradec_args_radecvals_set" "', argument " "2"" of type '" "dl *""'"); } arg2 = (dl *)(argp2); if (arg1) (arg1)->radecvals = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotradec_args_radecvals_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; dl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotradec_args_radecvals_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotradec_args_radecvals_get" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); result = (dl *) ((arg1)->radecvals); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_dl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotradec_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotradec_args")) SWIG_fail; result = (struct plotradec_args *)calloc(1, sizeof(struct plotradec_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotradec_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotradec_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotradec_args *arg1 = (struct plotradec_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotradec_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotradec_args" "', argument " "1"" of type '" "struct plotradec_args *""'"); } arg1 = (struct plotradec_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotradec_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotradec_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_radec_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotradec_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_radec_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotradec_t *)plot_radec_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotradec_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_reset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotradec_t *arg1 = (plotradec_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_radec_reset",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_reset" "', argument " "1"" of type '" "plotradec_t *""'"); } arg1 = (plotradec_t *)(argp1); plot_radec_reset(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_radec_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_radec_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_set_racol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotradec_t *arg1 = (plotradec_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_radec_set_racol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_set_racol" "', argument " "1"" of type '" "plotradec_t *""'"); } arg1 = (plotradec_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_set_racol" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_radec_set_racol(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_set_deccol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotradec_t *arg1 = (plotradec_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_radec_set_deccol",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_set_deccol" "', argument " "1"" of type '" "plotradec_t *""'"); } arg1 = (plotradec_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_set_deccol" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_radec_set_deccol(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_set_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotradec_t *arg1 = (plotradec_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_radec_set_filename",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_set_filename" "', argument " "1"" of type '" "plotradec_t *""'"); } arg1 = (plotradec_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_set_filename" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); plot_radec_set_filename(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_radec_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_radec_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_radec_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_radec_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_count_inbounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; plotradec_t *arg2 = (plotradec_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_radec_count_inbounds",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_count_inbounds" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_count_inbounds" "', argument " "2"" of type '" "plotradec_t *""'"); } arg2 = (plotradec_t *)(argp2); result = (int)plot_radec_count_inbounds(arg1,arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_radec_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_radec_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_radec_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_radec_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_radec_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_radec_free" "', argument " "2"" of type '" "void *""'"); } plot_radec_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_vals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotradec_t *arg1 = (plotradec_t *) 0 ; double arg2 ; double arg3 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:plot_radec_vals",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotradec_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_vals" "', argument " "1"" of type '" "plotradec_t *""'"); } arg1 = (plotradec_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_radec_vals" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_radec_vals" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); plot_radec_vals(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_radec_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_radec_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_radec_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_radec_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotmatch_args_matches_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotmatch_args *arg1 = (struct plotmatch_args *) 0 ; bl *arg2 = (bl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plotmatch_args_matches_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotmatch_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotmatch_args_matches_set" "', argument " "1"" of type '" "struct plotmatch_args *""'"); } arg1 = (struct plotmatch_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_bl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plotmatch_args_matches_set" "', argument " "2"" of type '" "bl *""'"); } arg2 = (bl *)(argp2); if (arg1) (arg1)->matches = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plotmatch_args_matches_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotmatch_args *arg1 = (struct plotmatch_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; bl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plotmatch_args_matches_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotmatch_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plotmatch_args_matches_get" "', argument " "1"" of type '" "struct plotmatch_args *""'"); } arg1 = (struct plotmatch_args *)(argp1); result = (bl *) ((arg1)->matches); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_bl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plotmatch_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotmatch_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plotmatch_args")) SWIG_fail; result = (struct plotmatch_args *)calloc(1, sizeof(struct plotmatch_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotmatch_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plotmatch_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plotmatch_args *arg1 = (struct plotmatch_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plotmatch_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotmatch_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plotmatch_args" "', argument " "1"" of type '" "struct plotmatch_args *""'"); } arg1 = (struct plotmatch_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plotmatch_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plotmatch_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_match_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotmatch_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_match_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotmatch_t *)plot_match_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plotmatch_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_match_add_match(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotmatch_t *arg1 = (plotmatch_t *) 0 ; MatchObj *arg2 = (MatchObj *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_match_add_match",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotmatch_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_add_match" "', argument " "1"" of type '" "plotmatch_t *""'"); } arg1 = (plotmatch_t *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_MatchObj, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_match_add_match" "', argument " "2"" of type '" "MatchObj const *""'"); } arg2 = (MatchObj *)(argp2); result = (int)plot_match_add_match(arg1,(MatchObj const *)arg2); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_match_set_filename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotmatch_t *arg1 = (plotmatch_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_match_set_filename",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotmatch_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_set_filename" "', argument " "1"" of type '" "plotmatch_t *""'"); } arg1 = (plotmatch_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_match_set_filename" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_match_set_filename(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_match_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_match_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_match_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_match_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_match_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_match_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_match_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_match_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_match_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_match_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_match_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_match_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_match_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_match_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_match_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_match_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_match_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_match_free" "', argument " "2"" of type '" "void *""'"); } plot_match_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_match_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_match_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_match_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_match_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_NGC_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_NGC_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_NGC_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_NGC_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->NGC = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_NGC_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_NGC_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_NGC_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->NGC); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellations_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellations_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellations_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellations_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellations = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellations_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellations_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellations_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellations); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_lines_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_lines_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_lines_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_lines_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellation_lines = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_lines_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_lines_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_lines_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellation_lines); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_markers_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_markers_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_markers_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_markers_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellation_markers = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_markers_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_markers_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_markers_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellation_markers); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_labels_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_labels_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_labels_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_labels_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellation_labels = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_labels_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_labels_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_labels_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellation_labels); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_labels_long_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_labels_long_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_labels_long_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_labels_long_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellation_labels_long = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_labels_long_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_labels_long_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_labels_long_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellation_labels_long); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_lines_offset_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_lines_offset_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_lines_offset_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_lines_offset_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->constellation_lines_offset = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_lines_offset_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_lines_offset_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_lines_offset_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (float) ((arg1)->constellation_lines_offset); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_pastel_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_constellation_pastel_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_pastel_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_constellation_pastel_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->constellation_pastel = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_constellation_pastel_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_constellation_pastel_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_constellation_pastel_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->constellation_pastel); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_bright_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_bright_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->bright = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_bright_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->bright); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_labels_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_bright_labels_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_labels_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_bright_labels_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->bright_labels = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_labels_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_bright_labels_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_labels_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->bright_labels); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_pastel_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_bright_pastel_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_pastel_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_bright_pastel_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->bright_pastel = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_bright_pastel_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_bright_pastel_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_bright_pastel_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->bright_pastel); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_HD_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_HD_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_HD_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_HD_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->HD = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_HD_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_HD_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_HD_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->HD); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_HD_labels_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; anbool arg2 ; void *argp1 = 0 ; int res1 = 0 ; unsigned char val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_HD_labels_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_HD_labels_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_HD_labels_set" "', argument " "2"" of type '" "anbool""'"); } arg2 = (anbool)(val2); if (arg1) (arg1)->HD_labels = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_HD_labels_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; anbool result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_HD_labels_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_HD_labels_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (anbool) ((arg1)->HD_labels); resultobj = SWIG_From_unsigned_SS_char((unsigned char)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_ngc_fraction_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; float arg2 ; void *argp1 = 0 ; int res1 = 0 ; float val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_ngc_fraction_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_ngc_fraction_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_float(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_ngc_fraction_set" "', argument " "2"" of type '" "float""'"); } arg2 = (float)(val2); if (arg1) (arg1)->ngc_fraction = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_ngc_fraction_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; float result; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_ngc_fraction_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_ngc_fraction_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (float) ((arg1)->ngc_fraction); resultobj = SWIG_From_float((float)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_targets_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; bl *arg2 = (bl *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_targets_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_targets_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_bl, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "annotation_args_targets_set" "', argument " "2"" of type '" "bl *""'"); } arg2 = (bl *)(argp2); if (arg1) (arg1)->targets = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_targets_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; bl *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_targets_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_targets_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (bl *) ((arg1)->targets); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_bl, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_hd_catalog_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_hd_catalog_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_hd_catalog_set" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "annotation_args_hd_catalog_set" "', argument " "2"" of type '" "char *""'"); } arg2 = (char *)(buf2); if (arg1->hd_catalog) free((char*)arg1->hd_catalog); if (arg2) { size_t size = strlen((const char *)(arg2)) + 1; arg1->hd_catalog = (char *)(char *)memcpy((char *)malloc((size)*sizeof(char)), (const char *)(arg2), sizeof(char)*(size)); } else { arg1->hd_catalog = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_hd_catalog_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; char *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:annotation_args_hd_catalog_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_hd_catalog_get" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); result = (char *) ((arg1)->hd_catalog); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_add_target(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; double arg2 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:annotation_args_add_target",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_add_target" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "annotation_args_add_target" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "annotation_args_add_target" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "annotation_args_add_target" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); annotation_args_add_target(arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_annotation_args_add_named_target(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:annotation_args_add_named_target",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "annotation_args_add_named_target" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "annotation_args_add_named_target" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); annotation_args_add_named_target(arg1,(char const *)arg2); resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_new_annotation_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_annotation_args")) SWIG_fail; result = (struct annotation_args *)calloc(1, sizeof(struct annotation_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_annotation_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_annotation_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct annotation_args *arg1 = (struct annotation_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_annotation_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_annotation_args" "', argument " "1"" of type '" "struct annotation_args *""'"); } arg1 = (struct annotation_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *annotation_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_annotation_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_annotations_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_annotations_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_annotations_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plotann_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_annotations_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plotann_t *)plot_annotations_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_annotation_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_annotations_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_annotations_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_annotations_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_annotations_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_annotations_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_annotations_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_annotations_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_annotations_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_annotations_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_annotations_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_annotations_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_annotations_free" "', argument " "2"" of type '" "void *""'"); } plot_annotations_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_set_hd_catalog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotann_t *arg1 = (plotann_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_annotations_set_hd_catalog",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_set_hd_catalog" "', argument " "1"" of type '" "plotann_t *""'"); } arg1 = (plotann_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_annotations_set_hd_catalog" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_annotations_set_hd_catalog(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_add_named_target(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotann_t *arg1 = (plotann_t *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:plot_annotations_add_named_target",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_add_named_target" "', argument " "1"" of type '" "plotann_t *""'"); } arg1 = (plotann_t *)(argp1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_annotations_add_named_target" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); result = (int)plot_annotations_add_named_target(arg1,(char const *)arg2); resultobj = SWIG_From_int((int)(result)); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_add_target(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotann_t *arg1 = (plotann_t *) 0 ; double arg2 ; double arg3 ; char *arg4 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; double val3 ; int ecode3 = 0 ; int res4 ; char *buf4 = 0 ; int alloc4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_annotations_add_target",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_annotation_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_add_target" "', argument " "1"" of type '" "plotann_t *""'"); } arg1 = (plotann_t *)(argp1); ecode2 = SWIG_AsVal_double(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plot_annotations_add_target" "', argument " "2"" of type '" "double""'"); } arg2 = (double)(val2); ecode3 = SWIG_AsVal_double(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "plot_annotations_add_target" "', argument " "3"" of type '" "double""'"); } arg3 = (double)(val3); res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_annotations_add_target" "', argument " "4"" of type '" "char const *""'"); } arg4 = (char *)(buf4); plot_annotations_add_target(arg1,arg2,arg3,(char const *)arg4); resultobj = SWIG_Py_Void(); if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return resultobj; fail: if (alloc4 == SWIG_NEWOBJ) free((char*)buf4); return NULL; } SWIGINTERN PyObject *_wrap_plot_annotations_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_annotations_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_annotations_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_annotations_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plothealpix_args_nside_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *arg1 = (struct plothealpix_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plothealpix_args_nside_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plothealpix_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plothealpix_args_nside_set" "', argument " "1"" of type '" "struct plothealpix_args *""'"); } arg1 = (struct plothealpix_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plothealpix_args_nside_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->nside = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plothealpix_args_nside_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *arg1 = (struct plothealpix_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plothealpix_args_nside_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plothealpix_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plothealpix_args_nside_get" "', argument " "1"" of type '" "struct plothealpix_args *""'"); } arg1 = (struct plothealpix_args *)(argp1); result = (int) ((arg1)->nside); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plothealpix_args_stepsize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *arg1 = (struct plothealpix_args *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plothealpix_args_stepsize_set",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plothealpix_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plothealpix_args_stepsize_set" "', argument " "1"" of type '" "struct plothealpix_args *""'"); } arg1 = (struct plothealpix_args *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "plothealpix_args_stepsize_set" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); if (arg1) (arg1)->stepsize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plothealpix_args_stepsize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *arg1 = (struct plothealpix_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"O:plothealpix_args_stepsize_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plothealpix_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plothealpix_args_stepsize_get" "', argument " "1"" of type '" "struct plothealpix_args *""'"); } arg1 = (struct plothealpix_args *)(argp1); result = (int) ((arg1)->stepsize); resultobj = SWIG_From_int((int)(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_plothealpix_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *result = 0 ; if (!PyArg_ParseTuple(args,(char *)":new_plothealpix_args")) SWIG_fail; result = (struct plothealpix_args *)calloc(1, sizeof(struct plothealpix_args)); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plothealpix_args, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_plothealpix_args(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; struct plothealpix_args *arg1 = (struct plothealpix_args *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:delete_plothealpix_args",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plothealpix_args, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_plothealpix_args" "', argument " "1"" of type '" "struct plothealpix_args *""'"); } arg1 = (struct plothealpix_args *)(argp1); free((char *) arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *plothealpix_args_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_plothealpix_args, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_plot_healpix_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; plothealpix_t *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_healpix_get",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_get" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (plothealpix_t *)plot_healpix_get(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_plothealpix_args, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_healpix_init(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; void *result = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_healpix_init",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_init" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); result = (void *)plot_healpix_init(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_healpix_command(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; char *arg2 = (char *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_healpix_command",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_command" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_healpix_command" "', argument " "2"" of type '" "char const *""'"); } arg2 = (char *)(buf2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_healpix_command" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_healpix_command" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_healpix_command((char const *)arg1,(char const *)arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); if (alloc2 == SWIG_NEWOBJ) free((char*)buf2); return NULL; } SWIGINTERN PyObject *_wrap_plot_healpix_plot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; cairo_t *arg2 = (cairo_t *) 0 ; plot_args_t *arg3 = (plot_args_t *) 0 ; void *arg4 = (void *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; int res4 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OOOO:plot_healpix_plot",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_plot" "', argument " "1"" of type '" "char const *""'"); } arg1 = (char *)(buf1); res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_cairo_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_healpix_plot" "', argument " "2"" of type '" "cairo_t *""'"); } arg2 = (cairo_t *)(argp2); res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "plot_healpix_plot" "', argument " "3"" of type '" "plot_args_t *""'"); } arg3 = (plot_args_t *)(argp3); res4 = SWIG_ConvertPtr(obj3,SWIG_as_voidptrptr(&arg4), 0, 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "plot_healpix_plot" "', argument " "4"" of type '" "void *""'"); } result = (int)plot_healpix_plot((char const *)arg1,arg2,arg3,arg4); resultobj = SWIG_From_int((int)(result)); if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) free((char*)buf1); return NULL; } SWIGINTERN PyObject *_wrap_plot_healpix_free(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plot_args_t *arg1 = (plot_args_t *) 0 ; void *arg2 = (void *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:plot_healpix_free",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plot_args, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_free" "', argument " "1"" of type '" "plot_args_t *""'"); } arg1 = (plot_args_t *)(argp1); res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "plot_healpix_free" "', argument " "2"" of type '" "void *""'"); } plot_healpix_free(arg1,arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_plot_healpix_describe(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; plotter_t *arg1 = (plotter_t *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject * obj0 = 0 ; if (!PyArg_ParseTuple(args,(char *)"O:plot_healpix_describe",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_plotter, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "plot_healpix_describe" "', argument " "1"" of type '" "plotter_t *""'"); } arg1 = (plotter_t *)(argp1); plot_healpix_describe(arg1); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *CAIRO_OPERATOR_CLEAR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_CLEAR",SWIG_From_int((int)(CAIRO_OPERATOR_CLEAR))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_SOURCE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_SOURCE",SWIG_From_int((int)(CAIRO_OPERATOR_SOURCE))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_OVER_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_OVER",SWIG_From_int((int)(CAIRO_OPERATOR_OVER))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_IN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_IN",SWIG_From_int((int)(CAIRO_OPERATOR_IN))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_OUT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_OUT",SWIG_From_int((int)(CAIRO_OPERATOR_OUT))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_ATOP_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_ATOP",SWIG_From_int((int)(CAIRO_OPERATOR_ATOP))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_DEST_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_DEST",SWIG_From_int((int)(CAIRO_OPERATOR_DEST))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_DEST_OVER_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_DEST_OVER",SWIG_From_int((int)(CAIRO_OPERATOR_DEST_OVER))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_DEST_IN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_DEST_IN",SWIG_From_int((int)(CAIRO_OPERATOR_DEST_IN))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_DEST_OUT_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_DEST_OUT",SWIG_From_int((int)(CAIRO_OPERATOR_DEST_OUT))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_DEST_ATOP_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_DEST_ATOP",SWIG_From_int((int)(CAIRO_OPERATOR_DEST_ATOP))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_XOR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_XOR",SWIG_From_int((int)(CAIRO_OPERATOR_XOR))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_ADD_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_ADD",SWIG_From_int((int)(CAIRO_OPERATOR_ADD))); return SWIG_Py_Void(); } SWIGINTERN PyObject *CAIRO_OPERATOR_SATURATE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *module; PyObject *d; if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL; d = PyModule_GetDict(module); if (!d) return NULL; SWIG_Python_SetConstant(d, "CAIRO_OPERATOR_SATURATE",SWIG_From_int((int)(CAIRO_OPERATOR_SATURATE))); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_image_debug(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOO:image_debug",&obj0,&obj1,&obj2)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "image_debug" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "image_debug" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "image_debug" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); image_debug(arg1,arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_image_add(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float arg4 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; float val4 ; int ecode4 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOO:image_add",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "image_add" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "image_add" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "image_add" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); ecode4 = SWIG_AsVal_float(obj3, &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "image_add" "', argument " "4"" of type '" "float""'"); } arg4 = (float)(val4); image_add(arg1,arg2,arg3,arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_image_weighted_smooth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; float *arg1 = (float *) 0 ; int arg2 ; int arg3 ; float *arg4 = (float *) 0 ; float arg5 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; float val5 ; int ecode5 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; PyObject * obj3 = 0 ; PyObject * obj4 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OOOOO:image_weighted_smooth",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "image_weighted_smooth" "', argument " "1"" of type '" "float *""'"); } arg1 = (float *)(argp1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "image_weighted_smooth" "', argument " "2"" of type '" "int""'"); } arg2 = (int)(val2); ecode3 = SWIG_AsVal_int(obj2, &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "image_weighted_smooth" "', argument " "3"" of type '" "int""'"); } arg3 = (int)(val3); res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "image_weighted_smooth" "', argument " "4"" of type '" "float const *""'"); } arg4 = (float *)(argp4); ecode5 = SWIG_AsVal_float(obj4, &val5); if (!SWIG_IsOK(ecode5)) { SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "image_weighted_smooth" "', argument " "5"" of type '" "float""'"); } arg5 = (float)(val5); image_weighted_smooth(arg1,arg2,arg3,(float const *)arg4,arg5); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, { (char *)"PLOTSTUFF_FORMAT_JPG_swigconstant", PLOTSTUFF_FORMAT_JPG_swigconstant, METH_VARARGS, NULL}, { (char *)"PLOTSTUFF_FORMAT_PNG_swigconstant", PLOTSTUFF_FORMAT_PNG_swigconstant, METH_VARARGS, NULL}, { (char *)"PLOTSTUFF_FORMAT_PPM_swigconstant", PLOTSTUFF_FORMAT_PPM_swigconstant, METH_VARARGS, NULL}, { (char *)"PLOTSTUFF_FORMAT_PDF_swigconstant", PLOTSTUFF_FORMAT_PDF_swigconstant, METH_VARARGS, NULL}, { (char *)"PLOTSTUFF_FORMAT_MEMIMG_swigconstant", PLOTSTUFF_FORMAT_MEMIMG_swigconstant, METH_VARARGS, NULL}, { (char *)"PLOTSTUFF_FORMAT_FITS_swigconstant", PLOTSTUFF_FORMAT_FITS_swigconstant, METH_VARARGS, NULL}, { (char *)"plot_args_plotters_set", _wrap_plot_args_plotters_set, METH_VARARGS, NULL}, { (char *)"plot_args_plotters_get", _wrap_plot_args_plotters_get, METH_VARARGS, NULL}, { (char *)"plot_args_NP_set", _wrap_plot_args_NP_set, METH_VARARGS, NULL}, { (char *)"plot_args_NP_get", _wrap_plot_args_NP_get, METH_VARARGS, NULL}, { (char *)"plot_args_outfn_set", _wrap_plot_args_outfn_set, METH_VARARGS, NULL}, { (char *)"plot_args_outfn_get", _wrap_plot_args_outfn_get, METH_VARARGS, NULL}, { (char *)"plot_args_fout_set", _wrap_plot_args_fout_set, METH_VARARGS, NULL}, { (char *)"plot_args_fout_get", _wrap_plot_args_fout_get, METH_VARARGS, NULL}, { (char *)"plot_args_outformat_set", _wrap_plot_args_outformat_set, METH_VARARGS, NULL}, { (char *)"plot_args_outformat_get", _wrap_plot_args_outformat_get, METH_VARARGS, NULL}, { (char *)"plot_args_outimage_set", _wrap_plot_args_outimage_set, METH_VARARGS, NULL}, { (char *)"plot_args_outimage_get", _wrap_plot_args_outimage_get, METH_VARARGS, NULL}, { (char *)"plot_args_cairo_set", _wrap_plot_args_cairo_set, METH_VARARGS, NULL}, { (char *)"plot_args_cairo_get", _wrap_plot_args_cairo_get, METH_VARARGS, NULL}, { (char *)"plot_args_target_set", _wrap_plot_args_target_set, METH_VARARGS, NULL}, { (char *)"plot_args_target_get", _wrap_plot_args_target_get, METH_VARARGS, NULL}, { (char *)"plot_args_op_set", _wrap_plot_args_op_set, METH_VARARGS, NULL}, { (char *)"plot_args_op_get", _wrap_plot_args_op_get, METH_VARARGS, NULL}, { (char *)"plot_args_move_to_set", _wrap_plot_args_move_to_set, METH_VARARGS, NULL}, { (char *)"plot_args_move_to_get", _wrap_plot_args_move_to_get, METH_VARARGS, NULL}, { (char *)"plot_args_move_to_baton_set", _wrap_plot_args_move_to_baton_set, METH_VARARGS, NULL}, { (char *)"plot_args_move_to_baton_get", _wrap_plot_args_move_to_baton_get, METH_VARARGS, NULL}, { (char *)"plot_args_line_to_set", _wrap_plot_args_line_to_set, METH_VARARGS, NULL}, { (char *)"plot_args_line_to_get", _wrap_plot_args_line_to_get, METH_VARARGS, NULL}, { (char *)"plot_args_line_to_baton_set", _wrap_plot_args_line_to_baton_set, METH_VARARGS, NULL}, { (char *)"plot_args_line_to_baton_get", _wrap_plot_args_line_to_baton_get, METH_VARARGS, NULL}, { (char *)"plot_args_wcs_set", _wrap_plot_args_wcs_set, METH_VARARGS, NULL}, { (char *)"plot_args_wcs_get", _wrap_plot_args_wcs_get, METH_VARARGS, NULL}, { (char *)"plot_args_W_set", _wrap_plot_args_W_set, METH_VARARGS, NULL}, { (char *)"plot_args_W_get", _wrap_plot_args_W_get, METH_VARARGS, NULL}, { (char *)"plot_args_H_set", _wrap_plot_args_H_set, METH_VARARGS, NULL}, { (char *)"plot_args_H_get", _wrap_plot_args_H_get, METH_VARARGS, NULL}, { (char *)"plot_args_rgba_set", _wrap_plot_args_rgba_set, METH_VARARGS, NULL}, { (char *)"plot_args_rgba_get", _wrap_plot_args_rgba_get, METH_VARARGS, NULL}, { (char *)"plot_args_lw_set", _wrap_plot_args_lw_set, METH_VARARGS, NULL}, { (char *)"plot_args_lw_get", _wrap_plot_args_lw_get, METH_VARARGS, NULL}, { (char *)"plot_args_marker_set", _wrap_plot_args_marker_set, METH_VARARGS, NULL}, { (char *)"plot_args_marker_get", _wrap_plot_args_marker_get, METH_VARARGS, NULL}, { (char *)"plot_args_markersize_set", _wrap_plot_args_markersize_set, METH_VARARGS, NULL}, { (char *)"plot_args_markersize_get", _wrap_plot_args_markersize_get, METH_VARARGS, NULL}, { (char *)"plot_args_bg_rgba_set", _wrap_plot_args_bg_rgba_set, METH_VARARGS, NULL}, { (char *)"plot_args_bg_rgba_get", _wrap_plot_args_bg_rgba_get, METH_VARARGS, NULL}, { (char *)"plot_args_bg_lw_set", _wrap_plot_args_bg_lw_set, METH_VARARGS, NULL}, { (char *)"plot_args_bg_lw_get", _wrap_plot_args_bg_lw_get, METH_VARARGS, NULL}, { (char *)"plot_args_bg_box_set", _wrap_plot_args_bg_box_set, METH_VARARGS, NULL}, { (char *)"plot_args_bg_box_get", _wrap_plot_args_bg_box_get, METH_VARARGS, NULL}, { (char *)"plot_args_fontsize_set", _wrap_plot_args_fontsize_set, METH_VARARGS, NULL}, { (char *)"plot_args_fontsize_get", _wrap_plot_args_fontsize_get, METH_VARARGS, NULL}, { (char *)"plot_args_halign_set", _wrap_plot_args_halign_set, METH_VARARGS, NULL}, { (char *)"plot_args_halign_get", _wrap_plot_args_halign_get, METH_VARARGS, NULL}, { (char *)"plot_args_valign_set", _wrap_plot_args_valign_set, METH_VARARGS, NULL}, { (char *)"plot_args_valign_get", _wrap_plot_args_valign_get, METH_VARARGS, NULL}, { (char *)"plot_args_label_offset_x_set", _wrap_plot_args_label_offset_x_set, METH_VARARGS, NULL}, { (char *)"plot_args_label_offset_x_get", _wrap_plot_args_label_offset_x_get, METH_VARARGS, NULL}, { (char *)"plot_args_label_offset_y_set", _wrap_plot_args_label_offset_y_set, METH_VARARGS, NULL}, { (char *)"plot_args_label_offset_y_get", _wrap_plot_args_label_offset_y_get, METH_VARARGS, NULL}, { (char *)"plot_args_text_bg_layer_set", _wrap_plot_args_text_bg_layer_set, METH_VARARGS, NULL}, { (char *)"plot_args_text_bg_layer_get", _wrap_plot_args_text_bg_layer_get, METH_VARARGS, NULL}, { (char *)"plot_args_text_fg_layer_set", _wrap_plot_args_text_fg_layer_set, METH_VARARGS, NULL}, { (char *)"plot_args_text_fg_layer_get", _wrap_plot_args_text_fg_layer_get, METH_VARARGS, NULL}, { (char *)"plot_args_marker_fg_layer_set", _wrap_plot_args_marker_fg_layer_set, METH_VARARGS, NULL}, { (char *)"plot_args_marker_fg_layer_get", _wrap_plot_args_marker_fg_layer_get, METH_VARARGS, NULL}, { (char *)"plot_args_cairocmds_set", _wrap_plot_args_cairocmds_set, METH_VARARGS, NULL}, { (char *)"plot_args_cairocmds_get", _wrap_plot_args_cairocmds_get, METH_VARARGS, NULL}, { (char *)"plot_args_linestep_set", _wrap_plot_args_linestep_set, METH_VARARGS, NULL}, { (char *)"plot_args_linestep_get", _wrap_plot_args_linestep_get, METH_VARARGS, NULL}, { (char *)"plot_args_view_image_as_numpy", _wrap_plot_args_view_image_as_numpy, METH_VARARGS, NULL}, { (char *)"plot_args_get_image_as_numpy", _wrap_plot_args_get_image_as_numpy, METH_VARARGS, NULL}, { (char *)"plot_args_set_image_from_numpy", _wrap_plot_args_set_image_from_numpy, METH_VARARGS, NULL}, { (char *)"plot_args_set_wcs_file", _wrap_plot_args_set_wcs_file, METH_VARARGS, NULL}, { (char *)"plot_args_set_size_from_wcs", _wrap_plot_args_set_size_from_wcs, METH_VARARGS, NULL}, { (char *)"plot_args_loginit", _wrap_plot_args_loginit, METH_VARARGS, NULL}, { (char *)"new_plot_args", _wrap_new_plot_args, METH_VARARGS, NULL}, { (char *)"delete_plot_args", _wrap_delete_plot_args, METH_VARARGS, NULL}, { (char *)"plot_args_swigregister", plot_args_swigregister, METH_VARARGS, NULL}, { (char *)"plotter_name_set", _wrap_plotter_name_set, METH_VARARGS, NULL}, { (char *)"plotter_name_get", _wrap_plotter_name_get, METH_VARARGS, NULL}, { (char *)"plotter_init_set", _wrap_plotter_init_set, METH_VARARGS, NULL}, { (char *)"plotter_init_get", _wrap_plotter_init_get, METH_VARARGS, NULL}, { (char *)"plotter_init2_set", _wrap_plotter_init2_set, METH_VARARGS, NULL}, { (char *)"plotter_init2_get", _wrap_plotter_init2_get, METH_VARARGS, NULL}, { (char *)"plotter_command_set", _wrap_plotter_command_set, METH_VARARGS, NULL}, { (char *)"plotter_command_get", _wrap_plotter_command_get, METH_VARARGS, NULL}, { (char *)"plotter_doplot_set", _wrap_plotter_doplot_set, METH_VARARGS, NULL}, { (char *)"plotter_doplot_get", _wrap_plotter_doplot_get, METH_VARARGS, NULL}, { (char *)"plotter_free_set", _wrap_plotter_free_set, METH_VARARGS, NULL}, { (char *)"plotter_free_get", _wrap_plotter_free_get, METH_VARARGS, NULL}, { (char *)"plotter_baton_set", _wrap_plotter_baton_set, METH_VARARGS, NULL}, { (char *)"plotter_baton_get", _wrap_plotter_baton_get, METH_VARARGS, NULL}, { (char *)"new_plotter", _wrap_new_plotter, METH_VARARGS, NULL}, { (char *)"delete_plotter", _wrap_delete_plotter, METH_VARARGS, NULL}, { (char *)"plotter_swigregister", plotter_swigregister, METH_VARARGS, NULL}, { (char *)"parse_image_format", _wrap_parse_image_format, METH_VARARGS, NULL}, { (char *)"guess_image_format_from_filename", _wrap_guess_image_format_from_filename, METH_VARARGS, NULL}, { (char *)"image_format_name_from_code", _wrap_image_format_name_from_code, METH_VARARGS, NULL}, { (char *)"parse_color", _wrap_parse_color, METH_VARARGS, NULL}, { (char *)"parse_color_rgba", _wrap_parse_color_rgba, METH_VARARGS, NULL}, { (char *)"cairo_set_color", _wrap_cairo_set_color, METH_VARARGS, NULL}, { (char *)"cairo_set_rgba", _wrap_cairo_set_rgba, METH_VARARGS, NULL}, { (char *)"plotstuff_new", _wrap_plotstuff_new, METH_VARARGS, NULL}, { (char *)"plotstuff_init", _wrap_plotstuff_init, METH_VARARGS, NULL}, { (char *)"plotstuff_read_and_run_command", _wrap_plotstuff_read_and_run_command, METH_VARARGS, NULL}, { (char *)"plotstuff_run_command", _wrap_plotstuff_run_command, METH_VARARGS, NULL}, { (char *)"plotstuff_set_text_bg_alpha", _wrap_plotstuff_set_text_bg_alpha, METH_VARARGS, NULL}, { (char *)"plotstuff_plot_layer", _wrap_plotstuff_plot_layer, METH_VARARGS, NULL}, { (char *)"plotstuff_get_config", _wrap_plotstuff_get_config, METH_VARARGS, NULL}, { (char *)"plotstuff_set_color", _wrap_plotstuff_set_color, METH_VARARGS, NULL}, { (char *)"plotstuff_set_bgcolor", _wrap_plotstuff_set_bgcolor, METH_VARARGS, NULL}, { (char *)"plotstuff_get_alpha", _wrap_plotstuff_get_alpha, METH_VARARGS, NULL}, { (char *)"plotstuff_set_alpha", _wrap_plotstuff_set_alpha, METH_VARARGS, NULL}, { (char *)"plotstuff_set_rgba", _wrap_plotstuff_set_rgba, METH_VARARGS, NULL}, { (char *)"plotstuff_set_rgba2", _wrap_plotstuff_set_rgba2, METH_VARARGS, NULL}, { (char *)"plotstuff_set_bgrgba2", _wrap_plotstuff_set_bgrgba2, METH_VARARGS, NULL}, { (char *)"plotstuff_set_marker", _wrap_plotstuff_set_marker, METH_VARARGS, NULL}, { (char *)"plotstuff_set_markersize", _wrap_plotstuff_set_markersize, METH_VARARGS, NULL}, { (char *)"plotstuff_set_size", _wrap_plotstuff_set_size, METH_VARARGS, NULL}, { (char *)"plotstuff_set_size_wcs", _wrap_plotstuff_set_size_wcs, METH_VARARGS, NULL}, { (char *)"plotstuff_scale_wcs", _wrap_plotstuff_scale_wcs, METH_VARARGS, NULL}, { (char *)"plotstuff_rotate_wcs", _wrap_plotstuff_rotate_wcs, METH_VARARGS, NULL}, { (char *)"plotstuff_set_wcs_box", _wrap_plotstuff_set_wcs_box, METH_VARARGS, NULL}, { (char *)"plotstuff_set_wcs_file", _wrap_plotstuff_set_wcs_file, METH_VARARGS, NULL}, { (char *)"plotstuff_set_wcs", _wrap_plotstuff_set_wcs, METH_VARARGS, NULL}, { (char *)"plotstuff_set_wcs_tan", _wrap_plotstuff_set_wcs_tan, METH_VARARGS, NULL}, { (char *)"plotstuff_set_wcs_sip", _wrap_plotstuff_set_wcs_sip, METH_VARARGS, NULL}, { (char *)"plotstuff_builtin_apply", _wrap_plotstuff_builtin_apply, METH_VARARGS, NULL}, { (char *)"plotstuff_marker_in_bounds", _wrap_plotstuff_marker_in_bounds, METH_VARARGS, NULL}, { (char *)"plotstuff_run_commandf", _wrap_plotstuff_run_commandf, METH_VARARGS, NULL}, { (char *)"plotstuff_output", _wrap_plotstuff_output, METH_VARARGS, NULL}, { (char *)"plotstuff_free", _wrap_plotstuff_free, METH_VARARGS, NULL}, { (char *)"plotstuff_clear", _wrap_plotstuff_clear, METH_VARARGS, NULL}, { (char *)"plotstuff_stack_marker", _wrap_plotstuff_stack_marker, METH_VARARGS, NULL}, { (char *)"plotstuff_stack_arrow", _wrap_plotstuff_stack_arrow, METH_VARARGS, NULL}, { (char *)"plotstuff_stack_text", _wrap_plotstuff_stack_text, METH_VARARGS, NULL}, { (char *)"plotstuff_plot_stack", _wrap_plotstuff_plot_stack, METH_VARARGS, NULL}, { (char *)"plotstuff_get_maximum_rgba", _wrap_plotstuff_get_maximum_rgba, METH_VARARGS, NULL}, { (char *)"plotstuff_pixel_scale", _wrap_plotstuff_pixel_scale, METH_VARARGS, NULL}, { (char *)"plotstuff_radec2xy", _wrap_plotstuff_radec2xy, METH_VARARGS, NULL}, { (char *)"plotstuff_xy2radec", _wrap_plotstuff_xy2radec, METH_VARARGS, NULL}, { (char *)"plotstuff_get_radec_center_and_radius", _wrap_plotstuff_get_radec_center_and_radius, METH_VARARGS, NULL}, { (char *)"plotstuff_get_radec_bounds", _wrap_plotstuff_get_radec_bounds, METH_VARARGS, NULL}, { (char *)"plotstuff_radec_is_inside_image", _wrap_plotstuff_radec_is_inside_image, METH_VARARGS, NULL}, { (char *)"plotstuff_line_constant_ra", _wrap_plotstuff_line_constant_ra, METH_VARARGS, NULL}, { (char *)"plotstuff_line_constant_dec", _wrap_plotstuff_line_constant_dec, METH_VARARGS, NULL}, { (char *)"plotstuff_line_constant_dec2", _wrap_plotstuff_line_constant_dec2, METH_VARARGS, NULL}, { (char *)"plotstuff_text_xy", _wrap_plotstuff_text_xy, METH_VARARGS, NULL}, { (char *)"plotstuff_text_radec", _wrap_plotstuff_text_radec, METH_VARARGS, NULL}, { (char *)"plotstuff_move_to_radec", _wrap_plotstuff_move_to_radec, METH_VARARGS, NULL}, { (char *)"plotstuff_line_to_radec", _wrap_plotstuff_line_to_radec, METH_VARARGS, NULL}, { (char *)"plotstuff_close_path", _wrap_plotstuff_close_path, METH_VARARGS, NULL}, { (char *)"plotstuff_stroke", _wrap_plotstuff_stroke, METH_VARARGS, NULL}, { (char *)"plotstuff_fill", _wrap_plotstuff_fill, METH_VARARGS, NULL}, { (char *)"plotstuff_stroke_preserve", _wrap_plotstuff_stroke_preserve, METH_VARARGS, NULL}, { (char *)"plotstuff_fill_preserve", _wrap_plotstuff_fill_preserve, METH_VARARGS, NULL}, { (char *)"plotstuff_move_to", _wrap_plotstuff_move_to, METH_VARARGS, NULL}, { (char *)"plotstuff_line_to", _wrap_plotstuff_line_to, METH_VARARGS, NULL}, { (char *)"plotstuff_marker", _wrap_plotstuff_marker, METH_VARARGS, NULL}, { (char *)"plotstuff_marker_radec", _wrap_plotstuff_marker_radec, METH_VARARGS, NULL}, { (char *)"plotstuff_append_doubles", _wrap_plotstuff_append_doubles, METH_VARARGS, NULL}, { (char *)"plotstuff_set_dashed", _wrap_plotstuff_set_dashed, METH_VARARGS, NULL}, { (char *)"plotstuff_set_solid", _wrap_plotstuff_set_solid, METH_VARARGS, NULL}, { (char *)"PTYPE_FLOAT_swigconstant", PTYPE_FLOAT_swigconstant, METH_VARARGS, NULL}, { (char *)"PTYPE_INT_swigconstant", PTYPE_INT_swigconstant, METH_VARARGS, NULL}, { (char *)"PTYPE_DOUBLE_swigconstant", PTYPE_DOUBLE_swigconstant, METH_VARARGS, NULL}, { (char *)"PTYPE_UINT8_swigconstant", PTYPE_UINT8_swigconstant, METH_VARARGS, NULL}, { (char *)"PTYPE_INT16_swigconstant", PTYPE_INT16_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_8_UNSIGNED_swigconstant", BPP_8_UNSIGNED_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_16_SIGNED_swigconstant", BPP_16_SIGNED_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_32_SIGNED_swigconstant", BPP_32_SIGNED_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_IEEE_FLOAT_swigconstant", BPP_IEEE_FLOAT_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_IEEE_DOUBLE_swigconstant", BPP_IEEE_DOUBLE_swigconstant, METH_VARARGS, NULL}, { (char *)"BPP_DEFAULT_swigconstant", BPP_DEFAULT_swigconstant, METH_VARARGS, NULL}, { (char *)"qfitsdumper_filename_set", _wrap_qfitsdumper_filename_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_filename_get", _wrap_qfitsdumper_filename_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_npix_set", _wrap_qfitsdumper_npix_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_npix_get", _wrap_qfitsdumper_npix_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_ptype_set", _wrap_qfitsdumper_ptype_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_ptype_get", _wrap_qfitsdumper_ptype_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_ibuf_set", _wrap_qfitsdumper_ibuf_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_ibuf_get", _wrap_qfitsdumper_ibuf_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_fbuf_set", _wrap_qfitsdumper_fbuf_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_fbuf_get", _wrap_qfitsdumper_fbuf_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_dbuf_set", _wrap_qfitsdumper_dbuf_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_dbuf_get", _wrap_qfitsdumper_dbuf_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_vbuf_set", _wrap_qfitsdumper_vbuf_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_vbuf_get", _wrap_qfitsdumper_vbuf_get, METH_VARARGS, NULL}, { (char *)"qfitsdumper_out_ptype_set", _wrap_qfitsdumper_out_ptype_set, METH_VARARGS, NULL}, { (char *)"qfitsdumper_out_ptype_get", _wrap_qfitsdumper_out_ptype_get, METH_VARARGS, NULL}, { (char *)"new_qfitsdumper", _wrap_new_qfitsdumper, METH_VARARGS, NULL}, { (char *)"delete_qfitsdumper", _wrap_delete_qfitsdumper, METH_VARARGS, NULL}, { (char *)"qfitsdumper_swigregister", qfitsdumper_swigregister, METH_VARARGS, NULL}, { (char *)"qfits_pixdump", _wrap_qfits_pixdump, METH_VARARGS, NULL}, { (char *)"convolve_get_gaussian_kernel_f", _wrap_convolve_get_gaussian_kernel_f, METH_VARARGS, NULL}, { (char *)"convolve_separable_f", _wrap_convolve_separable_f, METH_VARARGS, NULL}, { (char *)"convolve_separable_weighted_f", _wrap_convolve_separable_weighted_f, METH_VARARGS, NULL}, { (char *)"c_image_numpy_view", _wrap_c_image_numpy_view, METH_VARARGS, NULL}, { (char *)"free", _wrap_free, METH_VARARGS, NULL}, { (char *)"point_in_polygon", _wrap_point_in_polygon, METH_VARARGS, NULL}, { (char *)"tan_vectors", _wrap_tan_vectors, METH_VARARGS, NULL}, { (char *)"invert_2by2", _wrap_invert_2by2, METH_VARARGS, NULL}, { (char *)"invert_2by2_arr", _wrap_invert_2by2_arr, METH_VARARGS, NULL}, { (char *)"is_power_of_two", _wrap_is_power_of_two, METH_VARARGS, NULL}, { (char *)"matrix_matrix_3", _wrap_matrix_matrix_3, METH_VARARGS, NULL}, { (char *)"matrix_vector_3", _wrap_matrix_vector_3, METH_VARARGS, NULL}, { (char *)"dot_product_3", _wrap_dot_product_3, METH_VARARGS, NULL}, { (char *)"vector_length_3", _wrap_vector_length_3, METH_VARARGS, NULL}, { (char *)"vector_length_squared_3", _wrap_vector_length_squared_3, METH_VARARGS, NULL}, { (char *)"inverse_3by3", _wrap_inverse_3by3, METH_VARARGS, NULL}, { (char *)"image_to_xyz", _wrap_image_to_xyz, METH_VARARGS, NULL}, { (char *)"fit_transform", _wrap_fit_transform, METH_VARARGS, NULL}, { (char *)"uniform_sample", _wrap_uniform_sample, METH_VARARGS, NULL}, { (char *)"gaussian_sample", _wrap_gaussian_sample, METH_VARARGS, NULL}, { (char *)"EDGE_TRUNCATE_swigconstant", EDGE_TRUNCATE_swigconstant, METH_VARARGS, NULL}, { (char *)"EDGE_AVERAGE_swigconstant", EDGE_AVERAGE_swigconstant, METH_VARARGS, NULL}, { (char *)"get_output_image_size", _wrap_get_output_image_size, METH_VARARGS, NULL}, { (char *)"average_image_f", _wrap_average_image_f, METH_VARARGS, NULL}, { (char *)"average_weighted_image_f", _wrap_average_weighted_image_f, METH_VARARGS, NULL}, { (char *)"imax", _wrap_imax, METH_VARARGS, NULL}, { (char *)"imin", _wrap_imin, METH_VARARGS, NULL}, { (char *)"distsq_exceeds", _wrap_distsq_exceeds, METH_VARARGS, NULL}, { (char *)"square", _wrap_square, METH_VARARGS, NULL}, { (char *)"inrange", _wrap_inrange, METH_VARARGS, NULL}, { (char *)"distsq", _wrap_distsq, METH_VARARGS, NULL}, { (char *)"cross_product", _wrap_cross_product, METH_VARARGS, NULL}, { (char *)"normalize", _wrap_normalize, METH_VARARGS, NULL}, { (char *)"normalize_3", _wrap_normalize_3, METH_VARARGS, NULL}, { (char *)"plotimage_args_fn_set", _wrap_plotimage_args_fn_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_fn_get", _wrap_plotimage_args_fn_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_format_set", _wrap_plotimage_args_format_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_format_get", _wrap_plotimage_args_format_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_resample_set", _wrap_plotimage_args_resample_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_resample_get", _wrap_plotimage_args_resample_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_downsample_set", _wrap_plotimage_args_downsample_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_downsample_get", _wrap_plotimage_args_downsample_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_arcsinh_set", _wrap_plotimage_args_arcsinh_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_arcsinh_get", _wrap_plotimage_args_arcsinh_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_rgbscale_set", _wrap_plotimage_args_rgbscale_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_rgbscale_get", _wrap_plotimage_args_rgbscale_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_alpha_set", _wrap_plotimage_args_alpha_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_alpha_get", _wrap_plotimage_args_alpha_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_wcs_set", _wrap_plotimage_args_wcs_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_wcs_get", _wrap_plotimage_args_wcs_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_gridsize_set", _wrap_plotimage_args_gridsize_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_gridsize_get", _wrap_plotimage_args_gridsize_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_low_set", _wrap_plotimage_args_image_low_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_low_get", _wrap_plotimage_args_image_low_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_high_set", _wrap_plotimage_args_image_high_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_high_get", _wrap_plotimage_args_image_high_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_null_set", _wrap_plotimage_args_image_null_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_null_get", _wrap_plotimage_args_image_null_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_valid_low_set", _wrap_plotimage_args_image_valid_low_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_valid_low_get", _wrap_plotimage_args_image_valid_low_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_valid_high_set", _wrap_plotimage_args_image_valid_high_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_image_valid_high_get", _wrap_plotimage_args_image_valid_high_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_low_set", _wrap_plotimage_args_n_invalid_low_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_low_get", _wrap_plotimage_args_n_invalid_low_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_high_set", _wrap_plotimage_args_n_invalid_high_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_high_get", _wrap_plotimage_args_n_invalid_high_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_null_set", _wrap_plotimage_args_n_invalid_null_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_n_invalid_null_get", _wrap_plotimage_args_n_invalid_null_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_fitsext_set", _wrap_plotimage_args_fitsext_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_fitsext_get", _wrap_plotimage_args_fitsext_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_fitsplane_set", _wrap_plotimage_args_fitsplane_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_fitsplane_get", _wrap_plotimage_args_fitsplane_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_auto_scale_set", _wrap_plotimage_args_auto_scale_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_auto_scale_get", _wrap_plotimage_args_auto_scale_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_img_set", _wrap_plotimage_args_img_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_img_get", _wrap_plotimage_args_img_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_W_set", _wrap_plotimage_args_W_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_W_get", _wrap_plotimage_args_W_get, METH_VARARGS, NULL}, { (char *)"plotimage_args_H_set", _wrap_plotimage_args_H_set, METH_VARARGS, NULL}, { (char *)"plotimage_args_H_get", _wrap_plotimage_args_H_get, METH_VARARGS, NULL}, { (char *)"plotimage_args__set_image_from_numpy", _wrap_plotimage_args__set_image_from_numpy, METH_VARARGS, NULL}, { (char *)"plotimage_args_set_wcs_file", _wrap_plotimage_args_set_wcs_file, METH_VARARGS, NULL}, { (char *)"plotimage_args_set_file", _wrap_plotimage_args_set_file, METH_VARARGS, NULL}, { (char *)"plotimage_args_set_rgbscale", _wrap_plotimage_args_set_rgbscale, METH_VARARGS, NULL}, { (char *)"plotimage_args_get_image_width", _wrap_plotimage_args_get_image_width, METH_VARARGS, NULL}, { (char *)"plotimage_args_get_image_height", _wrap_plotimage_args_get_image_height, METH_VARARGS, NULL}, { (char *)"new_plotimage_args", _wrap_new_plotimage_args, METH_VARARGS, NULL}, { (char *)"delete_plotimage_args", _wrap_delete_plotimage_args, METH_VARARGS, NULL}, { (char *)"plotimage_args_swigregister", plotimage_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_image_get", _wrap_plot_image_get, METH_VARARGS, NULL}, { (char *)"plot_image_set_wcs", _wrap_plot_image_set_wcs, METH_VARARGS, NULL}, { (char *)"plot_image_init", _wrap_plot_image_init, METH_VARARGS, NULL}, { (char *)"plot_image_command", _wrap_plot_image_command, METH_VARARGS, NULL}, { (char *)"plot_image_plot", _wrap_plot_image_plot, METH_VARARGS, NULL}, { (char *)"plot_image_free", _wrap_plot_image_free, METH_VARARGS, NULL}, { (char *)"plot_image_getsize", _wrap_plot_image_getsize, METH_VARARGS, NULL}, { (char *)"plot_image_set_filename", _wrap_plot_image_set_filename, METH_VARARGS, NULL}, { (char *)"plot_image_setsize", _wrap_plot_image_setsize, METH_VARARGS, NULL}, { (char *)"plot_image_get_percentile", _wrap_plot_image_get_percentile, METH_VARARGS, NULL}, { (char *)"plot_image_add_to_pixels", _wrap_plot_image_add_to_pixels, METH_VARARGS, NULL}, { (char *)"plot_image_scale_float", _wrap_plot_image_scale_float, METH_VARARGS, NULL}, { (char *)"plot_image_rgba_data", _wrap_plot_image_rgba_data, METH_VARARGS, NULL}, { (char *)"plot_image_read", _wrap_plot_image_read, METH_VARARGS, NULL}, { (char *)"plot_image_make_color_transparent", _wrap_plot_image_make_color_transparent, METH_VARARGS, NULL}, { (char *)"plot_image_describe", _wrap_plot_image_describe, METH_VARARGS, NULL}, { (char *)"plotoutline_args_wcs_set", _wrap_plotoutline_args_wcs_set, METH_VARARGS, NULL}, { (char *)"plotoutline_args_wcs_get", _wrap_plotoutline_args_wcs_get, METH_VARARGS, NULL}, { (char *)"plotoutline_args_stepsize_set", _wrap_plotoutline_args_stepsize_set, METH_VARARGS, NULL}, { (char *)"plotoutline_args_stepsize_get", _wrap_plotoutline_args_stepsize_get, METH_VARARGS, NULL}, { (char *)"plotoutline_args_fill_set", _wrap_plotoutline_args_fill_set, METH_VARARGS, NULL}, { (char *)"plotoutline_args_fill_get", _wrap_plotoutline_args_fill_get, METH_VARARGS, NULL}, { (char *)"plotoutline_args_set_wcs_file", _wrap_plotoutline_args_set_wcs_file, METH_VARARGS, NULL}, { (char *)"plotoutline_args_set_wcs_size", _wrap_plotoutline_args_set_wcs_size, METH_VARARGS, NULL}, { (char *)"new_plotoutline_args", _wrap_new_plotoutline_args, METH_VARARGS, NULL}, { (char *)"delete_plotoutline_args", _wrap_delete_plotoutline_args, METH_VARARGS, NULL}, { (char *)"plotoutline_args_swigregister", plotoutline_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_outline_get", _wrap_plot_outline_get, METH_VARARGS, NULL}, { (char *)"plot_outline_init", _wrap_plot_outline_init, METH_VARARGS, NULL}, { (char *)"plot_outline_command", _wrap_plot_outline_command, METH_VARARGS, NULL}, { (char *)"plot_outline_plot", _wrap_plot_outline_plot, METH_VARARGS, NULL}, { (char *)"plot_outline_free", _wrap_plot_outline_free, METH_VARARGS, NULL}, { (char *)"plot_outline_set_wcs_file", _wrap_plot_outline_set_wcs_file, METH_VARARGS, NULL}, { (char *)"plot_outline_set_wcs_size", _wrap_plot_outline_set_wcs_size, METH_VARARGS, NULL}, { (char *)"plot_outline_set_wcs", _wrap_plot_outline_set_wcs, METH_VARARGS, NULL}, { (char *)"plot_outline_set_fill", _wrap_plot_outline_set_fill, METH_VARARGS, NULL}, { (char *)"plot_outline_describe", _wrap_plot_outline_describe, METH_VARARGS, NULL}, { (char *)"plotgrid_args_dolabel_set", _wrap_plotgrid_args_dolabel_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_dolabel_get", _wrap_plotgrid_args_dolabel_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_rastep_set", _wrap_plotgrid_args_rastep_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_rastep_get", _wrap_plotgrid_args_rastep_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_decstep_set", _wrap_plotgrid_args_decstep_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_decstep_get", _wrap_plotgrid_args_decstep_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralabelstep_set", _wrap_plotgrid_args_ralabelstep_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralabelstep_get", _wrap_plotgrid_args_ralabelstep_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declabelstep_set", _wrap_plotgrid_args_declabelstep_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declabelstep_get", _wrap_plotgrid_args_declabelstep_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralabeldir_set", _wrap_plotgrid_args_ralabeldir_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralabeldir_get", _wrap_plotgrid_args_ralabeldir_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declabeldir_set", _wrap_plotgrid_args_declabeldir_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declabeldir_get", _wrap_plotgrid_args_declabeldir_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralo_set", _wrap_plotgrid_args_ralo_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_ralo_get", _wrap_plotgrid_args_ralo_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_rahi_set", _wrap_plotgrid_args_rahi_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_rahi_get", _wrap_plotgrid_args_rahi_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declo_set", _wrap_plotgrid_args_declo_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_declo_get", _wrap_plotgrid_args_declo_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_dechi_set", _wrap_plotgrid_args_dechi_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_dechi_get", _wrap_plotgrid_args_dechi_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_raformat_set", _wrap_plotgrid_args_raformat_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_raformat_get", _wrap_plotgrid_args_raformat_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_decformat_set", _wrap_plotgrid_args_decformat_set, METH_VARARGS, NULL}, { (char *)"plotgrid_args_decformat_get", _wrap_plotgrid_args_decformat_get, METH_VARARGS, NULL}, { (char *)"plotgrid_args_set_formats", _wrap_plotgrid_args_set_formats, METH_VARARGS, NULL}, { (char *)"new_plotgrid_args", _wrap_new_plotgrid_args, METH_VARARGS, NULL}, { (char *)"delete_plotgrid_args", _wrap_delete_plotgrid_args, METH_VARARGS, NULL}, { (char *)"plotgrid_args_swigregister", plotgrid_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_grid_get", _wrap_plot_grid_get, METH_VARARGS, NULL}, { (char *)"plot_grid_init", _wrap_plot_grid_init, METH_VARARGS, NULL}, { (char *)"plot_grid_set_formats", _wrap_plot_grid_set_formats, METH_VARARGS, NULL}, { (char *)"plot_grid_command", _wrap_plot_grid_command, METH_VARARGS, NULL}, { (char *)"plot_grid_plot", _wrap_plot_grid_plot, METH_VARARGS, NULL}, { (char *)"plot_grid_free", _wrap_plot_grid_free, METH_VARARGS, NULL}, { (char *)"DIRECTION_DEFAULT_swigconstant", DIRECTION_DEFAULT_swigconstant, METH_VARARGS, NULL}, { (char *)"DIRECTION_POS_swigconstant", DIRECTION_POS_swigconstant, METH_VARARGS, NULL}, { (char *)"DIRECTION_NEG_swigconstant", DIRECTION_NEG_swigconstant, METH_VARARGS, NULL}, { (char *)"DIRECTION_POSNEG_swigconstant", DIRECTION_POSNEG_swigconstant, METH_VARARGS, NULL}, { (char *)"DIRECTION_NEGPOS_swigconstant", DIRECTION_NEGPOS_swigconstant, METH_VARARGS, NULL}, { (char *)"plot_grid_add_label", _wrap_plot_grid_add_label, METH_VARARGS, NULL}, { (char *)"plot_grid_find_ra_label_location", _wrap_plot_grid_find_ra_label_location, METH_VARARGS, NULL}, { (char *)"plot_grid_find_dec_label_location", _wrap_plot_grid_find_dec_label_location, METH_VARARGS, NULL}, { (char *)"plot_grid_describe", _wrap_plot_grid_describe, METH_VARARGS, NULL}, { (char *)"plotindex_args_indexes_set", _wrap_plotindex_args_indexes_set, METH_VARARGS, NULL}, { (char *)"plotindex_args_indexes_get", _wrap_plotindex_args_indexes_get, METH_VARARGS, NULL}, { (char *)"plotindex_args_qidxes_set", _wrap_plotindex_args_qidxes_set, METH_VARARGS, NULL}, { (char *)"plotindex_args_qidxes_get", _wrap_plotindex_args_qidxes_get, METH_VARARGS, NULL}, { (char *)"plotindex_args_stars_set", _wrap_plotindex_args_stars_set, METH_VARARGS, NULL}, { (char *)"plotindex_args_stars_get", _wrap_plotindex_args_stars_get, METH_VARARGS, NULL}, { (char *)"plotindex_args_quads_set", _wrap_plotindex_args_quads_set, METH_VARARGS, NULL}, { (char *)"plotindex_args_quads_get", _wrap_plotindex_args_quads_get, METH_VARARGS, NULL}, { (char *)"plotindex_args_fill_set", _wrap_plotindex_args_fill_set, METH_VARARGS, NULL}, { (char *)"plotindex_args_fill_get", _wrap_plotindex_args_fill_get, METH_VARARGS, NULL}, { (char *)"plotindex_args_add_file", _wrap_plotindex_args_add_file, METH_VARARGS, NULL}, { (char *)"new_plotindex_args", _wrap_new_plotindex_args, METH_VARARGS, NULL}, { (char *)"delete_plotindex_args", _wrap_delete_plotindex_args, METH_VARARGS, NULL}, { (char *)"plotindex_args_swigregister", plotindex_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_quad_xy", _wrap_plot_quad_xy, METH_VARARGS, NULL}, { (char *)"plot_index_plotquad", _wrap_plot_index_plotquad, METH_VARARGS, NULL}, { (char *)"plot_index_get", _wrap_plot_index_get, METH_VARARGS, NULL}, { (char *)"plot_index_add_file", _wrap_plot_index_add_file, METH_VARARGS, NULL}, { (char *)"plot_index_add_qidx_file", _wrap_plot_index_add_qidx_file, METH_VARARGS, NULL}, { (char *)"plot_index_init", _wrap_plot_index_init, METH_VARARGS, NULL}, { (char *)"plot_index_command", _wrap_plot_index_command, METH_VARARGS, NULL}, { (char *)"plot_index_plot", _wrap_plot_index_plot, METH_VARARGS, NULL}, { (char *)"plot_index_free", _wrap_plot_index_free, METH_VARARGS, NULL}, { (char *)"plot_index_describe", _wrap_plot_index_describe, METH_VARARGS, NULL}, { (char *)"plotxy_args_fn_set", _wrap_plotxy_args_fn_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_fn_get", _wrap_plotxy_args_fn_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_ext_set", _wrap_plotxy_args_ext_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_ext_get", _wrap_plotxy_args_ext_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_xcol_set", _wrap_plotxy_args_xcol_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_xcol_get", _wrap_plotxy_args_xcol_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_ycol_set", _wrap_plotxy_args_ycol_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_ycol_get", _wrap_plotxy_args_ycol_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_xoff_set", _wrap_plotxy_args_xoff_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_xoff_get", _wrap_plotxy_args_xoff_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_yoff_set", _wrap_plotxy_args_yoff_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_yoff_get", _wrap_plotxy_args_yoff_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_firstobj_set", _wrap_plotxy_args_firstobj_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_firstobj_get", _wrap_plotxy_args_firstobj_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_nobjs_set", _wrap_plotxy_args_nobjs_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_nobjs_get", _wrap_plotxy_args_nobjs_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_scale_set", _wrap_plotxy_args_scale_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_scale_get", _wrap_plotxy_args_scale_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_xyvals_set", _wrap_plotxy_args_xyvals_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_xyvals_get", _wrap_plotxy_args_xyvals_get, METH_VARARGS, NULL}, { (char *)"plotxy_args_wcs_set", _wrap_plotxy_args_wcs_set, METH_VARARGS, NULL}, { (char *)"plotxy_args_wcs_get", _wrap_plotxy_args_wcs_get, METH_VARARGS, NULL}, { (char *)"new_plotxy_args", _wrap_new_plotxy_args, METH_VARARGS, NULL}, { (char *)"delete_plotxy_args", _wrap_delete_plotxy_args, METH_VARARGS, NULL}, { (char *)"plotxy_args_swigregister", plotxy_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_xy_get", _wrap_plot_xy_get, METH_VARARGS, NULL}, { (char *)"plot_xy_init", _wrap_plot_xy_init, METH_VARARGS, NULL}, { (char *)"plot_xy_setsize", _wrap_plot_xy_setsize, METH_VARARGS, NULL}, { (char *)"plot_xy_clear_list", _wrap_plot_xy_clear_list, METH_VARARGS, NULL}, { (char *)"plot_xy_set_xcol", _wrap_plot_xy_set_xcol, METH_VARARGS, NULL}, { (char *)"plot_xy_set_ycol", _wrap_plot_xy_set_ycol, METH_VARARGS, NULL}, { (char *)"plot_xy_set_filename", _wrap_plot_xy_set_filename, METH_VARARGS, NULL}, { (char *)"plot_xy_set_wcs_filename", _wrap_plot_xy_set_wcs_filename, METH_VARARGS, NULL}, { (char *)"plot_xy_set_offsets", _wrap_plot_xy_set_offsets, METH_VARARGS, NULL}, { (char *)"plot_xy_command", _wrap_plot_xy_command, METH_VARARGS, NULL}, { (char *)"plot_xy_plot", _wrap_plot_xy_plot, METH_VARARGS, NULL}, { (char *)"plot_xy_free", _wrap_plot_xy_free, METH_VARARGS, NULL}, { (char *)"plot_xy_vals", _wrap_plot_xy_vals, METH_VARARGS, NULL}, { (char *)"plot_xy_describe", _wrap_plot_xy_describe, METH_VARARGS, NULL}, { (char *)"plotradec_args_fn_set", _wrap_plotradec_args_fn_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_fn_get", _wrap_plotradec_args_fn_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_ext_set", _wrap_plotradec_args_ext_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_ext_get", _wrap_plotradec_args_ext_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_racol_set", _wrap_plotradec_args_racol_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_racol_get", _wrap_plotradec_args_racol_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_deccol_set", _wrap_plotradec_args_deccol_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_deccol_get", _wrap_plotradec_args_deccol_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_firstobj_set", _wrap_plotradec_args_firstobj_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_firstobj_get", _wrap_plotradec_args_firstobj_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_nobjs_set", _wrap_plotradec_args_nobjs_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_nobjs_get", _wrap_plotradec_args_nobjs_get, METH_VARARGS, NULL}, { (char *)"plotradec_args_radecvals_set", _wrap_plotradec_args_radecvals_set, METH_VARARGS, NULL}, { (char *)"plotradec_args_radecvals_get", _wrap_plotradec_args_radecvals_get, METH_VARARGS, NULL}, { (char *)"new_plotradec_args", _wrap_new_plotradec_args, METH_VARARGS, NULL}, { (char *)"delete_plotradec_args", _wrap_delete_plotradec_args, METH_VARARGS, NULL}, { (char *)"plotradec_args_swigregister", plotradec_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_radec_get", _wrap_plot_radec_get, METH_VARARGS, NULL}, { (char *)"plot_radec_reset", _wrap_plot_radec_reset, METH_VARARGS, NULL}, { (char *)"plot_radec_init", _wrap_plot_radec_init, METH_VARARGS, NULL}, { (char *)"plot_radec_set_racol", _wrap_plot_radec_set_racol, METH_VARARGS, NULL}, { (char *)"plot_radec_set_deccol", _wrap_plot_radec_set_deccol, METH_VARARGS, NULL}, { (char *)"plot_radec_set_filename", _wrap_plot_radec_set_filename, METH_VARARGS, NULL}, { (char *)"plot_radec_command", _wrap_plot_radec_command, METH_VARARGS, NULL}, { (char *)"plot_radec_count_inbounds", _wrap_plot_radec_count_inbounds, METH_VARARGS, NULL}, { (char *)"plot_radec_plot", _wrap_plot_radec_plot, METH_VARARGS, NULL}, { (char *)"plot_radec_free", _wrap_plot_radec_free, METH_VARARGS, NULL}, { (char *)"plot_radec_vals", _wrap_plot_radec_vals, METH_VARARGS, NULL}, { (char *)"plot_radec_describe", _wrap_plot_radec_describe, METH_VARARGS, NULL}, { (char *)"plotmatch_args_matches_set", _wrap_plotmatch_args_matches_set, METH_VARARGS, NULL}, { (char *)"plotmatch_args_matches_get", _wrap_plotmatch_args_matches_get, METH_VARARGS, NULL}, { (char *)"new_plotmatch_args", _wrap_new_plotmatch_args, METH_VARARGS, NULL}, { (char *)"delete_plotmatch_args", _wrap_delete_plotmatch_args, METH_VARARGS, NULL}, { (char *)"plotmatch_args_swigregister", plotmatch_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_match_get", _wrap_plot_match_get, METH_VARARGS, NULL}, { (char *)"plot_match_add_match", _wrap_plot_match_add_match, METH_VARARGS, NULL}, { (char *)"plot_match_set_filename", _wrap_plot_match_set_filename, METH_VARARGS, NULL}, { (char *)"plot_match_init", _wrap_plot_match_init, METH_VARARGS, NULL}, { (char *)"plot_match_command", _wrap_plot_match_command, METH_VARARGS, NULL}, { (char *)"plot_match_plot", _wrap_plot_match_plot, METH_VARARGS, NULL}, { (char *)"plot_match_free", _wrap_plot_match_free, METH_VARARGS, NULL}, { (char *)"plot_match_describe", _wrap_plot_match_describe, METH_VARARGS, NULL}, { (char *)"annotation_args_NGC_set", _wrap_annotation_args_NGC_set, METH_VARARGS, NULL}, { (char *)"annotation_args_NGC_get", _wrap_annotation_args_NGC_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellations_set", _wrap_annotation_args_constellations_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellations_get", _wrap_annotation_args_constellations_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_lines_set", _wrap_annotation_args_constellation_lines_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_lines_get", _wrap_annotation_args_constellation_lines_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_markers_set", _wrap_annotation_args_constellation_markers_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_markers_get", _wrap_annotation_args_constellation_markers_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_labels_set", _wrap_annotation_args_constellation_labels_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_labels_get", _wrap_annotation_args_constellation_labels_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_labels_long_set", _wrap_annotation_args_constellation_labels_long_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_labels_long_get", _wrap_annotation_args_constellation_labels_long_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_lines_offset_set", _wrap_annotation_args_constellation_lines_offset_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_lines_offset_get", _wrap_annotation_args_constellation_lines_offset_get, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_pastel_set", _wrap_annotation_args_constellation_pastel_set, METH_VARARGS, NULL}, { (char *)"annotation_args_constellation_pastel_get", _wrap_annotation_args_constellation_pastel_get, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_set", _wrap_annotation_args_bright_set, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_get", _wrap_annotation_args_bright_get, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_labels_set", _wrap_annotation_args_bright_labels_set, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_labels_get", _wrap_annotation_args_bright_labels_get, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_pastel_set", _wrap_annotation_args_bright_pastel_set, METH_VARARGS, NULL}, { (char *)"annotation_args_bright_pastel_get", _wrap_annotation_args_bright_pastel_get, METH_VARARGS, NULL}, { (char *)"annotation_args_HD_set", _wrap_annotation_args_HD_set, METH_VARARGS, NULL}, { (char *)"annotation_args_HD_get", _wrap_annotation_args_HD_get, METH_VARARGS, NULL}, { (char *)"annotation_args_HD_labels_set", _wrap_annotation_args_HD_labels_set, METH_VARARGS, NULL}, { (char *)"annotation_args_HD_labels_get", _wrap_annotation_args_HD_labels_get, METH_VARARGS, NULL}, { (char *)"annotation_args_ngc_fraction_set", _wrap_annotation_args_ngc_fraction_set, METH_VARARGS, NULL}, { (char *)"annotation_args_ngc_fraction_get", _wrap_annotation_args_ngc_fraction_get, METH_VARARGS, NULL}, { (char *)"annotation_args_targets_set", _wrap_annotation_args_targets_set, METH_VARARGS, NULL}, { (char *)"annotation_args_targets_get", _wrap_annotation_args_targets_get, METH_VARARGS, NULL}, { (char *)"annotation_args_hd_catalog_set", _wrap_annotation_args_hd_catalog_set, METH_VARARGS, NULL}, { (char *)"annotation_args_hd_catalog_get", _wrap_annotation_args_hd_catalog_get, METH_VARARGS, NULL}, { (char *)"annotation_args_add_target", _wrap_annotation_args_add_target, METH_VARARGS, NULL}, { (char *)"annotation_args_add_named_target", _wrap_annotation_args_add_named_target, METH_VARARGS, NULL}, { (char *)"new_annotation_args", _wrap_new_annotation_args, METH_VARARGS, NULL}, { (char *)"delete_annotation_args", _wrap_delete_annotation_args, METH_VARARGS, NULL}, { (char *)"annotation_args_swigregister", annotation_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_annotations_init", _wrap_plot_annotations_init, METH_VARARGS, NULL}, { (char *)"plot_annotations_get", _wrap_plot_annotations_get, METH_VARARGS, NULL}, { (char *)"plot_annotations_command", _wrap_plot_annotations_command, METH_VARARGS, NULL}, { (char *)"plot_annotations_plot", _wrap_plot_annotations_plot, METH_VARARGS, NULL}, { (char *)"plot_annotations_free", _wrap_plot_annotations_free, METH_VARARGS, NULL}, { (char *)"plot_annotations_set_hd_catalog", _wrap_plot_annotations_set_hd_catalog, METH_VARARGS, NULL}, { (char *)"plot_annotations_add_named_target", _wrap_plot_annotations_add_named_target, METH_VARARGS, NULL}, { (char *)"plot_annotations_add_target", _wrap_plot_annotations_add_target, METH_VARARGS, NULL}, { (char *)"plot_annotations_describe", _wrap_plot_annotations_describe, METH_VARARGS, NULL}, { (char *)"plothealpix_args_nside_set", _wrap_plothealpix_args_nside_set, METH_VARARGS, NULL}, { (char *)"plothealpix_args_nside_get", _wrap_plothealpix_args_nside_get, METH_VARARGS, NULL}, { (char *)"plothealpix_args_stepsize_set", _wrap_plothealpix_args_stepsize_set, METH_VARARGS, NULL}, { (char *)"plothealpix_args_stepsize_get", _wrap_plothealpix_args_stepsize_get, METH_VARARGS, NULL}, { (char *)"new_plothealpix_args", _wrap_new_plothealpix_args, METH_VARARGS, NULL}, { (char *)"delete_plothealpix_args", _wrap_delete_plothealpix_args, METH_VARARGS, NULL}, { (char *)"plothealpix_args_swigregister", plothealpix_args_swigregister, METH_VARARGS, NULL}, { (char *)"plot_healpix_get", _wrap_plot_healpix_get, METH_VARARGS, NULL}, { (char *)"plot_healpix_init", _wrap_plot_healpix_init, METH_VARARGS, NULL}, { (char *)"plot_healpix_command", _wrap_plot_healpix_command, METH_VARARGS, NULL}, { (char *)"plot_healpix_plot", _wrap_plot_healpix_plot, METH_VARARGS, NULL}, { (char *)"plot_healpix_free", _wrap_plot_healpix_free, METH_VARARGS, NULL}, { (char *)"plot_healpix_describe", _wrap_plot_healpix_describe, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_CLEAR_swigconstant", CAIRO_OPERATOR_CLEAR_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_SOURCE_swigconstant", CAIRO_OPERATOR_SOURCE_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_OVER_swigconstant", CAIRO_OPERATOR_OVER_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_IN_swigconstant", CAIRO_OPERATOR_IN_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_OUT_swigconstant", CAIRO_OPERATOR_OUT_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_ATOP_swigconstant", CAIRO_OPERATOR_ATOP_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_DEST_swigconstant", CAIRO_OPERATOR_DEST_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_DEST_OVER_swigconstant", CAIRO_OPERATOR_DEST_OVER_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_DEST_IN_swigconstant", CAIRO_OPERATOR_DEST_IN_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_DEST_OUT_swigconstant", CAIRO_OPERATOR_DEST_OUT_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_DEST_ATOP_swigconstant", CAIRO_OPERATOR_DEST_ATOP_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_XOR_swigconstant", CAIRO_OPERATOR_XOR_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_ADD_swigconstant", CAIRO_OPERATOR_ADD_swigconstant, METH_VARARGS, NULL}, { (char *)"CAIRO_OPERATOR_SATURATE_swigconstant", CAIRO_OPERATOR_SATURATE_swigconstant, METH_VARARGS, NULL}, { (char *)"image_debug", _wrap_image_debug, METH_VARARGS, NULL}, { (char *)"image_add", _wrap_image_add, METH_VARARGS, NULL}, { (char *)"image_weighted_smooth", _wrap_image_weighted_smooth, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_FILE = {"_p_FILE", "FILE *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_MatchObj = {"_p_MatchObj", "MatchObj *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_a_2__double = {"_p_a_2__double", "double (*)[2]", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_annotation_args = {"_p_annotation_args", "struct annotation_args *|annotation_args *|plotann_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_anwcs_t = {"_p_anwcs_t", "struct anwcs_t *|anwcs_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_bl = {"_p_bl", "bl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_cairo_op = {"_p_cairo_op", "cairo_operator_t *|enum cairo_op *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_cairo_surface_t = {"_p_cairo_surface_t", "cairo_surface_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_cairo_t = {"_p_cairo_t", "cairo_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_coadd_t = {"_p_coadd_t", "coadd_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_codetree_t = {"_p_codetree_t", "codetree_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_dl = {"_p_dl", "dl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int = {"_p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int", "plot_func_plot_t|int (*)(char const *,cairo_t *,struct plot_args *,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int = {"_p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int", "plot_func_command_t|int (*)(char const *,char const *,struct plot_args *,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_struct_plot_args__p_void = {"_p_f_p_struct_plot_args__p_void", "void *(*)(struct plot_args *)|plot_func_init_t", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_struct_plot_args_double_double_p_void__void = {"_p_f_p_struct_plot_args_double_double_p_void__void", "void (*)(struct plot_args *,double,double,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_struct_plot_args_p_void__int = {"_p_f_p_struct_plot_args_p_void__int", "int (*)(struct plot_args *,void *)|plot_func_init2_t", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_f_p_struct_plot_args_p_void__void = {"_p_f_p_struct_plot_args_p_void__void", "plot_func_free_t|void (*)(struct plot_args *,void *)", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_float = {"_p_float", "number *|float *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_index_t = {"_p_index_t", "index_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_lanczos_args_t = {"_p_lanczos_args_t", "lanczos_args_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_pl = {"_p_pl", "pl *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plot_args = {"_p_plot_args", "struct plot_args *|plot_args *|plot_args_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotgrid_args = {"_p_plotgrid_args", "struct plotgrid_args *|plotgrid_args *|plotgrid_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plothealpix_args = {"_p_plothealpix_args", "struct plothealpix_args *|plothealpix_t *|plothealpix_args *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotimage_args = {"_p_plotimage_args", "struct plotimage_args *|plotimage_args *|plotimage_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotindex_args = {"_p_plotindex_args", "plotindex_t *|struct plotindex_args *|plotindex_args *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotmatch_args = {"_p_plotmatch_args", "struct plotmatch_args *|plotmatch_args *|plotmatch_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotoutline_args = {"_p_plotoutline_args", "struct plotoutline_args *|plotoutline_args *|plotoutline_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotradec_args = {"_p_plotradec_args", "plotradec_t *|struct plotradec_args *|plotradec_args *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotter = {"_p_plotter", "struct plotter *|plotter *|plotter_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_plotxy_args = {"_p_plotxy_args", "plotxy_t *|struct plotxy_args *|plotxy_args *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_qfits_header = {"_p_qfits_header", "qfits_header *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_qfitsdumper = {"_p_qfitsdumper", "struct qfitsdumper *|qfitsdumper *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_quadfile_t = {"_p_quadfile_t", "quadfile_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_sip_t = {"_p_sip_t", "sip_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_startree_t = {"_p_startree_t", "startree_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_tan_t = {"_p_tan_t", "tan_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_uint16_t = {"_p_uint16_t", "dimage_label_t *|uint16_t *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "uchar *|unsigned char *|anbool *|byte *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_FILE, &_swigt__p_MatchObj, &_swigt__p_a_2__double, &_swigt__p_annotation_args, &_swigt__p_anwcs_t, &_swigt__p_bl, &_swigt__p_cairo_op, &_swigt__p_cairo_surface_t, &_swigt__p_cairo_t, &_swigt__p_char, &_swigt__p_coadd_t, &_swigt__p_codetree_t, &_swigt__p_dl, &_swigt__p_double, &_swigt__p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int, &_swigt__p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int, &_swigt__p_f_p_struct_plot_args__p_void, &_swigt__p_f_p_struct_plot_args_double_double_p_void__void, &_swigt__p_f_p_struct_plot_args_p_void__int, &_swigt__p_f_p_struct_plot_args_p_void__void, &_swigt__p_float, &_swigt__p_index_t, &_swigt__p_int, &_swigt__p_lanczos_args_t, &_swigt__p_pl, &_swigt__p_plot_args, &_swigt__p_plotgrid_args, &_swigt__p_plothealpix_args, &_swigt__p_plotimage_args, &_swigt__p_plotindex_args, &_swigt__p_plotmatch_args, &_swigt__p_plotoutline_args, &_swigt__p_plotradec_args, &_swigt__p_plotter, &_swigt__p_plotxy_args, &_swigt__p_qfits_header, &_swigt__p_qfitsdumper, &_swigt__p_quadfile_t, &_swigt__p_sip_t, &_swigt__p_startree_t, &_swigt__p_tan_t, &_swigt__p_uint16_t, &_swigt__p_unsigned_char, &_swigt__p_void, }; static swig_cast_info _swigc__p_FILE[] = { {&_swigt__p_FILE, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_MatchObj[] = { {&_swigt__p_MatchObj, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_a_2__double[] = { {&_swigt__p_a_2__double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_annotation_args[] = { {&_swigt__p_annotation_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_anwcs_t[] = { {&_swigt__p_anwcs_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_bl[] = { {&_swigt__p_bl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_cairo_op[] = { {&_swigt__p_cairo_op, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_cairo_surface_t[] = { {&_swigt__p_cairo_surface_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_cairo_t[] = { {&_swigt__p_cairo_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_coadd_t[] = { {&_swigt__p_coadd_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_codetree_t[] = { {&_swigt__p_codetree_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_dl[] = { {&_swigt__p_dl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_double[] = { {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int[] = { {&_swigt__p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int[] = { {&_swigt__p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_struct_plot_args__p_void[] = { {&_swigt__p_f_p_struct_plot_args__p_void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_struct_plot_args_double_double_p_void__void[] = { {&_swigt__p_f_p_struct_plot_args_double_double_p_void__void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_struct_plot_args_p_void__int[] = { {&_swigt__p_f_p_struct_plot_args_p_void__int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_f_p_struct_plot_args_p_void__void[] = { {&_swigt__p_f_p_struct_plot_args_p_void__void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_float[] = { {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_index_t[] = { {&_swigt__p_index_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_lanczos_args_t[] = { {&_swigt__p_lanczos_args_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_pl[] = { {&_swigt__p_pl, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plot_args[] = { {&_swigt__p_plot_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotgrid_args[] = { {&_swigt__p_plotgrid_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plothealpix_args[] = { {&_swigt__p_plothealpix_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotimage_args[] = { {&_swigt__p_plotimage_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotindex_args[] = { {&_swigt__p_plotindex_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotmatch_args[] = { {&_swigt__p_plotmatch_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotoutline_args[] = { {&_swigt__p_plotoutline_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotradec_args[] = { {&_swigt__p_plotradec_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotter[] = { {&_swigt__p_plotter, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_plotxy_args[] = { {&_swigt__p_plotxy_args, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_qfits_header[] = { {&_swigt__p_qfits_header, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_qfitsdumper[] = { {&_swigt__p_qfitsdumper, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_quadfile_t[] = { {&_swigt__p_quadfile_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_sip_t[] = { {&_swigt__p_sip_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_startree_t[] = { {&_swigt__p_startree_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_tan_t[] = { {&_swigt__p_tan_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_uint16_t[] = { {&_swigt__p_uint16_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_unsigned_char[] = { {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_FILE, _swigc__p_MatchObj, _swigc__p_a_2__double, _swigc__p_annotation_args, _swigc__p_anwcs_t, _swigc__p_bl, _swigc__p_cairo_op, _swigc__p_cairo_surface_t, _swigc__p_cairo_t, _swigc__p_char, _swigc__p_coadd_t, _swigc__p_codetree_t, _swigc__p_dl, _swigc__p_double, _swigc__p_f_p_q_const__char_p_cairo_t_p_struct_plot_args_p_void__int, _swigc__p_f_p_q_const__char_p_q_const__char_p_struct_plot_args_p_void__int, _swigc__p_f_p_struct_plot_args__p_void, _swigc__p_f_p_struct_plot_args_double_double_p_void__void, _swigc__p_f_p_struct_plot_args_p_void__int, _swigc__p_f_p_struct_plot_args_p_void__void, _swigc__p_float, _swigc__p_index_t, _swigc__p_int, _swigc__p_lanczos_args_t, _swigc__p_pl, _swigc__p_plot_args, _swigc__p_plotgrid_args, _swigc__p_plothealpix_args, _swigc__p_plotimage_args, _swigc__p_plotindex_args, _swigc__p_plotmatch_args, _swigc__p_plotoutline_args, _swigc__p_plotradec_args, _swigc__p_plotter, _swigc__p_plotxy_args, _swigc__p_qfits_header, _swigc__p_qfitsdumper, _swigc__p_quadfile_t, _swigc__p_sip_t, _swigc__p_startree_t, _swigc__p_tan_t, _swigc__p_uint16_t, _swigc__p_unsigned_char, _swigc__p_void, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString("<Swig global variables>"); #else return PyString_FromString("<Swig global variables>"); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { /* PyObject header changed in Python 3 */ #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ (printfunc) swig_varlink_print, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; varlink_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 varlink_type.ob_type = &PyType_Type; #else if (PyType_Ready(&varlink_type) < 0) return NULL; #endif } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { # if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, # else { PyObject_HEAD_INIT(NULL) NULL, /* m_init */ 0, /* m_index */ NULL, /* m_copy */ }, # endif (char *) SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = { 0, 0, 0, 0, 0, 0, 0 }; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { (PyCFunction) SwigPyObject_own, (PyCFunction) SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyObject *metatype_args; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* metatype is used to implement static member variables. */ metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type); assert(metatype_args); metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL); assert(metatype); Py_DECREF(metatype_args); metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro; assert(PyType_Ready(metatype) >= 0); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce(); } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); import_array(); #if PY_VERSION_HEX >= 0x03000000 return m; #else return; #endif } �������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotxxx.c�����������������������������������������������������������������000644 �000765 �000024 �00000002030 12651445460 017543� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <math.h> #include "plotxxx.h" #include "cairoutils.h" #include "ioutils.h" #include "log.h" #include "errors.h" DEFINE_PLOTTER(xxx); plotxxx_t* plot_xxx_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "xxx"); } void* plot_xxx_init(plot_args_t* plotargs) { plotxxx_t* args = calloc(1, sizeof(plotxxx_t)); return args; } int plot_xxx_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotxxx_t* args = (plotxxx_t*)baton; return 0; } int plot_xxx_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { plotxxx_t* args = (plotxxx_t*)baton; if (streq(cmd, "xxx_file")) { //plot_image_set_filename(args, cmdargs); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_xxx_free(plot_args_t* plotargs, void* baton) { plotxxx_t* args = (plotxxx_t*)baton; free(args); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotxxx.h�����������������������������������������������������������������000644 �000765 �000024 �00000001165 12651445460 017560� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PLOTXXX_H #define PLOTXXX_H #include "astrometry/plotstuff.h" struct plotxxx_args { }; typedef struct plotxxx_args plotxxx_t; plotxxx_t* plot_xxx_get(plot_args_t* pargs); void* plot_xxx_init(plot_args_t* args); int plot_xxx_command(const char* command, const char* cmdargs, plot_args_t* args, void* baton); int plot_xxx_plot(const char* command, cairo_t* cr, plot_args_t* args, void* baton); void plot_xxx_free(plot_args_t* args, void* baton); extern const plotter_t plotter_xxx; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotxy-main.c�������������������������������������������������������������000644 �000765 �000024 �00000011576 12651445460 020315� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <string.h> #include <stdint.h> #include <assert.h> #include <cairo.h> #include <cairo-pdf.h> #include "plotstuff.h" #include "plotxy.h" #include "plotimage.h" #include "xylist.h" #include "boilerplate.h" #include "cairoutils.h" #include "log.h" #include "errors.h" #include "fitsioutils.h" #include "ioutils.h" #define OPTIONS "hvW:H:n:N:r:s:i:e:x:y:w:S:I:PC:X:Y:b:o:pJ" static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] > output.png\n" " -i <input-file> Input file (xylist)\n" " [-o <output-file>] (default: stdout)\n" " [-I <image> ] Input image on which plotting will occur; PPM format.\n" " [-p]: Input image is PNG format, not PPM.\n" " [-P] Write PPM output instead of PNG.\n" " [-J] Write PDF output.\n" " [-W <width> ] Width of output image (default: data-dependent).\n" " [-H <height> ] Height of output image (default: data-dependent).\n" " [-x <x-offset>] X offset: position of the bottom-left pixel (default: 1).\n" " [-y <y-offset>] Y offset: position of the bottom-left pixel (default: 1).\n" " [-X <x-column-name>] X column: name of the FITS column.\n" " [-Y <y-column-name>] Y column: name of the FITS column.\n" " [-n <first-obj>] First object to plot (default: 0).\n" " [-N <num-objs>] Number of objects to plot (default: all).\n" " [-r <radius>] Size of markers to plot (default: 5.0).\n" " [-w <linewidth>] Linewidth (default: 1.0).\n" " [-s <shape>] Shape of markers (default: circle):", progname); cairoutils_print_marker_names("\n "); printf("\n"); printf(" [-C <color>] Color to plot in: (default: white)\n"); cairoutils_print_color_names("\n "); printf("\n"); printf(" [-b <color>] Draw in <color> behind each marker.\n" " [-S <scale-factor>] Scale xylist entries by this value before plotting.\n" " [-e <extension>] FITS extension to read (default 0).\n" "\n"); } int main(int argc, char *args[]) { int argchar; char* progname = args[0]; plot_args_t pargs; plotxy_t* xy; plotimage_t* img; int loglvl = LOG_MSG; // log errors to stderr, not stdout. errors_log_to(stderr); plotstuff_init(&pargs); pargs.fout = stdout; pargs.outformat = PLOTSTUFF_FORMAT_PNG; xy = plotstuff_get_config(&pargs, "xy"); img = plotstuff_get_config(&pargs, "image"); assert(xy); assert(img); plotstuff_set_color(&pargs, "white"); plotstuff_set_bgcolor(&pargs, "black"); img->format = PLOTSTUFF_FORMAT_PPM; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'C': plotstuff_set_color(&pargs, optarg); break; case 'b': plotstuff_set_bgcolor(&pargs, "optarg"); break; case 'o': pargs.outfn = optarg; break; case 'X': plot_xy_set_xcol(xy, optarg); break; case 'Y': plot_xy_set_ycol(xy, optarg); break; case 'P': pargs.outformat = PLOTSTUFF_FORMAT_PPM; break; case 'J': pargs.outformat = PLOTSTUFF_FORMAT_PDF; break; case 'p': img->format = PLOTSTUFF_FORMAT_PNG; break; case 'I': plot_image_set_filename(img, optarg); break; case 'S': xy->scale = atof(optarg); break; case 'i': plot_xy_set_filename(xy, optarg); break; case 'x': xy->xoff = atof(optarg); break; case 'y': xy->yoff = atof(optarg); break; case 'W': pargs.W = atoi(optarg); break; case 'H': pargs.H = atoi(optarg); break; case 'n': xy->firstobj = atoi(optarg); break; case 'N': xy->nobjs = atoi(optarg); break; case 'e': xy->ext = atoi(optarg); break; case 'r': pargs.markersize = atof(optarg); break; case 'w': pargs.lw = atof(optarg); break; case 's': plotstuff_set_marker(&pargs, optarg); break; case 'h': printHelp(progname); exit(0); case '?': default: printHelp(progname); exit(-1); } if (optind != argc) { printHelp(progname); exit(-1); } if (!xy->fn) { printHelp(progname); exit(-1); } log_init(loglvl); log_to(stderr); fits_use_error_system(); if (img->fn) { if (plot_image_setsize(&pargs, img)) { ERROR("Failed to set plot size from image"); exit(-1); } plotstuff_run_command(&pargs, "image"); } else { if (pargs.W == 0 || pargs.H == 0) { if (plot_xy_setsize(&pargs, xy)) { ERROR("Failed to set plot size from xylist"); exit(-1); } } } plotstuff_run_command(&pargs, "xy"); plotstuff_output(&pargs); plotstuff_free(&pargs); return 0; } ����������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/plotxy.c������������������������������������������������������������������000644 �000765 �000024 �00000015021 12651445460 017360� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include "os-features.h" #include "plotxy.h" #include "xylist.h" #include "cairoutils.h" #include "log.h" #include "errors.h" #include "sip_qfits.h" #include "tic.h" DEFINE_PLOTTER(xy); plotxy_t* plot_xy_get(plot_args_t* pargs) { return plotstuff_get_config(pargs, "xy"); } void* plot_xy_init(plot_args_t* plotargs) { plotxy_t* args = calloc(1, sizeof(plotxy_t)); args->ext = 1; args->scale = 1.0; args->xyvals = dl_new(32); // FITS pixels. args->xoff = 1.0; args->yoff = 1.0; return args; } int plot_xy_setsize(plot_args_t* pargs, plotxy_t* args) { xylist_t* xyls; xyls = xylist_open(args->fn); if (!xyls) { ERROR("Failed to open xylist from file \"%s\"", args->fn); return -1; } pargs->W = xylist_get_imagew(xyls); pargs->H = xylist_get_imageh(xyls); if (pargs->W == 0 && pargs->H == 0) { qfits_header* hdr = xylist_get_primary_header(xyls); pargs->W = qfits_header_getint(hdr, "IMAGEW", 0); pargs->H = qfits_header_getint(hdr, "IMAGEH", 0); } xylist_close(xyls); return 0; } int plot_xy_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotxy_t* args = (plotxy_t*)baton; // Plot it! xylist_t* xyls; starxy_t myxy; starxy_t* xy = NULL; starxy_t* freexy = NULL; int Nxy; int i; #if 0 double t0; #endif plotstuff_builtin_apply(cairo, pargs); if (args->fn && dl_size(args->xyvals)) { ERROR("Can only plot one of xylist filename and xy_vals"); return -1; } if (!args->fn && !dl_size(args->xyvals)) { ERROR("Neither xylist filename nor xy_vals given!"); return -1; } if (args->fn) { #if 0 t0 = timenow(); #endif // Open xylist. xyls = xylist_open(args->fn); if (!xyls) { ERROR("Failed to open xylist from file \"%s\"", args->fn); return -1; } // we don't care about FLUX and BACKGROUND columns. xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); if (args->xcol) xylist_set_xname(xyls, args->xcol); if (args->ycol) xylist_set_yname(xyls, args->ycol); // Find number of entries in xylist. xy = xylist_read_field_num(xyls, args->ext, NULL); freexy = xy; xylist_close(xyls); if (!xy) { ERROR("Failed to read FITS extension %i from file %s.\n", args->ext, args->fn); return -1; } Nxy = starxy_n(xy); // If N is specified, apply it as a max. if (args->nobjs) Nxy = MIN(Nxy, args->nobjs); //logmsg("%g s to read xylist\n", timenow()-t0); } else { assert(dl_size(args->xyvals)); starxy_from_dl(&myxy, args->xyvals, FALSE, FALSE); xy = &myxy; Nxy = starxy_n(xy); } // Transform through WCSes. if (args->wcs) { double ra, dec, x, y; assert(pargs->wcs); /* // check for any overlap. double pralo,prahi,pdeclo,pdechi; double ralo,rahi,declo,dechi; anwcs_get_radec_bounds(pargs->wcs, 100, &pralo, &prahi, &pdeclo, &pdechi); anwcs_get_radec_bounds(args->wcs, 100, &ralo, &rahi, &declo, &dechi); if ( */ for (i=0; i<Nxy; i++) { anwcs_pixelxy2radec(args->wcs, // I used to add 1 here starxy_getx(xy, i), starxy_gety(xy, i), &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; logverb(" xy (%g,%g) -> RA,Dec (%g,%g) -> plot xy (%g,%g)\n", starxy_getx(xy,i), starxy_gety(xy,i), ra, dec, x, y); // add shift and scale... // FIXME -- not clear that we want to do this here... /* starxy_setx(xy, i, args->scale * (x - args->xoff)); starxy_sety(xy, i, args->scale * (y - args->yoff)); starxy_setx(xy, i, x-1); starxy_sety(xy, i, y-1); */ // Output coords: FITS -> 0-indexed image starxy_setx(xy, i, x-1); starxy_sety(xy, i, y-1); } } else { // Shift and scale xylist entries. if (args->xoff != 0.0 || args->yoff != 0.0) { for (i=0; i<Nxy; i++) { starxy_setx(xy, i, starxy_getx(xy, i) - args->xoff); starxy_sety(xy, i, starxy_gety(xy, i) - args->yoff); } } if (args->scale != 1.0) { for (i=0; i<Nxy; i++) { starxy_setx(xy, i, args->scale * starxy_getx(xy, i)); starxy_sety(xy, i, args->scale * starxy_gety(xy, i)); } } } // Plot markers. #if 0 t0 = timenow(); #endif for (i=args->firstobj; i<Nxy; i++) { double x = starxy_getx(xy, i); double y = starxy_gety(xy, i); if (plotstuff_marker_in_bounds(pargs, x, y)) plotstuff_stack_marker(pargs, x, y); } plotstuff_plot_stack(pargs, cairo); //logmsg("%g s to plot xylist\n", timenow()-t0); starxy_free(freexy); return 0; } void plot_xy_set_xcol(plotxy_t* args, const char* col) { free(args->xcol); args->xcol = strdup_safe(col); } void plot_xy_set_ycol(plotxy_t* args, const char* col) { free(args->ycol); args->ycol = strdup_safe(col); } void plot_xy_set_filename(plotxy_t* args, const char* fn) { free(args->fn); args->fn = strdup_safe(fn); } int plot_xy_set_wcs_filename(plotxy_t* args, const char* fn, int ext) { anwcs_free(args->wcs); args->wcs = anwcs_open(fn, ext); if (!args->wcs) { ERROR("Failed to read WCS file \"%s\"", fn); return -1; } return 0; } int plot_xy_set_offsets(plotxy_t* args, double xo, double yo) { args->xoff = xo; args->yoff = yo; return 0; } void plot_xy_vals(plotxy_t* args, double x, double y) { dl_append(args->xyvals, x); dl_append(args->xyvals, y); } void plot_xy_clear_list(plotxy_t* args) { dl_remove_all(args->xyvals); } int plot_xy_command(const char* cmd, const char* cmdargs, plot_args_t* plotargs, void* baton) { plotxy_t* args = (plotxy_t*)baton; if (streq(cmd, "xy_file")) { plot_xy_set_filename(args, cmdargs); } else if (streq(cmd, "xy_ext")) { args->ext = atoi(cmdargs); } else if (streq(cmd, "xy_xcol")) { plot_xy_set_xcol(args, cmdargs); } else if (streq(cmd, "xy_ycol")) { plot_xy_set_ycol(args, cmdargs); } else if (streq(cmd, "xy_xoff")) { args->xoff = atof(cmdargs); } else if (streq(cmd, "xy_yoff")) { args->yoff = atof(cmdargs); } else if (streq(cmd, "xy_firstobj")) { args->firstobj = atoi(cmdargs); } else if (streq(cmd, "xy_nobjs")) { args->nobjs = atoi(cmdargs); } else if (streq(cmd, "xy_scale")) { args->scale = atof(cmdargs); //} else if (streq(cmd, "xy_wcs")) { //return plot_xy_set_wcs_filename(args, cmdargs); } else if (streq(cmd, "xy_vals")) { plotstuff_append_doubles(cmdargs, args->xyvals); } else { ERROR("Did not understand command \"%s\"", cmd); return -1; } return 0; } void plot_xy_free(plot_args_t* plotargs, void* baton) { plotxy_t* args = (plotxy_t*)baton; free(args->xyvals); anwcs_free(args->wcs); free(args->xcol); free(args->ycol); free(args->fn); free(args); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/pnpoly.c������������������������������������������������������������������000644 �000765 �000024 �00000003426 12651445460 017350� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* From http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html */ /* Copyright (c) 1970-2003, Wm. Randolph Franklin 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: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. 2. Redistributions in binary form must reproduce the above copyright notice in the documentation and/or other materials provided with the distribution. 3. The name of W. Randolph Franklin may not be used to endorse or promote products derived from this Software without specific prior written permission. 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. */ int point_in_poly(double* xp, double* yp, int npol, double x, double y) { int i, j, c = 0; for (i = 0, j = npol-1; i < npol; j = i++) { if ((((yp[i]<=y) && (y<yp[j])) || ((yp[j]<=y) && (y<yp[i]))) && (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i])) c = !c; } return c; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/pnpoly.h������������������������������������������������������������������000644 �000765 �000024 �00000000406 12651445460 017350� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* See the file "pnpoly.c" for copyright and license information. */ /* Returns 1 if the point (x,y) is inside the polygon defined by the set of points (xp,yp) of length "npol". */ int point_in_poly(double* xp, double* yp, int npol, double x, double y); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/pquad.h�������������������������������������������������������������������000644 �000765 �000024 �00000001037 12651445460 017142� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef PQUAD_H #define PQUAD_H /** This file is just required for testing purposes (of solver.c) */ struct potential_quad { anbool scale_ok; int fieldA, fieldB; // distance-squared between A and B, in pixels^2. double scale; double costheta, sintheta; // (field pixel noise / quad scale in pixels)^2 double rel_field_noise2; anbool* inbox; int ninbox; double* xy; }; typedef struct potential_quad pquad; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/printsolved.c�������������������������������������������������������������000644 �000765 �000024 �00000005502 12651445460 020375� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include "starutil.h" #include "mathutil.h" #include "boilerplate.h" #include "bl.h" #include "solvedfile.h" const char* OPTIONS = "hum:SM:jwps"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "\nUsage: %s <solved-file> ...\n" " [-s]: just summary info, no field numbers\n" " [-p]: print percent solved\n" " [-u]: print UNsolved fields\n" " [-j]: just the field numbers, no headers, etc.\n" " [-m <max-field>]: for unsolved mode, max field number.\n" " [-w]: format for the wiki.\n" " [-M <variable-name>]: format for Matlab.\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* progname = args[0]; char** inputfiles = NULL; int ninputfiles = 0; int i; anbool unsolved = FALSE; int maxfield = 0; anbool wiki = FALSE; char* matlab = NULL; anbool justnums = FALSE; anbool percent = FALSE; anbool printinfo = FALSE; anbool printnums = FALSE; anbool summary = FALSE; int ncounted = 0; int ntotal = 0; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 's': summary = TRUE; break; case 'p': percent = TRUE; break; case 'j': justnums = TRUE; break; case 'M': matlab = optarg; break; case 'w': wiki = TRUE; break; case 'u': unsolved = TRUE; break; case 'm': maxfield = atoi(optarg); break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { ninputfiles = argc - optind; inputfiles = args + optind; } else { printHelp(progname); exit(-1); } printinfo = (!matlab && !justnums); printnums = !summary; if (matlab) printf("%s=[", matlab); for (i=0; i<ninputfiles; i++) { int j; il* list; if (printinfo) printf("File %s\n", inputfiles[i]); if (wiki) printf("|| %i || ", i+1); if (unsolved) list = solvedfile_getall(inputfiles[i], 1, maxfield, 0); else list = solvedfile_getall_solved(inputfiles[i], 1, maxfield, 0); if (percent) { int nt = solvedfile_getsize(inputfiles[i]); int nc = il_size(list); printf("%s: %i/%i (%f %%) %ssolved\n", inputfiles[i], nc, nt, (100.0 * nc / (double)nt), unsolved ? "un":""); ncounted += nc; ntotal += nt; } if (!list) { fprintf(stderr, "Failed to get list of fields.\n"); exit(-1); } if (printnums) { for (j=0; j<il_size(list); j++) printf("%i ", il_get(list, j)); } il_free(list); if (wiki) printf(" ||"); printf("\n"); } if (matlab) printf("];\n"); if (percent) { printf("Total: %i/%i (%f %%) %ssolved\n", ncounted, ntotal, (100.0 * ncounted / (double)ntotal), unsolved ? "un":""); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/quad-builder.c������������������������������������������������������������000644 �000765 �000024 �00000015721 12651445460 020406� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include "quad-builder.h" #include "quad-utils.h" #include "mathutil.h" #include "errors.h" #include "log.h" struct quad { unsigned int star[DQMAX]; }; typedef struct quad quad; static void check_scale(quadbuilder_t* qb, pquad_t* pq) { double *sA, *sB; double s2; double Bx=0, By=0; double invscale; double ABx, ABy; Unused anbool ok; if (!(qb->check_scale_low || qb->check_scale_high)) return; sA = qb->starxyz + pq->iA * 3; sB = qb->starxyz + pq->iB * 3; // s2: squared AB dist s2 = distsq(sA, sB, 3); pq->scale_ok = TRUE; if (qb->check_scale_low && s2 < qb->quadd2_low) pq->scale_ok = FALSE; if (pq->scale_ok && qb->check_scale_high && s2 > qb->quadd2_high) pq->scale_ok = FALSE; if (!pq->scale_ok) { qb->nbadscale++; return; } star_midpoint(pq->midAB, sA, sB); pq->scale_ok = TRUE; pq->staridA = qb->starinds[pq->iA]; pq->staridB = qb->starinds[pq->iB]; ok = star_coords(sA, pq->midAB, TRUE, &pq->Ay, &pq->Ax); assert(ok); ok = star_coords(sB, pq->midAB, TRUE, &By, &Bx); assert(ok); ABx = Bx - pq->Ax; ABy = By - pq->Ay; invscale = 1.0 / (ABx*ABx + ABy*ABy); pq->costheta = (ABy + ABx) * invscale; pq->sintheta = (ABy - ABx) * invscale; //nabok++; } static int check_inbox(pquad_t* pq, int* inds, int ninds, double* stars) { int i, ind; double* starpos; double Dx=0, Dy=0; double ADx, ADy; double x, y; int destind = 0; anbool ok; for (i=0; i<ninds; i++) { double r; ind = inds[i]; starpos = stars + ind*3; ok = star_coords(starpos, pq->midAB, TRUE, &Dy, &Dx); if (!ok) continue; ADx = Dx - pq->Ax; ADy = Dy - pq->Ay; x = ADx * pq->costheta + ADy * pq->sintheta; y = -ADx * pq->sintheta + ADy * pq->costheta; // make sure it's in the circle centered at (0.5, 0.5)... // (x-1/2)^2 + (y-1/2)^2 <= r^2 // x^2-x+1/4 + y^2-y+1/4 <= (1/sqrt(2))^2 // x^2-x + y^2-y + 1/2 <= 1/2 // x^2-x + y^2-y <= 0 r = (x*x - x) + (y*y - y); if (r > 0.0) continue; inds[destind] = ind; destind++; } return destind; } /** inbox, ninbox: the stars we have to work with. starinds: the star identifiers (indexed by the contents of 'inbox') - ie, starinds[inbox[0]] is an externally-recognized star identifier. q: where we record the star identifiers starnum: which star we're adding: eg, A=0, B=1, C=2, ... dimquads-1. beginning: the first index in "inbox" to assign to star 'starnum'. */ static void add_interior_stars(quadbuilder_t* qb, int ninbox, int* inbox, quad* q, int starnum, int dimquads, int beginning) { int i; for (i=beginning; i<ninbox; i++) { int iC = inbox[i]; q->star[starnum] = qb->starinds[iC]; // Did we just add the last star? if (starnum == dimquads-1) { if (qb->check_full_quad && !qb->check_full_quad(qb, q->star, dimquads, qb->check_full_quad_token)) continue; qb->add_quad(qb, q->star, qb->add_quad_token); } else { if (qb->check_partial_quad && !qb->check_partial_quad(qb, q->star, starnum+1, qb->check_partial_quad_token)) continue; // Recurse. add_interior_stars(qb, ninbox, inbox, q, starnum+1, dimquads, i+1); } if (qb->stop_creating) return; } } quadbuilder_t* quadbuilder_init() { quadbuilder_t* qb = calloc(1, sizeof(quadbuilder_t)); return qb; } void quadbuilder_free(quadbuilder_t* qb) { free(qb->inbox); free(qb->pquads); free(qb); } int quadbuilder_create(quadbuilder_t* qb) { int iA=0, iB, iC, iD, newpoint; int ninbox; int i, j; int iAalloc; quad q; pquad_t* qb_pquads; // ensure the arrays are large enough... if (qb->Nstars > qb->Ncq) { // (free and malloc rather than realloc because we don't care about // the previous contents) free(qb->inbox); free(qb->pquads); qb->Ncq = qb->Nstars; qb->inbox = calloc(qb->Nstars, sizeof(int)); qb->pquads = calloc(qb->Nstars * qb->Nstars, sizeof(pquad_t)); if (!qb->inbox || !qb->pquads) { ERROR("quad-builder: failed to malloc qb->inbox or qb->pquads. Nstars=%i.\n", qb->Nstars); return -1; } } qb_pquads = qb->pquads; /* Each time through the "for" loop below, we consider a new star ("newpoint"). First, we try building all quads that have the new star on the diagonal (star B). Then, we try building all quads that have the star not on the diagonal (star D). Note that we keep the invariants iA < iB and iC < iD. */ memset(&q, 0, sizeof(quad)); for (newpoint=0; newpoint<qb->Nstars; newpoint++) { pquad_t* pq; // quads with the new star on the diagonal: iB = newpoint; for (iA = 0; iA < newpoint; iA++) { pq = qb_pquads + iA*qb->Nstars + iB; pq->inbox = NULL; pq->ninbox = 0; pq->iA = iA; pq->iB = iB; check_scale(qb, pq); if (!pq->scale_ok) continue; q.star[0] = pq->staridA; q.star[1] = pq->staridB; pq->check_ok = TRUE; if (qb->check_AB_stars) pq->check_ok = qb->check_AB_stars(qb, pq, qb->check_AB_stars_token); if (!pq->check_ok) continue; // list the possible internal stars... ninbox = 0; for (iC = 0; iC < newpoint; iC++) { if ((iC == iA) || (iC == iB)) continue; qb->inbox[ninbox] = iC; ninbox++; } // check which ones are inside the box... ninbox = check_inbox(pq, qb->inbox, ninbox, qb->starxyz); //if (!ninbox) //continue; if (ninbox && qb->check_internal_stars) ninbox = qb->check_internal_stars(qb, q.star[0], q.star[1], qb->inbox, ninbox, qb->check_internal_stars_token); //if (!ninbox) //continue; add_interior_stars(qb, ninbox, qb->inbox, &q, 2, qb->dimquads, 0); if (qb->stop_creating) goto theend; pq->inbox = malloc(qb->Nstars * sizeof(int)); if (!pq->inbox) { ERROR("hpquads: failed to malloc pq->inbox.\n"); exit(-1); } pq->ninbox = ninbox; memcpy(pq->inbox, qb->inbox, ninbox * sizeof(int)); debug("iA=%i, iB=%i: saved %i 'inbox' entries.\n", iA, iB, ninbox); } iAalloc = iA; // quads with the new star not on the diagonal: iD = newpoint; for (iA = 0; iA < newpoint; iA++) { for (iB = iA + 1; iB < newpoint; iB++) { pq = qb_pquads + iA*qb->Nstars + iB; if (!(pq->scale_ok && pq->check_ok)) continue; // check if this new star is in the box. qb->inbox[0] = iD; ninbox = check_inbox(pq, qb->inbox, 1, qb->starxyz); if (!ninbox) continue; if (qb->check_internal_stars) ninbox = qb->check_internal_stars(qb, q.star[0], q.star[1], qb->inbox, ninbox, qb->check_internal_stars_token); if (!ninbox) continue; pq->inbox[pq->ninbox] = iD; pq->ninbox++; q.star[0] = pq->staridA; q.star[1] = pq->staridB; add_interior_stars(qb, pq->ninbox, pq->inbox, &q, 2, qb->dimquads, 0); if (qb->stop_creating) { iA = iAalloc; goto theend; } } } } theend: for (i=0; i<imin(qb->Nstars, newpoint+1); i++) { int lim = (i == newpoint) ? iA : i; for (j=0; j<lim; j++) { pquad_t* pq = qb_pquads + j*qb->Nstars + i; free(pq->inbox); pq->inbox = NULL; } } return 0; } �����������������������������������������������astrometry.net-0.67/blind/quad-utils.c��������������������������������������������������������������000644 �000765 �000024 �00000006776 12651445460 020132� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include "quad-utils.h" #include "starutil.h" #include "codefile.h" #include "starkd.h" #include "errors.h" #include "log.h" void quad_compute_star_code(const double* starxyz, double* code, int dimquads) { double Ax=0, Ay=0; double Bx=0, By=0; double ABx, ABy; double scale, invscale; double costheta, sintheta; double midAB[3]; Unused anbool ok; int i; const double *sA, *sB; sA = starxyz; sB = starxyz + 3; star_midpoint(midAB, sA, sB); ok = star_coords(sA, midAB, TRUE, &Ay, &Ax); assert(ok); ok = star_coords(sB, midAB, TRUE, &By, &Bx); assert(ok); ABx = Bx - Ax; ABy = By - Ay; scale = (ABx * ABx) + (ABy * ABy); invscale = 1.0 / scale; costheta = (ABy + ABx) * invscale; sintheta = (ABy - ABx) * invscale; for (i=2; i<dimquads; i++) { const double* starpos; double Dx=0, Dy=0; double ADx, ADy; double x, y; starpos = starxyz + 3*i; ok = star_coords(starpos, midAB, TRUE, &Dy, &Dx); assert(ok); ADx = Dx - Ax; ADy = Dy - Ay; x = ADx * costheta + ADy * sintheta; y = -ADx * sintheta + ADy * costheta; code[2*(i-2)+0] = x; code[2*(i-2)+1] = y; } } void quad_flip_parity(const double* code, double* flipcode, int dimcode) { int i; // swap CX <-> CY, DX <-> DY. for (i=0; i<dimcode/2; i++) { // use tmp in code "code" == "flipcode" double tmp; tmp = code[2*i+1]; flipcode[2*i+1] = code[2*i+0]; flipcode[2*i+0] = tmp; } } int quad_compute_code(const unsigned int* quad, int dimquads, startree_t* starkd, double* code) { int i; double starxyz[3 * DQMAX]; for (i=0; i<dimquads; i++) { if (startree_get(starkd, quad[i], starxyz + 3*i)) { ERROR("Failed to get stars belonging to a quad.\n"); return -1; } } quad_compute_star_code(starxyz, code, dimquads); return 0; } anbool quad_obeys_invariants(unsigned int* quad, double* code, int dimquads, int dimcodes) { double sum; int i; // check the invariant that (cx + dx + ...) / (dimquads-2) <= 1/2 sum = 0.0; for (i=0; i<(dimquads-2); i++) sum += code[2*i]; sum /= (dimquads-2); if (sum > 0.5) return FALSE; // check the invariant that cx <= dx <= .... for (i=0; i<(dimquads-3); i++) if (code[2*i] > code[2*(i+1)]) return FALSE; return TRUE; } void quad_enforce_invariants(unsigned int* quad, double* code, int dimquads, int dimcodes) { double sum; int i; // here we add the invariant that (cx + dx + ...) / (dimquads-2) <= 1/2 sum = 0.0; for (i=0; i<dimcodes/2; i++) sum += code[2*i]; sum /= (dimcodes/2); if (sum > 0.5) { logdebug("Flipping code to ensure mean(x)<=0.5\n"); // swap the labels of A,B. int tmp = quad[0]; quad[0] = quad[1]; quad[1] = tmp; // rotate the code 180 degrees. for (i=0; i<dimcodes; i++) code[i] = 1.0 - code[i]; } // here we add the invariant that cx <= dx <= .... for (i=0; i<(dimquads-2); i++) { int j; int jsmallest; double smallest; double x1; double dtmp; int tmp; x1 = code[2*i]; jsmallest = -1; smallest = x1; for (j=i+1; j<(dimquads-2); j++) { double x2 = code[2*j]; if (x2 < smallest) { smallest = x2; jsmallest = j; } } if (jsmallest == -1) continue; j = jsmallest; // swap the labels. tmp = quad[i+2]; quad[i+2] = quad[j+2]; quad[j+2] = tmp; // swap the code values. dtmp = code[2*i]; code[2*i] = code[2*j]; code[2*j] = dtmp; dtmp = code[2*i+1]; code[2*i+1] = code[2*j+1]; code[2*j+1] = dtmp; } } ��astrometry.net-0.67/blind/quadcenters.c�������������������������������������������������������������000644 �000765 �000024 �00000007564 12651445460 020354� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <assert.h> #include "index.h" #include "quadfile.h" #include "kdtree.h" #include "starutil.h" #include "mathutil.h" #include "fitsioutils.h" #include "bl.h" #include "starkd.h" #include "boilerplate.h" #include "rdlist.h" #define OPTIONS "hr:R" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s\n" " -r <rdls-output-file>\n" " [-R]: add quad radius columns to the RDLS file.\n" " [-h]: help\n" " <base-name> [<base-name> ...]\n\n" "Reads index (.quad and .skdt or merged index) files.\n" "Writes an RDLS containing the quad centers (midpoints of AB), one field per input file.\n\n", progname); } int main(int argc, char** args) { int argchar; char* basename; char* outfn = NULL; index_t* index; quadfile* qf; rdlist_t* rdls; startree_t* skdt = NULL; anbool addradius = FALSE; int i; int radcolumn = -1; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'R': addradius = TRUE; break; case 'r': outfn = optarg; break; case 'h': print_help(args[0]); exit(0); } if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } rdls = rdlist_open_for_writing(outfn); if (!rdls) { fprintf(stderr, "Failed to open RDLS file %s for output.\n", outfn); exit(-1); } if (rdlist_write_primary_header(rdls)) { fprintf(stderr, "Failed to write RDLS header.\n"); exit(-1); } if (addradius) { radcolumn = rdlist_add_tagalong_column(rdls, fitscolumn_double_type(), 1, fitscolumn_double_type(), "QUADRADIUS", "deg"); } for (; optind<argc; optind++) { //int Nstars; int dimquads; basename = args[optind]; printf("Reading files with basename %s\n", basename); index = index_load(basename, 0, NULL); if (!index) { fprintf(stderr, "Failed to read index with base name \"%s\"\n", basename); exit(-1); } qf = index->quads; skdt = index->starkd; //Nstars = startree_N(skdt); if (rdlist_write_header(rdls)) { fprintf(stderr, "Failed to write new RDLS field header.\n"); exit(-1); } dimquads = quadfile_dimquads(qf); printf("Reading quads...\n"); for (i=0; i<qf->numquads; i++) { unsigned int stars[dimquads]; double axyz[3], bxyz[3]; double midab[3]; double radec[2]; if (!(i % 200000)) { printf("."); fflush(stdout); } quadfile_get_stars(qf, i, stars); startree_get(skdt, stars[0], axyz); startree_get(skdt, stars[1], bxyz); star_midpoint(midab, axyz, bxyz); xyzarr2radecdegarr(midab, radec); if (rdlist_write_one_radec(rdls, radec[0], radec[1])) { fprintf(stderr, "Failed to write a RA,Dec entry.\n"); exit(-1); } if (addradius) { double rad = arcsec2deg(distsq2arcsec(distsq(midab, axyz, 3))); if (rdlist_write_tagalong_column(rdls, radcolumn, i, 1, &rad, 0)) { fprintf(stderr, "Failed to write quad radius.\n"); exit(-1); } } } printf("\n"); index_close(index); if (rdlist_fix_header(rdls)) { fprintf(stderr, "Failed to fix RDLS field header.\n"); exit(-1); } rdlist_next_field(rdls); } if (rdlist_fix_primary_header(rdls) || rdlist_close(rdls)) { fprintf(stderr, "Failed to close RDLS file.\n"); exit(-1); } return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/quadidx.c�����������������������������������������������������������������000644 �000765 �000024 �00000011472 12651445460 017466� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Quadidx: create .qidx files from .quad files. A .quad file lists, for each quad, the stars comprising the quad. A .qidx file lists, for each star, the quads that star is a member of. Input: .quad Output: .qidx */ #include <string.h> #include "starutil.h" #include "quadfile.h" #include "qidxfile.h" #include "bl.h" #include "fitsioutils.h" #include "boilerplate.h" #include "log.h" #include "errors.h" static const char* OPTIONS = "hFi:o:cv"; static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s -i <quad input> -o <qidx output>\n" "\n" " [-c]: run quadfile_check()\n" " [-v]: add to verboseness\n" "\n", progname); } int main(int argc, char *argv[]) { char* progname = argv[0]; int argidx, argchar; char *idxfname = NULL; char *quadfname = NULL; il** quadlist; quadfile* quads; qidxfile* qidx; int q; int i; int numused; qfits_header* quadhdr; qfits_header* qidxhdr; int dimquads; anbool check = FALSE; int loglvl = LOG_MSG; if (argc <= 2) { printHelp(progname); exit(-1); } while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'c': check = TRUE; break; case 'v': loglvl++; break; case 'i': quadfname = optarg; break; case 'o': idxfname = optarg; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); exit(-1); default: return (OPT_ERR); } log_init(loglvl); if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); printHelp(progname); exit(-1); } logmsg("quadidx: indexing quads in \"%s\"...\n", quadfname); logmsg("will write to file \"%s\".\n", idxfname); quads = quadfile_open(quadfname); if (!quads) { ERROR("Couldn't open quads file \"%s\"", quadfname); exit(-1); } logmsg("%u quads, %u stars.\n", quads->numquads, quads->numstars); if (check) { logmsg("Running quadfile_check()...\n"); if (quadfile_check(quads)) { ERROR("quadfile_check() failed"); exit(-1); } logmsg("Check passed.\n"); } quadlist = calloc(quads->numstars, sizeof(il*)); if (!quadlist) { SYSERROR("Failed to allocate list of quad contents"); exit(-1); } dimquads = quadfile_dimquads(quads); for (q=0; q<quads->numquads; q++) { unsigned int inds[dimquads]; quadfile_get_stars(quads, q, inds); // append this quad index to the lists of each of its stars. for (i=0; i<dimquads; i++) { il* list; int starind = inds[i]; list = quadlist[starind]; // create the list if necessary if (!list) { list = il_new(10); quadlist[starind] = list; } il_append(list, q); } } // first count numused: // how many stars are members of quads. numused = 0; for (i=0; i<quads->numstars; i++) { il* list = quadlist[i]; if (!list) continue; numused++; } logmsg("%u stars used\n", numused); qidx = qidxfile_open_for_writing(idxfname, quads->numstars, quads->numquads); if (!qidx) { logmsg("Couldn't open outfile qidx file %s.\n", idxfname); exit(-1); } quadhdr = quadfile_get_header(quads); qidxhdr = qidxfile_get_header(qidx); an_fits_copy_header(quadhdr, qidxhdr, "INDEXID"); an_fits_copy_header(quadhdr, qidxhdr, "HEALPIX"); BOILERPLATE_ADD_FITS_HEADERS(qidxhdr); qfits_header_add(qidxhdr, "HISTORY", "This file was created by the program \"quadidx\".", NULL, NULL); qfits_header_add(qidxhdr, "HISTORY", "quadidx command line:", NULL, NULL); fits_add_args(qidxhdr, argv, argc); qfits_header_add(qidxhdr, "HISTORY", "(end of quadidx command line)", NULL, NULL); qfits_header_add(qidxhdr, "HISTORY", "** History entries copied from the input file:", NULL, NULL); fits_copy_all_headers(quadhdr, qidxhdr, "HISTORY"); qfits_header_add(qidxhdr, "HISTORY", "** End of history entries.", NULL, NULL); if (qidxfile_write_header(qidx)) { logmsg("Couldn't write qidx header (%s).\n", idxfname); exit(-1); } for (i=0; i<quads->numstars; i++) { int thisnumq; //int thisstar; int* stars; // bad variable name - list of quads this star is in. il* list = quadlist[i]; if (list) { thisnumq = (uint)il_size(list); stars = malloc(thisnumq * sizeof(uint)); il_copy(list, 0, thisnumq, (int*)stars); } else { thisnumq = 0; stars = NULL; } //thisstar = i; if (qidxfile_write_star(qidx, stars, thisnumq)) { logmsg("Couldn't write star to qidx file (%s).\n", idxfname); exit(-1); } if (list) { free(stars); il_free(list); quadlist[i] = NULL; } } free(quadlist); quadfile_close(quads); if (qidxfile_close(qidx)) { logmsg("Failed to close qidx file.\n"); exit(-1); } logmsg(" done.\n"); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/quadscales.c��������������������������������������������������������������000644 �000765 �000024 �00000006777 12651445460 020170� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <assert.h> #include "quadfile.h" #include "kdtree.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "histogram.h" #include "starkd.h" #include "boilerplate.h" #define OPTIONS "h" void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s\n" " [-h]: help\n" " [-n <number of histogram bins>] (default 100)\n" " <base-name> [<base-name> ...]\n\n" "Requires both skdt and quad files. Outputs Matlab literals.\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* basename; char* fn; quadfile* qf; startree_t* skdt = NULL; int i; int Nbins = 100; histogram* sumhist = NULL; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'n': Nbins = atoi(optarg); break; case 'h': print_help(args[0]); exit(0); } if (optind == argc) { print_help(args[0]); exit(-1); } for (; optind<argc; optind++) { int lastgrass = 0; histogram* hist; char fixed_basename[256]; int dimquads; basename = args[optind]; fprintf(stderr, "Reading files with basename %s\n", basename); snprintf(fixed_basename, 256, "%s", basename); for (i=0; i<strlen(fixed_basename); i++) { if (fixed_basename[i] == '-') fixed_basename[i] = '_'; } asprintf_safe(&fn, "%s.quad.fits", basename); fprintf(stderr, "Opening quad file %s...\n", fn); qf = quadfile_open(fn); if (!qf) { fprintf(stderr, "Failed to open quad file %s.\n", fn); continue; } free(fn); asprintf_safe(&fn, "%s.skdt.fits", basename); fprintf(stderr, "Opening skdt file %s...\n", fn); skdt = startree_open(fn); if (!skdt) { fprintf(stderr, "Failed to read star kdtree %s.\n", fn); continue; } free(fn); hist = histogram_new_nbins(qf->index_scale_lower, qf->index_scale_upper, Nbins); if (!sumhist) sumhist = histogram_new_nbins(qf->index_scale_lower, qf->index_scale_upper, Nbins); else { if ((sumhist->min != hist->min) || (sumhist->binsize != hist->binsize)) fprintf(stderr, "Warning, the sum-total histogram's range doesn't match this index's range.\n"); } fprintf(stderr, "Reading %i quads...\n", qf->numquads); dimquads = quadfile_dimquads(qf); assert(dimquads >= 2); for (i=0; i<qf->numquads; i++) { unsigned int stars[dimquads]; int grass; double xyzA[3]; double xyzB[3]; int A, B; double rad; grass = (i * 80 / qf->numquads); if (grass != lastgrass) { fprintf(stderr, "."); fflush(stderr); lastgrass = grass; } quadfile_get_stars(qf, i, stars); A = stars[0]; B = stars[1]; startree_get(skdt, A, xyzA); startree_get(skdt, B, xyzB); rad = distsq2arc(distsq(xyzA, xyzB, 3)); histogram_add(hist, rad); histogram_add(sumhist, rad); } fprintf(stderr, "\n"); printf("%s = ", fixed_basename); histogram_print_matlab(hist, stdout); printf(";\n"); printf("%s_bins = ", fixed_basename); histogram_print_matlab_bin_centers(hist, stdout); printf(";\n"); histogram_free(hist); startree_close(skdt); quadfile_close(qf); } printf("qs_sum = "); histogram_print_matlab(sumhist, stdout); printf(";\n"); printf("qs_sum_bins = "); histogram_print_matlab_bin_centers(sumhist, stdout); printf(";\n"); histogram_free(sumhist); return 0; } �astrometry.net-0.67/blind/quadsperstar.c������������������������������������������������������������000644 �000765 �000024 �00000004023 12651445460 020537� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <libgen.h> #include "ioutils.h" #include "qidxfile.h" #define OPTIONS "h" void print_help(char* progname) { fprintf(stderr, "Usage: %s\n" " [-h]: help\n" " <base-name> [<base-name> ...]\n\n", progname); } static Inline void ensure_hist_size(unsigned int** hist, unsigned int* size, unsigned int newsize) { if (newsize <= *size) return; *hist = realloc(*hist, newsize*sizeof(unsigned int)); memset((*hist) + (*size), 0, (newsize - *size) * sizeof(unsigned int)); *size = newsize; } int main(int argc, char** args) { int argchar; char* basefn; qidxfile* qf; unsigned int* sumhist = NULL; unsigned int Nsumhist = 0; unsigned int i; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'h': print_help(args[0]); exit(0); } if (optind == argc) { print_help(args[0]); exit(-1); } for (; optind<argc; optind++) { uint32_t* quads; int nquads; unsigned int* hist = NULL; unsigned int Nhist = 0; char* fn; basefn = args[optind]; asprintf_safe(&fn, "%s.qidx.fits", basefn); fprintf(stderr, "Reading qidx from %s...\n", fn); fflush(stderr); qf = qidxfile_open(fn); if (!qf) { fprintf(stderr, "Couldn't read qidx from %s.\n", fn); exit(-1); } fprintf(stderr, "Reading %i stars from %s...\n", qf->numstars, fn); fflush(stderr); free(fn); for (i=0; i<qf->numstars; i++) { qidxfile_get_quads(qf, i, &quads, &nquads); ensure_hist_size(&hist, &Nhist, nquads+1); hist[nquads]++; } qidxfile_close(qf); printf("%s = [ ", basename(basefn)); for (i=0; i<Nhist; i++) printf("%i, ", hist[i]); printf("];\n"); ensure_hist_size(&sumhist, &Nsumhist, Nhist); for (i=0; i<Nhist; i++) sumhist[i] += hist[i]; free(hist); } printf("sum = [ "); for (i=0; i<Nsumhist; i++) printf("%i, ", sumhist[i]); printf("];\n"); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/randcat.c�����������������������������������������������������������������000644 �000765 �000024 �00000004437 12651445460 017446� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "starutil.h" #include "catalog.h" #define OPTIONS "hn:f:r:R:d:D:S:" const char HelpString[] = "randcat -f fname -n numstars [-r/R RAmin/max] [-d/D DECmin/max]\n" " -r -R -d -D set ra and dec limits in radians\n"; int RANDSEED = 999; int main(int argc, char *argv[]) { int argidx, argchar; int numstars = 10; char *fname = NULL; double ramin = DEFAULT_RAMIN, ramax = DEFAULT_RAMAX; double decmin = DEFAULT_DECMIN, decmax = DEFAULT_DECMAX; int i; catalog* cat; if (argc <= 4) { fprintf(stderr, HelpString); return (OPT_ERR); } while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'S': RANDSEED = atoi(optarg); break; case 'n': numstars = strtoul(optarg, NULL, 0); break; case 'r': ramin = strtod(optarg, NULL); break; case 'R': ramax = strtod(optarg, NULL); break; case 'd': decmin = strtod(optarg, NULL); break; case 'D': decmax = strtod(optarg, NULL); break; case 'f': fname = mk_catfn(optarg); break; case '?': fprintf (stderr, "Unknown option `-%c'.\n", optopt); case 'h': fprintf(stderr, HelpString); return (HELP_ERR); default: return (OPT_ERR); } if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); fprintf(stderr, HelpString); return (OPT_ERR); } srand(RANDSEED); fprintf(stderr, "randcat: Making %u random stars\n", numstars); fprintf(stderr, "[RANDSEED=%d]\n", RANDSEED); if (ramin > DEFAULT_RAMIN || ramax < DEFAULT_RAMAX || decmin > DEFAULT_DECMIN || decmax < DEFAULT_DECMAX) fprintf(stderr, " using limits %f<=RA<=%f ; %f<=DEC<=%f deg.\n", rad2deg(ramin), rad2deg(ramax), rad2deg(decmin), rad2deg(decmax)); cat = catalog_open_for_writing(fname); for (i=0; i <numstars; i++) { double star[DIM_STARS]; make_rand_star(star, ramin, ramax, decmin, decmax); if (catalog_write_star(cat, star)) { fprintf(stderr, "Failed to write star %i.\n", i); exit(-1); } } //catalog_compute_radecminmax(&cat); if (catalog_close(cat)) { fprintf(stderr, "Failed to write catalog.\n"); exit(-1); } return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/rdls2hpls.c���������������������������������������������������������������000644 �000765 �000024 �00000004036 12651445460 017742� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include "healpix.h" #include "starutil.h" #include "rdlist.h" int convert_file(char* infn, char* outfn) { int i, j, numfields, npoints, healpixes[12]; FILE* hpf; rdlist* rdls; fprintf(stderr, "Reading input from RDLS file %s, writing output to HPLS file %s.\n", infn, outfn); // Open the two files for input and output rdls = rdlist_open(infn); if (!rdls) { fprintf(stderr, "Couldn't open RDLS %s.\n", infn); return 1; } hpf = fopen(outfn, "w"); if (!hpf) { fprintf(stderr, "Couldn't open %s for writing: %s\n", outfn, strerror(errno)); return 1; } // First line: numfields numfields = rdlist_n_fields(rdls); fprintf(hpf, "NumFields=%i\n", numfields); for (j=1; j<=numfields; j++) { int first = 1; // Second line and subsequent lines: npoints,ra,dec,ra,dec,... dl* points = rdlist_get_field(rdls, j); if (!points) { fprintf(stderr, "Failed to read RDLS field %i.\n", j); return 1; } for (i = 0; i < 12; i++) { healpixes[i] = 0; } npoints = dl_size(points) / 2; for (i = 0; i < npoints; i++) { double ra, dec; int hp; ra = dl_get(points, i*2); dec = dl_get(points, i*2 + 1); ra=deg2rad(ra); dec=deg2rad(dec); hp = radectohealpix(ra, dec, 1); if ((hp < 0) || (hp >= 12)) { printf("ERROR: hp=%i\n", hp); exit(-1); } healpixes[hp] = 1; } for (i = 0; i < 12; i++) { if (healpixes[i]) { if (!first) fprintf(hpf, " "); fprintf(hpf, "%i", i); first = 0; } } fprintf(hpf, "\n"); fflush(hpf); dl_free(points); } rdlist_close(rdls); fclose(hpf); return 0; } int main(int argc, char** args) { int i; if (argc == 1 || !(argc % 2)) { fprintf(stderr, "Usage: %s <input-rdls-file> <output-hpls-file> [...]\n", args[0]); return 1; } for (i=1; i+1<argc; i+=2) convert_file(args[i], args[i+1]); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/rdlstohealpix.c�����������������������������������������������������������000644 �000765 �000024 �00000005351 12651445460 020710� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include "healpix.h" #include "starutil.h" #include "rdlist.h" #include "bl.h" char* OPTIONS = "hqf:N:"; void printHelp(char* progname) { fprintf(stderr, "Usage: %s [options]\n" " -f <rdls-file>\n" " [-N nside] (default 1)\n" " [-h] print help msg\n" " [-q] quiet mode\n", progname); } int main(int argc, char** args) { char* filename = NULL; int npoints; int i, j; int* healpixes; int argchar; char* progname = args[0]; il** lists; anbool quiet = FALSE; rdlist* rdls; int Nside = 1; int N; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'N': Nside = atoi(optarg); break; case 'f': filename = optarg; break; case 'h': printHelp(progname); exit(0); case 'q': quiet = TRUE; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); default: exit(-1); } if (!filename) { printHelp(progname); exit(-1); } fprintf(stderr, "Opening RDLS file %s...\n", filename); rdls = rdlist_open(filename); if (!rdls) { fprintf(stderr, "Failed to open RDLS file.\n"); exit(-1); } N = 12 * Nside * Nside; healpixes = malloc(N * sizeof(int)); lists = calloc(N, sizeof(il*)); /* for (i=0; i<N; i++) { lists[i] = il_new(256); } */ for (j=1; j<=rdls_n_fields(rdls); j++) { rd* points; points = rdlist_get_field(rdls, j); if (!points) { fprintf(stderr, "error reading field %i\n", j); break; } memset(healpixes, 0, N * sizeof(int)); npoints = rd_size(points); for (i=0; i<npoints; i++) { double ra, dec; int hp; ra = deg2rad(rd_refra (points, i)); dec = deg2rad(rd_refdec(points, i)); if (Nside > 1) hp = radectohealpix_nside(ra, dec, Nside); else hp = radectohealpix(ra, dec); if ((hp < 0) || (hp >= N)) { printf("hp=%i\n", hp); continue; } healpixes[hp] = 1; } if (!quiet) { printf("Field %i: healpixes ", j); for (i=0; i<N; i++) { if (healpixes[i]) printf("%i ", i); } printf("\n"); fflush(stdout); } for (i=0; i<N; i++) if (healpixes[i]) { if (!lists[i]) lists[i] = il_new(256); il_append(lists[i], j); } free_rd(points); } for (i=0; i<N; i++) { int N; if (!lists[i]) continue; printf("HP %i: ", i); N = il_size(lists[i]); for (j=0; j<N; j++) printf("%i ", il_get(lists[i], j)); il_free(lists[i]); printf("\n"); } free(lists); free(healpixes); rdlist_close(rdls); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/resort-xylist-main.c������������������������������������������������������000644 �000765 �000024 �00000003324 12651445460 021616� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <assert.h> #include "an-bool.h" #include "resort-xylist.h" #include "fitsioutils.h" #include "errors.h" #include "log.h" const char* OPTIONS = "hdf:b:v"; static void printHelp(char* progname) { printf("Usage: %s <input> <output>\n" " -f <flux-column-name> (default: FLUX) \n" " -b <background-column-name> (default: BACKGROUND)\n" " [-d]: sort in descending order (default is ascending)\n" " [-v]: add verboseness.\n" "\n", progname); } int main(int argc, char** args) { int argchar; char* infn = NULL; char* outfn = NULL; char* progname = args[0]; char* fluxcol = NULL; char* backcol = NULL; anbool ascending = TRUE; int loglvl = LOG_MSG; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'f': fluxcol = optarg; break; case 'b': backcol = optarg; break; case 'd': ascending = FALSE; break; case 'v': loglvl++; break; case '?': case 'h': printHelp(progname); return 0; default: return -1; } log_init(loglvl); if (optind != argc-2) { printHelp(progname); exit(-1); } infn = args[optind]; outfn = args[optind+1]; fits_use_error_system(); if (resort_xylist(infn, outfn, fluxcol, backcol, ascending)) { ERROR("Failed to re-sorting xylist by FLUX and BACKGROUND"); exit(-1); } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/resort-xylist.c�����������������������������������������������������������000644 �000765 �000024 �00000012426 12651445460 020677� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <assert.h> // DEBUG #include <sys/mman.h> #include "anqfits.h" #include "ioutils.h" #include "fitsioutils.h" #include "permutedsort.h" #include "an-bool.h" #include "fitstable.h" #include "errors.h" #include "log.h" #include "an-bool.h" int resort_xylist(const char* infn, const char* outfn, const char* fluxcol, const char* backcol, int ascending) { FILE* fin = NULL; FILE* fout = NULL; double *flux = NULL, *back = NULL; int *perm1 = NULL, *perm2 = NULL; anbool *used = NULL; int start, size, nextens, ext; int (*compare)(const void*, const void*); fitstable_t* tab = NULL; anqfits_t* anq = NULL; if (ascending) compare = compare_doubles_asc; else compare = compare_doubles_desc; if (!fluxcol) fluxcol = "FLUX"; if (!backcol) backcol = "BACKGROUND"; fin = fopen(infn, "rb"); if (!fin) { SYSERROR("Failed to open input file %s", infn); return -1; } fout = fopen(outfn, "wb"); if (!fout) { SYSERROR("Failed to open output file %s", outfn); goto bailout; } // copy the main header exactly. anq = anqfits_open(infn); if (!anq) { ERROR("Failed to open file \"%s\"", infn); goto bailout; } start = anqfits_header_start(anq, 0); size = anqfits_header_size (anq, 0); if (pipe_file_offset(fin, start, size, fout)) { ERROR("Failed to copy primary FITS header."); goto bailout; } nextens = anqfits_n_ext(anq); tab = fitstable_open(infn); if (!tab) { ERROR("Failed to open FITS table in file %s", infn); goto bailout; } for (ext=1; ext<nextens; ext++) { int hdrstart, hdrsize, datstart; int i, N; int rowsize; hdrstart = anqfits_header_start(anq, ext); hdrsize = anqfits_header_size (anq, ext); datstart = anqfits_data_start (anq, ext); if (!anqfits_is_table(anq, ext)) { ERROR("Extension %i isn't a table. Skipping", ext); continue; } // Copy the header as-is. if (pipe_file_offset(fin, hdrstart, hdrsize, fout)) { ERROR("Failed to copy the header of extension %i", ext); goto bailout; } if (fitstable_read_extension(tab, ext)) { ERROR("Failed to read FITS table from extension %i", ext); goto bailout; } rowsize = fitstable_row_size(tab); // read FLUX column as doubles. flux = fitstable_read_column(tab, fluxcol, TFITS_BIN_TYPE_D); if (!flux) { ERROR("Failed to read FLUX column from extension %i", ext); goto bailout; } // BACKGROUND back = fitstable_read_column(tab, backcol, TFITS_BIN_TYPE_D); if (!back) { ERROR("Failed to read BACKGROUND column from extension %i", ext); goto bailout; } N = fitstable_nrows(tab); debug("First rows of input table:\n"); for (i=0; i<MIN(10, N); i++) debug("flux %g, background %g\n", flux[i], back[i]); // set back = flux + back (ie, non-background-subtracted flux) for (i=0; i<N; i++) back[i] += flux[i]; // Sort by flux... perm1 = permuted_sort(flux, sizeof(double), compare, NULL, N); // Sort by non-background-subtracted flux... perm2 = permuted_sort(back, sizeof(double), compare, NULL, N); used = malloc(N * sizeof(anbool)); memset(used, 0, N * sizeof(anbool)); // Check sort... for (i=0; i<N-1; i++) { if (ascending) { assert(flux[perm1[i]] <= flux[perm1[i+1]]); assert(back[perm2[i]] <= back[perm2[i+1]]); } else { assert(flux[perm1[i]] >= flux[perm1[i+1]]); assert(back[perm2[i]] >= back[perm2[i+1]]); } } for (i=0; i<N; i++) { int j; int inds[] = { perm1[i], perm2[i] }; for (j=0; j<2; j++) { int index = inds[j]; assert(index < N); if (used[index]) continue; used[index] = TRUE; debug("adding index %i: %s %g\n", index, j==0 ? "flux" : "bgsub", j==0 ? flux[index] : back[index]); if (pipe_file_offset(fin, datstart + index * rowsize, rowsize, fout)) { ERROR("Failed to copy row %i", index); goto bailout; } } } for (i=0; i<N; i++) assert(used[i]); if (fits_pad_file(fout)) { ERROR("Failed to add padding to extension %i", ext); goto bailout; } free(flux); flux = NULL; free(back); back = NULL; free(perm1); perm1 = NULL; free(perm2); perm2 = NULL; free(used); used = NULL; } fitstable_close(tab); tab = NULL; if (fclose(fout)) { SYSERROR("Failed to close output file %s", outfn); return -1; } fclose(fin); return 0; bailout: if (tab) fitstable_close(tab); if (fout) fclose(fout); if (fin) fclose(fin); free(flux); free(back); free(perm1); free(perm2); free(used); return -1; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/setsolved.c���������������������������������������������������������������000644 �000765 �000024 �00000001110 12651445460 020023� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <unistd.h> #include "solvedfile.h" int main(int argc, char** args) { int field = 1; char* fn; if (argc < 2) { printf("%s <solved-file>\n", args[0]); exit(-1); } fn = args[1]; printf("Field %i solved: %s\n", field, solvedfile_get(fn, field) ? "yes" : "no"); printf("Setting solved.\n"); solvedfile_set(fn, field); printf("Field %i solved: %s\n", field, solvedfile_get(fn, field) ? "yes" : "no"); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/setup-blind.py������������������������������������������������������������000644 �000765 �000024 �00000003134 12651445460 020457� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import sys # add .. to pythonpath path = os.path.abspath(__file__) sys.path.append(os.path.dirname(os.path.dirname(path))) #from an_build_ext import * from distutils.core import setup, Extension from numpy.distutils.misc_util import get_numpy_include_dirs #from setuputils import * numpy_inc = get_numpy_include_dirs() def strlist(s, split=' '): lst = s.split(split) lst = [i.strip() for i in lst] lst = [i for i in lst if len(i)] return lst link = ' '.join([os.environ.get('LDFLAGS', ''), os.environ.get('LDLIBS', ''),]) link = strlist(link) objs = strlist(os.environ.get('SLIB', '')) inc = strlist(os.environ.get('INC', ''), split='-I') cflags = strlist(os.environ.get('CFLAGS', '')) print 'link:', link print 'objs:', objs print 'inc:', inc print 'cflags:', cflags c_swig_module = Extension('_blind', sources = ['blind.i'], include_dirs = numpy_inc + inc + ['.'], extra_objects = objs, extra_compile_args = cflags, extra_link_args=link, depends=objs, swig_opts=['-I'+d for d in inc] + cflags, ) setup(#cmdclass={'build_ext': an_build_ext}, name = 'Access to Astrometry.net blind/ in python', version = '1.0', description = '', author = 'Astrometry.net (Dustin Lang)', author_email = 'dstndstn@gmail.com', url = 'http://astrometry.net', py_modules = [ 'blind' ], ext_modules = [c_swig_module]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/setup.py������������������������������������������������������������������000644 �000765 �000024 �00000004555 12651445460 017401� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import os import sys # add .. to pythonpath path = os.path.abspath(__file__) dotdot = os.path.dirname(os.path.dirname(path)) sys.path.append(dotdot) # add ../util sys.path.append(os.path.join(dotdot, 'util')) from an_build_ext import an_build_ext from setuputils import * from distutils.core import setup, Extension import numpy numpy_inc = numpy.get_include() def strlist(s, split=' '): lst = s.split(split) lst = [i.strip() for i in lst] lst = [i for i in lst if len(i)] return lst link = ' '.join([os.environ.get('LDFLAGS', ''), os.environ.get('LDLIBS', ''),]) link = strlist(link) objs = strlist(os.environ.get('SLIB', '')) inc = strlist(os.environ.get('INC', ''), split='-I') inc.append('../util') # for util.i cflags_swig = strlist(os.environ.get('CFLAGS_SWIG', '')) cflags = strlist(os.environ.get('CFLAGS', '')) print 'link:', link print 'objs:', objs print 'inc:', inc print 'cflags:', cflags_swig + cflags objs = [ 'plotfill.o', 'plotxy.o', 'plotimage.o', 'plotannotations.o', 'plotgrid.o', 'plotoutline.o', 'plotindex.o', 'plotradec.o', 'plothealpix.o', 'plotmatch.o', 'matchfile.o', 'matchobj.o', 'plotstuff.o', ] + objs c_module = Extension('_plotstuff_c', sources = [ 'plotstuff.i', #'plotstuff.c', 'plotfill.c', 'plotxy.c', #'plotimage.c', 'plotannotations.c', #'plotgrid.c', 'plotoutline.c', 'plotindex.c', #'plotradec.c', 'plothealpix.c', 'plotmatch.c', #'matchfile.c', 'matchobj.c', ], include_dirs = [numpy_inc] + inc, depends = objs, extra_objects = objs, extra_compile_args = cflags_swig + cflags, extra_link_args=link, swig_opts=['-I'+d for d in inc] + cflags_swig, ) setup(cmdclass={'build_ext': an_build_ext}, name = 'Plotting stuff in python', version = '1.0', description = 'Just what you need, another plotting package!', author = 'Astrometry.net (Dustin Lang)', author_email = 'dstn@astro.princeton.edu', url = 'http://astrometry.net', py_modules = [ 'plotstuff' ], ext_modules = [c_module]) ���������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/solve-field.c�������������������������������������������������������������000644 �000765 �000024 �00000117075 12651445460 020246� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** A command-line interface to the blind solver system. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <unistd.h> #include <libgen.h> #include <errors.h> #include <getopt.h> #include <assert.h> #include "boilerplate.h" #include "an-bool.h" #include "bl.h" #include "ioutils.h" #include "fileutils.h" #include "xylist.h" #include "matchfile.h" #include "fitsioutils.h" #include "augment-xylist.h" #include "an-opts.h" #include "log.h" #include "errors.h" #include "anqfits.h" #include "sip_qfits.h" #include "sip-utils.h" #include "wcs-rd2xy.h" #include "new-wcs.h" #include "scamp.h" static an_option_t options[] = { {'h', "help", no_argument, NULL, "print this help message" }, {'v', "verbose", no_argument, NULL, "be more chatty -- repeat for even more verboseness" }, {'D', "dir", required_argument, "directory", "place all output files in the specified directory"}, {'o', "out", required_argument, "base-filename", "name the output files with this base name"}, // DEPRECATED {'b', "backend-config", required_argument, "filename", "use this config file for the \"astrometry-engine\" program"}, {'\x89', "config", required_argument, "filename", "use this config file for the \"astrometry-engine\" program"}, {'(', "batch", no_argument, NULL, "run astrometry-engine once, rather than once per input file"}, {'f', "files-on-stdin", no_argument, NULL, "read filenames to solve on stdin, one per line"}, {'p', "no-plots", no_argument, NULL, "don't create any plots of the results"}, {'\x84', "plot-scale", required_argument, "scale", "scale the plots by this factor (eg, 0.25)"}, {'\x85', "plot-bg", required_argument, "filename (JPEG)", //.jpg, .jpeg, .ppm, .pnm, .png)", "set the background image to use for plots"}, {'G', "use-wget", no_argument, NULL, "use wget instead of curl"}, {'O', "overwrite", no_argument, NULL, "overwrite output files if they already exist"}, {'K', "continue", no_argument, NULL, "don't overwrite output files if they already exist; continue a previous run"}, {'J', "skip-solved", no_argument, NULL, "skip input files for which the 'solved' output file already exists;" " NOTE: this assumes single-field input files"}, {'\x87', "fits-image", no_argument, NULL, "assume the input files are FITS images"}, {'N', "new-fits", required_argument, "filename", "output filename of the new FITS file containing the WCS header; \"none\" to not create this file"}, {'Z', "kmz", required_argument, "filename", "create KMZ file for Google Sky. (requires wcs2kml)"}, {'i', "scamp", required_argument, "filename", "create image object catalog for SCAMP"}, {'n', "scamp-config", required_argument, "filename", "create SCAMP config file snippet"}, {'U', "index-xyls", required_argument, "filename", "output filename for xylist containing the image coordinate of stars from the index"}, {'@', "just-augment", no_argument, NULL, "just write the augmented xylist files; don't run astrometry-engine."}, {'\x91', "axy", required_argument, "filename", "output filename for augment xy list (axy)"}, {'\x90', "temp-axy", no_argument, NULL, "write 'augmented xy list' (axy) file to a temp file"}, {'\x88', "timestamp", no_argument, NULL, "add timestamps to log messages"}, }; static void print_help(const char* progname, bl* opts) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] [<image-file-1> <image-file-2> ...] [<xyls-file-1> <xyls-file-2> ...]\n" "\n" "You can specify http:// or ftp:// URLs instead of filenames. The \"wget\" or \"curl\" program will be used to retrieve the URL.\n" "\n", progname); printf("Options include:\n"); opts_print_help(opts, stdout, augment_xylist_print_special_opts, NULL); printf("\n"); printf("Note that most output files can be disabled by setting the filename to \"none\".\n" " (If you have a sick sense of humour and you really want to name your output\n" " file \"none\", you can use \"./none\" instead.)\n"); printf("\n\n"); } static int run_command(const char* cmd, anbool* ctrlc) { int rtn; logverb("Running: %s\n", cmd); fflush(NULL); rtn = system(cmd); fflush(NULL); if (rtn == -1) { SYSERROR("Failed to run command \"%s\"", cmd); return -1; } if (WIFSIGNALED(rtn)) { if (ctrlc && (WTERMSIG(rtn) == SIGTERM)) *ctrlc = TRUE; return -1; } rtn = WEXITSTATUS(rtn); if (rtn) { ERROR("Command exited with exit status %i", rtn); ERROR("Command was: \"%s\"\n", cmd); } return rtn; } static void append_escape(sl* list, const char* fn) { sl_append_nocopy(list, shell_escape(fn)); } static void appendf_escape(sl* list, const char* fmt, const char* fn) { char* esc = shell_escape(fn); sl_appendf(list, fmt, esc); free(esc); } static void append_executable(sl* list, const char* fn, const char* me) { char* exec = find_executable(fn, me); if (!exec) { ERROR("Error, couldn't find executable \"%s\"", fn); exit(-1); } sl_append_nocopy(list, shell_escape(exec)); free(exec); } static int write_kmz(const augment_xylist_t* axy, const char* kmzfn, const char* tempdir, sl* tempdirs, sl* tempfiles) { char* pngfn = NULL; char* kmlfn = NULL; char* warpedpngfn = NULL; char* basekmlfn = NULL; char* basewarpedpngfn = NULL; char* tmpdir; char* cmd = NULL; sl* cmdline = sl_new(16); char* wcsbase = NULL; tmpdir = create_temp_dir("kmz", tempdir); if (!tmpdir) { ERROR("Failed to create temp dir for KMZ output"); sl_free2(cmdline); return -1; } sl_append_nocopy(tempdirs, tmpdir); pngfn = create_temp_file("png", tempdir); sl_append_nocopy(tempfiles, pngfn); sl_append(cmdline, "pnmtopng"); append_escape(cmdline, axy->pnmfn); sl_append(cmdline, ">"); append_escape(cmdline, pngfn); // run it cmd = sl_implode(cmdline, " "); sl_remove_all(cmdline); logverb("Running:\n %s\n", cmd); if (run_command_get_outputs(cmd, NULL, NULL)) { ERROR("pnmtopng failed"); free(cmd); sl_free2(cmdline); return -1; } free(cmd); basekmlfn = "doc.kml"; basewarpedpngfn = "warped.png"; kmlfn = sl_appendf(tempfiles, "%s/%s", tmpdir, basekmlfn); warpedpngfn = sl_appendf(tempfiles, "%s/%s", tmpdir, basewarpedpngfn); // delete the wcs we create with "cp" below. assert(axy->wcsfn); wcsbase = basename_safe(axy->wcsfn); sl_appendf(tempfiles, "%s/%s", tmpdir, wcsbase); free(wcsbase); logverb("Trying to run wcs2kml to generate KMZ output.\n"); sl_appendf(cmdline, "cp %s %s; cd %s; ", axy->wcsfn, tmpdir, tmpdir); sl_append(cmdline, "wcs2kml"); // FIXME - if parity? sl_append(cmdline, "--input_image_origin_is_upper_left"); appendf_escape(cmdline, "--fitsfile=%s", axy->wcsfn); appendf_escape(cmdline, "--imagefile=%s", pngfn); appendf_escape(cmdline, "--kmlfile=%s", basekmlfn); appendf_escape(cmdline, "--outfile=%s", basewarpedpngfn); // run it cmd = sl_implode(cmdline, " "); sl_remove_all(cmdline); logverb("Running:\n %s\n", cmd); if (run_command_get_outputs(cmd, NULL, NULL)) { ERROR("wcs2kml failed"); free(cmd); sl_free2(cmdline); return -1; } free(cmd); sl_append(cmdline, "zip"); sl_append(cmdline, "-j"); // no paths, just filenames //if (!verbose) //sl_append(cmdline, "-q"); // pipe to stdout, because zip likes to add ".zip" to the // output filename, and provides no way to turn off this // behaviour. sl_append(cmdline, "-"); appendf_escape(cmdline, "%s", warpedpngfn); appendf_escape(cmdline, "%s", kmlfn); sl_append(cmdline, ">"); append_escape(cmdline, kmzfn); // run it cmd = sl_implode(cmdline, " "); sl_remove_all(cmdline); logverb("Running:\n %s\n", cmd); if (run_command_get_outputs(cmd, NULL, NULL)) { ERROR("zip failed"); free(cmd); sl_free2(cmdline); return -1; } free(cmd); sl_free2(cmdline); return 0; } static int plot_source_overlay(augment_xylist_t* axy, const char* me, const char* objsfn, double plotscale, const char* bgfn) { // plotxy -i harvard.axy -I /tmp/pnm -C red -P -w 2 -N 50 | plotxy -w 2 -r 3 -I - -i harvard.axy -C red -n 50 > harvard-objs.png sl* cmdline = sl_new(16); char* cmd; anbool ctrlc; char* imgfn; if (bgfn) { append_executable(cmdline, "jpegtopnm", me); append_escape(cmdline, bgfn); sl_append(cmdline, "|"); imgfn = "-"; } else { imgfn = axy->pnmfn; if (axy->imagefn && plotscale != 1.0) { append_executable(cmdline, "pnmscale", me); sl_appendf(cmdline, "%f", plotscale); append_escape(cmdline, axy->pnmfn); sl_append(cmdline, "|"); imgfn = "-"; } } append_executable(cmdline, "plotxy", me); if (imgfn) { sl_append(cmdline, "-I"); append_escape(cmdline, imgfn); } else { sl_appendf(cmdline, "-W %i -H %i", (int)(plotscale * axy->W), (int)(plotscale * axy->H)); } sl_append(cmdline, "-i"); append_escape(cmdline, axy->axyfn); if (axy->xcol) { sl_append(cmdline, "-X"); append_escape(cmdline, axy->xcol); } if (axy->ycol) { sl_append(cmdline, "-Y"); append_escape(cmdline, axy->ycol); } if (plotscale != 1.0) { sl_append(cmdline, "-S"); sl_appendf(cmdline, "%f", plotscale); } sl_append(cmdline, "-C red -w 2 -N 50 -x 1 -y 1"); sl_append(cmdline, "-P"); sl_append(cmdline, "|"); append_executable(cmdline, "plotxy", me); sl_append(cmdline, "-i"); append_escape(cmdline, axy->axyfn); if (axy->xcol) { sl_append(cmdline, "-X"); append_escape(cmdline, axy->xcol); } if (axy->ycol) { sl_append(cmdline, "-Y"); append_escape(cmdline, axy->ycol); } sl_append(cmdline, "-I - -w 2 -r 3 -C red -n 50 -N 200 -x 1 -y 1"); if (plotscale != 1.0) { sl_append(cmdline, "-S"); sl_appendf(cmdline, "%f", plotscale); } sl_append(cmdline, ">"); append_escape(cmdline, objsfn); cmd = sl_implode(cmdline, " "); sl_free2(cmdline); if (run_command(cmd, &ctrlc)) { ERROR("Plotting command %s", (ctrlc ? "was cancelled" : "failed")); if (!ctrlc) { errors_print_stack(stdout); errors_clear_stack(); } free(cmd); return -1; } free(cmd); return 0; } static int plot_index_overlay(augment_xylist_t* axy, const char* me, const char* indxylsfn, const char* redgreenfn, double plotscale, const char* bgfn) { sl* cmdline = sl_new(16); char* cmd; matchfile* mf; MatchObj* mo; int i; anbool ctrlc; char* imgfn; assert(axy->matchfn); mf = matchfile_open(axy->matchfn); if (!mf) { ERROR("Failed to read matchfile %s", axy->matchfn); return -1; } // just read the first match... mo = matchfile_read_match(mf); if (!mo) { ERROR("Failed to read a match from matchfile %s", axy->matchfn); return -1; } // sources + index overlay imgfn = axy->pnmfn; if (bgfn) { append_executable(cmdline, "jpegtopnm", me); append_escape(cmdline, bgfn); sl_append(cmdline, "|"); imgfn = "-"; } else { if (axy->imagefn && plotscale != 1.0) { append_executable(cmdline, "pnmscale", me); sl_appendf(cmdline, "%f", plotscale); append_escape(cmdline, axy->pnmfn); sl_append(cmdline, "|"); imgfn = "-"; } } append_executable(cmdline, "plotxy", me); if (imgfn) { sl_append(cmdline, "-I"); append_escape(cmdline, imgfn); } else { sl_appendf(cmdline, "-W %i -H %i", (int)(plotscale * axy->W), (int)(plotscale * axy->H)); } sl_append(cmdline, "-i"); append_escape(cmdline, axy->axyfn); if (axy->xcol) { sl_append(cmdline, "-X"); append_escape(cmdline, axy->xcol); } if (axy->ycol) { sl_append(cmdline, "-Y"); append_escape(cmdline, axy->ycol); } if (plotscale != 1.0) { sl_append(cmdline, "-S"); sl_appendf(cmdline, "%f", plotscale); } sl_append(cmdline, "-C red -w 2 -r 6 -N 200 -x 1 -y 1"); sl_append(cmdline, "-P"); sl_append(cmdline, "|"); append_executable(cmdline, "plotxy", me); sl_append(cmdline, "-i"); append_escape(cmdline, indxylsfn); sl_append(cmdline, "-I - -w 2 -r 4 -C green -x 1 -y 1"); if (plotscale != 1.0) { sl_append(cmdline, "-S"); sl_appendf(cmdline, "%f", plotscale); } // if we solved by verifying an existing WCS, there is no quad. if (mo->dimquads) { sl_append(cmdline, " -P |"); append_executable(cmdline, "plotquad", me); sl_append(cmdline, "-I -"); sl_append(cmdline, "-C green"); sl_append(cmdline, "-w 2"); sl_appendf(cmdline, "-d %i", mo->dimquads); if (plotscale != 1.0) { sl_append(cmdline, "-s"); sl_appendf(cmdline, "%f", plotscale); } for (i=0; i<(2 * mo->dimquads); i++) sl_appendf(cmdline, " %g", mo->quadpix[i]); } matchfile_close(mf); sl_append(cmdline, ">"); append_escape(cmdline, redgreenfn); cmd = sl_implode(cmdline, " "); sl_free2(cmdline); logverb("Running:\n %s\n", cmd); if (run_command(cmd, &ctrlc)) { ERROR("Plotting commands %s; exiting.", (ctrlc ? "were cancelled" : "failed")); return -1; } free(cmd); return 0; } static int plot_annotations(augment_xylist_t* axy, const char* me, anbool verbose, const char* annfn, double plotscale, const char* bgfn) { sl* cmdline = sl_new(16); char* cmd; sl* lines; char* imgfn; imgfn = axy->pnmfn; if (bgfn) { append_executable(cmdline, "jpegtopnm", me); append_escape(cmdline, bgfn); sl_append(cmdline, "|"); imgfn = "-"; } else if (axy->imagefn && plotscale != 1.0) { append_executable(cmdline, "pnmscale", me); sl_appendf(cmdline, "%f", plotscale); append_escape(cmdline, axy->pnmfn); sl_append(cmdline, "|"); imgfn = "-"; } append_executable(cmdline, "plot-constellations", me); if (verbose) sl_append(cmdline, "-v"); sl_append(cmdline, "-w"); assert(axy->wcsfn); append_escape(cmdline, axy->wcsfn); sl_append(cmdline, "-i"); append_escape(cmdline, imgfn); if (plotscale != 1.0) { sl_append(cmdline, "-s"); sl_appendf(cmdline, "%f", plotscale); } sl_append(cmdline, "-N"); sl_append(cmdline, "-B"); sl_append(cmdline, "-C"); sl_append(cmdline, "-o"); assert(annfn); append_escape(cmdline, annfn); cmd = sl_implode(cmdline, " "); sl_free2(cmdline); logverb("Running:\n %s\n", cmd); if (run_command_get_outputs(cmd, &lines, NULL)) { ERROR("plot-constellations failed"); return -1; } free(cmd); if (lines && sl_size(lines)) { int i; if (strlen(sl_get(lines, 0))) { logmsg("Your field contains:\n"); for (i=0; i<sl_size(lines); i++) logmsg(" %s\n", sl_get(lines, i)); } } if (lines) sl_free2(lines); return 0; } // "none" => NULL static char* none_is_null(char* in) { return streq(in, "none") ? NULL : in; } static void run_engine(sl* engineargs) { char* cmd; cmd = sl_implode(engineargs, " "); logmsg("Solving...\n"); logverb("Running:\n %s\n", cmd); fflush(NULL); if (run_command_get_outputs(cmd, NULL, NULL)) { ERROR("engine failed. Command that failed was:\n %s", cmd); exit(-1); } free(cmd); fflush(NULL); } struct solve_field_args { char* newfitsfn; char* indxylsfn; char* redgreenfn; char* ngcfn; char* kmzfn; char* scampfn; char* scampconfigfn; }; typedef struct solve_field_args solve_field_args_t; // This runs after "astrometry-engine" is run on the file. static void after_solved(augment_xylist_t* axy, solve_field_args_t* sf, anbool makeplots, const char* me, anbool verbose, const char* tempdir, sl* tempdirs, sl* tempfiles, double plotscale, const char* bgfn) { sip_t wcs; double ra, dec, fieldw, fieldh; char rastr[32], decstr[32]; char* fieldunits; // print info about the field. logmsg("Field: %s\n", axy->imagefn ? axy->imagefn : axy->xylsfn); if (file_exists(axy->wcsfn)) { double orient; if (axy->wcs_last_mod) { time_t t = file_get_last_modified_time(axy->wcsfn); if (t == axy->wcs_last_mod) { logmsg("Warning: there was already a WCS file, and its timestamp has not changed.\n"); } } if (!sip_read_header_file(axy->wcsfn, &wcs)) { ERROR("Failed to read WCS header from file %s", axy->wcsfn); exit(-1); } sip_get_radec_center(&wcs, &ra, &dec); sip_get_radec_center_hms_string(&wcs, rastr, decstr); sip_get_field_size(&wcs, &fieldw, &fieldh, &fieldunits); orient = sip_get_orientation(&wcs); logmsg("Field center: (RA,Dec) = (%3.6f, %3.6f) deg.\n", ra, dec); logmsg("Field center: (RA H:M:S, Dec D:M:S) = (%s, %s).\n", rastr, decstr); logmsg("Field size: %g x %g %s\n", fieldw, fieldh, fieldunits); logmsg("Field rotation angle: up is %g degrees E of N\n", orient); } else { logmsg("Did not solve (or no WCS file was written).\n"); } // create new FITS file... if (axy->fitsimgfn && sf->newfitsfn && file_exists(axy->wcsfn)) { logmsg("Creating new FITS file \"%s\"...\n", sf->newfitsfn); if (new_wcs(axy->fitsimgfn, axy->wcsfn, sf->newfitsfn, TRUE)) { ERROR("Failed to create FITS image with new WCS headers"); exit(-1); } } // write list of index stars in image coordinates if (sf->indxylsfn && file_exists(axy->wcsfn) && file_exists(axy->rdlsfn)) { assert(axy->wcsfn); assert(axy->rdlsfn); // index rdls to xyls. if (wcs_rd2xy(axy->wcsfn, 0, axy->rdlsfn, sf->indxylsfn, NULL, NULL, FALSE, FALSE, NULL)) { ERROR("Failed to project index stars into field coordinates using wcs-rd2xy"); exit(-1); } } if (makeplots && file_exists(sf->indxylsfn) && file_readable(axy->matchfn) && file_readable(axy->wcsfn)) { logmsg("Creating index object overlay plot...\n"); if (plot_index_overlay(axy, me, sf->indxylsfn, sf->redgreenfn, plotscale, bgfn)) { ERROR("Plot index overlay failed."); } } if (makeplots && file_readable(axy->wcsfn)) { logmsg("Creating annotation plot...\n"); if (plot_annotations(axy, me, verbose, sf->ngcfn, plotscale, bgfn)) { ERROR("Plot annotations failed."); } } if (axy->imagefn && sf->kmzfn && file_exists(axy->wcsfn)) { logmsg("Writing kmz file...\n"); if (write_kmz(axy, sf->kmzfn, tempdir, tempdirs, tempfiles)) { ERROR("Failed to write KMZ."); exit(-1); } } if (sf->scampfn && file_exists(axy->wcsfn)) { //char* hdrfile = NULL; qfits_header* imageheader = NULL; starxy_t* xy; xylist_t* xyls; xyls = xylist_open(axy->axyfn); if (!xyls) { ERROR("Failed to read xylist to write SCAMP catalog"); exit(-1); } if (axy->xcol) xylist_set_xname(xyls, axy->xcol); if (axy->ycol) xylist_set_yname(xyls, axy->ycol); //xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); xy = xylist_read_field(xyls, NULL); xylist_close(xyls); if (axy->fitsimgfn) { //hdrfile = axy->fitsimgfn; imageheader = anqfits_get_header2(axy->fitsimgfn, 0); } if (axy->xylsfn) { char val[32]; //hdrfile = axy->xylsfn; imageheader = anqfits_get_header2(axy->xylsfn, 0); // Set NAXIS=2, NAXIS1=IMAGEW, NAXIS2=IMAGEH fits_header_mod_int(imageheader, "NAXIS", 2, NULL); sprintf(val, "%i", axy->W); qfits_header_add_after(imageheader, "NAXIS", "NAXIS1", val, "image width", NULL); sprintf(val, "%i", axy->H); qfits_header_add_after(imageheader, "NAXIS1", "NAXIS2", val, "image height", NULL); //fits_header_add_int(imageheader, "NAXIS1", axy->W, NULL); //fits_header_add_int(imageheader, "NAXIS2", axy->H, NULL); logverb("Using NAXIS 1,2 = %i,%i\n", axy->W, axy->H); } if (scamp_write_field(imageheader, &wcs, xy, sf->scampfn)) { ERROR("Failed to write SCAMP catalog"); exit(-1); } starxy_free(xy); if (imageheader) qfits_header_destroy(imageheader); } if (sf->scampconfigfn) { if (scamp_write_config_file(axy->scampfn, sf->scampconfigfn)) { ERROR("Failed to write SCAMP config file snippet to %s", sf->scampconfigfn); exit(-1); } } } static void delete_temp_files(sl* tempfiles, sl* tempdirs) { int i; if (tempfiles) { for (i=0; i<sl_size(tempfiles); i++) { char* fn = sl_get(tempfiles, i); logverb("Deleting temp file %s\n", fn); if (unlink(fn)) SYSERROR("Failed to delete temp file \"%s\"", fn); } sl_remove_all(tempfiles); } if (tempdirs) { for (i=0; i<sl_size(tempdirs); i++) { char* fn = sl_get(tempdirs, i); logverb("Deleting temp dir %s\n", fn); if (rmdir(fn)) SYSERROR("Failed to delete temp dir \"%s\"", fn); } sl_remove_all(tempdirs); } } int main(int argc, char** args) { int c; anbool help = FALSE; char* outdir = NULL; char* cmd; int i, j, f; int inputnum; int rtn; sl* engineargs; int nbeargs; anbool fromstdin = FALSE; anbool overwrite = FALSE; anbool cont = FALSE; anbool skip_solved = FALSE; anbool makeplots = TRUE; double plotscale = 1.0; char* inbgfn = NULL; char* bgfn = NULL; char* me; anbool verbose = FALSE; int loglvl = LOG_MSG; char* outbase = NULL; anbool usecurl = TRUE; bl* opts; augment_xylist_t theallaxy; augment_xylist_t* allaxy = &theallaxy; int nmyopts; char* removeopts = "ixo\x01"; char* newfits; char* kmz = NULL; char* scamp = NULL; char* scampconfig = NULL; char* index_xyls; anbool just_augment = FALSE; anbool engine_batch = FALSE; bl* batchaxy = NULL; bl* batchsf = NULL; sl* outfiles; sl* tempfiles; // these are deleted after the outer loop over input files sl* tempfiles2; sl* tempdirs; anbool timestamp = FALSE; anbool tempaxy = FALSE; errors_print_on_exit(stderr); fits_use_error_system(); me = find_executable(args[0], NULL); engineargs = sl_new(16); append_executable(engineargs, "astrometry-engine", me); // output filenames. outfiles = sl_new(16); tempfiles = sl_new(4); tempfiles2 = sl_new(4); tempdirs = sl_new(4); rtn = 0; nmyopts = sizeof(options)/sizeof(an_option_t); opts = opts_from_array(options, nmyopts, NULL); augment_xylist_add_options(opts); // remove duplicate short options. for (i=0; i<nmyopts; i++) { an_option_t* opt1 = bl_access(opts, i); for (j=nmyopts; j<bl_size(opts); j++) { an_option_t* opt2 = bl_access(opts, j); if (opt2->shortopt == opt1->shortopt) bl_remove_index(opts, j); } } // remove unwanted augment-xylist options. for (i=0; i<strlen(removeopts); i++) { for (j=nmyopts; j<bl_size(opts); j++) { an_option_t* opt2 = bl_access(opts, j); if (opt2->shortopt == removeopts[i]) bl_remove_index(opts, j); } } // which options are left? /*{ char options[256]; memset(options, 0, 256); printf("options:\n"); for (i=0; i<bl_size(opts); i++) { an_option_t* opt = bl_access(opts, i); printf(" %c (%i) %s\n", opt->shortopt, (int)opt->shortopt, opt->name); options[(int)((opt->shortopt + 256) % 256)] = 1; } printf("Remaining short opts:\n"); for (i=0; i<256; i++) { if (!options[i]) printf(" %c (%i, 0x%x)\n", (char)i, i, i); } }*/ augment_xylist_init(allaxy); // default output filename patterns. allaxy->axyfn = "%s.axy"; allaxy->matchfn = "%s.match"; allaxy->rdlsfn = "%s.rdls"; allaxy->solvedfn = "%s.solved"; allaxy->wcsfn = "%s.wcs"; allaxy->corrfn = "%s.corr"; newfits = "%s.new"; index_xyls = "%s-indx.xyls"; while (1) { int res; c = opts_getopt(opts, argc, args); //printf("option %c (%i)\n", c, (int)c); if (c == -1) break; switch (c) { case '\x91': allaxy->axyfn = optarg; break; case '\x90': tempaxy = TRUE; break; case '\x88': timestamp = TRUE; break; case '\x84': plotscale = atof(optarg); break; case '\x85': inbgfn = optarg; break; case '\x87': allaxy->assume_fits_image = TRUE; break; case '(': engine_batch = TRUE; break; case '@': just_augment = TRUE; break; case 'U': index_xyls = optarg; break; case 'n': scampconfig = optarg; break; case 'i': scamp = optarg; break; case 'Z': kmz = optarg; break; case 'N': newfits = optarg; break; case 'h': help = TRUE; break; case 'v': sl_append(engineargs, "--verbose"); verbose = TRUE; allaxy->verbosity++; loglvl++; break; case 'D': outdir = optarg; break; case 'o': outbase = optarg; break; case 'b': case '\x89': sl_append(engineargs, "--config"); append_escape(engineargs, optarg); break; case 'f': fromstdin = TRUE; break; case 'O': overwrite = TRUE; break; case 'p': makeplots = FALSE; break; case 'G': usecurl = FALSE; break; case 'K': cont = TRUE; break; case 'J': skip_solved = TRUE; break; default: res = augment_xylist_parse_option(c, optarg, allaxy); if (res) { rtn = -1; goto dohelp; } } } if ((optind == argc) && !fromstdin) { printf("ERROR: You didn't specify any files to process.\n"); help = TRUE; } if (help) { dohelp: print_help(args[0], opts); exit(rtn); } bl_free(opts); // --dont-augment: advertised as just write xy file, // so quit after doing that. if (allaxy->dont_augment) { just_augment = TRUE; } log_init(loglvl); if (timestamp) log_set_timestamp(TRUE); if (kmz && starts_with(kmz, "-")) logmsg("Do you really want to save KMZ to the file named \"%s\" ??\n", kmz); if (starts_with(newfits, "-")) { logmsg("Do you really want to save the new FITS file to the file named \"%s\" ??\n", newfits); } if (engine_batch) { batchaxy = bl_new(16, sizeof(augment_xylist_t)); batchsf = bl_new(16, sizeof(solve_field_args_t)); } // Allow (some of the) default filenames to be disabled by setting them to "none". allaxy->matchfn = none_is_null(allaxy->matchfn); allaxy->rdlsfn = none_is_null(allaxy->rdlsfn); allaxy->solvedfn = none_is_null(allaxy->solvedfn); allaxy->solvedinfn = none_is_null(allaxy->solvedinfn); allaxy->wcsfn = none_is_null(allaxy->wcsfn); allaxy->corrfn = none_is_null(allaxy->corrfn); newfits = none_is_null(newfits); index_xyls = none_is_null(index_xyls); if (outdir) { if (mkdir_p(outdir)) { ERROR("Failed to create output directory %s", outdir); exit(-1); } } // number of engine args not specific to a particular file nbeargs = sl_size(engineargs); f = optind; inputnum = 0; while (1) { char* infile = NULL; anbool isxyls; char* reason; int len; char* base; char* basedir; char* basefile = NULL; char *objsfn=NULL; char *ppmfn=NULL; char* downloadfn = NULL; char* suffix = NULL; sl* cmdline; anbool ctrlc; anbool isurl; augment_xylist_t theaxy; augment_xylist_t* axy = &theaxy; int j; solve_field_args_t thesf; solve_field_args_t* sf = &thesf; anbool want_pnm = FALSE; // reset augment-xylist args. memcpy(axy, allaxy, sizeof(augment_xylist_t)); memset(sf, 0, sizeof(solve_field_args_t)); if (fromstdin) { char fnbuf[1024]; if (!fgets(fnbuf, sizeof(fnbuf), stdin)) { if (ferror(stdin)) SYSERROR("Failed to read a filename from stdin"); break; } len = strlen(fnbuf); if (fnbuf[len-1] == '\n') fnbuf[len-1] = '\0'; infile = fnbuf; logmsg("Reading input file \"%s\"...\n", infile); } else { if (f == argc) break; infile = args[f]; f++; logmsg("Reading input file %i of %i: \"%s\"...\n", f - optind, argc - optind, infile); } inputnum++; cmdline = sl_new(16); if (!engine_batch) { // Remove arguments that might have been added in previous trips through this loop sl_remove_from(engineargs, nbeargs); } // Choose the base path/filename for output files. if (outbase) asprintf_safe(&basefile, outbase, inputnum, infile); else basefile = basename_safe(infile); //logverb("Base filename: %s\n", basefile); isurl = (!file_exists(infile) && (starts_with(infile, "http://") || starts_with(infile, "ftp://"))); if (outdir) basedir = strdup(outdir); else { if (isurl) basedir = strdup("."); else basedir = dirname_safe(infile); } //logverb("Base directory: %s\n", basedir); asprintf_safe(&base, "%s/%s", basedir, basefile); //logverb("Base name for output files: %s\n", base); // trim .gz, .bz2 // hmm, we drop the suffix in this case... len = strlen(base); if (ends_with(base, ".gz")) base[len-3] = '\0'; else if (ends_with(base, ".bz2")) base[len-4] = '\0'; len = strlen(base); // trim .xx / .xxx / .xxxx if (len >= 5) { for (j=3; j<=5; j++) { if (base[len - j] == '/') break; if (base[len - j] == '.') { base[len - j] = '\0'; suffix = base + len - j + 1; break; } } } logverb("Base: \"%s\", basefile \"%s\", basedir \"%s\", suffix \"%s\"\n", base, basefile, basedir, suffix); if (tempaxy) { axy->axyfn = create_temp_file("axy", axy->tempdir); sl_append_nocopy(tempfiles2, axy->axyfn); } else axy->axyfn = sl_appendf(outfiles, axy->axyfn, base); if (axy->matchfn) axy->matchfn = sl_appendf(outfiles, axy->matchfn, base); if (axy->rdlsfn) axy->rdlsfn = sl_appendf(outfiles, axy->rdlsfn, base); if (axy->solvedfn) axy->solvedfn = sl_appendf(outfiles, axy->solvedfn, base); if (axy->wcsfn) axy->wcsfn = sl_appendf(outfiles, axy->wcsfn, base); if (axy->corrfn) axy->corrfn = sl_appendf(outfiles, axy->corrfn, base); if (axy->cancelfn) axy->cancelfn = sl_appendf(outfiles, axy->cancelfn, base); if (axy->keepxylsfn) axy->keepxylsfn = sl_appendf(outfiles, axy->keepxylsfn, base); if (axy->pnmfn) axy->pnmfn = sl_appendf(outfiles, axy->pnmfn, base); if (newfits) sf->newfitsfn = sl_appendf(outfiles, newfits, base); if (kmz) sf->kmzfn = sl_appendf(outfiles, kmz, base); if (index_xyls) sf->indxylsfn = sl_appendf(outfiles, index_xyls, base); if (scamp) sf->scampfn = sl_appendf(outfiles, scamp, base); if (scampconfig) sf->scampconfigfn = sl_appendf(outfiles, scampconfig, base); if (makeplots) { objsfn = sl_appendf(outfiles, "%s-objs.png", base); sf->redgreenfn = sl_appendf(outfiles, "%s-indx.png", base); sf->ngcfn = sl_appendf(outfiles, "%s-ngc.png", base); } if (isurl) { if (suffix) downloadfn = sl_appendf(outfiles, "%s.%s", base, suffix); else downloadfn = sl_appendf(outfiles, "%s", base); } if (axy->solvedinfn) asprintf_safe(&axy->solvedinfn, axy->solvedinfn, base); // Do %s replacement on --verify-wcs entries... if (sl_size(axy->verifywcs)) { sl* newlist = sl_new(4); for (j=0; j<sl_size(axy->verifywcs); j++) sl_appendf(newlist, sl_get(axy->verifywcs, j), base); axy->verifywcs = newlist; } // ... and plot-bg if (inbgfn) asprintf_safe(&bgfn, inbgfn, base); if (axy->solvedinfn && axy->solvedfn && streq(axy->solvedfn, axy->solvedinfn)) { // solved input and output files are the same: don't delete the input! sl_remove_string(outfiles, axy->solvedfn); free(axy->solvedfn); axy->solvedfn = axy->solvedinfn; } free(basedir); free(basefile); if (skip_solved) { char* tocheck[] = { axy->solvedinfn, axy->solvedfn }; for (j=0; j<sizeof(tocheck)/sizeof(char*); j++) { if (!tocheck[j]) continue; logverb("Checking for solved file %s\n", tocheck[j]); if (file_exists(tocheck[j])) { logmsg("Solved file exists: %s; skipping this input file.\n", tocheck[j]); goto nextfile; } else { logverb("File \"%s\" does not exist.\n", tocheck[j]); } } } // Check for overlap between input and output filenames for (i = 0; i < sl_size(outfiles); i++) { char* fn = sl_get(outfiles, i); if (streq(fn, infile)) { logmsg("Output filename \"%s\" is the same as your input file.\n" "Refusing to continue.\n" "You can either choose a different output filename, or\n" "rename your input file to have a different extension.\n", fn); goto nextfile; } } // Check for (and possibly delete) existing output filenames. for (i = 0; i < sl_size(outfiles); i++) { char* fn = sl_get(outfiles, i); if (!file_exists(fn)) continue; if (cont) { } else if (overwrite) { if (unlink(fn)) { SYSERROR("Failed to delete an already-existing output file \"%s\"", fn); exit(-1); } } else { logmsg("Output file already exists: \"%s\".\n" "Use the --overwrite flag to overwrite existing files,\n" " or the --continue flag to not overwrite existing files but still try solving.\n", fn); logmsg("Continuing to next input file.\n"); goto nextfile; } } // if we're making "redgreen" plot, we need: if (sf->redgreenfn) { // -- index xylist if (!sf->indxylsfn) { sf->indxylsfn = create_temp_file("indxyls", axy->tempdir); sl_append_nocopy(tempfiles, sf->indxylsfn); } // -- match file. if (!axy->matchfn) { axy->matchfn = create_temp_file("match", axy->tempdir); sl_append_nocopy(tempfiles, axy->matchfn); } } // if index xyls file is needed, we need: if (sf->indxylsfn) { // -- wcs if (!axy->wcsfn) { axy->wcsfn = create_temp_file("wcs", axy->tempdir); sl_append_nocopy(tempfiles, axy->wcsfn); } // -- rdls if (!axy->rdlsfn) { axy->rdlsfn = create_temp_file("rdls", axy->tempdir); sl_append_nocopy(tempfiles, axy->rdlsfn); } } // Download URL... if (isurl) { sl_append(cmdline, usecurl ? "curl" : "wget"); if (!verbose) sl_append(cmdline, usecurl ? "--silent" : "--quiet"); sl_append(cmdline, usecurl ? "--output" : "-O"); append_escape(cmdline, downloadfn); append_escape(cmdline, infile); cmd = sl_implode(cmdline, " "); logmsg("Downloading...\n"); if (run_command(cmd, &ctrlc)) { ERROR("%s command %s", sl_get(cmdline, 0), (ctrlc ? "was cancelled" : "failed")); exit(-1); } sl_remove_all(cmdline); free(cmd); infile = downloadfn; } if (makeplots) want_pnm = TRUE; if (axy->assume_fits_image) { axy->imagefn = infile; if (axy->pnmfn) want_pnm = TRUE; } else { logverb("Checking if file \"%s\" ext %i is xylist or image: ", infile, axy->extension); fflush(NULL); reason = NULL; isxyls = xylist_is_file_xylist(infile, axy->extension, axy->xcol, axy->ycol, &reason); logverb(isxyls ? "xyls\n" : "image\n"); if (!isxyls) logverb(" (not xyls because: %s)\n", reason); free(reason); fflush(NULL); if (isxyls) axy->xylsfn = infile; else { axy->imagefn = infile; want_pnm = TRUE; } } if (want_pnm && !axy->pnmfn) { ppmfn = create_temp_file("ppm", axy->tempdir); sl_append_nocopy(tempfiles, ppmfn); axy->pnmfn = ppmfn; axy->force_ppm = TRUE; } axy->keep_fitsimg = (newfits || scamp); if (augment_xylist(axy, me)) { ERROR("augment-xylist failed"); exit(-1); } if (just_augment) goto nextfile; if (makeplots) { // Check that the plotting executables were built... char* exec = find_executable("plotxy", me); free(exec); if (!exec) { logmsg("Couldn't find \"plotxy\" executable - maybe you didn't build the plotting programs?\n"); logmsg("Disabling plots.\n"); makeplots = FALSE; } } if (makeplots) { // source extraction overlay if (plot_source_overlay(axy, me, objsfn, plotscale, bgfn)) makeplots = FALSE; } append_escape(engineargs, axy->axyfn); if (file_readable(axy->wcsfn)) axy->wcs_last_mod = file_get_last_modified_time(axy->wcsfn); else axy->wcs_last_mod = 0; if (!engine_batch) { run_engine(engineargs); after_solved(axy, sf, makeplots, me, verbose, axy->tempdir, tempdirs, tempfiles, plotscale, bgfn); } else { bl_append(batchaxy, axy); bl_append(batchsf, sf ); } fflush(NULL); // clean up and move on to the next file. nextfile: free(base); sl_free2(cmdline); if (!engine_batch) { free(axy->fitsimgfn); free(axy->solvedinfn); free(bgfn); // erm. if (axy->verifywcs != allaxy->verifywcs) sl_free2(axy->verifywcs); sl_remove_all(outfiles); if (!axy->no_delete_temp) delete_temp_files(tempfiles, tempdirs); } errors_print_stack(stdout); errors_clear_stack(); logmsg("\n"); } if (engine_batch) { run_engine(engineargs); for (i=0; i<bl_size(batchaxy); i++) { augment_xylist_t* axy = bl_access(batchaxy, i); solve_field_args_t* sf = bl_access(batchsf, i); after_solved(axy, sf, makeplots, me, verbose, axy->tempdir, tempdirs, tempfiles, plotscale, bgfn); errors_print_stack(stdout); errors_clear_stack(); logmsg("\n"); free(axy->fitsimgfn); free(axy->solvedinfn); // erm. if (axy->verifywcs != allaxy->verifywcs) sl_free2(axy->verifywcs); } if (!allaxy->no_delete_temp) delete_temp_files(tempfiles, tempdirs); bl_free(batchaxy); bl_free(batchsf); } if (!allaxy->no_delete_temp) delete_temp_files(tempfiles2, NULL); sl_free2(outfiles); sl_free2(tempfiles); sl_free2(tempfiles2); sl_free2(tempdirs); sl_free2(engineargs); free(me); augment_xylist_free_contents(allaxy); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/solvedclient.c������������������������������������������������������������000644 �000765 �000024 �00000011162 12651445460 020516� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <assert.h> #include "solvedclient.h" #include "bl.h" static int serveraddr_initialized = 0; static struct sockaddr_in serveraddr; static FILE* fserver = NULL; int solvedclient_set_server(char* addr) { char buf[256]; char* ind; struct hostent* he; int len; int port; if (fserver) { if (fflush(fserver) || fclose(fserver)) { fprintf(stderr, "Failed to close previous connection to server.\n"); } fserver = NULL; } if (!addr) return -1; ind = index(addr, ':'); if (!ind) { fprintf(stderr, "Invalid IP:port address: %s\n", addr); return -1; } len = ind - addr; memcpy(buf, addr, len); buf[len] = '\0'; he = gethostbyname(buf); if (!he) { fprintf(stderr, "Solved server \"%s\" not found: %s.\n", buf, hstrerror(h_errno)); return -1; } if (!serveraddr_initialized) { memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr_initialized = 1; } memcpy(&(serveraddr.sin_addr), he->h_addr, he->h_length); port = atoi(ind+1); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(port); return 0; } static int connect_to_server() { int sock; if (fserver) return 0; sock = socket(PF_INET, SOCK_STREAM, 0); if (sock == -1) { fprintf(stderr, "Couldn't create socket: %s\n", strerror(errno)); return -1; } fserver = fdopen(sock, "r+b"); if (!fserver) { fprintf(stderr, "Failed to fdopen socket: %s\n", strerror(errno)); return -1; } assert(serveraddr_initialized); // gcc with strict-aliasing warns about this cast but it should be okay. if (connect(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr))) { fprintf(stderr, "Couldn't connect to server: %s\n", strerror(errno)); if (fclose(fserver)) fprintf(stderr, "Failed to close socket: %s\n", strerror(errno)); fserver = NULL; return -1; } return 0; } int solvedclient_get(int filenum, int fieldnum) { char buf[256]; const char* solvedstr = "solved"; int nchars; int solved; if (connect_to_server()) return -1; nchars = sprintf(buf, "get %i %i\n", filenum, fieldnum); if ((fwrite(buf, 1, nchars, fserver) != nchars) || fflush(fserver)) { fprintf(stderr, "Failed to write request to server: %s\n", strerror(errno)); fclose(fserver); fserver = NULL; return -1; } if (!fgets(buf, 256, fserver)) { fprintf(stderr, "Couldn't read response: %s\n", strerror(errno)); fclose(fserver); fserver = NULL; return -1; } solved = (strncmp(buf, solvedstr, strlen(solvedstr)) == 0); return solved; } void solvedclient_set(int filenum, int fieldnum) { char buf[256]; int nchars; if (connect_to_server()) return; nchars = sprintf(buf, "set %i %i\n", filenum, fieldnum); if ((fwrite(buf, 1, nchars, fserver) != nchars) || fflush(fserver)) { fprintf(stderr, "Failed to send command (%s) to solvedserver: %s\n", buf, strerror(errno)); return; } // wait for response. if (!fgets(buf, 256, fserver)) { fprintf(stderr, "Couldn't read response: %s\n", strerror(errno)); fclose(fserver); fserver = NULL; return; } } il* solvedclient_get_fields(int filenum, int firstfield, int lastfield, int maxnfields) { char* buf; int bufsize; il* list; char* cptr; int fld; int nchars; if (connect_to_server()) return NULL; bufsize = 100 + 10 * (maxnfields ? maxnfields : (1 + lastfield - firstfield)); buf = malloc(bufsize); nchars = sprintf(buf, "getall %i %i %i %i\n", filenum, firstfield, lastfield, maxnfields); if ((fwrite(buf, 1, nchars, fserver) != nchars) || fflush(fserver)) { fprintf(stderr, "Failed to send command (%s) to solvedserver: %s\n", buf, strerror(errno)); return NULL; } // wait for response. if (!fgets(buf, bufsize, fserver)) { fprintf(stderr, "Couldn't read response: %s\n", strerror(errno)); fclose(fserver); fserver = NULL; free(buf); return NULL; } if (sscanf(buf, "unsolved %i%n", &fld, &nchars) != 1) { fprintf(stderr, "Couldn't parse response: %s\n", buf); free(buf); return NULL; } if (fld != filenum) { fprintf(stderr, "Expected file number %i, not %i.\n", filenum, fld); free(buf); return NULL; } cptr = buf + nchars; list = il_new(256); while (*cptr && *cptr != '\n') { if (sscanf(cptr, " %i%n", &fld, &nchars) != 1) { fprintf(stderr, "Couldn't parse response: %s\n", buf); il_free(list); free(buf); return NULL; } cptr += nchars; il_append(list, fld); } free(buf); return list; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/solvedfile.c��������������������������������������������������������������000644 �000765 �000024 �00000014436 12651445460 020166� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include "solvedfile.h" #include "errors.h" #if defined(__APPLE__) // MacOS 10.3 with gcc 3.3 doesn't have O_SYNC. #if !defined(O_SYNC) #define O_SYNC 0 #endif #endif int solvedfile_getsize(char* fn) { FILE* f; off_t end; f = fopen(fn, "rb"); if (!f) { return -1; } if (fseek(f, 0, SEEK_END) || ((end = ftello(f)) == -1)) { fprintf(stderr, "Error: seeking to end of file %s: %s\n", fn, strerror(errno)); fclose(f); return -1; } return (int)end; } int solvedfile_get(char* fn, int fieldnum) { FILE* f; unsigned char val; off_t end; // 1-index field numbers: fieldnum--; f = fopen(fn, "rb"); if (!f) { // assume it's not solved! return 0; } if (fseek(f, 0, SEEK_END) || ((end = ftello(f)) == -1)) { fprintf(stderr, "Error: seeking to end of file %s: %s\n", fn, strerror(errno)); fclose(f); return -1; } if (end <= fieldnum) { fclose(f); return 0; } if (fseeko(f, (off_t)fieldnum, SEEK_SET) || (fread(&val, 1, 1, f) != 1) || fclose(f)) { fprintf(stderr, "Error: seeking, reading, or closing file %s: %s\n", fn, strerror(errno)); fclose(f); return -1; } return val; } // lastfield = 0 for no limit. static il* solvedfile_getall_val(char* fn, int firstfield, int lastfield, int maxfields, int val) { FILE* f; off_t end; int fields = 0; il* list; int i; unsigned char* map; list = il_new(256); f = fopen(fn, "rb"); if (!f) { // if file doesn't exist, assume no fields are solved. if (val == 0) { for (i=firstfield; i<=lastfield; i++) { il_append(list, i); fields++; if (fields == maxfields) break; } } return list; } if (fseek(f, 0, SEEK_END) || ((end = ftello(f)) == -1)) { fprintf(stderr, "Error: seeking to end of file %s: %s\n", fn, strerror(errno)); fclose(f); il_free(list); return NULL; } // 1-index firstfield--; lastfield--; if (end <= firstfield) { fclose(f); return list; } map = mmap(NULL, end, PROT_READ, MAP_SHARED, fileno(f), 0); fclose(f); if (map == MAP_FAILED) { fprintf(stderr, "Error: couldn't mmap file %s: %s\n", fn, strerror(errno)); il_free(list); return NULL; } for (i=firstfield; ((lastfield == -1) || (i<=lastfield)) && (i < end); i++) { if (map[i] == val) { // 1-index il_append(list, i+1); if (il_size(list) == maxfields) break; } } munmap(map, end); if (val == 0) { // fields larger than the file size are unsolved. for (i=end; i<=lastfield; i++) { if (il_size(list) == maxfields) break; // 1-index il_append(list, i+1); } } return list; } il* solvedfile_getall(char* fn, int firstfield, int lastfield, int maxfields) { return solvedfile_getall_val(fn, firstfield, lastfield, maxfields, 0); } il* solvedfile_getall_solved(char* fn, int firstfield, int lastfield, int maxfields) { return solvedfile_getall_val(fn, firstfield, lastfield, maxfields, 1); } int solvedfile_setsize(char* fn, int sz) { int f; unsigned char val; off_t off; f = open(fn, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); if (f == -1) { fprintf(stderr, "Error: failed to open file %s for writing: %s\n", fn, strerror(errno)); return -1; } off = lseek(f, 0, SEEK_END); if (off == -1) { fprintf(stderr, "Error: failed to lseek() to end of file %s: %s\n", fn, strerror(errno)); close(f); return -1; } // this gives you the offset one past the end of the file. if (off < sz) { // pad. int npad = sz - off; int i; val = 0; for (i=0; i<npad; i++) if (write(f, &val, 1) != 1) { fprintf(stderr, "Error: failed to write padding to file %s: %s\n", fn, strerror(errno)); close(f); return -1; } } if (close(f)) { fprintf(stderr, "Error closing file %s: %s\n", fn, strerror(errno)); return -1; } return 0; } int solvedfile_set_array(char* fn, anbool* vals, int N) { int f; unsigned char val; int i; solvedfile_setsize(fn, N); // (file mode 777; umask will modify this, if set). f = open(fn, O_WRONLY | O_CREAT | O_SYNC, S_IRWXU | S_IRWXG | S_IRWXO); if (f == -1) { fprintf(stderr, "Error: failed to open file %s for writing: %s\n", fn, strerror(errno)); return -1; } val = 1; for (i=0; i<N; i++) { if (!vals[i]) continue; if ((lseek(f, (off_t)i, SEEK_SET) == -1) || (write(f, &val, 1) != 1)) { fprintf(stderr, "Error: seeking or writing file %s: %s\n", fn, strerror(errno)); return -1; } } if (close(f)) { fprintf(stderr, "Error closing file %s: %s\n", fn, strerror(errno)); return -1; } return 0; } int solvedfile_set_file(char* fn, anbool* vals, int N) { FILE* f; int i; // Ensure the array contains values 0, 1. for (i=0; i<N; i++) if (vals[i]) vals[i] = TRUE; else vals[i] = FALSE; f = fopen(fn, "wb"); if (!f) { SYSERROR("Failed to open file \"%s\" for writing", fn); return -1; } if ((fwrite(vals, 1, N, f) != N) || fclose(f)) { SYSERROR("Failed to write solved file \"%s\"", fn); return -1; } return 0; } int solvedfile_set(char* fn, int fieldnum) { int f; unsigned char val; off_t off; // 1-index fieldnum--; // (file mode 777; umask will modify this, if set). f = open(fn, O_WRONLY | O_CREAT | O_SYNC, S_IRWXU | S_IRWXG | S_IRWXO); if (f == -1) { fprintf(stderr, "Error: failed to open file %s for writing: %s\n", fn, strerror(errno)); return -1; } off = lseek(f, 0, SEEK_END); if (off == -1) { fprintf(stderr, "Error: failed to lseek() to end of file %s: %s\n", fn, strerror(errno)); close(f); return -1; } // this gives you the offset one past the end of the file. if (off < fieldnum) { // pad. int npad = fieldnum - off; int i; val = 0; for (i=0; i<npad; i++) if (write(f, &val, 1) != 1) { fprintf(stderr, "Error: failed to write padding to file %s: %s\n", fn, strerror(errno)); close(f); return -1; } } val = 1; if ((lseek(f, (off_t)fieldnum, SEEK_SET) == -1) || (write(f, &val, 1) != 1) || close(f)) { fprintf(stderr, "Error: seeking, writing, or closing file %s: %s\n", fn, strerror(errno)); close(f); return -1; } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/solvedserver.c������������������������������������������������������������000644 �000765 �000024 �00000015012 12651445460 020544� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <signal.h> #include <assert.h> #include <sys/select.h> #include <fcntl.h> #include "bl.h" #include "solvedfile.h" #include "ioutils.h" #include "boilerplate.h" const char* OPTIONS = "hp:f:"; static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "\nUsage: %s\n" " [-p <port>] (default 6789)\n" " [-f <filename-pattern>] (default solved.%%02i)\n", progname); } int bailout = 0; char* solvedfnpattern = "solved.%02i"; static void sighandler(int sig) { bailout = 1; } int handle_request(FILE* fid) { char buf[256]; char fn[256]; int set; int get; int getall; int filenum; int fieldnum; int lastfieldnum; int maxfields; char* nextword; //printf("Fileno %i:\n", fileno(fid)); if (!fgets(buf, 256, fid)) { fprintf(stderr, "Error: failed to read a line of input.\n"); fflush(stderr); fclose(fid); return -1; } //printf("Got request %s\n", buf); get = set = getall = 0; if (is_word(buf, "get ", &nextword)) { get = 1; } else if (is_word(buf, "set ", &nextword)) { set = 1; } else if (is_word(buf, "getall ", &nextword)) { getall = 1; } if (!(get || set || getall)) { fprintf(stderr, "Error: malformed command.\n"); fclose(fid); return -1; } if (get || set) { if (sscanf(nextword, "%i %i", &filenum, &fieldnum) != 2) { fprintf(stderr, "Error: malformed request: %s\n", buf); fflush(stderr); fclose(fid); return -1; } } else if (getall) { if (sscanf(nextword, "%i %i %i %i", &filenum, &fieldnum, &lastfieldnum, &maxfields) != 4) { fprintf(stderr, "Error: malformed request: %s\n", buf); fflush(stderr); fclose(fid); return -1; } if (lastfieldnum < fieldnum) { fprintf(stderr, "Error: invalid \"getall\" request: lastfieldnum must be >= firstfieldnum.\n"); fflush(stderr); fclose(fid); return -1; } } sprintf(fn, solvedfnpattern, filenum); if (get) { int val; printf("Get %s [%i].\n", fn, fieldnum); fflush(stdout); val = solvedfile_get(fn, fieldnum); if (val == -1) { fclose(fid); return -1; } else { fprintf(fid, "%s %i %i\n", (val ? "solved" : "unsolved"), filenum, fieldnum); fflush(fid); } return 0; } else if (set) { printf("Set %s [%i].\n", fn, fieldnum); fflush(stdout); if (solvedfile_set(fn, fieldnum)) { fclose(fid); return -1; } fprintf(fid, "ok\n"); fflush(fid); return 0; } else if (getall) { int i; il* list; printf("Getall %s [%i : %i], max %i.\n", fn, fieldnum, lastfieldnum, maxfields); fflush(stdout); fprintf(fid, "unsolved %i", filenum); list = solvedfile_getall(fn, fieldnum, lastfieldnum, maxfields); if (list) { for (i=0; i<il_size(list); i++) fprintf(fid, " %i", il_get(list, i)); il_free(list); } fprintf(fid, "\n"); fflush(fid); return 0; } return -1; } int main(int argc, char** args) { int argchar; char* progname = args[0]; int sock; struct sockaddr_in addr; int port = 6789; unsigned int opt; pl* clients; int flags; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 'p': port = atoi(optarg); break; case 'f': solvedfnpattern = optarg; break; case 'h': default: printHelp(progname); exit(-1); } } sock = socket(PF_INET, SOCK_STREAM, 0); if (sock == -1) { fprintf(stderr, "Error: couldn't create socket: %s\n", strerror(errno)); exit(-1); } opt = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) { fprintf(stderr, "Warning: failed to setsockopt() to reuse address.\n"); } flags = fcntl(sock, F_GETFL, 0); if (flags == -1) { fprintf(stderr, "Warning: failed to get socket flags: %s\n", strerror(errno)); } else { flags |= O_NONBLOCK; if (fcntl(sock, F_SETFL, flags) == -1) { fprintf(stderr, "Warning: failed to set socket flags: %s\n", strerror(errno)); } } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(port); // gcc with strict-aliasing warn about this cast but according to "the internet" // it's okay because we're not dereferencing the cast pointer. if (bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in))) { fprintf(stderr, "Error: couldn't bind socket: %s\n", strerror(errno)); exit(-1); } if (listen(sock, 1000)) { fprintf(stderr, "Error: failed to listen() on socket: %s\n", strerror(errno)); exit(-1); } printf("Listening on port %i.\n", port); fflush(stdout); signal(SIGINT, sighandler); clients = pl_new(32); // wait for a connection or i/o... while (1) { struct sockaddr_in clientaddr; socklen_t addrsz = sizeof(clientaddr); FILE* fid; fd_set rset; struct timeval timeout; int res; int maxval = 0; int i; timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO(&rset); maxval = sock; for (i=0; i<pl_size(clients); i++) { int val; fid = pl_get(clients, i); val = fileno(fid); FD_SET(val, &rset); if (val > maxval) maxval = val; } assert(maxval<FD_SETSIZE); FD_SET(sock, &rset); res = select(maxval+1, &rset, NULL, NULL, &timeout); if (res == -1) { if (errno != EINTR) { fprintf(stderr, "Error: select(): %s\n", strerror(errno)); exit(-1); } } if (bailout) break; if (!res) continue; for (i=0; i<pl_size(clients); i++) { fid = pl_get(clients, i); if (FD_ISSET(fileno(fid), &rset)) { if (handle_request(fid)) { fprintf(stderr, "Error from fileno %i\n", fileno(fid)); pl_remove(clients, i); i--; continue; } } } if (FD_ISSET(sock, &rset)) { // See comment about strict aliasing above. Should be okay, despite gcc warning. int s = accept(sock, (struct sockaddr*)&clientaddr, &addrsz); if (s == -1) { fprintf(stderr, "Error: failed to accept() on socket: %s\n", strerror(errno)); continue; } if (addrsz != sizeof(clientaddr)) { fprintf(stderr, "Error: client address has size %i, not %i.\n", addrsz, (uint)sizeof(clientaddr)); continue; } printf("Connection from %s.\n", inet_ntoa(clientaddr.sin_addr)); fflush(stdout); fid = fdopen(s, "a+b"); pl_append(clients, fid); } } printf("Closing socket...\n"); if (close(sock)) { fprintf(stderr, "Error: failed to close socket: %s\n", strerror(errno)); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/solver.c������������������������������������������������������������������000644 �000765 �000024 �00000142022 12651445460 017335� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <string.h> #include <math.h> #include <assert.h> #include <sys/types.h> #include <unistd.h> #include <stdarg.h> #include "os-features.h" #include "ioutils.h" #include "mathutil.h" #include "matchobj.h" #include "solver.h" #include "verify.h" #include "tic.h" #include "solvedclient.h" #include "solvedfile.h" #include "fit-wcs.h" #include "sip-utils.h" #include "keywords.h" #include "log.h" #include "pquad.h" #include "kdtree.h" #include "quad-utils.h" #include "errors.h" #include "tweak2.h" #if TESTING_TRYALLCODES #define DEBUGSOLVER 1 #define TRY_ALL_CODES test_try_all_codes void test_try_all_codes(pquad* pq, int* fieldstars, int dimquad, solver_t* solver, double tol2); #else #define TRY_ALL_CODES try_all_codes #endif #if TESTING_TRYPERMUTATIONS #define DEBUGSOLVER 1 #define TEST_TRY_PERMUTATIONS test_try_permutations void test_try_permutations(int* stars, double* code, int dimquad, solver_t* s); #else #define TEST_TRY_PERMUTATIONS(u,v,x,y) // no-op. #endif void solver_set_keep_logodds(solver_t* solver, double logodds) { solver->logratio_tokeep = logodds; } int solver_set_parity(solver_t* solver, int parity) { if (!((parity == PARITY_NORMAL) || (parity == PARITY_FLIP) || (parity == PARITY_BOTH))) { ERROR("Invalid parity value: %i", parity); return -1; } solver->parity = parity; return 0; } anbool solver_did_solve(const solver_t* solver) { return solver->best_match_solves; } void solver_get_quad_size_range_arcsec(const solver_t* solver, double* qmin, double* qmax) { if (qmin) { *qmin = solver->quadsize_min * solver_get_pixscale_low(solver); } if (qmax) { double q = solver->quadsize_max; if (q == 0) q = solver->field_diag; *qmax = q * solver_get_pixscale_high(solver); } } double solver_get_field_jitter(const solver_t* solver) { return solver->verify_pix; } void solver_get_field_center(const solver_t* solver, double* px, double* py) { if (px) *px = (solver->field_maxx + solver->field_minx)/2.0; if (py) *py = (solver->field_maxy + solver->field_miny)/2.0; } double solver_get_max_radius_arcsec(const solver_t* solver) { return solver->funits_upper * solver->field_diag / 2.0; } MatchObj* solver_get_best_match(solver_t* solver) { return &(solver->best_match); } const char* solver_get_best_match_index_name(const solver_t* solver) { return solver->best_index->indexname; } double solver_get_pixscale_low(const solver_t* solver) { return solver->funits_lower; } double solver_get_pixscale_high(const solver_t* solver) { return solver->funits_upper; } void solver_set_quad_size_range(solver_t* solver, double qmin, double qmax) { solver->quadsize_min = qmin; solver->quadsize_max = qmax; } void solver_set_quad_size_fraction(solver_t* solver, double qmin, double qmax) { solver_set_quad_size_range(solver, qmin * MIN(solver_field_width(solver), solver_field_height(solver)), qmax * solver->field_diag); } void solver_tweak2(solver_t* sp, MatchObj* mo, int order, sip_t* verifysip) { double* xy = NULL; int Nxy; double indexjitter; // quad center double qc[2]; // quad radius-squared double Q2; // initial WCS sip_t startsip; int* theta; double* odds; double* refradec; int i; double newodds; int nm, nc, nd; int besti; int startorder; indexjitter = mo->index_jitter; // ref cat positional error, in arcsec. xy = starxy_to_xy_array(sp->fieldxy, NULL); Nxy = starxy_n(sp->fieldxy); qc[0] = (mo->quadpix[0] + mo->quadpix[2]) / 2.0; qc[1] = (mo->quadpix[1] + mo->quadpix[3]) / 2.0; Q2 = 0.25 * distsq(mo->quadpix, mo->quadpix + 2, 2); if (Q2 == 0.0) { // can happen if we're verifying an existing WCS // note, this is radius-squared, so 1e6 is not crazy. Q2 = 1e6; // set qc to the image center here? or crpix? logverb("solver_tweak2(): setting Q2=%g; qc=(%g,%g)\n", Q2, qc[0], qc[1]); } // mo->refradec may be NULL at this point, so get it from refxyz instead... refradec = malloc(3 * mo->nindex * sizeof(double)); for (i=0; i<mo->nindex; i++) xyzarr2radecdegarr(mo->refxyz + i*3, refradec + i*2); // Verifying an existing WCS? if (verifysip) { memcpy(&startsip, verifysip, sizeof(sip_t)); startorder = MIN(verifysip->a_order, sp->tweak_aborder); } else { startorder = 1; sip_wrap_tan(&(mo->wcstan), &startsip); } startsip.ap_order = startsip.bp_order = sp->tweak_abporder; startsip.a_order = startsip.b_order = sp->tweak_aborder; logverb("solver_tweak2: setting orders %i, %i\n", sp->tweak_aborder, sp->tweak_abporder); // for TWEAK_DEBUG_PLOTs theta = mo->theta; besti = mo->nbest-1;//mo->nmatch + mo->nconflict + mo->ndistractor; logverb("solver_tweak2: set_crpix %i, crpix (%.1f,%.1f)\n", sp->set_crpix, sp->crpix[0], sp->crpix[1]); mo->sip = tweak2(xy, Nxy, sp->verify_pix, // pixel positional noise sigma solver_field_width(sp), solver_field_height(sp), refradec, mo->nindex, indexjitter, qc, Q2, sp->distractor_ratio, sp->logratio_bail_threshold, order, sp->tweak_abporder, &startsip, NULL, &theta, &odds, sp->set_crpix ? sp->crpix : NULL, &newodds, &besti, mo->testperm, startorder); free(refradec); // FIXME -- update refxy? Nobody uses it, right? free(mo->refxy); mo->refxy = NULL; // FIXME -- and testperm? free(mo->testperm); mo->testperm = NULL; if (mo->sip) { // Yoink the TAN solution (?) memcpy(&(mo->wcstan), &(mo->sip->wcstan), sizeof(tan_t)); // Plug in the new "theta" and "odds". free(mo->theta); free(mo->matchodds); mo->theta = theta; mo->matchodds = odds; mo->logodds = newodds; verify_count_hits(theta, besti, &nm, &nc, &nd); mo->nmatch = nm; mo->nconflict = nc; mo->ndistractor = nd; matchobj_compute_derived(mo); } free(xy); } void solver_log_params(const solver_t* sp) { int i; logverb("Solver:\n"); logverb(" Arcsec per pix range: %g, %g\n", sp->funits_lower, sp->funits_upper); logverb(" Image size: %g x %g\n", solver_field_width(sp), solver_field_height(sp)); logverb(" Quad size range: %g, %g\n", sp->quadsize_min, sp->quadsize_max); logverb(" Objs: %i, %i\n", sp->startobj, sp->endobj); logverb(" Parity: %i, %s\n", sp->parity, sp->parity == PARITY_NORMAL ? "normal" : (sp->parity == PARITY_FLIP ? "flip" : "both")); if (sp->use_radec) { double ra,dec,rad; xyzarr2radecdeg(sp->centerxyz, &ra, &dec); rad = distsq2deg(sp->r2); logverb(" Use_radec? yes, (%g, %g), radius %g deg\n", ra, dec, rad); } else { logverb(" Use_radec? no\n"); } logverb(" Verify_pix: %g\n", sp->verify_pix); logverb(" Code tol: %g\n", sp->codetol); logverb(" Dist from quad bonus: %s\n", sp->distance_from_quad_bonus ? "yes" : "no"); logverb(" Distractor ratio: %g\n", sp->distractor_ratio); logverb(" Log tune-up threshold: %g\n", sp->logratio_totune); logverb(" Log bail threshold: %g\n", sp->logratio_bail_threshold); logverb(" Log stoplooking threshold: %g\n", sp->logratio_stoplooking); logverb(" Maxquads %i\n", sp->maxquads); logverb(" Maxmatches %i\n", sp->maxmatches); logverb(" Set CRPIX? %s", sp->set_crpix ? "yes" : "no\n"); if (sp->set_crpix) { if (sp->set_crpix_center) logverb(", center\n"); else logverb(", %g, %g\n", sp->crpix[0], sp->crpix[1]); } logverb(" Tweak? %s\n", sp->do_tweak ? "yes" : "no"); if (sp->do_tweak) { logverb(" Forward order %i\n", sp->tweak_aborder); logverb(" Reverse order %i\n", sp->tweak_abporder); } logverb(" Indexes: %zu\n", pl_size(sp->indexes)); for (i=0; i<pl_size(sp->indexes); i++) { index_t* ind = pl_get(sp->indexes, i); logverb(" %s\n", ind->indexname); } logverb(" Field: %i stars\n", starxy_n(sp->fieldxy)); for (i=0; i<starxy_n(sp->fieldxy); i++) { debug(" xy (%.1f, %.1f), flux %.1f\n", starxy_getx(sp->fieldxy, i), starxy_gety(sp->fieldxy, i), sp->fieldxy->flux ? starxy_get_flux(sp->fieldxy, i) : 0.0); } } void solver_print_to(const solver_t* sp, FILE* stream) { //int oldlevel = log_get_level(); FILE* oldfid = log_get_fid(); //log_set_level(LOG_ALL); log_to(stream); solver_log_params(sp); //log_set_level(oldlevel); log_to(oldfid); } /* static MatchObj* matchobj_copy_deep(const MatchObj* mo, MatchObj* dest) { if (!dest) dest = malloc(sizeof(MatchObj)); memcpy(dest, mo, sizeof(MatchObj)); // various modules add things to a mo... blind_matchobj_deep_copy(mo, dest); verify_matchobj_deep_copy(mo, dest); return dest; } static void matchobj_free_data(MatchObj* mo) { verify_free_matchobj(mo); blind_free_matchobj(mo); } */ static const int A = 0, B = 1, C = 2, D = 3; // Number of stars in the "backbone" of the quad: stars A and B. static const int NBACK = 2; static void find_field_boundaries(solver_t* solver); static inline double getx(const double* d, int ind) { return d[ind*2]; } static inline double gety(const double* d, int ind) { return d[ind*2 + 1]; } static inline void setx(double* d, int ind, double val) { d[ind*2] = val; } static inline void sety(double* d, int ind, double val) { d[ind*2 + 1] = val; } static void field_getxy(solver_t* sp, int index, double* x, double* y) { *x = starxy_getx(sp->fieldxy, index); *y = starxy_gety(sp->fieldxy, index); } static double field_getx(solver_t* sp, int index) { return starxy_getx(sp->fieldxy, index); } static double field_gety(solver_t* sp, int index) { return starxy_gety(sp->fieldxy, index); } static void update_timeused(solver_t* sp) { double usertime, systime; get_resource_stats(&usertime, &systime, NULL); sp->timeused = (usertime + systime) - sp->starttime; if (sp->timeused < 0.0) sp->timeused = 0.0; } static void set_matchobj_template(solver_t* solver, MatchObj* mo) { if (solver->mo_template) memcpy(mo, solver->mo_template, sizeof(MatchObj)); else memset(mo, 0, sizeof(MatchObj)); } static void get_field_center(solver_t* s, double* cx, double* cy) { *cx = 0.5 * (s->field_minx + s->field_maxx); *cy = 0.5 * (s->field_miny + s->field_maxy); } static void get_field_ll_corner(solver_t* s, double* lx, double* ly) { *lx = s->field_minx; *ly = s->field_miny; } void solver_reset_counters(solver_t* s) { s->quit_now = FALSE; s->have_best_match = FALSE; s->best_match_solves = FALSE; s->numtries = 0; s->nummatches = 0; s->numscaleok = 0; s->last_examined_object = 0; s->num_cxdx_skipped = 0; s->num_radec_skipped = 0; s->num_abscale_skipped = 0; s->num_verified = 0; } double solver_field_width(const solver_t* s) { return s->field_maxx - s->field_minx; } double solver_field_height(const solver_t* s) { return s->field_maxy - s->field_miny; } void solver_set_radec(solver_t* s, double ra, double dec, double radius_deg) { s->use_radec = TRUE; radecdeg2xyzarr(ra, dec, s->centerxyz); s->r2 = deg2distsq(radius_deg); } void solver_clear_radec(solver_t* s) { s->use_radec = FALSE; } static void set_center_and_radius(solver_t* solver, MatchObj* mo, tan_t* tan, sip_t* sip) { double cx, cy, lx, ly; double xyz[3]; get_field_center(solver, &cx, &cy); get_field_ll_corner(solver, &lx, &ly); if (sip) { sip_pixelxy2xyzarr(sip, cx, cy, mo->center); sip_pixelxy2xyzarr(sip, lx, ly, xyz); } else { tan_pixelxy2xyzarr(tan, cx, cy, mo->center); tan_pixelxy2xyzarr(tan, lx, ly, xyz); } mo->radius = sqrt(distsq(mo->center, xyz, 3)); mo->radius_deg = dist2deg(mo->radius); } static void set_index(solver_t* s, index_t* index) { s->index = index; s->rel_index_noise2 = square(index->index_jitter / index->index_scale_lower); } static void set_diag(solver_t* s) { s->field_diag = hypot(solver_field_width(s), solver_field_height(s)); } void solver_set_field(solver_t* s, starxy_t* field) { if (s->fieldxy) starxy_free(s->fieldxy); s->fieldxy = field; // Preprocessing happens in "solver_preprocess_field()". } void solver_set_field_bounds(solver_t* s, double xlo, double xhi, double ylo, double yhi) { s->field_minx = xlo; s->field_maxx = xhi; s->field_miny = ylo; s->field_maxy = yhi; set_diag(s); } void solver_cleanup_field(solver_t* solver) { solver_reset_best_match(solver); solver_free_field(solver); solver->fieldxy = NULL; solver_reset_counters(solver); } void solver_verify_sip_wcs(solver_t* solver, sip_t* sip) { //, MatchObj* pmo) { int i, nindexes; MatchObj mo; MatchObj* pmo; anbool olddqb; pmo = &mo; if (!solver->vf) solver_preprocess_field(solver); // fabricate a match and inject it into the solver. set_matchobj_template(solver, pmo); memcpy(&(mo.wcstan), &(sip->wcstan), sizeof(tan_t)); mo.wcs_valid = TRUE; mo.scale = sip_pixel_scale(sip); set_center_and_radius(solver, pmo, NULL, sip); olddqb = solver->distance_from_quad_bonus; solver->distance_from_quad_bonus = FALSE; nindexes = pl_size(solver->indexes); for (i=0; i<nindexes; i++) { index_t* index = pl_get(solver->indexes, i); set_index(solver, index); solver_inject_match(solver, pmo, sip); } // revert solver->distance_from_quad_bonus = olddqb; } void solver_add_index(solver_t* solver, index_t* index) { pl_append(solver->indexes, index); } int solver_n_indices(const solver_t* solver) { return pl_size(solver->indexes); } index_t* solver_get_index(const solver_t* solver, int i) { return pl_get(solver->indexes, i); } void solver_reset_best_match(solver_t* sp) { // we don't really care about very bad best matches... sp->best_logodds = 0; memset(&(sp->best_match), 0, sizeof(MatchObj)); sp->best_index = NULL; sp->best_match_solves = FALSE; sp->have_best_match = FALSE; } void solver_compute_quad_range(const solver_t* sp, const index_t* index, double* minAB, double* maxAB) { double scalefudge; // in pixels // compute fudge factor for quad scale: what are the extreme // ranges of quad scales that should be accepted, given the // code tolerance? // -what is the maximum number of pixels a C or D star can move // to singlehandedly exceed the code tolerance? // -largest quad // -smallest arcsec-per-pixel scale // -index_scale_upper * 1/sqrt(2) is the side length of // the unit-square of code space, in arcseconds. // -that times the code tolerance is how far a C/D star // can move before exceeding the code tolerance, in arcsec. // -that divided by the smallest arcsec-per-pixel scale // gives the largest motion in pixels. //logverb("Index scale %f, %f\n", //index->index_scale_upper, index->index_scale_lower); scalefudge = index->index_scale_upper * M_SQRT1_2 * sp->codetol / sp->funits_upper; if (sp->funits_upper != 0.0) { *minAB = index->index_scale_lower / sp->funits_upper; *minAB -= scalefudge; } if (sp->funits_lower != 0.0) { *maxAB = index->index_scale_upper / sp->funits_lower; *maxAB += scalefudge; } } static void try_all_codes(const pquad* pq, const int* fieldstars, int dimquad, solver_t* solver, double tol2); static void try_all_codes_2(const int* fieldstars, int dimquad, const double* code, solver_t* solver, anbool current_parity, double tol2); static void try_permutations(const int* origstars, int dimquad, const double* origcode, solver_t* solver, anbool current_parity, double tol2, int* stars, double* code, int slot, anbool* placed, kdtree_qres_t** presult); static void resolve_matches(kdtree_qres_t* krez, const double *field, const int* fstars, int dimquads, solver_t* solver, anbool current_parity); static int solver_handle_hit(solver_t* sp, MatchObj* mo, sip_t* sip, anbool fake_match); static void check_scale(pquad* pq, solver_t* s) { double dx, dy; dx = field_getx(s, pq->fieldB) - field_getx(s, pq->fieldA); dy = field_gety(s, pq->fieldB) - field_gety(s, pq->fieldA); pq->scale = dx*dx + dy*dy; if ((pq->scale < s->minminAB2) || (pq->scale > s->maxmaxAB2)) { pq->scale_ok = FALSE; return; } pq->costheta = (dy + dx) / pq->scale; pq->sintheta = (dy - dx) / pq->scale; pq->rel_field_noise2 = (s->verify_pix * s->verify_pix) / pq->scale; pq->scale_ok = TRUE; } static void check_inbox(pquad* pq, int start, solver_t* solver) { int i; double Ax, Ay; field_getxy(solver, pq->fieldA, &Ax, &Ay); // check which C, D points are inside the circle. for (i = start; i < pq->ninbox; i++) { double r; double Cx, Cy, xxtmp; double tol = solver->codetol; if (!pq->inbox[i]) continue; field_getxy(solver, i, &Cx, &Cy); Cx -= Ax; Cy -= Ay; xxtmp = Cx; Cx = Cx * pq->costheta + Cy * pq->sintheta; Cy = -xxtmp * pq->sintheta + Cy * pq->costheta; // make sure it's in the circle centered at (0.5, 0.5) // with radius 1/sqrt(2) (plus codetol for fudge): // (x-1/2)^2 + (y-1/2)^2 <= (r + codetol)^2 // x^2-x+1/4 + y^2-y+1/4 <= (1/sqrt(2) + codetol)^2 // x^2-x + y^2-y + 1/2 <= 1/2 + sqrt(2)*codetol + codetol^2 // x^2-x + y^2-y <= sqrt(2)*codetol + codetol^2 r = (Cx * Cx - Cx) + (Cy * Cy - Cy); if (r > (tol * (M_SQRT2 + tol))) { pq->inbox[i] = FALSE; continue; } setx(pq->xy, i, Cx); sety(pq->xy, i, Cy); } } #if defined DEBUGSOLVER static void print_inbox(pquad* pq) { int i; debug("[ "); for (i = 0; i < pq->ninbox; i++) { if (pq->inbox[i]) debug("%i ", i); } debug("] (n %i)\n", pq->ninbox); } #else static void print_inbox(pquad* pq) {} #endif void solver_reset_field_size(solver_t* s) { s->field_minx = s->field_maxx = s->field_miny = s->field_maxy = 0; s->field_diag = 0.0; } static void find_field_boundaries(solver_t* solver) { // If the bounds haven't been set, use the bounding box. if ((solver->field_minx == solver->field_maxx) || (solver->field_miny == solver->field_maxy)) { int i; solver->field_minx = solver->field_miny = HUGE_VAL; solver->field_maxx = solver->field_maxy = -HUGE_VAL; for (i = 0; i < starxy_n(solver->fieldxy); i++) { solver->field_minx = MIN(solver->field_minx, field_getx(solver, i)); solver->field_maxx = MAX(solver->field_maxx, field_getx(solver, i)); solver->field_miny = MIN(solver->field_miny, field_gety(solver, i)); solver->field_maxy = MAX(solver->field_maxy, field_gety(solver, i)); } } set_diag(solver); } void solver_preprocess_field(solver_t* solver) { find_field_boundaries(solver); // precompute a kdtree over the field solver->vf = verify_field_preprocess(solver->fieldxy); solver->vf->do_uniformize = solver->verify_uniformize; solver->vf->do_dedup = solver->verify_dedup; } void solver_free_field(solver_t* solver) { if (solver->fieldxy) starxy_free(solver->fieldxy); solver->fieldxy = NULL; if (solver->vf) verify_field_free(solver->vf); solver->vf = NULL; } starxy_t* solver_get_field(solver_t* solver) { return solver->fieldxy; } static double get_tolerance(solver_t* solver) { return square(solver->codetol); /* double maxtol2 = square(solver->codetol); double tol2; tol2 = 49.0 * (solver->rel_field_noise2 + solver->rel_index_noise2); //printf("code tolerance %g.\n", sqrt(tol2)); if (tol2 > maxtol2) tol2 = maxtol2; return tol2; */ } /* A somewhat tricky recursive function: stars A and B have already been chosen, so the code coordinate system has been fixed, and we've already determined which other stars will create valid codes (ie, are in the "box"). Now we want to build features using all sets of valid stars (without permutations). pq - data associated with the AB pair. field - the array of field star numbers fieldoffset - offset into the field array where we should add the first star n_to_add - number of stars to add adding - the star we're currently adding; in [0, n_to_add). fieldtop - the maximum field star number to build quads out of. dimquad, solver, tol2 - passed to try_all_codes. */ static void add_stars(const pquad* pq, int* field, int fieldoffset, int n_to_add, int adding, int fieldtop, int dimquad, solver_t* solver, double tol2) { int bottom; int* f = field + fieldoffset; // When we're adding the first star, we start from index zero. // When we're adding subsequent stars, we start from the previous value // plus one, to avoid adding permutations. bottom = (adding ? f[adding-1] + 1 : 0); // It looks funny that we're using f[adding] as a loop variable, but // it's required because try_all_codes needs to know which field stars // were used to create the quad (which are stored in the "f" array) for (f[adding]=bottom; f[adding]<fieldtop; f[adding]++) { if (!pq->inbox[f[adding]]) continue; if (unlikely(solver->quit_now)) return; // If we've hit the end of the recursion (we're adding the last star), // call try_all_codes to try the quad we've built. if (adding == n_to_add-1) { // (when not testing, TRY_ALL_CODES is just try_all_codes.) TRY_ALL_CODES(pq, field, dimquad, solver, tol2); } else { // Else recurse. add_stars(pq, field, fieldoffset, n_to_add, adding+1, fieldtop, dimquad, solver, tol2); } } } // The real deal void solver_run(solver_t* solver) { int numxy, newpoint; double usertime, systime; // first timer callback is called after 1 second time_t next_timer_callback_time = time(NULL) + 1; pquad* pquads; size_t i, num_indexes; double tol2; int field[DQMAX]; get_resource_stats(&usertime, &systime, NULL); if (!solver->vf) solver_preprocess_field(solver); memset(field, 0, sizeof(field)); solver->starttime = usertime + systime; numxy = starxy_n(solver->fieldxy); if (solver->endobj && (numxy > solver->endobj)) numxy = solver->endobj; if (solver->startobj >= numxy) return; if (numxy >= 1000) { logverb("Limiting search to first 1000 objects\n"); numxy = 1000; } if (solver->set_crpix && solver->set_crpix_center) { solver->crpix[0] = wcs_pixel_center_for_size(solver_field_width(solver)); solver->crpix[1] = wcs_pixel_center_for_size(solver_field_height(solver)); logverb("Setting CRPIX to center (%.1f, %.1f) based on image size %i x %i\n", solver->crpix[0], solver->crpix[1], (int)solver_field_width(solver), (int)solver_field_height(solver)); } num_indexes = pl_size(solver->indexes); { double minAB2s[num_indexes]; double maxAB2s[num_indexes]; solver->minminAB2 = HUGE_VAL; solver->maxmaxAB2 = -HUGE_VAL; for (i = 0; i < num_indexes; i++) { double minAB=0, maxAB=0; index_t* index = pl_get(solver->indexes, i); // The limits on the size of quads that we try to match, in pixels. // Derived from index_scale_* and funits_*. solver_compute_quad_range(solver, index, &minAB, &maxAB); //logverb("Index \"%s\" quad range %f to %f\n", index->indexname, //minAB, maxAB); minAB2s[i] = square(minAB); maxAB2s[i] = square(maxAB); solver->minminAB2 = MIN(solver->minminAB2, minAB2s[i]); solver->maxmaxAB2 = MAX(solver->maxmaxAB2, maxAB2s[i]); if (index->cx_less_than_dx) { solver->cxdx_margin = 1.5 * solver->codetol; // FIXME die horribly if the indexes have differing cx_less_than_dx } } solver->minminAB2 = MAX(solver->minminAB2, square(solver->quadsize_min)); if (solver->quadsize_max != 0.0) solver->maxmaxAB2 = MIN(solver->maxmaxAB2, square(solver->quadsize_max)); logverb("Quad scale range: [%g, %g] pixels\n", sqrt(solver->minminAB2), sqrt(solver->maxmaxAB2)); // quick-n-dirty scale estimate using stars A,B. solver->abscale_high = square(arcsec2rad(solver->funits_upper) * (1.0 + solver->codetol)); solver->abscale_low = square(arcsec2rad(solver->funits_lower) * (1.0 - solver->codetol)); /** Ugh, I want to avoid doing distsq2rad when checking scale, but that means correcting for the difference between the distance along the curve of the sphere vs the chord distance. This affects the lower bound for the largest quads in a messy way... This below isn't right. solver->abscale_high = square(arcsec2rad(solver->funits_upper) * (1.0 + solver->codetol)); solver->abscale_low = arcsec2rad(solver->funits_lower) * (1.0 - solver->codetol) * MIN(M_PI, arcsec2rad(field_diag * solver->funits_upper)) ... */ pquads = calloc(numxy * numxy, sizeof(pquad)); /* We maintain an array of "potential quads" (pquad) structs, where * each struct corresponds to one choice of stars A and B; the struct * at index (B * numxy + A) holds information about quads that could be * created using stars A,B. * * (We only use the above-diagonal elements of this 2D array because * A<B.) * * For each AB pair, we cache the scale and the rotation parameters, * and we keep an array "inbox" of length "numxy" of booleans, one for * each star, which say whether that star is eligible to be star C or D * of a quad with AB at the corners. (Obviously A and B aren't * eligible). * * The "ninbox" parameter is somewhat misnamed - it says that "inbox" * elements in the range [0, ninbox) have been initialized. */ /* (See explanatory paragraph below) If "solver->startobj" isn't zero, * then we need to initialize the triangle of "pquads" up to * A=startobj-2, B=startobj-1. */ if (solver->startobj) { debug("startobj > 0; priming pquad arrays.\n"); for (field[B] = 0; field[B] < solver->startobj; field[B]++) { for (field[A] = 0; field[A] < field[B]; field[A]++) { pquad* pq = pquads + field[B] * numxy + field[A]; pq->fieldA = field[A]; pq->fieldB = field[B]; debug("trying A=%i, B=%i\n", field[A], field[B]); check_scale(pq, solver); if (!pq->scale_ok) { debug(" bad scale for A=%i, B=%i\n", field[A], field[B]); continue; } pq->xy = malloc(numxy * 2 * sizeof(double)); pq->inbox = malloc(numxy * sizeof(anbool)); memset(pq->inbox, TRUE, solver->startobj); pq->ninbox = solver->startobj; pq->inbox[field[A]] = FALSE; pq->inbox[field[B]] = FALSE; check_inbox(pq, 0, solver); debug(" inbox(A=%i, B=%i): ", field[A], field[B]); print_inbox(pq); } } } /* Each time through the "for" loop below, we consider a new star * ("newpoint"). First, we try building all quads that have the new * star on the diagonal (star B). Then, we try building all quads that * have the star not on the diagonal (star D). * * For each AB pair, we have a "potential_quad" or "pquad" struct. * This caches the computation we need to do: deciding whether the * scale is acceptable, computing the transformation to code * coordinates, and deciding which C,D stars are in the circle. */ for (newpoint = solver->startobj; newpoint < numxy; newpoint++) { debug("Trying newpoint=%i\n", newpoint); // Give our caller a chance to cancel us midway. The callback // returns how long to wait before calling again. if (solver->timer_callback) { time_t delay; time_t now = time(NULL); if (now > next_timer_callback_time) { update_timeused(solver); delay = solver->timer_callback(solver->userdata); if (delay == 0) // Canceled break; next_timer_callback_time = now + delay; } } solver->last_examined_object = newpoint; // quads with the new star on the diagonal: field[B] = newpoint; debug("Trying quads with B=%i\n", newpoint); // first do an index-independent scale check... for (field[A] = 0; field[A] < newpoint; field[A]++) { // initialize the "pquad" struct for this AB combo. pquad* pq = pquads + field[B] * numxy + field[A]; pq->fieldA = field[A]; pq->fieldB = field[B]; debug(" trying A=%i, B=%i\n", field[A], field[B]); check_scale(pq, solver); if (!pq->scale_ok) { debug(" bad scale for A=%i, B=%i\n", field[A], field[B]); continue; } // initialize the "inbox" array: pq->inbox = malloc(numxy * sizeof(anbool)); pq->xy = malloc(numxy * 2 * sizeof(double)); // -try all stars up to "newpoint"... assert(sizeof(anbool) == 1); memset(pq->inbox, TRUE, newpoint + 1); pq->ninbox = newpoint + 1; // -except A and B. pq->inbox[field[A]] = FALSE; pq->inbox[field[B]] = FALSE; check_inbox(pq, 0, solver); debug(" inbox(A=%i, B=%i): ", field[A], field[B]); print_inbox(pq); } // Now iterate through the different indices for (i = 0; i < num_indexes; i++) { index_t* index = pl_get(solver->indexes, i); int dimquads; set_index(solver, index); dimquads = index_dimquads(index); for (field[A] = 0; field[A] < newpoint; field[A]++) { // initialize the "pquad" struct for this AB combo. pquad* pq = pquads + field[B] * numxy + field[A]; if (!pq->scale_ok) continue; if ((pq->scale < minAB2s[i]) || (pq->scale > maxAB2s[i])) continue; // set code tolerance for this index and AB pair... solver->rel_field_noise2 = pq->rel_field_noise2; tol2 = get_tolerance(solver); // Now look at all sets of (C, D, ...) stars (subject to field[C] < field[D] < ...) // ("dimquads - 2" because we've set stars A and B at this point) add_stars(pq, field, C, dimquads-2, 0, newpoint, dimquads, solver, tol2); if (solver->quit_now) goto quitnow; } } if (solver->quit_now) goto quitnow; // Now try building quads with the new star not on the diagonal: field[C] = newpoint; // (in this loop field[C] > field[D]) debug("Trying quads with C=%i\n", newpoint); for (field[A] = 0; field[A] < newpoint; field[A]++) { for (field[B] = field[A] + 1; field[B] < newpoint; field[B]++) { // grab the "pquad" for this AB combo pquad* pq = pquads + field[B] * numxy + field[A]; if (!pq->scale_ok) { debug(" bad scale for A=%i, B=%i\n", field[A], field[B]); continue; } // test if this C is in the box: pq->inbox[field[C]] = TRUE; pq->ninbox = field[C] + 1; check_inbox(pq, field[C], solver); if (!pq->inbox[field[C]]) { debug(" C is not in the box for A=%i, B=%i\n", field[A], field[B]); continue; } debug(" C is in the box for A=%i, B=%i\n", field[A], field[B]); debug(" box now:"); print_inbox(pq); debug("\n"); solver->rel_field_noise2 = pq->rel_field_noise2; for (i = 0; i < pl_size(solver->indexes); i++) { int dimquads; index_t* index = pl_get(solver->indexes, i); if ((pq->scale < minAB2s[i]) || (pq->scale > maxAB2s[i])) continue; set_index(solver, index); dimquads = index_dimquads(index); tol2 = get_tolerance(solver); if (dimquads > 3) { // ("dimquads - 3" because we've set stars A, B, and C at this point) add_stars(pq, field, D, dimquads-3, 0, newpoint, dimquads, solver, tol2); } else { TRY_ALL_CODES(pq, field, dimquads, solver, tol2); } if (solver->quit_now) goto quitnow; } } } logverb("object %u of %u: %i quads tried, %i matched.\n", newpoint + 1, numxy, solver->numtries, solver->nummatches); if ((solver->maxquads && (solver->numtries >= solver->maxquads)) || (solver->maxmatches && (solver->nummatches >= solver->maxmatches)) || solver->quit_now) break; } quitnow: for (i = 0; i < (numxy*numxy); i++) { pquad* pq = pquads + i; free(pq->inbox); free(pq->xy); } free(pquads); } } /** All the stars in this quad have been chosen. Figure out which permutations of stars CDE are valid and search for matches. */ static void try_all_codes(const pquad* pq, const int* fieldstars, int dimquad, solver_t* solver, double tol2) { int dimcode = (dimquad - 2) * 2; double code[DCMAX]; double flipcode[DCMAX]; int i; solver->numtries++; debug(" trying quad ["); for (i=0; i<dimquad; i++) { debug("%s%i", (i?" ":""), fieldstars[i]); } debug("]\n"); for (i=0; i<dimquad-NBACK; i++) { code[2*i ] = getx(pq->xy, fieldstars[NBACK+i]); code[2*i+1] = gety(pq->xy, fieldstars[NBACK+i]); } if (solver->parity == PARITY_NORMAL || solver->parity == PARITY_BOTH) { debug(" trying normal parity: code=["); for (i=0; i<dimcode; i++) debug("%s%g", (i?", ":""), code[i]); debug("].\n"); try_all_codes_2(fieldstars, dimquad, code, solver, FALSE, tol2); } if (solver->parity == PARITY_FLIP || solver->parity == PARITY_BOTH) { quad_flip_parity(code, flipcode, dimcode); debug(" trying reverse parity: code=["); for (i=0; i<dimcode; i++) debug("%s%g", (i?", ":""), flipcode[i]); debug("].\n"); try_all_codes_2(fieldstars, dimquad, flipcode, solver, TRUE, tol2); } } /** This function tries the quad with the "backbone" stars A and B in normal and flipped configurations. */ static void try_all_codes_2(const int* fieldstars, int dimquad, const double* code, solver_t* solver, anbool current_parity, double tol2) { int i; kdtree_qres_t* result = NULL; int dimcode = (dimquad - 2) * 2; int stars[DQMAX]; double flipcode[DCMAX]; // We actually only use elements up to dimquads-2. anbool placed[DQMAX]; // Un-flipped: stars[0] = fieldstars[0]; stars[1] = fieldstars[1]; for (i=0; i<DQMAX; i++) placed[i] = FALSE; try_permutations(fieldstars, dimquad, code, solver, current_parity, tol2, stars, NULL, 0, placed, &result); if (unlikely(solver->quit_now)) goto bailout; // Flipped: stars[0] = fieldstars[1]; stars[1] = fieldstars[0]; for (i=0; i<dimcode; i++) flipcode[i] = 1.0 - code[i]; for (i=0; i<DQMAX; i++) placed[i] = FALSE; try_permutations(fieldstars, dimquad, flipcode, solver, current_parity, tol2, stars, NULL, 0, placed, &result); bailout: kdtree_free_query(result); } /** This functions tries different permutations of the non-backbone stars C [, D [,E ] ] */ static void try_permutations(const int* origstars, int dimquad, const double* origcode, solver_t* solver, anbool current_parity, double tol2, int* stars, double* code, int slot, anbool* placed, kdtree_qres_t** presult) { int i; int options = KD_OPTIONS_SMALL_RADIUS | KD_OPTIONS_COMPUTE_DISTS | KD_OPTIONS_NO_RESIZE_RESULTS | KD_OPTIONS_USE_SPLIT; double mycode[DCMAX]; int Nstars = dimquad - NBACK; int lastslot = dimquad - NBACK - 1; /* This is a recursive function that tries all combinations of the "internal" stars (ie, not stars A,B that form the "backbone" of the quad). We fill the "stars" array with the star IDs (from "origstars") of the stars that form the quad, while simultaneously filling the "code" array with the corresponding code coordinates (from "origcode"). For example, if "dimquad" is 5, and "origstars" contains A,B,C,D,E, we want to call "resolve_matches" with the following combinations in "stars": AB CDE AB CED AB DCE AB DEC AB ECD AB EDC This call will try to put each star in "slot" in turn, then for each one recurse to "slot" in the rest of the stars. Note that we are filling stars[2], stars[3], etc; the first two elements are already filled by stars A and B. */ if (code == NULL) code = mycode; // We try putting each star that hasn't already been placed in // this "slot". for (i=0; i<Nstars; i++) { if (placed[i]) continue; // Check cx <= dx, if we're a "dx". if (slot > 0 && solver->index->cx_less_than_dx) { if (code[2*(slot - 1) +0] > origcode[2*i +0] + solver->cxdx_margin) { debug("cx <= dx check failed: %g > %g + %g\n", code[2*(slot - 1) +0], origcode[2*i +0], solver->cxdx_margin); solver->num_cxdx_skipped++; continue; } } // Slot in this star... stars[slot + NBACK] = origstars[i + NBACK]; code[2*slot +0] = origcode[2*i +0]; code[2*slot +1] = origcode[2*i +1]; // Check meanx <= 1/2. if (solver->index->cx_less_than_dx && solver->index->meanx_less_than_half) { // Check the "cx + dx <= 1" condition (for quads); in general, // combined with the "cx <= dx" condition, this means that the // mean(x) <= 1/2. int j; double meanx = 0; for (j=0; j<=slot; j++) meanx += code[2*j]; meanx /= (slot+1); if (meanx > 0.5 + solver->cxdx_margin) { debug("meanx <= 0.5 check failed: %g > 0.5 + %g\n", meanx, solver->cxdx_margin); solver->num_meanx_skipped++; continue; } } // If we have more slots to fill... if (slot < lastslot) { placed[i] = TRUE; try_permutations(origstars, dimquad, origcode, solver, current_parity, tol2, stars, code, slot+1, placed, presult); placed[i] = FALSE; } else { #if defined(TESTING_TRYPERMUTATIONS) TEST_TRY_PERMUTATIONS(stars, code, dimquad, solver); continue; #endif // Search with the code we've built. *presult = kdtree_rangesearch_options_reuse (solver->index->codekd->tree, *presult, code, tol2, options); //debug(" trying ABCD = [%i %i %i %i]: %i results.\n", //fstars[A], fstars[B], fstars[C], fstars[D], result->nres); if ((*presult)->nres) { double pixvals[DQMAX*2]; int j; for (j=0; j<dimquad; j++) { setx(pixvals, j, field_getx(solver, stars[j])); sety(pixvals, j, field_gety(solver, stars[j])); } resolve_matches(*presult, pixvals, stars, dimquad, solver, current_parity); } if (unlikely(solver->quit_now)) return; } } } // "field" contains the xy pixel coordinates of stars A,B,C,D. static void resolve_matches(kdtree_qres_t* krez, const double *field, const int* fieldstars, int dimquads, solver_t* solver, anbool current_parity) { int jj, thisquadno; MatchObj mo; unsigned int star[dimquads]; assert(krez); for (jj = 0; jj < krez->nres; jj++) { double starxyz[dimquads*3]; double scale; double arcsecperpix; tan_t wcs; int i; anbool outofbounds = FALSE; double abscale; solver->nummatches++; thisquadno = krez->inds[jj]; quadfile_get_stars(solver->index->quads, thisquadno, star); for (i=0; i<dimquads; i++) { startree_get(solver->index->starkd, star[i], starxyz + 3*i); if (solver->use_radec) if (distsq(starxyz + 3*i, solver->centerxyz, 3) > solver->r2) { outofbounds = TRUE; break; } } if (outofbounds) { debug("Quad match is out of bounds.\n"); solver->num_radec_skipped++; continue; } debug(" stars ["); for (i=0; i<dimquads; i++) debug("%s%i", (i?" ":""), star[i]); debug("]\n"); // Quick-n-dirty scale estimate based on two stars. //abscale = distsq(starxyz, starxyz+3, 3) / distsq(field, field+2, 2); // in (rad per pix)**2 abscale = square(distsq2rad(distsq(starxyz, starxyz+3, 3))) / distsq(field, field+2, 2); if (abscale > solver->abscale_high || abscale < solver->abscale_low) { solver->num_abscale_skipped++; continue; } // compute TAN projection from the matching quad alone. if (fit_tan_wcs(starxyz, field, dimquads, &wcs, &scale)) { // bad quad. logverb("bad quad at %s:%i\n", __FILE__, __LINE__); continue; } arcsecperpix = scale * 3600.0; // FIXME - should there be scale fudge here? if (arcsecperpix > solver->funits_upper || arcsecperpix < solver->funits_lower) { debug(" bad scale (%g arcsec/pix, range %g %g)\n", arcsecperpix, solver->funits_lower, solver->funits_upper); continue; } solver->numscaleok++; set_matchobj_template(solver, &mo); memcpy(&(mo.wcstan), &wcs, sizeof(tan_t)); mo.wcs_valid = TRUE; mo.code_err = krez->sdists[jj]; mo.scale = arcsecperpix; mo.parity = current_parity; mo.quads_tried = solver->numtries; mo.quads_matched = solver->nummatches; mo.quads_scaleok = solver->numscaleok; mo.quad_npeers = krez->nres; mo.timeused = solver->timeused; mo.quadno = thisquadno; mo.dimquads = dimquads; for (i=0; i<dimquads; i++) { mo.star[i] = star[i]; mo.field[i] = fieldstars[i]; mo.ids[i] = 0; } memcpy(mo.quadpix, field, 2 * dimquads * sizeof(double)); memcpy(mo.quadxyz, starxyz, 3 * dimquads * sizeof(double)); set_center_and_radius(solver, &mo, &(mo.wcstan), NULL); if (solver_handle_hit(solver, &mo, NULL, FALSE)) solver->quit_now = TRUE; if (unlikely(solver->quit_now)) return; } } void solver_inject_match(solver_t* solver, MatchObj* mo, sip_t* sip) { solver_handle_hit(solver, mo, sip, TRUE); } static int solver_handle_hit(solver_t* sp, MatchObj* mo, sip_t* sip, anbool fake_match) { double match_distance_in_pixels2; anbool solved; double logaccept; mo->indexid = sp->index->indexid; mo->healpix = sp->index->healpix; mo->hpnside = sp->index->hpnside; mo->wcstan.imagew = sp->field_maxx; mo->wcstan.imageh = sp->field_maxy; mo->dimquads = quadfile_dimquads(sp->index->quads); match_distance_in_pixels2 = square(sp->verify_pix) + square(sp->index->index_jitter / mo->scale); logaccept = MIN(sp->logratio_tokeep, sp->logratio_totune); verify_hit(sp->index->starkd, sp->index->cutnside, mo, sip, sp->vf, match_distance_in_pixels2, sp->distractor_ratio, sp->field_maxx, sp->field_maxy, sp->logratio_bail_threshold, logaccept, sp->logratio_stoplooking, sp->distance_from_quad_bonus, fake_match); mo->nverified = sp->num_verified++; if (mo->logodds >= sp->best_logodds) { sp->best_logodds = mo->logodds; logverb("Got a new best match: logodds %g.\n", mo->logodds); } if (mo->logodds >= sp->logratio_totune && mo->logodds < sp->logratio_tokeep) { logverb("Trying to tune up this solution (logodds = %g; %g)...\n", mo->logodds, exp(mo->logodds)); solver_tweak2(sp, mo, 1, NULL); logverb("After tuning, logodds = %g (%g)\n", mo->logodds, exp(mo->logodds)); // Since we tuned up this solution, we can't just accept the // resulting log-odds at face value. if (!fake_match) { verify_hit(sp->index->starkd, sp->index->cutnside, mo, mo->sip, sp->vf, match_distance_in_pixels2, sp->distractor_ratio, sp->field_maxx, sp->field_maxy, sp->logratio_bail_threshold, sp->logratio_tokeep, sp->logratio_stoplooking, sp->distance_from_quad_bonus, fake_match); logverb("Checking tuned result: logodds = %g (%g)\n", mo->logodds, exp(mo->logodds)); } } if (mo->logodds < sp->logratio_toprint) return FALSE; update_timeused(sp); mo->timeused = sp->timeused; matchobj_print(mo, log_get_level()); if (mo->logodds < sp->logratio_tokeep) return FALSE; logverb("Pixel scale: %g arcsec/pix.\n", mo->scale); logverb("Parity: %s.\n", (mo->parity ? "neg" : "pos")); mo->index = sp->index; mo->index_jitter = sp->index->index_jitter; if (sp->predistort) { int i; double* matchxy; double* matchxyz; double* weights; int N; int Ngood; double dx,dy; // Apply the distortion. logverb("Applying the distortion pattern and recomputing WCS...\n"); // this includes conflicts and distractors; we won't fill these arrays. N = mo->nbest; matchxy = malloc(N * 2 * sizeof(double)); matchxyz = malloc(N * 3 * sizeof(double)); weights = malloc(N * sizeof(double)); Ngood = 0; for (i=0; i<N; i++) { double x,y; if (mo->theta[i] < 0) continue; x = starxy_get_x(sp->fieldxy, i); y = starxy_get_y(sp->fieldxy, i); sip_pixel_undistortion(sp->predistort, x, y, &dx, &dy); matchxy[2*Ngood + 0] = dx; matchxy[2*Ngood + 1] = dy; memcpy(matchxyz + 3*Ngood, mo->refxyz + 3*mo->theta[i], 3*sizeof(double)); weights[Ngood] = verify_logodds_to_weight(mo->matchodds[i]); double xx,yy; Unused anbool ok; ok = tan_xyzarr2pixelxy(&mo->wcstan, matchxyz+3*Ngood, &xx, &yy); assert(ok); logverb("match: ref(%.1f, %.1f) -- img(%.1f, %.1f) --> dist(%.1f, %.1f)\n", xx, yy, x, y, dx, dy); Ngood++; } if (sp->do_tweak) { // Compute the SIP solution using the correspondences // found during verify(), but with the re-distorted positions. sip_t sip; memset(&sip, 0, sizeof(sip_t)); sip.a_order = sip.b_order = sp->tweak_aborder; sip.ap_order = sip.bp_order = sp->tweak_abporder; sip.wcstan.imagew = solver_field_width(sp); sip.wcstan.imageh = solver_field_height(sp); if (sp->set_crpix) { sip.wcstan.crpix[0] = sp->crpix[0]; sip.wcstan.crpix[1] = sp->crpix[1]; // find matching crval... sip_pixel_distortion(sp->predistort, sp->crpix[0], sp->crpix[1], &dx, &dy); tan_pixelxy2radecarr(&mo->wcstan, dx, dy, sip.wcstan.crval); } else { // keep TAN WCS's crval but distort the crpix. sip.wcstan.crval[0] = mo->wcstan.crval[0]; sip.wcstan.crval[1] = mo->wcstan.crval[1]; sip_pixel_undistortion(sp->predistort, mo->wcstan.crpix[0], mo->wcstan.crpix[1], sip.wcstan.crpix+0, sip.wcstan.crpix+1); } int doshift = 1; fit_sip_wcs(matchxyz, matchxy, weights, N, &(sip.wcstan), sp->tweak_aborder, sp->tweak_abporder, doshift, &sip); for (i=0; i<Ngood; i++) { double xx,yy; Unused anbool ok; ok = sip_xyzarr2pixelxy(&sip, matchxyz+3*i, &xx, &yy); assert(ok); logverb("match: ref(%.1f, %.1f) -- dist(%.1f, %.1f)\n", xx, yy, matchxy[2*i+0], matchxy[2*i+1]); } } else { // Compute new TAN WCS...? fit_tan_wcs_weighted(matchxyz, matchxy, weights, Ngood, &mo->wcstan, NULL); if (sp->set_crpix) { tan_t wcs2; fit_tan_wcs_move_tangent_point(matchxyz, matchxy, Ngood, sp->crpix, &mo->wcstan, &wcs2); fit_tan_wcs_move_tangent_point(matchxyz, matchxy, Ngood, sp->crpix, &wcs2, &mo->wcstan); } } free(matchxy); free(matchxyz); free(weights); } else if (sp->do_tweak) { solver_tweak2(sp, mo, sp->tweak_aborder, sip); } else if (!sip && sp->set_crpix) { tan_t wcs2; tan_t wcs3; fit_tan_wcs_move_tangent_point(mo->quadxyz, mo->quadpix, mo->dimquads, sp->crpix, &(mo->wcstan), &wcs2); fit_tan_wcs_move_tangent_point(mo->quadxyz, mo->quadpix, mo->dimquads, sp->crpix, &wcs2, &wcs3); memcpy(&(mo->wcstan), &wcs3, sizeof(tan_t)); /* Good test case: http://antwrp.gsfc.nasa.gov/apod/image/0912/Geminid2007_pacholka850wp.jpg solve-field --config backend.cfg Geminid2007_pacholka850wp.xy \ --scale-low 10 --scale-units degwidth -v --no-tweak --continue --new-fits none \ -o 4 --crpix-center --depth 40-45 printf("Original WCS:\n"); tan_print_to(&(mo->wcstan), stdout); printf("\n"); printf("Moved WCS:\n"); tan_print_to(&wcs2, stdout); printf("\n"); printf("Moved again WCS:\n"); tan_print_to(&wcs3, stdout); printf("\n"); */ } // If the user didn't supply a callback, or if the callback // returns TRUE, consider it solved. solved = (!sp->record_match_callback || sp->record_match_callback(mo, sp->userdata)); // New best match? if (!sp->have_best_match || (mo->logodds > sp->best_match.logodds)) { if (sp->have_best_match) verify_free_matchobj(&sp->best_match); memcpy(&sp->best_match, mo, sizeof(MatchObj)); sp->have_best_match = TRUE; sp->best_index = sp->index; } else { verify_free_matchobj(mo); } if (solved) { sp->best_match_solves = TRUE; return TRUE; } return FALSE; } solver_t* solver_new() { solver_t* solver = calloc(1, sizeof(solver_t)); solver_set_default_values(solver); return solver; } void solver_set_default_values(solver_t* solver) { memset(solver, 0, sizeof(solver_t)); solver->indexes = pl_new(16); solver->funits_upper = HUGE_VAL; solver->logratio_bail_threshold = log(1e-100); solver->logratio_stoplooking = HUGE_VAL; solver->logratio_totune = HUGE_VAL; solver->parity = DEFAULT_PARITY; solver->codetol = DEFAULT_CODE_TOL; solver->distractor_ratio = DEFAULT_DISTRACTOR_RATIO; solver->verify_pix = DEFAULT_VERIFY_PIX; solver->verify_uniformize = TRUE; solver->verify_dedup = TRUE; solver->distance_from_quad_bonus = TRUE; solver->tweak_aborder = DEFAULT_TWEAK_ABORDER; solver->tweak_abporder = DEFAULT_TWEAK_ABPORDER; } void solver_clear_indexes(solver_t* solver) { pl_remove_all(solver->indexes); solver->index = NULL; } void solver_cleanup(solver_t* solver) { solver_free_field(solver); pl_free(solver->indexes); solver->indexes = NULL; if (solver->have_best_match) { verify_free_matchobj(&solver->best_match); solver->have_best_match = FALSE; } if (solver->predistort) sip_free(solver->predistort); solver->predistort = NULL; } void solver_free(solver_t* solver) { if (!solver) return; solver_cleanup(solver); free(solver); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/spike_join.c��������������������������������������������������������������000644 �000765 �000024 �00000004227 12651445460 020161� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /*------------------------------------------------------------- * This file is used to make a table with one column containing * whether the star was flagged as a diffraction spike by our * algorithm (ie. erroneous). * ------------------------------------------------------------ */ #include <stdio.h> #include "fitsioutils.h" int create_table(FILE* inFid, FILE* outFid){ int c, nEntries = 0; int x = 0; qfits_table* tbl; qfits_header* tbl_hdr; // create table header qfits_header* hdr = qfits_table_prim_header_default(); qfits_header_dump(hdr, outFid); // create table tbl = qfits_table_new("spikes",QFITS_BINTABLE,1,1,0); // add column fits_add_column(tbl, 0,TFITS_BIN_TYPE_X, 1, " ", "diffraction spike"); tbl_hdr = qfits_table_ext_header_default(tbl); qfits_header_dump(tbl_hdr, outFid); // fill in content of table while((c = fgetc(inFid)) != EOF){ // show progress if (x==100000){ printf("."); x=0; }else{ x++; } //printf("%c", c); fits_write_data_X(outFid,((unsigned char)c)); nEntries++; } fits_pad_file(outFid); // fix the headers tbl->nr = nEntries; tbl_hdr = qfits_table_ext_header_default(tbl); fix_headers(outFid, hdr, tbl_hdr); qfits_header_destroy(hdr); qfits_header_destroy(tbl_hdr); qfits_table_close(tbl); return 0; } int fix_headers(FILE* fId, qfits_header* hdr, qfits_header* tbl_hdr){ char val[32]; off_t offset; offset = ftello(fId); fseeko(fId, 0, SEEK_SET); // write header qfits_header_dump(hdr, fId); // write table header again qfits_header_dump(tbl_hdr, fId); // point to the end of the file again fseek(fId, offset, SEEK_SET); return 0; } int main(int argc, char* argv[]){ if (argc==3){ FILE* inFid,outFid; printf("processing %s ", argv[1]); // open files for reading/writing inFid = fopen(argv[1], "r"); outFid = fopen(argv[2], "w"); // create table and write to output file create_table(inFid, outFid); fclose(inFid); fclose(outFid); printf(" finished \n"); } else { printf("Usage: spike_join inputFile outputFile\n"); } return 1; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/spoof.py������������������������������������������������������������������000644 �000765 �000024 �00000003045 12651445460 017360� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import math from math import exp from matplotlib.pylab import imread from numpy.oldnumeric.functions import zeros, ravel I=imread('3.png') I=I[:,:,:3] (h,w,planes) = I.shape XY = pyfits.open('16b.fits')[1].data X = XY.field('X') Y = XY.field('Y') psfw = 1.0 stars = zeros((h,w)).astype(float) for (x,y) in zip(X,Y): ix = int(round(x)) iy = int(round(y)) for dy in range(-5, 6): yy = iy + dy if yy < 0 or yy >= h: continue for dx in range(-5, 6): xx = ix + dx if xx < 0 or xx >= w: continue dd = (xx - x)**2 + (yy - y)**2 stars[yy,xx] += exp(-dd / (2 * psfw**2)) #1./(psfw**2 * 2 * math.pi #origfrac = 0.5 #maxorig = I.max() #starfrac = (1.0 - origfrac) + (1.0 - maxorig) #for p in range(planes): # I[:,:,p] = I[:,:,p] * origfrac + stars/stars.max() * starfrac for p in range(planes): I[:,:,p] = I[:,:,p] * 0.7 + stars/stars.max() * 0.8 f=open('out.ppm', 'wb') f.write('P6 %i %i %i\n' % (w, h, 255)) #for j in range(h): # for i in range(w): # for p in range(planes): # f.write(chr(int(round(I[j,i,p] * 255.0)))) flatI = (I.ravel() * 255.0).round().astype(int) f.write("".join([chr(min(i,255)) for i in flatI])) f.close() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/startree.c����������������������������������������������������������������000644 �000765 �000024 �00000014434 12651445460 017661� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Builds a star kdtree from a list of stars. Input: .objs Output: .skdt */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "kdtree.h" #include "kdtree_fits_io.h" #include "starutil.h" #include "catalog.h" #include "fitsioutils.h" #include "starkd.h" #include "boilerplate.h" #define OPTIONS "hR:k:d:t:bsSci:o:" void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -i <input-catalog-name>\n" " -o <output-star-kdtree-name>\n" " ( [-b]: build bounding boxes\n" " OR [-s]: build splitting planes )\n" " [-R Nleaf]: number of points in a kdtree leaf node (default 25)\n" " [-k keep]: number of points to keep\n" " [-t <tree type>]: {double,float,u32,u16}, default u32.\n" " [-d <data type>]: {double,float,u32,u16}, default u32.\n" " [-S]: include separate splitdim array\n" " [-c]: run kdtree_check on the resulting tree\n" "\n", progname); } int main(int argc, char *argv[]) { int argidx, argchar; int nkeep = 0; startree_t* starkd; catalog* cat; int Nleaf = 25; char* treefname = NULL; char* catfname = NULL; char* progname = argv[0]; int exttype = KDT_EXT_DOUBLE; int datatype = KDT_DATA_NULL; int treetype = KDT_TREE_NULL; int tt; int buildopts = 0; int i, N, D; int checktree = 0; qfits_header* hdr; qfits_header* catheader = NULL; if (argc <= 2) { printHelp(progname); return 0; } while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'c': checktree = 1; break; case 'R': Nleaf = (int)strtoul(optarg, NULL, 0); break; case 'k': nkeep = atoi(optarg); if (nkeep == 0) { printf("Couldn't parse \'keep\': \"%s\"\n", optarg); exit(-1); } break; case 'i': catfname = optarg; break; case 'o': treefname = optarg; break; case 't': treetype = kdtree_kdtype_parse_tree_string(optarg); break; case 'd': datatype = kdtree_kdtype_parse_data_string(optarg); break; case 'b': buildopts |= KD_BUILD_BBOX; break; case 's': buildopts |= KD_BUILD_SPLIT; break; case 'S': buildopts |= KD_BUILD_SPLITDIM; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); printHelp(progname); exit(-1); } if (!(buildopts & (KD_BUILD_BBOX | KD_BUILD_SPLIT))) { printf("You need bounding-boxes or splitting planes!\n"); printHelp(progname); exit(-1); } if (!(catfname && treefname)) { printHelp(progname); exit(-1); } // defaults if (!datatype) datatype = KDT_DATA_U32; if (!treetype) treetype = KDT_TREE_U32; fprintf(stderr, "%s: building KD tree for %s\n", argv[0], catfname); fprintf(stderr, "Will write output to %s\n", treefname); fprintf(stderr, "Reading star catalogue..."); cat = catalog_open(catfname); if (!cat) { fprintf(stderr, "Couldn't read catalogue.\n"); exit(-1); } fprintf(stderr, "got %i stars.\n", cat->numstars); if (nkeep && (nkeep < cat->numstars)) { cat->numstars = nkeep; fprintf(stderr, "keeping at most %i stars.\n", nkeep); } starkd = startree_new(); if (!starkd) { fprintf(stderr, "Failed to allocate startree.\n"); exit(-1); } tt = kdtree_kdtypes_to_treetype(exttype, treetype, datatype); N = cat->numstars; D = DIM_STARS; starkd->tree = kdtree_new(N, D, Nleaf); { double low[D]; double high[D]; int d; for (d=0; d<D; d++) { low[d] = -1.0; high[d] = 1.0; } kdtree_set_limits(starkd->tree, low, high); } fprintf(stderr, "Building tree...\n"); fflush(stderr); starkd->tree = kdtree_build(starkd->tree, catalog_get_base(cat), N, D, Nleaf, tt, buildopts); catheader = qfits_header_copy(catalog_get_header(cat)); if (!starkd->tree) { fprintf(stderr, "Couldn't build kdtree.\n"); exit(-1); } starkd->tree->name = strdup(STARTREE_NAME); if (checktree) { fprintf(stderr, "Checking tree...\n"); if (kdtree_check(starkd->tree)) { fprintf(stderr, "\n\nTree check failed!!\n\n\n"); } } fprintf(stderr, "Writing output to %s ...\n", treefname); fflush(stderr); hdr = startree_header(starkd); an_fits_copy_header(catheader, hdr, "HEALPIX"); an_fits_copy_header(catheader, hdr, "HPNSIDE"); an_fits_copy_header(catheader, hdr, "ALLSKY"); an_fits_copy_header(catheader, hdr, "JITTER"); an_fits_copy_header(catheader, hdr, "CUTNSIDE"); an_fits_copy_header(catheader, hdr, "CUTMARG"); an_fits_copy_header(catheader, hdr, "CUTBAND"); an_fits_copy_header(catheader, hdr, "CUTDEDUP"); an_fits_copy_header(catheader, hdr, "CUTNSWEP"); an_fits_copy_header(catheader, hdr, "CUTMINMG"); an_fits_copy_header(catheader, hdr, "CUTMAXMG"); BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This file was created by the program \"startree\".", NULL, NULL); qfits_header_add(hdr, "HISTORY", "startree command line:", NULL, NULL); fits_add_args(hdr, argv, argc); qfits_header_add(hdr, "HISTORY", "(end of startree command line)", NULL, NULL); qfits_header_add(hdr, "HISTORY", "** History entries copied from the input file:", NULL, NULL); fits_copy_all_headers(catheader, hdr, "HISTORY"); qfits_header_add(hdr, "HISTORY", "** End of history entries.", NULL, NULL); for (i=1;; i++) { char key[16]; int n; sprintf(key, "SWEEP%i", i); n = qfits_header_getint(catheader, key, -1); if (n == -1) break; an_fits_copy_header(catheader, hdr, key); } if (startree_write_to_file(starkd, treefname)) { fprintf(stderr, "Failed to write star kdtree.\n"); exit(-1); } catalog_close(cat); fprintf(stderr, "done.\n"); startree_close(starkd); qfits_header_destroy(catheader); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/startree2-main.c����������������������������������������������������������000644 �000765 �000024 �00000007654 12651445460 020673� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "startree2.h" #include "fitstable.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "fitsioutils.h" const char* OPTIONS = "hvL:d:t:bsSci:o:R:D:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -i <input-fits-catalog-name>\n" " -o <output-star-kdtree-name>\n" " [-R <ra-column-name>]: name of RA in FITS table (default RA)\n" " [-D <dec-column-name>]: name of DEC in FITS table (default DEC)\n" " [-b]: build bounding boxes (default: splitting planes)\n" " [-L Nleaf]: number of points in a kdtree leaf node (default 25)\n" " [-t <tree type>]: {double,float,u32,u16}, default u32.\n" " [-d <data type>]: {double,float,u32,u16}, default u32.\n" " [-S]: include separate splitdim array\n" " [-c]: run kdtree_check on the resulting tree\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char *argv[]) { int argidx, argchar; startree_t* starkd; fitstable_t* cat; fitstable_t* tag; int Nleaf = 0; char* skdtfn = NULL; char* catfn = NULL; char* progname = argv[0]; char* racol = NULL; char* deccol = NULL; int loglvl = LOG_MSG; int datatype = 0; int treetype = 0; int buildopts = 0; anbool checktree = FALSE; if (argc <= 2) { printHelp(progname); return 0; } while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'R': racol = optarg; break; case 'D': deccol = optarg; break; case 'c': checktree = TRUE; break; case 'L': Nleaf = (int)strtoul(optarg, NULL, 0); break; case 'i': catfn = optarg; break; case 'o': skdtfn = optarg; break; case 't': treetype = kdtree_kdtype_parse_tree_string(optarg); break; case 'd': datatype = kdtree_kdtype_parse_data_string(optarg); break; case 'b': buildopts |= KD_BUILD_BBOX; break; case 's': buildopts |= KD_BUILD_SPLIT; break; case 'S': buildopts |= KD_BUILD_SPLITDIM; break; case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (optind < argc) { for (argidx = optind; argidx < argc; argidx++) fprintf (stderr, "Non-option argument %s\n", argv[argidx]); printHelp(progname); exit(-1); } if (!(catfn && skdtfn)) { printHelp(progname); exit(-1); } log_init(loglvl); fits_use_error_system(); logmsg("Building star kdtree: reading %s, writing to %s\n", catfn, skdtfn); logverb("Reading star catalogue..."); cat = fitstable_open(catfn); if (!cat) { ERROR("Couldn't read catalog"); exit(-1); } logmsg("Got %i stars\n", fitstable_nrows(cat)); starkd = startree_build(cat, racol, deccol, datatype, treetype, buildopts, Nleaf, argv, argc); if (!starkd) { ERROR("Failed to create star kdtree"); exit(-1); } if (checktree) { logverb("Checking tree...\n"); if (kdtree_check(starkd->tree)) { ERROR("kdtree_check failed!"); exit(-1); } } if (startree_write_to_file(starkd, skdtfn)) { ERROR("Failed to write star kdtree"); exit(-1); } startree_close(starkd); // Append tag-along table. logmsg("Writing tag-along data...\n"); tag = fitstable_open_for_appending(skdtfn); if (startree_write_tagalong_table(cat, tag, racol, deccol)) { ERROR("Failed to write tag-along table"); exit(-1); } if (fitstable_close(tag)) { ERROR("Failed to close tag-along data"); exit(-1); } fitstable_close(cat); return 0; } ������������������������������������������������������������������������������������astrometry.net-0.67/blind/startree2.c���������������������������������������������������������������000644 �000765 �000024 �00000011632 12651445460 017740� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include "startree2.h" #include "kdtree.h" #include "errors.h" #include "log.h" #include "starutil.h" #include "an-bool.h" #include "fitsioutils.h" #include "boilerplate.h" #include "fitstable.h" anbool startree_has_tagalong_data(const fitstable_t* intab) { // don't include RA,Dec. return fitstable_n_fits_columns(intab) > 2; } int startree_write_tagalong_table(fitstable_t* intab, fitstable_t* outtab, const char* racol, const char* deccol) { int i, R, NB, N; char* buf; qfits_header* hdr; fitstable_clear_table(intab); fitstable_add_fits_columns_as_struct(intab); fitstable_copy_columns(intab, outtab); if (!racol) racol = "RA"; if (!deccol) deccol = "DEC"; fitstable_remove_column(outtab, racol); fitstable_remove_column(outtab, deccol); fitstable_read_extension(intab, 1); hdr = fitstable_get_header(outtab); qfits_header_add(hdr, "AN_FILE", AN_FILETYPE_TAGALONG, "Extra data for stars", NULL); if (fitstable_write_header(outtab)) { ERROR("Failed to write tag-along data header"); return -1; } R = fitstable_row_size(intab); NB = 1000; logverb("Input row size: %i, output row size: %i\n", R, fitstable_row_size(outtab)); buf = malloc(NB * R); N = fitstable_nrows(intab); for (i=0; i<N; i+=NB) { int nr = NB; if (i+NB > N) nr = N - i; if (fitstable_read_structs(intab, buf, R, i, nr)) { ERROR("Failed to read tag-along data from catalog"); return -1; } if (fitstable_write_structs(outtab, buf, R, nr)) { ERROR("Failed to write tag-along data"); return -1; } } free(buf); if (fitstable_fix_header(outtab)) { ERROR("Failed to fix tag-along data header"); return -1; } return 0; } startree_t* startree_build(fitstable_t* intable, const char* racol, const char* deccol, // keep RA,Dec in the tag-along table? //anbool keep_radec, // KDT_DATA_*, KDT_TREE_* int datatype, int treetype, // KD_BUILD_* int buildopts, int Nleaf, char** args, int argc) { double* ra = NULL; double* dec = NULL; double* xyz = NULL; int N; startree_t* starkd = NULL; int tt; int d; double low[3]; double high[3]; qfits_header* hdr; qfits_header* inhdr; int i; if (!racol) racol = "RA"; if (!deccol) deccol = "DEC"; if (!datatype) datatype = KDT_DATA_U32; if (!treetype) treetype = KDT_TREE_U32; if (!buildopts) buildopts = KD_BUILD_SPLIT; if (!Nleaf) Nleaf = 25; ra = fitstable_read_column(intable, racol, TFITS_BIN_TYPE_D); if (!ra) { ERROR("Failed to read RA from column %s", racol); goto bailout; } dec = fitstable_read_column(intable, deccol, TFITS_BIN_TYPE_D); if (!dec) { ERROR("Failed to read RA from column %s", racol); goto bailout; } N = fitstable_nrows(intable); xyz = malloc(N * 3 * sizeof(double)); if (!xyz) { SYSERROR("Failed to malloc xyz array to build startree"); goto bailout; } radecdeg2xyzarrmany(ra, dec, xyz, N); free(ra); ra = NULL; free(dec); dec = NULL; starkd = startree_new(); if (!starkd) { ERROR("Failed to allocate startree"); goto bailout; } tt = kdtree_kdtypes_to_treetype(KDT_EXT_DOUBLE, treetype, datatype); starkd->tree = kdtree_new(N, 3, Nleaf); for (d=0; d<3; d++) { low[d] = -1.0; high[d] = 1.0; } kdtree_set_limits(starkd->tree, low, high); logverb("Building star kdtree...\n"); starkd->tree = kdtree_build(starkd->tree, xyz, N, 3, Nleaf, tt, buildopts); if (!starkd->tree) { ERROR("Failed to build star kdtree"); startree_close(starkd); starkd = NULL; goto bailout; } starkd->tree->name = strdup(STARTREE_NAME); inhdr = fitstable_get_primary_header(intable); hdr = startree_header(starkd); an_fits_copy_header(inhdr, hdr, "HEALPIX"); an_fits_copy_header(inhdr, hdr, "HPNSIDE"); an_fits_copy_header(inhdr, hdr, "ALLSKY"); an_fits_copy_header(inhdr, hdr, "JITTER"); an_fits_copy_header(inhdr, hdr, "CUTNSIDE"); an_fits_copy_header(inhdr, hdr, "CUTMARG"); an_fits_copy_header(inhdr, hdr, "CUTDEDUP"); an_fits_copy_header(inhdr, hdr, "CUTNSWEP"); //fits_copy_header(inhdr, hdr, "CUTBAND"); //fits_copy_header(inhdr, hdr, "CUTMINMG"); //fits_copy_header(inhdr, hdr, "CUTMAXMG"); BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This file was created by the command-line:", NULL, NULL); fits_add_args(hdr, args, argc); qfits_header_add(hdr, "HISTORY", "(end of command line)", NULL, NULL); qfits_header_add(hdr, "HISTORY", "** History entries copied from the input file:", NULL, NULL); fits_copy_all_headers(inhdr, hdr, "HISTORY"); qfits_header_add(hdr, "HISTORY", "** End of history entries.", NULL, NULL); for (i=1;; i++) { char key[16]; int n; sprintf(key, "SWEEP%i", i); n = qfits_header_getint(inhdr, key, -1); if (n == -1) break; an_fits_copy_header(inhdr, hdr, key); } bailout: if (ra) free(ra); if (dec) free(dec); if (xyz) free(xyz); return starkd; } ������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/startree2.h���������������������������������������������������������������000644 �000765 �000024 �00000001460 12651445460 017743� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef STARTREE2_H #define STARTREE2_H #include "astrometry/starkd.h" #include "astrometry/fitstable.h" #include "astrometry/an-bool.h" /** Given a FITS BINTABLE, pulls out RA,Dec columns and builds a kd-tree out of them. */ startree_t* startree_build(fitstable_t* intable, const char* racol, const char* deccol, // KDT_DATA_*, KDT_TREE_* int datatype, int treetype, // KD_BUILD_* int buildopts, int Nleaf, char** args, int argc); anbool startree_has_tagalong_data(const fitstable_t* intab); int startree_write_tagalong_table(fitstable_t* intable, fitstable_t* outtable, const char* racol, const char* deccol); #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/startree2rdls.c�����������������������������������������������������������000644 �000765 �000024 �00000005147 12651445460 020631� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <assert.h> #include "kdtree.h" #include "starutil.h" #include "bl.h" #include "starkd.h" #include "boilerplate.h" #include "rdlist.h" #include "log.h" #include "errors.h" static const char* OPTIONS = "hr:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "Usage: %s\n" " -r <rdls-output-file>\n" " [-v]: more verbose\n" " [-h]: help\n" " <skdt> [<skdt> ...]\n\n" "Reads .skdt files. Writes an RDLS containing the star locations.\n", progname); } int main(int argc, char** args) { int argchar; char* outfn = NULL; char* fn; rdlist_t* rdls; startree_t* skdt = NULL; int i; int loglvl = LOG_MSG; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': loglvl++; break; case 'r': outfn = optarg; break; case 'h': print_help(args[0]); exit(0); } log_init(loglvl); if (!outfn || (optind == argc)) { print_help(args[0]); exit(-1); } rdls = rdlist_open_for_writing(outfn); if (!rdls) { ERROR("Failed to open RDLS file %s for output", outfn); exit(-1); } if (rdlist_write_primary_header(rdls)) { ERROR("Failed to write RDLS header"); exit(-1); } for (; optind<argc; optind++) { int Nstars; fn = args[optind]; logmsg("Opening star kdtree %s...\n", fn); skdt = startree_open(fn); if (!skdt) { ERROR("Failed to read star kdtree %s", fn); exit(-1); } Nstars = startree_N(skdt); if (rdlist_write_header(rdls)) { ERROR("Failed to write new RDLS field header"); exit(-1); } logmsg("Reading stars...\n"); for (i=0; i<Nstars; i++) { double xyz[3]; double radec[2]; if (!(i % 200000)) { printf("."); fflush(stdout); } startree_get(skdt, i, xyz); xyzarr2radecdegarr(xyz, radec); if (rdlist_write_one_radec(rdls, radec[0], radec[1])) { ERROR("Failed to write a RA,Dec entry"); exit(-1); } } printf("\n"); startree_close(skdt); if (rdlist_fix_header(rdls)) { ERROR("Failed to fix RDLS field header"); exit(-1); } } if (rdlist_fix_primary_header(rdls) || rdlist_close(rdls)) { ERROR("Failed to close RDLS file"); exit(-1); } return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/subwcs.c������������������������������������������������������������������000644 �000765 �000024 �00000004573 12651445460 017341� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <math.h> #include "log.h" #include "errors.h" #include "sip.h" #include "sip-utils.h" #include "sip_qfits.h" #include "starutil.h" #include "mathutil.h" #include "boilerplate.h" const char* OPTIONS = "hve:x:y:X:Y:s:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stderr); fprintf(stderr, "\nUsage: %s [options] <input-wcs-file> <output-wcs-file>\n" "\n" " [-e <extension>] Read from given HDU (default 0 = primary)\n" " [-x <x-lo>] (default 1)\n" " [-X <x-hi>] (default image W)\n" " [-y <y-lo>] (default 1)\n" " [-Y <y-hi>] (default image H)\n" " [-s <scale>] make output image this factor bigger (default 1)\n" "\n", progname); } int main(int argc, char** args) { int argchar; int loglvl = LOG_MSG; char* progname = args[0]; char** myargs; int nmyargs = 0; int ext = 0; tan_t wcsin; tan_t wcsout; double xlo = 1; double xhi = -1; double ylo = 1; double yhi = -1; double scale = 1.0; double W, H; while ((argchar = getopt (argc, args, OPTIONS)) != -1) { switch (argchar) { case 'v': loglvl++; break; case 'e': ext = atoi(optarg); break; case 's': scale = atof(optarg); break; case 'x': xlo = atof(optarg); break; case 'X': xhi = atof(optarg); break; case 'y': ylo = atof(optarg); break; case 'Y': yhi = atof(optarg); break; case 'h': default: printHelp(progname); exit(-1); } } if (optind < argc) { nmyargs = argc - optind; myargs = args + optind; } if (nmyargs != 2) { printHelp(progname); exit(-1); } log_init(loglvl); if (!tan_read_header_file_ext(myargs[0], ext, &wcsin)) { ERROR("failed to read WCS header from file %s, extension %i", myargs[0], ext); return -1; } W = wcsin.imagew; H = wcsin.imageh; if ((W == 0.0) || (H == 0.0)) { ERROR("failed to find IMAGE{W,H} in input WCS file"); return -1; } if (xhi == -1) xhi = W; if (yhi == -1) yhi = H; logmsg("Cropping image to x=%g,%g, y=%g,%g and scaling by %g\n", xlo, xhi, ylo, yhi, scale); tan_transform(&wcsin, &wcsout, xlo, xhi, ylo, yhi, scale); if (tan_write_to_file(&wcsout, myargs[1])) { ERROR("Error writing output"); exit(-1); } return 0; } �������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/summarize-jobs.py���������������������������������������������������������000644 �000765 �000024 �00000002562 12651445460 021204� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE #import sqlite3 #import commands import os import sys def backtick(cmd): (childin, childout) = os.popen2(cmd) childin.close() out = childout.read() return out def getval(fn, key): cmd = "sqlite " + fn + " \"select val from jobdata where key like '" + key + "'\"" out = backtick(cmd) return out #fn = '/home/gmaps/ontheweb-data/alpha/200705/00001872/jobdata.db' #email = getval(fn, 'email'); #status = getval(fn, 'checked-done') #print email, status outdir = "/data2/apod-solves/" for month in sys.argv[1:]: #print month jobs = os.listdir(month) for job in jobs: path = month + '/' + job + '/' fn = path + "jobdata.db" #print fn email = getval(fn, 'email').strip() #print email if email != 'ckochanek@astronomy.ohio-state.edu': continue solvedfn = path + 'solved' if not os.path.exists(solvedfn): continue #status = getval(fn, 'checked-done') #print job, status #wcsfn = path + "wcs.fits" #print wcsfn #print job print path cmd = "pngtopnm " + path + "fullsize.png | pnmtojpeg > " + outdir + "csk-" + job + ".jpg" backtick(cmd) cmd = "cp " + path + "wcs.fits " + outdir + "csk-" + job + ".wcs" backtick(cmd) #conn = sqlite3.connect(fn) #cur = conn.cursor() #cur.execute("select val from jobdata where key like 'user-email'") ����������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/tablist.c�����������������������������������������������������������������000644 �000765 �000024 �00000013234 12651445460 017467� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *fptr; /* FITS file pointer, defined in fitsio.h */ char *val, value[1000], nullstr[]="*"; char keyword[FLEN_KEYWORD], colname[FLEN_VALUE]; int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int hdunum, hdutype = ANY_HDU, ncols, ii, anynul, dispwidth[1000]; long nelements[1000]; int firstcol, lastcol = 1, linewidth; int elem, firstelem, lastelem = 0, nelems; long jj, nrows, kk; int quiet = 0; if (argc != 2 && argc != 3) { printf("Usage: tablist [-r] filename[ext][col filter][row filter] \n"); printf("\n"); printf("List the contents of a FITS table \n"); printf(" -r: Don't output column headers or row numbers \n"); printf("\n"); printf("Examples: \n"); printf(" tablist tab.fits[GTI] - list the GTI extension\n"); printf(" tablist tab.fits[1][#row < 101] - list first 100 rows\n"); printf(" tablist tab.fits[1][col X;Y] - list X and Y cols only\n"); printf(" tablist tab.fits[1][col -PI] - list all but the PI col\n"); printf(" tablist tab.fits[1][col -PI][#row < 101] - combined case\n"); printf("\n"); printf("Display formats can be modified with the TDISPn keywords.\n"); return(0); } if (fits_open_file(&fptr, argv[argc-1], READONLY, &status)) { if (status) fits_report_error(stderr, status); /* print any error message */ return status; } if ( fits_get_hdu_num(fptr, &hdunum) == 1 ) /* This is the primary array; try to move to the */ /* first extension and see if it is a table */ fits_movabs_hdu(fptr, 2, &hdutype, &status); else fits_get_hdu_type(fptr, &hdutype, &status); /* Get the HDU type */ if (!(hdutype == ASCII_TBL || hdutype == BINARY_TBL)) { printf("Error: this program only displays tables, not images\n"); return -1; } if (argv[1][0] == '-' && argv[1][1] == 'r') { quiet = 1; } fits_get_num_rows(fptr, &nrows, &status); fits_get_num_cols(fptr, &ncols, &status); for (jj=1; jj<=ncols; jj++) fits_get_coltype(fptr, jj, NULL, &nelements[jj], NULL, &status); //printf("nelements[%i] = %i.\n", (int)jj, (int)nelements[jj]); /* find the number of columns that will fit within 80 characters */ for (;;) { int breakout = 0; linewidth = 0; /* go on to the next element in the current column. */ /* (if such an element does not exist, the inner 'for' loop does not get run and we skip to the next column.) */ firstcol = lastcol; firstelem = lastelem + 1; elem = firstelem; for (lastcol = firstcol; lastcol <= ncols; lastcol++) { int typecode; fits_get_col_display_width(fptr, lastcol, &dispwidth[lastcol], &status); fits_get_coltype(fptr, lastcol, &typecode, NULL, NULL, &status); typecode = abs(typecode); if (typecode == TBIT) nelements[lastcol] = (nelements[lastcol] + 7)/8; else if (typecode == TSTRING) nelements[lastcol] = 1; nelems = nelements[lastcol]; for (lastelem = elem; lastelem <= nelems; lastelem++) { int nextwidth = linewidth + dispwidth[lastcol] + 1; if (nextwidth > 80) { breakout = 1; break; } linewidth = nextwidth; } if (breakout) break; /* start at the first element of the next column. */ elem = 1; } /* printf("ncols %i, linewidth %i, firstcol %i, lastcol %i, firstelem %i, lastelem %i, " "nelements[lastcol-1] %i\n", ncols, linewidth, firstcol, lastcol, firstelem, lastelem, (int)nelements[lastcol-1]); */ /* if we exited the loop naturally, (not via break) then include all columns. */ if (!breakout) { lastcol = ncols; lastelem = nelements[lastcol]; } if (linewidth == 0) break; /* print column names as column headers */ if (!quiet) { printf("\n "); for (ii = firstcol; ii <= lastcol; ii++) { int maxelem; fits_make_keyn("TTYPE", ii, keyword, &status); fits_read_key(fptr, TSTRING, keyword, colname, NULL, &status); colname[dispwidth[ii]] = '\0'; /* truncate long names */ kk = ((ii == firstcol) ? firstelem : 1); maxelem = ((ii == lastcol) ? lastelem : nelements[ii]); for (; kk <= maxelem; kk++) { if (kk > 1) { char buf[32]; int len = snprintf(buf, 32, "(%li)", kk); printf("%*.*s%s ",dispwidth[ii]-len, dispwidth[ii]-len, colname, buf); } else printf("%*s ",dispwidth[ii], colname); } } printf("\n"); /* terminate header line */ } /* print each column, row by row (there are faster ways to do this) */ val = value; for (jj = 1; jj <= nrows && !status; jj++) { if (!quiet) printf("%4d ", (int)jj); for (ii = firstcol; ii <= lastcol; ii++) { kk = ((ii == firstcol) ? firstelem : 1); nelems = ((ii == lastcol) ? lastelem : nelements[ii]); for (; kk <= nelems; kk++) { /* read value as a string, regardless of intrinsic datatype */ if (fits_read_col_str (fptr,ii,jj,kk, 1, nullstr, &val, &anynul, &status) ) break; /* jump out of loop on error */ printf("%-*s ",dispwidth[ii], value); } } printf("\n"); } if (!breakout) break; } fits_close_file(fptr, &status); if (status) fits_report_error(stderr, status); /* print any error message */ return(status); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/tabmerge.c����������������������������������������������������������������000644 �000765 �000024 �00000011347 12651445460 017616� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was downloaded from the CFITSIO utilities web page: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/cexamples.html That page contains this text: You may freely modify, reuse, and redistribute these programs as you wish. We assume it was originally written by the CFITSIO authors (primarily William D. Pence). We (the Astrometry.net team) have modified it slightly. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <string.h> #include <stdio.h> #include "fitsio.h" int main(int argc, char *argv[]) { fitsfile *infptr, *outfptr; /* FITS file pointers */ int status = 0; /* CFITSIO status value MUST be initialized to zero! */ int icol, incols, outcols, intype, outtype, check = 1; long inrep, outrep, width, inrows, outrows, ii, jj; unsigned char *buffer = 0; if (argc != 3) { printf("Usage: tabmerge infile1[ext][filter] outfile[ext]\n"); printf("\n"); printf("Merge 2 tables by copying all the rows from the 1st table\n"); printf("into the 2nd table. The 2 tables must have identical\n"); printf("structure, with the same number of columns with the same\n"); printf("datatypes. This program modifies the output file in place,\n"); printf("rather than creating a whole new output file.\n"); printf("\n"); printf("Examples: \n"); printf("\n"); printf("1. tabmerge intab.fit+1 outtab.fit+2\n"); printf("\n"); printf(" merge the table in the 1st extension of intab.fit with\n"); printf(" the table in the 2nd extension of outtab.fit.\n"); printf("\n"); printf("2. tabmerge 'intab.fit+1[PI > 45]' outab.fits+2\n"); printf("\n"); printf(" Same as the 1st example, except only rows that have a PI\n"); printf(" column value > 45 will be merged into the output table.\n"); printf("\n"); return(0); } /* open both input and output files and perform validity checks */ if ( fits_open_file(&infptr, argv[1], READONLY, &status) || fits_open_file(&outfptr, argv[2], READWRITE, &status) ) printf(" Couldn't open both files\n"); else if ( fits_get_hdu_type(infptr, &intype, &status) || fits_get_hdu_type(outfptr, &outtype, &status) ) printf("couldn't get the type of HDU for the files\n"); else if (intype == IMAGE_HDU) { printf("The input HDU is an image, not a table\n"); exit(-1); } else if (outtype == IMAGE_HDU) { printf("The output HDU is an image, not a table\n"); exit(-1); } else if (outtype != intype) printf("Input and output HDUs are not the same type of table.\n"); else if ( fits_get_num_cols(infptr, &incols, &status) || fits_get_num_cols(outfptr, &outcols, &status) ) printf("Couldn't get number of columns in the tables\n"); else if ( incols != outcols ) printf("Input and output HDUs don't have same # of columns.\n"); else if ( fits_read_key(infptr, TLONG, "NAXIS1", &width, NULL, &status) ) printf("Couldn't get width of input table\n"); else if (!(buffer = (unsigned char *) malloc(width)) ) printf("memory allocation error\n"); else if ( fits_get_num_rows(infptr, &inrows, &status) || fits_get_num_rows(outfptr, &outrows, &status) ) printf("Couldn't get the number of rows in the tables\n"); else { /* check that the corresponding columns have the same datatypes */ for (icol = 1; icol <= incols; icol++) { fits_get_coltype(infptr, icol, &intype, &inrep, NULL, &status); fits_get_coltype(outfptr, icol, &outtype, &outrep, NULL, &status); if (intype != outtype || inrep != outrep) { printf("Column %d is not the same in both tables\n", icol); check = 0; } } if (check && !status) { /* insert 'inrows' empty rows at the end of the output table */ fits_insert_rows(outfptr, outrows, inrows, &status); for (ii = 1, jj = outrows +1; ii <= inrows; ii++, jj++) { /* read row from input and write it to the output table */ fits_read_tblbytes( infptr, ii, 1, width, buffer, &status); fits_write_tblbytes(outfptr, jj, 1, width, buffer, &status); if (status)break; /* jump out of loop if error occurred */ } /* all done; now free memory and close files */ fits_close_file(outfptr, &status); fits_close_file(infptr, &status); } } if (buffer) free(buffer); if (status) fits_report_error(stderr, status); /* print any error message */ return(status); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test-solver-2.c�����������������������������������������������������������000644 �000765 �000024 �00000043151 12651445460 020454� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "solver.h" #include "index.h" #include "pquad.h" #include "permutedsort.h" #include "quad-utils.h" #include "log.h" static int compare_n(const void* v1, const void* v2, int N) { const int* u1 = v1; const int* u2 = v2; int i; for (i=0; i<N; i++) { if (u1[i] < u2[i]) return -1; if (u1[i] > u2[i]) return 1; } return 0; } static int compare_tri(const void* v1, const void* v2) { return compare_n(v1, v2, 3); } static int compare_quad(const void* v1, const void* v2) { return compare_n(v1, v2, 4); } static int compare_quint(const void* v1, const void* v2) { return compare_n(v1, v2, 5); } bl* quadlist; int ninv; void test_try_permutations(int* stars, double* code, int dimquad, solver_t* s) { int i; fflush(NULL); /* printf("test_try_permutations: ["); for (i=0; i<dimquad; i++) { printf("%s%i", (i?" ":""), stars[i]); } printf("]\n"); */ printf("{"); for (i=0; i<dimquad; i++) { printf("%s%i", (i?",":""), stars[i]); } printf("}, "); fflush(NULL); bl_append(quadlist, stars); if (quad_obeys_invariants(NULL, code, dimquad, 0)) ninv++; } static starxy_t* field1() { starxy_t* starxy; double field[14]; int i=0, N; // star0 A: (0,0) field[i++] = 0.0; field[i++] = 0.0; // star1 B: (2,2) field[i++] = 2.0; field[i++] = 2.0; // star2 field[i++] = -1.0; field[i++] = 3.0; // star3 field[i++] = 0.5; field[i++] = 1.5; // star4 field[i++] = 1.0; field[i++] = 1.0; // star5 field[i++] = 1.5; field[i++] = 0.5; // star6 field[i++] = 3.0; field[i++] = -1.0; N = i/2; starxy = starxy_new(N, FALSE, FALSE); for (i=0; i<N; i++) { starxy_setx(starxy, i, field[i*2+0]); starxy_sety(starxy, i, field[i*2+1]); } return starxy; } void testit(int* wanted, int Nwanted, int dimquads, int (*compar)(const void *, const void *), anbool cxdx) { int i; solver_t* solver; index_t index; starxy_t* starxy; starxy = field1(); quadlist = bl_new(16, dimquads*sizeof(int)); ninv = 0; solver = solver_new(); memset(&index, 0, sizeof(index_t)); index.index_scale_lower = 1; index.index_scale_upper = 10; index.dimquads = dimquads; index.cx_less_than_dx = index.meanx_less_than_half = cxdx; solver->funits_lower = 0.1; solver->funits_upper = 10; solver_add_index(solver, &index); solver_set_field(solver, starxy); solver_preprocess_field(solver); printf("Found:\n"); solver_run(solver); printf("\n"); fflush(NULL); solver_free_field(solver); solver_free(solver); // bl_sort(quadlist, compar); qsort(wanted, Nwanted, dimquads*sizeof(int), compar); printf("\n\n"); printf("Wanted:\n"); for (i=0; i<Nwanted; i++) { int j; printf("{"); for (j=0; j<dimquads; j++) printf("%s%i", (j?",":""), wanted[i*dimquads+j]); printf("}, "); } printf("\n"); printf("N found: %i; N wanted: %i\n", bl_size(quadlist), Nwanted); printf("N obeying invariants: %i\n", ninv); assert(bl_size(quadlist) == Nwanted); for (i=0; i<bl_size(quadlist); i++) { //int* i1 = bl_access(quadlist, i); //int* i2 = wanted[i]; //printf("[%i, %i, %i] vs [%i, %i, %i]\n", i1[0],i1[1],i1[2], i2[0],i2[1],i2[2]); assert(compar(bl_access(quadlist, i), wanted+i*dimquads) == 0); } bl_free(quadlist); } char* OPTIONS = "v"; int main(int argc, char** args) { int argchar; int* flatwanted; int Nwanted; int itemsize; int i; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': log_init(LOG_ALL+1); break; } // NOTE, contain duplicates because of parity (we're trying both) int wanted3[][3] = { {0,1,3}, {1,0,3}, {0,1,3}, {1,0,3}, {0,2,3}, {2,0,3}, {0,2,3}, {2,0,3}, {1,2,3}, {2,1,3}, {1,2,3}, {2,1,3}, {2,4,3}, {4,2,3}, {2,4,3}, {4,2,3}, {0,1,4}, {1,0,4}, {0,1,4}, {1,0,4}, {0,2,4}, {2,0,4}, {0,2,4}, {2,0,4}, {0,3,4}, {3,0,4}, {0,3,4}, {3,0,4}, {1,2,4}, {2,1,4}, {1,2,4}, {2,1,4}, {1,3,4}, {3,1,4}, {1,3,4}, {3,1,4}, {0,5,4}, {5,0,4}, {0,5,4}, {5,0,4}, {1,5,4}, {5,1,4}, {1,5,4}, {5,1,4}, {2,5,0}, {5,2,0}, {2,5,0}, {5,2,0}, {2,5,1}, {5,2,1}, {2,5,1}, {5,2,1}, {2,5,3}, {5,2,3}, {2,5,3}, {5,2,3}, {2,5,4}, {5,2,4}, {2,5,4}, {5,2,4}, {3,5,4}, {5,3,4}, {3,5,4}, {5,3,4}, {0,1,5}, {1,0,5}, {0,1,5}, {1,0,5}, {0,6,4}, {6,0,4}, {0,6,4}, {6,0,4}, {0,6,5}, {6,0,5}, {0,6,5}, {6,0,5}, {1,6,4}, {6,1,4}, {1,6,4}, {6,1,4}, {1,6,5}, {6,1,5}, {1,6,5}, {6,1,5}, {2,6,0}, {6,2,0}, {2,6,0}, {6,2,0}, {2,6,1}, {6,2,1}, {2,6,1}, {6,2,1}, {2,6,3}, {6,2,3}, {2,6,3}, {6,2,3}, {2,6,4}, {6,2,4}, {2,6,4}, {6,2,4}, {2,6,5}, {6,2,5}, {2,6,5}, {6,2,5}, {3,6,0}, {6,3,0}, {3,6,0}, {6,3,0}, {3,6,1}, {6,3,1}, {3,6,1}, {6,3,1}, {3,6,4}, {6,3,4}, {3,6,4}, {6,3,4}, {3,6,5}, {6,3,5}, {3,6,5}, {6,3,5}, {4,6,5}, {6,4,5}, {4,6,5}, {6,4,5}, }; int wanted4[][4] = { {0, 1, 4, 3}, {0, 1, 3, 4}, {1, 0, 4, 3}, {1, 0, 3, 4}, {0, 1, 4, 3}, {0, 1, 3, 4}, {1, 0, 4, 3}, {1, 0, 3, 4}, {0, 2, 4, 3}, {0, 2, 3, 4}, {2, 0, 4, 3}, {2, 0, 3, 4}, {0, 2, 4, 3}, {0, 2, 3, 4}, {2, 0, 4, 3}, {2, 0, 3, 4}, {1, 2, 4, 3}, {1, 2, 3, 4}, {2, 1, 4, 3}, {2, 1, 3, 4}, {1, 2, 4, 3}, {1, 2, 3, 4}, {2, 1, 4, 3}, {2, 1, 3, 4}, {2, 5, 0, 1}, {2, 5, 1, 0}, {5, 2, 0, 1}, {5, 2, 1, 0}, {2, 5, 0, 1}, {2, 5, 1, 0}, {5, 2, 0, 1}, {5, 2, 1, 0}, {2, 5, 0, 3}, {2, 5, 3, 0}, {5, 2, 0, 3}, {5, 2, 3, 0}, {2, 5, 0, 3}, {2, 5, 3, 0}, {5, 2, 0, 3}, {5, 2, 3, 0}, {2, 5, 0, 4}, {2, 5, 4, 0}, {5, 2, 0, 4}, {5, 2, 4, 0}, {2, 5, 0, 4}, {2, 5, 4, 0}, {5, 2, 0, 4}, {5, 2, 4, 0}, {2, 5, 1, 3}, {2, 5, 3, 1}, {5, 2, 1, 3}, {5, 2, 3, 1}, {2, 5, 1, 3}, {2, 5, 3, 1}, {5, 2, 1, 3}, {5, 2, 3, 1}, {2, 5, 1, 4}, {2, 5, 4, 1}, {5, 2, 1, 4}, {5, 2, 4, 1}, {2, 5, 1, 4}, {2, 5, 4, 1}, {5, 2, 1, 4}, {5, 2, 4, 1}, {2, 5, 3, 4}, {2, 5, 4, 3}, {5, 2, 3, 4}, {5, 2, 4, 3}, {2, 5, 3, 4}, {2, 5, 4, 3}, {5, 2, 3, 4}, {5, 2, 4, 3}, {0, 1, 5, 3}, {0, 1, 3, 5}, {1, 0, 5, 3}, {1, 0, 3, 5}, {0, 1, 5, 3}, {0, 1, 3, 5}, {1, 0, 5, 3}, {1, 0, 3, 5}, {0, 1, 5, 4}, {0, 1, 4, 5}, {1, 0, 5, 4}, {1, 0, 4, 5}, {0, 1, 5, 4}, {0, 1, 4, 5}, {1, 0, 5, 4}, {1, 0, 4, 5}, {0, 6, 4, 5}, {0, 6, 5, 4}, {6, 0, 4, 5}, {6, 0, 5, 4}, {0, 6, 4, 5}, {0, 6, 5, 4}, {6, 0, 4, 5}, {6, 0, 5, 4}, {1, 6, 4, 5}, {1, 6, 5, 4}, {6, 1, 4, 5}, {6, 1, 5, 4}, {1, 6, 4, 5}, {1, 6, 5, 4}, {6, 1, 4, 5}, {6, 1, 5, 4}, {2, 6, 0, 1}, {2, 6, 1, 0}, {6, 2, 0, 1}, {6, 2, 1, 0}, {2, 6, 0, 1}, {2, 6, 1, 0}, {6, 2, 0, 1}, {6, 2, 1, 0}, {2, 6, 0, 3}, {2, 6, 3, 0}, {6, 2, 0, 3}, {6, 2, 3, 0}, {2, 6, 0, 3}, {2, 6, 3, 0}, {6, 2, 0, 3}, {6, 2, 3, 0}, {2, 6, 0, 4}, {2, 6, 4, 0}, {6, 2, 0, 4}, {6, 2, 4, 0}, {2, 6, 0, 4}, {2, 6, 4, 0}, {6, 2, 0, 4}, {6, 2, 4, 0}, {2, 6, 0, 5}, {2, 6, 5, 0}, {6, 2, 0, 5}, {6, 2, 5, 0}, {2, 6, 0, 5}, {2, 6, 5, 0}, {6, 2, 0, 5}, {6, 2, 5, 0}, {2, 6, 1, 3}, {2, 6, 3, 1}, {6, 2, 1, 3}, {6, 2, 3, 1}, {2, 6, 1, 3}, {2, 6, 3, 1}, {6, 2, 1, 3}, {6, 2, 3, 1}, {2, 6, 1, 4}, {2, 6, 4, 1}, {6, 2, 1, 4}, {6, 2, 4, 1}, {2, 6, 1, 4}, {2, 6, 4, 1}, {6, 2, 1, 4}, {6, 2, 4, 1}, {2, 6, 1, 5}, {2, 6, 5, 1}, {6, 2, 1, 5}, {6, 2, 5, 1}, {2, 6, 1, 5}, {2, 6, 5, 1}, {6, 2, 1, 5}, {6, 2, 5, 1}, {2, 6, 3, 4}, {2, 6, 4, 3}, {6, 2, 3, 4}, {6, 2, 4, 3}, {2, 6, 3, 4}, {2, 6, 4, 3}, {6, 2, 3, 4}, {6, 2, 4, 3}, {2, 6, 3, 5}, {2, 6, 5, 3}, {6, 2, 3, 5}, {6, 2, 5, 3}, {2, 6, 3, 5}, {2, 6, 5, 3}, {6, 2, 3, 5}, {6, 2, 5, 3}, {2, 6, 4, 5}, {2, 6, 5, 4}, {6, 2, 4, 5}, {6, 2, 5, 4}, {2, 6, 4, 5}, {2, 6, 5, 4}, {6, 2, 4, 5}, {6, 2, 5, 4}, {3, 6, 0, 1}, {3, 6, 1, 0}, {6, 3, 0, 1}, {6, 3, 1, 0}, {3, 6, 0, 1}, {3, 6, 1, 0}, {6, 3, 0, 1}, {6, 3, 1, 0}, {3, 6, 0, 4}, {3, 6, 4, 0}, {6, 3, 0, 4}, {6, 3, 4, 0}, {3, 6, 0, 4}, {3, 6, 4, 0}, {6, 3, 0, 4}, {6, 3, 4, 0}, {3, 6, 0, 5}, {3, 6, 5, 0}, {6, 3, 0, 5}, {6, 3, 5, 0}, {3, 6, 0, 5}, {3, 6, 5, 0}, {6, 3, 0, 5}, {6, 3, 5, 0}, {3, 6, 1, 4}, {3, 6, 4, 1}, {6, 3, 1, 4}, {6, 3, 4, 1}, {3, 6, 1, 4}, {3, 6, 4, 1}, {6, 3, 1, 4}, {6, 3, 4, 1}, {3, 6, 1, 5}, {3, 6, 5, 1}, {6, 3, 1, 5}, {6, 3, 5, 1}, {3, 6, 1, 5}, {3, 6, 5, 1}, {6, 3, 1, 5}, {6, 3, 5, 1}, {3, 6, 4, 5}, {3, 6, 5, 4}, {6, 3, 4, 5}, {6, 3, 5, 4}, {3, 6, 4, 5}, {3, 6, 5, 4}, {6, 3, 4, 5}, {6, 3, 5, 4} }; int wanted5[][5] = { {2,5,0,1,3}, {2,5,0,3,1}, {2,5,1,0,3}, {2,5,1,3,0}, {2,5,3,0,1}, {2,5,3,1,0}, {5,2,0,1,3}, {5,2,0,3,1}, {5,2,1,0,3}, {5,2,1,3,0}, {5,2,3,0,1}, {5,2,3,1,0}, {2,5,0,1,3}, {2,5,0,3,1}, {2,5,1,0,3}, {2,5,1,3,0}, {2,5,3,0,1}, {2,5,3,1,0}, {5,2,0,1,3}, {5,2,0,3,1}, {5,2,1,0,3}, {5,2,1,3,0}, {5,2,3,0,1}, {5,2,3,1,0}, {2,5,0,1,4}, {2,5,0,4,1}, {2,5,1,0,4}, {2,5,1,4,0}, {2,5,4,0,1}, {2,5,4,1,0}, {5,2,0,1,4}, {5,2,0,4,1}, {5,2,1,0,4}, {5,2,1,4,0}, {5,2,4,0,1}, {5,2,4,1,0}, {2,5,0,1,4}, {2,5,0,4,1}, {2,5,1,0,4}, {2,5,1,4,0}, {2,5,4,0,1}, {2,5,4,1,0}, {5,2,0,1,4}, {5,2,0,4,1}, {5,2,1,0,4}, {5,2,1,4,0}, {5,2,4,0,1}, {5,2,4,1,0}, {2,5,0,3,4}, {2,5,0,4,3}, {2,5,3,0,4}, {2,5,3,4,0}, {2,5,4,0,3}, {2,5,4,3,0}, {5,2,0,3,4}, {5,2,0,4,3}, {5,2,3,0,4}, {5,2,3,4,0}, {5,2,4,0,3}, {5,2,4,3,0}, {2,5,0,3,4}, {2,5,0,4,3}, {2,5,3,0,4}, {2,5,3,4,0}, {2,5,4,0,3}, {2,5,4,3,0}, {5,2,0,3,4}, {5,2,0,4,3}, {5,2,3,0,4}, {5,2,3,4,0}, {5,2,4,0,3}, {5,2,4,3,0}, {2,5,1,3,4}, {2,5,1,4,3}, {2,5,3,1,4}, {2,5,3,4,1}, {2,5,4,1,3}, {2,5,4,3,1}, {5,2,1,3,4}, {5,2,1,4,3}, {5,2,3,1,4}, {5,2,3,4,1}, {5,2,4,1,3}, {5,2,4,3,1}, {2,5,1,3,4}, {2,5,1,4,3}, {2,5,3,1,4}, {2,5,3,4,1}, {2,5,4,1,3}, {2,5,4,3,1}, {5,2,1,3,4}, {5,2,1,4,3}, {5,2,3,1,4}, {5,2,3,4,1}, {5,2,4,1,3}, {5,2,4,3,1}, {0,1,5,3,4}, {0,1,5,4,3}, {0,1,3,5,4}, {0,1,3,4,5}, {0,1,4,5,3}, {0,1,4,3,5}, {1,0,5,3,4}, {1,0,5,4,3}, {1,0,3,5,4}, {1,0,3,4,5}, {1,0,4,5,3}, {1,0,4,3,5}, {0,1,5,3,4}, {0,1,5,4,3}, {0,1,3,5,4}, {0,1,3,4,5}, {0,1,4,5,3}, {0,1,4,3,5}, {1,0,5,3,4}, {1,0,5,4,3}, {1,0,3,5,4}, {1,0,3,4,5}, {1,0,4,5,3}, {1,0,4,3,5}, {2,6,0,1,3}, {2,6,0,3,1}, {2,6,1,0,3}, {2,6,1,3,0}, {2,6,3,0,1}, {2,6,3,1,0}, {6,2,0,1,3}, {6,2,0,3,1}, {6,2,1,0,3}, {6,2,1,3,0}, {6,2,3,0,1}, {6,2,3,1,0}, {2,6,0,1,3}, {2,6,0,3,1}, {2,6,1,0,3}, {2,6,1,3,0}, {2,6,3,0,1}, {2,6,3,1,0}, {6,2,0,1,3}, {6,2,0,3,1}, {6,2,1,0,3}, {6,2,1,3,0}, {6,2,3,0,1}, {6,2,3,1,0}, {2,6,0,1,4}, {2,6,0,4,1}, {2,6,1,0,4}, {2,6,1,4,0}, {2,6,4,0,1}, {2,6,4,1,0}, {6,2,0,1,4}, {6,2,0,4,1}, {6,2,1,0,4}, {6,2,1,4,0}, {6,2,4,0,1}, {6,2,4,1,0}, {2,6,0,1,4}, {2,6,0,4,1}, {2,6,1,0,4}, {2,6,1,4,0}, {2,6,4,0,1}, {2,6,4,1,0}, {6,2,0,1,4}, {6,2,0,4,1}, {6,2,1,0,4}, {6,2,1,4,0}, {6,2,4,0,1}, {6,2,4,1,0}, {2,6,0,1,5}, {2,6,0,5,1}, {2,6,1,0,5}, {2,6,1,5,0}, {2,6,5,0,1}, {2,6,5,1,0}, {6,2,0,1,5}, {6,2,0,5,1}, {6,2,1,0,5}, {6,2,1,5,0}, {6,2,5,0,1}, {6,2,5,1,0}, {2,6,0,1,5}, {2,6,0,5,1}, {2,6,1,0,5}, {2,6,1,5,0}, {2,6,5,0,1}, {2,6,5,1,0}, {6,2,0,1,5}, {6,2,0,5,1}, {6,2,1,0,5}, {6,2,1,5,0}, {6,2,5,0,1}, {6,2,5,1,0}, {2,6,0,3,4}, {2,6,0,4,3}, {2,6,3,0,4}, {2,6,3,4,0}, {2,6,4,0,3}, {2,6,4,3,0}, {6,2,0,3,4}, {6,2,0,4,3}, {6,2,3,0,4}, {6,2,3,4,0}, {6,2,4,0,3}, {6,2,4,3,0}, {2,6,0,3,4}, {2,6,0,4,3}, {2,6,3,0,4}, {2,6,3,4,0}, {2,6,4,0,3}, {2,6,4,3,0}, {6,2,0,3,4}, {6,2,0,4,3}, {6,2,3,0,4}, {6,2,3,4,0}, {6,2,4,0,3}, {6,2,4,3,0}, {2,6,0,3,5}, {2,6,0,5,3}, {2,6,3,0,5}, {2,6,3,5,0}, {2,6,5,0,3}, {2,6,5,3,0}, {6,2,0,3,5}, {6,2,0,5,3}, {6,2,3,0,5}, {6,2,3,5,0}, {6,2,5,0,3}, {6,2,5,3,0}, {2,6,0,3,5}, {2,6,0,5,3}, {2,6,3,0,5}, {2,6,3,5,0}, {2,6,5,0,3}, {2,6,5,3,0}, {6,2,0,3,5}, {6,2,0,5,3}, {6,2,3,0,5}, {6,2,3,5,0}, {6,2,5,0,3}, {6,2,5,3,0}, {2,6,0,4,5}, {2,6,0,5,4}, {2,6,4,0,5}, {2,6,4,5,0}, {2,6,5,0,4}, {2,6,5,4,0}, {6,2,0,4,5}, {6,2,0,5,4}, {6,2,4,0,5}, {6,2,4,5,0}, {6,2,5,0,4}, {6,2,5,4,0}, {2,6,0,4,5}, {2,6,0,5,4}, {2,6,4,0,5}, {2,6,4,5,0}, {2,6,5,0,4}, {2,6,5,4,0}, {6,2,0,4,5}, {6,2,0,5,4}, {6,2,4,0,5}, {6,2,4,5,0}, {6,2,5,0,4}, {6,2,5,4,0}, {2,6,1,3,4}, {2,6,1,4,3}, {2,6,3,1,4}, {2,6,3,4,1}, {2,6,4,1,3}, {2,6,4,3,1}, {6,2,1,3,4}, {6,2,1,4,3}, {6,2,3,1,4}, {6,2,3,4,1}, {6,2,4,1,3}, {6,2,4,3,1}, {2,6,1,3,4}, {2,6,1,4,3}, {2,6,3,1,4}, {2,6,3,4,1}, {2,6,4,1,3}, {2,6,4,3,1}, {6,2,1,3,4}, {6,2,1,4,3}, {6,2,3,1,4}, {6,2,3,4,1}, {6,2,4,1,3}, {6,2,4,3,1}, {2,6,1,3,5}, {2,6,1,5,3}, {2,6,3,1,5}, {2,6,3,5,1}, {2,6,5,1,3}, {2,6,5,3,1}, {6,2,1,3,5}, {6,2,1,5,3}, {6,2,3,1,5}, {6,2,3,5,1}, {6,2,5,1,3}, {6,2,5,3,1}, {2,6,1,3,5}, {2,6,1,5,3}, {2,6,3,1,5}, {2,6,3,5,1}, {2,6,5,1,3}, {2,6,5,3,1}, {6,2,1,3,5}, {6,2,1,5,3}, {6,2,3,1,5}, {6,2,3,5,1}, {6,2,5,1,3}, {6,2,5,3,1}, {2,6,1,4,5}, {2,6,1,5,4}, {2,6,4,1,5}, {2,6,4,5,1}, {2,6,5,1,4}, {2,6,5,4,1}, {6,2,1,4,5}, {6,2,1,5,4}, {6,2,4,1,5}, {6,2,4,5,1}, {6,2,5,1,4}, {6,2,5,4,1}, {2,6,1,4,5}, {2,6,1,5,4}, {2,6,4,1,5}, {2,6,4,5,1}, {2,6,5,1,4}, {2,6,5,4,1}, {6,2,1,4,5}, {6,2,1,5,4}, {6,2,4,1,5}, {6,2,4,5,1}, {6,2,5,1,4}, {6,2,5,4,1}, {2,6,3,4,5}, {2,6,3,5,4}, {2,6,4,3,5}, {2,6,4,5,3}, {2,6,5,3,4}, {2,6,5,4,3}, {6,2,3,4,5}, {6,2,3,5,4}, {6,2,4,3,5}, {6,2,4,5,3}, {6,2,5,3,4}, {6,2,5,4,3}, {2,6,3,4,5}, {2,6,3,5,4}, {2,6,4,3,5}, {2,6,4,5,3}, {2,6,5,3,4}, {2,6,5,4,3}, {6,2,3,4,5}, {6,2,3,5,4}, {6,2,4,3,5}, {6,2,4,5,3}, {6,2,5,3,4}, {6,2,5,4,3}, {3,6,0,1,4}, {3,6,0,4,1}, {3,6,1,0,4}, {3,6,1,4,0}, {3,6,4,0,1}, {3,6,4,1,0}, {6,3,0,1,4}, {6,3,0,4,1}, {6,3,1,0,4}, {6,3,1,4,0}, {6,3,4,0,1}, {6,3,4,1,0}, {3,6,0,1,4}, {3,6,0,4,1}, {3,6,1,0,4}, {3,6,1,4,0}, {3,6,4,0,1}, {3,6,4,1,0}, {6,3,0,1,4}, {6,3,0,4,1}, {6,3,1,0,4}, {6,3,1,4,0}, {6,3,4,0,1}, {6,3,4,1,0}, {3,6,0,1,5}, {3,6,0,5,1}, {3,6,1,0,5}, {3,6,1,5,0}, {3,6,5,0,1}, {3,6,5,1,0}, {6,3,0,1,5}, {6,3,0,5,1}, {6,3,1,0,5}, {6,3,1,5,0}, {6,3,5,0,1}, {6,3,5,1,0}, {3,6,0,1,5}, {3,6,0,5,1}, {3,6,1,0,5}, {3,6,1,5,0}, {3,6,5,0,1}, {3,6,5,1,0}, {6,3,0,1,5}, {6,3,0,5,1}, {6,3,1,0,5}, {6,3,1,5,0}, {6,3,5,0,1}, {6,3,5,1,0}, {3,6,0,4,5}, {3,6,0,5,4}, {3,6,4,0,5}, {3,6,4,5,0}, {3,6,5,0,4}, {3,6,5,4,0}, {6,3,0,4,5}, {6,3,0,5,4}, {6,3,4,0,5}, {6,3,4,5,0}, {6,3,5,0,4}, {6,3,5,4,0}, {3,6,0,4,5}, {3,6,0,5,4}, {3,6,4,0,5}, {3,6,4,5,0}, {3,6,5,0,4}, {3,6,5,4,0}, {6,3,0,4,5}, {6,3,0,5,4}, {6,3,4,0,5}, {6,3,4,5,0}, {6,3,5,0,4}, {6,3,5,4,0}, {3,6,1,4,5}, {3,6,1,5,4}, {3,6,4,1,5}, {3,6,4,5,1}, {3,6,5,1,4}, {3,6,5,4,1}, {6,3,1,4,5}, {6,3,1,5,4}, {6,3,4,1,5}, {6,3,4,5,1}, {6,3,5,1,4}, {6,3,5,4,1}, {3,6,1,4,5}, {3,6,1,5,4}, {3,6,4,1,5}, {3,6,4,5,1}, {3,6,5,1,4}, {3,6,5,4,1}, {6,3,1,4,5}, {6,3,1,5,4}, {6,3,4,1,5}, {6,3,4,5,1}, {6,3,5,1,4}, {6,3,5,4,1} }; itemsize = 4*sizeof(int); Nwanted = sizeof(wanted4) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) { memcpy(flatwanted+i*4, wanted4[i], itemsize); //qsort(flatwanted+i*4, 2, sizeof(int), compare_ints_asc); //qsort(sorted+2, dimquad-2, sizeof(int), compare_ints_asc); } testit(flatwanted, Nwanted, 4, compare_quad, FALSE); free(flatwanted); itemsize = 5*sizeof(int); Nwanted = sizeof(wanted5) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) memcpy(flatwanted+i*5, wanted5[i], itemsize); testit(flatwanted, Nwanted, 5, compare_quint, FALSE); free(flatwanted); itemsize = 3*sizeof(int); Nwanted = sizeof(wanted3) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) memcpy(flatwanted+i*3, wanted3[i], itemsize); testit(flatwanted, Nwanted, 3, compare_tri, FALSE); free(flatwanted); int wanted3b[][3] = { {0,1,3}, {1,0,3}, {2,0,3}, {0,2,3}, {1,2,3}, {2,1,3}, {4,2,3}, {4,2,3}, {0,1,4}, {1,0,4}, {0,1,4}, {1,0,4}, {2,0,4}, {0,2,4}, {3,0,4}, {0,3,4}, {1,2,4}, {2,1,4}, {1,3,4}, {3,1,4}, {0,5,4}, {5,0,4}, {5,1,4}, {1,5,4}, {5,2,0}, {2,5,0}, {2,5,1}, {5,2,1}, {5,2,3}, {5,2,3}, {5,2,4}, {5,2,4}, {3,5,4}, {5,3,4}, {3,5,4}, {5,3,4}, {1,0,5}, {0,1,5}, {0,6,4}, {6,0,4}, {0,6,5}, {6,0,5}, {6,1,4}, {1,6,4}, {6,1,5}, {1,6,5}, {6,2,0}, {2,6,0}, {2,6,1}, {6,2,1}, {2,6,3}, {2,6,3}, {2,6,4}, {6,2,4}, {2,6,4}, {6,2,4}, {6,2,5}, {6,2,5}, {6,3,0}, {3,6,0}, {3,6,1}, {6,3,1}, {3,6,4}, {3,6,4}, {3,6,5}, {3,6,5}, {4,6,5}, {4,6,5} }; int wanted5b[][5] = { {5,2,0,3,1}, {5,2,1,3,0}, {5,2,0,4,1}, {5,2,1,4,0}, {5,2,0,4,3}, {5,2,4,3,0}, {5,2,4,3,1}, {5,2,1,4,3}, {0,1,3,4,5}, {1,0,5,4,3}, {0,1,5,4,3}, {1,0,3,4,5}, {2,6,1,3,0}, {2,6,0,3,1}, {2,6,1,4,0}, {6,2,0,4,1}, {2,6,0,4,1}, {6,2,1,4,0}, {6,2,0,5,1}, {6,2,1,5,0}, {6,2,0,4,3}, {2,6,0,3,4}, {6,2,0,5,3}, {2,6,0,3,5}, {6,2,0,5,4}, {2,6,0,4,5}, {2,6,1,3,4}, {6,2,1,4,3}, {2,6,1,3,5}, {6,2,1,5,3}, {2,6,1,4,5}, {6,2,1,5,4}, {2,6,3,4,5}, {6,2,5,4,3}, {2,6,3,4,5}, {6,2,5,4,3}, {3,6,1,4,0}, {3,6,0,4,1}, {3,6,1,5,0}, {3,6,0,5,1}, {3,6,4,5,0}, {3,6,0,4,5}, {3,6,1,4,5}, {3,6,4,5,1}, }; int wanted4b[][4] = { {0,1,3,4}, {1,0,3,4}, {2,0,3,4}, {0,2,4,3}, {1,2,4,3}, {2,1,3,4}, {5,2,0,1}, {5,2,1,0}, {5,2,0,3}, {2,5,0,3}, {5,2,3,0}, {5,2,0,4}, {5,2,4,0}, {2,5,1,3}, {5,2,3,1}, {5,2,1,3}, {5,2,4,1}, {5,2,1,4}, {5,2,4,3}, {5,2,4,3}, {0,1,3,5}, {1,0,5,3}, {0,1,5,3}, {1,0,3,5}, {1,0,5,4}, {0,1,5,4}, {0,6,4,5}, {6,0,5,4}, {6,1,5,4}, {1,6,4,5}, {2,6,1,0}, {6,2,0,1}, {2,6,0,1}, {6,2,1,0}, {6,2,0,3}, {2,6,0,3}, {6,2,0,4}, {2,6,0,4}, {6,2,0,5}, {2,6,0,5}, {2,6,1,3}, {6,2,1,3}, {2,6,1,4}, {6,2,1,4}, {2,6,1,5}, {6,2,1,5}, {2,6,3,4}, {2,6,3,4}, {2,6,3,5}, {6,2,5,3}, {2,6,3,5}, {6,2,5,3}, {6,2,5,4}, {6,2,5,4}, {3,6,1,0}, {3,6,0,1}, {3,6,4,0}, {3,6,0,4}, {3,6,5,0}, {6,3,0,5}, {3,6,0,5}, {3,6,1,4}, {3,6,4,1}, {3,6,1,5}, {3,6,5,1}, {6,3,1,5}, {3,6,4,5}, {3,6,4,5} }; itemsize = 4*sizeof(int); Nwanted = sizeof(wanted4b) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) { memcpy(flatwanted+i*4, wanted4b[i], itemsize); } testit(flatwanted, Nwanted, 4, compare_quad, TRUE); free(flatwanted); itemsize = 3*sizeof(int); Nwanted = sizeof(wanted3b) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) { memcpy(flatwanted+i*3, wanted3b[i], itemsize); } testit(flatwanted, Nwanted, 3, compare_tri, TRUE); free(flatwanted); itemsize = 5*sizeof(int); Nwanted = sizeof(wanted5b) / itemsize; flatwanted = calloc(Nwanted, itemsize); for (i=0; i<Nwanted; i++) { memcpy(flatwanted+i*5, wanted5b[i], itemsize); } testit(flatwanted, Nwanted, 5, compare_quint, TRUE); free(flatwanted); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test-solver.c�������������������������������������������������������������000644 �000765 �000024 �00000013337 12651445460 020320� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "solver.h" #include "index.h" #include "pquad.h" #include "permutedsort.h" #include "log.h" static int compare_n(const void* v1, const void* v2, int N) { const int* u1 = v1; const int* u2 = v2; int i; for (i=0; i<N; i++) { if (u1[i] < u2[i]) return -1; if (u1[i] > u2[i]) return 1; } return 0; } static int compare_tri(const void* v1, const void* v2) { return compare_n(v1, v2, 3); } static int compare_quad(const void* v1, const void* v2) { return compare_n(v1, v2, 4); } static int compare_quint(const void* v1, const void* v2) { return compare_n(v1, v2, 5); } bl* quadlist; void test_try_all_codes(pquad* pq, unsigned int* fieldstars, int dimquad, solver_t* solver, double tol2) { int sorted[dimquad]; int i; fflush(NULL); printf("test_try_all_codes: ["); for (i=0; i<dimquad; i++) { printf("%s%i", (i?" ":""), fieldstars[i]); } printf("]"); // sort AB and C[DE]... memcpy(sorted, fieldstars, dimquad * sizeof(int)); qsort(sorted, 2, sizeof(int), compare_ints_asc); qsort(sorted+2, dimquad-2, sizeof(int), compare_ints_asc); printf(" -> ["); for (i=0; i<dimquad; i++) { printf("%s%i", (i?" ":""), sorted[i]); } printf("]\n"); fflush(NULL); bl_append(quadlist, sorted); } static starxy_t* field1() { starxy_t* starxy; double field[14]; int i=0, N; // star0 A: (0,0) field[i++] = 0.0; field[i++] = 0.0; // star1 B: (2,2) field[i++] = 2.0; field[i++] = 2.0; // star2 field[i++] = -1.0; field[i++] = 3.0; // star3 field[i++] = 0.5; field[i++] = 1.5; // star4 field[i++] = 1.0; field[i++] = 1.0; // star5 field[i++] = 1.5; field[i++] = 0.5; // star6 field[i++] = 3.0; field[i++] = -1.0; N = i/2; starxy = starxy_new(N, FALSE, FALSE); for (i=0; i<N; i++) { starxy_setx(starxy, i, field[i*2+0]); starxy_sety(starxy, i, field[i*2+1]); } return starxy; } void test1() { int i; solver_t* solver; index_t index; starxy_t* starxy; int wanted[][4] = { { 0,1,3,4 }, { 0,2,3,4 }, { 1,2,3,4 }, { 2,5,0,1 }, { 2,5,0,3 }, { 2,5,0,4 }, { 2,5,1,3 }, { 2,5,1,4 }, { 2,5,3,4 }, { 0,1,3,5 }, { 0,1,4,5 }, { 0,6,4,5 }, { 1,6,4,5 }, { 2,6,0,1 }, { 2,6,0,3 }, { 2,6,0,4 }, { 2,6,0,5 }, { 2,6,1,3 }, { 2,6,1,4 }, { 2,6,1,5 }, { 2,6,3,4 }, { 2,6,3,5 }, { 2,6,4,5 }, { 3,6,0,1 }, { 3,6,0,4 }, { 3,6,0,5 }, { 3,6,1,4 }, { 3,6,1,5 }, { 3,6,4,5 }, }; starxy = field1(); quadlist = bl_new(16, 4*sizeof(uint)); solver = solver_new(); memset(&index, 0, sizeof(index_t)); index.index_scale_lower = 1; index.index_scale_upper = 10; index.dimquads = 4; solver->funits_lower = 0.1; solver->funits_upper = 10; solver_add_index(solver, &index); solver_set_field(solver, starxy); solver_preprocess_field(solver); solver_run(solver); solver_free_field(solver); solver_free(solver); // assert(bl_size(quadlist) == (sizeof(wanted) / (4*sizeof(uint)))); for (i=0; i<bl_size(quadlist); i++) { assert(compare_quad(bl_access(quadlist, i), wanted[i]) == 0); } bl_free(quadlist); } void test2() { int i; solver_t* solver; index_t index; starxy_t* starxy; int wanted[][3] = { { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 3, 4 }, { 0, 5, 4 }, { 0, 6, 4 }, { 0, 6, 5 }, { 1, 2, 3 }, { 1, 2, 4 }, { 1, 3, 4 }, { 1, 5, 4 }, { 1, 6, 4 }, { 1, 6, 5 }, { 2, 4, 3 }, { 2, 5, 0 }, { 2, 5, 1 }, { 2, 5, 3 }, { 2, 5, 4 }, { 2, 6, 0 }, { 2, 6, 1 }, { 2, 6, 3 }, { 2, 6, 4 }, { 2, 6, 5 }, { 3, 5, 4 }, { 3, 6, 0 }, { 3, 6, 1 }, { 3, 6, 4 }, { 3, 6, 5 }, { 4, 6, 5 }, }; starxy = field1(); quadlist = bl_new(16, 3*sizeof(uint)); solver = solver_new(); memset(&index, 0, sizeof(index_t)); index.index_scale_lower = 1; index.index_scale_upper = 10; index.dimquads = 3; solver->funits_lower = 0.1; solver->funits_upper = 10; solver_add_index(solver, &index); solver_set_field(solver, starxy); solver_preprocess_field(solver); solver_run(solver); solver_free_field(solver); solver_free(solver); // assert(bl_size(quadlist) == (sizeof(wanted) / (3*sizeof(uint)))); bl_sort(quadlist, compare_tri); for (i=0; i<bl_size(quadlist); i++) { assert(compare_tri(bl_access(quadlist, i), wanted[i]) == 0); } bl_free(quadlist); } char* OPTIONS = "v"; int main(int argc, char** args) { int argchar; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'v': log_init(LOG_ALL+1); break; } test1(); test2(); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_blindutils.c���������������������������������������������������������000644 �000765 �000024 �00000002421 12651445460 021231� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <stdlib.h> #include "cutest.h" #include "blindutils.h" #include "bl.h" static void assertListEquals(CuTest* tc, int* expect, int N, il* lst) { int i; CuAssertIntEquals(tc, N, il_size(lst)); for (i=0; i<N; i++) CuAssertIntEquals(tc, expect[i], il_get(lst, i)); } void test_depths(CuTest* tc) { il* lst = il_new(4); int rtn; { int e[] = { 1, 10, 11, 20, 21, 30, 31, 50, 51, 90}; int N = sizeof(e)/sizeof(int); rtn = parse_depth_string(lst, "10, 20, 30, 50, 90"); CuAssertIntEquals(tc, 0, rtn); assertListEquals(tc, e, N, lst); il_remove_all(lst); } { int e[] = { 1, 20, 42, 42, 90, 0 }; int N = sizeof(e)/sizeof(int); rtn = parse_depth_string(lst, "-20 42-42 90-"); CuAssertIntEquals(tc, 0, rtn); assertListEquals(tc, e, N, lst); il_remove_all(lst); } { int e[] = { 5, 10 }; int N = sizeof(e)/sizeof(int); rtn = parse_depth_string(lst, "5-10 "); CuAssertIntEquals(tc, 0, rtn); assertListEquals(tc, e, N, lst); il_remove_all(lst); } il_free(lst); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_codefile.c�����������������������������������������������������������000644 �000765 �000024 �00000002721 12651445460 020635� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stddef.h> #include "fitsbin.h" #include "fitsioutils.h" #include "codefile.h" #include "ioutils.h" #include "errors.h" #include "cutest.h" void test_codefile_big(CuTest* ct) { int i, d; int D = 4; int N = 250000000; double code[4]; double ecode[4]; codefile_t* cf; char* fn; fits_use_error_system(); fn = create_temp_file("test_codefile", NULL); cf = codefile_open_for_writing(fn); CuAssertPtrNotNull(ct, cf); CuAssertIntEquals(ct, 0, codefile_write_header(cf)); for (i=0; i<N; i++) { for (d=0; d<D; d++) { code[d] = i+d; } if (i % 1000000 == 0) printf("Writing %i\n", i); if (codefile_write_code(cf, code)) { ERROR("Failed to write code %i", i); exit(-1); } } if (codefile_fix_header(cf)) { ERROR("failed to fix header"); exit(-1); } if (codefile_close(cf)) { ERROR("Failed to close cf\n"); } printf("Wrote %s\n", fn); cf = codefile_open(fn); CuAssertPtrNotNull(ct, cf); for (i=0; i<N; i++) { for (d=0; d<D; d++) { ecode[d] = i+d; } codefile_get_code(cf, i, code); if (memcmp(ecode, code, sizeof(double) * 4)) { ERROR("Failed on code %i: expected %f,%f,%f,%f, got %f,%f,%f,%f\n", i, ecode[0], ecode[1], ecode[2], ecode[3], code[0], code[1], code[2], code[3]); exit(-1); } } if (codefile_close(cf)) { ERROR("Failed to close cf\n"); } } �����������������������������������������������astrometry.net-0.67/blind/test_dcen3x3_1.pgm��������������������������������������������������������000644 �000765 �000024 �00000000331 12651445460 021106� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������P5 # CREATOR: GIMP PNM Filter Version 1.1 15 11 255 72%"  53$ $(""  /8C0,*  ,llbZF8*0rQ) /PxǼQ+#/36DQR@+)+13/)%% #  32.)$  $(/5$  �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_matchfile.c����������������������������������������������������������000644 �000765 �000024 �00000007576 12651445460 021034� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <string.h> #include "cutest.h" #include "matchfile.h" #include "matchobj.h" #include "an-bool.h" #include "starutil.h" #define SAME(X) CuAssertIntEquals(tc, entry1.X, ein1->X) #define SAMEF(X) CuAssertDblEquals(tc, entry1.X, ein1->X, 1e-10) #define SAMESAME(X) CuAssertIntEquals(tc, 0, memcmp(ein1->X, entry1.X, sizeof(entry1.X))) void test_read_matchfile(CuTest* tc) { char* fn = "/tmp/test-matchfile-0"; MatchObj entry1; matchfile* out; matchfile* in; MatchObj* ein1; memset(&entry1, 0, sizeof(MatchObj)); entry1.quadno = 123456; entry1.star[0] = 4; entry1.star[1] = 42; entry1.star[2] = 420; entry1.star[3] = 4200; entry1.star[4] = 42000; entry1.field[0] = 5; entry1.field[1] = 53; entry1.field[2] = 530; entry1.field[3] = 5300; entry1.field[4] = 53000; entry1.ids[0] = 0x1234; entry1.ids[1] = 0x12341234; entry1.ids[2] = 0x123412341234ULL; entry1.ids[3] = 0x12341234123412ULL; entry1.ids[4] = 0x1234123412341234ULL; entry1.code_err = 1e-6; entry1.quadpix[0] = 1.0; entry1.quadpix[1] = 2.0; entry1.quadpix[2] = 3.0; entry1.quadpix[3] = 4.0; entry1.quadpix[4] = 5.0; entry1.quadpix[5] = 6.0; entry1.quadpix[6] = 7.0; entry1.quadpix[7] = 8.0; entry1.quadpix[8] = 9.0; entry1.quadpix[9] = 10.0; entry1.quadxyz[0] = 11.0; entry1.quadxyz[1] = 22.0; entry1.quadxyz[2] = 33.0; entry1.quadxyz[3] = 44.0; entry1.quadxyz[4] = 55.0; entry1.quadxyz[5] = 66.0; entry1.quadxyz[6] = 77.0; entry1.quadxyz[7] = 88.0; entry1.quadxyz[8] = 99.0; entry1.quadxyz[9] = 110.0; entry1.quadxyz[10] = 111.0; entry1.quadxyz[11] = 122.0; entry1.quadxyz[12] = 133.0; entry1.quadxyz[13] = 144.0; entry1.quadxyz[14] = 155.0; entry1.dimquads = 5; entry1.quad_npeers = 2; //entry1.noverlap = 10; entry1.nconflict = 1; entry1.nfield = 20; entry1.nindex = 100; entry1.logodds = 450.0; entry1.nagree = 1; //entry1.scale = 1e100; entry1.fieldnum = 7; entry1.fieldfile = 43; entry1.indexid = 604; entry1.healpix = 4; sprintf(entry1.fieldname, "%s", "Hello Kitty"); entry1.parity = TRUE; entry1.quads_tried = 600; entry1.quads_matched = 500; entry1.quads_scaleok = 400; entry1.nverified = 400; entry1.timeused = 4.05; matchobj_compute_derived(&entry1); out = matchfile_open_for_writing(fn); CuAssertPtrNotNull(tc, out); CuAssertIntEquals(tc, 0, matchfile_count(out)); CuAssertIntEquals(tc, 0, matchfile_write_headers(out)); CuAssertIntEquals(tc, 0, matchfile_write_match(out, &entry1)); CuAssertIntEquals(tc, 1, matchfile_count(out)); CuAssertIntEquals(tc, 0, matchfile_fix_headers(out)); CuAssertIntEquals(tc, 0, matchfile_close(out)); out = NULL; in = matchfile_open(fn); CuAssertPtrNotNull(tc, in); CuAssertIntEquals(tc, 1, matchfile_count(in)); ein1 = matchfile_read_match(in); CuAssertPtrNotNull(tc, ein1); SAME(quadno); SAMESAME(star); SAMESAME(field); SAMESAME(ids); SAMESAME(quadpix); SAMESAME(quadxyz); SAME(dimquads); SAME(quad_npeers); //SAME(noverlap); SAME(nconflict); SAME(nfield); SAME(nindex); SAME(nagree); SAME(wcs_valid); SAME(fieldnum); SAME(fieldfile); SAME(indexid); SAME(healpix); SAMESAME(fieldname); SAME(parity); SAME(quads_tried); SAME(quads_matched); SAME(quads_scaleok); SAME(objs_tried); SAME(nverified); SAMEF(timeused); SAMEF(radius); SAMEF(scale); SAMEF(logodds); SAMEF(code_err); SAMESAME(center); CuAssertIntEquals(tc, 0, memcmp(ein1, &entry1, sizeof(MatchObj))); CuAssertIntEquals(tc, 0, matchfile_close(in)); in = NULL; } ����������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_multiindex2.c��������������������������������������������������������000644 �000765 �000024 �00000004764 12651445460 021340� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include "cutest.h" #include "multiindex.h" #include "solver.h" #include "xylist.h" #include "bl.h" #include "log.h" #include "errors.h" /** fitscopy ~/DATA/tycho2-cut.fits"[RA<10 && DEC > 0 && DEC < 10]" t.fits build-index -i t.fits -o t10.index -P 10 -E -M -v -S mag build-index -1 t10.index -o t11.index -P 11 -E -M -v -S mag build-index -1 t10.index -o t12.index -P 12 -E -M -v -S mag fitsgetext -i t10.index -o t10.skdt -e 0 -e 7 -e 8 -e 9 -e 10 -e 11 -e 12 -e 13 fitsgetext -i t10.index -o t10.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 fitsgetext -i t11.index -o t11.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 fitsgetext -i t12.index -o t12.ind -e 0 -e 1 -e 2 -e 3 -e 4 -e 5 -e 6 make-wcs.py -r 5 -d 5 -s 3 -W 1000 -H 1000 t1.wcs query-starkd -o t10.rd -r 5 -d 5 -R 1.5 -t mag util/t10.skdt wcs-rd2xy -w t1.wcs -i t10.rd -o t1.xy solve-field --just-augment --scale-low 1 t1.xy --continue --width 1000 --height 1000 backend -c none -i 't1?.index' -v t1.axy (in util/ directory:) ../blind/test_multiindex2 */ void test_solve_multiindex(CuTest* ct) { sl* fns; multiindex_t* mi; int i; solver_t* s = NULL; starxy_t* field = NULL; MatchObj* mo = NULL; xylist_t* xy = NULL; log_init(LOG_VERB); fns = sl_new(4); sl_append(fns, "../util/t10.ind"); sl_append(fns, "../util/t11.ind"); sl_append(fns, "../util/t12.ind"); mi = multiindex_open("../util/t10.skdt", fns, 0); printf("Got %i indices\n", multiindex_n(mi)); for (i=0; i<multiindex_n(mi); i++) { index_t* ind = multiindex_get(mi, i); printf(" %i: %s, %i stars, %i quads (%g to %g arcmin)\n", i, ind->indexname, index_nquads(ind), index_nstars(ind), ind->index_scale_lower/60., ind->index_scale_upper/60.); } s = solver_new(); // 10.8 s->funits_lower = 5.0; s->funits_upper = 15.0; xy = xylist_open("../util/t1.xy"); if (!xy) { ERROR("Failed to open xylist\n"); CuFail(ct, "xylist"); } field = xylist_read_field(xy, NULL); solver_set_field(s, field); solver_set_field_bounds(s, 0, 1000, 0, 1000); for (i=0; i<multiindex_n(mi); i++) { index_t* ind = multiindex_get(mi, i); solver_add_index(s, ind); } solver_run(s); if (solver_did_solve(s)) { mo = solver_get_best_match(s); matchobj_print(mo, LOG_MSG); // HACK -- ugly!! verify_free_matchobj(mo); } xylist_close(xy); solver_cleanup_field(s); solver_free(s); multiindex_free(mi); sl_free2(fns); } ������������astrometry.net-0.67/blind/test_plotstuff.c����������������������������������������������������������000644 �000765 �000024 �00000004361 12651445460 021113� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <string.h> #include "cutest.h" #include "plotstuff.h" #include "plotfill.h" #include "plotxy.h" #include "plotimage.h" #include "log.h" #include "cairoutils.h" void test_plot_wcs1(CuTest* tc) { plot_args_t myargs; plot_args_t* pargs = &myargs; int W, H; plotxy_t* xy; //plotimage_t* img; log_init(LOG_VERB); W = H = 5; plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out1.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); plotstuff_output(pargs); plotstuff_free(pargs); // perfectly centered circle. plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out2.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); xy = plotstuff_get_config(pargs, "xy"); plot_xy_vals(xy, 3, 3); plotstuff_set_color(pargs, "white"); plotstuff_set_marker(pargs, "circle"); plotstuff_set_markersize(pargs, 1); plotstuff_run_command(pargs, "xy"); plotstuff_output(pargs); plotstuff_free(pargs); // perfectly centered circle. plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out3.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); xy = plotstuff_get_config(pargs, "xy"); plot_xy_vals(xy, 2, 2); plot_xy_set_offsets(xy, 0, 0); plotstuff_set_color(pargs, "white"); plotstuff_set_marker(pargs, "circle"); plotstuff_set_markersize(pargs, 1); plotstuff_run_command(pargs, "xy"); plotstuff_output(pargs); plotstuff_free(pargs); { unsigned char* img; int ww, hh; int i; img = cairoutils_read_png("test-out2.png", &ww, &hh); CuAssertPtrNotNull(tc, img); CuAssertIntEquals(tc, W, ww); CuAssertIntEquals(tc, H, hh); printf("image:\n"); for (i=0; i<W*H; i++) { printf("%02x ", (int)img[i*4]); if (i%W == (W-1)) printf("\n"); } printf("\n"); /* 00 00 00 00 00 00 80 e8 80 00 00 f3 44 f3 00 00 7c e8 7c 00 00 00 00 00 00 */ } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_plotstuff.py���������������������������������������������������������000644 �000765 �000024 �00000006032 12651445460 021316� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib if __name__ == '__main__': matplotlib.use('Agg') import unittest try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") import numpy as np import pylab as plt from math import pi,sqrt from astrometry.blind.plotstuff import * class TestPlotstuff(unittest.TestCase): def setUp(self): np.random.seed(42) def test_image_wcs(self): ''' Round-trip an image through a WCS. ''' W,H = 100,100 I = np.random.uniform(size=(H,W)) imfn = 'test-plotstuff-1.fits' pyfits.writeto(imfn, I, clobber=True) wcs = anwcs_create_box(43., 11., 1., W, H) anwcs_rotate_wcs(wcs, 32.) wcsfn = 'test-plotstuff-1.wcs' anwcs_write(wcs, wcsfn) plot = Plotstuff() plot.outformat = PLOTSTUFF_FORMAT_PNG plot.size = (W, H) plot.wcs_file = wcsfn plot.color = 'black' plot.plot('fill') im = plot.image plot_image_set_wcs(im, wcsfn, 0) im.image_high = 1. im.image_low = 0. plot_image_set_filename(im, imfn) plot.plot('image') plotfn = 'test-plotstuff-1.png' plot.write(plotfn) I2 = plt.imread(plotfn) print I2.shape I2 = I2[:,:,0] plt.clf() plt.subplot(2,2,1) plt.imshow(I, vmin=0, vmax=1) plt.subplot(2,2,2) plt.imshow(I2, vmin=0, vmax=1) plt.subplot(2,2,3) plt.imshow(I2 - I, vmin=-1, vmax=1) plt.savefig('test-plotstuff-1b.png') md = np.max(np.abs((I2-I).ravel())) print 'max diff', md self.assertTrue(md < 1./255.) def test_subpixel_image_wcs(self): ''' Create a well-sampled Gaussian test image, and push it through subpixel-shifted WCSes. ''' W,H = 100,100 X,Y = np.meshgrid(np.arange(W),np.arange(H)) s = 2. CX,CY = 32.4,42.3 I = 1./(2.*pi*s**2) * np.exp(((X-CX)**2 + (Y-CY)**2) / (-2*s**2)) I /= I.max() print 'I sum', I.sum() print 'I max', I.max() print 'first moment', np.mean(I * X) / np.mean(I), np.mean(I * Y) / np.mean(I) imfn = 'test-plotstuff-2.fits' pyfits.writeto(imfn, I, clobber=True) wcs = anwcs_create_box(43., 11., 1., W, H) anwcs_rotate_wcs(wcs, 32.) wcsfn = 'test-plotstuff-2.wcs' anwcs_write(wcs, wcsfn) plot = Plotstuff() plot.outformat = PLOTSTUFF_FORMAT_PNG plot.size = (W, H) plot.wcs_file = wcsfn plot.color = 'black' plot.plot('fill') im = plot.image plot_image_set_wcs(im, wcsfn, 0) im.image_high = I.max() im.image_low = 0. plot_image_set_filename(im, imfn) plot.plot('image') plotfn = 'test-plotstuff-2.png' plot.write(plotfn) I2 = plt.imread(plotfn) print I2.shape I2 = I2[:,:,0] plt.clf() plt.subplot(2,2,1) plt.imshow(I, vmin=0, vmax=I.max()) plt.subplot(2,2,2) plt.imshow(I2, vmin=0, vmax=1) plt.subplot(2,2,3) plt.imshow(I2 - I, vmin=-1, vmax=1) plt.savefig('test-plotstuff-2b.png') md = np.max(np.abs((I2-I).ravel())) print 'max diff', md self.assertTrue(md < 1./255.) if __name__ == '__main__': unittest.main() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_plotstuff2.py��������������������������������������������������������000644 �000765 �000024 �00000007146 12651445460 021407� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib if __name__ == '__main__': matplotlib.use('Agg') import unittest try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from astrometry.util.fits import * from astrometry.blind.plotstuff import * import numpy as np import pylab as plt from math import pi,sqrt class TestPlotstuff2(unittest.TestCase): def testSubpixelShift(self): W,H = 100,100 cx,cy = 34.2, 56.7 X,Y = np.meshgrid(np.arange(W), np.arange(H)) S = 2. G = 1./(2.*pi*S**2) * np.exp(-((X-cx)**2+(Y-cy)**2)/(2.*S**2)) #G /= G.max() print G.sum() print np.sum(G*X), np.sum(G*Y) imfn = 'test-plotstuff-2.fits' pyfits.writeto(imfn, G, clobber=True) wcs = anwcs_create_box(33.5, 10.4, 1., W, H) anwcs_rotate_wcs(wcs, 25.) wcsfn = 'test-plotstuff-2.wcs' anwcs_write(wcs, wcsfn) plot = Plotstuff() plot.outformat = PLOTSTUFF_FORMAT_PNG plot.size = (W,H) plot.wcs_file = wcsfn plot.color = 'black' plot.plot('fill') im = plot.image im.image_low = 0 im.image_high = G.max() plot_image_set_wcs(im, wcsfn, 0) plot_image_set_filename(im, imfn) plot.plot('image') plotfn = 'test-plotstuff-2.png' plot.write(plotfn) I = plt.imread(plotfn) I = I[:,:,0] sx,sy = (I*X).sum()/I.sum(), (I*Y).sum()/I.sum() print sx,sy ex,ey = cx,cy self.assertTrue(abs(sx-ex) < 0.1) self.assertTrue(abs(sy-ey)< 0.1) # Shift the plot's WCS CRPIX. dx = 0.25 dy = 0.3 sip = anwcs_get_sip(wcs) tan = sip.wcstan plotstuff_set_wcs(plot.pargs, wcs) xy = plot.xy plot_xy_set_wcs_filename(xy, wcsfn) plot.marker = 'crosshair' # Move the plot WCS origin for step in range(16): if step < 8: tan.set_crpix(tan.crpix[0]+dx, tan.crpix[1]) ex += dx else: tan.set_crpix(tan.crpix[0], tan.crpix[1]+dy) ey += dy #anwcs_print_stdout(wcs) plot.color = 'black' plot.plot('fill') plot.plot('image') plotfn = 'test-plotstuff-2b%i.png' % step plot.write(plotfn) #anwcs_write(plot.pargs.wcs, 'test-plotstuff-2b.wcs') I = plt.imread(plotfn) I = I[:,:,0] sx,sy = (I*X).sum()/I.sum(), (I*Y).sum()/I.sum() print sx,sy print ex,ey self.assertTrue(abs(sx-ex) < 0.1) self.assertTrue(abs(sy-ey) < 0.1) plot.color = 'red' plot_xy_clear_list(xy) # don't plot at sx,sy / ex,ey -- original image coords # are unchanged. plot_xy_vals(xy, cx+1, cy+1) plot.plot('xy') plotfn = 'test-plotstuff-2c%i.png' % step plot.write(plotfn) # visual check that plot xy symbols match source centroid -- yes # Scan image WCS in RA,Dec; check that recovered source position # through plot WCS matches. # reset... plot.wcs_file = wcsfn plotwcs = anwcs_open(wcsfn, 0) wcs = anwcs_open(wcsfn, 0) im.wcs = wcs sip = anwcs_get_sip(wcs) tan = sip.wcstan ddec = 1.2 * 1./W ok,era,edec = anwcs_pixelxy2radec(wcs, cx, cy) print era,edec for step in range(16): tan.set_crval(tan.crval[0], tan.crval[1] + ddec) edec += ddec plot.color = 'black' plot.plot('fill') plot.plot('image') plotfn = 'test-plotstuff-2d%i.png' % step plot.write(plotfn) I = plt.imread(plotfn) I = I[:,:,0] sx,sy = (I*X).sum()/I.sum(), (I*Y).sum()/I.sum() #print sx,sy ok,ra,dec = anwcs_pixelxy2radec(plotwcs, sx, sy) #print era,edec #print ra,dec print 'dRA,dDec', ra-era, dec-edec self.assertTrue(abs(ra-era) < 1e-4) self.assertTrue(abs(dec-edec) < 1e-4) if __name__ == '__main__': unittest.main() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_resort-xylist.c������������������������������������������������������000644 �000765 �000024 �00000003650 12651445460 021735� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cutest.h" #include "xylist.h" #include "starxy.h" #include "resort-xylist.h" void test_sorting(CuTest* tc) { double flux[] = { 50, 100, 50, 100, 20, 20, 40, 40 }; double bg[] = { 0, 10, 10, 0, 10, 0, 5, 0 }; int trueorder[] = { 4, 5, 7, 6, 2, 0, 1, 3 }; int i, N; starxy_t* s; char* infn = "/tmp/test-resort-xylist"; char* outfn = "/tmp/test-resort-xylist-out"; xylist_t* xy; xylist_t* xy2; starxy_t* s2; xy = xylist_open_for_writing(infn); CuAssertPtrNotNull(tc, xy); xylist_set_include_flux(xy, TRUE); xylist_set_include_background(xy, TRUE); if (xylist_write_primary_header(xy) || xylist_write_header(xy)) { CuFail(tc, "write header"); } N = sizeof(flux) / sizeof(double); s = starxy_new(N, TRUE, TRUE); for (i=0; i<N; i++) { starxy_setx(s, i, random()%1000); starxy_sety(s, i, random()%1000); } starxy_set_flux_array(s, flux); starxy_set_bg_array(s, bg); if (xylist_write_field(xy, s) || xylist_fix_header(xy) || xylist_fix_primary_header(xy) || xylist_close(xy)) { CuFail(tc, "close xy"); } CuAssertIntEquals(tc, 0, resort_xylist(infn, outfn, NULL, NULL, TRUE)); xy2 = xylist_open(outfn); s2 = xylist_read_field(xy2, NULL); CuAssertPtrNotNull(tc, s2); CuAssertPtrNotNull(tc, s2->x); CuAssertPtrNotNull(tc, s2->y); CuAssertPtrNotNull(tc, s2->flux); CuAssertPtrNotNull(tc, s2->background); for (i=0; i<N; i++) { fflush(NULL); printf("Testing point %i\n", i); fflush(NULL); CuAssertDblEquals(tc, s->x[trueorder[i]], s2->x[i], 1e-6); CuAssertDblEquals(tc, s->y[trueorder[i]], s2->y[i], 1e-6); CuAssertDblEquals(tc, s->flux[trueorder[i]], s2->flux[i], 1e-6); CuAssertDblEquals(tc, s->background[trueorder[i]], s2->background[i], 1e-6); } } ����������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_tweak.c��������������������������������������������������������������000644 �000765 �000024 �00000037273 12651445460 020210� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <math.h> #include <stdio.h> #include <string.h> #include <stdarg.h> #include <stdlib.h> #include "cutest.h" #include "tweak.h" #include "sip.h" #include "sip-utils.h" #include "log.h" #define GAUSSIAN_SAMPLE_INVALID -1e300 static double uniform_sample(double low, double high) { if (low == high) return low; return low + (high - low)*((double)rand() / (double)RAND_MAX); } static double gaussian_sample(double mean, double stddev) { // from http://www.taygeta.com/random/gaussian.html // Algorithm by Dr. Everett (Skip) Carter, Jr. static double y2 = GAUSSIAN_SAMPLE_INVALID; double x1, x2, w, y1; // this algorithm generates random samples in pairs; the INVALID // jibba-jabba stores the second value until the next time the // function is called. if (y2 != GAUSSIAN_SAMPLE_INVALID) { y1 = y2; y2 = GAUSSIAN_SAMPLE_INVALID; return mean + y1 * stddev; } do { x1 = uniform_sample(-1, 1); x2 = uniform_sample(-1, 1); w = x1 * x1 + x2 * x2; } while ( w >= 1.0 ); w = sqrt( (-2.0 * log(w)) / w ); y1 = x1 * w; y2 = x2 * w; return mean + y1 * stddev; } static void set_grid(int GX, int GY, tan_t* tan, sip_t* sip, double* tanxy, double* radec, double* xy, double* gridx, double* gridy) { int i, j; if (GX == 1) gridx[0] = 0.5 + 0.5 * tan->imagew; else for (i=0; i<GX; i++) gridx[i] = 0.5 + i * tan->imagew / (GX-1); if (GY == 1) gridy[0] = 0.5 + 0.5 * tan->imageh; else for (i=0; i<GY; i++) gridy[i] = 0.5 + i * tan->imageh / (GY-1); for (i=0; i<GY; i++) for (j=0; j<GX; j++) { double ra, dec, x, y; // Lay down the grid in (measured, distorted) CCD space x = xy[2*(i*GX+j) + 0] = gridx[j]; y = xy[2*(i*GX+j) + 1] = gridy[i]; sip_pixelxy2radec(sip, x, y, &ra, &dec); if(!tan_radec2pixelxy(tan, ra, dec, &x, &y)) perror("tan_radec2pixelxy==FALSE"); tanxy[2*(i*GX+j) + 0] = x; tanxy[2*(i*GX+j) + 1] = y; radec[2*(i*GX+j) + 0] = ra; radec[2*(i*GX+j) + 1] = dec; } } static sip_t* run_test(CuTest* tc, sip_t* sip, int N, double* xy, double* radec) { int i; starxy_t* sxy; tweak_t* t; sip_t* outsip; il* imcorr; il* refcorr; dl* weights; tan_t* tan = &(sip->wcstan); printf("Input SIP:\n"); sip_print_to(sip, stdout); fflush(NULL); sxy = starxy_new(N, FALSE, FALSE); starxy_set_xy_array(sxy, xy); imcorr = il_new(256); refcorr = il_new(256); weights = dl_new(256); for (i=0; i<N; i++) { il_append(imcorr, i); il_append(refcorr, i); dl_append(weights, 1.0); } t = tweak_new(); tweak_push_wcs_tan(t, tan); outsip = t->sip; outsip->a_order = outsip->b_order = sip->a_order; outsip->ap_order = outsip->bp_order = sip->ap_order; t->weighted_fit = TRUE; tweak_push_ref_ad_array(t, radec, N); tweak_push_image_xy(t, sxy); tweak_push_correspondence_indices(t, imcorr, refcorr, NULL, weights); tweak_skip_shift(t); // push correspondences // push image xy // push ref ra,dec // push ref xy (tan) // push tan tweak_go_to(t, TWEAK_HAS_LINEAR_CD); printf("Output SIP:\n"); sip_print_to(outsip, stdout); CuAssertDblEquals(tc, tan->imagew, outsip->wcstan.imagew, 1e-10); CuAssertDblEquals(tc, tan->imageh, outsip->wcstan.imageh, 1e-10); // should be exactly equal. CuAssertDblEquals(tc, tan->crpix[0], outsip->wcstan.crpix[0], 1e-10); CuAssertDblEquals(tc, tan->crpix[1], outsip->wcstan.crpix[1], 1e-10); t->sip = NULL; tweak_free(t); starxy_free(sxy); return outsip; } void test_tweak_1(CuTest* tc) { int GX = 5; int GY = 5; double origxy[GX*GY*2]; double xy[GX*GY*2]; double radec[GX*GY*2]; double gridx[GX]; double gridy[GY]; sip_t thesip; sip_t* sip = &thesip; tan_t* tan = &(sip->wcstan); int i; sip_t* outsip; printf("\ntest_tweak_1\n\n"); log_init(LOG_VERB); memset(sip, 0, sizeof(sip_t)); tan->imagew = 2000; tan->imageh = 2000; tan->crval[0] = 150; tan->crval[1] = -30; tan->crpix[0] = 1000.5; tan->crpix[1] = 1000.5; tan->cd[0][0] = 1./1000.; tan->cd[0][1] = 0; tan->cd[1][1] = 1./1000.; tan->cd[1][0] = 0; sip->a_order = sip->b_order = 2; sip->a[2][0] = 10.*1e-6; sip->ap_order = sip->bp_order = 4; sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); /* printf("After compute_inverse_polynomials:\n"); sip_print_to(sip, stdout); fflush(NULL); */ set_grid(GX, GY, tan, sip, origxy, radec, xy, gridx, gridy); /*{ int i,j; printf("RA,Dec\n"); for (i=0; i<GY; i++) { for (j=0; j<GX; j++) { fflush(NULL); printf("gy %i gyx %i: %g %g\n", i, j, radec[2*(i*GX+j)], radec[2*(i*GX+j) + 1]); fflush(NULL); } } }*/ outsip = run_test(tc, sip, GX*GY, xy, radec); CuAssertDblEquals(tc, tan->crval[0], outsip->wcstan.crval[0], 1e-6); CuAssertDblEquals(tc, tan->crval[1], outsip->wcstan.crval[1], 1e-6); CuAssertDblEquals(tc, tan->cd[0][0], outsip->wcstan.cd[0][0], 1e-10); CuAssertDblEquals(tc, tan->cd[0][1], outsip->wcstan.cd[0][1], 1e-14); CuAssertDblEquals(tc, tan->cd[1][0], outsip->wcstan.cd[1][0], 1e-14); CuAssertDblEquals(tc, tan->cd[1][1], outsip->wcstan.cd[1][1], 1e-10); double *d1, *d2; d1 = (double*)outsip->a; d2 = (double*)&(sip->a); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-13); d1 = (double*)outsip->b; d2 = (double*)&(sip->b); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) { printf("test_tweak_1: Expecting %.18g, got %.18g\n", d2[i], d1[i]); fflush(NULL); CuAssertDblEquals(tc, d2[i], d1[i], 3e-18); } d1 = (double*)outsip->ap; d2 = (double*)&(sip->ap); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-10); d1 = (double*)outsip->bp; d2 = (double*)&(sip->bp); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-10); CuAssertIntEquals(tc, sip->a_order, outsip->a_order); CuAssertIntEquals(tc, sip->b_order, outsip->b_order); CuAssertIntEquals(tc, sip->ap_order, outsip->ap_order); CuAssertIntEquals(tc, sip->bp_order, outsip->bp_order); } static void tst_tweak_n(CuTest* tc, int run, int GX, int GY) { double origxy[GX*GY*2]; double xy[GX*GY*2]; double noisyxy[GX*GY*2]; double radec[GX*GY*2]; double gridx[GX]; double gridy[GY]; sip_t thesip; sip_t* sip = &thesip; tan_t* tan = &(sip->wcstan); int i,j; sip_t* outsip; printf("\ntest_tweak_%i\n\n", run); log_init(LOG_VERB); memset(sip, 0, sizeof(sip_t)); tan->imagew = 2000; tan->imageh = 2000; tan->crval[0] = 150; tan->crval[1] = -30; tan->crpix[0] = 1000.5; tan->crpix[1] = 1000.5; tan->cd[0][0] = 1./1000.; tan->cd[0][1] = 0; tan->cd[1][1] = 1./1000.; tan->cd[1][0] = 0; sip->a_order = sip->b_order = 2; sip->a[2][0] = 10.*1e-6; sip->b[0][2] = -10.*1e-6; sip->ap_order = sip->bp_order = 4; sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); set_grid(GX, GY, tan, sip, origxy, radec, xy, gridx, gridy); // add noise to observed xy positions. srand(42); for (i=0; i<(GX*GY*2); i++) { noisyxy[i] = xy[i] + gaussian_sample(0.0, 1.0); } fprintf(stderr, "from numpy import array\n"); fprintf(stderr, "x0,y0 = %g,%g\n", tan->crpix[0], tan->crpix[1]); fprintf(stderr, "gridx_%i=array([", run); for (i=0; i<GX; i++) fprintf(stderr, "%g, ", gridx[i]); fprintf(stderr, "])\n"); fprintf(stderr, "gridy_%i=array([", run); for (i=0; i<GY; i++) fprintf(stderr, "%g, ", gridy[i]); fprintf(stderr, "])\n"); fprintf(stderr, "origxy_%i = array([", run); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", origxy[2*i+0], origxy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "xy_%i = array([", run); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", xy[2*i+0], xy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "noisyxy_%i = array([", run); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", noisyxy[2*i+0], noisyxy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "truesip_a_%i = array([", run); for (i=0; i<=sip->a_order; i++) for (j=0; j<=sip->a_order; j++) if (sip->a[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, sip->a[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "truesip_b_%i = array([", run); for (i=0; i<=sip->a_order; i++) for (j=0; j<=sip->a_order; j++) if (sip->b[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, sip->b[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "sip_a_%i = {}\n", run); fprintf(stderr, "sip_b_%i = {}\n", run); int o; for (o=2; o<6; o++) { sip->a_order = o; outsip = run_test(tc, sip, GX*GY, noisyxy, radec); fprintf(stderr, "sip_a_%i[%i] = array([", run, o); for (i=0; i<=outsip->a_order; i++) for (j=0; j<=outsip->a_order; j++) if (outsip->a[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, outsip->a[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "sip_b_%i[%i] = array([", run, o); for (i=0; i<=outsip->a_order; i++) for (j=0; j<=outsip->a_order; j++) if (outsip->b[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, outsip->b[i][j]); fprintf(stderr, "])\n"); } sip->a_order = 2; outsip = run_test(tc, sip, GX*GY, noisyxy, radec); CuAssertDblEquals(tc, tan->crval[0], outsip->wcstan.crval[0], 1e-3); CuAssertDblEquals(tc, tan->crval[1], outsip->wcstan.crval[1], 1e-3); CuAssertDblEquals(tc, tan->cd[0][0], outsip->wcstan.cd[0][0], 1e-6); CuAssertDblEquals(tc, tan->cd[0][1], outsip->wcstan.cd[0][1], 1e-6); CuAssertDblEquals(tc, tan->cd[1][0], outsip->wcstan.cd[1][0], 1e-6); CuAssertDblEquals(tc, tan->cd[1][1], outsip->wcstan.cd[1][1], 1e-6); if (run == 2) { double *d1, *d2; d1 = (double*)outsip->a; d2 = (double*)&(sip->a); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) // rather large error, no? CuAssertDblEquals(tc, d2[i], d1[i], 6e-7); d1 = (double*)outsip->b; d2 = (double*)&(sip->b); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) { printf("test_tweak_2, run 2: Expecting %.18g, got %.18g\n", d2[i], d1[i]); fflush(NULL); CuAssertDblEquals(tc, d2[i], d1[i], 3e-7); } d1 = (double*)outsip->ap; d2 = (double*)&(sip->ap); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-6); d1 = (double*)outsip->bp; d2 = (double*)&(sip->bp); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-6); CuAssertIntEquals(tc, sip->a_order, outsip->a_order); CuAssertIntEquals(tc, sip->b_order, outsip->b_order); CuAssertIntEquals(tc, sip->ap_order, outsip->ap_order); CuAssertIntEquals(tc, sip->bp_order, outsip->bp_order); } else if (run == 3) { double *d1, *d2; d1 = (double*)outsip->a; d2 = (double*)&(sip->a); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) { // rather large error, no? printf("test_tweak_2, run 3: Expecting %.18g, got %.18g\n", d2[i], d1[i]); fflush(NULL); CuAssertDblEquals(tc, d2[i], d1[i], 7e-7); } d1 = (double*)outsip->b; d2 = (double*)&(sip->b); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) { printf("test_tweak_2, run 3b: Expecting %.18g, got %.18g\n", d2[i], d1[i]); fflush(NULL); CuAssertDblEquals(tc, d2[i], d1[i], 2e-6); } d1 = (double*)outsip->ap; d2 = (double*)&(sip->ap); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-6); d1 = (double*)outsip->bp; d2 = (double*)&(sip->bp); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) { printf("test_tweak_2, run 3c: Expecting %.18g, got %.18g\n", d2[i], d1[i]); fflush(NULL); CuAssertDblEquals(tc, d2[i], d1[i], 2e-6); } CuAssertIntEquals(tc, sip->a_order, outsip->a_order); CuAssertIntEquals(tc, sip->b_order, outsip->b_order); CuAssertIntEquals(tc, sip->ap_order, outsip->ap_order); CuAssertIntEquals(tc, sip->bp_order, outsip->bp_order); } } /* void tst_tweak_3(CuTest* tc) { int GX = 11; int GY = 1; double origxy[GX*GY*2]; double xy[GX*GY*2]; double noisyxy[GX*GY*2]; double radec[GX*GY*2]; double gridx[GX]; double gridy[GY]; sip_t thesip; sip_t* sip = &thesip; tan_t* tan = &(sip->wcstan); int i,j; sip_t* outsip; printf("\ntest_tweak_3\n\n"); log_init(LOG_VERB); memset(sip, 0, sizeof(sip_t)); tan->imagew = 2000; tan->imageh = 2000; tan->crval[0] = 150; tan->crval[1] = -30; tan->crpix[0] = 1000.5; tan->crpix[1] = 1000.5; tan->cd[0][0] = 1./1000.; tan->cd[0][1] = 0; tan->cd[1][1] = 1./1000.; tan->cd[1][0] = 0; sip->a_order = sip->b_order = 2; sip->a[2][0] = 10.*1e-6; sip->ap_order = sip->bp_order = 4; sip_compute_inverse_polynomials(sip, 0, 0, 0, 0, 0, 0); set_grid(GX, GY, tan, sip, origxy, radec, xy, gridx, gridy); // add noise to observed y positions only. srand(42); for (i=0; i<(GX*GY); i++) { noisyxy[2*i+0] = xy[2*i+0]; noisyxy[2*i+1] = xy[2*i+1] + gaussian_sample(0.0, 1.0); } outsip = run_test(tc, sip, GX*GY, noisyxy, radec); fprintf(stderr, "gridx_3=array(["); for (i=0; i<GX; i++) fprintf(stderr, "%g, ", gridx[i]); fprintf(stderr, "])\n"); fprintf(stderr, "gridy_3=array(["); for (i=0; i<GY; i++) fprintf(stderr, "%g, ", gridy[i]); fprintf(stderr, "])\n"); fprintf(stderr, "origxy_3 = array(["); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", origxy[2*i+0], origxy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "xy_3 = array(["); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", xy[2*i+0], xy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "noisyxy_3 = array(["); for (i=0; i<(GX*GY); i++) fprintf(stderr, "[%g,%g],", noisyxy[2*i+0], noisyxy[2*i+1]); fprintf(stderr, "])\n"); fprintf(stderr, "truesip_a_3 = array(["); for (i=0; i<=sip->a_order; i++) for (j=0; j<=sip->a_order; j++) if (sip->a[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, sip->a[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "truesip_b_3 = array(["); for (i=0; i<=sip->a_order; i++) for (j=0; j<=sip->a_order; j++) if (sip->b[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, sip->b[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "sip_a_3 = array(["); for (i=0; i<=outsip->a_order; i++) for (j=0; j<=outsip->a_order; j++) if (outsip->a[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, outsip->a[i][j]); fprintf(stderr, "])\n"); fprintf(stderr, "sip_b_3 = array(["); for (i=0; i<=outsip->a_order; i++) for (j=0; j<=outsip->a_order; j++) if (outsip->b[i][j] != 0) fprintf(stderr, "[%i,%i,%g],", i, j, outsip->b[i][j]); fprintf(stderr, "])\n"); CuAssertDblEquals(tc, tan->crval[0], outsip->wcstan.crval[0], 1e-3); CuAssertDblEquals(tc, tan->crval[1], outsip->wcstan.crval[1], 1e-3); CuAssertDblEquals(tc, tan->cd[0][0], outsip->wcstan.cd[0][0], 1e-6); CuAssertDblEquals(tc, tan->cd[0][1], outsip->wcstan.cd[0][1], 1e-6); CuAssertDblEquals(tc, tan->cd[1][0], outsip->wcstan.cd[1][0], 1e-6); CuAssertDblEquals(tc, tan->cd[1][1], outsip->wcstan.cd[1][1], 1e-6); double *d1, *d2; d1 = (double*)outsip->a; d2 = (double*)&(sip->a); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) // rather large error, no? CuAssertDblEquals(tc, d2[i], d1[i], 6e-7); d1 = (double*)outsip->b; d2 = (double*)&(sip->b); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 2e-7); d1 = (double*)outsip->ap; d2 = (double*)&(sip->ap); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-6); d1 = (double*)outsip->bp; d2 = (double*)&(sip->bp); for (i=0; i<(SIP_MAXORDER * SIP_MAXORDER); i++) CuAssertDblEquals(tc, d2[i], d1[i], 1e-6); CuAssertIntEquals(tc, sip->a_order, outsip->a_order); CuAssertIntEquals(tc, sip->b_order, outsip->b_order); CuAssertIntEquals(tc, sip->ap_order, outsip->ap_order); CuAssertIntEquals(tc, sip->bp_order, outsip->bp_order); } */ void test_tweak_2(CuTest* tc) { tst_tweak_n(tc, 2, 11, 11); tst_tweak_n(tc, 3, 5, 5); } void test_tchebytweak(CuTest* tc) { } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/test_tweak_plots.py�������������������������������������������������������000644 �000765 �000024 �00000007714 12651445460 021634� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import matplotlib matplotlib.use('Agg') import os.path from pylab import * from numpy import * # test_tweak 2>tt.py import tt def savefig(fn): from pylab import savefig as sf print 'Saving', fn sf(fn) if __name__ == '__main__': #print 'me:', __file__ #tt = os.path.join(os.path.dirname(__file__), 'test_tweak') for run in [2,3]: tanxy = getattr(tt, 'origxy_%i' % run) xy = getattr(tt, 'xy_%i' % run) noisyxy = getattr(tt, 'noisyxy_%i' % run) gridx = getattr(tt, 'gridx_%i' % run) gridy = getattr(tt, 'gridy_%i' % run) truesip_a = getattr(tt, 'truesip_a_%i' % run) truesip_b = getattr(tt, 'truesip_b_%i' % run) sip_a = getattr(tt, 'sip_a_%i' % run) sip_b = getattr(tt, 'sip_b_%i' % run) x0,y0 = tt.x0, tt.y0 truedxy = xy - tanxy obsdxy = noisyxy - tanxy xlo,xhi = -500, 2500 ylo,yhi = -500, 2500 X1 = linspace(xlo, xhi, 100) Y1 = gridy X1,Y1 = meshgrid(X1,Y1) X1 = X1.T Y1 = Y1.T X2 = gridx Y2 = linspace(ylo, yhi, 100) X2,Y2 = meshgrid(X2,Y2) truesipx_x = zeros_like(X1) truesipy_x = zeros_like(X1) truesipx_y = zeros_like(Y2) truesipy_y = zeros_like(Y2) for xo,yo,c in truesip_a: truesipx_y += c * (X2 - x0)**xo * (Y2 - y0)**yo truesipx_x += c * (X1 - x0)**xo * (Y1 - y0)**yo for xo,yo,c in truesip_b: truesipy_y += c * (X2 - x0)**xo * (Y2 - y0)**yo truesipy_x += c * (X1 - x0)**xo * (Y1 - y0)**yo x = xy[:,0] y = xy[:,1] truedx = truedxy[:,0] truedy = truedxy[:,1] obsdx = obsdxy[:,0] obsdy = obsdxy[:,1] for order in range(2,6): clf() sipx_x = zeros_like(X1) sipy_x = zeros_like(X1) sipx_y = zeros_like(Y2) sipy_y = zeros_like(Y2) for xo,yo,c in sip_a[order]: sipx_y += c * (X2 - x0)**xo * (Y2 - y0)**yo sipx_x += c * (X1 - x0)**xo * (Y1 - y0)**yo for xo,yo,c in sip_b[order]: sipy_y += c * (X2 - x0)**xo * (Y2 - y0)**yo sipy_x += c * (X1 - x0)**xo * (Y1 - y0)**yo subplot(2,2,1) plot(x, truedx, 'bs', mec='b', mfc='None') plot(x, obsdx, 'r.') plot(X1, -truesipx_x, 'b-', alpha=0.2) plot(X1, -sipx_x, 'r-', alpha=0.2) xlabel('x') ylabel('dx') xlim(xlo, xhi) subplot(2,2,2) plot(x, truedy, 'bs', mec='b', mfc='None') plot(x, obsdy, 'r.') plot(X1, -truesipy_x, 'b-', alpha=0.2) plot(X1, -sipy_x, 'r-', alpha=0.2) xlabel('x') ylabel('dy') xlim(xlo, xhi) subplot(2,2,3) plot(y, truedx, 'bs', mec='b', mfc='None') plot(y, obsdx, 'r.') plot(Y2, -truesipx_y, 'b-', alpha=0.2) plot(Y2, -sipx_y, 'r-', alpha=0.2) xlabel('y') ylabel('dx') xlim(xlo, xhi) subplot(2,2,4) plot(y, truedy, 'bs', mec='b', mfc='None') plot(y, obsdy, 'r.') plot(Y2, -truesipy_y, 'b-', alpha=0.2) plot(Y2, -sipy_y, 'r-', alpha=0.2) xlabel('y') ylabel('dy') xlim(xlo, xhi) savefig('tt%i-%i.png' % (run, order)) clf() subplot(111) plot(tanxy[:,0], tanxy[:,1], 'b.') plot(noisyxy[:,0], noisyxy[:,1], 'r.') plot(xy[:,0], xy[:,1], 'bo', mec='b', mfc='None') if False: X3,Y3 = meshgrid(linspace(xlo, xhi, 11), linspace(ylo, yhi, 11)) truesipx = X3 truesipy = Y3 for xo,yo,c in truesip_a: truesipx += c * (X3 - x0)**xo * (Y3 - y0)**yo for xo,yo,c in truesip_b: truesipy += c * (X3 - x0)**xo * (Y3 - y0)**yo sipx = X3 sipy = Y3 for xo,yo,c in sip_a[order]: sipx += c * (X3 - x0)**xo * (Y3 - y0)**yo for xo,yo,c in sip_b[order]: sipy += c * (X3 - x0)**xo * (Y3 - y0)**yo plot(truesipx, truesipy, 'bs', mec='b', mfc='None') plot(sipx, sipy, 'ms', mec='m', mfc='None') plot(X1, Y1, 'g-', alpha=0.25) plot(X2, Y2, 'g-', alpha=0.25) plot(truesipx_x + X1, truesipy_x + Y1, 'b-', alpha=0.25) plot(truesipx_y + X2, truesipy_y + Y2, 'b-', alpha=0.25) plot(sipx_x + X1, sipy_x + Y1, 'r-', alpha=0.25) plot(sipx_y + X2, sipy_y + Y2, 'r-', alpha=0.25) xlim(xlo,xhi) ylim(ylo,yhi) savefig('ttxy%i-%i.png' % (run,order)) ����������������������������������������������������astrometry.net-0.67/blind/threadtest.c��������������������������������������������������������������000644 �000765 �000024 �00000002350 12651445460 020171� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <pthread.h> #include "engine.h" #include "log.h" #include "fitsioutils.h" engine_t* be; //pthread_mutex_t read_job_mutex; void* threadfunc(void* arg) { char* jobfn = arg; logverb("Hello from thread-land!\n"); //pthread_mutex_lock(&read_job_mutex); job_t* job = engine_read_job_file(be, jobfn); //pthread_mutex_unlock(&read_job_mutex); engine_run_job(be, job); job_free(job); return NULL; } int main(int argc, char** args) { pthread_t thread1; pthread_t thread2; pthread_attr_t attr; char* job1 = "job1.axy"; char* job2 = "job2.axy"; fits_use_error_system(); log_init(LOG_VERB); log_set_thread_specific(); logverb("Hello world!\n"); be = engine_new(); engine_parse_config_file(be, "astrometry.cfg"); pthread_mutex_init(&read_job_mutex, NULL); pthread_attr_init(&attr); pthread_create(&thread1, &attr, threadfunc, job1); pthread_create(&thread2, &attr, threadfunc, job2); pthread_join(thread1, NULL); pthread_join(thread2, NULL); pthread_mutex_destroy(&read_job_mutex); engine_free(be); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/tst.plot������������������������������������������������������������������000644 �000765 �000024 �00000000742 12651445460 017373� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������plot_wcs tst.wcs plot_wcs_setsize plot_color 0.5 0.5 0.5 grid_rastep 1 grid_decstep 1 grid_ralabelstep 1 grid_declabelstep 1 grid plot_color green plot_lw 3 annotations_fontsize 20 annotations_target 350 0 350,0 annotations_target 20 0 20,0 annotations_target 0 10 0,10 annotations_target 0 -10 0,-10 annotations_target 10 10 10,10 annotations_target -10 10 -10,10 annotations_target 10 -10 10,-10 annotations_target -10 -10 -10,-10 annotations_target 180 0 180,0 annotations ������������������������������astrometry.net-0.67/blind/tst.wcs�������������������������������������������������������������������000644 �000765 �000024 �00000020700 12651445460 017205� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN' / TAN (gnomic) projection CTYPE2 = 'DEC--TAN' / TAN (gnomic) projection WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 0 / RA of reference point CRVAL2 = 0 / DEC of reference point CRPIX1 = 400 / X reference pixel CRPIX2 = 400 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = 0.005 / Transformation matrix CD1_2 = 0 / no comment CD2_1 = 0 / no comment CD2_2 = 0.005 / no comment IMAGEW = 800 / Image width, in pixels. IMAGEH = 800 / Image height, in pixels. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY svn+ssh://astrometry.net/svn/trunk/src/astrometry/util/ HISTORY Subversion revision 14257 HISTORY Subversion date 2010-02-27 20:03:55 -0500 (Sat, 27 Feb HISTORY 2010) HISTORY This WCS header was created by the program "blind". DATE = '2010-03-01T21:01:32' / Date this file was created. COMMENT -- blind solver parameters: -- COMMENT Index(0): /Users/dstn/INDEXES/index-709.fits COMMENT Index(1): /Users/dstn/INDEXES/index-710.fits COMMENT Index(2): /Users/dstn/INDEXES/index-711.fits COMMENT Index(3): /Users/dstn/INDEXES/index-712.fits COMMENT Index(4): /Users/dstn/INDEXES/index-713.fits COMMENT Index(5): /Users/dstn/INDEXES/index-714.fits COMMENT Index(6): /Users/dstn/INDEXES/index-715.fits COMMENT Field name: ./image-0321415282.axy COMMENT Field scale lower: 6.99482 arcsec/pixel COMMENT Field scale upper: 7.57772 arcsec/pixel COMMENT X col name: X COMMENT Y col name: Y COMMENT Start obj: 0 COMMENT End obj: 0 COMMENT Solved_in: (null) COMMENT Solved_out: (null) COMMENT Solvedserver: (null) COMMENT Parity: 1 COMMENT Codetol: 0.01 COMMENT Verify pixels: 1 pix COMMENT Maxquads: 0 COMMENT Maxmatches: 0 COMMENT Cpu limit: 600.000000 s COMMENT Time limit: 0 s COMMENT Total time limit: 0 s COMMENT Total CPU limit: 0.000000 s COMMENT Tweak: no COMMENT -- COMMENT -- properties of the matching quad: -- COMMENT index id: 712 COMMENT index healpix: -1 COMMENT index hpnside: 0 COMMENT log odds: 438.83 COMMENT odds: 3.81395e+190 COMMENT quadno: 61659 COMMENT stars: 83841,83977,83811,83996 COMMENT field: 6,5,0,4 COMMENT code error: 0.00359107 COMMENT nmatch: 71 COMMENT nconflict: 0 COMMENT nfield: 310 COMMENT nindex: 81 COMMENT scale: 7.29452 arcsec/pix COMMENT parity: 1 COMMENT quads tried: 16 COMMENT quads matched: 1 COMMENT quads verified: 0 COMMENT objs tried: 7 COMMENT cpu time: 0.005807 COMMENT -- END ����������������������������������������������������������������astrometry.net-0.67/blind/tweak-main.c��������������������������������������������������������������000644 �000765 �000024 �00000022230 12651445460 020056� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <string.h> #include <math.h> #include <assert.h> /** wget "http://antwrp.gsfc.nasa.gov/apod/image/0403/cmsky_cortner_full.jpg" solve-field --backend-config backend.cfg -v --keep-xylist %s.xy --continue --scale-low 10 --scale-units degwidth cmsky_cortner_full.xy --no-tweak cp cmsky_cortner_full.xy 1.xy cp cmsky_cortner_full.rdls 1.rd cp cmsky_cortner_full.wcs 1.wcs cp cmsky_cortner_full.jpg 1.jpg tweak -w 1.wcs -x 1.xy -r 1.rd -v **/ #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "matchobj.h" #include "xylist.h" #include "rdlist.h" #include "ioutils.h" #include "starkd.h" #include "boilerplate.h" #include "sip.h" #include "sip_qfits.h" #include "log.h" #include "fitsioutils.h" #include "fit-wcs.h" #include "verify.h" #include "histogram2d.h" #include "plotstuff.h" #include "plotimage.h" #include "cairoutils.h" static const char* OPTIONS = "hx:w:r:vj:I:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w <WCS input file>\n" " -x <xyls input file>\n" " -r <rdls input file>\n" " [-I <background-image>]: background for plots.\n" " [-v]: verbose\n" " [-j <pixel-jitter>]: set pixel jitter (default 1.0)\n" "\n", progname); } int main(int argc, char** args) { int c; char* xylsfn = NULL; char* wcsfn = NULL; char* rdlsfn = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; sip_t sip; int i, j; int W, H; //double xyzcenter[3]; //double fieldrad2; double pixeljitter = 1.0; int loglvl = LOG_MSG; double wcsscale; char* bgfn = NULL; //double nsigma = 3.0; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'I': bgfn = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'r': rdlsfn = optarg; break; case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !wcsfn || !rdlsfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to parse SIP header from %s...\n", wcsfn); if (!sip_read_header_file(wcsfn, &sip)) { logmsg("Failed to parse SIP header from %s.\n", wcsfn); } // image W, H W = sip.wcstan.imagew; H = sip.wcstan.imageh; if ((W == 0.0) || (H == 0.0)) { logmsg("WCS file %s didn't contain IMAGEW and IMAGEH headers.\n", wcsfn); // FIXME - use bounds of xylist? exit(-1); } wcsscale = sip_pixel_scale(&sip); logmsg("WCS scale: %g arcsec/pixel\n", wcsscale); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { logmsg("Failed to read an rdlist from file %s.\n", rdlsfn); exit(-1); } // Find field center and radius. /* sip_pixelxy2xyzarr(&sip, W/2, H/2, xyzcenter); fieldrad2 = arcsec2distsq(sip_pixel_scale(&sip) * hypot(W/2, H/2)); */ { // (x,y) positions of field stars. double* fieldpix; int Nfield; double* indexpix; starxy_t* xy; rd_t* rd; int Nindex; xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldpix = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // Project RDLS into pixel space. rd = rdlist_read_field(rdls, NULL); if (!rd) { logmsg("Failed to read rdls entries.\n"); exit(-1); } Nindex = rd_n(rd); logmsg("Found %i indx objects\n", Nindex); indexpix = malloc(2 * Nindex * sizeof(double)); for (i=0; i<Nindex; i++) { anbool ok; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); ok = sip_radec2pixelxy(&sip, ra, dec, indexpix + i*2, indexpix + i*2 + 1); assert(ok); } logmsg("CRPIX is (%g,%g)\n", sip.wcstan.crpix[0], sip.wcstan.crpix[1]); /* // ?? // Look for index-field pairs that are (a) close together; and (b) close to CRPIX. // Split the image into 3x3, 5x5 or so, and in each, look for a // (small) rotation and log(scale), then (bigger) shift, using histogram // cross-correlation. // Are the rotations and scales really going to be big enough that this // is required, or can we get away with doing shift first, then fine-tuning // rotation and scale? { // NxN blocks int NB = 3; int b; // HACK - use histogram2d machinery to split image into blocks. histogram2d* blockhist = histogram2d_new_nbins(0, W, NB, 0, H, NB); int* fieldi = malloc(Nfield * sizeof(int)); int* indexi = malloc(Nindex * sizeof(int)); // rotation bins int NR = 100; // scale bins (ie, log(radius) bins) double minrad = 1.0; double maxrad = 200.0; int NS = 100; histogram2d* rsfield = histogram2d_new_nbins(-M_PI, M_PI, NR, log(minrad), log(maxrad), NS); histogram2d* rsindex = histogram2d_new_nbins(-M_PI, M_PI, NR, log(minrad), log(maxrad), NS); histogram2d_set_y_edges(rsfield, HIST2D_DISCARD); histogram2d_set_y_edges(rsindex, HIST2D_DISCARD); for (b=0; b<(NB*NB); b++) { int bin; int NF, NI; double dx, dy; NF = NI = 0; for (i=0; i<Nfield; i++) { bin = histogram2d_add(blockhist, fieldpix[2*i], fieldpix[2*i+1]); if (bin != b) continue; fieldi[NF] = i; NF++; } for (i=0; i<Nindex; i++) { bin = histogram2d_add(blockhist, indexpix[2*i], indexpix[2*i+1]); if (bin != b) continue; indexi[NI] = i; NI++; } logmsg("bin %i has %i field and %i index stars.\n", b, NF, NI); logmsg("histogramming field rotation/scale\n"); for (i=0; i<NF; i++) { for (j=0; j<i; j++) { dx = fieldpix[2*fieldi[i]] - fieldpix[2*fieldi[j]]; dy = fieldpix[2*fieldi[i]+1] - fieldpix[2*fieldi[j]+1]; histogram2d_add(rsfield, atan2(dy, dx), log(sqrt(dx*dx + dy*dy))); } } logmsg("histogramming index rotation/scale\n"); for (i=0; i<NI; i++) { for (j=0; j<i; j++) { dx = indexpix[2*indexi[i]] - fieldpix[2*indexi[j]]; dy = indexpix[2*indexi[i]+1] - fieldpix[2*indexi[j]+1]; histogram2d_add(rsindex, atan2(dy, dx), log(sqrt(dx*dx + dy*dy))); } } } histogram2d_free(rsfield); histogram2d_free(rsindex); free(fieldi); free(indexi); histogram2d_free(blockhist); } */ { double* fieldsigma2s = malloc(Nfield * sizeof(double)); int besti; int* theta; double logodds; double Q2, R2; double qc[2]; double gamma; // HACK -- quad radius-squared Q2 = square(100.0); qc[0] = sip.wcstan.crpix[0]; qc[1] = sip.wcstan.crpix[1]; // HACK -- variance growth rate wrt radius. gamma = 1.0; for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldpix + 2*i, 2); fieldsigma2s[i] = square(pixeljitter) * (1.0 + gamma * R2/Q2); } logodds = verify_star_lists(indexpix, Nindex, fieldpix, fieldsigma2s, Nfield, W*H, 0.25, log(1e-100), log(1e100), &besti, NULL, &theta, NULL, NULL); logmsg("Logodds: %g\n", logodds); if (bgfn) { plot_args_t pargs; plotimage_t* img; cairo_t* cairo; char outfn[32]; j = 0; plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; sprintf(outfn, "tweak-%03i.png", j); pargs.outfn = outfn; img = plotstuff_get_config(&pargs, "image"); //img->format = PLOTSTUFF_FORMAT_JPG; // guess plot_image_set_filename(img, bgfn); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "red"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } plotstuff_output(&pargs); } free(theta); free(fieldsigma2s); } free(fieldpix); free(indexpix); } if (xylist_close(xyls)) { logmsg("Failed to close XYLS file.\n"); } return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/tweak.c�������������������������������������������������������������������000644 �000765 �000024 �00000054745 12651445460 017154� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <assert.h> #include <string.h> #include <math.h> #include <gsl/gsl_matrix_double.h> #include <gsl/gsl_vector_double.h> #include "sip-utils.h" #include "tweak.h" #include "healpix.h" #include "dualtree_rangesearch.h" #include "kdtree_fits_io.h" #include "mathutil.h" #include "log.h" #include "permutedsort.h" #include "gslutils.h" #include "errors.h" #include "fit-wcs.h" // TODO: // // 1. Write the document which explains every step of tweak in detail with // comments relating exactly to the code. // 2. Implement polynomial terms - use order parameter to zero out A matrix // 3. Make it robust to outliers // - Make jitter evolve as fit evolves // - Sigma clipping // 4. Need test image with non-trivial rotation to test CD transpose problem // // // - Put CD inverse into its own function // // BUG? transpose of CD matrix is similar to CD matrix! // BUG? inverse when computing sx/sy (i.e. same transpose issue) // Ability to fit without re-doing correspondences // Split fit x/y (i.e. two fits one for x one for y) #define KERNEL_SIZE 5 #define KERNEL_MARG ((KERNEL_SIZE-1)/2) sip_t* tweak_just_do_it(const tan_t* wcs, const starxy_t* imagexy, const double* starxyz, const double* star_ra, const double* star_dec, const double* star_radec, int nstars, double jitter_arcsec, int order, int inverse_order, int iterations, anbool weighted, anbool skip_shift) { tweak_t* twee = NULL; sip_t* sip = NULL; twee = tweak_new(); twee->jitter = jitter_arcsec; twee->sip->a_order = twee->sip->b_order = order; twee->sip->ap_order = twee->sip->bp_order = inverse_order; twee->weighted_fit = weighted; if (skip_shift) tweak_skip_shift(twee); tweak_push_image_xy(twee, imagexy); if (starxyz) tweak_push_ref_xyz(twee, starxyz, nstars); else if (star_ra && star_dec) tweak_push_ref_ad(twee, star_ra, star_dec, nstars); else if (star_radec) tweak_push_ref_ad_array(twee, star_radec, nstars); else { logerr("Need starxyz, (star_ra and star_dec), or star_radec"); return NULL; } tweak_push_wcs_tan(twee, wcs); tweak_iterate_to_order(twee, order, iterations); // Steal the resulting SIP structure sip = twee->sip; twee->sip = NULL; tweak_free(twee); return sip; } static void get_dydx_range(double* ximg, double* yimg, int nimg, double* xcat, double* ycat, int ncat, double *mindx, double *mindy, double *maxdx, double *maxdy) { int i, j; *maxdx = -1e100; *mindx = 1e100; *maxdy = -1e100; *mindy = 1e100; for (i = 0; i < nimg; i++) { for (j = 0; j < ncat; j++) { double dx = ximg[i] - xcat[j]; double dy = yimg[i] - ycat[j]; *maxdx = MAX(dx, *maxdx); *maxdy = MAX(dy, *maxdy); *mindx = MIN(dx, *mindx); *mindy = MIN(dy, *mindy); } } } static void get_shift(double* ximg, double* yimg, int nimg, double* xcat, double* ycat, int ncat, double mindx, double mindy, double maxdx, double maxdy, double* xshift, double* yshift) { int i, j; int themax, themaxind, ys, xs; // hough transform int hsz = 1000; // hough histogram size (per side) int *hough = calloc(hsz * hsz, sizeof(int)); // allocate bins int kern[] = {0, 2, 3, 2, 0, // approximate gaussian smoother 2, 7, 12, 7, 2, // should be KERNEL_SIZE x KERNEL_SIZE 3, 12, 20, 12, 3, 2, 7, 12, 7, 2, 0, 2, 3, 2, 0}; assert(sizeof(kern) == KERNEL_SIZE * KERNEL_SIZE * sizeof(int)); for (i = 0; i < nimg; i++) { // loop over all pairs of source-catalog objs for (j = 0; j < ncat; j++) { double dx = ximg[i] - xcat[j]; double dy = yimg[i] - ycat[j]; int hszi = hsz - 1; int iy = hszi * ( (dy - mindy) / (maxdy - mindy) ); // compute deltay using implicit floor int ix = hszi * ( (dx - mindx) / (maxdx - mindx) ); // compute deltax using implicit floor // check to make sure the point is in the box if (KERNEL_MARG <= iy && iy < hsz - KERNEL_MARG && KERNEL_MARG <= ix && ix < hsz - KERNEL_MARG) { int kx, ky; for (ky = -2; ky <= 2; ky++) for (kx = -2; kx <= 2; kx++) hough[(iy - ky)*hsz + (ix - kx)] += kern[(ky + 2) * 5 + (kx + 2)]; } } } // find argmax in hough themax = 0; themaxind = -1; for (i = 0; i < hsz*hsz; i++) { if (themax < hough[i]) { themaxind = i; themax = hough[i]; } } // which hough bin is the max? ys = themaxind / hsz; xs = themaxind % hsz; *yshift = (ys / (double)hsz) * (maxdy - mindy) + mindy; *xshift = (xs / (double)hsz) * (maxdx - mindx) + mindx; debug("xs = %d, ys = %d\n", xs, ys); debug("get_shift: mindx=%g, maxdx=%g, mindy=%g, maxdy=%g\n", mindx, maxdx, mindy, maxdy); debug("get_shift: xs=%g, ys=%g\n", *xshift, *yshift); free(hough); } static sip_t* do_entire_shift_operation(tweak_t* t, double rho) { get_shift(t->x, t->y, t->n, t->x_ref, t->y_ref, t->n_ref, rho*t->mindx, rho*t->mindy, rho*t->maxdx, rho*t->maxdy, &t->xs, &t->ys); wcs_shift(&(t->sip->wcstan), t->xs, t->ys); return NULL; } /* This function is intended only for initializing newly allocated tweak * structures, NOT for operating on existing ones.*/ void tweak_init(tweak_t* t) { memset(t, 0, sizeof(tweak_t)); t->sip = sip_create(); } tweak_t* tweak_new() { tweak_t* t = malloc(sizeof(tweak_t)); tweak_init(t); return t; } void tweak_iterate_to_order(tweak_t* t, int maxorder, int iterations) { int order; int k; for (order=1; order<=maxorder; order++) { logverb("\n"); logverb("--------------------------------\n"); logverb("Order %i\n", order); logverb("--------------------------------\n"); t->sip->a_order = t->sip->b_order = order; //t->sip->ap_order = t->sip->bp_order = order; tweak_go_to(t, TWEAK_HAS_CORRESPONDENCES); for (k=0; k<iterations; k++) { logverb("\n"); logverb("--------------------------------\n"); logverb("Iterating tweak: order %i, step %i\n", order, k); t->state &= ~TWEAK_HAS_LINEAR_CD; tweak_go_to(t, TWEAK_HAS_LINEAR_CD); tweak_clear_correspondences(t); } } } #define CHECK_STATE(x) if (state & x) sl_append(s, #x) static char* state_string(unsigned int state) { sl* s = sl_new(4); char* str; CHECK_STATE(TWEAK_HAS_SIP); CHECK_STATE(TWEAK_HAS_IMAGE_XY); CHECK_STATE(TWEAK_HAS_IMAGE_XYZ); CHECK_STATE(TWEAK_HAS_IMAGE_AD); CHECK_STATE(TWEAK_HAS_REF_XY); CHECK_STATE(TWEAK_HAS_REF_XYZ); CHECK_STATE(TWEAK_HAS_REF_AD); CHECK_STATE(TWEAK_HAS_CORRESPONDENCES); CHECK_STATE(TWEAK_HAS_COARSLY_SHIFTED); CHECK_STATE(TWEAK_HAS_FINELY_SHIFTED); CHECK_STATE(TWEAK_HAS_REALLY_FINELY_SHIFTED); CHECK_STATE(TWEAK_HAS_LINEAR_CD); str = sl_join(s, " "); sl_free2(s); return str; } char* tweak_get_state_string(const tweak_t* t) { return state_string(t->state); } #undef CHECK_STATE void tweak_clear_correspondences(tweak_t* t) { if (t->state & TWEAK_HAS_CORRESPONDENCES) { // our correspondences are also now toast assert(t->image); assert(t->ref); assert(t->dist2); il_free(t->image); il_free(t->ref); dl_free(t->dist2); if (t->weight) dl_free(t->weight); t->image = NULL; t->ref = NULL; t->dist2 = NULL; t->weight = NULL; t->state &= ~TWEAK_HAS_CORRESPONDENCES; } assert(!t->image); assert(!t->ref); assert(!t->dist2); assert(!t->weight); } void tweak_clear_on_sip_change(tweak_t* t) { // tweak_clear_correspondences(t); tweak_clear_image_ad(t); tweak_clear_ref_xy(t); tweak_clear_image_xyz(t); } // ref_xy are the catalog star positions in image coordinates void tweak_clear_ref_xy(tweak_t* t) { if (t->state & TWEAK_HAS_REF_XY) { //assert(t->x_ref); free(t->x_ref); //assert(t->y_ref); t->x_ref = NULL; free(t->y_ref); t->y_ref = NULL; t->state &= ~TWEAK_HAS_REF_XY; } assert(!t->x_ref); assert(!t->y_ref); } // radec of catalog stars void tweak_clear_ref_ad(tweak_t* t) { if (t->state & TWEAK_HAS_REF_AD) { assert(t->a_ref); free(t->a_ref); t->a_ref = NULL; assert(t->d_ref); free(t->d_ref); t->d_ref = NULL; t->n_ref = 0; tweak_clear_correspondences(t); tweak_clear_ref_xy(t); t->state &= ~TWEAK_HAS_REF_AD; } assert(!t->a_ref); assert(!t->d_ref); } // image objs in ra,dec according to current tweak void tweak_clear_image_ad(tweak_t* t) { if (t->state & TWEAK_HAS_IMAGE_AD) { assert(t->a); free(t->a); t->a = NULL; assert(t->d); free(t->d); t->d = NULL; t->state &= ~TWEAK_HAS_IMAGE_AD; } assert(!t->a); assert(!t->d); } void tweak_clear_image_xyz(tweak_t* t) { if (t->state & TWEAK_HAS_IMAGE_XYZ) { assert(t->xyz); free(t->xyz); t->xyz = NULL; t->state &= ~TWEAK_HAS_IMAGE_XYZ; } assert(!t->xyz); } void tweak_clear_image_xy(tweak_t* t) { if (t->state & TWEAK_HAS_IMAGE_XY) { assert(t->x); free(t->x); t->x = NULL; assert(t->y); free(t->y); t->y = NULL; t->state &= ~TWEAK_HAS_IMAGE_XY; } assert(!t->x); assert(!t->y); } // tell us (from outside tweak) where the catalog stars are void tweak_push_ref_ad(tweak_t* t, const double* a, const double *d, int n) { assert(a); assert(d); assert(n); tweak_clear_ref_ad(t); assert(!t->a_ref); assert(!t->d_ref); t->a_ref = malloc(sizeof(double) * n); t->d_ref = malloc(sizeof(double) * n); memcpy(t->a_ref, a, n*sizeof(double)); memcpy(t->d_ref, d, n*sizeof(double)); t->n_ref = n; t->state |= TWEAK_HAS_REF_AD; } void tweak_push_ref_ad_array(tweak_t* t, const double* ad, int n) { int i; assert(ad); assert(n); tweak_clear_ref_ad(t); assert(!t->a_ref); assert(!t->d_ref); t->a_ref = malloc(sizeof(double) * n); t->d_ref = malloc(sizeof(double) * n); for (i=0; i<n; i++) { t->a_ref[i] = ad[2*i + 0]; t->d_ref[i] = ad[2*i + 1]; } t->n_ref = n; t->state |= TWEAK_HAS_REF_AD; } static void ref_xyz_from_ad(tweak_t* t) { int i; assert(t->state & TWEAK_HAS_REF_AD); assert(!t->xyz_ref); t->xyz_ref = malloc(sizeof(double) * 3 * t->n_ref); assert(t->xyz_ref); for (i = 0; i < t->n_ref; i++) radecdeg2xyzarr(t->a_ref[i], t->d_ref[i], t->xyz_ref + 3 * i); t->state |= TWEAK_HAS_REF_XYZ; } static void ref_ad_from_xyz(tweak_t* t) { int i, n; assert(t->state & TWEAK_HAS_REF_XYZ); assert(!t->a_ref); assert(!t->d_ref); n = t->n_ref; t->a_ref = malloc(sizeof(double) * n); t->d_ref = malloc(sizeof(double) * n); assert(t->a_ref); assert(t->d_ref); for (i=0; i<n; i++) xyzarr2radecdeg(t->xyz_ref + 3*i, t->a_ref + i, t->d_ref + i); t->state |= TWEAK_HAS_REF_XYZ; } // tell us (from outside tweak) where the catalog stars are void tweak_push_ref_xyz(tweak_t* t, const double* xyz, int n) { assert(xyz); assert(n); tweak_clear_ref_ad(t); assert(!t->xyz_ref); t->xyz_ref = malloc(sizeof(double) * 3 * n); assert(t->xyz_ref); memcpy(t->xyz_ref, xyz, 3*n*sizeof(double)); t->n_ref = n; t->state |= TWEAK_HAS_REF_XYZ; } void tweak_push_image_xy(tweak_t* t, const starxy_t* xy) { tweak_clear_image_xy(t); t->x = starxy_copy_x(xy); t->y = starxy_copy_y(xy); t->n = starxy_n(xy); t->state |= TWEAK_HAS_IMAGE_XY; } void tweak_skip_shift(tweak_t* t) { t->state |= (TWEAK_HAS_COARSLY_SHIFTED | TWEAK_HAS_FINELY_SHIFTED | TWEAK_HAS_REALLY_FINELY_SHIFTED); } // DualTree RangeSearch callback. We want to keep track of correspondences. // Potentially the matching could be many-to-many; we allow this and hope the // optimizer can take care of it. static void dtrs_match_callback(void* extra, int image_ind, int ref_ind, double dist2) { tweak_t* t = extra; image_ind = kdtree_permute(t->kd_image, image_ind); ref_ind = kdtree_permute(t->kd_ref, ref_ind); il_append(t->image, image_ind); il_append(t->ref, ref_ind); dl_append(t->dist2, dist2); if (t->weight) dl_append(t->weight, exp(-dist2 / (2.0 * t->jitterd2))); } void tweak_push_correspondence_indices(tweak_t* t, il* image, il* ref, dl* distsq, dl* weight) { t->image = image; t->ref = ref; t->dist2 = distsq; t->weight = weight; t->state |= TWEAK_HAS_CORRESPONDENCES; } // The jitter is in radians static void find_correspondences(tweak_t* t, double jitter) { double dist; double* data_image = malloc(sizeof(double) * t->n * 3); double* data_ref = malloc(sizeof(double) * t->n_ref * 3); assert(t->state & TWEAK_HAS_IMAGE_XYZ); assert(t->state & TWEAK_HAS_REF_XYZ); tweak_clear_correspondences(t); memcpy(data_image, t->xyz, 3*t->n*sizeof(double)); memcpy(data_ref, t->xyz_ref, 3*t->n_ref*sizeof(double)); t->kd_image = kdtree_build(NULL, data_image, t->n, 3, 4, KDTT_DOUBLE, KD_BUILD_BBOX); t->kd_ref = kdtree_build(NULL, data_ref, t->n_ref, 3, 4, KDTT_DOUBLE, KD_BUILD_BBOX); // Storage for correspondences t->image = il_new(600); t->ref = il_new(600); t->dist2 = dl_new(600); if (t->weighted_fit) t->weight = dl_new(600); dist = rad2dist(jitter); logverb("search radius = %g arcsec\n", rad2arcsec(jitter)); // Find closest neighbours dualtree_rangesearch(t->kd_image, t->kd_ref, RANGESEARCH_NO_LIMIT, dist, FALSE, NULL, dtrs_match_callback, t, NULL, NULL); kdtree_free(t->kd_image); kdtree_free(t->kd_ref); t->kd_image = NULL; t->kd_ref = NULL; free(data_image); free(data_ref); logverb("Number of correspondences: %zu\n", il_size(t->image)); } static double correspondences_rms_arcsec(tweak_t* t, int weighted) { double err2 = 0.0; int i; double totalweight = 0.0; for (i=0; i<il_size(t->image); i++) { double imgxyz[3]; double refxyz[3]; double weight; int refi, imgi; if (weighted && t->weight) weight = dl_get(t->weight, i); else weight = 1.0; totalweight += weight; imgi = il_get(t->image, i); sip_pixelxy2xyzarr(t->sip, t->x[imgi], t->y[imgi], imgxyz); refi = il_get(t->ref, i); radecdeg2xyzarr(t->a_ref[refi], t->d_ref[refi], refxyz); err2 += weight * distsq(imgxyz, refxyz, 3); } return distsq2arcsec( err2 / totalweight ); } #if 0 // in arcseconds^2 on the sky (chi-sq) static double figure_of_merit(tweak_t* t, double *rmsX, double *rmsY) { double sqerr = 0.0; int i; for (i = 0; i < il_size(t->image); i++) { double a, d; double xyzpt[3]; double xyzpt_ref[3]; sip_pixelxy2radec(t->sip, t->x[il_get(t->image, i)], t->y[il_get(t->image, i)], &a, &d); // xref and yref should be intermediate WC's not image x and y! radecdeg2xyzarr(a, d, xyzpt); radecdeg2xyzarr(t->a_ref[il_get(t->ref, i)], t->d_ref[il_get(t->ref, i)], xyzpt_ref); sqerr += distsq(xyzpt, xyzpt_ref, 3); } return rad2arcsec(1)*rad2arcsec(1)*sqerr; } static double figure_of_merit2(tweak_t* t) { // find error in pixels^2 double sqerr = 0.0; int i; for (i = 0; i < il_size(t->image); i++) { double x, y, dx, dy; Unused anbool ok; ok = sip_radec2pixelxy(t->sip, t->a_ref[il_get(t->ref, i)], t->d_ref[il_get(t->ref, i)], &x, &y); assert(ok); dx = t->x[il_get(t->image, i)] - x; dy = t->y[il_get(t->image, i)] - y; sqerr += dx * dx + dy * dy; } // convert to arcsec^2 return sqerr * square(sip_pixel_scale(t->sip)); } #endif // FIXME: adapt this function to take as input the correspondences to use VVVVV // wic is World Intermediate Coordinates, either along ra or dec // i.e. canonical image coordinates // wic_corr is the list of corresponding indexes for wip // pix_corr is the list of corresponding indexes for pixels // pix is raw image pixels (either u or v) // siporder is the sip order up to MAXORDER (defined in sip.h) // the correspondences are passed so that we can stick RANSAC around the whole // thing for better estimation. // Run a polynomial tweak static void do_sip_tweak(tweak_t* t) { sip_t sipout; size_t i, M; // a_order and b_order should be the same! assert(t->sip->a_order == t->sip->b_order); debug("do_sip_tweak starting.\n"); logverb("RMS error of correspondences: %g arcsec\n", correspondences_rms_arcsec(t, 0)); if (t->weighted_fit) logverb("Weighted RMS error of correspondences: %g arcsec\n", correspondences_rms_arcsec(t, 1)); M = il_size(t->image); double* starxyz = malloc(M * 3 * sizeof(double)); double* fieldxy = malloc(M * 2 * sizeof(double)); double* weights = NULL; if (t->weighted_fit) weights = malloc(M * sizeof(double)); int result; for (i=0; i<M; i++) { int refi; int imi; imi = il_get(t->image, i); fieldxy[2*i + 0] = t->x[imi]; fieldxy[2*i + 1] = t->y[imi]; refi = il_get(t->ref, i); radecdeg2xyzarr(t->a_ref[refi], t->d_ref[refi], starxyz + i*3); if (t->weighted_fit) weights[i] = dl_get(t->weight, i); } int doshift = 1; result = fit_sip_wcs(starxyz, fieldxy, weights, M, &(t->sip->wcstan), t->sip->a_order, t->sip->ap_order, doshift, &sipout); free(starxyz); free(fieldxy); free(weights); if (result) { ERROR("fit_sip_wcs failed\n"); return; } memcpy(t->sip, &sipout, sizeof(sip_t)); // recalc using new SIP tweak_clear_on_sip_change(t); tweak_go_to(t, TWEAK_HAS_IMAGE_AD); tweak_go_to(t, TWEAK_HAS_REF_XY); logverb("RMS error of correspondences: %g arcsec\n", correspondences_rms_arcsec(t, 0)); if (t->weighted_fit) logverb("Weighted RMS error of correspondences: %g arcsec\n", correspondences_rms_arcsec(t, 1)); } // Really what we want is some sort of fancy dependency system... DTDS! // Duct-tape dependencey system (DTDS) #define done(x) t->state |= x; return x; #define want(x) \ if (flag == x && t->state & x) \ return x; \ else if (flag == x) #define ensure(x) \ if (!(t->state & x)) { \ return tweak_advance_to(t, x); \ } unsigned int tweak_advance_to(tweak_t* t, unsigned int flag) { want(TWEAK_HAS_IMAGE_AD) { int jj; ensure(TWEAK_HAS_SIP); ensure(TWEAK_HAS_IMAGE_XY); debug("Satisfying TWEAK_HAS_IMAGE_AD\n"); // Convert to ra dec assert(!t->a); assert(!t->d); t->a = malloc(sizeof(double) * t->n); t->d = malloc(sizeof(double) * t->n); for (jj = 0; jj < t->n; jj++) sip_pixelxy2radec(t->sip, t->x[jj], t->y[jj], t->a + jj, t->d + jj); done(TWEAK_HAS_IMAGE_AD); } want(TWEAK_HAS_REF_AD) { if (!(t->a_ref && t->d_ref)) { ensure(TWEAK_HAS_REF_XYZ); debug("Satisfying TWEAK_HAS_REF_AD\n"); ref_ad_from_xyz(t); } assert(t->a_ref && t->d_ref); done(TWEAK_HAS_REF_AD); } want(TWEAK_HAS_REF_XYZ) { if (!t->xyz_ref) { ensure(TWEAK_HAS_REF_AD); debug("Satisfying TWEAK_HAS_REF_XYZ\n"); ref_xyz_from_ad(t); } assert(t->xyz_ref); done(TWEAK_HAS_REF_XYZ); } want(TWEAK_HAS_REF_XY) { int jj; ensure(TWEAK_HAS_REF_AD); debug("Satisfying TWEAK_HAS_REF_XY\n"); assert(t->state & TWEAK_HAS_REF_AD); assert(t->n_ref); assert(!t->x_ref); assert(!t->y_ref); t->x_ref = malloc(sizeof(double) * t->n_ref); t->y_ref = malloc(sizeof(double) * t->n_ref); for (jj = 0; jj < t->n_ref; jj++) { Unused anbool ok; ok = sip_radec2pixelxy(t->sip, t->a_ref[jj], t->d_ref[jj], t->x_ref + jj, t->y_ref + jj); assert(ok); } done(TWEAK_HAS_REF_XY); } want(TWEAK_HAS_IMAGE_XYZ) { int i; ensure(TWEAK_HAS_IMAGE_AD); debug("Satisfying TWEAK_HAS_IMAGE_XYZ\n"); assert(!t->xyz); t->xyz = malloc(3 * t->n * sizeof(double)); for (i = 0; i < t->n; i++) radecdeg2xyzarr(t->a[i], t->d[i], t->xyz + 3*i); done(TWEAK_HAS_IMAGE_XYZ); } want(TWEAK_HAS_COARSLY_SHIFTED) { ensure(TWEAK_HAS_REF_XY); ensure(TWEAK_HAS_IMAGE_XY); debug("Satisfying TWEAK_HAS_COARSLY_SHIFTED\n"); get_dydx_range(t->x, t->y, t->n, t->x_ref, t->y_ref, t->n_ref, &t->mindx, &t->mindy, &t->maxdx, &t->maxdy); do_entire_shift_operation(t, 1.0); tweak_clear_image_ad(t); tweak_clear_ref_xy(t); done(TWEAK_HAS_COARSLY_SHIFTED); } want(TWEAK_HAS_FINELY_SHIFTED) { ensure(TWEAK_HAS_REF_XY); ensure(TWEAK_HAS_IMAGE_XY); ensure(TWEAK_HAS_COARSLY_SHIFTED); debug("Satisfying TWEAK_HAS_FINELY_SHIFTED\n"); // Shrink size of hough box do_entire_shift_operation(t, 0.3); tweak_clear_image_ad(t); tweak_clear_ref_xy(t); done(TWEAK_HAS_FINELY_SHIFTED); } want(TWEAK_HAS_REALLY_FINELY_SHIFTED) { ensure(TWEAK_HAS_REF_XY); ensure(TWEAK_HAS_IMAGE_XY); ensure(TWEAK_HAS_FINELY_SHIFTED); debug("Satisfying TWEAK_HAS_REALLY_FINELY_SHIFTED\n"); // Shrink size of hough box do_entire_shift_operation(t, 0.03); tweak_clear_image_ad(t); tweak_clear_ref_xy(t); done(TWEAK_HAS_REALLY_FINELY_SHIFTED); } want(TWEAK_HAS_CORRESPONDENCES) { ensure(TWEAK_HAS_REF_XYZ); ensure(TWEAK_HAS_IMAGE_XYZ); debug("Satisfying TWEAK_HAS_CORRESPONDENCES\n"); t->jitterd2 = arcsec2distsq(t->jitter); find_correspondences(t, 6.0 * arcsec2rad(t->jitter)); done(TWEAK_HAS_CORRESPONDENCES); } want(TWEAK_HAS_LINEAR_CD) { ensure(TWEAK_HAS_SIP); ensure(TWEAK_HAS_REALLY_FINELY_SHIFTED); ensure(TWEAK_HAS_REF_XY); ensure(TWEAK_HAS_REF_AD); ensure(TWEAK_HAS_IMAGE_XY); ensure(TWEAK_HAS_CORRESPONDENCES); debug("Satisfying TWEAK_HAS_LINEAR_CD\n"); do_sip_tweak(t); tweak_clear_on_sip_change(t); done(TWEAK_HAS_LINEAR_CD); } // small memleak -- but it's a major bug if this happens, so suck it up. logerr("die for dependence: %s\n", state_string(flag)); assert(0); return -1; } void tweak_push_wcs_tan(tweak_t* t, const tan_t* wcs) { memcpy(&(t->sip->wcstan), wcs, sizeof(tan_t)); t->state |= TWEAK_HAS_SIP; } void tweak_go_to(tweak_t* t, unsigned int dest_state) { while (!(t->state & dest_state)) tweak_advance_to(t, dest_state); } #define SAFE_FREE(xx) {free((xx)); xx = NULL;} void tweak_clear(tweak_t* t) { if (!t) return ; SAFE_FREE(t->a); SAFE_FREE(t->d); SAFE_FREE(t->x); SAFE_FREE(t->y); SAFE_FREE(t->xyz); SAFE_FREE(t->a_ref); SAFE_FREE(t->d_ref); SAFE_FREE(t->x_ref); SAFE_FREE(t->y_ref); SAFE_FREE(t->xyz_ref); if (t->sip) { sip_free(t->sip); t->sip = NULL; } il_free(t->image); il_free(t->ref); dl_free(t->dist2); if (t->weight) dl_free(t->weight); t->image = NULL; t->ref = NULL; t->dist2 = NULL; t->weight = NULL; kdtree_free(t->kd_image); kdtree_free(t->kd_ref); } void tweak_free(tweak_t* t) { tweak_clear(t); free(t); } ���������������������������astrometry.net-0.67/blind/tweak2.c������������������������������������������������������������������000644 �000765 �000024 �00000037125 12651445460 017227� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdio.h> #include <assert.h> #include "os-features.h" #include "bl.h" #include "fit-wcs.h" #include "sip.h" #include "sip_qfits.h" #include "sip-utils.h" #include "scamp.h" #include "log.h" #include "errors.h" #include "tweak.h" #include "matchfile.h" #include "matchobj.h" #include "boilerplate.h" #include "xylist.h" #include "rdlist.h" #include "mathutil.h" #include "verify.h" #include "fitsioutils.h" // Tweak debug plots? #define TWEAK_DEBUG_PLOTS 0 #if TWEAK_DEBUG_PLOTS #include "plotstuff.h" #include "plotimage.h" #include "cairoutils.h" static void makeplot(const char* plotfn, char* bgimgfn, int W, int H, int Nfield, double* fieldpix, double* fieldsigma2s, int Nindex, double* indexpix, int besti, int* theta, double* crpix, int* testperm, double * qc) { int i; plot_args_t pargs; plotimage_t* img; cairo_t* cairo; int ti; logmsg("Creating plot %s\n", plotfn); plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; pargs.outfn = plotfn; pargs.fontsize = 12; if (bgimgfn) { img = plotstuff_get_config(&pargs, "image"); img->format = PLOTSTUFF_FORMAT_JPG; plot_image_set_filename(img, bgimgfn); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); } else { float rgba[4] = {0, 0, 0.1, 1.0}; plotstuff_set_size(&pargs, W, H); //plotstuff_init2(&pargs); plotstuff_set_rgba(&pargs, rgba); plotstuff_run_command(&pargs, "fill"); } cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "gray"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (ti=0; ti<=besti; ti++) { if (testperm) i = testperm[ti]; else i = ti; //printf("field %i -> index %i\n", i, theta[i]); if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } cairo_set_line_width(cairo, 2); //for (i=0; i<=besti; i++) { for (ti=0; ti<Nfield; ti++) { anbool mark = TRUE; if (testperm) i = testperm[ti]; else i = ti; switch (theta[i]) { case THETA_DISTRACTOR: cairo_set_color(cairo, "red"); break; case THETA_CONFLICT: cairo_set_color(cairo, "yellow"); break; case THETA_FILTERED: cairo_set_color(cairo, "orange"); break; default: if (theta[i] < 0) { cairo_set_color(cairo, "gray"); } else { cairo_set_color(cairo, "white"); } mark = FALSE; } if (mark) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } if (ti <= MAX(besti, 10)) { char label[32]; sprintf(label, "%i", i); plotstuff_text_xy(&pargs, fieldpix[2*i+0], fieldpix[2*i+1], label); } if (i == besti) { cairo_set_line_width(cairo, 1); } } if (crpix) { cairo_set_color(cairo, "yellow"); cairo_set_line_width(cairo, 4); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, crpix[0], crpix[1], 10); cairo_stroke(cairo); } if (qc) { cairo_set_color(cairo, "skyblue"); cairo_set_line_width(cairo, 4); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, qc[0], qc[1], 10); cairo_stroke(cairo); } plotstuff_output(&pargs); logmsg("Wrote plot %s\n", plotfn); } static char* tdebugfn(const char* name) { static char fn[256]; static int plotnum = 0; sprintf(fn, "tweak-%03i-%s.png", plotnum, name); plotnum++; return fn; } #define TWEAK_DEBUG_PLOT(name, W, H, Nfield, fieldxy, fieldsig2, \ Nindex, indexxy, besti, theta, crpix, testperm, qc) \ makeplot(tdebugfn(name), NULL, W, H, Nfield, fieldxy, fieldsig2, \ Nindex, indexxy, besti, theta, crpix, testperm, qc); #else #define TWEAK_DEBUG_PLOT(name, W, H, Nfield, fieldxy, fieldsig2, \ Nindex, indexxy, besti, theta, crpix, testperm, qc) \ do{}while(0) #endif sip_t* tweak2(const double* fieldxy, int Nfield, double fieldjitter, int W, int H, const double* indexradec, int Nindex, double indexjitter, const double* quadcenter, double quadR2, double distractors, double logodds_bail, int sip_order, int sip_invorder, const sip_t* startwcs, sip_t* destwcs, int** newtheta, double** newodds, double* crpix, double* p_logodds, int* p_besti, int* testperm, int startorder) { int order; sip_t* sipout; int* indexin; double* indexpix; double* fieldsigma2s; double* weights; double* matchxyz; double* matchxy; int i, Nin=0; double logodds = 0; int besti = -1; int* theta = NULL; double* odds = NULL; int* refperm = NULL; double qc[2]; memcpy(qc, quadcenter, 2*sizeof(double)); if (destwcs) sipout = destwcs; else sipout = sip_create(); indexin = malloc(Nindex * sizeof(int)); indexpix = malloc(2 * Nindex * sizeof(double)); fieldsigma2s = malloc(Nfield * sizeof(double)); weights = malloc(Nfield * sizeof(double)); matchxyz = malloc(Nfield * 3 * sizeof(double)); matchxy = malloc(Nfield * 2 * sizeof(double)); // FIXME --- hmmm, how do the annealing steps and iterating up to // higher orders interact? assert(startwcs); memcpy(sipout, startwcs, sizeof(sip_t)); logverb("tweak2: starting orders %i, %i\n", sipout->a_order, sipout->ap_order); if (!sipout->wcstan.imagew) sipout->wcstan.imagew = W; if (!sipout->wcstan.imageh) sipout->wcstan.imageh = H; logverb("Tweak2: starting from WCS:\n"); if (log_get_level() >= LOG_VERB) sip_print_to(sipout, stdout); for (order=startorder; order <= sip_order; order++) { int step; int STEPS = 100; // variance growth rate wrt radius. double gamma = 1.0; //logverb("Starting tweak2 order=%i\n", order); for (step=0; step<STEPS; step++) { double iscale; double ijitter; double ra, dec; double R2; int Nmatch; int nmatch, nconf, ndist; double pix2; double totalweight; // clean up from last round (we do it here so that they're // valid when we leave the loop) free(theta); free(odds); free(refperm); // Anneal gamma = pow(0.9, step); if (step == STEPS-1) gamma = 0.0; logverb("Annealing: order %i, step %i, gamma = %g\n", order, step, gamma); debug("Using input WCS:\n"); if (log_get_level() > LOG_VERB) sip_print_to(sipout, stdout); // Project reference sources into pixel space; keep the ones inside image bounds. Nin = 0; for (i=0; i<Nindex; i++) { anbool ok; double x,y; ra = indexradec[2*i + 0]; dec = indexradec[2*i + 1]; ok = sip_radec2pixelxy(sipout, ra, dec, &x, &y); if (!ok) continue; if (!sip_pixel_is_inside_image(sipout, x, y)) continue; indexpix[Nin*2+0] = x; indexpix[Nin*2+1] = y; indexin[Nin] = i; Nin++; } logverb("%i reference sources within the image.\n", Nin); //logverb("CRPIX is (%g,%g)\n", sip.wcstan.crpix[0], sip.wcstan.crpix[1]); if (Nin == 0) { sip_free(sipout); free(matchxy); free(matchxyz); free(weights); free(fieldsigma2s); free(indexpix); free(indexin); return NULL; } iscale = sip_pixel_scale(sipout); ijitter = indexjitter / iscale; //logverb("With pixel scale of %g arcsec/pixel, index adds jitter of %g pix.\n", iscale, ijitter); /* CHECK for (i=0; i<Nin; i++) { double x,y; int ii = indexin[i]; sip_radec2pixelxy(sipout, indexradec[2*ii+0], indexradec[2*ii+1], &x, &y); logverb("indexin[%i]=%i; (%.1f,%.1f) -- (%.1f,%.1f)\n", i, ii, indexpix[i*2+0], indexpix[i*2+1], x, y); } */ for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldxy + 2*i, 2); fieldsigma2s[i] = (square(fieldjitter) + square(ijitter)) * (1.0 + gamma * R2/quadR2); } if (order == 1 && step == 0 && TWEAK_DEBUG_PLOTS) { TWEAK_DEBUG_PLOT("init", W, H, Nfield, fieldxy, fieldsigma2s, Nin, indexpix, *p_besti, *newtheta, sipout->wcstan.crpix, testperm, qc); } /* logodds = verify_star_lists(indexpix, Nin, fieldxy, fieldsigma2s, Nfield, W*H, distractors, logodds_bail, HUGE_VAL, &besti, &odds, &theta, NULL, &testperm); */ pix2 = square(fieldjitter); logodds = verify_star_lists_ror(indexpix, Nin, fieldxy, fieldsigma2s, Nfield, pix2, gamma, qc, quadR2, W, H, distractors, logodds_bail, HUGE_VAL, &besti, &odds, &theta, NULL, &testperm, &refperm); logverb("Logodds: %g\n", logodds); verify_count_hits(theta, besti, &nmatch, &nconf, &ndist); logverb("%i matches, %i distractors, %i conflicts (at best log-odds); %i field sources, %i index sources\n", nmatch, ndist, nconf, Nfield, Nin); verify_count_hits(theta, Nfield-1, &nmatch, &nconf, &ndist); logverb("%i matches, %i distractors, %i conflicts (all sources)\n", nmatch, ndist, nconf); if (log_get_level() >= LOG_VERB) { matchobj_log_hit_miss(theta, testperm, besti+1, Nfield, LOG_VERB, "Hit/miss: "); } /* logverb("\nAfter verify():\n"); for (i=0; i<Nin; i++) { double x,y; int ii = indexin[refperm[i]]; sip_radec2pixelxy(sipout, indexradec[2*ii+0], indexradec[2*ii+1], &x, &y); logverb("indexin[%i]=%i; (%.1f,%.1f) -- (%.1f,%.1f)\n", i, ii, indexpix[i*2+0], indexpix[i*2+1], x, y); } */ if (TWEAK_DEBUG_PLOTS) { char name[32]; sprintf(name, "o%is%02ipre", order, step); TWEAK_DEBUG_PLOT(name, W, H, Nfield, fieldxy, fieldsigma2s, Nin, indexpix, besti, theta, sipout->wcstan.crpix, testperm, qc); } Nmatch = 0; debug("Weights:"); for (i=0; i<Nfield; i++) { double ra,dec; if (theta[i] < 0) continue; assert(theta[i] < Nin); int ii = indexin[refperm[theta[i]]]; assert(ii < Nindex); assert(ii >= 0); ra = indexradec[ii*2+0]; dec = indexradec[ii*2+1]; radecdeg2xyzarr(ra, dec, matchxyz + Nmatch*3); memcpy(matchxy + Nmatch*2, fieldxy + i*2, 2*sizeof(double)); weights[Nmatch] = verify_logodds_to_weight(odds[i]); debug(" %.2f", weights[Nmatch]); Nmatch++; /* logverb("match img (%.1f,%.1f) -- ref (%.1f, %.1f), odds %g, wt %.3f\n", fieldxy[i*2+0], fieldxy[i*2+1], indexpix[theta[i]*2+0], indexpix[theta[i]*2+1], odds[i], weights[Nmatch-1]); double xx,yy; sip_radec2pixelxy(sipout, ra, dec, &xx, &yy); logverb("check: (%.1f, %.1f)\n", xx, yy); */ } debug("\n"); if (Nmatch < 2) { logverb("No matches -- aborting tweak attempt\n"); free(theta); sip_free(sipout); free(matchxy); free(matchxyz); free(weights); free(fieldsigma2s); free(indexpix); free(indexin); return NULL; } // Update the "quad center" to be the weighted average matched star posn. qc[0] = qc[1] = 0.0; totalweight = 0.0; for (i=0; i<Nmatch; i++) { qc[0] += (weights[i] * matchxy[2*i+0]); qc[1] += (weights[i] * matchxy[2*i+1]); totalweight += weights[i]; } qc[0] /= totalweight; qc[1] /= totalweight; logverb("Moved quad center to (%.1f, %.1f)\n", qc[0], qc[1]); // sipout->a_order = sipout->b_order = order; sipout->ap_order = sipout->bp_order = sip_invorder; logverb("tweak2: setting orders %i, %i\n", sipout->a_order, sipout->ap_order); if (crpix) { tan_t temptan; logverb("Moving tangent point to given CRPIX (%g,%g)\n", crpix[0], crpix[1]); fit_tan_wcs_move_tangent_point_weighted(matchxyz, matchxy, weights, Nmatch, crpix, &sipout->wcstan, &temptan); fit_tan_wcs_move_tangent_point_weighted(matchxyz, matchxy, weights, Nmatch, crpix, &temptan, &sipout->wcstan); } int doshift = 1; fit_sip_wcs(matchxyz, matchxy, weights, Nmatch, &(sipout->wcstan), order, sip_invorder, doshift, sipout); debug("Got SIP:\n"); if (log_get_level() > LOG_VERB) sip_print_to(sipout, stdout); sipout->wcstan.imagew = W; sipout->wcstan.imageh = H; } } //logverb("Final logodds: %g\n", logodds); // Now, recompute final logodds after turning 'gamma' on again (?) // FIXME -- this counts the quad stars in the logodds... { double gamma = 1.0; double iscale; double ijitter; double ra, dec; double R2; int nmatch, nconf, ndist; double pix2; free(theta); free(odds); free(refperm); gamma = 1.0; // Project reference sources into pixel space; keep the ones inside image bounds. Nin = 0; for (i=0; i<Nindex; i++) { anbool ok; double x,y; ra = indexradec[2*i + 0]; dec = indexradec[2*i + 1]; ok = sip_radec2pixelxy(sipout, ra, dec, &x, &y); if (!ok) continue; if (!sip_pixel_is_inside_image(sipout, x, y)) continue; indexpix[Nin*2+0] = x; indexpix[Nin*2+1] = y; indexin[Nin] = i; Nin++; } logverb("%i reference sources within the image.\n", Nin); iscale = sip_pixel_scale(sipout); ijitter = indexjitter / iscale; for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldxy + 2*i, 2); fieldsigma2s[i] = (square(fieldjitter) + square(ijitter)) * (1.0 + gamma * R2/quadR2); } pix2 = square(fieldjitter); logodds = verify_star_lists_ror(indexpix, Nin, fieldxy, fieldsigma2s, Nfield, pix2, gamma, qc, quadR2, W, H, distractors, logodds_bail, HUGE_VAL, &besti, &odds, &theta, NULL, &testperm, &refperm); logverb("Logodds: %g\n", logodds); verify_count_hits(theta, besti, &nmatch, &nconf, &ndist); logverb("%i matches, %i distractors, %i conflicts (at best log-odds); %i field sources, %i index sources\n", nmatch, ndist, nconf, Nfield, Nin); verify_count_hits(theta, Nfield-1, &nmatch, &nconf, &ndist); logverb("%i matches, %i distractors, %i conflicts (all sources)\n", nmatch, ndist, nconf); if (log_get_level() >= LOG_VERB) { matchobj_log_hit_miss(theta, testperm, besti+1, Nfield, LOG_VERB, "Hit/miss: "); } if (TWEAK_DEBUG_PLOTS) { TWEAK_DEBUG_PLOT("final", W, H, Nfield, fieldxy, fieldsigma2s, Nin, indexpix, besti, theta, sipout->wcstan.crpix, testperm, qc); } } if (newtheta) { // undo the "indexpix" inside-image-bounds cut. (*newtheta) = malloc(Nfield * sizeof(int)); for (i=0; i<Nfield; i++) { int nt; if (theta[i] < 0) nt = theta[i]; else nt = indexin[refperm[theta[i]]]; (*newtheta)[i] = nt; } } free(theta); free(refperm); if (newodds) *newodds = odds; else free(odds); logverb("Tweak2: final WCS:\n"); if (log_get_level() >= LOG_VERB) sip_print_to(sipout, stdout); if (p_logodds) *p_logodds = logodds; if (p_besti) *p_besti = besti; free(indexin); free(indexpix); free(fieldsigma2s); free(weights); free(matchxyz); free(matchxy); return sipout; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/uniformize-catalog-main.c�������������������������������������������������000644 �000765 �000024 �00000007167 12651445460 022556� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "os-features.h" #include "uniformize-catalog.h" #include "fitstable.h" #include "boilerplate.h" #include "errors.h" #include "log.h" #include "fitsioutils.h" const char* OPTIONS = "hvH:s:n:N:d:R:D:S:fm:"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s [options] <input-FITS-catalog> <output-FITS-catalog>\n" " [-R <ra-column-name>]: name of RA in FITS table (default RA)\n" " [-D <dec-column-name>]: name of DEC in FITS table (default DEC)\n" " [-S <sort-column-name>]: column on which to sort\n" " [-f]: sort in descending order (eg, for FLUX); default ascending (eg, for MAG)\n" " [-H <big healpix>]; default is all-sky\n" " [-s <big healpix Nside>]; default is 1\n" " [-m <margin>]: add a margin of <margin> healpixels; default 0\n" " [-n <sweeps>] (ie, number of stars per fine healpix grid cell); default 10\n" " [-N <nside>]: fine healpixelization grid; default 100.\n" " [-d <dedup-radius>]: deduplication radius in arcseconds; default no deduplication\n" " [-v]: +verbose\n" "\n", progname); } int main(int argc, char *argv[]) { int argchar; char* progname = argv[0]; char* infn = NULL; char* outfn = NULL; char* racol = NULL; char* deccol = NULL; char* sortcol = NULL; anbool sortasc = TRUE; int loglvl = LOG_MSG; int bighp = -1; int bignside = 1; int sweeps = 10; int Nside = 100; double dedup = 0.0; int margin = 0; double mincut = -HUGE_VAL; fitstable_t* intable; fitstable_t* outtable; char** myargs; int nmyargs; while ((argchar = getopt (argc, argv, OPTIONS)) != -1) switch (argchar) { case 'R': racol = optarg; break; case 'D': deccol = optarg; break; case 'S': sortcol = optarg; break; case 'f': sortasc = FALSE; break; case 'H': bighp = atoi(optarg); break; case 's': bignside = atoi(optarg); break; case 'n': sweeps = atoi(optarg); break; case 'N': Nside = atoi(optarg); break; case 'd': dedup = atof(optarg); break; case 'm': margin = atoi(optarg); break; case 'v': loglvl++; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } nmyargs = argc - optind; myargs = argv + optind; if (nmyargs != 2) { printHelp(progname); exit(-1); } log_init(loglvl); fits_use_error_system(); infn = myargs[0]; outfn = myargs[1]; logmsg("Reading catalog from %s, writing to %s\n", infn, outfn); logmsg("Reading %s...\n", infn); intable = fitstable_open(infn); if (!intable) { ERROR("Couldn't read catalog %s", infn); exit(-1); } logmsg("Got %i stars\n", fitstable_nrows(intable)); outtable = fitstable_open_for_writing(outfn); if (!outtable) { ERROR("Failed to open output table %s", outfn); exit(-1); } /* if (fitstable_write_primary_header(outtable)) { ERROR("Failed to write primary header"); exit(-1); } */ if (uniformize_catalog(intable, outtable, racol, deccol, sortcol, sortasc, mincut, bighp, bignside, margin, Nside, dedup, sweeps, argv, argc)) { exit(-1); } if (fitstable_fix_primary_header(outtable) || fitstable_close(outtable)) { ERROR("Failed to close output table"); exit(-1); } fitstable_close(intable); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/uniformize-catalog.c������������������������������������������������������000644 �000765 �000024 �00000027557 12651445460 021641� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <stdint.h> #include <assert.h> #include "os-features.h" #include "uniformize-catalog.h" #include "intmap.h" #include "healpix.h" #include "healpix-utils.h" #include "permutedsort.h" #include "starutil.h" #include "an-bool.h" #include "mathutil.h" #include "errors.h" #include "log.h" #include "boilerplate.h" #include "fitsioutils.h" struct oh_token { int hp; int nside; int finenside; }; // Return 1 if the given "hp" is outside the healpix described in "oh_token". static int outside_healpix(int hp, void* vtoken) { struct oh_token* token = vtoken; int bighp; healpix_convert_nside(hp, token->finenside, token->nside, &bighp); return (bighp == token->hp ? 0 : 1); } static anbool is_duplicate(int hp, double ra, double dec, int Nside, intmap_t* starlists, double* ras, double* decs, double dedupr2) { double xyz[3]; int neigh[9]; int nn; double xyz2[3]; int k; size_t j; radecdeg2xyzarr(ra, dec, xyz); // Check this healpix... neigh[0] = hp; // Check neighbouring healpixes... (+1 is to skip over this hp) nn = 1 + healpix_get_neighbours(hp, neigh+1, Nside); for (k=0; k<nn; k++) { int otherhp = neigh[k]; bl* lst = intmap_find(starlists, otherhp, FALSE); if (!lst) continue; for (j=0; j<bl_size(lst); j++) { int otherindex; bl_get(lst, j, &otherindex); radecdeg2xyzarr(ras[otherindex], decs[otherindex], xyz2); if (!distsq_exceeds(xyz, xyz2, 3, dedupr2)) return TRUE; } } return FALSE; } int uniformize_catalog(fitstable_t* intable, fitstable_t* outtable, const char* racol, const char* deccol, const char* sortcol, anbool sort_ascending, double sort_min_cut, // ? Or do this cut in a separate process? int bighp, int bignside, int nmargin, // uniformization nside. int Nside, double dedup_radius, int nsweeps, char** args, int argc) { anbool allsky; intmap_t* starlists; int NHP; anbool dense = FALSE; double dedupr2 = 0.0; tfits_type dubl; int N; int* inorder = NULL; int* outorder = NULL; int outi; double *ra = NULL, *dec = NULL; il* myhps = NULL; int i,j,k; int nkeep = nsweeps; int noob = 0; int ndup = 0; struct oh_token token; int* npersweep = NULL; qfits_header* outhdr = NULL; double *sortval = NULL; if (bignside == 0) bignside = 1; allsky = (bighp == -1); if (Nside % bignside) { ERROR("Fine healpixelization Nside must be a multiple of the coarse healpixelization Nside"); return -1; } if (Nside > HP_MAX_INT_NSIDE) { ERROR("Error: maximum healpix Nside = %i", HP_MAX_INT_NSIDE); return -1; } NHP = 12 * Nside * Nside; logverb("Healpix Nside: %i, # healpixes on the whole sky: %i\n", Nside, NHP); if (!allsky) { logverb("Creating index for healpix %i, nside %i\n", bighp, bignside); logverb("Number of healpixes: %i\n", ((Nside/bignside)*(Nside/bignside))); } logverb("Healpix side length: %g arcmin.\n", healpix_side_length_arcmin(Nside)); dubl = fitscolumn_double_type(); if (!racol) racol = "RA"; ra = fitstable_read_column(intable, racol, dubl); if (!ra) { ERROR("Failed to find RA column (%s) in table", racol); return -1; } if (!deccol) deccol = "DEC"; dec = fitstable_read_column(intable, deccol, dubl); if (!dec) { ERROR("Failed to find DEC column (%s) in table", deccol); free(ra); return -1; } N = fitstable_nrows(intable); logverb("Have %i objects\n", N); // FIXME -- argsort and seek around the input table, and append to // starlists in order; OR read from the input table in sequence and // sort in the starlists? if (sortcol) { logverb("Sorting by %s...\n", sortcol); sortval = fitstable_read_column(intable, sortcol, dubl); if (!sortval) { ERROR("Failed to read sorting column \"%s\"", sortcol); free(ra); free(dec); return -1; } inorder = permuted_sort(sortval, sizeof(double), sort_ascending ? compare_doubles_asc : compare_doubles_desc, NULL, N); if (sort_min_cut > -HUGE_VAL) { logverb("Cutting to %s > %g...\n", sortcol, sort_min_cut); // Cut objects with sortval < sort_min_cut. if (sort_ascending) { // skipped objects are at the front -- find the first obj // to keep for (i=0; i<N; i++) if (sortval[inorder[i]] > sort_min_cut) break; // move the "inorder" indices down. if (i) memmove(inorder, inorder+i, (N-i)*sizeof(int)); N -= i; } else { // skipped objects are at the end -- find the last obj to keep. for (i=N-1; i>=0; i--) if (sortval[inorder[i]] > sort_min_cut) break; N = i+1; } logverb("Cut to %i objects\n", N); } //free(sortval); } token.nside = bignside; token.finenside = Nside; token.hp = bighp; if (!allsky && nmargin) { int bigbighp, bighpx, bighpy; //int ninside; il* seeds = il_new(256); logverb("Finding healpixes in range...\n"); healpix_decompose_xy(bighp, &bigbighp, &bighpx, &bighpy, bignside); //ninside = (Nside/bignside)*(Nside/bignside); // Prime the queue with the fine healpixes that are on the // boundary of the big healpix. for (i=0; i<((Nside / bignside) - 1); i++) { // add (i,0), (i,max), (0,i), and (0,max) healpixes int xx = i + bighpx * (Nside / bignside); int yy = i + bighpy * (Nside / bignside); int y0 = bighpy * (Nside / bignside); // -1 prevents us from double-adding the corners. int y1 =(1 + bighpy)* (Nside / bignside) - 1; int x0 = bighpx * (Nside / bignside); int x1 =(1 + bighpx)* (Nside / bignside) - 1; assert(xx < Nside); assert(yy < Nside); assert(x0 < Nside); assert(x1 < Nside); assert(y0 < Nside); assert(y1 < Nside); il_append(seeds, healpix_compose_xy(bigbighp, xx, y0, Nside)); il_append(seeds, healpix_compose_xy(bigbighp, xx, y1, Nside)); il_append(seeds, healpix_compose_xy(bigbighp, x0, yy, Nside)); il_append(seeds, healpix_compose_xy(bigbighp, x1, yy, Nside)); } logmsg("Number of boundary healpixes: %zu (Nside/bignside = %i)\n", il_size(seeds), Nside/bignside); myhps = healpix_region_search(-1, seeds, Nside, NULL, NULL, outside_healpix, &token, nmargin); logmsg("Number of margin healpixes: %zu\n", il_size(myhps)); il_free(seeds); il_sort(myhps, TRUE); // DEBUG il_check_consistency(myhps); il_check_sorted_ascending(myhps, TRUE); } dedupr2 = arcsec2distsq(dedup_radius); starlists = intmap_new(sizeof(int32_t), nkeep, 0, dense); logverb("Placing stars in grid cells...\n"); for (i=0; i<N; i++) { int hp; bl* lst; int32_t j32; anbool oob; if (inorder) { j = inorder[i]; //printf("Placing star %i (%i): sort value %s = %g, RA,Dec=%g,%g\n", i, j, sortcol, sortval[j], ra[j], dec[j]); } else j = i; hp = radecdegtohealpix(ra[j], dec[j], Nside); //printf("HP %i\n", hp); // in bounds? oob = FALSE; if (myhps) { oob = (outside_healpix(hp, &token) && !il_sorted_contains(myhps, hp)); } else if (!allsky) { oob = (outside_healpix(hp, &token)); } if (oob) { //printf("out of bounds.\n"); noob++; continue; } lst = intmap_find(starlists, hp, TRUE); /* printf("list has %i existing entries.\n", bl_size(lst)); for (k=0; k<bl_size(lst); k++) { bl_get(lst, k, &j32); printf(" %i: index %i, %s = %g\n", k, j32, sortcol, sortval[j32]); } */ // is this list full? if (nkeep && (bl_size(lst) >= nkeep)) { // Here we assume we're working in sorted order: once the list is full we're done. //printf("Skipping: list is full.\n"); continue; } if ((dedupr2 > 0.0) && is_duplicate(hp, ra[j], dec[j], Nside, starlists, ra, dec, dedupr2)) { //printf("Skipping: duplicate\n"); ndup++; continue; } // Add the new star (by index) j32 = j; bl_append(lst, &j32); } logverb("%i outside the healpix\n", noob); logverb("%i duplicates\n", ndup); il_free(myhps); myhps = NULL; free(inorder); inorder = NULL; free(ra); ra = NULL; free(dec); dec = NULL; outorder = malloc(N * sizeof(int)); outi = 0; npersweep = calloc(nsweeps, sizeof(int)); for (k=0; k<nsweeps; k++) { int starti = outi; int32_t j32; for (i=0;; i++) { bl* lst; int hp; if (!intmap_get_entry(starlists, i, &hp, &lst)) break; if (bl_size(lst) <= k) continue; bl_get(lst, k, &j32); outorder[outi] = j32; //printf("sweep %i, cell #%i, hp %i, star %i, %s = %g\n", k, i, hp, j32, sortcol, sortval[j32]); outi++; } logmsg("Sweep %i: %i stars\n", k+1, outi - starti); npersweep[k] = outi - starti; if (sortcol) { // Re-sort within this sweep. permuted_sort(sortval, sizeof(double), sort_ascending ? compare_doubles_asc : compare_doubles_desc, outorder + starti, npersweep[k]); /* for (i=0; i<npersweep[k]; i++) { printf(" within sweep %i: star %i, j=%i, %s=%g\n", k, i, outorder[starti + i], sortcol, sortval[outorder[starti + i]]); } */ } } intmap_free(starlists); starlists = NULL; ////// free(sortval); sortval = NULL; logmsg("Total: %i stars\n", outi); N = outi; outhdr = fitstable_get_primary_header(outtable); if (allsky) qfits_header_add(outhdr, "ALLSKY", "T", "All-sky catalog.", NULL); BOILERPLATE_ADD_FITS_HEADERS(outhdr); qfits_header_add(outhdr, "HISTORY", "This file was generated by the command-line:", NULL, NULL); fits_add_args(outhdr, args, argc); qfits_header_add(outhdr, "HISTORY", "(end of command line)", NULL, NULL); fits_add_long_history(outhdr, "uniformize-catalog args:"); fits_add_long_history(outhdr, " RA,Dec columns: %s,%s", racol, deccol); fits_add_long_history(outhdr, " sort column: %s", sortcol); fits_add_long_history(outhdr, " sort direction: %s", sort_ascending ? "ascending" : "descending"); if (sort_ascending) fits_add_long_history(outhdr, " (ie, for mag-like sort columns)"); else fits_add_long_history(outhdr, " (ie, for flux-like sort columns)"); fits_add_long_history(outhdr, " uniformization nside: %i", Nside); fits_add_long_history(outhdr, " (ie, side length ~ %g arcmin)", healpix_side_length_arcmin(Nside)); fits_add_long_history(outhdr, " deduplication scale: %g arcsec", dedup_radius); fits_add_long_history(outhdr, " number of sweeps: %i", nsweeps); fits_header_add_int(outhdr, "NSTARS", N, "Number of stars."); fits_header_add_int(outhdr, "HEALPIX", bighp, "Healpix covered by this catalog, with Nside=HPNSIDE"); fits_header_add_int(outhdr, "HPNSIDE", bignside, "Nside of HEALPIX."); fits_header_add_int(outhdr, "CUTNSIDE", Nside, "uniformization scale (healpix nside)"); fits_header_add_int(outhdr, "CUTMARG", nmargin, "margin size, in healpixels"); //qfits_header_add(outhdr, "CUTBAND", cutband, "band on which the cut was made", NULL); fits_header_add_double(outhdr, "CUTDEDUP", dedup_radius, "deduplication radius [arcsec]"); fits_header_add_int(outhdr, "CUTNSWEP", nsweeps, "number of sweeps"); //fits_header_add_double(outhdr, "CUTMINMG", minmag, "minimum magnitude"); //fits_header_add_double(outhdr, "CUTMAXMG", maxmag, "maximum magnitude"); for (k=0; k<nsweeps; k++) { char key[64]; sprintf(key, "SWEEP%i", (k+1)); fits_header_add_int(outhdr, key, npersweep[k], "# stars added"); } free(npersweep); if (fitstable_write_primary_header(outtable)) { ERROR("Failed to write primary header"); return -1; } // Write output. fitstable_add_fits_columns_as_struct2(intable, outtable); if (fitstable_write_header(outtable)) { ERROR("Failed to write output table header"); return -1; } logmsg("Writing output...\n"); logverb("Row size: %i\n", fitstable_row_size(intable)); if (fitstable_copy_rows_data(intable, outorder, N, outtable)) { ERROR("Failed to copy rows from input table to output"); return -1; } if (fitstable_fix_header(outtable)) { ERROR("Failed to fix output table header"); return -1; } free(outorder); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/unpermute-quads-main.c����������������������������������������������������000644 �000765 �000024 �00000003151 12651445460 022103� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "unpermute-quads.h" #include "boilerplate.h" #define OPTIONS "hq:c:Q:C:" static void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -q <input-quad-filename>\n" " -c <input-code-kdtree-filename>\n" " -Q <output-quad-filename>\n" " -C <output-code-kdtree-filename>\n" "\n", progname); } int main(int argc, char **args) { int argchar; char* progname = args[0]; char* quadinfn = NULL; char* quadoutfn = NULL; char* ckdtinfn = NULL; char* ckdtoutfn = NULL; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'q': quadinfn = optarg; break; case 'c': ckdtinfn = optarg; break; case 'Q': quadoutfn = optarg; break; case 'C': ckdtoutfn = optarg; break; case '?': fprintf(stderr, "Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } if (!(quadinfn && quadoutfn && ckdtinfn && ckdtoutfn)) { printHelp(progname); fprintf(stderr, "\nYou must specify all filenames (-q, -c, -Q, -C)\n"); exit(-1); } if (unpermute_quads_files(quadinfn, ckdtinfn, quadoutfn, ckdtoutfn, args, argc)) { exit(-1); } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/unpermute-quads.c���������������������������������������������������������000644 �000765 �000024 �00000013245 12651445460 021166� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "kdtree.h" #include "starutil.h" #include "quadfile.h" #include "fitsioutils.h" #include "codekd.h" #include "anqfits.h" #include "log.h" #include "errors.h" #include "boilerplate.h" int unpermute_quads(quadfile_t* quadin, codetree_t* treein, quadfile_t* quadout, codetree_t** p_treeout, char** args, int argc) { int i; qfits_header* codehdr; qfits_header* hdr; int healpix; int hpnside; int codehp = -1; qfits_header* qouthdr; qfits_header* qinhdr; codetree_t* treeout; anbool allsky; codehdr = codetree_header(treein); healpix = quadin->healpix; hpnside = quadin->hpnside; allsky = qfits_header_getboolean(codehdr, "ALLSKY", 0); if (allsky) logverb("Index is all-sky\n"); else { codehp = qfits_header_getint(codehdr, "HEALPIX", -1); if (codehp == -1) ERROR("Warning, input code kdtree didn't have a HEALPIX header"); else if (codehp != healpix) { ERROR("Quadfile says it's healpix %i, but code kdtree says %i", healpix, codehp); return -1; } } quadout->healpix = healpix; quadout->hpnside = hpnside; quadout->indexid = quadin->indexid; quadout->numstars = quadin->numstars; quadout->dimquads = quadin->dimquads; quadout->index_scale_upper = quadin->index_scale_upper; quadout->index_scale_lower = quadin->index_scale_lower; qouthdr = quadfile_get_header(quadout); qinhdr = quadfile_get_header(quadin); BOILERPLATE_ADD_FITS_HEADERS(qouthdr); qfits_header_add(qouthdr, "HISTORY", "This file was created by the program \"unpermute-quads\".", NULL, NULL); qfits_header_add(qouthdr, "HISTORY", "unpermute-quads command line:", NULL, NULL); fits_add_args(qouthdr, args, argc); qfits_header_add(qouthdr, "HISTORY", "(end of unpermute-quads command line)", NULL, NULL); qfits_header_add(qouthdr, "HISTORY", "** unpermute-quads: history from input:", NULL, NULL); fits_copy_all_headers(qinhdr, qouthdr, "HISTORY"); qfits_header_add(qouthdr, "HISTORY", "** unpermute-quads end of history from input.", NULL, NULL); qfits_header_add(qouthdr, "COMMENT", "** unpermute-quads: comments from input:", NULL, NULL); fits_copy_all_headers(qinhdr, qouthdr, "COMMENT"); qfits_header_add(qouthdr, "COMMENT", "** unpermute-quads: end of comments from input.", NULL, NULL); an_fits_copy_header(qinhdr, qouthdr, "CXDX"); an_fits_copy_header(qinhdr, qouthdr, "CXDXLT1"); an_fits_copy_header(qinhdr, qouthdr, "CIRCLE"); an_fits_copy_header(qinhdr, qouthdr, "ALLSKY"); if (quadfile_write_header(quadout)) { ERROR("Failed to write quadfile header"); return -1; } for (i=0; i<codetree_N(treein); i++) { unsigned int stars[quadin->dimquads]; int ind = codetree_get_permuted(treein, i); if (quadfile_get_stars(quadin, ind, stars)) { ERROR("Failed to read quad entry"); return -1; } if (quadfile_write_quad(quadout, stars)) { ERROR("Failed to write quad entry"); return -1; } } if (quadfile_fix_header(quadout)) { ERROR("Failed to fix quadfile header"); return -1; } treeout = codetree_new(); treeout->tree = malloc(sizeof(kdtree_t)); memcpy(treeout->tree, treein->tree, sizeof(kdtree_t)); treeout->tree->perm = NULL; hdr = codetree_header(treeout); an_fits_copy_header(qinhdr, hdr, "HEALPIX"); an_fits_copy_header(qinhdr, hdr, "HPNSIDE"); an_fits_copy_header(qinhdr, hdr, "ALLSKY"); BOILERPLATE_ADD_FITS_HEADERS(hdr); qfits_header_add(hdr, "HISTORY", "This file was created by the program \"unpermute-quads\".", NULL, NULL); qfits_header_add(hdr, "HISTORY", "unpermute-quads command line:", NULL, NULL); fits_add_args(hdr, args, argc); qfits_header_add(hdr, "HISTORY", "(end of unpermute-quads command line)", NULL, NULL); qfits_header_add(hdr, "HISTORY", "** unpermute-quads: history from input ckdt:", NULL, NULL); fits_copy_all_headers(codehdr, hdr, "HISTORY"); qfits_header_add(hdr, "HISTORY", "** unpermute-quads end of history from input ckdt.", NULL, NULL); qfits_header_add(hdr, "COMMENT", "** unpermute-quads: comments from input ckdt:", NULL, NULL); fits_copy_all_headers(codehdr, hdr, "COMMENT"); qfits_header_add(hdr, "COMMENT", "** unpermute-quads: end of comments from input ckdt.", NULL, NULL); an_fits_copy_header(codehdr, hdr, "CXDX"); an_fits_copy_header(codehdr, hdr, "CXDXLT1"); an_fits_copy_header(codehdr, hdr, "CIRCLE"); *p_treeout = treeout; return 0; } int unpermute_quads_files(const char* quadinfn, const char* ckdtinfn, const char* quadoutfn, const char* ckdtoutfn, char** args, int argc) { quadfile_t* quadin; quadfile_t* quadout; codetree_t* treein; codetree_t* treeout; logmsg("Reading code tree from %s ...\n", ckdtinfn); treein = codetree_open(ckdtinfn); if (!treein) { ERROR("Failed to read code kdtree from %s", ckdtinfn); return -1; } logmsg("Reading quads from %s ...\n", quadinfn); quadin = quadfile_open(quadinfn); if (!quadin) { ERROR("Failed to read quads from %s", quadinfn); return -1; } logmsg("Writing quads to %s ...\n", quadoutfn); quadout = quadfile_open_for_writing(quadoutfn); if (!quadout) { ERROR("Failed to write quads to %s", quadoutfn); return -1; } if (unpermute_quads(quadin, treein, quadout, &treeout, args, argc)) { return -1; } if (quadfile_close(quadout)) { ERROR("Failed to close output quadfile"); return -1; } quadfile_close(quadin); logmsg("Writing code kdtree to %s ...\n", ckdtoutfn); if (codetree_write_to_file(treeout, ckdtoutfn) || codetree_close(treeout)) { ERROR("Failed to write code kdtree"); return -1; } free(treein->tree); treein->tree = NULL; codetree_close(treein); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/unpermute-stars-main.c����������������������������������������������������000644 �000765 �000024 �00000004060 12651445460 022122� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "kdtree.h" #include "starutil.h" #include "quadfile.h" #include "fitsioutils.h" #include "starkd.h" #include "boilerplate.h" #include "log.h" #include "errors.h" #include "unpermute-stars.h" static const char* OPTIONS = "hs:q:S:Q:wcv"; void printHelp(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -s <input-star-kdtree-filename>\n" " -q <input-quads-filename>\n" " -S <output-star-kdtree-filename>\n" " -Q <output-quads-filename>\n" " [-w]: store sweep number in output star kdtree file.\n" " [-c]: check values\n" " [-v]: more verbose\n" "\n", progname); } int main(int argc, char **args) { int argchar; char* progname = args[0]; char* quadinfn = NULL; char* skdtinfn = NULL; char* quadoutfn = NULL; char* skdtoutfn = NULL; anbool dosweeps = FALSE; anbool check = FALSE; int loglvl = LOG_MSG; while ((argchar = getopt (argc, args, OPTIONS)) != -1) switch (argchar) { case 'c': check = TRUE; break; case 'v': loglvl++; break; case 'q': quadinfn = optarg; break; case 'Q': quadoutfn = optarg; break; case 's': skdtinfn = optarg; break; case 'S': skdtoutfn = optarg; break; case 'w': dosweeps = TRUE; break; case '?': ERROR("Unknown option `-%c'.\n", optopt); case 'h': printHelp(progname); return 0; default: return -1; } log_init(loglvl); if (!(quadinfn && quadoutfn && skdtinfn && skdtoutfn)) { printHelp(progname); ERROR("\nMust include all filenames (-q, -Q, -s, -S)\n"); exit(-1); } if (unpermute_stars_files(skdtinfn, quadinfn, skdtoutfn, quadoutfn, dosweeps, check, args, argc)) { exit(-1); } return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/unpermute-stars.c���������������������������������������������������������000644 �000765 �000024 �00000022225 12651445460 021203� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include <assert.h> #include "kdtree.h" #include "starutil.h" #include "quadfile.h" #include "fitsioutils.h" #include "anqfits.h" #include "starkd.h" #include "boilerplate.h" #include "log.h" #include "errors.h" int unpermute_stars(startree_t* treein, quadfile_t* qfin, startree_t** p_treeout, quadfile_t* qfout, anbool dosweeps, anbool check, char** args, int argc) { startree_t* treeout; int i; int N; int healpix = -1; int hpnside = 0; int starhp = -1; int lastgrass; qfits_header* qouthdr; qfits_header* qinhdr; anbool allsky; assert(p_treeout); N = startree_N(treein); allsky = qfits_header_getboolean(startree_header(treein), "ALLSKY", 0); if (allsky) logverb("Star kd-tree is all-sky\n"); else { starhp = qfits_header_getint(startree_header(treein), "HEALPIX", -1); if (starhp == -1) ERROR("Warning, input star kdtree didn't have a HEALPIX header.\n"); hpnside = qfits_header_getint(startree_header(treein), "HPNSIDE", 1); healpix = starhp; logverb("Star kd-tree covers healpix %i, nside %i\n", healpix, hpnside); } qfout->healpix = healpix; qfout->hpnside = hpnside; qfout->numstars = qfin->numstars; qfout->dimquads = qfin->dimquads; qfout->index_scale_upper = qfin->index_scale_upper; qfout->index_scale_lower = qfin->index_scale_lower; qfout->indexid = qfin->indexid; qouthdr = quadfile_get_header(qfout); qinhdr = quadfile_get_header(qfin); an_fits_copy_header(qinhdr, qouthdr, "ALLSKY"); BOILERPLATE_ADD_FITS_HEADERS(qouthdr); qfits_header_add(qouthdr, "HISTORY", "This file was created by the program \"unpermute-stars\".", NULL, NULL); qfits_header_add(qouthdr, "HISTORY", "unpermute-stars command line:", NULL, NULL); fits_add_args(qouthdr, args, argc); qfits_header_add(qouthdr, "HISTORY", "(end of unpermute-stars command line)", NULL, NULL); qfits_header_add(qouthdr, "HISTORY", "** unpermute-stars: history from input:", NULL, NULL); fits_copy_all_headers(qinhdr, qouthdr, "HISTORY"); qfits_header_add(qouthdr, "HISTORY", "** unpermute-stars: end of history from input.", NULL, NULL); qfits_header_add(qouthdr, "COMMENT", "** unpermute-stars: comments from input:", NULL, NULL); fits_copy_all_headers(qinhdr, qouthdr, "COMMENT"); qfits_header_add(qouthdr, "COMMENT", "** unpermute-stars: end of comments from input.", NULL, NULL); if (quadfile_write_header(qfout)) { ERROR("Failed to write quadfile header.\n"); return -1; } logmsg("Writing quads...\n"); startree_compute_inverse_perm(treein); if (check) { logmsg("Running quadfile_check()...\n"); if (quadfile_check(qfin)) { ERROR("quadfile_check() failed"); return -1; } logmsg("Check passed.\n"); logmsg("Checking inverse permutation...\n"); if (startree_check_inverse_perm(treein)) { ERROR("check failed!"); return -1; } logmsg("Running startree kdtree_check()...\n"); if (kdtree_check(treein->tree)) { ERROR("kdtree_check() failed"); return -1; } logmsg("Check passed.\n"); } lastgrass = 0; for (i=0; i<qfin->numquads; i++) { int j; unsigned int stars[qfin->dimquads]; if (i*80/qfin->numquads != lastgrass) { logmsg("."); fflush(stdout); lastgrass = i*80/qfin->numquads; } if (quadfile_get_stars(qfin, i, stars)) { ERROR("Failed to read quadfile entry.\n"); return -1; } for (j=0; j<qfin->dimquads; j++) stars[j] = treein->inverse_perm[stars[j]]; if (quadfile_write_quad(qfout, stars)) { ERROR("Failed to write quadfile entry.\n"); return -1; } } logmsg("\n"); if (quadfile_fix_header(qfout)) { ERROR("Failed to fix quadfile header"); return -1; } treeout = startree_new(); treeout->tree = malloc(sizeof(kdtree_t)); memcpy(treeout->tree, treein->tree, sizeof(kdtree_t)); treeout->tree->perm = NULL; an_fits_copy_header(startree_header(treein), startree_header(treeout), "HEALPIX"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "HPNSIDE"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "ALLSKY"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "JITTER"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTNSIDE"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTMARG"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTBAND"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTDEDUP"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTNSWEP"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTMINMG"); an_fits_copy_header(startree_header(treein), startree_header(treeout), "CUTMAXMG"); qfits_header_add(startree_header(treeout), "HISTORY", "unpermute-stars command line:", NULL, NULL); fits_add_args(startree_header(treeout), args, argc); qfits_header_add(startree_header(treeout), "HISTORY", "(end of unpermute-stars command line)", NULL, NULL); qfits_header_add(startree_header(treeout), "HISTORY", "** unpermute-stars: history from input:", NULL, NULL); fits_copy_all_headers(startree_header(treein), startree_header(treeout), "HISTORY"); qfits_header_add(startree_header(treeout), "HISTORY", "** unpermute-stars: end of history from input.", NULL, NULL); qfits_header_add(startree_header(treeout), "COMMENT", "** unpermute-stars: comments from input:", NULL, NULL); fits_copy_all_headers(startree_header(treein), startree_header(treeout), "COMMENT"); qfits_header_add(startree_header(treeout), "COMMENT", "** unpermute-stars: end of comments from input.", NULL, NULL); if (dosweeps) { // copy sweepX headers. for (i=1;; i++) { char key[16]; int n; sprintf(key, "SWEEP%i", i); n = qfits_header_getint(treein->header, key, -1); if (n == -1) break; an_fits_copy_header(treein->header, treeout->header, key); } // compute sweep array. treeout->sweep = malloc(N * sizeof(uint8_t)); for (i=0; i<N; i++) { int ind = treein->tree->perm[i]; // Stars are sorted first by sweep and then by brightness within // the sweep. Instead of just storing the sweep number, we can // store a quantization of the total-ordered rank. treeout->sweep[i] = (uint8_t)floor((float)256.0 * (float)ind / (float)N); } } *p_treeout = treeout; return 0; } int unpermute_stars_tagalong(startree_t* treein, fitstable_t* tagout) { fitstable_t* tagin; qfits_header* tmphdr; int N; tagin = startree_get_tagalong(treein); if (!tagin) { ERROR("No input tag-along table"); return -1; } N = startree_N(treein); assert(fitstable_nrows(tagin) == N); fitstable_clear_table(tagin); fitstable_add_fits_columns_as_struct(tagin); fitstable_copy_columns(tagin, tagout); tmphdr = tagout->header; tagout->header = tagin->header; if (fitstable_write_header(tagout)) { ERROR("Failed to write tag-along table header"); return -1; } if (fitstable_copy_rows_data(tagin, (int*)treein->tree->perm, N, tagout)) { ERROR("Failed to copy tag-along table rows from input to output"); return -1; } if (fitstable_fix_header(tagout)) { ERROR("Failed to fix tag-along table header"); return -1; } tagout->header = tmphdr; return 0; } int unpermute_stars_files(const char* skdtinfn, const char* quadinfn, const char* skdtoutfn, const char* quadoutfn, anbool dosweeps, anbool check, char** args, int argc) { quadfile_t* qfin; quadfile_t* qfout; startree_t* treein; startree_t* treeout; fitstable_t* tagout = NULL; fitstable_t* tagin; int rtn; logmsg("Reading star tree from %s ...\n", skdtinfn); treein = startree_open(skdtinfn); if (!treein) { ERROR("Failed to read star kdtree from %s.\n", skdtinfn); return -1; } logmsg("Reading quadfile from %s ...\n", quadinfn); qfin = quadfile_open(quadinfn); if (!qfin) { ERROR("Failed to read quadfile from %s.\n", quadinfn); return -1; } logmsg("Writing quadfile to %s ...\n", quadoutfn); qfout = quadfile_open_for_writing(quadoutfn); if (!qfout) { ERROR("Failed to write quadfile to %s.\n", quadoutfn); return -1; } rtn = unpermute_stars(treein, qfin, &treeout, qfout, dosweeps, check, args, argc); if (rtn) return rtn; if (quadfile_close(qfout)) { ERROR("Failed to close output quadfile.\n"); return -1; } logmsg("Writing star kdtree to %s ...\n", skdtoutfn); if (startree_write_to_file(treeout, skdtoutfn)) { ERROR("Failed to write star kdtree.\n"); return -1; } if (startree_has_tagalong(treein)) { logmsg("Permuting tag-along table...\n"); tagin = startree_get_tagalong(treein); if (tagin) { tagout = fitstable_open_for_appending(skdtoutfn); tagout->table = fits_copy_table(tagin->table); tagout->table->nr = 0; if (unpermute_stars_tagalong(treein, tagout)) { ERROR("Failed to permute tag-along table"); return -1; } if (fitstable_close(tagout)) { ERROR("Failed to close tag-along data"); return -1; } } } quadfile_close(qfin); startree_close(treein); free(treeout->sweep); free(treeout->tree); treeout->tree = NULL; startree_close(treeout); return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/ver.py��������������������������������������������������������������������000644 �000765 �000024 �00000011405 12651445460 017025� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE import math try: import pyfits except ImportError: try: from astropy.io import fits as pyfits except ImportError: raise ImportError("Cannot import either pyfits or astropy.io.fits") from numpy import * from matplotlib.pylab import figure, plot, xlabel, ylabel, loglog, clf from matplotlib.pylab import semilogy, show, find, legend, hist, axis def plotDvsR(ix, iy, fx, fy, R): IR = argsort(R) mR = [] mD = [] mI = [] # Look at index stars in order of R. for ii in range(len(IR)): i = IR[ii] x = ix[i] y = iy[i] D = sqrt((fx - x)**2 + (fy - y)**2) # Grab field stars within a matching radius. r = 5 I = find( D < r ) for j in I: mR.append(R[i]) mD.append(D[j]) mI.append(ii) plot(mR, mD, 'ro') xlabel('Distance from quad center') ylabel('Match distance') def plotIvsR(ix, iy, fx, fy, cx, cy): RF = sqrt((fx - cx)**2 + (fy - cy)**2) mD2 = [] mI2 = [] for i in range(len(RF)): r = 5 D = sqrt((ix - fx[i])**2 + (iy - fy[i])**2) I = find( D < r ) for j in I: mD2.append(D[j]) mI2.append(i) #plot(mI, mD, 'ro', mI2, mD2, 'bo') plot(mI2, mD2, 'bo') xlabel('Index star number') ylabel('Match distance') #legend(('Sorted by dist from quad center', 'Sorted by brightness')) if __name__ == '__main__': # Index stars ixy = pyfits.open('ver/index.xy.fits') ixy = ixy[1].data ix = ixy.field(0) iy = ixy.field(1) NI = len(ix) # Field stars fxy = pyfits.open('ver/field.xy.fits') fxy = fxy[1].data fx = fxy.field(0) fy = fxy.field(1) NF = len(fx) # The matched quad. mf = pyfits.open('ver/match.fits') mf = mf[1].data quad = mf.field('quadpix')[0] quad = quad[0:8].reshape(4,2) qx = quad[:,0] qy = quad[:,1] # Quad center. cx = mean(qx) cy = mean(qy) # Grab index stars that are within the field. iok = find( (ix > min(fx)) * (ix < max(fx)) * (iy > min(fy)) * (iy < max(fy)) ) ix = [ix[i] for i in iok] iy = [iy[i] for i in iok] figure(1) clf() I = [0, 2, 1, 3, 0] plot( [cx], [cy], 'ro', qx[I], qy[I], 'r-', ix, iy, 'rx', fx, fy, 'b+', ) # RMS quad radius RQ = sqrt(sum((qx - cx)**2 + (qy - cy)**2) / 4) # Distance from quad center. RI = sqrt((ix - cx)**2 + (iy - cy)**2) RF = sqrt((fx - cx)**2 + (fy - cy)**2) # Angle from quad center. AI = array([math.atan2(y - cy, x - cx) for (x,y) in zip(ix,iy)]) AF = array([math.atan2(y - cy, x - cx) for (x,y) in zip(fx,fy)]) # Look at index stars in order of R. IR = argsort(RI) allD = array([]) allDR = array([]) allDA = array([]) allR = array([]) allDist = array([]) for i in IR: # regularizer... reg = RQ # Distscale = 1 DRscale = 1 / RQ dR = ((RI[i] + reg) / (RF + reg)) - 1.0 dA = AI[i] - AF # handle wrap-around absdA = abs(dA) absdA = vstack((absdA, abs(absdA - 2*math.pi))).min(axis=0) #D = sqrt(dR**2 + dA**2) D = sqrt(dR**2 + absdA**2) D = D / DRscale Dist = sqrt((ix[i] - fx)**2 + (iy[i] - fy)**2) Dist = Dist / Distscale iSmall = array(find((D < 1) + (Dist < 1))) allD = hstack((allD, D[iSmall])) allDR = hstack((allDR, dR[iSmall])) allDA = hstack((allDA, dA[iSmall])) allR = hstack((allR, repeat(RI[i], len(iSmall)))) allDist = hstack((allDist, Dist[iSmall])) figure(2) clf() plot(allDR, allDA, 'ro', ms=1) xlabel('DR') ylabel('DA') figure(3) clf() #plot(allR/RQ, allD, 'r.') #plot(allR/RQ, vstack((allD, allDist)).min(axis=0), 'r.') plot( #allR/RQ, vstack((allD, allDist)).min(axis=0), 'mo', allR/RQ, allD, 'r+', allR/RQ, allDist, 'bx' ) xlabel('R (quad radiuses)') #ylabel('min( Dist, D(R+A) )') ylabel('Dist, D(R,A)') a = axis() axis([a[0], a[1], 0, 2.0]) legend(('D(R,A)', 'D')) #allDist = array([]) #allRDist = array([]) #for i in IR: # Dist = sqrt((ix[i] - fx)**2 + (iy[i] - fy)**2) # iSmall = array(find(Dist < 5)) # allDist = hstack((allDist, Dist[iSmall])) # allRDist = hstack((allRDist, repeat(RI[i], len(iSmall)))) #figure(4) #clf() #plot(allRDist/RQ, allDist, 'r.') #xlabel('R') #ylabel('Dist') #figure(2) #clf() #plotDvsR(ix, iy, RI, fx, fy) #figure(3) #clf() #plotDvsI(ix, iy, fx, fy, cx, cy) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/verify-main.c�������������������������������������������������������������000644 �000765 �000024 �00000015644 12651445460 020262� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <string.h> #include <math.h> #include <assert.h> /** wget "http://antwrp.gsfc.nasa.gov/apod/image/0403/cmsky_cortner_full.jpg" solve-field --backend-config backend.cfg -v --keep-xylist %s.xy --continue --scale-low 10 --scale-units degwidth --no-tweak cmsky_cortner_full.jpg # index-219 ==> 159 index objs. cp cmsky_cortner_full.xy 1.xy cp cmsky_cortner_full.rdls 1.rd cp cmsky_cortner_full.wcs 1.wcs cp cmsky_cortner_full.jpg 1.jpg # or: # wget "http://live.astrometry.net/status.php?job=alpha-201003-01883980&get=wcs.fits" -O 1.wcs # wget "http://live.astrometry.net/status.php?job=alpha-201003-01883980&get=index.rd.fits" -O 1.rd verify -w 1.wcs -x 1.xy -r 1.rd -v **/ #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "matchobj.h" #include "xylist.h" #include "rdlist.h" #include "ioutils.h" #include "starkd.h" #include "boilerplate.h" #include "sip.h" #include "sip_qfits.h" #include "log.h" #include "fitsioutils.h" #include "fit-wcs.h" #include "verify.h" #include "histogram2d.h" #include "plotstuff.h" #include "plotimage.h" #include "cairoutils.h" static const char* OPTIONS = "hx:w:r:vj:p:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w <WCS input file>\n" " -x <xyls input file>\n" " -r <rdls input file>\n" " [-p <plot output file>]\n" " [-v]: verbose\n" " [-j <pixel-jitter>]: set pixel jitter (default 1.0)\n" "\n", progname); } int main(int argc, char** args) { int c; char* xylsfn = NULL; char* wcsfn = NULL; char* rdlsfn = NULL; char* plotfn = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; sip_t sip; int i; int W, H; double pixeljitter = 1.0; int loglvl = LOG_MSG; double wcsscale; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'p': plotfn = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'r': rdlsfn = optarg; break; case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !wcsfn || !rdlsfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to parse SIP header from %s...\n", wcsfn); if (!sip_read_header_file(wcsfn, &sip)) { logmsg("Failed to parse SIP header from %s.\n", wcsfn); } // image W, H W = sip.wcstan.imagew; H = sip.wcstan.imageh; if ((W == 0.0) || (H == 0.0)) { logmsg("WCS file %s didn't contain IMAGEW and IMAGEH headers.\n", wcsfn); // FIXME - use bounds of xylist? exit(-1); } wcsscale = sip_pixel_scale(&sip); logmsg("WCS scale: %g arcsec/pixel\n", wcsscale); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { logmsg("Failed to read an rdlist from file %s.\n", rdlsfn); exit(-1); } { // (x,y) positions of field stars. double* fieldpix; int Nfield; double* indexpix; starxy_t* xy; rd_t* rd; int Nindex; xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldpix = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // Project RDLS into pixel space. rd = rdlist_read_field(rdls, NULL); if (!rd) { logmsg("Failed to read rdls entries.\n"); exit(-1); } Nindex = rd_n(rd); logmsg("Found %i indx objects\n", Nindex); indexpix = malloc(2 * Nindex * sizeof(double)); for (i=0; i<Nindex; i++) { anbool ok; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); ok = sip_radec2pixelxy(&sip, ra, dec, indexpix + i*2, indexpix + i*2 + 1); assert(ok); } logmsg("CRPIX is (%g,%g)\n", sip.wcstan.crpix[0], sip.wcstan.crpix[1]); { double* fieldsigma2s = malloc(Nfield * sizeof(double)); int besti; int* theta; double logodds; double Q2, R2; double qc[2]; double gamma; // HACK -- quad radius-squared Q2 = square(100.0); qc[0] = sip.wcstan.crpix[0]; qc[1] = sip.wcstan.crpix[1]; // HACK -- variance growth rate wrt radius. gamma = 1.0; for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldpix + 2*i, 2); fieldsigma2s[i] = square(pixeljitter) * (1.0 + gamma * R2/Q2); } logodds = verify_star_lists(indexpix, Nindex, fieldpix, fieldsigma2s, Nfield, W*H, 0.25, log(1e-100), log(1e100), &besti, NULL, &theta, NULL); logmsg("Logodds: %g\n", logodds); if (TRUE) { for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; printf("%g %g %g %g\n", fieldpix[2*i+0], fieldpix[2*i+1], rd_getra(rd, theta[i]), rd_getdec(rd, theta[i])); } } if (plotfn) { plot_args_t pargs; plotimage_t* img; cairo_t* cairo; plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; pargs.outfn = plotfn; img = plotstuff_get_config(&pargs, "image"); img->format = PLOTSTUFF_FORMAT_JPG; plot_image_set_filename(img, "1.jpg"); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "red"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } plotstuff_output(&pargs); } free(theta); free(fieldsigma2s); } free(fieldpix); free(indexpix); } if (xylist_close(xyls)) { logmsg("Failed to close XYLS file.\n"); } return 0; } ��������������������������������������������������������������������������������������������astrometry.net-0.67/blind/verify-paths.c������������������������������������������������������������000644 �000765 �000024 �00000040206 12651445460 020445� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ /** Runs the verification procedure in stand-alone mode. */ #include "os-features.h" #include "matchfile.h" #include "matchobj.h" #include "index.h" #include "xylist.h" #include "rdlist.h" #include "log.h" #include "errors.h" #include "mathutil.h" #include "verify.h" #include "verify2.h" #define SIGN(x) (((x) >= 0) ? (1) : (-1)) static const char* OPTIONS = "hvi:m:f:r:p"; static void print_help(const char* progname) { printf("Usage: %s\n" " -m <match-file>\n" " -f <xylist-file>\n" " ( -i <index-file>\n" " OR -r <index-rdls>\n" " )\n" " [-v]: verbose\n" "\n", progname); } int Npaths = 0; static void explore_path(il** reflists, dl** problists, int i, int NT, int NR, int* theta, double* logprobs, anbool* refused, int mu, double distractor, double logbg) { int j; double logprob; FILE* f = stderr; double logd = log(distractor + (1.0-distractor)*mu / (double)NR) + logbg; if (i == NT) { /* fprintf(f, "allpaths.append(array(["); for (j=0; j<NT; j++) fprintf(f, "%g,", logprobs[j]); fprintf(f, "]))\n"); */ fprintf(f, "alllogprobs.append(%g)\n", logprobs[i-1]); Npaths++; return; } if (i == 0) logprob = 0.0; else logprob = logprobs[i-1]; for (j=0; reflists[i] && j<il_size(reflists[i]); j++) { int refi; refi = il_get(reflists[i], j); if (refused[refi]) continue; logprobs[i] = logprob + dl_get(problists[i], j) - logbg; theta[i] = refi; //fprintf(f, "plot([%i, %i], [%g, %g], 'r-')\n", i, i+1, logprob, logprobs[i]); //fprintf(f, "pathsx.append(%i)\npathsy.append(%g)\n", i+1, logprobs[i]); fprintf(f, "pathsx.append([%i, %i])\npathsy.append([%g, %g])\n", i, i+1, logprob, logprobs[i]); fprintf(f, "pathst.append(%i)\n", refi); refused[refi] = TRUE; explore_path(reflists, problists, i+1, NT, NR, theta, logprobs, refused, mu+1, distractor, logbg); refused[refi] = FALSE; } logprobs[i] = logprob + logd - logbg; theta[i] = -1; //fprintf(f, "plot([%i, %i], [%g, %g], 'r-')\n", i, i+1, logprob, logprobs[i]); //fprintf(f, "pathsx.append(%i)\npathsy.append(%g)\n", i+1, logprobs[i]); fprintf(f, "pathsx.append([%i, %i])\npathsy.append([%g, %g])\n", i, i+1, logprob, logprobs[i]); fprintf(f, "pathst.append(%i)\n", -1); explore_path(reflists, problists, i+1, NT, NR, theta, logprobs, refused, mu, distractor, logbg); } static void add_radial_and_tangential_correction(const double* in, double r, double t, const double* qc, double* out, int N) { int i; for (i=0; i<N; i++) { double rdir[2]; // radial vector rdir[0] = in[2*i+0] - qc[0]; rdir[1] = in[2*i+1] - qc[1]; out[2*i+0] = in[2*i+0] - r * rdir[0] + t * rdir[1]; out[2*i+1] = in[2*i+1] - r * rdir[1] - t * rdir[0]; } } #include <gsl/gsl_matrix_double.h> #include <gsl/gsl_vector_double.h> #include "gslutils.h" void find_cd_correction(const double* testxy, const double* sigma2s, int NT, const int* theta, const double* refxy, int NR, const double* crpix) { gsl_matrix *A; gsl_vector *B1, *B2, *X1, *X2; int M, N; int mu; int i; /* solve min(|B - A*X|^2) for X B: (refxy - crpix)_{x,y} / sigma X: CD matrix elements (a,b) and (c,d) A: (testxy - crpix)_{x,y} / sigma */ mu = 0; for (i=0; i<NT; i++) if (theta[i] >= 0) mu++; // number of samples M = mu; // number of coefficients N = 2; A = gsl_matrix_alloc(M, N); B1 = gsl_vector_alloc(M); B2 = gsl_vector_alloc(M); mu = 0; for (i=0; i<NT; i++) { double w; if (theta[i] < 0) continue; w = 1.0 / sqrt(sigma2s[i]); gsl_matrix_set(A, mu, 0, w * (testxy[2*i] - crpix[0])); gsl_matrix_set(A, mu, 1, w * (testxy[2*i+1] - crpix[1])); gsl_vector_set(B1, mu, w * (refxy[2*theta[i]] - crpix[0])); gsl_vector_set(B2, mu, w * (refxy[2*theta[i]+1] - crpix[1])); mu++; } if (gslutils_solve_leastsquares_v(A, 2, B1, &X1, NULL, B2, &X2, NULL)) { ERROR("Failed to solve CD matrix correction\n"); return; } logmsg("CD matrix:\n"); logmsg(" %g\n", gsl_vector_get(X1, 0)); logmsg(" %g\n", gsl_vector_get(X1, 1)); logmsg(" %g\n", gsl_vector_get(X2, 0)); logmsg(" %g\n", gsl_vector_get(X2, 1)); gsl_matrix_free(A); gsl_vector_free(B1); gsl_vector_free(B2); gsl_vector_free(X1); gsl_vector_free(X2); } int main(int argc, char** args) { int argchar; int loglvl = LOG_MSG; char* indexfn = NULL; char* matchfn = NULL; char* xyfn = NULL; char* rdfn = NULL; index_t* index = NULL; matchfile* mf; MatchObj* mo; verify_field_t* vf; starxy_t* fieldxy; xylist_t* xyls; rdlist_t* rdls; double pix2 = 1.0; double distractors = 0.25; double fieldW=0, fieldH=0; double logbail = log(1e-100); double logkeep = log(1e12); double logaccept = HUGE_VAL; anbool growvariance = TRUE; anbool fake = FALSE; double logodds; anbool do_paths = FALSE; while ((argchar = getopt(argc, args, OPTIONS)) != -1) switch (argchar) { case 'p': do_paths = TRUE; break; case 'r': rdfn = optarg; break; case 'f': xyfn = optarg; break; case 'i': indexfn = optarg; break; case 'm': matchfn = optarg; break; case 'h': print_help(args[0]); exit(0); case 'v': loglvl++; break; } log_init(loglvl); if (!(indexfn || rdfn) || !matchfn || !xyfn) { logerr("You must specify (index (-i) or index rdls (-r)) and matchfile (-m) and field xylist (-f).\n"); print_help(args[0]); exit(-1); } mf = matchfile_open(matchfn); if (!mf) { ERROR("Failed to read match file %s", matchfn); exit(-1); } xyls = xylist_open(xyfn); if (!xyls) { ERROR("Failed to open xylist %s", xyfn); exit(-1); } // don't need these... xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); fieldW = xylist_get_imagew(xyls); fieldH = xylist_get_imageh(xyls); logmsg("Field W,H = %g, %g\n", fieldW, fieldH); mo = matchfile_read_match(mf); if (!mo) { ERROR("Failed to read object from match file."); exit(-1); } mo->wcstan.imagew = fieldW; mo->wcstan.imageh = fieldH; fieldxy = xylist_read_field(xyls, NULL); if (!fieldxy) { ERROR("Failed to read a field from xylist %s", xyfn); exit(-1); } if (indexfn) { index = index_load(indexfn, 0); if (!index) { ERROR("Failed to open index %s", indexfn); exit(-1); } pix2 += square(index->meta.index_jitter / mo->scale); } else { double indexjitter; rdls = rdlist_open(rdfn); if (!rdls) { ERROR("Failed to open rdlist %s", rdfn); exit(-1); } // HACK indexjitter = 1.0; // arcsec. pix2 += square(indexjitter / mo->scale); } logmsg("Pixel jitter: %g pix\n", sqrt(pix2)); vf = verify_field_preprocess(fieldxy); if (index) { mo->logodds = 0.0; mo->dimquads = index_get_quad_dim(index); verify_hit(index->starkd, index->meta.cutnside, mo, NULL, vf, pix2, distractors, fieldW, fieldH, logbail, logkeep, logaccept, growvariance, fake); logodds = mo->logodds; index_close(index); } else { int cutnside; int cutnsweeps; int indexid; int uni_nw, uni_nh; int* perm; double* testxy; double* refxy; int i, j, NT, NR; double* sigma2s = NULL; rd_t* rd; double effA; double qc[2], Q2; // -get reference stars rd = rdlist_read_field(rdls, NULL); if (!rd) { ERROR("Failed to read rdls field"); exit(-1); } NR = rd_n(rd); refxy = malloc(2 * NR * sizeof(double)); for (i=0; i<NR; i++) { double ra, dec; ra = rd_getra (rd, i); dec = rd_getdec(rd, i); if (!tan_radec2pixelxy(&(mo->wcstan), ra, dec, refxy + 2*i, refxy + 2*i + 1)) { ERROR("rdls point projects to wrong side of sphere!"); exit(-1); } } // -remove the ref star closest to each quad star. for (i=0; i<mo->dimquads; i++) { double qxy[2]; int besti = -1; double bestd2 = HUGE_VAL; if (!tan_xyzarr2pixelxy(&(mo->wcstan), mo->quadxyz + 3*i, qxy, qxy+1)) { ERROR("quad star projects to wrong side of sphere!"); exit(-1); } logmsg("Ref quad star %i is at (%.1f, %.1f)\n", i, qxy[0], qxy[1]); for (j=0; j<NR; j++) { double d2 = distsq(qxy, refxy + 2*j, 2); if (d2 < bestd2) { bestd2 = d2; besti = j; } } logmsg("Ref star %i is closest: (%.1f, %.1f)\n", besti, refxy[2*besti+0], refxy[2*besti+1]); // remove it! memmove(refxy + 2*besti, refxy + 2*(besti + 1), 2*(NR - besti - 1) * sizeof(double)); NR--; } logmsg("Reference stars: %i\n", NR); indexid = mo->indexid; if (index_get_missing_cut_params(indexid, &cutnside, &cutnsweeps, NULL, NULL, NULL)) { ERROR("Failed to get index cut parameters for index id %i", indexid); exit(-1); } verify_get_quad_center(vf, mo, qc, &Q2); verify_apply_ror(refxy, NULL, &NR, cutnside, mo, vf, pix2, distractors, fieldW, fieldH, growvariance, fake, &testxy, &sigma2s, &NT, &perm, &effA, &uni_nw, &uni_nh); /*{ double d = distractors; // Predicted optimal number of reference stars: int mmax = (int)round(exp(log(effA*(1-d)/(2*M_PI*pix2)) + d*log(d)/(1-d) + (M_PI*Q2 + 1)/effA * log(M_PI*Q2 / (M_PI*Q2 + effA)))); logmsg("mmax = %i\n", mmax); logmsg("first term: %g\n", effA*(1-d)/(2*M_PI*pix2)); logmsg("second term: %g\n", exp(d*log(d) / (1-d))); logmsg("third term: %g\n", exp((M_PI*Q2 + 1)/effA * log(M_PI*Q2 / (M_PI*Q2 + effA)))); // Predicted number of reference stars to allow the // accept threshold to be reached. double t1 = d*log(d) + (1-d)*(log(effA*(1-d)/(2*M_PI*pix2)) + (M_PI*Q2 + 1)/effA * log(M_PI*Q2 / (M_PI*Q2 + effA))); for (i=1; i<1000000; i++) { double logM = i*t1 - i*(1-d)*log(i); if (logM > logkeep) { logmsg("m = %i: M = %g\n", i, exp(logM)); break; } } //NR = MIN(NR, 2 * i + 10); //logmsg("Setting NR to %i\n", NR); }*/ FILE* f = stderr; fprintf(f, "distractor = %g\nNR=%i\nNT=%i\n", distractors, NR, NT); fprintf(f, "W=%i\nH=%i\n", (int)fieldW, (int)fieldH); fprintf(f, "effA=%g\n", effA); fprintf(f, "sig2=%g\n", pix2); fprintf(f, "quadxy = array(["); for (i=0; i<mo->dimquads; i++) fprintf(f, "[%g,%g],", mo->quadpix[2*i+0], mo->quadpix[2*i+1]); fprintf(f, "])\n"); fprintf(f, "testxy = array(["); for (i=0; i<NT; i++) fprintf(f, "[%g,%g],", testxy[2*i+0], testxy[2*i+1]); fprintf(f, "])\n"); fprintf(f, "sigmas = array(["); for (i=0; i<NT; i++) fprintf(f, "%g,", sqrt(sigma2s[i])); fprintf(f, "])\n"); double* rs2 = verify_compute_sigma2s_arr(refxy, NR, qc, Q2, pix2, !fake); fprintf(f, "refsigmas = array(["); for (i=0; i<NR; i++) fprintf(f, "%g,", sqrt(rs2[i])); fprintf(f, "])\n"); free(rs2); fprintf(f, "refxy = array(["); for (i=0; i<NR; i++) fprintf(f, "[%g,%g],", refxy[2*i+0], refxy[2*i+1]); fprintf(f, "])\n"); fprintf(f, "cutx = array(["); for (i=0; i<=uni_nw; i++) fprintf(f, "%g,", i * fieldW / (float)uni_nw); fprintf(f, "])\n"); fprintf(f, "cuty = array(["); for (i=0; i<=uni_nh; i++) fprintf(f, "%g,", i * fieldH / (float)uni_nh); fprintf(f, "])\n"); double* all_logodds; int* theta; int besti; double worst; logodds = verify_star_lists(refxy, NR, testxy, sigma2s, NT, effA, distractors, logbail, logaccept, &besti, &all_logodds, &theta, &worst); fprintf(f, "besti = %i\n", besti); fprintf(f, "worstlogodds = %g\n", worst); fprintf(f, "logodds = array(["); for (i=0; i<NT; i++) fprintf(f, "%g,", all_logodds[i]); fprintf(f, "])\n"); fprintf(f, "theta = array(["); for (i=0; i<NT; i++) fprintf(f, "%i,", theta[i]); fprintf(f, "])\n"); // compare observed sigmas to expected... fprintf(f, "obssigmas=array(["); for (i=0; i<NT; i++) { double d2, r2; if (theta[i] < 0) continue; d2 = distsq(testxy + 2*i, refxy + 2*theta[i], 2); r2 = distsq(testxy + 2*i, qc, 2); fprintf(f, "[%g,%g,%g],", sigma2s[i], d2, r2/Q2); } fprintf(f, "])\n"); find_cd_correction(testxy, sigma2s, NT, theta, refxy, NR, qc); { // introduce known radial and tangential terms and see if we can recover them... //add_radial_and_tangential_correction(testxy, -0.01, -0.01, qc, testxy, NT); // What is the ML correction to rotation and scaling? // (shear, translation? distortion?) // -> may need all matches, not just nearest neighbour, to // do this correctly. double racc = 0, tacc = 0; int mu = 0; for (i=0; i<NT; i++) { double dxy[2]; double rdir[2]; double R2, ddotr; double dr[2]; double dt[2]; double fr, ft; if (theta[i] == -1) continue; mu++; // jitter vector dxy[0] = testxy[2*i+0] - refxy[2*theta[i]+0]; dxy[1] = testxy[2*i+1] - refxy[2*theta[i]+1]; // radial vector (this should perhaps be to the ref star, not test) rdir[0] = testxy[2*i+0] - qc[0]; rdir[1] = testxy[2*i+1] - qc[1]; // R2 = rdir[0]*rdir[0] + rdir[1]*rdir[1]; ddotr = (dxy[0]*rdir[0] + dxy[1]*rdir[1]); // jitter vector projected onto radial vector. dr[0] = ddotr * rdir[0] / R2; dr[1] = ddotr * rdir[1] / R2; // tangential dt[0] = dxy[0] - dr[0]; dt[1] = dxy[1] - dr[1]; assert(fabs(dr[0] + dt[0] - dxy[0]) < 1e-10); assert(fabs(dr[1] + dt[1] - dxy[1]) < 1e-10); // fractional change in radial, tangential components. fr = SIGN(ddotr) * sqrt((dr[0]*dr[0] + dr[1]*dr[1]) / R2); ft = SIGN(rdir[0]*dt[1] - rdir[1]*dt[0]) * sqrt((dt[0]*dt[0] + dt[1]*dt[1]) / R2); racc += fr; tacc += ft; } racc /= (double)mu; tacc /= (double)mu; logmsg("Radial correction: %g\n", racc); logmsg("Tangential correction: %g\n", tacc); logmsg("Log-odds: %g\n", logodds); // Rotate and scale the test stars... double* t2xy = malloc(NT * 2 * sizeof(double)); add_radial_and_tangential_correction(testxy, racc, tacc, qc, t2xy, NT); double logodds2 = verify_star_lists(refxy, NR, t2xy, sigma2s, NT, effA, distractors, logbail, logaccept, NULL, NULL, NULL, NULL); logmsg("Log-odds 2: %g\n", logodds2); fprintf(f, "t2xy = array(["); for (i=0; i<NT; i++) fprintf(f, "[%g,%g],", t2xy[2*i+0], t2xy[2*i+1]); fprintf(f, "])\n"); free(t2xy); } if (do_paths) { il** reflist; dl** problist; NT = besti+1; logmsg("Finding all matches...\n"); verify_get_all_matches(refxy, NR, testxy, sigma2s, NT, effA, distractors, 5.0, 0.5, &reflist, &problist); /* --reflist contains one list per test star, containing the indices of reference stars within nsigma and within limit of the distractor rate. -a "regular" conflict occurs when one reference star appears in more than one list. -a "ref" conflict occurs when a list has more than one element in it. -each star has some "clique" of stars that it can interact with (transitive connectivity of the 'nearby' graph). These will usually be small, but might not be... We can compute analytically the sums over small, simple groups, but more complex ones will be very hairy. */ double np; np = 1.0; for (i=0; i<NT; i++) { if (!reflist[i]) continue; np *= (1.0 + il_size(reflist[i])); } logmsg("Number of paths: about %g\n", np); fprintf(f, "allpaths=[]\n"); fprintf(f, "clf()\n"); fprintf(f, "alllogprobs = []\n"); fprintf(f, "pathsx = []\n"); fprintf(f, "pathsy = []\n"); fprintf(f, "pathst = []\n"); int theta[NT]; double logprobs[NT]; anbool refused[NR]; for (i=0; i<NR; i++) refused[i] = FALSE; Npaths = 0; logmsg("Finding all paths...\n"); explore_path(reflist, problist, 0, NT, NR, theta, logprobs, refused, 0, distractors, log(1.0/effA)); logmsg("Number of paths: %i\n", Npaths); fprintf(f, "pathsx = array(pathsx)\npathsy = array(pathsy)\n"); //fprintf(f, "axis([0, %i, -100, 100])\n", NT); for (i=0; i<NT; i++) { il_free(reflist[i]); dl_free(problist[i]); } free(reflist); free(problist); } free(theta); free(all_logodds); free(sigma2s); free(testxy); free(refxy); rd_free(rd); rdlist_close(rdls); } logmsg("Logodds: %g\n", logodds); logmsg("Odds: %g\n", logodds); verify_field_free(vf); starxy_free(fieldxy); xylist_close(xyls); matchfile_close(mf); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/verify.c������������������������������������������������������������������000644 �000765 �000024 �00000135150 12651445460 017333� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include <math.h> #include <string.h> #include <stdint.h> #include "os-features.h" #include "verify.h" #include "permutedsort.h" #include "mathutil.h" #include "keywords.h" #include "log.h" #include "sip-utils.h" #include "healpix.h" #include "datalog.h" #define DEBUGVERIFY 0 #if DEBUGVERIFY #define debug2(args...) logdebug(args) #else #define debug2(args...) #endif #define DATALOG_MASK_VERIFY 0x1 // level #define DLOG_ODDS 10 #define DLOG_ODDS_MIN log(1e6) //#define DLOG_ODDS_MIN -HUGE_VAL #define dlog(lev, fmt, ...) data_log(DATALOG_MASK_VERIFY, lev, fmt, ##__VA_ARGS__) // avoid functions with 50 arguments... struct verify_s { const sip_t* wcs; // Reference stars: int NR; int NRall; int* refperm; int* refstarid; double* refxy; // temp storage when filtering int* badguys; // Image stars: int NT; int NTall; int* testperm; double* testxy; double* testsigma; // actually sigma**2. // temp storage int* tbadguys; }; typedef struct verify_s verify_t; static anbool* verify_deduplicate_field_stars(verify_t* v, const verify_field_t* vf, double nsigmas); verify_field_t* verify_field_preprocess(const starxy_t* fieldxy) { verify_field_t* vf; int Nleaf = 5; vf = malloc(sizeof(verify_field_t)); if (!vf) { fprintf(stderr, "Failed to allocate space for a verify_field_t().\n"); return NULL; } vf->field = fieldxy; // Note on kdtree type: I tried U32 (duu) but it was marginally slower. // I didn't try U16 (dss) because we need a fair bit of accuracy here. // Make a copy of the field objects, because we're going to build a // kdtree out of them and that shuffles their order. vf->fieldcopy = starxy_copy_xy(fieldxy); vf->xy = starxy_copy_xy(fieldxy); if (!vf->fieldcopy || !vf->xy) { fprintf(stderr, "Failed to copy the field.\n"); return NULL; } // Build a tree out of the field objects (in pixel space) vf->ftree = kdtree_build(NULL, vf->fieldcopy, starxy_n(vf->field), 2, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); vf->do_uniformize = TRUE; vf->do_dedup = TRUE; vf->do_ror = TRUE; return vf; } void verify_field_free(verify_field_t* vf) { if (!vf) return; kdtree_free(vf->ftree); free(vf->xy); free(vf->fieldcopy); free(vf); } static double get_sigma2_at_radius(double verify_pix2, double r2, double quadr2) { return verify_pix2 * (1.0 + r2/quadr2); } static double* compute_sigma2s(const verify_field_t* vf, const double* xy, int NF, const double* qc, double Q2, double verify_pix2, anbool do_gamma) { double* sigma2s; int i; double R2; sigma2s = malloc(NF * sizeof(double)); if (!do_gamma) { for (i=0; i<NF; i++) sigma2s[i] = verify_pix2; } else { // Compute individual positional variances for every field // star. for (i=0; i<NF; i++) { if (vf) { double sxy[2]; starxy_get(vf->field, i, sxy); // Distance from the quad center of this field star: R2 = distsq(sxy, qc, 2); } else R2 = distsq(xy + 2*i, qc, 2); // Variance of a field star at that distance from the quad center: sigma2s[i] = get_sigma2_at_radius(verify_pix2, R2, Q2); } } return sigma2s; } double* verify_compute_sigma2s(const verify_field_t* vf, const MatchObj* mo, double verify_pix2, anbool do_gamma) { int NF; double qc[2]; double Q2=0; NF = starxy_n(vf->field); if (do_gamma) { verify_get_quad_center(vf, mo, qc, &Q2); debug2("Quad radius = %g pixels\n", sqrt(Q2)); } return compute_sigma2s(vf, NULL, NF, qc, Q2, verify_pix2, do_gamma); } double* verify_compute_sigma2s_arr(const double* xy, int NF, const double* qc, double Q2, double verify_pix2, anbool do_gamma) { return compute_sigma2s(NULL, xy, NF, qc, Q2, verify_pix2, do_gamma); } static double logd_at(double distractor, int mu, int NR, double logbg) { return log(distractor + (1.0-distractor)*mu / (double)NR) + logbg; } static int get_xy_bin(const double* xy, double fieldW, double fieldH, int nw, int nh) { int ix, iy; ix = (int)floor(nw * xy[0] / fieldW); ix = MAX(0, MIN(nw-1, ix)); iy = (int)floor(nh * xy[1] / fieldH); iy = MAX(0, MIN(nh-1, iy)); return iy * nw + ix; } static void print_test_perm(verify_t* v) { int i; for (i=0; i<v->NTall; i++) { if (i == v->NT) debug2("(NT)"); debug2("%i ", v->testperm[i]); } } static void verify_get_test_stars(verify_t* v, const verify_field_t* vf, MatchObj* mo, double pix2, anbool do_gamma, anbool fake_match) { anbool* keepers = NULL; int i; int ibad=0, igood=0; v->NTall = starxy_n(vf->field); v->testxy = vf->xy; v->NT = v->NTall; v->testsigma = verify_compute_sigma2s(vf, mo, pix2, do_gamma); v->testperm = permutation_init(NULL, v->NTall); v->tbadguys = malloc(v->NTall * sizeof(int)); if (DEBUGVERIFY) { debug2("start:\n"); print_test_perm(v); debug2("\n"); } if (vf->do_dedup) { // Deduplicate test stars. This could be done (approximately) in preprocessing. // FIXME -- this should be at the reference deduplication radius, not relative to sigma! // -- this requires the match scale // -- can perhaps discretize dedup to nearest power-of-sqrt(2) pixel radius and cache it. // -- we can compute sigma much later keepers = verify_deduplicate_field_stars(v, vf, 1.0); // Remove test quad stars. Do this after deduplication so we // don't end up with (duplicate) test stars near the quad stars. if (!fake_match) { for (i=0; i<mo->dimquads; i++) { assert(mo->field[i] >= 0); assert(mo->field[i] < v->NTall); keepers[mo->field[i]] = FALSE; } } ibad = igood = 0; for (i=0; i<v->NT; i++) { int ti = v->testperm[i]; if (keepers[ti]) { v->testperm[igood] = ti; igood++; } else { v->tbadguys[ibad] = ti; ibad++; } } } else { // Remove the quad. if (!fake_match) { int j; for (i=0; i<mo->dimquads; i++) { assert(mo->field[i] >= 0); assert(mo->field[i] < v->NTall); } ibad = igood = 0; for (i=0; i<v->NT; i++) { int ti = v->testperm[i]; anbool isquad = FALSE; for (j=0; j<mo->dimquads; j++) { if (ti == mo->field[j]) { isquad = TRUE; break; } } if (!isquad) { v->testperm[igood] = ti; igood++; } else { v->tbadguys[ibad] = ti; ibad++; } } } else { igood = v->NT; } } v->NT = igood; // remember the bad guys memcpy(v->testperm + igood, v->tbadguys, ibad * sizeof(int)); free(keepers); if (DEBUGVERIFY) { debug2("after dedup and removing quad:\n"); print_test_perm(v); debug2("\n"); } } double verify_get_ror2(double Q2, double area, double distractors, int NR, double pix2) { return Q2 * MAX(1, (area*(1 - distractors) / (4. * M_PI * NR * pix2) - 1)); } static void verify_apply_ror(verify_t* v, int index_cutnside, MatchObj* mo, const verify_field_t* vf, double pix2, double distractors, double fieldW, double fieldH, anbool do_gamma, anbool fake_match, double* p_effA, int* p_uninw, int* p_uninh) { int i; int uni_nw = 0, uni_nh = 0; double effA = fieldW * fieldH; double qc[2], Q2=0; int igood, ibad; int* binids = NULL; double* bincenters = NULL; // If we're verifying an existing WCS solution, then don't increase the variance // away from the center of the matched quad. if (fake_match) do_gamma = FALSE; verify_get_test_stars(v, vf, mo, pix2, do_gamma, fake_match); debug2("Number of test stars: %i\n", v->NT); debug2("Number of reference stars: %i\n", v->NR); if (!fake_match) verify_get_quad_center(vf, mo, qc, &Q2); // Uniformize test stars // FIXME - can do this (possibly at several scales) in preprocessing. if (vf->do_uniformize) { // -get uniformization scale. verify_get_uniformize_scale(index_cutnside, mo->scale, fieldW, fieldH, &uni_nw, &uni_nh); debug2("uniformizing into %i x %i blocks.\n", uni_nw, uni_nh); // uniformize! if (uni_nw > 1 || uni_nh > 1) { verify_uniformize_field(vf->xy, v->testperm, v->NT, fieldW, fieldH, uni_nw, uni_nh, NULL, &binids); bincenters = verify_uniformize_bin_centers(fieldW, fieldH, uni_nw, uni_nh); if (DEBUGVERIFY) { debug2("after uniformizing:\n"); print_test_perm(v); debug2("\n"); } } } if (vf->do_ror && !fake_match) { anbool* goodbins = NULL; int Ngoodbins; double ror2; debug2("Quad radius = %g\n", sqrt(Q2)); ror2 = verify_get_ror2(Q2, fieldW*fieldH, distractors, v->NR, pix2); debug2("(strong) Radius of relevance is %.1f\n", sqrt(ror2)); if (binids) { assert(uni_nw); goodbins = malloc(uni_nw * uni_nh * sizeof(anbool)); Ngoodbins = 0; for (i=0; i<(uni_nw * uni_nh); i++) { double binr2 = distsq(bincenters + 2*i, qc, 2); goodbins[i] = (binr2 < ror2); if (goodbins[i]) Ngoodbins++; } // Remove test stars in irrelevant bins... igood = ibad = 0; for (i=0; i<v->NT; i++) { int ti = v->testperm[i]; if (goodbins[binids[i]]) { v->testperm[igood] = ti; igood++; } else { v->tbadguys[ibad] = ti; ibad++; } } } else { // Remove test stars outside the RoR. igood = ibad = 0; for (i=0; i<v->NT; i++) { int ti = v->testperm[i]; double r2 = distsq(qc, vf->xy + 2*ti, 2); if (r2 < ror2) { v->testperm[igood] = ti; igood++; } else { v->tbadguys[ibad] = ti; ibad++; } } // Count good bins to find effective area... (ugh) assert(!bincenters); if (!uni_nw) verify_get_uniformize_scale(index_cutnside, mo->scale, fieldW, fieldH, &uni_nw, &uni_nh); bincenters = verify_uniformize_bin_centers(fieldW, fieldH, uni_nw, uni_nh); Ngoodbins = 0; for (i=0; i<(uni_nw * uni_nh); i++) { double binr2 = distsq(bincenters + 2*i, qc, 2); if (binr2 < ror2) Ngoodbins++; } } v->NT = igood; memcpy(v->testperm + igood, v->tbadguys, ibad * sizeof(int)); debug2("After removing %i/%i irrelevant bins: %i test stars.\n", (uni_nw*uni_nh)-Ngoodbins, uni_nw*uni_nh, v->NT); if (DEBUGVERIFY) { debug2("after applying RoR:\n"); print_test_perm(v); debug2("\n"); } // Effective area: A * proportion of good bins. effA *= Ngoodbins / (double)(uni_nw * uni_nh); // Remove reference stars in bad bins. igood = ibad = 0; if (goodbins) { assert(uni_nw); for (i=0; i<v->NR; i++) { int ri = v->refperm[i]; int binid = get_xy_bin(v->refxy + 2*ri, fieldW, fieldH, uni_nw, uni_nh); if (goodbins[binid]) { v->refperm[igood] = ri; igood++; } else { v->badguys[ibad] = ri; ibad++; } } } else { for (i=0; i<v->NR; i++) { int ri = v->refperm[i]; if (distsq(qc, v->refxy + 2*ri, 2) < ror2) { v->refperm[igood] = ri; igood++; } else { v->badguys[ibad] = ri; ibad++; } } } // remember the bad guys memcpy(v->refperm + igood, v->badguys, ibad * sizeof(int)); v->NR = igood; debug2("After removing irrelevant ref stars: %i ref stars.\n", v->NR); // New ROR is... debug2("ROR changed from %g to %g\n", sqrt(ror2), sqrt(verify_get_ror2(Q2, effA, distractors, v->NR, pix2))); free(goodbins); } free(bincenters); free(binids); *p_effA = effA; if (p_uninw) *p_uninw = uni_nw; if (p_uninh) *p_uninh = uni_nh; } static double real_verify_star_lists(verify_t* v, double effective_area, double distractors, double logodds_bail, double logodds_stoplooking, int* p_besti, double** p_logodds, int** p_theta, double* p_worstlogodds, int* p_ibailed, int* p_istopped) { int i, j; double worstlogodds; double bestworstlogodds; double bestlogodds; int besti; double logodds; double logbg; double logd; //double matchnsigma = 5.0; double* refcopy; kdtree_t* rtree; int Nleaf = 10; int* rmatches; double* rprobs; double* all_logodds = NULL; int* theta = NULL; int mu; int* rperm; if (!v->NR || !v->NT) { logerr("real_verify_star_lists: NR=%i, NT=%i\n", v->NR, v->NT); return -HUGE_VAL; } // Build a tree out of the index stars in pixel space... // kdtree scrambles the data array so make a copy first. refcopy = malloc(2 * v->NR * sizeof(double)); // we must pack/unpermute the refxys; remember this packing order in "rperm". // we borrow storage for "rperm"... if (!v->badguys) v->badguys = malloc(v->NR * sizeof(int)); rperm = v->badguys; for (i=0; i<v->NR; i++) { int ri = v->refperm[i]; rperm[i] = ri; refcopy[2*i+0] = v->refxy[2*ri+0]; refcopy[2*i+1] = v->refxy[2*ri+1]; } rtree = kdtree_build(NULL, refcopy, v->NR, 2, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); rmatches = malloc(v->NR * sizeof(int)); for (i=0; i<v->NR; i++) rmatches[i] = -1; rprobs = malloc(v->NR * sizeof(double)); for (i=0; i<v->NR; i++) rprobs[i] = -HUGE_VAL; if (p_logodds || data_log_passes(DATALOG_MASK_VERIFY, DLOG_ODDS)) all_logodds = calloc(v->NT, sizeof(double)); if (p_logodds) *p_logodds = all_logodds; if (p_ibailed) *p_ibailed = -1; if (p_istopped) *p_istopped = -1; theta = malloc(v->NT * sizeof(int)); logbg = log(1.0 / effective_area); worstlogodds = 0; bestlogodds = -HUGE_VAL; bestworstlogodds = -HUGE_VAL; besti = -1; logodds = 0.0; mu = 0; for (i=0; i<v->NT; i++) { const double* testxy; double sig2; int refi; int tmpi; double d2; //double reallogfg; double logfg; int ti; ti = v->testperm[i]; testxy = v->testxy + 2*ti; sig2 = v->testsigma[ti]; logd = logd_at(distractors, mu, v->NR, logbg); debug2("\n"); debug2("test star %i: (%.1f,%.1f), sigma: %.1f\n", i, testxy[0], testxy[1], sqrt(sig2)); // find nearest ref star (within 5 sigma) tmpi = kdtree_nearest_neighbour_within(rtree, testxy, sig2 * 25.0, &d2); if (tmpi == -1) { // no nearest neighbour within range. debug2(" No nearest neighbour.\n"); refi = -1; logfg = -HUGE_VAL; } else { double loggmax; // Note that "refi" is w.r.t. the "refcopy" array (not the original data). refi = kdtree_permute(rtree, tmpi); // peak value of the Gaussian loggmax = log((1.0 - distractors) / (2.0 * M_PI * sig2 * v->NR)); // FIXME - do something with uninformative hits? // these should be eliminated by RoR filtering... if (loggmax < logbg) debug2(" This star is uninformative: peak %.1f, bg %.1f.\n", loggmax, logbg); // value of the foreground Gaussian logfg = loggmax - d2 / (2.0 * sig2); debug2(" NN: ref star %i, dist %.2f, sigmas: %.3f, logfg: %.1f (%.1f above distractor, %.1f above bg)\n", refi, sqrt(d2), sqrt(d2 / sig2), logfg, logfg - logd, logfg - logbg); } if (logfg < logd) { //reallogfg = logfg = logd; debug2(" Distractor.\n"); theta[i] = THETA_DISTRACTOR; } else { // duplicate match? if (rmatches[refi] != -1) { double oldfg = rprobs[refi]; //debug2("Conflict: odds was %g, now %g.\n", oldfg, logfg); // Conflict. Compute probabilities of old vs new theta. // if we keep the old one: the new star is a distractor double keepfg = logd; // if we switch to the new one: the new star is a match... double switchfg = logfg; // ... and the old one becomes a distractor... int oldj = rmatches[refi]; int muj = 0; //reallogfg = logfg; for (j=0; j<oldj; j++) if (theta[j] >= 0) muj++; switchfg += (logd_at(distractors, muj, v->NR, logbg) - oldfg); // FIXME - could estimate/bound the distractor change and avoid computing it... // ... and the intervening distractors become worse. debug2(" oldj is %i, muj is %i.\n", oldj, muj); debug2(" changing old point to distractor: %.1f change in logodds\n", (logd_at(distractors, muj, v->NR, logbg) - oldfg)); for (; j<i; j++) if (theta[j] < 0) { switchfg += (logd_at(distractors, muj, v->NR, logbg) - logd_at(distractors, muj+1, v->NR, logbg)); debug2(" adjusting distractor %i: %g change in logodds\n", j, (logd_at(distractors, muj, v->NR, logbg) - logd_at(distractors, muj+1, v->NR, logbg))); } else muj++; debug2(" Conflict: keeping old match, logfg would be %.1f\n", keepfg); debug2(" Conflict: accepting new match, logfg would be %.1f\n", switchfg); if (switchfg > keepfg) { // upgrade: old match becomes a distractor. debug2(" Conflict: upgrading.\n"); theta[oldj] = THETA_CONFLICT; // Note that here we want the entries in "theta" to be // indices into "v->refxy" et al, so apply the "rperm" permutation. theta[i] = rperm[refi]; // record this new match. rmatches[refi] = i; rprobs[refi] = logfg; // "switchfg" incorporates the cost of adjusting the previous probabilities. logfg = switchfg; // FIXME -- Do we need to repeat the distractor-adjustment // loop above, updating all_logodds entries?? // No, not really -- we update "logfg" in this loop, and record it below // and that's sort of right -- it's THIS star that resulting in all the changes. /* if (all_logodds) { muj = 0; for (j=0; j<oldj; j++) if (theta[j] >= 0) muj++; all_logodds[oldj] = logd_at(distractors, muj, v->NR, logbg) - logbg; for (j=oldj; j<i; j++) if (theta[j] < 0) { all_logodds[j] = logd_at(distractors, muj, v->NR, logbg) - logbg; } else { muj++; } double logp = 0.; for (j=0; j<i; j++) logp += all_logodds[j]; logverb("updated all_logodds = %g, vs logodds %g\n", logp, logodds); } */ } else { // old match was better: this match becomes a distractor. debug2(" Conflict: not upgrading.\n"); // logprob was %.1f, now %.1f.\n", oldfg, logfg); logfg = keepfg; theta[i] = THETA_CONFLICT; } // no change in mu. } else { // new match. rmatches[refi] = i; rprobs[refi] = logfg; theta[i] = rperm[refi]; mu++; } } logodds += (logfg - logbg); debug2(" Logodds: change %.1f, now %.1f\n", (logfg - logbg), logodds); if (all_logodds) all_logodds[i] = logfg - logbg; if (logodds < logodds_bail) { debug2(" logodds %g less than bailout %g\n", logodds, logodds_bail); if (p_ibailed) *p_ibailed = i; break; } worstlogodds = MIN(worstlogodds, logodds); if (logodds > bestlogodds) { bestlogodds = logodds; besti = i; // Record the worst log-odds we've seen up to this point. bestworstlogodds = worstlogodds; } if (logodds > logodds_stoplooking) { if (p_istopped) *p_istopped = i; break; } } if (bestlogodds > DLOG_ODDS_MIN) { // when the loop stopped... int iend = i; data_log_start_item(DATALOG_MASK_VERIFY, DLOG_ODDS, "logodds"); dlog(DLOG_ODDS, "["); for (i=0; i<iend; i++) dlog(DLOG_ODDS, "%s%g", (i ? ", ":""), all_logodds[i]); dlog(DLOG_ODDS, "]"); data_log_end_item(DATALOG_MASK_VERIFY, DLOG_ODDS); data_log_start_item(DATALOG_MASK_VERIFY, DLOG_ODDS, "bestlogodds"); dlog(DLOG_ODDS, "%g", bestlogodds); data_log_end_item(DATALOG_MASK_VERIFY, DLOG_ODDS); /* double lnp = 0.0; for (i=0; i<5; i++) lnp += all_logodds[i]; if (lnp > 4.) { printf("lnp at step 5: %g\n", lnp); printf("test perm:"); for (i=0; i<10; i++) printf(" %i", v->testperm[i]); printf("\n"); printf("theta:"); for (i=0; i<10; i++) printf(" %i", theta[i]); printf("\n"); data_log_start_item(DATALOG_MASK_VERIFY, DLOG_ODDS, "match"); dlog(DLOG_ODDS, "{ 'refxy': ["); for (i=0; i<v->NRall; i++) dlog(DLOG_ODDS, "(%.3f,%.3f),", v->refxy[2*i+0], v->refxy[2*i+1]); dlog(DLOG_ODDS, "], 'testxy': ["); for (i=0; i<v->NTall; i++) dlog(DLOG_ODDS, "(%.3f,%.3f),", v->testxy[2*i+0], v->testxy[2*i+1]); dlog(DLOG_ODDS, "], 'testperm': ["); for (i=0; i<v->NT; i++) dlog(DLOG_ODDS, "%i,", v->testperm[i]); dlog(DLOG_ODDS, "], 'refperm': ["); for (i=0; i<v->NR; i++) dlog(DLOG_ODDS, "%i,", v->refperm[i]); dlog(DLOG_ODDS, "], 'theta': ["); for (i=0; i<v->NT; i++) dlog(DLOG_ODDS, "%i,", theta[i]); dlog(DLOG_ODDS, "], 'logodds5': %g, 'all_logodds': [", lnp); for (i=0; i<iend; i++) dlog(DLOG_ODDS, "%g,", all_logodds[i]); dlog(DLOG_ODDS, "] }"); data_log_end_item(DATALOG_MASK_VERIFY, DLOG_ODDS); } */ } free(rmatches); if (p_theta) *p_theta = theta; else free(theta); if (p_besti) *p_besti = besti; if (p_worstlogodds) *p_worstlogodds = bestworstlogodds; if (all_logodds && !*p_logodds) free(all_logodds); free(rprobs); kdtree_free(rtree); free(refcopy); return bestlogodds; } void verify_get_index_stars(const double* fieldcenter, double fieldr2, const startree_t* skdt, const sip_t* sip, const tan_t* tan, double fieldW, double fieldH, double** p_indexradec, double** indexpix, int** p_starids, int* p_nindex) { double* indxyz; int i, N, NI; int* sweep; int* starid; int* inbounds; int* perm; double* radec = NULL; assert(skdt->sweep); assert(p_nindex); assert(sip || tan); // Find all index stars within the bounding circle of the field. startree_search_for(skdt, fieldcenter, fieldr2, &indxyz, NULL, &starid, &N); if (!indxyz) { // no stars in range. *p_nindex = 0; return; } // Find index stars within the rectangular field. inbounds = sip_filter_stars_in_field(sip, tan, indxyz, NULL, N, indexpix, NULL, &NI); // Apply the permutation now, so that "indexpix" and "starid" stay in sync: // indexpix is already in the "inbounds" ordering. permutation_apply(inbounds, NI, starid, starid, sizeof(int)); // Compute index RA,Decs if requested. if (p_indexradec) { radec = malloc(2 * NI * sizeof(double)); for (i=0; i<NI; i++) // note that the "inbounds" permutation is applied to "indxyz" here. // we will apply the sweep permutation below. xyzarr2radecdegarr(indxyz + 3*inbounds[i], radec + 2*i); *p_indexradec = radec; } free(indxyz); free(inbounds); // Each index star has a "sweep number" assigned during index building; // it roughly represents a local brightness ordering. Use this to sort the // index stars. sweep = malloc(NI * sizeof(int)); for (i=0; i<NI; i++) sweep[i] = skdt->sweep[starid[i]]; perm = permuted_sort(sweep, sizeof(int), compare_ints_asc, NULL, NI); free(sweep); if (indexpix) { permutation_apply(perm, NI, *indexpix, *indexpix, 2 * sizeof(double)); *indexpix = realloc(*indexpix, NI * 2 * sizeof(double)); } if (p_starids) { permutation_apply(perm, NI, starid, starid, sizeof(int)); starid = realloc(starid, NI * sizeof(int)); *p_starids = starid; } else free(starid); if (p_indexradec) permutation_apply(perm, NI, radec, radec, 2 * sizeof(double)); free(perm); *p_nindex = NI; } /** If field objects are within "sigma" of each other (where sigma depends on the distance from the matched quad), then they are not very useful for verification. We filter out field stars within sigma of each other, taking only the brightest. Returns an array indicating which field stars should be kept. */ static anbool* verify_deduplicate_field_stars(verify_t* v, const verify_field_t* vf, double nsigmas) { anbool* keepers = NULL; int i, j, ti; kdtree_qres_t* res = NULL; double nsig2 = nsigmas*nsigmas; int options = KD_OPTIONS_NO_RESIZE_RESULTS | KD_OPTIONS_SMALL_RADIUS; // default to FALSE keepers = calloc(v->NTall, sizeof(anbool)); for (i=0; i<v->NT; i++) { ti = v->testperm[i]; keepers[ti] = TRUE; } for (i=0; i<v->NT; i++) { double sxy[2]; ti = v->testperm[i]; if (!keepers[ti]) continue; starxy_get(vf->field, ti, sxy); res = kdtree_rangesearch_options_reuse(vf->ftree, res, sxy, nsig2 * v->testsigma[ti], options); for (j=0; j<res->nres; j++) { int ind = res->inds[j]; if (ind > i) { keepers[ind] = FALSE; if (DEBUGVERIFY) { double otherxy[2]; starxy_get(vf->field, ind, otherxy); logdebug("Field star %i at %g,%g: is close to field star %i at %g,%g. dist is %g, sigma is %g\n", i, sxy[0], sxy[1], ind, otherxy[0], otherxy[1], sqrt(distsq(sxy, otherxy, 2)), sqrt(nsig2 * v->testsigma[ti])); } } } } kdtree_free_query(res); return keepers; } void verify_get_quad_center(const verify_field_t* vf, const MatchObj* mo, double* centerpix, double* quadr2) { double Axy[2], Bxy[2]; // Find the midpoint of AB of the quad in pixel space. starxy_get(vf->field, mo->field[0], Axy); starxy_get(vf->field, mo->field[1], Bxy); centerpix[0] = 0.5 * (Axy[0] + Bxy[0]); centerpix[1] = 0.5 * (Axy[1] + Bxy[1]); // Find the radius-squared of the quad = distsq(qc, A) *quadr2 = distsq(Axy, centerpix, 2); } void verify_get_uniformize_scale(int cutnside, double scale, int W, int H, int* cutnw, int* cutnh) { double cutarcsec, cutpix; cutarcsec = healpix_side_length_arcmin(cutnside) * 60.0; cutpix = cutarcsec / scale; debug2("cut nside: %i\n", cutnside); debug2("cut scale: %g arcsec\n", cutarcsec); debug2("match scale: %g arcsec/pix\n", scale); debug2("cut scale: %g pixels\n", cutpix); if (cutnw) *cutnw = MAX(1, (int)round(W / cutpix)); if (cutnh) *cutnh = MAX(1, (int)round(H / cutpix)); } void verify_uniformize_field(const double* xy, int* perm, int N, double fieldW, double fieldH, int nw, int nh, int** p_bincounts, int** p_binids) { il** lists; int i,j,k,p; int* bincounts = NULL; int* binids = NULL; if (p_binids) { binids = malloc(N * sizeof(int)); *p_binids = binids; } lists = malloc(nw * nh * sizeof(il*)); for (i=0; i<(nw*nh); i++) lists[i] = il_new(16); // put the stars in the appropriate bins. debug2("Test star bins:\n"); for (i=0; i<N; i++) { int ind; int bin; ind = perm[i]; bin = get_xy_bin(xy + 2*ind, fieldW, fieldH, nw, nh); debug2("%i ", bin); il_append(lists[bin], ind); } debug2("\n"); if (p_bincounts) { // note the bin occupancies. bincounts = malloc(nw * nh * sizeof(int)); for (i=0; i<(nw*nh); i++) { bincounts[i] = il_size(lists[i]); //logverb("bin %i has %i stars\n", i, bincounts[i]); } *p_bincounts = bincounts; } // make sweeps through the bins, grabbing one star from each. p=0; for (k=0;; k++) { for (j=0; j<nh; j++) { for (i=0; i<nw; i++) { int binid = j*nw + i; il* lst = lists[binid]; if (k >= il_size(lst)) continue; perm[p] = il_get(lst, k); if (binids) binids[p] = binid; p++; } } if (p == N) break; } assert(p == N); for (i=0; i<(nw*nh); i++) il_free(lists[i]); free(lists); } double* verify_uniformize_bin_centers(double fieldW, double fieldH, int nw, int nh) { int i,j; double* bxy = malloc(nw * nh * 2 * sizeof(double)); for (j=0; j<nh; j++) for (i=0; i<nw; i++) { bxy[(j * nw + i)*2 +0] = (i + 0.5) * fieldW / (double)nw; bxy[(j * nw + i)*2 +1] = (j + 0.5) * fieldH / (double)nh; } return bxy; } void verify_wcs(const startree_t* skdt, int index_cutnside, const sip_t* sip, const verify_field_t* vf, double verify_pix2, double distractors, double fieldW, double fieldH, double logbail, double logaccept, double logstoplooking, double* logodds, int* nfield, int* nindex, int* nmatch, int* nconflict, int* ndistractor // int** theta ? ) { MatchObj mo; memset(&mo, 0, sizeof(MatchObj)); radecdeg2xyzarr(sip->wcstan.crval[0], sip->wcstan.crval[1], mo.center); mo.radius = arcsec2dist(hypot(fieldW, fieldH)/2.0 * sip_pixel_scale(sip)); memcpy(&(mo.wcstan), &(sip->wcstan), sizeof(tan_t)); mo.wcs_valid = TRUE; verify_hit(skdt, index_cutnside, &mo, sip, vf, verify_pix2, distractors, fieldW, fieldH, logbail, logaccept, logstoplooking, FALSE, TRUE); if (logodds) *logodds = mo.logodds; if (nfield) *nfield = mo.nfield; if (nindex) *nindex = mo.nindex; if (nmatch) *nmatch = mo.nmatch; if (nconflict) *nconflict = mo.nconflict; if (ndistractor) *ndistractor = mo.ndistractor; } static void set_null_mo(MatchObj* mo) { mo->nfield = 0; mo->nmatch = 0; matchobj_compute_derived(mo); mo->logodds = -HUGE_VAL; } static void check_permutation(const int* perm, int N) { int i; int* counts = calloc(N, sizeof(int)); for (i=0; i<N; i++) { assert(perm[i] >= 0); assert(perm[i] < N); counts[perm[i]]++; } for (i=0; i<N; i++) { assert(counts[i] == 1); } free(counts); } static void fixup_theta(int* theta, double* allodds, int ibailed, int istopped, verify_t* v, int besti, int NRimage, double* refxyz, int** p_etheta, double** p_eodds) { int* etheta; double* eodds; int* invrperm; int i, ti; if (DEBUGVERIFY) { // The "testperm" permutation should be "complete". check_permutation(v->testperm, v->NTall); // "refperm" has vals < NRall in elements < NRimage. //check_permutation(v->refperm, NRimage); for (i=0; i<NRimage; i++) { assert(v->refperm[i] >= 0); assert(v->refperm[i] < v->NRall); } } // "theta" has length v->NT. if (ibailed != -1) for (i=ibailed+1; i<v->NT; i++) theta[i] = THETA_BAILEDOUT; if (istopped != -1) for (i=istopped+1; i<v->NT; i++) theta[i] = THETA_STOPPEDLOOKING; // At this point, "theta[0]" is the *reference* star index // that was matched by the test star "v->testperm[0]". // Meanwhile, "v->refperm" lists all the valid reference stars. // We want to produce "etheta", which has elements parallel to // the test stars in their original (brightness) ordering; that is, // we want to eliminate the need for "v->testperm". if (DEBUGVERIFY) { for (i=0; i<v->NT; i++) { Unused int ri; if (i == besti) debug2("* "); debug2("Theta[%i] = %i", i, theta[i]); if (theta[i] < 0) { debug2("\n"); continue; } ri = theta[i]; ti = v->testperm[i]; debug2(" (starid %i), testxy=(%.1f, %.1f), refxy=(%.1f, %.1f)\n", (v->refstarid ? v->refstarid[ri] : -1000), v->testxy[ti*2+0], v->testxy[ti*2+1], v->refxy[ri*2+0], v->refxy[ri*2+1]); } } etheta = malloc(v->NTall * sizeof(int)); eodds = malloc(v->NTall * sizeof(double)); // Apply the "refperm" permutation, mostly to cut out the stars that // aren't in the image (we want to have "nindex" = "NRimage" = "NRall"). // This requires computing the inverse perm so we can fix theta to match. // The reference stars include stars that are actually outside // the field; we want to collapse the reference star list, // which will renumber them. invrperm = malloc(v->NRall * sizeof(int)); #define BAD_PERM -1000000 if (DEBUGVERIFY) { for (i=0; i<v->NRall; i++) invrperm[i] = BAD_PERM; } for (i=0; i<NRimage; i++) invrperm[v->refperm[i]] = i; if (v->refstarid) permutation_apply(v->refperm, NRimage, v->refstarid, v->refstarid, sizeof(int)); permutation_apply(v->refperm, NRimage, v->refxy, v->refxy, 2*sizeof(double)); if (refxyz) permutation_apply(v->refperm, NRimage, refxyz, refxyz, 3*sizeof(double)); // New v->refstarid[i] is old v->refstarid[ v->refperm[i] ] if (DEBUGVERIFY) { for (i=0; i<v->NTall; i++) etheta[i] = BAD_PERM; } for (i=0; i<v->NT; i++) { ti = v->testperm[i]; if (DEBUGVERIFY) // assert that we haven't touched this element yet. assert(etheta[ti] == BAD_PERM); if (theta[i] < 0) { etheta[ti] = theta[i]; // No match -> no weight. eodds[ti] = -HUGE_VAL; } else { if (DEBUGVERIFY) assert(invrperm[theta[i]] != BAD_PERM); etheta[ti] = invrperm[theta[i]]; eodds[ti] = allodds[i]; } } free(invrperm); for (i=v->NT; i<v->NTall; i++) { ti = v->testperm[i]; etheta[ti] = THETA_FILTERED; eodds[ti] = -HUGE_VAL; } if (DEBUGVERIFY) { // We should touch every element. for (i=0; i<v->NTall; i++) assert(etheta[i] != BAD_PERM); for (i=0; i<v->NTall; i++) if (etheta[i] >= 0) assert(etheta[i] < NRimage); else assert(etheta[i] == THETA_FILTERED || etheta[i] == THETA_DISTRACTOR || etheta[i] == THETA_CONFLICT || etheta[i] == THETA_BAILEDOUT || etheta[i] == THETA_STOPPEDLOOKING); } *p_etheta = etheta; *p_eodds = eodds; } void verify_count_hits(int* theta, int besti, int* p_nmatch, int* p_nconflict, int* p_ndistractor) { int i; int d, c, m; d = 0; c = 0; m = 0; for (i=0; i<=besti; i++) { if (theta[i] == THETA_DISTRACTOR) d++; else if (theta[i] == THETA_CONFLICT) c++; else m++; } if (p_nconflict) *p_nconflict = c; if (p_ndistractor) *p_ndistractor = d; if (p_nmatch) *p_nmatch = m; } void verify_hit(const startree_t* skdt, int index_cutnside, MatchObj* mo, const sip_t* sip, const verify_field_t* vf, double pix2, double distractors, double fieldW, double fieldH, double logbail, double logaccept, double logstoplooking, anbool do_gamma, anbool fake_match) { int i,j; double* fieldcenter; double fieldr2; double effA, K, worst; int besti; int* theta = NULL; double* allodds = NULL; sip_t thewcs; int ibad, igood; double* refxyz = NULL; int* sweep = NULL; verify_t the_v; verify_t* v = &the_v; int NRimage; int ibailed, istopped; assert(mo->wcs_valid || sip); assert(isfinite(logaccept)); assert(isfinite(logbail)); memset(v, 0, sizeof(verify_t)); if (sip) v->wcs = sip; else { sip_wrap_tan(&mo->wcstan, &thewcs); v->wcs = &thewcs; } // center and radius of the field in xyz space: fieldcenter = mo->center; fieldr2 = square(mo->radius); debug("Field center %g,%g,%g, radius2 %g\n", fieldcenter[0], fieldcenter[1], fieldcenter[2], fieldr2); if (log_get_level() >= LOG_VERB) { double ra,dec, r; xyzarr2radecdeg(fieldcenter, &ra, &dec); r = distsq2deg(fieldr2); debug("Field center RA,Dec %g,%g, radius %g deg\n", ra, dec, r); } // find index stars and project them into pixel coordinates. /* verify_get_index_stars(fieldcenter, fieldr2, skdt, sip, &(mo->wcstan), fieldW, fieldH, NULL, &refxy, &starids, &NR); */ /* Gotta be a bit careful with reference stars: We want to be able to return a list of all the reference stars in the image, but during the verification process we want to apply some filtering of reference stars. We therefore keep an int array ("refperm") of indices into the arrays of reference star quantities. There are "NR" good stars, but "NRall" in total. Thus operations on all the stars must go to "NRall" in the original arrays, but operations on good stars must go to "NR", using "refperm" to redirect. This means that "refperm" should remain a permutation array (ie, no duplicates), and each value should be less than "NRall"; when filtering out an index, it should get moved to the part of the array between "NR" and "NRall". We use the "badguys" array to hold these indices temporarily. */ assert(skdt->sweep); // Find all index stars within the bounding circle of the field. startree_search_for(skdt, fieldcenter, fieldr2, &refxyz, NULL, &v->refstarid, &v->NRall); debug2("%i reference stars in the bounding circle\n", v->NRall); if (!refxyz) { // no stars in range. logverb("No reference stars in the bounding circle\n"); goto bailout; } //logverb("Found %i reference stars in the bounding circle\n", v->NRall); // Find index stars within the rectangular field. v->refxy = malloc(v->NRall * 2 * sizeof(double)); v->refperm = malloc(v->NRall * sizeof(int)); igood = 0; for (i=0; i<v->NRall; i++) { if (!sip_xyzarr2pixelxy(v->wcs, refxyz+i*3, v->refxy+i*2, v->refxy+i*2 +1) || !sip_pixel_is_inside_image(v->wcs, v->refxy[i*2], v->refxy[i*2+1])) { continue; } v->refperm[igood] = i; igood++; } v->NR = igood; // We sort of want to forget about stars not within the image... // but we don't want to change NRall... NRimage = v->NR; // NOTE that at this point, v->refperm elements past NRimage are invalid // (ie, may contain repeats) // Sort by sweep #. // Each index star has a "sweep number" assigned during index building; // it roughly represents a local brightness ordering. Use this to sort the // index stars. // (NOTE that here we do want "sweep" to be size "NRall"; only the // bottom "NRimage" of the "refperm" array will be accessed in the // permuted_sort below, so none of // the elements between NRimage and NRall will be touched.) sweep = malloc(v->NRall * sizeof(int)); for (i=0; i<v->NRall; i++) sweep[i] = skdt->sweep[v->refstarid[i]]; // Note here that we're passing in an existing permutation array; it // gets re-permuted during this call. permuted_sort(sweep, sizeof(int), compare_ints_asc, v->refperm, v->NR); free(sweep); sweep = NULL; debug2("Found %i reference stars.\n", v->NR); // "refstarids" are indices into the star kdtree and could be used to // retrieve "tag-along" data with, eg, startree_get_data_column(). v->badguys = malloc(v->NR * sizeof(int)); // remove reference stars that are part of the quad. if (!fake_match) { ibad = 0; igood = 0; for (i=0; i<v->NR; i++) { anbool inquad = FALSE; int ri = v->refperm[i]; for (j=0; j<mo->dimquads; j++) { if (v->refstarid[ri] == mo->star[j]) { inquad = TRUE; //debug2("Skipping ref star index %i, starid %i: quad star %i\n", ri, v->refstarid[ri], j); v->badguys[ibad] = ri; ibad++; break; } } if (inquad) continue; v->refperm[igood] = ri; igood++; } // remember the bad guys memcpy(v->refperm + igood, v->badguys, ibad * sizeof(int)); v->NR = igood; debug2("After removing stars in the quad: %i reference stars.\n", v->NR); } if (!v->NR) { logverb("After removing quad stars: no reference stars\n"); goto bailout; } ///// FIXME -- we could compute the RoR and search for ref stars // based on the quad center and RoR rather than the image center // and image radius. if (!fake_match) { verify_apply_ror(v, index_cutnside, mo, vf, pix2, distractors, fieldW, fieldH, do_gamma, fake_match, &effA, NULL, NULL); if (!v->NR) { logerr("After applying ROR, NR = 0!\n"); goto bailout; } } else { verify_get_test_stars(v, vf, mo, pix2, do_gamma, fake_match); effA = fieldW * fieldH; debug2("Number of test stars: %i\n", v->NT); } if (!v->NR || !v->NT) { logverb("After applying RoR, NR=%i, NT=%i\n", v->NR, v->NT); goto bailout; } worst = -HUGE_VAL; K = real_verify_star_lists(v, effA, distractors, logbail, logstoplooking, &besti, &allodds, &theta, &worst, &ibailed, &istopped); mo->logodds = K; mo->worstlogodds = worst; // NTall so that caller knows how big 'etheta' is. mo->nfield = v->NTall; // NRimage: only the stars inside the image bounds. mo->nindex = NRimage; if (log_get_level() >= LOG_ALL) { int nm, nc, nd; verify_count_hits(theta, besti, &nm, &nc, &nd); debug("verify: logodds %g, %i matches, %i conflicts, %i distractors after %i field objects.\n", K, nm, nc, nd, besti); } if (K >= logaccept) { int ri, ti; int* etheta; double* eodds; int nm, nc, nd; verify_count_hits(theta, besti, &nm, &nc, &nd); mo->nmatch = nm; mo->nconflict = nc; mo->ndistractor = nd; fixup_theta(theta, allodds, ibailed, istopped, v, besti, NRimage, refxyz, ðeta, &eodds); // Reinsert the matched quad... if (!fake_match) { for (j=0; j<mo->dimquads; j++) { // the ref star should have been eliminated, so it // should be in the "bad" part of the array, but // search the whole thing anyway. for (i=0; i<NRimage; i++) { ri = i; if (v->refstarid[ri] == mo->star[j]) { ti = mo->field[j]; assert(etheta[ti] == THETA_FILTERED); etheta[ti] = ri; eodds[ti] = HUGE_VAL; debug2("Matched ref index %i (star %i) to test index %i; ref pos=(%.1f, %.1f), test pos=(%.1f, %.1f)\n", ri, v->refstarid[ri], ti, v->refxy[ri*2+0], v->refxy[ri*2+1], v->testxy[ti*2+0], v->testxy[ti*2+1]); break; } } } } if (DEBUGVERIFY) { debug2("\n"); for (i=0; i<v->NTall; i++) { debug2("ETheta[%i] = %i", i, etheta[i]); if (etheta[i] < 0) { debug2(" (w=%g)\n", verify_logodds_to_weight(eodds[i])); continue; } ri = etheta[i]; ti = i; debug2(" (starid %i), testxy=(%.1f, %.1f), refxy=(%.1f, %.1f), logodds=%g, w=%g\n", v->refstarid[ri], v->testxy[ti*2+0], v->testxy[ti*2+1], v->refxy[ri*2+0], v->refxy[ri*2+1], eodds[i], verify_logodds_to_weight(eodds[i])); } } mo->theta = etheta; mo->matchodds = eodds; mo->refxyz = refxyz; refxyz = NULL; mo->refxy = v->refxy; v->refxy = NULL; mo->refstarid = v->refstarid; v->refstarid = NULL; mo->testperm = v->testperm; v->testperm = NULL; matchobj_compute_derived(mo); } cleanup: free(refxyz); free(theta); free(allodds); free(v->testperm); free(v->testsigma); free(v->tbadguys); free(v->refperm); free(v->refxy); free(v->refstarid); free(v->badguys); return; bailout: set_null_mo(mo); // uh oh, spaghetti-code-oh! goto cleanup; } // Free the things we added to this mo. void verify_free_matchobj(MatchObj* mo) { free(mo->refxyz); free(mo->refstarid); free(mo->refxy); free(mo->theta); free(mo->matchodds); free(mo->testperm); mo->testperm = NULL; mo->refxyz = NULL; mo->refstarid = NULL; mo->refxy = NULL; mo->theta = NULL; mo->matchodds = NULL; } void verify_matchobj_deep_copy(const MatchObj* mo, MatchObj* dest) { if (mo->refxyz) { dest->refxyz = malloc(mo->nindex * 3 * sizeof(double)); memcpy(dest->refxyz, mo->refxyz, mo->nindex * 3 * sizeof(double)); } if (mo->refxy) { dest->refxy = malloc(mo->nindex * 2 * sizeof(double)); memcpy(dest->refxy, mo->refxy, mo->nindex * 2 * sizeof(double)); } if (mo->refstarid) { dest->refstarid = malloc(mo->nindex * sizeof(int)); memcpy(dest->refstarid, mo->refstarid, mo->nindex * sizeof(int)); } if (mo->matchodds) { dest->matchodds = malloc(mo->nfield * sizeof(double)); memcpy(dest->matchodds, mo->matchodds, mo->nfield * sizeof(double)); } if (mo->theta) { dest->theta = malloc(mo->nfield * sizeof(int)); memcpy(dest->theta, mo->theta, mo->nfield * sizeof(int)); } } double verify_logodds_to_weight(double lodds) { if (lodds > 40.) return 1.0; if (lodds < -700) return 0.0; return exp(lodds) / (1.0 + exp(lodds)); } double verify_star_lists(double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double effective_area, double distractors, double logodds_bail, double logodds_stoplooking, int* p_besti, double** p_all_logodds, int** p_theta, double* p_worstlogodds, int** p_testperm) { double X; verify_t v; double* eodds; int* etheta; int ibailed, istopped; int besti; int* theta; double* allodds; memset(&v, 0, sizeof(verify_t)); v.NRall = v.NR = NR; v.NTall = v.NT = NT; // discard const here... v.refxy = (double*)refxys; v.testxy = (double*)testxys; v.testsigma = (double*)testsigma2s; v.refperm = permutation_init(NULL, NR); v.testperm = permutation_init(NULL, NT); X = real_verify_star_lists(&v, effective_area, distractors, logodds_bail, logodds_stoplooking, &besti, &allodds, &theta, p_worstlogodds, &ibailed, &istopped); fixup_theta(theta, allodds, ibailed, istopped, &v, besti, NR, NULL, ðeta, &eodds); free(theta); free(allodds); if (p_all_logodds) *p_all_logodds = eodds; else free(eodds); if (p_theta) *p_theta = etheta; else free(etheta); if (p_besti) *p_besti = besti; if (p_testperm) *p_testperm = v.testperm; else free(v.testperm); free(v.refperm); free(v.badguys); return X; } double verify_star_lists_ror(double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double pix2, double gamma, const double* qc, double Q2, double W, double H, double distractors, double logodds_bail, double logodds_stoplooking, int* p_besti, double** p_all_logodds, int** p_theta, double* p_worstlogodds, int** p_testperm, int** p_refperm) { double X; verify_t v; double* eodds = NULL; int* etheta = NULL; int ibailed, istopped; int besti = -1; int* theta = NULL; double* allodds = NULL; // RoR double ror2; int igood, ibad; int NB = 100; int NBx, NBy; double bx0, by0; double stepx, stepy; int i, j; int Ngood; double effective_area; memset(&v, 0, sizeof(verify_t)); v.NRall = v.NR = NR; v.NTall = v.NT = NT; v.refxy = refxys; // instead of verify_get_test_stars()... // (so we don't do: // --dedup // --remove quad stars // --uniformize // ) // discard const here... v.testxy = (double*)testxys; v.testsigma = (double*)testsigma2s; v.refperm = permutation_init(NULL, NR); v.testperm = permutation_init(NULL, NT); v.tbadguys = malloc(v.NTall * sizeof(int)); v.badguys = malloc(v.NRall * sizeof(int)); ror2 = verify_get_ror2(Q2, W*H, distractors, NR, pix2); logverb("RoR: %g\n", sqrt(ror2)); // Remove test stars outside the RoR. igood = ibad = 0; for (i=0; i<v.NT; i++) { int ti = v.testperm[i]; double r2 = distsq(qc, v.testxy + 2*ti, 2); if (r2 < ror2) { v.testperm[igood] = ti; igood++; } else { v.tbadguys[ibad] = ti; ibad++; } } v.NT = igood; // remember the bad guys memcpy(v.testperm + igood, v.tbadguys, ibad * sizeof(int)); logverb("Test stars in RoR: %i of %i\n", v.NT, v.NTall); // Count good bins to find effective area... NBx = ceil((double)W / sqrt(W*H) * sqrt(NB)); NBy = ceil((double)H / sqrt(W*H) * sqrt(NB)); NB = NBx * NBy; stepx = (double)W / (double)NBx; stepy = (double)H / (double)NBy; bx0 = stepx/2.0; by0 = stepy/2.0; Ngood = 0; for (i=0; i<NBy; i++) { double bxy[2]; bxy[1] = by0 + i*stepy; for (j=0; j<NBx; j++) { double r2; bxy[0] = bx0 + j*stepx; r2 = distsq(bxy, qc, 2); if (r2 < ror2) Ngood++; } } effective_area = W*H * (double)Ngood / (double)NB; logverb("Good bins: %i / %i; effA %g of %g\n", Ngood, NB, W*H, effective_area); // Remove ref stars outside RoR. igood = ibad = 0; for (i=0; i<v.NR; i++) { int ri = v.refperm[i]; if (distsq(qc, v.refxy + 2*ri, 2) < ror2) { v.refperm[igood] = ri; igood++; } else { v.badguys[ibad] = ri; ibad++; } } // remember the bad guys memcpy(v.refperm + igood, v.badguys, ibad * sizeof(int)); v.NR = igood; logverb("Ref stars in RoR: %i of %i\n", v.NR, v.NRall); if (v.NR) { X = real_verify_star_lists(&v, effective_area, distractors, logodds_bail, logodds_stoplooking, &besti, &allodds, &theta, p_worstlogodds, &ibailed, &istopped); fixup_theta(theta, allodds, ibailed, istopped, &v, besti, NR, NULL, ðeta, &eodds); free(theta); free(allodds); if (p_all_logodds) *p_all_logodds = eodds; else free(eodds); if (p_theta) *p_theta = etheta; else free(etheta); if (p_besti) *p_besti = besti; } else { X = -HUGE_VAL; } if (p_testperm) *p_testperm = v.testperm; else free(v.testperm); if (p_refperm) *p_refperm = v.refperm; else free(v.refperm); free(v.badguys); free(v.tbadguys); return X; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/verify2.c�����������������������������������������������������������������000644 �000765 �000024 �00000023746 12651445460 017424� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <assert.h> #include <math.h> #include <string.h> #include <stdint.h> #include "verify2.h" #include "permutedsort.h" #include "mathutil.h" #include "keywords.h" #include "log.h" #include "sip-utils.h" #include "healpix.h" #define DEBUGVERIFY 1 #if DEBUGVERIFY //#define debug(args...) fprintf(stderr, args) #else #define debug(args...) #endif #include "fitsioutils.h" #include "errors.h" #include "cairoutils.h" static void add_gaussian_to_image(double* img, int W, int H, double cx, double cy, double sigma, double scale, double nsigma, int boundary) { int x, y; if (boundary == 0) { // truncate. for (y = MAX(0, cy - nsigma*sigma); y <= MIN(H-1, cy + nsigma * sigma); y++) { for (x = MAX(0, cx - nsigma*sigma); x <= MIN(W-1, cx + nsigma * sigma); x++) { img[y*W + x] += scale * exp(-(square(y-cy)+square(x-cx)) / (2.0 * square(sigma))); } } } else if (boundary == 1) { // mirror. int mx, my; for (y=MAX(-(H-1), floor(cy - nsigma * sigma)); y<=MIN(2*H-1, ceil(cy + nsigma * sigma)); y++) { if (y < 0) my = -1 - y; else if (y >= H) my = 2*H - 1 - y; else my = y; for (x=MAX(-(W-1), floor(cx - nsigma * sigma)); x<=MIN(2*W-1, ceil(cx + nsigma * sigma)); x++) { if (x < 0) mx = -1 - x; else if (x >= W) mx = 2*W - 1 - x; else mx = x; img[my*W + mx] += scale * exp(-(square(y-cy)+square(x-cx)) / (2.0 * square(sigma))); } } } } void verify_get_all_matches(const double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double effective_area, double distractors, double nsigma, double limit, il*** p_reflist, dl*** p_problist) { double* refcopy; kdtree_t* rtree; int Nleaf = 10; int i,j; double logd; double logbg; double loglimit; il** reflist; dl** problist; reflist = calloc(NT, sizeof(il*)); problist = calloc(NT, sizeof(dl*)); // Build a tree out of the index stars in pixel space... // kdtree scrambles the data array so make a copy first. refcopy = malloc(2 * NR * sizeof(double)); memcpy(refcopy, refxys, 2 * NR * sizeof(double)); rtree = kdtree_build(NULL, refcopy, NR, 2, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); logbg = log(1.0 / effective_area); logd = log(distractors / effective_area); loglimit = log(distractors / effective_area * limit); for (i=0; i<NT; i++) { const double* testxy; double sig2; kdtree_qres_t* res; testxy = testxys + 2*i; sig2 = testsigma2s[i]; logverb("\n"); logverb("test star %i: (%.1f,%.1f), sigma: %.1f\n", i, testxy[0], testxy[1], sqrt(sig2)); // find all ref stars within nsigma. res = kdtree_rangesearch_options(rtree, testxy, sig2*nsigma*nsigma, KD_OPTIONS_SORT_DISTS | KD_OPTIONS_SMALL_RADIUS); if (res->nres == 0) { kdtree_free_query(res); continue; } reflist[i] = il_new(4); problist[i] = dl_new(4); for (j=0; j<res->nres; j++) { double d2; int refi; double loggmax, logfg; d2 = res->sdists[j]; refi = res->inds[j]; // peak value of the Gaussian loggmax = log((1.0 - distractors) / (2.0 * M_PI * sig2 * NR)); // value of the Gaussian logfg = loggmax - d2 / (2.0 * sig2); if (logfg < loglimit) continue; logverb(" ref star %i, dist %.2f, sigmas: %.3f, logfg: %.1f (%.1f above distractor, %.1f above bg, %.1f above keep-limit)\n", refi, sqrt(d2), sqrt(d2 / sig2), logfg, logfg - logd, logfg - logbg, logfg - loglimit); il_append(reflist[i], refi); dl_append(problist[i], logfg); } kdtree_free_query(res); } kdtree_free(rtree); free(refcopy); *p_reflist = reflist; *p_problist = problist; } /* unsigned char* img = malloc(4*W*H); // draw images of index and field densities. double* idensity = calloc(W * H, sizeof(double)); double* fdensity = calloc(W * H, sizeof(double)); double iscale = 2. * sqrt((double)(W * H) / (NI * M_PI)); double fscale = 2. * sqrt((double)(W * H) / (NF * M_PI)); logverb("NI = %i; iscale = %g\n", NI, iscale); logverb("NF = %i; fscale = %g\n", NF, fscale); logverb("computing density images...\n"); for (i=0; i<NI; i++) add_gaussian_to_image(idensity, W, H, indexpix[i*2 + 0], indexpix[i*2 + 1], iscale, 1.0, 3.0, 1); for (i=0; i<NF; i++) add_gaussian_to_image(fdensity, W, H, starxy_getx(vf->field, i), starxy_gety(vf->field, i), fscale, 1.0, 3.0, 1); double idmax=0, fdmax=0; for (i=0; i<(W*H); i++) { idmax = MAX(idmax, idensity[i]); fdmax = MAX(fdmax, fdensity[i]); } for (i=0; i<(W*H); i++) { unsigned char val = 255.5 * idensity[i] / idmax; img[i*4+0] = val; img[i*4+1] = val; img[i*4+2] = val; img[i*4+3] = 255; } cairoutils_write_png("idensity.png", img, W, H); for (i=0; i<(W*H); i++) { unsigned char val = 255.5 * fdensity[i] / fdmax; img[i*4+0] = val; img[i*4+1] = val; img[i*4+2] = val; img[i*4+3] = 255; } cairoutils_write_png("fdensity.png", img, W, H); free(idensity); free(fdensity); */ /* // index star weights. double* iweights = malloc(NI * sizeof(double)); for (i=0; i<NI; i++) iweights[i] = 1.0; // don't count index stars that are part of the matched quad. for (i=0; i<NI; i++) for (j=0; j<dimquads; j++) if (starids[i] == mo->star[j]) iweights[i] = 0.0; double ranksigma = 20.0; int Nrankprobs = (int)(ranksigma * 5); double* rankprobs = malloc(Nrankprobs * sizeof(double)); for (i=0; i<Nrankprobs; i++) rankprobs[i] = exp(-(double)(i*i) / (2. * ranksigma * ranksigma)); double qc[2], qr2; get_quad_center(vf, mo, qc, &qr2); */ /* // create the probability distribution map for this field star. double* pmap = malloc(W * H * sizeof(double)); // background rate... for (j=0; j<(W*H); j++) pmap[j] = distractors / (fieldW*fieldH); double normrankprob; int dr; normrankprob = 0.0; for (j=0; j<NI; j++) { dr = abs(i - j); if (dr >= Nrankprobs) continue; normrankprob += rankprobs[dr]; } for (j=0; j<NI; j++) { double r2, sig2, sig; dr = abs(i - j); if (dr >= Nrankprobs) continue; r2 = distsq(indexpix + j*2, qc, 2); sig2 = get_sigma2_at_radius(verify_pix2, r2, qr2); sig = sqrt(sig2); for (y = MAX(0, indexpix[j*2 + 1] - 5.0*sig); y <= MIN(H-1, indexpix[j*2 + 1] + 5.0 * sig); y++) { for (x = MAX(0, indexpix[j*2 + 0] - 5.0*sig); x <= MIN(W-1, indexpix[j*2 + 0] + 5.0 * sig); x++) { pmap[y*W + x] += iweights[j] * (rankprobs[dr] / normrankprob) * exp(-(square(indexpix[j*2+0]-x) + square(indexpix[j*2+1]-y)) / (2.0 * sig2)) * (1.0 / (2.0 * M_PI * sig2)) * (1.0 - distractors); } } } double maxval = 0.0; for (j=0; j<(W*H); j++) maxval = MAX(maxval, pmap[j]); double psum = 0.0; for (j=0; j<(W*H); j++) psum += pmap[j]; logverb("Probability sum: %g\n", psum); char* fn; printf("Writing probability image %i\n", i); printf("maxval = %g\n", maxval); for (j=0; j<(W*H); j++) { unsigned char val = (unsigned char)MAX(0, MIN(255, 255.5 * sqrt(pmap[j] / maxval))); img[4*j + 0] = val; img[4*j + 1] = val; img[4*j + 2] = val; img[4*j + 3] = 255; } free(pmap); cairo_t* cairo; cairo_surface_t* target; target = cairo_image_surface_create_for_data(img, CAIRO_FORMAT_ARGB32, W, H, W*4); cairo = cairo_create(target); cairo_set_line_join(cairo, CAIRO_LINE_JOIN_ROUND); cairo_set_antialias(cairo, CAIRO_ANTIALIAS_GRAY); // draw the quad. cairo_set_source_rgba(cairo, 0.0, 0.0, 1.0, 0.5); double starxy[DQMAX*2]; double angles[DQMAX]; int perm[DQMAX]; int DQ = dimquads; for (k=0; k<DQ; k++) starxy_get(vf->field, mo->field[k], starxy + k*2); for (k=0; k<DQ; k++) angles[k] = atan2(starxy[k*2 + 1] - qc[1], starxy[k*2 + 0] - qc[0]); permutation_init(perm, DQ); permuted_sort(angles, sizeof(double), compare_doubles_asc, perm, DQ); for (k=0; k<DQ; k++) { double px, py; px = starxy[perm[k]*2+0]; py = starxy[perm[k]*2+1]; if (k == 0) cairo_move_to(cairo, px, py); else cairo_line_to(cairo, px, py); } cairo_close_path(cairo); cairo_stroke(cairo); // draw the source point. cairo_set_source_rgb(cairo, 1.0, 0.0, 0.0); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, fxy[0], fxy[1], 3.0); cairo_stroke(cairo); */ /* // find index stars within n sigma... double nsigma = 5.0; double r2 = sigma2s[i] * nsigma*nsigma; int opts = KD_OPTIONS_COMPUTE_DISTS; kdtree_qres_t* res = kdtree_rangesearch_options(itree, fxy, r2, opts); logverb("found %i index stars within range.\n", res->nres); if (res->nres == 0) goto nextstar; double bestprob = 0.0; int bestarg = -1; for (j=0; j<res->nres; j++) { int ii = res->inds[j]; dr = abs(i - ii); logverb(" index star %i: rank diff %i\n", ii, i-ii); if (dr >= Nrankprobs) continue; double prob = iweights[ii] * rankprobs[dr] * exp(-res->sdists[j] / (2.0 * sigma2s[i])); logverb(" -> prob %g\n", prob); if (prob > bestprob) { bestprob = prob; bestarg = j; } } if (bestarg == -1) { // FIXME -- distractor? goto nextstar; } int besti = res->inds[bestarg]; double lostweight = bestprob / iweights[besti]; // exp(-res->sdists[bestarg] / (2.0 * sigma2s[i])); iweights[besti] = MAX(0.0, iweights[besti] - lostweight); logverb("matched index star %i: dropping weight by %g; new weight %g.\n", besti, lostweight, iweights[besti]); bestprob *= (1.0 / (2.0 * M_PI * sigma2s[i])) / normrankprob * (1.0 - distractors); logverb("bestprob %g, vs background %g\n", bestprob, (1.0 / (double)(W * H))); kdtree_free_query(res); cairo_set_source_rgb(cairo, 0.0, 1.0, 0.0); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, indexpix[2*besti+0], indexpix[2*besti+1], 3.0); cairo_stroke(cairo); nextstar: cairoutils_argb32_to_rgba(img, W, H); cairo_surface_destroy(target); cairo_destroy(cairo); asprintf(&fn, "logprob-%04i.png", i); cairoutils_write_png(fn, img, W, H); free(img); if (i >= 9) break; } kdtree_free(itree); free(ipixcopy); */ ��������������������������astrometry.net-0.67/blind/verify2.h�����������������������������������������������������������������000644 �000765 �000024 �00000001241 12651445460 017413� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #ifndef VERIFY2_H #define VERIFY2_H #include "astrometry/kdtree.h" #include "astrometry/matchobj.h" #include "astrometry/bl.h" #include "astrometry/starkd.h" #include "astrometry/sip.h" #include "astrometry/bl.h" #include "astrometry/starxy.h" #include "astrometry/index.h" void verify_get_all_matches(const double* refxys, int NR, const double* testxys, const double* testsigma2s, int NT, double effective_area, double distractors, double nsigma, double limit, il*** p_reflist, dl*** p_problist); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/wcs-grab.c����������������������������������������������������������������000644 �000765 �000024 �00000003353 12651445460 017533� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include "log.h" #include "errors.h" #include "sip.h" #include "sip_qfits.h" #include "fitsioutils.h" #include "boilerplate.h" #include "anqfits.h" const char* OPTIONS = "hv"; static void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s <input-filename> <extension> <output-filename>\n" "\n\n", progname); } int main(int argc, char** args) { char* outfn = NULL; char* infn = NULL; int ext; int c; int loglvl = LOG_MSG; qfits_header* hdr; sip_t sip; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case '?': case 'h': print_help(args[0]); exit(0); case 'v': loglvl++; break; } } log_init(loglvl); if (optind != argc-3) { print_help(args[0]); exit(-1); } infn = args[optind+0]; ext = atoi(args[optind+1]); outfn = args[optind+2]; logmsg("Reading extension %i from file \"%s\"\n", ext, infn); hdr = anqfits_get_header2(infn, ext); if (!hdr) { ERROR("Failed to read header from extension %i of file \"%s\"\n", ext, infn); exit(-1); } if (!sip_read_header(hdr, &sip)) { ERROR("Failed to read SIP header.\n"); exit(-1); } if (sip.a_order > 0) { logmsg("Got SIP header.\n"); } else { logmsg("Got TAN header.\n"); } logmsg("Writing to file \"%s\"\n", outfn); if (sip_write_to_file(&sip, outfn)) { ERROR("Failed to write SIP header to file \"%s\".\n", outfn); exit(-1); } qfits_header_destroy(hdr); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/whynot.c������������������������������������������������������������������000644 �000765 �000024 �00000101160 12651445460 017351� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE */ #include <unistd.h> #include <stdio.h> #include <string.h> #include <math.h> #include <assert.h> #include "os-features.h" #include "kdtree.h" #include "starutil.h" #include "mathutil.h" #include "bl.h" #include "matchobj.h" #include "catalog.h" #include "tic.h" #include "quadfile.h" #include "quad-utils.h" #include "xylist.h" #include "rdlist.h" #include "qidxfile.h" #include "verify.h" #include "ioutils.h" #include "starkd.h" #include "codekd.h" #include "index.h" #include "boilerplate.h" #include "sip.h" #include "sip-utils.h" #include "sip_qfits.h" #include "log.h" #include "fitsioutils.h" #include "fit-wcs.h" #include "codefile.h" #include "solver.h" #include "permutedsort.h" #include "intmap.h" #include "plotstuff.h" #include "plotxy.h" #include "plotindex.h" static const char* OPTIONS = "hx:w:i:vj:X:Y:Q:s:O:"; void print_help(char* progname) { BOILERPLATE_HELP_HEADER(stdout); printf("\nUsage: %s\n" " -w <WCS input file>\n" " -x <xyls input file>\n" " -i <index-name>\n" " [-X <x-column>]: X column name\n" " [-Y <y-column>]: Y column name\n" " [-v]: verbose\n" " [-j <pixel-jitter>]: set pixel jitter (default 1.0)\n" " [-Q <quad-plot-basename>]: plot all the quads in the image, one per file. Put a %%i in this filename!\n" " [-O <obj-plot-basename>]: make a plot for each image object; Put a %%i in this filename\n" " [-s <plot-scale>]: scale everything by this factor (eg, 0.25)\n" "\n", progname); } struct foundquad { //unsigned int stars[DQMAX]; double codedist; double logodds; double pscale; int quadnum; MatchObj mo; }; typedef struct foundquad foundquad_t; static int sort_fq_by_stars(const void* v1, const void* v2) { const foundquad_t* fq1 = v1; const foundquad_t* fq2 = v2; int mx1=0, mx2=0; int i; for (i=0; i<DQMAX; i++) { mx1 = MAX(mx1, fq1->mo.field[i]); mx2 = MAX(mx2, fq2->mo.field[i]); } if (mx1 < mx2) return -1; if (mx1 == mx2) return 0; return 1; } struct correspondence { int star; int field; double starx, stary; double fieldx, fieldy; double dist; }; typedef struct correspondence corr_t; struct indexstar { int star; double starx, stary; pl* corrs; il* allquads; }; typedef struct indexstar indexstar_t; int main(int argc, char** args) { int c; char* xylsfn = NULL; char* wcsfn = NULL; sl* indexnames; pl* indexes; pl* qidxes; xylist_t* xyls = NULL; sip_t sip; int i; int W, H; double xyzcenter[3]; double fieldrad2; double pixeljitter = 1.0; int loglvl = LOG_MSG; double wcsscale; char* xcol = NULL; char* ycol = NULL; double nsigma = 3.0; char* quadplotfn = NULL; char* objplotfn = NULL; double quadplotscale = 1.0; fits_use_error_system(); indexnames = sl_new(8); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 's': quadplotscale = atof(optarg); break; case 'Q': quadplotfn = optarg; break; case 'O': objplotfn = optarg; break; case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'i': sl_append(indexnames, optarg); break; case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !wcsfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to parse SIP header from %s...\n", wcsfn); if (!sip_read_header_file(wcsfn, &sip)) { logmsg("Failed to parse SIP header from %s.\n", wcsfn); } // image W, H W = sip.wcstan.imagew; H = sip.wcstan.imageh; if ((W == 0.0) || (H == 0.0)) { logmsg("WCS file %s didn't contain IMAGEW and IMAGEH headers.\n", wcsfn); // FIXME - use bounds of xylist? exit(-1); } wcsscale = sip_pixel_scale(&sip); logmsg("WCS scale: %g arcsec/pixel\n", wcsscale); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } if (xcol) xylist_set_xname(xyls, xcol); if (ycol) xylist_set_yname(xyls, ycol); xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); // read indices. indexes = pl_new(8); qidxes = pl_new(8); for (i=0; i<sl_size(indexnames); i++) { char* name = sl_get(indexnames, i); index_t* indx; char* qidxfn; qidxfile* qidx; logmsg("Loading index from %s...\n", name); indx = index_load(name, 0, NULL); if (!indx) { logmsg("Failed to read index \"%s\".\n", name); exit(-1); } pl_append(indexes, indx); logmsg("Index name: %s\n", indx->indexname); qidxfn = index_get_qidx_filename(indx->indexname); qidx = qidxfile_open(qidxfn); if (!qidx) { logmsg("Failed to open qidxfile \"%s\".\n", qidxfn); exit(-1); } free(qidxfn); pl_append(qidxes, qidx); } sl_free2(indexnames); // Find field center and radius. sip_pixelxy2xyzarr(&sip, W/2, H/2, xyzcenter); fieldrad2 = arcsec2distsq(sip_pixel_scale(&sip) * hypot(W/2, H/2)); // Find all stars in the field. for (i=0; i<pl_size(indexes); i++) { index_t* indx; int nquads; uint32_t* quads; int j, k; qidxfile* qidx; il* uniqquadlist; bl* foundquads = NULL; // index stars that are inside the image. il* starlist; // index stars that have correspondences. il* corrstarlist; // quads that are at least partly-contained in the image. il* quadlist; // quads that are fully-contained in the image. il* fullquadlist; // index stars that are in partly-contained quads. il* starsinquadslist; // index stars that are in fully-contained quads. il* starsinquadsfull; // index stars that are in quads and have correspondences. il* corrstars; // the corresponding field stars il* corrfield; // quads that are fully in the image and built from stars with correspondences. il* corrfullquads; // Map from index stars to list of field stars corresponding. //intmap_t* corr_i2f; //intmap_t* corr_f2i; bl* corrs; indexstar_t* istars; dl* starxylist; il* corrquads; il* corruniqquads; starxy_t* xy; // (x,y) positions of field stars. double* fieldxy; int Nfield; kdtree_t* ftree; kdtree_t* itree; int Nleaf = 5; int dimquads, dimcodes; int ncorr, nindexcorr; double pixr2; il* indstarswithcorrs; double* xyzs = NULL; // Indices (in the star-kdtree) of stars that are within the image rectangle; // Ngood of them. int* starinds = NULL; int Nindex; int Ngood; indx = pl_get(indexes, i); qidx = pl_get(qidxes, i); corrs = bl_new(256, sizeof(corr_t)); logmsg("Index jitter: %g arcsec (%g pixels)\n", indx->index_jitter, indx->index_jitter / wcsscale); pixr2 = square(indx->index_jitter / wcsscale) + square(pixeljitter); logmsg("Total jitter: %g pixels\n", sqrt(pixr2)); // Read field xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldxy = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // Find index stars. startree_search_for(indx->starkd, xyzcenter, fieldrad2*1.05, &xyzs, NULL, &starinds, &Nindex); if (!Nindex) { logmsg("No index stars found.\n"); exit(-1); } logmsg("Found %i index stars in range.\n", Nindex); starlist = il_new(16); corrstarlist = il_new(16); starxylist = dl_new(16); // Find which ones in range are inside the image rectangle. Ngood = 0; for (j=0; j<Nindex; j++) { int starnum = starinds[j]; double x, y; if (!sip_xyzarr2pixelxy(&sip, xyzs + j*3, &x, &y)) continue; if ((x < 0) || (y < 0) || (x >= W) || (y >= H)) continue; il_append(starlist, starnum); dl_append(starxylist, x); dl_append(starxylist, y); // compact this array... starinds[Ngood] = starnum; Ngood++; } logmsg("Found %i index stars inside the field.\n", il_size(starlist)); assert(Ngood == il_size(starlist)); assert(Ngood * 2 == dl_size(starxylist)); istars = malloc(Ngood * sizeof(indexstar_t)); // Now find correspondences between index objects and field objects. // Build a tree out of the field objects (in pixel space) // We make a copy of fieldxy because the copy gets permuted in this process. { double* fxycopy = malloc(Nfield * 2 * sizeof(double)); memcpy(fxycopy, fieldxy, Nfield * 2 * sizeof(double)); ftree = kdtree_build(NULL, fxycopy, Nfield, 2, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); } if (!ftree) { logmsg("Failed to build kdtree.\n"); exit(-1); } // Search for correspondences /* corr_i2f = intmap_new(sizeof(int), 4, 256, 0); corr_f2i = intmap_new(sizeof(int), 4, 256, 0); */ ncorr = 0; nindexcorr = 0; indstarswithcorrs = il_new(16); for (j=0; j<dl_size(starxylist)/2; j++) { double xy[2]; kdtree_qres_t* res; int nn; double nnd2; corr_t c; xy[0] = dl_get(starxylist, j*2+0); xy[1] = dl_get(starxylist, j*2+1); // kdtree check. /* int k; for (k=0; k<Nfield; k++) { double d2 = distsq(fieldxy + 2*k, xy, 2); if (d2 < pixr2) { logverb(" index star at (%.1f, %.1f) and field star at (%.1f, %.1f)\n", xy[0], xy[1], fieldxy[2*k+0], fieldxy[2*k+1]); } } */ nn = kdtree_nearest_neighbour(ftree, xy, &nnd2); logverb(" Index star at (%.1f, %.1f): nearest field star is %g pixels away.\n", xy[0], xy[1], sqrt(nnd2)); res = kdtree_rangesearch_options(ftree, xy, pixr2 * nsigma*nsigma, KD_OPTIONS_SMALL_RADIUS | KD_OPTIONS_COMPUTE_DISTS | KD_OPTIONS_SORT_DISTS); istars[j].star = il_get(starlist, j); istars[j].starx = dl_get(starxylist, 2*j+0); istars[j].stary = dl_get(starxylist, 2*j+1); istars[j].corrs = pl_new(16); istars[j].allquads = il_new(16); if (!res || !res->nres) continue; for (k=0; k<res->nres; k++) { corr_t* cc; memset(&c, 0, sizeof(c)); c.star = il_get(starlist, j); c.field = res->inds[k]; c.starx = dl_get(starxylist, 2*j+0); c.stary = dl_get(starxylist, 2*j+1); c.fieldx = fieldxy[2*res->inds[k]+0]; c.fieldy = fieldxy[2*res->inds[k]+1]; c.dist = sqrt(res->sdists[k]); // add to master list, recording ptr. cc = bl_append(corrs, &c); pl_append(istars[j].corrs, cc); } /* for (k=0; k<res->nres; k++) { intmap_append(corr_i2f, il_get(starlist, j), res->inds + k); } */ ncorr += res->nres; nindexcorr++; kdtree_free_query(res); il_append(indstarswithcorrs, j); il_append(corrstarlist, il_get(starlist, j)); } logmsg("Found %i index stars with corresponding field stars.\n", nindexcorr); logmsg("Found %i total index star correspondences\n", ncorr); { double* ixycopy = malloc(Ngood * 2 * sizeof(double)); dl_copy(starxylist, 0, Ngood * 2, ixycopy); itree = kdtree_build(NULL, ixycopy, Ngood, 2, Nleaf, KDTT_DOUBLE, KD_BUILD_SPLIT); } if (!itree) { logmsg("Failed to build index kdtree.\n"); exit(-1); } for (j=0; j<Nfield; j++) { double* fxy; int nn; kdtree_qres_t* res; double nnd2; fxy = fieldxy + 2*j; logverb("Field object %i: (%g, %g)\n", j, fxy[0], fxy[1]); nn = kdtree_nearest_neighbour(itree, fxy, &nnd2); logverb(" Nearest index star is %g pixels away.\n", sqrt(nnd2)); res = kdtree_rangesearch_options(itree, fxy, pixr2 * nsigma*nsigma, KD_OPTIONS_SMALL_RADIUS); if (!res || !res->nres) { logverb(" No index stars within %g pixels\n", sqrt(pixr2)*nsigma); continue; } logverb(" %i index stars within %g pixels\n", res->nres, sqrt(pixr2)*nsigma); /* for (k=0; k<res->nres; k++) { intmap_append(corr_f2i, j, il_access(starlist, res->inds[k])); } */ //intmap_append(corr_f2i, res->inds[k], il_access(starlist, j)); kdtree_free_query(res); } if (log_get_level() >= LOG_VERB) { // See what quads could be built from the index stars with correspondences. double* corrxy; int k, N = il_size(indstarswithcorrs); corrxy = malloc(N * 2 * sizeof(double)); for (j=0; j<N; j++) { int ind = il_get(indstarswithcorrs, j); corrxy[2*j+0] = dl_get(starxylist, ind*2+0); corrxy[2*j+1] = dl_get(starxylist, ind*2+1); } for (j=0; j<N; j++) { for (k=0; k<j; k++) { int m; double q2 = distsq(corrxy + j*2, corrxy + k*2, 2); double qc[2]; int nvalid; qc[0] = (corrxy[j*2+0] + corrxy[k*2+0]) / 2.0; qc[1] = (corrxy[j*2+1] + corrxy[k*2+1]) / 2.0; nvalid = 0; for (m=0; m<N; m++) { if (m == j || m == k) continue; if (distsq(qc, corrxy + m*2, 2) < q2/4.0) nvalid++; } logverb(" Quad diameter: %g pix (%g arcmin): %i stars in the circle.\n", sqrt(q2), sqrt(q2) * wcsscale / 60.0, nvalid); } } free(corrxy); } uniqquadlist = il_new(16); quadlist = il_new(16); // For each index star, find the quads of which it is part. for (j=0; j<il_size(starlist); j++) { int k; int starnum = il_get(starlist, j); if (qidxfile_get_quads(qidx, starnum, &quads, &nquads)) { logmsg("Failed to get quads for star %i.\n", starnum); exit(-1); } //logmsg("star %i is involved in %i quads.\n", starnum, nquads); for (k=0; k<nquads; k++) { il_insert_ascending(quadlist, quads[k]); il_insert_unique_ascending(uniqquadlist, quads[k]); il_append(istars[j].allquads, quads[k]); } } logmsg("Found %i quads partially contained in the field.\n", il_size(uniqquadlist)); dimquads = quadfile_dimquads(indx->quads); dimcodes = dimquad2dimcode(dimquads); // Find quads that are fully contained in the image. fullquadlist = il_new(16); for (j=0; j<il_size(uniqquadlist); j++) { int quad = il_get(uniqquadlist, j); int ind = il_index_of(quadlist, quad); if (log_get_level() >= LOG_VERB) { int k, nin=0, ncorr=0; unsigned int stars[dimquads]; for (k=0; k<dimquads; k++) { if (ind+k >= il_size(quadlist)) break; if (il_get(quadlist, ind+k) != quad) break; nin++; } quadfile_get_stars(indx->quads, quad, stars); for (k=0; k<dimquads; k++) if (il_contains(corrstarlist, stars[k])) ncorr++; debug("Quad %i has %i stars in the field (%i with correspondences).\n", quad, nin, ncorr); } if (ind + (dimquads-1) >= il_size(quadlist)) continue; if (il_get(quadlist, ind+(dimquads-1)) != quad) continue; il_append(fullquadlist, quad); } logmsg("Found %i quads fully contained in the field.\n", il_size(fullquadlist)); { double* sortdata = startree_get_data_column(indx->starkd, "r", starinds, Ngood); int k; int* sweeps = malloc(Ngood * sizeof(int)); int* perm = NULL; int* maxsweep = malloc(il_size(uniqquadlist) * sizeof(int)); unsigned int stars[DQMAX]; // DEBUG -- how does "sweep" correspond to column "r" ? // (answer: small sweep --> small r, pretty much.) for (k=0; k<Ngood; k++) { sweeps[k] = startree_get_sweep(indx->starkd, starinds[k]); } perm = permuted_sort(sweeps, sizeof(int), compare_ints_asc, NULL, Ngood); if (sortdata) { for (k=0; k<Ngood; k++) { logverb(" sweep %i, r mag %g\n", sweeps[perm[k]], sortdata[perm[k]]); } } /* for (k=0; k<Ngood; k++) { int star = starinds[perm[k]]; double sd = sortdata[perm[k]]; il* lst; lst = (il*)intmap_find(corr_i2f, star, FALSE); logmsg("Index star %i (%i), sweep %i, mag %g. %i correspondences\n", k, star, sweeps[perm[k]], sd, (lst ? il_size(lst) : 0)); if (lst) { for (j=0; j<il_size(lst); j++) { logmsg(" field star %i\n", il_get(lst, j)); } } } */ free(perm); for (j=0; j<il_size(uniqquadlist); j++) { int quad = il_get(uniqquadlist, j); int ms = 0; quadfile_get_stars(indx->quads, quad, stars); for (k=0; k<dimquads; k++) { int sweep = startree_get_sweep(indx->starkd, stars[k]); ms = MAX(ms, sweep); } maxsweep[j] = ms; } perm = permuted_sort(maxsweep, sizeof(int), compare_ints_asc, NULL, il_size(uniqquadlist)); logverb("\nQuads completely within the image:\n"); for (j=0; j<il_size(uniqquadlist); j++) { int quad = il_get(uniqquadlist, perm[j]); if (!il_contains(fullquadlist, quad)) continue; quadfile_get_stars(indx->quads, quad, stars); logverb("(full) quad %i: made from stars with sweeps:", quad); for (k=0; k<dimquads; k++) { int sweep = startree_get_sweep(indx->starkd, stars[k]); logverb(" %i", sweep); } logverb("\n"); } logverb("\nNearby quads, not completely within the image:\n"); for (j=0; j<il_size(uniqquadlist); j++) { int quad = il_get(uniqquadlist, perm[j]); if (il_contains(fullquadlist, quad)) continue; quadfile_get_stars(indx->quads, quad, stars); logverb("(near) quad %i: made from stars with sweeps:", quad); for (k=0; k<dimquads; k++) { int sweep = startree_get_sweep(indx->starkd, stars[k]); logverb(" %i", sweep); } logverb("\n"); } free(perm); free(maxsweep); free(sweeps); free(sortdata); } if (quadplotfn) { for (j=0; j<il_size(fullquadlist); j++) { char* fn; int SW, SH; int k; plot_args_t* pargs; plotxy_t* pxy; plotindex_t* pind; int quad; unsigned int stars[dimquads]; double quadxy[DQMAX * 2]; asprintf(&fn, quadplotfn, j); SW = (int)(quadplotscale * W); SH = (int)(quadplotscale * H); pargs = plotstuff_new(); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = fn; plotstuff_set_size(pargs, SW, SH); plotstuff_set_color(pargs, "black"); plotstuff_plot_layer(pargs, "fill"); pargs->lw = 2.0; pxy = plot_xy_get(pargs); pxy->scale = quadplotscale; plotstuff_set_color(pargs, "red"); plotstuff_set_markersize(pargs, 6); for (k=0; k<Nfield; k++) plot_xy_vals(pxy, fieldxy[2*k+0], fieldxy[2*k+1]); plotstuff_plot_layer(pargs, "xy"); plotstuff_set_color(pargs, "green"); //plotstuff_set_marker(pargs, "crosshair"); plotstuff_set_markersize(pargs, 4); for (k=0; k<dl_size(starxylist)/2; k++) plot_xy_vals(pxy, dl_get(starxylist, 2*k+0), dl_get(starxylist, 2*k+1)); plotstuff_plot_layer(pargs, "xy"); pind = plot_index_get(pargs); quad = il_get(fullquadlist, j); quadfile_get_stars(indx->quads, quad, stars); for (k=0; k<dimquads; k++) { int m = il_index_of(starlist, stars[k]); quadxy[k*2+0] = dl_get(starxylist, 2*m+0) * quadplotscale; quadxy[k*2+1] = dl_get(starxylist, 2*m+1) * quadplotscale; } plot_quad_xy(pargs->cairo, quadxy, dimquads); cairo_stroke(pargs->cairo); plotstuff_output(pargs); plotstuff_free(pargs); logmsg("Wrote %s\n", fn); free(fn); } } // Find the stars that are in quads. starsinquadslist = il_new(16); for (j=0; j<il_size(uniqquadlist); j++) { int k; unsigned int stars[dimquads]; int quad = il_get(uniqquadlist, j); quadfile_get_stars(indx->quads, quad, stars); for (k=0; k<dimquads; k++) il_insert_unique_ascending(starsinquadslist, stars[k]); } logmsg("Found %i index stars involved in quads (with at least one star contained in the image).\n", il_size(starsinquadslist)); // Find the stars that are in quads that are completely contained. starsinquadsfull = il_new(16); for (j=0; j<il_size(fullquadlist); j++) { int k; unsigned int stars[dimquads]; int quad = il_get(fullquadlist, j); quadfile_get_stars(indx->quads, quad, stars); for (k=0; k<dimquads; k++) il_insert_unique_ascending(starsinquadsfull, stars[k]); } logmsg("Found %i index stars involved in quads (with all stars contained in the image).\n", il_size(starsinquadsfull)); // For each index object involved in quads, search for a correspondence. corrstars = il_new(16); corrfield = il_new(16); for (j=0; j<il_size(starsinquadslist); j++) { int star; double sxyz[3]; double sxy[2]; kdtree_qres_t* fres; star = il_get(starsinquadslist, j); if (startree_get(indx->starkd, star, sxyz)) { logmsg("Failed to get position for star %i.\n", star); exit(-1); } if (!sip_xyzarr2pixelxy(&sip, sxyz, sxy, sxy+1)) { logmsg("SIP backward for star %i.\n", star); exit(-1); } fres = kdtree_rangesearch_options(ftree, sxy, pixr2 * nsigma*nsigma, KD_OPTIONS_SMALL_RADIUS | KD_OPTIONS_SORT_DISTS); if (!fres || !fres->nres) continue; if (fres->nres > 1) { logmsg("%i matches for star %i.\n", fres->nres, star); } il_append(corrstars, star); il_append(corrfield, fres->inds[0]); //kdtree_permute(ftree, fres->inds[0])); logverb(" star %i: dist %g to field star %i\n", star, sqrt(fres->sdists[0]), fres->inds[0]); /*{ double fx, fy; int fi; fi = il_get(corrfield, il_size(corrfield)-1); fx = fieldxy[2*fi + 0]; fy = fieldxy[2*fi + 1]; logmsg("star %g,%g\n", sxy[0], sxy[1]); logmsg("field %g,%g\n", fx, fy); }*/ } logmsg("Found %i correspondences for stars involved in quads (with at least one star in the field).\n", il_size(corrstars)); // Find quads built only from stars with correspondences. corrquads = il_new(16); corruniqquads = il_new(16); for (j=0; j<il_size(corrstars); j++) { int k; int starnum = il_get(corrstars, j); if (qidxfile_get_quads(qidx, starnum, &quads, &nquads)) { logmsg("Failed to get quads for star %i.\n", starnum); exit(-1); } for (k=0; k<nquads; k++) { il_insert_ascending(corrquads, quads[k]); il_insert_unique_ascending(corruniqquads, quads[k]); } } // Find quads that are fully contained in the image. logverb("Looking at quads built from stars with correspondences...\n"); corrfullquads = il_new(16); for (j=0; j<il_size(corruniqquads); j++) { int quad = il_get(corruniqquads, j); int ind = il_index_of(corrquads, quad); if (log_get_level() >= LOG_VERB) { int k, nin=0; for (k=0; k<dimquads; k++) { if (ind+k >= il_size(corrquads)) break; if (il_get(corrquads, ind+k) != quad) break; nin++; } debug(" Quad %i has %i stars with correspondences.\n", quad, nin); } if (ind + (dimquads-1) >= il_size(corrquads)) continue; if (il_get(corrquads, ind+(dimquads-1)) != quad) continue; il_append(corrfullquads, quad); } logmsg("Found %i quads built from stars with correspondencs, fully contained in the field.\n", il_size(corrfullquads)); foundquads = bl_new(16, sizeof(foundquad_t)); for (j=0; j<il_size(corrfullquads); j++) { unsigned int stars[dimquads]; int k; int ind; double realcode[dimcodes]; double fieldcode[dimcodes]; tan_t wcs; MatchObj mo; foundquad_t fq; double codedist; int quad = il_get(corrfullquads, j); memset(&mo, 0, sizeof(MatchObj)); quadfile_get_stars(indx->quads, quad, stars); codetree_get(indx->codekd, quad, realcode); for (k=0; k<dimquads; k++) { int find; // position of corresponding field star. ind = il_index_of(corrstars, stars[k]); assert(ind >= 0); find = il_get(corrfield, ind); mo.quadpix[k*2 + 0] = fieldxy[find*2 + 0]; mo.quadpix[k*2 + 1] = fieldxy[find*2 + 1]; // index star xyz. startree_get(indx->starkd, stars[k], mo.quadxyz + 3*k); mo.star[k] = stars[k]; mo.field[k] = find; } logmsg("\nquad #%i (quad id %i): stars", j, quad); for (k=0; k<dimquads; k++) logmsg(" %i", mo.field[k]); logmsg("\n"); codefile_compute_field_code(mo.quadpix, fieldcode, dimquads); //logmsg(" code (index): %.3f,%.3f,%.3f,%.3f\n", realcode[0], realcode[1], realcode[2], realcode[3]); //logmsg(" code (field): %.3f,%.3f,%.3f,%.3f\n", fieldcode[0], fieldcode[1], fieldcode[2], fieldcode[3]); quad_enforce_invariants(mo.star, realcode, dimquads, dimcodes); quad_enforce_invariants(mo.field, fieldcode, dimquads, dimcodes); codedist = sqrt(distsq(realcode, fieldcode, dimcodes)); logmsg(" code distance (normal parity): %g\n", codedist); quad_flip_parity(fieldcode, fieldcode, dimcodes); quad_enforce_invariants(mo.star, realcode, dimquads, dimcodes); quad_enforce_invariants(mo.field, fieldcode, dimquads, dimcodes); codedist = sqrt(distsq(realcode, fieldcode, dimcodes)); logmsg(" code distance (flip parity): %g\n", codedist); fit_tan_wcs(mo.quadxyz, mo.quadpix, dimquads, &wcs, NULL); wcs.imagew = W; wcs.imageh = H; { double pscale = tan_pixel_scale(&wcs); logmsg(" quad scale: %g arcsec/pix -> field size %g x %g arcmin\n", pscale, arcsec2arcmin(pscale * W), arcsec2arcmin(pscale * H)); } logverb("Distances between corresponding stars:\n"); for (k=0; k<il_size(corrstars); k++) { int star = il_get(corrstars, k); int field = il_get(corrfield, k); double* fxy; double xyz[2]; double sxy[2]; double d; anbool ok; startree_get(indx->starkd, star, xyz); ok = tan_xyzarr2pixelxy(&wcs, xyz, sxy, sxy+1); fxy = fieldxy + 2*field; d = sqrt(distsq(fxy, sxy, 2)); logverb(" correspondence: field star %i: distance %g pix\n", field, d); } logmsg(" running verify() with the found WCS:\n"); //log_set_level(LOG_ALL); log_set_level(log_get_level() + 1); { double llxyz[3]; verify_field_t* vf; double verpix2 = pixr2; tan_pixelxy2xyzarr(&wcs, W/2.0, H/2.0, mo.center); tan_pixelxy2xyzarr(&wcs, 0, 0, llxyz); mo.radius = sqrt(distsq(mo.center, llxyz, 3)); mo.radius_deg = dist2deg(mo.radius); mo.scale = tan_pixel_scale(&wcs); mo.dimquads = dimquads; memcpy(&mo.wcstan, &wcs, sizeof(tan_t)); mo.wcs_valid = TRUE; vf = verify_field_preprocess(xy); verify_hit(indx->starkd, indx->cutnside, &mo, NULL, vf, verpix2, DEFAULT_DISTRACTOR_RATIO, W, H, log(1e-100), log(1e9), HUGE_VAL, TRUE, FALSE); verify_field_free(vf); } log_set_level(loglvl); logmsg("Verify log-odds %g (odds %g)\n", mo.logodds, exp(mo.logodds)); memset(&fq, 0, sizeof(foundquad_t)); //memcpy(fq.stars, stars, dimquads); fq.codedist = codedist; fq.logodds = mo.logodds; fq.pscale = tan_pixel_scale(&wcs); fq.quadnum = quad; memcpy(&(fq.mo), &mo, sizeof(MatchObj)); bl_append(foundquads, &fq); } // Sort the found quads by star index... bl_sort(foundquads, sort_fq_by_stars); logmsg("\n\n\n"); logmsg("Sorted by star number (ie, the order they'll be found):\n\n"); int ngood = 0; double maxcodedist = 0.01; double minlogodds = log(1e9); logmsg("Assuming max code distance %g and min logodds %g\n", maxcodedist, minlogodds); for (j=0; j<bl_size(foundquads); j++) { int k; foundquad_t* fq = bl_access(foundquads, j); if (fq->codedist <= maxcodedist && fq->logodds >= minlogodds) { ngood++; logmsg("*** "); } logmsg("quad #%i: stars", fq->quadnum); for (k=0; k<fq->mo.dimquads; k++) { logmsg(" %i", fq->mo.field[k]); } logmsg("\n"); logmsg(" codedist %g\n", fq->codedist); logmsg(" logodds %g (odds %g)\n", fq->logodds, exp(fq->logodds)); } printf("\nTotal of %i quads that would solve the image.\n", ngood); if (objplotfn) { il* closeistars = il_new(256); int SW, SH; plot_args_t* pargs; sip_t scalesip; SW = (int)(quadplotscale * W); SH = (int)(quadplotscale * H); pargs = plotstuff_new(); pargs->outformat = PLOTSTUFF_FORMAT_PNG; plotstuff_set_size(pargs, SW, SH); sip_copy(&scalesip, &sip); tan_transform(&scalesip.wcstan, &scalesip.wcstan, 1, scalesip.wcstan.imagew, 1, scalesip.wcstan.imageh, quadplotscale); plotstuff_set_wcs_sip(pargs, &scalesip); for (j=0; j<Nfield; j++) { char* fn; int k,m; plotxy_t* pxy; plotindex_t* pind; int quad; unsigned int stars[dimquads]; //double quadxy[DQMAX * 2]; double* fxy; int nn; double nnd2; kdtree_qres_t* res; double x,y; int closestart; fxy = fieldxy + 2*j; logverb("Field object %i: (%g, %g)\n", j, fxy[0], fxy[1]); nn = kdtree_nearest_neighbour(itree, fxy, &nnd2); logverb(" Nearest index star is %g pixels away.\n", sqrt(nnd2)); res = kdtree_rangesearch_options(itree, fxy, pixr2 * nsigma*nsigma, KD_OPTIONS_SMALL_RADIUS); if (!res || !res->nres) { logverb(" No index stars within %g pixels\n", sqrt(pixr2)*nsigma); continue; } logverb(" %i index stars within %g pixels\n", res->nres, sqrt(pixr2)*nsigma); // NOTE, "closeistars" contains indices in "starlist" / "starxy" directly. closestart = il_size(closeistars); for (k=0; k<res->nres; k++) { il_append(closeistars, res->inds[k]); } asprintf(&fn, objplotfn, j); pargs->outfn = fn; plotstuff_set_color(pargs, "black"); plotstuff_plot_layer(pargs, "fill"); pargs->lw = 2.0; pxy = plot_xy_get(pargs); pxy->scale = quadplotscale; plotstuff_set_color(pargs, "green"); //plotstuff_set_marker(pargs, "crosshair"); plotstuff_set_markersize(pargs, 5); for (k=0; k<il_size(closeistars); k++) { int ind = il_get(closeistars, k); double x,y; assert(ind >= 0); x = dl_get(starxylist, 2*ind+0); y = dl_get(starxylist, 2*ind+1); plot_xy_vals(pxy, x, y); } plotstuff_plot_layer(pargs, "xy"); plot_xy_clear_list(pxy); plotstuff_set_color(pargs, "darkgreen"); plotstuff_set_markersize(pargs, 2); for (k=0; k<il_size(starlist); k++) { //int star = il_get(starlist, k); //if (il_contains(closeistars, star)) if (il_contains(closeistars, k)) continue; x = dl_get(starxylist, 2*k+0); y = dl_get(starxylist, 2*k+1); plot_xy_vals(pxy, x, y); } plotstuff_plot_layer(pargs, "xy"); plot_xy_clear_list(pxy); pind = plot_index_get(pargs); // All quads incident on index stars near field stars we've looked at (cumulative) for (k=0; k<il_size(uniqquadlist); k++) { int nclose = 0; anbool thistime = FALSE; quad = il_get(uniqquadlist, k); quadfile_get_stars(indx->quads, quad, stars); for (m=0; m<dimquads; m++) { int cind; int ind = il_index_of(starlist, stars[m]); if (ind == -1) continue; cind = il_index_of(closeistars, ind); if (cind < 0) continue; nclose++; if (cind >= closestart) thistime = TRUE; //logverb("quad %i: star %i, starlist ind %i, close ind %i (start %i)\n", quad, stars[m], ind, cind, closestart); } if (!nclose) continue; /* for (m=0; m<dimquads; m++) { int ind = il_index_of(starlist, stars[m]); assert(ind >= 0); quadxy[m*2+0] = dl_get(starxylist, 2*ind+0) * quadplotscale; quadxy[m*2+1] = dl_get(starxylist, 2*ind+1) * quadplotscale; } plot_quad_xy(pargs->cairo, quadxy, dimquads); */ if (thistime) logverb("Quad %i: made from %i stars we've seen so far.\n", quad, nclose); if (thistime) { //plotstuff_set_color(pargs, "green"); cairo_set_color(pargs->cairo, "green"); } else { //plotstuff_set_color(pargs, "darkgreen"); cairo_set_color(pargs->cairo, "darkgreen"); } plot_index_plotquad(pargs->cairo, pargs, pind, indx, quad, dimquads); } plotstuff_set_color(pargs, "red"); plotstuff_set_markersize(pargs, 6); for (k=0; k<=j; k++) plot_xy_vals(pxy, fieldxy[2*k+0], fieldxy[2*k+1]); plotstuff_plot_layer(pargs, "xy"); plot_xy_clear_list(pxy); plotstuff_set_markersize(pargs, 10); plot_xy_vals(pxy, fxy[0], fxy[1]); plotstuff_plot_layer(pargs, "xy"); plot_xy_clear_list(pxy); plotstuff_set_color(pargs, "darkred"); plotstuff_set_markersize(pargs, 3); for (k=j+1; k<Nfield; k++) plot_xy_vals(pxy, fieldxy[2*k+0], fieldxy[2*k+1]); plotstuff_plot_layer(pargs, "xy"); plot_xy_clear_list(pxy); plotstuff_output(pargs); logmsg("Wrote %s\n", fn); free(fn); kdtree_free_query(res); } plotstuff_free(pargs); free(itree->data.any); kdtree_free(itree); } il_free(fullquadlist); il_free(uniqquadlist); il_free(quadlist); il_free(starlist); il_free(corrstarlist); } if (xylist_close(xyls)) { logmsg("Failed to close XYLS file.\n"); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astrometry.net-0.67/blind/whynot.py�����������������������������������������������������������������000755 �000765 �000024 �00000013421 12651445460 017564� 0����������������������������������������������������������������������������������������������������ustar�00dstn����������������������������staff���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /usr/bin/env python # This file is part of the Astrometry.net suite. # Licensed under a 3-clause BSD style license - see LICENSE from astrometry.util.index import * from astrometry.util.sip import * from astrometry.util.starutil_numpy import * from astrometry.util.fits import * from astrometry.libkd.spherematch import match from numpy import * from optparse import OptionParser import sys def allcombinations(fronts, backs): #print 'fronts', fronts, 'backs', backs if len(fronts) == 0: return fronts if len(backs) == 0: return fronts newf = [] for f in fronts: for b in backs[0]: newf.append(f + [b]) if len(newf) == 0: return [] return allcombinations(newf, backs[1:]) #return allcombinations([f + [backs[0]] for f in fronts], # backs[1:]) def whynot(field, index, qidx, wcs): # find index stars in the field. (ra,dec) = wcs.get_radec_center() rad = arcsec2deg(wcs.get_pixel_scale() * hypot(wcs.get_width(), wcs.get_height())) (xyz, radec, starinds) = index_search_stars(index, ra, dec, rad) print 'xyz', xyz.shape print 'radec', radec.shape print 'starinds', starinds.shape istars = tabledata() istars.xyz = xyz istars.radec = radec istars.starind = starinds W,H = wcs.get_width(), wcs.get_height() pix = array([wcs.radec2pixelxy(r, d) for (r,d) in radec]) print 'pix', pix.shape # within image bounds I = (pix[:,0] > 0) * (pix[:,0] < W) * (pix[:,1] > 0) * (pix[:,1] < H) # find nearby pairs of stars... nsigma = 3 pixeljitter = 1 sigma = hypot(index.index_jitter / wcs.get_pixel_scale(), pixeljitter) rad = nsigma * sigma fieldxy = vstack((field.x, field.y)).T print 'field', fieldxy.shape (cinds, cdists) = match(pix, fieldxy, rad) print 'matches:', cinds.shape #print cdists.shape corrs = tabledata() corrs.dist = cdists[:,0] corrs.star = starinds[cinds[:,0]] corrs.field = cinds[:,1] allquads = [] # All quads built from stars in the field... for starind in starinds[I]: #print qidx, starind quads = qidxfile_get_quad_list(qidxfile_addr(qidx), starind) #print 'quads:', quads.shape allquads.append(quads) allquads = unique(hstack(allquads)) print '%i unique quads touch stars in the field' % len(allquads) ''' "quads" object: all quads that touch index stars in this field. .quad : (int) quad index .stars : (DQ x int) star indices .starsinfield: (DQ x bool) stars in field ''' quads = tabledata() quads.quad = allquads qstars = quadfile_get_stars_for_quads(quadfile_addr(index), quads.quad) print 'stars in quads:', qstars.shape #print qstars quads.stars = qstars quads.starsinfield = array([[s in starinds[I] for s in q] for q in qstars]) #print quads.starsinfield allin = quads.starsinfield.min(axis=1) #print quads.allin quads.allin = allin quadsin = quads[allin] print '%i quads use stars that are in the field' % (len(quadsin)) print 'stars:', starinds c_s2f = {} for c in corrs: #i in range(len(corrs)): #print 'corr', c if not c.star in c_s2f: c_s2f[c.star] = [] c_s2f[c.star].append(c.field) #c_s2f[corrs.star[i]] #print c_s2f # [[[213], [35], [265], [63]], [[186]], [[]], [[11], [19]], ...] # For each quad, for each star in the quad, the list of field stars corresponding. fq = [] for q in quadsin.stars: fq1 = [] for s in q: if s in c_s2f: fq1.append(c_s2f[s]) else: fq1.append([]) fq.append(fq1) #print fq # For each quad, the list of sets of field stars corresponding. # [[[213, 35, 265, 63]], [], [], fq2 = [] for q in fq: #print 'q:', q #ac = allcombinations([q[0]], q[1:]) #ac = allcombinations([[]], q) #print '--> ac:', ac fq2.append(allcombinations([[]], q)) #print fq2 quadsin.fq2 = fq2 hasf = array([len(x) > 0 for x in quadsin.fq2]) #print 'hasf:', hasf okquads = quadsin[hasf] #forder = argsort([max(x) for x in okquads.fq2]) #okquads = okquads[forder] print 'ok quads:', len(okquads) print 'quad nums:', okquads.quad print 'stars:', okquads.stars print 'field stars:', okquads.fq2 #qmatches = table_data() #fqs = [] #qs = [] #for okq,fq in zip(okquads, okquads.fq2): # fqs = fqs + fq # qs.append(okq) #qmatches.fieldquad = fqs qmatches = [] for okq,fqs in zip(okquads, okquads.fq2): for fq in fqs: #print 'field stars', fq #print 'quad:', okq.quad qmatches.append((fq, okq)) forder = argsort([max(fq) for fq,okq in qmatches]) #print 'forder', forder print print 'Quads in the order they will be found' for i in forder: fq,okq = qmatches[i] print print 'object', max(fq) print 'field stars', fq print 'quad:', okq.quad # Index stars, by sweep (or "r" mag)... # --which quads are they part of #skdt = starkd_addr(index) istars.sweep = array([startree_get_sweep(index.starkd, si) for si in istars.starind]) mystars = istars[I] order = argsort(mystars.sweep) print print print 'Index stars:', for ms in mystars[order]: print print 'Star', ms.starind, 'sweep', ms.sweep, 'radec', ms.radec print 'Field star(s) nearby:', len(c_s2f.get(ms.starind, [])) for c in corrs[corrs.star == ms.starind]: print ' field star', c.field, 'dist', c.dist, 'pixels' myquads = quads[array([(ms.starind in q.stars) for q in quads])] print 'In %i quads' % len(myquads) for q in myquads: print ' quad %i: %i stars in the field' % (q.quad, sum(q.starsinfield)) if q.allin: print ' stars:', q.stars print ' correspondences for stars:', [c_s2f.get(s, None) for s in q.stars] if __name__ == '__main__': parser = OptionParser(usage='%prog <field> <index> <qidx> <wcs>') opt, args = parser.parse_args() if len(args) != 4: parser.print_help() sys.exit(-1) fieldfn = args[0] indexfn = args[1] qidxfn = args[2] wcsfn = args[3] log_init(3) field = fits_table(fieldfn) index = index_load(indexfn, 0, None) qidx = qidxfile_open(qidxfn) wcs = Sip(filename=wcsfn) whynot(field, index, qidx, wcs) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

,5? x'2-ˀpURAc]6t.B[H$^s6Ght2HqƧnf_JdQKqv7 PT oN}釂= C^7+޳'rIn$Ǝ玸sS-ϪkQ]7 i zzφf5uxht?fsБ  ӥkۍ%tqOs:w}º5Y n#]F?(N+<5[d94=RO`;A/8"(斚G4Q3JN!9K~Ӊ,82cLn )9# :i W6R32|yE 6W6q}hϗ$`e<pxzxڃ3WJǹR{סjZ<ڕVXH9`i_.gH 2Ye]S7Ro먮&&ʷ\%j@yU9\`? vES{ u7&y=3MbhRdR\qGCJha/&MGҁ֓&( (\P-8SI4szR LPi&N=*ejvp9Y"i4w/hNzFO&xg4iAҕq 7Jh֠$%$UQI^a~~x-ԯyB{V-Oŷ"KK8K{H%I>K)H3{7ÍK\GUU CaT]?S۩#<3K _^c8tcOQݱ]%ߌ:NM&CBLqd @5|^JW]3RI*1˕R]>|G+оX˧|/$b㧳v&y+⇀~ XKBddrf~ د%ᅺ>!FU(YquLb_zL ^^0x顄r:U9)g@z]eǭRqM8wH .@:a@?Zˀ5euYv(HǢO㧊SI`CѡLv'ag~R>0Ѿ 581e950M\A" U=6zRH,Gjv)qF)q4P4fҼgn|CeokՕC+cN=uog6ojGgUe`:Br?NGhCEƫ",bU""8e1JA'Tzz-sVE)k AESM:0{[4IE7O48⫖a'")9.q!|Yþ3D:kKNTznGȮ6βI{LyH@"+4] K~c 1ՏNM^4SA֝ސixgk폇t;_Q˵{ = s_;6q&vt"+<61j{τ|!nu-^7M^+KIcW9z?I5MZ v(0b :zaPkSQX+ %\aV:8hEܒD#^ z6ee 9Qcǎ&Ѽ!#qG/9sZQ־xEށ#ypPf oҴ[-:Cm,qƀTi/6:ky7PJO>SP4kvٵdV?ʾO#Xi`0tV?|?֭5pF 87+?p}ԍfАcdQ?tk-.(qKڐS)%'CARv௡S^6keH_- TK-"Mmp$R!ᔎJ姅~ʪZ= jw>c, /dRqzDyP7*qGk{ <ɽtAKdCc\O4c/7 8<1=rs9K:hpHW qk $gˌ=Gyo]B5N ^pfr@Oྕ <Ӳ1MWBM/[1xQ( +Vؽv> 1ןJ ~66:̹xeRXC)wכ|en|7{{xBO$ !H8,q'8=gݍ fRh\+!?5.yڔ S@E")RQEc&iwQMA QNQ2E'S;hAEHTALW^|3α>:UMo?ccn{O pwkSͻ Umr-R:-S$r( szp>5+][Ll-bYbluR2>l3-&3Me4C|4YJ1(g,d^op}CrI&2NiMiQd>%|.W̶ZfDcz=k-;ö- \"ɐQV z5Eq!2y)8v8u1RGJ `=8`PhZE%Ѓ4M5vi6/J:q R:isN$ˁH~/z(M9y֎4[&sMbIE8RwZ(h\)6^o߅m/, KX@I`?(ryў[Sҵ(.RD'?Ŕָ]ٮZ- G +Gn7VrykH{R;Nhy&AaH>^Ԍ7s@A)A<4I M$b?3y4bP4-0PppG_%xmF 'QDt{ȵuvh$U_2~1wAps3>7kk6ָreѶWfxK2Ҿ\SLVQPsOߒ8 , 얬!Lyd*[ ׻hM4.;{XT*'<-x^>nA{[@uإǮQY[mr⅛?V%`-;QRg4c֏rEDGҴy@*u$k>=N#,"g6-|ryV̺_F]OK8 n"9 Oǥ3ឯo|"PYZ29g/'oD݌pi"\Bu ǞЎy#~κ.k'n,=]ǀ RmSS)]6GT>WEAS{Ӳ1^17ڦe=5->q 6{9pE9[OQU$f)[*RSX4׾<,^k2\J"F `t9kԾzw+r8:RŪ!#m9ܻrGm~iCq5y#$S1 2ǿj_Ѧmn%krn "rIl'#Ѿx6 K{M<ϰ>yK)2)wցN4LRsp5w4EJt|.:0DwI>|U\Hʈ.A1p35-xTC uS0\u*e׾ize[,6{ϩk~: g$w}>.2~9'S|]+8N:l~D7lS`; +l&/$Y4/x$mM(l\gnN=ThWpZ@Rxy>$x.['ÎWc뤇ˑHhQ؎Ey74r *<5K¹1/q J4r'JmY6ȥҒ .8994EU0Gηzωj1|?6;z~4 .h牡??j2?}3& X`JwҖI KPOzxS֝ܣȞGۑG!W8&ZEqg$r*D )Gnk+M'5=KdsϮ=jm6k0K2e̷ v;3؎دN B)9d,x;qN`Ƞ8(QP1֑hӺ oZP@HA<җW'1bTlIR;S9&]c)ԹRoTg4sA@8&E.iK)Î.)8)2;R18 3 >!O~sZH/v >yd_' / %, ԼTY 8fD#ۊ]oI|#i֒ u`3wy{.Z5/ v7ҽmF}!Ip4`!84IIo i$BO\(E4rqJF(X"i9ʬd_=~Ѳ 匌"HVc f׉ty*OV2sfKgDac{j1NHF=/J[uW$kC$$x9}zSS 84Qȥ `48ᵯ .eH4Y>A۟|U|2曣.3븐bxKYa]=Σ@.wr3KGzM4ɧJ)1($r"0* Pnl%Hb9 '#~ RD\J_Έr#WG4W$HE"GFʰ<qQKm"$/O'uvçiEoJvU_ŚCq7C)Wo4.d*'՘sW5 ? :(#fDdd`jD%lyTKInW5~*ivl{yC0RZ83}hЬ<% c-~)M&)S x#Lވ4G|rFc|M힠x_ )xU潾̳mX/% PNkR޴@mq<>Q{0moFCHaU@vT42sF 4R1TL Ҏ)sAIӭ&3A)4sG4#"R bu!ԄPBhS JPc♰X(YZw;D*A\h,QL%OSTjd1YSYr|{yK1*HL4mRgga2}vX>Y[6J[;#GbrkЭX(T|]rz此*:՘ivֺw[JdEܬ> gLDȾ$̚? hyxj -R]s+wSc *n)HF ⎴}ꎧj3XZ6aZZ֞KPz8kW|1]%$pa`$j5qN\sJ /Z0=) nM&I0Q3pI 7 Nv'=8.=s֔⓵hrM;'8>lyוm5|;oFemeVA rErע]p_֟?h]>,E7q .baߟ|uiIDWV 29S&i"xGY#E,hP$ڸό~00,}*]>[*p6rG+_#p0:UCt-Z.HU i\xn0~ێOjvsRiiJ:сJ+ Ğ0Y5NO3ZE+;wZ[iO㷁w0^[Gqm4sC"I#` 23F3ޑ}(=+v]x_-,u"Ԙc1-_úՀ+0% ^ĶEn|3}1MYZowD7*1*7W#4pÏZjG'Ҟςh98qך(55O4(}w,gCǠߟ³/sab$C}Gy݆PmlgP9Zzw q4v.%B{G?ƭg1$4Ubv ܟ F})7ڏjqHZv)(MMI߭.kh~ '湍>*}2XGwk?GX[[;?}ry_~h([kD[C9qs{׉'|/isdag?v' @Uk 6P)hE&18R7JLc4fLW|_'xmtҧXϔ̠PurSS,~#:5Ġ\/+8ߖ]p=1/Ŀ n`F{m"evt9OLWxw⇇ ZkwfrCq2YT 9a#مh?:a>YF`?tAq\QRg7 1:YTglֽvMY$ "\71?6^)^EiЛFEdcǸ:5kWq]3{hٻ7D(4R5_ƿo|,YE k76Z %yo GqU:Mq-}[?f`f ab2a9<1<5k )9=r+ľ!x3#2ApW\,Dk8\PYMˏyW8,㑒Jx[mxwe KN7Hʐy+ӐkPYH*FA8FOғ`H4RQ@Y,S@tF8 ^I/]%H8#pcA_kV&f_x/FS>ZFeǀ 2077댏q_E`f1Mnh8'ylj>6;O68$:بtS?k9R7f|:RHŒ|NJw 8vz?>)v=3@F2M ,+_TO|b]MIY$=7zg<dzgUxФ;rRQERQ2X!Hf$E(!Gq^wz5d!gxIGlqԚ_|A$Qxj>u,꧌"Ҽ.,^Yd {WCFi;юiJH;4֗()Z:1^ FW1ˠH,URӦF.·x aۜG"ߌx^FiY =|/k9KnǤ"iI(_Q0gNX/$oKc޺o-SS^'yT74>o|9p>|{R-w\)̏ѱ<q5KφoF;mlDr#83cin'yyeřII?g^X &'.4BTaJG9k SBPMs>iFO-zܠ}H} x q mB/I#Џ|zee+L$8{]_S_Vty<[ AdgpE}$~cT{S(8Nt^(C)pxRE4Ӹ33c )h#Hᄇ>ONԢ)M4dqNiy'")+m* ̑O3KiGlgz:4вq3z\ߋR -֤x/ -ǭXs<ӭ7"XZҼ?+QovQ&o.B$3q8# uĚάZLRܖK3$gjo I|5e%5JA`jZ޻X|Ÿ=sI=MSPB4ޝkP"p$v?zbBnq* y[~ V;?: fGeUQI}S 6-&\+R}2GP_.$yՊ=B9z= zaȦȊ2/U؏S\d C6~s㗇uK'Ҥ~J,0GԀ=9cYр*rA$ fɧcԄ Fb4΅#CӠB/ҤSĮY^]+:REkޘ'ㆯxL>ʫ7+ 0ߎ{ ׵i iij?<xk7C>(Khn4 !;F cle⛏Oԯu8푃fRQ)6R.F8f1H6sKbKjo$  P2iO4!N#+M i0kľ2|!jZVI'9#ߠ]OԯJ^ҼI ݳg>*}=<=g+|ir~F =ym^ Դ Խէ"[c*K60 8<^)mZB %Ҷ6ƺo|#3e-:Ctȿ+Ǯ ^ף|$'H!3O+eArPsHN,Gx ։C񝭩kxǠ3D嶱C^qKͨppuq)NbG5x_uojzfe}}$E3eX޻_$GxbMBw H =?zfpqҊh=N."칺VY6ܘc^? >$`x>Z1m.]*Y/&!B7ɵ@Z>KeAIP)h^Pz<?ygU?|Dwkߚ@X=ƿih4mpJ7|벽spyX7Vh~N9om)TCqMq_l>kûzDc]E5){_|/|1k+A+]3Y\dv 瞤灎߅)KҊ('IqAqHڝIu 8Ih*1hɧgn{R)8OQPAE" ڼ[ƟTmš|zK5ġ6|j*_L;GCyxYc 4t5~xOk%{{}hɞ3N@YcE$RpW y6w ֌̭:ppG&xÞ-G: ӧ/ Hԣ+{J14Zvx9nt4SVl `9=(ZrMbJ2)\9xu*g;#{c?YZ` FOZEi"lt<ZcoۃFR6$gsUt2,}y6UҜ4ǡ RMGE8aHI=qK9!Mxh8>&@5^2ha!G#К,?i q&ΣŞ0V-!=I4mC*&pA tǥh&s ܉944ZhZn42)_ MG:7#7Pı:l@qw\%֙X6q ǩGUP?tE;#|_Qf[7 v힕 }3j j/X<=*4:1'`6<߭[m*xF,mZ{ѳFFOҹ=kS$2) x'\dž&P!wsw9"+ >)Xbfp?ʽ FW-D1Ss0?ÂOO Vᰃc'v='޵|%͡;i&K,?$~w֟dlO8C3Į7'A\iPf1'.9{םf>AW[0Hez>Tޕs1D[\V Jar?'.RisN#hnqJH+ h6nohC kz1݀{rx8c7|z ypk (O$H -8y5㏂x?NxOT?`lMtRQY|m仼P/d58A WO Z?eș݁!Soc)8QtSx  V/ę/RgQq|fca*; >4 ww,6v(y?^)zѶkxsL6m081y0x+kkq=WI"pS PiM-&JRRV8{Uk>'Ϣ$hO_ߋOx7R7/*{$~xO7#$3^9mk{g%oviO~r| oFzv Ezg/2ELPuHHt=S' G|&/^lLZF [AIN [דyVۻnqqO۞ 4 .n1tνUHr9ukmCÚEB[}蒮=+ ~[obC;pA1h`F=ӿg9Qo.]1F,gn[?1> ꚟ~"j>dWMtYǹܾ{ЙI@6D{n )< ^IS㶹jcy"Xi\\* o^3/Oxh%mǧ"~$|Yr- 20;S O@4EA桖V^2вJ 2=xZ_ث9aj}ZϛMBt\l[O$ >xkT$""^<8 Wiъ/㝔֟u%9[?| z^xEޟ e0B#X=UqoifsOn?A-g7f/ZQMa5 HZ\Rf^c%;RmjZ^r)HPִ]wFүM=Q+&^vq(;O7}:C]Q[j|e7 >Usᶣ7*:8էE+nt8`Ny<{){P }i 6Rfbm v4QF)ҁCGkPxSҚ ;4Mɣ4f! a4S.E7J:S{ӈj6fщOD,7¥s@u#5Q%>w%L #v >xr¯I!WB1ħn[v}p=+5 8Е sx}-lX^H!˙1G\˯j*ŷ4 laIwUH8R:|i㢣 ':Ş'џ-nO)A^ otob11mq[iOA Rc4 dSsHxӇCH5x)sڢI5<s^ŌL@ ߀G1޼AŇ#{u2a1)uvֲCu"Y6y'ӏH-{GTcxuaakg 8|׮l7}sS4ҎqҕN:&QCǭ4nj)`YS XX I޼㯊<;,XWƹO ?kv{s21Ɗ~#q%Is߅>-M tQTDl𬤐#:]im- I 0=C(&zRMAQh)'&c02i3Ҿ]WJ3xA7ovluox5Ჲ4Ѧ$uw1,OOO}lM>̤Nӯ[Nm51 6;v-ԫe-#ʒDJ V;/5kSp;x # 8f,8$ A킗U}|3~+د_(". q"J$RXTzEq"^ἷ v><0FdED5jN⅚4&l^k4GU_w~fL sUZ,i+Oq?v:nf^ʡ9w>g_;]oLBE$_Y{ĺw5 )ceu#tmUb+~7xNԠ4s}HV.GSqo~:t.ʲnH0w}ڕT*P@R;G4g4ӊ@3_<|{Ca zҙ,D }R?^{~5Ѽ2(tulRsK]?ϳGg)pR6I{ٲa%@"NO,Ž2׹v'8\G#еoh6:|VU spr? v(ROJ14R)֢cϵ(9N9?=p3@nԧ>Փm>M_šėvSBz?S^ |?, /cF;LXtG޾|BIZ^-áZsj[J蛶ec=ּ͞7}sq,-#jq?_4Htc6 ԃ)Eڐ ]xp@ mDk"!7;sy z޺m/7/\'O ,H< _@xCWD},Vb?VJE9 qPxNt)Lf8h8ot ٖIdnd_~)9g[U'^}8>|/uI9\ j/?ǎfcY]d,ޠ 9"1L48*ґqG֫r^OCtUG&W<5erڂǝ7/ vxwbJ [|ޛ 5\li, F[(<њMG=KA4҃J8fy9ANHnߛ=iqtHA'qH:ӏip1M>SHf sMcP84ԥ4JFE/AMJ+u9ZYZxNך@~`PF8y1^6#{6Hy߇.R}#TdmFa[A>DOh.n#խKaXu88K⿲Zu9SdK 1{RA{Z&bWl`ٛg~KK7vW'/8#dWczZZK_ZG lyFsנ 7֌ҕMRǭ4J.or)z frx@_zW5+gmOIYۃ*Lƙ7th:,e>8?J, 0)bjP2;rˌ.wWGSaHFGPNiڛOּ;m'BwwpP|Ey9vڒw'c<רj3dږZF7*'pG,~{N}yQkdd0U$_Qn(>ԙ#7<&Ӓiiy.؞(*OD6tu `5j Y>ݾ傖n튿?Zߋt;,R7] !@|%@Z>Z`uh> Ҽ/ Q.%9vqj(ɌsXWfޕkfF0L2ă #f{Gk=iG¼brX]-( 1ZƃGyϊIq%9"k= 1y٦1&sնDBо BT[uG-$|ǦzwY_虅c4DsYѾ^}_[ԭhX{n`1*(42O"Aqp֤WkNJHRfh4 R+KOudda-vC¼fW#"]B!/l1*A؞=%_Ga{c&Đ5g k޼kfGXe# 49ڶ9gqNw҅M3+kD, Ă&c7@|t=ȯFOetaȱKumq2IH2G/q5n|~r@2zkRF@p-ZNh)R(*i<׎|A&α'|-z: uތϹ" m6R3a3Eiy?/Ke`u_Pq`dEax¶^2֍{F&)qA#|qD_Eك-gG Rk?緂Aꋻx$*}I _D|,u'I]^솹9 HOӻS{5$%/ ȲE"tawZ=@֟WIX )blgI^/eOuFK~";T˂i|tvQOS]=h Hzfd^;q;a <Ҟ豇5;;$ongXFj 77kzuϗor^1(#m(?:6Btip$wr':lZ^]<ۻCHܭq~k|U{I(Z卼~ZJ2pI3]^MdleW=LaT~+Q^ޔ(4zR<Hԃ1E8* ґi*$\Dtd>8R+,;UHЎ*crKkv$A #>?/b4 IuyCq:.Xנ=/Ѧj_d#RN;'{Vs|H NjZ=?g#u&Q~wsmk.j7ɘo܀;͖6z??^MW  ҫ"ڡskHG.T `KڌR0M2(` 某H {SM%&M)n))JdT-6܊xOdT¥Eٰ߅5nxF4&>.q-(Mǥ7Ҏ;ц' c-Hb-nPчQ_8x>vDxu[NG @}J|~tTK}*?MԖK,2DQujle7+>?*m5kocppr>MT$Y#u   9\wD6MJOqHĊh<ҕC'港 ,q -nLguTk+Kylc8EcMwyxgCPĸֽH4=*MeGsO9'Ȩ\)PXsXڝ5qZKy7w&Q9\g]|Is,6@P3t 5nP*KYH*h: |㟭71EV)KEg45 'L⏽fE S MUc3PI!Ի{4ga^G{}n0 c~+q_s< 1pE!%ve bU p*>xSMRd9eH7c5[ok pA8**\Rh?{K S1%-U$I8x~jm^,4?-¯1cO:ܗ,s:WYOߊ'W42H`Nk8SRR0' )z+601MxيQN F=ǽ-Q׊B4v8Pz氼_ؼYMCDC &3  |@վg],'߈h`:1kh[ع,/~A:,Qh=VW n1eS +8H3Bs9h.-PyST0X5U{kXWveۻ?R=iW6^$E/c"]{^ 4R(Jy&3Ig&ɨ_n+珈 .#eo)}BB?qz:KO d{jƉe(5z_~xKaʤ1Gq_JX_Eַ5)4DVPGj)v;R:\ғ5FyE.iZ7qIiH R ] Dr֐rhO4QARNW?zw=K6{n{y Jp5׾[Lm>;`OPNFyO>*fmo/y|-S5G'ԓ_>v\;݆\!A@ ^ߴK|+7f?JOZмs""T;`fi@PeѯaRo$$ xGC d|ȌX}|װ3>KÕ3zҼ[w=2A{,dce(GF,#8g(~Zi3fTb;u46h'4gڐ :S zOzU=)A)v4 aM<Ӈ')s@=*¬ƤF2rjJN8RI֜:b :1>ך2摱5z0ExwK8+e#DQ S˦HT^/-$(ė0y8ˑ8'#}#)g\%8ؗqOG^ZpCEW>jfIm=ˣ@J\]P>wYɧCw %e+TS$rN=Ƥ/q+s,cI>i|0Ώ5Ī۟q?*VaN]@aNp*tFHA'R"g}j@ ONiG4杊1J)JEqJ)>P#t8+ώ|RAc>P?vFh!U3ߎ]o^8ZfmQn"v*{{J5.z-nU⾅3q6@2:k 1փMj@p9=)Xu/> k{Y$#s++g!\Z7tOF궗0\A(fL:Ƶy4`c׊1ѥS=XA4*lJNF^qZNlG̔$:{Wh/Ih6VB4T{>P6@qNIR3ϭL~(ьhcH) )Zi8ԜZSB(h:Fëiѡ%JI3k gxoOVx¤t#vqWQ(h)1qSsOc)&G7zN \Taє#r W<]^BEo!m&;{ҭ/ipZ+y]_f }+m-m!!qƃ  !F(3J)visHƍؤݚR)6Ѵ4o_;0x?h[_05QW\$T.}=+hxZ;Igب=2?O,|}et,G<=BlEb#>]EtMΓ+MOa ,G;p[ZQ["XQ@~6xNkO|6Oi! LeeFr:|澄SRun#Pqՠh$2R2|ĭ kYo4;ϕXx $AR݈&lo\6d:իZ%70Sz+f!sJA$ԴRQEfZ6MCW> z@,x2kɯh Z-@H}u^-Ra|,p^iF}'ҽ (8H)OG&rb𧏛!4ݼSRnhN=(3M=4+ Ni` +d@#L/J ,XscBzT~@ʓvhzR+Y5O̷ v~=9/ٳMREqf1@n)7w?=&Ҍ B:}췶2O+onE|JB4rN}y;kڕ֮dRX"y6&͸DôJ0lײ4 ^(꼀^'x_WaIKN^1 UY~/8+Xy=6acWaLkYF* }3X_`i.5S#8,p>k١TT*dUK-YEI3HA#AԟZ@E Z^1&EHyLϮiF>3Cs/Z:P:攵|@xK|YeMAz188>yÿw;3ۻ!q^p+kiee >WVa#_6=4~x.3ɦ%:$Alk)h3J )1Pq4N4:R$&5⿈^iXAV嶅|H*:sk|qqKj[5ZncG}uk nUI*S@SK#'uw[)÷xi!#,Aon%g@yW~$džf]K1,dr2wo+ގGzNGZ:Fxό;4= n54_O'̖69uu3!c`q+xeho-e,~ǢBm:dKi$ -cppWp澥>ּYE%[Čb+ݞƏ\<+g n@2b}O;ׂOC$tZi4%^{~qV\2c\G"ZM䴵TmnH^W8Qǧ=+=Z ;G6vC]L*12~lw\R({H P3׭/֚̀qMF8zJBH▊SқMq)89nj.uMBDjO$}૩(M<?u*,dae9S(9PM A8.sւr0)A4M&^)n0QҐG F)NhqHy7zύ)UsiQ҂EN|U澒XQ*(@zSSry<4=qJ┌ L80ti:1KIF)O#H)A44S8=)"~Zj i|V/m/YVnYY=sP[\%սR:YQ#)G5kO6 @C,69=>oc_BiV Z|m$!T/x/5^S{=BgMu?M~xonySݷ;[;hR(P"p*RԠҜzv'j0a#K9. n{/O{6 [*Ֆ1 I+ɮ}7{K] jrk!x{EF>(iȟhfڬLss C?<mHsˣ']^huYa`گ*LsP0)0M4sLh-1c(x>tcrE-&w*{|ݭ|,h{ ,L%=BZ W5< ?z/5# eYg pry.cJ![&AOrI$SW֓mF9tҧ=i5|EWs%F~P4j@)3H3 G|b-Lk> w_'VMe_, ^$nsfi-tdw)Qs+M6;;hH@ G^h4ӜsF=83A9xA4&)A=>+X0?= tg"+WȾ M-OrU".Wϓ3ѐt=>|-nvpW =zpOט|>RmO?az3vnBܑ}ބyh# j|}ƽA. W(}9ؗSe tA=QOcd㏭f|z`~9'F}E.hh^gNsNQKԘRS0O4nZP@▌Ҋ 'Z0:OzvsMZ;7o&zP*A73EgʸmsҾBy|KkS-U܈mbuڣr}ILv ;}`mݟ?r>rh:IC7wjz? w{=ʧ>t跡w?zA݉E=ߥ+tz8qHS"җ4 `9~⛺4R)4)qftu%Eq5uyu=3^V߳MЗj#v6DD'M -3Ja`#"r#I89isz1iZP8;ocH^NfiGJk1k\hcxoPNRHo|1cjMkx5MmpX2ݜd/MB>P`Lq d^} z=.Hc[ݫ$1FT;(wQҗ3QK:»¥NhdtB ,|随?_2Zi0II8'Wx-)oxW6R1FP(&m?=WӉތsJxRM$:Ҝ')9j~r04KiSO44!皆Xcu*!_9 \kK.VḦ́vJH7.>3xT?QGC:Є~_u[MaSo2C ört؊|~nhԞ)#a_x YXXr O*ν'[+ $ru{ZƑ%>o=_ZԯYm?tuJu5i^ȸIiߜ1Il=&KXm-ƋzRzܒjǠnӀR$RISMb)y=9@Q\RAҞ)/H)s@lb@5]N!xZ{!67?2{F윟|*DQC+)?~IZJ\"]͸3bx:o}MB*F+=Oڼ2_fǽAq;V|1@a`8Ȑ1U{ۼRFJ AgcOE{%(ibz#'ֹ8<[?W0?_ fXּJ;I= py9R%5,qc*EC\(F2"Gf*EJ.(vQO&)sAH-qBnrE;w R584(jrEdF3_.Dyf+Ծ|4L1YvG;v\{@vI^Wm}\CCBdsO5GCs+fUa69G;='OB%mz׊'[؁f( ȶvz_Cm }i*3<~iB܎4jhg4լa~ʹ>74<}^I?[Ӿ xMIƎndFܿj_\#؃]ꯓj`(=)A$dCB.nyRb9su2M4)” BhAwjdF?zSLj5Q<4j <08_z-]sm%w++ܼ; 7Lddda AQҁ@O W6 RDqe#_3O/c[.Yw 23 nͻb;k[<p~LU5P$IY<+-g8OV8#6(_fY +Fivg?:Gt<1۬6#5a='=Ikl`[X0E8B) l nsN mLR)m+xI+Q'ɷ񯅮ĚD1¢^Ka 4F(!4>41dR(!$vui ;Q!` !˜XNҸ/|aw|VI\g4^ nct|*_EB!EюswzS) P9$g1GKҚFNihRM4(9(&*Zn-nh^uA)%P:1#֍ q-U{ms-GD&V&){w?lx3ʁGAlѦ2 T:Q;SSO4֞uSq)R)JJ: \RRI\G4hŧB;O;VÚF:&ӀQꢻoh6^ >ik %IH8dz+NN~uj%TTe8r yquĞ٣ 0 ڲ#b=Gh: 7c.hM'&`p3NF3.8 <5|[K~"e4cv$~:ďxJF5r5ݷ{ְdh߂9@2NjE4)y~>9R1ޓ#iIP=M4jm.((AHM o):Rv'iTm`QIڗ>sҔHx{Ru4buҚLb]Ҁ6NBqMiMuǽ0ByRw?8tSҐPiNzSuIJ:ө1m)!EG' ӹw}*31{cBKOjQ|sB*0137aSúޕ< i!h|")ScS|Yuhm3af?7>G͎½i):QE(8; 8}i䀢P֊ 7uCIM ;W=p1RҊ^(Q=<-4S4!"h4@(j]أu-!)H⛊P(& .x߆nYͥJH{Uo|=bM+};Rb8% 9 d23V&W:UĖeQ'*HP\s_LJo!TEd Cl58@Se'57R PA+ ծYJYʢ<++c0*~ x?7x_ܧ)%PϾ21^@Mni3Fi4"[!9(Q49=h!bgKIRA94QE(4搊E^qLyP8<ci8)“w4&hJG bnfu#rqT#J[wWW*1xڀ-'փLnhU1I3L=hҝja*7444gR J'B)6+hLX~3GwmIvoqsЏY~#h孵o o|}3qq>nԤ)O)J`^?+5hEάHI& ynz" Ӯ@sg} I+[cyֿ>.6#O ?RF"tsDa9N-_lԹ8!~*W-;Z@Ys0$L6=09xi=+LhpmĞ;!==h9&JP=hisF3H2:ӏJm!Fz_r45) Q\K1X) |1}]<6ؽ] =?DśWk].9 $$@'?IuGFk=XeFO  K[+<˕\Rè'$OKMM/A\3K°m^Mrӵ;7VIa])9{RԬ?]j fIԞw&?y{sĚàDuDP.X}ھ^:ӳM94itKMM(&ќъJkY I'^9oFүC}[i\|K}p5~Q=&?4GF1^עzwtu=*.m&I 5~ Dk}ꛃMSRQۚO.4ɡ4&09p (Gzӳ֓i4RdS Rn4fFE("}(Jgk}j| zJd*"'aE {Um}sJʑ1U?MzEooC J#BT┎(:Iy'O7>Þ.5@I }UyAdps~2 p]RHS*N*QoK)$v$JN&ASWШVR ZnyN& ׊x6iӗS\n%ɍWӌ5>:xG9|AXRCm-ŇoJoxHƎu *FdJ1$MG5ЎN1NGS4.hvs~nr1y3IQGZ\P(t>Ԙ&Sғ#"\{LQK( AN֓84 qI@▏Ndh1B4QMqAGCN" .iF( = P=h PRm*4Q1!S^DLy8:~<*8-nF~ vP//~v3Z??$} {OAW- +#`S Ɉ~_8`E("" *SGZpq⛂hU/3.1N83-' ^9'=*MJ{+#t),R ?gM"uA4>zm뚟ÿ^-Ƴ˪9,^Lg1$}cc$("".Tp*@?ɧ`b\Sz58(#n2x*28^iI) &1PM+ 9Kr\Rc"cP"\Fpi ־ )XцJw0#kneYUl}x [켖q:}e9ڴ߄l^4olc3vxA|ok*fH3|IcxqR\|f@lt 7^H,սUI ~ QvxGv.&}>w8N9秱sJ}iJM80G^h4  2hIҌ撊pi}j-91 8na3{Ek|bܠ <޽O?B* *Qi٤ǹ>w޹ ",1'JU|ϑ"^,|G]i^elp:ᇡQ^7_^ &z\[Ɏ#avJic?7PjeVD,}8H>  #LB!,+ǹ?V)GJ;ҞQӭ)aBrR z 4(#Ke ,(圃ӶG^>>ķn#}gMJM~/ xR4~Qz,#z\>i)MFm\6>@>i|h^}V72 -8ʢgu$|+xJVde!$<țyoWx>yKxӌ`yHWЀR*YՌ`OZqi\7 6Es;&hnq\oݬx: ޱ[kdBO ܜƾԾ'|^}&.&)̿4gu/Y-5̒䒅rU[/ҋ ZV{AW{6R4MNg4u!94(a$;q_:<5#^4ֲ;Ye)?{RJ%ߴxN o8܌VG,Tk>$<:H23U vl"7Mh)lp7ƹ_ oj% Gr{Oy+`koi[_Z=VH@ÞҼ+xݛy2'cc'ԏgRu8(qGMݡ03KNiMIm@v4@*M[Pge/Rk>|Chrrvh=ϦG}L4s80iRjBj7bFwpf8w&7_﮵ohM?r4 +$_Qf2n,yگzӚJΐoѶA{AeHI/.xeXDR($lFWqᧇ(GVnxs_;,-7" UA( W9v玔KHsړv߼@ JPIAzG(^@Q &h-4OZ@yko.BxD.Gn$I1H>zo#:n4|b#WCkFK c~d +gs_OZ])/E^EyAnC4l*~9s[!jMƸ>GONIy?2CCO Aq5y;՘ 1kԯc/ iquZl #UI=6zEy¸|sQ+;v'̛Zn4ʊU㟅nGaqcs|/Ck.y"$lsFjǀ =O_MԵ&V!a"Yyϥro/ zAt,}ArÊBAg8bfM8F)q(4 )qGz8' \LG͎~jZYޯp'l,K;㓓qF+-z!pDxд6灱q黨W4*SEf7p ("}9+hH:8 ЃKX<wn[=^1H:Rt=/PA) cbwCN"sT8sr}* 2JUM*{JJ 珥# Ԋ=j; MNKKhmx@π:vHtl(l헑(}Olb)n9DѐJN)@O!(HFJ`֐Rv)(=(R21M, zsH8J @Jh84̮ wN)A)攜ӗiA_3o|q5Q$.ۊ:}p:T㏀eYW RGN޼ĚZv[Ko[1_gӜ}3 0YhDqh^AG/ZCIIkv͋?~ыWK?4vYN?#^Ӣwt*-HԓגI<}Mhbå=ycќFRfq@5VҾGh Taכ4< Pu.s @c$Yj><ӫZY_Ge>x8/!ϦkDg|}whWN?J3i5E1<9uȤ#QNCzJȱdMle^9 k<SRkWŚEAjM';@8䃞1~6riϷJVkE:Rۏ_4d>Gj c s0@zP1KvғJ1U̍*HAzӺӗPh&܊vhA@jxjAj`RJ_u}F%GbDg` q8"9Gt!OAv[Km 1XLs=*'ӆgliE85 5|\5ǝi;.M A=\ *P;yό> _ŗ~]6BZIm0R{5i߳ ndGkFzw~+լ4]?ÚTZ~gdO'}5~jQ@d=(ANk-x/BZK;h\B w[įxYZOv" Qv]n>5ՓIKP .('5!4bCIKK&qGZB0qE.qJ MRR(4IsK֎g4R)P .r)1M"E>)&x E֝R:JpHMi:GjQC P2)1^i9SZBIw uy׉ ?ķz`Ӯ\Qd>J|vt7FRdH^G}~^1[AEj*I#n&6УvqFL1E!4R\M֕'4iQSOٯ,?9yhnd"›S `\?t[#R]!C{"f,s»4֌-E4c1S-|1`4ޢEWՈ_Ν ۩vxNt8^ijэh )Q uSRM3O) IKjC FiPI1NƥGfAv4dѷފ1Gi3NPqM"8<ԄqHs{ғHzsMUjvӂԄ@vIF(n+ƾ>xH-<=3$c<~a m8> |C7cT $bfH?$p{Y 6>|)[KeKS)ut^Xc0=Nq5|׋}a'٤Wh*W=W)ǭMgړ8 n94i3(KHs)2Ts?ԼzQj8=(ǽqF nZS'^ sKҁ3@b(i͑O'#FqHQҁFy!Kړ8&攑AK4Ҋ1K RbW?/ Xj. \64f]9/:K׉$܅82.0#xoTMm^92):C^|q@&Gsn4*bB>fTOKd'߫) SLoVxd)mb|y략ԛsK袝) L 杚dp;W5tdj${PrVcG<_P ~fZ/OxO\M+#7NЈI("zW1]Eqo"K9d{*AъA4(qIqJ8(ԀRJisN* ]g[:.-呣@H~=O:M5춷  3d=붵 4`1ݨ;Ft1`OXck>"ۮJ%- GCy7WE2:t +s_<|~o[|q c~!smOeto: #FC)x>nfCVcf*cԒye"h: G5q)璊I{ҼӀnsO4R+ (oݧuRQ49uJ.iq1JiQ J)0(p(V"EI#"pI5~$|9]ImZO:peFDOb ?\c5[B4˝09\O{)6V֐O(x千+AjbxNMNR)RHyIZ)ZBӔҷ(1F)6P .8p'4Ph4>[PqFigcJF#4 i٦)lR ґJqnih'4K{"V Epw<spf:! ̪݀>x=. 0},]b=g4I8 TrӱH23L$攂E8I֔6h9vR( Ne4S^"<ԣLTBLҗP21M1r)ۻR3(I{u4iA4!4R}h2ȚvZI{)8t>9va8:W}.[Mq, 6y8g;guwxϱ3cv2FA':<9 ?A-f"HmQ~ fsh'zRsH)qARc4c n(hE|[X[Lä*/-2$>iS[wkÄNWm5on#7:{$H͂U$cǥZw-½9&$y%XlWt3p R!Q֚2h+KҗM&iEP(B)(LjLRJ1KZotu=V;[H#9's^9~Zl74<9oֺ?|p׉#ItHXF=j Y6j6 մSgwǷ0Y W8u,XǠj\j1lc J#[NۺI.A}PU b_} OCm?>J&6{\2q؎Km;i)6ѿ̧}M?/wgc;h?݆2os;{a Gc)mlAnYR{rMiQi1w<M5bsK'JUSnvFiwRf4Fx۞iA449!NI1KIE-[R)#IsxBJРK.};֧/Z'|7c{yaֱs 4Xd"29'cƟ |? &x^PMQt|qy}Axׯ1x^FgnH>z^zS*EHFGJzE.i(<Ӈ4b3UIJY 8zќ>n“RCM9f!V\ v)h,(+K#h$,7g5ᆭ}^ y︻0*<8?Y^]TmP; R[DNrjpƖHE4R)3FqM88RR7C=SAA!3FHE#2ˌ vExy/W&qc;)QR@9>ۑG ~1,ZU.,< G {|?4 hꚜ[y =I+gW>#;1w|{qLt/NQqJJԦM84))9Q3IpjBԧ74f)Gz0i#vr1IK @@֗ Mc<Ӂ x64ȡNE-|֞(7H &=)6q@PM;Cֆn 3$W3)_ j$.I6oK7}|׎ <]:nC+ Cc ]uƸnCգ%0 bi߆D"G˿2ϱipip)Թ_AM4t$w<\AMUiUl W?J5dM;9' k)(!5RkgbcVp\5;zҎi9KFi3HyuU_ҞX:bGǾ.:tSmẋЁ?#\u;;Lo6+'8<~5rxaK{X$RX׎!_|h~OIZ4Uvc0GzgLv42ɇD><=€=Ͼ-BxAՑ"M,lUrp#g5 {ҒZ JMƌ!'/QI(KFx␌iGjZC1N1Hhb 0O=j@>ZC{gmOey Mm:C) ׇk;מ~) 2Ggߥϋ:ғbcx8cM'LQFh(BMER{E.qE-51@E=(ZS^1GI${<)Xv4{MᶏqiĮ>dߓ:U*Hn/a[ʞ\w++#^=J'Ѿ,xCiM7I`}-Ͽ{ **`K bifBhiԄS qV*SLPG 0dx.X"s$?w ucdz<$wmfHw/4VXV7{xvII!hsl$]He# E;|˭M7ߎw:>I$g|Ru~æAqӼi+<^ZxK9]ĵFPA_gƩH|U]ZUٸ`:rk|hc mc! i1y]{O߁.tc:C$afa*=I8> 7W 8]$tqf~SנmRm:(f4 PԹT]kKƫZBN{B>=O+_~ 0C]?~qv}`ºPAQQKE4rizVX*-^-ѶO2Ǔ=Ex|;V''kn}+o߳u:anV6o9qǾzW@SDOtQF(JhFp)ԹɥZ8p)A'&)џJMu C@KIJ)sd)1MӶmCR,dnᵵ|T~&F5yY{ȶJt/h'fyp3!e< V.r) Aw{kw{qCtUG'^{u㽺+V?WQsEx, HXqtZSM&AZ(C)i9qHq1F)ǚC EM.1HOnou_%ˮ$EWYěgϸ_# ;iOl3`K~&[|sxjFN"WL#:`s^mdzVDv N }Eh?OЁNHԝ)}i'?Ν&mL❚J@ұԸ48_>|r!{14vy\v!Mwm=+z,zvjAHQCs9c\W? +^~mu-:ݮ!U@X=JZ֣񭮝7M,UX ,=z4bP(A@I}AWK 6fv8ه~|6"Tp{ĺ3J,Dˑ`Phkxfj7L&u<=wI>ܩ vpFiO" ~E%Qsc0{H ~0-R`J843Q5 a@A1CD4&piP(֗&}(<3Fih(}i3JCHO җ?H,)E1̻U !޸/_4;A|TIbnLѯ :czxg=>zcnc ѱ362z.sӎ hSIܰ:}Ӛ1NE( ;=M9?Jv@j4bJ+//KZ].en#N=@{W!ͻl8n1׌|{!pP^*F~fG >>? ᗇd#~Q ^Ѽ[j.a(NCFުÐ~{ו~ͺ]R"#vY+y.oA 5jRZCHsJZp(;Qi@QGIڒu\Ӗ7ڛM-TS`f<{{~-g)V)bXcB-!`=Ho,_ I 5_0v^1vm7UohDުH?ȯ?m"xw0l\MlݕmSVԼ[ N`ͼ[;u;ݹq큞!5KN([cR.}u?r>܈'o,jL,0G=,2(d6ܬBxG_ ^;8RϹkO x?Yˬxz.匓ˈUs׹ɮOu4HԵ kؔ,$F$g]"[&wnd3:oeԎM{M/=QQEDqqҥ)3y: c&OZq XN<hҐqE(%'N)vZByHT(⓽)4FsF((xo I$06t,ǿaCX'|G n>Q3˵23 sc=]?&[/>}6oQd>ϱ{W(Mk$e>_KXJD]@HkyucwK|:ȁ+  -fuV V7%ϩNG&cv-Vq!+S$·S`HNsAJIzǥ) \3>b=)h_~5 Ԯǝ;֪i=Oo٭|gs#l c&xo㏋tkmFuk> WQr=\&ki)}TSA?J)7gz >Z3Xܺ>k<3_JO ee<85YxJDU0)p8<#MXۭy]F"U\p[½=y1IF3ލ@iJd c4܊haR2N*0<V:ҁPZAѰ,EkomAcP~> Gtw4g*ג>O+ QҀisEqQEe<zLEW_(sBf F#c7 }V?nRk)[}PA^e__c5e*X$9fe|gj'ש@FZDZ0x`qkCtZ@ 49 )␌t\q.iIڛ^sW76-͠pԣӞAs^8{i-ݔp:$dOGį/(_8 F_.3;cWFe^1i}I9$$fQKޚzҒqF)i(Z-@5iԼvv; 8-I8_8x7=P'/O]ʏ9تI#>T QΓ{e_ a¸ڞtdlUr `;0t% ă*G#UYv2r͹I?&+@Ou?4}{=}u9j[1yDqJr/U_SHɧ i\^4/jNRCPNsN))| Ss'z;QHz⎔b f&ERQ҂ib) 94s_ k|>*tὒN2C:It4 ;NaG/@`Wxբ&Hצܑ* @I?\6!/SpO!WzG$ |Z [\346,j2h0 ?xLvFY*'ᱞs^6IU{ہicqtT6N?g.=_/@'#HyKlzϹld*W|xJNX/wu8ɵϿd3 P6Pq8#<1hnY?9'>ם- Yž~던3ר7fJ+skIcB=G>A.h'" {]B" J,?s8>d-E jĠ{\5xuExu-J'c<(w.AgC^91LJ!ܝj;i$aGݤ)V2EAJ(­1Px?hedr!JvHu>hx^_,S$QN><z|6i{ seYk$\* + ^i:Q;Z4=D˴}W9tWiEϧVNdA{G _pӮ.M']9o`qkx[tkdNV)#ϩPIo8mpp:H4``ъ3FG9-e5ݽgF=뜷໙v ɵkh%D7с B)2ixcюiSM( QJnKb)sFch8"c\n0zԘBZ2iX2(L6*t T9,n`ñ86<SJJ\@@ϭ/QSPiN:RJZcgwqIGZu&ќ◥QE)3E4ړ2i˞GPAl'o 4w)9Tw[oq sC"xP Ep?|upf}X%E?`4/ 6.oerR{nc~&A3M* 1Hi0 .(IA{w \"ĿR?z\Mx剃+ASgozZ(n{h 斊(J3N&4,|MᏈaFG.WC#+{-5g78]&/OI:g^|AIX6s+)8FGq_FT7VZmqc7 `=5/9g o<ך|O&rHHd M~#xzIƞ :Hg ⻯ 6WPpSV= ϪP:QH(ҷ"\P84'yžG>ԙ.sF(ڔRvJx":(MS=isH)zJJ0}(\xLSJCE'|SpxyK`p:R׊m`xE ۢ xVQ۸m0-#4PAc2~sjgԯ/uy}Ͱ737,ðt9i['9nuW.4V;n\צ֒t:SYC l{k 3-nbz~C'[]㧇ƛ4mV kƼL;Z4sˎv}нxUUھxزx⿇8IGd4qdM>澞 ^Zu4t ^mvܻB}9~|3&.wqmkfl oOڴ7wQjz=x4g #FK_~.kꑭȀ5ݶhO]}<N)3ARvlOizӺ\RctJh4@yjS@Ph rOzu5-*Ķh\b@2|r褜ƛWl%akMcsc $ZHUH g#ω4OB<1sHFxeUnI#Hz`:m׏./H--]US_PRO4ҡiÊN@M RGJ{m`X0Y䑂ROV/|QnZm֗^;u-Neq1_-k~-_^xPҋv>ʫ2p2޼zw犴/x{ZUfVHʌz>mS[Y5<L闲Q b9P^E}@78A4)(v`_E<>f8>8+HLQ/Ci44C*&cC9 ZۮH^YeQܓ WF@ fOO֕>,Ee1G7 KAuvaWd/mpB;x5G1NK*6 *Z1F()N)&&FiSKipj @=EN( % Jm;Q@)q'gZLQ1FqG B=(=hJmywǏ]>K;)|9#m%MVcglnP/ [(!Vn22HsڵM1n`ӭ4@ZƱxt<+%V'Zvϙ`SX8ϩ@sN:(F1Ihɥ֐b;_x&CsNJ(=E)IwQM\EV^mHԵ:O\]$mW, -F=ݽ'H588<Ӆ)2Թp(Vұ)qIi( RhG]aݽޣBn%&cv?[3E.+K1]a>bR7P9c#|E+Bmjnq՘Q'y5iiq %8 La}?Z|e o\p$Wt&QHjӶI?x31ͦ܅{s20̿tkGGjں]7(e"A>Q~k---,ᳵaqF ? 7PhxoGEto T8!VW /}~xנh^18$F>g>ǖ>$Sz͓CqJ:~Rn mJX(T|MEx_ '3TI*I`}v-u{-̖̃hRہ8WMq|kў2rU@Ҿ {SOJ)14v0 &)G-{QAMi@RH:x7cKAKHzTrC4k$R)GG `;o5\WP(m/Kb?ep #،?g_OrRԴK|4~ ?Z xKJ^^Y/+b? 4RK:RS\p*8raҥJ)|ϩ^|w6ܽk]ǘ>;tMu߆,{uA$!hI;vzx@.GB A#5<5O_W6++*Ƞmaߟg;+kKH1柽nB zR+C_|7edck~  0CrԠSdcR+LbN H^iKP0iT&NN)7zCM'dƶOOE֙}mynIm" #w𮗪nZ7eInD#ֻo~&l$uk ȁ.`pH B}#]ޯ}t[ř,{*2N0xH_x$qI$G 9=E9hOP–IN9{E9=1KEҞW4I8 S㊞U(W#f= ~QG4PiԌ8O(1!xE26bNT*\P;m&h<&)FRdךwUȠt[ċ>g?:6G$SI:Şm r;'Z۳8Qe-3DiÏnk韆m|I%-`0x=:T t?{FzY@BcsJFE1WiO*t挜^/_ kHZJHxtXҿBXƾEUP0 ύz-QdOXV0 IǥWy%H[\M#v½/G&)ip1H8JM@w)z9&3ښո 9R8=3?ųxUgKt1kO g3s鰞%q-$$W]x 6S6Kw(/R})&'ҍSM>(Ҕp1E(Fi'44搓v֖sJ8ގiqF !TR9@ 8cJ)s7-H/ji'(IxlcU(LB m*@?x?qn#b KXg+ؼEkFac߂~)NM{v"ł.gkڼI~ vF I~<1R<R6[H85/S|c"W|~ֹMb i&F5 =vIMGO:%oO!RFq%n<91w^cCDHk{n,O޽s& +V5R47~#J@ GE}!W~:Ut_Ax&xVlP zτί,;&0IzRBFZΙٵoen$S+'f6Wk;Y rKV OZiR1!REQGzJJ(4'z)EQEgf/#x3MdICaZN4Nk};[ʯҒzR SH:R`Ud1vjP;5`rҾ}mo:H#DWqG"#iϞD}Jk_)~U*ےw7|\WJ#8>ĀӼaH..Z+42qו83;}[&{d Nʀt0g ž&[FNss%̣.uk<57º$FmNX坏VcܟVPJC֖^8kxL̛SFq]ehiǥ%dѓI֜8 Zv ?`өsNJPF:SJ`E'_T’h =ĨN]8c>'5O?Ꮈu6ލa?,6ٰ /ZTG 1M]?)E)M(\&i)E;BqIҊ(rh"RZkps@;@_4-S.Ӽ卣ŸO[_v'j:rK]ɦ]m̐K v)zt>Ro[$ Tb AQ$:zW<Ğ6QI;/Mň3.E&M.(& %-KԤq TEzRB7M-4ISi'V yLnHW>99=c8ϞYuxdC\ GƍcOד>H*?G 3AYK@ ^Q19NEJ(|Q{Ծ%Z?<+'+2=yv< 5[yHɷ˃ZRM?E-% $d?~i1>W61i}K cT?AV ґ@:fup`*O+xV+cWK b<qג9GYm> \cW_k? ~*'k3P"^P~ =\_I4 ^>iNzSGjLQփ'4QEQEQF(<[~%"6u9 +8c8Hc/}͝I70݄q6ǩ< p_ЊphhJ4):R B:)sM$娒BXR"()2hɣ4b);њ ZLQ(>QSқA֝MRg֐1H=)s\ ALbݍ9GHpi1KPF}1^GxF]{M"Iwe$[y,j~WFkk8ٚ#24{$du$yo4izb#;XM$pq}qR#(Zd<3`23}}#hwP}h44sG%^Y ALP=ifA9NZFf9 $K4)KG)@2DQ`KE&hN⁊C֔` iQր ;t8&9ا)ӏ5*U_ւ? r3JoJq\^i(ZQɥgJQR'.9i0hcd➪:4ߘPyqKQ'p;Jx4`B5󧄭!GH+GLN#?]cZ`P==h]*~ЀIњ6 Jr|;'K(јbF<ig1FN" vEWԬ䴾Qd =_:^`t]H}> 83. RzkL HҥPhI 3KΨǧ^]7jV_K.W?3FȪO#ֽfmz'ǭxO{5~ӬrOŰp{5_zqJ)849s֖){RQM`M4;EQE4QEs4ک.5g][OɈ{s3 I½BfO2vU 8[R t2LiFՑx.谦y᷺r5Ι1wPotwar.,}J#=ꞏ?GM[Dϕ<Lp}+ma5 qUE))q<=qL$ZxHi7`f6E 1Jr)7REf4E%V LլSM(")qK0M(Gj<@\SJ)4R8ӰM)l)4i #4tisFi /Qn1NIFhi|߅+ R)A uiq FqIR婸bšre97@wb8ݷ#v3Ji.i 'J;  XZ|5公껌2N?k6cWp=JZbldUJJ?|"I8jJb7Mp+9Yzxijε ca%39rFG'=wi Z3.xKAPz\ ) PM %RnҎh4$NRg;WX[ ռcl>X Oc#N./?&cF@$-< ⦹v }٣?2PNܜbt:1QEP0Nu)OJ`TLHxI8zw&IHhivJJ(iM5кu**-UTiH'ҥ#iAIEZFqM2$q4(,ԓ^EO MܖMڻ\E>A'z~z-p:UΚpgA:/ 5VPYŴ9cl$⃚QA9;`)F61MzR4qKIތR&}iH}r:RJ5>*Ş&?J~nlp*2YCؼKqq:)J}l)_cQO Twiz"`c}P˕;8P9A`~8h4$4O%(Hi6R@^) #ҎE ֔uH1MA@Җ!zѻ=)ɧutZucݭYJ1` ;>&a XH>LM t \5^pZWF9>ֽ͖x>vDzf${MR 3G8 c=h!@3iO(a{{^>ƾ D4ұ.?#gc~R=^h~{S:=izӏQAȣ" \7&M |E@0b=)NHu:(\QFQQ%:TQJ=iE'zP3HxM,S|8QE(4 By1$ү=)ݩ !uShsFG-%:^+ȿh/\i'1>3$N B,BY3zeD߆loo,!Y0=!# iSP|T/c+>PCyG6[ 91e%x'ֽ҃H(4MAq< TF'SVWE`AQNtLsN(iXq4tP)x3A9;Lͺ+6=~LӮDmychmSxK8cU 9%+|tQm+S1 ' DfҴ8y>4d)M8RRw)l hOⓡƕ֝85(qIRii("IP=iTl9qB?{X,&+k,ymҴPa-CnFI$د~9FKqCf쁹@ kl=)>&QA)Esw8t#!knTBm3W Vk}3L} SԔP@=i-J(8()ԠQs>=)åuKڊ1E(5lW?F(8)qMf FiIZNy4M4EQE4dQǭ4vh'\JB͎rN/Y.y~ߍ !f:RTf(gb)B9fFe5*6ڗ9KE֊3\IhyZ&x< 95eH'-'߁s^1῅%ĺEr3 KY= "u?i(N}kú̗FbGq%5I5֛snmm9Of~{E( Y\v"`͸>W3\5D&>d}3+Dphdv8 dqD*8 +hV&u^\ڄӢ7V˴˟BJoMBmCqLԐ&\1ـ{cy=zzRfihqRGlth4ޓaY'$$Lu!Aۑ^a7lnT=⤘ _>W rW^ cịPE%&`Iz_CǸ'i> =&E6p &9)@`iGlЧx)xA4sJ5wɠ`kw? sq iRAzF壑T<8"GhlA5/n ~5  ,`)""H'9o9t<ўiwzҎyCg"߉^~6n|9}a+xJ%". *O#9|I !aO!daHfǹ}|<::D(32:I$q۶O03S\<҃IE)'SGbAh9^O;M)ue4d4tOsM`9@81I7xWG0PӒ> ?_ AҚLL9%0W<q;Q/0G{6+w'\+=5? mO &^J|۹X3 p?Ԛ$^(%y杁 RHE-x_Ư떾L7>жא݈P@Imkz-HԞr8X,6' 2gãc=?BxKPxº~f5sFNv8%Ys zڦuQփ@ CE!-QE.'5^1\O'<Ԇiݩ;ڊ(4f88HzMnAIk v_>aٌ{ֵI@NQEQF)Hj.ňO_SL,& r!Ԍkõzp\gH 5_MK|UA2Ķ/#?km@m2mlq'$I$Oh;P(4m 6(9MnAo FhA)ic4t ahS^K-.~p ?oֽA{W8!~F 3$oX'%u]/ZAKIQ`Sh#}01KDWw>"J~#vc#4sEzF玵ןlmOkc6_c50@) 摨Qhniȿ(G*Mǥ2X!<1ꎡ Gmagc;H-~ciA8x)NӉ⚿zIoS)pE ׊ ~4C3RzRO41ISGJZ3E- /lSqE;fZHڮ9&LFnn?& ~ڧ{:M:w|`uy0E$)gއpjNN%aF$p(Jap{hii pih4QEQMc#J AKEQE!ϭ硠; \d`A;2E=h" }jIDqՀ1A3mdE)&qK)9)iJ)x4P1HE.P4Q((:Tl~;S(jSȦsf8Rj QIE Q4pC$HwsI'xFWsE7AK,4M'p+f\o{':AW{v?c!@Ȓi8ݎxak1!f%Br {r*]c⟌%[> 9Ge#i {>}ogZ;jdIw"vğj{RRw bԜgޜ:RȤ u4P\A#8(_L _< P3֟Ҏ=iRBMN4ɤҏzq)LS7pZ\@)O^ /H 5J3AZ\ҍF0x*iHܜS$ҊQ!T6\J6X{^Y~^y.u+"(W~[=? ݭ6_^!99(>`TNs (n'KHOٷ:a 2(D;-wR4RZkxnxn"IbaI2cC s7$u}8(QN=)rE'Z(ޚxL`SѱSւ2):6q\>$>&3K|+8202{(>y4f f?/D|qnٗ qleAg:r 3u934 iAҊu1ݑF3I$["G RI+ ^'ik8_3ZOܥ@rT`s]s.}(=izzJh3i4&Gq@l"YͿfo^,wc+}=ϭ@g[ıM鐿I0`"8x+/Nm: b(vP?SV(nsF :RiZ2E,} H:Pi(( ^J摤"(EFTR⒁NH:x4QKM&U'c4ݜKx\S!R3Fi(4bbh&RfsKEQ1Ep  3+KHyc'C )4R@yfɯ0I4(ٔ]GlJqˑ!1ԟ 6$7z {'\=븆{MrkY-Ky7+)As^ CwoH'P yH?yN zBT ;N( SҒ4dgk#ÿHW?*ϛIDr#9(5+-}];]j%% E߼6#=1^E0ޕE7)0U⠿l6mB;kHp?Lxt}{TO4@opXW|5BZ[k63ΈPWs[Zhw-lSR@$) kijSp)>*?+d)47ނiE&i7 <3N 00j5h$nTiCsCsN dQZwNNhIiXsF(QڝR`isM'.x9Iޗ4PAR= k@8x5XOviW9bRwKhXzq^q:(f+DiCylny@5E(Ȧ7fM!sLI<ƥ2kL_Ej+ܐP`:fnX]R18*g!YZY9̛Bܫ k 0ZL(1M^-^\~Q392 $JZ^O:RiBi$.{*?_A4(>dڐךP)N1y/>Ӽ=i6rk,1vR}APF}{W2L䓂@灜 1gn̒3]o-@N1%6ZG a9T9 ^~=F {^{z׏^|"OjO_?⑶7m+2H N^M 9┍y4Ej #Q捣quo-nxYLjdmp[li,e$p{zcz׈Ua_nO}Kq ܭ$K#@Icf8E s G-Hp5!Ƞ4 Rr!WG#~XڕbvƻBݼ3Z:Mm:D`C) A%=*žf+q5)v8O]7a-FպvUUW9zKGz^ vrJ|;C&P(R !ұqhmk{C!mu lx*ѵ{&;#S3n3NJ:Pi(vlY~ ׭<3f{8U־t|kRP[= v=B o`>z ?goH_wkuΈ"6pZ |K>3j^9]6W0}A'׍))fy4o-(bъaмuc@HL4sj*;֊n~jxh41H1A4c4⒊(Ґ \RHRN4RL9)y.M/CFE/&1I:h=)E!Rw=8isG5<]tחV޹Y0>*O3Xo ;RU9eUAEzgV UU(ӏZ'KF;-}J5_+tڷ u-<2j:m%Gp+gOY.xvYwƇ"U8 ?_=M1ϜFxo? DO#IˑOk$c(8=*9%` ORAh94/Zx.Mhip6s^}߄/kXB1889Ix33)ֽ3? _9Utr_{|q]x0N104uԔI9 mHi3'}+C6ʀȫ1(*H'I?7'qs؈[s!%o=Ϧ+ ̏+ ޼I.>XEKl9߻~WRufSg !;1=7ձҊڒ(9+b>)9%E#VSЂ:x!It^>t}f] G/$QNYQ:eƍ.&/tIMrdj9%c􏆿<}YMm^;$вqzdry5vhF}zhK@JQ@h4J8)9;%ZR 4REA4*lжksȈ9|) y 0iBqڂN:PFI*@s@#־xꭤ|Nֻ*GiŘ~N?:6=KKuxgE)cnN \4{oψ-=^[;]V4h7‚Ppxu;K[{hm x,qDU*sCILr:ζEtCrOz NgG״3SK;$m߸ AG Kt<=3g1?NoNx]r&ø.Ys| nfc,wK:F 3ʖ/?}x[1['%dtP>EvoD4|[uڠX,ǹ'$֛ np(^y4փ֐QF(+gIVS,@Q<'2EYxncY`%d`"J !b=i3Iu%R=) %:/5Hii֌G02i8'U\MYKE')ߌQ78ACP^=u]fM{·aI/R2<.CjVWKs),74GMGF}SWUniUW;ñCp/F'Ѧuγ!9G zM':xѯ8b є؊M۝9ǦխotmM6-帼"*Jqr+_?K8{ fVfY3>V🋴i2DN#qUao4i4gv 2YIM74hG+zQK.A toi\Gj(=o}=WX{JLּg7ROz<򒻉J;X2#ljFۋ|"H x QҺ_ so+vbF9q\QE!@▖N) /m%Ofq-sϣφ?g{-k^Pg pnUx-d{xG׮ >ICuqk.7FOB ڐS3Ki8ES!RgOOxBi" gWg~1@ofR[,8g~OR2>"$=E%GY?@+_'MW/ƚRI!d$pIe`FA : \ߎaxLeʮqwx~1=Yh-ޚ獻2sN{C-?^0i.ҞG7d~=)s3h<@x#Fo;!ccC9xf;$[_Vh$M!= '\%Ϳ>xx.E$ NV\HLv+8.mȍ2?CSJ(#4cKM|C!zj];Cғ uR`RҊo;JV +ʂBegԏZ~xŞӮ-G;t1cTv=׷V~.MNa2;O@;񟀑Oxľ#hE"'hd߀}ھKTu6=gC4N#>ԮZῌ[o5_ x'I~yKyRc9(ˎG< M{= 7lo2Cd./~0|jh5rd6,ݷ;gs.kqQIJ%)h;(-ZsRR3I'kh? a+HWō$4,Sa3n?L4=<\fvќ5sN>nh@4qN"R}iq_9xwNcIBA#>Wj:jYGBc4TzҼ#|w\FIʪe oধ6NCKl[o~IUlW?ʽy4+riގJ#c-H;o!Gk<DUi,y8\Wv9R^'-\^aї=Ƕ@+^}sւ2i"Z_  /#1 r*R3F084oƸz̶-0s_Nj1*P0+$Q|%P%C&Mf٩0x795G$8½QУ#^hEEъ^P74`RJ^h)HS2@4ZSAOEPW'ހzQH)i0xpM/Z1A'д7))JR8j^յWsoo$DAI Oi|ߓtַV]YEqo ܒՇ#S`PG~l^i1F3֎j\J2JCȠd(AqMKttȧc=):ґ(h:RE NxfE5F d=k;}B;]eI_U׾ʳ|=JY= J+oqA&I&$Rd RIU-FN^RJm?'Qnh"qRQE%֖:Sk~6fğefK ƽ]UX018ﶸς [~@ ~+tҍg4\F>Jx`0h J(ZZ('RU]GNմ۝>3FS&5i.6 , >TIko ox"[tq>~5ƙ  #KK1O(þ3WXY&Aarx9 X0մ~ ?ʽ+C4 i0[/;c'>ZYAIERw:{K,Nڑлz㝣A(g7fV~T_|~  Xxr>&f*0Frxg񏃼?}o=ew[jߎRxmY4wU]ޕ`iJQKH4ѓN֊Z1IGZF+x#Ğ5tRKm#4G13}dќOlM-uE*nq,xGL0|+jyI3k LӁ<Ì(֕i84MCZyҴe8T]܀cX>&xG][5;|eH2r~'i.kAq4r"* tGZѵ};-&0y͜ 4A'3\^EW.YZvc@k* t`91*A^g$om.-d`J)%3x3فLvrM9Yd@֔0M`3]V_u/o zSgk,qԪ^;–~"ռ]/} f?;nWS[XɥoɔxV!D x02;0;@푎nIQ 4ҩ)i SSHyGo3-gE>j7_>,'2 =о8vz.57Ntr@>s>7OmRNɌAA٩o==9~x! %! l` ;$oi =iby&i€)E/jJ) 84t ❻"4k |[nuҷ%Q/9c8i/)53o2Oi]ïz _ 'QEpnd/Lc*1BOnZ5X|5vH< KTGޫp}*<-G.f%"C['dѿ Xup/a.#'N})I&B;~(xZSқAPM~xF)ؤZ* +w]gɶ/*v#m5^(ұi.Z% b= ֭i?|eytV2I 33B)AE h-I`"6UԌpEIZ)7QC3׎x^˨h7cK&X)z\ݮqC\Ӡ?z^V#BֽѼ fBy9fO'F:R׊|RU^SR$}/I#=7c;s[ŜIgqc5P<ɴďB3g᷋<}x|G6+4 lPDb13:@ @K@H€0iiERi){J) %'9bZ@Ɩ(&@&c=4s2;gx>0_KiP=~+Q^O0(+ %Bo3Z㭿f9FhHВ!^hWtӴ{(-jX<52)٥6gE4QrE.@4t53GI ߝLOPEHG{R|d,An@Xa-?iKweP ~WxgŚ7]tHYOC٭ꖧkVWV v=EyV:j{%#>LDIk F}z4sޕ(>'޾}ljk}FWx {潋Onu4dhBA$z 9FH[i0\gXhg 1ѾSߎq< !о5hj FHw΀3&8I l_ (ޜUnml亻+{xtUG'^e>KGw[y-̑UK)\o=zן uq46IX`8 06u{m JԜWϺަ61h`s]ޔvҕ|MKE iw: @?ilt7IӴ[8o ?% SL"E!'4qJXX4RiE%iR4+Jh#NhQR,|q]^Ib#B#z'+iAq$[`B0C88}}gX$H=AgJq>ۨi%'sӒTFy ԃwLw=95-F][Бf-K#B=-}5%wo6wM#傹@RW! ȱ@9R4t4hܟZ q֐ޞ)2/Zp?560r)wRg=时)@(1<~Nh'֓v)7ӗ`uF JJ~iBVaib OP$b? qW~F jN4fþ [X ;k3P^Nk\m}3XH?H^)Ӆa!e<5A + \|v^ҁҊmQQEsJ-4Hi)iZZQHieFzjEi[H]c^M*aii n9xRr:yEF$AϘ`(g $TKEZ(Mᧈcqdp3+Pm#\%]is_R}1𖡥ǪAa2\;X_2ZN-b| %@#cJ_M=귗ёT ~b)3Fhi)ih8ьQJ4[nsڟM<\cQ#ޔHԸiOJAҹxkƭ 1¼4cNŚIplz}?y9> h!$JZTJp^\j? ~+P1xNj>;tiɩܬYYpDh_Ľ ga4\98AҼ{=͈x.`Ahr:+$ɯ(xQEZc\H>`r'xK3 2I϶kFapHxHQqaHXc9 huѬ^en`)#ܠg}M}!Ey?oxo^!UgFI (Ncx3LJl4[{B4bB>$z27CE/g@"ۉ>2Jĕ<`;ρ1'.tBC-֔ȋ+^&f}HF}1^K'CHAjif)4hRb1K)! RdS S>4RSs:zPsMjjLRwCHi摀`Au*SmynZusdcFؐEz@,H>La}k,_f_cT0{9i.6Ew*EBfQ(^aD ҠҜ b u| ':Oo܁',FyFFYvnqҳux.kNޫ4QK$m=8~?me[Mf|,ː}wWF9jcY­w(| ;n c-Im$<3G`NTdD?`bSsq%?qZ뚏<&g#>I ([v 8NӊLѺAZozvA4x:B53K” n~j\9 4ҚNM.OzN)L楢Z@I@QSM;O$⚿0$@)iy49xJE|E|'/ZB~sȎU@aP}s"+㏁+(u+4|lqّH#>¸` xJyu! rÕUSPy$:s鋨i~ڜh(Ev 'y*xƎ`v=  @T\c+CJ_jNވȄ @a}1=+ޭ.dtE"~^3~{*?ʾosOZ^%ռQ9@P{_a iG.NWku{MIj-e$r7mA N"4N(4QEb1KJ( ӻAKHiqsIMc@sMx6x5wK,'p=pR}r'e_]ŅյW6w\[Ȼh2u\1ERz3F3HP7i@ oJ_S"1p&ft$z20 ")lTNf`њ^S]X9:0!A3X5)1no\F{(mw1'tX?/ גϊo 6C9_b:vpB8Ag4-4 > 2}h)y<JM4JG ӨLAK@\PG#NNii Rc43BÚA\ĝ_<ִxdH%uܕ^szZ f{Tܕ\`ێ=yugam%Cs3UƑDZ6fL(@ώ?}!L#4ty;o Ky[yJY4M_5 9`gWES qo!WGY7pTC?QEaema=siUc0C`r'CkK5.-ْi#X5|֟eH~ Gm^G@q5K @ľ4tq,;LtCJז|2xK[K+fk_qBOg]+/5=֏^_YYqv>&7“+xWefb3{Ҿ+RQ/& '8V z?ksO  SnMJU"߮NI$;+fI 0ĭ7Hϰ}Wd1@杌L-NQzьPO)*zpm”ҜSMP=iBzPTM!SZ)p;4(jLzRsKGJ3-!Gj;SA村HMxwoͷH#Xn=*VM9G;f Z%<,:?B4.OlO? k2ZiLI1WDH} '!/!2b=HWB8k̩Mz뺾fdcki :|n_{~;"si69>\y1^G;'FbCAJG|T-J~49RҚrM;RM3K旀:Q ɤ4tϥ)3Ja;ښM79tJ˺WiJW\c4A RN8IѸӹ5s4S⦤(H21E(<]wUts1.)—8ӳP /ѤH]A PA+';놟ۘAq"/ |7 D?& a_ r^_08B7JO-cM[)C!5οi{]iu6ǹ5js;ּW.6ZN;IbH8^ZyiRSJ(=)((Z){Rg3Hh4+EOHFzmVNol4EPI|ek7p0Fی`أ#&6ogkH`]38=s%J \k~,G{Ηc+9Aᇠ=p },8QE!b 0i< 裰m.W{Ey 1.}yEY3)ntt!mτ|Gq-ǟ$1F2YY:u':׷|;~9r]Ĺeb#u^yc? ,Q؈/  %cQ;+˴=hƷy%۳Dc }*GMbXu5?gArQ֬2=cq) m4RQEqFE51Nw4dR`P9Ei)å7v n)1N z`f((dsI*d`FRڗT d/ Q^OO u=.霼gy- '뒋|%zm{|Ɉ@޽Ѽ SIHkF[$e0kh{ f NHB1KKh {yq`@#'IϵRtYGK+XLf!b8#8ǸKꐂ\c`wh-ֲ|u 7GȤ2~5"6K0!P#t1ϭj|iu7Dv?I?Ҽw_|Aw7ڹL`$zdW!#sn/ڰh&U2?rרVՇŏVb_v1HcPΥ>չºg_k>ėSr:ۀKk|i[.'}3Rh2JOvCpA=\]{I$V=GԱ5,i5v'sf=O;bWb6.Ώ02z'})·w`ph=)ퟭ+|?Uz֖(wn=(-ֽ![rbYJ竱OHzx8 fn?IHW'RRvJIlJD`9# iM Hdӻi1NRQ֌wFx^hG5K,۞O +1$`ƴHСh2MN?iL#& u Dq<yw㇈#j4O&Sʶ}Mo2*.m9YZhrˑ)`uB@{_-kM4<lv= 3i#P0:K4-1@43S⛒$i9K֌b6x>jK5gt,pΘh(ȯX{Dٯ[R) sǜ⎔)lN!<ӇJ2=(Run#x'}R=\-#OckG; x ?.F> }ª5^]S]ʰAYI?|7oWw .wo1M0?#'ׯ|];֋7H"C2`|?z/xm˝^i'S7 (Rr6ـǮ8> QnӞb 8j3QFqFhь})GP6M~^#sgqFhڇ5;~fO4c ٿU:.Qx"i?3Fʫ_pc ;o=k-|pfcx ʻJNF_Ff(\QҌC|WΠ3OkhDT hǯ'-~_{L.A/ݧõJCi@qFqHpiWnrzё/4RsN{H=)i@*18A֕4څ!4m(RRdfdbt2qHQh8ǽ'8JPX4Q):uAPH8T2OG u?Z#HP8UÜ*S J: )60)q"w0i0zR94HuݵriAȥ9Adtݴ4e4@SJǭ;p杶if٦ґF) =NFh|#xw u&8o}g?yHAGf(њ3(=ñ-W,hnBz `^Yc_!_BkQBw0J8:js3@tCoc!t2R`gW|?])nA8yHS[jͤrpk~4|:Vmhx+"r@iO#'+sڍ7z5ķDvqc '?|LR<1xf!UmJ3¢g{W>^\fz<H=4%;4 q4INs@9A4Ъ4SO;RъL zQ҂p)1eM  \) G4Kf L)Ӊ=p VEHuFÞiJs"-M}UzpG> xMve-RBL[km(TIk޼1iҠt+ #nZF=Yru!|c2ce+Fd\qm-WwWeFnvSP 9s^u j|OA}:g<3&8`FH8; }iV: nI + ~kUiT\HxQ+uqS"HZPQngjdR}&_aYu c'_$7]<_Ѯ4MJ+}VDyl2xϋz-VT8IgX֎Czg98se|?'.⟨:Vv5zT𷏢1J#xJ0$e=iz׶o$B%6ywSttAݠr 1|1F)-&iu N!4/8N!\`M=)NqQ L)H☤iĜn񞔻MnM(^q! E/$j91Mݐ)XfjUP=M'Z>lRȣ\sFK҃IȤN=(R74#Sߥc'z;kvjzpd@N{W|A|gK VxdEMAqP8#95|-{D_ ^;X]k bXĐFz㠮VOi5;Ϳ(Aשgk~*Լ{ո2I\y;e}FWc^F(8OZ)å5Z@Ɨu⡹HsҙĚҭJwBsl}>|]{U)$"!c|XHuj373Or??$<{ʰ\y;e$v5t)22 4PGbsK֒^fEЧ4 s@ SIE(R)N@y$Қ!>0qHI"D~\83"T\9.1IE;T&,ӊl$qFK1B_ѯ.ZV(Q}@9Z"j>1edh41Ad1VuGP+?Px"mA`Y\yݜy|1u{ź_|;g*n{eVBOpx?ڡ⎭b 7U]?5-m)Wi:kH <9xWO]xKemM}Zvi/ m" VFisHC@vݸ柞)-۵4c)NSp T渑]UhB~4Ӛ^ȧ6FzF:t4Mn(W@ Ld~JXhē Eoϰ`k<3\[*fbV&aI@?9;z׾+Fs% q{ B=΅JjzYE7JH9'։:84e߅KT榙Q>iC .3JfE(4aR g"hߚ)T6?!A3ƥw(=(`1J8SIqM4fsIGJvĨ"~ " ;Jr<rxz¼J7yBmn̘]܌7׵Q|4'^ŴD + d={߀_%oƂ9atIT r"6_ݰAw1HIiAp(o^KAq~F3^kx⧃m`I+0#d1rry kcL4s8U_DVc_ F}J{(l 7$Wt4 t݊3A֜iɧ__[e֡v-ay`3QqR>;mٱm m~B2rO `WE6;NoTt7>)λ_P6gn#/*~ k4kpZA((32\:9jn=?hnK-#D jT@W?R`𭄺o4k)e rx9x? /qts'+)]%Њ| -bWoYZgYn#wgcomİHQ*@y~1 EWaumXy^hrsކQC7ZHq|eI|. 俟|{vOJ:+>1Y|Mo 㸐ܴ-gyH,{̺w 5#-BƧoRO׌ K=έkj\i>\8`Fp~+ %决jbH= ~:nE;"PH=BFB'_N0G0~j=jDRȠ)9F+O x8*% @)GAp+spbu;T<٭_J3RմtndIapڦhyHKpd{+|oV/01Te^Qٛp;s@})3C{P1$`MUlM:p&ARA^ GzRi3^Y;> ҭRXe Mrz&1Cit0P/o=>|<6'|Ud:ʥʷax2i0((=)dRN))6?*ZCJ((QA?\RbZ5fgbO4`zQ);҃@i:fM+?ho鮤SQ]zƺ/ wbAQĄMӾw Y> ;>% 63 v$NE8R cF@*Z]wA@Ph{i9SG>bCJ֓7kJ50?*]ԻqNFo uI#2ּS)?i,4-c`ߞO'|#UnYDYw}w Mic94y1@Z nh(QM'xIFE(RgҌȣpG''V*7$ׄx.O%39B[lO?/#“U|MgY O v >hڸ'eI3 aWv_ u8ǴG|SJӲsֱ_5 SXK۳ƭџX#s}K-/r@y_>NXB#KF:Mڒڿ"9A3us8qˋ.y/I8vb0{ ߊW |A%{ݭW+=YZC{v5WhPO?3^ b}h4E(ǭ-7c袌g(;RsS(|j_KּM*𖸅eo,pއ {dz J)A`+?h to[*y#Χ!0ϸ>oambAdW袖hǽ&(QEP)hCL*[8.ORz \(EC0SNR}RfXPg8V`tuY/xrE "FsU?N픿\Mc3?+/(xqO_|<]f7g e?*Z_?&y=9X}SWu!QsH=iztqISJ9@#ߊJw}4Ԙry*׽G^*)FG(ҌP)p)7vW\\=Gr au> $M'kIv0 WD9QKϥ4ѓFiE15?>hMM^& eS2 k(CNnk.A8郎}MVimHi3 y2hHK_ZF;yy#Yo=*28{PIU9"l._u%].FrRI^vY^j[ܲG"3O#ZжG[.Vmtg8WkK◇ ~ƺ3Myc(vnܩsQA?/|Qvb0Sg$8+ m3Oac1T Sⴛhh#)ph֐M)-;HGq҃iE8t5^<ӣx>Kv58Ə8}~o`|\ qI! #cAUhGWOKF7䦽nR+iF+b*r'ýn1A")Jj7-)#g۩1LRi}r)('NR_j~ мk Amu<%ŹZp zǽoe_ZObby8K''yd3wqǨIM/FUkp'T(UsRQh(Fhyb⛺Bm49%`֖(1q=YF7}1{ ~vNqEecw?Jo xOVkiyVѰ;pkXriأ4Gc4kǻ;n{WG.;f6z?ױ|Xڗ6dD ٌxWtJI*F}5ko6ЌE k@OJLSJ((Z4uQE;(4QP[[suzD\7+Uɱ!𒼱 'ǿ4}OxF ䷑B%~+8iq /O'_AZhGDR3 z(+)APWœ8IeNMKy$1F <X^*~-0Xk6j-vvt8~k6'+=%>??? d}OS9PDH-7 iFg`>w` x+)g@ɥ fR\OB}5;;u}jXm&ę $l׭]|{ag0%KwxK96_|keO&0Ly;mvއ?`د1HoIќR7ӱ(4()ͼL :_2G/>x  TG*CcE{0A7+hdIeEq p=~x'F~*|FZ/g"b)yס5v)GJcrA(NIht##8 1TdW̷w>!{ -4 Sϗ죆 qkt+-SFɞ(\ǂwo;Ϥ]: J&z ?E}&)(4g4 ?c7QR)1(فB,5ԼNR((e5yAi[QTÄȦ&K< n6ӳmRQ^ K w$W \!9>ST~|NtIwd].X kFچcQ]Q<+w=u5jKf$1o_o_HOiv8iSQE#tZR)1KMNR␌)0sKHhzRQM ҔsF;E|R |o_E&" ϖe8[mA+S^'nE'dm|AmFY-`'qӡ\xuGK@ei24ƾpHrq֐r)xZYIғERȨYqRG҂)G=W|")ja= fIdndMW㧉5Q|4Ѩ's۴0؇ >* GgZkV_5^-[Lv19(U`:EnQEQE8)qO1F)QAMaPSS7/jflߘydž<']NLCG+O[+Q!V2i1I(7R;(G٦O msI7Ԅnǵ?9ڔPyU*2 iQրցFsHqH(4SsNɣ}(``,Nԍ(*hJk ү}$d݂cc'2BWO՜+XNۺ\ĭH*} {uޙLּM> wNhed)#sK4BR5;'z;Ҟ96INEuemڵ76 |j5/ J2g ̀=N3ꗶ6&~ӝ$l,S[9, 8 zmR쪼H%|0 HsխEx$cuW~B3`(Op*eojڒ) (8F▚yxݚ{dQx$zT!SJZJ/T6:|r2}N+iXqsuoˢg“ { E>qvo5rG2r;t= x;Bo w[F,2AзOjQFh4QA`@O7gXX*&_.,K~5P]Z߆FXokyJFWzW4]"Ok!#8*UU`y C\ё(8%SA.ii@4qNH Rg4O417(094(4STӆ 旍ؠ)USi)Wiԏ-ٚ\c>Qwcza'ֲ[$Ws~8)N;P(4hPxy"Adi I:S җ @P("u#MۚvBIM|ϫj"Y}?nw XY y5Կۥ ^ccB<x |y794N(PE(oxidڥ #\=H| qn&f-Dl!I$Rx>۷-p%1Mw<}zq،׮,ׅԭCv3c!vA1]qG(8f`8c l QSI@61F(-=A{cmZKiyożlJ^a~ϞiRV9JcAo{7l$t^S5ڪS P9bhC4A&+Ͼ&|Q 6/5k/ko~'8"uԴY#r*B DŽ>8j6h>94?yf=<=C{7kx u.`e`9}\>𽖃/,bX#n"5)xR/x_J[ FR*|{9@s/ 3ל\oRk.ar1>M}s^֌Q\QLm oZ'YV[roTƨ|V:^'o -7T}݅fӵ9.-YN7(znS'}sO4g^oǥ} 0)y4;ҎVdRzf)捹48Z R0FGҢD^>>^R|hiF )4ґXg\Ss@"ށG9N8`G'4^h>ԜӀ=_$i<)dyxvv#NL4(AsJ(q{ Ŀa|Sp诀7Hx}$⁀)@pq1F=90d$u 8jJcx=M);E 4Alb%zP'iF@!8 ;'6zӇLR`U v?EfnU }o־v#֥ j6\8=9A3 l@5#FOIu-SwҝC֓xQH }i܎(4wj]٣/ji)h425qKMRQj^ԝ=)f=M<Ӹi nɠ@ґ#vw}j\4Nbr28)ix=6^qғ'җ}9=z>Ji1*E9N*> 2h|~4.((Z Қ9 C֊v.i![kH98vz4,zTp$!8SFh-!A'jLS5SSI4m8O? e֭ݒ!VelP-|/▣yj->.u fvd1+g{C5 ` rp}H^]Xmt3]yƔFR|V+ ^KT}JW>k;G 2;Ԋ|FO~B xm-8aBqU@:TE&h'z3E?e.U[V'ՓgNK/]bJ3F>L~\}B-w%W#|u5-SCZ̖$0 ־J)9hҐ4n8b_ns"27e{#yf6ٓ8 AF0y~5XO<~f㓻h#4zJTSdt@i@@ێ:RAiO^) gpHn@=( p=F>884i~|χ(eWcK7%{Dc(1{`{to@99N=篽_^ b (phmY,p0tcEǨ*IHx$@9O 48751=I *MRH!u GQNyԌ8P,Ӳ!A㎵89iҪ4A!8F)}iFB:y (nPG4.xj@2z@q^1H:Q@&i2M(IE;jNi9JV\tmc. 'p{P)I8 :S9'4Ap 'zS4Hh4u Mt#!L`Xf1ESHSJ8czP(HFkǿhi!&(X?(taH1JZH֒KjpI|O'?u; "HԖ[lopsvFo. mm(Tv (Yz:g?|WE6s|rX뇔*NA{WÏO c̽Lt8]}.iE;ԄdӀ)▐ SM4ޝE!;FiEp*>FSIKuq@j)@Q)h|{o1-麄.G1,dlpEzV_vi-H7(Q1=𭼷8i\@ N=H 4!gQ{Ƶh;xжyME4fAGj(ştn4{rYHI\Ǡ͐>'~h35Z&xoJLm,E=I'}ht\6Cյ 9H#U NqK@ץj\CpۜsPi1K~ ī ,QK *s*P611KRRњ) (<@(#A֝FqL<sڀZ۩;yQ(KҐ1JNR:W~:O| i|ieFifH13gzuh\4i;hO B;yoMa8mߍUτMW0x!YLk"/+jyIy&GqR)= QX0/1?߼(Qڔ(8ilt#Oz*&N)sFhwAM#4¸ւĞ*y^3Յf4M(:)BҊ8(ϭRINQ\h# h")L. (RMɠ18)1&IlR 31J)ئ43N◊J)13)JsNh4^S~4$})ܞ})IIIFiiR`NyR)A>'.}E [\W!{JH n4_>ak7`OtolqTϋ^5zo~OkyZc$ 3N26ƀ–)E'z\P84&94P:ޝM4b(4f)sF)EM< "~(4u4RQU2XQQd =ͮx"d5Tʟ1kǁ|9q$~v%a鹲q8)rGZB=H) .(()@>w7*ǍJw??{{b$5;yl<F7$sgNxw=5jwsd<<ӎs\s׼9ۏxfh5/c_ꍝ}VGbJCXt1=h;Sؒ.8R`5:M'wjQ HF;HiAE9I+fp)tKR!Hip@ 0pԅyb#WoFJ4AF(:FqKz8G^)iwdHy- H9P);mR Y)TJ}&JhFh^SA/ ;:u E(viIsHx B.(f4?Z N&iWJ~4SM(敾DqnF)f(p(SNim(/Jxaniv:R&wqHIN搃Gj)2O>M&1_Kn>jSҒdw? K*#6掔nZ2OJN{ZR4sN;yRm7R⍴:R )8iH(Sq2 )biA3F1J(%IqLJBhH` w Ӹ<H4wnFiQ6⁊ (9RiFiAK3n9AR.z}i晜S րE-n4n( 7mʼnv(E.})NAڛҞ>@i3KM$BiT>)P(&pҚnzS6C3HYy9@FzZ)7 P(&&ub(^AKEgng"Ҋ 'J.88sMa ҜE-QIEj-;ʤ@{S@QA %ǃsቴ̶ >5}o;t$0.NIVL2矔ԜQ(i >GgzIǠ?mm< Kr̺<p&h!Ҕ:E4:W!yPi:#>A@c*Kێ4qGN)q4iSW8Ҁ !Pi(њLbE&)z h)5aw\Q\̸cW6]\qm(8eaEXcP/)4x6"[vxQҖҚ҂C848HiSP0sJ1ސ3KqUmwҦ NLJqӯn`Rt\>Nй1N.ȥ :SK(=Wb3KJB9K3-9"8KHh$GZ(i]Mٓy7jC֞3I׵SB9d1F(PqH3A 1JE&(#EdmӀNsKLRtKEQN7RmFGj)iRF):R4fm RbA#Q#(!9⍔t47R'cc<ъ)S6@4E'b2 :) q qK)@s4I֝ڛKacRM(9Nfў8 Hi9 Gzu4R)0I#wji Z(4@ӏn4LTJ4ҹъpRcP8#&&|H`@0hȦ7JEO5P߇4i[ʶy o"Až=@Eb46{<5^:Š2#N#8٨2ҧ' 7RRM#i?N)KڛH:ҞNN)ތcsګ\۔.qǭNv44InQ_GQM/4XJ zтZ M9RZ)9qK!9Q(}hҀýfAu(9jJzS9{ԠEG3ch'NLf 3\њ Z33A&њ)E!T.iGzBi ɥ&8KEis=:APM}h\IA&4QG4Z9RCMzS#QII(,h4ycg4d 3E4ҊSIA v%Ŗ~ γt7 e?uBOׁ~v}[SՅXfBDGq7N$ }o:] `d[f)vC9 zOz]^ȅYk8 Q+41f@)2} HI4 JNNIhczBAӧ9JsA/>`hi/4αĊY@I=y| r263(@{kXał+r4FibqZEcޝݨ8)wR ( E sڗ8~ 4u@R84u.gN>gi9 ޝSk OS?,ϴ}^g{Cx:[lp S`W_?yzU*2mg\=Gu!zv4{?ri>4P:)6KE*18K)/QJM4q>zK; zӅRQڔh4(?eg䴖[ۨ+ěObB4ދ]5.Y]@%#`22OzΦ1B+4#qYӼ9m$D F?{G|ixL7=0l1 SM&9vvMԴRR >ɪA'<k)?9`r8ۑF}H~~.4g$va*0 ֺG<M]M6HIX\ymux~"dXY'zr`2+L7 <vaM~\J?>,g\Ay2rU9x {!/|#k,$W C`=[F0h4){R )y擽:iȥ@ ӱIQAL)M֤_Jv4 VR J\֊ߎ-EsB"ʌ1?toZj^"K)V>\hN1瞞6!gHM4U&DR0謽=20A9e~Ͼ,tk޾l~o- }WEbݴ9Jȣu&E%:G*ɜv4 9FMn/>$xYd{],41< F3?S^:d~>,Kɥd2a ehyKφ4tMڤ8ĻD!c }|" "Yp*̥N$Nz8<1ތ(QE7n:GJ .) fQ_u78 Y/1†)*=p3 >mF]D 2,Q[H韻_@xsR ğ*>%%&-CsաvuG=co2Nr9'޻_<}&Z>Dcu'n}FJ(=)--)A)y'&ӹ"THd8RqRr .M&Hg=E.=)3G$Q-!Hk/_NWX% c/(e4Ya# <z*߅7R0TsQW~YKkIxL̋ .띹ϽzA#GH @~80͚R8Piv(FҎ):sKRgP'7M#9riъQJrzR0?{7Ja$/ SJ~3٩F@4ɨ/mu; oaY,oє^մQ<+tK^)#DpϨVsQ_xI u<~+4 NƏZ0f=5֓8 $9$I}sMW_'qs.eFW8ApI쑌ik?h~- HB]5&wz]^/ |8mĶOs}Uu_"Yg Oj7:oV%O'wU[t/K?á GK{|@eN}/ឃk:iRH w}}ytw&4pET2(Q1']8N4uvi  &J^DNBEmidzW).z?4v%nWg Qƶׂ5in@#'e#>i>,=4捘0#p?L¾ڙKKii((M44tivnn`繚8aAF =VdAM"W'-g?Nyɭ56][Cd6 _ o|IphU+,\GdW9ۚAKGjhJG4X :tg+ PEғ$diw֜"4u uLݓdRynⓩ4sF1@4CK@+h]Kj0h<ׁ]Ŷ6,(<%*LoՔy~220~_Ǩ/ ޏ;S>"c`^bIʕ,r ?/ |Jd<"X^Hcyb ^/_kQ]Bd}]Xt2r8pV#'4Ojc[rKF(Mұ4/ӻfn.EA4 QJCMˊ].(ғ4fv/Jb@8 ojšbfR:SG4T5Z-֓EܦǣB>3a*N!`#c?MW3ƷP%f핍Wcw}?Nϓf3yf=ɮSOiNJnqG&)q@;◵ 8K J})M'J1W_iYQI1Jl1ʷo d٢&&.e}C!L1r nV<3/Թ ^_ ?{_*2CI#JniǕ)hILwAIґKMNI '4|~ c4+I1$^D g zC}Z+sAAƯ CzQf&ȀN_Bx?I'}?Ȏ"L6ܶkw-wLך|EŦ&[sjC4aFF8N"EX\=zw+|^$aӽTt I5+u]Fr<9CT+.+?%OKѺC"g?ȩ4O}Ao>,9Vfei۠Ue${?9|ƽqw5mO9+䃏o=i{R Z(Pi*v67r&'W8|WcFT!b\QM>SH.(NsSZNsCޱ)i %{F) Q{Ms/l3,u¨_ݷJOپټ/ZjK#_^#_=bx6xf7h3NG|z(qKښ:ӈ4+ix&) 'яG4˘o ; $ c-:K=ԋyT s࿳߭xQˉvn$澄+E ޝS QSvG/"[ cuҲ (:IK(ߘSdRiIE/=hђ(-3RԝxPN(1H:phҵ8) 4)pzӈ \R7Z rGj/XgJs|Uܸ)ʊQ(#ҝy$R)3HN([(F-֤ .=)(]UI8SOc]"3Ci@+I :RӀQɥ< oV4bk>5x#Oʼ 8hЫe{nj(|G∖q.(ܼdnb99cm}4 x+AZ$ړ'hiRP:өNIZ -'RQEQA8]sSF3F=i{RnM;QE!RcZAKHsNiHz%%qu*d 'h $ۓCE{.cH׀ksn1OOZV#iٍfe*J ~⾝PB-4P9(#3J!Ue*#W#{+~Igrq hH&7&z0:$"&q`463;BN#ڷ>|.G^4_`V'+袔 NiH4M5x8M|gʔӒ'xn|RJ$ҎddnyPI$q;R/qo5?Arr>-|ᔱ׳2GA?Ԛ{8|5 jv{p$zSpcFr)@z9ϵ qMC֝NsҖRg'^1H:zSQF=(4}h=iqDЇ#qsO<(h=(4)Y});R nCbJ)i֔t BiOH)=(qS$tJ;ёAJzSN@Ч=iOJPs 1Ksg4ykRޔяJ2CLeOA'""v)CSNOj]bO!N7[Hy,x TkվK~ Xʱm5` ?ć玙'u-QE!Rњ h4 Җ+w?kagvu4cٻGy/n:lM1WxO=I-̇tޞں:Z)i 4 "z(F){SsZ2iMFM(&O4(P)A>޴)0)q%ǥ6AK)2{QGZQ4sKMqFi&8/QM('#;Wͯ< 7- sn|?Ndz>b}73O1}yNy@'44PI<8?v8-ScRi2G`n+ZL7' Ө `MOLt63pAEx5xCSI N!V#*)<\>u5#"JI#b w*LMiAh4E.h("E&(J(uOJ@TW9¾յ[yЂds &ž%`uY|텉F\+O]/lE2\y4 `0tAUQ5<W B| q)gA&yX0b}xkܖRC%B,~`:c޼Rk|IŦ*gy4d@Uf]I p+Ih<iݨ) Zi5!J-Pi(QHiGYQ4i=)G4bbZ^֊:xOȨځh\IKJzS ޔsJOvzѐE48H3jR@iOnjPxy*i1rZ^;R`8C.i3NBJFɤc"K)MsH5)w^z)x/\[{/[yU&V3]p`sC^(#ҐH4i&ZU JNi9斐L/Jq18PMc֞,|YaLo^VFJO1ҽo^7мo֏r]ǝo"z# tTR(93Hh ŷ >(Dq5'ny;!ܠEbAMixۚ@4m:&Nh4<'뷳3 iOryYZG˔Q<ߖTOv^a}i{csͬtrᕇ1҃?FR) 擌Ɓ5pcS.2)`ҩ5)5wOG44P)zR h'Jh -4zҝF)ɧ@NS)Z'n␂FiWsKSz\h)@֌;})P}i FcJ8`Q)10Zvi)1r)4 P84( q_d2=߈l q\s"s@"SK9dRzQҗφfDK5ZczٳXtj޹ς>[KݭgEYs]K ^6,ma$JW`? ;ֺlΚf- A+*I ~Q־EҎzQNhQE#P(GZwQȤ(2hR tZ(=)hQY4}4V-,U*\;/Y ?i3F#3v63WOAך3.EӳI@xzy03>Wj8ێ!6[?t˸& r?ڬ ?x2Z啽?hh̎ܠ)'9yuo7֖!uwmn"x ÎZ~kmsW̕9ȎϽg2XĂ.8g&9+GJݦ;"CIEqJyu,EHxJ8jԤJ 2) 7(zbӭ ȧIzPv=)֜ y ޔڕ;ғqEuiCz\JI4B8ix)A8(搃F(SH)I"#48i4p(۞s.94N,(lhoJp&pɤ/Ԁ Rؤ=3@4̜Ғh6) 9 PvtⓊ?YM%-O`Q̀kYj 4&d" TTm`}3Ɨf\)9^xcړu8u' @R_E(}i8h<ґL;ӱ3/8 ni@& RԽy8Rg&ri(#`iRn=("ssґAJqI)4}骸N({P:sK4 9N=3H}hf<ӳIE.@4g'"4\GjPi QcgH~'UCJ*3!݌~)h4W=? XxwE[p0:0Dw]#J]KL(GyʧC ϯZK3m6h~w y{<#eC|Wi2ӦT;pA8E!֥+Ck tZ[I <ͧg=O,m鮌v sѲO~ }:9o.R"]$TzFxM>%|ҤDYiDz N]Ibz⾔+LR99@8R}SA4(*?]5'߶Q#؜@x/PXg$JsQWZ[Zuii5(<Ґ6# j! ZMǭ/Ҍi#Z1F(y> 2Rm3T,ݓ#pGkOY [Taw#H^GE#yS=s]P1I d]Ve'x$û99Iץ&֗q\_oxG7Rer3C+~$5]/70x3qzx;^ӤJMlFQeG =A^y7YdV+FdѰV {4n<M.hLQA8"4ח|}ጲRfS 7}i{G^QNJ>7WwE׺hbvwRH!b1ӜWXJcdw5ptc&~ӏI d3+ qnɉ w%E|H_ |ٹ6_@y65%KmqKc7WR0AZ}gCz%"ѢYGgԚk7Rz[1nϮ gKcfcVcܟVFE)C t4т*31iu\GARGr7$m;8;!@FqN hniy>U Ɨ;;uQLQ `iG#"sA&=HZ^6~`R8$u!9$;8[ OQ)Xځ!8yEONdi2O}M.F3OHXz)6N1IP1A{Rp)31p JM("i.P6K䬎)}CA^ŬoRpR;_ph!EXCm+! 0A^u? iw̹g 2 EiOjQZ֌NA`#L>N*SHh8zN O䎔ƔpQ@SQA4$ӂM40(484cZ^ԘR%kqmpWas5~eƾ+^NщqDG[q8ǠJ:ޥgPݻzׄXCObo*B^OMĐ>}3ޝGu} (\|.Z (4oS.h=tii89⚿zR zZPh4 E';ԜbR i ci4AlE x{u/j:Yqw=9<+δt61>5ծVDVLF|#< sɦAtwG{*eL3GLtc<_OUug=58}:~4``yܧޔ׆kM'M?24k D9a^_hen7/ntj:wAKEdRRp4fҊi4 P1A4QFhdV 7q0!+K߈5χZtȟj N= = KinneH` #*$¾xeq g_~:9)g Vϯ޾43FxWT5*MMksD=G=|W]OMX"3ȇ!}E>|ciVŊI%dt !? V^W ,G"xPiv>Q_9x&e9[]1wD] ܴr ǑGN9S7+vl @.7fuٳ8mߍ7~ 7/EC$6Qr&.ӔDCȌI=}$}Nu4LRu.%'ۉIӀ!=i ȥZj&p'#h) P3)y%mW@Ҹlҩ0Ԣ8PQÚ)Z\KJS Bht4>)cLwjBB5׭dDsߵyG|Gq_|7na|;(`u}+ciakePD Uʬg$QM#Z2)3G;)0UZ)Am٠p9JI4iXHM;QiQ94 F' E}C>+KHa)BDVNAױKǿȿ[l6@+|/$/CX$ jM =ۀO%A$sIҔN(u >h":Sqښܞ(|;#9M.(dQEkD Iu:RQҌR8&IMqGnZJ(aU\mߙ]Ȍ=5g g q/,$H}7ǥu ]*K}>QӬO z\=z5m:Onm1*Ɇ![ ,zv|7OUhQ2 >z {#r=+c2 #>T@!}ھ)X>H?H)h-M>ԃbF)i((ҔL.U;S ZnyQE%Gqm 崶$J$UGpEx.3:u?-71`qïJ__<_xXlÍqvp?$y }3f?Fqs oàorI=-QIKӚ9!(ڢt-'?v:)zubRH# RGJ1 O4lu HrzR`x)(/jR?8 覑H(0i1>3e}_NVAnczGZ~^ Oq SNOԢ)Ez^%ve6ء]Ory5tN rIKҗxy#ghNZ;SYwXh ӆ1\ 0)ZjNdQ:;PnEҚzQIE N)>@]Ǡ;r):qKH_3|_ğ-4f-Ako,dqػO>+6hj0`Dd{ؒ2=W\êx]֯e"}1#e sy== nqp8m~T`_"&[ ''p?!^sW`OlWHM 9W5=b-P%U}ԿiHLHfȣ_Dl;0sVJ d`TR4Īc4PE:'ޙ"EHH)qU煤< mظiHGq=MpI:< W'7>;I#mI?2 ߎs^/=xº&&E.T0g(9czS4ү" Z(MK1E JpRERRMcH&E4w| )X" .);9PGz;G҂@LqڐǵVNΠzUGQJ1I .vN= AAIMe4!NqLRsO'?\Qq%G?Z2R ANi9l ;M7~[bǞ) 1:R4u=iS@RئiA4iHR`\RҊ)Zwji9d(4@Qfh)44 B߀iTfJN %NsE Z3GZJ'>\a$/=j/8TK Ӆx_ܾ&> yEq42@mww\.>'xᵔs%Xsv2߭wс( ?4l@[ÝϧoWx;V1嶩cp̀O#t2cV0z_xNu]Bd_-oi;*rx?>95z'H"couuz{,:YTJ?^|V]6,Q.=O&GJPx"^gNM!Ҏ8f9&f5dQ(2z3F83xA^:I4s$T=;?w'<(^XIɁ>@)) #=d01 wRc=i@IҖi˻J 9t,J0zՀC \( 4g4'.zSYKqޙHr*7rm =j&a*07*xnĞ Ų.ij3F>#nH#띿ڵƫnLs=`pmz1: zPEF8jqR֐FHnzSӕKzќyAzSRdsKum(7>ԽSrsȧnjv1F{Lvx <├SsKE NoH:Rs_B< nTE#t:gsq0穿c#?$'tMv̩/#C7a~յ>$VNIʻV|^Z?Dro$q-ԟ's߽}E-4Ч\@)M (( zN4ga;hE6bby S6sOFPiScӳɤj!9p(zicQ3WF4斛'< )_;'|'=92$O H9^8$ ʞ'xf݂vzNOKO'|g$[;,QK+o1?#+g8秶cϗ Q|q4Lڔ”(,hVJzTG975y4hg3Uq]ȪZlJZLsPFi{%>&h6nf{n@}+4vq麵#s$$ kN߆دuX_rV%cnsOakwi- ܍w$m] UwHrXƀ N3MlR✽ 4PFi"i03K Ni)si_}))jD4@``CҐ Ryl r= <;ҚAҖ#4jB|Zk:=ƟnLI >9 Ͼs_C[iQZ ,*鷦+ߋ~ϋt`p(S, kNbeCΥNbFzd_Jdj9E-6:Pi C /x){P)))0sKfڐ#;qHS+)x_#|Q< p4-{NF s{^4s}x>ixݘX+V=ĖIRE,Y3X''ҽ QKM4isAŸqޟb4 SOyݖ+ȏi;1H}@U|-,.|۹y)?0MuTQތRRf:Q"Њw斊)qIF(!$ŷ65{Yc]¢﷯arr9?xյ+c}mn.2k"MJPfq(h")H䣡 s+떞$Ь-mwuU= pAV&i#&cN'4`JhL‚iAfFy'LNiiۇg8`48֐. !& $^):1Ss8{-H\U5F. [iٰCČ?d:~= غ3.?S1J|C&Ծ+(O!J4N>8ncrcw7_(Z 9,V{⭡S{TA\1 5 lAG@'j`{R:юjNo)ϥqڅ9$RJLӆJqAPF;vʗ v4iH yzu (Hǀ:{m>[ɒ hTp5ZY\:6q*yI#{X7hQjS,Rl@1ȤhRXI#u =IElpLӊP.AzSqQTu#OttN+99PG r+5OٿJ8ٳh25?wK]DCGXpx^G54X@zUQqw \4RU988(8tAi})bzӁ~4Rq88Jr:$c8=("B $8G5_=bcA>_T&7bz+)<;Wё[QYC 6x/xH𿇟o#0$ϴOO&YbX'$*b)pihzR=@(Qڀ(@ ~5~$mZI7Ĉ>Ԯ0W~d7PU^}rŮ'ls}MnQHzvE)MNQA4f׈xm+N]Bd1}DH a/}GUyQ^fTgggCx=z{(ZSғ$uRgv ҥwR;P &ynڹ?vByy音/-{6}}~*Yq0I N.6o/??phGJvx >E)(#t 3C tWO\x|y3Ɛ :nyNqS'/c[K ^R\ 9|e)C|]iv3adOS<s_F$d`XCOM*zqc.ԴAN.x(##u 1GGc Pi>c'/ [Y764nLr( 0?e<-sy}~ֳOO>0TMY#6,yHSϗI;&fTE\LW@Ssr(cNᗎͤP }i|d)ӊ(0(iA4`3'>F4IZ (HM 9ϵ ?18bzޗo!y>8~NmZ&)2G'L*_$z} OP/|2hnʿBcO G5Έ# cCؚ=i) pi瓚Lf/IҖQҎ54yDk-{MJ$C$N^9}0?Saf-}gk|E4mCVWr<3zzwjJ(Pi4)sFi1\>#OyfBY˸z*8-HF_6? -T\v~UT}?U*[쒶rv>kRH;4J9ba#ot[(TxZ[Y~FJ1s_Ih=ػ_i@baubþ)j>?kte+%|mK(=|=.3IV ;X,*ӣ"vE izQE!ZCruI4ozEO*pT<5~Ϟ}Lj4k1)&n'׏ATI@7ͧ_K]FR(#ג~%|/\o1OT{t) GQJ2|mii2>m(đ7 +SES 'zu44}^Aᮣ[Èڀ%6*u#`i0 {q #ݲ?Of^j5[Z؋=]Į|Bp㩯t Ú `m#z>O!Gztbr .284Mtɥ4c)zRdP'6k-pu Bkd W޼ݼ}/v!#6/R'$t VqC Ԋ)$ҁ\Q\i4S@#.90v{ߥ4`Ҁ9P:js5գ❁ڌZLnQ4 dS[nP:h?6{Sd89G3/aLd *NsV~^F巶UUJ ʼO=}cVVK d~_ׯ\0ۯmoEI.b"\ub@* [2 a8yF^2w~mnej1O)CZB $~|<*ہg(X99-մn1piԑ߼i]rF !F194*iIdb_94Ax/=(bnM֔g=(޴X)#ښnR{S*0sW~КmͶ60ͧz])IHAP^{/G x;]10]q'<-qJ1HHڹ5].IJ^ԃKE̶zS`AKJ3E) S 2 WLE)7l~tR4 (43/ZLfi3E.xwJG5‘< xQ{6Y "gFqkn.7jIV@ 5קQ♧ǵDk#*ɡ}^ 4~09;?4SCmq&8@8Ix~S׈R0XCx$G׸Y[ҶRxS*V#5`r($RMHz HRwsҟQ9 E4.xM?1ȥO*`Ӌ VhY bQy7įoRwÖw0I tUQ rIǛ]DIv+5~%'ge:{zc7:fnw H۸#Ar x>j7so Ĺ-9EMϏ-x\7$6۲WX0YB@8A`6)F3KyGi┌RP/48- 4 '+@+[s ɿQ礱D@얮༏ E붖\c霁ɧo9E4 8qC8PvI❎3M' K!CCÝb#-ɉed#!Hk ,xtx[PV6V&G% Ÿ#Ǥ^]Bi%mҼ;s|@e6ٌ\=г~q_GsSFiX[,1Q#*A-7(Nhc hldS ٧qJ8i[ sh8NzR)h@fd:#[i%WBۢ{n>W;4I q+o 8Wv to[_I%o*ەn,3=?,q_iֶ譭YuT>&5-^71Z2 #@'?L+KڛLӅ6CsBrÑ !#[9SRmnAQE:JR֌RIN<c )Bswځ/ަ07=st.a4n?khB]2!fvfU =kLGҠӬ$0F1~5k:l:fT^GAfKiDR 8 0, SZv`f4Ojv!m)(#"8RdM'4ҽ{Һ8;iG4ZcdP>f;SvF(#+QI s)q!gD|Ahz7Pv3P}q2|TsC][hvZu[Xo8hOJ# 8O[ 09a6)9WiщbpW!8*ujLJP0z5U+rM^rE!<#ڹ_پK,~Bܳ`{7!x3I-H4;nV71v>JssFݢ SB9H=)0I89᝾h9Rd`b{EsA4҂xJ:P8ҌG'& T$fڐLbuE.qIڐ4(#\I(Ji)1ISRusvEnnzPp:Sy4J(MCk/xKms'ޖy>~}Mhq\ǦIo$2`s+)R: (y4՚ rB!GdU'8G[şOq[Z6h$<)=Oe- /#\^?ƽ:+Ğ4'I;A46ƙ;pGy)6^=7mhԲn|'>x x_fc"ƭ6<{s5N %Dհh&A4QAZ)h4fSM4 Q1|SSM4fgg4QzE<ӏZ1IҌPE40VZ3J IJAnPg;˟ŸQQIE֗4f("KEQ֘_A "RhiD|ҤVVL@I>ԦqN A`Tj' 9 )SZR™GCE!RE4)O"aFsnNER U}T❵ mcҩGyrgadFK wn(ѓMR;TN$sC{R qHJI(\js 8c0p={R)wca֫\=9QG֋)fSϱGn7SqE.H4s1A4sA8i+F(qBi3{ʜ׉|R'_+#Bx\ݽF a:-kt2B~j+3K}KyJrŸ́'dNySA!'&C#)`yTp2:Ҏ'җKxšMV/nFE{B}O q 醯;UĞXao 玸_AAQFM4@HӨ#4)iwծ.#8uA S鸐'[<:lv"ԑ^CG?QF9wRPr(h=(^{Rj:>F"KEd`j;Ú۴ɏVH@iۂݎ35Oxhϙ_@-Y2B} q^J-ټ8\Ʉ׶hci&skhWA4` 4R J\RQIKJ-H u%"u,i=ibQ6B2( \f]F}9 qr On M-/c^eIj3AA4m.HN)т=jQҊ)zbq@斊(oz("qEF7 4sK)6h'zv)4ƙel J ǽ&i94 Ҿ&ǒwYﶼ:_ Y,%A${# '!sq+o?H#`sьN8#k8p?)h M?S;Ҍ+񧁴iKgKAqHzp])-P-3nHU ]Xj!ӻA$p09kA`i.NihyPăJ>aMۊ)pҀqF(bo?t?֚,RJc&8C Мc$ே5y4ktQPP2==Sѯ 4ݏl~a} OJc)sM$fzf9s҃Қ:R 旝h4_;x${|m(GiU]".lKd< VN9?pn~xmGkvC!JF"(9 r8ݨJq4KE 4 Z(5,ﵨdRu bsO>%xGiQ=}%Fw XI\xA8Hh4fњ3Fh4ɾ6CwXνa?'{`|xw1ԥM.Qb^i3М'.<.+n .-ai z`ŚR|+Ť:3=v)}Becz XRcm($IsJ)s)ȥ\`њ9M4d *9Dy9RfC&)⛰$*0cʒi<ʩ:f;zb'M!9b* $q* ^#W$401Ku˨vy<Ѵ1杰btJ6gktE;~)ҤS1QKI[ImKX[k`A v#!TIU㗿 rRK?+vt+|@=Z}2iWҰXgz(p?P39<IiM>sI/4 n@94ezw^3>Uu9.Jkly1gN?\W~Mxz d})1!Xq^oFFѦK>eE(2^]@>qM8׵+Rqu4k(+ǑE}eG⾀AIo 3:P7e8 )wRfкkV%0a5sJ)IRњNyKR{RIZLRAWy߇|?kb7&VGc>W~{L ru2{q#$pg~LFy9ǧ:ί,6he{FvtW[ qw[) e2鮰rҡFo~g5ZLPiRQKJ(!Rwek$1qk~?= ڪo]L9w~y>a5Wź/Lo &E-I 7[|LHW;.%ǰ5k곚^PF{ьQ@4sJ){RZ)(nhhѺiҩ4LRN(4RgӏLM'Nsڐh+@i3i) (@0+b!Tr/ ѤH]PA+C?sTJZN|Q,J}Gv=1MпgN}[Q6[1[!^[[C0D#5 `T_֝kV)d wo$ e+k߃~*MzA4Ӑ9tcdcב_AEwRw4qA3;P:O@+oj;.hl-$HL²,c1W-n=`X[jRB(b*2 sMsH4Xԓ'<%#)'pRL[8 ȧug(ߞۖԼF3_;|D[|n]׎|%MsqBǑ+z+6=I"$+wڡ-ǜ/l~=+<5?z VrAyf=. 4cd9 R3IҖJNM3I3JiE!A4IEwv xz$~[FW\gma-bHA x?Zs",0ŷ^ORp1^e5ʚw/J9fPďN׻/Zu74viQEKE6(u? a'lFsaս,7* dzA#N+ƟF- !}HV#bI$?߃/ae2AgnO?@5 QF)李)#SW8R␊JQEbQM<)iGJ(^ґOg@4`UӨSCN&qH֗ғsQNLqE#8/+*^}τ%kaw`oL8;veD"yB-X.A޽[?[to5kɎ]s:*3]TNFN8L&9 sqM#4Ab)֛# wnqJTd`cMq49=V\SN+ pk/|)YF9|=^cO35jQgwQ ҥ?w,Wu4c1347@>a{ǾCca%=8M&?֫gc~R=^H4Tȧ LƗ4ڝac!ci0+L8eȦa?Lc1MB⃖\RQvP0(󯎥KqcrV`TuS rq=s^owxJIRX*yڼW4/3ZtPtG0"МZ']";G~( ;J]X;\3Nڮ26㎄⾃em Wܽo\SЩ~N4OJ@M??)zSq48GZ1F)qII8'4sN.Hy (fA(@xFƾHʆ!TAч V6(=O;ϩKu5[6o0Y T(;⦯+nbcڴad2fq־l`f1$R/FR2&ihQ1E!4\QE&)@qs#X6Cq: ՚91Y${~ LK!g'iA@UU@0!#E.}␐)$Rg4gPuo4OyQ#R )qGJL^(u4b4Q((piq(#"= .)Ê$Om Bj*Z`B{gkºb#>fYτ>8kxO[9?F&=PkW9jRzS4M/`*㸧.rݨ g&)ݩ0 ۊ:qyȨA|vf 8G`G|㿯?JMX09^/s_vm{ז8 ?gRl~ϛ^גN)Z Jk 9)#S@qBQA4K8ڗRS!{SyFiG=E8ʛۥ(9JyiKMNց+qH4}iqC$ƚ Yj>ɺ D2= 1Zv?2f>xDվ1%ʅ\g@+yg{r=FEQH?z'ڎ &98S):Ҋ("\Q1EPqEe'Z)E!(=8-#<,P<+CG~}kMn+I`)le~-l|-xDRH$Q෩F>IFe9 "7ZNzL3jXUNA4f)h4eOLRt(odn+=:["hcMlF>sA_ >Ky).1:&sJ^h2)jA یi3#4*)cSOIU 8n'8;i\L.A㡣p4>\ԼӂO#M wg5!U0hށR*.h?7 ҀE9FM.Ep~5\55 Ix{{r1xdWiJB]bHW~1^075؞5 Hxz# SGZq b=< c_zM^-L< yց t/r]Mha2*C3zm.#3 `y;GSҽa? ңq%:Q `zR҃9p*9c0n~jV=>yROȠ ZQEw4izӻSs)44CHH )4◥74u&iԆ3AZm8R0$q^3lW,c(2 Y]1U9g?&&'Үڃkj!'ӑMPt\G69 $$ ׹>_lfe\q"21ǰ+)AR*/9=iI&xI@ <◊:ъLS=hюh. m'&1*HfJx/j|;L<^]f|9 }k'e]me$#>q^{MFN 0[OʤHԒzc|x_V/kYJ!būwJ(iZu=HM.1F(RFsIih4UEYwl:J"Zv)))qB=(5=3ΧbzS"덻^M⇇+?hvYT*I  ^Z{3T[7!Cᔌvޒ<֟ 6J`(v@KHW4;.81HмGRN]B2 N>hSNEGOZ|!m>C Įc'rXq_M}F]njvhnAI$>"i2BnCv3ɂ(=d[>O<+#vOϏbrkeh4d}ړuxu( 摸<~A:.#ґ UX8mj)0Nri@KӳFI +?h&L)Bc|?~}᷇Acj_x"hO [጑]}%ʼn?g-y&pU9$ \4ځf۵4T& _ 搑bhy4]I<4ciaNp8F\~@aG)0u R7ױr}>M43{SYzS w%x& 0N܁T/e*{N\EΤ O4g:Qqi7rJO6F pf>"iGؤ$vC6;SpM77+uz nJPx ΞE5SC`Mh{:Ư*Oola$?*q"kுn H#԰F[==pGhڒ.H݁<`y+Ǵi &Q$Az}HXGDmǚVK9dUK0}j.PgU,n)soP0MlHXtTTךBrhjAǥ9ERu4:(֞#4c<F1K:yy$c+6Ngb|tƴ{S{P3Ajz^ZGJ+O0KE` 2(KH Iu4-Rs^_xBڪK^P1d; yx5km "KH0p2LtX ʍ$Ms#qM}6Řٿ(0A5v@xsHF~eչ9Õ>⼲pu(̎p1|> X[=?d<=Gܚ"A~>T+Dfǘ$U/Uִ 2+IFRX {uiZ ݾjJRR⛀iE/J 3(Ҋ GV)m֐F)8qN7_e.ɳ,8kO2xZ[\nD6jϕ +Տ]w+NHaMǠ4Z;w4ړbқN1L#JTr4PwPZ)1Y>'嗋<9w_&X{Ҿ}GO~\K+. 7>SS-K\x ~Uy3GAg1ɬ^cd9Xt@{kF)r~0WFߚjLbw!apM*6'MsПJqD Xi8,H&9S&I4&8$l\`Y0iLazOLbwS9go4"~ #&RqNF)ȼӆTrASRpxF}:֙ fYf1դL:e]b=DŽ gi-SH( u;kFmBh,UF0I$ [X_ޗ涝`(_6Kh#&x@)#0ܚQޔHu)A8\BdS4ҨzŖ꺌+[XϠ;+㟉?IRid~ ;oޖ/翹,b;-7( 1Qzov>q6@'/'A{B14ЂR␃@"Rc&h&:fL`NMԛj~heoZpMKh'NP@"qIE(4΀ i@ JFZG{R)HJfږ5O+.i6@ ‘I=F)zRn9(#E9 DTWοnL_W[SxW֟O/Ý~=Uu9c8`1TfOWC⋞s=E/AIcbo=h"\\xWfUoV( ;=$ iGWQg0C1,T8?y#>W줰6͌,p2! :zj_Z>,>-gi pdEޒrA_D -/Z)K⎴֓-.}&QE YVrjPD2T~&]Ǖ jwy[_}xW7<`LzVFMd5qT[%{bu Z/\Hֵ D[^\:) L:#٫r20z>!˥i tV '8\^ρҴx?:5#]yA^CէR_df%U 74~_mOy1^=: %n81U7$sQnC l9+f~[7 zu}(K;R(AH4p)ir)A=h;}h4M&xi˷b;E&O\0#HqNR4qֆc4Mrp\JF)R:~н{Q_qQ449/A@ 9M\uFO9gbTzPFPSJFsmBoXU&Q4'@ j65w#r&8P܃(cp[w#B SOP6{ThH~jF|p)ǥ9P)pJAҜs}) N/ր=ʼuGIN./P̈́ۑr=s\r|55?[3I;5 6]>Km29igt?^9,wt9ˎS8_lʹBH3rqڴtۋx%T9j1GxdW.T\UeG9C掆9=i9Tӏ7Rix7u8 iKi=h&<)qg$@=h8aGKKIR)sFi3K֐@ :LA4sO4)0Oz1IKګ_j)sAӜ)sހ9ՁPi)iE⛌S3Gj-ItpHi)k˾4|=o(_V @8ʌG; mƓlW[G!))#c9T|IWD(.ByePNrq^o\=8!(нkϾ6i2 /"6[V*·, +ohm:N7X euc44pƥF I< ^WZ"2J_oX?) q_GQE/(' &qMӳ((+/Z־Xl;^$# ^ciAu.)f:sd C*ܦ^O#ཿ/ִk՜"H?u1H[g8霚[IxckڬXt"9F+ͮG JeҴ`u\~6Ξ.Jeؽyڋ]+W8ҁK1EP ZXV3Z;Cÿcڼ|O׉).esq!//$ r[)(̳H@z ^sꗄKx)@GP}I]AtAh=i;ҞSO4hFw`f8Sğ šIXm\aHVeiwQ-q9KwWxgĚWX]"s-0;A4h< A h'47ɧ6aO4j7jg43Dx`ב֔wF3J):kPIV<ӡ\& Uyѕ_hbUcZ ;<":ԨI# SzFM8r8@*.sN`ݩ.M1[o4搜р9&iwPX5.)FsNHsi'*(M8.њ|ќ1Hiݩ\Ŀ<u@T^# R = .{fCG[ewZ1Hc8t">aاuO$f88}E/0K}-`H:p, #=z^zSzӻRcojEӁ$h-A4RүNh$SqKҁN5l5=HqJ9NIP[5xgVIMsF1ANb(#)iPi049Qi*N6E!*EHh$Rfp4g&4@j:RP!SIӸ4m)c:q6&?jk2LɰAӀYERd9v(Hx ׇxXVtF"'y@ IJ[k(G 隸T#HdGti cYX≠+qp;d$NjB(Qb:MR)ҩ'-W͗W7es1-4G عDkxҸzŮ4ZH&r8b*~XM/Т vŗHvfּo?]A:V)r/Pqtג[?jve[w)@r^>}MiQJ/(&h&sKT7VבxUmimg(#s@ޟJZC(E׊ҔZa_5C\8;fa!p}A"𭏆 go_ge˄aE=1sj-47weJH8=r+~ φ>.JfB!n69'}O&[T ?@pzR4Fi'4)"OZv tzs뤤cG֗ S4}if6F7%@93m_z˞I┓L$&2)sN:B\8ی.vE2^GO.1ii zA()%g@Ҟا,sF`nȧo+Ҁ?8> qR˞sN1׊o|ICJJH|eOƲKqg݅X#P{yu>?"jEDTl" ^kkJ$@ +CwCJ@+(PT3J8?{c#P6!qޕxP)NIv!=)H*Pquc4g'&=E(P .2zр:@E/@\R^i)21HxNޖzi@={C)ִk Jz\0f ܭ͗m3LT#y8?Jס>4= ƞ"zX)ix`4XzR7Pi@4ԁAlivv\ uK9 9[=( M463񧃑K )8R(nEiRr)h8> Bq@$PNF)8iƏ4R3!pOCO4 -/qMwT#&HiݩKE!#'];1m.wpz߮A*<7iF< 0T}jc~{ oz8,VGoFr;d۴~)2A5hN p#h4PiZZ)1)9hEfq!i‚)A⒃҅+Ryƿxg eH0PCcbqwF}k?jjI䠸`)帡dTW8^*M F xwBڧ7>rze*O䢽zFo@# hFVWt;kI#d? |9Y&8nD;c^<)CsO>JoυaH;NsNVJzy#P)J.4 4QWsG𯁠?1A5# C fTCUyɶwirR_2cv/ }J!LґISx=){PMG#it~T9bVH)8cm\(HM&&4 #b>b=h8ŻRnpGLw{R6=PޗҊ % %qңTp$TG8RюsFyx⚦ӏ4h" h89KF:qRr>*-M@}$}?UǕ0ԬT8J+]J+nm\,NX{EFF¦vӱA"8PzR Rg+@dN; 7tSH9ii{SM iiqޗ4D@zR \c4mR@8CKLRt=M(4iL}iST擥/R`n4r9#Қ,Ar)sNLRHx1 aђOJLGޙLYћX}EKJi=i8qJ@=ip1H ;t4sI^_⟁>ܗ2K\.-4L}vڰHd5۫ճ0's^ciieVp Gczrzy&K׊LzӱMRJh''"q =tnE&0hrM^)Z(֚ SYr٥?w)9nF{A"~jB8ɨ>ɦ1XȤ$5#9G&`=GQM Q^O5x1ˎyꍁpiUC=)O8O'9vJ8+"H\p{Ғ[R#yG]ZK>g>eL\{)~ ^zd1Po9)qc8cxΓq\f3 YDDl08s~Zv]Ԩ >jR zTw)\hFO[y ?(4r1(8RVXR:RIL>n1A\w2SsH@IW9#6($z0g"2y*u.7#I,ʈXȯW}wS}vT*Oލ 5gB$ o?e-#:v^J(e)Fi  /Ӛhs44 )qJG'4'UM;棞hmy"5,TW w65v(* %i}F48o,G+d8q)Ā0('+H=(gOSԬ2Q&H--2K!>57!W|f8ќ#N8Xhơ l"m+w{}k]]Zc'O88GjGwF>Rp)ɧg&KMv%y&{Q'@(&z]PFM.(!<ѓ@sސiM&z$} X?$6ªF܏1";X{W$]g Y|Y▖.'s B<ysקaCc&>I쇖}} ykO}(wp1DA#J'4}LmQڐPh##SNwOh(s~k>CVK4o4,z vnt7Kf̌<?Tԫc4lfK4EO۴ziBzp[ Jx GOldM5Y) V.('IS`bsFr1`=i$UxV 'p\Zw^ |`][޹ Pkn>:|6G~-s;վ3N&k]Oe$cr=e؞}'}2j\IZiKiHd$`qX4iw`xqNHizPsLu|KW{.iryVHoGB {P|+.bN:sp9kg~jV*ɦMO؟7Io Ivg; {~@t5% 8P*>i?m["unS81'+8FDWk+ #Ҿw[zǭ{H*-?ҠDV$*}@\s_EQig@848vsJNF)R.i4bQE.sFH>/< faVϕJGP"[߻tR?Z<W~6ZZK%@+H$7WpiAu;m4ҊBi:ӂ҅.-ŶEXg޼_ iIqnl Ȉ9d@=_'$4Vˀqu/>Ԯ5=G:`Dr]ü#-^70):R4F8H(M_\>!h~WԥynfG{|gI^n8ek-{WxycE͸I9Mh斐Jiښ[k>,w9]q"m\t$}l" `S{2O Oi,-r` >{φ_ Z yiΫY?Z$8u)'A֍Rsڈǩ7րx18)SJd4^6GPH#Ҽ5+[:π_1fqnҘ,pWu&'oBtkRhlǸ%y~bH7NKcdzc֔@├m;>hFi#w@=;6RoZ|r?ML6g>9CMyy.jf+{^YRJv})AMGzVJj|皗h;9ۏƚ4\NZ24@/ޥ<iqNa dRiH$Rd1^%OncoEGq4KhOݳ`?ė"QY%VBz#ޙx QoxYn%s6O }<)4Lee9 "rVCrx48ҷk̾)|*OZ,V stGBCϧ<$ӣD|}Ǘ \1sX)fۗH6 i%Q z3%D#UQUU 0sJFQzQֹx;Ŵگv[X̒]nh"9-|S&e%^f؎pd2-s?]ƿ|f?rw U_>"HUZ-ͶFSOA8CA(i{TxfjOZuڴ*񫅊?a|!K[{xEڱFQGW#m SJ_Pi,]`P/̮$5.u] OJ7VTm, nu4KA_6h:? ?j˫hg$G ϡb9Iad2:u,|)Mպ,'v*qD80=EztuEŽI0->ѸgROZp0*#i7))“X֞(ih4c@lRi8Yp,y#ySH搐:҃N%.(7sJSX~%~!s1[W-$z' ঻0Usnw^H6=WvFySyS@5xQsF1MA=(mȥ( /jn9#4db9ԃ1KIQQAHM(QRGBhRbc3Iޗ4Sbi:PzRSx=(>!8Iڔ1F 4zS Gz)<6d@)LS*(u!}u1(`xQL#&z)»så&1G5&x3(z2ig8" If#dR)1ݎ8 li_[P[DHsQHޙ< kZYae'rI 0F⽍eVJT})Ğ:5am,GQNB+6a7iݓN$"bMH܊L4+9ھ;@^dS Bx|$>tY<^6/[hct9YX-|1is" ˬE\1?⟅?i:>i7M;s<, OZ? xC'UǙḑkknXykk+\BsBhQP9A,FqJԛF) $ ~4ZOm]< DϺ)=OqF [E[g]4nq_=|l}uM+žq4sw,7ʨ''kM0hKhB u=3N&3A&ԝzoJ7Wχ7cR]ōfĹ\^Q +|UnsEpz5λ?|']OSCm#ـ9,zqIӏJaNsVnA4t#fv')1s=2=i斘G4`R(PԹ4CrhޔS7Rguk,Q#Hd̾ ƏgX/M|NO_ų^/OMcCTLpYd<5eySVO.~P3ʹ# oR+qFxzӈ␝HiqIQ(R1GJ3Fh&isAQIֵ+v }_gl8 +rGV>\g/?iOKA]i_iwڿI!}>jJ){SiiEih(M458tR)F("M(@M5hhcI u8)T+7W:`aQ~z"+aS;BSl ٥cwJFK7p?,Z\N}X|+#5۩>:͑:#99Qj?@Sh9N)SEݴR3:r8ڝ90)Q4 HQs1k]O^0kKkrJV~DjX[}ĶFZ.}$I-|L ]n攂 a8cܲx9iv)GS6PIv(iH G|7zq HY!wǹG&6$\4z_buh'lƼ>_y921;g*txJM-4<;&GPzp>.o"ӮXiWVCyk+H$eS_L !lHihf#7ҘE3mSRjepE E@S%'j@i'xDtdg)W=_#]Svd$db-o㯃)'WۼJՙX?3jZ`1`ܘ2/ Q>8砤=):1k vhNQ.!HЏckɤG∌]٬aoKxUV{X)_̻B0v'Ey<4SJ(FF1E7.3HqPEF4CJizҷSGjAKSXsO_zq8I֗c M8b{ǭ =(YuozpbXF+kÿg-r}g,!xQgukuS?C4̶2`*s ܐ{1Kғ7gJA4E ֔Q74)8r((Ru4'.))(4ו"v 1=t}7RQgIB 2H5 -pOSுE-cڼm/.qB[p9AKZL4`Bq@9#h␝њ0{RdRG4J7f;q5&h4ǥcR/ig TqyaSҧ,CL N; ׀~w<=`L<3|~Cw^aALaXcQrIMAsiK+T"V85#ڛ[Px(1*cPpecP{rHg j"z\1ڱE3u~@NaySKn<Ӄ `R74ܕ84SWiX4535Ej=j9$C@ H\f܃Fp)i/8^@{YM@daޘg9 "Nѻ4&xN-)?Jnq5u{öbITuL]<&!͖u w ? oirhWZmͬfVHIro@q^!)I{)<ɴ'ߒ? C==j%psRxf*>QӇ$>໎I"@(Xm9H}, ; jP*9%g֤`?!h  :|a^y:E*lKרVWgv}%[?šwQ0zSP8x(+T`A9y_[]:MOڃk'IRWNm^:-I|u㿍&ZIK "B}HAc9ɧ`SHɥ m5#îElx,zcqɤ'uaO axPzb\ mkIUY1 N+N9=2n#yP~3ʣiABP@ 0.;R`^(Gi R)Ez40RdP!ӀJ3A4Zi恑J8Rp2)=)ƐSW5xsXR9e-a;GA{!kBx.*jɜy[_ߥzFXkZ|we7v6#KQI$.J#՗nOa\kw){*]I黎 Q89v\װ.sj7ǣWJ63K<Ҁx)AB9-"Pƥ8&Fz9M-)sNRQ^$_EgW\EQiƒ{a2H3Sx7 %㷑Y{û?5k7=o!P@,=hf Q2d]SySJIɦdHzqLsUlE4 #rjaVgÂOjkɻ3pZ\BQیCc17CP3rjjnZq4wQJn()AE5٫M3Z6j?970C$MOm[i?җZݶ 'VIahaSw`@}kཛྷjԪspU $~8 2YEX'f*OҤbǠjT?'5<}9f40i!sqØ7?X|jS1y0:~UʹWv̡ :F?]]X۽ރrCɓb>$zEt a>T5< 7vx#\Ol.6A6"<׽;lKԻ(E qM9(4gIMa:0hcJ?~ XmcI~! (qfoSUHq$=>3a{⨞ɩNW?C 4E$+^j-ӮЫԪ/a;qWrmsO!4iE)f9M4E+SE(a KޜqL覮iHG4fy):PyrM4h98S4%8g4m@=+#=`yU;>]!'Q|[広%|LBT1>'6bmolvYm}w63xRk.He8az6N>ƾ)E (^Ԣm-RqIKJE%xG)U-FGu;ٖ [t2K#tsE|⏏%oxx.fk,X>qkW<{ml5YRcRy댚M7|=wݮ&Ku#JA됤dWrH=GJnhw>RQJoNdFv*/P3j~W-]OT[+ Nb61UjApZ9!!#A hjhdtqTc_Bg ӊ^1&׵70kc 1 = xT^,]]m-.ل>2wcrF=ꯅ|aO 쐵# 70g1 ~xZyuZy7%= gQ9UbxniF61Q41Q~g4n)E o"$qF}iWsHbqVqRhP<SR#5a8Cj .I`WxFIhQJƌ8 pK`{`]=][vfsmY!$ہڽ4crMbulqXsx?V 麖$Vl ;ß4KgXkTG5ۮ|9#>np1\JiON\,' ν-3N4٥4cpiъ3Kڛ_7_Y_fKIL0LP!1gn?\dF5LwZ/YmeQ{H\Q!_qڇ[$q49?*;*kɦh^Ԙɮ/⯄nt0[en7:mbTWwe{}_JgIۘՋ(=щ ޗ|O?51t,n,85+idK$DKG\O hhkq :"~_BHlLWZz[4.vc8n”R:1M/֚Xt+Oy㿍 [$x $|w;x>zG3m#@hՙϫ1䟭t_Fhv)JN)RN( Ⅾ姎`YdVaCI=.H> zNKڅ]n G x|c^kg]R[Ě|V2<D3$v⽫ /K]zl{nc](){P);1O>dW# yDTߎkK+]*'Arf>wkkmg("$ 5@"^iRT¢ 'g~`^ԔPh&4s@MHS4vRюGWΔ\q>d(旭4 ;u GNc4dtIR4 Z1F(ۊ2(dFi xJ^pM!rN)Ӛ`>O"C4)@9.:W-qG-p;m4WCx<*\Y-yr|5uvT({]u=]xZI y]ĞH$W2)ISwn MT(Y2N=j'3cL9UgzNj6b)*-'56M&xJOE#W\)H䊬d9 vB!㚆I3iI5`* XYT$ҠbXJ*N N O OS6*qH9Q 3VdqSPz OU-uİrF+Ƽ7="o s%JCvݝIv.t-BP/<2zvy$BݗOo5#`"Eʟ֙un&G =U5|8 ҷ=1Iu8qNP}ihM!&zB2)@ )sߵ wZJoJ(4JE7QȠiGF)1.x+H0 <)6!84P'g=TzӎJniN:c4-!ҁIi3p>)3FhSӳ_8xgO`)6TJbÓ}aw60]Eum*%+گvnL?4٥1@xcfҴ73&=?t}19'` PM0ip)'8Rf#Pz✿0(=1_zC/ZJ.)(4P"IFM/Z)=)8v)q.3F0)P}4nݚNh;۲igҐ4HyRfb bqRg&8hz'߈X _f茭|z\d?O % dHFp=H5.xo[Cè<<Ap: LfG43O+҂xQ9z('pQPÜE+#[W4kkAGzei ]-žʤ3v#ȝUsi `n&Jg42i@N7eSxs}i^ 2KoH}YO\'e=ڭoC4aK6?*O 嶜5Z@Uپ5`䌞߸IN)  Ԍ0{yn"JV⌌`)pF*@AAq(a#bNP@4 8CRT3!8^H:R)R旓Fh;F$F34ԧ)ivzN @:ҌRHN)A!9F/ZNnFP9?41|A#Mx iF63':Ris|ڳ4lRKcK]*2f[i c篵?nL8A|zE{ b 2SpO־y_pK.=ٔZ!- Lt{(b@;gw9+6LѾ!xkQVw7V!@d q=GY?Q_n[3:88)1@d;旨ÓOPIxKK4NeWkV`Yp$E r@9k|5ŸitFD'=+}"FE 4`{7 գMv5zFZISƸ/*9$VK4998X$g'4|SR2)q^Q^j>;3sINԓ}=j¶ѕm}zf#Pmiq|=VS4d';i)8RiõYA*`bQ`(/T状naINҧ*ڜ Fj;t%ִ\Ү:Sj֤8q.Apir;8NLF46I✑?*^Ê3Ii! QHƛڞ)Z_NQqKoܚw n[9)OfSZ@f ($yֻZ5ۭơ,g } >]Gi wR}ȯS}d}jM 2)qEp>'i(5+- 0\ pIǖ[⾩jfF0i<"qץ0Z?RR9&iGxϋh'Jk-#{.,KxKO+S=oꑱdh)״xgOt4{:ݘ6l:Ǒ85xM#U@$RAL4v0:(KFIMݚZB'?(9PE&hғPHNxUx4cҮ{t&FsE&$kO4 fbgʁ>ieTsMym'-[_nO/-q࿋i-5N[^ϥQ;.(ۚN("E8"9GTwi3&4㱯ǻm7RJƞ5;s(L"/ZzxI9u AFm,Y{mGk)^& qo($gP{ tJBs>X{4ncE.7(+gz×eK4n1\jSߴ^C,X &eP40X_F)֜1Iߥ&WҜ9H4إ#H F$n:Z^7hKǩjlihǪ gt/ 9mEm)6o*e^Xm#L`g#ۯx6KMB_6L@+-xaa޽Az-.+ ?UMN?e8Ԏ8{]Btv}Q}=>?xzoi~,JLd,Wjjyi]A5ءyN383AqIiJTMimҢn幩LS=iG+֜8\Ss|hY4Ɗʲ '&m}~:+{qǃ5I>Sj('k?{!c֖$BM8N;Rsj0=( /`ڌԤzVn.^`FN~|ꚧYkY(S < H0+y(ލ[ ʠ סx⾷ мSk}-U•ӌ*A)b=Қ~oY̳ZF$EyJF)3)Êiw^{\CgwyKDtak/#ֱ֚ɪ߃()gh✴ʁ:FB $gO(y#?>}W|H|:}M̫k2݌yAB;Ԟ_>5i nQ07 5BqIN)E%R斊)z @ /ZiZUni KMњ1~-jSh_ iZ9Dx#{l)j>xVI5,̠Qھ!^=+ԦK]J9- Jǡ`׀xJO~2:qiE&}vѓk!C[?Q֟[iK1DԲ:8GJ%k{VC_sfF7d}a~UjsYYBQqyWpsOzF^.!QځJ[֐M)LaCORydqsVqZ\dLQsbޔj91*6n@TGi *T,ѣm43OĒk@`QL⫒A~W* 5O PueR\G)URv*0ē2NEMd,/k*0i]w$(yǩ=yuơy.&KfK,~r=o[D o )37xWRּEuOtۥz;Is,~8`fDŽoǷֹHW4?2)1şmέi84}Il qJ*Pp)4&y;g'9D9KQze~R0'j`p)5" 4iHh^M+Jp:48?9iTd@(4 5 x{[QtRowʽ?vt[Kđ#s >Ե+PJdaT =q_~4z0SG|dyG>׷4HI|խ\]&>=ɥRI.Sܭ=L^o:&$6]fX}UaW|V?Ҽ%X(U#͗@\ǎsdgKw+;Xf^ʠ4NQKHqڑRM8ip($ubjH ;( p4T%f|s؁%_?{ilq=ųȨpXcԜt{kC6 鑐I?7͖s85ݗ=iX/`_ޑ,ܟ˧jh44 S98|SIS|SMKnp9ot6v 5xѯIsVD=T~uGt8^+t iOrO$I̋U[K$.~J6[ W>½ tԥ~a+% 2WzS?=2ʤMns|e.|GH{WKQ;rc7W7O&u[_ jVA!3ǒFx끟k~)/c%Aj2㢯R~_[r4vdGc'ʑOOA"9jjޤQ A&J:摇9(Bi2Or8J(M4LNȤ-&yxdf_O}qn)1@ߡ52+koQK \Ӑ9hUmDYzl亲cRٵ|'̈g N}Z*2V42Erk }T5.Ò9#F}k}=./!p$F$0 M[ve*\L {g5|X\vfIY]It4Q@JQHE-4QH٠t)7qMǭ&?< L(#ҹ??m*Cݼk$ nt`~5~$iz^q-mF K21<+\g89}[m[T R9RK~˿_*ٚVRc1ę?Q_F{g sޔwA֛ZRiN3҇!Hb1(`Q݂( I!LTQ9i ?&)M.pS~ZnG9Qyqң>Q:Qrw>GLRT, cLҰ!錷5H[qe)'hiZ~OF1Z5 BuÞ1N!qU,qQlS5Mg@=ꬲMUݽϥN0*)$ʓޘ73j)):y^~&}{c&@<½0f1wGYjȑÎC~z5ິS,j2LחzY J#ظ_^=k=mrѳGyŨE<6kvП3t.vZ;mf,o!%۝sc:~,XAc}eۂ}qW2KisHI !%NܮsWJ*@*xtLg5v7>܊qS&HT@9]}()ɧ RnS t8`I4 zV7-x@Gԣ&0qԞs:Us2KV76ۀb-nR[|u(n|kmӪi=B*\E,?ZlBܟRO$&z^;Syfkxc|.~' O0OrkxfŻ*ıqI-zއi~Ӵ(-S:V'<O5ގ;Ҁ) SZv8\ҳ 5`Hθ_5RJH~Lm"fiH;F y/v~GmWQ"maЁz\] YpX˧O`ws^/gc8b{=J-9^NNP U wf [|b{^ksZaUv5Ubp)7`t|yBev)L-IKjejQ;nFӞjKd\9g'SS!Jڤ i 8,M ɯ1_;Ir!9V^ՋEw ExcڢTҴn1}=s^gc0'݊5A!_V7D>#]8Vҧنy5g{uy$~9Ğ&#g @*k{oE$$r:KE[񆣢m2KbhoPǶA ޕOYuPYb}sд*L3/B'5QSGYL1V"iu4d9=PrxT)@8#J ucR(8ɥw8 II4@&'ȡ89=4T{wJNG49'f'@v~i1r)sN@& E9)MgzqҚhop=<43" ;ҜP8u%1qBӸқޖQA&(hޓ));ҲJFqIqM'zbg:_,-hca0LscQO=1Lhgڐ aր`cOE4 Kǥ!)J0iqIҌ 14)7{QsJq J3^1J:R)3KHz\qU[]FK{H.xébxG6w{_iPJ"HR>WIzb1ixriiNJoz1Gj(jMQփ4$⥉˞xhz VqMZ3◡'@4Q'JiF9>( 0J 4ҝ)RiN)W8isZm/8IJ E}Lbz#i3Zkd'uI4kNV[k9dq^Aöwڗo"pmi>cg3ׯhK6[IPX0˕XG`J i^ZK0g;[Omz{BH 2"{xzY qO.!"Pʄd& =p@k`~qc=\lr טL64=#8⽓Þ<=nfOI,q]cҧATSVPw:*X pj`3uH*W֤lL;c##dn㰧)'SC1UbQ'S+Hnjz0(fjy4$tP@4pƕKԢ1֔(&҂ +(^GZ B.iJJQ֗RsHx^i nÊ`2n*^qHE&}rOjqL#ҕ2:ylzSp9G854捴) w)җ^)4((֌i ` O<-=w[m'{êiza~ Ol}j;hkiTGoxO<'5; mKQdyʛE#A'd? G߇#hbnac83t|SwO/nt~G-g\קQ@櫶`BկmDe]sS;5Zȹw|㟥Y[D\ygð+CS AIIYB@>FzT< R'jqlSڐ(8B)WqE~h0O P7`S1Fh P4dZQȤ=h8&p)7ӳFM8` S{}Ji94`04 (9KA4H!Z@1NAN@'LӇJLHk^1< jB"nb;*ddiK$ m᫉-j|#|7YEZj=.xPk cɿqWv^/- >uq`r;VO5+O TF{{dl$Ty\]AЪ]݄pER2zdzҊ^1'$VQC3#l;Dc,G4g]JPqO=Vo%xgL" ddYԌ"3ڸ/’Nա q=56xNK"f|M#G(&4 (r(QGixsc&M9AZZ(h hEfi7M/|PN:W _>w%Ʋ\FpmnQ>xw_Qt-4b&#"Th05g4S$Dv8F0K׭!ZCƒM"9 2h43KLkE!Tbm94J=A=7_Jty4xZP94c?e4 7 qқӹ#HX A"r)( ֍QF8‘ӚfqFZQ\x{ƘRhېМ;bg]\3Kj-+`Ww7,>ǣ%o~!ُ'gV111QRdḧ19(J0475!֛iniO'[7&&@@'wM#4g;iC LO7VKdtioAK4߭/AJ@>3Lv$|Scgަ:r;izi3g8Pk:[\a!:4RL@̷VW>7j67w,t8ʪxp1{MK#IX(- ~9ּC7m<y@iŮB4Putԃ=hK 隴q; I DOAc^1u#^[Ð9`3}=s^Ӽ'O+JH68UWzGYA߻''kHセ`}7{׿E"9N"u!RM#4NJqCB.ocљLvH>J+><_ͤj3C! FS?#A—r)fW-wMKaGž$c @irUK|:ҽKl].M`Gk}OsW;R6n7c&]gCLn㲽_ݭ9nb<ۏƽCyaL1.X,֏|%ilFKض+¾|>|RzG/ TnroU{%2k< ~7 ѓLa˟0S1ER ҅8;b1FAc48Bi(84KSqJ)qF)֢Xlԣ ^/6>mMK\21;Uw4𾑤'_j2iu6qՍƑaˏxPo%i\e,ww|au}e)LW>R ^J()h!Z(t4RI1IҚwZ6ޔgbsNij JJQւi;ӏJjq1@"LPX8MM.Gj2H֜H[8~Z DO8j\Js֢/G&MVsABj{TSǎb/}W0UyoA3Eoo}r5U#dtOf[%8Xn@BH'9ܑjƥQ֐s PсTB)2DڠXSM+4G&sGXnPmH H-.9KQje(?j˫oe{$,V9d<On}+IIb%2:0!AEx7-F iĺ,'vc8"X`zײxOMH\n-\~pw?\qHNiFqK֠lgf3ᔌ^lu6nm$x?a"H,xXoxe:SIq)\n4;:5AZPNI$=<֘848SOJLBӨZ 7u&ȟ&y,Ĉ "L~y_`{ i)sMRv|^6ƾ Imyo13}dќNz`t '`k2- v'ۿNj7xt嬊9XRswvfclʭ\Ľ!HHm2Y"@IQ\[; \vYoiz۳^qE9WϷڔ>;g5"VXr_H)(;R-!&is&Rg栎gMjk8BJ#"y:Ө'Уu?@G kҮe#b^\DTC"Vcbׄ|zĞ8g0Dl.6`ポrTg8`Bҁ &1Ҹ|8Ѽ}io}/aї<2k?Dx6w̾|gPAM#7j8t'nȢ=^Ior~<hdzйӁhQךqcRh#ޛʚB Qbokx-cG)$GrXnֽt[tQ}`i*k䕶OA^{|{frBډC.˟ȭ_ |[🋮VKK#gR R}jѕطLBX@g#2:~wsg)'55~SNy|ַ_hFSqs|/DtS$ُJGG[+>|4>LaNxƒWRIxwI攊1 u!ohQTF?K!㖧u7['KXլUf[Fdϧ`=I8w$ '|HKd#" ~8Gs//OFx̟2rG5^ j{[eͩ}v*G uF)qE.(#4t8apqA4 >;^fᴗZ9f^cvᑞc9UᏈZW'TMCqwDvg d_H)մ]W48~y2ے G(ԒwgkGz^Ԃi@KoF5|*LFiqF)N=)8ѺJ9ъaIKMeL["dӀ A#HH ~ɦ'zR( 4S MJ[4n1Q^D_'QFv xZ=\c<NQ֡^⫑ῌam)Rs)&.")Hw+`zkAa[3"ƝN܂EOhdR;<+ ?5nSI' 7ZFNJo#+sJXdU|Fu+!1 McZcy1ڜZxLw#N B(MZ1MR)py#-A4r('iyOii@iRgB}F)X R.1Fhw+?x' ]7˥>IZ9Lξq~E%w|3ۦw)t>.Eo,E(` Pc< 5/N.[&ZPOjw115'lRQJ!A `RZ=(IF(穨a}:T "9cn=\Sg\0m pe_{WgVU1HZ=B=N}3_W gޠs^^u{H6V˒PYFj7ӢS*<닰3cxQgԚ+|#!ψ5خ,͞6ܑ@8 d{9-eU)"8e<GqCGm[U2NDs=2?UJR撌FqրsJG):)G"z/ZRG3X`^et8tc#5=Z^Z1"xZ9i<j٦i7xňO=1kN)NIE()%VdIaVS~1dьA:Lf q8.3F!^G49fLP849'4H(4})A'?"m=(9*&JVNxWg1ǥ+(Mj)OO58&ߚc)Gc#񨗡&u;sD湏x_OV-n;07F=XיE-8ܴcS?L#}ƣji 夌&?=+ PUpҘx5 =0EWgiM@d9{R+rMFFdE<۹IRˆBr&v'󦢀y<ӊ8hSf>zҝs<Ԋ2jFb8sIs}ic{˨mYK}{GEoZJPJ'wn#x5gr*ƭ*Vxȵf%ɫ(2Sl?H _Z8&Γ~:5b8vN 699<-4i)pv *:^?1I94S$]UcBJq攎)h=iqQr3O\Ris'փPii3Hh)23@o=iqfzdzʎOn)v v4( SȣRbt9cv'F gz((4SjCM֜&8C8RsIK(-6Th]wyȧ'FҌ꿥WV-tx5˻ɟ3[hL6ͲE#p#9"͡xDűLR|]^dm8FS#_zݏjʢkg> ;:8O`ϖ3;d W<_(\~í8Қ.I"M0N5_v<BdxGbB!>λh66j"`+O* +o tfIUOٷTJ 9@X0p??{i1JxKڒ\P:v Z|24v@5 ǘ+ufǾ+>|fдx;ⵞݬAl 莠nz1x,t%Su"!N)A!-.iJ\)96[^+=MOL-$1/&T`7k}1޸xHѼ]azn\Ġ$V =zOۺ\/V{akI$y .5-EYJ؇dvzC֗)ރқE(t4uFh)TTE|SJ1K%7!&M.h 攜H)^M^/K}f6#G  ;\G5Ҧ!K{#(ti5/ĺLzv6 : iǚ@A)_ƀ)M0iIQISO4AHI))sڝ*\9&N +1j`F}jP,NݚilR1UcQ9sKFi33#ң-Pu6| ϹFʮM4x*]iHFqjXw$ԛ9oryqZNWzR86 HNy!=ɢSH~fj]DjW7R"*=v;K;7{Z"}7. Hu IJK-rp8*OQWw㚽yzU8<IUyqS XUH(Sjx&zf8*US_Z~)} .iqތSղ1AҏJB9 3N'#R)f!UFI<+MBhzUZ|ÇşIR[КhY.Wd4}~?{NXk\r6*t= AU4`)x"h fQEo[C u4x) ;4R1 ԸHܜRR(n8):7HFzTnwaASA4KI@ R) nHjњ3KҊCM4 wbE`Ӆ-!8y'IKe&7e p_s>y|G]gZ\ܨp\L7˷ҨySXuAu +",K'+߼OfYRPVXɊA.{'攜PH3p% ]h']AOlڼ;IS:)[S13yotN}=F+냂hsƾ |qB̆xzw#SOx_W7Tr'V':ݢQ,it1P}3^eioae + #4 `T#doϚ?q~}kYAsN}iMx04) =Oiy&S֡{N.!FX#}6 HmZVD<A2 :g#'>!xs>ѵ kRh8"Xw;@3~<3{]c:[} fq^\Rc'0)qI:Q3Iw$[-⻑shKp<ݣs*F8'{i9Vi֔( (`)3j\9|JftK fxGo7Kx;ÞMVG1ƶ}(֔Pz)i0(3GJ84bJc\`gҌќiہIj2NɣnR)y\{䖓7%r/Q%v+ sπ7V~$,A77y  g=~lWqeOXIA FJg[=+~uzvʈ0Ġ'oA_D3zqF@i2IHx;PқfxIN/u9ހz?>xRb\vT; B= 0䢰,/xJ ۚ9GVd ~'ia-2ug9G<נn֑FHK1SQsRn94njlJBHM4zfgP}괏PA;E7x{RVw5oz' 4(cLf pj,KT0ɪQQ($T犊^;qUCtYU&Lr:@PfEZל(GkzU7w>ӎ qR$px#KjXԞ!\( +xam,RX~T дit(B8B x`ZZ׃ZO[Cmv1Hu#I7-ms^"*25n r5u9RZ*Tgj3Vg*u2iOCJS݊!#8I+r2}*~l֓;MIGh];h4Nbi ;Rn W('DK(w|ݸ/ϣ l&ԧci. 5(KkBIf[kTrIRW :gy|Ne$V6'Mۈ-*z| t/j~ \GT6}v,ezO\\zS iӈp}8#;IMNs^wEk Nq+ǒ\|3 t _{΁ρuƢ\y<ҽjr*lP*vsɪ7ZV+™W5X1!b( M.yR48.Hp4j2:%.cFbFêr0=o^;Yn ۥM~ď^ƽs>|{I>d }P7Ǟ#@NIHj}WSG*^Idm9$WVaw$6qy'SxwuK{ o3ΉOl\z3q M $R(dt9VAEHj)bKcI#J: jrKw@G=1OO ױ^֫"t䨄Rs$jT8QUQs(4fAu1?#iE)/ōrDd a$#H>Ǟ\X?3,_o%7i7}lgε9ʼ,!T HvF{uGb :QHE.8v(^Qғ[RBVb84}ơPUR1j<O03HMH W>A+nqvGoF^ѭ搦n]LXvu#uXw:R[e 3 z#KQկA)nʃ<+\KkB1oAԠi<Ӳhh ڂ9) \N9F (њRi.yhQsI]g4N)Gg#w^§<уFF;Rs1(4 4JE7dciP1J 'zuSN)ȧtANM/)3@Hk>28lbmϋ9ۓHW5MWKN%#yZFa nj|[m<2!q! 𽿃<-iۿтK̐3WEJ= f7~j[Z@ܓMxFw$ZF = &Hj^0mu  B攞Ը8P3Z@yj0MHNB)య5|!b49Swn_p[;R(+I`O5[G42)WE PA4uEYi,z}ؗ$yS N:#hVR/^IW T gqǨqxCG(B0i?u}rrj_/?w,[oq aY l}zs9~!<1h2ْ!UM_*ߞ=+0G4sEߺi[A.7qGݥ JqM\u4HW4j.VӔސ6zxxڄo]MfIc4xcΣɵ"HcFaUr}ʯ^#?&m |=V;c^@0p oʾ̂6p`3K;0;x`|TP)M"RQފ(I⁀H4/8FH)ԔI֝I3Ki8JHdWx~5kֽЯΔ1i-?2, 9K?PI5+ƤF}1״xsWxɷRYK3ORq`ii)FiA4ʴ.׆thDMA"(Rk7 oھɟ|SFDw^s׮xF:tv7,i n5R0$Կ|wE,c3ҲO=q^+EjoiX-ē6F`2g<^XD#w\fIXe瞿[ލ>%d{;zƼODi.oDB ;}+ݮ72UuߞM5␾NMD)'z=F'4bwbU^9psH BiM;un3\YzbO(m De)cJdk>]} *Wnԯx* J_✮dR(tci!VY>ncyl@ Nr$UZۏɡEzFǶT`CZnQO|k+Jҽ Kӭ-Sd1(d֊/5n3Uc XdU*tV0 Ldؘ K5z *QJq▙u$Ǖ$;dO4sSڟPF@,GZ#isOCJp&m6 ImcI` rF*F#Њſu{[ǟ%VYr!X{j³'N =-Cʾ{O%ۂi|tvQOS]iթxzN׷݄Pm$=X2XMx7k[:.fGqF%犔Pk?h.%ud}YWm?^xEQG܃·~^;wxOonn# -YH$qk[UdXogH °6c?W4Ӳ;QE!4=tӀ5 #Ji('6N)OʍquHp:QҎwJct'ھbMk_ ൒BNJ@?W@x'jtߞ{v1_>"ZfF GLa; i .ўMn>qO=1H[QJi.i{Qފ)89d/REp2x:˅<Қi4#mR J8R&(8ڑaӹ9Rq4AU IR gDӼE˦궉sm(#s^#~sIQC{}s| y6֨P1rsW[Z[kkAo4]:**5?|/s?ƟsJg1!=Ž:WnR5K(ȣ ws3s끷/}+ vmYzI֡\ғ*,m95'!_j1sUBisI 4Uvn*74nj~QjBw7Ls*$ɤv VF4vty+'DwV{~]̿2p{ך})ma H>5_—N%L8#8SsO(԰J߈h5ȥRzA9926Tj(jD5(jH"SV]Vmh5(R*x8ɫC.(#wZ880 )qHI,<2)VHF Ub;qO1ȡ A "_ցY( =uj~PW?uܟ˓WZk?>*Mq\Kicoo3~8m>.8j61˛GJ`=EzÿYB[ glpG} vɇˍ߭1cdKHr3;8&5N!.孴KFaO bqvɮ~KPj10 סgg&P{3 LaJsI /&44O4 NR S9M,*ܭ/Sڂh Air)4 QHzP(>R%qBluck~?iz_|?h٣lLI'rxFΉvIBXv#zPW,ik6?#vc񮰊@h4AE).)qN\>xkƗ&9lV)^q\Eצ%]xHm6X~>M8XhImw1-#zI6ESsI5+tMFr8 Ai%ׅ|Eu?,L4_i^nY!Lp-t>1QEP0L9՗Cl3Okx(c= k 6%{R@iZubB*_=}1RQޜ;PWڌ tњ1I)2jp9U}Sʏ>48{яz\2KJN)A/Z 4⌌PfxR1 q4i p9FpYR֢wd K>"屹qT=2jKE\M΢w{ ds^bUP)&[{ʠw8ULF?Mx*?5)֣f9pҢsQ1z9#wjilbyp:9$*i}ܟoO򯝾xql3HX#zrռGo̰6>׃W!g/fs7<dwKP'1=4sH#Ң4x4RJ0)sH4"sF3NGJc2uٷgTvAA/V8@ȠucM?1x8>Ƙɧ{AZv8sN) R{y@"iN'h攊5+jXkTfl6s"~#Ex7ׯ67od3~&mX0-^h;F>gxi1KE%(QJzP/I{EQQA@-IsSNi '8rzҎG4=hG@>ԸbE(8ҔRсFqFs֘;()qNȤҎh֌IiA>4gڏŒJ(ϵ&3ځF[*ERzBGb)x"=h!Rt4t(8/Zi4`?ZE+?ҡgnj+nMbHQ㚮{Tl~i7qLf@H&qPܦOUd".1UTb8qT(Mi905ȰyU[*r0A[3V%ca+:7HAuOJDO;QɮKӣm<;*m,r_U8"F#*{ԡ0KXA5e"=sS^P3|jE;pj ȫHaENqVGaVDiTJqM,3SjPԞZ899f?{4'"Pi:柎iztI JQ֜z[ZYY>lHS= Ǿ+ m*? xMBLr~pѱWf -фH1W?7מ.Z)bԶE!d,Nq@JzRҐڊLx_񗁋-s4МH 8 g⪠o .$>Cc?=)=a*[\6@0?LcA呖"UsS-dw.}21SKbE|sNXM ֜2wG*q>%έx RI’%1zOVm ͭ_gĿip9>-߉ZVDie*W(X4q`3@(FlRg()OYܐ6\g&Y OI :qS-⒐u/2 8qJNi _14bvN1MJ9J^ -0P<=1Nh&isM i:PFށiJ擧ei/4sW)0iG!=)4Ӈ01vzRm R 4LLh<Ҏ*#<ԙsN'jR)3K&qFiJ)MJh4ҒъJP)qGJ3Fi6Qރּ jiMuXNK6!H c=r12|LCHǫ3ƀ{9n?ר<!7MZHznF%#=9h#&(=iI)=sRwԌ"ҤArh)ޜzFJ:R})zxK#um_GWhH=7qm6Y4rfO2E;dκ<I4q"e:S ӻS `yG֚ &z <Fiqjޔz 4xox/xAjıolmr[zmkYC. ! yL~ xM^蓶o2p7*9q9 YV[yYbz2# s2y£U"lwpB:A6i_l|Cxmq@qץG,"l%\z{WJ2E& E:Ҍg8dv+94F$l494Kn)AǥutҗbdTJƐsHx4)Rh4ӀRA<`4HzRQJif1HM jvsE-(! \RgR)(X,E@Yc’+?g ^7xQm Gxֽ~\[AC^-&K7WJ\:)@ȦE(E;R&((4 R(RLҎPhJ)iҚ:ԇqb4iu5M(4MeܣڠK@د<|  7>S<<9GVE*֧k%'e#8탎TK? c>%ֵ,[`ѧ,k\d׳|7QM'.~I_b>8u f$.iqKdZpzi`U18U_;+ڀzqUTij4mU̽K"Uw;j IސSKfتTjsHvBjӇ~+~_yѤ8up:?P+iOn`թ+r*'nhR|l~Kij\ڴ֍N$ 5ڀig;Gm-k[L?Vù{AP=AAX(ȣw84wJ3M ivҶ3J1R) ByQA4iAҚ:gq)IJ0NiqFqKSvZA ֗4f@{QHr;ZGTdsRgSqN-M|MЭK|ZJp3]_W^(@A1,^R8kh4b hfv~!xv{[K&JLZZZopx>N?V:l3)8y䳍#^sx7mソno4?4yZj1(EF_3Q+8j25 Vh⠙*b !1PMWcS⢐sS⑚-4jQM5͈*:|aȍ+:w1ޡ wڙs8`U3>y5 jrIZ_4jrMNr!XsVeO QR(@n L.X*Ҏ*C*2Y8j$U SԘq/*3ޥ]jD-41J~y#ڑ[i5]RH5+2I#vw5LRH<a%yDfb8ڧ ~5ƽ$6ِL"0({;Ѭtg*]2bO,w!{pM}-aeZ&kh9ڊ`r9"Êw(4k~/3oCZ]Ob $$w/;U~$ A):uO\w E}HÖ14p!orx5// 6z5"6o휳rI?kg4NsHi9+H1CJ)KSwK4B4P ٤ҁ2qB:SE <╖c XHӚ)OJ\SHJ:ӈniR7JNԸ i=Gg\+<䞾h5 )4f9u0)9 Sړ无MsMP>jv(%hQ]Aci5ԩ dG8dx>ZյfFnTY4?(NM~3Axm~eٟ\mhQTbf(xuV8<")GZZCEq4iQxT$ Pq61iA숈}G^ Edpd$wf<<[t-&1!J:Pi;i QԵ7Fke ;D3,`@I5Oj6%Lyn>v3WLҊC \Z)9()c9"z(&3Tnp>-Zns{pvm TA_6|`/gxbؔEQ9I57 qc34+ 54 CᏉ5 Oڝl$%qޙ{[kX~[_:kr;mMU8(y'TA־ e6^84Mp_=ꥹX[2^Nq޼I_xCk{p"@UuZsVcSV\0ӆT[`}NN)X5(ZUp"5yWw-t!Q+kh tUZu3/WE I<v8uX/HVXJ:2H9g=fE RQ> ~&gk87RS4ёLxmyR(bRI#TP2I'y?h]MHJy11$~fDhWIia5P^[Esm2M9#`FAu!hq(|&9暧֝I~P) 1JpJ)/Jιtk˥l'C[df_#5yUc@Q(sR)Bi4R)Iyyc- 8GnFiiF):PM!<)(8p(#4bE ғ@m(/jcPi3NL#^"sM&R'BLC;ԍr(❊Pi #&7v}ip1IEъ(zOZ\z[鼈2c,EI9W|O0;馘Cy*P8vSiK(GE4{ҊBy5v:%֯ۮ d^us/_3%e}l`~=k񟋾$>7UeۢyN=x -t}/ᕝލyerm|E;UY'MpA>^Ffuz#lM$v:VֹFF/ú]G=̅KhgS?.K_he{y >uI5WڕSӠ)P2TƐ8C Mnq^p4 N)֎k+Ě֡)tP=8| k_ R69Lcg$gˈP1={~4}T-pr$l~`sǡ|[^.ζF,at\(z4C(944'? ;QvQ#Sv'}ETEoWT?(&rl%]3:/Gym昪2xq4㚍Q7rF9H˞~rH{*eT9 qQHLYxR:TN60{%87U|)&4ǐ ?@j2n1 ,)IFD[u7 QUyݸsU 3W yJϒS)0DǡLT*W_֙7@y#8==a}7 Ͳ:6TW|6ci G=Gǔ[b@9cd<Y>QDqbʧ$u|/Cƚe{h0p'$=yv>w`gN$&Hei)CJ7:wVj2;OM)%~G-O^l/O"{`t=joSx֫rTW yqH/>ce`vIc3cCj:7P4pUHז~:ώ<fu]Ck$B 1QҽkWQAvǫY1!\=#W}i)ڗhp=(lcE4i:Q-9H3J9'L T3)RS4֜p;v;@ң8!_URkxs4woEշ Mn$dFF );z@iFN1@֗4u0xJ_y,64:|#Q̊Uzq_|[wj0ݤrB/0'Ha׮Utn-[-FmfYK`Yr{'WPR]V24vdyxfu>|+|=6nڮ~g9=qp; i>v前@d@_蚾3;[Y v*=X׸niHCL*޴(#8JEl~4 Qp{$=;Jp=zR\Ƌi~kKK/#* 5 -' X^v`g5j_D_a|ճq=蜏QKG7zRh$R` 8=i{7-MּwckKQI,.Je5?~6#iif=N~"4RouMq I?8sWejm ;{ Ɋ%IEdx#º}ȸۖEM}8+xt֐lvmHc+P'R2{fchݜTg;bsZQ1aF6PQ3U*ǃԱicWe%G_JF( 3@=i9'c=k xUW" y,ǾqY_7G,FrW;O+( b JO.UI7P}U&9i)Z L:[C0~O^Ohfcp91ċ/ ^֚0e2@tIskh_Fdd}}qKhs3[6RI$i 7 !c=}k> V|Mkfqh*(lY)_}41֘s<.zҖ1M5ּs=LjĤ# ݱ&]/E斲떶wG-|0)=ac޸ _ Q5FEC'Q4EeJnqzU 5*lRƠ~ ORҭ C}O⍪ˋm6iS?zIBZtbmؽ&tlx?ZB7P˰}j8+^b#B1V|֭!Sf)<{fGc\3z\ROƨgOaw>YLJϭ{4}Ct.rp̧]&*^5\NG֮l*ju9*]U95.)SBRƼոץ\xUb1Vcե\M|T3\>jpt`ԡ <*1KK8n9p\8v)NiRE=ORdҶ ZBx+?h? ]-g4r2[}EѵXMl:ߖ7w)2'$Ҭw5M6zϏ~?Z$YGmCR/,ج#=x |K׾NJ4Y)\ Otz_׾:\jvMqyiA<| ~ |=qј[c p:MA.9fE*SR)M(6ѐzSqN/jEȠqIKȤ9+WS|-ڱy },^8~+鶴Q!5_#'!2J{v^DBB9$ p3^AY4:RsҰvht+^XoWB>*Ϩ7E`X`'99u J(#4LӇJm^Eg1LњZ\R(J)fK\~x3wR̹ͧ/-y'}|ZOh1ܭr}'S.`Rf,活' I*x {qҮD&Ӣn~4^z >/gM".5Z]IE!>ۋ^mgocm ) (#4TQvԛJBib9=)Ai1F)攁ڀq/ZB(<0)Rv`M.A4ӻSy4rhӕަ@IJpJFI iNFӞSfi!0_Z0KXsQLvj=jKL,GZBm@NM2Y>R*j7ڢn^,iI411KxHAvv.@ S$fo<LVb*֦h 5f=xP=踩ƝfyH*/b>UL#9QCS+z˚UBM-9qJ":ԠR`y{ӐNr)04!z.挜0棨*SJn <4E]C+ FA6~7Z8.tac T@M߂ \mB9Fq"S^*a"lK"DUm7z>I4"z{tV.L8$RdRSNa]Rt-C(1M@T`Bn.L(;8_qpVG<nق}l`kľ|-II0}؂>>5o xەZC ϗ* P[s^44"ȥ GAA$҈ Jx38M)7"1IIޝ1J`qr3_4krj2Ϯs>aF7#t#cE[+/z(@SF"mIf. xbCf*2?C!*8􆓦ŤhZl HUBW)05bfKʊ4;PA&1SҌ2=((Rbf9$ 4w̒yF))))4v<ҀR ڗތsMr)٦qIZLK⎆h!}ϭqJ4s4ih8)s)7PLwH3pS)9A搑I!擥58)S9 qMRg=:'!d`Jamjبv16 @회*"@ UۭD犋uFaw 漣_߉s}B$ ~RCzrCu Oo*K?r5{{}őZr)r}3W'k-,!RGRbgw]6TTp&Ba_6sUeT! Trn*@sM)P#p<%OUCjp4 mSɧdS*kXVc5j5Fm*T^j®1Rɫ SAhbqֆޞ֐F;ijE8<(DnrУ:?&ri6S)rA⪫F{ҁ\҆41Y:gpZpKr h$,j0e9R08(bi Tw0XMww2Co%  m_㏈]"@iqࣄ\To"Kmγ,=ŧH(?P~ u=8asA&7n\SC@Ii! v1!~)ȥi1MhCB3N.3K;9YIuH nK;TԾi,ZHn"A2=ԃ>m3I&z?||MNjziI-#yXʼ{>_ER4(Q;i6M?5qI)mjNԛDv1naiGT ~U94怸+(Z ))[G@\d=_E|/!J cYO1dE.#`O8`uT"GqAH֌S|HNM^~GVtzKVY}Gp}"o>fHc7԰-36EmHV9${gI4R8␐Wn@ HQڐUkOzЮ=kQ\`9}h(ACJL҃SJFIKK7 7}h' PzSr=i& NtJG֠.xQWH`QEs@8@oGѣy_֔߳MٳAxU$*へ9#?J_:ԛGQd$|*B7Zk* 0z9O<;$2婭0qJIݼ~@qH,xLJ #˅ 2{ɛ x5"{Sf4I4 NӖB@ ,j Y@` ҡWmS yR/ )6N 4}]jIVR>n$FjҩX J[=T-J"Uԡ>N *6)HQOti"E=3-Xbs?(gqLA&[; ;*@758R-#r)ROz6usIZpocD>z"_ jGM]&!Fx}y$+hIȮǚ>xxLoTˏu|\=m\Śp\H1aӞ09|#iMo[weOofM͎70Fqy?&xXΠccǙ+weGc^AQ Rt4H:i4pϷ8֖HTxt))hbOzp(iTyX,tVbfbC? yQE(zk#Bo{ wm+?fcymm\yǾ7A?JqFO1w'zR-yG \~ P͛K xBˇ#B ^5?gi7k`<iv3ܽ䠅ԬY!WcV;//|c+@;̏v}Iӽ:ލg[Yh>gÜ*H#'rzzB3ހ(KLmyh{ʾsv\/9 "#` ,3Г]4_E]sRkrgͤ]W . g˕Nvȼ^pArC)<)Կ3#t4/0)COo/7ˌIIPh.4g8ȥ/C@Ҏh#gNԣ8,:bKNk/4fBF0IQFqIjPxiL 8&KUTu$_|=IoXj8ؐ[jO|}֭uoqy$ P=q^8 !AJ0})sHxH2zH3A4xw= 1JmLV9ҙ<Ӹ8%wJ$ԇn\DC~ʞϥ@}jjMY8E0$TLI\fMu ps;NMVf1x#",Aƙ!G"lB<9g/ӧi/9p?J7w=);ӕ1TIy)DZ8+F6)vԱ-yQԨ2Ԣ0n%E[`tHVcZR1R2sK'HA?i2:q8.ZAP>IR6)s7))q;o&yN@rsҐ&x43AGJpJF;;OO̿O\L̑S[]D%xGu`֒Omk8kߡC  ,?.[V/dhy ~UM?~2kmSP= ۝%TJħ'c-5Qc5 ޑYvVY?2Od6s>|fru CiGs2"?Bkӭ5 ơU@RPzS*Ei (#QMA 01Any &iFi>lӇ#hg0=iWޜiy 1qR dRJ R88*U {z qIԐdEcFᾜZS fK+d##K"񏍗1XbIʻWSUk) ހiO )9EG;x#PAGqH x " ]rKFҥqZz# {U=zΟuNDq?BWZAgkAJ8P:Tz1J9vv=_Rá|m]>Ojsf@b_ξ=KHM|c/|I|C!htmP#GpIM7B.vGftݿ8}r? |X䖺* o\H~ Mn{Wm/;G'z/RR]AHqM{n`MI!sX 'sWHQA֑QOR9H4 #rE;SOn4v3KEԔP(JQiRSvө M%qA